All my changes so far.

note to self: Engineering, Perma, civil jobs, and electricity+piping
This commit is contained in:
RadiantFlash7
2018-02-02 04:57:01 -05:00
parent dc2a309c6a
commit 22d13f10c2
33 changed files with 6401 additions and 6 deletions

View File

@@ -1084,3 +1084,13 @@
//everything after the power cell had no amounts, I improvised. -Sayu
req_log_access = access_rd
has_logs = 1
/obj/machinery/vending/phoronresearch2
name = "Toxinmate 2000"
desc = "All the fine parts you need in one vending machine!"
products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6,
/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6,
/obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6)
req_log_access = access_rd
has_logs = 1

View File

@@ -75,6 +75,11 @@
/obj/effect/overlay/snow/floor/edges
icon_state = "snow_edges"
/obj/effect/overlay/snow/floor/edges2
icon_state = "snow_edges2"
/obj/effect/overlay/snow/floor/edges3
icon_state = "gravsnow_edges"
/obj/effect/overlay/snow/floor/surround
icon_state = "snow_surround"

View File

@@ -0,0 +1,5 @@
/obj/structure/sign/coffee_shop_library
name = "\improper Coffee Shop and Library"
desc = "A sign that perfectly depicts that there is, in fact, both a coffee shop and a library in this direction."
icon = 'icons/obj/coffee.dmi'
icon_state = "coffee_sign"

View File

@@ -362,12 +362,13 @@
name = "snow"
icon = 'icons/turf/snow_new.dmi'
icon_state = "snow"
outdoors = TRUE
var/list/crossed_dirs = list()
/turf/simulated/floor/snow/snow2
name = "snow"
icon = 'icons/turf/snow.dmi'
icon_state = "snow"
icon = 'icons/turf/snow_new.dmi'
icon_state = "snownew"
initial_flooring = /decl/flooring/snow
/turf/simulated/floor/snow/gravsnow

View File

@@ -59,6 +59,12 @@
/turf/simulated/wall/log_sif/New(var/newloc)
..(newloc, MAT_SIFLOG)
/turf/unsimulated/wall/ice
name = "Ice wall"
desc = "Frigid Ice that seems to be stronger then most manmade structures"
icon = 'icons/turf/snow_new.dmi'
icon_state = "Icerock"
// Shuttle Walls
/turf/simulated/shuttle/wall
name = "autojoin wall"

View File

