From 53e5e598eacd14b9fbdf6a570f69581ddc9c5a10 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Sat, 23 Jul 2016 22:11:13 -0400 Subject: [PATCH] i managed to mess up cult datum picking again...AGAIN... --- code/game/gamemodes/cult/cult.dm | 216 +- code/game/gamemodes/cult/cult_comms.dm | 7 +- code/game/gamemodes/cult/cult_datums.dm | 14 +- code/game/gamemodes/cult/cult_items.dm | 272 ++- code/game/gamemodes/cult/cult_structures.dm | 15 +- code/game/gamemodes/cult/ritual.dm | 874 ++------ code/game/gamemodes/cult/runes.dm | 1974 ++++++++--------- code/game/gamemodes/cult/talisman.dm | 633 ++++-- code/game/machinery/cloning.dm | 1 - code/game/turfs/simulated/floor/plating.dm | 4 + code/game/turfs/simulated/walls_misc.dm | 1 + code/modules/admin/topic.dm | 19 +- code/modules/mob/living/say.dm | 5 +- .../mob/living/simple_animal/constructs.dm | 242 +- code/modules/mob/mob_defines.dm | 1 + code/modules/mob/spirit/movement.dm | 20 - code/modules/mob/transform_procs.dm | 50 - code/modules/power/singularity/narsie.dm | 10 +- data/mode.txt | 2 +- icons/effects/effects.dmi | Bin 332388 -> 370973 bytes icons/mob/actions.dmi | Bin 66241 -> 73986 bytes icons/mob/mob.dmi | Bin 241562 -> 264642 bytes icons/mob/suit.dmi | Bin 478152 -> 480455 bytes icons/obj/clothing/suits.dmi | Bin 156478 -> 157355 bytes icons/obj/narsie.dmi | Bin 39133 -> 99138 bytes icons/turf/floors.dmi | Bin 369775 -> 371441 bytes icons/turf/walls/cult_fire_wall.dmi | Bin 0 -> 1372 bytes 27 files changed, 2182 insertions(+), 2178 deletions(-) create mode 100644 icons/turf/walls/cult_fire_wall.dmi diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 1ea099cd1ae..091c13371c3 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -1,9 +1,8 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 +var/global/list/all_cults = list() /datum/game_mode var/list/datum/mind/cult = list() - var/list/allwords = list("travel","self","see","hell","blood","join","tech","destroy", "other", "hide") - /proc/iscultist(mob/living/M as mob) return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult) @@ -22,32 +21,64 @@ var/mob/living/carbon/human/H = mind.current if(isloyal(H)) return 0 + if(issilicon(mind.current)) + return 0 //can't convert machines, that's ratvar's thing + if(isguardian(mind.current)) + var/mob/living/simple_animal/hostile/guardian/G = mind.current + if(!iscultist(G.summoner)) + return 0 //can't convert it unless the owner is converted return 1 +/proc/is_sacrifice_target(datum/mind/mind) + if(istype(ticker.mode.name, "cult")) + var/datum/game_mode/cult/cult_mode = ticker.mode + if(mind == cult_mode.sacrifice_target) + return 1 + return 0 /datum/game_mode/cult name = "cult" config_tag = "cult" restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Security Officer", "Warden", "Detective", "Security Pod Pilot", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer") protected_jobs = list() - required_players = 30 - required_enemies = 3 - recommended_enemies = 4 + required_players = 1//30 + required_enemies = 1//3 + recommended_enemies = 1//4 var/datum/mind/sacrifice_target = null var/finished = 0 - var/list/startwords = list("blood","join","self","hell") var/list/objectives = list() var/eldergod = 1 //for the summon god objective + var/demons_summoned = 0 var/acolytes_needed = 4 //for the survive objective - base number of acolytes, increased by 1 for every 10 players var/const/min_cultists_to_start = 3 var/const/max_cultists_to_start = 4 var/acolytes_survived = 0 + var/narsie_condition_cleared = 0 //allows Nar-Sie to be summonned during cult rounds. set to 1 once the cult reaches the second phase. + var/current_objective = 1 //equals the number of cleared objectives + 1 + var/prenarsie_objectives = 2 //how many objectives at most before the cult gets to summon narsie + var/list/bloody_floors = list() + var/spilltarget = 100 //how many floor tiles must be covered in blood to complete the bloodspill objective + var/convert_target = 0 //how many members the cult needs to reach to complete the convert objective + var/harvested = 0 + + var/list/sacrificed = list() //contains the mind of the sacrifice target ONCE the sacrifice objective has been completed + var/mass_convert = 0 //set to 1 if the convert objective has been accomplised once that round + var/spilled_blood = 0 //set to 1 if the bloodspill objective has been accomplised once that round + var/max_spilled_blood = 0 //highest quantity of blood covered tiles during the round + var/bonus = 0 //set to 1 if the cult has completed the bonus (third phase) objective (harvest, hijack, massacre) + + var/harvest_target = 10 + var/massacre_target = 5 + + var/escaped_shuttle = 0 + var/escaped_pod = 0 + var/survivors = 0 /datum/game_mode/cult/announce() to_chat(world, "The current game mode is - Cult!") @@ -55,16 +86,9 @@ /datum/game_mode/cult/pre_setup() - if(prob(50)) - objectives += "survive" - objectives += "sacrifice" - else - objectives += "eldergod" - objectives += "sacrifice" - if(config.protect_roles_from_antagonist) restricted_jobs += protected_jobs - + ..() var/list/cultists_possible = get_players_for_role(ROLE_CULTIST) for(var/cultists_number = 1 to max_cultists_to_start) @@ -92,10 +116,13 @@ for(var/datum/mind/cult_mind in cult) equip_cultist(cult_mind.current) - grant_runeword(cult_mind.current) + cult_mind.current.faction |= "cult" + var/datum/action/innate/cultcomm/C = new() + C.Grant(cult_mind.current) update_cult_icons_added(cult_mind) - to_chat(cult_mind.current, "\blue You are a member of the cult!") - memorize_cult_objectives(cult_mind) + to_chat(cult_mind.current, "You catch a glimpse of the Realm of [ticker.mode.cultdat.entity_name], [ticker.mode.cultdat.entity_title3]. You now see how flimsy the world is, you see that it should be open to the knowledge of [ticker.mode.cultdat.entity_name].") + + first_phase() ..() @@ -106,30 +133,30 @@ switch(objectives[obj_count]) if("survive") explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station." + if("convert") + explanation = "We must increase our influence before we can summon [ticker.mode.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions." + if("bloodspill") + explanation = "We must prepare this place for [ticker.mode.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles." if("sacrifice") if(sacrifice_target) - explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune (hell blood join) and three acolytes to do so." + explanation = "Sacrifice [sacrifice_target.current.real_name], the [sacrifice_target.assigned_role]. You will need the sacrifice rune and three acolytes to do so." else explanation = "Free objective." if("eldergod") - explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it." + explanation = "Summon [ticker.mode.cultdat.entity_name]. It will only work if nine cultists stand on and around it." to_chat(cult_mind.current, "Objective #[obj_count]: [explanation]") cult_mind.memory += "Objective #[obj_count]: [explanation]
" - to_chat(cult_mind.current, "The convert rune is join blood self") - cult_mind.memory += "The convert rune is join blood self
" /datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob) if(!istype(mob)) return - if(mob.mind) - if(mob.mind.assigned_role == "Clown") + if (mob.mind) + if (mob.mind.assigned_role == "Clown") to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") mob.mutations.Remove(CLUMSY) - add_cult_viewpoint(mob) // give them a viewpoint - var/obj/item/weapon/paper/talisman/supply/T = new(mob) var/list/slots = list ( "backpack" = slot_in_backpack, @@ -139,55 +166,31 @@ "right hand" = slot_r_hand, ) var/where = mob.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(mob, "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately.") + if (!where) + to_chat(mob, "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately.") else - to_chat(mob, "You have a talisman in your [where], one that will help you start the cult on this station. Use it well and remember - there are others.") + to_chat(mob, "You have a talisman in your [where], one that will help you start the cult on this station. Use it well and remember - there are others.") mob.update_icons() return 1 -/datum/game_mode/cult/grant_runeword(mob/living/carbon/human/cult_mob, var/word) - if(!word) - if(startwords.len > 0) - word=pick(startwords) - startwords -= word - return ..(cult_mob,word) - - -/datum/game_mode/proc/grant_runeword(mob/living/carbon/human/cult_mob, var/word) - if(!cultwords["travel"]) - runerandom() - if(!word) - word=pick(allwords) - var/wordexp = "[cultwords[word]] is [word]..." - to_chat(cult_mob, "\red [pick("You remember something from the dark teachings of your master","You hear a dark voice on the wind","Black blood oozes into your vision and forms into symbols","You have a vision of a [pick("crow","raven","vulture","parrot")] it squawks","You catch a brief glimmer of the otherside")]... [wordexp]") - cult_mob.mind.store_memory("You remember that [wordexp]", 0, 0) - - -/datum/game_mode/proc/add_cult_viewpoint(var/mob/target) - for(var/obj/cult_viewpoint/viewpoint in target) - return - var/obj/cult_viewpoint/viewpoint = new(target) - viewpoint.loc = target - return viewpoint - - /datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE - if(!istype(cult_mind)) + if (!istype(cult_mind)) return 0 if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind)) cult += cult_mind - add_cult_viewpoint(cult_mind.current) - update_cult_icons_added(cult_mind) + cult_mind.current.faction |= "cult" + var/datum/action/innate/cultcomm/C = new() + C.Grant(cult_mind.current) cult_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the cult!" if(jobban_isbanned(cult_mind.current, ROLE_CULTIST)) replace_jobbaned_player(cult_mind.current, ROLE_CULTIST) + update_cult_icons_added(cult_mind) return 1 /datum/game_mode/cult/add_cultist(datum/mind/cult_mind) //INHERIT - if(!..(cult_mind)) + if (!..(cult_mind)) return memorize_cult_objectives(cult_mind) @@ -196,40 +199,18 @@ if(cult_mind in cult) cult -= cult_mind to_chat(cult_mind.current, "\red An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it.") + cult_mind.current.faction -= "cult" cult_mind.memory = "" cult_mind.special_role = null - // remove the cult viewpoint object - var/obj/viewpoint = getCultViewpoint(cult_mind.current) - qdel(viewpoint) - + for(var/datum/action/innate/cultcomm/C in cult_mind.current.actions) + qdel(C) update_cult_icons_removed(cult_mind) if(show_message) for(var/mob/M in viewers(cult_mind.current)) to_chat(M, "[cult_mind.current] looks like they just reverted to their old faith!") -/datum/game_mode/proc/add_cult_icon_to_spirit(mob/spirit/currentSpirit) - if(!istype(currentSpirit)) - return FALSE - if(currentSpirit.client) - var/datum/atom_hud/antag/maskhud = huds[ANTAG_HUD_CULT] - maskhud.join_hud(currentSpirit) - set_antag_hud(currentSpirit,"hudcultist") - - -/datum/game_mode/proc/remove_cult_icon_from_spirit(mob/spirit/currentSpirit) - if(!istype(currentSpirit)) - return FALSE - if(currentSpirit.client) - var/datum/atom_hud/antag/maskhud = huds[ANTAG_HUD_CULT] - maskhud.leave_hud(currentSpirit) - set_antag_hud(currentSpirit, null) - - /datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind) - for(var/mob/spirit/currentSpirit in spirits) - add_cult_icon_to_spirit(currentSpirit,cult_mind) - var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT] culthud.join_hud(cult_mind.current) set_antag_hud(cult_mind.current, "hudcultist") @@ -237,9 +218,6 @@ /datum/game_mode/proc/update_cult_icons_removed(datum/mind/cult_mind) - for(var/mob/spirit/currentSpirit in spirits) - remove_cult_icon_from_spirit(currentSpirit,cult_mind) - var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT] culthud.leave_hud(cult_mind.current) set_antag_hud(cult_mind.current, null) @@ -259,9 +237,18 @@ cult_fail += check_survive() //the proc returns 1 if there are not enough cultists on the shuttle, 0 otherwise if(objectives.Find("eldergod")) cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once + if(objectives.Find("slaughter")) + if(!demons_summoned) + cult_fail++ if(objectives.Find("sacrifice")) if(sacrifice_target && !(sacrifice_target in sacrificed)) //if the target has been sacrificed, ignore this step. otherwise, add 1 to cult_fail cult_fail++ + if(objectives.Find("convert")) + if(cult.len < convert_target) + cult_fail++ + if(objectives.Find("bloodspill")) + if(max_spilled_blood < spilltarget) + cult_fail++ return cult_fail //if any objectives aren't met, failure @@ -269,9 +256,9 @@ /datum/game_mode/cult/proc/check_survive() acolytes_survived = 0 for(var/datum/mind/cult_mind in cult) - if(cult_mind.current && cult_mind.current.stat!=2) + if (cult_mind.current && cult_mind.current.stat!=2) var/area/A = get_area(cult_mind.current ) - if( is_type_in_list(A, centcom_areas)) + if ( is_type_in_list(A, centcom_areas)) acolytes_survived++ else if(A == shuttle_master.emergency.areaInstance && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) //snowflaked into objectives because shitty bay shuttles had areas to auto-determine this acolytes_survived++ @@ -287,6 +274,7 @@ /datum/game_mode/cult/declare_completion() + bonus_check() if(!check_cult_victory()) feedback_set_details("round_end_result","win - cult win") @@ -324,11 +312,59 @@ feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED") if("eldergod") if(!eldergod) - explanation = "Summon Nar-Sie. Success!" + explanation = "Summon [ticker.mode.cultdat.entity_name]. Success!" feedback_add_details("cult_objective","cult_narsie|SUCCESS") else - explanation = "Summon Nar-Sie. Fail." + explanation = "Summon [ticker.mode.cultdat.entity_name]. Fail." feedback_add_details("cult_objective","cult_narsie|FAIL") + if("slaughter") + if(demons_summoned) + explanation = "Bring the Slaughter. Success!" + feedback_add_details("cult_objective","cult_demons|SUCCESS") + else + explanation = "Bring the Slaughter. Fail." + feedback_add_details("cult_objective","cult_demons|FAIL") + + if("convert")//convert half the crew + if(obj_count < objectives.len) + explanation = "Convert [convert_target] crewmembers ([cult.len] cultists at round end). Success!" + feedback_add_details("cult_objective","cult_convertion|SUCCESS") + else + explanation = "Convert [convert_target] crewmembers ([cult.len] total cultists). Fail!" + feedback_add_details("cult_objective","cult_convertion|FAIL") + + if("bloodspill")//cover a large portion of the station in blood + if(obj_count < objectives.len) + explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). Success!" + feedback_add_details("cult_objective","cult_bloodspill|SUCCESS") + else + explanation = "Cover [spilltarget] tiles of the station in blood (The peak number of covered tiles was: [max_spilled_blood]). Fail!" + feedback_add_details("cult_objective","cult_bloodspill|FAIL") + + if("harvest") + if(harvested > harvest_target) + explanation = "Offer [harvest_target] humans for [ticker.mode.cultdat.entity_name]'s first meal of the day. ([harvested] eaten) Success!" + feedback_add_details("cult_objective","cult_harvest|SUCCESS") + else + explanation = "Offer [harvest_target] humans for [ticker.mode.cultdat.entity_name]'s first meal of the day. ([harvested] eaten) Fail!" + feedback_add_details("cult_objective","cult_harvest|FAIL") + + if("hijack") + if(!escaped_shuttle) + explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) Success!" + feedback_add_details("cult_objective","cult_hijack|SUCCESS") + else + explanation = "Do not let a single non-cultist board the Escape Shuttle. ([escaped_shuttle] escaped on the shuttle) ([escaped_pod] escaped on pods) Fail!" + feedback_add_details("cult_objective","cult_hijack|FAIL") + + if("massacre") + if(survivors < massacre_target) + explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humans left alive) Success!" + feedback_add_details("cult_objective","cult_massacre|SUCCESS") + else + explanation = "Massacre the crew until less than [massacre_target] people are left on the station. ([survivors] humans left alive) Fail!" + feedback_add_details("cult_objective","cult_massacre|FAIL") + text += "
Objective #[obj_count]: [explanation]" to_chat(world, text) diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index cb68d4aa348..2a0f1b7f46c 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -1,16 +1,15 @@ -/datum/action/cultcomm +/datum/action/innate/cultcomm name = "Communion" button_icon_state = "cult_comms" background_icon_state = "bg_cult" - action_type = AB_INNATE check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING -/datum/action/cultcomm/IsAvailable() +/datum/action/innate/cultcomm/IsAvailable() if(!iscultist(owner)) return 0 return ..() -/datum/action/cultcomm/Activate() +/datum/action/innate/cultcomm/Activate() var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") if(!input || !IsAvailable()) return diff --git a/code/game/gamemodes/cult/cult_datums.dm b/code/game/gamemodes/cult/cult_datums.dm index f4ff5c28e09..2652244f247 100644 --- a/code/game/gamemodes/cult/cult_datums.dm +++ b/code/game/gamemodes/cult/cult_datums.dm @@ -14,7 +14,7 @@ var/entity_title1 = "The Dark One" var/entity_title2 = "The One Who Sees" var/entity_title3 = "The Geometer of Blood" - var/entity_icon_state = "" + var/entity_icon_state = "narsie" //Builder Construct @@ -60,18 +60,28 @@ entity_title1 = "The Burning One" entity_title2 = "The One Who Consumes" entity_title3 = "The Harbinger of Fire" + entity_icon_state = "narbee" + + cult_wall_icon_state = "firecult" + cult_floor_icon_state = "cultfire" artificer_name = "Igniting Ember" + artificer_icon_state = "fireartificer" behemoth_name = "Devouring Hatred" + behemoth_icon_state = "firejuggernaut" wraith_name = "Living Flame" + wraith_icon_state = "firewraith" juggernaut_name = "Pyre Armor" + juggernaut_icon_state = "firejuggernaut" - harvester_name = "Coal Seeker" + harvester_name = "Coal Seeker"//or nipple pincher... + harvester_icon_state = "fireharvester" shade_name = "Charred Soul" + shade_icon_state = "shade" /datum/cult_info/death name = "Cult of Mortality" diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 91147183ba1..f971a881ea1 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -1,41 +1,71 @@ /obj/item/weapon/melee/cultblade name = "Cult Blade" - desc = "An arcane weapon wielded by the followers of Nar-Sie" + desc = "An arcane weapon wielded by the followers of a cult." icon_state = "cultblade" item_state = "cultblade" w_class = 4 force = 30 throwforce = 10 + sharp = 1 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") /obj/item/weapon/melee/cultblade/attack(mob/living/target as mob, mob/living/carbon/human/user as mob) - if(iscultist(user)) - return ..() - else - user.Paralyse(5) - to_chat(user, "\red An unexplicable force powerfully repels the sword from [target]!") - var/organ = ((user.hand ? "l_":"r_") + "arm") - var/obj/item/organ/external/affecting = user.get_organ(organ) - if(affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade. - user.UpdateDamageIcon() - return + if(!iscultist(user)) + user.Weaken(5) + user.unEquip(src, 1) + user.visible_message("A powerful force shoves [user] away from [target]!", \ + "\"You shouldn't play with sharp things. You'll poke someone's eye out.\"") + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.apply_damage(rand(force/2, force), BRUTE, pick("l_arm", "r_arm")) + else + user.adjustBruteLoss(rand(force/2,force)) + return + ..() -/obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob) +/obj/item/weapon/melee/cultblade/pickup(mob/living/user) ..() if(!iscultist(user)) - to_chat(user, "\red An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly.") + to_chat(user, "\"I wouldn't advise that.\"") + to_chat(user, "An overwhelming sense of nausea overpowers you!") user.Dizzy(120) +/obj/item/weapon/melee/cultblade/dagger + name = "sacrificial dagger" + desc = "A strange dagger said to be used by sinister groups for \"preparing\" a corpse before sacrificing it to their dark gods." + icon = 'icons/obj/wizard.dmi' + icon_state = "render" + w_class = 2 + force = 15 + throwforce = 25 + var/cooldown = 0 + +/obj/item/weapon/melee/cultblade/dagger/attack(mob/living/target, mob/living/carbon/human/user) + ..() + if(cooldown <= world.time && prob(50) && !target.stat) + if(ishuman(target)) + visible_message("The runes on the blade absorb the blood of [target]!") + var/mob/living/carbon/human/H = target + H.drip(500) + cooldown = world.time + 2400 + + +/obj/item/weapon/legcuffs/bolas/cult + name = "runed bola" + desc = "A strong bola, bound with dark magic. Throw it to trip and slow your victim." + icon = 'icons/obj/items.dmi' + icon_state = "bola_cult" + breakouttime = 45 /obj/item/clothing/head/culthood name = "cult hood" icon_state = "culthood" - desc = "A hood worn by the followers of Nar-Sie." + desc = "A hood worn by the followers of a cult." flags_inv = HIDEFACE flags = HEADCOVERSEYES - armor = list(melee = 30, bullet = 10, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT @@ -44,22 +74,23 @@ icon_state = "cult_hoodalt" item_state = "cult_hoodalt" -/obj/item/clothing/suit/hooded/cultrobes/alt - icon_state = "cultrobesalt" - item_state = "cultrobesalt" - hoodtype = /obj/item/clothing/head/culthood/alt /obj/item/clothing/suit/hooded/cultrobes name = "cult robes" - desc = "A set of armored robes worn by the followers of Nar-Sie" + desc = "A set of armored robes worn by the followers of a cult." icon_state = "cultrobes" item_state = "cultrobes" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS hoodtype = /obj/item/clothing/head/culthood allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) - armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0) + armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) flags_inv = HIDEJUMPSUIT +/obj/item/clothing/suit/hooded/cultrobes/alt + icon_state = "cultrobesalt" + item_state = "cultrobesalt" + hoodtype = /obj/item/clothing/head/culthood/alt + /obj/item/clothing/head/magus name = "magus helm" icon_state = "magus" @@ -67,7 +98,7 @@ desc = "A helm worn by the followers of Nar-Sie." flags_inv = HIDEFACE flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR - armor = list(melee = 30, bullet = 30, laser = 30, energy = 20, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/suit/magusred name = "magus robes" @@ -76,15 +107,15 @@ item_state = "magusred" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) - armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0) + armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT /obj/item/clothing/head/helmet/space/cult name = "cult helmet" - desc = "A space worthy helmet used by the followers of Nar-Sie" + desc = "A space worthy helmet used by the followers of a cult." icon_state = "cult_helmet" item_state = "cult_helmet" - armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) + armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) /obj/item/clothing/suit/space/cult name = "cult armour" @@ -93,4 +124,193 @@ desc = "A bulky suit of armour, bristling with spikes. It looks space proof." w_class = 3 allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank) - armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) + slowdown = 1 + armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) + +/obj/item/clothing/suit/hooded/cultrobes/cult_shield + name = "empowered cultist armor" + desc = "Empowered garb which creates a powerful shield around the user." + icon_state = "cult_armor" + item_state = "cult_armor" + w_class = 4 + armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30) + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) + var/current_charges = 3 + hoodtype = /obj/item/clothing/head/cult_hoodie + +/obj/item/clothing/head/cult_hoodie + name = "empowered cultist armor" + desc = "Empowered garb which creates a powerful shield around the user." + icon_state = "cult_hoodalt" + armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30) + body_parts_covered = HEAD + flags_inv = HIDEFACE + flags = NODROP | HEADCOVERSEYES + +/obj/item/clothing/suit/hooded/cultrobes/cult_shield/equipped(mob/living/user, slot) + ..() + if(!iscultist(user)) + to_chat(user, "\"I wouldn't advise that.\"") + to_chat(user, "An overwhelming sense of nausea overpowers you!") + user.unEquip(src, 1) + user.Dizzy(30) + user.Weaken(5) + +/obj/item/clothing/suit/hooded/cultrobes/cult_shield/hit_reaction(mob/living/carbon/human/owner, attack_text, isinhands) + if(current_charges) + owner.visible_message("\The [attack_text] is deflected in a burst of blood-red sparks!") + current_charges-- + new /obj/effect/overlay/temp/cult/sparks(get_turf(owner)) + if(!current_charges) + owner.visible_message("The runed shield around [owner] suddenly disappears!") + owner.update_inv_wear_suit() + return 1 + return 0 + +/obj/item/clothing/suit/hooded/cultrobes/berserker + name = "flagellant's robes" + desc = "Blood-soaked robes infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage." + icon_state = "hardsuit-beserker" + item_state = "hardsuit-beserker" + flags_inv = HIDEJUMPSUIT + allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + armor = list(melee = -100, bullet = -100, laser = -100,energy = -100, bomb = -100, bio = -100, rad = -100) + slowdown = -1 + hoodtype = /obj/item/clothing/head/berserkerhood + + +/obj/item/clothing/head/berserkerhood + name = "flagellant's robes" + desc = "Blood-soaked garb infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage." + icon_state = "culthood" + flags_inv = HIDEFACE + flags = HEADCOVERSEYES + armor = list(melee = -100, bullet = -100, laser = -100,energy = -100, bomb = -100, bio = -100, rad = -100) + +/obj/item/weapon/whetstone/cult + name = "eldritch whetstone" + desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone." + icon = 'icons/obj/cult.dmi' + icon_state = "cultstone" + used = 0 + increment = 5 + max = 40 + prefix = "darkened" + +/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater + name = "flask of unholy water" + desc = "Toxic to nonbelievers; this water renews and reinvigorates the faithful of a cult." + icon_state = "holyflask" + color = "#333333" + list_reagents = list("unholywater" = 40) + +/obj/item/clothing/glasses/night/cultblind + desc = "May the master guide you through the darkness and shield you from the light." + name = "zealot's blindfold" + icon_state = "blindfold" + item_state = "blindfold" + darkness_view = 8 + flash_protect = 1 + +/obj/item/clothing/glasses/night/cultblind/equipped(mob/user, slot) + ..() + if(!iscultist(user)) + to_chat(user, "\"You want to be blind, do you?\"") + user.unEquip(src, 1) + user.Dizzy(30) + user.Weaken(5) + user.eye_blind = 30 + +/obj/item/device/shuttle_curse + name = "cursed orb" + desc = "You peer within this smokey orb and glimpse terrible fates befalling the escape shuttle." + icon = 'icons/obj/projectiles.dmi' + icon_state ="bluespace" + color = "#ff0000" + var/static/curselimit = 0 + +/obj/item/device/shuttle_curse/attack_self(mob/user) + if(!iscultist(user)) + user.unEquip(src, 1) + user.Weaken(5) + to_chat(user, "A powerful force shoves you away from [src]!") + return + if(curselimit > 1) + to_chat(user, "We have exhausted our ability to curse the shuttle.") + return + if(shuttle_master.emergency.mode == SHUTTLE_CALL) + var/cursetime = 1500 + var/timer = shuttle_master.emergency.timeLeft(1) + cursetime + shuttle_master.emergency.setTimer(timer) + to_chat(user,"You shatter the orb! A dark essence spirals into the air, then disappears.") + playsound(user.loc, "sound/effects/Glassbr1.ogg", 50, 1) + qdel(src) + sleep(20) + var/global/list/curses + if(!curses) + curses = list("A fuel technician just slit his own throat and begged for death. The shuttle will be delayed by two minutes.", + "The shuttle's navigation programming was replaced by a file containing two words, IT COMES. The shuttle will be delayed by two minutes.", + "The shuttle's custodian tore out his guts and began painting strange shapes on the floor. The shuttle will be delayed by two minutes.", + "A shuttle engineer began screaming 'DEATH IS NOT THE END' and ripped out wires until an arc flash seared off her flesh. The shuttle will be delayed by two minutes.", + "A shuttle inspector started laughing madly over the radio and then threw herself into an engine turbine. The shuttle will be delayed by two minutes.", + "The shuttle dispatcher was found dead with bloody symbols carved into their flesh. The shuttle will be delayed by two minutes.", + "Steve repeatedly touched a lightbulb until his hands fell off. The shuttle will be delayed by two minutes.") + var/message = pick(curses) + command_announcement.Announce("[message]", "System Failure", 'sound/misc/notice1.ogg') + curselimit++ + +/obj/item/device/cult_shift + name = "veil shifter" + desc = "This relic teleports you forward a medium distance." + icon = 'icons/obj/cult.dmi' + icon_state ="shifter" + var/uses = 2 + +/obj/item/device/cult_shift/examine(mob/user) + ..() + if(uses) + to_chat(user, "It has [uses] uses remaining.") + else + to_chat(user, "It seems drained.") + +/obj/item/device/cult_shift/proc/handle_teleport_grab(turf/T, mob/user) + var/mob/living/carbon/C = user + if(C.pulling) + var/atom/movable/pulled = C.pulling + pulled.forceMove(T) + . = pulled + +/obj/item/device/cult_shift/attack_self(mob/user) + if(!uses || !iscarbon(user)) + to_chat(user, "\The [src] is dull and unmoving in your hands.") + return + if(!iscultist(user)) + user.unEquip(src, 1) + step(src, pick(alldirs)) + to_chat(user, "\The [src] flickers out of your hands, too eager to move!") + return + + var/mob/living/carbon/C = user + var/turf/mobloc = get_turf(C) + var/turf/destination = get_teleport_loc(mobloc,C,9,1,3,1,0,1) + + if(destination) + uses-- + if(uses <= 0) + icon_state ="shifter_drained" + playsound(mobloc, "sparks", 50, 1) + new /obj/effect/overlay/temp/cult/phase/out(mobloc) + + var/atom/movable/pulled = handle_teleport_grab(destination, C) + C.forceMove(destination) + if(pulled) + C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull + + new /obj/effect/overlay/temp/cult/phase(destination) + playsound(destination, 'sound/effects/phasein.ogg', 25, 1) + playsound(destination, "sparks", 50, 1) + + else + to_chat(C, "The veil cannot be torn here!") \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index a89b5f4a907..b07c300f687 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -75,7 +75,7 @@ /obj/structure/cult/culttalisman name = "altar" - desc = "A bloodstained altar dedicated to Nar-Sie." + desc = "A bloodstained altar dedicated to a cult." icon_state = "talismanaltar" health = 150 //Sturdy death_message = "The altar breaks into splinters, releasing a cascade of spirits into the air!" @@ -91,7 +91,7 @@ if(cooldowntime > world.time) to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].") return - var/choice = alert(user,"You study the schematics etched into the forge...",,"Eldritch Whetstone","Zealot's Blindfold","Flask of Unholy Water") + var/choice = alert(user,"You study the schematics etched into the forge...","Cultist Dagger", "Eldritch Whetstone","Zealot's Blindfold","Flask of Unholy Water") var/pickedtype switch(choice) if("Eldritch Whetstone") @@ -100,6 +100,8 @@ pickedtype = /obj/item/clothing/glasses/night/cultblind if("Flask of Unholy Water") pickedtype = /obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater + if("Cultist Dagger") + pickedtype = /obj/item/weapon/melee/cultblade/dagger if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time) cooldowntime = world.time + 2400 var/obj/item/N = new pickedtype(get_turf(src)) @@ -143,18 +145,17 @@ if(cooldowntime > world.time) to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].") return - var/choice = alert(user,"You study the schematics etched into the forge...",, "Flagellant's Robe","Cultist Hardsuit", "Cultist Dagger") + var/choice = alert(user,"You study the schematics etched into the forge...",, "Shielded Hardsuit", "Flagellant's Robe","Cultist Hardsuit") var/pickedtype var/otheritem //ie:helmet.. switch(choice) + if("Shielded Robe") + pickedtype = /obj/item/clothing/suit/hooded/cultrobes/cult_shield if("Flagellant's Robe") - pickedtype = /obj/item/clothing/suit/cultrobes/berserker - otheritem = /obj/item/clothing/head/berserkerhood + pickedtype = /obj/item/clothing/suit/hooded/cultrobes/berserker if("Cultist Hardsuit") pickedtype = /obj/item/clothing/suit/space/cult otheritem = /obj/item/clothing/head/helmet/space/cult - if("Cultist Dagger") - pickedtype = /obj/item/weapon/melee/cultblade/dagger if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time) cooldowntime = world.time + 2400 var/obj/item/N = new pickedtype(get_turf(src)) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index cbacf23bd51..b350ecfc7ae 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -1,686 +1,278 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 -var/cultwords = list() -var/rune_to_english = list() -var/runedec = 0 -var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", "self", "see", "other", "hide") - -/client/proc/check_words() // -- Urist - set category = "Special Verbs" - set name = "Check Rune Words" - set desc = "Check the rune-word meaning" - if(!cultwords["travel"]) - runerandom() - for(var/word in engwords) - to_chat(usr, "[cultwords[word]] is [word]") - -/proc/runerandom() //randomizes word meaning - var/list/runewords=list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri") ///"orkan" and "allaq" removed. - for(var/word in engwords) - var/runeword = pick(runewords) - cultwords[word] = runeword - rune_to_english[runeword] = word - runewords-=cultwords[word] - - -/obj/effect/rune - desc = "" - anchored = 1 - icon = 'icons/obj/rune.dmi' - icon_state = "1" - var/visibility = 0 - var/view_range = 7 - unacidable = 1 - layer = TURF_LAYER - - var/word1 - var/word2 - var/word3 -// Places these combos are mentioned: this file - twice in the rune code, once in imbued tome, once in tome's HTML runes.dm - in the imbue rune code. If you change a combination - dont forget to change it everywhere. - -// travel self [word] - Teleport to random [rune with word destination matching] -// travel other [word] - Portal to rune with word destination matching - kinda doesnt work. At least the icon. No idea why. -// see blood Hell - Create a new tome -// join blood self - Incorporate person over the rune into the group -// Hell join self - Summon TERROR -// destroy see technology - EMP rune -// travel blood self - Drain blood -// see Hell join - See invisible -// blood join Hell - Raise dead - -// hide see blood - Hide nearby runes -// blood see hide - Reveal nearby runes - The point of this rune is that its reversed obscure rune. So you always know the words to reveal the rune once oyu have obscured it. - -// Hell travel self - Leave your body and ghost around -// blood see travel - Manifest a ghost into a mortal body -// Hell tech join - Imbue a rune into a talisman -// Hell blood join - Sacrifice rune -// destroy travel self - Wall rune -// join other self - Summon cultist rune -// travel technology other - Freeing rune // other blood travel was freedom join other - -// hide other see - Deafening rune // was destroy see hear -// destroy see other - Blinding rune -// destroy see blood - BLOOD BOIL - -// self other technology - Communication rune //was other hear blood -// join hide technology - stun rune. Rune color: bright pink. - -/obj/effect/rune/New() - ..() - var/image/blood = image(loc = src) - blood.override = 1 - for(var/mob/living/silicon/ai/AI in player_list) - AI.client.images += blood - cult_viewpoints += src - -/obj/effect/rune/Destroy() - cult_viewpoints -= src - return ..() - -/obj/effect/rune/examine(mob/user) - ..(user) - if(!iscultist(user) && !isSpirit(user)) - to_chat(user, "A strange collection of symbols drawn in blood.") - return - if(!desc) - to_chat(user, "A spell circle drawn in blood. It reads: [word1] [word2] [word3].") - else - to_chat(user, "Explosive Runes inscription in blood. It reads: [desc].") - - -/obj/effect/rune/attackby(I as obj, user as mob, params) - if(istype(I, /obj/item/weapon/tome) && iscultist(user)) - to_chat(user, "You retrace your steps, carefully undoing the lines of the rune.") - qdel(src) - return - else if(istype(I, /obj/item/weapon/nullrod)) - to_chat(user, "\blue You disrupt the vile magic with the deadening field of \the [I]!") - qdel(src) - return - return - - -/obj/effect/rune/proc/get_word_string() - if(word1 == cultwords["travel"]) - if(word2 == cultwords["self"]) - return "teleport" - if(word2 == cultwords["other"]) - return "itemport" - return "[rune_to_english[word1]]_[rune_to_english[word2]]_[rune_to_english[word3]]" - - -/obj/effect/rune - var/list/effect_dictionary = list( "teleport"=/obj/effect/rune/proc/teleportRune, - "itemport"=/obj/effect/rune/proc/itemportRune, - "see_blood_hell"=/obj/effect/rune/proc/tomesummon, - "hell_destroy_other"=/obj/effect/rune/proc/armor, - "join_blood_self"=/obj/effect/rune/proc/convert, - "hell_join_self"=/obj/effect/rune/proc/tearreality, - "destroy_see_technology"=/obj/effect/rune/proc/empRune, - "travel_blood_self"=/obj/effect/rune/proc/drain, - "see_hell_join"=/obj/effect/rune/proc/seer, - "blood_join_hell"=/obj/effect/rune/proc/raise, - "hide_see_blood"=/obj/effect/rune/proc/obscureRune, - "hell_travel_self"=/obj/effect/rune/proc/ajourney, - "blood_see_travel"=/obj/effect/rune/proc/manifest, - "hell_technology_join"=/obj/effect/rune/proc/talisman, - "hell_blood_join"=/obj/effect/rune/proc/sacrifice, - "blood_see_hide"=/obj/effect/rune/proc/revealrunesrune, - "destroy_travel_self"=/obj/effect/rune/proc/wall, - "travel_technology_other"=/obj/effect/rune/proc/freedom, - "join_other_self"=/obj/effect/rune/proc/cultsummon, - "hide_other_see"=/obj/effect/rune/proc/deafen, - "destroy_see_other"=/obj/effect/rune/proc/blind, - "destroy_see_blood"=/obj/effect/rune/proc/bloodboil, - "self_other_technology"=/obj/effect/rune/proc/communicate, - "join_hide_technology"=/obj/effect/rune/proc/runestun ) - -/obj/effect/rune/attack_hand(mob/living/user as mob) - if(!iscultist(user)) - to_chat(user, "You can't mouth the arcane scratchings without fumbling over them.") - return - if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle)) - to_chat(user, "You are unable to speak the words of the rune.") - return - if(user.silent) // checking if we've been muted somehow - to_chat(user, "You are unable to speak at all! You cannot say the words of the rune.") - if(!word1 || !word2 || !word3 || prob(user.getBrainLoss())) - return fizzle() - - var/word_string = get_word_string() - if(word_string in effect_dictionary) - cult_log("of type [effect_dictionary[word_string]] activated by [key_name_admin(user)].") - return call(src,effect_dictionary[word_string])() - return fizzle() - - /obj/effect/rune/proc/fizzle() if(istype(src,/obj/effect/rune)) usr.say(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix.")) else usr.whisper(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix.")) - for(var/mob/V in viewers(src)) + for (var/mob/V in viewers(src)) V.show_message("\red The markings pulse with a small burst of light, then fall dark.", 3, "\red You hear a faint fizzle.", 2) return /obj/effect/rune/proc/check_icon() - icon = get_uristrune_cult(word1, word2, word3) + icon = get_uristrune_cult(invocation) /obj/item/weapon/tome name = "arcane tome" + desc = "An old, dusty tome with frayed edges and a sinister-looking cover." icon_state ="tome" - throw_speed = 1 + throw_speed = 2 throw_range = 5 w_class = 2 - var/notedat = "" - var/tomedat = "" - var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri") + var/scribereduct = 0 + var/canbypass = 0 //ADMINBUS - tomedat = {" - - - - -

