From bf2354f87225f3d7a57895958740c6c055d87bf3 Mon Sep 17 00:00:00 2001
From: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Date: Sat, 3 Sep 2022 14:39:17 -0700
Subject: [PATCH 01/13] Micro-optimize GetIdFromArguments to be 48% faster,
gaining 0.48s of init time on local (likely more in prod) (#69659)
About The Pull Request
Avoids stringifying key unless its necessary. This was done redundantly twice, but I locked it to just the isnum path, as REF will always return a string, and the other path passes istext.
Use sortTim directly instead of sort_list. sort_list is just sortTim but it copies the list, so it's just wasted cost.
I still would like the bespoke element key option, as that's the only way to drastically cut down costs on things like item descriptions and decals, but this is good for the general use case, and makes it marginally less pressing.
I also want to test if we'd be better off inserting into the list in sorted order rather than sorting it all in the end, but I suspect not.
---
code/controllers/subsystem/dcs.dm | 28 ++++++-----
code/modules/unit_tests/_unit_tests.dm | 1 +
.../unit_tests/dcs_get_id_from_elements.dm | 46 +++++++++++++++++++
3 files changed, 64 insertions(+), 11 deletions(-)
create mode 100644 code/modules/unit_tests/dcs_get_id_from_elements.dm
diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm
index 8d745fbd0e2c..faf9c96f2828 100644
--- a/code/controllers/subsystem/dcs.dm
+++ b/code/controllers/subsystem/dcs.dm
@@ -33,22 +33,28 @@ PROCESSING_SUBSYSTEM_DEF(dcs)
var/datum/element/eletype = arguments[1]
var/list/fullid = list("[eletype]")
var/list/named_arguments = list()
+
for(var/i in initial(eletype.id_arg_index) to length(arguments))
var/key = arguments[i]
- var/value
+
if(istext(key))
- value = arguments[key]
- if(!(istext(key) || isnum(key)))
- key = REF(key)
- key = "[key]" // Key is stringified so numbers dont break things
- if(!isnull(value))
- if(!(istext(value) || isnum(value)))
- value = REF(value)
- named_arguments["[key]"] = value
- else
+ var/value = arguments[key]
+ if (isnull(value))
+ fullid += key
+ else
+ if (!istext(value) && !isnum(value))
+ value = REF(value)
+ named_arguments[key] = value
+
+ continue
+
+ if (isnum(key))
fullid += "[key]"
+ else
+ fullid += REF(key)
if(length(named_arguments))
- named_arguments = sort_list(named_arguments)
+ named_arguments = sortTim(named_arguments, /proc/cmp_text_asc)
fullid += named_arguments
+
return list2params(fullid)
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index b18c5d5787b6..69e2958fa3c3 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -87,6 +87,7 @@
#include "connect_loc.dm"
#include "crayons.dm"
#include "create_and_destroy.dm"
+#include "dcs_get_id_from_elements.dm"
#include "designs.dm"
#include "dummy_spawn.dm"
#include "dynamic_ruleset_sanity.dm"
diff --git a/code/modules/unit_tests/dcs_get_id_from_elements.dm b/code/modules/unit_tests/dcs_get_id_from_elements.dm
new file mode 100644
index 000000000000..3a6e1447657c
--- /dev/null
+++ b/code/modules/unit_tests/dcs_get_id_from_elements.dm
@@ -0,0 +1,46 @@
+/// Tests that DCS' GetIdFromArguments works as expected with standard and odd cases
+/datum/unit_test/dcs_get_id_from_arguments
+
+/datum/unit_test/dcs_get_id_from_arguments/Run()
+ assert_equal(list(1), list(1))
+ assert_equal(list(1, 2), list(1, 2))
+ assert_equal(list(src), list(src))
+
+ assert_equal(
+ list(a = "x", b = "y", c = "z"),
+ list(b = "y", a = "x", c = "z"),
+ list(c = "z", a = "x", b = "y"),
+ )
+
+ TEST_ASSERT_NOTEQUAL(get_id_from_arguments(list(1, 2)), get_id_from_arguments(list(2, 1)), "Swapped arguments should not return the same id")
+ TEST_ASSERT_NOTEQUAL(get_id_from_arguments(list(1, a = "x")), get_id_from_arguments(list(1)), "Named arguments were ignored when creating ids")
+ TEST_ASSERT_NOTEQUAL(get_id_from_arguments(list(1, a = "x")), get_id_from_arguments(list(a = "x")), "Unnamed arguments were ignored when creating ids")
+ TEST_ASSERT_NOTEQUAL(get_id_from_arguments(list(src)), get_id_from_arguments(list(world)), "References to different datums should not return the same id")
+
+ TEST_ASSERT_NOTEQUAL(get_id_from_arguments(list()), SSdcs.GetIdFromArguments(list(/datum/element/dcs_get_id_from_arguments_mock_element2)), "Different elements should not match the same id")
+
+/datum/unit_test/dcs_get_id_from_arguments/proc/assert_equal(reference, ...)
+ var/result = get_id_from_arguments(reference)
+
+ // Start at 1 so the 2nd argument is 2
+ var/index = 1
+
+ for (var/other_case in args)
+ index += 1
+
+ var/other_result = get_id_from_arguments(other_case)
+
+ if (other_result == result)
+ continue
+
+ TEST_FAIL("Case #[index] produces a different GetIdFromArguments result from the first. [other_result] != [result]")
+
+/datum/unit_test/dcs_get_id_from_arguments/proc/get_id_from_arguments(list/arguments)
+ return SSdcs.GetIdFromArguments(list(/datum/element/dcs_get_id_from_arguments_mock_element) + arguments)
+
+// Necessary because GetIdFromArguments uses id_arg_index from an element type
+/datum/element/dcs_get_id_from_arguments_mock_element
+ id_arg_index = 2
+
+/datum/element/dcs_get_id_from_arguments_mock_element2
+ id_arg_index = 2
From 62651344092d2ea91a17c18f69f173b27731c9f3 Mon Sep 17 00:00:00 2001
From: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Date: Sat, 3 Sep 2022 17:22:45 -0700
Subject: [PATCH 02/13] Load circuit components from USB ports on demand,
saving 0.5s of init time (0.7s on prod) (#69664)
We create 2,383 circuit components (on whatever map I was looking at on Sybil at the time, don't know) from USB ports every round, quite pricey. This makes them initialize once when a USB is first plugged in.
---
code/datums/components/usb_port.dm | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/code/datums/components/usb_port.dm b/code/datums/components/usb_port.dm
index db947dfcc077..09c3080107c5 100644
--- a/code/datums/components/usb_port.dm
+++ b/code/datums/components/usb_port.dm
@@ -24,7 +24,7 @@
circuit_components = list()
- set_circuit_components(circuit_component_types)
+ src.circuit_component_types = circuit_component_types
/datum/component/usb_port/proc/set_circuit_components(list/components)
var/should_register = FALSE
@@ -136,6 +136,9 @@
/datum/component/usb_port/proc/on_atom_usb_cable_try_attach(datum/source, obj/item/usb_cable/connecting_cable, mob/user)
SIGNAL_HANDLER
+ if (!length(circuit_components))
+ set_circuit_components(circuit_component_types)
+
var/atom/atom_parent = parent
if (!isnull(attached_circuit))
From 2d8f543abf49e17e5fee3b923cd590d0b0c89d73 Mon Sep 17 00:00:00 2001
From: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Date: Sat, 3 Sep 2022 05:33:29 -0700
Subject: [PATCH 03/13] speed
---
code/game/atoms.dm | 4 +++-
code/game/atoms_movable.dm | 3 ++-
code/game/machinery/doors/windowdoor.dm | 22 +++++++++----------
.../asset_cache/assets/research_designs.dm | 2 ++
code/modules/asset_cache/assets/vending.dm | 18 ++++++++-------
5 files changed, 27 insertions(+), 22 deletions(-)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index a05a91cf0968..cba588516e8b 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -306,7 +306,9 @@
orbiters = null // The component is attached to us normaly and will be deleted elsewhere
- LAZYCLEARLIST(overlays)
+ if(length(overlays))
+ overlays.Cut()
+
LAZYNULL(managed_overlays)
QDEL_NULL(light)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 3cb7abd58b9b..16d87c8688c2 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -200,7 +200,8 @@
vis_locs = null //clears this atom out of all viscontents
- vis_contents.Cut()
+ if(length(vis_contents))
+ vis_contents.Cut()
/atom/movable/proc/update_emissive_block()
if(!blocks_emissive)
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index cf198ef83b37..4fa8e15e6763 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -23,7 +23,6 @@
var/shards = 2
var/rods = 2
var/cable = 1
- var/list/debris = list()
/obj/machinery/door/window/Initialize(mapload, set_dir, unres_sides)
. = ..()
@@ -34,12 +33,6 @@
if(LAZYLEN(req_access))
icon_state = "[icon_state]"
base_state = icon_state
- for(var/i in 1 to shards)
- debris += new /obj/item/shard(src)
- if(rods)
- debris += new /obj/item/stack/rods(src, rods)
- if(cable)
- debris += new /obj/item/stack/cable_coil(src, cable)
if(unres_sides)
//remove unres_sides from directions it can't be bumped from
@@ -67,7 +60,6 @@
/obj/machinery/door/window/Destroy()
set_density(FALSE)
- QDEL_LIST(debris)
if(atom_integrity == 0)
playsound(src, SFX_SHATTER, 70, TRUE)
electronics = null
@@ -251,12 +243,18 @@
/obj/machinery/door/window/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1) && !disassembled)
- for(var/obj/fragment in debris)
- fragment.forceMove(get_turf(src))
- transfer_fingerprints_to(fragment)
- debris -= fragment
+ for(var/i in 1 to shards)
+ drop_debris(new /obj/item/shard(src))
+ if(rods)
+ drop_debris(new /obj/item/stack/rods(src, rods))
+ if(cable)
+ drop_debris(new /obj/item/stack/cable_coil(src, cable))
qdel(src)
+/obj/machinery/door/window/proc/drop_debris(obj/item/debris)
+ debris.forceMove(loc)
+ transfer_fingerprints_to(debris)
+
/obj/machinery/door/window/narsie_act()
add_atom_colour("#7D1919", FIXED_COLOUR_PRIORITY)
diff --git a/code/modules/asset_cache/assets/research_designs.dm b/code/modules/asset_cache/assets/research_designs.dm
index 506c3d50d9f1..7768875fa658 100644
--- a/code/modules/asset_cache/assets/research_designs.dm
+++ b/code/modules/asset_cache/assets/research_designs.dm
@@ -25,9 +25,11 @@
icon_file = initial(item.icon)
icon_state = initial(item.icon_state)
+ #ifdef UNIT_TESTS
if(!icon_exists(icon_file, icon_state, FALSE))
warning("design [D] with icon '[icon_file]' missing state '[icon_state]'")
continue
+ #endif
I = icon(icon_file, icon_state, SOUTH)
Insert(initial(D.id), I)
diff --git a/code/modules/asset_cache/assets/vending.dm b/code/modules/asset_cache/assets/vending.dm
index 87fddfc1132c..01a6afcf5247 100644
--- a/code/modules/asset_cache/assets/vending.dm
+++ b/code/modules/asset_cache/assets/vending.dm
@@ -13,23 +13,25 @@
else
icon_file = initial(item.icon)
var/icon_state = initial(item.icon_state)
- var/icon/I
+ #ifdef UNIT_TESTS
var/icon_states_list = icon_states(icon_file)
- if(icon_state in icon_states_list)
- I = icon(icon_file, icon_state, SOUTH)
- var/c = initial(item.color)
- if (!isnull(c) && c != "#FFFFFF")
- I.Blend(c, ICON_MULTIPLY)
- else
+ if (!(icon_state in icon_states_list))
var/icon_states_string
for (var/an_icon_state in icon_states_list)
if (!icon_states_string)
icon_states_string = "[json_encode(an_icon_state)](\ref[an_icon_state])"
else
icon_states_string += ", [json_encode(an_icon_state)](\ref[an_icon_state])"
+
stack_trace("[item] does not have a valid icon state, icon=[icon_file], icon_state=[json_encode(icon_state)](\ref[icon_state]), icon_states=[icon_states_string]")
- I = icon('icons/turf/floors.dmi', "", SOUTH)
+ continue
+ #endif
+
+ var/icon/I = icon(icon_file, icon_state, SOUTH)
+ var/c = initial(item.color)
+ if (!isnull(c) && c != "#FFFFFF")
+ I.Blend(c, ICON_MULTIPLY)
var/imgid = replacetext(replacetext("[item]", "/obj/item/", ""), "/", "-")
From b4f84f7c579740e9dde1e3bb64a41b6496c3b98f Mon Sep 17 00:00:00 2001
From: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Date: Sat, 5 Nov 2022 07:00:59 -0700
Subject: [PATCH 04/13] big ports
---
code/__DEFINES/dcs/flags.dm | 5 +-
code/__DEFINES/mapswitch.dm | 8 ++
code/datums/elements/ELEMENT_TEMPLATE.md | 2 +-
code/datums/elements/art.dm | 2 +-
code/datums/elements/bane.dm | 2 +-
code/datums/elements/bed_tucking.dm | 2 +-
code/datums/elements/bump_click.dm | 2 +-
code/datums/elements/chemical_transfer.dm | 2 +-
code/datums/elements/climbable.dm | 2 +-
code/datums/elements/crackable.dm | 2 +-
code/datums/elements/curse_announcement.dm | 2 +-
code/datums/elements/cursed.dm | 1 -
code/datums/elements/delete_on_drop.dm | 1 -
code/datums/elements/deliver_first.dm | 2 +-
code/datums/elements/drag_pickup.dm | 1 -
code/datums/elements/easily_fragmented.dm | 2 +-
code/datums/elements/empprotection.dm | 2 +-
code/datums/elements/eyestab.dm | 2 +-
code/datums/elements/frozen.dm | 1 -
code/datums/elements/haunted.dm | 1 -
code/datums/elements/honkspam.dm | 1 -
code/datums/elements/kneecapping.dm | 1 -
code/datums/elements/kneejerk.dm | 1 -
code/datums/elements/light_eaten.dm | 2 +-
code/datums/elements/light_eater.dm | 1 -
code/datums/elements/movement_turf_changer.dm | 2 +-
.../elements/openspace_item_click_handler.dm | 1 -
code/datums/elements/pet_bonus.dm | 2 +-
.../elements/prevent_attacking_of_types.dm | 2 +-
.../elements/radiation_protected_clothing.dm | 1 -
code/datums/elements/ranged_attacks.dm | 2 +-
code/datums/elements/ridable.dm | 2 +-
code/datums/elements/rust.dm | 2 +-
.../contextual_screentip_item_typechecks.dm | 2 +-
.../screentips/contextual_screentip_tools.dm | 2 +-
code/datums/elements/series.dm | 2 +-
code/datums/elements/simple_flying.dm | 1 -
code/datums/elements/skittish.dm | 1 -
code/datums/elements/soft_landing.dm | 2 +-
code/datums/elements/spooky.dm | 2 +-
code/datums/elements/tenacious.dm | 1 -
code/datums/elements/venomous.dm | 2 +-
code/datums/elements/wall_engraver.dm | 1 -
code/game/atoms_movable.dm | 2 +-
code/game/machinery/camera/presets.dm | 20 ++--
.../computer/chef_orders/chef_order.dm | 2 +-
.../computer/chef_orders/order_datum.dm | 101 +++++++++---------
.../embedded_controller/access_controller.dm | 4 +-
code/game/machinery/slotmachine.dm | 13 ++-
.../machinery/telecomms/telecomunications.dm | 5 +-
.../objects/structures/beds_chairs/chair.dm | 7 +-
code/game/objects/structures/tables_racks.dm | 41 +++----
code/game/turfs/closed/minerals.dm | 60 ++++-------
.../lavalandruin_code/elephantgraveyard.dm | 2 +-
code/modules/shuttle/supply.dm | 2 +-
.../unit_tests/orderable_item_descriptions.dm | 16 +++
daedalus.dme | 1 +
57 files changed, 168 insertions(+), 188 deletions(-)
create mode 100644 code/__DEFINES/mapswitch.dm
create mode 100644 code/modules/unit_tests/orderable_item_descriptions.dm
diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm
index 2657b95f3b38..687a0e13428b 100644
--- a/code/__DEFINES/dcs/flags.dm
+++ b/code/__DEFINES/dcs/flags.dm
@@ -9,7 +9,10 @@
#define ELEMENT_INCOMPATIBLE 1
// /datum/element flags
-/// Causes the detach proc to be called when the host object is being deleted
+/// Causes the detach proc to be called when the host object is being deleted.
+/// Should only be used if you need to perform cleanup not related to the host object.
+/// You do not need this if you are only unregistering signals, for instance.
+/// You would need it if you are doing something like removing the target from a processing list.
#define ELEMENT_DETACH (1 << 0)
/**
* Only elements created with the same arguments given after `id_arg_index` share an element instance
diff --git a/code/__DEFINES/mapswitch.dm b/code/__DEFINES/mapswitch.dm
new file mode 100644
index 000000000000..dbb0059786ee
--- /dev/null
+++ b/code/__DEFINES/mapswitch.dm
@@ -0,0 +1,8 @@
+/// Uses the left operator when compiling, uses the right operator when not compiling.
+// Currently uses the CBT macro, but if http://www.byond.com/forum/post/2831057 is ever added,
+// or if map tools ever agree on a standard, this should switch to use that.
+#ifdef CBT
+#define MAP_SWITCH(compile_time, map_time) ##compile_time
+#else
+#define MAP_SWITCH(compile_time, map_time) ##map_time
+#endif
diff --git a/code/datums/elements/ELEMENT_TEMPLATE.md b/code/datums/elements/ELEMENT_TEMPLATE.md
index 333375b3508d..ce6ab0a3c6b2 100644
--- a/code/datums/elements/ELEMENT_TEMPLATE.md
+++ b/code/datums/elements/ELEMENT_TEMPLATE.md
@@ -5,7 +5,7 @@ See _element.dm for detailed explanations
```dm
/datum/element/myelement
- element_flags = ELEMENT_BESPOKE | ELEMENT_COMPLEX_DETACH | ELEMENT_DETACH | ELEMENT_NOTAREALFLAG // code/__DEFINES/dcs/flags.dm
+ element_flags = ELEMENT_BESPOKE | ELEMENT_COMPLEX_DETACH | ELEMENT_DETACH_ON_HOST_DESTROY | ELEMENT_NOTAREALFLAG // code/__DEFINES/dcs/flags.dm
//id_arg_index = 2 // Use with ELEMENT_BESPOKE
var/list/myvar = list()
diff --git a/code/datums/elements/art.dm b/code/datums/elements/art.dm
index 8b2b80d91586..36eef6fc8877 100644
--- a/code/datums/elements/art.dm
+++ b/code/datums/elements/art.dm
@@ -1,5 +1,5 @@
/datum/element/art
- element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs
id_arg_index = 2
var/impressiveness = 0
diff --git a/code/datums/elements/bane.dm b/code/datums/elements/bane.dm
index 6d146d005e26..377ba8a7242e 100644
--- a/code/datums/elements/bane.dm
+++ b/code/datums/elements/bane.dm
@@ -1,6 +1,6 @@
/// Deals extra damage to mobs of a certain type or species.
/datum/element/bane
- element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
/// can be a mob or a species.
var/target_type
diff --git a/code/datums/elements/bed_tucking.dm b/code/datums/elements/bed_tucking.dm
index 53a95ab2c055..569825725d38 100644
--- a/code/datums/elements/bed_tucking.dm
+++ b/code/datums/elements/bed_tucking.dm
@@ -1,6 +1,6 @@
/// Tucking element, for things that can be tucked into bed.
/datum/element/bed_tuckable
- element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
/// our pixel_x offset - how much the item moves x when in bed (+x is closer to the pillow)
var/x_offset = 0
diff --git a/code/datums/elements/bump_click.dm b/code/datums/elements/bump_click.dm
index 25f2d58e7511..ac8fc0d7289e 100644
--- a/code/datums/elements/bump_click.dm
+++ b/code/datums/elements/bump_click.dm
@@ -4,7 +4,7 @@
* Simulates a click on the attached atom when it's bumped, if the bumper and their active object meet certain criteria.
*/
/datum/element/bump_click
- element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs
id_arg_index = 2
///Tool behaviours to check for on the bumper's active held item before clicking the attached atom with it.
var/list/tool_behaviours
diff --git a/code/datums/elements/chemical_transfer.dm b/code/datums/elements/chemical_transfer.dm
index 4c8ac3267b0d..cf6f5e82f746 100644
--- a/code/datums/elements/chemical_transfer.dm
+++ b/code/datums/elements/chemical_transfer.dm
@@ -12,7 +12,7 @@
* victim_message uses %ATTACKER for the same.
*/
/datum/element/chemical_transfer
- element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
///chance for the chemical transfer to proc.
var/transfer_prob
diff --git a/code/datums/elements/climbable.dm b/code/datums/elements/climbable.dm
index 7fbfbcf1f3a5..247b1d1863f7 100644
--- a/code/datums/elements/climbable.dm
+++ b/code/datums/elements/climbable.dm
@@ -1,5 +1,5 @@
/datum/element/climbable
- element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs
id_arg_index = 2
///Time it takes to climb onto the object
var/climb_time = (2 SECONDS)
diff --git a/code/datums/elements/crackable.dm b/code/datums/elements/crackable.dm
index e2ab7c7f0728..1907bea30246 100644
--- a/code/datums/elements/crackable.dm
+++ b/code/datums/elements/crackable.dm
@@ -1,6 +1,6 @@
/// Adds crack overlays to an object when integrity gets low
/datum/element/crackable
- element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
var/list/icon/crack_appearances
/// The level at which the object starts showing cracks, 1 being at full health and 0.5 being at half health
diff --git a/code/datums/elements/curse_announcement.dm b/code/datums/elements/curse_announcement.dm
index 4d8f58790527..0c048178af54 100644
--- a/code/datums/elements/curse_announcement.dm
+++ b/code/datums/elements/curse_announcement.dm
@@ -6,7 +6,7 @@
* Possible improvements for the future: add an option to allow the cursed affix to be a prefix. right now only coded for suffixes
*/
/datum/element/curse_announcement
- element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
///message sent on announce
var/announcement_message
diff --git a/code/datums/elements/cursed.dm b/code/datums/elements/cursed.dm
index 686ce3851396..f8742fe61b2d 100644
--- a/code/datums/elements/cursed.dm
+++ b/code/datums/elements/cursed.dm
@@ -4,7 +4,6 @@
*Attaching this element to something will make it float, and get a special ai controller!
*/
/datum/element/cursed
- element_flags = ELEMENT_DETACH
/datum/element/cursed/Attach(datum/target, slot)
. = ..()
diff --git a/code/datums/elements/delete_on_drop.dm b/code/datums/elements/delete_on_drop.dm
index b3db3bf60844..afb39f97fb94 100644
--- a/code/datums/elements/delete_on_drop.dm
+++ b/code/datums/elements/delete_on_drop.dm
@@ -2,7 +2,6 @@
* Attaches to an item, if that item is dropped on the floor delete it
*/
/datum/element/delete_on_drop
- element_flags = ELEMENT_DETACH
var/list/myvar = list()
/datum/element/delete_on_drop/Attach(datum/target)
diff --git a/code/datums/elements/deliver_first.dm b/code/datums/elements/deliver_first.dm
index e4f5399c33e9..4b1d430df74a 100644
--- a/code/datums/elements/deliver_first.dm
+++ b/code/datums/elements/deliver_first.dm
@@ -9,7 +9,7 @@
#define DENY_SOUND_COOLDOWN (2 SECONDS)
/datum/element/deliver_first
- element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
///typepath of the area we will be allowed to be opened in
var/goal_area_type
diff --git a/code/datums/elements/drag_pickup.dm b/code/datums/elements/drag_pickup.dm
index c33216d43e70..48264c308d82 100644
--- a/code/datums/elements/drag_pickup.dm
+++ b/code/datums/elements/drag_pickup.dm
@@ -4,7 +4,6 @@
* Used for paper bins.
*/
/datum/element/drag_pickup
- element_flags = ELEMENT_DETACH
/datum/element/drag_pickup/Attach(datum/target)
if(!ismovable(target))
diff --git a/code/datums/elements/easily_fragmented.dm b/code/datums/elements/easily_fragmented.dm
index 4eb5d09f2000..f5e8e244d8a3 100644
--- a/code/datums/elements/easily_fragmented.dm
+++ b/code/datums/elements/easily_fragmented.dm
@@ -4,7 +4,7 @@
*/
/datum/element/easily_fragmented
- element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
var/break_chance
diff --git a/code/datums/elements/empprotection.dm b/code/datums/elements/empprotection.dm
index 8d5d798c3cb8..0c8912ec3ed3 100644
--- a/code/datums/elements/empprotection.dm
+++ b/code/datums/elements/empprotection.dm
@@ -1,5 +1,5 @@
/datum/element/empprotection
- element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs
id_arg_index = 2
var/flags = NONE
diff --git a/code/datums/elements/eyestab.dm b/code/datums/elements/eyestab.dm
index 2006c11c4530..b21706bbe5a8 100644
--- a/code/datums/elements/eyestab.dm
+++ b/code/datums/elements/eyestab.dm
@@ -3,7 +3,7 @@
/// An element that lets you stab people in the eyes when targeting them
/datum/element/eyestab
- element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
/// The amount of damage to do per eyestab
diff --git a/code/datums/elements/frozen.dm b/code/datums/elements/frozen.dm
index 51f879839c47..8ff4365ecdce 100644
--- a/code/datums/elements/frozen.dm
+++ b/code/datums/elements/frozen.dm
@@ -2,7 +2,6 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
///simple element to handle frozen obj's
/datum/element/frozen
- element_flags = ELEMENT_DETACH
/datum/element/frozen/Attach(datum/target)
. = ..()
diff --git a/code/datums/elements/haunted.dm b/code/datums/elements/haunted.dm
index 1f0c3570a532..d2f3c8530e46 100644
--- a/code/datums/elements/haunted.dm
+++ b/code/datums/elements/haunted.dm
@@ -1,6 +1,5 @@
///Attaching this element to something will make it float, get a special ai controller, and gives it a spooky outline.
/datum/element/haunted
- element_flags = ELEMENT_DETACH
/datum/element/haunted/Attach(datum/target)
. = ..()
diff --git a/code/datums/elements/honkspam.dm b/code/datums/elements/honkspam.dm
index 05f4592e8ac9..9b4c649ca1ce 100644
--- a/code/datums/elements/honkspam.dm
+++ b/code/datums/elements/honkspam.dm
@@ -1,6 +1,5 @@
/// Attachable to items. Plays a bikehorn sound whenever attack_self is called (with a cooldown).
/datum/element/honkspam
- element_flags = ELEMENT_DETACH
/datum/element/honkspam/Attach(datum/target)
. = ..()
diff --git a/code/datums/elements/kneecapping.dm b/code/datums/elements/kneecapping.dm
index 3440ee80f4db..13e3ffe09c73 100644
--- a/code/datums/elements/kneecapping.dm
+++ b/code/datums/elements/kneecapping.dm
@@ -15,7 +15,6 @@
* Passing all the checks will cancel the entire attack chain.
*/
/datum/element/kneecapping
- element_flags = ELEMENT_DETACH
/datum/element/kneecapping/Attach(datum/target)
if(!isitem(target))
diff --git a/code/datums/elements/kneejerk.dm b/code/datums/elements/kneejerk.dm
index dbf30ba2a386..839431da5cee 100644
--- a/code/datums/elements/kneejerk.dm
+++ b/code/datums/elements/kneejerk.dm
@@ -1,6 +1,5 @@
/// An element which enables certain items to tap people on their knees to measure brain health
/datum/element/kneejerk
- element_flags = ELEMENT_DETACH
/datum/element/kneejerk/Attach(datum/target)
. = ..()
diff --git a/code/datums/elements/light_eaten.dm b/code/datums/elements/light_eaten.dm
index 8d1d1337bb8c..340caa8178da 100644
--- a/code/datums/elements/light_eaten.dm
+++ b/code/datums/elements/light_eaten.dm
@@ -2,7 +2,7 @@
* Makes anything that it attaches to incapable of producing light
*/
/datum/element/light_eaten
- element_flags = ELEMENT_DETACH
+ element_flags = ELEMENT_DETACH // Detach for turfs
/datum/element/light_eaten/Attach(atom/target)
if(!isatom(target))
diff --git a/code/datums/elements/light_eater.dm b/code/datums/elements/light_eater.dm
index 963d42729ccd..ec38658bc033 100644
--- a/code/datums/elements/light_eater.dm
+++ b/code/datums/elements/light_eater.dm
@@ -4,7 +4,6 @@
* The temporary equivalent is [/datum/component/light_eater]
*/
/datum/element/light_eater
- element_flags = ELEMENT_DETACH
/datum/element/light_eater/Attach(datum/target)
if(isatom(target))
diff --git a/code/datums/elements/movement_turf_changer.dm b/code/datums/elements/movement_turf_changer.dm
index 34593dd7a65b..a5de3d2356d3 100644
--- a/code/datums/elements/movement_turf_changer.dm
+++ b/code/datums/elements/movement_turf_changer.dm
@@ -4,7 +4,7 @@
* Used for moonicorns!
*/
/datum/element/movement_turf_changer
- element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
///Path of the turf added on top
var/turf_type
diff --git a/code/datums/elements/openspace_item_click_handler.dm b/code/datums/elements/openspace_item_click_handler.dm
index 9f8db60858ac..c20751196443 100644
--- a/code/datums/elements/openspace_item_click_handler.dm
+++ b/code/datums/elements/openspace_item_click_handler.dm
@@ -3,7 +3,6 @@
* having to pixelhunt for portions not occupied by object or mob visuals.
*/
/datum/element/openspace_item_click_handler
- element_flags = ELEMENT_DETACH
/datum/element/openspace_item_click_handler/Attach(datum/target)
. = ..()
diff --git a/code/datums/elements/pet_bonus.dm b/code/datums/elements/pet_bonus.dm
index 6fa6bebc799a..a4267e196820 100644
--- a/code/datums/elements/pet_bonus.dm
+++ b/code/datums/elements/pet_bonus.dm
@@ -5,7 +5,7 @@
* I may have been able to make this work for carbons, but it would have been interjecting on some help mode interactions anyways.
*/
/datum/element/pet_bonus
- element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
///optional cute message to send when you pet your pet!
diff --git a/code/datums/elements/prevent_attacking_of_types.dm b/code/datums/elements/prevent_attacking_of_types.dm
index 8c3b65bdbada..d4fb750e2224 100644
--- a/code/datums/elements/prevent_attacking_of_types.dm
+++ b/code/datums/elements/prevent_attacking_of_types.dm
@@ -1,7 +1,7 @@
/// This hostile will not be able to attack a given typecache, and will receive
/// a balloon alert when it tries to.
/datum/element/prevent_attacking_of_types
- element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
/// The typecache of things this hostile can't attack
diff --git a/code/datums/elements/radiation_protected_clothing.dm b/code/datums/elements/radiation_protected_clothing.dm
index a759923a0890..e0ebb351eae5 100644
--- a/code/datums/elements/radiation_protected_clothing.dm
+++ b/code/datums/elements/radiation_protected_clothing.dm
@@ -2,7 +2,6 @@
/// Adds the TRAIT_RADIATION_PROTECTED_CLOTHING trait, as well as adding an
/// extra bit to the examine descrpition.
/datum/element/radiation_protected_clothing
- element_flags = ELEMENT_DETACH
/datum/element/radiation_protected_clothing/Attach(datum/target)
. = ..()
diff --git a/code/datums/elements/ranged_attacks.dm b/code/datums/elements/ranged_attacks.dm
index d430bb1a0c4e..6b45ff9dfd22 100644
--- a/code/datums/elements/ranged_attacks.dm
+++ b/code/datums/elements/ranged_attacks.dm
@@ -1,6 +1,6 @@
///This proc is used by basic mobs to give them a simple ranged attack! In theory this could be extended to
/datum/element/ranged_attacks
- element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
var/casingtype = /obj/item/ammo_casing/glockroach
var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg'
diff --git a/code/datums/elements/ridable.dm b/code/datums/elements/ridable.dm
index 2f4d85404206..be2593dee91e 100644
--- a/code/datums/elements/ridable.dm
+++ b/code/datums/elements/ridable.dm
@@ -7,7 +7,7 @@
* just having the variables, behavior, and procs be standardized is still a big improvement.
*/
/datum/element/ridable
- element_flags = ELEMENT_BESPOKE
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
id_arg_index = 2
/// The specific riding component subtype we're loading our instructions from, don't leave this as default please!
diff --git a/code/datums/elements/rust.dm b/code/datums/elements/rust.dm
index 01b4e2496dd7..c4905ba4bf57 100644
--- a/code/datums/elements/rust.dm
+++ b/code/datums/elements/rust.dm
@@ -3,7 +3,7 @@
* The overlay can be specified in new as the first paramter; if not set it defaults to rust_overlay's rust_default
*/
/datum/element/rust
- element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs
id_arg_index = 2
/// The rust image itself, since the icon and icon state are only used as an argument
var/image/rust_overlay
diff --git a/code/datums/elements/screentips/contextual_screentip_item_typechecks.dm b/code/datums/elements/screentips/contextual_screentip_item_typechecks.dm
index 10d5ac6b8276..3591d7834b65 100644
--- a/code/datums/elements/screentips/contextual_screentip_item_typechecks.dm
+++ b/code/datums/elements/screentips/contextual_screentip_item_typechecks.dm
@@ -2,7 +2,7 @@
/// A "Type B" interaction.
/// This stacks with other contextual screentip elements, though you may want to register the signal/flag manually at that point for performance.
/datum/element/contextual_screentip_item_typechecks
- element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs
id_arg_index = 2
/// Map of item paths to contexts to usages
diff --git a/code/datums/elements/screentips/contextual_screentip_tools.dm b/code/datums/elements/screentips/contextual_screentip_tools.dm
index a6c358ef2f63..a205b9a47ec4 100644
--- a/code/datums/elements/screentips/contextual_screentip_tools.dm
+++ b/code/datums/elements/screentips/contextual_screentip_tools.dm
@@ -2,7 +2,7 @@
/// A "Type B" interaction.
/// This stacks with other contextual screentip elements, though you may want to register the signal/flag manually at that point for performance.
/datum/element/contextual_screentip_tools
- element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs
id_arg_index = 2
/// Map of tool behaviors to contexts to usages
diff --git a/code/datums/elements/series.dm b/code/datums/elements/series.dm
index 88cbd8bc184c..0b34b24ae551 100644
--- a/code/datums/elements/series.dm
+++ b/code/datums/elements/series.dm
@@ -5,7 +5,7 @@
* used for mechas and rare collectable hats, should totally be used for way more ;)
*/
/datum/element/series
- element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs
id_arg_index = 2
var/list/subtype_list
var/series_name
diff --git a/code/datums/elements/simple_flying.dm b/code/datums/elements/simple_flying.dm
index 6b991998e388..263942b7a5e3 100644
--- a/code/datums/elements/simple_flying.dm
+++ b/code/datums/elements/simple_flying.dm
@@ -5,7 +5,6 @@
* Note: works for carbons and above, but please do something better. humans have wings got dangit!
*/
/datum/element/simple_flying
- element_flags = ELEMENT_DETACH
/datum/element/simple_flying/Attach(datum/target)
. = ..()
diff --git a/code/datums/elements/skittish.dm b/code/datums/elements/skittish.dm
index 2bb2bc61c56f..b3152224beec 100644
--- a/code/datums/elements/skittish.dm
+++ b/code/datums/elements/skittish.dm
@@ -3,7 +3,6 @@
*/
/datum/element/skittish
- element_flags = ELEMENT_DETACH
/datum/element/skittish/Attach(datum/target)
. = ..()
diff --git a/code/datums/elements/soft_landing.dm b/code/datums/elements/soft_landing.dm
index 56fedf6b3741..e1665f61bbdb 100644
--- a/code/datums/elements/soft_landing.dm
+++ b/code/datums/elements/soft_landing.dm
@@ -4,7 +4,7 @@
* Non bespoke element (1 in existence) that makes objs provide a soft landing when you fall on them!
*/
/datum/element/soft_landing
- element_flags = ELEMENT_DETACH
+ element_flags = ELEMENT_DETACH // Detach for turfs
/datum/element/soft_landing/Attach(datum/target)
. = ..()
diff --git a/code/datums/elements/spooky.dm b/code/datums/elements/spooky.dm
index 3a6115a8147a..8d21b925b9b4 100644
--- a/code/datums/elements/spooky.dm
+++ b/code/datums/elements/spooky.dm
@@ -1,5 +1,5 @@
/datum/element/spooky
- element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
var/too_spooky = TRUE //will it spawn a new instrument?
diff --git a/code/datums/elements/tenacious.dm b/code/datums/elements/tenacious.dm
index feb74a579d7b..4d906812c13a 100644
--- a/code/datums/elements/tenacious.dm
+++ b/code/datums/elements/tenacious.dm
@@ -4,7 +4,6 @@
* Used by sparring sect!
*/
/datum/element/tenacious
- element_flags = ELEMENT_DETACH
/datum/element/tenacious/Attach(datum/target)
. = ..()
diff --git a/code/datums/elements/venomous.dm b/code/datums/elements/venomous.dm
index a0e92f2feb9b..a1b5fc763739 100644
--- a/code/datums/elements/venomous.dm
+++ b/code/datums/elements/venomous.dm
@@ -4,7 +4,7 @@
* Used for spiders and bees!
*/
/datum/element/venomous
- element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ element_flags = ELEMENT_BESPOKE
id_arg_index = 2
///Path of the reagent added
var/poison_type
diff --git a/code/datums/elements/wall_engraver.dm b/code/datums/elements/wall_engraver.dm
index c3ca321430f4..c25d2631a34d 100644
--- a/code/datums/elements/wall_engraver.dm
+++ b/code/datums/elements/wall_engraver.dm
@@ -1,6 +1,5 @@
/// An element that lets you engrave walls when right click is used
/datum/element/wall_engraver
- element_flags = ELEMENT_DETACH
/datum/element/wall_engraver/Attach(datum/target)
. = ..()
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 16d87c8688c2..b3bdfe9e8090 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -191,7 +191,7 @@
for(var/movable_content in contents)
qdel(movable_content)
- moveToNullspace()
+ loc = null
//This absolutely must be after moveToNullspace()
//We rely on Entered and Exited to manage this list, and the copy of this list that is on any /atom/movable "Containers"
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index cc7adfd11cc9..5119b17c284d 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -56,17 +56,15 @@
/obj/machinery/camera/autoname/LateInitialize()
. = ..()
- number = 1
- var/area/A = get_area(src)
- if(A)
- for(var/obj/machinery/camera/autoname/C in GLOB.machines)
- if(C == src)
- continue
- var/area/CA = get_area(C)
- if(CA.type == A.type)
- if(C.number)
- number = max(number, C.number+1)
- c_tag = "[strip_improper(A.name)] #[number]" //...How long was this a bug?????
+
+ var/static/list/autonames_in_areas = list()
+
+ var/area/camera_area = get_area(src)
+
+ number = autonames_in_areas[camera_area] + 1
+ autonames_in_areas[camera_area] = number
+
+ c_tag = "[format_text(camera_area.name)] #[number]"
// UPGRADE PROCS
diff --git a/code/game/machinery/computer/chef_orders/chef_order.dm b/code/game/machinery/computer/chef_orders/chef_order.dm
index 9b1fec4fcabe..09c0e062f29e 100644
--- a/code/game/machinery/computer/chef_orders/chef_order.dm
+++ b/code/game/machinery/computer/chef_orders/chef_order.dm
@@ -114,7 +114,7 @@
var/list/ordered_paths = list()
for(var/datum/orderable_item/item as anything in grocery_list)//every order
for(var/amt in 1 to grocery_list[item])//every order amount
- ordered_paths += item.item_instance.type
+ ordered_paths += item.item_path
podspawn(list(
"target" = get_turf(chef),
"style" = STYLE_BLUESPACE,
diff --git a/code/game/machinery/computer/chef_orders/order_datum.dm b/code/game/machinery/computer/chef_orders/order_datum.dm
index c0743f08074a..32f097340aaa 100644
--- a/code/game/machinery/computer/chef_orders/order_datum.dm
+++ b/code/game/machinery/computer/chef_orders/order_datum.dm
@@ -9,212 +9,207 @@
//description set automatically unless it's hard set by the subtype
var/desc
var/category_index = CATEGORY_FRUITS_VEGGIES
- var/obj/item/item_instance
+ var/obj/item/item_path
var/cost_per_order = 10
/datum/orderable_item/New()
. = ..()
if(type == /datum/orderable_item)
return
- if(!item_instance)
+ if(!item_path)
CRASH("[type] orderable item datum has NO ITEM PATH!")
- item_instance = new item_instance
if(!desc)
- desc = item_instance.desc
-
-/datum/orderable_item/Destroy(force, ...)
- . = ..()
- qdel(item_instance)
+ desc = initial(item_path.desc)
//Fruits and Veggies
/datum/orderable_item/potato
name = "Potato"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/potato
+ item_path = /obj/item/food/grown/potato
/datum/orderable_item/tomato
name = "Tomato"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/tomato
+ item_path = /obj/item/food/grown/tomato
/datum/orderable_item/carrot
name = "Carrot"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/carrot
+ item_path = /obj/item/food/grown/carrot
/datum/orderable_item/eggplant
name = "Eggplant"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/eggplant
+ item_path = /obj/item/food/grown/eggplant
/datum/orderable_item/mushroom
name = "Plump Helmet"
desc = "Plumus Hellmus: Plump, soft and s-so inviting~"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/mushroom/plumphelmet
+ item_path = /obj/item/food/grown/mushroom/plumphelmet
/datum/orderable_item/cabbage
name = "Cabbage"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/cabbage
+ item_path = /obj/item/food/grown/cabbage
/datum/orderable_item/beets
name = "Onion"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/onion
+ item_path = /obj/item/food/grown/onion
/datum/orderable_item/apple
name = "Apple"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance =/obj/item/food/grown/apple
+ item_path =/obj/item/food/grown/apple
/datum/orderable_item/pumpkin
name = "Pumpkin"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance =/obj/item/food/grown/pumpkin
+ item_path =/obj/item/food/grown/pumpkin
/datum/orderable_item/watermelon
name = "Watermelon"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance =/obj/item/food/grown/watermelon
+ item_path =/obj/item/food/grown/watermelon
/datum/orderable_item/corn
name = "Corn"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/corn
+ item_path = /obj/item/food/grown/corn
/datum/orderable_item/soybean
name = "Soybeans"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/soybeans
+ item_path = /obj/item/food/grown/soybeans
/datum/orderable_item/garlic
name = "Garlic"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/garlic
+ item_path = /obj/item/food/grown/garlic
/datum/orderable_item/cherries
name = "Cherries"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/cherries
+ item_path = /obj/item/food/grown/cherries
/datum/orderable_item/chanterelle
name = "Chanterelle"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/mushroom/chanterelle
+ item_path = /obj/item/food/grown/mushroom/chanterelle
/datum/orderable_item/cocoa
name = "Cocoa"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/cocoapod
+ item_path = /obj/item/food/grown/cocoapod
/datum/orderable_item/herbs
name = "Bundle of Herbs"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/herbs
+ item_path = /obj/item/food/grown/herbs
cost_per_order = 5
/datum/orderable_item/bell_pepper
name = "Bell Pepper"
category_index = CATEGORY_FRUITS_VEGGIES
- item_instance = /obj/item/food/grown/bell_pepper
+ item_path = /obj/item/food/grown/bell_pepper
//Milk and Eggs
/datum/orderable_item/milk
name = "Milk"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/reagent_containers/food/condiment/milk
+ item_path = /obj/item/reagent_containers/food/condiment/milk
cost_per_order = 30
/datum/orderable_item/soymilk
name = "Soy Milk"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/reagent_containers/food/condiment/soymilk
+ item_path = /obj/item/reagent_containers/food/condiment/soymilk
cost_per_order = 30
/datum/orderable_item/cream
name = "Cream"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/reagent_containers/food/drinks/bottle/cream
+ item_path = /obj/item/reagent_containers/food/drinks/bottle/cream
cost_per_order = 40
/datum/orderable_item/yoghurt
name = "Yoghurt"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/reagent_containers/food/condiment/yoghurt
+ item_path = /obj/item/reagent_containers/food/condiment/yoghurt
cost_per_order = 40
/datum/orderable_item/eggs
name = "Egg Carton"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/storage/fancy/egg_box
+ item_path = /obj/item/storage/fancy/egg_box
cost_per_order = 40
/datum/orderable_item/fillet
name = "Fish Fillet"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/food/fishmeat
+ item_path = /obj/item/food/fishmeat
cost_per_order = 12
/datum/orderable_item/spider_eggs
name = "Spider Eggs"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/food/spidereggs
+ item_path = /obj/item/food/spidereggs
/datum/orderable_item/moonfish_eggs
name = "Moonfish Eggs"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/food/moonfish_eggs
+ item_path = /obj/item/food/moonfish_eggs
cost_per_order = 30
/datum/orderable_item/desert_snails
name = "Canned Desert Snails"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/food/desert_snails
+ item_path = /obj/item/food/desert_snails
cost_per_order = 20
/datum/orderable_item/canned_jellyfish
name = "Canned Gunner Jellyfish"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/food/canned_jellyfish
+ item_path = /obj/item/food/canned_jellyfish
cost_per_order = 20
/datum/orderable_item/canned_larvae
name = "Canned Larvae"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/food/larvae
+ item_path = /obj/item/food/larvae
cost_per_order = 20
/datum/orderable_item/canned_tomatoes
name = "Canned San Marzano Tomatoes"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/food/canned/tomatoes
+ item_path = /obj/item/food/canned/tomatoes
cost_per_order = 30
/datum/orderable_item/canned_pine_nuts
name = "Canned Pine Nuts"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/food/canned/pine_nuts
+ item_path = /obj/item/food/canned/pine_nuts
cost_per_order = 20
/datum/orderable_item/ready_donk
name = "Ready-Donk Meal: Bachelor Chow"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/food/ready_donk
+ item_path = /obj/item/food/ready_donk
cost_per_order = 40
/datum/orderable_item/ready_donk_mac
name = "Ready-Donk Meal: Donk-a-Roni"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/food/ready_donk/mac_n_cheese
+ item_path = /obj/item/food/ready_donk/mac_n_cheese
cost_per_order = 40
/datum/orderable_item/ready_donk_mex
name = "Ready-Donk Meal: Donkhiladas"
category_index = CATEGORY_MILK_EGGS
- item_instance = /obj/item/food/ready_donk/donkhiladas
+ item_path = /obj/item/food/ready_donk/donkhiladas
cost_per_order = 40
//Reagents
@@ -222,65 +217,65 @@
/datum/orderable_item/flour
name = "Flour Sack"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/flour
+ item_path = /obj/item/reagent_containers/food/condiment/flour
cost_per_order = 30
/datum/orderable_item/sugar
name = "Sugar Sack"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/sugar
+ item_path = /obj/item/reagent_containers/food/condiment/sugar
cost_per_order = 30
/datum/orderable_item/rice
name = "Rice Sack"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/rice
+ item_path = /obj/item/reagent_containers/food/condiment/rice
cost_per_order = 30
/datum/orderable_item/cornmeal
name = "Cornmeal Box"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/cornmeal
+ item_path = /obj/item/reagent_containers/food/condiment/cornmeal
cost_per_order = 30
/datum/orderable_item/enzyme
name = "Universal Enzyme"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/enzyme
+ item_path = /obj/item/reagent_containers/food/condiment/enzyme
cost_per_order = 40
/datum/orderable_item/salt
name = "Salt Shaker"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/saltshaker
+ item_path = /obj/item/reagent_containers/food/condiment/saltshaker
cost_per_order = 15
/datum/orderable_item/pepper
name = "Pepper Mill"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/peppermill
+ item_path = /obj/item/reagent_containers/food/condiment/peppermill
cost_per_order = 15
/datum/orderable_item/soysauce
name = "Soy Sauce"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/soysauce
+ item_path = /obj/item/reagent_containers/food/condiment/soysauce
cost_per_order = 15
/datum/orderable_item/bbqsauce
name = "BBQ Sauce"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/bbqsauce
+ item_path = /obj/item/reagent_containers/food/condiment/bbqsauce
cost_per_order = 60
/datum/orderable_item/vinegar
name = "Vinegar"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/vinegar
+ item_path = /obj/item/reagent_containers/food/condiment/vinegar
cost_per_order = 30
/datum/orderable_item/quality_oil
name = "Quality Oil"
category_index = CATEGORY_SAUCES_REAGENTS
- item_instance = /obj/item/reagent_containers/food/condiment/quality_oil
+ item_path = /obj/item/reagent_containers/food/condiment/quality_oil
cost_per_order = 120 //Extra Virgin, just like you, the reader
diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm
index eced35e44cf7..f204e09e60b8 100644
--- a/code/game/machinery/embedded_controller/access_controller.dm
+++ b/code/game/machinery/embedded_controller/access_controller.dm
@@ -53,7 +53,7 @@
if(A.idSelf == idSelf)
controller = A
break
- for(var/obj/machinery/door/airlock/I in GLOB.machines)
+ for(var/obj/machinery/door/airlock/I in GLOB.airlocks)
if(I.id_tag == idDoor)
door = I
break
@@ -240,7 +240,7 @@
lostPower = FALSE
/obj/machinery/door_buttons/airlock_controller/findObjsByTag()
- for(var/obj/machinery/door/airlock/A in GLOB.machines)
+ for(var/obj/machinery/door/airlock/A in GLOB.airlocks)
if(A.id_tag == idInterior)
interiorAirlock = A
else if(A.id_tag == idExterior)
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index e4d24050a798..c11004db4f50 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -31,7 +31,7 @@
var/jackpots = 0
var/paymode = HOLOCHIP //toggles between HOLOCHIP/COIN, defined above
var/cointype = /obj/item/coin/iron //default cointype
- var/list/coinvalues = list()
+ var/static/list/coinvalues = list()
var/list/reels = list(list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0, list("", "", "") = 0)
var/list/symbols = list(SEVEN = 1, "&" = 2, "@" = 2, "$" = 2, "?" = 2, "#" = 2, "!" = 2, "%" = 2) //if people are winning too much, multiply every number in this list by 2 and see if they are still winning too much.
@@ -49,10 +49,13 @@
INVOKE_ASYNC(src, PROC_REF(toggle_reel_spin), FALSE)
- for(cointype in typesof(/obj/item/coin))
- var/obj/item/coin/C = new cointype
- coinvalues["[cointype]"] = C.get_item_credit_value()
- qdel(C) //Sigh
+ if (isnull(coinvalues))
+ coinvalues = list()
+
+ for(cointype in typesof(/obj/item/coin))
+ var/obj/item/coin/C = new cointype
+ coinvalues["[cointype]"] = C.get_item_credit_value()
+ qdel(C) //Sigh
/obj/machinery/computer/slot_machine/Destroy()
if(balance)
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 59e6a23eebdc..fbeddd92f940 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -111,8 +111,9 @@ GLOBAL_LIST_EMPTY(telecomms_list)
/obj/machinery/telecomms/LateInitialize()
..()
- for(var/obj/machinery/telecomms/T in (long_range_link ? GLOB.telecomms_list : urange(20, src, 1)))
- add_automatic_link(T)
+ for(var/obj/machinery/telecomms/telecomms_machine in GLOB.telecomms_list)
+ if (long_range_link || IN_GIVEN_RANGE(src, telecomms_machine, 20))
+ add_automatic_link(telecomms_machine)
/obj/machinery/telecomms/Destroy()
GLOB.telecomms_list -= src
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 168b3375d8b5..e4e450ce7271 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -24,8 +24,6 @@
/obj/structure/chair/Initialize(mapload)
. = ..()
- if(!anchored) //why would you put these on the shuttle?
- addtimer(CALLBACK(src, PROC_REF(RemoveFromLatejoin)), 0)
if(prob(0.2))
name = "tactical [name]"
MakeRotate()
@@ -35,11 +33,8 @@
AddComponent(/datum/component/simple_rotation, ROTATION_IGNORE_ANCHORED|ROTATION_GHOSTS_ALLOWED)
/obj/structure/chair/Destroy()
- RemoveFromLatejoin()
- return ..()
-
-/obj/structure/chair/proc/RemoveFromLatejoin()
SSjob.latejoin_trackers -= src //These may be here due to the arrivals shuttle
+ return ..()
/obj/structure/chair/deconstruct(disassembled)
// If we have materials, and don't have the NOCONSTRUCT flag
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index b6cc62d28c81..a9f482272201 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -407,24 +407,15 @@
max_integrity = 70
resistance_flags = ACID_PROOF
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100)
- var/list/debris = list()
+ var/glass_shard_type = /obj/item/shard
/obj/structure/table/glass/Initialize(mapload)
. = ..()
- debris += new frame
- if(buildstack == /obj/item/stack/sheet/plasmaglass)
- debris += new /obj/item/shard/plasma
- else
- debris += new /obj/item/shard
var/static/list/loc_connections = list(
COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
)
AddElement(/datum/element/connect_loc, loc_connections)
-/obj/structure/table/glass/Destroy()
- QDEL_LIST(debris)
- . = ..()
-
/obj/structure/table/glass/proc/on_entered(datum/source, atom/movable/AM)
SIGNAL_HANDLER
if(AM == src)
@@ -447,18 +438,18 @@
if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & FLYING))
table_shatter(M)
-/obj/structure/table/glass/proc/table_shatter(mob/living/L)
+/obj/structure/table/glass/proc/table_shatter(mob/living/victim)
visible_message(span_warning("[src] breaks!"),
span_danger("You hear breaking glass."))
- var/turf/T = get_turf(src)
- playsound(T, SFX_SHATTER, 50, TRUE)
- for(var/I in debris)
- var/atom/movable/AM = I
- AM.forceMove(T)
- debris -= AM
- if(istype(AM, /obj/item/shard))
- AM.throw_impact(L)
- L.Paralyze(100)
+
+ playsound(loc, SFX_SHATTER, 50, TRUE)
+
+ new frame(loc)
+
+ var/obj/item/shard/shard = new glass_shard_type(loc)
+ shard.throw_impact(victim)
+
+ victim.Paralyze(100)
qdel(src)
/obj/structure/table/glass/deconstruct(disassembled = TRUE, wrench_disassembly = 0)
@@ -469,16 +460,13 @@
else
var/turf/T = get_turf(src)
playsound(T, SFX_SHATTER, 50, TRUE)
- for(var/X in debris)
- var/atom/movable/AM = X
- AM.forceMove(T)
- debris -= AM
+ new frame(loc)
+ var/obj/item/shard = new glass_shard_type(loc)
+ shard.color = color
qdel(src)
/obj/structure/table/glass/narsie_act()
color = NARSIE_WINDOW_COLOUR
- for(var/obj/item/shard/S in debris)
- S.color = NARSIE_WINDOW_COLOUR
/obj/structure/table/glass/plasmaglass
name = "plasma glass table"
@@ -489,6 +477,7 @@
custom_materials = list(/datum/material/alloy/plasmaglass = 2000)
buildstack = /obj/item/stack/sheet/plasmaglass
max_integrity = 100
+ glass_shard_type = /obj/item/shard/plasma
/*
* Wooden tables
diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm
index bf8a14fcac01..681a9d687fc0 100644
--- a/code/game/turfs/closed/minerals.dm
+++ b/code/game/turfs/closed/minerals.dm
@@ -1,11 +1,12 @@
#define MINING_MESSAGE_COOLDOWN 20
-
+#define MINERAL_WALL_OFFSET -4
/**********************Mineral deposits**************************/
/turf/closed/mineral //wall piece
name = "rock"
- icon = 'icons/turf/mining.dmi'
+ icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi')
icon_state = "rock"
+
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_MINERAL_WALLS
canSmoothWith = SMOOTH_GROUP_MINERAL_WALLS
@@ -15,13 +16,12 @@
density = TRUE
base_icon_state = "smoothrocks"
temperature = TCMB
- base_pixel_x = -4
- base_pixel_y = -4
- /* Here as a note: these are set in Initialize for the purposes of the map viewer
- pixel_y = -4
- pixel_x = -4
- */
- var/smooth_icon = 'icons/turf/smoothrocks.dmi'
+
+ base_pixel_x = MINERAL_WALL_OFFSET
+ base_pixel_y = MINERAL_WALL_OFFSET
+ pixel_x = MAP_SWITCH(MINERAL_WALL_OFFSET, 0)
+ pixel_y = MAP_SWITCH(MINERAL_WALL_OFFSET, 0)
+
var/turf/open/floor/plating/turf_type = /turf/open/misc/asteroid/airless
var/obj/item/stack/ore/mineralType = null
var/mineralAmt = 3
@@ -34,6 +34,8 @@
///How long it takes to mine this turf without tools, if it's weak.
var/hand_mine_speed = 15 SECONDS
+#undef MINERAL_WALL_OFFSET
+
//We don't call parent for perf reasons. Instead, we copy paste everything. BYOND!
/turf/closed/mineral/Initialize(mapload)
SHOULD_CALL_PARENT(FALSE)
@@ -87,13 +89,6 @@
if(uses_integrity)
atom_integrity = max_integrity
- /// UNIQUE MINERAL BEHAVIOR
- icon = smooth_icon
- pixel_x = -4
- pixel_y = -4
- var/static/list/behaviors = list(TOOL_MINING)
- ///END MINERAL BEHAVIOR
-
return INITIALIZE_HINT_NORMAL
// Inlined version of the bump click element. way faster this way, the element's nice but it's too much overhead
@@ -327,8 +322,7 @@
/turf/closed/mineral/random/snow
name = "snowy mountainside"
- icon = 'icons/turf/mining.dmi'
- smooth_icon = 'icons/turf/walls/legacy/mountain_wall.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/mountain_wall.dmi', 'icons/turf/mining.dmi')
icon_state = "mountainrock"
base_icon_state = "mountain_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
@@ -342,7 +336,6 @@
/turf/closed/mineral/random/snow/Change_Ore(ore_type, random = 0)
. = ..()
if(mineralType)
- smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi'
icon = 'icons/turf/walls/legacy/icerock_wall.dmi'
icon_state = "icerock_wall-0"
base_icon_state = "icerock_wall"
@@ -388,8 +381,7 @@
// Subtypes for mappers placing ores manually.
/turf/closed/mineral/random/labormineral/ice
name = "snowy mountainside"
- icon = 'icons/turf/mining.dmi'
- smooth_icon = 'icons/turf/walls/legacy/mountain_wall.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/mountain_wall.dmi', 'icons/turf/mining.dmi')
icon_state = "mountainrock"
base_icon_state = "mountain_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
@@ -407,7 +399,6 @@
/turf/closed/mineral/random/labormineral/ice/Change_Ore(ore_type, random = 0)
. = ..()
if(mineralType)
- smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi'
icon = 'icons/turf/walls/legacy/icerock_wall.dmi'
icon_state = "icerock_wall-0"
base_icon_state = "icerock_wall"
@@ -419,7 +410,7 @@
/turf/closed/mineral/iron/ice
icon_state = "icerock_iron"
- smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/icerock_wall.dmi', 'icons/turf/mining.dmi')
base_icon_state = "icerock_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/misc/asteroid/snow/ice
@@ -437,7 +428,7 @@
/turf/closed/mineral/diamond/ice
icon_state = "icerock_iron"
- smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/icerock_wall.dmi', 'icons/turf/mining.dmi')
base_icon_state = "icerock_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/misc/asteroid/snow/ice
@@ -474,7 +465,7 @@
/turf/closed/mineral/plasma/ice
icon_state = "icerock_plasma"
- smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/icerock_wall.dmi', 'icons/turf/mining.dmi')
base_icon_state = "icerock_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/misc/asteroid/snow/ice
@@ -510,8 +501,7 @@
/turf/closed/mineral/ash_rock //wall piece
name = "rock"
- icon = 'icons/turf/mining.dmi'
- smooth_icon = 'icons/turf/walls/legacy/rock_wall.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/rock_wall.dmi', 'icons/turf/mining.dmi')
icon_state = "rock2"
base_icon_state = "rock_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
@@ -523,8 +513,7 @@
/turf/closed/mineral/snowmountain
name = "snowy mountainside"
- icon = 'icons/turf/mining.dmi'
- smooth_icon = 'icons/turf/walls/legacy/mountain_wall.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/mountain_wall.dmi', 'icons/turf/mining.dmi')
icon_state = "mountainrock"
base_icon_state = "mountain_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
@@ -541,8 +530,7 @@
/turf/closed/mineral/snowmountain/cavern
name = "ice cavern rock"
- icon = 'icons/turf/mining.dmi'
- smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/icerock_wall.dmi', 'icons/turf/mining.dmi')
icon_state = "icerock"
base_icon_state = "icerock_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
@@ -558,15 +546,13 @@
/turf/closed/mineral/asteroid
name = "iron rock"
- icon = 'icons/turf/mining.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/red_wall.dmi', 'icons/turf/mining.dmi')
icon_state = "redrock"
- smooth_icon = 'icons/turf/walls/legacy/red_wall.dmi'
base_icon_state = "red_wall"
/turf/closed/mineral/random/stationside/asteroid
name = "iron rock"
- icon = 'icons/turf/mining.dmi'
- smooth_icon = 'icons/turf/walls/legacy/red_wall.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/red_wall.dmi', 'icons/turf/mining.dmi')
base_icon_state = "red_wall"
/turf/closed/mineral/random/stationside/asteroid/porus
@@ -679,7 +665,7 @@
/turf/closed/mineral/gibtonite/ice
icon_state = "icerock_Gibtonite"
- smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/icerock_wall.dmi', 'icons/turf/mining.dmi')
base_icon_state = "icerock_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
turf_type = /turf/open/misc/asteroid/snow/ice
@@ -699,7 +685,7 @@
baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface
initial_gas = LAVALAND_DEFAULT_ATMOS
defer_change = 1
- smooth_icon = 'icons/turf/walls/legacy/rock_wall.dmi'
+ icon = MAP_SWITCH('icons/turf/walls/legacy/rock_wall.dmi', 'icons/turf/mining.dmi')
base_icon_state = "rock_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm
index 802a2a362745..4e0d25214fef 100644
--- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm
+++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm
@@ -57,7 +57,7 @@
color = "#B5651D"
turf_type = /turf/open/misc/asteroid/basalt/wasteland
baseturfs = /turf/open/misc/asteroid/basalt/wasteland
- smooth_icon = 'icons/turf/walls/legacy/rock_wall.dmi'
+ icon = 'icons/turf/walls/legacy/rock_wall.dmi'
base_icon_state = "rock_wall"
smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index beb0eedd77b6..d4a5ae4467c6 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -112,7 +112,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
investigate_log("Chef's [SSshuttle.chef_groceries.len] sized produce order arrived. Cost was deducted from orderer, not cargo.", INVESTIGATE_CARGO)
for(var/datum/orderable_item/item as anything in SSshuttle.chef_groceries)//every order
for(var/amt in 1 to SSshuttle.chef_groceries[item])//every order amount
- new item.item_instance.type(grocery_crate)
+ new item.item_path(grocery_crate)
SSshuttle.chef_groceries.Cut() //This lets the console know it can order another round.
if(!SSshuttle.shopping_list.len)
diff --git a/code/modules/unit_tests/orderable_item_descriptions.dm b/code/modules/unit_tests/orderable_item_descriptions.dm
new file mode 100644
index 000000000000..877824546c2e
--- /dev/null
+++ b/code/modules/unit_tests/orderable_item_descriptions.dm
@@ -0,0 +1,16 @@
+/// Makes sure that no orderable items have dynamic descriptions, if they
+/// don't explicitly set a description.
+/datum/unit_test/orderable_item_descriptions
+
+/datum/unit_test/orderable_item_descriptions/Run()
+ for (var/datum/orderable_item/orderable_item as anything in subtypesof(/datum/orderable_item))
+ if (!isnull(initial(orderable_item.desc)))
+ continue
+
+ var/item_path = initial(orderable_item.item_path)
+
+ var/obj/item/item_instance = new item_path
+ var/initial_desc = initial(item_instance.desc)
+
+ if (item_instance.desc != initial_desc)
+ Fail("[orderable_item] has an item ([item_path]) that has a dynamic description. [item_instance.desc] (dynamic description) != [initial_desc] (initial description)")
diff --git a/daedalus.dme b/daedalus.dme
index 24f5e94d9a22..96719bdd9270 100644
--- a/daedalus.dme
+++ b/daedalus.dme
@@ -120,6 +120,7 @@
#include "code\__DEFINES\machines.dm"
#include "code\__DEFINES\magic.dm"
#include "code\__DEFINES\maps.dm"
+#include "code\__DEFINES\mapswitch.dm"
#include "code\__DEFINES\materials.dm"
#include "code\__DEFINES\maths.dm"
#include "code\__DEFINES\MC.dm"
From 15d2f7739f99fad588bdac1464459615fd078aed Mon Sep 17 00:00:00 2001
From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com>
Date: Sat, 29 Jul 2023 00:49:26 -0400
Subject: [PATCH 05/13] this has been annoying me
---
code/controllers/subsystem/shuttle.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index 0f18eaf95a62..698abd4a2e88 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -165,7 +165,7 @@ SUBSYSTEM_DEF(shuttle)
if(!supply)
log_mapping("No /obj/docking_port/mobile/supply placed on the map!")
- if(CONFIG_GET(flag/arrivals_shuttle_require_undocked))
+ if(CONFIG_GET(flag/arrivals_shuttle_require_undocked) && arrivals)
arrivals.Launch(TRUE)
return ..()
From 3937a9f91e188546ecccd950bfe9a601fd16c4c5 Mon Sep 17 00:00:00 2001
From: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Date: Mon, 31 Oct 2022 23:03:55 -0700
Subject: [PATCH 06/13] Add defines for byond-tracy support (#70931)
Adds `USE_BYOND_TRACY`, which automatically loads a given
prof.dll/libprof.so using https://github.com/mafemergency/byond-tracy/.
Not intended for use in production, and we do not ship a copy of
byond-tracy. It is extremely easy to compile yourself, but if you're
someone interesting enough to play around with this then let me know and
I can just give you a build.
I'm going to be using this for init profiling.
---
.gitignore | 4 ++++
code/_compile_options.dm | 3 +++
code/game/world.dm | 20 ++++++++++++++++++++
3 files changed, 27 insertions(+)
diff --git a/.gitignore b/.gitignore
index 0a53e549989d..2aa8d22c520b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -203,6 +203,10 @@ Temporary Items
/tools/LinuxOneShot/TGS_Instances
/tools/LinuxOneShot/TGS_Logs
+# byond-tracy, we intentionally do not ship this and do not want to maintain it
+prof.dll
+libprof.so
+
# JavaScript tools
**/node_modules
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
index 88ecc12b0359..89ea77733113 100644
--- a/code/_compile_options.dm
+++ b/code/_compile_options.dm
@@ -77,6 +77,9 @@
///NEVER run this on live, it's for simulating highpop only
// #define VERB_STRESS_TEST
+// If this is uncommented, will attempt to load and initialize prof.dll/libprof.so.
+// We do not ship byond-tracy. Build it yourself here: https://github.com/mafemergency/byond-tracy/
+// #define USE_BYOND_TRACY
///Uncomment this to force all verbs to run into overtime all of the time
///Essentially negating the reserve 2%
diff --git a/code/game/world.dm b/code/game/world.dm
index 3d1da78f07f5..3fb53442ae22 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -34,6 +34,10 @@ GLOBAL_VAR(restart_counter)
* All atoms in both compiled and uncompiled maps are initialized()
*/
/world/New()
+#ifdef USE_BYOND_TRACY
+ #warn USE_BYOND_TRACY is enabled
+ init_byond_tracy()
+#endif
log_world("World loaded at [time_stamp()]!")
@@ -372,6 +376,22 @@ GLOBAL_VAR(restart_counter)
/world/proc/on_tickrate_change()
SStimer?.reset_buckets()
+/world/proc/init_byond_tracy()
+ var/library
+
+ switch (system_type)
+ if (MS_WINDOWS)
+ library = "prof.dll"
+ if (UNIX)
+ library = "libprof.so"
+ else
+ CRASH("Unsupported platform: [system_type]")
+
+ var/init_result = call(library, "init")()
+ if (init_result != "0")
+ CRASH("Error initializing byond-tracy: [init_result]")
+
+
/world/Profile(command, type, format)
if((command & PROFILE_STOP) || !global.config?.loaded || !CONFIG_GET(flag/forbid_all_profiling))
. = ..()
From c7f4d54d24903f1e7ee7e10075dc83bb0154de2f Mon Sep 17 00:00:00 2001
From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com>
Date: Sat, 29 Jul 2023 21:45:33 -0400
Subject: [PATCH 07/13] optimize icon smoothing
---
code/__HELPERS/icon_smoothing.dm | 42 ++++++++++-----------
code/game/objects/structures/false_walls.dm | 4 +-
code/game/objects/structures/low_wall.dm | 4 +-
code/game/turfs/closed/walls.dm | 4 +-
4 files changed, 28 insertions(+), 26 deletions(-)
diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm
index 2a19c6b0c61e..515d6908baf3 100644
--- a/code/__HELPERS/icon_smoothing.dm
+++ b/code/__HELPERS/icon_smoothing.dm
@@ -22,27 +22,19 @@
#define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi'
#define DEFAULT_UNDERLAY_ICON_STATE "plating"
-
-/**
- * Checks if `src` can smooth with `target`, based on the [/area/var/area_limited_icon_smoothing] variable of their areas.
- *
- * * If `target` doesn't have an area (E.g. the edge of the z level), return `FALSE`.
- * * If one area has `area_limited_icon_smoothing` set, and the other area's type doesn't match it, return `FALSE`.
- * * Else, return `TRUE`.
- *
- * Arguments:
- * * target - The atom we're trying to smooth with.
- */
-/atom/proc/can_area_smooth(atom/target)
- var/area/target_area = get_area(target)
- var/area/source_area = get_area(src)
- if(!target_area)
- return FALSE
- if(target_area.area_limited_icon_smoothing && !istype(source_area, target_area.area_limited_icon_smoothing))
- return FALSE
- if(source_area.area_limited_icon_smoothing && !istype(target_area, source_area.area_limited_icon_smoothing))
- return FALSE
- return TRUE
+/// Test if thing (an atom) can smooth with an adjacent turf. This is a macro because it is a very very hot proc.
+#define CAN_AREAS_SMOOTH(thing, turf, val) \
+ do{ \
+ var/my_area = get_step(thing, 0)?.loc
+ var/target_area = turf.loc
+ if(isnull(target_area))
+ break
+ if(target_area.area_limited_icon_smoothing && !istype(source_area, target_area.area_limited_icon_smoothing))
+ break
+ if(source_area.area_limited_icon_smoothing && !istype(target_area, source_area.area_limited_icon_smoothing))
+ break
+ val = TRUE
+ }while FALSE;
///Scans all adjacent turfs to find targets to smooth with.
/atom/proc/calculate_adjacencies()
@@ -210,7 +202,9 @@
if(!target_turf)
return NULLTURF_BORDER
- if(!can_area_smooth(target_turf))
+ var/can_area_smooth
+ CAN_AREAS_SMOOTH(src, step_turf, can_area_smooth)
+ if(isnull(can_area_smooth))
return NO_ADJ_FOUND
if(isnull(canSmoothWith)) //special case in which it will only smooth with itself
@@ -255,7 +249,9 @@
set_adj_in_dir: { \
do { \
var/turf/neighbor = get_step(src, direction); \
- if(neighbor && can_area_smooth(neighbor)) { \
+ var/can_area_smooth; \
+ CAN_AREAS_SMOOTH(src, step_turf, can_area_smooth); \
+ if(neighbor && can_area_smooth) { \
var/neighbor_smoothing_groups = neighbor.smoothing_groups; \
if(neighbor_smoothing_groups) { \
for(var/target in canSmoothWith) { \
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index c8ce2e31866f..3d1223fec947 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -136,7 +136,9 @@
for(var/cardinal in GLOB.cardinals)
var/turf/step_turf = get_step(src, cardinal)
- if(!can_area_smooth(step_turf))
+ var/can_area_smooth
+ CAN_AREAS_SMOOTH(src, step_turf, can_area_smooth)
+ if(isnull(can_area_smooth))
continue
for(var/atom/movable/movable_thing as anything in step_turf)
if(neighbor_typecache[movable_thing.type])
diff --git a/code/game/objects/structures/low_wall.dm b/code/game/objects/structures/low_wall.dm
index a7be50cd5b3f..a5daddefc29c 100644
--- a/code/game/objects/structures/low_wall.dm
+++ b/code/game/objects/structures/low_wall.dm
@@ -75,7 +75,9 @@
var/obj/structure/low_wall/neighbor = locate() in step_turf
if(neighbor)
continue
- if(!can_area_smooth(step_turf))
+ var/can_area_smooth
+ CAN_AREAS_SMOOTH(src, step_turf, can_area_smooth)
+ if(isnull(can_area_smooth))
continue
for(var/atom/movable/movable_thing as anything in step_turf)
if(airlock_typecache[movable_thing.type])
diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm
index 95ca6895f217..ecae1326ef27 100644
--- a/code/game/turfs/closed/walls.dm
+++ b/code/game/turfs/closed/walls.dm
@@ -106,7 +106,9 @@ GLOBAL_REAL_VAR(wall_overlays_cache) = list()
var/neighbor_stripe = NONE
for (var/cardinal = NORTH; cardinal <= WEST; cardinal *= 2) //No list copy please good sir
var/turf/step_turf = get_step(src, cardinal)
- if(!can_area_smooth(step_turf))
+ var/can_area_smooth
+ CAN_AREAS_SMOOTH(src, step_turf, can_area_smooth)
+ if(isnull(can_area_smooth))
continue
for(var/atom/movable/movable_thing as anything in step_turf)
if(global.neighbor_typecache[movable_thing.type])
From 5ad1d5e0ba0f699f9571a72aa47bc3acfa6b5ffe Mon Sep 17 00:00:00 2001
From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com>
Date: Sat, 29 Jul 2023 22:03:17 -0400
Subject: [PATCH 08/13] cleanup windows and fix compile
---
code/__HELPERS/icon_smoothing.dm | 27 ++++++++++++++------------
code/game/objects/structures/window.dm | 12 ------------
2 files changed, 15 insertions(+), 24 deletions(-)
diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm
index 515d6908baf3..5cbb8e2cde49 100644
--- a/code/__HELPERS/icon_smoothing.dm
+++ b/code/__HELPERS/icon_smoothing.dm
@@ -25,16 +25,19 @@
/// Test if thing (an atom) can smooth with an adjacent turf. This is a macro because it is a very very hot proc.
#define CAN_AREAS_SMOOTH(thing, turf, val) \
do{ \
- var/my_area = get_step(thing, 0)?.loc
- var/target_area = turf.loc
- if(isnull(target_area))
- break
- if(target_area.area_limited_icon_smoothing && !istype(source_area, target_area.area_limited_icon_smoothing))
- break
- if(source_area.area_limited_icon_smoothing && !istype(target_area, source_area.area_limited_icon_smoothing))
- break
- val = TRUE
- }while FALSE;
+ var/area/source_area = get_step(thing, 0)?.loc; \
+ var/area/target_area = turf:loc; \
+ if(isnull(target_area)) { \
+ break; \
+ };\
+ if(target_area.area_limited_icon_smoothing && !istype(source_area, target_area.area_limited_icon_smoothing)) { \
+ break; \
+ }; \
+ if(source_area.area_limited_icon_smoothing && !istype(target_area, source_area.area_limited_icon_smoothing)) { \
+ break; \
+ }; \
+ val = TRUE; \
+ }while(FALSE)
///Scans all adjacent turfs to find targets to smooth with.
/atom/proc/calculate_adjacencies()
@@ -203,7 +206,7 @@
return NULLTURF_BORDER
var/can_area_smooth
- CAN_AREAS_SMOOTH(src, step_turf, can_area_smooth)
+ CAN_AREAS_SMOOTH(src, target_turf, can_area_smooth)
if(isnull(can_area_smooth))
return NO_ADJ_FOUND
@@ -250,7 +253,7 @@
do { \
var/turf/neighbor = get_step(src, direction); \
var/can_area_smooth; \
- CAN_AREAS_SMOOTH(src, step_turf, can_area_smooth); \
+ CAN_AREAS_SMOOTH(src, neighbor, can_area_smooth); \
if(neighbor && can_area_smooth) { \
var/neighbor_smoothing_groups = neighbor.smoothing_groups; \
if(neighbor_smoothing_groups) { \
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 0890f7a5454d..93d4b5a1488e 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -55,32 +55,22 @@
else
. += span_notice("The window is unscrewed from the floor, and could be deconstructed by wrenching.")
-GLOBAL_REAL_VAR(windowcost) = list()
-GLOBAL_REAL_VAR(windowcount) = list()
/obj/structure/window/Initialize(mapload, direct)
- INIT_COST_GLOBAL(global.windowcost, global.windowcount)
. = ..()
- SET_COST("parent")
if(direct)
setDir(direct)
- SET_COST("direction")
if(reinf && anchored)
state = WINDOW_SCREWED_TO_FRAME
- SET_COST("set state")
zas_update_loc()
- SET_COST("zas loc")
-
if(fulltile)
setDir()
- SET_COST("fulltile dir")
//windows only block while reinforced and fulltile, so we'll use the proc
real_explosion_block = explosion_block
explosion_block = EXPLOSION_BLOCK_PROC
- SET_COST("explosions block")
flags_1 |= ALLOW_DARK_PAINTS_1
RegisterSignal(src, COMSIG_OBJ_PAINTED, PROC_REF(on_painted))
@@ -92,8 +82,6 @@ GLOBAL_REAL_VAR(windowcount) = list()
if (flags_1 & ON_BORDER_1)
AddElement(/datum/element/connect_loc, loc_connections)
- SET_COST("add connect loc")
- EXPORT_STATS_TO_CSV_LATER("cost_windows.csv", global.windowcost, global.windowcount)
/obj/structure/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
switch(the_rcd.mode)
From 392986c427aa280f0833d977b4ff64cd9f5bdf5a Mon Sep 17 00:00:00 2001
From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com>
Date: Sat, 29 Jul 2023 22:20:06 -0400
Subject: [PATCH 09/13] fix it for real
---
code/__HELPERS/icon_smoothing.dm | 3 +++
1 file changed, 3 insertions(+)
diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm
index 5cbb8e2cde49..669abd9351ca 100644
--- a/code/__HELPERS/icon_smoothing.dm
+++ b/code/__HELPERS/icon_smoothing.dm
@@ -25,6 +25,9 @@
/// Test if thing (an atom) can smooth with an adjacent turf. This is a macro because it is a very very hot proc.
#define CAN_AREAS_SMOOTH(thing, turf, val) \
do{ \
+ if(isnull(turf)) { \
+ break; \
+ }; \
var/area/source_area = get_step(thing, 0)?.loc; \
var/area/target_area = turf:loc; \
if(isnull(target_area)) { \
From 66cd0213cc1bf68e01694e9fb5050ec3799d7c5d Mon Sep 17 00:00:00 2001
From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com>
Date: Mon, 31 Jul 2023 01:12:55 -0400
Subject: [PATCH 10/13] fix alot of bugs
---
code/datums/components/twohanded.dm | 4 ++--
code/game/atoms_movable.dm | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm
index 6577c699ffeb..4e0cef366995 100644
--- a/code/datums/components/twohanded.dm
+++ b/code/datums/components/twohanded.dm
@@ -158,7 +158,7 @@
if(SEND_SIGNAL(parent, COMSIG_TWOHANDED_WIELD, user) & COMPONENT_TWOHANDED_BLOCK_WIELD)
return // blocked wield from item
wielded = TRUE
- ADD_TRAIT(parent,TRAIT_WIELDED,src)
+ ADD_TRAIT(parent,TRAIT_WIELDED, REF(src))
RegisterSignal(user, COMSIG_MOB_SWAP_HANDS, PROC_REF(on_swap_hands))
// update item stats and name
@@ -206,7 +206,7 @@
wielded = FALSE
UnregisterSignal(user, COMSIG_MOB_SWAP_HANDS)
SEND_SIGNAL(parent, COMSIG_TWOHANDED_UNWIELD, user)
- REMOVE_TRAIT(parent,TRAIT_WIELDED,src)
+ REMOVE_TRAIT(parent,TRAIT_WIELDED, REF(src))
// update item stats
var/obj/item/parent_item = parent
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index b3bdfe9e8090..16d87c8688c2 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -191,7 +191,7 @@
for(var/movable_content in contents)
qdel(movable_content)
- loc = null
+ moveToNullspace()
//This absolutely must be after moveToNullspace()
//We rely on Entered and Exited to manage this list, and the copy of this list that is on any /atom/movable "Containers"
From 1bbd7884f466ddaffb615fb9b8ac84b498b94cf1 Mon Sep 17 00:00:00 2001
From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com>
Date: Mon, 14 Aug 2023 17:04:07 -0400
Subject: [PATCH 11/13] fix mineral turrfs
---
code/__DEFINES/matrices.dm | 1 +
code/game/turfs/closed/minerals.dm | 11 ++++-------
daedalus.dme | 1 +
3 files changed, 6 insertions(+), 7 deletions(-)
create mode 100644 code/__DEFINES/matrices.dm
diff --git a/code/__DEFINES/matrices.dm b/code/__DEFINES/matrices.dm
new file mode 100644
index 000000000000..ae16554b7064
--- /dev/null
+++ b/code/__DEFINES/matrices.dm
@@ -0,0 +1 @@
+#define TRANSLATE_MATRIX(offset_x, offset_y) matrix(1, 0, (offset_x), 0, 1, (offset_y))
diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm
index 681a9d687fc0..9cd2532c6e30 100644
--- a/code/game/turfs/closed/minerals.dm
+++ b/code/game/turfs/closed/minerals.dm
@@ -1,5 +1,4 @@
#define MINING_MESSAGE_COOLDOWN 20
-#define MINERAL_WALL_OFFSET -4
/**********************Mineral deposits**************************/
/turf/closed/mineral //wall piece
@@ -17,10 +16,10 @@
base_icon_state = "smoothrocks"
temperature = TCMB
- base_pixel_x = MINERAL_WALL_OFFSET
- base_pixel_y = MINERAL_WALL_OFFSET
- pixel_x = MAP_SWITCH(MINERAL_WALL_OFFSET, 0)
- pixel_y = MAP_SWITCH(MINERAL_WALL_OFFSET, 0)
+ // This is static
+ // Done like this to avoid needing to make it dynamic and save cpu time
+ // 4 to the left, 4 down
+ transform = MAP_SWITCH(TRANSLATE_MATRIX(-4, -4), matrix())
var/turf/open/floor/plating/turf_type = /turf/open/misc/asteroid/airless
var/obj/item/stack/ore/mineralType = null
@@ -34,8 +33,6 @@
///How long it takes to mine this turf without tools, if it's weak.
var/hand_mine_speed = 15 SECONDS
-#undef MINERAL_WALL_OFFSET
-
//We don't call parent for perf reasons. Instead, we copy paste everything. BYOND!
/turf/closed/mineral/Initialize(mapload)
SHOULD_CALL_PARENT(FALSE)
diff --git a/daedalus.dme b/daedalus.dme
index 96719bdd9270..4f18d6bac645 100644
--- a/daedalus.dme
+++ b/daedalus.dme
@@ -123,6 +123,7 @@
#include "code\__DEFINES\mapswitch.dm"
#include "code\__DEFINES\materials.dm"
#include "code\__DEFINES\maths.dm"
+#include "code\__DEFINES\matrices.dm"
#include "code\__DEFINES\MC.dm"
#include "code\__DEFINES\mecha.dm"
#include "code\__DEFINES\mechcomp.dm"
From 76456c6ab7c4b7c42669ec00652f59d4514ce7e9 Mon Sep 17 00:00:00 2001
From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com>
Date: Sat, 19 Aug 2023 20:06:30 -0400
Subject: [PATCH 12/13] debug time
---
code/__HELPERS/icon_smoothing.dm | 46 ++++++++++++----------
code/modules/projectiles/guns/ballistic.dm | 8 ++--
2 files changed, 31 insertions(+), 23 deletions(-)
diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm
index 669abd9351ca..1c2c763ee75d 100644
--- a/code/__HELPERS/icon_smoothing.dm
+++ b/code/__HELPERS/icon_smoothing.dm
@@ -243,6 +243,7 @@
* Returns the previous smoothing_junction state so the previous state can be compared with the new one after the proc ends, and see the changes, if any.
*
*/
+#warn DO NOT MERGE WHILE THIS TRY CATCH EXISTS
/atom/proc/bitmask_smooth()
var/new_junction = NONE
// cache for sanic speed
@@ -256,33 +257,38 @@
do { \
var/turf/neighbor = get_step(src, direction); \
var/can_area_smooth; \
- CAN_AREAS_SMOOTH(src, neighbor, can_area_smooth); \
- if(neighbor && can_area_smooth) { \
- var/neighbor_smoothing_groups = neighbor.smoothing_groups; \
- if(neighbor_smoothing_groups) { \
- for(var/target in canSmoothWith) { \
- if(canSmoothWith[target] & neighbor_smoothing_groups[target]) { \
- new_junction |= direction_flag; \
- break set_adj_in_dir; \
- }; \
- }; \
- }; \
- if(smooth_obj) { \
- for(var/atom/movable/thing as anything in neighbor) { \
- var/thing_smoothing_groups = thing.smoothing_groups; \
- if(!thing.anchored || isnull(thing_smoothing_groups)) { \
- continue; \
- }; \
+ try { \
+ CAN_AREAS_SMOOTH(src, neighbor, can_area_smooth); \
+ if(neighbor && can_area_smooth) { \
+ var/neighbor_smoothing_groups = neighbor.smoothing_groups; \
+ if(neighbor_smoothing_groups) { \
for(var/target in canSmoothWith) { \
- if(canSmoothWith[target] & thing_smoothing_groups[target]) { \
+ if(canSmoothWith[target] & neighbor_smoothing_groups[target]) { \
new_junction |= direction_flag; \
break set_adj_in_dir; \
}; \
}; \
}; \
+ if(smooth_obj) { \
+ for(var/atom/movable/thing as anything in neighbor) { \
+ var/thing_smoothing_groups = thing.smoothing_groups; \
+ if(!thing.anchored || isnull(thing_smoothing_groups)) { \
+ continue; \
+ }; \
+ for(var/target in canSmoothWith) { \
+ if(canSmoothWith[target] & thing_smoothing_groups[target]) { \
+ new_junction |= direction_flag; \
+ break set_adj_in_dir; \
+ }; \
+ }; \
+ }; \
+ }; \
+ } else if (smooth_border) { \
+ new_junction |= direction_flag; \
}; \
- } else if (smooth_border) { \
- new_junction |= direction_flag; \
+ }; \
+ catch(var/exception/E) { \
+ throw EXCEPTION("SMOOTHING EXCEPTION: [E.name] @ [E.line] | SMOOTH OBJ? [smooth_obj ? "YES" : "NO"] | SRC: [type] @ ([x], [y], [z]) | TGT: [neighbor.type] @ ([neighbor.x], [neighbor.y], [neighbor.z] | SRC SMOOTH GROUPS: [json_encode(smoothing_groups)] | SRC CANSMOOTHWITH: [json_encode(canSmoothWith)] | TGT SMOOTH GROUPS: [json_encode(neighbor.smoothing_groups)] | TGT CANSMOOTHWITH: [json_encode(neighbor.canSmoothWith)])"); \
}; \
} while(FALSE) \
}
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 4916464a4fe7..659e2a906414 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -48,7 +48,7 @@
///Whether the gun will spawn loaded with a magazine
var/spawnwithmagazine = TRUE
///Compatible magazines with the gun
- var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info
+ var/obj/item/ammo_box/magazine/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info
///Whether the sprite has a visible magazine or not
var/mag_display = TRUE
///Whether the sprite has a visible ammo display or not
@@ -145,9 +145,11 @@
return ..()
/obj/item/gun/ballistic/fire_sounds()
- var/frequency_to_use = sin((90/magazine?.max_ammo) * get_ammo())
+ var/max_ammo = magazine?.max_ammo || initial(mag_type.max_ammo)
+ var/current_ammo = get_ammo()
+ var/frequency_to_use = sin((90 / max_ammo) * current_ammo)
var/click_frequency_to_use = 1 - frequency_to_use * 0.75
- var/play_click = round(sqrt(magazine?.max_ammo * 2)) > get_ammo()
+ var/play_click = round(sqrt(max_ammo * 2)) > get_ammo()
if(suppressed)
playsound(src, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0)
if(play_click)
From fbdaefb5c5cc06b835d433b5efd42d6d047fd2f0 Mon Sep 17 00:00:00 2001
From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com>
Date: Fri, 1 Sep 2023 23:51:43 -0400
Subject: [PATCH 13/13] remove debug code
---
code/__HELPERS/icon_smoothing.dm | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm
index 1c2c763ee75d..e363ca8b6955 100644
--- a/code/__HELPERS/icon_smoothing.dm
+++ b/code/__HELPERS/icon_smoothing.dm
@@ -243,7 +243,6 @@
* Returns the previous smoothing_junction state so the previous state can be compared with the new one after the proc ends, and see the changes, if any.
*
*/
-#warn DO NOT MERGE WHILE THIS TRY CATCH EXISTS
/atom/proc/bitmask_smooth()
var/new_junction = NONE
// cache for sanic speed
@@ -257,7 +256,6 @@
do { \
var/turf/neighbor = get_step(src, direction); \
var/can_area_smooth; \
- try { \
CAN_AREAS_SMOOTH(src, neighbor, can_area_smooth); \
if(neighbor && can_area_smooth) { \
var/neighbor_smoothing_groups = neighbor.smoothing_groups; \
@@ -286,13 +284,10 @@
} else if (smooth_border) { \
new_junction |= direction_flag; \
}; \
- }; \
- catch(var/exception/E) { \
- throw EXCEPTION("SMOOTHING EXCEPTION: [E.name] @ [E.line] | SMOOTH OBJ? [smooth_obj ? "YES" : "NO"] | SRC: [type] @ ([x], [y], [z]) | TGT: [neighbor.type] @ ([neighbor.x], [neighbor.y], [neighbor.z] | SRC SMOOTH GROUPS: [json_encode(smoothing_groups)] | SRC CANSMOOTHWITH: [json_encode(canSmoothWith)] | TGT SMOOTH GROUPS: [json_encode(neighbor.smoothing_groups)] | TGT CANSMOOTHWITH: [json_encode(neighbor.canSmoothWith)])"); \
- }; \
} while(FALSE) \
}
+
for(var/direction in GLOB.cardinals) //Cardinal case first.
SET_ADJ_IN_DIR(direction, direction)