Merge branch 'master' into upstream-merge-32757

This commit is contained in:
LetterJay
2017-11-15 13:01:55 -06:00
committed by GitHub
80 changed files with 911 additions and 720 deletions

View File

@@ -772,6 +772,11 @@
winheight = min(winheight, 690)
usr << browse(dat, "window=players;size=375x[winheight]")
/datum/admins/proc/create_or_modify_area()
set category = "Debug"
set name = "Create or modify area"
create_area(usr)
//
//
//ALL DONE

View File

@@ -157,7 +157,8 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug())
/client/proc/view_runtimes,
/client/proc/pump_random_event,
/client/proc/cmd_display_init_log,
/client/proc/cmd_display_overlay_log
/client/proc/cmd_display_overlay_log,
/datum/admins/proc/create_or_modify_area
)
GLOBAL_PROTECT(admin_verbs_possess)
GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release))

View File

@@ -97,9 +97,8 @@
/turf/open/proc/update_visuals()
var/list/new_overlay_types = tile_graphic()
var/list/atmos_overlay_types = src.atmos_overlay_types // Cache for free performance
<<<<<<< HEAD
=======
#if DM_VERSION >= 513
#warning 512 is stable now for sure, remove the old code
#endif
@@ -115,7 +114,6 @@
else
vars["vis_contents"] += new_overlay_types
#else
>>>>>>> 5941e80... 511 client fix and a config to make the version warning a popup (#32757)
if (atmos_overlay_types)
for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added
cut_overlay(overlay)
@@ -125,6 +123,7 @@
add_overlay(new_overlay_types - atmos_overlay_types) //don't add overlays that already exist
else
add_overlay(new_overlay_types)
#endif
UNSETEMPTY(new_overlay_types)
src.atmos_overlay_types = new_overlay_types

View File

@@ -21,7 +21,6 @@
/////////
var/datum/preferences/prefs = null
var/move_delay = 1
var/moving = null
var/area = null

View File

@@ -8,7 +8,7 @@
icon_state = "meat"
dried_type = /obj/item/reagent_containers/food/snacks/sosjerky/healthy
bitesize = 3
list_reagents = list("nutriment" = 3)
list_reagents = list("nutriment" = 3, "cooking_oil" = 2) //Meat has fats that a food processor can process into cooking oil
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/plain
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain
slices_num = 3
@@ -170,7 +170,7 @@
name = "bear meat"
desc = "A very manly slab of meat."
icon_state = "bearmeat"
list_reagents = list("nutriment" = 12, "morphine" = 5, "vitamin" = 2)
list_reagents = list("nutriment" = 12, "morphine" = 5, "vitamin" = 2, "cooking_oil" = 6)
filling_color = "#FFB6C1"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/bear
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/bear
@@ -205,7 +205,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/goliath
name = "goliath meat"
desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
list_reagents = list("nutriment" = 3, "toxin" = 5)
list_reagents = list("nutriment" = 3, "toxin" = 5, "cooking_oil" = 3)
icon_state = "goliathmeat"
tastes = list("meat" = 1)
foodtype = RAW | MEAT | TOXIC
@@ -218,7 +218,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/meatwheat
name = "meatwheat clump"
desc = "This doesn't look like meat, but your standards aren't <i>that</i> high to begin with."
list_reagents = list("nutriment" = 3, "vitamin" = 2, "blood" = 5)
list_reagents = list("nutriment" = 3, "vitamin" = 2, "blood" = 5, "cooking_oil" = 1)
filling_color = rgb(150, 0, 0)
icon_state = "meatwheat_clump"
bitesize = 4
@@ -228,7 +228,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/gorilla
name = "gorilla meat"
desc = "Much meatier than monkey meat."
list_reagents = list("nutriment" = 5, "vitamin" = 1)
list_reagents = list("nutriment" = 5, "vitamin" = 1, "cooking_oil" = 5) //Plenty of fat!
/obj/item/reagent_containers/food/snacks/meat/rawbacon
name = "raw piece of bacon"
@@ -236,7 +236,7 @@
icon_state = "bacon"
cooked_type = /obj/item/reagent_containers/food/snacks/meat/bacon
bitesize = 2
list_reagents = list("nutriment" = 1)
list_reagents = list("nutriment" = 1, "cooking_oil" = 3)
filling_color = "#B22222"
tastes = list("bacon" = 1)
foodtype = RAW | MEAT
@@ -246,7 +246,7 @@
desc = "A delicious piece of bacon."
icon_state = "baconcooked"
list_reagents = list("nutriment" = 2)
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
bonus_reagents = list("nutriment" = 1, "vitamin" = 1, "cooking_oil" = 2)
filling_color = "#854817"
tastes = list("bacon" = 1)
foodtype = MEAT

View File

@@ -185,36 +185,39 @@
icon_state = ""
bitesize = 2
/obj/item/reagent_containers/food/snacks/deepfryholder/proc/fry(obj/item/frying, datum/reagents/reagents, cook_time = 30)
if(istype(frying, /obj/item/reagent_containers/))
var/obj/item/reagent_containers/food = frying
food.reagents.trans_to(src, food.reagents.total_volume)
icon = frying.icon
overlays = frying.overlays
icon_state = frying.icon_state
desc = frying.desc
w_class = frying.w_class
reagents.trans_to(src, 2*(cook_time/15))
/obj/item/reagent_containers/food/snacks/deepfryholder/Initialize(mapload, obj/item/fried)
. = ..()
name = fried.name //We'll determine the other stuff when it's actually removed
icon = fried.icon
overlays = fried.copy_overlays()
icon_state = fried.icon_state
desc = fried.desc
if(istype(fried, /obj/item/reagent_containers/food/snacks))
fried.reagents.trans_to(src, fried.reagents.total_volume)
qdel(fried)
else
fried.forceMove(src)
/obj/item/reagent_containers/food/snacks/deepfryholder/proc/fry(cook_time = 30)
switch(cook_time)
if(0 to 15)
add_atom_colour(rgb(166,103,54), FIXED_COLOUR_PRIORITY)
name = "lightly-fried [frying.name]"
name = "lightly-fried [name]"
desc = "[desc] It's been lightly fried in a deep fryer."
if(16 to 49)
add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY)
name = "fried [frying.name]"
name = "fried [name]"
desc = "[desc] It's been fried, increasing its tastiness value by [rand(1, 75)]%."
if(50 to 59)
add_atom_colour(rgb(63,23,4), FIXED_COLOUR_PRIORITY)
name = "deep-fried [frying.name]"
name = "deep-fried [name]"
desc = "[desc] Deep-fried to perfection."
if(60 to INFINITY)
add_atom_colour(rgb(33,19,9), FIXED_COLOUR_PRIORITY)
name = "the physical manifestation of the very concept of fried foods"
desc = "A heavily fried...something. Who can tell anymore?"
desc = "A heavily-fried...something. Who can tell anymore?"
filling_color = color
foodtype |= FRIED
if(istype(frying, /obj/item/reagent_containers/food/snacks/))
qdel(frying)
else
frying.forceMove(src)
/obj/item/reagent_containers/food/snacks/butteredtoast
name = "buttered toast"

