diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index 682e619df96..81ccfce0f6d 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -22,9 +22,11 @@ obj/machinery/atmospherics/binary/pump
var/on = 0
var/target_pressure = ONE_ATMOSPHERE
+/*
attack_hand(mob/user)
on = !on
update_icon()
+*/
update_icon()
if(node1&&node2)
@@ -123,6 +125,39 @@ obj/machinery/atmospherics/binary/pump
target_pressure = number
- if(signal.data["tag"])
- spawn(5) broadcast_status()
- update_icon()
\ No newline at end of file
+ broadcast_status()
+ update_icon()
+ return
+
+
+ attack_hand(user as mob)
+ if(..())
+ return
+ src.add_fingerprint(usr)
+ if(!src.allowed(user))
+ user << "\red Access denied."
+ return
+ usr.machine = src
+ var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure:
+ -
+ -
+ -
+ [round(target_pressure,0.1)]kPa
+ +
+ +
+ +
+ "}
+
+ user << browse("
[src.name] control[dat]", "window=atmo_pump")
+ onclose(user, "atmo_pump")
+ return
+
+ Topic(href,href_list)
+ if(href_list["power"])
+ on = !on
+ if(href_list["out_press"])
+ src.target_pressure = max(0, min(4500, src.target_pressure + text2num(href_list["out_press"])))
+ src.update_icon()
+ src.updateUsrDialog()
+ return
diff --git a/code/ATMOSPHERICS/components/filter.dm b/code/ATMOSPHERICS/components/filter.dm
index 05652a9350a..e744247e0e9 100644
--- a/code/ATMOSPHERICS/components/filter.dm
+++ b/code/ATMOSPHERICS/components/filter.dm
@@ -336,7 +336,9 @@ obj/machinery/atmospherics/filter/attack_hand(user as mob) // -- TLE
else
current_filter_type = "ERROR - Report this bug to the admin, please!"
- dat += {"Filtering: [current_filter_type]
+ dat += {"
+ Power: [on?"On":"Off"]
+ Filtering: [current_filter_type]
Set Filter Type:
Carbon Molecules
Oxygen
@@ -344,12 +346,15 @@ obj/machinery/atmospherics/filter/attack_hand(user as mob) // -- TLE
Carbon Dioxide
Nitrous Oxide
Nothing
-
Desirible output pressure:
+
Desirable output pressure:
+ -
-
-
[src.target_pressure]
+
- +"}
+ +
+ +
+ "}
/*
user << browse("[src.name] control[dat]","window=atmo_filter")
onclose(user, "atmo_filter")
@@ -375,8 +380,13 @@ obj/machinery/atmospherics/filter/Topic(href, href_list) // -- TLE
src.temp = null
if(href_list["out_press"])
src.target_pressure = max(0, min(4000, src.target_pressure + text2num(href_list["out_press"])))
-
+ if(href_list["power"])
+ on=!on
+ src.update_icon()
+ src.updateUsrDialog()
+/*
for(var/mob/M in viewers(1, src))
if ((M.client && M.machine == src))
src.attack_hand(M)
+*/
return
diff --git a/code/ATMOSPHERICS/components/mixer.dm b/code/ATMOSPHERICS/components/mixer.dm
index 19fe7a05640..343fea6888d 100644
--- a/code/ATMOSPHERICS/components/mixer.dm
+++ b/code/ATMOSPHERICS/components/mixer.dm
@@ -7,6 +7,7 @@ obj/machinery/atmospherics/mixer
dir = SOUTH
initialize_directions = SOUTH|NORTH|WEST
+ req_access = list(access_atmospherics)
var/on = 0
@@ -246,4 +247,59 @@ obj/machinery/atmospherics/mixer
del(network_out)
node_out = null
- return null
\ No newline at end of file
+ return null
+
+
+ attack_hand(user as mob)
+ if(..())
+ return
+ src.add_fingerprint(usr)
+ if(!src.allowed(user))
+ user << "\red Access denied."
+ return
+ usr.machine = src
+ var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure:
+ -
+ -
+ -
+ [target_pressure]kPa
+ +
+ +
+ +
+
+ Node 1 Concentration:
+ -
+ -
+ [node1_concentration]([node1_concentration*100]%)
+ +
+ +
+
+ Node 2 Concentration:
+ -
+ -
+ [node2_concentration]([node2_concentration*100]%)
+ +
+ +
+ "}
+
+ user << browse("[src.name] control[dat]", "window=atmo_mixer")
+ onclose(user, "atmo_mixer")
+ return
+
+ Topic(href,href_list)
+ if(href_list["power"])
+ on = !on
+ if(href_list["out_press"])
+ src.target_pressure = max(0, min(4500, src.target_pressure + text2num(href_list["out_press"])))
+ if(href_list["node1_c"])
+ var/value = text2num(href_list["node1_c"])
+ src.node1_concentration = max(0, min(1, src.node1_concentration + value))
+ src.node2_concentration = max(0, min(1, src.node2_concentration - value))
+ if(href_list["node2_c"])
+ var/value = text2num(href_list["node2_c"])
+ src.node2_concentration = max(0, min(1, src.node2_concentration + value))
+ src.node1_concentration = max(0, min(1, src.node1_concentration - value))
+ src.update_icon()
+ src.updateUsrDialog()
+ return
diff --git a/code/WorkInProgress/Chemistry-Reagents.dm b/code/WorkInProgress/Chemistry-Reagents.dm
index cc54d500fbc..b827512125b 100644
--- a/code/WorkInProgress/Chemistry-Reagents.dm
+++ b/code/WorkInProgress/Chemistry-Reagents.dm
@@ -154,6 +154,8 @@ datum
if(self.data&&method == INGEST)
if(M.virus && M.virus.type == self.data)
M.virus.cure()
+ else if(!(self.data in M.resistances))
+ M.resistances += self.data
return
diff --git a/code/game/asteroid/device.dm b/code/game/asteroid/device.dm
index e6b993045eb..7141b6c521f 100644
--- a/code/game/asteroid/device.dm
+++ b/code/game/asteroid/device.dm
@@ -22,50 +22,49 @@
usr << "\blue You deactivate the GPS"
proc/work()
- if(!active) return
- if(!beacon)
- for(var/obj/ship_landing_beacon/B in world)
- if(B.name == "Beacon - SS13")
- beacon = B
- break
-
+ while(active)
if(!beacon)
- usr << "\red Unable to detect beacon signal."
+ for(var/obj/ship_landing_beacon/B in world)
+ if(B.name == "Beacon - SS13")
+ beacon = B
+ break
+
+ if(!beacon)
+ usr << "\red Unable to detect beacon signal."
+ active = 0
+ icon_state = "pinonnull"
+ return
+
+ if(!istype(src.loc, /turf) && !istype(src.loc, /mob))
+ usr << "\red Too much interference. Please hold the device in hand or place it on belt."
active = 0
icon_state = "pinonnull"
return
- if(!istype(src.loc, /turf) && !istype(src.loc, /mob))
- usr << "\red Too much interference. Please hold the device in hand or place it on belt."
- active = 0
- icon_state = "pinonnull"
- return
+ src.icon_state = "pinonfar"
- src.icon_state = "pinonfar"
+ var/atom/cur_loc = src.loc
- var/atom/cur_loc = src.loc
+ if(cur_loc.z == beacon.z)
+ src.dir = get_dir(cur_loc,beacon)
+ else
+ var/list/beacon_global_loc = beacon.get_global_map_pos()
+ var/list/src_global_loc = cur_loc.get_global_map_pos()
+ if(beacon_global_loc && src_global_loc)
+ var/hor_dir = 0
+ var/ver_dir = 0
+ if(beacon_global_loc["x"]>src_global_loc["x"])
+ hor_dir = EAST
+ else if(beacon_global_loc["x"]src_global_loc["x"])
- hor_dir = EAST
- else if(beacon_global_loc["x"]src_global_loc["y"])
+ ver_dir = NORTH
+ else if(beacon_global_loc["y"]src_global_loc["y"])
- ver_dir = NORTH
- else if(beacon_global_loc["y"]Pressure: [] kPa", round(environment.return_pressure(), 0.1))
+ t = "Pressure: [round(environment.return_pressure(), 0.01)] kPa; Temperature: [round(environment.temperature,0.01)]°K ([round(environment.temperature-T0C,0.01)]°C)"
else
t = "\red Results: Sensor Error!"
else
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index 76dc32b49c9..730cbecb2f7 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -191,6 +191,7 @@
src.Move(src.loc)
if(usr.client)
usr.client.mouse_pointer_icon = file("icons/misc/mecha_mouse.dmi")
+ src.log_message("[usr] moved in as pilot.")
return
/obj/mecha/combat/go_out()
@@ -209,6 +210,7 @@
weapons -= destr_weapon
destr_weapon.destroy()
src.occupant_message("The [destr_weapon] is destroyed!")
+ src.log_append_to_last("[destr_weapon] is destoyed.",1)
return
diff --git a/code/game/mecha/combat/weapons/weapons.dm b/code/game/mecha/combat/weapons/weapons.dm
index 571e340f8d9..a2090b1d453 100644
--- a/code/game/mecha/combat/weapons/weapons.dm
+++ b/code/game/mecha/combat/weapons/weapons.dm
@@ -10,6 +10,7 @@
if(!istype(mecha, /obj/mecha/combat))
return
src.chassis = mecha
+ chassis.log_append_to_last("[src.name] initialized.")
return
/datum/mecha_weapon/proc/destroy()
@@ -55,6 +56,7 @@
missiles--
spawn(weapon_cooldown)
weapon_ready = 1
+ chassis.log_message("Fired from [src.name], targeting [target].",1)
return
proc/rearm()
@@ -64,6 +66,7 @@
missiles++
missiles_to_add--
chassis.cell.charge -= missile_energy_cost
+ chassis.log_message("Rearmed [src.name].")
return
get_weapon_info()
@@ -108,6 +111,7 @@
F.prime()
spawn(weapon_cooldown)
weapon_ready = 1
+ chassis.log_message("Fired from [src.name], targeting [target].")
return
/datum/mecha_weapon/laser
@@ -136,7 +140,7 @@
A.process()
spawn(weapon_cooldown)
weapon_ready = 1
-
+ chassis.log_message("Fired from [src.name], targeting [target].")
return
@@ -144,6 +148,7 @@
weapon_cooldown = 50
name = "eZ-13 mk2 Heavy pulse rifle"
energy_drain = 60
+ var/num_penetrations = 2
fire(target)
if(!fire_checks(target)) return
@@ -157,6 +162,7 @@
playsound(chassis, 'marauder.ogg', 50, 1)
var/obj/beam/a_laser/A = new /obj/beam/a_laser/pulse_laser(curloc)
+ A.life = num_penetrations
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
@@ -166,7 +172,7 @@
A.process()
spawn(weapon_cooldown)
weapon_ready = 1
-
+ chassis.log_message("Fired from [src.name], targeting [target].")
return
@@ -174,6 +180,7 @@
weapon_cooldown = 10
name = "PBT \"Pacifier\" Mounted Taser"
energy_drain = 20
+ weapon_cooldown = 7
fire(target)
if(!fire_checks(target)) return
@@ -196,7 +203,7 @@
A.process()
spawn(weapon_cooldown)
weapon_ready = 1
-
+ chassis.log_message("Fired from [src.name], targeting [target].")
return
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index f5aa1fcf929..451cfd29c35 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -22,6 +22,7 @@
var/deflect_chance = 2 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
var/obj/item/weapon/cell/cell = new
var/state = 0
+ var/list/log = new
var/datum/effects/system/spark_spread/spark_system = new
var/lights = 0
@@ -48,6 +49,7 @@
var/datum/global_iterator/pr_location_temp_check //processes location temperature damage
var/datum/global_iterator/pr_internal_damage //processes internal damage
+
/obj/mecha/New()
..()
src.air_contents.volume = gas_tank_volume //liters
@@ -64,8 +66,10 @@
pr_inertial_movement = new /datum/global_iterator/mecha_intertial_movement(null,0)
pr_location_temp_check = new /datum/global_iterator/mecha_location_temp_check(list(src))
pr_internal_damage = new /datum/global_iterator/mecha_internal_damage(list(src),0)
+
src.verbs -= /obj/mecha/verb/disconnect_from_port
src.verbs -= /atom/movable/verb/pull
+ src.log_message("[src.name] created.")
return
/obj/mecha/Del()
@@ -140,6 +144,7 @@
if(istype(src.loc, /turf/space))
if(!src.check_for_support())
src.pr_inertial_movement.start(list(src,direction))
+ src.log_message("Movement control lost. Inertial movement started.")
return 1
return 0
@@ -192,6 +197,7 @@
if("fire")
src.health -= amount*1.2
src.update_health()
+ src.log_append_to_last("Took [amount] points of damage. Damage type: \"[type]\".",1)
return
/obj/mecha/proc/check_for_internal_damage(var/list/possible_int_damage,var/ignore_threshold=null)//TODO
@@ -206,6 +212,7 @@
if(int_dam_flag)
internal_damage |= int_dam_flag
pr_internal_damage.start()
+ src.log_append_to_last("Internal damage of type [int_dam_flag].[ignore_threshold?"Ignoring damage threshold.":null]",1)
return
@@ -217,6 +224,7 @@
return
/obj/mecha/attack_hand(mob/user as mob)
+ src.log_message("Attack by hand/paw. Attacker - [user].",1)
if (user.mutations & 8 && !prob(src.deflect_chance))
src.take_damage(15)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
@@ -225,6 +233,7 @@
else
src.visible_message("[user] hits [src.name]. Nothing happens")
user << "You hit [src.name] with no visible effect."
+ src.log_append_to_last("Armor saved.")
return
/obj/mecha/attack_paw(mob/user as mob)
@@ -232,6 +241,7 @@
/obj/mecha/attack_alien(mob/user as mob)
+ src.log_message("Attack by alien. Attacker - [user].",1)
if(!prob(src.deflect_chance))
src.take_damage(15)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
@@ -241,6 +251,7 @@
if(V.client && !(V.blinded))
V.show_message("\red The [user] slashes at [src.name]'s armor!", 1)
else
+ src.log_append_to_last("Armor saved.")
playsound(src.loc, 'slash.ogg', 50, 1, -1)
user << "\green Your claws had no effect!"
src.occupant_message("\blue The [user]'s claws are stopped by the armor.")
@@ -251,8 +262,10 @@
/obj/mecha/hitby(A as mob|obj)
+ src.log_message("Hit by [A].",1)
if(prob(src.deflect_chance) || istype(A, /mob))
src.occupant_message("\blue The [A] bounces off the armor.")
+ src.log_append_to_last("Armor saved.")
for (var/mob/V in viewers(src))
if(V.client && !(V.blinded))
V.show_message("The [A] bounces off the [src.name] armor", 1)
@@ -260,22 +273,34 @@
var/mob/M = A
M.bruteloss += 10
M.updatehealth()
- return
else if(istype(A, /obj))
var/obj/O = A
if(O.throwforce)
src.take_damage(O.throwforce)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
- return
+
+ return
/obj/mecha/bullet_act(flag)
+ var/dam_type
+ switch(dam_type)
+ if(PROJECTILE_PULSE)
+ dam_type = "Pulse"
+ if(PROJECTILE_LASER)
+ dam_type = "Laser"
+ if(PROJECTILE_TASER)
+ dam_type = "Taser"
+ else
+ dam_type = "Default"
+ src.log_message("Hit by projectile. Type: [dam_type]([flag]).",1)
if(prob(src.deflect_chance))
src.occupant_message("\blue The armor deflects the incoming projectile.")
for (var/mob/V in viewers(src))
if(V.client && !(V.blinded))
V.show_message("The [src.name] armor deflects the projectile", 1)
+ src.log_append_to_last("Armor saved.")
else
var/damage
var/ignore_threshold
@@ -309,8 +334,10 @@
return
/obj/mecha/ex_act(severity)
+ src.log_message("Affected by explosion of severity: [severity].",1)
if(prob(src.deflect_chance))
severity++
+ src.log_append_to_last("Armor saved, changing severity to [severity].")
switch(severity)
if(1.0)
src.destroy()
@@ -328,17 +355,6 @@
src.check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST),1)
return
-/obj/mecha/proc/check_location_temp()
- spawn while(src)
- if(istype(src.loc, /turf/simulated/))
- var/turf/simulated/T = src.loc
- if(T.air)
- if(T.air.temperature > src.max_temperature)
- src.take_damage(10)
- sleep(10)
- return
-
-
/////////////////////////////////////
//////// Atmospheric stuff ////////
/////////////////////////////////////
@@ -387,7 +403,7 @@
var/datum/pipe_network/network = connected_port.return_network(src)
if(network && !network.gases.Find(air_contents))
network.gases += air_contents
-
+ src.log_message("Connected to gas port.")
return 1
/obj/mecha/proc/disconnect()
@@ -400,7 +416,7 @@
connected_port.connected_device = null
connected_port = null
-
+ src.log_message("Disconnected from gas port.")
return 1
@@ -455,6 +471,8 @@
src.sd_SetLuminosity(src.luminosity + src.lights_power)
else
src.sd_SetLuminosity(src.luminosity - src.lights_power)
+ src.log_message("Toggled lights.")
+ return
/obj/mecha/verb/move_inside()
set name = "Move Inside"
@@ -462,8 +480,10 @@
if (usr.stat != 0 || !istype(usr, /mob/living/carbon/human))
return
+ src.log_message("[usr] tries to move in.")
if (src.occupant)
usr << "\blue The [src.name] is already occupied!"
+ src.log_append_to_last("Permission denied.")
return
/*
if (usr.abiotic())
@@ -472,6 +492,7 @@
*/
if(!src.operation_allowed(usr))
usr << "\red Access denied"
+ src.log_append_to_last("Permission denied.")
return
usr << "You start climbing into [src.name]"
spawn(20)
@@ -483,6 +504,7 @@
src.add_fingerprint(usr)
src.Entered(usr)
src.Move(src.loc)
+ src.log_append_to_last("[usr] moved in as pilot.")
return
@@ -509,6 +531,7 @@
/obj/mecha/proc/go_out()
if(!src.occupant) return
if(src.occupant.Move(src.loc))
+ src.log_message("[src.occupant] moved out.")
src.Exited(src.occupant)
if (src.occupant.client)
src.occupant.client.eye = src.occupant.client.mob
@@ -516,6 +539,7 @@
src.occupant << browse(null, "window=exosuit")
src.occupant = null
src.pr_update_stats.stop()
+
return
////// Misc
@@ -526,6 +550,26 @@
src.occupant << "[message]"
return
+/obj/mecha/proc/log_message(message as text,red=null)
+ log.len++
+ log[log.len] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]")
+ return log.len
+
+/obj/mecha/proc/log_append_to_last(message as text,red=null)
+ var/list/last_entry = src.log[src.log.len]
+ last_entry["message"] += "
[red?"":null][message][red?"":null]"
+ return
+
+
+/obj/mecha/proc/get_log_html()
+ var/output = "[src.name] Log"
+ for(var/list/entry in log)
+ output += {"[time2text(entry["time"],"DDD MMM DD hh:mm:ss")]
+ [entry["message"]]
+ "}
+ output += ""
+ return output
+
/obj/mecha/proc/operation_allowed(mob/living/carbon/human/H)
//check if it doesn't require any access at all
if(src.check_operational_access(null))
@@ -573,6 +617,7 @@
/obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ src.log_message("Attacked by [W].")
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if(src.internals_access_allowed(usr))
if(state==0)
@@ -609,6 +654,7 @@
src.cell = null
state = 4
user << "You unscrew and pry out the powercell."
+ src.log_message("Powercell removed")
else if(state==4 && src.cell)
state=3
user << "You screw the cell in place"
@@ -621,6 +667,7 @@
user.drop_item()
W.loc = src
src.cell = W
+ src.log_message("Powercell installed")
else
user << "There's already a powercell installed."
return
@@ -644,6 +691,7 @@
else
if(prob(src.deflect_chance))
user << "\red The [W] bounces off [src.name] armor."
+ src.log_append_to_last("Armor saved.")
/*
for (var/mob/V in viewers(src))
if(V.client && !(V.blinded))
@@ -684,6 +732,7 @@
var/output = {"Toggle Lights
[(/obj/mecha/verb/disconnect_from_port in src.verbs)?"Disconnect from port
":null]
[(/obj/mecha/verb/connect_to_port in src.verbs)?"Connect to port
":null]
+ View internal log
Eject
"}
return output
@@ -705,15 +754,22 @@
if (href_list["eject"])
src.eject()
return
+ if (href_list["view_log"])
+ src.occupant << browse(src.get_log_html(), "window=exosuit_log")
+ onclose(occupant, "exosuit_log")
+ return
if (href_list["repair_int_control_lost"])
src.occupant_message("Recalibrating coordination system.")
+ src.log_message("Recalibration of coordination system started.")
var/T = src.loc
spawn(100)
if(T == src.loc)
src.internal_damage &= ~MECHA_INT_CONTROL_LOST
src.occupant_message("Recalibration successful.")
+ src.log_message("Recalibration of coordination system finished with 0 errors.")
else
src.occupant_message("Recalibration failed.")
+ src.log_message("Recalibration of coordination system failed with 1 error.",1)
return
diff --git a/code/game/mecha/working/tools/tools.dm b/code/game/mecha/working/tools/tools.dm
index d13d44e7bb3..aec1c1c5a00 100644
--- a/code/game/mecha/working/tools/tools.dm
+++ b/code/game/mecha/working/tools/tools.dm
@@ -10,6 +10,7 @@
if(!istype(mecha, /obj/mecha/working))
return
src.chassis = mecha
+ chassis.log_append_to_last("[src.name] initialized.")
return
@@ -75,6 +76,7 @@
O.loc = chassis
O.anchored = 0
chassis.occupant_message("[target] succesfully loaded.")
+ chassis.log_message("Loaded [O]. Cargo compartment capacity: [chassis.cargo_capacity - chassis.cargo.len]")
else
chassis.occupant_message("You must hold still while handling objects.")
tool_ready = 1
@@ -123,6 +125,7 @@
if(istype(target, /turf/simulated/wall/r_wall))
chassis.occupant_message("\red The [target] is too durable to drill through.")
else
+ chassis.log_message("Drilled through [target]")
target.ex_act(2)
tool_ready = 1
return
diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm
index 9cbfe7991ba..75f88d9cc90 100644
--- a/code/game/mecha/working/working.dm
+++ b/code/game/mecha/working/working.dm
@@ -33,13 +33,11 @@
var/turf/T = get_turf(O.loc)
if(T)
T.Entered(O)
- return
-
+ src.log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]")
if (href_list["select_tool"])
var/tool = locate(href_list["select_tool"])
if(tool)
src.selected_tool = tool
- return
return
/obj/mecha/working/get_stats_part()
@@ -70,4 +68,5 @@
tools -= destr_tool
destr_tool.destroy()
src.occupant_message("The [destr_tool] is destroyed!")
+ src.log_append_to_last("[destr_tool] is destroyed.")
return
\ No newline at end of file