diff --git a/baystation12.dme b/baystation12.dme
index 98fc485a45..d3254ae77a 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -206,6 +206,7 @@
#include "code\game\gamemodes\blob\blobs\factory.dm"
#include "code\game\gamemodes\blob\blobs\node.dm"
#include "code\game\gamemodes\blob\blobs\shield.dm"
+#include "code\game\gamemodes\calamity\calamity.dm"
#include "code\game\gamemodes\changeling\changeling.dm"
#include "code\game\gamemodes\changeling\changeling_powers.dm"
#include "code\game\gamemodes\changeling\modularchangling.dm"
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index b749bfb07e..621b1b6bb9 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -564,7 +564,7 @@ datum/mind
current << "\red Revolution has been disappointed of your leader traits! You are a regular revolutionary now!"
else if(!(src in ticker.mode.revolutionaries))
current << "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!"
- current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
+ show_objectives(src)
else
return
ticker.mode.revolutionaries += src
@@ -577,7 +577,7 @@ datum/mind
ticker.mode.revolutionaries -= src
ticker.mode.update_rev_icons_removed(src)
current << "\red You have proved your devotion to revoltion! You are a head revolutionary now!"
- current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
+ show_objectives(src)
else if(!(src in ticker.mode.head_revolutionaries))
current << "\blue You are a member of the revolutionaries' leadership now!"
else
@@ -656,11 +656,11 @@ datum/mind
special_role = "Cultist"
current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie."
current << "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."
- current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
var/datum/game_mode/cult/cult = ticker.mode
if (istype(cult))
if(!config.objectives_disabled)
cult.memorize_cult_objectives(src)
+ show_objectives(src)
log_admin("[key_name_admin(usr)] has cult'ed [current].")
if("tome")
var/mob/living/carbon/human/H = current
@@ -701,7 +701,7 @@ datum/mind
special_role = "Wizard"
//ticker.mode.learn_basic_spells(current)
current << "\red You are the Space Wizard!"
- current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
+ show_objectives(src)
log_admin("[key_name_admin(usr)] has wizard'ed [current].")
if("lair")
current.loc = pick(wizardstart)
@@ -732,8 +732,7 @@ datum/mind
ticker.mode.grant_changeling_powers(current)
special_role = "Changeling"
current << "Your powers are awoken. A flash of memory returns to us...we are a changeling!"
- if(config.objectives_disabled)
- current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
+ show_objectives(src)
log_admin("[key_name_admin(usr)] has changeling'ed [current].")
if("autoobjectives")
if(!config.objectives_disabled)
@@ -774,10 +773,7 @@ datum/mind
current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]"
special_role = "Syndicate"
current << "\blue You are a [syndicate_name()] agent!"
- if(config.objectives_disabled)
- current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
- else
- ticker.mode.forge_syndicate_objectives(src)
+ ticker.mode.forge_syndicate_objectives(src)
ticker.mode.greet_syndicate(src)
log_admin("[key_name_admin(usr)] has nuke op'ed [current].")
if("lair")
@@ -829,8 +825,8 @@ datum/mind
special_role = "traitor"
current << "\red You are a traitor!"
log_admin("[key_name_admin(usr)] has traitor'ed [current].")
- if (config.objectives_disabled)
- current << "You have been turned into an antagonist- Within the rules, try to act as an opposing force to the crew- This can be via corporate payoff, personal motives, or maybe just being a dick. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonist."
+ show_objectives()
+
if(istype(current, /mob/living/silicon))
var/mob/living/silicon/A = current
call(/datum/game_mode/proc/add_law_zero)(A)
diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm
index 882f161842..898378543d 100644
--- a/code/game/gamemodes/autotraitor/autotraitor.dm
+++ b/code/game/gamemodes/autotraitor/autotraitor.dm
@@ -136,14 +136,9 @@
newtraitor << "You are now a traitor."
newtraitor.mind.special_role = "traitor"
newtraitor.hud_updateflag |= 1 << SPECIALROLE_HUD
- var/obj_count = 1
- newtraitor << "\blue Your current objectives:"
- if(!config.objectives_disabled)
- for(var/datum/objective/objective in newtraitor.mind.objectives)
- newtraitor << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
- else
- newtraitor << "You have been selected this round as an antagonist- Within the rules, try to act as an opposing force to the crew- This can be via corporate payoff, personal motives, or maybe just being a dick. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonist."
+ newtraitor << "You have been selected this round as an antagonist!"
+ show_objectives(newtraitor.mind)
+
//else
//message_admins("No new traitor being added.")
//else
@@ -194,14 +189,9 @@
traitors += character.mind
character << "\red You are the traitor."
character.mind.special_role = "traitor"
- if (config.objectives_disabled)
- character << "You have been selected this round as an antagonist- Within the rules, try to act as an opposing force to the crew- This can be via corporate payoff, personal motives, or maybe just being a dick. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonist."
- else
- var/obj_count = 1
- character << "\blue Your current objectives:"
- for(var/datum/objective/objective in character.mind.objectives)
- character << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
+ character << "You have been selected this round as an antagonist!"
+ show_objectives(character.mind)
+
//else
//message_admins("New traitor roll failed. No new traitor.")
//else
diff --git a/code/game/gamemodes/calamity/calamity.dm b/code/game/gamemodes/calamity/calamity.dm
new file mode 100644
index 0000000000..c2ab3202f4
--- /dev/null
+++ b/code/game/gamemodes/calamity/calamity.dm
@@ -0,0 +1,449 @@
+/*
+ * This roundtype is a replacement for the meteor round on upstream BS12 - players
+ * expressed the desire for quick, chaotic and violent rounds, preferrably without
+ * dependancy on other players.
+ * I wanted to call it clusterfuck, but I figure that's a bit too overt. Think of
+ * the children.
+ * ~ Zuhayr
+ */
+
+/datum/game_mode/calamity
+ name = "calamity"
+ config_tag = "calamity"
+ required_players = 1
+ votable = 0 //Remove after testing.
+
+ uplink_welcome = "Syndicate Uplink Console:"
+ uplink_uses = 10
+
+ //Possible roundstart antag types.
+ var/list/atypes = list("syndi","ling","tater","wiz","ninja","vox","slug","cult")
+ var/list/chosen_atypes = list()
+ var/list/chosen_candidates = list()
+ var/list/already_assigned_candidates = list()
+
+ //At one antagonist group per 10 players we are just going to go with tiny groups.
+ var/max_antags = 3 // Antag groups spawn with this many members.
+ var/antag_type_ratio = 10 // 1 antag type per this many players.
+
+ var/const/waittime_l = 600
+ var/const/waittime_h = 1800
+
+/datum/game_mode/calamity/announce()
+ world << "The current game mode is - Calamity!"
+ world << "This must be a Thursday. You never could get the hang of Thursdays..."
+
+/datum/game_mode/calamity/can_start()
+
+ if(!..())
+ return 0
+
+ var/antag_count = player_list.len/antag_type_ratio
+
+ if(!antag_count)
+ return 1
+
+ for(var/i=0;iThis terrible, terrible day has finally ended!
"
+
+ //Group antag objective completion.
+ for(var/list/L in list(src.raiders, src.syndicates, src.cult, src.wizards))
+
+ if(L.len)
+ var/datum/mind/M = L[1]
+ text = "
The [M.special_role][L.len == 1 ? " was" : "s were"]:"
+
+ for(var/datum/mind/P in L)
+ text += "
[P.key] was [P.name] ("
+ if(P.current)
+ if(P.current.stat == DEAD)
+ text += "died"
+ else
+ text += "survived"
+ if(P.current.real_name != P.name)
+ text += " as [P.current.real_name]"
+ else
+ text += "body destroyed"
+ text += ")"
+
+ if(M.objectives.len)
+ text += "
Their objectives were:"
+ var/num = 1
+ for(var/datum/objective/O in M.objectives)
+ text += "
Objective [num]: [O.explanation_text]"
+ num++
+
+ //Single antag objective completion.
+ for(var/list/L in list(src.changelings, src.ninjas, src.borers, src.traitors))
+
+ if(L.len)
+ var/datum/mind/M = L[1]
+ text = "
The [M.special_role][L.len == 1 ? " was" : "s were"]:"
+ for(var/datum/mind/P in L)
+ var/num = 1
+ text += "
[P.key] was [P.name]."
+ if(P.objectives.len)
+ for(var/datum/objective/O in P.objectives)
+ text += "
Objective [num]: [O.explanation_text]"
+ num++
+ ..()
+ return 1
+
+//Converts chosen atype to an actual role string.
+/datum/game_mode/calamity/proc/get_candidate_role_text(var/role)
+
+ var/role_text
+
+ switch(role)
+ if("syndi")
+ role_text = "Syndicate Operative"
+ if("ling")
+ role_text = "Changeling"
+ if("tater")
+ role_text = "Traitor"
+ if("wiz")
+ role_text = "Cabalist"
+ if("ninja")
+ role_text = "Ninja"
+ if("vox")
+ role_text = "Vox Raider"
+ if("slug")
+ role_text = "Cortical Borer"
+ if("cult")
+ role_text = "Cultist"
+
+ return role_text
+
+//Grabs candidate lists for various atypes.
+/datum/game_mode/calamity/proc/get_role_candidates(var/role)
+
+ var/list/possible_antags = list()
+ switch(role)
+ if("syndi")
+ possible_antags = get_players_for_role(BE_OPERATIVE)
+ if("ling")
+ possible_antags = get_players_for_role(BE_CHANGELING)
+ if("tater")
+ possible_antags = get_players_for_role(BE_TRAITOR)
+ if("wiz")
+ possible_antags = get_players_for_role(BE_WIZARD)
+ if("ninja")
+ possible_antags = get_players_for_role(BE_NINJA)
+ if("vox")
+ possible_antags = get_players_for_role(BE_RAIDER)
+ if("slug")
+ possible_antags = get_players_for_role(BE_ALIEN)
+ if("cult")
+ possible_antags = get_players_for_role(BE_CULTIST)
+
+ var/list/filtered_antags = list()
+ if(possible_antags)
+ for(var/datum/mind/candidate in possible_antags)
+ if(!(candidate in already_assigned_candidates))
+ filtered_antags |= candidate
+ already_assigned_candidates |= candidate
+
+ if(filtered_antags && islist(filtered_antags))
+ return filtered_antags
+ else
+ return list(filtered_antags)
+
+//Spawning procs for the various antag types.
+//A LOT OF THE FOLLOWING IS COPYPASTED FROM OTHER MODES AND NEEDS
+//TO BE FIXED UP. NINJA, NUKE AND CULT IN PARTICULAR ARE FUCKING AWFUL. ~ Z
+/datum/game_mode/calamity/proc/spawn_syndicate(var/list/candidates)
+
+ var/obj/effect/landmark/uplinklocker = locate("landmark*Syndicate-Uplink")
+ var/obj/effect/landmark/nuke_spawn = locate("landmark*Nuclear-Bomb")
+
+ var/nuke_code = "[rand(10000, 99999)]"
+ var/leader_selected = 0
+ var/spawnpos = 1
+
+ for(var/datum/mind/player in candidates)
+
+ syndicates += player
+
+ if(spawnpos > synd_spawn.len)
+ spawnpos = 1
+ player.current.loc = synd_spawn[spawnpos]
+
+ player.current.real_name = "[syndicate_name()] Operative"
+ spawn(0)
+ NukeNameAssign(player)
+
+ forge_syndicate_objectives(player)
+ greet_syndicate(player)
+ equip_syndicate(player.current)
+
+ if(!leader_selected)
+ prepare_syndicate_leader(player, nuke_code)
+ leader_selected = 1
+
+ spawnpos++
+ update_synd_icons_added(player)
+
+ update_all_synd_icons()
+
+ if(uplinklocker)
+ new /obj/structure/closet/syndicate/nuclear(uplinklocker.loc)
+ if(nuke_spawn && synd_spawn.len > 0)
+ var/obj/machinery/nuclearbomb/the_bomb = new /obj/machinery/nuclearbomb(nuke_spawn.loc)
+ the_bomb.r_code = nuke_code
+
+/datum/game_mode/calamity/proc/spawn_changelings(var/list/candidates)
+
+ for(var/datum/mind/player in candidates)
+
+ changelings += player
+ grant_changeling_powers(player.current)
+ player.special_role = "Changeling"
+
+ if(!config.objectives_disabled)
+ player.objectives += new /datum/objective/escape()
+ player.objectives += new /datum/objective/survive()
+
+ show_objectives(player)
+ greet_changeling(player)
+
+/datum/game_mode/calamity/proc/spawn_traitors(var/list/candidates)
+
+ for(var/datum/mind/player in candidates)
+ traitors += player
+
+ if(!config.objectives_disabled)
+ player.objectives += new /datum/objective/escape()
+ player.objectives += new /datum/objective/survive()
+
+ show_objectives(player)
+
+ finalize_traitor(player)
+ greet_traitor(player)
+
+/datum/game_mode/calamity/proc/spawn_cabal(var/list/candidates)
+
+ for(var/datum/mind/player in candidates)
+ wizards += player
+
+ if(!config.objectives_disabled)
+ player.objectives += new /datum/objective/escape()
+ player.objectives += new /datum/objective/survive()
+
+ show_objectives(player)
+
+ player.current.loc = pick(wizardstart)
+
+ equip_wizard(player.current)
+ name_wizard(player.current)
+ greet_wizard(player)
+
+/datum/game_mode/calamity/proc/spawn_ninja(var/list/candidates)
+
+ //I hate that this is necessary. ~Z
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "carpspawn")
+ ninjastart.Add(L)
+
+ for(var/datum/mind/player in candidates)
+ ninjas += player
+
+ player.current << browse(null, "window=playersetup")
+ player.current = create_space_ninja(pick(ninjastart))
+ player.current.ckey = player.key
+
+ if(player.current && !(istype(player.current,/mob/living/carbon/human))) return 0
+
+ //Ninja intro crawl goes here.
+
+ if(!config.objectives_disabled)
+ player.objectives += new /datum/objective/ninja_highlander()
+ player.objectives += new /datum/objective/survive()
+
+ show_objectives(player)
+
+ //Ninja objective announcement goes here.
+
+ //Set ninja internals.
+ var/mob/living/carbon/human/N = player.current
+ N.internal = N.s_store
+ N.internals.icon_state = "internal1"
+ if(N.wear_suit && istype(N.wear_suit,/obj/item/clothing/suit/space/space_ninja))
+ var/obj/item/clothing/suit/space/space_ninja/S = N.wear_suit
+ S:randomize_param()
+
+/datum/game_mode/calamity/proc/spawn_vox_raiders(var/list/candidates)
+
+ //Create objectives.
+ var/list/raid_objectives = forge_vox_objectives()
+
+ //Create raiders.
+ for(var/datum/mind/player in candidates)
+ raiders += player
+
+ //Place them on the shuttle.
+ var/index = 1
+ if(index > raider_spawn.len)
+ index = 1
+ player.current.loc = raider_spawn[index]
+ index++
+
+ if(!config.objectives_disabled)
+ player.objectives = raid_objectives
+
+ //Equip them.
+ create_vox(player)
+ greet_vox(player)
+
+ player.current << "Your crew is transporting cortical stacks and critical resources back to the Shoal.\
+ No delay or concession can be tolerated. Even putting holes in the station pales in comparison to failure."
+
+ spawn (rand(waittime_l, waittime_h))
+ send_intercept()
+ ..()
+
+/datum/game_mode/calamity/proc/spawn_borers(var/list/candidates)
+
+ var/list/possible_hosts = list()
+ for(var/mob/living/carbon/human/H in mob_list)
+ if(!(H.species.flags & IS_SYNTHETIC))
+ possible_hosts += H
+
+ for(var/datum/mind/player in candidates)
+
+ if(!possible_hosts || possible_hosts.len)
+ break
+
+ borers += player
+ var/mob/living/carbon/human/target_host = pick(possible_hosts)
+ possible_hosts -= target_host
+
+ var/mob/living/simple_animal/borer/roundstart/B = new(target_host)
+
+ player.current = B
+ B.mind = player
+ B.key = player.key
+ player.assigned_role = "Cortical Borer"
+ player.special_role = "Cortical Borer"
+
+ B.host = target_host
+ B.host_brain.name = target_host.name
+ B.host_brain.real_name = target_host.real_name
+
+ var/datum/organ/external/head = target_host.get_organ("head")
+ head.implants += B
+
+ player.current << "\blue You are a cortical borer! You are a brain slug that worms its way \
+ into the head of its victim, lurking out of sight until it needs to take control."
+ player.current << "You can speak to your victim with say, to other borers with say ;, and use your Alien tab for abilities."
+
+ if(!config.objectives_disabled)
+ player.objectives += new /datum/objective/borer_survive()
+ player.objectives += new /datum/objective/borer_reproduce()
+ player.objectives += new /datum/objective/escape()
+
+ show_objectives(player)
+
+/datum/game_mode/calamity/proc/spawn_cultists(var/list/candidates)
+
+ //Prune the list.
+ var/list/jobs_to_skip = list("Chaplain","AI", "Cyborg", "Lawyer", "Head of Security", "Captain")
+ if(config.protect_roles_from_antagonist)
+ jobs_to_skip += list("Security Officer", "Warden", "Detective")
+
+ //Make cult objectives.
+ var/cult_objectives = list()
+ cult_objectives += new /datum/objective/cult_summon()
+
+ //Actually spawn cultists.
+ for(var/datum/mind/player in candidates)
+
+ for(var/job in jobs_to_skip)
+ if(player.assigned_role == job)
+ continue
+
+ cult += player
+ equip_cultist(player.current)
+ grant_runeword(player.current)
+ update_cult_icons_added(player)
+ player.current << "\blue You are a member of the cult! Your dark masters have sent you forth to serve their vile will."
+ player.current << "\red This station sails above a weeping tear in the Cosmos. Bring the Geometer of Blood forth."
+
+ if(!config.objectives_disabled)
+
+ for(var/datum/objective/O in cult_objectives)
+ player.objectives += O
+
+ player.objectives += new /datum/objective/escape()
+ player.objectives += new /datum/objective/survive()
+
+ show_objectives(player)
+ player.special_role = "Cultist"
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 03780adf36..c3079bf3d5 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -125,23 +125,13 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
changeling.current << "\red You are a changeling!"
changeling.current << "\red Use say \":g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them."
- if(config.objectives_disabled)
- changeling.current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
-
- if (!config.objectives_disabled)
- changeling.current << "You must complete the following tasks:"
+ show_objectives(changeling)
if (changeling.current.mind)
if (changeling.current.mind.assigned_role == "Clown")
changeling.current << "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself."
changeling.current.mutations.Remove(CLUMSY)
- if (!config.objectives_disabled)
- var/obj_count = 1
- for(var/datum/objective/objective in changeling.objectives)
- changeling.current << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
- return
/*/datum/game_mode/changeling/check_finished()
var/changelings_alive = 0
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 285a2ac0e3..771b43caa5 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -100,8 +100,7 @@
cult_mind.current << "\blue You are a member of the cult!"
if(!config.objectives_disabled)
memorize_cult_objectives(cult_mind)
- else
- cult_mind.current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
+ show_objectives(cult_mind)
cult_mind.special_role = "Cultist"
spawn (rand(waittime_l, waittime_h))
diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm
index 03d9c6a8cd..57ec2bc7ae 100644
--- a/code/game/gamemodes/events/space_ninja.dm
+++ b/code/game/gamemodes/events/space_ninja.dm
@@ -375,12 +375,7 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
var/directive = generate_ninja_directive(side)
new_ninja << "\blue \nYou are an elite mercenary assassin of the Spider Clan, [new_ninja.real_name]. The dreaded \red SPACE NINJA!\blue You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor. Remember your training (initialize your suit by right clicking on it)! \nYour current directive is: \red [directive]"
new_ninja.mind.store_memory("Directive: \red [directive]
")
-
- var/obj_count = 1
- new_ninja << "\blue Your current objectives:"
- for(var/datum/objective/objective in ninja_mind.objectives)
- new_ninja << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
+ show_objectives(new_ninja.mind)
sent_ninja_to_station = 1//And we're done.
return new_ninja//Return the ninja in case we need to reference them later.
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 415d1362be..a566c2d101 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -481,3 +481,28 @@ proc/get_nt_opposed()
dudes += man
if(dudes.len == 0) return null
return pick(dudes)
+
+//Announces objectives/generic antag text.
+/proc/show_generic_antag_text(var/datum/mind/player)
+ if(player.current)
+ player.current << \
+ "You are an antagonist! Within the rules, \
+ try to act as an opposing force to the crew. Further RP and try to make sure \
+ other players have fun! If you are confused or at a loss, always adminhelp, \
+ and before taking extreme actions, please try to also contact the administration! \
+ Think through your actions and make the roleplay immersive! Please remember all \
+ rules aside from those without explicit exceptions apply to antagonists."
+
+/proc/show_objectives(var/datum/mind/player)
+
+ if(!player || !player.current) return
+
+ if(config.objectives_disabled)
+ show_generic_antag_text(player)
+ return
+
+ var/obj_count = 1
+ player.current << "\blue Your current objectives:"
+ for(var/datum/objective/objective in player.objectives)
+ player.current << "Objective #[obj_count]: [objective.explanation_text]"
+ obj_count++
\ No newline at end of file
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 8b49a4574a..320e89d9b2 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -2,8 +2,12 @@
VOX HEIST ROUNDTYPE
*/
+var/global/list/raider_spawn = list()
+var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective. Clumsy, rewrite sometime.
+
/datum/game_mode/
var/list/datum/mind/raiders = list() //Antags.
+ var/list/raid_objectives = list() //Raid objectives
/datum/game_mode/heist
name = "heist"
@@ -16,9 +20,6 @@ VOX HEIST ROUNDTYPE
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)
- var/list/raid_objectives = list() //Raid objectives.
- var/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective.
-
/datum/game_mode/heist/announce()
world << "The current game mode is - Heist!"
world << "An unidentified bluespace signature has slipped past the Icarus and is approaching [station_name()]!"
@@ -59,15 +60,6 @@ VOX HEIST ROUNDTYPE
/datum/game_mode/heist/post_setup()
- //Build a list of spawn points.
- var/list/turf/raider_spawn = list()
-
- for(var/obj/effect/landmark/L in landmarks_list)
- if(L.name == "voxstart")
- raider_spawn += get_turf(L)
- del(L)
- continue
-
//Generate objectives for the group.
if(!config.objectives_disabled)
raid_objectives = forge_vox_objectives()
@@ -83,49 +75,57 @@ VOX HEIST ROUNDTYPE
raider.current.loc = raider_spawn[index]
index++
- var/sounds = rand(2,8)
- var/i = 0
- var/newname = ""
-
- while(i<=sounds)
- i++
- newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah"))
-
- var/mob/living/carbon/human/vox = raider.current
-
- vox.real_name = capitalize(newname)
- vox.name = vox.real_name
- raider.name = vox.name
- vox.age = rand(12,20)
- vox.dna.mutantrace = "vox"
- vox.set_species("Vox")
- vox.languages = list() // Removing language from chargen.
- vox.flavor_text = ""
- vox.add_language("Vox-pidgin")
- vox.h_style = "Short Vox Quills"
- vox.f_style = "Shaved"
- for(var/datum/organ/external/limb in vox.organs)
- limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
-
- //Now apply cortical stack.
- var/datum/organ/external/E = vox.get_organ("head")
- var/obj/item/weapon/implant/cortical/I = new(vox)
- I.imp_in = vox
- I.implanted = 1
- I.part = E
- E.implants += I
- cortical_stacks += I
-
- vox.equip_vox_raider()
- vox.regenerate_icons()
-
- raider.objectives = raid_objectives
+ create_vox(raider)
greet_vox(raider)
+ if(!config.objectives_disabled && raid_objectives)
+ raider.objectives = raid_objectives
+
spawn (rand(waittime_l, waittime_h))
send_intercept()
-/datum/game_mode/heist/proc/is_raider_crew_safe()
+/datum/game_mode/proc/create_vox(var/datum/mind/newraider)
+
+
+ var/sounds = rand(2,8)
+ var/i = 0
+ var/newname = ""
+
+ while(i<=sounds)
+ i++
+ newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah"))
+
+ var/mob/living/carbon/human/vox = newraider.current
+
+ vox.real_name = capitalize(newname)
+ vox.name = vox.real_name
+ newraider.name = vox.name
+ vox.age = rand(12,20)
+ vox.dna.mutantrace = "vox"
+ vox.set_species("Vox")
+ vox.languages = list() // Removing language from chargen.
+ vox.flavor_text = ""
+ vox.add_language("Vox-pidgin")
+ vox.h_style = "Short Vox Quills"
+ vox.f_style = "Shaved"
+
+ for(var/datum/organ/external/limb in vox.organs)
+ limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
+
+ //Generate cortical stack.
+ var/datum/organ/external/affected = vox.get_organ("head")
+
+ var/obj/item/weapon/implant/cortical/I = new(vox)
+ I.imp_in = vox
+ I.implanted = 1
+ affected.implants += I
+ I.part = affected
+ cortical_stacks += I
+
+ vox.equip_vox_raider()
+ vox.regenerate_icons()
+
+/datum/game_mode/proc/is_raider_crew_safe()
if(cortical_stacks.len == 0)
return 0
@@ -135,7 +135,7 @@ VOX HEIST ROUNDTYPE
return 0
return 1
-/datum/game_mode/heist/proc/is_raider_crew_alive()
+/datum/game_mode/proc/is_raider_crew_alive()
for(var/datum/mind/raider in raiders)
if(raider.current)
@@ -143,7 +143,7 @@ VOX HEIST ROUNDTYPE
return 1
return 0
-/datum/game_mode/heist/proc/forge_vox_objectives()
+/datum/game_mode/proc/forge_vox_objectives()
var/i = 1
var/max_objectives = pick(2,2,2,2,3,3,3,4)
@@ -171,20 +171,13 @@ VOX HEIST ROUNDTYPE
return objs
-/datum/game_mode/heist/proc/greet_vox(var/datum/mind/raider)
+/datum/game_mode/proc/greet_vox(var/datum/mind/raider)
raider.current << "\blue You are a Vox Raider, fresh from the Shoal!"
raider.current << "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to the frontier and much of the unexplored galaxy. You and the crew have come to the Exodus for plunder, trade or both."
raider.current << "\blue Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious."
raider.current << "\blue Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!"
raider.current << "\red IF YOU HAVE NOT PLAYED A VOX BEFORE, REVIEW THIS THREAD: http://baystation12.net/forums/viewtopic.php?f=6&t=8657."
- var/obj_count = 1
- if(!config.objectives_disabled)
- for(var/datum/objective/objective in raider.objectives)
- raider.current << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
- else
- raider.current << "Within the rules, try to act as an opposing force to the crew or come up with other fun ideas. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
-
+ show_objectives(raider)
/datum/game_mode/heist/declare_completion()
@@ -292,6 +285,6 @@ datum/game_mode/proc/auto_declare_completion_heist()
var/area/skipjack = locate(/area/shuttle/vox/station)
for (var/mob/living/M in skipjack.contents)
//maybe send the player a message that they've gone home/been kidnapped? Someone responsible for vox lore should write that.
- Del(M)
+ del(M)
for (var/obj/O in skipjack.contents)
- Del(O) //no hiding in lockers or anything
+ del(O) //no hiding in lockers or anything
\ No newline at end of file
diff --git a/code/game/gamemodes/meme/meme.dm b/code/game/gamemodes/meme/meme.dm
index 71781c48e8..ae4e2dce8f 100644
--- a/code/game/gamemodes/meme/meme.dm
+++ b/code/game/gamemodes/meme/meme.dm
@@ -131,11 +131,7 @@
/datum/game_mode/proc/greet_meme(var/datum/mind/meme, var/you_are=1)
if (you_are)
meme.current << "\red You are a meme!"
-
- var/obj_count = 1
- for(var/datum/objective/objective in meme.objectives)
- meme.current << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
+ show_objectives(meme)
return
/datum/game_mode/meme/check_finished()
diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm
index 33810a2e5b..10cff5eccb 100644
--- a/code/game/gamemodes/ninja/ninja.dm
+++ b/code/game/gamemodes/ninja/ninja.dm
@@ -56,8 +56,8 @@
if(ninja.current && !(istype(ninja.current,/mob/living/carbon/human))) return 0
if(!config.objectives_disabled)
forge_ninja_objectives(ninja)
- else
- ninja.current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
+ show_objectives(ninja)
+
var/mob/living/carbon/human/N = ninja.current
N.internal = N.s_store
N.internals.icon_state = "internal1"
@@ -139,11 +139,7 @@
ninja.current << "You are an elite mercenary assassin of the Spider Clan, [ninja.current.real_name]. You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor.\nYour current directive is: \red [directive]\n \blue Try your best to adhere to this."
ninja.store_memory("Directive: \red [directive]
")
- var/obj_count = 1
- ninja.current << "\blue Your current objectives:"
- for(var/datum/objective/objective in ninja.objectives)
- ninja.current << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
+ show_objectives(ninja)
/datum/game_mode/proc/auto_declare_completion_ninja()
if(ninjas.len)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index 53fbcba2f4..8aa8cf3fa6 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -1,3 +1,10 @@
+/*
+ NUCLEAR EMERGENCY ROUNDTYPE
+*/
+
+var/global/list/turf/synd_spawn = list()
+
+
/datum/game_mode
var/list/datum/mind/syndicates = list()
@@ -116,14 +123,6 @@
/datum/game_mode/nuclear/post_setup()
- var/list/turf/synd_spawn = list()
-
- for(var/obj/effect/landmark/A in landmarks_list)
- if(A.name == "Syndicate-Spawn")
- synd_spawn += get_turf(A)
- del(A)
- continue
-
var/obj/effect/landmark/uplinkdevice = locate("landmark*Syndicate-Uplink") //i will be rewriting this shortly
var/obj/effect/landmark/nuke_spawn = locate("landmark*Nuclear-Bomb")
@@ -139,8 +138,8 @@
synd_mind.current.real_name = "[syndicate_name()] Operative" // placeholder while we get their actual name
spawn(0)
NukeNameAssign(synd_mind)
- if(!config.objectives_disabled)
- forge_syndicate_objectives(synd_mind)
+
+ forge_syndicate_objectives(synd_mind)
greet_syndicate(synd_mind)
equip_syndicate(synd_mind.current)
@@ -188,25 +187,18 @@
/datum/game_mode/proc/forge_syndicate_objectives(var/datum/mind/syndicate)
+
if (config.objectives_disabled)
return
+
var/datum/objective/nuclear/syndobj = new
syndobj.owner = syndicate
syndicate.objectives += syndobj
-
/datum/game_mode/proc/greet_syndicate(var/datum/mind/syndicate, var/you_are=1)
if (you_are)
syndicate.current << "\blue You are a [syndicate_name()] agent!"
- var/obj_count = 1
- if(!config.objectives_disabled)
- for(var/datum/objective/objective in syndicate.objectives)
- syndicate.current << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
- else
- syndicate.current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
- return
-
+ show_objectives(syndicate)
/datum/game_mode/proc/random_radio_frequency()
return 1337 // WHY??? -- Doohl
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 3d1f814094..82619c2796 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -930,4 +930,42 @@ datum/objective/heist/inviolate_death
explanation_text = "Follow the Inviolate. Minimise death and loss of resources."
check_completion()
if(vox_kills > MAX_VOX_KILLS) return 0
- return 1
\ No newline at end of file
+ return 1
+
+//Borer objective(s).
+
+/datum/objective/borer_survive
+ explanation_text = "Survive in a host until the end of the round."
+
+/datum/objective/borer_survive/check_completion()
+ if(owner)
+ var/mob/living/simple_animal/borer/B = owner
+ if(istype(B) && B.stat < 2 && B.host && B.host.stat < 2) return 1
+ return 0
+
+/datum/objective/borer_reproduce
+ explanation_text = "Reproduce at least once."
+
+/datum/objective/borer_reproduce/check_completion()
+ if(owner && owner.current)
+ var/mob/living/simple_animal/borer/B = owner.current
+ if(istype(B) && B.has_reproduced) return 1
+ return 0
+
+/datum/objective/ninja_highlander
+ explanation_text = "You aspire to be a Grand Master of the Spider Clan. Kill all of your fellow acolytes."
+
+/datum/objective/ninja_highlander/check_completion()
+ if(owner)
+ for(var/datum/mind/ninja in ticker.mode.ninjas)
+ if(ninja != owner)
+ if(ninja.current.stat < 2) return 0
+ return 1
+ return 0
+
+/datum/objective/cult_summon
+ explanation_text = "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."
+
+/datum/objective/cult_summon/check_completion()
+ if(locate(/obj/machinery/singularity/narsie/large) in machines) return 1
+ return 0
\ No newline at end of file
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 2f04f8266b..fd774975d0 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -118,16 +118,13 @@
rev_mind.objectives += rev_obj
/datum/game_mode/proc/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1)
- var/obj_count = 1
+
+ rev_mind.special_role = "Head Revolutionary"
+
if (you_are)
rev_mind.current << "\blue You are a member of the revolutionaries' leadership!"
- if(!config.objectives_disabled)
- for(var/datum/objective/objective in rev_mind.objectives)
- rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]"
- rev_mind.special_role = "Head Revolutionary"
- obj_count++
- else
- rev_mind.current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
+
+ show_objectives(rev_mind)
/////////////////////////////////////////////////////////////////////////////////
//This are equips the rev heads with their gear, and makes the clown not clumsy//
@@ -198,8 +195,7 @@
revolutionaries += rev_mind
rev_mind.current << "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!"
rev_mind.special_role = "Revolutionary"
- if(config.objectives_disabled)
- rev_mind.current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
+ show_objectives(rev_mind)
update_rev_icons_added(rev_mind)
return 1
//////////////////////////////////////////////////////////////////////////////
diff --git a/code/game/gamemodes/revolution/rp-revolution.dm b/code/game/gamemodes/revolution/rp-revolution.dm
index 2fdf8af27c..282864a3fe 100644
--- a/code/game/gamemodes/revolution/rp-revolution.dm
+++ b/code/game/gamemodes/revolution/rp-revolution.dm
@@ -87,11 +87,8 @@
update_rev_icons_added(rev_mind)
for(var/datum/mind/rev_mind in head_revolutionaries)
- var/obj_count = 1
rev_mind.current << "\blue You are a member of the revolutionaries' leadership!"
- for(var/datum/objective/objective in rev_mind.objectives)
- rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
+ show_objectives(rev_mind)
spawn (rand(waittime_l, waittime_h))
send_intercept()
diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm
index 71c34c0d04..cbfe977230 100644
--- a/code/game/gamemodes/revolution/rp_revolution.dm
+++ b/code/game/gamemodes/revolution/rp_revolution.dm
@@ -78,16 +78,10 @@
send_intercept()
/datum/game_mode/revolution/rp_revolution/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1)
- var/obj_count = 1
+ rev_mind.special_role = "Head Revolutionary"
if (you_are)
rev_mind.current << "\blue You are a member of the revolutionaries' leadership!"
- if(!config.objectives_disabled)
- for(var/datum/objective/objective in rev_mind.objectives)
- rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]"
- rev_mind.special_role = "Head Revolutionary"
- obj_count++
- else
- rev_mind.current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
+ show_objectives(rev_mind)
// Show each head revolutionary up to 3 candidates
var/list/already_considered = list()
@@ -113,8 +107,7 @@
revolutionaries += rev_mind
rev_mind.current << "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill, capture or convert the heads to win the revolution!"
rev_mind.special_role = "Revolutionary"
- if(config.objectives_disabled)
- rev_mind.current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
+ show_objectives(rev_mind)
update_rev_icons_added(rev_mind)
H.hud_updateflag |= 1 << SPECIALROLE_HUD
return 1
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 71076aaf28..0c0928dbc1 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -135,14 +135,7 @@
/datum/game_mode/proc/greet_traitor(var/datum/mind/traitor)
traitor.current << "You are the traitor."
- if (!config.objectives_disabled)
- var/obj_count = 1
- for(var/datum/objective/objective in traitor.objectives)
- traitor.current << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
- else
- traitor.current << "You have been selected this round as an antagonist- Within the rules, try to act as an opposing force to the crew- This can be via corporate payoff, personal motives, or maybe just being a dick. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonist."
- return
+ show_objectives(traitor)
/datum/game_mode/proc/finalize_traitor(var/datum/mind/traitor)
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index 23a0416112..ccce7f9bff 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -13,10 +13,8 @@
survive.owner = H.mind
H.mind.objectives += survive
H << "You are the survivor! Your own safety matters above all else, trust no one and kill anyone who gets in your way. However, armed as you are, now would be the perfect time to settle that score or grab that pair of yellow gloves you've been eyeing..."
- var/obj_count = 1
- for(var/datum/objective/OBJ in H.mind.objectives)
- H << "Objective #[obj_count]: [OBJ.explanation_text]"
- obj_count++
+ show_objectives(H.mind)
+
var/randomize = pick("taser","egun","laser","revolver","detective","smg","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","mateba","smg","uzi","crossbow","saw")
switch (randomize)
if("taser")
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index d28238e28f..b79fe4ba30 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -135,16 +135,7 @@
/datum/game_mode/proc/greet_wizard(var/datum/mind/wizard, var/you_are=1)
if (you_are)
wizard.current << "\red You are the Space Wizard!"
- wizard.current << "The Space Wizards Federation has given you the following tasks:"
- if(!config.objectives_disabled)
- var/obj_count = 1
- for(var/datum/objective/objective in wizard.objectives)
- wizard.current << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
- else
- wizard.current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists."
- return
-
+ show_objectives(wizard)
/*/datum/game_mode/proc/learn_basic_spells(mob/living/carbon/human/wizard_mob)
if (!istype(wizard_mob))
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 59e24ad3e9..2be8fabf28 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -86,11 +86,7 @@
M << "You have joined the ranks of the Syndicate and become a traitor to the station!"
message_admins("[N]/([N.ckey]) has accepted a traitor objective from a syndicate beacon.")
-
- var/obj_count = 1
- for(var/datum/objective/OBJ in M.mind.objectives)
- M << "Objective #[obj_count]: [OBJ.explanation_text]"
- obj_count++
+ show_objectives(M.mind)
src.add_fingerprint(usr)
src.updateUsrDialog()
diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm
index 786468c0c4..2720a1c318 100644
--- a/code/game/machinery/wishgranter.dm
+++ b/code/game/machinery/wishgranter.dm
@@ -66,11 +66,7 @@
silence.owner = user.mind
user.mind.objectives += silence
- var/obj_count = 1
- for(var/datum/objective/OBJ in user.mind.objectives)
- user << "Objective #[obj_count]: [OBJ.explanation_text]"
- obj_count++
-
+ show_objectives(user.mind)
user << "You have a very bad feeling about this."
return
\ No newline at end of file
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index e287ee845d..514a5b38f9 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -81,6 +81,14 @@
ninjastart += loc
del(src)
+ if("voxstart")
+ raider_spawn += loc
+ del(src)
+
+ if("Syndicate-Spawn")
+ synd_spawn += loc
+ del(src)
+
landmarks_list += src
return 1
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index ac67a624e3..0a83ce4903 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -481,6 +481,9 @@
if(ticker.mode.traitors.len)
dat += check_role_table("Traitors", ticker.mode.traitors, src)
+ if(ticker.mode.borers.len)
+ dat += check_role_table("Cortical Borers", ticker.mode.borers, src)
+
var/datum/game_mode/mutiny/mutiny = get_mutiny_mode()
if(mutiny)
dat += mutiny.check_antagonists_ui(src)
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index fc147e04fd..95fbc615c8 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -533,7 +533,7 @@ client/proc/one_click_antag()
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist ) ) )
var/datum/game_mode/heist/M = ticker.mode
- M.cortical_stacks += I
+ cortical_stacks += I
M.raiders[new_vox.mind] = I
ticker.mode.traitors += new_vox.mind
diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm
index 822043720d..aa99b4bd46 100644
--- a/code/modules/admin/verbs/onlyone.dm
+++ b/code/modules/admin/verbs/onlyone.dm
@@ -20,10 +20,7 @@
H.mind.objectives += hijack_objective
H << "You are the traitor."
- var/obj_count = 1
- for(var/datum/objective/OBJ in H.mind.objectives)
- H << "Objective #[obj_count]: [OBJ.explanation_text]"
- obj_count++
+ show_objectives(H.mind)
for (var/obj/item/I in H)
if (istype(I, /obj/item/weapon/implant))
diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm
index 52fbc8220a..1311e1c71b 100644
--- a/code/modules/events/event_manager.dm
+++ b/code/modules/events/event_manager.dm
@@ -30,6 +30,10 @@ var/scheduledEvent = null
playercount_modifier = 0.9
if(36 to 100000)
playercount_modifier = 0.8
+
+ if(ticker.mode && ticker.mode.name == "calamity") //Calamity mode lowers the time required between events drastically.
+ playercount_modifier = playercount_modifier * 0.3
+
var/next_event_delay = rand(eventTimeLower, eventTimeUpper) * playercount_modifier
scheduledEvent = world.timeofday + next_event_delay
log_debug("Next event in [next_event_delay/600] minutes.")
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 747467a66f..d1adff7de2 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -54,23 +54,25 @@
//Mob specific holders.
/obj/item/weapon/holder/diona
-
name = "diona nymph"
desc = "It's a tiny plant critter."
icon_state = "nymph"
origin_tech = "magnets=3;biotech=5"
/obj/item/weapon/holder/drone
-
name = "maintenance drone"
desc = "It's a small maintenance robot."
icon_state = "drone"
origin_tech = "magnets=3;engineering=5"
-
/obj/item/weapon/holder/cat
-
name = "cat"
desc = "It's a cat. Meow."
icon_state = "cat"
- origin_tech = null
\ No newline at end of file
+ origin_tech = null
+
+/obj/item/weapon/holder/borer
+ name = "cortical borer"
+ desc = "It's a slimy brain slug. Gross."
+ icon_state = "borer"
+ origin_tech = "biotech=6"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 0d6aaec965..4de06df651 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -1,6 +1,6 @@
/mob/living/carbon/Life()
..()
-
+
// Increase germ_level regularly
if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level
germ_level++
@@ -14,7 +14,7 @@
src.nutrition -= HUNGER_FACTOR/10
if((FAT in src.mutations) && src.m_intent == "run" && src.bodytemperature <= 360)
src.bodytemperature += 2
-
+
// Moving around increases germ_level faster
if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
germ_level++
@@ -206,7 +206,7 @@
if (istype(src,/mob/living/carbon/human) && src:w_uniform)
var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M)
-
+
if(lying)
src.sleeping = max(0,src.sleeping-5)
if(src.sleeping == 0)
@@ -216,7 +216,7 @@
else
M.visible_message("[M] hugs [src] to make [t_him] feel better!", \
"You hug [src] to make [t_him] feel better!")
-
+
AdjustParalysis(-3)
AdjustStunned(-3)
AdjustWeakened(-3)
@@ -470,9 +470,10 @@
return
if(B.chemicals >= 100)
- src << "\red Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body."
+ src << "\red Your host twitches and quivers as you rapidly excrete a larva from your sluglike body."
visible_message("\red [src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!")
B.chemicals -= 100
+ B.has_reproduced = 1
new /obj/effect/decal/cleanable/vomit(get_turf(src))
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm
index 0d15aeab54..7ffd57e96a 100644
--- a/code/modules/mob/living/simple_animal/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer.dm
@@ -1,6 +1,9 @@
+/datum/game_mode/var/list/borers = list()
+
/mob/living/captive_brain
name = "host brain"
real_name = "host brain"
+ universal_understand = 1
/mob/living/captive_brain/say(var/message)
@@ -45,6 +48,8 @@
friendly = "prods"
wander = 0
pass_flags = PASSTABLE
+ universal_understand = 1
+ holder_type = /obj/item/weapon/holder/borer
var/used_dominate
var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin.
@@ -53,6 +58,11 @@
var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth.
var/controlling // Used in human death check.
var/docile = 0 // Sugar can stop borers from acting.
+ var/has_reproduced
+ var/roundstart
+
+/mob/living/simple_animal/borer/roundstart
+ roundstart = 1
/mob/living/simple_animal/borer/Life()
@@ -96,9 +106,7 @@
..()
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [rand(1000,9999)]"
host_brain = new/mob/living/captive_brain(src)
-
- request_player()
-
+ if(!roundstart) request_player()
/mob/living/simple_animal/borer/say(var/message)
@@ -338,7 +346,7 @@
detatch()
-mob/living/simple_animal/borer/proc/detatch()
+/mob/living/simple_animal/borer/proc/detatch()
if(!host) return
@@ -530,7 +538,7 @@ mob/living/simple_animal/borer/proc/detatch()
src << text("\blue You have stopped hiding.")
//Procs for grabbing players.
-mob/living/simple_animal/borer/proc/request_player()
+/mob/living/simple_animal/borer/proc/request_player()
for(var/mob/dead/observer/O in player_list)
if(jobban_isbanned(O, "Syndicate"))
continue
@@ -538,7 +546,7 @@ mob/living/simple_animal/borer/proc/request_player()
if(O.client.prefs.be_special & BE_ALIEN)
question(O.client)
-mob/living/simple_animal/borer/proc/question(var/client/C)
+/mob/living/simple_animal/borer/proc/question(var/client/C)
spawn(0)
if(!C) return
var/response = alert(C, "A cortical borer needs a player. Are you interested?", "Cortical borer request", "Yes", "No", "Never for this round")
@@ -549,7 +557,7 @@ mob/living/simple_animal/borer/proc/question(var/client/C)
else if (response == "Never for this round")
C.prefs.be_special ^= BE_ALIEN
-mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate)
+/mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate)
if(!candidate)
return
@@ -558,3 +566,4 @@ mob/living/simple_animal/borer/proc/transfer_personality(var/client/candidate)
src.ckey = candidate.ckey
if(src.mind)
src.mind.assigned_role = "Cortical Borer"
+ src.mind.special_role = "Cortical Borer"
\ No newline at end of file
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 0fb7e01d0d..e9886ba8a0 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 8900043e3d..23d627a5f1 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