From 7c0c923c8711365270735586f9cbc5a40d0920d2 Mon Sep 17 00:00:00 2001 From: vincibrv Date: Sun, 29 Dec 2024 22:42:17 +0100 Subject: [PATCH 1/6] roofs using queue instead of recursion --- code/game/objects/structures/roof.dm | 58 ++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/code/game/objects/structures/roof.dm b/code/game/objects/structures/roof.dm index 46981ed550cb..cf91638f4ecf 100644 --- a/code/game/objects/structures/roof.dm +++ b/code/game/objects/structures/roof.dm @@ -49,12 +49,13 @@ roof_master_node.connect(loc) /obj/structure/roof/Destroy(force, ...) - if(linked_master) - linked_master.remove_roof(src) - for(var/icon in GLOB.player_list) - var/mob/mob = icon - mob.client.images -= normal_image - return ..() + if(linked_master) + linked_master.remove_roof(src) + linked_master = null; + for(var/icon in GLOB.player_list) + var/mob/mob = icon + mob.client.images -= normal_image + return ..() /obj/structure/roof/proc/add_default_image(subsystem, mob/mob) SIGNAL_HANDLER @@ -65,9 +66,12 @@ return master.connected_roof += src linked_master = master + var/list/unprocesed_roofs = list() for(var/direction in CARDINAL_ALL_DIRS) for(var/obj/structure/roof/roof in get_step(src,direction)) - roof.link_master(master) + if(!roof.linked_master) + unprocesed_roofs += roof + return unprocesed_roofs /obj/effect/roof_node //used for observing if mob is near the roof @@ -96,9 +100,12 @@ return master.connected_nodes += src linked_master = master + var/list/nerby_nodes = list() for(var/direction in CARDINAL_ALL_DIRS) for(var/obj/effect/roof_node/node in get_step(src,direction)) - node.link_master(master) + if(!node.linked_master) + nerby_nodes += node + return nerby_nodes /datum/roof_master_node //maintains one block of roof @@ -108,13 +115,13 @@ var/location /datum/roof_master_node/Destroy(force, ...) - if(connected_nodes) - for(var/obj/effect/roof_node/roof_node in connected_nodes) - qdel(roof_node) - if(connected_nodes) - for(var/obj/structure/roof/roof in connected_roof) - qdel(roof) - return ..() + if(connected_nodes) + for(var/obj/effect/roof_node/roof_node in connected_nodes) + qdel(roof_node) + if(connected_roof) + for(var/obj/structure/roof/roof in connected_roof) + qdel(roof) + return ..() /datum/roof_master_node/proc/add_under_roof(mob/living/living) //mob crossed connected node if(living in mobs_under) @@ -154,10 +161,27 @@ remove_under_roof(living) /datum/roof_master_node/proc/connect(location) + var/list/unprocesed_nodes = list() for(var/obj/effect/roof_node/node in location) - node.link_master(src) + unprocesed_nodes += node + + + while(unprocesed_nodes.len) + var/obj/effect/roof_node/node = popleft(unprocesed_nodes) + var/list/new_nodes = node.link_master(src) + if(new_nodes) + unprocesed_nodes += new_nodes + + var/list/unprocesed_roofs = list() + for(var/obj/structure/roof/roof in location) - roof.link_master(src) + unprocesed_roofs += roof + + while(unprocesed_roofs.len) + var/obj/structure/roof/roof = popleft(unprocesed_roofs) + var/list/new_roofs = roof.link_master(src) + if(new_roofs) + unprocesed_roofs += new_roofs /datum/roof_master_node/proc/remove_roof(obj/structure/roof/roof) //roof tile got removed connected_roof -= roof From 850a8e1bff0d9f4b8a77d2bfccd52c21d5c2ecc3 Mon Sep 17 00:00:00 2001 From: cuberound <122645057+cuberound@users.noreply.github.com> Date: Mon, 30 Dec 2024 09:44:40 +0100 Subject: [PATCH 2/6] Update code/game/objects/structures/roof.dm Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/game/objects/structures/roof.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/roof.dm b/code/game/objects/structures/roof.dm index cf91638f4ecf..c0144a7e3cbf 100644 --- a/code/game/objects/structures/roof.dm +++ b/code/game/objects/structures/roof.dm @@ -52,9 +52,8 @@ if(linked_master) linked_master.remove_roof(src) linked_master = null; - for(var/icon in GLOB.player_list) - var/mob/mob = icon - mob.client.images -= normal_image + for(var/mob/mob as anything in GLOB.player_list) + mob.client?.images -= normal_image return ..() /obj/structure/roof/proc/add_default_image(subsystem, mob/mob) From 09c536d3ade1d320c20c91323e1b8fe73b53e89d Mon Sep 17 00:00:00 2001 From: vincibrv Date: Mon, 30 Dec 2024 10:03:01 +0100 Subject: [PATCH 3/6] adds suggested changes --- code/game/objects/structures/roof.dm | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/code/game/objects/structures/roof.dm b/code/game/objects/structures/roof.dm index c0144a7e3cbf..10d46822222b 100644 --- a/code/game/objects/structures/roof.dm +++ b/code/game/objects/structures/roof.dm @@ -34,7 +34,7 @@ neighbor = locate() in adjacent_loc if(!neighbor) neighbor = new(adjacent_loc) - return INITIALIZE_HINT_LATELOAD + return INITIALIZE_HINT_ROUNDSTART /obj/structure/roof/LateInitialize() //we use late init to allow for lazy nodes to spawn first on mapload . = ..() @@ -49,12 +49,12 @@ roof_master_node.connect(loc) /obj/structure/roof/Destroy(force, ...) - if(linked_master) - linked_master.remove_roof(src) - linked_master = null; - for(var/mob/mob as anything in GLOB.player_list) - mob.client?.images -= normal_image - return ..() + if(linked_master) + linked_master.remove_roof(src) + linked_master = null; + for(var/mob/mob as anything in GLOB.player_list) + mob.client?.images -= normal_image + return ..() /obj/structure/roof/proc/add_default_image(subsystem, mob/mob) SIGNAL_HANDLER @@ -114,13 +114,13 @@ var/location /datum/roof_master_node/Destroy(force, ...) - if(connected_nodes) - for(var/obj/effect/roof_node/roof_node in connected_nodes) - qdel(roof_node) - if(connected_roof) - for(var/obj/structure/roof/roof in connected_roof) - qdel(roof) - return ..() + if(connected_nodes) + for(var/obj/effect/roof_node/roof_node in connected_nodes) + qdel(roof_node) + if(connected_roof) + for(var/obj/structure/roof/roof in connected_roof) + qdel(roof) + return ..() /datum/roof_master_node/proc/add_under_roof(mob/living/living) //mob crossed connected node if(living in mobs_under) @@ -165,7 +165,7 @@ unprocesed_nodes += node - while(unprocesed_nodes.len) + while(length(unprocesed_nodes)) var/obj/effect/roof_node/node = popleft(unprocesed_nodes) var/list/new_nodes = node.link_master(src) if(new_nodes) @@ -176,7 +176,7 @@ for(var/obj/structure/roof/roof in location) unprocesed_roofs += roof - while(unprocesed_roofs.len) + while(length(unprocesed_roofs)) var/obj/structure/roof/roof = popleft(unprocesed_roofs) var/list/new_roofs = roof.link_master(src) if(new_roofs) From be7be388d30a2e4a731ba618bfdef11ffdac8981 Mon Sep 17 00:00:00 2001 From: vincibrv Date: Mon, 30 Dec 2024 10:12:24 +0100 Subject: [PATCH 4/6] hm --- code/game/objects/structures/roof.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/roof.dm b/code/game/objects/structures/roof.dm index 10d46822222b..85b903d0e8e5 100644 --- a/code/game/objects/structures/roof.dm +++ b/code/game/objects/structures/roof.dm @@ -25,6 +25,10 @@ for(var/icon in GLOB.player_list) add_default_image(SSdcs, icon) + return INITIALIZE_HINT_ROUNDSTART + +/obj/structure/roof/LateInitialize() //we use late init to allow for lazy nodes to spawn first on mapload + . = ..() if(lazy_nodes) //creates new node on each surounding tile if there is not one already var/obj/effect/roof_node/neighbor = locate() in loc if(!neighbor) @@ -34,10 +38,6 @@ neighbor = locate() in adjacent_loc if(!neighbor) neighbor = new(adjacent_loc) - return INITIALIZE_HINT_ROUNDSTART - -/obj/structure/roof/LateInitialize() //we use late init to allow for lazy nodes to spawn first on mapload - . = ..() if(linked_master) return for(var/direction in CARDINAL_ALL_DIRS) //this searches if there is lattice with master already, to work with runtime creation From 6f9ddbb2a691c5cd737c26823f46fad732af743a Mon Sep 17 00:00:00 2001 From: vincibrv Date: Mon, 30 Dec 2024 10:22:10 +0100 Subject: [PATCH 5/6] lazy nodes need to be in init --- code/game/objects/structures/roof.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/roof.dm b/code/game/objects/structures/roof.dm index 85b903d0e8e5..10d46822222b 100644 --- a/code/game/objects/structures/roof.dm +++ b/code/game/objects/structures/roof.dm @@ -25,10 +25,6 @@ for(var/icon in GLOB.player_list) add_default_image(SSdcs, icon) - return INITIALIZE_HINT_ROUNDSTART - -/obj/structure/roof/LateInitialize() //we use late init to allow for lazy nodes to spawn first on mapload - . = ..() if(lazy_nodes) //creates new node on each surounding tile if there is not one already var/obj/effect/roof_node/neighbor = locate() in loc if(!neighbor) @@ -38,6 +34,10 @@ neighbor = locate() in adjacent_loc if(!neighbor) neighbor = new(adjacent_loc) + return INITIALIZE_HINT_ROUNDSTART + +/obj/structure/roof/LateInitialize() //we use late init to allow for lazy nodes to spawn first on mapload + . = ..() if(linked_master) return for(var/direction in CARDINAL_ALL_DIRS) //this searches if there is lattice with master already, to work with runtime creation From d77ff1681a6b32799592d8c7a2fcf340696d7937 Mon Sep 17 00:00:00 2001 From: vincibrv Date: Mon, 3 Feb 2025 23:34:51 +0100 Subject: [PATCH 6/6] improvements --- code/game/objects/structures/roof.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/roof.dm b/code/game/objects/structures/roof.dm index 10d46822222b..cc0c21b50104 100644 --- a/code/game/objects/structures/roof.dm +++ b/code/game/objects/structures/roof.dm @@ -69,7 +69,7 @@ for(var/direction in CARDINAL_ALL_DIRS) for(var/obj/structure/roof/roof in get_step(src,direction)) if(!roof.linked_master) - unprocesed_roofs += roof + unprocesed_roofs |= roof return unprocesed_roofs @@ -162,7 +162,7 @@ /datum/roof_master_node/proc/connect(location) var/list/unprocesed_nodes = list() for(var/obj/effect/roof_node/node in location) - unprocesed_nodes += node + unprocesed_nodes |= node while(length(unprocesed_nodes)) @@ -174,7 +174,7 @@ var/list/unprocesed_roofs = list() for(var/obj/structure/roof/roof in location) - unprocesed_roofs += roof + unprocesed_roofs |= roof while(length(unprocesed_roofs)) var/obj/structure/roof/roof = popleft(unprocesed_roofs)