Lets families compile

This commit is contained in:
keronshb
2021-10-12 16:12:38 -04:00
parent d88933b492
commit bd7a2b6a2a
22 changed files with 129 additions and 502 deletions

View File

@@ -455,6 +455,14 @@
#define COMSIG_MINE_TRIGGERED "minegoboom" ///from [/obj/effect/mine/proc/triggermine]:
// Uncovered information
#define COMPONENT_DEEPSCAN_UNCOVERED_INFORMATION 1
///Called when an item is being offered, from [/obj/item/proc/on_offered(mob/living/carbon/giver)]
#define COMSIG_ITEM_OFFERING "item_offering"
///Interrupts the offer proc
#define COMPONENT_OFFER_INTERRUPT (1<<0)
///Called when an someone tries accepting an offered item, from [/obj/item/proc/on_offer_taken(mob/living/carbon/giver, mob/living/carbon/taker)]
#define COMSIG_ITEM_OFFER_TAKEN "item_offer_taken"
///Interrupts the offer acceptance
#define COMPONENT_OFFER_TAKE_INTERRUPT (1<<0)
///from [/obj/structure/closet/supplypod/proc/endlaunch]:
#define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom"

View File

@@ -0,0 +1,4 @@
///the area channel of the important_recursive_contents list, everything in here will be sent a signal when their last holding object changes areas
#define RECURSIVE_CONTENTS_AREA_SENSITIVE "recursive_contents_area_sensitive"
///the hearing channel of the important_recursive_contents list, everything in here will count as a hearing atom
#define RECURSIVE_CONTENTS_HEARING_SENSITIVE "recursive_contents_hearing_sensitive"

View File

@@ -200,6 +200,7 @@
#define TRAIT_FRIENDLY "friendly"
#define TRAIT_SNOB "snob"
#define TRAIT_MULTILINGUAL "multilingual"
#define TRAIT_HEARING_SENSITIVE "hearing_sensitive"
#define TRAIT_CULT_EYES "cult_eyes"
#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item"
#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman.

View File

@@ -19,6 +19,8 @@
#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= length(L) ? L[I] : null) : L[I]) : null)
#define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V;
#define LAZYLEN(L) length(L)
///This is used to add onto lazy assoc list when the value you're adding is a /list/. This one has extra safety over lazyaddassoc because the value could be null (and thus cant be used to += objects)
#define LAZYADDASSOCLIST(L, K, V) if(!L) { L = list(); } L[K] += list(V);
//Sets a list to null
#define LAZYNULL(L) L = null
#define LAZYCLEARLIST(L) if(L) L.Cut()

View File

@@ -590,8 +590,8 @@
var/list/all_teams = list()
var/list/all_antagonists = list()
// for(var/datum/team/A in GLOB.antagonist_teams)
// all_teams |= A
for(var/datum/team/A in GLOB.antagonist_teams)
all_teams |= A
for(var/datum/antagonist/A in GLOB.antagonists)
if(!A.owner)

View File

@@ -1,27 +1,27 @@
/obj/screen/wanted
/atom/movable/screen/wanted
name = "Space Police Alertness"
desc = "Shows the current level of hostility the space police is planning to rain down on you. Better be careful."
icon = 'icons/obj/gang/wanted_160x32.dmi'
icon_state = "wanted_0"
screen_loc = ui_wanted_lvl
///Wanted level, affects the hud icon.
var/level
///Boolean, have the cops arrived? If so, the icon stops changing and remains the same.
var/cops_arrived
/// Wanted level, affects the hud icon. Level 0 is default, and the level 0 icon is blank, so in case of no families gamemode (and thus no wanted level), this HUD element will never appear.
level = 2
/// Boolean, have the cops arrived? If so, the icon stops changing and remains the same.
var/cops_arrived = 0
/obj/screen/wanted/Initialize()
/atom/movable/screen/wanted/New()
return ..()
/atom/movable/screen/wanted/Initialize()
. = ..()
var/datum/game_mode/gang/F = SSticker.mode
level = F.wanted_level
cops_arrived = F.cops_arrived
update_icon()
/obj/screen/wanted/MouseEntered(location,control,params)
/atom/movable/screen/wanted/MouseEntered(location,control,params)
openToolTip(usr,src,params,title = name,content = desc, theme = "alerttooltipstyle")
/obj/screen/wanted/MouseExited()
/atom/movable/screen/wanted/MouseExited()
closeToolTip(usr)
/obj/screen/wanted/update_icon_state()
/atom/movable/screen/wanted/update_icon_state()
. = ..()
icon_state = "wanted_[level][cops_arrived ? "_active" : ""]"

