#define POWER_IDLE 0
#define POWER_UP 1
#define POWER_DOWN 2
#define GRAV_NEEDS_SCREWDRIVER 0
#define GRAV_NEEDS_WELDING 1
#define GRAV_NEEDS_PLASTEEL 2
#define GRAV_NEEDS_WRENCH 3
#define AREA_ERRNONE 0
#define AREA_STATION 1
#define AREA_SPACE 2
#define AREA_SPECIAL 3
//
// Abstract Generator
//
/obj/machinery/gravity_generator
name = "gravitational generator"
desc = "A device which produces a gravaton field when set up."
icon = 'icons/obj/machines/gravity_generator.dmi'
anchored = 1
density = 1
use_power = 0
unacidable = 1
var/sprite_number = 0
light_color = LIGHT_COLOR_CYAN
light_power = 1
light_range = 8
/obj/machinery/gravity_generator/ex_act(severity)
if(severity == 1) // Very sturdy.
set_broken()
/obj/machinery/gravity_generator/update_icon()
..()
icon_state = "[get_status()]_[sprite_number]"
/obj/machinery/gravity_generator/proc/get_status()
return "off"
// You aren't allowed to move.
/obj/machinery/gravity_generator/Move()
..()
qdel(src)
/obj/machinery/gravity_generator/proc/set_broken()
stat |= BROKEN
/obj/machinery/gravity_generator/proc/set_fix()
stat &= ~BROKEN
/obj/machinery/gravity_generator/part/Destroy()
set_broken()
if(main_part)
qdel(main_part)
return ..()
//
// Part generator which is mostly there for looks
//
/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)
return main_part.attackby(I, user)
/obj/machinery/gravity_generator/part/get_status()
return main_part.get_status()
/obj/machinery/gravity_generator/part/attack_hand(mob/user as mob)
return main_part.attack_hand(user)
/obj/machinery/gravity_generator/part/set_broken()
..()
if(main_part && !(main_part.stat & BROKEN))
main_part.set_broken()
//
// Generator which spawns with the station.
//
/obj/machinery/gravity_generator/main/station/Initialize()
. = ..()
setup_parts()
middle.add_overlay("activated")
update_list()
addtimer(CALLBACK(src, .proc/round_startset), 100)
/obj/machinery/gravity_generator/main/station/proc/round_startset()
if(round_start >= 1)
round_start--
set_light(8,1,LIGHT_COLOR_CYAN)
//
// Generator an admin can spawn
//
/obj/machinery/gravity_generator/main/station/admin/Initialize()
. = ..()
round_start = 1
//
// Main Generator with the main code
//
/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 = 1
interact_offline = 1
var/on = 1
var/breaker = 1
var/list/parts = list()
var/obj/middle = null
var/charging_state = POWER_IDLE
var/charge_count = 100
var/current_overlay = null
var/broken_state = 0
var/list/localareas = list()
var/round_start = 2 //To help stop a bug with round start
var/backpanelopen = 0
var/eventon = 0
/obj/machinery/gravity_generator/main/Destroy()
log_debug("Gravity Generator Destroyed")
investigate_log("was destroyed!", "gravity")
on = 0
update_list()
for(var/obj/machinery/gravity_generator/part/O in parts)
O.main_part = null
qdel(O)
return ..()
/obj/machinery/gravity_generator/main/proc/eventshutofftoggle() // Used by the gravity event. Bypasses charging and all of that stuff.
breaker = 0
set_state(eventon)
sleep(20)
charge_count = 0
breaker = 1
charging_state = POWER_UP
set_power()
eventon = !eventon
/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
var/list/spawn_turfs = block(locate(our_turf.x - 1, our_turf.y + 2, our_turf.z), locate(our_turf.x + 1, our_turf.y, our_turf.z))
var/count = 10
for(var/turf/T in spawn_turfs)
count--
if(T == our_turf) // Skip our turf.
continue
var/obj/machinery/gravity_generator/part/part = new(T)
if(count == 5) // Middle
middle = part
if(count <= 3) // Their sprite is the top part of the generator
part.density = 0
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.cut_overlays()
charge_count = 0
breaker = 0
set_power()
set_state(0)
investigate_log("has broken down.", "gravity")
/obj/machinery/gravity_generator/main/set_fix()
..()
for(var/obj/machinery/gravity_generator/M in parts)
if(M.stat & BROKEN)
M.set_fix()
broken_state = 0
update_icon()
set_power()
// Interaction
// Fixing the gravity generator.
/obj/machinery/gravity_generator/main/attackby(obj/item/I as obj, mob/user as mob)
var/old_broken_state = broken_state
switch(broken_state)
if(GRAV_NEEDS_SCREWDRIVER)
if(isscrewdriver(I))
user << "You secure the screws of the framework."
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
broken_state++
if(GRAV_NEEDS_WELDING)
if(iswelder(I))
var/obj/item/weapon/weldingtool/WT = I
if(WT.remove_fuel(1, user))
user << "You mend the damaged framework."
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
broken_state++
if(GRAV_NEEDS_PLASTEEL)
if(istype(I, /obj/item/stack/material/plasteel))
var/obj/item/stack/material/plasteel/PS = I
if(PS.amount >= 10)
PS.use(10)
user << "You add the plating to the framework."
playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
broken_state++
else
user << "You need 10 sheets of plasteel."
if(GRAV_NEEDS_WRENCH)
if(iswrench(I))
user << "You secure the plating to the framework."
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
set_fix()
else
..()
if(iscrowbar(I))
if(backpanelopen)
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
user << "You replace the back panel."
backpanelopen = 0
else
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
user << "You open the back panel."
backpanelopen = 1
if(old_broken_state != broken_state)
update_icon()
/obj/machinery/gravity_generator/main/attack_hand(mob/user as mob)
if(!..())
return interact(user)
/obj/machinery/gravity_generator/main/interact(mob/user as mob)
if(stat & BROKEN)
return
var/dat = "Gravity Generator Breaker: "
if(!eventon)
if(breaker)
dat += "ON OFF"
else
dat += "ON OFF "
if(backpanelopen)
dat += "
Emergency shutoff:
"
dat += "Red Button"
dat += "
Generator Status: