mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
174 lines
5.0 KiB
Plaintext
174 lines
5.0 KiB
Plaintext
/obj/machinery/power/solar/panel
|
|
icon_state = "sp_base"
|
|
id_tag = 0
|
|
penetration_dampening = 1 // Fragile
|
|
var/health = 15 //Fragile shit, even with state-of-the-art reinforced glass
|
|
var/maxhealth = 15 //If ANYONE ever makes it so that solars can be directly repaired without glass, also used for fancy calculations
|
|
var/obscured = 0
|
|
var/sunfrac = 0
|
|
var/adir = SOUTH
|
|
var/ndir = SOUTH
|
|
var/turn_angle = 0
|
|
var/glass_quality_factor = 1 //Rglass is average. Glass is shite. Tinted glass is "Are you even trying ?" tier if anyone ever makes a sheet version
|
|
var/tracker = 0
|
|
var/obj/machinery/power/solar/control/control
|
|
var/obj/machinery/power/solar_assembly/solar_assembly
|
|
|
|
/obj/machinery/power/solar/panel/New(loc, var/obj/machinery/power/solar_assembly/S)
|
|
..(loc)
|
|
make(S)
|
|
|
|
/obj/machinery/power/solar/panel/proc/make(var/obj/machinery/power/solar_assembly/S)
|
|
if(!S)
|
|
solar_assembly = new /obj/machinery/power/solar_assembly()
|
|
solar_assembly.glass_type = /obj/item/stack/sheet/glass/rglass
|
|
solar_assembly.anchored = 1
|
|
solar_assembly.tracker = tracker
|
|
else
|
|
solar_assembly = S
|
|
var/obj/item/stack/sheet/glass/G = solar_assembly.glass_type //This is how you call up variables from an object without making one
|
|
src.glass_quality_factor = initial(G.glass_quality) //Don't use istype checks kids
|
|
src.maxhealth = initial(G.shealth)
|
|
src.health = initial(G.shealth)
|
|
solar_assembly.forceMove(src)
|
|
update_icon()
|
|
|
|
/obj/machinery/power/solar/panel/attackby(obj/item/weapon/W, mob/user)
|
|
if(iscrowbar(W))
|
|
var/turf/T = get_turf(src)
|
|
var/obj/item/stack/sheet/glass/G = solar_assembly.glass_type
|
|
to_chat(user, "<span class='notice'>You begin taking the [initial(G.name)] off the [src].</span>")
|
|
playsound(src, 'sound/machines/click.ogg', 50, 1)
|
|
if(do_after(user, src, 50))
|
|
if(solar_assembly)
|
|
solar_assembly.forceMove(T)
|
|
solar_assembly.give_glass()
|
|
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
|
|
user.visible_message("<span class='notice'>[user] takes the [initial(G.name)] off the [src].</span>",\
|
|
"<span class='notice'>You take the [initial(G.name)] off the [src].</span>")
|
|
qdel(src)
|
|
else if(W)
|
|
add_fingerprint(user)
|
|
user.delayNextAttack(10)
|
|
health -= W.force
|
|
healthcheck()
|
|
..()
|
|
|
|
/obj/machinery/power/solar/panel/blob_act()
|
|
if(prob(30))
|
|
broken() //Good hit
|
|
else
|
|
health--
|
|
|
|
healthcheck()
|
|
|
|
/obj/machinery/power/solar/panel/bullet_act(var/obj/item/projectile/Proj)
|
|
if(Proj.damage)
|
|
health -= Proj.damage
|
|
healthcheck()
|
|
return ..()
|
|
|
|
/obj/machinery/power/solar/panel/proc/healthcheck()
|
|
if(health <= 0)
|
|
if(!(stat & BROKEN) && health > -maxhealth)
|
|
broken()
|
|
else
|
|
var/obj/item/stack/sheet/glass/G = solar_assembly.glass_type
|
|
var/shard = initial(G.shard_type)
|
|
solar_assembly.glass_type = null //The glass you're looking for is below pal
|
|
solar_assembly.forceMove(get_turf(src))
|
|
new shard(loc)
|
|
new shard(loc)
|
|
qdel(src)
|
|
|
|
/obj/machinery/power/solar/panel/update_icon()
|
|
..()
|
|
if(!tracker)
|
|
overlays.len = 0
|
|
var/obj/item/stack/sheet/glass/G = solar_assembly.glass_type
|
|
var/icon = "solar_panel_" + initial(G.sname)
|
|
if(stat & BROKEN)
|
|
icon += "-b"
|
|
overlays += image('icons/obj/power.dmi', icon_state = icon, layer = FLY_LAYER)
|
|
src.dir = angle2dir(adir)
|
|
return
|
|
|
|
/obj/machinery/power/solar/panel/proc/update_solar_exposure()
|
|
if(!sun)
|
|
return
|
|
|
|
if(obscured)
|
|
sunfrac = 0
|
|
return
|
|
|
|
var/p_angle = abs((360 + adir) % 360 - (360 + sun.angle) % 360)
|
|
|
|
if(p_angle > 90) //If facing more than 90deg from sun, zero output
|
|
sunfrac = 0
|
|
return
|
|
|
|
sunfrac = cos(p_angle) ** 2
|
|
|
|
/obj/machinery/power/solar/panel/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY
|
|
if(stat & BROKEN)
|
|
return
|
|
|
|
if(!control)
|
|
return
|
|
|
|
if(adir != ndir)
|
|
adir = (360 + adir + clamp(ndir - adir, -10, 10)) % 360
|
|
update_icon()
|
|
update_solar_exposure()
|
|
|
|
if(obscured)
|
|
return
|
|
|
|
var/sgen = SOLARGENRATE * sunfrac * glass_quality_factor * (health / maxhealth) //Raw generating power * Sun angle effect * Glass quality * Current panel health. Simple but thorough
|
|
|
|
add_avail(sgen)
|
|
|
|
if(powernet && control)
|
|
if(powernet.nodes.Find(control))
|
|
control.gen += sgen
|
|
|
|
/obj/machinery/power/solar/panel/proc/broken()
|
|
stat |= BROKEN
|
|
update_icon()
|
|
|
|
if(health > 1)
|
|
health = 1 //Only holding up on shards and scrap
|
|
|
|
/obj/machinery/power/solar/panel/ex_act(severity)
|
|
switch(severity)
|
|
if(1.0)
|
|
solar_assembly.glass_type = null //The glass you're looking for is below pal
|
|
if(prob(15))
|
|
new /obj/item/weapon/shard(loc)
|
|
kill()
|
|
if(2.0)
|
|
if(prob(25))
|
|
solar_assembly.glass_type = null //The glass you're looking for is below pal
|
|
new /obj/item/weapon/shard(loc)
|
|
kill()
|
|
else
|
|
broken()
|
|
if(3.0)
|
|
if(prob(35))
|
|
broken()
|
|
else
|
|
health-- //Let shrapnel have its effect
|
|
|
|
/obj/machinery/power/solar/panel/proc/kill() //To make sure you eliminate the assembly as well
|
|
if(solar_assembly)
|
|
var/obj/machinery/power/solar_assembly/assembly = solar_assembly
|
|
solar_assembly = null
|
|
qdel(assembly)
|
|
qdel(src)
|
|
|
|
/obj/machinery/power/solar/panel/disconnect_from_network()
|
|
. = ..()
|
|
|
|
if(.)
|
|
control = null
|