diff --git a/code/datums/dog_fashion.dm b/code/datums/dog_fashion.dm
index 84913c234be..c2154736cc0 100644
--- a/code/datums/dog_fashion.dm
+++ b/code/datums/dog_fashion.dm
@@ -236,3 +236,10 @@
speak = list() //they're very patient and focused on holding the butter on 'em
emote_see = list("shakes a little.", "looks around.")
emote_hear = list("licks a trickle of the butter up.", "smiles.")
+
+/datum/dog_fashion/head/eyepatch
+ name = "Punished %REAL_NAME%"
+ desc = "%REAL_NAME% has really been going through it today."
+ obj_icon_state = "eyepatch"
+ emote_hear = list("sighs gruffly.", "groans.")
+ emote_see = list("considers their own mortality.", "stares bleakly into the middle distance.", "ponders the horrors of warfare.")
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 688b63bddbb..fc665e57c8f 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -195,6 +195,7 @@
base_icon_state = "eyepatch"
inhand_icon_state = null
actions_types = list(/datum/action/item_action/flip)
+ dog_fashion = /datum/dog_fashion/head/eyepatch
/obj/item/clothing/glasses/eyepatch/attack_self(mob/user, modifiers)
. = ..()
diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm
index d072a1c897e..a2236cc07df 100644
--- a/code/modules/mob/living/basic/pets/dog/corgi.dm
+++ b/code/modules/mob/living/basic/pets/dog/corgi.dm
@@ -44,27 +44,29 @@
/mob/living/basic/pet/dog/corgi/Exited(atom/movable/gone, direction)
. = ..()
+ var/dropped_something = FALSE
if(gone == inventory_head)
+ dropped_something = TRUE
inventory_head = null
- update_corgi_fluff()
- update_appearance(UPDATE_OVERLAYS)
if(gone == inventory_back)
+ dropped_something = TRUE
inventory_back = null
+ if(dropped_something)
update_corgi_fluff()
update_appearance(UPDATE_OVERLAYS)
/mob/living/basic/pet/dog/corgi/gib()
- if(inventory_head)
- inventory_head.forceMove(drop_location())
- inventory_head = null
- if(inventory_back)
- inventory_back.forceMove(drop_location())
- inventory_back = null
+ undress_dog()
if(access_card)
access_card.forceMove(drop_location())
access_card = null
return ..()
+/// Removes the hat and shirt (but not ID) of this corgi
+/mob/living/basic/pet/dog/corgi/proc/undress_dog()
+ inventory_head?.forceMove(drop_location())
+ inventory_back?.forceMove(drop_location())
+
/mob/living/basic/pet/dog/corgi/examine(mob/user)
. = ..()
if(access_card)
@@ -194,44 +196,42 @@
/mob/living/basic/pet/dog/corgi/proc/place_on_head(obj/item/item_to_add, mob/living/user)
if(inventory_head)
if(user)
- to_chat(user, span_warning("You can't put more than one hat on [src]!"))
- return
- if(!item_to_add)
- user.visible_message(span_notice("[user] pets [src]."), span_notice("You rest your hand on [src]'s head for a moment."))
- if(flags_1 & HOLOGRAM_1)
- return
- user.add_mood_event(REF(src), /datum/mood_event/pet_animal, src)
- return
+ balloon_alert(user, "already wearing a hat!")
+ return FALSE
+
+ if(isnull(item_to_add))
+ if (!isnull(user))
+ user.visible_message(span_notice("[user] pets [src]."), span_notice("You rest your hand on [src]'s head for a moment."))
+ if(flags_1 & HOLOGRAM_1)
+ return
+ user.add_mood_event(REF(src), /datum/mood_event/pet_animal, src)
+ return FALSE
if(user && !user.temporarilyRemoveItemFromInventory(item_to_add))
to_chat(user, span_warning("\The [item_to_add] is stuck to your hand, you cannot put it on [src]'s head!"))
- return
-
- var/valid = FALSE
- if(ispath(item_to_add.dog_fashion, /datum/dog_fashion/head))
- valid = TRUE
+ return FALSE
//Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a hat is removed.
-
- if(valid)
- if(user && (stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH)))
- to_chat(user, span_notice("There is merely a dull, lifeless look in [real_name]'s eyes as you put \the [item_to_add] on [p_them()]."))
- else if(user)
- user.visible_message(span_notice("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once."),
- span_notice("You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags [p_their()] tail once and barks."),
- span_hear("You hear a friendly-sounding bark."))
- item_to_add.forceMove(src)
- inventory_head = item_to_add
- update_corgi_fluff()
- update_appearance(UPDATE_OVERLAYS)
- else
+ if(!ispath(item_to_add.dog_fashion, /datum/dog_fashion/head))
to_chat(user, span_warning("You set [item_to_add] on [src]'s head, but it falls off!"))
item_to_add.forceMove(drop_location())
if(prob(25))
step_rand(item_to_add)
dance_rotate(src, set_original_dir = TRUE)
+ return FALSE
- return valid
+ if (user)
+ if(stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH))
+ to_chat(user, span_notice("There is merely a dull, lifeless look in [real_name]'s eyes as you put \the [item_to_add] on [p_them()]."))
+ else
+ user.visible_message(span_notice("[user] puts [item_to_add] on [real_name]'s head. [src] looks at [user] and barks once."),
+ span_notice("You put [item_to_add] on [real_name]'s head. [src] gives you a peculiar look, then wags [p_their()] tail once and barks."),
+ span_hear("You hear a friendly-sounding bark."))
+ item_to_add.forceMove(src)
+ inventory_head = item_to_add
+ update_corgi_fluff()
+ update_appearance(UPDATE_OVERLAYS)
+ return TRUE
/mob/living/basic/pet/dog/corgi/proc/update_corgi_fluff()
// First, change back to defaults
@@ -380,6 +380,14 @@
Write_Memory(TRUE)
return ..()
+/mob/living/basic/pet/dog/corgi/ian/revive(full_heal_flags, excess_healing, force_grab_ghost)
+ . = ..()
+ if (!.)
+ return
+ if (!istype(inventory_head, /obj/item/clothing/glasses/eyepatch))
+ inventory_head?.forceMove(drop_location())
+ place_on_head(new /obj/item/clothing/glasses/eyepatch/medical)
+
/mob/living/basic/pet/dog/corgi/ian/narsie_act()
playsound(src, 'sound/magic/demon_dies.ogg', 75, TRUE)
var/mob/living/basic/pet/dog/corgi/narsie/narsIan = new(loc)
diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm
index 1f26a63cc6a..e199df0ffd9 100644
--- a/code/modules/surgery/revival.dm
+++ b/code/modules/surgery/revival.dm
@@ -3,7 +3,8 @@
desc = "An experimental surgical procedure which involves reconstruction and reactivation of the patient's brain even long after death. \
The body must still be able to sustain life."
requires_bodypart_type = NONE
- possible_locs = list(BODY_ZONE_HEAD)
+ possible_locs = list(BODY_ZONE_CHEST)
+ target_mobtypes = list(/mob/living)
surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_MORBID_CURIOSITY
steps = list(
/datum/surgery_step/incise,
@@ -15,15 +16,22 @@
/datum/surgery_step/close,
)
-/datum/surgery/revival/can_start(mob/user, mob/living/carbon/target)
+/datum/surgery/revival/can_start(mob/user, mob/living/target)
if(!..())
return FALSE
if(target.stat != DEAD)
return FALSE
if(HAS_TRAIT(target, TRAIT_SUICIDED) || HAS_TRAIT(target, TRAIT_HUSK) || HAS_TRAIT(target, TRAIT_DEFIB_BLACKLISTED))
return FALSE
- var/obj/item/organ/internal/brain/target_brain = target.get_organ_slot(ORGAN_SLOT_BRAIN)
- if(!target_brain)
+ if(!is_valid_target(target))
+ return FALSE
+ return TRUE
+
+/// Extra checks which can be overridden
+/datum/surgery/revival/proc/is_valid_target(mob/living/patient)
+ if (iscarbon(patient))
+ return FALSE
+ if (!(patient.mob_biotypes & (MOB_ORGANIC|MOB_HUMANOID)))
return FALSE
return TRUE
@@ -59,7 +67,7 @@
to_chat(user, span_warning("You need an electrode for this!"))
return FALSE
-/datum/surgery_step/revive/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+/datum/surgery_step/revive/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(
user,
target,
@@ -69,13 +77,13 @@
)
target.notify_ghost_cloning("Someone is trying to zap your brain.", source = target)
-/datum/surgery_step/revive/play_preop_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+/datum/surgery_step/revive/play_preop_sound(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(istype(tool, /obj/item/shockpaddles))
playsound(tool, 'sound/machines/defib_charge.ogg', 75, 0)
else
..()
-/datum/surgery_step/revive/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results)
+/datum/surgery_step/revive/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results)
display_results(
user,
target,
@@ -87,24 +95,27 @@
target.adjustOxyLoss(-50, 0)
target.updatehealth()
if(target.revive())
- target.visible_message(span_notice("...[target] wakes up, alive and aware!"))
- target.emote("gasp")
- target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50, 199) //MAD SCIENCE
- to_chat(target, "[CONFIG_GET(string/blackoutpolicy)]") //SKYRAT EDIT ADDITION - BLACKOUT POLICY
- if(HAS_MIND_TRAIT(user, TRAIT_MORBID) && ishuman(user)) //Contrary to their typical hatred of resurrection, it wouldn't be very thematic if morbid people didn't love playing god
- var/mob/living/carbon/human/morbid_weirdo = user
- morbid_weirdo.add_mood_event("morbid_revival_success", /datum/mood_event/morbid_revival_success)
+ on_revived(user, target)
return TRUE
- else
- //SKYRAT EDIT ADDITION - DNR TRAIT - need this so that people dont just keep spamming the revival surgery; it runs success just bc the surgery steps are done
- if(HAS_TRAIT(target, TRAIT_DNR))
- target.visible_message(span_warning("...[target.p_they()] lies still, unaffected. Further attempts are futile, they're gone."))
- else
- target.visible_message(span_warning("...[target.p_they()] convulses, then lies still."))
- //SKYRAT EDIT ADDITION END - DNR TRAIT - ORIGINAL: target.visible_message(span_warning("...[target.p_they()] convulses, then lies still."))
- return FALSE
-/datum/surgery_step/revive/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ //SKYRAT EDIT CHANGE - DNR TRAIT - need this so that people don't just keep spamming the revival surgery; it runs success just bc the surgery steps are done
+ if(HAS_TRAIT(target, TRAIT_DNR))
+ target.visible_message(span_warning("...[target.p_they()] lie[target.p_s()] still, unaffected. Further attempts are futile, target.p_theyre() gone."))
+ else
+ target.visible_message(span_warning("...[target.p_they()] convulse[target.p_s()], then lie[target.p_s()] still."))
+ //SKYRAT EDIT CHANGE END - DNR TRAIT - ORIGINAL: target.visible_message(span_warning("...[target.p_they()] convulse[target.p_s()], then lie[target.p_s()] still."))
+ return FALSE
+
+/// Called when you have been successfully raised from the dead
+/datum/surgery_step/revive/proc/on_revived(mob/surgeon, mob/living/patient)
+ patient.visible_message(span_notice("...[patient] wakes up, alive and aware!"))
+ patient.emote("gasp")
+ to_chat(patient, "[CONFIG_GET(string/blackoutpolicy)]") //SKYRAT EDIT ADDITION - BLACKOUT POLICY
+ if(HAS_MIND_TRAIT(surgeon, TRAIT_MORBID) && ishuman(surgeon)) // Contrary to their typical hatred of resurrection, it wouldn't be very thematic if morbid people didn't love playing god
+ var/mob/living/carbon/human/morbid_weirdo = surgeon
+ morbid_weirdo.add_mood_event("morbid_revival_success", /datum/mood_event/morbid_revival_success)
+
+/datum/surgery_step/revive/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(
user,
target,
@@ -112,5 +123,23 @@
span_notice("[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react."),
span_notice("[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react."),
)
- target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 180)
return FALSE
+
+/// Additional revival effects if the target has a brain
+/datum/surgery/revival/carbon
+ possible_locs = list(BODY_ZONE_HEAD)
+ target_mobtypes = list(/mob/living/carbon)
+
+/datum/surgery/revival/carbon/is_valid_target(mob/living/carbon/patient)
+ var/obj/item/organ/internal/brain/target_brain = patient.get_organ_slot(ORGAN_SLOT_BRAIN)
+ return !isnull(target_brain)
+
+/datum/surgery_step/revive/carbon
+
+/datum/surgery_step/revive/carbon/on_revived(mob/surgeon, mob/living/patient)
+ . = ..()
+ patient.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50, 199) // MAD SCIENCE
+
+/datum/surgery_step/revive/carbon/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ . = ..()
+ target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 180)
diff --git a/icons/mob/simple/corgi_head.dmi b/icons/mob/simple/corgi_head.dmi
index b582d0406f9..2e14a3ed0bb 100644
Binary files a/icons/mob/simple/corgi_head.dmi and b/icons/mob/simple/corgi_head.dmi differ