View File

@@ -81,8 +81,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
plane_masters["[instance.plane]"] = instance
instance.backdrop(mymob)
owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness)
/datum/hud/Destroy()
if(mymob.hud_used == src)

View File

@@ -770,3 +770,14 @@
animate(I, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = M, easing = CUBIC_EASING)
sleep(1)
animate(I, alpha = 0, transform = matrix(), time = 1)
///allows this movable to hear and adds itself to the important_recursive_contents list of itself and every movable loc its in
/atom/movable/proc/become_hearing_sensitive(trait_source = TRAIT_GENERIC)
if(!HAS_TRAIT(src, TRAIT_HEARING_SENSITIVE))
RegisterSignal(src, SIGNAL_TRAIT(TRAIT_HEARING_SENSITIVE), .proc/on_hearing_sensitive_trait_loss)
ADD_TRAIT(src, TRAIT_HEARING_SENSITIVE, trait_source)
/atom/movable/proc/on_hearing_sensitive_trait_loss()
SIGNAL_HANDLER
UnregisterSignal(src, SIGNAL_TRAIT(TRAIT_HEARING_SENSITIVE))
REMOVE_TRAIT(src, TRAIT_HEARING_SENSITIVE, src)

View File

@@ -485,6 +485,47 @@
SSticker.mode_result = "loss - servants failed their objective (summon ratvar)"
SSticker.news_report = CULT_FAILURE
//////////////////////////////////////////////
// //
// FAMILIES //
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/roundstart/families
name = "Families"
persistent = TRUE
antag_datum = /datum/antagonist/gang
antag_flag = ROLE_FAMILIES
protected_roles = list("Prisoner", "Head of Personnel")
restricted_roles = list("Cyborg", "AI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Research Director")
required_candidates = 9
weight = 1
cost = 19
requirements = list(101,101,40,40,30,20,10,10,10,10)
flags = HIGH_IMPACT_RULESET
/// A reference to the handler that is used to run pre_execute(), execute(), etc..
var/datum/gang_handler/handler
/datum/dynamic_ruleset/roundstart/families/pre_execute()
..()
handler = new /datum/gang_handler(candidates,restricted_roles)
handler.gangs_to_generate = (antag_cap[indice_pop] / 2)
handler.gang_balance_cap = clamp((indice_pop - 3), 2, 5) // gang_balance_cap by indice_pop: (2,2,2,2,2,3,4,5,5,5)
return handler.pre_setup_analogue()
/datum/dynamic_ruleset/roundstart/families/execute()
return handler.post_setup_analogue(TRUE)
/datum/dynamic_ruleset/roundstart/families/clean_up()
QDEL_NULL(handler)
..()
/datum/dynamic_ruleset/roundstart/families/rule_process()
return handler.process_analogue()
/datum/dynamic_ruleset/roundstart/families/round_result()
return handler.set_round_result_analogue()
// Admin only rulesets. The threat requirement is 101 so it is not possible to roll them.
//////////////////////////////////////////////

View File

