mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-08-23 12:06:22 +01:00
Merge branch 'master' into SUCCUBUS_DRAIN
This commit is contained in:
@@ -980,6 +980,14 @@
|
||||
H.brainmob.mind.transfer_to(src)
|
||||
qdel(H)
|
||||
|
||||
// Vorestation Addition - reapply markings/appearance from prefs for player mobs
|
||||
if(client) //just to be sure
|
||||
client.prefs.copy_to(src)
|
||||
if(dna)
|
||||
dna.ResetUIFrom(src)
|
||||
sync_organ_dna()
|
||||
// end vorestation addition
|
||||
|
||||
for (var/ID in virus2)
|
||||
var/datum/disease2/disease/V = virus2[ID]
|
||||
V.cure(src)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/mob/living/carbon/human/proc/weightgain()
|
||||
if (nutrition > 0 && stat != 2)
|
||||
if (nutrition > MIN_NUTRITION_TO_GAIN && weight < MAX_MOB_WEIGHT && weight_gain)
|
||||
weight += metabolism*(0.01*weight_gain)
|
||||
weight += species.metabolism*(0.01*weight_gain)
|
||||
|
||||
else if (nutrition <= MAX_NUTRITION_TO_LOSE && stat != 2 && weight > MIN_MOB_WEIGHT && weight_loss)
|
||||
weight -= metabolism*(0.01*weight_loss) // starvation weight loss
|
||||
weight -= species.metabolism*(0.01*weight_loss) // starvation weight loss
|
||||
|
||||
/mob/living/carbon/human/proc/handle_hud_list_vr()
|
||||
|
||||
@@ -50,3 +50,24 @@
|
||||
|
||||
//Process regular life stuff
|
||||
nif.life()
|
||||
|
||||
//Overriding carbon move proc that forces default hunger factor
|
||||
/mob/living/carbon/Move(NewLoc, direct)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(src.nutrition && src.stat != 2)
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/M = src
|
||||
if(M.stat != 2 && M.nutrition > 0)
|
||||
M.nutrition -= M.species.hunger_factor/10
|
||||
if(M.m_intent == "run")
|
||||
M.nutrition -= M.species.hunger_factor/10
|
||||
else
|
||||
src.nutrition -= DEFAULT_HUNGER_FACTOR/10
|
||||
if(src.m_intent == "run")
|
||||
src.nutrition -= DEFAULT_HUNGER_FACTOR/10
|
||||
if((FAT in src.mutations) && src.m_intent == "run" && src.bodytemperature <= 360)
|
||||
src.bodytemperature += 2
|
||||
// Moving around increases germ_level faster
|
||||
if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
|
||||
germ_level++
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
//var/vore_numbing = 0
|
||||
var/gets_food_nutrition = 1 // If this is set to 0, the person can't get nutrrition from food.
|
||||
var/can_drain_prey = 0 //Determines if the person can use the succubus drain or not.
|
||||
var/metabolism = 0.0015
|
||||
|
||||
/datum/species/custom
|
||||
name = "Custom Species"
|
||||
|
||||
@@ -25,6 +25,13 @@
|
||||
C << "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds."
|
||||
C.does_not_breathe = 1 //effectively makes them spaceworthy while regenning
|
||||
|
||||
for(var/obj/item/organ/E in C.bad_external_organs)
|
||||
var/obj/item/organ/external/affected = E
|
||||
for(var/datum/wound/W in affected.wounds) // Fix internal bleeds at the start of the rejuv process.
|
||||
if(istype(W, /datum/wound/internal_bleeding))
|
||||
affected.wounds -= W
|
||||
affected.update_damages()
|
||||
|
||||
spawn(time SECONDS)
|
||||
if(C) //Runtime prevention.
|
||||
C << "<span class='notice'>Consciousness begins to stir as your new body awakens, ready to hatch..</span>"
|
||||
@@ -62,6 +69,56 @@
|
||||
else
|
||||
return //Something went wrong
|
||||
|
||||
/mob/living/carbon/human/proc/purge_impurities() //a lesser regeneration that just purges toxin/infections without healing. Does NOT clear reagents.
|
||||
set name = "Purge Impurities"
|
||||
set category = "Abilities"
|
||||
|
||||
if(world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 50 //To prevent button spam.
|
||||
|
||||
var/mob/living/carbon/human/C = src
|
||||
|
||||
if(C.reviving == 1) //If they're already unable to
|
||||
C << "Your body is currently still recovering from the last time you healed."
|
||||
return
|
||||
|
||||
C.reviving = 1 // apply cooldown, this also locks out their main regen.
|
||||
C << "<span class='notice'>You start to purge your body of poisons and intruders...</span>"
|
||||
|
||||
var/grossness = min(20, toxloss)
|
||||
|
||||
for(var/i = 0, i<10,i++) // tick some tox down. This'll clear 20 toxloss in total.
|
||||
if(C)
|
||||
C.adjustToxLoss(-2)
|
||||
sleep(10)
|
||||
|
||||
for(var/obj/item/organ/external/E in C.organs) //half the germ_level of everything. If they're anything short of outright necrotic they'll be fine.
|
||||
var/obj/item/organ/external/G = E
|
||||
if(G.germ_level)
|
||||
grossness += G.germ_level/100
|
||||
G.germ_level = min(0, (G.germ_level/2) - 100)
|
||||
|
||||
for(var/obj/item/organ/internal/I in C.internal_organs)
|
||||
var/obj/item/organ/internal/G = I
|
||||
if(G.germ_level)
|
||||
grossness += G.germ_level/100
|
||||
G.germ_level = min(0, (G.germ_level/2) - 100)
|
||||
|
||||
//and now comes the fun part because they're gross
|
||||
for (var/i = 0, i<10,i++)
|
||||
if (prob(min(100, grossness)))
|
||||
C << "<span class='warning'>You feel nauseous...</span>"
|
||||
spawn(30)
|
||||
C.vomit()
|
||||
sleep(50)
|
||||
grossness = (grossness/2)
|
||||
|
||||
C << "<span class='notice'>You have finished purging your body of impurities.</span>"
|
||||
|
||||
spawn(300 SECONDS) //5 minute wait until you can purge or regenerate again.
|
||||
C.reviving = 0
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/hasnutriment()
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
icobase_tail = 1
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/begin_reconstitute_form,
|
||||
/mob/living/carbon/human/proc/sonar_ping)
|
||||
/mob/living/carbon/human/proc/sonar_ping,
|
||||
/mob/living/carbon/human/proc/purge_impurities)
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
@@ -53,7 +54,7 @@
|
||||
|
||||
//handle feral triggers
|
||||
|
||||
if(H.nutrition <= 200||H.traumatic_shock > 36) // Stress factors are in play
|
||||
if(H.nutrition <= 200||H.traumatic_shock > min(60, H.nutrition/10)) // Stress factors are in play
|
||||
// If they're hungry, give nag messages.
|
||||
if (!istype(H.loc, /mob)) // if they're in a mob, skip the hunger stuff so it doesn't mess with drain/absorption modes.
|
||||
if(H.nutrition < 200 && H.nutrition > 150)
|
||||
@@ -73,7 +74,7 @@
|
||||
H.feral = min(150-H.nutrition, H.feral+1) //Feralness increases while this hungry, capped at 50-150 depending on hunger.
|
||||
|
||||
// If they're hurt, chance of snapping. Not if they're straight-up KO'd though.
|
||||
if (H.stat == CONSCIOUS && H.traumatic_shock >=36) //30 brute/burn, or 18 halloss.
|
||||
if (H.stat == CONSCIOUS && H.traumatic_shock >=min(60, H.nutrition/10)) //at 360 nutrition, this is 30 brute/burn, or 18 halloss. Capped at 50 brute/30 halloss - if they take THAT much, no amount of satiation will help them. Also they're fat.
|
||||
if (2.5*H.halloss >= H.traumatic_shock) //If the majority of their shock is due to halloss, greater chance of snapping.
|
||||
if(prob(min(10,(0.2 * H.traumatic_shock))))
|
||||
if(H.feral == 0)
|
||||
|
||||
@@ -2,21 +2,21 @@
|
||||
name = "Fast Metabolism"
|
||||
desc = "You process ingested and injected reagents faster, but get hungry faster."
|
||||
cost = 0
|
||||
var_changes = list("metabolic_rate" = 1.2, "hunger_factor" = 0.2) //Teshari level
|
||||
var_changes = list("metabolic_rate" = 1.2, "hunger_factor" = 0.2, "metabolism" = 0.005) //Teshari level
|
||||
excludes = list(/datum/trait/metabolism_down, /datum/trait/metabolism_apex)
|
||||
|
||||
/datum/trait/metabolism_down
|
||||
name = "Slow Metabolism"
|
||||
desc = "You process ingested and injected reagents slower, but get hungry slower."
|
||||
cost = 0
|
||||
var_changes = list("metabolic_rate" = 0.8, "hunger_factor" = 0.04)
|
||||
var_changes = list("metabolic_rate" = 0.8, "hunger_factor" = 0.04, "metabolism" = 0.001)
|
||||
excludes = list(/datum/trait/metabolism_up, /datum/trait/metabolism_apex)
|
||||
|
||||
/datum/trait/metabolism_apex
|
||||
name = "Apex Metabolism"
|
||||
desc = "Finally a proper excuse for your predatory actions. Also makes you process reagents faster but that's totally irrelevant. May cause excessive immersions with large/taur characters. Not recommended for efficient law-abiding workers or eco-aware NIF users."
|
||||
cost = 0
|
||||
var_changes = list("metabolic_rate" = 2, "hunger_factor" = 0.5) //Big boy level
|
||||
var_changes = list("metabolic_rate" = 2, "hunger_factor" = 0.5, "metabolism" = 0.010) //Big boy level
|
||||
excludes = list(/datum/trait/metabolism_up, /datum/trait/metabolism_down)
|
||||
/*
|
||||
/datum/trait/vore_numbing
|
||||
|
||||
@@ -218,6 +218,16 @@
|
||||
/obj/item/clothing/accessory/storage/black_vest/fluff/kilano
|
||||
)
|
||||
|
||||
// JackNoir413: Mor Xaina
|
||||
/obj/item/weapon/storage/box/fluff/morxaina
|
||||
name = "Fashionable clothes set"
|
||||
desc = "Set of custom-made, expensive attire elements."
|
||||
has_items = list(
|
||||
/obj/item/clothing/shoes/fluff/morthighs,
|
||||
/obj/item/clothing/gloves/fluff/morsleeves,
|
||||
/obj/item/clothing/under/fluff/morunder)
|
||||
|
||||
|
||||
/*
|
||||
Swimsuits, for general use, to avoid arriving to work with your swimsuit.
|
||||
*/
|
||||
|
||||
@@ -1400,6 +1400,30 @@ Departamental Swimsuits, for general use
|
||||
icon = 'icons/vore/custom_clothes_vr.dmi'
|
||||
icon_state = "alfonso_visor"
|
||||
icon_override = 'icons/vore/custom_onmob_vr.dmi'
|
||||
|
||||
//JackNoir413: Mor Xaina
|
||||
/obj/item/clothing/under/fluff/morunder
|
||||
desc = "Fashionable grey top, combined with black shorts. Fancy!"
|
||||
icon = 'icons/vore/custom_clothes_vr.dmi'
|
||||
icon_state = "morunder"
|
||||
icon_override = 'icons/vore/custom_clothes_vr.dmi'
|
||||
item_state = "morunder_mob"
|
||||
|
||||
//JackNoir413: Mor Xaina
|
||||
/obj/item/clothing/gloves/fluff/morsleeves
|
||||
desc = "Cute long armwarmers. Sadly, they don't cover fingers."
|
||||
icon = 'icons/vore/custom_clothes_vr.dmi'
|
||||
icon_state = "morsleeves"
|
||||
icon_override = 'icons/vore/custom_clothes_vr.dmi'
|
||||
item_state = "morsleeves_mob"
|
||||
|
||||
//JackNoir413: Mor Xaina
|
||||
/obj/item/clothing/shoes/fluff/morthighs
|
||||
desc = "Striped, soft thigh-high socks with no fingers. Must be hard to wash them..."
|
||||
icon = 'icons/vore/custom_clothes_vr.dmi'
|
||||
icon_state = "morthighs"
|
||||
icon_override = 'icons/vore/custom_clothes_vr.dmi'
|
||||
item_state = "morthighs_mob"
|
||||
|
||||
//Jackets For General Use. Sprited by Joji.
|
||||
/obj/item/clothing/suit/storage/fluff/jacket //Not the toggle version since it uses custom toggle code to update the on-mob icon.
|
||||
|
||||
@@ -194,20 +194,6 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
|
||||
to_helmet = /obj/item/clothing/head/helmet/space/void/engineering/hazmat/fluff/screehelm
|
||||
to_suit = /obj/item/clothing/suit/space/void/engineering/hazmat/fluff/screespess
|
||||
|
||||
/obj/item/clothing/glasses/omnihud/eng/meson/fluff/scree
|
||||
name = "OCR headset"
|
||||
desc = "A meson-scanning headset with retinal projector and ultrasonic earpiece. This one is set up to read text to the wearer."
|
||||
description_info = "The device appears to be configured as an aid to reading, with an OCR system that highlights text for the wearer and \
|
||||
reads it out through the earpiece, while rendering the meson scan data as high-frequency sound. It's like a HUD for bats."
|
||||
|
||||
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(H.ckey != "scree")
|
||||
H << "<span class='warning'>This thing isn't set up for your visual spectrum OR your audio range.</span>"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
|
||||
//General Use
|
||||
/obj/item/weapon/flag
|
||||
name = "Nanotrasen Banner"
|
||||
|
||||
@@ -181,14 +181,17 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
|
||||
else
|
||||
src << "You quickly push [tmob] to the ground with your foot!"
|
||||
tmob << "[src] pushes you down to the ground with their foot!"
|
||||
log_and_message_admins("has pushed [tmob] to the ground by stepping on them.") //Both humans and mobs, since stepping on mobs can be abused.
|
||||
admin_attack_log(src, tmob, "Pinned [tmob.name] under foot.", "Was pinned under foot by [src.name].", "Pinned [tmob.name] under foot.")
|
||||
return 1
|
||||
if(src.m_intent == "walk") //Most likely intentionally stepping on them.
|
||||
var/size_damage_multiplier = (src.size_multiplier - tmob.size_multiplier)
|
||||
var/damage = (rand(15,30)* size_damage_multiplier) //Since stunned is broken, let's do this. Rand 15-30 multiplied by 1 min or 1.75 max. 15 holo to 52.5 holo, depending on RNG and size differnece.
|
||||
tmob.apply_damage(damage, HALLOSS)
|
||||
tmob.resting = 1
|
||||
|
||||
var/mob/living/carbon/human/H = src
|
||||
log_and_message_admins("has stomped on, [tmob] pinning them to the ground and dealing [damage] HALLOSS.") //Both humans and mobs, since stepping on mobs can be abused.
|
||||
admin_attack_log(src, tmob, "Pinned [tmob.name] under foot for [damage] HALLOSS.", "Was pinned under foot by [src.name] for [damage] HALLOSS.", "Pinned [tmob.name] under foot for [damage] HALLOSS.")
|
||||
if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga))
|
||||
src << "You push down on [tmob] with your tail, pinning them down under you!"
|
||||
tmob << "[src] pushes down on you with their tail, pinning you down below them!"
|
||||
@@ -215,6 +218,8 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
|
||||
M.drip(0.1)
|
||||
for(var/obj/item/organ/I in M.organs)
|
||||
tmob.take_overall_damage(calculated_damage, 0) //Due to the fact that this deals damage across random body parts, this should heal quite fast.
|
||||
log_and_message_admins("has trampled [M] for [calculated_damage * 10] damage.") //Only crushing humans get logged.
|
||||
admin_attack_log(src, M, "trampled [tmob.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.")
|
||||
else
|
||||
src << "You carelessly step down onto [tmob], crushing them!!"
|
||||
tmob << "[src] steps carelessly on your body, crushing you!"
|
||||
@@ -223,6 +228,8 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
|
||||
for(var/obj/item/organ/I in M.organs)
|
||||
tmob.take_overall_damage(calculated_damage, 0) // 5 damage min, 26.25 damage max, depending on size & RNG. If they're only stepped on once, the damage will heal over time.
|
||||
M.drip(0.1)
|
||||
log_and_message_admins("has trampled [M] for [calculated_damage * 10] damage.")
|
||||
admin_attack_log(src, M, "Crushed [tmob.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.")
|
||||
return 1
|
||||
|
||||
if(src.m_intent == "walk") //Oh my.
|
||||
@@ -236,6 +243,8 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
|
||||
for(var/obj/item/organ/I in M.organs)
|
||||
tmob.take_overall_damage(damage, 0) //17.5 damage min, 91.875 damage max. If they're only stepped on once, the damage will heal over time.
|
||||
M.drip(3) //The least of your problems, honestly.
|
||||
log_and_message_admins("has harshly crushed [M] for [damage * 10] damage.")
|
||||
admin_attack_log(src, M, "Crushed [M.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.")
|
||||
else
|
||||
src << "You methodically place your foot down upon [tmob]'s body, slowly applying pressure, crushing them against the floor below!"
|
||||
tmob << "[src] methodically places their foot upon your body, slowly applying pressure, crushing you against the floor below!"
|
||||
@@ -244,17 +253,10 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
|
||||
for(var/obj/item/organ/I in M.organs)
|
||||
tmob.take_overall_damage(damage, 0)
|
||||
M.drip(3)
|
||||
log_and_message_admins("has harshly crushed [M] for [damage * 10] damage.")
|
||||
admin_attack_log(src, M, "Crushed [M.name] under foot for [damage * 10] damage.", "Was crushed under foot by [H.name] for [damage * 10] damage.", "Crushed [M.name] for [damage * 10] damage.")
|
||||
return 1
|
||||
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/naga))
|
||||
src << "You steamroller over [tmob] with your heavy tail!"
|
||||
tmob << "[src] ploughs you down mercilessly with their heavy tail!"
|
||||
else
|
||||
src << "You bring your foot down heavily upon [tmob]!"
|
||||
tmob << "[src] steps carelessly on your body!"
|
||||
return 1
|
||||
|
||||
if(src.a_intent == I_GRAB && src.canmove && !src.buckled)
|
||||
if((src.get_effective_size() - tmob.get_effective_size()) >= 0.50)
|
||||
now_pushing = 0
|
||||
|
||||
Reference in New Issue
Block a user