diff --git a/code/controllers/subsystems/machinery.dm b/code/controllers/subsystems/machinery.dm index 907d6c0aba2..4b8010b20b6 100644 --- a/code/controllers/subsystems/machinery.dm +++ b/code/controllers/subsystems/machinery.dm @@ -18,6 +18,7 @@ var/list/all_cameras = list() var/list/all_status_displays = list() // Note: This contains both ai_status_display and status_display. + var/list/gravity_generators = list() var/rcon_update_queued = FALSE var/powernet_update_queued = FALSE diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 5ace00739c7..3692745b27b 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1158,6 +1158,9 @@ area/space/atmosalert() name = "\improper Engineering Cooling Radiator" icon_state = "engineering_monitoring" +/area/engineering/gravity_gen + name = "\improper Gravity Generator" + icon_state = "engine" //Solars diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index ee81767d624..e0b68be292e 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -31,6 +31,8 @@ var/used_equip = 0 var/used_light = 0 var/used_environ = 0 + var/alwaysgravity = 0 + var/nevergravity = 0 var/has_gravity = 1 var/obj/machinery/power/apc/apc = null @@ -77,6 +79,7 @@ if(centcomm_area) centcom_areas[src] = TRUE + alwaysgravity = 1 if(station_area) the_station_areas[src] = TRUE @@ -382,8 +385,13 @@ var/list/mob/living/forced_ambiance_list = new if(!T) T = get_turf(AT) var/area/A = get_area(T) - if(A && A.has_gravity()) + if(istype(T, /turf/space)) //because space + return 0 + else if(A && A.has_gravity) return 1 + else + if(T && SSmachinery.gravity_generators["[T.z]"] && length(SSmachinery.gravity_generators["[T.z]"])) + return 1 return 0 //A useful proc for events. diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 5c05d636816..122a6a49bff 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -1162,3 +1162,118 @@ "} + +/obj/item/weapon/book/manual/gravitygenerator + name = "Gravity Generator Operation Manual" + icon_state ="bookEngineering2" + author = "Gravity Generator CO." + title = "Gravity Generator Operation Manual" + + dat = {" + + + + +

Gravity Generation for dummies!

+ Thank you for your purchase of the newest model of the SA Grade Gravity Generator! This operation manual will cover the basics required for safely operating and maintaing your gravity generation system.

+ +

Contents

+
    +
  1. Basic Saftey
  2. +
  3. Starting The System
  4. +
  5. Shutting Down The System
  6. +
  7. Procedure 8549 (Repairing Physical Damage)
  8. +
  9. Other Maintence Procedures
  10. +
+
+ +

Basic Saftey


+ Before starting any maintence protocols a basic set of safety instructions are to be followed to ensure safe operation of the system. They are as follows: +

+ +

Starting The System


+

+ +

Shutting Down The System


+

+ +

Procedure 8549 (Repairing Physical Damage)


+ In the case of physical damage to your gravity generation systems, follow the following steps:
+ Note:In the case of total destruction of the system, read:Procedure 2482 +
+ +

Other Procedures


+ The following procedures cover special cases that may come up. If your issue is not found below, please follow the shutdown procedure and contact Gravity Generator CO.
+ + Procedure 2482 (Total system destruction)
+

+ + Procedure 8548 (Fire in the chamber)
+ In the event of a fire in the gravity generator chamber, complete the following steps. +

+ + Procedure 9142 (Emergency Shutdown)
+ The following procedure is only to be used in case of an emergency. Use of it otherwise could lead to injury, death, malfunction of the systems, an explosion, or a massive release of radiation. +