@@ -1,20 +1,3 @@
#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"
@@ -28,459 +11,40 @@ GLOBAL_VAR_INIT(deaths_during_shift, 0)
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/cops_arrived = FALSE
var/gang_balance_cap = 5
var/wanted_level = 0
/// A reference to the handler that is used to run pre_setup(), post_setup(), etc..
var/datum/gang_handler/handler
/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
. = ..()
handler = new /datum/gang_handler(antag_candidates,restricted_jobs)
var/list/datum/antagonist/gang/gangs_to_generate = subtypesof(/datum/antagonist/gang)
handler.gangs_to_generate = gangs_to_generate.len
handler.gang_balance_cap = 3
return handler.pre_setup_analogue()
/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
handler = new /datum/gang_handler(antag_candidates,restricted_jobs)
return handler.pre_setup_analogue()
/datum/game_mode/gang/Destroy()
QDEL_NULL(handler)
return ..()
/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)
handler.post_setup_analogue(FALSE)
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
return ..()
/datum/game_mode/gang/process()
check_wanted_level()
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()
///Checks if our wanted level has changed. Only actually does something post the initial announcement and until the cops are here. After that its locked.
/datum/game_mode/gang/proc/check_wanted_level()
if(!sent_announcement || cops_arrived)
return
var/new_wanted_level
if(GLOB.joined_player_list.len > LOWPOP_FAMILIES_COUNT)
switch(GLOB.deaths_during_shift)
if(0 to TWO_STARS_HIGHPOP-1)
new_wanted_level = 1
if(TWO_STARS_HIGHPOP to THREE_STARS_HIGHPOP-1)
new_wanted_level = 2
if(THREE_STARS_HIGHPOP to FOUR_STARS_HIGHPOP-1)
new_wanted_level = 3
if(FOUR_STARS_HIGHPOP to FIVE_STARS_HIGHPOP-1)
new_wanted_level = 4
if(FIVE_STARS_HIGHPOP to INFINITY)
new_wanted_level = 5
else
switch(GLOB.deaths_during_shift)
if(0 to TWO_STARS_LOW-1)
new_wanted_level = 1
if(TWO_STARS_LOW to THREE_STARS_LOW-1)
new_wanted_level = 2
if(THREE_STARS_LOW to FOUR_STARS_LOW-1)
new_wanted_level = 3
if(FOUR_STARS_LOW to FIVE_STARS_LOW-1)
new_wanted_level = 4
if(FIVE_STARS_LOW to INFINITY)
new_wanted_level = 5
if(wanted_level == new_wanted_level) //Same shit, dont care.
return
update_wanted_level(new_wanted_level)
///Updates the icon states for everyone and sends outs announcements regarding the police.
/datum/game_mode/gang/proc/update_wanted_level(newlevel)
if(newlevel > wanted_level)
on_gain_wanted_level(newlevel)
else if (newlevel < wanted_level)
on_lower_wanted_level(newlevel)
for(var/i in GLOB.player_list)
var/mob/M = i
if(!M.hud_used?.wanted_lvl)
continue
var/datum/hud/H = M.hud_used
H.wanted_lvl.level = newlevel
H.wanted_lvl.cops_arrived = cops_arrived
H.wanted_lvl.update_icon()
/datum/game_mode/gang/proc/on_gain_wanted_level(newlevel)
var/announcement_message
switch(newlevel)
if(2)
announcement_message = "Small amount of police vehicles have been spotted en route towards [station_name()]."
if(3)
announcement_message = "A large detachment police vehicles have been spotted en route towards [station_name()]."
if(4)
announcement_message = "A detachment of top-trained agents has been spotted on their way to [station_name()]."
if(5)
announcement_message = "The fleet enroute to [station_name()] now consists of national guard personnel."
priority_announce(announcement_message, "Station Spaceship Detection Systems")
/datum/game_mode/gang/proc/on_lower_wanted_level(newlevel)
var/announcement_message
switch(newlevel)
if(1)
announcement_message = "There are now only a few police vehicle headed towards [station_name()]."
if(2)
announcement_message = "There seem to be fewer police vehicles headed towards [station_name()]."
if(3)
announcement_message = "There are no longer top-trained agents in the fleet headed towards [station_name()]."
if(4)
announcement_message = "The convoy enroute to [station_name()] seems to no longer consist of national guard personnel."
priority_announce(announcement_message, "Station Spaceship Detection Systems")
/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(wanted_level)
if(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(2)
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(3)
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(4)
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(5)
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(wanted_level)
if(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(2)
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(3)
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(4)
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(5)
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
update_wanted_level() //Will make sure our icon updates properly
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)
handler.process_analogue()
/datum/game_mode/gang/set_round_result()
return handler.set_round_result_analogue()
/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>"

View File

@@ -1195,3 +1195,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
pain_stam_pct = (!isnull(embedding["pain_stam_pct"]) ? embedding["pain_stam_pct"] : EMBEDDED_PAIN_STAM_PCT),\
embed_chance_turf_mod = (!isnull(embedding["embed_chance_turf_mod"]) ? embedding["embed_chance_turf_mod"] : EMBED_CHANCE_TURF_MOD))
return TRUE
/obj/item/proc/on_offer_taken(mob/living/carbon/giver, mob/living/carbon/taker)
if(SEND_SIGNAL(src, COMSIG_ITEM_OFFER_TAKEN, giver, taker) & COMPONENT_OFFER_INTERRUPT)
return TRUE

