diff --git a/code/WorkInProgress/cloning.dm b/code/WorkInProgress/cloning.dm index 313399ef83a..640aac5e58c 100644 --- a/code/WorkInProgress/cloning.dm +++ b/code/WorkInProgress/cloning.dm @@ -483,6 +483,10 @@ if ((src.occupant.mind in ticker.mode:revolutionaries) || (src.occupant.mind in ticker.mode:head_revolutionaries)) ticker.mode:add_revolutionary(src.occupant.mind) ticker.mode:update_all_rev_icons() //So the icon actually appears + if ("cult") + if (src.occupant.mind in ticker.mode:cult) + ticker.mode:add_cultist(src.occupant.mind) + ticker.mode:update_all_cult_icons() //So the icon actually appears if ("changeling") if (src.occupant.mind in ticker.mode:changelings) src.occupant.make_changeling() diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm new file mode 100644 index 00000000000..94e4053df7a --- /dev/null +++ b/code/game/gamemodes/cult/cult.dm @@ -0,0 +1,313 @@ +// To add a rev to the list of revolutionaries, make sure it's rev (with if(ticker.mode.name == "revolution)), +// then call ticker.mode:add_revolutionary(_THE_PLAYERS_MIND_) +// nothing else needs to be done, as that proc will check if they are a valid target. +// Just make sure the converter is a head before you call it! +// To remove a rev (from brainwashing or w/e), call ticker.mode:remove_revolutionary(_THE_PLAYERS_MIND_), +// this will also check they're not a head, so it can just be called freely +// If the rev icons start going wrong for some reason, ticker.mode:update_all_rev_icons() can be called to correct them. +// If the game somtimes isn't registering a win properly, then ticker.mode.check_win() isn't being called somewhere. + +/datum/game_mode/cult + name = "cult" + config_tag = "cult" + + var/list/datum/mind/cult = list() + var/finished = 0 + var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) + var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) + + +/datum/game_mode/cult/announce() + world << "The current game mode is - Cult!" + world << "Some crewmembers are attempting to start a cult!
\nCultists - Kill the Captain, HoP, RD, CE and HoS. Convert other crewmembers (excluding the heads, security officers and chaplain) to your cause by using the convert rune. Remember - there is no you, there is only the cult.
\nPersonnel - Protect the heads. Destroy the cult either via killing the cultists or brainwashing them with the chaplain's bible.
" + +/datum/game_mode/cult/post_setup() + + var/list/cultists_possible = list() + cultists_possible = get_possible_cultists() + var/list/heads = list() + heads = get_living_heads() + var/cultists_number = 0 + + if(!cultists_possible || !heads) + world << " \red Not enough players for cult game mode. Restarting world in 5 seconds." + sleep(50) + world.Reboot() + return + + if(cultists_possible.len >= 3) + cultists_number = 3 + else + cultists_number = cultists_possible.len + + while(cultists_number > 0) + cult += pick(cultists_possible) + cultists_possible -= cult + cultists_number-- + + for(var/datum/mind/cult_mind in cult) + for(var/datum/mind/head_mind in heads) + var/datum/objective/assassinate/cult_obj = new + cult_obj.owner = cult_mind + cult_obj.find_target_by_role(head_mind.assigned_role) + cult_mind.objectives += cult_obj + + equip_cultist(cult_mind.current) + update_cult_icons_added(cult_mind) + + for(var/datum/mind/cult_mind in cult) + var/obj_count = 1 + cult_mind.current << "\blue You are a member of the cult!" + for(var/datum/objective/objective in cult_mind.objectives) + cult_mind.current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + + spawn (rand(waittime_l, waittime_h)) + send_intercept() + +/datum/game_mode/cult/proc/equip_cultist(mob/living/carbon/human/cult_mob) + if(!istype(cult_mob)) + return + spawn (0) + var/obj/item/weapon/paper/talisman/supply/T = null + cult_mob.equip_if_possible(new /obj/item/weapon/paper/talisman/supply(cult_mob), cult_mob.slot_l_store) + if (!T && istype(cult_mob.l_store, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = cult_mob.l_store + var/list/L = S.return_inv() + for (var/obj/item/weapon/paper/talisman/supply/foo in L) + T = foo + break + if (!T) + cult_mob << "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately." + else + cult_mob << "You have a talisman in your backpack, one that will help you start the cult on this station. Use it well and remember - there are others." + if(!wordtravel) + runerandom() + var/word=pick("1","2","3","4","5","6","7","8") + switch(word) + if("1") + cult_mob << "\red You remembered one thing from the dark teachings of your master... [wordtravel] is travel..." + if("2") + cult_mob << "\red You remembered one thing from the dark teachings of your master... [wordblood] is blood..." + if("3") + cult_mob << "\red You remembered one thing from the dark teachings of your master... [wordjoin] is join..." + if("4") + cult_mob << "\red You remembered one thing from the dark teachings of your master... [wordhell] is Hell..." + if("5") + cult_mob << "\red You remembered one thing from the dark teachings of your master... [worddestr] is destroy..." + if("6") + cult_mob << "\red You remembered one thing from the dark teachings of your master... [wordtech] is technology..." + if("7") + cult_mob << "\red You remembered one thing from the dark teachings of your master... [wordself] is self..." + if("8") + cult_mob << "\red You remembered one thing from the dark teachings of your master... [wordsee] is see..." + +/datum/game_mode/cult/send_intercept() + var/intercepttext = "Cent. Com. Update Requested staus information:
" + intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" + + var/list/possible_modes = list() + possible_modes.Add("revolution", "cult", "wizard", "nuke", "traitor", "malf", "changeling") + possible_modes -= "[ticker.mode]" + var/number = pick(2, 3) + var/i = 0 + for(i = 0, i < number, i++) + possible_modes.Remove(pick(possible_modes)) + possible_modes.Insert(rand(possible_modes.len), "[ticker.mode]") + + var/datum/intercept_text/i_text = new /datum/intercept_text + for(var/A in possible_modes) + intercepttext += i_text.build(A, pick(cult)) + + for (var/obj/machinery/computer/communications/comm in world) + if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) + var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) + intercept.name = "paper- 'Cent. Com. Status Summary'" + intercept.info = intercepttext + + comm.messagetitle.Add("Cent. Com. Status Summary") + comm.messagetext.Add(intercepttext) + + command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") + world << sound('intercept.ogg') + + +/datum/game_mode/cult/check_win() + if(check_cult_victory()) + finished = 1 + else if(check_heads_victory()) + finished = 2 + return + +/datum/game_mode/cult/check_finished() + if(finished != 0) + return 1 + else + return 0 + +/datum/game_mode/cult/proc/add_cultist(datum/mind/cult_mind) + var/list/uncons = get_unconvertables() + if(!(cult_mind in cult) && !(cult_mind in uncons)) + cult += cult_mind + update_cult_icons_added(cult_mind) + +/datum/game_mode/cult/proc/remove_cultist(datum/mind/cult_mind) + if(cult_mind in cult) + cult -= cult_mind + cult_mind.current << "\red You have been brainwashed! You are no longer a cultist!" + update_cult_icons_removed(cult_mind) + for(var/mob/living/M in view(cult_mind.current)) + M << "[cult_mind.current] looks like they just reverted to their old faith!" + +/datum/game_mode/cult/proc/update_all_cult_icons() + spawn(0) + for(var/datum/mind/cultist in cult) + if(cultist.current) + if(cultist.current.client) + for(var/image/I in cultist.current.client.images) + if(I.icon_state == "cult") + del(I) + + for(var/datum/mind/cultist in cult) + if(cultist.current) + if(cultist.current.client) + for(var/datum/mind/cultist_1 in cult) + if(cultist_1.current) + var/I = image('mob.dmi', loc = cultist_1.current, icon_state = "cult") + cultist.current.client.images += I + +/datum/game_mode/cult/proc/update_cult_icons_added(datum/mind/cult_mind) + spawn(0) + for(var/datum/mind/cultist in cult) + if(cultist.current) + if(cultist.current.client) + var/I = image('mob.dmi', loc = cult_mind.current, icon_state = "cult") + cultist.current.client.images += I + if(cult_mind.current) + if(cult_mind.current.client) + var/image/J = image('mob.dmi', loc = cultist.current, icon_state = "cult") + cult_mind.current.client.images += J + +/datum/game_mode/cult/proc/update_cult_icons_removed(datum/mind/cult_mind) + spawn(0) + for(var/datum/mind/cultist in cult) + if(cultist.current) + if(cultist.current.client) + for(var/image/I in cultist.current.client.images) + if(I.loc == cult_mind.current) + del(I) + + if(cult_mind.current) + if(cult_mind.current.client) + for(var/image/I in cult_mind.current.client.images) + if(I.icon_state == "cult") + del(I) + +/datum/game_mode/cult/proc/get_possible_cultists() + var/list/candidates = list() + + for(var/mob/living/carbon/human/player in world) + if(player.client) + if(player.be_syndicate) + candidates += player.mind + + if(candidates.len < 1) + for(var/mob/living/carbon/human/player in world) + if(player.client) + candidates += player.mind + + var/list/uncons = get_unconvertables() + for(var/datum/mind/mind in uncons) + candidates -= mind + + if(candidates.len < 1) + return null + else + return candidates + +/datum/game_mode/cult/proc/get_living_heads() + var/list/heads = list() + + for(var/mob/living/carbon/human/player in world) + if(player.mind) + var/role = player.mind.assigned_role + if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) + heads += player.mind + + return heads + + +/datum/game_mode/cult/proc/get_all_heads() + var/list/heads = list() + + for(var/mob/player in world) + if(player.mind) + var/role = player.mind.assigned_role + if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director")) + heads += player.mind + + return heads + +/datum/game_mode/cult/proc/get_unconvertables() + var/list/ucs = list() + for(var/mob/living/carbon/human/player in world) + if(player.mind) + var/role = player.mind.assigned_role + if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Security Officer", "Detective", "AI", "Chaplain")) + ucs += player.mind + + return ucs + +/datum/game_mode/cult/proc/check_cult_victory() + for(var/datum/mind/cult_mind in cult) + for(var/datum/objective/objective in cult_mind.objectives) + if(!(objective.check_completion())) + return 0 + + return 1 + +/datum/game_mode/cult/proc/check_heads_victory() + for(var/datum/mind/cult_mind in cult) + if(cult_mind.current.stat != 2) + return 0 + return 1 + +/datum/game_mode/cult/declare_completion() + + var/text = "" + if(finished == 1) + world << "\red The heads of staff were killed! The cult win!" + else if(finished == 2) + world << "\red The heads of staff managed to stop the cult!" + + world << "The cultists were: " + for(var/datum/mind/cult_nh_mind in cultists) + if(cult_nh_mind.current) + text += "[cult_nh_mind.current.real_name]" + if(cult_nh_mind.current.stat == 2) + text += " (Dead)" + else + text += " (Survived!)" + else + text += "[cult_nh_mind.key] (character destroyed)" + text += ", " + + world << text + + world << "The heads of staff were: " + var/list/heads = list() + heads = get_all_heads() + for(var/datum/mind/head_mind in heads) + text = "" + if(head_mind.current) + text += "[head_mind.current.real_name]" + if(head_mind.current.stat == 2) + text += " (Dead)" + else + text += " (Survived!)" + else + text += "[head_mind.key] (character destroyed)" + + world << text + + return 1 \ No newline at end of file diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm index f598af6fce9..05a9f22258f 100644 --- a/code/game/gamemodes/intercept_report.dm +++ b/code/game/gamemodes/intercept_report.dm @@ -28,6 +28,10 @@ src.text = "" src.build_rev(correct_mob) return src.text + if("cult") + src.text = "" + src.build_cult(correct_mob) + return src.text if("wizard") src.text = "" src.build_wizard(correct_mob) @@ -85,6 +89,33 @@ src.text += "discovered the following set of fingerprints ([fingerprints]) on sensitive materials, and their owner should be closely observed." src.text += "However, these could also belong to a current Cent. Com employee, so do not act on this without reason." +/datum/intercept_text/proc/build_cult(correct_mob) + var/name_1 = pick(src.org_names_1) + var/name_2 = pick(src.org_names_2) + var/traitor_name + var/traitor_job + var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher) + var/prob_right_job = rand(prob_correct_job_lower, prob_correct_job_higher) + if(prob(prob_right_job)) + if (correct_mob) + traitor_job = correct_mob:assigned_role + else + var/list/job_tmp = get_all_jobs() + job_tmp.Remove("Captain", "Chaplain", "Security Officer", "Detective", "Head Of Security", "Head of Personnel", "Chief Engineer", "Research Director") + traitor_job = pick(job_tmp) + if(prob(prob_right_dude) && ticker.mode == "cult") + traitor_name = correct_mob:current + else + traitor_name = src.pick_mob() + + src.text += "

