Assimilation update: Aesthetic edition (Plus ghost alerts) (#42048)

* aesthetic

* powers remove properly

* oops

* cooldown

* sanity

* mc buggo
This commit is contained in:
Kierany9
2018-12-28 11:37:02 +01:00
committed by Jordie
parent 713ca3d0f1
commit d1638a31f3
8 changed files with 58 additions and 15 deletions

View File

@@ -115,6 +115,16 @@
layer = CURSE_LAYER
plane = FULLSCREEN_PLANE
/obj/screen/fullscreen/hive_mc
icon_state = "hive_mc"
layer = CURSE_LAYER
plane = FULLSCREEN_PLANE
/obj/screen/fullscreen/hive_eyes
icon_state = "hive_eyes"
layer = CURSE_LAYER
plane = FULLSCREEN_PLANE
/obj/screen/fullscreen/impaired
icon_state = "impairedoverlay"

View File

@@ -22,6 +22,20 @@
/proc/is_hivehost(mob/living/M)
return M && M.mind && M.mind.has_antag_datum(/datum/antagonist/hivemind)
/proc/is_real_hivehost(mob/living/M) //This proc ignores mind controlled vessels
if(!M || !M.mind)
return FALSE
var/datum/antagonist/hivemind/hive = M.mind.has_antag_datum(/datum/antagonist/hivemind)
if(!hive)
return FALSE
var/obj/effect/proc_holder/spell/target_hive/hive_control/the_spell = locate(/obj/effect/proc_holder/spell/target_hive/hive_control) in M.mind.spell_list
if(the_spell && the_spell.active)
if(the_spell.original_body == M)
return TRUE
else
return TRUE
return FALSE
/proc/is_hivemember(mob/living/M)
if(!M)
return FALSE

View File

@@ -108,10 +108,9 @@
/datum/antagonist/hivemind/on_removal()
//Remove all hive powers here
hive_size = -1
check_powers()
for(var/power in upgrade_tiers)
owner.RemoveSpell(power)
if(!silent && owner.current)
to_chat(owner.current,"<span class='userdanger'> Your psionic powers fade, you are no longer the hivemind's host! </span>")
@@ -178,7 +177,7 @@
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.</b>")
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE)
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/assimilation.ogg', 100, FALSE, pressure_affected = FALSE)
owner.announce_objectives()

View File