@@ -0,0 +1,327 @@
var/global/datum/phororeactions/phororeactions
var/global/list/discovered_phororeagents //list of all phororeagents discovered so far
/obj/machinery/computer/phoronics
icon_keyboard = "rd_key_off"
icon_screen = "phoronics_screen"
circuit = /obj/item/weapon/circuitboard/phoronics
// var/turf/simulated/floor/phoronics/source
var/turf/simulated/floor/source
var/intensity = 1
var/timeLeft = 0
var/timeLeftMax = 0
var/aborting = 0
var/message = "" //57 character max message size, assuming all characters take same size, probably don't
var/obj/machinery/telepad_phoronics/source_pad
var/obj/machinery/telepad_phoronics/dest_pad
var/turf/source_loc
var/turf/dest_loc
var/field
/obj/machinery/computer/phoronics/New()
intensity = 1
timeLeft = 0
timeLeftMax = 0
aborting = 0
message = "Welcome to Phoronics"
if(!phororeactions)
phororeactions = new/datum/phororeactions
phororeactions.set_up_reactions()
if(!discovered_phororeagents)
discovered_phororeagents = list("bicordrazine")
/obj/machinery/computer/phoronics/attack_hand(var/mob/user as mob)
return src.ui_interact(user)
/obj/machinery/computer/phoronics/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
data["intensity"] = intensity
data["timeLeft"] = timeLeft
data["timeLeftMax"] = timeLeftMax
data["message"] = message
if(source)
var/datum/gas_mixture/enviro = source.return_air()
if(enviro.gas["phoron"])
data["phoron"] = round(enviro.gas["phoron"])
else
data["phoron"] = 0
else
data["phoron"] = 0
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "phorochem.tmpl", "Phorochemputer", 480, 400)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1) // auto update every Master Controller tick
return
/obj/machinery/computer/phoronics/Topic(href, href_list)
if(href_list["beginTest"])
if(timeLeft == 0)
begin_test()
if(href_list["abortTest"])
if(timeLeft > 0)
aborting = 1
if(href_list["recalibrate"])
if(timeLeft == 0)
recalibrate()
if(href_list["intensity"])
intensity = min(max(text2num(href_list["intensity"]), 1), 5)
/obj/machinery/computer/phoronics/proc/recalibrate()
if(timeLeft > 0)
message = "ERROR: Cannot recalibrate while test is in progress"
else
source = null
for(var/turf/simulated/floor/phoronics/tile in range(src, 7)) //check for turf before every tile for flooring first
if(istype(tile.flooring, /decl/flooring/phoronics))
if(!source)
source = tile
else
var/distCur = sqrt(((source.x - src.x) ** 2) + ((source.y - src.y) ** 2))
var/distNew = sqrt(((tile.x - src.x) ** 2) + ((tile.y - src.y) ** 2))
if(distNew < distCur)
source = tile
//only gets here if they decide to move the phoronics tile location, or build their own phoronics for some reason
if(!source)
for(var/turf/simulated/floor/tile in range(src, 7))
if(istype(tile.flooring, /decl/flooring/phoronics))
if(!source)
source = tile
else
var/distCur = sqrt(((source.x - src.x) ** 2) + ((source.y - src.y) ** 2))
var/distNew = sqrt(((tile.x - src.x) ** 2) + ((tile.y - src.y) ** 2))
if(distNew < distCur)
source = tile
if(source)
message = "Electromagnetic tile located at: [source.x], [source.y]"
nanomanager.update_uis(src)
source_pad = null
dest_pad = null
spawn(10)
var/list/telepads = list()
for(var/obj/machinery/telepad_phoronics/T in range(src, 7))
telepads.Add(T)
switch(telepads.len)
if(0)
message = "No telepads found"
return
if(1)
message = "ERROR: Insufficient amount of telepads found, refusing link"
return
if(3 to INFINITY)
message = "ERROR: Too many telepads found, refusing link"
return
var/obj/machinery/telepad_phoronics/temp_pad = telepads[1]
var/turf/T = locate(temp_pad.x, temp_pad.y, temp_pad.z)
if(istype(T, /turf/simulated/floor) && istype(T:flooring, /decl/flooring/phoronics))
dest_pad = telepads[1]
source_pad = telepads[2]
if(!dest_pad.anchored || !source_pad.anchored)
message = "ERROR: One or both telepads not anchored to ground"
dest_pad = null
source_pad = null
return
else
temp_pad = telepads[2]
T = locate(temp_pad.x, temp_pad.y, temp_pad.z)
if(istype(T, /turf/simulated/floor) && istype(T:flooring, /decl/flooring/phoronics))
dest_pad = telepads[2]
source_pad = telepads[1]
if(!dest_pad.anchored || !source_pad.anchored)
message = "ERROR: One or both telepads not anchored to ground"
dest_pad = null
source_pad = null
return
else
message = "ERROR: No telepad located on electromagnetic tile"
return
dest_pad.dest = source_pad
source_pad.dest = dest_pad
source_loc = source_pad.loc
dest_loc = dest_pad.loc
message = "Telepads successfully linked"
else
message = "ERROR: No electromagnetic tiles located"
/obj/machinery/computer/phoronics/proc/begin_test()
if(source && istype(source.flooring, /decl/flooring/phoronics)) //make sure turf is still phoronics tile
message = "Test in progress"
else
return abort("ERROR: Recalibrate to locate electromagnetic tile and or telepads")
var/datum/reagent/reactant
var/obj/item/weapon/reagent_containers/container
//check for beaker, and that beaker contains only one reagent
var/num_containers = 0
if(source_pad)
if(source_pad.loc != source_loc)
return abort("ERROR: Input telepad not where expected, please recalibrate")
if(!source_pad.anchored)
return abort("ERROR: Input telepad not anchored")
for(var/obj/item/weapon/reagent_containers/R in source_pad.loc.contents)
num_containers++
container = R
if(container)
if(!container.is_open_container()) //container not open, insult user
var/insult = pick("idiot", "failure", "waste of space", "high school dropout", "chucklefuck", \
"asshat", "dumbass", "fucklechuck", "scrub", "moron", "typical NT worker")
return abort("ERROR: Open reagent container, you [insult]")
if(istype(container, /obj/item/weapon/reagent_containers/glass/beaker/noreact)) //container doesn't react, insult user
var/insult = pick("idiot", "failure", "ass", "scrub", "chucklefuck", \
"asshat", "dumbass", "fucklechuck", "scrub", "moron")
return abort("ERROR: Reactions don't happen in a cryostasis beaker, you [insult]")
if(container.reagents.reagent_list.len > 1)
return abort("ERROR: Too many reagents detected, aborting test")
if(container.reagents.reagent_list.len == 0)
return abort("ERROR: No reagents detected, aborting test")
var/datum/gas_mixture/enviro = source.return_air()
if(!enviro.gas["phoron"] || enviro.gas["phoron"] < 40)
return abort("ERROR: Not enough phoron to initiate reaction")
reactant = container.reagents.reagent_list[1]
if(source_pad && dest_pad)
if(dest_pad.loc != dest_loc)
return abort("ERROR: Output telepad not where expected, please recalibrate")
if(num_containers > 1)
return abort("ERROR: Too many containers detected on telepads")
else
sleep(10)
source_pad.teleport()
sleep(10) //give some time to see result of teleport
else
message = "WARNING: Telepads not detected. Beginning electrical field"
switch(intensity) //time left in seconds
if(1)
timeLeft = 1
if(2)
timeLeft = 3
if(3)
timeLeft = 6
if(4)
timeLeft = 10
if(5)
timeLeft = 15
timeLeft *= 2 //half seconds to make escape impossible from electrical fields
timeLeftMax = timeLeft
nanomanager.update_uis(src) //update progress bar with new timeLeftMax
var/obj/effect/electrical_field/small/field
var/obj/effect/electrical_field/big/field2
var/intensity2 = intensity //to ensure no shenanigans with changing intensities mid test
if(!aborting)
if(intensity != 4)
field = new/obj/effect/electrical_field/small(source)
if(intensity > 3)
field2 = new/obj/effect/electrical_field/big(source)
while(timeLeft > 0)
if(aborting)
aborting = 0
timeLeft = 0
if(stat & NOPOWER)
message = "ERROR: Test aborted due to power loss"
else
message = "Test aborted"
qdel(field)
qdel(field2)
if(dest_pad)
sleep(10)
dest_pad.anchored = 1
dest_pad.teleport()
return
if(field)
field.process_field()
if(field2)
field2.process_field()
timeLeft--
sleep(5)
if(field2) //add a little extra damage to ensure eventual death on intensity 5 electrical field center
field2.process_field()
qdel(field)
qdel(field2)
//reaction time!
var/reaction_happened = 0
var/datum/reagent/phororeagent/phororeagent = null
var/vol = 0
if(reactant)
vol = reactant.volume //must store because it gets cleared
var/datum/phororeaction/process = phororeactions.reactions[reactant.id]
if(process)
var/result = process.get_result(intensity2)
if(result == "Reaction successful")
container.reagents.clear_reagents()
container.reagents.add_reagent(process.result_id, min(vol * process.conversion_rate, container.volume))
reaction_happened = 1
phororeagent = container.reagents.reagent_list[1]
var/datum/gas_mixture/enviro = source.return_air()
enviro.adjust_gas("phoron", -0.15 * vol) //must fix to use proportion of moles with gas laws
message = result
else
message = "No significant reaction detected"
if(dest_pad)
sleep(10)
dest_pad.teleport()
if(reaction_happened && phororeagent) //phororeagent probably unnecessary check
spawn(rand(25, 50))
message = phororeagent.initial_reaction(container, container.loc, vol, message)
/obj/machinery/computer/phoronics/proc/abort(var/text)
message = text
aborting = 0
timeLeft = 0
return
/obj/machinery/computer/phoronics/power_change()
..()
if(timeLeft > 0 && (stat & NOPOWER))
aborting = 1
//Buildable computers stuff
/obj/item/weapon/circuitboard/phoronics
name = T_BOARD("phorochemputer")
build_path = /obj/machinery/computer/phoronics
origin_tech = "programming=2;bluespace=2"
/datum/design/circuit/phoronics
name = "phorochemputer"
id = "phorochemputer"
req_tech = list("programming" = 3, "bluespace" = 2)
build_path = /obj/item/weapon/circuitboard/phoronics

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -0,0 +1,67 @@
/obj/effect/electrical_field
name = "electric field"
icon = 'icons/rust.dmi'
icon_state = "emfield_s1"
pixel_x = 0
pixel_y = 0
var/last_x = -1
var/last_y = -1
/obj/effect/electrical_field/proc/process_field()
if(last_x == -1 && last_y == -1)
last_x = x
last_y = y
if(last_x != x || last_y != y)
qdel(src)
/obj/effect/electrical_field/proc/shock(var/mob/living/L, var/damage = 2.5)
for(var/datum/reagent/phororeagent/R in L.reagents.reagent_list)
if(R.id == "fulguracin")
if(prob(20))
L << "\blue Your hairs stand up, but you resist the shock for the most part."
return //no shock for you
if(L.stat != DEAD)
L.jitteriness = 140
if(!L.is_jittery)
spawn(0)
L.jittery_process()
var/isHuman = ishuman(L)
if(isHuman)
var/mob/living/carbon/human/H = L
H.apply_effect(10, STUN, 0)
H.apply_effect(10, WEAKEN, 0)
H.apply_effect(10, STUTTER, 0)
H.take_overall_damage(0, damage) //has to be high or they just heal it away instantly
else
L.Stun(10)
L.apply_damage(3, BURN)
/obj/effect/electrical_field/small
name = "small electric field"
/obj/effect/electrical_field/small/process_field()
..()
for(var/mob/living/L in loc.contents)
shock(L, 4) //more damage than big field because it's more condensed or something
/obj/effect/electrical_field/big
name = "large electric field"
icon = 'icons/effects/96x96.dmi'
icon_state = "emfield_s3"
pixel_x = -32
pixel_y = -32
/obj/effect/electrical_field/big/process_field()
..()
var/turf/T = null
for(var/i = src.x - 1 to src.x + 1)
for(var/j = src.y - 1 to src.y + 1)
T = locate(i, j, z)
for(var/mob/living/L in T.contents) //only the middle X 9
shock(L)

