TG: Added a new logging system that can be used for various things in the game (such

as the singularity engine, AI interactions, anything-else that may be suggested
to me :P).

At the moment it only logs some singularity things. Please let me know if there
are any important methods of singulo-grief which I may have missed.

The "Investigate" verb is available to everyone of rank "Admin observer" and
upwards. Just type "Investigate" and select the subject you'd like to see logs
for. Typing "Investigate singulo" will also work as a shortcut.
Revision: r3679
Author: 	 elly1...@rocketmail.com

TG: Disposal/Pipe Dispenser can no longer be used 'remotely' or while stunned or
while they are unwrenched. Fixes  issue 517 .

Can no longer eject the nuke disk from the nuke while stunned. Fixes  issue 497 .

PA can now be powered down again.

Cyborg 'skull' masks now have east and west facing sprites. Fixes  issue 468 .
- I encourage anyone with actual spriting skills to redo them though, I just
spent 5 second in photoshop whipping these up. (icons/mob/mask.dmi the icon
labeled 'Death')
Revision: r3681
Author: 	 johnsonmt88
This commit is contained in:
Erthilo
2012-05-29 01:45:03 +01:00
parent 84ce5877c8
commit 41b45396f4
17 changed files with 229 additions and 166 deletions
+43
View File
@@ -0,0 +1,43 @@
//By Carnwennan
//This system was made as an alternative to all the in-game lists and variables used to log stuff in-game.
//lists and variables are great. However, they have several major flaws:
//Firstly, they use memory. TGstation has one of the highest memory usage of all the ss13 branches.
//Secondly, they are usually stored in an object. This means that they aren't centralised. It also means that
//the data is lost when the object is deleted! This is especially annoying for things like the singulo engine!
#define INVESTIGATE_DIR "data/investigate/"
//SYSTEM
/proc/investigate_subject2file(var/subject)
switch(subject)
if("singulo")
return file("[INVESTIGATE_DIR]singulo.html")
if("silicon")
return file("[INVESTIGATE_DIR]silicon.html")
else
return
/proc/investigate_reset()
if(fdel(INVESTIGATE_DIR)) return 1
return 0
/atom/proc/investigate_log(var/message, var/subject)
if(!message) return
var/F = investigate_subject2file(subject)
if(!F) return
F << "<small>[time2text(world.timeofday,"hh:mm")] \ref[src] ([x],[y],[z])</small> || [src] [message]<br>"
//ADMINVERBS
/client/proc/investigate_show( subject in list("singulo","silicon") )
set name = "Investigate"
set category = "Admin"
if(!holder) return
var/F = investigate_subject2file(subject)
if(!F)
src << "<font color='red'>Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.</font>"
return
src << browse(F,"window=investigate;size=800x300")
+3 -1
View File
@@ -105,6 +105,7 @@
//Admin Observer
if (holder.level >= -1)
verbs += /client/proc/investigate_show
verbs += /client/proc/cmd_admin_say
verbs += /client/proc/cmd_admin_gib_self
verbs += /client/proc/deadmin_self
@@ -423,10 +424,11 @@
verbs -= /client/proc/deadmin_self
verbs -= /client/proc/jumptocoord
verbs -= /client/proc/everyone_random
verbs -= /client/proc/giveruntimelog //used by coders to retrieve runtime logs
verbs -= /client/proc/giveruntimelog //used by coders to retrieve runtime logs
verbs -= /client/proc/getserverlog
verbs -= /client/proc/cinematic //show a cinematic sequence
verbs -= /client/proc/admin_memo
verbs -= /client/proc/investigate_show
verbs -= /client/proc/cmd_admin_change_custom_event
verbs -= /client/proc/admin_invis
verbs -= /client/proc/callprocgen
+48 -48
View File
@@ -9,16 +9,16 @@
directwired = 1
req_access = list(access_engine)
// use_power = 0
var
obj/item/weapon/tank/plasma/P = null
last_power = 0
active = 0
locked = 0
drainratio = 1
var/obj/item/weapon/tank/plasma/P = null
var/last_power = 0
var/active = 0
var/locked = 0
var/drainratio = 1
process()
if(P)
if(P.air_contents.toxins <= 0)
investigate_log("<font color='red'>out of fuel</font>.","singulo")
P.air_contents.toxins = 0
eject()
else
@@ -32,6 +32,7 @@
toggle_power()
user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
"You turn the [src.name] [active? "on":"off"].")
investigate_log("turned [active?"<font color='green'>on</font>":"<font color='red'>off</font>"] by [user.key]. [P?"Fuel: [round(P.air_contents.toxins/0.29)]%":"<font color='red'>It is empty</font>"].","singulo")
return
else
user << "\red The controls are locked!"
@@ -96,48 +97,47 @@
return ..()
proc
eject()
var/obj/item/weapon/tank/plasma/Z = src.P
if (!Z)
return
Z.loc = get_turf(src)
Z.layer = initial(Z.layer)
src.P = null
if(active)
toggle_power()
else
updateicon()
receive_pulse(var/pulse_strength)
if(P && active)
var/power_produced = 0
power_produced = P.air_contents.toxins*pulse_strength*20
add_avail(power_produced)
last_power = power_produced
return
proc/eject()
locked = 0
var/obj/item/weapon/tank/plasma/Z = src.P
if (!Z)
return
updateicon()
overlays = null
if(P)
overlays += image('singularity.dmi', "ptank")
if(stat & (NOPOWER|BROKEN))
return
if(active)
overlays += image('singularity.dmi', "on")
toggle_power()
active = !active
if(active)
icon_state = "ca_on"
flick("ca_active", src)
else
icon_state = "ca"
flick("ca_deactive", src)
Z.loc = get_turf(src)
Z.layer = initial(Z.layer)
src.P = null
if(active)
toggle_power()
else
updateicon()
return
proc/receive_pulse(var/pulse_strength)
if(P && active)
var/power_produced = 0
power_produced = P.air_contents.toxins*pulse_strength*20
add_avail(power_produced)
last_power = power_produced
return
return
proc/updateicon()
overlays = null
if(P)
overlays += image('singularity.dmi', "ptank")
if(stat & (NOPOWER|BROKEN))
return
if(active)
overlays += image('singularity.dmi', "on")
proc/toggle_power()
active = !active
if(active)
icon_state = "ca_on"
flick("ca_active", src)
else
icon_state = "ca"
flick("ca_deactive", src)
updateicon()
return
+15 -11
View File
@@ -11,16 +11,15 @@
idle_power_usage = 10
active_power_usage = 300
var
frequency = 1
active = 0
fire_delay = 100
last_shot = 0
shot_number = 0
state = 0
locked = 0
energy = 0
mega_energy = 0
var/frequency = 1
var/active = 0
var/fire_delay = 100
var/last_shot = 0
var/shot_number = 0
var/state = 0
var/locked = 0
var/energy = 0
var/mega_energy = 0
verb/rotate()
@@ -39,6 +38,9 @@
..()
return
Del()
investigate_log("<font color='red'>deleted</font> at ([x],[y],[z])","singulo")
..()
update_icon()
if (active && !(stat & (NOPOWER|BROKEN)))
@@ -55,12 +57,14 @@
src.active = 0
user << "You turn off the [src]."
src.use_power = 1
investigate_log("turned <font color='red'>off</font> by [user.key]","singulo")
else
src.active = 1
user << "You turn on the [src]."
src.shot_number = 0
src.fire_delay = 100
src.use_power = 2
investigate_log("turned <font color='green'>on</font> by [user.key]","singulo")
update_icon()
else
user << "\red The controls are locked!"
@@ -207,4 +211,4 @@
power_change()
..()
update_icon()
return
return
@@ -20,17 +20,16 @@ field_generator power level display
anchored = 0
density = 1
use_power = 0
var
const/num_power_levels = 6 // Total number of power level icon has
Varedit_start = 0
Varpower = 0
active = 0
power = 20 // Current amount of power
state = 0
warming_up = 0
list/obj/machinery/containment_field/fields
list/obj/machinery/field_generator/connected_gens
clean_up = 0
var/const/num_power_levels = 6 // Total number of power level icon has
var/Varedit_start = 0
var/Varpower = 0
var/active = 0
var/power = 20 // Current amount of power
var/state = 0
var/warming_up = 0
var/list/obj/machinery/containment_field/fields
var/list/obj/machinery/field_generator/connected_gens
var/clean_up = 0
update_icon()
@@ -87,6 +86,8 @@ field_generator power level display
"You turn on the [src.name].", \
"You hear heavy droning")
turn_on()
investigate_log("<font color='green'>activated</font> by [user.key].","singulo")
src.add_fingerprint(user)
else
user << "The [src] needs to be firmly secured to the floor first."
@@ -214,6 +215,7 @@ field_generator power level display
for(var/mob/M in viewers(src))
M.show_message("\red The [src.name] shuts down!")
turn_off()
investigate_log("ran out of power and <font color='red'>deactivated</font>","singulo")
src.power = 0
return 0
@@ -0,0 +1,4 @@
/area/engine/engineering/poweralert(var/state, var/source)
if (state != poweralm)
investigate_log("has a power alarm!","singulo")
..()
@@ -62,13 +62,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
icon_state = "none"
anchored = 0
density = 1
var
obj/machinery/particle_accelerator/control_box/master = null
construction_state = 0
reference = null
powered = 0
strength = null
desc_holder = null
var/obj/machinery/particle_accelerator/control_box/master = null
var/construction_state = 0
var/reference = null
var/powered = 0
var/strength = null
var/desc_holder = null
end_cap
name = "Alpha Particle Generation Array"
@@ -151,6 +150,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return
Move()
..()
if(master && master.active)
master.toggle_power()
investigate_log("was moved whilst active; it <font color='red'>powered down</font>.","singulo")
ex_act(severity)
switch(severity)
if(1.0)
@@ -181,9 +186,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
update_icon()
switch(construction_state)
if(0)
icon_state="[reference]"
if(1)
if(0,1)
icon_state="[reference]"
if(2)
icon_state="[reference]w"
@@ -291,13 +294,12 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
use_power = 0
idle_power_usage = 0
active_power_usage = 0
var
construction_state = 0
active = 0
reference = null
powered = null
strength = 0
desc_holder = null
var/construction_state = 0
var/active = 0
var/reference = null
var/powered = null
var/strength = 0
var/desc_holder = null
verb/rotate()
@@ -376,7 +378,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
del(src)
return
proc
update_state()
return 0
@@ -440,4 +441,4 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
use_power = 1
update_icon()
return 1
return 0
return 0
@@ -11,10 +11,9 @@
active_power_usage = 10000
construction_state = 0
active = 0
var
list/obj/structure/particle_accelerator/connected_parts
assembled = 0
parts = null
var/list/obj/structure/particle_accelerator/connected_parts
var/assembled = 0
var/parts = null
New()
@@ -48,7 +47,6 @@
if(use_power)
icon_state = "[reference]p"
else
icon_state = "[reference]c"
switch(construction_state)
if(0)
icon_state = "[reference]"
@@ -56,7 +54,7 @@
icon_state = "[reference]"
if(2)
icon_state = "[reference]w"
if(3)
else
icon_state = "[reference]c"
return
@@ -78,34 +76,34 @@
return
if(href_list["togglep"])
src.toggle_power()
investigate_log("turned [active?"<font color='red'>ON</font>":"<font color='green'>OFF</font>"] by [usr.key]","singulo")
message_admins("[usr] toggled particle accelerator power to [active ? "on" : "off"].")
log_admin("[usr] toggled particle accelerator power to [active ? "on" : "off"].")
if(href_list["scan"])
else if(href_list["scan"])
src.part_scan()
if(href_list["strengthup"])
src.strength++
else if(href_list["strengthup"])
strength++
if(strength > 2)
strength = 2
else
investigate_log("increased to <font color='red'>[strength]</font> by [usr.key]","singulo")
message_admins("[usr] increased particle accelerator power to [strength].")
log_admin("[usr] increased particle accelerator power to [strength].")
for(var/obj/structure/particle_accelerator/part in connected_parts)
part.strength++
part.strength = strength
part.update_icon()
if(src.strength > 2)
src.strength = 2
for(var/obj/structure/particle_accelerator/part in connected_parts)
part.strength = 2
part.update_icon()
message_admins("[usr] increased particle accelerator power to [strength].")
log_admin("[usr] increased particle accelerator power to [strength].")
if(href_list["strengthdown"])
src.strength--
else if(href_list["strengthdown"])
strength--
if(strength < 0)
strength = 0
else
message_admins("[usr] decreased particle accelerator power to [strength].")
log_admin("[usr] decreased particle accelerator power to [strength].")
investigate_log("decreased to <font color='green'>[strength]</font> by [usr.key]","singulo")
for(var/obj/structure/particle_accelerator/part in connected_parts)
part.strength--
part.strength = strength
part.update_icon()
if(src.strength < 0)
src.strength = 0
for(var/obj/structure/particle_accelerator/part in connected_parts)
part.strength = 0
part.update_icon()
message_admins("[usr] decreased particle accelerator power to [strength].")
log_admin("[usr] decreased particle accelerator power to [strength].")
src.updateDialog()
src.update_icon()
return
@@ -123,14 +121,15 @@
process()
if(src.active)
//a part is missing!
if( length(connected_parts) < 6 )
investigate_log("lost a connected part; It <font color='red'>powered down</font>.","singulo")
src.toggle_power()
return
//emit some particles
for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts)
if(PE)
PE.emit_particle(src.strength)
// for(var/obj/structure/particle_accelerator/fuel_chamber/PF in connected_parts)
// PF.doshit()
// for(var/obj/structure/particle_accelerator/power_box/PB in connected_parts)
// PB.doshit()
//finish up putting the fuel run and power use things in here
return
+29 -29
View File
@@ -15,23 +15,22 @@ var/global/list/uneatable = list(
layer = 6
unacidable = 1 //Don't comment this out.
use_power = 0
var
current_size = 1
allowed_size = 1
contained = 1 //Are we going to move around?
energy = 100 //How strong are we?
dissipate = 1 //Do we lose energy over time?
dissipate_delay = 10
dissipate_track = 0
dissipate_strength = 1 //How much energy do we lose?
move_self = 1 //Do we move on our own?
grav_pull = 4 //How many tiles out do we pull?
consume_range = 0 //How many tiles out do we eat
event_chance = 15 //Prob for event each tick
target = null //its target. moves towards the target if it has one
last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
teleport_del = 0
last_warning
var/current_size = 1
var/allowed_size = 1
var/contained = 1 //Are we going to move around?
var/energy = 100 //How strong are we?
var/dissipate = 1 //Do we lose energy over time?
var/dissipate_delay = 10
var/dissipate_track = 0
var/dissipate_strength = 1 //How much energy do we lose?
var/move_self = 1 //Do we move on our own?
var/grav_pull = 4 //How many tiles out do we pull?
var/consume_range = 0 //How many tiles out do we eat
var/event_chance = 15 //Prob for event each tick
var/target = null //its target. moves towards the target if it has one
var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
var/teleport_del = 0
var/last_warning
New(loc, var/starting_energy = 50, var/temp = 0)
//CARN: admin-alert for chuckle-fuckery.
@@ -41,6 +40,7 @@ var/global/list/uneatable = list(
count = 1
break
if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1)
investigate_log("was created. [count?"":"<font color='red'>No containment fields were active</font>"]","singulo")
src.energy = starting_energy
if(temp)
@@ -93,17 +93,16 @@ var/global/list/uneatable = list(
process()
spawn(0)
eat()
dissipate()
check_energy()
if(current_size >= 3)
move()
if(current_size <= 7)
pulse()
if(current_size >= 5)
if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
event()
eat()
dissipate()
check_energy()
if(current_size >= 3)
move()
if(current_size <= 7)
pulse()
if(current_size >= 5)
if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
event()
return
@@ -183,6 +182,7 @@ var/global/list/uneatable = list(
consume_range = 4
dissipate = 0 //It cant go smaller due to e loss
if(current_size == allowed_size)
investigate_log("<font color='red'>grew to size [current_size]</font>","singulo")
return 1
else if(current_size < (--temp_allowed_size))
expand(temp_allowed_size)
@@ -552,4 +552,4 @@ var/global/list/uneatable = list(
consume(X)
if(defer_powernet_rebuild != 2)
defer_powernet_rebuild = 0
return
return
+1 -1
View File
@@ -294,7 +294,7 @@
output += d
output = max(0, min(SMESMAXOUTPUT, output)) // clamp to range
investigate_log("input/output; [chargelevel>output?"<font color='green'>":"<font color='red'>"][chargelevel]/[output]</font> | Output-mode: [online?"<font color='green'>on</font>":"<font color='red'>off</font>"] | Input-mode: [chargemode?"<font color='green'>auto</font>":"<font color='red'>off</font>"] by [usr.key]","singulo")
src.updateUsrDialog()
else
+12 -10
View File
@@ -32,18 +32,17 @@ won't update every console in existence) but it's more of a hassle to do. Also,
/obj/machinery/computer/rdconsole
name = "R&D Console"
icon_state = "rdcomp"
var
datum/research/files //Stores all the collected research data.
obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk.
obj/item/weapon/disk/design_disk/d_disk = null //Stores the design disk.
var/datum/research/files //Stores all the collected research data.
var/obj/item/weapon/disk/tech_disk/t_disk = null //Stores the technology disk.
var/obj/item/weapon/disk/design_disk/d_disk = null //Stores the design disk.
obj/machinery/r_n_d/destructive_analyzer/linked_destroy = null //Linked Destructive Analyzer
obj/machinery/r_n_d/protolathe/linked_lathe = null //Linked Protolathe
obj/machinery/r_n_d/circuit_imprinter/linked_imprinter = null //Linked Circuit Imprinter
var/obj/machinery/r_n_d/destructive_analyzer/linked_destroy = null //Linked Destructive Analyzer
var/obj/machinery/r_n_d/protolathe/linked_lathe = null //Linked Protolathe
var/obj/machinery/r_n_d/circuit_imprinter/linked_imprinter = null //Linked Circuit Imprinter
screen = 1.0 //Which screen is currently showing.
id = 0 //ID of the computer (for server restrictions).
sync = 1 //If sync = 0, it doesn't show up on Server Control Console
var/screen = 1.0 //Which screen is currently showing.
var/id = 0 //ID of the computer (for server restrictions).
var/sync = 1 //If sync = 0, it doesn't show up on Server Control Console
req_access = list(access_tox) //Data and setting manipulation requires scientist access.
@@ -351,6 +350,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
screen = 0.3
linked_lathe.busy = 1
flick("protolathe_n",linked_lathe)
var/key = usr.key //so we don't lose the info during the spawn delay
spawn(16)
use_power(power)
spawn(16)
@@ -379,6 +379,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(being_built.build_path)
var/obj/new_item = new being_built.build_path(src)
if( new_item.type == /obj/item/weapon/storage/backpack/holding )
new_item.investigate_log("built by [key]","singulo")
new_item.reliability = being_built.reliability
if(linked_lathe.hacked) being_built.reliability = max((reliability / 2), 0)
if(being_built.locked)