Skip to content

Commit 7d7d17f

Browse files
committed
Clean up gravity generator code
1 parent 44461c0 commit 7d7d17f

File tree

2 files changed

+42
-29
lines changed

2 files changed

+42
-29
lines changed

code/game/area/areas.dm

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,14 +412,30 @@ var/global/list/mob/living/forced_ambiance_list = new
412412
sound_to(L, sound(null, channel = sound_channels.lobby_channel))
413413
forced_ambiance_list -= L
414414

415-
/area/proc/gravitychange(var/gravitystate = 0)
415+
/area/proc/gravitychange(gravitystate = 0, skip_thunk = FALSE)
416416
has_gravity = gravitystate
417-
417+
if(skip_thunk)
418+
// For mass-area-gravity-modification where it might be more efficient to loop over mobs manually after.
419+
return
418420
for(var/mob/M in src)
419421
if(has_gravity)
420422
thunk(M)
421423
M.update_floating()
422424

425+
/proc/mass_gravitychange(list/areas_to_change, gravitystate = 0)
426+
var/list/lookup_list = new /list(length(areas_to_change))
427+
for(var/area/changing_area in areas_to_change)
428+
changing_area.gravitychange(gravitystate = gravitystate, skip_thunk = TRUE)
429+
lookup_list[changing_area] = TRUE // for faster membership checks
430+
// thunks do literally nothing for non-human mobs, but we'll be future-proof and do all living mobs
431+
for(var/mob/living/victim in global.living_mob_list_)
432+
var/area/victim_area = get_area(victim)
433+
if(!lookup_list[victim_area])
434+
continue
435+
if(victim_area.has_gravity)
436+
victim_area.thunk(victim)
437+
victim.update_floating()
438+
423439
/area/proc/thunk(mob/mob)
424440
if(isspaceturf(get_turf(mob))) // Can't fall onto nothing.
425441
return

code/modules/power/gravitygenerator.dm

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,23 @@
1-
// It... uses a lot of power. Everything under power is engineering stuff, at least.
2-
31
/obj/machinery/computer/gravity_control_computer
4-
name = "Gravity Generator Control"
5-
desc = "A computer to control a local gravity generator. Qualified personnel only."
2+
name = "gravity generator control computer"
3+
desc = "A computer to control a local gravity generator. Qualified personnel only."
64
icon = 'icons/obj/computer.dmi'
75
icon_state = "airtunnel0e"
86
anchored = TRUE
97
density = TRUE
108
var/obj/machinery/gravity_generator/gravity_generator
119

12-
/obj/machinery/gravity_generator/
13-
name = "Gravitational Generator"
10+
// Wait. This isn't even used anywhere?
11+
/obj/machinery/gravity_generator
12+
name = "gravitational generator"
1413
desc = "A device which produces a graviton field when set up."
1514
icon = 'icons/obj/singularity.dmi'
1615
icon_state = "TheSingGen"
1716
anchored = TRUE
1817
density = TRUE
1918
idle_power_usage = 200
2019
active_power_usage = 1000
21-
var/on = 1
20+
var/on = TRUE
2221
var/list/localareas = list()
2322
var/effectiverange = 25
2423

@@ -32,14 +31,14 @@
3231
locatelocalareas()
3332

3433
/obj/machinery/computer/gravity_control_computer/proc/updatemodules()
35-
for(dir in list(NORTH,EAST,SOUTH,WEST))
36-
gravity_generator = locate(/obj/machinery/gravity_generator/, get_step(src, dir))
37-
if (gravity_generator)
34+
for(var/check_dir in global.cardinal)
35+
gravity_generator = locate(/obj/machinery/gravity_generator, get_step(src, check_dir))
36+
if(gravity_generator)
3837
return
3938

4039
/obj/machinery/gravity_generator/proc/locatelocalareas()
4140
for(var/area/A in range(src,effectiverange))
42-
if(istype(A,/area/space))
41+
if(istype(A,/area/space)) // todo: un-hardcode this
4342
continue // No (de)gravitizing space.
4443
localareas |= A
4544

@@ -85,25 +84,23 @@
8584
onclose(user, "gravgen")
8685

8786

87+
/obj/machinery/gravity_generator/proc/toggle_gravity()
88+
on = !on
89+
update_use_power(on ? POWER_USE_ACTIVE : POWER_USE_IDLE)
90+
if(on)
91+
mass_gravitychange(localareas, TRUE)
92+
else
93+
var/list/still_covered_areas = list()
94+
// We do it this way to avoid nested loops, and also because gravity generators are relatively rare.
95+
for(var/obj/machinery/gravity_generator/other_generator in SSmachines.machinery)
96+
if(other_generator.on)
97+
still_covered_areas |= localareas & other_generator.localareas
98+
mass_gravitychange(localareas - still_covered_areas, FALSE)
99+
88100
/obj/machinery/computer/gravity_control_computer/OnTopic(user, href_list)
89101
if((. = ..()))
90102
return
91103

92104
if(href_list["gentoggle"])
93105
. = TOPIC_REFRESH
94-
if(gravity_generator.on)
95-
gravity_generator.on = 0
96-
97-
for(var/area/A in gravity_generator.localareas)
98-
var/obj/machinery/gravity_generator/G
99-
for(G in SSmachines.machinery)
100-
if((A in G.localareas) && (G.on))
101-
break
102-
if(!G)
103-
A.gravitychange(0)
104-
CHECK_TICK
105-
else
106-
for(var/area/A in gravity_generator.localareas)
107-
gravity_generator.on = 1
108-
A.gravitychange(1)
109-
CHECK_TICK
106+
gravity_generator.toggle_gravity()

0 commit comments

Comments
 (0)