View File

@@ -1,11 +1,25 @@
/*
April 3rd, 2014 marks the day this machine changed the face of the kitchen on NTStation13
God bless America.
insert ascii eagle on american flag background here
___----------___
_-- ----__
- ---_
-___ ____---_ --_
__---_ .-_-- _ O _- -
- -_- --- -
- __---------___ -
- _---- -
- -_ _
` _- _
_ _-_ _-_ _
_- ____ -_ - --
- _-__ _ __--- ------- -
_- _- -_-- -_-- _
-_- _
_- _
-
*/
// April 3rd, 2014 marks the day this machine changed the face of the kitchen on NTStation13
// God bless America.
/obj/machinery/deepfryer
name = "deep fryer"
desc = "Deep fried <i>everything</i>."
@@ -16,8 +30,12 @@ insert ascii eagle on american flag background here
use_power = IDLE_POWER_USE
idle_power_usage = 5
container_type = OPENCONTAINER_1
var/obj/item/frying = null //What's being fried RIGHT NOW?
var/obj/item/reagent_containers/food/snacks/deepfryholder/frying //What's being fried RIGHT NOW?
var/cook_time = 0
var/oil_use = 0.05 //How much cooking oil is used per tick
var/fry_speed = 1 //How quickly we fry food
var/frying_fried //If the object has been fried; used for messages
var/frying_burnt //If the object has been burnt
var/static/list/deepfry_blacklisted_items = typecacheof(list(
/obj/item/screwdriver,
/obj/item/crowbar,
@@ -26,16 +44,27 @@ insert ascii eagle on american flag background here
/obj/item/device/multitool,
/obj/item/weldingtool,
/obj/item/reagent_containers/glass,
/obj/item/reagent_containers/syringe,
/obj/item/reagent_containers/food/condiment,
/obj/item/storage/part_replacer))
var/datum/looping_sound/deep_fryer/fry_loop
/obj/machinery/deepfryer/Initialize()
. = ..()
create_reagents(50)
reagents.add_reagent("nutriment", 25)
reagents.add_reagent("cooking_oil", 25)
component_parts = list()
component_parts += new /obj/item/circuitboard/machine/deep_fryer(null)
component_parts += new /obj/item/stock_parts/micro_laser(null)
RefreshParts()
fry_loop = new(list(src), FALSE)
/obj/machinery/deepfryer/RefreshParts()
var/oil_efficiency
for(var/obj/item/stock_parts/micro_laser/M in component_parts)
oil_efficiency += M.rating
oil_use = initial(oil_use) - (oil_efficiency * 0.0095)
fry_speed = oil_efficiency
/obj/machinery/deepfryer/examine()
..()
@@ -43,8 +72,16 @@ insert ascii eagle on american flag background here
to_chat(usr, "You can make out \a [frying] in the oil.")
/obj/machinery/deepfryer/attackby(obj/item/I, mob/user)
if(!reagents.total_volume)
to_chat(user, "There's nothing to fry with in [src]!")
if(istype(I, /obj/item/reagent_containers/pill))
if(!reagents.total_volume)
to_chat(user, "<span class='warning'>There's nothing to dissolve [I] in!</span>")
return
user.visible_message("<span class='notice'>[user] drops [I] into [src].</span>", "<span class='notice'>You dissolve [I] in [src].</span>")
I.reagents.trans_to(src, I.reagents.total_volume)
qdel(I)
return
if(!reagents.has_reagent("cooking_oil"))
to_chat(user, "<span class='warning'>[src] has no cooking oil to fry with!</span>")
return
if(istype(I, /obj/item/reagent_containers/food/snacks/deepfryholder))
to_chat(user, "<span class='userdanger'>Your cooking skills are not up to the legendary Doublefry technique.</span>")
@@ -60,20 +97,26 @@ insert ascii eagle on american flag background here
. = ..()
else if(!frying && user.transferItemToLoc(I, src))
to_chat(user, "<span class='notice'>You put [I] into [src].</span>")
frying = I
frying = new/obj/item/reagent_containers/food/snacks/deepfryholder(src, I)
icon_state = "fryer_on"
fry_loop.start()
/obj/machinery/deepfryer/process()
..()
if(!reagents.total_volume)
var/datum/reagent/consumable/cooking_oil/C = reagents.has_reagent("cooking_oil")
if(!C)
return
reagents.chem_temp = C.fry_temperature
if(frying)
cook_time++
if(cook_time == 30)
reagents.trans_to(frying, oil_use, multiplier = fry_speed * 3) //Fried foods gain more of the reagent thanks to space magic
cook_time += fry_speed
if(cook_time >= 30 && !frying_fried)
frying_fried = TRUE //frying... frying... fried
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
visible_message("[src] dings!")
else if (cook_time == 60)
visible_message("[src] emits an acrid smell!")
audible_message("<span class='notice'>[src] dings!</span>")
else if (cook_time >= 60 && !frying_burnt)
frying_burnt = TRUE
visible_message("<span class='warning'>[src] emits an acrid smell!</span>")
/obj/machinery/deepfryer/attack_ai(mob/user)
@@ -83,13 +126,14 @@ insert ascii eagle on american flag background here
if(frying)
if(frying.loc == src)
to_chat(user, "<span class='notice'>You eject [frying] from [src].</span>")
var/obj/item/reagent_containers/food/snacks/deepfryholder/S = new(drop_location())
S.fry(frying, reagents, cook_time)
frying.fry(cook_time)
icon_state = "fryer_off"
if(user.Adjacent(src))
user.put_in_hands(S)
user.put_in_hands(frying)
frying = null
cook_time = 0
frying_fried = FALSE
frying_burnt = FALSE
fry_loop.stop()
return
else if(user.pulling && user.a_intent == "grab" && iscarbon(user.pulling) && reagents.total_volume)
if(user.grab_state < GRAB_AGGRESSIVE)
@@ -98,7 +142,7 @@ insert ascii eagle on american flag background here
var/mob/living/carbon/C = user.pulling
user.visible_message("<span class = 'danger'>[user] dunks [C]'s face in [src]!</span>")
reagents.reaction(C, TOUCH)
C.adjustFireLoss(reagents.total_volume)
C.apply_damage(min(30, reagents.total_volume), BURN, "head")
reagents.remove_any((reagents.total_volume/2))
C.Knockdown(60)
user.changeNext_move(CLICK_CD_MELEE)