It has been brought to our attention that the [name_1] [name_2] have stumbled upon some dark secrets. They apparently want to spread the dangerous knowledge on as many stations as they can.
" + src.text += "Based on our intelligence, we are [prob_right_job]% sure that if true, someone doing the job of [traitor_job] on your station may have been converted " + src.text += "and instilled with the idea of the flimsiness of the real world, seeking to destroy it. " + if(prob(prob_right_dude)) + src.text += "
In addition, we are [prob_right_dude]% sure that [traitor_name] may have also some in to contact with this " + src.text += "organisation." + src.text += "
However, if this information is acted on without substantial evidence, those responsible will face severe repercussions." + /datum/intercept_text/proc/build_rev(correct_mob) var/name_1 = pick(src.org_names_1) var/name_2 = pick(src.org_names_2) diff --git a/code/game/gamemodes/wizard/spell10.dm b/code/game/gamemodes/wizard/spell10.dm index 73be5d85001..a6a67f33892 100644 --- a/code/game/gamemodes/wizard/spell10.dm +++ b/code/game/gamemodes/wizard/spell10.dm @@ -17,6 +17,11 @@ spawn(400) usr.verbs += /client/proc/mutate usr.say("BIRUZ BENNAR") + if(!usr.miming) + if(usr.gender=="male") + playsound(usr.loc, pick('vs_chant_conj_hm.wav','vs_chant_conj_lm.wav','vs_chant_ench_hm.wav','vs_chant_ench_lm.wav','vs_chant_evoc_hm.wav','vs_chant_evoc_lm.wav','vs_chant_illu_hm.wav','vs_chant_illu_lm.wav','vs_chant_necr_hm.wav','vs_chant_necr_lm.wav'), 100, 1) + else + playsound(usr.loc, pick('vs_chant_conj_hf.wav','vs_chant_conj_lf.wav','vs_chant_ench_hf.wav','vs_chant_ench_lf.wav','vs_chant_evoc_hf.wav','vs_chant_evoc_lf.wav','vs_chant_illu_hf.wav','vs_chant_illu_lf.wav','vs_chant_necr_hf.wav','vs_chant_necr_lf.wav'), 100, 1) usr << text("\blue You feel strong! Your mind expands!") if (!(usr.mutations & 8)) usr.mutations |= 8 diff --git a/code/game/gamemodes/wizard/spell12.dm b/code/game/gamemodes/wizard/spell12.dm index c1c15f3d12c..e2e433cae7b 100644 --- a/code/game/gamemodes/wizard/spell12.dm +++ b/code/game/gamemodes/wizard/spell12.dm @@ -30,6 +30,12 @@ A = input("Area to jump to", "BOOYEA", A) in theareas var/area/thearea = theareas[A] usr.say("SCYAR NILA [uppertext(A)]") + if(!usr.miming) + if(usr.gender=="male") + playsound(usr.loc, pick('vs_chant_conj_hm.wav','vs_chant_conj_lm.wav','vs_chant_ench_hm.wav','vs_chant_ench_lm.wav','vs_chant_evoc_hm.wav','vs_chant_evoc_lm.wav','vs_chant_illu_hm.wav','vs_chant_illu_lm.wav','vs_chant_necr_hm.wav','vs_chant_necr_lm.wav'), 100, 1) + else + playsound(usr.loc, pick('vs_chant_conj_hf.wav','vs_chant_conj_lf.wav','vs_chant_ench_hf.wav','vs_chant_ench_lf.wav','vs_chant_evoc_hf.wav','vs_chant_evoc_lf.wav','vs_chant_illu_hf.wav','vs_chant_illu_lf.wav','vs_chant_necr_hf.wav','vs_chant_necr_lf.wav'), 100, 1) + var/datum/effects/system/harmless_smoke_spread/smoke = new /datum/effects/system/harmless_smoke_spread() smoke.set_up(5, 0, usr.loc) diff --git a/code/game/gamemodes/wizard/spell14.dm b/code/game/gamemodes/wizard/spell14.dm index ba7637a6efe..f4e1869e076 100644 --- a/code/game/gamemodes/wizard/spell14.dm +++ b/code/game/gamemodes/wizard/spell14.dm @@ -20,6 +20,13 @@ usr.say("NEC CANTIO") + if(!usr.miming) + if(usr.gender=="male") + playsound(usr.loc, pick('vs_chant_conj_hm.wav','vs_chant_conj_lm.wav','vs_chant_ench_hm.wav','vs_chant_ench_lm.wav','vs_chant_evoc_hm.wav','vs_chant_evoc_lm.wav','vs_chant_illu_hm.wav','vs_chant_illu_lm.wav','vs_chant_necr_hm.wav','vs_chant_necr_lm.wav'), 100, 1) + else + playsound(usr.loc, pick('vs_chant_conj_hf.wav','vs_chant_conj_lf.wav','vs_chant_ench_hf.wav','vs_chant_ench_lf.wav','vs_chant_evoc_hf.wav','vs_chant_evoc_lf.wav','vs_chant_illu_hf.wav','vs_chant_illu_lf.wav','vs_chant_necr_hf.wav','vs_chant_necr_lf.wav'), 100, 1) + + var/turf/myturf = get_turf(usr) var/obj/overlay/pulse = new/obj/overlay ( myturf ) diff --git a/code/game/gamemodes/wizard/spell2.dm b/code/game/gamemodes/wizard/spell2.dm index c90ad3fd80d..b95db86c098 100644 --- a/code/game/gamemodes/wizard/spell2.dm +++ b/code/game/gamemodes/wizard/spell2.dm @@ -17,6 +17,11 @@ spawn(600) usr.verbs += /mob/proc/kill usr.say("EI NATH") + if(!usr.miming) + if(usr.gender=="male") + playsound(usr.loc, pick('vs_chant_conj_hm.wav','vs_chant_conj_lm.wav','vs_chant_ench_hm.wav','vs_chant_ench_lm.wav','vs_chant_evoc_hm.wav','vs_chant_evoc_lm.wav','vs_chant_illu_hm.wav','vs_chant_illu_lm.wav','vs_chant_necr_hm.wav','vs_chant_necr_lm.wav'), 100, 1) + else + playsound(usr.loc, pick('vs_chant_conj_hf.wav','vs_chant_conj_lf.wav','vs_chant_ench_hf.wav','vs_chant_ench_lf.wav','vs_chant_evoc_hf.wav','vs_chant_evoc_lf.wav','vs_chant_illu_hf.wav','vs_chant_illu_lf.wav','vs_chant_necr_hf.wav','vs_chant_necr_lf.wav'), 100, 1) var/datum/effects/system/spark_spread/s = new /datum/effects/system/spark_spread s.set_up(4, 1, M) s.start() diff --git a/code/game/gamemodes/wizard/spell3.dm b/code/game/gamemodes/wizard/spell3.dm index 8d12e61f532..59572f3e7a3 100644 --- a/code/game/gamemodes/wizard/spell3.dm +++ b/code/game/gamemodes/wizard/spell3.dm @@ -17,6 +17,11 @@ spawn(100) usr.verbs += /client/proc/knock usr.say("AULIE OXIN FIERA") + if(!usr.miming) + if(usr.gender=="male") + playsound(usr.loc, pick('vs_chant_conj_hm.wav','vs_chant_conj_lm.wav','vs_chant_ench_hm.wav','vs_chant_ench_lm.wav','vs_chant_evoc_hm.wav','vs_chant_evoc_lm.wav','vs_chant_illu_hm.wav','vs_chant_illu_lm.wav','vs_chant_necr_hm.wav','vs_chant_necr_lm.wav'), 100, 1) + else + playsound(usr.loc, pick('vs_chant_conj_hf.wav','vs_chant_conj_lf.wav','vs_chant_ench_hf.wav','vs_chant_ench_lf.wav','vs_chant_evoc_hf.wav','vs_chant_evoc_lf.wav','vs_chant_illu_hf.wav','vs_chant_illu_lf.wav','vs_chant_necr_hf.wav','vs_chant_necr_lf.wav'), 100, 1) for(var/obj/machinery/door/G in oview(3)) spawn(1) G.open() diff --git a/code/game/gamemodes/wizard/spell6.dm b/code/game/gamemodes/wizard/spell6.dm index a1656def96d..e9f9227ef40 100644 --- a/code/game/gamemodes/wizard/spell6.dm +++ b/code/game/gamemodes/wizard/spell6.dm @@ -30,6 +30,11 @@ var/forcefield var/mob/living/carbon/human/G = usr G.say("TARCOL MINTI ZHERI") + if(!usr.miming) + if(usr.gender=="male") + playsound(usr.loc, pick('vs_chant_conj_hm.wav','vs_chant_conj_lm.wav','vs_chant_ench_hm.wav','vs_chant_ench_lm.wav','vs_chant_evoc_hm.wav','vs_chant_evoc_lm.wav','vs_chant_illu_hm.wav','vs_chant_illu_lm.wav','vs_chant_necr_hm.wav','vs_chant_necr_lm.wav'), 100, 1) + else + playsound(usr.loc, pick('vs_chant_conj_hf.wav','vs_chant_conj_lf.wav','vs_chant_ench_hf.wav','vs_chant_ench_lf.wav','vs_chant_evoc_hf.wav','vs_chant_evoc_lf.wav','vs_chant_illu_hf.wav','vs_chant_illu_lf.wav','vs_chant_necr_hf.wav','vs_chant_necr_lf.wav'), 100, 1) forcefield = new /obj/forcefield(locate(usr.x,usr.y,usr.z)) spawn (300) del (forcefield) diff --git a/code/game/gamemodes/wizard/spell9.dm b/code/game/gamemodes/wizard/spell9.dm index b5b3f62aad7..05ad42a76f1 100644 --- a/code/game/gamemodes/wizard/spell9.dm +++ b/code/game/gamemodes/wizard/spell9.dm @@ -17,6 +17,11 @@ spawn(300) usr.verbs += /client/proc/blind usr.say("STI KALY!") + if(!usr.miming) + if(usr.gender=="male") + playsound(usr.loc, pick('vs_chant_conj_hm.wav','vs_chant_conj_lm.wav','vs_chant_ench_hm.wav','vs_chant_ench_lm.wav','vs_chant_evoc_hm.wav','vs_chant_evoc_lm.wav','vs_chant_illu_hm.wav','vs_chant_illu_lm.wav','vs_chant_necr_hm.wav','vs_chant_necr_lm.wav'), 100, 1) + else + playsound(usr.loc, pick('vs_chant_conj_hf.wav','vs_chant_conj_lf.wav','vs_chant_ench_hf.wav','vs_chant_ench_lf.wav','vs_chant_evoc_hf.wav','vs_chant_evoc_lf.wav','vs_chant_illu_hf.wav','vs_chant_illu_lf.wav','vs_chant_necr_hf.wav','vs_chant_necr_lf.wav'), 100, 1) var/obj/overlay/B = new /obj/overlay( M.loc ) B.icon_state = "blspell" B.icon = 'wizard.dmi' diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index a8961d5014d..071a4dc471d 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -391,7 +391,7 @@ if(ticker.mode.name == "blob" || ticker.mode.name == "Corporate Restructuring" || ticker.mode.name == "sandbox") user << "Under directive 7-10, [station_name()] is quarantined until further notice." return - if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "confliction") + if(ticker.mode.name == "revolution" || ticker.mode.name == "cult" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "confliction") user << "Centcom will not allow the shuttle to be called." return if(ticker.mode.name == "nuclear emergency" && world.time < 6000) diff --git a/code/game/magic/cultist/ritual.dm b/code/game/magic/cultist/ritual.dm index c38f3603d94..287a5c4d983 100644 --- a/code/game/magic/cultist/ritual.dm +++ b/code/game/magic/cultist/ritual.dm @@ -351,6 +351,7 @@ var/runedec = 0 /obj/item/weapon/paper/talisman icon_state = "papertalisman" var/imbue = null + var/uses = 0 attack_self(mob/user as mob) usr.bruteloss+=20 @@ -363,6 +364,14 @@ var/runedec = 0 call(/obj/rune/proc/obscure)(2) if("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar") call(/obj/rune/proc/teleport)(imbue) - if(src) + if("communicate") + call(/obj/rune/proc/communicate)() + if("supply") + supply() + if(src && src.imbue!="supply") del(src) - return \ No newline at end of file + return + +/obj/item/weapon/paper/talisman/supply + imbue = "supply" + uses = 3 \ No newline at end of file diff --git a/code/game/magic/cultist/rune12.dm b/code/game/magic/cultist/rune12.dm index c538c589946..c129bac7222 100644 --- a/code/game/magic/cultist/rune12.dm +++ b/code/game/magic/cultist/rune12.dm @@ -10,6 +10,7 @@ del(P) var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(src.loc) T.imbue = "[R.word3]" + T.info = "[R.word3]" del(R) del(src) usr.say("H'drak v'loso, mir'kanas verbot!") diff --git a/code/game/magic/cultist/rune14.dm b/code/game/magic/cultist/rune14.dm new file mode 100644 index 00000000000..cb5595c6d71 --- /dev/null +++ b/code/game/magic/cultist/rune14.dm @@ -0,0 +1,15 @@ +/obj/rune/proc/communicate() + if(istype(src,/obj/rune)) + usr.say("O bidai nabora se'sma!") + else + usr.whisper("O bidai nabora se'sma!") + var/input = input(usr, "Please choose a message to tell to the other acolytes.", "hssss", "") + if(!input) + return fizzle() + if(istype(src,/obj/rune)) + usr.say("[input]") + else + usr.whisper("[input]") + for(var/mob/living/carbon/human/H in cultists) + H << "\red \b [input]" + return \ No newline at end of file diff --git a/code/game/magic/cultist/rune3.dm b/code/game/magic/cultist/rune3.dm index 211368a4dad..c6d13b5fb95 100644 --- a/code/game/magic/cultist/rune3.dm +++ b/code/game/magic/cultist/rune3.dm @@ -8,6 +8,8 @@ for (var/mob/V in viewers(src)) V.show_message("\red [M] writhes in pain as the markings below him glow a bloody red.", 3, "\red You hear an anguished scream.", 2) 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." - 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." + 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." + if(ticker.mode.name == "cult") + ticker.mode:add_cultist(M.mind) return return fizzle() \ No newline at end of file diff --git a/code/game/magic/cultist/specialtalisman.dm b/code/game/magic/cultist/specialtalisman.dm new file mode 100644 index 00000000000..db33f54e4a8 --- /dev/null +++ b/code/game/magic/cultist/specialtalisman.dm @@ -0,0 +1,44 @@ +/obj/item/weapon/paper/talisman/proc/supply(var/key) + 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.
" + usr << browse(dat, "window=id_com;size=350x200") + return + +/obj/item/weapon/paper/talisman/Topic(href, href_list) + if (!src) + return + + if (usr.stat || usr.restrained() || !in_range(src, usr)) + return + + if (!src.uses) + del(src) + return + + if (href_list["rune"]) + switch(href_list["rune"]) + if("newtome") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "newtome" + if("teleport") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "[pick("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar")]" + T.info = "[T.imbue]" + if("emp") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "emp" + if("conceal") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "conceal" + if("communicate") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "communicate" + src.uses-- + supply() + return \ No newline at end of file diff --git a/code/game/objects/storage/bible.dm b/code/game/objects/storage/bible.dm index d18f52acbea..c71e657d1aa 100644 --- a/code/game/objects/storage/bible.dm +++ b/code/game/objects/storage/bible.dm @@ -44,6 +44,8 @@ // return if (M.stat !=2) + if (ticker.mode.name == "cult" && prob(10)) + ticker.mode:remove_cultist(M.mind) if ((istype(M, /mob/living/carbon/human) && prob(60))) bless(M) for(var/mob/O in viewers(M, null)) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 983d725e8bf..250c1a51880 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -265,7 +265,7 @@ var/showadminmessages = 1 Blob
Sandbox
Revolution
- AI Malfunction
+ Cult
AI Malfunction
Death Commando Deathmatch
Confliction (TESTING)
Capture The Flag (Beta)

