Merge pull request #12558 from Rykka-Stormheart/shep-dev-xenochimera-qol

Xenochimera QOL PR
This commit is contained in:
Casey
2022-03-28 19:05:19 -04:00
committed by GitHub
17 changed files with 118 additions and 14 deletions
+1
View File
@@ -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()
..()
+28
View File
@@ -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.
*/
+15
View File
@@ -45,11 +45,26 @@
var/turf/T = get_turf(H)
if(T.get_lumcount() <= 0.1)
to_chat(usr, "<span class='notice'>You are slowly calming down in darkness' safety...</span>")
else if(isbelly(H.loc)) // Safety message for if inside a belly.
to_chat(usr, "<span class='notice'>You are slowly calming down within the darkness of something's belly, listening to their body as it moves around you. ...safe...</span>")
else
to_chat(usr, "<span class='notice'>You are slowly calming down... But safety of darkness is much preferred.</span>")
else
if(H.nutrition < 150)
to_chat(usr, "<span class='warning'>Your hunger is slowly making you unstable.</span>")
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, "<span class='notice'>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.</span>")
else if(H.revive_ready == REVIVING_DONE)
to_chat(usr, "<span class='warning'>You should have a notification + alert for this! Bug report that this is still here!</span>")
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
+5
View File
@@ -497,6 +497,11 @@
M.Weaken(rand(10,25))
M.updatehealth()
apply_brain_damage(M)
// VOREStation Edits Start: Defib pain
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)
@@ -278,6 +278,18 @@ HALOGEN COUNTER - Radcount on mobs
else
dat += "<span class='notice'>Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]</span><br>"
dat += "<span class='notice'>Subject's pulse: <font color='[H.pulse == PULSE_THREADY || H.pulse == PULSE_NONE ? "red" : "blue"]'>[H.get_pulse(GETPULSE_TOOL)] bpm.</font></span>"
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 += "<span class='danger'>WARNING: Protein levels low. Subject incapable of reconstitution.</span>"
else if(H.revive_ready == REVIVING_NOW)
dat += "<span class='warning'>Subject is undergoing form reconstruction. Estimated time to finish is in: [round((H.revive_finished - world.time) / 10)] seconds.</span>"
else if(H.revive_ready == REVIVING_DONE)
dat += "<span class='notice'>Subject is ready to hatch. Transfer to dark room for holding with food available.</span>"
else if(H.stat == DEAD)
dat+= "<span class='danger'>WARNING: Defib will cause extreme pain and set subject feral. Sedation recommended prior to defibrillation.</span>"
else // If they bop them and they're not dead or reviving, give 'em a little notice.
dat += "<span class='notice'>Subject is a Xenochimera. Treat accordingly.</span>"
// VOREStation Edit End
user.show_message(dat, 1)
/obj/item/device/healthanalyzer/verb/toggle_mode()
@@ -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, "<span class='notice'>Your body has recovered from its ordeal, ready to regenerate itself again.</span>")
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, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch.</span>")
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, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>")
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, "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>")
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, "<span class='warning'>Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process.</span>")
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("<span class='danger'><p><font size=4>The lifeless husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.</font></p></span>") //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("<span class='danger'><p><font size=4>The dormant husk of [src] bursts open, revealing a new, intact copy in the pool of viscera.</font></p></span>") //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
@@ -27,8 +27,7 @@
/mob/living/carbon/human/proc/sonar_ping,
/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/proc/start_wings_hovering) //Xenochimera get all the special verbs since they can't select traits.
virus_immune = 1 // They practically ARE one.
min_age = 18
@@ -50,7 +49,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 +73,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 +82,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("<span class='danger'><p><font size=4>[H.name]'s motionless form shudders grotesquely, rippling unnaturally.</font></p></span>")
//Cold/pressure effects when not regenerating
else
@@ -202,6 +205,11 @@
feral++
else
feral = max(0,--feral)
// Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9
var/turf/T = get_turf(H)
if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1))
feral = max(0,--feral)
//Set our real mob's var to our temp var
H.feral = feral
@@ -218,7 +226,7 @@
H.shock_stage = max(H.shock_stage-(feral/20), 0)
//Handle light/dark areas
var/turf/T = get_turf(H)
// var/turf/T = get_turf(H) // Moved up to before the in-belly/dark combined check, should still safely reach here just fine.
if(!T)
update_xenochimera_hud(H, danger, feral_state)
return //Nullspace
@@ -230,8 +238,8 @@
//This is basically the 'lite' version of the below block.
var/list/nearby = H.living_mobs(world.view)
//Not in the dark and out in the open.
if(!darkish && isturf(H.loc))
//Not in the dark, or a belly, and out in the open.
if(!darkish && isturf(H.loc) && !isbelly(H.loc)) // Added specific check for if in belly
//Always handle feral if nobody's around and not in the dark.
if(!nearby.len)
@@ -245,8 +253,8 @@
update_xenochimera_hud(H, danger, feral_state)
return
// In the darkness or "hidden". No need for custom scene-protection checks as it's just an occational infomessage.
if(darkish || !isturf(H.loc))
// In the darkness, or "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage.
if(darkish || !isturf(H.loc) || isbelly(H.loc)) // Specific check for if in belly. !isturf should do this, but JUST in case.
// If hurt, tell 'em to heal up
if (shock)
to_chat(H,"<span class='info'>This place seems safe, secure, hidden, a place to lick your wounds and recover...</span>")
@@ -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, "<span class='warning'>You need more energy to produce antiseptic enzymes. Eat something and try again.</span>")
return
if (get_dist(src,M) >= 2)
to_chat(src, "<span class='warning'>You need to be closer to do that.</span>")
return
if ( ! (istype(src, /mob/living/carbon/human) || \
istype(src, /mob/living/silicon)) )
to_chat(src, "<span class='warning'>If you even have a tongue, it doesn't work that way.</span>")
@@ -49,7 +53,7 @@
if(affecting.brute_dam > 20 || affecting.burn_dam > 20)
to_chat(src, "<span class='warning'>The wounds on [M]'s [affecting.name] are too severe to treat with just licking.</span>")
return
else
visible_message("<b>\The [src]</b> starts licking the wounds on [M]'s [affecting.name] clean.", \
"<span class='notice'>You start licking the wounds on [M]'s [affecting.name] clean.</span>" )
+8
View File
@@ -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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.