Fixed up and re-added powerarmor

This commit is contained in:
ZomgPonies
2013-12-28 17:21:25 -05:00
parent 9fd464f8a1
commit 3a88f33e0c
4 changed files with 555 additions and 0 deletions
@@ -0,0 +1,283 @@
/*
* File Updated to match /tg/station code standards on the 28/12/2013 (UK/GMT) by RobRichards
*/
/obj/item/clothing/suit/space/powered
name = "Powered armor"
desc = "Not for rookies."
icon_state = "swat"
item_state = "swat"
w_class = 4//bulky item
flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE
body_parts_covered = UPPER_TORSO|LEGS|FEET|ARMS
armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/gun,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 9
var/fuel = 0
var/list/togglearmor = list(melee = 90, bullet = 70, laser = 60,energy = 40, bomb = 75, bio = 75, rad = 75)
var/active = 0
var/helmrequired = 1
var/obj/item/clothing/head/space/powered/helm
var/glovesrequired = 0
var/obj/item/clothing/gloves/powered/gloves
var/shoesrequired = 0
var/obj/item/clothing/shoes/powered/shoes
//Adding gloves and shoes as possible armor components. --NEO
var/obj/item/powerarmor/servos/servos
var/obj/item/powerarmor/reactive/reactive
var/obj/item/powerarmor/atmoseal/atmoseal
var/obj/item/powerarmor/power/power
/obj/item/clothing/suit/space/powered/New()
verbs += /obj/item/clothing/suit/space/powered/proc/poweron
/obj/item/clothing/suit/space/powered/proc/poweron()
set category = "Object"
set name = "Activate armor systems"
var/mob/living/carbon/human/user = usr
if(user.stat)
return //if you're unconscious or dead, no dicking with your armor. --NEO
if(!istype(user))
user << "<span class='danger'>This suit was engineered for human use only.</span>"
return
if(user.wear_suit!=src)
user << "<span class='danger'>The suit functions best if you are inside of it.</span>"
return
if(helmrequired && !istype(user.head, /obj/item/clothing/head/space/powered))
user << "<span class='danger'>Helmet missing, unable to initiate power-on procedure.</span>"
return
if(glovesrequired && !istype(user.gloves, /obj/item/clothing/gloves/powered))
user << "<span class='danger'>Gloves missing, unable to initiate power-on procedure.</span>"
return
if(shoesrequired && !istype(user.shoes, /obj/item/clothing/shoes/powered))
user << "<span class='danger'>Shoes missing, unable to initiate power-on procedure.</span>"
return
if(active)
user << "<span class='danger'>The suit is already on, you can't turn it on twice.</span>"
return
if(!power || !power.checkpower())
user << "<span class='danger'>Powersource missing or depleted.</span>"
return
verbs -= /obj/item/clothing/suit/space/powered/proc/poweron
user << "<span class='notice'>Suit interlocks engaged.</span>"
if(helmrequired)
helm = user.head
helm.canremove = 0
if(glovesrequired)
gloves = user.gloves
gloves.canremove = 0
if(shoesrequired)
shoes = user.shoes
shoes.canremove = 0
canremove = 0
sleep(20)
if(atmoseal)
atmoseal.toggle()
sleep(20)
if(reactive)
reactive.toggle()
sleep(20)
if(servos)
servos.toggle()
sleep(20)
user << "<span class='notice'>All systems online.</span>"
active = 1
power.process()
verbs += /obj/item/clothing/suit/space/powered/proc/poweroff
/obj/item/clothing/suit/space/powered/proc/poweroff()
set category = "Object"
set name = "Deactivate armor systems"
powerdown() //BYOND doesn't seem to like it if you try using a proc with vars in it as a verb, hence this. --NEO
/obj/item/clothing/suit/space/powered/proc/powerdown(sudden = 0)
var/delay = sudden?0:20
var/mob/living/carbon/human/user = usr
if(user.stat && !sudden)
return //if you're unconscious or dead, no dicking with your armor. --NEO
if(!active)
return
verbs -= /obj/item/clothing/suit/space/powered/proc/poweroff
if(sudden)
user << "<span class='danger'><B>Your armor loses power!</B></span>"
if(servos)
servos.toggle(sudden)
sleep(delay)
if(reactive)
reactive.toggle(sudden)
sleep(delay)
if(atmoseal)
if(istype(atmoseal, /obj/item/powerarmor/atmoseal/optional) && helm)
var/obj/item/powerarmor/atmoseal/optional/Atmo_seal = atmoseal
Atmo_seal.helmtoggle(sudden)
atmoseal.toggle(sudden)
sleep(delay)
if(!sudden)
usr << "<span class='notice'>Suit interlocks disengaged.</span>"
if(helm)
helm.canremove = 1
helm = null
if(gloves)
gloves.canremove = 1
gloves = null
if(shoes)
shoes.canremove = 1
gloves = null
canremove = 1
//Not a tabbing error, the thing only unlocks if you intentionally power-down the armor. --NEO
sleep(delay)
if(!sudden)
usr << "<span class='notice'>All systems disengaged.</span>"
active = 0
verbs += /obj/item/clothing/suit/space/powered/proc/poweron
/obj/item/clothing/suit/space/powered/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(power && istype(power,/obj/item/powerarmor/power/plasma))
var/obj/item/powerarmor/power/plasma/Plasma_power = power
switch(W.type)
if(/obj/item/stack/sheet/mineral/plasma)
var/obj/item/stack/sheet/mineral/plasma/P = W
if(fuel < 50)
user << "<span class='notice'>You feed some refined plasma into the armor's generator.</span>"
Plasma_power.fuel += 25
P.amount--
if (P.amount <= 0)
del(P)
return
else
user << "<span class='danger'>The generator already has plenty of plasma.</span>"
return
if(/obj/item/weapon/ore/plasma) //raw plasma has impurities, so it doesn't provide as much fuel. --NEO
if(fuel < 50)
user << "<span class='notice'>You feed some plasma into the armor's generator.</span>"
Plasma_power.fuel += 15
del(W)
return
else
user << "<span class='danger'>The generator already has plenty of plasma.</span>"
return
..()
/obj/item/clothing/head/space/powered
name = "Powered armor"
icon_state = "swat"
desc = "Not for rookies."
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | BLOCKHAIR
item_state = "swat"
armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10)
var/obj/item/clothing/suit/space/powered/parent
/obj/item/clothing/head/space/powered/proc/atmotoggle()
set category = "Object"
set name = "Toggle helmet seals"
var/mob/living/carbon/human/user = usr
if(!istype(user))
user << "<span class='danger'>This helmet is engineered for human use.</span>"
return
if(user.head != src)
user << "<span class='danger'>Can't engage the seals without wearing the helmet.</span>"
return
if(!user.wear_suit || !istype(user.wear_suit,/obj/item/clothing/suit/space/powered))
user << "<span class='danger'>This helmet can only couple with powered armor.</span>"
return
var/obj/item/clothing/suit/space/powered/armor = user.wear_suit
if(!armor.atmoseal || !istype(armor.atmoseal, /obj/item/powerarmor/atmoseal/optional))
user << "<span class='danger'>This armor's atmospheric seals are missing or incompatible.</span>"
return
armor.atmoseal:helmtoggle(0,1)
/obj/item/clothing/gloves/powered
name = "Powered armor"
icon_state = "swat"
desc = "Not for rookies."
flags = FPRINT | TABLEPASS
item_state = "swat"
armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10)
/obj/item/clothing/shoes/powered
name = "Powered armor"
icon_state = "swat"
desc = "Not for rookies."
flags = FPRINT | TABLEPASS
item_state = "swat"
armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10)
obj/item/clothing/suit/space/powered/spawnable/badmin/New()
servos = new /obj/item/powerarmor/servos(src)
servos.parent = src
reactive = new /obj/item/powerarmor/reactive(src)
reactive.parent = src
atmoseal = new /obj/item/powerarmor/atmoseal/optional/adminbus(src)
atmoseal.parent = src
power = new /obj/item/powerarmor/power(src)
power.parent = src
verbs += /obj/item/clothing/suit/space/powered/proc/poweron
var/obj/item/clothing/head/space/powered/helm = new /obj/item/clothing/head/space/powered(src.loc)
helm.verbs += /obj/item/clothing/head/space/powered/proc/atmotoggle
obj/item/clothing/suit/space/powered/spawnable/regular/New()
servos = new /obj/item/powerarmor/servos(src)
servos.parent = src
reactive = new /obj/item/powerarmor/reactive/Centcom(src)
reactive.parent = src
atmoseal = new /obj/item/powerarmor/atmoseal/optional/adminbus(src)
atmoseal.parent = src
power = new /obj/item/powerarmor/power(src)
power.parent = src
verbs += /obj/item/clothing/suit/space/powered/proc/poweron
var/obj/item/clothing/head/space/powered/helm = new /obj/item/clothing/head/space/powered(src.loc)
helm.verbs += /obj/item/clothing/head/space/powered/proc/atmotoggle
@@ -0,0 +1,269 @@
/*
* File Updated to match /tg/station code standards on the 28/12/2013 (UK/GMT) by RobRichards
*/
/obj/item/powerarmor
name = "Generic power armor component"
desc = "This is the base object, you should never see one."
var/obj/item/clothing/suit/space/powered/parent //so the component knows which armor it belongs to.
slowdown = 0 //how much the component slows down the wearer
/obj/item/powerarmor/proc/toggle()
return
//The child objects will use this proc
/obj/item/powerarmor/power
name = "Adminbus power armor power source"
desc = "Runs on the rare Badminium molecule."
/obj/item/powerarmor/process()
return
/obj/item/powerarmor/proc/checkpower()
return 1
/obj/item/powerarmor/power/plasma
name = "Miniaturized plasma generator"
desc = "Runs on plasma."
slowdown = 1
var/fuel = 0
/obj/item/powerarmor/power/plasma/process()
if (fuel > 0 && parent.active)
fuel--
spawn(50)
process()
return
else if (parent.active)
parent.powerdown(1)
return
/obj/item/powerarmor/power/plasma/checkpower()
return fuel
/obj/item/powerarmor/power/powercell
name = "Powercell interface"
desc = "Boring, but reliable."
var/obj/item/weapon/cell/cell
slowdown = 0.5
/obj/item/powerarmor/power/powercell/process()
if (cell && cell.charge > 0 && parent.active)
cell.use(50)
spawn(50)
process()
return
else if (parent.active)
parent.powerdown(1)
return
/obj/item/powerarmor/power/powercell/checkpower()
return max(cell.charge, 0)
/obj/item/powerarmor/power/nuclear
name = "Miniaturized nuclear generator"
desc = "For all your radioactive needs."
slowdown = 1.5
/obj/item/powerarmor/power/nuclear/process()
if(!crit_fail)
if(prob(src.reliability)) return 1 //No failure
if(prob(src.reliability))
for (var/mob/M in range(0,src.parent)) //Only a minor failure, enjoy your radiation.
if(src.parent in M.contents)
M << "<span class='danger'>Your armor feels pleasantly warm for a moment.</span>"
else
M << "<span class='danger'>You feel a warm sensation.</span>"
M.radiation += rand(1,40)
else
for (var/mob/M in range(rand(1,4),src.parent)) //Big failure, TIME FOR RADIATION BITCHES
if (src.parent in M.contents)
M << "<span class='danger'><B>Your armor's reactor overloads!</B></span>"
M << "<span class='danger'>You feel a wave of heat wash over you.</span>"
M.radiation += 100
crit_fail = 1 //broken~
parent.powerdown(1)
spawn(50)
process()
/obj/item/powerarmor/power/nuclear/checkpower()
return !crit_fail
/obj/item/powerarmor/reactive
name = "Adminbus power armor reactive plating"
desc = "Made with the rare Badminium molecule."
var/list/togglearmor = list(melee = 250, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100)
//Good lord an active energy axe does 150 damage a swing? Anyway, barring var editing, this armor loadout should be impervious to anything. Enjoy, badmins~ --NEO
/obj/item/powerarmor/reactive/toggle(sudden = 0)
switch(parent.active)
if(1)
if(!sudden)
usr << "<span class='notice'>Reactive armor systems disengaged.</span>"
if(0)
usr << "<span class='notice'>Reactive armor systems engaged.</span>"
var/list/switchover = list()
for (var/armorvar in parent.armor)
switchover[armorvar] = togglearmor[armorvar]
togglearmor[armorvar] = parent.armor[armorvar]
parent.armor[armorvar] = switchover[armorvar]
//Probably not the most elegant way to have the vars switch over, but it works. Also propagates the values to the other objects.
if(parent.helm)
parent.helm.armor[armorvar] = parent.armor[armorvar]
if(parent.gloves)
parent.gloves.armor[armorvar] = parent.armor[armorvar]
if(parent.shoes)
parent.shoes.armor[armorvar] = parent.armor[armorvar]
/obj/item/powerarmor/reactive/Centcom
name = "Centcom power armor reactive plating"
desc = "Pretty effective against everything, not perfect though."
togglearmor = list(melee = 90, bullet = 70, laser = 60,energy = 40, bomb = 75, bio = 75, rad = 75)
slowdown = 2
/obj/item/powerarmor/servos
name = "Adminbus power armor movement servos"
desc = "Made with the rare Badminium molecule."
var/toggleslowdown = 9
/obj/item/powerarmor/servos/toggle(sudden = 0)
switch(parent.active)
if(1)
if(!sudden)
usr << "<span class='notice'>Movement assist servos disengaged.</span>"
parent.slowdown += toggleslowdown
if(0)
usr << "<span class='notice'>Movement assist servos engaged.</span>"
parent.slowdown -= toggleslowdown
/obj/item/powerarmor/atmoseal
name = "Power armor atmospheric seals"
desc = "Keeps the bad stuff out."
slowdown = 1
var/sealed = 0
/obj/item/powerarmor/atmoseal/toggle(sudden = 0)
switch(parent.active)
if(1)
if(!sudden)
usr << "<span class='notice'>Atmospheric seals disengaged.</span>"
parent.gas_transfer_coefficient = 1
parent.permeability_coefficient = 1
if(parent.helmrequired)
parent.helm.gas_transfer_coefficient = 1
parent.helm.permeability_coefficient = 1
parent.helm.cold_protection = initial(parent.helm.cold_protection)
parent.helm.min_cold_protection_temperature = initial(parent.helm.min_cold_protection_temperature)
parent.helm.heat_protection = initial(parent.helm.heat_protection)
parent.helm.max_heat_protection_temperature = initial(parent.helm.max_heat_protection_temperature)
if(parent.glovesrequired)
parent.gloves.gas_transfer_coefficient = 1
parent.gloves.permeability_coefficient = 1
parent.gloves.cold_protection = initial(parent.gloves.cold_protection)
parent.gloves.min_cold_protection_temperature = initial(parent.gloves.min_cold_protection_temperature)
parent.gloves.heat_protection = initial(parent.gloves.heat_protection)
parent.gloves.max_heat_protection_temperature = initial(parent.gloves.max_heat_protection_temperature)
if(parent.shoesrequired)
parent.shoes.gas_transfer_coefficient = 1
parent.shoes.permeability_coefficient = 1
parent.shoes.cold_protection = initial(parent.shoes.cold_protection)
parent.shoes.min_cold_protection_temperature = initial(parent.shoes.min_cold_protection_temperature)
parent.shoes.heat_protection = initial(parent.shoes.heat_protection)
parent.shoes.max_heat_protection_temperature = initial(parent.shoes.max_heat_protection_temperature)
sealed = 0
if(0)
usr << "<span class='notice'>Atmospheric seals engaged.</span>"
parent.gas_transfer_coefficient = 0.01
parent.permeability_coefficient = 0.02
if(parent.helmrequired)
parent.helm.gas_transfer_coefficient = 0.01
parent.helm.permeability_coefficient = 0.02
parent.helm.cold_protection = HEAD
parent.helm.min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECITON_TEMPERATURE
parent.helm.heat_protection = HEAD
parent.helm.max_heat_protection_temperature = SPACE_HELMET_MAX_HEAT_PROTECITON_TEMPERATURE
if(parent.glovesrequired)
parent.gloves.gas_transfer_coefficient = 0.01
parent.gloves.permeability_coefficient = 0.02
parent.gloves.cold_protection = HANDS
parent.gloves.min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
parent.gloves.heat_protection = HANDS
parent.gloves.max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECITON_TEMPERATURE
if(parent.shoesrequired)
parent.shoes.gas_transfer_coefficient = 0.01
parent.shoes.permeability_coefficient = 0.02
parent.shoes.cold_protection = FEET
parent.shoes.min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
parent.shoes.heat_protection = FEET
parent.shoes.max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECITON_TEMPERATURE
sealed = 1
/obj/item/powerarmor/atmoseal/adminbus
name = "Adminbus power armor atmospheric seals"
desc = "Made with the rare Badminium molecule."
slowdown = 0
/obj/item/powerarmor/atmoseal/optional
name = "Togglable power armor atmospheric seals"
desc = "Keeps the bad stuff out, but lets you remove your helmet without having to turn the whole suit off."
/obj/item/powerarmor/atmoseal/optional/proc/helmtoggle(sudden = 0, manual = 0)
var/mob/living/carbon/human/user = usr
var/obj/item/clothing/head/space/powered/helm
if(user.head && istype(user.head,/obj/item/clothing/head/space/powered))
helm = user.head
if(!sealed)
user << "<span class='danger'>Unable to initialize helmet seal, armor seals not active.</span>"
return
if(!helm.parent)
user << "<span class='notice'>Helmet locked.</span>"
helm.canremove = 0
parent.helm = helm
helm.parent = parent
sleep(20)
parent.helm.gas_transfer_coefficient = 0.01
parent.helm.permeability_coefficient = 0.02
parent.helm.cold_protection = HEAD
parent.helm.min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECITON_TEMPERATURE
parent.helm.heat_protection = HEAD
parent.helm.max_heat_protection_temperature = SPACE_HELMET_MAX_HEAT_PROTECITON_TEMPERATURE
user << "<span class='notice'>Helmet atmospheric seals engaged.</span>"
if(manual)
for (var/armorvar in helm.armor)
helm.armor[armorvar] = parent.armor[armorvar]
return
else
if(manual)
user << "<span class='notice'>Helmet atmospheric seals disengaged.</span>"
parent.helm.gas_transfer_coefficient = 1
parent.helm.permeability_coefficient = 1
parent.helm.cold_protection = initial(parent.helm.cold_protection)
parent.helm.min_cold_protection_temperature = initial(parent.helm.min_cold_protection_temperature)
parent.helm.heat_protection = initial(parent.helm.heat_protection)
parent.helm.max_heat_protection_temperature = initial(parent.helm.max_heat_protection_temperature)
if(manual)
for (var/armorvar in helm.armor)
helm.armor[armorvar] = parent.reactive.togglearmor[armorvar]
if(!sudden)
if(manual)
sleep(20)
user << "<span class='notice'>Helmet unlocked.</span>"
helm.canremove = 1
parent.helm = null
helm.parent = null
/obj/item/powerarmor/atmoseal/optional/adminbus
name = "Adminbus togglable power armor atmospheric seals"
desc = "Made with the rare Badminium molecule."
slowdown = 0