mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-08-22 05:26:12 +01:00
248 lines
7.5 KiB
Plaintext
248 lines
7.5 KiB
Plaintext
/obj/machinery/meteorshield
|
|
name = "meteor shield generator"
|
|
desc = "Generates a force field that stops meteors."
|
|
icon = 'icons/obj/meteor_shield.dmi'
|
|
icon_state = "shieldgen"
|
|
density = 1
|
|
opacity = 0
|
|
anchored = 0
|
|
mats = 9
|
|
var/obj/item/cell/PCEL = null
|
|
var/coveropen = 0
|
|
var/active = 0
|
|
var/range = 2
|
|
var/max_range = 6
|
|
var/battery_level = 0
|
|
var/image/display_active = null
|
|
var/image/display_battery = null
|
|
var/image/display_panel = null
|
|
var/sound/sound_on = 'sound/effects/shielddown.ogg'
|
|
var/sound/sound_off = 'sound/effects/shielddown2.ogg'
|
|
var/sound/sound_battwarning = 'sound/machines/pod_alarm.ogg'
|
|
var/sound/sound_shieldhit = 'sound/effects/shieldhit2.ogg'
|
|
var/list/deployed_shields = list()
|
|
|
|
New()
|
|
PCEL = new /obj/item/cell/supercell(src)
|
|
PCEL.charge = PCEL.maxcharge
|
|
|
|
src.display_active = image('icons/obj/meteor_shield.dmi', "")
|
|
src.display_battery = image('icons/obj/meteor_shield.dmi', "")
|
|
src.display_panel = image('icons/obj/meteor_shield.dmi', "")
|
|
..()
|
|
|
|
disposing()
|
|
meteorshield_off(1)
|
|
if (PCEL)
|
|
PCEL.dispose()
|
|
PCEL = null
|
|
display_active = null
|
|
display_battery = null
|
|
display_panel = null
|
|
sound_on = null
|
|
sound_off = null
|
|
sound_battwarning = null
|
|
sound_shieldhit = null
|
|
deployed_shields = list()
|
|
..()
|
|
|
|
examine()
|
|
..()
|
|
if(usr.client)
|
|
var/charge_percentage = 0
|
|
if (PCEL && PCEL.charge > 0 && PCEL.maxcharge > 0)
|
|
charge_percentage = round((PCEL.charge/PCEL.maxcharge)*100)
|
|
boutput(usr, "It has [PCEL.charge]/[PCEL.maxcharge] ([charge_percentage]%) battery power left.")
|
|
boutput(usr, "The range setting is set to [src.range].")
|
|
boutput(usr, "The unit will consume [30 * src.range] power a second, and [60 * src.range] per meteor strike against the projected shield.")
|
|
else
|
|
boutput(usr, "It seems to be missing a usable battery.")
|
|
|
|
process()
|
|
if (src.active)
|
|
if(!PCEL)
|
|
meteorshield_off(1)
|
|
return
|
|
PCEL.charge -= 5 * src.range
|
|
|
|
var/charge_percentage = 0
|
|
var/current_battery_level = 0
|
|
if (PCEL && PCEL.charge > 0 && PCEL.maxcharge > 0)
|
|
charge_percentage = round((PCEL.charge/PCEL.maxcharge)*100)
|
|
switch(charge_percentage)
|
|
if (75 to 100)
|
|
current_battery_level = 3
|
|
if (35 to 74)
|
|
current_battery_level = 2
|
|
else
|
|
current_battery_level = 1
|
|
|
|
if (current_battery_level != src.battery_level)
|
|
src.battery_level = current_battery_level
|
|
src.build_icon()
|
|
if (src.battery_level == 1)
|
|
playsound(src.loc, src.sound_battwarning, 50, 1)
|
|
src.visible_message("<span style=\"color:red\"><b>[src] emits a low battery alarm!</b></span>")
|
|
|
|
if (PCEL.charge < 0)
|
|
src.visible_message("<b>[src]</b> runs out of power and shuts down.")
|
|
src.meteorshield_off()
|
|
return
|
|
|
|
attack_hand(mob/user as mob)
|
|
if (src.coveropen && src.PCEL)
|
|
src.PCEL.set_loc(src.loc)
|
|
src.PCEL = null
|
|
boutput(user, "You remove the power cell.")
|
|
else
|
|
if (src.active)
|
|
src.meteorshield_off()
|
|
src.visible_message("<b>[user.name]</b> powers down the [src].")
|
|
else
|
|
if (PCEL)
|
|
if (PCEL.charge > 0)
|
|
src.meteorshield_on()
|
|
src.visible_message("<b>[user.name]</b> powers up the [src].")
|
|
else
|
|
boutput(user, "[src]'s battery light flickers briefly.")
|
|
else
|
|
boutput(user, "Nothing happens.")
|
|
build_icon()
|
|
|
|
attackby(obj/item/W as obj, mob/user as mob)
|
|
if (istype(W, /obj/item/screwdriver))
|
|
src.coveropen = !src.coveropen
|
|
src.visible_message("<b>[user.name]</b> [src.coveropen ? "opens" : "closes"] [src]'s cell cover.")
|
|
|
|
if (istype(W,/obj/item/cell/) && src.coveropen && !src.PCEL)
|
|
user.drop_item()
|
|
W.set_loc(src)
|
|
src.PCEL = W
|
|
boutput(user, "You insert the power cell.")
|
|
|
|
else
|
|
..()
|
|
|
|
build_icon()
|
|
|
|
attack_ai(mob/user as mob)
|
|
return attack_hand(user)
|
|
|
|
verb/set_range()
|
|
set src in view(1)
|
|
set name = "Set Range"
|
|
|
|
if (!istype(usr,/mob/living/))
|
|
boutput(usr, "<span style=\"color:red\">Your ghostly arms phase right through [src] and you sadly contemplate the state of your life.</span>")
|
|
boutput(usr, "<span style=\"color:red\">That's what happens when you try to be a smartass, you dead sack of crap.</span>")
|
|
return
|
|
|
|
if (get_dist(usr,src) > 1)
|
|
boutput(usr, "<span style=\"color:red\">You need to be closer to do that.</span>")
|
|
return
|
|
|
|
var/the_range = input("Enter a range from 1-[src.max_range]. Higher ranges use more power.","[src.name]",2) as null|num
|
|
if (!the_range)
|
|
return
|
|
if (get_dist(usr,src) > 1)
|
|
boutput(usr, "<span style=\"color:red\">You flail your arms at [src] from across the room like a complete muppet. Move closer, genius!</span>")
|
|
return
|
|
the_range = max(1,min(the_range,src.max_range))
|
|
src.range = the_range
|
|
var/outcome_text = "You set the range to [src.range]."
|
|
if (src.active)
|
|
outcome_text += " The generator shuts down for a brief moment to recalibrate."
|
|
meteorshield_off()
|
|
sleep(5)
|
|
meteorshield_on()
|
|
boutput(usr, "<span style=\"color:blue\">[outcome_text]</span>")
|
|
|
|
proc/build_icon()
|
|
src.overlays = null
|
|
|
|
if (src.coveropen)
|
|
if (istype(src.PCEL,/obj/item/cell/))
|
|
src.display_panel.icon_state = "panel-batt"
|
|
else
|
|
src.display_panel.icon_state = "panel-nobatt"
|
|
src.overlays += src.display_panel
|
|
|
|
if (src.active)
|
|
src.display_active.icon_state = "on"
|
|
src.overlays += src.display_active
|
|
if (istype(src.PCEL,/obj/item/cell))
|
|
var/charge_percentage = null
|
|
if (PCEL.charge > 0 && PCEL.maxcharge > 0)
|
|
charge_percentage = round((PCEL.charge/PCEL.maxcharge)*100)
|
|
switch(charge_percentage)
|
|
if (75 to 100)
|
|
src.display_battery.icon_state = "batt-3"
|
|
if (35 to 74)
|
|
src.display_battery.icon_state = "batt-2"
|
|
else
|
|
src.display_battery.icon_state = "batt-1"
|
|
else
|
|
src.display_battery.icon_state = "batt-3"
|
|
src.overlays += src.display_battery
|
|
|
|
proc/meteorshield_on()
|
|
if (!PCEL)
|
|
return
|
|
if (PCEL.charge < 0)
|
|
return
|
|
|
|
for(var/turf/space/T in orange(src.range,src))
|
|
if (get_dist(T,src) != src.range)
|
|
continue
|
|
var/obj/forcefield/meteorshield/S = new /obj/forcefield/meteorshield(T)
|
|
S.deployer = src
|
|
src.deployed_shields += S
|
|
|
|
src.anchored = 1
|
|
src.active = 1
|
|
playsound(src.loc, src.sound_on, 50, 1)
|
|
build_icon()
|
|
|
|
proc/meteorshield_off(var/failed = 0)
|
|
for(var/obj/forcefield/meteorshield/S in src.deployed_shields)
|
|
src.deployed_shields -= S
|
|
S.deployer = null
|
|
qdel(S)
|
|
|
|
src.anchored = 0
|
|
src.active = 0
|
|
if (failed)
|
|
src.visible_message("<b>[src]</b> fails, and shuts down!")
|
|
playsound(src.loc, src.sound_off, 50, 1)
|
|
build_icon()
|
|
|
|
/obj/forcefield/meteorshield
|
|
name = "Impact Forcefield"
|
|
desc = "A force field deployed to stop meteors and other high velocity masses."
|
|
icon = 'icons/obj/meteor_shield.dmi'
|
|
icon_state = "shield"
|
|
var/sound/sound_shieldhit = 'sound/effects/shieldhit2.ogg'
|
|
var/obj/machinery/deployer = null
|
|
|
|
meteorhit(obj/O as obj)
|
|
if (istype(deployer, /obj/machinery/meteorshield))
|
|
var/obj/machinery/meteorshield/MS = deployer
|
|
if (MS.PCEL)
|
|
MS.PCEL.charge -= 10 * MS.range
|
|
playsound(src.loc, src.sound_shieldhit, 50, 1)
|
|
else
|
|
deployer = null
|
|
qdel(src)
|
|
|
|
else if (istype(deployer, /obj/machinery/shield_generator))
|
|
var/obj/machinery/shield_generator/SG = deployer
|
|
if ((SG.stat & (NOPOWER|BROKEN)) || !SG.powered())
|
|
deployer = null
|
|
qdel(src)
|
|
SG.use_power(10)
|
|
playsound(src.loc, src.sound_shieldhit, 50, 1)
|
|
|
|
else
|
|
deployer = null
|
|
qdel(src)
|