The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood.

+/obj/item/weapon/tome/accursed + name = "accursed tome" + desc = "An arcane tome still empowered with a shadow of its former consecration." + scribereduct = 30 //faster because it's made by corrupting a bible - The book is written in an unknown dialect, there are lots of pictures of various complex geometric shapes. You find some notes in english that give you basic understanding of the many runes written in the book. The notes give you an understanding what the words for the runes should be. However, you do not know how to write all these words in this dialect.
- Below is the summary of the runes.
+/obj/item/weapon/tome/imbued //Admin-only tome, allows instant drawing of runes + name = "imbued arcane tome" + desc = "An arcane tome granted by the Geometer itself." + scribereduct = 50 + canbypass = 1 -

Contents

-

- Teleport self: Travel Self (word)
- Teleport other: Travel Other (word)
- Summon new tome: See Blood Hell
- Convert a person: Join Blood Self
- Summon Nar-Sie: Hell Join Self
- Disable technology: Destroy See Technology
- Drain blood: Travel Blood Self
- Raise dead: Blood Join Hell
- Hide runes: Hide See Blood
- Reveal hidden runes: Blood See Hide
- Leave your body: Hell travel self
- Ghost Manifest: Blood See Travel
- Imbue a talisman: Hell Technology Join
- Sacrifice: Hell Blood Join
- Create a wall: Destroy Travel Self
- Summon cultist: Join Other Self
- Free a cultist: Travel technology other
- Deafen: Hide Other See
- Blind: Destroy See Other
- Blood Boil: Destroy See Blood
- Communicate: Self Other Technology
- Stun: Join Hide Technology
- Summon Cultist Armor: Hell Destroy Other
- See Invisible: See Hell Join
-

-

Rune Descriptions

-

Teleport self

- Teleport rune is a special rune, as it only needs two words, with the third word being destination. Basically, when you have two runes with the same destination, invoking one will teleport you to the other one. If there are more than 2 runes, you will be teleported to a random one. Runes with different third words will create separate networks. You can imbue this rune into a talisman, giving you a great escape mechanism.
-

Teleport other

- Teleport other allows for teleportation for any movable object to another rune with the same third word. You need 3 cultists chanting the invocation for this rune to work.
-

Summon new tome

- Invoking this rune summons a new arcane tome. -

Convert a person

- This rune opens target's mind to the realm of Nar-Sie, which usually results in this person joining the cult. However, some people (mostly the ones who posess high authority) have strong enough will to stay true to their old ideals.
-

Summon Nar-Sie

- The ultimate rune. It summons the Avatar of Nar-Sie himself, tearing a huge hole in reality and consuming everything around it. Summoning it is the final goal of any cult.
-

Disable Technology

- Invoking this rune creates a strong electromagnetic pulse in a small radius, making it basically analogic to an EMP grenade. You can imbue this rune into a talisman, making it a decent defensive item.
-

Drain Blood

- This rune instantly heals you of some brute damage at the expense of a person placed on top of the rune. Whenever you invoke a drain rune, ALL drain runes on the station are activated, draining blood from anyone located on top of those runes. This includes yourself, though the blood you drain from yourself just comes back to you. This might help you identify this rune when studying words. One drain gives up to 25HP per each victim, but you can repeat it if you need more. Draining only works on living people, so you might need to recharge your "Battery" once its empty. Drinking too much blood at once might cause blood hunger.
-

Raise Dead

- This rune allows for the resurrection of any dead person. You will need a dead human body and a living human sacrifice. Make 2 raise dead runes. Put a living, awake human on top of one, and a dead body on the other one. When you invoke the rune, the life force of the living human will be transferred into the dead body, allowing a ghost standing on top of the dead body to enter it, instantly and fully healing it. Use other runes to ensure there is a ghost ready to be resurrected.
-

Hide runes

- This rune makes all nearby runes completely invisible. They are still there and will work if activated somehow, but you cannot invoke them directly if you do not see them.
-

Reveal runes

- This rune is made to reverse the process of hiding a rune. It reveals all hidden runes in a rather large area around it. -

Leave your body

- This rune gently rips your soul out of your body, leaving it intact. You can observe the surroundings as a ghost as well as communicate with other ghosts. Your body takes damage while you are there, so ensure your journey is not too long, or you might never come back.
-

Manifest a ghost

- Unlike the Raise Dead rune, this rune does not require any special preparations or vessels. Instead of using full lifeforce of a sacrifice, it will drain YOUR lifeforce. Stand on the rune and invoke it. If theres a ghost standing over the rune, it will materialise, and will live as long as you dont move off the rune or die. You can put a paper with a name on the rune to make the new body look like that person.
-

Imbue a talisman

- This rune allows you to imbue the magic of some runes into paper talismans. Create an imbue rune, then an appropriate rune beside it. Put an empty piece of paper on the imbue rune and invoke it. You will now have a one-use talisman with the power of the target rune. Using a talisman drains some health, so be careful with it. You can imbue a talisman with power of the following runes: summon tome, reveal, conceal, teleport, tisable technology, communicate, deafen, blind and stun.
-

Sacrifice

- Sacrifice rune allows you to sacrifice a living thing or a body to the Geometer of Blood. Monkeys and dead humans are the most basic sacrifices, they might or might not be enough to gain His favor. A living human is what a real sacrifice should be, however, you will need 3 people chanting the invocation to sacrifice a living person. -

Create a wall

- Invoking this rune solidifies the air above it, creating an an invisible wall. To remove the wall, simply invoke the rune again. -

Summon cultist

- This rune allows you to summon a fellow cultist to your location. The target cultist must be unhandcuffed ant not buckled to anything. You also need to have 3 people chanting at the rune to succesfully invoke it. Invoking it takes heavy strain on the bodies of all chanting cultists.
-

Free a cultist

- This rune unhandcuffs and unbuckles any cultist of your choice, no matter where he is. You need to have 3 people invoking the rune for it to work. Invoking it takes heavy strain on the bodies of all chanting cultists.
-

