From 2ae7555c5364c1eff11d5bf617ffc3ebe8e70215 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sat, 7 Nov 2020 16:21:23 +0100 Subject: [PATCH] [MIRROR] Tweaks Floorbot pathfinding to prevent dogpiles and help prevent duplicate tile placements. (#1605) * Tweaks Floorbot pathfinding to prevent dogpiles and help prevent duplicate tile placements. (#54786) This pr adjusts floorbots behaviors in order to attempt to fix any of the following issues: #54159, #54196, #37421. More or less the issue appears to have been that floorbots would place floor platings on top of where another floorbot would already be repairing a tile, and since they don't check for each other's work, they were stacking floor turfs ontop of each other, creating either A: Infinite piles of floor tiles, or B: Multiple floor tiles stacked on top of each other. The former I think may have been fixed in the previous changes to how shuttlecode turfs were stacking on-top of each other, but the multiple stacks of floor tiles overlaying was not resolved. This adds a check to the beginning of floorbots repair proc which determines if another floorbot is there and repairing the turf already. If so, it begins to ignore the turf until it is reset next, which it tends to go over the course of a single job. This helps split up and divide multiple floorbots working on the same tile at a time, in order to prevent infinite floorstacks. If 2 floorbots are on the same tile and conflicting, then a little whistle effect will play to indicate that they're moving to a new worksite. * Tweaks Floorbot pathfinding to prevent dogpiles and help prevent duplicate tile placements. Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> --- .../mob/living/simple_animal/bot/floorbot.dm | 17 +++++++++++++++-- sound/effects/whistlereset.ogg | Bin 0 -> 16689 bytes 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 sound/effects/whistlereset.ogg diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index a357826db7c..7b60836dc65 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -192,7 +192,6 @@ process_type = LINE_SPACE_MODE if(isfloorturf(T)) //Check for floor target = T - if(!target) process_type = HULL_BREACH //Ensures the floorbot does not try to "fix" space areas or shuttle docking zones. target = scan(/turf/open/space) @@ -309,7 +308,11 @@ return result /mob/living/simple_animal/bot/floorbot/proc/repair(turf/target_turf) - + if(check_bot_working(target_turf)) + add_to_ignore(target_turf) + target = null + playsound(src, 'sound/effects/whistlereset.ogg', 50, TRUE) + return if(isspaceturf(target_turf)) //Must be a hull breach or in line mode to continue. if(!is_hull_breach(target_turf) && !targetdirection) @@ -393,3 +396,13 @@ repair(A) else ..() + +/** + * Checks a given turf to see if another floorbot is there, working as well. + */ +/mob/living/simple_animal/bot/floorbot/proc/check_bot_working(turf/active_turf) + if(isturf(active_turf)) + for(var/mob/living/simple_animal/bot/floorbot/robot in active_turf) + if(robot.mode == BOT_REPAIRING) + return TRUE + return FALSE diff --git a/sound/effects/whistlereset.ogg b/sound/effects/whistlereset.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cf55c06ca88f100b7d10a2e304c4eaed4b475387 GIT binary patch literal 16689 zcmeIZbyQr>(kQxd2o@xGkU(&EXCT2Lc<>Np(BSS9LxLr^PawDkcMHKSI0X0L!JWCA zpbUAs%Vs(bgSSy^cT$iP2of#GjOfimV2i5khn(Z$Th z^$vvmwCEoc=fB9cNNRUI|DEo7B7sjiT`Y!#Vu=5iKB4>_iVeijvvIQKRCBSSePv_z z{0{+IMOt2N9$s!6h&6Jr(bY8~96iLs#_Wai;Ko&PFm`7Is*04e}u#)|y1u4p?b zVnxOj>GD~`=9zFVEyf3pMG>rTCyeF}Ih8qf4udR@F>&?Lz$Xpi5M0pofgbY~Rv4j>Y`VmX?7sVV)+Y+0UYU{#k`@VAazH*#D zD4 z@XNdMce#p#S>EkwPprzou?qgbgm5Qz0D$mNbvRS?fZWjJ7=m$1M>;aUrHcCNX9B{@{i=B0TI09wa@v)DWh$n z+9^zR`H3liB=~BOd;%uan#q#IqSm z#>k)61N-X#NM6sYBL-`su_;Vdb=rT&`$sMEU!)GUi7bIVLVu>%)nOTfwF`^Xy#cH{ z*nd|a2q-txDYDMAH?;nd=w`%pIdn19Zc%tKpLx1jvZx~><&^T@s%w%nWxKukGjm!1 zcz6Gg7XPdGqso7^I4k-CYcF#}KW`uVT~X9ND7yW%{r(di9#D(f1wbv1s9H~VEfG<$ z%dVO*V9SoxRAR~gYf+$3X)QiVqm%zJlAuJFUY1f2{B zSbqilFUxTz?)pU4^NB&ZoI!Pjec+H^?TCMvNLGViRqKKA@B{Zz5~!A-@u&cFR0lfl z0iCXf8rJyhSN~%$f6ZoL()~Xy=gvePiA1g_M5F$f<$Pw2To#U`SBz%Rk7o3aw+c

qM^w#t|>6C$)Tey@xQhhuyveY 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 literal 0 HcmV?d00001