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"