View File

@@ -369,10 +369,6 @@
audible_message("<span class='notice'>You hear spraying.</span>")
playsound(user.loc, 'sound/effects/spray.ogg', 5, 1, 5)
var/takes_time = !instant //For order purposes, since I'm maximum bad.
if(gang_mode)
takes_time = TRUE
var/wait_time = 50
if(paint_mode == PAINT_LARGE_HORIZONTAL)
wait_time *= 3

View File

@@ -1268,10 +1268,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
user.mind.remove_antag_datum(/datum/antagonist/gang)
add_to_gang(user, real_name_backup)
/obj/item/slapper/secret_handshake/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)
/obj/item/slapper/secret_handshake/on_offer_taken(mob/living/carbon/giver, mob/living/carbon/taker)
. = TRUE
if (!(null in taker.held_items))
to_chat(taker, span_warning("You can't get taught the secret handshake if [offerer] has no free hands!"))
to_chat(taker, span_warning("You can't get taught the secret handshake if [giver] has no free hands!"))
return
if(HAS_TRAIT(taker, TRAIT_MINDSHIELD))
@@ -1286,9 +1286,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
to_chat(taker, "You started your family. You can't turn your back on it now.")
return
offerer.visible_message(span_notice("[taker] is taught the secret handshake by [offerer]!"), span_nicegreen("All right! You've taught the secret handshake to [taker]!"), span_hear("You hear a bunch of weird shuffling and flesh slapping sounds!"), ignored_mobs=taker)
to_chat(taker, span_nicegreen("You get taught the secret handshake by [offerer]!"))
var/datum/antagonist/gang/owner_gang_datum = offerer.mind.has_antag_datum(/datum/antagonist/gang)
giver.visible_message(span_notice("[taker] is taught the secret handshake by [giver]!"), span_nicegreen("All right! You've taught the secret handshake to [taker]!"), span_hear("You hear a bunch of weird shuffling and flesh slapping sounds!"), ignored_mobs=taker)
to_chat(taker, span_nicegreen("You get taught the secret handshake by [giver]!"))
var/datum/antagonist/gang/owner_gang_datum = giver.mind.has_antag_datum(/datum/antagonist/gang)
handler = owner_gang_datum.handler
gang_to_use = owner_gang_datum.type
team_to_use = owner_gang_datum.my_gang

View File

@@ -6,14 +6,3 @@
continue
if(!antag_type || !specific && istype(A,antag_type) || specific && A.type == antag_type)
. += A.owner
//Get all teams [of type team_type]
/proc/get_all_teams(team_type)
. = list()
for(var/V in GLOB.antagonists)
var/datum/antagonist/A = V
if(!A.owner)
continue
var/datum/team/T = A.get_team()
if(!team_type || istype(T,team_type))
. |= T

View File

@@ -97,7 +97,7 @@
/datum/antagonist/abductor/admin_add(datum/mind/new_owner,mob/admin)
var/list/current_teams = list()
for(var/datum/team/abductor_team/T in get_all_teams(/datum/team/abductor_team))
for(var/datum/team/abductor_team/T in GLOB.antagonist_teams)
current_teams[T.name] = T
var/choice = input(admin,"Add to which team ?") as null|anything in (current_teams + "new team")
if (choice == "new team")

View File