@@ -64,13 +64,16 @@
to_chat(user, "<span class='notice'>We begin linking our mind with [target.name]!</span>")
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, "<span class='notice'>[target.name] was added to the Hive!</span>")
success = TRUE
hive.add_to_hive(target)
if(ignore_mindshield)
SEND_SIGNAL(target, COMSIG_NANITE_SET_VOLUME, 0)
for(var/obj/item/implant/mindshield/M in target.implants)
qdel(M)
if((!target.has_trait(TRAIT_MINDSHIELD) || ignore_mindshield) && target in view(range))
to_chat(user, "<span class='notice'>[target.name] was added to the Hive!</span>")
success = TRUE
hive.add_to_hive(target)
if(ignore_mindshield)
SEND_SIGNAL(target, COMSIG_NANITE_SET_VOLUME, 0)
for(var/obj/item/implant/mindshield/M in target.implants)
qdel(M)
else
to_chat(user, "<span class='notice'>We fail to connect to [target.name].</span>")
else
to_chat(user, "<span class='notice'>We fail to connect to [target.name].</span>")
else
@@ -109,10 +112,11 @@
var/mob/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 = 50
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)
@@ -121,10 +125,17 @@
user.reset_perspective(vessel)
active = TRUE
host = user
user.clear_fullscreen("hive_mc")
user.overlay_fullscreen("hive_eyes", /obj/screen/fullscreen/hive_eyes)
revert_cast()
else
user.reset_perspective()
user.clear_fullscreen("hive_eyes")
var/obj/effect/proc_holder/spell/target_hive/hive_control/the_spell = locate(/obj/effect/proc_holder/spell/target_hive/hive_control) in user.mind.spell_list
if(the_spell && the_spell.active)
user.overlay_fullscreen("hive_mc", /obj/screen/fullscreen/hive_mc)
active = FALSE
revert_cast()
/obj/effect/proc_holder/spell/target_hive/hive_see/process()
if(active && (!vessel || !is_hivemember(vessel) || QDELETED(vessel)))
@@ -253,6 +264,7 @@
charge_counter = max((0.5-(world.time-time_initialized)/power)*charge_max, 0) //Partially refund the power based on how long it was used, up to a max of half the charge time
if(!QDELETED(vessel))
vessel.clear_fullscreen("hive_mc")
if(vessel.mind)
if(QDELETED(original_body))
vessel.ghostize(0)
@@ -322,6 +334,8 @@
message_admins("[ADMIN_LOOKUPFLW(vessel)] has been temporarily taken over by [ADMIN_LOOKUPFLW(user)] (Hivemind Host).")
log_game("[key_name(vessel)] was Mind Controlled by [key_name(user)].")
deadchat_broadcast("<span class='deadsay'><span class='name'>[vessel]</span> has just been mind controlled!</span>", vessel)
original_body = user
backseat.loc = vessel
backseat.name = vessel.real_name
@@ -329,11 +343,12 @@
vessel.mind.transfer_to(backseat, 1)
user.mind.transfer_to(vessel, 1)
backseat.blind_eyes(power)
vessel.overlay_fullscreen("hive_mc", /obj/screen/fullscreen/hive_mc)
active = TRUE
time_initialized = world.time
revert_cast()
to_chat(vessel, "<span class='assimilator'>We can sustain our control for a maximum of [round(power/10)] seconds.</span>")
if(do_after(user,power,0,user))
if(do_after(user,power,0,user,0))
to_chat(vessel, "<span class='warning'>We cannot sustain the mind control any longer and release control!</span>")
else
to_chat(vessel, "<span class='warning'>Our body has been disturbed, interrupting the mind control!</span>")
@@ -359,9 +374,10 @@
else if(!QDELETED(original_body) && original_body.z != vessel.z) //Return to original bodies
release_control()
to_chat(original_body, "<span class='warning'>Our vessel is too far away to control!</span>")
if(QDELETED(original_body) || original_body.stat == DEAD) //Return vessel to its body, either return or ghost the original
else if(QDELETED(original_body) || original_body.stat == DEAD) //Return vessel to its body, either return or ghost the original
to_chat(vessel, "<span class='userdanger'>Our body has been destroyed, the hive cannot survive without its host!</span>")
release_control()
..()
/obj/effect/proc_holder/spell/target_hive/hive_control/choose_targets(mob/user = usr)
@@ -435,6 +451,7 @@
to_chat(user, "<span class='notice'>We have overloaded the vessel's medulla! Without medical attention, they will shortly die.</span>")
if(target.stat == CONSCIOUS)
target.visible_message("<span class='userdanger'>[target] clutches at [target.p_their()] chest as if [target.p_their()] heart stopped!</span>")
deadchat_broadcast("<span class='deadsay'><span class='name'>[target]</span> has suffered a mysterious heart attack!</span>", target)
else
to_chat(user, "<span class='warning'>We are unable to induce a heart attack!</span>")
@@ -516,7 +533,7 @@
enemies += hive_name
enemy.remove_from_hive(target)
to_chat(M.current, "<span class='userdanger'>We detect a surge of psionic energy from [target.real_name] before they disappear from the hive. An enemy host, or simply a stolen vessel?</span>")
if(enemy.owner == target)
if(enemy.owner == target && is_real_hivehost(target))
user.Stun(70)
user.Jitter(14)
to_chat(user, "<span class='userdanger'>A sudden surge of psionic energy rushes into your mind, only a Hive host could have such power!!</span>")
@@ -559,6 +576,7 @@
return
var/datum/antagonist/hivemind/enemy_hive = target.mind.has_antag_datum(/datum/antagonist/hivemind)
if(enemy_hive)
deadchat_broadcast("<span class='deadsay'>A hivemind host is about to get assimilated!</span>", target)
to_chat(user, "<span class='danger'>We begin assimilating every psionic link we can find!.</span>")
to_chat(target, "<span class='userdanger'>Our grip on our mind is slipping!</span>")
target.Jitter(14)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 MiB

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

View File

@@ -4,3 +4,5 @@ ambidet2.ogg is Night on the Docks, Piano by Kevin Macleod. It has been licensed
It has been cropped for use ingame, and also fades in.
aurora_caelus.ogg is Music for Manatees, by Kevin Macleod. It has been licensed under CC-BY 3.0 license.
It has been cropped for use ingame, and also fades out.
antag/assimilation.ogg is Alien Spaceship UFO Sound effect, by Daniel Simon (http://soundbible.com/2213-Alien-Spaceship-UFO.html). It has been licensed under CC-BY 3.0 license.
It has been cropped for use ingame, and also fades out