Deafen

- This rune temporarily deafens all non-cultists around you.
-

Blind

- This rune temporarily blinds all non-cultists around you. Very robust. Use together with the deafen rune to leave your enemies completely helpless.
-

Blood boil

- This rune boils the blood all non-cultists in visible range. The damage is enough to instantly critically hurt any person. You need 3 cultists invoking the rune for it to work. This rune is unreliable and may cause unpredicted effect when invoked. It also drains significant amount of your health when succesfully invoked.
-

Communicate

- Invoking this rune allows you to relay a message to all cultists on the station and nearby space objects. -

Stun

- Unlike other runes, this ons is supposed to be used in talisman form. When invoked directly, it simply releases some dark energy, briefly stunning everyone around. When imbued into a talisman, you can force all of its energy into one person, stunning him so hard he cant even speak. However, effect wears off rather fast.
-

Equip Armor

- When this rune is invoked, either from a rune or a talisman, it will equip the user with the armor of the followers of Nar-Sie. To use this rune to its fullest extent, make sure you are not wearing any form of headgear, armor, gloves or shoes, and make sure you are not holding anything in your hands.
-

See Invisible

- When invoked when standing on it, this rune allows the user to see the the world beyond as long as he does not move.
- - - "} +/obj/item/weapon/tome/examine(mob/user) + ..() + if(iscultist(user) || user.stat == DEAD) + to_chat(user, "The scriptures of [ticker.mode.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [ticker.mode.cultdat.entity_name].") + to_chat(user, "Striking another cultist with it will purge holy water from them.") + to_chat(user, "Striking a noncultist, however, will sear their flesh.") +/obj/item/weapon/tome/attack(mob/living/M, mob/living/user) + if(!istype(M)) + return + if(!iscultist(user)) + return ..() + if(iscultist(M)) + if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion + to_chat(user, "You remove the taint from [M].") + var/holy2unholy = M.reagents.get_reagent_amount("holywater") + M.reagents.del_reagent("holywater") + M.reagents.add_reagent("unholywater",holy2unholy) + add_logs(user, M, "smacked", src, " removing the holy water from them") + return + M.take_organ_damage(0, 15) //Used to be a random between 5 and 20 + playsound(M, 'sound/weapons/sear.ogg', 50, 1) + M.visible_message("[user] strikes [M] with the arcane tome!", \ + "[user] strikes you with the tome, searing your flesh!") + flick("tome_attack", src) + user.do_attack_animation(M) + add_logs(user, M, "smacked", src) - Topic(href,href_list[]) - if(src.loc == usr) - var/number = text2num(href_list["number"]) - if(usr.stat|| usr.restrained()) - return - switch(href_list["action"]) - if("clear") - words[words[number]] = words[number] - if("change") - words[words[number]] = input("Enter the translation for [words[number]]", "Word notes") in engwords - for(var/w in words) - if((words[w] == words[words[number]]) && (w != words[number])) - words[w] = w - notedat = {" -
Word translation notes
- [words[1]] is [words[words[1]]] Clear
- [words[2]] is [words[words[2]]] Clear
- [words[3]] is [words[words[3]]] Clear
- [words[4]] is [words[words[4]]] Clear
- [words[5]] is [words[words[5]]] Clear
- [words[6]] is [words[words[6]]] Clear
- [words[7]] is [words[words[7]]] Clear
- [words[8]] is [words[words[8]]] Clear
- [words[9]] is [words[words[9]]] Clear
- [words[10]] is [words[words[10]]] Clear
- "} - usr << browse("[notedat]", "window=notes") -// call(/obj/item/weapon/tome/proc/edit_notes)() - else - usr << browse(null, "window=notes") +/obj/item/weapon/tome/attack_self(mob/user) + if(!iscultist(user)) + to_chat(user, "[src] seems full of unintelligible shapes, scribbles, and notes. Is this some sort of joke?") + return + open_tome(user) + +/obj/item/weapon/tome/proc/open_tome(mob/user) + var/choice = alert(user,"You open the tome...",,"Scribe Rune","More Information","Cancel") + switch(choice) + if("More Information") + read_tome(user) + if("Scribe Rune") + scribe_rune(user) + if("Cancel") return +/obj/item/weapon/tome/proc/read_tome(mob/user) + var/text = "" + text += "
Archives of [ticker.mode.cultdat.entity_title1]



" + text += "A rune's name and effects can be revealed by examining the rune.<

" -// proc/edit_notes() FUCK IT. Cant get it to work properly. - K0000 -// to_chat(world, "its been called! [usr]") -// notedat = {" -//
Word translation notes
-// [words[1]] is [words[words[1]]] Clear
-// [words[2]] is [words[words[2]]] Clear
-// [words[3]] is [words[words[3]]] Clear
-// [words[4]] is [words[words[4]]] Clear
-// [words[5]] is [words[words[5]]] Clear
-// [words[6]] is [words[words[6]]] Clear
-// [words[7]] is [words[words[7]]] Clear
-// [words[8]] is [words[words[8]]] Clear
-// [words[9]] is [words[words[9]]] Clear
-// [words[10]] is [words[words[10]]] Clear
-// "} -// to_chat(usr, "whatev") -// usr << browse(null, "window=tank") + text += "Rite of Binding
This rune is one of the most important runes the cult has, being the only way to create new talismans. A blank sheet of paper must be on top of the rune. After \ + invoking it and choosing which talisman you desire, the paper will be converted, after some delay into a talisman.

" - attack(mob/living/M as mob, mob/living/user as mob) + text += "Teleport
This rune is unique in that it requires a keyword before the scribing can begin. When invoked, it will find any other Teleport runes; \ + If any are found, the user can choose which rune to send to. Upon activation, the rune teleports everything above it to the selected rune.

" - M.attack_log += text("\[[time_stamp()]\] Has had the [name] used on him by [key_name(user)]") - user.attack_log += text("\[[time_stamp()]\] Used [name] on [key_name(M)]") - msg_admin_attack("[key_name_admin(user)] used [name] on [key_name_admin(M)]") - if(!iscarbon(M)) - M.LAssailant = null - else - M.LAssailant = user - if(istype(M,/mob/dead)) - M.invisibility = 0 - user.visible_message( \ - "\red [user] drags the ghost to our plan of reality!", \ - "\red You drag the ghost to our plan of reality!" \ - ) - return - if(!istype(M)) - return - if(!iscultist(user)) - return ..() - if(iscultist(M)) - if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion - to_chat(user, "You remove the taint from [M].") - var/holy2unholy = M.reagents.get_reagent_amount("holywater") - M.reagents.del_reagent("holywater") - M.reagents.add_reagent("unholywater",holy2unholy) - add_logs(M, user, "smacked", src, " removing the holy water from them") - return - M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] beats [] with the arcane tome!", user, M), 1) - to_chat(M, "\red You feel searing heat inside!") + text += "Rite of Enlightenment
This rune is critical to the success of the cult. It will allow you to convert normal crew members into cultists. \ + To do this, simply place the crew member upon the rune and invoke it. This rune requires two invokers to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \ + be unable to be converted. People [ticker.mode.cultdat.entity_title3] wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.
\ + Successful conversions will produce a tome for the new cultist.

" + text += "Rite of Tribute
This rune is necessary to achieve your goals. Simply place any dead creature upon the rune and invoke it (this will not \ + target cultists!). If this creature has a mind, a soulstone will be created and the creature's soul transported to it. Sacrificing the dead can be done alone, but sacrificing living crew or your cult's target will require 3 cultists. \ + Soulstones used on construct shells will move that soul into a powerful construct of your choice.

" - attack_self(mob/living/user as mob) - usr = user - if(!usr.canmove || usr.stat || usr.restrained()) - return + text += "Rite of Resurrection
This rune requires two corpses. To perform the ritual, place the corpse you wish to revive onto \ + the rune and the offering body adjacent to it. When the rune is invoked, the body to be sacrificed will turn to dust, the life force flowing into the revival target. Assuming the target is not moved \ + within a few seconds, they will be brought back to life, healed of all ailments.

" - if(!cultwords["travel"]) - runerandom() - if(iscultist(user)) - var/C = 0 - for(var/obj/effect/rune/N in world) - C++ - if(!istype(user.loc,/turf)) - to_chat(user, "\red You do not have enough space to write a proper rune.") - return + text += "Rite of Disruption
Robotic lifeforms have time and time again been the downfall of fledgling cults. This rune may allow you to gain the upper \ + hand against these pests. By using the rune, a large electromagnetic pulse will be emitted from the rune's location. The size of the EMP will grow significantly for each additional adjacent cultist when the \ + rune is activated.

" + text += "Astral Communion
This rune is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \ + user's spirit will be ripped from their body. In this state, the user's physical body will be locked in place to the rune itself - any attempts to move it will result in the rune pulling it back. \ + The body will also take constant damage while in this form, and may even die. The user's spirit will contain their consciousness, and will allow them to freely wander the station as a ghost. This may \ + also be used to commune with the dead.

" + text += "Rite of the Corporeal Shield
While simple, this rune serves an important purpose in defense and hindering passage. When invoked, the \ + rune will draw a small amount of life force from the user and make the space above the rune completely dense, rendering it impassable to all but the most complex means. The rune may be invoked again to \ + undo this effect and allow passage again.

" + text += "Rite of Joined Souls
This rune allows the cult to free other cultists with ease. When invoked, it will allow the user to summon a single cultist to the rune from \ + any location. It requires two invokers, and will damage each invoker slightly.

" - if(C>=26+runedec+ticker.mode.cult.len) //including the useless rune at the secret room, shouldn't count against the limit of 25 runes - Urist - alert("The cloth of reality can't take that much of a strain. Remove some runes first!") - return - else - switch(alert("You open the tome",,"Read it","Scribe a rune", "Notes")) //Fuck the "Cancel" option. Rewrite the whole tome interface yourself if you want it to work better. And input() is just ugly. - K0000 - if("Cancel") - return - if("Read it") - if(usr.get_active_hand() != src) - return - user << browse("[tomedat]", "window=Arcane Tome") - return - if("Notes") - if(usr.get_active_hand() != src) - return - notedat = {" -
Word translation notes
- [words[1]] is [words[words[1]]] Clear
- [words[2]] is [words[words[2]]] Clear
- [words[3]] is [words[words[3]]] Clear
- [words[4]] is [words[words[4]]] Clear
- [words[5]] is [words[words[5]]] Clear
- [words[6]] is [words[words[6]]] Clear
- [words[7]] is [words[words[7]]] Clear
- [words[8]] is [words[words[8]]] Clear
- [words[9]] is [words[words[9]]] Clear
- [words[10]] is [words[words[10]]] Clear
- "} -// call(/obj/item/weapon/tome/proc/edit_notes)() - user << browse("[notedat]", "window=notes") - return - if(usr.get_active_hand() != src) - return + text += "Blood Boil
When invoked, this rune will do a massive amount of damage to all non-cultist viewers, but it will also emit a small explosion upon invocation. \ + It requires three invokers.

" - var/list/dictionary = list ( - "convert" = list("join","blood","self"), - "wall" = list("destroy","travel","self"), - "blood boil" = list("destroy","see","blood"), - "blood drain" = list("travel","blood","self"), - "raise dead" = list("blood","join","hell"), - "summon narsie" = list("hell","join","self"), - "communicate" = list("self","other","technology"), - "emp" = list("destroy","see","technology"), - "manifest" = list("blood","see","travel"), - "summon tome" = list("see","blood","hell"), - "see invisible" = list("see","hell","join"), - "hide" = list("hide","see","blood"), - "reveal" = list("blood","see","hide"), - "astral journey" = list("hell","travel","self"), - "imbue" = list("hell","technology","join"), - "sacrifice" = list("hell","blood","join"), - "summon cultist" = list("join","other","self"), - "free cultist" = list("travel","technology","other"), - "deafen" = list("hide","other","see"), - "blind" = list("destroy","see","other"), - "stun" = list("join","hide","technology"), - "armor" = list("hell","destroy","other"), - "teleport" = list("travel","self"), - "teleport other" = list("travel","other") - ) + text += "Rite of Spectral Manifestation
This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and [ticker.mode.cultdat.entity_title3]. \ + However, the spirit's link to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, all summoned spirits will dissipate, dropping their items to the ground. You may manifest \ + multiple spirits with one rune, but you will rapidly take damage in doing so.

" - var/list/english = list() + text += "Ritual of Dimensional Rending
This rune is necessary to achieve your goals. On attempting to scribe it, it will produce shields around you and alert everyone you are attempting to scribe it; it takes a very long time to scribe, \ + and does massive damage to the one attempting to scribe it.
Invoking it requires 9 invokers and the sacrifice of a specific crewmember, and once invoked, will summon [ticker.mode.cultdat.entity_title3], [ticker.mode.cultdat.entity_name]. \ + This will complete your objectives.


" - var/list/scribewords = list("none") + text += "Talisman of Teleportation
The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once.

" - for(var/entry in words) - if(words[entry] != entry) - english += list(words[entry] = entry) + text += "Talisman of Fabrication
This talisman is the main way of creating construct shells. To use it, one must strike 30 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to recieve a soul to occupy it.

" - for(var/entry in dictionary) - var/list/required = dictionary[entry] - if(length(english&required) == required.len) - scribewords += entry + text += "Talisman of Tome Summoning
This talisman will produce a single tome at your feet.

" - var/chosen_rune = null + text += "Talisman of Veiling/Revealing
This talisman will hide runes on its first use, and on the second, will reveal runes.

" - if(usr) - chosen_rune = input ("Choose a rune to scribe.") in scribewords - if(!chosen_rune) + text += "Talisman of Disguising
This talisman will permanently disguise all nearby runes as crayon runes.

" + + text += "Talisman of Electromagnetic Pulse
This talisman will EMP anything else nearby. It disappears after one use.

" + + text += "Talisman of Stunning
Attacking a target will knock them down for a long duration in addition to inhibiting their speech. \ + Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead.

" + + text += "Talisman of Armaments
The Talisman of Arming will equip the user with armored robes, a backpack, an eldritch longsword, an empowered bola, and a pair of boots. Any items that cannot \ + be equipped will not be summoned. Attacking a fellow cultist with it will instead equip them.

" + + text += "Talisman of Horrors
The Talisman of Horror must be applied directly to the victim, it will shatter your victim's mind with visions of the endtimes that may incapitate them.

" + + text += "Talisman of Shackling
The Talisman of Shackling must be applied directly to the victim, it has 4 uses and cuffs victims with magic shackles that disappear when removed.

" + + text += "In addition to these runes, the cult has a small selection of equipment and constructs.

" + + text += "Equipment:

" + + text += "Cult Blade
Cult blades are sharp weapons that, notably, cannot be used by noncultists. These blades are produced by the Talisman of Arming.

" + + text += "Cult Bola
Cult bolas are strong bolas, useful for snaring targets. These bolas are produced by the Talisman of Arming.

" + + text += "Cult Robes
Cult robes are heavily armored robes. These robes are produced by the Talisman of Arming.

" + + text += "Soulstone
A soulstone is a simple piece of magic, produced either via the starter talisman or by sacrificing humans. Using it on an unconscious or dead human, or on a Shade, will trap their soul in the stone, allowing its use in construct shells. \ +
The soul within can also be released as a Shade by using it in-hand.

" + + text += "Construct Shell
A construct shell is useless on its own, but placing a filled soulstone within it allows you to produce your choice of a Wraith, a Juggernaut, or an Artificer. \ +
Each construct has uses, detailed below in Constructs. Construct shells can be produced via the starter talisman or the Rite of Fabrication.

" + + text += "Constructs:

" + + text += "Shade
While technically not a construct, the Shade is produced when released from a soulstone. It is quite fragile and has weak melee attacks, but is fully healed when recaptured by a soulstone.

" + + text += "Wraith
The Wraith is a fast, lethal melee attacker which can jaunt through walls. However, it is only slightly more durable than a shade.

" + + text += "Juggernaut
The Juggernaut is a slow, but durable, melee attacker which can produce temporary forcewalls. It will also reflect most lethal energy weapons.

" + + text += "Artificer
The Artificer is a weak and fragile construct, able to heal other constructs, produce more soulstones and construct shells, \ + construct fortifying cult walls and flooring, and finally, it can release a few indiscriminate stunning missiles.

" + + text += "Harvester
If you see one, know that you have done all you can and your life is void.

