mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-24 12:37:26 +01:00
vg's likely superior bot code.
This commit is contained in:
@@ -34,11 +34,11 @@
|
||||
src.explode()
|
||||
|
||||
/obj/machinery/bot/proc/Emag(mob/user as mob)
|
||||
if(locked && user)
|
||||
if(locked)
|
||||
locked = 0
|
||||
emagged = 1
|
||||
user << "<span class='warning'>You bypass [src]'s controls.</span>"
|
||||
if((!locked && open) || !user) //Ion storm does not require unlocking for emagging
|
||||
if(!locked && open)
|
||||
emagged = 2
|
||||
|
||||
/obj/machinery/bot/examine()
|
||||
@@ -153,6 +153,7 @@
|
||||
|
||||
|
||||
/obj/machinery/bot/attack_ai(mob/user as mob)
|
||||
src.add_hiddenprint(user)
|
||||
src.attack_hand(user)
|
||||
|
||||
/******************************************************************/
|
||||
|
||||
@@ -55,8 +55,6 @@
|
||||
var/datum/job/janitor/J = new/datum/job/janitor
|
||||
src.botcard.access = J.get_access()
|
||||
|
||||
src.locked = 0 // Start unlocked so roboticist can set them to patrol.
|
||||
|
||||
if(radio_controller)
|
||||
radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS)
|
||||
|
||||
@@ -68,6 +66,8 @@
|
||||
|
||||
/obj/machinery/bot/cleanbot/turn_off()
|
||||
..()
|
||||
if(!isnull(src.target))
|
||||
target.targeted_by = null
|
||||
src.target = null
|
||||
src.oldtarget = null
|
||||
src.oldloc = null
|
||||
@@ -155,7 +155,7 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
|
||||
|
||||
/obj/machinery/bot/cleanbot/Emag(mob/user as mob)
|
||||
..()
|
||||
if((!locked && open) || !user)
|
||||
if(open && !locked)
|
||||
if(user) user << "<span class='notice'>The [src] buzzes and beeps.</span>"
|
||||
src.oddbutton = 1
|
||||
src.screwloose = 1
|
||||
@@ -167,7 +167,6 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
|
||||
return
|
||||
if(src.cleaning)
|
||||
return
|
||||
var/list/cleanbottargets = list()
|
||||
|
||||
if(!src.screwloose && !src.oddbutton && prob(5))
|
||||
visible_message("[src] makes an excited beeping booping sound!")
|
||||
@@ -196,9 +195,10 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
|
||||
if(!src.target || src.target == null)
|
||||
for (var/obj/effect/decal/cleanable/D in view(7,src))
|
||||
for(var/T in src.target_types)
|
||||
if(!(D in cleanbottargets) && (D.type == T || D.parent_type == T) && D != src.oldtarget)
|
||||
src.oldtarget = D
|
||||
src.target = D
|
||||
if(isnull(D.targeted_by) && (D.type == T || D.parent_type == T) && D != src.oldtarget) // If the mess isn't targeted
|
||||
src.oldtarget = D // or if it is but the bot is gone.
|
||||
src.target = D // and it's stuff we clean? Clean it.
|
||||
D.targeted_by = src // Claim the mess we are targeting.
|
||||
return
|
||||
|
||||
if(!src.target || src.target == null)
|
||||
@@ -232,6 +232,8 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
|
||||
|
||||
return
|
||||
|
||||
if(!path)
|
||||
path = new()
|
||||
if(target && path.len == 0)
|
||||
spawn(0)
|
||||
if(!src || !target) return
|
||||
@@ -239,6 +241,7 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
|
||||
if (!path) path = list()
|
||||
if(src.path.len == 0)
|
||||
src.oldtarget = src.target
|
||||
target.targeted_by = null
|
||||
src.target = null
|
||||
return
|
||||
if(src.path.len > 0 && src.target && (src.target != null))
|
||||
@@ -297,36 +300,36 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
|
||||
|
||||
target_types += /obj/effect/decal/cleanable/oil
|
||||
target_types += /obj/effect/decal/cleanable/vomit
|
||||
target_types += /obj/effect/decal/cleanable/poop
|
||||
target_types += /obj/effect/decal/cleanable/robot_debris
|
||||
target_types += /obj/effect/decal/cleanable/crayon
|
||||
target_types += /obj/effect/decal/cleanable/liquid_fuel
|
||||
target_types += /obj/effect/decal/cleanable/poop
|
||||
target_types += /obj/effect/decal/cleanable/mucus
|
||||
|
||||
|
||||
if(src.blood)
|
||||
target_types += /obj/effect/decal/cleanable/xenoblood
|
||||
target_types += /obj/effect/decal/cleanable/xenoblood/xgibs
|
||||
target_types += /obj/effect/decal/cleanable/blood/
|
||||
target_types += /obj/effect/decal/cleanable/blood/green
|
||||
target_types += /obj/effect/decal/cleanable/blood/tracks
|
||||
target_types += /obj/effect/decal/cleanable/blood/gibs
|
||||
target_types += /obj/effect/decal/cleanable/blood/gibs/
|
||||
target_types += /obj/effect/decal/cleanable/dirt
|
||||
|
||||
/obj/machinery/bot/cleanbot/proc/clean(var/obj/effect/decal/cleanable/target)
|
||||
anchored = 1
|
||||
icon_state = "cleanbot-c"
|
||||
src.anchored = 1
|
||||
src.icon_state = "cleanbot-c"
|
||||
visible_message("\red [src] begins to clean up the [target]")
|
||||
cleaning = 1
|
||||
src.cleaning = 1
|
||||
var/cleantime = 50
|
||||
if(istype(target,/obj/effect/decal/cleanable/dirt)) // Clean Dirt much faster
|
||||
cleantime = 10
|
||||
spawn(cleantime)
|
||||
if(istype(loc,/turf/simulated))
|
||||
var/turf/simulated/f = loc
|
||||
f.dirt = 0
|
||||
cleaning = 0
|
||||
src.cleaning = 0
|
||||
del(target)
|
||||
icon_state = "cleanbot[on]"
|
||||
anchored = 0
|
||||
target = null
|
||||
src.icon_state = "cleanbot[src.on]"
|
||||
src.anchored = 0
|
||||
src.target = null
|
||||
|
||||
/obj/machinery/bot/cleanbot/explode()
|
||||
src.on = 0
|
||||
|
||||
@@ -204,7 +204,7 @@ Auto Patrol: []"},
|
||||
|
||||
/obj/machinery/bot/ed209/Emag(mob/user as mob)
|
||||
..()
|
||||
if((!locked && open) || !user)
|
||||
if(open && !locked)
|
||||
if(user) user << "<span class='warning'>You short out [src]'s target assessment circuits.</span>"
|
||||
spawn(0)
|
||||
for(var/mob/O in hearers(src, null))
|
||||
@@ -363,7 +363,8 @@ Auto Patrol: []"},
|
||||
|
||||
|
||||
if(SECBOT_START_PATROL) // start a patrol
|
||||
|
||||
if(!path || !istype(path))
|
||||
path = list()
|
||||
if(path.len > 0 && patrol_target) // have a valid path, so just resume
|
||||
mode = SECBOT_PATROL
|
||||
return
|
||||
@@ -406,7 +407,7 @@ Auto Patrol: []"},
|
||||
if(loc == patrol_target) // reached target
|
||||
at_patrol_target()
|
||||
return
|
||||
|
||||
if(!path || !istype(path)) path = list()
|
||||
else if(path.len > 0 && patrol_target) // valid path
|
||||
|
||||
var/turf/next = path[1]
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
// The behavior panel can be unlocked with hydroponics access and be modified to disable certain behaviors
|
||||
// By default, it will ignore weeds and mushrooms, but can be set to tend to these types of plants as well.
|
||||
|
||||
//Seems a little stupid handling multiple Go direction X,Y,Z to do Job F,G,H if it's in multiple directions so I'd reccomend only enabling 1 water/fertilize/weed task at a time. - SarahJohnson
|
||||
|
||||
|
||||
#define FARMBOT_MODE_WATER 1
|
||||
#define FARMBOT_MODE_FERTILIZE 2
|
||||
@@ -100,7 +102,7 @@
|
||||
if (.)
|
||||
return
|
||||
var/dat
|
||||
dat += "<TT><B>Automatic Hyrdoponic Assisting Unit v1.0</B></TT><BR><BR>"
|
||||
dat += "<TT><B>Automatic Hydroponic Assisting Unit v1.0</B></TT><BR><BR>"
|
||||
dat += "Status: <A href='?src=\ref[src];power=1'>[src.on ? "On" : "Off"]</A><BR>"
|
||||
|
||||
dat += "Water Tank: "
|
||||
@@ -350,9 +352,8 @@
|
||||
mode = 0
|
||||
frustration = 0
|
||||
src.path = new()
|
||||
if(src.path)
|
||||
if(src.target && (src.path.len) && (get_dist(src.target,src.path[src.path.len]) > 2))
|
||||
src.path = new()
|
||||
if(src.target && (src.path.len) && (get_dist(src.target,src.path[src.path.len]) > 2))
|
||||
src.path = new()
|
||||
if(src.target && src.path.len == 0 && (get_dist(src,src.target) > 1))
|
||||
spawn(0)
|
||||
var/turf/dest = get_step_towards(target,src) //Can't pathfind to a tray, as it is dense, so pathfind to the spot next to the tray
|
||||
|
||||
@@ -25,6 +25,9 @@
|
||||
flags = TABLEPASS
|
||||
var/created_name = "Floorbot"
|
||||
|
||||
// Tell other floorbots what we're fucking with so two floorbots don't dick with the same tile.
|
||||
var/global/list/floorbot_targets=list()
|
||||
|
||||
//Floorbot
|
||||
/obj/machinery/bot/floorbot
|
||||
name = "Floorbot"
|
||||
@@ -37,6 +40,13 @@
|
||||
health = 25
|
||||
maxhealth = 25
|
||||
//weight = 1.0E7
|
||||
var/mode = 0
|
||||
#define FLOORBOT_IDLE 0 // idle
|
||||
#define FLOORBOT_FIXING_SHIT 1
|
||||
#define FLOORBOT_START_PATROL 2 // start patrol
|
||||
#define FLOORBOT_PATROL 3 // patrolling
|
||||
|
||||
var/auto_patrol = 0 // set to make bot automatically patrol
|
||||
var/amount = 10
|
||||
var/repairing = 0
|
||||
var/improvefloors = 0
|
||||
@@ -48,6 +58,20 @@
|
||||
req_access = list(access_construction)
|
||||
var/path[] = new()
|
||||
var/targetdirection
|
||||
var/beacon_freq = 1445 // navigation beacon frequency
|
||||
|
||||
|
||||
var/turf/patrol_target // this is turf to navigate to (location of beacon)
|
||||
var/new_destination // pending new destination (waiting for beacon response)
|
||||
var/destination // destination description tag
|
||||
var/next_destination // the next destination in the patrol route
|
||||
var/list/patpath = new // list of path turfs
|
||||
|
||||
var/blockcount = 0 //number of times retried a blocked path
|
||||
var/awaiting_beacon = 0 // count of pticks awaiting a beacon response
|
||||
|
||||
var/nearest_beacon // the nearest beacon's tag
|
||||
var/turf/nearest_beacon_loc // the nearest beacon's location
|
||||
|
||||
|
||||
/obj/machinery/bot/floorbot/New()
|
||||
@@ -61,12 +85,16 @@
|
||||
|
||||
/obj/machinery/bot/floorbot/turn_off()
|
||||
..()
|
||||
if(!isnull(src.target))
|
||||
floorbot_targets -= src.target
|
||||
src.target = null
|
||||
src.oldtarget = null
|
||||
src.oldloc = null
|
||||
src.updateicon()
|
||||
src.path = new()
|
||||
src.patpath = new()
|
||||
src.updateUsrDialog()
|
||||
src.mode=FLOORBOT_IDLE
|
||||
|
||||
/obj/machinery/bot/floorbot/attack_hand(mob/user as mob)
|
||||
. = ..()
|
||||
@@ -85,19 +113,18 @@
|
||||
if(!src.locked || issilicon(user))
|
||||
dat += "Improves floors: <A href='?src=\ref[src];operation=improve'>[src.improvefloors ? "Yes" : "No"]</A><BR>"
|
||||
dat += "Finds tiles: <A href='?src=\ref[src];operation=tiles'>[src.eattiles ? "Yes" : "No"]</A><BR>"
|
||||
dat += "Make singles pieces of metal into tiles when empty: <A href='?src=\ref[src];operation=make'>[src.maketiles ? "Yes" : "No"]</A><BR>"
|
||||
var/bmode
|
||||
if (src.targetdirection)
|
||||
bmode = dir2text(src.targetdirection)
|
||||
else
|
||||
bmode = "Disabled"
|
||||
dat += "<BR><BR>Bridge Mode : <A href='?src=\ref[src];operation=bridgemode'>[bmode]</A><BR>"
|
||||
dat += "Make single pieces of metal into tiles when empty: <A href='?src=\ref[src];operation=make'>[src.maketiles ? "Yes" : "No"]</A><BR>"
|
||||
|
||||
user << browse("<HEAD><TITLE>Repairbot v1.0 controls</TITLE></HEAD>[dat]", "window=autorepair")
|
||||
onclose(user, "autorepair")
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/speak(var/message)
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\"",2)
|
||||
return
|
||||
|
||||
/obj/machinery/bot/floorbot/attackby(var/obj/item/W , mob/user as mob)
|
||||
if(istype(W, /obj/item/stack/tile/plasteel))
|
||||
var/obj/item/stack/tile/plasteel/T = W
|
||||
@@ -125,7 +152,7 @@
|
||||
|
||||
/obj/machinery/bot/floorbot/Emag(mob/user as mob)
|
||||
..()
|
||||
if((!locked && open) || !user)
|
||||
if(open && !locked)
|
||||
if(user) user << "<span class='notice'>The [src] buzzes and beeps.</span>"
|
||||
|
||||
/obj/machinery/bot/floorbot/Topic(href, href_list)
|
||||
@@ -148,21 +175,38 @@
|
||||
if("make")
|
||||
src.maketiles = !src.maketiles
|
||||
src.updateUsrDialog()
|
||||
if("bridgemode")
|
||||
switch(src.targetdirection)
|
||||
if(null)
|
||||
targetdirection = 1
|
||||
if(1)
|
||||
targetdirection = 2
|
||||
if(2)
|
||||
targetdirection = 4
|
||||
if(4)
|
||||
targetdirection = 8
|
||||
if(8)
|
||||
targetdirection = null
|
||||
else
|
||||
targetdirection = null
|
||||
src.updateUsrDialog()
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/is_obj_valid_target(var/atom/T,var/list/floorbottargets)
|
||||
if(T in floorbottargets)
|
||||
return 0
|
||||
if(T == src.oldtarget)
|
||||
return 0
|
||||
if(istype(T.loc, /turf/simulated/wall))
|
||||
return 0
|
||||
if(!T.loc.Enter(src))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/hunt_for_tiles(var/list/shit_in_view, var/list/floorbottargets)
|
||||
for(var/obj/item/stack/tile/plasteel/T in shit_in_view)
|
||||
if(!(T in floorbot_targets) && src.is_obj_valid_target(T,floorbottargets))
|
||||
src.oldtarget = T
|
||||
src.target = T
|
||||
floorbot_targets +=T
|
||||
mode=FLOORBOT_FIXING_SHIT
|
||||
return
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/hunt_for_metal(var/list/shit_in_view, var/list/floorbottargets)
|
||||
for(var/obj/item/stack/sheet/metal/M in shit_in_view)
|
||||
if(!(M in floorbot_targets) && src.is_obj_valid_target(M) && M.amount == 1)
|
||||
src.oldtarget = M
|
||||
src.target = M
|
||||
floorbot_targets += M
|
||||
mode=FLOORBOT_FIXING_SHIT
|
||||
return
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/have_target()
|
||||
return (src.target != null)
|
||||
|
||||
/obj/machinery/bot/floorbot/process()
|
||||
//set background = 1
|
||||
@@ -171,73 +215,49 @@
|
||||
return
|
||||
if(src.repairing)
|
||||
return
|
||||
var/list/floorbottargets = list()
|
||||
if(src.amount <= 0 && ((src.target == null) || !src.target))
|
||||
if(src.eattiles)
|
||||
for(var/obj/item/stack/tile/plasteel/T in view(7, src))
|
||||
if(T != src.oldtarget && !(target in floorbottargets))
|
||||
src.oldtarget = T
|
||||
src.target = T
|
||||
break
|
||||
if(src.target == null || !src.target)
|
||||
if(src.maketiles)
|
||||
if(src.target == null || !src.target)
|
||||
for(var/obj/item/stack/sheet/metal/M in view(7, src))
|
||||
if(!(M in floorbottargets) && M != src.oldtarget && M.amount == 1 && !(istype(M.loc, /turf/simulated/wall)))
|
||||
src.oldtarget = M
|
||||
src.target = M
|
||||
break
|
||||
else
|
||||
|
||||
switch(mode)
|
||||
if(FLOORBOT_IDLE) // idle
|
||||
walk_to(src,0)
|
||||
if(checkforwork()) // see if any criminals are in range
|
||||
return
|
||||
if(!mode && auto_patrol) // still idle, and set to patrol
|
||||
mode = FLOORBOT_START_PATROL // switch to patrol mode
|
||||
if(FLOORBOT_FIXING_SHIT)
|
||||
src.fix_shit()
|
||||
return
|
||||
if(prob(5))
|
||||
visible_message("[src] makes an excited booping beeping sound!")
|
||||
if(FLOORBOT_START_PATROL) // start a patrol
|
||||
if(patpath.len > 0 && patrol_target) // have a valid path, so just resume
|
||||
mode = FLOORBOT_PATROL
|
||||
return
|
||||
|
||||
if((!src.target || src.target == null) && emagged < 2)
|
||||
if(targetdirection != null)
|
||||
/*
|
||||
for (var/turf/space/D in view(7,src))
|
||||
if(!(D in floorbottargets) && D != src.oldtarget) // Added for bridging mode -- TLE
|
||||
if(get_dir(src, D) == targetdirection)
|
||||
src.oldtarget = D
|
||||
src.target = D
|
||||
break
|
||||
*/
|
||||
var/turf/T = get_step(src, targetdirection)
|
||||
if(istype(T, /turf/space))
|
||||
src.oldtarget = T
|
||||
src.target = T
|
||||
if(!src.target || src.target == null)
|
||||
for (var/turf/space/D in view(7,src))
|
||||
if(!(D in floorbottargets) && D != src.oldtarget && (D.loc.name != "Space"))
|
||||
src.oldtarget = D
|
||||
src.target = D
|
||||
break
|
||||
if((!src.target || src.target == null ) && src.improvefloors)
|
||||
for (var/turf/simulated/floor/F in view(7,src))
|
||||
if(!(F in floorbottargets) && F != src.oldtarget && F.icon_state == "Floor1" && !(istype(F, /turf/simulated/floor/plating)))
|
||||
src.oldtarget = F
|
||||
src.target = F
|
||||
break
|
||||
if((!src.target || src.target == null) && src.eattiles)
|
||||
for(var/obj/item/stack/tile/plasteel/T in view(7, src))
|
||||
if(!(T in floorbottargets) && T != src.oldtarget)
|
||||
src.oldtarget = T
|
||||
src.target = T
|
||||
break
|
||||
else if(patrol_target) // has patrol target already
|
||||
spawn(0)
|
||||
calc_path() // so just find a route to it
|
||||
if(patpath.len == 0)
|
||||
patrol_target = 0
|
||||
return
|
||||
mode = FLOORBOT_PATROL
|
||||
|
||||
if((!src.target || src.target == null) && emagged == 2)
|
||||
if(!src.target || src.target == null)
|
||||
for (var/turf/simulated/floor/D in view(7,src))
|
||||
if(!(D in floorbottargets) && D != src.oldtarget && D.floor_tile)
|
||||
src.oldtarget = D
|
||||
src.target = D
|
||||
break
|
||||
|
||||
if(!src.target || src.target == null)
|
||||
else // no patrol target, so need a new one
|
||||
find_patrol_target()
|
||||
speak("That's done, what's next?")
|
||||
|
||||
|
||||
if(FLOORBOT_PATROL) // patrol mode
|
||||
patrol_step()
|
||||
spawn(5)
|
||||
if(mode == FLOORBOT_PATROL)
|
||||
patrol_step()
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/fix_shit()
|
||||
if(!src.have_target())
|
||||
if(src.loc != src.oldloc)
|
||||
src.oldtarget = null
|
||||
return
|
||||
|
||||
return 0
|
||||
if(!src.path)
|
||||
src.path = new()
|
||||
if(src.target && (src.target != null) && src.path.len == 0)
|
||||
spawn(0)
|
||||
if(!istype(src.target, /turf/))
|
||||
@@ -247,8 +267,9 @@
|
||||
if (!src.path) src.path = list()
|
||||
if(src.path.len == 0)
|
||||
src.oldtarget = src.target
|
||||
floorbot_targets -= src.target
|
||||
src.target = null
|
||||
return
|
||||
return 1
|
||||
if(src.path.len > 0 && src.target && (src.target != null))
|
||||
step_to(src, src.path[1])
|
||||
src.path -= src.path[1]
|
||||
@@ -259,11 +280,26 @@
|
||||
if(src.loc == src.target || src.loc == src.target.loc)
|
||||
if(istype(src.target, /obj/item/stack/tile/plasteel))
|
||||
src.eattile(src.target)
|
||||
mode=FLOORBOT_IDLE
|
||||
else if(istype(src.target, /obj/item/stack/sheet/metal))
|
||||
src.maketile(src.target)
|
||||
else if(istype(src.target, /turf/) && emagged < 2)
|
||||
mode=FLOORBOT_IDLE
|
||||
//else if(istype(src.target, /turf/) && emagged < 2)
|
||||
else if((src.target.is_plating() || istype(src.target,/turf/space/)) && emagged < 2)
|
||||
repair(src.target)
|
||||
else if(emagged == 2 && istype(src.target,/turf/simulated/floor))
|
||||
mode=FLOORBOT_IDLE
|
||||
else if(src.target.is_plasteel_floor() && (src.target:broken || src.target:burnt) && emagged < 2)
|
||||
var/turf/simulated/floor/F = src.target
|
||||
src.anchored = 1
|
||||
src.repairing = 1
|
||||
F.break_tile_to_plating()
|
||||
spawn(50)
|
||||
src.anchored = 0
|
||||
src.repairing = 0
|
||||
src.target = null
|
||||
floorbot_targets -= src.target
|
||||
mode=FLOORBOT_IDLE
|
||||
else if(src.target.is_plating() && emagged == 2)
|
||||
var/turf/simulated/floor/F = src.target
|
||||
src.anchored = 1
|
||||
src.repairing = 1
|
||||
@@ -277,11 +313,90 @@
|
||||
src.anchored = 0
|
||||
src.repairing = 0
|
||||
src.target = null
|
||||
floorbot_targets -= src.target
|
||||
mode=FLOORBOT_IDLE
|
||||
src.path = new()
|
||||
return
|
||||
mode=FLOORBOT_IDLE
|
||||
return 1
|
||||
|
||||
src.oldloc = src.loc
|
||||
return 1
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/checkforwork()
|
||||
if(src.have_target())
|
||||
return 0
|
||||
var/list/floorbottargets = list()
|
||||
|
||||
// Needed because we used to look this up 15 goddamn times per process. - Nexypoo
|
||||
var/list/shitICanSee = view(7, src)
|
||||
|
||||
if(src.amount <= 0 && !src.have_target())
|
||||
if(src.eattiles)
|
||||
if(src.hunt_for_tiles(shitICanSee, floorbottargets))
|
||||
return 1
|
||||
if(src.maketiles && !src.have_target())
|
||||
if(src.hunt_for_metal(shitICanSee, floorbottargets))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
if(prob(5))
|
||||
visible_message("[src] makes an excited booping beeping sound!")
|
||||
|
||||
if(!src.have_target() && emagged < 2)
|
||||
if(targetdirection != null)
|
||||
/*
|
||||
for (var/turf/space/D in shitICanSee)
|
||||
if(!(D in floorbottargets) && D != src.oldtarget) // Added for bridging mode -- TLE
|
||||
if(get_dir(src, D) == targetdirection)
|
||||
src.oldtarget = D
|
||||
src.target = D
|
||||
break
|
||||
*/
|
||||
var/turf/T = get_step(src, targetdirection)
|
||||
if(istype(T, /turf/space) && !(T in floorbot_targets))
|
||||
src.oldtarget = T
|
||||
src.target = T
|
||||
floorbot_targets+=T
|
||||
mode=FLOORBOT_FIXING_SHIT
|
||||
return 1
|
||||
if(!src.have_target())
|
||||
for (var/turf/space/D in shitICanSee)
|
||||
if(!(D in floorbottargets) && D != src.oldtarget && (D.loc.name != "Space") && !(D in floorbot_targets))
|
||||
src.oldtarget = D
|
||||
src.target = D
|
||||
floorbot_targets += D
|
||||
mode=FLOORBOT_FIXING_SHIT
|
||||
return 1
|
||||
if((!src.target || src.target == null ) && src.improvefloors)
|
||||
for (var/turf/simulated/floor/F in shitICanSee)
|
||||
// So, what the dick are we doing, here?
|
||||
// ORIGINAL: if(!(F in floorbottargets) && F != src.oldtarget && F.icon_state == "Floor1" && !(istype(F, /turf/simulated/floor/plating)))
|
||||
// Using new erro flags:
|
||||
if(!(F in floorbottargets) && F != src.oldtarget && F.is_plating() && !(istype(F, /turf/simulated/wall)) && !(F in floorbot_targets))
|
||||
if(!F.broken && !F.burnt)
|
||||
src.oldtarget = F
|
||||
src.target = F
|
||||
floorbot_targets += F
|
||||
mode=FLOORBOT_FIXING_SHIT
|
||||
return 1
|
||||
if(!(F in floorbottargets) && !(F in floorbot_targets) && F != src.oldtarget && F.is_plasteel_floor() && (F.broken||F.burnt))
|
||||
src.oldtarget = F
|
||||
src.target = F
|
||||
floorbot_targets += F
|
||||
mode=FLOORBOT_FIXING_SHIT
|
||||
return 1
|
||||
|
||||
if(!src.have_target() && emagged == 2)
|
||||
for (var/turf/simulated/floor/D in shitICanSee)
|
||||
//if(!(D in floorbottargets) && D != src.oldtarget && D.floor_tile)
|
||||
if(!(D in floorbottargets) && D != src.oldtarget && D.is_plasteel_floor() && !(D in floorbot_targets))
|
||||
src.oldtarget = D
|
||||
src.target = D
|
||||
floorbot_targets += D
|
||||
mode=FLOORBOT_FIXING_SHIT
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/repair(var/turf/target)
|
||||
if(istype(target, /turf/space/))
|
||||
@@ -303,17 +418,33 @@
|
||||
src.amount -= 1
|
||||
src.updateicon()
|
||||
src.anchored = 0
|
||||
floorbot_targets -= src.target
|
||||
src.target = null
|
||||
else
|
||||
visible_message("\red [src] begins to improve the floor.")
|
||||
src.repairing = 1
|
||||
spawn(50)
|
||||
src.loc.icon_state = "floor"
|
||||
src.repairing = 0
|
||||
src.amount -= 1
|
||||
src.updateicon()
|
||||
src.anchored = 0
|
||||
src.target = null
|
||||
var/turf/simulated/floor/F = src.loc
|
||||
if(!F.broken && !F.burnt)
|
||||
visible_message("\red [src] begins to improve the floor.")
|
||||
src.repairing = 1
|
||||
spawn(50)
|
||||
F.make_plasteel_floor()
|
||||
src.repairing = 0
|
||||
src.amount -= 1
|
||||
src.updateicon()
|
||||
src.anchored = 0
|
||||
floorbot_targets -= src.target
|
||||
src.target = null
|
||||
else
|
||||
if(F.is_plating())
|
||||
visible_message("\red [src] begins to fix dents in the floor.")
|
||||
src.repairing = 1
|
||||
spawn(20)
|
||||
src.repairing = 0
|
||||
// Cheap, and does the job.
|
||||
F.icon_state = "plating"
|
||||
F.burnt = 0
|
||||
F.broken = 0
|
||||
floorbot_targets -= src.target
|
||||
src.target = null
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/eattile(var/obj/item/stack/tile/plasteel/T)
|
||||
if(!istype(T, /obj/item/stack/tile/plasteel))
|
||||
@@ -333,6 +464,7 @@
|
||||
src.amount += T.amount
|
||||
del(T)
|
||||
src.updateicon()
|
||||
floorbot_targets -= src.target
|
||||
src.target = null
|
||||
src.repairing = 0
|
||||
|
||||
@@ -351,7 +483,11 @@
|
||||
var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel
|
||||
T.amount = 4
|
||||
T.loc = M.loc
|
||||
del(M)
|
||||
if(M.amount==1)
|
||||
del(M)
|
||||
else
|
||||
M.amount--
|
||||
floorbot_targets -= src.target
|
||||
src.target = null
|
||||
src.repairing = 0
|
||||
|
||||
@@ -361,6 +497,174 @@
|
||||
else
|
||||
src.icon_state = "floorbot[src.on]e"
|
||||
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/calc_path(var/turf/avoid = null)
|
||||
src.path = AStar(src.loc, patrol_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id=botcard, exclude=avoid)
|
||||
src.path = reverselist(src.path)
|
||||
|
||||
// perform a single patrol step
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/patrol_step()
|
||||
|
||||
if(loc == patrol_target) // reached target
|
||||
at_patrol_target()
|
||||
return
|
||||
|
||||
else if(patpath.len > 0 && patrol_target) // valid path
|
||||
|
||||
var/turf/next = patpath[1]
|
||||
if(next == loc)
|
||||
patpath -= next
|
||||
return
|
||||
|
||||
|
||||
if(istype( next, /turf/simulated))
|
||||
|
||||
var/moved = step_towards(src, next) // attempt to move
|
||||
if(moved) // successful move
|
||||
blockcount = 0
|
||||
patpath -= loc
|
||||
|
||||
checkforwork()
|
||||
else // failed to move
|
||||
|
||||
blockcount++
|
||||
|
||||
if(blockcount > 5) // attempt 5 times before recomputing
|
||||
// find new path excluding blocked turf
|
||||
|
||||
spawn(2)
|
||||
calc_path(next)
|
||||
if(patpath.len == 0)
|
||||
find_patrol_target()
|
||||
else
|
||||
blockcount = 0
|
||||
|
||||
return
|
||||
|
||||
return
|
||||
|
||||
else // not a valid turf
|
||||
mode = FLOORBOT_IDLE
|
||||
return
|
||||
|
||||
else // no path, so calculate new one
|
||||
mode = FLOORBOT_START_PATROL
|
||||
|
||||
|
||||
// finds a new patrol target
|
||||
/obj/machinery/bot/floorbot/proc/find_patrol_target()
|
||||
// send_status()
|
||||
if(awaiting_beacon) // awaiting beacon response
|
||||
awaiting_beacon++
|
||||
if(awaiting_beacon > 5) // wait 5 secs for beacon response
|
||||
find_nearest_beacon() // then go to nearest instead
|
||||
return
|
||||
|
||||
if(next_destination)
|
||||
set_destination(next_destination)
|
||||
else
|
||||
find_nearest_beacon()
|
||||
return
|
||||
|
||||
|
||||
// finds the nearest beacon to self
|
||||
// signals all beacons matching the patrol code
|
||||
/obj/machinery/bot/floorbot/proc/find_nearest_beacon()
|
||||
nearest_beacon = null
|
||||
new_destination = "__nearest__"
|
||||
post_signal(beacon_freq, "findbeacon", "patrol")
|
||||
awaiting_beacon = 1
|
||||
spawn(10)
|
||||
awaiting_beacon = 0
|
||||
if(nearest_beacon)
|
||||
set_destination(nearest_beacon)
|
||||
else
|
||||
auto_patrol = 0
|
||||
mode = FLOORBOT_IDLE
|
||||
speak("Disengaging patrol mode.")
|
||||
//send_status()
|
||||
|
||||
|
||||
/obj/machinery/bot/floorbot/proc/at_patrol_target()
|
||||
find_patrol_target()
|
||||
return
|
||||
|
||||
/obj/machinery/bot/floorbot/Bump(M as mob|obj) //Leave no door unopened!
|
||||
if((istype(M, /obj/machinery/door)) && (!isnull(src.botcard)))
|
||||
var/obj/machinery/door/D = M
|
||||
if(!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard))
|
||||
D.open()
|
||||
return
|
||||
|
||||
/obj/machinery/bot/floorbot/receive_signal(datum/signal/signal)
|
||||
//log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/bot/secbot/receive_signal([signal.debug_print()])")
|
||||
if(!on)
|
||||
return
|
||||
|
||||
var/recv = signal.data["command"]
|
||||
|
||||
// receive response from beacon
|
||||
recv = signal.data["beacon"]
|
||||
var/valid = signal.data["patrol"]
|
||||
if(!recv || !valid)
|
||||
return
|
||||
|
||||
if(recv == new_destination) // if the recvd beacon location matches the set destination
|
||||
// the we will navigate there
|
||||
destination = new_destination
|
||||
patrol_target = signal.source.loc
|
||||
next_destination = signal.data["next_patrol"]
|
||||
awaiting_beacon = 0
|
||||
|
||||
// if looking for nearest beacon
|
||||
else if(new_destination == "__nearest__")
|
||||
var/dist = get_dist(src,signal.source.loc)
|
||||
if(nearest_beacon)
|
||||
|
||||
// note we ignore the beacon we are located at
|
||||
if(dist>1 && dist<get_dist(src,nearest_beacon_loc))
|
||||
nearest_beacon = recv
|
||||
nearest_beacon_loc = signal.source.loc
|
||||
return
|
||||
else
|
||||
return
|
||||
else if(dist > 1)
|
||||
nearest_beacon = recv
|
||||
nearest_beacon_loc = signal.source.loc
|
||||
return
|
||||
|
||||
// send a radio signal with a single data key/value pair
|
||||
/obj/machinery/bot/floorbot/proc/post_signal(var/freq, var/key, var/value)
|
||||
post_signal_multiple(freq, list("[key]" = value) )
|
||||
|
||||
// send a radio signal with multiple data key/values
|
||||
/obj/machinery/bot/floorbot/proc/post_signal_multiple(var/freq, var/list/keyval)
|
||||
|
||||
var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq)
|
||||
|
||||
if(!frequency) return
|
||||
|
||||
var/datum/signal/signal = new()
|
||||
signal.source = src
|
||||
signal.transmission_method = 1
|
||||
//for(var/key in keyval)
|
||||
// signal.data[key] = keyval[key]
|
||||
signal.data = keyval
|
||||
//world << "sent [key],[keyval[key]] on [freq]"
|
||||
if(signal.data["findbeacon"])
|
||||
frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS)
|
||||
else
|
||||
frequency.post_signal(src, signal)
|
||||
|
||||
// sets the current destination
|
||||
// signals all beacons matching the patrol code
|
||||
// beacons will return a signal giving their locations
|
||||
/obj/machinery/bot/floorbot/proc/set_destination(var/new_dest)
|
||||
new_destination = new_dest
|
||||
post_signal(beacon_freq, "findbeacon", "patrol")
|
||||
awaiting_beacon = 1
|
||||
|
||||
/obj/machinery/bot/floorbot/explode()
|
||||
src.on = 0
|
||||
src.visible_message("\red <B>[src] blows apart!</B>", 1)
|
||||
@@ -374,6 +678,9 @@
|
||||
if (prob(50))
|
||||
new /obj/item/robot_parts/l_arm(Tsec)
|
||||
|
||||
if(src.target)
|
||||
floorbot_targets -= src.target
|
||||
|
||||
while (amount)//Dumps the tiles into the appropriate sized stacks
|
||||
if(amount >= 16)
|
||||
var/obj/item/stack/tile/plasteel/T = new (Tsec)
|
||||
|
||||
@@ -215,7 +215,7 @@
|
||||
|
||||
/obj/machinery/bot/medbot/Emag(mob/user as mob)
|
||||
..()
|
||||
if((!locked && open) || !user)
|
||||
if(open && !locked)
|
||||
if(user) user << "<span class='warning'>You short out [src]'s reagent synthesis circuits.</span>"
|
||||
spawn(0)
|
||||
for(var/mob/O in hearers(src, null))
|
||||
@@ -283,7 +283,8 @@
|
||||
else
|
||||
continue
|
||||
|
||||
|
||||
if(!src.path)
|
||||
src.path = new()
|
||||
if(src.patient && (get_dist(src,src.patient) <= 1))
|
||||
if(!src.currently_healing)
|
||||
src.currently_healing = 1
|
||||
|
||||
@@ -63,6 +63,7 @@ var/global/mulebot_count = 0
|
||||
|
||||
|
||||
var/bloodiness = 0 // count of bloodiness
|
||||
var/currentBloodColor = "#A10808"
|
||||
|
||||
/obj/machinery/bot/mulebot/New()
|
||||
..()
|
||||
@@ -180,13 +181,10 @@ var/global/mulebot_count = 0
|
||||
|
||||
/obj/machinery/bot/mulebot/interact(var/mob/user, var/ai=0)
|
||||
var/dat
|
||||
dat += "<TT><B>Multiple Utility Load Effector Mk. III</B></TT><BR><BR>"
|
||||
dat += "ID: [suffix]<BR>"
|
||||
dat += "Power: [on ? "On" : "Off"]<BR>"
|
||||
|
||||
// AUTOFIXED BY fix_string_idiocy.py
|
||||
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\bots\mulebot.dm:209: dat += "<TT><B>Multiple Utility Load Effector Mk. III</B></TT><BR><BR>"
|
||||
dat += {"<TT><B>Multiple Utility Load Effector Mk. III</B></TT><BR><BR>
|
||||
ID: [suffix]<BR>
|
||||
Power: [on ? "On" : "Off"]<BR>"}
|
||||
// END AUTOFIX
|
||||
if(!open)
|
||||
|
||||
dat += "Status: "
|
||||
@@ -206,41 +204,34 @@ var/global/mulebot_count = 0
|
||||
if(7)
|
||||
dat += "Unable to locate destination"
|
||||
|
||||
// AUTOFIXED BY fix_string_idiocy.py
|
||||
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\bots\mulebot.dm:233: dat += "<BR>Current Load: [load ? load.name : "<i>none</i>"]<BR>"
|
||||
dat += {"<BR>Current Load: [load ? load.name : "<i>none</i>"]<BR>
|
||||
Destination: [!destination ? "<i>none</i>" : destination]<BR>
|
||||
Power level: [cell ? cell.percent() : 0]%<BR>"}
|
||||
// END AUTOFIX
|
||||
|
||||
dat += "<BR>Current Load: [load ? load.name : "<i>none</i>"]<BR>"
|
||||
dat += "Destination: [!destination ? "<i>none</i>" : destination]<BR>"
|
||||
dat += "Power level: [cell ? cell.percent() : 0]%<BR>"
|
||||
|
||||
if(locked && !ai)
|
||||
dat += "<HR>Controls are locked <A href='byond://?src=\ref[src];op=unlock'><I>(unlock)</I></A>"
|
||||
else
|
||||
dat += "<HR>Controls are unlocked <A href='byond://?src=\ref[src];op=lock'><I>(lock)</I></A><BR><BR>"
|
||||
|
||||
dat += "<A href='byond://?src=\ref[src];op=power'>Toggle Power</A><BR>"
|
||||
dat += "<A href='byond://?src=\ref[src];op=stop'>Stop</A><BR>"
|
||||
dat += "<A href='byond://?src=\ref[src];op=go'>Proceed</A><BR>"
|
||||
dat += "<A href='byond://?src=\ref[src];op=home'>Return to Home</A><BR>"
|
||||
dat += "<A href='byond://?src=\ref[src];op=destination'>Set Destination</A><BR>"
|
||||
dat += "<A href='byond://?src=\ref[src];op=setid'>Set Bot ID</A><BR>"
|
||||
dat += "<A href='byond://?src=\ref[src];op=sethome'>Set Home</A><BR>"
|
||||
dat += "<A href='byond://?src=\ref[src];op=autoret'>Toggle Auto Return Home</A> ([auto_return ? "On":"Off"])<BR>"
|
||||
dat += "<A href='byond://?src=\ref[src];op=autopick'>Toggle Auto Pickup Crate</A> ([auto_pickup ? "On":"Off"])<BR>"
|
||||
|
||||
// AUTOFIXED BY fix_string_idiocy.py
|
||||
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\bots\mulebot.dm:240: dat += "<HR>Controls are unlocked <A href='byond://?src=\ref[src];op=lock'><I>(lock)</I></A><BR><BR>"
|
||||
dat += {"<HR>Controls are unlocked <A href='byond://?src=\ref[src];op=lock'><I>(lock)</I></A><BR><BR>
|
||||
<A href='byond://?src=\ref[src];op=power'>Toggle Power</A><BR>
|
||||
<A href='byond://?src=\ref[src];op=stop'>Stop</A><BR>
|
||||
<A href='byond://?src=\ref[src];op=go'>Proceed</A><BR>
|
||||
<A href='byond://?src=\ref[src];op=home'>Return to Home</A><BR>
|
||||
<A href='byond://?src=\ref[src];op=destination'>Set Destination</A><BR>
|
||||
<A href='byond://?src=\ref[src];op=setid'>Set Bot ID</A><BR>
|
||||
<A href='byond://?src=\ref[src];op=sethome'>Set Home</A><BR>
|
||||
<A href='byond://?src=\ref[src];op=autoret'>Toggle Auto Return Home</A> ([auto_return ? "On":"Off"])<BR>
|
||||
<A href='byond://?src=\ref[src];op=autopick'>Toggle Auto Pickup Crate</A> ([auto_pickup ? "On":"Off"])<BR>"}
|
||||
// END AUTOFIX
|
||||
if(load)
|
||||
dat += "<A href='byond://?src=\ref[src];op=unload'>Unload Now</A><BR>"
|
||||
dat += "<HR>The maintenance hatch is closed.<BR>"
|
||||
|
||||
else
|
||||
if(!ai)
|
||||
|
||||
// AUTOFIXED BY fix_string_idiocy.py
|
||||
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\bots\mulebot.dm:258: dat += "The maintenance hatch is open.<BR><BR>"
|
||||
dat += {"The maintenance hatch is open.<BR><BR>
|
||||
Power cell: "}
|
||||
// END AUTOFIX
|
||||
dat += "The maintenance hatch is open.<BR><BR>"
|
||||
dat += "Power cell: "
|
||||
if(cell)
|
||||
dat += "<A href='byond://?src=\ref[src];op=cellremove'>Installed</A><BR>"
|
||||
else
|
||||
@@ -565,7 +556,7 @@ var/global/mulebot_count = 0
|
||||
else if(newdir == 12)
|
||||
newdir = 4
|
||||
goingdir = newdir
|
||||
T.AddTracks(/obj/effect/decal/cleanable/blood/tracks/wheels,list(),0,goingdir)
|
||||
T.AddTracks(/obj/effect/decal/cleanable/blood/tracks/wheels,list(),0,goingdir,currentBloodColor)
|
||||
bloodiness--
|
||||
|
||||
var/moved = step_towards(src, next) // attempt to move
|
||||
@@ -734,7 +725,7 @@ var/global/mulebot_count = 0
|
||||
return get_turf(src)
|
||||
|
||||
|
||||
// called from mob/living/carbon/human/Crossed()
|
||||
// called from mob/living/carbon/human/HasEntered()
|
||||
// when mulebot is in the same loc
|
||||
/obj/machinery/bot/mulebot/proc/RunOver(var/mob/living/carbon/human/H)
|
||||
src.visible_message("\red [src] drives over [H]!")
|
||||
@@ -753,6 +744,13 @@ var/global/mulebot_count = 0
|
||||
B.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
|
||||
|
||||
bloodiness += 4
|
||||
currentBloodColor="#A10808" // For if species get different blood colors.
|
||||
|
||||
/obj/machinery/bot/mulebot/proc/RunOverCreature(var/mob/living/H,var/bloodcolor)
|
||||
src.visible_message("\red [src] drives over [H]!")
|
||||
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
bloodiness += 4
|
||||
currentBloodColor=bloodcolor // For if species get different blood colors.
|
||||
|
||||
// player on mulebot attempted to move
|
||||
/obj/machinery/bot/mulebot/relaymove(var/mob/user)
|
||||
|
||||
@@ -177,7 +177,7 @@ Auto Patrol: []"},
|
||||
|
||||
/obj/machinery/bot/secbot/Emag(mob/user as mob)
|
||||
..()
|
||||
if((!locked && open) || !user)
|
||||
if(open && !locked)
|
||||
if(user) user << "\red You short out [src]'s target assessment circuits."
|
||||
spawn(0)
|
||||
for(var/mob/O in hearers(src, null))
|
||||
@@ -333,23 +333,23 @@ Auto Patrol: []"},
|
||||
|
||||
|
||||
if(SECBOT_START_PATROL) // start a patrol
|
||||
|
||||
if(path.len > 0 && patrol_target) // have a valid path, so just resume
|
||||
mode = SECBOT_PATROL
|
||||
return
|
||||
|
||||
else if(patrol_target) // has patrol target already
|
||||
spawn(0)
|
||||
calc_path() // so just find a route to it
|
||||
if(path.len == 0)
|
||||
patrol_target = 0
|
||||
return
|
||||
if(path != null)
|
||||
if(path.len > 0 && patrol_target) // have a valid path, so just resume
|
||||
mode = SECBOT_PATROL
|
||||
return
|
||||
|
||||
else if(patrol_target) // has patrol target already
|
||||
spawn(0)
|
||||
calc_path() // so just find a route to it
|
||||
if(path.len == 0)
|
||||
patrol_target = 0
|
||||
return
|
||||
mode = SECBOT_PATROL
|
||||
|
||||
|
||||
else // no patrol target, so need a new one
|
||||
find_patrol_target()
|
||||
speak("Engaging patrol mode.")
|
||||
else // no patrol target, so need a new one
|
||||
find_patrol_target()
|
||||
speak("Engaging patrol mode.")
|
||||
|
||||
|
||||
if(SECBOT_PATROL) // patrol mode
|
||||
@@ -585,8 +585,10 @@ Auto Patrol: []"},
|
||||
// calculates a path to the current destination
|
||||
// given an optional turf to avoid
|
||||
/obj/machinery/bot/secbot/proc/calc_path(var/turf/avoid = null)
|
||||
src.path = AStar(src.loc, patrol_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id=botcard, exclude=avoid)
|
||||
if (!path) path = list()
|
||||
src.path = AStar(src.loc, patrol_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 120, id=botcard, exclude=avoid)
|
||||
if(!src.path)
|
||||
src.path = list()
|
||||
|
||||
|
||||
// look for a criminal in view of the bot
|
||||
|
||||
@@ -718,7 +720,7 @@ Auto Patrol: []"},
|
||||
Sa.overlays += image('icons/obj/aibots.dmi', "hs_hole")
|
||||
Sa.created_name = src.name
|
||||
new /obj/item/device/assembly/prox_sensor(Tsec)
|
||||
new /obj/item/weapon/melee/baton(Tsec)
|
||||
new /obj/item/weapon/melee/baton/loaded(Tsec)
|
||||
|
||||
if(prob(50))
|
||||
new /obj/item/robot_parts/l_arm(Tsec)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/effect/decal/cleanable
|
||||
var/list/random_icon_states = list()
|
||||
|
||||
var/targeted_by = null // Used so cleanbots can't claim a mess.
|
||||
/obj/effect/decal/cleanable/New()
|
||||
if (random_icon_states && length(src.random_icon_states) > 0)
|
||||
src.icon_state = pick(src.random_icon_states)
|
||||
|
||||
Reference in New Issue
Block a user