Finally got around to working on that power armor overhaul I'd told myself I was gonna do.

tl;dr is that instead of being a single object, power armor now has component objects, which determine how good it is at things. They are still a work in progress, lacking a way to actually construct them and such. That said, there are adminspawnable sets. One is more or less what the old power armor was, sans a runtime error that was causing it to be immune to everything, the other is an adminbus set that is genuinely immune to everything.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2023 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
n3ophyt3
2011-08-19 00:37:16 +00:00
parent 66b3a71e8a
commit d867f56b75
4 changed files with 541 additions and 178 deletions
-178
View File
@@ -371,182 +371,4 @@ THERMAL GLASSES
M.disabilities &= ~1
..()
/obj/item/clothing/suit/armor/powered
name = "Powered armor"
desc = "Not for rookies."
icon_state = "swat"
item_state = "swat"
w_class = 4//bulky item
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
heat_transfer_coefficient = 0.02
radiation_protection = 0.25
protective_temperature = 1000
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
armor = list(melee = 40, bullet = 30, laser = 20, taser = 15, bomb = 25, bio = 10, rad = 10)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/gun,/obj/item/weapon/melee/baton,/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, taser = 40, bomb = 75, bio = 75, rad = 75)
var/active = 0
var/obj/item/clothing/head/helmet/powered/helm = null
New()
verbs += /obj/item/clothing/suit/armor/powered/proc/poweron
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 << "\red This suit was engineered for human use only."
return
if(user.wear_suit!=src)
user << "\red The suit functions best if you are inside of it."
return
if(!istype(user.head, /obj/item/clothing/head/helmet/powered))
user << "\red Helmet missing, unable to initiate power-on procedure."
return
if(active)
user << "\red The suit is already on, you can't turn it on twice."
return
if(fuel < 1)
user << "\red Insufficient fuel."
return
verbs -= /obj/item/clothing/suit/armor/powered/proc/poweron
user << "\blue Suit interlocks engaged."
helm = user.head
helm.canremove = 0
canremove = 0
sleep(20)
user << "\blue Atmospheric seals engaged."
flags |= SUITSPACE
helm.flags |= HEADSPACE
sleep(20)
user << "\blue Reactive armor systems engaged."
var/list/switchover = list()
for (var/armorvar in togglearmor)
switchover[armorvar] = "[togglearmor[armorvar]]"
togglearmor[armorvar] = "[armor[armorvar]]"
armor[armorvar] = "[switchover[armorvar]]"
helm.armor[armorvar] = armor[armorvar]
sleep(20)
user << "\blue Movement assist servos engaged."
slowdown = 2.5
sleep(20)
user << "\blue All systems online."
active = 1
powered()
verbs += /obj/item/clothing/suit/armor/powered/proc/poweroff
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
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/armor/powered/proc/poweroff
if(sudden)
user << "\red Your armor loses power!"
if(!sudden)
user << "\blue Movement assist servos disengaged."
slowdown = 9
sleep(delay)
if(!sudden)
user << "\blue Reactive armor systems disengaged."
var/list/switchover = list()
for (var/armorvar in armor)
switchover[armorvar] = "[togglearmor[armorvar]]"
togglearmor[armorvar] = "[armor[armorvar]]"
armor[armorvar] = "[switchover[armorvar]]"
helm.armor[armorvar] = armor[armorvar]
sleep(delay)
if(!sudden)
user << "\blue Atmospheric seals disengaged."
flags &= ~SUITSPACE
helm.flags &= ~HEADSPACE
sleep(delay)
if(!sudden)
user << "\blue Suit interlocks disengaged."
helm.canremove = 1
canremove = 1
helm = null
//Not a tabbing error, the thing only unlocks if you intentionally power-down the armor. --NEO
sleep(20)
if(!sudden)
user << "\blue All systems disengaged."
active = 0
verbs += /obj/item/clothing/suit/armor/powered/proc/poweron
proc/powered()
if (fuel > 0 && active)
fuel--
spawn(50)
powered()
return
else if (active)
powerdown(1)
return
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/stack/sheet/plasma))
if(fuel < 50)
user << "\blue You feed some plasma into the armor's generator."
fuel += 25
W:amount--
if (W:amount <= 0)
del(W)
return
else
user << "\red The generator already has plenty of plasma."
return
else
..()
/obj/item/clothing/head/helmet/powered
name = "Powered armor helmet"
icon_state = "swat"
desc = "Not for rookies."
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH
see_face = 0.0
item_state = "swat"
permeability_coefficient = 0.01
armor = list(melee = 40, bullet = 30, laser = 20, taser = 15, bomb = 25, bio = 10, rad = 10)
@@ -0,0 +1,281 @@
/obj/item/clothing/suit/powered
name = "Powered armor"
desc = "Not for rookies."
icon_state = "swat"
item_state = "swat"
w_class = 4//bulky item
protective_temperature = 1000
flags = FPRINT | TABLEPASS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
armor = list(melee = 40, bullet = 30, laser = 20, taser = 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, taser = 40, bomb = 75, bio = 75, rad = 75)
var/active = 0
var/helmrequired = 1
var/obj/item/clothing/head/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
New()
verbs += /obj/item/clothing/suit/powered/proc/poweron
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 << "\red This suit was engineered for human use only."
return
if(user.wear_suit!=src)
user << "\red The suit functions best if you are inside of it."
return
if(helmrequired && !istype(user.head, /obj/item/clothing/head/powered))
user << "\red Helmet missing, unable to initiate power-on procedure."
return
if(glovesrequired && !istype(user.gloves, /obj/item/clothing/gloves/powered))
user << "\red Gloves missing, unable to initiate power-on procedure."
return
if(shoesrequired && !istype(user.shoes, /obj/item/clothing/shoes/powered))
user << "\red Shoes missing, unable to initiate power-on procedure."
return
if(active)
user << "\red The suit is already on, you can't turn it on twice."
return
if(!power || !power.checkpower())
user << "\red Powersource missing or depleted."
return
verbs -= /obj/item/clothing/suit/powered/proc/poweron
user << "\blue Suit interlocks engaged."
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 << "\blue All systems online."
active = 1
power.process()
verbs += /obj/item/clothing/suit/powered/proc/poweroff
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
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/powered/proc/poweroff
if(sudden)
user << "\red Your armor loses power!"
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)
atmoseal:helmtoggle(sudden)
atmoseal.toggle(sudden)
sleep(delay)
if(!sudden)
usr << "\blue Suit interlocks disengaged."
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 << "\blue All systems disengaged."
active = 0
verbs += /obj/item/clothing/suit/powered/proc/poweron
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(power && istype(power,/obj/item/powerarmor/power/plasma))
switch(W.type)
if(/obj/item/stack/sheet/plasma)
if(fuel < 50)
user << "\blue You feed some refined plasma into the armor's generator."
power:fuel += 25
W:amount--
if (W:amount <= 0)
del(W)
return
else
user << "\red The generator already has plenty of plasma."
return
if(/obj/item/weapon/ore/plasma) //raw plasma has impurities, so it doesn't provide as much fuel. --NEO
if(fuel < 50)
user << "\blue You feed some plasma into the armor's generator."
power:fuel += 15
del(W)
return
else
user << "\red The generator already has plenty of plasma."
return
..()
/obj/item/clothing/head/powered
name = "Powered armor"
icon_state = "swat"
desc = "Not for rookies."
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH
see_face = 0.0
item_state = "swat"
armor = list(melee = 40, bullet = 30, laser = 20, taser = 15, bomb = 25, bio = 10, rad = 10)
var/obj/item/clothing/suit/powered/parent
proc/atmotoggle()
set category = "Object"
set name = "Toggle helmet seals"
var/mob/living/carbon/human/user = usr
if(!istype(user))
user << "\red This helmet is not rated for nonhuman use."
return
if(user.head != src)
user << "\red Can't engage the seals without wearing the helmet."
return
if(!user.wear_suit || !istype(user.wear_suit,/obj/item/clothing/suit/powered))
user << "\red This helmet can only couple with powered armor."
return
var/obj/item/clothing/suit/powered/armor = user.wear_suit
if(!armor.atmoseal || !istype(armor.atmoseal, /obj/item/powerarmor/atmoseal/optional))
user << "\red This armor's atmospheric seals are missing or incompatible."
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, taser = 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, taser = 15, bomb = 25, bio = 10, rad = 10)
obj/item/clothing/suit/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/powered/proc/poweron
var/obj/item/clothing/head/powered/helm = new /obj/item/clothing/head/powered(src.loc)
helm.verbs += /obj/item/clothing/head/powered/proc/atmotoggle
obj/item/clothing/suit/powered/spawnable/regular
New()
servos = new /obj/item/powerarmor/servos(src)
servos.parent = src
reactive = new /obj/item/powerarmor/reactive/centcomm(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/powered/proc/poweron
var/obj/item/clothing/head/powered/helm = new /obj/item/clothing/head/powered(src.loc)
helm.verbs += /obj/item/clothing/head/powered/proc/atmotoggle
@@ -0,0 +1,256 @@
/obj/item/powerarmor
name = "Generic power armor component"
desc = "This is the base object, you should never see one."
var/obj/item/clothing/suit/powered/parent //so the component knows which armor it belongs to.
var/slowdown = 0 //how much the component slows down the wearer
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."
process()
return
proc/checkpower()
return 1
plasma
name = "Miniaturized plasma generator"
desc = "Runs on plasma."
slowdown = 1
var/fuel = 0
process()
if (fuel > 0 && parent.active)
fuel--
spawn(50)
process()
return
else if (parent.active)
parent.powerdown(1)
return
checkpower()
return fuel
powercell
name = "Powercell interface"
desc = "Boring, but reliable."
var/obj/item/weapon/cell/cell
slowdown = 0.5
process()
if (cell && cell.charge > 0 && parent.active)
cell.use(50)
spawn(50)
process()
return
else if (parent.active)
parent.powerdown(1)
return
checkpower()
return max(cell.charge, 0)
nuclear
name = "Miniaturized nuclear generator"
desc = "For all your radioactive needs."
slowdown = 1.5
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 << "\red Your armor feels pleasantly warm for a moment."
else
M << "\red You feel a warm sensation."
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 << "\red Your armor's reactor overloads!"
M << "\red You feel a wave of heat wash over you."
M.radiation += 100
crit_fail = 1 //broken~
parent.powerdown(1)
spawn(50)
process()
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, taser = 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
toggle(sudden = 0)
switch(parent.active)
if(1)
if(!sudden)
usr << "\blue Reactive armor systems disengaged."
if(0)
usr << "\blue Reactive armor systems engaged."
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]
centcomm
name = "CentComm power armor reactive plating"
desc = "Pretty effective against everything, not perfect though."
togglearmor = list(melee = 90, bullet = 70, laser = 60, taser = 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
toggle(sudden = 0)
switch(parent.active)
if(1)
if(!sudden)
usr << "\blue Movement assist servos disengaged."
parent.slowdown += toggleslowdown
if(0)
usr << "\blue Movement assist servos engaged."
parent.slowdown -= toggleslowdown
/obj/item/powerarmor/atmoseal
name = "Power armor atmospheric seals"
desc = "Keeps the bad stuff out."
slowdown = 1
var/sealed = 0
toggle(sudden = 0)
switch(parent.active)
if(1)
if(!sudden)
usr << "\blue Atmospheric seals disengaged."
parent.gas_transfer_coefficient = 1
parent.permeability_coefficient = 1
parent.heat_transfer_coefficient = 1
parent.radiation_protection = 0
parent.flags &= ~SUITSPACE
if(parent.helmrequired)
parent.helm.gas_transfer_coefficient = 1
parent.helm.permeability_coefficient = 1
parent.helm.heat_transfer_coefficient = 1
parent.helm.radiation_protection = 0
parent.helm.flags &= ~HEADSPACE
if(parent.glovesrequired)
parent.gloves.gas_transfer_coefficient = 1
parent.gloves.permeability_coefficient = 1
parent.gloves.heat_transfer_coefficient = 1
parent.gloves.radiation_protection = 0
if(parent.shoesrequired)
parent.shoes.gas_transfer_coefficient = 1
parent.shoes.permeability_coefficient = 1
parent.shoes.heat_transfer_coefficient = 1
parent.shoes.radiation_protection = 0
sealed = 0
if(0)
usr << "\blue Atmospheric seals engaged."
parent.gas_transfer_coefficient = 0.01
parent.permeability_coefficient = 0.02
parent.heat_transfer_coefficient = 0.02
parent.radiation_protection = 0.75
parent.flags |= SUITSPACE
if(parent.helmrequired)
parent.helm.gas_transfer_coefficient = 0.01
parent.helm.permeability_coefficient = 0.02
parent.helm.heat_transfer_coefficient = 0.02
parent.helm.radiation_protection = 0.75
parent.helm.flags |= HEADSPACE
if(parent.glovesrequired)
parent.gloves.gas_transfer_coefficient = 0.01
parent.gloves.permeability_coefficient = 0.02
parent.gloves.heat_transfer_coefficient = 0.02
parent.gloves.radiation_protection = 0.75
if(parent.shoesrequired)
parent.shoes.gas_transfer_coefficient = 0.01
parent.shoes.permeability_coefficient = 0.02
parent.shoes.heat_transfer_coefficient = 0.02
parent.shoes.radiation_protection = 0.75
sealed = 1
adminbus
name = "Adminbus power armor atmospheric seals"
desc = "Made with the rare Badminium molecule."
slowdown = 0
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."
proc/helmtoggle(sudden = 0, manual = 0)
var/mob/living/carbon/human/user = usr
var/obj/item/clothing/head/powered/helm
if(user.head && istype(user.head,/obj/item/clothing/head/powered))
helm = user.head
if(!sealed)
user << "\red Unable to initialize helmet seal, armor seals not active."
return
if(!helm.parent)
user << "\blue Helmet locked."
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.heat_transfer_coefficient = 0.02
parent.helm.radiation_protection = 0.75
parent.helm.flags |= HEADSPACE
user << "\blue Helmet atmospheric seals engaged."
if(manual)
for (var/armorvar in helm.armor)
helm.armor[armorvar] = parent.armor[armorvar]
return
else
if(manual)
user << "\blue Helmet atmospheric seals disengaged."
parent.helm.gas_transfer_coefficient = 1
parent.helm.permeability_coefficient = 1
parent.helm.heat_transfer_coefficient = 1
parent.helm.radiation_protection = 0
parent.helm.flags &= ~HEADSPACE
if(manual)
for (var/armorvar in helm.armor)
helm.armor[armorvar] = parent.reactive.togglearmor[armorvar]
if(!sudden)
if(manual)
sleep(20)
user << "\blue Helmet unlocked."
helm.canremove = 1
parent.helm = null
helm.parent = null
adminbus
name = "Adminbus togglable power armor atmospheric seals"
desc = "Made with the rare Badminium molecule."
slowdown = 0