" + + var/datum/browser/popup = new(user, "tome", "", 800, 600) + popup.set_content(text) + popup.open() + return 1 + +/obj/item/weapon/tome/proc/scribe_rune(mob/living/user) + var/turf/runeturf = get_turf(user) + var/chosen_keyword + var/obj/effect/rune/rune_to_scribe + var/entered_rune_name + var/list/possible_runes = list() + var/list/shields = list() + if(locate(/obj/effect/rune) in runeturf) + to_chat(user, "There is already a rune here.") + return + for(var/T in subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed) + var/obj/effect/rune/R = T + if(initial(R.cultist_name)) + possible_runes.Add(initial(R.cultist_name)) //This is to allow the menu to let cultists select runes by name rather than by object path. I don't know a better way to do this + if(!possible_runes.len) + return + entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in possible_runes + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) + return + for(var/T in typesof(/obj/effect/rune)) + var/obj/effect/rune/R = T + if(initial(R.cultist_name) == entered_rune_name) + rune_to_scribe = R + if(initial(R.req_keyword)) + var/the_keyword = stripped_input(usr, "Please enter a keyword for the rune.", "Enter Keyword", "") + if(!the_keyword) return - if(chosen_rune == "none") - to_chat(user, "\red You decide against scribing a rune, perhaps you should take this time to study your notes.") + chosen_keyword = the_keyword + break + if(!rune_to_scribe) + return + runeturf = get_turf(user) //we may have moved. adjust as needed... + if(locate(/obj/effect/rune) in runeturf) + to_chat(user, "There is already a rune here.") + return + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) + return + if(ispath(rune_to_scribe, /obj/effect/rune/narsie) || ispath(rune_to_scribe, /obj/effect/rune/slaughter))//may need to change this - Fethas + + if(ticker.mode.name == "cult") + if(!canbypass == 1)//not an admin-tome, check things + var/datum/game_mode/cult/cult_mode = ticker.mode + if(!("eldergod" in cult_mode.objectives) || !("slughter" in cult_mode.objectives)) + to_chat(user, "[cult_mode.cultdat.entity_name]'s power does not wish to be unleashed!") return - if(chosen_rune == "teleport") - dictionary[chosen_rune] += input ("Choose a destination word") in english - if(chosen_rune == "teleport other") - dictionary[chosen_rune] += input ("Choose a destination word") in english - - if(usr.get_active_hand() != src) - return - - for(var/mob/V in viewers(src)) - V.show_message("\red [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "\red You hear chanting.", 2) - to_chat(user, "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world.") - user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage - if(do_after(user, 50, target = user)) - if(usr.get_active_hand() != src) + if(!cult_mode.narsie_condition_cleared) + to_chat(user, "There is still more to do before unleashing [cult_mode.cultdat.entity_name] power!") return - var/mob/living/carbon/human/H = user - var/obj/effect/rune/R = new /obj/effect/rune(user.loc) - to_chat(user, "\red You finish drawing the arcane markings of the Geometer.") - var/list/required = dictionary[chosen_rune] - R.word1 = english[required[1]] - R.word2 = english[required[2]] - R.word3 = english[required[3]] - R.check_icon() - R.blood_DNA = list() - R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type - R.add_hiddenprint(H) - return - else - to_chat(user, "The book seems full of illegible scribbles. Is this a joke?") - return - - attackby(obj/item/weapon/tome/T as obj, mob/living/user as mob, params) - if(istype(T, /obj/item/weapon/tome)) // sanity check to prevent a runtime error - switch(alert("Copy the runes from your tome?",,"Copy", "Cancel")) - if("cancel") + if(!cult_mode.eldergod) + to_chat(user, "\"I am already here. There is no need to try to summon me now.\"") return - // var/list/nearby = viewers(1,src) //- Fuck this as well. No clue why this doesnt work. -K0000 - // if(T.loc != user) - // return - // for(var/mob/M in nearby) - // if(M == user) - for(var/entry in words) - words[entry] = T.words[entry] - to_chat(user, "You copy the translation notes from your tome.") - - - examine(mob/user) - if(!iscultist(user)) - to_chat(user, "An old, dusty tome with frayed edges and a sinister looking cover.") - else - to_chat(user, "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though.") - -/obj/item/weapon/tome/imbued //admin tome, spawns working runes without waiting - w_class = 2 - var/cultistsonly = 1 - attack_self(mob/user as mob) - if(src.cultistsonly && !iscultist(usr)) - return - if(!cultwords["travel"]) - runerandom() - if(user) - var/r - if(!istype(user.loc,/turf)) - to_chat(user, "\red You do not have enough space to write a proper rune.") - var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun") - r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable. - var/obj/effect/rune/R = new /obj/effect/rune - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - R.blood_DNA = list() - R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type - switch(r) - if("teleport") - var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") - var/beacon - if(usr) - beacon = input("Select the last rune", "Rune Scribing") in words - R.word1=cultwords["travel"] - R.word2=cultwords["self"] - R.word3=beacon - R.loc = user.loc - R.check_icon() - if("itemport") - var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") - var/beacon - if(usr) - beacon = input("Select the last rune", "Rune Scribing") in words - R.word1=cultwords["travel"] - R.word2=cultwords["other"] - R.word3=beacon - R.loc = user.loc - R.check_icon() - if("tome") - R.word1=cultwords["see"] - R.word2=cultwords["blood"] - R.word3=cultwords["hell"] - R.loc = user.loc - R.check_icon() - if("armor") - R.word1=cultwords["hell"] - R.word2=cultwords["destroy"] - R.word3=cultwords["other"] - R.loc = user.loc - R.check_icon() - if("convert") - R.word1=cultwords["join"] - R.word2=cultwords["blood"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("tear in reality") - R.word1=cultwords["hell"] - R.word2=cultwords["join"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("emp") - R.word1=cultwords["destroy"] - R.word2=cultwords["see"] - R.word3=cultwords["technology"] - R.loc = user.loc - R.check_icon() - if("drain") - R.word1=cultwords["travel"] - R.word2=cultwords["blood"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("seer") - R.word1=cultwords["see"] - R.word2=cultwords["hell"] - R.word3=cultwords["join"] - R.loc = user.loc - R.check_icon() - if("raise") - R.word1=cultwords["blood"] - R.word2=cultwords["join"] - R.word3=cultwords["hell"] - R.loc = user.loc - R.check_icon() - if("obscure") - R.word1=cultwords["hide"] - R.word2=cultwords["see"] - R.word3=cultwords["blood"] - R.loc = user.loc - R.check_icon() - if("astral journey") - R.word1=cultwords["hell"] - R.word2=cultwords["travel"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("manifest") - R.word1=cultwords["blood"] - R.word2=cultwords["see"] - R.word3=cultwords["travel"] - R.loc = user.loc - R.check_icon() - if("imbue talisman") - R.word1=cultwords["hell"] - R.word2=cultwords["technology"] - R.word3=cultwords["join"] - R.loc = user.loc - R.check_icon() - if("sacrifice") - R.word1=cultwords["hell"] - R.word2=cultwords["blood"] - R.word3=cultwords["join"] - R.loc = user.loc - R.check_icon() - if("reveal") - R.word1=cultwords["blood"] - R.word2=cultwords["see"] - R.word3=cultwords["hide"] - R.loc = user.loc - R.check_icon() - if("wall") - R.word1=cultwords["destroy"] - R.word2=cultwords["travel"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("freedom") - R.word1=cultwords["travel"] - R.word2=cultwords["technology"] - R.word3=cultwords["other"] - R.loc = user.loc - R.check_icon() - if("cultsummon") - R.word1=cultwords["join"] - R.word2=cultwords["other"] - R.word3=cultwords["self"] - R.loc = user.loc - R.check_icon() - if("deafen") - R.word1=cultwords["hide"] - R.word2=cultwords["other"] - R.word3=cultwords["see"] - R.loc = user.loc - R.check_icon() - if("blind") - R.word1=cultwords["destroy"] - R.word2=cultwords["see"] - R.word3=cultwords["other"] - R.loc = user.loc - R.check_icon() - if("bloodboil") - R.word1=cultwords["destroy"] - R.word2=cultwords["see"] - R.word3=cultwords["blood"] - R.loc = user.loc - R.check_icon() - if("communicate") - R.word1=cultwords["self"] - R.word2=cultwords["other"] - R.word3=cultwords["technology"] - R.loc = user.loc - R.check_icon() - if("stun") - R.word1=cultwords["join"] - R.word2=cultwords["hide"] - R.word3=cultwords["technology"] - R.loc = user.loc - R.check_icon() + if(cult_mode.demons_summoned) + to_chat(user, "\"We are already here. There is no need to try to summon us now.\"") + return + var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No") + if(confirm_final == "No") + to_chat(user, "You decide to prepare further before scribing the rune.") + return + command_announcement.Announce("Figments from an eldritch god are being summoned somwhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg') + for(var/B in spiral_range_turfs(1, user, 1)) + var/turf/T = B + var/obj/machinery/shield/N = new(T) + N.name = "Rune-Scriber's Shield" + N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual" + N.icon_state = "shield-cult" + N.health = 60 + shields |= N + var/mob/living/carbon/human/H = user + var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") + var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone)) + user.visible_message("[user] cuts open their \the [affecting] and begins writing in their own blood!", "You slice open your [affecting] and begin drawing a sigil of [ticker.mode.cultdat.entity_title3].") + user.apply_damage(initial(rune_to_scribe.scribe_damage), ticker.mode.cultdat.dam_type, affecting) + if(!do_after(user, initial(rune_to_scribe.scribe_delay)-scribereduct, target = get_turf(user))) + for(var/V in shields) + var/obj/machinery/shield/S = V + if(S && !qdeleted(S)) + qdel(S) + return + if(locate(/obj/effect/rune) in runeturf) + to_chat(user, "There is already a rune here.") + return + user.visible_message("[user] creates a strange circle in their own blood.", \ + "You finish drawing the arcane markings of [ticker.mode.cultdat.entity_title3].") + for(var/V in shields) + var/obj/machinery/shield/S = V + if(S && !qdeleted(S)) + qdel(S) + var/obj/effect/rune/R = new rune_to_scribe(runeturf, chosen_keyword) + R.blood_DNA = list() + R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type + R.add_hiddenprint(H) + to_chat(user, "The [lowertext(initial(rune_to_scribe.cultist_name))] rune [initial(rune_to_scribe.cultist_desc)]") diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 7ad1e33b747..df8fb734d1b 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -1,1043 +1,955 @@ -var/list/sacrificed = list() +/var/list/sacrificed = list() +var/list/non_revealed_runes = (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed) - -/////////////////////////////////////////FIRST RUNE -/obj/effect/rune/proc/teleportRune() - return teleport(src.word3) - -/obj/effect/rune/proc/teleport(var/key) - var/mob/living/user = usr - var/allrunesloc[] - allrunesloc = new/list() - var/index = 0 -// var/tempnum = 0 - for(var/obj/effect/rune/R in world) - if(R == src) - continue - if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && R.z != 2) - index++ - allrunesloc.len = index - allrunesloc[index] = R.loc - if(index >= 5) - to_chat(user, "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric") - if(istype(user, /mob/living)) - user.take_overall_damage(5, 0) - qdel(src) - if(allrunesloc && index != 0) - if(istype(src,/obj/effect/rune)) - user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting - else - user.whisper("Sas[pick("'","`")]so c'arta forbici!") - user.visible_message("\red [user] disappears in a flash of red light!", \ - "\red You feel as your body gets dragged through the dimension of Nar-Sie!", \ - "\red You hear a sickening crunch and sloshing of viscera.") - user.loc = allrunesloc[rand(1,index)] - return - if(istype(src,/obj/effect/rune)) - return fizzle() //Use friggin manuals, Dorf, your list was of zero length. - else - call(/obj/effect/rune/proc/fizzle)() - return - -/obj/effect/rune/proc/itemportRune() - return itemport(src.word3) -/obj/effect/rune/proc/itemport(var/key) -// var/allrunesloc[] -// allrunesloc = new/list() -// var/index = 0 -// var/tempnum = 0 - var/culcount = 0 - var/runecount = 0 - var/obj/effect/rune/IP = null - var/mob/living/user = usr - for(var/obj/effect/rune/R in world) - if(R == src) - continue - if(R.word1 == cultwords["travel"] && R.word2 == cultwords["other"] && R.word3 == key) - IP = R - runecount++ - if(runecount >= 2) - to_chat(user, "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric") - if(istype(user, /mob/living)) - user.take_overall_damage(5, 0) - qdel(src) - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - culcount++ - if(culcount>=3) - user.say("Sas[pick("'","`")]so c'arta forbici tarem!") - user.visible_message("\red You feel air moving from the rune - like as it was swapped with somewhere else.", \ - "\red You feel air moving from the rune - like as it was swapped with somewhere else.", \ - "\red You smell ozone.") - for(var/obj/O in src.loc) - if(!O.anchored) - O.loc = IP.loc - for(var/mob/M in src.loc) - M.loc = IP.loc - return - - return fizzle() - - -/////////////////////////////////////////SECOND RUNE - -/obj/effect/rune/proc/tomesummon() - if(istype(src,/obj/effect/rune)) - usr.say("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!") - else - usr.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!") - usr.visible_message("\red Rune disappears with a flash of red light, and in its place now a book lies.", \ - "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \ - "\red You hear a pop and smell ozone.") - if(istype(src,/obj/effect/rune)) - new /obj/item/weapon/tome(src.loc) - else - new /obj/item/weapon/tome(usr.loc) - qdel(src) - return - - - -/////////////////////////////////////////THIRD RUNE - -/obj/effect/rune/proc/convert() - for(var/mob/living/carbon/M in src.loc) - if(iscultist(M)) - continue - if(M.stat==2) - continue - usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!") - M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \ - "\red AAAAAAHHHH!.", \ - "\red You hear an anguished scream.") - cult_log("[key_name_admin(usr)] tried to convert [key_name_admin(M)]") - if(is_convertable_to_cult(M.mind)) - ticker.mode.add_cultist(M.mind) - M.mind.special_role = "Cultist" - to_chat(M, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") - to_chat(M, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") - return 1 - else - to_chat(M, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") - to_chat(M, "And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs.") - return 0 - - return fizzle() - - - -/////////////////////////////////////////FOURTH RUNE - -/obj/effect/rune/proc/tearreality() - var/cultist_count = 0 - for(var/mob/M in range(1,src)) - if(iscultist(M) && !M.stat) - M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!") - cultist_count += 1 - if(cultist_count >= 9) - cult_log("THE CULT HAS SUMMONED NAR'SIE. GGNORE") - new /obj/singularity/narsie/large(src.loc) - if(ticker.mode.name == "cult") - ticker.mode:eldergod = 0 - return - else - return fizzle() - -/////////////////////////////////////////FIFTH RUNE -/obj/effect/rune/proc/empRune() - emp(src.loc,3) - -/obj/effect/rune/proc/emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist - if(istype(src,/obj/effect/rune)) - usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!") - else - usr.whisper("Ta'gh fara[pick("'","`")]qha fel d'amar det!") - playsound(U, 'sound/items/Welder2.ogg', 25, 1) - var/turf/T = get_turf(U) - if(T) - T.hotspot_expose(700,125) - var/rune = src // detaching the proc - in theory - empulse(U, (range_red - 2), range_red) - qdel(rune) - return - -/////////////////////////////////////////SIXTH RUNE - -/obj/effect/rune/proc/drain() - var/drain = 0 - for(var/obj/effect/rune/R in world) - if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"]) - for(var/mob/living/carbon/D in R.loc) - if(D.stat!=2) - cult_log("[key_name_admin(usr)] has drained blood from [key_name_admin(D)]") - var/bdrain = rand(1,25) - to_chat(D, "\red You feel weakened.") - D.take_overall_damage(bdrain, 0) - drain += bdrain - if(!drain) - return fizzle() - usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!") - usr.visible_message("\red Blood flows from the rune into [usr]!", \ - "\red The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \ - "\red You hear a liquid flowing.") - var/mob/living/user = usr - if(user.bhunger) - user.bhunger = max(user.bhunger-2*drain,0) - if(drain>=50) - user.visible_message("\red [user]'s eyes give off eerie red glow!", \ - "\red ...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \ - "\red You hear a heartbeat.") - user.bhunger += drain - src = user - spawn() - for(,user.bhunger>0,user.bhunger--) - sleep(50) - user.take_overall_damage(3, 0) - return - user.heal_organ_damage(drain%5, 0) - drain-=drain%5 - for(,drain>0,drain-=5) - sleep(2) - user.heal_organ_damage(5, 0) - return - - - - - - -/////////////////////////////////////////SEVENTH RUNE - -/obj/effect/rune/proc/seer() - if(usr.loc==src.loc) - if(usr.seer==1) - usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium viortia.") - to_chat(usr, "\red The world beyond fades from your vision.") - usr.see_invisible = SEE_INVISIBLE_LIVING - usr.seer = 0 - else if(usr.see_invisible!=SEE_INVISIBLE_LIVING) - to_chat(usr, "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision.") - usr.see_invisible = SEE_INVISIBLE_OBSERVER - usr.seer = 0 - else - usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!") - to_chat(usr, "\red The world beyond opens to your eyes.") - usr.see_invisible = SEE_INVISIBLE_OBSERVER - usr.seer = 1 - return - return fizzle() - -/////////////////////////////////////////EIGHTH RUNE - -/obj/effect/rune/proc/raise() - var/mob/living/carbon/human/corpse_to_raise - var/mob/living/carbon/human/body_to_sacrifice - - var/is_sacrifice_target = 0 - for(var/mob/living/carbon/human/M in src.loc) - if(M.stat == DEAD) - if(ticker.mode.name == "cult" && M.mind == ticker.mode:sacrifice_target) - is_sacrifice_target = 1 - else - corpse_to_raise = M - if(M.key) - M.ghostize(1) //kick them out of their body - break - if(!corpse_to_raise) - if(is_sacrifice_target) - to_chat(usr, "\red The Geometer of blood wants this mortal for himself.") - return fizzle() - - - is_sacrifice_target = 0 - find_sacrifice: - for(var/obj/effect/rune/R in world) - if(R.word1==cultwords["blood"] && R.word2==cultwords["join"] && R.word3==cultwords["hell"]) - for(var/mob/living/carbon/human/N in R.loc) - if(ticker.mode.name == "cult" && N.mind && N.mind == ticker.mode:sacrifice_target) - is_sacrifice_target = 1 - else - if(N.stat!= DEAD) - body_to_sacrifice = N - break find_sacrifice - - if(!body_to_sacrifice) - if(is_sacrifice_target) - to_chat(usr, "\red The Geometer of blood wants that corpse for himself.") - else - to_chat(usr, "\red The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used.") - return fizzle() - - var/mob/dead/observer/ghost - for(var/mob/dead/observer/O in loc) - if(!O.client) continue - if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue - ghost = O - break - - if(!ghost) - to_chat(usr, "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie.") - return fizzle() - - corpse_to_raise.revive() - - corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed) - //This means, should that player leave the body, the original may re-enter - usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!") - corpse_to_raise.visible_message("\red [corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \ - "\red Life... I'm alive again...", \ - "\red You hear a faint, slightly familiar whisper.") - body_to_sacrifice.visible_message("\red [body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \ - "\red You feel as your blood boils, tearing you apart.", \ - "\red You hear a thousand voices, all crying in pain.") - body_to_sacrifice.gib() - -// if(ticker.mode.name == "cult") -// ticker.mode:add_cultist(corpse_to_raise.mind) -// else -// ticker.mode.cult |= corpse_to_raise.mind - - to_chat(corpse_to_raise, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") - to_chat(corpse_to_raise, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") - return - - - - - -/////////////////////////////////////////NINETH RUNE - -/obj/effect/rune/proc/obscureRune() - return obscure(4) -/obj/effect/rune/proc/obscure(var/rad) - var/S=0 - for(var/obj/effect/rune/R in orange(rad,src)) - if(R!=src) - R.invisibility=INVISIBILITY_OBSERVER - S=1 - if(S) - if(istype(src,/obj/effect/rune)) - usr.say("Kla[pick("'","`")]atu barada nikt'o!") - for(var/mob/V in viewers(src)) - V.show_message("\red The rune turns into gray dust, veiling the surrounding runes.", 3) - qdel(src) - else - usr.whisper("Kla[pick("'","`")]atu barada nikt'o!") - to_chat(usr, "\red Your talisman turns into gray dust, veiling the surrounding runes.") - for(var/mob/V in orange(1,src)) - if(V!=usr) - V.show_message("\red Dust emanates from [usr]'s hands for a moment.", 3) - - return - if(istype(src,/obj/effect/rune)) - return fizzle() - else - call(/obj/effect/rune/proc/fizzle)() - return - -/////////////////////////////////////////TENTH RUNE - -/obj/effect/rune/proc/ajourney() //some bits copypastaed from admin tools - Urist - if(usr.loc==src.loc) - var/mob/living/carbon/human/L = usr - usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!") - usr.visible_message("\red [usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \ - "\red The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \ - "\red You hear only complete silence for a moment.") - usr.ghostize(1) - L.ajourn = 1 - while(L) - if(L.key) - L.ajourn=0 - return - else - L.take_organ_damage(10, 0) - sleep(100) - return fizzle() - - - - -/////////////////////////////////////////ELEVENTH RUNE - -/obj/effect/rune/proc/manifest() - var/obj/effect/rune/this_rune = src - src = null - if(usr.loc!=this_rune.loc) - return this_rune.fizzle() - var/mob/dead/observer/ghost - for(var/mob/dead/observer/O in this_rune.loc) - if(!O.client) continue - if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue - ghost = O - break - if(!ghost) - return this_rune.fizzle() - if(jobban_isbanned(ghost, ROLE_CULTIST) || jobban_isbanned(ghost,"Syndicate")) - return this_rune.fizzle() - - usr.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!") - var/mob/living/carbon/human/dummy/D = new(this_rune.loc) - usr.visible_message("\red A shape forms in the center of the rune. A shape of... a man.", \ - "\red A shape forms in the center of the rune. A shape of... a man.", \ - "\red You hear liquid flowing.") - D.real_name = "Unknown" - var/chose_name = 0 - for(var/obj/item/weapon/paper/P in this_rune.loc) - if(P.info) - D.real_name = copytext(P.info, findtext(P.info,">")+1, findtext(P.info,"<",2) ) - chose_name = 1 - break - if(!chose_name) - D.real_name = "[pick(first_names_male)] [pick(last_names)]" - D.universal_speak = 1 - D.status_flags &= ~GODMODE - - D.key = ghost.key - - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(D.mind) - else - ticker.mode.cult+=D.mind - - D.mind.special_role = "Cultist" - to_chat(D, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.") - to_chat(D, "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.") - - var/mob/living/user = usr - while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc) - user.take_organ_damage(1, 0) - sleep(30) - if(D) - D.visible_message("\red [D] slowly dissipates into dust and bones.", \ - "\red You feel pain, as bonds formed between your soul and this homunculus break.", \ - "\red You hear faint rustle.") - D.dust() - return - - - - - -/////////////////////////////////////////TWELFTH RUNE - -/obj/effect/rune/proc/talisman()//only hide, emp, teleport, deafen, blind and tome runes can be imbued atm - var/obj/item/weapon/paper/newtalisman - var/unsuitable_newtalisman = 0 - for(var/obj/item/weapon/paper/P in src.loc) - if(!P.info) - newtalisman = P - break - else - unsuitable_newtalisman = 1 - if(!newtalisman) - if(unsuitable_newtalisman) - to_chat(usr, "\red The blank is tainted. It is unsuitable.") - return fizzle() - - var/obj/effect/rune/imbued_from - var/obj/item/weapon/paper/talisman/T - for(var/obj/effect/rune/R in orange(1,src)) - if(R==src) - continue - if(R.word1==cultwords["travel"] && R.word2==cultwords["self"]) //teleport - T = new(src.loc) - T.imbue = "[R.word3]" - T.info = "[R.word3]" - imbued_from = R - break - if(R.word1==cultwords["see"] && R.word2==cultwords["blood"] && R.word3==cultwords["hell"]) //tome - T = new(src.loc) - T.imbue = "newtome" - imbued_from = R - break - if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["technology"]) //emp - T = new(src.loc) - T.imbue = "emp" - imbued_from = R - break - if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["destroy"]) //conceal - T = new(src.loc) - T.imbue = "conceal" - imbued_from = R - break - if(R.word1==cultwords["hell"] && R.word2==cultwords["destroy"] && R.word3==cultwords["other"]) //armor - T = new(src.loc) - T.imbue = "armor" - imbued_from = R - break - if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["hide"]) //reveal - T = new(src.loc) - T.imbue = "revealrunes" - imbued_from = R - break - if(R.word1==cultwords["hide"] && R.word2==cultwords["other"] && R.word3==cultwords["see"]) //deafen - T = new(src.loc) - T.imbue = "deafen" - imbued_from = R - break - if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["other"]) //blind - T = new(src.loc) - T.imbue = "blind" - imbued_from = R - break - if(R.word1==cultwords["self"] && R.word2==cultwords["other"] && R.word3==cultwords["technology"]) //communicate - T = new(src.loc) - T.imbue = "communicate" - imbued_from = R - break - if(R.word1==cultwords["join"] && R.word2==cultwords["hide"] && R.word3==cultwords["technology"]) //stun - T = new(src.loc) - T.imbue = "runestun" - imbued_from = R - break - if(imbued_from) - for(var/mob/V in viewers(src)) - V.show_message("\red The runes turn into dust, which then forms into an arcane image on the paper.", 3) - usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!") - qdel(imbued_from) - qdel(newtalisman) - else - return fizzle() - -/////////////////////////////////////////THIRTEENTH RUNE - -/obj/effect/rune/proc/mend() - var/mob/living/user = usr - src = null - user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!") - user.take_overall_damage(200, 0) - runedec+=10 - user.visible_message("\red [user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.", \ - "\red In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \ - "\red You hear faint rustle.") - for(,user.stat==2) - sleep(600) - if(!user) - return - runedec-=10 - return - - -/////////////////////////////////////////FOURTEETH RUNE - -// returns 0 if the rune is not used. returns 1 if the rune is used. -/obj/effect/rune/proc/communicate() - . = 1 // Default output is 1. If the rune is deleted it will return 1 - var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") - if(!input) - if(istype(src)) - fizzle() - return 0 - else - return 0 - - // record this - //cult_log("[key_name(usr,0)] says : [input]") - - - var/F = investigate_subject2file("cult") - if(!F) - return 0 - to_chat(F, "[time2text(world.timeofday,"hh:mm")] \ref[usr] ([usr.x],[usr.y],[usr.z]) || [usr] communicates: [input]
") - - var/obj/cult_viewpoint/vp = getCultViewpoint(usr) - if(!vp) - return 0 - - var/displayName = vp.get_display_name() - var/cultName = vp.get_cult_name() - - if(istype(src,/obj/effect/rune)) - usr.say("O bidai nabora se[pick("'","`")]sma!") - else - usr.whisper("O bidai nabora se[pick("'","`")]sma!") - - if(istype(src,/obj/effect/rune)) - usr.say("[input]") - else - usr.whisper("[input]") - - log_say("Cult Message: [key_name(usr)]: [input]") - for(var/datum/mind/H in ticker.mode.cult) - if(H.current) - to_chat(H.current, "[cultName]: [input]") - - for(var/mob/spirit/spirit in spirits) - to_chat(spirit, "[displayName]: [input]") - - - for(var/mob/dead/observer/G in player_list) - G.show_message("[displayName] ([cultName]) ([ghost_follow_link(usr, ghost=G)]): [input]") - - qdel(src) - return 1 - -/////////////////////////////////////////FIFTEENTH RUNE - -/obj/effect/rune/proc/sacrifice() - var/list/mob/living/carbon/human/cultsinrange = list() - var/list/mob/living/carbon/human/victims = list() - for(var/mob/living/carbon/human/V in src.loc)//Checks for non-cultist humans to sacrifice - if(ishuman(V)) - if(!(iscultist(V))) - victims += V//Checks for cult status and mob type - for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards - if(istype(I,/obj/item/organ/internal/brain)) - var/obj/item/organ/internal/brain/B = I - victims += B.brainmob - else if(istype(I,/obj/item/device/mmi)) - var/obj/item/device/mmi/B = I - victims += B.brainmob - else if(istype(I,/obj/item/device/aicard)) - for(var/mob/living/silicon/ai/A in I) - victims += A - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - cultsinrange += C - C.say("Barhah hra zar[pick("'","`")]garis!") - for(var/mob/H in victims) - if(ticker.mode.name == "cult") - if(H.mind == ticker.mode:sacrifice_target) - if(cultsinrange.len >= 3) - sacrificed += H.mind - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() - to_chat(usr, "\red The Geometer of Blood accepts this sacrifice, your objective is now complete.") - else - to_chat(usr, "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual.") - else - if(cultsinrange.len >= 3) - if(H.stat !=2) - if(prob(80)) - to_chat(usr, "\red The Geometer of Blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) - else - to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, this soul was not enough to gain His favor.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() - else - if(prob(40)) - to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) - else - to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() - else - if(H.stat !=2) - to_chat(usr, "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.") - else - if(prob(40)) - to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) - else - to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() - else - if(cultsinrange.len >= 3) - if(H.stat !=2) - if(prob(80)) - to_chat(usr, "\red The Geometer of Blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) - else - to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, this soul was not enough to gain His favor.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() - else - if(prob(40)) - to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) - else - to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() - else - if(H.stat !=2) - to_chat(usr, "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed.") - else - if(prob(40)) - to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - ticker.mode:grant_runeword(usr) - else - to_chat(usr, "\red The Geometer of blood accepts this sacrifice.") - to_chat(usr, "\red However, a mere dead body is not enough to satisfy Him.") - if(isrobot(H)) - H.dust()//To prevent the MMI from remaining - else - H.gib() - -/////////////////////////////////////////SIXTEENTH RUNE - -/obj/effect/rune/proc/revealrunesrune() - revealrunes(src) - -/obj/effect/rune/proc/revealrunes(var/obj/W as obj) - var/go=0 - var/rad - var/S=0 - if(istype(W,/obj/effect/rune)) - rad = 6 - go = 1 - if(istype(W,/obj/item/weapon/paper/talisman)) - rad = 4 - go = 1 - if(istype(W,/obj/item/weapon/storage/bible)) - rad = 1 - go = 1 - if(go) - for(var/obj/effect/rune/R in orange(rad,src)) - if(R!=src) - R:visibility=15 - S=1 - if(S) - if(istype(W,/obj/item/weapon/storage/bible)) - to_chat(usr, "\red Arcane markings suddenly glow from underneath a thin layer of dust!") - return - if(istype(W,/obj/effect/rune)) - usr.say("Nikt[pick("'","`")]o barada kla'atu!") - for(var/mob/V in viewers(src)) - V.show_message("\red The rune turns into red dust, reveaing the surrounding runes.", 3) - qdel(src) - return - if(istype(W,/obj/item/weapon/paper/talisman)) - usr.whisper("Nikt[pick("'","`")]o barada kla'atu!") - to_chat(usr, "\red Your talisman turns into red dust, revealing the surrounding runes.") - for(var/mob/V in orange(1,usr.loc)) - if(V!=usr) - V.show_message("\red Red dust emanates from [usr]'s hands for a moment.", 3) - return - return - if(istype(W,/obj/effect/rune)) - return fizzle() - if(istype(W,/obj/item/weapon/paper/talisman)) - call(/obj/effect/rune/proc/fizzle)() - return - -/////////////////////////////////////////SEVENTEENTH RUNE - -/obj/effect/rune/proc/wall() - usr.say("Khari[pick("'","`")]d! Eske'te tannin!") - src.density = !src.density - var/mob/living/user = usr - user.take_organ_damage(2, 0) - if(src.density) - to_chat(usr, "\red Your blood flows into the rune, and you feel that the very space over the rune thickens.") - else - to_chat(usr, "\red Your blood flows into the rune, and you feel as the rune releases its grasp on space.") - return - -/////////////////////////////////////////EIGHTTEENTH RUNE - -/obj/effect/rune/proc/freedom() - var/mob/living/user = usr - var/list/mob/living/carbon/cultists = new - for(var/datum/mind/H in ticker.mode.cult) - if(istype(H.current,/mob/living/carbon)) - cultists+=H.current - var/list/mob/living/carbon/users = new - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - users+=C - if(users.len>=3) - var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users) - if(!cultist) - return fizzle() - if(cultist == user) //just to be sure. - return - if(!(cultist.buckled || \ - cultist.handcuffed || \ - istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle) || \ - (istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) || \ - (istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \ - (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \ - )) - to_chat(user, "\red The [cultist] is already free.") - return - cultist.buckled = null - if(cultist.handcuffed) - cultist.handcuffed.loc = cultist.loc - cultist.handcuffed = null - cultist.update_handcuffed() - if(cultist.legcuffed) - cultist.legcuffed.loc = cultist.loc - cultist.legcuffed = null - cultist.update_inv_legcuffed() - if(istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle)) - cultist.unEquip(cultist.wear_mask) - if(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) - cultist.loc:welded = 0 - if(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) - cultist.loc:locked = 0 - if(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) - cultist.loc:locked = 0 - for(var/mob/living/carbon/C in users) - user.take_overall_damage(15, 0) - C.say("Khari[pick("'","`")]d! Gual'te nikka!") - qdel(src) - return fizzle() - -/////////////////////////////////////////NINETEENTH RUNE - -/obj/effect/rune/proc/cultsummon() - var/mob/living/user = usr - var/list/mob/living/carbon/cultists = new - for(var/datum/mind/H in ticker.mode.cult) - if(istype(H.current,/mob/living/carbon)) - cultists+=H.current - var/list/mob/living/carbon/users = new - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - users+=C - if(users.len>=3) - var/mob/living/carbon/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user) - if(!cultist) - return fizzle() - if(cultist == user) //just to be sure. - return - if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet))) - to_chat(user, "\red You cannot summon the [cultist], for his shackles of blood are strong") - return fizzle() - cultist.loc = src.loc - cultist.lying = 1 - cultist.regenerate_icons() - for(var/mob/living/carbon/human/C in orange(1,src)) - if(iscultist(C) && !C.stat) - C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!") - C.take_overall_damage(25, 0) - user.visible_message("\red Rune disappears with a flash of red light, and in its place now a body lies.", \ - "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \ - "\red You hear a pop and smell ozone.") - qdel(src) - return fizzle() - -/////////////////////////////////////////TWENTIETH RUNES - -/obj/effect/rune/proc/deafen() - if(istype(src,/obj/effect/rune)) - var/affected = 0 - for(var/mob/living/carbon/C in range(7,src)) - if(iscultist(C)) - continue - var/obj/item/weapon/nullrod/N = locate() in C - if(N) - continue - C.adjustEarDamage(0,50) - C.show_message("\red The world around you suddenly becomes quiet.", 3) - affected++ - if(prob(1)) - C.disabilities |= DEAF - if(affected) - usr.say("Sti[pick("'","`")] kaliedir!") - to_chat(usr, "\red The world becomes quiet as the deafening rune dissipates into fine dust.") - qdel(src) - else - return fizzle() - else - var/affected = 0 - for(var/mob/living/carbon/C in range(7,usr)) - if(iscultist(C)) - continue - var/obj/item/weapon/nullrod/N = locate() in C - if(N) - continue - C.adjustEarDamage(0,30) - //talismans is weaker. - C.show_message("\red The world around you suddenly becomes quiet.", 3) - affected++ - if(affected) - usr.whisper("Sti[pick("'","`")] kaliedir!") - to_chat(usr, "\red Your talisman turns into gray dust, deafening everyone around.") - for(var/mob/V in orange(1,src)) - if(!(iscultist(V))) - V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3) - return - -/obj/effect/rune/proc/blind() - if(istype(src,/obj/effect/rune)) - var/affected = 0 - for(var/mob/living/carbon/C in viewers(src)) - if(iscultist(C)) - continue - var/obj/item/weapon/nullrod/N = locate() in C - if(N) - continue - C.eye_blurry += 50 - C.eye_blind += 20 - if(prob(5)) - C.disabilities |= NEARSIGHTED - if(prob(10)) - C.disabilities |= BLIND - C.show_message("\red Suddenly you see red flash that blinds you.", 3) - affected++ - if(affected) - usr.say("Sti[pick("'","`")] kaliesin!") - to_chat(usr, "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust.") - qdel(src) - else - return fizzle() - else - var/affected = 0 - for(var/mob/living/carbon/C in view(2,usr)) - if(iscultist(C)) - continue - var/obj/item/weapon/nullrod/N = locate() in C - if(N) - continue - C.eye_blurry += 30 - C.eye_blind += 10 - //talismans is weaker. - affected++ - C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3) - if(affected) - usr.whisper("Sti[pick("'","`")] kaliesin!") - to_chat(usr, "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie.") - return - - -/obj/effect/rune/proc/bloodboil() //cultists need at least one DANGEROUS rune. Even if they're all stealthy. /* - var/list/mob/living/carbon/cultists = new - for(var/datum/mind/H in ticker.mode.cult) - if(istype(H.current,/mob/living/carbon)) - cultists+=H.current +This file contains runes. +Runes are used by the cult to cause many different effects and are paramount to their success. +They are drawn with an arcane tome in blood, and are distinguishable to cultists and normal crew by examining. +Fake runes can be drawn in crayon to fool people. +Runes can either be invoked by one's self or with many different cultists. Each rune has a specific incantation that the cultists will say when invoking it. +To draw a rune, use an arcane tome. */ - var/culcount = 0 //also, wording for it is old wording for obscure rune, which is now hide-see-blood. -// var/list/cultboil = list(cultists-usr) //and for this words are destroy-see-blood. - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - culcount++ - if(culcount>=3) - for(var/mob/living/carbon/M in viewers(usr)) - if(iscultist(M)) - continue - var/obj/item/weapon/nullrod/N = locate() in M - if(N) - continue - cult_log(": Blood Boil damaged [key_name_admin(M)].") - M.take_overall_damage(51,51) - to_chat(M, "\red Your blood boils!") - if(prob(5)) - spawn(5) - M.gib() - for(var/obj/effect/rune/R in view(src)) - if(prob(10)) - explosion(R.loc, -1, 0, 1, 5) - for(var/mob/living/carbon/human/C in orange(1,src)) - if(iscultist(C) && !C.stat) - C.say("Dedo ol[pick("'","`")]btoh!") - C.take_overall_damage(15, 0) + +/obj/effect/rune + name = "rune" + var/cultist_name = "basic rune" + desc = "An odd collection of symbols drawn in what seems to be blood." + var/cultist_desc = "a basic rune with no function." //This is shown to cultists who examine the rune in order to determine its true purpose. + anchored = 1 + icon = 'icons/obj/rune.dmi' + icon_state = "1" + var/visibility = 0 + var/view_range = 7 + unacidable = 1 + layer = TURF_LAYER + + var/invocation = "Aiy ele-mayo!" //This is said by cultists when the rune is invoked. + var/req_cultists = 1 //The amount of cultists required around the rune to invoke it. If only 1, any cultist can invoke it. + var/rune_in_use = 0 // Used for some runes, this is for when you want a rune to not be usable when in use. + + var/scribe_delay = 50 //how long the rune takes to create + var/scribe_damage = 0.1 //how much damage you take doing it + + var/allow_excess_invokers = 0 //if we allow excess invokers when being invoked + var/construct_invoke = 1 //if constructs can invoke it + + var/req_keyword = 0 //If the rune requires a keyword - go figure amirite + var/keyword //The actual keyword for the rune + + +/obj/effect/rune/New(loc, set_keyword) + ..() + if(set_keyword) + keyword = set_keyword + check_icon() + var/image/blood = image(loc = src) + blood.override = 1 + for(var/mob/living/silicon/ai/AI in player_list) + AI.client.images += blood + +/obj/effect/rune/examine(mob/user) + ..() + if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects + to_chat(user, "Name: [cultist_name]") + to_chat(user, "Effects: [capitalize(cultist_desc)]") + to_chat(user, "Required Acolytes: [req_cultists]") + if(req_keyword && keyword) + to_chat(user, "Keyword: [keyword]") + +/obj/effect/rune/attackby(obj/I, mob/user, params) + if(istype(I, /obj/item/weapon/tome) && iscultist(user)) + to_chat(user, "You carefully erase the [lowertext(cultist_name)] rune.") qdel(src) - else - return fizzle() - return - -// WIP rune, I'll wait for Rastaf0 to add limited blood. - -/obj/effect/rune/proc/burningblood() - var/culcount = 0 - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - culcount++ - if(culcount >= 5) - for(var/obj/effect/rune/R in world) - if(R.blood_DNA == src.blood_DNA) - for(var/mob/living/M in orange(2,R)) - M.take_overall_damage(0,15) - if(R.invisibility>M.see_invisible) - to_chat(M, "\red Aargh it burns!") - else - to_chat(M, "\red Rune suddenly ignites, burning you!") - var/turf/T = get_turf(R) - T.hotspot_expose(700,125) - for(var/obj/effect/decal/cleanable/blood/B in world) - if(B.blood_DNA == src.blood_DNA) - for(var/mob/living/M in orange(1,B)) - M.take_overall_damage(0,5) - to_chat(M, "\red Blood suddenly ignites, burning you!") - var/turf/T = get_turf(B) - T.hotspot_expose(700,125) - qdel(B) + return + else if(istype(I, /obj/item/weapon/nullrod)) + if(iscultist(user))//cultist..what are doing..cultist..staph... + user.drop_item() + user.visible_message("[I] suddenly glows with white light, forcing [user] to drop it in pain!", \ + "[I] suddenly glows with a white light that sears your hand, forcing you to drop it!") + return + to_chat(user,"You disrupt the magic of [src] with [I].") qdel(src) - -////////// Rune 24 (counting burningblood, which kinda doesnt work yet.) - -/obj/effect/rune/proc/runestun(var/mob/living/T as mob) - if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around. - usr.say("Fuu ma[pick("'","`")]jin!") - for(var/mob/living/L in viewers(src)) - - if(iscarbon(L)) - var/mob/living/carbon/C = L - C.flash_eyes() - if(C.stuttering < 1 && (!(HULK in C.mutations))) - C.stuttering = 1 - C.Weaken(1) - C.Stun(1) - C.show_message("\red The rune explodes in a bright flash.", 3) - - else if(issilicon(L)) - var/mob/living/silicon/S = L - S.Weaken(5) - S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3) - qdel(src) - else ///When invoked as talisman, stun and mute the target mob. - usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!") - var/obj/item/weapon/nullrod/N = locate() in T - if(N) - for(var/mob/O in viewers(T, null)) - O.show_message(text("\red [] invokes a talisman at [], but they are unaffected!", usr, T), 1) - else - for(var/mob/O in viewers(T, null)) - O.show_message(text("\red [] invokes a talisman at []", usr, T), 1) - - if(issilicon(T)) - T.Weaken(10) - - else if(iscarbon(T)) - var/mob/living/carbon/C = T - C.flash_eyes() - if(!(HULK in C.mutations)) - C.silent += 15 - C.Weaken(10) - C.Stun(10) return -/////////////////////////////////////////TWENTY-FIFTH RUNE - -/obj/effect/rune/proc/armor() - var/mob/living/carbon/human/user = usr - if(istype(src,/obj/effect/rune)) - usr.say("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") +/obj/effect/rune/attack_hand(mob/living/user) + if(!iscultist(user)) + to_chat(user, "You aren't able to understand the words of [src].") + return + var/list/invokers = can_invoke(user) + if(invokers.len >= req_cultists) + invoke(invokers) else - usr.whisper("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!") - usr.visible_message("\red The rune disappears with a flash of red light, and a set of armor appears on [usr]...", \ - "\red You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.") + fail_invoke(user) - user.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), slot_wear_suit) - user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(user), slot_shoes) - user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back) - //the above update their overlay icons cache but do not call update_icons() - //the below calls update_icons() at the end, which will update overlay icons by using the (now updated) cache - user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) //put in hands or on floor +/obj/effect/rune/attack_animal(mob/living/simple_animal/M) + if(istype(M, /mob/living/simple_animal/shade) || istype(M, /mob/living/simple_animal/hostile/construct)) + if(construct_invoke || !iscultist(M)) //if you're not a cult construct we want the normal fail message + attack_hand(M) + else + to_chat(M, "You are unable to invoke the rune!") + +/obj/effect/rune/proc/talismanhide() //for talisman of revealing/hiding + visible_message("[src] fades away.") + invisibility = INVISIBILITY_OBSERVER + alpha = 100 //To help ghosts distinguish hidden runes + +/obj/effect/rune/proc/talismanreveal() //for talisman of revealing/hiding + invisibility = 0 + visible_message("[src] suddenly appears!") + alpha = initial(alpha) + +/obj/effect/rune/proc/talismanfake() //for rune disguising + var/runenum = pick(1,2,3,4,5,6) + visible_message("[src] takes on a waxy apperance!") + icon = 'icons/effects/crayondecal.dmi' + icon_state = "rune[runenum]" + color = rgb(255, 0, 0) + +/* +There are a few different procs each rune runs through when a cultist activates it. +can_invoke() is called when a cultist activates the rune with an empty hand. If there are multiple cultists, this rune determines if the required amount is nearby. +invoke() is the rune's actual effects. +fail_invoke() is called when the rune fails, via not enough people around or otherwise. Typically this just has a generic 'fizzle' effect. +structure_check() searches for nearby cultist structures required for the invocation. Proper structures are pylons, forges, archives, and altars. +*/ + +/obj/effect/rune/proc/can_invoke(var/mob/living/user) + //This proc determines if the rune can be invoked at the time. If there are multiple required cultists, it will find all nearby cultists. + var/list/invokers = list() //people eligible to invoke the rune + var/list/chanters = list() //people who will actually chant the rune when passed to invoke() + chanters |= user + invokers |= user + if(req_cultists > 1 || allow_excess_invokers) + for(var/mob/living/L in range(1, src)) + if(iscultist(L)) + if(L == user) + continue + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if((H.disabilities & MUTE) || H.silent) + continue + if(L.stat) + continue + invokers |= L + if(invokers.len >= req_cultists) + if(allow_excess_invokers) + chanters |= invokers + else + invokers -= user + shuffle(invokers) + for(var/i in 0 to req_cultists) + var/L = pick_n_take(invokers) + chanters |= L + return chanters + +/obj/effect/rune/proc/invoke(var/list/invokers) + //This proc contains the effects of the rune as well as things that happen afterwards. If you want it to spawn an object and then delete itself, have both here. + if(invocation) + for(var/M in invokers) + var/mob/living/L = M + L.say(invocation) + var/oldtransform = transform + spawn(0) //animate is a delay, we want to avoid being delayed + animate(transform = matrix()*2, alpha = 0, time = 5) //fade out + animate(transform = oldtransform, alpha = 255, time = 0) + +/obj/effect/rune/proc/fail_invoke(var/mob/living/user) + //This proc contains the effects of a rune if it is not invoked correctly, through either invalid wording or not enough cultists. By default, it's just a basic fizzle. + visible_message("The markings pulse with a small flash of red light, then fall dark.") + spawn(0) //animate is a delay, we want to avoid being delayed + animate(src, color = rgb(255, 0, 0), time = 0) + animate(src, color = initial(color), time = 5) + +//Malformed Rune: This forms if a rune is not drawn correctly. Invoking it does nothing but hurt the user. +/obj/effect/rune/malformed + cultist_name = "malformed rune" + cultist_desc = "a senseless rune written in gibberish. No good can come from invoking this." + invocation = "Ra'sha yoka!" + +/obj/effect/rune/malformed/invoke(var/list/invokers) + ..() + for(var/M in invokers) + var/mob/living/L = M + to_chat(M, "You feel your life force draining. [ticker.mode.cultdat.entity_title3] is displeased.") + L.apply_damage(30, BRUTE) qdel(src) + +/mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes + var/obj/item/weapon/nullrod/N = locate() in src + if(N) + return N + return 0 + +//Rite of Binding: A paper on top of the rune to a talisman. +/obj/effect/rune/imbue + cultist_name = "Rite of Binding" + cultist_desc = "transforms paper into powerful magic talismans." + invocation = "H'drak v'loso, mir'kanas verbot!" + icon_state = "3" + +/obj/effect/rune/imbue/invoke(var/list/invokers) + var/mob/living/user = invokers[1] //the first invoker is always the user + var/turf/T = get_turf(src) + var/list/papers_on_rune = list() + var/entered_talisman_name + var/obj/item/weapon/paper/talisman/talisman_type + var/list/possible_talismans = list() + for(var/obj/item/weapon/paper/P in T) + if(!P.info) + papers_on_rune.Add(P) + if(!papers_on_rune.len) + to_chat(user, "There must be a blank paper on top of [src]!") + fail_invoke() + log_game("Talisman Creation rune failed - no blank papers on rune") + return + if(rune_in_use) + to_chat(user, "[src] can only support one ritual at a time!") + fail_invoke() + log_game("Talisman Creation rune failed - already in use") + return + var/obj/item/weapon/paper/paper_to_imbue = pick(papers_on_rune) + for(var/I in subtypesof(/obj/item/weapon/paper/talisman) - /obj/item/weapon/paper/talisman/malformed - /obj/item/weapon/paper/talisman/supply - /obj/item/weapon/paper/talisman/supply/weak) + var/obj/item/weapon/paper/talisman/J = I + var/talisman_cult_name = initial(J.cultist_name) + if(talisman_cult_name) + possible_talismans[talisman_cult_name] = J //This is to allow the menu to let cultists select talismans by name + entered_talisman_name = input(user, "Choose a talisman to imbue.", "Talisman Choices") as null|anything in possible_talismans + talisman_type = possible_talismans[entered_talisman_name] + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || rune_in_use || !talisman_type) + return + ..() + visible_message("Dark power begins to channel into the paper!.") + rune_in_use = 1 + if(!do_after(user, 100, target = get_turf(user))) + rune_in_use = 0 + return + new talisman_type(get_turf(src)) + visible_message("[src] glows with power, and bloody images form themselves on [paper_to_imbue].") + qdel(paper_to_imbue) + rune_in_use = 0 + +var/list/teleport_runes = list() +/obj/effect/rune/teleport + cultist_name = "Teleport" + cultist_desc = "warps everything above it to another chosen teleport rune." + invocation = "Sas'so c'arta forbici!" + icon_state = "2" + req_keyword = 1 + var/listkey + +/obj/effect/rune/teleport/New(loc, set_keyword) + ..() + var/area/A = get_area(src) + var/locname = initial(A.name) + listkey = set_keyword ? "[set_keyword] [locname]":"[locname]" + teleport_runes += src + +/obj/effect/rune/teleport/Destroy() + teleport_runes -= src + return ..() + +/obj/effect/rune/teleport/invoke(var/list/invokers) + var/mob/living/user = invokers[1] //the first invoker is always the user + var/list/potential_runes = list() + var/list/teleportnames = list() + var/list/duplicaterunecount = list() + for(var/R in teleport_runes) + var/obj/effect/rune/teleport/T = R + var/resultkey = T.listkey + if(resultkey in teleportnames) + duplicaterunecount[resultkey]++ + resultkey = "[resultkey] ([duplicaterunecount[resultkey]])" + else + teleportnames.Add(resultkey) + duplicaterunecount[resultkey] = 1 + if(T != src && (T.z <= MAX_Z)) + potential_runes[resultkey] = T + + if(!potential_runes.len) + to_chat(user, "There are no valid runes to teleport to!") + log_game("Teleport rune failed - no other teleport runes") + fail_invoke() + return + + if(user.z > MAX_Z) + to_chat(user, "You are not in the right dimension!") + log_game("Teleport rune failed - user in away mission") + fail_invoke() + return + + var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked + var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to? + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || !actual_selected_rune) + fail_invoke() + return + + var/turf/T = get_turf(src) + var/movedsomething = 0 + var/moveuserlater = 0 + for(var/atom/movable/A in T) + if(A == user) + moveuserlater = 1 + movedsomething = 1 + continue + if(!A.anchored) + movedsomething = 1 + A.forceMove(get_turf(actual_selected_rune)) + if(movedsomething) + ..() + visible_message("There is a sharp crack of inrushing air, and everything above the rune disappears!") + to_chat(user, "You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].") + if(moveuserlater) + user.forceMove(get_turf(actual_selected_rune)) + else + fail_invoke() + + +//Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby. +/obj/effect/rune/convert + cultist_name = "Rite of Enlightenment" + cultist_desc = "converts a normal crewmember on top of it to the cult. Does not work on loyalty-implanted crew." + invocation = "Mah'weyh pleggh at e'ntrath!" + icon_state = "3" + req_cultists = 2 + +/obj/effect/rune/convert/invoke(var/list/invokers) + var/list/convertees = list() + var/turf/T = get_turf(src) + for(var/mob/living/M in T.contents) + if(!iscultist(M) && !isloyal(M)) + convertees.Add(M) + if(!convertees.len) + fail_invoke() + log_game("Convert rune failed - no eligible convertees") + return + var/mob/living/new_cultist = pick(convertees) + if(!is_convertable_to_cult(new_cultist.mind) || new_cultist.null_rod_check()) + for(var/M in invokers) + to_chat(M, "Something is shielding [new_cultist]'s mind!") + if(is_sacrifice_target(new_cultist.mind)) + to_chat(M, "\"I desire this one for myself. SACRIFICE THEM!\"") + fail_invoke() + log_game("Convert rune failed - convertee could not be converted") + return + ..() + new_cultist.visible_message("[new_cultist] writhes in pain as the markings below them glow a bloody red!", \ + "AAAAAAAAAAAAAA-") + ticker.mode.add_cultist(new_cultist.mind, 1) + new /obj/item/weapon/tome(get_turf(src)) + new_cultist.mind.special_role = "Cultist" + to_chat(new_cultist, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \ + and something evil takes root.") + to_chat(new_cultist, "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve [ticker.mode.cultdat.entity_title3] above all else. Bring it back.\ + ") + +//Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body. +/obj/effect/rune/sacrifice + cultist_name = "Rite of Tribute" + cultist_desc = "sacrifices a crew member to your god. May place them into a soul shard if their spirit remains in their body." + icon_state = "3" + allow_excess_invokers = 1 + invocation = "Barhah hra zar'garis!" + rune_in_use = 0 + +/obj/effect/rune/sacrifice/New() + ..() + cultist_desc = "sacrifices a crew member to [ticker.mode.cultdat.entity_title3]. May place them into a soul shard if their spirit remains in their body." + +/obj/effect/rune/sacrifice/invoke(var/list/invokers) + if(rune_in_use) + return + rune_in_use = 1 + var/mob/living/user = invokers[1] //the first invoker is always the user + var/turf/T = get_turf(src) + var/list/possible_targets = list() + for(var/mob/living/M in T.contents) + if(M.mind) + if(M.mind in sacrificed) + continue + if(!iscultist(M)) + possible_targets.Add(M) + var/mob/offering + if(possible_targets.len > 1) //If there's more than one target, allow choice + offering = input(user, "Choose an offering to sacrifice.", "Unholy Tribute") as null|anything in possible_targets + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) + return + else if(possible_targets.len) //Otherwise, if there's a target at all, pick the only one + offering = possible_targets[possible_targets.len] + if(!offering) + rune_in_use = 0 + return + if(((ishuman(offering) || isrobot(offering)) && offering.stat != DEAD) || is_sacrifice_target(offering.mind)) //Requires three people to sacrifice living targets + if(invokers.len < 3) + for(var/M in invokers) + to_chat(M, "[offering] is too greatly linked to the world! You need three acolytes!") + fail_invoke() + log_game("Sacrifice rune failed - not enough acolytes and target is living") + rune_in_use = 0 + return + visible_message("[src] pulses blood red!") + color = rgb(126, 23, 23) + ..() + sac(invokers, offering) + color = initial(color) + +/obj/effect/rune/sacrifice/proc/sac(var/list/invokers, mob/living/T) + var/sacrifice_fulfilled + if(T) + if(istype(T, /mob/living/simple_animal/pet/corgi)) + for(var/M in invokers) + var/mob/living/L = M + to_chat(L, "\"Even I have standards, such as they are!\"") + if(L.reagents) + L.reagents.add_reagent("hell_water", 2) + if(T.mind) + sacrificed.Add(T.mind) + if(is_sacrifice_target(T.mind)) + sacrifice_fulfilled = 1 + new /obj/effect/overlay/temp/cult/sac(loc) + for(var/M in invokers) + if(sacrifice_fulfilled) + to_chat(M, "\"Yes! This is the one I desire! You have done well.\"") + else + if(ishuman(T) || isrobot(T)) + to_chat(M, "\"I accept this sacrifice.\"") + else + to_chat(M, "\"I accept this meager sacrifice.\"") + if(T.mind) + var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src)) + stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul() + if(!stone.transfer_soul("FORCE", T, usr)) //If it cannot be added + qdel(stone) + if(stone) + stone.invisibility = 0 + if(!T) + rune_in_use = 0 + return + if(isrobot(T)) + playsound(T, 'sound/effects/EMPulse.ogg', 100, 1) + T.dust() //To prevent the MMI from remaining + else + playsound(T, 'sound/magic/Disintegrate.ogg', 100, 1) + T.gib() + rune_in_use = 0 + +//Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station. +/obj/effect/rune/narsie + cultist_name = "Tear Reality (God)" + cultist_desc = "tears apart dimensional barriers, calling forth your god. Requires 9 invokers." + invocation = "TOK-LYR RQA-NAP G'OLT-ULOFT!!" + req_cultists = 9 + icon = 'icons/effects/96x96.dmi' + color = rgb(125,23,23) + icon_state = "rune_large" + pixel_x = -32 //So the big ol' 96x96 sprite shows up right + pixel_y = -32 + mouse_opacity = 1 //we're huge and easy to click + scribe_delay = 450 //how long the rune takes to create + scribe_damage = 40.1 //how much damage you take doing it + var/used + +/obj/effect/rune/narsie/New() + ..() + cultist_name = "Summon [ticker.mode.cultdat.entity_name]" + cultist_desc = "tears apart dimensional barriers, calling forth [ticker.mode.cultdat.entity_title3]. Requires 9 invokers." + + +/obj/effect/rune/narsie/check_icon() return + +/obj/effect/rune/narsie/talismanhide() //can't hide this, and you wouldn't want to + return + +/obj/effect/rune/narsie/invoke(var/list/invokers) + if(used) + return + var/mob/living/user = invokers[1] + if(istype(ticker.mode.name, "cult")) + var/datum/game_mode/cult/cult_mode = ticker.mode + if(user.z != ZLEVEL_STATION) + message_admins("[user.real_name]([user.ckey]) tried to summon Nar-Sie off station") + for(var/M in invokers) + var/mob/living/L = M + to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"") + if(L.reagents) + L.reagents.add_reagent("hell_water", 10) + L.Weaken(7) + L.Stun(7) + fail_invoke() + log_game("Summon Nar-Sie rune failed - off station Z level") + return + if(!cult_mode.eldergod) + for(var/M in invokers) + to_chat(M, "[ticker.mode.cultdat.entity_name] is already on this plane!") + log_game("Summon Nar-Sie rune failed - already summoned") + return + //BEGIN THE SUMMONING + used = 1 + color = rgb(255, 0, 0) + ..() + world << 'sound/effects/dimensional_rend.ogg' + to_chat(world, "The veil... is... TORN!!!--") + icon_state = "rune_large_distorted" + var/turf/T = get_turf(src) + sleep(40) + new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed + cult_mode.eldergod = 0 + +/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal. + if((istype(I, /obj/item/weapon/tome) && iscultist(user))) + user.visible_message("[user.name] begins erasing the [src]...", "You begin erasing the [src]...") + if(do_after(user, 50, target = src)) //Prevents accidental erasures. + log_game("Summon Narsie rune erased by [user.mind.key] (ckey) with a tome") + message_admins("[key_name_admin(user)] erased a Narsie rune with a tome") + ..() + return + else + if(istype(I, /obj/item/weapon/nullrod)) //Begone foul magiks. You cannot hinder me. + log_game("Summon Narsie rune erased by [user.mind.key] (ckey) using a null rod") + message_admins("[key_name_admin(user)] erased a Narsie rune with a null rod") + ..() + return + + + +/obj/effect/rune/slaughter + cultist_name = "Call Forth The Slaughter (Demons)" + cultist_desc = "Calls forth the doom of a eldrtich being. Three slaughter demons will appear to wreak havoc on the station." + invocation = null + req_cultists = 9 + color = rgb(125,23,23) + scribe_delay = 450 + scribe_damage = 40.1 //how much damage you take doing it + icon = 'icons/effects/96x96.dmi' + icon_state = "rune_large" + pixel_x = -32 + pixel_y = -32 + + var/used = 0 + +/obj/effect/rune/slaughter/check_icon() + return + +/obj/effect/rune/slaughter/talismanhide() //can't hide this, and you wouldn't want to + return + +/obj/effect/rune/slaughter/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal. + if((istype(I, /obj/item/weapon/tome) && iscultist(user))) + user.visible_message("[user.name] begins erasing the [src]...", "You begin erasing the [src]...") + if(do_after(user, 50, target = src)) //Prevents accidental erasures. + log_game("Summon demon rune erased by [user.mind.key] (ckey) with a tome") + message_admins("[key_name_admin(user)] erased a demon rune with a tome") + ..() + return + else + if(istype(I, /obj/item/weapon/nullrod)) //Begone foul magiks. You cannot hinder me. + log_game("Summon demon rune erased by [user.mind.key] (ckey) using a null rod") + message_admins("[key_name_admin(user)] erased a demon rune with a null rod") + ..() + return + + +/obj/effect/rune/slaughter/invoke(var/list/invokers) + if(used) + return + var/mob/living/user = invokers[1] + if(istype(ticker.mode.name, "cult")) + var/datum/game_mode/cult/cult_mode = ticker.mode + if(!("slaughter" in cult_mode.objectives)) + message_admins("[usr.real_name]([user.ckey]) tried to summon demons when the objective was wrong") + for(var/M in invokers) + var/mob/living/L = M + to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"") + if(L.reagents) + L.reagents.add_reagent("hell_water", 10) + L.Weaken(7) + L.Stun(7) + fail_invoke() + log_game("Summon Demons rune failed - improper objective") + return + if(user.z != ZLEVEL_STATION) + message_admins("[user.real_name]([user.ckey]) tried to summon demons off station") + for(var/M in invokers) + var/mob/living/L = M + to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"") + if(L.reagents) + L.reagents.add_reagent("hell_water", 10) + L.Weaken(7) + L.Stun(7) + fail_invoke() + log_game("Summon demons rune failed - off station Z level") + return + if(cult_mode.demons_summoned) + for(var/M in invokers) + to_chat(M, "Demons are already on this plane!") + log_game("Summon Demons rune failed - already summoned") + return + //BEGIN THE SLAUGHTER + used = 1 + for(var/mob/living/M in range(1,src)) + if(iscultist(M)) + M.say("TOK-LYR RQA-NAP SHA-NEX!!") + world << 'sound/effects/dimensional_rend.ogg' + to_chat(world, "A hellish cacaphony bombards from all around as something awful tears through the world...") + icon_state = "rune_large_distorted" + sleep(55) + to_chat(world, "\"LIBREATE TE EX INFERIS!\"")//Fethas note:I COULDN'T HELP IT OKAY?! + visible_message("[src] melts away into blood, and three horrific figures emerge from within!") + var/turf/T = get_turf(src) + new /mob/living/simple_animal/slaughter/cult(T) + new /mob/living/simple_animal/slaughter/cult(T, pick(NORTH, EAST, SOUTH, WEST)) + new /mob/living/simple_animal/slaughter/cult(T, pick(NORTHEAST, SOUTHEAST, NORTHWEST, SOUTHWEST)) + cult_mode.demons_summoned = 1 + shuttle_master.emergency.request(null, 0.5,null) + cult_mode.third_phase() + qdel(src) + + +//Rite of Resurrection: Requires two corpses. Revives one and gibs the other. +/obj/effect/rune/raise_dead + cultist_name = "Rite of Resurrection" + cultist_desc = "requires two corpses, one on the rune and one adjacent to the rune. The one on the rune is brought to life, the other is turned to ash." + invocation = null //Depends on the name of the user - see below + icon_state = "1" + +/obj/effect/rune/raise_dead/invoke(var/list/invokers) + var/turf/T = get_turf(src) + var/mob/living/mob_to_sacrifice + var/mob/living/mob_to_revive + var/list/potential_sacrifice_mobs = list() + var/list/potential_revive_mobs = list() + var/mob/living/user = invokers[1] + if(rune_in_use) + return + for(var/mob/living/M in orange(1,src)) + if(M.stat == DEAD && !iscultist(M)) + potential_sacrifice_mobs.Add(M) + if(!potential_sacrifice_mobs.len) + to_chat(user, "There are no eligible sacrifices nearby!") + log_game("Raise Dead rune failed - no catalyst corpse") + return + mob_to_sacrifice = input(user, "Choose a corpse to sacrifice.", "Corpse to Sacrifice") as null|anything in potential_sacrifice_mobs + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || !mob_to_revive || !mob_to_sacrifice || rune_in_use) + return + for(var/mob/living/M in T.contents) + if(M.stat == DEAD) + potential_revive_mobs.Add(M) + if(!potential_revive_mobs.len) + to_chat(user, "There is no eligible revival target on the rune!") + log_game("Raise Dead rune failed - no corpse to revived") + return + mob_to_revive = input(user, "Choose a corpse to revive.", "Corpse to Revive") as null|anything in potential_revive_mobs + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || rune_in_use) + return + if(!in_range(mob_to_sacrifice,src)) + to_chat(user, "The sacrificial target has been moved!") + fail_invoke() + log_game("Raise Dead rune failed - catalyst corpse moved") + return + if(!(mob_to_revive in T.contents)) + to_chat(user, "The corpse to revive has been moved!") + fail_invoke() + log_game("Raise Dead rune failed - revival target moved") + return + if(mob_to_sacrifice.stat != DEAD) + to_chat(user, "The sacrificial target must be dead!") + fail_invoke() + log_game("Raise Dead rune failed - catalyst corpse is not dead") + return + rune_in_use = 1 + if(user.name == "Herbert West") + user.say("To life, to life, I bring them!") + else + user.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!") + ..() + mob_to_sacrifice.visible_message("[mob_to_sacrifice]'s body rises into the air, connected to [mob_to_revive] by a glowing tendril!") + mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=20) + sleep(20) + if(!mob_to_sacrifice || !in_range(mob_to_sacrifice, src)) + mob_to_sacrifice.visible_message("[mob_to_sacrifice] disintegrates into a pile of bones") + return + mob_to_sacrifice.dust() + if(!mob_to_revive || mob_to_revive.stat != DEAD) + visible_message("The glowing tendril snaps against the rune with a shocking crack.") + rune_in_use = 0 + return + mob_to_revive.revive() //This does remove disabilities and such, but the rune might actually see some use because of it! + to_chat(mob_to_revive, "\"PASNAR SAVRAE YAM'TOTH. Arise.\"") + mob_to_revive.visible_message("[mob_to_revive] draws in a huge breath, red light shining from their eyes.", \ + "You awaken suddenly from the void. You're alive!") + rune_in_use = 0 + + +/obj/effect/rune/raise_dead/fail_invoke() + ..() + for(var/mob/living/M in range(1,src)) + if(M.stat == DEAD) + M.visible_message("[M] twitches.") + + +//Rite of Disruption: Emits an EMP blast. +/obj/effect/rune/emp + cultist_name = "Rite of Disruption" + cultist_desc = "emits a large electromagnetic pulse, increasing in size for each cultist invoking it, hindering electronics and disabling silicons." + invocation = "Ta'gh fara'qha fel d'amar det!" + icon_state = "5" + allow_excess_invokers = 1 + +/obj/effect/rune/emp/invoke(var/list/invokers) + var/turf/E = get_turf(src) + ..() + visible_message("[src] glows blue for a moment before vanishing.") + switch(invokers.len) + if(1 to 2) + playsound(E, 'sound/items/Welder2.ogg', 25, 1) + for(var/M in invokers) + to_chat(M, "You feel a minute vibration pass through you...") + if(3 to 6) + playsound(E, 'sound/effects/EMPulse.ogg', 50, 1) + for(var/M in invokers) + to_chat(M, "Your hair stands on end as a shockwave eminates from the rune!") + if(7 to INFINITY) + playsound(E, 'sound/effects/EMPulse.ogg', 100, 1) + for(var/M in invokers) + var/mob/living/L = M + to_chat(L, "You chant in unison and a colossal burst of energy knocks you backward!") + L.Weaken(2) + qdel(src) //delete before pulsing because it's a delay reee + empulse(E, 9*invokers.len, 12*invokers.len) // Scales now, from a single room to most of the station depending on # of chanters + +//Rite of Astral Communion: Separates one's spirit from their body. They will take damage while it is active. +/obj/effect/rune/astral + cultist_name = "Astral Communion" + cultist_desc = "severs the link between one's spirit and body. This effect is taxing and one's physical body will take damage while this is active." + invocation = "Fwe'sh mah erl nyag r'ya!" + icon_state = "6" + rune_in_use = 0 //One at a time, please! + construct_invoke = 0 + var/mob/living/affecting = null + +/obj/effect/rune/astral/examine(mob/user) + ..() + if(affecting) + to_chat(user, "A translucent field encases [user] above the rune!") + +/obj/effect/rune/astral/can_invoke(mob/living/user) + if(rune_in_use) + to_chat(user, "[src] cannot support more than one body!") + log_game("Astral Communion rune failed - more than one user") + return list() + var/turf/T = get_turf(src) + if(!user in T.contents) + to_chat(user, "You must be standing on top of [src]!") + log_game("Astral Communion rune failed - user not standing on rune") + return list() + return ..() + +/obj/effect/rune/astral/invoke(var/list/invokers) + var/mob/living/user = invokers[1] + ..() + var/turf/T = get_turf(src) + rune_in_use = 1 + affecting = user + user.color = "#7e1717" + user.visible_message("[user] freezes statue-still, glowing an unearthly red.", \ + "You see what lies beyond. All is revealed. While this is a wondrous experience, your physical form will waste away in this state. Hurry...") + user.ghostize(1) + while(user) + if(!affecting) + visible_message("[src] pulses gently before falling dark.") + affecting = null //In case it's assigned to a number or something + rune_in_use = 0 + return + affecting.apply_damage(1, BRUTE) + if(!(user in T.contents)) + user.visible_message("A spectral tendril wraps around [user] and pulls them back to the rune!") + Beam(user,icon_state="drainbeam",icon='icons/effects/effects.dmi',time=2) + user.forceMove(get_turf(src)) //NO ESCAPE :^) + if(user.key) + user.visible_message("[user] slowly relaxes, the glow around them dimming.", \ + "You are re-united with your physical form. [src] releases its hold over you.") + user.color = initial(user.color) + user.Weaken(3) + rune_in_use = 0 + affecting = null + return + if(user.stat == UNCONSCIOUS) + if(prob(10)) + var/mob/dead/observer/G = user.get_ghost() + if(G) + to_chat(G, "You feel the link between you and your body weakening... you must hurry!") + if(user.stat == DEAD) + user.color = initial(user.color) + rune_in_use = 0 + affecting = null + var/mob/dead/observer/G = user.get_ghost() + if(G) + to_chat(G, "You suddenly feel your physical form pass on. [src]'s exertion has killed you!") + return + sleep(10) + rune_in_use = 0 + + +//Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo. +/obj/effect/rune/wall + cultist_name = "Rite of the Corporeal Shield" + cultist_desc = "when invoked, makes an invisible wall to block passage. Can be invoked again to reverse this." + invocation = "Khari'd! Eske'te tannin!" + icon_state = "1" + +/obj/effect/rune/wall/examine(mob/user) + ..() + if(density) + to_chat(user, "There is a barely perceptible shimmering of the air above [src].") + +/obj/effect/rune/wall/invoke(var/list/invokers) + var/mob/living/user = invokers[1] + ..() + density = !density + user.visible_message("[user] places their hands on [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].", \ + "You channel your life energy into [src], [density ? "preventing" : "allowing"] passage above it.") + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.apply_damage(2, BRUTE, pick("l_arm", "r_arm")) + + +//Rite of Joined Souls: Summons a single cultist. +/obj/effect/rune/summon + cultist_name = "Rite of Joined Souls" + cultist_desc = "summons a single cultist to the rune. Requires 2 invokers." + invocation = "N'ath reth sh'yro eth d'rekkathnor!" + req_cultists = 2 + allow_excess_invokers = 1 + icon_state = "5" + +/obj/effect/rune/summon/invoke(var/list/invokers) + var/mob/living/user = invokers[1] + var/list/cultists = list() + for(var/datum/mind/M in ticker.mode.cult) + if(!(M.current in invokers) && M.current.stat != DEAD) + cultists |= M.current + var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of [ticker.mode.cultdat.entity_title3]") as null|anything in cultists + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) + return + if(!cultist_to_summon) + to_chat(user, "You require a summoning target!") + fail_invoke() + log_game("Summon Cultist rune failed - no target") + return + if(!iscultist(cultist_to_summon)) + to_chat(user, "[cultist_to_summon] is not a follower of [ticker.mode.cultdat.entity_title3]!") + fail_invoke() + log_game("Summon Cultist rune failed - no target") + return + if(cultist_to_summon.z > MAX_Z) + to_chat(user, "[cultist_to_summon] is not in our dimension!") + fail_invoke() + log_game("Summon Cultist rune failed - target in away mission") + return + cultist_to_summon.visible_message("[cultist_to_summon] suddenly disappears in a flash of red light!", \ + "Overwhelming vertigo consumes you as you are hurled through the air!") + ..() + visible_message("A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!") + user.apply_damage(10, BRUTE, "head") + cultist_to_summon.forceMove(get_turf(src)) + qdel(src) + +//Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby +/obj/effect/rune/blood_boil + cultist_name = "Boil Blood" + cultist_desc = "boils the blood of non-believers who can see the rune, dealing extreme amounts of damage. Requires 3 invokers." + invocation = "Dedo ol'btoh!" + icon_state = "4" + construct_invoke = 0 + req_cultists = 3 + +/obj/effect/rune/blood_boil/invoke(var/list/invokers) + ..() + var/turf/T = get_turf(src) + visible_message("[src] briefly bubbles before exploding!") + for(var/mob/living/carbon/C in viewers(T)) + if(!iscultist(C)) + var/obj/item/weapon/nullrod/N = C.null_rod_check() + if(N) + to_chat(C, "\The [N] suddenly burns hotly before returning to normal!") + continue + to_chat(C, "Your blood boils in your veins!") + C.take_overall_damage(45,45) + C.Stun(7) + for(var/M in invokers) + var/mob/living/L = M + L.apply_damage(15, BRUTE, pick("l_arm", "r_arm")) + to_chat(L,"[src] saps your strength!") + qdel(src) + explosion(T, -1, 0, 1, 5) + + +//Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost. +/obj/effect/rune/manifest + cultist_name = "Rite of Spectral Manifestation" + cultist_desc = "manifests a spirit as a servant of your god. The invoker must not move from atop the rune, and will take damage for each summoned spirit." + invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this + icon_state = "6" + construct_invoke = 0 + color = rgb(200, 0, 0) + +/obj/effect/rune/manifest/New(loc) + ..() + cultist_desc = "manifests a spirit as a servant of [ticker.mode.cultdat.entity_title3]. The invoker must not move from atop the rune, and will take damage for each summoned spirit." + + notify_ghosts("Manifest rune created in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src) + +/obj/effect/rune/manifest/can_invoke(mob/living/user) + if(!(user in get_turf(src))) + to_chat(user,"You must be standing on [src]!") + fail_invoke() + log_game("Manifest rune failed - user not standing on rune") + return list() + var/list/ghosts_on_rune = list() + for(var/mob/dead/observer/O in get_turf(src)) + if(O.client && !jobban_isbanned(O, ROLE_CULTIST)) + ghosts_on_rune |= O + if(!ghosts_on_rune.len) + to_chat(user, "There are no spirits near [src]!") + fail_invoke() + log_game("Manifest rune failed - no nearby ghosts") + return list() + return ..() + +/obj/effect/rune/manifest/invoke(var/list/invokers) + var/mob/living/user = invokers[1] + var/list/ghosts_on_rune = list() + for(var/mob/dead/observer/O in get_turf(src)) + if(O.client && !jobban_isbanned(O, ROLE_CULTIST)) + ghosts_on_rune |= O + var/mob/dead/observer/ghost_to_spawn = pick(ghosts_on_rune) + var/mob/living/carbon/human/new_human = new(get_turf(src)) + new_human.real_name = ghost_to_spawn.real_name + new_human.alpha = 150 //Makes them translucent + ..() + visible_message("A cloud of red mist forms above [src], and from within steps... a man.") + to_chat(user, "Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...") + var/obj/machinery/shield/N = new(get_turf(src)) + N.name = "Invoker's Shield" + N.desc = "A weak shield summoned by cultists to protect them while they carry out delicate rituals" + N.color = "red" + N.health = 20 + N.mouse_opacity = 0 + new_human.key = ghost_to_spawn.key + ticker.mode.add_cultist(new_human.mind, 0) + to_chat(new_human, "You are a servant of [ticker.mode.cultdat.entity_title3]. You have been made semi-corporeal by the cult of [ticker.mode.cultdat.entity_name], and you are to serve them at all costs.") + + while(user in get_turf(src)) + if(user.stat) + break + user.apply_damage(0.1, BRUTE) + sleep(3) + + qdel(N) + if(new_human) + new_human.visible_message("[new_human] suddenly dissolves into bones and ashes.", \ + "Your link to the world fades. Your form breaks apart.") + for(var/obj/I in new_human) + new_human.unEquip(I) + new_human.dust() \ No newline at end of file diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index af678813fae..18911c7762c 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -1,255 +1,400 @@ /obj/item/weapon/paper/talisman icon_state = "paper_talisman" - var/imbue = null - var/uses = 0 + var/cultist_name = "talisman" + var/cultist_desc = "A basic talisman. It serves no purpose." + var/invocation = "Naise meam!" info = "