+ + + + "} \ No newline at end of file diff --git a/code/modules/admin/secrets/random_events/gravity.dm b/code/modules/admin/secrets/random_events/gravity.dm index fd8c7f47f89..f33befc8d8c 100644 --- a/code/modules/admin/secrets/random_events/gravity.dm +++ b/code/modules/admin/secrets/random_events/gravity.dm @@ -16,8 +16,9 @@ return gravity_is_on = !gravity_is_on - for(var/area/A in all_areas) - A.gravitychange(gravity_is_on,A) + for(var/A in SSmachinery.gravity_generators) + var/obj/machinery/gravity_generator/main/B = A + B.eventshutofftoggle() feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","Grav") diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 3de84e5ae1d..15b5973b568 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -27,6 +27,9 @@ . = ..() gunshot_residue = null +/obj/item/proc/negates_gravity() + return 0 + //BS12: Species-restricted clothing check. /obj/item/clothing/mob_can_equip(M as mob, slot) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 06a30b68f59..15132d8978d 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -46,6 +46,12 @@ user.update_inv_shoes() //so our mob-overlays update user.update_action_buttons() +/obj/item/clothing/shoes/magboots/negates_gravity() + if(magpulse) + return 1 + else + return 0 + /obj/item/clothing/shoes/magboots/mob_can_equip(mob/user) var/mob/living/carbon/human/H = user diff --git a/code/modules/events/gravity.dm b/code/modules/events/gravity.dm index 623f2d9ac86..463ea75d10a 100644 --- a/code/modules/events/gravity.dm +++ b/code/modules/events/gravity.dm @@ -6,18 +6,20 @@ endWhen = rand(15, 60) /datum/event/gravity/announce() - command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes.", "Gravity Failure") + command_announcement.Announce("Feedback surge detected in the gravity generation systems. Artificial gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes.", "Gravity Failure") /datum/event/gravity/start() gravity_is_on = 0 - for(var/area/A in the_station_areas) - A.gravitychange(gravity_is_on, A) + for(var/A in SSmachinery.gravity_generators) + var/obj/machinery/gravity_generator/main/B = A + B.eventshutofftoggle() /datum/event/gravity/end() if(!gravity_is_on) gravity_is_on = 1 - for(var/area/A in the_station_areas) - A.gravitychange(gravity_is_on, A) + for(var/A in SSmachinery.gravity_generators) + var/obj/machinery/gravity_generator/main/B = A + B.eventshutofftoggle() command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.", "Gravity Restored") diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index c82194cfc71..3b4454ef1ca 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -124,3 +124,11 @@ footstep++ if (footstep % 2) playsound(src, T.footstep_sound, 40, 1) + +/mob/living/carbon/human/mob_has_gravity() + . = ..() + if(!. && mob_negates_gravity()) + . = 1 + +/mob/living/carbon/human/mob_negates_gravity() + return (shoes && shoes.negates_gravity()) \ No newline at end of file diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 56f094634e9..918ec838fb8 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -504,3 +504,12 @@ set name = ".moveleft" set instant = 1 Move(get_step(mob, WEST), WEST) + +/mob/proc/update_gravity() + return + +/mob/proc/mob_has_gravity(turf/T) + return has_gravity(src, T) + +/mob/proc/mob_negates_gravity() + return 0 \ No newline at end of file diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index ab80a71ff98..0d34fbb1c4b 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -1,140 +1,453 @@ -// It.. uses a lot of power. Everything under power is engineering stuff, at least. +#define POWER_IDLE 0 +#define POWER_UP 1 +#define POWER_DOWN 2 -/obj/machinery/computer/gravity_control_computer - name = "Gravity Generator Control" - desc = "A computer to control a local gravity generator. Qualified personnel only." - icon = 'icons/obj/computer.dmi' - icon_state = "airtunnel0e" - anchored = 1 - density = 1 - var/obj/machinery/gravity_generator = null +#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" +/obj/machinery/gravity_generator + name = "gravitational generator" desc = "A device which produces a gravaton field when set up." - icon = 'icons/obj/singularity.dmi' - icon_state = "TheSingGen" + 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) + 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.overlays += "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-- +// +// 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 - idle_power_usage = 200 - active_power_usage = 1000 + 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/effectiverange = 25 + var/round_start = 2 //To help stop a bug with round start + var/backpanelopen = 0 + var/eventon = 0 - // Borrows code from cloning computer -/obj/machinery/computer/gravity_control_computer/New() +/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. + set_state(eventon) + 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() ..() - spawn(5) - updatemodules() - return - return + 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/New() +/obj/machinery/gravity_generator/main/set_fix() ..() - spawn(5) - locatelocalareas() - return - return + for(var/obj/machinery/gravity_generator/M in parts) + if(M.stat & BROKEN) + M.set_fix() + broken_state = 0 + update_icon() + set_power() +// Interaction - -/obj/machinery/computer/gravity_control_computer/proc/updatemodules() - src.gravity_generator = findgenerator() - - - -/obj/machinery/gravity_generator/proc/locatelocalareas() - for(var/area/A in range(src,effectiverange)) - if(A.name == "Space") - continue // No (de)gravitizing space. - if(!(A in localareas)) - localareas += A - -/obj/machinery/computer/gravity_control_computer/proc/findgenerator() - var/obj/machinery/gravity_generator/foundgenerator = null - for(dir in list(NORTH,EAST,SOUTH,WEST)) - //world << "SEARCHING IN [dir]" - foundgenerator = locate(/obj/machinery/gravity_generator/, get_step(src, dir)) - if (!isnull(foundgenerator)) - //world << "FOUND" - break - return foundgenerator - -/obj/machinery/computer/gravity_control_computer/attack_ai(mob/user as mob) - return attack_hand(user) - -/obj/machinery/computer/gravity_control_computer/attack_hand(mob/user as mob) - user.set_machine(src) - add_fingerprint(user) - - if(stat & (BROKEN|NOPOWER)) - return - - updatemodules() - - var/dat = "

