Part 2 - Missing stuff from original families port
@@ -111,3 +111,6 @@ GLOBAL_LIST_EMPTY(living_heart_cache) //A list of all living hearts in existance
|
||||
#define BLOB_SPREAD_COST 4
|
||||
#define BLOB_ATTACK_REFUND 2 //blob refunds this much if it attacks and doesn't spread
|
||||
#define BLOB_REFLECTOR_COST 15
|
||||
|
||||
/// The dimensions of the antagonist preview icon. Will be scaled to this size.
|
||||
#define ANTAGONIST_PREVIEW_ICON_SIZE 96
|
||||
|
||||
@@ -61,6 +61,9 @@
|
||||
#define ANTAG_HUD_BLOODSUCKER 24
|
||||
#define ANTAG_HUD_FUGITIVE 25
|
||||
#define ANTAG_HUD_HERETIC 26
|
||||
#define ANTAG_HUD_GANGSTER 25
|
||||
#define ANTAG_HUD_SPACECOP 26
|
||||
|
||||
|
||||
// Notification action types
|
||||
#define NOTIFY_JUMP "jump"
|
||||
|
||||
@@ -380,6 +380,8 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
|
||||
#define CLOCK_PROSELYTIZATION 23
|
||||
#define SHUTTLE_HIJACK 24
|
||||
#define GANG_VICTORY 25
|
||||
#define GANG_DESTROYED 25
|
||||
#define GANG_OPERATING 26
|
||||
|
||||
#define FIELD_TURF 1
|
||||
#define FIELD_EDGE 2
|
||||
|
||||
@@ -36,7 +36,9 @@
|
||||
#define ROLE_DEATHSQUAD "deathsquad"
|
||||
#define ROLE_LAVALAND "lavaland"
|
||||
#define ROLE_INTERNAL_AFFAIRS "internal affairs agent"
|
||||
#define ROLE_GANG "gangster"
|
||||
#define ROLE_GANG "old gangster"
|
||||
#define ROLE_FAMILIES "gangster"
|
||||
#define ROLE_FAMILY_HEAD_ASPIRANT "family head aspirant"
|
||||
#define ROLE_BLOODSUCKER "bloodsucker"
|
||||
#define ROLE_SPACE_DRAGON "Space Dragon"
|
||||
//#define ROLE_MONSTERHUNTER "monster hunter" Disabled for now
|
||||
@@ -72,9 +74,10 @@ GLOBAL_LIST_INIT(special_roles, list(
|
||||
ROLE_OVERTHROW = /datum/game_mode/overthrow,
|
||||
ROLE_INTERNAL_AFFAIRS = /datum/game_mode/traitor/internal_affairs,
|
||||
ROLE_SENTIENCE,
|
||||
ROLE_GANG = /datum/game_mode/gang,
|
||||
ROLE_GANG = /datum/game_mode/gang_old,
|
||||
ROLE_HERETIC = /datum/game_mode/heretics,
|
||||
ROLE_BLOODSUCKER = /datum/game_mode/bloodsucker,
|
||||
ROLE_FAMILIES = /datum/game_mode/gang,
|
||||
ROLE_SPACE_DRAGON
|
||||
//ROLE_MONSTERHUNTER Disabled for now
|
||||
))
|
||||
|
||||
@@ -52,6 +52,8 @@ GLOBAL_LIST_EMPTY(current_observers_list)
|
||||
|
||||
//Dynamic Port
|
||||
GLOBAL_LIST_EMPTY(new_player_list) //all /mob/dead/new_player, in theory all should have clients and those that don't are in the process of spawning and get deleted when done.
|
||||
//Family Port
|
||||
GLOBAL_LIST_EMPTY(pre_setup_antags) //minds that have been picked as antag by the gamemode. removed as antag datums are set.
|
||||
|
||||
/proc/update_config_movespeed_type_lookup(update_mobs = TRUE)
|
||||
// NOTE: This is entirely based on the fact that byond typesof/subtypesof gets longer/deeper paths before shallower ones.
|
||||
|
||||
@@ -176,9 +176,6 @@
|
||||
#define ui_ghost_mafia "SOUTH: 6, CENTER+2:24"
|
||||
#define ui_ghost_spawners "SOUTH: 6, CENTER+1:24" // LEGACY. SAME LOC AS PAI
|
||||
|
||||
// #define ui_wanted_lvl "NORTH,11"
|
||||
|
||||
|
||||
//UI position overrides for 1:1 screen layout. (default is 7:5)
|
||||
#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button
|
||||
#define ui_overridden_resist "EAST-3:24,SOUTH+1:7"
|
||||
@@ -190,3 +187,5 @@
|
||||
#define ui_boxarea "EAST-4:6,SOUTH+1:6"
|
||||
#define ui_boxlang "EAST-5:22,SOUTH+1:6"
|
||||
#define ui_boxvore "EAST-5:22,SOUTH+1:6"
|
||||
|
||||
#define ui_wanted_lvl "NORTH,11"
|
||||
|
||||
@@ -98,6 +98,7 @@
|
||||
var/alerttooltipstyle = ""
|
||||
var/override_alerts = FALSE //If it is overriding other alerts of the same type
|
||||
var/mob/mob_viewer //the mob viewing this alert
|
||||
var/mob/owner //Alert owner
|
||||
|
||||
|
||||
/atom/movable/screen/alert/MouseEntered(location,control,params)
|
||||
@@ -348,24 +349,27 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
|
||||
/// An overrideable proc used simply to hand over the item when claimed, this is a proc so that high-fives can override them since nothing is actually transferred
|
||||
/atom/movable/screen/alert/give/proc/handle_transfer()
|
||||
var/mob/living/carbon/taker = owner
|
||||
taker.take(offerer, receiving)
|
||||
taker.take(giver, receiving)
|
||||
|
||||
/// Simply checks if the other person is still in range
|
||||
/atom/movable/screen/alert/give/proc/check_in_range(atom/taker)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!offerer.CanReach(taker))
|
||||
to_chat(owner, span_warning("You moved out of range of [offerer]!"))
|
||||
owner.clear_alert("[offerer]")
|
||||
if(!giver.CanReach(taker))
|
||||
to_chat(owner, span_warning("You moved out of range of [giver]!"))
|
||||
owner.clear_alert("[giver]")
|
||||
|
||||
/atom/movable/screen/alert/give/secret_handshake/setup(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving)
|
||||
name = "[offerer] is offering a Handshake"
|
||||
desc = "[offerer] wants to teach you the Secret Handshake for their Family and induct you! Click on this alert to accept."
|
||||
/atom/movable/screen/alert/give/secret_handshake
|
||||
icon_state = "default"
|
||||
|
||||
/atom/movable/screen/alert/give/secret_handshake/setup(mob/living/carbon/taker, mob/living/carbon/giver, obj/item/receiving)
|
||||
name = "[giver] is offering a Handshake"
|
||||
desc = "[giver] wants to teach you the Secret Handshake for their Family and induct you! Click on this alert to accept."
|
||||
icon_state = "template"
|
||||
cut_overlays()
|
||||
add_overlay(receiving)
|
||||
src.receiving = receiving
|
||||
src.offerer = offerer
|
||||
src.giver = giver
|
||||
RegisterSignal(taker, COMSIG_MOVABLE_MOVED, .proc/check_in_range, override = TRUE) //Override to prevent runtimes when people offer a item multiple times
|
||||
|
||||
//ALIENS
|
||||
|
||||
@@ -58,6 +58,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
var/atom/movable/screen/healthdoll
|
||||
var/atom/movable/screen/internals
|
||||
|
||||
var/atom/movable/screen/wanted/wanted_lvl
|
||||
// subtypes can override this to force a specific UI style
|
||||
var/ui_style
|
||||
|
||||
@@ -80,6 +81,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
plane_masters["[instance.plane]"] = instance
|
||||
instance.backdrop(mymob)
|
||||
|
||||
wanted_lvl = new /obj/screen()
|
||||
wanted_lvl.icon = 'icons/obj/gang/wanted_160x32.dmi'
|
||||
wanted_lvl.icon_state = "wanted_0"
|
||||
wanted_lvl.screen_loc = ui_wanted_lvl
|
||||
infodisplay += wanted_lvl
|
||||
|
||||
|
||||
/datum/hud/Destroy()
|
||||
if(mymob.hud_used == src)
|
||||
mymob.hud_used = null
|
||||
@@ -100,6 +108,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
|
||||
healths = null
|
||||
healthdoll = null
|
||||
wanted_lvl = null
|
||||
internals = null
|
||||
lingchemdisplay = null
|
||||
devilsouldisplay = null
|
||||
|
||||
@@ -14,6 +14,9 @@ SUBSYSTEM_DEF(atoms)
|
||||
|
||||
var/list/BadInitializeCalls = list()
|
||||
|
||||
/// Atoms that will be deleted once the subsystem is initialized
|
||||
var/list/queued_deletions = list()
|
||||
|
||||
initialized = INITIALIZATION_INSSATOMS
|
||||
|
||||
/datum/controller/subsystem/atoms/Initialize(timeofday)
|
||||
@@ -62,6 +65,12 @@ SUBSYSTEM_DEF(atoms)
|
||||
testing("Late initialized [late_loaders.len] atoms")
|
||||
late_loaders.Cut()
|
||||
|
||||
for (var/queued_deletion in queued_deletions)
|
||||
qdel(queued_deletion)
|
||||
|
||||
testing("[queued_deletions.len] atoms were queued for deletion.")
|
||||
queued_deletions.Cut()
|
||||
|
||||
/// Init this specific atom
|
||||
/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments)
|
||||
var/the_type = A.type
|
||||
@@ -151,6 +160,14 @@ SUBSYSTEM_DEF(atoms)
|
||||
if(fails & BAD_INIT_SLEPT)
|
||||
. += "- Slept during Initialize()\n"
|
||||
|
||||
/// Prepares an atom to be deleted once the atoms SS is initialized.
|
||||
/datum/controller/subsystem/atoms/proc/prepare_deletion(atom/target)
|
||||
if (initialized == INITIALIZATION_INNEW_REGULAR)
|
||||
// Atoms SS has already completed, just kill it now.
|
||||
qdel(target)
|
||||
else
|
||||
queued_deletions += WEAKREF(target)
|
||||
|
||||
/datum/controller/subsystem/atoms/Shutdown()
|
||||
var/initlog = InitLog()
|
||||
if(initlog)
|
||||
|
||||
@@ -582,6 +582,10 @@ SUBSYSTEM_DEF(ticker)
|
||||
news_message = "During routine evacuation procedures, the emergency shuttle of [station_name()] had its navigation protocols corrupted and went off course, but was recovered shortly after."
|
||||
if(GANG_VICTORY)
|
||||
news_message = "Company officials reaffirmed that sudden deployments of special forces are not in any way connected to rumors of [station_name()] being covered in graffiti."
|
||||
if(GANG_OPERATING)
|
||||
news_message = "The company would like to state that any rumors of criminal organizing on board stations such as [station_name()] are falsehoods, and not to be emulated."
|
||||
if(GANG_DESTROYED)
|
||||
news_message = "The crew of [station_name()] would like to thank the Spinward Stellar Coalition Police Department for quickly resolving a minor terror threat to the station."
|
||||
|
||||
if(SSblackbox.first_death)
|
||||
var/list/ded = SSblackbox.first_death
|
||||
|
||||
@@ -29,7 +29,9 @@ GLOBAL_LIST_INIT(huds, list(
|
||||
ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_BLOODSUCKER = new/datum/atom_hud/antag/bloodsucker(),
|
||||
ANTAG_HUD_FUGITIVE = new/datum/atom_hud/antag(),
|
||||
ANTAG_HUD_HERETIC = new/datum/atom_hud/antag/hidden()
|
||||
ANTAG_HUD_HERETIC = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_GANGSTER = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_SPACECOP = new/datum/atom_hud/antag()
|
||||
))
|
||||
|
||||
/datum/atom_hud
|
||||
|
||||
@@ -86,4 +86,4 @@
|
||||
|
||||
/datum/status_effect/offering/secret_handshake
|
||||
id = "secret_handshake"
|
||||
give_alert_type = /atom/movable/screen/alert/give/secret_handshake
|
||||
alert_type = /atom/movable/screen/alert/give/secret_handshake
|
||||
|
||||
449
code/game/gamemodes/gang/gang.dm
Normal file
@@ -0,0 +1,449 @@
|
||||
#define LOWPOP_FAMILIES_COUNT 50
|
||||
|
||||
#define TWO_STARS_HIGHPOP 11
|
||||
#define THREE_STARS_HIGHPOP 16
|
||||
#define FOUR_STARS_HIGHPOP 21
|
||||
#define FIVE_STARS_HIGHPOP 31
|
||||
|
||||
#define TWO_STARS_LOW 6
|
||||
#define THREE_STARS_LOW 9
|
||||
#define FOUR_STARS_LOW 12
|
||||
#define FIVE_STARS_LOW 15
|
||||
|
||||
#define CREW_SIZE_MIN 4
|
||||
#define CREW_SIZE_MAX 8
|
||||
|
||||
|
||||
GLOBAL_VAR_INIT(deaths_during_shift, 0)
|
||||
/datum/game_mode/gang
|
||||
name = "Families"
|
||||
config_tag = "families"
|
||||
antag_flag = ROLE_TRAITOR
|
||||
false_report_weight = 5
|
||||
required_players = 0
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
announce_span = "danger"
|
||||
announce_text = "Grove For Lyfe!"
|
||||
reroll_friendly = FALSE
|
||||
restricted_jobs = list("Cyborg", "AI", "Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")//N O
|
||||
protected_jobs = list()
|
||||
var/check_counter = 0
|
||||
var/endtime = null
|
||||
var/fuckingdone = FALSE
|
||||
var/time_to_end = 60 MINUTES
|
||||
var/gangs_to_generate = 3
|
||||
var/list/gangs_to_use
|
||||
var/list/datum/mind/gangbangers = list()
|
||||
var/list/datum/mind/pigs = list()
|
||||
var/datum/mind/undercover_cop
|
||||
var/list/gangs = list()
|
||||
var/gangs_still_alive = 0
|
||||
var/sent_announcement = FALSE
|
||||
var/list/gang_locations = list()
|
||||
var/lock_stars = FALSE
|
||||
var/cops_arrived = FALSE
|
||||
var/gang_balance_cap = 5
|
||||
var/current_stars = "wanted_0"
|
||||
|
||||
/datum/game_mode/gang/warriors
|
||||
name = "Warriors"
|
||||
config_tag = "warriors"
|
||||
announce_text = "Can you survive this onslaught?"
|
||||
gang_balance_cap = 3
|
||||
|
||||
/datum/game_mode/gang/warriors/pre_setup()
|
||||
gangs_to_use = subtypesof(/datum/antagonist/gang)
|
||||
gangs_to_generate = gangs_to_use.len
|
||||
. = ..()
|
||||
|
||||
/datum/game_mode/gang/pre_setup()
|
||||
gangs_to_use = subtypesof(/datum/antagonist/gang)
|
||||
for(var/j = 0, j < gangs_to_generate, j++)
|
||||
if (!antag_candidates.len)
|
||||
break
|
||||
var/datum/mind/gangbanger = antag_pick(antag_candidates)
|
||||
gangbangers += gangbanger
|
||||
gangbanger.restricted_roles = restricted_jobs
|
||||
log_game("[key_name(gangbanger)] has been selected as a starting gangster!")
|
||||
antag_candidates.Remove(gangbanger)
|
||||
if(antag_candidates.len)
|
||||
var/datum/mind/one_eight_seven_on_an_undercover_cop = antag_pick(antag_candidates)
|
||||
pigs += one_eight_seven_on_an_undercover_cop
|
||||
undercover_cop = one_eight_seven_on_an_undercover_cop
|
||||
undercover_cop.restricted_roles = restricted_jobs
|
||||
log_game("[key_name(one_eight_seven_on_an_undercover_cop)] has been selected as a starting undercover cop!")
|
||||
antag_candidates.Remove(one_eight_seven_on_an_undercover_cop)
|
||||
endtime = world.time + time_to_end
|
||||
return TRUE
|
||||
|
||||
/datum/game_mode/gang/post_setup()
|
||||
var/replacement_gangsters = 0
|
||||
for(var/datum/mind/gangbanger in gangbangers)
|
||||
if(!ishuman(gangbanger.current))
|
||||
gangbangers.Remove(gangbanger)
|
||||
log_game("[gangbanger] was not a human, and thus has lost their gangster role.")
|
||||
replacement_gangsters++
|
||||
if(replacement_gangsters)
|
||||
for(var/j = 0, j < replacement_gangsters, j++)
|
||||
if(!antag_candidates.len)
|
||||
log_game("Unable to find more replacement gangsters. Not all of the gangs will spawn.")
|
||||
break
|
||||
var/datum/mind/gangbanger = antag_pick(antag_candidates)
|
||||
gangbangers += gangbanger
|
||||
log_game("[key_name(gangbanger)] has been selected as a replacement gangster!")
|
||||
if(undercover_cop && !ishuman(undercover_cop.current))
|
||||
pigs.Remove(undercover_cop)
|
||||
log_game("[undercover_cop] was not a human, and thus has lost their undercover cop role.")
|
||||
if(!antag_candidates.len)
|
||||
var/datum/mind/one_eight_seven_on_an_undercover_cop = antag_pick(antag_candidates)
|
||||
pigs += one_eight_seven_on_an_undercover_cop
|
||||
undercover_cop = one_eight_seven_on_an_undercover_cop
|
||||
else
|
||||
log_game("Unable to find a replacement undercover cop.")
|
||||
if(undercover_cop)
|
||||
var/datum/antagonist/ert/families/undercover_cop/one_eight_seven_on_an_undercover_cop = new()
|
||||
undercover_cop.add_antag_datum(one_eight_seven_on_an_undercover_cop)
|
||||
undercover_cop.current.playsound_local(undercover_cop.current, 'sound/effects/families_police.ogg', 100, FALSE, pressure_affected = FALSE)
|
||||
|
||||
for(var/datum/mind/gangbanger in gangbangers)
|
||||
var/gang_to_use = pick_n_take(gangs_to_use)
|
||||
var/datum/antagonist/gang/new_gangster = new gang_to_use()
|
||||
var/datum/team/gang/ballas = new /datum/team/gang()
|
||||
new_gangster.my_gang = ballas
|
||||
new_gangster.starter_gangster = TRUE
|
||||
gangs += ballas
|
||||
ballas.add_member(gangbanger)
|
||||
ballas.name = new_gangster.gang_name
|
||||
|
||||
ballas.acceptable_clothes = new_gangster.acceptable_clothes.Copy()
|
||||
ballas.free_clothes = new_gangster.free_clothes.Copy()
|
||||
ballas.my_gang_datum = new_gangster
|
||||
|
||||
for(var/C in ballas.free_clothes)
|
||||
var/obj/O = new C(gangbanger.current)
|
||||
var/list/slots = list (
|
||||
"backpack" = ITEM_SLOT_BACKPACK,
|
||||
"left pocket" = SLOT_L_STORE,
|
||||
"right pocket" = SLOT_R_STORE
|
||||
)
|
||||
var/mob/living/carbon/human/H = gangbanger.current
|
||||
var/equipped = H.equip_in_one_of_slots(O, slots)
|
||||
if(!equipped)
|
||||
to_chat(gangbanger.current, "Unfortunately, you could not bring your [O] to this shift. You will need to find one.")
|
||||
qdel(O)
|
||||
|
||||
gangbanger.add_antag_datum(new_gangster)
|
||||
gangbanger.current.playsound_local(gangbanger.current, 'sound/ambience/antag/thatshowfamiliesworks.ogg', 100, FALSE, pressure_affected = FALSE)
|
||||
to_chat(gangbanger.current, "<B>As you're the first gangster, your uniform and spraycan are in your inventory!</B>")
|
||||
addtimer(CALLBACK(src, .proc/announce_gang_locations), 5 MINUTES)
|
||||
addtimer(CALLBACK(src, .proc/five_minute_warning), time_to_end - 5 MINUTES)
|
||||
gamemode_ready = TRUE
|
||||
..()
|
||||
|
||||
/datum/game_mode/gang/proc/announce_gang_locations()
|
||||
var/list/readable_gang_names = list()
|
||||
for(var/GG in gangs)
|
||||
var/datum/team/gang/G = GG
|
||||
readable_gang_names += "[G.name]"
|
||||
var/finalized_gang_names = english_list(readable_gang_names)
|
||||
priority_announce("Julio G coming to you live from Radio Los Spess! We've been hearing reports of gang activity on [station_name()], with the [finalized_gang_names] duking it out, looking for fresh territory and drugs to sling! Stay safe out there for the hour 'till the space cops get there, and keep it cool, yeah? Play music, not gunshots, I say. Peace out!", "Radio Los Spess", 'sound/voice/beepsky/radio.ogg')
|
||||
sent_announcement = TRUE
|
||||
|
||||
/datum/game_mode/gang/proc/five_minute_warning()
|
||||
priority_announce("Julio G coming to you live from Radio Los Spess! The space cops are closing in on [station_name()] and will arrive in about 5 minutes! Better clear on out of there if you don't want to get hurt!", "Radio Los Spess", 'sound/voice/beepsky/radio.ogg')
|
||||
|
||||
/datum/game_mode/gang/check_win()
|
||||
var/alive_gangsters = 0
|
||||
var/alive_cops = 0
|
||||
for(var/datum/mind/gangbanger in gangbangers)
|
||||
if(!ishuman(gangbanger.current))
|
||||
continue
|
||||
var/mob/living/carbon/human/H = gangbanger.current
|
||||
if(H.stat)
|
||||
continue
|
||||
alive_gangsters++
|
||||
for(var/datum/mind/bacon in pigs)
|
||||
if(!ishuman(bacon.current)) // always returns false
|
||||
continue
|
||||
var/mob/living/carbon/human/H = bacon.current
|
||||
if(H.stat)
|
||||
continue
|
||||
alive_cops++
|
||||
if(alive_gangsters > alive_cops)
|
||||
SSticker.mode_result = "win - gangs survived"
|
||||
SSticker.news_report = GANG_OPERATING
|
||||
return TRUE
|
||||
SSticker.mode_result = "loss - police destroyed the gangs"
|
||||
SSticker.news_report = GANG_DESTROYED
|
||||
return FALSE
|
||||
|
||||
/datum/game_mode/gang/process()
|
||||
if(sent_announcement)
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.hud_used && !istype(M, /mob/dead/new_player))
|
||||
var/datum/hud/H = M.hud_used
|
||||
var/icon_state_to_use = "wanted_1"
|
||||
if(lock_stars)
|
||||
H.wanted_lvl.icon_state = current_stars
|
||||
continue
|
||||
if(GLOB.joined_player_list.len > LOWPOP_FAMILIES_COUNT)
|
||||
switch(GLOB.deaths_during_shift)
|
||||
if(0 to TWO_STARS_HIGHPOP-1)
|
||||
icon_state_to_use = "wanted_1"
|
||||
if(TWO_STARS_HIGHPOP to THREE_STARS_HIGHPOP-1)
|
||||
icon_state_to_use = "wanted_2"
|
||||
if(THREE_STARS_HIGHPOP to FOUR_STARS_HIGHPOP-1)
|
||||
icon_state_to_use = "wanted_3"
|
||||
if(FOUR_STARS_HIGHPOP to FIVE_STARS_HIGHPOP-1)
|
||||
icon_state_to_use = "wanted_4"
|
||||
if(FIVE_STARS_HIGHPOP to INFINITY)
|
||||
icon_state_to_use = "wanted_5"
|
||||
else
|
||||
switch(GLOB.deaths_during_shift)
|
||||
if(0 to TWO_STARS_LOW-1)
|
||||
icon_state_to_use = "wanted_1"
|
||||
if(TWO_STARS_LOW to THREE_STARS_LOW-1)
|
||||
icon_state_to_use = "wanted_2"
|
||||
if(THREE_STARS_LOW to FOUR_STARS_LOW-1)
|
||||
icon_state_to_use = "wanted_3"
|
||||
if(FOUR_STARS_LOW to FIVE_STARS_LOW-1)
|
||||
icon_state_to_use = "wanted_4"
|
||||
if(FIVE_STARS_LOW to INFINITY)
|
||||
icon_state_to_use = "wanted_5"
|
||||
if(cops_arrived)
|
||||
icon_state_to_use += "_active"
|
||||
lock_stars = TRUE
|
||||
current_stars = icon_state_to_use
|
||||
H.wanted_lvl.icon_state = icon_state_to_use
|
||||
|
||||
check_counter++
|
||||
if(check_counter >= 5)
|
||||
if (world.time > endtime && !fuckingdone)
|
||||
fuckingdone = TRUE
|
||||
send_in_the_fuzz()
|
||||
check_counter = 0
|
||||
SSticker.mode.check_win()
|
||||
|
||||
check_tagged_turfs()
|
||||
check_gang_clothes()
|
||||
check_rollin_with_crews()
|
||||
|
||||
/datum/game_mode/gang/proc/send_in_the_fuzz()
|
||||
var/team_size
|
||||
var/cops_to_send
|
||||
var/announcement_message = "PUNK ASS BALLA BITCH"
|
||||
var/announcer = "Spinward Stellar Coalition"
|
||||
if(GLOB.joined_player_list.len > LOWPOP_FAMILIES_COUNT)
|
||||
switch(GLOB.deaths_during_shift)
|
||||
if(0 to TWO_STARS_HIGHPOP-1)
|
||||
team_size = 8
|
||||
cops_to_send = /datum/antagonist/ert/families/beatcop
|
||||
announcement_message = "Hello, crewmembers of [station_name()]! We've received a few calls about some potential violent gang activity on board your station, so we're sending some beat cops to check things out. Nothing extreme, just a courtesy call. However, while they check things out for about 10 minutes, we're going to have to ask that you keep your escape shuttle parked.\n\nHave a pleasant day!"
|
||||
announcer = "Spinward Stellar Coalition Police Department"
|
||||
if(TWO_STARS_HIGHPOP to THREE_STARS_HIGHPOP-1)
|
||||
team_size = 9
|
||||
cops_to_send = /datum/antagonist/ert/families/beatcop/armored
|
||||
announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of violent gang activity from your station. We are dispatching some armed officers to help keep the peace and investigate matters. Do not get in their way, and comply with any and all requests from them. We have blockaded the local warp gate, and your shuttle cannot depart for another 10 minutes.\n\nHave a secure day."
|
||||
announcer = "Spinward Stellar Coalition Police Department"
|
||||
if(THREE_STARS_HIGHPOP to FOUR_STARS_HIGHPOP-1)
|
||||
team_size = 10
|
||||
cops_to_send = /datum/antagonist/ert/families/beatcop/swat
|
||||
announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of extreme gang activity from your station resulting in heavy civilian casualties. The Spinward Stellar Coalition does not tolerate abuse towards our citizens, and we will be responding in force to keep the peace and reduce civilian casualties. We have your station surrounded, and all gangsters must drop their weapons and surrender peacefully.\n\nHave a secure day."
|
||||
announcer = "Spinward Stellar Coalition Police Department"
|
||||
if(FOUR_STARS_HIGHPOP to FIVE_STARS_HIGHPOP-1)
|
||||
team_size = 11
|
||||
cops_to_send = /datum/antagonist/ert/families/beatcop/fbi
|
||||
announcement_message = "We are dispatching our top agents to [station_name()] at the request of the Spinward Stellar Coalition government due to an extreme terrorist level threat against this Nanotrasen owned station. All gangsters must surrender IMMEDIATELY. Failure to comply can and will result in death. We have blockaded your warp gates and will not allow any escape until the situation is resolved within our standard response time of 10 minutes.\n\nSurrender now or face the consequences of your actions."
|
||||
announcer = "Federal Bureau of Investigation"
|
||||
if(FIVE_STARS_HIGHPOP to INFINITY)
|
||||
team_size = 12
|
||||
cops_to_send = /datum/antagonist/ert/families/beatcop/military
|
||||
announcement_message = "Due to an insane level of civilian casualties aboard [station_name()], we have dispatched the National Guard to curb any and all gang activity on board the station. We have heavy cruisers watching the shuttle. Attempt to leave before we allow you to, and we will obliterate your station and your escape shuttle.\n\nYou brought this on yourselves by murdering so many civilians."
|
||||
announcer = "Spinward Stellar Coalition National Guard"
|
||||
else
|
||||
switch(GLOB.deaths_during_shift)
|
||||
if(0 to TWO_STARS_LOW-1)
|
||||
team_size = 5
|
||||
cops_to_send = /datum/antagonist/ert/families/beatcop
|
||||
announcement_message = "Hello, crewmembers of [station_name()]! We've received a few calls about some potential violent gang activity on board your station, so we're sending some beat cops to check things out. Nothing extreme, just a courtesy call. However, while they check things out for about 10 minutes, we're going to have to ask that you keep your escape shuttle parked.\n\nHave a pleasant day!"
|
||||
announcer = "Spinward Stellar Coalition Police Department"
|
||||
if(TWO_STARS_LOW to THREE_STARS_LOW-1)
|
||||
team_size = 6
|
||||
cops_to_send = /datum/antagonist/ert/families/beatcop/armored
|
||||
announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of violent gang activity from your station. We are dispatching some armed officers to help keep the peace and investigate matters. Do not get in their way, and comply with any and all requests from them. We have blockaded the local warp gate, and your shuttle cannot depart for another 10 minutes.\n\nHave a secure day."
|
||||
announcer = "Spinward Stellar Coalition Police Department"
|
||||
if(THREE_STARS_LOW to FOUR_STARS_LOW-1)
|
||||
team_size = 7
|
||||
cops_to_send = /datum/antagonist/ert/families/beatcop/swat
|
||||
announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of extreme gang activity from your station resulting in heavy civilian casualties. The Spinward Stellar Coalition does not tolerate abuse towards our citizens, and we will be responding in force to keep the peace and reduce civilian casualties. We have your station surrounded, and all gangsters must drop their weapons and surrender peacefully.\n\nHave a secure day."
|
||||
announcer = "Spinward Stellar Coalition Police Department"
|
||||
if(FOUR_STARS_LOW to FIVE_STARS_LOW-1)
|
||||
team_size = 8
|
||||
cops_to_send = /datum/antagonist/ert/families/beatcop/fbi
|
||||
announcement_message = "We are dispatching our top agents to [station_name()] at the request of the Spinward Stellar Coalition government due to an extreme terrorist level threat against this Nanotrasen owned station. All gangsters must surrender IMMEDIATELY. Failure to comply can and will result in death. We have blockaded your warp gates and will not allow any escape until the situation is resolved within our standard response time of 10 minutes.\n\nSurrender now or face the consequences of your actions."
|
||||
announcer = "Federal Bureau of Investigation"
|
||||
if(FIVE_STARS_LOW to INFINITY)
|
||||
team_size = 10
|
||||
cops_to_send = /datum/antagonist/ert/families/beatcop/military
|
||||
announcement_message = "Due to an insane level of civilian casualties aboard [station_name()], we have dispatched the National Guard to curb any and all gang activity on board the station. We have heavy cruisers watching the shuttle. Attempt to leave before we allow you to, and we will obliterate your station and your escape shuttle.\n\nYou brought this on yourselves by murdering so many civilians."
|
||||
announcer = "Spinward Stellar Coalition National Guard"
|
||||
|
||||
priority_announce(announcement_message, announcer, 'sound/effects/families_police.ogg')
|
||||
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to help clean up crime on this station?", "deathsquad", null)
|
||||
|
||||
|
||||
if(candidates.len)
|
||||
//Pick the (un)lucky players
|
||||
var/numagents = min(team_size,candidates.len)
|
||||
|
||||
var/list/spawnpoints = GLOB.emergencyresponseteamspawn
|
||||
var/index = 0
|
||||
while(numagents && candidates.len)
|
||||
var/spawnloc = spawnpoints[index+1]
|
||||
//loop through spawnpoints one at a time
|
||||
index = (index + 1) % spawnpoints.len
|
||||
var/mob/dead/observer/chosen_candidate = pick(candidates)
|
||||
candidates -= chosen_candidate
|
||||
if(!chosen_candidate.key)
|
||||
continue
|
||||
|
||||
//Spawn the body
|
||||
var/mob/living/carbon/human/cop = new(spawnloc)
|
||||
chosen_candidate.client.prefs.copy_to(cop)
|
||||
cop.key = chosen_candidate.key
|
||||
|
||||
//Give antag datum
|
||||
var/datum/antagonist/ert/ert_antag = new cops_to_send
|
||||
|
||||
cop.mind.add_antag_datum(ert_antag)
|
||||
cop.mind.assigned_role = ert_antag.name
|
||||
SSjob.SendToLateJoin(cop)
|
||||
|
||||
//Logging and cleanup
|
||||
log_game("[key_name(cop)] has been selected as an [ert_antag.name]")
|
||||
numagents--
|
||||
cops_arrived = TRUE
|
||||
SSshuttle.registerHostileEnvironment(src)
|
||||
addtimer(CALLBACK(src, .proc/end_hostile_sit), 10 MINUTES)
|
||||
return TRUE
|
||||
|
||||
/datum/game_mode/gang/proc/end_hostile_sit()
|
||||
SSshuttle.clearHostileEnvironment(src)
|
||||
|
||||
|
||||
/datum/game_mode/gang/proc/check_tagged_turfs()
|
||||
for(var/T in GLOB.gang_tags)
|
||||
var/obj/effect/decal/cleanable/crayon/gang/tag = T
|
||||
if(tag.my_gang)
|
||||
tag.my_gang.adjust_points(50)
|
||||
CHECK_TICK
|
||||
|
||||
/datum/game_mode/gang/proc/check_gang_clothes() // TODO: make this grab the sprite itself, average out what the primary color would be, then compare how close it is to the gang color so I don't have to manually fill shit out for 5 years for every gang type
|
||||
for(var/mob/living/carbon/human/H in GLOB.player_list)
|
||||
if(!H.mind || !H.client)
|
||||
continue
|
||||
var/datum/antagonist/gang/is_gangster = H.mind.has_antag_datum(/datum/antagonist/gang)
|
||||
for(var/clothing in list(H.head, H.wear_mask, H.wear_suit, H.w_uniform, H.back, H.gloves, H.shoes, H.belt, H.s_store, H.glasses, H.ears, H.wear_id))
|
||||
if(is_gangster)
|
||||
if(is_type_in_list(clothing, is_gangster.acceptable_clothes))
|
||||
is_gangster.add_gang_points(10)
|
||||
else
|
||||
for(var/G in gangs)
|
||||
var/datum/team/gang/gang_clothes = G
|
||||
if(is_type_in_list(clothing, gang_clothes.acceptable_clothes))
|
||||
gang_clothes.adjust_points(5)
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
/datum/game_mode/gang/proc/check_rollin_with_crews()
|
||||
var/list/areas_to_check = list()
|
||||
for(var/G in gangbangers)
|
||||
var/datum/mind/gangster = G
|
||||
areas_to_check += get_area(gangster.current)
|
||||
for(var/AA in areas_to_check)
|
||||
var/area/A = AA
|
||||
var/list/gang_members = list()
|
||||
for(var/mob/living/carbon/human/H in A)
|
||||
if(H.stat || !H.mind || !H.client)
|
||||
continue
|
||||
var/datum/antagonist/gang/is_gangster = H.mind.has_antag_datum(/datum/antagonist/gang)
|
||||
if(is_gangster)
|
||||
gang_members[is_gangster.my_gang]++
|
||||
CHECK_TICK
|
||||
if(gang_members.len)
|
||||
for(var/datum/team/gang/gangsters in gang_members)
|
||||
if(gang_members[gangsters] >= CREW_SIZE_MIN)
|
||||
if(gang_members[gangsters] >= CREW_SIZE_MAX)
|
||||
gangsters.adjust_points(5) // Discourage larger clumps, spread ur people out
|
||||
else
|
||||
gangsters.adjust_points(10)
|
||||
|
||||
|
||||
/datum/game_mode/gang/generate_report()
|
||||
return "Something something grove street home at least until I fucked everything up idk nobody reads these reports."
|
||||
|
||||
/datum/game_mode/gang/send_intercept(report = 0)
|
||||
return
|
||||
|
||||
/datum/game_mode/gang/special_report()
|
||||
var/list/report = list()
|
||||
var/highest_point_value = 0
|
||||
var/highest_gang = "Leet Like Jeff K"
|
||||
report += "<span class='header'>The families in the round were:</span>"
|
||||
var/objective_failures = TRUE
|
||||
for(var/datum/team/gang/GG in gangs)
|
||||
if(GG.my_gang_datum.check_gang_objective())
|
||||
objective_failures = FALSE
|
||||
break
|
||||
for(var/datum/team/gang/G in gangs)
|
||||
report += "<span class='header'>[G.name]:</span>"
|
||||
if(G.members.len)
|
||||
report += "[G.my_gang_datum.roundend_category] were:"
|
||||
report += printplayerlist(G.members)
|
||||
report += "<span class='header'>Points: [G.points]</span>"
|
||||
report += "<span class='header'>Objective: [G.my_gang_datum.gang_objective]</span>"
|
||||
if(G.my_gang_datum.check_gang_objective())
|
||||
report += "<span class='greentext'>The family completed their objective!</span>"
|
||||
else
|
||||
report += "<span class='redtext'>The family failed their objective!</span>"
|
||||
else
|
||||
report += "<span class='redtext'>The family was wiped out!</span>"
|
||||
if(!objective_failures)
|
||||
if(G.points >= highest_point_value && G.members.len && G.my_gang_datum.check_gang_objective())
|
||||
highest_point_value = G.points
|
||||
highest_gang = G.name
|
||||
else
|
||||
if(G.points >= highest_point_value && G.members.len)
|
||||
highest_point_value = G.points
|
||||
highest_gang = G.name
|
||||
var/alive_gangsters = 0
|
||||
var/alive_cops = 0
|
||||
for(var/datum/mind/gangbanger in gangbangers)
|
||||
if(gangbanger.current)
|
||||
if(!ishuman(gangbanger.current))
|
||||
continue
|
||||
var/mob/living/carbon/human/H = gangbanger.current
|
||||
if(H.stat)
|
||||
continue
|
||||
alive_gangsters++
|
||||
for(var/datum/mind/bacon in pigs)
|
||||
if(bacon.current)
|
||||
if(!ishuman(bacon.current)) // always returns false
|
||||
continue
|
||||
var/mob/living/carbon/human/H = bacon.current
|
||||
if(H.stat)
|
||||
continue
|
||||
alive_cops++
|
||||
if(alive_gangsters > alive_cops)
|
||||
if(!objective_failures)
|
||||
report += "<span class='header greentext'>[highest_gang] won the round by completing their objective and having the most points!</span>"
|
||||
else
|
||||
report += "<span class='header greentext'>[highest_gang] won the round by having the most points!</span>"
|
||||
else if(alive_gangsters == alive_cops)
|
||||
report += "<span class='header redtext'>Legend has it the police and the families are still duking it out to this day!</span>"
|
||||
else
|
||||
report += "<span class='header greentext'>The police put the boots to the families, medium style!</span>"
|
||||
|
||||
|
||||
return "<div class='panel redborder'>[report.Join("<br>")]</div>"
|
||||
@@ -2,7 +2,7 @@
|
||||
//Gang War Game Mode
|
||||
GLOBAL_LIST_INIT(possible_gangs, subtypesof(/datum/team/gang))
|
||||
GLOBAL_LIST_EMPTY(gangs)
|
||||
/datum/game_mode/gang
|
||||
/datum/game_mode/gang_old
|
||||
name = "gang war"
|
||||
config_tag = "gang"
|
||||
antag_flag = ROLE_GANG
|
||||
@@ -21,13 +21,13 @@ GLOBAL_LIST_EMPTY(gangs)
|
||||
|
||||
var/list/datum/mind/gangboss_candidates = list()
|
||||
|
||||
/datum/game_mode/gang/generate_report()
|
||||
/datum/game_mode/gang_old/generate_report()
|
||||
return "Cybersun Industries representatives claimed that they, in joint research with the Tiger Cooperative, have made a major breakthrough in brainwashing technology, and have \
|
||||
made the nanobots that apply the \"conversion\" very small and capable of fitting into usually innocent objects - namely, pens. While they refused to outsource this technology for \
|
||||
months to come due to its flaws, they reported some as missing but passed it off to carelessness. At Central Command, we don't like mysteries, and we have reason to believe that this \
|
||||
technology was stolen for anti-Nanotrasen use. Be on the lookout for territory claims and unusually violent crew behavior, applying mindshield implants as necessary."
|
||||
|
||||
/datum/game_mode/gang/pre_setup()
|
||||
/datum/game_mode/gang_old/pre_setup()
|
||||
if(CONFIG_GET(flag/protect_roles_from_antagonist))
|
||||
restricted_jobs += protected_jobs
|
||||
|
||||
@@ -57,7 +57,7 @@ GLOBAL_LIST_EMPTY(gangs)
|
||||
|
||||
return TRUE
|
||||
|
||||
/datum/game_mode/gang/post_setup()
|
||||
/datum/game_mode/gang_old/post_setup()
|
||||
set waitfor = FALSE
|
||||
..()
|
||||
for(var/i in gangboss_candidates)
|
||||
|
||||
21
code/game/mecha/combat/five_stars.dm
Normal file
@@ -0,0 +1,21 @@
|
||||
/obj/mecha/combat/five_stars
|
||||
desc = "A state of the art tank deployed by the Spinward Stellar Coalition National Guard."
|
||||
name = "\improper Tank"
|
||||
icon = 'icons/mecha/mecha_96x96.dmi'
|
||||
icon_state = "five_stars"
|
||||
armor = list("melee" = 100, "bullet" = 50, "laser" = 35, "energy" = 35, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
step_in = 4
|
||||
dir_in = 1 //Facing North.
|
||||
max_integrity = 800
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/mecha/combat/five_stars/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/spacecops(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
max_ammo()
|
||||
@@ -342,6 +342,9 @@
|
||||
harmful = TRUE
|
||||
ammo_type = "missiles_he"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/spacecops
|
||||
projectiles = 420
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching
|
||||
name = "\improper BRM-6 missile rack"
|
||||
desc = "A weapon for combat exosuits. Launches low-explosive breaching missiles designed to explode only when striking a sturdy target."
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
GLOBAL_LIST(gang_tags)
|
||||
|
||||
/obj/effect/decal/cleanable/crayon
|
||||
name = "rune"
|
||||
desc = "Graffiti. Damn kids."
|
||||
@@ -45,6 +47,8 @@
|
||||
data["pixel_x"] = pixel_x
|
||||
if(pixel_y != initial(pixel_y))
|
||||
data["pixel_y"] = pixel_y
|
||||
/obj/effect/decal/cleanable/crayon/NeverShouldHaveComeHere(turf/T)
|
||||
return isgroundlessturf(T)
|
||||
|
||||
/obj/effect/decal/cleanable/crayon/PersistenceLoad(list/data)
|
||||
. = ..()
|
||||
@@ -63,3 +67,18 @@
|
||||
pixel_x = data["pixel_x"]
|
||||
if(data["pixel_y"])
|
||||
pixel_y = data["pixel_y"]
|
||||
|
||||
/obj/effect/decal/cleanable/crayon/gang
|
||||
name = "Leet Like Jeff K gang tag"
|
||||
desc = "Looks like someone's claimed this area for Leet Like Jeff K."
|
||||
icon = 'icons/obj/gang/tags.dmi'
|
||||
layer = BELOW_MOB_LAYER
|
||||
var/datum/team/gang/my_gang
|
||||
|
||||
/obj/effect/decal/cleanable/crayon/gang/Initialize(mapload, main, type, e_name, graf_rot, alt_icon = null)
|
||||
. = ..()
|
||||
LAZYADD(GLOB.gang_tags, src)
|
||||
|
||||
/obj/effect/decal/cleanable/crayon/gang/Destroy()
|
||||
LAZYREMOVE(GLOB.gang_tags, src)
|
||||
..()
|
||||
|
||||
@@ -277,7 +277,7 @@
|
||||
|
||||
/obj/item/toy/crayon/proc/draw_on(atom/target, mob/user, proximity, params)
|
||||
var/static/list/punctuation = list("!","?",".",",","/","+","-","=","%","#","&")
|
||||
|
||||
var/istagger = HAS_TRAIT(user, TRAIT_TAGGER)
|
||||
var/cost = 1
|
||||
if(paint_mode == PAINT_LARGE_HORIZONTAL)
|
||||
cost = 5
|
||||
@@ -334,14 +334,14 @@
|
||||
else if(drawing in graffiti|oriented)
|
||||
temp = "graffiti"
|
||||
|
||||
// If a gang member is using a gang spraycan, it'll behave differently
|
||||
var/gang_mode = FALSE
|
||||
if(gang && user.mind && user.mind.has_antag_datum(/datum/antagonist/gang)) //Heres a check.
|
||||
gang_mode = TRUE // No more runtimes if a non-gang member sprays a gang can, it just works like normal cans.
|
||||
// discontinue if the area isn't valid for tagging because gang "honour"
|
||||
var/gang_mode
|
||||
if(user.mind)
|
||||
gang_mode = user.mind.has_antag_datum(/datum/antagonist/gang)
|
||||
|
||||
if(gang_mode && (!can_claim_for_gang(user, target)))
|
||||
return
|
||||
|
||||
|
||||
var/graf_rot
|
||||
if(drawing in oriented)
|
||||
switch(user.dir)
|
||||
@@ -377,8 +377,8 @@
|
||||
if(paint_mode == PAINT_LARGE_HORIZONTAL)
|
||||
wait_time *= 3
|
||||
|
||||
if(takes_time) //This is what deteremines the time it takes to spray a tag in gang mode. 50 is Default.
|
||||
if(!do_after(user, gang_tag_delay, target = target)) //25 is a good number, but we have gang_tag_delay var now.
|
||||
if(gang_mode || !instant)
|
||||
if(!do_after(user, 50, target = target))
|
||||
return
|
||||
|
||||
if(length(text_buffer))
|
||||
@@ -389,17 +389,16 @@
|
||||
|
||||
|
||||
if(actually_paints)
|
||||
var/obj/effect/decal/cleanable/crayon/C
|
||||
if(gang_mode)
|
||||
// Double check it wasn't tagged in the meanwhile.
|
||||
if(!can_claim_for_gang(user, target))
|
||||
return
|
||||
tag_for_gang(user, target)
|
||||
tag_for_gang(user, target, gang_mode)
|
||||
affected_turfs += target
|
||||
else
|
||||
switch(paint_mode)
|
||||
if(PAINT_NORMAL)
|
||||
var/obj/effect/decal/cleanable/crayon/C = new(target, paint_color, drawing, temp, graf_rot)
|
||||
C.add_hiddenprint(user)
|
||||
C = new(target, paint_color, drawing, temp, graf_rot)
|
||||
C.pixel_x = clickx
|
||||
C.pixel_y = clicky
|
||||
affected_turfs += target
|
||||
@@ -407,14 +406,18 @@
|
||||
var/turf/left = locate(target.x-1,target.y,target.z)
|
||||
var/turf/right = locate(target.x+1,target.y,target.z)
|
||||
if(isValidSurface(left) && isValidSurface(right))
|
||||
var/obj/effect/decal/cleanable/crayon/C = new(left, paint_color, drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON)
|
||||
C.add_hiddenprint(user)
|
||||
C = new(left, paint_color, drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON)
|
||||
affected_turfs += left
|
||||
affected_turfs += right
|
||||
affected_turfs += target
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There isn't enough space to paint!</span>")
|
||||
return
|
||||
C.add_hiddenprint(user)
|
||||
if(istagger)
|
||||
C.AddComponent(/datum/element/art, GOOD_ART)
|
||||
else
|
||||
C.AddComponent(/datum/element/art, BAD_ART)
|
||||
|
||||
if(!instant)
|
||||
to_chat(user, "<span class='notice'>You finish drawing \the [temp].</span>")
|
||||
@@ -437,52 +440,6 @@
|
||||
reagents.trans_to(t, ., volume_multiplier)
|
||||
check_empty(user)
|
||||
|
||||
|
||||
//////////////Gang mode stuff/////////////////
|
||||
/obj/item/toy/crayon/proc/can_claim_for_gang(mob/user, atom/target)
|
||||
// Check area validity.
|
||||
// Reject space, player-created areas, and non-station z-levels.
|
||||
var/area/A = get_base_area(target)
|
||||
if(!A || (!is_station_level(A.z)) || !(A.area_flags & VALID_TERRITORY))
|
||||
to_chat(user, "<span class='warning'>[A] is unsuitable for tagging.</span>")
|
||||
return FALSE
|
||||
|
||||
var/spraying_over = FALSE
|
||||
for(var/G in target)
|
||||
var/obj/effect/decal/cleanable/crayon/gang/gangtag = G
|
||||
if(istype(gangtag))
|
||||
var/datum/antagonist/gang/GA = user.mind.has_antag_datum(/datum/antagonist/gang)
|
||||
if(gangtag.gang != GA.gang)
|
||||
spraying_over = TRUE
|
||||
break
|
||||
|
||||
var/occupying_gang = territory_claimed(A, user)
|
||||
if(occupying_gang && !spraying_over)
|
||||
to_chat(user, "<span class='danger'>[A] has already been tagged by the [occupying_gang] gang! You must get rid of or spray over the old tag first!</span>")
|
||||
return FALSE
|
||||
|
||||
// If you pass the gauntlet of checks, you're good to proceed
|
||||
return TRUE
|
||||
|
||||
/obj/item/toy/crayon/proc/territory_claimed(area/territory, mob/user)
|
||||
for(var/datum/team/gang/G in GLOB.gangs)
|
||||
if(territory.type in (G.territories|G.new_territories))
|
||||
. = G.name
|
||||
break
|
||||
|
||||
/obj/item/toy/crayon/proc/tag_for_gang(mob/user, atom/target)
|
||||
//Delete any old markings on this tile, including other gang tags
|
||||
for(var/obj/effect/decal/cleanable/crayon/old_marking in target)
|
||||
qdel(old_marking)
|
||||
|
||||
var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang)
|
||||
var/area/territory = get_base_area(target)
|
||||
|
||||
new /obj/effect/decal/cleanable/crayon/gang(target,G.gang,"graffiti",0,user) // Heres the gang tag.
|
||||
to_chat(user, "<span class='notice'>You tagged [territory] for your gang!</span>")
|
||||
/////////////////Gang end////////////////////
|
||||
|
||||
|
||||
/obj/item/toy/crayon/attack(mob/M, mob/user)
|
||||
if(edible && (M == user))
|
||||
to_chat(user, "You take a bite of the [src.name]. Delicious!")
|
||||
@@ -496,6 +453,49 @@
|
||||
else
|
||||
..()
|
||||
|
||||
//////////////Gang mode stuff/////////////////
|
||||
/obj/item/toy/crayon/proc/can_claim_for_gang(mob/user, atom/target)
|
||||
var/area/A = get_area(target)
|
||||
if(!A || (!is_station_level(A.z)))
|
||||
to_chat(user, "<span class='warning'>[A] is unsuitable for tagging.</span>")
|
||||
return FALSE
|
||||
|
||||
var/spraying_over = FALSE
|
||||
for(var/obj/effect/decal/cleanable/crayon/gang/G in target)
|
||||
spraying_over = TRUE
|
||||
|
||||
for(var/obj/machinery/power/apc in target)
|
||||
to_chat(user, "<span class='warning'>You can't tag an APC.</span>")
|
||||
return FALSE
|
||||
|
||||
var/occupying_gang = territory_claimed(A, user)
|
||||
if(occupying_gang && !spraying_over)
|
||||
to_chat(user, "<span class='danger'>[A] has already been tagged by a gang! You must find and spray over the old tag first!</span>")
|
||||
return FALSE
|
||||
|
||||
// stolen from oldgang lmao
|
||||
return TRUE
|
||||
|
||||
/obj/item/toy/crayon/proc/tag_for_gang(mob/user, atom/target, datum/antagonist/gang/user_gang)
|
||||
for(var/obj/effect/decal/cleanable/crayon/old_marking in target)
|
||||
qdel(old_marking)
|
||||
|
||||
var/area/territory = get_area(target)
|
||||
|
||||
var/obj/effect/decal/cleanable/crayon/gang/tag = new /obj/effect/decal/cleanable/crayon/gang(target)
|
||||
tag.my_gang = user_gang.my_gang
|
||||
tag.icon_state = "[user_gang.gang_id]_tag"
|
||||
tag.name = "[tag.my_gang.name] gang tag"
|
||||
tag.desc = "Looks like someone's claimed this area for [tag.my_gang.name]."
|
||||
to_chat(user, "<span class='notice'>You tagged [territory] for [tag.my_gang.name]!</span>")
|
||||
|
||||
/obj/item/toy/crayon/proc/territory_claimed(area/territory, mob/user)
|
||||
for(var/obj/effect/decal/cleanable/crayon/gang/G in GLOB.gang_tags)
|
||||
if(get_area(G) == territory)
|
||||
return G
|
||||
|
||||
/////////////////Gang end////////////////////
|
||||
|
||||
/obj/item/toy/crayon/red
|
||||
icon_state = "crayonred"
|
||||
paint_color = "#DA0000"
|
||||
@@ -736,7 +736,7 @@
|
||||
|
||||
return
|
||||
|
||||
if(isobj(target))
|
||||
if(isobj(target) && !istype(target, /obj/effect/decal/cleanable/crayon/gang))
|
||||
if(actually_paints)
|
||||
var/list/hsl = rgb2hsl(hex2num(copytext(paint_color,2,4)),hex2num(copytext(paint_color,4,6)),hex2num(copytext(paint_color,6,8)))
|
||||
var/static/whitelisted = typecacheof(list(/obj/structure/window,
|
||||
|
||||
@@ -657,3 +657,9 @@
|
||||
desc = "Worn by snails as armor and storage compartment."
|
||||
icon_state = "snailshell"
|
||||
item_state = "snailshell"
|
||||
|
||||
/obj/item/storage/backpack/henchmen
|
||||
name = "wings"
|
||||
desc = "Granted to the henchmen who deserve it. This probably doesn't include you."
|
||||
icon_state = "henchmen"
|
||||
item_state = "henchmen"
|
||||
|
||||
@@ -18,6 +18,10 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
var/antag_hud_name
|
||||
/// If above 0, this is the multiplier for the speed at which we hijack the shuttle. Do not directly read, use hijack_speed().
|
||||
var/hijack_speed = 0
|
||||
/// The battlecry this antagonist shouts when suiciding with C4/X4.
|
||||
var/suicide_cry = ""
|
||||
/// The typepath for the outfit to show in the preview for the preferences menu.
|
||||
var/preview_outfit
|
||||
|
||||
//Antag panel properties
|
||||
var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind
|
||||
@@ -29,6 +33,13 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
|
||||
var/list/skill_modifiers
|
||||
|
||||
//ANTAG UI
|
||||
|
||||
///name of the UI that will try to open, right now using a generic ui
|
||||
var/ui_name = "AntagInfoGeneric"
|
||||
///button to access antag interface
|
||||
var/datum/action/antag_info/info_button
|
||||
|
||||
/datum/antagonist/New()
|
||||
GLOB.antagonists += src
|
||||
typecache_datum_blacklist = typecacheof(typecache_datum_blacklist)
|
||||
@@ -106,8 +117,15 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
set waitfor = FALSE
|
||||
if(!(owner?.current))
|
||||
return
|
||||
if(ui_name)//in the future, this should entirely replace greet.
|
||||
info_button = new(owner.current, src)
|
||||
info_button.Grant(owner.current)
|
||||
if(!silent)
|
||||
greet()
|
||||
if(ui_name)
|
||||
to_chat(owner.current, span_big("You are \a [src]."))
|
||||
to_chat(owner.current, span_boldnotice("For more info, read the panel. you can always come back to it using the button in the top left."))
|
||||
info_button.Trigger()
|
||||
apply_innate_effects()
|
||||
give_antag_moodies()
|
||||
remove_blacklisted_quirks()
|
||||
@@ -257,6 +275,43 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
/datum/antagonist/proc/get_admin_commands()
|
||||
. = list()
|
||||
|
||||
/// Creates an icon from the preview outfit.
|
||||
/// Custom implementors of `get_preview_icon` should use this, as the
|
||||
/// result of `get_preview_icon` is expected to be the completed version.
|
||||
/datum/antagonist/proc/render_preview_outfit(datum/outfit/outfit, mob/living/carbon/human/dummy)
|
||||
dummy = dummy || new /mob/living/carbon/human/dummy/consistent
|
||||
dummy.equipOutfit(outfit, visualsOnly = TRUE)
|
||||
COMPILE_OVERLAYS(dummy)
|
||||
var/icon = getFlatIcon(dummy)
|
||||
|
||||
// We don't want to qdel the dummy right away, since its items haven't initialized yet.
|
||||
SSatoms.prepare_deletion(dummy)
|
||||
|
||||
return icon
|
||||
|
||||
/// Given an icon, will crop it to be consistent of those in the preferences menu.
|
||||
/// Not necessary, and in fact will look bad if it's anything other than a human.
|
||||
/datum/antagonist/proc/finish_preview_icon(icon/icon)
|
||||
// Zoom in on the top of the head and the chest
|
||||
// I have no idea how to do this dynamically.
|
||||
icon.Scale(115, 115)
|
||||
|
||||
// This is probably better as a Crop, but I cannot figure it out.
|
||||
icon.Shift(WEST, 8)
|
||||
icon.Shift(SOUTH, 30)
|
||||
|
||||
icon.Crop(1, 1, ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE)
|
||||
|
||||
return icon
|
||||
|
||||
/// Returns the icon to show on the preferences menu.
|
||||
/datum/antagonist/proc/get_preview_icon()
|
||||
if (isnull(preview_outfit))
|
||||
return null
|
||||
|
||||
return finish_preview_icon(render_preview_outfit(preview_outfit))
|
||||
|
||||
|
||||
/datum/antagonist/Topic(href,href_list)
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
@@ -308,3 +363,22 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
else
|
||||
return
|
||||
..()
|
||||
|
||||
//button for antags to review their descriptions/info
|
||||
|
||||
/datum/action/antag_info
|
||||
name = "Open Antag Information:"
|
||||
button_icon_state = "round_end"
|
||||
var/datum/antagonist/antag_datum
|
||||
|
||||
/datum/action/antag_info/New(Target, datum/antagonist/antag_datum)
|
||||
. = ..()
|
||||
src.antag_datum = antag_datum
|
||||
name += " [antag_datum.name]"
|
||||
|
||||
/datum/action/antag_info/Trigger()
|
||||
if(antag_datum)
|
||||
antag_datum.ui_interact(owner)
|
||||
|
||||
/datum/action/antag_info/IsAvailable()
|
||||
return TRUE
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
GLOBAL_LIST_EMPTY(antagonist_teams)
|
||||
|
||||
//A barebones antagonist team.
|
||||
/datum/team
|
||||
var/list/datum/mind/members = list()
|
||||
@@ -8,6 +10,7 @@
|
||||
|
||||
/datum/team/New(starting_members)
|
||||
. = ..()
|
||||
GLOB.antagonist_teams += src
|
||||
if(starting_members)
|
||||
if(islist(starting_members))
|
||||
for(var/datum/mind/M in starting_members)
|
||||
@@ -15,6 +18,10 @@
|
||||
else
|
||||
add_member(starting_members)
|
||||
|
||||
/datum/team/Destroy(force, ...)
|
||||
GLOB.antagonist_teams -= src
|
||||
. = ..()
|
||||
|
||||
/datum/team/proc/is_solo()
|
||||
return members.len == 1
|
||||
|
||||
|
||||
@@ -11,14 +11,21 @@
|
||||
var/role = "Security Officer"
|
||||
var/list/name_source
|
||||
threat = -5
|
||||
var/random_names = TRUE
|
||||
var/rip_and_tear = FALSE
|
||||
var/equip_ert = TRUE
|
||||
var/forge_objectives_for_ert = TRUE
|
||||
show_in_antagpanel = FALSE
|
||||
show_to_ghosts = TRUE
|
||||
antag_moodlet = /datum/mood_event/focused
|
||||
|
||||
/datum/antagonist/ert/on_gain()
|
||||
update_name()
|
||||
forge_objectives()
|
||||
equipERT()
|
||||
if(random_names)
|
||||
update_name()
|
||||
if(forge_objectives_for_ert)
|
||||
forge_objectives()
|
||||
if(equip_ert)
|
||||
equipERT()
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/ert/get_team()
|
||||
@@ -129,6 +136,7 @@
|
||||
return
|
||||
H.equipOutfit(outfit)
|
||||
|
||||
|
||||
/datum/antagonist/ert/greet()
|
||||
if(!ert_team)
|
||||
return
|
||||
@@ -160,3 +168,99 @@
|
||||
|
||||
missiondesc += "<BR><B>Your Mission</B> : [ert_team.mission.explanation_text]"
|
||||
to_chat(owner,missiondesc)
|
||||
|
||||
|
||||
/datum/antagonist/ert/families
|
||||
name = "Space Police Responder"
|
||||
antag_hud_type = ANTAG_HUD_SPACECOP
|
||||
antag_hud_name = "hud_spacecop"
|
||||
|
||||
/datum/antagonist/ert/families/apply_innate_effects(mob/living/mob_override)
|
||||
..()
|
||||
var/mob/living/M = mob_override || owner.current
|
||||
add_antag_hud(antag_hud_type, antag_hud_name, M)
|
||||
|
||||
|
||||
/datum/antagonist/ert/families/remove_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/M = mob_override || owner.current
|
||||
remove_antag_hud(antag_hud_type, M)
|
||||
..()
|
||||
|
||||
/datum/antagonist/ert/families/greet()
|
||||
to_chat(owner, "<B><font size=3 color=red>You are the [name].</font></B>")
|
||||
|
||||
var/missiondesc = "After an uptick in gang violence on [station_name()], you are responding to emergency calls from the station for immediate SSC Police assistance!\n"
|
||||
missiondesc += "<BR><B>Your Mission</B>:"
|
||||
missiondesc += "<BR> <B>1.</B> Secure the situation and crack down on any gang activity. You can view gangsters with your sunglasses."
|
||||
missiondesc += "<BR> <B>2.</B> There is an undercover police officer on station. Secure him, receive his intel, and extract him safely."
|
||||
missiondesc += "<BR> <B>3.</B> Minimize civilian casualties, but defend yourself and civilians from hostile gangsters."
|
||||
missiondesc += "<BR> <B>3.</B> If Security is found to be violating the rights of citizens, detain them as per your authority as Spinward Stellar Coalition officers."
|
||||
missiondesc += "<BR> <B>4.</B> If the situation demands it, evacuate the station. Otherwise, remain on station and keep the peace."
|
||||
to_chat(owner,missiondesc)
|
||||
|
||||
/datum/antagonist/ert/families/undercover_cop
|
||||
name = "Undercover Cop"
|
||||
role = "Undercover Cop"
|
||||
outfit = /datum/outfit/families_police/beatcop
|
||||
var/free_clothes = list(/obj/item/clothing/glasses/hud/spacecop/hidden,
|
||||
/obj/item/clothing/under/rank/security/officer/beatcop,
|
||||
/obj/item/clothing/head/spacepolice)
|
||||
forge_objectives_for_ert = FALSE
|
||||
equip_ert = FALSE
|
||||
random_names = FALSE
|
||||
|
||||
/datum/antagonist/ert/families/undercover_cop/on_gain()
|
||||
for(var/C in free_clothes)
|
||||
var/obj/O = new C(owner.current)
|
||||
var/list/slots = list (
|
||||
"backpack" = ITEM_SLOT_BACKPACK,
|
||||
"left pocket" = SLOT_L_STORE,
|
||||
"right pocket" = SLOT_R_STORE
|
||||
)
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
var/equipped = H.equip_in_one_of_slots(O, slots)
|
||||
if(!equipped)
|
||||
to_chat(owner.current, "Unfortunately, you could not bring your [O] to this shift. You will need to find one.")
|
||||
qdel(O)
|
||||
. = ..()
|
||||
|
||||
|
||||
/datum/antagonist/ert/families/undercover_cop/greet()
|
||||
to_chat(owner, "<B><font size=3 color=red>You are the [name].</font></B>")
|
||||
|
||||
var/missiondesc = "You are an undercover police officer on board [station_name()]. You've been sent here by the Spinward Stellar Coalition because of suspected abusive behavior by the security department, and to keep tabs on a potential criminal organization operation."
|
||||
missiondesc += "<BR><B>Your Mission</B>:"
|
||||
missiondesc += "<BR> <B>1.</B> Keep a close eye on any gangsters you spot. You can view gangsters using your sunglasses in your backpack."
|
||||
missiondesc += "<BR> <B>2.</B> Keep an eye on how Security handles any gangsters, and watch for excessive security brutality."
|
||||
missiondesc += "<BR> <B>3.</B> Remain undercover and do not get found out by Security or any gangs. Nanotrasen does not take kindly to being spied on."
|
||||
missiondesc += "<BR> <B>4.</B> When your backup arrives to extract you in 1 hour, inform them of everything you saw of note, and assist them in securing the situation."
|
||||
to_chat(owner,missiondesc)
|
||||
|
||||
/datum/antagonist/ert/families/beatcop
|
||||
name = "Beat Cop"
|
||||
role = "Police Officer"
|
||||
outfit = /datum/outfit/families_police/beatcop
|
||||
|
||||
/datum/antagonist/ert/families/beatcop/armored
|
||||
name = "Armored Beat Cop"
|
||||
role = "Police Officer"
|
||||
outfit = /datum/outfit/families_police/beatcop/armored
|
||||
|
||||
/datum/antagonist/ert/families/beatcop/swat
|
||||
name = "S.W.A.T. Member"
|
||||
role = "S.W.A.T. Officer"
|
||||
outfit = /datum/outfit/families_police/beatcop/swat
|
||||
|
||||
/datum/antagonist/ert/families/beatcop/fbi
|
||||
name = "FBI Agent"
|
||||
role = "FBI Agent"
|
||||
outfit = /datum/outfit/families_police/beatcop/fbi
|
||||
|
||||
/datum/antagonist/ert/families/beatcop/military
|
||||
name = "Space Military"
|
||||
role = "Sergeant"
|
||||
outfit = /datum/outfit/families_police/beatcop/military
|
||||
|
||||
/datum/antagonist/ert/families/beatcop/military/New()
|
||||
. = ..()
|
||||
name_source = GLOB.commando_names
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
equip_gangster_in_inventory()
|
||||
var/datum/atom_hud/gang_hud = GLOB.huds[ANTAG_HUD_GANGSTER]
|
||||
gang_hud.add_hud_to(owner.current)
|
||||
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/thatshowfamiliesworks.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE)
|
||||
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/thatshowfamiliesworks.ogg', 100, FALSE, pressure_affected = FALSE)
|
||||
..()
|
||||
|
||||
/datum/antagonist/gang/on_removal()
|
||||
|
||||
56
code/modules/antagonists/gang/outfits.dm
Normal file
@@ -0,0 +1,56 @@
|
||||
/datum/outfit/families_police/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
var/obj/item/card/id/W = H.wear_id
|
||||
W.access = get_all_accesses() // I have a warrant.
|
||||
W.assignment = "Space Police"
|
||||
W.registered_name = H.real_name
|
||||
W.update_label()
|
||||
..()
|
||||
|
||||
/datum/outfit/families_police/beatcop
|
||||
name = "Families: Beat Cop"
|
||||
|
||||
uniform = /obj/item/clothing/under/rank/security/officer/beatcop
|
||||
suit = null
|
||||
shoes = /obj/item/clothing/shoes/combat/swat
|
||||
gloves = null
|
||||
glasses = /obj/item/clothing/glasses/hud/spacecop
|
||||
ears = /obj/item/radio/headset/headset_sec
|
||||
mask = null
|
||||
head = /obj/item/clothing/head/spacepolice
|
||||
belt = /obj/item/gun/energy/e_gun/mini
|
||||
r_pocket = /obj/item/lighter
|
||||
l_pocket = /obj/item/restraints/handcuffs
|
||||
back = /obj/item/storage/backpack/satchel/leather
|
||||
id = /obj/item/card/id
|
||||
|
||||
|
||||
/datum/outfit/families_police/beatcop/armored
|
||||
name = "Families: Armored Beat Cop"
|
||||
suit = /obj/item/clothing/suit/armor/vest/blueshirt
|
||||
head = /obj/item/clothing/head/helmet/blueshirt
|
||||
belt = /obj/item/gun/energy/e_gun
|
||||
|
||||
/datum/outfit/families_police/beatcop/swat
|
||||
name = "Families: SWAT Beat Cop"
|
||||
suit = /obj/item/clothing/suit/armor/riot
|
||||
head = /obj/item/clothing/head/helmet/riot
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
belt = /obj/item/gun/energy/e_gun
|
||||
|
||||
/datum/outfit/families_police/beatcop/fbi
|
||||
name = "Families: Space FBI Officer"
|
||||
suit = /obj/item/clothing/suit/armor/laserproof
|
||||
head = /obj/item/clothing/head/helmet/riot
|
||||
belt = /obj/item/gun/energy/laser/scatter
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
|
||||
/datum/outfit/families_police/beatcop/military
|
||||
name = "Families: Space Military"
|
||||
uniform = /obj/item/clothing/under/syndicate/camo
|
||||
suit = /obj/item/clothing/suit/armor/laserproof
|
||||
head = /obj/item/clothing/head/beret/durathread
|
||||
belt = /obj/item/gun/energy/laser/scatter
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
@@ -3,6 +3,8 @@
|
||||
desc = "A heads-up display that provides important info in (almost) real time."
|
||||
flags_1 = null //doesn't protect eyes because it's a monocle, duh
|
||||
var/hud_type = null
|
||||
///Used for topic calls. Just because you have a HUD display doesn't mean you should be able to interact with stuff.
|
||||
var/hud_trait = null
|
||||
|
||||
/obj/item/clothing/glasses/hud/CheckParts(list/parts_list)
|
||||
. = ..()
|
||||
@@ -290,3 +292,16 @@
|
||||
if(. & EMP_PROTECT_SELF)
|
||||
return
|
||||
thermal_overload()
|
||||
|
||||
/obj/item/clothing/glasses/hud/spacecop
|
||||
name = "police aviators"
|
||||
desc = "For thinking you look cool while brutalizing protestors and minorities."
|
||||
icon_state = "bigsunglasses"
|
||||
hud_type = ANTAG_HUD_GANGSTER
|
||||
|
||||
/obj/item/clothing/glasses/hud/spacecop/hidden // for the undercover cop
|
||||
name = "sunglasses"
|
||||
desc = "These sunglasses are special, and let you view potential criminals."
|
||||
icon_state = "sun"
|
||||
item_state = "sunglasses"
|
||||
|
||||
|
||||
@@ -9,6 +9,12 @@
|
||||
armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
strip_delay = 80
|
||||
|
||||
/obj/item/clothing/head/spacepolice
|
||||
name = "space police cap"
|
||||
desc = "A blue cap for patrolling the daily beat."
|
||||
icon_state = "policecap_families"
|
||||
item_state = "policecap_families"
|
||||
|
||||
/obj/item/clothing/head/powdered_wig
|
||||
name = "powdered wig"
|
||||
desc = "A powdered wig."
|
||||
@@ -488,3 +494,10 @@
|
||||
desc = "This will scare them. All will know my power."
|
||||
icon_state = "human_leather"
|
||||
item_state = "human_leather"
|
||||
|
||||
/obj/item/clothing/head/jackbros
|
||||
name = "frosty hat"
|
||||
desc = "Hee-ho!"
|
||||
icon_state = "JackFrostHat"
|
||||
item_state = "JackFrostHat"
|
||||
|
||||
|
||||
@@ -367,7 +367,6 @@
|
||||
name = "yuri initiate helmet"
|
||||
icon_state = "yuri_helmet"
|
||||
item_state = "yuri_helmet"
|
||||
clothing_flags = SNUG_FIT
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/head/sybil_slickers
|
||||
|
||||
@@ -577,3 +577,15 @@
|
||||
desc = "FOOTBALL! YEAH!"
|
||||
icon_state = "sneakers_red"
|
||||
item_state = "sneakers_red"
|
||||
|
||||
/obj/item/clothing/shoes/yakuza
|
||||
name = "tojo clan shoes"
|
||||
desc = "Steel-toed and intimidating."
|
||||
icon_state = "MajimaShoes"
|
||||
item_state = "MajimaShoes_worn"
|
||||
|
||||
/obj/item/clothing/shoes/jackbros
|
||||
name = "frosty boots"
|
||||
desc = "For when you're stepping on up to the plate."
|
||||
icon_state = "JackFrostShoes"
|
||||
item_state = "JackFrostShoes_worn"
|
||||
|
||||
@@ -1339,3 +1339,18 @@
|
||||
icon_state = "football_armor_red"
|
||||
item_state = "football_armor_red"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/yakuza
|
||||
name = "tojo clan jacket"
|
||||
desc = "The jacket of a mad dog."
|
||||
icon_state = "MajimaJacket"
|
||||
item_state = "MajimaJacket"
|
||||
body_parts_covered = ARMS
|
||||
|
||||
/obj/item/clothing/suit/dutch
|
||||
name = "dutch's jacket"
|
||||
desc = "For those long nights on the beach in Tahiti."
|
||||
icon_state = "DutchJacket"
|
||||
item_state = "DutchJacket"
|
||||
body_parts_covered = ARMS
|
||||
|
||||
|
||||
@@ -446,3 +446,24 @@
|
||||
icon_state = "SwagOutfit"
|
||||
item_state = "SwagOutfit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/jackbros
|
||||
name = "jack bros outfit"
|
||||
desc = "For when it's time to hee some hos."
|
||||
icon_state = "JackFrostUniform"
|
||||
item_state = "JackFrostUniform"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/yakuza
|
||||
name = "tojo clan pants"
|
||||
desc = "For those long nights under the traffic cone."
|
||||
icon_state = "MajimaPants"
|
||||
item_state = "MajimaPants"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/dutch
|
||||
name = "dutch's suit"
|
||||
desc = "You can feel a <b>god damn plan</b> coming on."
|
||||
icon_state = "DutchUniform"
|
||||
item_state = "DutchUniform"
|
||||
can_adjust = FALSE
|
||||
|
||||
@@ -242,3 +242,10 @@
|
||||
icon_state = "spacepol"
|
||||
item_state = "spacepol"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/rank/security/officer/beatcop
|
||||
name = "space police uniform"
|
||||
desc = "A police uniform often found in the lines at donut shops."
|
||||
icon_state = "spacepolice_families"
|
||||
item_state = "spacepolice_families"
|
||||
can_adjust = FALSE
|
||||
|
||||
@@ -110,6 +110,20 @@
|
||||
item_state = "telegram"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
can_adjust = FALSE
|
||||
/obj/item/clothing/under/suit/beige
|
||||
name = "beige suit"
|
||||
desc = "An excellent light colored suit, experts in the field stress that it should not to be confused with the inferior tan suit."
|
||||
icon_state = "beige_suit"
|
||||
item_state = "beige_suit"
|
||||
/obj/item/clothing/under/suit/henchmen
|
||||
name = "henchmen jumpsuit"
|
||||
desc = "A very gaudy jumpsuit for a proper Henchman. Guild regulations, you understand."
|
||||
icon = 'icons/obj/clothing/uniforms.dmi'
|
||||
mob_overlay_icon = 'icons/mob/clothing/uniform.dmi'
|
||||
icon_state = "henchmen"
|
||||
item_state = "henchmen"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS|HEAD
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEEARS|HIDEEYES|HIDEHAIR
|
||||
|
||||
/obj/item/clothing/under/suit/polychromic //enables all three overlays to reduce copypasta and defines basic stuff
|
||||
name = "polychromic suit"
|
||||
|
||||
@@ -762,6 +762,10 @@
|
||||
|
||||
client.prefs.scars_list["[cur_scar_index]"] = valid_scars
|
||||
client.prefs.save_character()
|
||||
var/is_antag
|
||||
if(mind in GLOB.pre_setup_antags)
|
||||
is_antag = TRUE
|
||||
|
||||
client.prefs.copy_to(H, initial_spawn = TRUE)
|
||||
H.dna.update_dna_identity()
|
||||
if(mind)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
GLOBAL_LIST_EMPTY(dead_players_during_shift)
|
||||
/mob/living/carbon/human/gib_animation()
|
||||
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h")
|
||||
|
||||
@@ -39,7 +40,9 @@
|
||||
|
||||
dizziness = 0
|
||||
jitteriness = 0
|
||||
|
||||
if(client && !suiciding && !(client in GLOB.dead_players_during_shift))
|
||||
GLOB.dead_players_during_shift += client
|
||||
GLOB.deaths_during_shift++
|
||||
if(ismecha(loc))
|
||||
var/obj/mecha/M = loc
|
||||
if(M.occupant == src)
|
||||
|
||||
@@ -31,6 +31,27 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
|
||||
randomize_human(src)
|
||||
dna.initialize_dna(skip_index = TRUE) //Skip stuff that requires full round init.
|
||||
|
||||
/// Provides a dummy that is consistently bald, white, naked, etc.
|
||||
/mob/living/carbon/human/dummy/consistent
|
||||
|
||||
/mob/living/carbon/human/dummy/consistent/setup_human_dna()
|
||||
create_dna(src)
|
||||
dna.initialize_dna(skip_index = TRUE)
|
||||
dna.features["body_markings"] = "None"
|
||||
dna.features["ears"] = "Cat"
|
||||
dna.features["ethcolor"] = COLOR_WHITE
|
||||
dna.features["frills"] = "None"
|
||||
dna.features["horns"] = "None"
|
||||
dna.features["mcolor"] = COLOR_LIME
|
||||
dna.features["moth_antennae"] = "Plain"
|
||||
dna.features["moth_markings"] = "None"
|
||||
dna.features["moth_wings"] = "Plain"
|
||||
dna.features["snout"] = "Round"
|
||||
dna.features["spines"] = "None"
|
||||
dna.features["tail_human"] = "Cat"
|
||||
dna.features["tail_lizard"] = "Smooth"
|
||||
|
||||
|
||||
//Inefficient pooling/caching way.
|
||||
GLOBAL_LIST_EMPTY(human_dummy_list)
|
||||
GLOBAL_LIST_EMPTY(dummy_mob_list)
|
||||
|
||||
BIN
icons/mecha/mecha_96x96.dmi
Normal file
|
After Width: | Height: | Size: 183 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 483 KiB After Width: | Height: | Size: 484 KiB |
|
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 140 KiB |
BIN
icons/tgimports/syndicate_tg.dmi
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
sound/ambience/antag/thatshowfamiliesworks.ogg
Normal file
BIN
sound/effects/families_police.ogg
Normal file
@@ -824,6 +824,7 @@
|
||||
#include "code\game\gamemodes\dynamic\ruleset_picking.dm"
|
||||
#include "code\game\gamemodes\eldritch_cult\eldritch_cult.dm"
|
||||
#include "code\game\gamemodes\extended\extended.dm"
|
||||
#include "code\game\gamemodes\gang\gang.dm"
|
||||
#include "code\game\gamemodes\gangs\dominator.dm"
|
||||
#include "code\game\gamemodes\gangs\dominator_countdown.dm"
|
||||
#include "code\game\gamemodes\gangs\gang.dm"
|
||||
@@ -996,6 +997,7 @@
|
||||
#include "code\game\mecha\mecha_wreckage.dm"
|
||||
#include "code\game\mecha\combat\combat.dm"
|
||||
#include "code\game\mecha\combat\durand.dm"
|
||||
#include "code\game\mecha\combat\five_stars.dm"
|
||||
#include "code\game\mecha\combat\gygax.dm"
|
||||
#include "code\game\mecha\combat\honker.dm"
|
||||
#include "code\game\mecha\combat\marauder.dm"
|
||||
@@ -1739,6 +1741,7 @@
|
||||
#include "code\modules\antagonists\gang\gang.dm"
|
||||
#include "code\modules\antagonists\gang\handler.dm"
|
||||
#include "code\modules\antagonists\gang\induction_package.dm"
|
||||
#include "code\modules\antagonists\gang\outfits.dm"
|
||||
#include "code\modules\antagonists\gang\themes.dm"
|
||||
#include "code\modules\antagonists\greentext\greentext.dm"
|
||||
#include "code\modules\antagonists\greybois\greybois.dm"
|
||||
|
||||