From c49f3620391d566667da33b5bbac87c1de9effdb Mon Sep 17 00:00:00 2001
From: Deniz <66401072+Oyu07@users.noreply.github.com>
Date: Sun, 31 Dec 2023 10:18:31 +0000
Subject: [PATCH] Yet another bots refactor (#23162)
* initial test commit
* 2nd stage
* hull breach bug found
* 3rd small
* Master Merge
* fml
* one more time
* Merge failed incredibly bad, except commits
* 4th small
* 5th - Hull breach auto/replace tile bug fixed
* sleep
* avoid to avoid_bot
* indentation
* get_turf()
* even more comments
* Define edits
* eat tile order edit
* ui goes big
* Minor edits
* suggestions
* S Floor
* S Weapons check
* review
* I dont want TGUI on this
* Missed one
* review IF
* Returned the Return
* if error
* mode ==
* Reviews, Ty contra
* we shall NAG
* review
* Reviews
* Oppsie fixed
* tgui typo*
* TGUI Backend *fixed*
* Revert tgui backend edit, oopsie, small text edits
* Reviews
* emag autodoc + else if hateboner
* revert a change, non relevant
* undef
* revert tgui window size edit
* cleanbot cleanable list
* minor edit
* Review isspaceturf
Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>
* List
* Emagged 1/0
* Cleanbot list edit
* emagged 1/0 2
* removed comment
* emag_act revert
* didnt commit?
---------
Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>
---
code/__DEFINES/bots.dm | 2 +
code/game/data_huds.dm | 2 +-
.../mob/living/carbon/alien/alien_base.dm | 2 +-
.../mob/living/carbon/human/human_mob.dm | 2 +-
.../mob/living/simple_animal/bot/bot.dm | 35 ++--
.../mob/living/simple_animal/bot/cleanbot.dm | 55 +++---
.../mob/living/simple_animal/bot/ed209bot.dm | 16 +-
.../mob/living/simple_animal/bot/floorbot.dm | 162 +++++++++---------
.../mob/living/simple_animal/bot/honkbot.dm | 16 +-
.../mob/living/simple_animal/bot/medbot.dm | 8 +-
.../mob/living/simple_animal/bot/mulebot.dm | 4 +-
.../mob/living/simple_animal/bot/secbot.dm | 16 +-
.../simple_animal/bot/syndicate_bots.dm | 2 +-
13 files changed, 165 insertions(+), 157 deletions(-)
diff --git a/code/__DEFINES/bots.dm b/code/__DEFINES/bots.dm
index c283445d0ad..9301b1c7923 100644
--- a/code/__DEFINES/bots.dm
+++ b/code/__DEFINES/bots.dm
@@ -24,6 +24,8 @@
#define BOT_NAV 15 // computing navigation
#define BOT_WAIT_FOR_NAV 16 // waiting for nav computation
#define BOT_NO_ROUTE 17 // no destination beacon found (or no route)
+#define BOT_MAKE_TILE 18 // converting metal into tiles (floorbots)
+#define BOT_EAT_TILE 19 // adding said tiles to inventory (floorbots)
//Bot types
#define SEC_BOT 1 // Secutritrons (Beepsky) and ED-209s
diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm
index 6b019a4a91f..848e7fa0fcb 100644
--- a/code/game/data_huds.dm
+++ b/code/game/data_huds.dm
@@ -397,7 +397,7 @@
switch(mode)
if(BOT_SUMMON, BOT_RESPONDING) //Responding to PDA or AI summons
holder.icon_state = "hudcalled"
- if(BOT_CLEANING, BOT_REPAIRING, BOT_HEALING) //Cleanbot cleaning, Floorbot fixing, or Medibot Healing
+ if(BOT_CLEANING, BOT_REPAIRING, BOT_MAKE_TILE, BOT_EAT_TILE, BOT_HEALING) //Cleanbot cleaning, Floorbot fixing, or Medibot Healing
holder.icon_state = "hudworking"
if(BOT_PATROL, BOT_START_PATROL) //Patrol mode
holder.icon_state = "hudpatrol"
diff --git a/code/modules/mob/living/carbon/alien/alien_base.dm b/code/modules/mob/living/carbon/alien/alien_base.dm
index cc8f61a59c3..7a784574639 100644
--- a/code/modules/mob/living/carbon/alien/alien_base.dm
+++ b/code/modules/mob/living/carbon/alien/alien_base.dm
@@ -181,7 +181,7 @@
return threatcount
//Check for weapons
- if(judgebot.weaponscheck)
+ if(judgebot.weapons_check)
if(judgebot.check_for_weapons(l_hand))
threatcount += 4
if(judgebot.check_for_weapons(r_hand))
diff --git a/code/modules/mob/living/carbon/human/human_mob.dm b/code/modules/mob/living/carbon/human/human_mob.dm
index b03ec373bcc..c6be87db37d 100644
--- a/code/modules/mob/living/carbon/human/human_mob.dm
+++ b/code/modules/mob/living/carbon/human/human_mob.dm
@@ -1595,7 +1595,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
threatcount += 4
//Check for weapons
- if(judgebot.weaponscheck)
+ if(judgebot.weapons_check)
if(!idcard || !(ACCESS_WEAPONS in idcard.access))
if(judgebot.check_for_weapons(l_hand))
threatcount += 4
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 3271da6504f..9366461eb33 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -34,7 +34,7 @@
var/disabling_timer_id = null
var/list/player_access = list()
- var/emagged = 0
+ var/emagged = FALSE
var/obj/item/card/id/access_card // the ID card that the bot "holds"
var/list/prev_access = list()
var/on = TRUE
@@ -201,6 +201,9 @@
return ..()
+/mob/living/simple_animal/bot/mob_negates_gravity()
+ return anchored
+
/mob/living/simple_animal/bot/death(gibbed)
// Only execute the below if we successfully died
. = ..()
@@ -214,11 +217,10 @@
/mob/living/simple_animal/bot/emag_act(mob/user)
if(locked) //First emag application unlocks the bot's interface. Apply a screwdriver to use the emag again.
locked = FALSE
- emagged = 1
to_chat(user, "You bypass [src]'s controls.")
return
if(!locked && open) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging.
- emagged = 2
+ emagged = TRUE
remote_disabled = TRUE //Manually emagging the bot locks out the AI built in panel.
locked = TRUE //Access denied forever!
bot_reset()
@@ -469,12 +471,13 @@ scan() will search for a given type (such as turfs, human mobs, or objects) in t
Arguments: The object type to be searched (such as "/mob/living/carbon/human"), the old scan result to be ignored, if one exists,
and the view range, which defaults to 7 (full screen) if an override is not passed.
If the bot maintains an ignore list, it is also checked here.
+If the bot has avoid_bot, which inserts its own path, it will ignore turfs with the same bot type
Example usage: patient = scan(/mob/living/carbon/human, oldpatient, 1)
The proc would return a human next to the bot to be set to the patient var.
Pass the desired type path itself, declaring a temporary var beforehand is not required.
*/
-/mob/living/simple_animal/bot/proc/scan(atom/scan_type, atom/old_target, scan_range = DEFAULT_SCAN_RANGE)
+/mob/living/simple_animal/bot/proc/scan(atom/scan_type, atom/old_target, scan_range = DEFAULT_SCAN_RANGE, avoid_bot)
var/final_result
for(var/scan in view(scan_range, src)) //Search for something in range!
var/atom/A = scan
@@ -482,6 +485,8 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r
continue //If not, keep searching!
if((A.UID() in ignore_list) || (A == old_target)) //Filter for blacklisted elements, usually unreachable or previously processed oness
continue
+ if(turf_has_bot(avoid_bot, get_turf(A))) //Ignores targets that already have a bot of the same type on it, meant for cleanbot and floorbot seperation
+ continue
var/scan_result = process_scan(A) //Some bots may require additional processing when a result is selected.
if(scan_result)
final_result = scan_result
@@ -489,6 +494,14 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r
continue //The current element failed assessment, move on to the next.
return final_result
+/mob/living/simple_animal/bot/proc/turf_has_bot(avoid_bot, turf/turf_to_search)
+ if(!avoid_bot)
+ return FALSE
+ for(var/bot in turf_to_search)
+ if(istype(bot, avoid_bot))
+ return TRUE
+ return FALSE
+
//When the scan finds a target, run bot specific processing to select it for the next step. Empty by default.
/mob/living/simple_animal/bot/proc/process_scan(atom/scan_target)
return scan_target
@@ -736,7 +749,7 @@ Pass a positive integer as an argument to override a bot's default speed.
return FALSE
// check to see if we are the commanded bot
- if(emagged == 2 || remote_disabled || hijacked) //Emagged bots do not respect anyone's authority! Bots with their remote controls off cannot get commands.
+ if(emagged || remote_disabled || hijacked) //Emagged bots do not respect anyone's authority! Bots with their remote controls off cannot get commands.
return FALSE
if(client)
@@ -879,8 +892,8 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/proc/handle_hacking(mob/M) // refactored out of Topic/ to allow re-use by TGUIs
if(!canhack(M))
return
- if(emagged != 2)
- emagged = 2
+ if(!emagged)
+ emagged = TRUE
hacked = TRUE
locked = TRUE
to_chat(M, "[text_hack]")
@@ -890,7 +903,7 @@ Pass a positive integer as an argument to override a bot's default speed.
else if(!hacked)
to_chat(M, "[text_dehack_fail]")
else
- emagged = 0
+ emagged = FALSE
hacked = FALSE
to_chat(M, "[text_dehack]")
show_laws()
@@ -905,7 +918,7 @@ Pass a positive integer as an argument to override a bot's default speed.
return FALSE
if(user.incapacitated() || !(issilicon(user) || in_range(src, user)))
return TRUE
- if(emagged == 2) //An emagged bot cannot be controlled by humans, silicons can if one hacked it.
+ if(emagged) //An emagged bot cannot be controlled by humans, silicons can if one hacked it.
if(!hacked) //Manually emagged by a human - access denied to all.
return TRUE
else if(!(issilicon(user) || ispulsedemon(user))) //Bot is hacked, so only silicons are allowed access.
@@ -919,7 +932,7 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/proc/hack(mob/user)
var/hack
if(issilicon(user) || user.can_admin_interact()) //Allows silicons or admins to toggle the emag status of a bot.
- hack += "[emagged == 2 ? "Software compromised! Unit may exhibit dangerous or erratic behavior." : "Unit operating normally. Release safety lock?"]
"
+ hack += "[emagged ? "Software compromised! Unit may exhibit dangerous or erratic behavior." : "Unit operating normally. Release safety lock?"]
"
hack += "Harm Prevention Safety System: [emagged ? "DANGER" : "Engaged"]
"
else if(!locked) //Humans with access can use this option to hide a bot from the AI's remote control panel and PDA control.
hack += "Remote network control radio: [remote_disabled ? "Disconnected" : "Connected"]
"
@@ -1006,7 +1019,7 @@ Pass a positive integer as an argument to override a bot's default speed.
if(paicard && paicard.pai && paicard.pai.master && paicard.pai.pai_law0)
to_chat(src, "Your master, [paicard.pai.master], may overrule any and all laws.")
to_chat(src, "0. [paicard.pai.pai_law0]")
- if(emagged >= 2)
+ if(emagged)
to_chat(src, "1. #$!@#$32K#$")
else
to_chat(src, "1. You are a machine built to serve the station's crew and AI(s).")
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index 7c21d451ec3..2e66a0486d3 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -29,10 +29,27 @@
var/failed_steps
var/next_dest
var/next_dest_loc
+ var/static/list/clean_dirt = list(
+ /obj/effect/decal/cleanable/vomit,
+ /obj/effect/decal/cleanable/blood/gibs/robot,
+ /obj/effect/decal/cleanable/crayon,
+ /obj/effect/decal/cleanable/liquid_fuel,
+ /obj/effect/decal/cleanable/molten_object,
+ /obj/effect/decal/cleanable/tomato_smudge,
+ /obj/effect/decal/cleanable/egg_smudge,
+ /obj/effect/decal/cleanable/pie_smudge,
+ /obj/effect/decal/cleanable/flour,
+ /obj/effect/decal/cleanable/ash,
+ /obj/effect/decal/cleanable/greenglow,
+ /obj/effect/decal/cleanable/dirt
+ )
+ var/static/list/clean_blood = list(
+ /obj/effect/decal/cleanable/blood,
+ /obj/effect/decal/cleanable/trail_holder
+ )
/mob/living/simple_animal/bot/cleanbot/Initialize(mapload)
. = ..()
- get_targets()
icon_state = "cleanbot[on]"
var/datum/job/janitor/J = new/datum/job/janitor
@@ -80,9 +97,8 @@
to_chat(user, "[src] buzzes and beeps.")
/mob/living/simple_animal/bot/cleanbot/process_scan(obj/effect/decal/cleanable/D)
- for(var/T in target_types)
- if(istype(D, T))
- return D
+ if(is_type_in_typecache(D, clean_dirt) || blood && is_type_in_typecache(D, clean_blood))
+ return D
/mob/living/simple_animal/bot/cleanbot/handle_automated_action()
if(!..())
@@ -91,7 +107,7 @@
if(mode == BOT_CLEANING)
return
- if(emagged == 2) //Emag functions
+ if(emagged) //Emag functions
if(issimulatedturf(loc))
if(prob(10)) //Wets floors randomly
var/turf/simulated/T = loc
@@ -105,7 +121,7 @@
audible_message("[src] makes an excited beeping booping sound!")
if(!target) //Search for cleanables it can see.
- target = scan(/obj/effect/decal/cleanable)
+ target = scan(/obj/effect/decal/cleanable, avoid_bot = /mob/living/simple_animal/bot/cleanbot)
if(!target && auto_patrol) //Search for cleanables it can see.
if(mode == BOT_IDLE || mode == BOT_START_PATROL)
@@ -136,32 +152,6 @@
oldloc = loc
-/mob/living/simple_animal/bot/cleanbot/proc/get_targets()
- target_types = new/list()
-
- target_types += /obj/effect/decal/cleanable/blood/oil
- target_types += /obj/effect/decal/cleanable/vomit
- target_types += /obj/effect/decal/cleanable/blood/gibs/robot
- target_types += /obj/effect/decal/cleanable/crayon
- target_types += /obj/effect/decal/cleanable/liquid_fuel
- target_types += /obj/effect/decal/cleanable/molten_object
- target_types += /obj/effect/decal/cleanable/tomato_smudge
- target_types += /obj/effect/decal/cleanable/egg_smudge
- target_types += /obj/effect/decal/cleanable/pie_smudge
- target_types += /obj/effect/decal/cleanable/flour
- target_types += /obj/effect/decal/cleanable/ash
- target_types += /obj/effect/decal/cleanable/greenglow
- target_types += /obj/effect/decal/cleanable/dirt
-
- if(blood)
- target_types += /obj/effect/decal/cleanable/blood/xeno/
- target_types += /obj/effect/decal/cleanable/blood/gibs/xeno
- target_types += /obj/effect/decal/cleanable/blood/
- target_types += /obj/effect/decal/cleanable/blood/gibs/
- target_types += /obj/effect/decal/cleanable/blood/tracks
- target_types += /obj/effect/decal/cleanable/dirt
- target_types += /obj/effect/decal/cleanable/trail_holder
-
/mob/living/simple_animal/bot/cleanbot/proc/start_clean(obj/effect/decal/cleanable/target)
anchored = TRUE
icon_state = "cleanbot-c"
@@ -226,7 +216,6 @@
remote_disabled = !remote_disabled
if("blood")
blood =!blood
- get_targets()
if("ejectpai")
ejectpai()
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 95ef953291f..4b97371bc2f 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -38,7 +38,7 @@
var/last_found //There's a delay
var/declare_arrests = TRUE //When making an arrest, should it notify everyone wearing sechuds?
var/idcheck = FALSE //If true, arrest people with no IDs
- var/weaponscheck = TRUE //If true, arrest people for weapons if they don't have access
+ var/weapons_check = TRUE //If true, arrest people for weapons if they don't have access
var/check_records = TRUE //Does it check security records?
var/arrest_type = FALSE //If true, don't handcuff
var/projectile = /obj/item/projectile/beam/disabler //Holder for projectile type
@@ -111,7 +111,7 @@
/mob/living/simple_animal/bot/ed209/ui_data(mob/user)
var/list/data = ..()
data["check_id"] = idcheck
- data["check_weapons"] = weaponscheck
+ data["check_weapons"] = weapons_check
data["check_warrant"] = check_records
data["arrest_mode"] = arrest_type // detain or arrest
data["arrest_declare"] = declare_arrests // announce arrests on radio
@@ -139,7 +139,7 @@
if("disableremote")
remote_disabled = !remote_disabled
if("authweapon")
- weaponscheck = !weaponscheck
+ weapons_check = !weapons_check
if("authid")
idcheck = !idcheck
if("authwarrant")
@@ -185,7 +185,7 @@
/mob/living/simple_animal/bot/ed209/emag_act(mob/user)
..()
- if(emagged == 2)
+ if(emagged)
if(user)
to_chat(user, "You short out [src]'s target assessment circuits.")
oldtarget_name = user.name
@@ -416,7 +416,7 @@
/mob/living/simple_animal/bot/ed209/proc/set_weapon() //used to update the projectile type and firing sound
shoot_sound = 'sound/weapons/laser.ogg'
- if(emagged == 2)
+ if(emagged)
if(lasercolor)
projectile = /obj/item/projectile/beam/disabler
else
@@ -482,11 +482,11 @@
var/mob/toshoot = pick(targets)
if(toshoot)
targets-=toshoot
- if(prob(50) && emagged < 2)
- emagged = 2
+ if(prob(50) && !emagged && !locked)
+ emagged = TRUE
set_weapon()
shootAt(toshoot)
- emagged = 0
+ emagged = FALSE
set_weapon()
else
shootAt(toshoot)
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index cabab890caa..4aebd8a9061 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -17,19 +17,25 @@
req_access = list(ACCESS_CONSTRUCTION, ACCESS_ROBOTICS)
window_id = "autofloor"
window_name = "Automatic Station Floor Repairer v1.1"
-
- var/process_type //Determines what to do when process_scan() recieves a target. See process_scan() for details.
+ /// Determines what to do when process_scan() recieves a target. See process_scan() for details.
+ var/process_type
+ /// Tiles in inventory
var/amount = 10
- var/replacetiles = 0
- var/eattiles = 0
- var/maketiles = 0
- var/fixfloors = 0
- var/autotile = 0
- var/nag_on_empty = 1
- var/nagged = 0 //Prevents the Floorbot nagging more than once per refill.
+ /// Add tiles to existing floor
+ var/replace_tiles = FALSE
+ /// Add floor tiles to inventory
+ var/eat_tiles = FALSE
+ /// Convert metal into floor tiles (drops on floor)
+ var/make_tiles = FALSE
+ var/fix_floor = FALSE
+ /// Fix the floor and include a tile.
+ var/autotile = FALSE
+ var/nag_on_empty = TRUE
+ /// Prevents the Floorbot nagging more than once per refill.
+ var/nagged = FALSE
var/max_targets = 50
var/turf/target
- var/oldloc = null
+ var/oldloc
var/toolbox_color = ""
#define HULL_BREACH 1
@@ -37,6 +43,7 @@
#define AUTO_TILE 4
#define REPLACE_TILE 5
#define TILE_EMAG 6
+ #define MAX_AMOUNT 50 // Maximum tiles bot can have in storage
/mob/living/simple_animal/bot/floorbot/Initialize(mapload, new_toolbox_color)
. = ..()
@@ -75,10 +82,10 @@
/mob/living/simple_animal/bot/floorbot/ui_data(mob/user)
var/list/data = ..()
data["hullplating"] = autotile
- data["replace"] = replacetiles
- data["eat"] = eattiles
- data["make"] = maketiles
- data["fixfloor"] = fixfloors
+ data["replace"] = replace_tiles
+ data["eat"] = eat_tiles
+ data["make"] = make_tiles
+ data["fixfloor"] = fix_floor
data["nag_empty"] = nag_on_empty
data["magnet"] = anchored
data["tiles_amount"] = amount
@@ -109,15 +116,15 @@
if("autotile")
autotile = !autotile
if("replacetiles")
- replacetiles = !replacetiles
+ replace_tiles = !replace_tiles
if("eattiles")
- eattiles = !eattiles
+ eat_tiles = !eat_tiles
if("maketiles")
- maketiles = !maketiles
+ make_tiles = !make_tiles
+ if("fixfloors")
+ fix_floor = !fix_floor
if("nagonempty")
nag_on_empty = !nag_on_empty
- if("fixfloors")
- fixfloors = !fixfloors
if("anchored")
anchored = !anchored
if("ejectpai")
@@ -126,9 +133,9 @@
/mob/living/simple_animal/bot/floorbot/attackby(obj/item/W , mob/user, params)
if(istype(W, /obj/item/stack/tile/plasteel))
var/obj/item/stack/tile/plasteel/T = W
- if(amount >= 50)
+ if(amount >= MAX_AMOUNT)
return
- var/loaded = min(50-amount, T.amount)
+ var/loaded = min(MAX_AMOUNT - amount, T.amount)
T.use(loaded)
amount += loaded
if(loaded > 0)
@@ -147,45 +154,45 @@
to_chat(user, "[src] buzzes and beeps.")
/mob/living/simple_animal/bot/floorbot/handle_automated_action()
- if(!..())
+ . = ..()
+ if(!.)
return
- if(mode == BOT_REPAIRING)
+ if(mode == BOT_REPAIRING || mode == BOT_EAT_TILE || mode == BOT_MAKE_TILE)
return
- if(amount <= 0 && !target) //Out of tiles! We must refill!
- if(eattiles) //Configured to find and consume floortiles!
- target = scan(/obj/item/stack/tile/plasteel)
- process_type = null
-
- if(!target && maketiles) //We did not manage to find any floor tiles! Scan for metal stacks and make our own!
- target = scan(/obj/item/stack/sheet/metal)
- process_type = null
- return
- else
- if(nag_on_empty) //Floorbot is empty and cannot acquire more tiles, nag the engineers for more!
- nag()
-
if(prob(5))
audible_message("[src] makes an excited booping beeping sound!")
//Normal scanning procedure. We have tiles loaded, are not emagged.
- if(!target && emagged < 2 && amount > 0)
+ if(!target && !emagged && amount)
if(!target)
process_type = HULL_BREACH //Ensures the floorbot does not try to "fix" space areas or shuttle docking zones.
- target = scan(/turf/space)
+ target = scan(/turf/space, avoid_bot = /mob/living/simple_animal/bot/floorbot)
- if(!target && replacetiles) //Finds a floor without a tile and gives it one.
+ if(!target && replace_tiles) //Finds a floor without a tile and gives it one.
process_type = REPLACE_TILE //The target must be the floor and not a tile. The floor must not already have a floortile.
- target = scan(/turf/simulated/floor)
+ target = scan(/turf/simulated/floor, avoid_bot = /mob/living/simple_animal/bot/floorbot)
- if(!target && fixfloors) //Repairs damaged floors and tiles.
+ if(!target && fix_floor) //Repairs damaged floors and tiles.
process_type = FIX_TILE
- target = scan(/turf/simulated/floor)
+ target = scan(/turf/simulated/floor, avoid_bot = /mob/living/simple_animal/bot/floorbot)
- if(!target && emagged == 2) //We are emagged! Time to rip up the floors!
+ if(!target && emagged) //We are emagged! Time to rip up the floors!
process_type = TILE_EMAG
- target = scan(/turf/simulated/floor)
+ target = scan(/turf/simulated/floor, avoid_bot = /mob/living/simple_animal/bot/floorbot)
+
+ if(amount < MAX_AMOUNT && !target) //Out of tiles! We must refill!
+ if(eat_tiles) //Configured to find and consume floortiles!
+ target = scan(/obj/item/stack/tile/plasteel)
+ process_type = null
+
+ if(!target && make_tiles) //We did not manage to find any floor tiles! Scan for metal stacks and make our own!
+ target = scan(/obj/item/stack/sheet/metal)
+ process_type = null
+
+ if(!target && nag_on_empty) //Floorbot is empty and cannot acquire more tiles, nag the engineers for more!
+ nag()
if(!target)
@@ -199,13 +206,17 @@
if(target)
if(loc == target || loc == target.loc)
+
if(istype(target, /obj/item/stack/tile/plasteel))
start_eattile(target)
- else if(istype(target, /obj/item/stack/sheet/metal))
+
+ if(istype(target, /obj/item/stack/sheet/metal))
start_maketile(target)
- else if(isturf(target) && emagged < 2)
+
+ if(isturf(target) && !emagged)
repair(target)
- else if(emagged == 2 && isfloorturf(target))
+
+ if(emagged && isfloorturf(target))
var/turf/simulated/floor/F = target
anchored = TRUE
mode = BOT_REPAIRING
@@ -221,9 +232,9 @@
if(!length(path))
if(!isturf(target))
var/turf/TL = get_turf(target)
- path = get_path_to(src, TL, 30, id=access_card,simulated_only = 0)
+ path = get_path_to(src, TL, 30, id = access_card, simulated_only = 0)
else
- path = get_path_to(src, target, 30, id=access_card,simulated_only = 0)
+ path = get_path_to(src, target, 30, id = access_card, simulated_only = 0)
if(!bot_move(target))
add_to_ignore(target)
@@ -245,15 +256,11 @@
/mob/living/simple_animal/bot/floorbot/proc/nag() //Annoy everyone on the channel to refill us!
if(!nagged)
- speak("Requesting refill at [get_area(src)]!", radio_channel)
+ speak("Requesting refill [MAX_AMOUNT - amount] at [get_area(src)]!", radio_channel)
nagged = TRUE
/mob/living/simple_animal/bot/floorbot/proc/is_hull_breach(turf/t) //Ignore space tiles not considered part of a structure, also ignores shuttle docking areas.
- var/area/t_area = get_area(t)
- if(t_area && (t_area.name == "Space" || findtext(t_area.name, "huttle")))
- return 0
- else
- return 1
+ return !isspaceturf(get_area(t))
//Floorbots, having several functions, need sort out special conditions here.
/mob/living/simple_animal/bot/floorbot/process_scan(atom/scan_target)
@@ -310,33 +317,19 @@
visible_message("[src] begins repairing the floor.")
addtimer(CALLBACK(src, PROC_REF(make_bridge_plating), F), 5 SECONDS)
-/mob/living/simple_animal/bot/floorbot/proc/make_floor(turf/simulated/floor/F)
- if(mode != BOT_REPAIRING)
- return
-
- F.broken = FALSE
- F.burnt = FALSE
- F.ChangeTurf(/turf/simulated/floor/plasteel)
- mode = BOT_IDLE
- amount--
- update_icon(UPDATE_OVERLAYS)
- anchored = FALSE
- target = null
/mob/living/simple_animal/bot/floorbot/proc/make_bridge_plating(turf/target_turf)
var/turf/simulated/floor/F = target
if(mode != BOT_REPAIRING)
return
- if(replacetiles)
- F.break_tile_to_plating()
+ if(autotile || replace_tiles)
+ if(process_type != HULL_BREACH)
+ F.break_tile_to_plating()
target_turf.ChangeTurf(/turf/simulated/floor/plasteel)
else
- if(autotile) //Build the floor and include a tile.
- F.break_tile_to_plating()
- target_turf.ChangeTurf(/turf/simulated/floor/plasteel)
- else //Build a hull plating without a floor tile.
- target_turf.ChangeTurf(/turf/simulated/floor/plating)
+ target_turf.ChangeTurf(/turf/simulated/floor/plating)
+
mode = BOT_IDLE
amount--
update_icon(UPDATE_OVERLAYS)
@@ -347,7 +340,8 @@
if(!istype(T, /obj/item/stack/tile/plasteel))
return
visible_message("[src] begins to collect tiles.")
- mode = BOT_REPAIRING
+ mode = BOT_EAT_TILE
+ update_icon(UPDATE_OVERLAYS)
addtimer(CALLBACK(src, PROC_REF(do_eattile), T), 2 SECONDS)
/mob/living/simple_animal/bot/floorbot/proc/do_eattile(obj/item/stack/tile/plasteel/T)
@@ -355,8 +349,8 @@
target = null
mode = BOT_IDLE
return
- if(amount + T.amount > 50)
- var/i = 50 - amount
+ if((amount + T.amount) > MAX_AMOUNT)
+ var/i = MAX_AMOUNT - amount
amount += i
T.amount -= i
else
@@ -370,7 +364,8 @@
if(!istype(M, /obj/item/stack/sheet/metal))
return
visible_message("[src] begins to create tiles.")
- mode = BOT_REPAIRING
+ mode = BOT_MAKE_TILE
+ update_icon(UPDATE_OVERLAYS)
addtimer(CALLBACK(src, PROC_REF(do_maketile), M), 2 SECONDS)
/mob/living/simple_animal/bot/floorbot/proc/do_maketile(obj/item/stack/sheet/metal/M)
@@ -387,13 +382,14 @@
qdel(M)
target = null
mode = BOT_IDLE
+ update_icon(UPDATE_OVERLAYS)
/mob/living/simple_animal/bot/floorbot/update_icon_state()
return
/mob/living/simple_animal/bot/floorbot/update_overlays()
. = ..()
- if(mode == BOT_REPAIRING)
+ if(mode == BOT_REPAIRING || mode == BOT_EAT_TILE || mode == BOT_MAKE_TILE)
. += "floorbot_work"
else
. += "floorbot_[on ? "on" : "off"]"
@@ -431,3 +427,11 @@
start_maketile(A)
else
..()
+
+
+#undef HULL_BREACH
+#undef FIX_TILE
+#undef AUTO_TILE
+#undef REPLACE_TILE
+#undef TILE_EMAG
+#undef MAX_AMOUNT
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index aceb6fda38f..7328e2809bc 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -122,7 +122,7 @@
/mob/living/simple_animal/bot/honkbot/emag_act(mob/user)
..()
- if(emagged == 2)
+ if(emagged)
if(user)
to_chat(user, "You short out [src]'s target assessment circuits. It gives out an evil laugh!!")
oldtarget_name = user.name
@@ -140,7 +140,7 @@
return
if(iscarbon(A))
var/mob/living/carbon/C = A
- if(emagged <= 1)
+ if(!emagged)
honk_attack(A)
else
if(!C.IsStunned() || arrest_type)
@@ -159,13 +159,13 @@
..()
/mob/living/simple_animal/bot/honkbot/proc/bike_horn() //use bike_horn
- if(emagged <= 1)
+ if(!emagged)
if(!spam_flag)
playsound(src, honksound, 50, TRUE, -1)
spam_flag = TRUE //prevent spam
sensor_blink()
addtimer(CALLBACK(src, PROC_REF(spam_flag_false)), cooldowntimehorn)
- else if(emagged == 2) //emagged honkbots will spam short and memorable sounds.
+ else if(emagged) //emagged honkbots will spam short and memorable sounds.
if(!spam_flag)
playsound(src, "honkbot_e", 50, 0)
spam_flag = TRUE // prevent spam
@@ -195,7 +195,7 @@
C.Weaken(10 SECONDS)
if(client) //prevent spam from players..
spam_flag = TRUE
- if(emagged <= 1) //HONK once, then leave
+ if(!emagged) //HONK once, then leave
threatlevel -= 6
target = oldtarget_name
else // you really don't want to hit an emagged honkbot
@@ -279,12 +279,12 @@
if((C.name == oldtarget_name) && (world.time < last_found + 100))
continue
- if(threatlevel <= 3 && emagged <= 1)
+ if(threatlevel <= 3 && !emagged)
if(C in view(4, src)) //keep the range short for patrolling
if(!spam_flag)
bike_horn()
else if(threatlevel >= 4)
- if(!spam_flag || emagged > 1)
+ if(!spam_flag || emagged)
target = C
oldtarget_name = C.name
bike_horn()
@@ -295,7 +295,7 @@
break
else
continue
- else if(emagged > 1)
+ else if(emagged)
bike_horn() //just spam the shit outta this
/mob/living/simple_animal/bot/honkbot/explode() //doesn't drop cardboard nor its assembly, since its a very frail material.
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 03ca50c23d8..be4b74ab49e 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -101,7 +101,7 @@
Radio.syndiekey = new /obj/item/encryptionkey/syndicate
/mob/living/simple_animal/bot/medbot/syndicate/emagged
- emagged = 2
+ emagged = TRUE
declare_crit = FALSE
drops_parts = FALSE
@@ -258,7 +258,7 @@
/mob/living/simple_animal/bot/medbot/emag_act(mob/user)
..()
- if(emagged == 2)
+ if(emagged)
declare_crit = FALSE
if(user)
to_chat(user, "You short out [src]'s reagent synthesis circuits.")
@@ -412,7 +412,7 @@
if(H.dna.species && H.dna.species.reagent_tag == PROCESS_SYN)
return FALSE
- if(emagged == 2 || hijacked) //Everyone needs our medicine. (Our medicine is toxins)
+ if(emagged || hijacked) //Everyone needs our medicine. (Our medicine is toxins)
return TRUE
if(syndicate_aligned && !("syndicate" in C.faction))
@@ -461,7 +461,7 @@
var/reagent_id
var/beaker_injection //If and what kind of beaker reagent needs to be injected
- if(emagged == 2 || hijacked) //Emagged! Time to poison everybody.
+ if(emagged || hijacked) //Emagged! Time to poison everybody.
reagent_id = "pancuronium"
else
beaker_injection = assess_beaker_injection(C)
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index c43d3001e87..6a0b1072cd5 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -149,8 +149,8 @@
update_icon()
/mob/living/simple_animal/bot/mulebot/emag_act(mob/user)
- if(emagged < 1)
- emagged = 1
+ if(!emagged)
+ emagged = TRUE
if(!open)
locked = !locked
to_chat(user, "You [locked ? "lock" : "unlock"] [src]'s controls!")
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index e0a775dade6..8b0e88bc432 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -30,7 +30,7 @@
var/last_found //There's a delay
var/declare_arrests = TRUE //When making an arrest, should it notify everyone on the security channel?
var/idcheck = FALSE //If true, arrest people with no IDs
- var/weaponscheck = FALSE //If true, arrest people for weapons if they lack access
+ var/weapons_check = FALSE //If true, arrest people for weapons if they lack access
var/check_records = TRUE //Does it check security records?
var/arrest_type = FALSE //If true, don't handcuff
var/harmbaton = FALSE //If true, beat instead of stun
@@ -43,7 +43,7 @@
name = "Officer Beepsky"
desc = "It's Officer Beepsky! Powered by a potato and a shot of whiskey."
idcheck = FALSE
- weaponscheck = FALSE
+ weapons_check = FALSE
auto_patrol = TRUE
/mob/living/simple_animal/bot/secbot/beepsky/explode()
@@ -63,7 +63,7 @@
name = "Prison Ofitser"
desc = "It's Prison Ofitser! Powered by the tears and sweat of prisoners."
idcheck = FALSE
- weaponscheck = TRUE
+ weapons_check = TRUE
auto_patrol = TRUE
/mob/living/simple_animal/bot/secbot/buzzsky
@@ -74,7 +74,7 @@
declare_arrests = FALSE
arrest_type = TRUE
harmbaton = TRUE
- emagged = 2
+ emagged = TRUE
/mob/living/simple_animal/bot/secbot/armsky
name = "Sergeant-at-Armsky"
@@ -82,7 +82,7 @@
maxHealth = 100
idcheck = TRUE
arrest_type = TRUE
- weaponscheck = TRUE
+ weapons_check = TRUE
/mob/living/simple_animal/bot/secbot/Initialize(mapload)
. = ..()
@@ -126,7 +126,7 @@
/mob/living/simple_animal/bot/secbot/ui_data(mob/user)
var/list/data = ..()
data["check_id"] = idcheck
- data["check_weapons"] = weaponscheck
+ data["check_weapons"] = weapons_check
data["check_warrant"] = check_records
data["arrest_mode"] = arrest_type // detain or arrest
data["arrest_declare"] = declare_arrests // announce arrests on radio
@@ -154,7 +154,7 @@
if("disableremote")
remote_disabled = !remote_disabled
if("authweapon")
- weaponscheck = !weaponscheck
+ weapons_check = !weapons_check
if("authid")
idcheck = !idcheck
if("authwarrant")
@@ -187,7 +187,7 @@
/mob/living/simple_animal/bot/secbot/emag_act(mob/user)
..()
- if(emagged == 2)
+ if(emagged)
if(user)
to_chat(user, "You short out [src]'s target assessment circuits.")
oldtarget_name = user.name
diff --git a/code/modules/mob/living/simple_animal/bot/syndicate_bots.dm b/code/modules/mob/living/simple_animal/bot/syndicate_bots.dm
index f5835de4d24..8e35dbc1655 100644
--- a/code/modules/mob/living/simple_animal/bot/syndicate_bots.dm
+++ b/code/modules/mob/living/simple_animal/bot/syndicate_bots.dm
@@ -12,7 +12,7 @@
idcheck = TRUE
arrest_type = TRUE
auto_patrol = TRUE
- emagged = 2
+ emagged = TRUE
faction = list("syndicate")
shoot_sound = 'sound/weapons/wave.ogg'
anchored = TRUE