Generator Control System

" - //dat += "Refresh" - if(gravity_generator) - if(gravity_generator:on) - dat += "
Gravity Status: ON

" +// 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 - dat += "
Gravity Status: OFF

" - - dat += "
Currently Supplying Gravitons To:
" - - for(var/area/A in gravity_generator:localareas) - if(A.has_gravity && gravity_generator:on) - dat += "[A]
" - - else if (A.has_gravity) - dat += "[A]
" - - else - dat += "[A]
" - - dat += "
Maintainence Functions:
" - if(gravity_generator:on) - dat += " TURN GRAVITY GENERATOR OFF. " + ..() + if(iscrowbar(I)) + if(backpanelopen) + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + user << "You replace the back panel." + backpanelopen = 0 else - dat += " TURN GRAVITY GENERATOR ON. " + 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:
" + if(charging_state != POWER_IDLE) + dat += "WARNING Radiation Detected.
[charging_state == POWER_UP ? "Charging..." : "Discharging..."]" + else if(on) + dat += "Powered." + else + dat += "Unpowered." + + dat += "
Gravity Charge: [charge_count]%
" else - dat += "No local gravity generator detected!" - - user << browse(dat, "window=gravgen") - onclose(user, "gravgen") + dat += "

ERROR: SYSTEM MALFUNCTION. PLEASE WAIT...

