From ad9d15ac4963e1f3e96182377e9b4f64951daa32 Mon Sep 17 00:00:00 2001 From: Szyszkrzyn <52501307+Szyszkrzyneczka@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:25:17 +0200 Subject: [PATCH] Removes old code (#11613) No one will miss it for no one even remembers it --- beestation.dme | 23 -- .../dynamic/dynamic_rulesets_latejoin.dm | 2 - .../dynamic/dynamic_rulesets_midround.dm | 1 - .../dynamic/dynamic_rulesets_roundstart.dm | 29 -- code/game/gamemodes/hivemind/hivemind.dm | 106 ------ code/game/gamemodes/hivemind/objectives.dm | 97 ----- code/game/machinery/cloning.dm | 2 - .../items/implants/implant_mindshield.dm | 18 - code/modules/antagonists/hivemind/hivemind.dm | 341 ------------------ .../antagonists/hivemind/hivemind_overlays.dm | 30 -- code/modules/antagonists/hivemind/hiveui.dm | 96 ----- .../hivemind/spells/hivemind_add.dm | 56 --- .../hivemind/spells/hivemind_barrier.dm | 45 --- .../hivemind/spells/hivemind_compell.dm | 32 -- .../hivemind/spells/hivemind_dominance.dm | 49 --- .../hivemind/spells/hivemind_hand.dm | 39 -- .../hivemind/spells/hivemind_heal.dm | 45 --- .../hivemind/spells/hivemind_integrate.dm | 65 ---- .../hivemind/spells/hivemind_invasion.dm | 63 ---- .../hivemind/spells/hivemind_loyalty.dm | 27 -- .../hivemind/spells/hivemind_panic.dm | 54 --- .../hivemind/spells/hivemind_probe.dm | 54 --- .../hivemind/spells/hivemind_rally.dm | 38 -- .../hivemind/spells/hivemind_see.dm | 45 --- .../hivemind/spells/hivemind_shatter.dm | 41 --- .../hivemind/spells/hivemind_shock.dm | 43 --- .../hivemind/spells/hivemind_spells.dm | 42 --- .../hivemind/spells/hivemind_thrall.dm | 76 ---- code/modules/antagonists/hivemind/vessel.dm | 69 ---- .../role_preference/role_antagonists.dm | 26 -- code/modules/mob/living/carbon/human/death.dm | 5 - code/modules/mob/living/login.dm | 3 - .../chemistry/reagents/medicine_reagents.dm | 13 +- 33 files changed, 1 insertion(+), 1674 deletions(-) delete mode 100644 code/game/gamemodes/hivemind/hivemind.dm delete mode 100644 code/game/gamemodes/hivemind/objectives.dm delete mode 100644 code/modules/antagonists/hivemind/hivemind.dm delete mode 100644 code/modules/antagonists/hivemind/hivemind_overlays.dm delete mode 100644 code/modules/antagonists/hivemind/hiveui.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_add.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_barrier.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_compell.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_dominance.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_hand.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_heal.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_integrate.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_invasion.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_loyalty.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_panic.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_probe.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_rally.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_see.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_shatter.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_shock.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_spells.dm delete mode 100644 code/modules/antagonists/hivemind/spells/hivemind_thrall.dm delete mode 100644 code/modules/antagonists/hivemind/vessel.dm diff --git a/beestation.dme b/beestation.dme index 5b300777e55a9..bc390ba714837 100644 --- a/beestation.dme +++ b/beestation.dme @@ -1071,8 +1071,6 @@ #include "code\game\gamemodes\gangs\gangtool.dm" #include "code\game\gamemodes\gangs\implant_gang.dm" #include "code\game\gamemodes\gangs\outfits.dm" -#include "code\game\gamemodes\hivemind\hivemind.dm" -#include "code\game\gamemodes\hivemind\objectives.dm" #include "code\game\gamemodes\incursion\incursion.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" @@ -2093,27 +2091,6 @@ #include "code\modules\antagonists\heretic\structures\carving_knife.dm" #include "code\modules\antagonists\heretic\structures\mawed_crucible.dm" #include "code\modules\antagonists\highlander\highlander.dm" -#include "code\modules\antagonists\hivemind\hivemind.dm" -#include "code\modules\antagonists\hivemind\hivemind_overlays.dm" -#include "code\modules\antagonists\hivemind\hiveui.dm" -#include "code\modules\antagonists\hivemind\vessel.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_add.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_barrier.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_compell.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_dominance.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_hand.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_heal.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_integrate.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_invasion.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_loyalty.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_panic.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_probe.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_rally.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_see.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_shatter.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_shock.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_spells.dm" -#include "code\modules\antagonists\hivemind\spells\hivemind_thrall.dm" #include "code\modules\antagonists\holoparasite\holoparasite_antag.dm" #include "code\modules\antagonists\holoparasite\holoparasite_team.dm" #include "code\modules\antagonists\hypnotization\hypnotized.dm" diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 3421757c9291b..0a21008e6b14c 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -74,7 +74,6 @@ /datum/dynamic_ruleset/roundstart/nuclear, /datum/dynamic_ruleset/roundstart/wizard, /datum/dynamic_ruleset/roundstart/revs, - /datum/dynamic_ruleset/roundstart/hivemind ) ////////////////////////////////////////////// @@ -100,7 +99,6 @@ /datum/dynamic_ruleset/roundstart/nuclear, /datum/dynamic_ruleset/roundstart/wizard, /datum/dynamic_ruleset/roundstart/revs, - /datum/dynamic_ruleset/roundstart/hivemind ) /datum/dynamic_ruleset/latejoin/heretic_smuggler/execute(forced = FALSE) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 64c35dc67f18a..2a3360b25724e 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -202,7 +202,6 @@ /datum/dynamic_ruleset/roundstart/nuclear, /datum/dynamic_ruleset/roundstart/wizard, /datum/dynamic_ruleset/roundstart/revs, - /datum/dynamic_ruleset/roundstart/hivemind ) /datum/dynamic_ruleset/midround/autotraitor/trim_candidates() diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 799f63e76c1b6..ebe48dbb4474a 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -630,32 +630,3 @@ SSticker.mode_result = "win - incursion win" else SSticker.mode_result = "loss - staff stopped the incursion" - -////////////////////////////////////////////// -// // -// ASSIMILATION // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/roundstart/hivemind - name = "Assimilation" - role_preference = /datum/role_preference/antagonist/hivemind_host - antag_datum = /datum/antagonist/hivemind - protected_roles = list(JOB_NAME_SECURITYOFFICER, JOB_NAME_WARDEN, JOB_NAME_DETECTIVE,JOB_NAME_HEADOFSECURITY, JOB_NAME_CAPTAIN) - restricted_roles = list(JOB_NAME_AI, JOB_NAME_CYBORG) - required_candidates = 3 - weight = 3 - cost = 30 - requirements = list(100,90,80,60,40,30,10,10,10,10) - flags = HIGH_IMPACT_RULESET | NO_OTHER_ROUNDSTARTS_RULESET | PERSISTENT_RULESET - -/datum/dynamic_ruleset/roundstart/hivemind/pre_execute(population) - . = ..() - var/num_hosts = max( 3 , rand(0,1) + min(8, round(population / 8) ) ) - for (var/i = 1 to num_hosts) - var/mob/M = antag_pick_n_take(candidates) - assigned += M.mind - M.mind.restricted_roles = restricted_roles - M.mind.special_role = ROLE_HIVE - GLOB.pre_setup_antags += M.mind - return TRUE diff --git a/code/game/gamemodes/hivemind/hivemind.dm b/code/game/gamemodes/hivemind/hivemind.dm deleted file mode 100644 index 2159fcc800ca4..0000000000000 --- a/code/game/gamemodes/hivemind/hivemind.dm +++ /dev/null @@ -1,106 +0,0 @@ -GLOBAL_LIST_EMPTY(hivehosts) - -/datum/game_mode/hivemind - name = "assimilation" - config_tag = "hivemind" - report_type = "hivemind" - role_preference = /datum/role_preference/antagonist/hivemind_host - antag_datum = /datum/antagonist/hivemind - false_report_weight = 5 - protected_jobs = list(JOB_NAME_SECURITYOFFICER, JOB_NAME_WARDEN, JOB_NAME_DETECTIVE, JOB_NAME_HEADOFSECURITY, JOB_NAME_CAPTAIN) - restricted_jobs = list(JOB_NAME_AI, JOB_NAME_CYBORG) - required_players = 30 - required_enemies = 3 - recommended_enemies = 3 - reroll_friendly = 1 - - 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_hivemember(mob/living/L) - if(!L) - return FALSE - var/datum/mind/M = L.mind - if(!M) - return FALSE - for(var/datum/antagonist/hivemind/H as() in GLOB.hivehosts) - 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 as() in GLOB.hivehosts) - if(H.hivemembers.Find(M)) - H.remove_hive_overlay(M.current) - H.hivemembers -= M - H.calc_size() - var/datum/antagonist/hivevessel/V = IS_WOKEVESSEL(L) - 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 += JOB_NAME_ASSISTANT - - if(CONFIG_GET(flag/protect_heads_from_antagonist)) - restricted_jobs += SSdepartment.get_jobs_by_dept_id(DEPT_NAME_COMMAND) - - var/num_hosts = max( 3 , 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, /datum/role_preference/antagonist/hivemind_host) - hosts += host - host.special_role = ROLE_HIVE - host.restricted_roles = restricted_jobs - GLOB.pre_setup_antags += host - 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) - GLOB.pre_setup_antags -= i - 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." - -/datum/game_mode/hivemind/generate_credit_text() - var/list/round_credits = list() - var/len_before_addition - - for(var/datum/antagonist/hivemind/H as() in GLOB.hivehosts) - round_credits += "

Hive [H.hiveID]:

" - len_before_addition = round_credits.len - round_credits += "

[H.name] as the Hivemind Host

" - for(var/datum/antagonist/hivevessel/V as() in H.avessels) - round_credits += "

[V.name] as an Awakened Vessel

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

Hive [H.hiveID] couldn't withstand the competition!

") - round_credits += "
" - - round_credits += ..() - return round_credits diff --git a/code/game/gamemodes/hivemind/objectives.dm b/code/game/gamemodes/hivemind/objectives.dm deleted file mode 100644 index e8d2d8c820bc5..0000000000000 --- a/code/game/gamemodes/hivemind/objectives.dm +++ /dev/null @@ -1,97 +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() - var/datum/antagonist/hivemind/host = owner.has_antag_datum(/datum/antagonist/hivemind) - if(!host) - return ..() - 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() - var/count = 0 - var/datum/antagonist/hivemind/host = owner.has_antag_datum(/datum/antagonist/hivemind) - if(!host) - return ..() - 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() - var/datum/antagonist/hivemind/host = owner.has_antag_datum(/datum/antagonist/hivemind) - if(!host) - return ..() - for(var/datum/antagonist/hivemind/H as() in GLOB.hivehosts) - if(H == host) - continue - if(H.hive_size >= host.hive_size) - return ..() - return TRUE - -/datum/objective/hivemind/dominance - name = "dominance" - explanation_text = "Assert dominance after having twenty more vessels and more integrations than any other hive." - -/datum/objective/hivemind/dominance/check_completion() - var/datum/antagonist/hivemind/host = owner.has_antag_datum(/datum/antagonist/hivemind) - if(!host) - return ..() - return host?.dominant || ..() - -/datum/objective/hivemind/awaken - name = "awaken" - var/target_role_type=FALSE - -/datum/objective/hivemind/awaken/update_explanation_text() - if(target && target.current) - explanation_text = "Turn [target.name], the [!target_role_type ? target.assigned_role : target.special_role], into an awakened vessel." - else - explanation_text = "Free Objective" - -/datum/objective/hivemind/awaken/is_valid_target(datum/mind/possible_target) - . = ..() - if(possible_target.has_antag_datum(/datum/antagonist/hivemind)) - return FALSE - -/datum/objective/hivemind/awaken/check_completion() - var/datum/antagonist/hivemind/host = owner.has_antag_datum(/datum/antagonist/hivemind) - if(!host) - return ..() - for(var/datum/mind/mind as() in host.avessels) - if(target == mind) - return TRUE - return FALSE - -/datum/objective/hivemind/integrate - name = "integrate" - explanation_text = "Integrate at least one other Hive Host." - -/datum/objective/hivemind/integrate/check_completion() - var/datum/antagonist/hivemind/host = owner.has_antag_datum(/datum/antagonist/hivemind) - if(!host) - return ..() - return host?.size_mod || ..() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index fa9c1e3481660..3ba465848e8c6 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -275,8 +275,6 @@ if(H) H.faction |= factions - remove_hivemember(H) - for(var/t in traumas) var/datum/brain_trauma/BT = t var/datum/brain_trauma/cloned_trauma = BT.on_clone() diff --git a/code/game/objects/items/implants/implant_mindshield.dm b/code/game/objects/items/implants/implant_mindshield.dm index 113fc640ab485..f990ca463f537 100644 --- a/code/game/objects/items/implants/implant_mindshield.dm +++ b/code/game/objects/items/implants/implant_mindshield.dm @@ -33,24 +33,6 @@ qdel(src) return FALSE - var/datum/antagonist/hivemind/hiv= target.mind.has_antag_datum(/datum/antagonist/hivemind) - if(hiv) - var/timer = round(rand(1800,3000)) - addtimer(CALLBACK(hiv, TYPE_PROC_REF(/datum/antagonist/hivemind, handle_implant)), timer, TIMER_STOPPABLE) - hiv.handle_implant() - - if(is_hivemember(target)) - for(var/datum/antagonist/hivemind/hive in GLOB.antagonists) - if(hive.hivemembers.Find(target.mind)) - var/mob/living/carbon/C = hive.owner.current - if(C?.mind) - to_chat(C, "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(IS_WOKEVESSEL(target)) - target.mind.remove_antag_datum(/datum/antagonist/hivevessel) - target.visible_message("[target]'s thoughts seem to clear!", null, null, null, target) - ADD_TRAIT(target, TRAIT_HIVE_BURNT, HIVEMIND_TRAIT) - to_chat(target, "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!") - remove_hivemember(target) var/datum/antagonist/rev/rev = target.mind.has_antag_datum(/datum/antagonist/rev) if(rev) diff --git a/code/modules/antagonists/hivemind/hivemind.dm b/code/modules/antagonists/hivemind/hivemind.dm deleted file mode 100644 index 5032a78fd8c5d..0000000000000 --- a/code/modules/antagonists/hivemind/hivemind.dm +++ /dev/null @@ -1,341 +0,0 @@ -/datum/antagonist/hivemind - name = "Hivemind Host" - roundend_category = "hiveminds" - antagpanel_category = "Hivemind Host" - banning_key = ROLE_HIVE - required_living_playtime = 4 - antag_moodlet = /datum/mood_event/hivehost - var/list/hivemembers = list() - var/list/avessels = list() - var/hive_size = 0 - var/size_mod = 0 // Bonus size for using integrate - var/unlocked_dominance = FALSE - var/dominant = FALSE - var/mutable_appearance/glow - var/isintegrating = 0 - var/hiveID = "Hivemind" - var/searchcharge = 0 - var/datum/psychic_plane/psychic_plane - var/datum/action/innate/psychic_plane/plane_action - var/avessel_limit = 2 - var/descriptor = "Hivemind" - var/hud_entry_num - - var/list/upgrade_tiers = list( - //Tier 1 - Roundstart powers - /obj/effect/proc_holder/spell/targeted/hive_add = 0, - /obj/effect/proc_holder/spell/target_hive/hive_see = 0, - /obj/effect/proc_holder/spell/target_hive/hive_shock = 0, - //Tier 2 - Host vs Host - /obj/effect/proc_holder/spell/targeted/hive_integrate = 5, - /obj/effect/proc_holder/spell/targeted/hive_hack = 5, - /obj/effect/proc_holder/spell/targeted/hive_probe = 5, - //Tier 3 - Crew manipulation powers - /obj/effect/proc_holder/spell/target_hive/hive_compell = 10, - /obj/effect/proc_holder/spell/self/hive_loyal = 10, - /obj/effect/proc_holder/spell/targeted/hive_thrall = 10, - //Tier 4 - Combat powers - /obj/effect/proc_holder/spell/self/hive_drain = 15, - /obj/effect/proc_holder/spell/targeted/forcewall/hive = 15, - /obj/effect/proc_holder/spell/targeted/induce_panic = 15, - //Tier 5 - Finishers - /obj/effect/proc_holder/spell/target_hive/hive_shatter = 20, - /obj/effect/proc_holder/spell/targeted/hive_rally = 20, - ) - - -/datum/antagonist/hivemind/proc/calc_size() - list_clear_nulls(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_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.spell_list)) - var/obj/effect/proc_holder/spell/the_spell = new power(null) - owner.AddSpell(the_spell) - if(hive_size > 0) - to_chat(owner, "We have unlocked [the_spell.name]. [the_spell.desc]") - if(!unlocked_dominance && hive_size >= 20) - var/lead = TRUE - for(var/datum/antagonist/hivemind/enemy in GLOB.hivehosts) - if(enemy == src) - continue - if(!enemy.unlocked_dominance && enemy.hive_size <= hive_size + size_mod - 15) - continue - if(enemy.size_mod <= size_mod) - continue - lead = FALSE - break - if(lead) - unlocked_dominance = TRUE - owner.AddSpell(new /obj/effect/proc_holder/spell/self/hive_dominance) - to_chat(owner, "Our strength overflowing and our competitors left in the dust, we can proclaim our Dominance and enter a heightened state.") - -/datum/antagonist/hivemind/proc/add_to_hive(mob/living/carbon/C) - if(!C) - return - var/datum/mind/M = C.mind - if(M) - hivemembers |= M - RegisterSignal(M, COMSIG_PARENT_QDELETING, PROC_REF(handle_mind_deletion)) - add_hive_overlay(C) - calc_size() - - var/user_warning = "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(IS_HIVEHOST(C)) - 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) - -/datum/antagonist/hivemind/proc/handle_mind_deletion(datum/mind/M) - SIGNAL_HANDLER - remove_from_hive(M.current) - -/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) - SIGNAL_HANDLER - var/datum/mind/M = C.mind - if(M) - remove_hive_overlay(C) - hivemembers -= M - calc_size() - -/datum/antagonist/hivemind/proc/handle_ejection(mob/living/carbon/C) //C is the one being ejected from C2s hive - if(!C || !owner) - return - var/mob/living/carbon/C2 = owner.current - if(!C2) - return - if(IS_HIVEHOST(C) && IS_HIVEHOST(C2)) - remove_from_hive(C) - to_chat(C2, "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(C, "The enemy host has been ejected from our mind." ) - -/datum/antagonist/hivemind/proc/handle_implant() - var/mob/living/carbon/human/self = owner.current - if(HAS_TRAIT(self, TRAIT_MINDSHIELD)) - for(var/obj/item/implant/mindshield/M in self.implants) - to_chat(self, "Our latent psychic power destroys our mindshield implant!") - qdel(M) - -/datum/antagonist/hivemind/proc/destroy_hive() - hivemembers = list() - for(var/datum/mind/mind in avessels) - mind.remove_antag_datum(/datum/antagonist/hivevessel) - avessels = list() - calc_size() - for(var/power in upgrade_tiers) - if(!upgrade_tiers[power]) - continue - owner.RemoveSpell(power) - -/datum/antagonist/hivemind/antag_panel_data() - return "Vessels Assimilated: [hive_size] (+[size_mod])" - - -/datum/antagonist/hivemind/on_gain() - owner.special_role = ROLE_HIVE - GLOB.hivehosts += src - generate_flavour() - create_actions() - 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.") - update_hivemind_hud(owner.current) - -/datum/antagonist/hivemind/proc/update_hivemind_hud(mob/living/M) - var/datum/atom_hud/antag/hivehud = GLOB.huds[hud_entry_num] - if(!hivehud) - hivehud = new/datum/atom_hud/antag() - hud_entry_num = GLOB.huds.len+1 // this is the index the hivemind hud will be added at - GLOB.huds += hivehud - hivehud.join_hud(M) - if(IS_HIVEHOST(M)) - set_antag_hud(M,"hivemind") - else - set_antag_hud(M,"hivevessel") - -/datum/antagonist/hivemind/proc/update_hivemind_hud_removed(mob/living/M) - var/datum/atom_hud/antag/hivehud = GLOB.huds[hud_entry_num] - if(hivehud) - hivehud.leave_hud(M) - set_antag_hud(M, null) - -/datum/antagonist/hivemind/remove_innate_effects() - handle_clown_mutation(owner.current, removing=FALSE) - update_hivemind_hud_removed(owner.current) - -/datum/antagonist/hivemind/on_removal() - //Remove all hive powers here - GLOB.hivehosts -= src - for(var/power in upgrade_tiers) - owner.RemoveSpell(power) - - if(!silent && owner.current) - to_chat(owner.current," 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)) //One hive size objective - var/datum/objective/hivemind/hivesize/size_objective = new - size_objective.owner = owner - objectives += size_objective - log_objective(owner, size_objective.explanation_text) - else if(prob(70)) - var/datum/objective/hivemind/hiveescape/hive_escape_objective = new - hive_escape_objective.owner = owner - objectives += hive_escape_objective - log_objective(owner, hive_escape_objective.explanation_text) - else - var/datum/objective/hivemind/biggest/biggest_objective = new - biggest_objective.owner = owner - objectives += biggest_objective - log_objective(owner, biggest_objective.explanation_text) - - if(prob(40)) //One medium difficulty objective - var/datum/objective/steal/steal_objective = new - steal_objective.owner = owner - steal_objective.find_target() - objectives += steal_objective - log_objective(owner, steal_objective.explanation_text) - else - var/datum/objective/hivemind/awaken/awaken_objective = new - awaken_objective.owner = owner - awaken_objective.find_target(null,GLOB.hivehosts) - objectives += awaken_objective - log_objective(owner, awaken_objective.explanation_text) - - if(prob(30)) - var/datum/objective/hivemind/dominance/assert_dominance = new - assert_dominance.owner = owner - objectives += assert_dominance - log_objective(owner, assert_dominance.explanation_text) - else if(prob(50)) - var/datum/objective/hivemind/integrate/integrate_objective = new - integrate_objective.owner = owner - objectives += integrate_objective - log_objective(owner, integrate_objective.explanation_text) - - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - log_objective(owner, escape_objective.explanation_text) - - 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', vol = 100, vary = FALSE, channel = CHANNEL_ANTAG_GREETING, pressure_affected = FALSE) - - owner.announce_objectives() - owner.current.client?.tgui_panel?.give_antagonist_popup("Hivemind", - "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, \ - our powers will grow if we integrate them with our own consciousness.") - to_chat(owner.current,"We are hive [hiveID]!") - -/datum/antagonist/hivemind/roundend_report() - var/list/result = list() - result += "Hive [hiveID]:" - 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!" - result += "The Hivemind Host was:" - result += printplayer(owner) - result += "The Awakened Vessels were:" - for(var/datum/mind/mind in avessels) - result += printplayer(mind) - return result.Join("
") - -/datum/antagonist/hivemind/is_gamemode_hero() - return SSticker.mode.name == "Assimilation" - -/datum/antagonist/hivemind/proc/generate_flavour() - var/static/list/prefix = list("Azure","Crimson","Silver","Verdant","Ivory","Sepia","Gold","Canary","Rust","Cider","Scarlet","Rose","Magenta","Navy","Lapis","Emerald") - var/static/list/postfix = list("Flame","Presence","Maw","Revelation","Consciousness","Blanket","Structure","Command","Hierarchy","Aristocrat","Zealotry","Fascination") - hiveID = pick_n_take(prefix) + " " + pick_n_take(postfix) - var/static/list/types = list( - "Domineering and opressive, not a pawn out of place, not a step out of line and ruthless with the oposition.", - "Crashing waves of assimilation, no subtlety, just the primal instinct to expand.", - "In one hand, the olive branch in the other; a knife.", - "Opulent and Aristocratic with ambitions to expand their fiefdom.", - "Seething with Rage and teeming with Anger, the former dominant personality amongst all, returning for its throne.", - "A Trickster with a preference for chaos, unpredictable, the emboddiment of mischief.", - "Benevolent to their own eyes, seeks to free living beings of the burden of free will.", - "Caring for their vessels and ruthless against those that would attack them, seeks to expand their protective embrace.", - "Diplomatic and calm mannered, may seek alliances of convenience to further their own gain.", - "Vulture-like and opportunistic, eager to pounce in a moment of weakness.", - "Pawns are mere Pawns, and they are expendable, crush our foes in a wave of meat." - ) - descriptor = pick_n_take(types) - -/datum/antagonist/hivemind/proc/create_actions() - psychic_plane = new(src) - plane_action = new(psychic_plane) - plane_action.Grant(owner.current) - -/datum/antagonist/hivemind/Destroy() - GLOB.hivehosts -= src - destroy_hive() - QDEL_NULL(psychic_plane) - QDEL_NULL(plane_action) - return ..() - -/datum/antagonist/hivemind/proc/dominance() - dominant = TRUE - if(!owner?.current) - return - var/mob/living/carbon/C = owner.current - if(!C) - return - to_chat(C, "With our psyche unleashed we will be able to sustain an unlimited ammount of awakened vessels!") - ADD_TRAIT(C, TRAIT_STUNIMMUNE, HIVEMIND_TRAIT) - ADD_TRAIT(C, TRAIT_SLEEPIMMUNE, HIVEMIND_TRAIT) - ADD_TRAIT(C, TRAIT_VIRUSIMMUNE, HIVEMIND_TRAIT) - ADD_TRAIT(C, TRAIT_NOLIMBDISABLE, HIVEMIND_TRAIT) - ADD_TRAIT(C, TRAIT_NOHUNGER, HIVEMIND_TRAIT) - ADD_TRAIT(C, TRAIT_NODISMEMBER, HIVEMIND_TRAIT) - ADD_TRAIT(C, TRAIT_NOSOFTCRIT, HIVEMIND_TRAIT) - ADD_TRAIT(C, TRAIT_NOHARDCRIT, HIVEMIND_TRAIT) diff --git a/code/modules/antagonists/hivemind/hivemind_overlays.dm b/code/modules/antagonists/hivemind/hivemind_overlays.dm deleted file mode 100644 index 9271f8963043b..0000000000000 --- a/code/modules/antagonists/hivemind/hivemind_overlays.dm +++ /dev/null @@ -1,30 +0,0 @@ -/datum/antagonist/hivemind/proc/add_hive_overlay/(mob/living/carbon/human/target) //for when someone is assimilated, so hive host can keep track properly - var/mob/living/carbon/human/host = owner.current - if(is_carbon_member(target)) - var/I = image('icons/misc/hivemind_images.dmi', loc = target, icon_state = "member") - host.client.images += I - -/datum/antagonist/hivemind/proc/add_hive_overlay_probe/(mob/living/carbon/human/target) //for when hive host probes someone who is in another hive - var/mob/living/carbon/human/host = owner.current - var/I = image('icons/misc/hivemind_images.dmi', loc = target, icon_state = "enemy") - host.client.images += I - -/datum/antagonist/hivemind/proc/remove_hive_overlay/(mob/living/carbon/human/target) - var/mob/living/carbon/human/host = owner.current - for(var/image/I in host.client.images) - if(I.loc == target && I.icon == 'icons/misc/hivemind_images.dmi') - host.client.images -= I - qdel(I) - -/datum/antagonist/hivemind/proc/remove_hive_overlay_probe/(mob/living/carbon/human/target) - var/mob/living/carbon/human/host = owner.current - for(var/image/I in host.client.images) - if(I.loc == target && I.icon == 'icons/misc/hivemind_images.dmi' && I.icon_state == "enemy") - host.client.images -= I - qdel(I) - -/datum/antagonist/hivemind/proc/regain_images() - var/mob/living/carbon/human/host = owner.current - for(var/datum/mind/mind as() in hivemembers) - var/I = image('icons/misc/hivemind_images.dmi', loc = mind.current, icon_state = "member") - host.client.images += I diff --git a/code/modules/antagonists/hivemind/hiveui.dm b/code/modules/antagonists/hivemind/hiveui.dm deleted file mode 100644 index 60498165895dd..0000000000000 --- a/code/modules/antagonists/hivemind/hiveui.dm +++ /dev/null @@ -1,96 +0,0 @@ -//Hivemind monitoring and powers shop - -/datum/psychic_plane - var/name = "psychic plane" - var/datum/antagonist/hivemind/hivehost - -/datum/psychic_plane/New(my_hivehost) - . = ..() - hivehost = my_hivehost - -/datum/psychic_plane/Destroy() - hivehost = null - . = ..() - - -/datum/psychic_plane/ui_state(mob/user) - return GLOB.always_state - -/datum/psychic_plane/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "PsychicPlane", "Psychic Plane") - ui.open() - ui.set_autoupdate(TRUE) - -/datum/psychic_plane/ui_data(mob/user) - var/list/data = list() - - data["hives"] = list() - for(var/datum/antagonist/hivemind/hivehosts in GLOB.hivehosts) - var/list/hive_data = list( - hive = hivehosts.hiveID, - size = hivehosts.hive_size, - charges = hivehosts.searchcharge, - avessel_number = hivehosts.avessels.len, - integrations = hivehosts.size_mod/5, - type = hivehosts.descriptor, - ) - data["hives"] += list(hive_data) - - - - return data - -/datum/psychic_plane/ui_act(action, params) - if(..()) - return - if(action == "track") - var/hivetarget = params["hiveref"] - var/mob/living/carbon/ourhive = hivehost.owner?.current - if(hivetarget == hivehost.hiveID) - to_chat(ourhive, "We cannot track ourselves!") - return - if(hivehost.searchcharge <= 0) - to_chat(ourhive, "We don't have any tracking charges!") - return - hivehost.searchcharge -= 1 - if(!do_after(ourhive, 5, ourhive, timed_action_flags = IGNORE_HELD_ITEM)) - to_chat(ourhive, "Our concentration has been broken!") - else - for(var/datum/antagonist/hivemind/hivehosts in GLOB.hivehosts) - if(hivehosts.hiveID == hivetarget) - var/mob/living/carbon/enemy = hivehosts.owner?.current - if(hivehosts.owner.current.stat == DEAD) //ourhive.get_virtual_z_level() != enemy.get_virtual_z_level() || - to_chat(ourhive, "We could not find [hivehosts.hiveID]") - else - var/dist = get_dist(ourhive.loc,enemy.loc) - var/dir = get_dir(ourhive.loc,enemy.loc) - switch(dist) - if(0 to 7) - to_chat(ourhive,"Their presence is immediately to the [dir2text(dir)]!") - if(8 to 15) - to_chat(ourhive,"We find their presence close, to the [dir2text(dir)]!") - if(16 to 31) - to_chat(ourhive,"We find traces in our vicinty. They are to the [dir2text(dir)] of us!") - else - to_chat(ourhive,"We find faint sparks far away. They are to the [dir2text(dir)] of us!") - - -/datum/action/innate/psychic_plane - name = "Psychic Plane" - icon_icon = 'icons/hud/actions/actions_hive.dmi' - button_icon_state = "scan" - background_icon_state = "bg_hive" - var/datum/psychic_plane/psychic_plane - -/datum/action/innate/psychic_plane/New(our_target) - . = ..() - button.name = name - if(istype(our_target, /datum/psychic_plane)) - psychic_plane = our_target - else - CRASH("psychic_plane action created with non plane") - -/datum/action/innate/psychic_plane/Activate() - psychic_plane.ui_interact(owner) diff --git a/code/modules/antagonists/hivemind/spells/hivemind_add.dm b/code/modules/antagonists/hivemind/spells/hivemind_add.dm deleted file mode 100644 index 979930d2986c5..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_add.dm +++ /dev/null @@ -1,56 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/hive_add - name = "Assimilate Vessel" - desc = "We silently add an unsuspecting target to the hive." - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - selection_type = "view" - action_icon_state = "add" - range = 7 - invocation_type = INVOCATION_NONE - clothes_req = 0 - max_targets = 1 - var/ignore_mindshield = FALSE - -/obj/effect/proc_holder/spell/targeted/hive_add/cast(list/targets, mob/living/user = usr) - var/mob/living/carbon/target = targets[1] - var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - var/success = FALSE - - if(HAS_TRAIT(target, TRAIT_HIVE_BURNT)) - to_chat(user, "This mind was ridden bare and holds no value anymore.") - revert_cast() - return - if(!target.mind || !target.client || target.stat == DEAD) - to_chat(user, "We detect no neural activity in this body.") - revert_cast() - return - - if((HAS_TRAIT(target, TRAIT_MINDSHIELD) && !ignore_mindshield) || istype(target.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/costume/foilhat)) - to_chat(user, "Powerful technology protects [target.name]'s mind.") - revert_cast() - return - - if(HAS_TRAIT(target, TRAIT_MINDSHIELD) && ignore_mindshield) - to_chat(user, "We bruteforce our way past the mental barriers of [target.name] and begin linking our minds!") - else - to_chat(user, "We begin linking our mind with [target.name]!") - - if(do_after(user, 5*(1.5**get_dist(user, target)), user, timed_action_flags = IGNORE_HELD_ITEM) && (user in viewers(range, target))) - if(do_after(user, 5*(1.5**get_dist(user, target)), user, timed_action_flags = IGNORE_HELD_ITEM) && (user in viewers(range, target))) - if((!HAS_TRAIT(target, TRAIT_MINDSHIELD) || ignore_mindshield) && (user in viewers(range, target))) - to_chat(user, "[target.name] was added to the Hive!") - success = TRUE - hive.add_to_hive(target) - if(ignore_mindshield) - to_chat(user, "We are briefly exhausted by the effort required by our enhanced assimilation abilities.") - user.Immobilize(50) - SEND_SIGNAL(target, COMSIG_NANITE_SET_VOLUME, 0) - else - to_chat(user, "We fail to connect to [target.name].") - else - to_chat(user, "We fail to connect to [target.name].") - else - to_chat(user, "We fail to connect to [target.name].") - - if(!success) - revert_cast() diff --git a/code/modules/antagonists/hivemind/spells/hivemind_barrier.dm b/code/modules/antagonists/hivemind/spells/hivemind_barrier.dm deleted file mode 100644 index 7e138e6b709be..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_barrier.dm +++ /dev/null @@ -1,45 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/forcewall/hive - name = "Telekinetic Field" - desc = "Our psionic powers form a barrier around us in the physical world that only we can pass through." - panel = "Hivemind Abilities" - charge_max = 600 - clothes_req = 0 - human_req = 1 - invocation_type = INVOCATION_NONE - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - action_icon_state = "forcewall" - range = -1 - include_user = 1 - antimagic_allowed = TRUE - wall_type = /obj/effect/forcefield/wizard/hive - var/wall_type_b = /obj/effect/forcefield/wizard/hive/invis - -/obj/effect/proc_holder/spell/targeted/forcewall/hive/cast(list/targets,mob/user = usr) - new wall_type(get_turf(user), null, user) - for(var/dir in GLOB.alldirs) - new wall_type_b(get_step(user, dir), null, user) - -/obj/effect/forcefield/wizard/hive - name = "Telekinetic Field" - desc = "You think, therefore it is." - timeleft = 150 - 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/CanAllowThrough(atom/movable/mover, turf/target) - . = ..() - if(mover == wizard) - return TRUE - return FALSE - -/obj/effect/forcefield/wizard/hive/invis - icon = null - icon_state = null - pixel_x = 0 - pixel_y = 0 - invisibility = INVISIBILITY_MAXIMUM diff --git a/code/modules/antagonists/hivemind/spells/hivemind_compell.dm b/code/modules/antagonists/hivemind/spells/hivemind_compell.dm deleted file mode 100644 index f492d1c3b4e19..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_compell.dm +++ /dev/null @@ -1,32 +0,0 @@ -/obj/effect/proc_holder/spell/target_hive/hive_compell - name = "Compell" - desc = "We forcefully insert a directive into a vessels mind for a limited time, they'll obey anything short of suicide." - action_icon_state = "empower" - - charge_max = 10 MINUTES - -/obj/effect/proc_holder/spell/target_hive/hive_compell/cast(list/targets, mob/living/user = usr) - var/mob/living/carbon/human/target = targets[1] - var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - var/success = FALSE - if(!hive) - to_chat(user, "This is a bug. Error:HIVE1") - return - if(!hive.hivemembers) - return - var/directive = stripped_input(user, "What objective do you want to give that vessel?", "Objective") - - if(target.mind && target.client && target.stat != DEAD) - if((!HAS_TRAIT(target, TRAIT_MINDSHIELD)) && !istype(target.get_item_by_slot(ITEM_SLOT_HEAD), /obj/item/clothing/head/costume/foilhat)) - if(!IS_HIVEHOST(target) && !IS_WOKEVESSEL(target)) - target.hive_weak_awaken(directive) - to_chat(user, "We successfully overpower their weak psyche!.") - success = TRUE - else - to_chat(user, "Complex mental barriers protect [target.name]'s mind.") - else - to_chat(user, "Powerful technology protects [target.name]'s mind.") - else - to_chat(user, "We detect no neural activity in this body.") - if(!success) - revert_cast() diff --git a/code/modules/antagonists/hivemind/spells/hivemind_dominance.dm b/code/modules/antagonists/hivemind/spells/hivemind_dominance.dm deleted file mode 100644 index f8cfd4f590ebf..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_dominance.dm +++ /dev/null @@ -1,49 +0,0 @@ -/obj/effect/proc_holder/spell/self/hive_dominance - name = "One Mind" - desc = "Our true power... finally within reach." - panel = "Hivemind Abilities" - charge_type = "charges" - charge_max = 1 - invocation_type = INVOCATION_NONE - clothes_req = 0 - human_req = 1 - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - action_icon_state = "assim" - antimagic_allowed = TRUE - -/obj/effect/proc_holder/spell/self/hive_dominance/cast(mob/living/user = usr) - var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(user, "This is a bug. Error:HIVE1") - return - hive.glow = mutable_appearance('icons/effects/hivemind.dmi', "awoken", -BODY_BEHIND_LAYER) - for(var/datum/mind/vessel in hive.avessels) - var/mob/living/carbon/C = vessel.current - C.Jitter(15) - C.Unconscious(150) - to_chat(C, "Something's wrong...") - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, "...your memories are becoming fuzzy."), 45) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, "You try to remember who you are..."), 90) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, "There is no you..."), 110) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, "...there is only us."), 130) - var/datum/antagonist/hivevessel/woke_vessel = IS_WOKEVESSEL(C) - if (woke_vessel) - woke_vessel.glow = hive.glow - addtimer(CALLBACK(C, TYPE_PROC_REF(/atom, add_overlay), hive.glow), 150) - - for(var/datum/antagonist/hivemind/enemy in GLOB.hivehosts) - if(enemy.owner) - enemy.owner.RemoveSpell(new/obj/effect/proc_holder/spell/self/hive_dominance) - var/mob/living/carbon/C = enemy.owner?.current - if(!(enemy.hiveID == hive.hiveID)) - to_chat(C, "Something's wrong...") - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, "...a new presence."), 45) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, "It feels overwhelming..."), 90) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, "It can't be!"), 110) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), C, "Get away, run!"), 130) - sound_to_playing_players('sound/effects/one_mind.ogg') - addtimer(CALLBACK(user, TYPE_PROC_REF(/atom, add_overlay), hive.glow), 150) - addtimer(CALLBACK(hive, TYPE_PROC_REF(/datum/antagonist/hivemind, dominance)), 150) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(send_to_playing_players), "THE ONE MIND RISES"), 150) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(sound_to_playing_players), 'sound/effects/magic.ogg'), 150) diff --git a/code/modules/antagonists/hivemind/spells/hivemind_hand.dm b/code/modules/antagonists/hivemind/spells/hivemind_hand.dm deleted file mode 100644 index b86a0be2b5bf5..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_hand.dm +++ /dev/null @@ -1,39 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/touch/hive_fist - name = "Mental Fist" - desc = "We channel the strength of our host's hive into a physical weapon, specially effective on rival hives." - hand_path = /obj/item/melee/touch_attack/hive_fist - school = "evocation" - charge_max = 150 - clothes_req = FALSE - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_icon_state = "hand" - action_background_icon_state = "bg_hive" - -/obj/item/melee/touch_attack/hive_fist - name = "Mental Fist" - desc = "The physical embodiment of a hivemind's might." - icon_state = "disintegrate" - item_state = "disintegrate" - catchphrase = null - -/obj/item/melee/touch_attack/hive_fist/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!proximity_flag || target == user) - return FALSE - var/use_charge = FALSE - if(ishuman(target)) - playsound(user, 'sound/items/welder.ogg', 75, TRUE) - var/mob/living/carbon/human/tar = target - var/datum/antagonist/hivemind/foe = IS_HIVEHOST(tar) - var/datum/antagonist/hivevessel/vessel = IS_WOKEVESSEL(tar) - var/datum/antagonist/hivevessel/vesselus = IS_WOKEVESSEL(user) - if(vessel) - foe = vessel.master - if(foe) - tar.adjustFireLoss(round(vesselus.master.hive_size * 0.75)) - tar.adjustStaminaLoss(15) - else - tar.adjustFireLoss(15) - tar.adjustStaminaLoss(40) - use_charge = TRUE - if(use_charge) - return ..() diff --git a/code/modules/antagonists/hivemind/spells/hivemind_heal.dm b/code/modules/antagonists/hivemind/spells/hivemind_heal.dm deleted file mode 100644 index 86bcd5ab3920c..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_heal.dm +++ /dev/null @@ -1,45 +0,0 @@ -/obj/effect/proc_holder/spell/self/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" - charge_max = 600 - clothes_req = 0 - invocation_type = INVOCATION_NONE - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - action_icon_state = "drain" - human_req = 1 - antimagic_allowed = TRUE - -/obj/effect/proc_holder/spell/self/hive_drain/cast(mob/living/carbon/human/user) - var/datum/antagonist/hivemind/hive = user.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(!user.getBruteLoss() && !user.getFireLoss() && !user.getCloneLoss() && !user.getOrganLoss(ORGAN_SLOT_BRAIN)) - to_chat(user, "We cannot heal ourselves any more with this power!") - revert_cast() - to_chat(user, "We begin siphoning power from our many vessels!") - while(iterations < 7) - var/mob/living/carbon/target = pick(carbon_members) - if(!do_after(user, 15, user, timed_action_flags = IGNORE_HELD_ITEM)) - to_chat(user, "Our concentration has been broken!") - break - if(!target) - to_chat(user, "We have run out of vessels to drain.") - break - if(target.getOrganLoss(ORGAN_SLOT_BRAIN) < 50) - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) - if(user.getBruteLoss() > user.getFireLoss()) - user.heal_ordered_damage(5, list(CLONE, BRUTE, BURN)) - else - user.heal_ordered_damage(5, list(CLONE, BURN, BRUTE)) - if(!user.getBruteLoss() && !user.getFireLoss() && !user.getCloneLoss()) //If we don't have any of these, stop looping - to_chat(user, "We finish our healing.") - break - iterations++ - user.setOrganLoss(ORGAN_SLOT_BRAIN, 0) diff --git a/code/modules/antagonists/hivemind/spells/hivemind_integrate.dm b/code/modules/antagonists/hivemind/spells/hivemind_integrate.dm deleted file mode 100644 index 8d6aa49d10f86..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_integrate.dm +++ /dev/null @@ -1,65 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/hive_integrate - name = "Integrate" - desc = "Allows us to syphon the psionic energy from a Host within our grasp." - panel = "Hivemind Abilities" - charge_max = 600 - range = 1 - max_targets = 0 - invocation_type = INVOCATION_NONE - clothes_req = 0 - human_req = 1 - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - action_icon_state = "reclaim" - antimagic_allowed = TRUE - -/obj/effect/proc_holder/spell/targeted/hive_integrate/cast(list/targets, mob/living/user = usr) - var/datum/antagonist/hivemind/hivehost = user.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hivehost) - to_chat(user, "This is a bug. Error:HIVE1") - return - var/mob/living/carbon/human/target = user.pulling - if(!target) - to_chat(user, "We must be grabbing a creature to integrate them!") - hivehost.isintegrating = FALSE - revert_cast() - return - if(!IS_HIVEHOST(target)) - to_chat(user, "Their mind is worthless to us!") - revert_cast() - return - if(hivehost.isintegrating) - to_chat(user, "We are already integrating a mind!") - revert_cast() - return - if(user.grab_state <= GRAB_NECK) - to_chat(user, "We must have a tighter grip to integrate their mind!") - revert_cast() - return - hivehost.isintegrating = TRUE - - for(var/i in 1 to 3) - switch(i) - if(1) - to_chat(user, "This shining mind is with reach.We must stay still..") - if(2) - user.visible_message("[user] places their hands on [target]'s head!", "We place our hands on their temple.") - if(3) - user.visible_message("[target] seems to be falling unconscious", "We begin to fragment [target]'s mind.") - to_chat(target, "Your consciousness begin to waver!") - - if(!do_after(user, 15 SECONDS, target)) - to_chat(user, "Our integration of [target] has been interrupted!") - hivehost.isintegrating = FALSE - return - to_chat(target, "You mind is shattered!") - hivehost.isintegrating = FALSE - var/datum/antagonist/hivemind/enemy = target.mind.has_antag_datum(/datum/antagonist/hivemind) - enemy.destroy_hive() //Just in case - target.gib() - hivehost.size_mod += 5 - hivehost.avessel_limit += 1 - flash_color(user, flash_color="#800080", flash_time=10) - to_chat(user,"We have reclaimed what gifts weaker minds were squandering and gain ever more insight on our psionic abilities.") - to_chat(user,"Thanks to this new strength we may awaken an additional vessel..") - hivehost.check_powers() diff --git a/code/modules/antagonists/hivemind/spells/hivemind_invasion.dm b/code/modules/antagonists/hivemind/spells/hivemind_invasion.dm deleted file mode 100644 index 47a107dde7cea..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_invasion.dm +++ /dev/null @@ -1,63 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/hive_hack - name = "Network Invasion" - desc = "We attack any foreign presences in the target mind keeping them only for ourselves. Takes longer if the target is not in our hive. Will grant us a tracking charge if successful." - panel = "Hivemind Abilities" - charge_max = 600 - range = 1 - invocation_type = INVOCATION_NONE - clothes_req = 0 - max_targets = 1 - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - action_icon_state = "hack" - antimagic_allowed = TRUE - -/obj/effect/proc_holder/spell/targeted/hive_hack/cast(list/targets, mob/living/user = usr) - var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(user, "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(user, "We begin probing [target.name]'s mind!") - if(do_after(user, 50, target, timed_action_flags = IGNORE_HELD_ITEM)) - if(!in_hive) - to_chat(user, "Their mind slowly opens up to us.") - if(!do_after(user, 75, target, timed_action_flags = IGNORE_HELD_ITEM)) - to_chat(user, "Our concentration has been broken!") - revert_cast() - return - for(var/datum/antagonist/hivemind/enemy as() in GLOB.hivehosts) - var/datum/mind/M = enemy.owner - if(!M?.current) - continue - if(M.current == user) - continue - if(enemy.is_carbon_member(target)) - var/mob/living/real_enemy = (M.current) - enemies += real_enemy - enemy.remove_from_hive(target) - to_chat(real_enemy, "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 && IS_HIVEHOST(target)) - var/atom/throwtarget - var/datum/antagonist/hivemind/hivetarget = target.mind.has_antag_datum(/datum/antagonist/hivemind) - throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(user, src))) - SEND_SOUND(user, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) - flash_color(user, flash_color="#800080", flash_time=10) - user.Paralyze(10) - user.throw_at(throwtarget, 5, 1,src) - to_chat(user, "A sudden surge of psionic energy, a recognizable presence, this is the host of [hivetarget.hiveID]") - return - if(enemies.len) - hive.remove_hive_overlay_probe(target) - to_chat(user, "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(user, "This vision has provided us insight on the mental lay, allowing us to track our foes.") - hive.searchcharge += 3 - else - to_chat(user, "We delve into the inner depths of their mind and strike at nothing, no enemies lurk inside this mind.") - else - to_chat(user, "Our concentration has been broken!") - revert_cast() diff --git a/code/modules/antagonists/hivemind/spells/hivemind_loyalty.dm b/code/modules/antagonists/hivemind/spells/hivemind_loyalty.dm deleted file mode 100644 index 8e16362f05c21..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_loyalty.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/effect/proc_holder/spell/self/hive_loyal - name = "Concentrated Infiltration" - desc = "We prepare for a focused attack on a mind, penetrating mindshield technology, the mindshield will still be present after the attack (toggle)." - panel = "Hivemind Abilities" - charge_max = 1 - invocation_type = INVOCATION_NONE - clothes_req = 0 - human_req = 1 - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - action_icon_state = "loyal" - antimagic_allowed = TRUE - -/obj/effect/proc_holder/spell/self/hive_loyal/cast(mob/living/user = usr) - var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(user, "This is a bug. Error:HIVE1") - return - var/obj/effect/proc_holder/spell/targeted/hive_add/the_spell = locate(/obj/effect/proc_holder/spell/targeted/hive_add) in user.mind.spell_list - if(!the_spell) - to_chat(user, "This is a bug. Error:HIVE5") - return - the_spell.ignore_mindshield = !active - to_chat(user, "We [active?"let our minds rest and ease up on our concentration.":"prepare to spear through mindshielding technology!"]") - active = !active - if(active) - revert_cast() diff --git a/code/modules/antagonists/hivemind/spells/hivemind_panic.dm b/code/modules/antagonists/hivemind/spells/hivemind_panic.dm deleted file mode 100644 index 4a8ca38421e30..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_panic.dm +++ /dev/null @@ -1,54 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/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" - charge_max = 900 - range = 7 - invocation_type = INVOCATION_NONE - clothes_req = 0 - max_targets = 0 - antimagic_allowed = TRUE - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - action_icon_state = "panic" - -/obj/effect/proc_holder/spell/targeted/induce_panic/cast(list/targets, mob/living/user = usr) - var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(user, "This is a bug. Error:HIVE1") - return - for(var/mob/living/carbon/human/target in targets) - if(target.stat == DEAD) - continue - target.Jitter(14) - target.apply_damage(35 + rand(0,15), STAMINA, target.get_bodypart(BODY_ZONE_HEAD)) - if(IS_HIVEHOST(target)) - continue - if(prob(20)) - var/text = pick(";HELP!","I'm losing control of the situation!!","Get me outta here!") - target.say(text, forced = "panic") - var/effect = rand(1,4) - switch(effect) - if(1) - to_chat(target, "You panic and drop everything to the ground!") - target.drop_all_held_items() - if(2) - to_chat(target, "You panic and flail around!") - target.click_random_mob() - addtimer(CALLBACK(target, TYPE_PROC_REF(/mob, click_random_mob)), 5) - addtimer(CALLBACK(target, TYPE_PROC_REF(/mob, click_random_mob)), 10) - addtimer(CALLBACK(target, TYPE_PROC_REF(/mob, click_random_mob)), 15) - addtimer(CALLBACK(target, TYPE_PROC_REF(/mob, click_random_mob)), 20) - addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living, Stun), 30), 25) - target.confused += 10 - if(3) - to_chat(target, "You freeze up in fear!") - target.Stun(30) - if(4) - to_chat(target, "You feel nauseous as dread washes over you!") - target.Dizzy(15) - target.apply_damage(30, STAMINA, target.get_bodypart(BODY_ZONE_HEAD)) - target.hallucination += 45 - - for(var/mob/living/silicon/target in targets) - target.Unconscious(50) diff --git a/code/modules/antagonists/hivemind/spells/hivemind_probe.dm b/code/modules/antagonists/hivemind/spells/hivemind_probe.dm deleted file mode 100644 index c4bd9f2db1678..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_probe.dm +++ /dev/null @@ -1,54 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/hive_probe - name = "Probe Mind" - desc = "We examine a mind for any enemy activity." - panel = "Hivemind Abilities" - charge_max = 30 - range = 1 - invocation_type = INVOCATION_NONE - clothes_req = 0 - max_targets = 1 - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - action_icon_state = "probe" - antimagic_allowed = TRUE - -/obj/effect/proc_holder/spell/targeted/hive_probe/cast(list/targets, mob/living/user = usr) - var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(user, "This is a bug. Error:HIVE1") - return - var/mob/living/carbon/target = targets[1] - var/detected - - - to_chat(user, "We begin probing [target.name]'s mind!") - if(do_after(user, 15, target, timed_action_flags = IGNORE_HELD_ITEM)) - for(var/datum/antagonist/hivemind/enemy as() in GLOB.hivehosts) - var/datum/mind/M = enemy.owner - if(!M?.current) - continue - if(M.current == user) - continue - if(enemy.owner == M && IS_HIVEHOST(target)) - detected = TRUE - var/atom/throwtarget - var/datum/antagonist/hivemind/hivetarget = target.mind.has_antag_datum(/datum/antagonist/hivemind) - throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(user, src))) - SEND_SOUND(user, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) - flash_color(user, flash_color="#800080", flash_time=10) - user.Paralyze(10) - user.throw_at(throwtarget, 5, 1,src) - to_chat(user, "A sudden surge of psionic energy, a recognizable presence, this is the host of [hivetarget.hiveID]!") - return - if(enemy.is_carbon_member(target)) - hive.add_hive_overlay_probe(target) - to_chat(user, "We have found the vile stain of [enemy.hiveID] within this mind!") - detected = TRUE - if(target.mind.has_antag_datum(/datum/antagonist/brainwashed) || IS_WOKEVESSEL(target)) - to_chat(user, "Our target is being controlled, their actions are not their own!.") - return - if(!detected) - to_chat(user, "Untroubled waters meet our tentative search, there is nothing out of the ordinary here.") - else - to_chat(user, "Our concentration has been broken!") - revert_cast() diff --git a/code/modules/antagonists/hivemind/spells/hivemind_rally.dm b/code/modules/antagonists/hivemind/spells/hivemind_rally.dm deleted file mode 100644 index 49abb9ea945f1..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_rally.dm +++ /dev/null @@ -1,38 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/hive_rally - name = "Hive Rythms" - desc = "We send out a burst of psionic energy, invigorating us and nearby awakened vessels, removing any stuns." - panel = "Hivemind Abilities" - charge_max = 3000 - range = 7 - invocation_type = INVOCATION_NONE - clothes_req = 0 - max_targets = 0 - include_user = 1 - antimagic_allowed = TRUE - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - action_icon_state = "rally" - -/obj/effect/proc_holder/spell/targeted/hive_rally/cast(list/targets, mob/living/user = usr) - var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!targets) - to_chat(user, "Nobody is in sight, it'd be a waste to do that now.") - revert_cast() - return - var/list/victims = list() - for(var/mob/living/target in targets) - if(IS_HIVEHOST(target)) - victims += target - var/datum/mind/mind = target.mind - if(mind in hive.avessels) - victims += target - flash_color(target, flash_color="#800080", flash_time=10) - for(var/mob/living/carbon/affected in victims) - to_chat(affected, "Otherworldly strength flows through us!") - affected.SetSleeping(0) - affected.SetUnconscious(0) - affected.SetStun(0) - affected.SetKnockdown(0) - affected.SetImmobilized(0) - affected.SetParalyzed(0) - affected.adjustStaminaLoss(-200) diff --git a/code/modules/antagonists/hivemind/spells/hivemind_see.dm b/code/modules/antagonists/hivemind/spells/hivemind_see.dm deleted file mode 100644 index 5fdb78cbf469c..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_see.dm +++ /dev/null @@ -1,45 +0,0 @@ -/obj/effect/proc_holder/spell/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." - action_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 - - charge_max = 20 - -/obj/effect/proc_holder/spell/target_hive/hive_see/on_lose(mob/living/user) - user.reset_perspective() - user.clear_fullscreen("hive_eyes") - -/obj/effect/proc_holder/spell/target_hive/hive_see/cast(list/targets, mob/living/user = usr) - if(!active) - vessel = targets[1] - if(vessel) - vessel.apply_status_effect(STATUS_EFFECT_BUGGED, user) - user.reset_perspective(vessel) - active = TRUE - host = user - user.overlay_fullscreen("hive_eyes", /atom/movable/screen/fullscreen/hive_eyes) - revert_cast() - else - vessel.remove_status_effect(STATUS_EFFECT_BUGGED) - user.reset_perspective() - user.clear_fullscreen("hive_eyes") - active = FALSE - revert_cast() - -/obj/effect/proc_holder/spell/target_hive/hive_see/process() - if(active && (!vessel || !is_hivemember(vessel) || QDELETED(vessel))) - to_chat(host, "Our vessel is one of us no more!") - host.reset_perspective() - host.clear_fullscreen("hive_eyes") - active = FALSE - if(!QDELETED(vessel)) - vessel.remove_status_effect(STATUS_EFFECT_BUGGED) - ..() - -/obj/effect/proc_holder/spell/target_hive/hive_see/choose_targets(mob/user = usr) - if(!active) - ..() - else - perform(null,user) diff --git a/code/modules/antagonists/hivemind/spells/hivemind_shatter.dm b/code/modules/antagonists/hivemind/spells/hivemind_shatter.dm deleted file mode 100644 index 8537e1f6f2014..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_shatter.dm +++ /dev/null @@ -1,41 +0,0 @@ -/obj/effect/proc_holder/spell/target_hive/hive_shatter - name = "Crush Protections" - desc = "We destroy any Mindshield implants a vesssel might have, granting us further control over their mind." - action_icon_state = "shatter" - - charge_max = 1800 - - var/static/list/special_roles // security roles + Captain are resistant against this spell - -/obj/effect/proc_holder/spell/target_hive/hive_shatter/Initialize(mapload) - . = ..() - if(!special_roles) - special_roles = SSdepartment.get_jobs_by_dept_id(DEPT_NAME_SECURITY) + JOB_NAME_CAPTAIN - -/obj/effect/proc_holder/spell/target_hive/hive_shatter/cast(list/targets, mob/living/user = usr) - var/mob/living/carbon/human/target = targets[1] - var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - var/success = FALSE - if(!hive) - to_chat(user, "This is a bug. Error:HIVE1") - return - if(!hive.hivemembers) - return - if(target.mind?.assigned_role in special_roles) - to_chat(user, "A subconsciously trained response barely protects [target.name]'s mind.") - to_chat(target, "Powerful mental attacks strike out against us, our training allows us to barely overcome it.") - return - if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) - if(!do_after(user,200, timed_action_flags = IGNORE_HELD_ITEM)) - for(var/obj/item/implant/mindshield/M in target.implants) - to_chat(user, "We shatter their mental protections!") - to_chat(target, "You feel a pang of pain course through your head!") - flash_color(target, flash_color="#800080", flash_time=10) - qdel(M) - - else - to_chat(user, "Our concentration has been broken!") - else - to_chat(user, "No protections are present in [target]'s mind.") - if(!success) - revert_cast() diff --git a/code/modules/antagonists/hivemind/spells/hivemind_shock.dm b/code/modules/antagonists/hivemind/spells/hivemind_shock.dm deleted file mode 100644 index c6c8772cccd86..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_shock.dm +++ /dev/null @@ -1,43 +0,0 @@ -/obj/effect/proc_holder/spell/target_hive/hive_shock - name = "Neural Shock" - desc = "After a short charging time, we overload the mind of one of our vessels with psionic energy, rendering them unconscious for a short period of time. This power weakens over distance, but strengthens with hive size." - action_icon_state = "shock" - - charge_max = 600 - -/obj/effect/proc_holder/spell/target_hive/hive_shock/cast(list/targets, mob/living/user = usr) - var/mob/living/carbon/human/target = targets[1] - var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive) - to_chat(user, "This is a bug. Error:HIVE1") - return - to_chat(user, "We begin increasing the psionic bandwidth between ourself and the vessel!") - if(do_after(user, 30, user, timed_action_flags = IGNORE_HELD_ITEM)) - if(target.mind.assigned_role in (SSdepartment.get_jobs_by_dept_id(DEPT_NAME_SECURITY) || SSdepartment.get_jobs_by_dept_id(DEPT_NAME_COMMAND))) //Doesn't work on sec or command for balance reasons - to_chat(user, "A subconsciously trained response barely protects [target.name]'s mind.") - to_chat(target, "Powerful mental attacks strike out against us, our training allows us to barely overcome it.") - return - if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) - to_chat(user, "Powerful technology protects [target.name]'s mind.") - return - if(!IS_HIVEHOST(target)) - var/power = 120-get_dist(user, target) - switch(hive.hive_size) - if(0 to 4) - if(5 to 9) - power *= 1.5 - if(10 to 14) - power *= 2 - if(15 to 19) - power *= 2.5 - else - power *= 3 - if(power > 50 && user.get_virtual_z_level() == target.get_virtual_z_level()) - to_chat(user, "We have overloaded the vessel for a short time!") - target.Jitter(round(power/10)) - target.Unconscious(power) - else - to_chat(user, "The vessel was too far away to be affected!") - else - to_chat(user, "Our concentration has been broken!") - revert_cast() diff --git a/code/modules/antagonists/hivemind/spells/hivemind_spells.dm b/code/modules/antagonists/hivemind/spells/hivemind_spells.dm deleted file mode 100644 index b3efaf8ddb844..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_spells.dm +++ /dev/null @@ -1,42 +0,0 @@ -/obj/effect/proc_holder/spell/target_hive - panel = "Hivemind Abilities" - invocation_type = INVOCATION_NONE - selection_type = "range" - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - action_icon_state = "spell_default" - clothes_req = 0 - human_req = 1 - antimagic_allowed = TRUE - range = 0 //SNOWFLAKE, 0 is unlimited for target_external=0 spells - var/target_external = 0 //Whether or not we select targets inside or outside of the hive - - -/obj/effect/proc_holder/spell/target_hive/choose_targets(mob/user = usr) - var/datum/antagonist/hivemind/hive = user.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hive || !hive.hivemembers) - to_chat(user, "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(range, user, selection_type)) - if(user == H) - continue - if(!can_target(H)) - continue - if(!hive.is_carbon_member(H)) - possible_targets += H - else - possible_targets = hive.get_carbon_members() - if(range) - possible_targets &= view_or_range(range, user, selection_type) - - var/mob/living/carbon/human/H = input("Choose the target for the spell.", "Targeting") as null|mob in possible_targets - if(!H) - revert_cast() - return - targets += H - perform(targets,user=user) - diff --git a/code/modules/antagonists/hivemind/spells/hivemind_thrall.dm b/code/modules/antagonists/hivemind/spells/hivemind_thrall.dm deleted file mode 100644 index b026197dc41cb..0000000000000 --- a/code/modules/antagonists/hivemind/spells/hivemind_thrall.dm +++ /dev/null @@ -1,76 +0,0 @@ -/obj/effect/proc_holder/spell/targeted/hive_thrall - name = "Awaken Vessel" - desc = "We awaken one of our vessels, permanently turning them into an extension of our will, we can only sustain two awakened vessels increasing with integrations." - panel = "Hivemind Abilities" - charge_max = 600 - range = 1 - max_targets = 0 - invocation_type = INVOCATION_NONE - clothes_req = 0 - human_req = 1 - action_icon = 'icons/hud/actions/actions_hive.dmi' - action_background_icon_state = "bg_hive" - action_icon_state = "chaos" - antimagic_allowed = TRUE - -/obj/effect/proc_holder/spell/targeted/hive_thrall/cast(list/targets, mob/living/user = usr) - var/datum/antagonist/hivemind/hivehost = user.mind.has_antag_datum(/datum/antagonist/hivemind) - if(!hivehost) - to_chat(user, "This is a bug. Error:HIVE1") - return - if((hivehost.avessels.len >= hivehost.avessel_limit) && !hivehost.dominant) - to_chat(user, "We can't support another awakened vessel!") - return - var/mob/living/carbon/human/target = user.pulling - if(!target) - to_chat(user, "We must be grabbing a creature to awaken them!") - hivehost.isintegrating = FALSE - revert_cast() - return - if(!is_hivemember(target)) - to_chat(user, "They must be a vessel in order to be awakened!") - revert_cast() - return - if(hivehost.isintegrating) - to_chat(user, "We are already awakening a vessel!") - revert_cast() - return - if(user.grab_state == GRAB_PASSIVE) - to_chat(user, "We must tighten our grip to be able to awaken their mind!") - revert_cast() - return - if(IS_HIVEHOST(target) || IS_WOKEVESSEL(target) || HAS_TRAIT(target, TRAIT_MINDSHIELD)) - to_chat(user, "Complex mental barriers protect [target.name]'s mind.") - revert_cast() - return - hivehost.isintegrating = TRUE - - for(var/i in 1 to 3) - switch(i) - if(1) - to_chat(user, "We tap into our vessel's mind. We must stay still..") - if(2) - user.visible_message("[user] places their hands on [target]'s head!", "We place our hands on their temple") - if(3) - user.visible_message("[target] begins to look frantic!", "We begin to override [target]'s consciousness with our own.") - to_chat(target, "Your consciousness beings to waver!") - - if(!do_after(user, 2 SECONDS, target)) - to_chat(user, "Our awakening of [target] has been interrupted!") - hivehost.isintegrating = FALSE - return - hivehost.isintegrating = FALSE - var/datum/antagonist/hivevessel/V = new /datum/antagonist/hivevessel() - hivehost.avessels += target.mind - V.master = hivehost - V.hiveID = hivehost.hiveID - target.mind.add_antag_datum(V) - var/O = "Obey and Protect your Hive Host, [user]" - var/datum/objective/brainwashing/objective = new(O) - V.objectives += objective - log_objective(V, objective.explanation_text) - flash_color(user, flash_color="#800080", flash_time=10) - to_chat(user,"This vessel is now an extension of our will.") - if(hivehost.dominant) - V.glow = hivehost.glow - target.add_overlay(hivehost.glow) diff --git a/code/modules/antagonists/hivemind/vessel.dm b/code/modules/antagonists/hivemind/vessel.dm deleted file mode 100644 index fa5feaa7ac8ef..0000000000000 --- a/code/modules/antagonists/hivemind/vessel.dm +++ /dev/null @@ -1,69 +0,0 @@ - - -/datum/antagonist/hivevessel - name = "Awoken Vessel" - banning_key = ROLE_HIVE_VESSEL - roundend_category = "awoken vessels" - antagpanel_category = "Other" - show_name_in_check_antagonists = TRUE - var/hiveID = "Hivemind" - var/datum/antagonist/hivemind/master - var/mutable_appearance/glow - var/obj/effect/proc_holder/spell/targeted/touch/hive_fist/fist = new - show_in_roundend = FALSE - - -/mob/living/proc/hive_weak_awaken(directive) - var/mob/living/user = src - if(!mind) - return - if(!HAS_TRAIT(user, TRAIT_MINDSHIELD)) - to_chat(user, "Foreign energies force themselves upon your thoughts!") - flash_color(user, flash_color="#800080", flash_time=10) - var/objective = brainwash(user, directive, "hivemind compel") - to_chat(user, "A figment of your subconscious stays firm, you would be incapable of killing yourself if ordered!") - user.overlay_fullscreen("hive_mc", /atom/movable/screen/fullscreen/hive_mc) - addtimer(CALLBACK(user, PROC_REF(hive_weak_clear), objective), 1800, TIMER_STOPPABLE) - -/mob/living/proc/hive_weak_clear(objective) - if(!mind || !objective) - return - var/mob/living/user = mind.current - to_chat(user, "Our subconscious fights back the invasive forces, our will is once again our own!") - flash_color(user, flash_color="#800080", flash_time=10) - user.clear_fullscreen("hive_mc") - unbrainwash(user, objective) - -/datum/antagonist/hivevessel/on_gain() - owner.special_role = ROLE_HIVE_VESSEL - owner.AddSpell(fist) - ..() - -/datum/antagonist/hivevessel/on_removal() - remove_innate_effects() - owner.RemoveSpell(fist) - if(master) - to_chat(master.owner, "A figment of our consciousness snaps out, we have lost an awakened vessel!") - if(owner?.current && glow) - owner.current.cut_overlay(glow) - owner.special_role = null - master.avessels -= owner - master = null - ..() - -/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.") - master.update_hivemind_hud(owner.current) - -/datum/antagonist/hivevessel/remove_innate_effects() - handle_clown_mutation(owner.current, removing=FALSE) - master.update_hivemind_hud_removed(owner.current) - -/datum/antagonist/hivevessel/greet() - to_chat(owner, "Your mind is suddenly opened, as you see the pinnacle of evolution...") - to_chat(owner, "Complete the orders of your host, no matter what!") - -/datum/antagonist/hivevessel/farewell() - to_chat(owner, "Your mind closes up once more...") - to_chat(owner, "You feel the weight of your objectives disappear! You no longer have to obey them.") - diff --git a/code/modules/antagonists/role_preference/role_antagonists.dm b/code/modules/antagonists/role_preference/role_antagonists.dm index 225b68b3f3e72..bb18b7e1cc191 100644 --- a/code/modules/antagonists/role_preference/role_antagonists.dm +++ b/code/modules/antagonists/role_preference/role_antagonists.dm @@ -252,32 +252,6 @@ head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch r_hand = /obj/item/melee/touch_attack/mansus_fist -/datum/role_preference/antagonist/hivemind_host - name = "Hivemind Host" - description = "A powerful host of a Hivemind. Assimilate crew into your hive to grow your power. \ - Use the members of your hive as machines in your objectives, and work with or against other Hiveminds on the station." - antag_datum = /datum/antagonist/hivemind - category = ROLE_PREFERENCE_CATEGORY_LEGACY - -/datum/role_preference/antagonist/hivemind_host/get_preview_icon() - var/icon/background = icon('icons/effects/hivemind.dmi', "awoken") - var/icon/outfit = render_preview_outfit(/datum/outfit/hivemind_host_preview) - background.Blend(outfit, ICON_OVERLAY) - return finish_preview_icon(background) - -/datum/outfit/hivemind_host_preview - name = "Hivemind Host (Preview only)" - glasses = /obj/item/clothing/glasses/sunglasses/advanced/reagent - uniform = /obj/item/clothing/under/rank/civilian/bartender - suit = /obj/item/clothing/suit/armor/vest - -/datum/outfit/hivemind_host_preview/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - H.hair_style = "Bob Hair 4" - H.hair_color = "111" - H.gradient_style = "Reflected Inverse" - H.gradient_color = "808" - H.update_hair() - /datum/role_preference/antagonist/incursionist name = "Incursionist" description = "As a member of the Syndicate Incursion, work with your team of agents to accomplish your objectives.\n\ diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 057478bfc54c5..2462925d8acce 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -67,11 +67,6 @@ if(SSticker.HasRoundStarted()) SSblackbox.ReportDeath(src) 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_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(HAS_TRAIT(src, TRAIT_DROPS_ITEMS_ON_DEATH)) //if you want to add anything else, do it before this if statement var/list/turfs_to_throw = view(2, src) for(var/obj/item/I in contents) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 388d0ba0f5ccf..a3d1f2fda902c 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -30,6 +30,3 @@ var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) if(changeling) changeling.regain_powers() - var/datum/antagonist/hivemind/hivemind = mind.has_antag_datum(/datum/antagonist/hivemind) - if(hivemind) - hivemind.regain_images() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index c38ccc49a781d..cc3fbc9afc681 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1634,18 +1634,7 @@ M.dizziness = max(0, M.dizziness-6) M.confused = max(0, M.confused-6) M.disgust = max(0, M.disgust-6) - if(dosage >= 25) //45 seconds - if(is_hivemember(M)) - for(var/datum/antagonist/hivemind/hive in GLOB.antagonists) - if(hive.hivemembers.Find(M.mind)) - var/mob/living/carbon/C = hive.owner.current - if(C?.mind) - to_chat(C, "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(IS_WOKEVESSEL(M)) - M.mind.remove_antag_datum(/datum/antagonist/hivevessel) - ADD_TRAIT(M, TRAIT_HIVE_BURNT, HIVEMIND_TRAIT) - to_chat(M, "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!") - remove_hivemember(M) + var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) if(mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then...