From 8b984494e14d80e5cb4a812f74b0d275b7f3af8b Mon Sep 17 00:00:00 2001 From: Citinited Date: Mon, 2 Jul 2018 21:30:34 +0100 Subject: [PATCH 1/8] In-game explosion logging --- code/game/machinery/doppler_array.dm | 107 ++++++++++++++++++++++----- nano/templates/doppler_array.tmpl | 23 ++++++ 2 files changed, 112 insertions(+), 18 deletions(-) create mode 100644 nano/templates/doppler_array.tmpl diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 527ed23639c..debb041e3fc 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -8,6 +8,21 @@ var/list/doppler_arrays = list() density = 1 anchored = 1 atom_say_verb = "states coldly" + var/list/logged_explosions = list() + +/datum/explosion_log + var/logged_time + var/epicenter + var/actual_size_message + var/theoretical_size_message + +/datum/explosion_log/New(var/log_time, var/log_epicenter, var/log_actual_size_message, var/log_theoretical_size_message) + ..() + logged_time = log_time + epicenter = log_epicenter + actual_size_message = log_actual_size_message + theoretical_size_message = log_theoretical_size_message + UID() /obj/machinery/doppler_array/New() ..() @@ -34,53 +49,76 @@ var/list/doppler_arrays = list() else return ..() -/obj/machinery/doppler_array/verb/rotate() +/obj/machinery/doppler_array/attack_hand(mob/user) + if(..()) + return + ui_interact(user) + +/obj/machinery/doppler_array/attack_ghost(mob/user) + ui_interact(user) + +/obj/machinery/doppler_array/AltClick(mob/user) + rotate(user) + +/obj/machinery/doppler_array/verb/rotate(mob/user) set name = "Rotate Tachyon-doppler Dish" set category = "Object" set src in oview(1) - if(!usr || !isturf(usr.loc)) + if(user.incapacitated()) return - if(usr.stat || usr.restrained() || !usr.canmove) + if(!Adjacent(user)) return - src.dir = turn(src.dir, 90) - return + if(!user.IsAdvancedToolUser()) + to_chat(user, "You don't have the dexterity to do that!") + return + dir = turn(dir, 90) + to_chat(user, "You rotate [src].") /obj/machinery/doppler_array/proc/sense_explosion(var/x0,var/y0,var/z0,var/devastation_range,var/heavy_impact_range,var/light_impact_range, var/took,var/orig_dev_range,var/orig_heavy_range,var/orig_light_range) - if(stat & NOPOWER) return - if(z != z0) return + if(stat & NOPOWER) + return + if(z != z0) + return var/dx = abs(x0-x) var/dy = abs(y0-y) var/distance var/direct + var/capped = FALSE if(dx > dy) distance = dx - if(x0 > x) direct = EAST - else direct = WEST + if(x0 > x) + direct = EAST + else + direct = WEST else distance = dy - if(y0 > y) direct = NORTH - else direct = SOUTH - - if(distance > 100) return - if(!(direct & dir)) return + if(y0 > y) + direct = NORTH + else + direct = SOUTH + if(distance > 100) + return + if(!(direct & dir)) + return var/list/messages = list("Explosive disturbance detected.", \ "Epicenter at: grid ([x0],[y0]). Temporal displacement of tachyons: [took] seconds.", \ "Factual: Epicenter radius: [devastation_range]. Outer radius: [heavy_impact_range]. Shockwave radius: [light_impact_range].") - // If the bomb was capped, say it's theoretical size. + // If the bomb was capped, say its theoretical size. if(devastation_range < orig_dev_range || heavy_impact_range < orig_heavy_range || light_impact_range < orig_light_range) + capped = TRUE messages += "Theoretical: Epicenter radius: [orig_dev_range]. Outer radius: [orig_heavy_range]. Shockwave radius: [orig_light_range]." - + logged_explosions.Insert(1, new /datum/explosion_log(station_time_timestamp(), "[x0],[y0]", "[devastation_range], [heavy_impact_range], [light_impact_range]", capped ? "[orig_dev_range], [orig_heavy_range], [orig_light_range]" : "n/a")) //Newer logs appear first + messages += "Event successfully logged in internal database." for(var/message in messages) atom_say(message) - /obj/machinery/doppler_array/power_change() if(stat & BROKEN) icon_state = "[initial(icon_state)]-broken" @@ -90,4 +128,37 @@ var/list/doppler_arrays = list() stat &= ~NOPOWER else icon_state = "[initial(icon_state)]-off" - stat |= NOPOWER \ No newline at end of file + stat |= NOPOWER + +/obj/machinery/doppler_array/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "doppler_array.tmpl", "Tachyon-doppler array", 500, 650) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/doppler_array/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) + var/data[0] + var/list/explosion_data = list() + for(var/datum/explosion_log/E in logged_explosions) + explosion_data += list(list( + "logged_time" = E.logged_time, + "epicenter" = E.epicenter, + "actual_size_message" = E.actual_size_message, + "theoretical_size_message" = E.theoretical_size_message, + "unique_datum_id" = E.unique_datum_id)) + data["explosion_data"] = explosion_data + return data + +/obj/machinery/doppler_array/Topic(href, href_list) + if(..()) + return + if(href_list["log_to_delete"]) + var/log_to_delete = sanitize(href_list["log_to_delete"]) + for(var/datum/D in logged_explosions) + if(D.unique_datum_id == log_to_delete) + logged_explosions -= D + qdel(D) + to_chat(usr, "Log deletion successful.") + break + SSnanoui.update_uis(src) diff --git a/nano/templates/doppler_array.tmpl b/nano/templates/doppler_array.tmpl new file mode 100644 index 00000000000..2a523a33c7c --- /dev/null +++ b/nano/templates/doppler_array.tmpl @@ -0,0 +1,23 @@ +

