The Families Gamemode. Home. At least it was 'til I fucked everything up. (#49274)
Adds the Families gamemode to the codebase. In this 1 hour showdown, multiple criminal families are placed onto the station with their goal to rack up the most points by the end of 1 hour. At which point, the Space Cops hit up the station to crack down on the family activity. The severity of the Space Cops is based on how much carnage and murder the families have committed. ## Why It's Good For The Game With an actual official medium/heavy RP server, and the codebase taking a much harder swing towards heavier consequences for death, a more player focused gamemode with a unique swing on teamwork, the concept of what exactly is an antagonist, and trust/paranoia will do wonders to help improve that atmosphere. Previous tests went extremely well(when administrators weren't intentionally sabotaging it by welderbombing families as the Head of Security every single round immediately with no escalation), but suffered from "this just isn't a gamemode for no RP servers like /tg/". However, /tg/ is now an RP server. Get ready to rep your family. ## Isn't this just Gang? Heck no. Only thing similar is tagging turf and the fact criminal groups are involved. This mode is completely different otherwise. ## Heck yeah, where do I sign up? Ask a family member where their Signup Point is, and then simply click on it with an open hand. You'll be signed up for the family instantly, and given some sick threads and a spraycan for tagging. ## How do I rep my family? Wear your gang's uniform or colors similar. ## What does it mean to roll with a crew? Travel in a group of four or more for bonus points towards your gang. However, you receive less for having eight or more, so be careful. Try to spread your crews out! ## I'm an X, what do? Gangster: Yeah, go do whatever. Wanna backstab your gang? Go for it. You can switch sides at any time by clicking on an enemy gang's sign up point. Wanna murder some snitch because they ratted you out to the pigs? Do it. Wanna pressure the locals into supplying you with goods to export? Emergent gameplay. Civilians: Wanna join a gang? Go for it. Gangsters probably shouldn't be arbitrarily murdering you, but if you're repping someone else's colors, don't expect to be given a free pass. After all, uniforms are the only way to really identify a gang member. SPACE COP: Get rid of all the gangsters. Secure the station. Protect the law. Uphold the law. Eat donuts. ## No huds? How can I tell if someone's part of my group? Tough shit, man. I hope you like trust. In short, this gamemode will be a fun exercise in how far the playerbase can go in regards to trusting eachother and unifying to meet a common goal for their group with no rules, gameplay mechanics, or anything actively forcing them to work together. ## How do I know if someone is a gangster? 1. Are they wearing a gang uniform/color? If yes, they're probably a gangster. If no, they're probably a civvie. 2. Are they attacking gangsters? If yes, they're probably a gangster. If no, they're probably a civvie.
@@ -77,6 +77,9 @@
|
||||
#define ANTAG_HUD_BROTHER 22
|
||||
#define ANTAG_HUD_OBSESSED 23
|
||||
#define ANTAG_HUD_FUGITIVE 24
|
||||
#define ANTAG_HUD_GANGSTER 25
|
||||
#define ANTAG_HUD_SPACECOP 26
|
||||
|
||||
|
||||
// Notification action types
|
||||
#define NOTIFY_JUMP "jump"
|
||||
|
||||
@@ -324,6 +324,8 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE)))
|
||||
#define CLOCK_SILICONS 22
|
||||
#define CLOCK_PROSELYTIZATION 23
|
||||
#define SHUTTLE_HIJACK 24
|
||||
#define GANG_DESTROYED 25
|
||||
#define GANG_OPERATING 26
|
||||
|
||||
#define FIELD_TURF 1
|
||||
#define FIELD_EDGE 2
|
||||
|
||||
@@ -169,3 +169,5 @@
|
||||
#define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24"
|
||||
#define ui_ghost_teleport "SOUTH:6,CENTER+1:24"
|
||||
#define ui_ghost_pai "SOUTH: 6, CENTER+2:24"
|
||||
|
||||
#define ui_wanted_lvl "NORTH,11"
|
||||
|
||||
@@ -57,8 +57,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
var/obj/screen/healths
|
||||
var/obj/screen/healthdoll
|
||||
var/obj/screen/internals
|
||||
var/obj/screen/wanted_lvl
|
||||
var/obj/screen/spacesuit
|
||||
|
||||
// subtypes can override this to force a specific UI style
|
||||
var/ui_style
|
||||
|
||||
@@ -81,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
|
||||
@@ -101,6 +108,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
|
||||
|
||||
healths = null
|
||||
healthdoll = null
|
||||
wanted_lvl = null
|
||||
internals = null
|
||||
spacesuit = null
|
||||
lingchemdisplay = null
|
||||
|
||||
@@ -540,6 +540,10 @@ SUBSYSTEM_DEF(ticker)
|
||||
news_message = "The burst of energy released near [station_name()] has been confirmed as merely a test of a new weapon. However, due to an unexpected mechanical error, their communications system has been knocked offline."
|
||||
if(SHUTTLE_HIJACK)
|
||||
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_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(news_message)
|
||||
send2otherserver(news_source, news_message,"News_Report")
|
||||
|
||||
@@ -27,7 +27,9 @@ GLOBAL_LIST_INIT(huds, list(
|
||||
ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_OBSESSED = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_FUGITIVE = new/datum/atom_hud/antag()
|
||||
ANTAG_HUD_FUGITIVE = new/datum/atom_hud/antag(),
|
||||
ANTAG_HUD_GANGSTER = new/datum/atom_hud/antag/hidden(),
|
||||
ANTAG_HUD_SPACECOP = new/datum/atom_hud/antag()
|
||||
))
|
||||
|
||||
/datum/atom_hud
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
var/gamemode_ready = FALSE //Is the gamemode all set up and ready to start checking for ending conditions.
|
||||
var/setup_error //What stopepd setting up the mode.
|
||||
|
||||
|
||||
/datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description.
|
||||
to_chat(world, "<b>The gamemode is: <span class='[announce_span]'>[name]</span>!</b>")
|
||||
to_chat(world, "<b>[announce_text]</b>")
|
||||
|
||||
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" = ITEM_SLOT_LPOCKET,
|
||||
"right pocket" = ITEM_SLOT_RPOCKET
|
||||
)
|
||||
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>"
|
||||
47
code/game/gamemodes/gang/gang_things.dm
Normal file
@@ -0,0 +1,47 @@
|
||||
/obj/item/gang_induction_package
|
||||
name = "family signup package"
|
||||
icon = 'icons/obj/gang/signup_points.dmi'
|
||||
icon_state = "signup_book"
|
||||
var/gang_to_use
|
||||
var/datum/team/gang/team_to_use
|
||||
|
||||
|
||||
/obj/item/gang_induction_package/attack_self(mob/living/user)
|
||||
..()
|
||||
if(HAS_TRAIT(user, TRAIT_MINDSHIELD))
|
||||
to_chat(user, "You attended a seminar on not signing up for a gang, and are not interested.")
|
||||
return
|
||||
var/datum/antagonist/gang/is_gangster = user.mind.has_antag_datum(/datum/antagonist/gang)
|
||||
if(is_gangster && is_gangster.starter_gangster)
|
||||
to_chat(user, "You started your family. You can't turn your back on it now.")
|
||||
return
|
||||
attempt_join_gang(user)
|
||||
|
||||
/obj/item/gang_induction_package/proc/add_to_gang(var/mob/living/user)
|
||||
var/datum/game_mode/gang/F = SSticker.mode
|
||||
var/datum/antagonist/gang/swappin_sides = new gang_to_use()
|
||||
user.mind.add_antag_datum(swappin_sides)
|
||||
swappin_sides.my_gang = team_to_use
|
||||
team_to_use.add_member(user.mind)
|
||||
for(var/threads in team_to_use.free_clothes)
|
||||
new threads(get_turf(user))
|
||||
if (!F.gangbangers.Find(user.mind))
|
||||
F.gangbangers += user.mind
|
||||
team_to_use.adjust_points(30)
|
||||
|
||||
|
||||
/obj/item/gang_induction_package/proc/attempt_join_gang(mob/living/user)
|
||||
if(user && user.mind)
|
||||
var/datum/antagonist/gang/is_gangster = user.mind.has_antag_datum(/datum/antagonist/gang)
|
||||
if(is_gangster)
|
||||
if(is_gangster.my_gang == team_to_use)
|
||||
return
|
||||
else
|
||||
is_gangster.my_gang.adjust_points(-30)
|
||||
is_gangster.my_gang.remove_member(user.mind)
|
||||
user.mind.remove_antag_datum(/datum/antagonist/gang)
|
||||
add_to_gang(user)
|
||||
qdel(src)
|
||||
else
|
||||
add_to_gang(user)
|
||||
qdel(src)
|
||||
22
code/game/mecha/combat/five_stars.dm
Normal file
@@ -0,0 +1,22 @@
|
||||
/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)
|
||||
exit_delay = 40
|
||||
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."
|
||||
@@ -28,6 +30,20 @@
|
||||
if(main)
|
||||
paint_colour = main
|
||||
add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY)
|
||||
|
||||
/obj/effect/decal/cleanable/crayon/NeverShouldHaveComeHere(turf/T)
|
||||
return isgroundlessturf(T)
|
||||
|
||||
/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)
|
||||
..()
|
||||
|
||||
@@ -317,6 +317,13 @@
|
||||
else if(drawing in graffiti|oriented)
|
||||
temp = "graffiti"
|
||||
|
||||
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)
|
||||
@@ -349,7 +356,7 @@
|
||||
if(paint_mode == PAINT_LARGE_HORIZONTAL)
|
||||
wait_time *= 3
|
||||
|
||||
if(!instant)
|
||||
if(gang_mode || !instant)
|
||||
if(!do_after(user, 50, target = target))
|
||||
return
|
||||
|
||||
@@ -361,28 +368,34 @@
|
||||
|
||||
if(actually_paints)
|
||||
var/obj/effect/decal/cleanable/crayon/C
|
||||
switch(paint_mode)
|
||||
if(PAINT_NORMAL)
|
||||
C = new(target, paint_color, drawing, temp, graf_rot)
|
||||
C.pixel_x = clickx
|
||||
C.pixel_y = clicky
|
||||
affected_turfs += target
|
||||
if(PAINT_LARGE_HORIZONTAL)
|
||||
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))
|
||||
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/component/art, GOOD_ART)
|
||||
if(gang_mode)
|
||||
if(!can_claim_for_gang(user, target))
|
||||
return
|
||||
tag_for_gang(user, target, gang_mode)
|
||||
affected_turfs += target
|
||||
else
|
||||
C.AddComponent(/datum/component/art, BAD_ART)
|
||||
switch(paint_mode)
|
||||
if(PAINT_NORMAL)
|
||||
C = new(target, paint_color, drawing, temp, graf_rot)
|
||||
C.pixel_x = clickx
|
||||
C.pixel_y = clicky
|
||||
affected_turfs += target
|
||||
if(PAINT_LARGE_HORIZONTAL)
|
||||
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))
|
||||
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/component/art, GOOD_ART)
|
||||
else
|
||||
C.AddComponent(/datum/component/art, BAD_ART)
|
||||
|
||||
if(!instant)
|
||||
to_chat(user, "<span class='notice'>You finish drawing \the [temp].</span>")
|
||||
@@ -428,6 +441,46 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/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 TRUE
|
||||
|
||||
/obj/item/toy/crayon/red
|
||||
icon_state = "crayonred"
|
||||
paint_color = "#DA0000"
|
||||
@@ -665,7 +718,7 @@
|
||||
|
||||
return
|
||||
|
||||
if(isobj(target))
|
||||
if(isobj(target) && !istype(target, /obj/effect/decal/cleanable/crayon/gang))
|
||||
if(actually_paints)
|
||||
if(color_hex2num(paint_color) < 350 && !istype(target, /obj/structure/window) && !istype(target, /obj/effect/decal/cleanable/crayon)) //Colors too dark are rejected
|
||||
to_chat(usr, "<span class='warning'>A color that dark on an object like this? Surely not...</span>")
|
||||
|
||||
@@ -609,3 +609,9 @@
|
||||
new /obj/item/clothing/mask/gas/clown_hat(src)
|
||||
new /obj/item/bikehorn(src)
|
||||
new /obj/item/implanter/sad_trombone(src)
|
||||
|
||||
/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"
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
var/list/name_source
|
||||
var/random_names = TRUE
|
||||
var/rip_and_tear = FALSE
|
||||
var/equip_ert = TRUE
|
||||
var/forge_objectives_for_ert = TRUE
|
||||
show_in_antagpanel = FALSE
|
||||
antag_moodlet = /datum/mood_event/focused
|
||||
can_hijack = HIJACK_PREVENT
|
||||
@@ -19,8 +21,10 @@
|
||||
/datum/antagonist/ert/on_gain()
|
||||
if(random_names)
|
||||
update_name()
|
||||
forge_objectives()
|
||||
equipERT()
|
||||
if(forge_objectives_for_ert)
|
||||
forge_objectives()
|
||||
if(equip_ert)
|
||||
equipERT()
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/ert/get_team()
|
||||
@@ -173,6 +177,7 @@
|
||||
return
|
||||
H.equipOutfit(outfit)
|
||||
|
||||
|
||||
/datum/antagonist/ert/greet()
|
||||
if(!ert_team)
|
||||
return
|
||||
@@ -189,3 +194,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" = ITEM_SLOT_LPOCKET,
|
||||
"right pocket" = ITEM_SLOT_RPOCKET
|
||||
)
|
||||
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
|
||||
|
||||
426
code/modules/antagonists/gang/gang.dm
Normal file
@@ -0,0 +1,426 @@
|
||||
/datum/antagonist/gang
|
||||
name = "Family Member"
|
||||
roundend_category = "gangsters"
|
||||
var/gang_name = "Leet Like Jeff K"
|
||||
var/gang_id = "LLJK"
|
||||
var/datum/team/gang/my_gang
|
||||
var/list/acceptable_clothes = list()
|
||||
var/list/free_clothes = list()
|
||||
var/datum/action/cooldown/spawn_induction_package/package_spawner = new()
|
||||
var/gang_objective = "Be super cool and stuff."
|
||||
var/starter_gangster = FALSE
|
||||
antag_hud_type = ANTAG_HUD_GANGSTER
|
||||
antag_hud_name = "hud_gangster"
|
||||
|
||||
/datum/antagonist/gang/apply_innate_effects(mob/living/mob_override)
|
||||
..()
|
||||
package_spawner.Grant(owner.current)
|
||||
package_spawner.my_gang_datum = src
|
||||
var/mob/living/M = mob_override || owner.current
|
||||
add_antag_hud(antag_hud_type, antag_hud_name, M)
|
||||
|
||||
|
||||
/datum/antagonist/gang/remove_innate_effects(mob/living/mob_override)
|
||||
package_spawner.Remove(owner.current)
|
||||
var/mob/living/M = mob_override || owner.current
|
||||
remove_antag_hud(antag_hud_type, M)
|
||||
..()
|
||||
|
||||
|
||||
/datum/antagonist/gang/get_team()
|
||||
return my_gang
|
||||
|
||||
/datum/antagonist/gang/proc/add_gang_points(var/points_to_add)
|
||||
if(my_gang)
|
||||
my_gang.adjust_points(points_to_add)
|
||||
|
||||
/datum/antagonist/gang/proc/check_gang_objective() // used to determine if a gang has completed their special objective
|
||||
return TRUE
|
||||
|
||||
/datum/antagonist/gang/greet()
|
||||
to_chat(owner.current, "<B><font size=3 color=red>[gang_name] for life!</font></B>")
|
||||
to_chat(owner.current, "<B><font size=2 color=red>You're a member of the [gang_name] now!<br>Tag turf with a spraycan, wear your group's colors, and recruit more gangsters with the Induction Packages!</font></B>")
|
||||
to_chat(owner.current, "<B><font size=4 color=red>Don't fuck with non-gangsters unless they fuck with you first.</font></B>")
|
||||
to_chat(owner.current, "<B><font size=4 color=red>Don't blow shit up or make the station uninhabitable.</font></B>")
|
||||
to_chat(owner.current, "<B><font size=4 color=red>Family's Objective:</B> [gang_objective]</font>")
|
||||
|
||||
/datum/antagonist/gang/red
|
||||
name = "San Fierro Triad"
|
||||
roundend_category = "The San Fierro Triad gangsters"
|
||||
gang_name = "San Fierro Triad"
|
||||
gang_id = "SFT"
|
||||
acceptable_clothes = list(/obj/item/clothing/head/soft/red,
|
||||
/obj/item/clothing/neck/scarf/red,
|
||||
/obj/item/clothing/suit/jacket/letterman_red,
|
||||
/obj/item/clothing/under/color/red,
|
||||
/obj/item/clothing/mask/bandana/red,
|
||||
/obj/item/clothing/under/suit/red)
|
||||
free_clothes = list(/obj/item/clothing/suit/jacket/letterman_red,
|
||||
/obj/item/clothing/under/color/red,
|
||||
/obj/item/toy/crayon/spraycan)
|
||||
gang_objective = "The Spinward Stellar Coalition police intend to interfere with our operations, by sending an undercover cop. Find him and eliminate him."
|
||||
antag_hud_name = "Triad"
|
||||
|
||||
/datum/antagonist/gang/red/check_gang_objective()
|
||||
var/datum/game_mode/gang/F = SSticker.mode
|
||||
var/mob/living/carbon/human/H = F.undercover_cop.current
|
||||
if(considered_alive(H))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/antagonist/gang/purple
|
||||
name = "Ballas"
|
||||
roundend_category = "The Ballas gangsters"
|
||||
gang_name = "Ballas"
|
||||
gang_id = "B"
|
||||
acceptable_clothes = list(/obj/item/clothing/head/soft/purple,
|
||||
/obj/item/clothing/under/color/lightpurple,
|
||||
/obj/item/clothing/neck/scarf/purple,
|
||||
/obj/item/clothing/head/beanie/purple,
|
||||
/obj/item/clothing/suit/apron/purple_bartender,
|
||||
/obj/item/clothing/mask/bandana/skull,
|
||||
/obj/item/clothing/under/suit/green)
|
||||
free_clothes = list(/obj/item/clothing/head/beanie/purple,
|
||||
/obj/item/clothing/under/color/lightpurple,
|
||||
/obj/item/toy/crayon/spraycan)
|
||||
var/list/cop_roles = list("Security Officer", "Warden", "Detective", "Head of Security")
|
||||
gang_objective = "We got a deal with the security pigs on this station. We scratch their back, they scratch ours. You feel me? Keep all of security safe from any trouble, and make sure they get out alive."
|
||||
antag_hud_name = "Ballas"
|
||||
|
||||
/datum/antagonist/gang/purple/check_gang_objective()
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.mind.assigned_role in cop_roles)
|
||||
if(!considered_alive(M) && !M.suiciding)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/antagonist/gang/green
|
||||
name = "Grove Street Families"
|
||||
roundend_category = "The Grove Street Families gangsters"
|
||||
gang_name = "Grove Street Families"
|
||||
gang_id = "GSF"
|
||||
acceptable_clothes = list(/obj/item/clothing/head/soft/green,
|
||||
/obj/item/clothing/under/color/darkgreen,
|
||||
/obj/item/clothing/neck/scarf/green,
|
||||
/obj/item/clothing/head/beanie/green,
|
||||
/obj/item/clothing/suit/poncho/green,
|
||||
/obj/item/clothing/mask/bandana/green)
|
||||
free_clothes = list(/obj/item/clothing/mask/bandana/green,
|
||||
/obj/item/clothing/under/color/darkgreen,
|
||||
/obj/item/toy/crayon/spraycan)
|
||||
gang_objective = "We lost a lot of territory recently. We gotta get that shit back. Make sure 45 rooms are tagged for Grove Street."
|
||||
antag_hud_name = "Grove"
|
||||
/datum/antagonist/gang/green/check_gang_objective()
|
||||
var/tag_amount = 0
|
||||
for(var/T in GLOB.gang_tags)
|
||||
var/obj/effect/decal/cleanable/crayon/gang/tag = T
|
||||
if(tag.my_gang.gang_id == gang_id)
|
||||
tag_amount++
|
||||
if(tag_amount >= 45)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/datum/antagonist/gang/russian_mafia
|
||||
name = "Russian Mafia"
|
||||
roundend_category = "The Russian mafiosos"
|
||||
gang_name = "Russian Mafia"
|
||||
gang_id = "RM"
|
||||
acceptable_clothes = list(/obj/item/clothing/head/soft/red,
|
||||
/obj/item/clothing/neck/scarf/red,
|
||||
/obj/item/clothing/under/suit/white,
|
||||
/obj/item/clothing/head/beanie/red,
|
||||
/obj/item/clothing/head/ushanka)
|
||||
free_clothes = list(/obj/item/clothing/head/ushanka,
|
||||
/obj/item/clothing/under/suit/white,
|
||||
/obj/item/toy/crayon/spraycan)
|
||||
gang_objective = "We are starting to run low on supplies at the home base, my friend. Make sure every comrade has a bottle of some kind of booze on them, friend."
|
||||
antag_hud_name = "Russian"
|
||||
|
||||
/datum/antagonist/gang/russian_mafia/check_gang_objective()
|
||||
var/datum/game_mode/gang/F = SSticker.mode
|
||||
for(var/M in F.gangbangers)
|
||||
var/datum/mind/MI = M
|
||||
if(MI.has_antag_datum(src.type))
|
||||
if(!considered_alive(MI.current))
|
||||
continue // dead people cant really do the objective lol
|
||||
var/list/items_to_check = MI.current.GetAllContents()
|
||||
for(var/I in items_to_check)
|
||||
var/obj/IT = I
|
||||
if(istype(IT, /obj/item/reagent_containers/food/drinks/bottle))
|
||||
continue
|
||||
return FALSE // didnt pass the bottle check, no point in continuing to loop
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/antagonist/gang/italian_mob
|
||||
name = "Italian Mob"
|
||||
roundend_category = "The Italian mobsters"
|
||||
gang_name = "Italian Mob"
|
||||
gang_id = "IM"
|
||||
acceptable_clothes = list(/obj/item/clothing/under/suit/checkered,
|
||||
/obj/item/clothing/head/fedora,
|
||||
/obj/item/clothing/neck/scarf/green,
|
||||
/obj/item/clothing/mask/bandana/green)
|
||||
free_clothes = list(/obj/item/clothing/head/fedora,
|
||||
/obj/item/clothing/under/suit/checkered,
|
||||
/obj/item/toy/crayon/spraycan)
|
||||
gang_objective = "The boss wants it made very clear that all our esteemed members are to be held with respect. If a friend falls, ensure they are properly buried with a coffin. And keep the Chaplain alive, to ensure the corpses are properly taken care of."
|
||||
antag_hud_name = "Italian"
|
||||
|
||||
/datum/antagonist/gang/italian_mob/check_gang_objective()
|
||||
var/datum/game_mode/gang/F = SSticker.mode
|
||||
for(var/M in F.gangbangers)
|
||||
var/datum/mind/MI = M
|
||||
if(MI.has_antag_datum(src.type))
|
||||
if(considered_alive(MI.current))
|
||||
continue
|
||||
if(istype(MI.current.loc, /obj/structure/closet/crate/coffin))
|
||||
continue
|
||||
return FALSE
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.mind.assigned_role == "Chaplain")
|
||||
if(!considered_alive(M) && !M.suiciding)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/antagonist/gang/tunnel_snakes
|
||||
name = "Tunnel Snakes"
|
||||
roundend_category = "The Tunnel Snakes"
|
||||
gang_name = "Tunnel Snakes"
|
||||
gang_id = "TS"
|
||||
acceptable_clothes = list(/obj/item/clothing/under/pants/classicjeans,
|
||||
/obj/item/clothing/suit/jacket,
|
||||
/obj/item/clothing/mask/bandana/skull)
|
||||
free_clothes = list(/obj/item/clothing/suit/jacket,
|
||||
/obj/item/clothing/under/pants/classicjeans,
|
||||
/obj/item/toy/crayon/spraycan)
|
||||
gang_objective = "TUNNEL SNAKES RULE!!! Make sure that everyone knows that, by getting 50% of people on station to wear any part of our uniform! TUNNEL SNAKES RULE!!!"
|
||||
antag_hud_name = "Snakes"
|
||||
|
||||
/datum/antagonist/gang/tunnel_snakes/check_gang_objective()
|
||||
var/people_on_station = 0
|
||||
var/people_reppin_tunnel_snakes = 0
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(!considered_alive(M))
|
||||
continue
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
people_on_station++
|
||||
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_type_in_list(clothing, acceptable_clothes))
|
||||
people_reppin_tunnel_snakes++
|
||||
if(0.5*people_on_station > people_reppin_tunnel_snakes)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/antagonist/gang/vagos
|
||||
name = "Los Santos Vagos"
|
||||
roundend_category = "The Los Santos Vagos gangsters"
|
||||
gang_name = "Los Santos Vagos"
|
||||
gang_id = "LSV"
|
||||
acceptable_clothes = list(/obj/item/clothing/head/soft/yellow,
|
||||
/obj/item/clothing/under/color/yellow,
|
||||
/obj/item/clothing/neck/scarf/yellow,
|
||||
/obj/item/clothing/head/beanie/yellow,
|
||||
/obj/item/clothing/mask/bandana/gold)
|
||||
free_clothes = list(/obj/item/clothing/mask/bandana/gold,
|
||||
/obj/item/clothing/under/color/yellow,
|
||||
/obj/item/toy/crayon/spraycan)
|
||||
gang_objective = "Orders from up high. We need to up our drug operation. Ensure that at least 25% of the station is addicted to Crank."
|
||||
antag_hud_name = "Vagos"
|
||||
|
||||
|
||||
/datum/antagonist/gang/vagos/check_gang_objective()
|
||||
var/people_on_station = 0
|
||||
var/people_on_crack = 0
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(!considered_alive(M))
|
||||
continue
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
people_on_station++
|
||||
for(var/R in H.reagents.addiction_list)
|
||||
if(istype(R, /datum/reagent/drug/crank))
|
||||
people_on_crack++
|
||||
if(0.5*people_on_station > people_on_crack)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/antagonist/gang/henchmen
|
||||
name = "Monarch Crew"
|
||||
roundend_category = "The Monarch henchmen"
|
||||
gang_name = "Monarch Crew"
|
||||
gang_id = "HENCH"
|
||||
acceptable_clothes = list(/obj/item/clothing/head/soft/yellow,
|
||||
/obj/item/clothing/under/suit/henchmen,
|
||||
/obj/item/clothing/neck/scarf/yellow,
|
||||
/obj/item/clothing/head/beanie/yellow,
|
||||
/obj/item/clothing/mask/bandana/gold,
|
||||
/obj/item/storage/backpack/henchmen)
|
||||
free_clothes = list(/obj/item/storage/backpack/henchmen,
|
||||
/obj/item/clothing/under/suit/henchmen,
|
||||
/obj/item/toy/crayon/spraycan)
|
||||
gang_objective = "I have it on VERY GOOD AUTHORITY that the Research Director on this station helped Venture on a science project back in college! ENSURE THAT HE DOES NOT LEAVE THIS STATION ALIVE, HENCHMEN! THE MIGHTY MONARCH DEMANDS IT!!!"
|
||||
antag_hud_name = "Monarch"
|
||||
|
||||
/datum/antagonist/gang/henchmen/check_gang_objective() // gotta arch dr. venture indirectly
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.mind.assigned_role == "Research Director")
|
||||
if(considered_alive(M))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/antagonist/gang/yakuza
|
||||
name = "Tojo Clan"
|
||||
roundend_category = "The Yakuza"
|
||||
gang_name = "Tojo Clan"
|
||||
gang_id = "YAK"
|
||||
acceptable_clothes = list(/obj/item/clothing/head/soft/yellow,
|
||||
/obj/item/clothing/under/costume/yakuza,
|
||||
/obj/item/clothing/shoes/yakuza,
|
||||
/obj/item/clothing/neck/scarf/yellow,
|
||||
/obj/item/clothing/head/beanie/yellow,
|
||||
/obj/item/clothing/mask/bandana/gold,
|
||||
/obj/item/clothing/head/hardhat,
|
||||
/obj/item/clothing/suit/yakuza)
|
||||
free_clothes = list(/obj/item/clothing/under/costume/yakuza,
|
||||
/obj/item/clothing/shoes/yakuza,
|
||||
/obj/item/clothing/suit/yakuza,
|
||||
/obj/item/clothing/head/hardhat,
|
||||
/obj/item/toy/crayon/spraycan)
|
||||
gang_objective = "The boss is thrilled about this new construction opportunity we've all been given, yadda yadda, look, he knows we're here to expand our business ventures for the clan, but Majima wanted it made VERY clear that we do NOT fuck this station's infrastructure up. If more than 85% of this station is busted when we get the hell out of here, it's your ass on the line."
|
||||
antag_hud_name = "Tojo"
|
||||
|
||||
/datum/antagonist/gang/yakuza/check_gang_objective()
|
||||
var/datum/station_state/current_state = new /datum/station_state()
|
||||
current_state.count()
|
||||
var/station_integrity = min(PERCENT(GLOB.start_state.score(current_state)), 100)
|
||||
if(station_integrity < 85)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/antagonist/gang/jackbros
|
||||
name = "Jack Bros"
|
||||
roundend_category = "The Hee-hos"
|
||||
gang_name = "Jack Bros"
|
||||
gang_id = "JB"
|
||||
acceptable_clothes = list(/obj/item/clothing/head/soft/blue,
|
||||
/obj/item/clothing/under/costume/jackbros,
|
||||
/obj/item/clothing/shoes/jackbros,
|
||||
/obj/item/clothing/head/jackbros,
|
||||
/obj/item/clothing/mask/bandana/blue)
|
||||
free_clothes = list(/obj/item/clothing/under/costume/jackbros,
|
||||
/obj/item/clothing/shoes/jackbros,
|
||||
/obj/item/clothing/head/jackbros,
|
||||
/obj/item/toy/crayon/spraycan)
|
||||
gang_objective = "Hee-hello friends! We need to expand our influence, ho! Get a King Frost in as the Captain of this joint! Either get the original Captain on board with the program, or Hee-ho a fellow Jack Frost into the position yourselves!"
|
||||
antag_hud_name = "JackFrost"
|
||||
|
||||
/datum/antagonist/gang/jackbros/check_gang_objective()
|
||||
var/datum/game_mode/gang/F = SSticker.mode
|
||||
for(var/M in F.gangbangers)
|
||||
var/datum/mind/MI = M
|
||||
if(MI.has_antag_datum(src.type))
|
||||
if(!considered_alive(MI.current))
|
||||
continue // dead people cant really do the objective lol
|
||||
if(ishuman(MI.current))
|
||||
var/mob/living/carbon/human/H = MI.current
|
||||
if(H.get_assignment() == "Captain")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/datum/antagonist/gang/dutch
|
||||
name = "Dutch van der Linde's Gang"
|
||||
roundend_category = "Dutch's outlaws"
|
||||
gang_name = "Dutch van der Linde's Gang"
|
||||
gang_id = "VDL"
|
||||
acceptable_clothes = list(/obj/item/clothing/head/soft/black,
|
||||
/obj/item/clothing/under/costume/dutch,
|
||||
/obj/item/clothing/suit/dutch,
|
||||
/obj/item/clothing/head/bowler,
|
||||
/obj/item/clothing/mask/bandana/black)
|
||||
free_clothes = list(/obj/item/clothing/under/costume/dutch,
|
||||
/obj/item/clothing/head/bowler,
|
||||
/obj/item/clothing/suit/dutch,
|
||||
/obj/item/toy/crayon/spraycan)
|
||||
gang_objective = "Listen here, fellas. I have a plan. Just one more score on this crappy little po-dunk station. Gold bars, friends. Get all the gold out of the silos, and leave nothing behind! Spread the gold amongst yourselves for the escape plan, make sure everyone has at least 1 bar. After this, it'll be space mangos at Tahiti. You just gotta have a little faith."
|
||||
antag_hud_name = "Dutch"
|
||||
|
||||
/datum/antagonist/gang/dutch/check_gang_objective()
|
||||
var/datum/game_mode/gang/F = SSticker.mode
|
||||
for(var/M in F.gangbangers)
|
||||
var/datum/mind/MI = M
|
||||
if(MI.has_antag_datum(src.type))
|
||||
if(!considered_alive(MI.current))
|
||||
continue // dead people cant really do the objective lol
|
||||
var/list/items_to_check = MI.current.GetAllContents()
|
||||
for(var/I in items_to_check)
|
||||
var/obj/IT = I
|
||||
if(istype(IT, /obj/item/stack/sheet/mineral/gold))
|
||||
continue
|
||||
return FALSE // didnt pass the bar check, no point in continuing to loop
|
||||
var/obj/machinery/ore_silo/S = GLOB.ore_silo_default
|
||||
var/datum/component/material_container/mat_container = S.GetComponent(/datum/component/material_container)
|
||||
if(mat_container.materials[SSmaterials.GetMaterialRef(/datum/material/gold)] >= 2000) // if theres at least 1 bar of gold left in the silo, they've failed to heist all of it
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/team/gang
|
||||
var/points = 0
|
||||
var/gang_id = "LLJK"
|
||||
var/list/acceptable_clothes = list()
|
||||
var/list/free_clothes = list()
|
||||
var/datum/antagonist/gang/my_gang_datum
|
||||
|
||||
/datum/team/gang/proc/adjust_points(var/points_to_adjust)
|
||||
points += points_to_adjust
|
||||
|
||||
/datum/team/gang/roundend_report()
|
||||
return "<div class='panel redborder'><br></div>"
|
||||
|
||||
/datum/action/cooldown/spawn_induction_package
|
||||
name = "Create Induction Package"
|
||||
desc = "Generate an induction package for your family."
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
button_icon_state = "recruit"
|
||||
icon_icon = 'icons/obj/gang/actions.dmi'
|
||||
cooldown_time = 300
|
||||
var/datum/antagonist/gang/my_gang_datum
|
||||
|
||||
/datum/action/cooldown/spawn_induction_package/Trigger()
|
||||
if(!..())
|
||||
return FALSE
|
||||
if(!IsAvailable())
|
||||
return FALSE
|
||||
if(!my_gang_datum)
|
||||
return FALSE
|
||||
if(!istype(owner, /mob/living/carbon/human))
|
||||
return FALSE
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(H.stat)
|
||||
return FALSE
|
||||
|
||||
var/datum/game_mode/gang/mode = SSticker.mode
|
||||
var/lowest_gang_count = my_gang_datum.my_gang.members.len
|
||||
for(var/datum/team/gang/TT in mode.gangs)
|
||||
var/alive_gangsters = 0
|
||||
for(var/datum/mind/gangers in TT.members)
|
||||
if(ishuman(gangers.current) && gangers.current.client && !gangers.current.stat)
|
||||
alive_gangsters++
|
||||
if(TT != my_gang_datum.my_gang)
|
||||
if(alive_gangsters < lowest_gang_count)
|
||||
lowest_gang_count = alive_gangsters
|
||||
if(my_gang_datum.my_gang.members.len >= (lowest_gang_count + mode.gang_balance_cap))
|
||||
to_chat(H, "Your gang is pretty packed right now. You don't need more members just yet. If the other families expand, you can recruit more members.")
|
||||
return FALSE
|
||||
to_chat(H, "You pull an induction package from your pockets and place it on the ground.")
|
||||
var/obj/item/gang_induction_package/GP = new(get_turf(H))
|
||||
GP.name = "\improper [my_gang_datum.name] signup package"
|
||||
GP.gang_to_use = my_gang_datum.type
|
||||
GP.team_to_use = my_gang_datum.my_gang
|
||||
StartCooldown()
|
||||
return TRUE
|
||||
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
|
||||
@@ -5,7 +5,7 @@
|
||||
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/equipped(mob/living/carbon/human/user, slot)
|
||||
..()
|
||||
@@ -223,3 +223,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"
|
||||
|
||||
|
||||
@@ -8,6 +8,12 @@
|
||||
armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 40, "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."
|
||||
@@ -501,3 +507,10 @@
|
||||
..()
|
||||
if (slot == ITEM_SLOT_HEAD)
|
||||
user.faction |= "goat"
|
||||
|
||||
/obj/item/clothing/head/jackbros
|
||||
name = "frosty hat"
|
||||
desc = "Hee-ho!"
|
||||
icon_state = "JackFrostHat"
|
||||
item_state = "JackFrostHat"
|
||||
|
||||
|
||||
@@ -419,3 +419,15 @@
|
||||
desc = "All this talk of antags, greytiding, and griefing... I just wanna grill for god's sake!"
|
||||
name = "grilling sandals"
|
||||
icon_state = "cookflops"
|
||||
|
||||
/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"
|
||||
|
||||
@@ -772,3 +772,18 @@
|
||||
desc = "A cool shirt for chilling on the beach."
|
||||
icon_state = "hawaiian_blue"
|
||||
item_state = "hawaiian_blue"
|
||||
|
||||
/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
|
||||
|
||||
|
||||
@@ -253,3 +253,24 @@
|
||||
strip_delay = 50
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = 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
|
||||
|
||||
@@ -229,3 +229,10 @@
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
|
||||
/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
|
||||
|
||||
@@ -124,3 +124,12 @@
|
||||
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/under/syndicate.dmi'
|
||||
mob_overlay_icon = 'icons/mob/clothing/under/syndicate.dmi'
|
||||
icon_state = "henchmen"
|
||||
item_state = "henchmen"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS|HEAD
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEEARS|HIDEEYES|HIDEHAIR
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -28,7 +29,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)
|
||||
|
||||
@@ -220,7 +220,7 @@ BROTHER_OBJECTIVES_AMOUNT 2
|
||||
|
||||
## Uncomment to prohibit jobs that start with loyalty
|
||||
## implants from being most antagonists.
|
||||
#PROTECT_ROLES_FROM_ANTAGONIST
|
||||
PROTECT_ROLES_FROM_ANTAGONIST
|
||||
|
||||
## Uncomment to prohibit assistants from becoming most antagonists.
|
||||
#PROTECT_ASSISTANT_FROM_ANTAGONIST
|
||||
|
||||
BIN
icons/mecha/mecha_96x96.dmi
Normal file
|
After Width: | Height: | Size: 183 KiB |
|
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 195 KiB After Width: | Height: | Size: 196 KiB |
|
Before Width: | Height: | Size: 356 KiB After Width: | Height: | Size: 357 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 130 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.7 KiB |
BIN
icons/obj/gang/actions.dmi
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
icons/obj/gang/signup_points.dmi
Normal file
|
After Width: | Height: | Size: 795 B |
BIN
icons/obj/gang/tags.dmi
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
icons/obj/gang/wanted_160x32.dmi
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
icons/obj/gang/wanted_stars.dmi
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 75 KiB |
BIN
sound/ambience/antag/thatshowfamiliesworks.ogg
Normal file
BIN
sound/effects/families_police.ogg
Normal file
@@ -674,6 +674,8 @@
|
||||
#include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm"
|
||||
#include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm"
|
||||
#include "code\game\gamemodes\extended\extended.dm"
|
||||
#include "code\game\gamemodes\gang\gang.dm"
|
||||
#include "code\game\gamemodes\gang\gang_things.dm"
|
||||
#include "code\game\gamemodes\meteor\meteor.dm"
|
||||
#include "code\game\gamemodes\meteor\meteors.dm"
|
||||
#include "code\game\gamemodes\monkey\monkey.dm"
|
||||
@@ -825,6 +827,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"
|
||||
@@ -1437,6 +1440,8 @@
|
||||
#include "code\modules\antagonists\fugitive\fugitive_outfits.dm"
|
||||
#include "code\modules\antagonists\fugitive\fugitive_ship.dm"
|
||||
#include "code\modules\antagonists\fugitive\hunter.dm"
|
||||
#include "code\modules\antagonists\gang\gang.dm"
|
||||
#include "code\modules\antagonists\gang\outfits.dm"
|
||||
#include "code\modules\antagonists\greentext\greentext.dm"
|
||||
#include "code\modules\antagonists\highlander\highlander.dm"
|
||||
#include "code\modules\antagonists\magic_servant\servant.dm"
|
||||
|
||||