View File

@@ -0,0 +1,71 @@
#define REM 0.2
#define SOLID 1
#define LIQUID 2
#define GAS 3
proc/gaseous_reagent_check(var/mob/living/carbon/human/H) //protective clothing check
return (istype(H.wear_suit, /obj/item/clothing/suit/space) && istype(H.head, /obj/item/clothing/head/helmet/space)) \
|| (istype(H.wear_suit, /obj/item/clothing/suit/bio_suit) && istype(H.head, /obj/item/clothing/head/bio_hood) && H.gloves) \
|| (H.isSynthetic())
/datum/reagent/nitrate
id = "nitrate"
name = "Nitrate"
description = "Nitrate, not that interesting."
reagent_state = LIQUID
color = "#D8DFE3"
/datum/reagent/aluminum_nitrate
id = "aluminum_nitrate"
name = "Aluminum Nitrate"
description = "Aluminum Nitrate, now that's interesting!"
reagent_state = LIQUID
color = "#E1CFE3"
/datum/chemical_reaction/nitrate
name = "Nitrate"
id = "nitrate"
result = "nitrate"
required_reagents = list("nitrogen" = 1, "oxygen" = 3)
result_amount = 4
/datum/chemical_reaction/aluminum_nitrate
name = "Aluminum Nitrate"
id = "aluminum_nitrate"
result = "aluminum_nitrate"
required_reagents = list("aluminum" = 1, "nitrate" = 3)
result_amount = 4
/datum/chemical_reaction/brownies
name = "Brownies"
id = "brownies"
result = null
required_reagents = list("aluminum_nitrate" = 40, "tartrate" = 20)
result_amount = 1
on_reaction(var/datum/reagents/holder, var/created_volume)
for(var/i = 0; i < 3; i++)
new /obj/item/weapon/reagent_containers/food/snacks/brownies(get_turf(holder.my_atom))
return
/obj/item/weapon/reagent_containers/food/snacks/brownies
name = "Brownies"
icon_state = "waffles"
desc = "Ovenless Brownies!"
filling_color = "#A79459"
New()
..()
reagents.add_reagent("nutriment", 6)
/obj/item/weapon/induromol
name = "Hardened Induromol"
icon = 'icons/obj/mining.dmi'
icon_state = "ore_platinum"
desc = "Looks like it would make a great throwing weapon."
throwforce = 20
/obj/structure/closet/l3closet/scientist/phoronics/New() //two sets of chemical protection
..()
new /obj/item/clothing/suit/bio_suit/scientist( src )
new /obj/item/clothing/head/bio_hood/scientist( src )

View File