Logged explosions:

+{{if data.explosion_data == 0}} +

No explosions logged this shift.

+{{else}} +
+ Time logged + Epicenter + Actual size + Theoretical size +
+
+ {{for data.explosion_data}} +
+ + {{:value.logged_time}} + {{:value.epicenter}} + {{:value.actual_size_message}} + {{:value.theoretical_size_message}} + {{:helper.link("Delete", "trash", {"log_to_delete": value.unique_datum_id})}} + +
+ {{/for}} +{{/if}} \ No newline at end of file From 8702b9ffc835a9ce6391d505cb181bce49e5a71c Mon Sep 17 00:00:00 2001 From: Citinited Date: Mon, 2 Jul 2018 23:48:20 +0100 Subject: [PATCH 2/8] Printable tachyon-doppler array logs --- code/game/machinery/doppler_array.dm | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index debb041e3fc..8b2c315b910 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -9,6 +9,7 @@ var/list/doppler_arrays = list() anchored = 1 atom_say_verb = "states coldly" var/list/logged_explosions = list() + var/printer_timer /datum/explosion_log var/logged_time @@ -30,6 +31,8 @@ var/list/doppler_arrays = list() /obj/machinery/doppler_array/Destroy() doppler_arrays -= src + for(var/datum/D in logged_explosions) + qdel(D) return ..() /obj/machinery/doppler_array/process() @@ -75,6 +78,53 @@ var/list/doppler_arrays = list() dir = turn(dir, 90) to_chat(user, "You rotate [src].") +/obj/item/paper/explosive_log + name = "explosive log" + info = "

Explosive Log Report

\ + \ + \ + \ + \ + \ + \ + " //NB: the
Time loggedEpicenterActualTheoretical
tag is left open, it is closed later on, when the doppler array adds its data + +/obj/machinery/doppler_array/verb/print_logs(mob/user) + set name = "Print Explosive Logs" + set category = "Object" + set src in oview(1) + + if(user.incapacitated()) + return + if(!Adjacent(user)) + return + if(!user.IsAdvancedToolUser()) + to_chat(user, "You don't have the dexterity to do that!") + return + if(!logged_explosions.len) + atom_say("No logs currently stored in internal database.") + return + if(printer_timer) + to_chat(user, "[src] is already printing something, please wait.") + return + atom_say("Printing explosive log. Standby...") + printer_timer = addtimer(CALLBACK(src, .proc/print), 50) + +/obj/machinery/doppler_array/proc/print() + printer_timer = FALSE + visible_message("[src] rattles off a sheet of paper!") + playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) + var/obj/item/paper/explosive_log/P = new(get_turf(src)) + for(var/datum/explosion_log/E in logged_explosions) + P.info += "\ + \ + \ + \ + \ + " + P.info += "
[E.logged_time][E.epicenter][E.actual_size_message][E.theoretical_size_message]

\ + Printed at [station_time_timestamp()]." + /obj/machinery/doppler_array/proc/sense_explosion(var/x0,var/y0,var/z0,var/devastation_range,var/heavy_impact_range,var/light_impact_range, var/took,var/orig_dev_range,var/orig_heavy_range,var/orig_light_range) if(stat & NOPOWER) From 50a96f13c74f0225fdbd79db45451d9ec9889612 Mon Sep 17 00:00:00 2001 From: Citinited Date: Tue, 3 Jul 2018 00:41:11 +0100 Subject: [PATCH 3/8] Explosive log printing is now done via nanoui --- code/game/machinery/doppler_array.dm | 43 ++++++++++++---------------- nano/templates/doppler_array.tmpl | 6 ++-- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 8b2c315b910..9c957954dd9 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -55,6 +55,7 @@ var/list/doppler_arrays = list() /obj/machinery/doppler_array/attack_hand(mob/user) if(..()) return + add_fingerprint(user) ui_interact(user) /obj/machinery/doppler_array/attack_ghost(mob/user) @@ -78,29 +79,7 @@ var/list/doppler_arrays = list() dir = turn(dir, 90) to_chat(user, "You rotate [src].") -/obj/item/paper/explosive_log - name = "explosive log" - info = "

