From e4df4ae31236996ecdf58012d6c4acd4caad80f0 Mon Sep 17 00:00:00 2001
From: Edge <42111655+EdgeLordExe@users.noreply.github.com>
Date: Sat, 4 Jun 2022 16:26:35 +0200
Subject: [PATCH] Merge pull request #25 from AcapitalA/engines
Re-adds the singulo, tesla and MRSPACMAN
---
code/datums/wires/particle_accelerator.dm | 49 +++
code/game/machinery/computer/arcade/orion.dm | 4 +-
.../machines/machine_circuitboards.dm | 6 +
.../awaymissions/bluespaceartillery.dm | 55 +++
code/modules/cargo/bounties/engineering.dm | 55 +++
code/modules/cargo/exports/large_objects.dm | 21 ++
code/modules/cargo/exports/tools.dm | 20 ++
code/modules/power/port_gen.dm | 15 +
code/modules/power/singularity/generator.dm | 35 ++
.../particle_accelerator/particle.dm | 63 ++++
.../particle_accelerator.dm | 166 +++++++++
.../particle_accelerator/particle_control.dm | 329 ++++++++++++++++++
.../particle_accelerator/particle_emitter.dm | 43 +++
code/modules/power/singularity/singularity.dm | 254 ++++++++++----
code/modules/power/tesla/energy_ball.dm | 170 +++++++++
code/modules/power/tesla/generator.dm | 12 +
.../research/designs/machine_designs.dm | 16 +
.../modules/research/designs/power_designs.dm | 13 +
code/modules/research/techweb/all_nodes.dm | 4 +
code/modules/station_goals/bsa.dm | 4 +-
icons/obj/engine/singularity.dmi | Bin 30146 -> 31396 bytes
icons/obj/particle_accelerator.dmi | Bin 0 -> 106297 bytes
tgstation.dme | 7 +
.../tgui/interfaces/ParticleAccelerator.js | 64 ++++
24 files changed, 1328 insertions(+), 77 deletions(-)
create mode 100644 code/datums/wires/particle_accelerator.dm
create mode 100644 code/modules/awaymissions/bluespaceartillery.dm
create mode 100644 code/modules/power/singularity/generator.dm
create mode 100644 code/modules/power/singularity/particle_accelerator/particle.dm
create mode 100644 code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
create mode 100644 code/modules/power/singularity/particle_accelerator/particle_control.dm
create mode 100644 code/modules/power/singularity/particle_accelerator/particle_emitter.dm
create mode 100644 code/modules/power/tesla/generator.dm
create mode 100644 icons/obj/particle_accelerator.dmi
create mode 100644 tgui/packages/tgui/interfaces/ParticleAccelerator.js
diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm
new file mode 100644
index 000000000000..dfaf6fdb47f2
--- /dev/null
+++ b/code/datums/wires/particle_accelerator.dm
@@ -0,0 +1,49 @@
+/datum/wires/particle_accelerator/control_box
+ holder_type = /obj/machinery/particle_accelerator/control_box
+ proper_name = "Particle Accelerator"
+
+/datum/wires/particle_accelerator/control_box/New(atom/holder)
+ wires = list(
+ WIRE_POWER, WIRE_STRENGTH, WIRE_LIMIT,
+ WIRE_INTERFACE
+ )
+ add_duds(2)
+ ..()
+
+/datum/wires/particle_accelerator/control_box/interactable(mob/user)
+ . = ..()
+ var/obj/machinery/particle_accelerator/control_box/C = holder
+ if(C.construction_state == 2)
+ return TRUE
+
+/datum/wires/particle_accelerator/control_box/on_pulse(wire)
+ var/obj/machinery/particle_accelerator/control_box/C = holder
+ switch(wire)
+ if(WIRE_POWER)
+ C.toggle_power()
+ if(WIRE_STRENGTH)
+ C.add_strength()
+ if(WIRE_INTERFACE)
+ C.interface_control = !C.interface_control
+ if(WIRE_LIMIT)
+ C.visible_message("[icon2html(C, viewers(holder))][C] makes a large whirring noise.")
+
+/datum/wires/particle_accelerator/control_box/on_cut(wire, mend)
+ var/obj/machinery/particle_accelerator/control_box/C = holder
+ switch(wire)
+ if(WIRE_POWER)
+ if(C.active == !mend)
+ C.toggle_power()
+ if(WIRE_STRENGTH)
+ for(var/i = 1; i < 3; i++)
+ C.remove_strength()
+ if(WIRE_INTERFACE)
+ if(!mend)
+ C.interface_control = FALSE
+ if(WIRE_LIMIT)
+ C.strength_upper_limit = (mend ? 2 : 3)
+ if(C.strength_upper_limit < C.strength)
+ C.remove_strength()
+
+/datum/wires/particle_accelerator/control_box/emp_pulse() // to prevent singulo from pulsing wires
+ return
diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm
index d32c6596786e..a958d0d4c38e 100644
--- a/code/game/machinery/computer/arcade/orion.dm
+++ b/code/game/machinery/computer/arcade/orion.dm
@@ -59,9 +59,7 @@ GLOBAL_LIST_INIT(orion_events, generate_orion_events())
/obj/machinery/computer/arcade/orion_trail/kobayashi
name = "Kobayashi Maru control computer"
desc = "A test for cadets."
- icon = 'icons/obj/machines/particle_accelerator.dmi'
- icon_keyboard = null
- icon_screen = null
+ icon = 'icons/obj/particle_accelerator.dmi'
icon_state = "control_boxp"
//kobatashi has a smaller list of events, so we copy from the global list and cut whatever isn't here
var/list/event_whitelist = list(
diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm
index d1cc5601991e..3dd5f5bfa8a4 100644
--- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm
+++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm
@@ -209,6 +209,12 @@
/obj/item/circuitboard/machine/turbine_compressor
name = "Turbine - Inlet Compressor"
+/obj/item/circuitboard/machine/pacman/mrs
+ name = "MRSPACMAN-type Generator (Machine Board)"
+ build_path = /obj/machinery/power/port_gen/pacman/mrs
+
+/obj/item/circuitboard/machine/power_compressor
+ name = "Power Compressor (Machine Board)"
greyscale_colors = CIRCUIT_COLOR_ENGINEERING
build_path = /obj/machinery/power/turbine/inlet_compressor/constructed
req_components = list(
diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm
new file mode 100644
index 000000000000..8adcf8823f55
--- /dev/null
+++ b/code/modules/awaymissions/bluespaceartillery.dm
@@ -0,0 +1,55 @@
+
+
+/obj/machinery/artillerycontrol
+ var/reload = 120
+ var/reload_cooldown = 120
+ var/explosiondev = 3
+ var/explosionmed = 6
+ var/explosionlight = 12
+ name = "bluespace artillery control"
+ icon_state = "control_boxp1"
+ icon = 'icons/obj/particle_accelerator.dmi'
+ density = TRUE
+
+/obj/machinery/artillerycontrol/process(delta_time)
+ if(reload < reload_cooldown)
+ reload += delta_time
+
+/obj/structure/artilleryplaceholder
+ name = "artillery"
+ icon = 'icons/obj/machines/artillery.dmi'
+ anchored = TRUE
+ density = TRUE
+
+/obj/structure/artilleryplaceholder/decorative
+ density = FALSE
+
+/obj/machinery/artillerycontrol/ui_interact(mob/user)
+ . = ..()
+ var/dat = "Bluespace Artillery Control:
"
+ dat += "Locked on
"
+ dat += "Charge progress: [reload]/[reload_cooldown]:
"
+ dat += "Open Fire
"
+ dat += "Deployment of weapon authorized by
Nanotrasen Naval Command
Remember, friendly fire is grounds for termination of your contract and life.
"
+ user << browse(dat, "window=scroll")
+ onclose(user, "scroll")
+
+/obj/machinery/artillerycontrol/Topic(href, href_list)
+ if(..())
+ return
+ var/A
+ A = input("Area to bombard", "Open Fire", A) in GLOB.teleportlocs
+ var/area/thearea = GLOB.teleportlocs[A]
+ if(usr.stat != CONSCIOUS || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED))
+ return
+ if(reload < reload_cooldown)
+ return
+ if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr))
+ priority_announce("Bluespace artillery fire detected. Brace for impact.")
+ message_admins("[ADMIN_LOOKUPFLW(usr)] has launched an artillery strike.")
+ var/list/L = list()
+ for(var/turf/T in get_area_turfs(thearea.type))
+ L+=T
+ var/loc = pick(L)
+ explosion(loc, explosiondev, explosionmed, explosionlight)
+ reload = 0
diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm
index 9da865ec7533..723d77074ae4 100644
--- a/code/modules/cargo/bounties/engineering.dm
+++ b/code/modules/cargo/bounties/engineering.dm
@@ -1,3 +1,58 @@
+/datum/bounty/item/engineering/gas
+ name = "Full Tank of Pluoxium"
+ description = "CentCom RnD is researching extra compact internals. Ship us a tank full of Pluoxium and you'll be compensated."
+ reward = CARGO_CRATE_VALUE * 15
+ wanted_types = list(/obj/item/tank)
+ var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact.
+ var/gas_type = /datum/gas/pluoxium
+
+/datum/bounty/item/engineering/gas/applies_to(obj/O)
+ if(!..())
+ return FALSE
+ var/obj/item/tank/T = O
+ var/datum/gas_mixture/our_mix = T.return_air()
+ if(!our_mix.gases[gas_type])
+ return FALSE
+ return our_mix.gases[gas_type][MOLES] >= moles_required
+
+/datum/bounty/item/engineering/gas/nitryl_tank
+ name = "Full Tank of Nitryl"
+ description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started. (20 Moles)"
+ gas_type = /datum/gas/nitryl
+
+/datum/bounty/item/engineering/gas/freon_tank
+ name = "Full Tank of Freon"
+ description = "The Supermatter of station 33 has started the delamination process. Deliver a tank of Freon gas to help them stop it! (20 Moles)"
+ gas_type = /datum/gas/freon
+
+/datum/bounty/item/engineering/gas/tritium_tank
+ name = "Full Tank of Tritium"
+ description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium. (20 Moles)"
+ gas_type = /datum/gas/tritium
+
+/datum/bounty/item/engineering/gas/hydrogen_tank
+ name = "Full Tank of Hydrogen"
+ description = "Our R&D department is working on the development of more efficient electrical batteries using hydrogen as a catalyst. Ship us a tank full of it. (20 Moles)"
+ gas_type = /datum/gas/hydrogen
+
+/datum/bounty/item/engineering/gas/zauker_tank
+ name = "Full Tank of Zauker"
+ description = "The main planet of \[REDACTED] has been chosen as testing grounds for the new weapon that uses Zauker gas. Ship us a tank full of it. (20 Moles)"
+ reward = CARGO_CRATE_VALUE * 20
+ gas_type = /datum/gas/zauker
+
+/datum/bounty/item/engineering/energy_ball
+ name = "Contained Tesla Ball"
+ description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper."
+ reward = CARGO_CRATE_VALUE * 375
+ wanted_types = list(/obj/singularity/energy_ball)
+
+/datum/bounty/item/engineering/energy_ball/applies_to(obj/O)
+ if(!..())
+ return FALSE
+ var/obj/singularity/energy_ball/T = O
+ return !T.miniball
+
/datum/bounty/item/engineering/emitter
name = "Emitter"
description = "We think there may be a defect in your station's emitter designs, based on the sheer number of delaminations your sector seems to see. Ship us one of yours."
diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm
index 1871d69eb452..a340955a5431 100644
--- a/code/modules/cargo/exports/large_objects.dm
+++ b/code/modules/cargo/exports/large_objects.dm
@@ -81,6 +81,16 @@
unit_name = "tesla coil"
export_types = list(/obj/machinery/power/energy_accumulator/tesla_coil)
+/datum/export/large/pa
+ cost = CARGO_CRATE_VALUE * 2
+ unit_name = "particle accelerator part"
+ export_types = list(/obj/structure/particle_accelerator)
+
+/datum/export/large/pa/controls
+ cost = CARGO_CRATE_VALUE * 2.5
+ unit_name = "particle accelerator control console"
+ export_types = list(/obj/machinery/particle_accelerator/control_box)
+
/datum/export/large/supermatter
cost = CARGO_CRATE_VALUE * 16
unit_name = "supermatter shard"
@@ -91,6 +101,17 @@
unit_name = "grounding rod"
export_types = list(/obj/machinery/power/energy_accumulator/grounding_rod)
+/datum/export/large/tesla_gen
+ cost = CARGO_CRATE_VALUE * 16
+ unit_name = "energy ball generator"
+ export_types = list(/obj/machinery/the_singularitygen/tesla)
+
+/datum/export/large/singulo_gen
+ cost = CARGO_CRATE_VALUE * 16
+ unit_name = "gravitational singularity generator"
+ export_types = list(/obj/machinery/the_singularitygen)
+ include_subtypes = FALSE
+
/datum/export/large/iv
cost = CARGO_CRATE_VALUE * 0.25
unit_name = "iv drip"
diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm
index 94e9c2643653..f22e141fca43 100644
--- a/code/modules/cargo/exports/tools.dm
+++ b/code/modules/cargo/exports/tools.dm
@@ -136,6 +136,26 @@
unit_name = "rapid pipe dispenser"
export_types = list(/obj/item/pipe_dispenser)
+/datum/export/singulo //failsafe in case someone decides to ship a live singularity to CentCom without the corresponding bounty
+ cost = 1
+ unit_name = "singularity"
+ export_types = list(/obj/singularity)
+ include_subtypes = FALSE
+
+/datum/export/singulo/total_printout(datum/export_report/ex, notes = TRUE)
+ . = ..()
+ if(. && notes)
+ . += " ERROR: Invalid object detected."
+
+/datum/export/singulo/tesla //see above
+ unit_name = "energy ball"
+ export_types = list(/obj/singularity/energy_ball)
+
+/datum/export/singulo/tesla/total_printout(datum/export_report/ex, notes = TRUE)
+ . = ..()
+ if(. && notes)
+ . += " ERROR: Unscheduled energy ball delivery detected."
+
//artisanal exports for the mom and pops
/datum/export/soap
cost = CARGO_CRATE_VALUE * 0.375
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 5400a48422c4..2b6e998ac778 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -277,5 +277,20 @@
power_gen = 15000
sheet_path = /obj/item/stack/sheet/mineral/uranium
+/obj/machinery/power/port_gen/pacman/super/overheat()
+ explosion(src, devastation_range = 3, heavy_impact_range = 3, light_impact_range = 3, flash_range = -1)
+
+/obj/machinery/power/port_gen/pacman/mrs
+ name = "\improper M.R.S.P.A.C.M.A.N.-type portable generator"
+ base_icon = "portgen2"
+ icon_state = "portgen2_0"
+ circuit = /obj/item/circuitboard/machine/pacman/mrs
+ sheet_path = /obj/item/stack/sheet/mineral/diamond
+ power_gen = 40000
+ time_per_sheet = 80
+
+/obj/machinery/power/port_gen/pacman/mrs/overheat()
+ explosion(src.loc, 4, 4, 4, -1)
+
/obj/machinery/power/port_gen/pacman/pre_loaded
sheets = 15
diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm
new file mode 100644
index 000000000000..f5e3bbc1417b
--- /dev/null
+++ b/code/modules/power/singularity/generator.dm
@@ -0,0 +1,35 @@
+/////SINGULARITY SPAWNER
+/obj/machinery/the_singularitygen
+ name = "Gravitational Singularity Generator"
+ desc = "An odd device which produces a Gravitational Singularity when set up."
+ icon = 'icons/obj/singularity.dmi'
+ icon_state = "TheSingGen"
+ anchored = FALSE
+ density = TRUE
+ use_power = NO_POWER_USE
+ resistance_flags = FIRE_PROOF
+
+ // You can buckle someone to the singularity generator, then start the engine. Fun!
+ can_buckle = TRUE
+ buckle_lying = FALSE
+ buckle_requires_restraints = TRUE
+
+ var/energy = 0
+ var/creation_type = /obj/singularity
+
+/obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user, params)
+ if(W.tool_behaviour == TOOL_WRENCH)
+ default_unfasten_wrench(user, W, 0)
+ else
+ return ..()
+
+/obj/machinery/the_singularitygen/process()
+ if(energy > 0)
+ if(energy >= 200)
+ var/turf/T = get_turf(src)
+ SSblackbox.record_feedback("tally", "engine_started", 1, type)
+ var/obj/singularity/S = new creation_type(T, 50)
+ transfer_fingerprints_to(S)
+ qdel(src)
+ else
+ energy -= 1
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
new file mode 100644
index 000000000000..6dcc0a6aae2a
--- /dev/null
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -0,0 +1,63 @@
+/obj/effect/accelerated_particle
+ name = "Accelerated Particles"
+ desc = "Small things moving very fast."
+ icon = 'icons/obj/particle_accelerator.dmi'
+ icon_state = "particle"
+ anchored = TRUE
+ density = FALSE
+ var/movement_range = 20
+ var/energy = 10
+ var/speed = 1
+
+/obj/effect/accelerated_particle/weak
+ movement_range = 15
+ energy = 5
+
+/obj/effect/accelerated_particle/strong
+ movement_range = 25
+ energy = 15
+
+/obj/effect/accelerated_particle/powerful
+ movement_range = 30
+ energy = 50
+
+
+/obj/effect/accelerated_particle/New(loc)
+ ..()
+
+ addtimer(CALLBACK(src, .proc/move), 1)
+
+
+/obj/effect/accelerated_particle/Bump(atom/A)
+ if(A)
+ if(isliving(A))
+ toxmob(A)
+ else if(istype(A, /obj/machinery/the_singularitygen))
+ var/obj/machinery/the_singularitygen/S = A
+ S.energy += energy
+ else if(istype(A, /obj/singularity))
+ var/obj/singularity/S = A
+ S.energy += energy
+ else if(istype(A, /obj/structure/blob))
+ var/obj/structure/blob/B = A
+ B.take_damage(energy*0.6)
+ movement_range = 0
+
+/obj/effect/accelerated_particle/ex_act(severity, target)
+ qdel(src)
+
+/obj/effect/accelerated_particle/singularity_pull()
+ return
+
+/obj/effect/accelerated_particle/proc/toxmob(mob/living/M)
+ M.rad_act(energy*6)
+
+/obj/effect/accelerated_particle/proc/move()
+ if(!step(src,dir))
+ forceMove(get_step(src,dir))
+ movement_range--
+ if(movement_range == 0)
+ qdel(src)
+ else
+ sleep(speed)
+ move()
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
new file mode 100644
index 000000000000..4518f4654307
--- /dev/null
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -0,0 +1,166 @@
+#define PA_CONSTRUCTION_UNSECURED 0
+#define PA_CONSTRUCTION_UNWIRED 1
+#define PA_CONSTRUCTION_PANEL_OPEN 2
+#define PA_CONSTRUCTION_COMPLETE 3
+
+/obj/structure/particle_accelerator
+ name = "Particle Accelerator"
+ desc = "Part of a Particle Accelerator."
+ icon = 'icons/obj/particle_accelerator.dmi'
+ icon_state = "none"
+ anchored = FALSE
+ density = TRUE
+ max_integrity = 500
+ armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 80)
+
+ var/obj/machinery/particle_accelerator/control_box/master = null
+ var/construction_state = PA_CONSTRUCTION_UNSECURED
+ var/reference = null
+ var/powered = 0
+ var/strength = null
+
+/obj/structure/particle_accelerator/examine(mob/user)
+ . = ..()
+
+ switch(construction_state)
+ if(PA_CONSTRUCTION_UNSECURED)
+ . += "Looks like it's not attached to the flooring."
+ if(PA_CONSTRUCTION_UNWIRED)
+ . += "It is missing some cables."
+ if(PA_CONSTRUCTION_PANEL_OPEN)
+ . += "The panel is open."
+
+/obj/structure/particle_accelerator/Destroy()
+ construction_state = PA_CONSTRUCTION_UNSECURED
+ if(master)
+ master.connected_parts -= src
+ master.assembled = 0
+ master = null
+ return ..()
+
+/obj/structure/particle_accelerator/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS )
+
+
+/obj/structure/particle_accelerator/set_anchored(anchorvalue)
+ . = ..()
+ if(isnull(.))
+ return
+ construction_state = anchorvalue ? PA_CONSTRUCTION_UNWIRED : PA_CONSTRUCTION_UNSECURED
+ update_state()
+ update_icon()
+
+/obj/structure/particle_accelerator/attackby(obj/item/W, mob/user, params)
+ var/did_something = FALSE
+
+ switch(construction_state)
+ if(PA_CONSTRUCTION_UNSECURED)
+ if(W.tool_behaviour == TOOL_WRENCH && !isinspace())
+ W.play_tool_sound(src, 75)
+ set_anchored(TRUE)
+ user.visible_message("[user.name] secures the [name] to the floor.", \
+ "You secure the external bolts.")
+ user.changeNext_move(CLICK_CD_MELEE)
+ return //set_anchored handles the rest of the stuff we need to do.
+ if(PA_CONSTRUCTION_UNWIRED)
+ if(W.tool_behaviour == TOOL_WRENCH)
+ W.play_tool_sound(src, 75)
+ set_anchored(FALSE)
+ user.visible_message("[user.name] detaches the [name] from the floor.", \
+ "You remove the external bolts.")
+ user.changeNext_move(CLICK_CD_MELEE)
+ return //set_anchored handles the rest of the stuff we need to do.
+ else if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/CC = W
+ if(CC.use(1))
+ user.visible_message("[user.name] adds wires to the [name].", \
+ "You add some wires.")
+ construction_state = PA_CONSTRUCTION_PANEL_OPEN
+ did_something = TRUE
+ if(PA_CONSTRUCTION_PANEL_OPEN)
+ if(W.tool_behaviour == TOOL_WIRECUTTER)//TODO:Shock user if its on?
+ user.visible_message("[user.name] removes some wires from the [name].", \
+ "You remove some wires.")
+ construction_state = PA_CONSTRUCTION_UNWIRED
+ did_something = TRUE
+ else if(W.tool_behaviour == TOOL_SCREWDRIVER)
+ user.visible_message("[user.name] closes the [name]'s access panel.", \
+ "You close the access panel.")
+ construction_state = PA_CONSTRUCTION_COMPLETE
+ did_something = TRUE
+ if(PA_CONSTRUCTION_COMPLETE)
+ if(W.tool_behaviour == TOOL_SCREWDRIVER)
+ user.visible_message("[user.name] opens the [name]'s access panel.", \
+ "You open the access panel.")
+ construction_state = PA_CONSTRUCTION_PANEL_OPEN
+ did_something = TRUE
+
+ if(did_something)
+ user.changeNext_move(CLICK_CD_MELEE)
+ update_state()
+ update_icon()
+ return
+
+ return ..()
+
+
+/obj/structure/particle_accelerator/deconstruct(disassembled = TRUE)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ new /obj/item/stack/sheet/iron (loc, 5)
+ qdel(src)
+
+/obj/structure/particle_accelerator/Move()
+ . = ..()
+ if(master && master.active)
+ master.toggle_power()
+ investigate_log("was moved whilst active; it powered down.", INVESTIGATE_SINGULO)
+
+
+/obj/structure/particle_accelerator/update_icon_state()
+ . = ..()
+ switch(construction_state)
+ if(PA_CONSTRUCTION_UNSECURED,PA_CONSTRUCTION_UNWIRED)
+ icon_state="[reference]"
+ if(PA_CONSTRUCTION_PANEL_OPEN)
+ icon_state="[reference]w"
+ if(PA_CONSTRUCTION_COMPLETE)
+ if(powered)
+ icon_state="[reference]p[strength]"
+ else
+ icon_state="[reference]c"
+
+/obj/structure/particle_accelerator/proc/update_state()
+ if(master)
+ master.update_state()
+
+/obj/structure/particle_accelerator/proc/connect_master(obj/O)
+ if(O.dir == dir)
+ master = O
+ return 1
+ return 0
+
+///////////
+// PARTS //
+///////////
+
+
+/obj/structure/particle_accelerator/end_cap
+ name = "Alpha Particle Generation Array"
+ desc = "This is where Alpha particles are generated from \[REDACTED\]."
+ icon_state = "end_cap"
+ reference = "end_cap"
+
+/obj/structure/particle_accelerator/power_box
+ name = "Particle Focusing EM Lens"
+ desc = "This uses electromagnetic waves to focus the Alpha particles."
+ icon = 'icons/obj/particle_accelerator.dmi'
+ icon_state = "power_box"
+ reference = "power_box"
+
+/obj/structure/particle_accelerator/fuel_chamber
+ name = "EM Acceleration Chamber"
+ desc = "This is where the Alpha particles are accelerated to radical speeds."
+ icon = 'icons/obj/particle_accelerator.dmi'
+ icon_state = "fuel_chamber"
+ reference = "fuel_chamber"
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
new file mode 100644
index 000000000000..dd2be56d282d
--- /dev/null
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -0,0 +1,329 @@
+/obj/machinery/particle_accelerator/control_box
+ name = "Particle Accelerator Control Console"
+ desc = "This controls the density of the particles."
+ icon = 'icons/obj/particle_accelerator.dmi'
+ icon_state = "control_box"
+ anchored = FALSE
+ density = TRUE
+ use_power = NO_POWER_USE
+ idle_power_usage = 500
+ active_power_usage = 10000
+ dir = NORTH
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
+ var/strength_upper_limit = 2
+ var/interface_control = TRUE
+ var/list/obj/structure/particle_accelerator/connected_parts
+ var/assembled = FALSE
+ var/construction_state = PA_CONSTRUCTION_UNSECURED
+ var/active = FALSE
+ var/strength = 0
+ var/powered = FALSE
+
+/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)
+ toggle_power()
+ for(var/CP in connected_parts)
+ var/obj/structure/particle_accelerator/part = CP
+ part.master = null
+ connected_parts.Cut()
+ QDEL_NULL(wires)
+ return ..()
+
+/obj/machinery/particle_accelerator/control_box/multitool_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(construction_state == PA_CONSTRUCTION_PANEL_OPEN)
+ wires.interact(user)
+ return TRUE
+
+/obj/machinery/particle_accelerator/control_box/proc/update_state()
+ if(construction_state < PA_CONSTRUCTION_COMPLETE)
+ use_power = NO_POWER_USE
+ assembled = FALSE
+ active = FALSE
+ for(var/CP in connected_parts)
+ var/obj/structure/particle_accelerator/part = CP
+ part.strength = null
+ part.powered = FALSE
+ part.update_icon()
+ connected_parts.Cut()
+ return
+ if(!part_scan())
+ use_power = IDLE_POWER_USE
+ active = FALSE
+ connected_parts.Cut()
+
+/obj/machinery/particle_accelerator/control_box/update_icon_state()
+ . = ..()
+ if(active)
+ icon_state = "control_boxp1"
+ else
+ if(use_power)
+ if(assembled)
+ icon_state = "control_boxp"
+ else
+ icon_state = "ucontrol_boxp"
+ else
+ switch(construction_state)
+ if(PA_CONSTRUCTION_UNSECURED, PA_CONSTRUCTION_UNWIRED)
+ icon_state = "control_box"
+ if(PA_CONSTRUCTION_PANEL_OPEN)
+ icon_state = "control_boxw"
+ else
+ icon_state = "control_boxc"
+
+/obj/machinery/particle_accelerator/control_box/proc/strength_change()
+ for(var/CP in connected_parts)
+ var/obj/structure/particle_accelerator/part = CP
+ part.strength = strength
+ part.update_icon()
+
+/obj/machinery/particle_accelerator/control_box/proc/add_strength(s)
+ if(assembled && (strength < strength_upper_limit))
+ strength++
+ strength_change()
+
+ message_admins("PA Control Computer increased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_VERBOSEJMP(src)]")
+ log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [AREACOORD(src)]")
+ investigate_log("increased to [strength] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_SINGULO)
+
+/obj/machinery/particle_accelerator/control_box/proc/remove_strength(s)
+ if(assembled && (strength > 0))
+ strength--
+ strength_change()
+
+ message_admins("PA Control Computer decreased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_VERBOSEJMP(src)]")
+ log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [AREACOORD(src)]")
+ investigate_log("decreased to [strength] by [key_name(usr)] at [AREACOORD(src)]", INVESTIGATE_SINGULO)
+
+/obj/machinery/particle_accelerator/control_box/power_change()
+ . = ..()
+ if(machine_stat & NOPOWER)
+ active = FALSE
+ use_power = NO_POWER_USE
+ else if(!machine_stat && construction_state == PA_CONSTRUCTION_COMPLETE)
+ use_power = IDLE_POWER_USE
+
+/obj/machinery/particle_accelerator/control_box/process()
+ if(active)
+ //a part is missing!
+ if(connected_parts.len < 6)
+ investigate_log("lost a connected part; It powered down.", INVESTIGATE_SINGULO)
+ toggle_power()
+ update_icon()
+ return
+ //emit some particles
+ for(var/obj/structure/particle_accelerator/particle_emitter/PE in connected_parts)
+ PE.emit_particle(strength)
+
+/obj/machinery/particle_accelerator/control_box/proc/part_scan()
+ var/ldir = turn(dir,-90)
+ var/rdir = turn(dir,90)
+ var/odir = turn(dir,180)
+ var/turf/T = loc
+
+ assembled = FALSE
+ critical_machine = FALSE
+
+ var/obj/structure/particle_accelerator/fuel_chamber/F = locate() in orange(1,src)
+ if(!F)
+ return FALSE
+
+ setDir(F.dir)
+ connected_parts.Cut()
+
+ T = get_step(T,rdir)
+ if(!check_part(T, /obj/structure/particle_accelerator/fuel_chamber))
+ return FALSE
+ T = get_step(T,odir)
+ if(!check_part(T, /obj/structure/particle_accelerator/end_cap))
+ return FALSE
+ T = get_step(T,dir)
+ T = get_step(T,dir)
+ if(!check_part(T, /obj/structure/particle_accelerator/power_box))
+ return FALSE
+ T = get_step(T,dir)
+ if(!check_part(T, /obj/structure/particle_accelerator/particle_emitter/center))
+ return FALSE
+ T = get_step(T,ldir)
+ if(!check_part(T, /obj/structure/particle_accelerator/particle_emitter/left))
+ return FALSE
+ T = get_step(T,rdir)
+ T = get_step(T,rdir)
+ if(!check_part(T, /obj/structure/particle_accelerator/particle_emitter/right))
+ return FALSE
+
+ assembled = TRUE
+ critical_machine = TRUE //Only counts if the PA is actually assembled.
+ return TRUE
+
+/obj/machinery/particle_accelerator/control_box/proc/check_part(turf/T, type)
+ var/obj/structure/particle_accelerator/PA = locate(/obj/structure/particle_accelerator) in T
+ if(istype(PA, type) && (PA.construction_state == PA_CONSTRUCTION_COMPLETE))
+ if(PA.connect_master(src))
+ connected_parts.Add(PA)
+ return TRUE
+ return FALSE
+
+/obj/machinery/particle_accelerator/control_box/proc/toggle_power()
+ active = !active
+ investigate_log("turned [active?"ON":"OFF"] by [usr ? key_name(usr) : "outside forces"] at [AREACOORD(src)]", INVESTIGATE_SINGULO)
+ message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? ADMIN_LOOKUPFLW(usr) : "outside forces"] in [ADMIN_VERBOSEJMP(src)]")
+ log_game("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? "[key_name(usr)]" : "outside forces"] at [AREACOORD(src)]")
+ if(active)
+ use_power = ACTIVE_POWER_USE
+ for(var/CP in connected_parts)
+ var/obj/structure/particle_accelerator/part = CP
+ part.strength = strength
+ part.powered = TRUE
+ part.update_icon()
+ else
+ use_power = IDLE_POWER_USE
+ for(var/CP in connected_parts)
+ var/obj/structure/particle_accelerator/part = CP
+ part.strength = null
+ part.powered = FALSE
+ part.update_icon()
+ return TRUE
+
+/obj/machinery/particle_accelerator/control_box/examine(mob/user)
+ . = ..()
+ switch(construction_state)
+ if(PA_CONSTRUCTION_UNSECURED)
+ . += "Looks like it's not attached to the flooring."
+ if(PA_CONSTRUCTION_UNWIRED)
+ . += "It is missing some cables."
+ if(PA_CONSTRUCTION_PANEL_OPEN)
+ . += "The panel is open."
+
+/obj/machinery/particle_accelerator/control_box/set_anchored(anchorvalue)
+ . = ..()
+ if(isnull(.))
+ return
+ construction_state = anchorvalue ? PA_CONSTRUCTION_UNWIRED : PA_CONSTRUCTION_UNSECURED
+ update_state()
+ update_icon()
+
+/obj/machinery/particle_accelerator/control_box/attackby(obj/item/W, mob/user, params)
+ var/did_something = FALSE
+
+ switch(construction_state)
+ if(PA_CONSTRUCTION_UNSECURED)
+ if(W.tool_behaviour == TOOL_WRENCH && !isinspace())
+ W.play_tool_sound(src, 75)
+ set_anchored(TRUE)
+ user.visible_message("[user.name] secures the [name] to the floor.", \
+ "You secure the external bolts.")
+ user.changeNext_move(CLICK_CD_MELEE)
+ return //set_anchored handles the rest of the stuff we need to do.
+ if(PA_CONSTRUCTION_UNWIRED)
+ if(W.tool_behaviour == TOOL_WRENCH)
+ W.play_tool_sound(src, 75)
+ set_anchored(FALSE)
+ user.visible_message("[user.name] detaches the [name] from the floor.", \
+ "You remove the external bolts.")
+ user.changeNext_move(CLICK_CD_MELEE)
+ return //set_anchored handles the rest of the stuff we need to do.
+ else if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/CC = W
+ if(CC.use(1))
+ user.visible_message("[user.name] adds wires to the [name].", \
+ "You add some wires.")
+ construction_state = PA_CONSTRUCTION_PANEL_OPEN
+ did_something = TRUE
+ if(PA_CONSTRUCTION_PANEL_OPEN)
+ if(W.tool_behaviour == TOOL_WIRECUTTER)//TODO:Shock user if its on?
+ user.visible_message("[user.name] removes some wires from the [name].", \
+ "You remove some wires.")
+ construction_state = PA_CONSTRUCTION_UNWIRED
+ did_something = TRUE
+ else if(W.tool_behaviour == TOOL_SCREWDRIVER)
+ user.visible_message("[user.name] closes the [name]'s access panel.", \
+ "You close the access panel.")
+ construction_state = PA_CONSTRUCTION_COMPLETE
+ did_something = TRUE
+ if(PA_CONSTRUCTION_COMPLETE)
+ if(W.tool_behaviour == TOOL_SCREWDRIVER)
+ user.visible_message("[user.name] opens the [name]'s access panel.", \
+ "You open the access panel.")
+ construction_state = PA_CONSTRUCTION_PANEL_OPEN
+ did_something = TRUE
+
+ if(did_something)
+ user.changeNext_move(CLICK_CD_MELEE)
+ update_state()
+ update_icon()
+ return
+
+ return ..()
+
+/obj/machinery/particle_accelerator/control_box/blob_act(obj/structure/blob/B)
+ if(prob(50))
+ qdel(src)
+
+/obj/machinery/particle_accelerator/control_box/interact(mob/user)
+ if(construction_state == PA_CONSTRUCTION_PANEL_OPEN)
+ wires.interact(user)
+ else
+ ..()
+
+/obj/machinery/particle_accelerator/control_box/proc/is_interactive(mob/user)
+ if(!interface_control)
+ to_chat(user, "ERROR: Request timed out. Check wire contacts.")
+ return FALSE
+ if(construction_state != PA_CONSTRUCTION_COMPLETE)
+ return FALSE
+ return TRUE
+
+/obj/machinery/particle_accelerator/control_box/ui_status(mob/user)
+ if(is_interactive(user))
+ return ..()
+ return UI_CLOSE
+
+/obj/machinery/particle_accelerator/control_box/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ParticleAccelerator", name)
+ ui.open()
+
+/obj/machinery/particle_accelerator/control_box/ui_data(mob/user)
+ var/list/data = list()
+ data["assembled"] = assembled
+ data["power"] = active
+ data["strength"] = strength
+ return data
+
+/obj/machinery/particle_accelerator/control_box/ui_act(action, params)
+ if(..())
+ return
+
+ switch(action)
+ if("power")
+ if(wires.is_cut(WIRE_POWER))
+ return
+ toggle_power()
+ . = TRUE
+ if("scan")
+ part_scan()
+ . = TRUE
+ if("add_strength")
+ if(wires.is_cut(WIRE_STRENGTH))
+ return
+ add_strength()
+ . = TRUE
+ if("remove_strength")
+ if(wires.is_cut(WIRE_STRENGTH))
+ return
+ remove_strength()
+ . = TRUE
+
+ update_icon()
+
+#undef PA_CONSTRUCTION_UNSECURED
+#undef PA_CONSTRUCTION_UNWIRED
+#undef PA_CONSTRUCTION_PANEL_OPEN
+#undef PA_CONSTRUCTION_COMPLETE
diff --git a/code/modules/power/singularity/particle_accelerator/particle_emitter.dm b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm
new file mode 100644
index 000000000000..d754b7e62d31
--- /dev/null
+++ b/code/modules/power/singularity/particle_accelerator/particle_emitter.dm
@@ -0,0 +1,43 @@
+/obj/structure/particle_accelerator/particle_emitter
+ name = "EM Containment Grid"
+ desc = "This launches the Alpha particles, might not want to stand near this end."
+ icon = 'icons/obj/particle_accelerator.dmi'
+ icon_state = "none"
+ var/fire_delay = 50
+ var/last_shot = 0
+
+/obj/structure/particle_accelerator/particle_emitter/center
+ icon_state = "emitter_center"
+ reference = "emitter_center"
+
+/obj/structure/particle_accelerator/particle_emitter/left
+ icon_state = "emitter_left"
+ reference = "emitter_left"
+
+/obj/structure/particle_accelerator/particle_emitter/right
+ icon_state = "emitter_right"
+ reference = "emitter_right"
+
+/obj/structure/particle_accelerator/particle_emitter/proc/set_delay(delay)
+ if(delay >= 0)
+ fire_delay = delay
+ return 1
+ return 0
+
+/obj/structure/particle_accelerator/particle_emitter/proc/emit_particle(strength = 0)
+ if((last_shot + fire_delay) <= world.time)
+ last_shot = world.time
+ var/turf/T = get_turf(src)
+ var/obj/effect/accelerated_particle/P
+ switch(strength)
+ if(0)
+ P = new/obj/effect/accelerated_particle/weak(T)
+ if(1)
+ P = new/obj/effect/accelerated_particle(T)
+ if(2)
+ P = new/obj/effect/accelerated_particle/strong(T)
+ if(3)
+ P = new/obj/effect/accelerated_particle/powerful(T)
+ P.setDir(dir)
+ return 1
+ return 0
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index de6a36e43c0c..dab0054c316e 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -7,49 +7,44 @@
anchored = TRUE
density = TRUE
move_resist = INFINITY
- plane = MASSIVE_OBJ_PLANE
- plane = ABOVE_LIGHTING_PLANE
+ layer = MASSIVE_OBJ_PLANE
light_range = 6
- appearance_flags = LONG_GLIDE
-
- /// The singularity component itself.
- /// A weak ref in case an admin removes the component to preserve the functionality.
- var/datum/weakref/singularity_component
+ appearance_flags = 0
///Current singularity size, from 1 to 6
var/current_size = 1
///Current allowed size for the singulo
var/allowed_size = 1
- ///How strong are we?
- var/energy = 100
- ///Do we lose energy over time?
- var/dissipate = TRUE
- /// How long should it take for us to dissipate in seconds?
- var/dissipate_delay = 20
- /// How much energy do we lose every dissipate_delay?
- var/dissipate_strength = 1
- /// How long its been (in seconds) since the last dissipation
- var/time_since_last_dissipiation = 0
- ///Prob for event each tick
- var/event_chance = 10
- ///Can i move by myself?
- var/move_self = TRUE
- ///If the singularity has eaten a supermatter shard and can go to stage six
- var/consumed_supermatter = FALSE
- /// How long it's been since the singulo last acted, in seconds
- var/time_since_act = 0
-
- flags_1 = SUPERMATTER_IGNORES_1
+ var/contained = 1 //Is it gonna move around?
+ var/energy = 100 //How strong are we?
+ var/dissipate = 1 //Do we lose energy over time?
+ var/dissipate_delay = 10 //How long does it take to dissipate in seconds?
+ var/dissipate_track = 0 //Tracks the time before dissipation starts
+ var/dissipate_strength = 1 //How much energy do we lose?
+ var/move_self = 1 //Do we move on our own?
+ var/grav_pull = 4 //How many tiles out do we pull?
+ var/consume_range = 0 //How many tiles out do we eat
+ var/event_chance = 10 //Prob for event each tick
+ var/target = null //its target. moves towards the target if it has one
+ var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
+ var/last_warning
+ var/consumedSupermatter = 0 //If the singularity has eaten a supermatter shard and can go to stage six
+ var/drifting_dir = 0 // Chosen direction to drift in
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION
/obj/singularity/Initialize(mapload, starting_energy = 50)
+ //In case Urist McShitler is feeling quirky for once.
+ admin_investigate_setup()
+
+ src.energy = starting_energy
. = ..()
energy = starting_energy
START_PROCESSING(SSsinguloprocess, src)
SSpoints_of_interest.make_point_of_interest(src)
+ GLOB.poi_list |= src
var/datum/component/singularity/new_component = AddComponent(
/datum/component/singularity, \
@@ -77,10 +72,57 @@
)
+ AddElement(/datum/element/bsa_blocker)
+ RegisterSignal(src, COMSIG_ATOM_BSA_BEAM, .proc/bluespace_reaction)
+
/obj/singularity/Destroy()
STOP_PROCESSING(SSsinguloprocess, src)
+ GLOB.poi_list.Remove(src)
+ GLOB.singularities.Remove(src)
return ..()
+/obj/singularity/Move(atom/newloc, direct)
+ var/turf/T = get_turf(src)
+ for(var/dir in GLOB.cardinals)
+ if(direct & dir)
+ T = get_step(T, dir)
+ if(!T)
+ break
+ // eat the stuff if we're going to move into it so it doesn't mess up our movement
+ for(var/atom/A in T.contents)
+ consume(A)
+ consume(T)
+
+ if(current_size >= STAGE_FIVE || check_turfs_in(direct))
+ last_failed_movement = 0//Reset this because we moved
+ return ..()
+ else
+ last_failed_movement = direct
+ return 0
+
+/obj/singularity/attack_hand(mob/user)
+ consume(user)
+ return TRUE
+
+/obj/singularity/attack_paw(mob/user)
+ consume(user)
+
+/obj/singularity/attack_alien(mob/user)
+ consume(user)
+
+/obj/singularity/attack_animal(mob/user)
+ consume(user)
+
+/obj/singularity/attackby(obj/item/W, mob/user, params)
+ consume(user)
+ return 1
+
+/obj/singularity/Process_Spacemove() //The singularity stops drifting for no man!
+ return 0
+
+/obj/singularity/blob_act(obj/structure/blob/B)
+ return
+
/obj/singularity/attack_tk(mob/user)
if(!iscarbon(user))
return
@@ -154,13 +196,53 @@
time_since_act = 0
if(current_size >= STAGE_TWO)
if(prob(event_chance))
+
+/obj/singularity/bullet_act(obj/projectile/P)
+ qdel(P)
+ return BULLET_ACT_HIT //Will there be an impact? Who knows. Will we see it? No.
+
+
+/obj/singularity/Bump(atom/A)
+ consume(A)
+ if(QDELETED(A)) // don't keep moving into objects that weren't destroyed infinitely
+ step(src, drifting_dir)
+ return
+
+
+/obj/singularity/Bumped(atom/movable/AM)
+ consume(AM)
+
+
+/obj/singularity/process()
+ if(current_size >= STAGE_TWO)
+ move()
+ radiation_pulse(src, min(5000, (energy*4.5)+1000), RAD_DISTANCE_COEFFICIENT*0.5)
+ if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
event()
- dissipate(delta_time)
+ eat()
+ dissipate()
check_energy()
+ return
-/obj/singularity/proc/dissipate(delta_time)
- if (!dissipate)
+/obj/singularity/attack_ai() //to prevent ais from gibbing themselves when they click on one.
+ return
+
+/obj/singularity/proc/admin_investigate_setup()
+ var/turf/T = get_turf(src)
+ last_warning = world.time
+ var/count = locate(/obj/machinery/field/containment) in urange(30, src, 1)
+ if(!count)
+ message_admins("A singularity has been created without containment fields active at [ADMIN_VERBOSEJMP(T)].")
+ investigate_log("was created at [AREACOORD(T)]. [count?"":"No containment fields were active"]", INVESTIGATE_SINGULO)
+
+/obj/singularity/proc/dissipate()
+ if(!dissipate)
return
+ if(dissipate_track >= dissipate_delay)
+ src.energy -= dissipate_strength
+ dissipate_track = 0
+ else
+ dissipate_track++
time_since_last_dissipiation += delta_time
@@ -174,13 +256,9 @@
if(force_size)
temp_allowed_size = force_size
-
- if(temp_allowed_size >= STAGE_SIX && !consumed_supermatter)
+ if(temp_allowed_size >= STAGE_SIX && !consumedSupermatter)
temp_allowed_size = STAGE_FIVE
- var/new_grav_pull
- var/new_consume_range
-
switch(temp_allowed_size)
if(STAGE_ONE)
current_size = STAGE_ONE
@@ -188,10 +266,10 @@
icon_state = "singularity_s1"
pixel_x = 0
pixel_y = 0
- new_grav_pull = 4
- new_consume_range = 0
+ grav_pull = 4
+ consume_range = 0
dissipate_delay = 10
- time_since_last_dissipiation = 0
+ dissipate_track = 0
dissipate_strength = 1
if(STAGE_TWO)
if(check_cardinals_range(1, TRUE))
@@ -200,10 +278,10 @@
icon_state = "singularity_s3"
pixel_x = -32
pixel_y = -32
- new_grav_pull = 6
- new_consume_range = 1
+ grav_pull = 6
+ consume_range = 1
dissipate_delay = 5
- time_since_last_dissipiation = 0
+ dissipate_track = 0
dissipate_strength = 5
if(STAGE_THREE)
if(check_cardinals_range(2, TRUE))
@@ -212,10 +290,10 @@
icon_state = "singularity_s5"
pixel_x = -64
pixel_y = -64
- new_grav_pull = 8
- new_consume_range = 2
+ grav_pull = 8
+ consume_range = 2
dissipate_delay = 4
- time_since_last_dissipiation = 0
+ dissipate_track = 0
dissipate_strength = 20
if(STAGE_FOUR)
if(check_cardinals_range(3, TRUE))
@@ -224,10 +302,10 @@
icon_state = "singularity_s7"
pixel_x = -96
pixel_y = -96
- new_grav_pull = 10
- new_consume_range = 3
+ grav_pull = 10
+ consume_range = 3
dissipate_delay = 10
- time_since_last_dissipiation = 0
+ dissipate_track = 0
dissipate_strength = 10
if(STAGE_FIVE)//this one also lacks a check for gens because it eats everything
current_size = STAGE_FIVE
@@ -235,26 +313,18 @@
icon_state = "singularity_s9"
pixel_x = -128
pixel_y = -128
- new_grav_pull = 10
- new_consume_range = 4
- dissipate = FALSE //It cant go smaller due to e loss
+ grav_pull = 10
+ consume_range = 4
+ dissipate = 0 //It cant go smaller due to e loss
if(STAGE_SIX) //This only happens if a stage 5 singulo consumes a supermatter shard.
current_size = STAGE_SIX
icon = 'icons/effects/352x352.dmi'
icon_state = "singularity_s11"
pixel_x = -160
pixel_y = -160
- new_grav_pull = 15
- new_consume_range = 5
- dissipate = FALSE
-
- var/datum/component/singularity/resolved_singularity = singularity_component.resolve()
- if (!isnull(resolved_singularity))
- resolved_singularity.consume_range = new_consume_range
- resolved_singularity.grav_pull = new_grav_pull
- resolved_singularity.disregard_failed_movements = current_size >= STAGE_FIVE
- resolved_singularity.roaming = move_self && current_size >= STAGE_TWO
- resolved_singularity.singularity_size = current_size
+ grav_pull = 15
+ consume_range = 5
+ dissipate = 0
if(current_size == allowed_size)
investigate_log("grew to size [current_size].", INVESTIGATE_ENGINE)
@@ -262,13 +332,13 @@
else if(current_size < (--temp_allowed_size))
expand(temp_allowed_size)
else
- return FALSE
+ return 0
/obj/singularity/proc/check_energy()
if(energy <= 0)
investigate_log("collapsed.", INVESTIGATE_ENGINE)
qdel(src)
- return FALSE
+ return 0
switch(energy)//Some of these numbers might need to be changed up later -Mport
if(1 to 199)
allowed_size = STAGE_ONE
@@ -279,22 +349,57 @@
if(1000 to 1999)
allowed_size = STAGE_FOUR
if(2000 to INFINITY)
- if(energy >= 3000 && consumed_supermatter)
+ if(energy >= 3000 && consumedSupermatter)
allowed_size = STAGE_SIX
else
allowed_size = STAGE_FIVE
if(current_size != allowed_size)
expand()
- return TRUE
+ return 1
+
+/obj/singularity/proc/eat()
+ for(var/tile in spiral_range_turfs(grav_pull, src))
+ var/turf/T = tile
+ if(!T || !isturf(loc))
+ continue
+ if(get_dist(T, src) > consume_range)
+ T.singularity_pull(src, current_size)
+ else
+ consume(T)
+ for(var/thing in T)
+ if(isturf(loc) && thing != src)
+ var/atom/movable/X = thing
+ if(get_dist(X, src) > consume_range)
+ X.singularity_pull(src, current_size)
+ else
+ consume(X)
+ CHECK_TICK
+ return
+
-/obj/singularity/proc/consume(atom/thing)
- var/gain = thing.singularity_act(current_size, src)
- energy += gain
- if(istype(thing, /obj/machinery/power/supermatter_crystal) && !consumed_supermatter)
+/obj/singularity/proc/consume(atom/A)
+ var/gain = A.singularity_act(current_size, src)
+ src.energy += gain
+ if(istype(A, /obj/machinery/power/supermatter_crystal) && !consumedSupermatter)
desc = "[initial(desc)] It glows fiercely with inner fire."
name = "supermatter-charged [initial(name)]"
- consumed_supermatter = TRUE
+ consumedSupermatter = 1
set_light(10)
+ return
+
+/obj/singularity/proc/move(force_move = 0)
+ if(!move_self)
+ return 0
+
+ var/drifting_dir = pick(GLOB.alldirs - last_failed_movement)
+
+ if(force_move)
+ drifting_dir = force_move
+
+ if(target && prob(60))
+ drifting_dir = get_dir(src,target) //moves to a singulo beacon, if there is one
+
+ step(src, drifting_dir)
/obj/singularity/proc/check_cardinals_range(steps, retry_with_move = FALSE)
. = length(GLOB.cardinals) //Should be 4.
@@ -305,11 +410,11 @@
if(step(src, i)) //Move in each direction.
if(check_cardinals_range(steps, FALSE)) //New location passes, return true.
return TRUE
- return !.
+ . = !.
/obj/singularity/proc/check_turfs_in(direction = 0, step = 0)
if(!direction)
- return FALSE
+ return 0
var/steps = 0
if(!step)
switch(current_size)
@@ -426,6 +531,7 @@
/obj/singularity/proc/emp_area()
empulse(src, 8, 10)
+ return
/obj/singularity/singularity_act()
var/gain = (energy/2)
@@ -454,3 +560,7 @@
/obj/singularity/deadchat_controlled/Initialize(mapload, starting_energy)
. = ..()
deadchat_plays(mode = DEMOCRACY_MODE)
+
+/obj/singularity/proc/bluespace_reaction()
+ investigate_log("has been shot by bluespace artillery and destroyed.", INVESTIGATE_SINGULO)
+ qdel(src)
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 34c6b551344d..30e5ba8675cc 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -10,6 +10,176 @@
#define BLOB (STRUCTURE + 1)
#define STRUCTURE (1)
+/obj/singularity/energy_ball
+ name = "energy ball"
+ desc = "An energy ball."
+ icon = 'icons/obj/tesla_engine/energy_ball.dmi'
+ icon_state = "energy_ball"
+ pixel_x = -32
+ pixel_y = -32
+ current_size = STAGE_TWO
+ move_self = 1
+ grav_pull = 0
+ contained = 0
+ density = TRUE
+ energy = 0
+ dissipate = 1
+ dissipate_delay = 5
+ dissipate_strength = 1
+ var/list/orbiting_balls = list()
+ var/miniball = FALSE
+ var/produced_power
+ var/energy_to_raise = 32
+ var/energy_to_lower = -20
+
+/obj/singularity/energy_ball/Initialize(mapload, starting_energy = 50, is_miniball = FALSE)
+ miniball = is_miniball
+ . = ..()
+ if(!is_miniball)
+ set_light(10, 7, "#EEEEFF")
+
+/obj/singularity/energy_ball/ex_act(severity, target)
+ return
+
+/obj/singularity/energy_ball/consume(severity, target)
+ return
+
+/obj/singularity/energy_ball/Destroy()
+ if(orbiting && istype(orbiting.parent, /obj/singularity/energy_ball))
+ var/obj/singularity/energy_ball/EB = orbiting.parent
+ EB.orbiting_balls -= src
+
+ for(var/ball in orbiting_balls)
+ var/obj/singularity/energy_ball/EB = ball
+ QDEL_NULL(EB)
+
+ . = ..()
+
+/obj/singularity/energy_ball/admin_investigate_setup()
+ if(miniball)
+ return //don't annnounce miniballs
+ ..()
+
+
+/obj/singularity/energy_ball/process()
+ if(!orbiting)
+ handle_energy()
+
+ move_the_basket_ball(4 + orbiting_balls.len * 1.5)
+
+ playsound(src.loc, 'sound/magic/lightningbolt.ogg', 100, TRUE, extrarange = 30)
+
+ pixel_x = 0
+ pixel_y = 0
+
+ tesla_zap(src, 7, TESLA_DEFAULT_POWER)
+
+ pixel_x = -32
+ pixel_y = -32
+ for (var/ball in orbiting_balls)
+ var/range = rand(1, clamp(orbiting_balls.len, 3, 7))
+ tesla_zap(ball, range, TESLA_MINI_POWER/7*range)
+ else
+ energy = 0 // ensure we dont have miniballs of miniballs
+
+/obj/singularity/energy_ball/examine(mob/user)
+ . = ..()
+ if(orbiting_balls.len)
+ . += "There are [orbiting_balls.len] mini-balls orbiting it."
+
+
+/obj/singularity/energy_ball/proc/move_the_basket_ball(move_amount)
+ //we face the last thing we zapped, so this lets us favor that direction a bit
+ var/move_bias = pick(GLOB.alldirs)
+ for(var/i in 0 to move_amount)
+ var/move_dir = pick(GLOB.alldirs + move_bias) //ensures large-ball teslas don't just sit around
+ if(target && prob(10))
+ move_dir = get_dir(src,target)
+ var/turf/T = get_step(src, move_dir)
+ if(can_move(T))
+ forceMove(T)
+ setDir(move_dir)
+ for(var/mob/living/carbon/C in loc)
+ dust_mobs(C)
+
+
+/obj/singularity/energy_ball/proc/handle_energy()
+ if(energy >= energy_to_raise)
+ energy_to_lower = energy_to_raise - 20
+ energy_to_raise = energy_to_raise * 1.25
+
+ playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, TRUE, extrarange = 30)
+ addtimer(CALLBACK(src, .proc/new_mini_ball), 100)
+
+ else if(energy < energy_to_lower && orbiting_balls.len)
+ energy_to_raise = energy_to_raise / 1.25
+ energy_to_lower = (energy_to_raise / 1.25) - 20
+
+ var/Orchiectomy_target = pick(orbiting_balls)
+ qdel(Orchiectomy_target)
+
+ else if(orbiting_balls.len)
+ dissipate() //sing code has a much better system.
+
+/obj/singularity/energy_ball/proc/new_mini_ball()
+ if(!loc)
+ return
+ var/obj/singularity/energy_ball/EB = new(loc, 0, TRUE)
+
+ EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7)
+ var/icon/I = icon(icon,icon_state,dir)
+
+ var/orbitsize = (I.Width() + I.Height()) * pick(0.4, 0.5, 0.6, 0.7, 0.8)
+ orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25)
+
+ EB.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36))
+
+
+/obj/singularity/energy_ball/Bump(atom/A)
+ dust_mobs(A)
+
+/obj/singularity/energy_ball/Bumped(atom/movable/AM)
+ dust_mobs(AM)
+
+/obj/singularity/energy_ball/attack_tk(mob/user)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ to_chat(C, "That was a shockingly dumb idea.")
+ var/obj/item/organ/brain/rip_u = locate(/obj/item/organ/brain) in C.internal_organs
+ C.ghostize(0)
+ qdel(rip_u)
+ C.death()
+
+/obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target)
+ if (istype(target))
+ target.orbiting_balls += src
+ GLOB.poi_list -= src
+ target.dissipate_strength = target.orbiting_balls.len
+ . = ..()
+
+/obj/singularity/energy_ball/stop_orbit()
+ if (orbiting && istype(orbiting.parent, /obj/singularity/energy_ball))
+ var/obj/singularity/energy_ball/orbitingball = orbiting.parent
+ orbitingball.orbiting_balls -= src
+ orbitingball.dissipate_strength = orbitingball.orbiting_balls.len
+ . = ..()
+ if (!QDELETED(src))
+ qdel(src)
+
+
+/obj/singularity/energy_ball/proc/dust_mobs(atom/A)
+ if(isliving(A))
+ var/mob/living/L = A
+ if(L.incorporeal_move || L.status_flags & GODMODE)
+ return
+ if(!iscarbon(A))
+ return
+ for(var/obj/machinery/power/grounding_rod/GR in orange(src, 2))
+ if(GR.anchored)
+ return
+ var/mob/living/carbon/C = A
+ C.dust()
+
/// The Tesla engine
/obj/energy_ball
name = "energy ball"
diff --git a/code/modules/power/tesla/generator.dm b/code/modules/power/tesla/generator.dm
new file mode 100644
index 000000000000..a63e11b4914a
--- /dev/null
+++ b/code/modules/power/tesla/generator.dm
@@ -0,0 +1,12 @@
+/obj/machinery/the_singularitygen/tesla
+ name = "energy ball generator"
+ desc = "Makes the wardenclyffe look like a child's plaything when shot with a particle accelerator."
+ icon = 'icons/obj/tesla_engine/tesla_generator.dmi'
+ icon_state = "TheSingGen"
+ creation_type = /obj/singularity/energy_ball
+
+/obj/machinery/the_singularitygen/tesla/zap_act(power, zap_flags)
+ if(zap_flags & ZAP_MACHINE_EXPLOSIVE)
+ energy += power
+ zap_flags &= ~(ZAP_MACHINE_EXPLOSIVE | ZAP_OBJ_DAMAGE) // Don't blow yourself up yeah?
+ return ..()
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index f5a7099cfbea..a49c6e5965ca 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -21,6 +21,22 @@
)
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING
+/datum/design/board/circulator
+ name = "Machine Design (Circulator Board)"
+ desc = "The circuit board for a circulator."
+ id = "circulator"
+ build_path = /obj/item/circuitboard/machine/circulator
+ category = list ("Engineering Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/board/teg
+ name = "Machine Design (TEG Board)"
+ desc = "The circuit board for a TEG."
+ id = "teg"
+ build_path = /obj/item/circuitboard/machine/generator
+ category = list ("Engineering Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
/datum/design/board/announcement_system
name = "Automated Announcement System Board"
desc = "The circuit board for an automated announcement system."
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index 89377a8e1d4e..3f4e99afd794 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -127,3 +127,16 @@
RND_CATEGORY_STOCK_PARTS + RND_SUBCATEGORY_STOCK_PARTS_TURBINE
)
departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING
+/datum/design/board/pacman/super
+ name = "Machine Design (SUPERPACMAN-type Generator Board)"
+ desc = "The circuit board that for a SUPERPACMAN-type portable generator."
+ id = "superpacman"
+ build_path = /obj/item/circuitboard/machine/pacman/super
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
+
+/datum/design/board/pacman/mrs
+ name = "Machine Design (MRSPACMAN-type Generator Board)"
+ desc = "The circuit board that for a MRSPACMAN-type portable generator."
+ id = "mrspacman"
+ build_path = /obj/item/circuitboard/machine/pacman/mrs
+ departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index c33156361018..577c86a50a08 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -662,6 +662,10 @@
"turbine_compressor",
"turbine_rotor",
"turbine_stator",
+ "circulator",
+ "teg",
+ "superpacman",
+ "mrspacman",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500)
discount_experiments = list(/datum/experiment/scanning/points/machinery_pinpoint_scan/tier2_capacitors = 2500)
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 8f87770b4d33..b5e1d125b73f 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -32,7 +32,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE)
return FALSE
/obj/machinery/bsa
- icon = 'icons/obj/machines/particle_accelerator.dmi'
+ icon = 'icons/obj/particle_accelerator.dmi'
density = TRUE
anchored = TRUE
@@ -260,7 +260,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE)
name = "bluespace artillery control"
use_power = NO_POWER_USE
circuit = /obj/item/circuitboard/computer/bsa_control
- icon = 'icons/obj/machines/particle_accelerator.dmi'
+ icon = 'icons/obj/particle_accelerator.dmi'
icon_state = "control_boxp"
icon_keyboard = null
icon_screen = null
diff --git a/icons/obj/engine/singularity.dmi b/icons/obj/engine/singularity.dmi
index e231032f57688b0e522540787057d49154a79297..9d11f886accf9a36fb99c0e73576552d93d70328 100644
GIT binary patch
literal 31396
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
literal 30146
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