Part 2 - Missing stuff from original families port

This commit is contained in:
keronshb
2021-10-12 12:07:02 -04:00
parent 0bae06adcd
commit 41013ec815
43 changed files with 1000 additions and 86 deletions
+449
View File
@@ -0,0 +1,449 @@
#define LOWPOP_FAMILIES_COUNT 50
#define TWO_STARS_HIGHPOP 11
#define THREE_STARS_HIGHPOP 16
#define FOUR_STARS_HIGHPOP 21
#define FIVE_STARS_HIGHPOP 31
#define TWO_STARS_LOW 6
#define THREE_STARS_LOW 9
#define FOUR_STARS_LOW 12
#define FIVE_STARS_LOW 15
#define CREW_SIZE_MIN 4
#define CREW_SIZE_MAX 8
GLOBAL_VAR_INIT(deaths_during_shift, 0)
/datum/game_mode/gang
name = "Families"
config_tag = "families"
antag_flag = ROLE_TRAITOR
false_report_weight = 5
required_players = 0
required_enemies = 1
recommended_enemies = 4
announce_span = "danger"
announce_text = "Grove For Lyfe!"
reroll_friendly = FALSE
restricted_jobs = list("Cyborg", "AI", "Prisoner","Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")//N O
protected_jobs = list()
var/check_counter = 0
var/endtime = null
var/fuckingdone = FALSE
var/time_to_end = 60 MINUTES
var/gangs_to_generate = 3
var/list/gangs_to_use
var/list/datum/mind/gangbangers = list()
var/list/datum/mind/pigs = list()
var/datum/mind/undercover_cop
var/list/gangs = list()
var/gangs_still_alive = 0
var/sent_announcement = FALSE
var/list/gang_locations = list()
var/lock_stars = FALSE
var/cops_arrived = FALSE
var/gang_balance_cap = 5
var/current_stars = "wanted_0"
/datum/game_mode/gang/warriors
name = "Warriors"
config_tag = "warriors"
announce_text = "Can you survive this onslaught?"
gang_balance_cap = 3
/datum/game_mode/gang/warriors/pre_setup()
gangs_to_use = subtypesof(/datum/antagonist/gang)
gangs_to_generate = gangs_to_use.len
. = ..()
/datum/game_mode/gang/pre_setup()
gangs_to_use = subtypesof(/datum/antagonist/gang)
for(var/j = 0, j < gangs_to_generate, j++)
if (!antag_candidates.len)
break
var/datum/mind/gangbanger = antag_pick(antag_candidates)
gangbangers += gangbanger
gangbanger.restricted_roles = restricted_jobs
log_game("[key_name(gangbanger)] has been selected as a starting gangster!")
antag_candidates.Remove(gangbanger)
if(antag_candidates.len)
var/datum/mind/one_eight_seven_on_an_undercover_cop = antag_pick(antag_candidates)
pigs += one_eight_seven_on_an_undercover_cop
undercover_cop = one_eight_seven_on_an_undercover_cop
undercover_cop.restricted_roles = restricted_jobs
log_game("[key_name(one_eight_seven_on_an_undercover_cop)] has been selected as a starting undercover cop!")
antag_candidates.Remove(one_eight_seven_on_an_undercover_cop)
endtime = world.time + time_to_end
return TRUE
/datum/game_mode/gang/post_setup()
var/replacement_gangsters = 0
for(var/datum/mind/gangbanger in gangbangers)
if(!ishuman(gangbanger.current))
gangbangers.Remove(gangbanger)
log_game("[gangbanger] was not a human, and thus has lost their gangster role.")
replacement_gangsters++
if(replacement_gangsters)
for(var/j = 0, j < replacement_gangsters, j++)
if(!antag_candidates.len)
log_game("Unable to find more replacement gangsters. Not all of the gangs will spawn.")
break
var/datum/mind/gangbanger = antag_pick(antag_candidates)
gangbangers += gangbanger
log_game("[key_name(gangbanger)] has been selected as a replacement gangster!")
if(undercover_cop && !ishuman(undercover_cop.current))
pigs.Remove(undercover_cop)
log_game("[undercover_cop] was not a human, and thus has lost their undercover cop role.")
if(!antag_candidates.len)
var/datum/mind/one_eight_seven_on_an_undercover_cop = antag_pick(antag_candidates)
pigs += one_eight_seven_on_an_undercover_cop
undercover_cop = one_eight_seven_on_an_undercover_cop
else
log_game("Unable to find a replacement undercover cop.")
if(undercover_cop)
var/datum/antagonist/ert/families/undercover_cop/one_eight_seven_on_an_undercover_cop = new()
undercover_cop.add_antag_datum(one_eight_seven_on_an_undercover_cop)
undercover_cop.current.playsound_local(undercover_cop.current, 'sound/effects/families_police.ogg', 100, FALSE, pressure_affected = FALSE)
for(var/datum/mind/gangbanger in gangbangers)
var/gang_to_use = pick_n_take(gangs_to_use)
var/datum/antagonist/gang/new_gangster = new gang_to_use()
var/datum/team/gang/ballas = new /datum/team/gang()
new_gangster.my_gang = ballas
new_gangster.starter_gangster = TRUE
gangs += ballas
ballas.add_member(gangbanger)
ballas.name = new_gangster.gang_name
ballas.acceptable_clothes = new_gangster.acceptable_clothes.Copy()
ballas.free_clothes = new_gangster.free_clothes.Copy()
ballas.my_gang_datum = new_gangster
for(var/C in ballas.free_clothes)
var/obj/O = new C(gangbanger.current)
var/list/slots = list (
"backpack" = ITEM_SLOT_BACKPACK,
"left pocket" = SLOT_L_STORE,
"right pocket" = SLOT_R_STORE
)
var/mob/living/carbon/human/H = gangbanger.current
var/equipped = H.equip_in_one_of_slots(O, slots)
if(!equipped)
to_chat(gangbanger.current, "Unfortunately, you could not bring your [O] to this shift. You will need to find one.")
qdel(O)
gangbanger.add_antag_datum(new_gangster)
gangbanger.current.playsound_local(gangbanger.current, 'sound/ambience/antag/thatshowfamiliesworks.ogg', 100, FALSE, pressure_affected = FALSE)
to_chat(gangbanger.current, "<B>As you're the first gangster, your uniform and spraycan are in your inventory!</B>")
addtimer(CALLBACK(src, .proc/announce_gang_locations), 5 MINUTES)
addtimer(CALLBACK(src, .proc/five_minute_warning), time_to_end - 5 MINUTES)
gamemode_ready = TRUE
..()
/datum/game_mode/gang/proc/announce_gang_locations()
var/list/readable_gang_names = list()
for(var/GG in gangs)
var/datum/team/gang/G = GG
readable_gang_names += "[G.name]"
var/finalized_gang_names = english_list(readable_gang_names)
priority_announce("Julio G coming to you live from Radio Los Spess! We've been hearing reports of gang activity on [station_name()], with the [finalized_gang_names] duking it out, looking for fresh territory and drugs to sling! Stay safe out there for the hour 'till the space cops get there, and keep it cool, yeah? Play music, not gunshots, I say. Peace out!", "Radio Los Spess", 'sound/voice/beepsky/radio.ogg')
sent_announcement = TRUE
/datum/game_mode/gang/proc/five_minute_warning()
priority_announce("Julio G coming to you live from Radio Los Spess! The space cops are closing in on [station_name()] and will arrive in about 5 minutes! Better clear on out of there if you don't want to get hurt!", "Radio Los Spess", 'sound/voice/beepsky/radio.ogg')
/datum/game_mode/gang/check_win()
var/alive_gangsters = 0
var/alive_cops = 0
for(var/datum/mind/gangbanger in gangbangers)
if(!ishuman(gangbanger.current))
continue
var/mob/living/carbon/human/H = gangbanger.current
if(H.stat)
continue
alive_gangsters++
for(var/datum/mind/bacon in pigs)
if(!ishuman(bacon.current)) // always returns false
continue
var/mob/living/carbon/human/H = bacon.current
if(H.stat)
continue
alive_cops++
if(alive_gangsters > alive_cops)
SSticker.mode_result = "win - gangs survived"
SSticker.news_report = GANG_OPERATING
return TRUE
SSticker.mode_result = "loss - police destroyed the gangs"
SSticker.news_report = GANG_DESTROYED
return FALSE
/datum/game_mode/gang/process()
if(sent_announcement)
for(var/mob/M in GLOB.player_list)
if(M.hud_used && !istype(M, /mob/dead/new_player))
var/datum/hud/H = M.hud_used
var/icon_state_to_use = "wanted_1"
if(lock_stars)
H.wanted_lvl.icon_state = current_stars
continue
if(GLOB.joined_player_list.len > LOWPOP_FAMILIES_COUNT)
switch(GLOB.deaths_during_shift)
if(0 to TWO_STARS_HIGHPOP-1)
icon_state_to_use = "wanted_1"
if(TWO_STARS_HIGHPOP to THREE_STARS_HIGHPOP-1)
icon_state_to_use = "wanted_2"
if(THREE_STARS_HIGHPOP to FOUR_STARS_HIGHPOP-1)
icon_state_to_use = "wanted_3"
if(FOUR_STARS_HIGHPOP to FIVE_STARS_HIGHPOP-1)
icon_state_to_use = "wanted_4"
if(FIVE_STARS_HIGHPOP to INFINITY)
icon_state_to_use = "wanted_5"
else
switch(GLOB.deaths_during_shift)
if(0 to TWO_STARS_LOW-1)
icon_state_to_use = "wanted_1"
if(TWO_STARS_LOW to THREE_STARS_LOW-1)
icon_state_to_use = "wanted_2"
if(THREE_STARS_LOW to FOUR_STARS_LOW-1)
icon_state_to_use = "wanted_3"
if(FOUR_STARS_LOW to FIVE_STARS_LOW-1)
icon_state_to_use = "wanted_4"
if(FIVE_STARS_LOW to INFINITY)
icon_state_to_use = "wanted_5"
if(cops_arrived)
icon_state_to_use += "_active"
lock_stars = TRUE
current_stars = icon_state_to_use
H.wanted_lvl.icon_state = icon_state_to_use
check_counter++
if(check_counter >= 5)
if (world.time > endtime && !fuckingdone)
fuckingdone = TRUE
send_in_the_fuzz()
check_counter = 0
SSticker.mode.check_win()
check_tagged_turfs()
check_gang_clothes()
check_rollin_with_crews()
/datum/game_mode/gang/proc/send_in_the_fuzz()
var/team_size
var/cops_to_send
var/announcement_message = "PUNK ASS BALLA BITCH"
var/announcer = "Spinward Stellar Coalition"
if(GLOB.joined_player_list.len > LOWPOP_FAMILIES_COUNT)
switch(GLOB.deaths_during_shift)
if(0 to TWO_STARS_HIGHPOP-1)
team_size = 8
cops_to_send = /datum/antagonist/ert/families/beatcop
announcement_message = "Hello, crewmembers of [station_name()]! We've received a few calls about some potential violent gang activity on board your station, so we're sending some beat cops to check things out. Nothing extreme, just a courtesy call. However, while they check things out for about 10 minutes, we're going to have to ask that you keep your escape shuttle parked.\n\nHave a pleasant day!"
announcer = "Spinward Stellar Coalition Police Department"
if(TWO_STARS_HIGHPOP to THREE_STARS_HIGHPOP-1)
team_size = 9
cops_to_send = /datum/antagonist/ert/families/beatcop/armored
announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of violent gang activity from your station. We are dispatching some armed officers to help keep the peace and investigate matters. Do not get in their way, and comply with any and all requests from them. We have blockaded the local warp gate, and your shuttle cannot depart for another 10 minutes.\n\nHave a secure day."
announcer = "Spinward Stellar Coalition Police Department"
if(THREE_STARS_HIGHPOP to FOUR_STARS_HIGHPOP-1)
team_size = 10
cops_to_send = /datum/antagonist/ert/families/beatcop/swat
announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of extreme gang activity from your station resulting in heavy civilian casualties. The Spinward Stellar Coalition does not tolerate abuse towards our citizens, and we will be responding in force to keep the peace and reduce civilian casualties. We have your station surrounded, and all gangsters must drop their weapons and surrender peacefully.\n\nHave a secure day."
announcer = "Spinward Stellar Coalition Police Department"
if(FOUR_STARS_HIGHPOP to FIVE_STARS_HIGHPOP-1)
team_size = 11
cops_to_send = /datum/antagonist/ert/families/beatcop/fbi
announcement_message = "We are dispatching our top agents to [station_name()] at the request of the Spinward Stellar Coalition government due to an extreme terrorist level threat against this Nanotrasen owned station. All gangsters must surrender IMMEDIATELY. Failure to comply can and will result in death. We have blockaded your warp gates and will not allow any escape until the situation is resolved within our standard response time of 10 minutes.\n\nSurrender now or face the consequences of your actions."
announcer = "Federal Bureau of Investigation"
if(FIVE_STARS_HIGHPOP to INFINITY)
team_size = 12
cops_to_send = /datum/antagonist/ert/families/beatcop/military
announcement_message = "Due to an insane level of civilian casualties aboard [station_name()], we have dispatched the National Guard to curb any and all gang activity on board the station. We have heavy cruisers watching the shuttle. Attempt to leave before we allow you to, and we will obliterate your station and your escape shuttle.\n\nYou brought this on yourselves by murdering so many civilians."
announcer = "Spinward Stellar Coalition National Guard"
else
switch(GLOB.deaths_during_shift)
if(0 to TWO_STARS_LOW-1)
team_size = 5
cops_to_send = /datum/antagonist/ert/families/beatcop
announcement_message = "Hello, crewmembers of [station_name()]! We've received a few calls about some potential violent gang activity on board your station, so we're sending some beat cops to check things out. Nothing extreme, just a courtesy call. However, while they check things out for about 10 minutes, we're going to have to ask that you keep your escape shuttle parked.\n\nHave a pleasant day!"
announcer = "Spinward Stellar Coalition Police Department"
if(TWO_STARS_LOW to THREE_STARS_LOW-1)
team_size = 6
cops_to_send = /datum/antagonist/ert/families/beatcop/armored
announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of violent gang activity from your station. We are dispatching some armed officers to help keep the peace and investigate matters. Do not get in their way, and comply with any and all requests from them. We have blockaded the local warp gate, and your shuttle cannot depart for another 10 minutes.\n\nHave a secure day."
announcer = "Spinward Stellar Coalition Police Department"
if(THREE_STARS_LOW to FOUR_STARS_LOW-1)
team_size = 7
cops_to_send = /datum/antagonist/ert/families/beatcop/swat
announcement_message = "Crewmembers of [station_name()]. We have received confirmed reports of extreme gang activity from your station resulting in heavy civilian casualties. The Spinward Stellar Coalition does not tolerate abuse towards our citizens, and we will be responding in force to keep the peace and reduce civilian casualties. We have your station surrounded, and all gangsters must drop their weapons and surrender peacefully.\n\nHave a secure day."
announcer = "Spinward Stellar Coalition Police Department"
if(FOUR_STARS_LOW to FIVE_STARS_LOW-1)
team_size = 8
cops_to_send = /datum/antagonist/ert/families/beatcop/fbi
announcement_message = "We are dispatching our top agents to [station_name()] at the request of the Spinward Stellar Coalition government due to an extreme terrorist level threat against this Nanotrasen owned station. All gangsters must surrender IMMEDIATELY. Failure to comply can and will result in death. We have blockaded your warp gates and will not allow any escape until the situation is resolved within our standard response time of 10 minutes.\n\nSurrender now or face the consequences of your actions."
announcer = "Federal Bureau of Investigation"
if(FIVE_STARS_LOW to INFINITY)
team_size = 10
cops_to_send = /datum/antagonist/ert/families/beatcop/military
announcement_message = "Due to an insane level of civilian casualties aboard [station_name()], we have dispatched the National Guard to curb any and all gang activity on board the station. We have heavy cruisers watching the shuttle. Attempt to leave before we allow you to, and we will obliterate your station and your escape shuttle.\n\nYou brought this on yourselves by murdering so many civilians."
announcer = "Spinward Stellar Coalition National Guard"
priority_announce(announcement_message, announcer, 'sound/effects/families_police.ogg')
var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to help clean up crime on this station?", "deathsquad", null)
if(candidates.len)
//Pick the (un)lucky players
var/numagents = min(team_size,candidates.len)
var/list/spawnpoints = GLOB.emergencyresponseteamspawn
var/index = 0
while(numagents && candidates.len)
var/spawnloc = spawnpoints[index+1]
//loop through spawnpoints one at a time
index = (index + 1) % spawnpoints.len
var/mob/dead/observer/chosen_candidate = pick(candidates)
candidates -= chosen_candidate
if(!chosen_candidate.key)
continue
//Spawn the body
var/mob/living/carbon/human/cop = new(spawnloc)
chosen_candidate.client.prefs.copy_to(cop)
cop.key = chosen_candidate.key
//Give antag datum
var/datum/antagonist/ert/ert_antag = new cops_to_send
cop.mind.add_antag_datum(ert_antag)
cop.mind.assigned_role = ert_antag.name
SSjob.SendToLateJoin(cop)
//Logging and cleanup
log_game("[key_name(cop)] has been selected as an [ert_antag.name]")
numagents--
cops_arrived = TRUE
SSshuttle.registerHostileEnvironment(src)
addtimer(CALLBACK(src, .proc/end_hostile_sit), 10 MINUTES)
return TRUE
/datum/game_mode/gang/proc/end_hostile_sit()
SSshuttle.clearHostileEnvironment(src)
/datum/game_mode/gang/proc/check_tagged_turfs()
for(var/T in GLOB.gang_tags)
var/obj/effect/decal/cleanable/crayon/gang/tag = T
if(tag.my_gang)
tag.my_gang.adjust_points(50)
CHECK_TICK
/datum/game_mode/gang/proc/check_gang_clothes() // TODO: make this grab the sprite itself, average out what the primary color would be, then compare how close it is to the gang color so I don't have to manually fill shit out for 5 years for every gang type
for(var/mob/living/carbon/human/H in GLOB.player_list)
if(!H.mind || !H.client)
continue
var/datum/antagonist/gang/is_gangster = H.mind.has_antag_datum(/datum/antagonist/gang)
for(var/clothing in list(H.head, H.wear_mask, H.wear_suit, H.w_uniform, H.back, H.gloves, H.shoes, H.belt, H.s_store, H.glasses, H.ears, H.wear_id))
if(is_gangster)
if(is_type_in_list(clothing, is_gangster.acceptable_clothes))
is_gangster.add_gang_points(10)
else
for(var/G in gangs)
var/datum/team/gang/gang_clothes = G
if(is_type_in_list(clothing, gang_clothes.acceptable_clothes))
gang_clothes.adjust_points(5)
CHECK_TICK
/datum/game_mode/gang/proc/check_rollin_with_crews()
var/list/areas_to_check = list()
for(var/G in gangbangers)
var/datum/mind/gangster = G
areas_to_check += get_area(gangster.current)
for(var/AA in areas_to_check)
var/area/A = AA
var/list/gang_members = list()
for(var/mob/living/carbon/human/H in A)
if(H.stat || !H.mind || !H.client)
continue
var/datum/antagonist/gang/is_gangster = H.mind.has_antag_datum(/datum/antagonist/gang)
if(is_gangster)
gang_members[is_gangster.my_gang]++
CHECK_TICK
if(gang_members.len)
for(var/datum/team/gang/gangsters in gang_members)
if(gang_members[gangsters] >= CREW_SIZE_MIN)
if(gang_members[gangsters] >= CREW_SIZE_MAX)
gangsters.adjust_points(5) // Discourage larger clumps, spread ur people out
else
gangsters.adjust_points(10)
/datum/game_mode/gang/generate_report()
return "Something something grove street home at least until I fucked everything up idk nobody reads these reports."
/datum/game_mode/gang/send_intercept(report = 0)
return
/datum/game_mode/gang/special_report()
var/list/report = list()
var/highest_point_value = 0
var/highest_gang = "Leet Like Jeff K"
report += "<span class='header'>The families in the round were:</span>"
var/objective_failures = TRUE
for(var/datum/team/gang/GG in gangs)
if(GG.my_gang_datum.check_gang_objective())
objective_failures = FALSE
break
for(var/datum/team/gang/G in gangs)
report += "<span class='header'>[G.name]:</span>"
if(G.members.len)
report += "[G.my_gang_datum.roundend_category] were:"
report += printplayerlist(G.members)
report += "<span class='header'>Points: [G.points]</span>"
report += "<span class='header'>Objective: [G.my_gang_datum.gang_objective]</span>"
if(G.my_gang_datum.check_gang_objective())
report += "<span class='greentext'>The family completed their objective!</span>"
else
report += "<span class='redtext'>The family failed their objective!</span>"
else
report += "<span class='redtext'>The family was wiped out!</span>"
if(!objective_failures)
if(G.points >= highest_point_value && G.members.len && G.my_gang_datum.check_gang_objective())
highest_point_value = G.points
highest_gang = G.name
else
if(G.points >= highest_point_value && G.members.len)
highest_point_value = G.points
highest_gang = G.name
var/alive_gangsters = 0
var/alive_cops = 0
for(var/datum/mind/gangbanger in gangbangers)
if(gangbanger.current)
if(!ishuman(gangbanger.current))
continue
var/mob/living/carbon/human/H = gangbanger.current
if(H.stat)
continue
alive_gangsters++
for(var/datum/mind/bacon in pigs)
if(bacon.current)
if(!ishuman(bacon.current)) // always returns false
continue
var/mob/living/carbon/human/H = bacon.current
if(H.stat)
continue
alive_cops++
if(alive_gangsters > alive_cops)
if(!objective_failures)
report += "<span class='header greentext'>[highest_gang] won the round by completing their objective and having the most points!</span>"
else
report += "<span class='header greentext'>[highest_gang] won the round by having the most points!</span>"
else if(alive_gangsters == alive_cops)
report += "<span class='header redtext'>Legend has it the police and the families are still duking it out to this day!</span>"
else
report += "<span class='header greentext'>The police put the boots to the families, medium style!</span>"
return "<div class='panel redborder'>[report.Join("<br>")]</div>"
+4 -4
View File
@@ -2,7 +2,7 @@
//Gang War Game Mode
GLOBAL_LIST_INIT(possible_gangs, subtypesof(/datum/team/gang))
GLOBAL_LIST_EMPTY(gangs)
/datum/game_mode/gang
/datum/game_mode/gang_old
name = "gang war"
config_tag = "gang"
antag_flag = ROLE_GANG
@@ -21,13 +21,13 @@ GLOBAL_LIST_EMPTY(gangs)
var/list/datum/mind/gangboss_candidates = list()
/datum/game_mode/gang/generate_report()
/datum/game_mode/gang_old/generate_report()
return "Cybersun Industries representatives claimed that they, in joint research with the Tiger Cooperative, have made a major breakthrough in brainwashing technology, and have \
made the nanobots that apply the \"conversion\" very small and capable of fitting into usually innocent objects - namely, pens. While they refused to outsource this technology for \
months to come due to its flaws, they reported some as missing but passed it off to carelessness. At Central Command, we don't like mysteries, and we have reason to believe that this \
technology was stolen for anti-Nanotrasen use. Be on the lookout for territory claims and unusually violent crew behavior, applying mindshield implants as necessary."
/datum/game_mode/gang/pre_setup()
/datum/game_mode/gang_old/pre_setup()
if(CONFIG_GET(flag/protect_roles_from_antagonist))
restricted_jobs += protected_jobs
@@ -57,7 +57,7 @@ GLOBAL_LIST_EMPTY(gangs)
return TRUE
/datum/game_mode/gang/post_setup()
/datum/game_mode/gang_old/post_setup()
set waitfor = FALSE
..()
for(var/i in gangboss_candidates)
+21
View File
@@ -0,0 +1,21 @@
/obj/mecha/combat/five_stars
desc = "A state of the art tank deployed by the Spinward Stellar Coalition National Guard."
name = "\improper Tank"
icon = 'icons/mecha/mecha_96x96.dmi'
icon_state = "five_stars"
armor = list("melee" = 100, "bullet" = 50, "laser" = 35, "energy" = 35, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
step_in = 4
dir_in = 1 //Facing North.
max_integrity = 800
pixel_x = -32
pixel_y = -32
/obj/mecha/combat/five_stars/Initialize()
. = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/spacecops(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
max_ammo()
@@ -342,6 +342,9 @@
harmful = TRUE
ammo_type = "missiles_he"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/spacecops
projectiles = 420
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching
name = "\improper BRM-6 missile rack"
desc = "A weapon for combat exosuits. Launches low-explosive breaching missiles designed to explode only when striking a sturdy target."
@@ -1,3 +1,5 @@
GLOBAL_LIST(gang_tags)
/obj/effect/decal/cleanable/crayon
name = "rune"
desc = "Graffiti. Damn kids."
@@ -45,6 +47,8 @@
data["pixel_x"] = pixel_x
if(pixel_y != initial(pixel_y))
data["pixel_y"] = pixel_y
/obj/effect/decal/cleanable/crayon/NeverShouldHaveComeHere(turf/T)
return isgroundlessturf(T)
/obj/effect/decal/cleanable/crayon/PersistenceLoad(list/data)
. = ..()
@@ -63,3 +67,18 @@
pixel_x = data["pixel_x"]
if(data["pixel_y"])
pixel_y = data["pixel_y"]
/obj/effect/decal/cleanable/crayon/gang
name = "Leet Like Jeff K gang tag"
desc = "Looks like someone's claimed this area for Leet Like Jeff K."
icon = 'icons/obj/gang/tags.dmi'
layer = BELOW_MOB_LAYER
var/datum/team/gang/my_gang
/obj/effect/decal/cleanable/crayon/gang/Initialize(mapload, main, type, e_name, graf_rot, alt_icon = null)
. = ..()
LAZYADD(GLOB.gang_tags, src)
/obj/effect/decal/cleanable/crayon/gang/Destroy()
LAZYREMOVE(GLOB.gang_tags, src)
..()
+61 -61
View File
@@ -277,7 +277,7 @@
/obj/item/toy/crayon/proc/draw_on(atom/target, mob/user, proximity, params)
var/static/list/punctuation = list("!","?",".",",","/","+","-","=","%","#","&")
var/istagger = HAS_TRAIT(user, TRAIT_TAGGER)
var/cost = 1
if(paint_mode == PAINT_LARGE_HORIZONTAL)
cost = 5
@@ -334,14 +334,14 @@
else if(drawing in graffiti|oriented)
temp = "graffiti"
// If a gang member is using a gang spraycan, it'll behave differently
var/gang_mode = FALSE
if(gang && user.mind && user.mind.has_antag_datum(/datum/antagonist/gang)) //Heres a check.
gang_mode = TRUE // No more runtimes if a non-gang member sprays a gang can, it just works like normal cans.
// discontinue if the area isn't valid for tagging because gang "honour"
var/gang_mode
if(user.mind)
gang_mode = user.mind.has_antag_datum(/datum/antagonist/gang)
if(gang_mode && (!can_claim_for_gang(user, target)))
return
var/graf_rot
if(drawing in oriented)
switch(user.dir)
@@ -377,8 +377,8 @@
if(paint_mode == PAINT_LARGE_HORIZONTAL)
wait_time *= 3
if(takes_time) //This is what deteremines the time it takes to spray a tag in gang mode. 50 is Default.
if(!do_after(user, gang_tag_delay, target = target)) //25 is a good number, but we have gang_tag_delay var now.
if(gang_mode || !instant)
if(!do_after(user, 50, target = target))
return
if(length(text_buffer))
@@ -389,17 +389,16 @@
if(actually_paints)
var/obj/effect/decal/cleanable/crayon/C
if(gang_mode)
// Double check it wasn't tagged in the meanwhile.
if(!can_claim_for_gang(user, target))
return
tag_for_gang(user, target)
tag_for_gang(user, target, gang_mode)
affected_turfs += target
else
switch(paint_mode)
if(PAINT_NORMAL)
var/obj/effect/decal/cleanable/crayon/C = new(target, paint_color, drawing, temp, graf_rot)
C.add_hiddenprint(user)
C = new(target, paint_color, drawing, temp, graf_rot)
C.pixel_x = clickx
C.pixel_y = clicky
affected_turfs += target
@@ -407,14 +406,18 @@
var/turf/left = locate(target.x-1,target.y,target.z)
var/turf/right = locate(target.x+1,target.y,target.z)
if(isValidSurface(left) && isValidSurface(right))
var/obj/effect/decal/cleanable/crayon/C = new(left, paint_color, drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON)
C.add_hiddenprint(user)
C = new(left, paint_color, drawing, temp, graf_rot, PAINT_LARGE_HORIZONTAL_ICON)
affected_turfs += left
affected_turfs += right
affected_turfs += target
else
to_chat(user, "<span class='warning'>There isn't enough space to paint!</span>")
return
C.add_hiddenprint(user)
if(istagger)
C.AddComponent(/datum/element/art, GOOD_ART)
else
C.AddComponent(/datum/element/art, BAD_ART)
if(!instant)
to_chat(user, "<span class='notice'>You finish drawing \the [temp].</span>")
@@ -437,52 +440,6 @@
reagents.trans_to(t, ., volume_multiplier)
check_empty(user)
//////////////Gang mode stuff/////////////////
/obj/item/toy/crayon/proc/can_claim_for_gang(mob/user, atom/target)
// Check area validity.
// Reject space, player-created areas, and non-station z-levels.
var/area/A = get_base_area(target)
if(!A || (!is_station_level(A.z)) || !(A.area_flags & VALID_TERRITORY))
to_chat(user, "<span class='warning'>[A] is unsuitable for tagging.</span>")
return FALSE
var/spraying_over = FALSE
for(var/G in target)
var/obj/effect/decal/cleanable/crayon/gang/gangtag = G
if(istype(gangtag))
var/datum/antagonist/gang/GA = user.mind.has_antag_datum(/datum/antagonist/gang)
if(gangtag.gang != GA.gang)
spraying_over = TRUE
break
var/occupying_gang = territory_claimed(A, user)
if(occupying_gang && !spraying_over)
to_chat(user, "<span class='danger'>[A] has already been tagged by the [occupying_gang] gang! You must get rid of or spray over the old tag first!</span>")
return FALSE
// If you pass the gauntlet of checks, you're good to proceed
return TRUE
/obj/item/toy/crayon/proc/territory_claimed(area/territory, mob/user)
for(var/datum/team/gang/G in GLOB.gangs)
if(territory.type in (G.territories|G.new_territories))
. = G.name
break
/obj/item/toy/crayon/proc/tag_for_gang(mob/user, atom/target)
//Delete any old markings on this tile, including other gang tags
for(var/obj/effect/decal/cleanable/crayon/old_marking in target)
qdel(old_marking)
var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang)
var/area/territory = get_base_area(target)
new /obj/effect/decal/cleanable/crayon/gang(target,G.gang,"graffiti",0,user) // Heres the gang tag.
to_chat(user, "<span class='notice'>You tagged [territory] for your gang!</span>")
/////////////////Gang end////////////////////
/obj/item/toy/crayon/attack(mob/M, mob/user)
if(edible && (M == user))
to_chat(user, "You take a bite of the [src.name]. Delicious!")
@@ -496,6 +453,49 @@
else
..()
//////////////Gang mode stuff/////////////////
/obj/item/toy/crayon/proc/can_claim_for_gang(mob/user, atom/target)
var/area/A = get_area(target)
if(!A || (!is_station_level(A.z)))
to_chat(user, "<span class='warning'>[A] is unsuitable for tagging.</span>")
return FALSE
var/spraying_over = FALSE
for(var/obj/effect/decal/cleanable/crayon/gang/G in target)
spraying_over = TRUE
for(var/obj/machinery/power/apc in target)
to_chat(user, "<span class='warning'>You can't tag an APC.</span>")
return FALSE
var/occupying_gang = territory_claimed(A, user)
if(occupying_gang && !spraying_over)
to_chat(user, "<span class='danger'>[A] has already been tagged by a gang! You must find and spray over the old tag first!</span>")
return FALSE
// stolen from oldgang lmao
return TRUE
/obj/item/toy/crayon/proc/tag_for_gang(mob/user, atom/target, datum/antagonist/gang/user_gang)
for(var/obj/effect/decal/cleanable/crayon/old_marking in target)
qdel(old_marking)
var/area/territory = get_area(target)
var/obj/effect/decal/cleanable/crayon/gang/tag = new /obj/effect/decal/cleanable/crayon/gang(target)
tag.my_gang = user_gang.my_gang
tag.icon_state = "[user_gang.gang_id]_tag"
tag.name = "[tag.my_gang.name] gang tag"
tag.desc = "Looks like someone's claimed this area for [tag.my_gang.name]."
to_chat(user, "<span class='notice'>You tagged [territory] for [tag.my_gang.name]!</span>")
/obj/item/toy/crayon/proc/territory_claimed(area/territory, mob/user)
for(var/obj/effect/decal/cleanable/crayon/gang/G in GLOB.gang_tags)
if(get_area(G) == territory)
return G
/////////////////Gang end////////////////////
/obj/item/toy/crayon/red
icon_state = "crayonred"
paint_color = "#DA0000"
@@ -736,7 +736,7 @@
return
if(isobj(target))
if(isobj(target) && !istype(target, /obj/effect/decal/cleanable/crayon/gang))
if(actually_paints)
var/list/hsl = rgb2hsl(hex2num(copytext(paint_color,2,4)),hex2num(copytext(paint_color,4,6)),hex2num(copytext(paint_color,6,8)))
var/static/whitelisted = typecacheof(list(/obj/structure/window,
@@ -657,3 +657,9 @@
desc = "Worn by snails as armor and storage compartment."
icon_state = "snailshell"
item_state = "snailshell"
/obj/item/storage/backpack/henchmen
name = "wings"
desc = "Granted to the henchmen who deserve it. This probably doesn't include you."
icon_state = "henchmen"
item_state = "henchmen"