diff --git a/code/modules/antagonists/hivemind/hivemind.dm b/code/modules/antagonists/hivemind/hivemind.dm index 5166240a65a..f3f2686db26 100644 --- a/code/modules/antagonists/hivemind/hivemind.dm +++ b/code/modules/antagonists/hivemind/hivemind.dm @@ -42,9 +42,6 @@ owner.AddSpell(the_spell) if(hive_size > 0) to_chat(owner, "We have unlocked [the_spell.name]. [the_spell.desc]") - else if(hive_size < level && (locate(power) in owner.spell_list)) - owner.RemoveSpell(power) - /datum/antagonist/hivemind/proc/get_real_name() //Gets the real name of the host, even if they're temporarily in another one var/obj/effect/proc_holder/spell/target_hive/hive_control/the_spell = locate(/obj/effect/proc_holder/spell/target_hive/hive_control) in owner.spell_list diff --git a/code/modules/spells/spell_types/hivemind.dm b/code/modules/spells/spell_types/hivemind.dm index 7f0188714dd..ea476af0ed7 100644 --- a/code/modules/spells/spell_types/hivemind.dm +++ b/code/modules/spells/spell_types/hivemind.dm @@ -46,8 +46,8 @@ selection_type = "view" action_icon_state = "add" - charge_max = 150 - range = 4 + charge_max = 200 + range = 7 target_external = 1 var/ignore_mindshield = FALSE @@ -62,8 +62,8 @@ 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_mob(user,user,50)) - if((target in view(range))) + if(do_after(user,5*(1.5**get_dist(user, target)),0,user) && target in view(range)) + if(do_after(user,5*(1.5**get_dist(user, target)),0,user) && target in view(range)) to_chat(user, "[target.name] was added to the Hive!") success = TRUE hive.add_to_hive(target) @@ -72,7 +72,7 @@ for(var/obj/item/implant/mindshield/M in target.implants) qdel(M) else - to_chat(user, "[target.name] is too far away to assimilate!") + to_chat(user, "We fail to connect to [target.name].") else to_chat(user, "We fail to connect to [target.name].") else @@ -89,7 +89,7 @@ action_icon_state = "remove" charge_max = 100 - range = 4 + range = 7 /obj/effect/proc_holder/spell/target_hive/hive_remove/cast(list/targets, mob/living/user = usr) var/mob/living/carbon/human/target = targets[1] @@ -153,7 +153,7 @@ 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_mob(user,user,60)) + if(do_after(user,60,0,user)) var/power = 120-get_dist(user, target) if(!is_hivehost(target)) switch(hive.hive_size) @@ -191,7 +191,7 @@ /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) + if(!hive || !hive.hivemembers) return var/iterations = 0 @@ -201,7 +201,7 @@ to_chat(user, "We begin siphoning power from our many vessels!") while(iterations < 7) var/mob/living/carbon/human/target = pick(hive.hivemembers) - if(!do_mob(user,user,15)) + if(!do_after(user,15,0,user)) to_chat(user, "Our concentration has been broken!") break if(!target) @@ -231,9 +231,12 @@ to_chat(src, "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 + /obj/effect/proc_holder/spell/target_hive/hive_control name = "Mind Control" - desc = "We assume direct control of one of our vessels, leaving our current body for up to ten seconds, although a larger hive may be able to sustain it for up to two minutes. Powers can be used via our vessel, although if it dies, the entire hivemind will come down with it." + desc = "We assume direct control of one of our vessels, leaving our current body for up to ten seconds, although a larger hive may be able to sustain it for up to two minutes. 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." charge_max = 600 action_icon_state = "force" active = FALSE @@ -255,6 +258,8 @@ 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)) @@ -293,7 +298,7 @@ original_body = user vessel = targets[1] to_chat(user, "We begin merging our mind with [vessel.name].") - if(!do_mob(user,user,50)) + if(!do_after(user,50,0,user)) to_chat(user, "We fail to assume control of the target.") revert_cast() return @@ -323,10 +328,12 @@ backseat.real_name = vessel.real_name vessel.mind.transfer_to(backseat, 1) user.mind.transfer_to(vessel, 1) + backseat.blind_eyes(power) active = TRUE time_initialized = world.time revert_cast() - if(do_mob(user,user,power)) + to_chat(vessel, "We can sustain our control for a maximum of [round(power/10)] seconds.") + if(do_after(user,power,0,user)) to_chat(vessel, "We cannot sustain the mind control any longer and release control!") else to_chat(vessel, "Our body has been disturbed, interrupting the mind control!") @@ -387,7 +394,7 @@ if(target.stat == DEAD) continue target.Jitter(14) - target.adjustStaminaLoss(min(35,hive.hive_size)) + target.apply_damage(min(35,hive.hive_size), STAMINA, target.get_bodypart(BODY_ZONE_HEAD)) if(prob(50)) var/text = pick(";HELP!","I'm losing control of the situation!!","Get me outta here!") target.say(text, forced = "panic") @@ -410,7 +417,7 @@ if(4) to_chat(target, "You feel nauseous as dread washes over you!") target.Dizzy(15) - target.adjustStaminaLoss(45) + target.apply_damage(45, STAMINA, target.get_bodypart(BODY_ZONE_HEAD)) target.hallucination += 45 /obj/effect/proc_holder/spell/target_hive/hive_attack @@ -433,7 +440,7 @@ /obj/effect/proc_holder/spell/target_hive/hive_warp name = "Distortion Field" - desc = "We warp reality surrounding a vessel, causing hallucinations in everybody around them. This power gets weaker over distance but increases in strength the larger our hive is, and will eventually weaken those caught within the field." + desc = "We warp reality surrounding a vessel, causing hallucinations in everybody around them over a short period of time, eventually weakening those caught within the field. This power's effectiveness scales with hive size." charge_max = 900 action_icon_state = "warp" @@ -444,26 +451,29 @@ if(!hive) to_chat(user, "This is a bug. Error:HIVE1") return - var/power = 50-round(get_dist(user, target)/2) - if(power < 10 || target.z != user.z) + if(target.z != user.z) to_chat(user, "We are too far away from [target.name] to affect them!") return to_chat(user, "We successfully distort reality surrounding [target.name]!") - switch(hive.hive_size) - if(5 to 9) - if(10 to 14) - power *= 1.5 - if(15 to 19) - power *= 2 - if(20 to 24) - power *= 2.5 - else - power *= 3 + var/pulse_cap = min(12,max(6, round(3+hive.hive_size/3))) + distort(user, target, pulse_cap) + +/obj/effect/proc_holder/spell/target_hive/hive_warp/proc/distort(user, target, pulse_cap, pulses = 0) for(var/mob/living/carbon/human/victim in view(7,target)) if(user == victim) continue - victim.hallucination += power - victim.adjustStaminaLoss(max(0,power-100)) + if(pulses < 4) + victim.apply_damage(10, STAMINA, victim.get_bodypart(BODY_ZONE_HEAD)) // 25 over 10 seconds when taking stamina regen (3 per tick(2 seconds)) into account + victim.hallucination += 5 + else if(pulses < 8) + victim.apply_damage(15, STAMINA, victim.get_bodypart(BODY_ZONE_HEAD)) // 45 over 10 seconds when taking stamina regen into account + victim.hallucination += 10 + else + victim.apply_damage(20, STAMINA, victim.get_bodypart(BODY_ZONE_HEAD)) // 65 over 10 seconds when taking stamina regen into account + victim.hallucination += 15 + + if(pulses < pulse_cap && user && target) + addtimer(CALLBACK(src, "distort", user, target, pulse_cap, pulses+1), 25) /obj/effect/proc_holder/spell/targeted/hive_hack name = "Network Invasion" @@ -489,10 +499,10 @@ var/enemy_names = "" to_chat(user, "We begin probing [target.name]'s mind!") - if(do_mob(user,target,100)) + if(do_after(user,100,0,target)) if(!in_hive) to_chat(user, "Their mind slowly opens up to us.") - if(!do_mob(user,target,200)) + if(!do_after(user,200,0,target)) to_chat(user, "Our concentration has been broken!") revert_cast() return @@ -542,7 +552,7 @@ to_chat(user, "We tear into [target.name]'s mind with all our power!") to_chat(target, "You feel an excruciating pain in your head!") - if(do_mob(user,target,150)) + if(do_after(user,150,1,target)) if(!target.mind) to_chat(user, "This being has no mind!") revert_cast() @@ -553,7 +563,7 @@ to_chat(target, "Our grip on our mind is slipping!") target.Jitter(14) target.setBrainLoss(125) - if(do_mob(user,target,300)) + if(do_after(user,300,1,target)) enemy_hive = target.mind.has_antag_datum(/datum/antagonist/hivemind) //Check again incase they lost it somehow if(enemy_hive) to_chat(user, "Ours. It is ours. Our mind has never been stronger, never been larger, never been mightier. And theirs is no more.")