diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index af561b97ec..2554b44d8b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/life_vr.dm b/code/modules/mob/living/carbon/human/life_vr.dm index d573e5568c..cd52e9eb72 100644 --- a/code/modules/mob/living/carbon/human/life_vr.dm +++ b/code/modules/mob/living/carbon/human/life_vr.dm @@ -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++ diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index eddfe36129..ab39cc56d5 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -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" 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 c4d1f1e228..3ad27f7e7c 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 @@ -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 << "Consciousness begins to stir as your new body awakens, ready to hatch.." @@ -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 << "You start to purge your body of poisons and intruders..." + + 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 << "You feel nauseous..." + spawn(30) + C.vomit() + sleep(50) + grossness = (grossness/2) + + C << "You have finished purging your body of impurities." + + spawn(300 SECONDS) //5 minute wait until you can purge or regenerate again. + C.reviving = 0 /mob/living/carbon/human/proc/hasnutriment() 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 fefa6ee203..79a0a13138 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 @@ -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) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm index 94139578c7..196ac323f4 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -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 diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index a81a104d67..03c11019af 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -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. */ diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index c79b72afa3..7faae9d2cd 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -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. diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 3b0cce0782..6521ecfde3 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -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 << "This thing isn't set up for your visual spectrum OR your audio range." - return 0 - else - return 1 - //General Use /obj/item/weapon/flag name = "Nanotrasen Banner" diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 8c2ccda0d3..8e4bf21b12 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -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 diff --git a/config/custom_items.txt b/config/custom_items.txt index 09cd41d6a4..a646f982e1 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -280,6 +280,12 @@ item_path: /obj/item/weapon/storage/backpack/messenger/sec/fluff/ivymoomoo # ######## J CKEYS +{ +ckey: jacknoir413 +character_name: Mor Xaina +item_path: /obj/item/clothing/under/fluff/morxaina +} + { ckey: jacobdragon character_name: Earthen Breath @@ -602,12 +608,6 @@ character_name: Scree item_path: /obj/item/clothing/head/fluff/pompom } -{ -ckey: scree -character_name: Scree -item_path: /obj/item/clothing/glasses/omnihud/eng/meson/fluff/scree -} - { ckey: seiga character_name: Alfonso Oak Telanor diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi index 2442e69f2e..802588e317 100644 Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