Skip to content

Commit 07b6a6f

Browse files
authored
Holobar update (#8638)
* holodeck works again * updated holodeck to be able to togglePower properly updated loadProgram to use the program name directly HolodeckControl.dm and copy_contents_to reformatted to use TRUE and FALSE and not use var/ in paramdef copy_contents_to now has option to not copy objs
1 parent d9416b9 commit 07b6a6f

File tree

2 files changed

+118
-56
lines changed

2 files changed

+118
-56
lines changed

code/__HELPERS/unsorted.dm

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -881,7 +881,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list(
881881
all_vars[V] = original.vars[V]
882882
return all_vars
883883

884-
/area/proc/copy_contents_to(var/area/A , var/platingRequired = 0 )
884+
/area/proc/copy_contents_to(area/A , platingRequired = FALSE, noobjs = FALSE )
885885
//Takes: Area. Optional: If it should copy to areas that don't have plating
886886
//Returns: Nothing.
887887
//Notes: Attempts to move the contents of one area to another area.
@@ -890,7 +890,8 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list(
890890

891891
// Does *not* affect gases etc; copied turfs will be changed via ChangeTurf, and the dir, icon, and icon_state copied. All other vars will remain default.
892892

893-
if(!A || !src) return 0
893+
if(!A || !src)
894+
return FALSE
894895

895896
var/list/turfs_src = get_area_turfs(src.type)
896897
var/list/turfs_trg = get_area_turfs(A.type)
@@ -958,15 +959,16 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list(
958959
var/list/mobs = new/list()
959960
var/list/newmobs = new/list()
960961

961-
for(var/obj/O in T)
962-
objs += O
962+
if(!noobjs)
963+
for(var/obj/O in T)
964+
objs += O
963965

964-
for(var/obj/O in objs)
965-
newobjs += DuplicateObject(O , 1)
966+
for(var/obj/O in objs)
967+
newobjs += DuplicateObject(O , 1)
966968

967969

968-
for(var/obj/O in newobjs)
969-
O.loc = X
970+
for(var/obj/O in newobjs)
971+
O.loc = X
970972

971973
for(var/mob/M in T)
972974

@@ -979,7 +981,8 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list(
979981
for(var/mob/M in newmobs)
980982
M.loc = X
981983

982-
copiedobjs += newobjs
984+
if(!noobjs)
985+
copiedobjs += newobjs
983986
copiedobjs += newmobs
984987

985988
// var/area/AR = X.loc

code/modules/holodeck/HolodeckControl.dm

Lines changed: 106 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,18 @@
1313

1414
var/area/holodeck/linkedholodeck = null
1515
var/linkedholodeck_area
16-
var/active = 0
16+
var/active = FALSE
1717
var/list/holographic_objs = list()
1818
var/list/holographic_mobs = list()
19-
var/damaged = 0
20-
var/safety_disabled = 0
19+
var/list/obj_buffer = list()
20+
var/damaged = FALSE
21+
var/safety_disabled = FALSE
2122
var/mob/last_to_emag = null
2223
var/last_change = 0
2324
var/last_gravity_change = 0
2425
var/list/supported_programs
2526
var/list/restricted_programs
27+
var/lastprogram = "turnoff"
2628

2729
/obj/machinery/computer/HolodeckControl/New()
2830
..()
@@ -31,7 +33,7 @@
3133
supported_programs = list()
3234
restricted_programs = list()
3335

34-
/obj/machinery/computer/HolodeckControl/attack_hand(var/mob/user as mob)
36+
/obj/machinery/computer/HolodeckControl/attack_hand(mob/user as mob)
3537
if(..())
3638
return 1
3739
user.set_machine(src)
@@ -56,7 +58,8 @@
5658
dat += "<A href='?src=\ref[src];program=[supported_programs[prog]]'>([prog])</A><BR>"
5759

5860
dat += "<BR>"
59-
dat += "<A href='?src=\ref[src];program=turnoff'>(Turn Off)</A><BR>"
61+
var/togglething = !active
62+
dat += "<A href='?src=\ref[src];toggle=[togglething]'>(Turn [active ? "Off" : "On"])</A><BR>"
6063

6164
dat += "<BR>"
6265
dat += "Please ensure that only holographic weapons are used in the holodeck if a combat simulation has been loaded.<BR>"
@@ -97,10 +100,13 @@
97100

98101
usr.set_machine(src)
99102

100-
if(href_list["program"])
103+
if(!isnull(href_list["toggle"]))
104+
togglePower(text2num(href_list["toggle"]))
105+
106+
else if(href_list["program"])
101107
var/prog = href_list["program"]
102108
if(prog in holodeck_programs)
103-
loadProgram(holodeck_programs[prog])
109+
loadProgram(prog)
104110

105111
else if(href_list["AIoverride"])
106112
if(!issilicon(usr))
@@ -124,12 +130,12 @@
124130
src.updateUsrDialog()
125131
return
126132

127-
/obj/machinery/computer/HolodeckControl/emag_act(var/remaining_charges, var/mob/user as mob)
133+
/obj/machinery/computer/HolodeckControl/emag_act(remaining_charges, mob/user as mob)
128134
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
129135
last_to_emag = user //emag again to change the owner
130136
if (!emagged)
131-
emagged = 1
132-
safety_disabled = 1
137+
emagged = TRUE
138+
safety_disabled = TRUE
133139
update_projections()
134140
to_chat(user, SPAN_NOTICE("You vastly increase projector power and override the safety and security protocols."))
135141
to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call [company_name] maintenance and do not use the simulator.")
@@ -157,10 +163,12 @@
157163
//This could all be done better, but it works for now.
158164
/obj/machinery/computer/HolodeckControl/Destroy()
159165
emergencyShutdown()
166+
clearbuffer()
160167
. = ..()
161168

162169
/obj/machinery/computer/HolodeckControl/explosion_act(target_power, explosion_handler/handler)
163170
emergencyShutdown()
171+
clearbuffer()
164172
. = ..()
165173

166174
/obj/machinery/computer/HolodeckControl/power_change()
@@ -172,7 +180,7 @@
172180
/obj/machinery/computer/HolodeckControl/Process()
173181
for(var/item in holographic_objs) // do this first, to make sure people don't take items out when power is down.
174182
if(!(get_turf(item) in linkedholodeck))
175-
derez(item, 0)
183+
derez(item, FALSE)
176184

177185
if (!safety_disabled)
178186
for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
@@ -185,9 +193,10 @@
185193
if(active)
186194
use_power(item_power_usage * (holographic_objs.len + holographic_mobs.len))
187195
if(!checkInteg(linkedholodeck))
188-
damaged = 1
189-
loadProgram(holodeck_programs["turnoff"], 0)
190-
active = 0
196+
damaged = TRUE
197+
loadProgram("turnoff", 0)
198+
clearbuffer()
199+
active = FALSE
191200
set_power_use(IDLE_POWER_USE)
192201
for(var/mob/M in range(10,src))
193202
M.show_message("The holodeck overloads!")
@@ -201,48 +210,80 @@
201210
T.explosion_act(100, null)
202211
T.hotspot_expose(1000,500,1)
203212

204-
/obj/machinery/computer/HolodeckControl/proc/derez(var/obj/obj , var/silent = 1)
205-
holographic_objs.Remove(obj)
206213

207-
if(obj == null)
214+
/datum/holoposition
215+
var/holx
216+
var/holy
217+
var/holz
218+
var/holotype
219+
var/datum/weakref/trueobj
220+
221+
/datum/holoposition/proc/setup(obj/refobj)
222+
holx = refobj.x
223+
holy = refobj.y
224+
holz = refobj.z
225+
holotype = refobj.type
226+
trueobj = WEAKREF(refobj)
227+
228+
// clears the off-state buffer
229+
/obj/machinery/computer/HolodeckControl/proc/clearbuffer()
230+
for(var/datum/holoposition/toclear in obj_buffer)
231+
var/obj/resolved = toclear.trueobj.resolve()
232+
if(resolved)
233+
qdel(resolved)
234+
QDEL_LIST(obj_buffer)
235+
236+
/obj/machinery/computer/HolodeckControl/proc/derez(obj/gone , silent = TRUE, buffer = FALSE)
237+
if(gone == null)
238+
to_chat(world, "nullobj")
208239
return
209240

210-
if(isobj(obj))
211-
var/mob/M = obj.loc
241+
holographic_objs.Remove(gone)
242+
to_chat(world, "gone")
243+
if(isobj(gone))
244+
if(buffer)
245+
var/datum/holoposition/holofile = new()
246+
holofile.setup(gone)
247+
obj_buffer.Add(holofile)
248+
var/mob/M = gone.loc
212249
if(ismob(M))
213-
M.remove_from_mob(obj)
250+
M.remove_from_mob(gone)
214251
M.update_icons() //so their overlays update
215252

216253
if(!silent)
217-
var/obj/oldobj = obj
254+
var/obj/oldobj = gone
218255
visible_message("The [oldobj.name] fades away!")
219-
qdel(obj)
220256

221-
/obj/machinery/computer/HolodeckControl/proc/checkInteg(var/area/A)
257+
if(buffer)
258+
gone.forceMove(src) // hide in computer
259+
else
260+
qdel(gone)
261+
262+
/obj/machinery/computer/HolodeckControl/proc/checkInteg(area/A)
222263
for(var/turf/T in A)
223264
if(istype(T, /turf/space))
224265
return 0
225266

226267
return 1
227268

228-
//Why is it called toggle if it doesn't toggle?
229-
/obj/machinery/computer/HolodeckControl/proc/togglePower(var/toggleOn = 0)
269+
// why wouldn't toggle toggle?
270+
/obj/machinery/computer/HolodeckControl/proc/togglePower(toggleOn)
230271
if(toggleOn)
231-
loadProgram(holodeck_programs["emptycourt"], 0)
272+
loadProgram(lastprogram, TRUE, TRUE)
232273
else
233-
loadProgram(holodeck_programs["turnoff"], 0)
234-
274+
loadProgram("turnoff", FALSE)
235275

236276

237277
if(!linkedholodeck.has_gravity)
238278
linkedholodeck.has_gravity = TRUE
239279
linkedholodeck.update_gravity()
240280

241-
active = 0
281+
active = FALSE
242282
set_power_use(IDLE_POWER_USE)
243283

244284

245-
/obj/machinery/computer/HolodeckControl/proc/loadProgram(var/datum/holodeck_program/HP, var/check_delay = 1)
285+
/obj/machinery/computer/HolodeckControl/proc/loadProgram(programName, check_delay = TRUE, buffered = FALSE)
286+
var/datum/holodeck_program/HP = holodeck_programs[programName]
246287
if(!HP)
247288
return
248289
var/area/A = locate(HP.target)
@@ -253,17 +294,19 @@
253294
if(world.time < (last_change + 25))
254295
if(world.time < (last_change + 15))//To prevent super-spam clicking, reduced process size and annoyance -Sieve
255296
return
256-
for(var/mob/M in range(3,src))
257-
M.show_message("\b ERROR. Recalibrating projection apparatus.")
258-
last_change = world.time
259-
return
297+
visible_message(SPAN_DANGER("[src] flashes 'ERROR. Recalibrating projection apparatus.'"), SPAN_WARNING("[src] buzzes."), 3)
298+
last_change = world.time
299+
return
260300

261301
last_change = world.time
262-
active = 1
302+
active = TRUE
263303
set_power_use(ACTIVE_POWER_USE)
264304

305+
265306
for(var/item in holographic_objs)
266-
derez(item)
307+
derez(item, TRUE, !buffered)
308+
if(programName != "turnoff" && !buffered)
309+
clearbuffer()
267310

268311
for(var/mob/living/simple_animal/hostile/carp/holodeck/C in holographic_mobs)
269312
holographic_mobs -= C
@@ -272,11 +315,25 @@
272315
for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
273316
qdel(B)
274317

275-
holographic_objs = A.copy_contents_to(linkedholodeck , 0)
318+
holographic_objs = A.copy_contents_to(linkedholodeck , FALSE, buffered)
276319
for(var/obj/holo_obj in holographic_objs)
277320
holo_obj.alpha *= 0.9 //give holodeck objs a slight transparency
278-
holo_obj.plane = 63 //This makes all objects load on the plane that Eris's 3rd z-level uses for objects. This is not dynamic.
279-
321+
holo_obj.update_plane()
322+
323+
if(buffered)
324+
for(var/datum/holoposition/toreturn in obj_buffer)
325+
var/turf/toplace = locate(toreturn.holx, toreturn.holy, toreturn.holz)
326+
var/obj/replaced = toreturn.trueobj.resolve()
327+
if(!toplace)
328+
toplace = get_turf(src)
329+
if(!replaced)
330+
replaced = new toreturn.holotype(toplace)
331+
replaced.alpha *= 0.9 //give holodeck objs a slight transparency
332+
else
333+
replaced.forceMove(toplace)
334+
holographic_objs.Add(replaced) // we do this after the transparency because we assume it already has it
335+
QDEL_LIST(obj_buffer) // we just used the entire list, it is no longer necessary
336+
280337
if(HP.ambience)
281338
linkedholodeck.forced_ambience = HP.ambience
282339
else
@@ -285,6 +342,8 @@
285342
for(var/mob/living/M in mobs_in_area(linkedholodeck))
286343
if(M.mind)
287344
linkedholodeck.play_ambience(M)
345+
if(programName != "turnoff")
346+
lastprogram = programName
288347

289348
spawn(30)
290349
for(var/obj/landmark/L in linkedholodeck)
@@ -307,17 +366,17 @@
307366
update_projections()
308367

309368

310-
/obj/machinery/computer/HolodeckControl/proc/toggleGravity(var/area/A)
369+
/obj/machinery/computer/HolodeckControl/proc/toggleGravity(area/A)
311370
if(world.time < (last_gravity_change + 25))
312371
if(world.time < (last_gravity_change + 15))//To prevent super-spam clicking
313372
return
314-
for(var/mob/M in range(3,src))
315-
M.show_message("\b ERROR. Recalibrating gravity field.")
316-
last_change = world.time
317-
return
373+
374+
visible_message(SPAN_DANGER("[src] flashes 'ERROR. Recalibrating gravity field.'"), SPAN_WARNING("[src] buzzes."), 3)
375+
last_change = world.time
376+
return
318377

319378
last_gravity_change = world.time
320-
active = 1
379+
active = TRUE
321380
set_power_use(ACTIVE_POWER_USE)
322381

323382

@@ -329,12 +388,12 @@
329388

330389
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
331390
//Turn it back to the regular non-holographic room
332-
loadProgram(holodeck_programs["turnoff"], 0)
391+
loadProgram("turnoff", FALSE)
333392

334393

335394
linkedholodeck.has_gravity = TRUE
336395

337-
active = 0
396+
active = FALSE
338397
set_power_use(IDLE_POWER_USE)
339398

340399
/obj/machinery/computer/HolodeckControl/Exodus

0 commit comments

Comments
 (0)