mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
A lot of new defines are now in inventory_sizes.dm, which contains; All the size identifiers (the thing that tells the game if something is bulky, or w/e). Storage costs for all the sizes, which are exponents of two, as previously. A few constants for inventory size. Also changes all storage item's capacity definitions by basing it off of how many 'normal slots' exist for it. This allows one to change the definition for all of the defines in the file, and everything will follow along without needing to change 500 files. In testing, I made all ITEMSIZE_COST_* defines doubled, and nothing had broke. The benefit of doing all of this is that it makes adding new weight classes in the future much simpler, and makes knowing how much space a container has easier, as seeing ITEMSIZE_COST_NORMAL * 7 means it can hold seven normal items.
400 lines
16 KiB
Plaintext
400 lines
16 KiB
Plaintext
// BUILDABLE SMES(Superconducting Magnetic Energy Storage) UNIT
|
|
//
|
|
// Last Change 1.1.2015 by Atlantis - Happy New Year!
|
|
//
|
|
// This is subtype of SMES that should be normally used. It can be constructed, deconstructed and hacked.
|
|
// It also supports RCON System which allows you to operate it remotely, if properly set.
|
|
|
|
//MAGNETIC COILS - These things actually store and transmit power within the SMES. Different types have different
|
|
/obj/item/weapon/smes_coil
|
|
name = "superconductive magnetic coil"
|
|
desc = "Standard superconductive magnetic coil with average capacity and I/O rating."
|
|
icon = 'icons/obj/stock_parts.dmi'
|
|
icon_state = "smes_coil" // Just few icons patched together. If someone wants to make better icon, feel free to do so!
|
|
w_class = ITEMSIZE_LARGE // It's LARGE (backpack size)
|
|
var/ChargeCapacity = 6000000 // 100 kWh
|
|
var/IOCapacity = 250000 // 250 kW
|
|
|
|
// 20% Charge Capacity, 60% I/O Capacity. Used for substation/outpost SMESs.
|
|
/obj/item/weapon/smes_coil/weak
|
|
name = "basic superconductive magnetic coil"
|
|
desc = "Cheaper model of standard superconductive magnetic coil. It's capacity and I/O rating are considerably lower."
|
|
ChargeCapacity = 1200000 // 20 kWh
|
|
IOCapacity = 150000 // 150 kW
|
|
|
|
// 1000% Charge Capacity, 20% I/O Capacity
|
|
/obj/item/weapon/smes_coil/super_capacity
|
|
name = "superconductive capacitance coil"
|
|
desc = "Specialised version of standard superconductive magnetic coil. This one has significantly stronger containment field, allowing for significantly larger power storage. It's IO rating is much lower, however."
|
|
ChargeCapacity = 60000000 // 1000 kWh
|
|
IOCapacity = 50000 // 50 kW
|
|
|
|
// 10% Charge Capacity, 400% I/O Capacity. Technically turns SMES into large super capacitor.Ideal for shields.
|
|
/obj/item/weapon/smes_coil/super_io
|
|
name = "superconductive transmission coil"
|
|
desc = "Specialised version of standard superconductive magnetic coil. While this one won't store almost any power, it rapidly transfers power, making it useful in systems which require large throughput."
|
|
ChargeCapacity = 600000 // 10 kWh
|
|
IOCapacity = 1000000 // 1000 kW
|
|
|
|
|
|
// SMES SUBTYPES - THESE ARE MAPPED IN AND CONTAIN DIFFERENT TYPES OF COILS
|
|
|
|
// These are used on individual outposts as backup should power line be cut, or engineering outpost lost power.
|
|
// 1M Charge, 150K I/O
|
|
/obj/machinery/power/smes/buildable/outpost_substation/New()
|
|
..(0)
|
|
component_parts += new /obj/item/weapon/smes_coil/weak(src)
|
|
recalc_coils()
|
|
|
|
// This one is pre-installed on engineering shuttle. Allows rapid charging/discharging for easier transport of power to outpost
|
|
// 11M Charge, 2.5M I/O
|
|
/obj/machinery/power/smes/buildable/power_shuttle/New()
|
|
..(0)
|
|
component_parts += new /obj/item/weapon/smes_coil/super_io(src)
|
|
component_parts += new /obj/item/weapon/smes_coil/super_io(src)
|
|
component_parts += new /obj/item/weapon/smes_coil(src)
|
|
recalc_coils()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// END SMES SUBTYPES
|
|
|
|
// SMES itself
|
|
/obj/machinery/power/smes/buildable
|
|
var/max_coils = 6 //30M capacity, 1.5MW input/output when fully upgraded /w default coils
|
|
var/cur_coils = 1 // Current amount of installed coils
|
|
var/safeties_enabled = 1 // If 0 modifications can be done without discharging the SMES, at risk of critical failure.
|
|
var/failing = 0 // If 1 critical failure has occured and SMES explosion is imminent.
|
|
var/datum/wires/smes/wires
|
|
var/grounding = 1 // Cut to quickly discharge, at cost of "minor" electrical issues in output powernet.
|
|
var/RCon = 1 // Cut to disable AI and remote control.
|
|
var/RCon_tag = "NO_TAG" // RCON tag, change to show it on SMES Remote control console.
|
|
charge = 0
|
|
should_be_mapped = 1
|
|
|
|
/obj/machinery/power/smes/buildable/Destroy()
|
|
qdel(wires)
|
|
wires = null
|
|
for(var/datum/nano_module/rcon/R in world)
|
|
R.FindDevices()
|
|
return ..()
|
|
|
|
// Proc: process()
|
|
// Parameters: None
|
|
// Description: Uses parent process, but if grounding wire is cut causes sparks to fly around.
|
|
// This also causes the SMES to quickly discharge, and has small chance of damaging output APCs.
|
|
/obj/machinery/power/smes/buildable/process()
|
|
if(!grounding && (Percentage() > 5))
|
|
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
|
s.set_up(5, 1, src)
|
|
s.start()
|
|
charge -= (output_level_max * SMESRATE)
|
|
if(prob(1)) // Small chance of overload occuring since grounding is disabled.
|
|
apcs_overload(5,10)
|
|
|
|
..()
|
|
|
|
// Proc: attack_ai()
|
|
// Parameters: None
|
|
// Description: AI requires the RCON wire to be intact to operate the SMES.
|
|
/obj/machinery/power/smes/buildable/attack_ai()
|
|
if(RCon)
|
|
..()
|
|
else // RCON wire cut
|
|
usr << "<span class='warning'>Connection error: Destination Unreachable.</span>"
|
|
|
|
// Cyborgs standing next to the SMES can play with the wiring.
|
|
if(istype(usr, /mob/living/silicon/robot) && Adjacent(usr) && open_hatch)
|
|
wires.Interact(usr)
|
|
|
|
// Proc: New()
|
|
// Parameters: None
|
|
// Description: Adds standard components for this SMES, and forces recalculation of properties.
|
|
/obj/machinery/power/smes/buildable/New(var/install_coils = 1)
|
|
component_parts = list()
|
|
component_parts += new /obj/item/stack/cable_coil(src,30)
|
|
src.wires = new /datum/wires/smes(src)
|
|
|
|
// Allows for mapped-in SMESs with larger capacity/IO
|
|
if(install_coils)
|
|
for(var/i = 1, i <= cur_coils, i++)
|
|
component_parts += new /obj/item/weapon/smes_coil(src)
|
|
recalc_coils()
|
|
..()
|
|
|
|
// Proc: attack_hand()
|
|
// Parameters: None
|
|
// Description: Opens the UI as usual, and if cover is removed opens the wiring panel.
|
|
/obj/machinery/power/smes/buildable/attack_hand()
|
|
..()
|
|
if(open_hatch)
|
|
wires.Interact(usr)
|
|
|
|
// Proc: recalc_coils()
|
|
// Parameters: None
|
|
// Description: Updates properties (IO, capacity, etc.) of this SMES by checking internal components.
|
|
/obj/machinery/power/smes/buildable/proc/recalc_coils()
|
|
if ((cur_coils <= max_coils) && (cur_coils >= 1))
|
|
capacity = 0
|
|
input_level_max = 0
|
|
output_level_max = 0
|
|
for(var/obj/item/weapon/smes_coil/C in component_parts)
|
|
capacity += C.ChargeCapacity
|
|
input_level_max += C.IOCapacity
|
|
output_level_max += C.IOCapacity
|
|
charge = between(0, charge, capacity)
|
|
return 1
|
|
else
|
|
return 0
|
|
|
|
// Proc: total_system_failure()
|
|
// Parameters: 2 (intensity - how strong the failure is, user - person which caused the failure)
|
|
// Description: Checks the sensors for alerts. If change (alerts cleared or detected) occurs, calls for icon update.
|
|
/obj/machinery/power/smes/buildable/proc/total_system_failure(var/intensity = 0, var/mob/user as mob)
|
|
// SMESs store very large amount of power. If someone screws up (ie: Disables safeties and attempts to modify the SMES) very bad things happen.
|
|
// Bad things are based on charge percentage.
|
|
// Possible effects:
|
|
// Sparks - Lets out few sparks, mostly fire hazard if phoron present. Otherwise purely aesthetic.
|
|
// Shock - Depending on intensity harms the user. Insultated Gloves protect against weaker shocks, but strong shock bypasses them.
|
|
// EMP Pulse - Lets out EMP pulse discharge which screws up nearby electronics.
|
|
// Light Overload - X% chance to overload each lighting circuit in connected powernet. APC based.
|
|
// APC Failure - X% chance to destroy APC causing very weak explosion too. Won't cause hull breach or serious harm.
|
|
// SMES Explosion - X% chance to destroy the SMES, in moderate explosion. May cause small hull breach.
|
|
|
|
if (!intensity)
|
|
return
|
|
|
|
var/mob/living/carbon/human/h_user = null
|
|
if (!istype(user, /mob/living/carbon/human))
|
|
return
|
|
else
|
|
h_user = user
|
|
|
|
|
|
// Preparations
|
|
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
|
// Check if user has protected gloves.
|
|
var/user_protected = 0
|
|
if(h_user.gloves)
|
|
var/obj/item/clothing/gloves/G = h_user.gloves
|
|
if(G.siemens_coefficient == 0)
|
|
user_protected = 1
|
|
log_game("SMES FAILURE: <b>[src.x]X [src.y]Y [src.z]Z</b> User: [usr.ckey], Intensity: [intensity]/100")
|
|
message_admins("SMES FAILURE: <b>[src.x]X [src.y]Y [src.z]Z</b> User: [usr.ckey], Intensity: [intensity]/100 - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>")
|
|
|
|
|
|
switch (intensity)
|
|
if (0 to 15)
|
|
// Small overcharge
|
|
// Sparks, Weak shock
|
|
s.set_up(2, 1, src)
|
|
s.start()
|
|
if (user_protected && prob(80))
|
|
h_user << "Small electrical arc almost burns your hand. Luckily you had your gloves on!"
|
|
else
|
|
h_user << "Small electrical arc sparks and burns your hand as you touch the [src]!"
|
|
h_user.adjustFireLoss(rand(5,10))
|
|
h_user.Paralyse(2)
|
|
charge = 0
|
|
|
|
if (16 to 35)
|
|
// Medium overcharge
|
|
// Sparks, Medium shock, Weak EMP
|
|
s.set_up(4,1,src)
|
|
s.start()
|
|
if (user_protected && prob(25))
|
|
h_user << "Medium electrical arc sparks and almost burns your hand. Luckily you had your gloves on!"
|
|
else
|
|
h_user << "Medium electrical sparks as you touch the [src], severely burning your hand!"
|
|
h_user.adjustFireLoss(rand(10,25))
|
|
h_user.Paralyse(5)
|
|
spawn(0)
|
|
empulse(src.loc, 2, 4)
|
|
charge = 0
|
|
|
|
if (36 to 60)
|
|
// Strong overcharge
|
|
// Sparks, Strong shock, Strong EMP, 10% light overload. 1% APC failure
|
|
s.set_up(7,1,src)
|
|
s.start()
|
|
if (user_protected)
|
|
h_user << "Strong electrical arc sparks between you and [src], ignoring your gloves and burning your hand!"
|
|
h_user.adjustFireLoss(rand(25,60))
|
|
h_user.Paralyse(8)
|
|
else
|
|
h_user << "Strong electrical arc sparks between you and [src], knocking you out for a while!"
|
|
h_user.adjustFireLoss(rand(35,75))
|
|
h_user.Paralyse(12)
|
|
spawn(0)
|
|
empulse(src.loc, 8, 16)
|
|
charge = 0
|
|
apcs_overload(1, 10)
|
|
src.ping("Caution. Output regulators malfunction. Uncontrolled discharge detected.")
|
|
|
|
if (61 to INFINITY)
|
|
// Massive overcharge
|
|
// Sparks, Near - instantkill shock, Strong EMP, 25% light overload, 5% APC failure. 50% of SMES explosion. This is bad.
|
|
s.set_up(10,1,src)
|
|
s.start()
|
|
h_user << "Massive electrical arc sparks between you and [src]. Last thing you can think about is \"Oh shit...\""
|
|
// Remember, we have few gigajoules of electricity here.. Turn them into crispy toast.
|
|
h_user.adjustFireLoss(rand(150,195))
|
|
h_user.Paralyse(25)
|
|
spawn(0)
|
|
empulse(src.loc, 32, 64)
|
|
charge = 0
|
|
apcs_overload(5, 25)
|
|
src.ping("Caution. Output regulators malfunction. Significant uncontrolled discharge detected.")
|
|
|
|
if (prob(50))
|
|
// Added admin-notifications so they can stop it when griffed.
|
|
log_game("SMES explosion imminent.")
|
|
message_admins("SMES explosion imminent.")
|
|
src.ping("DANGER! Magnetic containment field unstable! Containment field failure imminent!")
|
|
failing = 1
|
|
// 30 - 60 seconds and then BAM!
|
|
spawn(rand(300,600))
|
|
if(!failing) // Admin can manually set this var back to 0 to stop overload, for use when griffed.
|
|
update_icon()
|
|
src.ping("Magnetic containment stabilised.")
|
|
return
|
|
src.ping("DANGER! Magnetic containment field failure in 3 ... 2 ... 1 ...")
|
|
explosion(src.loc,1,2,4,8)
|
|
// Not sure if this is necessary, but just in case the SMES *somehow* survived..
|
|
qdel(src)
|
|
|
|
|
|
|
|
// Proc: apcs_overload()
|
|
// Parameters: 2 (failure_chance - chance to actually break the APC, overload_chance - Chance of breaking lights)
|
|
// Description: Damages output powernet by power surge. Destroys few APCs and lights, depending on parameters.
|
|
/obj/machinery/power/smes/buildable/proc/apcs_overload(var/failure_chance, var/overload_chance)
|
|
if (!src.powernet)
|
|
return
|
|
|
|
for(var/obj/machinery/power/terminal/T in src.powernet.nodes)
|
|
if(istype(T.master, /obj/machinery/power/apc))
|
|
var/obj/machinery/power/apc/A = T.master
|
|
if (prob(overload_chance))
|
|
A.overload_lighting()
|
|
if (prob(failure_chance))
|
|
A.set_broken()
|
|
|
|
// Proc: update_icon()
|
|
// Parameters: None
|
|
// Description: Allows us to use special icon overlay for critical SMESs
|
|
/obj/machinery/power/smes/buildable/update_icon()
|
|
if (failing)
|
|
overlays.Cut()
|
|
overlays += image('icons/obj/power.dmi', "smes-crit")
|
|
else
|
|
..()
|
|
|
|
// Proc: attackby()
|
|
// Parameters: 2 (W - object that was used on this machine, user - person which used the object)
|
|
// Description: Handles tool interaction. Allows deconstruction/upgrading/fixing.
|
|
/obj/machinery/power/smes/buildable/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
|
// No more disassembling of overloaded SMESs. You broke it, now enjoy the consequences.
|
|
if (failing)
|
|
user << "<span class='warning'>The [src]'s screen is flashing with alerts. It seems to be overloaded! Touching it now is probably not a good idea.</span>"
|
|
return
|
|
// If parent returned 1:
|
|
// - Hatch is open, so we can modify the SMES
|
|
// - No action was taken in parent function (terminal de/construction atm).
|
|
if (..())
|
|
|
|
// Multitool - change RCON tag
|
|
if(istype(W, /obj/item/device/multitool))
|
|
var/newtag = input(user, "Enter new RCON tag. Use \"NO_TAG\" to disable RCON or leave empty to cancel.", "SMES RCON system") as text
|
|
if(newtag)
|
|
RCon_tag = newtag
|
|
user << "<span class='notice'>You changed the RCON tag to: [newtag]</span>"
|
|
return
|
|
// Charged above 1% and safeties are enabled.
|
|
if((charge > (capacity/100)) && safeties_enabled)
|
|
user << "<span class='warning'>Safety circuit of [src] is preventing modifications while it's charged!</span>"
|
|
return
|
|
|
|
if (output_attempt || input_attempt)
|
|
user << "<span class='warning'>Turn off the [src] first!</span>"
|
|
return
|
|
|
|
// Probability of failure if safety circuit is disabled (in %)
|
|
var/failure_probability = round((charge / capacity) * 100)
|
|
|
|
// If failure probability is below 5% it's usually safe to do modifications
|
|
if (failure_probability < 5)
|
|
failure_probability = 0
|
|
|
|
// Crowbar - Disassemble the SMES.
|
|
if(istype(W, /obj/item/weapon/crowbar))
|
|
if (terminal)
|
|
user << "<span class='warning'>You have to disassemble the terminal first!</span>"
|
|
return
|
|
|
|
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
|
|
user << "<span class='warning'>You begin to disassemble the [src]!</span>"
|
|
if (do_after(usr, 100 * cur_coils)) // More coils = takes longer to disassemble. It's complex so largest one with 5 coils will take 50s
|
|
|
|
if (failure_probability && prob(failure_probability))
|
|
total_system_failure(failure_probability, user)
|
|
return
|
|
|
|
usr << "\red You have disassembled the SMES cell!"
|
|
var/obj/structure/frame/M = new /obj/structure/frame(src.loc)
|
|
M.frame_type = "machine"
|
|
M.state = 2
|
|
M.icon_state = "machine_1"
|
|
for(var/obj/I in component_parts)
|
|
I.loc = src.loc
|
|
component_parts -= I
|
|
qdel(src)
|
|
return
|
|
|
|
// Superconducting Magnetic Coil - Upgrade the SMES
|
|
else if(istype(W, /obj/item/weapon/smes_coil))
|
|
if (cur_coils < max_coils)
|
|
|
|
if (failure_probability && prob(failure_probability))
|
|
total_system_failure(failure_probability, user)
|
|
return
|
|
|
|
usr << "You install the coil into the SMES unit!"
|
|
user.drop_item()
|
|
cur_coils ++
|
|
component_parts += W
|
|
W.loc = src
|
|
recalc_coils()
|
|
else
|
|
usr << "\red You can't insert more coils to this SMES unit!"
|
|
|
|
// Proc: toggle_input()
|
|
// Parameters: None
|
|
// Description: Switches the input on/off depending on previous setting
|
|
/obj/machinery/power/smes/buildable/proc/toggle_input()
|
|
inputting(!input_attempt)
|
|
update_icon()
|
|
|
|
// Proc: toggle_output()
|
|
// Parameters: None
|
|
// Description: Switches the output on/off depending on previous setting
|
|
/obj/machinery/power/smes/buildable/proc/toggle_output()
|
|
outputting(!output_attempt)
|
|
update_icon()
|
|
|
|
// Proc: set_input()
|
|
// Parameters: 1 (new_input - New input value in Watts)
|
|
// Description: Sets input setting on this SMES. Trims it if limits are exceeded.
|
|
/obj/machinery/power/smes/buildable/proc/set_input(var/new_input = 0)
|
|
input_level = between(0, new_input, input_level_max)
|
|
update_icon()
|
|
|
|
// Proc: set_output()
|
|
// Parameters: 1 (new_output - New output value in Watts)
|
|
// Description: Sets output setting on this SMES. Trims it if limits are exceeded.
|
|
/obj/machinery/power/smes/buildable/proc/set_output(var/new_output = 0)
|
|
output_level = between(0, new_output, output_level_max)
|
|
update_icon() |