//
// Gravity Generator
//
var/list/gravity_generators = list() // We will keep track of this by adding new gravity generators to the list, and keying it with the z level.
var/const/POWER_IDLE = 0
var/const/POWER_UP = 1
var/const/POWER_DOWN = 2
var/const/GRAV_NEEDS_SCREWDRIVER = 0
var/const/GRAV_NEEDS_WELDING = 1
var/const/GRAV_NEEDS_PLASTEEL = 2
var/const/GRAV_NEEDS_WRENCH = 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
/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, 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)
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.overlays += "activated"
update_list()
//
// Generator an admin can spawn
//
/obj/machinery/gravity_generator/main/station/admin/New()
..()
initialize()
//
// 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
/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()
for(var/obj/machinery/gravity_generator/part/O in parts)
O.main_part = null
qdel(O)
for(var/area/A in world)
if(!(A.z in config.station_levels)) continue
A.gravitychange(0,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
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.overlays.Cut()
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, params)
var/old_broken_state = broken_state
switch(broken_state)
if(GRAV_NEEDS_SCREWDRIVER)
if(istype(I, /obj/item/weapon/screwdriver))
to_chat(user, "You secure the screws of the framework.")
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
broken_state++
if(GRAV_NEEDS_WELDING)
if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = I
if(WT.remove_fuel(1, user))
to_chat(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/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, 'sound/machines/click.ogg', 75, 1)
broken_state++
else
to_chat(user, "You need 10 sheets of plasteel.")
if(GRAV_NEEDS_WRENCH)
if(istype(I, /obj/item/weapon/wrench))
to_chat(user, "You secure the plating to the framework.")
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
set_fix()
else
..()
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/attack_ai(mob/user as mob)
return 1
/obj/machinery/gravity_generator/main/attack_ghost(mob/user as mob)
return interact(user)
/obj/machinery/gravity_generator/main/interact(mob/user as mob)
if(stat & BROKEN)
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.
Don'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.