From a2e487c86ed5b556d2655ccf7fad86aa0014ce3b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 1 Aug 2017 16:59:50 -0500 Subject: [PATCH 01/70] Makes GetComponent() faster using typecache magic --- code/__HELPERS/type2type.dm | 15 +++++++++++++++ code/datums/components/component.dm.rej | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 code/datums/components/component.dm.rej diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 36a81e90e2..7df96c3da2 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -537,3 +537,18 @@ if(!istype(the_matrix) || the_matrix.len != 20) return "#ffffffff" return rgb(the_matrix[1]*255, the_matrix[6]*255, the_matrix[11]*255, the_matrix[16]*255) + +/proc/type2parent(child) + var/string_type = "[child]" + var/last_slash = findlasttext(string_type, "/") + if(last_slash == 1) + switch(child) + if(/datum) + return null + if(/obj || /mob) + return /atom/movable + if(/area || /turf) + return /atom + else + return /datum + return text2path(copytext(string_type, 1, last_slash)) \ No newline at end of file diff --git a/code/datums/components/component.dm.rej b/code/datums/components/component.dm.rej new file mode 100644 index 0000000000..7d216a39c5 --- /dev/null +++ b/code/datums/components/component.dm.rej @@ -0,0 +1,18 @@ +diff a/code/datums/components/component.dm b/code/datums/components/component.dm (rejected hunks) +@@ -22,8 +22,7 @@ + //lazy init the parent's dc list + var/list/dc = P.datum_components + if(!dc) +- dc = list() +- P.datum_components = dc ++ P.datum_components = dc = list() + + //set up the typecache + var/our_type = type +@@ -179,4 +178,4 @@ + helicopter.SendSignal(COMSIG_COMPONENT_REMOVING, C) + C.OnTransfer(src) + C.parent = src +- SendSignal(COMSIG_COMPONENT_ADDED, C) +\ No newline at end of file ++ SendSignal(COMSIG_COMPONENT_ADDED, C) From 468b14a01139e397f6482e198c3935ad5c3c11d8 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 2 Aug 2017 06:04:43 -0500 Subject: [PATCH 02/70] Update component.dm --- code/datums/components/component.dm | 168 +++++++++++++++++++++------- 1 file changed, 126 insertions(+), 42 deletions(-) diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm index b9212d2786..5e25a581f8 100644 --- a/code/datums/components/component.dm +++ b/code/datums/components/component.dm @@ -1,8 +1,8 @@ /datum/component - var/enabled = TRUE // Enables or disables the components - var/dupe_mode = COMPONENT_DUPE_HIGHLANDER // How components of the same type are handled in the same parent - var/list/signal_procs // list of signals -> callbacks - var/datum/parent // parent datum + var/enabled = TRUE + var/dupe_mode = COMPONENT_DUPE_HIGHLANDER + var/list/signal_procs + var/datum/parent /datum/component/New(datum/P, ...) var/dm = dupe_mode @@ -11,26 +11,78 @@ if(old) switch(dm) if(COMPONENT_DUPE_HIGHLANDER) - P.RemoveComponent(old) - old = null //in case SendSignal() blocks + InheritComponent(old, FALSE) + qdel(old) if(COMPONENT_DUPE_UNIQUE) + old.InheritComponent(src, TRUE) qdel(src) return - P.SendSignal(COMSIG_COMPONENT_ADDED, list(src), FALSE) - LAZYADD(P.datum_components, src) + P.SendSignal(COMSIG_COMPONENT_ADDED, src) + + //lazy init the parent's dc list + var/list/dc = P.datum_components + if(!dc) + P.datum_components = dc = list() + + //set up the typecache + var/our_type = type + for(var/I in _GetInverseTypeListExceptRoot(our_type)) + var/test = dc[I] + if(test) //already another component of this type here + var/list/components_of_type + if(!islist(test)) + components_of_type = list(test) + dc[I] = components_of_type + else + components_of_type = test + if(I == our_type) //exact match, take priority + var/inserted = FALSE + for(var/J in 1 to components_of_type.len) + var/datum/component/C = components_of_type[J] + if(C.type != our_type) //but not over other exact matches + components_of_type.Insert(J, I) + inserted = TRUE + break + if(!inserted) + components_of_type += src + else //indirect match, back of the line with ya + components_of_type += src + else //only component of this type, no list + dc[I] = src + parent = P /datum/component/Destroy() - RemoveNoSignal() - return ..() - -/datum/component/proc/RemoveNoSignal() + enabled = FALSE var/datum/P = parent if(P) - LAZYREMOVE(P.datum_components, src) + _RemoveNoSignal() + P.SendSignal(COMSIG_COMPONENT_REMOVING, src) + LAZYCLEARLIST(signal_procs) + return ..() + +/datum/component/proc/_RemoveNoSignal() + var/datum/P = parent + if(P) + var/list/dc = P.datum_components + var/our_type = type + for(var/I in _GetInverseTypeListExceptRoot(our_type)) + var/list/components_of_type = dc[I] + if(islist(components_of_type)) // + var/list/subtracted = components_of_type - src + if(subtracted.len == 1) //only 1 guy left + dc[I] = subtracted[1] //make him special + else + dc[I] = subtracted + else //just us + dc -= I + if(!dc.len) + P.datum_components = null parent = null /datum/component/proc/RegisterSignal(sig_type, proc_on_self, override = FALSE) + if(QDELETED(src)) + return var/list/procs = signal_procs if(!procs) procs = list() @@ -43,45 +95,71 @@ procs[sig_type] = CALLBACK(src, proc_on_self) -/datum/var/list/datum_components //list of /datum/component +/datum/component/proc/ReceiveSignal(sigtype, ...) + var/list/sps = signal_procs + var/datum/callback/CB = LAZYACCESS(sps, sigtype) + if(!CB) + return FALSE + var/list/arguments = args.Copy() + arguments.Cut(1, 2) + return CB.InvokeAsync(arglist(arguments)) -// Send a signal to all other components in the container. -/datum/proc/SendSignal(sigtype, list/sig_args, async = FALSE) +/datum/component/proc/InheritComponent(datum/component/C, i_am_original) + return + +/datum/component/proc/OnTransfer(datum/new_parent) + return + +/datum/component/proc/_GetInverseTypeListExceptRoot(our_type_cached) + var/datum/component/current_type = our_type_cached + . = list() + while (current_type != /datum/component) + . += current_type + current_type = type2parent(current_type) + +/datum/var/list/datum_components //special typecache of /datum/component + +/datum/proc/SendSignal(sigtype, ...) var/list/comps = datum_components . = FALSE for(var/I in comps) var/datum/component/C = I if(!C.enabled) continue - var/list/sps = C.signal_procs - var/datum/callback/CB = LAZYACCESS(sps, sigtype) - if(!CB) - continue - if(!async) - . |= CB.Invoke(sig_args) - else - . |= CB.InvokeAsync(sig_args) + if(C.ReceiveSignal(arglist(args))) + ComponentActivated(C) + . = TRUE + +/datum/proc/ComponentActivated(datum/component/C) + return /datum/proc/GetComponent(c_type) - for(var/I in datum_components) - if(istype(I, c_type)) - return I + var/list/dc = datum_components + if(!dc) + return null + . = dc[c_type] + if(islist(.)) + return .[1] /datum/proc/GetExactComponent(c_type) - for(var/I in datum_components) - var/datum/component/C = I + var/list/dc = datum_components + if(!dc) + return null + var/datum/component/C = dc[c_type] + if(C) + if(islist(C)) + C = C[1] if(C.type == c_type) - return I + return C + return null /datum/proc/GetComponents(c_type) - . = list() - for(var/I in datum_components) - if(istype(I, c_type)) - . += I - -/datum/proc/AddComponents(list/new_types) - for(var/new_type in new_types) - AddComponent(new_type) + var/list/dc = datum_components + if(!dc) + return null + . = dc[c_type] + if(!islist(.)) + return list(.) /datum/proc/AddComponent(new_type, ...) var/nt = new_type @@ -89,9 +167,15 @@ var/datum/component/C = new nt(arglist(args)) return QDELING(C) ? GetComponent(new_type) : C -/datum/proc/RemoveComponent(datum/component/C) +/datum/proc/TakeComponent(datum/component/C) if(!C) return - C.RemoveNoSignal() - SendSignal(COMSIG_COMPONENT_REMOVING, list(C), FALSE) - qdel(C) + var/datum/helicopter = C.parent + if(helicopter == src) + //wat + return + C._RemoveNoSignal() + helicopter.SendSignal(COMSIG_COMPONENT_REMOVING, C) + C.OnTransfer(src) + C.parent = src + SendSignal(COMSIG_COMPONENT_ADDED, C) From 3e96c59bb79d99e3fa30f4ce9565d332cf82877d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 3 Aug 2017 13:15:13 -0500 Subject: [PATCH 03/70] Fixes SendSignal() --- code/datums/components/component.dm.rej | 63 +++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 code/datums/components/component.dm.rej diff --git a/code/datums/components/component.dm.rej b/code/datums/components/component.dm.rej new file mode 100644 index 0000000000..17aaf74125 --- /dev/null +++ b/code/datums/components/component.dm.rej @@ -0,0 +1,63 @@ +diff a/code/datums/components/component.dm b/code/datums/components/component.dm (rejected hunks) +@@ -26,7 +26,7 @@ + + //set up the typecache + var/our_type = type +- for(var/I in _GetInverseTypeListExceptRoot(our_type)) ++ for(var/I in _GetInverseTypeList(our_type)) + var/test = dc[I] + if(test) //already another component of this type here + var/list/components_of_type +@@ -66,7 +66,7 @@ + if(P) + var/list/dc = P.datum_components + var/our_type = type +- for(var/I in _GetInverseTypeListExceptRoot(our_type)) ++ for(var/I in _GetInverseTypeList(our_type)) + var/list/components_of_type = dc[I] + if(islist(components_of_type)) // + var/list/subtracted = components_of_type - src +@@ -110,25 +110,33 @@ + /datum/component/proc/OnTransfer(datum/new_parent) + return + +-/datum/component/proc/_GetInverseTypeListExceptRoot(our_type_cached) +- var/datum/component/current_type = our_type_cached +- . = list() ++/datum/component/proc/_GetInverseTypeList(current_type) ++ . = list(current_type) + while (current_type != /datum/component) +- . += current_type + current_type = type2parent(current_type) ++ . += current_type + + /datum/var/list/datum_components //special typecache of /datum/component + + /datum/proc/SendSignal(sigtype, ...) + var/list/comps = datum_components + . = FALSE +- for(var/I in comps) +- var/datum/component/C = I +- if(!C.enabled) +- continue +- if(C.ReceiveSignal(arglist(args))) ++ if(!comps) ++ return ++ var/target = comps[/datum/component] ++ if(!islist(target)) ++ var/datum/component/C = target ++ if(C.enabled && C.ReceiveSignal(arglist(args))) + ComponentActivated(C) +- . = TRUE ++ return TRUE ++ else ++ for(var/I in target) ++ var/datum/component/C = I ++ if(!C.enabled) ++ continue ++ if(C.ReceiveSignal(arglist(args))) ++ ComponentActivated(C) ++ . = TRUE + + /datum/proc/ComponentActivated(datum/component/C) + return From 4d19a895192136da5cb788b1fc82e04e804913d4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 9 Aug 2017 19:24:19 -0500 Subject: [PATCH 04/70] Removes a great amount of machinery copypasta with circuitboards. --- .../abduction/machinery/dispenser.dm | 4 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 5 +- code/game/machinery/Beacon.dm | 8 +- code/game/machinery/PDApainter.dm | 20 +- code/game/machinery/Sleeper.dm | 18 +- .../machinery/{machinery.dm => _machinery.dm} | 6 + code/game/machinery/announcement_system.dm | 20 +- code/game/machinery/autolathe.dm | 32 +- code/game/machinery/bank_machine.dm | 4 +- code/game/machinery/cloning.dm | 25 +- code/game/machinery/computer/Operating.dm | 4 +- .../computer/{computer.dm => _computer.dm} | 271 ++++--- code/game/machinery/computer/apc_control.dm | 2 +- code/game/machinery/computer/arcade.dm | 17 +- .../game/machinery/computer/buildandrepair.dm | 318 +------- code/game/machinery/computer/card.dm | 4 +- code/game/machinery/computer/cloning.dm | 2 +- .../game/machinery/computer/communications.dm | 4 +- code/game/machinery/computer/dna_console.dm | 18 +- .../machinery/computer/gulag_teleporter.dm | 6 +- .../machinery/computer/monastery_shuttle.dm | 4 - code/game/machinery/computer/teleporter.dm | 212 +++++ code/game/machinery/constructable_frame.dm | 50 +- code/game/machinery/dance_machine.dm | 2 +- code/game/machinery/dna_scanner.dm | 19 +- code/game/machinery/doors/alarmlock.dm | 2 +- code/game/machinery/doors/brigdoors.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doppler_array.dm | 4 +- code/game/machinery/droneDispenser.dm | 33 +- .../embedded_controller/airlock_controller.dm | 2 +- .../embedded_controller_base.dm | 2 +- .../simple_vent_controller.dm | 3 +- code/game/machinery/flasher.dm | 18 +- code/game/machinery/gulag_teleporter.dm | 31 +- code/game/machinery/hologram.dm | 9 +- code/game/machinery/igniter.dm | 11 +- code/game/machinery/iv_drip.dm.rej | 10 + code/game/machinery/launch_pad.dm | 19 +- code/game/machinery/lightswitch.dm | 2 +- code/game/machinery/limbgrower.dm | 24 +- code/game/machinery/magnet.dm | 25 +- code/game/machinery/navbeacon.dm | 4 +- code/game/machinery/newscaster.dm | 7 +- .../machinery/porta_turret/portable_turret.dm | 26 +- .../porta_turret/portable_turret.dm.rej | 10 + code/game/machinery/quantum_pad.dm | 19 +- code/game/machinery/recharger.dm | 18 +- code/game/machinery/rechargestation.dm | 20 +- code/game/machinery/recycler.dm | 15 +- code/game/machinery/requests_console.dm | 2 +- code/game/machinery/shieldgen.dm | 6 +- code/game/machinery/slotmachine.dm | 2 +- code/game/machinery/spaceheater.dm | 16 +- code/game/machinery/suit_storage_unit.dm | 20 +- code/game/machinery/syndicatebomb.dm | 15 +- .../telecomms/machines/broadcaster.dm | 19 +- code/game/machinery/telecomms/machines/bus.dm | 24 +- code/game/machinery/telecomms/machines/hub.dm | 20 +- .../machinery/telecomms/machines/processor.dm | 21 +- .../machinery/telecomms/machines/receiver.dm | 25 +- .../machinery/telecomms/machines/relay.dm | 18 +- .../machinery/telecomms/machines/server.dm | 31 +- .../machinery/telecomms/telecomunications.dm | 4 +- code/game/machinery/teleporter.dm | 261 +------ code/game/machinery/transformer.dm | 6 +- code/game/machinery/vending.dm | 50 +- code/game/mecha/mech_bay.dm | 17 +- code/game/mecha/mech_fabricator.dm | 17 +- .../weapons/circuitboards/_circuitboard.dm | 55 ++ .../circuitboards/computer_circuitboards.dm | 369 +++++++++ .../circuitboards/machine_circuitboards.dm | 723 ++++++++++++++++++ .../items/weapons/implants/implantchair.dm | 8 +- code/modules/VR/vr_sleeper.dm | 3 +- .../components/unary_devices/cryo.dm | 22 +- .../components/unary_devices/thermomachine.dm | 65 +- .../atmospherics/machinery/portable/pump.dm | 5 +- code/modules/awaymissions/capture_the_flag.dm | 8 +- code/modules/awaymissions/gateway.dm | 17 +- code/modules/cargo/console.dm | 4 +- code/modules/cargo/packs.dm | 4 +- .../kitchen_machinery/deep_fryer.dm | 14 +- .../kitchen_machinery/food_cart.dm | 8 +- .../kitchen_machinery/gibber.dm | 76 +- .../kitchen_machinery/icecream_vat.dm | 25 +- .../kitchen_machinery/microwave.dm | 18 +- .../kitchen_machinery/monkeyrecycler.dm | 15 +- .../kitchen_machinery/processor.dm | 45 +- .../kitchen_machinery/smartfridge.dm | 41 +- code/modules/hydroponics/biogenerator.dm | 21 +- code/modules/hydroponics/gene_modder.dm | 34 +- code/modules/hydroponics/hydroponics.dm | 15 +- code/modules/hydroponics/seed_extractor.dm | 14 +- code/modules/library/lib_machines.dm | 4 +- code/modules/mining/aux_base.dm | 7 +- code/modules/mining/aux_base_camera.dm | 6 +- code/modules/mining/equipment/survival_pod.dm | 21 +- code/modules/mining/laborcamp/laborstacker.dm | 8 +- .../mining/machine_input_output_plates.dm | 6 +- code/modules/mining/machine_redemption.dm | 16 +- code/modules/mining/machine_vending.dm | 27 +- code/modules/mining/mint.dm | 8 +- .../hostile/megafauna/colossus.dm | 4 +- .../modular_computers/NTNet/NTNet_relay.dm | 17 +- code/modules/power/antimatter/control.dm | 7 +- code/modules/power/monitor.dm | 4 +- code/modules/power/port_gen.dm | 32 +- code/modules/power/rtg.dm | 46 +- code/modules/power/singularity/collector.dm | 4 +- code/modules/power/singularity/emitter.dm | 41 +- .../power/singularity/field_generator.dm | 4 +- .../particle_accelerator/particle_control.dm | 7 +- code/modules/power/smes.dm | 32 +- code/modules/power/terminal.dm | 11 +- code/modules/power/tesla/coil.dm | 25 +- code/modules/power/tracker.dm | 4 +- code/modules/power/turbine.dm | 38 +- .../chemistry/machinery/chem_dispenser.dm | 18 +- .../chemistry/machinery/chem_heater.dm | 14 +- .../chemistry/machinery/chem_master.dm | 33 +- code/modules/research/circuitprinter.dm | 18 +- code/modules/research/destructive_analyzer.dm | 15 +- code/modules/research/experimentor.dm | 12 +- code/modules/research/protolathe.dm | 16 +- code/modules/research/rdmachines.dm | 3 +- code/modules/research/server.dm | 8 - .../security_levels/keycard_authentication.dm | 4 +- code/modules/shuttle/computer.dm | 10 +- code/modules/shuttle/manipulator.dm | 10 +- code/modules/shuttle/special.dm | 2 +- code/modules/shuttle/syndicate.dm | 14 - code/modules/station_goals/bsa.dm | 29 - code/modules/station_goals/dna_vault.dm | 10 - code/modules/station_goals/shield.dm | 7 +- code/modules/stock_market/computer.dm | 4 +- tgstation.dme | 8 +- 136 files changed, 1994 insertions(+), 2196 deletions(-) rename code/game/machinery/{machinery.dm => _machinery.dm} (98%) rename code/game/machinery/computer/{computer.dm => _computer.dm} (84%) create mode 100644 code/game/machinery/computer/teleporter.dm create mode 100644 code/game/machinery/iv_drip.dm.rej create mode 100644 code/game/machinery/porta_turret/portable_turret.dm.rej create mode 100644 code/game/objects/items/weapons/circuitboards/_circuitboard.dm create mode 100644 code/game/objects/items/weapons/circuitboards/computer_circuitboards.dm create mode 100644 code/game/objects/items/weapons/circuitboards/machine_circuitboards.dm diff --git a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm index 90ea06fbd5..794b1bfa8e 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/dispenser.dm @@ -13,8 +13,8 @@ //TODO : replace with presets or spectrum return rgb(rand(0,255),rand(0,255),rand(0,255)) -/obj/machinery/abductor/gland_dispenser/New() - ..() +/obj/machinery/abductor/gland_dispenser/Initialize() + . = ..() gland_types = subtypesof(/obj/item/organ/heart/gland) gland_types = shuffle(gland_types) gland_colors = new/list(gland_types.len) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 755f6dd0c9..793313edfd 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -85,9 +85,8 @@ . = ..() var/obj/machinery/nuclearbomb/existing = locate("syndienuke") in GLOB.nuke_list if(existing) - qdel(src) - throw EXCEPTION("Attempted to spawn a syndicate nuke while one already exists at [existing.loc.x],[existing.loc.y],[existing.loc.z]") - return 0 + stack_trace("Attempted to spawn a syndicate nuke while one already exists at [existing.loc.x],[existing.loc.y],[existing.loc.z]") + return INITIALIZE_HINT_QDEL tag = "syndienuke" /obj/machinery/nuclearbomb/attackby(obj/item/I, mob/user, params) diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index d50af412a4..80400fee05 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -11,8 +11,8 @@ idle_power_usage = 0 var/obj/item/device/radio/beacon/Beacon -/obj/machinery/bluespace_beacon/New() - ..() +/obj/machinery/bluespace_beacon/Initialize() + . = ..() var/turf/T = loc Beacon = new /obj/item/device/radio/beacon Beacon.invisibility = INVISIBILITY_MAXIMUM @@ -21,9 +21,7 @@ hide(T.intact) /obj/machinery/bluespace_beacon/Destroy() - if(Beacon) - qdel(Beacon) - Beacon = null + QDEL_NULL(Beacon) return ..() // update the invisibility and icon diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 3da8871fc4..59bd4265d5 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -27,12 +27,16 @@ return -/obj/machinery/pdapainter/New() - ..() - var/blocked = list(/obj/item/device/pda/ai/pai, /obj/item/device/pda/ai, /obj/item/device/pda/heads, - /obj/item/device/pda/clear, /obj/item/device/pda/syndicate) - - for(var/P in typesof(/obj/item/device/pda)-blocked) +/obj/machinery/pdapainter/Initialize() + . = ..() + var/list/blocked = list( + /obj/item/device/pda/ai/pai, + /obj/item/device/pda/ai, + /obj/item/device/pda/heads, + /obj/item/device/pda/clear, + /obj/item/device/pda/syndicate) + + for(var/P in typesof(/obj/item/device/pda) - blocked) var/obj/item/device/pda/D = new P //D.name = "PDA Style [colorlist.len+1]" //Gotta set the name, otherwise it all comes up as "PDA" @@ -41,9 +45,7 @@ src.colorlist += D /obj/machinery/pdapainter/Destroy() - if(storedpda) - qdel(storedpda) - storedpda = null + QDEL_NULL(storedpda) return ..() /obj/machinery/pdapainter/on_deconstruction() diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 7171718dce..a14989c199 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -13,6 +13,7 @@ density = FALSE anchored = TRUE state_open = TRUE + circuit = /obj/item/weapon/circuitboard/machine/sleeper var/efficiency = 1 var/min_health = -25 var/list/available_chems @@ -26,24 +27,11 @@ var/list/chem_buttons //Used when emagged to scramble which chem is used, eg: antitoxin -> morphine var/scrambled_chems = FALSE //Are chem buttons scrambled? used as a warning -/obj/machinery/sleeper/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/sleeper(null) - B.apply_default_parts(src) +/obj/machinery/sleeper/Initialize() + . = ..() update_icon() reset_chem_buttons() -/obj/item/weapon/circuitboard/machine/sleeper - name = "Sleeper (Machine Board)" - build_path = /obj/machinery/sleeper - origin_tech = "programming=3;biotech=2;engineering=3" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/stack/cable_coil = 1, - /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/stack/sheet/glass = 1) - /obj/machinery/sleeper/RefreshParts() var/E for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/_machinery.dm similarity index 98% rename from code/game/machinery/machinery.dm rename to code/game/machinery/_machinery.dm index f5958843fc..32e0e60fca 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -123,12 +123,18 @@ Class Procs: var/interact_open = FALSE // Can the machine be interacted with when in maint/when the panel is open. var/interact_offline = 0 // Can the machine be interacted with while de-powered. var/speed_process = 0 // Process as fast as possible? + var/obj/item/weapon/circuitboard/circuit // Circuit to be created and inserted when the machinery is created /obj/machinery/Initialize() if(!armor) armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70) . = ..() GLOB.machines += src + + if(ispath(circuit, /obj/item/weapon/circuitboard)) + circuit = new circuit + circuit.apply_default_parts(src) + if(!speed_process) START_PROCESSING(SSmachines, src) else diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 5b5c9bee34..b1fddc8a76 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -7,7 +7,6 @@ GLOBAL_LIST_EMPTY(announcement_systems) desc = "An automated announcement system that handles minor announcements over the radio." icon = 'icons/obj/machines/telecomms.dmi' icon_state = "AAS_On" - var/obj/item/device/radio/headset/radio verb_say = "coldly states" verb_ask = "queries" @@ -16,6 +15,9 @@ GLOBAL_LIST_EMPTY(announcement_systems) idle_power_usage = 20 active_power_usage = 50 + circuit = /obj/item/weapon/circuitboard/machine/announcement_system + + var/obj/item/device/radio/headset/radio var/arrival = "%PERSON has signed up as %RANK" var/arrivalToggle = 1 var/newhead = "%PERSON, %RANK, is the department head." @@ -25,24 +27,12 @@ GLOBAL_LIST_EMPTY(announcement_systems) var/pinklight = "Light_Pink" var/errorlight = "Error_Red" -/obj/machinery/announcement_system/New() - ..() +/obj/machinery/announcement_system/Initialize() + . = ..() GLOB.announcement_systems += src radio = new /obj/item/device/radio/headset/ai(src) - - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/announcement_system(null) - B.apply_default_parts(src) - update_icon() -/obj/item/weapon/circuitboard/machine/announcement_system - name = "Announcement System (Machine Board)" - build_path = /obj/machinery/announcement_system - origin_tech = "programming=3;bluespace=3;magnets=2" - req_components = list( - /obj/item/stack/cable_coil = 2, - /obj/item/weapon/stock_parts/console_screen = 1) - /obj/machinery/announcement_system/update_icon() if(is_operational()) icon_state = (panel_open ? "AAS_On_Open" : "AAS_On") diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 1164851206..c6606c6ced 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -7,9 +7,13 @@ desc = "It produces items using metal and glass." icon_state = "autolathe" density = TRUE + anchored = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 10 + active_power_usage = 100 + circuit = /obj/item/weapon/circuitboard/machine/autolathe var/operating = FALSE - anchored = TRUE var/list/L = list() var/list/LL = list() var/hacked = FALSE @@ -18,9 +22,7 @@ var/hack_wire var/disable_wire var/shock_wire - use_power = IDLE_POWER_USE - idle_power_usage = 10 - active_power_usage = 100 + var/busy = FALSE var/prod_coeff = 1 @@ -45,30 +47,16 @@ "Imported" ) -/obj/machinery/autolathe/New() - ..() +/obj/machinery/autolathe/Initialize() materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS)) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/autolathe(null) - B.apply_default_parts(src) - wires = new /datum/wires/autolathe(src) files = new /datum/research/autolathe(src) matching_designs = list() - -/obj/item/weapon/circuitboard/machine/autolathe - name = "Autolathe (Machine Board)" - build_path = /obj/machinery/autolathe - origin_tech = "engineering=2;programming=2" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 3, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/weapon/stock_parts/console_screen = 1) + return ..() /obj/machinery/autolathe/Destroy() - qdel(wires) - wires = null - qdel(materials) - materials = null + QDEL_NULL(wires) + QDEL_NULL(materials) return ..() /obj/machinery/autolathe/interact(mob/user) diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index 0ebae75da6..de07fc9c2d 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -9,8 +9,8 @@ var/radio_channel = "Common" var/minimum_time_between_warnings = 400 -/obj/machinery/computer/bank_machine/Initialize(mapload) - ..() +/obj/machinery/computer/bank_machine/Initialize() + . = ..() radio = new(src) radio.subspace_transmission = TRUE radio.canhear_range = 0 diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 06c4cce2bc..df64aeb832 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -17,6 +17,8 @@ icon_state = "pod_0" req_access = list(ACCESS_CLONING) //FOR PREMATURE UNLOCKING. verb_say = "states" + circuit = /obj/item/weapon/circuitboard/machine/clonepod + var/heal_level //The clone is released once its health reaches this level. var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine. var/mess = FALSE //Need to clean out it if it's full of exploded clone. @@ -46,8 +48,6 @@ /obj/machinery/clonepod/Initialize() . = ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/clonepod(null) - B.apply_default_parts(src) countdown = new(src) @@ -59,16 +59,11 @@ /obj/machinery/clonepod/Destroy() go_out() - qdel(radio) - radio = null - qdel(countdown) - countdown = null + QDEL_NULL(radio) + QDEL_NULL(countdown) if(connected) connected.DetachCloner(src) - for(var/i in unattached_flesh) - qdel(i) - LAZYCLEARLIST(unattached_flesh) - unattached_flesh = null + QDEL_LIST(unattached_flesh) . = ..() /obj/machinery/clonepod/RefreshParts() @@ -84,16 +79,6 @@ if(heal_level > 100) heal_level = 100 -/obj/item/weapon/circuitboard/machine/clonepod - name = "Clone Pod (Machine Board)" - build_path = /obj/machinery/clonepod - origin_tech = "programming=2;biotech=2" - req_components = list( - /obj/item/stack/cable_coil = 2, - /obj/item/weapon/stock_parts/scanning_module = 2, - /obj/item/weapon/stock_parts/manipulator = 2, - /obj/item/stack/sheet/glass = 1) - //The return of data disks?? Just for transferring between genetics machine/cloning machine. //TO-DO: Make the genetics machine accept them. /obj/item/weapon/disk/data diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 02ef157de9..ab4eb941b7 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -4,8 +4,8 @@ icon_screen = "crew" icon_keyboard = "med_key" circuit = /obj/item/weapon/circuitboard/computer/operating - var/mob/living/carbon/human/patient = null - var/obj/structure/table/optable/table = null + var/mob/living/carbon/human/patient + var/obj/structure/table/optable/table light_color = LIGHT_COLOR_BLUE diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/_computer.dm similarity index 84% rename from code/game/machinery/computer/computer.dm rename to code/game/machinery/computer/_computer.dm index d4dc73a2e6..85c02f6d37 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -1,142 +1,129 @@ -/obj/machinery/computer - name = "computer" - icon = 'icons/obj/computer.dmi' - icon_state = "computer" - density = TRUE - anchored = TRUE - use_power = IDLE_POWER_USE - idle_power_usage = 300 - active_power_usage = 300 - max_integrity = 200 - integrity_failure = 100 - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 40, acid = 20) - var/obj/item/weapon/circuitboard/computer/circuit = null // if circuit==null, computer can't disassembly - var/processing = FALSE - var/brightness_on = 2 - var/icon_keyboard = "generic_key" - var/icon_screen = "generic" - var/clockwork = FALSE - -/obj/machinery/computer/New(location, obj/item/weapon/circuitboard/C) - ..(location) - if(C && istype(C)) - circuit = C - //Some machines, oldcode arcades mostly, new themselves, so circuit - //can already be an instance of a type and trying to new that will - //cause a runtime - else if(ispath(circuit)) - circuit = new circuit(null) - -/obj/machinery/computer/Destroy() - if(circuit) - qdel(circuit) - circuit = null - return ..() - -/obj/machinery/computer/Initialize() - . = ..() - power_change() - -/obj/machinery/computer/process() - if(stat & (NOPOWER|BROKEN)) - return 0 - return 1 - -/obj/machinery/computer/ratvar_act() - if(!clockwork) - clockwork = TRUE - icon_screen = "ratvar[rand(1, 4)]" - icon_keyboard = "ratvar_key[rand(1, 6)]" - icon_state = "ratvarcomputer[rand(1, 4)]" - update_icon() - -/obj/machinery/computer/narsie_act() - if(clockwork && clockwork != initial(clockwork)) //if it's clockwork but isn't normally clockwork - clockwork = FALSE - icon_screen = initial(icon_screen) - icon_keyboard = initial(icon_keyboard) - icon_state = initial(icon_state) - update_icon() - -/obj/machinery/computer/update_icon() - cut_overlays() - if(stat & NOPOWER) - add_overlay("[icon_keyboard]_off") - return - add_overlay(icon_keyboard) - if(stat & BROKEN) - add_overlay("[icon_state]_broken") - else - add_overlay(icon_screen) - -/obj/machinery/computer/power_change() - ..() - if(stat & NOPOWER) - set_light(0) - else - set_light(brightness_on) - update_icon() - return - -/obj/machinery/computer/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/screwdriver) && circuit && !(flags&NODECONSTRUCT)) - playsound(src.loc, I.usesound, 50, 1) - to_chat(user, " You start to disconnect the monitor...") - if(do_after(user, 20*I.toolspeed, target = src)) - deconstruct(TRUE, user) - else - return ..() - -/obj/machinery/computer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - if(stat & BROKEN) - playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) - else - playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1) - if(BURN) - playsound(src.loc, 'sound/items/welder.ogg', 100, 1) - -/obj/machinery/computer/obj_break(damage_flag) - if(circuit && !(flags & NODECONSTRUCT)) //no circuit, no breaking - if(!(stat & BROKEN)) - playsound(loc, 'sound/effects/glassbr3.ogg', 100, 1) - stat |= BROKEN - update_icon() - -/obj/machinery/computer/emp_act(severity) - switch(severity) - if(1) - if(prob(50)) - obj_break("energy") - if(2) - if(prob(10)) - obj_break("energy") - ..() - -/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user) - on_deconstruction() - if(!(flags & NODECONSTRUCT)) - if(circuit) //no circuit, no computer frame - var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc) - A.circuit = circuit - A.anchored = TRUE - if(stat & BROKEN) - if(user) - to_chat(user, "The broken glass falls out.") - else - playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) - new /obj/item/weapon/shard(src.loc) - new /obj/item/weapon/shard(src.loc) - A.state = 3 - A.icon_state = "3" - else - if(user) - to_chat(user, "You disconnect the monitor.") - A.state = 4 - A.icon_state = "4" - circuit = null - for(var/obj/C in src) - C.forceMove(loc) - - qdel(src) +/obj/machinery/computer + name = "computer" + icon = 'icons/obj/computer.dmi' + icon_state = "computer" + density = TRUE + anchored = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 300 + active_power_usage = 300 + max_integrity = 200 + integrity_failure = 100 + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 40, acid = 20) + var/processing = FALSE + var/brightness_on = 2 + var/icon_keyboard = "generic_key" + var/icon_screen = "generic" + var/clockwork = FALSE + +/obj/machinery/computer/Initialize(mapload, obj/item/weapon/circuitboard/C) + . = ..() + power_change() + +/obj/machinery/computer/Destroy() + QDEL_NULL(circuit) + return ..() + +/obj/machinery/computer/process() + if(stat & (NOPOWER|BROKEN)) + return 0 + return 1 + +/obj/machinery/computer/ratvar_act() + if(!clockwork) + clockwork = TRUE + icon_screen = "ratvar[rand(1, 4)]" + icon_keyboard = "ratvar_key[rand(1, 6)]" + icon_state = "ratvarcomputer[rand(1, 4)]" + update_icon() + +/obj/machinery/computer/narsie_act() + if(clockwork && clockwork != initial(clockwork)) //if it's clockwork but isn't normally clockwork + clockwork = FALSE + icon_screen = initial(icon_screen) + icon_keyboard = initial(icon_keyboard) + icon_state = initial(icon_state) + update_icon() + +/obj/machinery/computer/update_icon() + cut_overlays() + if(stat & NOPOWER) + add_overlay("[icon_keyboard]_off") + return + add_overlay(icon_keyboard) + if(stat & BROKEN) + add_overlay("[icon_state]_broken") + else + add_overlay(icon_screen) + +/obj/machinery/computer/power_change() + ..() + if(stat & NOPOWER) + set_light(0) + else + set_light(brightness_on) + update_icon() + return + +/obj/machinery/computer/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/screwdriver) && circuit && !(flags&NODECONSTRUCT)) + playsound(src.loc, I.usesound, 50, 1) + to_chat(user, " You start to disconnect the monitor...") + if(do_after(user, 20*I.toolspeed, target = src)) + deconstruct(TRUE, user) + else + return ..() + +/obj/machinery/computer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + switch(damage_type) + if(BRUTE) + if(stat & BROKEN) + playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + else + playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1) + if(BURN) + playsound(src.loc, 'sound/items/welder.ogg', 100, 1) + +/obj/machinery/computer/obj_break(damage_flag) + if(circuit && !(flags & NODECONSTRUCT)) //no circuit, no breaking + if(!(stat & BROKEN)) + playsound(loc, 'sound/effects/glassbr3.ogg', 100, 1) + stat |= BROKEN + update_icon() + +/obj/machinery/computer/emp_act(severity) + switch(severity) + if(1) + if(prob(50)) + obj_break("energy") + if(2) + if(prob(10)) + obj_break("energy") + ..() + +/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user) + on_deconstruction() + if(!(flags & NODECONSTRUCT)) + if(circuit) //no circuit, no computer frame + var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc) + A.circuit = circuit + A.anchored = TRUE + if(stat & BROKEN) + if(user) + to_chat(user, "The broken glass falls out.") + else + playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) + new /obj/item/weapon/shard(src.loc) + new /obj/item/weapon/shard(src.loc) + A.state = 3 + A.icon_state = "3" + else + if(user) + to_chat(user, "You disconnect the monitor.") + A.state = 4 + A.icon_state = "4" + circuit = null + for(var/obj/C in src) + C.forceMove(loc) + + qdel(src) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index bc5c8cbfa7..a288c9d51c 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -16,9 +16,9 @@ var/auth_id = "\[NULL\]" /obj/machinery/computer/apc_control/Initialize() + . = ..() apcs = list() //To avoid BYOND making the list run through a ton of procs filters = list("Name" = null, "Charge Above" = null, "Charge Below" = null, "Responsive" = null) - ..() /obj/machinery/computer/apc_control/process() apcs = list() //Clear the list every tick diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 286de0bcb8..ad48c9a12c 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -51,21 +51,17 @@ /obj/machinery/computer/arcade/proc/Reset() return -/obj/machinery/computer/arcade/New() - ..() +/obj/machinery/computer/arcade/Initialize() + . = ..() // If it's a generic arcade machine, pick a random arcade // circuit board for it and make the new machine if(!circuit) var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/computer/arcade)) var/obj/item/weapon/circuitboard/CB = new choice() new CB.build_path(loc, CB) - qdel(src) - -/obj/machinery/computer/arcade/Initialize() - . = ..() + return INITIALIZE_HINT_QDEL Reset() - #define PULSE_MEDAL "Jackpot" /obj/machinery/computer/arcade/proc/prizevend() @@ -78,11 +74,9 @@ new prizeselect(src) var/atom/movable/prize = pick(contents) - visible_message( - "[src] dispenses a [prize]!", - "You hear a chime and a clunk.") + visible_message("[src] dispenses a [prize]!", "You hear a chime and a clunk.") - prize.loc = loc + prize.forceMove(get_turf(src)) #undef PULSE_MEDAL /obj/machinery/computer/arcade/emp_act(severity) @@ -157,7 +151,6 @@ popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) popup.open() - return /obj/machinery/computer/arcade/battle/Topic(href, href_list) if(..()) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 889fda3dd8..a53b270130 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -142,320 +142,4 @@ new /obj/item/weapon/shard(loc) if(state >= 3) new /obj/item/stack/cable_coil(loc , 5) - ..() - - -/obj/item/weapon/circuitboard - name = "circuit board" - icon = 'icons/obj/module.dmi' - icon_state = "id_mod" - item_state = "electronic" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - origin_tech = "programming=2" - materials = list(MAT_GLASS=1000) - w_class = WEIGHT_CLASS_SMALL - var/build_path = null - -/obj/item/weapon/circuitboard/computer/turbine_computer - name = "Turbine Computer (Computer Board)" - build_path = /obj/machinery/computer/turbine_computer - origin_tech = "programming=4;engineering=4;powerstorage=4" -/obj/item/weapon/circuitboard/computer/launchpad_console - name = "Launchpad Control Console (Computer Board)" - build_path = /obj/machinery/computer/launchpad - origin_tech = "programming=3;bluespace=3;plasmatech=2" -/obj/item/weapon/circuitboard/computer/message_monitor - name = "Message Monitor (Computer Board)" - build_path = /obj/machinery/computer/message_monitor - origin_tech = "programming=2" -/obj/item/weapon/circuitboard/computer/security - name = "Security Cameras (Computer Board)" - build_path = /obj/machinery/computer/security - origin_tech = "programming=2;combat=2" -/obj/item/weapon/circuitboard/computer/xenobiology - name = "circuit board (Xenobiology Console)" - build_path = /obj/machinery/computer/camera_advanced/xenobio - origin_tech = "programming=3;biotech=3" -/obj/item/weapon/circuitboard/computer/base_construction - name = "circuit board (Aux Mining Base Construction Console)" - build_path = /obj/machinery/computer/camera_advanced/base_construction - origin_tech = "programming=3;engineering=3" -/obj/item/weapon/circuitboard/computer/aiupload - name = "AI Upload (Computer Board)" - build_path = /obj/machinery/computer/upload/ai - origin_tech = "programming=4;engineering=4" -/obj/item/weapon/circuitboard/computer/borgupload - name = "Cyborg Upload (Computer Board)" - build_path = /obj/machinery/computer/upload/borg - origin_tech = "programming=4;engineering=4" -/obj/item/weapon/circuitboard/computer/med_data - name = "Medical Records Console (Computer Board)" - build_path = /obj/machinery/computer/med_data - origin_tech = "programming=2;biotech=2" -/obj/item/weapon/circuitboard/computer/pandemic - name = "PanD.E.M.I.C. 2200 (Computer Board)" - build_path = /obj/machinery/computer/pandemic - origin_tech = "programming=2;biotech=2" -/obj/item/weapon/circuitboard/computer/scan_consolenew - name = "DNA Machine (Computer Board)" - build_path = /obj/machinery/computer/scan_consolenew - origin_tech = "programming=2;biotech=2" -/obj/item/weapon/circuitboard/computer/communications - name = "Communications (Computer Board)" - build_path = /obj/machinery/computer/communications - origin_tech = "programming=3;magnets=3" - var/lastTimeUsed = 0 - -/obj/item/weapon/circuitboard/computer/card - name = "ID Console (Computer Board)" - build_path = /obj/machinery/computer/card - origin_tech = "programming=3" -/obj/item/weapon/circuitboard/computer/card/centcom - name = "CentCom ID Console (Computer Board)" - build_path = /obj/machinery/computer/card/centcom - -/obj/item/weapon/circuitboard/computer/card/minor - name = "Department Management Console (Computer Board)" - build_path = /obj/machinery/computer/card/minor - var/target_dept = 1 - var/list/dept_list = list("General","Security","Medical","Science","Engineering") - -/obj/item/weapon/circuitboard/computer/card/minor/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/screwdriver)) - target_dept = (target_dept == dept_list.len) ? 1 : (target_dept + 1) - to_chat(user, "You set the board to \"[dept_list[target_dept]]\".") - else - return ..() - -/obj/item/weapon/circuitboard/computer/card/minor/examine(user) - ..() - to_chat(user, "Currently set to \"[dept_list[target_dept]]\".") - -//obj/item/weapon/circuitboard/computer/shield -// name = "Shield Control (Computer Board)" -// build_path = /obj/machinery/computer/stationshield -/obj/item/weapon/circuitboard/computer/teleporter - name = "Teleporter (Computer Board)" - build_path = /obj/machinery/computer/teleporter - origin_tech = "programming=3;bluespace=3;plasmatech=3" -/obj/item/weapon/circuitboard/computer/secure_data - name = "Security Records Console (Computer Board)" - build_path = /obj/machinery/computer/secure_data - origin_tech = "programming=2;combat=2" -/obj/item/weapon/circuitboard/computer/stationalert - name = "Station Alerts (Computer Board)" - build_path = /obj/machinery/computer/station_alert -/*/obj/item/weapon/circuitboard/computer/atmospheresiphonswitch - name = "Atmosphere siphon control (Computer Board)" - build_path = /obj/machinery/computer/atmosphere/siphonswitch*/ -/obj/item/weapon/circuitboard/computer/atmos_control - name = "Atmospheric Monitor (Computer Board)" - build_path = /obj/machinery/computer/atmos_control -/obj/item/weapon/circuitboard/computer/atmos_control/tank - name = "Tank Control (Computer Board)" - build_path = /obj/machinery/computer/atmos_control/tank - origin_tech = "programming=2;engineering=3;materials=2" -/obj/item/weapon/circuitboard/computer/atmos_alert - name = "Atmospheric Alert (Computer Board)" - build_path = /obj/machinery/computer/atmos_alert -/obj/item/weapon/circuitboard/computer/pod - name = "Massdriver control (Computer Board)" - build_path = /obj/machinery/computer/pod -/obj/item/weapon/circuitboard/computer/robotics - name = "Robotics Control (Computer Board)" - build_path = /obj/machinery/computer/robotics - origin_tech = "programming=3" -/obj/item/weapon/circuitboard/computer/cloning - name = "Cloning (Computer Board)" - build_path = /obj/machinery/computer/cloning - origin_tech = "programming=2;biotech=2" -/obj/item/weapon/circuitboard/computer/arcade/battle - name = "Arcade Battle (Computer Board)" - build_path = /obj/machinery/computer/arcade/battle - origin_tech = "programming=1" -/obj/item/weapon/circuitboard/computer/arcade/orion_trail - name = "Orion Trail (Computer Board)" - build_path = /obj/machinery/computer/arcade/orion_trail - origin_tech = "programming=1" -/obj/item/weapon/circuitboard/computer/turbine_control - name = "Turbine control (Computer Board)" - build_path = /obj/machinery/computer/turbine_computer -/obj/item/weapon/circuitboard/computer/solar_control - name = "Solar Control (Computer Board)" //name fixed 250810 - build_path = /obj/machinery/power/solar_control - origin_tech = "programming=2;powerstorage=2" -/obj/item/weapon/circuitboard/computer/powermonitor - name = "Power Monitor (Computer Board)" //name fixed 250810 - build_path = /obj/machinery/computer/monitor - origin_tech = "programming=2;powerstorage=2" -/obj/item/weapon/circuitboard/computer/olddoor - name = "DoorMex (Computer Board)" - build_path = /obj/machinery/computer/pod/old -/obj/item/weapon/circuitboard/computer/syndicatedoor - name = "ProComp Executive (Computer Board)" - build_path = /obj/machinery/computer/pod/old/syndicate -/obj/item/weapon/circuitboard/computer/swfdoor - name = "Magix (Computer Board)" - build_path = /obj/machinery/computer/pod/old/swf -/obj/item/weapon/circuitboard/computer/prisoner - name = "Prisoner Management Console (Computer Board)" - build_path = /obj/machinery/computer/prisoner -/obj/item/weapon/circuitboard/computer/gulag_teleporter_console - name = "Labor Camp teleporter console (Computer Board)" - build_path = /obj/machinery/computer/gulag_teleporter_computer - -/obj/item/weapon/circuitboard/computer/rdconsole - name = "R&D Console (Computer Board)" - build_path = /obj/machinery/computer/rdconsole/core - -/obj/item/weapon/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/screwdriver)) - if(build_path == /obj/machinery/computer/rdconsole/core) - name = "R&D Console - Robotics (Computer Board)" - build_path = /obj/machinery/computer/rdconsole/robotics - to_chat(user, "Access protocols successfully updated.") - else - name = "R&D Console (Computer Board)" - build_path = /obj/machinery/computer/rdconsole/core - to_chat(user, "Defaulting access protocols.") - else - return ..() - -/obj/item/weapon/circuitboard/computer/mecha_control - name = "Exosuit Control Console (Computer Board)" - build_path = /obj/machinery/computer/mecha -/obj/item/weapon/circuitboard/computer/rdservercontrol - name = "R&D Server Control (Computer Board)" - build_path = /obj/machinery/computer/rdservercontrol -/obj/item/weapon/circuitboard/computer/crew - name = "Crew Monitoring Console (Computer Board)" - build_path = /obj/machinery/computer/crew - origin_tech = "programming=2;biotech=2" -/obj/item/weapon/circuitboard/computer/mech_bay_power_console - name = "Mech Bay Power Control Console (Computer Board)" - build_path = /obj/machinery/computer/mech_bay_power_console - origin_tech = "programming=3;powerstorage=3" - -/obj/item/weapon/circuitboard/computer/cargo - name = "Supply Console (Computer Board)" - build_path = /obj/machinery/computer/cargo - origin_tech = "programming=3" - var/contraband = FALSE - var/emagged = FALSE - -/obj/item/weapon/circuitboard/computer/cargo/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/device/multitool)) - if(!emagged) - contraband = !contraband - to_chat(user, "Receiver spectrum set to [contraband ? "Broad" : "Standard"].") - else - to_chat(user, "The spectrum chip is unresponsive.") - else if(istype(I, /obj/item/weapon/card/emag)) - if(!emagged) - contraband = TRUE - emagged = TRUE - to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.") - else - return ..() - - -/obj/item/weapon/circuitboard/computer/cargo/request - name = "Supply Request Console (Computer Board)" - build_path = /obj/machinery/computer/cargo/request -/obj/item/weapon/circuitboard/computer/stockexchange - name = "circuit board (Stock Exchange Console)" - build_path = /obj/machinery/computer/stockexchange - origin_tech = "programming=3" - -/obj/item/weapon/circuitboard/computer/operating - name = "Operating Computer (Computer Board)" - build_path = /obj/machinery/computer/operating - origin_tech = "programming=2;biotech=3" -/obj/item/weapon/circuitboard/computer/mining - name = "Outpost Status Display (Computer Board)" - build_path = /obj/machinery/computer/security/mining -/obj/item/weapon/circuitboard/computer/comm_monitor - name = "Telecommunications Monitor (Computer Board)" - build_path = /obj/machinery/computer/telecomms/monitor - origin_tech = "programming=3;magnets=3;bluespace=2" -/obj/item/weapon/circuitboard/computer/comm_server - name = "Telecommunications Server Monitor (Computer Board)" - build_path = /obj/machinery/computer/telecomms/server - origin_tech = "programming=3;magnets=3;bluespace=2" - -/obj/item/weapon/circuitboard/computer/shuttle - name = "Shuttle (Computer Board)" - build_path = /obj/machinery/computer/shuttle - var/shuttleId - var/possible_destinations = "" - -/obj/item/weapon/circuitboard/computer/shuttle/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/device/multitool)) - var/chosen_id = round(input(usr, "Choose an ID number (-1 for reset):", "Input an Integer", null) as num|null) - if(chosen_id >= 0) - shuttleId = chosen_id - else - shuttleId = initial(shuttleId) - else - return ..() - -/obj/item/weapon/circuitboard/computer/labor_shuttle - name = "Labor Shuttle (Computer Board)" - build_path = /obj/machinery/computer/shuttle/labor -/obj/item/weapon/circuitboard/computer/labor_shuttle/one_way - name = "Prisoner Shuttle Console (Computer Board)" - build_path = /obj/machinery/computer/shuttle/labor/one_way -/obj/item/weapon/circuitboard/computer/ferry - name = "Transport Ferry (Computer Board)" - build_path = /obj/machinery/computer/shuttle/ferry -/obj/item/weapon/circuitboard/computer/ferry/request - name = "Transport Ferry Console (Computer Board)" - build_path = /obj/machinery/computer/shuttle/ferry/request -/obj/item/weapon/circuitboard/computer/mining_shuttle - name = "Mining Shuttle (Computer Board)" - build_path = /obj/machinery/computer/shuttle/mining -/obj/item/weapon/circuitboard/computer/white_ship - name = "White Ship (Computer Board)" - build_path = /obj/machinery/computer/shuttle/white_ship -/obj/item/weapon/circuitboard/computer/auxillary_base - name = "Auxillary Base Management Console (Computer Board)" - build_path = /obj/machinery/computer/auxillary_base -/obj/item/weapon/circuitboard/computer/holodeck// Not going to let people get this, but it's just here for future - name = "Holodeck Control (Computer Board)" - build_path = /obj/machinery/computer/holodeck - origin_tech = "programming=4" -/obj/item/weapon/circuitboard/computer/aifixer - name = "AI Integrity Restorer (Computer Board)" - build_path = /obj/machinery/computer/aifixer - origin_tech = "programming=2;biotech=2" -/*/obj/item/weapon/circuitboard/computer/prison_shuttle - name = "Prison Shuttle (Computer Board)" - build_path = /obj/machinery/computer/prison_shuttle*/ -/obj/item/weapon/circuitboard/computer/slot_machine - name = "Slot Machine (Computer Board)" - build_path = /obj/machinery/computer/slot_machine - origin_tech = "programming=1" - -/obj/item/weapon/circuitboard/computer/libraryconsole - name = "Library Visitor Console (Computer Board)" - build_path = /obj/machinery/computer/libraryconsole - origin_tech = "programming=1" - -/obj/item/weapon/circuitboard/computer/libraryconsole/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/screwdriver)) - if(build_path == /obj/machinery/computer/libraryconsole/bookmanagement) - name = "Library Visitor Console (Computer Board)" - build_path = /obj/machinery/computer/libraryconsole - to_chat(user, "Defaulting access protocols.") - else - name = "Book Inventory Management Console (Computer Board)" - build_path = /obj/machinery/computer/libraryconsole/bookmanagement - to_chat(user, "Access protocols successfully updated.") - else - return ..() - -/obj/item/weapon/circuitboard/computer/apc_control - name = "\improper Power Flow Control Console (Computer Board)" - build_path = /obj/machinery/computer/apc_control - origin_tech = "programming=3;engineering=3;powerstorage=2" + ..() \ No newline at end of file diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index a54ab19907..da8c7c43ca 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -572,8 +572,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) icon_screen = "idminor" circuit = /obj/item/weapon/circuitboard/computer/card/minor -/obj/machinery/computer/card/minor/New() - ..() +/obj/machinery/computer/card/minor/Initialize() + . = ..() var/obj/item/weapon/circuitboard/computer/card/minor/typed_circuit = circuit if(target_dept) typed_circuit.target_dept = target_dept diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index a4caa68480..6b76b3c98e 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -20,7 +20,7 @@ light_color = LIGHT_COLOR_BLUE /obj/machinery/computer/cloning/Initialize() - ..() + . = ..() updatemodules(TRUE) /obj/machinery/computer/cloning/Destroy() diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index ce6430d75c..47f38f0d87 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -41,9 +41,9 @@ return FALSE return TRUE -/obj/machinery/computer/communications/New() +/obj/machinery/computer/communications/Initialize() + . = ..() GLOB.shuttle_caller_list += src - ..() /obj/machinery/computer/communications/process() if(..()) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 27c0f50e7b..de18b51543 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -53,17 +53,13 @@ else return ..() -/obj/machinery/computer/scan_consolenew/New() - ..() - - spawn(5) - for(dir in list(NORTH,EAST,SOUTH,WEST)) - connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) - if(!isnull(connected)) - break - injectorready = world.time + INJECTOR_TIMEOUT - return - return +/obj/machinery/computer/scan_consolenew/Initialize() + . = ..() + for(dir in list(NORTH,EAST,SOUTH,WEST)) + connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir)) + if(!isnull(connected)) + break + injectorready = world.time + INJECTOR_TIMEOUT /obj/machinery/computer/scan_consolenew/attack_hand(mob/user) if(..()) diff --git a/code/game/machinery/computer/gulag_teleporter.dm b/code/game/machinery/computer/gulag_teleporter.dm index 07bfb4b6dd..4b7fccc221 100644 --- a/code/game/machinery/computer/gulag_teleporter.dm +++ b/code/game/machinery/computer/gulag_teleporter.dm @@ -15,9 +15,9 @@ light_color = LIGHT_COLOR_RED -/obj/machinery/computer/gulag_teleporter_computer/New() - ..() - addtimer(CALLBACK(src, .proc/scan_machinery), 5) +/obj/machinery/computer/gulag_teleporter_computer/Initialize() + . = ..() + scan_machinery() /obj/machinery/computer/gulag_teleporter_computer/Destroy() if(id) diff --git a/code/game/machinery/computer/monastery_shuttle.dm b/code/game/machinery/computer/monastery_shuttle.dm index e64d784a1f..ac2e9c9e78 100644 --- a/code/game/machinery/computer/monastery_shuttle.dm +++ b/code/game/machinery/computer/monastery_shuttle.dm @@ -5,7 +5,3 @@ shuttleId = "pod1" possible_destinations = "monastery_shuttle_asteroid;monastery_shuttle_station" no_destination_swap = TRUE - -/obj/item/weapon/circuitboard/computer/shuttle/monastery_shuttle - name = "Monastery Shuttle (Computer Board)" - build_path = /obj/machinery/computer/shuttle/monastery_shuttle diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm new file mode 100644 index 0000000000..f184d78a1b --- /dev/null +++ b/code/game/machinery/computer/teleporter.dm @@ -0,0 +1,212 @@ +/obj/machinery/computer/teleporter + name = "teleporter control console" + desc = "Used to control a linked teleportation Hub and Station." + icon_screen = "teleport" + icon_keyboard = "teleport_key" + light_color = LIGHT_COLOR_BLUE + circuit = /obj/item/weapon/circuitboard/computer/teleporter + var/obj/item/device/gps/locked + var/regime_set = "Teleporter" + var/id + var/obj/machinery/teleport/station/power_station + var/calibrating + var/turf/target //Used for one-time-use teleport cards (such as clown planet coordinates.) + //Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location. + +/obj/machinery/computer/teleporter/Initialize() + . = ..() + id = "[rand(1000, 9999)]" + link_power_station() + +/obj/machinery/computer/teleporter/Destroy() + if (power_station) + power_station.teleporter_console = null + power_station = null + return ..() + +/obj/machinery/computer/teleporter/proc/link_power_station() + if(power_station) + return + for(dir in GLOB.cardinals) + power_station = locate(/obj/machinery/teleport/station, get_step(src, dir)) + if(power_station) + break + return power_station + +/obj/machinery/computer/teleporter/attackby(obj/I, mob/living/user, params) + if(istype(I, /obj/item/device/gps)) + var/obj/item/device/gps/L = I + if(L.locked_location && !(stat & (NOPOWER|BROKEN))) + if(!user.transferItemToLoc(L, src)) + to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]!") + return + locked = L + to_chat(user, "You insert the GPS device into the [name]'s slot.") + else + return ..() + +/obj/machinery/computer/teleporter/attack_ai(mob/user) + return attack_hand(user) + +/obj/machinery/computer/teleporter/attack_hand(mob/user) + if(..()) + return + interact(user) + +/obj/machinery/computer/teleporter/interact(mob/user) + var/data = "

Teleporter Status

" + if(!power_station) + data += "
No power station linked.
" + else if(!power_station.teleporter_hub) + data += "
No hub linked.
" + else + data += "
Current regime: [regime_set]
" + data += "Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"]
" + if(calibrating) + data += "Calibration: In Progress" + else if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) + data += "Calibration: Optimal" + else + data += "Calibration: Sub-Optimal" + data += "

" + + data += "Change regime
" + data += "Set target
" + if(locked) + data += "
Get target from memory
" + data += "Eject GPS device
" + else + data += "
Get target from memory
" + data += "Eject GPS device
" + + data += "
Calibrate Hub" + + var/datum/browser/popup = new(user, "teleporter", name, 400, 400) + popup.set_content(data) + popup.open() + +/obj/machinery/computer/teleporter/Topic(href, href_list) + if(..()) + return + + if(href_list["eject"]) + eject() + updateDialog() + return + + if(!check_hub_connection()) + say("Error: Unable to detect hub.") + return + if(calibrating) + say("Error: Calibration in progress. Stand by.") + return + + if(href_list["regimeset"]) + power_station.engaged = 0 + power_station.teleporter_hub.update_icon() + power_station.teleporter_hub.calibrated = 0 + reset_regime() + if(href_list["settarget"]) + power_station.engaged = 0 + power_station.teleporter_hub.update_icon() + power_station.teleporter_hub.calibrated = 0 + set_target(usr) + if(href_list["locked"]) + power_station.engaged = 0 + power_station.teleporter_hub.update_icon() + power_station.teleporter_hub.calibrated = 0 + target = get_turf(locked.locked_location) + if(href_list["calibrate"]) + if(!target) + say("Error: No target set to calibrate to.") + return + if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) + say("Hub is already calibrated!") + return + say("Processing hub calibration to target...") + + calibrating = 1 + spawn(50 * (3 - power_station.teleporter_hub.accurate)) //Better parts mean faster calibration + calibrating = 0 + if(check_hub_connection()) + power_station.teleporter_hub.calibrated = 1 + say("Calibration complete.") + else + say("Error: Unable to detect hub.") + updateDialog() + + updateDialog() + +/obj/machinery/computer/teleporter/proc/check_hub_connection() + if(!power_station) + return FALSE + if(!power_station.teleporter_hub) + return FALSE + return TRUE + +/obj/machinery/computer/teleporter/proc/reset_regime() + target = null + if(regime_set == "Teleporter") + regime_set = "Gate" + else + regime_set = "Teleporter" + +/obj/machinery/computer/teleporter/proc/eject() + if(locked) + locked.forceMove(get_turf(src)) + locked = null + +/obj/machinery/computer/teleporter/proc/set_target(mob/user) + var/list/L = list() + var/list/areaindex = list() + if(regime_set == "Teleporter") + for(var/obj/item/device/radio/beacon/R in GLOB.teleportbeacons) + var/turf/T = get_turf(R) + if(!T) + continue + if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX) + continue + L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R + + for(var/obj/item/weapon/implant/tracking/I in GLOB.tracked_implants) + if(!I.imp_in || !ismob(I.loc)) + continue + else + var/mob/M = I.loc + if(M.stat == DEAD) + if(M.timeofdeath + 6000 < world.time) + continue + var/turf/T = get_turf(M) + if(!T) + continue + if(T.z == ZLEVEL_CENTCOM) + continue + L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I + + var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L + target = L[desc] + + else + var/list/S = power_station.linked_stations + if(!S.len) + to_chat(user, "No connected stations located.") + return + for(var/obj/machinery/teleport/station/R in S) + var/turf/T = get_turf(R) + if(!T || !R.teleporter_hub || !R.teleporter_console) + continue + if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX) + continue + L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R + var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L + target = L[desc] + if(target) + var/obj/machinery/teleport/station/trg = target + trg.linked_stations |= power_station + trg.stat &= ~NOPOWER + if(trg.teleporter_hub) + trg.teleporter_hub.stat &= ~NOPOWER + trg.teleporter_hub.update_icon() + if(trg.teleporter_console) + trg.teleporter_console.stat &= ~NOPOWER + trg.teleporter_console.update_icon() \ No newline at end of file diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 41022efaba..7f71f77f4d 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -259,52 +259,4 @@ for(var/X in components) var/obj/item/I = X I.forceMove(loc) - ..() - - - -//Machine Frame Circuit Boards -/*Common Parts: Parts List: Ignitor, Timer, Infra-red laser, Infra-red sensor, t_scanner, Capacitor, Valve, sensor unit, -micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells. -*/ - -/obj/item/weapon/circuitboard/machine - var/list/req_components = null - // Components required by the machine. - // Example: list(/obj/item/weapon/stock_parts/matter_bin = 5) - var/list/def_components = null - // Default replacements for req_components, to be used in apply_default_parts instead of req_components types - // Example: list(/obj/item/weapon/stock_parts/matter_bin = /obj/item/weapon/stock_parts/matter_bin/super) - -/obj/item/weapon/circuitboard/machine/proc/apply_default_parts(obj/machinery/M) - if(!req_components) - return - - M.component_parts = list(src) // List of components always contains a board - loc = null - - for(var/comp_path in req_components) - var/comp_amt = req_components[comp_path] - if(!comp_amt) - continue - - if(def_components && def_components[comp_path]) - comp_path = def_components[comp_path] - - if(ispath(comp_path, /obj/item/stack)) - M.component_parts += new comp_path(null, comp_amt) - else - for(var/i in 1 to comp_amt) - M.component_parts += new comp_path(null) - - M.RefreshParts() - - -/obj/item/weapon/circuitboard/machine/abductor - name = "alien board (Report This)" - icon_state = "abductor_mod" - origin_tech = "programming=5;abductor=3" - -/obj/item/weapon/circuitboard/machine/clockwork - name = "clockwork board (Report This)" - icon_state = "clock_mod" + ..() \ No newline at end of file diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 5100ece31f..2891d47d91 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -50,7 +50,7 @@ songs += T /obj/machinery/disco/Initialize() - ..() + . = ..() selection = songs[1] diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 20bb81e0b8..80f73b3027 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -4,32 +4,17 @@ icon = 'icons/obj/Cryogenic2.dmi' icon_state = "scanner" density = TRUE - var/locked = FALSE anchored = TRUE use_power = IDLE_POWER_USE idle_power_usage = 50 active_power_usage = 300 occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/brain) + circuit = /obj/item/weapon/circuitboard/machine/clonescanner + var/locked = FALSE var/damage_coeff var/scan_level var/precision_coeff -/obj/machinery/dna_scannernew/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/clonescanner(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/clonescanner - name = "Cloning Scanner (Machine Board)" - build_path = /obj/machinery/dna_scannernew - origin_tech = "programming=2;biotech=2" - req_components = list( - /obj/item/weapon/stock_parts/scanning_module = 1, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/weapon/stock_parts/micro_laser = 1, - /obj/item/stack/sheet/glass = 1, - /obj/item/stack/cable_coil = 2) - /obj/machinery/dna_scannernew/RefreshParts() scan_level = 0 damage_coeff = 0 diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm index 4a92c935b4..3733c71844 100644 --- a/code/game/machinery/doors/alarmlock.dm +++ b/code/game/machinery/doors/alarmlock.dm @@ -21,7 +21,7 @@ return ..() /obj/machinery/door/airlock/alarmlock/Initialize() - ..() + . = ..() SSradio.remove_object(src, air_frequency) air_connection = SSradio.add_object(src, air_frequency, GLOB.RADIO_TO_AIRALARM) open() diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 4e39255109..4c0d4a1804 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -45,7 +45,7 @@ Radio.listening = 0 /obj/machinery/door_timer/Initialize() - ..() + . = ..() if(id != null) for(var/obj/machinery/door/window/brigdoor/M in urange(20, src)) if (M.id == id) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 9a57593b3f..823e2f1805 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -26,7 +26,7 @@ var/list/affecting_areas /obj/machinery/door/firedoor/Initialize() - ..() + . = ..() CalculateAffectingAreas() /obj/machinery/door/firedoor/examine(mob/user) diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 3dbf7888de..5adc8d1da3 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -11,8 +11,8 @@ GLOBAL_LIST_EMPTY(doppler_arrays) var/max_dist = 100 verb_say = "states coldly" -/obj/machinery/doppler_array/New() - ..() +/obj/machinery/doppler_array/Initialize() + . = ..() GLOB.doppler_arrays += src /obj/machinery/doppler_array/Destroy() diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm index 022ca343f6..35f2bdcf30 100644 --- a/code/game/machinery/droneDispenser.dm +++ b/code/game/machinery/droneDispenser.dm @@ -24,6 +24,7 @@ var/datum/material_container/materials var/list/using_materials + var/starting_amount = 0 var/metal_cost = 1000 var/glass_cost = 1000 var/power_used = 1000 @@ -52,34 +53,27 @@ var/break_message = "lets out a tinny alarm before falling dark." var/break_sound = 'sound/machines/warning-buzzer.ogg' -/obj/machinery/droneDispenser/New() - ..() - obj_integrity = max_integrity - materials = new(src, list(MAT_METAL, MAT_GLASS), - MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2) - +/obj/machinery/droneDispenser/Initialize() + . = ..() + materials = new(src, list(MAT_METAL, MAT_GLASS), MINERAL_MATERIAL_AMOUNT*MAX_STACK_SIZE*2) + materials.insert_amount(starting_amount) using_materials = list(MAT_METAL=metal_cost, MAT_GLASS=glass_cost) /obj/machinery/droneDispenser/Destroy() - qdel(materials) - . = ..() + QDEL_NULL(materials) + return ..() -/obj/machinery/droneDispenser/preloaded/New() - ..() - materials.insert_amount(5000) +/obj/machinery/droneDispenser/preloaded + starting_amount = 5000 /obj/machinery/droneDispenser/syndrone //Please forgive me name = "syndrone shell dispenser" - desc = "A suspicious machine that will create Syndicate \ - exterminator drones when supplied with metal and glass. Disgusting." + desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting." dispense_type = /obj/item/drone_shell/syndrone //If we're gonna be a jackass, go the full mile - 10 second recharge timer cooldownTime = 100 end_create_message = "dispenses a suspicious drone shell." - -/obj/machinery/droneDispenser/syndrone/New() - ..() - materials.insert_amount(25000) + starting_amount = 25000 /obj/machinery/droneDispenser/syndrone/badass //Please forgive me name = "badass syndrone shell dispenser" @@ -101,10 +95,7 @@ metal_cost = 2000 glass_cost = 2000 power_used = 2000 - -/obj/machinery/droneDispenser/snowflake/preloaded/New() - ..() - materials.insert_amount(10000) + starting_amount = 10000 // An example of a custom drone dispenser. // This one requires no materials and creates basic hivebots diff --git a/code/game/machinery/embedded_controller/airlock_controller.dm b/code/game/machinery/embedded_controller/airlock_controller.dm index fb50bc8314..be027a89c8 100644 --- a/code/game/machinery/embedded_controller/airlock_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_controller.dm @@ -220,7 +220,7 @@ var/sanitize_external /obj/machinery/embedded_controller/radio/airlock_controller/Initialize(mapload) - ..() + . = ..() if(!mapload) return diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 3c6f0ad13a..ee0b8f287c 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -77,7 +77,7 @@ return ..() /obj/machinery/embedded_controller/radio/Initialize() - ..() + . = ..() set_frequency(frequency) /obj/machinery/embedded_controller/radio/post_signal(datum/signal/signal) diff --git a/code/game/machinery/embedded_controller/simple_vent_controller.dm b/code/game/machinery/embedded_controller/simple_vent_controller.dm index 5959939673..063e81354c 100644 --- a/code/game/machinery/embedded_controller/simple_vent_controller.dm +++ b/code/game/machinery/embedded_controller/simple_vent_controller.dm @@ -52,8 +52,7 @@ var/airpump_tag /obj/machinery/embedded_controller/radio/simple_vent_controller/Initialize(mapload) - ..() - + . = ..() if(!mapload) return var/datum/computer/file/embedded_program/simple_vent_controller/new_prog = new diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index da82e1df25..b8434cc94d 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -5,15 +5,15 @@ desc = "A wall-mounted flashbulb device." icon = 'icons/obj/stationobjs.dmi' icon_state = "mflash1" - var/obj/item/device/assembly/flash/handheld/bulb = null + max_integrity = 250 + integrity_failure = 100 + anchored = TRUE + var/obj/item/device/assembly/flash/handheld/bulb var/id = null var/range = 2 //this is roughly the size of brig cell var/last_flash = 0 //Don't want it getting spammed like regular flashes var/strength = 100 //How knocked down targets are when flashed. var/base_state = "mflash" - max_integrity = 250 - integrity_failure = 100 - anchored = TRUE /obj/machinery/flasher/portable //Portable version of the flasher. Only flashes when anchored name = "portable flasher" @@ -24,19 +24,17 @@ base_state = "pflash" density = TRUE -/obj/machinery/flasher/New(loc, ndir = 0, built = 0) - ..() // ..() is EXTREMELY IMPORTANT, never forget to add it +/obj/machinery/flasher/Initialize(mapload, ndir = 0, built = 0) + . = ..() // ..() is EXTREMELY IMPORTANT, never forget to add it if(built) setDir(ndir) pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28) pixel_y = (dir & 3)? (dir ==1 ? -28 : 28) : 0 else - bulb = new /obj/item/device/assembly/flash/handheld(src) + bulb = new(src) /obj/machinery/flasher/Destroy() - if(bulb) - qdel(bulb) - bulb = null + QDEL_NULL(bulb) return ..() /obj/machinery/flasher/power_change() diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index 81ffc18836..6970db7c12 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -17,25 +17,23 @@ The console is located at computer/gulag_teleporter.dm use_power = IDLE_POWER_USE idle_power_usage = 200 active_power_usage = 5000 + circuit = /obj/item/weapon/circuitboard/machine/gulag_teleporter var/locked = FALSE var/jumpsuit_type = /obj/item/clothing/under/rank/prisoner var/shoes_type = /obj/item/clothing/shoes/sneakers/orange - var/obj/machinery/gulag_item_reclaimer/linked_reclaimer = null - var/list/required_items + var/obj/machinery/gulag_item_reclaimer/linked_reclaimer + var/static/list/telegulag_required_items = typecacheof(list( + /obj/item/weapon/implant, + /obj/item/clothing/suit/space/eva/plasmaman, + /obj/item/clothing/under/plasmaman, + /obj/item/clothing/head/helmet/space/plasmaman, + /obj/item/weapon/tank/internals, + /obj/item/clothing/mask/breath, + /obj/item/clothing/mask/gas)) -/obj/machinery/gulag_teleporter/New() - ..() - required_items = typecacheof(list( - /obj/item/weapon/implant, - /obj/item/clothing/suit/space/eva/plasmaman, - /obj/item/clothing/under/plasmaman, - /obj/item/clothing/head/helmet/space/plasmaman, - /obj/item/weapon/tank/internals, - /obj/item/clothing/mask/breath, - /obj/item/clothing/mask/gas)) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/gulag_teleporter(null) - B.apply_default_parts(src) - addtimer(CALLBACK(src, .proc/locate_reclaimer), 5) +/obj/machinery/gulag_teleporter/Initialize() + . = ..() + locate_reclaimer() /obj/machinery/gulag_teleporter/Destroy() if(linked_reclaimer) @@ -46,7 +44,6 @@ The console is located at computer/gulag_teleporter.dm ..() update_icon() - /obj/machinery/gulag_teleporter/interact(mob/user) if(locked) to_chat(user, "[src] is locked.") @@ -138,7 +135,7 @@ The console is located at computer/gulag_teleporter.dm linked_reclaimer.stored_items[occupant] = list() var/mob/living/mob_occupant = occupant for(var/obj/item/W in mob_occupant) - if(!is_type_in_typecache(W, required_items) && mob_occupant.temporarilyRemoveItemFromInventory(W)) + if(!is_type_in_typecache(W, telegulag_required_items) && mob_occupant.temporarilyRemoveItemFromInventory(W)) if(istype(W, /obj/item/weapon/restraints/handcuffs)) W.forceMove(get_turf(src)) continue diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 141df8af74..9a88086d13 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -40,6 +40,7 @@ Possible to do for anyone motivated enough: active_power_usage = 100 max_integrity = 300 armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0) + circuit = /obj/item/weapon/circuitboard/machine/holopad var/list/masters = list()//List of living mobs that use the holopad var/last_request = 0 //to prevent request spam. ~Carn var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. @@ -51,8 +52,6 @@ Possible to do for anyone motivated enough: /obj/machinery/holopad/Initialize() . = ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/holopad(null) - B.apply_default_parts(src) holopads += src /obj/machinery/holopad/Destroy() @@ -384,11 +383,5 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ return Impersonation.examine(user) return ..() -/obj/item/weapon/circuitboard/machine/holopad - name = "AI Holopad (Machine Board)" - build_path = /obj/machinery/holopad - origin_tech = "programming=1" - req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) - #undef HOLOPAD_PASSIVE_POWER_USAGE #undef HOLOGRAM_POWER_USAGE diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 0210659eb9..0e450533fa 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -36,8 +36,8 @@ location.hotspot_expose(1000,500,1) return 1 -/obj/machinery/igniter/New() - ..() +/obj/machinery/igniter/Initialize() + . = ..() icon_state = "igniter[on]" /obj/machinery/igniter/power_change() @@ -61,15 +61,14 @@ anchored = TRUE resistance_flags = FIRE_PROOF -/obj/machinery/sparker/New() - ..() +/obj/machinery/sparker/Initialize() + . = ..() spark_system = new /datum/effect_system/spark_spread spark_system.set_up(2, 1, src) spark_system.attach(src) /obj/machinery/sparker/Destroy() - qdel(spark_system) - spark_system = null + QDEL_NULL(spark_system) return ..() /obj/machinery/sparker/power_change() diff --git a/code/game/machinery/iv_drip.dm.rej b/code/game/machinery/iv_drip.dm.rej new file mode 100644 index 0000000000..4c8aa8206c --- /dev/null +++ b/code/game/machinery/iv_drip.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm (rejected hunks) +@@ -15,7 +15,7 @@ + /obj/item/weapon/reagent_containers/glass) + + /obj/machinery/iv_drip/Initialize() +- ..() ++ . = ..() + update_icon() + drip_containers = typecacheof(drip_containers) + diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 8c3736ddf3..337411e508 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -8,6 +8,7 @@ use_power = TRUE idle_power_usage = 200 active_power_usage = 2500 + circuit = /obj/item/weapon/circuitboard/machine/launchpad var/stationary = TRUE //to prevent briefcase pad deconstruction and such var/display_name = "Launchpad" var/teleport_speed = 35 @@ -17,20 +18,6 @@ var/x_offset = 0 var/y_offset = 0 -/obj/machinery/launchpad/Initialize() - . = ..() - var/obj/item/weapon/circuitboard/machine/launchpad/B = new - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/launchpad - name = "Bluespace Launchpad (Machine Board)" - build_path = /obj/machinery/launchpad - origin_tech = "programming=3;engineering=3;plasmatech=2;bluespace=3" - req_components = list( - /obj/item/weapon/ore/bluespace_crystal = 1, - /obj/item/weapon/stock_parts/manipulator = 1) - def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial) - /obj/machinery/launchpad/RefreshParts() var/E = -1 //to make default parts have the base value for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) @@ -171,9 +158,7 @@ qdel(src) /obj/machinery/launchpad/briefcase/Destroy() - if(!QDELETED(briefcase)) - qdel(briefcase) - briefcase = null + QDEL_NULL(briefcase) return ..() /obj/machinery/launchpad/briefcase/isAvailable() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index a09adf6155..a979ba6398 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -12,7 +12,7 @@ // luminosity = 1 /obj/machinery/light_switch/Initialize() - ..() + . = ..() area = get_area(src) if(otherarea) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 60fd945a12..ec0c6eb4d7 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -11,21 +11,20 @@ icon_state = "limbgrower_idleoff" density = TRUE container_type = OPENCONTAINER - - var/operating = FALSE anchored = TRUE use_power = IDLE_POWER_USE - var/disabled = 0 idle_power_usage = 10 active_power_usage = 100 + circuit = /obj/item/weapon/circuitboard/machine/limbgrower + + var/operating = FALSE + var/disabled = FALSE var/busy = FALSE var/prod_coeff = 1 - var/datum/design/being_built var/datum/research/files var/selected_category var/screen = 1 - var/list/categories = list( "human", "lizard", @@ -33,22 +32,11 @@ "special" ) -/obj/machinery/limbgrower/New() - ..() +/obj/machinery/limbgrower/Initialize() + . = ..() create_reagents(0) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/limbgrower(null) - B.apply_default_parts(src) files = new /datum/research/limbgrower(src) -/obj/item/weapon/circuitboard/machine/limbgrower - name = "Limb Grower (Machine Board)" - build_path = /obj/machinery/limbgrower - origin_tech = "programming=2;biotech=2" - req_components = list( - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/weapon/reagent_containers/glass/beaker = 2, - /obj/item/weapon/stock_parts/console_screen = 1) - /obj/machinery/limbgrower/interact(mob/user) if(!is_operational()) return diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 21e0590a4b..936f16320d 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -5,7 +5,6 @@ // This was created for firing ranges, but I suppose this could have other applications - Doohl /obj/machinery/magnetic_module - icon = 'icons/obj/objects.dmi' icon_state = "floor_magnet-f" name = "electromagnetic generator" @@ -29,22 +28,21 @@ var/center_y = 0 var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer -/obj/machinery/magnetic_module/New() +/obj/machinery/magnetic_module/Initialize() ..() var/turf/T = loc hide(T.intact) center = T + SSradio.add_object(src, freq, GLOB.RADIO_MAGNETS) + return INITIALIZE_HINT_LATELOAD - spawn(10) // must wait for map loading to finish - SSradio.add_object(src, freq, GLOB.RADIO_MAGNETS) - - spawn() - magnetic_process() +/obj/machinery/magnetic_module/LateInitialize() + magnetic_process() /obj/machinery/magnetic_module/Destroy() SSradio.remove_object(src, freq) - . = ..() center = null + return ..() // update the invisibility and icon /obj/machinery/magnetic_module/hide(intact) @@ -216,27 +214,22 @@ var/datum/radio_frequency/radio_connection -/obj/machinery/magnetic_controller/New() +/obj/machinery/magnetic_controller/Initialize() ..() - if(autolink) for(var/obj/machinery/magnetic_module/M in GLOB.machines) if(M.freq == frequency && M.code == code) magnets.Add(M) - - spawn(45) // must wait for map loading to finish - radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_MAGNETS) - - if(path) // check for default path filter_path() // renders rpath + radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_MAGNETS) /obj/machinery/magnetic_controller/Destroy() SSradio.remove_object(src, frequency) magnets = null rpath = null - . = ..() + return ..() /obj/machinery/magnetic_controller/process() if(magnets.len == 0 && autolink) diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index a10c4976aa..2b5a1f08b0 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -22,8 +22,8 @@ req_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS) -/obj/machinery/navbeacon/New() - ..() +/obj/machinery/navbeacon/Initialize() + . = ..() set_codes() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index ec0aaf2bcd..9883236d64 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -197,16 +197,15 @@ GLOBAL_LIST_EMPTY(allCasters) name = "security newscaster" securityCaster = 1 -/obj/machinery/newscaster/New(loc, ndir, building) - ..() +/obj/machinery/newscaster/Initialize(mapload, ndir, building) + . = ..() if(building) setDir(ndir) pixel_x = (dir & 3)? 0 : (dir == 4 ? -32 : 32) pixel_y = (dir & 3)? (dir ==1 ? -32 : 32) : 0 GLOB.allCasters += src - for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters) - unit_no++ + unit_no = GLOB.allCasters.len update_icon() /obj/machinery/newscaster/Destroy() diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 176209a2cb..66899c3735 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -72,8 +72,8 @@ var/obj/machinery/turretid/cp = null -/obj/machinery/porta_turret/New(loc) - ..() +/obj/machinery/porta_turret/Initialize() + . = ..() if(!base) base = src update_icon() @@ -143,18 +143,13 @@ /obj/machinery/porta_turret/Destroy() //deletes its own cover with it - if(cover) - qdel(cover) - cover = null + QDEL_NULL(cover) base = null if(cp) cp.turrets -= src cp = null - if(stored_gun) - qdel(stored_gun) - stored_gun = null - qdel(spark_system) - spark_system = null + QDEL_NULL(stored_gun) + QDEL_NULL(spark_system) return ..() @@ -602,8 +597,8 @@ /obj/machinery/porta_turret/aux_base/interact(mob/user) //Controlled solely from the base console. return -/obj/machinery/porta_turret/aux_base/New() - ..() +/obj/machinery/porta_turret/aux_base/Initialize() + . = ..() cover.name = name cover.desc = desc @@ -650,8 +645,8 @@ var/list/obj/machinery/porta_turret/turrets = list() resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF -/obj/machinery/turretid/New(loc, ndir = 0, built = 0) - ..() +/obj/machinery/turretid/Initialize(mapload, ndir = 0, built = 0) + . = ..() if(built) setDir(ndir) locked = FALSE @@ -682,7 +677,8 @@ T.cp = src /obj/machinery/turretid/attackby(obj/item/I, mob/user, params) - if(stat & BROKEN) return + if(stat & BROKEN) + return if (istype(I, /obj/item/device/multitool)) var/obj/item/device/multitool/M = I diff --git a/code/game/machinery/porta_turret/portable_turret.dm.rej b/code/game/machinery/porta_turret/portable_turret.dm.rej new file mode 100644 index 0000000000..0f16ca5ef3 --- /dev/null +++ b/code/game/machinery/porta_turret/portable_turret.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm (rejected hunks) +@@ -664,7 +659,7 @@ + return ..() + + /obj/machinery/turretid/Initialize(mapload) //map-placed turrets autolink turrets +- ..() ++ . = ..() + if(!mapload) + return + diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index b05ecdea70..f0d793732b 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -8,28 +8,13 @@ idle_power_usage = 200 active_power_usage = 5000 unique_rename = 1 + circuit = /obj/item/weapon/circuitboard/machine/quantumpad var/teleport_cooldown = 400 //30 seconds base due to base parts var/teleport_speed = 50 var/last_teleport //to handle the cooldown var/teleporting = 0 //if it's in the process of teleporting var/power_efficiency = 1 - var/obj/machinery/quantumpad/linked_pad = null - -/obj/machinery/quantumpad/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/quantumpad(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/quantumpad - name = "Quantum Pad (Machine Board)" - build_path = /obj/machinery/quantumpad - origin_tech = "programming=3;engineering=3;plasmatech=3;bluespace=4" - req_components = list( - /obj/item/weapon/ore/bluespace_crystal = 1, - /obj/item/weapon/stock_parts/capacitor = 1, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/stack/cable_coil = 1) - def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial) + var/obj/machinery/quantumpad/linked_pad /obj/machinery/quantumpad/RefreshParts() var/E = 0 diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 437fb3eb27..72b03bc7b5 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -7,20 +7,14 @@ use_power = IDLE_POWER_USE idle_power_usage = 4 active_power_usage = 250 + circuit = /obj/item/weapon/circuitboard/machine/recharger var/obj/item/charging = null - var/static/list/allowed_devices = typecacheof(list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/ammo_box/magazine/recharge, /obj/item/device/modular_computer)) var/recharge_coeff = 1 - -/obj/machinery/recharger/Initialize() - . = ..() - var/obj/item/weapon/circuitboard/machine/recharger/B = new() - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/recharger - name = "Weapon Recharger (Machine Board)" - build_path = /obj/machinery/recharger - origin_tech = "powerstorage=4;engineering=3;materials=4" - req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) + var/static/list/allowed_devices = typecacheof(list( + /obj/item/weapon/gun/energy, + /obj/item/weapon/melee/baton, + /obj/item/ammo_box/magazine/recharge, + /obj/item/device/modular_computer)) /obj/machinery/recharger/RefreshParts() for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 90854e5f74..8d69d6a37d 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -8,27 +8,15 @@ idle_power_usage = 5 active_power_usage = 1000 req_access = list(ACCESS_ROBOTICS) + state_open = TRUE + circuit = /obj/item/weapon/circuitboard/machine/cyborgrecharger var/recharge_speed var/repairs - state_open = TRUE -/obj/machinery/recharge_station/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/cyborgrecharger(null) - B.apply_default_parts(src) +/obj/machinery/recharge_station/Initialize() + . = ..() update_icon() -/obj/item/weapon/circuitboard/machine/cyborgrecharger - name = "Cyborg Recharger (Machine Board)" - build_path = /obj/machinery/recharge_station - origin_tech = "powerstorage=3;engineering=3" - req_components = list( - /obj/item/weapon/stock_parts/capacitor = 2, - /obj/item/weapon/stock_parts/cell = 1, - /obj/item/weapon/stock_parts/manipulator = 1) - def_components = list( - /obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high) - /obj/machinery/recharge_station/RefreshParts() recharge_speed = 0 repairs = 0 diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index f853407df8..07251f6cf0 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -8,6 +8,7 @@ layer = ABOVE_ALL_MOB_LAYER // Overhead anchored = TRUE density = TRUE + circuit = /obj/item/weapon/circuitboard/machine/recycler var/safety_mode = FALSE // Temporarily stops machine if it detects a mob var/icon_name = "grinder-o" var/blood = 0 @@ -18,20 +19,10 @@ var/eat_victim_items = TRUE var/item_recycle_sound = 'sound/items/welder.ogg' -/obj/machinery/recycler/New() - ..() +/obj/machinery/recycler/Initialize() materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM)) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/recycler(null) - B.apply_default_parts(src) update_icon() - -/obj/item/weapon/circuitboard/machine/recycler - name = "Recycler (Machine Board)" - build_path = /obj/machinery/recycler - origin_tech = "programming=2;engineering=2" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/weapon/stock_parts/manipulator = 1) + return ..() /obj/machinery/recycler/RefreshParts() var/amt_made = 0 diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 4ca6592b21..efcf10dcb6 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -88,7 +88,7 @@ GLOBAL_LIST_EMPTY(allConsoles) icon_state = "req_comp0" /obj/machinery/requests_console/Initialize() - ..() + . = ..() name = "\improper [department] requests console" GLOB.allConsoles += src switch(departmentType) diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index a7d857844a..23ba93992c 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -10,9 +10,9 @@ max_integrity = 200 //The shield can only take so much beating (prevents perma-prisons) CanAtmosPass = ATMOS_PASS_DENSITY -/obj/structure/emergency_shield/New() - src.setDir(pick(1,2,3,4)) - ..() +/obj/structure/emergency_shield/Initialize() + . = ..() + setDir(pick(1,2,3,4)) air_update_turf(1) /obj/structure/emergency_shield/Destroy() diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index e72e65f99a..71036c735f 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -34,7 +34,7 @@ light_color = LIGHT_COLOR_BROWN /obj/machinery/computer/slot_machine/Initialize() - ..() + . = ..() jackpots = rand(1, 4) //false hope plays = rand(75, 200) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 70481ad299..033310e55d 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -12,6 +12,7 @@ desc = "Made by Space Amish using traditional space techniques, this heater/cooler is guaranteed not to set the station on fire." max_integrity = 250 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100, fire = 80, acid = 10) + circuit = /obj/item/weapon/circuitboard/machine/space_heater var/obj/item/weapon/stock_parts/cell/cell var/on = FALSE var/mode = HEATER_MODE_STANDBY @@ -26,22 +27,11 @@ /obj/machinery/space_heater/get_cell() return cell -/obj/machinery/space_heater/New() - ..() +/obj/machinery/space_heater/Initialize() + . = ..() cell = new(src) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/space_heater(null) - B.apply_default_parts(src) update_icon() -/obj/item/weapon/circuitboard/machine/space_heater - name = "Space Heater (Machine Board)" - build_path = /obj/machinery/space_heater - origin_tech = "programming=2;engineering=2;plasmatech=2" - req_components = list( - /obj/item/weapon/stock_parts/micro_laser = 1, - /obj/item/weapon/stock_parts/capacitor = 1, - /obj/item/stack/cable_coil = 3) - /obj/machinery/space_heater/on_construction() qdel(cell) cell = null diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index cc43331eb8..6aaea43f97 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -101,8 +101,8 @@ mask_type = /obj/item/clothing/mask/breath storage_type = /obj/item/weapon/tank/internals/emergency_oxygen/double -/obj/machinery/suit_storage_unit/New() - ..() +/obj/machinery/suit_storage_unit/Initialize() + . = ..() wires = new /datum/wires/suit_storage_unit(src) if(suit_type) suit = new suit_type(src) @@ -115,18 +115,10 @@ update_icon() /obj/machinery/suit_storage_unit/Destroy() - if(suit) - qdel(suit) - suit = null - if(helmet) - qdel(helmet) - helmet = null - if(mask) - qdel(mask) - mask = null - if(storage) - qdel(storage) - storage = null + QDEL_NULL(suit) + QDEL_NULL(helmet) + QDEL_NULL(mask) + QDEL_NULL(storage) return ..() /obj/machinery/suit_storage_unit/update_icon() diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 655483a255..a2f97c3d54 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -82,22 +82,19 @@ countdown.stop() STOP_PROCESSING(SSfastprocess, src) -/obj/machinery/syndicatebomb/New() +/obj/machinery/syndicatebomb/Initialize() + . = ..() wires = new /datum/wires/syndicatebomb(src) - if(src.payload) + if(payload) payload = new payload(src) update_icon() countdown = new(src) - ..() /obj/machinery/syndicatebomb/Destroy() - qdel(wires) - wires = null - if(countdown) - qdel(countdown) - countdown = null + QDEL_NULL(wires) + QDEL_NULL(countdown) STOP_PROCESSING(SSfastprocess, src) - . = ..() + return ..() /obj/machinery/syndicatebomb/examine(mob/user) ..() diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm index 286630a777..66783ee062 100644 --- a/code/game/machinery/telecomms/machines/broadcaster.dm +++ b/code/game/machinery/telecomms/machines/broadcaster.dm @@ -17,8 +17,7 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages use_power = IDLE_POWER_USE idle_power_usage = 25 machinetype = 5 - /*heatgen = 0 - delay = 7*/ + circuit = /obj/item/weapon/circuitboard/machine/telecomms/broadcaster /obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) // Don't broadcast rejected signals @@ -82,22 +81,6 @@ GLOBAL_VAR_INIT(message_delay, 0) // To make sure restarting the recentmessages /* --- Do a snazzy animation! --- */ flick("broadcaster_send", src) -/obj/machinery/telecomms/broadcaster/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/broadcaster(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/telecomms/broadcaster - name = "Subspace Broadcaster (Machine Board)" - build_path = /obj/machinery/telecomms/broadcaster - origin_tech = "programming=2;engineering=2;bluespace=1" - req_components = list( - /obj/item/weapon/stock_parts/manipulator = 2, - /obj/item/stack/cable_coil = 1, - /obj/item/weapon/stock_parts/subspace/filter = 1, - /obj/item/weapon/stock_parts/subspace/crystal = 1, - /obj/item/weapon/stock_parts/micro_laser = 2) - /obj/machinery/telecomms/broadcaster/Destroy() // In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore. if(GLOB.message_delay) diff --git a/code/game/machinery/telecomms/machines/bus.dm b/code/game/machinery/telecomms/machines/bus.dm index fb2f06aca7..52437afb66 100644 --- a/code/game/machinery/telecomms/machines/bus.dm +++ b/code/game/machinery/telecomms/machines/bus.dm @@ -17,8 +17,8 @@ use_power = IDLE_POWER_USE idle_power_usage = 50 machinetype = 2 - //heatgen = 20 netspeed = 40 + circuit = /obj/item/weapon/circuitboard/machine/telecomms/bus var/change_frequency = 0 /obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) @@ -49,24 +49,6 @@ if(can_send) break -/obj/machinery/telecomms/bus/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/bus(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/telecomms/bus - name = "Bus Mainframe (Machine Board)" - build_path = /obj/machinery/telecomms/bus - origin_tech = "programming=2;engineering=2" - req_components = list( - /obj/item/weapon/stock_parts/manipulator = 2, - /obj/item/stack/cable_coil = 1, - /obj/item/weapon/stock_parts/subspace/filter = 1) - - - - - //Preset Buses /obj/machinery/telecomms/bus/preset_one @@ -93,10 +75,10 @@ freq_listening = list(GLOB.ENG_FREQ) autolinkers = list("processor4", "engineering", "common") -/obj/machinery/telecomms/bus/preset_four/New() +/obj/machinery/telecomms/bus/preset_four/Initialize() + . = ..() for(var/i = 1441, i < 1489, i += 2) freq_listening |= i - ..() /obj/machinery/telecomms/bus/preset_one/birdstation name = "Bus" diff --git a/code/game/machinery/telecomms/machines/hub.dm b/code/game/machinery/telecomms/machines/hub.dm index 656eb4a522..41d59e1e77 100644 --- a/code/game/machinery/telecomms/machines/hub.dm +++ b/code/game/machinery/telecomms/machines/hub.dm @@ -18,10 +18,9 @@ use_power = IDLE_POWER_USE idle_power_usage = 80 machinetype = 7 - //heatgen = 40 long_range_link = 1 netspeed = 40 - + circuit = /obj/item/weapon/circuitboard/machine/telecomms/hub /obj/machinery/telecomms/hub/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) if(is_freq_listening(signal)) @@ -33,23 +32,6 @@ relay_information(signal, "/obj/machinery/telecomms/relay", 1) relay_information(signal, "/obj/machinery/telecomms/broadcaster", 1) // Send it to a broadcaster. -/obj/machinery/telecomms/hub/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/hub(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/telecomms/hub - name = "Hub Mainframe (Machine Board)" - build_path = /obj/machinery/telecomms/hub - origin_tech = "programming=2;engineering=2" - req_components = list( - /obj/item/weapon/stock_parts/manipulator = 2, - /obj/item/stack/cable_coil = 2, - /obj/item/weapon/stock_parts/subspace/filter = 2) - - - - //Preset HUB /obj/machinery/telecomms/hub/preset diff --git a/code/game/machinery/telecomms/machines/processor.dm b/code/game/machinery/telecomms/machines/processor.dm index 5680c880b3..8d1494ff61 100644 --- a/code/game/machinery/telecomms/machines/processor.dm +++ b/code/game/machinery/telecomms/machines/processor.dm @@ -16,8 +16,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 30 machinetype = 3 - //heatgen = 100 - //delay = 5 + circuit = /obj/item/weapon/circuitboard/machine/telecomms/processor var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals /obj/machinery/telecomms/processor/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) @@ -35,24 +34,6 @@ signal.data["slow"] += rand(5, 10) // slow the signal down relay_information(signal, "/obj/machinery/telecomms/server") -/obj/machinery/telecomms/processor/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/processor(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/telecomms/processor - name = "Processor Unit (Machine Board)" - build_path = /obj/machinery/telecomms/processor - origin_tech = "programming=2;engineering=2" - req_components = list( - /obj/item/weapon/stock_parts/manipulator = 3, - /obj/item/weapon/stock_parts/subspace/filter = 1, - /obj/item/weapon/stock_parts/subspace/treatment = 2, - /obj/item/weapon/stock_parts/subspace/analyzer = 1, - /obj/item/stack/cable_coil = 2, - /obj/item/weapon/stock_parts/subspace/amplifier = 1) - - //Preset Processors /obj/machinery/telecomms/processor/preset_one diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm index af218fd663..0614668f3a 100644 --- a/code/game/machinery/telecomms/machines/receiver.dm +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -16,7 +16,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 30 machinetype = 1 - //heatgen = 0 + circuit = /obj/item/weapon/circuitboard/machine/telecomms/receiver /obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal) @@ -50,25 +50,6 @@ return 0 return 1 - -/obj/machinery/telecomms/receiver/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/receiver(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/telecomms/receiver - name = "Subspace Receiver (Machine Board)" - build_path = /obj/machinery/telecomms/receiver - origin_tech = "programming=2;engineering=2;bluespace=1" - req_components = list( - /obj/item/weapon/stock_parts/subspace/ansible = 1, - /obj/item/weapon/stock_parts/subspace/filter = 1, - /obj/item/weapon/stock_parts/manipulator = 2, - /obj/item/weapon/stock_parts/micro_laser = 1) - - - - //Preset Receivers //--PRESET LEFT--// @@ -89,10 +70,10 @@ freq_listening = list(GLOB.COMM_FREQ, GLOB.ENG_FREQ, GLOB.SEC_FREQ) //command, engineering, security //Common and other radio frequencies for people to freely use -/obj/machinery/telecomms/receiver/preset_right/New() +/obj/machinery/telecomms/receiver/preset_right/Initialize() + . = ..() for(var/i = 1441, i < 1489, i += 2) freq_listening |= i - ..() /obj/machinery/telecomms/receiver/preset_left/birdstation name = "Receiver" diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm index 5bc97d54c7..4dee1e8078 100644 --- a/code/game/machinery/telecomms/machines/relay.dm +++ b/code/game/machinery/telecomms/machines/relay.dm @@ -15,9 +15,9 @@ use_power = IDLE_POWER_USE idle_power_usage = 30 machinetype = 8 - //heatgen = 0 netspeed = 5 long_range_link = 1 + circuit = /obj/item/weapon/circuitboard/machine/telecomms/relay var/broadcasting = 1 var/receiving = 1 @@ -45,22 +45,6 @@ return FALSE return receiving -/obj/machinery/telecomms/relay/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/relay(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/telecomms/relay - name = "Relay Mainframe (Machine Board)" - build_path = /obj/machinery/telecomms/relay - origin_tech = "programming=2;engineering=2;bluespace=2" - req_components = list( - /obj/item/weapon/stock_parts/manipulator = 2, - /obj/item/stack/cable_coil = 2, - /obj/item/weapon/stock_parts/subspace/filter = 2) - - - //Preset Relay /obj/machinery/telecomms/relay/preset diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm index cd8e433cea..703bd378dd 100644 --- a/code/game/machinery/telecomms/machines/server.dm +++ b/code/game/machinery/telecomms/machines/server.dm @@ -16,7 +16,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 15 machinetype = 4 - //heatgen = 50 + circuit = /obj/item/weapon/circuitboard/machine/telecomms/server var/list/log_entries = list() var/list/stored_names = list() var/list/TrafficActions = list() @@ -32,20 +32,9 @@ var/obj/item/device/radio/headset/server_radio = null var/last_signal = 0 // Last time it sent a signal -/obj/machinery/telecomms/server/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/telecomms/server(null) - B.apply_default_parts(src) - server_radio = new() - -/obj/item/weapon/circuitboard/machine/telecomms/server - name = "Telecommunication Server (Machine Board)" - build_path = /obj/machinery/telecomms/server - origin_tech = "programming=2;engineering=2" - req_components = list( - /obj/item/weapon/stock_parts/manipulator = 2, - /obj/item/stack/cable_coil = 1, - /obj/item/weapon/stock_parts/subspace/filter = 1) +/obj/machinery/telecomms/server/Initialize() + . = ..() + server_radio = new /obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) if(signal.data["message"]) @@ -135,8 +124,8 @@ /obj/machinery/telecomms/server/presets network = "tcommsat" -/obj/machinery/telecomms/server/presets/New() - ..() +/obj/machinery/telecomms/server/presets/Initialize() + . = ..() name = id @@ -167,10 +156,10 @@ //Common and other radio frequencies for people to freely use // 1441 to 1489 -/obj/machinery/telecomms/server/presets/common/New() +/obj/machinery/telecomms/server/presets/common/Initialize() + . = ..() for(var/i = 1441, i < 1489, i += 2) freq_listening |= i - ..() /obj/machinery/telecomms/server/presets/command id = "Command Server" @@ -187,6 +176,6 @@ freq_listening = list(GLOB.SEC_FREQ) autolinkers = list("security") -/obj/machinery/telecomms/server/presets/common/birdstation/New() - ..() +/obj/machinery/telecomms/server/presets/common/birdstation/Initialize() + . = ..() freq_listening = list() diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 48bb5bb5ab..62f53f73ad 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -16,6 +16,7 @@ GLOBAL_LIST_EMPTY(telecomms_list) /obj/machinery/telecomms icon = 'icons/obj/machines/telecomms.dmi' + critical_machine = TRUE var/list/links = list() // list of machines this machine is linked to var/traffic = 0 // value increases as traffic increases var/netspeed = 5 // how much traffic to lose per tick (50 gigabytes/second * netspeed) @@ -31,7 +32,6 @@ GLOBAL_LIST_EMPTY(telecomms_list) var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub) var/hide = 0 // Is it a hidden machine? var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to. - critical_machine = TRUE /obj/machinery/telecomms/proc/relay_information(datum/signal/signal, filter, copysig, amount = 20) @@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(telecomms_list) listening_level = position.z /obj/machinery/telecomms/Initialize(mapload) - ..() + . = ..() if(mapload && autolinkers.len) // Links nearby machines if(!long_range_link) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index b737b7e77e..b1edee8325 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -1,221 +1,3 @@ -/obj/machinery/computer/teleporter - name = "teleporter control console" - desc = "Used to control a linked teleportation Hub and Station." - icon_screen = "teleport" - icon_keyboard = "teleport_key" - circuit = /obj/item/weapon/circuitboard/computer/teleporter - var/obj/item/device/gps/locked = null - var/regime_set = "Teleporter" - var/id = null - var/obj/machinery/teleport/station/power_station - var/calibrating - var/turf/target //Used for one-time-use teleport cards (such as clown planet coordinates.) - //Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location. - - light_color = LIGHT_COLOR_BLUE - -/obj/machinery/computer/teleporter/New() - src.id = "[rand(1000, 9999)]" - ..() - -/obj/machinery/computer/teleporter/Initialize() - ..() - link_power_station() - -/obj/machinery/computer/teleporter/Destroy() - if (power_station) - power_station.teleporter_console = null - power_station = null - return ..() - -/obj/machinery/computer/teleporter/proc/link_power_station() - if(power_station) - return - for(dir in list(NORTH,EAST,SOUTH,WEST)) - power_station = locate(/obj/machinery/teleport/station, get_step(src, dir)) - if(power_station) - break - return power_station - -/obj/machinery/computer/teleporter/attackby(obj/I, mob/living/user, params) - if(istype(I, /obj/item/device/gps)) - var/obj/item/device/gps/L = I - if(L.locked_location && !(stat & (NOPOWER|BROKEN))) - if(!user.transferItemToLoc(L, src)) - to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]!") - return - locked = L - to_chat(user, "You insert the GPS device into the [name]'s slot.") - else - return ..() - -/obj/machinery/computer/teleporter/attack_ai(mob/user) - src.attack_hand(user) - -/obj/machinery/computer/teleporter/attack_hand(mob/user) - if(..()) - return - interact(user) - -/obj/machinery/computer/teleporter/interact(mob/user) - var/data = "

Teleporter Status

" - if(!power_station) - data += "
No power station linked.
" - else if(!power_station.teleporter_hub) - data += "
No hub linked.
" - else - data += "
Current regime: [regime_set]
" - data += "Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"]
" - if(calibrating) - data += "Calibration: In Progress" - else if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) - data += "Calibration: Optimal" - else - data += "Calibration: Sub-Optimal" - data += "

" - - data += "Change regime
" - data += "Set target
" - if(locked) - data += "
Get target from memory
" - data += "Eject GPS device
" - else - data += "
Get target from memory
" - data += "Eject GPS device
" - - data += "
Calibrate Hub" - - var/datum/browser/popup = new(user, "teleporter", name, 400, 400) - popup.set_content(data) - popup.open() - return - -/obj/machinery/computer/teleporter/Topic(href, href_list) - if(..()) - return - - if(href_list["eject"]) - eject() - updateDialog() - return - - if(!check_hub_connection()) - say("Error: Unable to detect hub.") - return - if(calibrating) - say("Error: Calibration in progress. Stand by.") - return - - if(href_list["regimeset"]) - power_station.engaged = 0 - power_station.teleporter_hub.update_icon() - power_station.teleporter_hub.calibrated = 0 - reset_regime() - if(href_list["settarget"]) - power_station.engaged = 0 - power_station.teleporter_hub.update_icon() - power_station.teleporter_hub.calibrated = 0 - set_target(usr) - if(href_list["locked"]) - power_station.engaged = 0 - power_station.teleporter_hub.update_icon() - power_station.teleporter_hub.calibrated = 0 - target = get_turf(locked.locked_location) - if(href_list["calibrate"]) - if(!target) - say("Error: No target set to calibrate to.") - return - if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accurate >= 3) - say("Hub is already calibrated!") - return - say("Processing hub calibration to target...") - - calibrating = 1 - spawn(50 * (3 - power_station.teleporter_hub.accurate)) //Better parts mean faster calibration - calibrating = 0 - if(check_hub_connection()) - power_station.teleporter_hub.calibrated = 1 - say("Calibration complete.") - else - say("Error: Unable to detect hub.") - updateDialog() - - updateDialog() - -/obj/machinery/computer/teleporter/proc/check_hub_connection() - if(!power_station) - return - if(!power_station.teleporter_hub) - return - return 1 - -/obj/machinery/computer/teleporter/proc/reset_regime() - target = null - if(regime_set == "Teleporter") - regime_set = "Gate" - else - regime_set = "Teleporter" - -/obj/machinery/computer/teleporter/proc/eject() - if(locked) - locked.loc = loc - locked = null - -/obj/machinery/computer/teleporter/proc/set_target(mob/user) - var/list/L = list() - var/list/areaindex = list() - if(regime_set == "Teleporter") - for(var/obj/item/device/radio/beacon/R in GLOB.teleportbeacons) - var/turf/T = get_turf(R) - if(!T) - continue - if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX) - continue - L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R - - for(var/obj/item/weapon/implant/tracking/I in GLOB.tracked_implants) - if(!I.imp_in || !ismob(I.loc)) - continue - else - var/mob/M = I.loc - if(M.stat == DEAD) - if(M.timeofdeath + 6000 < world.time) - continue - var/turf/T = get_turf(M) - if(!T) - continue - if(T.z == ZLEVEL_CENTCOM) - continue - L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I - - var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L - target = L[desc] - - else - var/list/S = power_station.linked_stations - if(!S.len) - to_chat(user, "No connected stations located.") - return - for(var/obj/machinery/teleport/station/R in S) - var/turf/T = get_turf(R) - if(!T || !R.teleporter_hub || !R.teleporter_console) - continue - if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX) - continue - L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R - var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L - target = L[desc] - if(target) - var/obj/machinery/teleport/station/trg = target - trg.linked_stations |= power_station - trg.stat &= ~NOPOWER - if(trg.teleporter_hub) - trg.teleporter_hub.stat &= ~NOPOWER - trg.teleporter_hub.update_icon() - if(trg.teleporter_console) - trg.teleporter_console.stat &= ~NOPOWER - trg.teleporter_console.update_icon() - /obj/machinery/teleport name = "teleport" icon = 'icons/obj/machines/teleporter.dmi' @@ -226,29 +8,16 @@ name = "teleporter hub" desc = "It's the hub of a teleporting machine." icon_state = "tele0" - var/accurate = 0 use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 2000 + circuit = /obj/item/weapon/circuitboard/machine/teleporter_hub + var/accurate = FALSE var/obj/machinery/teleport/station/power_station var/calibrated //Calibration prevents mutation -/obj/machinery/teleport/hub/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/teleporter_hub(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/teleporter_hub - name = "Teleporter Hub (Machine Board)" - build_path = /obj/machinery/teleport/hub - origin_tech = "programming=3;engineering=4;bluespace=4;materials=4" - req_components = list( - /obj/item/weapon/ore/bluespace_crystal = 3, - /obj/item/weapon/stock_parts/matter_bin = 1) - def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial) - /obj/machinery/teleport/hub/Initialize() - ..() + . = ..() link_power_station() /obj/machinery/teleport/hub/Destroy() @@ -327,8 +96,8 @@ /obj/machinery/teleport/hub/proc/is_ready() . = !panel_open && !(stat & (BROKEN|NOPOWER)) && power_station && power_station.engaged && !(power_station.stat & (BROKEN|NOPOWER)) -/obj/machinery/teleport/hub/syndicate/New() - ..() +/obj/machinery/teleport/hub/syndicate/Initialize() + . = ..() component_parts += new /obj/item/weapon/stock_parts/matter_bin/super(null) RefreshParts() @@ -337,32 +106,18 @@ name = "station" desc = "The power control station for a bluespace teleporter. Used for toggling power, and can activate a test-fire to prevent malfunctions." icon_state = "controller" - var/engaged = 0 use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 2000 + circuit = /obj/item/weapon/circuitboard/machine/teleporter_station + var/engaged = FALSE var/obj/machinery/computer/teleporter/teleporter_console var/obj/machinery/teleport/hub/teleporter_hub var/list/linked_stations = list() var/efficiency = 0 -/obj/machinery/teleport/station/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/teleporter_station(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/teleporter_station - name = "Teleporter Station (Machine Board)" - build_path = /obj/machinery/teleport/station - origin_tech = "programming=4;engineering=4;bluespace=4;plasmatech=3" - req_components = list( - /obj/item/weapon/ore/bluespace_crystal = 2, - /obj/item/weapon/stock_parts/capacitor = 2, - /obj/item/weapon/stock_parts/console_screen = 1) - def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial) - /obj/machinery/teleport/station/Initialize() - ..() + . = ..() link_console_and_hub() /obj/machinery/teleport/station/RefreshParts() diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 3215727740..79428fce6f 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -22,7 +22,7 @@ . = ..() new /obj/machinery/conveyor/auto(locate(x - 1, y, z), WEST) new /obj/machinery/conveyor/auto(loc, WEST) - new /obj/machinery/conveyor/auto(locate(x + 1, y, z), WEST) + new /obj/machinery/conveyor/auto(locate(x + 1, y, z), WEST) countdown = new(src) countdown.start() @@ -33,9 +33,7 @@ to_chat(user, "It will be ready in [max(0, seconds_remaining)] seconds.") /obj/machinery/transformer/Destroy() - if(countdown) - qdel(countdown) - countdown = null + QDEL_NULL(countdown) . = ..() /obj/machinery/transformer/power_change() diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index a65d4baa9f..6ed28fb457 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -24,6 +24,7 @@ max_integrity = 300 integrity_failure = 100 armor = list(melee = 20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70) + circuit = /obj/item/weapon/circuitboard/machine/vendor var/active = 1 //No sales pitches if off! var/vend_ready = 1 //Are we ready to vend?? Is it time?? @@ -60,12 +61,11 @@ var/refill_count = 3 //The number of canisters the vending machine uses /obj/machinery/vending/Initialize() + if(refill_canister) + circuit = null . = ..() wires = new /datum/wires/vending(src) - if(refill_canister) //constructable vending machine - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/vendor(null) - B.apply_default_parts(src) - else + if(!refill_canister) //constructable vending machine build_inventory(products) build_inventory(contraband, 1) build_inventory(premium, 0, 1) @@ -77,46 +77,6 @@ last_slogan = world.time + rand(0, slogan_delay) power_change() -/obj/item/weapon/circuitboard/machine/vendor - name = "Booze-O-Mat Vendor (Machine Board)" - build_path = /obj/machinery/vending/boozeomat - origin_tech = "programming=1" - req_components = list( - /obj/item/weapon/vending_refill/boozeomat = 3) - - var/list/names_paths = list(/obj/machinery/vending/boozeomat = "Booze-O-Mat", - /obj/machinery/vending/coffee = "Solar's Best Hot Drinks", - /obj/machinery/vending/snack = "Getmore Chocolate Corp", - /obj/machinery/vending/cola = "Robust Softdrinks", - /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", - /obj/machinery/vending/autodrobe = "AutoDrobe", - /obj/machinery/vending/clothing = "ClothesMate", - /obj/machinery/vending/medical = "NanoMed Plus", - /obj/machinery/vending/wallmed = "NanoMed") - -/obj/item/weapon/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/screwdriver)) - var/position = names_paths.Find(build_path) - position = (position == names_paths.len) ? 1 : (position + 1) - var/typepath = names_paths[position] - - to_chat(user, "You set the board to \"[names_paths[typepath]]\".") - set_type(typepath) - else - return ..() - -/obj/item/weapon/circuitboard/machine/vendor/proc/set_type(var/obj/machinery/vending/typepath) - build_path = typepath - name = "[names_paths[build_path]] Vendor (Machine Board)" - req_components = list(initial(typepath.refill_canister) = initial(typepath.refill_count)) - -/obj/item/weapon/circuitboard/machine/vendor/apply_default_parts(obj/machinery/M) - for(var/typepath in names_paths) - if(istype(M, typepath)) - set_type(typepath) - break - ..() - /obj/machinery/vending/Destroy() QDEL_NULL(wires) QDEL_NULL(coin) @@ -795,7 +755,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C desc = "Uh oh!" /obj/machinery/vending/cola/random/Initialize() - ..() + . = ..() var/T = pick(subtypesof(/obj/machinery/vending/cola) - /obj/machinery/vending/cola/random) new T(get_turf(src)) qdel(src) diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 11b5a075fc..7db5321b9e 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -17,6 +17,7 @@ dir = EAST icon = 'icons/mecha/mech_bay.dmi' icon_state = "recharge_port" + circuit = /obj/item/weapon/circuitboard/machine/mech_recharger var/obj/mecha/recharging_mech var/obj/machinery/computer/mech_bay_power_console/recharge_console var/max_charge = 50 @@ -24,20 +25,10 @@ var/repairability = 0 var/turf/recharging_turf = null -/obj/machinery/mech_bay_recharge_port/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mech_recharger(null) - B.apply_default_parts(src) +/obj/machinery/mech_bay_recharge_port/Initialize() + . = ..() recharging_turf = get_step(loc, dir) -/obj/item/weapon/circuitboard/machine/mech_recharger - name = "Mechbay Recharger (Machine Board)" - build_path = /obj/machinery/mech_bay_recharge_port - origin_tech = "programming=3;powerstorage=3;engineering=3" - req_components = list( - /obj/item/stack/cable_coil = 2, - /obj/item/weapon/stock_parts/capacitor = 5) - /obj/machinery/mech_bay_recharge_port/RefreshParts() var/MC for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) @@ -149,5 +140,5 @@ add_overlay("recharge_comp_on") /obj/machinery/computer/mech_bay_power_console/Initialize() - ..() + . = ..() reconnect() diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 7c28f5d95b..9865175486 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -9,6 +9,7 @@ idle_power_usage = 20 active_power_usage = 5000 req_access = list(ACCESS_ROBOTICS) + circuit = /obj/item/weapon/circuitboard/machine/mechfab var/time_coeff = 1 var/component_coeff = 1 var/datum/material_container/materials @@ -34,22 +35,10 @@ "Misc" ) -/obj/machinery/mecha_part_fabricator/New() - ..() +/obj/machinery/mecha_part_fabricator/Initialize() files = new /datum/research(src) //Setup the research data holder. materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE)) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mechfab(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/mechfab - name = "Exosuit Fabricator (Machine Board)" - build_path = /obj/machinery/mecha_part_fabricator - origin_tech = "programming=2;engineering=2" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 2, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/weapon/stock_parts/micro_laser = 1, - /obj/item/weapon/stock_parts/console_screen = 1) + return ..() /obj/machinery/mecha_part_fabricator/RefreshParts() var/T = 0 diff --git a/code/game/objects/items/weapons/circuitboards/_circuitboard.dm b/code/game/objects/items/weapons/circuitboards/_circuitboard.dm new file mode 100644 index 0000000000..5288cd4081 --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/_circuitboard.dm @@ -0,0 +1,55 @@ +//File with the circuitboard and circuitboard/machine class definitions and procs + + +// Circuitboard + +/obj/item/weapon/circuitboard + name = "circuit board" + icon = 'icons/obj/module.dmi' + icon_state = "id_mod" + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + origin_tech = "programming=2" + materials = list(MAT_GLASS=1000) + w_class = WEIGHT_CLASS_SMALL + var/build_path = null + +/obj/item/weapon/circuitboard/proc/apply_default_parts(obj/machinery/M) + return + +// Circuitboard/machine +/*Common Parts: Parts List: Ignitor, Timer, Infra-red laser, Infra-red sensor, t_scanner, Capacitor, Valve, sensor unit, +micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells. +*/ + +/obj/item/weapon/circuitboard/machine + var/list/req_components // Components required by the machine. + // Example: list(/obj/item/weapon/stock_parts/matter_bin = 5) + + var/list/def_components // Default replacements for req_components, to be used in apply_default_parts instead of req_components types + // Example: list(/obj/item/weapon/stock_parts/matter_bin = /obj/item/weapon/stock_parts/matter_bin/super) + +// Applies the default parts defined by the circuit board when the machine is created +/obj/item/weapon/circuitboard/machine/apply_default_parts(obj/machinery/M) + if(!req_components) + return + + M.component_parts = list(src) // List of components always contains a board + loc = null + + for(var/comp_path in req_components) + var/comp_amt = req_components[comp_path] + if(!comp_amt) + continue + + if(def_components && def_components[comp_path]) + comp_path = def_components[comp_path] + + if(ispath(comp_path, /obj/item/stack)) + M.component_parts += new comp_path(null, comp_amt) + else + for(var/i in 1 to comp_amt) + M.component_parts += new comp_path(null) + + M.RefreshParts() \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/computer_circuitboards.dm b/code/game/objects/items/weapons/circuitboards/computer_circuitboards.dm new file mode 100644 index 0000000000..17e5dbf597 --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/computer_circuitboards.dm @@ -0,0 +1,369 @@ +/obj/item/weapon/circuitboard/computer/turbine_computer + name = "Turbine Computer (Computer Board)" + build_path = /obj/machinery/computer/turbine_computer + origin_tech = "programming=4;engineering=4;powerstorage=4" + +/obj/item/weapon/circuitboard/computer/launchpad_console + name = "Launchpad Control Console (Computer Board)" + build_path = /obj/machinery/computer/launchpad + origin_tech = "programming=3;bluespace=3;plasmatech=2" + +/obj/item/weapon/circuitboard/computer/message_monitor + name = "Message Monitor (Computer Board)" + build_path = /obj/machinery/computer/message_monitor + origin_tech = "programming=2" + +/obj/item/weapon/circuitboard/computer/security + name = "Security Cameras (Computer Board)" + build_path = /obj/machinery/computer/security + origin_tech = "programming=2;combat=2" + +/obj/item/weapon/circuitboard/computer/xenobiology + name = "circuit board (Xenobiology Console)" + build_path = /obj/machinery/computer/camera_advanced/xenobio + origin_tech = "programming=3;biotech=3" + +/obj/item/weapon/circuitboard/computer/base_construction + name = "circuit board (Aux Mining Base Construction Console)" + build_path = /obj/machinery/computer/camera_advanced/base_construction + origin_tech = "programming=3;engineering=3" + +/obj/item/weapon/circuitboard/computer/aiupload + name = "AI Upload (Computer Board)" + build_path = /obj/machinery/computer/upload/ai + origin_tech = "programming=4;engineering=4" + +/obj/item/weapon/circuitboard/computer/borgupload + name = "Cyborg Upload (Computer Board)" + build_path = /obj/machinery/computer/upload/borg + origin_tech = "programming=4;engineering=4" + +/obj/item/weapon/circuitboard/computer/med_data + name = "Medical Records Console (Computer Board)" + build_path = /obj/machinery/computer/med_data + origin_tech = "programming=2;biotech=2" + +/obj/item/weapon/circuitboard/computer/pandemic + name = "PanD.E.M.I.C. 2200 (Computer Board)" + build_path = /obj/machinery/computer/pandemic + origin_tech = "programming=2;biotech=2" + +/obj/item/weapon/circuitboard/computer/scan_consolenew + name = "DNA Machine (Computer Board)" + build_path = /obj/machinery/computer/scan_consolenew + origin_tech = "programming=2;biotech=2" + +/obj/item/weapon/circuitboard/computer/communications + name = "Communications (Computer Board)" + build_path = /obj/machinery/computer/communications + origin_tech = "programming=3;magnets=3" + var/lastTimeUsed = 0 + +/obj/item/weapon/circuitboard/computer/card + name = "ID Console (Computer Board)" + build_path = /obj/machinery/computer/card + origin_tech = "programming=3" + +/obj/item/weapon/circuitboard/computer/card/centcom + name = "CentCom ID Console (Computer Board)" + build_path = /obj/machinery/computer/card/centcom + +/obj/item/weapon/circuitboard/computer/card/minor + name = "Department Management Console (Computer Board)" + build_path = /obj/machinery/computer/card/minor + var/target_dept = 1 + var/list/dept_list = list("General","Security","Medical","Science","Engineering") + +/obj/item/weapon/circuitboard/computer/card/minor/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/screwdriver)) + target_dept = (target_dept == dept_list.len) ? 1 : (target_dept + 1) + to_chat(user, "You set the board to \"[dept_list[target_dept]]\".") + else + return ..() + +/obj/item/weapon/circuitboard/computer/card/minor/examine(user) + ..() + to_chat(user, "Currently set to \"[dept_list[target_dept]]\".") + +//obj/item/weapon/circuitboard/computer/shield +// name = "Shield Control (Computer Board)" +// build_path = /obj/machinery/computer/stationshield +/obj/item/weapon/circuitboard/computer/teleporter + name = "Teleporter (Computer Board)" + build_path = /obj/machinery/computer/teleporter + origin_tech = "programming=3;bluespace=3;plasmatech=3" + +/obj/item/weapon/circuitboard/computer/secure_data + name = "Security Records Console (Computer Board)" + build_path = /obj/machinery/computer/secure_data + origin_tech = "programming=2;combat=2" + +/obj/item/weapon/circuitboard/computer/stationalert + name = "Station Alerts (Computer Board)" + build_path = /obj/machinery/computer/station_alert + +/obj/item/weapon/circuitboard/computer/atmos_control + name = "Atmospheric Monitor (Computer Board)" + build_path = /obj/machinery/computer/atmos_control + +/obj/item/weapon/circuitboard/computer/atmos_control/tank + name = "Tank Control (Computer Board)" + build_path = /obj/machinery/computer/atmos_control/tank + origin_tech = "programming=2;engineering=3;materials=2" + +/obj/item/weapon/circuitboard/computer/atmos_alert + name = "Atmospheric Alert (Computer Board)" + build_path = /obj/machinery/computer/atmos_alert + +/obj/item/weapon/circuitboard/computer/pod + name = "Massdriver control (Computer Board)" + build_path = /obj/machinery/computer/pod + +/obj/item/weapon/circuitboard/computer/robotics + name = "Robotics Control (Computer Board)" + build_path = /obj/machinery/computer/robotics + origin_tech = "programming=3" + +/obj/item/weapon/circuitboard/computer/cloning + name = "Cloning (Computer Board)" + build_path = /obj/machinery/computer/cloning + origin_tech = "programming=2;biotech=2" + +/obj/item/weapon/circuitboard/computer/arcade/battle + name = "Arcade Battle (Computer Board)" + build_path = /obj/machinery/computer/arcade/battle + origin_tech = "programming=1" + +/obj/item/weapon/circuitboard/computer/arcade/orion_trail + name = "Orion Trail (Computer Board)" + build_path = /obj/machinery/computer/arcade/orion_trail + origin_tech = "programming=1" + +/obj/item/weapon/circuitboard/computer/turbine_control + name = "Turbine control (Computer Board)" + build_path = /obj/machinery/computer/turbine_computer + +/obj/item/weapon/circuitboard/computer/solar_control + name = "Solar Control (Computer Board)" //name fixed 250810 + build_path = /obj/machinery/power/solar_control + origin_tech = "programming=2;powerstorage=2" + +/obj/item/weapon/circuitboard/computer/powermonitor + name = "Power Monitor (Computer Board)" //name fixed 250810 + build_path = /obj/machinery/computer/monitor + origin_tech = "programming=2;powerstorage=2" + +/obj/item/weapon/circuitboard/computer/olddoor + name = "DoorMex (Computer Board)" + build_path = /obj/machinery/computer/pod/old + +/obj/item/weapon/circuitboard/computer/syndicatedoor + name = "ProComp Executive (Computer Board)" + build_path = /obj/machinery/computer/pod/old/syndicate + +/obj/item/weapon/circuitboard/computer/swfdoor + name = "Magix (Computer Board)" + build_path = /obj/machinery/computer/pod/old/swf + +/obj/item/weapon/circuitboard/computer/prisoner + name = "Prisoner Management Console (Computer Board)" + build_path = /obj/machinery/computer/prisoner +/obj/item/weapon/circuitboard/computer/gulag_teleporter_console + name = "Labor Camp teleporter console (Computer Board)" + build_path = /obj/machinery/computer/gulag_teleporter_computer + +/obj/item/weapon/circuitboard/computer/rdconsole + name = "R&D Console (Computer Board)" + build_path = /obj/machinery/computer/rdconsole/core + +/obj/item/weapon/circuitboard/computer/rdconsole/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/screwdriver)) + if(build_path == /obj/machinery/computer/rdconsole/core) + name = "R&D Console - Robotics (Computer Board)" + build_path = /obj/machinery/computer/rdconsole/robotics + to_chat(user, "Access protocols successfully updated.") + else + name = "R&D Console (Computer Board)" + build_path = /obj/machinery/computer/rdconsole/core + to_chat(user, "Defaulting access protocols.") + else + return ..() + +/obj/item/weapon/circuitboard/computer/mecha_control + name = "Exosuit Control Console (Computer Board)" + build_path = /obj/machinery/computer/mecha + +/obj/item/weapon/circuitboard/computer/rdservercontrol + name = "R&D Server Control (Computer Board)" + build_path = /obj/machinery/computer/rdservercontrol + +/obj/item/weapon/circuitboard/computer/crew + name = "Crew Monitoring Console (Computer Board)" + build_path = /obj/machinery/computer/crew + origin_tech = "programming=2;biotech=2" + +/obj/item/weapon/circuitboard/computer/mech_bay_power_console + name = "Mech Bay Power Control Console (Computer Board)" + build_path = /obj/machinery/computer/mech_bay_power_console + origin_tech = "programming=3;powerstorage=3" + +/obj/item/weapon/circuitboard/computer/cargo + name = "Supply Console (Computer Board)" + build_path = /obj/machinery/computer/cargo + origin_tech = "programming=3" + var/contraband = FALSE + var/emagged = FALSE + +/obj/item/weapon/circuitboard/computer/cargo/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/device/multitool)) + if(!emagged) + contraband = !contraband + to_chat(user, "Receiver spectrum set to [contraband ? "Broad" : "Standard"].") + else + to_chat(user, "The spectrum chip is unresponsive.") + else if(istype(I, /obj/item/weapon/card/emag)) + if(!emagged) + contraband = TRUE + emagged = TRUE + to_chat(user, "You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.") + else + return ..() + + +/obj/item/weapon/circuitboard/computer/cargo/request + name = "Supply Request Console (Computer Board)" + build_path = /obj/machinery/computer/cargo/request + +/obj/item/weapon/circuitboard/computer/stockexchange + name = "circuit board (Stock Exchange Console)" + build_path = /obj/machinery/computer/stockexchange + origin_tech = "programming=3" + +/obj/item/weapon/circuitboard/computer/operating + name = "Operating Computer (Computer Board)" + build_path = /obj/machinery/computer/operating + origin_tech = "programming=2;biotech=3" + +/obj/item/weapon/circuitboard/computer/mining + name = "Outpost Status Display (Computer Board)" + build_path = /obj/machinery/computer/security/mining + +/obj/item/weapon/circuitboard/computer/comm_monitor + name = "Telecommunications Monitor (Computer Board)" + build_path = /obj/machinery/computer/telecomms/monitor + origin_tech = "programming=3;magnets=3;bluespace=2" + +/obj/item/weapon/circuitboard/computer/comm_server + name = "Telecommunications Server Monitor (Computer Board)" + build_path = /obj/machinery/computer/telecomms/server + origin_tech = "programming=3;magnets=3;bluespace=2" + +/obj/item/weapon/circuitboard/computer/shuttle + name = "Shuttle (Computer Board)" + build_path = /obj/machinery/computer/shuttle + var/shuttleId + var/possible_destinations = "" + +/obj/item/weapon/circuitboard/computer/shuttle/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/device/multitool)) + var/chosen_id = round(input(usr, "Choose an ID number (-1 for reset):", "Input an Integer", null) as num|null) + if(chosen_id >= 0) + shuttleId = chosen_id + else + shuttleId = initial(shuttleId) + else + return ..() + +/obj/item/weapon/circuitboard/computer/labor_shuttle + name = "Labor Shuttle (Computer Board)" + build_path = /obj/machinery/computer/shuttle/labor + +/obj/item/weapon/circuitboard/computer/labor_shuttle/one_way + name = "Prisoner Shuttle Console (Computer Board)" + build_path = /obj/machinery/computer/shuttle/labor/one_way + +/obj/item/weapon/circuitboard/computer/ferry + name = "Transport Ferry (Computer Board)" + build_path = /obj/machinery/computer/shuttle/ferry + +/obj/item/weapon/circuitboard/computer/ferry/request + name = "Transport Ferry Console (Computer Board)" + build_path = /obj/machinery/computer/shuttle/ferry/request + +/obj/item/weapon/circuitboard/computer/mining_shuttle + name = "Mining Shuttle (Computer Board)" + build_path = /obj/machinery/computer/shuttle/mining + +/obj/item/weapon/circuitboard/computer/white_ship + name = "White Ship (Computer Board)" + build_path = /obj/machinery/computer/shuttle/white_ship + +/obj/item/weapon/circuitboard/computer/auxillary_base + name = "Auxillary Base Management Console (Computer Board)" + build_path = /obj/machinery/computer/auxillary_base + +/obj/item/weapon/circuitboard/computer/holodeck// Not going to let people get this, but it's just here for future + name = "Holodeck Control (Computer Board)" + build_path = /obj/machinery/computer/holodeck + origin_tech = "programming=4" + +/obj/item/weapon/circuitboard/computer/aifixer + name = "AI Integrity Restorer (Computer Board)" + build_path = /obj/machinery/computer/aifixer + origin_tech = "programming=2;biotech=2" + +/obj/item/weapon/circuitboard/computer/slot_machine + name = "Slot Machine (Computer Board)" + build_path = /obj/machinery/computer/slot_machine + origin_tech = "programming=1" + +/obj/item/weapon/circuitboard/computer/libraryconsole + name = "Library Visitor Console (Computer Board)" + build_path = /obj/machinery/computer/libraryconsole + origin_tech = "programming=1" + +/obj/item/weapon/circuitboard/computer/libraryconsole/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/screwdriver)) + if(build_path == /obj/machinery/computer/libraryconsole/bookmanagement) + name = "Library Visitor Console (Computer Board)" + build_path = /obj/machinery/computer/libraryconsole + to_chat(user, "Defaulting access protocols.") + else + name = "Book Inventory Management Console (Computer Board)" + build_path = /obj/machinery/computer/libraryconsole/bookmanagement + to_chat(user, "Access protocols successfully updated.") + else + return ..() + +/obj/item/weapon/circuitboard/computer/apc_control + name = "\improper Power Flow Control Console (Computer Board)" + build_path = /obj/machinery/computer/apc_control + origin_tech = "programming=3;engineering=3;powerstorage=2" + +/obj/item/weapon/circuitboard/computer/shuttle/monastery_shuttle + name = "Monastery Shuttle (Computer Board)" + build_path = /obj/machinery/computer/shuttle/monastery_shuttle + +/obj/item/weapon/circuitboard/computer/syndicate_shuttle + name = "Syndicate Shuttle (Computer Board)" + build_path = /obj/machinery/computer/shuttle/syndicate + var/challenge = FALSE + var/moved = FALSE + +/obj/item/weapon/circuitboard/computer/syndicate_shuttle/Initialize() + . = ..() + GLOB.syndicate_shuttle_boards += src + +/obj/item/weapon/circuitboard/computer/syndicate_shuttle/Destroy() + GLOB.syndicate_shuttle_boards -= src + return ..() + +/obj/item/weapon/circuitboard/computer/bsa_control + name = "Bluespace Artillery Controls (Computer Board)" + build_path = /obj/machinery/computer/bsa_control + origin_tech = "engineering=2;combat=2;bluespace=2" + +/obj/item/weapon/circuitboard/computer/sat_control + name = "Satellite Network Control (Computer Board)" + build_path = /obj/machinery/computer/sat_control + origin_tech = "engineering=3" \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machine_circuitboards.dm b/code/game/objects/items/weapons/circuitboards/machine_circuitboards.dm new file mode 100644 index 0000000000..adaf7623b9 --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/machine_circuitboards.dm @@ -0,0 +1,723 @@ +/obj/item/weapon/circuitboard/machine/sleeper + name = "Sleeper (Machine Board)" + build_path = /obj/machinery/sleeper + origin_tech = "programming=3;biotech=2;engineering=3" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/stack/sheet/glass = 1) + +/obj/item/weapon/circuitboard/machine/announcement_system + name = "Announcement System (Machine Board)" + build_path = /obj/machinery/announcement_system + origin_tech = "programming=3;bluespace=3;magnets=2" + req_components = list( + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/machine/autolathe + name = "Autolathe (Machine Board)" + build_path = /obj/machinery/autolathe + origin_tech = "engineering=2;programming=2" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 3, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/machine/clonepod + name = "Clone Pod (Machine Board)" + build_path = /obj/machinery/clonepod + origin_tech = "programming=2;biotech=2" + req_components = list( + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/scanning_module = 2, + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/stack/sheet/glass = 1) + +/obj/item/weapon/circuitboard/machine/abductor + name = "alien board (Report This)" + icon_state = "abductor_mod" + origin_tech = "programming=5;abductor=3" + +/obj/item/weapon/circuitboard/machine/clockwork + name = "clockwork board (Report This)" + icon_state = "clock_mod" + +/obj/item/weapon/circuitboard/machine/clonescanner + name = "Cloning Scanner (Machine Board)" + build_path = /obj/machinery/dna_scannernew + origin_tech = "programming=2;biotech=2" + req_components = list( + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/stack/sheet/glass = 1, + /obj/item/stack/cable_coil = 2) + +/obj/item/weapon/circuitboard/machine/holopad + name = "AI Holopad (Machine Board)" + build_path = /obj/machinery/holopad + origin_tech = "programming=1" + req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) + +/obj/item/weapon/circuitboard/machine/launchpad + name = "Bluespace Launchpad (Machine Board)" + build_path = /obj/machinery/launchpad + origin_tech = "programming=3;engineering=3;plasmatech=2;bluespace=3" + req_components = list( + /obj/item/weapon/ore/bluespace_crystal = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial) + +/obj/item/weapon/circuitboard/machine/limbgrower + name = "Limb Grower (Machine Board)" + build_path = /obj/machinery/limbgrower + origin_tech = "programming=2;biotech=2" + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/reagent_containers/glass/beaker = 2, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/machine/quantumpad + name = "Quantum Pad (Machine Board)" + build_path = /obj/machinery/quantumpad + origin_tech = "programming=3;engineering=3;plasmatech=3;bluespace=4" + req_components = list( + /obj/item/weapon/ore/bluespace_crystal = 1, + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/stack/cable_coil = 1) + def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial) + +/obj/item/weapon/circuitboard/machine/recharger + name = "Weapon Recharger (Machine Board)" + build_path = /obj/machinery/recharger + origin_tech = "powerstorage=4;engineering=3;materials=4" + req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) + +/obj/item/weapon/circuitboard/machine/cyborgrecharger + name = "Cyborg Recharger (Machine Board)" + build_path = /obj/machinery/recharge_station + origin_tech = "powerstorage=3;engineering=3" + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 2, + /obj/item/weapon/stock_parts/cell = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + def_components = list(/obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high) + +/obj/item/weapon/circuitboard/machine/recycler + name = "Recycler (Machine Board)" + build_path = /obj/machinery/recycler + origin_tech = "programming=2;engineering=2" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/machine/space_heater + name = "Space Heater (Machine Board)" + build_path = /obj/machinery/space_heater + origin_tech = "programming=2;engineering=2;plasmatech=2" + req_components = list( + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/stack/cable_coil = 3) + +/obj/item/weapon/circuitboard/machine/telecomms/broadcaster + name = "Subspace Broadcaster (Machine Board)" + build_path = /obj/machinery/telecomms/broadcaster + origin_tech = "programming=2;engineering=2;bluespace=1" + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/subspace/filter = 1, + /obj/item/weapon/stock_parts/subspace/crystal = 1, + /obj/item/weapon/stock_parts/micro_laser = 2) + +/obj/item/weapon/circuitboard/machine/telecomms/bus + name = "Bus Mainframe (Machine Board)" + build_path = /obj/machinery/telecomms/bus + origin_tech = "programming=2;engineering=2" + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/subspace/filter = 1) + +/obj/item/weapon/circuitboard/machine/telecomms/hub + name = "Hub Mainframe (Machine Board)" + build_path = /obj/machinery/telecomms/hub + origin_tech = "programming=2;engineering=2" + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/subspace/filter = 2) + +/obj/item/weapon/circuitboard/machine/telecomms/processor + name = "Processor Unit (Machine Board)" + build_path = /obj/machinery/telecomms/processor + origin_tech = "programming=2;engineering=2" + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 3, + /obj/item/weapon/stock_parts/subspace/filter = 1, + /obj/item/weapon/stock_parts/subspace/treatment = 2, + /obj/item/weapon/stock_parts/subspace/analyzer = 1, + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/subspace/amplifier = 1) + +/obj/item/weapon/circuitboard/machine/telecomms/receiver + name = "Subspace Receiver (Machine Board)" + build_path = /obj/machinery/telecomms/receiver + origin_tech = "programming=2;engineering=2;bluespace=1" + req_components = list( + /obj/item/weapon/stock_parts/subspace/ansible = 1, + /obj/item/weapon/stock_parts/subspace/filter = 1, + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/weapon/stock_parts/micro_laser = 1) + +/obj/item/weapon/circuitboard/machine/telecomms/relay + name = "Relay Mainframe (Machine Board)" + build_path = /obj/machinery/telecomms/relay + origin_tech = "programming=2;engineering=2;bluespace=2" + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/subspace/filter = 2) + +/obj/item/weapon/circuitboard/machine/telecomms/server + name = "Telecommunication Server (Machine Board)" + build_path = /obj/machinery/telecomms/server + origin_tech = "programming=2;engineering=2" + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/subspace/filter = 1) + +/obj/item/weapon/circuitboard/machine/teleporter_hub + name = "Teleporter Hub (Machine Board)" + build_path = /obj/machinery/teleport/hub + origin_tech = "programming=3;engineering=4;bluespace=4;materials=4" + req_components = list( + /obj/item/weapon/ore/bluespace_crystal = 3, + /obj/item/weapon/stock_parts/matter_bin = 1) + def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial) + +/obj/item/weapon/circuitboard/machine/teleporter_station + name = "Teleporter Station (Machine Board)" + build_path = /obj/machinery/teleport/station + origin_tech = "programming=4;engineering=4;bluespace=4;plasmatech=3" + req_components = list( + /obj/item/weapon/ore/bluespace_crystal = 2, + /obj/item/weapon/stock_parts/capacitor = 2, + /obj/item/weapon/stock_parts/console_screen = 1) + def_components = list(/obj/item/weapon/ore/bluespace_crystal = /obj/item/weapon/ore/bluespace_crystal/artificial) + +/obj/item/weapon/circuitboard/machine/vendor + name = "Booze-O-Mat Vendor (Machine Board)" + build_path = /obj/machinery/vending/boozeomat + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/vending_refill/boozeomat = 3) + + var/static/list/vending_names_paths = list(/obj/machinery/vending/boozeomat = "Booze-O-Mat", + /obj/machinery/vending/coffee = "Solar's Best Hot Drinks", + /obj/machinery/vending/snack = "Getmore Chocolate Corp", + /obj/machinery/vending/cola = "Robust Softdrinks", + /obj/machinery/vending/cigarette = "ShadyCigs Deluxe", + /obj/machinery/vending/autodrobe = "AutoDrobe", + /obj/machinery/vending/clothing = "ClothesMate", + /obj/machinery/vending/medical = "NanoMed Plus", + /obj/machinery/vending/wallmed = "NanoMed") + +/obj/item/weapon/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/screwdriver)) + var/position = vending_names_paths.Find(build_path) + position = (position == vending_names_paths.len) ? 1 : (position + 1) + var/typepath = vending_names_paths[position] + + to_chat(user, "You set the board to \"[vending_names_paths[typepath]]\".") + set_type(typepath) + else + return ..() + +/obj/item/weapon/circuitboard/machine/vendor/proc/set_type(obj/machinery/vending/typepath) + build_path = typepath + name = "[vending_names_paths[build_path]] Vendor (Machine Board)" + req_components = list(initial(typepath.refill_canister) = initial(typepath.refill_count)) + +/obj/item/weapon/circuitboard/machine/vendor/apply_default_parts(obj/machinery/M) + for(var/typepath in vending_names_paths) + if(istype(M, typepath)) + set_type(typepath) + break + return ..() + +/obj/item/weapon/circuitboard/machine/mech_recharger + name = "Mechbay Recharger (Machine Board)" + build_path = /obj/machinery/mech_bay_recharge_port + origin_tech = "programming=3;powerstorage=3;engineering=3" + req_components = list( + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/capacitor = 5) + +/obj/item/weapon/circuitboard/machine/mechfab + name = "Exosuit Fabricator (Machine Board)" + build_path = /obj/machinery/mecha_part_fabricator + origin_tech = "programming=2;engineering=2" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/machine/cryo_tube + name = "Cryotube (Machine Board)" + build_path = /obj/machinery/atmospherics/components/unary/cryo_cell + origin_tech = "programming=4;biotech=3;engineering=4;plasmatech=3" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/stack/sheet/glass = 2) + +/obj/item/weapon/circuitboard/machine/thermomachine + name = "Thermomachine (Machine Board)" + desc = "You can use a screwdriver to switch between heater and freezer." + origin_tech = "programming=3;plasmatech=3" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/micro_laser = 2, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/machine/thermomachine/Initialize() + . = ..() + if(prob(50)) + name = "Freezer (Machine Board)" + build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer + else + name = "Heater (Machine Board)" + build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater + +#define FREEZER /obj/item/weapon/circuitboard/machine/thermomachine/freezer +#define HEATER /obj/item/weapon/circuitboard/machine/thermomachine/heater + +/obj/item/weapon/circuitboard/machine/thermomachine/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/screwdriver)) + var/obj/item/weapon/circuitboard/new_type + var/new_setting + switch(build_path) + if(FREEZER) + new_type = HEATER + new_setting = "Heater" + if(HEATER) + new_type = FREEZER + new_setting = "Freezer" + name = initial(new_type.name) + build_path = initial(new_type.build_path) + playsound(user, I.usesound, 50, 1) + to_chat(user, "You change the circuitboard setting to \"[new_setting]\".") + else + return ..() + +#undef FREEZER +#undef HEATER + +/obj/item/weapon/circuitboard/machine/thermomachine/heater + name = "Heater (Machine Board)" + build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater + +/obj/item/weapon/circuitboard/machine/thermomachine/freezer + name = "Freezer (Machine Board)" + build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer + +/obj/item/weapon/circuitboard/machine/deep_fryer + name = "circuit board (Deep Fryer)" + build_path = /obj/machinery/deepfryer + origin_tech = "programming=1" + req_components = list(/obj/item/weapon/stock_parts/micro_laser = 1) + +/obj/item/weapon/circuitboard/machine/gibber + name = "Gibber (Machine Board)" + build_path = /obj/machinery/gibber + origin_tech = "programming=2;engineering=2" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/machine/monkey_recycler + name = "Monkey Recycler (Machine Board)" + build_path = /obj/machinery/monkey_recycler + origin_tech = "programming=1;biotech=2" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/machine/processor + name = "Food Processor (Machine Board)" + build_path = /obj/machinery/processor + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/machine/processor/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/screwdriver)) + if(build_path == /obj/machinery/processor) + name = "Slime Processor (Machine Board)" + build_path = /obj/machinery/processor/slime + to_chat(user, "Name protocols successfully updated.") + else + name = "Food Processor (Machine Board)" + build_path = /obj/machinery/processor + to_chat(user, "Defaulting name protocols.") + else + return ..() + +/obj/item/weapon/circuitboard/machine/processor/slime + name = "Slime Processor (Machine Board)" + build_path = /obj/machinery/processor/slime + +/obj/item/weapon/circuitboard/machine/smartfridge + name = "Smartfridge (Machine Board)" + build_path = /obj/machinery/smartfridge + origin_tech = "programming=1" + req_components = list(/obj/item/weapon/stock_parts/matter_bin = 1) + var/static/list/fridges_name_paths = list(/obj/machinery/smartfridge = "plant produce", + /obj/machinery/smartfridge/food = "food", + /obj/machinery/smartfridge/drinks = "drinks", + /obj/machinery/smartfridge/extract = "slimes", + /obj/machinery/smartfridge/chemistry = "chems", + /obj/machinery/smartfridge/chemistry/virology = "viruses", + /obj/machinery/smartfridge/disks = "disks") + +/obj/item/weapon/circuitboard/machine/smartfridge/Initialize(mapload, new_type) + if(new_type) + build_path = new_type + return ..() + +/obj/item/weapon/circuitboard/machine/smartfridge/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/screwdriver)) + var/position = fridges_name_paths.Find(build_path, fridges_name_paths) + position = (position == fridges_name_paths.len) ? 1 : (position + 1) + build_path = fridges_name_paths[position] + to_chat(user, "You set the board to [fridges_name_paths[build_path]].") + else + return ..() + +/obj/item/weapon/circuitboard/machine/smartfridge/examine(mob/user) + ..() + to_chat(user, "[src] is set to [fridges_name_paths[build_path]]. You can use a screwdriver to reconfigure it.") + +/obj/item/weapon/circuitboard/machine/biogenerator + name = "Biogenerator (Machine Board)" + build_path = /obj/machinery/biogenerator + origin_tech = "programming=2;biotech=3;materials=3" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/machine/plantgenes + name = "Plant DNA Manipulator (Machine Board)" + build_path = /obj/machinery/plantgenes + origin_tech = "programming=3;biotech=3" + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/weapon/stock_parts/scanning_module = 1) + +/obj/item/weapon/circuitboard/machine/plantgenes/vault + name = "alien board (Plant DNA Manipulator)" + icon_state = "abductor_mod" + origin_tech = "programming=5;biotech=5" + // It wasn't made by actual abductors race, so no abductor tech here. + def_components = list( + /obj/item/weapon/stock_parts/manipulator = /obj/item/weapon/stock_parts/manipulator/femto, + /obj/item/weapon/stock_parts/micro_laser = /obj/item/weapon/stock_parts/micro_laser/quadultra, + /obj/item/weapon/stock_parts/scanning_module = /obj/item/weapon/stock_parts/scanning_module/triphasic) + + +/obj/item/weapon/circuitboard/machine/hydroponics + name = "Hydroponics Tray (Machine Board)" + build_path = /obj/machinery/hydroponics/constructable + origin_tech = "programming=1;biotech=2" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/machine/seed_extractor + name = "Seed Extractor (Machine Board)" + build_path = /obj/machinery/seed_extractor + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/machine/ore_redemption + name = "Ore Redemption (Machine Board)" + build_path = /obj/machinery/mineral/ore_redemption + origin_tech = "programming=1;engineering=2" + req_components = list( + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/device/assembly/igniter = 1) + +/obj/item/weapon/circuitboard/machine/mining_equipment_vendor + name = "Mining Equipment Vendor (Machine Board)" + build_path = /obj/machinery/mineral/equipment_vendor + origin_tech = "programming=1;engineering=3" + req_components = list( + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/weapon/stock_parts/matter_bin = 3) + +/obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem + name = "Golem Ship Equipment Vendor (Machine Board)" + build_path = /obj/machinery/mineral/equipment_vendor/golem + +/obj/item/weapon/circuitboard/machine/ntnet_relay + name = "NTNet Relay (Machine Board)" + build_path = /obj/machinery/ntnet_relay + origin_tech = "programming=3;bluespace=3;magnets=2" + req_components = list( + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/subspace/filter = 1) + +/obj/item/weapon/circuitboard/machine/pacman + name = "PACMAN-type Generator (Machine Board)" + build_path = /obj/machinery/power/port_gen/pacman + origin_tech = "programming=2;powerstorage=3;plasmatech=3;engineering=3" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/capacitor = 1) + +/obj/item/weapon/circuitboard/machine/pacman/super + name = "SUPERPACMAN-type Generator (Machine Board)" + build_path = /obj/machinery/power/port_gen/pacman/super + origin_tech = "programming=3;powerstorage=4;engineering=4" + +/obj/item/weapon/circuitboard/machine/pacman/mrs + name = "MRSPACMAN-type Generator (Machine Board)" + build_path = /obj/machinery/power/port_gen/pacman/mrs + origin_tech = "programming=3;powerstorage=4;engineering=4;plasmatech=4" + +/obj/item/weapon/circuitboard/machine/rtg + name = "RTG (Machine Board)" + build_path = /obj/machinery/power/rtg + origin_tech = "programming=2;materials=4;powerstorage=3;engineering=2" + req_components = list( + /obj/item/stack/cable_coil = 5, + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/stack/sheet/mineral/uranium = 10) // We have no Pu-238, and this is the closest thing to it. + +/obj/item/weapon/circuitboard/machine/rtg/advanced + name = "Advanced RTG (Machine Board)" + build_path = /obj/machinery/power/rtg/advanced + origin_tech = "programming=3;materials=5;powerstorage=4;engineering=3;plasmatech=3" + req_components = list( + /obj/item/stack/cable_coil = 5, + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/stack/sheet/mineral/uranium = 10, + /obj/item/stack/sheet/mineral/plasma = 5) + +/obj/item/weapon/circuitboard/machine/abductor/core + name = "alien board (Void Core)" + build_path = /obj/machinery/power/rtg/abductor + origin_tech = "programming=5;abductor=5;powerstorage=8;engineering=8" + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/cell/infinite/abductor = 1) + def_components = list( + /obj/item/weapon/stock_parts/capacitor = /obj/item/weapon/stock_parts/capacitor/quadratic, + /obj/item/weapon/stock_parts/micro_laser = /obj/item/weapon/stock_parts/micro_laser/quadultra) + +/obj/item/weapon/circuitboard/machine/emitter + name = "Emitter (Machine Board)" + build_path = /obj/machinery/power/emitter + origin_tech = "programming=3;powerstorage=4;engineering=4" + req_components = list( + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/machine/smes + name = "SMES (Machine Board)" + build_path = /obj/machinery/power/smes + origin_tech = "programming=3;powerstorage=3;engineering=3" + req_components = list( + /obj/item/stack/cable_coil = 5, + /obj/item/weapon/stock_parts/cell = 5, + /obj/item/weapon/stock_parts/capacitor = 1) + def_components = list(/obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high/empty) + +/obj/item/weapon/circuitboard/machine/tesla_coil + name = "Tesla Coil (Machine Board)" + build_path = /obj/machinery/power/tesla_coil + origin_tech = "programming=3;magnets=3;powerstorage=3" + req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) + +/obj/item/weapon/circuitboard/machine/grounding_rod + name = "Grounding Rod (Machine Board)" + build_path = /obj/machinery/power/grounding_rod + origin_tech = "programming=3;powerstorage=3;magnets=3;plasmatech=2" + req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) + +/obj/item/weapon/circuitboard/machine/power_compressor + name = "Power Compressor (Machine Board)" + build_path = /obj/machinery/power/compressor + origin_tech = "programming=4;powerstorage=4;engineering=4" + req_components = list( + /obj/item/stack/cable_coil = 5, + /obj/item/weapon/stock_parts/manipulator = 6) + +/obj/item/weapon/circuitboard/machine/power_turbine + name = "Power Turbine (Machine Board)" + build_path = /obj/machinery/power/turbine + origin_tech = "programming=4;powerstorage=4;engineering=4" + req_components = list( + /obj/item/stack/cable_coil = 5, + /obj/item/weapon/stock_parts/capacitor = 6) + +/obj/item/weapon/circuitboard/machine/chem_dispenser + name = "Portable Chem Dispenser (Machine Board)" + build_path = /obj/machinery/chem_dispenser/constructable + origin_tech = "materials=4;programming=4;plasmatech=4;biotech=3" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/weapon/stock_parts/cell = 1) + def_components = list(/obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high) + +/obj/item/weapon/circuitboard/machine/chem_heater + name = "Chemical Heater (Machine Board)" + build_path = /obj/machinery/chem_heater + origin_tech = "programming=2;engineering=2;biotech=2" + req_components = list( + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/machine/chem_master + name = "ChemMaster 3000 (Machine Board)" + build_path = /obj/machinery/chem_master + origin_tech = "materials=3;programming=2;biotech=3" + req_components = list( + /obj/item/weapon/reagent_containers/glass/beaker = 2, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/item/weapon/circuitboard/machine/chem_master/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weapon/screwdriver)) + var/new_name = "ChemMaster" + var/new_path = /obj/machinery/chem_master + + if(build_path == /obj/machinery/chem_master) + new_name = "CondiMaster" + new_path = /obj/machinery/chem_master/condimaster + + build_path = new_path + name = "[new_name] 3000 (Machine Board)" + to_chat(user, "You change the circuit board setting to \"[new_name]\".") + else + return ..() + +/obj/item/weapon/circuitboard/machine/chem_master/condi + name = "CondiMaster 3000 (Machine Board)" + build_path = /obj/machinery/chem_master/condimaster + +/obj/item/weapon/circuitboard/machine/circuit_imprinter + name = "Circuit Imprinter (Machine Board)" + build_path = /obj/machinery/r_n_d/circuit_imprinter + origin_tech = "engineering=2;programming=2" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/reagent_containers/glass/beaker = 2) + +/obj/item/weapon/circuitboard/machine/destructive_analyzer + name = "Destructive Analyzer (Machine Board)" + build_path = /obj/machinery/r_n_d/destructive_analyzer + origin_tech = "magnets=2;engineering=2;programming=2" + req_components = list( + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/stock_parts/micro_laser = 1) + +/obj/item/weapon/circuitboard/machine/experimentor + name = "E.X.P.E.R.I-MENTOR (Machine Board)" + build_path = /obj/machinery/r_n_d/experimentor + origin_tech = "magnets=1;engineering=1;programming=1;biotech=1;bluespace=2" + req_components = list( + /obj/item/weapon/stock_parts/scanning_module = 1, + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/weapon/stock_parts/micro_laser = 2) + +/obj/item/weapon/circuitboard/machine/protolathe + name = "Protolathe (Machine Board)" + build_path = /obj/machinery/r_n_d/protolathe + origin_tech = "engineering=2;programming=2" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 2, + /obj/item/weapon/stock_parts/manipulator = 2, + /obj/item/weapon/reagent_containers/glass/beaker = 2) + +/obj/item/weapon/circuitboard/machine/rdserver + name = "R&D Server (Machine Board)" + build_path = /obj/machinery/r_n_d/server + origin_tech = "programming=3" + req_components = list( + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/scanning_module = 1) + +/obj/item/weapon/circuitboard/machine/bsa/back + name = "Bluespace Artillery Generator (Machine Board)" + build_path = /obj/machinery/bsa/back + origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies! + req_components = list( + /obj/item/weapon/stock_parts/capacitor/quadratic = 5, + /obj/item/stack/cable_coil = 2) + +/obj/item/weapon/circuitboard/machine/bsa/middle + name = "Bluespace Artillery Fusor (Machine Board)" + build_path = /obj/machinery/bsa/middle + origin_tech = "engineering=2;combat=2;bluespace=2" + req_components = list( + /obj/item/weapon/ore/bluespace_crystal = 20, + /obj/item/stack/cable_coil = 2) + +/obj/item/weapon/circuitboard/machine/bsa/front + name = "Bluespace Artillery Bore (Machine Board)" + build_path = /obj/machinery/bsa/front + origin_tech = "engineering=2;combat=2;bluespace=2" + req_components = list( + /obj/item/weapon/stock_parts/manipulator/femto = 5, + /obj/item/stack/cable_coil = 2) + +/obj/item/weapon/circuitboard/machine/dna_vault + name = "DNA Vault (Machine Board)" + build_path = /obj/machinery/dna_vault + origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies! + req_components = list( + /obj/item/weapon/stock_parts/capacitor/super = 5, + /obj/item/weapon/stock_parts/manipulator/pico = 5, + /obj/item/stack/cable_coil = 2) + +/obj/item/weapon/circuitboard/machine/microwave + name = "Microwave (Machine Board)" + build_path = /obj/machinery/microwave + origin_tech = "programming=2;magnets=2" + req_components = list( + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/stack/cable_coil = 2, + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/stack/sheet/glass = 1) \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 487b70f8f2..ccfbae5e96 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -20,15 +20,13 @@ var/special = FALSE var/special_name = "special function" -/obj/machinery/implantchair/New() - ..() +/obj/machinery/implantchair/Initialize() + . = ..() open_machine() update_icon() -/obj/machinery/implantchair/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ - datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state) - +/obj/machinery/implantchair/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "implantchair", name, 375, 280, master_ui, state) diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index a095840b09..a83ced850e 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -52,8 +52,7 @@ /obj/machinery/vr_sleeper/Destroy() open_machine() cleanup_vr_human() - qdel(sparks) - sparks = null + QDEL_NULL(sparks) return ..() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index b55ed7e84f..9cc914057d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -9,9 +9,10 @@ max_integrity = 350 armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 30, acid = 30) layer = ABOVE_WINDOW_LAYER + state_open = FALSE + circuit = /obj/item/weapon/circuitboard/machine/cryo_tube var/on = FALSE - state_open = FALSE var/autoeject = FALSE var/volume = 100 @@ -35,8 +36,6 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/Initialize() . = ..() initialize_directions = dir - var/obj/item/weapon/circuitboard/machine/cryo_tube/B = new - B.apply_default_parts(src) radio = new(src) radio.keyslot = new radio_key @@ -44,16 +43,6 @@ radio.canhear_range = 0 radio.recalculateChannels() -/obj/item/weapon/circuitboard/machine/cryo_tube - name = "Cryotube (Machine Board)" - build_path = /obj/machinery/atmospherics/components/unary/cryo_cell - origin_tech = "programming=4;biotech=3;engineering=4;plasmatech=3" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/stack/cable_coil = 1, - /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/stack/sheet/glass = 2) - /obj/machinery/atmospherics/components/unary/cryo_cell/on_construction() ..(dir, dir) @@ -69,11 +58,8 @@ conduction_coefficient = initial(conduction_coefficient) * C /obj/machinery/atmospherics/components/unary/cryo_cell/Destroy() - qdel(radio) - radio = null - if(beaker) - qdel(beaker) - beaker = null + QDEL_NULL(radio) + QDEL_NULL(beaker) return ..() /obj/machinery/atmospherics/components/unary/cryo_cell/contents_explosion(severity, target) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 32789011ae..9a981ae81b 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -10,6 +10,7 @@ max_integrity = 300 armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 80, acid = 30) layer = OBJ_LAYER + circuit = /obj/item/weapon/circuitboard/machine/thermomachine var/on = FALSE var/min_temperature = 0 @@ -18,49 +19,9 @@ var/heat_capacity = 0 var/interactive = TRUE // So mapmakers can disable interaction. -/obj/machinery/atmospherics/components/unary/thermomachine/New() - ..() - initialize_directions = dir - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/thermomachine(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/thermomachine - name = "Thermomachine (Machine Board)" - desc = "You can use a screwdriver to switch between heater and freezer." - origin_tech = "programming=3;plasmatech=3" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 2, - /obj/item/weapon/stock_parts/micro_laser = 2, - /obj/item/stack/cable_coil = 1, - /obj/item/weapon/stock_parts/console_screen = 1) - -/obj/item/weapon/circuitboard/machine/thermomachine/Initialize() +/obj/machinery/atmospherics/components/unary/thermomachine/Initialize() . = ..() - if(prob(50)) - name = "Freezer (Machine Board)" - build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer - else - name = "Heater (Machine Board)" - build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater - -/obj/item/weapon/circuitboard/machine/thermomachine/attackby(obj/item/I, mob/user, params) - var/obj/item/weapon/circuitboard/machine/freezer = /obj/item/weapon/circuitboard/machine/thermomachine/freezer - var/obj/item/weapon/circuitboard/machine/heater = /obj/item/weapon/circuitboard/machine/thermomachine/heater - var/obj/item/weapon/circuitboard/machine/newtype - - if(istype(I, /obj/item/weapon/screwdriver)) - var/new_setting = "Heater" - playsound(src.loc, I.usesound, 50, 1) - if(build_path == initial(heater.build_path)) - newtype = freezer - new_setting = "Freezer" - else - newtype = heater - name = initial(newtype.name) - build_path = initial(newtype.build_path) - to_chat(user, "You change the circuitboard setting to \"[new_setting]\".") - else - return ..() + initialize_directions = dir /obj/machinery/atmospherics/components/unary/thermomachine/on_construction() ..(dir,dir) @@ -202,15 +163,7 @@ icon_state_open = "freezer-o" max_temperature = T20C min_temperature = 170 - -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/thermomachine/freezer(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/thermomachine/freezer - name = "Freezer (Machine Board)" - build_path = /obj/machinery/atmospherics/components/unary/thermomachine/freezer + circuit = /obj/item/weapon/circuitboard/machine/thermomachine/freezer /obj/machinery/atmospherics/components/unary/thermomachine/freezer/RefreshParts() ..() @@ -227,15 +180,7 @@ icon_state_open = "heater-o" max_temperature = 140 min_temperature = T20C - -/obj/machinery/atmospherics/components/unary/thermomachine/heater/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/thermomachine/heater(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/thermomachine/heater - name = "Heater (Machine Board)" - build_path = /obj/machinery/atmospherics/components/unary/thermomachine/heater + circuit = /obj/item/weapon/circuitboard/machine/thermomachine/heater /obj/machinery/atmospherics/components/unary/thermomachine/heater/RefreshParts() ..() diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 26c27c7be4..cca108757a 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -16,7 +16,7 @@ volume = 1000 /obj/machinery/portable_atmospherics/pump/Initialize() - ..() + . = ..() pump = new(src, FALSE) pump.on = TRUE pump.stat = 0 @@ -26,8 +26,7 @@ var/turf/T = get_turf(src) T.assume_air(air_contents) air_update_turf() - qdel(pump) - pump = null + QDEL_NULL(pump) return ..() /obj/machinery/portable_atmospherics/pump/update_icon() diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 22d92b54be..6d634ab3a4 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -29,13 +29,11 @@ var/reset_path = /obj/effect/ctf/flag_reset /obj/item/weapon/twohanded/ctf/Destroy() - if(reset) - qdel(reset) - reset = null - . = ..() + QDEL_NULL(reset) + return ..() /obj/item/weapon/twohanded/ctf/Initialize() - ..() + . = ..() SET_SECONDARY_FLAG(src, SLOWS_WHILE_IN_HAND) if(!reset) reset = new reset_path(get_turf(src)) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index e533d625cc..9983219e2e 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -22,7 +22,7 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation) switch(dir) if(SOUTH,SOUTHEAST,SOUTHWEST) density = FALSE - ..() + return ..() /obj/machinery/gateway/proc/toggleoff() for(var/obj/machinery/gateway/G in linked) @@ -75,10 +75,13 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation) /obj/machinery/gateway/proc/toggleon(mob/user) return FALSE -/obj/machinery/gateway/centerstation/New() - ..() +/obj/machinery/gateway/centerstation/Initialize() + . = ..() if(!GLOB.the_gateway) GLOB.the_gateway = src + update_icon() + wait = world.time + config.gateway_delay //+ thirty minutes default + awaygate = locate(/obj/machinery/gateway/centeraway) /obj/machinery/gateway/centerstation/Destroy() if(GLOB.the_gateway == src) @@ -96,12 +99,6 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation) var/obj/machinery/gateway/centeraway/awaygate = null can_link = TRUE -/obj/machinery/gateway/centerstation/Initialize() - ..() - update_icon() - wait = world.time + config.gateway_delay //+ thirty minutes default - awaygate = locate(/obj/machinery/gateway/centeraway) - /obj/machinery/gateway/centerstation/update_icon() if(active) icon_state = "oncenter" @@ -182,7 +179,7 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation) /obj/machinery/gateway/centeraway/Initialize() - ..() + . = ..() update_icon() stationgate = locate(/obj/machinery/gateway/centerstation) diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 15117c1cbb..33f822ac2b 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -18,8 +18,8 @@ circuit = /obj/item/weapon/circuitboard/computer/cargo/request requestonly = TRUE -/obj/machinery/computer/cargo/New() - ..() +/obj/machinery/computer/cargo/Initialize() + . = ..() var/obj/item/weapon/circuitboard/computer/cargo/board = circuit contraband = board.contraband emagged = board.emagged diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 263b5c5d30..c9fe711b00 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1778,9 +1778,7 @@ name = "Shield System Control Board" cost = 5000 special = TRUE - contains = list( - /obj/item/weapon/circuitboard/machine/computer/sat_control - ) + contains = list(/obj/item/weapon/circuitboard/computer/sat_control) crate_name= "shield control board crate" /datum/supply_pack/misc/bicycle diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index e21bda82ed..a7896dd266 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -18,7 +18,7 @@ insert ascii eagle on american flag background here container_type = OPENCONTAINER var/obj/item/frying = null //What's being fried RIGHT NOW? var/cook_time = 0 - var/static/list/blacklisted_items = typecacheof(list( + var/static/list/deepfry_blacklisted_items = typecacheof(list( /obj/item/weapon/screwdriver, /obj/item/weapon/crowbar, /obj/item/weapon/wrench, @@ -28,14 +28,8 @@ insert ascii eagle on american flag background here /obj/item/weapon/reagent_containers/glass, /obj/item/weapon/storage/part_replacer)) -/obj/item/weapon/circuitboard/machine/deep_fryer - name = "circuit board (Deep Fryer)" - build_path = /obj/machinery/deepfryer - origin_tech = "programming=1" - req_components = list(/obj/item/weapon/stock_parts/micro_laser = 1) - -/obj/machinery/deepfryer/New() - ..() +/obj/machinery/deepfryer/Initialize() + . = ..() create_reagents(50) reagents.add_reagent("nutriment", 25) component_parts = list() @@ -62,7 +56,7 @@ insert ascii eagle on american flag background here else if(default_deconstruction_screwdriver(user, "fryer_off", "fryer_off" ,I)) //where's the open maint panel icon?! return else - if(is_type_in_typecache(I, blacklisted_items)) + if(is_type_in_typecache(I, deepfry_blacklisted_items)) . = ..() else if(user.drop_item() && !frying) to_chat(user, "You put [I] into [src].") diff --git a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm index c3f9e0334d..fcef69e0d0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm @@ -18,17 +18,15 @@ container_type = OPENCONTAINER var/obj/item/weapon/reagent_containers/mixer -/obj/machinery/food_cart/New() - ..() +/obj/machinery/food_cart/Initialize() + . = ..() create_reagents(LIQUID_CAPACIY) reagents.set_reacting(FALSE) mixer = new /obj/item/weapon/reagent_containers(src, MIXER_CAPACITY) mixer.name = "Mixer" /obj/machinery/food_cart/Destroy() - if(mixer) - qdel(mixer) - mixer = null + QDEL_NULL(mixer) return ..() /obj/machinery/food_cart/attack_hand(mob/user) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 2d6bc81f0b..c3d4a1802b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -6,58 +6,21 @@ icon_state = "grinder" density = TRUE anchored = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 2 + active_power_usage = 500 + circuit = /obj/item/weapon/circuitboard/machine/gibber + var/operating = FALSE //Is it on? var/dirty = 0 // Does it need cleaning? var/gibtime = 40 // Time from starting until meat appears var/meat_produced = 0 var/ignore_clothing = 0 - use_power = IDLE_POWER_USE - idle_power_usage = 2 - active_power_usage = 500 - -//auto-gibs anything that bumps into it -/obj/machinery/gibber/autogibber - var/turf/input_plate - -/obj/machinery/gibber/autogibber/Initialize() - . = ..() - for(var/i in GLOB.cardinals) - var/obj/machinery/mineral/input/input_obj = locate() in get_step(loc, i) - if(input_obj) - if(isturf(input_obj.loc)) - input_plate = input_obj.loc - qdel(input_obj) - break - - if(!input_plate) - CRASH("Didn't find an input plate.") - return - -/obj/machinery/gibber/autogibber/CollidedWith(atom/movable/AM) - if(!input_plate) - return - - if(ismob(AM)) - var/mob/M = AM - - if(M.loc == input_plate) - M.loc = src - M.gib() /obj/machinery/gibber/Initialize() . = ..() add_overlay("grjam") - var/obj/item/weapon/circuitboard/machine/gibber/B = new - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/gibber - name = "Gibber (Machine Board)" - build_path = /obj/machinery/gibber - origin_tech = "programming=2;engineering=2" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/weapon/stock_parts/manipulator = 1) /obj/machinery/gibber/RefreshParts() var/gib_time = 40 @@ -234,3 +197,32 @@ pixel_x = initial(pixel_x) //return to its spot after shaking operating = FALSE update_icon() + +//auto-gibs anything that bumps into it +/obj/machinery/gibber/autogibber + var/turf/input_plate + +/obj/machinery/gibber/autogibber/Initialize() + . = ..() + for(var/i in GLOB.cardinals) + var/obj/machinery/mineral/input/input_obj = locate() in get_step(loc, i) + if(input_obj) + if(isturf(input_obj.loc)) + input_plate = input_obj.loc + qdel(input_obj) + break + + if(!input_plate) + CRASH("Didn't find an input plate.") + return + +/obj/machinery/gibber/autogibber/CollidedWith(atom/movable/AM) + if(!input_plate) + return + + if(ismob(AM)) + var/mob/M = AM + + if(M.loc == input_plate) + M.forceMove(src) + M.gib() \ No newline at end of file diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index b5c02946e7..aee52412a6 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -14,11 +14,19 @@ anchored = FALSE use_power = NO_POWER_USE layer = BELOW_OBJ_LAYER + container_type = OPENCONTAINER + max_integrity = 300 var/list/product_types = list() var/dispense_flavour = ICECREAM_VANILLA var/flavour_name = "vanilla" - container_type = OPENCONTAINER - max_integrity = 300 + var/static/list/icecream_vat_reagents = list( + "milk" = 5, + "flour" = 5, + "sugar" = 5, + "ice" = 5, + "cocoa" = 5, + "berryjuice" = 5, + "singulo" = 5) /obj/machinery/icecream_vat/proc/get_ingredient_list(type) switch(type) @@ -52,19 +60,14 @@ return "vanilla" -/obj/machinery/icecream_vat/New() - ..() +/obj/machinery/icecream_vat/Initialize() + . = ..() while(product_types.len < 6) product_types.Add(5) create_reagents() reagents.set_reacting(FALSE) - reagents.add_reagent("milk", 5) - reagents.add_reagent("flour", 5) - reagents.add_reagent("sugar", 5) - reagents.add_reagent("ice", 5) - reagents.add_reagent("cocoa", 5) - reagents.add_reagent("berryjuice", 5) - reagents.add_reagent("singulo", 5) + for(var/reagent in icecream_vat_reagents) + reagents.add_reagent(reagent, icecream_vat_reagents[reagent]) /obj/machinery/icecream_vat/attack_hand(mob/user) user.set_machine(src) diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index d726a106e7..2fb95fd4a6 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -9,6 +9,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 + circuit = /obj/item/weapon/circuitboard/machine/microwave var/operating = FALSE // Is it on? var/dirty = 0 // = {0..100} Does it need cleaning? var/broken = 0 // ={0,1,2} How broken is it??? @@ -21,22 +22,9 @@ * Initialising ********************/ -/obj/machinery/microwave/New() +/obj/machinery/microwave/Initialize() + . = ..() create_reagents(100) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/microwave(null) - B.apply_default_parts(src) - ..() - -/obj/item/weapon/circuitboard/machine/microwave - name = "Microwave (Machine Board)" - build_path = /obj/machinery/microwave - origin_tech = "programming=2;magnets=2" - req_components = list( - /obj/item/weapon/stock_parts/micro_laser = 1, - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/stack/cable_coil = 2, - /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/stack/sheet/glass = 1) /obj/machinery/microwave/RefreshParts() var/E diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index 5b695cfd4b..0a86f155a4 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -9,24 +9,11 @@ use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 50 + circuit = /obj/item/weapon/circuitboard/machine/monkey_recycler var/grinded = 0 var/required_grind = 5 var/cube_production = 1 - -/obj/machinery/monkey_recycler/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/monkey_recycler(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/monkey_recycler - name = "Monkey Recycler (Machine Board)" - build_path = /obj/machinery/monkey_recycler - origin_tech = "programming=1;biotech=2" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/weapon/stock_parts/manipulator = 1) - /obj/machinery/monkey_recycler/RefreshParts() var/req_grind = 5 var/cubes_made = 1 diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 71f8d727fc..018e6cfc79 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -7,44 +7,15 @@ layer = BELOW_OBJ_LAYER density = TRUE anchored = TRUE - var/broken = 0 - var/processing = FALSE use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 50 + circuit = /obj/item/weapon/circuitboard/machine/processor + var/broken = FALSE + var/processing = FALSE var/rating_speed = 1 var/rating_amount = 1 -/obj/machinery/processor/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/processor(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/processor - name = "Food Processor (Machine Board)" - build_path = /obj/machinery/processor - origin_tech = "programming=1" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/weapon/stock_parts/manipulator = 1) - -/obj/item/weapon/circuitboard/machine/processor - name = "Food Processor (Machine Board)" - build_path = /obj/machinery/processor - -/obj/item/weapon/circuitboard/machine/processor/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/screwdriver)) - if(build_path == /obj/machinery/processor) - name = "Slime Processor (Machine Board)" - build_path = /obj/machinery/processor/slime - to_chat(user, "Name protocols successfully updated.") - else - name = "Food Processor (Machine Board)" - build_path = /obj/machinery/processor - to_chat(user, "Defaulting name protocols.") - else - return ..() - /obj/machinery/processor/RefreshParts() for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) rating_amount = B.rating @@ -300,11 +271,7 @@ name = "Slime processor" desc = "An industrial grinder with a sticker saying appropriated for science department. Keep hands clear of intake area while operating." -/obj/machinery/processor/slime/New() - ..() +/obj/machinery/processor/slime/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/processor/slime(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/processor/slime - name = "Slime Processor (Machine Board)" - build_path = /obj/machinery/processor/slime + B.apply_default_parts(src) \ No newline at end of file diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 2cb0631cb2..c1e1aa7b81 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -12,13 +12,14 @@ use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 + circuit = /obj/item/weapon/circuitboard/machine/smartfridge var/max_n_of_items = 1500 var/icon_on = "smartfridge" var/icon_off = "smartfridge-off" var/list/initial_contents /obj/machinery/smartfridge/Initialize() - ..() + . = ..() create_reagents() reagents.set_reacting(FALSE) @@ -30,40 +31,6 @@ for(var/i in 1 to amount) load(new typekey(src)) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/smartfridge(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/smartfridge - name = "Smartfridge (Machine Board)" - build_path = /obj/machinery/smartfridge - origin_tech = "programming=1" - req_components = list(/obj/item/weapon/stock_parts/matter_bin = 1) - var/static/list/fridges = list(/obj/machinery/smartfridge = "plant produce", - /obj/machinery/smartfridge/food = "food", - /obj/machinery/smartfridge/drinks = "drinks", - /obj/machinery/smartfridge/extract = "slimes", - /obj/machinery/smartfridge/chemistry = "chems", - /obj/machinery/smartfridge/chemistry/virology = "viruses", - /obj/machinery/smartfridge/disks = "disks") - -/obj/item/weapon/circuitboard/machine/smartfridge/New(loc, new_type) - if(new_type) - build_path = new_type - ..() - -/obj/item/weapon/circuitboard/machine/smartfridge/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/screwdriver)) - var/position = fridges.Find(build_path, fridges) - position = (position == fridges.len) ? 1 : (position + 1) - build_path = fridges[position] - to_chat(user, "You set the board to [fridges[build_path]].") - else - return ..() - -/obj/item/weapon/circuitboard/machine/smartfridge/examine(mob/user) - ..() - to_chat(user, "[src] is set to [fridges[build_path]]. You can use a screwdriver to reconfigure it.") - /obj/machinery/smartfridge/RefreshParts() for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) max_n_of_items = 1500 * B.rating @@ -255,8 +222,8 @@ icon_off = "drying_rack" var/drying = FALSE -/obj/machinery/smartfridge/drying_rack/New() - ..() +/obj/machinery/smartfridge/drying_rack/Initialize() + . = ..() if(component_parts && component_parts.len) component_parts.Cut() component_parts = null diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index a5c05d4607..eec6634d0d 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -7,6 +7,7 @@ anchored = TRUE use_power = IDLE_POWER_USE idle_power_usage = 40 + circuit = /obj/item/weapon/circuitboard/machine/biogenerator var/processing = FALSE var/obj/item/weapon/reagent_containers/glass/beaker = null var/points = 0 @@ -18,17 +19,13 @@ var/list/show_categories = list("Food", "Botany Chemicals", "Leather and Cloth") var/list/timesFiveCategories = list("Food", "Botany Chemicals") -/obj/machinery/biogenerator/New() - ..() +/obj/machinery/biogenerator/Initialize() + . = ..() files = new /datum/research/biogenerator(src) create_reagents(1000) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/biogenerator(null) - B.apply_default_parts(src) /obj/machinery/biogenerator/Destroy() - if(beaker) - qdel(beaker) - beaker = null + QDEL_NULL(beaker) return ..() /obj/machinery/biogenerator/contents_explosion(severity, target) @@ -43,16 +40,6 @@ update_icon() updateUsrDialog() -/obj/item/weapon/circuitboard/machine/biogenerator - name = "Biogenerator (Machine Board)" - build_path = /obj/machinery/biogenerator - origin_tech = "programming=2;biotech=3;materials=3" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/stack/cable_coil = 1, - /obj/item/weapon/stock_parts/console_screen = 1) - /obj/machinery/biogenerator/RefreshParts() var/E = 0 var/P = 0 diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index eef8b6b27c..6e27e4f922 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -5,6 +5,7 @@ icon_state = "dnamod" density = TRUE anchored = TRUE + circuit = /obj/item/weapon/circuitboard/machine/plantgenes var/obj/item/seeds/seed var/obj/item/weapon/disk/plantgene/disk @@ -22,21 +23,6 @@ var/min_wchance = 67 var/min_wrate = 10 -/obj/machinery/plantgenes/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/plantgenes(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/plantgenes - name = "Plant DNA Manipulator (Machine Board)" - build_path = /obj/machinery/plantgenes - origin_tech = "programming=3;biotech=3" - req_components = list( - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/weapon/stock_parts/micro_laser = 1, - /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/weapon/stock_parts/scanning_module = 1) - /obj/machinery/plantgenes/RefreshParts() // Comments represent the max you can set per tier, respectively. seeds.dm [219] clamps these for us but we don't want to mislead the viewer. for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) if(M.rating > 3) @@ -421,23 +407,9 @@ seed.name = "experimental " + seed.name seed.icon_state = "seed-x" - - // Gene modder for seed vault ship, built with high tech alien parts. -/obj/machinery/plantgenes/seedvault/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/plantgenes/vault(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/plantgenes/vault - name = "alien board (Plant DNA Manipulator)" - icon_state = "abductor_mod" - origin_tech = "programming=5;biotech=5" - // It wasn't made by actual abductors race, so no abductor tech here. - def_components = list( - /obj/item/weapon/stock_parts/manipulator = /obj/item/weapon/stock_parts/manipulator/femto, - /obj/item/weapon/stock_parts/micro_laser = /obj/item/weapon/stock_parts/micro_laser/quadultra, - /obj/item/weapon/stock_parts/scanning_module = /obj/item/weapon/stock_parts/scanning_module/triphasic) +/obj/machinery/plantgenes/seedvault + circuit = /obj/item/weapon/circuitboard/machine/plantgenes/vault /* * Plant DNA disk diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 499fc4bd64..e05110657f 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -6,6 +6,7 @@ anchored = TRUE pixel_y = 8 unique_rename = 1 + circuit = /obj/item/weapon/circuitboard/machine/hydroponics var/waterlevel = 100 //The amount of water in the tray (max 100) var/maxwater = 100 //The maximum amount of water in the tray var/nutrilevel = 10 //The amount of nutrient in the tray (max 10) @@ -37,20 +38,6 @@ icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "hydrotray3" -/obj/machinery/hydroponics/constructable/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/hydroponics(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/hydroponics - name = "Hydroponics Tray (Machine Board)" - build_path = /obj/machinery/hydroponics/constructable - origin_tech = "programming=1;biotech=2" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 2, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/weapon/stock_parts/console_screen = 1) - /obj/machinery/hydroponics/constructable/RefreshParts() var/tmp_capacity = 0 for (var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm index 65fa87c658..ce067ed584 100644 --- a/code/modules/hydroponics/seed_extractor.dm +++ b/code/modules/hydroponics/seed_extractor.dm @@ -44,23 +44,11 @@ icon_state = "sextractor" density = TRUE anchored = TRUE + circuit = /obj/item/weapon/circuitboard/machine/seed_extractor var/piles = list() var/max_seeds = 1000 var/seed_multiplier = 1 -/obj/machinery/seed_extractor/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/seed_extractor(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/seed_extractor - name = "Seed Extractor (Machine Board)" - build_path = /obj/machinery/seed_extractor - origin_tech = "programming=1" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/weapon/stock_parts/manipulator = 1) - /obj/machinery/seed_extractor/RefreshParts() for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) max_seeds = 1000 * B.rating diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index c38c08ca0b..5c94ae750e 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -193,8 +193,8 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums libcomp_menu[page] = "" libcomp_menu[page] += "[C.author][C.title][C.category]\[Order\]\n" -/obj/machinery/computer/libraryconsole/bookmanagement/New() - ..() +/obj/machinery/computer/libraryconsole/bookmanagement/Initialize() + . = ..() if(circuit) circuit.name = "Book Inventory Management Console (Machine Board)" circuit.build_path = /obj/machinery/computer/libraryconsole/bookmanagement diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index 90248bce2e..308f8743bc 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -26,10 +26,9 @@ interface with the mining shuttle at the landing site if a mobile beacon is also var/obj/item/device/gps/internal/base/locator circuit = /obj/item/weapon/circuitboard/computer/auxillary_base -/obj/machinery/computer/auxillary_base/New(location, obj/item/weapon/circuitboard/computer/shuttle/C) - ..() - locator = new /obj/item/device/gps/internal/base(src) - +/obj/machinery/computer/auxillary_base/Initialize() + . = ..() + locator = new(src) /obj/machinery/computer/auxillary_base/attack_hand(mob/user) if(..(user)) diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index 62702fc202..b64c6b9989 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -49,9 +49,9 @@ light_color = LIGHT_COLOR_PINK -/obj/machinery/computer/camera_advanced/base_construction/New() - ..() - RCD = new /obj/item/weapon/construction/rcd/internal(src) +/obj/machinery/computer/camera_advanced/base_construction/Initialize() + . = ..() + RCD = new(src) /obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload) ..() diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 96c7cbf6fe..981b97940c 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -199,18 +199,9 @@ max_n_of_items = 10 pixel_y = -4 flags = NODECONSTRUCT + var/empty = FALSE -/obj/machinery/smartfridge/survival_pod/empty - name = "dusty survival pod storage" - desc = "A heated storage unit. This one's seen better days." - -/obj/machinery/smartfridge/survival_pod/empty/Initialize(mapload) - ..(mapload, TRUE) - -/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O) - return isitem(O) - -/obj/machinery/smartfridge/survival_pod/Initialize(mapload, empty) +/obj/machinery/smartfridge/survival_pod/Initialize(mapload) . = ..() if(empty) return @@ -224,6 +215,14 @@ var/obj/item/device/instrument/guitar/G = new(src) load(G) +/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O) + return isitem(O) + +/obj/machinery/smartfridge/survival_pod/empty + name = "dusty survival pod storage" + desc = "A heated storage unit. This one's seen better days." + empty = TRUE + //Fans /obj/structure/fans icon = 'icons/obj/lavaland/survival_pod.dmi' diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index e9961d7b3b..4332343a9b 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -15,11 +15,11 @@ var/obj/item/device/radio/Radio //needed to send messages to sec radio -/obj/machinery/mineral/labor_claim_console/New() - ..() +/obj/machinery/mineral/labor_claim_console/Initialize() + . = ..() Radio = new/obj/item/device/radio(src) - Radio.listening = 0 - addtimer(CALLBACK(src, .proc/locate_stacking_machine), 7) + Radio.listening = FALSE + locate_stacking_machine() /obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/card/id/prisoner)) diff --git a/code/modules/mining/machine_input_output_plates.dm b/code/modules/mining/machine_input_output_plates.dm index 79a514bcc2..b6f68d4c89 100644 --- a/code/modules/mining/machine_input_output_plates.dm +++ b/code/modules/mining/machine_input_output_plates.dm @@ -7,7 +7,8 @@ density = FALSE anchored = TRUE -/obj/machinery/mineral/input/New() +/obj/machinery/mineral/input/Initialize() + . = ..() icon_state = "blank" /obj/machinery/mineral/output @@ -17,7 +18,8 @@ density = FALSE anchored = TRUE -/obj/machinery/mineral/output/New() +/obj/machinery/mineral/output/Initialize() + . = ..() icon_state = "blank" /obj/machinery/mineral diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 0232da4e83..e8d24e223f 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -11,6 +11,8 @@ input_dir = NORTH output_dir = SOUTH req_access = list(ACCESS_MINERAL_STOREROOM) + speed_process = 1 + circuit = /obj/item/weapon/circuitboard/machine/ore_redemption var/req_access_reclaim = ACCESS_MINING_STATION var/obj/item/weapon/card/id/inserted_id var/points = 0 @@ -18,7 +20,6 @@ var/sheet_per_ore = 1 var/point_upgrade = 1 var/list/ore_values = list(MAT_GLASS = 1, MAT_METAL = 1, MAT_PLASMA = 15, MAT_SILVER = 16, MAT_GOLD = 18, MAT_TITANIUM = 30, MAT_URANIUM = 30, MAT_DIAMOND = 50, MAT_BLUESPACE = 50, MAT_BANANIUM = 60) - speed_process = 1 var/message_sent = FALSE var/list/ore_buffer = list() var/datum/material_container/materials @@ -27,8 +28,6 @@ /obj/machinery/mineral/ore_redemption/Initialize() . = ..() - var/obj/item/weapon/circuitboard/machine/ore_redemption/B = new - B.apply_default_parts(src) materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),INFINITY) files = new /datum/research/smelter(src) @@ -37,17 +36,6 @@ QDEL_NULL(files) return ..() -/obj/item/weapon/circuitboard/machine/ore_redemption - name = "Ore Redemption (Machine Board)" - build_path = /obj/machinery/mineral/ore_redemption - origin_tech = "programming=1;engineering=2" - req_components = list( - /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/weapon/stock_parts/micro_laser = 1, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/device/assembly/igniter = 1) - /obj/machinery/mineral/ore_redemption/RefreshParts() var/ore_pickup_rate_temp = 15 var/point_upgrade_temp = 1 diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 875380aea8..80965d3cfc 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -7,6 +7,7 @@ icon_state = "mining" density = TRUE anchored = TRUE + circuit = /obj/item/weapon/circuitboard/machine/mining_equipment_vendor var/obj/item/weapon/card/id/inserted_id var/list/prize_list = list( //if you add something to this, please, for the love of god, use tabs and not spaces. new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), @@ -67,19 +68,6 @@ src.equipment_path = path src.cost = cost -/obj/machinery/mineral/equipment_vendor/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/mining_equipment_vendor - name = "Mining Equipment Vendor (Machine Board)" - build_path = /obj/machinery/mineral/equipment_vendor - origin_tech = "programming=1;engineering=3" - req_components = list( - /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/weapon/stock_parts/matter_bin = 3) - /obj/machinery/mineral/equipment_vendor/power_change() ..() update_icon() @@ -207,9 +195,10 @@ /obj/machinery/mineral/equipment_vendor/golem name = "golem ship equipment vendor" + circuit = /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem -/obj/machinery/mineral/equipment_vendor/golem/New() - ..() +/obj/machinery/mineral/equipment_vendor/golem/Initialize() + . = ..() desc += "\nIt seems a few selections have been added." prize_list += list( new /datum/data/mining_equipment("Extra Id", /obj/item/weapon/card/id/mining, 250), @@ -223,14 +212,6 @@ new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/weapon/bedsheet/rd/royal_cape, 500) ) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/mining_equipment_vendor/golem - name = "Golem Ship Equipment Vendor (Machine Board)" - build_path = /obj/machinery/mineral/equipment_vendor/golem - - /**********************Mining Equipment Vendor Items**************************/ /**********************Mining Equipment Voucher**********************/ diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index 9a4eae0a41..0ee136f4a9 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -15,18 +15,16 @@ speed_process = 1 -/obj/machinery/mineral/mint/New() - ..() +/obj/machinery/mineral/mint/Initialize() + . = ..() materials = new /datum/material_container(src, list(MAT_METAL, MAT_PLASMA, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_DIAMOND, MAT_BANANIUM), max_amt = MINERAL_MATERIAL_AMOUNT*50) /obj/machinery/mineral/mint/Destroy() - qdel(materials) - materials = null + QDEL_NULL(materials) return ..() - /obj/machinery/mineral/mint/process() var/turf/T = get_step(src, input_dir) if(!T) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 6cebdd9500..7be59e1322 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -262,14 +262,14 @@ Difficulty: Very Hard return FALSE return TRUE -/obj/machinery/smartfridge/black_box/New() +/obj/machinery/smartfridge/black_box/Initialize() + . = ..() var/static/obj/machinery/smartfridge/black_box/current if(current && current != src) qdel(src, force=TRUE) return current = src ReadMemory() - . = ..() /obj/machinery/smartfridge/black_box/process() ..() diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index 18b96d033e..3b1d2c03fb 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -9,6 +9,7 @@ icon_state = "bus" anchored = TRUE density = TRUE + circuit = /obj/item/weapon/circuitboard/machine/ntnet_relay var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame. var/enabled = 1 // Set to 0 if the relay was turned off var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack @@ -95,18 +96,16 @@ /obj/machinery/ntnet_relay/attack_hand(mob/living/user) ui_interact(user) -/obj/machinery/ntnet_relay/New() +/obj/machinery/ntnet_relay/Initialize() uid = gl_uid gl_uid++ component_parts = list() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/ntnet_relay(null) - B.apply_default_parts(src) if(GLOB.ntnet_global) GLOB.ntnet_global.relays.Add(src) NTNet = GLOB.ntnet_global GLOB.ntnet_global.add_log("New quantum relay activated. Current amount of linked relays: [NTNet.relays.len]") - ..() + . = ..() /obj/machinery/ntnet_relay/Destroy() if(GLOB.ntnet_global) @@ -118,12 +117,4 @@ D.target = null D.error = "Connection to quantum relay severed" - return ..() - -/obj/item/weapon/circuitboard/machine/ntnet_relay - name = "NTNet Relay (Machine Board)" - build_path = /obj/machinery/ntnet_relay - origin_tech = "programming=3;bluespace=3;magnets=2" - req_components = list( - /obj/item/stack/cable_coil = 2, - /obj/item/weapon/stock_parts/subspace/filter = 1) + return ..() \ No newline at end of file diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 3fcec8b3bf..d12dcc3623 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -29,8 +29,8 @@ var/stored_power = 0//Power to deploy per tick -/obj/machinery/power/am_control_unit/New() - ..() +/obj/machinery/power/am_control_unit/Initialize() + . = ..() linked_shielding = list() linked_cores = list() @@ -39,8 +39,7 @@ for(var/obj/machinery/am_shielding/AMS in linked_shielding) AMS.control_unit = null qdel(AMS) - qdel(fueljar) - fueljar = null + QDEL_NULL(fueljar) return ..() diff --git a/code/modules/power/monitor.dm b/code/modules/power/monitor.dm index 8437738586..ee613108d6 100644 --- a/code/modules/power/monitor.dm +++ b/code/modules/power/monitor.dm @@ -16,8 +16,8 @@ var/record_interval = 50 var/next_record = 0 -/obj/machinery/computer/monitor/New() - ..() +/obj/machinery/computer/monitor/Initialize() + . = ..() search() history["supply"] = list() history["demand"] = list() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index c5fcc2b018..0dec9eaf09 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -54,11 +54,11 @@ /obj/machinery/power/port_gen/pacman name = "\improper P.A.C.M.A.N.-type portable generator" + circuit = /obj/item/weapon/circuitboard/machine/pacman var/sheets = 0 var/max_sheets = 100 var/sheet_name = "" var/sheet_path = /obj/item/stack/sheet/mineral/plasma - var/board_path = /obj/item/weapon/circuitboard/machine/pacman var/sheet_left = 0 // How much is left of the sheet var/time_per_sheet = 260 var/current_heat = 0 @@ -68,34 +68,12 @@ if(anchored) connect_to_network() -/obj/machinery/power/port_gen/pacman/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new board_path(null) - B.apply_default_parts(src) +/obj/machinery/power/port_gen/pacman/Initialize() + . = ..() var/obj/sheet = new sheet_path(null) sheet_name = sheet.name -/obj/item/weapon/circuitboard/machine/pacman - name = "PACMAN-type Generator (Machine Board)" - build_path = /obj/machinery/power/port_gen/pacman - origin_tech = "programming=2;powerstorage=3;plasmatech=3;engineering=3" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/weapon/stock_parts/micro_laser = 1, - /obj/item/stack/cable_coil = 2, - /obj/item/weapon/stock_parts/capacitor = 1) - -/obj/item/weapon/circuitboard/machine/pacman/super - name = "SUPERPACMAN-type Generator (Machine Board)" - build_path = /obj/machinery/power/port_gen/pacman/super - origin_tech = "programming=3;powerstorage=4;engineering=4" - -/obj/item/weapon/circuitboard/machine/pacman/mrs - name = "MRSPACMAN-type Generator (Machine Board)" - build_path = "/obj/machinery/power/port_gen/pacman/mrs" - origin_tech = "programming=3;powerstorage=4;engineering=4;plasmatech=4" - /obj/machinery/power/port_gen/pacman/Destroy() DropFuel() return ..() @@ -294,10 +272,10 @@ name = "\improper S.U.P.E.R.P.A.C.M.A.N.-type portable generator" icon_state = "portgen1_0" base_icon = "portgen1" + circuit = /obj/item/weapon/circuitboard/machine/pacman/super sheet_path = /obj/item/stack/sheet/mineral/uranium power_gen = 15000 time_per_sheet = 85 - board_path = /obj/item/weapon/circuitboard/machine/pacman/super /obj/machinery/power/port_gen/pacman/super/overheat() explosion(src.loc, 3, 3, 3, -1) @@ -306,10 +284,10 @@ name = "\improper M.R.S.P.A.C.M.A.N.-type portable generator" base_icon = "portgen2" icon_state = "portgen2_0" + circuit = /obj/item/weapon/circuitboard/machine/pacman/mrs sheet_path = /obj/item/stack/sheet/mineral/diamond power_gen = 40000 time_per_sheet = 80 - board_path = /obj/item/weapon/circuitboard/machine/pacman/mrs /obj/machinery/power/port_gen/pacman/mrs/overheat() explosion(src.loc, 4, 4, 4, -1) diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 9ec0e46da1..84fa86c180 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -9,6 +9,7 @@ density = TRUE anchored = TRUE use_power = NO_POWER_USE + circuit = /obj/item/weapon/circuitboard/machine/rtg // You can buckle someone to RTG, then open its panel. Fun stuff. can_buckle = TRUE @@ -16,23 +17,9 @@ buckle_requires_restraints = TRUE var/power_gen = 1000 // Enough to power a single APC. 4000 output with T4 capacitor. - var/board_path = /obj/item/weapon/circuitboard/machine/rtg + var/irradiate = TRUE // RTGs irradiate surroundings, but only when panel is open. -/obj/machinery/power/rtg/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new board_path(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/rtg - name = "RTG (Machine Board)" - build_path = /obj/machinery/power/rtg - origin_tech = "programming=2;materials=4;powerstorage=3;engineering=2" - req_components = list( - /obj/item/stack/cable_coil = 5, - /obj/item/weapon/stock_parts/capacitor = 1, - /obj/item/stack/sheet/mineral/uranium = 10) // We have no Pu-238, and this is the closest thing to it. - /obj/machinery/power/rtg/Initialize() . = ..() connect_to_network() @@ -68,20 +55,7 @@ /obj/machinery/power/rtg/advanced desc = "An advanced RTG capable of moderating isotope decay, increasing power output but reducing lifetime. It uses plasma-fueled radiation collectors to increase output even further." power_gen = 1250 // 2500 on T1, 10000 on T4. - board_path = /obj/item/weapon/circuitboard/machine/rtg/advanced - -/obj/item/weapon/circuitboard/machine/rtg/advanced - name = "Advanced RTG (Machine Board)" - build_path = /obj/machinery/power/rtg/advanced - origin_tech = "programming=3;materials=5;powerstorage=4;engineering=3;plasmatech=3" - req_components = list( - /obj/item/stack/cable_coil = 5, - /obj/item/weapon/stock_parts/capacitor = 1, - /obj/item/weapon/stock_parts/micro_laser = 1, - /obj/item/stack/sheet/mineral/uranium = 10, - /obj/item/stack/sheet/mineral/plasma = 5) - - + circuit = /obj/item/weapon/circuitboard/machine/rtg/advanced // Void Core, power source for Abductor ships and bases. // Provides a lot of power, but tends to explode when mistreated. @@ -91,25 +65,13 @@ icon = 'icons/obj/abductor.dmi' icon_state = "core" desc = "An alien power source that produces energy seemingly out of nowhere." - board_path = /obj/item/weapon/circuitboard/machine/abductor/core + circuit = /obj/item/weapon/circuitboard/machine/abductor/core power_gen = 20000 // 280 000 at T1, 400 000 at T4. Starts at T4. irradiate = FALSE // Green energy! can_buckle = FALSE pixel_y = 7 var/going_kaboom = FALSE // Is it about to explode? -/obj/item/weapon/circuitboard/machine/abductor/core - name = "alien board (Void Core)" - build_path = /obj/machinery/power/rtg/abductor - origin_tech = "programming=5;abductor=5;powerstorage=8;engineering=8" - req_components = list( - /obj/item/weapon/stock_parts/capacitor = 1, - /obj/item/weapon/stock_parts/micro_laser = 1, - /obj/item/weapon/stock_parts/cell/infinite/abductor = 1) - def_components = list( - /obj/item/weapon/stock_parts/capacitor = /obj/item/weapon/stock_parts/capacitor/quadratic, - /obj/item/weapon/stock_parts/micro_laser = /obj/item/weapon/stock_parts/micro_laser/quadultra) - /obj/machinery/power/rtg/abductor/proc/overload() if(going_kaboom) return diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 5c01b60416..28ffb52db4 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -21,8 +21,8 @@ GLOBAL_LIST_EMPTY(rad_collectors) /obj/machinery/power/rad_collector/anchored anchored = TRUE -/obj/machinery/power/rad_collector/New() - ..() +/obj/machinery/power/rad_collector/Initialize() + . = ..() GLOB.rad_collectors += src /obj/machinery/power/rad_collector/Destroy() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 6e4942807f..1e4baee4be 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -3,20 +3,17 @@ desc = "A heavy-duty industrial laser, often used in containment fields and power generation.\nAlt-click to rotate it clockwise." icon = 'icons/obj/singularity.dmi' icon_state = "emitter" - var/icon_state_on = "emitter_+a" + anchored = FALSE density = TRUE req_access = list(ACCESS_ENGINE_EQUIP) - - // The following 3 vars are mostly for the prototype - var/manual = FALSE - var/charge = 0 - var/atom/target = null + circuit = /obj/item/weapon/circuitboard/machine/emitter use_power = NO_POWER_USE idle_power_usage = 10 active_power_usage = 300 + var/icon_state_on = "emitter_+a" var/active = 0 var/powered = 0 var/fire_delay = 100 @@ -33,6 +30,11 @@ var/datum/effect_system/spark_spread/sparks + // The following 3 vars are mostly for the prototype + var/manual = FALSE + var/charge = 0 + var/atom/target + /obj/machinery/power/emitter/anchored anchored = TRUE @@ -46,20 +48,16 @@ state = 2 use_power = FALSE -/obj/machinery/power/emitter/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/emitter(null) - B.apply_default_parts(src) +/obj/machinery/power/emitter/Initialize() + . = ..() RefreshParts() wires = new /datum/wires/emitter(src) + if(state == 2 && anchored) + connect_to_network() -/obj/item/weapon/circuitboard/machine/emitter - name = "Emitter (Machine Board)" - build_path = /obj/machinery/power/emitter - origin_tech = "programming=3;powerstorage=4;engineering=4" - req_components = list( - /obj/item/weapon/stock_parts/micro_laser = 1, - /obj/item/weapon/stock_parts/manipulator = 1) + sparks = new + sparks.attach(src) + sparks.set_up(5, TRUE, src) /obj/machinery/power/emitter/RefreshParts() var/max_firedelay = 120 @@ -100,15 +98,6 @@ else rotate() -/obj/machinery/power/emitter/Initialize() - . = ..() - if(state == 2 && anchored) - connect_to_network() - - sparks = new - sparks.attach(src) - sparks.set_up(5, TRUE, src) - /obj/machinery/power/emitter/Destroy() if(SSticker.IsRoundInProgress()) var/turf/T = get_turf(src) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index af62860218..90566dffda 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -49,8 +49,8 @@ field_generator power level display add_overlay("+p[power_level]") -/obj/machinery/field/generator/New() - ..() +/obj/machinery/field/generator/Initialize() + . = ..() fields = list() connected_gens = list() diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 697a80d7cd..b8b26e9447 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -19,10 +19,10 @@ var/powered = 0 mouse_opacity = 2 -/obj/machinery/particle_accelerator/control_box/New() +/obj/machinery/particle_accelerator/control_box/Initialize() + . = ..() wires = new /datum/wires/particle_accelerator/control_box(src) connected_parts = list() - ..() /obj/machinery/particle_accelerator/control_box/Destroy() if(active) @@ -31,8 +31,7 @@ var/obj/structure/particle_accelerator/part = CP part.master = null connected_parts.Cut() - qdel(wires) - wires = null + QDEL_NULL(wires) return ..() /obj/machinery/particle_accelerator/control_box/attack_hand(mob/user) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 50f01f4259..452a793bd6 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -21,6 +21,7 @@ density = TRUE anchored = TRUE use_power = NO_POWER_USE + circuit = /obj/item/weapon/circuitboard/machine/smes var/capacity = 5e6 // maximum charge var/charge = 0 // actual charge @@ -43,36 +44,21 @@ if(!terminal) to_chat(user, "This SMES has no power terminal!") -/obj/machinery/power/smes/New() +/obj/machinery/power/smes/Initialize() ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/smes(null) - B.apply_default_parts(src) - - spawn(5) - dir_loop: - for(var/d in GLOB.cardinals) - var/turf/T = get_step(src, d) - for(var/obj/machinery/power/terminal/term in T) - if(term && term.dir == turn(d, 180)) - terminal = term - break dir_loop + dir_loop: + for(var/d in GLOB.cardinals) + var/turf/T = get_step(src, d) + for(var/obj/machinery/power/terminal/term in T) + if(term && term.dir == turn(d, 180)) + terminal = term + break dir_loop if(!terminal) stat |= BROKEN return terminal.master = src update_icon() - return - -/obj/item/weapon/circuitboard/machine/smes - name = "SMES (Machine Board)" - build_path = /obj/machinery/power/smes - origin_tech = "programming=3;powerstorage=3;engineering=3" - req_components = list( - /obj/item/stack/cable_coil = 5, - /obj/item/weapon/stock_parts/cell = 5, - /obj/item/weapon/stock_parts/capacitor = 1) - def_components = list(/obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high/empty) /obj/machinery/power/smes/RefreshParts() var/IO = 0 diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index b00bcb0c28..1d795b3307 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -13,15 +13,16 @@ layer = WIRE_TERMINAL_LAYER //a bit above wires -/obj/machinery/power/terminal/New() - ..() - var/turf/T = src.loc - if(level==1) hide(T.intact) - return +/obj/machinery/power/terminal/Initialize() + . = ..() + var/turf/T = get_turf(src) + if(level == 1) + hide(T.intact) /obj/machinery/power/terminal/Destroy() if(master) master.disconnect_terminal() + master = null return ..() /obj/machinery/power/terminal/hide(i) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index ee135b13b5..01e8e18659 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -11,23 +11,17 @@ buckle_lying = FALSE buckle_requires_restraints = TRUE + circuit = /obj/item/weapon/circuitboard/machine/tesla_coil + var/power_loss = 2 var/input_power_multiplier = 1 var/zap_cooldown = 100 var/last_zap = 0 -/obj/machinery/power/tesla_coil/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/tesla_coil(null) - B.apply_default_parts(src) +/obj/machinery/power/tesla_coil/Initialize() + . = ..() wires = new /datum/wires/tesla_coil(src) -/obj/item/weapon/circuitboard/machine/tesla_coil - name = "Tesla Coil (Machine Board)" - build_path = /obj/machinery/power/tesla_coil - origin_tech = "programming=3;magnets=3;powerstorage=3" - req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) - /obj/machinery/power/tesla_coil/RefreshParts() var/power_multiplier = 0 zap_cooldown = 100 @@ -109,16 +103,7 @@ buckle_lying = FALSE buckle_requires_restraints = TRUE -/obj/machinery/power/grounding_rod/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/grounding_rod(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/grounding_rod - name = "Grounding Rod (Machine Board)" - build_path = /obj/machinery/power/grounding_rod - origin_tech = "programming=3;powerstorage=3;magnets=3;plasmatech=2" - req_components = list(/obj/item/weapon/stock_parts/capacitor = 1) + circuit = /obj/item/weapon/circuitboard/machine/grounding_rod /obj/machinery/power/grounding_rod/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) . = ..() diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index a7e304e364..e11b0a3b34 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -18,8 +18,8 @@ var/sun_angle = 0 // sun angle as set by sun datum var/obj/machinery/power/solar_control/control = null -/obj/machinery/power/tracker/New(var/turf/loc, var/obj/item/solar_assembly/S) - ..(loc) +/obj/machinery/power/tracker/Initialize(mapload, obj/item/solar_assembly/S) + . = ..() Make(S) connect_to_network() diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index ea4dfd95db..ed7c6824eb 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -31,6 +31,7 @@ density = TRUE resistance_flags = FIRE_PROOF CanAtmosPass = ATMOS_PASS_DENSITY + circuit = /obj/item/weapon/circuitboard/machine/power_compressor var/obj/machinery/power/turbine/turbine var/datum/gas_mixture/gas_contained var/turf/inturf @@ -51,6 +52,7 @@ density = TRUE resistance_flags = FIRE_PROOF CanAtmosPass = ATMOS_PASS_DENSITY + circuit = /obj/item/weapon/circuitboard/machine/power_turbine var/opened = 0 var/obj/machinery/power/compressor/compressor var/turf/outturf @@ -68,25 +70,12 @@ // the inlet stage of the gas turbine electricity generator -/obj/machinery/power/compressor/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/power_compressor(null) - B.apply_default_parts(src) -// The inlet of the compressor is the direction it faces - +/obj/machinery/power/compressor/Initialize() + . = ..() + // The inlet of the compressor is the direction it faces gas_contained = new inturf = get_step(src, dir) -/obj/item/weapon/circuitboard/machine/power_compressor - name = "Power Compressor (Machine Board)" - build_path = /obj/machinery/power/compressor - origin_tech = "programming=4;powerstorage=4;engineering=4" - req_components = list( - /obj/item/stack/cable_coil = 5, - /obj/item/weapon/stock_parts/manipulator = 6) - -/obj/machinery/power/compressor/Initialize() - . = ..() locate_machinery() if(!turbine) stat |= BROKEN @@ -186,23 +175,10 @@ #define TURBGENQ 100000 #define TURBGENG 0.5 -/obj/machinery/power/turbine/New() - ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/power_turbine(null) - B.apply_default_parts(src) -// The outlet is pointed at the direction of the turbine component - outturf = get_step(src, dir) - -/obj/item/weapon/circuitboard/machine/power_turbine - name = "Power Turbine (Machine Board)" - build_path = /obj/machinery/power/turbine - origin_tech = "programming=4;powerstorage=4;engineering=4" - req_components = list( - /obj/item/stack/cable_coil = 5, - /obj/item/weapon/stock_parts/capacitor = 6) - /obj/machinery/power/turbine/Initialize() . = ..() +// The outlet is pointed at the direction of the turbine component + outturf = get_step(src, dir) locate_machinery() if(!compressor) stat |= BROKEN diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 27cad406fa..8cf7333c6e 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -221,6 +221,7 @@ amount = 5 recharge_delay = 30 dispensable_reagents = list() + circuit = /obj/item/weapon/circuitboard/machine/chem_dispenser var/list/dispensable_reagent_tiers = list( list( "hydrogen", @@ -264,23 +265,6 @@ ) ) -/obj/machinery/chem_dispenser/constructable/Initialize() - . = ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_dispenser(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/chem_dispenser - name = "Portable Chem Dispenser (Machine Board)" - build_path = /obj/machinery/chem_dispenser/constructable - origin_tech = "materials=4;programming=4;plasmatech=4;biotech=3" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 2, - /obj/item/weapon/stock_parts/capacitor = 1, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/weapon/stock_parts/cell = 1) - def_components = list(/obj/item/weapon/stock_parts/cell = /obj/item/weapon/stock_parts/cell/high) - /obj/machinery/chem_dispenser/constructable/RefreshParts() var/time = 0 var/i diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 3d1c2b4a9c..b43841c43b 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -7,24 +7,12 @@ use_power = IDLE_POWER_USE idle_power_usage = 40 resistance_flags = FIRE_PROOF | ACID_PROOF + circuit = /obj/item/weapon/circuitboard/machine/chem_heater var/obj/item/weapon/reagent_containers/beaker = null var/target_temperature = 300 var/heater_coefficient = 0.10 var/on = FALSE -/obj/machinery/chem_heater/Initialize() - . = ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_heater(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/chem_heater - name = "Chemical Heater (Machine Board)" - build_path = /obj/machinery/chem_heater - origin_tech = "programming=2;engineering=2;biotech=2" - req_components = list( - /obj/item/weapon/stock_parts/micro_laser = 1, - /obj/item/weapon/stock_parts/console_screen = 1) - /obj/machinery/chem_heater/RefreshParts() heater_coefficient = 0.10 for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index d902ed7b13..c0d5fef9cc 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -3,11 +3,13 @@ desc = "Used to separate chemicals and distribute them in a variety of forms." density = TRUE anchored = TRUE + layer = BELOW_OBJ_LAYER icon = 'icons/obj/chemical.dmi' icon_state = "mixer0" use_power = IDLE_POWER_USE idle_power_usage = 20 resistance_flags = FIRE_PROOF | ACID_PROOF + circuit = /obj/item/weapon/circuitboard/machine/chem_master var/obj/item/weapon/reagent_containers/beaker = null var/obj/item/weapon/storage/pill_bottle/bottle = null var/mode = 1 @@ -15,39 +17,12 @@ var/screen = "home" var/analyzeVars[0] var/useramount = 30 // Last used amount - layer = BELOW_OBJ_LAYER /obj/machinery/chem_master/Initialize() create_reagents(100) add_overlay("waitlight") - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_master(null) - B.apply_default_parts(src) . = ..() -/obj/item/weapon/circuitboard/machine/chem_master - name = "ChemMaster 3000 (Machine Board)" - build_path = /obj/machinery/chem_master - origin_tech = "materials=3;programming=2;biotech=3" - req_components = list( - /obj/item/weapon/reagent_containers/glass/beaker = 2, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/weapon/stock_parts/console_screen = 1) - -/obj/item/weapon/circuitboard/machine/chem_master/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/screwdriver)) - var/new_name = "ChemMaster" - var/new_path = /obj/machinery/chem_master - - if(build_path == /obj/machinery/chem_master) - new_name = "CondiMaster" - new_path = /obj/machinery/chem_master/condimaster - - build_path = new_path - name = "[new_name] 3000 (Machine Board)" - to_chat(user, "You change the circuit board setting to \"[new_name]\".") - else - return ..() - /obj/machinery/chem_master/RefreshParts() reagents.maximum_volume = 0 for(var/obj/item/weapon/reagent_containers/glass/beaker/B in component_parts) @@ -360,7 +335,3 @@ name = "CondiMaster 3000" desc = "Used to create condiments and other cooking supplies." condi = 1 - -/obj/item/weapon/circuitboard/machine/chem_master/condi - name = "CondiMaster 3000 (Machine Board)" - build_path = /obj/machinery/chem_master/condimaster diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 132ebdf8fd..c3e1bd2c98 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -9,6 +9,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). desc = "Manufactures circuit boards for the construction of machines." icon_state = "circuit_imprinter" container_type = OPENCONTAINER + circuit = /obj/item/weapon/circuitboard/machine/circuit_imprinter var/datum/material_container/materials var/efficiency_coeff @@ -28,24 +29,13 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). ) /obj/machinery/r_n_d/circuit_imprinter/Initialize() - . = ..() materials = new(src, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE)) create_reagents(0) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/circuit_imprinter(null) - B.apply_default_parts(src) - -/obj/machinery/r_n_d/circuit_imprinter/Destroy() - qdel(materials) return ..() -/obj/item/weapon/circuitboard/machine/circuit_imprinter - name = "Circuit Imprinter (Machine Board)" - build_path = /obj/machinery/r_n_d/circuit_imprinter - origin_tech = "engineering=2;programming=2" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 1, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/weapon/reagent_containers/glass/beaker = 2) +/obj/machinery/r_n_d/circuit_imprinter/Destroy() + QDEL_NULL(materials) + return ..() /obj/machinery/r_n_d/circuit_imprinter/RefreshParts() reagents.maximum_volume = 0 diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 71b9780c58..c6f2463b74 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -11,22 +11,9 @@ Note: Must be placed within 3 tiles of the R&D Console name = "destructive analyzer" desc = "Learn science by destroying things!" icon_state = "d_analyzer" + circuit = /obj/item/weapon/circuitboard/machine/destructive_analyzer var/decon_mod = 0 -/obj/machinery/r_n_d/destructive_analyzer/Initialize() - . = ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/destructive_analyzer(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/destructive_analyzer - name = "Destructive Analyzer (Machine Board)" - build_path = /obj/machinery/r_n_d/destructive_analyzer - origin_tech = "magnets=2;engineering=2;programming=2" - req_components = list( - /obj/item/weapon/stock_parts/scanning_module = 1, - /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/weapon/stock_parts/micro_laser = 1) - /obj/machinery/r_n_d/destructive_analyzer/RefreshParts() var/T = 0 for(var/obj/item/weapon/stock_parts/S in component_parts) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 7e7b4c2b5b..fa1c59bfd6 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -25,6 +25,7 @@ density = TRUE anchored = TRUE use_power = IDLE_POWER_USE + circuit = /obj/item/weapon/circuitboard/machine/experimentor var/recentlyExperimented = 0 var/mob/trackedIan var/mob/trackedRuntime @@ -84,22 +85,11 @@ /obj/machinery/r_n_d/experimentor/Initialize() . = ..() - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/experimentor(null) - B.apply_default_parts(src) trackedIan = locate(/mob/living/simple_animal/pet/dog/corgi/Ian) in GLOB.mob_list trackedRuntime = locate(/mob/living/simple_animal/pet/cat/Runtime) in GLOB.mob_list SetTypeReactions() -/obj/item/weapon/circuitboard/machine/experimentor - name = "E.X.P.E.R.I-MENTOR (Machine Board)" - build_path = /obj/machinery/r_n_d/experimentor - origin_tech = "magnets=1;engineering=1;programming=1;biotech=1;bluespace=2" - req_components = list( - /obj/item/weapon/stock_parts/scanning_module = 1, - /obj/item/weapon/stock_parts/manipulator = 2, - /obj/item/weapon/stock_parts/micro_laser = 2) - /obj/machinery/r_n_d/experimentor/RefreshParts() for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) if(resetTime > 0 && (resetTime - M.rating) >= 1) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 84432e8e44..2691286771 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -12,6 +12,7 @@ Note: Must be placed west/left of and R&D console to function. desc = "Converts raw materials into useful objects." icon_state = "protolathe" container_type = OPENCONTAINER + circuit = /obj/item/weapon/circuitboard/machine/protolathe var/datum/material_container/materials var/efficiency_coeff @@ -32,23 +33,12 @@ Note: Must be placed west/left of and R&D console to function. /obj/machinery/r_n_d/protolathe/Initialize() - . = ..() create_reagents(0) materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE)) - var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/protolathe(null) - B.apply_default_parts(src) - -/obj/item/weapon/circuitboard/machine/protolathe - name = "Protolathe (Machine Board)" - build_path = /obj/machinery/r_n_d/protolathe - origin_tech = "engineering=2;programming=2" - req_components = list( - /obj/item/weapon/stock_parts/matter_bin = 2, - /obj/item/weapon/stock_parts/manipulator = 2, - /obj/item/weapon/reagent_containers/glass/beaker = 2) + return ..() /obj/machinery/r_n_d/protolathe/Destroy() - qdel(materials) + QDEL_NULL(materials) return ..() /obj/machinery/r_n_d/protolathe/RefreshParts() diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 5dc96be0a0..0ea18b2ff9 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -21,8 +21,7 @@ wires = new /datum/wires/r_n_d(src) /obj/machinery/r_n_d/Destroy() - qdel(wires) - wires = null + QDEL_NULL(wires) return ..() /obj/machinery/r_n_d/proc/shock(mob/user, prb) diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index d161929f2c..8fa7e64ffe 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -19,14 +19,6 @@ var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/rdserver(null) B.apply_default_parts(src) -/obj/item/weapon/circuitboard/machine/rdserver - name = "R&D Server (Machine Board)" - build_path = /obj/machinery/r_n_d/server - origin_tech = "programming=3" - req_components = list( - /obj/item/stack/cable_coil = 2, - /obj/item/weapon/stock_parts/scanning_module = 1) - /obj/machinery/r_n_d/server/Destroy() griefProtection() return ..() diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index 0567ee5d51..8563c36ea4 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -24,8 +24,8 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) /obj/machinery/keycard_auth/Destroy() GLOB.keycard_events.clearEvent("triggerEvent", ev) - qdel(ev) - . = ..() + QDEL_NULL(ev) + return ..() /obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index 179f1e7d0a..eba4bd74a8 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -10,9 +10,13 @@ var/admin_controlled var/no_destination_swap = 0 -/obj/machinery/computer/shuttle/Initialize(mapload, obj/item/weapon/circuitboard/computer/shuttle/C) - . = ..() - if(istype(C)) +/obj/machinery/computer/shuttle/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/computer/shuttle/LateInitialize() + if(istype(circuit, /obj/item/weapon/circuitboard/computer/shuttle)) + var/obj/item/weapon/circuitboard/computer/shuttle/C = circuit possible_destinations = C.possible_destinations shuttleId = C.shuttleId diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm index 6fd9cb129e..6e2741a6d7 100644 --- a/code/modules/shuttle/manipulator.dm +++ b/code/modules/shuttle/manipulator.dm @@ -33,14 +33,10 @@ add_overlay(hologram_projection) add_overlay(hologram_ship) -/obj/machinery/shuttle_manipulator/ui_interact(mob/user, ui_key = "main", \ - datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, \ - datum/ui_state/state = GLOB.admin_state) - +/obj/machinery/shuttle_manipulator/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.admin_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "shuttle_manipulator", name, 800, 600, \ - master_ui, state) + ui = new(user, src, ui_key, "shuttle_manipulator", name, 800, 600, master_ui, state) ui.open() /proc/shuttlemode2str(mode) @@ -62,7 +58,7 @@ if(SHUTTLE_ENDGAME) . = "endgame" if(!.) - throw EXCEPTION("shuttlemode2str(): invalid mode [mode]") + CRASH("shuttlemode2str(): invalid mode [mode]") /obj/machinery/shuttle_manipulator/ui_data(mob/user) diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 7a5f4936d9..12b8e83c65 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -10,9 +10,9 @@ icon = 'icons/obj/machines/magic_emitter.dmi' icon_state = "wabbajack_statue" icon_state_on = "wabbajack_statue_on" + active = FALSE var/list/active_tables = list() var/tables_required = 2 - active = FALSE /obj/machinery/power/emitter/energycannon/magical/Initialize() . = ..() diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 47eb22c397..1c1b0731be 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -25,20 +25,6 @@ board.moved = TRUE ..() -/obj/item/weapon/circuitboard/computer/syndicate_shuttle - name = "Syndicate Shuttle (Computer Board)" - build_path = /obj/machinery/computer/shuttle/syndicate - var/challenge = FALSE - var/moved = FALSE - -/obj/item/weapon/circuitboard/computer/syndicate_shuttle/Initialize() - . = ..() - GLOB.syndicate_shuttle_boards += src - -/obj/item/weapon/circuitboard/computer/syndicate_shuttle/Destroy() - GLOB.syndicate_shuttle_boards -= src - return ..() - /obj/machinery/computer/shuttle/syndicate/drop_pod name = "syndicate assault pod control" icon = 'icons/obj/terminals.dmi' diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 77a30b1884..453a8e097a 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -206,35 +206,6 @@ /obj/structure/filler/ex_act() return -/obj/item/weapon/circuitboard/machine/bsa/back - name = "Bluespace Artillery Generator (Machine Board)" - build_path = /obj/machinery/bsa/back - origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies! - req_components = list( - /obj/item/weapon/stock_parts/capacitor/quadratic = 5, - /obj/item/stack/cable_coil = 2) - -/obj/item/weapon/circuitboard/machine/bsa/middle - name = "Bluespace Artillery Fusor (Machine Board)" - build_path = /obj/machinery/bsa/middle - origin_tech = "engineering=2;combat=2;bluespace=2" - req_components = list( - /obj/item/weapon/ore/bluespace_crystal = 20, - /obj/item/stack/cable_coil = 2) - -/obj/item/weapon/circuitboard/machine/bsa/front - name = "Bluespace Artillery Bore (Machine Board)" - build_path = /obj/machinery/bsa/front - origin_tech = "engineering=2;combat=2;bluespace=2" - req_components = list( - /obj/item/weapon/stock_parts/manipulator/femto = 5, - /obj/item/stack/cable_coil = 2) - -/obj/item/weapon/circuitboard/computer/bsa_control - name = "Bluespace Artillery Controls (Computer Board)" - build_path = /obj/machinery/computer/bsa_control - origin_tech = "engineering=2;combat=2;bluespace=2" - /obj/machinery/computer/bsa_control name = "bluespace artillery control" var/obj/machinery/bsa/full/cannon diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index d41ea48c5f..3412db9b72 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -118,16 +118,6 @@ dna[H.dna.uni_identity] = 1 to_chat(user, "Humanoid data added to local storage.") - -/obj/item/weapon/circuitboard/machine/dna_vault - name = "DNA Vault (Machine Board)" - build_path = /obj/machinery/dna_vault - origin_tech = "engineering=2;combat=2;bluespace=2" //No freebies! - req_components = list( - /obj/item/weapon/stock_parts/capacitor/super = 5, - /obj/item/weapon/stock_parts/manipulator/pico = 5, - /obj/item/stack/cable_coil = 2) - /obj/machinery/dna_vault name = "DNA Vault" desc = "Break glass in case of apocalypse." diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 1543f7615a..38fd5ad853 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -36,15 +36,10 @@ coverage |= view(A.kill_range,A) return coverage.len -/obj/item/weapon/circuitboard/machine/computer/sat_control - name = "Satellite Network Control (Computer Board)" - build_path = /obj/machinery/computer/sat_control - origin_tech = "engineering=3" - /obj/machinery/computer/sat_control name = "satellite control" desc = "Used to control the satellite network." - circuit = /obj/item/weapon/circuitboard/machine/computer/sat_control + circuit = /obj/item/weapon/circuitboard/computer/sat_control var/notice /obj/machinery/computer/sat_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) diff --git a/code/modules/stock_market/computer.dm b/code/modules/stock_market/computer.dm index 9cef9b3048..68b28d09be 100644 --- a/code/modules/stock_market/computer.dm +++ b/code/modules/stock_market/computer.dm @@ -11,8 +11,8 @@ light_color = LIGHT_COLOR_GREEN -/obj/machinery/computer/stockexchange/New() - ..() +/obj/machinery/computer/stockexchange/Initialize() + . = ..() logged_in = "[station_name()] Cargo Department" /obj/machinery/computer/stockexchange/proc/balance() diff --git a/tgstation.dme b/tgstation.dme index 23ffe1fef1..fc5f811cef 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -549,6 +549,7 @@ #include "code\game\gamemodes\wizard\soulstone.dm" #include "code\game\gamemodes\wizard\spellbook.dm" #include "code\game\gamemodes\wizard\wizard.dm" +#include "code\game\machinery\_machinery.dm" #include "code\game\machinery\ai_slipper.dm" #include "code\game\machinery\airlock_control.dm" #include "code\game\machinery\announcement_system.dm" @@ -575,7 +576,6 @@ #include "code\game\machinery\launch_pad.dm" #include "code\game\machinery\lightswitch.dm" #include "code\game\machinery\limbgrower.dm" -#include "code\game\machinery\machinery.dm" #include "code\game\machinery\magnet.dm" #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\navbeacon.dm" @@ -606,6 +606,7 @@ #include "code\game\machinery\camera\motion.dm" #include "code\game\machinery\camera\presets.dm" #include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\computer\_computer.dm" #include "code\game\machinery\computer\aifixer.dm" #include "code\game\machinery\computer\apc_control.dm" #include "code\game\machinery\computer\arcade.dm" @@ -617,7 +618,6 @@ #include "code\game\machinery\computer\card.dm" #include "code\game\machinery\computer\cloning.dm" #include "code\game\machinery\computer\communications.dm" -#include "code\game\machinery\computer\computer.dm" #include "code\game\machinery\computer\crew.dm" #include "code\game\machinery\computer\dna_console.dm" #include "code\game\machinery\computer\gulag_teleporter.dm" @@ -633,6 +633,7 @@ #include "code\game\machinery\computer\security.dm" #include "code\game\machinery\computer\station_alert.dm" #include "code\game\machinery\computer\telecrystalconsoles.dm" +#include "code\game\machinery\computer\teleporter.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_electronics.dm" #include "code\game\machinery\doors\airlock_types.dm" @@ -863,6 +864,9 @@ #include "code\game\objects\items\weapons\twohanded.dm" #include "code\game\objects\items\weapons\vending_items.dm" #include "code\game\objects\items\weapons\weaponry.dm" +#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" +#include "code\game\objects\items\weapons\circuitboards\computer_circuitboards.dm" +#include "code\game\objects\items\weapons\circuitboards\machine_circuitboards.dm" #include "code\game\objects\items\weapons\grenades\chem_grenade.dm" #include "code\game\objects\items\weapons\grenades\clusterbuster.dm" #include "code\game\objects\items\weapons\grenades\emgrenade.dm" From 501972a2f8038e45ce35de389dea1d98f44ebcb6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:26:46 -0500 Subject: [PATCH 05/70] Removes chat pings from href logs --- code/modules/client/client_procs.dm | 5 +++-- code/modules/client/client_procs.dm.rej | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 code/modules/client/client_procs.dm.rej diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4455af7ca9..feb1a6e94d 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -72,8 +72,9 @@ to_chat(src, "Your previous action was ignored because you've done too many in a second") return - //Logs all hrefs - GLOB.world_href_log << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" + //Logs all hrefs, except chat pings + if(href_list["proc"] != "ping") + GLOB.world_href_log << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" // Admin PM if(href_list["priv_msg"]) diff --git a/code/modules/client/client_procs.dm.rej b/code/modules/client/client_procs.dm.rej new file mode 100644 index 0000000000..2b656938c4 --- /dev/null +++ b/code/modules/client/client_procs.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm (rejected hunks) +@@ -73,7 +73,7 @@ + return + + //Logs all hrefs, except chat pings +- if(href_list["proc"] != "ping") ++ if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2)) + WRITE_FILE(GLOB.world_href_log, "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
") + + // Admin PM From 7004797c8c41b5fd567b1f0bdd1772dfcbb22584 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:28:08 -0500 Subject: [PATCH 06/70] Fixed sign description --- code/game/objects/structures/signs.dm.rej | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 code/game/objects/structures/signs.dm.rej diff --git a/code/game/objects/structures/signs.dm.rej b/code/game/objects/structures/signs.dm.rej new file mode 100644 index 0000000000..51eea8f290 --- /dev/null +++ b/code/game/objects/structures/signs.dm.rej @@ -0,0 +1,11 @@ +diff a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm (rejected hunks) +@@ -326,6 +326,6 @@ + icon_state = "direction_bridge" + + /obj/structure/sign/logo +- name = "station logo" +- desc = "A sign: SPACE STATION 13." ++ name = "nanotrasen logo" ++ desc = "The Nanotrasen corporate logo." + icon_state = "nanotrasen_sign1" +\ No newline at end of file From deffc1b1f1feb1d04d8401059d785ec54c998dfb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 01:28:20 -0500 Subject: [PATCH 07/70] More baseturf helpers --- .../LavaRuins/lavaland_biodome_beach.dmm | 2 +- .../lavaland_biodome_clown_planet.dmm | 2 +- .../lavaland_surface_animal_hospital.dmm | 2 +- .../lavaland_surface_ash_walker1.dmm | 2 +- .../lavaland_surface_biodome_winter.dmm | 2 +- .../LavaRuins/lavaland_surface_cultaltar.dmm | 2 +- .../LavaRuins/lavaland_surface_envy.dmm | 2 +- .../lavaland_surface_fountain_hall.dmm | 2 +- .../LavaRuins/lavaland_surface_gluttony.dmm | 2 +- .../LavaRuins/lavaland_surface_golem_ship.dmm | 2 +- .../LavaRuins/lavaland_surface_greed.dmm | 2 +- .../LavaRuins/lavaland_surface_hermit.dmm | 2 +- .../LavaRuins/lavaland_surface_pizzaparty.dmm | 2 +- .../LavaRuins/lavaland_surface_pride.dmm | 2 +- .../LavaRuins/lavaland_surface_seed_vault.dmm | 2 +- .../LavaRuins/lavaland_surface_sloth.dmm | 2 +- .../lavaland_surface_survivalpod.dmm | 2 +- .../lavaland_surface_swarmer_crash.dmm | 2 +- .../lavaland_surface_syndicate_base1.dmm | 2 +- .../LavaRuins/lavaland_surface_ufo_crash.dmm | 2 +- .../lavaland_surface_xeno_nest.dmm.rej | 10 +++++ _maps/map_files/Mining/Lavaland.dmm | 25 ++++++++---- .../objects_and_mobs/ruin_mapping_aids.dm | 39 +++++++++++++++++-- 23 files changed, 84 insertions(+), 30 deletions(-) create mode 100644 _maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index f0f2d8a6c5..c47534925f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -460,7 +460,7 @@ /area/ruin/powered/beach) "cz" = ( /obj/effect/turf_decal/sand, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "cR" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm index 408fe6ff1d..87137f7d14 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm @@ -896,7 +896,7 @@ /area/ruin/powered/clownplanet) "dR" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/indestructible/sound{ icon_state = "bananium"; name = "bananium floor"; diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm index de78fed108..ec1ce79bd8 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm @@ -809,7 +809,7 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "cF" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/titanium/nodiagonal, /area/ruin/powered/animal_hospital) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index aed9b30686..3cae12bfe1 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -1071,7 +1071,7 @@ /area/ruin/unpowered/ash_walkers) "cE" = ( /obj/structure/stone_tile/surrounding/cracked, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "cF" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index 49ae2cb4f5..722cc92d78 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -275,7 +275,7 @@ }, /area/ruin/powered/snow_biodome) "bS" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/snow{ initial_gas_mix = "o2=22;n2=82;TEMP=180" }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm index ed4aee469d..875cfdc35d 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm @@ -163,7 +163,7 @@ /turf/open/floor/plasteel/cult{ initial_gas_mix = "o2=14;n2=23;TEMP=300" }, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/cult, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm index 66d7173097..773fc01f51 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm @@ -104,7 +104,7 @@ /turf/open/floor/plating, /area/ruin/unpowered) "r" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/rust, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm index 0c40aa2881..ab1d5764e1 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm @@ -29,7 +29,7 @@ /turf/open/floor/engine/cult, /area/ruin/unpowered) "i" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/engine/cult, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm index 97b44df094..3b1c555805 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm @@ -85,7 +85,7 @@ /turf/open/floor/plasteel/freezer, /area/ruin/powered/gluttony) "D" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plasteel/freezer, /area/ruin/powered/gluttony) "R" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm index fa1e394751..c993ecbb63 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm @@ -285,7 +285,7 @@ /turf/open/floor/plating, /area/ruin/powered/golem_ship) "Y" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/mineral/titanium/purple, /area/ruin/powered/golem_ship) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm index 3d67d7b474..c81c510b9e 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm @@ -123,7 +123,7 @@ /turf/open/floor/engine/cult, /area/ruin/powered/greed) "z" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/engine/cult, /area/ruin/powered/greed) "J" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm index 896f13b1bb..2749e39f1f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm @@ -180,7 +180,7 @@ }, /area/ruin/powered) "L" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/basalt, /area/ruin/powered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index 44c41f5b85..f14495c95c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -342,7 +342,7 @@ /area/ruin/unpowered) "S" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/wood{ baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface; initial_gas_mix = "o2=14;n2=23;TEMP=300" diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm index b1dedc0cb3..38b5f5f64d 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm @@ -65,7 +65,7 @@ /turf/open/floor/mineral/silver, /area/ruin/powered/pride) "u" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/mineral/silver, /area/ruin/powered/pride) "G" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index cb2686fe89..01ac536230 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -262,7 +262,7 @@ /turf/open/floor/plasteel/freezer, /area/ruin/powered/seedvault) "Z" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/r_wall, /area/ruin/powered/seedvault) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm index 89a8b50c39..5ae4227813 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm @@ -42,7 +42,7 @@ }, /area/ruin/unpowered) "h" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/sepia{ blocks_air = 0; slowdown = 10 diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm index 3392d60307..8d40c16d58 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm @@ -169,7 +169,7 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "B" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/titanium/survival/pod, /area/ruin/powered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm index a794b58db8..3962947551 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm @@ -22,7 +22,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/unpowered) "g" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/plastitanium, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index be96830ca4..2893f3481f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -1285,7 +1285,7 @@ }, /area/ruin/powered/syndicate_lava_base) "dd" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plasteel/vault{ dir = 5 }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm index 22d341c7df..0c4dd60fb8 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm @@ -105,7 +105,7 @@ "s" = ( /obj/structure/table/optable/abductor, /obj/item/weapon/cautery/alien, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/abductor{ initial_gas_mix = "o2=16;n2=23;TEMP=300" }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej new file mode 100644 index 0000000000..365cc7fdda --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej @@ -0,0 +1,10 @@ +diff a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm (rejected hunks) +@@ -269,7 +269,7 @@ + "W" = ( + /obj/structure/alien/weeds, + /obj/structure/alien/resin/wall, +-/obj/effect/baseturf_helper, ++/obj/effect/baseturf_helper/lava_land/surface, + /turf/open/floor/plating/asteroid/basalt/lava_land_surface, + /area/ruin/unpowered/xenonest) + diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 4c00524717..9b97eef1d5 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -1,4 +1,4 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( /turf/closed/indestructible/riveted/boss, /area/lavaland/surface/outdoors) @@ -1241,6 +1241,7 @@ d2 = 4; icon_state = "1-4" }, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/circuit, /area/mine/maintenance) "dy" = ( @@ -3399,17 +3400,27 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "Wt" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall, /area/mine/laborcamp/security) "Wu" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall, /area/mine/laborcamp) "Ww" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Wx" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/open/floor/plasteel/brown{ + dir = 4 + }, +/area/mine/eva) +"Wy" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/open/floor/plasteel, +/area/mine/production) (1,1,1) = {" aa @@ -19057,7 +19068,7 @@ cI cP cn bP -bP +Wy bP bP eD @@ -19570,7 +19581,7 @@ bf cK bq bq -dt +br bq dV el @@ -20335,7 +20346,7 @@ bf bp bu bI -bW +Wx cr bf ad diff --git a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm index 06fb2b9c04..68a34637b8 100644 --- a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm +++ b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm @@ -1,10 +1,10 @@ //These landmarks can be placed in rooms/ruins to set the baseturfs of every turf in the area. Easier than having potentially unlimited subtypes of every turf or having to manually edit the turfs in the map editor /obj/effect/baseturf_helper - name = "lava baseturf editor" + name = "baseturf editor" icon = 'icons/obj/weapons.dmi' icon_state = "syndballoon" - var/baseturf = /turf/open/lava/smooth/lava_land_surface + var/baseturf = null layer = POINT_LAYER /obj/effect/baseturf_helper/Initialize() @@ -13,4 +13,37 @@ for(var/turf/T in get_area_turfs(thearea, z)) if(T.baseturf != T.type) //Don't break indestructible walls and the like T.baseturf = baseturf - qdel(src) \ No newline at end of file + qdel(src) + + +/obj/effect/baseturf_helper/asteroid + name = "asteroid baseturf editor" + baseturf = /turf/open/floor/plating/asteroid + +/obj/effect/baseturf_helper/asteroid/airless + name = "asteroid airless baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/airless + +/obj/effect/baseturf_helper/asteroid/basalt + name = "asteroid basalt baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/basalt + +/obj/effect/baseturf_helper/asteroid/snow + name = "asteroid snow baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/snow + +/obj/effect/baseturf_helper/beach/sand + name = "beach sand baseturf editor" + baseturf = /turf/open/floor/plating/beach/sand + +/obj/effect/baseturf_helper/beach/water + name = "water baseturf editor" + baseturf = /turf/open/floor/plating/beach/water + +/obj/effect/baseturf_helper/lava + name = "lava baseturf editor" + baseturf = /turf/open/lava/smooth + +/obj/effect/baseturf_helper/lava_land/surface + name = "lavaland baseturf editor" + baseturf = /turf/open/lava/smooth/lava_land_surface From fdfb61b5272600b05a3d66a17adf9b0ecd1e8d14 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 13 Aug 2017 09:50:51 -0500 Subject: [PATCH 08/70] Update client_procs.dm --- code/modules/client/client_procs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index feb1a6e94d..b4a879e5fe 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -73,8 +73,8 @@ return //Logs all hrefs, except chat pings - if(href_list["proc"] != "ping") - GLOB.world_href_log << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
" + if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2)) + WRITE_FILE(GLOB.world_href_log, "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
") // Admin PM if(href_list["priv_msg"]) From 16428315aa6af839e82632cac562940c5610d8e9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 13 Aug 2017 18:01:40 -0500 Subject: [PATCH 09/70] Merges the two turf/Entereds --- code/game/turfs/turf.dm.rej | 13 +++++++++++++ code/modules/lighting/lighting_turf.dm | 8 -------- 2 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 code/game/turfs/turf.dm.rej diff --git a/code/game/turfs/turf.dm.rej b/code/game/turfs/turf.dm.rej new file mode 100644 index 0000000000..1c4472c18a --- /dev/null +++ b/code/game/turfs/turf.dm.rej @@ -0,0 +1,13 @@ +diff a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm (rejected hunks) +@@ -163,6 +163,11 @@ + if(explosion_level && AM.ex_check(explosion_id)) + AM.ex_act(explosion_level) + ++ // If an opaque movable atom moves around we need to potentially update visibility. ++ if (AM.opacity) ++ has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. ++ reconsider_lights() ++ + /turf/open/Entered(atom/movable/AM) + ..() + //melting diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 3aca57c4bf..fc03cfb8c0 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -95,14 +95,6 @@ has_opaque_atom = TRUE break -// If an opaque movable atom moves around we need to potentially update visibility. -/turf/Entered(var/atom/movable/Obj, var/atom/OldLoc) - . = ..() - - if (Obj && Obj.opacity) - has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. - reconsider_lights() - /turf/Exited(var/atom/movable/Obj, var/atom/newloc) . = ..() From 7aa960b4997d2d10805d8e36ac0e123dc2ef26d3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 14 Aug 2017 01:23:57 -0500 Subject: [PATCH 10/70] Fixes a typo in the blobbernaut spawn text --- code/game/gamemodes/blob/powers.dm.rej | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 code/game/gamemodes/blob/powers.dm.rej diff --git a/code/game/gamemodes/blob/powers.dm.rej b/code/game/gamemodes/blob/powers.dm.rej new file mode 100644 index 0000000000..27dc764a75 --- /dev/null +++ b/code/game/gamemodes/blob/powers.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm (rejected hunks) +@@ -175,7 +175,7 @@ + SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg')) + to_chat(blobber, "You are a blobbernaut!") + to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.") +- to_chat(blobber, "You can communicate with other blobbernauts and GLOB.overminds via :b") ++ to_chat(blobber, "You can communicate with other blobbernauts and overminds via :b") + to_chat(blobber, "Your overmind's blob reagent is: [blob_reagent_datum.name]!") + to_chat(blobber, "The [blob_reagent_datum.name] reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]") + if(blobber) From fa8ed2de17ed9065ce6587a60d675ba068c2dab0 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 14 Aug 2017 09:13:33 -0500 Subject: [PATCH 11/70] Update component.dm --- code/datums/components/component.dm | 229 ++-------------------------- 1 file changed, 14 insertions(+), 215 deletions(-) diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm index bc65b1cabe..5e25a581f8 100644 --- a/code/datums/components/component.dm +++ b/code/datums/components/component.dm @@ -26,7 +26,7 @@ //set up the typecache var/our_type = type - for(var/I in _GetInverseTypeList(our_type)) + for(var/I in _GetInverseTypeListExceptRoot(our_type)) var/test = dc[I] if(test) //already another component of this type here var/list/components_of_type @@ -66,7 +66,7 @@ if(P) var/list/dc = P.datum_components var/our_type = type - for(var/I in _GetInverseTypeList(our_type)) + for(var/I in _GetInverseTypeListExceptRoot(our_type)) var/list/components_of_type = dc[I] if(islist(components_of_type)) // var/list/subtracted = components_of_type - src @@ -110,226 +110,25 @@ /datum/component/proc/OnTransfer(datum/new_parent) return -/datum/component/proc/AfterComponentActivated() - return - -/datum/component/proc/_GetInverseTypeList(current_type) - . = list(current_type) +/datum/component/proc/_GetInverseTypeListExceptRoot(our_type_cached) + var/datum/component/current_type = our_type_cached + . = list() while (current_type != /datum/component) - current_type = type2parent(current_type) . += current_type + current_type = type2parent(current_type) + +/datum/var/list/datum_components //special typecache of /datum/component /datum/proc/SendSignal(sigtype, ...) var/list/comps = datum_components . = FALSE - if(!comps) - return - var/target = comps[/datum/component] - if(!islist(target)) - var/datum/component/C = target - if(C.enabled && C.ReceiveSignal(arglist(args))) + for(var/I in comps) + var/datum/component/C = I + if(!C.enabled) + continue + if(C.ReceiveSignal(arglist(args))) ComponentActivated(C) - C.AfterComponentActivated() - return TRUE - else - for(var/I in target) - var/datum/component/C = I - if(!C.enabled) - continue - if(C.ReceiveSignal(arglist(args))) - ComponentActivated(C) - . = TRUE - -/datum/proc/ComponentActivated(datum/component/C) - return - -/datum/proc/GetComponent(c_type) - var/list/dc = datum_components - if(!dc) - return null - . = dc[c_type] - if(islist(.)) - return .[1] - -/datum/proc/GetExactComponent(c_type) - var/list/dc = datum_components - if(!dc) - return null - var/datum/component/C = dc[c_type] - if(C) - if(islist(C)) - C = C[1] - if(C.type == c_type) - return C - return null - -/datum/proc/GetComponents(c_type) - var/list/dc = datum_components - if(!dc) - return null - . = dc[c_type] - if(!islist(.)) - return list(.) - -/datum/proc/AddComponent(new_type, ...) - var/nt = new_type - args[1] = src - var/datum/component/C = new nt(arglist(args)) - return QDELING(C) ? GetComponent(new_type) : C - -/datum/proc/TakeComponent(datum/component/C) - if(!C) - return - var/datum/helicopter = C.parent - if(helicopter == src) - //wat - return - C._RemoveNoSignal() - helicopter.SendSignal(COMSIG_COMPONENT_REMOVING, C) - C.OnTransfer(src) - C.parent = src - SendSignal(COMSIG_COMPONENT_ADDED, C) -/datum/component - var/enabled = TRUE - var/dupe_mode = COMPONENT_DUPE_HIGHLANDER - var/list/signal_procs - var/datum/parent - -/datum/component/New(datum/P, ...) - var/dm = dupe_mode - if(dm != COMPONENT_DUPE_ALLOWED) - var/datum/component/old = P.GetExactComponent(type) - if(old) - switch(dm) - if(COMPONENT_DUPE_HIGHLANDER) - InheritComponent(old, FALSE) - qdel(old) - if(COMPONENT_DUPE_UNIQUE) - old.InheritComponent(src, TRUE) - qdel(src) - return - P.SendSignal(COMSIG_COMPONENT_ADDED, src) - - //lazy init the parent's dc list - var/list/dc = P.datum_components - if(!dc) - P.datum_components = dc = list() - - //set up the typecache - var/our_type = type - for(var/I in _GetInverseTypeList(our_type)) - var/test = dc[I] - if(test) //already another component of this type here - var/list/components_of_type - if(!islist(test)) - components_of_type = list(test) - dc[I] = components_of_type - else - components_of_type = test - if(I == our_type) //exact match, take priority - var/inserted = FALSE - for(var/J in 1 to components_of_type.len) - var/datum/component/C = components_of_type[J] - if(C.type != our_type) //but not over other exact matches - components_of_type.Insert(J, I) - inserted = TRUE - break - if(!inserted) - components_of_type += src - else //indirect match, back of the line with ya - components_of_type += src - else //only component of this type, no list - dc[I] = src - - parent = P - -/datum/component/Destroy() - enabled = FALSE - var/datum/P = parent - if(P) - _RemoveNoSignal() - P.SendSignal(COMSIG_COMPONENT_REMOVING, src) - LAZYCLEARLIST(signal_procs) - return ..() - -/datum/component/proc/_RemoveNoSignal() - var/datum/P = parent - if(P) - var/list/dc = P.datum_components - var/our_type = type - for(var/I in _GetInverseTypeList(our_type)) - var/list/components_of_type = dc[I] - if(islist(components_of_type)) // - var/list/subtracted = components_of_type - src - if(subtracted.len == 1) //only 1 guy left - dc[I] = subtracted[1] //make him special - else - dc[I] = subtracted - else //just us - dc -= I - if(!dc.len) - P.datum_components = null - parent = null - -/datum/component/proc/RegisterSignal(sig_type, proc_on_self, override = FALSE) - if(QDELETED(src)) - return - var/list/procs = signal_procs - if(!procs) - procs = list() - signal_procs = procs - - if(!override) - . = procs[sig_type] - if(.) - stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning") - - procs[sig_type] = CALLBACK(src, proc_on_self) - -/datum/component/proc/ReceiveSignal(sigtype, ...) - var/list/sps = signal_procs - var/datum/callback/CB = LAZYACCESS(sps, sigtype) - if(!CB) - return FALSE - var/list/arguments = args.Copy() - arguments.Cut(1, 2) - return CB.InvokeAsync(arglist(arguments)) - -/datum/component/proc/InheritComponent(datum/component/C, i_am_original) - return - -/datum/component/proc/OnTransfer(datum/new_parent) - return - -/datum/component/proc/AfterComponentActivated() - return - -/datum/component/proc/_GetInverseTypeList(current_type) - . = list(current_type) - while (current_type != /datum/component) - current_type = type2parent(current_type) - . += current_type - -/datum/proc/SendSignal(sigtype, ...) - var/list/comps = datum_components - . = FALSE - if(!comps) - return - var/target = comps[/datum/component] - if(!islist(target)) - var/datum/component/C = target - if(C.enabled && C.ReceiveSignal(arglist(args))) - ComponentActivated(C) - C.AfterComponentActivated() - return TRUE - else - for(var/I in target) - var/datum/component/C = I - if(!C.enabled) - continue - if(C.ReceiveSignal(arglist(args))) - ComponentActivated(C) - . = TRUE + . = TRUE /datum/proc/ComponentActivated(datum/component/C) return From afbe4be50c6fe7c6301f017a87944593ef8f0f30 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 17:51:33 -0500 Subject: [PATCH 12/70] Moves most of world.dm --- code/__DEFINES/server_tools.dm | 5 +- code/_compile_options.dm | 2 - code/game/world.dm | 292 +++++++++++++++++++++++++++++++ code/world.dm | 3 + code/world.dm.rej | 309 ++++++++++++++++++++++++++++++++- tgstation.dme | 1 + 6 files changed, 600 insertions(+), 12 deletions(-) create mode 100644 code/game/world.dm diff --git a/code/__DEFINES/server_tools.dm b/code/__DEFINES/server_tools.dm index 4624c5914f..a4afa58a87 100644 --- a/code/__DEFINES/server_tools.dm +++ b/code/__DEFINES/server_tools.dm @@ -4,6 +4,9 @@ #define IRC_STATUS_THROTTLE 5 +#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round + //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored + //keep these in sync with TGS3 #define SERVICE_WORLD_PARAM "server_service" #define SERVICE_PR_TEST_JSON "..\\..\\prtestjob.json" @@ -17,7 +20,7 @@ #define SERVICE_CMD_NAME_CHECK "namecheck" #define SERVICE_CMD_ADMIN_WHO "adminwho" -//#define SERVICE_CMD_PARAM_KEY //defined in __compile_options.dm +#define SERVICE_CMD_PARAM_KEY "serviceCommsKey" #define SERVICE_CMD_PARAM_COMMAND "command" #define SERVICE_CMD_PARAM_MESSAGE "message" #define SERVICE_CMD_PARAM_TARGET "target" diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 964c956eca..a669f1b4f5 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -69,8 +69,6 @@ #error You need version 511 or higher #endif - #define SERVICE_CMD_PARAM_KEY "serviceCommsKey" - //Update this whenever the db schema changes //make sure you add an update to the schema_version stable in the db changelog #define DB_MAJOR_VERSION 3 diff --git a/code/game/world.dm b/code/game/world.dm new file mode 100644 index 0000000000..f5b45a46ca --- /dev/null +++ b/code/game/world.dm @@ -0,0 +1,292 @@ +/world/New() + log_world("World loaded at [time_stamp()]") + + SetupExternalRSC() + + GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl + + make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) + + config = new + + CheckSchemaVersion() + SetRoundID() + + SetupLogs() + + if(!RunningService()) //tgs2 support + GLOB.revdata.DownloadPRDetails() + + load_motd() + load_admins() + LoadVerbs(/datum/verbs/menu) + if(config.usewhitelist) + load_whitelist() + LoadBans() + + GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 + + Master.Initialize(10, FALSE) + + if(config.irc_announce_new_game) + IRCBroadcast("New round starting on [SSmapping.config.map_name]!") + +/world/proc/SetupExternalRSC() +#if (PRELOAD_RSC == 0) + external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") + var/i=1 + while(i<=external_rsc_urls.len) + if(external_rsc_urls[i]) + i++ + else + external_rsc_urls.Cut(i,i+1) +#endif + +/world/proc/CheckSchemaVersion() + if(config.sql_enabled) + if(SSdbcore.Connect()) + log_world("Database connection established.") + var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") + query_db_version.Execute() + if(query_db_version.NextRow()) + var/db_major = text2num(query_db_version.item[1]) + var/db_minor = text2num(query_db_version.item[2]) + if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION) + message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") + log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") + else + message_admins("Could not get schema version from database") + else + log_world("Your server failed to establish a connection with the database.") + +/world/proc/SetRoundID() + if(config.sql_enabled) + if(SSdbcore.Connect()) + var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')") + query_round_start.Execute() + var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") + query_round_last_id.Execute() + if(query_round_last_id.NextRow()) + GLOB.round_id = query_round_last_id.item[1] + +/world/proc/SetupLogs() + GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" + if(GLOB.round_id) + GLOB.log_directory += "[GLOB.round_id]" + else + GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]" + GLOB.world_game_log = file("[GLOB.log_directory]/game.log") + GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") + GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") + GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") + WRITE_FILE(GLOB.world_game_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") + WRITE_FILE(GLOB.world_attack_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") + WRITE_FILE(GLOB.world_runtime_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") + GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently + if(fexists(GLOB.config_error_log)) + fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") + fdel(GLOB.config_error_log) + + if(GLOB.round_id) + log_game("Round ID: [GLOB.round_id]") + +/world/Topic(T, addr, master, key) + var/list/input = params2list(T) + + var/pinging = ("ping" in input) + var/playing = ("players" in input) + + if(!pinging && !playing && config && config.log_world_topic) + WRITE_FILE(GLOB.world_game_log, "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]") + + if(input[SERVICE_CMD_PARAM_KEY]) + return ServiceCommand(input) + var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) + + if(pinging) + var/x = 1 + for (var/client/C in GLOB.clients) + x++ + return x + + else if(playing) + var/n = 0 + for(var/mob/M in GLOB.player_list) + if(M.client) + n++ + return n + + else if("ircstatus" in input) //tgs2 support + var/static/last_irc_status = 0 + if(world.time - last_irc_status < 50) + return + var/list/adm = get_admin_counts() + var/list/allmins = adm["total"] + var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). " + status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]." + send2irc("Status", status) + last_irc_status = world.time + + else if("status" in input) + var/list/s = list() + s["version"] = GLOB.game_version + s["mode"] = GLOB.master_mode + s["respawn"] = config ? GLOB.abandon_allowed : 0 + s["enter"] = GLOB.enter_allowed + s["vote"] = config.allow_vote_mode + s["ai"] = config.allow_ai + s["host"] = host ? host : null + s["active_players"] = get_active_player_count() + s["players"] = GLOB.clients.len + s["revision"] = GLOB.revdata.commit + s["revision_date"] = GLOB.revdata.date + + var/list/adm = get_admin_counts() + var/list/presentmins = adm["present"] + var/list/afkmins = adm["afk"] + s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho + s["gamestate"] = SSticker.current_state + + s["map_name"] = SSmapping.config.map_name + + if(key_valid && SSticker.HasRoundStarted()) + s["real_mode"] = SSticker.mode.name + // Key-authed callers may know the truth behind the "secret" + + s["security_level"] = get_security_level() + s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 + // Amount of world's ticks in seconds, useful for calculating round duration + + if(SSshuttle && SSshuttle.emergency) + s["shuttle_mode"] = SSshuttle.emergency.mode + // Shuttle status, see /__DEFINES/stat.dm + s["shuttle_timer"] = SSshuttle.emergency.timeLeft() + // Shuttle timer, in seconds + + return list2params(s) + + else if("announce" in input) + if(!key_valid) + return "Bad Key" + else + AnnouncePR(input["announce"], json_decode(input["payload"])) + + else if("crossmessage" in input) + if(!key_valid) + return + else + if(input["crossmessage"] == "Ahelp") + relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]") + if(input["crossmessage"] == "Comms_Console") + minor_announce(input["message"], "Incoming message from [input["message_sender"]]") + for(var/obj/machinery/computer/communications/CM in GLOB.machines) + CM.overrideCooldown() + if(input["crossmessage"] == "News_Report") + minor_announce(input["message"], "Breaking Update From [input["message_sender"]]") + + else if("adminmsg" in input) //tgs2 support + if(!key_valid) + return "Bad Key" + else + return IrcPm(input["adminmsg"],input["msg"],input["sender"]) + + else if("namecheck" in input) //tgs2 support + if(!key_valid) + return "Bad Key" + else + log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]") + message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]") + return keywords_lookup(input["namecheck"],1) + else if("adminwho" in input) //tgs2 support + if(!key_valid) + return "Bad Key" + else + return ircadminwho() + else if("server_hop" in input) + show_server_hop_transfer_screen(input["server_hop"]) + +/world/proc/AnnouncePR(announcement, list/payload) + var/static/list/PRcounts = list() //PR id -> number of times announced this round + var/id = "[payload["pull_request"]["id"]]" + if(!PRcounts[id]) + PRcounts[id] = 1 + else + ++PRcounts[id] + if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) + return + + var/final_composed = "PR: [announcement]" + for(var/client/C in GLOB.clients) + C.AnnouncePR(final_composed) + +/world/Reboot(reason = 0, fast_track = FALSE) + ServiceReboot() //handles alternative actions if necessary + if (reason || fast_track) //special reboot, do none of the normal stuff + if (usr) + log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools") + message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools") + to_chat(world, "Rebooting World immediately due to host request") + else + to_chat(world, "Rebooting world...") + Master.Shutdown() //run SS shutdowns + log_world("World rebooted at [time_stamp()]") + ..() + +/world/proc/load_motd() + GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo() + +/world/proc/update_status() + var/s = "" + + if (config && config.server_name) + s += "[config.server_name] — " + + s += "[station_name()]"; + s += " (" + s += "" //Change this to wherever you want the hub to link to. + s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version. + s += "" + s += ")" + + var/list/features = list() + + if(GLOB.master_mode) + features += GLOB.master_mode + + if (!GLOB.enter_allowed) + features += "closed" + + features += GLOB.abandon_allowed ? "respawn" : "no respawn" + + if (config && config.allow_vote_mode) + features += "vote" + + if (config && config.allow_ai) + features += "AI allowed" + + var/n = 0 + for (var/mob/M in GLOB.player_list) + if (M.client) + n++ + + if (n > 1) + features += "~[n] players" + else if (n > 0) + features += "~[n] player" + + if (!host && config && config.hostedby) + features += "hosted by [config.hostedby]" + + if (features) + s += ": [jointext(features, ", ")]" + + status = s + +/world/proc/update_hub_visibility(new_visibility) + if(new_visibility == GLOB.hub_visibility) + return + GLOB.hub_visibility = new_visibility + if(GLOB.hub_visibility) + hub_password = "kMZy3U5jJHSiBQjr" + else + hub_password = "SORRYNOPASSWORD" diff --git a/code/world.dm b/code/world.dm index a0c5ae43f8..7e17e579b1 100644 --- a/code/world.dm +++ b/code/world.dm @@ -1,3 +1,6 @@ +//This file is just for the necessary /world definition +//Try looking in game/world.dm + /world mob = /mob/dead/new_player turf = /turf/open/space/basic diff --git a/code/world.dm.rej b/code/world.dm.rej index cde7698a21..e82c17e503 100644 --- a/code/world.dm.rej +++ b/code/world.dm.rej @@ -1,10 +1,301 @@ diff a/code/world.dm b/code/world.dm (rejected hunks) -@@ -59,7 +59,7 @@ - if(config.sql_enabled) - if(SSdbcore.Connect()) - log_world("Database connection established.") -- var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_version")] ORDER BY date DESC LIMIT 1") -+ var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") - query_db_version.Execute() - if(query_db_version.NextRow()) - var/db_major = query_db_version.item[1] +@@ -10,299 +13,3 @@ + #ifdef GC_FAILURE_HARD_LOOKUP + loop_checks = FALSE + #endif +- +-/world/New() +- log_world("World loaded at [time_stamp()]") +- +- SetupExternalRSC() +- +- GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl +- +- make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) +- +- config = new +- +- CheckSchemaVersion() +- SetRoundID() +- +- SetupLogs() +- +- if(!RunningService()) //tgs2 support +- GLOB.revdata.DownloadPRDetails() +- +- load_motd() +- load_admins() +- LoadVerbs(/datum/verbs/menu) +- if(config.usewhitelist) +- load_whitelist() +- LoadBans() +- +- GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 +- +- Master.Initialize(10, FALSE) +- +- if(config.irc_announce_new_game) +- IRCBroadcast("New round starting on [SSmapping.config.map_name]!") +- +-/world/proc/SetupExternalRSC() +-#if (PRELOAD_RSC == 0) +- external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") +- var/i=1 +- while(i<=external_rsc_urls.len) +- if(external_rsc_urls[i]) +- i++ +- else +- external_rsc_urls.Cut(i,i+1) +-#endif +- +-/world/proc/CheckSchemaVersion() +- if(config.sql_enabled) +- if(SSdbcore.Connect()) +- log_world("Database connection established.") +- var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") +- query_db_version.Execute() +- if(query_db_version.NextRow()) +- var/db_major = text2num(query_db_version.item[1]) +- var/db_minor = text2num(query_db_version.item[2]) +- if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION) +- message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") +- log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") +- else +- message_admins("Could not get schema version from database") +- else +- log_world("Your server failed to establish a connection with the database.") +- +-/world/proc/SetRoundID() +- if(config.sql_enabled) +- if(SSdbcore.Connect()) +- var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')") +- query_round_start.Execute() +- var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") +- query_round_last_id.Execute() +- if(query_round_last_id.NextRow()) +- GLOB.round_id = query_round_last_id.item[1] +- +-/world/proc/SetupLogs() +- GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" +- if(GLOB.round_id) +- GLOB.log_directory += "[GLOB.round_id]" +- else +- GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]" +- GLOB.world_game_log = file("[GLOB.log_directory]/game.log") +- GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") +- GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") +- GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") +- GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" +- GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" +- GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" +- GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently +- if(fexists(GLOB.config_error_log)) +- fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") +- fdel(GLOB.config_error_log) +- +- if(GLOB.round_id) +- log_game("Round ID: [GLOB.round_id]") +- +-/world/Topic(T, addr, master, key) +- var/list/input = params2list(T) +- +- var/pinging = ("ping" in input) +- var/playing = ("players" in input) +- +- if(!pinging && !playing && config && config.log_world_topic) +- GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" +- +- if(input[SERVICE_CMD_PARAM_KEY]) +- return ServiceCommand(input) +- var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) +- +- if(pinging) +- var/x = 1 +- for (var/client/C in GLOB.clients) +- x++ +- return x +- +- else if(playing) +- var/n = 0 +- for(var/mob/M in GLOB.player_list) +- if(M.client) +- n++ +- return n +- +- else if("ircstatus" in input) //tgs2 support +- var/static/last_irc_status = 0 +- if(world.time - last_irc_status < 50) +- return +- var/list/adm = get_admin_counts() +- var/list/allmins = adm["total"] +- var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). " +- status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]." +- send2irc("Status", status) +- last_irc_status = world.time +- +- else if("status" in input) +- var/list/s = list() +- s["version"] = GLOB.game_version +- s["mode"] = GLOB.master_mode +- s["respawn"] = config ? GLOB.abandon_allowed : 0 +- s["enter"] = GLOB.enter_allowed +- s["vote"] = config.allow_vote_mode +- s["ai"] = config.allow_ai +- s["host"] = host ? host : null +- s["active_players"] = get_active_player_count() +- s["players"] = GLOB.clients.len +- s["revision"] = GLOB.revdata.commit +- s["revision_date"] = GLOB.revdata.date +- +- var/list/adm = get_admin_counts() +- var/list/presentmins = adm["present"] +- var/list/afkmins = adm["afk"] +- s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho +- s["gamestate"] = SSticker.current_state +- +- s["map_name"] = SSmapping.config.map_name +- +- if(key_valid && SSticker.HasRoundStarted()) +- s["real_mode"] = SSticker.mode.name +- // Key-authed callers may know the truth behind the "secret" +- +- s["security_level"] = get_security_level() +- s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 +- // Amount of world's ticks in seconds, useful for calculating round duration +- +- if(SSshuttle && SSshuttle.emergency) +- s["shuttle_mode"] = SSshuttle.emergency.mode +- // Shuttle status, see /__DEFINES/stat.dm +- s["shuttle_timer"] = SSshuttle.emergency.timeLeft() +- // Shuttle timer, in seconds +- +- return list2params(s) +- +- else if("announce" in input) +- if(!key_valid) +- return "Bad Key" +- else +- AnnouncePR(input["announce"], json_decode(input["payload"])) +- +- else if("crossmessage" in input) +- if(!key_valid) +- return +- else +- if(input["crossmessage"] == "Ahelp") +- relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]") +- if(input["crossmessage"] == "Comms_Console") +- minor_announce(input["message"], "Incoming message from [input["message_sender"]]") +- for(var/obj/machinery/computer/communications/CM in GLOB.machines) +- CM.overrideCooldown() +- if(input["crossmessage"] == "News_Report") +- minor_announce(input["message"], "Breaking Update From [input["message_sender"]]") +- +- else if("adminmsg" in input) //tgs2 support +- if(!key_valid) +- return "Bad Key" +- else +- return IrcPm(input["adminmsg"],input["msg"],input["sender"]) +- +- else if("namecheck" in input) //tgs2 support +- if(!key_valid) +- return "Bad Key" +- else +- log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]") +- message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]") +- return keywords_lookup(input["namecheck"],1) +- else if("adminwho" in input) //tgs2 support +- if(!key_valid) +- return "Bad Key" +- else +- return ircadminwho() +- else if("server_hop" in input) +- show_server_hop_transfer_screen(input["server_hop"]) +- +-#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round +- //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored +- +-/world/proc/AnnouncePR(announcement, list/payload) +- var/static/list/PRcounts = list() //PR id -> number of times announced this round +- var/id = "[payload["pull_request"]["id"]]" +- if(!PRcounts[id]) +- PRcounts[id] = 1 +- else +- ++PRcounts[id] +- if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) +- return +- +- var/final_composed = "PR: [announcement]" +- for(var/client/C in GLOB.clients) +- C.AnnouncePR(final_composed) +- +-/world/Reboot(reason = 0, fast_track = FALSE) +- ServiceReboot() //handles alternative actions if necessary +- if (reason || fast_track) //special reboot, do none of the normal stuff +- if (usr) +- log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools") +- message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools") +- to_chat(world, "Rebooting World immediately due to host request") +- else +- to_chat(world, "Rebooting world...") +- Master.Shutdown() //run SS shutdowns +- log_world("World rebooted at [time_stamp()]") +- ..() +- +-/world/proc/load_motd() +- GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo() +- +-/world/proc/update_status() +- var/s = "" +- +- if (config && config.server_name) +- s += "[config.server_name] — " +- +- s += "[station_name()]"; +- s += " (" +- s += "" //Change this to wherever you want the hub to link to. +- s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version. +- s += "" +- s += ")" +- +- var/list/features = list() +- +- if(GLOB.master_mode) +- features += GLOB.master_mode +- +- if (!GLOB.enter_allowed) +- features += "closed" +- +- features += GLOB.abandon_allowed ? "respawn" : "no respawn" +- +- if (config && config.allow_vote_mode) +- features += "vote" +- +- if (config && config.allow_ai) +- features += "AI allowed" +- +- var/n = 0 +- for (var/mob/M in GLOB.player_list) +- if (M.client) +- n++ +- +- if (n > 1) +- features += "~[n] players" +- else if (n > 0) +- features += "~[n] player" +- +- if (!host && config && config.hostedby) +- features += "hosted by [config.hostedby]" +- +- if (features) +- s += ": [jointext(features, ", ")]" +- +- status = s +- +-/world/proc/update_hub_visibility(new_visibility) +- if(new_visibility == GLOB.hub_visibility) +- return +- GLOB.hub_visibility = new_visibility +- if(GLOB.hub_visibility) +- hub_password = "kMZy3U5jJHSiBQjr" +- else +- hub_password = "SORRYNOPASSWORD" diff --git a/tgstation.dme b/tgstation.dme index 23ffe1fef1..1475d2335c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -375,6 +375,7 @@ #include "code\game\shuttle_engines.dm" #include "code\game\skincmd.dm" #include "code\game\sound.dm" +#include "code\game\world.dm" #include "code\game\area\ai_monitored.dm" #include "code\game\area\areas.dm" #include "code\game\area\Space_Station_13_areas.dm" From 4bd5e318c2d87a608c544ba154255c031443f1a4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 18:00:54 -0500 Subject: [PATCH 13/70] Blobs can now sense loving cuddles! --- code/game/gamemodes/blob/theblob.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 9bce7319f8..f6cdd64bb6 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -24,6 +24,7 @@ M.changeNext_move(CLICK_CD_MELEE) var/a = pick("gently stroke", "nuzzle", "affectionatly pet", "cuddle") M.visible_message("[M] [a]s [src]!", "You [a] [src]!") + to_chat(overmind, "[M] [a]s you!") playsound(src, 'sound/effects/blobattack.ogg', 50, 1) //SQUISH SQUISH From a2e9480cffb8e463300ffc3d5ba646b5d8153f68 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 16 Aug 2017 19:40:40 -0500 Subject: [PATCH 14/70] Update world.dm --- code/world.dm | 296 +------------------------------------------------- 1 file changed, 1 insertion(+), 295 deletions(-) diff --git a/code/world.dm b/code/world.dm index 7e17e579b1..955d19c6c4 100644 --- a/code/world.dm +++ b/code/world.dm @@ -1,3 +1,4 @@ + //This file is just for the necessary /world definition //Try looking in game/world.dm @@ -13,298 +14,3 @@ #ifdef GC_FAILURE_HARD_LOOKUP loop_checks = FALSE #endif - -/world/New() - log_world("World loaded at [time_stamp()]") - - SetupExternalRSC() - - GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl - - make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) - - config = new - - CheckSchemaVersion() - SetRoundID() - - SetupLogs() - - if(!RunningService()) //tgs2 support - GLOB.revdata.DownloadPRDetails() - - load_motd() - load_admins() - LoadVerbs(/datum/verbs/menu) - if(config.usewhitelist) - load_whitelist() - LoadBans() - - GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 - - Master.Initialize(10, FALSE) - - if(config.irc_announce_new_game) - IRCBroadcast("New round starting on [SSmapping.config.map_name]!") - -/world/proc/SetupExternalRSC() -#if (PRELOAD_RSC == 0) - external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") - var/i=1 - while(i<=external_rsc_urls.len) - if(external_rsc_urls[i]) - i++ - else - external_rsc_urls.Cut(i,i+1) -#endif - -/world/proc/CheckSchemaVersion() - if(config.sql_enabled) - if(SSdbcore.Connect()) - var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") - query_db_version.Execute() - if(query_db_version.NextRow()) - var/db_major = text2num(query_db_version.item[1]) - var/db_minor = text2num(query_db_version.item[2]) - if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION) - message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") - log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") - else - message_admins("Could not get schema version from database") - else - log_world("Your server failed to establish a connection with the database.") - -/world/proc/SetRoundID() - if(config.sql_enabled) - if(SSdbcore.Connect()) - var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')") - query_round_start.Execute() - var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") - query_round_last_id.Execute() - if(query_round_last_id.NextRow()) - GLOB.round_id = query_round_last_id.item[1] - -/world/proc/SetupLogs() - GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" - if(GLOB.round_id) - GLOB.log_directory += "[GLOB.round_id]" - else - GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]" - GLOB.world_game_log = file("[GLOB.log_directory]/game.log") - GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") - GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") - GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") - GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" - GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" - GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" - GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently - if(fexists(GLOB.config_error_log)) - fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") - fdel(GLOB.config_error_log) - - if(GLOB.round_id) - log_game("Round ID: [GLOB.round_id]") - -/world/Topic(T, addr, master, key) - var/list/input = params2list(T) - - var/pinging = ("ping" in input) - var/playing = ("players" in input) - - if(!pinging && !playing && config && config.log_world_topic) - GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" - - if(input[SERVICE_CMD_PARAM_KEY]) - return ServiceCommand(input) - var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) - - if(pinging) - var/x = 1 - for (var/client/C in GLOB.clients) - x++ - return x - - else if(playing) - var/n = 0 - for(var/mob/M in GLOB.player_list) - if(M.client) - n++ - return n - - else if("ircstatus" in input) //tgs2 support - var/static/last_irc_status = 0 - if(world.time - last_irc_status < 50) - return - var/list/adm = get_admin_counts() - var/list/allmins = adm["total"] - var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). " - status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]." - send2irc("Status", status) - last_irc_status = world.time - - else if("status" in input) - var/list/s = list() - s["version"] = GLOB.game_version - s["mode"] = GLOB.master_mode - s["respawn"] = config ? GLOB.abandon_allowed : 0 - s["enter"] = GLOB.enter_allowed - s["vote"] = config.allow_vote_mode - s["ai"] = config.allow_ai - s["host"] = host ? host : null - s["active_players"] = get_active_player_count() - s["players"] = GLOB.clients.len - s["revision"] = GLOB.revdata.commit - s["revision_date"] = GLOB.revdata.date - - var/list/adm = get_admin_counts() - var/list/presentmins = adm["present"] - var/list/afkmins = adm["afk"] - s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho - s["gamestate"] = SSticker.current_state - - s["map_name"] = SSmapping.config.map_name - - if(key_valid && SSticker.HasRoundStarted()) - s["real_mode"] = SSticker.mode.name - // Key-authed callers may know the truth behind the "secret" - - s["security_level"] = get_security_level() - s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 - // Amount of world's ticks in seconds, useful for calculating round duration - - if(SSshuttle && SSshuttle.emergency) - s["shuttle_mode"] = SSshuttle.emergency.mode - // Shuttle status, see /__DEFINES/stat.dm - s["shuttle_timer"] = SSshuttle.emergency.timeLeft() - // Shuttle timer, in seconds - - return list2params(s) - - else if("announce" in input) - if(!key_valid) - return "Bad Key" - else - AnnouncePR(input["announce"], json_decode(input["payload"])) - - else if("crossmessage" in input) - if(!key_valid) - return - else - if(input["crossmessage"] == "Ahelp") - relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]") - if(input["crossmessage"] == "Comms_Console") - minor_announce(input["message"], "Incoming message from [input["message_sender"]]") - for(var/obj/machinery/computer/communications/CM in GLOB.machines) - CM.overrideCooldown() - if(input["crossmessage"] == "News_Report") - minor_announce(input["message"], "Breaking Update From [input["message_sender"]]") - - else if("adminmsg" in input) //tgs2 support - if(!key_valid) - return "Bad Key" - else - return IrcPm(input["adminmsg"],input["msg"],input["sender"]) - - else if("namecheck" in input) //tgs2 support - if(!key_valid) - return "Bad Key" - else - log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]") - message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]") - return keywords_lookup(input["namecheck"],1) - else if("adminwho" in input) //tgs2 support - if(!key_valid) - return "Bad Key" - else - return ircadminwho() - else if("server_hop" in input) - show_server_hop_transfer_screen(input["server_hop"]) - -#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round - //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored - -/world/proc/AnnouncePR(announcement, list/payload) - var/static/list/PRcounts = list() //PR id -> number of times announced this round - var/id = "[payload["pull_request"]["id"]]" - if(!PRcounts[id]) - PRcounts[id] = 1 - else - ++PRcounts[id] - if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) - return - - var/final_composed = "PR: [announcement]" - for(var/client/C in GLOB.clients) - C.AnnouncePR(final_composed) - -/world/Reboot(reason = 0, fast_track = FALSE) - ServiceReboot() //handles alternative actions if necessary - if (reason || fast_track) //special reboot, do none of the normal stuff - if (usr) - log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools") - message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools") - to_chat(world, "Rebooting World immediately due to host request") - else - to_chat(world, "Rebooting world...") - Master.Shutdown() //run SS shutdowns - log_world("World rebooted at [time_stamp()]") - ..() - -/world/proc/load_motd() - GLOB.join_motd = file2text("config/motd.txt") + "
" + GLOB.revdata.GetTestMergeInfo() - -/world/proc/update_status() - var/s = "" - - if (config && config.server_name) - s += "[config.server_name] — " - - s += "[station_name()]"; - s += " (" - s += "" //Change this to wherever you want the hub to link to. - s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version. - s += "" - s += ")" - - var/list/features = list() - - if(GLOB.master_mode) - features += GLOB.master_mode - - if (!GLOB.enter_allowed) - features += "closed" - - features += GLOB.abandon_allowed ? "respawn" : "no respawn" - - if (config && config.allow_vote_mode) - features += "vote" - - if (config && config.allow_ai) - features += "AI allowed" - - var/n = 0 - for (var/mob/M in GLOB.player_list) - if (M.client) - n++ - - if (n > 1) - features += "~[n] players" - else if (n > 0) - features += "~[n] player" - - if (!host && config && config.hostedby) - features += "hosted by [config.hostedby]" - - if (features) - s += ": [jointext(features, ", ")]" - - status = s - -/world/proc/update_hub_visibility(new_visibility) - if(new_visibility == GLOB.hub_visibility) - return - GLOB.hub_visibility = new_visibility - if(GLOB.hub_visibility) - hub_password = "kMZy3U5jJHSiBQjr" - else - hub_password = "SORRYNOPASSWORD" From 5a1123e09b9c55f256fb506c3d54fb4b4cbedd8a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 16 Aug 2017 21:05:49 -0500 Subject: [PATCH 15/70] New telecomm sprites --- icons/obj/machines/telecomms.dmi | Bin 23547 -> 20556 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi index 7f5f05e3aff7341313167493b78a2e3c00d08b44..4a6988f88e4c96aecd5ba92ec5dca2ecaf2aa7fc 100644 GIT binary patch literal 20556 zcmZsDc{o&W`1cGkmMle)ZKx~}LiQLXsbs4}wrNGSu}j9xl*$@q&6d(aWXT#bV+~nT z$U62V%P?b^G244aeSh!oy{`8U*IaX)=YF>H+@H_=x$iSkRu-mwJYqZ`5Qy)>`LmZn zAnaungj zEyihSuusy<`M~Qp(3m`Ko+ zH_=FiR`UmJeEIUX4|P0@rlEbeIRZ9M6L*wm8h_*y;j zKE=8ndzE$Fq?PHqV4HAF z_Kw}ngdnG@E|=PR<02)}Ecbp*5-EaK(rOgDMuR*~U0z$dQa8{su+TjGE1mITS?htw zxiXo(xkBrF8AmV96FjGGgFw=t3ujMXy`Q;K7Z%{uA2v@i=O|pPm|NrrnOF85Xn>KhiFJ}H_q@;m_Ybf&@WuWt zAu6&Q7(-=>YdB9@OneJ%04-(cfkc-1F1#xx0&na@cbKGv$%|k-%qZ zQtAioGTN_4XLMiJhHA|=(hNVf$!8;pAIY=7_KK8K_&_SW`$c`Hi)%l(=rG4$IoX_M z#2|_7^0)-@;k|=nzaJ$cURiZtYYEP$kB*fci-7X2)YiIQ>5e80xE>YGM=BfFL{Dm|e{pcD82+jA)Fx?6piRMFA z&)l|nd~w-z=Vykt7Y8OERzv7y3>k_$|!cY<%lNKY206*)s8-#GhG?y*fUS~ z*1M*Ef8KTeIQ#xcJSl9n#+9E4rAzIgrDT}-z#TyZ+GH8@kN`%ADFStFEOs>PNoKxR zWrh?T3%tIu-m}rVA!5D5ju{^xA0>Y9P@{?CTc(*kW<@kxkKkKfGcLgl+-Qo&PQ(0( zlQjOI<=;1#_UuK)ZiP+~h8Rvw4_UjaO?fM`acW0*8Mrd)N04_VFm1P|2AJgy6F5dN z(-T>|b)^Hi*ovT{dfsL)RZfZYV;+Qt`WM6Kdc8cqv}VjSgGV0-frJmCfvF??HtlIW z2-*S0#5T?{m@o;*t$45yqG?|OefH5)=?|z{om#Z zb-~|!&UkO7>PTC&?eF)PR=5*r&M4}yc#Ba0hY;(7Xm5jXCqHT)WolzxPa;H3aq4vJ zJj9R^v`(;bp@ywR^q_=63&-KICqBSF;38+`=__^1+;2n7CFtL2R6eMI)r+kd7cG#< zyf>kxI)k3lRMOH^`gPGBR1a)=NRJ-spzUDp+BmPP^&r{f{-1BmI2d_eb)rthr5Ns% z-T1~95{**ouKS)0^PVyrEH1K~>`j!Rz`lqZTOLGhhl6OgkP;e%gOQj{Ze)OvFYLyq zm`tfqc3`=(D88d;*04l>;-AJ#)%PY6ZWuQ(Vzg*D$q+#}`S&$5)KAmFoR2q{PcK$7 zt)rOoAE@!nYo5&P^E6XlqzEO_6?_O_AI8g5IX zT+=xvW1FuTLW!Ewpuez0nUKuRHGs=()b@!|1X?tITvHjYT*1mSTD$J!X=fa&-9{{q z!kclNShoUBqE|;gZWsxq=o6EtD+^37ar3H4-t0p#c;o4Ft z(l+fH6-mne%27NWcw}8Zfl1vVi{zr7QZ%zq?8mtq{)8V|6Ut0D;tt>o`F=8-FmlpvP0N3s?(m zCV6@W$JqG^!VIp3f-qD>HJ6doPT8zdG@4jQ$?wZ{+DX;GSJP-M_s|!F91#cvzmawF z1xJmhJ5ff52+AnJd$IF|6k>1-H5Ztg-7#>k8hSxOtW_I-g+GUGx)2MCrG-Q+*9r6~h3k&(uE^$^>mMhFMiTMRS6O$3(84Y+p z(x{kj#9%N-^a;Pd3nVfWOS$866mIzV^b)y1D=RCXgL|Q{FtOXATNCw70=GSTq$FTr z_QzoQCooT6Ngc8aGU(#=TdwVu-#v8bN#pQgqJ_fI3?zBq%{9d)6vPz3C0JpOXHk)Bz z3CoV5zGqCSaKqP0+2X2_NL>j%O3-0^8eEOPEk6Ju#pi0P|B|;fpZ?M-t7Gemu;%vF zeda!Xa~{d<_F;yp={cjzkm!twxpewfXAKPz(2RaayF6NDO{ozq>*U@2xLZ#5yGz+C z?BM9A<4OA{B(dWKe2c&B<4Hn5SkW)GufGwDZpTvC1wW4hc)1%GH1X_qE(oMu==c;H z#Vwu6o}b@)%=}!ZOBq(!-wAMnj?dkP-n<8KjB0A(lP~evc9h#&*i=w zfeqf(Y;C-ln3(wG-mLl&ArL4wj?FAJ1!;SS?K9ECgrGum4*Dl!95>-pR;RA`>1>6fTKQYRFbH;3|aOF3ECHA5IiP3W1)GtNgsRgyf{f(xryjBZXeLAc5#!0* zPwDBMNQ#0$yOuytoN@9kv?Kp9Z>rKmRjAD$V7X%Do&#$&%>hd5RNKqXFQ$6kx{F&T z8yTM6@us*&4=-{61MhR~k3)3{c5G06xFI&$Qk#(9U4i>-JQP5oC$A~w^4in=BD?%!bhK>z3u8RgH5M-_Fj`0TX%#Sx zU|EQh)c52Qp&5+eYAut<1Yjqd;-6Z5iE~(`A062G)ViLSv97+=O(f8dIx~L=K9HhI zY=Optw>`gyA$p4P85*i|m)1lo7EfB3uc;#{jWOcl@hJuLUw&8f>BAIPn0nC=$#gwN zKy}hqB|CyS_zX_26Nma_-&VWswuGMk{c-4$k$ZU0ow!49lR?|Fm)qoF!tmAb{Cr}U z>PIjO%SU6UAOZkf1pmisasrQeGv;MY1_z6-d(qC(S_4NSO14YoeU7a9J;T(c8ay0G z{SmhPmV&o9sNP>t%+LV|ufsWgNP%UvLEg#bkPZLeq_;Ao^pCT;Ah*r-T>68R!FG}E zR$e9#;Z?kh4UCuctDWfnvZB*xSckRK(l06Tj*_ z0%!?FMgXi%dWih+c$<{X+@w0VQi!1x(j%L58s=PvD}x?5chr?X>U*>4ZEm-O;%<|d z?{yYa_Bb27fJre^(Hx-ZI;3y{MB(Inl_slog`s-IvL&velG0|r5s*N7bBa0>|n9k6cLp6ohBx( zb-X@3<(wIo=HR<(6LiQ#G5L&EhH_TKfHC2GCtbUJQE5z$PiF#4hE|34>U46tIAOqfjK|z7HG@~dF7CC(zG7ZqsyHta9 z7)r{pn8u5)5$45yinpY04i_iFaC1W6Dq^m{c)JLz<1dBYx2~`I{u&%iMYgWi(5jQ4 zM&Okd(_GYBOAvT}lS%6aM3H{{a`PEDjnv;yE~ybqwX~de)GCO@eW@OrP|19C%^L`y z^2x!D(Wc(#PAmakKbh9Kaf&uapm+swHKIu!4=ClZY8udG6D{3Rv|FB^F)<;1?UUWZ zOLKNF*k70$wR^2;v)k1@2yAEW6+nv^VL3ONJ~|kXs9K&z^W$~j)b{SqJavpP6^t$W zG~+Li8u{_I?G)|A@VjS(t81`NMOt4Xym3y|^co5#om>@YL~JS#GG|zhTq|S)Et7YI zKvo-T+l)ze5T?_k7!2aC)0^;q6W%5dU)UVX<^+9xif0FnqB~kjCpx<2-3?ESJoM-< zaz44&7C5RdWje}U=3{ohWdo2%3H%`h_=eL(%_U@@=5U-;3+2zBoK95*raUaG*$MxJ zhtOlEdgyj54*5XLE8gH~M{cgKvkZLhPYHZ3h6?)lbe}d9q_@4=g^v)O29DI`*47+I zSo2V%$JCqs0vX3&96LlX$8D=a9wCWcG?vFwt{RQsrFAs_G*z=-$g}3>^WF*l{>6#& z9@Cq4+*>Fqg&GtX{=7#j2`2G8`<|Bxux2{BQN>M+CqIAc1W;E}GzAYJ>#>}|vMe@e zJ|(k4Z-T@^dI(Ji&dtb&<3~m^gep{}383KR-`1KUl(8{!e{=IeQNqg3jnO-s`UP5O zZLAY?55=7v6n4V@8MF-yE=v=9twlNl(?zD;oa@v?1#h35X3oUcAIE7Pl2JV*NSP^^ z14tw2l(O>v+%^E;iL;&c$E#u=BZ*2;a5eEh>#LXF9Zr44KVjgd;KdoKDK0r;-F`YZXD&qTFWY^c=%s#UzM+iLQF`duApm!Dt zI&SbKxS06mIYn<- zhz{wu(OFw-0ujU3PLtoHPjEsY%JHDy@o}k8$RSo6)MZMmW%jqmeds-<8v$9 z`jHIC9r**VUb4mxi=ru^82;1m!&M`WaKVCh#VhM;#Qr_tiG3Po?1)# z`*$^{_U(qASxmav4R@X_o3b!^a-+7y^L|l(C36dl6z_IDJ^NDS0tqhF!@H3VULIF@ z@OLHO?^2GJ>G?XSli`BL55xJJJ3F7;H@)?o)wlc$m~L7ROdRRQpA1^Vq}qUz|<=l1c6^ za?2Wf@nh*zudDe=3ccP>6LO;W5L3IbhYqQwgLh}3^aMVI8U1$O^5F2!xK5BFl&hMr z_dVx?$qaRd-NdUG*eOE_Yg)aXog6*4zuqMbUbjhx(yiRs14x*l!!T+5udPe0Rf8X+ zt%Vs$jex>q&E)ay_}frnihokEJ}a!|!oFuO<#qcDYLXDbXFi`>GhXjfoCz*a3W{vF z^SUiN94S4tm`#hG8yUc44ztBfV5W8Mzo}7zHCCaPgi-VQWga}bQOJ1Y6~Hj}G<&-R zbH?^0z7Nc|ckgQ~Rtn^Utr3G>vz;a`-plN8v4+DDBb+*hhTh_sC;^qGaB5LQGi0?8 zr4An;lfS4lrsiClRso;(o$_iWb?5ceMC~~9CHd7f%!PV4`7W(zeIq-7dbg{E9Gn?B zTy>M(@Ke#bxygw2n}HR+PFt8TA)#-)plij>PDD1M)S7B7-efEpT73@FnHsN1DIL=z z*Q|&*I&EjK6Vw>~x*ImO^VFQfGof)nC*?4^oeUWBG?IK%U=F4Ob?wef@(EzM2 zjMi4okiJj=XcZ4ynqa?76PW^E<~FvWb*#T8GBg+l-*BUlO$PPPG)&HLLXDaBb_>$Z z?9S8;FDg1h@i4W2s4@`((s?sS5oio91S@C0I`^TXKkq5qhYRP8E{IRm1TMv<_O7kf z-d|}wA_~C8l|4GiMpxJF)&{PDsrw`UkOzI4hnP~+_*=>I5&5ip5(KP z8u=CQ?8WbHcAeaZ#UrS2xXvr>FnMpoY1q(uaYnH|BQO{DdR^c?{$!B^`5fQ*YXJ0& z*jyPqbx-);p@qWoeF|nAb`|dEXonx3=OGh-fG{<()*kNspN3FQRHf|{drSudQoz0C z#UI}ZZfZ`x^6x~X%Rjffa%&GPN=C4u+7{E?d3$gcSuImp_0-L|_jsxE|a-$vPtC6TDcHec&c8k_n7bwq`0@Gux;3)6*cM8V^G_y&v9h&%=1@ zQEXyr+?4RyAhbNmh!8T#0TTT&2{LIHN>{&;R@?;sqY|>s8bZLS*&8qq!{qCveE{sK z03yfRH#ei=_FCPc^(KKkkXeVMG4J&xq@Sx&{%fKLUMiw2qKK7e-8PltzD8?`5SYe~hvZ&Eg@)Gp9{uZ-#bH;4Mga~vXL(5)&^#zYLZT89 zCk;Ii2!XNFvrhz!^zq1lw`M`z%)DhjkL72bm7dDyPuN8Zcr~qU4qVM~*qfi_ashAI z5k;E*@ zL&@I1(m+9e?>%=$>1A76+jlRlv}iSY(!>_gFAPWEK)+0)u1om=wwA=? zoODr}YyaHxk_8%of(BZ>k_?vs7fAGwTK-KhFC|H|h|SR?KKw6;396B7RQeM}nTePH zWa}!m@x&+C6z#aIbiT*GI2UHXb$L@{KWLH}cP34@4U&+>01$l--p2?~cTUBxr_^Ov zuk>`W4}ZKxv9Y222!3LyKot50ID{{5y=@&2v1sE3kJl2b^?W1xD7eAoFisaW4 zk06(-EGC1o8nqvuCjxyOCV$xNku@@7qOxRfeLd))w)S+>A9qJXgJ%GsfG~f9ppi;& zTzvcp=Z&fGjGYU>8A z=+3PU#SU`z^diig>Ls6pvU7UY*(AW~VZ-aU)kfMfm?|e1D+21wW=b2Z#vB}w=Kixu?)mSs>t_w9YR26$_>&AY{e{OG0P25be_(JYK$2qhqvFpuXwfB{I<(6@5VD=a=v7zULM9k<9f z^!keM^xOm5D}al++4F&&7l?!wwnlygZRG9aPew|^*?PMOqqT#POn)BAtRE9VP|c~+ zve4d8<}A6VyiyUzj77(Ppz0sbD~=-q20c7g=vUE&a{)*b+gg1Rm$Ct60}?qgw|+$J=xJ{Y<>iFA zT?cSsE+WXtdRf^z4q0W;cje>NPnEley(bWL$J_@<-U`o}{>|tfqV#ZK>>~?jom<AQmP0WRJqY{ zaB~YW%5`enk>Th{TPn?7gd3paa+$v&GLh-$M>7@3jSW#BPJt*H%5e~WI|fc1S5VM# zMf5mDTzgLFHCKd$+yP{ot6}~GRL9Db`t6x46RHG15xl~-TBF2t4y0wszHj5EdC>i3N{TQUC;wyFXHSUG7ANpqAI=R*@)k3o?X1ZyL7kIPOf5vGT%E zqyVMfN7;Y1io0Uvdv zBW1`(SAI!_5dL$~pP#!5?yxn7v8>f17#G7&48~fM3vbs_KHav1MdlB|@ zgAgkCXz+byMn;Ac)&0?VUO0Ar>h#Gc7slC*vCa+-4gtz>4Tmn05A)CT0ZXYXkx$MU zx`5)cA_@(x@&3@j3~Zr zH53=Xxr6)AQ|qk{8x{0HZPL)V;bD8TR<}4>^n6C+>m)>}(;;Sa)c&H&SZ`{_G5X?M zM&t8HD%5`mh<*n5xd7_-dxxpGxPx9XN_XZD6~4xTY5wbQ0$VwEOy zs!3fgY8w7B+=1RCj|szX>4L2PAk-kV%)b#eU=U9KSQZYju~fJc_Da5C0mN zf`~n(fBSspoRA&9`SCg%1~{rfjQK3}Q{LR3#W{$zRz|;lDWF0V+f}tu3u1y8n&;3N z4ZD9@Fpr!C3O_NijAW;9b;hyz);e3|{(3lHVVU1Eqtm2t0`Cd65`$X!T7S9rd5itM z7Eg$|NU|sFC+sKg(FQAG`Z_Z+a}o>L88P^XOU$S2#GefL zLBr0l6W*GF`ipa^3LhZ#Ww#!HkjI`v>Qiss2c1%qgG^jk(*^b1+Hu{nea?8+a=x}! zd+w{txGc$s=g+5tvQH21sJHeGRQ4@ImfA~S)y5-48x<0DpN3Ii9oY>YPvZRq&-nXm zxO;e*Ip@%e@|YY7_G%S{Ub29QcJu2U^VqK|ACDYY!4Aghgh+??hrU67QS}Jvyc4G@ zwHr3K2a7(QNU|0&XXB8VpXBOyqU^(NI^?eD;~(Z~wdGMjKA~M54J{wR7k_&C{La{AR@q0fh3qx| zSEP%{jDJ44$K8VzYV0}mNCU{u6)c@+@ctKCfoU_jiC>n)Z71nz7kVBFabC9p$2`3$ zG6&Am_5YRvGc=4N#8!cPw$_F`59V5CSJFOx{``5NZs>IM_MG_CJm)U!m45=jXp0Txucj+oui>P!$2-UREe*SU|?1f~pjH8pqf zt4HtWVsSduWtP}6%8<{DTShhqr#O?8fURil0otURimS`O1(1yZe@q1 zXa_~#&OWkxQs1q|NIcJzJ*nw*d*smUd%1l9r}f8>^;D~tFK1bdFRsNu^{})d^ti1gisP@S#@yk5$r!v^WQ$O=BuZGQ2D$RX>T<~Cj|6Tnl zndFN%nGE`86E@bU4JrN^J-bCj{}ml6|En5m3%uv9N}X^1Pvnuq4}e344m&ItOrNwr z>?VKUzvggt9t+wKplW0~U_ZH4SsT{|fgLJutoI%}ZeI=xdMn#}o?8{X-U7kAH|r@asY@^Y;K-lM*6;WVk1d6v!dRT|Z9{OhPutDQ4XGh>Z+RFG*;^_Rqjp5* zXCjCHpvpv1Es=1$6bkyjO1TXj_;@wCzQCE^m0kx`>H*}bo2c|snM>kqUNRPqU|Tm? zG(LqS@>$(vR(h3Py0PW#Is7h8b+s;YO+dn`6}?*hwT@`~dKg7Au)2rq21X0u%G?HF z8B^(*rfD|{vX&ezZLtMqvc0*8rIbF)`E%^z9mQpQ>0K?XwpV(c$XrQFmx!meSm>&5 zAW~*1h~(-^>e@DXPuI(aeL#OeOAl-i4EH+JckPotmeF-M`C{_dPkNuHe9n9(-K}j2 z&r2X2mZh0z9QU&QmfG|tK{Y*VCc;V{$!cWhRGGG40 z6|(Pa$#@*aN_zvmBJe#^1ke$$4t`ftrzzDE3s= z`Cy{$yBH zBb9=PgGUVgPT6jpGu%@Oul(Vz^TEbZXYZjcB(qCvxFy`l@$qbiS9uJi_6t|jAf2X0 z?~zJl+%{uw@hg1TW2Y9q2wwa2QVIl*o&>MG7nK6_M7M+Qr>yR7Fdi8zLl;p#H#}CS zHaJkJZsbNk_7@D4u4l&WMt-!JHDwQ@zp2|>CA|mTP^ue%Usa9=F15Z*1wEMT$abiU z&j7@e-6MZ-&Vm2TiO|#f#bm(sD#ynhRQ5Sl)2@Uzc@u7iR2eUrTB_U)tZ@kxSXtM!LZrLCR!?hhaXYW@WeZqxcT$0-xLFpZ++QsHo_P?kBB6n(+s;JUA&Y zpxEj;Ar3SnoJ5khJY^LS=C-g8WOU`H=C=x+<=w`XJh*q90DV~hu2gJ??JT@A3_;3)d`Cw~nk2>vddY5a zrm9k^JzL_Q$&x|geP_qkeW&8xGl$Teo12?|ABG5)0#vn$866PjQOcqLvBA$=O9#}z z@83YJ3~&qTtfH@xbHtw(S-}5Qb7}$HSKgA5^mmD$EBYB-OH90aQ5)V?$ayeWXLlTl z^}(b2G^6^Q*#9Ck56(cLU zua14b#t}%O=N-xF-t^dO+1e0Z&DdP3Sko61bN5;Pee_z9|C&~B?OU>FspLu1z6xnxz{$M3{4pW5Uz%-lXL zlQr?@VnDa0(CdPr)#DfUc*El}aUuSO`v4(rhoUzP?M2`$u&WyaM_Fp96A{`f#>yU8 z*`}gNVC#Q0UjBus@b4>53Rcvyt)T7Lj+rDzBoDutK?t!nT_q*M9&f)2WriJ3r-kW^8tN9 z_bZ;F4|~)P6qZHZSh{9Fi=2&t>E)-YPC1L91FovV-@%+{ev!;b8*7?+5Bj*|a|A)^ za{%eda-*8A?&8jfr&b1z+o6gR1v)Yfxpe=gu72D`voPEMm4@1Uy}NMPV}uV3QQr^cX|lKYQAWC9o4Iv7j?P z@}j!1#jVyhk;R^5LKC;mift@p1TA#M`iGb?A! zZXQK@lQ{I%7U5w0I5k4*dVx1Jb?KS|?q9;@D6>g7&f!0FB`-AOC7DMR$%rs3y%; znuE$@F^#UoP@LyK#;J^c(Js+6F>&LCNFtt>-V}Dd9LCtP;c* z;VZLr<-mPrA=W_+38lo(O7AHXDJMl|E5{;FKt+`8C+-I%+G5?{C#&?I&a$scjjiKa zmP6GThV^Ibt&k18YGAc;`Xkluux^g%W)x*~TH)P!vI{kE3{9$5#AY(sEgr?5q$9>Z zZ81!xtA@{xQY;m)@wD7#@U!^%T1Fm_#xlZwBVE6@7u#=lA4hD`j&HDS36|`ZYy_We z6qp1Zu7DeEzXUhm!o^bsGw6yG8407~i}(ok$Wat4=$A<pl6% z98dEL+K9;Wed%%7C1RrEwA-9(+4W4ruwi1^w{PdBN7r%2|N8RWDwv7z0lgT8)`QP_ z<0SZPXoCFGDH{TLb9KbKS~T zORrzvxzTtYD1sO$bZ`xEdiCz^;01_u0My70)n%Nh;No1&37z(PYFG!%P=r@|0xd*l zJ@k6B>V9lj(}!49&lDiVH+u&s{OatGYNL$qtLER(M+8}Bj0S7KO{flQ9}8JbS{koT z2r;)39C=2Max=nxSC@;hP9VbZLe^Pw>Q9or4S_c;R2I9L0c&RNMm1&tq5+~@%{zVO zl`hqM@DpoOV`Foml=SLR^ubtMKHBp*dG&U3&!89+xD9n6iv5q9TVBKG+lhA7rPoa5 zegnk;JVu;G8T|5AoXEm;0gxm_U~XrycyQq4@C%Fi9j~pL;*%%<_f6Je*M?VQVp*lV z2wkp*__OW$^j_oNb)i)U=YPVqw(Rw?zO9bcR_H*x07I(fGaqv?n@fR{lZZFT#QEUB zKoh-TjlU5YAopLRS+NhAwAa3U^G2?d`FNt3?fEf@#5Q1@M%cNxF?=%~QWxf~T$NQy zV*djb&#))<8u#`uv-%lM*j##3KzP5GY(EWE_=P;_Ueu3NP`to1w#U@^>Zxe|A7+4n z13^hc?ySDsPncbD)~jU&`t#~&mpL{dlPD)A_XyJWuBJw>r}k!oB~}rOfFuF+vVM^M z{{j84^Opd6qoWQ6a_9STA3wIQ`=@#2PEOtgOq-!R&3)dQr8K8-Ket3BkRt@3-&(Hn zki5>xrfEE!kBE2(Xa@O>^G@o5#YmX~pS&4|C*fNK^Bt24la`l2nws^$gbm@g^JM%F zuRAwo)&;+{OJ~!nyK&xKVzKn0?8zEUj}tY%M*wlf+VA+2_@^ym`z3OH@+S137;^x? zqW|RW`HG7Atrg1K7*7u)XQ@np5hUEUz7reAsluHA42g0E(9`U=Zme9fyg9jXQZF|b z49b$X5SEmem$z1et(m2AHe4s(jdRkuy1vqQn%Yn7ntZv(g_4+9pQ228YsS~s2TmKQ zUIDm67Dzw_s4+-WEl{|kmaJg%GqRe`Fxo}L40}vsn9L!mqJtVPjzYNNeDqYhAtgRW zK=eI7@Nve$q3Tw^(ltwgo5zvRwEE0)xIC^zCS`y;7{)Z#dsDg+-rJViwC{t!VFlQ| zt=4|X^~R`yzCCHCukJp{{$K^z&zq*dnu!k&%g=C2M}-Nl zZ=T*WDc{A=p-Qtqd*nZ&CJ0)ESMXTkw(Q?&9~Oj$a?+s}W6h{AVM4&IE-CPSq3{a{bVLT_EsitDp*him7lMcSq`Z zHc*`3e6Z*+2^X-qU&X2B4pK$xO!1)`@7FnO?-Y@!-*#bihkdZ3$B3>3pz7XCx-8QK()e$DRZ>?~-;!n83 z{uP0)6y~7H*ppd(piU%&7($wxT*cKL)E@O=_x>`;SzbB*IE2IlOZ}QveO4jvq12f% z7yNGIQ;gQ`-!U9f;%ZVnzRHzDa6@e+-K?ZH(*+_uA_GFLBa9x+I(Yj$|Imuk0SQaPv&Fl%6 zJnRsX6g+hveMafpCnLBSuOUqR(R`|k$$XU1g2%mv;b45r8$8|VlO}@4&Vko+Bqg|W z-vV&7eHMbzBH1BZ*J;yJEu3(}6t{qrr7qGpnXcVgO|Wr)fdRu!VSXq7XX>cF742M@ z?pT!1p4kz-*Ji0IU0Q0wN5^COZU79=q_wg#c|kvPpoZPOeSZLXA&Iv|M6#Q>Hd5%& zzuwWs=*s9Pb~K=dwi?g=x>yQ7?;W1Kr}v(Q>iL#a&q+UjE*y6p{CsdMWFZX#yk@{* zYJs-y3NH;bnv3W;{zLetA=}HY4Rikb_%rLXQK?g-^8hbd5je5$q#qT?5X8d$K;OxY zE|feX!&HHEO3>dw;!lY5E3#U5_>b?v^X~G>1WBGv)!B{aq1E2~V*lvK|A#1;9&_0q8ed*0Pl$tFlmgp%Mr-&+V;NFcMlN;+IMjS99fA5Jo7{b z6*~ib$oHdOFgh2zD+T%@E@n(Lhi?N~z=H+hS6QzqB^_NU{R}1RKxb-E}gRtVIE1EwRcpz zbMh5gta0+?$75WOl`3c6ZgmMTuuK5RvC^NES%5u(x?|MF*=95{WX+=ERd6v$h{Pd< z>5S!rlNXZchb0oG(|EUfIvpdE5d&*$B?SCgKn0DzlJa(fMUNHZ6I?34os0sySF$!iA7w)g;TObuUu zYXCClx@)YO9h=Xrmp#8fzboYUJZ!1X9nd9;#*=|ae6TfF!KTzHI=7&J*VSBq?TNKw zawCIIH9)h3A={2%Kcu3B2&H{mAJJ-LeKqG!5E3ORPnn@wfAxs80;o;WGYJo)d=V#B z*+oZ$rL}KIAGoX2(MT(!Yrl(tsG9jkT}R7g4{^_dc$5|8*}j z39G@v>*1eaR1L=}7rt}a-ktvDtvZxP)581*kSv@B-aN|n5&j4i{$UMDZK4BV=$rjO z739*W98oEi@COr1SKyJ=t-alT5of*Hu0p`w92PMi7m!uKPUrv>0e?)Q94?7hlrW*S zUjR~wG&MzR<2)k2xaYo!EG$hLm|d+_gYJr{OgiV))%K!f1W$w(>U0DIvbmP%jhh%5 zQcWK_?1uWePU{Z{db$&4_aa*Y)v^KRPPTzQJ_nT1NQMbsD8o7KNZYJYKe(7-voyQY ztR;+F+AaC}@RkZa|%&D)-6$cMr|J-UD39%*i9ZyWMzgGkzVch-r+egxcwF6vI^;SXY0EmmZ_)nh>{bXl5N@z8&aq2`a{=l^yAVH>D~K2 zv#)i<{|1xiOqW4O(r$3&5*jv2H3~EGONN_@e`!eCdGwVCBnrho&)+4GjJEVQPCuS9 zBOxArgRR8ZGa4F*am+}vAGe+NBi~Qpm&H$>yJAO2UHkV4Yva3DpZiXXpeT6>(3~yt zF9PSWAKvmgI+8{ppOF-G;5E?RV{oKD^sE&%ocN@fCf@%)NbIIulSlR)R#ksRiaB_5 zvU4v6DbyLax#T}Zdp*;Z69gKpr~q>mJwF1w1-a4xZn2#aDS;`$`_oK+(~gnuRu8Lw zxfX`uC-y^rjgJ=rXS}Y?$phLfPxyM}--j9W>@KP*hdt-X#$i(qX2Q$4BD4_SC?+u= zVeN(_nslR_blS*Z-z~@BnFu$w(u9cza}K%~jD^u}bkUoJP@01#m7^SHMT=Nq-_R6r z^YgpBbn5j5P?i?y(bZ0NU6=u%nu!_Z)N>(uAE^g(r-9ei8eaU&CWcr69aiL8u%IX_WWTleL$!@ zc1^TBOpr)}CL?7Uf`{YfEU@(?>abtvB6XJ7l*gQ@d|An}kxJMMG;AJDeA zPBY!0g-m8l4_o|CMpyHc%YlB-J430%5p+ya<;ma0=}>o=^np^x7_*x%Gq;+o z_wl!qZ3X#<5p@SM@9Ip=DfKbG<$gcf zo&abEluNcYR0{u1l(tWlvECPr?mPU?#@`=nP%h1k{1Ye%&9zXvj?yprYbTpZI}ACg z;osnQ?+KuOr18gAL#%&$s9oSC2jxB0cBH>9jCc8voyb%Ewt$C8$Ziw zb16${qWoJBIeaN+QoDpPP%Z+z(g+k79{^zh_suqAbi5NGG73nEC-nYYf|u^eG92a! zBUO2G>;gol0UO2t0CH?=X$~=#j&s36E<~Yq>EM3|5q@;2ht{eM*e-Yb!3H`p0qSMB z@p#p1r@uxYJ?v;0O#%_SM6~SJ&LnFN*e#A|bV2CrXhibrnRg9Vi>i-KivC9V zN~!a4R>CtQF0pr_6B3y^7H1`as?~1z*D{Skz@`nMA>4-Pg8isN$8SM z$Xo{0h*a@~a?J+euX)M>b%`j+ytaLs18(7Q?Vg%9Hft=u4@XIhkzS!pwLYg%rZkuz zf74n^Igi%QizurXwcC`8heKkF1wTW!y5hg=K{+`%v}@W@Thtz1euakt~skVc`0fPk!nET)~!KsX|`{(VE`<;~2q{&4!t-v3z?xhG7MLt?(7+6VU(3%sv%jFvGE3;@4 zEXcJ@`E>5*yH*^grx{HE3N{w;q3b3eMDZkWU}`01v%k0Y`3Ln!x7(634J&lOx%l`W zo*Wn-A7^B%R6p{GOb;*$D6v<5`1%^K)OQkH>lEvCLlr;N(9Ca_!V~@XAJk``vktO{ zxB!y@Gg9hGiw}{DcHkgnm}+BX^>FFS139?OX0%Z-ilAoah{i|xED50&_7b)bq`yt> zK0m9yYfA2v@s6ax<8y>lCSxxD9N?(LR|E{Y6lr5+RCfiyVYq6WDnNYFagkYysss`G zo9_6=2lVp1=$d2qcH{5ks1Eo?@8Fl}pxN-a*%D1h$8RdDK*Re*ZN&7@?rz$yy-~(;x(Yf!W&aTvm*gi%764D zOsjJQw%KUw*>Kljv%n^9+%M_{q+{m`YX}dVkWCwec)ZRIUm^nAT`5>;Q0u7%+ zllFz&LitgSGI`UW%JJFv!3OSZ9 zTpOc8&#OwNbMBdAA>4>$T?9e@@16!Ihm+7gCI&7Mro^;-p8%-`b+3(nlkLY)m6lA) z^_t}B?Zwwr>X4+_slQ+0(+yk;1j%sTwjs)&v%Fw<)~=xNkzBqf*Vtk>>r zw9}uoF+53V)lx-_-u{5drm@7}rSKahUgXizsnlH4_b;ph&BwNhjz`#=3?5}f!*t5M zacoIKzk6&Q4iY%pe>i&i^EY0UFz)QthXCb=WjFEhLox!Epfw`?C!g0Y_SkzTwslY< zBNENVTL3l_RlcZ)LP3J6tgj?157#qb=pb3ENDVwm`wb%?Dl;y58QTA`g-hl<9-{;e zJQhP4TjmGYf!%Y2BD&M*wv1YSTcnCi8_=#st*stE2jKHEBb6)EZ&@#egX60*hJ8xAUBLS@H8xGK zU&_nPL5s78?gPiu>}So{M!kO5eD{YzePLt!ImI92?5nkcsgT3(2|Ueu_4YP4RUK{- zStIpcKhf?Y-sJcGtdtDPma)^DrdmB%qcehjos@~ipgD*ka2gcxj6~J|o+l9tb^T_f zn=R+f7d@#%(RUHv;wlYZ8T}Oeci#DZ8)EI}-(?wA0F~)?V_U?=l#7th57-KQ>U)$T z=CjfzT>Qh-Y3_Fu7caIHr3l}%DbOug1l99vXdlJ2tvOUSUEs+u_P&`@A&n3qH5CPB zu(nZCy$vmh*nDWjQk2jY+Ne6r1bSXBr^iQt0qoRdn$UVHizMG`pHIR7K z|Bi!6<|^{F0Xp!w(VQk`Fdv5*h#jnTtmUhpHvkNs0hKd)^Z5P4`;FXXc)q#ew@G>6 z+(75-z<*4^(f=t}{XTLsU8H@#^;M)twVN||U@#MIl74k88}wzklDj>KJzbcFmT!y? z@FQ#UU1JDV2_h#zs0k0aU0-hjYtb$YRm8o;5?W`|jA6^$=V-4^>uJ!GCQ?*En-&uk zbmh8!RHNxwWn*{T1rTCjFJGsAyOof<%qQ*q0-&x;w8>X9d=m^ERYhd%Q|76h&iKak z2@-k}_NeFz8u5N=dMY}6S1|$k$viJ_-P467@Du7B$A(NL`qQaSl|Z~XZ0tpd92QEJ zaXEiESj~=ZvlpWz-RJ3(*T`Blz8d~$p|ICcJ%zdS4$tewMkDoW1lVb9h?TN_&p=W~ zE5yT@J-QsEUa$K53cs|WAxvN&Jo8O~TlzYlPouu;wlE;gp+0L?oIJj72Vqy5!}Bu# z;q}R!43ws$5bZE<=Q=iNK~Jq^m0{F`FkuoJvGR0VsMd+UcgL}R$>;)NvvKgbWe^YEfn#Wt=mx~9PS z(8iR5Xdf$GW$;&9e0-*+n@yJ(Ru-vq!|En@tmdxE=HsfnQA9U4@%Zo~`Dp~!Q8P1> z7_J|e;EZ=Se>#_MIvkNeSc7Aap0czsM(fv=bsW>)2IQ-;xYob58{^&ZyaMOqxgHZM y@^V$3PKO_fgP50prBzk!^`vGQWZxXL`hxg9yI(%$WCE2y*#6+KAjX~(IsXNCl{cgS literal 23547 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 Date: Thu, 17 Aug 2017 09:18:58 -0500 Subject: [PATCH 16/70] The station explosion cinematic now uses the old "far explosion" sound --- code/controllers/subsystem/ticker.dm | 16 ++++++++-------- sound/effects/explosion_distant.ogg | Bin 0 -> 15355 bytes 2 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 sound/effects/explosion_distant.ogg diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index c7c50f4d04..e07d2db001 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -300,7 +300,7 @@ SUBSYSTEM_DEF(ticker) if("nuclear emergency") //Nuke wasn't on station when it blew up flick("intro_nuke",cinematic) sleep(35) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) flick("station_intact_fade_red",cinematic) cinematic.icon_state = "summary_nukefail" @@ -329,13 +329,13 @@ SUBSYSTEM_DEF(ticker) else flick("intro_nuke",cinematic) sleep(35) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) if(NUKE_MISS_STATION || NUKE_SYNDICATE_BASE) //nuke was nowhere nearby //TODO: a really distant explosion animation sleep(50) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) actually_blew_up = station_missed == NUKE_SYNDICATE_BASE //don't kill everyone on station if it detonated off station else //station was destroyed @@ -346,28 +346,28 @@ SUBSYSTEM_DEF(ticker) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red",cinematic) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) cinematic.icon_state = "summary_nukewin" if("AI malfunction") //Malf (screen,explosion,summary) flick("intro_malf",cinematic) sleep(76) flick("station_explode_fade_red",cinematic) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) //TODO: If we ever decide to actually detonate the vault bomb cinematic.icon_state = "summary_malf" if("blob") //Station nuked (nuke,explosion,summary) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red",cinematic) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) //TODO: no idea what this case could be cinematic.icon_state = "summary_selfdes" if("cult") //Station nuked (nuke,explosion,summary) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red",cinematic) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) //TODO: no idea what this case could be cinematic.icon_state = "summary_cult" if("no_core") //Nuke failed to detonate as it had no core @@ -381,7 +381,7 @@ SUBSYSTEM_DEF(ticker) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red", cinematic) - SEND_SOUND(world, sound('sound/effects/explosionfar.ogg')) + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) cinematic.icon_state = "summary_selfdes" //If its actually the end of the round, wait for it to end. diff --git a/sound/effects/explosion_distant.ogg b/sound/effects/explosion_distant.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d9976c51fe7e1e24872450112074dad799ef4902 GIT binary patch literal 15355 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 KF(0Bt!2bbLssK^| literal 0 HcmV?d00001 From 2a2e4b2af4c70d0142175607343ae468aef865ae Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 17 Aug 2017 09:19:05 -0500 Subject: [PATCH 17/70] Improves attack logging of pulling / grabbing / throwing --- code/modules/mob/living/carbon/carbon.dm | 1 + code/modules/mob/living/living.dm | 2 ++ code/modules/mob/living/living_defense.dm | 7 +++++-- code/modules/mob/mob.dm | 2 ++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8f5720164e..feef638fdc 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -171,6 +171,7 @@ if(thrown_thing) visible_message("[src] has thrown [thrown_thing].") + add_logs(src, thrown_thing, "has thrown") newtonian_move(get_dir(target, src)) thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index edf54e547a..9684e44ac9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -550,6 +550,7 @@ if(!restrained(ignore_grab = 1) && pulledby) visible_message("[src] resists against [pulledby]'s grip!") resist_grab() + add_logs(pulledby, src, "resisted grab") return //unbuckling yourself @@ -587,6 +588,7 @@ if(pulledby.grab_state) if(prob(30/pulledby.grab_state)) visible_message("[src] has broken free of [pulledby]'s grip!") + add_logs(pulledby, src, "broke grab") pulledby.stop_pulling() return 0 if(moving_resist && client) //we resisted by trying to move diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 578eaec93e..01dca7f00e 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -89,7 +89,7 @@ var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration) apply_damage(I.throwforce, dtype, zone, armor) if(I.thrownby) - add_logs(I.thrownby, src, "hit", I) + add_logs(I.thrownby, src, "threw and hit", I) else return 1 else @@ -150,6 +150,7 @@ var/grab_upgrade_time = 30 visible_message("[user] starts to tighten [user.p_their()] grip on [src]!", \ "[user] starts to tighten [user.p_their()] grip on you!") + add_logs(user, src, "attempted to strangle", addition="grab") if(!do_mob(user, src, grab_upgrade_time)) return 0 if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state || user.a_intent != INTENT_GRAB) @@ -157,18 +158,20 @@ user.grab_state++ switch(user.grab_state) if(GRAB_AGGRESSIVE) - add_logs(user, src, "grabbed", addition="aggressively") + add_logs(user, src, "grabbed", addition="aggressive grab") visible_message("[user] has grabbed [src] aggressively!", \ "[user] has grabbed [src] aggressively!") drop_all_held_items() stop_pulling() if(GRAB_NECK) + add_logs(user, src, "grabbed", addition="neck grab") visible_message("[user] has grabbed [src] by the neck!",\ "[user] has grabbed you by the neck!") update_canmove() //we fall down if(!buckled && !density) Move(user.loc) if(GRAB_KILL) + add_logs(user, src, "strangled", addition="grab") visible_message("[user] is strangling [src]!", \ "[user] is strangling you!") update_canmove() //we fall down diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 26b22d964e..d612611ea6 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -327,6 +327,7 @@ if(AM.pulledby) if(!supress_message) visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.") + add_logs(AM, AM.pulledby, "pulled from", src) AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. pulling = AM @@ -337,6 +338,7 @@ if(ismob(AM)) var/mob/M = AM + add_logs(src, M, "grabbed", addition="passive grab") if(!supress_message) visible_message("[src] has grabbed [M] passively!") if(!iscarbon(src)) From 72cf7083f6c765291b895f4a52c98c01f514c345 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 17 Aug 2017 09:19:09 -0500 Subject: [PATCH 18/70] Fixes leathercrafting recipies trying to build on the floor. --- code/game/objects/items/stacks/sheets/leather.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 285225d6f1..1bd66b6a38 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -12,7 +12,7 @@ novariants = FALSE GLOBAL_LIST_INIT(human_recipes, list( \ - new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5, on_floor = 1), \ + new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5), \ )) /obj/item/stack/sheet/animalhide/human/Initialize(mapload, new_amount, merge = TRUE) @@ -33,7 +33,7 @@ GLOBAL_LIST_INIT(human_recipes, list( \ icon_state = "sheet-corgi" GLOBAL_LIST_INIT(corgi_recipes, list ( \ - new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3, on_floor = 1), \ + new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3), \ )) /obj/item/stack/sheet/animalhide/corgi/Initialize(mapload, new_amount, merge = TRUE) @@ -53,8 +53,8 @@ GLOBAL_LIST_INIT(corgi_recipes, list ( \ icon_state = "sheet-monkey" GLOBAL_LIST_INIT(monkey_recipes, list ( \ - new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1, on_floor = 1), \ - new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/monkeysuit, 2, on_floor = 1), \ + new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1), \ + new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/monkeysuit, 2), \ )) /obj/item/stack/sheet/animalhide/monkey/Initialize(mapload, new_amount, merge = TRUE) @@ -74,8 +74,8 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \ icon_state = "sheet-xeno" GLOBAL_LIST_INIT(xeno_recipes, list ( \ - new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1, on_floor = 1), \ - new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2, on_floor = 1), \ + new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1), \ + new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2), \ )) /obj/item/stack/sheet/animalhide/xeno/Initialize(mapload, new_amount, merge = TRUE) @@ -161,7 +161,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ GLOBAL_LIST_INIT(sinew_recipes, list ( \ - new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1, on_floor = 1), \ + new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1), \ )) /obj/item/stack/sheet/sinew/Initialize(mapload, new_amount, merge = TRUE) From 51a615f5c6cb82cf0511d39c8458fc8fedc16a85 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 17 Aug 2017 10:07:39 -0500 Subject: [PATCH 19/70] Automatic changelog generation for PR #2399 [ci skip] --- html/changelogs/AutoChangeLog-pr-2399.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2399.yml diff --git a/html/changelogs/AutoChangeLog-pr-2399.yml b/html/changelogs/AutoChangeLog-pr-2399.yml new file mode 100644 index 0000000000..2d162a5edf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2399.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - rscadd: "Blobs can now sense when they're being cuddled!" From 3b55852c5ee76753485430fc258d36054bb285b4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 17 Aug 2017 10:08:14 -0500 Subject: [PATCH 20/70] Automatic changelog generation for PR #2408 [ci skip] --- html/changelogs/AutoChangeLog-pr-2408.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2408.yml diff --git a/html/changelogs/AutoChangeLog-pr-2408.yml b/html/changelogs/AutoChangeLog-pr-2408.yml new file mode 100644 index 0000000000..92f33a9292 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2408.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - soundadd: "The station's explosion now uses a new (or old) sound." From 7ab92ade3c9a29aa1068fe6dc8b48e54695a4ef7 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 18 Aug 2017 11:13:45 -0500 Subject: [PATCH 21/70] Update lavaland_surface_xeno_nest.dmm --- _maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm index d139ee641b..fed94448d0 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm @@ -269,7 +269,7 @@ "W" = ( /obj/structure/alien/weeds, /obj/structure/alien/resin/wall, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/xenonest) From 3c91fba8e32157334fdf614e509e0cabfa157a4a Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 18 Aug 2017 11:16:30 -0500 Subject: [PATCH 22/70] Update turf.dm --- code/game/turfs/turf.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index b204406d05..0a7951c075 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -162,6 +162,12 @@ /turf/Entered(atom/movable/AM) if(explosion_level && AM.ex_check(explosion_id)) AM.ex_act(explosion_level) + + // If an opaque movable atom moves around we need to potentially update visibility. + if (AM.opacity) + has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. + reconsider_lights() + /turf/open/Entered(atom/movable/AM) ..() From db3622ca128c1435e3faecafc2057d9d5768d774 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 18 Aug 2017 11:18:33 -0500 Subject: [PATCH 23/70] Update signs.dm --- code/game/objects/structures/signs.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 9a25da9019..f6b044a0da 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -321,6 +321,6 @@ icon_state = "direction_bridge" /obj/structure/sign/logo - name = "station logo" - desc = "A sign: SPACE STATION 13." - icon_state = "ss13sign-1" \ No newline at end of file + name = "nanotrasen logo" + desc = "The Nanotrasen corporate logo." + icon_state = "ss13sign-1" From 8a7c0e657f4d111207bdf09b760d78f9086ab113 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 18 Aug 2017 11:20:36 -0500 Subject: [PATCH 24/70] Update powers.dm --- code/game/gamemodes/blob/powers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index deef4367e0..36707d9791 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -175,7 +175,7 @@ blobber << 'sound/effects/attackblob.ogg' to_chat(blobber, "You are a blobbernaut!") to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.") - to_chat(blobber, "You can communicate with other blobbernauts and GLOB.overminds via :b") + to_chat(blobber, "You can communicate with other blobbernauts and overminds via :b") to_chat(blobber, "Your overmind's blob reagent is: [blob_reagent_datum.name]!") to_chat(blobber, "The [blob_reagent_datum.name] reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]") if(blobber) From b4431f384011a4452fb6eb078424b5907aeac990 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 18 Aug 2017 13:41:38 -0500 Subject: [PATCH 25/70] Automatic changelog generation for PR #2362 [ci skip] --- html/changelogs/AutoChangeLog-pr-2362.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2362.yml diff --git a/html/changelogs/AutoChangeLog-pr-2362.yml b/html/changelogs/AutoChangeLog-pr-2362.yml new file mode 100644 index 0000000000..5bdc603b06 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2362.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - bugfix: "Fixes a typo in the blobbernaut spawn text" From 2c33ef3ab080a2f1381834c66acb9002632cdae0 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 18 Aug 2017 13:56:47 -0500 Subject: [PATCH 26/70] Update component.dm --- code/datums/components/component.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm index 5e25a581f8..4d5fae2115 100644 --- a/code/datums/components/component.dm +++ b/code/datums/components/component.dm @@ -117,8 +117,6 @@ . += current_type current_type = type2parent(current_type) -/datum/var/list/datum_components //special typecache of /datum/component - /datum/proc/SendSignal(sigtype, ...) var/list/comps = datum_components . = FALSE From 61d7ad4e82621ba90616cd7e690cc26d65e1086b Mon Sep 17 00:00:00 2001 From: Cactus Date: Fri, 18 Aug 2017 15:35:08 -0400 Subject: [PATCH 27/70] Stylesheet and Wolves (#2389) * organizes the mam_bodyparts file by species * Revert "organizes the mam_bodyparts file by species" This reverts commit ab692973ba20c282becf0d69514b1ac03d5447f8. * stylesheet fix * wolf sprite edits * conflict resolution * wolf accessories readded --- .../browserassets/css/browserOutput.css | 3 +++ .../new_player/sprite_accessories_Citadel.dm | 6 +++--- icons/mob/mam_body_markings.dmi | Bin 45530 -> 45337 bytes icons/mob/mam_bodyparts.dmi | Bin 38375 -> 38666 bytes interface/stylesheet.dm | 2 ++ 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 7c42972a10..36640db74e 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -371,6 +371,9 @@ h1.alert, h2.alert {color: #000000;} .swarmer {color: #2C75FF;} .resonate {color: #298F85;} +.love {color: #FF69Bf;} +.lovebold {color: #FF69Bf; font-weight: bold;} + .connectionClosed, .fatalError {background: red; color: white; padding: 5px;} .connectionClosed.restored {background: green;} .internal.boldnshit {color: blue; font-weight: bold;} diff --git a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm index 0b21852a8e..fc99a87eaf 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm @@ -150,8 +150,7 @@ /datum/sprite_accessory/ears/wolf name = "Wolf" icon_state = "wolf" - hasinner = 1 - icon = 'icons/mob/mam_bodyparts.dmi' + extra = 1 /datum/sprite_accessory/tails/human/wolf name = "Wolf" @@ -191,6 +190,7 @@ /datum/sprite_accessory/mam_tails_animated icon = 'icons/mob/mam_bodyparts.dmi' + /datum/sprite_accessory/mam_tails_animated/none name = "None" @@ -436,7 +436,7 @@ /datum/sprite_accessory/mam_ears/wolf name = "Wolf" icon_state = "wolf" - hasinner = 1 + extra = 1 /datum/sprite_accessory/mam_tails/wolf name = "Wolf" diff --git a/icons/mob/mam_body_markings.dmi b/icons/mob/mam_body_markings.dmi index 737fa15c4276828ae4f9b4c2493a2721865494df..fdb97490c85b2cb980f6466df831936b308e4b52 100644 GIT binary patch delta 20882 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 Z;SUJi5^R?*4FV6|1ExpuImXTr{|1u+q4WR% delta 21076 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 diff --git a/icons/mob/mam_bodyparts.dmi b/icons/mob/mam_bodyparts.dmi index c9f1ba70e89616558a049949aea4de052e6d5938..7de9b40734b0bd70fe918db43421a168f150f464 100644 GIT binary patch literal 38666 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 Iu310*Z&WXiv;Y7A literal 38375 zcmce;2|Sc>zc+l5>>({w7_CyWXU~X)h*D%C`)!zA=%gLj3s0bA^T3q z48}6da=ri2ecsP~-t(O2oag?W=k=MHYs_5Nf4hFa?{EA5=hZE3wFAt@nIQ-|prL+E z7lP=(+kKOa^x%*~VT%C&@cZ61aKHA@&C1oz+1<{`5rVvvzQ)~jIxfcXqWe#N0cWPb z;Ukd&vvnU2+G(cW5?u1X+|HJBq*&9z={(t?P} zA{i* z+fU@{BJW=J9;junl$Daym9O(|d%*~je`x$aH%c+?`3CxCG zwyA2bCq@lS5A3PW)(;L<*dEx>O#R`g zxT)ipnlgW5-fl#)|NfF#HFK=oF@452hLh+e#|~ZcS+-j zeM0B!Qw(mEAC+~PFY*O_40hy~M9bWBiv4}1=|P%#ouGQFF5?3C@5jYa%tp#_Q8y*| zn^opG&}%QphF)B7mlMxwF!@%(rhY!}SgvG!Mr6!6onuj4>6<>+#C&cWJ@Ao*%wpKw z)bvak7k-Ah;yMcik3b2xE-{vz(K9h;?G_nN%Bt98ezWiHLo-BoLC?bS zazDdPyPOqDBnO5XmX<4v4zQb{^;|=iS!)ZI)!^!z~W!~|q-7;FfF>)A^BH>4fH#42QQ#E{q*bRLlxWUS4<8^->fsgyW&lCw1E~-I9af^H9+>&5 zmqGjAQeXe$Wp2N58_OQCmhp}l_bM!SKO!=wotM%s^aQ)YX9uU=u=DzSF&)7T_r>(G z#|aMxSdh?Kj$|cb_qjRGSV$(FqKz5<^-H~SEu(_myW%U#9sK6a8&Pi70n?;I_V4|B zu3B{cqoHk%-V}n`rAp!SjeRqy$|T~`HDr|uctwdz z(t)IbgW~?x>A2yp=H})b*b6yEY=0XMgExfMcM)^L>|t=! z(63)If6SA$1rh@|o~JcGyNd8qZyEmz(-i)|KMxqOXi#tS2B_C)({O z(i9snV)}@O1d}8WTjQaLC#QDmMCfKv`W0I=E2wIdVKcCB^g;FSSPj{X=Mr37DXO6z zwDaRzCv9Pk8@9wAPaRoC?n}f|yY5W>bp*8Vf}#bf`&_BdA7j}~ni-VTzqLc@sAPHj z3ES`J@nnX7ALy+3*SbWOti`T8S?;S`a|is1Az=Ga8S_0AMv>=o!Ea|v(T28r)6nt5 zy;`E6N0E_ZUFl@5cOOMQvIkp`bfWMiCsOxkS!{Q}^5gykW2)pueNjq8tQ+D7rEjix z%M(h{&FEty5{ZTmG+|xfq!?p*=iA2csTFj%Y8lEzosB*yz1GCm6f9{N>~0H3^-x;+ zD2oQyi4$-X(W81fae4q}M_uq^)CDiWU=UJLQVkRer82bW@S4vc!8J6xlvb)3)$S{$ zMl6fnLZi3P+W+B=aO_t8(#6&i`{lIq%kyc|?ZPh_EjgX&&6*~i__9|PtjvZ{yM@C6 ziu38@48(uygBh8BC?+t&{}b8@8u?e0{6Ai1@rZVEOS5blXm2f5ZT0pWMMt+QW>d70 zBb8$Do+4460(9iSeY-R#e>3p>U~iMusnXGcMgtZ-uW++AG&f)8W~I*{6Ycwio`h=z z{sjTi-z=$P?P+67SCNx}0ZNR!Gz=R-;+-Q{t3%K>JR88P%orN6ihq;1n zEPLz`Kn%@T;pZHDKLr^IdsJj>PY2bq4%cW6Cv$AT^HzcoQVeb|RooG3G|G;JxJ`1OmC z`VI+nFH*C^)wdZ*oz$;izrMTrxBsC6-#FumlfevP#;>Ix%T}m{!G-dWDyOg{T

B9_81wl5^9X$eXVr>d$%_y<0RU9P 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 SRFWwDr=qB#kbm9$`TqwYxM;cn diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 8576be384b..7ad30fb7b5 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -161,4 +161,6 @@ h1.alert, h2.alert {color: #000000;} .monkey {color: #975032;} .swarmer {color: #2C75FF;} .resonate {color: #298F85;} +.love {color: #FF69Bf;} +.lovebold {color: #FF69Bf; font-weight: bold;} "} From ad8af9f9ecfa86a3274c60d1b7cd748844e53572 Mon Sep 17 00:00:00 2001 From: Cactus Date: Fri, 18 Aug 2017 17:27:07 -0400 Subject: [PATCH 28/70] fixes shark tail color husky ears moved to extra instead of inner, in line with wolf ears --- .../mob/dead/new_player/sprite_accessories_Citadel.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm index fc99a87eaf..ab4b044cb9 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm @@ -122,7 +122,7 @@ /datum/sprite_accessory/tails/human/shark name = "Shark" icon_state = "shark" - color_src = 0 + color_src = MUTCOLORS icon = 'icons/mob/mam_bodyparts.dmi' /datum/sprite_accessory/tails/human/shark/datashark @@ -326,7 +326,6 @@ /datum/sprite_accessory/mam_ears/husky name = "Husky" icon_state = "wolf" - hasinner = 1 icon = 'icons/mob/mam_bodyparts.dmi' extra = 1 @@ -390,7 +389,7 @@ /datum/sprite_accessory/mam_tails/shark name = "Shark" icon_state = "shark" - color_src = 0 + color_src = MUTCOLORS /datum/sprite_accessory/mam_tails_animated/shark name = "Shark" From 45d6ece7a8fa6ceea2e7a3c8264339af9c877143 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 18 Aug 2017 18:57:53 -0500 Subject: [PATCH 29/70] Adds a warning to the traitor panel for the last headrev --- code/datums/mind.dm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d943e417e5..a31aab8607 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -400,7 +400,15 @@ if (assigned_role in GLOB.command_positions) text += "HEAD|loyal|employee|headrev|rev" else if (src in SSticker.mode.head_revolutionaries) - text += "head|loyal|employee|HEADREV|rev" + var/last_healthy_headrev = TRUE + for(var/I in SSticker.mode.head_revolutionaries) + if(I == src) + continue + var/mob/M = I + if(M.z == ZLEVEL_STATION && !M.stat) + last_healthy_headrev = FALSE + break + text += "head|loyal|employee|[last_healthy_headrev ? "LAST " : ""]HEADREV|rev" text += "
Flash: give" var/list/L = current.get_contents() From f7bde6a76a393f93187577fdb8bbd38100ea7100 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 18 Aug 2017 18:59:58 -0500 Subject: [PATCH 30/70] Makes mixing meth dangerous again --- .../food_and_drinks/recipes/food_mixtures.dm | 6 +++--- code/modules/reagents/chemistry/holder.dm | 5 ++--- code/modules/reagents/chemistry/recipes.dm | 2 +- .../modules/reagents/chemistry/recipes/others.dm | 16 ++++++++-------- .../reagents/chemistry/recipes/pyrotechnics.dm | 7 ++++--- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 17662feb6e..bfa8b8bebd 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -13,7 +13,7 @@ id = "tofu" required_reagents = list("soymilk" = 10) required_catalysts = list("enzyme" = 5) - mob_react=1 + mob_react = FALSE /datum/chemical_reaction/tofu/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -37,7 +37,7 @@ name = "Chocolate Bar" id = "chocolate_bar" required_reagents = list("chocolate_milk" = 4, "sugar" = 2) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/chocolate_bar2/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -91,7 +91,7 @@ name = "synthmeat" id = "synthmeat" required_reagents = list("blood" = 5, "cryoxadone" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/synthmeat/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index a062d5c614..54d17497f3 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -370,9 +370,8 @@ else if(cached_my_atom.type == C.required_container) matching_container = 1 - if (isliving(cached_my_atom)) //Makes it so certain chemical reactions don't occur in mobs - if (C.mob_react) - return + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + return if(!C.required_other) matching_other = 1 diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index c13ff096e4..428c10e24a 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -10,7 +10,7 @@ var/required_other = 0 // an integer required for the reaction to happen var/secondary = 0 // set to nonzero if secondary reaction - var/mob_react = 0 //Determines if a chemical reaction can occur inside a mob + var/mob_react = TRUE //Determines if a chemical reaction can occur inside a mob var/required_temp = 0 var/is_cold_recipe = 0 // Set to 1 if you want the recipe to only react when it's BELOW the required temp. diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 4151a2695e..01195333fb 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -51,7 +51,7 @@ name = "Solid Plasma" id = "solidplasma" required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/plasmasolidification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -62,7 +62,7 @@ name = "Solid Gold" id = "solidgold" required_reagents = list("frostoil" = 5, "gold" = 20, "iron" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/goldsolidification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -80,7 +80,7 @@ id = "soapification" required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles required_temp = 374 - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -92,7 +92,7 @@ id = "candlefication" required_reagents = list("liquidgibs" = 5, "oxygen" = 5) // required_temp = 374 - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -103,7 +103,7 @@ name = "Meatification" id = "meatification" required_reagents = list("liquidgibs" = 10, "nutriment" = 10, "carbon" = 10) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -436,7 +436,7 @@ name = "Foam" id = "foam" required_reagents = list("fluorosurfactant" = 1, "water" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -453,7 +453,7 @@ name = "Metal Foam" id = "metalfoam" required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -470,7 +470,7 @@ name = "Iron Foam" id = "ironlfoam" required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index dcafef247b..8ca65a6588 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -140,10 +140,11 @@ name = "Meth explosion" id = "methboom1" results = list("methboom1" = 1) - required_temp = 420 //high enough to not blow up in the meth syringes + required_temp = 380 //slightly above the meth mix time. required_reagents = list("methamphetamine" = 1) strengthdiv = 6 modifier = 1 + mob_react = FALSE /datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) @@ -154,7 +155,7 @@ /datum/chemical_reaction/reagent_explosion/methsplosion/methboom2 required_reagents = list("diethylamine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) //diethylamine is often left over from mixing the ephedrine. - required_temp = 420 + required_temp = 300 //room temperature, chilling it even a little will prevent the explosion results = list("methboom1" = 4) // this is ugly. Sorry goof. /datum/chemical_reaction/sorium @@ -269,7 +270,7 @@ required_reagents = list("smoke_powder" = 1) required_temp = 374 secondary = 1 - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/smoke_powder_smoke/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) From da6e3d7c8e1d68543f4e4cea043b3ee0f9f3563c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 19 Aug 2017 06:45:50 -0500 Subject: [PATCH 31/70] readds toggle_hear_radio admin verb --- code/modules/admin/admin_verbs.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a839b35b3c..3276a319db 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -12,6 +12,7 @@ GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault()) /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/ /client/proc/secrets, + /client/proc/toggle_hear_radio, /*allows admins to hide all radio output*/ /client/proc/reload_admins, /client/proc/reestablish_db_connection, /*reattempt a connection to the database*/ /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ From 10807cb1b95397c9b6987756a3a7e0814cf8b5e5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 19 Aug 2017 18:39:13 -0500 Subject: [PATCH 32/70] Patch DMITool's import to accept pngs with no alpha channel --- tools/dmitool/dmitool.jar | Bin 202277 -> 199210 bytes .../src/main/java/dmitool/IconState.java | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/dmitool/dmitool.jar b/tools/dmitool/dmitool.jar index 4cfa49f36de43117f01bfdf95913125b0fb3e5b8..3e99778951d6afd8256b1233ac2c52db088ee1b4 100644 GIT binary patch delta 35898 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 delta 39153 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