diff --git a/code/controllers/subsystems/fluids.dm b/code/controllers/subsystems/fluids.dm
index 1e95a63bf46..0b9faea243e 100644
--- a/code/controllers/subsystems/fluids.dm
+++ b/code/controllers/subsystems/fluids.dm
@@ -231,13 +231,21 @@ SUBSYSTEM_DEF(fluids)
if(!istype(current_fluid_holder) || QDELETED(current_fluid_holder))
continue
var/pushed_something = FALSE
- if(current_fluid_holder.reagents?.total_volume > FLUID_SHALLOW && current_fluid_holder.last_flow_strength >= 10)
- for(var/atom/movable/AM as anything in current_fluid_holder.get_contained_external_atoms())
- if(AM.is_fluid_pushable(current_fluid_holder.last_flow_strength))
- AM.pushed(current_fluid_holder.last_flow_dir)
- pushed_something = TRUE
- if(pushed_something && prob(1))
- playsound(current_fluid_holder, 'sound/effects/slosh.ogg', 25, 1)
+
+ if(current_fluid_holder.last_flow_strength >= 10)
+ // Catwalks mean items will be above the turf; subtract the turf height from our volume.
+ // TODO: somehow handle stuff that is on a catwalk or on the turf within the same turf.
+ var/effective_volume = current_fluid_holder.reagents?.total_volume
+ if(current_fluid_holder.get_supporting_platform())
+ // Depth is negative height, hence +=. TODO: positive heights? No idea how to handle that.
+ effective_volume += current_fluid_holder.get_physical_height()
+ if(effective_volume > FLUID_SHALLOW)
+ for(var/atom/movable/AM as anything in current_fluid_holder.get_contained_external_atoms())
+ if(AM.try_fluid_push(effective_volume, current_fluid_holder.last_flow_strength))
+ AM.pushed(current_fluid_holder.last_flow_dir)
+ pushed_something = TRUE
+ if(pushed_something && prob(1))
+ playsound(current_fluid_holder, 'sound/effects/slosh.ogg', 25, 1)
if(MC_TICK_CHECK)
processing_flows.Cut(1, i+1)
return
diff --git a/code/controllers/subsystems/holomap.dm b/code/controllers/subsystems/holomap.dm
index 566e9ccb218..ac6662184f6 100644
--- a/code/controllers/subsystems/holomap.dm
+++ b/code/controllers/subsystems/holomap.dm
@@ -81,7 +81,7 @@ SUBSYSTEM_DEF(minimap)
continue
if((tile.turf_flags & TURF_IS_HOLOMAP_OBSTACLE) || (locate(/obj/structure/grille) in tile))
canvas.DrawBox(COLOR_HOLOMAP_OBSTACLE, tile.x + offset_x, tile.y + offset_y)
- else if((tile.turf_flags & TURF_IS_HOLOMAP_PATH) || (locate(/obj/structure/catwalk) in tile))
+ else if((tile.turf_flags & TURF_IS_HOLOMAP_PATH) || tile.get_supporting_platform())
canvas.DrawBox(COLOR_HOLOMAP_PATH, tile.x + offset_x, tile.y + offset_y)
CHECK_TICK
return canvas
diff --git a/code/datums/extensions/storage/subtypes_mre.dm b/code/datums/extensions/storage/subtypes_mre.dm
index 5b7f4910716..b5045c1fc1b 100644
--- a/code/datums/extensions/storage/subtypes_mre.dm
+++ b/code/datums/extensions/storage/subtypes_mre.dm
@@ -5,8 +5,11 @@
open_sound = 'sound/effects/rip1.ogg'
/datum/storage/mre/open(mob/user)
- if(!opened)
- to_chat(user, "You tear open the bag, breaking the vacuum seal.")
+ var/obj/item/mre/mre = holder
+ if(istype(mre) && !mre.has_been_opened)
+ to_chat(user, SPAN_NOTICE("You tear open the bag, breaking the vacuum seal."))
+ mre.has_been_opened = TRUE
+ mre.update_icon()
. = ..()
/datum/storage/mrebag
diff --git a/code/game/atoms_fluids.dm b/code/game/atoms_fluids.dm
index 2984d5393f2..bf49a3469c0 100644
--- a/code/game/atoms_fluids.dm
+++ b/code/game/atoms_fluids.dm
@@ -16,7 +16,7 @@
/atom/proc/CanFluidPass(var/coming_from)
return TRUE
-/atom/movable/proc/is_fluid_pushable(var/amt)
+/atom/movable/proc/try_fluid_push(volume, strength)
return simulated && !anchored
/atom/movable/is_flooded(var/lying_mob, var/absolute)
@@ -47,7 +47,7 @@
// This override exists purely because throwing is movable-level and not atom-level,
// for obvious reasons (that being that non-movable atoms cannot move).
/atom/movable/submerged(depth, above_turf)
- above_turf ||= !!throwing
+ above_turf ||= immune_to_floor_hazards()
return ..()
/obj/item/submerged(depth, above_turf)
@@ -66,7 +66,7 @@
return ..()
/mob/submerged(depth, above_turf)
- above_turf ||= is_floating || !!throwing // check throwing here because of the table check coming before parent call
+ above_turf ||= immune_to_floor_hazards() // check throwing here because of the table check coming before parent call
var/obj/structure/table/standing_on = locate(/obj/structure/table) in loc
// can't stand on a table if we're floating
if(!above_turf && standing_on && standing_on.mob_offset > 0) // standing atop a table that is a meaningful amount above the ground (not a bench)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 7142d14c382..9c481be8d46 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -593,7 +593,7 @@
return null
/atom/movable/immune_to_floor_hazards()
- return ..() || throwing
+ return ..() || !!throwing
// TODO: make everything use this.
/atom/movable/proc/set_anchored(new_anchored)
@@ -603,3 +603,10 @@
return TRUE
return FALSE
+// updates pixel offsets, triggers fluids, etc.
+/atom/movable/proc/on_turf_height_change(new_height)
+ if(simulated)
+ reset_offsets()
+ return TRUE
+ return FALSE
+
diff --git a/code/game/machinery/turrets/_turrets.dm b/code/game/machinery/turrets/_turrets.dm
index 3030bc2bef9..957c3407889 100644
--- a/code/game/machinery/turrets/_turrets.dm
+++ b/code/game/machinery/turrets/_turrets.dm
@@ -188,7 +188,7 @@
playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1)
reloading_progress = 0
- else if(stored_magazine && length(stored_magazine.stored_ammo) < stored_magazine.max_ammo)
+ else if(stored_magazine && stored_magazine.get_stored_ammo_count() < stored_magazine.max_ammo)
var/obj/item/stock_parts/ammo_box/ammo_box = get_component_of_type(/obj/item/stock_parts/ammo_box)
if(ammo_box?.is_functional() && ammo_box.stored_caliber == proj_gun.caliber)
var/obj/item/ammo_casing/casing = ammo_box.remove_ammo(stored_magazine)
@@ -366,7 +366,7 @@
// Only reload the magazine if we're completely out of ammo or we don't have a target.
if(ammo_remaining == 0)
return TRUE
- if(!is_valid_target(target?.resolve()) && length(proj_gun.ammo_magazine.stored_ammo) != proj_gun.ammo_magazine.max_ammo)
+ if(!is_valid_target(target?.resolve()) && proj_gun.ammo_magazine.get_stored_ammo_count() != proj_gun.ammo_magazine.max_ammo)
return TRUE
else
return FALSE
diff --git a/code/game/machinery/turrets/turret_ammo.dm b/code/game/machinery/turrets/turret_ammo.dm
index 52cf5825df0..2ae59092307 100644
--- a/code/game/machinery/turrets/turret_ammo.dm
+++ b/code/game/machinery/turrets/turret_ammo.dm
@@ -50,7 +50,7 @@
if(stored_caliber && magazine.caliber != stored_caliber)
to_chat(user, SPAN_WARNING("The caliber of \the [magazine] does not match the caliber stored in \the [src]!"))
return TRUE
- if(!length(magazine.stored_ammo))
+ if(!magazine.get_stored_ammo_count())
to_chat(user, SPAN_WARNING("\The [magazine] is empty!"))
return TRUE
if(length(stored_ammo) >= max_ammo)
@@ -58,7 +58,7 @@
return TRUE
stored_caliber = magazine.caliber
- for(var/obj/item/ammo_casing/casing in magazine.stored_ammo)
+ for(var/obj/item/ammo_casing/casing in magazine.get_stored_ammo_count())
// Just in case.
if(casing.caliber != stored_caliber)
continue
diff --git a/code/game/objects/__objs.dm b/code/game/objects/__objs.dm
index 8ab41e00a57..31fdd7a3ce7 100644
--- a/code/game/objects/__objs.dm
+++ b/code/game/objects/__objs.dm
@@ -156,8 +156,8 @@
add_fingerprint(user)
return ..()
-/obj/is_fluid_pushable(var/amt)
- return ..() && w_class <= round(amt/20)
+/obj/try_fluid_push(volume, strength)
+ return ..() && w_class <= round(strength/20)
/obj/proc/can_embed()
return FALSE
diff --git a/code/game/objects/effects/footprints.dm b/code/game/objects/effects/footprints.dm
index 091aa263856..09ea5bddc7b 100644
--- a/code/game/objects/effects/footprints.dm
+++ b/code/game/objects/effects/footprints.dm
@@ -18,6 +18,12 @@
footprints.Cut() // don't qdel images
. = ..()
+/obj/effect/footprints/on_turf_height_change(new_height)
+ if(simulated)
+ qdel(src)
+ return TRUE
+ return FALSE
+
/obj/effect/footprints/on_update_icon()
set_overlays(footprints?.Copy())
compile_overlays()
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 567039e9b51..f09470bc64e 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -147,7 +147,10 @@
// As it is, the effect can freely levitate over any open space.
/obj/effect/dummy/chameleon/Move()
. = ..()
- if(. && isturf(loc) && loc.has_gravity() && !(locate(/obj/structure/catwalk) in loc) && !(locate(/obj/structure/lattice) in loc))
+ if(!. || !isturf(loc) || !loc.has_gravity())
+ return
+ var/turf/my_turf = loc
+ if(!my_turf.get_supporting_platform() && !(locate(/obj/structure/lattice) in loc))
disrupted()
/datum/movement_handler/delay/chameleon_projector
diff --git a/code/game/objects/items/weapons/storage/fancy/_fancy.dm b/code/game/objects/items/weapons/storage/fancy/_fancy.dm
index ec59092259d..66774d7abae 100644
--- a/code/game/objects/items/weapons/storage/fancy/_fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy/_fancy.dm
@@ -14,7 +14,11 @@
/obj/item/box/fancy/proc/update_icon_state()
icon_state = initial(icon_state)
- if(key_type && storage?.opened)
+ if(!length(contents))
+ var/empty_state = "[icon_state]0"
+ if(check_state_in_icon(empty_state, icon))
+ icon_state = empty_state
+ else if(key_type && storage?.opened)
icon_state = "[icon_state][count_by_type(contents, key_type)]"
/obj/item/box/fancy/proc/add_contents_overlays()
diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm
index 8c2acb816db..70bbf23d777 100644
--- a/code/game/objects/items/weapons/storage/mre.dm
+++ b/code/game/objects/items/weapons/storage/mre.dm
@@ -12,6 +12,7 @@ MRE Stuff
obj_flags = OBJ_FLAG_HOLLOW
var/main_meal = /obj/item/mrebag
var/meal_desc = "This one is menu 1, meat pizza."
+ var/has_been_opened = FALSE
/obj/item/mre/WillContain()
. = list(
@@ -33,10 +34,13 @@ MRE Stuff
. = ..()
to_chat(user, meal_desc)
+/obj/item/mre/attack_self(mob/user)
+ . = ..()
+
/obj/item/mre/on_update_icon()
. = ..()
icon_state = get_world_inventory_state()
- if(storage?.opened)
+ if(has_been_opened)
icon_state = "[icon_state]-open"
/obj/item/mre/attack_self(mob/user)
diff --git a/code/game/objects/random/subtypes/food.dm b/code/game/objects/random/subtypes/food.dm
index f390e57cf5d..36aa8a4a37e 100644
--- a/code/game/objects/random/subtypes/food.dm
+++ b/code/game/objects/random/subtypes/food.dm
@@ -102,7 +102,8 @@
/obj/random/mre/spread/spawn_choices()
var/static/list/spawnable_choices = list(
/obj/item/chems/packet/jelly,
- /obj/item/chems/packet/honey
+ /obj/item/chems/packet/honey,
+ /obj/item/chems/packet/honey_fake
)
return spawnable_choices
diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm
index f1fb8d4a2c1..f4c1a97c7f9 100644
--- a/code/game/objects/structures/__structure.dm
+++ b/code/game/objects/structures/__structure.dm
@@ -323,9 +323,21 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen
W.pixel_y = (CELLSIZE * (cell_y + 0.5)) - center["y"]
W.pixel_z = 0
+// Does this structure override turf depth for the purposes of mob offsets?
+/obj/structure/proc/is_platform()
+ return FALSE
+
+/obj/structure/proc/is_z_passable()
+ return TRUE
+
+/obj/structure/on_turf_height_change(new_height)
+ // We may be a fixed point.
+ return !is_platform() && ..()
+
/obj/structure/hitby(var/atom/movable/AM, var/datum/thrownthing/TT)
. = ..()
if(. && (structure_flags & STRUCTURE_FLAG_THROWN_DAMAGE))
visible_message(SPAN_DANGER("\The [src] was hit by \the [AM]."))
playsound(src.loc, hitsound, 100, 1)
take_damage(AM.get_thrown_attack_force() * (TT.speed/THROWFORCE_SPEED_DIVISOR), AM.atom_damage_type)
+
diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm
index 28d320d564f..b7186e1926d 100644
--- a/code/game/objects/structures/catwalk.dm
+++ b/code/game/objects/structures/catwalk.dm
@@ -19,14 +19,6 @@
var/list/connections
var/list/other_connections
-/obj/structure/catwalk/clear_connections()
- connections = null
- other_connections = null
-
-/obj/structure/catwalk/set_connections(dirs, other_dirs)
- connections = dirs_to_corner_states(dirs)
- other_connections = dirs_to_corner_states(other_dirs)
-
/obj/structure/catwalk/Initialize()
. = ..()
DELETE_IF_DUPLICATE_OF(/obj/structure/catwalk)
@@ -41,9 +33,6 @@
update_connections(1)
update_icon()
-/obj/structure/catwalk/can_climb_from_below(var/mob/climber)
- return TRUE
-
/obj/structure/catwalk/Destroy()
var/turf/oldloc = loc
redraw_nearby_catwalks()
@@ -51,6 +40,26 @@
if(istype(oldloc))
for(var/atom/movable/AM in oldloc)
AM.fall(oldloc)
+ oldloc.supporting_platform = null
+
+// Catwalks need to layer over grass and water.
+/obj/structure/catwalk/update_turf_alpha_mask()
+ return FALSE
+
+/obj/structure/catwalk/clear_connections()
+ connections = null
+ other_connections = null
+
+/obj/structure/catwalk/is_platform()
+ return TRUE
+
+/obj/structure/catwalk/set_connections(dirs, other_dirs)
+ connections = dirs_to_corner_states(dirs)
+ other_connections = dirs_to_corner_states(other_dirs)
+
+/obj/structure/catwalk/can_climb_from_below(var/mob/climber)
+ return TRUE
+
/obj/structure/catwalk/proc/redraw_nearby_catwalks()
for(var/direction in global.alldirs)
@@ -170,6 +179,9 @@
/obj/structure/catwalk/refresh_neighbors()
return
+/obj/structure/catwalk/is_z_passable()
+ return !plated_tile
+
/obj/effect/catwalk_plated
name = "plated catwalk spawner"
icon = 'icons/obj/structures/catwalks.dmi'
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index cfdce2510d7..3de7c1dba7b 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -88,12 +88,13 @@
return TRUE
var/obj/item/stack/material/rods/R = C
- if(locate(/obj/structure/catwalk) in get_turf(src))
- to_chat(user, SPAN_WARNING("There is already a catwalk here."))
+ var/turf/my_turf = get_turf(src)
+ if(my_turf?.get_supporting_platform())
+ to_chat(user, SPAN_WARNING("There is already a platform here."))
return TRUE
else if(R.use(2))
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
- new /obj/structure/catwalk(src.loc, R.material.type)
+ new /obj/structure/catwalk(my_turf, R.material.type)
return TRUE
else
to_chat(user, SPAN_WARNING("You require at least two rods to complete the catwalk."))
diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm
index 289b7d7c251..b7fba083f5c 100644
--- a/code/game/objects/structures/transit_tubes.dm
+++ b/code/game/objects/structures/transit_tubes.dm
@@ -45,7 +45,12 @@
var/moving = 0
var/datum/gas_mixture/air_contents = new()
-
+/obj/structure/transit_tube_pod/attack_hand(mob/user)
+ if(!moving && length(contents) && isturf(user.loc))
+ user.visible_message(SPAN_NOTICE("\The [user] empties out \the [src]!"))
+ dump_contents()
+ return TRUE
+ return ..()
/obj/structure/transit_tube_pod/Destroy()
dump_contents()
diff --git a/code/game/turfs/flooring/flooring_lava.dm b/code/game/turfs/flooring/flooring_lava.dm
index 9fe4be66e46..d8137d15b35 100644
--- a/code/game/turfs/flooring/flooring_lava.dm
+++ b/code/game/turfs/flooring/flooring_lava.dm
@@ -13,7 +13,7 @@
/decl/flooring/lava/handle_environment_proc(turf/floor/target)
. = PROCESS_KILL
- if(locate(/obj/structure/catwalk) in target)
+ if(target.get_supporting_platform())
return
var/datum/gas_mixture/environment = target.return_air()
var/pressure = environment?.return_pressure()
diff --git a/code/game/turfs/flooring/flooring_snow.dm b/code/game/turfs/flooring/flooring_snow.dm
index e88af2cbf96..f1d1dded76e 100644
--- a/code/game/turfs/flooring/flooring_snow.dm
+++ b/code/game/turfs/flooring/flooring_snow.dm
@@ -4,6 +4,7 @@
icon = 'icons/turf/flooring/snow.dmi'
icon_base = "snow"
icon_edge_layer = FLOOR_EDGE_SNOW
+ flooring_flags = TURF_REMOVE_SHOVEL
footstep_type = /decl/footsteps/snow
has_base_range = 13
force_material = /decl/material/solid/ice/snow
diff --git a/code/game/turfs/floors/floor_attackby.dm b/code/game/turfs/floors/floor_attackby.dm
index f56777dd1c8..8b81baf3ae7 100644
--- a/code/game/turfs/floors/floor_attackby.dm
+++ b/code/game/turfs/floors/floor_attackby.dm
@@ -28,7 +28,7 @@
return ..()
/turf/floor/proc/try_build_catwalk(var/obj/item/used_item, var/mob/user)
- if(!(locate(/obj/structure/catwalk) in src) && istype(used_item, /obj/item/stack/material/rods))
+ if(istype(used_item, /obj/item/stack/material/rods) && !get_supporting_platform())
var/obj/item/stack/material/rods/R = used_item
if (R.use(2))
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
diff --git a/code/game/turfs/floors/floor_digging.dm b/code/game/turfs/floors/floor_digging.dm
index d3cadac07f9..123458d009c 100644
--- a/code/game/turfs/floors/floor_digging.dm
+++ b/code/game/turfs/floors/floor_digging.dm
@@ -1,13 +1,15 @@
/turf/floor
var/gemstone_dropped = FALSE
-/turf/floor/proc/is_fundament()
+/turf/floor/proc/flooring_is_diggable()
var/decl/flooring/flooring = get_topmost_flooring()
- return flooring ? !flooring.constructed : TRUE
+ if(!flooring || flooring.constructed)
+ return FALSE
+ return TRUE
/turf/floor/can_be_dug(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL)
// This should be removed before digging trenches.
- if(!is_fundament())
+ if(!flooring_is_diggable())
return FALSE
var/decl/flooring/flooring = get_base_flooring()
if(istype(flooring) && flooring.constructed)
@@ -27,7 +29,7 @@
return can_be_dug(tool_hardness, using_tool) && get_physical_height() > -(FLUID_DEEP)
/turf/floor/dig_trench(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL)
- if(is_fundament())
+ if(flooring_is_diggable())
handle_trench_digging(user)
/turf/floor/proc/handle_trench_digging(mob/user)
@@ -47,7 +49,7 @@
/turf/floor/get_diggable_resources()
var/decl/material/my_material = get_material()
- if(!is_fundament() || !istype(my_material) || !my_material.dug_drop_type || (get_physical_height() <= -(FLUID_DEEP)))
+ if(!flooring_is_diggable() || !istype(my_material) || !my_material.dug_drop_type || (get_physical_height() <= -(FLUID_DEEP)))
return
. = list()
@@ -64,3 +66,4 @@
gemstone_dropped = TRUE
var/gem_mat = pick(my_material.gemstone_types)
.[/obj/item/gemstone] = list("amount" = 1, "material" = gem_mat)
+
diff --git a/code/game/turfs/floors/floor_height.dm b/code/game/turfs/floors/floor_height.dm
index 7de5fe0441e..8968d6020a5 100644
--- a/code/game/turfs/floors/floor_height.dm
+++ b/code/game/turfs/floors/floor_height.dm
@@ -16,8 +16,7 @@
if(fluid_overlay)
fluid_overlay.update_icon()
- // Clear footprints.
- for(var/obj/effect/footprints/prints in contents)
- qdel(prints)
+ for(var/atom/movable/thing in contents)
+ thing.on_turf_height_change(new_height)
return TRUE
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 896aad13993..43f51cce218 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -86,6 +86,9 @@
var/paint_color
+ /// Floorlike structures like catwalks. Updated/retrieved by get_supporting_platform()
+ var/obj/structure/supporting_platform
+
/turf/Initialize(mapload, ...)
. = null && ..() // This weird construct is to shut up the 'parent proc not called' warning without disabling the lint for child types. We explicitly return an init hint so this won't change behavior.
@@ -140,6 +143,8 @@
/turf/Destroy()
+ supporting_platform = null
+
if(zone)
if(can_safely_remove_from_zone())
c_copy_air()
@@ -204,7 +209,7 @@
if(weather)
. += weather.get_movement_delay(return_air(), travel_dir)
// TODO: check user species webbed feet, wearing swimming gear
- if(reagents?.total_volume > FLUID_PUDDLE)
+ if(!get_supporting_platform() && reagents?.total_volume > FLUID_PUDDLE)
. += (reagents.total_volume > FLUID_SHALLOW) ? 6 : 3
/turf/attack_hand(mob/user)
@@ -247,6 +252,12 @@
if(IS_SHOVEL(W))
+ // TODO: move these checks into the interaction handlers.
+ var/atom/platform = get_supporting_platform()
+ if(platform)
+ to_chat(user, SPAN_WARNING("\The [platform] [platform.get_pronouns().is] in the way!"))
+ return TRUE
+
if(!can_be_dug(W.material?.hardness))
to_chat(user, SPAN_WARNING("\The [src] is too hard to be dug with \the [W]."))
return TRUE
@@ -262,6 +273,12 @@
var/decl/material/material = get_material()
if(IS_PICK(W) && material)
+ // TODO: move these checks into the interaction handlers.
+ var/atom/platform = get_supporting_platform()
+ if(platform)
+ to_chat(user, SPAN_WARNING("\The [platform] [platform.get_pronouns().is] in the way!"))
+ return TRUE
+
if(material?.hardness <= MAT_VALUE_FLEXIBLE)
to_chat(user, SPAN_WARNING("\The [src] is too soft to be excavated with \the [W]. Use a shovel."))
return TRUE
@@ -331,7 +348,7 @@
return 0
// Check if they need to climb out of a hole.
- if(has_gravity())
+ if(has_gravity() && !get_supporting_platform())
var/mob/mover_mob = mover
if(!istype(mover_mob) || (!mover_mob.throwing && !mover_mob.can_overcome_gravity()))
var/turf/old_turf = mover.loc
@@ -744,12 +761,13 @@
var/mob/moving_mob = mover
if(moving_mob.can_overcome_gravity())
return null
- var/fluid_depth = get_fluid_depth()
- if(fluid_depth > FLUID_PUDDLE)
- if(fluid_depth <= FLUID_SHALLOW)
- return "mask_shallow"
- if(fluid_depth <= FLUID_DEEP)
- return "mask_deep"
+ if(!get_supporting_platform())
+ var/fluid_depth = get_fluid_depth()
+ if(fluid_depth > FLUID_PUDDLE)
+ if(fluid_depth <= FLUID_SHALLOW)
+ return "mask_shallow"
+ if(fluid_depth <= FLUID_DEEP)
+ return "mask_deep"
/turf/spark_act(obj/effect/sparks/sparks)
if(simulated)
@@ -814,6 +832,14 @@
/turf/can_be_poured_into(atom/source)
return !density
+/turf/proc/get_supporting_platform()
+ if(isnull(supporting_platform))
+ for(var/obj/structure/platform in get_contained_external_atoms())
+ if(platform.is_platform())
+ supporting_platform = platform
+ break
+ return supporting_platform
+
/turf/get_alt_interactions(mob/user)
. = ..()
LAZYADD(., /decl/interaction_handler/show_turf_contents)
@@ -854,6 +880,12 @@
name = "Dig Trench"
examine_desc = "dig a trench"
+/decl/interaction_handler/dig/trench/is_possible(atom/target, mob/user, obj/item/prop)
+ . = ..()
+ if(. && istype(target, /turf/floor))
+ var/turf/floor/target_turf = target
+ return target_turf.flooring_is_diggable()
+
/decl/interaction_handler/dig/trench/invoked(atom/target, mob/user, obj/item/prop)
prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig.
var/turf/T = get_turf(target)
diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm
index bbac5a1f1e0..670cb312844 100644
--- a/code/game/turfs/turf_changing.dm
+++ b/code/game/turfs/turf_changing.dm
@@ -36,6 +36,7 @@
above.ChangeTurf(open_turf_type, keep_air = TRUE, update_open_turfs_above = FALSE)
/turf/proc/ChangeTurf(var/turf/N, var/tell_universe = TRUE, var/force_lighting_update = FALSE, var/keep_air = FALSE, var/update_open_turfs_above = TRUE, var/keep_height = FALSE)
+
if (!N)
return
@@ -49,6 +50,9 @@
if (!(atom_flags & ATOM_FLAG_INITIALIZED))
return new N(src)
+ // Rebuilt on next call.
+ supporting_platform = null
+
// Track a number of old values for the purposes of raising
// state change events after changing the turf to the new type.
var/old_fire = fire
diff --git a/code/game/turfs/turf_enter.dm b/code/game/turfs/turf_enter.dm
index a0cc300474d..a83d87a855f 100644
--- a/code/game/turfs/turf_enter.dm
+++ b/code/game/turfs/turf_enter.dm
@@ -29,7 +29,9 @@
regenerate_ao()
#endif
- if(isturf(old_loc) && has_gravity() && A.can_fall() && !(weakref(A) in skip_height_fall_for))
+ var/obj/structure/platform = get_supporting_platform()
+ if(isturf(old_loc) && has_gravity() && A.can_fall() && !isnull(platform) && !(weakref(A) in skip_height_fall_for))
+
var/turf/old_turf = old_loc
var/old_height = old_turf.get_physical_height() + old_turf.reagents?.total_volume
var/current_height = get_physical_height() + reagents?.total_volume
@@ -69,7 +71,7 @@
// Delay to allow transition to the new turf and avoid layering issues.
var/mob/M = A
M.reset_offsets()
- if(get_physical_height() > T.get_physical_height())
+ if(platform || (get_physical_height() > T.get_physical_height()))
M.reset_layer()
else
// arbitrary timing value that feels good in practice. it sucks and is inconsistent:(
diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm
index 29ea8eefb0d..1425bfafdcd 100644
--- a/code/game/turfs/turf_fluids.dm
+++ b/code/game/turfs/turf_fluids.dm
@@ -62,7 +62,14 @@
fluid_update() // We are now floodable, so wake up our neighbors.
/turf/is_flooded(var/lying_mob, var/absolute)
- return (flooded || (!absolute && check_fluid_depth(lying_mob ? FLUID_OVER_MOB_HEAD : FLUID_DEEP)))
+ if(flooded)
+ return TRUE
+ if(absolute)
+ return FALSE
+ var/required_depth = lying_mob ? FLUID_OVER_MOB_HEAD : FLUID_DEEP
+ if(get_supporting_platform()) // Increase required depth if we are over the water.
+ required_depth -= get_physical_height() // depth is negative, -= to increase required depth.
+ return check_fluid_depth(required_depth)
/turf/check_fluid_depth(var/min = 1)
. = (get_fluid_depth() >= min)
@@ -117,10 +124,16 @@
..()
if(!QDELETED(src) && fluids?.total_volume)
fluids.touch_turf(src, touch_atoms = FALSE) // Handled in fluid_act() below.
- for(var/atom/movable/AM as anything in get_contained_external_atoms())
- if(!AM.submerged())
- continue
- AM.fluid_act(fluids)
+ // Wet items that are not supported on a platform or such.
+ var/effective_volume = fluids?.total_volume
+ if(get_supporting_platform())
+ // Depth is negative height, hence +=. TODO: positive heights? No idea how to handle that.
+ effective_volume += get_physical_height()
+ if(effective_volume > FLUID_PUDDLE)
+ for(var/atom/movable/AM as anything in get_contained_external_atoms())
+ if(!AM.submerged())
+ continue
+ AM.fluid_act(fluids)
/turf/proc/remove_fluids(var/amount, var/defer_update)
if(!reagents?.total_liquid_volume)
diff --git a/code/game/turfs/turf_footsteps.dm b/code/game/turfs/turf_footsteps.dm
index 371d40feefa..bfa1f917156 100644
--- a/code/game/turfs/turf_footsteps.dm
+++ b/code/game/turfs/turf_footsteps.dm
@@ -12,4 +12,4 @@
return get_footstep_for_mob(/decl/footsteps/water, caller)
if(footstep_type)
return get_footstep_for_mob(footstep_type, caller)
- return get_footstep_for_mob(/decl/footsteps/blank, caller)
\ No newline at end of file
+ return get_footstep_for_mob(/decl/footsteps/blank, caller)
diff --git a/code/game/turfs/walls/wall_natural.dm b/code/game/turfs/walls/wall_natural.dm
index 96967f55e2e..ce8ea3dbbce 100644
--- a/code/game/turfs/walls/wall_natural.dm
+++ b/code/game/turfs/walls/wall_natural.dm
@@ -172,7 +172,7 @@
if(!prob(reinf_material.ore_spread_chance))
continue
var/turf/wall/natural/target_turf = get_step_resolving_mimic(src, trydir)
- if(!istype(target_turf) || !isnull(target_turf.reinf_material))
+ if(!istype(target_turf) || !isnull(target_turf.reinf_material) || target_turf.ramp_slope_direction)
continue
target_turf.set_turf_materials(target_turf.material, reinf_material)
target_turf.spread_deposit()
diff --git a/code/modules/augment/augment.dm b/code/modules/augment/augment.dm
index ff96aabde04..3ff300f33a4 100644
--- a/code/modules/augment/augment.dm
+++ b/code/modules/augment/augment.dm
@@ -7,6 +7,7 @@
default_action_type = /datum/action/item_action/organ/augment
material = /decl/material/solid/metal/steel
origin_tech = @'{"materials":1,"magnets":2,"engineering":2,"biotech":1}'
+ w_class = ITEM_SIZE_TINY
var/descriptor = ""
var/known = TRUE
diff --git a/code/modules/fluids/_fluid.dm b/code/modules/fluids/_fluid.dm
index 13f78edf239..58f73cd55c4 100644
--- a/code/modules/fluids/_fluid.dm
+++ b/code/modules/fluids/_fluid.dm
@@ -15,6 +15,10 @@
var/updating_edge_mask
var/force_flow_direction
+/atom/movable/fluid_overlay/on_turf_height_change(new_height)
+ update_icon()
+ return TRUE
+
/atom/movable/fluid_overlay/on_update_icon()
var/datum/reagents/loc_reagents = loc?.reagents
diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm
index 46ab1b85227..05dffe2609c 100644
--- a/code/modules/hydroponics/trays/tray_soil.dm
+++ b/code/modules/hydroponics/trays/tray_soil.dm
@@ -63,7 +63,7 @@
return
if(prob(25))
return
- to_chat(walker, SPAN_DANGER("You trample \the [seed]!"))
+ to_chat(walker, SPAN_DANGER("You trample \the [seed.display_name]!"))
plant_health = max(0, plant_health - rand(3,5))
check_plant_health()
diff --git a/code/modules/interactions/interactions_reagents.dm b/code/modules/interactions/interactions_reagents.dm
index 8b584709c4c..7a50cfaacf5 100644
--- a/code/modules/interactions/interactions_reagents.dm
+++ b/code/modules/interactions/interactions_reagents.dm
@@ -4,7 +4,7 @@
examine_desc = "dip an item into $TARGET_THEM$"
/decl/interaction_handler/dip_item/is_possible(atom/target, mob/user, obj/item/prop)
- return ..() && target.reagents?.total_volume >= FLUID_MINIMUM_TRANSFER && istype(prop) && target.can_be_poured_from(user, prop)
+ return ..() && target != prop && target.reagents?.total_volume >= FLUID_MINIMUM_TRANSFER && istype(prop) && target.can_be_poured_from(user, prop)
/decl/interaction_handler/dip_item/invoked(atom/target, mob/user, obj/item/prop)
user.visible_message(SPAN_NOTICE("\The [user] dips \the [prop] into \the [target.reagents.get_primary_reagent_name()]."))
@@ -25,7 +25,7 @@
/decl/interaction_handler/fill_from/is_possible(atom/target, mob/user, obj/item/prop)
if(!(. = ..()))
return
- if(target.reagents?.total_volume < FLUID_PUDDLE)
+ if(target == prop || target.reagents?.total_volume < FLUID_PUDDLE)
return FALSE
if(!istype(prop) || (!isitem(target) && !istype(target, /obj/structure/reagent_dispensers)))
return FALSE
@@ -48,7 +48,7 @@
/decl/interaction_handler/empty_into/is_possible(atom/target, mob/user, obj/item/prop)
if(!(. = ..()))
return
- if(!istype(prop) || prop.reagents?.total_volume <= 0)
+ if(target == prop || !istype(prop) || prop.reagents?.total_volume <= 0)
return FALSE
return target.can_be_poured_into(user, prop) && prop.can_be_poured_from(user, target)
diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm
index 7ef37a05e79..27a86377dc8 100644
--- a/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm
+++ b/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm
@@ -13,7 +13,7 @@
/datum/level_data/planetoid/exoplanet/barren
base_area = /area/exoplanet/barren
- base_turf = /turf/floor
+ base_turf = /turf/floor/barren
exterior_atmosphere = null //Generate me
exterior_atmos_temp = null //Generate me
level_generators = list(
@@ -99,7 +99,7 @@
///Generator for fauna and flora spawners for the surface of the barren exoplanet
/datum/random_map/noise/exoplanet/barren
descriptor = "barren exoplanet"
- land_type = /turf/floor
+ land_type = /turf/floor/barren
flora_prob = 0.1
large_flora_prob = 0
fauna_prob = 0
@@ -111,7 +111,7 @@
/area/exoplanet/barren
name = "\improper Planetary surface"
- base_turf = /turf/floor
+ base_turf = /turf/floor/barren
is_outside = OUTSIDE_YES
ambience = list(
'sound/effects/wind/wind_2_1.ogg',
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 512db5f11ba..e7e9ef15e08 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -967,12 +967,12 @@
/mob/proc/get_gender()
return gender
-/mob/is_fluid_pushable(var/amt)
- if(..() && !buckled && (current_posture.prone || !Check_Shoegrip()) && (amt >= mob_size * (current_posture.prone ? 5 : 10)))
+/mob/try_fluid_push(volume, strength)
+ if(..() && !buckled && (current_posture.prone || !Check_Shoegrip()) && (strength >= mob_size * (current_posture.prone ? 5 : 10)))
if(!current_posture.prone)
SET_STATUS_MAX(src, STAT_WEAK, 1)
if(current_posture.prone && prob(10))
- to_chat(src, "You are pushed down by the flood!")
+ to_chat(src, SPAN_DANGER("You are pushed down by the flood!"))
return TRUE
return FALSE
diff --git a/code/modules/mob/mob_layering.dm b/code/modules/mob/mob_layering.dm
index d98e8923528..e4ecb2b5007 100644
--- a/code/modules/mob/mob_layering.dm
+++ b/code/modules/mob/mob_layering.dm
@@ -7,9 +7,9 @@
var/last_layer = layer
var/new_layer = get_base_layer()
if(isturf(loc))
- var/turf/T = loc
- if(T.pixel_z < 0)
- new_layer = T.layer + 0.25
+ var/turf/my_turf = loc
+ if(my_turf.pixel_z < 0 && !my_turf.get_supporting_platform())
+ new_layer = my_turf.layer + 0.25
else if(buckled && buckled.buckle_layer_above)
new_layer = buckled.layer + ((buckled.dir == SOUTH) ? -0.01 : 0.01)
else if(length(grabbed_by))
@@ -97,8 +97,14 @@
// Update offsets from loc.
var/turf/floor/ext = loc
- if(istype(ext) && ext.height < 0)
- new_pixel_z += ext.pixel_z
+ if(istype(ext))
+ var/obj/structure/platform = ext.get_supporting_platform()
+ if(platform)
+ new_pixel_z += platform.pixel_z
+ else if(ext.height < 0)
+ new_pixel_z += ext.pixel_z
+
+ // Check for catwalks/supporting platforms.
// Update offsets from our buckled atom.
if(buckled && buckled.buckle_pixel_shift)
diff --git a/code/modules/multiz/ladder.dm b/code/modules/multiz/ladder.dm
index 2bdad6e2350..b86299bcf5f 100644
--- a/code/modules/multiz/ladder.dm
+++ b/code/modules/multiz/ladder.dm
@@ -71,8 +71,8 @@
var/turf/L = loc
if(HasBelow(z) && istype(L) && L.is_open())
var/failed
- for(var/obj/structure/catwalk/catwalk in loc)
- if(catwalk.plated_tile)
+ for(var/obj/structure/platform in loc)
+ if(!platform.is_z_passable())
failed = TRUE
break
if(!failed)
@@ -86,8 +86,8 @@
var/turf/T = GetAbove(src)
if(istype(T) && T.is_open())
var/failed
- for(var/obj/structure/catwalk/catwalk in T)
- if(catwalk.plated_tile)
+ for(var/obj/structure/platform in T)
+ if(!platform.is_z_passable())
failed = TRUE
break
if(!failed)
@@ -214,18 +214,18 @@
if(!istype(T) || !T.is_open())
to_chat(M, SPAN_WARNING("The ceiling is in the way!"))
return null
- for(var/obj/structure/catwalk/catwalk in target_up.loc)
- if(catwalk.plated_tile)
- to_chat(M, SPAN_WARNING("\The [catwalk] is in the way!"))
+ for(var/obj/structure/platform in target_up.loc)
+ if(!platform.is_z_passable())
+ to_chat(M, SPAN_WARNING("\The [platform] is in the way!"))
return null
if(. == target_down)
var/turf/T = loc
if(!istype(T) || !T.is_open())
to_chat(M, SPAN_WARNING("\The [loc] is in the way!"))
return null
- for(var/obj/structure/catwalk/catwalk in loc)
- if(catwalk.plated_tile)
- to_chat(M, SPAN_WARNING("\The [catwalk] is in the way!"))
+ for(var/obj/structure/platform in loc)
+ if(!platform.is_z_passable())
+ to_chat(M, SPAN_WARNING("\The [platform] is in the way!"))
return null
/mob/proc/may_climb_ladders(var/ladder)
diff --git a/code/modules/multiz/level_data.dm b/code/modules/multiz/level_data.dm
index d1aeb0bdaee..44ae9990eca 100644
--- a/code/modules/multiz/level_data.dm
+++ b/code/modules/multiz/level_data.dm
@@ -189,7 +189,6 @@
initialize_level_id()
SSmapping.register_level_data(src)
- setup_ambient()
setup_exterior_atmosphere()
if(SSmapping.initialized && !defer_level_setup)
setup_level_data()
@@ -241,6 +240,7 @@
if(!skip_gen)
generate_level()
after_generate_level()
+ setup_ambient()
// Determine our relative positioning.
// First find an appropriate origin point.
@@ -756,6 +756,12 @@ INITIALIZE_IMMEDIATE(/obj/abstract/level_data_spawner)
level_flags = (ZLEVEL_CONTACT|ZLEVEL_PLAYER|ZLEVEL_SEALED)
filler_turf = /turf/unsimulated/dark_filler
+// Used in order to avoid making the level too large. Only works if loaded prior to SSmapping init... it's unclear if this really does much.
+/datum/level_data/unit_test/after_template_load(var/datum/map_template/template)
+ . = ..()
+ level_max_width ||= template.width
+ level_max_height ||= template.height
+
/datum/level_data/overmap
name = "Sensor Display"
level_flags = ZLEVEL_SEALED
@@ -772,7 +778,8 @@ INITIALIZE_IMMEDIATE(/obj/abstract/level_data_spawner)
return ..()
/datum/level_data/mining_level/asteroid
- base_turf = /turf/floor
+ base_turf = /turf/floor/barren
+ filler_turf = /turf/space
level_generators = list(
/datum/random_map/automata/cave_system,
/datum/random_map/noise/ore
@@ -865,9 +872,6 @@ INITIALIZE_IMMEDIATE(/obj/abstract/level_data_spawner)
/datum/level_data/proc/load_subtemplate(turf/central_turf, datum/map_template/template)
if(!template)
return FALSE
- for(var/turf/T in template.get_affected_turfs(central_turf, TRUE))
- for(var/mob/living/simple_animal/monster in T)
- qdel(monster)
template.load(central_turf, centered = TRUE)
return TRUE
diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm
index 01db42e5261..c08433c2a3c 100644
--- a/code/modules/multiz/turf.dm
+++ b/code/modules/multiz/turf.dm
@@ -9,7 +9,7 @@
return FALSE
else if(direction == DOWN)
- if(!is_open() || !HasBelow(z) || (locate(/obj/structure/catwalk) in src))
+ if(!is_open() || !HasBelow(z) || get_supporting_platform())
return FALSE
if(check_neighbor_canzpass)
var/turf/T = GetBelow(src)
diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm
index faa52cb2323..687a43d3814 100644
--- a/code/modules/organs/external/_external.dm
+++ b/code/modules/organs/external/_external.dm
@@ -62,7 +62,7 @@
var/artery_name = "artery" // Flavour text for cartoid artery, aorta, etc.
var/arterial_bleed_severity = 1 // Multiplier for bleeding in a limb.
var/tendon_name = "tendon" // Flavour text for Achilles tendon, etc.
- var/cavity_name = "cavity"
+ var/cavity_name = "intramuscular cavity"
// Surgery vars.
var/cavity_max_w_class = ITEM_SIZE_TINY //this is increased if bigger organs spawn by default inside
diff --git a/code/modules/organs/external/head.dm b/code/modules/organs/external/head.dm
index 1d6b432822c..b0930a27868 100644
--- a/code/modules/organs/external/head.dm
+++ b/code/modules/organs/external/head.dm
@@ -12,7 +12,7 @@
amputation_point = "neck"
encased = "skull"
artery_name = "carotid artery"
- cavity_name = "cranial"
+ cavity_name = "cranial cavity"
limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_HEALS_OVERKILL | ORGAN_FLAG_CAN_BREAK | ORGAN_FLAG_CAN_DISLOCATE
var/glowing_eyes = FALSE
diff --git a/code/modules/organs/external/standard.dm b/code/modules/organs/external/standard.dm
index 2beef64083b..3969df5e653 100644
--- a/code/modules/organs/external/standard.dm
+++ b/code/modules/organs/external/standard.dm
@@ -17,7 +17,7 @@
parent_organ = null
encased = "ribcage"
artery_name = "aorta"
- cavity_name = "thoracic"
+ cavity_name = "thoracic cavity"
limb_flags = ORGAN_FLAG_HEALS_OVERKILL | ORGAN_FLAG_CAN_BREAK
/obj/item/organ/external/chest/proc/get_current_skin()
@@ -41,7 +41,7 @@
amputation_point = "lumbar"
joint = "hip"
artery_name = "iliac artery"
- cavity_name = "abdominal"
+ cavity_name = "abdominal cavity"
limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_BREAK
/obj/item/organ/external/groin/die()
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index d4da8ee5045..e34fd58e061 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -80,8 +80,8 @@
if(handle_casings == HOLD_CASINGS)
ammo_magazine.stored_ammo += chambered
ammo_magazine.initial_ammo--
- else if(ammo_magazine.stored_ammo.len)
- chambered = ammo_magazine.stored_ammo[ammo_magazine.stored_ammo.len]
+ else if(length(ammo_magazine.stored_ammo))
+ chambered = ammo_magazine.stored_ammo[length(ammo_magazine.stored_ammo)]
if(handle_casings != HOLD_CASINGS)
ammo_magazine.stored_ammo -= chambered
@@ -340,9 +340,9 @@
/obj/item/gun/projectile/proc/get_ammo_indicator()
var/base_state = get_world_inventory_state()
- if(!ammo_magazine || !LAZYLEN(ammo_magazine.stored_ammo))
+ if(!ammo_magazine || !ammo_magazine.get_stored_ammo_count())
return mutable_appearance(icon, "[base_state]_ammo_bad")
- else if(LAZYLEN(ammo_magazine.stored_ammo) <= 0.5 * ammo_magazine.max_ammo)
+ else if(LAZYLEN(ammo_magazine.get_stored_ammo_count()) <= 0.5 * ammo_magazine.max_ammo)
return mutable_appearance(icon, "[base_state]_ammo_warn")
else
return mutable_appearance(icon, "[base_state]_ammo_ok")
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 7505d0152aa..802b1f93863 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -35,7 +35,7 @@
/obj/item/gun/projectile/automatic/smg/on_update_icon()
..()
if(ammo_magazine)
- add_overlay("[get_world_inventory_state()]mag-[round(length(ammo_magazine.stored_ammo),5)]")
+ add_overlay("[get_world_inventory_state()]mag-[round(ammo_magazine.get_stored_ammo_count(),5)]")
/obj/item/gun/projectile/automatic/assault_rifle
name = "assault rifle"
diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm
index 6c00e6c2594..ee2edcdcfae 100644
--- a/code/modules/projectiles/guns/projectile/dartgun.dm
+++ b/code/modules/projectiles/guns/projectile/dartgun.dm
@@ -37,13 +37,13 @@
/obj/item/gun/projectile/dartgun/on_update_icon()
..()
if(ammo_magazine)
- icon_state = "[get_world_inventory_state()]-[clamp(length(ammo_magazine.get_stored_ammo_count()), 0, 5)]"
+ icon_state = "[get_world_inventory_state()]-[clamp(ammo_magazine.get_stored_ammo_count(), 0, 5)]"
else
icon_state = get_world_inventory_state()
/obj/item/gun/projectile/dartgun/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE)
if(overlay && (slot in user_mob?.get_held_item_slots()) && ammo_magazine)
- overlay.icon_state += "-[clamp(length(ammo_magazine.get_stored_ammo_count()), 0, 5)]"
+ overlay.icon_state += "-[clamp(ammo_magazine.get_stored_ammo_count(), 0, 5)]"
. = ..()
/obj/item/gun/projectile/dartgun/consume_next_projectile()
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index 638376989ee..e64e7c3f731 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -17,7 +17,7 @@
/obj/item/gun/projectile/pistol/update_base_icon_state()
. = ..()
- if(!length(ammo_magazine?.stored_ammo))
+ if(!ammo_magazine?.get_stored_ammo_count())
var/empty_state = "[icon_state]-e"
if(check_state_in_icon(empty_state, icon))
icon_state = empty_state
diff --git a/code/modules/random_map/automata/caves.dm b/code/modules/random_map/automata/caves.dm
index d12f5a79204..91044cd99d5 100644
--- a/code/modules/random_map/automata/caves.dm
+++ b/code/modules/random_map/automata/caves.dm
@@ -2,7 +2,7 @@
iterations = 5
descriptor = "moon caves"
wall_type = /turf/wall/natural
- floor_type = /turf/floor
+ floor_type = /turf/floor/barren
target_turf_type = /turf/unsimulated/mask
var/sparse_mineral_turf = /turf/wall/natural/random
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index db904892033..de18007e761 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -200,9 +200,17 @@
//
// Interactions
//
+/obj/item/chems/get_quick_interaction_handler(mob/user)
+ var/static/interaction = GET_DECL(/decl/interaction_handler/set_transfer/chems)
+ return interaction
+
/obj/item/chems/get_alt_interactions(var/mob/user)
. = ..()
- LAZYADD(., /decl/interaction_handler/set_transfer/chems)
+ var/static/list/chem_interactions = list(
+ /decl/interaction_handler/set_transfer/chems,
+ /decl/interaction_handler/empty/chems
+ )
+ LAZYADD(., chem_interactions)
/decl/interaction_handler/set_transfer/chems
expected_target_type = /obj/item/chems
diff --git a/code/modules/reagents/reagent_containers/drinks.dm b/code/modules/reagents/reagent_containers/drinks.dm
index 695412409f8..d80b593cf60 100644
--- a/code/modules/reagents/reagent_containers/drinks.dm
+++ b/code/modules/reagents/reagent_containers/drinks.dm
@@ -148,7 +148,7 @@
add_to_reagents(/decl/material/liquid/drink/milk/chocolate, reagents.maximum_volume)
/obj/item/chems/drinks/coffee
- name = "\improper Robust Coffee"
+ name = "cup of coffee"
desc = "Careful, the beverage you're about to enjoy is extremely hot."
icon_state = "coffee"
center_of_mass = @'{"x":15,"y":10}'
@@ -269,16 +269,14 @@
//tea and tea accessories
/obj/item/chems/drinks/tea
- name = "cup of tea master item"
+ name = "cup of tea"
desc = "A tall plastic cup full of the concept and ideal of tea."
icon_state = "coffee"
item_state = "coffee"
center_of_mass = @'{"x":16,"y":14}'
filling_states = @"[100]"
- base_name = "cup"
base_icon = "cup"
volume = 30
- presentation_flags = PRESENTATION_FLAG_NAME
/obj/item/chems/drinks/tea/black
name = "cup of black tea"
diff --git a/code/modules/reagents/reagent_containers/packets.dm b/code/modules/reagents/reagent_containers/packets.dm
index c46af37998f..391c3440471 100644
--- a/code/modules/reagents/reagent_containers/packets.dm
+++ b/code/modules/reagents/reagent_containers/packets.dm
@@ -7,7 +7,14 @@
amount_per_transfer_from_this = 1
volume = 10
-/obj/item/chems/packet/afterattack(var/obj/target, var/mob/user, var/proximity)
+/obj/item/chems/packet/attack_self(mob/user)
+ if(!ATOM_IS_OPEN_CONTAINER(src))
+ atom_flags |= ATOM_FLAG_OPEN_CONTAINER
+ to_chat(user, SPAN_NOTICE("You tear \the [src] open."))
+ return TRUE
+ return ..()
+
+/obj/item/chems/packet/afterattack(obj/target, mob/user, proximity)
if(!proximity)
return ..()
if(standard_dispenser_refill(user, target))
@@ -54,6 +61,14 @@
icon = 'icons/obj/food/condiments/packets/packet_medium.dmi'
/obj/item/chems/packet/honey/populate_reagents()
+ add_to_reagents(/decl/material/liquid/nutriment/honey, reagents.maximum_volume)
+
+/obj/item/chems/packet/honey_fake
+ name = "'honey' packet"
+ desc = "Contains 10u of allergen-free non-GMO 'honey'."
+ icon = 'icons/obj/food/condiments/packets/packet_medium.dmi'
+
+/obj/item/chems/packet/honey_fake/populate_reagents()
add_to_reagents(/decl/material/liquid/nutriment/sugar, reagents.maximum_volume)
/obj/item/chems/packet/capsaicin
diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm
index 32980d3c189..4946a2b424d 100644
--- a/code/modules/species/species.dm
+++ b/code/modules/species/species.dm
@@ -80,9 +80,11 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200
// Combat vars.
var/total_health = DEFAULT_SPECIES_HEALTH // Point at which the mob will enter crit.
var/list/unarmed_attacks = list( // Possible unarmed attacks that the mob will use in combat,
- /decl/natural_attack,
+ /decl/natural_attack/stomp,
+ /decl/natural_attack/kick,
+ /decl/natural_attack/punch,
/decl/natural_attack/bite
- )
+ )
var/brute_mod = 1 // Physical damage multiplier.
var/burn_mod = 1 // Burn damage multiplier.
diff --git a/code/modules/species/station/human.dm b/code/modules/species/station/human.dm
index 6264a7b2048..2ee92427f41 100644
--- a/code/modules/species/station/human.dm
+++ b/code/modules/species/station/human.dm
@@ -2,12 +2,6 @@
name = SPECIES_HUMAN
name_plural = "Humans"
primitive_form = SPECIES_MONKEY
- unarmed_attacks = list(
- /decl/natural_attack/stomp,
- /decl/natural_attack/kick,
- /decl/natural_attack/punch,
- /decl/natural_attack/bite
- )
description = "A medium-sized creature prone to great ambition. If you are reading this, you are probably a human."
hidden_from_codex = FALSE
spawn_flags = SPECIES_CAN_JOIN
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index 1b8ef1751a0..be2f0f6b69d 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -21,6 +21,12 @@
affected.take_external_damage(20, 0, (DAM_SHARP|DAM_EDGE), used_weapon = tool)
..()
+/decl/surgery_step/cavity/get_skill_reqs(mob/living/user, mob/living/target, obj/item/tool, target_zone)
+ var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
+ if(!affected || !BP_IS_PROSTHETIC(affected) || BP_IS_CRYSTAL(affected))
+ return ..()
+ return SURGERY_SKILLS_ROBOTIC
+
//////////////////////////////////////////////////////////////////
// create implant space surgery step
//////////////////////////////////////////////////////////////////
@@ -38,16 +44,16 @@
/decl/surgery_step/cavity/make_space/begin_step(mob/user, mob/living/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
- user.visible_message("[user] starts making some space inside [target]'s [affected.cavity_name] cavity with \the [tool].", \
- "You start making some space inside [target]'s [affected.cavity_name] cavity with \the [tool]." )
+ user.visible_message("[user] starts making some space inside [target]'s [affected.cavity_name] with \the [tool].", \
+ "You start making some space inside [target]'s [affected.cavity_name] with \the [tool]." )
target.custom_pain("The pain in your chest is living hell!",1,affecting = affected)
affected.cavity = TRUE
..()
/decl/surgery_step/cavity/make_space/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
- user.visible_message("[user] makes some space inside [target]'s [affected.cavity_name] cavity with \the [tool].", \
- "You make some space inside [target]'s [affected.cavity_name] cavity with \the [tool]." )
+ user.visible_message("[user] makes some space inside [target]'s \the [affected.cavity_name] with \the [tool].", \
+ "You make some space inside [target]'s \the [affected.cavity_name] with \the [tool]." )
..()
//////////////////////////////////////////////////////////////////
@@ -70,15 +76,15 @@
/decl/surgery_step/cavity/close_space/begin_step(mob/user, mob/living/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
- user.visible_message("[user] starts mending [target]'s [affected.cavity_name] cavity wall with \the [tool].", \
- "You start mending [target]'s [affected.cavity_name] cavity wall with \the [tool]." )
+ user.visible_message("[user] starts mending [target]'s \the [affected.cavity_name] wall with \the [tool].", \
+ "You start mending [target]'s \the [affected.cavity_name] wall with \the [tool]." )
target.custom_pain("The pain in your chest is living hell!",1,affecting = affected)
..()
/decl/surgery_step/cavity/close_space/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
- user.visible_message("[user] mends [target]'s [affected.cavity_name] cavity walls with \the [tool].", \
- "You mend [target]'s [affected.cavity_name] cavity walls with \the [tool]." )
+ user.visible_message("[user] mends [target]'s \the [affected.cavity_name] walls with \the [tool].", \
+ "You mend [target]'s \the [affected.cavity_name] walls with \the [tool]." )
affected.cavity = FALSE
..()
@@ -109,7 +115,7 @@
if(affected && affected.cavity)
var/max_volume = BASE_STORAGE_CAPACITY(affected.cavity_max_w_class) + affected.internal_organs_size
if(tool.w_class > affected.cavity_max_w_class)
- to_chat(user, SPAN_WARNING("\The [tool] is too big for [affected.cavity_name] cavity."))
+ to_chat(user, SPAN_WARNING("\The [tool] is too big for \the [affected.cavity_name]."))
return FALSE
var/total_volume = tool.get_storage_cost()
for(var/obj/item/I in affected.implants)
@@ -119,14 +125,14 @@
for(var/obj/item/organ/internal/org in affected.internal_organs)
max_volume -= org.get_storage_cost()
if(total_volume > max_volume)
- to_chat(user, SPAN_WARNING("There isn't enough space left in [affected.cavity_name] cavity for [tool]."))
+ to_chat(user, SPAN_WARNING("There isn't enough space left in \the [affected.cavity_name] for [tool]."))
return FALSE
return TRUE
/decl/surgery_step/cavity/place_item/begin_step(mob/user, mob/living/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
- user.visible_message("[user] starts putting \the [tool] inside [target]'s [affected.cavity_name] cavity.", \
- "You start putting \the [tool] inside [target]'s [affected.cavity_name] cavity." )
+ user.visible_message("[user] starts putting \the [tool] inside [target]'s \the [affected.cavity_name].", \
+ "You start putting \the [tool] inside [target]'s \the [affected.cavity_name]." )
target.custom_pain("The pain in your chest is living hell!",1,affecting = affected)
..()
@@ -134,8 +140,8 @@
var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone)
if(!user.try_unequip(tool, affected))
return
- user.visible_message("[user] puts \the [tool] inside [target]'s [affected.cavity_name] cavity.", \
- "You put \the [tool] inside [target]'s [affected.cavity_name] cavity." )
+ user.visible_message("[user] puts \the [tool] inside [target]'s \the [affected.cavity_name].", \
+ "You put \the [tool] inside [target]'s \the [affected.cavity_name]." )
if (tool.w_class > affected.cavity_max_w_class/2 && prob(50) && !BP_IS_PROSTHETIC(affected) && affected.sever_artery())
to_chat(user, "You tear some blood vessels trying to fit such a big object in this cavity.")
affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1,affecting = affected)
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 916db17c1d2..76b37e9eb8d 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -262,7 +262,7 @@
return FALSE
if(O.w_class > affected.cavity_max_w_class)
- to_chat(user, SPAN_WARNING("\The [O.name] [pronouns.is] too big for [affected.cavity_name] cavity!"))
+ to_chat(user, SPAN_WARNING("\The [O.name] [pronouns.is] too big for \the [affected.cavity_name]!"))
return FALSE
var/obj/item/organ/internal/I = GET_INTERNAL_ORGAN(target, O.organ_tag)
diff --git a/icons/clothing/spacesuit/void/medical_alt/suit.dmi b/icons/clothing/spacesuit/void/medical_alt/suit.dmi
index 77b79193e46..634b6742079 100644
Binary files a/icons/clothing/spacesuit/void/medical_alt/suit.dmi and b/icons/clothing/spacesuit/void/medical_alt/suit.dmi differ
diff --git a/maps/antag_spawn/ert/ert_base.dmm b/maps/antag_spawn/ert/ert_base.dmm
index e105bb2c1a8..703d909d0c3 100644
--- a/maps/antag_spawn/ert/ert_base.dmm
+++ b/maps/antag_spawn/ert/ert_base.dmm
@@ -1195,10 +1195,6 @@
/obj/machinery/vending/medical,
/turf/unsimulated/wall,
/area/map_template/rescue_base/base)
-"dj" = (
-/obj/effect/wingrille_spawn/reinforced/crescent,
-/turf/space,
-/area/map_template/rescue_base/base)
"dk" = (
/obj/machinery/door/airlock/centcom{
name = "EVA"
@@ -4269,7 +4265,7 @@ ar
cH
ar
cS
-dj
+bg
ao
ao
bg
@@ -4334,7 +4330,7 @@ ar
cI
ar
cT
-dj
+bg
ao
ao
bg
@@ -4399,7 +4395,7 @@ ar
ar
ar
cU
-dj
+bg
ao
ao
bg
@@ -4464,7 +4460,7 @@ cy
cJ
cO
cV
-dj
+bg
ao
ao
ad
diff --git a/maps/away/lost_supply_base/lost_supply_base.dmm b/maps/away/lost_supply_base/lost_supply_base.dmm
index aac57b9b881..55d86201533 100644
--- a/maps/away/lost_supply_base/lost_supply_base.dmm
+++ b/maps/away/lost_supply_base/lost_supply_base.dmm
@@ -1982,7 +1982,7 @@
/turf/unsimulated/mask,
/area/mine/unexplored)
"gu" = (
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"ib" = (
/obj/structure/hygiene/sink{
diff --git a/maps/away/mining/mining-asteroid.dmm b/maps/away/mining/mining-asteroid.dmm
index 63713ba4434..89a0612365c 100644
--- a/maps/away/mining/mining-asteroid.dmm
+++ b/maps/away/mining/mining-asteroid.dmm
@@ -6,14 +6,14 @@
/turf/unsimulated/mask,
/area/mine/unexplored)
"af" = (
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"aj" = (
/turf/wall/r_wall,
/area/djstation)
"ak" = (
/obj/random/junk,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"al" = (
/obj/random/trash,
@@ -204,15 +204,15 @@
/area/djstation)
"be" = (
/obj/random/maintenance,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"bf" = (
/obj/effect/overmap/visitable/sector/cluster,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"cb" = (
/obj/effect/shuttle_landmark/cluster/nav5,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"db" = (
/obj/effect/shuttle_landmark/cluster/nav6,
@@ -236,7 +236,7 @@
/area/space)
"ib" = (
/obj/effect/shuttle_landmark/cluster/nav7,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"jb" = (
/obj/machinery/button/access/exterior{
@@ -245,7 +245,7 @@
pixel_y = -24;
dir = 1
},
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"kb" = (
/obj/machinery/door/airlock/external{
@@ -345,7 +345,7 @@
req_access = null;
dir = 4
},
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"wb" = (
/obj/machinery/door/airlock/external{
diff --git a/maps/away/mining/mining-orb.dmm b/maps/away/mining/mining-orb.dmm
index 0f03154da5c..46fc8c21fb4 100644
--- a/maps/away/mining/mining-orb.dmm
+++ b/maps/away/mining/mining-orb.dmm
@@ -14,10 +14,10 @@
/turf/unsimulated/mask,
/area/mine/unexplored)
"ae" = (
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"af" = (
-/turf/floor,
+/turf/floor/barren,
/area/mine/unexplored)
"ag" = (
/turf/wall/natural/random/high_chance,
@@ -250,7 +250,7 @@
/area/mine/explored)
"st" = (
/obj/effect/shuttle_landmark/orb/nav7,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"vc" = (
/obj/effect/floor_decal/spline/fancy/wood{
@@ -277,7 +277,7 @@
/obj/effect/floor_decal/spline/fancy/wood/corner{
dir = 4
},
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"Aj" = (
/obj/effect/floor_decal/spline/fancy/wood/corner,
diff --git a/maps/away/mining/mining_areas.dm b/maps/away/mining/mining_areas.dm
index 94d5e15d978..3dd6da72529 100644
--- a/maps/away/mining/mining_areas.dm
+++ b/maps/away/mining/mining_areas.dm
@@ -3,7 +3,7 @@
icon_state = "mining"
ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg')
sound_env = ASTEROID
- base_turf = /turf/floor
+ base_turf = /turf/floor/barren
area_flags = AREA_FLAG_IS_BACKGROUND | AREA_FLAG_HIDE_FROM_HOLOMAP
/area/mine/explored
diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm
index 1881db19743..a0dbd796036 100644
--- a/maps/away/smugglers/smugglers.dmm
+++ b/maps/away/smugglers/smugglers.dmm
@@ -3,7 +3,7 @@
/turf/space,
/area/space)
"ab" = (
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"ac" = (
/turf/unsimulated/mask,
@@ -24,7 +24,7 @@
/turf/floor,
/area/smugglers/base)
"ah" = (
-/turf/floor,
+/turf/floor/barren,
/area/space)
"aj" = (
/obj/item/ammo_casing/pistol/magnum{
@@ -37,11 +37,11 @@
pixel_y = -5
},
/obj/effect/decal/cleanable/blood,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"ak" = (
/obj/effect/decal/cleanable/blood,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"al" = (
/obj/effect/wallframe_spawn/reinforced,
@@ -98,7 +98,7 @@
pixel_y = 7
},
/obj/item/flashlight/flare/glowstick/yellow,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"av" = (
/obj/effect/decal/cleanable/blood/drip,
@@ -281,11 +281,11 @@
pixel_x = -25;
pixel_y = 25
},
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"aM" = (
/obj/random/trash,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"aN" = (
/obj/machinery/light/small{
@@ -432,7 +432,7 @@
/obj/item/tool/xeno/hand{
pixel_x = -15
},
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"bh" = (
/obj/effect/floor_decal/industrial/warning{
@@ -476,7 +476,7 @@
/area/smugglers/base)
"bn" = (
/obj/structure/boulder,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"bo" = (
/obj/item/stack/material/ore/silver,
@@ -484,7 +484,7 @@
pixel_x = 10;
pixel_y = -5
},
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"bp" = (
/obj/structure/cable{
@@ -946,7 +946,7 @@
"db" = (
/obj/effect/decal/cleanable/blood,
/obj/abstract/landmark/corpse/doctor,
-/turf/floor,
+/turf/floor/barren,
/area/mine/explored)
"eb" = (
/obj/machinery/light/small{
diff --git a/maps/away_sites_testing/away_sites_testing_define.dm b/maps/away_sites_testing/away_sites_testing_define.dm
index 8b605741a84..fd1868d5c2a 100644
--- a/maps/away_sites_testing/away_sites_testing_define.dm
+++ b/maps/away_sites_testing/away_sites_testing_define.dm
@@ -20,10 +20,10 @@
var/list/unsorted_sites = list_values(SSmapping.get_templates_by_category(MAP_TEMPLATE_CATEGORY_AWAYSITE))
var/list/sorted_sites = sortTim(unsorted_sites, /proc/cmp_sort_templates_tallest_to_shortest)
for (var/datum/map_template/A in sorted_sites)
- A.load_new_z(centered = FALSE)
+ A.load_new_z()
testing("Spawning [A] in [english_list(SSmapping.get_connected_levels(world.maxz))]")
if(A.template_flags & TEMPLATE_FLAG_TEST_DUPLICATES)
- A.load_new_z(centered = FALSE)
+ A.load_new_z()
testing("Spawning [A] in [english_list(SSmapping.get_connected_levels(world.maxz))]")
/proc/cmp_sort_templates_tallest_to_shortest(var/datum/map_template/a, var/datum/map_template/b)
diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm
index f0257f29891..6646873ff83 100644
--- a/maps/ministation/ministation-1.dmm
+++ b/maps/ministation/ministation-1.dmm
@@ -9764,12 +9764,12 @@
/obj/structure/table/laminate,
/obj/item/eftpos,
/obj/item/chems/spray/cleaner,
+/obj/item/chems/packet/honey_fake,
+/obj/item/chems/packet/honey_fake,
/obj/item/chems/packet/honey,
/obj/item/chems/packet/honey,
/obj/item/chems/packet/honey,
-/obj/item/chems/packet/honey,
-/obj/item/chems/packet/honey,
-/obj/item/chems/packet/honey,
+/obj/item/chems/packet/honey_fake,
/obj/item/chems/packet/honey,
/turf/floor/lino,
/area/ministation/cafe)
diff --git a/maps/planets/test_planet/neutralia-2.dmm b/maps/planets/test_planet/neutralia-2.dmm
index 8b5e82e76e8..cc84b991ea8 100644
--- a/maps/planets/test_planet/neutralia-2.dmm
+++ b/maps/planets/test_planet/neutralia-2.dmm
@@ -3,11 +3,11 @@
/turf/unsimulated/mineral,
/area/exoplanet/underground/neutralia)
"b" = (
-/turf/floor,
+/turf/floor/barren,
/area/exoplanet/underground/neutralia)
"c" = (
/obj/abstract/level_data_spawner/neutralia/underground,
-/turf/floor,
+/turf/floor/barren,
/area/exoplanet/underground/neutralia)
(1,1,1) = {"
diff --git a/maps/planets/test_planet/neutralia-3.dmm b/maps/planets/test_planet/neutralia-3.dmm
index 768772a0f91..f7d1ff768ee 100644
--- a/maps/planets/test_planet/neutralia-3.dmm
+++ b/maps/planets/test_planet/neutralia-3.dmm
@@ -1,6 +1,6 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"a" = (
-/turf/floor,
+/turf/floor/barren,
/area/exoplanet/neutralia)
"b" = (
/turf/unsimulated/mineral,
@@ -17,15 +17,15 @@
/area/exoplanet/neutralia)
"j" = (
/obj/abstract/landmark/exoplanet_spawn/large_plant,
-/turf/floor,
+/turf/floor/barren,
/area/exoplanet/neutralia)
"o" = (
/obj/abstract/landmark/exoplanet_spawn/animal,
-/turf/floor,
+/turf/floor/barren,
/area/exoplanet/neutralia)
"x" = (
/obj/abstract/landmark/exoplanet_spawn/plant,
-/turf/floor,
+/turf/floor/barren,
/area/exoplanet/neutralia)
(1,1,1) = {"
diff --git a/maps/planets/test_planet/test_planet.dm b/maps/planets/test_planet/test_planet.dm
index 159722fde19..83c42703e65 100644
--- a/maps/planets/test_planet/test_planet.dm
+++ b/maps/planets/test_planet/test_planet.dm
@@ -131,14 +131,14 @@
name = "neutralia surface"
level_id = NEUTRALIA_SURFACE_LEVEL_ID
base_area = /area/exoplanet/neutralia
- base_turf = /turf/floor
+ base_turf = /turf/floor/barren
border_filler = /turf/unsimulated/dark_filler
/datum/level_data/planetoid/neutralia/underground
name = "neutralia underground"
level_id = "neutralia_underground"
base_area = /area/exoplanet/underground/neutralia
- base_turf = /turf/floor
+ base_turf = /turf/floor/barren
border_filler = /turf/unsimulated/mineral
/datum/level_data/planetoid/neutralia/underground/bottom
diff --git a/mods/species/bayliens/skrell/datum/species.dm b/mods/species/bayliens/skrell/datum/species.dm
index 00fa25e43e6..c52a6dc6735 100644
--- a/mods/species/bayliens/skrell/datum/species.dm
+++ b/mods/species/bayliens/skrell/datum/species.dm
@@ -14,12 +14,6 @@
traits = list(/decl/trait/malus/intolerance/protein = TRAIT_LEVEL_MINOR)
primitive_form = "Neaera"
- unarmed_attacks = list(
- /decl/natural_attack/stomp,
- /decl/natural_attack/kick,
- /decl/natural_attack/punch,
- /decl/natural_attack/bite
- )
description = "The Skrell are a highly advanced race of amphibians hailing from the system known as Qerr'Vallis. Their society is regimented into \
five different castes which the Qerr'Katish, or Royal Caste, rules over. Skrell are strict herbivores who are unable to eat large quantities of \
diff --git a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm
index de0b3b76a70..e3be8485345 100644
--- a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm
+++ b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm
@@ -47,5 +47,6 @@
/obj/item/clothing/suit/space/void
_feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi'
+
/obj/item/clothing/suit/space/void/excavation
_feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi'
diff --git a/mods/species/neoavians/clothing.dm b/mods/species/neoavians/clothing.dm
index e7d90e623ea..db6790ea35e 100644
--- a/mods/species/neoavians/clothing.dm
+++ b/mods/species/neoavians/clothing.dm
@@ -18,11 +18,12 @@
_avian_onmob_icon = null
//Backpacks & tanks
-
/obj/item/backpack/satchel
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/satchel.dmi'
//Radsuits (theyre essential?)
+/obj/item/clothing/head/radiation
+ _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/head/rad_helm.dmi'
/obj/item/clothing/head/radiation
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/head/rad_helm.dmi'
@@ -77,12 +78,16 @@
name = "stylish uniform"
icon = 'mods/species/neoavians/icons/clothing/under/stylish_form.dmi'
+/obj/item/clothing/shoes
+ _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/feet/shoes.dmi'
+
/obj/item/clothing/shoes/avian
name = "small shoes"
icon = 'mods/species/neoavians/icons/clothing/feet/shoes.dmi'
color = COLOR_GRAY
bodytype_equip_flags = BODY_EQUIP_FLAG_AVIAN
_avian_onmob_icon = null
+ icon = 'mods/species/neoavians/icons/clothing/feet/shoes.dmi'
/obj/item/clothing/shoes/avian/footwraps
name = "cloth footwraps"
diff --git a/mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi b/mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi
index fe7e1534a7e..645c2a006bf 100644
Binary files a/mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi and b/mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi differ
diff --git a/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/helmet.dmi b/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/helmet.dmi
new file mode 100644
index 00000000000..779b0d77fe4
Binary files /dev/null and b/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/helmet.dmi differ
diff --git a/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/suit.dmi b/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/suit.dmi
new file mode 100644
index 00000000000..c84f8e938c6
Binary files /dev/null and b/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/suit.dmi differ
diff --git a/mods/species/neoavians/machinery/suit_cycler.dm b/mods/species/neoavians/machinery/suit_cycler.dm
index 2fd6323e6ed..4397f39c94d 100644
--- a/mods/species/neoavians/machinery/suit_cycler.dm
+++ b/mods/species/neoavians/machinery/suit_cycler.dm
@@ -11,7 +11,6 @@
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi'
//excavation
-
/obj/item/clothing/suit/space/void/excavation
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi'
@@ -19,7 +18,6 @@
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi'
//engineering
-
/obj/item/clothing/head/helmet/space/void/engineering
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/helmet.dmi'
@@ -33,15 +31,19 @@
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/suit.dmi'
//medical
-
/obj/item/clothing/suit/space/void/medical
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/suit.dmi'
/obj/item/clothing/head/helmet/space/void/medical
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi'
-//security
+/obj/item/clothing/suit/space/void/medical/alt
+ _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/suit.dmi'
+/obj/item/clothing/head/helmet/space/void/medical/alt
+ _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/helmet.dmi'
+
+//security
/obj/item/clothing/head/helmet/space/void/security
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/helmet.dmi'
@@ -49,7 +51,6 @@
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/suit.dmi'
//salvage
-
/obj/item/clothing/head/helmet/space/void/engineering/salvage
_avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/helmet.dmi'
diff --git a/test/run-test.sh b/test/run-test.sh
index a9907ae692c..e4bac59b824 100755
--- a/test/run-test.sh
+++ b/test/run-test.sh
@@ -222,8 +222,8 @@ function run_byond_tests {
then exit 1
else msg "configured map is '$MAP_PATH'"
fi
- cp config/example/* config/
- cp data/secrets/example/* data/secrets/
+ cp -r config/example/* config/
+ cp -r data/secrets/example/* data/secrets/
if [[ "$CI" == "true" ]]; then
msg "installing BYOND"
./install-byond.sh || exit 1