Merge branch 'master' into upstream-merge-11809

This commit is contained in:
Nadyr
2021-12-12 03:37:13 -05:00
committed by GitHub
120 changed files with 13270 additions and 272 deletions
@@ -234,6 +234,12 @@
ckeywhitelist = list("chaleur")
character_name = list("Hisako Arato")
/datum/gear/fluff/jade_stamp
path = /obj/item/weapon/stamp/fluff/jade_horror
display_name = "Official Council of Mid Horror rubber stamp"
ckeywhitelist = list("coolcrow420")
character_name = list("Jade Davis")
// D CKEYS
/datum/gear/fluff/dhaeleena_medal
path = /obj/item/clothing/accessory/medal/silver/security/fluff/dhael
@@ -320,6 +326,7 @@
// G CKEYS
// H CKEYS
/datum/gear/fluff/lauren_medal
path = /obj/item/clothing/accessory/medal/conduct
display_name = "Lauren's Medal"
@@ -753,11 +760,17 @@
ckeywhitelist = list("pastelprincedan")
character_name = list("Kiyoshi Maki", "Masumi Maki")
/datum/gear/fluff/masumi_overalls
path = /obj/item/clothing/under/fluff/masumi_overalls
display_name = "white and blue overalls"
ckeywhitelist = list("pastelprincedan")
character_name = list("Masumi Maki")
/datum/gear/fluff/mechanic_overalls
path = /obj/item/clothing/under/fluff/mechanic_overalls
display_name = "mechanic overalls"
ckeywhitelist = list("pastelprincedan", "hatterhat")
character_name = list("Masumi Maki", "Harold Robinson")
/datum/gear/fluff/mechanic_coat
path = /obj/item/clothing/suit/storage/hooded/wintercoat/fluff/mechanic
display_name = "mechanic winter coat"
ckeywhitelist = list("pastelprincedan", "hatterhat")
character_name = list("Masumi Maki", "Harold Robinson")
// Q CKEYS
@@ -46,13 +46,13 @@
/datum/gear/mask/gaiter
display_name = "neck gaiter selection"
path = /obj/item/clothing/mask/gaiter
path = /obj/item/clothing/accessory/gaiter
cost = 1
/datum/gear/mask/gaiter/New()
..()
var/list/gaiters = list()
for(var/gaiter in typesof(/obj/item/clothing/mask/gaiter))
var/obj/item/clothing/mask/gaiter_type = gaiter
for(var/gaiter in typesof(/obj/item/clothing/accessory/gaiter))
var/obj/item/clothing/accessory/gaiter_type = gaiter
gaiters[initial(gaiter_type.name)] = gaiter_type
gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc))
+10
View File
@@ -164,6 +164,16 @@
desc = "A starry winter hood."
icon_state = "winterhood_cosmic"
/obj/item/clothing/head/hood/winter/christmasred
name = "red christmas winter hood"
desc = "A red festive winter hood."
icon_state = "winterhood_christmasr"
/obj/item/clothing/head/hood/winter/christmasgreen
name = "green christmas winter hood"
desc = "A green festive winter hood."
icon_state = "winterhood_christmasg"
// Explorer gear
/obj/item/clothing/head/hood/explorer
name = "explorer hood"
@@ -362,33 +362,6 @@
src.icon_state = "flushed"
return
//Gaiter scarves
/obj/item/clothing/mask/gaiter
name = "red neck gaiter"
desc = "A slightly worn neck gaiter, it's loose enough to be worn comfortably like a scarf. Commonly used by outdoorsmen and mercenaries, both to keep warm and keep debris away from the face."
icon_state = "gaiter_red"
/obj/item/clothing/mask/gaiter/attack_self(mob/user as mob)
if(src.icon_state == initial(icon_state))
src.icon_state = "[icon_state]_up"
to_chat(user, "You pull the gaiter up over your nose.")
else
src.icon_state = initial(icon_state)
to_chat(user, "You tug the gaiter down around your neck.")
update_clothing_icon() //so our mob-overlays update
/obj/item/clothing/mask/gaiter/tan
name = "tan neck gaiter"
icon_state = "gaiter_tan"
/obj/item/clothing/mask/gaiter/gray
name = "gray neck gaiter"
icon_state = "gaiter_gray"
/obj/item/clothing/mask/gaiter/green
name = "green neck gaiter"
icon_state = "gaiter_green"
/obj/item/clothing/mask/mouthwheat
name = "mouth wheat"
desc = "100% synthetic \"Country Girls LLC.\" brand mouth wheat. Warning: not for actual consumption."
+3
View File
@@ -63,6 +63,9 @@
/////////////////////////////////////////
//Seals and Signet Rings
/obj/item/clothing/gloves/ring/seal
var/stamptext = null
/obj/item/clothing/gloves/ring/seal/secgen
name = "Secretary-General's official seal"
desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring."
+10
View File
@@ -174,6 +174,16 @@
icon_state = "explorer"
armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0)
/obj/item/clothing/shoes/boots/winter/christmasred
name = "red christmas boots"
desc = "A pair of fluffy red christmas boots!"
icon_state = "winterboots_christmasr"
/obj/item/clothing/shoes/boots/winter/christmasgreen
name = "green christmas boots"
desc = "A pair of fluffy green christmas boots!"
icon_state = "winterboots_christmasg"
// Allows the wearer to climb cliffs, which could allow for shortcuts or sequence-breaking.
/obj/item/clothing/shoes/boots/winter/climbing
name = "climbing winter boots"
+12
View File
@@ -344,6 +344,18 @@
light_power = 1.8
light_range = 1.2
light_on = TRUE
/obj/item/clothing/suit/storage/hooded/wintercoat/christmasred
name = "red christmas winter coat"
desc = "A festive red Christmas coat! Smells like Candy Cane!"
icon_state = "coatchristmasr"
hoodtype = /obj/item/clothing/head/hood/winter/christmasred
/obj/item/clothing/suit/storage/hooded/wintercoat/christmasgreen
name = "green christmas winter coat"
desc = "A festive green Christmas coat! Smells like Candy Cane!"
icon_state = "coatchristmasg"
hoodtype = /obj/item/clothing/head/hood/winter/christmasgreen
// winter coats end here
@@ -455,4 +455,73 @@
name = "sash"
desc = "A plain, unadorned sash."
icon_state = "sash"
slot = ACCESSORY_SLOT_OVER
slot = ACCESSORY_SLOT_OVER
//Gaiter scarves
/obj/item/clothing/accessory/gaiter
name = "red neck gaiter"
desc = "A slightly worn neck gaiter, it's loose enough to be worn comfortably like a scarf. Commonly used by outdoorsmen and mercenaries, both to keep warm and keep debris away from the face."
icon_state = "gaiter_red"
slot_flags = SLOT_MASK | SLOT_TIE
body_parts_covered = FACE
w_class = ITEMSIZE_SMALL
slot = ACCESSORY_SLOT_INSIGNIA // snowflakey, i know, shut up
item_flags = FLEXIBLEMATERIAL
var/breath_masked = FALSE
var/obj/item/clothing/mask/breath/breathmask
action_button_name = "Pull On Gaiter"
/obj/item/clothing/accessory/gaiter/update_clothing_icon()
. = ..()
if(ismob(src.loc))
var/mob/M = src.loc
M.update_inv_wear_mask()
/obj/item/clothing/accessory/gaiter/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/clothing/mask/breath))
to_chat(user, SPAN_NOTICE("You tuck [I] behind [src]."))
breathmask = I
breath_masked = TRUE
user.drop_from_inventory(I, drop_location())
I.forceMove(src)
item_flags &= ~FLEXIBLEMATERIAL
. = ..()
/obj/item/clothing/accessory/gaiter/AltClick(mob/user)
. = ..()
if(breath_masked && breathmask)
to_chat(user, SPAN_NOTICE("You pull [breathmask] out from behind [src], and it drops to your feet."))
breathmask.forceMove(drop_location())
breathmask = null
breath_masked = FALSE
item_flags &= ~AIRTIGHT
item_flags |= FLEXIBLEMATERIAL
/obj/item/clothing/accessory/gaiter/attack_self(mob/user)
var/gaiterstring = "You pull [src] "
if(src.icon_state == initial(icon_state))
src.icon_state = "[icon_state]_up"
gaiterstring += "up over your nose[breath_masked ? " and secure the mask tucked underneath." : "."]"
if(breath_masked)
item_flags |= AIRTIGHT
else
src.icon_state = initial(icon_state)
gaiterstring += "down around your neck[breath_masked ? " and dislodge the mask tucked underneath." : "."]"
body_parts_covered &= ~FACE
if(breath_masked)
item_flags &= ~AIRTIGHT
to_chat(user, SPAN_NOTICE(gaiterstring))
qdel(mob_overlay) // we're gonna need to refresh these
update_clothing_icon() //so our mob-overlays update
/obj/item/clothing/accessory/gaiter/tan
name = "tan neck gaiter"
icon_state = "gaiter_tan"
/obj/item/clothing/accessory/gaiter/gray
name = "gray neck gaiter"
icon_state = "gaiter_gray"
/obj/item/clothing/accessory/gaiter/green
name = "green neck gaiter"
icon_state = "gaiter_green"
+22 -1
View File
@@ -1420,4 +1420,25 @@
icon_state = "hedberg_tech"
worn_state = "hedberg_tech"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) // Equivalent to engineer's jumpsuit.
rolled_sleeves = 0
rolled_sleeves = 0
//christmas stuff
/obj/item/clothing/under/christmas/red
name = "red christmas suit"
desc = "A simple red christmas suit that looks close to Santa's!"
icon_state = "christmasred"
/obj/item/clothing/under/christmas/green
name = "green christmas suit"
desc = "A simple green christmas suit. Smells minty!"
icon_state = "christmasgreen"
/obj/item/clothing/under/christmas/croptop/red
name = "red crop-top christmas suit"
desc = "A simple red christmas suit that doesn't quite looks like Mrs Claus'."
icon_state = "christmascroppedred"
/obj/item/clothing/under/christmas/croptop/green
name = "green crop-top christmas suit"
desc = "A simple green christmas suit that doesn't quite looks like Mrs Claus'. Smells minty!"
icon_state = "christmascroppedgreen"
+2 -2
View File
@@ -57,7 +57,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/grenadine = 5,
/obj/item/weapon/reagent_containers/food/condiment/cornoil = 5,
/obj/item/weapon/reagent_containers/food/condiment/cookingoil = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/peppermintschnapps = 5,
@@ -587,7 +587,7 @@
icon_state = "dinnerware"
products = list(
/obj/item/weapon/reagent_containers/food/condiment/yeast = 5,
/obj/item/weapon/reagent_containers/food/condiment/cornoil = 5,
/obj/item/weapon/reagent_containers/food/condiment/cookingoil = 5,
/obj/item/weapon/tray = 8,
/obj/item/weapon/material/kitchen/utensil/fork = 6,
/obj/item/weapon/material/knife/plastic = 6,
+16 -8
View File
@@ -89,15 +89,23 @@ var/global/list/emotes_by_key
var/atom/target
if(can_target() && extra_params)
extra_params = lowertext(extra_params)
for(var/atom/thing in view(user))
if(extra_params == lowertext(thing.name))
target = thing
break
var/target_dist
extra_params = trim(lowertext(extra_params))
for(var/atom/thing in view((isnull(check_range) ? world.view : check_range), user))
if(target && target != user && check_range)
if (get_dist(user, target) > check_range)
to_chat(user, SPAN_WARNING("\The [target] is too far away."))
if(!isturf(thing.loc))
continue
var/new_target_dist = get_dist(thing, user)
if(!isnull(target_dist) && target_dist > new_target_dist)
continue
if(findtext(lowertext(thing.name), extra_params))
target_dist = new_target_dist
target = thing
if(!target)
to_chat(user, SPAN_WARNING("You cannot see a '[extra_params]' within range."))
return
var/use_1p = get_emote_message_1p(user, target, extra_params)
+10 -3
View File
@@ -101,9 +101,9 @@
desc = "Often used to flavor food or make people sneeze."
icon_state = "peppermillsmall"
center_of_mass = list("x"=17, "y"=11)
if("cornoil")
name = "Corn Oil"
desc = "A delicious oil used in cooking. Made from corn."
if("cookingoil")
name = "Cooking Oil"
desc = "A delicious oil used in cooking. General purpose."
icon_state = "oliveoil"
center_of_mass = list("x"=16, "y"=6)
if("sugar")
@@ -175,6 +175,13 @@
. = ..()
reagents.add_reagent("capsaicin", 50)
/obj/item/weapon/reagent_containers/food/condiment/cookingoil
name = "Cooking Oil"
/obj/item/weapon/reagent_containers/food/condiment/cookingoil/Initialize()
. = ..()
reagents.add_reagent("cookingoil", 50)
/obj/item/weapon/reagent_containers/food/condiment/cornoil
name = "Corn Oil"
+1 -1
View File
@@ -3263,7 +3263,7 @@
. = ..()
reagents.add_reagent("blackpepper", 1)
reagents.add_reagent("sodiumchloride", 1)
reagents.add_reagent("cornoil", 1)
reagents.add_reagent("cookingoil", 1)
/obj/item/weapon/reagent_containers/food/snacks/turkeyslice
name = "turkey drumstick"
@@ -13,13 +13,13 @@
appliancetype = FRYER
active_power_usage = 12 KILOWATTS
heating_power = 12 KILOWATTS
light_y = 15
min_temp = 140 + T0C // Same as above, increasing this to just under 2x to make the % increase on efficiency not quite so painful as it would be at 80.
optimal_temp = 400 + T0C // Increasing this to be 2x Oven to allow for a much higher/realistic frying temperatures. Doesn't really do anything but make heating the fryer take a bit longer.
optimal_power = 0.95 // .35 higher than the default to give fryers faster cooking speed.
idle_power_usage = 3.6 KILOWATTS
// Power used to maintain temperature once it's heated.
// Going with 25% of the active power. This is a somewhat arbitrary value.
@@ -33,11 +33,11 @@
var/datum/reagents/oil
var/optimal_oil = 9000 //90 litres of cooking oil
/obj/machinery/appliance/cooker/fryer/Initialize()
. = ..()
fry_loop = new(list(src), FALSE)
oil = new/datum/reagents(optimal_oil * 1.25, src)
var/variance = rand()*0.15
// Fryer is always a little below full, but its usually negligible
@@ -45,18 +45,18 @@
if(prob(20))
// Sometimes the fryer will start with much less than full oil, significantly impacting efficiency until filled
variance = rand()*0.5
oil.add_reagent("cornoil", optimal_oil*(1 - variance))
oil.add_reagent("cookingoil", optimal_oil*(1 - variance))
/obj/machinery/appliance/cooker/fryer/Destroy()
QDEL_NULL(fry_loop)
QDEL_NULL(oil)
return ..()
/obj/machinery/appliance/cooker/fryer/examine(var/mob/user)
. = ..()
if(Adjacent(user))
to_chat(user, "Oil Level: [oil.total_volume]/[optimal_oil]")
/obj/machinery/appliance/cooker/fryer/update_icon() // We add our own version of the proc to use the special fryer double-lights.
cut_overlays()
var/image/light
@@ -69,7 +69,7 @@
light.pixel_x = light_x
light.pixel_y = light_y
add_overlay(light)
/obj/machinery/appliance/cooker/fryer/heat_up()
if (..())
//Set temperature of oil reagent
@@ -102,7 +102,7 @@
cooking_power *= oil_efficiency
/obj/machinery/appliance/cooker/fryer/update_icon()
if(!stat)
..()
@@ -119,7 +119,7 @@
if(fry_loop)
fry_loop.stop(src)
..()
//Fryer gradually infuses any cooked food with oil. Moar calories
//This causes a slow drop in oil levels, encouraging refill after extended use
/obj/machinery/appliance/cooker/fryer/do_cooking_tick(var/datum/cooking_item/CI)
@@ -177,13 +177,13 @@
return
// user.visible_message("<span class='danger'>\The [user] starts pushing \the [victim] into \the [src]!</span>")
//Removed delay on this action in favour of a cooldown after it
//If you can lure someone close to the fryer and grab them then you deserve success.
//And a delay on this kind of niche action just ensures it never happens
//Cooldown ensures it can't be spammed to instakill someone
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN*3)
fry_loop.start(src)
if(!do_mob(user, victim, 20))
@@ -239,9 +239,9 @@
//Coat the victim in some oil
oil.trans_to(victim, 40)
fry_loop.stop()
/obj/machinery/appliance/cooker/fryer/attackby(var/obj/item/I, var/mob/user)
if(istype(I, /obj/item/weapon/reagent_containers/glass) && I.reagents)
if (I.reagents.total_volume <= 0 && oil)
@@ -112,6 +112,7 @@
user.remove_from_mob(O)
stock(O)
user.visible_message("<span class='notice'>[user] has added \the [O] to \the [src].</span>", "<span class='notice'>You add \the [O] to \the [src].</span>")
sortTim(item_records, /proc/cmp_stored_item_name)
else if(istype(O, /obj/item/weapon/storage/bag))
var/obj/item/weapon/storage/bag/P = O
+18 -1
View File
@@ -522,13 +522,20 @@ I said no!
)
result = /obj/item/weapon/reagent_containers/food/snacks/cutlet
/datum/recipe/roastedsunflowerseeds
/datum/recipe/roastedcornsunflowerseeds
reagents = list("sodiumchloride" = 1, "cornoil" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/rawsunflower
)
result = /obj/item/weapon/reagent_containers/food/snacks/roastedsunflower
/datum/recipe/roastedsunflowerseeds
reagents = list("sodiumchloride" = 1, "cookingoil" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/rawsunflower
)
result = /obj/item/weapon/reagent_containers/food/snacks/roastedsunflower
/datum/recipe/roastedpeanutsunflowerseeds
reagents = list("sodiumchloride" = 1, "peanutoil" = 1)
items = list(
@@ -537,10 +544,20 @@ I said no!
result = /obj/item/weapon/reagent_containers/food/snacks/roastedsunflower
/datum/recipe/roastedpeanuts
fruit = list("peanut" = 2)
reagents = list("sodiumchloride" = 2, "cookingoil" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/roastedpeanuts
/datum/recipe/roastedpeanutscorn
fruit = list("peanut" = 2)
reagents = list("sodiumchloride" = 2, "cornoil" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/roastedpeanuts
/datum/recipe/roastedpeanutspeanut
fruit = list("peanut" = 2)
reagents = list("sodiumchloride" = 2, "peanutoil" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/roastedpeanuts
/datum/recipe/mint
reagents = list("sugar" = 5, "frostoil" = 5)
result = /obj/item/weapon/reagent_containers/food/snacks/mint
@@ -211,6 +211,7 @@
var/greater_form // Greater form, if any, ie. human for monkeys.
var/holder_type
var/gluttonous // Can eat some mobs. 1 for mice, 2 for monkeys, 3 for people.
var/soft_landing = FALSE // Can fall down and land safely on small falls.
var/rarity_value = 1 // Relative rarity/collector value for this species.
var/economic_modifier = 2 // How much money this species makes
@@ -546,6 +547,20 @@
H.adjustToxLoss(amount)
/datum/species/proc/handle_falling(mob/living/carbon/human/H, atom/hit_atom, damage_min, damage_max, silent, planetary)
if(soft_landing)
if(planetary || !istype(H))
return FALSE
var/turf/landing = get_turf(hit_atom)
if(!istype(landing))
return FALSE
if(!silent)
to_chat(H, SPAN_NOTICE("You manage to lower impact of the fall and land safely."))
landing.visible_message("<b>\The [H]</b> lowers down from above, landing safely.")
playsound(H, "rustle", 25, 1)
return TRUE
return FALSE
/datum/species/proc/post_spawn_special(mob/living/carbon/human/H)
@@ -131,6 +131,7 @@
//brute_mod = 1.15
//burn_mod = 1.15
//gluttonous = 1
soft_landing = TRUE
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_BIRDSONG)
name_language = LANGUAGE_BIRDSONG
@@ -402,6 +403,8 @@
min_age = 18
max_age = 80
soft_landing = TRUE
base_color = "#EECEB3"
male_scream_sound = null //CHOMPedit
@@ -146,7 +146,7 @@
/datum/mob_descriptor/build = -3
)
var/static/list/flight_bodyparts = list(
/* var/static/list/flight_bodyparts = list(
BP_L_ARM,
BP_R_ARM,
BP_L_HAND,
@@ -155,7 +155,7 @@
var/static/list/flight_suit_blacklisted_types = list(
/obj/item/clothing/suit/space,
/obj/item/clothing/suit/straight_jacket
)
)*/
default_emotes = list(
/decl/emote/audible/teshsqueak,
@@ -217,4 +217,4 @@
H.Stun(1)
playsound(H, "rustle", 25, 1)
return TRUE
*/ //CHOMPedit end
*/ //CHOMPedit end. CHOMPEdit IIC: looks like upstream disabled it too because they made it a trait instead.
@@ -161,6 +161,12 @@
H.verbs |= /mob/living/proc/flying_toggle
H.verbs |= /mob/living/proc/start_wings_hovering
/datum/trait/positive/soft_landing
name = "Soft Landing"
desc = "You can fall from certain heights without suffering any injuries, be it via wings, lightness of frame or general dexterity."
cost = 1
var_changes = list("soft_landing" = TRUE)
/datum/trait/positive/hardfeet
name = "Hard Feet"
desc = "Makes your nice clawed, scaled, hooved, armored, or otherwise just awfully calloused feet immune to glass shards."
@@ -1249,9 +1249,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
riding_datum = new /datum/riding/taur(src)
verbs |= /mob/living/carbon/human/proc/taur_mount
verbs |= /mob/living/proc/toggle_rider_reins
return working
else
return working
else if(islongtail(tail_style))
working.pixel_x = -16
return working
return null
// TODO - Move this to where it should go ~Leshana
+30 -1
View File
@@ -15,6 +15,7 @@
handle_special()
handle_guts()
do_healing() //VOREStation Add
return TRUE
@@ -54,7 +55,7 @@
healths.icon_state = "health7"
//Updates the nutrition while we're here
var/food_per = (nutrition / 500) * 100 //VOREStation Edit: Bandaid hardcode number to avoid misleading percentage based hunger alerts with our 6k cap.
var/food_per = (nutrition / max_nutrition) * 100
switch(food_per)
if(90 to INFINITY)
clear_alert("nutrition")
@@ -63,6 +64,34 @@
if(-INFINITY to 50)
throw_alert("nutrition", /obj/screen/alert/starving)
//VOREStation ADD START - I made this for catslugs but tbh it's probably cool to give to everything.
//Gives all simplemobs passive healing as long as they can find food.
//Slow enough that it should affect combat basically not at all
/mob/living/simple_mob/proc/do_healing()
if(nutrition < 150)
return
if(health == maxHealth)
return
if(heal_countdown > 0)
heal_countdown --
return
if(resting)
if(bruteloss > 0)
adjustBruteLoss(-10)
else if(fireloss > 0)
adjustFireLoss(-10)
nutrition -= 50
heal_countdown = 5
return
if(bruteloss > 0)
adjustBruteLoss(-1)
else if(fireloss > 0)
adjustFireLoss(-1)
nutrition -= 5
heal_countdown = 5
//VOREStation ADD END
// Override for special bullshit.
/mob/living/simple_mob/proc/handle_special()
return
@@ -165,6 +165,7 @@
// Used for if the mob can drop limbs. Overrides the icon cache key, so it doesn't keep remaking the icon needlessly.
var/limb_icon_key
var/understands_common = TRUE //VOREStation Edit - Makes it so that simplemobs can understand galcomm without being able to speak it.
var/heal_countdown = 5 //VOREStation Edit - A cooldown ticker for passive healing
/mob/living/simple_mob/Initialize()
verbs -= /mob/verb/observe
@@ -51,7 +51,6 @@
has_langs = list("Sign Language")
var/heal_countdown = 0
var/picked_color = FALSE
can_enter_vent_with = list(
@@ -163,39 +162,55 @@
playsound(src, 'sound/items/eatfood.ogg', 75, 1)
/mob/living/simple_mob/vore/alienanimals/catslug/attack_hand(mob/living/carbon/human/M as mob)
if(stat != DEAD && M.a_intent == I_HELP && resting)
if(stat == DEAD)
return ..()
if(M.a_intent != I_HELP)
return ..()
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
if(resting)
M.visible_message("<span class='notice'>\The [M.name] shakes \the [src] awake from their nap.</span>","<span class='notice'>You shake \the [src] awake!</span>")
playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
lay_down()
ai_holder.go_wake()
return
if(M.zone_sel.selecting == BP_HEAD)
M.visible_message( \
"<span class='notice'>[M] pats \the [src] on the head.</span>", \
"<span class='notice'>You pat \the [src] on the head.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src] purrs and leans into [M]'s hand.</span>")
else if(M.zone_sel.selecting == BP_R_HAND || M.zone_sel.selecting == BP_L_HAND)
M.visible_message( \
"<span class='notice'>[M] shakes \the [src]'s hand.</span>", \
"<span class='notice'>You shake \the [src]'s hand.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src]'s looks a little confused nibbles at [M]'s hand experimentally.</span>")
else if(M.zone_sel.selecting == "mouth")
M.visible_message( \
"<span class='notice'>[M] boops \the [src]'s nose.</span>", \
"<span class='notice'>You boop \the [src] on the nose.</span>", )
if(client)
return
if(prob(10))
visible_message("<span class='notice'>\The [src]'s eyes widen as they stare at [M]. After a moment they rub their prodded snoot.</span>")
else if(M.zone_sel.selecting == BP_GROIN)
M.visible_message( \
"<span class='notice'>[M] rubs \the [src]'s tummy...</span>", \
"<span class='notice'>You rub \the [src]'s tummy... You feel the danger.</span>", )
if(client)
return
visible_message("<span class='notice'>\The [src] pushes [M]'s hand away from their tummy and furrows their brow!</span>")
if(prob(5))
ai_holder.target = M
ai_holder.track_target_position()
ai_holder.set_stance(STANCE_FIGHT)
else
return ..()
/mob/living/simple_mob/vore/alienanimals/catslug/Life()
. = ..()
if(nutrition < 150)
return
if(health == maxHealth)
return
if(heal_countdown > 0)
heal_countdown --
return
if(resting)
if(bruteloss > 0)
adjustBruteLoss(-10)
else if(fireloss > 0)
adjustFireLoss(-10)
nutrition -= 50
heal_countdown = 5
return
if(bruteloss > 0)
adjustBruteLoss(-1)
else if(fireloss > 0)
adjustFireLoss(-1)
nutrition -= 5
heal_countdown = 5
/mob/living/simple_mob/vore/alienanimals/catslug/Login() //If someone plays as us let's just be a passive mob in case accidents happen if the player D/Cs
. = ..()
ai_holder.hostile = FALSE
@@ -9,7 +9,7 @@
/mob/living/simple_mob/vore/overmap/spacewhale
name = "space whale"
desc = "It's a space whale. I don't know what more you expected."
scanner_desc = "It's a space whale! Woah!"
scanner_desc = "An absolutely massive space-born creature. A layer of radical energy around its body prevents detailed scanning, though, the energy along with its movements seem to be what propels it through space. A series of bio-luminescent lights ripple rhythmically across its surface. It is difficult to spot at range except for the wake of energy that swirls around it."
catalogue_data = list(/datum/category_item/catalogue/fauna/spacewhale)
icon = 'icons/mob/alienanimals_x32.dmi'
@@ -77,6 +77,7 @@
var/hazard_drop_chance = 35
var/held_hazard
var/restless = FALSE
var/post_restless_tired = 0
vore_active = 1
vore_capacity = 99
@@ -133,6 +134,9 @@
/mob/living/simple_mob/vore/overmap/spacewhale/Life()
. = ..()
if(post_restless_tired)
post_restless_tired--
return
if(!restless && prob(0.5))
handle_restless()
@@ -143,6 +147,8 @@
hazard_drop_chance = initial(hazard_drop_chance)
movement_cooldown = initial(movement_cooldown)
ai_holder.base_wander_delay = initial(ai_holder.base_wander_delay)
ai_holder.wander = FALSE
post_restless_tired = 250
if(child_om_marker.known == TRUE)
child_om_marker.icon_state = "space_whale"
visible_message("<span class='notice'>\The [child_om_marker.name] settles down.</span>")
@@ -198,4 +204,5 @@
skybox_pixel_x = 0
skybox_pixel_y = 0
glide_size = 0.384
parent_mob_type = /mob/living/simple_mob/vore/overmap/spacewhale
parent_mob_type = /mob/living/simple_mob/vore/overmap/spacewhale
scanner_desc = "An absolutely massive space-born creature. A layer of radical energy around its body prevents detailed scanning, though, the energy along with its movements seem to be what propels it through space. A series of bio-luminescent lights ripple rhythmically across its surface. It is difficult to spot at range except for the wake of energy that swirls around it."
@@ -118,7 +118,6 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
var/wantpet = 0
var/affection_factor = 1 //Some Teppi are more happy to be loved on than others.
var/teppi_warned = FALSE
var/heal_countdown = 5
var/teppi_mutate = FALSE //Allows Teppi to get their children's colors scrambled, and possibly other things later on!
attacktext = list("nipped", "chomped", "bonked", "stamped on")
@@ -689,22 +688,9 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
amount_grown -= rand(100,250)
if(not_hungy)
do_breeding()
do_healing()
if(prob(0.5))
teppi_sound()
/mob/living/simple_mob/vore/alienanimals/teppi/proc/do_healing()
if(health < maxHealth)
if(heal_countdown > 0)
heal_countdown -= 1
return
if(bruteloss > 0)
adjustBruteLoss(-2)
else if(fireloss > 0)
adjustFireLoss(-0.5)
nutrition -= 5
heal_countdown = 5
/mob/living/simple_mob/vore/alienanimals/teppi/proc/do_breeding()
if(!breedable || prevent_breeding)
return
@@ -1147,3 +1147,22 @@
ani_state = "tentacle_w"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
//LONG TAILS ARE NOT TAUR BUTTS >:O
/datum/sprite_accessory/tail/longtail
name = "You should not see this..."
icon = 'icons/mob/vore/taurs_vr.dmi'
do_colouration = 1 // Yes color, using tail color
color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY
/datum/sprite_accessory/tail/longtail/shadekin_tail
name = "Shadekin Tail"
icon_state = "shadekin_s"
/datum/sprite_accessory/tail/longtail/shadekin_tail/shadekin_tail_2c
name = "Shadekin Tail (dual color)"
extra_overlay = "shadekin_markings"
/datum/sprite_accessory/tail/longtail/shadekin_tail/shadekin_tail_long
name = "Shadekin Long Tail"
icon_state = "shadekin_long_s"
@@ -326,20 +326,3 @@
icon_state = "mermaid_s"
can_ride = 0
icon_sprite_tag = "mermaid"
/datum/sprite_accessory/tail/taur/shadekin_tail
name = "Shadekin Tail"
icon_state = "shadekin_s"
can_ride = 0
hide_body_parts = null
clip_mask_icon = null
clip_mask_state = null
//species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_2c
name = "Shadekin Tail (dual color)"
extra_overlay = "shadekin_markings"
/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_long
name = "Shadekin Long Tail"
icon_state = "shadekin_long_s"
@@ -480,24 +480,6 @@
msg_prey_stepunder = "You jump over %prey's thick tail."
msg_owner_stepunder = "%owner bounds over your tail."
/datum/sprite_accessory/tail/taur/shadekin_tail
name = "Shadekin Tail"
icon_state = "shadekin_s"
can_ride = 0
hide_body_parts = null
clip_mask_icon = null
clip_mask_state = null
//apply_restrictions = TRUE
//species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_2c
name = "Shadekin Tail (dual color)"
extra_overlay = "shadekin_markings"
/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_long
name = "Shadekin Long Tail"
icon_state = "shadekin_long_s"
/datum/sprite_accessory/tail/taur/pawcow // this grabs suit sprites from the normal cow, the outline is the same
name = "Cow w/ paws (Taur)"
icon_state = "pawcow_s"
+5
View File
@@ -36,6 +36,11 @@
if(pred.softfall || (istype(pred, /mob/living/simple_mob) && pred.mob_size <= MOB_SMALL)) // TODO: add ability for mob below to be 'soft' and cushion fall
safe_fall = TRUE
if(istype(pred, /mob/living/carbon/human))
var/mob/living/carbon/human/H = pred
if(H.species.soft_landing)
safe_fall = TRUE
var/mob/living/prey = src
var/fallloc = prey.loc
if(pred.can_be_drop_pred && prey.can_be_drop_prey)
-6
View File
@@ -206,9 +206,6 @@
if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs.
return
if(L.has_buckled_mobs())
return
if(L.buckled)
L.buckled.forceMove(get_turf(top))
@@ -460,9 +457,6 @@
if(L.grabbed_by.len) // Same as pulledby, whoever's holding you will keep you from going down stairs.
return
if(L.has_buckled_mobs())
return
if(L.buckled)
L.buckled.forceMove(get_turf(bottom))
+12 -3
View File
@@ -597,11 +597,20 @@
return
else if(istype(P, /obj/item/weapon/stamp) || istype(P, /obj/item/clothing/gloves/ring/seal))
if(istype(P, /obj/item/weapon/stamp))
var/obj/item/weapon/stamp/the_stamp = P
if(the_stamp.stamptext)
stamps += (stamps=="" ? "<HR>" : "<BR>") + "<i>[the_stamp.stamptext]</i>"
else
stamps += (stamps=="" ? "<HR>" : "<BR>") + "<i>This paper has been stamped with the [the_stamp.name].</i>"
else
var/obj/item/clothing/gloves/ring/seal/the_stamp = P
if(the_stamp.stamptext)
stamps += (stamps=="" ? "<HR>" : "<BR>") + "<i>[the_stamp.stamptext]</i>"
else
stamps += (stamps=="" ? "<HR>" : "<BR>") + "<i>This paper has been stamped with the [the_stamp.name].</i>"
if((!in_range(src, usr) && loc != user && !( istype(loc, /obj/item/weapon/clipboard) ) && loc.loc != user && user.get_active_hand() != P))
return
stamps += (stamps=="" ? "<HR>" : "<BR>") + "<i>This paper has been stamped with the [P.name].</i>"
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
var/x, y
if(istype(P, /obj/item/weapon/stamp/captain) || istype(P, /obj/item/weapon/stamp/centcomm))
+1
View File
@@ -14,6 +14,7 @@
attack_verb = list("stamped")
drop_sound = 'sound/items/drop/device.ogg'
pickup_sound = 'sound/items/pickup/device.ogg'
var/stamptext = null
/obj/item/weapon/stamp/captain
name = "site manager's rubber stamp"
@@ -296,7 +296,7 @@
/obj/structure/reagent_dispensers/acid/Initialize()
. = ..()
reagents.add_reagent("sacid", 1000)
/obj/structure/reagent_dispensers/water_cooler
name = "Water-Cooler"
desc = "A machine that dispenses water to drink."
@@ -461,7 +461,7 @@
/obj/structure/reagent_dispensers/cookingoil/New()
..()
reagents.add_reagent("cornoil",5000)
reagents.add_reagent("cookingoil",5000)
/obj/structure/reagent_dispensers/cookingoil/bullet_act(var/obj/item/projectile/Proj)
if(Proj.get_structure_damage())
@@ -141,7 +141,7 @@
name = "Space Beer"
id = "spacebeer"
result = "beer"
required_reagents = list("cornoil" = 10)
required_reagents = list("cornoil" = 5, "flour" = 5)
catalysts = list("enzyme" = 5)
result_amount = 10
@@ -203,6 +203,7 @@
name = "Classic Martini"
id = "martini"
result = "martini"
inhibitors = list("bitters" = 1)
required_reagents = list("gin" = 2, "vermouth" = 1)
result_amount = 3
@@ -907,7 +908,7 @@
name = "Debugger"
id = "debugger"
result = "debugger"
required_reagents = list("fuel" = 1, "sugar" = 2, "cornoil" = 2)
required_reagents = list("fuel" = 1, "sugar" = 2, "cookingoil" = 2)
result_amount = 5
/decl/chemical_reaction/instant/drinks/spacersbrew
@@ -1205,14 +1206,14 @@
name = "Oil Slick"
id = "oilslick"
result = "oilslick"
required_reagents = list("cornoil" = 2, "honey" = 1)
required_reagents = list("cookingoil" = 2, "honey" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/slimeslam
name = "Slick Slime Slammer"
id = "slimeslammer"
result = "slimeslammer"
required_reagents = list("cornoil" = 2, "peanutbutter" = 1)
required_reagents = list("cookingoil" = 2, "peanutbutter" = 1)
result_amount = 3
/decl/chemical_reaction/instant/drinks/virginsexonthebeach
@@ -1254,7 +1255,7 @@
name = "Soda Oil"
id = "sodaoil"
result = "sodaoil"
required_reagents = list("cornoil" = 4, "sodawater" = 1, "carbon" = 1, "tricordrazine" = 1)
required_reagents = list("cookingoil" = 4, "sodawater" = 1, "carbon" = 1, "tricordrazine" = 1)
result_amount = 6
/decl/chemical_reaction/instant/drinks/fusionnaire
@@ -54,6 +54,22 @@
new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location)
return
/decl/chemical_reaction/instant/food/cookingoilcorn
name = "Cooking Oil"
id = "cookingoilcorn"
result = "cookingoil"
required_reagents = list("cornoil" = 10)
catalysts = list("enzyme" = 5)
result_amount = 10
/decl/chemical_reaction/instant/food/cookingoilpeanut
name = "Cooking Oil"
id = "cookingoilpeanut"
result = "cookingoil"
required_reagents = list("peanutoil" = 10)
catalysts = list("enzyme" = 5)
result_amount = 10
/decl/chemical_reaction/instant/food/soysauce
name = "Soy Sauce"
id = "soysauce"
@@ -87,7 +103,7 @@
name = "mayonnaise"
id = "mayo"
result = "mayo"
required_reagents = list("egg" = 9, "cornoil" = 5, "lemonjuice" = 5, "sodiumchloride" = 1)
required_reagents = list("egg" = 9, "cookingoil" = 5, "lemonjuice" = 5, "sodiumchloride" = 1)
result_amount = 15
/decl/chemical_reaction/instant/food/cheesewheel
@@ -234,6 +234,12 @@
to_chat(M, "<span class='danger'>Searing hot oil burns you, wash it off quick!</span>")
lastburnmessage = world.time
/datum/reagent/nutriment/triglyceride/oil/cooking
name = "Cooking Oil"
id = "cookingoil"
description = "A general-purpose cooking oil."
reagent_state = LIQUID
/datum/reagent/nutriment/triglyceride/oil/corn
name = "Corn Oil"
id = "cornoil"
+28 -1
View File
@@ -28,12 +28,14 @@
var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles
var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles.
var/transferchance = 0 // % Chance of prey being
var/transferchance = 0 // % Chance of prey being trasnsfered, goes from 0-100%
var/transferchance_secondary = 0 // % Chance of prey being transfered to transferchance_secondary, also goes 0-100%
var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone.
var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine.
var/display_absorbed_examine = FALSE // Do we display absorption examine messages for this belly at all?
var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to.
var/transferlocation // Location that the prey is released if they struggle and get dropped off.
var/transferlocation_secondary // Secondary location that prey is released to.
var/release_sound = "Splatter" // Sound for letting someone out. Replaced from True/false
var/mode_flags = 0 // Stripping, numbing, etc.
var/fancy_vore = FALSE // Using the new sounds?
@@ -156,7 +158,9 @@
"absorbchance",
"escapechance",
"transferchance",
"transferchance_secondary",
"transferlocation",
"transferlocation_secondary",
"bulge_size",
"display_absorbed_examine",
"shrink_grow_size",
@@ -825,6 +829,27 @@
transfer_contents(R, dest_belly)
return
else if(prob(transferchance_secondary) && transferlocation_secondary) //After the first potential mess getting into, run the secondary one which might be even bigger of a mess.
var/obj/belly/dest_belly
for(var/obj/belly/B as anything in owner.vore_organs)
if(B.name == transferlocation_secondary)
dest_belly = B
break
if(!dest_belly)
to_chat(owner, "<span class='warning'>Something went wrong with your belly transfer settings. Your <b>[lowertext(name)]</b> has had it's transfer chance and transfer location cleared as a precaution.</span>")
transferchance_secondary = 0
transferlocation_secondary = null
return
to_chat(R, "<span class='warning'>Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation_secondary]!</span>")
to_chat(owner, "<span class='warning'>Someone slid into your [transferlocation_secondary] due to their struggling inside your [lowertext(name)]!</span>")
if(C)
transfer_contents(C, dest_belly)
return
transfer_contents(R, dest_belly)
return
else if(prob(absorbchance) && digest_mode != DM_ABSORB) //After that, let's have it run the absorb chance.
to_chat(R, "<span class='warning'>In response to your struggling, \the [lowertext(name)] begins to cling more tightly...</span>")
to_chat(owner, "<span class='warning'>You feel your [lowertext(name)] start to cling onto its contents...</span>")
@@ -917,7 +942,9 @@
dupe.absorbchance = absorbchance
dupe.escapechance = escapechance
dupe.transferchance = transferchance
dupe.transferchance_secondary = transferchance_secondary
dupe.transferlocation = transferlocation
dupe.transferlocation_secondary = transferlocation_secondary
dupe.bulge_size = bulge_size
dupe.shrink_grow_size = shrink_grow_size
dupe.mode_flags = mode_flags
+21
View File
@@ -211,6 +211,8 @@
selected_list["interacts"]["escapetime"] = selected.escapetime
selected_list["interacts"]["transferchance"] = selected.transferchance
selected_list["interacts"]["transferlocation"] = selected.transferlocation
selected_list["interacts"]["transferchance_secondary"] = selected.transferchance_secondary
selected_list["interacts"]["transferlocation_secondary"] = selected.transferlocation_secondary
selected_list["interacts"]["absorbchance"] = selected.absorbchance
selected_list["interacts"]["digestchance"] = selected.digestchance
@@ -1066,6 +1068,21 @@
else
host.vore_selected.transferlocation = choice.name
. = TRUE
if("b_transferchance_secondary")
var/transfer_secondary_chance_input = input(user, "Set secondary belly transfer chance on resist (as %). You must also set the location for this to have any effect.", "Prey Escape Time") as num|null
if(!isnull(transfer_secondary_chance_input))
host.vore_selected.transferchance_secondary = sanitize_integer(transfer_secondary_chance_input, 0, 100, initial(host.vore_selected.transferchance_secondary))
. = TRUE
if("b_transferlocation_secondary")
var/obj/belly/choice_secondary = tgui_input_list(usr, "Where do you want your [lowertext(host.vore_selected.name)] to alternately lead if prey resists?","Select Belly", (host.vore_organs + "None - Remove" - host.vore_selected))
if(!choice_secondary) //They cancelled, no changes
return FALSE
else if(choice_secondary == "None - Remove")
host.vore_selected.transferlocation_secondary = null
else
host.vore_selected.transferlocation_secondary = choice_secondary.name
. = TRUE
if("b_absorbchance")
var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null
if(!isnull(absorb_chance_input))
@@ -1134,6 +1151,10 @@
dest_for = B.name
failure_msg += "This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it. "
break
if(B.transferlocation_secondary == host.vore_selected)
dest_for = B.name
failure_msg += "This is the destiantion for at least '[dest_for]' secondary belly transfers. Remove it as the destination from any bellies before deleting it. "
break
if(host.vore_selected.contents.len)
failure_msg += "You cannot delete bellies with contents! " //These end with spaces, to be nice looking. Make sure you do the same.
@@ -2297,15 +2297,72 @@ Departamental Swimsuits, for general use
colorswap(usr)
//PastelPrinceDan: Masumi Maki
/obj/item/clothing/under/fluff/masumi_overalls
name = "white and blue overalls"
//PastelPrinceDan: Masumi Maki & Hatterhat: Harold Robinson
/obj/item/clothing/under/fluff/mechanic_overalls
name = "mechanic overalls"
desc = "A set of white and blue overalls, paired with a yellow shirt."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "masumioveralls"
item_state = "masumioveralls"
icon_state = "mechaoveralls"
item_state = "mechaoveralls"
icon_override = 'icons/vore/custom_onmob_vr.dmi'
//PastelPrinceDan: Masumi Maki & Hatterhat: Harold Robinson
/obj/item/clothing/suit/storage/hooded/wintercoat/fluff/mechanic
name = "mechanic winter coat"
desc = "A blue and yellow winter coat, worn only by overachievers."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "mechacoat"
icon_override = 'icons/vore/custom_onmob_vr.dmi'
item_state = "mechacoat_mob"
hoodtype = /obj/item/clothing/head/hood/winter/fluff/mechanic
/obj/item/clothing/head/hood/winter/fluff/mechanic
name = "mechanic winter hood"
desc = "A blue and yellow winter coat's hood."
icon = 'icons/vore/custom_clothes_vr.dmi'
icon_state = "mechahood"
icon_override = 'icons/vore/custom_onmob_vr.dmi'
item_state = "mechahood_mob"
/obj/item/clothing/suit/storage/hooded/wintercoat/fluff/mechanic/ui_action_click()
ToggleHood_mechacoat()
/obj/item/clothing/suit/storage/hooded/wintercoat/fluff/mechanic/equipped(mob/user, slot)
if(slot != slot_wear_suit)
RemoveHood_mechacoat()
..()
/obj/item/clothing/suit/storage/hooded/wintercoat/fluff/mechanic/proc/RemoveHood_mechacoat()
icon_state = "mechacoat"
item_state = "mechacoat_mob"
hood_up = 0
if(ishuman(hood.loc))
var/mob/living/carbon/H = hood.loc
H.unEquip(hood, 1)
H.update_inv_wear_suit()
hood.loc = src
/obj/item/clothing/suit/storage/hooded/wintercoat/fluff/mechanic/proc/ToggleHood_mechacoat()
if(!hood_up)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
if(H.wear_suit != src)
to_chat(H, "<span class='warning'>You must be wearing [src] to put up the hood!</span>")
return
if(H.head)
to_chat(H, "<span class='warning'>You're already wearing something on your head!</span>")
return
else
H.equip_to_slot_if_possible(hood,slot_head,0,0,1)
hood_up = 1
icon_state = "mechacoat_t"
item_state = "mechacoat_mob_t"
H.update_inv_wear_suit()
else
RemoveHood_mechacoat()
//Pandora029 : Evelyn Tareen
/obj/item/clothing/suit/storage/hooded/wintercoat/security/fluff/evelyn
name = "warden's navy winter coat"
@@ -1409,3 +1409,11 @@ End CHOMP Removal*/
pickup_sound = null
origin_tech = null
matter = null
//Coolcrow420 - Jade Davis
/obj/item/weapon/stamp/fluff/jade_horror
name = "Council of Mid Horror rubber stamp"
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "stamp-midhorror"
stamptext = "This paper has been certified by The Council of Mid Horror"