mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-23 16:42:13 +00:00
* Base work for the unathi robot subspecies. * Adds metabolism species, kidney vars, and the robot unathi organs. * Moves some action buttons to organs, pretty much a bay port right now. Todo: the unathi and alien stuff should also go here. * First autakh implant power. * Fixes the organs action button this time. * Finishes more implants, and interactions with flashs and vaurca. * Prepare for great changes. * Drops the real bomb, boss. * He who fights with monsters. * Far more work into augments and limb removing powers. * Limb verbs should be good now. * A LOT of work into the assited organ, allowing it to bleed and etc, as well adding a new chem that will stop bleeding in their case. * Probably the last work on implants. * Some extra touches. * Some tweaks to the species. * More fixes and adds kyre's sprites. * More runtime fixes. * Fixes the species name too. * Fixes travis. * Updates this file too to work with the new tools procs. * Adds changelog * Fixed changelog. * Unathi hair and lore description. * Some tweaks to this too. * Locks away them for now, they will be released after we got all the events and etc done. * Changes this chemical. * Fixes an airlock runtime. * Adds the non scan flag to the autakh, mostly due to some bizzare interactions with changelings and cloning. * Organs removal changes; can't take out the organ if it is too damage. * Restricts them back again. * Robotic organs now have the proper icons and names. * Adds sprites for their organs and some extra tweaks. * Fixes this missing icon. * emp should also now hurt assited organs. * Tweaks more organ related things. * Fixes the head not being properly set as well. * Fixes their flags. * fixes the flag for real this time. * Poze's review. * Changes the au'takh organ buttons to don't be animated. * Helps with adminbus or something. * Fowl's requested changes. * Fixes a typo. * Robotic limb's brute and burn mods are now controlled by the limb model. * Fowl's changes once more. * Stops some spam. * More grammar. * No eal. * Skull's review.
389 lines
12 KiB
Plaintext
389 lines
12 KiB
Plaintext
/obj/machinery/power/am_control_unit
|
|
name = "antimatter control unit"
|
|
desc = "The control unit for an antimatter reactor. Probably safe."
|
|
description_info = "Use a wrench to attach the control unit to the ground, then arrange the reactor sections nearby. Reactor sections can only be activated if they are near the control unit, but otherwise are not restricted in how they must be placed."
|
|
description_antag = "The antimatter engine will quickly destabilize if the fuel injection rate is set too high, causing a large explosion."
|
|
icon = 'icons/obj/machines/new_ame.dmi'
|
|
icon_state = "control"
|
|
var/icon_mod = "on" // on, critical, or fuck
|
|
var/old_icon_mod = "on"
|
|
anchored = 0
|
|
density = 1
|
|
use_power = 1
|
|
idle_power_usage = 100
|
|
active_power_usage = 1000
|
|
|
|
var/list/obj/machinery/am_shielding/linked_shielding
|
|
var/list/obj/machinery/am_shielding/linked_cores
|
|
var/obj/item/weapon/am_containment/fueljar
|
|
var/update_shield_icons = 0
|
|
var/stability = 100
|
|
var/exploding = 0
|
|
var/exploded = 0
|
|
|
|
var/active = 0 //On or not
|
|
var/fuel_injection = 2 //How much fuel to inject
|
|
var/shield_icon_delay = 0 //delays resetting for a short time
|
|
var/reported_core_efficiency = 0
|
|
|
|
var/power_cycle = 0
|
|
var/power_cycle_delay = 4 //How many ticks till produce_power is called
|
|
var/stored_core_stability = 0
|
|
var/stored_core_stability_delay = 0
|
|
|
|
var/stored_power = 0 //Power to deploy per tick
|
|
|
|
|
|
/obj/machinery/power/am_control_unit/New()
|
|
..()
|
|
linked_shielding = list()
|
|
linked_cores = list()
|
|
|
|
/obj/machinery/power/am_control_unit/Destroy()//Perhaps damage and run stability checks rather than just del on the others
|
|
for(var/obj/machinery/am_shielding/AMS in linked_shielding)
|
|
AMS.control_unit = null
|
|
qdel(AMS)
|
|
for(var/obj/machinery/am_shielding/AMS in linked_cores)
|
|
AMS.control_unit = null
|
|
qdel(AMS)
|
|
|
|
qdel(fueljar)
|
|
fueljar = null
|
|
return ..()
|
|
|
|
|
|
/obj/machinery/power/am_control_unit/machinery_process()
|
|
if(exploding && !exploded)
|
|
message_admins("AME explosion at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>) - Last touched by [fingerprintslast]",0,1)
|
|
exploded=1
|
|
explosion(get_turf(src),8,10,12,15)
|
|
if(src)
|
|
qdel(src)
|
|
|
|
if(update_shield_icons && !shield_icon_delay)
|
|
check_shield_icons()
|
|
update_shield_icons = 0
|
|
|
|
if(stat & (NOPOWER|BROKEN) || !active)//can update the icons even without power
|
|
return
|
|
|
|
if(!fueljar)//No fuel but we are on, shutdown
|
|
toggle_power()
|
|
//Angry buzz or such here
|
|
return
|
|
|
|
check_core_stability()
|
|
|
|
add_avail(stored_power)
|
|
|
|
power_cycle++
|
|
if(power_cycle >= power_cycle_delay)
|
|
produce_power()
|
|
power_cycle = 0
|
|
|
|
/obj/machinery/power/am_control_unit/proc/produce_power()
|
|
playsound(get_turf(src), 'sound/effects/bang.ogg', 25, 1)
|
|
for (var/thing in linked_cores)
|
|
flick("core2", thing)
|
|
var/core_power = reported_core_efficiency //Effectively how much fuel we can safely deal with
|
|
if(core_power <= 0)
|
|
return 0//Something is wrong
|
|
var/core_damage = 0
|
|
var/fuel = fueljar.usefuel(fuel_injection)
|
|
|
|
stored_power = (fuel / core_power) * fuel * AM_POWER_FACTOR // Was 200000, was too much. New value run past Aurx. - N3X
|
|
//Now check if the cores could deal with it safely, this is done after so you can overload for more power if needed, still a bad idea
|
|
if(fuel > (2*core_power)) //More fuel has been put in than the current cores can deal with
|
|
if(prob(50))
|
|
core_damage = 1 //Small chance of damage
|
|
if((fuel-core_power) > 5)
|
|
core_damage = 5 //Now its really starting to overload the cores
|
|
if((fuel-core_power) > 10)
|
|
core_damage = 20 //Welp now you did it, they wont stand much of this
|
|
if(core_damage == 0)
|
|
return
|
|
for(var/obj/machinery/am_shielding/AMS in linked_cores)
|
|
AMS.stability -= core_damage
|
|
AMS.check_stability(1)
|
|
playsound(get_turf(src), 'sound/effects/bang.ogg', 50, 1)
|
|
|
|
/obj/machinery/power/am_control_unit/emp_act(severity)
|
|
switch(severity)
|
|
if(1)
|
|
if(active)
|
|
toggle_power()
|
|
stability -= rand(15,30)
|
|
if(2)
|
|
if(active)
|
|
toggle_power()
|
|
stability -= rand(10,20)
|
|
..()
|
|
|
|
/obj/machinery/power/am_control_unit/ex_act(severity)
|
|
switch(severity)
|
|
if(1.0)
|
|
stability -= 60
|
|
if(2.0)
|
|
stability -= 40
|
|
if(3.0)
|
|
stability -= 20
|
|
check_stability()
|
|
return
|
|
|
|
/obj/machinery/power/am_control_unit/power_change()
|
|
..()
|
|
if(stat & NOPOWER && active)
|
|
toggle_power()
|
|
return
|
|
|
|
/obj/machinery/power/am_control_unit/update_icon()
|
|
if(active)
|
|
icon_state = "control_[icon_mod]"
|
|
else
|
|
icon_state = "control"
|
|
//No other icons for it atm
|
|
|
|
/obj/machinery/power/am_control_unit/attackby(obj/item/W, mob/user)
|
|
if(!istype(W) || !user)
|
|
return
|
|
if(W.iswrench())
|
|
if(!anchored)
|
|
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 75, 1)
|
|
user.visible_message("[user.name] secures the [src.name] to the floor.", \
|
|
"You secure the anchor bolts to the floor.", \
|
|
"You hear a ratchet")
|
|
src.anchored = 1
|
|
update_shield_icons = 2
|
|
check_shield_icons()
|
|
connect_to_network()
|
|
else if(!linked_shielding.len > 0)
|
|
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 75, 1)
|
|
user.visible_message("[user.name] unsecures the [src.name].", \
|
|
"You remove the anchor bolts.", \
|
|
"You hear a ratchet")
|
|
src.anchored = 0
|
|
disconnect_from_network()
|
|
else
|
|
to_chat(user, "<span class='warning'>Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!</span>")
|
|
return
|
|
|
|
if(istype(W, /obj/item/weapon/am_containment))
|
|
if(fueljar)
|
|
to_chat(user, "<span class='warning'>There is already a [fueljar] inside!</span>")
|
|
return
|
|
fueljar = W
|
|
user.drop_from_inventory(W, src)
|
|
message_admins("AME loaded with fuel by [user.real_name] ([user.key]) at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
|
user.visible_message("[user.name] loads an [W.name] into the [src.name].", \
|
|
"You load an [W.name].", \
|
|
"You hear a thunk.")
|
|
return
|
|
|
|
if(W.force >= 20)
|
|
stability -= W.force/2
|
|
check_stability()
|
|
..()
|
|
return
|
|
|
|
|
|
/obj/machinery/power/am_control_unit/attack_hand(mob/user as mob)
|
|
if(anchored)
|
|
interact(user)
|
|
return
|
|
|
|
|
|
/obj/machinery/power/am_control_unit/proc/add_shielding(var/obj/machinery/am_shielding/AMS, var/AMS_linking = 0)
|
|
if(!istype(AMS))
|
|
return 0
|
|
if(!anchored)
|
|
return 0
|
|
if(!AMS_linking && !AMS.link_control(src))
|
|
return 0
|
|
if(!(AMS in linked_shielding))
|
|
linked_shielding.Add(AMS)
|
|
update_shield_icons = 1
|
|
return 1
|
|
|
|
|
|
/obj/machinery/power/am_control_unit/proc/remove_shielding(var/obj/machinery/am_shielding/AMS)
|
|
if(!istype(AMS))
|
|
return 0
|
|
linked_shielding.Remove(AMS)
|
|
update_shield_icons = 2
|
|
if(active)
|
|
toggle_power()
|
|
return 1
|
|
|
|
|
|
/obj/machinery/power/am_control_unit/proc/check_stability()//TODO: make it break when low also might want to add a way to fix it like a part or such that can be replaced
|
|
if(stability <= 0)
|
|
qdel(src)
|
|
return
|
|
|
|
|
|
/obj/machinery/power/am_control_unit/proc/toggle_power()
|
|
active = !active
|
|
if(active)
|
|
use_power = 2
|
|
visible_message("The [src.name] starts up.")
|
|
else
|
|
use_power = 1
|
|
visible_message("The [src.name] shuts down.")
|
|
for(var/obj/machinery/am_shielding/AMS in linked_cores)
|
|
AMS.update_icon()
|
|
update_icon()
|
|
return
|
|
|
|
|
|
/obj/machinery/power/am_control_unit/proc/check_shield_icons()//Forces icon_update for all shields
|
|
if(shield_icon_delay)
|
|
return
|
|
shield_icon_delay = 1
|
|
if(update_shield_icons == 2)//2 means to clear everything and rebuild
|
|
for(var/obj/machinery/am_shielding/neighbor in cardinalrange(loc))
|
|
if(!neighbor.control_unit)
|
|
linked_shielding += neighbor
|
|
for(var/obj/machinery/am_shielding/AMS in linked_shielding)
|
|
if(AMS.processing)
|
|
AMS.shutdown_core()
|
|
AMS.control_unit = null
|
|
spawn(10)
|
|
AMS.controllerscan()
|
|
AMS.assimilate()
|
|
linked_shielding = list()
|
|
|
|
else
|
|
for(var/obj/machinery/am_shielding/AMS in linked_shielding)
|
|
AMS.update_icon()
|
|
sleep(20)
|
|
shield_icon_delay = 0
|
|
|
|
|
|
/obj/machinery/power/am_control_unit/proc/check_core_stability()
|
|
//if(stored_core_stability_delay || linked_cores.len <= 0) return
|
|
if(linked_cores.len <= 0)
|
|
return
|
|
//stored_core_stability_delay = 1
|
|
stored_core_stability = 0
|
|
for(var/thing in linked_cores)
|
|
var/obj/machinery/am_shielding/AMS = thing
|
|
if (QDELETED(AMS))
|
|
continue
|
|
|
|
stored_core_stability += AMS.stability
|
|
stored_core_stability /= linked_cores.len
|
|
switch(stored_core_stability)
|
|
if(0 to 24)
|
|
icon_mod = "fuck"
|
|
if(25 to 49)
|
|
icon_mod = "critical"
|
|
if(50 to INFINITY)
|
|
icon_mod = "on"
|
|
|
|
if(icon_mod != old_icon_mod)
|
|
old_icon_mod = icon_mod
|
|
update_icon()
|
|
|
|
//spawn(40)
|
|
// stored_core_stability_delay = 0
|
|
|
|
/obj/machinery/power/am_control_unit/interact(mob/user)
|
|
if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER)))
|
|
if(!istype(user, /mob/living/silicon/ai))
|
|
user.unset_machine()
|
|
user << browse(null, "window=AMcontrol")
|
|
return
|
|
return ui_interact(user)
|
|
|
|
/obj/machinery/power/am_control_unit/ui_interact(mob/user, ui_key = "main")
|
|
if(!user)
|
|
return
|
|
|
|
var/list/fueljar_data=null
|
|
if(fueljar)
|
|
fueljar_data=list(
|
|
"fuel"=fueljar.fuel,
|
|
"fuel_max"=fueljar.fuel_max,
|
|
"injecting"=fuel_injection
|
|
)
|
|
|
|
var/list/data = list(
|
|
"active" = active,
|
|
//"stability" = stability,
|
|
"linked_shields" = linked_shielding.len,
|
|
"linked_cores" = linked_cores.len,
|
|
"efficiency" = reported_core_efficiency,
|
|
"stability" = stored_core_stability,
|
|
"stored_power" = stored_power,
|
|
"fueljar" = fueljar_data,
|
|
"siliconUser" = istype(user, /mob/living/silicon)
|
|
)
|
|
|
|
var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, ui_key)
|
|
if (!ui)
|
|
// the ui does not exist, so we'll create a new one
|
|
ui = new(user, src, ui_key, "ame.tmpl", "Antimatter Control Unit", 500, data["siliconUser"] ? 465 : 390)
|
|
// When the UI is first opened this is the data it will use
|
|
ui.set_initial_data(data)
|
|
ui.open()
|
|
// Auto update every Master Controller tick
|
|
ui.set_auto_update(1)
|
|
else
|
|
// The UI is already open so push the new data to it
|
|
ui.push_data(data)
|
|
return
|
|
|
|
|
|
/obj/machinery/power/am_control_unit/Topic(href, href_list)
|
|
if(..())
|
|
return 1
|
|
if(href_list["close"])
|
|
if(usr.machine == src)
|
|
usr.unset_machine()
|
|
return 1
|
|
//Ignore input if we are broken or guy is not touching us, AI can control from a ways away
|
|
if(stat & (BROKEN|NOPOWER))
|
|
usr.unset_machine()
|
|
usr << browse(null, "window=AMcontrol")
|
|
return
|
|
|
|
if(href_list["close"])
|
|
usr << browse(null, "window=AMcontrol")
|
|
usr.unset_machine()
|
|
return
|
|
|
|
if(href_list["togglestatus"])
|
|
toggle_power()
|
|
message_admins("AME toggled [active?"on":"off"] by [usr.real_name] ([usr.key]) at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
|
return 1
|
|
|
|
if(href_list["refreshicons"])
|
|
update_shield_icons = 2 // Fuck it
|
|
return 1
|
|
|
|
if(href_list["ejectjar"])
|
|
if(fueljar)
|
|
message_admins("AME fuel jar ejected by [usr.real_name] ([usr.key]) at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
|
fueljar.forceMove(src.loc)
|
|
fueljar = null
|
|
//fueljar.control_unit = null currently it does not care where it is
|
|
//update_icon() when we have the icon for it
|
|
return 1
|
|
|
|
if(href_list["set_strength"])
|
|
var/newval = input("Enter new injection strength") as num|null
|
|
if(isnull(newval))
|
|
return
|
|
fuel_injection=newval
|
|
fuel_injection=max(1,fuel_injection)
|
|
message_admins("AME injection strength set to [fuel_injection] by [usr.real_name] ([usr.key]) at ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
|
return 1
|
|
|
|
if(href_list["refreshstability"])
|
|
check_core_stability()
|
|
return 1
|
|
|
|
updateDialog()
|
|
return 1
|
|
|