mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-02-07 14:50:21 +00:00
* no more self callbacks on update fullness * fix missing code * Belly test * import type * full partiy * . * fix preview * in belly to late join * robot nutri * . * . * update export * finish open todos * code cleanup * fix some old slacking * move this to a define * fixing * , * . * Creates a Consume Belly Reagents pref (#10) * Creates a Consume Belly Reagents pref Added a Consume Belly Reagents pref that blocks the consumption of all reagents produced by a belly via reagent containers such as food, drink, beakers, pills, syringes and hyposprays. Seems to work well as intended. * These changes at least do not cause any problems * Missed this one * Reverts reagent_names * _BELLY versions * Fixed typo * . * fix admin spawn mobs bellies * also fix that bug * hints * fix that * . * initial * should be all * that is no longer needed * fluids into hand items I was convinced this was broken until it was pointed out that the item has to be ON THE GROUND to fill it...Instead of in your hand. That seems so convoluted. ARC = active-hand reagent container. IRC = inactive-hand reagent container. * some stuff --------- Co-authored-by: SatinIsle <98125273+SatinIsle@users.noreply.github.com> Co-authored-by: Cameron Lennox <killer65311@gmail.com>
324 lines
8.2 KiB
Plaintext
324 lines
8.2 KiB
Plaintext
////FIELD GEN START //shameless copypasta from fieldgen, powersink, and grille
|
|
/obj/machinery/shieldwallgen
|
|
name = "shield generator"
|
|
desc = "A shield generator."
|
|
icon = 'icons/obj/stationobjs.dmi'
|
|
icon_state = "Shield_Gen"
|
|
anchored = FALSE
|
|
density = TRUE
|
|
req_access = list(access_engine_equip)
|
|
var/active = 0
|
|
var/power = 0
|
|
var/state = 0
|
|
var/steps = 0
|
|
var/last_check = 0
|
|
var/check_delay = 10
|
|
var/recalc = 0
|
|
var/locked = 1
|
|
var/destroyed = 0
|
|
var/directwired = 1
|
|
// var/maxshieldload = 200
|
|
var/obj/structure/cable/attached // the attached cable
|
|
var/storedpower = 0
|
|
//There have to be at least two posts, so these are effectively doubled
|
|
var/power_draw = 30000 //30 kW. How much power is drawn from powernet. Increase this to allow the generator to sustain longer shields, at the cost of more power draw.
|
|
var/max_stored_power = 50000 //50 kW
|
|
use_power = USE_POWER_OFF //Draws directly from power net. Does not use APC power.
|
|
|
|
/obj/machinery/shieldwallgen/attack_hand(mob/user as mob)
|
|
if(state != 1)
|
|
to_chat(user, span_red("The shield generator needs to be firmly secured to the floor first."))
|
|
return 1
|
|
if(src.locked && !istype(user, /mob/living/silicon))
|
|
to_chat(user, span_red("The controls are locked!"))
|
|
return 1
|
|
if(power != 1)
|
|
to_chat(user, span_red("The shield generator needs to be powered by wire underneath."))
|
|
return 1
|
|
|
|
if(src.active >= 1)
|
|
src.active = 0
|
|
icon_state = "Shield_Gen"
|
|
|
|
user.visible_message("[user] turned the shield generator off.", \
|
|
"You turn off the shield generator.", \
|
|
"You hear heavy droning fade out.")
|
|
for(var/dir in list(1,2,4,8)) src.cleanup(dir)
|
|
else
|
|
src.active = 1
|
|
icon_state = "Shield_Gen +a"
|
|
user.visible_message("[user] turned the shield generator on.", \
|
|
"You turn on the shield generator.", \
|
|
"You hear heavy droning.")
|
|
src.add_fingerprint(user)
|
|
|
|
/obj/machinery/shieldwallgen/proc/power()
|
|
if(!anchored)
|
|
power = 0
|
|
return 0
|
|
var/turf/T = src.loc
|
|
|
|
var/obj/structure/cable/C = T.get_cable_node()
|
|
var/datum/powernet/PN
|
|
if(C) PN = C.powernet // find the powernet of the connected cable
|
|
|
|
if(!PN)
|
|
power = 0
|
|
return 0
|
|
|
|
var/shieldload = between(500, max_stored_power - storedpower, power_draw) //what we try to draw
|
|
shieldload = PN.draw_power(shieldload) //what we actually get
|
|
storedpower += shieldload
|
|
|
|
//If we're still in the red, then there must not be enough available power to cover our load.
|
|
if(storedpower <= 0)
|
|
power = 0
|
|
return 0
|
|
|
|
power = 1 // IVE GOT THE POWER!
|
|
return 1
|
|
|
|
/obj/machinery/shieldwallgen/process()
|
|
power()
|
|
if(power)
|
|
storedpower -= 2500 //the generator post itself uses some power
|
|
|
|
if(storedpower >= max_stored_power)
|
|
storedpower = max_stored_power
|
|
if(storedpower <= 0)
|
|
storedpower = 0
|
|
// if(shieldload >= maxshieldload) //there was a loop caused by specifics of process(), so this was needed.
|
|
// shieldload = maxshieldload
|
|
|
|
if(src.active == 1)
|
|
if(!src.state == 1)
|
|
src.active = 0
|
|
return
|
|
spawn(1)
|
|
setup_field(1)
|
|
spawn(2)
|
|
setup_field(2)
|
|
spawn(3)
|
|
setup_field(4)
|
|
spawn(4)
|
|
setup_field(8)
|
|
src.active = 2
|
|
if(src.active >= 1)
|
|
if(src.power == 0)
|
|
src.visible_message(span_red("The [src.name] shuts down due to lack of power!"), \
|
|
"You hear heavy droning fade out")
|
|
icon_state = "Shield_Gen"
|
|
src.active = 0
|
|
for(var/dir in list(1,2,4,8)) src.cleanup(dir)
|
|
|
|
/obj/machinery/shieldwallgen/proc/setup_field(var/NSEW = 0)
|
|
var/turf/T = src.loc
|
|
var/turf/T2 = src.loc
|
|
var/obj/machinery/shieldwallgen/G
|
|
var/steps = 0
|
|
var/oNSEW = 0
|
|
|
|
if(!NSEW)//Make sure its ran right
|
|
return
|
|
|
|
if(NSEW == 1)
|
|
oNSEW = 2
|
|
else if(NSEW == 2)
|
|
oNSEW = 1
|
|
else if(NSEW == 4)
|
|
oNSEW = 8
|
|
else if(NSEW == 8)
|
|
oNSEW = 4
|
|
|
|
for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator
|
|
T = get_step(T2, NSEW)
|
|
T2 = T
|
|
steps += 1
|
|
if(locate(/obj/machinery/shieldwallgen) in T)
|
|
G = (locate(/obj/machinery/shieldwallgen) in T)
|
|
steps -= 1
|
|
if(!G.active)
|
|
return
|
|
G.cleanup(oNSEW)
|
|
break
|
|
|
|
if(isnull(G))
|
|
return
|
|
|
|
T2 = src.loc
|
|
|
|
for(var/dist = 0, dist < steps, dist += 1) // creates each field tile
|
|
var/field_dir = get_dir(T2,get_step(T2, NSEW))
|
|
T = get_step(T2, NSEW)
|
|
T2 = T
|
|
var/obj/machinery/shieldwall/CF = new/obj/machinery/shieldwall(T, src, G) //(ref to this gen, ref to connected gen)
|
|
CF.set_dir(field_dir)
|
|
|
|
|
|
/obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user)
|
|
if(W.has_tool_quality(TOOL_WRENCH))
|
|
if(active)
|
|
to_chat(user, "Turn off the field generator first.")
|
|
return
|
|
|
|
else if(state == 0)
|
|
state = 1
|
|
playsound(src, W.usesound, 75, 1)
|
|
to_chat(user, "You secure the external reinforcing bolts to the floor.")
|
|
src.anchored = TRUE
|
|
return
|
|
|
|
else if(state == 1)
|
|
state = 0
|
|
playsound(src, W.usesound, 75, 1)
|
|
to_chat(user, "You undo the external reinforcing bolts.")
|
|
src.anchored = FALSE
|
|
return
|
|
|
|
if(istype(W, /obj/item/card/id)||istype(W, /obj/item/pda))
|
|
if (src.allowed(user))
|
|
src.locked = !src.locked
|
|
to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]")
|
|
else
|
|
to_chat(user, span_red("Access denied."))
|
|
|
|
else
|
|
src.add_fingerprint(user)
|
|
visible_message(span_red("The [src.name] has been hit with \the [W.name] by [user.name]!"))
|
|
|
|
/obj/machinery/shieldwallgen/proc/cleanup(var/NSEW)
|
|
var/obj/machinery/shieldwall/F
|
|
var/obj/machinery/shieldwallgen/G
|
|
var/turf/T = src.loc
|
|
var/turf/T2 = src.loc
|
|
|
|
for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for fields
|
|
T = get_step(T2, NSEW)
|
|
T2 = T
|
|
if(locate(/obj/machinery/shieldwall) in T)
|
|
F = (locate(/obj/machinery/shieldwall) in T)
|
|
qdel(F)
|
|
|
|
if(locate(/obj/machinery/shieldwallgen) in T)
|
|
G = (locate(/obj/machinery/shieldwallgen) in T)
|
|
if(!G.active)
|
|
break
|
|
|
|
/obj/machinery/shieldwallgen/Destroy()
|
|
src.cleanup(1)
|
|
src.cleanup(2)
|
|
src.cleanup(4)
|
|
src.cleanup(8)
|
|
. = ..()
|
|
|
|
/obj/machinery/shieldwallgen/bullet_act(var/obj/item/projectile/Proj)
|
|
storedpower -= 400 * Proj.get_structure_damage()
|
|
..()
|
|
return
|
|
|
|
|
|
//////////////Containment Field START
|
|
/obj/machinery/shieldwall
|
|
name = "Shield"
|
|
desc = "An energy shield."
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "shieldwall"
|
|
anchored = TRUE
|
|
density = TRUE
|
|
unacidable = TRUE
|
|
light_range = 3
|
|
var/needs_power = 0
|
|
var/active = 1
|
|
// var/power = 10
|
|
var/delay = 5
|
|
var/last_active
|
|
var/mob/U
|
|
var/obj/machinery/shieldwallgen/gen_primary
|
|
var/obj/machinery/shieldwallgen/gen_secondary
|
|
var/power_usage = 2500 //how much power it takes to sustain the shield
|
|
var/generate_power_usage = 7500 //how much power it takes to start up the shield
|
|
|
|
/obj/machinery/shieldwall/Initialize(mapload, var/obj/machinery/shieldwallgen/A, var/obj/machinery/shieldwallgen/B)
|
|
. = ..()
|
|
update_nearby_tiles()
|
|
src.gen_primary = A
|
|
src.gen_secondary = B
|
|
if(istype(A) && istype(B) && A.active && B.active)
|
|
needs_power = 1
|
|
if(prob(50))
|
|
A.storedpower -= generate_power_usage
|
|
else
|
|
B.storedpower -= generate_power_usage
|
|
else
|
|
return INITIALIZE_HINT_QDEL
|
|
|
|
/obj/machinery/shieldwall/Destroy()
|
|
update_nearby_tiles()
|
|
. = ..()
|
|
|
|
/obj/machinery/shieldwall/attack_hand(mob/user as mob)
|
|
return
|
|
|
|
|
|
/obj/machinery/shieldwall/process()
|
|
if(needs_power)
|
|
if(isnull(gen_primary)||isnull(gen_secondary))
|
|
qdel(src)
|
|
return
|
|
|
|
if(!(gen_primary.active)||!(gen_secondary.active))
|
|
qdel(src)
|
|
return
|
|
|
|
if(prob(50))
|
|
gen_primary.storedpower -= power_usage
|
|
else
|
|
gen_secondary.storedpower -= power_usage
|
|
|
|
|
|
/obj/machinery/shieldwall/bullet_act(var/obj/item/projectile/Proj)
|
|
if(needs_power)
|
|
var/obj/machinery/shieldwallgen/G
|
|
if(prob(50))
|
|
G = gen_primary
|
|
else
|
|
G = gen_secondary
|
|
G.storedpower -= 400 * Proj.get_structure_damage()
|
|
..()
|
|
return
|
|
|
|
|
|
/obj/machinery/shieldwall/ex_act(severity)
|
|
if(needs_power)
|
|
var/obj/machinery/shieldwallgen/G
|
|
switch(severity)
|
|
if(1.0) //big boom
|
|
if(prob(50))
|
|
G = gen_primary
|
|
else
|
|
G = gen_secondary
|
|
G.storedpower -= 120000
|
|
|
|
if(2.0) //medium boom
|
|
if(prob(50))
|
|
G = gen_primary
|
|
else
|
|
G = gen_secondary
|
|
G.storedpower -= 30000
|
|
|
|
if(3.0) //lil boom
|
|
if(prob(50))
|
|
G = gen_primary
|
|
else
|
|
G = gen_secondary
|
|
G.storedpower -= 12000
|
|
return
|
|
|
|
|
|
/obj/machinery/shieldwall/CanPass(atom/movable/mover, turf/target)
|
|
if(istype(mover) && mover.checkpass(PASSGLASS))
|
|
return prob(20)
|
|
if(istype(mover, /obj/item/projectile))
|
|
return prob(10)
|
|
return !density
|