@@ -0,0 +1,45 @@
/obj/machinery/phoroanalyzer
name = "Chemical Analyzer"
density = 1
anchored = 1
icon = 'icons/obj/chemical.dmi'
icon_state = "mixer0b"
use_power = 1
idle_power_usage = 20
var/obj/item/weapon/reagent_containers/stored = null
/obj/machinery/phoroanalyzer/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
if(istype(B, /obj/item/weapon/reagent_containers))
stored = B
if(stored.reagents.reagent_list.len > 1)
state("Error: Multiple reagents detected")
return
if(stored.reagents.reagent_list.len == 0)
state("Error: No reagents detected")
return
var/datum/reagent/R = stored.reagents.reagent_list[1]
user.drop_item()
B.loc = src
icon_state = "mixer1b"
//say analyze stuff
spawn(0)
analyze(R)
B.loc = src.loc
icon_state = "mixer0b"
else
return
/obj/machinery/phoroanalyzer/proc/analyze(var/datum/reagent/R)
if(istype(R, /datum/reagent/phororeagent))
var/datum/reagent/phororeagent/P = R
var/description = "Analysis complete - [P.name]: [P.description]"
var/id = P.id
sleep(20)
discovered_phororeagents.Add(id)
state(description)
else
var/description = "Analysis complete - [R.name]: [R.description]"
sleep(20)
state(description)

View File

@@ -0,0 +1,142 @@
//chemistry stuff here so that it can be easily viewed/modified
/obj/item/weapon/reagent_containers/glass/solution_tray
name = "solution tray"
desc = "A small, open-topped glass container for delicate research samples. It sports a re-useable strip for labelling with a pen."
icon = 'icons/obj/device.dmi'
icon_state = "solution_tray"
matter = list("glass" = 5)
w_class = 2.0
amount_per_transfer_from_this = 1
possible_transfer_amounts = list(1, 2)
volume = 2
flags = OPENCONTAINER
unacidable = 1
/obj/item/weapon/storage/box/solution_trays
name = "solution tray box"
icon_state = "solution_trays"
New()
..()
new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
/obj/item/weapon/reagent_containers/glass/beaker/tungsten
name = "beaker 'tungsten'"
New()
..()
reagents.add_reagent("tungsten",50)
update_icon()
/obj/item/weapon/reagent_containers/glass/beaker/oxygen
name = "beaker 'oxygen'"
New()
..()
reagents.add_reagent("oxygen",50)
update_icon()
/obj/item/weapon/reagent_containers/glass/beaker/sodium
name = "beaker 'sodium'"
New()
..()
reagents.add_reagent("sodium",50)
update_icon()
/obj/item/weapon/reagent_containers/glass/beaker/lithium
name = "beaker 'lithium'"
New()
..()
reagents.add_reagent("lithium",50)
update_icon()
/obj/item/weapon/reagent_containers/glass/beaker/water
name = "beaker 'water'"
New()
..()
reagents.add_reagent("water",50)
update_icon()
/obj/item/weapon/reagent_containers/glass/beaker/water
name = "beaker 'water'"
New()
..()
reagents.add_reagent("water",50)
update_icon()
/obj/item/weapon/reagent_containers/glass/beaker/fuel
name = "beaker 'fuel'"
New()
..()
reagents.add_reagent("fuel",50)
update_icon()
/obj/machinery/bunsen_burner
name = "bunsen burner"
desc = "A flat, self-heating device designed for bringing chemical mixtures to boil."
icon = 'icons/obj/device.dmi'
icon_state = "bunsen0"
var/heating = 0 //whether the bunsen is turned on
var/heated = 0 //whether the bunsen has been on long enough to let stuff react
var/obj/item/weapon/reagent_containers/held_container
var/heat_time = 50
/obj/machinery/bunsen_burner/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/reagent_containers))
if(held_container)
user << "\red You must remove the [held_container] first."
else
user.drop_item(src)
held_container = W
held_container.loc = src
user << "\blue You put the [held_container] onto the [src]."
var/image/I = image("icon"=W, "layer"=FLOAT_LAYER)
underlays += I
if(heating)
spawn(heat_time)
try_heating()
else
user << "\red You can't put the [W] onto the [src]."
/obj/machinery/bunsen_burner/attack_ai()
return
/obj/machinery/bunsen_burner/attack_hand(mob/user as mob)
if(held_container)
underlays = null
user << "\blue You remove the [held_container] from the [src]."
held_container.loc = src.loc
held_container.attack_hand(user)
held_container = null
else
user << "\red There is nothing on the [src]."
/obj/machinery/bunsen_burner/proc/try_heating()
src.visible_message("\blue \icon[src] [src] hisses.")
if(held_container && heating)
heated = 1
held_container.reagents.handle_reactions()
heated = 0
spawn(heat_time)
try_heating()
/obj/machinery/bunsen_burner/verb/toggle()
set src in view(1)
set name = "Toggle bunsen burner"
set category = "IC"
heating = !heating
icon_state = "bunsen[heating]"
if(heating)
spawn(heat_time)
try_heating()

View File

@@ -0,0 +1,37 @@
//Phoronics code, courtesy of Dr. Brock.
/turf/simulated/floor/phoronics
name = "electromagnetic tile"
icon = 'icons/turf/flooring/circuit.dmi'
icon_state = "gcircuit_broken"
initial_flooring = /decl/flooring/phoronics
/decl/flooring/phoronics
name = "electromagnetic tile"
desc = "An electromagnetic tile to create an electric field."
icon = 'icons/turf/flooring/circuit.dmi'
icon_base = "gcircuit_broken"
has_damage_range = null
flags = TURF_REMOVE_CROWBAR
build_type = /obj/item/stack/tile/phoronics
//phoronics floor tile object
/obj/item/stack/tile/phoronics
name = "electromagnetic tile"
singular_name = "electromagnetic tile"
desc = "A tile for use in the creation of electromagnetic fields"
icon_state = "fr_tile"
w_class = 3.0
force = 1.0
throwforce = 1.0
throw_speed = 5
throw_range = 20
flags = CONDUCT
max_amount = 1
origin_tech = "magnets=3"
datum/design/item/phoronics_tile
name = "electromagnetic floor tile"
id = "phoronics_tile"
req_tech = list("magnets" = 3, "materials" = 3)
materials = list("$metal" = 1000)
build_path = /obj/item/stack/tile/phoronics

View File