@@ -181,8 +181,11 @@
add_antag_hud(antag_hud_type, antag_hud_name, M)
if(M.hud_used)
var/datum/hud/H = M.hud_used
H.wanted_lvl = new /obj/screen/wanted
H.infodisplay += H.wanted_lvl
var/atom/movable/screen/wanted/giving_wanted_lvl = new /atom/movable/screen/wanted()
H.wanted_lvl = giving_wanted_lvl
giving_wanted_lvl.hud = H
H.infodisplay += giving_wanted_lvl
H.mymob.client.screen += giving_wanted_lvl
/datum/antagonist/ert/families/remove_innate_effects(mob/living/mob_override)

View File

@@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(gangster_cell_phones)
var/gang_id = "Grove Street Families"
var/activated = FALSE
/obj/item/gangster_cellphone/Initialize()
/obj/item/gangster_cellphone/Initialize(mapload)
. = ..()
GLOB.gangster_cell_phones += src
become_hearing_sensitive()

View File

@@ -108,8 +108,11 @@
add_antag_hud(antag_hud_type, antag_hud_name, M)
if(M.hud_used)
var/datum/hud/H = M.hud_used
H.wanted_lvl = new /obj/screen/wanted
H.infodisplay += H.wanted_lvl
var/atom/movable/screen/wanted/giving_wanted_lvl = new /atom/movable/screen/wanted()
H.wanted_lvl = giving_wanted_lvl
giving_wanted_lvl.hud = H
H.infodisplay += giving_wanted_lvl
H.mymob.client.screen += giving_wanted_lvl
/datum/antagonist/gang/remove_innate_effects(mob/living/mob_override)
if(starter_gangster)
@@ -404,7 +407,6 @@
else
gangster.current.fully_replace_character_name(gangster.current.real_name, original_name)
/datum/antagonist/gang/dutch
show_in_antagpanel = TRUE
name = "Dutch van der Linde Outlaw"
@@ -538,11 +540,11 @@
acceptable_clothes = list(/obj/item/clothing/suit/driscoll,
/obj/item/clothing/under/costume/driscoll,
/obj/item/clothing/mask/gas/driscoll,
/obj/item/clothing/shoes/cowboy)
/obj/item/clothing/shoes/cowboyboots)
free_clothes = list(/obj/item/clothing/suit/driscoll,
/obj/item/clothing/under/costume/driscoll,
/obj/item/clothing/mask/gas/driscoll,
/obj/item/clothing/shoes/cowboy,
/obj/item/clothing/shoes/cowboyboots,
/obj/item/toy/crayon/spraycan)
antag_hud_name = "Drill"
gang_team_type = /datum/team/gang/driscoll

View File

@@ -411,14 +411,14 @@ GLOBAL_VAR(families_override_theme)
//Spawn the body
var/mob/living/carbon/human/cop = new(spawnloc)
chosen_candidate.client.prefs.safe_transfer_prefs_to(cop, is_antag = TRUE)
chosen_candidate.client.prefs.copy_to(cop)
cop.key = chosen_candidate.key
//Give antag datum
var/datum/antagonist/ert/families/ert_antag = new cops_to_send
cop.mind.add_antag_datum(ert_antag)
cop.mind.set_assigned_role(SSjob.GetJobType(ert_antag.ert_job_path))
cop.mind.assigned_role = ert_antag.name
SSjob.SendToLateJoin(cop)
//Logging and cleanup

View File

@@ -417,6 +417,8 @@
name = "cowboy boots"
desc = "A standard pair of brown cowboy boots."
icon_state = "cowboyboots"
permeability_coefficient = 0.05 //these are quite tall
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
can_be_tied = FALSE
/obj/item/clothing/shoes/cowboyboots/black

View File

@@ -208,6 +208,8 @@
if(!get_empty_held_indexes())
to_chat(src, "<span class='warning'>You have no empty hands!</span>")
return
if(I.on_offer_taken(giver, src)) // see if the item has special behavior for being accepted
return
if(!giver.temporarilyRemoveItemFromInventory(I))
visible_message("<span class='notice'>[src] tries to hand over [I] but it's stuck to them....", \
"<span class'notice'> You make a fool of yourself trying to give away an item stuck to your hands")

0
tools/ci/install_rust_g.sh Normal file → Executable file
View File