-
Notifications
You must be signed in to change notification settings - Fork 267
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
696 additions
and
0 deletions.
There are no files selected for viewing
40 changes: 40 additions & 0 deletions
40
monkestation/code/modules/antimatter/code/containment_jar.dm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/obj/item/am_containment | ||
name = "antimatter containment jar" | ||
desc = "Holds antimatter." | ||
icon = 'monkestation/code/modules/antimatter/icons/antimatter.dmi' | ||
icon_state = "jar" | ||
density = FALSE | ||
anchored = FALSE | ||
force = 8 | ||
throwforce = 10 | ||
throw_speed = 1 | ||
throw_range = 2 | ||
|
||
var/fuel = 10000 | ||
var/fuel_max = 10000//Lets try this for now | ||
var/stability = 100//TODO: add all the stability things to this so its not very safe if you keep hitting in on things | ||
|
||
|
||
/obj/item/am_containment/ex_act(severity, target) | ||
switch(severity) | ||
if(1) | ||
explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess | ||
if(src) | ||
qdel(src) | ||
if(2) | ||
if(prob((fuel/10)-stability)) | ||
explosion(get_turf(src), 1, 2, 3, 5) | ||
if(src) | ||
qdel(src) | ||
return | ||
stability -= 40 | ||
if(3) | ||
stability -= 20 | ||
//check_stability() | ||
return | ||
|
||
/obj/item/am_containment/proc/usefuel(wanted) | ||
if(fuel < wanted) | ||
wanted = fuel | ||
fuel -= wanted | ||
return wanted |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,358 @@ | ||
/obj/machinery/power/am_control_unit | ||
name = "antimatter control unit" | ||
desc = "This device injects antimatter into connected shielding units, the more antimatter injected the more power produced. Wrench the device to set it up." | ||
icon = 'monkestation/code/modules/antimatter/icons/antimatter.dmi' | ||
icon_state = "control" | ||
anchored = FALSE | ||
density = TRUE | ||
use_power = IDLE_POWER_USE | ||
idle_power_usage = 100 | ||
active_power_usage = 1000 | ||
|
||
interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT | INTERACT_ATOM_REQUIRES_ANCHORED | ||
|
||
var/list/obj/machinery/am_shielding/linked_shielding | ||
var/list/obj/machinery/am_shielding/linked_cores | ||
var/obj/item/am_containment/fueljar | ||
var/update_shield_icons = 0 | ||
var/stability = 100 | ||
var/exploding = 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/Initialize() | ||
. = ..() | ||
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) | ||
QDEL_NULL(fueljar) | ||
return ..() | ||
|
||
|
||
/obj/machinery/power/am_control_unit/process() | ||
if(exploding) | ||
explosion(get_turf(src),8,12,18,12) | ||
if(src) | ||
qdel(src) | ||
|
||
if(update_shield_icons && !shield_icon_delay) | ||
check_shield_icons() | ||
update_shield_icons = 0 | ||
|
||
if(machine_stat & (NOPOWER|BROKEN) || !active)//can update the icons even without power | ||
return | ||
|
||
if(!fueljar)//No fuel but we are on, shutdown | ||
toggle_power() | ||
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) | ||
return | ||
|
||
add_avail(stored_power) | ||
|
||
power_cycle++ | ||
if(power_cycle >= power_cycle_delay) | ||
produce_power() | ||
power_cycle = 0 | ||
|
||
return | ||
|
||
|
||
/obj/machinery/power/am_control_unit/proc/produce_power() | ||
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) | ||
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*200000 | ||
//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(src.loc, 'sound/effects/bang.ogg', 50, 1) | ||
return | ||
|
||
|
||
/obj/machinery/power/am_control_unit/emp_act(severity) | ||
. = ..() | ||
if(. & EMP_PROTECT_SELF) | ||
return | ||
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/blob_act() | ||
stability -= 20 | ||
if(prob(100-stability))//Might infect the rest of the machine | ||
for(var/obj/machinery/am_shielding/AMS in linked_shielding) | ||
AMS.blob_act() | ||
qdel(src) | ||
return | ||
check_stability() | ||
return | ||
|
||
|
||
/obj/machinery/power/am_control_unit/ex_act(severity, target) | ||
stability -= (80 - (severity * 20)) | ||
check_stability() | ||
return | ||
|
||
|
||
/obj/machinery/power/am_control_unit/bullet_act(obj/projectile/P) | ||
. = ..() | ||
if(P.armor_flag != BULLET) | ||
stability -= P.force | ||
check_stability() | ||
|
||
|
||
/obj/machinery/power/am_control_unit/power_change() | ||
..() | ||
if(machine_stat & NOPOWER) | ||
if(active) | ||
toggle_power(1) | ||
else | ||
use_power = NO_POWER_USE | ||
|
||
else if(!machine_stat && anchored) | ||
use_power = IDLE_POWER_USE | ||
|
||
return | ||
|
||
|
||
/obj/machinery/power/am_control_unit/update_icon() | ||
if(active) | ||
icon_state = "control_on" | ||
else icon_state = "control" | ||
return ..() | ||
//No other icons for it atm | ||
|
||
|
||
/obj/machinery/power/am_control_unit/attackby(obj/item/W, mob/user, params) | ||
if(W.tool_behaviour == TOOL_WRENCH) | ||
if(!anchored) | ||
W.play_tool_sound(src, 75) | ||
user.visible_message("[user.name] secures the [src.name] to the floor.", \ | ||
"<span class='notice'>You secure the anchor bolts to the floor.</span>", \ | ||
"<span class='italics'>You hear a ratchet.</span>") | ||
src.anchored = TRUE | ||
connect_to_network() | ||
else if(!linked_shielding.len > 0) | ||
W.play_tool_sound(src, 75) | ||
user.visible_message("[user.name] unsecures the [src.name].", \ | ||
"<span class='notice'>You remove the anchor bolts.</span>", \ | ||
"<span class='italics'>You hear a ratchet.</span>") | ||
src.anchored = FALSE | ||
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>") | ||
|
||
else if(istype(W, /obj/item/am_containment)) | ||
if(fueljar) | ||
to_chat(user, "<span class='warning'>There is already a [fueljar] inside!</span>") | ||
return | ||
|
||
if(!user.transferItemToLoc(W, src)) | ||
return | ||
fueljar = W | ||
user.visible_message("[user.name] loads an [W.name] into the [src.name].", \ | ||
"<span class='notice'>You load an [W.name].</span>", \ | ||
"<span class='italics'>You hear a thunk.</span>") | ||
else | ||
return ..() | ||
|
||
|
||
/obj/machinery/power/am_control_unit/take_damage(damage, damage_type = BRUTE, sound_effect = 1) | ||
switch(damage_type) | ||
if(BRUTE) | ||
if(sound_effect) | ||
if(damage) | ||
playsound(loc, 'sound/weapons/smash.ogg', 50, 1) | ||
else | ||
playsound(loc, 'sound/weapons/tap.ogg', 50, 1) | ||
if(BURN) | ||
if(sound_effect) | ||
playsound(src.loc, 'sound/items/welder.ogg', 100, 1) | ||
else | ||
return | ||
if(damage >= 20) | ||
stability -= damage/2 | ||
check_stability() | ||
|
||
/obj/machinery/power/am_control_unit/proc/add_shielding(obj/machinery/am_shielding/AMS, AMS_linking = 0) | ||
if(!istype(AMS)) | ||
return 0 | ||
if(!anchored) | ||
return 0 | ||
if(!AMS_linking && !AMS.link_control(src)) | ||
return 0 | ||
linked_shielding.Add(AMS) | ||
update_shield_icons = 1 | ||
return 1 | ||
|
||
|
||
/obj/machinery/power/am_control_unit/proc/remove_shielding(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(powerfail = 0) | ||
active = !active | ||
if(active) | ||
use_power = ACTIVE_POWER_USE | ||
visible_message("The [src.name] starts up.") | ||
else | ||
use_power = !powerfail | ||
visible_message("The [src.name] shuts down.") | ||
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/AMS in linked_shielding) | ||
if(AMS.processing) | ||
AMS.shutdown_core() | ||
AMS.control_unit = null | ||
addtimer(CALLBACK(AMS, /obj/machinery/am_shielding.proc/controllerscan), 10) | ||
linked_shielding = list() | ||
else | ||
for(var/obj/machinery/am_shielding/AMS in linked_shielding) | ||
AMS.update_icon() | ||
addtimer(CALLBACK(src, .proc/reset_shield_icon_delay), 20) | ||
|
||
/obj/machinery/power/am_control_unit/proc/reset_shield_icon_delay() | ||
shield_icon_delay = 0 | ||
|
||
/obj/machinery/power/am_control_unit/proc/check_core_stability() | ||
if(stored_core_stability_delay || linked_cores.len <= 0) | ||
return | ||
stored_core_stability_delay = 1 | ||
stored_core_stability = 0 | ||
for(var/obj/machinery/am_shielding/AMS in linked_cores) | ||
stored_core_stability += AMS.stability | ||
stored_core_stability/=linked_cores.len | ||
addtimer(CALLBACK(src, .proc/reset_stored_core_stability_delay), 40) | ||
|
||
/obj/machinery/power/am_control_unit/proc/reset_stored_core_stability_delay() | ||
stored_core_stability_delay = 0 | ||
|
||
/obj/machinery/power/am_control_unit/ui_interact(mob/user) | ||
. = ..() | ||
if((get_dist(src, user) > 1) || (machine_stat & (BROKEN|NOPOWER))) | ||
if(!isAI(user)) | ||
user.unset_machine() | ||
user << browse(null, "window=AMcontrol") | ||
return | ||
|
||
var/dat = "" | ||
dat += "AntiMatter Control Panel<BR>" | ||
dat += "<A href='?src=[REF(src)];close=1'>Close</A><BR>" | ||
dat += "<A href='?src=[REF(src)];refresh=1'>Refresh</A><BR>" | ||
dat += "<A href='?src=[REF(src)];refreshicons=1'>Force Shielding Update</A><BR><BR>" | ||
dat += "Status: [(active?"Injecting":"Standby")] <BR>" | ||
dat += "<A href='?src=[REF(src)];togglestatus=1'>Toggle Status</A><BR>" | ||
|
||
dat += "Stability: [stability]%<BR>" | ||
dat += "Reactor parts: [linked_shielding.len]<BR>"//TODO: perhaps add some sort of stability check | ||
dat += "Cores: [linked_cores.len]<BR><BR>" | ||
dat += "-Current Efficiency: [reported_core_efficiency]<BR>" | ||
dat += "-Average Stability: [stored_core_stability] <A href='?src=[REF(src)];refreshstability=1'>(update)</A><BR>" | ||
dat += "Last Produced: [display_power(stored_power)]<BR>" | ||
|
||
dat += "Fuel: " | ||
if(!fueljar) | ||
dat += "<BR>No fuel receptacle detected." | ||
else | ||
dat += "<A href='?src=[REF(src)];ejectjar=1'>Eject</A><BR>" | ||
dat += "- [fueljar.fuel]/[fueljar.fuel_max] Units<BR>" | ||
|
||
dat += "- Injecting: [fuel_injection] units<BR>" | ||
dat += "- <A href='?src=[REF(src)];strengthdown=1'>--</A>|<A href='?src=[REF(src)];strengthup=1'>++</A><BR><BR>" | ||
|
||
|
||
user << browse(dat, "window=AMcontrol;size=420x500") | ||
onclose(user, "AMcontrol") | ||
return | ||
|
||
|
||
/obj/machinery/power/am_control_unit/Topic(href, href_list) | ||
if(..()) | ||
return | ||
|
||
if(href_list["close"]) | ||
usr << browse(null, "window=AMcontrol") | ||
usr.unset_machine() | ||
return | ||
|
||
if(href_list["togglestatus"]) | ||
toggle_power() | ||
|
||
if(href_list["refreshicons"]) | ||
update_shield_icons = 1 | ||
|
||
if(href_list["ejectjar"]) | ||
if(fueljar) | ||
fueljar.forceMove(drop_location()) | ||
fueljar = null | ||
//fueljar.control_unit = null currently it does not care where it is | ||
//update_icon() when we have the icon for it | ||
|
||
if(href_list["strengthup"]) | ||
fuel_injection++ | ||
|
||
if(href_list["strengthdown"]) | ||
fuel_injection-- | ||
if(fuel_injection < 0) | ||
fuel_injection = 0 | ||
|
||
if(href_list["refreshstability"]) | ||
check_core_stability() | ||
|
||
updateDialog() | ||
return |
Oops, something went wrong.