@@ -0,0 +1,68 @@
#define PHORONICS_TESTING 1
/datum/phororeaction
var/reactant_id = ""
var/result_id = ""
var/conversion_rate = 1
var/intensity = 1
/datum/phororeaction/New(var/input, var/output, var/rate = 1, var/level = 1)
#if PHORONICS_TESTING
testing("[input]: [output], [level]")
#endif
reactant_id = input
result_id = output
conversion_rate = rate
intensity = level
/datum/phororeaction/proc/get_result(var/level) //requires that only ONE reagent be tested at at time
if(level == intensity)
return "Reaction successful"
var/difference = abs(level - intensity)
if(difference > 1) //ensure multiple tests required
return "No significant reaction detected"
if(level < intensity)
return "Slight reaction detected, it is recommended to raise intensity"
if(level > intensity)
return "Reaction highly unstable, it is recommended to lower intensity"
/datum/phororeactions
var/list/random_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine", \
"sodium","aluminum","silicon","phosphorus","sulfur","chlorine","potassium","iron", \
"copper","mercury","radium","water","sugar","sacid","tungsten", "lube", "inaprovaline", "space_drugs", \
"thermite", "tramadol", "cleaner", "kelotane", "dermaline", "anti_toxin", "synaptizine", \
"alkysine", "imidazoline", "hyperzine", "ammonia", "sodiumchloride", "sterilizine", "silicate", "mindbreaker", \
"impedrezene", "lipozine")
var/list/reactions = list()
/datum/phororeactions/proc/set_up_reactions()
reactions["tricordrazine"] = new/datum/phororeaction("tricordrazine", "bicordrazine", 1.5, 3)
reactions["mutagen"] = new/datum/phororeaction("mutagen", "mutagen_x", 0.5, 5)
reactions["ethylredoxrazine"] = new/datum/phororeaction("ethylredoxrazine", "expulsicol", 1, 2)
reactions["hyronalin"] = new/datum/phororeaction("hyronalin", "rad_x", 1, 3)
//reactions["pacid"] = new/datum/phororeaction("pacid", "phoronic_acid", 0.2, 4) removed
reactions["phoron"] = new/datum/phororeaction("phoron", "energized_phoron", 1, 5)
reactions["oxycodone"] = new/datum/phororeaction("oxycodone", "oxyphoromin", 0.5, 1)
var/list/results = typesof(/datum/reagent/phororeagent) - /datum/reagent/phororeagent - /datum/reagent/phororeagent/gaseous
var/list/reactants = list()
for(var/R in reactions)
var/datum/phororeaction/reaction = reactions[R]
reactants[reaction.result_id] = 1 //reaction found
for(var/path in results)
var/datum/reagent/phororeagent/P = new path()
if(reactants[P.id]) //recipe found
continue
else
var/id = pick(random_reagents)
random_reagents.Remove(id)
var/intens = rand(1, 5)
reactions[id] = new/datum/phororeaction(id, P.id, 1, intens)
//garbage collection should deal with reagents

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,62 @@
/obj/machinery/telepad_phoronics
name = "telepad"
desc = "A bluespace telepad used for teleporting objects to and from a location."
icon = 'icons/phoronics.dmi'
icon_state = "pad-idle"
anchored = 1
use_power = 1
idle_power_usage = 50
active_power_usage = 500
var/obj/machinery/telepad_phoronics/dest
/obj/machinery/telepad_phoronics/proc/teleport() //should be guaranteed to only contain one item
if(dest)
flick("pad-beam", src)
playsound(src.loc, 'sound/weapons/flash.ogg', 25, 1)
flick("pad-beam", dest)
playsound(dest.loc, 'sound/weapons/flash.ogg', 25, 1)
for(var/obj/O in src.loc.contents)
if(!O.anchored)
O.loc = dest.loc
for(var/mob/M in src.loc.contents)
//if(!M.restrained())
M.loc = dest.loc
/obj/machinery/telepad_phoronics/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/reagent_containers))
user.drop_item()
W.loc = src.loc
else if(istype(W, /obj/item/weapon/wrench))
var/word = "tighten"
src.anchored = !src.anchored
if(!src.anchored)
word = "undo"
user << "You [word] the telepad anchor bolts."
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
else if(istype(W, /obj/item/weapon/screwdriver) && !src.anchored)
user << "You fold the telepad."
new /obj/item/weapon/phoronics_telepad(src.loc)
del(src)
else
return ..()
/obj/item/weapon/phoronics_telepad
name = "telepad"
desc = "A bluespace telepad used for teleporting objects to and from a location."
icon = 'icons/phoronics.dmi'
icon_state = "pad-folded"
attack_self(mob/user as mob)
user << "You unfold the pad."
var/obj/machinery/telepad_phoronics/T = new /obj/machinery/telepad_phoronics(user.loc)
T.anchored = 0
del(src)
/datum/design/item/phoronics_telepad
name = "phoronics telepad"
id = "phoronics_telepad"
req_tech = list("bluespace" = 2, "materials" = 3)
materials = list("$metal" = 1000)
build_path = /obj/item/weapon/phoronics_telepad

View File

@@ -254,3 +254,76 @@
newflag.icon_state = "[newflag.base_state]_open"
newflag.visible_message("<b>[user]</b> plants [newflag] firmly in the ground.")
src.use(1)
// Lightpoles for lumber colony
/obj/item/stack/lightpole
name = "Trailblazers"
desc = "Some colourful trail lights."
singular_name = "flag"
amount = 10
max_amount = 10
icon = 'icons/obj/mining.dmi'
var/upright = 0
var/base_state
var/on = 0
var/brightness_on = 4 //luminosity when on
/obj/item/stack/lightpole/New()
..()
base_state = icon_state
/obj/item/stack/lightpole/blue
name = "blue trail blazers"
singular_name = "blue trail blazer"
icon_state = "bluetrail_light"
light_color = "#599DFF"
/obj/item/stack/lightpole/red
name = "red flags"
singular_name = "red trail blazer"
icon_state = "redtrail_light"
light_color = "#FC0F29"
/obj/item/stack/lightpole/attackby(obj/item/W as obj, mob/user as mob)
if(upright && istype(W,src.type))
src.attack_hand(user)
else
..()
/obj/item/stack/lightpole/attack_hand(user as mob)
if(upright)
upright = 0
icon_state = base_state
anchored = 0
src.visible_message("<b>[user]</b> knocks down [src].")
else
..()
/obj/item/stack/lightpole/attack_self(mob/user as mob)
var/obj/item/stack/lightpole/F = locate() in get_turf(src)
var/turf/T = get_turf(src)
if(!T || !istype(T,/turf/snow/snow2))
user << "The flag won't stand up in this terrain."
return
if(F && F.upright)
user << "There is already a flag here."
return
var/obj/item/stack/lightpole/newlightpole = new src.type(T)
newlightpole.amount = 1
newlightpole.upright = 1
brightness_on = 2
set_light(brightness_on)
anchored = 1
newlightpole.name = newlightpole.singular_name
newlightpole.icon_state = "[newlightpole.base_state]_on"
newlightpole.visible_message("<b>[user]</b> plants [newlightpole] firmly in the ground.")
src.use(1)

