From 84271962fefb030837be5d79612db10a85af33ad Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Thu, 26 Dec 2019 05:04:41 -0600 Subject: [PATCH 1/9] Internals activation QoL tweak --- .../game/objects/items/weapons/tanks/tanks.dm | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index f85af5c093d..dc08f65788b 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -43,35 +43,31 @@ /obj/item/tank/proc/toggle_internals(mob/user, silent = FALSE) var/mob/living/carbon/C = user if(!istype(C)) - return 0 + return FALSE if(C.internal == src) to_chat(C, "You close \the [src] valve.") C.internal = null else - var/can_open_valve = 0 - if(C.get_organ_slot("breathing_tube")) - can_open_valve = 1 - else if(C.wear_mask && C.wear_mask.flags & AIRTIGHT) - can_open_valve = 1 - else if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(H.head && H.head.flags & AIRTIGHT) - can_open_valve = 1 + if(!C.get_organ_slot("breathing_tube")) // Breathing tubes can always use internals, if they have one, skip ahead and turn internals on/off + if(!C.wear_mask) // Do we have a mask equipped? + return FALSE - if(can_open_valve) + var/obj/item/clothing/mask/M = C.wear_mask + // If the "mask" isn't actually a mask OR That mask isn't internals compatible AND Their headgear isn't internals compatible + if(!istype(M) || (!(initial(M.flags) & AIRTIGHT) && !(C.head.flags & AIRTIGHT))) + if(!silent) + to_chat(C, "You are not wearing a suitable mask or helmet.") + return FALSE + if(M.mask_adjusted) // If the mask is equipped but pushed down + M.adjustmask(C) // Adjust it back + + if(!silent) if(C.internal) - if(!silent) - to_chat(C, "You switch your internals to [src].") + to_chat(C, "You switch your internals to [src].") else - if(!silent) - to_chat(C, "You open \the [src] valve.") - C.internal = src - else - if(!silent) - to_chat(C, "You are not wearing a suitable mask or helmet.") - return 0 - + to_chat(C, "You open \the [src] valve.") + C.internal = src C.update_action_buttons_icon() From 5a699e5232178436c5b65805ad2ffe8f336b2de3 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Wed, 18 Mar 2020 12:06:47 -0500 Subject: [PATCH 2/9] CRLF to LF --- .../game/objects/items/weapons/tanks/tanks.dm | 576 +++++++++--------- 1 file changed, 288 insertions(+), 288 deletions(-) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index dc08f65788b..831ef1f6686 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -1,288 +1,288 @@ -#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE) - -/obj/item/tank - name = "tank" - icon = 'icons/obj/tank.dmi' - flags = CONDUCT - slot_flags = SLOT_BACK - hitsound = 'sound/weapons/smash.ogg' - w_class = WEIGHT_CLASS_NORMAL - pressure_resistance = ONE_ATMOSPHERE * 5 - force = 5.0 - throwforce = 10.0 - throw_speed = 1 - throw_range = 4 - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 30) - actions_types = list(/datum/action/item_action/set_internals) - var/datum/gas_mixture/air_contents = null - var/distribute_pressure = ONE_ATMOSPHERE - var/integrity = 3 - var/volume = 70 - -/obj/item/tank/New() - ..() - - air_contents = new /datum/gas_mixture() - air_contents.volume = volume //liters - air_contents.temperature = T20C - - START_PROCESSING(SSobj, src) - return - -/obj/item/tank/Destroy() - QDEL_NULL(air_contents) - - STOP_PROCESSING(SSobj, src) - - return ..() - - -/obj/item/tank/ui_action_click(mob/user) - toggle_internals(user) - -/obj/item/tank/proc/toggle_internals(mob/user, silent = FALSE) - var/mob/living/carbon/C = user - if(!istype(C)) - return FALSE - - if(C.internal == src) - to_chat(C, "You close \the [src] valve.") - C.internal = null - else - if(!C.get_organ_slot("breathing_tube")) // Breathing tubes can always use internals, if they have one, skip ahead and turn internals on/off - if(!C.wear_mask) // Do we have a mask equipped? - return FALSE - - var/obj/item/clothing/mask/M = C.wear_mask - // If the "mask" isn't actually a mask OR That mask isn't internals compatible AND Their headgear isn't internals compatible - if(!istype(M) || (!(initial(M.flags) & AIRTIGHT) && !(C.head.flags & AIRTIGHT))) - if(!silent) - to_chat(C, "You are not wearing a suitable mask or helmet.") - return FALSE - if(M.mask_adjusted) // If the mask is equipped but pushed down - M.adjustmask(C) // Adjust it back - - if(!silent) - if(C.internal) - to_chat(C, "You switch your internals to [src].") - else - to_chat(C, "You open \the [src] valve.") - C.internal = src - C.update_action_buttons_icon() - - -/obj/item/tank/examine(mob/user) - . = ..() - - var/obj/icon = src - if(istype(loc, /obj/item/assembly)) - icon = loc - - if(!in_range(src, user)) - if(icon == src) - . += "It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer." - return - - var/celsius_temperature = air_contents.temperature-T0C - var/descriptive - - if(celsius_temperature < 20) - descriptive = "cold" - else if(celsius_temperature < 40) - descriptive = "room temperature" - else if(celsius_temperature < 80) - descriptive = "lukewarm" - else if(celsius_temperature < 100) - descriptive = "warm" - else if(celsius_temperature < 300) - descriptive = "hot" - else - descriptive = "furiously hot" - - . += "\The [bicon(icon)][src] feels [descriptive]" - -/obj/item/tank/blob_act(obj/structure/blob/B) - if(B && B.loc == loc) - var/turf/location = get_turf(src) - if(!location) - qdel(src) - - if(air_contents) - location.assume_air(air_contents) - - qdel(src) - -/obj/item/tank/deconstruct(disassembled = TRUE) - if(!disassembled) - var/turf/T = get_turf(src) - if(T) - T.assume_air(air_contents) - air_update_turf() - playsound(src.loc, 'sound/effects/spray.ogg', 10, TRUE, -3) - qdel(src) - -/obj/item/tank/attackby(obj/item/W as obj, mob/user as mob, params) - ..() - - add_fingerprint(user) - if(istype(loc, /obj/item/assembly)) - icon = loc - - if((istype(W, /obj/item/analyzer)) && get_dist(user, src) <= 1) - atmosanalyzer_scan(air_contents, user) - - if(istype(W, /obj/item/assembly_holder)) - bomb_assemble(W,user) - -/obj/item/tank/attack_self(mob/user as mob) - if(!(air_contents)) - return - - ui_interact(user) - -/obj/item/tank/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - // update the ui if it exists, returns null if no ui is passed/found - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - // the ui does not exist, so we'll create a new() one - // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm - ui = new(user, src, ui_key, "tanks.tmpl", "Tank", 500, 300) - // open the new ui window - ui.open() - // auto update every Master Controller tick - ui.set_auto_update(1) - -/obj/item/tank/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) - var/using_internal - if(iscarbon(loc)) - var/mob/living/carbon/C = loc - if(C.internal == src) - using_internal = 1 - - var/data[0] - data["tankPressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) - data["releasePressure"] = round(distribute_pressure ? distribute_pressure : 0) - data["defaultReleasePressure"] = round(TANK_DEFAULT_RELEASE_PRESSURE) - data["maxReleasePressure"] = round(TANK_MAX_RELEASE_PRESSURE) - data["valveOpen"] = using_internal ? 1 : 0 - - data["maskConnected"] = 0 - - if(iscarbon(loc)) - var/mob/living/carbon/C = loc - if(C.internal == src) - data["maskConnected"] = 1 - else - if(C.wear_mask && (C.wear_mask.flags & AIRTIGHT)) - data["maskConnected"] = 1 - else if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(H.head && (H.head.flags & AIRTIGHT)) - data["maskConnected"] = 1 - - return data - -/obj/item/tank/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["dist_p"]) - if(href_list["dist_p"] == "reset") - distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE - else if(href_list["dist_p"] == "max") - distribute_pressure = TANK_MAX_RELEASE_PRESSURE - else - var/cp = text2num(href_list["dist_p"]) - distribute_pressure += cp - distribute_pressure = min(max(round(distribute_pressure), 0), TANK_MAX_RELEASE_PRESSURE) - - if(href_list["stat"]) - toggle_internals(usr) - - add_fingerprint(usr) - return 1 - - -/obj/item/tank/remove_air(amount) - return air_contents.remove(amount) - -/obj/item/tank/return_air() - return air_contents - -/obj/item/tank/assume_air(datum/gas_mixture/giver) - air_contents.merge(giver) - - check_status() - return 1 - -/obj/item/tank/proc/remove_air_volume(volume_to_return) - if(!air_contents) - return null - - var/tank_pressure = air_contents.return_pressure() - if(tank_pressure < distribute_pressure) - distribute_pressure = tank_pressure - - var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature) - - return remove_air(moles_needed) - -/obj/item/tank/process() - //Allow for reactions - air_contents.react() - check_status() - - -/obj/item/tank/proc/check_status() - //Handle exploding, leaking, and rupturing of the tank - - if(!air_contents) - return 0 - - var/pressure = air_contents.return_pressure() - if(pressure > TANK_FRAGMENT_PRESSURE) - if(!istype(loc,/obj/item/transfer_valve)) - message_admins("Explosive tank rupture! last key to touch the tank was [fingerprintslast] (JMP)") - log_game("Explosive tank rupture! last key to touch the tank was [fingerprintslast] at [x], [y], [z]") -// to_chat(world, "[x],[y] tank is exploding: [pressure] kPa") - //Give the gas a chance to build up more pressure through reacting - air_contents.react() - air_contents.react() - air_contents.react() - pressure = air_contents.return_pressure() - var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE - var/turf/epicenter = get_turf(loc) - -// to_chat(world, "Exploding Pressure: [pressure] kPa, intensity: [range]") - - explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) - if(istype(loc,/obj/item/transfer_valve)) - qdel(loc) - else - qdel(src) - - else if(pressure > TANK_RUPTURE_PRESSURE) -// to_chat(world, "[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]") - if(integrity <= 0) - var/turf/simulated/T = get_turf(src) - if(!T) - return - T.assume_air(air_contents) - playsound(loc, 'sound/effects/spray.ogg', 10, 1, -3) - qdel(src) - else - integrity-- - - else if(pressure > TANK_LEAK_PRESSURE) -// to_chat(world, "[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]") - if(integrity <= 0) - var/turf/simulated/T = get_turf(src) - if(!T) - return - var/datum/gas_mixture/leaked_gas = air_contents.remove_ratio(0.25) - T.assume_air(leaked_gas) - else - integrity-- - - else if(integrity < 3) - integrity++ +#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE) + +/obj/item/tank + name = "tank" + icon = 'icons/obj/tank.dmi' + flags = CONDUCT + slot_flags = SLOT_BACK + hitsound = 'sound/weapons/smash.ogg' + w_class = WEIGHT_CLASS_NORMAL + pressure_resistance = ONE_ATMOSPHERE * 5 + force = 5.0 + throwforce = 10.0 + throw_speed = 1 + throw_range = 4 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 30) + actions_types = list(/datum/action/item_action/set_internals) + var/datum/gas_mixture/air_contents = null + var/distribute_pressure = ONE_ATMOSPHERE + var/integrity = 3 + var/volume = 70 + +/obj/item/tank/New() + ..() + + air_contents = new /datum/gas_mixture() + air_contents.volume = volume //liters + air_contents.temperature = T20C + + START_PROCESSING(SSobj, src) + return + +/obj/item/tank/Destroy() + QDEL_NULL(air_contents) + + STOP_PROCESSING(SSobj, src) + + return ..() + + +/obj/item/tank/ui_action_click(mob/user) + toggle_internals(user) + +/obj/item/tank/proc/toggle_internals(mob/user, silent = FALSE) + var/mob/living/carbon/C = user + if(!istype(C)) + return FALSE + + if(C.internal == src) + to_chat(C, "You close \the [src] valve.") + C.internal = null + else + if(!C.get_organ_slot("breathing_tube")) // Breathing tubes can always use internals, if they have one, skip ahead and turn internals on/off + if(!C.wear_mask) // Do we have a mask equipped? + return FALSE + + var/obj/item/clothing/mask/M = C.wear_mask + // If the "mask" isn't actually a mask OR That mask isn't internals compatible AND Their headgear isn't internals compatible + if(!istype(M) || (!(initial(M.flags) & AIRTIGHT) && !(C.head.flags & AIRTIGHT))) + if(!silent) + to_chat(C, "You are not wearing a suitable mask or helmet.") + return FALSE + if(M.mask_adjusted) // If the mask is equipped but pushed down + M.adjustmask(C) // Adjust it back + + if(!silent) + if(C.internal) + to_chat(C, "You switch your internals to [src].") + else + to_chat(C, "You open \the [src] valve.") + C.internal = src + C.update_action_buttons_icon() + + +/obj/item/tank/examine(mob/user) + . = ..() + + var/obj/icon = src + if(istype(loc, /obj/item/assembly)) + icon = loc + + if(!in_range(src, user)) + if(icon == src) + . += "It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer." + return + + var/celsius_temperature = air_contents.temperature-T0C + var/descriptive + + if(celsius_temperature < 20) + descriptive = "cold" + else if(celsius_temperature < 40) + descriptive = "room temperature" + else if(celsius_temperature < 80) + descriptive = "lukewarm" + else if(celsius_temperature < 100) + descriptive = "warm" + else if(celsius_temperature < 300) + descriptive = "hot" + else + descriptive = "furiously hot" + + . += "\The [bicon(icon)][src] feels [descriptive]" + +/obj/item/tank/blob_act(obj/structure/blob/B) + if(B && B.loc == loc) + var/turf/location = get_turf(src) + if(!location) + qdel(src) + + if(air_contents) + location.assume_air(air_contents) + + qdel(src) + +/obj/item/tank/deconstruct(disassembled = TRUE) + if(!disassembled) + var/turf/T = get_turf(src) + if(T) + T.assume_air(air_contents) + air_update_turf() + playsound(src.loc, 'sound/effects/spray.ogg', 10, TRUE, -3) + qdel(src) + +/obj/item/tank/attackby(obj/item/W as obj, mob/user as mob, params) + ..() + + add_fingerprint(user) + if(istype(loc, /obj/item/assembly)) + icon = loc + + if((istype(W, /obj/item/analyzer)) && get_dist(user, src) <= 1) + atmosanalyzer_scan(air_contents, user) + + if(istype(W, /obj/item/assembly_holder)) + bomb_assemble(W,user) + +/obj/item/tank/attack_self(mob/user as mob) + if(!(air_contents)) + return + + ui_interact(user) + +/obj/item/tank/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + // update the ui if it exists, returns null if no ui is passed/found + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + // the ui does not exist, so we'll create a new() one + // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm + ui = new(user, src, ui_key, "tanks.tmpl", "Tank", 500, 300) + // open the new ui window + ui.open() + // auto update every Master Controller tick + ui.set_auto_update(1) + +/obj/item/tank/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) + var/using_internal + if(iscarbon(loc)) + var/mob/living/carbon/C = loc + if(C.internal == src) + using_internal = 1 + + var/data[0] + data["tankPressure"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) + data["releasePressure"] = round(distribute_pressure ? distribute_pressure : 0) + data["defaultReleasePressure"] = round(TANK_DEFAULT_RELEASE_PRESSURE) + data["maxReleasePressure"] = round(TANK_MAX_RELEASE_PRESSURE) + data["valveOpen"] = using_internal ? 1 : 0 + + data["maskConnected"] = 0 + + if(iscarbon(loc)) + var/mob/living/carbon/C = loc + if(C.internal == src) + data["maskConnected"] = 1 + else + if(C.wear_mask && (C.wear_mask.flags & AIRTIGHT)) + data["maskConnected"] = 1 + else if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(H.head && (H.head.flags & AIRTIGHT)) + data["maskConnected"] = 1 + + return data + +/obj/item/tank/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["dist_p"]) + if(href_list["dist_p"] == "reset") + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE + else if(href_list["dist_p"] == "max") + distribute_pressure = TANK_MAX_RELEASE_PRESSURE + else + var/cp = text2num(href_list["dist_p"]) + distribute_pressure += cp + distribute_pressure = min(max(round(distribute_pressure), 0), TANK_MAX_RELEASE_PRESSURE) + + if(href_list["stat"]) + toggle_internals(usr) + + add_fingerprint(usr) + return 1 + + +/obj/item/tank/remove_air(amount) + return air_contents.remove(amount) + +/obj/item/tank/return_air() + return air_contents + +/obj/item/tank/assume_air(datum/gas_mixture/giver) + air_contents.merge(giver) + + check_status() + return 1 + +/obj/item/tank/proc/remove_air_volume(volume_to_return) + if(!air_contents) + return null + + var/tank_pressure = air_contents.return_pressure() + if(tank_pressure < distribute_pressure) + distribute_pressure = tank_pressure + + var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature) + + return remove_air(moles_needed) + +/obj/item/tank/process() + //Allow for reactions + air_contents.react() + check_status() + + +/obj/item/tank/proc/check_status() + //Handle exploding, leaking, and rupturing of the tank + + if(!air_contents) + return 0 + + var/pressure = air_contents.return_pressure() + if(pressure > TANK_FRAGMENT_PRESSURE) + if(!istype(loc,/obj/item/transfer_valve)) + message_admins("Explosive tank rupture! last key to touch the tank was [fingerprintslast] (JMP)") + log_game("Explosive tank rupture! last key to touch the tank was [fingerprintslast] at [x], [y], [z]") +// to_chat(world, "[x],[y] tank is exploding: [pressure] kPa") + //Give the gas a chance to build up more pressure through reacting + air_contents.react() + air_contents.react() + air_contents.react() + pressure = air_contents.return_pressure() + var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE + var/turf/epicenter = get_turf(loc) + +// to_chat(world, "Exploding Pressure: [pressure] kPa, intensity: [range]") + + explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) + if(istype(loc,/obj/item/transfer_valve)) + qdel(loc) + else + qdel(src) + + else if(pressure > TANK_RUPTURE_PRESSURE) +// to_chat(world, "[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]") + if(integrity <= 0) + var/turf/simulated/T = get_turf(src) + if(!T) + return + T.assume_air(air_contents) + playsound(loc, 'sound/effects/spray.ogg', 10, 1, -3) + qdel(src) + else + integrity-- + + else if(pressure > TANK_LEAK_PRESSURE) +// to_chat(world, "[x],[y] tank is leaking: [pressure] kPa, integrity [integrity]") + if(integrity <= 0) + var/turf/simulated/T = get_turf(src) + if(!T) + return + var/datum/gas_mixture/leaked_gas = air_contents.remove_ratio(0.25) + T.assume_air(leaked_gas) + else + integrity-- + + else if(integrity < 3) + integrity++ From a508b42b4e607434d0f63b76ccf8c60ab6af71a9 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Tue, 22 Oct 2019 10:57:44 -0500 Subject: [PATCH 3/9] IPC balance changes --- .../MetaStation/MetaStation.v41A.II.dmm | 6 +--- _maps/map_files/cyberiad/cyberiad.dmm | 1 - code/game/atoms.dm | 2 +- .../closets/secure/scientist.dm | 2 -- .../mob/living/carbon/human/examine.dm | 5 ++- .../living/carbon/human/species/machine.dm | 6 +--- .../mob/living/silicon/robot/component.dm | 5 --- code/modules/surgery/organs/blood.dm | 2 +- code/modules/surgery/organs/organ.dm | 29 ----------------- code/modules/surgery/organs/organ_external.dm | 31 +++++++++++++++++++ code/modules/surgery/organs/organ_internal.dm | 9 ++++++ .../surgery/organs/subtypes/machine.dm | 11 +++++++ 12 files changed, 57 insertions(+), 52 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index 5a880549b8a..ef787f76dc8 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -96593,10 +96593,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/starboard) -"dgF" = ( -/obj/structure/reagent_dispensers/oil, -/turf/simulated/floor/plasteel, -/area/assembly/robotics) "dgG" = ( /obj/structure/rack, /obj/item/stack/sheet/cardboard, @@ -126709,7 +126705,7 @@ cIx cJn cMj cLo -dgF +cLo cLo cQv cOX diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 7cf27593f6f..cecaf12cbf6 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -46257,7 +46257,6 @@ dir = 2; network = list("Research","SS13") }, -/obj/structure/reagent_dispensers/oil, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "whiteredcorner" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 1cb0ee3baad..e84d12b85fe 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -239,7 +239,7 @@ /atom/proc/HasProximity(atom/movable/AM as mob|obj) return -/atom/proc/emp_act(var/severity) +/atom/proc/emp_act(severity) return /atom/proc/bullet_act(obj/item/projectile/P, def_zone) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index fd67afcf797..311bc4a38c7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -45,8 +45,6 @@ new /obj/item/clothing/suit/storage/labcoat(src) new /obj/item/radio/headset/headset_sci(src) new /obj/item/radio/headset/headset_sci(src) - new /obj/item/reagent_containers/food/drinks/oilcan(src) - new /obj/item/reagent_containers/food/drinks/oilcan(src) /obj/structure/closet/secure_closet/RD name = "research director's locker" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index de9a9209925..b144b418956 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -298,14 +298,13 @@ else msg += "[p_they(TRUE)] [p_are()] quite chubby.\n" - if(!isSynthetic() && blood_volume < BLOOD_VOLUME_SAFE) + if(blood_volume < BLOOD_VOLUME_SAFE) msg += "[p_they(TRUE)] [p_have()] pale skin.\n" if(bleedsuppress) msg += "[p_they(TRUE)] [p_are()] bandaged with something.\n" else if(bleed_rate) - var/bleed_message = !isSynthetic() ? "bleeding" : "leaking" - msg += "[p_they(TRUE)] [p_are()] [bleed_message]!\n" + msg += "[p_they(TRUE)] [p_are()] bleeding!\n" if(reagents.has_reagent("teslium")) msg += "[p_they(TRUE)] [p_are()] emitting a gentle blue glow!\n" diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm index fdc7c6c4c46..3676e8395bc 100644 --- a/code/modules/mob/living/carbon/human/species/machine.dm +++ b/code/modules/mob/living/carbon/human/species/machine.dm @@ -22,7 +22,7 @@ death_message = "gives a short series of shrill beeps, their chassis shuddering before falling limp, nonfunctional." death_sounds = list('sound/voice/borg_deathsound.ogg') //I've made this a list in the event we add more sounds for dead robots. - species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_INTORGANS, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NO_GERMS, NO_DECAY, NOTRANSSTING) //Computers that don't decay? What a lie! + species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_BLOOD, NO_SCAN, NO_INTORGANS, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NO_GERMS, NO_DECAY, NOTRANSSTING) //Computers that don't decay? What a lie! clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS dietflags = 0 //IPCs can't eat, so no diet @@ -30,10 +30,6 @@ blood_color = "#1F181F" flesh_color = "#AAAAAA" - blood_color = "#3C3C3C" - exotic_blood = "oil" - blood_damage_type = STAMINA - //Default styles for created mobs. default_hair = "Blue IPC Screen" dies_at_threshold = TRUE diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 26b5683d1a3..d8f5b665eb7 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -312,8 +312,3 @@ proc/robot_healthscan(mob/user, mob/living/M) to_chat(user, "[capitalize(O.name)]: [O.damage]") if(!organ_found) to_chat(user, "No prosthetics located.") - - if(H.isSynthetic()) - to_chat(user, "Internal Fluid Level:[H.blood_volume]/[H.max_blood]") - if(H.bleed_rate) - to_chat(user, "Warning:External component leak detected!") diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm index 63a7f8a3590..cfd9b761f83 100644 --- a/code/modules/surgery/organs/blood.dm +++ b/code/modules/surgery/organs/blood.dm @@ -54,7 +54,7 @@ var/obj/item/organ/external/BP = X var/brutedamage = BP.brute_dam - if(BP.is_robotic() && !isSynthetic()) + if(BP.is_robotic()) continue //We want an accurate reading of .len diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index a06cbf9456b..b1df136f695 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -253,35 +253,6 @@ status &= ~ORGAN_SPLINTED status |= ORGAN_ROBOT -/obj/item/organ/external/emp_act(severity) - if(!is_robotic() || emp_proof) - return - if(tough) - switch(severity) - if(1) - receive_damage(0, 5.5) - if(owner) - owner.Stun(10) - if(2) - receive_damage(0, 2.8) - if(owner) - owner.Stun(5) - else - switch(severity) - if(1) - receive_damage(0, 20) - if(2) - receive_damage(0, 7) - -/obj/item/organ/internal/emp_act(severity) - if(!is_robotic() || emp_proof) - return - switch(severity) - if(1) - receive_damage(20, 1) - if(2) - receive_damage(7, 1) - /obj/item/organ/proc/shock_organ(intensity) return diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index 1813a73cee1..542b7803aeb 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -41,6 +41,9 @@ var/list/obj/item/organ/external/children var/list/convertable_children = list() + // Does the organ take reduce damage from EMPs? IPC limbs get this by default + var/emp_resistant = FALSE + // Internal organs of this body part var/list/internal_organs = list() @@ -256,6 +259,34 @@ return update_icon() +/obj/item/organ/external/emp_act(severity) + if(!is_robotic() || emp_proof) + return + if(tough) // Augmented limbs + switch(severity) + if(1) + receive_damage(0, 5.5) + if(owner) + owner.Stun(10) + if(2) + receive_damage(0, 2.8) + if(owner) + owner.Stun(5) + else if(emp_resistant) // IPC limbs + switch(severity) + if(1) + // 5.28 (9 * 0.66 burn_mod) burn damage, 65.34 damage with 11 limbs. + receive_damage(0, 9) + if(2) + // 3.63 (5 * 0.66 burn_mod) burn damage, 39.93 damage with 11 limbs. + receive_damage(0, 5.5) + else // Basic prosthetic limbs + switch(severity) + if(1) + receive_damage(0, 20) + if(2) + receive_damage(0, 7) + /* This function completely restores a damaged organ to perfect condition. */ diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 5cab4dfafd8..730d2aacee0 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -73,6 +73,15 @@ A.Remove(M) return src +/obj/item/organ/internal/emp_act(severity) + if(!is_robotic() || emp_proof) + return + switch(severity) + if(1) + receive_damage(20, 1) + if(2) + receive_damage(7, 1) + /obj/item/organ/internal/replaced(var/mob/living/carbon/human/target) insert(target) diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 52cad684e11..415cdb7875d 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -5,6 +5,7 @@ min_broken_damage = 30 encased = null status = ORGAN_ROBOT + emp_resistant = TRUE /obj/item/organ/external/head/ipc/New(mob/living/carbon/holder, datum/species/species_override = null) ..(holder, /datum/species/machine) // IPC heads need to be explicitly set to this since you can print them @@ -13,6 +14,7 @@ /obj/item/organ/external/chest/ipc encased = null status = ORGAN_ROBOT + emp_resistant = TRUE /obj/item/organ/external/chest/ipc/New() ..() @@ -21,6 +23,7 @@ /obj/item/organ/external/groin/ipc encased = null status = ORGAN_ROBOT + emp_resistant = TRUE /obj/item/organ/external/groin/ipc/New() ..() @@ -29,6 +32,7 @@ /obj/item/organ/external/arm/ipc encased = null status = ORGAN_ROBOT + emp_resistant = TRUE /obj/item/organ/external/arm/ipc/New() ..() @@ -37,6 +41,7 @@ /obj/item/organ/external/arm/right/ipc encased = null status = ORGAN_ROBOT + emp_resistant = TRUE /obj/item/organ/external/arm/right/ipc/New() ..() @@ -45,6 +50,7 @@ /obj/item/organ/external/leg/ipc encased = null status = ORGAN_ROBOT + emp_resistant = TRUE /obj/item/organ/external/leg/ipc/New() ..() @@ -53,6 +59,7 @@ /obj/item/organ/external/leg/right/ipc encased = null status = ORGAN_ROBOT + emp_resistant = TRUE /obj/item/organ/external/leg/right/ipc/New() ..() @@ -61,6 +68,7 @@ /obj/item/organ/external/foot/ipc encased = null status = ORGAN_ROBOT + emp_resistant = TRUE /obj/item/organ/external/foot/ipc/New() ..() @@ -69,6 +77,7 @@ /obj/item/organ/external/foot/right/ipc encased = null status = ORGAN_ROBOT + emp_resistant = TRUE /obj/item/organ/external/foot/right/ipc/New() ..() @@ -77,6 +86,7 @@ /obj/item/organ/external/hand/ipc encased = null status = ORGAN_ROBOT + emp_resistant = TRUE /obj/item/organ/external/hand/ipc/New() ..() @@ -85,6 +95,7 @@ /obj/item/organ/external/hand/right/ipc encased = null status = ORGAN_ROBOT + emp_resistant = TRUE /obj/item/organ/external/hand/right/ipc/New() ..() From 9173469c67e99778ce68fa867dae82a95f17ca47 Mon Sep 17 00:00:00 2001 From: SteelSlayer Date: Fri, 3 Jul 2020 14:41:33 -0500 Subject: [PATCH 4/9] I didnt mean to remove this --- code/modules/mob/living/carbon/human/examine.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index e688861c1b1..b2a66ed0b65 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -298,6 +298,9 @@ if(user.nutrition < NUTRITION_LEVEL_HYPOGLYCEMIA) msg += "[p_they(TRUE)] [p_are()] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n" + else if(nutrition >= NUTRITION_LEVEL_FAT) + msg += "[p_they(TRUE)] [p_are()] quite chubby.\n" + if(blood_volume < BLOOD_VOLUME_SAFE) msg += "[p_they(TRUE)] [p_have()] pale skin.\n" From 4a9984e304768535002436e88f7544d0c2c5e57a Mon Sep 17 00:00:00 2001 From: mochi Date: Tue, 14 Jul 2020 14:14:09 +0200 Subject: [PATCH 5/9] Refactors and TGUI-ses Mining Equipment Vendor --- code/modules/mining/machine_vending.dm | 352 ++++++++++-------- tgui/packages/tgui/components/Collapsible.js | 4 +- tgui/packages/tgui/interfaces/MiningVendor.js | 216 +++++++++++ tgui/packages/tgui/layouts/Window.js | 13 +- tgui/packages/tgui/public/tgui.bundle.css | 2 +- tgui/packages/tgui/public/tgui.bundle.js | 6 +- .../tgui/styles/components/Collapsible.scss | 6 + tgui/packages/tgui/styles/layouts/Layout.scss | 20 +- tgui/packages/tgui/styles/main.scss | 1 + 9 files changed, 450 insertions(+), 170 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/MiningVendor.js create mode 100644 tgui/packages/tgui/styles/components/Collapsible.scss diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index fd675bac32c..49099e05444 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -1,104 +1,18 @@ -/**********************Mining Equipment Locker**************************/ +// Use this define to register something as a purchasable! +#define EQUIPMENT(n, o, p) n = new /datum/data/mining_equipment(n, o, p) + +/**********************Mining Equipment Vendor**************************/ /obj/machinery/mineral/equipment_vendor name = "mining equipment vendor" desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here." icon = 'icons/obj/machines/mining_machines.dmi' icon_state = "mining" - density = 1 - anchored = 1.0 + density = TRUE + anchored = TRUE var/obj/item/card/id/inserted_id - var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces. - new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), - new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100), - new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300), - new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100), - new /datum/data/mining_equipment("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 100), - new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), - new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), - new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), - new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), - new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400), - new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000), - new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500), - new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400), - new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), - new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500), - new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500), - new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/autoinjector/survival, 500), - new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600), - new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600), - new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750), - new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750), - new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), - new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800), - new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800), - new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000), - new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000), - new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000), - new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript/full, 1500), - new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/tank/jetpack/suit, 2000), - new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000), - new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), - new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), - new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), - new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), - new /datum/data/mining_equipment("Nanotrasen Minebot", /obj/item/mining_drone_cube, 800), - new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400), - new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400), - new /datum/data/mining_equipment("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600), - new /datum/data/mining_equipment("Minebot AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000), - new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100), - new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800), - new /datum/data/mining_equipment("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200), - new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100), - new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150), - new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250), - new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300), - new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), - new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), - new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), - new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000) - ) - -/obj/machinery/mineral/equipment_vendor/golem - name = "golem ship equipment vendor" - -/obj/machinery/mineral/equipment_vendor/golem/New() - ..() - component_parts = list() - component_parts += new /obj/item/circuitboard/mining_equipment_vendor/golem(null) - component_parts += new /obj/item/stock_parts/matter_bin(null) - component_parts += new /obj/item/stock_parts/matter_bin(null) - component_parts += new /obj/item/stock_parts/matter_bin(null) - component_parts += new /obj/item/stack/sheet/glass(null) - RefreshParts() - -/obj/machinery/mineral/equipment_vendor/golem/Initialize() - . = ..() - desc += "\nIt seems a few selections have been added." - prize_list += list( - new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/golem, 250), - new /datum/data/mining_equipment("Science Backpack", /obj/item/storage/backpack/science, 250), - new /datum/data/mining_equipment("Full Toolbelt", /obj/item/storage/belt/utility/full/multitool, 250), - new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 250), - new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500), - new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000), - new /datum/data/mining_equipment("KA Trigger Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1000), - new /datum/data/mining_equipment("Shuttle Console Board", /obj/item/circuitboard/shuttle/golem_ship, 2000), - new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000) - - ) - -/datum/data/mining_equipment - var/equipment_name = "generic" - var/equipment_path = null - var/cost = 0 - -/datum/data/mining_equipment/New(name, path, equipment_cost) - equipment_name = name - equipment_path = path - cost = equipment_cost + var/list/prize_list // Initialized just below! (if you're wondering why - check CONTRIBUTING.md, look for: "hidden" init proc) + var/dirty_items = FALSE // Used to refresh the static/redundant data in case the machine gets VV'd /obj/machinery/mineral/equipment_vendor/New() ..() @@ -110,6 +24,72 @@ component_parts += new /obj/item/stack/sheet/glass(null) RefreshParts() +/obj/machinery/mineral/equipment_vendor/Initialize(mapload) + . = ..() + prize_list = list() + prize_list["Gear"] = list( + EQUIPMENT("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800), + EQUIPMENT("Explorer's Webbing", /obj/item/storage/belt/mining, 500), + EQUIPMENT("Fulton Beacon", /obj/item/fulton_core, 400), + EQUIPMENT("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1500), + EQUIPMENT("Jetpack Upgrade", /obj/item/tank/jetpack/suit, 2000), + EQUIPMENT("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), + EQUIPMENT("Lazarus Capsule", /obj/item/mobcapsule, 800), + EQUIPMENT("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200), + EQUIPMENT("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000), + EQUIPMENT("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600), + ) + prize_list["Consumables"] = list( + EQUIPMENT("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100), + EQUIPMENT("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600), + EQUIPMENT("Fulton Pack", /obj/item/extraction_pack, 1000), + EQUIPMENT("Jaunter", /obj/item/wormhole_jaunter, 750), + EQUIPMENT("Lazarus Injector", /obj/item/lazarus_injector, 1000), + EQUIPMENT("Point Transfer Card", /obj/item/card/mining_point_card, 500), + EQUIPMENT("Shelter Capsule", /obj/item/survivalcapsule, 400), + EQUIPMENT("Stabilizing Serum", /obj/item/hivelordstabilizer, 400), + EQUIPMENT("Survival Medipen", /obj/item/reagent_containers/hypospray/autoinjector/survival, 500), + ) + prize_list["Kinetic Accelerator"] = list( + EQUIPMENT("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), + EQUIPMENT("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150), + EQUIPMENT("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), + EQUIPMENT("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), + EQUIPMENT("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), + EQUIPMENT("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300), + EQUIPMENT("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100), + EQUIPMENT("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), + EQUIPMENT("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250), + EQUIPMENT("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100), + ) + prize_list["Digging Tools"] = list( + EQUIPMENT("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), + EQUIPMENT("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), + EQUIPMENT("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750), + EQUIPMENT("Resonator", /obj/item/resonator, 800), + EQUIPMENT("Silver Pickaxe", /obj/item/pickaxe/silver, 1000), + EQUIPMENT("Super Resonator", /obj/item/resonator/upgraded, 2500), + ) + prize_list["Minebot"] = list( + EQUIPMENT("Nanotrasen Minebot", /obj/item/mining_drone_cube, 800), + EQUIPMENT("Minebot AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000), + EQUIPMENT("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400), + EQUIPMENT("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600), + EQUIPMENT("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400), + ) + prize_list["Miscellaneous"] = list( + EQUIPMENT("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 100), + EQUIPMENT("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), + EQUIPMENT("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150), + EQUIPMENT("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500), + EQUIPMENT("Laser Pointer", /obj/item/laser_pointer, 300), + EQUIPMENT("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), + EQUIPMENT("Soap", /obj/item/soap/nanotrasen, 200), + EQUIPMENT("Space Cash", /obj/item/stack/spacecash/c1000, 2000), + EQUIPMENT("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100), + ) + prize_list["Extra"] = list() // Used in child vendors + /obj/machinery/mineral/equipment_vendor/power_change() ..() update_icon() @@ -126,62 +106,89 @@ /obj/machinery/mineral/equipment_vendor/attack_hand(mob/user) if(..()) return - interact(user) + tgui_interact(user) /obj/machinery/mineral/equipment_vendor/attack_ghost(mob/user) - interact(user) + tgui_interact(user) -/obj/machinery/mineral/equipment_vendor/interact(mob/user) - user.set_machine(src) +/obj/machinery/mineral/equipment_vendor/tgui_data(mob/user) + var/list/data[0] + . = data - var/dat - dat +="
" - if(istype(inserted_id)) - dat += "You have [inserted_id.mining_points] mining points collected. Eject ID.
" + // ID + if(inserted_id) + data["has_id"] = TRUE + data["id"] = list( + "name" = inserted_id.registered_name, + "points" = inserted_id.mining_points, + ) else - dat += "No ID inserted. Insert ID.
" - dat += "
" - dat += "
Equipment point cost list:
" - for(var/datum/data/mining_equipment/prize in prize_list) - dat += "" - dat += "
[prize.equipment_name][prize.cost]Purchase
" - var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 350) - popup.set_content(dat) - popup.open() + data["has_id"] = FALSE -/obj/machinery/mineral/equipment_vendor/Topic(href, href_list) +/obj/machinery/mineral/equipment_vendor/tgui_static_data(mob/user) + var/list/static_data[0] + . = static_data + + // Available items - in static data because we don't wanna compute this list every time! It hardly changes. + static_data["items"] = list() + for(var/cat in prize_list) + var/list/cat_items = list() + for(var/prize_name in prize_list[cat]) + var/datum/data/mining_equipment/prize = prize_list[cat][prize_name] + cat_items[prize_name] = list("name" = prize_name, "price" = prize.cost) + static_data["items"][cat] = cat_items + +/obj/machinery/mineral/equipment_vendor/vv_edit_var(var_name, var_value) + // Gotta update the static data in case an admin VV's the items for some reason..! + if(var_name == "items") + dirty_items = TRUE + +/obj/machinery/mineral/equipment_vendor/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + // Update static data if need be + if(dirty_items) + if(!ui) + ui = SStgui.get_open_ui(user, src, ui_key) + ui?.initial_static_data = tgui_static_data(user) + dirty_items = FALSE + + // Open the window + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "MiningVendor", name, 400, 450) + ui.open() + ui.set_autoupdate(FALSE) + +/obj/machinery/mineral/equipment_vendor/tgui_act(action, params) if(..()) - return 1 + return - if(href_list["choice"]) - if(istype(inserted_id)) - if(href_list["choice"] == "eject") - inserted_id.loc = loc - inserted_id.verb_pickup() - inserted_id = null - else if(href_list["choice"] == "insert") - var/obj/item/card/id/I = usr.get_active_hand() - if(istype(I)) - if(!usr.drop_item()) - return - I.loc = src - inserted_id = I - else - to_chat(usr, "No valid ID.") - - if(href_list["purchase"]) - if(istype(inserted_id)) - var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) - if(!prize || !(prize in prize_list) || prize.cost > inserted_id.mining_points) + . = TRUE + switch(action) + if("logoff") + if(!inserted_id) + return + usr.put_in_hands(inserted_id) + inserted_id = null + if("purchase") + if(!inserted_id) + return + var/category = params["cat"] // meow + var/name = params["name"] + if(!(category in prize_list) || !(name in prize_list[category])) // Not trying something that's not in the list, are you? + return + var/datum/data/mining_equipment/prize = prize_list[category][name] + if(prize.cost > inserted_id.mining_points) // shouldn't be able to access this since the button is greyed out, but.. + to_chat(usr, "You have insufficient points.") return inserted_id.mining_points -= prize.cost - new prize.equipment_path(src.loc) - updateUsrDialog() + new prize.equipment_path(loc) + else + return FALSE + add_fingerprint() /obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "mining-open", "mining", I)) - updateUsrDialog() return if(panel_open) if(istype(I, /obj/item/crowbar)) @@ -192,24 +199,29 @@ if(istype(I, /obj/item/mining_voucher)) if(!powered()) return - else - RedeemVoucher(I, user) + redeem_voucher(I, user) return - if(istype(I,/obj/item/card/id)) + if(istype(I, /obj/item/card/id)) if(!powered()) return - else - var/obj/item/card/id/C = usr.get_active_hand() - if(istype(C) && !istype(inserted_id)) - if(!usr.drop_item()) - return - C.forceMove(src) - inserted_id = C - interact(user) + var/obj/item/card/id/C = usr.get_active_hand() + if(istype(C) && !istype(inserted_id)) + if(!usr.drop_item()) + return + C.forceMove(src) + inserted_id = C + tgui_interact(user) return return ..() -/obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer) +/** + * Called when someone slaps the machine with a mining voucher + * + * Arguments: + * * voucher - The voucher card item + * * redeemer - The person holding it + */ +/obj/machinery/mineral/equipment_vendor/proc/redeem_voucher(obj/item/mining_voucher/voucher, mob/redeemer) var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Mining Conscription Kit") var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in items @@ -244,7 +256,47 @@ if(prob(50 / severity) && severity < 3) qdel(src) -/**********************Mining Equipment Locker Items**************************/ +/**********************Mining Equiment Vendor (Golem)**************************/ + +/obj/machinery/mineral/equipment_vendor/golem + name = "golem ship equipment vendor" + +/obj/machinery/mineral/equipment_vendor/golem/New() + ..() + component_parts = list() + component_parts += new /obj/item/circuitboard/mining_equipment_vendor/golem(null) + component_parts += new /obj/item/stock_parts/matter_bin(null) + component_parts += new /obj/item/stock_parts/matter_bin(null) + component_parts += new /obj/item/stock_parts/matter_bin(null) + component_parts += new /obj/item/stack/sheet/glass(null) + RefreshParts() + +/obj/machinery/mineral/equipment_vendor/golem/Initialize() + . = ..() + desc += "\nIt seems a few selections have been added." + prize_list["Extra"] += list( + EQUIPMENT("Extra ID", /obj/item/card/id/golem, 250), + EQUIPMENT("Science Backpack", /obj/item/storage/backpack/science, 250), + EQUIPMENT("Full Toolbelt", /obj/item/storage/belt/utility/full/multitool, 250), + EQUIPMENT("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 250), + EQUIPMENT("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500), + EQUIPMENT("Grey Slime Extract", /obj/item/slime_extract/grey, 1000), + EQUIPMENT("KA Trigger Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1000), + EQUIPMENT("Shuttle Console Board", /obj/item/circuitboard/shuttle/golem_ship, 2000), + EQUIPMENT("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000), + ) + +/**********************Mining Equipment Datum**************************/ + +/datum/data/mining_equipment + var/equipment_name = "generic" + var/equipment_path = null + var/cost = 0 + +/datum/data/mining_equipment/New(name, path, equipment_cost) + equipment_name = name + equipment_path = path + cost = equipment_cost /**********************Mining Equipment Voucher**********************/ @@ -300,3 +352,5 @@ /obj/item/storage/backpack/duffel/mining_conscript/full/New() ..() new /obj/item/card/id/mining_access_card(src) + +#undef EQUIPMENT diff --git a/tgui/packages/tgui/components/Collapsible.js b/tgui/packages/tgui/components/Collapsible.js index 84af070fe18..080074e48ef 100644 --- a/tgui/packages/tgui/components/Collapsible.js +++ b/tgui/packages/tgui/components/Collapsible.js @@ -22,7 +22,7 @@ export class Collapsible extends Component { ...rest } = props; return ( - +
); } } diff --git a/tgui/packages/tgui/interfaces/MiningVendor.js b/tgui/packages/tgui/interfaces/MiningVendor.js new file mode 100644 index 00000000000..8b6b7caca96 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MiningVendor.js @@ -0,0 +1,216 @@ +import { createSearch } from 'common/string'; +import { Fragment } from 'inferno'; +import { useBackend, useLocalState } from "../backend"; +import { Box, Button, Collapsible, Dropdown, Flex, Input, NoticeBox, Section } from '../components'; +import { Window } from "../layouts"; + +const sortTypes = { + 'Alphabetical': (a, b) => a - b, + 'By availability': (a, b) => -(a.affordable - b.affordable), + 'By price': (a, b) => a.price - b.price, +}; + +export const MiningVendor = (_properties, _context) => { + return ( + + + + + + + + ); +}; + +const MiningVendorUser = (_properties, context) => { + const { act, data } = useBackend(context); + const { + has_id, + id, + } = data; + return ( + + {has_id ? ( + + + Logged in as {id.name}.
+ You have {id.points.toLocaleString('en-US')} points. +
+