Explosive Log Report

\ - \ - \ - \ - \ - \ - \ - " //NB: the
Time loggedEpicenterActualTheoretical
tag is left open, it is closed later on, when the doppler array adds its data - -/obj/machinery/doppler_array/verb/print_logs(mob/user) - set name = "Print Explosive Logs" - set category = "Object" - set src in oview(1) - - if(user.incapacitated()) - return - if(!Adjacent(user)) - return - if(!user.IsAdvancedToolUser()) - to_chat(user, "You don't have the dexterity to do that!") - return +/obj/machinery/doppler_array/proc/print_explosive_logs(mob/user) if(!logged_explosions.len) atom_say("No logs currently stored in internal database.") return @@ -198,6 +177,7 @@ var/list/doppler_arrays = list() "theoretical_size_message" = E.theoretical_size_message, "unique_datum_id" = E.unique_datum_id)) data["explosion_data"] = explosion_data + data["printer_timer"] = printer_timer return data /obj/machinery/doppler_array/Topic(href, href_list) @@ -211,4 +191,19 @@ var/list/doppler_arrays = list() qdel(D) to_chat(usr, "Log deletion successful.") break - SSnanoui.update_uis(src) + else if(href_list["print_logs"]) + print_explosive_logs(usr) + else + return + SSnanoui.update_uis(src) + +/obj/item/paper/explosive_log + name = "explosive log" + info = "

Explosive Log Report

\ +
\ + \ + \ + \ + \ + \ + " //NB: the
Time loggedEpicenterActualTheoretical
tag is left open, it is closed later on, when the doppler array adds its data diff --git a/nano/templates/doppler_array.tmpl b/nano/templates/doppler_array.tmpl index 2a523a33c7c..49aef551c09 100644 --- a/nano/templates/doppler_array.tmpl +++ b/nano/templates/doppler_array.tmpl @@ -1,4 +1,4 @@ -

Logged explosions:

+

Logged explosions:

{{if data.explosion_data == 0}}

No explosions logged this shift.

