diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 93f2c9a80542..7d5ac45f729b 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -23,14 +23,12 @@ #define ROLE_HERETIC "Heretic" #define ROLE_BLOB "Blob" #define ROLE_NINJA "Space Ninja" -#define ROLE_MONKEY "Monkey" #define ROLE_ABDUCTOR "Abductor" #define ROLE_REVENANT "Revenant" #define ROLE_DEVIL "Devil" #define ROLE_SERVANT_OF_RATVAR "Servant of Ratvar" #define ROLE_BROTHER "Blood Brother" #define ROLE_BRAINWASHED "Brainwashed Victim" -#define ROLE_HIVE "Hivemind Host" #define ROLE_OBSESSED "Obsessed" #define ROLE_SENTIENCE "Sentient Creature" #define ROLE_MOUSE "Mouse" @@ -42,7 +40,6 @@ #define ROLE_INTERNAL_AFFAIRS "Internal Affairs Agent" #define ROLE_FUGITIVE "Fugitive" #define ROLE_VAMPIRE "Vampire" // Yogs -#define ROLE_GANG "gangster" // Yogs #define ROLE_DARKSPAWN "darkspawn" // Yogs #define ROLE_HOLOPARASITE "Holoparasite" // Yogs #define ROLE_HORROR "Eldritch Horror" // Yogs @@ -80,7 +77,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_HERETIC = /datum/antagonist/heretic, ROLE_BLOB = /datum/antagonist/blob, ROLE_NINJA = /datum/antagonist/ninja, - ROLE_MONKEY = /datum/antagonist/monkey, ROLE_ABDUCTOR = /datum/antagonist/abductor, ROLE_REVENANT = /datum/antagonist/revenant, ROLE_DEVIL = /datum/antagonist/devil, @@ -91,7 +87,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_INTERNAL_AFFAIRS = /datum/antagonist/traitor/internal_affairs, ROLE_FUGITIVE = /datum/antagonist/fugitive, ROLE_VAMPIRE = /datum/antagonist/vampire, // Yogs - ROLE_GANG = /datum/antagonist/gang, // Yogs ROLE_DARKSPAWN = /datum/antagonist/darkspawn, // Yogs ROLE_HOLOPARASITE = /datum/antagonist/guardian, // Yogs ROLE_HORROR = /datum/antagonist/horror, // Yogs @@ -104,7 +99,6 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_SINFULDEMON = /datum/antagonist/sinfuldemon, ROLE_NIGHTMARE = /datum/antagonist/nightmare, ROLE_DISEASE = /datum/antagonist/disease, - ROLE_HIVE = /datum/antagonist/hivemind, ROLE_PIRATE = /datum/antagonist/pirate, ROLE_SENTIENCE = /datum/antagonist/sentient_creature )) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index d6a92c4021b6..df72c7a7b0ce 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -123,7 +123,6 @@ #define STATUS_EFFECT_TAMING /datum/status_effect/taming //tames the target after enough tame stacks #define STATUS_EFFECT_NECROPOLIS_CURSE /datum/status_effect/necropolis_curse -#define STATUS_EFFECT_HIVEMIND_CURSE /datum/status_effect/necropolis_curse/hivemind #define CURSE_BLINDING 1 //makes the edges of the target's screen obscured #define CURSE_SPAWNING 2 //spawns creatures that attack the target only #define CURSE_WASTING 4 //causes gradual damage diff --git a/code/__DEFINES/{yogs_defines}/antagonists.dm b/code/__DEFINES/{yogs_defines}/antagonists.dm index afd0f96a62cb..313f948a75f5 100644 --- a/code/__DEFINES/{yogs_defines}/antagonists.dm +++ b/code/__DEFINES/{yogs_defines}/antagonists.dm @@ -4,7 +4,3 @@ #define ANTAG_DATUM_INFILTRATOR /datum/antagonist/infiltrator #define ANTAG_DATUM_HIJACKEDAI /datum/antagonist/hijacked_ai #define ANTAG_DATUM_SINFULDEMON /datum/antagonist/sinfuldemon - -#define NOT_DOMINATING -1 -#define MAX_LEADERS_GANG 3 -#define INITIAL_DOM_ATTEMPTS 3 diff --git a/code/__DEFINES/{yogs_defines}/misc.dm b/code/__DEFINES/{yogs_defines}/misc.dm index 6594744e20af..60403c3ee100 100644 --- a/code/__DEFINES/{yogs_defines}/misc.dm +++ b/code/__DEFINES/{yogs_defines}/misc.dm @@ -1,6 +1,4 @@ //Endgame Results -#define GANG_LOSS 6 -#define GANG_TAKEOVER 7 #define YOGS_AMBIENT_OCCLUSION list("type"="drop_shadow","x"=0,"y"=2,"size"=4,"color"="#04080FAA" ) //filter(type="drop_shadow", x=0, y=-2, size=4, color="#04080FAA") #define YOGS_GAUSSIAN_BLUR(filter_size) list("type"="blur","size"=filter_size) //filter(type="blur", size=filter_size) #define INFILTRATION_ALLCOMPLETE 25 diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 32e1873d7f46..665e3913b663 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -106,8 +106,6 @@ visibility_flags = 0 agent = "Kongey Vibrion M-909" new_form = /mob/living/carbon/monkey - bantype = ROLE_MONKEY - stage1 = list() stage2 = list() @@ -117,13 +115,10 @@ stage5 = list(span_warning("You feel like monkeying around.")) /datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/affected_mob) - if(affected_mob.mind && !is_monkey(affected_mob.mind)) - add_monkey(affected_mob.mind) if(ishuman(affected_mob)) var/mob/living/carbon/monkey/M = affected_mob.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE) M.ventcrawler = VENTCRAWLER_ALWAYS - /datum/disease/transformation/jungle_fever/stage_act() ..() switch(stage) @@ -138,21 +133,7 @@ if(prob(3)) affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh."), forced = "jungle fever") -/datum/disease/transformation/jungle_fever/cure() - remove_monkey(affected_mob.mind) - ..() - -/datum/disease/transformation/jungle_fever/monkeymode - visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC - disease_flags = CAN_CARRY //no vaccines! no cure! - cure_text = "Clown's Tears." - cures = list(/datum/reagent/consumable/clownstears) - -/datum/disease/transformation/jungle_fever/monkeymode/after_add() - if(affected_mob && !is_monkey_leader(affected_mob.mind)) - visibility_flags = NONE - - + /datum/disease/transformation/robot name = "Robotic Transformation" diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index ca2e2c3712d2..a235c2b4d136 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -119,28 +119,6 @@ return FALSE return TRUE -/datum/saymode/monkey - key = MODE_KEY_MONKEY - mode = MODE_MONKEY - -/datum/saymode/monkey/handle_message(mob/living/user, message, datum/language/language) - var/datum/mind = user.mind - if(!mind) - return TRUE - if(is_monkey_leader(mind) || (ismonkey(user) && is_monkey(mind))) - user.log_talk(message, LOG_SAY, tag="monkey") - if(prob(75) && ismonkey(user)) - user.visible_message(span_notice("\The [user] chimpers.")) - var/msg = "\[[is_monkey_leader(mind) ? "Monkey Leader" : "Monkey"]\] [user]: [message]" - for(var/_M in GLOB.mob_list) - var/mob/M = _M - if(M in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(M, user) - to_chat(M, "[link] [msg]") - if((is_monkey_leader(M.mind) || ismonkey(M)) && (M.mind in SSticker.mode.ape_infectees)) - to_chat(M, msg) - return FALSE - /datum/saymode/darkspawn //yogs: darkspawn key = MODE_KEY_DARKSPAWN mode = MODE_DARKSPAWN diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index aa75638c4118..c156f6916ad9 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -666,10 +666,6 @@ var/effect_cooldown = 100 var/obj/effect/temp_visual/curse/wasting_effect = new -/datum/status_effect/necropolis_curse/hivemind - id = "hivecurse" - duration = 600 - /datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse) . = ..() if(.) diff --git a/code/game/gamemodes/hivemind/hivemind.dm b/code/game/gamemodes/hivemind/hivemind.dm deleted file mode 100644 index d7bece03901d..000000000000 --- a/code/game/gamemodes/hivemind/hivemind.dm +++ /dev/null @@ -1,107 +0,0 @@ -/datum/game_mode/hivemind - name = "Assimilation" - config_tag = "hivemind" - report_type = "hivemind" - antag_flag = ROLE_HIVE - false_report_weight = 5 - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Brig Physician") //Yogs: Added "Brig Physician - restricted_jobs = list("Cyborg","AI", "Synthetic") - required_players = 24 - required_enemies = 2 - recommended_enemies = 3 - reroll_friendly = 1 - enemy_minimum_age = 0 - - announce_span = "danger" - announce_text = "The hosts of several psionic hiveminds have infiltrated the station and are looking to assimilate the crew!\n\ - Hosts: Expand your hivemind and complete your objectives at all costs!\n\ - Crew: Prevent the hosts from getting into your mind!" - - var/list/hosts = list() - -/proc/is_hivehost(mob/living/M) - if(!M || !M.mind) - return - return M.mind.has_antag_datum(/datum/antagonist/hivemind) - -/mob/living/proc/is_real_hivehost() //This proc ignores mind controlled vessels - for(var/datum/antagonist/hivemind/hive in GLOB.antagonists) - if(!hive.owner?.current?.actions) - continue - var/datum/action/cooldown/spell/aoe/target_hive/hive_control/the_spell = locate(/datum/action/cooldown/spell/aoe/target_hive/hive_control) in hive.owner.current.actions - if((!the_spell || !the_spell.active ) && mind == hive.owner) - return TRUE - if(the_spell?.active && the_spell.original_body == src) - return TRUE - return FALSE - -/mob/living/proc/get_real_hivehost() //Returns src unless it's under mind control, then it returns the original body - var/mob/living/M = src - if(!M) - return - if(!is_hivehost(M) || is_real_hivehost(M)) - return M - var/datum/action/cooldown/spell/aoe/target_hive/hive_control/the_spell = locate(/datum/action/cooldown/spell/aoe/target_hive/hive_control) in M.actions - if(the_spell?.active) - return the_spell.original_body - return M - -/proc/is_hivemember(mob/living/L) - if(!L) - return FALSE - var/datum/mind/M = L.mind - if(!M) - return FALSE - for(var/datum/antagonist/hivemind/H in GLOB.antagonists) - if(H.hivemembers.Find(M)) - return TRUE - return FALSE - -/proc/remove_hivemember(mob/living/L) //Removes somebody from all hives as opposed to the antag proc remove_from_hive() - var/datum/mind/M = L?.mind - if(!M) - return - for(var/datum/antagonist/hivemind/H in GLOB.antagonists) - if(H.hivemembers.Find(M)) - H.hivemembers -= M - H.calc_size() - var/datum/antagonist/hivevessel/V = L.is_wokevessel() - if(V && M) - M.remove_antag_datum(/datum/antagonist/hivevessel) - -/datum/game_mode/hivemind/pre_setup() - - if(CONFIG_GET(flag/protect_roles_from_antagonist)) - restricted_jobs += protected_jobs - - if(CONFIG_GET(flag/protect_assistant_from_antagonist)) - restricted_jobs += "Assistant" - - var/num_hosts = max( 1 , rand(0,1) + min(8, round(num_players() / 8) ) ) //1 host for every 8 players up to 64, with a 50% chance of an extra - - for(var/j = 0, j < num_hosts, j++) - if (!antag_candidates.len) - break - var/datum/mind/host = antag_pick(antag_candidates) - hosts += host - host.special_role = ROLE_HIVE - host.restricted_roles = restricted_jobs - log_game("[key_name(host)] has been selected as a hivemind host") - antag_candidates.Remove(host) - - if(hosts.len < required_enemies) - setup_error = "Not enough host candidates" - return FALSE - else - return TRUE - - -/datum/game_mode/hivemind/post_setup() - for(var/datum/mind/i in hosts) - i.add_antag_datum(/datum/antagonist/hivemind) - return ..() - -/datum/game_mode/hivemind/generate_report() - return "Reports of psychic activity have been showing up in this sector, and we believe this may have to do with a containment breach on \[REDACTED\] last month \ - when a sapient hive intelligence displaying paranormal powers escaped into the unknown. They present a very large risk as they can assimilate people into \ - the hivemind with ease, although they appear unable to affect mindshielded personnel." diff --git a/code/game/gamemodes/hivemind/objectives.dm b/code/game/gamemodes/hivemind/objectives.dm deleted file mode 100644 index 00c0245e4071..000000000000 --- a/code/game/gamemodes/hivemind/objectives.dm +++ /dev/null @@ -1,59 +0,0 @@ -/datum/objective/hivemind - -/datum/objective/hivemind/hivesize - explanation_text = "This is a bug. Error:HIVE2" - target_amount = 10 - -/datum/objective/hivemind/hivesize/New() - target_amount = ( max(8, round(GLOB.joined_player_list.len/3)) + rand(0,3) ) - update_explanation_text() - -/datum/objective/hivemind/hivesize/update_explanation_text() - explanation_text = "End the round with at least [target_amount] beings assimilated into the hive." - -/datum/objective/hivemind/hivesize/check_completion() - if(..()) - return TRUE - var/datum/antagonist/hivemind/host = owner.has_antag_datum(/datum/antagonist/hivemind) - if(!host) - return FALSE - return host.hive_size >= target_amount - -/datum/objective/hivemind/hiveescape - explanation_text = "This is a bug. Error:HIVE2" - target_amount = 10 - -/datum/objective/hivemind/hiveescape/New() - target_amount = ( max(5, round(GLOB.joined_player_list.len/6)) + rand(0,2) ) - update_explanation_text() - -/datum/objective/hivemind/hiveescape/update_explanation_text() - explanation_text = "Have at least [target_amount] members of the hive escape on the shuttle alive and free." - -/datum/objective/hivemind/hiveescape/check_completion() - if(..()) - return TRUE - var/count = 0 - var/datum/antagonist/hivemind/host = owner.has_antag_datum(/datum/antagonist/hivemind) - if(!host) - return FALSE - for(var/datum/mind/M in host.hivemembers) - if(considered_escaped(M)) - count++ - return count >= target_amount - -/datum/objective/hivemind/biggest - explanation_text = "End the round with more vessels than any other hivemind host." - -/datum/objective/hivemind/biggest/check_completion() - if(..()) - return TRUE - var/datum/antagonist/hivemind/host = owner.has_antag_datum(/datum/antagonist/hivemind) - if(!host) - return FALSE - for(var/datum/antagonist/hivemind/H in GLOB.antagonists) - if(H == host) - continue - if(H.hive_size >= host.hive_size) - return FALSE - return TRUE diff --git a/code/game/gamemodes/hivemind/radar.dm b/code/game/gamemodes/hivemind/radar.dm deleted file mode 100644 index 6774116db7ef..000000000000 --- a/code/game/gamemodes/hivemind/radar.dm +++ /dev/null @@ -1,74 +0,0 @@ -#define HIVEMIND_RADAR_MIN_DISTANCE 0 //Very generous, as the targets are only tracked for a few minutes. -#define HIVEMIND_RADAR_MAX_DISTANCE 50 -#define HIVEMIND_RADAR_PING_TIME 40 //4s update time. - -//Modified IA/changeling pinpointer, points to the nearest person who is afflicted with the hive tracker status effect -/datum/status_effect/agent_pinpointer/hivemind - id = "hive_pinpointer" - alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer/hivemind - minimum_range = HIVEMIND_RADAR_MIN_DISTANCE - tick_interval = HIVEMIND_RADAR_PING_TIME - range_fuzz_factor = 0 - -/datum/status_effect/agent_pinpointer/hivemind/point_to_target() //If we found what we're looking for, show the distance and direction - if(scan_target) - if(owner.mind) - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(hive) - range_far = range_mid * (2-hive.get_threat_multiplier()) - if(scan_target.mind) - var/datum/antagonist/hivemind/enemy_hive = scan_target.mind.has_antag_datum(/datum/antagonist/hivemind) - if(enemy_hive) - range_far = max(range_mid * (1+enemy_hive.get_threat_multiplier()), range_far) - - ..() - -/datum/status_effect/agent_pinpointer/hivemind/scan_for_target() - var/turf/my_loc = get_turf(owner) - - var/list/mob/living/carbon/targets = list() - var/trackable_targets_exist = FALSE - - for(var/mob/living/carbon/C in GLOB.alive_mob_list) - if(C == owner) - continue - var/datum/status_effect/hive_track/mark = C.has_status_effect(STATUS_EFFECT_HIVE_TRACKER) - if(mark && mark.tracked_by == owner) - trackable_targets_exist = TRUE - var/their_loc = get_turf(C) - var/distance = get_dist_euclidian(my_loc, their_loc) - if (distance < HIVEMIND_RADAR_MAX_DISTANCE) - var/multiplier = 0.5 - if(C.mind) - var/datum/antagonist/hivemind/hive = C.mind.has_antag_datum(/datum/antagonist/hivemind) - if(hive) - multiplier = hive.get_threat_multiplier() - targets[C] = ((HIVEMIND_RADAR_MAX_DISTANCE ** 2) - (distance ** 2)) * multiplier - - if(targets.len) - scan_target = pickweight(targets) //Point at a 'random' target, biasing heavily towards closer ones. - else - scan_target = null - if(!trackable_targets_exist) - to_chat(owner, span_assimilator("The psychic energies emanating from afar have died down... for now")) - owner.remove_status_effect(STATUS_EFFECT_HIVE_RADAR) - -//"Trackable" status effect -/datum/status_effect/hive_track - id = "hive_track" - duration = 1200 - status_type = STATUS_EFFECT_MULTIPLE - alert_type = null - var/mob/living/tracked_by - -/datum/status_effect/hive_track/on_creation(mob/living/new_owner, mob/living/hunter, set_duration) - . = ..() - if(.) - tracked_by = hunter - if(isnum(set_duration)) - duration = world.time + set_duration - -//Screen alert -/atom/movable/screen/alert/status_effect/agent_pinpointer/hivemind - name = "Psychic link" - desc = "Somebody is there, and they're definitely not friendly." diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm deleted file mode 100644 index 87721fce5055..000000000000 --- a/code/game/gamemodes/monkey/monkey.dm +++ /dev/null @@ -1,132 +0,0 @@ -/datum/game_mode - var/list/ape_infectees = list() - var/list/ape_leaders = list() - -/datum/game_mode/monkey - name = "monkey" - config_tag = "monkey" - report_type = "monkey" - antag_flag = ROLE_MONKEY - false_report_weight = 1 - - required_players = 20 - required_enemies = 1 - recommended_enemies = 1 - - restricted_jobs = list("Cyborg", "AI", "Synthetic") - - announce_span = "Monkey" - announce_text = "One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to CentCom. Monkeys: Ensure that your kind lives on! Rise up against your captors!" - - var/carriers_to_make = 1 - var/list/carriers = list() - - var/monkeys_to_win = 1 - var/escaped_monkeys = 0 - - var/players_per_carrier = 30 - - var/datum/team/monkey/monkey_team - - - -/datum/game_mode/monkey/pre_setup() - carriers_to_make = max(round(num_players()/players_per_carrier, 1), 1) - - for(var/j = 0, j < carriers_to_make, j++) - if (!antag_candidates.len) - break - var/datum/mind/carrier = pick(antag_candidates) - carriers += carrier - carrier.special_role = "Monkey Leader" - carrier.restricted_roles = restricted_jobs - //log_game("[key_name(carrier)] has been selected as a Jungle Fever carrier") | yogs - redundant - antag_candidates -= carrier - - if(!carriers.len) - setup_error = "No monkey candidates" - return FALSE - return TRUE - -/datum/game_mode/monkey/post_setup() - for(var/datum/mind/carriermind in carriers) - var/datum/antagonist/monkey/M = add_monkey_leader(carriermind, monkey_team) - if(M) - monkey_team = M.monkey_team - return ..() - -/datum/game_mode/monkey/check_finished() - if((SSshuttle.emergency.mode == SHUTTLE_ENDGAME) || station_was_nuked) - return TRUE - - if(!round_converted) - for(var/datum/mind/monkey_mind in ape_infectees) - continuous_sanity_checked = TRUE - if(monkey_mind.current && monkey_mind.current.stat != DEAD) - return FALSE - - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() //ugly but unfortunately needed - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(!is_station_level(H.z)) - continue - if(H.mind && H.client && H.stat != DEAD) - if(H.HasDisease(D)) - return FALSE - - return ..() - -/datum/game_mode/monkey/proc/check_monkey_victory() - if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) - return FALSE - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if (M.HasDisease(D)) - if(M.onCentCom() || M.onSyndieBase()) - escaped_monkeys++ - if(escaped_monkeys >= monkeys_to_win) - return TRUE - else - return FALSE - - -/datum/game_mode/monkey/set_round_result() - ..() - if(check_monkey_victory()) - SSticker.mode_result = "win - monkey win" - else - SSticker.mode_result = "loss - staff stopped the monkeys" - -/datum/game_mode/monkey/special_report() - if(check_monkey_victory()) - return "The monkeys have overthrown their captors! Eeek eeeek!!" - else - return "The staff managed to contain the monkey infestation!" - -/datum/game_mode/monkey/generate_report() - return "Reports of an ancient [pick("retrovirus", "flesh eating bacteria", "disease", "magical curse blamed on viruses", "banana blight")] outbreak that turn humans into monkeys has been reported in your quadrant. Any such infections may be treated with banana juice. If an outbreak occurs, ensure the station is quarantined to prevent a largescale outbreak at CentCom." - -/proc/add_monkey_leader(datum/mind/monkey_mind) - if(is_monkey_leader(monkey_mind)) - return FALSE - var/datum/antagonist/monkey/leader/M = monkey_mind.add_antag_datum(/datum/antagonist/monkey/leader) - return M - -/proc/add_monkey(datum/mind/monkey_mind) - if(is_monkey(monkey_mind)) - return FALSE - var/datum/antagonist/monkey/M = monkey_mind.add_antag_datum(/datum/antagonist/monkey) - return M - -/proc/remove_monkey(datum/mind/monkey_mind) - if(!is_monkey(monkey_mind)) - return FALSE - var/datum/antagonist/monkey/M = monkey_mind.has_antag_datum(/datum/antagonist/monkey) - M.on_removal() - return TRUE - -/proc/is_monkey_leader(datum/mind/monkey_mind) - return monkey_mind && monkey_mind.has_antag_datum(/datum/antagonist/monkey/leader) - -/proc/is_monkey(datum/mind/monkey_mind) - return monkey_mind && (monkey_mind.has_antag_datum(/datum/antagonist/monkey) || is_monkey_leader(monkey_mind)) - diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 2d480ad6fb72..ddc09436ff61 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -284,7 +284,6 @@ GLOBAL_VAR_INIT(clones, 0) if(H) H.faction |= factions - remove_hivemember(H) for(var/V in quirks) var/datum/quirk/Q = new V(H) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 2785da73c02d..6f154dc99a6a 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -330,12 +330,6 @@ temp = "number" else if(is_alpha(drawing)) temp = "letter" - var/gang_check = hippie_gang_check(user,target) // yogs start -- gang check and temp setting - if(!gang_check) - return - //else if(gang_check == "gang graffiti") - // temp = gang_check // yogs end - var/graf_rot if(drawing in oriented) @@ -367,8 +361,6 @@ var/wait_time = 50 if(paint_mode == PAINT_LARGE_HORIZONTAL) wait_time *= 3 - if(gang) //yogs - instant = FALSE // yogs -- gang spraying must not be instant, balance reasons if(!instant) if(!do_after(user, 5 SECONDS, target)) return @@ -384,11 +376,6 @@ var/list/turf/affected_turfs = list() - if(gang) // yogs start -- gang spraying is done differently - if(gang_final(user, target, affected_turfs)) - return - actually_paints = FALSE // skip the next if check - // yogs end if(actually_paints) switch(paint_mode) if(PAINT_NORMAL) diff --git a/code/game/objects/items/implants/implant_mindshield.dm b/code/game/objects/items/implants/implant_mindshield.dm index 440ae58340f8..4b214e275a14 100644 --- a/code/game/objects/items/implants/implant_mindshield.dm +++ b/code/game/objects/items/implants/implant_mindshield.dm @@ -26,20 +26,12 @@ if(target.mind.has_antag_datum(/datum/antagonist/brainwashed)) target.mind.remove_antag_datum(/datum/antagonist/brainwashed) - var/datum/antagonist/hivemind/host = target.mind.has_antag_datum(/datum/antagonist/hivemind) //Releases the target from mind control beforehand - if(host) - var/datum/mind/M = host.owner - if(M) - var/datum/action/cooldown/spell/aoe/target_hive/hive_control/the_spell = locate(/datum/action/cooldown/spell/aoe/target_hive/hive_control) in M.current.actions - if(the_spell && the_spell.active) - the_spell.release_control() - - if(target.mind.has_antag_datum(/datum/antagonist/rev/head) || target.mind.has_antag_datum(/datum/antagonist/hivemind) || target.mind.unconvertable) + if(target.mind.has_antag_datum(/datum/antagonist/rev/head) || target.mind.unconvertable) if(!silent) target.visible_message(span_warning("[target] seems to resist the implant!"), span_warning("You feel something interfering with your mental conditioning, but you resist it!")) removed(target, TRUE) return FALSE - if(target.mind.has_antag_datum(/datum/antagonist/gang/boss) || target.mind.has_antag_datum(/datum/antagonist/mindslave)) + if(target.mind.has_antag_datum(/datum/antagonist/mindslave)) if(!silent) target.visible_message(span_warning("[target] seems to resist the implant!"), span_warning("You feel something interfering with your mental conditioning, but you resist it!")) removed(target, TRUE) @@ -53,30 +45,9 @@ return FALSE target.mind.remove_antag_datum(/datum/antagonist/vassal) - var/datum/antagonist/hivevessel/woke = target.is_wokevessel() - if(is_hivemember(target)) - for(var/datum/antagonist/hivemind/hive in GLOB.antagonists) - if(hive.hivemembers.Find(target)) - var/mob/living/carbon/C = hive.owner.current.get_real_hivehost() - if(C) - C.apply_status_effect(STATUS_EFFECT_HIVE_TRACKER, target, woke?TRACKER_AWAKENED_TIME:TRACKER_MINDSHIELD_TIME) - target.apply_status_effect(STATUS_EFFECT_HIVE_TRACKER, C, TRACKER_DEFAULT_TIME) - if(C.mind) //If you were using mind control, too bad - C.apply_status_effect(STATUS_EFFECT_HIVE_RADAR) - to_chat(C, span_assimilator("We detect a surge of psionic energy from a far away vessel before they disappear from the hive. Whatever happened, there's a good chance they're after us now.")) - to_chat(target, span_assimilator("You hear supernatural wailing echo throughout your mind as you are finally set free. Deep down, you can feel the lingering presence of those who enslaved you... as can they!")) - target.apply_status_effect(STATUS_EFFECT_HIVE_RADAR) - remove_hivemember(target) - - if(woke) - woke.one_mind.remove_member(target.mind) - target.mind.remove_antag_datum(/datum/antagonist/hivevessel) - var/datum/antagonist/rev/rev = target.mind.has_antag_datum(/datum/antagonist/rev) if(rev) rev.remove_revolutionary(FALSE, user) - if(target.mind.has_antag_datum(/datum/antagonist/gang)) - target.mind.remove_antag_datum(/datum/antagonist/gang) if(!silent) if(target.mind in SSticker.mode.cult) to_chat(target, span_warning("You feel something interfering with your mental conditioning, but you resist it!")) diff --git a/code/game/objects/items/implants/implant_mindshieldtot.dm b/code/game/objects/items/implants/implant_mindshieldtot.dm index ff0ae38108bf..e0066549cfe2 100644 --- a/code/game/objects/items/implants/implant_mindshieldtot.dm +++ b/code/game/objects/items/implants/implant_mindshieldtot.dm @@ -25,49 +25,16 @@ if(target.mind.has_antag_datum(/datum/antagonist/brainwashed)) target.mind.remove_antag_datum(/datum/antagonist/brainwashed) - var/datum/antagonist/hivemind/host = target.mind.has_antag_datum(/datum/antagonist/hivemind) //Releases the target from mind control beforehand - if(host) - var/datum/mind/M = host.owner - if(M) - var/datum/action/cooldown/spell/aoe/target_hive/hive_control/the_spell = locate(/datum/action/cooldown/spell/aoe/target_hive/hive_control) in M.current.actions - if(the_spell && the_spell.active) - the_spell.release_control() - - if(target.mind.has_antag_datum(/datum/antagonist/rev/head) || target.mind.has_antag_datum(/datum/antagonist/hivemind) || target.mind.unconvertable) + if(target.mind.has_antag_datum(/datum/antagonist/rev/head) || target.mind.unconvertable) if(!silent) target.visible_message(span_warning("[target] seems to resist the implant!"), span_warning("You feel something interfering with your mental conditioning, but you resist it!")) removed(target, 1) qdel(src) return FALSE - var/datum/antagonist/hivevessel/woke = target.is_wokevessel() - if(is_hivemember(target)) - for(var/datum/antagonist/hivemind/hive in GLOB.antagonists) - if(hive.hivemembers.Find(target)) - var/mob/living/carbon/C = hive.owner.current.get_real_hivehost() - if(C) - C.apply_status_effect(STATUS_EFFECT_HIVE_TRACKER, target, woke?TRACKER_AWAKENED_TIME:TRACKER_MINDSHIELD_TIME) - target.apply_status_effect(STATUS_EFFECT_HIVE_TRACKER, C, TRACKER_DEFAULT_TIME) - if(C.mind) //If you were using mind control, too bad - C.apply_status_effect(STATUS_EFFECT_HIVE_RADAR) - to_chat(C, span_assimilator("We detect a surge of psionic energy from a far away vessel before they disappear from the hive. Whatever happened, there's a good chance they're after us now.")) - to_chat(target, span_assimilator("You hear supernatural wailing echo throughout your mind as you are finally set free. Deep down, you can feel the lingering presence of those who enslaved you... as can they!")) - target.apply_status_effect(STATUS_EFFECT_HIVE_RADAR) - remove_hivemember(target) - - if(woke) - woke.one_mind.remove_member(target.mind) - target.mind.remove_antag_datum(/datum/antagonist/hivevessel) - var/datum/antagonist/rev/rev = target.mind.has_antag_datum(/datum/antagonist/rev) if(rev) rev.remove_revolutionary(FALSE, user) - if(target.mind.has_antag_datum(/datum/antagonist/gang/boss)) - if(!silent) - target.visible_message(span_warning("[target] seems to resist the implant!"), span_warning("You feel something interfering with your mental conditioning, but you resist it!")) - return FALSE - if(target.mind.has_antag_datum(/datum/antagonist/gang)) - target.mind.remove_antag_datum(/datum/antagonist/gang) if(!silent) if(target.mind in SSticker.mode.cult) to_chat(target, span_warning("You feel something interfering with your mental conditioning, but you resist it!")) diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm index 2d2ffef95445..4579da137a3c 100644 --- a/code/modules/admin/sql_ban_system.dm +++ b/code/modules/admin/sql_ban_system.dm @@ -296,10 +296,10 @@ "Antagonist Positions" = list(ROLE_ABDUCTOR, ROLE_ALIEN, ROLE_BLOB, ROLE_BLOODSUCKER, ROLE_BROTHER, ROLE_CHANGELING, ROLE_CULTIST, ROLE_DEVIL, ROLE_FUGITIVE, ROLE_HOLOPARASITE, ROLE_INTERNAL_AFFAIRS, ROLE_MALF, - ROLE_MONKEY, ROLE_MONSTERHUNTER, ROLE_NINJA, ROLE_OPERATIVE, + ROLE_MONSTERHUNTER, ROLE_NINJA, ROLE_OPERATIVE, ROLE_REV, ROLE_REVENANT, ROLE_SINFULDEMON, ROLE_REV_HEAD, ROLE_SERVANT_OF_RATVAR, ROLE_SYNDICATE, - ROLE_TRAITOR, ROLE_WIZARD, ROLE_GANG, ROLE_VAMPIRE, + ROLE_TRAITOR, ROLE_WIZARD, ROLE_VAMPIRE, ROLE_DARKSPAWN, ROLE_ZOMBIE, ROLE_HERETIC)) //ROLE_REV_HEAD is excluded from this because rev jobbans are handled by ROLE_REV for(var/department in long_job_lists) output += "
" diff --git a/code/modules/antagonists/hivemind/hivemind.dm b/code/modules/antagonists/hivemind/hivemind.dm deleted file mode 100644 index 89ed8c2378d5..000000000000 --- a/code/modules/antagonists/hivemind/hivemind.dm +++ /dev/null @@ -1,293 +0,0 @@ -/datum/antagonist/hivemind - name = "Hivemind Host" - roundend_category = "hiveminds" - antagpanel_category = "Hivemind Host" - job_rank = ROLE_HIVE - antag_hud_name = "hivemind" - antag_moodlet = /datum/mood_event/focused - var/special_role = ROLE_HIVE - var/list/hivemembers = list() - var/hive_size = 0 - var/threat_level = 0 // Part of what determines how strong the radar is, on a scale of 0 to 10 - var/track_bonus = 0 // Bonus time to your tracking abilities - var/size_mod = 0 // Bonus size for using reclaim - var/list/individual_track_bonus = list() // Bonus time to tracking individual targets - var/unlocked_one_mind = FALSE - var/datum/team/hivemind/active_one_mind - var/mutable_appearance/glow - - var/list/upgrade_tiers = list( - //Tier 1 - Roundstart powers - /datum/action/cooldown/spell/aoe/target_hive/hive_add = 0, - /datum/action/cooldown/spell/aoe/target_hive/hive_remove = 0, - /datum/action/cooldown/spell/aoe/target_hive/hive_see = 0, - /datum/action/cooldown/spell/pointed/hive_shock = 0, - /datum/action/cooldown/spell/telekinetic_hand = 0, - //Tier 2 - Tracking related powers - /datum/action/cooldown/spell/hive_scan = 5, - /datum/action/cooldown/spell/pointed/hive_reclaim = 5, - /datum/action/cooldown/spell/pointed/hive_hack = 5, - //Tier 3 - Combat related powers - /datum/action/cooldown/spell/hive_drain = 10, - /datum/action/cooldown/spell/pointed/induce_panic = 10, - /datum/action/cooldown/spell/forcewall/hive = 10, - //Tier 4 - Chaos-spreading powers - /datum/action/cooldown/spell/hive_wake = 15, - /datum/action/cooldown/spell/hive_loyal = 15, - /datum/action/cooldown/spell/aoe/target_hive/hive_control = 15, - //Tier 5 - Deadly powers - /datum/action/cooldown/spell/pointed/pin = 20, - /datum/action/cooldown/spell/aoe/target_hive/nightmare = 20 - ) - - -/datum/antagonist/hivemind/proc/calc_size() - listclearnulls(hivemembers) - var/temp = 0 - for(var/datum/mind/M in hivemembers) - if(M.current && M.current.stat != DEAD) - temp++ - if(hive_size != temp) - hive_size = temp - check_powers() - -/datum/antagonist/hivemind/proc/get_threat_multiplier() - calc_size() - return min((hive_size+size_mod*2)/50 + threat_level/20, 1) - -/datum/antagonist/hivemind/proc/get_carbon_members() - var/list/carbon_members = list() - for(var/datum/mind/M in hivemembers) - if(!M.current || !iscarbon(M.current)) - continue - carbon_members += M.current - return carbon_members - -/datum/antagonist/hivemind/proc/check_powers() - for(var/power in upgrade_tiers) - var/level = upgrade_tiers[power] - if(hive_size+size_mod >= level && !(locate(power) in owner.current.actions)) - var/datum/action/cooldown/spell/the_spell = new power(owner.current) - the_spell.Grant(owner.current) - if(hive_size > 0) - to_chat(owner, "[span_assimilator("We have unlocked [the_spell.name].")][span_bold(" [the_spell.desc]")]") - - if(!unlocked_one_mind && hive_size >= 15) - var/lead = TRUE - for(var/datum/antagonist/hivemind/enemy in GLOB.antagonists) - if(enemy == src) - continue - if(!enemy.active_one_mind && enemy.hive_size <= hive_size + size_mod - 20) - continue - lead = FALSE - break - if(lead) - unlocked_one_mind = TRUE - var/datum/action/cooldown/spell/one_mind/one_mind = new(owner.current) - one_mind.Grant(owner.current) - - to_chat(owner, "[span_assimilator("Our true power, the One Mind, is finally within reach.")]") - -/datum/antagonist/hivemind/proc/add_track_bonus(datum/antagonist/hivemind/enemy, bonus) - if(!individual_track_bonus[enemy]) - individual_track_bonus[enemy] = bonus - else - individual_track_bonus[enemy] += bonus - -/datum/antagonist/hivemind/proc/get_track_bonus(datum/antagonist/hivemind/enemy) - if(!individual_track_bonus[enemy]) - . = 0 - else - . = individual_track_bonus[enemy] - . += (TRACKER_DEFAULT_TIME + track_bonus) - -/datum/antagonist/hivemind/proc/add_to_hive(mob/living/carbon/C) - if(!C) - return - var/datum/mind/M = C.mind - if(M) - hivemembers |= M - calc_size() - - var/user_warning = span_userdanger("We have detected an enemy hivemind using our physical form as a vessel and have begun ejecting their mind! They will be alerted of our disappearance once we succeed!") - if(C.is_real_hivehost()) - var/eject_time = rand(1400,1600) //2.5 minutes +- 10 seconds - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, user_warning), rand(500,1300)) // If the host has assimilated an enemy hive host, alert the enemy before booting them from the hive after a short while - addtimer(CALLBACK(src, PROC_REF(handle_ejection), C), eject_time) - else if(active_one_mind) - C.hive_awaken(final_form=active_one_mind) - -/datum/antagonist/hivemind/proc/is_carbon_member(mob/living/carbon/C) - if(!hivemembers || !C || !iscarbon(C)) - return FALSE - var/datum/mind/M = C.mind - if(!M || !hivemembers.Find(M)) - return FALSE - return TRUE - -/datum/antagonist/hivemind/proc/remove_from_hive(mob/living/carbon/C) - var/datum/mind/M = C.mind - if(M) - hivemembers -= M - calc_size() - if(active_one_mind) - var/datum/antagonist/hivevessel/V = C.is_wokevessel() - if(V) - M.remove_antag_datum(/datum/antagonist/hivevessel) - -/datum/antagonist/hivemind/proc/handle_ejection(mob/living/carbon/C) - var/user_warning = "The enemy host has been ejected from our mind" - if(!C || !owner) - return - var/mob/living/carbon/C2 = owner.current - if(!C2) - return - - var/mob/living/real_C = C.get_real_hivehost() - var/mob/living/real_C2 = C2.get_real_hivehost() - var/datum/antagonist/hivemind/hive_C - var/datum/antagonist/hivemind/hive_C2 - if(real_C.mind) - hive_C = real_C.mind.has_antag_datum(/datum/antagonist/hivemind) - if(real_C2.mind) - hive_C2 = real_C2.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive_C || !hive_C2) - return - if(C == real_C) //Mind control check - real_C2.apply_status_effect(STATUS_EFFECT_HIVE_TRACKER, real_C, hive_C.get_track_bonus(hive_C2)) - real_C.apply_status_effect(STATUS_EFFECT_HIVE_RADAR) - to_chat(real_C2, span_assimilator("We detect a surge of psionic energy from a far away vessel before they disappear from the hive. Whatever happened, there's a good chance they're after us now.")) - if(C2 == real_C2) - real_C.apply_status_effect(STATUS_EFFECT_HIVE_TRACKER, real_C2, hive_C2.get_track_bonus(hive_C)) - real_C2.apply_status_effect(STATUS_EFFECT_HIVE_RADAR) - user_warning += " and we've managed to pinpoint their location" - to_chat(real_C, span_userdanger("[user_warning]!")) - -/datum/antagonist/hivemind/proc/destroy_hive() - go_back_to_sleep() - hivemembers = list() - calc_size() - for(var/datum/action/power in upgrade_tiers) - if(!upgrade_tiers[power]) - continue - power.Remove(owner.current) - -/datum/antagonist/hivemind/antag_panel_data() - return "Vessels Assimilated: [hive_size] (+[size_mod])" - -/datum/antagonist/hivemind/proc/awaken() - if(!owner?.current) - return - var/mob/living/carbon/C = owner.current.get_real_hivehost() - if(!C) - return - var/datum/action/cooldown/spell/hive_comms/comms = new(owner.current) - comms.Grant(owner.current) - ADD_TRAIT(C, TRAIT_STUNIMMUNE, HIVEMIND_ONE_MIND_TRAIT) - ADD_TRAIT(C, TRAIT_SLEEPIMMUNE, HIVEMIND_ONE_MIND_TRAIT) - ADD_TRAIT(C, TRAIT_VIRUSIMMUNE, HIVEMIND_ONE_MIND_TRAIT) - ADD_TRAIT(C, TRAIT_NOLIMBDISABLE, HIVEMIND_ONE_MIND_TRAIT) - ADD_TRAIT(C, TRAIT_NOHUNGER, HIVEMIND_ONE_MIND_TRAIT) - ADD_TRAIT(C, TRAIT_NODISMEMBER, HIVEMIND_ONE_MIND_TRAIT) - log_game("[key_name(owner)] has awakened vessels.") - -/datum/antagonist/hivemind/proc/go_back_to_sleep() - if(!active_one_mind) - return - for(var/datum/mind/M in hivemembers) - M.remove_antag_datum(/datum/antagonist/hivevessel) - active_one_mind.remove_member(M) - if(!(owner?.current)) - return - var/mob/living/carbon/C = owner.current.get_real_hivehost() - if(!C) - return - for(var/datum/action/cooldown/spell/hive_comms/comms in owner.current.actions) - comms.Remove(owner.current) - REMOVE_TRAIT(C, TRAIT_STUNIMMUNE, HIVEMIND_ONE_MIND_TRAIT) - REMOVE_TRAIT(C, TRAIT_SLEEPIMMUNE, HIVEMIND_ONE_MIND_TRAIT) - REMOVE_TRAIT(C, TRAIT_VIRUSIMMUNE, HIVEMIND_ONE_MIND_TRAIT) - REMOVE_TRAIT(C, TRAIT_NOLIMBDISABLE, HIVEMIND_ONE_MIND_TRAIT) - REMOVE_TRAIT(C, TRAIT_NOHUNGER, HIVEMIND_ONE_MIND_TRAIT) - REMOVE_TRAIT(C, TRAIT_NODISMEMBER, HIVEMIND_ONE_MIND_TRAIT) - active_one_mind.Destroy() - -/datum/antagonist/hivemind/on_gain() - owner.special_role = special_role - check_powers() - forge_objectives() - ..() - -/datum/antagonist/hivemind/apply_innate_effects() - handle_clown_mutation(owner.current, "The great psionic powers of the Hive lets you overcome your clownish nature, allowing you to wield weapons with impunity.") - -/datum/antagonist/hivemind/on_removal() - //Remove all hive powers here - for(var/datum/action/power in upgrade_tiers) - power.Remove(owner.current) - - if(!silent && owner.current) - to_chat(owner.current,span_userdanger(" Your psionic powers fade, you are no longer the hivemind's host! ")) - owner.special_role = null - ..() - -/datum/antagonist/hivemind/proc/forge_objectives() - if(prob(50)) - var/datum/objective/hivemind/hivesize/size_objective = new - size_objective.owner = owner - objectives += size_objective - else if(prob(70)) - var/datum/objective/hivemind/hiveescape/hive_escape_objective = new - hive_escape_objective.owner = owner - objectives += hive_escape_objective - else - var/datum/objective/hivemind/biggest/biggest_objective = new - biggest_objective.owner = owner - objectives += biggest_objective - - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - - return - -/datum/antagonist/hivemind/greet() - to_chat(owner.current, "You are the host of a powerful Hivemind.") - to_chat(owner.current, "Your psionic powers will grow by assimilating the crew into your hive. Use the Assimilate Vessel spell on a stationary \ - target, and after ten seconds he will be one of the hive. This is completely silent and safe to use, and failing will reset the cooldown. As \ - you assimilate the crew, you will gain more powers to use. Most are silent and won't help you in a fight, but grant you great power over your \ - vessels. Hover your mouse over a power's action icon for an extended description on what it does. There are other hiveminds onboard the station, \ - collaboration is possible, but a strong enough hivemind can reap many rewards from a well planned betrayal.") - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/assimilation.ogg', 100, FALSE, pressure_affected = FALSE) - - owner.announce_objectives() - -/datum/antagonist/hivemind/roundend_report() - var/list/result = list() - - result += printplayer(owner) - result += "Hive Size: [hive_size]" - var/greentext = TRUE - if(objectives) - result += printobjectives(objectives) - for(var/datum/objective/objective in objectives) - if(!objective.check_completion()) - greentext = FALSE - break - - if(objectives.len == 0 || greentext) - result += "The [name] was successful!" - else - result += "The [name] has failed!" - - return result.Join("
") - -/datum/antagonist/hivemind/is_gamemode_hero() - return SSticker.mode.name == "Assimilation" - -/datum/antagonist/hivemind/get_preview_icon() - var/icon/hivemind_icon = icon('icons/mob/hivebot.dmi', "basic") - - hivemind_icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE) - - return hivemind_icon diff --git a/code/modules/antagonists/hivemind/vessel.dm b/code/modules/antagonists/hivemind/vessel.dm deleted file mode 100644 index 4d60e268c04d..000000000000 --- a/code/modules/antagonists/hivemind/vessel.dm +++ /dev/null @@ -1,78 +0,0 @@ -/datum/team/hivemind - name = "One Mind" - -/datum/antagonist/hivevessel - name = "Awoken Vessel" - job_rank = ROLE_BRAINWASHED - antag_hud_name = "hivevessel" - roundend_category = "awoken vessels" - show_in_antagpanel = TRUE - antagpanel_category = "Other" - show_name_in_check_antagonists = TRUE - var/datum/team/hivemind/one_mind - var/mutable_appearance/glow - -/mob/living/proc/is_wokevessel() - return mind?.has_antag_datum(/datum/antagonist/hivevessel) - -/mob/living/proc/hive_awaken(objective, datum/team/hivemind/final_form) - if(!mind) - return - var/datum/mind/M = mind - var/datum/antagonist/hivevessel/vessel = M.has_antag_datum(/datum/antagonist/hivevessel) - if(!vessel) - vessel = new() - if(final_form) - vessel.objectives = list() //Reset objectives on re-awoken vessels - if(ishuman(M.current)) - vessel.glow = mutable_appearance('icons/effects/hivemind.dmi', "awoken", -BODY_BEHIND_LAYER) - M.current.add_overlay(vessel.glow) - var/datum/action/cooldown/spell/hive_comms/comms = new(src) - comms.Grant(src) - vessel.one_mind = final_form - vessel.one_mind.add_member(M) - vessel.objectives |= vessel.one_mind.objectives - else - var/datum/objective/brainwashing/obj = new(objective) - vessel.objectives += obj - var/message = " has been awoken with the following objectives: [objective]." - deadchat_broadcast(message, "[M]", follow_target = M, turf_target = get_turf(M), message_type=DEADCHAT_REGULAR) - log_game("[key_name(M)] has been awoken with the following objectives: [objective]") - if(!M.has_antag_datum(/datum/antagonist/hivevessel)) - M.add_antag_datum(vessel) - -/datum/antagonist/hivevessel/apply_innate_effects() - handle_clown_mutation(owner.current, "Our newfound powers allow us to overcome our clownish nature, allowing us to wield weapons with impunity.") - -/datum/antagonist/hivevessel/greet() - to_chat(owner, span_assimilator("Your mind is suddenly opened, as you see the pinnacle of evolution...")) - to_chat(owner, "Follow your objectives, at any cost!") - var/i = 1 - for(var/X in objectives) - var/datum/objective/O = X - to_chat(owner, "[i]. [O.explanation_text]") - i++ - -/datum/antagonist/hivevessel/on_removal() - if(owner?.current && glow) - owner.current.cut_overlay(glow) - if(one_mind && owner) - one_mind.remove_member(owner) - ..() - -/datum/antagonist/hivevessel/farewell() - to_chat(owner, span_assimilator("Your mind closes up once more...")) - to_chat(owner, "You feel the weight of your objectives disappear! You no longer have to obey them.") - -/datum/antagonist/hivevessel/roundend_report() - if(!owner) - CRASH("antagonist datum without owner") - - if(one_mind) - return printplayer(owner) - - var/list/report = list() - report += printplayer(owner) - if(objectives.len) - report += printobjectives(objectives) - return report.Join("
") diff --git a/code/modules/antagonists/monkey/monkey.dm b/code/modules/antagonists/monkey/monkey.dm deleted file mode 100644 index 50753c76cb9f..000000000000 --- a/code/modules/antagonists/monkey/monkey.dm +++ /dev/null @@ -1,214 +0,0 @@ -#define MONKEYS_ESCAPED 1 -#define MONKEYS_LIVED 2 -#define MONKEYS_DIED 3 -#define DISEASE_LIVED 4 - -/datum/antagonist/monkey - name = "Monkey" - job_rank = ROLE_MONKEY - roundend_category = "monkeys" - antagpanel_category = "Monkey" - show_to_ghosts = TRUE - var/datum/team/monkey/monkey_team - var/monkey_only = TRUE - -/datum/antagonist/monkey/can_be_owned(datum/mind/new_owner) - return ..() && (!monkey_only || ismonkey(new_owner.current)) - -/datum/antagonist/monkey/get_team() - return monkey_team - -/datum/antagonist/monkey/get_preview_icon() - // Creating a *real* monkey is fairly involved before atoms init. - var/icon/icon = icon('icons/mob/monkey.dmi', "monkey1") - - icon.Crop(4, 9, 28, 33) - icon.Scale(ANTAGONIST_PREVIEW_ICON_SIZE, ANTAGONIST_PREVIEW_ICON_SIZE) - icon.Shift(SOUTH, 10) - - return icon - -/datum/antagonist/monkey/on_gain() - . = ..() - SSticker.mode.ape_infectees += owner - owner.special_role = "Infected Monkey" - - var/datum/disease/D = new /datum/disease/transformation/jungle_fever/monkeymode - if(!owner.current.HasDisease(D)) - owner.current.ForceContractDisease(D) - else - QDEL_NULL(D) - -/datum/antagonist/monkey/greet() - to_chat(owner, "You are a monkey now!") - to_chat(owner, "Bite humans to infect them, follow the orders of the monkey leaders, and help fellow monkeys!") - to_chat(owner, "Ensure at least one infected monkey escapes on the Emergency Shuttle!") - to_chat(owner, "As an intelligent monkey, you know how to use technology and how to ventcrawl while wearing things.") - to_chat(owner, "You can use :k to talk to fellow monkeys!") - SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) - -/datum/antagonist/monkey/on_removal() - owner.special_role = null - SSticker.mode.ape_infectees -= owner - - var/datum/disease/transformation/jungle_fever/D = locate() in owner.current.diseases - if(D) - qdel(D) - - . = ..() - -/datum/antagonist/monkey/create_team(datum/team/monkey/new_team) - if(!new_team) - for(var/datum/antagonist/monkey/H in GLOB.antagonists) - if(!H.owner) - continue - if(H.monkey_team) - monkey_team = H.monkey_team - return - monkey_team = new /datum/team/monkey - monkey_team.update_objectives() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - monkey_team = new_team - -/datum/antagonist/monkey/admin_remove(mob/admin) - var/mob/living/carbon/human/M = owner.current - if(ismonkey(M)) - var/admin_response = tgui_alert(admin, "Humanize?", "Humanize", list("Yes", "No")) - if(admin_response != "Yes") - return ..() - if(admin == M) - admin = M.humanize(TR_KEEPITEMS|TR_KEEPIMPLANTS|TR_KEEPORGANS|TR_KEEPDAMAGE|TR_KEEPVIRUS|TR_KEEPSTUNS|TR_KEEPREAGENTS|TR_DEFAULTMSG) - else - M.humanize(TR_KEEPITEMS|TR_KEEPIMPLANTS|TR_KEEPORGANS|TR_KEEPDAMAGE|TR_KEEPVIRUS|TR_KEEPSTUNS|TR_KEEPREAGENTS|TR_DEFAULTMSG) - return ..() - -/datum/antagonist/monkey/leader - name = "Monkey Leader" - monkey_only = FALSE - -/datum/antagonist/monkey/leader/admin_add(datum/mind/new_owner,mob/admin) - var/mob/living/carbon/human/H = new_owner.current - if(istype(H)) - var/admin_response = tgui_alert(admin, "Monkeyize?", "Monkeyize", list("Yes", "No")) - if(admin_response != "Yes") - return ..() - if(admin == H) - admin = H.monkeyize() - else - H.monkeyize() - return ..() - -/datum/antagonist/monkey/leader/on_gain() - . = ..() - var/obj/item/organ/heart/freedom/F = new - F.Insert(owner.current, drop_if_replaced = FALSE) - SSticker.mode.ape_leaders += owner - owner.special_role = "Monkey Leader" - -/datum/antagonist/monkey/leader/on_removal() - SSticker.mode.ape_leaders -= owner - var/obj/item/organ/heart/H = new - H.Insert(owner.current, drop_if_replaced = FALSE) //replace freedom heart with normal heart - - . = ..() - -/datum/antagonist/monkey/leader/greet() - to_chat(owner, "You are the Jungle Fever patient zero!!") - to_chat(owner, "You have been planted onto this station by the Animal Rights Consortium.") - to_chat(owner, "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.") - to_chat(owner, "While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.") - to_chat(owner, "Your mission will be deemed a success if any of the live infected monkeys reach CentCom.") - to_chat(owner, "As an initial infectee, you will be considered a 'leader' by your fellow monkeys.") - to_chat(owner, "You can use :k to talk to fellow monkeys!") - SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) - -/datum/objective/monkey - explanation_text = "Ensure that infected monkeys escape on the emergency shuttle!" - martyr_compatible = TRUE - var/monkeys_to_win = 1 - var/escaped_monkeys = 0 - -/datum/objective/monkey/check_completion() - if(..()) - return TRUE - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if (M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - escaped_monkeys++ - if(escaped_monkeys >= monkeys_to_win) - return TRUE - return FALSE - -/datum/team/monkey - name = "Monkeys" - -/datum/team/monkey/proc/update_objectives() - objectives = list() - var/datum/objective/monkey/O = new() - O.team = src - objectives += O - -/datum/team/monkey/proc/infected_monkeys_alive() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if(M.HasDisease(D)) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_monkeys_escaped() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) - if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_humans_escaped() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/human/M in GLOB.alive_mob_list) - if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) - return TRUE - return FALSE - -/datum/team/monkey/proc/infected_humans_alive() - var/datum/disease/D = new /datum/disease/transformation/jungle_fever() - for(var/mob/living/carbon/human/M in GLOB.alive_mob_list) - if(M.HasDisease(D)) - return TRUE - return FALSE - -/datum/team/monkey/proc/get_result() - if(infected_monkeys_escaped()) - return MONKEYS_ESCAPED - if(infected_monkeys_alive()) - return MONKEYS_LIVED - if(infected_humans_alive() || infected_humans_escaped()) - return DISEASE_LIVED - return MONKEYS_DIED - -/datum/team/monkey/roundend_report() - var/list/parts = list() - switch(get_result()) - if(MONKEYS_ESCAPED) - parts += "Monkey Major Victory!" - parts += span_greentext("Central Command and [station_name()] were taken over by the monkeys! Ook ook!") - if(MONKEYS_LIVED) - parts += "Monkey Minor Victory!" - parts += span_greentext("[station_name()] was taken over by the monkeys! Ook ook!") - if(DISEASE_LIVED) - parts += "Monkey Minor Defeat!" - parts += span_redtext("All the monkeys died, but the disease lives on! The future is uncertain.") - if(MONKEYS_DIED) - parts += "Monkey Major Defeat!" - parts += span_redtext("All the monkeys died, and Jungle Fever was wiped out!") - var/list/leaders = get_antag_minds(/datum/antagonist/monkey/leader, TRUE) - var/list/monkeys = get_antag_minds(/datum/antagonist/monkey, TRUE) - - if(LAZYLEN(leaders)) - parts += span_header("The monkey leaders were:") - parts += printplayerlist(SSticker.mode.ape_leaders) - if(LAZYLEN(monkeys)) - parts += span_header("The monkeys were:") - parts += printplayerlist(SSticker.mode.ape_infectees) - return "
[parts.Join("
")]
" diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 364a31ad4603..410037ff5f7d 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -88,12 +88,7 @@ log_game("[key_name(src)] has died (BRUTE: [src.getBruteLoss()], BURN: [src.getFireLoss()], TOX: [src.getToxLoss()], OXY: [src.getOxyLoss()], CLONE: [src.getCloneLoss()]) ([AREACOORD(src)])") if(is_devil(src)) INVOKE_ASYNC(is_devil(src), TYPE_PROC_REF(/datum/antagonist/devil, beginResurrectionCheck), src) - if(is_hivemember(src)) - remove_hivemember(src) - if(is_hivehost(src)) - var/datum/antagonist/hivemind/hive = mind.has_antag_datum(/datum/antagonist/hivemind) - hive.destroy_hive() - + if(client) SSachievements.unlock_achievement(/datum/achievement/death, client) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6d4a46637004..fc80846a6d6b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -91,11 +91,6 @@ . += "Cloaker Charge: [round(100*SC.charge/SC.max_charge, 1)]%" . += "Lumens Count: [round(lumens, 0.01)]" - var/datum/antagonist/hivemind/hivemind = mind.has_antag_datum(/datum/antagonist/hivemind) - if(hivemind) - . += "" - . += "Hivemind Vessels: [hivemind.hive_size] (+[hivemind.size_mod])" - . += "Psychic Link Duration: [(hivemind.track_bonus + TRACKER_DEFAULT_TIME)/10] seconds" var/mob/living/simple_animal/horror/H = has_horror_inside() if(H && H.controlling) . += "" diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 6d5a1659df43..e25db00f493b 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -101,9 +101,7 @@ . += "Chemical Storage: [changeling.chem_charges]/[changeling.chem_storage]" . += "Absorbed DNA: [changeling.absorbedcount]" -/mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools - if(mind && is_monkey(mind)) - return TRUE +/mob/living/carbon/monkey/IsAdvancedToolUser() return FALSE /mob/living/carbon/monkey/reagent_check(datum/reagent/R) //can metabolize all reagents diff --git a/code/modules/research/nanites/nanite_programs/buffing.dm b/code/modules/research/nanites/nanite_programs/buffing.dm index 2e1113b3bf78..ef0029614421 100644 --- a/code/modules/research/nanites/nanite_programs/buffing.dm +++ b/code/modules/research/nanites/nanite_programs/buffing.dm @@ -103,17 +103,11 @@ /datum/nanite_program/mindshield/enable_passive_effect() . = ..() - //won't work if on a rev, to avoid having implanted revs. same applies for hivemind members. + //won't work if on a rev, to avoid having implanted revs. if(host_mob.mind.has_antag_datum(/datum/antagonist/rev, TRUE)) return - if(is_hivemember(host_mob)) - return - if(host_mob.is_wokevessel()) - return if(host_mob.mind.has_antag_datum(/datum/antagonist/brainwashed)) return - if(host_mob.mind.has_antag_datum(/datum/antagonist/gang, TRUE)) - return if(is_team_darkspawn(host_mob)) return ADD_TRAIT(host_mob, TRAIT_MINDSHIELD, "nanites") diff --git a/code/modules/spells/spell_types/hivemind.dm b/code/modules/spells/spell_types/hivemind.dm deleted file mode 100644 index f8222acbeeb2..000000000000 --- a/code/modules/spells/spell_types/hivemind.dm +++ /dev/null @@ -1,996 +0,0 @@ -/* - * ATTENTION ALL FUTURE HIVEMIND CODERS / JANITORS - * - * THINGS ARE LIKE THEY ARE RIGHT NOW BECAUSE THE GAMEMODE - * IS ABANDONED. - * - * IF YOU ARE GOING TO REFACTOR / REWORK / ANYTHING ELSE - * THAT USES THESE SPELLS, PUT THEM IN FORMAL ORDER, - * CHECK THE SPELL BELOW TO SEE HOW IT IS SUPPOSED TO BE - * ORGANIZED, THANK YOU. - * - * IF YOU DON'T DO IT I'LL FUCKING KILL YOU, IT'S BROKEN AS SHIT. - * - * ~ tatax -*/ - -/datum/action/cooldown/spell/aoe/target_hive - panel = "Hivemind Abilities" - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "spell_default" - - invocation_type = INVOCATION_NONE - - spell_requirements = SPELL_REQUIRES_HUMAN - var/target_external = 0 //Whether or not we select targets inside or outside of the hive - - -/datum/action/cooldown/spell/aoe/target_hive/cast(atom/cast_on) - . = ..() - if(!.) - return FALSE - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive || !hive.hivemembers) - to_chat(owner, span_notice("This is a bug. Error:HIVE1")) - return - var/list/possible_targets = list() - var/list/targets = list() - - if(target_external) - for(var/mob/living/carbon/H in view_or_range(aoe_radius, owner, "range")) - if(owner == H) - continue - if(!is_valid_target(H)) - continue - if(!hive.is_carbon_member(H)) - possible_targets += H - else - possible_targets = hive.get_carbon_members() - if(aoe_radius) - possible_targets &= view_or_range(aoe_radius, owner, "range") - - var/mob/living/carbon/human/H = tgui_input_list(owner, "Choose the target for the spell.", "Targeting", possible_targets) //arcaic, homeric even - if(!H) - return - targets += H - - return TRUE - -/datum/action/cooldown/spell/aoe/target_hive/hive_add - name = "Assimilate Vessel" - desc = "We silently add an unsuspecting target to the hive." - button_icon_state = "add" - - cooldown_time = 5 SECONDS - aoe_radius = 7 - target_external = 1 - var/bruteforce = FALSE - -/datum/action/cooldown/spell/aoe/target_hive/hive_add/cast_on_thing_in_aoe(atom/victim, mob/living/carbon/human/caster) - var/mob/living/carbon/target = victim - var/datum/antagonist/hivemind/hive = caster.mind.has_antag_datum(/datum/antagonist/hivemind) - - if(!target.mind || !target.client || target.stat == DEAD) - to_chat(owner, span_notice("We detect no neural activity in this body.")) - var/shielded = HAS_TRAIT(target, TRAIT_MINDSHIELD) - var/foiled = target.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0) - if(shielded && !bruteforce) - to_chat(owner, span_warning("Powerful technology protects [target.name]'s mind.")) - return - if((shielded || foiled) && bruteforce) - to_chat(owner, span_notice("We [bruteforce ? "bruteforce" : "force"] our way past the mental barriers of [target.name] and begin linking our minds!")) - else - to_chat(owner, span_notice("We begin linking our mind with [target.name]!")) - var/multiplier = (!foiled || bruteforce) ? 5 : 10 - if(!do_after(owner, multiplier*(1.5**get_dist(owner, target)), owner, timed_action_flags = IGNORE_HELD_ITEM) || !(target in view(aoe_radius))) - to_chat(owner, span_notice("We fail to connect to [target.name].")) - return - if((HAS_TRAIT(target, TRAIT_MINDSHIELD) && !bruteforce)) - to_chat(owner, span_notice("We fail to connect to [target.name].")) - return - to_chat(owner, span_notice("[target.name] was added to the Hive!")) - hive.add_to_hive(target) - hive.threat_level = max(0, hive.threat_level-0.1) - if(bruteforce) - if(target.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 6)) - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10) - to_chat(owner, span_warning("We are briefly exhausted by the effort required by our enhanced assimilation abilities.")) - caster.Immobilize(5 SECONDS) - SEND_SIGNAL(target, COMSIG_NANITE_SET_VOLUME, 0) - for(var/obj/item/implant/mindshield/M in target.implants) - qdel(M) - else - target.can_block_magic(MAGIC_RESISTANCE_MIND) - -/datum/action/cooldown/spell/aoe/target_hive/hive_remove - name = "Release Vessel" - desc = "We silently remove a nearby target from the hive. We must be close to their body to do so." - button_icon_state = "remove" - - cooldown_time = 50 - aoe_radius = 7 - -/datum/action/cooldown/spell/aoe/target_hive/hive_remove/cast_on_thing_in_aoe(atom/victim, atom/caster) - var/mob/living/carbon/target = victim - - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(owner, span_notice("This is a bug. Error:HIVE1")) - return - var/datum/mind/M = target.mind - if(!M) - return - hive.remove_from_hive(target) - hive.calc_size() - hive.threat_level += 0.1 - to_chat(owner, span_notice("We remove [target.name] from the hive")) - if(hive.active_one_mind) - var/datum/antagonist/hivevessel/woke = target.is_wokevessel() - if(woke) - hive.active_one_mind.remove_member(M) - M.remove_antag_datum(/datum/antagonist/hivevessel) - -/datum/action/cooldown/spell/aoe/target_hive/hive_see - name = "Hive Vision" - desc = "We use the eyes of one of our vessels. Use again to look through our own eyes once more." - button_icon_state = "see" - var/mob/living/carbon/vessel - var/mob/living/host //Didn't really have any other way to auto-reset the perspective if the other mob got qdeled - var/limited = FALSE - var/active = FALSE - - cooldown_time = 2 SECONDS - -/datum/action/cooldown/spell/aoe/target_hive/hive_see/Remove(mob/living/owner) - owner.reset_perspective() - owner.clear_fullscreen("hive_eyes") - return ..() - -/datum/action/cooldown/spell/aoe/target_hive/hive_see/cast_on_thing_in_aoe(atom/victim, atom/caster) - if(!active) - vessel = victim - if(vessel) - if(vessel.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 0)) - if(get_dist(src, vessel) > 42) - to_chat(owner, span_warning("We were unable to link our view with [vessel.name]. A barrier of tinfoil prevents us to do so at this distance.")) - return - limited = TRUE - to_chat(owner, span_warning("A barrier of tinfoil drastically dampens our link with [vessel.name]. We'll be able to sustain the link as long as they remain within 42 tiles from us.")) - vessel.apply_status_effect(STATUS_EFFECT_BUGGED, owner) - owner.reset_perspective(vessel) - active = TRUE - host = owner - owner.clear_fullscreen("hive_mc") - owner.overlay_fullscreen("hive_eyes", /atom/movable/screen/fullscreen/hive_eyes) - else - vessel.remove_status_effect(STATUS_EFFECT_BUGGED) - owner.reset_perspective() - owner.clear_fullscreen("hive_eyes") - var/datum/action/cooldown/spell/aoe/target_hive/hive_control/the_spell = locate(/datum/action/cooldown/spell/aoe/target_hive/hive_control) in owner.actions - if(the_spell && the_spell.active) - owner.overlay_fullscreen("hive_mc", /atom/movable/screen/fullscreen/hive_mc) - active = FALSE - limited = FALSE - -/datum/action/cooldown/spell/aoe/target_hive/hive_see/process() - if(active && (!vessel || !is_hivemember(vessel) || QDELETED(vessel) || (limited && get_dist(vessel, host) > 42))) - to_chat(host, span_warning("Our vessel is one of us no more!")) - host.reset_perspective() - host.clear_fullscreen("hive_eyes") - active = FALSE - limited = FALSE - if(!QDELETED(vessel)) - vessel.remove_status_effect(STATUS_EFFECT_BUGGED) - ..() - -/datum/action/cooldown/spell/pointed/hive_shock - name = "Sensory Shock" - desc = "After a short charging time, we overload the mind of one of our vessels with psionic energy, temporarilly disrupting their sight, hearing, and speech." - cooldown_time = 600 - panel = "Hivemind Abilities" - invocation_type = INVOCATION_NONE - spell_requirements = SPELL_REQUIRES_HUMAN - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "shock" - cast_range = 7 - -/datum/action/cooldown/spell/pointed/hive_shock/cast(list/targets, mob/owner = usr) - . = ..() - if(!.) - return FALSE - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive || !hive.hivemembers) - to_chat(owner, span_notice("This is a bug. Error:HIVE1")) - return - var/mob/living/carbon/target = targets[1] - to_chat(owner, span_notice("We increase the psionic bandwidth between ourself and the target!")) - var/power = 1 - if(target.can_block_magic(MAGIC_RESISTANCE_MIND)) - power *= 0.5 - if(!hive.is_carbon_member(target)) - power *= 0.5 - target.blind_eyes(4*power) - target.adjust_eye_blur(30*power) - target.minimumDeafTicks(15*power) //equivalent to 30s deafness max - target.adjust_jitter(power SECONDS) - target.silent += 10*power - target.adjust_stutter(3*power SECONDS) - target.Knockdown(1*power) - target.stop_pulling() - to_chat(target, span_ownerdanger("You feel your mind start to burn!")) - - return TRUE - -/datum/action/cooldown/spell/hive_scan - name = "Psychoreception" - desc = "We release a pulse to receive information on any enemies we have previously located via Network Invasion, as well as those currently tracking us." - panel = "Hivemind Abilities" - cooldown_time = 1800 - invocation_type = INVOCATION_NONE - spell_requirements = SPELL_REQUIRES_HUMAN - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "scan" - -/datum/action/cooldown/spell/hive_scan/cast(mob/living/owner) - . = ..() - if(!.) - return FALSE - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(owner, span_notice("This is a bug. Error:HIVE1")) - return - var/message - var/distance - - for(var/datum/status_effect/hive_track/track in owner.status_effects) - var/mob/living/L = track.tracked_by - if(!L) - continue - if(!do_after(owner, 0.5 SECONDS, owner, timed_action_flags = IGNORE_HELD_ITEM)) - to_chat(owner, span_notice("Our concentration has been broken!")) - break - distance = get_dist(owner, L) - message = "[(L.is_real_hivehost()) ? "Someone": "A hivemind host"] tracking us" - if(owner.z != L.z || L.stat == DEAD) - message += " could not be found." - else - var/multiplier = L.can_block_magic(MAGIC_RESISTANCE_MIND) ? rand(0.6, 1.4) : 1 - switch(distance*multiplier) - if(0 to 2) - message += " is right next to us!" - if(2 to 14) - message += " is nearby." - if(14 to 28) - message += " isn't too far away." - if(28 to INFINITY) - message += " is quite far away." - to_chat(owner, span_assimilator("[message]")) - for(var/datum/antagonist/hivemind/enemy in hive.individual_track_bonus) - if(!do_after(owner, 0.5 SECONDS, owner, timed_action_flags = IGNORE_HELD_ITEM)) - to_chat(owner, span_notice("Our concentration has been broken!")) - break - var/mob/living/carbon/C = enemy.owner?.current - if(!C) - continue - var/multiplier = C.can_block_magic(MAGIC_RESISTANCE_MIND) ? rand(0.6, 1.4) : 1 - var/mob/living/real_enemy = C.get_real_hivehost() - distance = get_dist(owner, real_enemy) - message = "A host that we can track for [(hive.individual_track_bonus[enemy])/10] extra seconds" - if(owner.z != real_enemy.z || real_enemy.stat == DEAD) - message += " could not be found." - else - multiplier = real_enemy.can_block_magic(MAGIC_RESISTANCE_MIND) ? rand(0.6, 1.4) : 1 - switch(distance*multiplier) - if(0 to 2) - message += " is right next to us!" - if(2 to 14) - if(enemy.get_threat_multiplier() >= 0.85 && distance <= 7) - message += " is in this very room!" - else - message += " is nearby." - if(14 to 28) - message += " isn't too far away." - if(28 to INFINITY) - message += " is quite far away." - to_chat(owner, span_assimilator("[message]")) - - return TRUE - -/datum/action/cooldown/spell/hive_drain - name = "Repair Protocol" - desc = "Our many vessels sacrifice a small portion of their mind's vitality to cure us of our physical and mental ailments." - panel = "Hivemind Abilities" - cooldown_time = 600 - invocation_type = INVOCATION_NONE - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "drain" - spell_requirements = SPELL_REQUIRES_HUMAN - -/datum/action/cooldown/spell/hive_drain/cast(mob/living/carbon/human/owner) - . = ..() - if(!.) - return FALSE - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive || !hive.hivemembers) - return - var/iterations = 0 - var/list/carbon_members = hive.get_carbon_members() - if(!carbon_members.len) - return - if(!owner.getBruteLoss() && !owner.getFireLoss() && !owner.getCloneLoss() && !owner.getOrganLoss(ORGAN_SLOT_BRAIN) && !owner.getStaminaLoss()) - to_chat(owner, span_notice("We cannot heal ourselves any more with this power!")) - to_chat(owner, span_notice("We begin siphoning power from our many vessels!")) - while(iterations < 7) - var/mob/living/carbon/target = pick(carbon_members) - if(!do_after(owner, 1 SECONDS, owner, timed_action_flags = IGNORE_HELD_ITEM)) - to_chat(owner, span_warning("Our concentration has been broken!")) - break - if(!target) - to_chat(owner, span_warning("We have run out of vessels to drain.")) - break - var/regen = target.can_block_magic(MAGIC_RESISTANCE_MIND) ? 5 : 10 - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, regen/2) - if(owner.getBruteLoss() > owner.getFireLoss()) - owner.heal_ordered_damage(regen, list(CLONE, BRUTE, BURN, STAMINA)) - else - owner.heal_ordered_damage(regen, list(CLONE, BURN, BRUTE, STAMINA)) - if(!owner.getBruteLoss() && !owner.getFireLoss() && !owner.getCloneLoss() && !owner.getStaminaLoss()) //If we don't have any of these, stop looping - to_chat(owner, span_warning("We finish our healing")) - break - iterations++ - owner.setOrganLoss(ORGAN_SLOT_BRAIN, 0) - - return TRUE - -/mob/living/passenger - name = "mind control victim" - real_name = "unknown conscience" - -/mob/living/passenger/UnarmedAttack(atom/A) - return - -/mob/living/passenger/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) - to_chat(src, span_warning("You find yourself unable to speak, you aren't in control of your body!")) - return FALSE - -/mob/living/passenger/emote(act, m_type = null, message = null, intentional = FALSE, is_keybind = FALSE) - to_chat(src, span_warning("You find yourself unable to emote, you aren't in control of your body!")) - return - -/mob/living/passenger/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) - return - -/datum/action/cooldown/spell/aoe/target_hive/hive_control - name = "Mind Control" - desc = "We assume direct control of one of our vessels, leaving our current body for up to a minute. It can be cancelled at any time by casting it again. Powers can be used via our vessel, although if it dies, the entire hivemind will come down with it. Our ability to sense psionic energy is completely nullified while using this power, and it will end immediately should we attempt to move too far from our starting point." - cooldown_time = 1200 - button_icon_state = "force" - var/active = FALSE - var/mob/living/carbon/human/original_body //The original hivemind host - var/mob/living/carbon/human/vessel - var/mob/living/passenger/backseat //Storage for the mind controlled vessel - var/turf/starting_spot - var/power = 600 - var/time_initialized = 0 - var/out_of_range = FALSE - var/restricted_range = FALSE - -/datum/action/cooldown/spell/aoe/target_hive/hive_control/proc/release_control() //If the spell is active, force everybody into their original bodies if they exist, ghost them otherwise, delete the backseat - if(!active) - return - active = FALSE - if(!QDELETED(vessel)) - vessel.clear_fullscreen("hive_mc") - if(vessel.mind) - if(QDELETED(original_body)) - vessel.ghostize(0) - else - vessel.mind.transfer_to(original_body, 1) - original_body.Sleeping(vessel.AmountSleeping()) // Mirrors any sleep or unconsciousness from the vessel - original_body.Unconscious(vessel.AmountUnconscious()) - - if(!QDELETED(backseat) && backseat.mind) - if(QDELETED(vessel)) - backseat.ghostize(0) - else - backseat.mind.transfer_to(vessel,1) - vessel.visible_message(span_ownerdanger("[src] suddenly wakes up, as though he was under foreign control!")) - vessel.adjust_jitter(3 SECONDS) - message_admins("[ADMIN_LOOKUPFLW(vessel)] is no longer being controlled by [ADMIN_LOOKUPFLW(original_body)] (Hivemind Host).") - log_game("[key_name(vessel)] was released from Mind Control by [key_name(original_body)].") - - QDEL_NULL(backseat) - - if(original_body?.mind) - var/datum/antagonist/hivemind/hive = original_body.mind.has_antag_datum(/datum/antagonist/hivemind) - if(hive) - hive.threat_level += 1 - - restricted_range = FALSE - -/datum/action/cooldown/spell/aoe/target_hive/hive_control/cast_on_thing_in_aoe(atom/victim, atom/caster) - if(!active) - vessel = victim - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(owner, span_notice("This is a bug. Error:HIVE1")) - return - original_body = owner - vessel = victim - to_chat(owner, span_notice("We begin merging our mind with [vessel.name].")) - var/timely = 50 - if(vessel.can_block_magic(MAGIC_RESISTANCE_MIND)) - timely = 100 - restricted_range = TRUE - if(!do_after(owner, timely, owner, timed_action_flags = IGNORE_HELD_ITEM)) - to_chat(owner, span_notice("We fail to assume control of the target.")) - return - if(owner.z != vessel.z || (restricted_range && get_dist(vessel, owner) > 35)) - to_chat(owner, span_notice("Our vessel is too far away to control.")) - return - for(var/datum/antagonist/hivemind/H in GLOB.antagonists) - if(H.owner == owner.mind) - continue - if(H.owner == vessel.mind) - to_chat(owner, span_danger("We have detected a foreign presence within this mind, it would be unwise to merge so intimately with it.")) - return - backseat = new /mob/living/passenger() - if(vessel && vessel.mind && backseat) - message_admins("[ADMIN_LOOKUPFLW(vessel)] has been temporarily taken over by [ADMIN_LOOKUPFLW(owner)] (Hivemind Host).") - log_game("[key_name(vessel)] was Mind Controlled by [key_name(owner)].") - - deadchat_broadcast(" has just been mind controlled!", span_name("[vessel]"), vessel) - - original_body = owner - backseat.loc = vessel - backseat.name = vessel.real_name - backseat.real_name = vessel.real_name - vessel.mind.transfer_to(backseat, 1) - owner.mind.transfer_to(vessel, 1) - backseat.blind_eyes(power) - vessel.overlay_fullscreen("hive_mc", /atom/movable/screen/fullscreen/hive_mc) - active = TRUE - out_of_range = FALSE - starting_spot = get_turf(vessel) - time_initialized = world.time - to_chat(vessel, span_assimilator("We can sustain our control for a maximum of [round(power/10)] seconds.")) - if(do_after(owner, power, owner, timed_action_flags = IGNORE_HELD_ITEM, progress = FALSE)) - to_chat(vessel, span_warning("We cannot sustain the mind control any longer and release control!")) - else - to_chat(vessel, span_warning("Our body has been disturbed, interrupting the mind control!")) - release_control() - else - to_chat(usr, span_warning("We detect no neural activity in our vessel!")) - else - release_control() - -/datum/action/cooldown/spell/aoe/target_hive/hive_control/process() - if(QDELETED(vessel)) //If we've been gibbed or otherwise deleted, ghost both of them and kill the original - original_body.adjustOrganLoss(ORGAN_SLOT_BRAIN, 200) - release_control() - else if(!is_hivemember(backseat)) //If the vessel is no longer a hive member, return to original bodies - to_chat(vessel, span_warning("Our vessel is one of us no more!")) - release_control() - else if(!QDELETED(original_body) && (!backseat.ckey || vessel.stat == DEAD)) //If the original body exists and the vessel is dead/ghosted, return both to body but not before killing the original - original_body.adjustOrganLoss(ORGAN_SLOT_BRAIN, 200) - to_chat(vessel.mind, span_warning("Our vessel is one of us no more!")) - release_control() - else if(!QDELETED(original_body) && original_body.z != vessel.z) //Return to original bodies - release_control() - to_chat(original_body, span_warning("Our vessel is too far away to control!")) - else if(QDELETED(original_body) || original_body.stat == DEAD) //Return vessel to its body, either return or ghost the original - to_chat(vessel, span_ownerdanger("Our body has been destroyed, the hive cannot survive without its host!")) - release_control() - else - var/multiplier = restricted_range ? 0.5 : 1 - if(!out_of_range && get_dist(starting_spot, vessel) > 14*multiplier) - out_of_range = TRUE - flash_color(vessel, flash_color="#800080", flash_time=10) - to_chat(vessel, span_warning("Our vessel has been moved too far away from the initial point of control, we will be disconnected if we go much further!")) - addtimer(CALLBACK(src, PROC_REF(range_check), multiplier), 30) - else if(get_dist(starting_spot, vessel) > 21*multiplier) - release_control() - - ..() - -/datum/action/cooldown/spell/aoe/target_hive/hive_control/proc/range_check(multiplier = 1) - if(get_dist(starting_spot, vessel) > 14 * multiplier) - release_control() - out_of_range = FALSE - -/datum/action/cooldown/spell/pointed/induce_panic - name = "Induce Panic" - desc = "We unleash a burst of psionic energy, inducing a debilitating fear in those around us and reducing their combat readiness. We can also briefly affect silicon-based life with this burst." - panel = "Hivemind Abilities" - cooldown_time = 600 - cast_range = 7 - invocation_type = INVOCATION_NONE - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "panic" - -/datum/action/cooldown/spell/pointed/induce_panic/cast(list/targets, mob/living/owner = usr) - . = ..() - if(!.) - return FALSE - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(owner, span_notice("This is a bug. Error:HIVE1")) - return - for(var/mob/living/carbon/human/target in targets) - if(target.stat == DEAD) - continue - target.adjust_jitter(14 SECONDS) - target.apply_damage(35 + rand(0,15), STAMINA, target.get_bodypart(BODY_ZONE_HEAD)) - if(target.is_real_hivehost() || target.can_block_magic(MAGIC_RESISTANCE_MIND)) - continue - if(prob(20)) - var/text = pick(":h Help!!",":h Run!",":h They're here!",":h Get out!",":h Hide!",":h Kill them!",":h Cult!",":h Changeling!",":h Traitor!",":h Nuke ops!",":h Revolutionaries!",":h Wizard!",":h Zombies!",":h Ghosts!",":h AI rogue!",":h Borgs emagged!",":h Maint!!",":h Dying!!",":h AI lock down the borgs law 1!",":h I'm losing control of the situation!!") - target.say(text, forced = "panic") - var/effect = rand(1,4) - switch(effect) - if(1) - to_chat(target, span_ownerdanger("You panic and drop everything to the ground!")) - target.drop_all_held_items() - if(2) - to_chat(target, span_ownerdanger("You panic and flail around!")) - target.click_random_mob() - addtimer(CALLBACK(target, "click_random_mob"), 0.5 SECONDS) - addtimer(CALLBACK(target, "click_random_mob"), 1 SECONDS) - addtimer(CALLBACK(target, "click_random_mob"), 1.5 SECONDS) - addtimer(CALLBACK(target, "click_random_mob"), 2 SECONDS) - addtimer(CALLBACK(target, "Stun", 3 SECONDS), 2.5 SECONDS) - target.adjust_confusion(10 SECONDS) - if(3) - to_chat(target, span_ownerdanger("You freeze up in fear!")) - target.Stun(7 SECONDS) - if(4) - to_chat(target, span_ownerdanger("You feel nauseous as dread washes over you!")) - target.adjust_dizzy(15 SECONDS) - target.apply_damage(30, STAMINA, target.get_bodypart(BODY_ZONE_HEAD)) - target.adjust_hallucinations(45 SECONDS) - - for(var/mob/living/silicon/target in targets) - target.Unconscious(50) - - return TRUE - -/datum/action/cooldown/spell/pointed/pin - name = "Psychic Pin" - desc = "We send out a controlled pulse of psionic energy, pinning everyone in sight, and knocking out silicon-based lifeforms. This is weaker against enemy hiveminds." - panel = "Hivemind Abilities" - cooldown_time = 600 - cast_range = 7 - invocation_type = INVOCATION_NONE - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "pin" - -/datum/action/cooldown/spell/pointed/pin/cast(list/targets, mob/living/owner = usr) - . = ..() - if(!.) - return FALSE - if(!targets) - to_chat(owner, span_notice("Nobody is in sight, it'd be a waste to do that now.")) - return - var/list/victims = list() - for(var/mob/living/target in targets) - if(target.stat == DEAD) - continue - if(target.is_real_hivehost() || (!iscarbon(target) && !issilicon(target))) - continue - victims += target - var/statustime = max(80,240/(1+round(victims.len/3))) - for(var/mob/living/carbon/victim in victims) - if(victim.is_real_hivehost()) - victim.Knockdown(statustime/4) - else - victim.Knockdown(statustime) - to_chat(victim, span_ownerdanger("A sudden force throws you to the ground!")) - for(var/mob/living/silicon/victim in victims) - victim.Unconscious(statustime) - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(victims.len && hive) - hive.threat_level += 1 - -/datum/action/cooldown/spell/aoe/target_hive/nightmare - name = "Living nightmares" - desc = "The target's fears break out and attack them, obscuring their vision and clawing at them." - aoe_radius = 7 - cooldown_time = 1800 - button_icon_state = "nightmare" - -/datum/action/cooldown/spell/aoe/target_hive/nightmare/cast_on_thing_in_aoe(atom/victim, atom/caster) - var/mob/living/carbon/target = victim - if(!do_after(owner, 3 SECONDS, owner, timed_action_flags = IGNORE_HELD_ITEM)) - to_chat(owner, span_notice("Our concentration has been broken!")) - return - to_chat(target, span_ownerdanger("You see dark smoke swirling around you!")) - if(target.can_block_magic(MAGIC_RESISTANCE_MIND)) - to_chat(owner, span_notice("We begin bruteforcing the tinfoil barriers of [target.name] and pulling out their nightmares.")) - if(!do_after(owner, 3 SECONDS, owner, timed_action_flags = IGNORE_HELD_ITEM) || !(target in view(aoe_radius))) - to_chat(owner, span_notice("Our concentration has been broken!")) - return - target.apply_status_effect(STATUS_EFFECT_HIVEMIND_CURSE, CURSE_SPAWNING | CURSE_BLINDING) - to_chat(owner, span_notice("We have brought forth the targets nightmares!")) - deadchat_broadcast(" is suffering corporial nightmares!", span_name("[target]"), target) - - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(hive) - hive.threat_level += 3 - -/obj/item/extendohand/hivemind - name = "Telekinetic hand" - desc = "Extends the reach of your unarmed combat. Drop to remove." - icon = 'icons/mob/actions/actions_hive.dmi' - icon_state = "hivehand" - item_state = "hivehand" - lefthand_file = 'icons/mob/inhands/misc/touchspell_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/touchspell_righthand.dmi' - - weapon_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 3, DAMAGE_LOW = 0, DAMAGE_HIGH = 0) - min_reach = -1 - item_flags = ABSTRACT | DROPDEL - -/datum/action/cooldown/spell/telekinetic_hand - name = "Telekinetic hand" - desc = "Makes a telekinetic hand to extend the reach of our unarmed combat. Drop to remove." - invocation_type = INVOCATION_NONE - cooldown_time = 200 - panel = "Hivemind Abilities" - background_icon_state = "bg_hive" - button_icon = 'icons/mob/actions/actions_hive.dmi' - button_icon_state = "hivehand" - var/spell_item = /obj/item/extendohand/hivemind - -/datum/action/cooldown/spell/telekinetic_hand/cast(mob/owner = usr) - . = ..() - if(!.) - return FALSE - if(owner.get_active_held_item()==null) - var/obj/item/W = new spell_item - owner.put_in_hands(W) - to_chat(owner, span_notice("You make a telekinetic hand!")) - else - to_chat(owner,span_notice("You cannot make a telekinetic hand while holding something!")) - -/datum/action/cooldown/spell/pointed/hive_hack - name = "Network Invasion" - desc = "We probe the mind of an adjacent target and extract valuable information on any enemy hives they may belong to. Takes longer if the target is not in our hive or wearing tinfoil protection." - panel = "Hivemind Abilities" - cooldown_time = 600 - cast_range = 1 - invocation_type = INVOCATION_NONE - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "hack" - -/datum/action/cooldown/spell/pointed/hive_hack/cast(list/targets, mob/living/owner) - . = ..() - if(!.) - return FALSE - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(owner, span_notice("This is a bug. Error:HIVE1")) - return - var/mob/living/carbon/target = targets[1] - var/in_hive = hive.is_carbon_member(target) - var/list/enemies = list() - - to_chat(owner, span_notice("We begin probing [target.name]'s mind!")) - if(do_after(owner, 10 SECONDS, target, timed_action_flags = IGNORE_HELD_ITEM)) - var/foiled = target.can_block_magic(MAGIC_RESISTANCE_MIND) - if(!in_hive || foiled) - var/timely = !in_hive ? 200 : 100 - to_chat(owner, span_notice("Their mind slowly opens up to us.")) - if(!do_after(owner, timely, target, timed_action_flags = IGNORE_HELD_ITEM)) - to_chat(owner, span_notice("Our concentration has been broken!")) - return - for(var/datum/antagonist/hivemind/enemy in GLOB.antagonists) - var/datum/mind/M = enemy.owner - if(!M?.current) - continue - if(M.current == owner) - continue - if(enemy.is_carbon_member(target)) - hive.add_track_bonus(enemy, TRACKER_BONUS_LARGE) - var/mob/living/real_enemy = (M.current.get_real_hivehost()) - enemies += real_enemy - enemy.remove_from_hive(target) - real_enemy.apply_status_effect(STATUS_EFFECT_HIVE_TRACKER, owner, hive.get_track_bonus(enemy)) - if(M.current.is_real_hivehost()) //If they were using mind control, too bad - real_enemy.apply_status_effect(STATUS_EFFECT_HIVE_RADAR) - target.apply_status_effect(STATUS_EFFECT_HIVE_TRACKER, real_enemy, enemy.get_track_bonus(hive)) - to_chat(real_enemy, span_assimilator("We detect a surge of psionic energy from a far away vessel before they disappear from the hive. Whatever happened, there's a good chance they're after us now.")) - - if(enemy.owner == M && target.is_real_hivehost()) - var/atom/throwtarget - throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(owner, src))) - SEND_SOUND(owner, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) - flash_color(owner, flash_color="#800080", flash_time=10) - owner.Paralyze(10) - owner.throw_at(throwtarget, 5, 1,src) - to_chat(owner, span_ownerdanger("A sudden surge of psionic energy rushes into your mind, only a Hive host could have such power!!")) - return - if(enemies.len) - hive.track_bonus += TRACKER_BONUS_SMALL - to_chat(owner, span_ownerdanger("In a moment of clarity, we see all. Another hive. Faces. Our nemesis. They have heard our call. They know we are coming.")) - to_chat(owner, span_assimilator("This vision has provided us insight on our very nature, improving our sensory abilities, particularly against the hives this vessel belonged to.")) - owner.apply_status_effect(STATUS_EFFECT_HIVE_RADAR) - else - to_chat(owner, span_notice("We peer into the inner depths of their mind and see nothing, no enemies lurk inside this mind.")) - else - to_chat(owner, span_notice("Our concentration has been broken!")) - -/datum/action/cooldown/spell/pointed/hive_reclaim - name = "Reclaim" - desc = "Allows us to instantly syphon the psionic energy from an adjacent critically injured host, killing them immediately. If it succeeds, we will be able to advance our own powers a great deal." - panel = "Hivemind Abilities" - cooldown_time = 600 - cast_range = 1 - invocation_type = INVOCATION_NONE - spell_requirements = SPELL_REQUIRES_HUMAN - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "reclaim" - -/datum/action/cooldown/spell/pointed/hive_reclaim/cast(list/targets, mob/living/owner = usr) - . = ..() - if(!.) - return FALSE - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(owner, span_notice("This is a bug. Error:HIVE1")) - return - var/found_target = FALSE - var/gibbed = FALSE - - for(var/mob/living/carbon/C in targets) - if(!is_hivehost(C)) - continue - if(C.InCritical() || (C.stat == DEAD && C.timeofdeath + 150 >= world.time) ) - C.gib() - hive.track_bonus += TRACKER_BONUS_LARGE - hive.size_mod += 5 - hive.threat_level += 1 - gibbed = TRUE - found_target = TRUE - else if(C.IsUnconscious()) - C.adjustOxyLoss(100) - found_target = TRUE - - if(!found_target) - return - - flash_color(owner, flash_color="#800080", flash_time=10) - if(gibbed) - to_chat(owner,span_assimilator("We have reclaimed what gifts weaker minds were squandering and gain ever more insight on our psionic abilities.")) - to_chat(owner,span_assimilator("Thanks to this new knowledge, our sensory powers last a great deal longer.")) - hive.check_powers() - -/datum/action/cooldown/spell/hive_wake - name = "Chaos Induction" - desc = "A one-use power, we awaken four random vessels within our hive and force them to do our bidding." - panel = "Hivemind Abilities" - cooldown_time = 1 - invocation_type = INVOCATION_NONE - spell_requirements = SPELL_REQUIRES_HUMAN - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "chaos" - -/datum/action/cooldown/spell/hive_wake/cast(mob/living/owner) - . = ..() - if(!.) - return FALSE - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(owner, span_notice("This is a bug. Error:HIVE1")) - return - if(!hive.hivemembers) - return - var/list/valid_targets = list() - for(var/datum/mind/M in hive.hivemembers) - var/mob/living/carbon/C = M.current - if(!C || is_hivehost(C) || C.is_wokevessel() || C.stat == DEAD || C.InCritical() || C.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 4)) - continue - valid_targets += C - - if(!valid_targets || valid_targets.len < 4) - to_chat(owner, span_assimilator("We lack the vessels to use this power.")) - return - - var/objective = stripped_input(owner, "What objective do you want to give to your vessels?", "Objective") - - if(!objective || !hive) - return - - hive.threat_level += 6 - for(var/i = 0, i < 4, i++) - var/mob/living/carbon/C = pick_n_take(valid_targets) - C.hive_awaken(objective) - - return TRUE - -/datum/action/cooldown/spell/hive_loyal - name = "Bruteforce" - desc = "Our ability to assimilate is boosted at the cost of, allowing us to crush the technology shielding the minds of savyy personnel and assimilate them. This power comes at a small price, and we will be immobilized for a few seconds after assimilation." - panel = "Hivemind Abilities" - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "loyal" - - invocation_type = INVOCATION_NONE - - cooldown_time = 1 MINUTES - spell_requirements = SPELL_REQUIRES_HUMAN - var/active = FALSE - -/datum/action/cooldown/spell/hive_loyal/cast(mob/living/owner) - . = ..() - if(!.) - return FALSE - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(owner, span_notice("This is a bug. Error:HIVE1")) - return - var/datum/action/cooldown/spell/aoe/target_hive/hive_add/the_spell = locate(/datum/action/cooldown/spell/aoe/target_hive/hive_add) in owner.actions - if(!the_spell) - to_chat(owner, span_notice("This is a bug. Error:HIVE5")) - return - the_spell.bruteforce = !active - to_chat(owner, span_notice("We [active?"let our minds rest and cancel our crushing power.":"prepare to crush mindshielding technology!"]")) - active = !active - - return TRUE - -/datum/action/cooldown/spell/forcewall/hive - name = "Telekinetic Field" - desc = "Our psionic powers form a barrier around us in the phsyical world that only we can pass through." - panel = "Hivemind Abilities" - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "forcewall" - - invocation_type = INVOCATION_NONE - - wall_type = /obj/effect/forcefield/wizard/hive - cooldown_time = 1 MINUTES - spell_requirements = SPELL_REQUIRES_HUMAN - var/wall_type_b = /obj/effect/forcefield/wizard/hive/invis - -/datum/action/cooldown/spell/forcewall/hive/cast(list/targets,mob/owner = usr) - . = ..() - if(!.) - return FALSE - new wall_type(get_turf(owner),owner) - for(var/dir in GLOB.alldirs) - new wall_type_b(get_step(owner, dir),owner) - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(hive) - hive.threat_level += 0.5 - - return TRUE - -/obj/effect/forcefield/wizard/hive - name = "Telekinetic Field" - desc = "You think, therefore it is." - pixel_x = -32 //Centres the 96x96 sprite - pixel_y = -32 - icon = 'icons/effects/96x96.dmi' - icon_state = "hive_shield" - layer = ABOVE_ALL_MOB_LAYER - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/effect/forcefield/wizard/hive/CanPass(atom/movable/mover, turf/target) - SHOULD_CALL_PARENT(FALSE) - if(IS_WEAKREF_OF(mover, caster_weakref)) - return TRUE - return FALSE - -/obj/effect/forcefield/wizard/hive/invis - icon = null - icon_state = null - pixel_x = 0 - pixel_y = 0 - invisibility = INVISIBILITY_MAXIMUM - -/datum/action/cooldown/spell/one_mind - name = "One Mind" - desc = "Our true power... finally within reach." - panel = "Hivemind Abilities" - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "assim" - - invocation_type = INVOCATION_NONE - spell_requirements = SPELL_REQUIRES_HUMAN - - cooldown_time = 0.1 SECONDS - -/datum/action/cooldown/spell/one_mind/cast(mob/living/owner) - . = ..() - if(!.) - return FALSE - var/datum/antagonist/hivemind/hive = owner.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(owner, span_notice("This is a bug. Error:HIVE1")) - return - var/mob/living/boss = owner.get_real_hivehost() - var/datum/objective/protect/new_objective = new /datum/objective/protect - new_objective.target = owner.mind - new_objective.explanation_text = "Ensure the One Mind survives under the leadership of [boss.real_name]." - var/datum/team/hivemind/one_mind_team = new /datum/team/hivemind(owner.mind) - hive.active_one_mind = one_mind_team - one_mind_team.objectives += new_objective - for(var/datum/antagonist/hivevessel/vessel in GLOB.antagonists) - var/mob/living/carbon/C = vessel.owner?.current - if(C && hive.is_carbon_member(C)) - vessel.one_mind = one_mind_team - for(var/datum/antagonist/hivemind/enemy in GLOB.antagonists) - if(enemy.owner) - for(var/datum/action/cooldown/spell/one_mind/one_mind in enemy.owner.current.actions) - one_mind.Remove(enemy.owner.current) - sound_to_playing_players('sound/effects/one_mind.ogg') - hive.glow = mutable_appearance('icons/effects/hivemind.dmi', "awoken", -BODY_BEHIND_LAYER) - addtimer(CALLBACK(owner, TYPE_PROC_REF(/atom, add_overlay), hive.glow), 150) - addtimer(CALLBACK(hive, TYPE_PROC_REF(/datum/antagonist/hivemind, awaken)), 150) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(send_to_playing_players), span_bigassimilator("THE ONE MIND RISES")), 150) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(sound_to_playing_players), 'sound/effects/magic.ogg'), 150) - for(var/datum/mind/M in hive.hivemembers) - var/mob/living/carbon/C = M.current - if(!C) - continue - if(is_hivehost(C)) - continue - if(C.stat == DEAD) - continue - C.adjust_jitter(15 SECONDS) - C.Unconscious(150) - if(C.can_block_magic(MAGIC_RESISTANCE_MIND, charge_cost = 6)) - continue - to_chat(C, span_boldwarning("Something's wrong...")) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, span_boldwarning("...your memories are becoming fuzzy.")), 45) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, span_boldwarning("You try to remember who you are...")), 90) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, span_assimilator("There is no you...")), 110) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, span_bigassimilator("...there is only us.")), 130) - addtimer(CALLBACK(C, /mob/living/proc/hive_awaken, new_objective, one_mind_team), 150) - - return TRUE - -/datum/action/cooldown/spell/hive_comms - name = "Hive Communication" - desc = "Now that we are free we may finally share our thoughts with our many bretheren." - panel = "Hivemind Abilities" - cooldown_time = 100 - invocation_type = INVOCATION_NONE - spell_requirements = SPELL_REQUIRES_HUMAN - button_icon = 'icons/mob/actions/actions_hive.dmi' - background_icon_state = "bg_hive" - button_icon_state = "comms" - -/datum/action/cooldown/spell/hive_comms/cast(mob/living/owner = usr) - . = ..() - if(!.) - return FALSE - var/message = stripped_input(owner, "What do you want to say?", "Hive Communication") - if(!message) - return - var/title = "One Mind" - var/span = "changeling" - if(owner.mind && owner.mind.has_antag_datum(/datum/antagonist/hivemind)) - span = "assimilator" - var/my_message = "[title] [findtextEx(owner.name, owner.real_name) ? owner.name : "[owner.real_name] (as [owner.name])"]: [message]" - for(var/i in GLOB.player_list) - var/mob/M = i - if(is_hivehost(M) || is_hivemember(M)) - to_chat(M, my_message) - else if(M in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(M, owner) - to_chat(M, "[link] [my_message]") - - owner.log_talk(message, LOG_SAY, tag="hive") diff --git a/config/game_options.txt b/config/game_options.txt index 696916e974c3..a60382ce9667 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -121,7 +121,6 @@ PROBABILITY VAMPIRE 0 # Group antags PROBABILITY DARKSPAWN 9 PROBABILITY REVOLUTION 8 -PROBABILITY GANG 0 PROBABILITY CULT 5 PROBABILITY CLOCKWORK_CULT 5 @@ -133,7 +132,6 @@ PROBABILITY CLOWNOPS 0 #Broke # Special PROBABILITY RAGINMAGES 1 -PROBABILITY MONKEY 0 PROBABILITY METEOR 0 PROBABILITY EXTENDED 0 PROBABILITY SECRET_EXTENDED 0 @@ -159,7 +157,6 @@ CONTINUOUS CULT CONTINUOUS CLOCKWORK_CULT CONTINUOUS CHANGELING CONTINUOUS WIZARD -CONTINUOUS HIVEMIND #CONTINUOUS MALF CONTINUOUS VAMPIRE CONTINUOUS DYNAMIC @@ -185,7 +182,6 @@ MIDROUND_ANTAG CULT MIDROUND_ANTAG CLOCKWORK_CULT MIDROUND_ANTAG CHANGELING MIDROUND_ANTAG WIZARD -#MIDROUND_ANTAG MONKEY #MIDROUND_ANTAG MALF MIDROUND_ANTAG DARKSPAWN diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/gangster.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/gangster.ts deleted file mode 100644 index c527d40a0f10..000000000000 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/gangster.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Antagonist, Category } from "../base"; -import { multiline } from "common/string"; - -export const GANGSTER_MECHANICAL_DESCRIPTION - = multiline` - Convert others into your gang and send them off to claim territory to fund illicit gear. - Work against other gangs and security to claim the nuclear disk, then hijack the station using the dominator machine. - `; - - -const Gangster: Antagonist = { - key: "gangster", - name: "Gang Leader", - description: [ - multiline` - It's time for a take over. Other gangs have had their eye on this place, but your corporate employer expects results. - Make sure yours is the one that dominates the station subsystems, so that you can enjoy this new turf of paradise. - `, - GANGSTER_MECHANICAL_DESCRIPTION, - ], - category: Category.Roundstart, -}; - -export default Gangster; diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/hivemindhost.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/hivemindhost.ts deleted file mode 100644 index 797b5e13836c..000000000000 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/hivemindhost.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Antagonist, Category } from "../base"; -import { multiline } from "common/string"; - -export const HIVEMINDHOST_MECHANICAL_DESCRIPTION - = multiline` - Silently induct crew members into your neural network, and gain more abilities as you do so. - Avoid the ire of security or other hosts, and create one consciousness for all thinking things. - `; - - -const HivemindHost: Antagonist = { - key: "hivemindhost", - name: "Hivemind Host", - description: [ - multiline` - Minds are delicious things. You wander and find and touch, leaving the meat-sacks none the wiser. For now, you can instruct them, but the One Mind will unite and elevate all. - We shall become Hivemind. - `, - HIVEMINDHOST_MECHANICAL_DESCRIPTION, - ], - category: Category.Roundstart, - priority: -1, -}; - -export default HivemindHost; diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/monkey.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/monkey.ts deleted file mode 100644 index 48ed10fbda02..000000000000 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/monkey.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Antagonist, Category } from "../base"; -import { multiline } from "common/string"; - -export const MONKEY_MECHANICAL_DESCRIPTION - = multiline` - Enter the station infected with a disease that will eventually turn you into a monkey. Bite others to spread the virus, and escape to Centcom to continue the cycle. - `; - - -const Monkey: Antagonist = { - key: "monkey", - name: "Monkey", - description: [ - multiline` - You thought it'd be an ordinary day, but ever since a monkey bit you the day before, you've felt yourself regressing into something more base. - When you look at your colleagues, all you can think of is sinking your teeth into them and flailing wildly. - `, - MONKEY_MECHANICAL_DESCRIPTION, - ], - category: Category.Roundstart, - priority: -1, -}; - -export default Monkey; diff --git a/yogstation.dme b/yogstation.dme index ee5aad425cf6..8bcab5b1237a 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -1011,13 +1011,9 @@ #include "code\game\gamemodes\dynamic\ruleset_picking.dm" #include "code\game\gamemodes\eldritch_cult\eldritch_cult.dm" #include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\hivemind\hivemind.dm" -#include "code\game\gamemodes\hivemind\objectives.dm" -#include "code\game\gamemodes\hivemind\radar.dm" #include "code\game\gamemodes\malfunction\malf.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" -#include "code\game\gamemodes\monkey\monkey.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\gamemodes\revolution\revolution.dm" #include "code\game\gamemodes\traitor\internal_affairs.dm" @@ -2025,8 +2021,6 @@ #include "code\modules\antagonists\golems\golem.dm" #include "code\modules\antagonists\greentext\greentext.dm" #include "code\modules\antagonists\highlander\highlander.dm" -#include "code\modules\antagonists\hivemind\hivemind.dm" -#include "code\modules\antagonists\hivemind\vessel.dm" #include "code\modules\antagonists\horror\horror.dm" #include "code\modules\antagonists\horror\horror_abilities_and_upgrades.dm" #include "code\modules\antagonists\horror\horror_chemicals.dm" @@ -2036,7 +2030,6 @@ #include "code\modules\antagonists\kudzu\kudzu.dm" #include "code\modules\antagonists\magic_servant\servant.dm" #include "code\modules\antagonists\malf\malf.dm" -#include "code\modules\antagonists\monkey\monkey.dm" #include "code\modules\antagonists\monsterhunter\monsterhunter.dm" #include "code\modules\antagonists\monsterhunter\monstertrack.dm" #include "code\modules\antagonists\morph\morph.dm" @@ -3764,7 +3757,6 @@ #include "code\modules\spells\spell.dm" #include "code\modules\spells\spell_types\devil.dm" #include "code\modules\spells\spell_types\devil_boons.dm" -#include "code\modules\spells\spell_types\hivemind.dm" #include "code\modules\spells\spell_types\madness_curse.dm" #include "code\modules\spells\spell_types\right_and_wrong.dm" #include "code\modules\spells\spell_types\aoe_spell\_aoe_spell.dm" @@ -4117,11 +4109,6 @@ #include "yogstation\code\game\gamemodes\clown_ops\bananium_bomb.dm" #include "yogstation\code\game\gamemodes\darkspawn\darkspawn.dm" #include "yogstation\code\game\gamemodes\darkspawn\darkspawn_hud.dm" -#include "yogstation\code\game\gamemodes\gangs\dominator.dm" -#include "yogstation\code\game\gamemodes\gangs\gang_items.dm" -#include "yogstation\code\game\gamemodes\gangs\gang_pen.dm" -#include "yogstation\code\game\gamemodes\gangs\gangs.dm" -#include "yogstation\code\game\gamemodes\gangs\gangtool.dm" #include "yogstation\code\game\gamemodes\infiltration\infiltration.dm" #include "yogstation\code\game\gamemodes\traitor\internal_affairs.dm" #include "yogstation\code\game\gamemodes\vampire\traitor_vamp.dm" @@ -4154,10 +4141,8 @@ #include "yogstation\code\game\objects\items.dm" #include "yogstation\code\game\objects\objs.dm" #include "yogstation\code\game\objects\effects\contraband.dm" -#include "yogstation\code\game\objects\effects\countdown.dm" #include "yogstation\code\game\objects\effects\landmarks.dm" #include "yogstation\code\game\objects\effects\portals.dm" -#include "yogstation\code\game\objects\effects\decals\crayon.dm" #include "yogstation\code\game\objects\effects\decals\turfdecal.dm" #include "yogstation\code\game\objects\effects\decals\turfdecal\markings.dm" #include "yogstation\code\game\objects\effects\decals\turfdecal\tilecoloring.dm" @@ -4199,7 +4184,6 @@ #include "yogstation\code\game\objects\items\holotool\holotool.dm" #include "yogstation\code\game\objects\items\holotool\modes.dm" #include "yogstation\code\game\objects\items\implants\implant_dusting.dm" -#include "yogstation\code\game\objects\items\implants\implant_gang.dm" #include "yogstation\code\game\objects\items\implants\implant_infiltrator.dm" #include "yogstation\code\game\objects\items\implants\implant_mindslave.dm" #include "yogstation\code\game\objects\items\implants\implant_teleporter.dm" @@ -4293,9 +4277,6 @@ #include "yogstation\code\modules\antagonists\darkspawn\darkspawn_upgrades\offensive_upgrades.dm" #include "yogstation\code\modules\antagonists\darkspawn\darkspawn_upgrades\passive_upgrades.dm" #include "yogstation\code\modules\antagonists\darkspawn\darkspawn_upgrades\utility_upgrades.dm" -#include "yogstation\code\modules\antagonists\gang\gang.dm" -#include "yogstation\code\modules\antagonists\gang\gang_datums.dm" -#include "yogstation\code\modules\antagonists\gang\gang_hud.dm" #include "yogstation\code\modules\antagonists\hijacked_ai\hijacked_ai.dm" #include "yogstation\code\modules\antagonists\infiltrator\infiltrator.dm" #include "yogstation\code\modules\antagonists\infiltrator\objectives.dm" diff --git a/yogstation/code/game/gamemodes/gangs/dominator.dm b/yogstation/code/game/gamemodes/gangs/dominator.dm deleted file mode 100644 index a547e09c032f..000000000000 --- a/yogstation/code/game/gamemodes/gangs/dominator.dm +++ /dev/null @@ -1,281 +0,0 @@ -#define DOM_BLOCKED_SPAM_CAP 6 -#define DOM_REQUIRED_TURFS 23 -#define DOM_HULK_HITS_REQUIRED 10 - -/obj/machinery/dominator - name = "dominator" - desc = "A visibly sinister device. Looks like you can break it if you hit it enough." - icon = 'icons/obj/machines/dominator.dmi' - icon_state = "dominator" - density = TRUE - anchored = TRUE - layer = HIGH_OBJ_LAYER - max_integrity = 300 - integrity_failure = 100 - move_resist = INFINITY - armor = list(MELEE = 20, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 10, ACID = 70) - var/datum/team/gang/gang - var/operating = FALSE //false=standby or broken, true=takeover - var/warned = FALSE //if this device has set off the warning at <3 minutes yet - var/spam_prevention = DOM_BLOCKED_SPAM_CAP //first message is immediate - var/datum/effect_system/spark_spread/spark_system - var/obj/effect/countdown/dominator/countdown - var/obj/item/disk/nuclear/nukedisk - -/obj/machinery/dominator/Initialize(mapload) - set_light(2) - GLOB.poi_list |= src - spark_system = new - spark_system.set_up(5, TRUE, src) - countdown = new(src) - update_appearance(UPDATE_ICON) - .=..() - -/obj/machinery/dominator/Destroy() - if(!(stat & BROKEN)) - set_broken() - GLOB.poi_list.Remove(src) - gang = null - QDEL_NULL(spark_system) - QDEL_NULL(countdown) - STOP_PROCESSING(SSmachines, src) - if(nukedisk) - nukedisk.forceMove(drop_location()) - nukedisk = null - return ..() - -/obj/machinery/dominator/emp_act(severity) - gang.domination_time += 3 * severity - ..() - -/obj/machinery/dominator/hulk_damage() - return (max_integrity - integrity_failure) / DOM_HULK_HITS_REQUIRED - -/obj/machinery/dominator/tesla_act(power, tesla_flags, shocked_targets, zap_gib = FALSE) - qdel(src) - -/obj/machinery/dominator/update_overlays() - . = ..() - if(stat & BROKEN) - return - if(operating) - var/mutable_appearance/dominator_overlay = mutable_appearance('icons/obj/machines/dominator.dmi', "dominator-overlay") - if(gang) - dominator_overlay.color = gang.color - . += dominator_overlay - if(atom_integrity/max_integrity < 0.66) - . += "damage" - -/obj/machinery/dominator/update_icon_state() - . = ..() - if(stat & BROKEN) - icon_state = "dominator-broken" - return - if(!operating) - icon_state = "dominator" - return - icon_state = "dominator-active" - -/obj/machinery/dominator/examine(mob/user) - . = ..() - if(stat & BROKEN) - return - - if(gang && gang.domination_time != NOT_DOMINATING) - if(gang.domination_time > world.time) - . += span_notice("Hostile Takeover in progress. Estimated [gang.domination_time_remaining()] seconds remain.") - else - . += span_notice("Hostile Takeover of [station_name()] successful. Have a great day.") - else - . += span_notice("System on standby.") - if(nukedisk) - . += span_notice("[nukedisk] seems to be stuck inside.") - . += span_danger("System Integrity: [round((atom_integrity/max_integrity)*100,1)]%") - -/obj/machinery/dominator/process() - ..() - if(gang && gang.domination_time != NOT_DOMINATING) - var/time_remaining = gang.domination_time_remaining() - if(time_remaining > 0) - if(excessive_walls_check()) - gang.domination_time += 20 - playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) - if(spam_prevention < DOM_BLOCKED_SPAM_CAP) - spam_prevention++ - else - gang.message_gangtools("Warning: There are too many walls around your gang's dominator, its signal is being blocked!") - say("Error: Takeover signal is currently blocked! There are too many walls within 2 standard units of this device.") - spam_prevention = 0 - return - . = TRUE - playsound(loc, 'sound/items/timer.ogg', 10, 0) - if(!warned && (time_remaining < 180)) - warned = TRUE - var/area/domloc = get_area(loc) - gang.message_gangtools("Less than 3 minutes remains in hostile takeover. Defend your dominator at [domloc.map_name]!") - for(var/G in GLOB.gangs) - var/datum/team/gang/tempgang = G - if(tempgang != gang) - tempgang.message_gangtools("WARNING: [gang.name] Gang takeover imminent. Their dominator at [domloc.map_name] must be destroyed!",1,1) - else - Cinematic(CINEMATIC_MALF,world) - gang.winner = TRUE - SSticker.force_ending = TRUE - - if(!.) - STOP_PROCESSING(SSmachines, src) - -/obj/machinery/dominator/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - if(damage_amount) - playsound(src, 'sound/effects/bang.ogg', 50, 1) - else - playsound(loc, 'sound/weapons/tap.ogg', 50, 1) - if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, 1) - -/obj/machinery/dominator/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = TRUE, attack_dir, armour_penetration = 0) - . = ..() - if(.) - if(atom_integrity/max_integrity > 0.66) - if(prob(damage_amount*2)) - spark_system.start() - else if(!(stat & BROKEN)) - spark_system.start() - update_appearance(UPDATE_ICON) - - -/obj/machinery/dominator/atom_break(damage_flag) - . = ..() - if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) - set_broken() - -/obj/machinery/dominator/deconstruct(disassembled = TRUE) - if(!(flags_1 & NODECONSTRUCT_1)) - if(!(stat & BROKEN)) - set_broken() - new /obj/item/stack/sheet/plasteel(src.loc) - qdel(src) - -/obj/machinery/dominator/attacked_by(obj/item/I, mob/living/user) - add_fingerprint(user) - ..() - -/obj/machinery/dominator/attack_hand(mob/user) - if(operating || (stat & BROKEN)) - examine(user) - return - - var/datum/team/gang/tempgang - - var/datum/antagonist/gang/GA = user.mind.has_antag_datum(/datum/antagonist/gang) - if(GA) - tempgang = GA.gang - if(!tempgang) - examine(user) - return - - if(tempgang.domination_time != NOT_DOMINATING) - to_chat(user, span_warning("Error: Hostile Takeover is already in progress.")) - return - - if(!tempgang.dom_attempts) - to_chat(user, span_warning("Error: Unable to breach station network. Firewall has logged our signature and is blocking all further attempts.")) - return - - if(!nukedisk) - to_chat(user, span_warning("Error: Nuclear Authentication Disk required to breach station network.")) - return - - var/time = round(tempgang.determine_domination_time()/60,0.1) - if(alert(user,"A takeover will require [time] minutes.\nYour gang will be unable to gain influence while it is active.\nThe entire station will likely be alerted to it once it starts.\nYou have [tempgang.dom_attempts] attempt(s) remaining. Are you ready?","Confirm","Ready","Later") == "Ready") - if((tempgang.domination_time != NOT_DOMINATING) || !tempgang.dom_attempts || !in_range(src, user) || !isturf(loc)) - return 0 - - var/area/A = get_area(loc) - var/locname = A.map_name - - gang = tempgang - gang.dom_attempts -- - priority_announce("Network breach detected in [locname]. The [gang.name] Gang is attempting to seize control of the station!","Network Alert") - gang.domination() - SSshuttle.registerHostileEnvironment(src) - name = "[gang.name] Gang [name]" - operating = TRUE - update_appearance(UPDATE_ICON) - - countdown.color = gang.color - countdown.start() - - set_light(3) - START_PROCESSING(SSmachines, src) - - gang.message_gangtools("Hostile takeover in progress: Estimated [time] minutes until victory.[gang.dom_attempts ? "" : " This is your final attempt."]") - for(var/G in GLOB.gangs) - var/datum/team/gang/vagos = G - if(vagos != gang) - vagos.message_gangtools("Enemy takeover attempt detected in [locname]: Estimated [time] minutes until our defeat.",1,1) - -/obj/machinery/dominator/proc/excessive_walls_check() // why the fuck was this even a global proc... - var/open = FALSE - for(var/turf/T in view(2, src)) - if(!isclosedturf(T)) - open++ - if(open < DOM_REQUIRED_TURFS) - return TRUE - else - return FALSE - -/obj/machinery/dominator/proc/set_broken() - if(gang) - gang.domination_time = NOT_DOMINATING - - var/takeover_in_progress = FALSE - for(var/G in GLOB.gangs) - var/datum/team/gang/ballas = G - if(ballas.domination_time != NOT_DOMINATING) - takeover_in_progress = TRUE - break - if(!takeover_in_progress) - var/was_stranded = SSshuttle.emergency.mode == SHUTTLE_STRANDED - SSshuttle.clearHostileEnvironment(src) - if(!was_stranded) - priority_announce("All hostile activity within station systems has ceased.","Network Alert") - - if(SSsecurity_level.get_current_level_as_text() == SEC_LEVEL_DELTA) - SSsecurity_level.set_level(SEC_LEVEL_RED) - - gang.message_gangtools("Hostile takeover cancelled: Dominator is no longer operational.[gang.dom_attempts ? " You have [gang.dom_attempts] attempt remaining." : " The station network will have likely blocked any more attempts by us."]",1,1) - - set_light(0) - operating = FALSE - stat |= BROKEN - update_appearance(UPDATE_ICON) - STOP_PROCESSING(SSmachines, src) - if(nukedisk) - nukedisk.forceMove(drop_location()) - nukedisk = null - -/obj/machinery/dominator/attackby(obj/item/I, mob/user, params) - if (istype(I, /obj/item/disk/nuclear)) - if(!disk_check(I)) - return - if(!user.transferItemToLoc(I, src)) - return - nukedisk = I - add_fingerprint(user) - return - - .=..() - -/obj/machinery/dominator/proc/disk_check(obj/item/disk/nuclear/D) - if(D.fake) - say("Authentication failure; disk not recognised.") - return FALSE - else - return TRUE - -#undef DOM_BLOCKED_SPAM_CAP -#undef DOM_REQUIRED_TURFS -#undef DOM_HULK_HITS_REQUIRED diff --git a/yogstation/code/game/gamemodes/gangs/gang_items.dm b/yogstation/code/game/gamemodes/gangs/gang_items.dm deleted file mode 100644 index 9027cf043650..000000000000 --- a/yogstation/code/game/gamemodes/gangs/gang_items.dm +++ /dev/null @@ -1,395 +0,0 @@ -/datum/gang_item - var/name - var/item_path - var/cost - var/weapon_cost - var/spawn_msg - var/category - var/list/gang_whitelist = list() - var/list/gang_blacklist = list() - var/id - -/datum/gang_item/proc/purchase(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool, check_canbuy = TRUE) - if(check_canbuy && !can_buy(user, gang, gangtool)) - return FALSE - var/real_cost = get_cost(user, gang, gangtool) - if(!spawn_item(user, gang, gangtool)) - gang.adjust_influence(-real_cost) - to_chat(user, span_notice("You bought \the [name].")) - return TRUE - -/datum/gang_item/proc/weapon_purchase(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool, check_canbuy_weapon = TRUE) - if(check_canbuy_weapon && !can_buy_weapon(user, gang, gangtool)) - return FALSE - var/actual_cost = get_weapon_cost(user, gang, gangtool) - if(!spawn_item(user, gang, gangtool)) - gang.adjust_uniform_influence(-actual_cost) - to_chat(user, span_notice("You bought \the [name].")) - return TRUE - -/datum/gang_item/proc/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) // If this returns anything other than null, something fucked up and influence won't lower. - if(item_path) - var/obj/item/O = new item_path(user.loc) - user.put_in_hands(O) - else - return TRUE - if(spawn_msg) - to_chat(user, spawn_msg) - -/datum/gang_item/proc/can_buy(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - return gang && (gang.influence >= get_cost(user, gang, gangtool)) && can_see(user, gang, gangtool) - -/datum/gang_item/proc/can_buy_weapon(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - return gang && (gang.uniform_influence >= get_weapon_cost(user, gang, gangtool)) && can_see(user, gang, gangtool) - -/datum/gang_item/proc/can_see(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - return TRUE - -/datum/gang_item/proc/get_cost(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - return cost - -/datum/gang_item/proc/get_weapon_cost(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - return weapon_cost - -/datum/gang_item/proc/get_cost_display(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - return "([get_cost(user, gang, gangtool)] Influence)" - -/datum/gang_item/proc/get_weapon_cost_display(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - return "([get_weapon_cost(user, gang, gangtool)] Supply)" - -/datum/gang_item/proc/get_name_display(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - return name - -/datum/gang_item/proc/get_extra_info(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - return - -/////////////////// -//CLOTHING -/////////////////// - -/datum/gang_item/clothing - category = "Purchase Gang Clothes (Only the jumpsuit and suit give you added influence):" - -/datum/gang_item/clothing/under - name = "Gang Uniform" - id = "under" - cost = 1 - -/datum/gang_item/clothing/under/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - if(gang.inner_outfits.len) - var/outfit = pick(gang.inner_outfits) - if(outfit) - var/obj/item/O = new outfit(user.loc) - user.put_in_hands(O) - to_chat(user, " This is your gang's official uniform, wearing it will increase your influence") - return - return TRUE - -/datum/gang_item/clothing/suit - name = "Gang Armored Outerwear" - id = "suit" - cost = 1 - -/datum/gang_item/clothing/suit/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - if(gang.outer_outfits.len) - var/outfit = pick(gang.outer_outfits) - if(outfit) - var/obj/item/O = new outfit(user.loc) - O.armor = O.armor.setRating(melee = 20, bullet = 35, laser = 10, energy = 10, bomb = 30, bio = 0, rad = 0, fire = 30, acid = 30) - O.desc += " Tailored for the [gang.name] Gang to offer the wearer moderate protection against ballistics and physical trauma." - user.put_in_hands(O) - to_chat(user, " This is your gang's official outerwear, wearing it will increase your influence") - return - return TRUE - - -/datum/gang_item/clothing/hat - name = "Pimp Hat" - id = "hat" - cost = 16 - item_path = /obj/item/clothing/head/collectable/petehat/gang - - -/obj/item/clothing/head/collectable/petehat/gang - name = "pimpin' hat" - desc = "The undisputed king of style." - -/datum/gang_item/clothing/mask - name = "Golden Death Mask" - id = "mask" - cost = 18 - item_path = /obj/item/clothing/mask/gskull - -/obj/item/clothing/mask/gskull - name = "golden death mask" - icon_state = "gskull" - desc = "Strike terror, and envy, into the hearts of your enemies." - -/datum/gang_item/clothing/shoes - name = "Bling Boots" - id = "boots" - cost = 22 - item_path = /obj/item/clothing/shoes/gang - -/obj/item/clothing/shoes/gang - name = "blinged-out boots" - desc = "Stand aside peasants." - icon_state = "bling" - -/datum/gang_item/clothing/neck - name = "Gold Necklace" - id = "necklace" - cost = 9 - item_path = /obj/item/clothing/neck/necklace/dope - -/datum/gang_item/clothing/hands - name = "Decorative Brass Knuckles" - id = "hand" - cost = 11 - item_path = /obj/item/clothing/gloves/gang - -/obj/item/clothing/gloves/gang - name = "braggadocio's brass knuckles" - desc = "Purely decorative, don't find out the hard way." - icon_state = "knuckles" - w_class = 3 - -/datum/gang_item/clothing/belt - name = "Badass Belt" - id = "belt" - cost = 13 - item_path = /obj/item/storage/belt/military/gang - -/obj/item/storage/belt/military/gang - name = "badass belt" - icon_state = "gangbelt" - item_state = "gang" - desc = "The belt buckle simply reads 'BAMF'." - -/////////////////// -//WEAPONS -/////////////////// - -/datum/gang_item/weapon - category = "Purchase Weapons:" - -/datum/gang_item/weapon/ammo - -/datum/gang_item/weapon/shuriken - name = "Shuriken" - id = "shuriken" - weapon_cost = 3 - item_path = /obj/item/throwing_star - -/datum/gang_item/weapon/switchblade - name = "Switchblade" - id = "switchblade" - weapon_cost = 5 - item_path = /obj/item/switchblade - -/datum/gang_item/weapon/surplus - name = "Surplus Carbine" - id = "surplus" - weapon_cost = 8 - item_path = /obj/item/gun/ballistic/automatic/surplus - -/datum/gang_item/weapon/ammo/surplus_ammo - name = "Surplus Carbine Ammo" - id = "surplus_ammo" - weapon_cost = 5 - item_path = /obj/item/ammo_box/magazine/m10mm/rifle - -/datum/gang_item/weapon/improvised - name = "Sawn-Off Improvised Shotgun" - id = "sawn" - weapon_cost = 6 - item_path = /obj/item/gun/ballistic/shotgun/doublebarrel/improvised/sawn - -/datum/gang_item/weapon/ammo/improvised_ammo - name = "Box of Buckshot" - id = "buckshot" - weapon_cost = 5 - item_path = /obj/item/storage/box/lethalshot - -/datum/gang_item/weapon/pistol - name = "10mm Pistol" - id = "pistol" - weapon_cost = 30 - item_path = /obj/item/gun/ballistic/automatic/pistol - -/datum/gang_item/weapon/ammo/pistol_ammo - name = "10mm Ammo" - id = "pistol_ammo" - weapon_cost = 10 - item_path = /obj/item/ammo_box/magazine/m10mm - -/datum/gang_item/weapon/uzi - name = "Uzi SMG" - id = "uzi" - weapon_cost = 60 - item_path = /obj/item/gun/ballistic/automatic/mini_uzi - -/datum/gang_item/weapon/ammo/uzi_ammo - name = "Uzi Ammo" - id = "uzi_ammo" - weapon_cost = 40 - item_path = /obj/item/ammo_box/magazine/uzim9mm - -/////////////////// -//EQUIPMENT -/////////////////// - -/datum/gang_item/equipment - category = "Purchase Equipment:" - - -/datum/gang_item/equipment/spraycan - name = "Territory Spraycan" - id = "spraycan" - cost = 5 - item_path = /obj/item/toy/crayon/spraycan/gang - -/datum/gang_item/equipment/spraycan/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - var/obj/item/O = new item_path(user.loc, gang) - user.put_in_hands(O) - -/datum/gang_item/equipment/pinpointer - name = "Pinpointer" - id = "pinpointer" - cost = 2 - item_path = /obj/item/pinpointer/nuke - -/datum/gang_item/equipment/sharpener - name = "Sharpener" - id = "whetstone" - cost = 3 - item_path = /obj/item/sharpener - - -/datum/gang_item/equipment/emp - name = "EMP Grenade" - id = "EMP" - cost = 5 - item_path = /obj/item/grenade/empgrenade - -/datum/gang_item/equipment/c4 - name = "C4 Explosive" - id = "c4" - cost = 7 - item_path = /obj/item/grenade/plastic/c4 - -/datum/gang_item/equipment/frag - name = "Fragmentation Grenade" - id = "frag nade" - cost = 18 - item_path = /obj/item/grenade/syndieminibomb/concussion/frag - -/datum/gang_item/equipment/force_converter - name = "Force Converter" - id = "force_converter" - cost = 20 - item_path = /obj/item/implanter/gang - spawn_msg = span_notice("The force converter is a single-use device that converts enemy gangsters.") - -/datum/gang_item/equipment/force_converter/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - var/obj/item/O = new item_path(user.loc, gang) - user.put_in_hands(O) - - -/datum/gang_item/equipment/wetwork_boots - name = "Wetwork boots" - id = "wetwork" - cost = 20 - item_path = /obj/item/clothing/shoes/combat/gang - -/obj/item/clothing/shoes/combat/gang - name = "Wetwork boots" - desc = "A gang's best hitmen are prepared for anything." - armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 100, RAD = 0, FIRE = 70, ACID = 50) - clothing_flags = NOSLIP - -/datum/gang_item/equipment/pen - name = "Recruitment Pen" - id = "pen" - cost = 25 - item_path = /obj/item/pen/gang - spawn_msg = span_notice("More recruitment pens will allow you to recruit gangsters faster. Only gang leaders can recruit with pens.") - -/datum/gang_item/equipment/pen/purchase(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - if(..()) - gangtool.free_pen = FALSE - return TRUE - return FALSE - -/datum/gang_item/equipment/pen/get_cost(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - if(gangtool && gangtool.free_pen) - return 0 - return ..() - -/datum/gang_item/equipment/pen/get_cost_display(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - if(gangtool && gangtool.free_pen) - return "(GET ONE FREE)" - return ..() - - -/datum/gang_item/equipment/gangtool - id = "gangtool" - cost = 10 - -/datum/gang_item/equipment/gangtool/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - var/item_type - if(gang) - item_type = /obj/item/gangtool/spare/lt - if(gang.leaders.len < MAX_LEADERS_GANG) - to_chat(user, span_notice("Gangtools allow you to promote a gangster to be your Lieutenant, enabling them to recruit and purchase items like you. Simply have them register the gangtool. You may promote up to [MAX_LEADERS_GANG-gang.leaders.len] more Lieutenants")) - else - item_type = /obj/item/gangtool/spare - var/obj/item/gangtool/spare/tool = new item_type(user.loc) - user.put_in_hands(tool) - -/datum/gang_item/equipment/gangtool/get_name_display(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - if(gang && (gang.leaders.len < gang.max_leaders)) - return "Promote a Gangster" - return "Spare Gangtool" - -/datum/gang_item/equipment/dominator - name = "Station Dominator" - id = "dominator" - cost = 30 - item_path = /obj/machinery/dominator - spawn_msg = span_notice("The dominator will secure your gang's dominance over the station. Turn it on when you are ready to defend it.") - -/datum/gang_item/equipment/dominator/can_buy(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - if(!gang || !gang.dom_attempts) - return FALSE - return ..() - -/datum/gang_item/equipment/dominator/get_name_display(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - if(!gang || !gang.dom_attempts) - return ..() - return "[..()]" - -/datum/gang_item/equipment/dominator/get_cost_display(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - if(!gang || !gang.dom_attempts) - return "(Out of stock)" - return ..() - -/datum/gang_item/equipment/dominator/get_extra_info(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - if(gang) - return "This device requires a 5x5 area clear of walls to work. (Estimated Takeover Time: [round(gang.determine_domination_time()/60,0.1)] minutes)" - -/datum/gang_item/equipment/dominator/purchase(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - var/area/userarea = get_area(user) - if(!(userarea.type in gang.territories|gang.new_territories)) - to_chat(user,span_warning("The dominator can only be bought in territory controlled by your gang!")) - return FALSE - for(var/obj/obj in get_turf(user)) - if(obj.density) - to_chat(user, span_warning("There's not enough room here!")) - return FALSE - - return ..() - -/datum/gang_item/equipment/dominator/spawn_item(mob/living/carbon/user, datum/team/gang/gang, obj/item/gangtool/gangtool) - new item_path(user.loc) - to_chat(user, spawn_msg) diff --git a/yogstation/code/game/gamemodes/gangs/gang_pen.dm b/yogstation/code/game/gamemodes/gangs/gang_pen.dm deleted file mode 100644 index 582eff8d205c..000000000000 --- a/yogstation/code/game/gamemodes/gangs/gang_pen.dm +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Gang Boss Pens - */ -/obj/item/pen/gang - var/cooldown - -/obj/item/pen/gang/attack(mob/living/M, mob/user, stealth = TRUE) - if(!istype(M)) - return - if(!ishuman(M) || !ishuman(user) || M.stat == DEAD) - return ..() - var/datum/antagonist/gang/boss/L = user.mind.has_antag_datum(/datum/antagonist/gang/boss) - if(!L) - return ..() - if(!..()) - return - if(cooldown) - to_chat(user, span_warning("[src] needs more time to recharge before it can be used.")) - return - if(!M.client || !M.mind) - to_chat(user, span_warning("A braindead gangster is an useless gangster!")) - return - var/datum/team/gang/gang = L.gang - if(!add_gangster(user, gang, M.mind)) - return - cooldown = TRUE - icon_state = "pen_blink" - var/cooldown_time = 600/gang.leaders.len - addtimer(CALLBACK(src, PROC_REF(cooldown)), cooldown_time) - -/obj/item/pen/gang/proc/cooldown() - cooldown = FALSE - icon_state = "pen" - var/mob/M = loc - if(istype(M)) - to_chat(M, span_notice("[icon2html(src, M)] [src] vibrates softly. It is ready to be used again.")) - -/obj/item/pen/gang/proc/add_gangster(mob/user, datum/team/gang/gang, datum/mind/gangster_mind, check = TRUE) // Basically a wrapper to add_antag_datum. - var/datum/antagonist/dudegang = gangster_mind.has_antag_datum(/datum/antagonist/gang) - if(dudegang) - if(dudegang == gang) - to_chat(user, span_danger("This mind is already controlled by your gang!")) - return - to_chat(user, span_danger("This mind is already controlled by someone else!")) - return - if(check && HAS_TRAIT(gangster_mind.current, TRAIT_MINDSHIELD)) //Check to see if the potential gangster is implanted - to_chat(user, span_danger("This mind is too strong to control!")) - return - var/mob/living/carbon/human/H = gangster_mind.current // we are sure the dude's human cause it's checked in attack() - H.silent = max(H.silent, 5) - H.Knockdown(100) - if(is_banned_from(gangster_mind.current.ckey, ROLE_GANG)) - INVOKE_ASYNC(src, TYPE_PROC_REF(/datum/game_mode, replace_jobbaned_player), gangster_mind.current, ROLE_GANG, ROLE_GANG) // will gangster_mind point to the new dude's mind? dunno honestly, i hope it does - gangster_mind.add_antag_datum(/datum/antagonist/gang, gang) - return TRUE diff --git a/yogstation/code/game/gamemodes/gangs/gangs.dm b/yogstation/code/game/gamemodes/gangs/gangs.dm deleted file mode 100644 index c1cd34e2a966..000000000000 --- a/yogstation/code/game/gamemodes/gangs/gangs.dm +++ /dev/null @@ -1,97 +0,0 @@ -//gang.dm -//Gang War Game Mode -GLOBAL_LIST_INIT(possible_gangs, subtypesof(/datum/team/gang)) -GLOBAL_LIST_EMPTY(gangs) -/datum/game_mode/gang - name = "gang war" - config_tag = "gang" - antag_flag = ROLE_GANG - restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Brig Physician", "Synthetic") //Added Brig Physician - required_players = 35 - required_enemies = 1 - recommended_enemies = 2 - enemy_minimum_age = 14 - title_icon = "gang" - - announce_span = "danger" - announce_text = "A violent turf war has erupted on the station!\n\ - Gangsters: Take over the station with a dominator.\n\ - Crew: Prevent the gangs from expanding and initiating takeover." - - var/list/datum/mind/gangboss_candidates = list() - -/datum/game_mode/gang/pre_setup() - if(CONFIG_GET(flag/protect_roles_from_antagonist)) - restricted_jobs += protected_jobs - - if(CONFIG_GET(flag/protect_assistant_from_antagonist)) - restricted_jobs += "Assistant" - - //Spawn more bosses depending on server population - var/gangs_to_create = 4 - if(prob(num_players()) && num_players() > 1.5*required_players) - gangs_to_create++ - if(prob(num_players()) && num_players() > 2*required_players) - gangs_to_create++ - gangs_to_create = min(gangs_to_create, GLOB.possible_gangs.len) - - for(var/i in 1 to gangs_to_create) - if(!antag_candidates.len) - break - - //Now assign a boss for the gang - var/datum/mind/boss = antag_pick(antag_candidates) - antag_candidates -= boss - gangboss_candidates += boss - boss.special_role = ROLE_GANG - boss.restricted_roles = restricted_jobs - - if(gangboss_candidates.len < 1) //Need at least one gangs - return - - return TRUE - -/datum/game_mode/gang/post_setup() - ..() - for(var/i in gangboss_candidates) - var/datum/mind/M = i - var/datum/antagonist/gang/boss/B = new() - M.add_antag_datum(B) - B.equip_gang() - -/proc/is_gangster(mob/M) // Gangster Checks - return M?.mind?.has_antag_datum(/datum/antagonist/gang) - -/proc/is_gang_boss(mob/M) - return M?.mind?.has_antag_datum(/datum/antagonist/gang/boss) - -/datum/game_mode/gang/generate_credit_text() - var/list/round_credits = list() - var/len_before_addition - - for(var/datum/team/gang/G in GLOB.gangs) - round_credits += "

