diff --git a/baystation12.dme b/baystation12.dme index 2ff92a6e54f..542f35d8aec 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1442,6 +1442,8 @@ #include "code\WorkInProgress\ZomgPonies\mobs\pony.dm" #include "code\WorkInProgress\ZomgPonies\mobs\metroid\powers.dm" #include "code\WorkInProgress\ZomgPonies\oldcode\turntable.dm" +#include "code\WorkInProgress\ZomgPonies\powerarmor\powerarmor.dm" +#include "code\WorkInProgress\ZomgPonies\powerarmor\powerarmorcomponents.dm" #include "code\ZAS\Airflow.dm" #include "code\ZAS\Connection.dm" #include "code\ZAS\Debug.dm" diff --git a/code/WorkInProgress/ZomgPonies/powerarmor/powerarmor.dm b/code/WorkInProgress/ZomgPonies/powerarmor/powerarmor.dm new file mode 100644 index 00000000000..e0de3cfbe77 --- /dev/null +++ b/code/WorkInProgress/ZomgPonies/powerarmor/powerarmor.dm @@ -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 << "This suit was engineered for human use only." + return + + if(user.wear_suit!=src) + user << "The suit functions best if you are inside of it." + return + + if(helmrequired && !istype(user.head, /obj/item/clothing/head/space/powered)) + user << "Helmet missing, unable to initiate power-on procedure." + return + + if(glovesrequired && !istype(user.gloves, /obj/item/clothing/gloves/powered)) + user << "Gloves missing, unable to initiate power-on procedure." + return + + if(shoesrequired && !istype(user.shoes, /obj/item/clothing/shoes/powered)) + user << "Shoes missing, unable to initiate power-on procedure." + return + + if(active) + user << "The suit is already on, you can't turn it on twice." + return + + if(!power || !power.checkpower()) + user << "Powersource missing or depleted." + return + + verbs -= /obj/item/clothing/suit/space/powered/proc/poweron + + user << "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 << "All systems online." + 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 << "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) + var/obj/item/powerarmor/atmoseal/optional/Atmo_seal = atmoseal + Atmo_seal.helmtoggle(sudden) + atmoseal.toggle(sudden) + + sleep(delay) + + if(!sudden) + usr << "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 << "All systems disengaged." + + 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 << "You feed some refined plasma into the armor's generator." + Plasma_power.fuel += 25 + P.amount-- + if (P.amount <= 0) + del(P) + return + else + user << "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 << "You feed some plasma into the armor's generator." + Plasma_power.fuel += 15 + del(W) + return + else + user << "The generator already has plenty of plasma." + 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 << "This helmet is engineered for human use." + return + if(user.head != src) + user << "Can't engage the seals without wearing the helmet." + return + + if(!user.wear_suit || !istype(user.wear_suit,/obj/item/clothing/suit/space/powered)) + user << "This helmet can only couple with powered armor." + return + + var/obj/item/clothing/suit/space/powered/armor = user.wear_suit + + if(!armor.atmoseal || !istype(armor.atmoseal, /obj/item/powerarmor/atmoseal/optional)) + user << "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,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 diff --git a/code/WorkInProgress/ZomgPonies/powerarmor/powerarmorcomponents.dm b/code/WorkInProgress/ZomgPonies/powerarmor/powerarmorcomponents.dm new file mode 100644 index 00000000000..132598feb19 --- /dev/null +++ b/code/WorkInProgress/ZomgPonies/powerarmor/powerarmorcomponents.dm @@ -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 << "Your armor feels pleasantly warm for a moment." + else + M << "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 << "Your armor's reactor overloads!" + M << "You feel a wave of heat wash over you." + 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 << "Reactive armor systems disengaged." + if(0) + usr << "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] + +/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 << "Movement assist servos disengaged." + parent.slowdown += toggleslowdown + if(0) + usr << "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 + +/obj/item/powerarmor/atmoseal/toggle(sudden = 0) + switch(parent.active) + if(1) + if(!sudden) + usr << "Atmospheric seals disengaged." + 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 << "Atmospheric seals engaged." + 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 << "Unable to initialize helmet seal, armor seals not active." + return + if(!helm.parent) + user << "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.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 << "Helmet atmospheric seals engaged." + if(manual) + for (var/armorvar in helm.armor) + helm.armor[armorvar] = parent.armor[armorvar] + return + else + if(manual) + user << "Helmet atmospheric seals disengaged." + 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 << "Helmet unlocked." + 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 + + + diff --git a/code/setup.dm b/code/setup.dm index 89f503e554f..c87479b48a9 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -45,6 +45,7 @@ #define BODYTEMP_COLD_DAMAGE_LIMIT 260.15 // The limit the human body can take before it starts taking damage from coldness. #define SPACE_HELMET_MIN_COLD_PROTECITON_TEMPERATURE 2.0 //what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0. +#define SPACE_HELMET_MAX_HEAT_PROTECITON_TEMPERATURE 5000 #define SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE 2.0 //what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0. #define SPACE_SUIT_MAX_HEAT_PROTECITON_TEMPERATURE 5000 //These need better heat protect #define FIRESUIT_MAX_HEAT_PROTECITON_TEMPERATURE 30000 //what max_heat_protection_temperature is set to for firesuit quality headwear. MUST NOT BE 0.