diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 6cb86b152fa..46898632451 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -471,6 +471,7 @@ so as to remain in compliance with the most up-to-date laws."
return
if(master)
return usr.client.Click(master, location, control, params)
+ ..() // VOREStation Edit: Pass through to click_vr
/obj/screen/alert/Destroy()
..()
diff --git a/code/_onclick/hud/alert_vr.dm b/code/_onclick/hud/alert_vr.dm
index 19310ad3150..da56de56854 100644
--- a/code/_onclick/hud/alert_vr.dm
+++ b/code/_onclick/hud/alert_vr.dm
@@ -23,3 +23,31 @@
/obj/screen/alert/starving/synth
name = "Low Power"
desc = "Your battery is very low! Low power mode makes all movements slower."
+
+/obj/screen/alert/xenochimera/reconstitution
+ name = "Reconstructing Form"
+ desc = "You're still rebuilding your body! Click the alert to find out how long you have left."
+ icon_state = "regenerating"
+
+/* // Commenting this out for now, will revisit later once I can figure out how to override Click() appropriately.
+/obj/screen/alert/xenochimera/reconstitution/Click(mob/usr)
+ var/mob/living/carbon/human/H = usr
+ if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
+ if(H.revive_ready == REVIVING_NOW)
+ to_chat(usr, "We are currently reviving, and will be done in [(H.revive_finished - world.time) / 10] seconds.")
+ else if(H.revive_ready == REVIVING_DONE)
+ to_chat(usr, "You should have a notification + alert for this! Bug report that this is still here!")
+*/
+
+/obj/screen/alert/xenochimera/readytohatch
+ name = "Ready to Hatch"
+ desc = "You're done reconstructing your cells! Click me to Hatch!"
+ icon_state = "hatch_ready"
+
+/* // Commenting this out for now, will revisit later once I can figure out how to override Click() appropriately.
+/obj/screen/alert/xenochimera/readytohatch/Click(mob/usr)
+ var/mob/living/carbon/human/H = usr
+ if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
+ if(H.revive_ready == REVIVING_DONE) // Sanity check.
+ H.hatch() // Hatch.
+*/
\ No newline at end of file
diff --git a/code/_onclick/hud/screen_objects_vr.dm b/code/_onclick/hud/screen_objects_vr.dm
index 1d8df98a38b..7fd40a534c0 100644
--- a/code/_onclick/hud/screen_objects_vr.dm
+++ b/code/_onclick/hud/screen_objects_vr.dm
@@ -50,6 +50,19 @@
else
if(H.nutrition < 150)
to_chat(usr, "Your hunger is slowly making you unstable.")
+ if("Reconstructing Form") // Allow Viewing Reconstruction Timer + Hatching for 'chimera
+ var/mob/living/carbon/human/H = usr
+ if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
+ if(H.revive_ready == REVIVING_NOW)
+ to_chat(usr, "We are currently reviving, and will be done in [round((H.revive_finished - world.time) / 10)] seconds, or [round(((H.revive_finished - world.time) * 0.1) / 60)] minutes.")
+ else if(H.revive_ready == REVIVING_DONE)
+ to_chat(usr, "You should have a notification + alert for this! Bug report that this is still here!")
+
+ if("Ready to Hatch") // Allow Viewing Reconstruction Timer + Hatching for 'chimera
+ var/mob/living/carbon/human/H = usr
+ if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
+ if(H.revive_ready == REVIVING_DONE) // Sanity check.
+ H.hatch() // Hatch.
else
return 0
diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm
index 160e337ceab..d6c00e80ee2 100644
--- a/code/game/objects/items/devices/defib.dm
+++ b/code/game/objects/items/devices/defib.dm
@@ -497,6 +497,12 @@
M.Weaken(rand(10,25))
M.updatehealth()
apply_brain_damage(M)
+ // VOREStation Edits Start: Defib pain
+ M.adjustHalLoss(40) // Moderate amount of halloss for EVERYONE being defibbed. Defibs feel like being kicked in the chest by a mule. Shit hurts if you're awake.
+ if(istype(M.species, /datum/species/xenochimera)) // Only do the following to Xenochimera. Handwave this however you want, this is to balance defibs on an alien race.
+ M.adjustHalLoss(220) // This hurts a LOT, stacks on top of the previous halloss.
+ M.feral += 100 // If they somehow weren't already feral, force them feral by increasing ferality var directly, to avoid any messy checks. handle_feralness() will immediately set our feral properly according to halloss anyhow.
+ // VOREStation Edits End
// SSgame_master.adjust_danger(-20) // VOREStation Edit - We don't use SSgame_master yet.
/obj/item/weapon/shockpaddles/proc/apply_brain_damage(mob/living/carbon/human/H)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 1fac4f32265..21e190cad11 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -278,6 +278,18 @@ HALOGEN COUNTER - Radcount on mobs
else
dat += "Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]
"
dat += "Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm."
+ if(istype(H.species, /datum/species/xenochimera)) // VOREStation Edit Start: Visible feedback for medmains on Xenochimera.
+ if(H.stat == DEAD && H.revive_ready == REVIVING_READY && !H.hasnutriment())
+ dat += "WARNING: Protein levels low. Subject incapable of reconstitution."
+ else if(H.revive_ready == REVIVING_NOW)
+ dat += "Subject is undergoing form reconstruction. Estimated time to finish is in: [round((H.revive_finished - world.time) / 10)] seconds."
+ else if(H.revive_ready == REVIVING_DONE)
+ dat += "Subject is ready to hatch. Transfer to dark room for holding with food available."
+ else if(H.stat == DEAD)
+ dat+= "WARNING: Defib will cause extreme pain and set subject feral. Sedation recommended prior to defibrillation."
+ else // If they bop them and they're not dead or reviving, give 'em a little notice.
+ dat += "Subject is a Xenochimera. Treat accordingly."
+ // VOREStation Edit End
user.show_message(dat, 1)
/obj/item/device/healthanalyzer/verb/toggle_mode()
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
index 5788ded0be5..73cccb8fdc3 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
@@ -33,17 +33,24 @@
//Scary spawnerization.
revive_ready = REVIVING_NOW
+ revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently.
+ throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution)
spawn(time SECONDS)
// Was dead, now not dead.
if(stat != DEAD)
to_chat(src, "Your body has recovered from its ordeal, ready to regenerate itself again.")
revive_ready = REVIVING_READY //reset their cooldown
+ clear_alert("regen")
+ throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
// Was dead, still dead.
else
to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch.")
verbs |= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_DONE
+ src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
+ clear_alert("regen")
+ throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
//Dead until nutrition injected.
else
@@ -55,6 +62,8 @@
//Waiting for regen after being alive
revive_ready = REVIVING_NOW
+ revive_finished = (world.time + time SECONDS) // When do we finish reviving? Allows us to find out when we're done, called by the alert currently.
+ throw_alert("regen", /obj/screen/alert/xenochimera/reconstitution)
spawn(time SECONDS)
//If they're still alive after regenning.
@@ -62,17 +71,24 @@
to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch..")
verbs |= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_DONE
+ src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
+ clear_alert("regen")
+ throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
//Was alive, now dead
else if(hasnutriment())
to_chat(src, "Consciousness begins to stir as your new body awakens, ready to hatch..")
verbs |= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_DONE
+ src << sound('sound/effects/mob_effects/xenochimera/hatch_notification.ogg',0,0,0,30)
+ clear_alert("regen")
+ throw_alert("hatch", /obj/screen/alert/xenochimera/readytohatch)
//Dead until nutrition injected.
else
to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.")
revive_ready = REVIVING_READY //reset their cooldown
+ clear_alert("regen")
/mob/living/carbon/human/proc/hasnutriment()
if (bloodstr.has_reagent("nutriment", 30) || src.bloodstr.has_reagent("protein", 15)) //protein needs half as much. For reference, a steak contains 9u protein.
@@ -101,6 +117,7 @@
chimera_hatch()
adjustBrainLoss(10) // if they're reviving from dead, they come back with 10 brainloss on top of whatever's unhealed.
visible_message("The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.
") //Bloody hell...
+ clear_alert("hatch")
return
//Don't have nutriment to hatch! Or you somehow died in between completing your revive and hitting hatch.
@@ -108,11 +125,13 @@
to_chat(src, "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.")
verbs -= /mob/living/carbon/human/proc/hatch
revive_ready = REVIVING_READY //reset their cooldown they can try again when they're given a kickstart
+ clear_alert("hatch")
//Alive when hatching
else
chimera_hatch()
visible_message("The dormant husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.
") //Bloody hell...
+ clear_alert("hatch")
/mob/living/carbon/human/proc/chimera_hatch()
verbs -= /mob/living/carbon/human/proc/hatch
@@ -139,9 +158,13 @@
//Visual effects
var/T = get_turf(src)
- new /obj/effect/gibspawner/human/xenochimera(T)
+ var/blood_color = species.blood_color
+ var/flesh_color = species.flesh_color
+ new /obj/effect/gibspawner/human/xenochimera(T, null, flesh_color, blood_color)
+
+ playsound(T, 'sound/effects/mob_effects/xenochimera/hatch.ogg', 50)
- revive_ready = world.time + 1 HOUR //set the cooldown
+ revive_ready = world.time + 10 MINUTES //set the cooldown CHOMPEdit: Reduced this to 10 minutes, you're playing with fire if you're reviving that often.
/mob/living/carbon/human/proc/revivingreset() // keep this as a debug proc or potential future use
revive_ready = REVIVING_READY
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
index 4d766fb837a..10f1aa0acd1 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
@@ -28,7 +28,7 @@
/mob/living/carbon/human/proc/tie_hair,
/mob/living/proc/flying_toggle,
/mob/living/proc/start_wings_hovering,
- /mob/living/carbon/human/proc/tie_hair) //Xenochimera get all the special verbs since they can't select traits.
+ /mob/living/carbon/human/proc/lick_wounds) //Xenochimera get all the special verbs since they can't select traits.
virus_immune = 1 // They practically ARE one.
min_age = 18
@@ -50,7 +50,7 @@
//primitive_form = "Farwa"
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken.
- flags = NO_SCAN | NO_INFECT //Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is.
+ flags = NO_SCAN | NO_INFECT // | NO_DEFIB // Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. Leaving NO_DEFIB there for the future/in case reversion to old 'chimera no-defib.
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
genders = list(MALE, FEMALE, PLURAL, NEUTER)
@@ -74,8 +74,8 @@
reagent_tag = IS_CHIMERA
/datum/species/xenochimera/handle_environment_special(var/mob/living/carbon/human/H)
- //If they're KO'd/dead, they're probably not thinking a lot about much of anything.
- if(!H.stat)
+ //If they're KO'd/dead, or reviving, they're probably not thinking a lot about much of anything.
+ if(!H.stat || !(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE))
handle_feralness(H)
//While regenerating
@@ -83,6 +83,10 @@
H.weakened = 5
H.canmove = 0
H.does_not_breathe = TRUE
+ var/regen_sounds = H.regen_sounds
+ if(prob(2)) // 2% chance of playing squelchy noise while reviving, which is run roughly every 2 seconds/tick while regenerating.
+ playsound(H, pick(regen_sounds), 30)
+ H.visible_message("[H.name]'s motionless form shudders grotesquely, rippling unnaturally.
")
//Cold/pressure effects when not regenerating
else
diff --git a/code/modules/mob/living/carbon/lick_wounds.dm b/code/modules/mob/living/carbon/lick_wounds.dm
index 4dd039186e0..bd726e4ac67 100644
--- a/code/modules/mob/living/carbon/lick_wounds.dm
+++ b/code/modules/mob/living/carbon/lick_wounds.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/proc/lick_wounds(var/mob/living/carbon/M in living_mobs(1))
+/mob/living/carbon/human/proc/lick_wounds(var/mob/living/carbon/M) // Allows the user to lick themselves. Given how rarely this trait is used, I don't see an issue with a slight buff.
set name = "Lick Wounds"
set category = "Abilities"
set desc = "Disinfect and heal small wounds with your saliva."
@@ -7,6 +7,10 @@
to_chat(src, "You need more energy to produce antiseptic enzymes. Eat something and try again.")
return
+ if (get_dist(src,M) >= 2)
+ to_chat(src, "You need to be closer to do that.")
+ return
+
if ( ! (istype(src, /mob/living/carbon/human) || \
istype(src, /mob/living/silicon)) )
to_chat(src, "If you even have a tongue, it doesn't work that way.")
@@ -49,7 +53,7 @@
if(affecting.brute_dam > 20 || affecting.burn_dam > 20)
to_chat(src, "The wounds on [M]'s [affecting.name] are too severe to treat with just licking.")
return
-
+
else
visible_message("\The [src] starts licking the wounds on [M]'s [affecting.name] clean.", \
"You start licking the wounds on [M]'s [affecting.name] clean." )
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 0d18a844b4a..e951477ba76 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -21,6 +21,7 @@
var/vore_egg_type = "egg" // Default egg type.
var/feral = 0 // How feral the mob is, if at all. Does nothing for non xenochimera at the moment.
var/revive_ready = REVIVING_READY // Only used for creatures that have the xenochimera regen ability, so far.
+ var/revive_finished = 0 // Only used for xenochimera regen, allows us to find out when the regen will finish.
var/metabolism = 0.0015
var/vore_taste = null // What the character tastes like
var/vore_smell = null // What the character smells like
@@ -38,6 +39,13 @@
var/adminbus_eat_minerals = FALSE // This creature subsists on a diet of pure adminium.
var/vis_height = 32 // Sprite height used for resize features.
var/show_vore_fx = TRUE // Show belly fullscreens
+ var/regen_sounds = list(
+ 'sound/effects/mob_effects/xenochimera/regen_1.ogg',
+ 'sound/effects/mob_effects/xenochimera/regen_2.ogg',
+ 'sound/effects/mob_effects/xenochimera/regen_4.ogg',
+ 'sound/effects/mob_effects/xenochimera/regen_3.ogg',
+ 'sound/effects/mob_effects/xenochimera/regen_5.ogg'
+ )
//
// Hook for generic creation of stuff on new creatures
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index e2abc031b13..69badf5b833 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/sound/effects/mob_effects/xenochimera/hatch.ogg b/sound/effects/mob_effects/xenochimera/hatch.ogg
new file mode 100644
index 00000000000..3ac74fdec10
Binary files /dev/null and b/sound/effects/mob_effects/xenochimera/hatch.ogg differ
diff --git a/sound/effects/mob_effects/xenochimera/hatch_notification.ogg b/sound/effects/mob_effects/xenochimera/hatch_notification.ogg
new file mode 100644
index 00000000000..f821a898b78
Binary files /dev/null and b/sound/effects/mob_effects/xenochimera/hatch_notification.ogg differ
diff --git a/sound/effects/mob_effects/xenochimera/regen_1.ogg b/sound/effects/mob_effects/xenochimera/regen_1.ogg
new file mode 100644
index 00000000000..199e7db7803
Binary files /dev/null and b/sound/effects/mob_effects/xenochimera/regen_1.ogg differ
diff --git a/sound/effects/mob_effects/xenochimera/regen_2.ogg b/sound/effects/mob_effects/xenochimera/regen_2.ogg
new file mode 100644
index 00000000000..a15d9797974
Binary files /dev/null and b/sound/effects/mob_effects/xenochimera/regen_2.ogg differ
diff --git a/sound/effects/mob_effects/xenochimera/regen_3.ogg b/sound/effects/mob_effects/xenochimera/regen_3.ogg
new file mode 100644
index 00000000000..5546c2b25f7
Binary files /dev/null and b/sound/effects/mob_effects/xenochimera/regen_3.ogg differ
diff --git a/sound/effects/mob_effects/xenochimera/regen_4.ogg b/sound/effects/mob_effects/xenochimera/regen_4.ogg
new file mode 100644
index 00000000000..a5d706e7cea
Binary files /dev/null and b/sound/effects/mob_effects/xenochimera/regen_4.ogg differ
diff --git a/sound/effects/mob_effects/xenochimera/regen_5.ogg b/sound/effects/mob_effects/xenochimera/regen_5.ogg
new file mode 100644
index 00000000000..b85eced5ab2
Binary files /dev/null and b/sound/effects/mob_effects/xenochimera/regen_5.ogg differ