mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 18:53:06 +00:00
Resolving bugs with spawn order and delays.
This commit is contained in:
@@ -1204,7 +1204,6 @@
|
|||||||
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
|
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
|
||||||
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
|
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
|
||||||
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
|
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
|
||||||
#include "code\modules\mob\living\silicon\robot\subsystems.dm"
|
|
||||||
#include "code\modules\mob\living\silicon\robot\drone\drone.dm"
|
#include "code\modules\mob\living\silicon\robot\drone\drone.dm"
|
||||||
#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm"
|
#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm"
|
||||||
#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm"
|
#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm"
|
||||||
|
|||||||
@@ -1,45 +1,3 @@
|
|||||||
var/global/list/all_antag_types = list()
|
|
||||||
var/global/list/all_antag_spawnpoints = list()
|
|
||||||
var/global/list/antag_names_to_ids = list()
|
|
||||||
|
|
||||||
/proc/get_antag_data(var/antag_type)
|
|
||||||
if(all_antag_types[antag_type])
|
|
||||||
return all_antag_types[antag_type]
|
|
||||||
else
|
|
||||||
for(var/cur_antag_type in all_antag_types)
|
|
||||||
var/datum/antagonist/antag = all_antag_types[cur_antag_type]
|
|
||||||
if(antag && antag.is_type(antag_type))
|
|
||||||
return antag
|
|
||||||
|
|
||||||
/proc/clear_antag_roles(var/datum/mind/player, var/implanted)
|
|
||||||
for(var/antag_type in all_antag_types)
|
|
||||||
var/datum/antagonist/antag = all_antag_types[antag_type]
|
|
||||||
if(!implanted || !(antag.flags & ANTAG_IMPLANT_IMMUNE))
|
|
||||||
antag.remove_antagonist(player, 1, implanted)
|
|
||||||
|
|
||||||
/proc/update_antag_icons(var/datum/mind/player)
|
|
||||||
for(var/antag_type in all_antag_types)
|
|
||||||
var/datum/antagonist/antag = all_antag_types[antag_type]
|
|
||||||
if(player)
|
|
||||||
antag.update_icons_removed(player)
|
|
||||||
if(antag.is_antagonist(player))
|
|
||||||
antag.update_icons_added(player)
|
|
||||||
else
|
|
||||||
antag.update_all_icons()
|
|
||||||
|
|
||||||
/proc/populate_antag_type_list()
|
|
||||||
for(var/antag_type in typesof(/datum/antagonist)-/datum/antagonist)
|
|
||||||
var/datum/antagonist/A = new antag_type
|
|
||||||
all_antag_types[A.id] = A
|
|
||||||
all_antag_spawnpoints[A.landmark_id] = list()
|
|
||||||
antag_names_to_ids[A.role_text] = A.id
|
|
||||||
|
|
||||||
/proc/get_antags(var/atype)
|
|
||||||
var/datum/antagonist/antag = all_antag_types[atype]
|
|
||||||
if(antag && islist(antag.current_antagonists))
|
|
||||||
return antag.current_antagonists
|
|
||||||
return list()
|
|
||||||
|
|
||||||
/datum/antagonist
|
/datum/antagonist
|
||||||
|
|
||||||
var/role_type = BE_TRAITOR
|
var/role_type = BE_TRAITOR
|
||||||
@@ -51,8 +9,6 @@ var/global/list/antag_names_to_ids = list()
|
|||||||
var/loss_text
|
var/loss_text
|
||||||
var/victory_feedback_tag
|
var/victory_feedback_tag
|
||||||
var/loss_feedback_tag
|
var/loss_feedback_tag
|
||||||
var/spawn_upper = 5
|
|
||||||
var/spawn_lower = 3
|
|
||||||
var/max_antags = 3
|
var/max_antags = 3
|
||||||
var/max_antags_round = 5
|
var/max_antags_round = 5
|
||||||
|
|
||||||
@@ -73,9 +29,10 @@ var/global/list/antag_names_to_ids = list()
|
|||||||
var/cur_max = 0
|
var/cur_max = 0
|
||||||
|
|
||||||
var/datum/mind/leader
|
var/datum/mind/leader
|
||||||
|
var/spawned_nuke
|
||||||
var/nuke_spawn_loc
|
var/nuke_spawn_loc
|
||||||
|
|
||||||
|
var/list/valid_species = list("Unathi","Tajara","Skrell","Human") // Used for setting appearance.
|
||||||
var/list/starting_locations = list()
|
var/list/starting_locations = list()
|
||||||
var/list/current_antagonists = list()
|
var/list/current_antagonists = list()
|
||||||
var/list/global_objectives = list()
|
var/list/global_objectives = list()
|
||||||
@@ -83,48 +40,19 @@ var/global/list/antag_names_to_ids = list()
|
|||||||
var/list/protected_jobs = list()
|
var/list/protected_jobs = list()
|
||||||
var/list/candidates = list()
|
var/list/candidates = list()
|
||||||
|
|
||||||
|
var/default_access = list()
|
||||||
|
var/id_type = /obj/item/weapon/card/id
|
||||||
|
|
||||||
/datum/antagonist/New()
|
/datum/antagonist/New()
|
||||||
..()
|
..()
|
||||||
|
cur_max = max_antags
|
||||||
get_starting_locations()
|
get_starting_locations()
|
||||||
if(config.protect_roles_from_antagonist)
|
if(config.protect_roles_from_antagonist)
|
||||||
restricted_jobs |= protected_jobs
|
restricted_jobs |= protected_jobs
|
||||||
|
|
||||||
/datum/antagonist/proc/attempt_late_spawn(var/datum/mind/player, var/move_to_spawn)
|
|
||||||
|
|
||||||
var/main_type
|
|
||||||
if(ticker && ticker.mode)
|
|
||||||
if(ticker.mode.antag_tag && ticker.mode.antag_tag == id)
|
|
||||||
main_type = 1
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
|
|
||||||
var/cur_max = (main_type ? max_antags_round : max_antags)
|
|
||||||
if(ticker.mode.antag_scaling_coeff)
|
|
||||||
cur_max = Clamp((ticker.mode.num_players()/ticker.mode.antag_scaling_coeff), 1, cur_max)
|
|
||||||
|
|
||||||
if(get_antag_count() > cur_max-1)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
player.current << "<span class='danger'><i>You have been selected this round as an antagonist!</i></span>"
|
|
||||||
add_antagonist(player)
|
|
||||||
equip(player.current)
|
|
||||||
finalize(player)
|
|
||||||
if(move_to_spawn)
|
|
||||||
place_mob(player.current)
|
|
||||||
return
|
|
||||||
|
|
||||||
/datum/antagonist/proc/tick()
|
/datum/antagonist/proc/tick()
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/datum/antagonist/proc/is_antagonist(var/datum/mind/player)
|
|
||||||
if(player in current_antagonists)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/antagonist/proc/is_type(var/antag_type)
|
|
||||||
if(antag_type == id || antag_type == role_text)
|
|
||||||
return 1
|
|
||||||
return 0
|
|
||||||
|
|
||||||
/datum/antagonist/proc/get_panel_entry(var/datum/mind/player)
|
/datum/antagonist/proc/get_panel_entry(var/datum/mind/player)
|
||||||
|
|
||||||
var/dat = "<tr><td><b>[role_text]:</b>"
|
var/dat = "<tr><td><b>[role_text]:</b>"
|
||||||
@@ -144,149 +72,6 @@ var/global/list/antag_names_to_ids = list()
|
|||||||
/datum/antagonist/proc/get_extra_panel_options()
|
/datum/antagonist/proc/get_extra_panel_options()
|
||||||
return
|
return
|
||||||
|
|
||||||
/datum/antagonist/proc/antags_are_dead()
|
|
||||||
for(var/datum/mind/antag in current_antagonists)
|
|
||||||
if(mob_path && !istype(antag.current,mob_path))
|
|
||||||
continue
|
|
||||||
if(antag.current.stat==2)
|
|
||||||
continue
|
|
||||||
return 0
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/antagonist/proc/get_antag_count()
|
|
||||||
return current_antagonists ? current_antagonists.len : 0
|
|
||||||
|
|
||||||
|
|
||||||
/datum/antagonist/proc/get_candidates(var/lower_count, var/upper_count, var/ghosts_only)
|
|
||||||
|
|
||||||
candidates = list()
|
|
||||||
var/main_type
|
|
||||||
if(ticker && ticker.mode)
|
|
||||||
if(ticker.mode.antag_tag && ticker.mode.antag_tag == id)
|
|
||||||
main_type = 1
|
|
||||||
else
|
|
||||||
return list()
|
|
||||||
|
|
||||||
var/cur_max = (main_type ? max_antags_round : max_antags)
|
|
||||||
if(ticker.mode.antag_scaling_coeff)
|
|
||||||
cur_max = Clamp((ticker.mode.num_players()/ticker.mode.antag_scaling_coeff), 1, cur_max)
|
|
||||||
|
|
||||||
if(get_antag_count() >= cur_max)
|
|
||||||
return list()
|
|
||||||
|
|
||||||
// Sanity.
|
|
||||||
if(lower_count)
|
|
||||||
lower_count = max(lower_count,1)
|
|
||||||
if(spawn_lower)
|
|
||||||
lower_count = max(lower_count,spawn_lower)
|
|
||||||
else
|
|
||||||
lower_count = 1
|
|
||||||
|
|
||||||
if(upper_count)
|
|
||||||
if(spawn_upper)
|
|
||||||
upper_count = max(min(spawn_upper, cur_max),1)
|
|
||||||
else
|
|
||||||
upper_count = 1
|
|
||||||
|
|
||||||
if(upper_count < lower_count)
|
|
||||||
upper_count = lower_count
|
|
||||||
|
|
||||||
candidates = list() // Clear.
|
|
||||||
candidates = ticker.mode.get_players_for_role(role_type, id)
|
|
||||||
|
|
||||||
// Prune restricted jobs and status.
|
|
||||||
for(var/datum/mind/player in candidates)
|
|
||||||
if((ghosts_only && !istype(player.current, /mob/dead)) || (player.assigned_role in restricted_jobs))
|
|
||||||
candidates -= player
|
|
||||||
|
|
||||||
if((!candidates.len) || candidates.len < lower_count)
|
|
||||||
return list()
|
|
||||||
|
|
||||||
return candidates
|
|
||||||
|
|
||||||
/datum/antagonist/proc/attempt_spawn(var/lower_count, var/upper_count, var/ghosts_only)
|
|
||||||
|
|
||||||
world << "Attempting to spawn."
|
|
||||||
// Get the raw list of potential players.
|
|
||||||
candidates = get_candidates(lower_count, upper_count, ghosts_only)
|
|
||||||
|
|
||||||
// Update our boundaries.
|
|
||||||
if(!candidates.len)
|
|
||||||
world << "No candidates."
|
|
||||||
return 0
|
|
||||||
|
|
||||||
//Grab candidates randomly until we have enough.
|
|
||||||
while(candidates.len)
|
|
||||||
var/datum/mind/player = pick(candidates)
|
|
||||||
current_antagonists |= player
|
|
||||||
// Update job and role.
|
|
||||||
player.special_role = role_text
|
|
||||||
if(flags & ANTAG_OVERRIDE_JOB)
|
|
||||||
player.assigned_role = "MODE"
|
|
||||||
candidates -= player
|
|
||||||
world << "Done."
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/antagonist/proc/apply(var/datum/mind/player)
|
|
||||||
|
|
||||||
// Get the mob.
|
|
||||||
if((flags & ANTAG_OVERRIDE_MOB) && (!player.current || (mob_path && !istype(player.current, mob_path))))
|
|
||||||
var/mob/holder = player.current
|
|
||||||
player.current = new mob_path(get_turf(player.current))
|
|
||||||
player.transfer_to(player.current)
|
|
||||||
if(holder) del(holder)
|
|
||||||
|
|
||||||
player.original = player.current
|
|
||||||
return player.current
|
|
||||||
|
|
||||||
/datum/antagonist/proc/create_objectives(var/datum/mind/player)
|
|
||||||
if(config.objectives_disabled)
|
|
||||||
return 0
|
|
||||||
if(global_objectives && global_objectives.len)
|
|
||||||
player.objectives |= global_objectives
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/antagonist/proc/equip(var/mob/living/carbon/human/player)
|
|
||||||
|
|
||||||
if(!istype(player))
|
|
||||||
return 0
|
|
||||||
|
|
||||||
// This could use work.
|
|
||||||
if(flags & ANTAG_CLEAR_EQUIPMENT)
|
|
||||||
for(var/obj/item/thing in player.contents)
|
|
||||||
del(thing)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/antagonist/proc/unequip(var/mob/living/carbon/human/player)
|
|
||||||
if(!istype(player))
|
|
||||||
return 0
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/antagonist/proc/greet(var/datum/mind/player)
|
|
||||||
|
|
||||||
// Basic intro text.
|
|
||||||
player.current << "<span class='danger'><font size=3>You are a [role_text]!</font></span>"
|
|
||||||
if(leader_welcome_text && player.current == leader)
|
|
||||||
player.current << "<span class='notice'>[leader_welcome_text]</span>"
|
|
||||||
else
|
|
||||||
player.current << "<span class='notice'>[welcome_text]</span>"
|
|
||||||
show_objectives(player)
|
|
||||||
|
|
||||||
// Choose a name, if any.
|
|
||||||
if(flags & ANTAG_CHOOSE_NAME)
|
|
||||||
var/newname = sanitize(copytext(input(player.current, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text,1,MAX_NAME_LEN))
|
|
||||||
if (newname)
|
|
||||||
player.current.real_name = newname
|
|
||||||
player.current.name = player.current.real_name
|
|
||||||
player.name = player.current.name
|
|
||||||
|
|
||||||
// Clown clumsiness check, I guess downstream might use it.
|
|
||||||
if (player.current.mind)
|
|
||||||
if (player.current.mind.assigned_role == "Clown")
|
|
||||||
player.current << "You have evolved beyond your clownish nature, allowing you to wield weapons without harming yourself."
|
|
||||||
player.current.mutations.Remove(CLUMSY)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/antagonist/proc/get_starting_locations()
|
/datum/antagonist/proc/get_starting_locations()
|
||||||
if(landmark_id)
|
if(landmark_id)
|
||||||
starting_locations = list()
|
starting_locations = list()
|
||||||
@@ -294,31 +79,22 @@ var/global/list/antag_names_to_ids = list()
|
|||||||
if(L.name == landmark_id)
|
if(L.name == landmark_id)
|
||||||
starting_locations |= get_turf(L)
|
starting_locations |= get_turf(L)
|
||||||
|
|
||||||
/datum/antagonist/proc/create_global_objectives()
|
|
||||||
return !((global_objectives && global_objectives.len) || config.objectives_disabled)
|
|
||||||
|
|
||||||
/datum/antagonist/proc/place_all_mobs()
|
/datum/antagonist/proc/place_all_mobs()
|
||||||
if(!starting_locations || !starting_locations.len || !current_antagonists || !current_antagonists.len)
|
if(!starting_locations || !starting_locations.len || !current_antagonists || !current_antagonists.len)
|
||||||
return
|
return
|
||||||
for(var/datum/mind/player in current_antagonists)
|
for(var/datum/mind/player in current_antagonists)
|
||||||
player.current.loc = pick(starting_locations)
|
player.current.loc = pick(starting_locations)
|
||||||
|
|
||||||
/datum/antagonist/proc/place_mob(var/mob/living/mob)
|
|
||||||
if(!starting_locations || !starting_locations.len)
|
|
||||||
return
|
|
||||||
mob.loc = pick(starting_locations)
|
|
||||||
|
|
||||||
/datum/antagonist/proc/finalize(var/datum/mind/target)
|
/datum/antagonist/proc/finalize(var/datum/mind/target)
|
||||||
|
|
||||||
// This will fail if objectives have already been generated.
|
// This will fail if objectives have already been generated.
|
||||||
create_global_objectives()
|
create_global_objectives()
|
||||||
|
|
||||||
if(flags & ANTAG_HAS_LEADER)
|
if(leader && flags & ANTAG_HAS_NUKE && !spawned_nuke)
|
||||||
leader = current_antagonists[1]
|
make_nuke(leader)
|
||||||
|
|
||||||
if(target)
|
if(target)
|
||||||
apply(target)
|
apply(target)
|
||||||
equip(target.current)
|
|
||||||
create_objectives(target)
|
create_objectives(target)
|
||||||
update_icons_added(target)
|
update_icons_added(target)
|
||||||
greet(target)
|
greet(target)
|
||||||
@@ -331,9 +107,6 @@ var/global/list/antag_names_to_ids = list()
|
|||||||
update_icons_added(player)
|
update_icons_added(player)
|
||||||
greet(player)
|
greet(player)
|
||||||
|
|
||||||
if(flags & ANTAG_HAS_NUKE)
|
|
||||||
make_nuke(leader)
|
|
||||||
|
|
||||||
place_all_mobs()
|
place_all_mobs()
|
||||||
|
|
||||||
spawn(1)
|
spawn(1)
|
||||||
@@ -356,7 +129,7 @@ var/global/list/antag_names_to_ids = list()
|
|||||||
text += print_player_full(P)
|
text += print_player_full(P)
|
||||||
text += get_special_objective_text(P)
|
text += get_special_objective_text(P)
|
||||||
var/failed
|
var/failed
|
||||||
if(!global_objectives && P.objectives && P.objectives.len)
|
if(!global_objectives.len && P.objectives && P.objectives.len)
|
||||||
var/num = 1
|
var/num = 1
|
||||||
for(var/datum/objective/O in P.objectives)
|
for(var/datum/objective/O in P.objectives)
|
||||||
text += print_objective(O, num)
|
text += print_objective(O, num)
|
||||||
@@ -367,6 +140,7 @@ var/global/list/antag_names_to_ids = list()
|
|||||||
text += "<font color='red'>Fail.</font>"
|
text += "<font color='red'>Fail.</font>"
|
||||||
feedback_add_details(feedback_tag,"[O.type]|FAIL")
|
feedback_add_details(feedback_tag,"[O.type]|FAIL")
|
||||||
failed = 1
|
failed = 1
|
||||||
|
num++
|
||||||
|
|
||||||
if(!config.objectives_disabled)
|
if(!config.objectives_disabled)
|
||||||
if(failed)
|
if(failed)
|
||||||
@@ -385,7 +159,7 @@ var/global/list/antag_names_to_ids = list()
|
|||||||
world << text
|
world << text
|
||||||
|
|
||||||
/datum/antagonist/proc/print_objective(var/datum/objective/O, var/num, var/append_success)
|
/datum/antagonist/proc/print_objective(var/datum/objective/O, var/num, var/append_success)
|
||||||
var/text = "<BR/><B>Objective [num]:</B> [O.explanation_text] "
|
var/text = "<br><b>Objective [num]:</b> [O.explanation_text] "
|
||||||
if(append_success)
|
if(append_success)
|
||||||
if(O.check_completion())
|
if(O.check_completion())
|
||||||
text += "<font color='green'><B>Success!</B></font>"
|
text += "<font color='green'><B>Success!</B></font>"
|
||||||
@@ -434,31 +208,6 @@ var/global/list/antag_names_to_ids = list()
|
|||||||
|
|
||||||
return text
|
return text
|
||||||
|
|
||||||
/datum/antagonist/proc/get_special_objective_text()
|
|
||||||
return ""
|
|
||||||
|
|
||||||
/datum/antagonist/proc/add_antagonist(var/datum/mind/player)
|
|
||||||
if(!istype(player))
|
|
||||||
return 0
|
|
||||||
if(player in current_antagonists)
|
|
||||||
return 0
|
|
||||||
if(!can_become_antag(player))
|
|
||||||
return 0
|
|
||||||
current_antagonists |= player
|
|
||||||
apply(player)
|
|
||||||
finalize(player)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/antagonist/proc/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted)
|
|
||||||
if(player in current_antagonists)
|
|
||||||
player.current << "<span class='danger'><font size = 3>You are no longer a [role_text]!</font></span>"
|
|
||||||
current_antagonists -= player
|
|
||||||
player.special_role = null
|
|
||||||
update_icons_removed(player)
|
|
||||||
BITSET(player.current.hud_updateflag, SPECIALROLE_HUD)
|
|
||||||
return 1
|
|
||||||
return 0
|
|
||||||
|
|
||||||
/datum/antagonist/proc/update_all_icons()
|
/datum/antagonist/proc/update_all_icons()
|
||||||
if(!antag_indicator)
|
if(!antag_indicator)
|
||||||
return
|
return
|
||||||
@@ -498,64 +247,4 @@ var/global/list/antag_names_to_ids = list()
|
|||||||
if(I.icon_state == antag_indicator)
|
if(I.icon_state == antag_indicator)
|
||||||
del(I)
|
del(I)
|
||||||
|
|
||||||
/datum/antagonist/proc/can_become_antag(var/datum/mind/player)
|
|
||||||
if(player.current && jobban_isbanned(player.current, bantype))
|
|
||||||
return 0
|
|
||||||
if(player.assigned_role in protected_jobs)
|
|
||||||
return 0
|
|
||||||
if(config.protect_roles_from_antagonist && (player.assigned_role in restricted_jobs))
|
|
||||||
return 0
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/datum/antagonist/proc/check_victory()
|
|
||||||
var/result
|
|
||||||
if(config.objectives_disabled)
|
|
||||||
return 1
|
|
||||||
if(!victory_text || !loss_text)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if(global_objectives && global_objectives.len)
|
|
||||||
for(var/datum/objective/O in global_objectives)
|
|
||||||
if(!O.completed && !O.check_completion())
|
|
||||||
result = 1 // Victory.
|
|
||||||
else
|
|
||||||
O.completed = 1 //Will this break anything?
|
|
||||||
|
|
||||||
if(result)
|
|
||||||
world << "<span class='danger'><font size = 3>[victory_text]</span>"
|
|
||||||
if(victory_feedback_tag) feedback_set_details("round_end_result","[victory_feedback_tag]")
|
|
||||||
else
|
|
||||||
world << "<span class='danger'><font size = 3>[loss_text]</span>"
|
|
||||||
if(loss_feedback_tag) feedback_set_details("round_end_result","[loss_feedback_tag]")
|
|
||||||
|
|
||||||
/datum/antagonist/proc/make_nuke(var/atom/paper_spawn_loc, var/datum/mind/code_owner)
|
|
||||||
|
|
||||||
// Decide on a code.
|
|
||||||
var/obj/effect/landmark/nuke_spawn = locate(nuke_spawn_loc ? nuke_spawn_loc : "landmark*Nuclear-Bomb")
|
|
||||||
|
|
||||||
var/code
|
|
||||||
if(nuke_spawn)
|
|
||||||
var/obj/machinery/nuclearbomb/nuke = new(get_turf(nuke_spawn))
|
|
||||||
code = "[rand(10000, 99999)]"
|
|
||||||
nuke.r_code = code
|
|
||||||
|
|
||||||
if(code)
|
|
||||||
if(!paper_spawn_loc)
|
|
||||||
paper_spawn_loc = get_turf(locate("landmark*Nuclear-Code"))
|
|
||||||
if(paper_spawn_loc)
|
|
||||||
// Create and pass on the bomb code paper.
|
|
||||||
var/obj/item/weapon/paper/P = new(paper_spawn_loc)
|
|
||||||
P.info = "The nuclear authorization code is: <b>[code]</b>"
|
|
||||||
P.name = "nuclear bomb code"
|
|
||||||
if(code_owner)
|
|
||||||
code_owner.store_memory("<B>Nuclear Bomb Code</B>: [code]", 0, 0)
|
|
||||||
code_owner.current << "The nuclear authorization code is: <B>[code]</B>"
|
|
||||||
|
|
||||||
else
|
|
||||||
world << "<spam class='danger'>Could not spawn nuclear bomb. Contact a developer.</span>"
|
|
||||||
return
|
|
||||||
|
|
||||||
return code
|
|
||||||
|
|
||||||
/datum/antagonist/proc/random_spawn()
|
|
||||||
return attempt_spawn((spawn_lower ? spawn_lower : 1),(spawn_upper ? spawn_upper : 1),(flags & (ANTAG_OVERRIDE_MOB|ANTAG_OVERRIDE_JOB)))
|
|
||||||
@@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
/datum/antagonist/proc/apply(var/datum/mind/player)
|
/datum/antagonist/proc/apply(var/datum/mind/player)
|
||||||
|
|
||||||
|
if(flags & ANTAG_HAS_LEADER && !leader)
|
||||||
|
leader = current_antagonists[1]
|
||||||
|
|
||||||
// Get the mob.
|
// Get the mob.
|
||||||
if((flags & ANTAG_OVERRIDE_MOB) && (!player.current || (mob_path && !istype(player.current, mob_path))))
|
if((flags & ANTAG_OVERRIDE_MOB) && (!player.current || (mob_path && !istype(player.current, mob_path))))
|
||||||
var/mob/holder = player.current
|
var/mob/holder = player.current
|
||||||
@@ -48,6 +51,7 @@
|
|||||||
|
|
||||||
// Choose a name, if any.
|
// Choose a name, if any.
|
||||||
if(flags & ANTAG_CHOOSE_NAME)
|
if(flags & ANTAG_CHOOSE_NAME)
|
||||||
|
spawn(5)
|
||||||
var/newname = sanitize(copytext(input(player.current, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text,1,MAX_NAME_LEN))
|
var/newname = sanitize(copytext(input(player.current, "You are a [role_text]. Would you like to change your name to something else?", "Name change") as null|text,1,MAX_NAME_LEN))
|
||||||
if (newname)
|
if (newname)
|
||||||
player.current.real_name = newname
|
player.current.real_name = newname
|
||||||
@@ -116,4 +120,5 @@
|
|||||||
world << "<spam class='danger'>Could not spawn nuclear bomb. Contact a developer.</span>"
|
world << "<spam class='danger'>Could not spawn nuclear bomb. Contact a developer.</span>"
|
||||||
return
|
return
|
||||||
|
|
||||||
|
spawned_nuke = code
|
||||||
return code
|
return code
|
||||||
|
|||||||
@@ -5,23 +5,19 @@
|
|||||||
return ""
|
return ""
|
||||||
|
|
||||||
/datum/antagonist/proc/check_victory()
|
/datum/antagonist/proc/check_victory()
|
||||||
var/result
|
var/result = 1
|
||||||
if(config.objectives_disabled)
|
if(config.objectives_disabled)
|
||||||
return 1
|
return 1
|
||||||
if(!victory_text || !loss_text)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if(global_objectives && global_objectives.len)
|
if(global_objectives && global_objectives.len)
|
||||||
for(var/datum/objective/O in global_objectives)
|
for(var/datum/objective/O in global_objectives)
|
||||||
if(!O.completed && !O.check_completion())
|
if(!O.completed && !O.check_completion())
|
||||||
result = 1 // Victory.
|
result = 0
|
||||||
else
|
else
|
||||||
O.completed = 1 //Will this break anything?
|
O.completed = 1 //Will this break anything?
|
||||||
|
if(result && victory_text)
|
||||||
if(result)
|
|
||||||
world << "<span class='danger'><font size = 3>[victory_text]</span>"
|
world << "<span class='danger'><font size = 3>[victory_text]</span>"
|
||||||
if(victory_feedback_tag) feedback_set_details("round_end_result","[victory_feedback_tag]")
|
if(victory_feedback_tag) feedback_set_details("round_end_result","[victory_feedback_tag]")
|
||||||
else
|
else if(loss_text)
|
||||||
world << "<span class='danger'><font size = 3>[loss_text]</span>"
|
world << "<span class='danger'><font size = 3>[loss_text]</span>"
|
||||||
if(loss_feedback_tag) feedback_set_details("round_end_result","[loss_feedback_tag]")
|
if(loss_feedback_tag) feedback_set_details("round_end_result","[loss_feedback_tag]")
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
player.current << "<span class='danger'><i>You have been selected this round as an antagonist!</i></span>"
|
player.current << "<span class='danger'><i>You have been selected this round as an antagonist!</i></span>"
|
||||||
add_antagonist(player)
|
add_antagonist(player)
|
||||||
equip(player.current)
|
equip(player.current)
|
||||||
finalize(player)
|
|
||||||
if(move_to_spawn)
|
if(move_to_spawn)
|
||||||
place_mob(player.current)
|
place_mob(player.current)
|
||||||
return
|
return
|
||||||
@@ -34,7 +33,6 @@
|
|||||||
|
|
||||||
// Update our boundaries.
|
// Update our boundaries.
|
||||||
if(!candidates.len)
|
if(!candidates.len)
|
||||||
world << "Somehow there are no antagonist candidates."
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
//Grab candidates randomly until we have enough.
|
//Grab candidates randomly until we have enough.
|
||||||
@@ -60,6 +58,7 @@
|
|||||||
return 0
|
return 0
|
||||||
if(!can_become_antag(player))
|
if(!can_become_antag(player))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
current_antagonists |= player
|
current_antagonists |= player
|
||||||
apply(player)
|
apply(player)
|
||||||
finalize(player)
|
finalize(player)
|
||||||
@@ -81,6 +80,6 @@
|
|||||||
candidates = ticker.mode.get_players_for_role(role_type, id)
|
candidates = ticker.mode.get_players_for_role(role_type, id)
|
||||||
// Prune restricted jobs and status.
|
// Prune restricted jobs and status.
|
||||||
for(var/datum/mind/player in candidates)
|
for(var/datum/mind/player in candidates)
|
||||||
if((ghosts_only && !istype(player.current, /mob/dead)) || (player.assigned_role in restricted_jobs))
|
if((ghosts_only && !istype(player.current, /mob/dead)) || player.special_role || (player.assigned_role in restricted_jobs))
|
||||||
candidates -= player
|
candidates -= player
|
||||||
return candidates
|
return candidates
|
||||||
@@ -12,9 +12,7 @@ var/datum/antagonist/deathsquad/mercenary/commandos
|
|||||||
commandos = src
|
commandos = src
|
||||||
|
|
||||||
/datum/antagonist/deathsquad/mercenary/equip(var/mob/living/carbon/human/player)
|
/datum/antagonist/deathsquad/mercenary/equip(var/mob/living/carbon/human/player)
|
||||||
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(player)
|
|
||||||
R.set_frequency(SYND_FREQ) //Same frequency as the syndicate team in Nuke mode.
|
|
||||||
player.equip_to_slot_or_del(R, slot_l_ear)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(player), slot_w_uniform)
|
player.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(player), slot_w_uniform)
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/silenced(player), slot_belt)
|
player.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/silenced(player), slot_belt)
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(player), slot_shoes)
|
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(player), slot_shoes)
|
||||||
@@ -25,4 +23,8 @@ var/datum/antagonist/deathsquad/mercenary/commandos
|
|||||||
player.equip_to_slot_or_del(new /obj/item/ammo_magazine/c45(player), slot_in_backpack)
|
player.equip_to_slot_or_del(new /obj/item/ammo_magazine/c45(player), slot_in_backpack)
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/rig/merc(player), slot_back)
|
player.equip_to_slot_or_del(new /obj/item/weapon/rig/merc(player), slot_back)
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(player), slot_r_hand)
|
player.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(player), slot_r_hand)
|
||||||
create_id("Commando", player)
|
|
||||||
|
var/obj/item/weapon/card/id/id = create_id("Commando", player)
|
||||||
|
id.access |= get_all_accesses()
|
||||||
|
id.icon_state = "centcom"
|
||||||
|
create_radio(SYND_FREQ, player)
|
||||||
@@ -10,20 +10,9 @@ var/datum/antagonist/deathsquad/deathsquad
|
|||||||
flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE
|
flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_HAS_NUKE
|
||||||
max_antags = 4
|
max_antags = 4
|
||||||
max_antags_round = 6
|
max_antags_round = 6
|
||||||
|
default_access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
|
||||||
var/deployed = 0
|
var/deployed = 0
|
||||||
|
|
||||||
/datum/antagonist/deathsquad/proc/create_id(var/assignment, var/mob/living/carbon/human/player)
|
|
||||||
|
|
||||||
var/obj/item/weapon/card/id/W = new(player)
|
|
||||||
W.name = "[player.real_name]'s ID Card"
|
|
||||||
W.icon_state = "centcom"
|
|
||||||
W.access = get_all_accesses()
|
|
||||||
W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
|
|
||||||
W.assignment = "[assignment]"
|
|
||||||
W.registered_name = player.real_name
|
|
||||||
player.equip_to_slot_or_del(W, slot_wear_id)
|
|
||||||
|
|
||||||
/datum/antagonist/deathsquad/New(var/no_reference)
|
/datum/antagonist/deathsquad/New(var/no_reference)
|
||||||
..()
|
..()
|
||||||
if(!no_reference)
|
if(!no_reference)
|
||||||
@@ -38,9 +27,7 @@ var/datum/antagonist/deathsquad/deathsquad
|
|||||||
player.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(player), slot_w_uniform)
|
player.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(player), slot_w_uniform)
|
||||||
else
|
else
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(player), slot_w_uniform)
|
player.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(player), slot_w_uniform)
|
||||||
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(player)
|
|
||||||
R.set_frequency(DTH_FREQ)
|
|
||||||
player.equip_to_slot_or_del(R, slot_l_ear)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(player), slot_shoes)
|
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(player), slot_shoes)
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(player), slot_gloves)
|
player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(player), slot_gloves)
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(player), slot_glasses)
|
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(player), slot_glasses)
|
||||||
@@ -55,18 +42,25 @@ var/datum/antagonist/deathsquad/deathsquad
|
|||||||
player.equip_to_slot_or_del(new /obj/item/weapon/rig/combat(player), slot_back)
|
player.equip_to_slot_or_del(new /obj/item/weapon/rig/combat(player), slot_back)
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(player), slot_s_store)
|
player.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(player), slot_s_store)
|
||||||
player.implant_loyalty(player)
|
player.implant_loyalty(player)
|
||||||
create_id("Asset Protection", player)
|
|
||||||
return
|
var/obj/item/weapon/card/id/id = create_id("Asset Protection", player)
|
||||||
|
id.access |= get_all_accesses()
|
||||||
|
id.icon_state = "centcom"
|
||||||
|
create_radio(DTH_FREQ, player)
|
||||||
|
|
||||||
/datum/antagonist/deathsquad/apply(var/datum/mind/player)
|
/datum/antagonist/deathsquad/apply(var/datum/mind/player)
|
||||||
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
//var/syndicate_commando_leader_rank = pick("Lieutenant", "Captain", "Major")
|
var/syndicate_commando_rank
|
||||||
var/syndicate_commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
|
if(leader && player == leader)
|
||||||
|
syndicate_commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
|
||||||
|
else
|
||||||
|
syndicate_commando_rank = pick("Lieutenant", "Captain", "Major")
|
||||||
|
|
||||||
var/syndicate_commando_name = pick(last_names)
|
var/syndicate_commando_name = pick(last_names)
|
||||||
|
|
||||||
var/datum/preferences/A = new()//Randomize appearance for the commando.
|
var/datum/preferences/A = new() //Randomize appearance for the commando.
|
||||||
A.randomize_appearance_for(player.current)
|
A.randomize_appearance_for(player.current)
|
||||||
|
|
||||||
player.name = "[syndicate_commando_rank] [syndicate_commando_name]"
|
player.name = "[syndicate_commando_rank] [syndicate_commando_name]"
|
||||||
@@ -80,3 +74,10 @@ var/datum/antagonist/deathsquad/deathsquad
|
|||||||
H.dna.ready_dna(H)
|
H.dna.ready_dna(H)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
/datum/antagonist/deathsquad/finalize(var/datum/mind/target)
|
||||||
|
|
||||||
|
..()
|
||||||
|
|
||||||
|
if(!deployed)
|
||||||
|
deployed = 1
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ var/datum/antagonist/ert/ert
|
|||||||
max_antags = 5
|
max_antags = 5
|
||||||
max_antags_round = 5 // ERT mode?
|
max_antags_round = 5 // ERT mode?
|
||||||
|
|
||||||
flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB
|
flags = ANTAG_OVERRIDE_JOB | ANTAG_SET_APPEARANCE
|
||||||
|
|
||||||
/datum/antagonist/ert/New()
|
/datum/antagonist/ert/New()
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -8,9 +8,10 @@ var/datum/antagonist/mercenary/mercs
|
|||||||
role_text_plural = "Mercenaries"
|
role_text_plural = "Mercenaries"
|
||||||
landmark_id = "Syndicate-Spawn"
|
landmark_id = "Syndicate-Spawn"
|
||||||
welcome_text = "To speak on the strike team's private channel use :t."
|
welcome_text = "To speak on the strike team's private channel use :t."
|
||||||
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_HAS_NUKE
|
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_HAS_NUKE | ANTAG_SET_APPEARANCE
|
||||||
max_antags = 4
|
max_antags = 4
|
||||||
max_antags_round = 6
|
max_antags_round = 6
|
||||||
|
id_type = /obj/item/weapon/card/id/syndicate
|
||||||
|
|
||||||
/datum/antagonist/mercenary/New()
|
/datum/antagonist/mercenary/New()
|
||||||
..()
|
..()
|
||||||
@@ -22,25 +23,23 @@ var/datum/antagonist/mercenary/mercs
|
|||||||
global_objectives = list()
|
global_objectives = list()
|
||||||
global_objectives |= new /datum/objective/nuclear
|
global_objectives |= new /datum/objective/nuclear
|
||||||
|
|
||||||
/datum/antagonist/mercenary/equip(var/mob/living/carbon/human/synd_mob)
|
/datum/antagonist/mercenary/equip(var/mob/living/carbon/human/player)
|
||||||
|
|
||||||
if(!..())
|
if(!..())
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(synd_mob)
|
player.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(player), slot_w_uniform)
|
||||||
R.set_frequency(SYND_FREQ)
|
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(player), slot_shoes)
|
||||||
R.freerange = 1
|
player.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(player), slot_gloves)
|
||||||
synd_mob.equip_to_slot_or_del(R, slot_l_ear)
|
if(player.backbag == 2) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(player), slot_back)
|
||||||
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(synd_mob), slot_w_uniform)
|
if(player.backbag == 3) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(player), slot_back)
|
||||||
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(synd_mob), slot_shoes)
|
if(player.backbag == 4) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(player), slot_back)
|
||||||
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(synd_mob), slot_gloves)
|
player.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(player.back), slot_in_backpack)
|
||||||
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/card/id/syndicate(synd_mob), slot_wear_id)
|
player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack)
|
||||||
if(synd_mob.backbag == 2) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(synd_mob), slot_back)
|
player.update_icons()
|
||||||
if(synd_mob.backbag == 3) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(synd_mob), slot_back)
|
|
||||||
if(synd_mob.backbag == 4) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(synd_mob), slot_back)
|
create_id("Mercenary", player)
|
||||||
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(synd_mob.back), slot_in_backpack)
|
create_radio(SYND_FREQ, player)
|
||||||
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(synd_mob), slot_in_backpack)
|
|
||||||
synd_mob.update_icons()
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/datum/antagonist/mercenary/place_all_mobs()
|
/datum/antagonist/mercenary/place_all_mobs()
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ var/datum/antagonist/ninja/ninjas
|
|||||||
bantype = "ninja"
|
bantype = "ninja"
|
||||||
landmark_id = "ninjastart"
|
landmark_id = "ninjastart"
|
||||||
welcome_text = "You are an elite mercenary assassin of the Spider Clan. You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor.</span>"
|
welcome_text = "You are an elite mercenary assassin of the Spider Clan. You have a variety of abilities at your disposal, thanks to your nano-enhanced cyber armor.</span>"
|
||||||
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_RANDSPAWN | ANTAG_VOTABLE
|
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_RANDSPAWN | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE
|
||||||
max_antags = 3
|
max_antags = 3
|
||||||
max_antags_round = 3
|
max_antags_round = 3
|
||||||
|
|
||||||
|
|||||||
@@ -7,109 +7,85 @@ var/datum/antagonist/raider/raiders
|
|||||||
role_text_plural = "Raiders"
|
role_text_plural = "Raiders"
|
||||||
bantype = "raider"
|
bantype = "raider"
|
||||||
landmark_id = "voxstart"
|
landmark_id = "voxstart"
|
||||||
welcome_text = "Use :0 to speak Galcom, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!"
|
welcome_text = "Use :H to talk on your encrypted channel."
|
||||||
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE
|
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE
|
||||||
spawn_lower = 4
|
|
||||||
spawn_upper = 6
|
|
||||||
max_antags = 6
|
max_antags = 6
|
||||||
max_antags_round = 10
|
max_antags_round = 10
|
||||||
|
id_type = /obj/item/weapon/card/id/syndicate
|
||||||
|
|
||||||
// Heist overrides check_victory() and doesn't need victory or loss strings/tags.
|
// Heist overrides check_victory() and doesn't need victory or loss strings/tags.
|
||||||
var/spawn_tick = 1
|
var/list/raider_uniforms = list(
|
||||||
|
/obj/item/clothing/under/soviet,
|
||||||
|
/obj/item/clothing/under/pirate,
|
||||||
|
/obj/item/clothing/under/redcoat,
|
||||||
|
/obj/item/clothing/under/serviceoveralls,
|
||||||
|
/obj/item/clothing/under/captain_fly
|
||||||
|
)
|
||||||
|
|
||||||
|
var/list/raider_shoes = list(
|
||||||
|
/obj/item/clothing/shoes/jackboots,
|
||||||
|
/obj/item/clothing/shoes/sandal,
|
||||||
|
/obj/item/clothing/shoes/laceup
|
||||||
|
)
|
||||||
|
|
||||||
|
var/list/raider_glasses = list(
|
||||||
|
/obj/item/clothing/glasses/thermal,
|
||||||
|
/obj/item/clothing/glasses/thermal/eyepatch,
|
||||||
|
/obj/item/clothing/glasses/thermal/monocle
|
||||||
|
)
|
||||||
|
|
||||||
|
var/list/raider_helmets = list(
|
||||||
|
/obj/item/clothing/head/bearpelt,
|
||||||
|
/obj/item/clothing/head/ushanka,
|
||||||
|
/obj/item/clothing/head/pirate,
|
||||||
|
/obj/item/clothing/head/bandana,
|
||||||
|
/obj/item/clothing/head/hgpiratecap,
|
||||||
|
/obj/item/clothing/head/flatcap
|
||||||
|
)
|
||||||
|
|
||||||
|
var/list/raider_suits = list(
|
||||||
|
/obj/item/clothing/suit/pirate,
|
||||||
|
/obj/item/clothing/suit/hgpirate,
|
||||||
|
/obj/item/clothing/suit/storage/toggle/bomber,
|
||||||
|
/obj/item/clothing/suit/storage/leather_jacket,
|
||||||
|
/obj/item/clothing/suit/storage/toggle/brown_jacket,
|
||||||
|
/obj/item/clothing/suit/storage/toggle/hoodie,
|
||||||
|
/obj/item/clothing/suit/storage/toggle/hoodie/black
|
||||||
|
)
|
||||||
|
|
||||||
|
var/list/raider_guns = list(
|
||||||
|
/obj/item/weapon/gun/energy/laser,
|
||||||
|
/obj/item/weapon/gun/energy/retro,
|
||||||
|
/obj/item/weapon/gun/energy/xray,
|
||||||
|
/obj/item/weapon/gun/energy/mindflayer,
|
||||||
|
/obj/item/weapon/gun/energy/toxgun,
|
||||||
|
/obj/item/weapon/gun/energy/stunrevolver,
|
||||||
|
/obj/item/weapon/gun/energy/crossbow/largecrossbow,
|
||||||
|
/obj/item/weapon/gun/projectile/automatic/mini_uzi,
|
||||||
|
/obj/item/weapon/gun/projectile/automatic/c20r,
|
||||||
|
/obj/item/weapon/gun/projectile/silenced,
|
||||||
|
/obj/item/weapon/gun/projectile/shotgun/pump,
|
||||||
|
/obj/item/weapon/gun/projectile/shotgun/pump/combat,
|
||||||
|
/obj/item/weapon/gun/projectile/colt,
|
||||||
|
/obj/item/weapon/gun/projectile/pistol
|
||||||
|
)
|
||||||
|
|
||||||
/datum/antagonist/raider/New()
|
/datum/antagonist/raider/New()
|
||||||
..()
|
..()
|
||||||
raiders = src
|
raiders = src
|
||||||
|
|
||||||
/datum/antagonist/raider/equip(var/mob/living/carbon/human/player)
|
/datum/antagonist/raider/update_access(var/mob/living/player)
|
||||||
|
for(var/obj/item/weapon/storage/wallet/W in player.contents)
|
||||||
if(!..())
|
for(var/obj/item/weapon/card/id/id in W.contents)
|
||||||
return 0
|
id.name = "[player.real_name]'s Passport"
|
||||||
|
id.registered_name = player.real_name
|
||||||
player.age = rand(12,70)
|
W.name = "[initial(W.name)] ([id.name])"
|
||||||
player.set_species("Vox")
|
|
||||||
player.languages = list() // Removing language from chargen.
|
|
||||||
player.flavor_text = ""
|
|
||||||
player.add_language("Vox-pidgin")
|
|
||||||
player.add_language("Galactic Common")
|
|
||||||
player.add_language("Tradeband")
|
|
||||||
|
|
||||||
var/datum/language/voxlang = all_languages["Vox-pidgin"]
|
|
||||||
player.real_name = voxlang.get_random_name()
|
|
||||||
player.name = player.real_name
|
|
||||||
if(player.mind)
|
|
||||||
player.mind.name = player.name
|
|
||||||
player.h_style = "Short Vox Quills"
|
|
||||||
player.f_style = "Shaved"
|
|
||||||
|
|
||||||
for(var/datum/organ/external/limb in player.organs)
|
|
||||||
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
|
|
||||||
|
|
||||||
player.regenerate_icons()
|
|
||||||
|
|
||||||
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate(player)
|
|
||||||
R.set_frequency(SYND_FREQ)
|
|
||||||
player.equip_to_slot_or_del(R, slot_l_ear)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes(player), slot_w_uniform)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(player), slot_shoes) // REPLACE THESE WITH CODED VOX ALTERNATIVES.
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow/vox(player), slot_gloves) // AS ABOVE.
|
|
||||||
|
|
||||||
switch(spawn_tick)
|
|
||||||
if(1) // Vox raider!
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(player), slot_wear_suit)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(player), slot_head)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/melee/baton/loaded(player), slot_belt)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(player), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/device/chameleon(player), slot_l_store)
|
|
||||||
|
|
||||||
var/obj/item/weapon/gun/launcher/spikethrower/W = new(player)
|
|
||||||
player.equip_to_slot_or_del(W, slot_r_hand)
|
|
||||||
|
|
||||||
if(2) // Vox engineer!
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/pressure(player), slot_wear_suit)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/pressure(player), slot_head)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(player), slot_belt)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(player), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/storage/box/emps(player), slot_r_hand)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/device/multitool(player), slot_l_hand)
|
|
||||||
|
|
||||||
if(3) // Vox saboteur!
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/stealth(player), slot_wear_suit)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/stealth(player), slot_head)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(player), slot_belt)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(player), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/card/emag(player), slot_l_store)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/dartgun/vox/raider(player), slot_r_hand)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/device/multitool(player), slot_l_hand)
|
|
||||||
|
|
||||||
if(4) // Vox medic!
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/medic(player), slot_wear_suit)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/medic(player), slot_head)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(player), slot_belt) // Who needs actual surgical tools?
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(player), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/circular_saw(player), slot_l_store)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/dartgun/vox/medical, slot_r_hand)
|
|
||||||
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(player), slot_wear_mask)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(player), slot_back)
|
|
||||||
player.equip_to_slot_or_del(new /obj/item/device/flashlight(player), slot_r_store)
|
|
||||||
|
|
||||||
var/obj/item/weapon/card/id/syndicate/C = new(player)
|
|
||||||
C.name = "[player.real_name]'s Legitimate Human ID Card"
|
|
||||||
C.icon_state = "id"
|
|
||||||
C.access = list(access_syndicate)
|
|
||||||
C.assignment = "Trader"
|
|
||||||
C.registered_name = player.real_name
|
|
||||||
C.registered_user = player
|
|
||||||
var/obj/item/weapon/storage/wallet/W = new(player)
|
|
||||||
W.handle_item_insertion(C)
|
|
||||||
spawn_money(rand(50,150)*10,W)
|
|
||||||
player.equip_to_slot_or_del(W, slot_wear_id)
|
|
||||||
spawn_tick++
|
|
||||||
if (spawn_tick > 4) spawn_tick = 1
|
|
||||||
|
|
||||||
/datum/antagonist/raider/create_global_objectives()
|
/datum/antagonist/raider/create_global_objectives()
|
||||||
|
|
||||||
|
if(global_objectives.len)
|
||||||
|
return
|
||||||
|
|
||||||
var/i = 1
|
var/i = 1
|
||||||
var/max_objectives = pick(2,2,2,2,3,3,3,4)
|
var/max_objectives = pick(2,2,2,2,3,3,3,4)
|
||||||
global_objectives = list()
|
global_objectives = list()
|
||||||
@@ -130,9 +106,7 @@ var/datum/antagonist/raider/raiders
|
|||||||
|
|
||||||
i++
|
i++
|
||||||
|
|
||||||
//-All- vox raids have these two objectives. Failing them loses the game.
|
global_objectives |= new /datum/objective/heist/preserve_crew
|
||||||
global_objectives |= new /datum/objective/heist/inviolate_crew
|
|
||||||
global_objectives |= new /datum/objective/heist/inviolate_death
|
|
||||||
|
|
||||||
/datum/antagonist/raider/check_victory()
|
/datum/antagonist/raider/check_victory()
|
||||||
// Totally overrides the base proc.
|
// Totally overrides the base proc.
|
||||||
@@ -151,10 +125,10 @@ var/datum/antagonist/raider/raiders
|
|||||||
//Set result by objectives.
|
//Set result by objectives.
|
||||||
if(success == global_objectives.len)
|
if(success == global_objectives.len)
|
||||||
win_type = "Major"
|
win_type = "Major"
|
||||||
win_group = "Vox"
|
win_group = "Raider"
|
||||||
else if(success > 2)
|
else if(success > 2)
|
||||||
win_type = "Minor"
|
win_type = "Minor"
|
||||||
win_group = "Vox"
|
win_group = "Raider"
|
||||||
else
|
else
|
||||||
win_type = "Minor"
|
win_type = "Minor"
|
||||||
win_group = "Crew"
|
win_group = "Crew"
|
||||||
@@ -162,19 +136,19 @@ var/datum/antagonist/raider/raiders
|
|||||||
if(antags_are_dead())
|
if(antags_are_dead())
|
||||||
win_type = "Major"
|
win_type = "Major"
|
||||||
win_group = "Crew"
|
win_group = "Crew"
|
||||||
win_msg += "<B>The Vox Raiders have been wiped out!</B>"
|
win_msg += "<B>The Raiders have been wiped out!</B>"
|
||||||
else if(is_raider_crew_safe())
|
else if(is_raider_crew_safe())
|
||||||
if(win_group == "Crew" && win_type == "Minor")
|
if(win_group == "Crew" && win_type == "Minor")
|
||||||
win_type = "Major"
|
win_type = "Major"
|
||||||
win_group = "Crew"
|
win_group = "Crew"
|
||||||
win_msg += "<B>The Vox Raiders have left someone behind!</B>"
|
win_msg += "<B>The Raiders have left someone behind!</B>"
|
||||||
else
|
else
|
||||||
if(win_group == "Vox")
|
if(win_group == "Raider")
|
||||||
if(win_type == "Minor")
|
if(win_type == "Minor")
|
||||||
win_type = "Major"
|
win_type = "Major"
|
||||||
win_msg += "<B>The Vox Raiders escaped the station!</B>"
|
win_msg += "<B>The Raiders escaped the station!</B>"
|
||||||
else
|
else
|
||||||
win_msg += "<B>The Vox Raiders were repelled!</B>"
|
win_msg += "<B>The Raiders were repelled!</B>"
|
||||||
|
|
||||||
world << "<span class='danger'><font size = 3>[win_type] [win_group] victory!</font>"
|
world << "<span class='danger'><font size = 3>[win_type] [win_group] victory!</font>"
|
||||||
world << "[win_msg]"
|
world << "[win_msg]"
|
||||||
@@ -182,10 +156,61 @@ var/datum/antagonist/raider/raiders
|
|||||||
|
|
||||||
/datum/antagonist/raider/proc/is_raider_crew_safe()
|
/datum/antagonist/raider/proc/is_raider_crew_safe()
|
||||||
|
|
||||||
if(cortical_stacks.len == 0)
|
if(!current_antagonists || current_antagonists.len == 0)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
for(var/datum/organ/internal/stack/vox/stack in cortical_stacks)
|
for(var/datum/mind/player in current_antagonists)
|
||||||
if(stack.organ_holder && get_area(stack.organ_holder) != locate(/area/shuttle/vox/station))
|
if(!player.current || get_area(player.current) != locate(/area/shuttle/skipjack/station))
|
||||||
return 0
|
return 0
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
/datum/antagonist/raider/equip(var/mob/living/carbon/human/player)
|
||||||
|
|
||||||
|
if(!..())
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(player.species && player.species.name == "Vox")
|
||||||
|
equip_vox(player)
|
||||||
|
else
|
||||||
|
var/new_shoes = pick(raider_shoes)
|
||||||
|
var/new_uniform = pick(raider_uniforms)
|
||||||
|
var/new_glasses = pick(raider_glasses)
|
||||||
|
var/new_helmet = pick(raider_helmets)
|
||||||
|
var/new_suit = pick(raider_suits)
|
||||||
|
var/new_gun = pick(raider_guns)
|
||||||
|
|
||||||
|
player.equip_to_slot_or_del(new new_shoes(player),slot_shoes)
|
||||||
|
player.equip_to_slot_or_del(new new_uniform(player),slot_w_uniform)
|
||||||
|
player.equip_to_slot_or_del(new new_glasses(player),slot_glasses)
|
||||||
|
player.equip_to_slot_or_del(new new_helmet(player),slot_head)
|
||||||
|
player.equip_to_slot_or_del(new new_suit(player),slot_wear_suit)
|
||||||
|
player.equip_to_slot_or_del(new new_gun(player),slot_belt)
|
||||||
|
|
||||||
|
var/obj/item/weapon/card/id/id = create_id("Visitor", player)
|
||||||
|
id.name = "[player.real_name]'s Passport"
|
||||||
|
id.assignment = "Visitor"
|
||||||
|
var/obj/item/weapon/storage/wallet/W = new(player)
|
||||||
|
W.handle_item_insertion(id)
|
||||||
|
player.equip_to_slot_or_del(W, slot_wear_id)
|
||||||
|
spawn_money(rand(50,150)*10,W)
|
||||||
|
create_radio(SYND_FREQ, player)
|
||||||
|
|
||||||
|
return 1
|
||||||
|
|
||||||
|
/datum/antagonist/raider/proc/equip_vox(var/mob/living/carbon/human/player)
|
||||||
|
|
||||||
|
var/uniform_type = pick(list(/obj/item/clothing/under/vox/vox_robes,/obj/item/clothing/under/vox/vox_casual))
|
||||||
|
|
||||||
|
player.equip_to_slot_or_del(new uniform_type(player), slot_w_uniform)
|
||||||
|
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(player), slot_shoes) // REPLACE THESE WITH CODED VOX ALTERNATIVES.
|
||||||
|
player.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow/vox(player), slot_gloves) // AS ABOVE.
|
||||||
|
player.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat/vox(player), slot_wear_mask)
|
||||||
|
player.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(player), slot_back)
|
||||||
|
player.equip_to_slot_or_del(new /obj/item/device/flashlight(player), slot_r_store)
|
||||||
|
|
||||||
|
player.internal = locate(/obj/item/weapon/tank) in player.contents
|
||||||
|
if(istype(player.internal,/obj/item/weapon/tank) && player.internals)
|
||||||
|
player.internals.icon_state = "internal1"
|
||||||
|
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ var/datum/antagonist/wizard/wizards
|
|||||||
bantype = "wizard"
|
bantype = "wizard"
|
||||||
landmark_id = "wizard"
|
landmark_id = "wizard"
|
||||||
welcome_text = "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.<br>In your pockets you will find a teleport scroll. Use it as needed."
|
welcome_text = "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.<br>In your pockets you will find a teleport scroll. Use it as needed."
|
||||||
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE
|
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE
|
||||||
spawn_lower = 1
|
max_antags = 1
|
||||||
spawn_upper = 1
|
|
||||||
|
|
||||||
/datum/antagonist/wizard/New()
|
/datum/antagonist/wizard/New()
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ var/datum/antagonist/rogue_ai/malf
|
|||||||
hacked_apcs |= apc
|
hacked_apcs |= apc
|
||||||
|
|
||||||
/datum/antagonist/rogue_ai/proc/update_takeover_time()
|
/datum/antagonist/rogue_ai/proc/update_takeover_time()
|
||||||
hack_time -= ((hacked_apcs.len/6)*last_tick_duration)
|
hack_time -= ((hacked_apcs.len/6)*tickerProcess.getLastTickerTimeDuration())
|
||||||
|
|
||||||
/datum/antagonist/rogue_ai/tick()
|
/datum/antagonist/rogue_ai/tick()
|
||||||
if(revealed && hacked_apcs.len >= 3)
|
if(revealed && hacked_apcs.len >= 3)
|
||||||
@@ -54,7 +54,7 @@ var/datum/antagonist/rogue_ai/malf
|
|||||||
player.verbs += /mob/living/silicon/ai/proc/takeover
|
player.verbs += /mob/living/silicon/ai/proc/takeover
|
||||||
player.verbs += /mob/living/silicon/ai/proc/self_destruct
|
player.verbs += /mob/living/silicon/ai/proc/self_destruct
|
||||||
|
|
||||||
player.laws = new /datum/ai_laws/malfunction
|
player.laws = new /datum/ai_laws/nanotrasen/malfunction
|
||||||
player.malf_picker = new /datum/AI_Module/module_picker
|
player.malf_picker = new /datum/AI_Module/module_picker
|
||||||
|
|
||||||
/datum/antagonist/rogue_ai/greet(var/datum/mind/player)
|
/datum/antagonist/rogue_ai/greet(var/datum/mind/player)
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
break
|
break
|
||||||
additional_antag_types |= antag_id
|
additional_antag_types |= antag_id
|
||||||
i++
|
i++
|
||||||
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/datum/game_mode/calamity/check_victory()
|
/datum/game_mode/calamity/check_victory()
|
||||||
|
|||||||
@@ -249,14 +249,7 @@ var/global/list/additional_antag_types = list()
|
|||||||
if(playerC < required_players)
|
if(playerC < required_players)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
// If we can, -try- to spawn the other voted antagonist types. It doesn't really matter if we can't.
|
if(!(antag_templates && antag_templates.len))
|
||||||
if(!do_not_spawn)
|
|
||||||
if(antag_templates && antag_templates.len)
|
|
||||||
var/datum/antagonist/main_antags = antag_templates[1]
|
|
||||||
var/list/candidates = main_antags.get_candidates(required_enemies)
|
|
||||||
if(candidates.len > required_enemies)
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
// Attempt to mark folks down as ready to go. Don't finalize until post setup.
|
// Attempt to mark folks down as ready to go. Don't finalize until post setup.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
HEIST ROUNDTYPE
|
VOX HEIST ROUNDTYPE
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective. Clumsy, rewrite sometime.
|
var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective. Clumsy, rewrite sometime.
|
||||||
@@ -11,26 +11,21 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
|
|||||||
required_players = 15
|
required_players = 15
|
||||||
required_players_secret = 25
|
required_players_secret = 25
|
||||||
required_enemies = 4
|
required_enemies = 4
|
||||||
votable = 0
|
|
||||||
round_description = "An unidentified bluespace signature has slipped past the Icarus and is approaching the station!"
|
round_description = "An unidentified bluespace signature has slipped past the Icarus and is approaching the station!"
|
||||||
end_on_antag_death = 1
|
end_on_antag_death = 1
|
||||||
|
|
||||||
/datum/game_mode/heist/check_finished()
|
/datum/game_mode/heist/check_finished()
|
||||||
|
|
||||||
if(!..())
|
if(!..())
|
||||||
var/datum/shuttle/multi_shuttle/skipjack = shuttle_controller.shuttles["Vox Skipjack"]
|
var/datum/shuttle/multi_shuttle/skipjack = shuttle_controller.shuttles["Skipjack"]
|
||||||
if (skipjack && skipjack.returned_home)
|
if (skipjack && skipjack.returned_home)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/datum/game_mode/heist/cleanup()
|
/datum/game_mode/heist/cleanup()
|
||||||
//the skipjack and everything in it have left and aren't coming back, so get rid of them.
|
//the skipjack and everything in it have left and aren't coming back, so get rid of them.
|
||||||
var/area/skipjack = locate(/area/shuttle/skipjack/station)
|
var/area/skipjack = locate(/area/shuttle/skipjack/station)
|
||||||
for (var/mob/living/M in skipjack.contents)
|
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)
|
for (var/obj/O in skipjack.contents)
|
||||||
del(O) //no hiding in lockers or anything
|
del(O) //no hiding in lockers or anything
|
||||||
@@ -11,11 +11,9 @@
|
|||||||
auto_recall_shuttle = 1
|
auto_recall_shuttle = 1
|
||||||
antag_tag = MODE_MALFUNCTION
|
antag_tag = MODE_MALFUNCTION
|
||||||
|
|
||||||
|
|
||||||
/datum/game_mode/malfunction/process()
|
/datum/game_mode/malfunction/process()
|
||||||
malf.tick()
|
malf.tick()
|
||||||
|
|
||||||
|
|
||||||
/datum/game_mode/malfunction/check_finished()
|
/datum/game_mode/malfunction/check_finished()
|
||||||
if (malf.station_captured && !malf.can_nuke)
|
if (malf.station_captured && !malf.can_nuke)
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -713,7 +713,7 @@ datum/objective/heist/kidnap
|
|||||||
target = pick(possible_targets)
|
target = pick(possible_targets)
|
||||||
|
|
||||||
if(target && target.current)
|
if(target && target.current)
|
||||||
explanation_text = "The Shoal has a need for [target.current.real_name], the [target.assigned_role]. Take them alive."
|
explanation_text = "We can get a good price for [target.current.real_name], the [target.assigned_role]. Take them alive."
|
||||||
else
|
else
|
||||||
explanation_text = "Free Objective"
|
explanation_text = "Free Objective"
|
||||||
return target
|
return target
|
||||||
@@ -770,7 +770,7 @@ datum/objective/heist/loot
|
|||||||
target_amount = 1
|
target_amount = 1
|
||||||
loot = "an ion gun"
|
loot = "an ion gun"
|
||||||
|
|
||||||
explanation_text = "We are lacking in hardware. Steal [loot]."
|
explanation_text = "It's a buyer's market out here. Steal [loot] for resale."
|
||||||
|
|
||||||
check_completion()
|
check_completion()
|
||||||
|
|
||||||
@@ -850,25 +850,14 @@ datum/objective/heist/salvage
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
/datum/objective/heist/inviolate_crew
|
/datum/objective/heist/preserve_crew
|
||||||
explanation_text = "Do not leave anyone behind, alive or dead."
|
explanation_text = "Do not leave anyone behind, alive or dead."
|
||||||
|
|
||||||
check_completion()
|
check_completion()
|
||||||
if(raiders && raiders.is_raider_crew_safe()) return 1
|
if(raiders && raiders.is_raider_crew_safe()) return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
#define MAX_RAIDER_KILLS 10 //Number of kills during the round before the Inviolate is broken.
|
|
||||||
//Would be nice to use raider-specific kills but is currently not feasible.
|
|
||||||
var/global/raider_kills = 0 //Used to check the Inviolate.
|
|
||||||
|
|
||||||
datum/objective/heist/inviolate_death
|
|
||||||
explanation_text = "Minimise deaths and loss of resources."
|
|
||||||
check_completion()
|
|
||||||
if(raider_kills > MAX_RAIDER_KILLS) return 0
|
|
||||||
return 1
|
|
||||||
|
|
||||||
//Borer objective(s).
|
//Borer objective(s).
|
||||||
|
|
||||||
/datum/objective/borer_survive
|
/datum/objective/borer_survive
|
||||||
explanation_text = "Survive in a host until the end of the round."
|
explanation_text = "Survive in a host until the end of the round."
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,7 @@
|
|||||||
if(choice && choice == "Yes")
|
if(choice && choice == "Yes")
|
||||||
var/mob/living/carbon/human/vox/vox = new(get_turf(src),"Vox")
|
var/mob/living/carbon/human/vox/vox = new(get_turf(src),"Vox")
|
||||||
vox.gender = user.gender
|
vox.gender = user.gender
|
||||||
vox.equip_vox_raider()
|
raiders.equip(vox)
|
||||||
if(user.mind)
|
if(user.mind)
|
||||||
user.mind.transfer_to(vox)
|
user.mind.transfer_to(vox)
|
||||||
spawn(1)
|
spawn(1)
|
||||||
@@ -90,5 +90,6 @@
|
|||||||
newname = L.get_random_name()
|
newname = L.get_random_name()
|
||||||
vox.real_name = newname
|
vox.real_name = newname
|
||||||
vox.name = vox.real_name
|
vox.name = vox.real_name
|
||||||
|
raiders.update_access(vox)
|
||||||
del(user)
|
del(user)
|
||||||
..()
|
..()
|
||||||
@@ -65,8 +65,6 @@
|
|||||||
if(ticker && ticker.mode)
|
if(ticker && ticker.mode)
|
||||||
sql_report_death(src)
|
sql_report_death(src)
|
||||||
ticker.mode.check_win()
|
ticker.mode.check_win()
|
||||||
if(istype(ticker.mode,/datum/game_mode/heist))
|
|
||||||
raider_kills++ //Bad raider. Shouldn't be killing people.
|
|
||||||
|
|
||||||
return ..(gibbed,species.death_message)
|
return ..(gibbed,species.death_message)
|
||||||
|
|
||||||
|
|||||||
@@ -809,7 +809,7 @@ var/list/be_special_flags = list(
|
|||||||
#define ANTAG_HAS_NUKE 128 // Will spawn a nuke at supplied location.
|
#define ANTAG_HAS_NUKE 128 // Will spawn a nuke at supplied location.
|
||||||
#define ANTAG_RANDSPAWN 256 // Potentially randomly spawns due to events.
|
#define ANTAG_RANDSPAWN 256 // Potentially randomly spawns due to events.
|
||||||
#define ANTAG_VOTABLE 512 // Can be voted as an additional antagonist before roundstart.
|
#define ANTAG_VOTABLE 512 // Can be voted as an additional antagonist before roundstart.
|
||||||
|
#define ANTAG_SET_APPEARANCE 1024 // Causes antagonists to use an appearance modifier on spawn.
|
||||||
// Mode/antag template macros.
|
// Mode/antag template macros.
|
||||||
#define MODE_BORER "borer"
|
#define MODE_BORER "borer"
|
||||||
#define MODE_XENOMORPH "xeno"
|
#define MODE_XENOMORPH "xeno"
|
||||||
|
|||||||
5334
maps/exodus-1.dmm
5334
maps/exodus-1.dmm
File diff suppressed because it is too large
Load Diff
1865
maps/exodus-2.dmm
1865
maps/exodus-2.dmm
File diff suppressed because it is too large
Load Diff
3352
maps/exodus-5.dmm
3352
maps/exodus-5.dmm
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user