" + var/uses = 1 + var/health_cost = 0 //The amount of health taken from the user when invoking the talisman - attack_self(mob/living/user as mob) - if(iscultist(user)) - var/delete = 1 - switch(imbue) - if("newtome") - call(/obj/effect/rune/proc/tomesummon)() - if("armor") - call(/obj/effect/rune/proc/armor)() - if("emp") - call(/obj/effect/rune/proc/emp)(usr.loc,3) - if("conceal") - call(/obj/effect/rune/proc/obscure)(2) - if("revealrunes") - call(/obj/effect/rune/proc/revealrunes)(src) - if("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") - call(/obj/effect/rune/proc/teleport)(imbue) - if("communicate") - //If the user cancels the talisman this var will be set to 0 - delete = call(/obj/effect/rune/proc/communicate)() - if("deafen") - call(/obj/effect/rune/proc/deafen)() - if("blind") - call(/obj/effect/rune/proc/blind)() - if("runestun") - to_chat(user, "\red To use this talisman, attack your target directly.") - return - if("supply") - supply() - user.take_organ_damage(5, 0) - if(src && src.imbue!="supply" && src.imbue!="runestun") - if(delete) - qdel(src) - return - else - to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?") - return +/obj/item/weapon/paper/talisman/examine(mob/user) + if(iscultist(user) || user.stat == DEAD) + to_chat(user, "Name: [cultist_name]") + to_chat(user, "Effect: [cultist_desc]") + to_chat(user, "Uses Remaining: [uses]") + else + to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?") - - attack(mob/living/carbon/T as mob, mob/living/user as mob) - if(iscultist(user)) - if(imbue == "runestun") - user.take_organ_damage(5, 0) - call(/obj/effect/rune/proc/runestun)(T) - qdel(src) - else - ..() ///If its some other talisman, use the generic attack code, is this supposed to work this way? - else - ..() - - - proc/supply(var/key) - if(!src.uses) - qdel(src) - return - - var/dat = "There are [src.uses] bloody runes on the parchment.
" - dat += "Please choose the chant to be imbued into the fabric of reality.
" - dat += "
" - dat += "N'ath reth sh'yro eth d'raggathnor! - Allows you to summon a new arcane tome.
" - dat += "Sas'so c'arta forbici! - Allows you to move to a rune with the same last word.
" - dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range.
" - dat += "Kla'atu barada nikt'o! - Allows you to conceal the runes you placed on the floor.
" - dat += "O bidai nabora se'sma! - Allows you to coordinate with others of your cult.
" - dat += "Fuu ma'jin - Allows you to stun a person by attacking them with the talisman.
" - dat += "Sa tatha najin - Allows you to summon armoured robes and an unholy blade
" - dat += "Kal om neth - Summons a soul stone
" - dat += "Da A'ig Osk - Summons a construct shell for use with captured souls. It is too large to carry on your person.
" - usr << browse(dat, "window=id_com;size=350x200") +/obj/item/weapon/paper/talisman/attack_self(mob/living/user) + if(!iscultist(user)) + to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?") return + if(invoke(user)) + uses-- + if(uses <= 0) + user.drop_item() + qdel(src) +/obj/item/weapon/paper/talisman/proc/invoke(mob/living/user, successfuluse = 1) + . = successfuluse + if(successfuluse) //if the calling whatever says we succeed, do the fancy stuff + if(invocation) + user.whisper(invocation) + if(health_cost && iscarbon(user)) + var/mob/living/carbon/C = user + C.apply_damage(health_cost, BRUTE, pick("l_arm", "r_arm")) - Topic(href, href_list) - if(!src) return - if(usr.stat || usr.restrained() || !in_range(src, usr)) return - - if(href_list["rune"]) - if(istype(usr, /mob/living/carbon/human)) - var/mob/living/carbon/human/M = usr - - switch(href_list["rune"]) - if("newtome") - - var/obj/item/weapon/paper/talisman/T = new(M) - T.imbue = "newtome" - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand, - ) - - var/where = M.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else - to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() - src.uses-- - supply() - - - if("teleport") - var/obj/item/weapon/paper/talisman/T = new(M) - T.imbue = "[pick("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri", "orkan", "allaq")]" - T.info = "[T.imbue]" - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand, - ) - - var/where = M.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else - to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() - src.uses-- - supply() - - if("emp") - var/obj/item/weapon/paper/talisman/T = new(M) - T.imbue = "emp" - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand, - ) - - var/where = M.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else - to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() - src.uses-- - supply() - - if("conceal") - var/obj/item/weapon/paper/talisman/T = new(M) - T.imbue = "conceal" - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand, - ) - - var/where = M.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else - to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() - src.uses-- - supply() - - if("communicate") - var/obj/item/weapon/paper/talisman/T = new(M) - T.imbue = "communicate" - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand, - ) - - var/where = M.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else - to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() - src.uses-- - supply() - - if("runestun") - var/obj/item/weapon/paper/talisman/T = new(M) - T.imbue = "runestun" - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand, - ) - - var/where = M.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else - to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() - src.uses-- - supply() - - if("armor") - var/obj/item/weapon/paper/talisman/T = new(M) - T.imbue = "armor" - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand, - ) - - var/where = M.equip_in_one_of_slots(T, slots) - if(!where) - to_chat(M, "You need a space in your backpack, pocket or hand for the new paper.") - else - to_chat(M, "The [href_list["rune"]] talisman in your [where]") - M.update_icons() - src.uses-- - supply() - - if("soulstone") - new /obj/item/device/soulstone(get_turf(usr)) - src.uses-- - supply() - if("construct") - new /obj/structure/constructshell(get_turf(usr)) - src.uses-- - supply() - else - return - - - - return +//Malformed Talisman: If something goes wrong. +/obj/item/weapon/paper/talisman/malformed + cultist_name = "malformed talisman" + cultist_desc = "A talisman with gibberish scrawlings. No good can come from invoking this." + invocation = "Ra'sha yoka!" +/obj/item/weapon/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1) + to_chat(user, "You feel a pain in your head. [ticker.mode.cultdat.entity_title3] is displeased.") + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.apply_damage(10, BRUTE, "head") +//Supply Talisman: Has a few unique effects. Granted only to starter cultists. /obj/item/weapon/paper/talisman/supply - imbue = "supply" - uses = 5 \ No newline at end of file + cultist_name = "Supply Talisman" + cultist_desc = "A multi-use talisman that can create various objects. Intended to increase the cult's strength early on." + invocation = null + uses = 3 + +/obj/item/weapon/paper/talisman/supply/invoke(mob/living/user, successfuluse = 1) + var/dat = "There are [uses] bloody runes on the parchment.
" + dat += "Please choose the chant to be imbued into the fabric of reality.
" + dat += "
" + dat += "N'ath reth sh'yro eth d'raggathnor! - Summons an arcane tome, used to scribe runes and communicate with other cultists.
" + dat += "Sas'so c'arta forbici! - Allows you to move to a selected teleportation rune.
" + dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range.
" + dat += "Fuu ma'jin! - Allows you to stun a person by attacking them with the talisman.
" + dat += "Kla'atu barada nikt'o! - Two use talisman, first use makes all nearby runes invisible, second use reveals nearby hidden runes.
" + dat += "Kal'om neth! - Summons a soul stone, used to capure the spirits of dead or dying humans.
" + dat += "Daa'ig osk! - Summons a construct shell for use with soulstone-captured souls. It is too large to carry on your person.
" + var/datum/browser/popup = new(user, "talisman", "", 400, 400) + popup.set_content(dat) + popup.open() + return 0 + +/obj/item/weapon/paper/talisman/supply/Topic(href, href_list) + if(src) + if(usr.stat || usr.restrained() || !in_range(src, usr)) + return + if(href_list["rune"]) + switch(href_list["rune"]) + if("newtome") + var/obj/item/weapon/tome/T = new(usr) + usr.put_in_hands(T) + if("teleport") + var/obj/item/weapon/paper/talisman/teleport/T = new(usr) + usr.put_in_hands(T) + if("emp") + var/obj/item/weapon/paper/talisman/emp/T = new(usr) + usr.put_in_hands(T) + if("runestun") + var/obj/item/weapon/paper/talisman/stun/T = new(usr) + usr.put_in_hands(T) + if("soulstone") + var/obj/item/device/soulstone/T = new(usr) + usr.put_in_hands(T) + if("construct") + new /obj/structure/constructshell(get_turf(usr)) + if("veiling") + var/obj/item/weapon/paper/talisman/true_sight/T = new(usr) + usr.put_in_hands(T) + uses-- + if(uses <= 0) + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + C.drop_item() + visible_message("[src] crumbles to dust.") + qdel(src) + +/obj/item/weapon/paper/talisman/supply/weak + uses = 2 + +//Rite of Translocation: Same as rune +/obj/item/weapon/paper/talisman/teleport + cultist_name = "Talisman of Teleportation" + cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword." + invocation = "Sas'so c'arta forbici!" + health_cost = 5 + +/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1) + var/list/potential_runes = list() + var/list/teleportnames = list() + var/list/duplicaterunecount = list() + for(var/R in teleport_runes) + var/obj/effect/rune/teleport/T = R + var/resultkey = T.listkey + if(resultkey in teleportnames) + duplicaterunecount[resultkey]++ + resultkey = "[resultkey] ([duplicaterunecount[resultkey]])" + else + teleportnames.Add(resultkey) + duplicaterunecount[resultkey] = 1 + potential_runes[resultkey] = T + + if(!potential_runes.len) + to_chat(user, "There are no valid runes to teleport to!") + log_game("Teleport talisman failed - no other teleport runes") + return ..(user, 0) + + if(user.z > MAX_Z) + to_chat(user, "You are not in the right dimension!") + log_game("Teleport talisman failed - user in away mission") + return ..(user, 0) + + var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked + var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to? + if(!actual_selected_rune) + return ..(user, 0) + user.visible_message("Dust flows from [user]'s hand, and they disappear in a flash of red light!", \ + "You speak the words of the talisman and find yourself somewhere else!") + user.forceMove(get_turf(actual_selected_rune)) + return ..() + + +/obj/item/weapon/paper/talisman/summon_tome + cultist_name = "Talisman of Tome Summoning" + cultist_desc = "A one-use talisman that will call an untranslated tome from the archives of a cult." + invocation = "N'ath reth sh'yro eth d'raggathnor!" + health_cost = 1 + +/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1) + . = ..() + user.visible_message("[user]'s hand glows red for a moment.", \ + "You speak the words of the talisman!") + new /obj/item/weapon/tome(get_turf(user)) + user.visible_message("A tome appears at [user]'s feet!", \ + "An arcane tome materializes at your feet.") + +/obj/item/weapon/paper/talisman/true_sight + cultist_name = "Talisman of Veiling" + cultist_desc = "A multi-use talisman that hides nearby runes. On its second use, will reveal nearby runes." + invocation = "Kla'atu barada nikt'o!" + health_cost = 1 + uses = 2 + var/revealing = FALSE //if it reveals or not + +/obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user, successfuluse = 1) + . = ..() + if(!revealing) + user.visible_message("Thin grey dust falls from [user]'s hand!", \ + "You speak the words of the talisman, hiding nearby runes.") + invocation = "Nikt'o barada kla'atu!" + revealing = TRUE + for(var/obj/effect/rune/R in range(3,user)) + R.talismanhide() + else + user.visible_message("A flash of light shines from [user]'s hand!", \ + "You speak the words of the talisman, revealing nearby runes.") + for(var/obj/effect/rune/R in range(3,user)) + R.talismanreveal() + +//Rite of False Truths: Same as rune +/obj/item/weapon/paper/talisman/make_runes_fake + cultist_name = "Talisman of Disguising" + cultist_desc = "A talisman that will make nearby runes appear fake." + invocation = "By'o nar'nar!" + +/obj/item/weapon/paper/talisman/make_runes_fake/invoke(mob/living/user, successfuluse = 1) + . = ..() + user.visible_message("Dust flows from [user]s hand.", \ + "You speak the words of the talisman, making nearby runes appear fake.") + for(var/obj/effect/rune/R in orange(6,user)) + R.talismanfake() + R.desc = "A rune drawn in crayon." + + +//Rite of Disruption: Weaker than rune +/obj/item/weapon/paper/talisman/emp + cultist_name = "Talisman of Electromagnetic Pulse" + cultist_desc = "A talisman that will cause a moderately-sized electromagnetic pulse." + invocation = "Ta'gh fara'qha fel d'amar det!" + health_cost = 5 + +/obj/item/weapon/paper/talisman/emp/invoke(mob/living/user, successfuluse = 1) + . = ..() + user.visible_message("[user]'s hand flashes a bright blue!", \ + "You speak the words of the talisman, emitting an EMP blast.") + empulse(src, 4, 8) + + +//Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time +/obj/item/weapon/paper/talisman/stun + cultist_name = "Talisman of Stunning" + cultist_desc = "A talisman that will stun and inhibit speech on a single target. To use, attack target directly." + invocation = "Dream sign:Evil sealing talisman!" + health_cost = 10 + +/obj/item/weapon/paper/talisman/stun/invoke(mob/living/user, successfuluse = 0) + if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff + return ..() + if(iscultist(user)) + to_chat(user, "To use this talisman, attack the target directly.") + else + to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?") + return 0 + +/obj/item/weapon/paper/talisman/stun/attack(mob/living/target, mob/living/user, successfuluse = 1) + if(iscultist(user)) + invoke(user, 1) + user.visible_message("[user] holds up [src], which explodes in a flash of red light!", \ + "You stun [target] with the talisman!") + var/obj/item/weapon/nullrod/N = locate() in target + if(N) + target.visible_message("[target]'s holy weapon absorbs the talisman's light!", \ + "Your holy weapon absorbs the blinding light!") + else + target.Weaken(10) + target.Stun(10) + target.flash_eyes(1,1) + if(issilicon(target)) + var/mob/living/silicon/S = target + S.emp_act(1) + if(iscarbon(target)) + var/mob/living/carbon/C = target + C.silent += 5 + C.stuttering += 15 + C.cultslurring += 5 + C.Jitter(15) + user.drop_item() + qdel(src) + return + ..() + + +//Rite of Arming: Equips cultist armor on the user, where available +/obj/item/weapon/paper/talisman/armor + cultist_name = "Talisman of Arming" + cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to." + invocation = "N'ath reth sh'yro eth draggathnor!" + +/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1) + . = ..() + var/mob/living/carbon/human/H = user + user.visible_message("Otherworldly armor suddenly appears on [user]!", \ + "You speak the words of the talisman, arming yourself!") + H.equip_or_collect(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), slot_wear_suit) + H.equip_or_collect(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back) + H.drop_item() + H.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) + H.put_in_hands(new /obj/item/weapon/legcuffs/bolas/cult(user)) + +/obj/item/weapon/paper/talisman/armor/attack(mob/living/target, mob/living/user) + if(iscultist(user) && iscultist(target)) + user.drop_item() + invoke(target) + qdel(src) + return + ..() + + +//Talisman of Horrors: Breaks the mind of the victim with nightmarish hallucinations +/obj/item/weapon/paper/talisman/horror + cultist_name = "Talisman of Horrors" + cultist_desc = "A talisman that will break the mind of the victim with nightmarish hallucinations." + invocation = "Lo'Nab Na'Dm!" + +/obj/item/weapon/paper/talisman/horror/attack(mob/living/target, mob/living/user) + if(iscultist(user)) + to_chat(user, "You disturb [target] with visons of the end!") + if(iscarbon(target)) + var/mob/living/carbon/H = target + H.reagents.add_reagent("lsd", 10) + qdel(src) + + +//Talisman of Fabrication: Creates a construct shell out of 25 metal sheets. +/obj/item/weapon/paper/talisman/construction + cultist_name = "Talisman of Construction" + cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell or on plasteel to make runed metal" + invocation = "Ethra p'ni dedol!" + +/obj/item/weapon/paper/talisman/construction/attack_self(mob/living/user) + if(iscultist(user)) + to_chat(user, "To use this talisman, place it upon a stack of metal sheets.") + else + to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?") + + +/obj/item/weapon/paper/talisman/construction/attack(obj/M,mob/living/user) + if(iscultist(user)) + to_chat(user, "This talisman will only work on a stack of metal sheets!") + log_game("Construct talisman failed - not a valid target") + +/obj/item/weapon/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters) + ..() + if(proximity_flag && iscultist(user)) + if(istype(target, /obj/item/stack/sheet/metal)) + var/turf/T = get_turf(target) + if(target.use(25)) + new /obj/structure/constructshell(T) + to_chat(user, "The talisman clings to the metal and twists it into a construct shell!") + user << sound('sound/magic/Staff_Chaos.ogg',0,1,25) + qdel(src) + if(istype(target, /obj/item/stack/sheet/plasteel)) + var/quantity = target.amount + var/turf/T = get_turf(target) + new /obj/item/stack/sheet/runed_metal(T,quantity) + target.use(quantity) + to_chat(user, "The talisman clings to the plasteel, transforming it into runed metal!") + user << sound('sound/magic/Staff_Chaos.ogg',0,1,25) + qdel(src) + else + to_chat(user, "The talisman must be used on metal or plasteel!") + + +//Talisman of Shackling: Applies special cuffs directly from the talisman +/obj/item/weapon/paper/talisman/shackle + cultist_name = "Talisman of Shackling" + cultist_desc = "Use this talisman on a victim to handcuff them with dark bindings." + invocation = "In'totum Lig'abis!" + uses = 4 + +/obj/item/weapon/paper/talisman/shackle/invoke(mob/living/user, successfuluse = 0) + if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff + return ..() + if(iscultist(user)) + to_chat(user, "To use this talisman, attack the target directly.") + else + to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?") + return 0 + +/obj/item/weapon/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user) + if(iscultist(user) && istype(target)) + if(target.stat == DEAD) + user.visible_message("This talisman's magic does not affect the dead!") + return + CuffAttack(target, user) + return + ..() + +/obj/item/weapon/paper/talisman/shackle/proc/CuffAttack(mob/living/carbon/C, mob/living/user) + if(!C.handcuffed) + invoke(user, 1) + playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2) + C.visible_message("[user] begins restraining [C] with dark magic!", \ + "[user] begins shaping a dark magic around your wrists!") + if(do_mob(user, C, 30)) + if(!C.handcuffed) + C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/cult/used(C) + C.update_handcuffed() + to_chat(user, "You shackle [C].") + add_logs(user, C, "handcuffed") + uses-- + else + to_chat(user, "[C] is already bound.") + else + to_chat(user, "You fail to shackle [C].") + else + to_chat(user, "[C] is already bound.") + if(uses <= 0) + user.drop_item() + qdel(src) + return + +/obj/item/weapon/restraints/handcuffs/energy/cult //For the talisman of shackling + name = "cult shackles" + desc = "Shackles that bind the wrists with sinister magic." + trashtype = /obj/item/weapon/restraints/handcuffs/energy/used + origin_tech = "materials=2;magnets=5" + +/obj/item/weapon/restraints/handcuffs/energy/cult/used/dropped(mob/user) + user.visible_message("[user]'s shackles shatter in a discharge of dark magic!", \ + "Your [src] shatters in a discharge of dark magic!") + qdel(src) \ No newline at end of file diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 6da0eb3fd55..4e961aa5e98 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -250,7 +250,6 @@ if(H.mind in ticker.mode.syndicates) ticker.mode.update_synd_icons_added() if(H.mind in ticker.mode.cult) - ticker.mode.add_cult_viewpoint(H) ticker.mode.add_cultist(occupant.mind) ticker.mode.update_cult_icons_added() //So the icon actually appears if(("\ref[H.mind]" in ticker.mode.implanter) || (H.mind in ticker.mode.implanted)) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index dcc05e5acfe..8292206402b 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -133,6 +133,10 @@ name = "engraved floor" icon_state = "cult" +/turf/simulated/floor/engine/cult/New() + ..() + icon_state = ticker.mode.cultdat.cult_floor_icon_state + /turf/simulated/floor/engine/cult/narsie_act() return diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm index 2d65018ceea..2f6205eff20 100644 --- a/code/game/turfs/simulated/walls_misc.dm +++ b/code/game/turfs/simulated/walls_misc.dm @@ -9,6 +9,7 @@ /turf/simulated/wall/cult/New() new /obj/effect/overlay/temp/cult/turf(src) ..() + icon_state = ticker.mode.cultdat.cult_wall_icon_state /turf/simulated/wall/cult/artificer name = "runed stone wall" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index a7fc809aa88..ffef6c8051b 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -340,9 +340,9 @@ if("coffee") M.change_mob_type( /mob/living/simple_animal/crab/Coffee , null, null, delmob, 1 ) if("parrot") M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob, 1 ) if("polyparrot") M.change_mob_type( /mob/living/simple_animal/parrot/Poly , null, null, delmob, 1 ) - if("constructarmoured") M.change_mob_type( /mob/living/simple_animal/construct/armoured , null, null, delmob, 1 ) - if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/construct/builder , null, null, delmob, 1 ) - if("constructwraith") M.change_mob_type( /mob/living/simple_animal/construct/wraith , null, null, delmob, 1 ) + if("constructarmoured") M.change_mob_type( /mob/living/simple_animal/hostile/construct/armoured , null, null, delmob, 1 ) + if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/hostile/construct/builder , null, null, delmob, 1 ) + if("constructwraith") M.change_mob_type( /mob/living/simple_animal/hostile/construct/wraith , null, null, delmob, 1 ) if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob, 1 ) @@ -1421,19 +1421,6 @@ log_admin("[key_name(usr)] AIized [key_name(H)]") H.AIize() - - else if(href_list["makemask"]) - if(!check_rights(R_SPAWN)) return - - if(alert(usr, "Confirm make mask?",, "Yes", "No") != "Yes") - return - - var/mob/currentMob = locate(href_list["makemask"]) - message_admins("\red Admin [key_name_admin(usr)] made [key_name_admin(currentMob)] into a Mask of Nar'Sie!", 1) - log_admin("[key_name(usr)] made [key_name(currentMob)] into a Mask of Nar'Sie!") - currentMob.make_into_mask(0,0) - - else if(href_list["makealien"]) if(!check_rights(R_SPAWN)) return diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index dbcefec7365..e09cc96ae0f 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -78,7 +78,10 @@ proc/get_radio_key_from_channel(var/channel) message = stutter(message) verb = "stammers" speech_problem_flag = 1 - + if(cultslurring) + message = cultslur(message) + verb = "slurs" + speech_problem_flag = 1 if(COMIC in mutations) message = "[message]" diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 1d5b4da0e83..6d22ce83b5c 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -1,5 +1,5 @@ -/mob/living/simple_animal/construct +/mob/living/simple_animal/hostile/construct name = "Construct" real_name = "Construct" desc = "" @@ -19,27 +19,32 @@ faction = list("cult") flying = 1 universal_speak = 1 + AIStatus = AI_OFF //normal constructs don't have AI + var/const_type = "shade" var/list/construct_spells = list() + var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this." loot = list(/obj/item/weapon/reagent_containers/food/snacks/ectoplasm) del_on_death = 1 deathmessage = "collapses in a shattered heap." -/mob/living/simple_animal/construct/New() +/mob/living/simple_animal/hostile/construct/New() ..() - name = text("[initial(name)] ([rand(1, 1000)])") - real_name = name + name = "[ticker.mode.cultdat.get_name(const_type)] ([rand(1, 1000)])" + real_name = ticker.mode.cultdat.get_name(const_type) + icon_state = ticker.mode.cultdat.get_icon(const_type) for(var/spell in construct_spells) AddSpell(new spell(null)) - updateglow() -/mob/living/simple_animal/construct/examine(mob/user) - to_chat(user, "*---------*") + if(ticker.mode.cultdat.theme == "blood") + updateglow() + +/mob/living/simple_animal/hostile/construct/examine(mob/user) ..(user) - var/msg = "" - if(src.health < src.maxHealth) + var/msg = "" + if (src.health < src.maxHealth) msg += "" - if(src.health >= src.maxHealth/2) + if (src.health >= src.maxHealth/2) msg += "It looks slightly dented.\n" else msg += "It looks severely dented!\n" @@ -48,32 +53,34 @@ to_chat(user, msg) -/mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob) - if(istype(M, /mob/living/simple_animal/construct/builder)) - health += 5 - M.custom_emote(1,"mends some of \the [src]'s wounds.") - else - if(M.melee_damage_upper <= 0) - M.custom_emote(1, "[M.friendly] \the [src]") +/mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M) + if(istype(M, /mob/living/simple_animal/hostile/construct/builder)) + if(health < maxHealth) + adjustBruteLoss(-5) + if(src != M) + Beam(M,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=4) + M.visible_message("[M] repairs some of \the [src]'s dents.", \ + "You repair some of [src]'s dents, leaving [src] at [health]/[maxHealth] health.") + else + M.visible_message("[M] repairs some of its own dents.", \ + "You repair some of your own dents, leaving you at [M.health]/[M.maxHealth] health.") else - M.do_attack_animation(src) - if(M.attack_sound) - playsound(loc, M.attack_sound, 50, 1, 1) - for(var/mob/O in viewers(src, null)) - O.show_message("\The [M] [M.attacktext] \the [src]!", 1) - add_logs(M, src, "attacked") - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - adjustBruteLoss(damage) + if(src != M) + to_chat(M, "You cannot repair [src]'s dents, as it has none!") + else + to_chat(M, "You cannot repair your own dents, as you have none!") + else if(src != M) + ..() -/mob/living/simple_animal/construct/narsie_act() +/mob/living/simple_animal/hostile/construct/narsie_act() return /////////////////Juggernaut/////////////// -/mob/living/simple_animal/construct/armoured +/mob/living/simple_animal/hostile/construct/armoured name = "Juggernaut" real_name = "Juggernaut" desc = "A possessed suit of armour driven by the will of the restless dead" @@ -91,15 +98,22 @@ environment_smash = 2 attack_sound = 'sound/weapons/punch3.ogg' status_flags = 0 + const_type = "juggernaut" construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall) force_threshold = 11 + playstyle_string = "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, \ + create shield walls, rip apart enemies and walls alike, and even deflect energy weapons." -/mob/living/simple_animal/construct/armoured/Life() +/mob/living/simple_animal/hostile/construct/armoured/hostile //actually hostile, will move around, hit things + AIStatus = AI_ON + environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP + +/mob/living/simple_animal/hostile/construct/armoured/Life() weakened = 0 return ..() -/mob/living/simple_animal/construct/armoured/bullet_act(var/obj/item/projectile/P) +/mob/living/simple_animal/hostile/construct/armoured/bullet_act(var/obj/item/projectile/P) if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) var/reflectchance = 80 - round(P.damage/3) if(prob(reflectchance)) @@ -132,7 +146,7 @@ -/mob/living/simple_animal/construct/wraith +/mob/living/simple_animal/hostile/construct/wraith name = "Wraith" real_name = "Wraith" desc = "A wicked bladed shell contraption piloted by a bound spirit" @@ -146,15 +160,19 @@ attacktext = "slashes" see_in_dark = 7 attack_sound = 'sound/weapons/bladeslice.ogg' + const_type = "wraith" construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift) + retreat_distance = 2 //AI wraiths will move in and out of combat + playstyle_string = "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." - +/mob/living/simple_animal/hostile/construct/wraith/hostile //actually hostile, will move around, hit things + AIStatus = AI_ON /////////////////////////////Artificer///////////////////////// -/mob/living/simple_animal/construct/builder +/mob/living/simple_animal/hostile/construct/builder name = "Artificer" real_name = "Artificer" desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies" @@ -169,18 +187,70 @@ melee_damage_upper = 5 attacktext = "rams" environment_smash = 2 + retreat_distance = 10 + minimum_distance = 10 //AI artificers will flee like fuck attack_sound = 'sound/weapons/punch2.ogg' + const_type = "builder" construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser, /obj/effect/proc_holder/spell/aoe_turf/conjure/wall, /obj/effect/proc_holder/spell/aoe_turf/conjure/floor, + /obj/effect/proc_holder/spell/aoe_turf/conjure/pylon, /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone, /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser) + playstyle_string = "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, \ + use magic missile, repair allied constructs (by clicking on them), \ + and, most important of all, create new constructs by producing soulstones to capture souls, \ + and shells to place those soulstones into." + + +/mob/living/simple_animal/hostile/construct/builder/Found(atom/A) //what have we found here? + if(istype(A, /mob/living/simple_animal/hostile/construct)) //is it a construct? + var/mob/living/simple_animal/hostile/construct/C = A + if(C.health < C.maxHealth) //is it hurt? let's go heal it if it is + return 1 + else + return 0 + else + return 0 + +/mob/living/simple_animal/hostile/construct/builder/CanAttack(atom/the_target) + if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it + return 0 + if(Found(the_target) || ..()) //If we Found it or Can_Attack it normally, we Can_Attack it as long as it wasn't invisible + return 1 //as a note this shouldn't be added to base hostile mobs because it'll mess up retaliate hostile mobs + +/mob/living/simple_animal/hostile/construct/builder/MoveToTarget(var/list/possible_targets) + ..() + if(isliving(target)) + var/mob/living/L = target + if(istype(L, /mob/living/simple_animal/hostile/construct) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it + LoseTarget() + return 0 + if(L.health <= melee_damage_lower+melee_damage_upper) //ey bucko you're hurt as fuck let's go hit you + retreat_distance = null + minimum_distance = 1 + +/mob/living/simple_animal/hostile/construct/builder/Aggro() + ..() + if(istype(target, /mob/living/simple_animal/hostile/construct)) //oh the target is a construct no need to flee + retreat_distance = null + minimum_distance = 1 + +/mob/living/simple_animal/hostile/construct/builder/LoseAggro() + ..() + retreat_distance = initial(retreat_distance) + minimum_distance = initial(minimum_distance) + +/mob/living/simple_animal/hostile/construct/builder/hostile //actually hostile, will move around, hit things, heal other constructs + AIStatus = AI_ON + environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP + /////////////////////////////Behemoth///////////////////////// -/mob/living/simple_animal/construct/behemoth +/mob/living/simple_animal/hostile/construct/behemoth name = "Behemoth" real_name = "Behemoth" desc = "The pinnacle of occult technology, Behemoths are the ultimate weapon in the Cult of Nar-Sie's arsenal." @@ -199,13 +269,22 @@ environment_smash = 2 attack_sound = 'sound/weapons/punch4.ogg' force_threshold = 11 + const_type = "behemoth" var/energy = 0 var/max_energy = 1000 +/mob/living/simple_animal/hostile/construct/behemoth/hostile //actually hostile, will move around, hit things + AIStatus = AI_ON + environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP + +/mob/living/simple_animal/hostile/construct/behemoth/Life() + weakened = 0 + return ..() + /////////////////////////////Harvester///////////////////////// -/mob/living/simple_animal/construct/harvester +/mob/living/simple_animal/hostile/construct/harvester name = "Harvester" real_name = "Harvester" desc = "A harbinger of Nar-Sie's enlightenment. It'll be all over soon." @@ -219,16 +298,25 @@ attacktext = "prods" speed = 0 environment_smash = 1 - see_in_dark = 7 + see_in_dark = 8 attack_sound = 'sound/weapons/tap.ogg' + const_type = "harvester" construct_spells = list(/obj/effect/proc_holder/spell/targeted/smoke/disable) + retreat_distance = 2 //AI harvesters will move in and out of combat, like wraiths, but shittier + playstyle_string = "You are a Harvester. You are not strong, but your powers of domination will assist you in your role: \ + Bring those who still cling to this world of illusion back to the master so they may know Truth." -/mob/living/simple_animal/construct/harvester/Process_Spacemove(var/movement_dir = 0) + +/mob/living/simple_animal/hostile/construct/harvester/Process_Spacemove(var/movement_dir = 0) return 1 +/mob/living/simple_animal/hostile/construct/harvester/hostile //actually hostile, will move around, hit things + AIStatus = AI_ON + + ////////////////Glow//////////////////// -/mob/living/simple_animal/construct/proc/updateglow() +/mob/living/simple_animal/hostile/construct/proc/updateglow() overlays = 0 var/overlay_layer = LIGHTING_LAYER + 1 if(layer != MOB_LAYER) @@ -245,7 +333,7 @@ set category = "Behemoth" set name = "Summon Cultist (300)" set desc = "Teleport a cultist to your location" - if(istype(usr,/mob/living/simple_animal/constructbehemoth)) + if (istype(usr,/mob/living/simple_animal/hostile/constructbehemoth)) if(usr.energy<300) to_chat(usr, "\red You do not have enough power stored!") @@ -257,12 +345,86 @@ usr.energy -= 300 var/list/mob/living/cultists = new for(var/datum/mind/H in ticker.mode.cult) - if(istype(H.current,/mob/living)) + if (istype(H.current,/mob/living)) cultists+=H.current var/mob/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - usr) if(!cultist) return - if(cultist == usr) //just to be sure. + if (cultist == usr) //just to be sure. return cultist.loc = usr.loc usr.visible_message("/red [cultist] appears in a flash of red light as [usr] glows with power")*/ + + +///ui stuff + +/mob/living/simple_animal/hostile/construct/armoured/handle_hud_icons_health() + ..() + if(healths) + switch(health) + if(250 to INFINITY) healths.icon_state = "juggernaut_health0" + if(208 to 249) healths.icon_state = "juggernaut_health1" + if(167 to 207) healths.icon_state = "juggernaut_health2" + if(125 to 166) healths.icon_state = "juggernaut_health3" + if(84 to 124) healths.icon_state = "juggernaut_health4" + if(42 to 83) healths.icon_state = "juggernaut_health5" + if(1 to 41) healths.icon_state = "juggernaut_health6" + else healths.icon_state = "juggernaut_health7" + + +/mob/living/simple_animal/hostile/construct/behemoth/handle_hud_icons_health() + ..() + if(healths) + switch(health) + if(750 to INFINITY) healths.icon_state = "juggernaut_health0" + if(625 to 749) healths.icon_state = "juggernaut_health1" + if(500 to 624) healths.icon_state = "juggernaut_health2" + if(375 to 499) healths.icon_state = "juggernaut_health3" + if(250 to 374) healths.icon_state = "juggernaut_health4" + if(125 to 249) healths.icon_state = "juggernaut_health5" + if(1 to 124) healths.icon_state = "juggernaut_health6" + else healths.icon_state = "juggernaut_health7" + +/mob/living/simple_animal/hostile/construct/builder/handle_hud_icons_health() + ..() + if(healths) + switch(health) + if(50 to INFINITY) healths.icon_state = "artificer_health0" + if(42 to 49) healths.icon_state = "artificer_health1" + if(34 to 41) healths.icon_state = "artificer_health2" + if(26 to 33) healths.icon_state = "artificer_health3" + if(18 to 25) healths.icon_state = "artificer_health4" + if(10 to 17) healths.icon_state = "artificer_health5" + if(1 to 9) healths.icon_state = "artificer_health6" + else healths.icon_state = "artificer_health7" + + + +/mob/living/simple_animal/hostile/construct/wraith/handle_hud_icons_health() + + ..() + if(healths) + switch(health) + if(75 to INFINITY) healths.icon_state = "wraith_health0" + if(62 to 74) healths.icon_state = "wraith_health1" + if(50 to 61) healths.icon_state = "wraith_health2" + if(37 to 49) healths.icon_state = "wraith_health3" + if(25 to 36) healths.icon_state = "wraith_health4" + if(12 to 24) healths.icon_state = "wraith_health5" + if(1 to 11) healths.icon_state = "wraith_health6" + else healths.icon_state = "wraith_health7" + + +/mob/living/simple_animal/hostile/construct/harvester/handle_hud_icons_health() + + ..() + if(healths) + switch(health) + if(150 to INFINITY) healths.icon_state = "harvester_health0" + if(125 to 149) healths.icon_state = "harvester_health1" + if(100 to 124) healths.icon_state = "harvester_health2" + if(75 to 99) healths.icon_state = "harvester_health3" + if(50 to 74) healths.icon_state = "harvester_health4" + if(25 to 49) healths.icon_state = "harvester_health5" + if(1 to 24) healths.icon_state = "harvester_health6" + else healths.icon_state = "harvester_health7" \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 37bb39b7754..6aa69787090 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -129,6 +129,7 @@ var/datum/dna/dna = null//Carbon var/radiation = 0 //Carbon + var/cultslurring = 0 var/list/mutations = list() //Carbon -- Doohl //see: setup.dm for list of mutations diff --git a/code/modules/mob/spirit/movement.dm b/code/modules/mob/spirit/movement.dm index b014fb42927..c3a780c07ed 100644 --- a/code/modules/mob/spirit/movement.dm +++ b/code/modules/mob/spirit/movement.dm @@ -29,26 +29,6 @@ mob/spirit/proc/Spirit_Move(direct) // if we're trying to move, we want to stop following our target follow_target = null - -/mob/spirit/proc/follow_cultist(mob/living/target as mob) - if(!istype(target)) return - var/obj/cult_viewpoint/currentView = getCultViewpoint(target) - var/mob/spirit/U = usr - - if(!currentView) - to_chat(U, "As a spirit, you may only track cultists.") - - U.follow_target = target - to_chat(U, "Now following [currentView.get_cult_name()].") - - spawn (0) - while(U.follow_target == target) - if(U.follow_target == null) - return - U.setLoc(get_turf(target)) - sleep(10) - - mob/spirit/setLoc(var/T) T = get_turf(T) loc = T diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 98e33ee5f6b..ea710335c77 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -70,56 +70,6 @@ qdel(src) return O -/mob/living/carbon/human/make_into_mask(var/should_gib = 0) - for(var/t in organs) - qdel(t) - return ..(should_gib) - - -/mob/proc/make_into_mask(var/should_gib = 0, var/should_remove_items = 0) - - if(!should_gib) - icon = null - invisibility = 101 - - if(!should_remove_items) - for(var/obj/item/W in src) - unEquip(W) - - var/mob/spirit/mask/new_spirit = new() - - if(mind) - new_spirit.mind = mind - new_spirit.mind.assigned_role = "Mask" - new_spirit.mind.original = new_spirit - - new_spirit.key = key - new_spirit.loc=loc - - if(should_gib) - spawn(0) - src.gib() // gib the body - else - spawn(0)//To prevent the proc from returning null. - src.visible_message( \ - "[src] disappears into the shadows, never to be seen again.", \ - "You disappear into the shadows, never to be seen again.", \ - "You hear strange noise, you can't quite place it.") - qdel(src) - - to_chat(new_spirit, "You are a Mask of Nar'sie now. You are a tiny fragment of the unknowable entity that is the god.") - to_chat(new_spirit, "Your job is to help your acolytes complete their goals. Be spooky. Do evil.") - - new_spirit.set_name() - - // let spirits identify cultists - if(ticker.mode) - ticker.mode.add_cult_icon_to_spirit(new_spirit) - - // highlander test - there_can_be_only_one_mask(new_spirit) - - return new_spirit //human -> robot diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index eb54497b69e..795e94f1d61 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -24,6 +24,8 @@ /obj/singularity/narsie/large/New() ..() + icon_state = ticker.mode.cultdat.entity_icon_state + name = ticker.mode.cultdat.entity_name to_chat(world, "NAR-SIE HAS RISEN") world << pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg')) @@ -38,7 +40,7 @@ shuttle_master.emergency.request(null, 0.3) // Cannot recall /obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) - makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1) + makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, user, null, 1) new /obj/effect/effect/sleep_smoke(user.loc) @@ -121,12 +123,12 @@ /obj/singularity/narsie/proc/acquire(var/mob/food) - to_chat(target, "NAR-SIE HAS LOST INTEREST IN YOU") + to_chat(target, "[uppertext(ticker.mode.cultdat.entity_name)] HAS LOST INTEREST IN YOU") target = food if(ishuman(target)) - to_chat(target, "NAR-SIE HUNGERS FOR YOUR SOUL") + to_chat(target, "[uppertext(ticker.mode.cultdat.entity_name)] HUNGERS FOR YOUR SOUL") else - to_chat(target, "NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL") + to_chat(target, "[uppertext(ticker.mode.cultdat.entity_name)] HAS CHOSEN YOU TO LEAD HER TO HER NEXT MEAL") //Wizard narsie /obj/singularity/narsie/wizard diff --git a/data/mode.txt b/data/mode.txt index ef18df98db4..53cfb4d03af 100644 --- a/data/mode.txt +++ b/data/mode.txt @@ -1 +1 @@ -extended +cult diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 725d97ce21bc24dca242f19132fdcc63aadebf09..95d8f86e425382cbe01726f40b78f54418a25936 100644 GIT binary patch literal 370973 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

f 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%0D)v&)tqp< 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

!0B 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