{{else}} @@ -20,4 +20,6 @@ {{/for}} -{{/if}} \ No newline at end of file +
+ {{:helper.link("Print all logs", "print", {"print_logs": 'yes'}, data.printer_timer ? 'disabled' : null)}} +{{/if}} From 83f33163cea54a6279fb780fca18eb64f3901a76 Mon Sep 17 00:00:00 2001 From: Citinited Date: Tue, 3 Jul 2018 02:32:44 +0100 Subject: [PATCH 4/8] Better way of handling timers --- code/game/machinery/doppler_array.dm | 10 ++++------ nano/templates/doppler_array.tmpl | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 9c957954dd9..2d48845fe06 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -9,7 +9,6 @@ var/list/doppler_arrays = list() anchored = 1 atom_say_verb = "states coldly" var/list/logged_explosions = list() - var/printer_timer /datum/explosion_log var/logged_time @@ -83,15 +82,14 @@ var/list/doppler_arrays = list() if(!logged_explosions.len) atom_say("No logs currently stored in internal database.") return - if(printer_timer) + if(active_timers) to_chat(user, "[src] is already printing something, please wait.") return atom_say("Printing explosive log. Standby...") - printer_timer = addtimer(CALLBACK(src, .proc/print), 50) + addtimer(CALLBACK(src, .print), 50) /obj/machinery/doppler_array/proc/print() - printer_timer = FALSE - visible_message("[src] rattles off a sheet of paper!") + visible_message("[src] prints a piece of paper!") playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) var/obj/item/paper/explosive_log/P = new(get_turf(src)) for(var/datum/explosion_log/E in logged_explosions) @@ -177,7 +175,7 @@ var/list/doppler_arrays = list() "theoretical_size_message" = E.theoretical_size_message, "unique_datum_id" = E.unique_datum_id)) data["explosion_data"] = explosion_data - data["printer_timer"] = printer_timer + data["printing"] = active_timers return data /obj/machinery/doppler_array/Topic(href, href_list) diff --git a/nano/templates/doppler_array.tmpl b/nano/templates/doppler_array.tmpl index 49aef551c09..d3bb40744b2 100644 --- a/nano/templates/doppler_array.tmpl +++ b/nano/templates/doppler_array.tmpl @@ -21,5 +21,5 @@ {{/for}}
- {{:helper.link("Print all logs", "print", {"print_logs": 'yes'}, data.printer_timer ? 'disabled' : null)}} + {{:helper.link("Print all logs", "print", {"print_logs": 'yes'}, data.printing ? 'disabled' : null)}} {{/if}} From 2e77d024afb21ca6488a22fcb5c3e62f483fbaf8 Mon Sep 17 00:00:00 2001 From: Citinited Date: Wed, 4 Jul 2018 12:57:43 +0100 Subject: [PATCH 5/8] UID now occurs at the point the nanoUI menu is opened --- code/game/machinery/doppler_array.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 2d48845fe06..0f98e45066d 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -22,7 +22,6 @@ var/list/doppler_arrays = list() epicenter = log_epicenter actual_size_message = log_actual_size_message theoretical_size_message = log_theoretical_size_message - UID() /obj/machinery/doppler_array/New() ..() @@ -168,6 +167,7 @@ var/list/doppler_arrays = list() var/data[0] var/list/explosion_data = list() for(var/datum/explosion_log/E in logged_explosions) + E.UID() explosion_data += list(list( "logged_time" = E.logged_time, "epicenter" = E.epicenter, From b2b4377b7fa0b8066a0489568be392519f93c22d Mon Sep 17 00:00:00 2001 From: Citinited Date: Sat, 7 Jul 2018 02:10:15 +0100 Subject: [PATCH 6/8] Moves UID check --- code/game/machinery/doppler_array.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 0f98e45066d..7e32b468ecf 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -167,13 +167,12 @@ var/list/doppler_arrays = list() var/data[0] var/list/explosion_data = list() for(var/datum/explosion_log/E in logged_explosions) - E.UID() explosion_data += list(list( "logged_time" = E.logged_time, "epicenter" = E.epicenter, "actual_size_message" = E.actual_size_message, "theoretical_size_message" = E.theoretical_size_message, - "unique_datum_id" = E.unique_datum_id)) + "unique_datum_id" = E.UID())) data["explosion_data"] = explosion_data data["printing"] = active_timers return data From 2c0e9154d6c5ca1c1be5f54238eba03cb4226984 Mon Sep 17 00:00:00 2001 From: Citinited Date: Tue, 10 Jul 2018 18:46:44 +0100 Subject: [PATCH 7/8] Adds another UID check, speeds up for loops slightly --- code/game/machinery/doppler_array.dm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 7e32b468ecf..fedbf0d9c9a 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -166,7 +166,8 @@ var/list/doppler_arrays = list() /obj/machinery/doppler_array/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) var/data[0] var/list/explosion_data = list() - for(var/datum/explosion_log/E in logged_explosions) + for(var/D in logged_explosions) + var/datum/explosion_log/E = D explosion_data += list(list( "logged_time" = E.logged_time, "epicenter" = E.epicenter, @@ -182,10 +183,11 @@ var/list/doppler_arrays = list() return if(href_list["log_to_delete"]) var/log_to_delete = sanitize(href_list["log_to_delete"]) - for(var/datum/D in logged_explosions) - if(D.unique_datum_id == log_to_delete) - logged_explosions -= D - qdel(D) + for(var/D in logged_explosions) + var/datum/explosion_log/E = D + if(E.UID() == log_to_delete) + logged_explosions -= E + qdel(E) to_chat(usr, "Log deletion successful.") break else if(href_list["print_logs"]) From d17366a2b91a48744f0ae11d07185064023b35fd Mon Sep 17 00:00:00 2001 From: Citinited Date: Thu, 12 Jul 2018 19:38:42 +0100 Subject: [PATCH 8/8] Uses Cut() instead of a loop --- code/game/machinery/doppler_array.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index fedbf0d9c9a..f06f7ac1b37 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -29,8 +29,7 @@ var/list/doppler_arrays = list() /obj/machinery/doppler_array/Destroy() doppler_arrays -= src - for(var/datum/D in logged_explosions) - qdel(D) + logged_explosions.Cut() return ..() /obj/machinery/doppler_array/process() @@ -91,7 +90,8 @@ var/list/doppler_arrays = list() visible_message("[src] prints a piece of paper!") playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) var/obj/item/paper/explosive_log/P = new(get_turf(src)) - for(var/datum/explosion_log/E in logged_explosions) + for(var/D in logged_explosions) + var/datum/explosion_log/E = D P.info += "
\ \ \
[E.logged_time][E.epicenter]