View File

@@ -15,6 +15,7 @@
var/broken = 0 // ={0,1,2} How broken is it???
var/max_n_of_items = 10 // whatever fat fuck made this a global var needs to look at themselves in the mirror sometime
var/efficiency = 0
var/datum/looping_sound/microwave/soundloop
//Microwaving doesn't use recipes, instead it calls the microwave_act of the objects. For food, this creates something based on the food's cooked_type
@@ -25,6 +26,7 @@
/obj/machinery/microwave/Initialize()
. = ..()
create_reagents(100)
soundloop = new(list(src), FALSE)
/obj/machinery/microwave/RefreshParts()
var/E
@@ -266,6 +268,7 @@
/obj/machinery/microwave/proc/start()
visible_message("The microwave turns on.", "<span class='italics'>You hear a microwave humming.</span>")
soundloop.start()
operating = TRUE
icon_state = "mw1"
updateUsrDialog()
@@ -276,7 +279,7 @@
updateUsrDialog()
/obj/machinery/microwave/proc/stop()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
soundloop.stop()
abort()
/obj/machinery/microwave/proc/dispose()

View File

@@ -15,7 +15,7 @@
icon_dead = "soybean-dead"
genes = list(/datum/plant_gene/trait/repeated_harvest)
mutatelist = list(/obj/item/seeds/soya/koi)
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05)
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.05, "cooking_oil" = 0.03) //Vegetable oil!
/obj/item/reagent_containers/food/snacks/grown/soybeans
seed = /obj/item/seeds/soya