" + var/datum/browser/popup = new(user, "gravgen", name) + popup.set_content(dat) + popup.open() -/obj/machinery/computer/gravity_control_computer/Topic(href, href_list) - set background = 1 - ..() +/obj/machinery/gravity_generator/main/Topic(href, href_list) - if ( (get_dist(src, usr) > 1 )) - if (!istype(usr, /mob/living/silicon)) - usr.unset_machine() - usr << browse(null, "window=air_alarm") - return + if(..()) + return if(href_list["gentoggle"]) - if(gravity_generator:on) - gravity_generator:on = 0 - - for(var/area/A in gravity_generator:localareas) - var/obj/machinery/gravity_generator/G - for(G in SSmachinery.processing_machines) - if((A in G.localareas) && (G.on)) - break - if(!G) - A.gravitychange(0,A) - - - else - for(var/area/A in gravity_generator:localareas) - gravity_generator:on = 1 - A.gravitychange(1,A) - + breaker = !breaker + investigate_log("was toggled [breaker ? "ON" : "OFF"] by [usr.key].", "gravity") + set_power() src.updateUsrDialog() + else if(href_list["eshutoff"]) + investigate_log("was shut off by [usr.key].", "gravity") + eshutoff() + + +/obj/machinery/gravity_generator/main/power_change() + ..() + investigate_log("has [stat & NOPOWER ? "lost" : "regained"] power.", "gravity") + breaker = 0 + +/obj/machinery/gravity_generator/main/proc/eshutoff() + if(charge_count > 0) + charge_count = 0 + playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1) + pulse_radiation(100) + set_state(0) + if(middle) + middle.overlays.Cut() + if(prob(1)) //It will spawn a small one and eat the generator. Won't cause any other issues considering it's a 1x1 and will go away on it's own. + new /obj/singularity(src.loc) + if(prob(33)) //Releasing all that power at once is dangerous. + empulse(src.loc, 2, 4) + +/obj/machinery/gravity_generator/main/get_status() + if(stat & BROKEN) + return "fix[min(broken_state, 3)]" + return on || charging_state != POWER_IDLE ? "on" : "off" + +/obj/machinery/gravity_generator/main/update_icon() + ..() + for(var/obj/O in parts) + O.update_icon() + +// Set the charging state based on power/breaker. +/obj/machinery/gravity_generator/main/proc/set_power() + var/new_state = 0 + if(stat & (NOPOWER|BROKEN) || !breaker) + new_state = 0 + else if(breaker) + new_state = 1 + + charging_state = new_state ? POWER_UP : POWER_DOWN // Startup sequence animation. + investigate_log("is now [charging_state == POWER_UP ? "charging" : "discharging"].", "gravity") + update_icon() + +// Set the state of the gravity. +/obj/machinery/gravity_generator/main/proc/set_state(var/new_state) + charging_state = POWER_IDLE + on = new_state + use_power = on ? 2 : 1 + // Sound the alert if gravity was just enabled or disabled. + var/alert = 0 + var/area/area = get_area(src) + if(new_state) // If we turned on + if(gravity_in_level() == 0) + alert = 1 + gravity_is_on = 1 + investigate_log("was brought online and is now producing gravity for this level.", "gravity") + message_admins("The gravity generator was brought online. ([area.name])") + else + if(gravity_in_level() == 1) + alert = 1 + gravity_is_on = 0 + investigate_log("was brought offline and there is now no gravity for this level.", "gravity") + message_admins("The gravity generator was brought offline with no backup generator. ([area.name])") + + update_icon() + update_list() + src.updateUsrDialog() + if(alert) + shake_everyone() + +// Charge/Discharge and turn on/off gravity when you reach 0/100 percent. +// Also emit radiation and handle the overlays. +/obj/machinery/gravity_generator/main/process() + if(stat & BROKEN) return + if(charging_state != POWER_IDLE) + if(charging_state == POWER_UP && charge_count >= 100) + set_state(1) + else if(charging_state == POWER_DOWN && charge_count <= 0) + set_state(0) + else + if(charging_state == POWER_UP) + charge_count += 2 + else if(charging_state == POWER_DOWN) + charge_count -= 2 + + if(charge_count % 4 == 0 && prob(75)) // Let them know it is charging/discharging. + playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1) + + updateDialog() + if(prob(30)) // To help stop "Your clothes feel warm" spam. + pulse_radiation() + + var/overlay_state = null + switch(charge_count) + if(0 to 20) + overlay_state = null + if(21 to 40) + overlay_state = "startup" + if(41 to 60) + overlay_state = "idle" + if(61 to 80) + overlay_state = "activating" + if(81 to 100) + overlay_state = "activated" + + if(overlay_state != current_overlay) + if(middle) + middle.overlays.Cut() + if(overlay_state) + middle.overlays += overlay_state + current_overlay = overlay_state + +/obj/machinery/gravity_generator/main/proc/pulse_radiation(var/amount) + if(!amount) + amount = 20 + for(var/mob/living/L in view(7, src)) + L.apply_effect(amount, IRRADIATE) + +// Shake everyone on the z level to let them know that gravity was enagaged/disenagaged. +/obj/machinery/gravity_generator/main/proc/shake_everyone() + var/turf/our_turf = get_turf(src) + for(var/mob/M in mob_list) + var/turf/their_turf = get_turf(M) + if(their_turf.z == our_turf.z) + M.update_gravity(M.mob_has_gravity()) + if(M.client) + if(!M) return + shake_camera(M, 5, 1) + M.playsound_local(our_turf, 'sound/effects/alert.ogg', 100, 1, 0.5) + +/obj/machinery/gravity_generator/main/proc/gravity_in_level() + var/turf/T = get_turf(src) + if(!T) + return 0 + if(SSmachinery.gravity_generators["[T.z]"]) + return length(SSmachinery.gravity_generators["[T.z]"]) + return 0 + +/obj/machinery/gravity_generator/main/proc/update_list() + var/turf/T = get_turf(src.loc) + if(T) + if(!SSmachinery.gravity_generators["[T.z]"]) + SSmachinery.gravity_generators["[T.z]"] = list() + + if(on) + for(var/area/A in localareas) + A.has_gravity = 1 + if(round_start) + A.gravitychange(A.has_gravity,A,1) + else + A.gravitychange(A.has_gravity,A) + if(round_start == 1) + round_start = 0 + SSmachinery.gravity_generators["[T.z]"] |= src + else + for(var/area/A in localareas) + A.has_gravity = 0 + A.gravitychange(A.has_gravity,A) + SSmachinery.gravity_generators["[T.z]"] -= src + +/obj/machinery/gravity_generator/main/Initialize() + . = ..() + addtimer(CALLBACK(src, .proc/updateareas), 10) + return + +/obj/machinery/gravity_generator/main/proc/updateareas() + for(var/area/A in all_areas) + if(!(get_area_type(A) == AREA_STATION)) + continue + localareas += A + +/obj/machinery/gravity_generator/main/proc/get_area_type(var/area/A = get_area()) + if (A.name == "Space") + return AREA_SPACE + else if(A.alwaysgravity == 1 || A.nevergravity == 1) + return AREA_SPECIAL + else + return AREA_STATION diff --git a/html/changelogs/Printer16-Gravity.yml b/html/changelogs/Printer16-Gravity.yml new file mode 100644 index 00000000000..5e5c90e4f97 --- /dev/null +++ b/html/changelogs/Printer16-Gravity.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +################################# + +# Your name. +author: Printer16 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "The gravity generator was added back." diff --git a/icons/obj/machines/gravity_generator.dmi b/icons/obj/machines/gravity_generator.dmi new file mode 100644 index 00000000000..69395034dc8 Binary files /dev/null and b/icons/obj/machines/gravity_generator.dmi differ diff --git a/maps/aurora/aurora-3_sublevel.dmm b/maps/aurora/aurora-3_sublevel.dmm index b7e003bcdad..95fecc5bac8 100644 --- a/maps/aurora/aurora-3_sublevel.dmm +++ b/maps/aurora/aurora-3_sublevel.dmm @@ -2107,11 +2107,6 @@ dir = 1 }, /obj/machinery/light, -/obj/machinery/firealarm{ - dir = 1; - pixel_x = 0; - pixel_y = -24 - }, /obj/machinery/camera/network/engineering_outpost{ c_tag = "Engineering Sublevel - Corridor Camera 2"; dir = 1; @@ -22358,6 +22353,591 @@ }, /turf/simulated/floor/tiled/white, /area/medical/patient_wing) +"Mo" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled, +/area/outpost/engineering/hallway) +"Mp" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/outpost/engineering/hallway) +"Mq" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'RADIOACTIVE AREA'"; + icon_state = "radiation"; + name = "RADIOACTIVE AREA"; + pixel_x = -32; + pixel_y = 0 + }, +/obj/machinery/door/airlock/engineering{ + name = "Gravity Room"; + req_access = list(); + req_one_access = list(11,24) + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled, +/area/outpost/engineering/hallway) +"Mr" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'RADIOACTIVE AREA'"; + icon_state = "radiation"; + name = "RADIOACTIVE AREA"; + pixel_x = -32; + pixel_y = 0 + }, +/turf/simulated/wall/r_wall, +/area/outpost/engineering/hallway) +"Ms" = ( +/obj/structure/table/standard, +/obj/item/stack/material/plasteel{ + amount = 10 + }, +/obj/machinery/camera/network/engineering_outpost{ + c_tag = "Gravity Generator Foyer"; + dir = 4; + icon_state = "camera" + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Mt" = ( +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Mu" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Mv" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + icon_state = "intact-supply"; + dir = 6 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Mw" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Mx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_x = 0 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"My" = ( +/obj/machinery/power/apc{ + dir = 1; + name = "north bump"; + pixel_x = 0; + pixel_y = 24 + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Mz" = ( +/obj/machinery/alarm{ + pixel_y = 22 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MA" = ( +/obj/structure/closet/radiation, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MB" = ( +/obj/structure/table/standard, +/obj/item/weapon/book/manual/gravitygenerator, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MC" = ( +/obj/structure/bed/chair{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MD" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"ME" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/light, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MG" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/light, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MH" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"MI" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"MJ" = ( +/obj/structure/closet/radiation, +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"MK" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'RADIOACTIVE AREA'"; + icon_state = "radiation"; + name = "RADIOACTIVE AREA"; + pixel_x = -32; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"ML" = ( +/obj/structure/grille, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MM" = ( +/obj/structure/grille, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MN" = ( +/obj/machinery/door/airlock/glass_engineering{ + name = "Generator Chamber"; + req_access = list(); + req_one_access = list(11,24) + }, +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'RADIOACTIVE AREA'"; + icon_state = "radiation"; + name = "RADIOACTIVE AREA"; + pixel_x = -32; + pixel_y = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MO" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'RADIOACTIVE AREA'"; + icon_state = "radiation"; + name = "RADIOACTIVE AREA"; + pixel_x = -32; + pixel_y = 0 + }, +/obj/structure/grille, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"MP" = ( +/obj/structure/grille, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"MQ" = ( +/obj/structure/grille, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"MR" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'RADIOACTIVE AREA'"; + icon_state = "radiation"; + name = "RADIOACTIVE AREA"; + pixel_x = -32; + pixel_y = 0 + }, +/turf/simulated/wall/r_wall, +/area/outpost/engineering/hallway) +"MS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MT" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MU" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"MV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"MZ" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Na" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Nb" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + icon_state = "intact-scrubbers"; + dir = 1 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Nc" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Nd" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Ne" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Nf" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Ng" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Nh" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Ni" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Nj" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Nk" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Nl" = ( +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Nm" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Nn" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"No" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Np" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Nq" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Nr" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 4 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Ns" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9; + pixel_y = 0 + }, +/obj/machinery/light{ + dir = 4; + status = 2 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Nt" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'RADIOACTIVE AREA'"; + icon_state = "radiation"; + name = "RADIOACTIVE AREA"; + pixel_x = -32; + pixel_y = 0 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Nu" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Nv" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Nw" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Nx" = ( +/obj/machinery/gravity_generator/main/station, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Ny" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"Nz" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"NA" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"NB" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'RADIOACTIVE AREA'"; + icon_state = "radiation"; + name = "RADIOACTIVE AREA"; + pixel_x = 32; + pixel_y = 0 + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"NC" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"ND" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"NE" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"NF" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"NG" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"NH" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"NI" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"NJ" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"NK" = ( +/turf/simulated/floor/tiled, +/area/mine/unexplored) +"NL" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'RADIOACTIVE AREA'"; + icon_state = "radiation"; + name = "RADIOACTIVE AREA"; + pixel_x = -32; + pixel_y = 0 + }, +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NM" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'RADIOACTIVE AREA'"; + icon_state = "radiation"; + name = "RADIOACTIVE AREA"; + pixel_x = -32; + pixel_y = 0 + }, +/turf/simulated/wall/r_wall, +/area/mine/unexplored) +"NN" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NO" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NP" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NQ" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NR" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NS" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NT" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NU" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NV" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NW" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NX" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NY" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"NZ" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"Oa" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"Ob" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"Oc" = ( +/turf/simulated/wall/r_wall, +/area/engineering/gravity_gen) +"Od" = ( +/obj/machinery/camera/network/engineering_outpost{ + c_tag = "Gravity Generator Chamber"; + dir = 1; + icon_state = "camera" + }, +/turf/simulated/floor/tiled, +/area/engineering/gravity_gen) +"Oe" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'RADIOACTIVE AREA'"; + icon_state = "radiation"; + name = "RADIOACTIVE AREA"; + pixel_x = -32; + pixel_y = 0 + }, +/turf/simulated/floor{ + icon_state = "plating" + }, +/area/turbolift/engineering_maintenance) (1,1,1) = {" aa @@ -37108,9 +37688,9 @@ eD eD eD eD -aa -aa -aa +NN +NN +NN aa aa aa @@ -37359,15 +37939,15 @@ du dM dq dc -aa -aa -ab -ab -ab -ab -aa -aa -aa +Ms +MB +MK +MS +Nb +Nk +Mt +Mt +NL aa aa aa @@ -37614,17 +38194,17 @@ cT dh dv dK -dq +eg dc -aa -ab -ab -ab -ab -ab -ab -aa -aa +Mt +MC +ML +MT +Mt +Nl +Mt +Mt +NN aa aa aa @@ -37871,17 +38451,17 @@ cU dh dw dN -dq +ec dc -ab -ab -ab -ab -ab -ab -ab -aa -aa +Mt +Mt +MM +MT +Mt +Mt +Mt +Mt +NN aa aa aa @@ -38130,15 +38710,15 @@ dx dO ef dc -ab -ab -ab -ab -ab -ab -ab -aa -aa +Mv +ME +NN +MV +Mt +Mt +Mt +Mt +NN aa aa aa @@ -38384,18 +38964,18 @@ cE cE aD dq -dK -dq -dc -ab -ab -ab -ab -ab -ab -ab -aa -aa +Mo +Mp +Mq +Mw +MF +MN +MW +Mt +Mt +Nx +Od +NN aa aa aa @@ -38642,17 +39222,17 @@ cV di dy dP -eg +dq dc -ab -ab -ab -ab -ab -ab -ab -aa -aa +Mx +MG +NN +MX +Mt +Mt +Mt +Mt +NN aa aa aa @@ -38900,16 +39480,16 @@ aD dq dK dq -dc -ab -ab -ab -ab -ab -ab -ab -aa -aa +Mr +My +Mt +MK +MY +Mt +Mt +Mt +Mt +NN aa aa aa @@ -39158,15 +39738,15 @@ dq dK dq dc -ab -ab -ab -ab -ab -ab -ab -aa -aa +Mz +Mt +ML +MY +Mt +Nr +Mt +Mt +NN aa aa aa @@ -39415,15 +39995,15 @@ dt dL dt dc -ab -ab -ab -ab -ab -ab -ab -aa -aa +MA +MA +MM +Na +Nj +Ns +Mt +Mt +NN aa aa aa @@ -39672,10 +40252,10 @@ dq dK dq dc -ab -ab -ab -ab +NN +NN +NN +NN dc dc dc @@ -39931,13 +40511,13 @@ dq dc dc dc -dc +Mr dc dc fG fG fG -fG +Oe fP dc fT