All my changes so far.
note to self: Engineering, Perma, civil jobs, and electricity+piping
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
5
code/game/objects/structures/new_signs.dm
Normal 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"
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
327
code/modules/Phorochemistry/Phorochemputer.dm
Normal 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
|
||||
|
||||
BIN
code/modules/Phorochemistry/computer.dmi
Normal file
|
After Width: | Height: | Size: 40 KiB |
67
code/modules/Phorochemistry/electrical_field.dm
Normal 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)
|
||||
71
code/modules/Phorochemistry/misc_phoronics.dm
Normal 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 )
|
||||
45
code/modules/Phorochemistry/phoroanalyzer.dm
Normal 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)
|
||||
142
code/modules/Phorochemistry/phorochemheat.dm
Normal 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()
|
||||
37
code/modules/Phorochemistry/phoronics_tile.dm
Normal 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
|
||||
68
code/modules/Phorochemistry/phororeactions.dm
Normal 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
|
||||
1180
code/modules/Phorochemistry/phororeagent.dm
Normal file
62
code/modules/Phorochemistry/phorotelepad.dm
Normal 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
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
324
code/modules/planet/Cryogaïa.dm
Normal 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>")
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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
|
After Width: | Height: | Size: 2.8 KiB |
BIN
icons/obj/coffee.dmi
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
BIN
icons/obj/structures_yw.dmi
Normal file
|
After Width: | Height: | Size: 553 B |
BIN
icons/phoronics.dmi
Normal file
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 25 KiB |
3891
maps/lumbercolonymain.dmm
Normal 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"
|
||||
|
||||