From dad1705c465cdca7df99114b9704d6e299c93cd0 Mon Sep 17 00:00:00 2001 From: skull132 Date: Sat, 4 Oct 2014 22:25:40 +0300 Subject: [PATCH] Baystation12 Hardsuit Code Porting over the code. --- code/game/machinery/alarm.dm | 12 - code/game/machinery/autolathe.dm | 13 +- code/game/machinery/camera/camera.dm | 5 - code/game/machinery/doors/airlock.dm | 11 +- code/game/machinery/kitchen/smartfridge.dm | 10 - code/game/machinery/machinery.dm | 14 + code/game/machinery/suit_storage_unit.dm | 566 +++++++++++++++++- code/game/machinery/vending.dm | 13 - code/game/objects/items.dm | 24 +- code/game/objects/items/devices/modkit.dm | 109 ++-- .../objects/items/devices/suit_cooling.dm | 186 ++++++ code/modules/clothing/clothing.dm | 122 +++- code/modules/clothing/spacesuits/breaches.dm | 221 +++++++ code/modules/clothing/spacesuits/rig.dm | 302 +++++++++- code/modules/customitems/item_defines.dm | 4 + .../mob/living/carbon/human/human_damage.dm | 22 +- .../mob/living/carbon/human/human_defense.dm | 13 + code/modules/mob/living/carbon/human/life.dm | 53 +- code/modules/power/apc.dm | 29 +- .../power/singularity/containment_field.dm | 13 +- code/modules/research/rdmachines.dm | 14 - icons/mob/species/vox/eyes.dmi | Bin 0 -> 3407 bytes icons/mob/species/vox/gloves.dmi | Bin 358 -> 9452 bytes icons/mob/species/vox/head.dmi | Bin 1997 -> 3363 bytes icons/mob/species/vox/masks.dmi | Bin 0 -> 11864 bytes icons/mob/species/vox/shoes.dmi | Bin 0 -> 1592 bytes icons/mob/species/vox/suit.dmi | Bin 3171 -> 10072 bytes icons/mob/species/vox/uniform.dmi | Bin 0 -> 47559 bytes 28 files changed, 1554 insertions(+), 202 deletions(-) create mode 100644 code/game/objects/items/devices/suit_cooling.dm create mode 100644 code/modules/clothing/spacesuits/breaches.dm create mode 100644 icons/mob/species/vox/eyes.dmi create mode 100644 icons/mob/species/vox/masks.dmi create mode 100644 icons/mob/species/vox/shoes.dmi create mode 100644 icons/mob/species/vox/uniform.dmi diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index e5b07ca8..6b7152f0 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -616,18 +616,6 @@ updateDialog() return -/obj/machinery/alarm/proc/shock(mob/user, prb) - if((stat & (NOPOWER))) // unpowered, no shock - return 0 - if(!prob(prb)) - return 0 //you lucked out, no shock for you - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() //sparks always. - if (electrocute_mob(user, get_area(src), src)) - return 1 - else - return 0 /////////////// //END HACKING// /////////////// diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index d42ead98..731906d7 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -143,18 +143,7 @@ var/global/list/autolathe_recipes_hidden = list( \ user << browse("Autolathe Control Panel[dat]", "window=autolathe_regular") onclose(user, "autolathe_regular") - shock(mob/user, prb) - if(stat & (BROKEN|NOPOWER)) // unpowered, no shock - return 0 - if(!prob(prb)) - return 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - if (electrocute_mob(user, get_area(src), src, 0.7)) - return 1 - else - return 0 + interact(mob/user as mob) if(istype(user, /mob/living/carbon/human)) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index d5f6ed1e..9fe62563 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -94,11 +94,6 @@ src.view_range = num cameranet.updateVisibility(src, 0) -/obj/machinery/camera/proc/shock(var/mob/living/user) - if(!istype(user)) - return - user.electrocute_act(10, src) - /obj/machinery/camera/attack_paw(mob/living/carbon/alien/humanoid/user as mob) if(!istype(user)) return diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a2ef4bb7..9dba5ddd 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -597,17 +597,12 @@ About the new airlock wires panel: // shock user with probability prb (if all connections & power are working) // returns 1 if shocked, 0 otherwise // The preceding comment was borrowed from the grille's shock script -/obj/machinery/door/airlock/proc/shock(mob/user, prb) - if((stat & (NOPOWER)) || !src.arePowerSystemsOn()) // unpowered, no shock +/obj/machinery/door/airlock/shock(mob/user, prb) + if(!arePowerSystemsOn()) return 0 if(hasShocked) return 0 //Already shocked someone recently? - if(!prob(prb)) - return 0 //you lucked out, no shock for you - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() //sparks always. - if(electrocute_mob(user, get_area(src), src)) + if(..()) hasShocked = 1 sleep(10) hasShocked = 0 diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 5974cce6..ad15d889 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -407,16 +407,6 @@ src.visible_message("\red [src] launches [throw_item.name] at [target.name]!") return 1 -/obj/machinery/smartfridge/proc/shock(mob/user, prb) - if(!ispowered) return 0 - if(!prob(prb)) return 0 - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - - return electrocute_mob(user, get_area(src), src, 0.7) - /************************ * Secure SmartFridges *************************/ diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index d8f05eb5..5b7a47e7 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -278,3 +278,17 @@ Class Procs: return else user << "The item is secured to the floor too firmly." + +/obj/machinery/proc/shock(mob/user, prb) +// if(inoperable()) +// return 0 + if(!prob(prb)) + return 0 + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + if (electrocute_mob(user, get_area(src), src, 0.7)) + return 1 + else + return 0 + diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index b716d941..1d251596 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -567,4 +567,568 @@ return -//////////////////////////////REMINDER: Make it lock once you place some fucker inside. \ No newline at end of file +//////////////////////////////REMINDER: Make it lock once you place some fucker inside. + +//God this entire file is fucking awful +//Suit painter for Bay's special snowflake aliums. + +/obj/machinery/suit_cycler + + name = "suit cycler" + desc = "An industrial machine for painting and refitting hardsuits." + anchored = 1 + density = 1 + + icon = 'icons/obj/suitstorage.dmi' + icon_state = "suitstorage000000100" + + req_access = list(access_captain,access_heads) + + var/active = 0 // PLEASE HOLD. + var/safeties = 1 // The cycler won't start with a living thing inside it unless safeties are off. + var/irradiating = 0 // If this is > 0, the cycler is decontaminating whatever is inside it. + var/radiation_level = 2 // 1 is removing germs, 2 is removing blood, 3 is removing phoron. + var/model_text = "" // Some flavour text for the topic box. + var/locked = 1 // If locked, nothing can be taken from or added to the cycler. + var/panel_open = 0 // Hacking! + var/can_repair // If set, the cycler can repair hardsuits. + + // Wiring bollocks. + var/wires = 15 + var/electrified = 0 + var/const/WIRE_EXTEND = 1 // Safeties + var/const/WIRE_SCANID = 2 // Locked status + var/const/WIRE_SHOCK = 3 // What it says on the tin. + + //Departments that the cycler can paint suits to look like. + var/list/departments = list("Engineering","Mining","Medical","Security","Atmos") + //Species that the suits can be configured to fit. + var/list/species = list("Human","Skrell","Unathi","Tajaran") + + var/target_department + var/target_species + + var/mob/living/carbon/human/occupant = null + var/obj/item/clothing/suit/space/rig/suit = null + var/obj/item/clothing/head/helmet/space/helmet = null + +/obj/machinery/suit_cycler/New() + ..() + target_department = departments[1] + target_species = species[1] + if(!target_department || !target_species) del(src) + +/obj/machinery/suit_cycler/engineering + name = "Engineering suit cycler" + model_text = "Engineering" + req_access = list(access_construction) + departments = list("Engineering","Atmos") + species = list("Human","Tajaran","Skrell","Unathi") //Add Unathi when sprites exist for their suits. + +/obj/machinery/suit_cycler/mining + name = "Mining suit cycler" + model_text = "Mining" + req_access = list(access_mining) + departments = list("Mining") + species = list("Human","Tajaran","Skrell","Unathi") + +/obj/machinery/suit_cycler/security + name = "Security suit cycler" + model_text = "Security" + req_access = list(access_security) + departments = list("Security") + species = list("Human","Tajaran","Skrell","Unathi") + +/obj/machinery/suit_cycler/medical + name = "Medical suit cycler" + model_text = "Medical" + req_access = list(access_medical) + departments = list("Medical") + species = list("Human","Tajaran","Skrell","Unathi") + +/obj/machinery/suit_cycler/syndicate + name = "Nonstandard suit cycler" + model_text = "Nonstandard" + req_access = list(access_syndicate) + departments = list("Mercenary") + species = list("Human","Tajaran","Skrell","Unathi") + can_repair = 1 + +/obj/machinery/suit_cycler/attack_ai(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/suit_cycler/attack_paw(mob/user as mob) + user << "\blue The console controls are far too complicated for your tiny brain!" + return + +/obj/machinery/suit_cycler/attackby(obj/item/I as obj, mob/user as mob) + + if(electrified != 0) + if(src.shock(user, 100)) + return + + //Hacking init. + if(istype(I, /obj/item/device/multitool) || istype(I, /obj/item/weapon/wirecutters)) + if(panel_open) + attack_hand(user) + return + //Other interface stuff. + if(istype(I, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = I + + if(!(ismob(G.affecting))) + return + + if(locked) + user << "\red The suit cycler is locked." + return + + if(src.contents.len > 0) + user << "\red There is no room inside the cycler for [G.affecting.name]." + return + + visible_message("[user] starts putting [G.affecting.name] into the suit cycler.", 3) + + if(do_after(user, 20)) + if(!G || !G.affecting) return + var/mob/M = G.affecting + if (M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + M.loc = src + src.occupant = M + + src.add_fingerprint(user) + del(G) + + src.updateUsrDialog() + + return + else if(istype(I,/obj/item/weapon/screwdriver)) + + panel_open = !panel_open + user << "You [panel_open ? "open" : "close"] the maintenance panel." + src.updateUsrDialog() + return + + else if(istype(I,/obj/item/weapon/card/emag)) + + if(emagged) + user << "\red The cycler has already been subverted." + return + + var/obj/item/weapon/card/emag/E = I + src.updateUsrDialog() + E.uses-- + + //Clear the access reqs, disable the safeties, and open up all paintjobs. + user << "\red You run the sequencer across the interface, corrupting the operating protocols." + departments = list("Engineering","Mining","Medical","Security","Atmos","^%###^%$") + emagged = 1 + safeties = 0 + req_access = list() + return + + else if(istype(I,/obj/item/clothing/head/helmet/space)) + + if(locked) + user << "\red The suit cycler is locked." + return + + if(helmet) + user << "The cycler already contains a helmet." + return + + user << "You fit \the [I] into the suit cycler." + user.drop_item() + I.loc = src + helmet = I + + src.update_icon() + src.updateUsrDialog() + return + + else if(istype(I,/obj/item/clothing/suit/space/rig)) + + if(locked) + user << "\red The suit cycler is locked." + return + + if(suit) + user << "The cycler already contains a hardsuit." + return + + var/obj/item/clothing/suit/space/rig/S = I + + if(S.helmet) + user << "\The [S] will not fit into the cycler with a helmet attached." + return + + if(S.boots) + user << "\The [S] will not fit into the cycler with boots attached." + return + + user << "You fit \the [I] into the suit cycler." + user.drop_item() + I.loc = src + suit = I + + src.update_icon() + src.updateUsrDialog() + return + + ..() + +/obj/machinery/suit_cycler/attack_hand(mob/user as mob) + + add_fingerprint(user) + + if(..() || stat & (BROKEN|NOPOWER)) + return + + if(electrified != 0) + if(src.shock(user, 100)) + return + + usr.set_machine(src) + + var/dat = "Suit Cycler Interface" + + if(src.active) + dat+= "
The [model_text ? "[model_text] " : ""]suit cycler is currently in use. Please wait..." + + else if(locked) + dat += "
The [model_text ? "[model_text] " : ""]suit cycler is currently locked. Please contact your system administrator." + if(src.allowed(usr)) + dat += "
\[unlock unit\]" + else + dat += "