View File

@@ -118,7 +118,7 @@
density = TRUE
/obj/structure/bonfire/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && mover.checkpass(PASSTABLE))
if(istype(mover) && (mover.pass_flags & PASSTABLE))
return TRUE
if(mover.throwing)
return TRUE

View File

@@ -56,8 +56,6 @@
nutrition -= HUNGER_FACTOR/10
if(m_intent == MOVE_INTENT_RUN)
nutrition -= HUNGER_FACTOR/10
if((disabilities & FAT) && m_intent == MOVE_INTENT_RUN && bodytemperature <= 360)
bodytemperature += 2
/mob/living/carbon/Moved(oldLoc, Dir)
. = ..()

View File

@@ -56,8 +56,8 @@
FP.update_icon()
update_inv_shoes()
//End bloody footprints
S.step_action()
/mob/living/carbon/human/Moved()
. = ..()
if(buckled_mobs && buckled_mobs.len && riding_datum)

View File

@@ -55,9 +55,6 @@
var/datum/species/golem/G = V
if(!initial(G.random_eligible))
random_golem_types -= G
to_chat(world, "Excluding golem type [initial(G.id)]")
else
to_chat(world, "Allowing golem type [initial(G.id)]")
var/datum/species/golem/golem_type = pick(random_golem_types)
var/mob/living/carbon/human/H = C
H.set_species(golem_type)

View File

