diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index de0baf8b49cc..98d5252aa7d2 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -956,6 +956,10 @@
return FALSE
return TRUE
+/// Called when mob changes from a standing position into a prone while lacking the ability to stand up at the moment.
+/mob/living/proc/on_fall()
+ return
+
/**
* Updates the grab state of the movable
*
diff --git a/code/game/objects/items/devices/busterarm/megabuster.dm b/code/game/objects/items/devices/busterarm/megabuster.dm
index bd597a4cf6e3..2214244baa78 100644
--- a/code/game/objects/items/devices/busterarm/megabuster.dm
+++ b/code/game/objects/items/devices/busterarm/megabuster.dm
@@ -14,9 +14,7 @@
cooldown_time = 20 SECONDS
/// Left buster-arm means megabuster goes in left hand
-/datum/action/cooldown/buster/megabuster/l/Trigger()
- if(!..())
- return FALSE
+/datum/action/cooldown/buster/megabuster/l/Activate()
var/obj/item/buster/megabuster/B = new()
owner.visible_message(span_userdanger("[owner]'s left arm begins crackling loudly!"))
playsound(owner,'sound/effects/beepskyspinsabre.ogg', 60, 1)
@@ -30,9 +28,7 @@
StartCooldown()
/// Right buster-arm means megabuster goes in right hand
-/datum/action/cooldown/buster/megabuster/r/Trigger()
- if(!..())
- return FALSE
+/datum/action/cooldown/buster/megabuster/r/Activate()
var/obj/item/buster/megabuster/B = new()
owner.visible_message(span_userdanger("[owner]'s right arm begins crackling loudly!"))
playsound(owner,'sound/effects/beepskyspinsabre.ogg', 60, 1)
@@ -46,20 +42,20 @@
StartCooldown()
/datum/action/cooldown/buster/megabuster/l/IsAvailable(feedback = FALSE)
- . = ..()
var/mob/living/O = owner
var/obj/item/bodypart/l_arm/L = O.get_bodypart(BODY_ZONE_L_ARM)
if(L?.bodypart_disabled)
to_chat(owner, span_warning("The arm isn't in a functional state right now!"))
return FALSE
+ return ..()
/datum/action/cooldown/buster/megabuster/r/IsAvailable(feedback = FALSE)
- . = ..()
var/mob/living/O = owner
var/obj/item/bodypart/r_arm/R = O.get_bodypart(BODY_ZONE_R_ARM)
if(R?.bodypart_disabled)
to_chat(owner, span_warning("The arm isn't in a functional state right now!"))
return FALSE
+ return ..()
////////////////// Megabuster Item //////////////////
/obj/item/buster/megabuster
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 416fbfaf2a15..75f023db8c91 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -502,9 +502,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
/turf/proc/acid_melt()
return
-/turf/handle_fall(mob/faller, forced)
- if(!forced)
- return
+/turf/handle_fall(mob/faller)
if(has_gravity(src))
playsound(src, "bodyfall", 50, 1)
faller.drop_all_held_items()
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 50be2306a7ea..570e637903ca 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -396,7 +396,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
//check if they were a monkey
else if(findtext(G_found.real_name,"monkey"))
- if(tgui_alert("This character appears to have been a monkey. Would you like to respawn them as such?",,list("Yes","No"))=="Yes")
+ if(tgui_alert(usr, "This character appears to have been a monkey. Would you like to respawn them as such?",,list("Yes","No"))=="Yes")
var/mob/living/carbon/monkey/new_monkey = new
SSjob.SendToLateJoin(new_monkey)
G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use
diff --git a/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm b/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm
index 68dbf800d737..4b84040d91e8 100644
--- a/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm
+++ b/code/modules/antagonists/bloodsuckers/bloodsucker_integration.dm
@@ -33,7 +33,7 @@
. += "Current Frenzy Enter: [FRENZY_THRESHOLD_ENTER + bloodsuckerdatum.humanity_lost * 10]"
. += "Current Frenzy Leave: [FRENZY_THRESHOLD_EXIT + bloodsuckerdatum.humanity_lost * 10]"
. += "Blood Drank: [bloodsuckerdatum.total_blood_drank]"
- if(bloodsuckerdatum.current_task)
+ if(bloodsuckerdatum.has_task)
. += "Task Blood Drank: [bloodsuckerdatum.task_blood_drank]"
// INTEGRATION: Adding Procs and Datums to existing "classes" //
diff --git a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm
index 1c85510956c6..9e53d269c665 100644
--- a/code/modules/antagonists/bloodsuckers/bloodsuckers.dm
+++ b/code/modules/antagonists/bloodsuckers/bloodsuckers.dm
@@ -33,7 +33,7 @@
///If we are currently in a Frenzy
var/frenzied = FALSE
///If we have a task assigned
- var/current_task = FALSE
+ var/has_task = FALSE
///How many times have we used a blood altar
var/altar_uses = 0
diff --git a/code/modules/antagonists/bloodsuckers/powers/_powers.dm b/code/modules/antagonists/bloodsuckers/powers/_powers.dm
index 8a254766731b..b9fc2a6863b9 100644
--- a/code/modules/antagonists/bloodsuckers/powers/_powers.dm
+++ b/code/modules/antagonists/bloodsuckers/powers/_powers.dm
@@ -141,7 +141,13 @@
to_chat(user, span_warning("Not while you're incapacitated!"))
return FALSE
// Constant Cost (out of blood)
- if(constant_bloodcost && bloodsuckerdatum_power?.bloodsucker_blood_volume <= 0)
+ if(!bloodsuckerdatum_power)
+ var/mob/living/living_owner = owner
+ if(living_owner.blood_volume < bloodcost)
+ to_chat(owner, span_warning("You need at least [bloodcost] blood to activate [name]"))
+ return FALSE
+ return TRUE
+ if(constant_bloodcost && bloodsuckerdatum_power.bloodsucker_blood_volume <= 0)
to_chat(user, span_warning("You don't have the blood to upkeep [src]."))
return FALSE
return TRUE
@@ -215,7 +221,11 @@
/datum/action/cooldown/bloodsucker/proc/ContinueActive(mob/living/user, mob/living/target)
if(!user)
return FALSE
- if(!constant_bloodcost > 0 || bloodsuckerdatum_power.bloodsucker_blood_volume)
+ if(!constant_bloodcost > 0)
+ return TRUE
+ if(bloodsuckerdatum_power?.bloodsucker_blood_volume)
+ return TRUE
+ if(user.blood_volume)
return TRUE
/// Used to unlearn Single-Use Powers
diff --git a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_crypt.dm
index c2febc3cc6a3..5740e6d5cd4f 100644
--- a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_crypt.dm
+++ b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_crypt.dm
@@ -132,13 +132,13 @@
to_chat(user, span_warning("You can't figure out how this works."))
return
var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(/datum/antagonist/bloodsucker)
+ if(bloodsuckerdatum.has_task && !check_completion(user)) //not done but has a task? put them on their way
+ to_chat(user, span_warning("You already have a rank up task!"))
+ return
if(bloodsuckerdatum.altar_uses >= ALTAR_RANKS_PER_DAY) //used the altar already
to_chat(user, span_notice("You have done all tasks for the night, come back tomorrow for more."))
return
- if(!check_completion(user) && bloodsuckerdatum.current_task) //not done but has a task? put them on their way
- to_chat(user, span_warning("You already have a rank up task!"))
- return
- var/want_rank = tgui_alert("Do you want to gain a task? This will cost 50 Blood.", "Task Manager", list("Yes", "No"))
+ var/want_rank = tgui_alert(user, "Do you want to gain a task? This will cost 50 Blood.", "Task Manager", list("Yes", "No"))
if(want_rank != "Yes" || QDELETED(src))
return
generate_task(user) //generate
@@ -163,7 +163,7 @@
if(crewmate.blood_volume < 50)
to_chat(user, span_danger("You don't have enough blood to gain a task!"))
return
- crewmate.blood_volume -= 50
+ bloodsuckerdatum.AddBloodVolume(-50)
switch(rand(1, 3))
if(1,2)
bloodsuckerdatum.task_blood_required = suckamount
@@ -173,15 +173,15 @@
task = "Sacrifice [heartamount] hearts by using them on the altar."
sacrificialtask = TRUE
bloodsuckerdatum.task_memory += "Current Rank Up Task: [task]
"
- bloodsuckerdatum.current_task = TRUE
+ bloodsuckerdatum.has_task = TRUE
to_chat(user, span_boldnotice("You have gained a new Task! [task] Remember to collect it by using the blood altar!"))
/obj/structure/bloodsucker/bloodaltar/proc/check_completion(mob/living/user)
var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(/datum/antagonist/bloodsucker)
- if(bloodsuckerdatum.task_blood_drank < suckamount || sacrifices < heartamount)
+ if(bloodsuckerdatum.task_blood_drank < bloodsuckerdatum.task_blood_required || sacrifices < bloodsuckerdatum.task_heart_required)
return FALSE
bloodsuckerdatum.task_memory = null
- bloodsuckerdatum.current_task = FALSE
+ bloodsuckerdatum.has_task = FALSE
bloodsuckerdatum.bloodsucker_level_unspent++
bloodsuckerdatum.altar_uses++
bloodsuckerdatum.task_blood_drank = 0
@@ -334,11 +334,11 @@
if(8 to INFINITY)
to_chat(user, span_notice("You have evolved all abilities possible."))
return
- var/want_clantask = tgui_alert("Do you want to spend a rank to gain a shadowpoint? This will cost [rankspent] ranks.", "Dark Manager", list("Yes", "No"))
+ var/want_clantask = tgui_alert(user, "Do you want to spend a rank to gain a shadowpoint? This will cost [rankspent] ranks.", "Dark Manager", list("Yes", "No"))
if(want_clantask == "No" || QDELETED(src))
return
if(bloodsuckerdatum.bloodsucker_level_unspent < rankspent)
- var/another_shot = tgui_alert("It seems like you don't have enough ranks, spend 550 blood instead?", "Dark Manager", list("Yes", "No"))
+ var/another_shot = tgui_alert(user, "It seems like you don't have enough ranks, spend 550 blood instead?", "Dark Manager", list("Yes", "No"))
if(another_shot == "No" || QDELETED(src))
return
var/mob/living/carbon/C = user
diff --git a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm
index 7ab14d530e6f..ce72424ab52e 100644
--- a/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm
+++ b/code/modules/antagonists/bloodsuckers/structures/bloodsucker_life.dm
@@ -102,7 +102,7 @@
total_blood_drank += blood_taken
if(frenzied)
frenzy_blood_drank += blood_taken
- if(current_task)
+ if(has_task)
if(target.mind)
task_blood_drank += blood_taken
else
diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm
index dcfdd09f5972..5547a26bfbc3 100644
--- a/code/modules/antagonists/brother/brother.dm
+++ b/code/modules/antagonists/brother/brother.dm
@@ -133,7 +133,7 @@
.["Convert To Traitor"] = CALLBACK(src, PROC_REF(make_traitor))
/datum/antagonist/brother/proc/make_traitor()
- if(tgui_alert("Are you sure? This will turn the blood brother into a traitor with the same objectives!",,list("Yes","No")) != "Yes")
+ if(tgui_alert(usr, "Are you sure? This will turn the blood brother into a traitor with the same objectives!",,list("Yes","No")) != "Yes")
return
var/datum/antagonist/traitor/tot = new()
diff --git a/code/modules/antagonists/demon/general_powers.dm b/code/modules/antagonists/demon/general_powers.dm
index 99310c2a7338..c54978079512 100644
--- a/code/modules/antagonists/demon/general_powers.dm
+++ b/code/modules/antagonists/demon/general_powers.dm
@@ -3,13 +3,13 @@
desc = "Take on your true demon form. This form is strong but very obvious. It's full demonic nature in this realm is taxing on you \
and you will slowly lose life while in this form, while also being especially weak to holy influences. \
Be aware low health transfers between forms. If gravely wounded, attack live mortals to siphon life energy from them!"
- background_icon = 'icons/mob/actions/actions_minor_antag.dmi'
+ button_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "daemontransform"
background_icon_state = "bg_demon"
invocation = "COWER, MORTALS!!"
- shapeshift_type = /mob/living/simple_animal/lesserdemon
+ possible_shapes = list(/mob/living/simple_animal/lesserdemon)
spell_requirements = NONE
diff --git a/code/modules/antagonists/demon/sins/gluttony.dm b/code/modules/antagonists/demon/sins/gluttony.dm
index d52e68ed59de..511c6a02bd77 100644
--- a/code/modules/antagonists/demon/sins/gluttony.dm
+++ b/code/modules/antagonists/demon/sins/gluttony.dm
@@ -2,7 +2,6 @@
name = "Gluttonous Wall"
desc = "Create a magical barrier that only allows fat people to pass through."
button_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- background_icon = 'icons/mob/actions/actions_minor_antag.dmi'
button_icon_state = "blob"
background_icon_state = "bg_demon"
@@ -15,10 +14,10 @@
/datum/action/cooldown/spell/shapeshift/demon/gluttony //emergency get out of jail card, but better. It also eats everything.
name = "Gluttony Demon Form"
desc = "Take on your true demon form. This form is strong but very obvious. It's full demonic nature in this realm is taxing on you \
- and you will slowly lose life while in this form, while also being especially weak to holy influences. \
- Be aware low health transfers between forms. If gravely wounded, attack live mortals to siphon life energy from them! \
- Your unique form as a demon of gluttony also allows you to eat corpses to heal yourself."
- shapeshift_type = /mob/living/simple_animal/lesserdemon/gluttony
+ and you will slowly lose life while in this form, while also being especially weak to holy influences. \
+ Be aware low health transfers between forms. If gravely wounded, attack live mortals to siphon life energy from them! \
+ Your unique form as a demon of gluttony also allows you to eat corpses to heal yourself."
+ possible_shapes = list(/mob/living/simple_animal/lesserdemon/gluttony)
/mob/living/simple_animal/lesserdemon/gluttony //capable of devouring corpses for health
name = "gluttonous demon"
diff --git a/code/modules/antagonists/demon/sins/wrath.dm b/code/modules/antagonists/demon/sins/wrath.dm
index f066513e2ee6..42078bc471be 100644
--- a/code/modules/antagonists/demon/sins/wrath.dm
+++ b/code/modules/antagonists/demon/sins/wrath.dm
@@ -1,6 +1,6 @@
/datum/action/cooldown/spell/shapeshift/demon/wrath //emergency get out of jail card, but better.
name = "Wrath Demon Form"
- shapeshift_type = /mob/living/simple_animal/lesserdemon/wrath
+ possible_shapes = list(/mob/living/simple_animal/lesserdemon/wrath)
/mob/living/simple_animal/lesserdemon/wrath //slightly more damage.
name = "wrathful demon"
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
index 6e771904498b..ddf017a36c46 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
@@ -41,6 +41,7 @@
* This proc is called whenever a new eldritch knowledge is added to an antag datum
*/
/datum/eldritch_knowledge/proc/on_gain(mob/user, datum/antagonist/heretic/our_heretic)
+ SHOULD_CALL_PARENT(TRUE) //for now
var/datum/antagonist/heretic/EC = user.mind?.has_antag_datum(/datum/antagonist/heretic)
for(var/X in unlocked_transmutations)
var/datum/eldritch_transmutation/ET = new X
@@ -82,6 +83,7 @@
var/datum/action/cooldown/spell/created_spell = created_spell_ref?.resolve() || new spell_to_add(user)
created_spell.Grant(user)
created_spell_ref = WEAKREF(created_spell)
+ . = ..()
/datum/eldritch_knowledge/spell/on_lose(mob/user, datum/antagonist/heretic/our_heretic)
var/datum/action/cooldown/spell/created_spell = created_spell_ref?.resolve()
diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm
index 077a4d539684..2e0f24481c15 100644
--- a/code/modules/antagonists/revolution/revolution.dm
+++ b/code/modules/antagonists/revolution/revolution.dm
@@ -31,6 +31,7 @@
return FALSE
/datum/antagonist/rev/apply_innate_effects(mob/living/mob_override)
+ . = ..()
var/mob/living/M = mob_override || owner.current
M.grant_language(/datum/language/french, TRUE, TRUE, LANGUAGE_REVOLUTIONARY)
add_team_hud(M, /datum/antagonist/rev)
@@ -38,6 +39,7 @@
/datum/antagonist/rev/remove_innate_effects(mob/living/mob_override)
var/mob/living/M = mob_override || owner.current
M.remove_language(/datum/language/french, TRUE, TRUE, LANGUAGE_REVOLUTIONARY)
+ return ..()
/datum/antagonist/rev/proc/equip_rev()
return
@@ -50,7 +52,7 @@
/datum/antagonist/rev/on_removal()
remove_objectives()
- . = ..()
+ return ..()
/datum/antagonist/rev/greet()
to_chat(owner, span_userdanger("You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!"))
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 46512979f21c..d1d77ed7be57 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -414,24 +414,27 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Teleport"
set desc= "Teleport to a location"
if(!isobserver(usr))
- to_chat(usr, "Not when you're not dead!")
+ to_chat(usr, span_warning("Not when you're not dead!"))
return
var/list/filtered = list()
for(var/area/A as anything in get_sorted_areas())
if(!A.hidden)
filtered += A
- var/area/thearea = tgui_input_list(usr, "Area to jump to", "BOOYEA", filtered)
+ var/area/thearea = tgui_input_list(usr, "Area to jump to", "BOOYEA", filtered)
if(!thearea)
return
+ if(!isobserver(usr))
+ to_chat(usr, span_warning("Not when you're not dead!"))
+ return
var/list/L = list()
for(var/turf/T in get_area_turfs(thearea.type))
L+=T
- if(!L || !L.len)
- to_chat(usr, "No area available.")
- return
+ if(!L || !length(L))
+ to_chat(usr, span_warning("No area available."))
+ return
usr.forceMove(pick(L))
update_parallax_contents()
diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm
index f01678c6ede2..27c3ad8fecb1 100644
--- a/code/modules/mob/living/carbon/alien/larva/powers.dm
+++ b/code/modules/mob/living/carbon/alien/larva/powers.dm
@@ -13,6 +13,8 @@
span_notice("[owner] slowly peeks up from the ground..."),
span_noticealien("You stop hiding."),
)
+
+ else
owner.layer = hide_layer
owner.visible_message(
span_name("[owner] scurries to the ground!"),
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 40bc46a2c8a7..08c5631a7e2d 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -293,9 +293,9 @@
usr.visible_message("[usr] successfully rips [I] out of [usr.p_their()] [L.name]!", span_notice("You successfully remove [I] from your [L.name]."))
return
-/mob/living/carbon/fall(forced)
- if(loc)
- loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing
+/mob/living/carbon/on_fall()
+ . = ..()
+ loc.handle_fall(src)//it's loc so it doesn't call the mob's handle_fall which does nothing
/mob/living/carbon/is_muzzled()
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm
index a8c33f7367a4..0c27ab1cb14d 100644
--- a/code/modules/mob/living/init_signals.dm
+++ b/code/modules/mob/living/init_signals.dm
@@ -121,7 +121,7 @@
// SIGNAL_HANDLER
if(HAS_TRAIT(src, TRAIT_FLOORED))
-// on_fall()
+ on_fall()
// set_lying_down()
// else if(resting)
// set_lying_down()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 0d3828b96862..71f209c84ffa 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1538,7 +1538,7 @@
// if(body_position == STANDING_UP) //force them on the ground
// set_lying_angle(pick(90, 270))
// set_body_position(LYING_DOWN)
-// on_fall()
+ on_fall()
set_resting(TRUE)
/// Proc to append behavior to the condition of being floored. Called when the condition ends.
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index de2d91a635c1..c8c0887f8e83 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -193,6 +193,7 @@
/datum/action/cooldown/spell/aoe/blindness
name = "Blindness"
desc = "Your prey will be momentarily blind for you to advance on them."
+ button_icon_state = "blind2"
cooldown_time = 1 MINUTES
spell_requirements = NONE
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 589d8ac7533b..beed59bf9d6f 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -224,8 +224,11 @@
/obj/docking_port/stationary/transit
name = "In Transit"
+ /// The turf reservation returned by the transit area request
var/datum/turf_reservation/reserved_area
+ /// The area created during the transit area reservation
var/area/shuttle/transit/assigned_area
+ /// The mobile port that owns this transit port
var/obj/docking_port/mobile/owner
/obj/docking_port/stationary/transit/Initialize()
diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi
index 9373204fc7c5..30ca20654804 100644
Binary files a/icons/mob/actions/actions_spells.dmi and b/icons/mob/actions/actions_spells.dmi differ
diff --git a/yogstation.dme b/yogstation.dme
index f9264ed83454..16ec608b899c 100644
--- a/yogstation.dme
+++ b/yogstation.dme
@@ -141,8 +141,8 @@
#include "code\__DEFINES\dcs\signals\signals_food.dm"
#include "code\__DEFINES\dcs\signals\signals_gib.dm"
#include "code\__DEFINES\dcs\signals\signals_global.dm"
-#include "code\__DEFINES\dcs\signals\signals_heretic.dm"
#include "code\__DEFINES\dcs\signals\signals_global_object.dm"
+#include "code\__DEFINES\dcs\signals\signals_heretic.dm"
#include "code\__DEFINES\dcs\signals\signals_janitor.dm"
#include "code\__DEFINES\dcs\signals\signals_mood.dm"
#include "code\__DEFINES\dcs\signals\signals_moveloop.dm"
diff --git a/yogstation/code/game/gamemodes/vampire/vampire_powers.dm b/yogstation/code/game/gamemodes/vampire/vampire_powers.dm
index bd3feb8387e6..fd857e13a197 100644
--- a/yogstation/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/yogstation/code/game/gamemodes/vampire/vampire_powers.dm
@@ -326,6 +326,7 @@
button_icon_state = "coffin"
background_icon_state = "bg_vampire"
overlay_icon_state = "bg_vampire_border"
+ check_flags = NONE
school = SCHOOL_SANGUINE
diff --git a/yogstation/code/modules/events/bad_wizard.dm b/yogstation/code/modules/events/bad_wizard.dm
index e50e1b993dce..deb8af8c4b9d 100644
--- a/yogstation/code/modules/events/bad_wizard.dm
+++ b/yogstation/code/modules/events/bad_wizard.dm
@@ -50,7 +50,7 @@
SpellAdd(/datum/action/cooldown/spell/pointed/barnyardcurse, 2)
if(4) //5x summon guns - no
- SpellAdd(/datum/action/cooldown/spell/conjure_item/infinite_guns, 5, "Greater Summon Guns")
+ SpellAdd(/datum/action/cooldown/spell/conjure_item/infinite_guns/gun, 5, "Greater Summon Guns")
if(5)
//1x space-time distortion, 2x knock, and 2x blink
@@ -60,7 +60,7 @@
if(6) //5x forcewall, and 5x repulse (AKA the safe space loadout)
SpellAdd(/datum/action/cooldown/spell/forcewall, 5)
- SpellAdd(/datum/action/cooldown/spell/aoe/repulse, 5)
+ SpellAdd(/datum/action/cooldown/spell/aoe/repulse/wizard, 5)
if(7) //5x Cluwne Curse and 2x blink
SpellAdd(/datum/action/cooldown/spell/pointed/cluwnecurse, 5)
@@ -75,9 +75,9 @@
SpellAdd(/datum/action/cooldown/spell/shapeshift/mouse, 5)
SpellAdd(/datum/action/cooldown/spell/pointed/mind_transfer, 5)
-/datum/antagonist/wizard/meme/proc/SpellAdd(spellType, level = 1, custom_name) //0 is the first level (cause logic (arrays start at one))
+/datum/antagonist/wizard/meme/proc/SpellAdd(spellType, level = 1, custom_name = "") //0 is the first level (cause logic (arrays start at one))
var/datum/action/cooldown/spell/spell_to_add = new spellType(owner.current)
spell_to_add.Grant(owner.current)
spell_to_add.spell_level = level
- spell_to_add.name = custom_name ? custom_name : "Instant [spell_to_add.name]"
+ spell_to_add.name = length(custom_name) ? custom_name : "Instant [spell_to_add.name]"
to_chat(owner, "[spell_to_add.name]")
diff --git a/yogstation/code/modules/spells/cluwnecurse.dm b/yogstation/code/modules/spells/cluwnecurse.dm
index b80446eca473..7110ca9f4193 100644
--- a/yogstation/code/modules/spells/cluwnecurse.dm
+++ b/yogstation/code/modules/spells/cluwnecurse.dm
@@ -2,31 +2,33 @@
name = "Curse of the Cluwne"
desc = "This spell dooms the fate of any unlucky soul to the live of a pitiful cluwne, a terrible creature that is hunted for fun."
button_icon = 'yogstation/icons/mob/actions.dmi'
- base_icon_state = "cluwne"
+ button_icon_state = "cluwne"
ranged_mousepointer = 'icons/effects/mouse_pointers/cluwne_target.dmi'
school = SCHOOL_TRANSMUTATION
invocation = "CLU WO'NIS CA'TE'BEST'IS MAXIMUS!"
invocation_type = INVOCATION_SHOUT
+ base_icon_state = "cluwne"
cast_range = 3
cooldown_time = 1 MINUTES
cooldown_reduction_per_rank = 12.5 SECONDS
- var/list/compatible_mobs = list(/mob/living/carbon/human)
-/datum/action/cooldown/spell/pointed/cluwnecurse/InterceptClickOn(mob/living/caller, params, atom/click_target)
- . = ..()
- if(!.)
- return FALSE
- var/mob/living/carbon/target = click_target
- if(!(target.type in compatible_mobs))
- to_chat(owner, span_notice("You are unable to curse [target]!"))
+/datum/action/cooldown/spell/pointed/cluwnecurse/is_valid_target(atom/cast_on)
+ if(!ishuman(cast_on))
+ to_chat(owner, span_notice("You are unable to curse [cast_on]!"))
return FALSE
+ var/mob/living/target = cast_on
if(target.anti_magic_check())
to_chat(owner, span_notice("They didn't laugh!"))
return FALSE
- var/mob/living/carbon/human/H = target
- H.cluwneify()
+ return TRUE
+
+/datum/action/cooldown/spell/pointed/cluwnecurse/InterceptClickOn(mob/living/caller, params, mob/living/carbon/human/target)
+ . = ..()
+ if(!.)
+ return FALSE
+ target.cluwneify()
return TRUE
/datum/spellbook_entry/cluwnecurse
diff --git a/yogstation/code/modules/spells/spell_types/aimed.dm b/yogstation/code/modules/spells/spell_types/aimed.dm
index 84b1b3c8cb51..3f3553348966 100644
--- a/yogstation/code/modules/spells/spell_types/aimed.dm
+++ b/yogstation/code/modules/spells/spell_types/aimed.dm
@@ -1,11 +1,13 @@
/datum/action/cooldown/spell/pointed/projectile/animation
name = "Animation"
desc = "This spell fires an animation bolt at a target."
- base_icon_state = "staffofanimation"
+ button_icon = 'icons/obj/guns/magic.dmi'
+ button_icon_state = "staffofanimation"
invocation = "ONA ANIMATUS"
invocation_type = INVOCATION_SHOUT
+ base_icon_state = "staffofanimation"
sound = 'sound/magic/staff_animation.ogg'
cast_range = 20
cooldown_time = 6 SECONDS
diff --git a/yogstation/code/modules/spells/spell_types/shapeshift.dm b/yogstation/code/modules/spells/spell_types/shapeshift.dm
index ad7158517aff..1269c4e3c7a9 100644
--- a/yogstation/code/modules/spells/spell_types/shapeshift.dm
+++ b/yogstation/code/modules/spells/spell_types/shapeshift.dm
@@ -3,4 +3,4 @@
desc = "Take on the shape of a mouse."
invocation = "SQUEAAAKKKK!"
convert_damage = FALSE
- shapeshift_type = /mob/living/simple_animal/mouse
+ possible_shapes = list(/mob/living/simple_animal/mouse)