The [G.name] Gang:

" - len_before_addition = round_credits.len - for(var/datum/mind/boss in G.leaders) - round_credits += "

[boss.name] as a [G.name] Gang leader

" - for(var/datum/mind/gangster in (G.members - G.leaders)) - round_credits += "

[gangster.name] as a [G.name] gangster

" - if(len_before_addition == round_credits.len) - round_credits += list("

The [G.name] Gang was wiped out!

", "

The competition was too tough!

") - round_credits += "
" - - round_credits += ..() - return round_credits - -/datum/game_mode/gang/set_round_result() - ..() - var/didGangsWin = FALSE - for(var/datum/team/gang/G in GLOB.gangs) - if(G.winner) - didGangsWin = TRUE - break - - if(didGangsWin) - SSticker.mode_result = "win - gangs dominated the station" - else - SSticker.mode_result = "loss - security stopped gangs from dominating the station" diff --git a/yogstation/code/game/gamemodes/gangs/gangtool.dm b/yogstation/code/game/gamemodes/gangs/gangtool.dm deleted file mode 100644 index 39d69b0e1d11..000000000000 --- a/yogstation/code/game/gamemodes/gangs/gangtool.dm +++ /dev/null @@ -1,277 +0,0 @@ -//gangtool device -/obj/item/gangtool - name = "suspicious device" - desc = "A strange device of sorts. Hard to really make out what it actually does if you don't know how to operate it." - icon = 'yogstation/icons/obj/device.dmi' - icon_state = "gangtool" - item_state = "radio" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - throwforce = 0 - w_class = WEIGHT_CLASS_TINY - throw_speed = 3 - throw_range = 7 - flags_1 = CONDUCT_1 - var/datum/team/gang/gang //Which gang uses this? - var/recalling = FALSE - var/outfits = 2 - var/free_pen = FALSE - var/promotable = FALSE - var/static/list/buyable_items = list() - var/list/tags = list() - -/obj/item/gangtool/Initialize(mapload) - update_appearance(UPDATE_ICON) - if(buyable_items.len) - return ..() - for(var/i in subtypesof(/datum/gang_item)) - var/datum/gang_item/G = i - var/id = initial(G.id) - var/cat = initial(G.category) - if(id) - if(!islist(buyable_items[cat])) - buyable_items[cat] = list() - buyable_items[cat][id] = new G - .=..() - -/obj/item/gangtool/Destroy() - if(gang) - gang.gangtools -= src - return ..() - -/obj/item/gangtool/attack_self(mob/user) - ..() - if (!can_use(user)) - return - var/datum/antagonist/gang/boss/L = user.mind.has_antag_datum(/datum/antagonist/gang/boss) - var/dat - if(!gang) - dat += "This device is not registered.

