diff --git a/code/datums/configuration.dm b/code/datums/configuration.dm
index 5736a31e5e..822025ee35 100644
--- a/code/datums/configuration.dm
+++ b/code/datums/configuration.dm
@@ -12,6 +12,11 @@
var/log_game = 0 // log game events
var/log_vote = 0 // log voting
var/log_whisper = 0 // log client whisper
+ var/log_emote = 0 // log emotes
+ var/log_attack = 0 // log attack messages
+ var/log_adminchat = 0 // log admin chat messages
+ var/log_adminwarn = 0 // log warnings admins get about bomb construction and such
+ var/log_pda = 0 // log pda messages
var/sql_enabled = 1 // for sql switching
var/allow_vote_restart = 0 // allow votes to restart
var/allow_vote_mode = 0 // allow votes to change mode
@@ -141,6 +146,21 @@
if ("log_whisper")
config.log_whisper = 1
+ if ("log_attack")
+ config.log_attack = 1
+
+ if ("log_emote")
+ config.log_emote = 1
+
+ if ("log_adminchat")
+ config.log_adminchat = 1
+
+ if ("log_adminwarn")
+ config.log_adminwarn = 1
+
+ if ("log_pda")
+ config.log_pda = 1
+
if ("allow_vote_restart")
config.allow_vote_restart = 1
diff --git a/code/defines/procs/logging.dm b/code/defines/procs/logging.dm
index 277982ab98..cc35d8d014 100644
--- a/code/defines/procs/logging.dm
+++ b/code/defines/procs/logging.dm
@@ -1,28 +1,48 @@
/proc/log_admin(text)
admin_log.Add(text)
if (config.log_admin)
- diary << "ADMIN: [text]"
+ diary << "\[[time_stamp()]]ADMIN: [text]"
/proc/log_game(text)
if (config.log_game)
- diary << "GAME: [text]"
+ diary << "\[[time_stamp()]]GAME: [text]"
/proc/log_vote(text)
if (config.log_vote)
- diary << "VOTE: [text]"
+ diary << "\[[time_stamp()]]VOTE: [text]"
/proc/log_access(text)
if (config.log_access)
- diary << "ACCESS: [text]"
+ diary << "\[[time_stamp()]]ACCESS: [text]"
/proc/log_say(text)
if (config.log_say)
- diary << "SAY: [text]"
+ diary << "\[[time_stamp()]]SAY: [text]"
/proc/log_ooc(text)
if (config.log_ooc)
- diary << "OOC: [text]"
+ diary << "\[[time_stamp()]]OOC: [text]"
/proc/log_whisper(text)
if (config.log_whisper)
- diary << "WHISPER: [text]"
\ No newline at end of file
+ diary << "\[[time_stamp()]]WHISPER: [text]"
+
+/proc/log_emote(text)
+ if (config.log_emote)
+ diary << "\[[time_stamp()]]EMOTE: [text]"
+
+/proc/log_attack(text)
+ if (config.log_attack)
+ diary << "\[[time_stamp()]]ATTACK: [text]"
+/*
+/proc/log_adminsay(text)
+ if (config.log_adminchat)
+ diary << "\[[time_stamp()]]ADMINSAY: [text]"
+*/
+/proc/log_adminwarn(text)
+ if (config.log_adminwarn)
+ diary << "\[[time_stamp()]]ADMINWARN: [text]"
+
+/proc/log_pda(text)
+ if (config.log_pda)
+ diary << "\[[time_stamp()]]PDA: [text]"
\ No newline at end of file
diff --git a/code/game/algorithm.dm b/code/game/algorithm.dm
index 9169d04965..652fd847fb 100644
--- a/code/game/algorithm.dm
+++ b/code/game/algorithm.dm
@@ -6,6 +6,7 @@
Starting up. [time2text(world.timeofday, "hh:mm.ss")]
---------------------
+Dear Diary....
"}
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index b605d40720..d8f46a3f77 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -17,6 +17,9 @@
M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])")
+ log_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey])")
+
+
transfer_soul("VICTIM", M, user)
return
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 233e7edcb7..4a1127247a 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -7,6 +7,7 @@
#define AIRLOCK_WIRE_OPEN_DOOR 7
#define AIRLOCK_WIRE_AI_CONTROL 8
#define AIRLOCK_WIRE_ELECTRIFY 9
+#define AIRLOCK_WIRE_SAFETY 10
/*
New methods:
@@ -30,15 +31,15 @@
//This generates the randomized airlock wire assignments for the game.
/proc/RandomAirlockWires()
//to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else).
- var/list/wires = list(0, 0, 0, 0, 0, 0, 0, 0, 0)
- airlockIndexToFlag = list(0, 0, 0, 0, 0, 0, 0, 0, 0)
- airlockIndexToWireColor = list(0, 0, 0, 0, 0, 0, 0, 0, 0)
- airlockWireColorToIndex = list(0, 0, 0, 0, 0, 0, 0, 0, 0)
+ var/list/wires = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+ airlockIndexToFlag = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+ airlockIndexToWireColor = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+ airlockWireColorToIndex = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
var/flagIndex = 1
- for (var/flag=1, flag<512, flag+=flag)
+ for (var/flag=1, flag<1024, flag+=flag)
var/valid = 0
while (!valid)
- var/colorIndex = rand(1, 9)
+ var/colorIndex = rand(1, 10)
if(wires[colorIndex]==0)
valid = 1
wires[colorIndex] = flag
@@ -66,17 +67,18 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }.
var/spawnPowerRestoreRunning = 0
var/welded = null
var/locked = 0
- var/wires = 511
+ var/wires = 1023
secondsElectrified = 0 //How many seconds remain until the door is no longer electrified. -1 if it is permanently electrified until someone fixes it.
var/aiDisabledIdScanner = 0
var/aiHacking = 0
var/obj/machinery/door/airlock/closeOther = null
var/closeOtherId = null
- var/list/signalers[9]
+ var/list/signalers[10]
var/lockdownbyai = 0
autoclose = 1
var/doortype = 0
var/justzap = 0
+ var/safe = 1
var/obj/item/weapon/airlock_electronics/electronics = null
/obj/machinery/door/airlock/command
@@ -201,8 +203,11 @@ About the new airlock wires panel:
* one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required.
* one wire for AI control. Sending a pulse through this blocks AI control for a second or so (which is enough to see the AI control light on the panel dialog go off and back on again). Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all.
* one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. (Currently it is also STAYING electrified until someone mends the wire)
+* one wire for controling door safetys. When active, door does not close on someone. When cut, door will ruin someone's shit. When pulsed, door will immedately ruin someone's shit.
*/
+
+
/obj/machinery/door/airlock/bumpopen(mob/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite
if(!istype(usr, /mob/living/silicon))
if(src.isElectrified())
@@ -277,7 +282,11 @@ About the new airlock wires panel:
open()
else
close()
-
+ if(AIRLOCK_WIRE_SAFETY)
+ safe = !safe
+ if(!src.density)
+ close()
+ src.updateUsrDialog()
/obj/machinery/door/airlock/proc/cut(var/wireColor)
@@ -313,7 +322,9 @@ About the new airlock wires panel:
//Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted.
if(src.secondsElectrified != -1)
src.secondsElectrified = -1
-
+ if (AIRLOCK_WIRE_SAFETY)
+ safe = 0
+ src.updateUsrDialog()
/obj/machinery/door/airlock/proc/mend(var/wireColor)
var/wireFlag = airlockWireColorToFlag[wireColor]
@@ -342,6 +353,10 @@ About the new airlock wires panel:
if(src.secondsElectrified == -1)
src.secondsElectrified = 0
+ if (AIRLOCK_WIRE_SAFETY)
+ safe = 1
+ src.updateUsrDialog()
+
/obj/machinery/door/airlock/proc/isElectrified()
if(src.secondsElectrified != 0)
return 1
@@ -535,6 +550,14 @@ About the new airlock wires panel:
else
t1 += text("Door is not electrified. Electrify it for 30 seconds? Or, Electrify it indefinitely until someone cancels the electrification?
\n", src, src)
+ if(src.isWireCut(AIRLOCK_WIRE_SAFETY))
+ t1 += text("Door force sensors not responding.
\n")
+ else if(src.safe)
+ t1 += text("Door safeties operating normally. Override?
\n",src)
+ else
+ t1 += text("Danger. Door safeties disabled. Restore?
\n",src)
+
+
if(src.welded)
t1 += text("Door appears to have been welded shut.
\n")
else if(!src.locked)
@@ -639,7 +662,8 @@ About the new airlock wires panel:
"Blue" = 6,
"Green" = 7,
"Grey" = 8,
- "Black" = 9
+ "Black" = 9,
+ "Gold" = 10
)
for(var/wiredesc in wires)
var/is_uncut = src.wires & airlockWireColorToFlag[wires[wiredesc]]
@@ -655,7 +679,7 @@ About the new airlock wires panel:
t1 += "Attach signaler"
t1 += "
"
- t1 += text("
\n[]
\n[]
\n[]", (src.locked ? "The door bolts have fallen!" : "The door bolts look up."), ((src.arePowerSystemsOn() && !(stat & NOPOWER)) ? "The test light is on." : "The test light is off!"), (src.aiControlDisabled==0 ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."))
+ t1 += text("
\n[]
\n[]
\n[]
\n[]", (src.locked ? "The door bolts have fallen!" : "The door bolts look up."), ((src.arePowerSystemsOn() && !(stat & NOPOWER)) ? "The test light is on." : "The test light is off!"), (src.aiControlDisabled==0 ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."), (src.safe==0 ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."))
t1 += text("
Close
\n", src)
@@ -769,6 +793,16 @@ About the new airlock wires panel:
src.secondsElectrified = 0
else if(src.secondsElectrified>0)
src.secondsElectrified = 0
+
+ if(8)
+ // Safeties! We don't need no stinking safeties!
+ if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
+ usr << text("Control to door sensors is disabled.
\n")
+ else if (src.safe)
+ safe = 0
+ else
+ usr << text("Firmware reports safeties already overriden.
\n")
+
if(7)
//close door
if(src.welded)
@@ -780,6 +814,8 @@ About the new airlock wires panel:
else
usr << text("The airlock is already closed.
\n")
+
+
else if(href_list["aiEnable"])
var/code = text2num(href_list["aiEnable"])
switch (code)
@@ -831,6 +867,17 @@ About the new airlock wires panel:
usr << text("The door is already electrified. You can't re-electrify it while it's already electrified.
\n")
else
src.secondsElectrified = -1
+
+ if (8) // Not in order >.>
+ // Safeties! Maybe we do need some stinking safeties!
+ if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
+ usr << text("Control to door sensors is disabled.
\n")
+ else if (!src.safe)
+ safe = 1
+ else
+ usr << text("Firmware reports safeties already in place.
\n")
+
+
if(7)
//open door
if(src.welded)
@@ -999,6 +1046,24 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/close()
if(src.welded || src.locked || (!src.arePowerSystemsOn()) || (stat & NOPOWER) || src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS))
return
+ if(safe)
+ for(var/mob/M in src.loc)
+ M << "The door buzzes angerly."
+ for(var/mob/M in src.loc)
+ spawn (60)
+ close()
+ return
+
+ else // OH FUCK MOVE
+ for(var/mob/M in src.loc)
+ if(isrobot(M))
+ M.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
+ else
+ M.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
+ M.SetStunned(5)
+ M.SetWeakened(5)
+ M.emote("scream")
+
use_power(50)
playsound(src.loc, 'airlock.ogg', 30, 1)
var/obj/structure/window/killthis = (locate(/obj/structure/window) in get_turf(src))
diff --git a/code/game/magic/cultist/ritual.dm b/code/game/magic/cultist/ritual.dm
index d9d31643ef..f32f7eadea 100644
--- a/code/game/magic/cultist/ritual.dm
+++ b/code/game/magic/cultist/ritual.dm
@@ -457,6 +457,9 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
M.attack_log += text("\[[time_stamp()]\] Has had the [name] used on him by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used [name] on [M.name] ([M.ckey])")
+ log_attack("[user.name] ([user.ckey]) used [name] on [M.name] ([M.ckey])")
+
+
if(istype(M,/mob/dead))
M.invisibility = 0
user.visible_message( \
diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm
index 6709d03782..3b28b8b54f 100644
--- a/code/game/objects/devices/PDA/PDA.dm
+++ b/code/game/objects/devices/PDA/PDA.dm
@@ -516,6 +516,7 @@
playsound(P.loc, 'twobeep.ogg', 50, 1)
+ log_pda("[usr] (PDA: [src.owner]) sent \"[t]\" to [P.owner]")
if("Send Honk")//Honk virus
diff --git a/code/game/objects/devices/aicard.dm b/code/game/objects/devices/aicard.dm
index 11c7f1c7ed..725b7d12df 100644
--- a/code/game/objects/devices/aicard.dm
+++ b/code/game/objects/devices/aicard.dm
@@ -16,6 +16,9 @@
M.attack_log += text("\[[time_stamp()]\] Has been carded with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to card [M.name] ([M.ckey])")
+ log_attack("[user.name] ([user.ckey]) used the [src.name] to card [M.name] ([M.ckey])")
+
+
transfer_ai("AICORE", "AICARD", M, user)
return
diff --git a/code/game/objects/devices/flash.dm b/code/game/objects/devices/flash.dm
index 20ec9617a8..f5be7fa0bd 100644
--- a/code/game/objects/devices/flash.dm
+++ b/code/game/objects/devices/flash.dm
@@ -25,6 +25,10 @@
attack(mob/living/M as mob, mob/user as mob)
M.attack_log += text("\[[time_stamp()]\] Has been flashed (attempt) with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to flash [M.name] ([M.ckey])")
+
+ log_attack("[user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey])")
+
+
if(!clown_check(user)) return
if(broken)
user.show_message("\red The [src.name] is broken", 2)
diff --git a/code/game/objects/devices/flashlight.dm b/code/game/objects/devices/flashlight.dm
index 2d723d933c..065c562323 100644
--- a/code/game/objects/devices/flashlight.dm
+++ b/code/game/objects/devices/flashlight.dm
@@ -93,6 +93,10 @@
M << "\red You feel a tiny prick!"
M.attack_log += text("\[[time_stamp()]\] Has been stabbed with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to stab [M.name] ([M.ckey])")
+
+ log_attack("[user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])")
+
+
..()
return
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 7af85a7086..00f4be6007 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -50,6 +50,9 @@
if(!M.handcuffed)
M.attack_log += text("\[[time_stamp()]\] Has been handcuffed (attempt) by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Attempted to handcuff [M.name] ([M.ckey])")
+
+ log_attack("[user.name] ([user.ckey]) Attempted to handcuff [M.name] ([M.ckey])")
+
var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
O.source = user
O.target = M
@@ -172,6 +175,10 @@
M << "\red You feel a tiny prick!"
M.attack_log += text("\[[time_stamp()]\] Has been stabbed with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to stab [M.name] ([M.ckey])")
+
+ log_attack("[user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])")
+
+
return
/obj/item/weapon/pen/sleepypen
diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm
index 61f999fac9..b0ea5313cc 100644
--- a/code/game/objects/items/item.dm
+++ b/code/game/objects/items/item.dm
@@ -245,6 +245,8 @@
user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
+ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
//spawn(1800) // this wont work right
// M.lastattacker = null
/////////////////////////
@@ -374,6 +376,8 @@
user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
+ log_attack(" [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
src.add_fingerprint(user)
//if((user.mutations & CLUMSY) && prob(50))
// M = user
diff --git a/code/game/objects/items/robot_items.dm b/code/game/objects/items/robot_items.dm
index 43ddfc7fdc..25d156ed13 100644
--- a/code/game/objects/items/robot_items.dm
+++ b/code/game/objects/items/robot_items.dm
@@ -10,6 +10,9 @@
attack(mob/M as mob, mob/living/silicon/robot/user as mob)
M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+
+ log_attack(" [user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])")
+
user.cell.charge -= 30
M.Weaken(5)
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index f7e0bae3cd..848327c6da 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -63,6 +63,8 @@
M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [M.name] ([M.ckey])")
+ log_attack("[user.name] ([user.ckey]) used the [name] to inject [M.name] ([M.ckey])")
+
if (user)
if (istype(M, /mob/living/carbon/human))
var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 106106d1b9..90f1b23fa7 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -11,7 +11,10 @@
user << "Planting explosives..."
if(ismob(target))
user.attack_log += "\[[time_stamp()]\] [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])"
+ log_attack(" [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])")
user.visible_message("\red [user.name] is trying to plant some kind of explosive on [target.name]!")
+
+
if(do_after(user, 50) && in_range(user, target))
user.drop_item()
target = target
diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm
index 3f9e47750b..19330e131f 100644
--- a/code/game/objects/items/weapons/hydroponics.dm
+++ b/code/game/objects/items/weapons/hydroponics.dm
@@ -118,6 +118,8 @@ Deathnettle
M.attack_log += text("\[[time_stamp()]\] Had the [src.name] used on them by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] on [M.name] ([M.ckey])")
+ log_attack(" [user.name] ([user.ckey]) used the [src.name] on [M.name] ([M.ckey])")
+
M.eye_blurry += force/7
if(prob(20))
M.Paralyse(force/6)
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index 59965024af..124dd2f979 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -28,6 +28,8 @@
O.show_message("\red [M] has been implanted by [user].", 1)
M.attack_log += text("\[[time_stamp()]\] Implanted with [src.name] ([src.imp.name]) by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] ([src.imp.name]) to implant [M.name] ([M.ckey])")
+ log_attack("[user.name] ([user.ckey]) implanted [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
src.imp.loc = M
src.imp.imp_in = M
src.imp.implanted = 1
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 6866fae1a6..1911f95dc0 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -55,6 +55,8 @@ KNIFE
M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+ log_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])")
+
if (M.stat < 2 && M.health < 50 && prob(90))
var/mob/H = M
// ******* Check
@@ -129,6 +131,9 @@ KNIFE
M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+ log_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey])")
+
+
if(prob(15))
M.Weaken(3)
M.take_organ_damage(3)
diff --git a/code/game/objects/items/weapons/papers_bins.dm b/code/game/objects/items/weapons/papers_bins.dm
index 0b2c91fbaa..a43fecd602 100644
--- a/code/game/objects/items/weapons/papers_bins.dm
+++ b/code/game/objects/items/weapons/papers_bins.dm
@@ -481,6 +481,8 @@ CLIPBOARDS
target.attack_log += text("\[[time_stamp()]\] Has been wrapped with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to wrap [target.name] ([target.ckey])")
+ log_attack("[user.name] ([user.ckey]) used the [src.name] to wrap [target.name] ([target.ckey])")
+
else
user << "/blue You need more paper."
else
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 4180f9e34a..b074576879 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -545,6 +545,9 @@ CIRCULAR SAW
user.attack_log += "\[[time_stamp()]\] Debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
M.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
+ log_attack("[user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
+
var/obj/item/brain/B = new(M.loc)
B.transfer_identity(M)
diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm
index b8d02b4d7e..8379357359 100644
--- a/code/game/objects/items/weapons/swords_axes_etc.dm
+++ b/code/game/objects/items/weapons/swords_axes_etc.dm
@@ -129,6 +129,10 @@ STUN BATON
M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey]) (INTENT: [uppertext(user.a_intent)])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey]) (INTENT: [uppertext(user.a_intent)])")
+ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
+
+
if(isrobot(M))
..()
return
@@ -200,6 +204,9 @@ STUN BATON
M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
+
if (user.a_intent == "hurt")
if(!..()) return
playsound(src.loc, "swing_hit", 50, 1, -1)
diff --git a/code/game/objects/secstorage/sbriefcase.dm b/code/game/objects/secstorage/sbriefcase.dm
index 472d9b33fa..535e4b407c 100644
--- a/code/game/objects/secstorage/sbriefcase.dm
+++ b/code/game/objects/secstorage/sbriefcase.dm
@@ -26,6 +26,8 @@
M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
var/t = user:zone_sel.selecting
if (t == "head")
if (M.stat < 2 && M.health < 50 && prob(90))
diff --git a/code/game/objects/storage/bible.dm b/code/game/objects/storage/bible.dm
index f8d409bc87..4e4b65fe45 100644
--- a/code/game/objects/storage/bible.dm
+++ b/code/game/objects/storage/bible.dm
@@ -25,6 +25,8 @@
M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
user << "\red You don't have the dexterity to do this!"
return
diff --git a/code/game/objects/storage/briefcase.dm b/code/game/objects/storage/briefcase.dm
index a2dd6970cd..417b3b29eb 100644
--- a/code/game/objects/storage/briefcase.dm
+++ b/code/game/objects/storage/briefcase.dm
@@ -21,6 +21,8 @@
M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
if (M.stat < 2 && M.health < 50 && prob(90))
var/mob/H = M
// ******* Check
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index e700b36579..80b46cad17 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -2,6 +2,7 @@
////////////////////////////////
/proc/message_admins(var/text, var/admin_ref = 0)
var/rendered = "ADMIN LOG: [text]"
+ log_adminwarn(rendered)
for (var/mob/M in world)
if (M && M.client && M.client.holder && M.client.authenticated)
if (admin_ref)
@@ -9,6 +10,7 @@
else
M << rendered
+
/obj/admins/Topic(href, href_list)
..()
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index 5e0ebc2895..7061259b23 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -357,7 +357,15 @@
usr << "\red The grenade launcher cannot hold more grenades."
afterattack(obj/target, mob/user , flag)
- if(target == user) return
+
+ if (istype(target, /obj/item/weapon/storage/backpack ))
+ return
+
+ else if (locate (/obj/structure/table, src.loc))
+ return
+
+ else if(target == user)
+ return
if(grenades.len)
spawn(0) fire_grenade(target,user)
@@ -366,6 +374,59 @@
proc
fire_grenade(atom/target, mob/user)
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message(text("\red [] fired a grenade!", user), 1)
+ user << "\red You fire the grenade launcher!"
+ if (istype(grenades[1], /obj/item/weapon/chem_grenade))
+ var/obj/item/weapon/chem_grenade/F = grenades[1]
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2)
+ message_admins("[key_name_admin(user)] fired a chemistry grenade from a grenade launcher ([src.name]).")
+ log_game("[key_name_admin(user)] used a chemistry grenade ([src.name]).")
+ F.state = 1
+ F.icon_state = initial(icon_state)+"_armed"
+ playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.explode()
+ else if (istype(grenades[1], /obj/item/weapon/flashbang))
+ var/obj/item/weapon/flashbang/F = grenades[1]
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2)
+ F.active = 1
+ F.icon_state = "flashbang1"
+ playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.prime()
+ else if (istype(grenades[1], /obj/item/weapon/smokebomb))
+ var/obj/item/weapon/smokebomb/F = grenades[1]
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2)
+ F.icon_state = "flashbang1"
+ playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.prime()
+ else if (istype(grenades[1], /obj/item/weapon/mustardbomb))
+ var/obj/item/weapon/mustardbomb/F = grenades[1]
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2)
+ F.icon_state = "flashbang1"
+ playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.prime()
+ else if (istype(grenades[1], /obj/item/weapon/empgrenade))
+ var/obj/item/weapon/empgrenade/F = grenades[1]
+ grenades -= F
+ F.loc = user.loc
+ F.throw_at(target, 30, 2)
+ F.active = 1
+ F.icon_state = "empar"
+ playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(15)
+ F.prime()
if (locate (/obj/structure/table, src.loc) || locate (/obj/item/weapon/storage, src.loc))
return
else
@@ -1196,6 +1257,10 @@
M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [M.name] ([M.ckey])")
+
+ log_attack("[user.name] ([user.ckey]) injected [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
+
src.reagents.reaction(M, INGEST)
if(M.reagents)
var/trans = reagents.trans_to(M, amount_per_transfer_from_this)
@@ -1310,6 +1375,8 @@
M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: \ref[reagents]")
user.attack_log += text("\[[time_stamp()]\] Fed [M.name] by [M.name] ([M.ckey]) Reagents: \ref[reagents]")
+ log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
for(var/mob/O in viewers(world.view, user))
O.show_message("\red [user] feeds [M] [src].", 1)
@@ -1480,6 +1547,8 @@
M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: \ref[reagents]")
user.attack_log += text("\[[time_stamp()]\] Fed [M.name] by [M.name] ([M.ckey]) Reagents: \ref[reagents]")
+ log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
if(reagents.total_volume)
reagents.reaction(M, INGEST)
@@ -1602,6 +1671,8 @@
user.attack_log += text("\[[time_stamp()]\] Fed [M.name] by [M.name] ([M.ckey]) Reagents: \ref[reagents]")
+ log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
if(reagents.total_volume)
reagents.reaction(M, INGEST)
spawn(5)
@@ -2204,6 +2275,8 @@
user.attack_log += text("\[[time_stamp()]\] Fed [src.name] by [M.name] ([M.ckey]) Reagents: \ref[reagents]")
+ log_attack("[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])")
+
if(reagents.total_volume)
reagents.reaction(M, INGEST)
spawn(5)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
index 179406c1e0..0c5b6fc258 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/emote.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
@@ -97,6 +97,7 @@
else
src << text("Invalid Emote: []", act)
if ((message && src.stat == 0))
+ log_emote("[name]/[key] : [message]")
if (act == "roar")
playsound(src.loc, 'hiss5.ogg', 40, 1, 1)
if (act == "deathgasp")
diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm
index a7000423f6..0a030a6656 100644
--- a/code/modules/mob/living/carbon/alien/larva/emote.dm
+++ b/code/modules/mob/living/carbon/alien/larva/emote.dm
@@ -94,6 +94,7 @@
else
src << text("Invalid Emote: []", act)
if ((message && src.stat == 0))
+ log_emote("[name]/[key] : [message]")
if (m_type & 1)
for(var/mob/O in viewers(src, null))
O.show_message(message, m_type)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 702e771e03..3a7b6e0a67 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -461,6 +461,7 @@
src << "\blue Unusable emote '[act]'. Say *help for a list."
if (message)
+ log_emote("[name]/[key] : [message]")
if (m_type & 1)
for (var/mob/O in viewers(src, null))
O.show_message(message, m_type)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 4ed7847acb..8486397727 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -17,6 +17,11 @@
visible_message("\red [src] has been touched with the stun gloves by [M]!")
M.attack_log += text("\[[time_stamp()]\] Stungloved [src.name] ([src.ckey])")
src.attack_log += text("\[[time_stamp()]\] Has been stungloved by [M.name] ([M.ckey])")
+
+
+ log_attack("[M.name] ([M.ckey]) stungloved [src.name] ([src.ckey])")
+
+
var/armorblock = run_armor_check(M.zone_sel.selecting, "energy")
apply_effects(5,5,0,0,5,0,0,armorblock)
return 1
@@ -73,6 +78,9 @@
M.attack_log += text("\[[time_stamp()]\] Punched [src.name] ([src.ckey])")
src.attack_log += text("\[[time_stamp()]\] Has been punched by [M.name] ([M.ckey])")
+ log_attack("[M.name] ([M.ckey]) punched [src.name] ([src.ckey])")
+
+
var/damage = rand(0, 9)
if(!damage)
playsound(loc, 'punchmiss.ogg', 25, 1, -1)
@@ -97,6 +105,10 @@
M.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])")
src.attack_log += text("\[[time_stamp()]\] Has been disarmed by [M.name] ([M.ckey])")
+
+ log_attack("[M.name] ([M.ckey]) disarmed [src.name] ([src.ckey])")
+
+
if(w_uniform)
w_uniform.add_fingerprint(M)
var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
diff --git a/code/modules/mob/living/carbon/monkey/emote.dm b/code/modules/mob/living/carbon/monkey/emote.dm
index 6f26f53e81..fe070e8300 100644
--- a/code/modules/mob/living/carbon/monkey/emote.dm
+++ b/code/modules/mob/living/carbon/monkey/emote.dm
@@ -97,6 +97,8 @@
else
src << text("Invalid Emote: []", act)
if ((message && src.stat == 0))
+ if(src.client)
+ log_emote("[name]/[key] : [message]")
if (m_type & 1)
for(var/mob/O in viewers(src, null))
O.show_message(message, m_type)
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 5abc6e8516..f190b17557 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -160,6 +160,7 @@
affecting.loc = assailant.loc
affecting.attack_log += text("\[[time_stamp()]\] Has had their neck grabbed by [assailant.name] ([assailant.ckey])")
assailant.attack_log += text("\[[time_stamp()]\] Grabbed the neck of [affecting.name] ([affecting.ckey])")
+ log_attack("[assailant.name] ([assailant.ckey]) grabbed the neck of [affecting.name] ([affecting.ckey])")
hud1.icon_state = "disarm/kill"
hud1.name = "disarm/kill"
else
@@ -170,6 +171,8 @@
O.show_message(text("\red [] has tightened his grip on []'s neck!", assailant, affecting), 1)
affecting.attack_log += text("\[[time_stamp()]\] Has been strangled (kill intent) by [assailant.name] ([assailant.ckey])")
assailant.attack_log += text("\[[time_stamp()]\] Strangled (kill intent) [affecting.name] ([affecting.ckey])")
+ log_attack("[assailant.name] ([assailant.ckey]) Strangled (kill intent) [affecting.name] ([affecting.ckey])")
+
assailant.next_move = world.time + 10
affecting.losebreath += 1
hud1.icon_state = "disarm/kill1"
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 673bd49982..0a146ef3fd 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -77,8 +77,13 @@
if(istype(firer, /mob))
M.attack_log += text("\[[]\] []/[] shot []/[] with a []", time_stamp(), firer, firer.ckey, M, M.ckey, src)
firer.attack_log += text("\[[]\] []/[] shot []/[] with a []", time_stamp(), firer, firer.ckey, M, M.ckey, src)
+ log_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src]")
+
else
M.attack_log += text("\[[]\] UNKNOWN SUBJECT (No longer exists) shot []/[] with a []", time_stamp(), M, M.ckey, src)
+ log_attack("UNKNOWN shot [M] ([M.ckey]) with a [src]")
+
+
spawn(0)
if(A)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 914d20f9fa..f67d9e4668 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -86,7 +86,7 @@
attack(target as obj, mob/user as mob)
user.attack_log += text("\[[time_stamp()]\] Has used [src.name] on \ref[target]")
-
+ log_attack("[user] ([user.ckey]) has used [src.name] on \ref[target]")
if (istype(target, /obj/item))
var/obj/item/O = target
if(!istype(loc,/turf))
diff --git a/code/setup.dm b/code/setup.dm
index 54ffca9f04..0351dcff1c 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -26,6 +26,8 @@
#define WARNING_LOW_PRESSURE HAZARD_LOW_PRESSURE*2.5
#define MAX_PRESSURE_DAMAGE 20
+// Doors!
+#define DOOR_CRUSH_DAMAGE 35
// Factor of how fast mob nutrition decreases
#define HUNGER_FACTOR 0.1
diff --git a/code/unused/computer2/messenger.dm b/code/unused/computer2/messenger.dm
index 58c3037329..50f6e6f275 100644
--- a/code/unused/computer2/messenger.dm
+++ b/code/unused/computer2/messenger.dm
@@ -46,6 +46,7 @@
signal.data["data"] = t
signal.data["sender"] = src.screen_name
src.messages += "→ You:
[t]
"
+
peripheral_command("send signal", signal)
if(href_list["func_msg"])
diff --git a/code/unused/pda2/base_os.dm b/code/unused/pda2/base_os.dm
index 09b4399f15..fae00e9d7f 100644
--- a/code/unused/pda2/base_os.dm
+++ b/code/unused/pda2/base_os.dm
@@ -281,6 +281,7 @@
signal.data["tag"] = "\ref[P]"
src.post_signal(signal)
src.message_note += "→ To [P.owner]:
[t]
"
+ log_pda("[usr] sent [t] to [P.owner]")
if("rename")
var/datum/computer/file/F = locate(href_list["target"])
diff --git a/config/config.txt b/config/config.txt
index 7c4e6bf8b8..7e4ab713c9 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -27,6 +27,18 @@ LOG_VOTE
## log client Whisper
LOG_WHISPER
+## log emotes
+LOG_EMOTE
+
+## log attack messages
+LOG_ATTACK
+
+## log pda messages
+LOG_PDA
+
+## log admin warning messages
+##LOG_ADMINWARN ## Also duplicates a bunch of other messages.
+
## sql switching
# SQL_ENABLED
diff --git a/html/changelog.html b/html/changelog.html
index deb7614e6b..b642cb9ec5 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -39,7 +39,7 @@
Credits:
- Coders: TLE, NEO, Errorage, muskets, veryinky, Skie, Noise, Numbers, Agouri, Noka, Urist McDorf, Uhangi, Darem, Mport, rastaf0, Doohl, Superxpdude, Rockdtben, ConstantA, Petethegoat, Kor
+ Coders: TLE, NEO, Errorage, muskets, veryinky, Skie, Noise, Numbers, Agouri, Noka, Urist McDorf, Uhangi, Darem, Mport, rastaf0, Doohl, Superxpdude, Rockdtben, ConstantA, Petethegoat, Kor, Polymorph
Spriters: Agouri, Cheridan, Cruazy Guest, Deeaych, Deuryn, Matty406, Microwave, ShiftyEyesShady, Skie, Uhangi, Veyveyr, Petethegoat, Kor
Sounds: Skie, Lasty/Vinyl
Thanks to: CDK Station devs, GoonStation devs, the original SpaceStation developers and Erikat for the title image
@@ -66,6 +66,12 @@ should be listed in the changelog upon commit tho. Thanks. -->
- XENOS ARE NOW IMMUNE TO STUNNING! To compensate, stunning via tasers/batons now slows them down significantly.
+
+ Polymorph updated:
+
+ - Doors no longer close if they have a mob in the tile. (Generally!) Door safties can now be overriden to close a door with a mob in the tile and injure them severely.
+
+
29 December 2011
|