View File

@@ -6,6 +6,14 @@ var/list/mining_overlay_cache = list()
icon = 'icons/turf/walls.dmi'
icon_state = "rock-dark"
/turf/unsimulated/mineral/ice
name = "Ice wall"
desc = "Frigid Ice that seems to be stronger then most manmade structures"
icon = 'icons/turf/snow_new.dmi'
icon_state = "Icerock"
/turf/simulated/mineral //wall piece
name = "rock"
icon = 'icons/turf/walls.dmi'

View File

@@ -107,5 +107,8 @@
if(ticker && ticker.mode)
ticker.mode.check_win()
if(reagents)
for(var/datum/reagent/R in reagents.reagent_list)
R.on_mob_death(src)
return 1

View File

@@ -29,6 +29,12 @@
H.break_cloak()
..()
var/lacertusol = 0
for(var/datum/reagent/phororeagent/R in M.reagents.reagent_list)
if(R.id == "lacertusol")
lacertusol = 1
break
// Should this all be in Touch()?
if(istype(H))
if(get_accuracy_penalty(H) && H != src) //Should only trigger if they're not aiming well
@@ -46,6 +52,8 @@
if(istype(H.gloves, /obj/item/clothing/gloves/boxing/hologlove))
H.do_attack_animation(src)
var/damage = rand(0, 9)
if(lacertusol)
damage = rand(5, 12)
if(!damage)
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("<font color='red'><B>[H] has attempted to punch [src]!</B></font>")
@@ -162,6 +170,8 @@
return
var/rand_damage = rand(1, 5)
if(lacertusol)
rand_damage = rand(5, 12)
var/block = 0
var/accurate = 0
var/hit_zone = H.zone_sel.selecting
@@ -175,6 +185,8 @@
if(I_HELP)
// We didn't see this coming, so we get the full blow
rand_damage = 5
if(lacertusol)
rand_damage = 12
accurate = 1
if(I_HURT, I_GRAB)
// We're in a fighting stance, there's a chance we block
@@ -188,6 +200,8 @@
if(src.grabbed_by.len || src.buckled || !src.canmove || src==H)
accurate = 1 // certain circumstances make it impossible for us to evade punches
rand_damage = 5
if(lacertusol)
rand_damage = 12
// Process evasion and blocking
var/miss_type = 0

View File

