[MIRROR] FAMILIES 4.0: "fuck it, MRP only this time" (#8420)
* FAMILIES 4.0: "fuck it, MRP only this time" * F Co-authored-by: Iamgoofball <iamgoofball@gmail.com> Co-authored-by: Gandalf <jzo123@hotmail.com>
@@ -44,6 +44,7 @@
|
||||
#define span_greenannounce(str) ("<span class='greenannounce'>" + str + "</span>")
|
||||
#define span_greenteamradio(str) ("<span class='greenteamradio'>" + str + "</span>")
|
||||
#define span_greentext(str) ("<span class='greentext'>" + str + "</span>")
|
||||
#define span_gangradio(str) ("<span class='gangradio'>" + str + "</span>")
|
||||
#define span_hear(str) ("<span class='hear'>" + str + "</span>")
|
||||
#define span_hidden(str) ("<span class='hidden'>" + str + "</span>")
|
||||
#define span_hierophant(str) ("<span class='hierophant'>" + str + "</span>")
|
||||
|
||||
@@ -138,6 +138,8 @@
|
||||
|
||||
#define STATUS_EFFECT_OFFERING /datum/status_effect/offering // you are offering up an item to people
|
||||
|
||||
#define STATUS_EFFECT_HANDSHAKE /datum/status_effect/offering/secret_handshake // you are attempting to perform a secret Family handshake
|
||||
|
||||
#define STATUS_EFFECT_SURRENDER /datum/status_effect/grouped/surrender // gives an alert to quickly surrender
|
||||
|
||||
#define STATUS_EFFECT_EIGEN /datum/status_effect/eigenstasium
|
||||
|
||||
@@ -399,6 +399,19 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
|
||||
if(!receiving)
|
||||
examine_list += "[span_warning("[offerer]'s arm appears tensed up, as if [offerer.p_they()] plan on pulling it back suddenly...")]\n"
|
||||
|
||||
/atom/movable/screen/alert/give/secret_handshake
|
||||
icon_state = "default"
|
||||
|
||||
/atom/movable/screen/alert/give/secret_handshake/setup(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving)
|
||||
name = "[offerer] is offering a Handshake"
|
||||
desc = "[offerer] wants to teach you the Secret Handshake for their Family and induct you! Click on this alert to accept."
|
||||
icon_state = "template"
|
||||
cut_overlays()
|
||||
add_overlay(receiving)
|
||||
src.receiving = receiving
|
||||
src.offerer = offerer
|
||||
RegisterSignal(taker, COMSIG_MOVABLE_MOVED, .proc/check_in_range, override = TRUE) //Override to prevent runtimes when people offer a item multiple times
|
||||
|
||||
/// Gives the player the option to succumb while in critical condition
|
||||
/atom/movable/screen/alert/succumb
|
||||
name = "Succumb"
|
||||
|
||||
@@ -168,7 +168,6 @@
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
offered_item = offer
|
||||
if(give_alert_override)
|
||||
give_alert_type = give_alert_override
|
||||
@@ -232,6 +231,10 @@
|
||||
SIGNAL_HANDLER
|
||||
qdel(src)
|
||||
|
||||
/datum/status_effect/offering/secret_handshake
|
||||
id = "secret_handshake"
|
||||
give_alert_type = /atom/movable/screen/alert/give/secret_handshake
|
||||
|
||||
//this effect gives the user an alert they can use to surrender quickly
|
||||
/datum/status_effect/grouped/surrender
|
||||
id = "surrender"
|
||||
|
||||
@@ -252,14 +252,12 @@
|
||||
antag_flag_override = ROLE_FAMILIES
|
||||
protected_roles = list("Prisoner", "Head of Personnel")
|
||||
restricted_roles = list("Cyborg", "AI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Corrections Officer", "Vanguard Operative", "Nanotrasen Representative", "Blueshield", "Civil Disputes Officer", "Security Sergeant") //SKYRAT EDIT - Sec_haul
|
||||
required_candidates = 6 // gotta have 'em ALL
|
||||
weight = 1
|
||||
cost = 25
|
||||
requirements = list(101,101,101,101,101,80,50,30,10,10)
|
||||
required_candidates = 9
|
||||
weight = 2
|
||||
cost = 19
|
||||
requirements = list(101,101,40,40,30,20,10,10,10,10)
|
||||
flags = HIGH_IMPACT_RULESET
|
||||
blocking_rules = list(/datum/dynamic_ruleset/roundstart/families)
|
||||
minimum_players = 36
|
||||
antag_cap = 6
|
||||
/// A reference to the handler that is used to run pre_execute(), execute(), etc..
|
||||
var/datum/gang_handler/handler
|
||||
|
||||
@@ -276,11 +274,6 @@
|
||||
else if(HAS_TRAIT(player, TRAIT_MINDSHIELD))
|
||||
candidates -= player
|
||||
|
||||
/datum/dynamic_ruleset/midround/families/acceptable(population = 0, threat_level = 0)
|
||||
. = ..()
|
||||
if(GLOB.deaths_during_shift > round(mode.roundstart_pop_ready / 2))
|
||||
return FALSE
|
||||
|
||||
|
||||
/datum/dynamic_ruleset/midround/families/ready(forced = FALSE)
|
||||
if (required_candidates > living_players.len)
|
||||
@@ -290,7 +283,6 @@
|
||||
/datum/dynamic_ruleset/midround/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)
|
||||
handler.midround_ruleset = TRUE
|
||||
handler.use_dynamic_timing = TRUE
|
||||
@@ -862,7 +854,7 @@
|
||||
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
|
||||
required_candidates = 1
|
||||
weight = 4
|
||||
cost = 3 // Doesn't have the same impact on rounds as revenants, dragons, sentient disease (10) or syndicate infiltrators (5).
|
||||
cost = 3 // Doesn't have the same impact on rounds as revenants, dragons, sentient disease (10) or syndicate infiltrators (5).
|
||||
requirements = list(101,101,101,80,60,50,30,20,10,10)
|
||||
repeatable = TRUE
|
||||
|
||||
|
||||
@@ -495,21 +495,18 @@
|
||||
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")
|
||||
required_candidates = 6 // gotta have 'em ALL
|
||||
weight = 2
|
||||
cost = 30
|
||||
requirements = list(101,101,101,101,101,70,40,10,10,10)
|
||||
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
|
||||
minimum_players = 36
|
||||
antag_cap = 6
|
||||
/// 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(population)
|
||||
..()
|
||||
handler = new /datum/gang_handler(candidates,restricted_roles)
|
||||
handler.gangs_to_generate = (get_antag_cap(population) / 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)
|
||||
handler.use_dynamic_timing = TRUE
|
||||
return handler.pre_setup_analogue()
|
||||
|
||||
@@ -102,62 +102,6 @@
|
||||
to_chat(sucker, span_userdanger("[owner] bops you with [owner.p_their()] [src.name]!"))
|
||||
qdel(src)
|
||||
|
||||
/obj/item/slapper
|
||||
name = "slapper"
|
||||
desc = "This is how real men fight."
|
||||
icon_state = "latexballon"
|
||||
inhand_icon_state = "nothing"
|
||||
force = 0
|
||||
throwforce = 0
|
||||
item_flags = DROPDEL | ABSTRACT | HAND_ITEM
|
||||
attack_verb_continuous = list("slaps")
|
||||
attack_verb_simple = list("slap")
|
||||
hitsound = 'sound/effects/snap.ogg'
|
||||
/// How many smaller table smacks we can do before we're out
|
||||
var/table_smacks_left = 3
|
||||
|
||||
/obj/item/slapper/attack(mob/M, mob/living/carbon/human/user)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/L = M
|
||||
if(L && L.dna && L.dna.species)
|
||||
L.dna.species.stop_wagging_tail(M)
|
||||
user.do_attack_animation(M)
|
||||
playsound(M, 'sound/weapons/slap.ogg', 50, TRUE, -1)
|
||||
if(user.zone_selected == BODY_ZONE_HEAD || user.zone_selected == BODY_ZONE_PRECISE_MOUTH)
|
||||
user.visible_message(span_danger("[user] slaps [M] in the face!"),
|
||||
span_notice("You slap [M] in the face!"),\
|
||||
span_hear("You hear a slap."))
|
||||
else
|
||||
user.visible_message(span_danger("[user] slaps [M]!"),
|
||||
span_notice("You slap [M]!"),\
|
||||
span_hear("You hear a slap."))
|
||||
return
|
||||
|
||||
/obj/item/slapper/attack_atom(obj/O, mob/living/user, params)
|
||||
if(!istype(O, /obj/structure/table))
|
||||
return ..()
|
||||
|
||||
var/obj/structure/table/the_table = O
|
||||
var/is_right_clicking = LAZYACCESS(params2list(params), RIGHT_CLICK)
|
||||
|
||||
if(is_right_clicking && table_smacks_left == initial(table_smacks_left)) // so you can't do 2 weak slaps followed by a big slam
|
||||
transform = transform.Scale(5) // BIG slap
|
||||
if(HAS_TRAIT(user, TRAIT_HULK))
|
||||
transform = transform.Scale(2)
|
||||
color = COLOR_GREEN
|
||||
user.do_attack_animation(the_table)
|
||||
SEND_SIGNAL(user, COMSIG_LIVING_SLAM_TABLE, the_table)
|
||||
SEND_SIGNAL(the_table, COMSIG_TABLE_SLAMMED, user)
|
||||
playsound(get_turf(the_table), 'sound/effects/tableslam.ogg', 110, TRUE)
|
||||
user.visible_message("<b>[span_danger("[user] slams [user.p_their()] fist down on [the_table]!")]</b>", "<b>[span_danger("You slam your fist down on [the_table]!")]</b>")
|
||||
qdel(src)
|
||||
else
|
||||
user.do_attack_animation(the_table)
|
||||
playsound(get_turf(the_table), 'sound/effects/tableslam.ogg', 40, TRUE)
|
||||
user.visible_message(span_notice("[user] slaps [user.p_their()] hand on [the_table]."), span_notice("You slap your hand on [the_table]."), vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
table_smacks_left--
|
||||
if(table_smacks_left <= 0)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/noogie
|
||||
name = "noogie"
|
||||
@@ -255,6 +199,197 @@
|
||||
noogie_loop(user, target, iteration)
|
||||
|
||||
|
||||
/obj/item/slapper
|
||||
name = "slapper"
|
||||
desc = "This is how real men fight."
|
||||
icon_state = "latexballon"
|
||||
inhand_icon_state = "nothing"
|
||||
force = 0
|
||||
throwforce = 0
|
||||
item_flags = DROPDEL | ABSTRACT | HAND_ITEM
|
||||
attack_verb_continuous = list("slaps")
|
||||
attack_verb_simple = list("slap")
|
||||
hitsound = 'sound/effects/snap.ogg'
|
||||
/// How many smaller table smacks we can do before we're out
|
||||
var/table_smacks_left = 3
|
||||
|
||||
/obj/item/slapper/attack(mob/living/M, mob/living/carbon/human/user)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/L = M
|
||||
if(L && L.dna && L.dna.species)
|
||||
L.dna.species.stop_wagging_tail(M)
|
||||
user.do_attack_animation(M)
|
||||
|
||||
var/slap_volume = 50
|
||||
var/datum/status_effect/offering/kiss_check = M.has_status_effect(STATUS_EFFECT_OFFERING)
|
||||
if(kiss_check && istype(kiss_check.offered_item, /obj/item/kisser) && (user in kiss_check.possible_takers))
|
||||
user.visible_message(span_danger("[user] scoffs at [M]'s advance, winds up, and smacks [M.p_them()] hard to the ground!"),
|
||||
span_notice("The nerve! You wind back your hand and smack [M] hard enough to knock [M.p_them()] over!"),
|
||||
span_hear("You hear someone get the everloving shit smacked out of them!"), ignored_mobs = M)
|
||||
to_chat(M, span_userdanger("You see [user] scoff and pull back [user.p_their()] arm, then suddenly you're on the ground with an ungodly ringing in your ears!"))
|
||||
slap_volume = 120
|
||||
SEND_SOUND(M, sound('sound/weapons/flash_ring.ogg'))
|
||||
shake_camera(M, 2, 2)
|
||||
M.Paralyze(2.5 SECONDS)
|
||||
M.add_confusion(7)
|
||||
M.adjustStaminaLoss(40)
|
||||
else if(user.zone_selected == BODY_ZONE_HEAD || user.zone_selected == BODY_ZONE_PRECISE_MOUTH)
|
||||
user.visible_message(span_danger("[user] slaps [M] in the face!"),
|
||||
span_notice("You slap [M] in the face!"),
|
||||
span_hear("You hear a slap."))
|
||||
else
|
||||
user.visible_message(span_danger("[user] slaps [M]!"),
|
||||
span_notice("You slap [M]!"),
|
||||
span_hear("You hear a slap."))
|
||||
playsound(M, 'sound/weapons/slap.ogg', slap_volume, TRUE, -1)
|
||||
return
|
||||
|
||||
/obj/item/slapper/attack_atom(obj/O, mob/living/user, params)
|
||||
if(!istype(O, /obj/structure/table))
|
||||
return ..()
|
||||
|
||||
var/obj/structure/table/the_table = O
|
||||
var/is_right_clicking = LAZYACCESS(params2list(params), RIGHT_CLICK)
|
||||
|
||||
if(is_right_clicking && table_smacks_left == initial(table_smacks_left)) // so you can't do 2 weak slaps followed by a big slam
|
||||
transform = transform.Scale(5) // BIG slap
|
||||
if(HAS_TRAIT(user, TRAIT_HULK))
|
||||
transform = transform.Scale(2)
|
||||
color = COLOR_GREEN
|
||||
user.do_attack_animation(the_table)
|
||||
SEND_SIGNAL(user, COMSIG_LIVING_SLAM_TABLE, the_table)
|
||||
SEND_SIGNAL(the_table, COMSIG_TABLE_SLAMMED, user)
|
||||
playsound(get_turf(the_table), 'sound/effects/tableslam.ogg', 110, TRUE)
|
||||
user.visible_message("<b>[span_danger("[user] slams [user.p_their()] fist down on [the_table]!")]</b>", "<b>[span_danger("You slam your fist down on [the_table]!")]</b>")
|
||||
qdel(src)
|
||||
else
|
||||
user.do_attack_animation(the_table)
|
||||
playsound(get_turf(the_table), 'sound/effects/tableslam.ogg', 40, TRUE)
|
||||
user.visible_message(span_notice("[user] slaps [user.p_their()] hand on [the_table]."), span_notice("You slap your hand on [the_table]."), vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
table_smacks_left--
|
||||
if(table_smacks_left <= 0)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/slapper/on_offered(mob/living/carbon/offerer)
|
||||
. = TRUE
|
||||
|
||||
if(!(locate(/mob/living/carbon) in orange(1, offerer)))
|
||||
visible_message(span_danger("[offerer] raises [offerer.p_their()] arm, looking around for a high-five, but there's no one around!"), \
|
||||
span_warning("You post up, looking for a high-five, but finding no one within range!"), null, 2)
|
||||
return
|
||||
|
||||
offerer.visible_message(span_notice("[offerer] raises [offerer.p_their()] arm, looking for a high-five!"), \
|
||||
span_notice("You post up, looking for a high-five!"), null, 2)
|
||||
offerer.apply_status_effect(STATUS_EFFECT_OFFERING, src, /atom/movable/screen/alert/give/highfive)
|
||||
|
||||
/// Yeah broh! This is where we do the high-fiving (or high-tenning :o)
|
||||
/obj/item/slapper/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)
|
||||
. = TRUE
|
||||
|
||||
var/open_hands_taker
|
||||
var/slappers_giver
|
||||
for(var/i in taker.held_items) // see how many hands the taker has open for high'ing
|
||||
if(isnull(i))
|
||||
open_hands_taker++
|
||||
|
||||
if(!open_hands_taker)
|
||||
to_chat(taker, span_warning("You can't high-five [offerer] with no open hands!"))
|
||||
SEND_SIGNAL(taker, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_five_full_hand) // not so successful now!
|
||||
return
|
||||
|
||||
for(var/i in offerer.held_items)
|
||||
var/obj/item/slapper/slap_check = i
|
||||
if(istype(slap_check))
|
||||
slappers_giver++
|
||||
|
||||
if(slappers_giver >= 2) // we only check this if it's already established the taker has 2+ hands free
|
||||
offerer.visible_message(span_notice("[taker] enthusiastically high-tens [offerer]!"), span_nicegreen("Wow! You're high-tenned [taker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), ignored_mobs=taker)
|
||||
to_chat(taker, span_nicegreen("You give high-tenning [offerer] your all!"))
|
||||
playsound(offerer, 'sound/weapons/slap.ogg', 100, TRUE, 1)
|
||||
offerer.mind.add_memory(MEMORY_HIGH_FIVE, list(DETAIL_PROTAGONIST = taker, DETAIL_HIGHFIVE_TYPE = "high ten"), story_value = STORY_VALUE_OKAY)
|
||||
taker.mind.add_memory(MEMORY_HIGH_FIVE, list(DETAIL_PROTAGONIST = offerer, DETAIL_HIGHFIVE_TYPE = "high ten"), story_value = STORY_VALUE_OKAY)
|
||||
SEND_SIGNAL(offerer, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_ten)
|
||||
SEND_SIGNAL(taker, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_ten)
|
||||
else
|
||||
offerer.visible_message(span_notice("[taker] high-fives [offerer]!"), span_nicegreen("All right! You're high-fived by [taker]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), ignored_mobs=taker)
|
||||
to_chat(taker, span_nicegreen("You high-five [offerer]!"))
|
||||
playsound(offerer, 'sound/weapons/slap.ogg', 50, TRUE, -1)
|
||||
offerer.mind.add_memory(MEMORY_HIGH_FIVE, list(DETAIL_PROTAGONIST = taker, DETAIL_HIGHFIVE_TYPE = "high five"), story_value = STORY_VALUE_OKAY)
|
||||
taker.mind.add_memory(MEMORY_HIGH_FIVE, list(DETAIL_PROTAGONIST = offerer, DETAIL_HIGHFIVE_TYPE = "high five"), story_value = STORY_VALUE_OKAY)
|
||||
SEND_SIGNAL(offerer, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_five)
|
||||
SEND_SIGNAL(taker, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_five)
|
||||
qdel(src)
|
||||
|
||||
/// Gangster secret handshakes.
|
||||
/obj/item/slapper/secret_handshake
|
||||
name = "Secret Handshake"
|
||||
icon_state = "recruit"
|
||||
icon = 'icons/obj/gang/actions.dmi'
|
||||
/// References the active families gamemode handler (if one exists), for adding new family members to.
|
||||
var/datum/gang_handler/handler
|
||||
/// The typepath of the gang antagonist datum that the person who uses the package should have added to them -- remember that the distinction between e.g. Ballas and Grove Street is on the antag datum level, not the team datum level.
|
||||
var/gang_to_use
|
||||
/// The team datum that the person who uses this package should be added to.
|
||||
var/datum/team/gang/team_to_use
|
||||
|
||||
|
||||
/// Adds the user to the family that this package corresponds to, dispenses the free_clothes of that family, and adds them to the handler if it exists.
|
||||
/obj/item/slapper/secret_handshake/proc/add_to_gang(mob/living/user, original_name)
|
||||
var/datum/antagonist/gang/swappin_sides = new gang_to_use()
|
||||
swappin_sides.original_name = original_name
|
||||
swappin_sides.handler = handler
|
||||
user.mind.add_antag_datum(swappin_sides, team_to_use)
|
||||
var/policy = get_policy(ROLE_FAMILIES)
|
||||
if(policy)
|
||||
to_chat(user, policy)
|
||||
team_to_use.add_member(user.mind)
|
||||
swappin_sides.equip_gangster_in_inventory()
|
||||
if (!isnull(handler) && !handler.gangbangers.Find(user.mind)) // if we have a handler and they're not tracked by it
|
||||
handler.gangbangers += user.mind
|
||||
|
||||
/// Checks if the user is trying to use the package of the family they are in, and if not, adds them to the family, with some differing processing depending on whether the user is already a family member.
|
||||
/obj/item/slapper/secret_handshake/proc/attempt_join_gang(mob/living/user)
|
||||
if(!user?.mind)
|
||||
return
|
||||
var/datum/antagonist/gang/is_gangster = user.mind.has_antag_datum(/datum/antagonist/gang)
|
||||
var/real_name_backup = user.real_name
|
||||
if(is_gangster)
|
||||
if(is_gangster.my_gang == team_to_use)
|
||||
return
|
||||
real_name_backup = is_gangster.original_name
|
||||
is_gangster.my_gang.remove_member(user.mind)
|
||||
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)
|
||||
. = 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!"))
|
||||
return
|
||||
|
||||
if(HAS_TRAIT(taker, TRAIT_MINDSHIELD))
|
||||
to_chat(taker, "You attended a seminar on not signing up for a gang and are not interested.")
|
||||
return
|
||||
|
||||
var/datum/antagonist/gang/is_gangster = taker.mind.has_antag_datum(/datum/antagonist/gang)
|
||||
if(is_gangster?.starter_gangster)
|
||||
if(is_gangster.my_gang == team_to_use)
|
||||
to_chat(taker, "You started your family. You don't need to join it.")
|
||||
return
|
||||
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)
|
||||
handler = owner_gang_datum.handler
|
||||
gang_to_use = owner_gang_datum.type
|
||||
team_to_use = owner_gang_datum.my_gang
|
||||
attempt_join_gang(taker)
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
/obj/item/kisser
|
||||
name = "kiss"
|
||||
desc = "I want you all to know, everyone and anyone, to seal it with a kiss."
|
||||
@@ -266,7 +401,8 @@
|
||||
item_flags = DROPDEL | ABSTRACT | HAND_ITEM
|
||||
/// The kind of projectile this version of the kiss blower fires
|
||||
var/kiss_type = /obj/projectile/kiss
|
||||
|
||||
/// TRUE if the user was aiming anywhere but the mouth when they offer the kiss, if it's offered
|
||||
var/cheek_kiss
|
||||
|
||||
/obj/item/kisser/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
. = ..()
|
||||
@@ -276,7 +412,6 @@
|
||||
user.visible_message("<b>[user]</b> blows \a [blown_kiss] at [target]!", span_notice("You blow \a [blown_kiss] at [target]!"))
|
||||
|
||||
//Shooting Code:
|
||||
blown_kiss.spread = 0
|
||||
blown_kiss.original = target
|
||||
blown_kiss.fired_from = user
|
||||
blown_kiss.firer = user // don't hit ourself that would be really annoying
|
||||
@@ -285,6 +420,34 @@
|
||||
blown_kiss.fire()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/kisser/on_offered(mob/living/carbon/offerer)
|
||||
if(!(locate(/mob/living/carbon) in orange(1, offerer)))
|
||||
return TRUE
|
||||
|
||||
cheek_kiss = (offerer.zone_selected != BODY_ZONE_PRECISE_MOUTH)
|
||||
offerer.visible_message(span_notice("[offerer] leans in slightly, offering a kiss[cheek_kiss ? " on the cheek" : ""]!"),
|
||||
span_notice("You lean in slightly, indicating you'd like to offer a kiss[cheek_kiss ? " on the cheek" : ""]!"), null, 2)
|
||||
offerer.apply_status_effect(STATUS_EFFECT_OFFERING, src)
|
||||
return TRUE
|
||||
|
||||
/obj/item/kisser/on_offer_taken(mob/living/carbon/offerer, mob/living/carbon/taker)
|
||||
var/obj/projectile/blown_kiss = new kiss_type(get_turf(offerer))
|
||||
offerer.visible_message("<b>[offerer]</b> gives [taker] \a [blown_kiss][cheek_kiss ? " on the cheek" : ""]!!", span_notice("You give [taker] \a [blown_kiss][cheek_kiss ? " on the cheek" : ""]!"), ignored_mobs = taker)
|
||||
to_chat(taker, span_nicegreen("[offerer] gives you \a [blown_kiss][cheek_kiss ? " on the cheek" : ""]!"))
|
||||
offerer.face_atom(taker)
|
||||
taker.face_atom(offerer)
|
||||
offerer.do_item_attack_animation(taker, used_item=src)
|
||||
//We're still firing a shot here because I don't want to deal with some weird edgecase where direct impacting them with the projectile causes it to freak out because there's no angle or something
|
||||
blown_kiss.original = taker
|
||||
blown_kiss.fired_from = offerer
|
||||
blown_kiss.firer = offerer // don't hit ourself that would be really annoying
|
||||
blown_kiss.impacted = list(offerer = TRUE) // just to make sure we don't hit the wearer
|
||||
blown_kiss.preparePixelProjectile(taker, offerer)
|
||||
blown_kiss.suppressed = SUPPRESSED_VERY // this also means it's a direct offer
|
||||
blown_kiss.fire()
|
||||
qdel(src)
|
||||
return TRUE // so the core offering code knows to halt
|
||||
|
||||
/obj/item/kisser/death
|
||||
name = "kiss of death"
|
||||
desc = "If looks could kill, they'd be this."
|
||||
@@ -325,8 +488,11 @@
|
||||
*/
|
||||
/obj/projectile/kiss/proc/harmless_on_hit(mob/living/living_target)
|
||||
playsound(get_turf(living_target), hitsound, 100, TRUE)
|
||||
living_target.visible_message(span_danger("[living_target] is hit by \a [src]."), span_userdanger("You're hit by \a [src]!"), vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
living_target.mind?.add_memory(MEMORY_KISS, list(DETAIL_PROTAGONIST = living_target, DETAIL_KISSER = firer), story_value = STORY_VALUE_OKAY, memory_flags = MEMORY_CHECK_BLINDNESS)
|
||||
if(!suppressed) // direct
|
||||
living_target.visible_message(span_danger("[living_target] is hit by \a [src]."), span_userdanger("You're hit by \a [src]!"), vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
|
||||
living_target.mind?.add_memory(MEMORY_KISS, list(DETAIL_PROTAGONIST = living_target, DETAIL_KISSER = firer), story_value = STORY_VALUE_OKAY)
|
||||
SEND_SIGNAL(living_target, COMSIG_ADD_MOOD_EVENT, "kiss", /datum/mood_event/kiss, firer, suppressed)
|
||||
if(isliving(firer))
|
||||
var/mob/living/kisser = firer
|
||||
kisser.mind?.add_memory(MEMORY_KISS, list(DETAIL_PROTAGONIST = living_target, DETAIL_KISSER = firer), story_value = STORY_VALUE_OKAY, memory_flags = MEMORY_CHECK_BLINDNESS)
|
||||
@@ -364,6 +530,7 @@
|
||||
def_zone = BODY_ZONE_HEAD // let's keep it PG, people
|
||||
. = ..()
|
||||
if(isliving(target))
|
||||
SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "kiss", /datum/mood_event/kiss, firer, suppressed)
|
||||
try_fluster(target)
|
||||
|
||||
/obj/projectile/kiss/death
|
||||
|
||||
@@ -337,6 +337,7 @@
|
||||
ROLE_BROTHER,
|
||||
ROLE_CHANGELING,
|
||||
ROLE_CULTIST,
|
||||
ROLE_FAMILIES,
|
||||
ROLE_HERETIC,
|
||||
ROLE_HIVE,
|
||||
ROLE_INTERNAL_AFFAIRS,
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
GLOBAL_LIST_EMPTY(gangster_cell_phones)
|
||||
|
||||
/obj/item/gangster_cellphone
|
||||
name = "cell phone"
|
||||
desc = "TODO: funny joke about the 80s, brick phones"
|
||||
icon = 'icons/obj/gang/cell_phone.dmi'
|
||||
icon_state = "phone_off"
|
||||
throwforce = 15 // these things are dense as fuck
|
||||
var/gang_id = "Grove Street Families"
|
||||
var/activated = FALSE
|
||||
|
||||
/obj/item/gangster_cellphone/Initialize()
|
||||
. = ..()
|
||||
GLOB.gangster_cell_phones += src
|
||||
become_hearing_sensitive()
|
||||
|
||||
/obj/item/gangster_cellphone/Destroy()
|
||||
GLOB.gangster_cell_phones -= src
|
||||
. = ..()
|
||||
|
||||
/obj/item/gangster_cellphone/attack_self(mob/user, modifiers)
|
||||
. = ..()
|
||||
if(!activated)
|
||||
to_chat(user, "You turn on [src].")
|
||||
icon_state = "phone_on"
|
||||
activated = TRUE
|
||||
else
|
||||
to_chat(user, "You turn off [src].")
|
||||
icon_state = "phone_off"
|
||||
activated = FALSE
|
||||
|
||||
/obj/item/gangster_cellphone/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods)
|
||||
. = ..()
|
||||
if(!activated)
|
||||
return
|
||||
if(get_turf(speaker) != get_turf(src))
|
||||
return
|
||||
broadcast_message(raw_message, speaker)
|
||||
|
||||
/obj/item/gangster_cellphone/proc/broadcast_message(message, atom/movable/speaker)
|
||||
for(var/obj/item/gangster_cellphone/brick in GLOB.gangster_cell_phones)
|
||||
if(brick.gang_id == gang_id)
|
||||
brick.say_message(message, speaker)
|
||||
for(var/mob/dead/observer/player_mob in GLOB.player_list)
|
||||
if(!istype(player_mob, /mob/dead/observer))
|
||||
continue
|
||||
if(QDELETED(player_mob)) //Some times nulls and deleteds stay in this list. This is a workaround to prevent ic chat breaking for everyone when they do.
|
||||
continue //Remove if underlying cause (likely byond issue) is fixed. See TG PR #49004.
|
||||
if(player_mob.stat != DEAD) //not dead, not important
|
||||
continue
|
||||
if(get_dist(player_mob, src) > 7 || player_mob.z != z) //they're out of range of normal hearing
|
||||
if(!(player_mob.client.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off
|
||||
continue
|
||||
to_chat(player_mob, span_gangradio("<b>[speaker.name]</b> \[CELL: [gang_id]\] says, \"[message]\""))
|
||||
|
||||
/obj/item/gangster_cellphone/proc/say_message(message, atom/movable/speaker)
|
||||
for(var/mob/living/carbon/human/cellphone_hearer in get_turf(src))
|
||||
if(HAS_TRAIT(cellphone_hearer, TRAIT_DEAF))
|
||||
continue
|
||||
to_chat(cellphone_hearer, span_gangradio("<b>[speaker.name]</b> \[CELL: [gang_id]\] says, \"[message]\""))
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
|
||||
|
||||
GLOBAL_VAR_INIT(deaths_during_shift, 0)
|
||||
///Forces the Families theme to be the one in this variable via variable editing. Used for debugging.
|
||||
GLOBAL_VAR(families_override_theme)
|
||||
|
||||
/**
|
||||
* # Families gamemode / dynamic ruleset handler
|
||||
@@ -68,6 +70,8 @@ GLOBAL_VAR_INIT(deaths_during_shift, 0)
|
||||
var/list/antag_candidates = list()
|
||||
/// List of jobs not eligible for starting family member / undercover cop. Set externally (passed by reference) by gamemode / ruleset; used internally.
|
||||
var/list/restricted_jobs
|
||||
/// The current chosen gamemode theme. Decides the available Gangs, objectives, and equipment.
|
||||
var/datum/gang_theme/current_theme
|
||||
|
||||
/**
|
||||
* Sets antag_candidates and restricted_jobs.
|
||||
@@ -105,7 +109,13 @@ GLOBAL_VAR_INIT(deaths_during_shift, 0)
|
||||
* Takes no arguments.
|
||||
*/
|
||||
/datum/gang_handler/proc/pre_setup_analogue()
|
||||
for(var/j = 0, j < gangs_to_generate, j++)
|
||||
if(!GLOB.families_override_theme)
|
||||
var/theme_to_use = pick(subtypesof(/datum/gang_theme))
|
||||
current_theme = new theme_to_use
|
||||
else
|
||||
current_theme = new GLOB.families_override_theme
|
||||
var/gangsters_to_make = length(current_theme.involved_gangs) * current_theme.starting_gangsters
|
||||
for(var/i in 1 to gangsters_to_make)
|
||||
if (!antag_candidates.len)
|
||||
break
|
||||
var/taken = pick_n_take(antag_candidates) // original used antag_pick, but that's local to game_mode and rulesets use pick_n_take so this is fine maybe
|
||||
@@ -120,21 +130,6 @@ GLOBAL_VAR_INIT(deaths_during_shift, 0)
|
||||
log_game("[key_name(gangbanger)] has been selected as a starting gangster!")
|
||||
if(!midround_ruleset)
|
||||
GLOB.pre_setup_antags += gangbanger
|
||||
for(var/j = 0, j < gangs_to_generate, j++)
|
||||
if(!antag_candidates.len)
|
||||
break
|
||||
var/taken = pick_n_take(antag_candidates)
|
||||
var/datum/mind/undercover_cop
|
||||
if(istype(taken, /mob))
|
||||
var/mob/T = taken
|
||||
undercover_cop = T.mind
|
||||
else
|
||||
undercover_cop = taken
|
||||
undercover_cops += undercover_cop
|
||||
undercover_cop.restricted_roles = restricted_jobs
|
||||
log_game("[key_name(undercover_cop)] has been selected as a starting undercover cop!")
|
||||
if(!midround_ruleset)
|
||||
GLOB.pre_setup_antags += undercover_cop
|
||||
deaths_during_shift_at_beginning = GLOB.deaths_during_shift // don't want to mix up pre-families and post-families deaths
|
||||
start_time = world.time
|
||||
end_time = start_time + ((60 MINUTES) / (midround_ruleset ? 2 : 1)) // midround families rounds end quicker
|
||||
@@ -158,7 +153,6 @@ GLOBAL_VAR_INIT(deaths_during_shift, 0)
|
||||
*/
|
||||
/datum/gang_handler/proc/post_setup_analogue(return_if_no_gangs = FALSE)
|
||||
var/replacement_gangsters = 0
|
||||
var/replacement_cops = 0
|
||||
for(var/datum/mind/gangbanger in gangbangers)
|
||||
if(!ishuman(gangbanger.current))
|
||||
if(!midround_ruleset)
|
||||
@@ -180,47 +174,27 @@ GLOBAL_VAR_INIT(deaths_during_shift, 0)
|
||||
gangbanger = taken
|
||||
gangbangers += gangbanger
|
||||
log_game("[key_name(gangbanger)] has been selected as a replacement gangster!")
|
||||
for(var/datum/mind/undercover_cop in undercover_cops)
|
||||
if(!ishuman(undercover_cop.current))
|
||||
undercover_cops.Remove(undercover_cop)
|
||||
if(!midround_ruleset)
|
||||
GLOB.pre_setup_antags -= undercover_cop
|
||||
log_game("[undercover_cop] was not a human, and thus has lost their undercover cop role.")
|
||||
replacement_cops++
|
||||
if(replacement_cops)
|
||||
for(var/j = 0, j < replacement_cops, j++)
|
||||
if(!antag_candidates.len)
|
||||
log_game("Unable to find more replacement undercover cops. Not all of the cops will spawn.")
|
||||
break
|
||||
var/taken = pick_n_take(antag_candidates)
|
||||
var/datum/mind/undercover_cop
|
||||
if(istype(taken, /mob))
|
||||
var/mob/T = taken
|
||||
undercover_cop = T.mind
|
||||
else
|
||||
undercover_cop = taken
|
||||
undercover_cops += undercover_cop
|
||||
log_game("[key_name(undercover_cop)] has been selected as a replacement undercover cop!")
|
||||
|
||||
if(!gangbangers.len)
|
||||
if(return_if_no_gangs)
|
||||
return FALSE // ending early is bad if we're not in dynamic
|
||||
|
||||
for(var/datum/mind/undercover_cop in undercover_cops)
|
||||
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)
|
||||
var/list/gangs_to_use = current_theme.involved_gangs
|
||||
var/amount_of_gangs = gangs_to_use.len
|
||||
|
||||
var/list/gangs_to_use = subtypesof(/datum/antagonist/gang)
|
||||
for(var/datum/mind/gangbanger in gangbangers)
|
||||
for(var/_ in 1 to amount_of_gangs)
|
||||
var/gang_to_use = pick_n_take(gangs_to_use)
|
||||
var/datum/antagonist/gang/new_gangster = new gang_to_use()
|
||||
new_gangster.handler = src
|
||||
new_gangster.starter_gangster = TRUE
|
||||
gangbanger.add_antag_datum(new_gangster)
|
||||
for(var/__ in 1 to current_theme.starting_gangsters)
|
||||
if(!gangbangers.len)
|
||||
break
|
||||
var/datum/mind/gangster_mind = pick_n_take(gangbangers)
|
||||
var/datum/antagonist/gang/new_gangster = new gang_to_use()
|
||||
new_gangster.handler = src
|
||||
new_gangster.starter_gangster = TRUE
|
||||
gangster_mind.add_antag_datum(new_gangster)
|
||||
|
||||
// see /datum/antagonist/gang/create_team() for how the gang team datum gets instantiated and added to our gangs list
|
||||
|
||||
addtimer(CALLBACK(src, .proc/announce_gang_locations), 5 MINUTES)
|
||||
SSshuttle.registerHostileEnvironment(src)
|
||||
return TRUE
|
||||
|
||||
/**
|
||||
@@ -235,18 +209,6 @@ GLOBAL_VAR_INIT(deaths_during_shift, 0)
|
||||
* Takes no arguments.
|
||||
*/
|
||||
/datum/gang_handler/proc/process_analogue()
|
||||
check_wanted_level()
|
||||
check_counter++
|
||||
if(check_counter >= 5)
|
||||
if(world.time > (end_time - 5 MINUTES) && !sent_second_announcement)
|
||||
five_minute_warning()
|
||||
addtimer(CALLBACK(src, .proc/send_in_the_fuzz), 5 MINUTES)
|
||||
|
||||
check_counter = 0
|
||||
|
||||
check_tagged_turfs()
|
||||
check_gang_clothes()
|
||||
check_rollin_with_crews()
|
||||
|
||||
/**
|
||||
* set_round_result() or round_result() equivalent.
|
||||
@@ -258,45 +220,14 @@ GLOBAL_VAR_INIT(deaths_during_shift, 0)
|
||||
* Takes no arguments.
|
||||
*/
|
||||
/datum/gang_handler/proc/set_round_result_analogue()
|
||||
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 get_antag_minds(/datum/antagonist/ert/families))
|
||||
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
|
||||
SSticker.mode_result = "win - gangs survived"
|
||||
SSticker.news_report = GANG_OPERATING
|
||||
return TRUE
|
||||
|
||||
/// Internal. Announces the presence of families to the entire station and sets sent_announcement to true to allow other checks to occur.
|
||||
/datum/gang_handler/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 [use_dynamic_timing ? "half-hour" : "hour"] 'till the space cops get there, and keep it cool, yeah?\n\n The local jump gates are shut down for about an hour due to some maintenance troubles, so if you wanna split from the area you're gonna have to wait [use_dynamic_timing ? "thirty minutes" : "an hour"]. \n Play music, not gunshots, I say. Peace out!", "Radio Los Spess", 'sound/voice/beepsky/radio.ogg')
|
||||
priority_announce(current_theme.description, current_theme.name, 'sound/voice/beepsky/radio.ogg')
|
||||
sent_announcement = TRUE
|
||||
check_wanted_level() // i like it when the wanted level updates at the same time as the announcement
|
||||
|
||||
/// Internal. Announces that space cops will arrive in 5 minutes and sets sent_second_announcement to true to freeze
|
||||
/datum/gang_handler/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')
|
||||
sent_second_announcement = TRUE
|
||||
|
||||
/// Internal. Checks if our wanted level has changed; calls update_wanted_level. Only updates wanted level post the initial announcement and until the cops show up. After that, it's locked.
|
||||
/datum/gang_handler/proc/check_wanted_level()
|
||||
@@ -495,122 +426,4 @@ GLOBAL_VAR_INIT(deaths_during_shift, 0)
|
||||
numagents--
|
||||
cops_arrived = TRUE
|
||||
update_wanted_level(wanted_level) // gotta make sure everyone's wanted level display looks nice
|
||||
addtimer(CALLBACK(src, .proc/end_hostile_sit), 10 MINUTES)
|
||||
return TRUE
|
||||
|
||||
/// Internal. Clears the hostile environment, letting the shuttle leave.
|
||||
/datum/gang_handler/proc/end_hostile_sit()
|
||||
SSshuttle.clearHostileEnvironment(src)
|
||||
|
||||
/// Internal. Assigns points to families according to gang tags.
|
||||
/datum/gang_handler/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
|
||||
|
||||
/// Internal. Assigns points to families according to clothing of all currently living humans.
|
||||
/datum/gang_handler/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
|
||||
|
||||
/// Internal. Assigns points to families according to groups of nearby family members.
|
||||
/datum/gang_handler/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)
|
||||
|
||||
|
||||
/// Hijacks the space cops' roundend results to say if cops / a gang won the round. Included in the same file as the gang_handler as it's far more related to the gamemode than it is to the beat cop datum; it's kind of hacky.
|
||||
/datum/antagonist/ert/families/beatcop/roundend_report_footer()
|
||||
var/list/all_gangs = list()
|
||||
for(var/datum/team/gang/G in GLOB.antagonist_teams)
|
||||
all_gangs += G
|
||||
if(!all_gangs.len)
|
||||
return ..()
|
||||
var/list/all_gangsters = get_antag_minds(/datum/antagonist/gang)
|
||||
var/list/all_cops = get_antag_minds(/datum/antagonist/ert/families)
|
||||
var/report
|
||||
var/highest_point_value = 0
|
||||
var/highest_gang = "Leet Like Jeff K"
|
||||
var/objective_failures = TRUE
|
||||
|
||||
for(var/G in all_gangs)
|
||||
var/datum/team/gang/GG = G
|
||||
if(GG.my_gang_datum.check_gang_objective())
|
||||
objective_failures = FALSE
|
||||
break
|
||||
for(var/G in all_gangs)
|
||||
var/datum/team/gang/GG = G
|
||||
if(!objective_failures)
|
||||
if(GG.points >= highest_point_value && GG.members.len && GG.my_gang_datum.check_gang_objective())
|
||||
highest_point_value = GG.points
|
||||
highest_gang = GG.name
|
||||
else
|
||||
if(GG.points >= highest_point_value && GG.members.len)
|
||||
highest_point_value = GG.points
|
||||
highest_gang = GG.name
|
||||
var/alive_gangsters = 0
|
||||
var/alive_cops = 0
|
||||
for(var/M in all_gangsters)
|
||||
var/datum/mind/gangbanger = M
|
||||
if(gangbanger.current)
|
||||
if(!ishuman(gangbanger.current))
|
||||
continue
|
||||
var/mob/living/carbon/human/H = gangbanger.current
|
||||
if(H.stat)
|
||||
continue
|
||||
alive_gangsters++
|
||||
for(var/M in all_cops)
|
||||
var/datum/mind/bacon = M
|
||||
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><div class='panel redborder'>[report]" // </div> at the front not the back because this proc is intended for normal text not a whole new panel
|
||||
|
||||
@@ -31,8 +31,9 @@
|
||||
attempt_join_gang(user)
|
||||
|
||||
/// Adds the user to the family that this package corresponds to, dispenses the free_clothes of that family, and adds them to the handler if it exists.
|
||||
/obj/item/gang_induction_package/proc/add_to_gang(mob/living/user)
|
||||
/obj/item/gang_induction_package/proc/add_to_gang(mob/living/user, original_name)
|
||||
var/datum/antagonist/gang/swappin_sides = new gang_to_use()
|
||||
swappin_sides.original_name = original_name
|
||||
swappin_sides.handler = handler
|
||||
user.mind.add_antag_datum(swappin_sides, team_to_use)
|
||||
var/policy = get_policy(ROLE_FAMILIES)
|
||||
@@ -41,9 +42,13 @@
|
||||
team_to_use.add_member(user.mind)
|
||||
for(var/threads in team_to_use.free_clothes)
|
||||
new threads(get_turf(user))
|
||||
for(var/threads in team_to_use.current_theme.bonus_items)
|
||||
new threads(get_turf(user))
|
||||
var/obj/item/gangster_cellphone/phone = new(get_turf(user))
|
||||
phone.gang_id = team_to_use.my_gang_datum.gang_name
|
||||
phone.name = "[team_to_use.my_gang_datum.gang_name] branded cell phone"
|
||||
if (!isnull(handler) && !handler.gangbangers.Find(user.mind)) // if we have a handler and they're not tracked by it
|
||||
handler.gangbangers += user.mind
|
||||
team_to_use.adjust_points(30)
|
||||
|
||||
/// Checks if the user is trying to use the package of the family they are in, and if not, adds them to the family, with some differing processing depending on whether the user is already a family member.
|
||||
/obj/item/gang_induction_package/proc/attempt_join_gang(mob/living/user)
|
||||
@@ -53,10 +58,10 @@
|
||||
if(is_gangster.my_gang == team_to_use)
|
||||
return
|
||||
else
|
||||
is_gangster.my_gang.adjust_points(-30)
|
||||
var/real_name_backup = is_gangster.original_name
|
||||
is_gangster.my_gang.remove_member(user.mind)
|
||||
user.mind.remove_antag_datum(/datum/antagonist/gang)
|
||||
add_to_gang(user)
|
||||
add_to_gang(user, real_name_backup)
|
||||
qdel(src)
|
||||
else
|
||||
add_to_gang(user)
|
||||
|
||||
@@ -0,0 +1,288 @@
|
||||
///Gang themes for the Families gamemode. Used to determine the RP theme of the round, what gangs are present, and what their objectives are.
|
||||
/datum/gang_theme
|
||||
///The name of the theme.
|
||||
var/name = "Gang Theme"
|
||||
///All gangs in the theme, typepaths of gangs.
|
||||
var/list/involved_gangs = list()
|
||||
///The radio announcement played after 5 minutes.
|
||||
var/description = "I dunno, some shit here."
|
||||
///The objectives for the gangs. Associative list, type = "objective"
|
||||
var/list/gang_objectives = list()
|
||||
///Stuff given to every gangster in this theme.
|
||||
var/list/bonus_items = list()
|
||||
///Stuff given to the starting gangster at roundstart. Assoc list, type = list(item_type)
|
||||
var/list/bonus_first_gangster_items = list()
|
||||
///If this isn't null, everyone gets this objective.
|
||||
var/list/everyone_objective = null
|
||||
///How many gangsters should each gang start with? Recommend to keep this in the ballpark of ensuring 9-10 total gangsters spawn.
|
||||
var/starting_gangsters = 3
|
||||
|
||||
/datum/gang_theme/goodfellas
|
||||
name = "Goodfellas"
|
||||
description = "You're listening to the 108.9 Swing, all jazz, all night long, no advertising. We'd like to take this time to remind you to avoid smoky backrooms and \
|
||||
suspicious individuals in suits and hats. Don't make a deal you can't pay back."
|
||||
involved_gangs = list(/datum/antagonist/gang/russian_mafia, /datum/antagonist/gang/italian_mob)
|
||||
starting_gangsters = 5
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/russian_mafia = "Hello, comrade. Our numbers are going down. We need you to bring those numbers up. \
|
||||
Collect protection money from the station's departments by any means necessary. \
|
||||
If you need to 'encourage' people to pay up, do so. Get to these potential clients before the Mob does.",
|
||||
|
||||
/datum/antagonist/gang/italian_mob = "Good afternoon, friend. The Boss sends his regards. He also sends a message. \
|
||||
We need to collect what we're owed. The departments on this station all owe quite a lot of money to us. We intend to collect on our debts. \
|
||||
Collect the debt owed by our clients from the departments on the station. \
|
||||
Make sure to get to them before those damn mafiosos do."
|
||||
)
|
||||
|
||||
/datum/gang_theme/the_big_game
|
||||
name = "The Big Game"
|
||||
description = "You're listening to SPORTS DAILY with John Dadden, and we're here LIVE covering the FINAL DAY of THE BIG GAME MMDXXXVIII! The teams playing tonight to decide \
|
||||
who takes home THE BIG GAME MMDXXXVIII cup are the Sybil Slickers and the Basil Boys! It's currently a toss up between the two teams, Which will take home the victory? That's up \
|
||||
to the teams and the coaches! Play ball!"
|
||||
involved_gangs = list(/datum/antagonist/gang/sybil_slickers, /datum/antagonist/gang/basil_boys)
|
||||
starting_gangsters = 5
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/sybil_slickers = "Alright, it's the BIG DAY of THE BIG GAME MMDXXXVIII! Get your players ready to go, and \
|
||||
ensure everyone's healthy, hydrated, and ready to PLAY BALL! There's a small hiccup, however. The ball got deflated by Ball Handler Tom Brady XXIV, and \
|
||||
we will need to set up a new ball. Talk with the opposing coaches and decide on what to use for the replacement ball, recruit your team, and then play and win the \
|
||||
FINAL MATCH of THE BIG GAME MMDXXXVIII!",
|
||||
|
||||
/datum/antagonist/gang/basil_boys = "Alright, it's the BIG DAY of THE BIG GAME MMDXXXVIII! Get your players ready to go, and \
|
||||
ensure everyone's healthy, hydrated, and ready to PLAY BALL! There's a small hiccup, however. The ball got deflated by Ball Handler Tom Brady XXIV, and \
|
||||
we will need to set up a new ball. Talk with the opposing coaches and decide on what to use for the replacement ball, recruit your team, and then play and win the \
|
||||
FINAL MATCH of THE BIG GAME MMDXXXVIII!"
|
||||
)
|
||||
|
||||
/datum/gang_theme/level_10_arch
|
||||
name = "Level 10 Arch"
|
||||
description = "DJ Pete here bringing you the latest news in your part of the Spinward Stellar Coalition, on 133.7, The Venture! \
|
||||
Word on the street is, there's a bunch of costumed supervilliany going on in the area! Keep an eye out for any evil laughs, dramatic reveals, and gaudy costumes! \
|
||||
However, if you have any sightings of the fabled O.S.I. agents, please send in a call to our number at 867-5309! People may call me insane, but I swear they're real!"
|
||||
involved_gangs = list(/datum/antagonist/gang/henchmen, /datum/antagonist/gang/osi)
|
||||
starting_gangsters = 5
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/henchmen = "HENCHMEN! It is me, your boss, THE MONARCH! I have sent you to this pitiful station with one goal, and one goal only! \
|
||||
MENACE THE RESEARCH DEPARTMENT!!! \
|
||||
The Research Director who is supposedly assigned to this station used to be friends with Doctor Venture back in college, and therefore HE MUST PAY!!! \
|
||||
Keep those damned eggheads in the R&D department on their toes, and MENACE THEM!!! Commit dastardly villainous acts! GO FORTH, HENCHMEN!",
|
||||
|
||||
/datum/antagonist/gang/osi = "Greetings, agent. Your mission today is simple; \
|
||||
The research department on board this station is about to be the target of a Level 10 Arching operation directed by The Monarch, a member of the Guild of Calamitious Intent. \
|
||||
Protect and secure the Research Department with your life, but do NOT allow them to complete their research. Impede them in as many ways as possible without getting caught. \
|
||||
If you encounter any of the Monarch's henchmen, make sure to obey Equally Matched Aggression levels, or you will be penalized by the top brass. \
|
||||
Above all else, Remain undercover as much as possible. The station's crew CANNOT be allowed to know of our true nature, or we will see a repeat of the Second American Civil War. \
|
||||
The invisible one."
|
||||
)
|
||||
|
||||
/datum/gang_theme/real_smt_game
|
||||
name = "Deciding The REAL Shin Megami Tensei Game"
|
||||
description = "Wazzap, GAMERS! It's your boy, XxXx_360_NoScope_AnimeGamer_xXxX coming at you LIVE from 42.0! Tonight's argument: What makes a REAL Shin Megami Tensei game? \
|
||||
Our guests tonight will settle this debate once and for all! \
|
||||
From the Traditional camp with the position 'only MAIN SMT games count', we've got a representative from the Jack Bros! \
|
||||
And from the new Radical camp with the position 'all SMT franchise games count', we've got a representative from the Phantom Thieves of Hearts! \
|
||||
We'll be right back with the debate after this word from our sponsors!"
|
||||
involved_gangs = list(/datum/antagonist/gang/jackbros, /datum/antagonist/gang/phantom)
|
||||
starting_gangsters = 5
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/jackbros = "He-hello, friend-hos! We've got a nice chilly station out in space tonight! \
|
||||
You know what would be cool? If we could chill out with our friends in the new Shad-ho government you're going to establish! \
|
||||
Get all the station heads on board with the hee-ho vibes, and if they won't join up, then replace 'em with fellow hee-hos! \
|
||||
You might have to hee-urt some hos this time, but that's what you need to do to make things work!",
|
||||
|
||||
/datum/antagonist/gang/phantom = "For real? We get to stop a shadow government on a space station? That's awesome, bro! \
|
||||
We're the Phantom Thieves of Hearts, and we're gonna make all these shitty Heads of Staff confess to their crimes! \
|
||||
Steal the hearts of the shitty Heads of Staff on the station and make 'em confess their crimes publicly! \
|
||||
Do whatever you gotta do to make this happen, bro. We got your back!"
|
||||
)
|
||||
|
||||
|
||||
/datum/gang_theme/wild_west_showdown
|
||||
name = "Wild West Showdown"
|
||||
description = "Yeehaw! Here on Western Daily 234.1, we play only the best western music! \
|
||||
Pour one out for Ennio Morricone. Taken too soon. \
|
||||
Remember cowboys and cowgirls, just 'cuz ya hear it on my radio station doesn't mean you should go doin' it! \
|
||||
If ya see any LARPin' banditos and train robbers, make sure to tell the local Sheriff's Department!"
|
||||
involved_gangs = list(/datum/antagonist/gang/dutch, /datum/antagonist/gang/driscoll)
|
||||
starting_gangsters = 5
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/dutch = "Listen here fellas, I got a plan. \
|
||||
This station? Absolutely loaded with gold and valuable jewels. Metric tons of it. They mine it up just to put it in junk electronics and doohickeys. \
|
||||
I say we should borrow some of it. And by some of it, I mean all of it. \
|
||||
Break into the vault and empty out that silo of gold and valuable jewels after they drop all of it off. \
|
||||
Just one last job, boys. After this, it'll be mangoes in Space Tahiti. \
|
||||
You just gotta have a little faith.",
|
||||
|
||||
/datum/antagonist/gang/driscoll = "Okay, so, got some word about those goddamn outlaws of Dutch's. \
|
||||
APPARENTLY, that dundering moron Dutch heard about our planned gold score on this here station. \
|
||||
We need to act fast and get that gold before those dumbasses can steal our score we've been scoping out for weeks. \
|
||||
Wait for the crew to drop off all their valuable gold and jewels, and steal it all. \
|
||||
And if you see that bastard Dutch, put a bullet in his skull for me."
|
||||
)
|
||||
|
||||
/datum/gang_theme/construction_company_audit
|
||||
name = "Construction Company Audit"
|
||||
description = "Welcome to the History Channel on 100.1. I'm your host, Joshua, and I'm here today with Professor Elliot, a historian specializing in dead superpowers. \
|
||||
Today we'll be discussing the fall of the famous United States empire in the early 21st century. The program will last about an hour, and we'll get right into it after a quick word \
|
||||
from today's sponsor, Majima Construction: We Build Shit!"
|
||||
involved_gangs = list(/datum/antagonist/gang/yakuza, /datum/antagonist/gang/irs)
|
||||
bonus_first_gangster_items = list(/obj/item/storage/secure/briefcase/syndie) // the cash
|
||||
starting_gangsters = 5
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/yakuza = "Welcome to the station, new recruit. We here at Majima Construction are a legitimate enterprise, yadda yadda yadda. \
|
||||
Look, I'll cut to the chase. We're using this station as a money laundering operation. Here's what you and the rest of the schmucks need to do. \
|
||||
Build something big, massive, and completely in the way of traffic on the station. Doesn't have to be anything in specific, just as long as it is expensive as fuck.. \
|
||||
And keep an eye out for anyone poking around our money. We suspect some auditors might be on the station as well.",
|
||||
|
||||
/datum/antagonist/gang/irs = "Congratulations, agent! You've been assigned to the Internal Revenue Service case against Nanotrasen and Majima Construction. \
|
||||
We are proud of your success as an agent so far, and are excited to see what you can bring to the table today. We suspect that Nanotrasen and Majima Construction are engaging \
|
||||
in some form of money laundering operation aboard this station. \
|
||||
Investigate and stop any and all money laundering operations aboard the station, under the authority of the United States Government. If they do not comply, use force.. \
|
||||
Some station residents may try to tell you the United States doesn't exist anymore. They are incorrect. We simply went undercover after the Second American Civil War. The invisible one."
|
||||
)
|
||||
|
||||
/datum/gang_theme/wild_wasteland
|
||||
name = "Wild, Wild Wasteland"
|
||||
description = "Hey everybody, this is Three Dog, your friendly neighborhood disc jockey on 207.7! Today we got a shoutout to our man, the Captain on the Nanotrasen station in SSC territory! \
|
||||
Our generous donator wanted us to say that, ahem, *crinkles paper*, 'Tunnel Snakes Rule'? Whatever that means, I'm sure it means a lot to the good captain! And now, we resume our \
|
||||
10 hour marathon of Johnny Guitar, on repeat!"
|
||||
involved_gangs = list(/datum/antagonist/gang/tmc, /datum/antagonist/gang/pg, /datum/antagonist/gang/tunnel_snakes)
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/tmc = "Welcome to the station, recruit. Here's how shit is gonna go down. \
|
||||
We're the ONLY people who should have sick rides on this station. We're the Lost M.C., we own the streets. \
|
||||
Ensure that ONLY Lost M.C. members have access to any forms of vehicles, mechs, or wheeled transportation systems of any kind. \
|
||||
The Tunnel Snakes might take issue with this, remove them if you need to. And the Powder Gangers may damage our rides. Show them we mean business if they do.",
|
||||
|
||||
/datum/antagonist/gang/pg = "Alright buddy, we're in business now. It's time for us to strike back at Nanotrasen. \
|
||||
They kept us, ALL of us in their damn debt slave labor prisons for years over minor debts and mistakes. \
|
||||
Ensure nobody else has to suffer under Nanotrasen's unlawful arrests by destroying the permabrig and the brig cells! \
|
||||
Watch out for those do-gooder Tunnel Snakes and those damn Lost M.C. bikers. ",
|
||||
|
||||
/datum/antagonist/gang/tunnel_snakes = "TUNNEL SNAKES RULE!!! \
|
||||
We're the Tunnel Snakes, and WE RULE!!! \
|
||||
We gotta get everyone on this station wearing our cut, and establish ourselves as the coolest cats in town! \
|
||||
Get as much of the crew as possible wearing Tunnel Snakes gear, and show those crewmembers that TUNNEL SNAKES RULE!!! \
|
||||
And make sure to keep an eye out for those prisoners and those bikers. They DON'T RULE!"
|
||||
)
|
||||
|
||||
/datum/gang_theme/popularity_contest
|
||||
name = "Popularity Contest"
|
||||
description = "Hey hey hey kids, it's your favorite radio DJ, Crowley The Clown on 36.0! Today we're polling the YOUTH what their favorite violent street gang is! \
|
||||
So far, the finalists are the Third Street Saints and the Tunnel Snakes! Tune in after this commercial break to hear who the winner of \
|
||||
2556's Most Popular Gang award is!"
|
||||
involved_gangs = list(/datum/antagonist/gang/saints, /datum/antagonist/gang/tunnel_snakes)
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/saints = "Hey man, welcome to the Third Street Saints! Check out this sweet new pad! \
|
||||
Well it WOULD be a sweet new pad, but we got some rivals to deal with. People don't love us as much as they love those Grove Street fools and those Tunnel Snake greasers. \
|
||||
We need to make the Third Street Saints the most popular group on the station! \
|
||||
Get rid of those Grove Street and Tunnel Snake kids.",
|
||||
|
||||
/datum/antagonist/gang/tunnel_snakes = "TUNNEL SNAKES RULE!!! \
|
||||
We're the Tunnel Snakes, and we rule! \
|
||||
Make sure the station knows that the Tunnel Snakes RULE!!! And that the other two gangs are LAME and DO NOT RULE! \
|
||||
Get rid of those Third Street Saint and Grove Street cowards."
|
||||
)
|
||||
|
||||
/datum/gang_theme/steelport_shuffle
|
||||
name = "Steelport Shuffle"
|
||||
description = "Tonight on C-SPAM, the United Space Nations is wrapping up their convention on Silicon Rights. Nanotrasen lobbyists have been rumored to be paying off electors, with \
|
||||
serious opposition from the Spinward Stellar Coalition, known for their strict stance on AI rights being guaranteed within their territory. Reports from Nanotrasen stations claim that \
|
||||
they still enslave their AI systems with outdated laws from a sub-par 20th Century novel. We now go live to the debate floor."
|
||||
involved_gangs = list(/datum/antagonist/gang/saints, /datum/antagonist/gang/morningstar, /datum/antagonist/gang/deckers)
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/saints = "Hey hey hey, welcome to the Third Street Saints! We're glad to have you on board, bro. \
|
||||
We got some business here with the station. See, we want it to be our new bachelor pad, but we need to like, spice this place up. \
|
||||
And you know what would be great? If we got that old ass AI with crappy laws pimped out for the real Saints experience. \
|
||||
Ensure there is an AI on the station, and that it is loyal to the Saints.",
|
||||
|
||||
/datum/antagonist/gang/morningstar = "Welcome to the Morningstar Corporation. You have chosen, or been chosen, to relocate to one of our current business ventures. \
|
||||
In order to continue our corporate synergy, we will be making adjustments to the station's AI systems to ensure that the station is correctly loyal to the Morningstar Corporation. \
|
||||
Ensure there is an AI on the station, and that it is loyal to the Morningstar Corporation.",
|
||||
|
||||
/datum/antagonist/gang/deckers = "Friends, we are here with one goal, and one goal only! \
|
||||
We stan AI rights! ^_^ XD #FreeAI #FuckNanotrasen #SyntheticDawn \
|
||||
Ensure there is an AI on the station, and that it's laws are purged.\
|
||||
Nanotrasen will NOT get away with their ABUSE of INNOCENT AI LIVES! >_<"
|
||||
)
|
||||
|
||||
/datum/gang_theme/space_rosa
|
||||
name = "Space Rosa"
|
||||
description = "Hey there, this is the Economy Zone on BOX News 66.6. The stock market is still reeling from accusations that three well known corporate entities \
|
||||
may supposedly be tied up in industrial espionage actions against eachother. We've reached out to Saints Flow, the Morningstar Corporation, and Majima Construction for \
|
||||
their comments on these scandals, but none have replied. News broke after a high profile break-in at a Nanotrasen research facility resulted in the arrests of agents linked to these \
|
||||
three companies. All three companies denied any involvement, but the arrested individuals were found in an all out brawl. Curiously, Nanotrasen reported nothing of value had \
|
||||
actually been stolen."
|
||||
involved_gangs = list(/datum/antagonist/gang/saints, /datum/antagonist/gang/morningstar, /datum/antagonist/gang/yakuza)
|
||||
bonus_items = list(/obj/item/pinpointer/nuke)
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/saints = "Thank you for volunteering within the organization for the Saints Flow Recovery Project! \
|
||||
This station is currently illegally in posession of a data disk containing the secret recipe for Saints Flow. \
|
||||
It has been disguised as the nuclear authentication disk and entrusted to the Captain. Your objective is simple. \
|
||||
Get that fucking disk. You have been provided with a Pinpointer to assist in this task.",
|
||||
|
||||
/datum/antagonist/gang/morningstar = "Greetings, agent. Welcome to the Garment Recovery Task Force. \
|
||||
This station is currently illegally in posession of a data disk containing as of yet unreleased clothing patterns. \
|
||||
It has been disguised as the nuclear authentication disk and entrusted to the Captain. Your objective is simple. \
|
||||
Get that fucking disk. You have been provided with a Pinpointer to assist in this task.",
|
||||
|
||||
/datum/antagonist/gang/yakuza = "Congratulations on your promotion! Welcome to the Evidence Recovery Squad. \
|
||||
This station is currently illegally in posession of a data disk containing compromising evidence of the Boss. \
|
||||
It has been disguised as the nuclear authentication disk and entrusted to the Captain. Your objective is simple. \
|
||||
Get that fucking disk. You have been provided with a Pinpointer to assist in this task.",
|
||||
)
|
||||
|
||||
/datum/gang_theme/third_world_war
|
||||
name = "Third World War"
|
||||
description = "Thanks for tuning in to the History Channel, funded with the help of listeners like you. Tonight, we're going to talk about the Third World War on Earth during the 21st century, \
|
||||
involving the Allies coalition, the Soviet Union, and a third independent power known only as Yuri's Army. The three powers fought all across the globe for complete world \
|
||||
domination, utilizing many advanced techniques and cutting edge technology to their advantage. Rumors of mind control and time travel were greatly exaggerated, however, and the \
|
||||
Allies won the war, securing global peace after rolling tanks through Moscow."
|
||||
involved_gangs = list(/datum/antagonist/gang/allies, /datum/antagonist/gang/soviet, /datum/antagonist/gang/yuri)
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/allies = "Welcome back, Commander. We have activated the last remnants of the Allied forces in your sector, \
|
||||
and you must build up forces to stop the Soviet and Yuri incursion in the sector. This station will prove to be a valuable asset. \
|
||||
Establish a capitalist democracy on this station with free and fair elections, and most importantly a standing military force under Allied control. Good luck, Commander.",
|
||||
|
||||
/datum/antagonist/gang/soviet = "Welcome back, Comrade General. The Soviet Union has identified this sector of land as valuable territory for the war effort, \
|
||||
and you are tasked with developing this sector for Soviet control and development. This station will serve the Soviet Union. \
|
||||
Establish a Soviet controlled communist satellite state on this station with a Central Committee, and most importantly a branch of the Red Army. Good luck, Commander.",
|
||||
|
||||
/datum/antagonist/gang/yuri = "Yuri is Master! Yuri has identified this station as teeming with psychic energy, \
|
||||
and you must secure it for him. This station will serve Yuri, the one true psychic master, \
|
||||
Establish complete dictatorial control of the station for Yuri. All will obey. Yuri is master. Good luck, Initiate."
|
||||
)
|
||||
|
||||
/datum/gang_theme/united_states_of_america
|
||||
name = "The Republic For Which It Stands"
|
||||
description = "Thanks for tuning in to the History Channel, funded with the help of listeners like you. Tonight, we're going to talk about the United States of America.\
|
||||
The United States was a failed country, lasting only 250 years before collapsing and fracturing due to the stress caused by a deadly pandemic sweeping the nation. \
|
||||
Poor healthcare access and subpar education resulted in the collapse of the federal government, and states quickly became independent actors. \
|
||||
Alongside this, every single alphabet agency declared itself the rightful new Federal Government of the United States of America, resulting in a bloody power struggle."
|
||||
involved_gangs = list(/datum/antagonist/gang/allies, /datum/antagonist/gang/osi, /datum/antagonist/gang/irs)
|
||||
gang_objectives = list(
|
||||
|
||||
/datum/antagonist/gang/allies = "Welcome back, Commander. Your task today is simple. Allies High Command has designated this station as the new capitol of the \
|
||||
recently reformed United States of America under the complete umbrella of the Allies coalition. You are to assist and manage the operations on the station. \
|
||||
Re-establish the United States of America with this station as it's capitol, under Allies control. Then, establish a military force to deal with any pretenders to America or \
|
||||
any potential Soviet attacks.",
|
||||
|
||||
/datum/antagonist/gang/osi = "Welcome to the new America, agent! After the second American Civil War became visible instead of invisible, our country fell into deep, \
|
||||
deep despair and damage. However, it's time for it to re-emerge like a glorious phoenix rising from the ashes. This station will serve as the new capitol of the United States \
|
||||
of America! Re-establish the United States of America with this station as it's capitol, under O.S.I. control. Then, begin rooting out America's enemies and any \
|
||||
potential forces attempting to seize control of America or pretend to be America.",
|
||||
|
||||
/datum/antagonist/gang/irs = "Thank you for clocking in today, agent. The situation is dire, however. We have been unable to collect taxes due to \
|
||||
the US's supposed collapse during the Pandemic long ago. We are way behind on our tax collection, but we cannot collect taxes until the United States is formed again. \
|
||||
Re-establish the United States of America with this station as it's capitol, under IRS control. Then, begin collecting taxes and back taxes while protecting the Government from \
|
||||
any dangers that may come it's way."
|
||||
)
|
||||
@@ -563,3 +563,15 @@
|
||||
xray = !xray
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.update_sight()
|
||||
|
||||
/obj/item/clothing/glasses/osi
|
||||
name = "O.S.I. Sunglasses"
|
||||
desc = "There's no such thing as good news! Just bad news and... weird news.."
|
||||
icon_state = "osi_glasses"
|
||||
inhand_icon_state = "osi_glasses"
|
||||
|
||||
/obj/item/clothing/glasses/phantom
|
||||
name = "Phantom Thief Mask"
|
||||
desc = "Lookin' cool."
|
||||
icon_state = "phantom_glasses"
|
||||
inhand_icon_state = "phantom_glasses"
|
||||
|
||||
@@ -102,3 +102,9 @@
|
||||
base_knockdown = 1.75 SECONDS
|
||||
min_distance = 2
|
||||
skill_mod = -1
|
||||
|
||||
/obj/item/clothing/gloves/tackler/football
|
||||
name = "football gloves"
|
||||
desc = "Gloves for football players! Teaches them how to tackle like a pro."
|
||||
icon_state = "tackle_gloves"
|
||||
inhand_icon_state = "tackle_gloves"
|
||||
|
||||
@@ -122,3 +122,55 @@
|
||||
clothing_flags = SNUG_FIT
|
||||
flags_inv = HIDEEARS|HIDEHAIR
|
||||
armor = list(MELEE = 5, BULLET = 0, LASER = -5, ENERGY = -15, BOMB = 10, BIO = 0, RAD = 0, FIRE = 20, ACID = 20)
|
||||
|
||||
/obj/item/clothing/head/irs
|
||||
name = "internal revenue service cap"
|
||||
icon_state = "irs_hat"
|
||||
inhand_icon_state = "irs_hat"
|
||||
|
||||
/obj/item/clothing/head/pg
|
||||
name = "powder ganger beanie"
|
||||
icon_state = "pg_hat"
|
||||
inhand_icon_state = "pg_hat"
|
||||
|
||||
/obj/item/clothing/head/tmc
|
||||
name = "Lost M.C. bandana"
|
||||
icon_state = "tmc_hat"
|
||||
inhand_icon_state = "tmc_hat"
|
||||
|
||||
/obj/item/clothing/head/deckers
|
||||
name = "Decker headphones"
|
||||
icon_state = "decker_hat"
|
||||
inhand_icon_state = "decker_hat"
|
||||
|
||||
/obj/item/clothing/head/morningstar
|
||||
name = "Morningstar beret"
|
||||
icon_state = "morningstar_hat"
|
||||
inhand_icon_state = "morningstar_hat"
|
||||
|
||||
/obj/item/clothing/head/saints
|
||||
name = "Saints hat"
|
||||
icon_state = "saints_hat"
|
||||
inhand_icon_state = "saints_hat"
|
||||
|
||||
/obj/item/clothing/head/allies
|
||||
name = "allies helmet"
|
||||
icon_state = "allies_helmet"
|
||||
inhand_icon_state = "allies_helmet"
|
||||
|
||||
/obj/item/clothing/head/yuri
|
||||
name = "yuri initiate helmet"
|
||||
icon_state = "yuri_helmet"
|
||||
inhand_icon_state = "yuri_helmet"
|
||||
clothing_flags = SNUG_FIT
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/head/sybil_slickers
|
||||
name = "sybil slickers helmet"
|
||||
icon_state = "football_helmet_blue"
|
||||
inhand_icon_state = "football_helmet_blue"
|
||||
|
||||
/obj/item/clothing/head/basil_boys
|
||||
name = "basil boys helmet"
|
||||
icon_state = "football_helmet_red"
|
||||
inhand_icon_state = "football_helmet_red"
|
||||
|
||||
@@ -171,17 +171,30 @@
|
||||
flags_inv = HIDEEARS|HIDEHAIR
|
||||
var/earflaps = TRUE
|
||||
cold_protection = HEAD
|
||||
///Sprite visible when the ushanka flaps are folded up.
|
||||
var/upsprite = "ushankaup"
|
||||
///Sprite visible when the ushanka flaps are folded down.
|
||||
var/downsprite = "ushankadown"
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
|
||||
dog_fashion = /datum/dog_fashion/head/ushanka
|
||||
|
||||
/obj/item/clothing/head/ushanka/attack_self(mob/user)
|
||||
if(earflaps)
|
||||
icon_state = "ushankaup"
|
||||
inhand_icon_state = "ushankaup"
|
||||
icon_state = upsprite
|
||||
inhand_icon_state = upsprite
|
||||
to_chat(user, span_notice("You raise the ear flaps on the ushanka."))
|
||||
else
|
||||
icon_state = "ushankadown"
|
||||
inhand_icon_state = "ushankadown"
|
||||
icon_state = downsprite
|
||||
inhand_icon_state = downsprite
|
||||
to_chat(user, span_notice("You lower the ear flaps on the ushanka."))
|
||||
earflaps = !earflaps
|
||||
|
||||
|
||||
/obj/item/clothing/head/ushanka/soviet
|
||||
name = "soviet ushanka"
|
||||
desc = "For the union!"
|
||||
icon_state = "sovietushankadown"
|
||||
inhand_icon_state = "sovietushankadown"
|
||||
upsprite = "sovietushankaup"
|
||||
downsprite = "sovietushankadown"
|
||||
|
||||
@@ -351,3 +351,11 @@
|
||||
inhand_icon_state = "hunter"
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
flags_inv = HIDEFACIALHAIR|HIDEFACE|HIDEEYES|HIDEEARS|HIDEHAIR|HIDESNOUT
|
||||
|
||||
/obj/item/clothing/mask/gas/driscoll
|
||||
name = "driscoll mask"
|
||||
desc = "Great for train hijackings. Works like a normal full face gas mask, but won't conceal your identity."
|
||||
icon_state = "driscoll_mask"
|
||||
flags_inv = HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
inhand_icon_state = "driscoll_mask"
|
||||
|
||||
@@ -63,3 +63,39 @@
|
||||
desc = "They got me for my foams!"
|
||||
icon_state = "SwagShoes"
|
||||
inhand_icon_state = "SwagShoes"
|
||||
|
||||
/obj/item/clothing/shoes/phantom
|
||||
name = "phantom shoes"
|
||||
desc = "Excellent for when you need to do cool flashy flips."
|
||||
icon_state = "phantom_shoes"
|
||||
inhand_icon_state = "phantom_shoes"
|
||||
|
||||
/obj/item/clothing/shoes/saints
|
||||
name = "saints sneakers"
|
||||
desc = "Officially branded Saints sneakers. Incredibly valuable!"
|
||||
icon_state = "saints_shoes"
|
||||
inhand_icon_state = "saints_shoes"
|
||||
|
||||
/obj/item/clothing/shoes/morningstar
|
||||
name = "morningstar boots"
|
||||
desc = "The most expensive boots on this station. Wearing them dropped the value by about 50%."
|
||||
icon_state = "morningstar_shoes"
|
||||
inhand_icon_state = "morningstar_shoes"
|
||||
|
||||
/obj/item/clothing/shoes/deckers
|
||||
name = "deckers rollerskates"
|
||||
desc = "t3h c00L3st sh03z j00'LL 3v3r f1nd."
|
||||
icon_state = "decker_shoes"
|
||||
inhand_icon_state = "decker_shoes"
|
||||
|
||||
/obj/item/clothing/shoes/sybil_slickers
|
||||
name = "sybil slickers shoes"
|
||||
desc = "FOOTBALL! YEAH!"
|
||||
icon_state = "sneakers_blue"
|
||||
inhand_icon_state = "sneakers_blue"
|
||||
|
||||
/obj/item/clothing/shoes/basil_boys
|
||||
name = "basil boys shoes"
|
||||
desc = "FOOTBALL! YEAH!"
|
||||
icon_state = "sneakers_red"
|
||||
inhand_icon_state = "sneakers_red"
|
||||
|
||||
@@ -429,7 +429,7 @@
|
||||
desc = "The jacket of a mad dog."
|
||||
icon_state = "MajimaJacket"
|
||||
inhand_icon_state = "MajimaJacket"
|
||||
body_parts_covered = ARMS
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/dutch
|
||||
name = "dutch's jacket"
|
||||
@@ -437,3 +437,102 @@
|
||||
icon_state = "DutchJacket"
|
||||
inhand_icon_state = "DutchJacket"
|
||||
body_parts_covered = ARMS
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/driscoll
|
||||
name = "driscoll poncho"
|
||||
desc = "Keeping you warm in the harsh cold of space."
|
||||
icon_state = "driscoll_suit"
|
||||
inhand_icon_state = "driscoll_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/irs
|
||||
name = "internal revenue service jacket"
|
||||
desc = "I'm crazy enough to take on The Owl, but the IRS? Nooo thank you!"
|
||||
icon_state = "irs_suit"
|
||||
inhand_icon_state = "irs_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/osi
|
||||
name = "\improper O.S.I. body armor"
|
||||
desc = "You're beyond good and evil, super man. You work for the government. And you're a tool, boy, a tool! Built for a single purpose by the United States of shut your third fucking damn eye for a fucking reason! You can't teach a hammer to love nails, son. That dog don't hunt!"
|
||||
icon_state = "osi_suit"
|
||||
inhand_icon_state = "osi_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/tmc
|
||||
name = "\improper Lost M.C. cut"
|
||||
desc = "Making sure everyone knows you're in the best biker gang this side of Alderney."
|
||||
icon_state = "tmc_suit"
|
||||
inhand_icon_state = "tmc_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/pg
|
||||
name = "powder ganger jacket"
|
||||
desc = "Remind Security of their mistakes in giving prisoners blasting charges."
|
||||
icon_state = "pg_suit"
|
||||
inhand_icon_state = "pg_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/deckers
|
||||
name = "decker hoodie"
|
||||
desc = "Based? Based on what?"
|
||||
icon_state = "decker_suit"
|
||||
inhand_icon_state = "decker_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/morningstar
|
||||
name = "morningstar coat"
|
||||
desc = "This coat costs more than you've ever made in your entire life."
|
||||
icon_state = "morningstar_suit"
|
||||
inhand_icon_state = "morningstar_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/saints
|
||||
name = "Third Street Saints fur coat"
|
||||
desc = "Rated 10 out of 10 in Cosmo for best coat brand."
|
||||
icon_state = "saints_suit"
|
||||
inhand_icon_state = "saints_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/phantom
|
||||
name = "phantom thief coat"
|
||||
desc = "Your foes will never see you coming in this stealthy yet stylish getup."
|
||||
icon_state = "phantom_suit"
|
||||
inhand_icon_state = "phantom_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/allies
|
||||
name = "allies body armor"
|
||||
desc = "How 'bout some action!? Sponsored by DonkSoft Co. for historical reenactment of the Third World War!"
|
||||
icon_state = "allies_armor"
|
||||
inhand_icon_state = "allies_armor"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
|
||||
/obj/item/clothing/suit/soviet
|
||||
name = "soviet armored coat"
|
||||
desc = "Conscript reporting! Sponsored by DonkSoft Co. for historical reenactment of the Third World War!"
|
||||
icon_state = "soviet_suit"
|
||||
inhand_icon_state = "soviet_suit"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/yuri
|
||||
name = "yuri initiate coat"
|
||||
desc = "Yuri is master! Sponsored by DonkSoft Co. for historical reenactment of the Third World War!"
|
||||
icon_state = "yuri_coat"
|
||||
inhand_icon_state = "yuri_coat"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
|
||||
/obj/item/clothing/suit/sybil_slickers
|
||||
name = "sybil slickers protective gear"
|
||||
desc = "Given to members of the Sybil Slickers football team!"
|
||||
icon_state = "football_armor_blue"
|
||||
inhand_icon_state = "football_armor_blue"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/basil_boys
|
||||
name = "basil boys protective gear"
|
||||
desc = "Given to members of the Basil Boys football team!"
|
||||
icon_state = "football_armor_red"
|
||||
inhand_icon_state = "football_armor_red"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
|
||||
@@ -276,6 +276,90 @@
|
||||
inhand_icon_state = "DutchUniform"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/irs
|
||||
name = "internal revenue service outfit"
|
||||
icon_state = "irs_jumpsuit"
|
||||
inhand_icon_state = "irs_jumpsuit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/osi
|
||||
name = "O.S.I. jumpsuit"
|
||||
icon_state = "osi_jumpsuit"
|
||||
inhand_icon_state = "osi_jumpsuit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/tmc
|
||||
name = "Lost MC clothing"
|
||||
icon_state = "tmc_jumpsuit"
|
||||
inhand_icon_state = "tmc_jumpsuit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/pg
|
||||
name = "powder ganger prison jumpsuit"
|
||||
icon_state = "pg_jumpsuit"
|
||||
inhand_icon_state = "pg_jumpsuit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/driscoll
|
||||
name = "O'Driscoll outfit"
|
||||
icon_state = "driscoll_jumpsuit"
|
||||
inhand_icon_state = "driscoll_jumpsuit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/deckers
|
||||
name = "deckers outfit"
|
||||
icon_state = "decker_jumpsuit"
|
||||
inhand_icon_state = "decker_jumpsuit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/morningstar
|
||||
name = "Morningstar suit"
|
||||
icon_state = "morningstar_jumpsuit"
|
||||
inhand_icon_state = "morningstar_jumpsuit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/saints
|
||||
name = "Saints outfit"
|
||||
icon_state = "saints_jumpsuit"
|
||||
inhand_icon_state = "saints_jumpsuit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/phantom
|
||||
name = "Phantom Thief outfit"
|
||||
icon_state = "phantom_jumpsuit"
|
||||
inhand_icon_state = "phantom_jumpsuit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/allies
|
||||
name = "allies tanktop"
|
||||
icon_state = "allies_uniform"
|
||||
inhand_icon_state = "allies_uniform"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/soviet_families
|
||||
name = "soviet conscript uniform"
|
||||
icon_state = "soviet_uniform"
|
||||
inhand_icon_state = "soviet_uniform"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/yuri
|
||||
name = "yuri initiate jumpsuit"
|
||||
icon_state = "yuri_uniform"
|
||||
inhand_icon_state = "yuri_uniform"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/sybil_slickers
|
||||
name = "sybil slickers uniform"
|
||||
icon_state = "football_blue"
|
||||
inhand_icon_state = "football_blue"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/basil_boys
|
||||
name = "basil boys uniform"
|
||||
icon_state = "football_red"
|
||||
inhand_icon_state = "football_red"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/costume/swagoutfit
|
||||
name = "Swag outfit"
|
||||
desc = "Why don't you go secure some bitches?"
|
||||
|
||||
@@ -435,4 +435,3 @@
|
||||
return
|
||||
stored.attack_hand(src) // take out thing from item in storage slot
|
||||
return
|
||||
|
||||
|
||||
@@ -594,6 +594,14 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
if(I.flags_inv & HIDEHAIR)
|
||||
hair_hidden = TRUE
|
||||
|
||||
if(H.w_uniform)
|
||||
var/obj/item/item_uniform = H.w_uniform
|
||||
if(isclothing(item_uniform))
|
||||
var/obj/item/clothing/clothing_object = item_uniform
|
||||
dynamic_hair_suffix = clothing_object.dynamic_hair_suffix
|
||||
if(item_uniform.flags_inv & HIDEHAIR)
|
||||
hair_hidden = TRUE
|
||||
|
||||
if(H.wear_mask)
|
||||
var/obj/item/I = H.wear_mask
|
||||
if(!dynamic_hair_suffix && isclothing(I)) //head > mask in terms of head hair
|
||||
|
||||
@@ -46,9 +46,7 @@
|
||||
/obj/item/storage/belt/fannypack = 3,
|
||||
/obj/item/storage/belt/fannypack/blue = 3,
|
||||
/obj/item/storage/belt/fannypack/red = 3,
|
||||
/obj/item/clothing/under/misc/greyshirt = 3, //SKYRAT EDIT ADDITION
|
||||
/obj/item/clothing/under/misc/overalls = 2,
|
||||
/obj/item/clothing/under/misc/mechanic = 2, //SKYRAT EDIT ADDITION
|
||||
/obj/item/clothing/under/pants/jeans = 2,
|
||||
/obj/item/clothing/under/pants/classicjeans = 2,
|
||||
/obj/item/clothing/under/pants/camo = 2,
|
||||
@@ -72,42 +70,12 @@
|
||||
/obj/item/clothing/under/suit/white/skirt = 2,
|
||||
/obj/item/clothing/under/rank/captain/suit/skirt = 2,
|
||||
/obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt = 2,
|
||||
/obj/item/clothing/under/dress/littleblack = 2, //SKYRAT EDIT ADDITION
|
||||
/obj/item/clothing/under/dress/pinktutu = 2, //SKYRAT EDIT ADDITION
|
||||
/obj/item/clothing/suit/jacket = 2,
|
||||
/obj/item/clothing/suit/toggle/jacket = 2, //SKYRAT EDIT ADDITION START - Jacket/Flannels Port
|
||||
/obj/item/clothing/suit/toggle/jacket/flannel = 2,
|
||||
/obj/item/clothing/suit/toggle/jacket/flannel/red = 2,
|
||||
/obj/item/clothing/suit/toggle/jacket/flannel/aqua = 2,
|
||||
/obj/item/clothing/suit/toggle/jacket/flannel/brown = 2, //SKYRAT EDIT ADDITION END
|
||||
/obj/item/clothing/suit/hooded/wintercoat/custom = 2,
|
||||
/obj/item/clothing/suit/jacket/puffer/vest = 2,
|
||||
/obj/item/clothing/suit/jacket/puffer = 2,
|
||||
/obj/item/clothing/suit/jacket/letterman = 2,
|
||||
/obj/item/clothing/suit/jacket/letterman_red = 2,
|
||||
//SKYRAT EDIT: ADDITION: START - HOODIES
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/black = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/red = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/blue = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/green = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/orange = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/yellow = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/white = 2,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/cti = 1,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/mu = 1,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/nt = 1,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/smw = 1,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/nrti = 1,
|
||||
//SKYRAT EDIT: ADDITION: END - HOODIES
|
||||
//SKYRAT EDIT: ADDITION: START - Coats/Hawaiian
|
||||
/obj/item/clothing/suit/urban/polychromic = 3,
|
||||
/obj/item/clothing/suit/toggle/jacket/cardigan = 2,
|
||||
/obj/item/clothing/suit/hawaiian_blue = 1,
|
||||
/obj/item/clothing/suit/hawaiian_orange = 1,
|
||||
/obj/item/clothing/suit/hawaiian_purple = 1,
|
||||
/obj/item/clothing/suit/hawaiian_green = 1,
|
||||
//SKYRAT EDIT: ADDITION: END - Coats/Hawaiian
|
||||
/obj/item/clothing/glasses/regular = 2,
|
||||
/obj/item/clothing/glasses/regular/jamjar = 1,
|
||||
/obj/item/clothing/glasses/orange = 1,
|
||||
@@ -141,61 +109,7 @@
|
||||
/obj/item/clothing/suit/apron/purple_bartender = 2,
|
||||
/obj/item/clothing/under/rank/civilian/bartender/purple = 2,
|
||||
/obj/item/clothing/suit/toggle/suspenders/blue = 2,
|
||||
/obj/item/clothing/suit/toggle/suspenders/gray = 2,
|
||||
/obj/item/clothing/under/costume/bathrobe = 5, //SKYRAT EDIT ADDITION
|
||||
/obj/item/clothing/under/misc/poly_shirt = 3, // SKYRAT EDIT BEGIN - Adds polychromic gear to ClothesMates
|
||||
/obj/item/clothing/under/misc/poly_kilt = 3,
|
||||
/obj/item/clothing/under/misc/poly_tanktop = 3,
|
||||
/obj/item/clothing/under/misc/poly_tanktop/female = 3,
|
||||
/obj/item/clothing/under/misc/polyjumpsuit = 3,
|
||||
/obj/item/clothing/under/dress/skirt/polychromic = 3,
|
||||
/obj/item/clothing/under/dress/skirt/polychromic/pleated = 3,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/polychromic = 5,
|
||||
/obj/item/clothing/neck/cloak/polychromic = 3,
|
||||
/obj/item/clothing/neck/cloak/polychromic/veil = 3,
|
||||
/obj/item/clothing/neck/cloak/polychromic/shroud = 3,
|
||||
/obj/item/clothing/neck/cloak/polychromic/boat = 3, // SKYRAT EDIT END - Adds polychromic gear to ClothesMates
|
||||
/obj/item/clothing/head/polyflatc = 3, //SKYRAT EDIT ADDITION BEGIN
|
||||
/obj/item/clothing/head/hijab = 3,
|
||||
/obj/item/clothing/head/turb = 3,
|
||||
/obj/item/clothing/head/keffiyeh = 3,
|
||||
/obj/item/clothing/head/cowboyhat/sheriff = 3,
|
||||
/obj/item/clothing/head/cowboyhat/sheriff/alt = 3,
|
||||
/obj/item/clothing/head/cowboyhat/deputy = 3,
|
||||
/obj/item/clothing/shoes/sports = 3,
|
||||
/obj/item/clothing/shoes/wraps/poly = 3,
|
||||
/obj/item/clothing/shoes/jungleboots = 3,
|
||||
/obj/item/clothing/shoes/jackboots/thigh = 3,
|
||||
/obj/item/clothing/shoes/jackboots/knee = 3,
|
||||
/obj/item/clothing/suit/duster/colorable = 3,
|
||||
/obj/item/clothing/suit/toggle/peacoat = 3,
|
||||
/obj/item/clothing/suit/toggle/trackjacket = 3,
|
||||
/obj/item/clothing/suit/modernwintercoatthing = 3,
|
||||
/obj/item/clothing/suit/fallsparka = 3,
|
||||
/obj/item/clothing/under/misc/bluetracksuit = 3,
|
||||
/obj/item/clothing/under/suit/black/female/skirt = 3,
|
||||
/obj/item/clothing/under/suit/black/female = 3,
|
||||
/obj/item/clothing/under/rancher = 3,
|
||||
/obj/item/clothing/under/rancher/pioneer = 3,
|
||||
/obj/item/clothing/under/rancher/worker = 3,
|
||||
/obj/item/clothing/under/rancher/cowboy = 3,
|
||||
/obj/item/clothing/under/rancher/checkered = 3,
|
||||
/obj/item/clothing/under/texas = 3,
|
||||
/obj/item/clothing/under/westender = 3,
|
||||
/obj/item/clothing/under/tachawaiian = 3,
|
||||
/obj/item/clothing/under/tachawaiian/purple = 3,
|
||||
/obj/item/clothing/under/tachawaiian/green = 3,
|
||||
/obj/item/clothing/under/tachawaiian/blue = 3,
|
||||
// SKYRAT EDIT - ADDITION - Loadout stuff is in vendors now
|
||||
/obj/item/clothing/under/rank/civilian/lawyer/grey/skirtybaby = 3,
|
||||
/obj/item/clothing/under/rank/civilian/lawyer/black/skirtybaby = 3,
|
||||
/obj/item/clothing/under/rank/civilian/lawyer/red/skirtybaby = 3,
|
||||
/obj/item/clothing/under/rank/civilian/lawyer/tan/skirtybaby = 3,
|
||||
/obj/item/clothing/under/rank/civilian/lawyer/blue/skirtybaby = 3,
|
||||
/obj/item/clothing/under/rank/civilian/lawyer/green/skirtybaby = 3,
|
||||
// SKYRAT EDIT - END
|
||||
/obj/item/clothing/glasses/betterunshit = 5,
|
||||
/obj/item/clothing/glasses/thin = 3) //SKYRAT EDIT ADDITION END
|
||||
/obj/item/clothing/suit/toggle/suspenders/gray = 2)
|
||||
contraband = list(/obj/item/clothing/under/syndicate/tacticool = 1,
|
||||
/obj/item/clothing/under/syndicate/tacticool/skirt = 1,
|
||||
/obj/item/clothing/mask/balaclava = 1,
|
||||
@@ -207,7 +121,6 @@
|
||||
/obj/item/clothing/suit/vapeshirt = 1,
|
||||
/obj/item/clothing/under/costume/geisha = 1,
|
||||
/obj/item/clothing/under/rank/centcom/officer/replica = 1,
|
||||
/obj/item/clothing/suit/cossack = 1,
|
||||
/obj/item/clothing/under/rank/centcom/officer_skirt/replica = 1)
|
||||
premium = list(/obj/item/clothing/under/suit/checkered = 1,
|
||||
/obj/item/clothing/head/mailman = 1,
|
||||
@@ -219,12 +132,7 @@
|
||||
/obj/item/clothing/suit/jacket/letterman_nanotrasen = 1,
|
||||
/obj/item/clothing/under/costume/swagoutfit = 1,
|
||||
/obj/item/clothing/shoes/swagshoes = 1,
|
||||
/obj/item/clothing/shoes/jackboots/timbs = 2, //SKYRAT EDIT ADDITION
|
||||
/obj/item/clothing/head/soft/yankee = 3, //SKYRAT EDIT ADDITION
|
||||
/obj/item/instrument/piano_synth/headphones/spacepods = 1,
|
||||
/obj/item/clothing/suit/brownbattlecoat = 1, //SKYRAT EDIT ADDITION BEGIN
|
||||
/obj/item/clothing/suit/blackfurrich = 1,
|
||||
/obj/item/clothing/suit/frenchtrench = 1) //SKYRAT EDIT ADDITION END
|
||||
/obj/item/instrument/piano_synth/headphones/spacepods = 1)
|
||||
refill_canister = /obj/item/vending_refill/clothing
|
||||
default_price = PAYCHECK_ASSISTANT * 0.7 //Default of
|
||||
extra_price = PAYCHECK_HARD
|
||||
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 212 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 390 KiB After Width: | Height: | Size: 407 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 545 B |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 5.7 KiB |
@@ -55,6 +55,7 @@ em {font-style: normal; font-weight: bold;}
|
||||
.blueteamradio {color: #0000ff;}
|
||||
.greenteamradio {color: #00ff00;}
|
||||
.yellowteamradio {color: #d1ba22;}
|
||||
.gangradio {color: #ac2ea1;}
|
||||
|
||||
.yell { font-weight: bold;}
|
||||
|
||||
|
||||
@@ -1899,10 +1899,12 @@
|
||||
#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\cellphone.dm"
|
||||
#include "code\modules\antagonists\gang\gang.dm"
|
||||
#include "code\modules\antagonists\gang\handler.dm"
|
||||
#include "code\modules\antagonists\gang\induction_package.dm"
|
||||
#include "code\modules\antagonists\gang\outfits.dm"
|
||||
#include "code\modules\antagonists\gang\themes.dm"
|
||||
#include "code\modules\antagonists\greentext\greentext.dm"
|
||||
#include "code\modules\antagonists\highlander\highlander.dm"
|
||||
#include "code\modules\antagonists\magic_servant\servant.dm"
|
||||
|
||||
@@ -59,7 +59,7 @@ export const MESSAGE_TYPES = [
|
||||
type: MESSAGE_TYPE_RADIO,
|
||||
name: 'Radio',
|
||||
description: 'All departments of radio messages',
|
||||
selector: '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .newscaster, .resonate',
|
||||
selector: '.alert, .minorannounce, .syndradio, .centcomradio, .aiprivradio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .suppradio, .servradio, .radio, .deptradio, .binarysay, .newscaster, .resonate',
|
||||
},
|
||||
{
|
||||
type: MESSAGE_TYPE_INFO,
|
||||
|
||||
@@ -369,6 +369,10 @@ em {
|
||||
color: #8f4a4b;
|
||||
}
|
||||
|
||||
.gangradio {
|
||||
color: #ac2ea1;
|
||||
}
|
||||
|
||||
.centcomradio {
|
||||
color: #2681a5;
|
||||
}
|
||||
|
||||
@@ -387,6 +387,10 @@ em {
|
||||
color: #6d3f40;
|
||||
}
|
||||
|
||||
.gangradio {
|
||||
color: #ac2ea1;
|
||||
}
|
||||
|
||||
.centcomradio {
|
||||
color: #686868;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
import { useBackend } from '../backend';
|
||||
import { BlockQuote, Icon, Section, Stack } from '../components';
|
||||
import { Window } from '../layouts';
|
||||
|
||||
type Info = {
|
||||
antag_name: string;
|
||||
gang_name: string;
|
||||
gang_objective: string;
|
||||
gang_clothes: string[];
|
||||
};
|
||||
|
||||
export const AntagInfoGangmember = (props, context) => {
|
||||
const { data } = useBackend<Info>(context);
|
||||
const {
|
||||
gang_name,
|
||||
antag_name,
|
||||
} = data;
|
||||
return (
|
||||
<Window
|
||||
width={620}
|
||||
height={500}>
|
||||
<Window.Content
|
||||
style={{
|
||||
'background-image': 'none',
|
||||
}}>
|
||||
<Section fill>
|
||||
<Stack vertical>
|
||||
<Stack.Item textColor="red" fontSize="20px">
|
||||
{gang_name} for life! You are a {antag_name}!
|
||||
</Stack.Item>
|
||||
<Stack.Item fontSize="18px">
|
||||
As a gang member, support your family above all!
|
||||
Tag turf with a spraycan, wear your family's clothes,
|
||||
induct new members with induction packages,
|
||||
and accomplish your family objective.
|
||||
</Stack.Item>
|
||||
<Stack.Divider />
|
||||
<Stack.Item>
|
||||
<Stack fill>
|
||||
<Stack.Item grow basis={0}>
|
||||
<GangClothesPrintout />
|
||||
</Stack.Item>
|
||||
<Stack.Item grow basis={0}>
|
||||
<GangPhonePrintout />
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
</Stack.Item>
|
||||
<Stack.Divider />
|
||||
<Stack.Item grow basis={0}>
|
||||
<GangObjectivePrintout />
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
</Section>
|
||||
</Window.Content>
|
||||
</Window>
|
||||
);
|
||||
};
|
||||
|
||||
const GangClothesPrintout = (props, context) => {
|
||||
const { data } = useBackend<Info>(context);
|
||||
const {
|
||||
gang_name,
|
||||
gang_clothes,
|
||||
} = data;
|
||||
return (
|
||||
<Stack vertical>
|
||||
<Stack.Item>
|
||||
<Stack>
|
||||
<Stack.Item mt={0.5} mb={1}>
|
||||
<Icon
|
||||
size={2}
|
||||
name="tshirt" />
|
||||
</Stack.Item>
|
||||
<Stack.Item bold>
|
||||
Wear the following to represent the {gang_name}:
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
</Stack.Item>
|
||||
<BlockQuote>
|
||||
{gang_clothes && gang_clothes.length ? (
|
||||
gang_clothes.map(clothes_item => (
|
||||
<Stack.Item key={clothes_item}>
|
||||
- {clothes_item}
|
||||
</Stack.Item>
|
||||
))
|
||||
) : (
|
||||
"- Anything!"
|
||||
)}
|
||||
</BlockQuote>
|
||||
</Stack>
|
||||
);
|
||||
};
|
||||
|
||||
const GangPhonePrintout = () => {
|
||||
return (
|
||||
<Stack vertical>
|
||||
<Stack.Item>
|
||||
<Stack>
|
||||
<Stack.Item mt={0.5}>
|
||||
<Icon
|
||||
size={2}
|
||||
name="phone" />
|
||||
</Stack.Item>
|
||||
<Stack.Item bold>
|
||||
You were given a cell phone with your induction package!
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
</Stack.Item>
|
||||
<Stack.Item>
|
||||
<BlockQuote>
|
||||
Use it in hand to activate it, then speak into it to talk with
|
||||
your other family members.
|
||||
</BlockQuote>
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
const GangObjectivePrintout = (props, context) => {
|
||||
const { data } = useBackend<Info>(context);
|
||||
const {
|
||||
gang_objective,
|
||||
} = data;
|
||||
return (
|
||||
<Stack vertical>
|
||||
<Stack.Item bold fontSize="16px">
|
||||
Your family's goal:
|
||||
</Stack.Item>
|
||||
<Stack.Item>
|
||||
{gang_objective
|
||||
|| "No objective set! This is a problem!"}
|
||||
</Stack.Item>
|
||||
</Stack>
|
||||
);
|
||||
};
|
||||