@@ -128,10 +128,10 @@
/datum/species/jelly/slime/on_species_gain(mob/living/carbon/C, datum/species/old_species)
..()
if(ishuman(C))
slime_split = new
/*slime_split = new
slime_split.Grant(C)
swap_body = new
swap_body.Grant(C)
swap_body.Grant(C)*/
if(!bodies || !bodies.len)
bodies = list(C)
@@ -145,10 +145,10 @@
bodies = old_species.bodies
/datum/species/jelly/slime/spec_life(mob/living/carbon/human/H)
if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
/*if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
if(prob(5))
to_chat(H, "<span class='notice'>You feel very bloated!</span>")
else if(H.nutrition >= NUTRITION_LEVEL_WELL_FED)
to_chat(H, "<span class='notice'>You feel very bloated!</span>")*/
if(H.nutrition >= NUTRITION_LEVEL_WELL_FED)
H.blood_volume += 3
H.nutrition -= 2.5

View File

@@ -471,7 +471,6 @@
s_active.close(src)
if(lying && !buckled && prob(getBruteLoss()*200/maxHealth))
makeTrail(newloc, T, old_direction)
/mob/living/movement_delay(ignorewalk = 0)

View File

@@ -80,7 +80,7 @@
/mob/living/simple_animal/drone/Initialize()
. = ..()
GLOB.drones_list += src
access_card = new /obj/item/card/id(src)
var/datum/job/captain/C = new /datum/job/captain
access_card.access = C.get_access()
@@ -124,6 +124,7 @@
holder.icon_state = "hudstat"
/mob/living/simple_animal/drone/Destroy()
GLOB.drones_list -= src
qdel(access_card) //Otherwise it ends up on the floor!
return ..()

View File

@@ -395,7 +395,6 @@
pulling = null
grab_state = 0
update_pull_hud_icon()
if(isliving(ex_pulled))
var/mob/living/L = ex_pulled
L.update_canmove()// mob gets up if it was lyng down in a chokehold
@@ -676,8 +675,6 @@
/mob/proc/canface()
if(!canmove)
return 0
if(client.moving)
return 0
if(world.time < client.move_delay)
return 0
if(stat==2)

View File