Suit cycler

" + dat += "Welcome to the [model_text ? "[model_text] " : ""]suit cycler control panel. \[lock unit\]
" + + dat += "

Maintenance

" + dat += "Helmet: [helmet ? "\the [helmet]" : "no helmet stored" ]. \[eject\]
" + dat += "Suit: [suit ? "\the [suit]" : "no suit stored" ]. \[eject\]" + + if(can_repair && suit && istype(suit)) + dat += "[(suit.damage ? " \[repair\]" : "")]" + + dat += "
UV decontamination systems: SYSTEM ERROR" : "green'>READY"]
" + dat += "Output level: [radiation_level]
" + dat += "\[select power level\] \[begin decontamination cycle\]

" + + dat += "

Customisation

" + dat += "Target product: [target_department], [target_species]." + dat += "
\[apply customisation routine\]


" + + if(panel_open) + var/list/vendwires = list( + "Violet" = 1, + "Orange" = 2, + "Goldenrod" = 3, + ) + dat += "

Access Panel

" + for(var/wiredesc in vendwires) + var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]] + dat += "[wiredesc] wire: " + if(!is_uncut) + dat += "Mend" + else + dat += "Cut " + dat += "Pulse " + dat += "
" + + dat += "
" + dat += "The orange light is [(electrified == 0) ? "off" : "on"].
" + dat += "The red light is [safeties ? "blinking" : "off"].
" + dat += "The yellow light is [locked ? "on" : "off"].
" + + user << browse(dat, "window=suit_cycler") + onclose(user, "suit_cycler") + return + +/obj/machinery/suit_cycler/Topic(href, href_list) + if(href_list["eject_suit"]) + if(!suit) return + suit.loc = get_turf(src) + suit = null + else if(href_list["eject_helmet"]) + if(!helmet) return + helmet.loc = get_turf(src) + helmet = null + else if(href_list["select_department"]) + var/choice = input("Please select the target department paintjob.","Suit cycler",null) as null|anything in departments + if(choice) target_department = choice + else if(href_list["select_species"]) + var/choice = input("Please select the target species configuration.","Suit cycler",null) as null|anything in species + if(choice) target_species = choice + else if(href_list["select_rad_level"]) + var/choices = list(1,2,3) + if(emagged) + choices = list(1,2,3,4,5) + radiation_level = input("Please select the desired radiation level.","Suit cycler",null) as null|anything in choices + else if(href_list["repair_suit"]) + + if(!suit || !can_repair) return + active = 1 + spawn(100) + repair_suit() + finished_job() + + else if(href_list["apply_paintjob"]) + + if(!suit && !helmet) return + active = 1 + spawn(100) + apply_paintjob() + finished_job() + + else if(href_list["toggle_safties"]) + safeties = !safeties + + else if(href_list["toggle_lock"]) + + if(src.allowed(usr)) + locked = !locked + usr << "You [locked ? "" : "un"]lock \the [src]." + else + usr << "\red Access denied." + + else if(href_list["begin_decontamination"]) + + if(safeties && occupant) + usr << "\red The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle." + return + + active = 1 + irradiating = 10 + src.updateUsrDialog() + + sleep(10) + + if(helmet) + if(radiation_level > 2) + helmet.decontaminate() + if(radiation_level > 1) + helmet.clean_blood() + + if(suit) + if(radiation_level > 2) + suit.decontaminate() + if(radiation_level > 1) + suit.clean_blood() + + else if ((href_list["cutwire"]) && (src.panel_open)) + var/twire = text2num(href_list["cutwire"]) + if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) + usr << "You need wirecutters!" + return + if (src.isWireColorCut(twire)) + src.mend(twire) + else + src.cut(twire) + + else if ((href_list["pulsewire"]) && (src.panel_open)) + var/twire = text2num(href_list["pulsewire"]) + if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) + usr << "You need a multitool!" + return + if (src.isWireColorCut(twire)) + usr << "You can't pulse a cut wire." + return + else + src.pulse(twire) + + src.updateUsrDialog() + return + +/obj/machinery/suit_cycler/process() + + if(electrified > 0) + electrified-- + + if(!active) + return + + if(active && stat & (BROKEN|NOPOWER)) + active = 0 + irradiating = 0 + electrified = 0 + return + + if(irradiating == 1) + finished_job() + irradiating = 0 + return + + irradiating-- + + if(occupant) + if(prob(radiation_level*2)) occupant.emote("scream") + if(radiation_level > 2) + occupant.take_organ_damage(0,radiation_level*2 + rand(1,3)) + if(radiation_level > 1) + occupant.take_organ_damage(0,radiation_level + rand(1,3)) + occupant.radiation += radiation_level*10 + +/obj/machinery/suit_cycler/proc/finished_job() + var/turf/T = get_turf(src) + T.visible_message("\icon[src] \blue The [src] pings loudly.") + icon_state = initial(icon_state) + active = 0 + src.updateUsrDialog() + +/obj/machinery/suit_cycler/proc/repair_suit() + if(!suit || !suit.damage || !suit.can_breach) + return + + suit.breaches = list() + suit.calc_breach_damage() + + return + +/obj/machinery/suit_cycler/verb/leave() + set name = "Eject Cycler" + set category = "Object" + set src in oview(1) + + if (usr.stat != 0) + return + + eject_occupant(usr) + +/obj/machinery/suit_cycler/proc/eject_occupant(mob/user as mob) + + if(locked || active) + user << "\red The cycler is locked." + return + + if (!occupant) + return + + if (occupant.client) + occupant.client.eye = occupant.client.mob + occupant.client.perspective = MOB_PERSPECTIVE + + occupant.loc = get_turf(occupant) + occupant = null + + add_fingerprint(usr) + src.updateUsrDialog() + src.update_icon() + + return + +//HACKING PROCS, MOSTLY COPIED FROM VENDING MACHINES +/obj/machinery/suit_cycler/proc/isWireColorCut(var/wireColor) + var/wireFlag = APCWireColorToFlag[wireColor] + return ((src.wires & wireFlag) == 0) + +/obj/machinery/suit_cycler/proc/isWireCut(var/wireIndex) + var/wireFlag = APCIndexToFlag[wireIndex] + return ((src.wires & wireFlag) == 0) + +/obj/machinery/suit_cycler/proc/cut(var/wireColor) + var/wireFlag = APCWireColorToFlag[wireColor] + var/wireIndex = APCWireColorToIndex[wireColor] + src.wires &= ~wireFlag + switch(wireIndex) + + if(WIRE_EXTEND) + safeties = 0 + if(WIRE_SHOCK) + electrified = -1 + if (WIRE_SCANID) + locked = 0 + +/obj/machinery/suit_cycler/proc/mend(var/wireColor) + var/wireFlag = APCWireColorToFlag[wireColor] + var/wireIndex = APCWireColorToIndex[wireColor] //not used in this function + src.wires |= wireFlag + switch(wireIndex) + if(WIRE_SHOCK) + src.electrified = 0 + +/obj/machinery/suit_cycler/proc/pulse(var/wireColor) + var/wireIndex = APCWireColorToIndex[wireColor] + switch(wireIndex) + if(WIRE_EXTEND) + safeties = !locked + if(WIRE_SHOCK) + electrified = 30 + if (WIRE_SCANID) + locked = !locked + +//There HAS to be a less bloated way to do this. TODO: some kind of table/icon name coding? ~Z +/obj/machinery/suit_cycler/proc/apply_paintjob() + + if(!target_species || !target_department) + return + + if(target_species) + if(helmet) helmet.refit_for_species(target_species) + if(suit) suit.refit_for_species(target_species) + + switch(target_department) + if("Engineering") + if(helmet) + helmet.name = "engineering hardsuit helmet" + helmet.icon_state = "rig0-engineering" + helmet.item_state = "eng_helm" + helmet.item_color = "engineering" + if(suit) + suit.name = "engineering hardsuit" + suit.icon_state = "rig-engineering" + suit.item_state = "eng_hardsuit" + if("Mining") + if(helmet) + helmet.name = "mining hardsuit helmet" + helmet.icon_state = "rig0-mining" + helmet.item_state = "mining_helm" + helmet.item_color = "mining" + if(suit) + suit.name = "mining hardsuit" + suit.icon_state = "rig-mining" + suit.item_state = "mining_hardsuit" + if("Medical") + if(helmet) + helmet.name = "medical hardsuit helmet" + helmet.icon_state = "rig0-medical" + helmet.item_state = "medical_helm" + helmet.item_color = "medical" + if(suit) + suit.name = "medical hardsuit" + suit.icon_state = "rig-medical" + suit.item_state = "medical_hardsuit" + if("Security") + if(helmet) + helmet.name = "security hardsuit helmet" + helmet.icon_state = "rig0-sec" + helmet.item_state = "sec_helm" + helmet.item_color = "sec" + if(suit) + suit.name = "security hardsuit" + suit.icon_state = "rig-sec" + suit.item_state = "sec_hardsuit" + if("Atmos") + if(helmet) + helmet.name = "atmospherics hardsuit helmet" + helmet.icon_state = "rig0-atmos" + helmet.item_state = "atmos_helm" + helmet.item_color = "atmos" + if(suit) + suit.name = "atmospherics hardsuit" + suit.icon_state = "rig-atmos" + suit.item_state = "atmos_hardsuit" + if("^%###^%$" || "Mercenary") + if(helmet) + helmet.name = "blood-red hardsuit helmet" + helmet.icon_state = "rig0-syndie" + helmet.item_state = "syndie_helm" + helmet.item_color = "syndie" + if(suit) + suit.name = "blood-red hardsuit" + suit.item_state = "syndie_hardsuit" + suit.icon_state = "rig-syndie" + + if(helmet) helmet.name = "refitted [helmet.name]" + if(suit) suit.name = "refitted [suit.name]" \ No newline at end of file diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 3693fa0d..381cc702 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -588,19 +588,6 @@ src.shoot_inventory = !src.shoot_inventory -/obj/machinery/vending/proc/shock(mob/user, prb) - if(stat & (BROKEN|NOPOWER)) // unpowered, no shock - return 0 - if(!prob(prb)) - return 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - if (electrocute_mob(user, get_area(src), src, 0.7)) - return 1 - else - return 0 - /* * Vending machine types */ diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 1b256543..dde17c84 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -39,8 +39,22 @@ var/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) var/list/allowed = null //suit storage stuff. var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers. + + /* Species-specific sprites, concept stolen from Paradise//vg/. + ex: + sprite_sheets = list( + "Tajaran" = 'icons/cat/are/bad' + ) + If index term exists and icon_override is not set, this sprite sheet will be used. + */ + var/list/sprite_sheets = null var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc. + /* Species-specific sprite sheets for inventory sprites + Works similarly to worn sprite_sheets, except the alternate sprites are used when the clothing/refit_for_species() proc is called. + */ + var/list/sprite_sheets_obj = null + /obj/item/device icon = 'icons/obj/device.dmi' @@ -477,6 +491,12 @@ /obj/item/proc/IsShield() return 0 +/obj/item/proc/get_loc_turf() + var/atom/L = loc + while(L && !istype(L, /turf/)) + L = L.loc + return loc + /obj/item/proc/eyestab(mob/living/carbon/M as mob, mob/living/carbon/user as mob) var/mob/living/carbon/human/H = M @@ -525,7 +545,9 @@ "\red You stab yourself in the eyes with [src]!" \ ) if(istype(M, /mob/living/carbon/human)) - var/datum/organ/internal/eyes/eyes = H.internal_organs["eyes"] + var/datum/organ/internal/eyes/eyes = H.internal_organs_by_name["eyes"] + if(!eyes) + return eyes.damage += rand(3,4) if(eyes.damage >= eyes.min_bruised_damage) if(M.stat != 2) diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index 1037c6af..02d11f22 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -7,79 +7,66 @@ desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user." icon_state = "modkit" var/parts = MODKIT_FULL - var/list/from_helmet = list(/obj/item/clothing/head/helmet/space/rig) - var/list/from_suit = list(/obj/item/clothing/suit/space/rig) - var/list/to_helmet = list(/obj/item/clothing/head/cardborg) - var/list/to_suit = list(/obj/item/clothing/suit/cardborg) + var/target_species = "Human" -/obj/item/device/modkit/afterattack(obj/O, mob/user as mob) - var/flag - var/to_type + var/list/permitted_types = list( + /obj/item/clothing/head/helmet/space/rig, + /obj/item/clothing/suit/space/rig + ) - for(var/i = 1, i <= from_helmet.len, i++) -// msg_scopes("[from_helmet[i]]") - if(istype(O, from_helmet[i])) - to_type = to_helmet[i] - flag = MODKIT_HELMET - break - - if(istype(O, from_suit[i])) - flag = MODKIT_SUIT - to_type = to_suit[i] - break - - if(!flag) +/obj/item/device/modkit/afterattack(obj/O, mob/user as mob, proximity) + if(!proximity) return + + if (!target_species) + return //it shouldn't be null, okay? - if(!(parts & flag)) + if(!parts) user << "This kit has no parts for this modification left." + user.drop_from_inventory(src) + del(src) return - if(istype(O,to_type)) - user << "[O] is already modified." + + var/allowed = 0 + for (var/permitted_type in permitted_types) + if(istype(O, permitted_type)) + allowed = 1 + + var/obj/item/clothing/I = O + if (!istype(I) || !allowed) + user << "[src] is unable to modify that." return + + var/excluding = ("exclude" in I.species_restricted) + var/in_list = (target_species in I.species_restricted) + if (excluding ^ in_list) + user << "[I] is already modified." + return + if(!isturf(O.loc)) user << "[O] must be safely placed on the ground for modification." return + playsound(user.loc, 'sound/items/Screwdriver.ogg', 100, 1) - msg_scopes("[to_type]") - var/N = new to_type(O.loc) - user.visible_message("\red [user] opens \the [src] and modifies \the [O] into \the [N].","\red You open \the [src] and modify \the [O] into \the [N].") - del(O) - parts &= ~flag + + user.visible_message("\red [user] opens \the [src] and modifies \the [O].","\red You open \the [src] and modify \the [O].") + + I.refit_for_species(target_species) + + if (istype(I, /obj/item/clothing/head/helmet)) + parts &= ~MODKIT_HELMET + if (istype(I, /obj/item/clothing/suit)) + parts &= ~MODKIT_SUIT + if(!parts) + user.drop_from_inventory(src) del(src) +/obj/item/device/modkit/examine() + ..() + usr << "It looks as though it modifies hardsuits to fit [target_species] users." + /obj/item/device/modkit/tajaran - name = "tajara hardsuit modification kit" - desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajara." - -//Keep the lists in matching orders to the relative type and keep the parents at the end. -// /obj/item/clothing/head/helmet/space/rig <- is a parent //i love you, sounds. - from_helmet = list(/obj/item/clothing/head/helmet/space/rig/security, /obj/item/clothing/head/helmet/space/rig/medical, /obj/item/clothing/head/helmet/space/rig/atmos, /obj/item/clothing/head/helmet/space/rig) - to_helmet = list(/obj/item/clothing/head/helmet/space/rig/security/tajara, /obj/item/clothing/head/helmet/space/rig/medical/tajara, /obj/item/clothing/head/helmet/space/rig/atmos/tajara, /obj/item/clothing/head/helmet/space/rig/tajara) - - from_suit = list(/obj/item/clothing/suit/space/rig/security, /obj/item/clothing/suit/space/rig/medical, /obj/item/clothing/suit/space/rig/atmos, /obj/item/clothing/suit/space/rig) - to_suit = list(/obj/item/clothing/suit/space/rig/security/tajara, /obj/item/clothing/suit/space/rig/medical/tajara, /obj/item/clothing/suit/space/rig/atmos/tajara, /obj/item/clothing/suit/space/rig/tajara) - -/obj/item/device/modkit/unathi - name = "unathi hardsuit modification kit" - desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Unathi." - - from_helmet = list(/obj/item/clothing/head/helmet/space/rig/security, /obj/item/clothing/head/helmet/space/rig/medical, /obj/item/clothing/head/helmet/space/rig/atmos, /obj/item/clothing/head/helmet/space/rig) - to_helmet = list(/obj/item/clothing/head/helmet/space/rig/security/unathi, /obj/item/clothing/head/helmet/space/rig/medical/unathi, /obj/item/clothing/head/helmet/space/rig/atmos/unathi, /obj/item/clothing/head/helmet/space/rig/unathi) - - from_suit = list(/obj/item/clothing/suit/space/rig/security, /obj/item/clothing/suit/space/rig/medical, /obj/item/clothing/suit/space/rig/atmos, /obj/item/clothing/suit/space/rig) - to_suit = list(/obj/item/clothing/suit/space/rig/security/unathi, /obj/item/clothing/suit/space/rig/medical/unathi, /obj/item/clothing/suit/space/rig/atmos/unathi, /obj/item/clothing/suit/space/rig/unathi) - -/obj/item/device/modkit/skrell - name = "skrell hardsuit modification kit" - desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Skrell." - - from_helmet = list(/obj/item/clothing/head/helmet/space/rig/security, /obj/item/clothing/head/helmet/space/rig/medical, /obj/item/clothing/head/helmet/space/rig/atmos, /obj/item/clothing/head/helmet/space/rig) - to_helmet = list(/obj/item/clothing/head/helmet/space/rig/security/skrell, /obj/item/clothing/head/helmet/space/rig/medical/skrell, /obj/item/clothing/head/helmet/space/rig/atmos/skrell, /obj/item/clothing/head/helmet/space/rig/skrell) - - from_suit = list(/obj/item/clothing/suit/space/rig/security, /obj/item/clothing/suit/space/rig/medical, /obj/item/clothing/suit/space/rig/atmos, /obj/item/clothing/suit/space/rig) - to_suit = list(/obj/item/clothing/suit/space/rig/security/skrell, /obj/item/clothing/suit/space/rig/medical/skrell, /obj/item/clothing/suit/space/rig/atmos/skrell, /obj/item/clothing/suit/space/rig/skrell) - - - + name = "tajaran hardsuit modification kit" + desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajaran." + target_species = "Tajaran" \ No newline at end of file diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm new file mode 100644 index 00000000..6355fd26 --- /dev/null +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -0,0 +1,186 @@ +/obj/item/device/suit_cooling_unit + name = "portable suit cooling unit" + desc = "A portable heat sink and liquid cooled radiator that can be hooked up to a space suit's existing temperature controls to provide industrial levels of cooling." + w_class = 4 + icon = 'icons/obj/device.dmi' + icon_state = "suitcooler0" + slot_flags = SLOT_BACK //you can carry it on your back if you want, but it won't do anything unless attached to suit storage + + //copied from tank.dm + flags = FPRINT | TABLEPASS | CONDUCT + force = 5.0 + throwforce = 10.0 + throw_speed = 1 + throw_range = 4 + + origin_tech = "magnets=2;materials=2" + + var/on = 0 //is it turned on? + var/cover_open = 0 //is the cover open? + var/obj/item/weapon/cell/cell + var/max_cooling = 12 //in degrees per second - probably don't need to mess with heat capacity here + var/charge_consumption = 16.6 //charge per second at max_cooling + var/thermostat = T20C + + //TODO: make it heat up the surroundings when not in space + +/obj/item/device/suit_cooling_unit/New() + processing_objects |= src + + cell = new/obj/item/weapon/cell() //comes with the crappy default power cell - high-capacity ones shouldn't be hard to find + cell.loc = src + +/obj/item/device/suit_cooling_unit/process() + if (!on || !cell) + return + + if (!ismob(loc)) + return + + if (!attached_to_suit(loc)) //make sure they have a suit and we are attached to it + return + + var/mob/living/carbon/human/H = loc + + var/efficiency = 1 - H.get_pressure_weakness() //you need to have a good seal for effective cooling + var/env_temp = get_environment_temperature() //wont save you from a fire + var/temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling) + + if (temp_adj < 0.5) //only cools, doesn't heat, also we don't need extreme precision + return + + var/charge_usage = (temp_adj/max_cooling)*charge_consumption + + H.bodytemperature -= temp_adj*efficiency + + cell.use(charge_usage) + + if(cell.charge <= 0) + turn_off() + +/obj/item/device/suit_cooling_unit/proc/get_environment_temperature() + if (ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(istype(H.loc, /obj/mecha)) + var/obj/mecha/M = loc + return M.return_temperature() + else if(istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell)) + return H.loc:air_contents.temperature + + var/turf/T = get_turf(src) + if(istype(T, /turf/space)) + return 0 //space has no temperature, this just makes sure the cooling unit works in space + + var/datum/gas_mixture/environment = T.return_air() + if (!environment) + return 0 + + return environment.temperature + +/obj/item/device/suit_cooling_unit/proc/attached_to_suit(mob/M) + if (!ishuman(M)) + return 0 + + var/mob/living/carbon/human/H = M + + if (!H.wear_suit || H.s_store != src) + return 0 + + return 1 + +/obj/item/device/suit_cooling_unit/proc/turn_on() + if(!cell) + return + if(cell.charge <= 0) + return + + on = 1 + updateicon() + +/obj/item/device/suit_cooling_unit/proc/turn_off() + if (ismob(src.loc)) + var/mob/M = src.loc + M.show_message("\The [src] clicks and whines as it powers down.", 2) //let them know in case it's run out of power. + on = 0 + updateicon() + +/obj/item/device/suit_cooling_unit/attack_self(mob/user as mob) + if(cover_open && cell) + if(ishuman(user)) + user.put_in_hands(cell) + else + cell.loc = get_turf(loc) + + cell.add_fingerprint(user) + cell.updateicon() + + user << "You remove the [src.cell]." + src.cell = null + updateicon() + return + + //TODO use a UI like the air tanks + if(on) + turn_off() + else + turn_on() + if (on) + user << "You switch on the [src]." + +/obj/item/device/suit_cooling_unit/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/screwdriver)) + if(cover_open) + cover_open = 0 + user << "You screw the panel into place." + else + cover_open = 1 + user << "You unscrew the panel." + updateicon() + return + + if (istype(W, /obj/item/weapon/cell)) + if(cover_open) + if(cell) + user << "There is a [cell] already installed here." + else + user.drop_item() + W.loc = src + cell = W + user << "You insert the [cell]." + updateicon() + return + + return ..() + +/obj/item/device/suit_cooling_unit/proc/updateicon() + if (cover_open) + if (cell) + icon_state = "suitcooler1" + else + icon_state = "suitcooler2" + else + icon_state = "suitcooler0" + +/obj/item/device/suit_cooling_unit/examine() + set src in view(1) + + ..() + + if (on) + if (attached_to_suit(src.loc)) + usr << "It's switched on and running." + else + usr << "It's switched on, but not attached to anything." + else + usr << "It is switched off." + + if (cover_open) + if(cell) + usr << "The panel is open, exposing the [cell]." + else + usr << "The panel is open." + + if (cell) + usr << "The charge meter reads [round(cell.percent())]%." + else + usr << "It doesn't have a power cell installed." \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index d96fc888..bfc965f9 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -2,11 +2,18 @@ name = "clothing" var/list/species_restricted = null //Only these species can wear this kit. var/gsr = 0 + /* + Sprites used when the clothing item is refit. This is done by setting icon_override. + For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. + Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits), + while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. vox wearing jumpsuits). + */ + var/list/sprite_sheets_refit = null //BS12: Species-restricted clothing check. /obj/item/clothing/mob_can_equip(M as mob, slot) - //if we can equip the item anyway, don't bother with species_restricted (aslo cuts down on spam) + //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) if (!..()) return 0 @@ -33,6 +40,46 @@ return 1 +/obj/item/clothing/proc/refit_for_species(var/target_species) + //Set species_restricted list + switch(target_species) + if("Human", "Skrell") //humanoid bodytypes + species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + icon_override = sprite_sheets_refit[target_species] + else + icon_override = initial(icon_override) + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +/obj/item/clothing/head/helmet/refit_for_species(var/target_species) + //Set species_restricted list + switch(target_species) + if("Skrell") + species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") + if("Human") + species_restricted = list("exclude","Skrell","Unathi","Tajaran","Diona","Vox") + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + icon_override = sprite_sheets_refit[target_species] + else + icon_override = initial(icon_override) + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + //Ears: headsets, earmuffs and tiny objects /obj/item/clothing/ears name = "ears" @@ -105,7 +152,7 @@ var/vision_flags = 0 var/darkness_view = 0//Base human is 2 var/invisa_view = 0 - + sprite_sheets = list("Vox" = 'icons/mob/species/vox/eyes.dmi') /* SEE_SELF // can see self, no matter what SEE_MOBS // can see all mobs, no matter what @@ -131,6 +178,7 @@ BLIND // can't see anything slot_flags = SLOT_GLOVES attack_verb = list("challenged") species_restricted = list("exclude","Unathi","Tajaran") + sprite_sheets = list("Vox" = 'icons/mob/species/vox/gloves.dmi') /obj/item/clothing/gloves/examine() set src in usr @@ -151,6 +199,24 @@ BLIND // can't see anything /obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) return 0 // return 1 to cancel attack_hand() +/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel)) + if (clipped) + user << "The [src] have already been clipped!" + update_icon() + return + + playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + user.visible_message("\red [user] cuts the fingertips off of the [src].","\red You cut the fingertips off of the [src].") + + clipped = 1 + name = "mangled [name]" + desc = "[desc]
They have had the fingertips cut off of them." + if("exclude" in species_restricted) + species_restricted -= "Unathi" + species_restricted -= "Tajaran" + return + //Head /obj/item/clothing/head name = "head" @@ -159,13 +225,16 @@ BLIND // can't see anything slot_flags = SLOT_HEAD w_class = 2.0 - //Mask /obj/item/clothing/mask name = "mask" icon = 'icons/obj/clothing/masks.dmi' body_parts_covered = HEAD slot_flags = SLOT_MASK +// body_parts_covered = FACE|EYES + sprite_sheets = list("Vox" = 'icons/mob/species/vox/masks.dmi') + +/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) //Shoes /obj/item/clothing/shoes @@ -180,6 +249,8 @@ BLIND // can't see anything permeability_coefficient = 0.50 slowdown = SHOES_SLOWDOWN species_restricted = list("exclude","Unathi","Tajaran") + sprite_sheets = list("Vox" = 'icons/mob/species/vox/shoes.dmi') + /obj/item/proc/negates_gravity() return 0 @@ -190,6 +261,7 @@ BLIND // can't see anything name = "suit" var/fire_resist = T0C+100 flags = FPRINT | TABLEPASS + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS allowed = list(/obj/item/weapon/tank/emergency_oxygen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) slot_flags = SLOT_OCLOTHING @@ -209,6 +281,7 @@ BLIND // can't see anything permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE +// body_parts_covered = HEAD|FACE|EYES cold_protection = HEAD min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE siemens_coefficient = 0.9 @@ -224,7 +297,7 @@ BLIND // can't see anything permeability_coefficient = 0.02 flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE | THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit) slowdown = 3 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL @@ -233,6 +306,37 @@ BLIND // can't see anything siemens_coefficient = 0.9 species_restricted = list("exclude","Diona","Vox") + var/list/supporting_limbs //If not-null, automatically splints breaks. Checked when removing the suit. + +/obj/item/clothing/suit/space/equipped(mob/M) + check_limb_support() + ..() + +/obj/item/clothing/suit/space/dropped() + check_limb_support() + ..() + +// Some space suits are equipped with reactive membranes that support +// broken limbs - at the time of writing, only the ninja suit, but +// I can see it being useful for other suits as we expand them. ~ Z +// The actual splinting occurs in /datum/organ/external/proc/fracture() +/obj/item/clothing/suit/space/proc/check_limb_support() + + // If this isn't set, then we don't need to care. + if(!supporting_limbs || !supporting_limbs.len) + return + + var/mob/living/carbon/human/H = src.loc + + // If the holder isn't human, or the holder IS and is wearing the suit, it keeps supporting the limbs. + if(!istype(H) || H.wear_suit == src) + return + + // Otherwise, remove the splints. + for(var/datum/organ/external/E in supporting_limbs) + E.status &= ~ ORGAN_SPLINTED + supporting_limbs = list() + //Under clothing /obj/item/clothing/under icon = 'icons/obj/clothing/uniforms.dmi' @@ -255,6 +359,7 @@ BLIND // can't see anything var/rolled_down = 0 var/rolled_sleeves = 0 var/basecolor + sprite_sheets = list("Vox" = 'icons/mob/species/vox/uniform.dmi') /obj/item/clothing/under/attackby(obj/item/I, mob/user) if(hastie) @@ -279,6 +384,10 @@ BLIND // can't see anything if(hastie && src.loc == user) hastie.attack_hand(user) return + + if ((ishuman(usr) || ismonkey(usr)) && src.loc == user) //make it harder to accidentally undress yourself + return + ..() //This is to ensure people can take off suits when there is an attached accessory @@ -375,6 +484,7 @@ BLIND // can't see anything if(copytext(item_color,-2) != "_d" && rolled_sleeves == 0) basecolor = item_color if(basecolor + "_d_s" in icon_states('icons/mob/uniform.dmi')) + body_parts_covered = "[basecolor]" ? LEGS|LOWER_TORSO : UPPER_TORSO|LOWER_TORSO|LEGS|ARMS item_color = item_color == "[basecolor]" ? "[basecolor]_d" : "[basecolor]" usr.update_inv_w_uniform() if(rolled_down) @@ -435,4 +545,8 @@ BLIND // can't see anything sensor_mode = pick(0,1,2,3) ..() +/obj/item/clothing/under/emp_act(severity) + if (hastie) + hastie.emp_act(severity) + ..() diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm new file mode 100644 index 00000000..19f79556 --- /dev/null +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -0,0 +1,221 @@ +//A 'wound' system for space suits. +//Breaches greatly increase the amount of lost gas and decrease the armour rating of the suit. +//They can be healed with plastic or metal sheeting. + +/datum/breach + var/class = 0 // Size. Lower is smaller. + var/descriptor // 'gaping hole' etc. + var/damtype = BURN // Punctured or melted + var/obj/item/clothing/suit/space/holder // Suit containing the list of breaches holding this instance. + +/obj/item/clothing/suit/space + + var/can_breach = 1 // Set to 0 to disregard all breaching. + var/list/breaches = list() // Breach datum container. + var/resilience = 0.2 // Multiplier that turns damage into breach class. 1 is 100% of damage to breach, 0.1 is 10%. + var/breach_threshold = 3 // Min damage before a breach is possible. + var/damage = 0 // Current total damage + var/brute_damage = 0 // Specifically brute damage. + var/burn_damage = 0 // Specifically burn damage. + var/base_name // Used to keep the original name safe while we apply modifiers. + +/obj/item/clothing/suit/space/New() + ..() + base_name = "[name]" + +//Some simple descriptors for breaches. Global because lazy, TODO: work out a better way to do this. + +var/global/list/breach_brute_descriptors = list( + "tiny puncture", + "ragged tear", + "large split", + "huge tear", + "gaping wound" + ) + +var/global/list/breach_burn_descriptors = list( + "small burn", + "melted patch", + "sizable burn", + "large scorched area", + "huge scorched area" + ) + +/datum/breach/proc/update_descriptor() + + //Sanity... + class = max(1,min(class,5)) + //Apply the correct descriptor. + if(damtype == BURN) + descriptor = breach_burn_descriptors[class] + else if(damtype == BRUTE) + descriptor = breach_brute_descriptors[class] + +//Repair a certain amount of brute or burn damage to the suit. +/obj/item/clothing/suit/space/proc/repair_breaches(var/damtype, var/amount, var/mob/user) + + if(!can_breach || !breaches || !breaches.len || !damage) + user << "There are no breaches to repair on \the [src]." + return + + var/list/valid_breaches = list() + + for(var/datum/breach/B in breaches) + if(B.damtype == damtype) + valid_breaches += B + + if(!valid_breaches.len) + user << "There are no breaches to repair on \the [src]." + return + + var/amount_left = amount + for(var/datum/breach/B in valid_breaches) + if(!amount_left) break + + if(B.class <= amount_left) + amount_left -= B.class + valid_breaches -= B + breaches -= B + else + B.class -= amount_left + amount_left = 0 + B.update_descriptor() + + user.visible_message("[user] patches some of the damage on \the [src].") + calc_breach_damage() + +/obj/item/clothing/suit/space/proc/create_breaches(var/damtype, var/amount) + + if(!can_breach || !amount) + return + + if(!breaches) + breaches = list() + + if(damage > 25) return //We don't need to keep tracking it when it's at 250% pressure loss, really. + + if(!loc) return + var/turf/T = get_turf(src) + if(!T) return + + amount = amount * src.resilience + + //Increase existing breaches. + for(var/datum/breach/existing in breaches) + + if(existing.damtype != damtype) + continue + + if (existing.class < 5) + var/needs = 5 - existing.class + if(amount < needs) + existing.class += amount + amount = 0 + else + existing.class = 5 + amount -= needs + + if(existing.damtype == BRUTE) + T.visible_message("\The [existing.descriptor] on [src] gapes wider!") + else if(existing.damtype == BURN) + T.visible_message("\The [existing.descriptor] on [src] widens!") + + if (amount) + //Spawn a new breach. + var/datum/breach/B = new() + breaches += B + + B.class = min(amount,5) + + B.damtype = damtype + B.update_descriptor() + B.holder = src + + if(B.damtype == BRUTE) + T.visible_message("\A [B.descriptor] opens up on [src]!") + else if(B.damtype == BURN) + T.visible_message("\A [B.descriptor] marks the surface of [src]!") + + calc_breach_damage() + +//Calculates the current extent of the damage to the suit. +/obj/item/clothing/suit/space/proc/calc_breach_damage() + + damage = 0 + brute_damage = 0 + burn_damage = 0 + + if(!can_breach || !breaches || !breaches.len) + name = base_name + return 0 + + for(var/datum/breach/B in breaches) + if(!B.class) + src.breaches -= B + del(B) + else + damage += B.class + if(B.damtype == BRUTE) + brute_damage += B.class + else if(B.damtype == BURN) + burn_damage += B.class + + if(damage >= 3) + if(brute_damage >= 3 && brute_damage > burn_damage) + name = "punctured [base_name]" + else if(burn_damage >= 3 && burn_damage > brute_damage) + name = "scorched [base_name]" + else + name = "damaged [base_name]" + else + name = "[base_name]" + + return damage + +//Handles repairs (and also upgrades). + +/obj/item/clothing/suit/space/attackby(obj/item/W as obj, mob/user as mob) + if(istype(W,/obj/item/stack/sheet/mineral/plastic) || istype(W,/obj/item/stack/sheet/metal)) + + if(istype(src.loc,/mob/living)) + user << "\red How do you intend to patch a hardsuit while someone is wearing it?" + return + + if(!damage || !burn_damage) + user << "There is no surface damage on \the [src] to repair." + return + + var/obj/item/stack/sheet/P = W + if(P.amount < 3) + P.use(P.amount) + repair_breaches(BURN, ( istype(P,/obj/item/stack/sheet/mineral/plastic) ? P.amount : (P.amount*2) ), user) + else + P.use(3) + repair_breaches(BURN, ( istype(P,/obj/item/stack/sheet/mineral/plastic) ? 3 : 5), user) + return + + else if(istype(W, /obj/item/weapon/weldingtool)) + + if(istype(src.loc,/mob/living)) + user << "\red How do you intend to patch a hardsuit while someone is wearing it?" + return + + if (!damage || ! brute_damage) + user << "There is no structural damage on \the [src] to repair." + return + + var/obj/item/weapon/weldingtool/WT = W + if(!WT.remove_fuel(5)) + user << "\red You need more welding fuel to repair this suit." + return + + repair_breaches(BRUTE, 3, user) + return + + ..() + +/obj/item/clothing/suit/space/examine() + ..() + if(can_breach && breaches && breaches.len) + for(var/datum/breach/B in breaches) + usr << "\red It has \a [B.descriptor]." \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index ef73f239..40fe6bb7 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -1,10 +1,10 @@ //Regular rig suits /obj/item/clothing/head/helmet/space/rig - name = "engineering hardsuit helmet" - desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." + name = "hardsuit helmet" + desc = "A special helmet designed for work in a hazardous, low-pressure environment." icon_state = "rig0-engineering" item_state = "eng_helm" - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) + armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20) allowed = list(/obj/item/device/flashlight) var/brightness_on = 4 //luminosity when on var/on = 0 @@ -12,7 +12,19 @@ icon_action_button = "action_hardhat" heat_protection = HEAD max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE + + //Species-specific stuff. species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox") + sprite_sheets_refit = list( + "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', + "Skrell" = 'icons/mob/species/skrell/helmet.dmi', + ) + sprite_sheets_obj = list( + "Unathi" = 'icons/obj/clothing/species/unathi/hats.dmi', + "Tajaran" = 'icons/obj/clothing/species/tajaran/hats.dmi', + "Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi', + ) attack_self(mob/user) if(!isturf(user.loc)) @@ -42,31 +54,288 @@ SetLuminosity(brightness_on) /obj/item/clothing/suit/space/rig + name = "hardsuit" + desc = "A special space suit for environments that might pose hazards beyond just the vacuum of space. Provides more protection than a standard space suit." + icon_state = "rig-engineering" + item_state = "eng_hardsuit" + slowdown = 1 + armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit) + heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE + + species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") + sprite_sheets_refit = list( + "Unathi" = 'icons/mob/species/unathi/suit.dmi', + "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', + "Skrell" = 'icons/mob/species/skrell/suit.dmi', + ) + sprite_sheets_obj = list( + "Unathi" = 'icons/obj/clothing/species/unathi/suits.dmi', + "Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi', + "Skrell" = 'icons/obj/clothing/species/skrell/suits.dmi', + ) + + //Breach thresholds, should ideally be inherited by most (if not all) hardsuits. + breach_threshold = 18 + can_breach = 1 + + //Component/device holders. + var/obj/item/weapon/stock_parts/gloves = null // Basic capacitor allows insulation, upgrades allow shock gloves etc. + + var/attached_boots = 1 // Can't wear boots if some are attached + var/obj/item/clothing/shoes/magboots/boots = null // Deployable boots, if any. + var/attached_helmet = 1 // Can't wear a helmet if one is deployable. + var/obj/item/clothing/head/helmet/helmet = null // Deployable helmet, if any. + + var/list/max_mounted_devices = 0 // Maximum devices. Easy. + var/list/can_mount = null // Types of device that can be hardpoint mounted. + var/list/mounted_devices = null // Holder for the above device. + var/obj/item/active_device = null // Currently deployed device, if any. + +/obj/item/clothing/suit/space/rig/equipped(mob/M) + ..() + + var/mob/living/carbon/human/H = M + + if(!istype(H)) return + + if(H.wear_suit != src) + return + + if(attached_helmet && helmet) + if(H.head) + M << "You are unable to deploy your suit's helmet as \the [H.head] is in the way." + else + M << "Your suit's helmet deploys with a hiss." + //TODO: Species check, skull damage for forcing an unfitting helmet on? + helmet.loc = H + H.equip_to_slot(helmet, slot_head) + helmet.canremove = 0 + + if(attached_boots && boots) + if(H.shoes) + M << "You are unable to deploy your suit's magboots as \the [H.shoes] are in the way." + else + M << "Your suit's boots deploy with a hiss." + boots.loc = H + H.equip_to_slot(boots, slot_shoes) + boots.canremove = 0 + +/obj/item/clothing/suit/space/rig/dropped() + ..() + + var/mob/living/carbon/human/H + + if(helmet) + H = helmet.loc + if(istype(H)) + if(helmet && H.head == helmet) + helmet.canremove = 1 + H.drop_from_inventory(helmet) + helmet.loc = src + + if(boots) + H = boots.loc + if(istype(H)) + if(boots && H.shoes == boots) + boots.canremove = 1 + H.drop_from_inventory(boots) + boots.loc = src + +/* +/obj/item/clothing/suit/space/rig/verb/get_mounted_device() + + set name = "Deploy Mounted Device" + set category = "Object" + set src in usr + + if(!can_mount) + verbs -= /obj/item/clothing/suit/space/rig/verb/get_mounted_device + verbs -= /obj/item/clothing/suit/space/rig/verb/stow_mounted_device + return + + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + if(active_device) + usr << "You already have \the [active_device] deployed." + return + + if(!mounted_devices.len) + usr << "You do not have any devices mounted on \the [src]." + return + +/obj/item/clothing/suit/space/rig/verb/stow_mounted_device() + + set name = "Stow Mounted Device" + set category = "Object" + set src in usr + + if(!can_mount) + verbs -= /obj/item/clothing/suit/space/rig/verb/get_mounted_device + verbs -= /obj/item/clothing/suit/space/rig/verb/stow_mounted_device + return + + if(!istype(usr, /mob/living)) return + + if(usr.stat) return + + if(!active_device) + usr << "You have no device currently deployed." + return +*/ + +/obj/item/clothing/suit/space/rig/verb/toggle_helmet() + + set name = "Toggle Helmet" + set category = "Object" + set src in usr + + if(!istype(src.loc,/mob/living)) return + + if(!helmet) + usr << "There is no helmet installed." + return + + var/mob/living/carbon/human/H = usr + + if(!istype(H)) return + if(H.stat) return + if(H.wear_suit != src) return + + if(H.head == helmet) + helmet.canremove = 1 + H.drop_from_inventory(helmet) + helmet.loc = src + H << "\blue You retract your hardsuit helmet." + else + if(H.head) + H << "\red You cannot deploy your helmet while wearing another helmet." + return + //TODO: Species check, skull damage for forcing an unfitting helmet on? + helmet.loc = H + H.equip_to_slot(helmet, slot_head) + helmet.canremove = 0 + H << "\blue You deploy your hardsuit helmet, sealing you off from the world." + +/obj/item/clothing/suit/space/rig/attackby(obj/item/W as obj, mob/user as mob) + + if(!istype(user,/mob/living)) return + + if(user.a_intent == "help") + + if(istype(src.loc,/mob/living)) + user << "How do you propose to modify a hardsuit while it is being worn?" + return + + var/target_zone = user.zone_sel.selecting + + if(target_zone == "head") + + //Installing a component into or modifying the contents of the helmet. + if(!attached_helmet) + user << "\The [src] does not have a helmet mount." + return + + if(istype(W,/obj/item/weapon/screwdriver)) + if(!helmet) + user << "\The [src] does not have a helmet installed." + else + user << "You detatch \the [helmet] from \the [src]'s helmet mount." + helmet.loc = get_turf(src) + src.helmet = null + return + else if(istype(W,/obj/item/clothing/head/helmet/space)) + if(helmet) + user << "\The [src] already has a helmet installed." + else + user << "You attach \the [W] to \the [src]'s helmet mount." + user.drop_item() + W.loc = src + src.helmet = W + return + else + return ..() + + else if(target_zone == "l_leg" || target_zone == "r_leg" || target_zone == "l_foot" || target_zone == "r_foot") + + //Installing a component into or modifying the contents of the feet. + if(!attached_boots) + user << "\The [src] does not have boot mounts." + return + + if(istype(W,/obj/item/weapon/screwdriver)) + if(!boots) + user << "\The [src] does not have any boots installed." + else + user << "You detatch \the [boots] from \the [src]'s boot mounts." + boots.loc = get_turf(src) + boots = null + return + else if(istype(W,/obj/item/clothing/shoes/magboots)) + if(boots) + user << "\The [src] already has magboots installed." + else + user << "You attach \the [W] to \the [src]'s boot mounts." + user.drop_item() + W.loc = src + boots = W + else + return ..() + + /* + else if(target_zone == "l_arm" || target_zone == "r_arm" || target_zone == "l_hand" || target_zone == "r_hand") + + //Installing a component into or modifying the contents of the hands. + + else if(target_zone == "torso" || target_zone == "groin") + + //Modifying the cell or mounted devices + + if(!mounted_devices) + return + */ + + else //wat + return ..() + + ..() + +//Engineering rig +/obj/item/clothing/head/helmet/space/rig/engineering + name = "engineering hardsuit helmet" + desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." + icon_state = "rig0-engineering" + item_state = "eng_helm" + armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) + +/obj/item/clothing/suit/space/rig/engineering name = "engineering hardsuit" desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding." icon_state = "rig-engineering" item_state = "eng_hardsuit" slowdown = 1 armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) - heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE - species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) //Chief Engineer's rig -/obj/item/clothing/head/helmet/space/rig/elite +/obj/item/clothing/head/helmet/space/rig/engineering/chief name = "advanced hardsuit helmet" desc = "An advanced helmet designed for work in a hazardous, low pressure environment. Shines with a high polish." icon_state = "rig0-white" item_state = "ce_helm" item_color = "white" + sprite_sheets_refit = null + sprite_sheets_obj = null -/obj/item/clothing/suit/space/rig/elite +/obj/item/clothing/suit/space/rig/engineering/chief icon_state = "rig-white" name = "advanced hardsuit" desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish." item_state = "ce_hardsuit" - + sprite_sheets_refit = null + sprite_sheets_obj = null //Mining rig /obj/item/clothing/head/helmet/space/rig/mining @@ -96,6 +365,8 @@ siemens_coefficient = 0.6 var/obj/machinery/camera/camera species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox") + + /obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user) if(camera) ..(user) @@ -119,7 +390,7 @@ slowdown = 1 w_class = 3 armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60) - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs) siemens_coefficient = 0.6 species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox") @@ -134,6 +405,8 @@ unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles! armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.7 + sprite_sheets_refit = null + sprite_sheets_obj = null /obj/item/clothing/suit/space/rig/wizard icon_state = "rig-wiz" @@ -145,7 +418,8 @@ unacidable = 1 armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.7 - + sprite_sheets_refit = null + sprite_sheets_obj = null //Medical Rig /obj/item/clothing/head/helmet/space/rig/medical @@ -161,7 +435,7 @@ name = "medical hardsuit" desc = "A special suit that protects against hazardous, low pressure environments. Has minor radiation shielding." item_state = "medical_hardsuit" - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical) armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 50) //Security @@ -180,7 +454,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor." item_state = "sec_hardsuit" armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10) - allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/melee/baton) + allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton) siemens_coefficient = 0.7 diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index bf12bc27..c2a98736 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -326,6 +326,7 @@ user << "\The [src] is out of charge." add_fingerprint(user) +/* /obj/item/device/modkit/fluff/omnivac_modkit //Ornate box - Zander Moon - omnivac - SPRITE name = "ornate box" desc = "An ornate box, containing the handle of an energy blade." @@ -334,6 +335,7 @@ parts = MODKIT_HELMET from_helmet = list(/obj/item/weapon/melee) to_helmet = list(/obj/item/weapon/melee/baton/fluff/omnivac_baton) +*/ /obj/item/clothing/head/soft/fluff/nebula_cap //Black baseball cap - Roxy Wallace - nebulaflare - DONE name = "black baseball cap" @@ -734,6 +736,7 @@ icon_state = "leo_coat" item_state = "leo_coat" +/* /obj/item/device/modkit/fluff/leo_modkit //Weapon case - Leo Wyatt - keinto - DONE name = "weapon case" desc = "A sturdy leather case, with a velvet covered interior.." @@ -742,6 +745,7 @@ parts = MODKIT_HELMET from_helmet = list(/obj/item/weapon/gun/projectile/detective/semiauto) to_helmet = list(/obj/item/weapon/gun/projectile/detective/semiauto/fluff/leo_gun) +*/ /obj/item/weapon/gun/projectile/detective/semiauto/fluff/leo_gun //Instant Prosecutor - Leo Wyatt - keinto - DONE (stab) name = "\improper Instant Prosecutor" diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 9748eca3..28b42db8 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -65,13 +65,13 @@ if (organ_name in organs_by_name) var/datum/organ/external/O = get_organ(organ_name) - + if(amount > 0) O.take_damage(amount, 0, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) else //if you don't want to heal robot organs, they you will have to check that yourself before using this proc. O.heal_damage(-amount, 0, internal=0, robo_repair=(O.status & ORGAN_ROBOT)) - + hud_updateflag |= 1 << HEALTH_HUD /mob/living/carbon/human/proc/adjustFireLossByPart(var/amount, var/organ_name, var/obj/damage_source = null) @@ -80,13 +80,13 @@ if (organ_name in organs_by_name) var/datum/organ/external/O = get_organ(organ_name) - + if(amount > 0) O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) else //if you don't want to heal robot organs, they you will have to check that yourself before using this proc. O.heal_damage(0, -amount, internal=0, robo_repair=(O.status & ORGAN_ROBOT)) - + hud_updateflag |= 1 << HEALTH_HUD /mob/living/carbon/human/Stun(amount) @@ -165,6 +165,10 @@ hud_updateflag |= 1 << HEALTH_HUD updatehealth() + +/* +In most cases it makes more sense to use apply_damage() instead! And make sure to check armour if applicable. +*/ //Damages ONE external organ, organ gets randomly selected from damagable ones. //It automatically updates damage overlays if necesary //It automatically updates health status @@ -260,10 +264,20 @@ This function restores all organs. /mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null) //visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]") + + //Handle other types of damage if((damagetype != BRUTE) && (damagetype != BURN)) + if(damagetype == HALLOSS) + if ((damage > 25 && prob(20)) || (damage > 50 && prob(60))) + emote("scream") + + ..(damage, damagetype, def_zone, blocked) return 1 + //Handle BRUTE and BURN damage + handle_suit_punctures(damagetype, damage) + if(blocked >= 2) return 0 var/datum/organ/external/organ = null diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 8130627d..7e816ac1 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -27,6 +27,7 @@ emp_act */ // END TASER NERF + //Laserproof armour if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/armor/laserproof)) if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) var/reflectchance = 40 - round(P.damage/3) @@ -189,6 +190,7 @@ emp_act ..() +//Returns 1 if the attack hit, 0 if it missed. /mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) if(!I || !user) return 0 @@ -296,3 +298,14 @@ emp_act if(w_uniform) w_uniform.add_blood(source) update_inv_w_uniform(0) + +/mob/living/carbon/human/proc/handle_suit_punctures(var/damtype, var/damage) + + if(!wear_suit) return + if(!istype(wear_suit,/obj/item/clothing/suit/space)) return + if(damtype != BURN && damtype != BRUTE) return + + var/obj/item/clothing/suit/space/SS = wear_suit + var/penetrated_dam = max(0,(damage - SS.breach_threshold)) // - SS.damage)) - Consider uncommenting this if suits seem too hardy on dev. + + if(penetrated_dam) SS.create_breaches(damtype, penetrated_dam) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 4d4a080a..f547a875 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -135,23 +135,54 @@ if(mind && mind.vampire) handle_vampire() +// Calculate how vulnerable the human is to under- and overpressure. +// Returns 0 (equals 0 %) if sealed in an undamaged suit, 1 if unprotected (equals 100%). +// Suitdamage can modifiy this in 10% steps. +/mob/living/carbon/human/proc/get_pressure_weakness() + + var/pressure_adjustment_coefficient = 1 // Assume no protection at first. + + if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE) && head && (head.flags & STOPSPRESSUREDMAGE)) // Complete set of pressure-proof suit worn, assume fully sealed. + pressure_adjustment_coefficient = 0 + + // Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure protection. + if(istype(wear_suit,/obj/item/clothing/suit/space)) + var/obj/item/clothing/suit/space/S = wear_suit + if(S.can_breach && S.damage) + pressure_adjustment_coefficient += S.damage * 0.1 + + pressure_adjustment_coefficient = min(1,max(pressure_adjustment_coefficient,0)) // So it isn't less than 0 or larger than 1. + + return pressure_adjustment_coefficient + +// Calculate how much of the enviroment pressure-difference affects the human. /mob/living/carbon/human/calculate_affecting_pressure(var/pressure) - ..() - var/pressure_difference = abs( pressure - ONE_ATMOSPHERE ) + var/pressure_difference + + // First get the absolute pressure difference. + if(pressure < ONE_ATMOSPHERE) // We are in an underpressure. + pressure_difference = ONE_ATMOSPHERE - pressure + + else //We are in an overpressure or standard atmosphere. + pressure_difference = pressure - ONE_ATMOSPHERE + + if(pressure_difference < 5) // If the difference is small, don't bother calculating the fraction. + pressure_difference = 0 - var/pressure_adjustment_coefficient = 1 //Determins how much the clothing you are wearing protects you in percent. - if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE)) - pressure_adjustment_coefficient -= PRESSURE_SUIT_REDUCTION_COEFFICIENT - if(head && (head.flags & STOPSPRESSUREDMAGE)) - pressure_adjustment_coefficient -= PRESSURE_HEAD_REDUCTION_COEFFICIENT - pressure_adjustment_coefficient = max(pressure_adjustment_coefficient,0) //So it isn't less than 0 - pressure_difference = pressure_difference * pressure_adjustment_coefficient - if(pressure > ONE_ATMOSPHERE) - return ONE_ATMOSPHERE + pressure_difference else + // Otherwise calculate how much of that absolute pressure difference affects us, can be 0 to 1 (equals 0% to 100%). + // This is our relative difference. + pressure_difference *= get_pressure_weakness() + + // The difference is always positive to avoid extra calculations. + // Apply the relative difference on a standard atmosphere to get the final result. + // The return value will be the adjusted_pressure of the human that is the basis of pressure warnings and damage. + if(pressure < ONE_ATMOSPHERE) return ONE_ATMOSPHERE - pressure_difference + else + return ONE_ATMOSPHERE + pressure_difference /mob/living/carbon/human proc/handle_disabilities() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index b2442020..42a0db50 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -961,14 +961,14 @@ /obj/machinery/power/apc/Topic(href, href_list, var/usingUI = 1) if(!(isrobot(usr) && (href_list["apcwires"] || href_list["pulse"]))) if(!can_use(usr, 1)) - return + return 0 src.add_fingerprint(usr) if (href_list["apcwires"]) var/t1 = text2num(href_list["apcwires"]) if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) usr << "You need wirecutters!" - return + return 0 if (src.isWireColorCut(t1)) src.mend(t1) else @@ -977,10 +977,10 @@ var/t1 = text2num(href_list["pulse"]) if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) usr << "You need a multitool!" - return + return 0 if (src.isWireColorCut(t1)) usr << "You can't pulse a cut wire." - return + return 0 else src.pulse(t1) else if (href_list["lock"]) @@ -1027,11 +1027,11 @@ else if( href_list["close"] ) nanomanager.close_user_uis(usr, src) - return + return 0 else if (href_list["close2"]) usr << browse(null, "window=apcwires") - return + return 0 else if (href_list["overload"]) if( istype(usr, /mob/living/silicon) && !src.aidisabled ) @@ -1042,7 +1042,7 @@ if( istype(malfai, /mob/living/silicon/ai) && !src.aidisabled ) if (malfai.malfhacking) malfai << "You are already hacking an APC." - return + return 0 malfai << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process." malfai.malfhack = src malfai.malfhacking = 1 @@ -1071,7 +1071,7 @@ if(usingUI) src.updateDialog() - return + return 1 /*/obj/machinery/power/apc/proc/malfoccupy(var/mob/living/silicon/ai/malf) if(!istype(malf)) @@ -1425,17 +1425,4 @@ malfvacate(1)*/ ..() -/obj/machinery/power/apc/proc/shock(mob/user, prb) - if(!prob(prb)) - return 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - if(isalien(user)) - return 0 - if (electrocute_mob(user, src, src)) - return 1 - else - return 0 - #undef APC_UPDATE_ICON_COOLDOWN diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 61c715ec..e6aa55f2 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -50,7 +50,7 @@ -/obj/machinery/containment_field/proc/shock(mob/living/user as mob) +/obj/machinery/containment_field/shock(mob/living/user as mob) if(hasShocked) return 0 if(!FG1 || !FG2) @@ -63,17 +63,8 @@ hasShocked = 1 var/shock_damage = min(rand(30,40),rand(30,40)) - user.burn_skin(shock_damage) - user.updatehealth() - user.visible_message("\red [user.name] was shocked by the [src.name]!", \ - "\red You feel a powerful shock course through your body sending you flying!", \ - "\red You hear a heavy electrical crack") + user.electrocute_act(shock_damage, src) - var/stun = min(shock_damage, 15) - user.Stun(stun) - user.Weaken(10) - - user.updatehealth() var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) user.throw_at(target, 200, 4) diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 9ff75a7d..6d6e0d97 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -36,20 +36,6 @@ src.disable_wire = pick(w) w -= src.disable_wire -/obj/machinery/r_n_d/proc/ - shock(mob/user, prb) - if(stat & (BROKEN|NOPOWER)) // unpowered, no shock - return 0 - if(!prob(prb)) - return 0 - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - if (electrocute_mob(user, get_area(src), src, 0.7)) - return 1 - else - return 0 - /obj/machinery/r_n_d/attack_hand(mob/user as mob) if (shocked) shock(user,50) diff --git a/icons/mob/species/vox/eyes.dmi b/icons/mob/species/vox/eyes.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6e15b3e58c4a140c074d08679cd577e8ab50cc37 GIT binary patch literal 3407 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 literal 0 HcmV?d00001 diff --git a/icons/mob/species/vox/gloves.dmi b/icons/mob/species/vox/gloves.dmi index bf57b968ca60043b6136315b6aa922acef3900c9..16b4706c4a7910e44023a458aa92d613d46ee766 100644 GIT binary patch literal 9452 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 EA7EA*zyJUM literal 358 zcmV-s0h#`ZP)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+Jtw~`wOF?-ze0(NGbOXA7^IVnGp#5wHxYE64FKJx94OA*yc+-j z0EbCLK~zYI?UYLnfFKM+r-|$On&_a9I)Yy3JVOjD>bTQAwl6#cIc|H@Fx#<1W)K5ja#ll(c@9XlHK$9UA za5@lVz>7J!d=l-8T|iD{xDSwCZBxtf-Y>O`!@!qy0d{>0imw1wFaQ7m07*qoM6N<$ Ef)DGH761SM diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi index 7149efa9d50535f20580c6ed495bbe98513c6b92..d0097e8d00d1f31c0cf66f571a1328a81c0a9966 100644 GIT binary patch delta 3298 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 JR9tb3{tqOSbV~pL literal 1997 zcmb7FdpOho9{+BWxrWjiGxy1`vv^b%vN5+&CRUbyZYiQ+E-?~v&8@j~a!Kje<%<_lw2m;H1gXz&-r!!JJ0#&^?rTc@8|P=zuvFs`8=OoPY)Mm1-JqL z0LnyHM=t;XNhk=AgGj>3S_)Yb@;vvEoj4p03Wd@zH^*QwC|5i{qXFgRz{{7eB9Zp4 zoq(q&u(*hEb-_|7cs!m$p;-I+I@sIqw^B#zDeXn8hPfjWee_IBOb`f!q@}*TK1y2= zi^XOc8r?)=UH}jun1&xg!^z1hLR)7AkfDM{BooaeeT)w~J6}!F?jJn*=`%L%xO(Y@ z%AU0;sm3@j4{refaX3VBs7xYL;vA312FHZa;=-aL0f1iReTWuwO8Cv2wzM*3>i&1r zp6*_6=0Wp*%LyL3cb`co5K~ad##(w=4qCeDRq;yNOUQcOf1ukOtoAgZ8uTpo9L&wP zG-|x9aic8X@-E84YFqnmnehF@*ThcHrdpS{k=IY0|0I)yFFaujJW}TtUJ-so=mU$dO1IS1gn}IfeB;ncknR^>;Ng< zhu->qVIxV*C}`}sI7JRYYHw!djoSw&fgCMUHF zWjx`M2G#u65w6J)Wl)P8)U~`xb4Tb&d2c^y0u5QlHJ`6vTc5!AWQm7Y6P5 z>htlspn({^b{IZh@WRT9|2KhN%jGw2k*PXucU_E|o*4D9s&6Eiw5DF-4K8qADYPTf zpx1)pPO}O`HMeutUBMT=8h0uQj28nx!Wg)5cJHNLd#G2!U8C83Jc)_7)piEIl*SYk>vVGc zTq+;3ZNm7dg%MDf;AAvTEc!9mQ#M<%RcXXdKU38~?%x2*i9h4dZB3Dal-Y?Pm=@es zOrNm6m(ZUWQD@qlumY_@h&Bms`OFB+mgiIgQvoq#SXb5lkzIX6K#LUGBvAcV&&;BH z!q1vC9Ux`Z>!3Lm&v})Jh5y{<`~U<{CJz7Ve~ZDdZoqE87P5AHytEGb2jrIk=l@Fp zY)sd)Y)1Tc#xJpTRSdZUK64*;b@%w7-M-wrv0|Sglys?|vNHSYdQWnF>Lu__3dXiW;ueya?YTeTdj%3AToue}=6q|<+UN@S$I#pniW7KsjhSxMSe6d#y?`URy7I%+m~Ou)_&}CgE;8`+c+p$CF8-_SaxTKY2Zg23+Ef1eXL9FtOisOHpJK(TGq51i7B42)#C;t$NN+u)IV{@G2Cr_9e; zJyM(p%uZ`)**+$0fvrb2QFS0C6wNY(Osj9;5YsV`(GdJA;W6#b2SfB7mx=t zL!!V-)l)S^k2xa_Au-L$te(UKMiE!9{cT{iy3RHXq*zpgeaIt??miI!Zs@=T%`1mg z^ksPD*p81NROGSKceMNnpCe1KhD+#TZp8e-Nkrj8Q6B1h+9zgSaZNkVzAu~qp*3{+ z!n0~Y=~b=W&1WjC@wG=LU+x;#Pl)9Yw{7D8p6ws>zA*&}(&mS6z9M|=U27}1*#<;> zcVH>+dV6K!35KKNhOvQ3(u`rje?46*nrN4=ZFq7p;W}D{lyh&cMg~W^dqRce(MJ;6 zc&DUdRHm1OMPIQKr7JZv83A@HpA78QozJ?uwy2%IF>)d_HH3X=U-ziB*?G ztYm5qWUc*(tG^q(ihG+ihCSa`E#y@L3(kix9B+8!BKM;4KmPOt0zp{?$s#8o}d{q8Ryy})|-NvDA V>;U0dpjiL_ diff --git a/icons/mob/species/vox/masks.dmi b/icons/mob/species/vox/masks.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8f426fa29926a5aec9c01ebe62ad64cb725ef35f GIT binary patch literal 11864 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 literal 0 HcmV?d00001 diff --git a/icons/mob/species/vox/shoes.dmi b/icons/mob/species/vox/shoes.dmi new file mode 100644 index 0000000000000000000000000000000000000000..822174fbd42a6cc13db50a7e8488042d35ec0c43 GIT binary patch literal 1592 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 literal 3171 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 JPDHLkV1kS5^CSQO diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi new file mode 100644 index 0000000000000000000000000000000000000000..69376d1955e01da23224767680086527fa483b94 GIT binary patch literal 47559 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 literal 0 HcmV?d00001