diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index f102bf55c8f..66d5f5fce80 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -280,7 +280,7 @@
dir = 8
},
/obj/machinery/iv_drip,
-/obj/item/reagent_containers/food/drinks/waterbottle/large,
+/obj/item/reagent_containers/glass/beaker/waterbottle/large,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
"aR" = (
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index 24edf6a0313..0d0476ae541 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -719,7 +719,7 @@
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
+ dir = 4
},
/turf/simulated/floor/engine,
/area/ruin/unpowered/syndicate_lava_base/engineering)
@@ -731,7 +731,7 @@
target_pressure = 4500
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 8
+ dir = 4
},
/turf/simulated/floor/engine,
/area/ruin/unpowered/syndicate_lava_base/engineering)
@@ -1108,10 +1108,6 @@
/obj/machinery/atmospherics/pipe/simple/visible/yellow,
/turf/simulated/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/engineering)
-"bQ" = (
-/obj/machinery/atmospherics/pipe/simple/visible/yellow,
-/turf/simulated/wall/mineral/plastitanium/nodiagonal,
-/area/ruin/unpowered/syndicate_lava_base/engineering)
"bR" = (
/obj/machinery/optable,
/obj/effect/decal/cleanable/dirt,
@@ -2625,21 +2621,21 @@
"ft" = (
/obj/effect/turf_decal/box/white/corners,
/obj/structure/closet/crate,
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
+/obj/item/reagent_containers/glass/beaker/waterbottle/large{
pixel_x = -3;
pixel_y = 3
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
+/obj/item/reagent_containers/glass/beaker/waterbottle/large{
pixel_x = -3;
pixel_y = 3
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large,
-/obj/item/reagent_containers/food/drinks/waterbottle/large,
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
+/obj/item/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/reagent_containers/glass/beaker/waterbottle/large,
+/obj/item/reagent_containers/glass/beaker/waterbottle/large{
pixel_x = 3;
pixel_y = -3
},
-/obj/item/reagent_containers/food/drinks/waterbottle/large{
+/obj/item/reagent_containers/glass/beaker/waterbottle/large{
pixel_x = 3;
pixel_y = -3
},
@@ -3947,7 +3943,8 @@
"iI" = (
/obj/machinery/door/airlock/vault{
id_tag = "syndie_lavaland_vault";
- req_access_txt = "150"
+ req_access_txt = "150";
+ locked = 1
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -6036,7 +6033,7 @@
/area/ruin/unpowered/syndicate_lava_base/engineering)
"nf" = (
/obj/structure/sign/fire,
-/turf/simulated/wall/mineral/plastitanium/nodiagonal,
+/turf/simulated/wall/mineral/plastitanium/coated,
/area/ruin/unpowered/syndicate_lava_base/engineering)
"nh" = (
/obj/machinery/telecomms/relay/preset/ruskie{
@@ -6628,7 +6625,7 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume{
+/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume/on{
dir = 8
},
/turf/simulated/floor/engine,
@@ -6849,6 +6846,10 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/engine,
/area/ruin/unpowered/syndicate_lava_base/testlab)
+"yd" = (
+/obj/machinery/atmospherics/pipe/simple/visible/yellow,
+/turf/simulated/wall/mineral/plastitanium/coated,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
"yU" = (
/turf/simulated/wall/mineral/plastitanium/explosive,
/area/ruin/unpowered/syndicate_lava_base/chemistry)
@@ -6918,6 +6919,9 @@
},
/turf/simulated/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/engineering)
+"RI" = (
+/turf/simulated/wall/mineral/plastitanium/coated,
+/area/ruin/unpowered/syndicate_lava_base/engineering)
"RV" = (
/obj/structure/sign/fire,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -8687,9 +8691,9 @@ IJ
IJ
IJ
uB
-ju
-ju
-ju
+RI
+RI
+RI
ab
ab
ab
@@ -8737,10 +8741,10 @@ mF
nc
ju
bh
-ju
+RI
oz
-ju
-ju
+RI
+RI
nf
ab
ab
@@ -8835,12 +8839,12 @@ bF
ca
bL
bO
-bQ
-bi
Qt
+bi
+yd
oB
-ju
-ju
+RI
+RI
nf
ab
ab
@@ -8887,7 +8891,7 @@ bM
RV
tW
RE
-ju
+RI
oH
nf
ab
@@ -8937,7 +8941,7 @@ bN
bP
cl
cn
-ju
+RI
ab
ab
ab
@@ -8987,7 +8991,7 @@ mK
kD
cm
co
-ju
+RI
ab
ab
ab
@@ -9034,10 +9038,10 @@ Au
kD
bB
ju
-ju
-ju
-ju
-ju
+RI
+RI
+RI
+RI
ab
ab
ab
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 5ebe99b8b3f..bdab042262c 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -17671,7 +17671,7 @@
/obj/item/reagent_containers/food/drinks/drinkingglass{
pixel_x = -5
},
-/obj/item/reagent_containers/food/drinks/waterbottle,
+/obj/item/reagent_containers/glass/beaker/waterbottle,
/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"aDE" = (
@@ -18969,7 +18969,7 @@
/area/crew_quarters/courtroom)
"aGr" = (
/obj/structure/table/reinforced,
-/obj/item/reagent_containers/food/drinks/waterbottle,
+/obj/item/reagent_containers/glass/beaker/waterbottle,
/turf/simulated/floor/plasteel{
icon_state = "red";
dir = 4
@@ -20138,7 +20138,7 @@
/area/crew_quarters/courtroom)
"aIX" = (
/obj/structure/table/wood,
-/obj/item/reagent_containers/food/drinks/waterbottle{
+/obj/item/reagent_containers/glass/beaker/waterbottle{
pixel_x = 5
},
/obj/item/reagent_containers/food/drinks/drinkingglass{
@@ -22042,7 +22042,7 @@
/obj/item/reagent_containers/food/drinks/drinkingglass{
pixel_x = -5
},
-/obj/item/reagent_containers/food/drinks/waterbottle{
+/obj/item/reagent_containers/glass/beaker/waterbottle{
pixel_x = 5
},
/turf/simulated/floor/carpet,
@@ -22758,7 +22758,7 @@
/area/maintenance/fpmaint)
"aOw" = (
/obj/structure/table/wood,
-/obj/item/reagent_containers/food/drinks/waterbottle{
+/obj/item/reagent_containers/glass/beaker/waterbottle{
pixel_x = 5
},
/obj/item/reagent_containers/food/drinks/drinkingglass{
diff --git a/_maps/map_files/templates/shelter_1.dmm b/_maps/map_files/templates/shelter_1.dmm
index 0cebbd66b5f..0123bf7329c 100644
--- a/_maps/map_files/templates/shelter_1.dmm
+++ b/_maps/map_files/templates/shelter_1.dmm
@@ -15,7 +15,7 @@
/turf/simulated/floor/pod,
/area/survivalpod)
"d" = (
-/obj/machinery/smartfridge/survival_pod/loaded,
+/obj/machinery/smartfridge/survival_pod,
/turf/simulated/floor/pod,
/area/survivalpod)
"e" = (
@@ -30,6 +30,9 @@
/area/survivalpod)
"g" = (
/obj/machinery/sleeper/survival_pod,
+/obj/machinery/vending/wallmed1/survival_pod{
+ pixel_x = -24
+ },
/turf/simulated/floor/pod,
/area/survivalpod)
"h" = (
diff --git a/_maps/map_files/templates/shelter_2.dmm b/_maps/map_files/templates/shelter_2.dmm
index 4a6b445ab4c..1c2e99a0c4d 100644
--- a/_maps/map_files/templates/shelter_2.dmm
+++ b/_maps/map_files/templates/shelter_2.dmm
@@ -9,7 +9,7 @@
/turf/simulated/wall/mineral/titanium/survival,
/area/survivalpod)
"c" = (
-/obj/machinery/smartfridge/survival_pod/loaded,
+/obj/machinery/smartfridge/survival_pod,
/turf/simulated/floor/pod,
/area/survivalpod)
"d" = (
@@ -39,6 +39,9 @@
/area/survivalpod)
"i" = (
/obj/machinery/sleeper/survival_pod,
+/obj/machinery/vending/wallmed1/survival_pod{
+ pixel_x = -24
+ },
/turf/simulated/floor/pod,
/area/survivalpod)
"j" = (
@@ -161,7 +164,7 @@
icon_state = "cutout_lusty";
name = "lusty xenomorph maid"
},
- /turf/simulated/floor/carpet/black,
+/turf/simulated/floor/carpet/black,
/area/survivalpod)
"A" = (
/obj/structure/table/wood/fancy/black,
diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
index 62b4f55470e..b9902dbb066 100644
--- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
@@ -56,6 +56,9 @@
/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume
name = "large dual port air vent"
+/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume/on
+ on = TRUE
+
/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume/New()
..()
air1.volume = 1000
diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm
index a4d012df464..662b0958d5c 100644
--- a/code/datums/cache/air_alarm.dm
+++ b/code/datums/cache/air_alarm.dm
@@ -13,15 +13,16 @@ var/global/datum/repository/air_alarm/air_alarm_repository = new()
if(SSticker && SSticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time
alarms = cache_entry.data // Don't deleate the list
- if(is_station_contact(passed_alarm.z)) // Still need sanity checks
+ if(is_station_contact(passed_alarm.z) && passed_alarm.remote_control) // Still need sanity checks
alarms[++alarms.len] = passed_alarm.get_nano_data_console()
else
for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : GLOB.air_alarms)) // Generating the whole list again is a bad habit but I can't be bothered to fix it right now
if(!monitored_alarms && !is_station_contact(alarm.z))
continue
+ if(!alarm.remote_control)
+ continue
alarms[++alarms.len] = alarm.get_nano_data_console()
-
cache_entry.timestamp = world.time //+ 10 SECONDS
cache_entry.data = alarms
return alarms
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 82fe75b3cf7..91af56437cf 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -1964,7 +1964,7 @@ var/list/ghostteleportlocs = list()
/area/traitor
name = "\improper Syndicate Base"
icon_state = "syndie_hall"
- report_alerts = 0
+ report_alerts = FALSE
/area/traitor/rnd
name = "\improper Syndicate Research and Development"
@@ -2134,7 +2134,7 @@ var/list/ghostteleportlocs = list()
/area/awaymission
name = "\improper Strange Location"
icon_state = "away"
- report_alerts = 0
+ report_alerts = FALSE
/area/awaymission/example
name = "\improper Strange Station"
@@ -2160,7 +2160,7 @@ var/list/ghostteleportlocs = list()
/area/awaycontent
name = "space"
- report_alerts = 0
+ report_alerts = FALSE
/area/awaycontent/a1
icon_state = "awaycontent1"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 8e9505095f2..638fe29ab6d 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -19,9 +19,9 @@
var/eject = null
- var/debug = 0
+ var/debug = FALSE
var/requires_power = TRUE
- var/always_unpowered = 0 //this gets overriden to 1 for space in area/New()
+ var/always_unpowered = FALSE //this gets overriden to 1 for space in area/New()
var/power_equip = TRUE
var/power_light = TRUE
@@ -33,7 +33,7 @@
var/static_equip
var/static_light = FALSE
var/static_environ
-
+
var/has_gravity = TRUE
var/list/apc = list()
var/no_air = null
@@ -128,10 +128,11 @@
/area/proc/atmosalert(danger_level, var/alarm_source, var/force = FALSE)
- if(danger_level == ATMOS_ALARM_NONE)
- SSalarms.atmosphere_alarm.clearAlarm(src, alarm_source)
- else
- SSalarms.atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level)
+ if(report_alerts)
+ if(danger_level == ATMOS_ALARM_NONE)
+ SSalarms.atmosphere_alarm.clearAlarm(src, alarm_source)
+ else
+ SSalarms.atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level)
//Check all the alarms before lowering atmosalm. Raising is perfectly fine. If force = 1 we don't care.
for(var/obj/machinery/alarm/AA in src)
diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm
index fcf43f23ad1..450470c8c61 100644
--- a/code/game/area/areas/ruins/lavaland.dm
+++ b/code/game/area/areas/ruins/lavaland.dm
@@ -36,6 +36,7 @@
name = "Secret Base"
icon_state = "dk_yellow"
ambientsounds = list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg')
+ report_alerts = FALSE
/area/ruin/unpowered/syndicate_lava_base/engineering
name = "Syndicate Lavaland Engineering"
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index ed89a75cd5d..525eb10e52f 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -398,8 +398,8 @@
return
-/atom/movable/proc/water_act(var/volume, var/temperature, var/source) //amount of water acting : temperature of water in kelvin : object that called it (for shennagins)
- return 1
+/atom/movable/proc/water_act(volume, temperature, source, method = TOUCH) //amount of water acting : temperature of water in kelvin : object that called it (for shennagins)
+ return TRUE
/atom/movable/proc/handle_buckled_mob_movement(newloc,direct)
if(!buckled_mob.Move(newloc, direct))
diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm
index 63f9d5fbaff..2137888d0b8 100644
--- a/code/game/gamemodes/autotraitor/autotraitor.dm
+++ b/code/game/gamemodes/autotraitor/autotraitor.dm
@@ -96,7 +96,7 @@
for(var/obj/item/implant/mindshield/I in H.contents)
if(I && I.implanted)
possible_traitors -= player
- if(!H.job) //Golems, special events stuff, etc.
+ if(!H.job || H.mind.offstation_role) //Golems, special events stuff, etc.
possible_traitors -= player
//message_admins("Live Players: [playercount]")
//message_admins("Live Traitors: [traitorcount]")
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index f1f5d4af878..ecb566af64e 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -344,6 +344,10 @@
to_chat(S, "We have created these for our own benefit. Aborting.")
return FALSE
+/obj/structure/shuttle/engine/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ to_chat(S, "This shuttle may be important to us later. Aborting.")
+ return FALSE
+
////END CTRL CLICK FOR SWARMERS////
/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(var/atom/fabrication_object,var/fabrication_cost = 0)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 5b06e09f5ba..ef68117e1c4 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -532,7 +532,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
var/list/priority_targets = list()
for(var/datum/mind/possible_target in SSticker.minds)
- if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && (possible_target.assigned_role != possible_target.special_role))
+ if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && (possible_target.assigned_role != possible_target.special_role) && !possible_target.offstation_role)
possible_targets += possible_target
for(var/role in roles)
if(possible_target.assigned_role == role)
diff --git a/code/game/jobs/job_objective.dm b/code/game/jobs/job_objective.dm
index 4456bb571e5..48fa911bcf5 100644
--- a/code/game/jobs/job_objective.dm
+++ b/code/game/jobs/job_objective.dm
@@ -49,7 +49,7 @@
if(!employee.job_objectives.len)//If the employee had no objectives, don't need to process this.
continue
- if(employee.assigned_role == employee.special_role) //If the character is an offstation character, skip them.
+ if(employee.assigned_role == employee.special_role || employee.offstation_role) //If the character is an offstation character, skip them.
continue
var/tasks_completed=0
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 9a062d31de4..52cd5bdfee8 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -86,8 +86,8 @@
var/frequency = ATMOS_VENTSCRUB
//var/skipprocess = 0 //Experimenting
var/alarm_frequency = ATMOS_FIRE_FREQ
- var/remote_control = 0
- var/rcon_setting = 2
+ var/remote_control = TRUE
+ var/rcon_setting = RCON_AUTO
var/rcon_time = 0
var/locked = 1
var/datum/wires/alarm/wires = null
@@ -98,7 +98,7 @@
// Waiting on a device to respond.
// Specifies an id_tag. NULL means we aren't waiting.
- var/waiting_on_device=null
+ var/waiting_on_device = null
var/mode = AALARM_MODE_SCRUBBING
var/preset = AALARM_PRESET_HUMAN
@@ -117,16 +117,18 @@
var/list/TLV = list()
- var/report_danger_level = 1
+ var/report_danger_level = TRUE
- var/automatic_emergency = 1 //Does the alarm automaticly respond to an emergency condition
+ var/automatic_emergency = TRUE //Does the alarm automaticly respond to an emergency condition
/obj/machinery/alarm/monitor
- report_danger_level = 0
+ report_danger_level = FALSE
/obj/machinery/alarm/syndicate //general syndicate access
- report_danger_level = 0
+ report_danger_level = FALSE
+ remote_control = FALSE
req_access = list(access_syndicate)
+ req_one_access = list()
/obj/machinery/alarm/monitor/server
preset = AALARM_PRESET_SERVER
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index b2a62492c7c..a93f3b253f2 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1130,10 +1130,10 @@
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?"
icon_state = "wallmed"
icon_deny = "wallmed-deny"
- req_access_txt = "5"
- density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
+ req_access = list(access_medical)
+ density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/ointment = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4, /obj/item/healthanalyzer = 1)
- contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4,/obj/item/reagent_containers/syringe/antiviral = 4,/obj/item/reagent_containers/food/pill/tox = 1)
+ contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4, /obj/item/reagent_containers/syringe/antiviral = 4, /obj/item/reagent_containers/food/pill/tox = 1)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
/obj/machinery/vending/wallmed2
@@ -1141,10 +1141,10 @@
desc = "Wall-mounted Medical Equipment dispenser."
icon_state = "wallmed"
icon_deny = "wallmed-deny"
- req_access_txt = "5"
- density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
- products = list(/obj/item/reagent_containers/hypospray/autoinjector = 5,/obj/item/reagent_containers/syringe/charcoal = 3,/obj/item/stack/medical/bruise_pack = 3,
- /obj/item/stack/medical/ointment =3,/obj/item/healthanalyzer = 3)
+ req_access = list(access_medical)
+ density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude
+ products = list(/obj/item/reagent_containers/hypospray/autoinjector = 5, /obj/item/reagent_containers/syringe/charcoal = 3, /obj/item/stack/medical/bruise_pack = 3,
+ /obj/item/stack/medical/ointment = 3, /obj/item/healthanalyzer = 3)
contraband = list(/obj/item/reagent_containers/food/pill/tox = 3)
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0)
diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
index bb6cca92644..23b1aaa0d2e 100644
--- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm
+++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm
@@ -1,16 +1,23 @@
//temporary visual effects
/obj/effect/temp_visual
- anchored = 1
+ icon_state = "nothing"
+ anchored = TRUE
layer = ABOVE_MOB_LAYER
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- var/duration = 10
+ var/duration = 10 //in deciseconds
var/randomdir = TRUE
+ var/timerid
-/obj/effect/temp_visual/New()
+/obj/effect/temp_visual/Initialize(mapload)
+ . = ..()
if(randomdir)
setDir(pick(cardinal))
- QDEL_IN(src, duration)
+ timerid = QDEL_IN(src, duration)
+
+/obj/effect/temp_visual/Destroy()
+ . = ..()
+ deltimer(timerid)
/obj/effect/temp_visual/singularity_act()
return
@@ -24,7 +31,7 @@
/obj/effect/temp_visual/dir_setting
randomdir = FALSE
-/obj/effect/temp_visual/dir_setting/New(loc, set_dir)
+/obj/effect/temp_visual/dir_setting/Initialize(mapload, set_dir)
if(set_dir)
setDir(set_dir)
- ..()
\ No newline at end of file
+ . = ..()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index a8803ffb6ed..073cd0df669 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -149,6 +149,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
/obj/item/blob_act()
qdel(src)
+/obj/item/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ extinguish()
+
/obj/item/verb/move_to_top()
set name = "Move To Top"
set category = null
diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm
index a975a0b4d06..fb59b24aeda 100644
--- a/code/game/objects/items/dehy_carp.dm
+++ b/code/game/objects/items/dehy_carp.dm
@@ -22,6 +22,10 @@
owned = 0
return ..()
+/obj/item/toy/carpplushie/dehy_carp/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ if(volume >= 1)
+ Swell()
/obj/item/toy/carpplushie/dehy_carp/afterattack(obj/O, mob/user,proximity)
if(!proximity) return
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index af9e0abc920..db7c08b1863 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -205,7 +205,12 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
else
..()
-//Step two - washing..... it's actually in washing machine code.
+//Step two - washing (also handled by water reagent code and washing machine code)
+/obj/item/stack/sheet/hairlesshide/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ if(volume >= 10)
+ new /obj/item/stack/sheet/wetleather(get_turf(src), amount)
+ qdel(src)
//Step three - drying
/obj/item/stack/sheet/wetleather/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 2c1222154b0..94f195e9c20 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -385,8 +385,8 @@ var/global/list/datum/stack_recipe/brass_recipes = list (\
GLOBAL_LIST_INIT(plastic_recipes, list(
new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = 1, on_floor = 1, time = 40), \
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2), \
- new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/food/drinks/waterbottle/empty), \
- new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/food/drinks/waterbottle/large/empty,3), \
+ new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
+ new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
new /datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("plastic ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("plastic fork", /obj/item/kitchen/utensil/pfork, 1, on_floor = 1), \
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index b48774eb046..726d9a88a7f 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -600,7 +600,7 @@
wateract = (W.wash(user, src))
busy = 0
if(wateract)
- W.water_act(20,310.15,src)
+ W.water_act(20, 310.15, src)
if("Disconnect")
user.visible_message("[user] starts disconnecting [src].", "You begin disconnecting [src]...")
if(do_after(user, 40 * O.toolspeed, target = src))
@@ -633,7 +633,7 @@
wateract = (O.wash(user, src))
busy = 0
if(wateract)
- O.water_act(20,310.15,src)
+ O.water_act(20, 310.15, src)
/obj/structure/sink/update_icon()
..()
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index a80bab94055..816cde709ce 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -18,8 +18,25 @@
visibilityChanged()
/turf/simulated/proc/break_tile()
+ return
/turf/simulated/proc/burn_tile()
+ return
+
+/turf/simulated/proc/water_act(volume, temperature, source)
+ if(volume >= 3)
+ MakeSlippery()
+
+ for(var/mob/living/carbon/slime/M in src)
+ M.apply_water()
+
+ var/hotspot = (locate(/obj/effect/hotspot) in src)
+ if(hotspot)
+ var/datum/gas_mixture/lowertemp = remove_air(air.total_moles())
+ lowertemp.temperature = max(min(lowertemp.temperature-2000,lowertemp.temperature / 2), 0)
+ lowertemp.react()
+ assume_air(lowertemp)
+ qdel(hotspot)
/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost
if(wet >= wet_setting)
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 2877f9f01d5..7a3e7c74328 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -120,30 +120,31 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
/turf/simulated/floor/proc/make_plating()
return ChangeTurf(/turf/simulated/floor/plating)
-/turf/simulated/floor/ChangeTurf(turf/simulated/floor/T, defer_change = FALSE, keep_icon = TRUE)
- if(!istype(src,/turf/simulated/floor)) return ..() //fucking turfs switch the fucking src of the fucking running procs
- if(!ispath(T,/turf/simulated/floor)) return ..()
- var/old_icon = icon_regular_floor
- var/old_plating = icon_plating
- var/old_dir = dir
+/turf/simulated/floor/ChangeTurf(turf/simulated/floor/T, defer_change = FALSE, ignore_air = FALSE)
+ if(!istype(src,/turf/simulated/floor))
+ return ..() //fucking turfs switch the fucking src of the fucking running procs
+ if(!ispath(T,/turf/simulated/floor))
+ return ..()
+
var/turf/simulated/floor/W = ..()
- if(keep_icon)
- W.icon_regular_floor = old_icon
- W.icon_plating = old_plating
- W.dir = old_dir
+
W.update_icon()
return W
/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob, params)
if(!C || !user)
- return 1
+ return TRUE
+
if(..())
- return 1
+ return TRUE
+
if(intact && iscrowbar(C))
pry_tile(C, user)
- return 1
+ return TRUE
+
if(intact && istype(C, /obj/item/stack/tile))
try_replace_tile(C, user, params)
+
if(istype(C, /obj/item/pipe))
var/obj/item/pipe/P = C
if(P.pipe_type != -1) // ANY PIPE
@@ -152,6 +153,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
"You slide [P] along \the [src].", \
"You hear the scrape of metal against something.")
user.drop_item()
+
if(P.is_bent_pipe()) // bent pipe rotation fix see construction.dm
P.dir = 5
if(user.dir == 1)
@@ -161,13 +163,14 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
else if(user.dir == 4)
P.dir = 10
else
- P.dir = user.dir
+ P.setDir(user.dir)
+
P.x = src.x
P.y = src.y
P.z = src.z
- P.loc = src
- return 1
- return 0
+ P.forceMove(src)
+ return TRUE
+ return FALSE
/turf/simulated/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
if(T.turf_type == type)
diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm
index 1a8522ba9be..52dcf899894 100644
--- a/code/game/turfs/simulated/floor/asteroid.dm
+++ b/code/game/turfs/simulated/floor/asteroid.dm
@@ -18,6 +18,9 @@
if(prob(floor_variance))
icon_state = "[environment_type][rand(0,12)]"
+/turf/simulated/floor/plating/asteroid/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
+ return
+
/turf/simulated/floor/plating/asteroid/burn_tile()
return
@@ -58,14 +61,14 @@
gets_dug()
return
- if(istype(W,/obj/item/storage/bag/ore))
+ else if(istype(W,/obj/item/storage/bag/ore))
var/obj/item/storage/bag/ore/S = W
if(S.collection_mode == 1)
for(var/obj/item/stack/ore/O in src.contents)
O.attackby(W,user)
return
- if(istype(W, /obj/item/stack/tile))
+ else if(istype(W, /obj/item/stack/tile))
var/obj/item/stack/tile/Z = W
if(!Z.use(1))
return
@@ -164,7 +167,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
has_data = TRUE
/turf/simulated/floor/plating/asteroid/airless/cave/volcanic
- mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \
+ mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 40, /mob/living/simple_animal/hostile/spawner/lavaland = 2, \
/mob/living/simple_animal/hostile/asteroid/hivelord/legion = 30, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \
SPAWN_MEGAFAUNA = 6, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10)
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 6218b2a702d..a125f9ff543 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -25,16 +25,16 @@
/turf/simulated/floor/plating/attackby(obj/item/C, mob/user, params)
if(..())
- return 1
+ return TRUE
if(istype(C, /obj/item/stack/rods))
if(broken || burnt)
to_chat(user, "Repair the plating first!")
- return 1
+ return TRUE
var/obj/item/stack/rods/R = C
if(R.get_amount() < 2)
to_chat(user, "You need two rods to make a reinforced floor!")
- return 1
+ return TRUE
else
to_chat(user, "You begin reinforcing the floor...")
if(do_after(user, 30 * C.toolspeed, target = src))
@@ -43,7 +43,7 @@
playsound(src, C.usesound, 80, 1)
R.use(2)
to_chat(user, "You reinforce the floor.")
- return 1
+ return TRUE
else if(istype(C, /obj/item/stack/tile))
if(!broken && !burnt)
@@ -54,20 +54,20 @@
playsound(src, 'sound/weapons/genhit.ogg', 50, 1)
else
to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.")
- return 1
+ return TRUE
else if(istype(C, /obj/item/weldingtool))
var/obj/item/weldingtool/welder = C
- if( welder.isOn() && (broken || burnt) )
- if(welder.remove_fuel(0,user))
+ if(welder.isOn() && (broken || burnt))
+ if(welder.remove_fuel(0, user))
to_chat(user, "You fix some dents on the broken plating.")
playsound(src, welder.usesound, 80, 1)
overlays -= current_overlay
current_overlay = null
- burnt = 0
- broken = 0
+ burnt = FALSE
+ broken = FALSE
update_icon()
- return 1
+ return TRUE
/turf/simulated/floor/plating/airless
icon_state = "plating"
@@ -103,6 +103,9 @@
/turf/simulated/floor/engine/attack_hand(mob/user as mob)
user.Move_Pulled(src)
+/turf/simulated/floor/engine/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
+ return
+
/turf/simulated/floor/engine/attackby(obj/item/C as obj, mob/user as mob, params)
if(!C || !user)
return
@@ -115,6 +118,7 @@
new /obj/item/stack/rods(src, 2)
ChangeTurf(/turf/simulated/floor/plating)
return
+
if(istype(C, /obj/item/stack/sheet/plasteel) && !insulated) //Insulating the floor
to_chat(user, "You begin insulating [src]...")
if(do_after(user, 40, target = src) && !insulated) //You finish insulating the insulated insulated insulated insulated insulated insulated insulated insulated vacuum floor
@@ -220,6 +224,9 @@
/turf/simulated/floor/snow/ex_act(severity)
return
+/turf/simulated/floor/snow/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
+ return
+
/turf/simulated/floor/plating/metalfoam
name = "foamed metal plating"
icon_state = "metalfoam"
@@ -236,6 +243,9 @@
if(MFOAM_IRON)
icon_state = "ironfoam"
+/turf/simulated/floor/plating/metalfoam/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
+ return
+
/turf/simulated/floor/plating/metalfoam/attackby(var/obj/item/C, mob/user, params)
if(..())
return 1
@@ -277,3 +287,12 @@
/turf/simulated/floor/plating/abductor/New()
..()
icon_state = "alienpod[rand(1,9)]"
+
+/turf/simulated/floor/plating/abductor/break_tile()
+ return //unbreakable
+
+/turf/simulated/floor/plating/abductor/burn_tile()
+ return //unburnable
+
+/turf/simulated/floor/plating/abductor/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
+ return
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index ad3e981154d..119f0b000d9 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -22,7 +22,7 @@
var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles
var/last_act = 0
var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner
- var/defer_change = 0
+ var/defer_change = FALSE
/turf/simulated/mineral/New()
if (!canSmoothWith)
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index 21f29e3db47..74d0e216614 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -275,8 +275,19 @@
icon_state = "map-overspace"
fixed_underlay = list("space"=1)
+/turf/simulated/wall/mineral/plastitanium/coated
+ name = "coated wall"
+ max_temperature = INFINITY
+ icon_state = "map-shuttle_nd"
+ smooth = SMOOTH_MORE
+
+/turf/simulated/wall/mineral/plastitanium/coated/Initialize(mapload)
+ . = ..()
+ desc += " It seems to have additional plating to protect against heat."
+
/turf/simulated/wall/mineral/plastitanium/explosive
var/explosive_wall_group = EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE
+ icon_state = "map-shuttle_nd"
smooth = SMOOTH_MORE
/turf/simulated/wall/mineral/plastitanium/explosive/Initialize(mapload)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 19090102611..711d173a25d 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -180,11 +180,11 @@
if(L)
qdel(L)
-/turf/proc/TerraformTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
- return ChangeTurf(path, defer_change, keep_icon, ignore_air)
+/turf/proc/TerraformTurf(path, defer_change = FALSE, ignore_air = FALSE)
+ return ChangeTurf(path, defer_change, ignore_air)
//Creates a new turf
-/turf/proc/ChangeTurf(path, defer_change = FALSE, keep_icon = TRUE, ignore_air = FALSE)
+/turf/proc/ChangeTurf(path, defer_change = FALSE, ignore_air = FALSE)
if(!path)
return
if(!use_preloader && path == type) // Don't no-op if the map loader requires it to be reconstructed
@@ -209,7 +209,6 @@
if(!defer_change)
W.AfterChange(ignore_air)
-
W.blueprint_data = old_blueprint_data
recalc_atom_opacity()
diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm
index 816007d4ff8..50e0a7a3a2f 100644
--- a/code/modules/awaymissions/maploader/reader.dm
+++ b/code/modules/awaymissions/maploader/reader.dm
@@ -176,7 +176,7 @@ var/global/dmm_suite/preloader/_preloader = new
for(var/t in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])))
var/turf/T = t
//we do this after we load everything in. if we don't; we'll have weird atmos bugs regarding atmos adjacent turfs
- T.AfterChange(1,keep_cabling = TRUE)
+ T.AfterChange(1, keep_cabling = TRUE)
return bounds
/**
@@ -321,7 +321,7 @@ var/global/dmm_suite/preloader/_preloader = new
var/turf/T = locate(x,y,z)
if(T)
if(ispath(path, /turf))
- T.ChangeTurf(path, 1, 0)
+ T.ChangeTurf(path, TRUE)
instance = T
else if(ispath(path, /area))
diff --git a/code/modules/awaymissions/mission_code/academy.dm b/code/modules/awaymissions/mission_code/academy.dm
index 9ae1cdb223e..2c764443e72 100644
--- a/code/modules/awaymissions/mission_code/academy.dm
+++ b/code/modules/awaymissions/mission_code/academy.dm
@@ -3,7 +3,7 @@
/area/awaymission/academy
name = "\improper Academy Asteroids"
icon_state = "away"
- report_alerts = 0
+ report_alerts = FALSE
/area/awaymission/academy/headmaster
name = "\improper Academy Fore Block"
diff --git a/code/modules/awaymissions/mission_code/centcomAway.dm b/code/modules/awaymissions/mission_code/centcomAway.dm
index 447c53b0fb6..1dc26f932e0 100644
--- a/code/modules/awaymissions/mission_code/centcomAway.dm
+++ b/code/modules/awaymissions/mission_code/centcomAway.dm
@@ -3,7 +3,7 @@
/area/awaymission/centcomAway
name = "XCC-P5831"
icon_state = "away"
- report_alerts = 0
+ report_alerts = FALSE
/area/awaymission/centcomAway/general
name = "XCC-P5831"
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 785231a588d..41c5ff0bdf3 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -354,31 +354,6 @@
icon_state = "goonbag"
list_reagents = list("wine" = 70)
-/obj/item/reagent_containers/food/drinks/waterbottle
- name = "bottle of water"
- desc = "A bottle of water filled at an old Earth bottling facility."
- icon = 'icons/obj/drinks.dmi'
- icon_state = "smallbottle"
- item_state = "bottle"
- list_reagents = list("water" = 49.5, "fluorine" = 0.5) //see desc, don't think about it too hard
- materials = list(MAT_GLASS = 0)
- volume = 50
- amount_per_transfer_from_this = 10
-
-/obj/item/reagent_containers/food/drinks/waterbottle/empty
- list_reagents = list()
-
-/obj/item/reagent_containers/food/drinks/waterbottle/large
- desc = "A fresh commercial-sized bottle of water."
- icon_state = "largebottle"
- materials = list(MAT_GLASS = 0)
- list_reagents = list("water" = 100)
- volume = 100
- amount_per_transfer_from_this = 20
-
-/obj/item/reagent_containers/food/drinks/waterbottle/large/empty
- list_reagents = list()
-
/obj/item/reagent_containers/food/drinks/oilcan
name = "oil can"
desc = "Contains oil intended for use on cyborgs, robots, and other synthetics."
diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm
index 7d557561e49..fdcf4d2497a 100644
--- a/code/modules/food_and_drinks/food/foods/meat.dm
+++ b/code/modules/food_and_drinks/food/foods/meat.dm
@@ -237,8 +237,9 @@
var/datum/species/monkey_type = /datum/species/monkey
list_reagents = list("nutriment" = 2)
-/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature)
- if(volume >= 5)
+/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ if(volume >= 1)
return Expand()
/obj/item/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 132b2257bfd..e623cda0de0 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -11,17 +11,15 @@
idle_power_usage = 5
active_power_usage = 100
var/max_n_of_items = 1500
- var/icon_on = "smartfridge"
- var/icon_off = "smartfridge-off"
- var/icon_panel = "smartfridge-panel"
var/item_quants = list()
- var/seconds_electrified = 0;
- var/shoot_inventory = 0
- var/locked = 0
- var/scan_id = 1
- var/is_secure = 0
+ var/seconds_electrified = 0
+ var/shoot_inventory = FALSE
+ var/locked = FALSE
+ var/scan_id = TRUE
+ var/is_secure = FALSE
var/can_dry = FALSE
var/drying = FALSE
+ var/visible_contents = TRUE
var/datum/wires/smartfridge/wires = null
/obj/machinery/smartfridge/New()
@@ -65,8 +63,6 @@
desc = "When you need seeds fast!"
icon = 'icons/obj/vending.dmi'
icon_state = "seeds"
- icon_on = "seeds"
- icon_off = "seeds-off"
/obj/machinery/smartfridge/seeds/accept_check(obj/item/O)
if(istype(O,/obj/item/seeds/))
@@ -77,7 +73,6 @@
name = "\improper Refrigerated Medicine Storage"
desc = "A refrigerated storage unit for storing medicine and chemicals."
icon_state = "smartfridge" //To fix the icon in the map editor.
- icon_on = "smartfridge"
/obj/machinery/smartfridge/medbay/accept_check(obj/item/O)
if(istype(O,/obj/item/reagent_containers/glass))
@@ -104,7 +99,6 @@
name = "\improper Secure Refrigerated Medicine Storage"
desc = "A refrigerated storage unit for storing medicine and chemicals."
icon_state = "smartfridge" //To fix the icon in the map editor.
- icon_on = "smartfridge"
req_one_access_txt = "5;33"
/obj/machinery/smartfridge/secure/medbay/accept_check(obj/item/O)
@@ -122,7 +116,6 @@
name = "\improper Smart Chemical Storage"
desc = "A refrigerated storage unit for medicine and chemical storage."
icon_state = "smartfridge" //To fix the icon in the map editor.
- icon_on = "smartfridge"
req_access_txt = "33"
var/list/spawn_meds = list()
@@ -162,12 +155,7 @@
desc = "A machine capable of storing a variety of disks. Denoted by most as the DSU (disk storage unit)."
icon_state = "disktoaster"
pass_flags = PASSTABLE
-
-/obj/machinery/smartfridge/disks/accept_check(obj/item/O)
- if(istype(O, /obj/item/disk/))
- return TRUE
- else
- return FALSE
+ visible_contents = FALSE
// ----------------------------
// Virology Medical Smartfridge
@@ -227,7 +215,7 @@
/obj/machinery/smartfridge/update_icon()
if(stat & (BROKEN|NOPOWER))
icon_state = "[initial(icon_state)]-off"
- else
+ else if(visible_contents)
switch(contents.len)
if(0)
icon_state = "[initial(icon_state)]"
@@ -237,6 +225,8 @@
icon_state = "[initial(icon_state)]2"
if(76 to INFINITY)
icon_state = "[initial(icon_state)]3"
+ else
+ icon_state = "[initial(icon_state)]"
/*******************
* Item Adding
@@ -460,13 +450,12 @@
name = "drying rack"
desc = "A wooden contraption, used to dry plant products, food and leather."
icon = 'icons/obj/hydroponics/equipment.dmi'
- icon_state = "drying_rack_on"
+ icon_state = "drying_rack"
use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 200
- icon_on = "drying_rack_on"
- icon_off = "drying_rack"
can_dry = TRUE
+ visible_contents = FALSE
/obj/machinery/smartfridge/drying_rack/New()
..()
@@ -524,6 +513,7 @@
/obj/machinery/smartfridge/drying_rack/update_icon()
..()
+
overlays.Cut()
if(drying)
overlays += "drying_rack_drying"
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
new file mode 100644
index 00000000000..d846e065761
--- /dev/null
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -0,0 +1,357 @@
+/area/survivalpod
+ name = "\improper Emergency Shelter"
+ icon_state = "away"
+ requires_power = FALSE
+ has_gravity = TRUE
+ dynamic_lighting = DYNAMIC_LIGHTING_FORCED
+
+/obj/item/survivalcapsule
+ name = "bluespace shelter capsule"
+ desc = "An emergency shelter stored within a pocket of bluespace."
+ icon_state = "capsule"
+ icon = 'icons/obj/mining.dmi'
+ w_class = WEIGHT_CLASS_TINY
+ origin_tech = "engineering=3;bluespace=3"
+ var/template_id = "shelter_alpha"
+ var/datum/map_template/shelter/template
+ var/used = FALSE
+
+/obj/item/survivalcapsule/proc/get_template()
+ if(template)
+ return
+ template = shelter_templates[template_id]
+ if(!template)
+ log_runtime("Shelter template ([template_id]) not found!", src)
+ qdel(src)
+
+/obj/item/survivalcapsule/examine(mob/user)
+ . = ..()
+ get_template()
+ to_chat(user, "This capsule has the [template.name] stored.")
+ to_chat(user, template.description)
+
+/obj/item/survivalcapsule/attack_self()
+ // Can't grab when capsule is New() because templates aren't loaded then
+ get_template()
+ if(used == FALSE)
+ loc.visible_message("[src] begins to shake. Stand back!")
+ used = TRUE
+ sleep(50)
+ var/turf/deploy_location = get_turf(src)
+ var/status = template.check_deploy(deploy_location)
+ switch(status)
+ if(SHELTER_DEPLOY_BAD_AREA)
+ loc.visible_message("[src] will not function in this area.")
+ if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS)
+ var/width = template.width
+ var/height = template.height
+ loc.visible_message("[src] doesn't have room to deploy! You need to clear a [width]x[height] area!")
+
+ if(status != SHELTER_DEPLOY_ALLOWED)
+ used = FALSE
+ return
+
+ playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1)
+
+ var/turf/T = deploy_location
+ if(!is_mining_level(T.z))//only report capsules away from the mining/lavaland level
+ message_admins("[key_name_admin(usr)] ([ADMIN_QUE(usr,"?")]) ([ADMIN_FLW(usr,"FLW")]) activated a bluespace capsule away from the mining level! (JMP)")
+ log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
+ template.load(deploy_location, centered = TRUE)
+ new /obj/effect/particle_effect/smoke(get_turf(src))
+ qdel(src)
+
+/obj/item/survivalcapsule/luxury
+ name = "luxury bluespace shelter capsule"
+ desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace."
+ origin_tech = "engineering=3;bluespace=4"
+ template_id = "shelter_beta"
+
+//Pod turfs and objects
+
+//Window
+/obj/structure/window/shuttle/survival_pod
+ name = "pod window"
+ icon = 'icons/obj/smooth_structures/pod_window.dmi'
+ icon_state = "smooth"
+ dir = FULLTILE_WINDOW_DIR
+ max_integrity = 100
+ fulltile = TRUE
+ reinf = TRUE
+ heat_resistance = 1600
+ armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100)
+ smooth = SMOOTH_MORE
+ canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod)
+ explosion_block = 3
+ level = 3
+ glass_type = /obj/item/stack/sheet/titaniumglass
+ glass_amount = 2
+
+/obj/structure/window/reinforced/survival_pod
+ name = "pod window"
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "pwindow"
+
+//Floors
+/turf/simulated/floor/pod
+ name = "pod floor"
+ icon_state = "podfloor"
+ icon_regular_floor = "podfloor"
+ floor_tile = /obj/item/stack/tile/pod
+
+/turf/simulated/floor/pod/light
+ icon_state = "podfloor_light"
+ icon_regular_floor = "podfloor_light"
+ floor_tile = /obj/item/stack/tile/pod/light
+
+/turf/simulated/floor/pod/dark
+ icon_state = "podfloor_dark"
+ icon_regular_floor = "podfloor_dark"
+ floor_tile = /obj/item/stack/tile/pod/dark
+
+//Door
+/obj/machinery/door/airlock/survival_pod
+ icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_pod
+
+/obj/machinery/door/airlock/survival_pod/glass
+ opacity = FALSE
+ glass = TRUE
+
+/obj/structure/door_assembly/door_assembly_pod
+ name = "pod airlock assembly"
+ icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
+ base_name = "pod airlock"
+ overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
+ airlock_type = /obj/machinery/door/airlock/survival_pod
+ glass_type = /obj/machinery/door/airlock/survival_pod/glass
+
+//Windoor
+/obj/machinery/door/window/survival_pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "windoor"
+ base_state = "windoor"
+
+//Table
+/obj/structure/table/survival_pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "table"
+ smooth = SMOOTH_FALSE
+
+//Sleeper
+/obj/machinery/sleeper/survival_pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "sleeper-open"
+ density = FALSE
+
+/obj/machinery/sleeper/survival_pod/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/sleeper/survival(null)
+ var/obj/item/stock_parts/matter_bin/B = new(null)
+ B.rating = initial_bin_rating
+ component_parts += B
+ component_parts += new /obj/item/stock_parts/manipulator(null)
+ component_parts += new /obj/item/stock_parts/console_screen(null)
+ component_parts += new /obj/item/stock_parts/console_screen(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 1)
+ RefreshParts()
+
+//NanoMed
+/obj/machinery/vending/wallmed1/survival_pod
+ name = "survival pod medical supply"
+ desc = "Wall-mounted Medical Equipment dispenser. This one seems just a tiny bit smaller."
+ req_access = list()
+ refill_canister = null
+
+ products = list(/obj/item/reagent_containers/food/pill/patch/styptic = 5,
+ /obj/item/reagent_containers/food/pill/patch/silver_sulf = 5,
+ /obj/item/reagent_containers/food/pill/charcoal = 2,
+ /obj/item/stack/medical/bruise_pack/advanced = 1,
+ /obj/item/stack/medical/ointment/advanced = 1,
+ /obj/item/reagent_containers/hypospray/autoinjector = 2,
+ /obj/item/stack/medical/splint = 1)
+ contraband = list(/obj/item/reagent_containers/food/pill/tox = 2,
+ /obj/item/reagent_containers/food/pill/morphine = 2)
+
+//Computer
+/obj/item/gps/computer
+ name = "pod computer"
+ icon_state = "pod_computer"
+ icon = 'icons/obj/lavaland/pod_computer.dmi'
+ anchored = 1
+ density = 1
+ pixel_y = -32
+
+/obj/item/gps/computer/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/wrench))
+ playsound(loc, W.usesound, 50, 1)
+ user.visible_message("[user] disassembles the gps.", \
+ "You start to disassemble the gps...", "You hear clanking and banging noises.")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ new /obj/item/gps(loc)
+ qdel(src)
+ return ..()
+
+/obj/item/gps/computer/attack_hand(mob/user)
+ attack_self(user)
+
+//Bed
+/obj/structure/bed/pod
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "bed"
+
+//Survival Storage Unit
+/obj/machinery/smartfridge/survival_pod
+ name = "survival pod storage"
+ desc = "A heated storage unit."
+ icon_state = "donkvendor"
+ icon = 'icons/obj/lavaland/donkvendor.dmi'
+ light_range = 8
+ light_power = 1.2
+ light_color = "#DDFFD3"
+ max_n_of_items = 10
+ pixel_y = -4
+ can_deconstruct = FALSE
+ var/empty = FALSE
+
+/obj/machinery/smartfridge/survival_pod/Initialize(mapload)
+ . = ..()
+
+ if(empty)
+ return
+
+ for(var/i in 1 to 5)
+ var/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak/W = new(src)
+ load(W)
+ if(prob(50))
+ var/obj/item/storage/pill_bottle/dice/D = new(src)
+ load(D)
+ else
+ var/obj/item/instrument/guitar/G = new(src)
+ load(G)
+
+/obj/machinery/smartfridge/survival_pod/update_icon()
+ return
+
+/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O)
+ return isitem(O)
+
+/obj/machinery/smartfridge/survival_pod/empty
+ name = "dusty survival pod storage"
+ desc = "A heated storage unit. This one's seen better days."
+ empty = TRUE
+
+//Fans
+/obj/structure/fans
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "fans"
+ name = "environmental regulation system"
+ desc = "A large machine releasing a constant gust of air."
+ anchored = 1
+ density = 1
+ var/arbitraryatmosblockingvar = 1
+ var/buildstacktype = /obj/item/stack/sheet/metal
+ var/buildstackamount = 5
+
+/obj/structure/fans/Initialize(loc)
+ ..()
+ air_update_turf(1)
+
+/obj/structure/fans/Destroy()
+ arbitraryatmosblockingvar = 0
+ air_update_turf(1)
+ return ..()
+
+/obj/structure/fans/CanAtmosPass(turf/T)
+ return !arbitraryatmosblockingvar
+
+/obj/structure/fans/deconstruct()
+ if(buildstacktype)
+ new buildstacktype(loc, buildstackamount)
+ qdel(src)
+
+/obj/structure/fans/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/wrench))
+ playsound(loc, W.usesound, 50, 1)
+ user.visible_message("[user] disassembles the fan.", \
+ "You start to disassemble the fan...", "You hear clanking and banging noises.")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ deconstruct()
+ return ..()
+
+/obj/structure/fans/tiny
+ name = "tiny fan"
+ desc = "A tiny fan, releasing a thin gust of air."
+ layer = TURF_LAYER+0.1
+ density = 0
+ icon_state = "fan_tiny"
+ buildstackamount = 2
+
+/obj/structure/fans/tiny/invisible
+ name = "air flow blocker"
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF
+ unacidable = TRUE
+ invisibility = INVISIBILITY_ABSTRACT
+
+//Signs
+/obj/structure/sign/mining
+ name = "nanotrasen mining corps sign"
+ desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims."
+ icon = 'icons/turf/walls/survival_pod_walls.dmi'
+ icon_state = "ntpod"
+
+/obj/structure/sign/mining/survival
+ name = "shelter sign"
+ desc = "A high visibility sign designating a safe shelter."
+ icon = 'icons/turf/walls/survival_pod_walls.dmi'
+ icon_state = "survival"
+
+//Fluff
+/obj/structure/tubes
+ icon_state = "tubes"
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ name = "tubes"
+ anchored = 1
+ layer = MOB_LAYER - 0.2
+ density = 0
+
+/obj/structure/tubes/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/wrench))
+ playsound(loc, W.usesound, 50, 1)
+ user.visible_message("[user] disassembles [src].", \
+ "You start to disassemble [src]...", "You hear clanking and banging noises.")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ new /obj/item/stack/rods(loc)
+ qdel(src)
+ return ..()
+
+/obj/item/fakeartefact
+ name = "expensive forgery"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ var/possible = list(/obj/item/ship_in_a_bottle,
+ /obj/item/gun/energy/pulse,
+ /obj/item/sleeping_carp_scroll,
+ /obj/item/shield/changeling,
+ /obj/item/lava_staff,
+ /obj/item/katana/energy,
+ /obj/item/hierophant_staff,
+ /obj/item/storage/toolbox/green/memetic,
+ /obj/item/gun/projectile/automatic/l6_saw,
+ /obj/item/gun/magic/staff/chaos,
+ /obj/item/gun/magic/staff/spellblade,
+ /obj/item/gun/magic/wand/death,
+ /obj/item/gun/magic/wand/fireball,
+ /obj/item/stack/telecrystal/twenty,
+ /obj/item/banhammer)
+
+/obj/item/fakeartefact/New()
+ . = ..()
+ var/obj/item/I = pick(possible)
+ name = initial(I.name)
+ icon = initial(I.icon)
+ desc = initial(I.desc)
+ icon_state = initial(I.icon_state)
+ item_state = initial(I.item_state)
diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
index 971a1fc6827..a39b1bbf8c6 100644
--- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm
+++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
@@ -198,7 +198,7 @@
user.visible_message("[user] turns \the [T] into [transform_string]!")
message_admins("[key_name_admin(user)] fired the lava staff at [get_area(target)] (JMP).")
log_game("[key_name(user)] fired the lava staff at [get_area(target)] ([T.x], [T.y], [T.z]).")
- T.TerraformTurf(turf_type, keep_icon = FALSE)
+ T.TerraformTurf(turf_type)
timer = world.time + create_cooldown
qdel(L)
else
@@ -207,7 +207,7 @@
return
else
user.visible_message("[user] turns \the [T] into [reset_string]!")
- T.TerraformTurf(reset_turf_type, keep_icon = FALSE)
+ T.TerraformTurf(reset_turf_type)
timer = world.time + reset_cooldown
playsound(T,'sound/magic/fireball.ogg', 200, 1)
diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm
index 33e4a9297c9..2490f6f48db 100644
--- a/code/modules/mining/lavaland/loot/colossus_loot.dm
+++ b/code/modules/mining/lavaland/loot/colossus_loot.dm
@@ -5,8 +5,6 @@
desc = "A completely indestructible chunk of crystal, rumoured to predate the start of this universe. It looks like you could store things inside it."
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "blackbox"
- icon_on = "blackbox"
- icon_off = "blackbox"
luminosity = 8
max_n_of_items = INFINITY
unacidable = 1
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 524990e992e..8ba8b13c09c 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -292,351 +292,3 @@
colorindex = 0
icon_state = "mobcap[colorindex]"
update_icon()
-
-/*****************************Survival Pod********************************/
-
-
-/area/survivalpod
- name = "\improper Emergency Shelter"
- icon_state = "away"
- requires_power = FALSE
- has_gravity = TRUE
- dynamic_lighting = DYNAMIC_LIGHTING_FORCED
-
-/obj/item/survivalcapsule
- name = "bluespace shelter capsule"
- desc = "An emergency shelter stored within a pocket of bluespace."
- icon_state = "capsule"
- icon = 'icons/obj/mining.dmi'
- w_class = WEIGHT_CLASS_TINY
- origin_tech = "engineering=3;bluespace=3"
- var/template_id = "shelter_alpha"
- var/datum/map_template/shelter/template
- var/used = FALSE
-
-/obj/item/survivalcapsule/proc/get_template()
- if(template)
- return
- template = shelter_templates[template_id]
- if(!template)
- log_runtime("Shelter template ([template_id]) not found!", src)
- qdel(src)
-
-/obj/item/survivalcapsule/examine(mob/user)
- . = ..()
- get_template()
- to_chat(user, "This capsule has the [template.name] stored.")
- to_chat(user, template.description)
-
-/obj/item/survivalcapsule/attack_self()
- // Can't grab when capsule is New() because templates aren't loaded then
- get_template()
- if(used == FALSE)
- loc.visible_message("[src] begins to shake. Stand back!")
- used = TRUE
- sleep(50)
- var/turf/deploy_location = get_turf(src)
- var/status = template.check_deploy(deploy_location)
- switch(status)
- if(SHELTER_DEPLOY_BAD_AREA)
- loc.visible_message("[src] will not function in this area.")
- if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS)
- var/width = template.width
- var/height = template.height
- loc.visible_message("[src] doesn't have room to deploy! You need to clear a [width]x[height] area!")
-
- if(status != SHELTER_DEPLOY_ALLOWED)
- used = FALSE
- return
-
- playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1)
-
- var/turf/T = deploy_location
- if(!is_mining_level(T.z))//only report capsules away from the mining/lavaland level
- message_admins("[key_name_admin(usr)] ([ADMIN_QUE(usr,"?")]) ([ADMIN_FLW(usr,"FLW")]) activated a bluespace capsule away from the mining level! (JMP)")
- log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
- template.load(deploy_location, centered = TRUE)
- new /obj/effect/particle_effect/smoke(get_turf(src))
- qdel(src)
-
-/obj/item/survivalcapsule/luxury
- name = "luxury bluespace shelter capsule"
- desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace."
- origin_tech = "engineering=3;bluespace=4"
- template_id = "shelter_beta"
-
-//Pod turfs and objects
-
-//Window
-/obj/structure/window/shuttle/survival_pod
- name = "pod window"
- icon = 'icons/obj/smooth_structures/pod_window.dmi'
- icon_state = "smooth"
- dir = FULLTILE_WINDOW_DIR
- max_integrity = 100
- fulltile = TRUE
- reinf = TRUE
- heat_resistance = 1600
- armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100)
- smooth = SMOOTH_MORE
- canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod)
- explosion_block = 3
- level = 3
- glass_type = /obj/item/stack/sheet/titaniumglass
- glass_amount = 2
-
-/obj/structure/window/reinforced/survival_pod
- name = "pod window"
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "pwindow"
-
-//Floors
-/turf/simulated/floor/pod
- name = "pod floor"
- icon_state = "podfloor"
- icon_regular_floor = "podfloor"
- floor_tile = /obj/item/stack/tile/pod
-
-/turf/simulated/floor/pod/light
- icon_state = "podfloor_light"
- icon_regular_floor = "podfloor_light"
- floor_tile = /obj/item/stack/tile/pod/light
-
-/turf/simulated/floor/pod/dark
- icon_state = "podfloor_dark"
- icon_regular_floor = "podfloor_dark"
- floor_tile = /obj/item/stack/tile/pod/dark
-
-//Door
-/obj/machinery/door/airlock/survival_pod
- icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
- overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
- assemblytype = /obj/structure/door_assembly/door_assembly_pod
-
-/obj/machinery/door/airlock/survival_pod/glass
- opacity = FALSE
- glass = TRUE
-
-/obj/structure/door_assembly/door_assembly_pod
- name = "pod airlock assembly"
- icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
- base_name = "pod airlock"
- overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
- airlock_type = /obj/machinery/door/airlock/survival_pod
- glass_type = /obj/machinery/door/airlock/survival_pod/glass
-
-//Windoor
-/obj/machinery/door/window/survival_pod
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "windoor"
- base_state = "windoor"
-
-//Table
-/obj/structure/table/survival_pod
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "table"
- smooth = SMOOTH_FALSE
-
-//Sleeper
-/obj/machinery/sleeper/survival_pod
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "sleeper-open"
- density = FALSE
-
-/obj/machinery/sleeper/survival_pod/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/sleeper/survival(null)
- var/obj/item/stock_parts/matter_bin/B = new(null)
- B.rating = initial_bin_rating
- component_parts += B
- component_parts += new /obj/item/stock_parts/manipulator(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- component_parts += new /obj/item/stock_parts/console_screen(null)
- component_parts += new /obj/item/stack/cable_coil(null, 1)
- RefreshParts()
-
-//Computer
-/obj/item/gps/computer
- name = "pod computer"
- icon_state = "pod_computer"
- icon = 'icons/obj/lavaland/pod_computer.dmi'
- anchored = 1
- density = 1
- pixel_y = -32
-
-/obj/item/gps/computer/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/wrench))
- playsound(loc, W.usesound, 50, 1)
- user.visible_message("[user] disassembles the gps.", \
- "You start to disassemble the gps...", "You hear clanking and banging noises.")
- if(do_after(user, 20 * W.toolspeed, target = src))
- new /obj/item/gps(loc)
- qdel(src)
- return ..()
-
-/obj/item/gps/computer/attack_hand(mob/user)
- attack_self(user)
-
-//Bed
-/obj/structure/bed/pod
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "bed"
-
-//Survival Storage Unit
-/obj/machinery/smartfridge/survival_pod
- name = "survival pod storage"
- desc = "A heated storage unit."
- icon_state = "donkvendor"
- icon = 'icons/obj/lavaland/donkvendor.dmi'
- icon_on = "donkvendor"
- icon_off = "donkvendor"
- light_range = 8
- max_n_of_items = 10
- pixel_y = -4
-
-/obj/machinery/smartfridge/survival_pod/update_icon()
- return
-
-/obj/item/circuitboard/smartfridge/survival
- name = "circuit board (Smartfridge Survival)"
- build_path = /obj/machinery/smartfridge/survival_pod
-
-/obj/item/circuitboard/smartfridge/attackby(obj/item/I, mob/user, params)
- return
-
-/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O)
- if(istype(O, /obj/item))
- return 1
- return 0
-
-/obj/machinery/smartfridge/survival_pod/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/smartfridge/survival(null)
- component_parts += new /obj/item/stock_parts/matter_bin(null)
- RefreshParts()
-
-/obj/machinery/smartfridge/survival_pod/loaded/New()
- ..()
- for(var/i in 1 to 5)
- var/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak/W = new(src)
- load(W)
- if(prob(50))
- var/obj/item/storage/pill_bottle/dice/D = new(src)
- load(D)
- else
- var/obj/item/instrument/guitar/G = new(src)
- load(G)
-
-//Fans
-/obj/structure/fans
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- icon_state = "fans"
- name = "environmental regulation system"
- desc = "A large machine releasing a constant gust of air."
- anchored = 1
- density = 1
- var/arbitraryatmosblockingvar = 1
- var/buildstacktype = /obj/item/stack/sheet/metal
- var/buildstackamount = 5
-
-/obj/structure/fans/Initialize(loc)
- ..()
- air_update_turf(1)
-
-/obj/structure/fans/Destroy()
- arbitraryatmosblockingvar = 0
- air_update_turf(1)
- return ..()
-
-/obj/structure/fans/CanAtmosPass(turf/T)
- return !arbitraryatmosblockingvar
-
-/obj/structure/fans/deconstruct()
- if(buildstacktype)
- new buildstacktype(loc, buildstackamount)
- qdel(src)
-
-/obj/structure/fans/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/wrench))
- playsound(loc, W.usesound, 50, 1)
- user.visible_message("[user] disassembles the fan.", \
- "You start to disassemble the fan...", "You hear clanking and banging noises.")
- if(do_after(user, 20 * W.toolspeed, target = src))
- deconstruct()
- return ..()
-
-/obj/structure/fans/tiny
- name = "tiny fan"
- desc = "A tiny fan, releasing a thin gust of air."
- layer = TURF_LAYER+0.1
- density = 0
- icon_state = "fan_tiny"
- buildstackamount = 2
-
-/obj/structure/fans/tiny/invisible
- name = "air flow blocker"
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF
- unacidable = TRUE
- invisibility = INVISIBILITY_ABSTRACT
-
-//Signs
-/obj/structure/sign/mining
- name = "nanotrasen mining corps sign"
- desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims."
- icon = 'icons/turf/walls/survival_pod_walls.dmi'
- icon_state = "ntpod"
-
-/obj/structure/sign/mining/survival
- name = "shelter sign"
- desc = "A high visibility sign designating a safe shelter."
- icon = 'icons/turf/walls/survival_pod_walls.dmi'
- icon_state = "survival"
-
-//Fluff
-/obj/structure/tubes
- icon_state = "tubes"
- icon = 'icons/obj/lavaland/survival_pod.dmi'
- name = "tubes"
- anchored = 1
- layer = MOB_LAYER - 0.2
- density = 0
-
-/obj/structure/tubes/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/wrench))
- playsound(loc, W.usesound, 50, 1)
- user.visible_message("[user] disassembles [src].", \
- "You start to disassemble [src]...", "You hear clanking and banging noises.")
- if(do_after(user, 20 * W.toolspeed, target = src))
- new /obj/item/stack/rods(loc)
- qdel(src)
- return ..()
-
-/obj/item/fakeartefact
- name = "expensive forgery"
- icon = 'icons/mob/screen_gen.dmi'
- icon_state = "x2"
- var/possible = list(/obj/item/ship_in_a_bottle,
- /obj/item/gun/energy/pulse,
- /obj/item/sleeping_carp_scroll,
- /obj/item/shield/changeling,
- /obj/item/lava_staff,
- /obj/item/katana/energy,
- /obj/item/storage/toolbox/green/memetic,
- /obj/item/gun/projectile/automatic/l6_saw,
- /obj/item/gun/magic/staff/chaos,
- /obj/item/gun/magic/staff/spellblade,
- /obj/item/gun/magic/wand/death,
- /obj/item/gun/magic/wand/fireball,
- /obj/item/stack/telecrystal,
- /obj/item/banhammer)
-
-/obj/item/fakeartefact/New()
- . = ..()
- var/obj/item/I = pick(possible)
- name = initial(I.name)
- icon = initial(I.icon)
- desc = initial(I.desc)
- icon_state = initial(I.icon_state)
- item_state = initial(I.item_state)
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index d4cafa847fd..7b8790076ce 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -14,11 +14,10 @@
return TRUE
..()
-/mob/living/carbon/water_act(volume, temperature, source)
+/mob/living/carbon/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
if(volume > 10) //anything over 10 volume will make the mob wetter.
wetlevel = min(wetlevel + 1,5)
- ..()
-
/mob/living/carbon/attackby(obj/item/I, mob/user, params)
if(lying && surgeries.len)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 873282ca1d4..b95920e688b 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -506,9 +506,9 @@ emp_act
return 0
..()
-/mob/living/carbon/human/water_act(volume, temperature, source)
- ..()
- dna.species.water_act(src,volume,temperature,source)
+/mob/living/carbon/human/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ dna.species.water_act(src, volume, temperature, source, method)
/mob/living/carbon/human/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES))
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index 7dc6c042e0c..85f491f71f0 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -718,7 +718,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u
H.sync_lighting_plane_alpha()
-/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source)
+/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source, method = TOUCH)
if(abs(temperature - M.bodytemperature) > 10) //If our water and mob temperature varies by more than 10K, cool or/ heat them appropriately
M.bodytemperature = (temperature + M.bodytemperature) * 0.5 //Approximation for gradual heating or cooling
diff --git a/code/modules/mob/living/carbon/human/species/grey.dm b/code/modules/mob/living/carbon/human/species/grey.dm
index 29ab2a0ee8d..3b8bbe34ffb 100644
--- a/code/modules/mob/living/carbon/human/species/grey.dm
+++ b/code/modules/mob/living/carbon/human/species/grey.dm
@@ -36,10 +36,38 @@
genemutcheck(H, REMOTETALKBLOCK, null, MUTCHK_FORCED)
H.dna.default_blocks.Add(REMOTETALKBLOCK)
-/datum/species/grey/water_act(mob/living/carbon/human/H, volume, temperature, source)
- ..()
- H.take_organ_damage(5, min(volume, 20))
- H.emote("scream")
+/datum/species/grey/water_act(mob/living/carbon/human/H, volume, temperature, source, method = TOUCH)
+ . = ..()
+
+ if(method == TOUCH)
+ if(volume > 25)
+ if(H.wear_mask)
+ to_chat(H, "Your [H.wear_mask] protects you from the acid!")
+ return
+
+ if(H.head)
+ to_chat(H, "Your [H.wear_mask] protects you from the acid!")
+ return
+
+ if(prob(75))
+ H.take_organ_damage(5, 10)
+ H.emote("scream")
+ var/obj/item/organ/external/affecting = H.get_organ("head")
+ if(affecting)
+ affecting.disfigure()
+ else
+ H.take_organ_damage(5, 10)
+ else
+ H.take_organ_damage(5, 10)
+ else
+ to_chat(H, "The water stings[volume < 10 ? " you, but isn't concentrated enough to harm you" : null]!")
+ if(volume >= 10)
+ H.adjustFireLoss(min(max(4, (volume - 10) * 2), 20))
+ H.emote("scream")
+ to_chat(H, "The water stings[volume < 10 ? " you, but isn't concentrated enough to harm you" : null]!")
+ if(volume >= 10)
+ H.adjustFireLoss(min(max(4, (volume - 10) * 2), 20))
+ H.emote("scream")
/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H)
var/translator_pref = H.client.prefs.speciesprefs
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index e9df2f0edad..f0c3b85ece1 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -216,13 +216,9 @@
fire_stacks += L.fire_stacks
IgniteMob()
-//Mobs on Fire end
-
-/mob/living/water_act(volume, temperature)
- if(volume >= 20) fire_stacks -= 0.5
- if(volume >= 50) fire_stacks -= 1
-
-
+/mob/living/water_act(volume, temperature, source, method = TOUCH)
+ . = ..()
+ adjust_fire_stacks(-(volume * 0.2))
//This is called when the mob is thrown into a dense turf
/mob/living/proc/turf_collision(var/turf/T, var/speed)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
index a947cace8e2..28aacd37a73 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/basilisk.dm
@@ -77,7 +77,6 @@
stat_attack = 1
flying = TRUE
robust_searching = 1
- var/fromtendril = FALSE
loot = list()
butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
index 391bc4ce67d..66f8e4fd873 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/goliath.dm
@@ -33,7 +33,7 @@
pull_force = MOVE_FORCE_VERY_STRONG
var/pre_attack = 0
var/pre_attack_icon = "Goliath_preattack"
- loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = 4.1})
+ loot = list(/obj/item/stack/sheet/animalhide/goliath_hide)
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
..()
@@ -56,7 +56,7 @@
var/tturf = get_turf(target)
if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
visible_message("The [src.name] digs its tentacles under [target.name]!")
- new /obj/effect/goliath_tentacle/original(tturf, src)
+ new /obj/effect/temp_visual/goliath_tentacle/original(tturf, src)
ranged_cooldown = world.time + ranged_cooldown_time
icon_state = icon_aggro
pre_attack = 0
@@ -74,44 +74,104 @@
icon_state = icon_aggro
return
-/obj/effect/goliath_tentacle
- name = "Goliath tentacle"
+// Lavaland Goliath
+/mob/living/simple_animal/hostile/asteroid/goliath/beast
+ name = "goliath"
+ desc = "A hulking, armor-plated beast with long tendrils arching from its back."
+ icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "goliath"
+ icon_living = "goliath"
+ icon_aggro = "goliath"
+ icon_dead = "goliath_dead"
+ throw_message = "does nothing to the tough hide of the"
+ pre_attack_icon = "goliath2"
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
+ loot = list()
+ stat_attack = 1
+ robust_searching = 1
+
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/random/Initialize()
+ . = ..()
+ if(prob(1))
+ new /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient(loc)
+ return INITIALIZE_HINT_QDEL
+
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient
+ name = "ancient goliath"
+ desc = "Goliaths are biologically immortal, and rare specimens have survived for centuries. This one is clearly ancient, and its tentacles constantly churn the earth around it."
+ icon_state = "Goliath"
+ icon_living = "Goliath"
+ icon_aggro = "Goliath_alert"
+ icon_dead = "Goliath_dead"
+ maxHealth = 400
+ health = 400
+ speed = 4
+ pre_attack_icon = "Goliath_preattack"
+ throw_message = "does nothing to the rocky hide of the"
+ loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/bone = 2)
+ wander = FALSE
+ var/list/cached_tentacle_turfs
+ var/turf/last_location
+ var/tentacle_recheck_cooldown = 100
+
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/Life()
+ . = ..()
+ if(!.) // dead
+ return
+ if(isturf(loc))
+ if(!LAZYLEN(cached_tentacle_turfs) || loc != last_location || tentacle_recheck_cooldown <= world.time)
+ LAZYCLEARLIST(cached_tentacle_turfs)
+ last_location = loc
+ tentacle_recheck_cooldown = world.time + initial(tentacle_recheck_cooldown)
+ for(var/turf/simulated/floor/T in orange(4, loc))
+ LAZYADD(cached_tentacle_turfs, T)
+ for(var/t in cached_tentacle_turfs)
+ if(isfloorturf(t))
+ if(prob(10))
+ new /obj/effect/temp_visual/goliath_tentacle(t, src)
+ else
+ cached_tentacle_turfs -= t
+
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril
+ fromtendril = TRUE
+
+//tentacles
+/obj/effect/temp_visual/goliath_tentacle
+ name = "goliath tentacle"
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
icon_state = "Goliath_tentacle_spawn"
layer = BELOW_MOB_LAYER
var/mob/living/spawner
- var/timerid
-/obj/effect/goliath_tentacle/New(var/loc, mob/living/new_spawner)
+/obj/effect/temp_visual/goliath_tentacle/Initialize(mapload, mob/living/new_spawner)
. = ..()
- for(var/obj/effect/goliath_tentacle/T in loc)
+ for(var/obj/effect/temp_visual/goliath_tentacle/T in loc)
if(T != src)
return INITIALIZE_HINT_QDEL
-
if(!QDELETED(new_spawner))
spawner = new_spawner
-
if(ismineralturf(loc))
var/turf/simulated/mineral/M = loc
M.gets_drilled()
deltimer(timerid)
timerid = addtimer(CALLBACK(src, .proc/tripanim), 7, TIMER_STOPPABLE)
-/obj/effect/goliath_tentacle/original/New(var/loc, mob/living/new_spawner)
+/obj/effect/temp_visual/goliath_tentacle/original/Initialize(mapload, new_spawner)
. = ..()
var/list/directions = cardinal.Copy()
for(var/i in 1 to 3)
var/spawndir = pick_n_take(directions)
var/turf/T = get_step(src, spawndir)
if(T)
- new /obj/effect/goliath_tentacle(T, spawner)
+ new /obj/effect/temp_visual/goliath_tentacle(T, spawner)
-/obj/effect/goliath_tentacle/proc/tripanim()
+/obj/effect/temp_visual/goliath_tentacle/proc/tripanim()
icon_state = "Goliath_tentacle_wiggle"
deltimer(timerid)
timerid = addtimer(CALLBACK(src, .proc/trip), 3, TIMER_STOPPABLE)
-/obj/effect/goliath_tentacle/proc/trip()
+/obj/effect/temp_visual/goliath_tentacle/proc/trip()
var/latched = FALSE
for(var/mob/living/L in loc)
if((!QDELETED(spawner) && spawner.faction_check_mob(L)) || L.stat == DEAD)
@@ -126,22 +186,7 @@
deltimer(timerid)
timerid = addtimer(CALLBACK(src, .proc/retract), 10, TIMER_STOPPABLE)
-/obj/effect/goliath_tentacle/proc/retract()
+/obj/effect/temp_visual/goliath_tentacle/proc/retract()
icon_state = "Goliath_tentacle_retract"
deltimer(timerid)
- timerid = QDEL_IN(src, 7)
-
-/mob/living/simple_animal/hostile/asteroid/goliath/beast
- name = "goliath"
- desc = "A hulking, armor-plated beast with long tendrils arching from its back."
- icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
- icon_state = "goliath"
- icon_living = "goliath"
- icon_aggro = "goliath"
- icon_dead = "goliath_dead"
- throw_message = "does nothing to the tough hide of the"
- pre_attack_icon = "goliath2"
- butcher_results = list(/obj/item/reagent_containers/food/snacks/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
- loot = list()
- stat_attack = 1
- robust_searching = 1
\ No newline at end of file
+ timerid = QDEL_IN(src, 5)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
index 51b8e0c9842..60c1f5e08e7 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
@@ -236,7 +236,6 @@
del_on_death = 1
stat_attack = 1
robust_searching = 1
- var/fromtendril = FALSE
var/dwarf_mob = FALSE
var/mob/living/carbon/human/stored_mob
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/mining.dm b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm
index 2fd5e6ef0f2..e23624a5a9d 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/mining.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/mining.dm
@@ -15,6 +15,7 @@
a_intent = INTENT_HARM
var/throw_message = "bounces off of"
var/icon_aggro = null // for swapping to when we get aggressive
+ var/fromtendril = FALSE
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
mob_size = MOB_SIZE_LARGE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm b/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm
index e8dfa093918..2ee9c387140 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/necropolis_tendril.dm
@@ -73,7 +73,7 @@
qdel(src)
/mob/living/simple_animal/hostile/spawner/lavaland/goliath
- mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast
+ mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril
/mob/living/simple_animal/hostile/spawner/lavaland/legion
mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril
\ No newline at end of file
diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm
index 9936895e473..3b61ea0f557 100644
--- a/code/modules/nano/modules/atmos_control.dm
+++ b/code/modules/nano/modules/atmos_control.dm
@@ -42,6 +42,7 @@
/datum/nano_module/atmos_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/data[0]
data["alarms"] = air_alarm_repository.air_alarm_data(monitored_alarms)
+
return data
/datum/nano_module/atmos_control/proc/generate_state(air_alarm)
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index 57f8b96b787..20e2ba82b1e 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -19,68 +19,16 @@
drink_name = "Glass of Water"
drink_desc = "The father of all refreshments."
taste_message = null
+ var/water_temperature = 283.15 // As reagents don't have a temperature value, we'll just use 10 celsius.
-/datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume)
- if(method == TOUCH)
- // Put out fire
- M.adjust_fire_stacks(-(volume * 0.2))
-
- if(isgrey(M)) // You gosh darn snowflakes
- var/mob/living/carbon/human/G = M
- if(method == TOUCH)
- if(volume > 25)
- if(G.wear_mask)
- to_chat(G, "Your [G.wear_mask] protects you from the acid!")
- return
-
- if(G.head)
- to_chat(G, "Your [G.wear_mask] protects you from the acid!")
- return
-
- if(prob(75))
- G.take_organ_damage(5, 10)
- G.emote("scream")
- var/obj/item/organ/external/affecting = G.get_organ("head")
- if(affecting)
- affecting.disfigure()
- else
- G.take_organ_damage(5, 10)
- else
- G.take_organ_damage(5, 10)
- else
- to_chat(G, "The water stings[volume < 10 ? " you, but isn't concentrated enough to harm you" : null]!")
- if(volume >= 10)
- G.adjustFireLoss(min(max(4, (volume - 10) * 2), 20))
- G.emote("scream")
+/datum/reagent/water/reaction_mob(mob/living/M, method = TOUCH, volume)
+ M.water_act(volume, water_temperature, src, method)
/datum/reagent/water/reaction_turf(turf/simulated/T, volume)
- if(!istype(T))
- return
- if(volume >= 3)
- T.MakeSlippery()
-
- for(var/mob/living/carbon/slime/M in T)
- M.apply_water()
-
- var/hotspot = (locate(/obj/effect/hotspot) in T)
- if(hotspot)
- var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles())
- lowertemp.temperature = max(min(lowertemp.temperature-2000,lowertemp.temperature / 2), 0)
- lowertemp.react()
- T.assume_air(lowertemp)
- qdel(hotspot)
+ T.water_act(volume, water_temperature, src)
/datum/reagent/water/reaction_obj(obj/O, volume)
- O.extinguish()
-
- if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube))
- var/obj/item/reagent_containers/food/snacks/monkeycube/cube = O
- cube.Expand()
- // Dehydrated carp
- if(istype(O, /obj/item/toy/carpplushie/dehy_carp))
- var/obj/item/toy/carpplushie/dehy_carp/dehy = O
- dehy.Swell() // Makes a carp
-
+ O.water_act(volume, water_temperature, src)
/datum/reagent/lube
name = "Space Lube"
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index a350d75a4b4..829d8fd2226 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -55,13 +55,6 @@
update_icon()
return
-// this prevented pills, food, and other things from being picked up by bags.
-// possibly intentional, but removing it allows us to not duplicate functionality.
-// -Sayu (storage conslidation)
-/*
-/obj/item/reagent_containers/attackby(obj/item/I as obj, mob/user as mob, params)
- return
-*/
/obj/item/reagent_containers/afterattack(obj/target, mob/user , flag)
return
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index d67d888a75b..17d68f7e607 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -56,9 +56,54 @@
if(!is_open_container())
to_chat(user, "Airtight lid seals it completely.")
+/obj/item/reagent_containers/glass/attack(mob/M, mob/user, def_zone)
+ if(!is_open_container())
+ return ..()
+
+ if(!reagents || !reagents.total_volume)
+ to_chat(user, "[src] is empty!")
+ return
+
+ if(istype(M))
+ var/list/transferred = list()
+ for(var/datum/reagent/R in reagents.reagent_list)
+ transferred += R.name
+ var/contained = english_list(transferred)
+
+ if(user.a_intent == INTENT_HARM)
+ M.visible_message("[user] splashes the contents of [src] onto [M]!", \
+ "[user] splashes the contents of [src] onto [M]!")
+ add_attack_logs(M, user, "Splashed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL)
+ if(!iscarbon(user))
+ M.LAssailant = null
+ else
+ M.LAssailant = user
+
+ reagents.reaction(M, TOUCH)
+ reagents.clear_reagents()
+ else
+ if(M != user)
+ M.visible_message("[user] attempts to feed something to [M].", \
+ "[user] attempts to feed something to you.")
+ if(!do_mob(user, M))
+ return
+ if(!reagents || !reagents.total_volume)
+ return // The drink might be empty after the delay, such as by spam-feeding
+ M.visible_message("[user] feeds something to [M].", "[user] feeds something to you.")
+ add_attack_logs(M, user, "Fed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL)
+ else
+ to_chat(user, "You swallow a gulp of [src].")
+
+ reagents.reaction(M, INGEST)
+ addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5)
+ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
+ else
+ return ..()
+
/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
if(!proximity)
return
+
if(!is_open_container())
return
@@ -66,26 +111,7 @@
if(istype(target, type))
return
- if(user.a_intent != INTENT_HELP && ismob(target) && target.reagents && reagents.total_volume)
- to_chat(user, "You splash the solution onto [target].")
-
- var/mob/living/M = target
- var/list/injected = list()
- for(var/datum/reagent/R in reagents.reagent_list)
- injected += R.name
- var/contained = english_list(injected)
- add_attack_logs(M, user, "Splashed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL)
- if(!iscarbon(user))
- M.LAssailant = null
- else
- M.LAssailant = user
-
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("[] has been splashed with something by []!", target, user), 1)
- reagents.reaction(target, TOUCH)
- spawn(5) reagents.clear_reagents()
- return
- else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
+ if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
if(target.reagents && !target.reagents.total_volume)
to_chat(user, "[target] is empty and can't be refilled!")
return
@@ -116,12 +142,11 @@
else if(istype(target, /obj/effect/decal)) //stops splashing while scooping up fluids
return
- else if(reagents.total_volume)
- to_chat(user, "You splash the solution onto [target].")
+ else if(reagents.total_volume && user.a_intent == INTENT_HARM)
+ user.visible_message("[user] splashes the contents of [src] onto [target]!", \
+ "You splash the contents of [src] onto [target].")
reagents.reaction(target, TOUCH)
- spawn(5) reagents.clear_reagents()
- return
-
+ reagents.clear_reagents()
/obj/item/reagent_containers/glass/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/pen) || istype(I, /obj/item/flashlight/pen))
@@ -338,3 +363,28 @@
qdel(src)
else
..()
+
+/obj/item/reagent_containers/glass/beaker/waterbottle
+ name = "bottle of water"
+ desc = "A bottle of water filled at an old Earth bottling facility."
+ icon = 'icons/obj/drinks.dmi'
+ icon_state = "smallbottle"
+ item_state = "bottle"
+ list_reagents = list("water" = 49.5, "fluorine" = 0.5) //see desc, don't think about it too hard
+ materials = list(MAT_GLASS = 0)
+ volume = 50
+ amount_per_transfer_from_this = 10
+
+/obj/item/reagent_containers/glass/beaker/waterbottle/empty
+ list_reagents = list()
+
+/obj/item/reagent_containers/glass/beaker/waterbottle/large
+ desc = "A fresh commercial-sized bottle of water."
+ icon_state = "largebottle"
+ materials = list(MAT_GLASS = 0)
+ list_reagents = list("water" = 100)
+ volume = 100
+ amount_per_transfer_from_this = 20
+
+/obj/item/reagent_containers/glass/beaker/waterbottle/large/empty
+ list_reagents = list()
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index ec89b8a463a..cffc2f0ef06 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -76,6 +76,12 @@
icon_state = "pill16"
list_reagents = list("adminordrazine" = 50)
+/obj/item/reagent_containers/food/pill/morphine
+ name = "Morphine pill"
+ desc = "Commonly used to treat insomnia."
+ icon_state = "pill8"
+ list_reagents = list("morphine" = 30)
+
/obj/item/reagent_containers/food/pill/methamphetamine
name = "Methamphetamine pill"
desc = "Helps improve the ability to concentrate."
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 3b1c4c07cfa..f9e4f6bfbfc 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 1bf74ad556c..c49361b8e20 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1636,6 +1636,7 @@
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\shelters.dm"
#include "code\modules\mining\equipment\marker_beacons.dm"
+#include "code\modules\mining\equipment\survival_pod.dm"
#include "code\modules\mining\laborcamp\laborshuttle.dm"
#include "code\modules\mining\laborcamp\laborstacker.dm"
#include "code\modules\mining\lavaland\ash_flora.dm"