@@ -1,8 +1,8 @@
/mob/CanPass(atom/movable/mover, turf/target)
if((mover.pass_flags & PASSMOB))
return TRUE
if(istype(mover, /obj/item/projectile) || mover.throwing)
return (!density || lying)
if(mover.checkpass(PASSMOB))
return TRUE
if(buckled == mover)
return TRUE
if(ismob(mover))
@@ -112,6 +112,7 @@
#define MOVEMENT_DELAY_BUFFER 0.75
#define MOVEMENT_DELAY_BUFFER_DELTA 1.25
/client/Move(n, direct)
if(world.time < move_delay)
return FALSE
@@ -129,15 +130,13 @@
if(mob.stat == DEAD)
mob.ghostize()
return FALSE
if(moving)
return FALSE
if(mob.force_moving)
return FALSE
if(isliving(mob))
var/mob/living/L = mob
if(L.incorporeal_move) //Move though walls
Process_Incorpmove(direct)
return FALSE
var/mob/living/L = mob //Already checked for isliving earlier
if(L.incorporeal_move) //Move though walls
Process_Incorpmove(direct)
return FALSE
if(mob.remote_control) //we're controlling something, our movement is relayed to it
return mob.remote_control.relaymove(mob, direct)
@@ -162,7 +161,6 @@
return FALSE
//We are now going to move
moving = 1
var/delay = mob.movement_delay()
if (old_move_delay + (delay*MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time)
move_delay = old_move_delay + delay
@@ -181,8 +179,7 @@
else
. = ..()
moving = 0
if(mob && .)
if(.) // If mob is null here, we deserve the runtime
if(mob.throwing)
mob.throwing.finalize(FALSE)
@@ -190,8 +187,6 @@
for(var/obj/O in mob.user_movement_hooks)
O.intercept_user_move(direct, mob, n, oldloc)
return .
/mob/Moved(oldLoc, dir, Forced = FALSE)
. = ..()
for(var/obj/O in contents)

View File

@@ -78,7 +78,7 @@
var/move_bias = pick(GLOB.alldirs)
for(var/i in 0 to move_amount)
var/move_dir = pick(GLOB.alldirs + move_bias) //ensures large-ball teslas don't just sit around
if(target && prob(60))
if(target && prob(10))
move_dir = get_dir(src,target)
var/turf/T = get_step(src, move_dir)
if(can_move(T))

View File

@@ -405,7 +405,7 @@
/obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it.
..()
if(isliving(AM) && (AM.density || AM == original) && !checkpass(PASSMOB))
if(isliving(AM) && (AM.density || AM == original) && !(src.pass_flags & PASSMOB))
Collide(AM)
/obj/item/projectile/Destroy()

View File

@@ -83,6 +83,50 @@
M.satiety += 30
. = ..()
/datum/reagent/consumable/cooking_oil
name = "Cooking Oil"
id = "cooking_oil"
description = "A variety of cooking oil derived from fat or plants. Used in food preparation and frying."
color = "#EADD6B" //RGB: 234, 221, 107 (based off of canola oil)
taste_mult = 0.8
taste_description = "oil"
nutriment_factor = 7 * REAGENTS_METABOLISM //Not very healthy on its own
metabolization_rate = 10 * REAGENTS_METABOLISM
var/fry_temperature = 450 //Around ~350 F (117 C) which deep fryers operate around in the real world
var/boiling //Used in mob life to determine if the oil kills, and only on touch application
/datum/reagent/consumable/cooking_oil/reaction_obj(obj/O, reac_volume)
if(holder && holder.chem_temp >= fry_temperature)
if(isitem(O))
O.loc.visible_message("<span class='warning'>[O] rapidly fries as it's splashed with hot oil! Somehow.</span>")
var/obj/item/reagent_containers/food/snacks/deepfryholder/F = new(O.drop_location())
F.fry(O, volume)
/datum/reagent/consumable/cooking_oil/reaction_mob(mob/living/M, method = TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(!istype(M))
return
if(holder && holder.chem_temp >= fry_temperature)
boiling = TRUE
if(method == VAPOR || method == TOUCH) //Directly coats the mob, and doesn't go into their bloodstream
if(boiling)
M.visible_message("<span class='warning'>The boiling oil sizzles as it covers [M]!</span>", \
"<span class='userdanger'>You're covered in boiling oil!</span>")
M.emote("scream")
playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE)
var/oil_damage = (holder.chem_temp / fry_temperature) * 0.33 //Damage taken per unit
M.adjustFireLoss(min(35, oil_damage * reac_volume)) //Damage caps at 35
else
..()
return TRUE
/datum/reagent/consumable/cooking_oil/reaction_turf(turf/open/T, reac_volume)
if(!istype(T))
return
if(reac_volume >= 5)
T.MakeSlippery(min_wet_time = 10, wet_time_to_add = reac_volume * 1.5)
T.name = "deep-fried [initial(T.name)]"
T.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY)
/datum/reagent/consumable/sugar
name = "Sugar"
id = "sugar"

View File

@@ -164,19 +164,11 @@
metabolization_rate = 1.5 * REAGENTS_METABOLISM
/datum/reagent/medicine/clonexadone/on_mob_life(mob/living/M)
switch(M.bodytemperature) // Low temperatures are required to take effect.
if(0 to 100) // At extreme temperatures (upgraded cryo) the effect is greatly increased.
M.status_flags &= ~DISFIGURED
M.adjustCloneLoss(-7, 0)
. = 1
if(100 to 225) // At lower temperatures (cryo) the full effect is boosted
M.status_flags &= ~DISFIGURED
M.adjustCloneLoss(-3, 0)
. = 1
if(225 to T0C)
M.status_flags &= ~DISFIGURED
M.adjustCloneLoss(-2, 0)
. = 1
if(M.bodytemperature < T0C)
M.adjustCloneLoss(0.00006 * (M.bodytemperature ** 2) - 6, 0)
M.status_flags &= ~DISFIGURED
. = 1
metabolization_rate = REAGENTS_METABOLISM * (0.000015 * (M.bodytemperature ** 2) + 0.75)
..()
/datum/reagent/medicine/rezadone

View File

@@ -181,4 +181,12 @@
icon_state = "virus_food"
anchored = TRUE
density = FALSE
reagent_id = "virusfood"
reagent_id = "virusfood"
/obj/structure/reagent_dispensers/cooking_oil
name = "vat of cooking oil"
desc = "A huge metal vat with a tap on the front. Filled with cooking oil for use in frying food."
icon_state = "vat"
anchored = TRUE
reagent_id = "cooking_oil"