diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 04cfe86ed4b..caaddb5f786 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -414,7 +414,7 @@
/datum/reagent/mindbreaker,\
/datum/reagent/psilocybin)
-#define SPELL_NOREMORSE_GHOST_DAMAGE 2 ///How much damage the ghosts do when attacking mobs during no remorse spell
+#define SPELL_NOREMORSE_GHOST_DAMAGE 1 ///How much damage the ghosts do when attacking mobs during no remorse spell
/proc/human_height_text(x)
switch(x)
diff --git a/code/game/gamemodes/wizard/undead/undead_datum.dm b/code/game/gamemodes/wizard/undead/undead_datum.dm
index cb1d2e94ebc..760b88b54f9 100644
--- a/code/game/gamemodes/wizard/undead/undead_datum.dm
+++ b/code/game/gamemodes/wizard/undead/undead_datum.dm
@@ -33,7 +33,7 @@
my_mob.add_spell(new /datum/spell/toggled/lich_form)
my_mob.add_spell(new /datum/spell/aoe_turf/knock)
my_mob.add_spell(new /datum/spell/targeted/projectile/magic_missile)
- my_mob.add_spell(new /datum/spell/hand/marsh_of_the_dead)
+ my_mob.add_spell(new /datum/spell/hand/charges/marsh_of_the_dead)
my_mob.add_spell(new /datum/spell/toggled/immaterial_form)
/datum/wizard/undead/Destroy()
diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm
index d3a2366841b..0724cbe007c 100644
--- a/code/modules/ghosttrap/trap.dm
+++ b/code/modules/ghosttrap/trap.dm
@@ -212,17 +212,38 @@ var/list/ghost_traps
/datum/ghosttrap/undead/request_player(mob/target, request_string, request_timeout, mob/living/caster, should_lichify = FALSE)
necromancer = caster
lichify = should_lichify
- return ..()
+
+ if(request_timeout)
+ request_timeouts[target] = world.time + request_timeout
+ register_signal(target, SIGNAL_QDELETING, /datum/ghosttrap/proc/unregister_target, override = TRUE)
+ else
+ unregister_target(target)
+
+ for(var/mob/observer/ghost/O in GLOB.player_list)
+ if(!O.client)
+ continue
+
+ if(pref_check && !O.client.wishes_to_be_role(pref_check))
+ continue
+
+ INVOKE_ASYNC(src, nameof(.proc/send_request), target, O, request_timeout)
+
+/datum/ghosttrap/undead/proc/send_request(mob/target, mob/observer/ghost, request_timeout)
+ var/player_choice = tgui_alert(ghost, "A necromancer is requesting a soul to animate an undead body.", "Would you like to become undead?", list("Yes", "No"), request_timeout)
+ if(player_choice == "Yes")
+ if(target.key)
+ to_chat(ghost, SPAN_WARNING("Target is already occupied!"))
+ return
+
+ transfer_personality(ghost, target)
/datum/ghosttrap/undead/transfer_personality(mob/candidate, mob/target)
- report_progress("Transfering personality")
target.ckey = candidate.ckey
if(target.mind)
target.mind.assigned_role = "[ghost_trap_role]"
announce_ghost_joinleave(candidate, 0, "[ghost_trap_message]")
target.mind = candidate.mind
- target.mind.current.reload_fullscreen()
welcome_candidate(target)
diff --git a/code/modules/spells/artifacts/ghost_gramophone.dm b/code/modules/spells/artifacts/ghost_gramophone.dm
index 286150b5828..a5552afe1eb 100644
--- a/code/modules/spells/artifacts/ghost_gramophone.dm
+++ b/code/modules/spells/artifacts/ghost_gramophone.dm
@@ -23,6 +23,7 @@ GLOBAL_LIST_EMPTY(ghost_gramophones)
active = TRUE
last_activated = world.time
visible_message(SPAN_NOTICE("The gramophone starts spinning its record with a squeak."))
+ notify_ghosts("A ghost gramophone is channeling words said nearby it!", null, src, action = NOTIFY_JUMP, posses_mob = FALSE)
set_next_think(world.time + GRAMOPHONE_ACTIVE_TIME)
else
to_chat(user, SPAN_NOTICE("You try to turn on the [src], but to no avail! Maybe you should try again later?"))
diff --git a/code/modules/spells/artifacts/plague_bell.dm b/code/modules/spells/artifacts/plague_bell.dm
index 7763e2f050e..4521986eb9b 100644
--- a/code/modules/spells/artifacts/plague_bell.dm
+++ b/code/modules/spells/artifacts/plague_bell.dm
@@ -72,23 +72,14 @@
var/damage_delivered = 0 //The necromancer will be healed by a percentage of the total damage delivered this tick.
- for(var/atom/A in hearers(6, get_turf(loc))) // Here we will actually damage mobs in range
- if(A == master)
+ for(var/mob/living/M in GLOB.living_mob_list_) // Here we will actually damage mobs in range
+ if(get_dist(master, get_turf(M)) > world.view)
continue
-
- var/mob/living/M = A
- if(!istype(M))
- continue
- else if(istype(A,/obj/mecha))
- var/obj/mecha/mecha = A
- if(!mecha.occupant)
- continue
- M = mecha.occupant
- else
+ if(M == master)
continue
- if(M.is_ic_dead() || M.isSynthetic() || isundead(M))
+ if(M.isSynthetic() || isundead(M))
continue
M.adjustBruteLoss(DAMAGE_PER_TICK)
diff --git a/code/modules/spells/classes/necromancer.dm b/code/modules/spells/classes/necromancer.dm
index a5d2a8cb7d3..3112f9a4e8b 100644
--- a/code/modules/spells/classes/necromancer.dm
+++ b/code/modules/spells/classes/necromancer.dm
@@ -8,7 +8,7 @@
spells = list(
SPELL_DATA(/datum/spell/targeted/raiseundead, 1),
SPELL_DATA(/datum/spell/targeted/raiseundead/lichify, 3),
- SPELL_DATA(/datum/spell/hand/marsh_of_the_dead, 1),
+ SPELL_DATA(/datum/spell/hand/charges/marsh_of_the_dead, 1),
SPELL_DATA(/datum/spell/toggled/immaterial_form, 1),
SPELL_DATA(/datum/spell/targeted/noremorse, 1),
SPELL_DATA(/datum/spell/aoe_turf/conjure/tombstone, 1),
diff --git a/code/modules/spells/hand/marsh_of_the_dead.dm b/code/modules/spells/hand/marsh_of_the_dead.dm
index 07450b217bb..f1065e75bb7 100644
--- a/code/modules/spells/hand/marsh_of_the_dead.dm
+++ b/code/modules/spells/hand/marsh_of_the_dead.dm
@@ -3,7 +3,7 @@
#define MARSH_MAX_UNBUCKLE_TIME 40 SECONDS
#define MARSH_DAMAGE_PER_UPGRADE 10
-/datum/spell/hand/marsh_of_the_dead
+/datum/spell/hand/charges/marsh_of_the_dead
name = "Marsh of the dead"
desc = "This spell creates a puddle of vile pus, staggering any mortal."
school = "necromancy"
@@ -12,20 +12,21 @@
spell_flags = 0
invocation_type = SPI_NONE
show_message = "snaps their fingers."
- spell_delay = 50
+ spell_delay = 2 SECONDS
icon_state = "wiz_marsh"
level_max = list(SP_TOTAL = 3, SP_SPEED = 1, SP_POWER = 2)
var/damage = 0
override_base = "const"
charge_max = 600
cooldown_min = 300
+ max_casts = 3
-/datum/spell/hand/marsh_of_the_dead/cast_hand(atom/a, mob/user)
+/datum/spell/hand/charges/marsh_of_the_dead/cast_hand(atom/a, mob/user)
for(var/turf/simulated/T in view(1,a))
new /obj/effect/deadhands(T, damage)
return ..()
-/datum/spell/hand/marsh_of_the_dead/empower_spell()
+/datum/spell/hand/charges/marsh_of_the_dead/empower_spell()
. = ..()
if(!.)
return FALSE
@@ -80,7 +81,7 @@
if(H.species.species_flags & SPECIES_FLAG_NO_TANGLE)
return
- victim.visible_message(SPAN_DANGER("You're stuck in \the [src]!"))
+ to_chat(victim, SPAN_DANGER("You're stuck in \the [src]!"))
victim.forceMove(loc)
diff --git a/code/modules/spells/targeted/no_remorse.dm b/code/modules/spells/targeted/no_remorse.dm
index 14ce5c7ff4b..19056a04f66 100644
--- a/code/modules/spells/targeted/no_remorse.dm
+++ b/code/modules/spells/targeted/no_remorse.dm
@@ -1,7 +1,7 @@
/datum/spell/targeted/noremorse
name = "No remorse"
- desc = ""
- feedback = ""
+ desc = "Designate a mortal who will be attacked by beings from the Realm Of The Dead. Those beings however may choose not to obey your will."
+ feedback = "NR"
school = "necromancy"
invocation = "Facite vindictam!"
@@ -28,7 +28,7 @@
ADD_TRAIT(victim, TRAIT_GHOSTATTACKABLE)
- notify_ghosts("A powerful necromancer has allowed you to exact revenge on [victim]! Click on him to unleash your fury!", null, victim, action = NOTIFY_JUMP, posses_mob = FALSE)
+ notify_ghosts("A powerful necromancer has allowed you to exact revenge on [victim]! Click on him to unleash your fury!", null, victim, action = NOTIFY_ATTACK, posses_mob = FALSE)
/datum/modifier/status_effect/ghostattackable
- duration = 15 SECONDS
+ duration = 10 SECONDS
diff --git a/code/modules/spells/targeted/raiseundead.dm b/code/modules/spells/targeted/raiseundead.dm
index 57082f3f376..7bf7af62607 100644
--- a/code/modules/spells/targeted/raiseundead.dm
+++ b/code/modules/spells/targeted/raiseundead.dm
@@ -10,9 +10,9 @@
invocation = "De sepulchro suscitate et servite mihi!"
invocation_type = SPI_SHOUT
max_targets = 1
- charge_max = 6000
- cooldown_min = 3000
- cooldown_reduc = 1000
+ charge_max = 3600
+ cooldown_min = 1800
+ cooldown_reduc = 600
level_max = list(SP_TOTAL = 3, SP_SPEED = 3, SP_POWER = 0)
compatible_mobs = list(/mob/living/carbon/human)
icon_state = "wiz_raiseundead"
@@ -42,9 +42,9 @@
if(should_lichify && (target.mind?.wizard in user.mind.wizard.thralls)) // Lichifying him without further ado
target.make_undead(user, should_lichify)
- if(!target.client || target.mind)
+ if(!target.client && target.mind)
for(var/mob/observer/ghost/ghost in GLOB.ghost_mob_list)
- if(ghost.mind?.key != target.mind.key)
+ if(ghost.mind?.key != target.mind?.key)
continue
ghost.can_reenter_corpse = TRUE
@@ -103,7 +103,7 @@
if(!mind)
return
- if(mind.wizard && !istype(mind.wizard, /datum/wizard/undead))
+ if(!istype(mind.wizard, /datum/wizard/undead))
GLOB.wizards.add_antagonist_mind(mind, TRUE, "undead", "You are undead! Your job is to serve your master!")
mind.wizard = new /datum/wizard/undead(src, necromancer)
@@ -132,7 +132,6 @@
to_chat(src, SPAN_DANGER("You are now a lich serving as an apprentice to your master, \the [necromancer]."))
else
to_chat(necromancer, SPAN_DANGER("You feel a soul answering your call. You now have a new thrall."))
- to_chat(src, SPAN_DANGER("Your consciousness awakens in a cold body. You are alive, but at what cost?"))
to_chat(src, SPAN_DANGER("Raised as undead, stripped of free will you now have one task - obey your master, \the [necromancer]."))
#undef RAISE_UNDEAD_TIMEOUT