@@ -0,0 +1,324 @@
var/datum/planet/Cryogaia/planet_Cryogaia = null
/datum/planet/Cryogaia
name = "Cryoga<67>a"
/datum/planet/Cryogaia
name = "Cryoga<67>a"
desc = "WIP." // Ripped straight from the wiki.
current_time = new /datum/time/Cryogaia() // 32 hour clocks are nice.
// expected_z_levels = list(1) // To be changed when real map is finished.
// planetary_wall_type = /turf/unsimulated/wall/planetary/Cryogaia
/datum/planet/Cryogaia/New()
..()
planet_Cryogaia = src
weather_holder = new /datum/weather_holder/Cryogaia(src) // Cold weather is also nice.
// This code is horrible.
/datum/planet/Cryogaia/update_sun()
..()
var/datum/time/time = current_time
var/length_of_day = time.seconds_in_day / 10 / 60 / 60 // 32
var/noon = length_of_day / 2
var/distance_from_noon = abs(text2num(time.show_time("hh")) - noon)
sun_position = distance_from_noon / noon
sun_position = abs(sun_position - 1)
var/low_brightness = null
var/high_brightness = null
var/low_color = null
var/high_color = null
var/min = 0
switch(sun_position)
if(0 to 0.40) // Night
low_brightness = 0.2
low_color = "#000066"
high_brightness = 0.5
high_color = "#66004D"
min = 0
if(0.40 to 0.50) // Twilight
low_brightness = 0.6
low_color = "#66004D"
high_brightness = 0.8
high_color = "#CC3300"
min = 0.40
if(0.50 to 0.70) // Sunrise/set
low_brightness = 0.8
low_color = "#CC3300"
high_brightness = 0.9
high_color = "#FF9933"
min = 0.50
if(0.70 to 1.00) // Noon
low_brightness = 0.9
low_color = "#DDDDDD"
high_brightness = 1.0
high_color = "#FFFFFF"
min = 0.70
var/lerp_weight = (abs(min - sun_position)) * 4
var/weather_light_modifier = 1
if(weather_holder && weather_holder.current_weather)
weather_light_modifier = weather_holder.current_weather.light_modifier
var/new_brightness = (Interpolate(low_brightness, high_brightness, weight = lerp_weight) ) * weather_light_modifier
var/new_color = null
if(weather_holder && weather_holder.current_weather && weather_holder.current_weather.light_color)
new_color = weather_holder.current_weather.light_color
else
var/list/low_color_list = hex2rgb(low_color)
var/low_r = low_color_list[1]
var/low_g = low_color_list[2]
var/low_b = low_color_list[3]
var/list/high_color_list = hex2rgb(high_color)
var/high_r = high_color_list[1]
var/high_g = high_color_list[2]
var/high_b = high_color_list[3]
var/new_r = Interpolate(low_r, high_r, weight = lerp_weight)
var/new_g = Interpolate(low_g, high_g, weight = lerp_weight)
var/new_b = Interpolate(low_b, high_b, weight = lerp_weight)
new_color = rgb(new_r, new_g, new_b)
spawn(1)
update_sun_deferred(2, new_brightness, new_color)
// 24hr day on Cryoga<67>a
/datum/time/Cryogaia
seconds_in_day = 60 * 60 * 24 * 10 // 115,200 seconds. If we did 32.64 hours/day it would be around 117,504 seconds instead.
// Returns the time datum of Cryoga<67>a.
/proc/get_Cryogaia_time()
if(planet_Cryogaia)
return planet_Cryogaia.current_time
//Weather definitions
/datum/weather_holder/Cryogaia
temperature = T0C
allowed_weather_types = list(
WEATHER_CLEAR = new /datum/weather/Cryogaia/clear(),
WEATHER_OVERCAST = new /datum/weather/Cryogaia/overcast(),
WEATHER_LIGHT_SNOW = new /datum/weather/Cryogaia/light_snow(),
WEATHER_SNOW = new /datum/weather/Cryogaia/snow(),
WEATHER_BLIZZARD = new /datum/weather/Cryogaia/blizzard(),
WEATHER_RAIN = new /datum/weather/Cryogaia/rain(),
WEATHER_STORM = new /datum/weather/Cryogaia/storm(),
WEATHER_HAIL = new /datum/weather/Cryogaia/hail(),
WEATHER_BLOOD_MOON = new /datum/weather/Cryogaia/blood_moon()
)
roundstart_weather_chances = list(
WEATHER_CLEAR = 30,
WEATHER_OVERCAST = 30,
WEATHER_LIGHT_SNOW = 20,
WEATHER_SNOW = 5,
WEATHER_BLIZZARD = 5,
WEATHER_RAIN = 5,
WEATHER_STORM = 2.5,
WEATHER_HAIL = 2.5
)
datum/weather/Cryogaia
name = "Cryoga<67>a base"
temp_high = 283.15 // 10c
temp_low = 263.15 // -10c
/datum/weather/Cryogaia/clear
name = "clear"
transition_chances = list(
WEATHER_CLEAR = 60,
WEATHER_OVERCAST = 40
)
/datum/weather/Cryogaia/overcast
name = "overcast"
light_modifier = 0.8
transition_chances = list(
WEATHER_CLEAR = 25,
WEATHER_OVERCAST = 50,
WEATHER_LIGHT_SNOW = 10,
WEATHER_SNOW = 5,
WEATHER_RAIN = 5,
WEATHER_HAIL = 5
)
/datum/weather/Cryogaia/light_snow
name = "light snow"
icon_state = "snowfall_light"
temp_high = T0C // 0c
temp_low = 258.15 // -15c
light_modifier = 0.7
transition_chances = list(
WEATHER_OVERCAST = 20,
WEATHER_LIGHT_SNOW = 50,
WEATHER_SNOW = 25,
WEATHER_HAIL = 5
)
/datum/weather/Cryogaia/snow
name = "moderate snow"
icon_state = "snowfall_med"
temp_high = T0C // 0c
temp_low = 243.15 // -30c
light_modifier = 0.5
flight_falure_modifier = 5
transition_chances = list(
WEATHER_LIGHT_SNOW = 20,
WEATHER_SNOW = 50,
WEATHER_BLIZZARD = 20,
WEATHER_HAIL = 5,
WEATHER_OVERCAST = 5
)
/datum/weather/Cryogaia/snow/process_effects()
for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs)
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(33))
T.chill()
/datum/weather/Cryogaia/blizzard
name = "blizzard"
icon_state = "snowfall_heavy"
temp_high = 233.15 // -40c
temp_low = 213.15 // -60c
light_modifier = 0.3
flight_falure_modifier = 10
transition_chances = list(
WEATHER_SNOW = 45,
WEATHER_BLIZZARD = 40,
WEATHER_HAIL = 10,
WEATHER_OVERCAST = 5
)
/datum/weather/Cryogaia/blizzard/process_effects()
for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs)
if(S.z in holder.our_planet.expected_z_levels)
for(var/dir_checked in cardinal)
var/turf/simulated/floor/T = get_step(S, dir_checked)
if(istype(T))
if(istype(T, /turf/simulated/floor/outdoors) && prob(50))
T.chill()
/datum/weather/Cryogaia/rain
name = "rain"
icon_state = "rain"
light_modifier = 0.5
transition_chances = list(
WEATHER_OVERCAST = 25,
WEATHER_LIGHT_SNOW = 10,
WEATHER_RAIN = 50,
WEATHER_STORM = 10,
WEATHER_HAIL = 5
)
/datum/weather/Cryogaia/rain/process_effects()
for(var/mob/living/L in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
return // They're indoors, so no need to rain on them.
L.water_act(1)
to_chat(L, "<span class='warning'>Rain falls on you.</span>")
/datum/weather/Cryogaia/storm
name = "storm"
icon_state = "storm"
temp_high = 243.15 // -30c
temp_low = 233.15 // -50c
light_modifier = 0.3
flight_falure_modifier = 10
transition_chances = list(
WEATHER_RAIN = 45,
WEATHER_STORM = 40,
WEATHER_HAIL = 10,
WEATHER_OVERCAST = 5
)
/datum/weather/Cryogaia/rain/process_effects()
for(var/mob/living/L in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
return // They're indoors, so no need to rain on them.
L.water_act(2)
to_chat(L, "<span class='warning'>Rain falls on you, drenching you in water.</span>")
/datum/weather/Cryogaia/hail
name = "hail"
icon_state = "hail"
temp_high = T0C // 0c
temp_low = 243.15 // -30c
light_modifier = 0.3
flight_falure_modifier = 15
transition_chances = list(
WEATHER_RAIN = 45,
WEATHER_STORM = 10,
WEATHER_HAIL = 40,
WEATHER_OVERCAST = 5
)
/datum/weather/Cryogaia/hail/process_effects()
for(var/mob/living/L in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
return // They're indoors, so no need to pelt them with ice.
var/target_zone = pick(BP_ALL)
var/amount_blocked = L.run_armor_check(target_zone, "melee")
var/amount_soaked = L.get_armor_soak(target_zone, "melee")
if(amount_blocked >= 100)
return // No need to apply damage.
if(amount_soaked >= 10)
return // No need to apply damage.
L.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
to_chat(L, "<span class='warning'>The hail raining down on you [L.can_feel_pain() ? "hurts" : "damages you"]!</span>")
/datum/weather/Cryogaia/blood_moon
name = "blood moon"
light_modifier = 0.5
light_color = "#FF0000"
flight_falure_modifier = 25
transition_chances = list(
WEATHER_BLOODMOON = 100
)
/datum/weather/Cryogaia/hail/process_effects()
for(var/mob/living/L in living_mob_list)
if(L.z in holder.our_planet.expected_z_levels)
var/turf/T = get_turf(L)
if(!T.outdoors)
return // They're indoors, so no need to pelt them with ice.
var/target_zone = pick(BP_ALL)
var/amount_blocked = L.run_armor_check(target_zone, "melee")
var/amount_soaked = L.get_armor_soak(target_zone, "melee")
if(amount_blocked >= 100)
return // No need to apply damage.
if(amount_soaked >= 10)
return // No need to apply damage.
L.apply_damage(rand(5, 10), BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
to_chat(L, "<span class='warning'>The hail raining down on you [L.can_feel_pain() ? "hurts" : "damages you"]!</span>")

View File

@@ -881,3 +881,17 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "lampshade"
w_class = ITEMSIZE_TINY
/obj/machinery/light/trailblazerb
icon = 'icons/obj/mining.dmi'
icon_state = "bluetrail_light_on"
base_state = "bluetrail_light_on"
fitting = "bulb"
brightness_range = 3
brightness_power = 2
layer = OBJ_LAYER
brightness_color = "#599DFF"
desc = "An unmovable trailblazer"
light_type = /obj/item/weapon/light/bulb
shows_alerts = FALSE
var/lamp_shade = 0

View File

@@ -74,6 +74,7 @@
total_volume = 0
for(var/datum/reagent/R in reagent_list)
if(R.volume < MINIMUM_CHEMICAL_VOLUME)
R.on_remove(my_atom)
del_reagent(R.id)
else
total_volume += R.volume
@@ -260,8 +261,10 @@
for(var/datum/reagent/current in reagent_list)
var/amount_to_transfer = current.volume * part
var/should_transfer = current.on_transfer(amount_to_transfer)
if(should_transfer)
target.add_reagent(current.id, amount_to_transfer * multiplier, current.get_data(), safety = 1) // We don't react until everything is in place
if(!copy)
if(!copy || should_transfer)
remove_reagent(current.id, amount_to_transfer, 1)
if(!copy)

View File

@@ -128,6 +128,18 @@
holder = null
. = ..()
// Called when reagents are removed from a container, most likely after metabolizing in a mob
/datum/reagent/proc/on_remove(var/atom/A)
return
// Called when a mob dies
/datum/reagent/proc/on_mob_death(var/mob/M)
return
//on transfer to new container, return 1 to allow it to continue
/datum/reagent/proc/on_transfer(var/volume)
return 1
/* DEPRECATED - TODO: REMOVE EVERYWHERE */
/datum/reagent/proc/reaction_turf(var/turf/target)
@@ -138,3 +150,5 @@
/datum/reagent/proc/reaction_mob(var/mob/target)
touch_mob(target)

View File

@@ -0,0 +1,15 @@
/obj/item/weapon/reagent_containers/food/drinks/bluespace_coffee
name = "bluespace coffee"
desc = "This revolutionary device is always full of hot 'coffee'; no one knows where it comes from..."
icon = 'icons/obj/coffee.dmi'
icon_state = "bluespace_coffee"
center_of_mass = list("x"=15, "y"=10)
volume = 50
New()
..()
reagents.add_reagent("coffee", 50)
//Infinite Coffee
attack(mob/M as mob, mob/user as mob, def_zone)
..()
src.reagents.add_reagent("coffee", 50)

BIN
icons/coffee.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
icons/obj/coffee.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

BIN
icons/obj/structures_yw.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

BIN
icons/phoronics.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 25 KiB

3891
maps/lumbercolonymain.dmm Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -2261,6 +2261,15 @@
#include "code\modules\paperwork\photography.dm"
#include "code\modules\paperwork\silicon_photography.dm"
#include "code\modules\paperwork\stamps.dm"
#include "code\modules\Phorochemistry\electrical_field.dm"
#include "code\modules\Phorochemistry\misc_phoronics.dm"
#include "code\modules\Phorochemistry\phoroanalyzer.dm"
#include "code\modules\Phorochemistry\phorochemheat.dm"
#include "code\modules\Phorochemistry\Phorochemputer.dm"
#include "code\modules\Phorochemistry\phoronics_tile.dm"
#include "code\modules\Phorochemistry\phororeactions.dm"
#include "code\modules\Phorochemistry\phororeagent.dm"
#include "code\modules\Phorochemistry\phorotelepad.dm"
#include "code\modules\planet\planet.dm"
#include "code\modules\planet\time.dm"
#include "code\modules\planet\weather.dm"
@@ -2466,6 +2475,7 @@
#include "code\modules\reagents\reagent_containers\food\snacks.dm"
#include "code\modules\reagents\reagent_containers\food\snacks_vr.dm"
#include "code\modules\reagents\reagent_containers\food\z_custom_food_vr.dm"
#include "code\modules\reagents\reagent_containers\food\drinks\bluespacecoffee.dm"
#include "code\modules\reagents\reagent_containers\food\drinks\bottle.dm"
#include "code\modules\reagents\reagent_containers\food\drinks\cup.dm"
#include "code\modules\reagents\reagent_containers\food\drinks\jar.dm"