From cf94ee8d348d7e5da88c99d47d845d5436fee3d5 Mon Sep 17 00:00:00 2001
From: SabreML <57483089+SabreML@users.noreply.github.com>
Date: Thu, 28 Jan 2021 16:32:51 +0000
Subject: [PATCH] [TGUI] Gravity Generator (#15174)
* Gravity TGUI V1
* This too
* Dialog
* Autodoc global
Co-Authored-By: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com>
* Review stuff V1
Co-authored-by: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com>
---
code/modules/power/gravitygenerator.dm | 400 +++++++++++---------
tgui/packages/tgui/interfaces/GravityGen.js | 75 ++++
tgui/packages/tgui/public/tgui.bundle.js | 4 +-
3 files changed, 293 insertions(+), 186 deletions(-)
create mode 100644 tgui/packages/tgui/interfaces/GravityGen.js
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 9332085c48c..591f152f15c 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -1,18 +1,14 @@
-
-//
-// Gravity Generator
-//
-
-GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding new gravity generators to the list, and keying it with the z level.
+/// Global list of all active gravity generators. Keyed by the Z level
+GLOBAL_LIST_EMPTY(gravity_generators)
#define GRAV_POWER_IDLE 0
#define GRAV_POWER_UP 1
#define GRAV_POWER_DOWN 2
-#define GRAV_NEEDS_SCREWDRIVER 0
-#define GRAV_NEEDS_WELDING 1
-#define GRAV_NEEDS_PLASTEEL 2
-#define GRAV_NEEDS_WRENCH 3
+#define GRAV_NEEDS_WELDING 0
+#define GRAV_NEEDS_PLASTEEL 1
+#define GRAV_NEEDS_WRENCH 2
+#define GRAV_NEEDS_SCREWDRIVER 3
//
// Abstract Generator
@@ -20,10 +16,10 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
/obj/machinery/gravity_generator
name = "gravitational generator"
- desc = "A device which produces a gravaton field when set up."
+ desc = "A device which produces a graviton field when set up."
icon = 'icons/obj/machines/gravity_generator.dmi'
- anchored = 1
- density = 1
+ anchored = TRUE
+ density = TRUE
use_power = NO_POWER_USE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/sprite_number = 0
@@ -71,13 +67,13 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
/obj/machinery/gravity_generator/part
var/obj/machinery/gravity_generator/main/main_part = null
-/obj/machinery/gravity_generator/part/attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/machinery/gravity_generator/part/attackby(obj/item/I, mob/user, params)
return main_part.attackby(I, user, params)
/obj/machinery/gravity_generator/part/get_status()
return main_part.get_status()
-/obj/machinery/gravity_generator/part/attack_hand(mob/user as mob)
+/obj/machinery/gravity_generator/part/attack_hand(mob/user)
return main_part.attack_hand(user)
/obj/machinery/gravity_generator/part/set_broken()
@@ -93,7 +89,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
. = ..()
setup_parts()
middle.overlays += "activated"
- update_list()
+ update_gen_list()
//
// Main Generator with the main code
@@ -101,36 +97,55 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
/obj/machinery/gravity_generator/main
icon_state = "on_8"
- idle_power_usage = 0
active_power_usage = 3000
power_channel = ENVIRON
sprite_number = 8
use_power = IDLE_POWER_USE
- interact_offline = 1
- var/on = 1
- var/breaker = 1
+ interact_offline = TRUE
+ /// Is the generator producing gravity
+ var/on = TRUE
+ /// Is the breaker switch turned on
+ var/breaker_on = TRUE
+ /// Generator parts on adjacent tiles
var/list/parts = list()
+ /// The central part of the structure
var/obj/middle = null
+ /// Charging state (Idle, Charging, Discharging)
var/charging_state = GRAV_POWER_IDLE
+ /// Charge percentage
var/charge_count = 100
var/current_overlay = null
- var/broken_state = 0
+ var/construction_state = GRAV_NEEDS_WELDING
+
+/obj/machinery/gravity_generator/main/examine(mob/user)
+ . = ..()
+ if(!(stat & BROKEN))
+ return
+
+ switch(construction_state)
+ if(GRAV_NEEDS_WELDING)
+ . += "The framework is damaged, and needs welding."
+ if(GRAV_NEEDS_PLASTEEL)
+ . += "The framework needs new plasteel plating."
+ if(GRAV_NEEDS_WRENCH)
+ . += "The plating needs wrenching into place."
+ if(GRAV_NEEDS_SCREWDRIVER)
+ . += "The cover screws are loose."
/obj/machinery/gravity_generator/main/Destroy() // If we somehow get deleted, remove all of our other parts.
investigate_log("was destroyed!", "gravity")
- on = 0
- update_list()
+ on = FALSE
+ update_gen_list()
for(var/obj/machinery/gravity_generator/part/O in parts)
O.main_part = null
qdel(O)
for(var/area/A in world)
- if(!is_station_level(A.z)) continue
- A.gravitychange(0,A)
+ if(!is_station_level(A.z))
+ continue
+ A.gravitychange(FALSE, A)
shake_everyone()
return ..()
-
-
/obj/machinery/gravity_generator/main/proc/setup_parts()
var/turf/our_turf = get_turf(src)
// 9x9 block obtained from the bottom middle of the block
@@ -144,26 +159,23 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
if(count == 5) // Middle
middle = part
if(count <= 3) // Their sprite is the top part of the generator
- part.density = 0
+ part.density = FALSE
part.layer = MOB_LAYER + 0.1
part.sprite_number = count
part.main_part = src
parts += part
part.update_icon()
-/obj/machinery/gravity_generator/main/proc/connected_parts()
- return parts.len == 8
-
/obj/machinery/gravity_generator/main/set_broken()
..()
for(var/obj/machinery/gravity_generator/M in parts)
if(!(M.stat & BROKEN))
M.set_broken()
middle.overlays.Cut()
+ charging_state = GRAV_POWER_IDLE
charge_count = 0
- breaker = 0
- set_power()
- set_state(0)
+ breaker_on = FALSE
+ set_gravity(FALSE)
investigate_log("has broken down.", "gravity")
/obj/machinery/gravity_generator/main/set_fix()
@@ -171,96 +183,95 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
for(var/obj/machinery/gravity_generator/M in parts)
if(M.stat & BROKEN)
M.set_fix()
- broken_state = 0
+ construction_state = initial(construction_state)
update_icon()
set_power()
// Interaction
-// Fixing the gravity generator.
-/obj/machinery/gravity_generator/main/attackby(obj/item/I as obj, mob/user as mob, params)
- switch(broken_state)
- if(GRAV_NEEDS_SCREWDRIVER)
- if(istype(I, /obj/item/screwdriver))
- to_chat(user, "You secure the screws of the framework.")
- playsound(src.loc, I.usesound, 50, 1)
- broken_state++
- update_icon()
- return
- if(GRAV_NEEDS_PLASTEEL)
- if(istype(I, /obj/item/stack/sheet/plasteel))
- var/obj/item/stack/sheet/plasteel/PS = I
- if(PS.amount >= 10)
- PS.use(10)
- to_chat(user, "You add the plating to the framework.")
- playsound(src.loc, PS.usesound, 75, 1)
- broken_state++
- update_icon()
- else
- to_chat(user, "You need 10 sheets of plasteel.")
- return
- if(GRAV_NEEDS_WRENCH)
- if(istype(I, /obj/item/wrench))
- to_chat(user, "You secure the plating to the framework.")
- playsound(src.loc, I.usesound, 75, 1)
- set_fix()
- return
- return ..()
-
+// REPAIRS //
+// Step 1
/obj/machinery/gravity_generator/main/welder_act(mob/user, obj/item/I)
- if(broken_state != GRAV_NEEDS_WELDING)
+ if(construction_state != GRAV_NEEDS_WELDING)
return
. = TRUE
- if(!I.use_tool(src, user, amount = 1, volume = I.tool_volume))
+ if(!I.use_tool(src, user, null, 1, I.tool_volume))
return
to_chat(user, "You mend the damaged framework.")
- broken_state++
+ construction_state = GRAV_NEEDS_PLASTEEL
update_icon()
-/obj/machinery/gravity_generator/main/attack_hand(mob/user as mob)
+// Step 2
+/obj/machinery/gravity_generator/main/attackby(obj/item/I, mob/user, params)
+ if(construction_state != GRAV_NEEDS_PLASTEEL)
+ return ..()
+ if(istype(I, /obj/item/stack/sheet/plasteel))
+ var/obj/item/stack/sheet/plasteel/PS = I
+ if(PS.amount < 10)
+ to_chat(user, "You need 10 sheets of plasteel.")
+ return
+
+ to_chat(user, "You add new plating to the framework.")
+ construction_state = GRAV_NEEDS_WRENCH
+ update_icon()
+
+// Step 3
+/obj/machinery/gravity_generator/main/wrench_act(mob/living/user, obj/item/I)
+ if(construction_state != GRAV_NEEDS_WRENCH)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, volume = I.tool_volume))
+ return
+ to_chat(user, "You secure the plating to the framework.")
+ construction_state = GRAV_NEEDS_SCREWDRIVER
+ update_icon()
+
+// Step 4
+/obj/machinery/gravity_generator/main/screwdriver_act(mob/living/user, obj/item/I)
+ if(!(stat & BROKEN)) // Not actually broken
+ return
+ if(construction_state != GRAV_NEEDS_SCREWDRIVER)
+ return
+ . = TRUE
+ if(!I.use_tool(src, user, volume = I.tool_volume))
+ return
+ to_chat(user, "You screw the covers back into place.")
+ set_fix()
+
+/obj/machinery/gravity_generator/main/attack_hand(mob/user)
if(!..())
- return interact(user)
+ return ui_interact(user)
-/obj/machinery/gravity_generator/main/attack_ai(mob/user as mob)
- return 1
+/obj/machinery/gravity_generator/main/attack_ai(mob/user)
+ return TRUE
-/obj/machinery/gravity_generator/main/attack_ghost(mob/user as mob)
- return interact(user)
+/obj/machinery/gravity_generator/main/attack_ghost(mob/user)
+ return ui_interact(user)
-/obj/machinery/gravity_generator/main/interact(mob/user as mob)
- if(stat & BROKEN)
+// tgui\packages\tgui\interfaces\GravityGen.js
+/obj/machinery/gravity_generator/main/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui && !(stat & BROKEN))
+ ui = new(user, src, ui_key, "GravityGen", name, 350, 250, master_ui, state)
+ ui.open()
+
+/obj/machinery/gravity_generator/main/ui_data(mob/user)
+ var/list/data = list()
+ data["charging_state"] = charging_state
+ data["charge_count"] = charge_count
+ data["breaker"] = breaker_on
+ data["ext_power"] = on
+ return data
+
+/obj/machinery/gravity_generator/main/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ if(..())
return
- var/dat = "Gravity Generator Breaker: "
- if(breaker)
- dat += "ON OFF"
- else
- dat += "ON OFF "
-
- dat += "
Generator Status:
Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.
@@ -413,7 +436,16 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding neDon't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then please proceed to panic; otherwise follow these steps.