@@ -302,6 +302,8 @@ var/showadminmessages = 1 master_mode = "wizard" if("revolution") master_mode = "revolution" + if("cult") + master_mode = "cult" if("malfunction") master_mode = "malfunction" if("deathmatch") @@ -663,6 +665,10 @@ var/showadminmessages = 1 else if(M.mind in current_mode:revolutionaries) alert("Is a Revolutionary!") return + if("cult") + if(M.mind in current_mode:cult) + alert("Is a Cultist!") + return if("wizard") if(current_mode:wizard && M.mind == current_mode:wizard) var/datum/mind/antagonist = M.mind @@ -1310,6 +1316,23 @@ var/showadminmessages = 1 dat += "There are no wizards." */ + if("cult") + dat += "
" + for(var/datum/mind/N in ticker.mode:cult) + var/mob/M = N.current + if(M) + dat += "" + dat += "" + dat += "
Cultists
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]PM
" + for(var/datum/mind/N in ticker.mode:get_living_heads()) + var/mob/M = N.current + if(M) + dat += "" + dat += "" + var/turf/mob_loc = get_turf_loc(M) + dat += "" + dat += "
Target(s)Location
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]PM[mob_loc.loc]
" + else // i'll finish this later if(ticker.mode.traitors.len > 0) dat += "
" @@ -1963,6 +1986,9 @@ var/showadminmessages = 1 if("revolution") if(M.mind in (ticker.mode:head_revolutionaries + ticker.mode:revolutionaries)) return 1 + if("cult") + if(M.mind in ticker.mode:cult) + return 1 if("malfunction") if(M.mind in ticker.mode:malf_ai) return 1 diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index a14ebfe8bbb..7359d1cc0e0 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -42,4 +42,7 @@ if(ticker.mode.name == "revolution") if ((src.mind in ticker.mode:revolutionaries) || (src.mind in ticker.mode:head_revolutionaries)) ticker.mode:update_rev_icons_added(src.mind) + if(ticker.mode.name == "cult") + if (src.mind in ticker.mode:cult) + ticker.mode:update_cult_icons_added(src.mind) ..() diff --git a/goonstation.dme b/goonstation.dme index 44a6e383606..7d4e5537f43 100644 --- a/goonstation.dme +++ b/goonstation.dme @@ -31,6 +31,7 @@ #define FILE_DIR "code/game/gamemodes/blob" #define FILE_DIR "code/game/gamemodes/changeling" #define FILE_DIR "code/game/gamemodes/ctf" +#define FILE_DIR "code/game/gamemodes/cult" #define FILE_DIR "code/game/gamemodes/deathmatch" #define FILE_DIR "code/game/gamemodes/extended" #define FILE_DIR "code/game/gamemodes/malfunction" @@ -118,6 +119,7 @@ #define FILE_DIR "sound/machines" #define FILE_DIR "sound/misc" #define FILE_DIR "sound/piano" +#define FILE_DIR "sound/spells" #define FILE_DIR "sound/voice" #define FILE_DIR "sound/weapons" // END_FILE_DIR @@ -269,6 +271,7 @@ #include "code\game\gamemodes\changeling\changeling_powers.dm" #include "code\game\gamemodes\ctf\ctf.dm" #include "code\game\gamemodes\ctf\ctf_items.dm" +#include "code\game\gamemodes\cult\cult.dm" #include "code\game\gamemodes\deathmatch\deathmatch.dm" #include "code\game\gamemodes\extended\extended.dm" #include "code\game\gamemodes\malfunction\Malf_Modules.dm" @@ -380,6 +383,7 @@ #include "code\game\magic\cultist\rune11.dm" #include "code\game\magic\cultist\rune12.dm" #include "code\game\magic\cultist\rune13.dm" +#include "code\game\magic\cultist\rune14.dm" #include "code\game\magic\cultist\rune2.dm" #include "code\game\magic\cultist\rune3.dm" #include "code\game\magic\cultist\rune4.dm" @@ -388,6 +392,7 @@ #include "code\game\magic\cultist\rune7.dm" #include "code\game\magic\cultist\rune8.dm" #include "code\game\magic\cultist\rune9.dm" +#include "code\game\magic\cultist\specialtalisman.dm" #include "code\game\objects\assemblies.dm" #include "code\game\objects\blood.dm" #include "code\game\objects\bomb.dm" diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 55174acf3b9..48725f853d9 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 5d24d2b50bf..ee3da05a3db 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ diff --git a/sound/spells/vs_chant_conj_hf.wav b/sound/spells/vs_chant_conj_hf.wav new file mode 100644 index 00000000000..40c3521e704 Binary files /dev/null and b/sound/spells/vs_chant_conj_hf.wav differ diff --git a/sound/spells/vs_chant_conj_hm.wav b/sound/spells/vs_chant_conj_hm.wav new file mode 100644 index 00000000000..1aa01d0e299 Binary files /dev/null and b/sound/spells/vs_chant_conj_hm.wav differ diff --git a/sound/spells/vs_chant_conj_lf.wav b/sound/spells/vs_chant_conj_lf.wav new file mode 100644 index 00000000000..43cf1a410ea Binary files /dev/null and b/sound/spells/vs_chant_conj_lf.wav differ diff --git a/sound/spells/vs_chant_conj_lm.wav b/sound/spells/vs_chant_conj_lm.wav new file mode 100644 index 00000000000..357a8dd0278 Binary files /dev/null and b/sound/spells/vs_chant_conj_lm.wav differ diff --git a/sound/spells/vs_chant_ench_hf.wav b/sound/spells/vs_chant_ench_hf.wav new file mode 100644 index 00000000000..76a53f2c8d0 Binary files /dev/null and b/sound/spells/vs_chant_ench_hf.wav differ diff --git a/sound/spells/vs_chant_ench_hm.wav b/sound/spells/vs_chant_ench_hm.wav new file mode 100644 index 00000000000..8e78f7faac5 Binary files /dev/null and b/sound/spells/vs_chant_ench_hm.wav differ diff --git a/sound/spells/vs_chant_ench_lf.wav b/sound/spells/vs_chant_ench_lf.wav new file mode 100644 index 00000000000..6015692cce2 Binary files /dev/null and b/sound/spells/vs_chant_ench_lf.wav differ diff --git a/sound/spells/vs_chant_ench_lm.wav b/sound/spells/vs_chant_ench_lm.wav new file mode 100644 index 00000000000..77380c4aca4 Binary files /dev/null and b/sound/spells/vs_chant_ench_lm.wav differ diff --git a/sound/spells/vs_chant_evoc_hf.wav b/sound/spells/vs_chant_evoc_hf.wav new file mode 100644 index 00000000000..f12f83406c9 Binary files /dev/null and b/sound/spells/vs_chant_evoc_hf.wav differ diff --git a/sound/spells/vs_chant_evoc_hm.wav b/sound/spells/vs_chant_evoc_hm.wav new file mode 100644 index 00000000000..fe84aca2df3 Binary files /dev/null and b/sound/spells/vs_chant_evoc_hm.wav differ diff --git a/sound/spells/vs_chant_evoc_lf.wav b/sound/spells/vs_chant_evoc_lf.wav new file mode 100644 index 00000000000..e61a66e0e0c Binary files /dev/null and b/sound/spells/vs_chant_evoc_lf.wav differ diff --git a/sound/spells/vs_chant_evoc_lm.wav b/sound/spells/vs_chant_evoc_lm.wav new file mode 100644 index 00000000000..cf863c0988e Binary files /dev/null and b/sound/spells/vs_chant_evoc_lm.wav differ diff --git a/sound/spells/vs_chant_illu_hf.wav b/sound/spells/vs_chant_illu_hf.wav new file mode 100644 index 00000000000..19a5e1fc34b Binary files /dev/null and b/sound/spells/vs_chant_illu_hf.wav differ diff --git a/sound/spells/vs_chant_illu_hm.wav b/sound/spells/vs_chant_illu_hm.wav new file mode 100644 index 00000000000..dbc97f0cf0f Binary files /dev/null and b/sound/spells/vs_chant_illu_hm.wav differ diff --git a/sound/spells/vs_chant_illu_lf.wav b/sound/spells/vs_chant_illu_lf.wav new file mode 100644 index 00000000000..6af215858be Binary files /dev/null and b/sound/spells/vs_chant_illu_lf.wav differ diff --git a/sound/spells/vs_chant_illu_lm.wav b/sound/spells/vs_chant_illu_lm.wav new file mode 100644 index 00000000000..0ab0594c35b Binary files /dev/null and b/sound/spells/vs_chant_illu_lm.wav differ diff --git a/sound/spells/vs_chant_necr_hf.wav b/sound/spells/vs_chant_necr_hf.wav new file mode 100644 index 00000000000..25d572a6cbb Binary files /dev/null and b/sound/spells/vs_chant_necr_hf.wav differ diff --git a/sound/spells/vs_chant_necr_hm.wav b/sound/spells/vs_chant_necr_hm.wav new file mode 100644 index 00000000000..d3b5000da4c Binary files /dev/null and b/sound/spells/vs_chant_necr_hm.wav differ diff --git a/sound/spells/vs_chant_necr_lf.wav b/sound/spells/vs_chant_necr_lf.wav new file mode 100644 index 00000000000..b62dce03d63 Binary files /dev/null and b/sound/spells/vs_chant_necr_lf.wav differ diff --git a/sound/spells/vs_chant_necr_lm.wav b/sound/spells/vs_chant_necr_lm.wav new file mode 100644 index 00000000000..c58f231f062 Binary files /dev/null and b/sound/spells/vs_chant_necr_lm.wav differ
Traitors