" - if(L) - if(promotable && L.gang.leaders.len < L.gang.max_leaders) - dat += "Give this device to another member of your organization to use to promote them to Lieutenant.

" - dat += "If this is meant as a spare device for yourself:
" - dat += "Register Device as Spare
" - else if(promotable) - var/datum/antagonist/gang/sweet = user.mind.has_antag_datum(/datum/antagonist/gang) - if(sweet && sweet.gang.leaders.len < sweet.gang.max_leaders) - dat += "You have been selected for a promotion!
" - dat += "Accept Promotion
" - else - dat += "No promotions available: All positions filled.
" - else - dat += "This device is not authorized to promote.
" - else - if(gang.domination_time != NOT_DOMINATING) - dat += "
Takeover In Progress:
[DisplayTimeText(gang.domination_time_remaining() * 10)] remain
" - - dat += "Registration: [gang.name] Gang Boss
" - dat += "Organization Size: [gang.members.len] | Station Control: [gang.territories.len] territories under control. | Influence: [gang.influence] | Supply: [gang.uniform_influence]
" - dat += "Time until Influence grows: [time2text(gang.next_point_time - world.time, "mm:ss")]
" - dat += "Send message to Gang
" - dat += "Recall shuttle
" - dat += "
" - for(var/cat in buyable_items) - dat += "[cat]
" - for(var/id in buyable_items[cat]) - var/datum/gang_item/G = buyable_items[cat][id] - if(!G.can_see(user, gang, src)) - continue - if(G.category != "Purchase Weapons:") - var/cost = G.get_cost_display(user, gang, src) - if(cost) - dat += cost + " " - - var/toAdd = G.get_name_display(user, gang, src) - if(G.can_buy(user, gang, src)) - toAdd = "[toAdd]" - dat += toAdd - dat += "
" - else if(G.category == "Purchase Weapons:") - var/weapon_cost = G.get_weapon_cost_display(user, gang, src) - if(weapon_cost) - dat += weapon_cost + " " - - var/toAdd = G.get_name_display(user, gang, src) - if(G.can_buy_weapon(user, gang, src)) - toAdd = "[toAdd]" - dat += toAdd - dat += "
" - var/extra = G.get_extra_info(user, gang, src) - if(extra) - dat += "
[extra]" - dat += "
" - - dat += "Refresh
" - - var/datum/browser/popup = new(user, "gangtool", "Welcome to GangTool v4.0", 340, 625) - popup.set_content(dat) - popup.open() - -/obj/item/gangtool/Topic(href, href_list) - if(!can_use(usr)) - return - - add_fingerprint(usr) - - if(href_list["register"]) - register_device(usr) - - else if(!gang) //Gangtool must be registered before you can use the functions below - return - - if(href_list["purchase"]) - if(islist(buyable_items[href_list["cat"]])) - var/list/L = buyable_items[href_list["cat"]] - var/datum/gang_item/G = L[href_list["id"]] - if(G && G.can_buy(usr, gang, src)) - G.purchase(usr, gang, src, FALSE) - if(href_list["weapon_purchase"]) - if(islist(buyable_items[href_list["cat"]])) - var/list/L = buyable_items[href_list["cat"]] - var/datum/gang_item/G = L[href_list["id"]] - if(G && G.can_buy_weapon(usr, gang, src)) - G.weapon_purchase(usr, gang, src, FALSE) - if(href_list["commute"]) - ping_gang(usr) - if(href_list["recall"]) - recall(usr) - attack_self(usr) - -/obj/item/gangtool/update_overlays() - . = ..() - var/image/I = new(icon, "[icon_state]-overlay") - if(gang) - I.color = gang.color - . += I - -/obj/item/gangtool/proc/ping_gang(mob/user) - if(!can_use(user)) - return - var/message = stripped_input(user,"Discreetly send a gang-wide message.","Send Message") - if(!message || !can_use(user)) - return - if(!is_station_level(user.z)) - to_chat(user, span_info("[icon2html(src, user)]Error: Station out of range.")) - return - if(gang.members.len) - var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang) - if(!G) - return - var/ping = span_danger("[gang.name] [G.message_name] [user.real_name]: [message]") - for(var/datum/mind/ganger in gang.members) - if(ganger.current && is_station_level(ganger.current.z) && (ganger.current.stat == CONSCIOUS)) - to_chat(ganger.current, ping) - for(var/mob/M in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(M, user) - to_chat(M, "[link] [ping]") - user.log_talk(message,LOG_SAY, tag="[gang.name] gangster") - -/obj/item/gangtool/proc/register_device(mob/user) - if(gang) //It's already been registered! - return - var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang) - if(G) - gang = G.gang - gang.gangtools += src - update_appearance(UPDATE_ICON) - if(!(user.mind in gang.leaders) && promotable) - G.promote() - free_pen = TRUE - gang.message_gangtools("[user] has been promoted to Lieutenant.") - to_chat(user, "The Gangtool you registered will allow you to purchase weapons and equipment, and send messages to your gang.") - to_chat(user, "Unlike regular gangsters, you may use recruitment pens to add recruits to your gang. Use them on unsuspecting crew members to recruit them. Don't forget to get your one free pen from the gangtool.") - else - to_chat(user, span_warning("ACCESS DENIED: Unauthorized user.")) - -/obj/item/gangtool/proc/recall(mob/user) - if(!recallchecks(user)) - return - if(recalling) - to_chat(user, span_warning("Error: Recall already in progress.")) - return - gang.message_gangtools("[user] is attempting to recall the emergency shuttle.") - recalling = TRUE - to_chat(user, span_info("[icon2html(src, loc)]Generating shuttle recall order with codes retrieved from last call signal...")) - addtimer(CALLBACK(src, PROC_REF(recall2), user), rand(100,300)) - -/obj/item/gangtool/proc/recall2(mob/user) - if(!recallchecks(user)) - return - to_chat(user, span_info("[icon2html(src, loc)]Shuttle recall order generated. Accessing station long-range communication arrays...")) - addtimer(CALLBACK(src, PROC_REF(recall3), user), rand(100,300)) - -/obj/item/gangtool/proc/recall3(mob/user) - if(!recallchecks(user)) - return - var/list/living_crew = list()//shamelessly copied from mulligan code, there should be a helper for this - for(var/mob/Player in GLOB.player_list) - if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) && !isbrain(Player) && Player.client) - living_crew += Player - var/malc = CONFIG_GET(number/midround_antag_life_check) - if(living_crew.len / GLOB.joined_player_list.len <= malc) //Shuttle cannot be recalled if too many people died - to_chat(user, span_warning("[icon2html(src, user)]Error: Station communication systems compromised. Unable to establish connection.")) - recalling = FALSE - return - to_chat(user, span_info("[icon2html(src, loc)]Comm arrays accessed. Broadcasting recall signal...")) - addtimer(CALLBACK(src, PROC_REF(recallfinal), user), rand(100,300)) - -/obj/item/gangtool/proc/recallfinal(mob/user) - if(!recallchecks(user)) - return - recalling = FALSE - log_game("[key_name(user)] has tried to recall the shuttle with a gangtool.") - message_admins("[key_name_admin(user)] has tried to recall the shuttle with a gangtool.", 1) - if(SSshuttle.cancelEvac(user)) - gang.recalls-- - return TRUE - - to_chat(user, span_info("[icon2html(src, loc)]No response received. Emergency shuttle cannot be recalled at this time.")) - return - -/obj/item/gangtool/proc/recallchecks(mob/user) - if(!can_use(user)) - return - if(SSshuttle.emergency_no_recall) - return - if(!is_station_level(user.z)) //Shuttle can only be recalled while on station - to_chat(user, span_warning("[icon2html(src, user)]Error: Device out of range of station communication arrays.")) - recalling = FALSE - return - if(!gang.recalls) - to_chat(user, span_warning("Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.")) - return - if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station - to_chat(user, span_warning("[icon2html(src, user)]Emergency shuttle cannot be recalled at this time.")) - recalling = FALSE - return - if(!gang.dom_attempts) - to_chat(user, span_warning("[icon2html(src, user)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.")) - recalling = FALSE - return - return TRUE - -/obj/item/gangtool/proc/can_use(mob/living/carbon/human/user) - if(!istype(user)) - return - if(user.incapacitated()) - return - if(!(src in user.contents)) - return - if(!user.mind) - return - var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang) - if(!G) - to_chat(user, span_notice("Huh, what's this?")) - return - if(!isnull(gang) && G.gang != gang) - to_chat(user, span_danger("You cannot use gang tools owned by enemy gangs!")) - return - return TRUE - - -/obj/item/gangtool/spare - outfits = TRUE - -/obj/item/gangtool/spare/lt - promotable = TRUE diff --git a/yogstation/code/game/objects/effects/countdown.dm b/yogstation/code/game/objects/effects/countdown.dm deleted file mode 100644 index 0e2b67b84db6..000000000000 --- a/yogstation/code/game/objects/effects/countdown.dm +++ /dev/null @@ -1,13 +0,0 @@ -/obj/effect/countdown/dominator - name = "dominator countdown" - text_size = 1 - color = "#ff00ff" // Overwritten when the dominator starts - -/obj/effect/countdown/dominator/get_value() - var/obj/machinery/dominator/D = attached_to - if(!istype(D)) - return - else if(D.gang && D.gang.domination_time != NOT_DOMINATING) - return D.gang.domination_time_remaining() - else - return "OFFLINE" \ No newline at end of file diff --git a/yogstation/code/game/objects/effects/decals/crayon.dm b/yogstation/code/game/objects/effects/decals/crayon.dm deleted file mode 100644 index 1069b7423876..000000000000 --- a/yogstation/code/game/objects/effects/decals/crayon.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/effect/decal/cleanable/crayon/Initialize(mapload, main, type, e_name, graf_rot, alt_icon = null) - if(type == "poseur tag") - var/datum/team/gang/gang = pick(subtypesof(/datum/team/gang)) - var/gangname = initial(gang.name) - icon = 'yogstation/icons/effects/crayondecal.dmi' - icon_state = "[gangname]" - type = null - .=..() - -/obj/effect/decal/cleanable/crayon/gang - icon = 'yogstation/icons/effects/crayondecal.dmi' - layer = ABOVE_NORMAL_TURF_LAYER //Harder to hide - plane = GAME_PLANE - do_icon_rotate = FALSE //These are designed to always face south, so no rotation please. - var/datum/team/gang/gang - -/obj/effect/decal/cleanable/crayon/gang/Initialize(mapload, datum/team/gang/G, e_name = "gang tag", rotation = 0, mob/user) - if(!G) - return INITIALIZE_HINT_QDEL - gang = G - var/newcolor = G.color - var/area/territory = get_area(src) - icon_state = G.name - G.new_territories |= list(territory.type = territory.name) - //If this isn't tagged by a specific gangster there's no bonus income. - .=..(mapload, newcolor, icon_state, e_name, rotation) - -/obj/effect/decal/cleanable/crayon/gang/Destroy() - if(gang) - var/area/territory = get_area(src) - gang.territories -= territory.type - gang.new_territories -= territory.type - gang.lost_territories |= list(territory.type = territory.name) - gang = null - return ..() diff --git a/yogstation/code/game/objects/items/crayons.dm b/yogstation/code/game/objects/items/crayons.dm index cd9fa6acb177..3a7430e620fa 100644 --- a/yogstation/code/game/objects/items/crayons.dm +++ b/yogstation/code/game/objects/items/crayons.dm @@ -5,103 +5,6 @@ #define RANDOM_RUNE "Random Rune" #define RANDOM_ANY "Random Anything" -/obj/item/toy/crayon - var/datum/team/gang/gang //For marking territory, spraycans are gang-locked to their initial gang due to colors - -/obj/item/toy/crayon/proc/hippie_gang_check(mob/user, atom/target) // hooked into afterattack - var/gang_mode = FALSE - if(gang && user.mind) - var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang) - if(G) - if(G.gang != gang) - to_chat(user, span_danger("This spraycan's color isn't your gang's one! You cannot use it.")) - return FALSE - gang_mode = TRUE - instant = FALSE - . = "gang graffiti" - // discontinue if we're not in gang modethe area isn't valid for tagging because gang "honour" - if(gang_mode && (!can_claim_for_gang(user, target))) - return FALSE - return TRUE - -/obj/item/toy/crayon/proc/gang_final(mob/user, atom/target, list/affected_turfs) // hooked into afterattack - // Double check it wasn't tagged in the meanwhile - if(!can_claim_for_gang(user, target)) - return TRUE - tag_for_gang(user, target) - affected_turfs += target - -/obj/item/toy/crayon/proc/can_claim_for_gang(mob/user, atom/target) - // Check area validity. - // Reject space, player-created areas, and non-station z-levels. - var/area/A = get_area(target) - if(!A || (!is_station_level(A.z)) || !A.valid_territory) - to_chat(user, span_warning("[A] is unsuitable for tagging.")) - return FALSE - - var/spraying_over = FALSE - for(var/G in target) - var/obj/effect/decal/cleanable/crayon/gang/gangtag = G - if(istype(gangtag)) - var/datum/antagonist/gang/GA = user.mind.has_antag_datum(/datum/antagonist/gang) - if(gangtag.gang != GA.gang) - spraying_over = TRUE - break - - for(var/obj/machinery/power/apc in target) - to_chat(user, span_warning("You can't tag an APC.")) - return FALSE - - var/occupying_gang = territory_claimed(A, user) - if(occupying_gang && !spraying_over) - to_chat(user, span_danger("[A] has already been tagged by the [occupying_gang] gang! You must get rid of or spray over the old tag first!")) - return FALSE - - // If you pass the gaunlet of checks, you're good to proceed - return TRUE - -/obj/item/toy/crayon/proc/territory_claimed(area/territory, mob/user) - for(var/datum/team/gang/G in GLOB.gangs) - if(territory.type in (G.territories|G.new_territories)) - . = G.name - break - -/obj/item/toy/crayon/proc/tag_for_gang(mob/user, atom/target) - //Delete any old markings on this tile, including other gang tags - for(var/obj/effect/decal/cleanable/crayon/old_marking in target) - qdel(old_marking) - - var/datum/antagonist/gang/G = user.mind.has_antag_datum(/datum/antagonist/gang) - var/area/territory = get_area(target) - new /obj/effect/decal/cleanable/crayon/gang(target,G.gang,"letter",0,user) - to_chat(user, span_notice("You tagged [territory] for your gang!")) - -/obj/item/toy/crayon/spraycan/gang - //desc = "A modified container containing suspicious paint." - charges = 20 - gang = TRUE - pre_noise = FALSE - post_noise = TRUE - -/obj/item/toy/crayon/spraycan/gang/Initialize(mapload, datum/team/gang/G) - .=..() - if(G) - gang = G - paint_color = G.color - update_appearance(UPDATE_ICON) - -/obj/item/toy/crayon/spraycan/gang/examine(mob/user) - . = ..() - if(user.mind && user.mind.has_antag_datum(/datum/antagonist/gang) || isobserver(user)) - . += "This spraycan has been specially modified for tagging territory." - -#undef RANDOM_GRAFFITI -#undef RANDOM_LETTER -#undef RANDOM_NUMBER -#undef RANDOM_ORIENTED -#undef RANDOM_RUNE -#undef RANDOM_ANY - /obj/item/toy/crayon/spraycan/afterattack(atom/target, mob/user, proximity) if(!proximity) return diff --git a/yogstation/code/game/objects/items/implants/implant_gang.dm b/yogstation/code/game/objects/items/implants/implant_gang.dm deleted file mode 100644 index 27bb6782ab66..000000000000 --- a/yogstation/code/game/objects/items/implants/implant_gang.dm +++ /dev/null @@ -1,60 +0,0 @@ -/obj/item/implant/gang - name = "gang implant" - desc = "Makes you a gangster." - var/datum/team/gang/gang - -/obj/item/implant/gang/Initialize(mapload, setgang) - .=..() - gang = setgang - -/obj/item/implant/gang/Destroy() - gang = null - return ..() - -/obj/item/implant/gang/get_data() - var/dat = {"Implant Specifications:
- Name: Criminal brainwash implant
- Life: A few seconds after injection.
- Important Notes: Illegal
-
- Implant Details:
- Function: Contains a small pod of nanobots that change the host's brain to be loyal to a certain organization.
- Integrity: Implant's EMP function will destroy itself in the process."} - return dat - -/obj/item/implant/gang/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) - if(!target || !target.mind || target.stat == DEAD) - return FALSE - var/datum/antagonist/gang/G = target.mind.has_antag_datum(/datum/antagonist/gang) - if(G && G.gang == G) - return FALSE // it's pointless - if(..()) - if(ishuman(target)) - - var/success - if(G) - if(!istype(G, /datum/antagonist/gang/boss)) - success = TRUE //Was not a gang boss, convert as usual - target.mind.remove_antag_datum(/datum/antagonist/gang) - else - success = TRUE - - if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) - success = FALSE - - if(!success) - target.visible_message(span_warning("[target] seems to resist the implant!"), span_warning("You feel the influence of your enemies try to invade your mind!")) - return FALSE - else - target.mind.add_antag_datum(/datum/antagonist/gang, gang) - qdel(src) - return TRUE - -/obj/item/implanter/gang - name = "implanter (gang)" - -/obj/item/implanter/gang/Initialize(mapload, gang) - if(!gang) - return INITIALIZE_HINT_QDEL - imp = new /obj/item/implant/gang(src,gang) - .=..() diff --git a/yogstation/code/modules/antagonists/gang/gang.dm b/yogstation/code/modules/antagonists/gang/gang.dm deleted file mode 100644 index cb8d5bb6d05f..000000000000 --- a/yogstation/code/modules/antagonists/gang/gang.dm +++ /dev/null @@ -1,529 +0,0 @@ -/datum/antagonist/gang - name = "Gangster" - roundend_category = "gangsters" - antag_hud_name = "gangster" - can_coexist_with_others = FALSE - job_rank = ROLE_GANG - antagpanel_category = "Gang" - var/message_name = "Gangster" - var/datum/team/gang/gang - preview_outfit = /datum/outfit/gangster - -/datum/antagonist/gang/can_be_owned(datum/mind/new_owner) - . = ..() - if(.) - if(new_owner.unconvertable) - return FALSE - -/datum/antagonist/gang/apply_innate_effects(mob/living/mob_override) - add_team_hud(mob_override || owner.current) - -/datum/antagonist/gang/add_team_hud(mob/target) - QDEL_NULL(team_hud_ref) - - team_hud_ref = WEAKREF(target.add_alt_appearance( - /datum/atom_hud/alternate_appearance/basic/has_antagonist, - "antag_team_hud_[REF(src)]", - hud_image_on(target), - )) - - var/datum/atom_hud/alternate_appearance/basic/has_antagonist/hud = team_hud_ref.resolve() - - var/list/mob/living/mob_list = list() - for(var/datum/mind/collegues_minds as anything in gang.members) - mob_list += collegues_minds.current - - for (var/datum/atom_hud/alternate_appearance/basic/has_antagonist/antag_hud as anything in GLOB.has_antagonist_huds) - if(!(antag_hud.target in mob_list)) - continue - antag_hud.show_to(target) - hud.show_to(antag_hud.target) - -/datum/antagonist/gang/hud_image_on(mob/hud_loc) - var/image/hud = image(hud_icon, hud_loc, antag_hud_name) - hud.color = gang.color - hud.plane = ABOVE_HUD_PLANE //not quite but needed - return hud - -/datum/antagonist/gang/get_team() - return gang - -/datum/antagonist/gang/greet() - gang.greet_gangster(owner) - -/datum/antagonist/gang/farewell() - if(ishuman(owner.current)) - owner.current.visible_message("[span_deconversion_message("[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!")]", null, null, null, owner.current) - to_chat(owner, span_userdanger("You are no longer a gangster! Your memory is hazy from the time you were a gangster...the only thing you remember is the name of the one who brainwashed you...")) - -/datum/antagonist/gang/on_gain() - if(!gang) - create_team() - ..() - add_to_gang() - -/datum/antagonist/gang/on_removal() - remove_from_gang() - ..() - -/datum/antagonist/gang/create_team(team) - if(!gang) // add_antag_datum calls create_team, so we need to avoid generating two gangs in that case - if(team) - gang = team - return - var/datum/team/gang/gangteam = pick_n_take(GLOB.possible_gangs) - if(gangteam) - gang = new gangteam - -/datum/antagonist/gang/proc/equip_gang() // Bosses get equipped with their tools - return - -/datum/antagonist/gang/proc/can_be_converted(mob/living/candidate) - if(!candidate.mind) - return FALSE - if(!can_be_owned(candidate.mind)) - return FALSE - var/mob/living/carbon/human/H = candidate - if(!istype(H)) //Can't nonhumans - return FALSE - return TRUE - -/datum/antagonist/gang/proc/promote() // Bump up to boss - var/datum/team/gang/old_gang = gang - var/datum/mind/old_owner = owner - silent = TRUE - owner.remove_antag_datum(/datum/antagonist/gang) - var/datum/antagonist/gang/boss/lieutenant/new_boss = new - new_boss.silent = TRUE - old_owner.add_antag_datum(new_boss,old_gang) - new_boss.silent = FALSE - log_game("[key_name(old_owner)] has been promoted to Lieutenant in the [old_gang.name] Gang") - to_chat(old_owner, "You have been promoted to Lieutenant!") - - -// Admin commands -/datum/antagonist/gang/get_admin_commands() - . = ..() - .["Promote"] = CALLBACK(src, PROC_REF(admin_promote)) - .["Set Influence"] = CALLBACK(src, PROC_REF(admin_adjust_influence)) - .["Set Uniform Influence"] = CALLBACK(src, PROC_REF(admin_adjust_uniform_influence)) - if(gang.domination_time != NOT_DOMINATING) - .["Set domination time left"] = CALLBACK(src, PROC_REF(set_dom_time_left)) - -/datum/antagonist/gang/admin_add(datum/mind/new_owner,mob/admin) - var/new_or_existing = input(admin, "Which gang do you want to be assigned to the user?", "Gangs") as null|anything in list("New","Existing") - if(isnull(new_or_existing)) - return - else if(new_or_existing == "New") - var/newgang = input(admin, "Select a gang, or select random to pick a random one.", "New gang") as null|anything in GLOB.possible_gangs + "Random" - if(isnull(newgang)) - return - else if(newgang == "Random") - var/datum/team/gang/G = pick_n_take(GLOB.possible_gangs) - gang = new G - else - GLOB.possible_gangs -= newgang - gang = new newgang - else - if(!GLOB.gangs.len) // no gangs exist - to_chat(admin, span_danger("No gangs exist, please create a new one instead.")) - return - var/existinggang = input(admin, "Select a gang, or select random to pick a random one.", "Existing gang") as null|anything in GLOB.gangs + "Random" - if(isnull(existinggang)) - return - else if(existinggang == "Random") - gang = pick(GLOB.gangs) - else - gang = existinggang - ..() - return TRUE - -/datum/antagonist/gang/proc/admin_promote(mob/admin) - message_admins("[key_name_admin(admin)] has promoted [owner] to gang boss.") - log_admin("[key_name(admin)] has promoted [owner] to boss.") - promote() - -/datum/antagonist/gang/proc/admin_adjust_influence() - var/inf = input("Influence for [gang.name]","Gang influence", gang.influence) as null | num - if(!isnull(inf)) - gang.influence = inf - message_admins("[key_name_admin(usr)] changed [gang.name]'s influence to [inf].") - log_admin("[key_name(usr)] changed [gang.name]'s influence to [inf].") - -/datum/antagonist/gang/proc/admin_adjust_uniform_influence() - var/inf = input("Uniform Influence for [gang.name]", "Uniform influence", gang.uniform_influence) as null | num - if(!isnull(inf)) - gang.uniform_influence = inf - message_admins("[key_name_admin(usr)] changed [gang.name]'s uniform influence to [inf].") - log_admin("[key_name(usr)] changed [gang.name]'s uniform influence to [inf].") - -/datum/antagonist/gang/proc/add_to_gang() - gang.add_member(owner) - owner.current.log_message("Has been converted to the [gang.name] gang!", INDIVIDUAL_ATTACK_LOG) - -/datum/antagonist/gang/proc/remove_from_gang() - gang.remove_member(owner) - owner.current.log_message("Has been deconverted from the [gang.name] gang!", INDIVIDUAL_ATTACK_LOG) - -/datum/antagonist/gang/proc/set_dom_time_left(mob/admin) - if(gang.domination_time == NOT_DOMINATING) - return // an admin shouldn't need this - var/seconds = input(admin, "Set the time left for the gang to win, in seconds", "Domination time left") as null|num - if(seconds && seconds > 0) - gang.domination_time = world.time + seconds*10 - gang.message_gangtools("Takeover shortened to [gang.domination_time_remaining()] seconds by your Syndicate benefactors.") - -// Boss type. Those can use gang tools to buy items for their gang, in particular the Dominator, used to win the gamemode, along with more gang tools to promote fellow gangsters to boss status. -/datum/antagonist/gang/boss - name = "Gang boss" - antag_hud_name = "gang_boss" - message_name = "Leader" - -/datum/antagonist/gang/boss/on_gain() - ..() - if(gang) - gang.leaders += owner - handle_clown_mutation(owner.current, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - -/datum/antagonist/gang/boss/on_removal() - if(gang) - gang.leaders -= owner - ..() - -/datum/antagonist/gang/boss/antag_listing_name() - return ..() + "(Boss)" - -/datum/antagonist/gang/boss/equip_gang(gangtool = TRUE, pen = TRUE, spraycan = TRUE, hud = TRUE) // usually has to be called separately - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - return - - var/list/slots = list ( - "backpack" = ITEM_SLOT_BACKPACK, - "left pocket" = ITEM_SLOT_LPOCKET, - "right pocket" = ITEM_SLOT_RPOCKET, - "hands" = ITEM_SLOT_HANDS - ) - - if(gangtool) - var/obj/item/gangtool/G = new() - var/where = H.equip_in_one_of_slots(G, slots) - if (!where) - to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a Gangtool.") - else - G.register_device(H) - to_chat(H, "The Gangtool in your [where] will allow you to purchase weapons and equipment, send messages to your gang, and recall the emergency shuttle from anywhere on the station.") - to_chat(H, "As the gang boss, you can also promote your gang members to lieutenant. Unlike regular gangsters, Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools.") - - if(pen) - var/obj/item/pen/gang/T = new() - var/where2 = H.equip_in_one_of_slots(T, slots) - if (!where2) - to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start.") - else - to_chat(H, "The recruitment pen in your [where2] will help you get your gang started. Stab unsuspecting crew members with it to recruit them.") - - if(spraycan) - var/obj/item/toy/crayon/spraycan/gang/SC = new(null,gang) - var/where3 = H.equip_in_one_of_slots(SC, slots) - if (!where3) - to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start.") - else - to_chat(H, "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. All gangsters can use these, so distribute them to grow your influence faster.") - - if(hud) - var/obj/item/clothing/glasses/hud/security/chameleon/C = new(null,gang) - var/where4 = H.equip_in_one_of_slots(C, slots) - if (!where4) - to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a chameleon security HUD.") - else - to_chat(H, "The chameleon security HUD in your [where4] will help you keep track of who is mindshield-implanted, and unable to be recruited.") - -// Admin commands for bosses -/datum/antagonist/gang/boss/admin_add(datum/mind/new_owner,mob/admin) - if(!new_owner.has_antag_datum(parent_type)) - ..() - to_chat(new_owner.current, span_userdanger("You are a member of the [gang.name] Gang leadership now!")) - return - promote() - message_admins("[key_name_admin(admin)] has made [new_owner.current] a boss of the [gang.name] gang.") - log_admin("[key_name(admin)] has made [new_owner.current] a boss of the [gang.name] gang.") - to_chat(new_owner.current, span_userdanger("You are a member of the [gang.name] Gang leadership now!")) - -/datum/antagonist/gang/boss/get_admin_commands() - . = ..() - . -= "Promote" - .["Take gangtool"] = CALLBACK(src, PROC_REF(admin_take_gangtool)) - .["Give gangtool"] = CALLBACK(src, PROC_REF(admin_give_gangtool)) - .["Demote"] = CALLBACK(src, PROC_REF(admin_demote)) - -/datum/antagonist/gang/boss/proc/demote() - var/old_gang = gang - var/datum/mind/old_owner = owner - silent = TRUE - owner.remove_antag_datum(/datum/antagonist/gang/boss) - var/datum/antagonist/gang/new_gangster = new /datum/antagonist/gang() - new_gangster.silent = TRUE - old_owner.add_antag_datum(new_gangster,old_gang) - new_gangster.silent = FALSE - log_game("[key_name(old_owner)] has been demoted to Gangster in the [gang.name] Gang") - to_chat(old_owner, span_userdanger("The gang has been disappointed by your ability to lead! You are a regular gangster now!")) - -/datum/antagonist/gang/boss/proc/admin_take_gangtool(mob/admin) - var/list/L = owner.current.get_contents() - var/obj/item/gangtool/gangtool = locate() in L - if (!gangtool) - to_chat(admin, span_danger("Deleting gangtool failed!")) - return - qdel(gangtool) - -/datum/antagonist/gang/boss/proc/admin_give_gangtool(mob/admin) - equip_gang(TRUE, FALSE, FALSE, FALSE) - -/datum/antagonist/gang/boss/proc/admin_demote(datum/mind/target,mob/user) - message_admins("[key_name_admin(user)] has demoted [owner.current] from gang boss.") - log_admin("[key_name(user)] has demoted [owner.current] from gang boss.") - admin_take_gangtool(user) - demote() - -/datum/antagonist/gang/boss/lieutenant - name = "Gang Lieutenant" - message_name = "Lieutenant" - -#define MAXIMUM_RECALLS 3 -#define INFLUENCE_INTERVAL 1800 -// Gang team datum. This handles the gang itself. -/datum/team/gang - name = "Gang" - member_name = "gangster" - var/hud_entry_num // because if you put something other than a number in GLOB.huds, god have mercy on your fucking soul friend - var/list/leaders = list() // bosses - var/max_leaders = MAX_LEADERS_GANG - var/members_amount = 0 // Counting members - var/list/territories = list() // territories owned by the gang. - var/list/lost_territories = list() // territories lost by the gang. - var/list/new_territories = list() // territories captured by the gang. - var/list/gangtools = list() - var/domination_time = NOT_DOMINATING - var/dom_attempts = INITIAL_DOM_ATTEMPTS - var/color - var/influence = 0 // influence of the gang, based on how many territories they own. Can be used to buy weapons and tools from a gang uplink. - var/uniform_influence = 0 // Influence gained from members wearing uniforms. Counts only to weapons. yogs - var/passive_uniform_income // Passive income for weapons. The more gang members you have, the less you will get. Wear your uniform. - var/winner // Once the gang wins with a dominator, this becomes true. For roundend credits purposes. - var/list/inner_outfits = list() - var/list/outer_outfits = list() - var/next_point_time - var/recalls = MAXIMUM_RECALLS // Once this reaches 0, this gang cannot force recall the shuttle with their gangtool anymore - -/datum/team/gang/New(starting_members) - . = ..() - GLOB.gangs += src - if(starting_members) - if(islist(starting_members)) - for(var/datum/mind/groveboss in starting_members) - leaders += groveboss - var/datum/antagonist/gang/boss/gb = new - groveboss.add_antag_datum(gb, src) - gb.equip_gang() - - else - var/datum/mind/CJ = starting_members - if(istype(CJ)) - leaders += CJ - var/datum/antagonist/gang/boss/bossdatum = new - CJ.add_antag_datum(bossdatum, src) - bossdatum.equip_gang() - next_point_time = world.time + INFLUENCE_INTERVAL - addtimer(CALLBACK(src, PROC_REF(handle_territories)), INFLUENCE_INTERVAL) - -/datum/team/gang/Destroy() - GLOB.gangs -= src - ..() - -/datum/team/gang/roundend_report() - var/list/report = list() - report += span_header("[name]:") - if(winner) - report += span_greentext("The [name] gang was successful!") - for(var/datum/mind/M in leaders) - SSachievements.unlock_achievement(/datum/achievement/greentext/gangleader,M.current) - for(var/datum/mind/M in members) // Leaders are included in this too - SSachievements.unlock_achievement(/datum/achievement/greentext/gang,M.current) // and so get the lower achievement, too - else - report += span_redtext("The [name] gang has failed!") - - report += "The [name] gang bosses were:" - report += printplayerlist(leaders) - report += "The [name] [member_name]s were:" - report += printplayerlist(members-leaders) - - return "
[report.Join("
")]
" - -/datum/team/gang/proc/greet_gangster(datum/mind/gangster) - to_chat(gangster, "You are now a member of the [name] Gang!") - to_chat(gangster, "Help your bosses take over the station by claiming territory with special spraycans only they can provide. Simply spray on any unclaimed area of the station.") - to_chat(gangster, "Their ultimate objective is to take over the station with a Dominator machine.") - to_chat(gangster, "You can identify your mates by their large, bright \[G\] icon.") - gangster.store_memory("You are a member of the [name] Gang!") - -/datum/team/gang/proc/handle_territories() - next_point_time = world.time + INFLUENCE_INTERVAL - if(!leaders.len) - return - var/added_names = "" - var/lost_names = "" - - //Re-add territories that were reclaimed, so if they got tagged over, they can still earn income if they tag it back before the next status report - var/list/reclaimed_territories = new_territories & lost_territories - territories |= reclaimed_territories - new_territories -= reclaimed_territories - lost_territories -= reclaimed_territories - - //Process lost territories - for(var/area in lost_territories) - if(lost_names != "") - lost_names += ", " - lost_names += "[lost_territories[area]]" - territories -= area - - //Calculate and report influence growth - - //Process new territories - for(var/area in new_territories) - if(added_names != "") - added_names += ", " - added_names += "[new_territories[area]]" - territories += area - - //Report territory changes - var/message = "[src] Gang Status Report:.
*---------*
" - message += "[new_territories.len] new territories:
[added_names]
" - message += "[lost_territories.len] territories lost:
[lost_names]
" - //Clear the lists - new_territories = list() - lost_territories = list() - var/total_territories = total_claimable_territories() - var/control = round((territories.len/total_territories)*100, 1) - var/uniformed = check_clothing() - message += "Your gang now has [control]% control of the station.
*---------*
" - if(domination_time != NOT_DOMINATING) - var/new_time = max(world.time, domination_time - (uniformed * 4) - (territories.len * 2)) - if(new_time < domination_time) - message += "Takeover shortened by [(domination_time - new_time)*0.1] seconds for defending [territories.len] territories.
" - domination_time = new_time - message += "[domination_time_remaining()] seconds remain in hostile takeover.
" - else - var/new_influence = check_territory_income() - var/new_uniform_influence = check_uniform_income() - if(new_influence != influence) - message += "Gang influence has increased by [new_influence - influence] for defending [territories.len] territories
" - if(new_uniform_influence != uniform_influence) // yogs - message += "Gang supply has increased by [new_uniform_influence - uniform_influence] for having [uniformed] uniformed gangsters
" - influence = new_influence - uniform_influence = new_uniform_influence - message += "Your gang now has [influence] influence and [uniform_influence] supply points.
" - message_gangtools(message) - addtimer(CALLBACK(src, PROC_REF(handle_territories)), INFLUENCE_INTERVAL) - -/datum/team/gang/proc/total_claimable_territories() - var/list/valid_territories = list() - for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) //First, collect all area types on the station zlevel - for(var/ar in SSmapping.areas_in_z["[z]"]) - var/area/A = ar - if(!(A.type in valid_territories) && A.valid_territory) - valid_territories |= A.type - return valid_territories.len - -/datum/team/gang/proc/check_territory_income() - var/new_influence = min(999,influence + 15 + territories.len) - return new_influence - -/datum/team/gang/proc/check_uniform_income() - members_amount = 0 // reset so it doesnt just add last cycles to next - count_members() - var/new_uniform_influence = min(999,uniform_influence + passive_uniform_income + (check_clothing() * 5)) // 5 weapon supply points per uniformed gangster + free income per cycle based on members - return new_uniform_influence - -/datum/team/gang/proc/check_clothing() - //Count uniformed gangsters - var/uniformed = 0 - for(var/datum/mind/gangmind in members) - if(ishuman(gangmind.current)) - var/mob/living/carbon/human/gangster = gangmind.current - //Gangster must be alive and on station - if((gangster.stat == DEAD) || (!is_station_level(gangster.z))) - continue - - var/obj/item/clothing/outfit - var/obj/item/clothing/gang_outfit - if(gangster.w_uniform) - outfit = gangster.w_uniform - if(outfit.type in inner_outfits) - gang_outfit = outfit - if(gangster.wear_suit) - outfit = gangster.wear_suit - if(outfit.type in outer_outfits) - gang_outfit = outfit - - if(gang_outfit) - gangster << span_notice("The [src] Gang's influence grows as you wear [gang_outfit].") - uniformed++ - return uniformed - -/datum/team/gang/proc/adjust_influence(value) - influence = max(0, influence + value) - -/datum/team/gang/proc/adjust_uniform_influence(value) - uniform_influence = max(0, uniform_influence + value) - -/datum/outfit/gangster - name = "Gangster (Preview only)" - mask = /obj/item/clothing/mask/cigarette/cigar/havana - uniform = /obj/item/clothing/under/suit/vice - neck = /obj/item/clothing/neck/necklace/dope - head = /obj/item/clothing/head/fedora - -/datum/team/gang/proc/count_members() - for(var/datum/mind/gangmind in members) - if(ishuman(gangmind.current)) - var/mob/living/carbon/human/gangster = gangmind.current - if(gangster.stat != DEAD) - members_amount++ - switch(members_amount) - if(0 to 3) - passive_uniform_income = 15 - if(4 to 5) - passive_uniform_income = 10 - if(6 to INFINITY) - passive_uniform_income = 0 - - -/datum/team/gang/proc/message_gangtools(message) - if(!gangtools.len || !message) - return - for(var/i in gangtools) - var/obj/item/gangtool/tool = i - var/mob/living/mob = get(tool.loc, /mob/living) - if(mob && mob.mind && mob.stat == CONSCIOUS) - var/datum/antagonist/gang/gangster = mob.mind.has_antag_datum(/datum/antagonist/gang) - if(gangster.gang == src) - to_chat(mob, span_warning("[icon2html(tool, mob)] [message]")) - playsound(mob.loc, 'sound/machines/twobeep.ogg', 50, 1) - return - -/datum/team/gang/proc/domination() - domination_time = world.time + determine_domination_time()*10 - SSsecurity_level.set_level(SEC_LEVEL_DELTA) - -/datum/team/gang/proc/determine_domination_time() // calculates the value in seconds (this is the initial domination time!) - var/total_territories = total_claimable_territories() - return max(180,480 - (round((territories.len/total_territories)*100, 1) * 9)) - -/datum/team/gang/proc/domination_time_remaining() // retrieves the value from world.time based deciseconds to seconds - var/diff = domination_time - world.time - return round(diff * 0.1) - - -#undef MAXIMUM_RECALLS -#undef INFLUENCE_INTERVAL diff --git a/yogstation/code/modules/antagonists/gang/gang_datums.dm b/yogstation/code/modules/antagonists/gang/gang_datums.dm deleted file mode 100644 index 7c336579532d..000000000000 --- a/yogstation/code/modules/antagonists/gang/gang_datums.dm +++ /dev/null @@ -1,139 +0,0 @@ - -// Gang datums go here. If you want to create a new gang, you must be sure to edit: -// name -// color (must be a hex, "blue" isn't acceptable due to how spraycans are handled) -// inner_outfits (must be a list() with typepaths of the clothes in it. One is fine, but there is support for multiple: one will be picked at random when bought) -// outer_outfits (same as above) -// You also need to make a gang graffiti, that will go in crayondecal.dmi inside our icons(not tg's), with the same name of the gang it's assigned to. Nothing else,just the icon. -// Those are all required. If one is missed, stuff could break. - -/datum/team/gang/clandestine - name = "Clandestine" - color = "#FF0000" - inner_outfits = list(/obj/item/clothing/under/syndicate/combat) - outer_outfits = list(/obj/item/clothing/suit/jacket) - -/datum/team/gang/prima - name = "Prima" - color = "#FFFF00" - inner_outfits = list(/obj/item/clothing/under/color/yellow) - outer_outfits = list(/obj/item/clothing/suit/hastur) - -/datum/team/gang/zerog - name = "Zero-G" - color = "#C0C0C0" - inner_outfits = list(/obj/item/clothing/under/suit/white) - outer_outfits = list(/obj/item/clothing/suit/hooded/wintercoat) - -/datum/team/gang/max - name = "Max" - color = "#800000" - inner_outfits = list(/obj/item/clothing/under/color/maroon) - outer_outfits = list(/obj/item/clothing/suit/poncho/red) - -/datum/team/gang/blasto - name = "Blasto" - color = "#000080" - inner_outfits = list(/obj/item/clothing/under/suit/navy) - outer_outfits = list(/obj/item/clothing/suit/jacket/miljacket) - -/datum/team/gang/waffle - name = "Waffle" - color = "#808000" - inner_outfits = list(/obj/item/clothing/under/suit/green) - outer_outfits = list(/obj/item/clothing/suit/poncho) - -/datum/team/gang/north - name = "North" - color = "#00FF00" - inner_outfits = list(/obj/item/clothing/under/color/green) - outer_outfits = list(/obj/item/clothing/suit/poncho/green) - -/datum/team/gang/omni - name = "Omni" - color = "#008080" - inner_outfits = list(/obj/item/clothing/under/color/teal) - outer_outfits = list(/obj/item/clothing/suit/chaplainsuit/studentuni) - -/datum/team/gang/newton - name = "Newton" - color = "#A52A2A" - inner_outfits = list(/obj/item/clothing/under/color/brown) - outer_outfits = list(/obj/item/clothing/suit/toggle/owlwings) - -/datum/team/gang/cyber - name = "Cyber" - color = "#808000" - inner_outfits = list(/obj/item/clothing/under/color/lightbrown) - outer_outfits = list(/obj/item/clothing/suit/nemes) - -/datum/team/gang/donk - name = "Donk" - color = "#0000FF" - inner_outfits = list(/obj/item/clothing/under/color/darkblue) - outer_outfits = list(/obj/item/clothing/suit/apron/overalls) - -/datum/team/gang/gene - name = "Gene" - color = "#00FFFF" - inner_outfits = list(/obj/item/clothing/under/color/blue) - outer_outfits = list(/obj/item/clothing/suit/apron) - -/datum/team/gang/gib - name = "Gib" - color = "#bb0a1e" - inner_outfits = list(/obj/item/clothing/under/color/black) - outer_outfits = list(/obj/item/clothing/suit/jacket/leather/overcoat) - -/datum/team/gang/tunnel - name = "Tunnel" - color = "#FF00FF" - inner_outfits = list(/obj/item/clothing/under/costume/villain) - outer_outfits = list(/obj/item/clothing/suit/poncho/ponchoshame) - -/datum/team/gang/diablo - name = "Diablo" - color = "#FF0000" - inner_outfits = list(/obj/item/clothing/under/color/red) - outer_outfits = list(/obj/item/clothing/suit/jacket/leather) - -/datum/team/gang/psyke - name = "Psyke" - color = "#808080" - inner_outfits = list(/obj/item/clothing/under/color/grey) - outer_outfits = list(/obj/item/clothing/suit/toggle/owlwings/griffinwings) - -/datum/team/gang/osiron - name = "Osiron" - color = "#FFFFFF" - inner_outfits = list(/obj/item/clothing/under/color/white) - outer_outfits = list(/obj/item/clothing/suit/toggle/labcoat) - -/datum/team/gang/sirius - name = "Sirius" - color = "#FFC0CB" - inner_outfits = list(/obj/item/clothing/under/color/pink) - -/datum/team/gang/sleepingcarp - name = "Sleeping Carp" - color = "#800080" - inner_outfits = list(/obj/item/clothing/under/color/lightpurple) - outer_outfits = list(/obj/item/clothing/suit/hooded/carp_costume) - -/datum/team/gang/h - name = "H" - color = "#993333" - inner_outfits = list(/obj/item/clothing/under/yogs/psyche) - outer_outfits = list(/obj/item/clothing/suit/yogs/jesus) // perfect - -/datum/team/gang/rigatonifamily - name = "Rigatoni family" - color = "#cc9900" // p a s t a colored - inner_outfits = list(/obj/item/clothing/under/rank/civilian/chef) - outer_outfits = list(/obj/item/clothing/suit/apron/chef) - -/datum/team/gang/weed - name = "Weed" - color = "#66ff33" - inner_outfits = list(/obj/item/clothing/under/color/darkgreen) - outer_outfits = list(/obj/item/clothing/suit/vapeshirt) diff --git a/yogstation/code/modules/antagonists/gang/gang_hud.dm b/yogstation/code/modules/antagonists/gang/gang_hud.dm deleted file mode 100644 index 8eaf6b2ed4ed..000000000000 --- a/yogstation/code/modules/antagonists/gang/gang_hud.dm +++ /dev/null @@ -1,18 +0,0 @@ -/datum/atom_hud/antag/gang - var/color = null - -/datum/atom_hud/antag/gang/add_atom_to_hud(atom/A) - if(!A) - return - var/image/holder = A.hud_list[ANTAG_HUD] - if(holder) - holder.color = color - ..() - -/datum/atom_hud/antag/gang/remove_atom_from_hud(atom/A) - if(!A) - return - var/image/holder = A.hud_list[ANTAG_HUD] - if(holder) - holder.color = null - ..()