diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index f619c5ebcf..eb037aed6e 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -9,6 +9,8 @@
var/maxhealth = 0
var/fire_dam_coeff = 1.0
var/brute_dam_coeff = 1.0
+ var/open = 0//Maint panel
+ var/locked = 1
//var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots
@@ -29,7 +31,12 @@
src.explode()
/obj/machinery/bot/proc/Emag(mob/user as mob)
- if(!emagged) emagged = 1
+ if(locked)
+ locked = 0
+ emagged = 1
+ user << "You bypass [src]'s controls."
+ if(!locked && open)
+ emagged = 2
/obj/machinery/bot/examine()
set src in view()
@@ -70,16 +77,20 @@
/obj/machinery/bot/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/screwdriver))
- if (src.health < maxhealth)
- src.health = min(maxhealth, src.health+25)
- user.visible_message(
- "\red [user] repairs [src]!",
- "\blue You repair [src]!"
- )
+ if(istype(W, /obj/item/weapon/screwdriver))
+ if(!locked)
+ open = !open
+ user << "Maintenance panel is now [src.open ? "opened" : "closed"]."
+ else if(istype(W, /obj/item/weapon/weldingtool))
+ if(health < maxhealth)
+ if(open)
+ health = min(maxhealth, health+10)
+ user.visible_message("\red [user] repairs [src]!","\blue You repair [src]!")
+ else
+ user << "Unable to repair with the maintenance panel closed."
else
user << "[src] does not need a repair."
- else if (istype(W, /obj/item/weapon/card/emag) && !emagged)
+ else if (istype(W, /obj/item/weapon/card/emag) && emagged < 2)
Emag(user)
else
switch(W.damtype)
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index 3b765dc22b..29a83b13de 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -26,11 +26,9 @@
health = 25
maxhealth = 25
var/cleaning = 0
- var/locked = 1
var/screwloose = 0
var/oddbutton = 0
var/blood = 1
- var/panelopen = 0
var/list/target_types = list()
var/obj/effect/decal/cleanable/target
var/obj/effect/decal/cleanable/oldtarget
@@ -86,13 +84,14 @@
dat += text({"
Automatic Station Cleaner v1.0
Status: []
-Behaviour controls are [src.locked ? "locked" : "unlocked"]"},
+Behaviour controls are [src.locked ? "locked" : "unlocked"]
+Maintenance panel panel is [src.open ? "opened" : "closed"]"},
text("[src.on ? "On" : "Off"]"))
if(!src.locked)
dat += text({"
Cleans Blood: []
"}, text("[src.blood ? "Yes" : "No"]"))
dat += text({"
Patrol station: []
"}, text("[src.should_patrol ? "Yes" : "No"]"))
// dat += text({"
Beacon frequency: []
"}, text("[src.beacon_freq]"))
- if(src.panelopen && !src.locked)
+ if(src.open && !src.locked)
dat += text({"
Odd looking screw twiddled: []
Weird button pressed: []"},
@@ -138,25 +137,25 @@ text("[src.oddbutton ? "Yes" : "No"
/obj/machinery/bot/cleanbot/attackby(obj/item/weapon/W, mob/user as mob)
if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if(src.allowed(usr))
+ if(src.allowed(usr) && !open && !emagged)
src.locked = !src.locked
user << "You [ src.locked ? "lock" : "unlock"] the [src] behaviour controls."
else
- user << "This [src] doesn't seem to respect your authority."
- else if (istype(W, /obj/item/weapon/screwdriver))
- if(!src.locked)
- src.panelopen = !src.panelopen
- user << "You [ src.panelopen ? "open" : "close"] the hidden panel on [src]."
+ if(emagged)
+ user << "ERROR"
+ if(open)
+ user << "Please close the access panel before locking it."
+ else
+ user << "This [src] doesn't seem to respect your authority."
else
return ..()
/obj/machinery/bot/cleanbot/Emag(mob/user as mob)
..()
- if(user) user << "The [src] buzzes and beeps."
- src.oddbutton = 1
- src.screwloose = 1
- src.panelopen = 0
- src.locked = 1
+ if(open && !locked)
+ if(user) user << "The [src] buzzes and beeps."
+ src.oddbutton = 1
+ src.screwloose = 1
/obj/machinery/bot/cleanbot/process()
set background = 1
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index 62aa9fe277..f24f106827 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -20,7 +20,6 @@
//var/lasers = 0
- var/locked = 1 //Behavior Controls lock
var/mob/living/carbon/target
var/oldtarget_name
var/threatlevel = 0
@@ -124,7 +123,8 @@
dat += text({"
Automatic Security Unit v2.5
Status: []
-Behaviour controls are [src.locked ? "locked" : "unlocked"]"},
+Behaviour controls are [src.locked ? "locked" : "unlocked"]
+Maintenance panel panel is [src.open ? "opened" : "closed"]"},
"[src.on ? "On" : "Off"]" )
@@ -186,11 +186,16 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if (src.allowed(user))
+ if (src.allowed(user) && !open && !emagged)
src.locked = !src.locked
user << "Controls are now [src.locked ? "locked" : "unlocked"]."
else
- user << "Access denied."
+ if(emagged)
+ user << "ERROR"
+ if(open)
+ user << "Please close the access panel before locking it."
+ else
+ user << "Access denied."
else
..()
if (!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!src.target))
@@ -201,19 +206,20 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/Emag(mob/user as mob)
..()
- if(user) user << "You short out [src]'s target assessment circuits."
- spawn(0)
- for(var/mob/O in hearers(src, null))
- O.show_message("\red [src] buzzes oddly!", 1)
- src.target = null
- if(user) src.oldtarget_name = user.name
- src.last_found = world.time
- src.anchored = 0
- src.emagged = 1
- src.on = 1
- src.icon_state = "[lasercolor]ed209[src.on]"
- src.projectile = null
- mode = SECBOT_IDLE
+ if(open && !locked)
+ if(user) user << "You short out [src]'s target assessment circuits."
+ spawn(0)
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\red [src] buzzes oddly!", 1)
+ src.target = null
+ if(user) src.oldtarget_name = user.name
+ src.last_found = world.time
+ src.anchored = 0
+ src.emagged = 2
+ src.on = 1
+ src.icon_state = "[lasercolor]ed209[src.on]"
+ src.projectile = null
+ mode = SECBOT_IDLE
/obj/machinery/bot/ed209/process()
set background = 1
@@ -654,7 +660,7 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/proc/assess_perp(mob/living/carbon/human/perp as mob)
var/threatcount = 0
- if(src.emagged) return 10 //Everyone is a criminal!
+ if(src.emagged == 2) return 10 //Everyone is a criminal!
if((src.idcheck) || (isnull(perp:wear_id)) || (istype(perp:wear_id, /obj/item/weapon/card/id/syndicate)))
@@ -814,17 +820,17 @@ Auto Patrol: []"},
if(!projectile)
if(!lasercolor)
- if (src.emagged)
+ if (src.emagged == 2)
projectile = /obj/item/projectile/beam
else
projectile = /obj/item/projectile/energy/electrode
else if(lasercolor == "b")
- if (src.emagged)
+ if (src.emagged == 2)
projectile = /obj/item/projectile/omnitag
else
projectile = /obj/item/projectile/bluetag
else if(lasercolor == "r")
- if (src.emagged)
+ if (src.emagged == 2)
projectile = /obj/item/projectile/omnitag
else
projectile = /obj/item/projectile/redtag
@@ -871,8 +877,8 @@ Auto Patrol: []"},
var/mob/toshoot = pick(targets)
if (toshoot)
targets-=toshoot
- if (prob(50) && !emagged)
- emagged = 1
+ if (prob(50) && emagged < 2)
+ emagged = 2
shootAt(toshoot)
emagged = 0
else
diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm
index 31e565eaed..4dda38d3d0 100644
--- a/code/game/machinery/bots/floorbot.dm
+++ b/code/game/machinery/bots/floorbot.dm
@@ -42,7 +42,6 @@
var/improvefloors = 0
var/eattiles = 0
var/maketiles = 0
- var/locked = 1
var/turf/target
var/turf/oldtarget
var/oldloc = null
@@ -80,6 +79,7 @@
var/dat
dat += "Automatic Station Floor Repairer v1.0
"
dat += "Status: [src.on ? "On" : "Off"]
"
+ dat += "Maintenance panel panel is [src.open ? "opened" : "closed"]
"
dat += "Tiles left: [src.amount]
"
dat += "Behvaiour controls are [src.locked ? "locked" : "unlocked"]
"
if(!src.locked)
@@ -109,15 +109,24 @@
user << "You load [loaded] tiles into the floorbot. He now contains [src.amount] tiles."
src.updateicon()
else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if(src.allowed(usr))
+ if(src.allowed(usr) && !open && !emagged)
src.locked = !src.locked
user << "You [src.locked ? "lock" : "unlock"] the [src] behaviour controls."
else
- user << "The [src] doesn't seem to respect your authority."
+ if(emagged)
+ user << "ERROR"
+ if(open)
+ user << "Please close the access panel before locking it."
+ else
+ user << "Access denied."
src.updateUsrDialog()
else
..()
+/obj/machinery/bot/floorbot/Emag(mob/user as mob)
+ ..()
+ if(open && !locked)
+ if(user) user << "The [src] buzzes and beeps."
/obj/machinery/bot/floorbot/Topic(href, href_list)
if(..())
@@ -184,7 +193,7 @@
for(var/mob/O in viewers(src, null))
O.show_message(text("[src] makes an excited booping beeping sound!"), 1)
- if(!src.target || src.target == null)
+ if((!src.target || src.target == null) && emagged < 2)
if(targetdirection != null)
/*
for (var/turf/space/D in view(7,src))
@@ -217,6 +226,14 @@
src.target = T
break
+ 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)
if(src.loc != src.oldloc)
src.oldtarget = null
@@ -245,8 +262,23 @@
src.eattile(src.target)
else if(istype(src.target, /obj/item/stack/sheet/metal))
src.maketile(src.target)
- else if(istype(src.target, /turf/))
+ else if(istype(src.target, /turf/) && emagged < 2)
repair(src.target)
+ else if(emagged == 2 && istype(src.target,/turf/simulated/floor))
+ var/turf/simulated/floor/F = src.target
+ src.anchored = 1
+ src.repairing = 1
+ if(prob(90))
+ F.break_tile_to_plating()
+ else
+ F.ReplaceWithLattice()
+ for(var/mob/O in viewers(src, null))
+ O.show_message(text("\red [src] makes an excited booping sound."), 1)
+ spawn(50)
+ src.amount ++
+ src.anchored = 0
+ src.repairing = 0
+ src.target = null
src.path = new()
return
@@ -348,8 +380,15 @@
if (prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
- if (amount)
- new /obj/item/stack/tile/plasteel(Tsec) // only one tile, yes
+ while (amount)//Dumps the tiles into the appropriate sized stacks
+ if(amount >= 16)
+ var/obj/item/stack/tile/plasteel/T = new (Tsec)
+ T.amount = 16
+ amount -= 16
+ else
+ var/obj/item/stack/tile/plasteel/T = new (Tsec)
+ T.amount = src.amount
+ amount = 0
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src)
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index a232ecd1a0..f812115540 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -15,7 +15,6 @@
maxhealth = 20
req_access =list(access_medical)
var/stunned = 0 //It can be stunned by tasers. Delicate circuits.
- var/locked = 1
//var/emagged = 0
var/obj/machinery/camera/cam = null
var/list/botcard_access = list(access_medical, access_morgue, access_genetics, access_robotics)
@@ -106,6 +105,7 @@
var/dat
dat += "Automatic Medical Unit v1.0
"
dat += "Status: [src.on ? "On" : "Off"]
"
+ dat += "Maintenance panel panel is [src.open ? "opened" : "closed"]
"
dat += "Beaker: "
if (src.reagent_glass)
dat += "Loaded \[[src.reagent_glass.reagents.total_volume]/[src.reagent_glass.reagents.maximum_volume]\]"
@@ -181,12 +181,17 @@
/obj/machinery/bot/medbot/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if (src.allowed(user))
+ if (src.allowed(user) && !open && !emagged)
src.locked = !src.locked
user << "Controls are now [src.locked ? "locked." : "unlocked."]"
src.updateUsrDialog()
else
- user << "Access denied."
+ if(emagged)
+ user << "ERROR"
+ if(open)
+ user << "Please close the access panel before locking it."
+ else
+ user << "Access denied."
else if (istype(W, /obj/item/weapon/reagent_containers/glass))
if(src.locked)
@@ -210,19 +215,20 @@
/obj/machinery/bot/medbot/Emag(mob/user as mob)
..()
- if(user) user << "You short out [src]'s reagent synthesis circuits."
- spawn(0)
- for(var/mob/O in hearers(src, null))
- O.show_message("\red [src] buzzes oddly!", 1)
- flick("medibot_spark", src)
- src.patient = null
- if(user) src.oldpatient = user
- src.currently_healing = 0
- src.last_found = world.time
- src.anchored = 0
- src.emagged = 1
- src.on = 1
- src.icon_state = "medibot[src.on]"
+ if(open && !locked)
+ if(user) user << "You short out [src]'s reagent synthesis circuits."
+ spawn(0)
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\red [src] buzzes oddly!", 1)
+ flick("medibot_spark", src)
+ src.patient = null
+ if(user) src.oldpatient = user
+ src.currently_healing = 0
+ src.last_found = world.time
+ src.anchored = 0
+ src.emagged = 2
+ src.on = 1
+ src.icon_state = "medibot[src.on]"
/obj/machinery/bot/medbot/process()
set background = 1
@@ -322,7 +328,7 @@
if(C.suiciding)
return 0 //Kevorkian school of robotic medical assistants.
- if(src.emagged) //Everyone needs our medicine. (Our medicine is toxins)
+ if(src.emagged == 2) //Everyone needs our medicine. (Our medicine is toxins)
return 1
//If they're injured, we're using a beaker, and don't have one of our WONDERCHEMS.
@@ -380,7 +386,7 @@
if((src.use_beaker) && (src.reagent_glass) && (src.reagent_glass.reagents.total_volume))
reagent_id = "internal_beaker"
- if(src.emagged) //Emagged! Time to poison everybody.
+ if(src.emagged == 2) //Emagged! Time to poison everybody.
reagent_id = "toxin"
var/virus = 0
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 9e6af7a13f..600617b826 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -17,9 +17,7 @@
maxhealth = 150
fire_dam_coeff = 0.7
brute_dam_coeff = 0.5
- var/locked = 1
var/atom/movable/load = null // the loaded crate (usually)
-
var/beacon_freq = 1400
var/control_freq = 1447
@@ -49,7 +47,6 @@
var/auto_return = 1 // true if auto return to home beacon after unload
var/auto_pickup = 1 // true if auto-pickup at beacon
- var/open = 0 // true if maint hatch is open
var/obj/item/weapon/cell/cell
// the installed power cell
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index 30ddfef920..59bcf938eb 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -12,7 +12,6 @@
brute_dam_coeff = 0.5
// weight = 1.0E7
req_access = list(access_security)
- var/locked = 1 //Behavior Controls lock
var/mob/living/carbon/target
var/oldtarget_name
var/threatlevel = 0
@@ -114,7 +113,8 @@
dat += text({"
Automatic Security Unit v1.3
Status: []
-Behaviour controls are [src.locked ? "locked" : "unlocked"]"},
+Behaviour controls are [src.locked ? "locked" : "unlocked"]
+Maintenance panel panel is [src.open ? "opened" : "closed"]"},
"[src.on ? "On" : "Off"]" )
@@ -162,11 +162,16 @@ Auto Patrol: []"},
/obj/machinery/bot/secbot/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if(src.allowed(user))
+ if(src.allowed(user) && !open && !emagged)
src.locked = !src.locked
user << "Controls are now [src.locked ? "locked." : "unlocked."]"
else
- user << "\red Access denied."
+ if(emagged)
+ user << "ERROR"
+ if(open)
+ user << "\red Please close the access panel before locking it."
+ else
+ user << "\red Access denied."
else
..()
if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!src.target))
@@ -174,18 +179,20 @@ Auto Patrol: []"},
src.mode = SECBOT_HUNT
/obj/machinery/bot/secbot/Emag(mob/user as mob)
- if(user) user << "\red You short out [src]'s target assessment circuits."
- spawn(0)
- for(var/mob/O in hearers(src, null))
- O.show_message("\red [src] buzzes oddly!", 1)
- src.target = null
- if(user) src.oldtarget_name = user.name
- src.last_found = world.time
- src.anchored = 0
- src.emagged = 1
- src.on = 1
- src.icon_state = "secbot[src.on]"
- mode = SECBOT_IDLE
+ ..()
+ 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))
+ O.show_message("\red [src] buzzes oddly!", 1)
+ src.target = null
+ if(user) src.oldtarget_name = user.name
+ src.last_found = world.time
+ src.anchored = 0
+ src.emagged = 2
+ src.on = 1
+ src.icon_state = "secbot[src.on]"
+ mode = SECBOT_IDLE
/obj/machinery/bot/secbot/process()
set background = 1
@@ -586,7 +593,7 @@ Auto Patrol: []"},
/obj/machinery/bot/secbot/proc/assess_perp(mob/living/carbon/human/perp as mob)
var/threatcount = 0
- if(src.emagged) return 10 //Everyone is a criminal!
+ if(src.emagged == 2) return 10 //Everyone is a criminal!
if(src.idcheck && !src.allowed(perp))
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 343fd5ada0..9550ee2ef5 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -156,26 +156,30 @@
var/aco = 0
var/atox = 0
var/atemp = 0
+ var/turf_count = 0
var/turf/simulated/floor/W = new /turf/simulated/floor( locate(src.x, src.y, src.z) )
- for(var/direction in cardinal)
+//////Assimilate Air//////
+ for(var/direction in cardinal)//Only use cardinals to cut down on lag
var/turf/T = get_step(src,direction)
- if(istype(T,/turf/space))
+ if(istype(T,/turf/space))//Counted as no air
+ turf_count++//Considered a valid turf for air calcs
continue
- else if(istype(T,/turf/simulated))
+ else if(istype(T,/turf/simulated/floor))
var/turf/simulated/S = T
- if(S.air)
+ if(S.air)//Add the air's contents to the holders
aoxy += S.air.oxygen
anitro += S.air.nitrogen
aco += S.air.carbon_dioxide
atox += S.air.toxins
atemp += S.air.temperature
- W.air.oxygen = (aoxy/4)
- W.air.nitrogen = (anitro/4)
- W.air.carbon_dioxide = (aco/4)
- W.air.toxins = (atox/4)
- W.air.temperature = (atemp/4)
+ turf_count ++
+ W.air.oxygen = (aoxy/max(turf_count,1))//Averages contents of the turfs, ignoring walls and the like
+ W.air.nitrogen = (anitro/max(turf_count,1))
+ W.air.carbon_dioxide = (aco/max(turf_count,1))
+ W.air.toxins = (atox/max(turf_count,1))
+ W.air.temperature = (atemp/max(turf_count,1))//Trace gases can get bant
W.RemoveLattice()
W.dir = old_dir
@@ -197,13 +201,16 @@
var/aco = 0
var/atox = 0
var/atemp = 0
+ var/turf_count = 0
+//////Assimilate Air//////
var/turf/simulated/floor/plating/W = new /turf/simulated/floor/plating( locate(src.x, src.y, src.z) )
for(var/direction in cardinal)
var/turf/T = get_step(src,direction)
if(istype(T,/turf/space))
+ turf_count++
continue
- else if(istype(T,/turf/simulated))
+ else if(istype(T,/turf/simulated/floor))
var/turf/simulated/S = T
if(S.air)
aoxy += S.air.oxygen
@@ -211,12 +218,12 @@
aco += S.air.carbon_dioxide
atox += S.air.toxins
atemp += S.air.temperature
- W.air.oxygen = (aoxy/4)
- W.air.oxygen = (aoxy/4)
- W.air.nitrogen = (anitro/4)
- W.air.carbon_dioxide = (aco/4)
- W.air.toxins = (atox/4)
- W.air.temperature = (atemp/4)
+ turf_count++
+ W.air.oxygen = (aoxy/max(turf_count,1))
+ W.air.nitrogen = (anitro/max(turf_count,1))
+ W.air.carbon_dioxide = (aco/max(turf_count,1))
+ W.air.toxins = (atox/max(turf_count,1))
+ W.air.temperature = (atemp/max(turf_count,1))
W.RemoveLattice()
W.dir = old_dir
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 04562d1707..4d59f34a49 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -262,7 +262,6 @@ proc/move_mining_shuttle()
icon_state = "diamonddrill"
item_state = "jackhammer"
digspeed = 15
- force = 3
desc = ""
/*****************************Shovel********************************/
diff --git a/html/changelog.html b/html/changelog.html
index 3f78976c0e..1b231ffe4d 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -48,6 +48,18 @@ Stuff which is in development and not yet visible to players or just code relate
should be listed in the changelog upon commit tho. Thanks. -->
+
+