From 254334e0339ff4605773d3818eafb1d00217be78 Mon Sep 17 00:00:00 2001 From: "C.L" Date: Tue, 13 Sep 2022 03:42:44 -0400 Subject: [PATCH] More changes! - Adds ability for modifiers to use a custom _vr sprite file. - Changes the appearance of the sprite used for the shield overlay. - Adds ability to color the shield sprite via a multitool. - More fiddling with numbers... - Allows rechargers to recharge them to allow for non-recharging variants to recharge. - Gives shields a default 'cyan' color. - Adds a mining disk to the equipment vendor to upgrade it. --- code/game/machinery/recharger.dm | 2 +- .../devices/personal_shield_generator_vr.dm | 51 ++++++++++++++---- .../equipment_vendor.dm | 1 + code/modules/mob/_modifiers/modifiers_vr.dm | 43 ++++++++------- .../mob/living/carbon/human/update_icons.dm | 10 +++- icons/mob/modifier_effects_vr.dmi | Bin 0 -> 1128 bytes icons/obj/items_vr.dmi | Bin 6379 -> 7509 bytes 7 files changed, 77 insertions(+), 30 deletions(-) create mode 100644 icons/mob/modifier_effects_vr.dmi diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index ea2854480a8..f028cef8a2f 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -10,7 +10,7 @@ active_power_usage = 40000 //40 kW var/efficiency = 40000 //will provide the modified power rate when upgraded var/obj/item/charging = null - var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/suit_cooling_unit/emergency, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/device/defib_kit, /obj/item/ammo_casing/microbattery, /obj/item/device/paicard) //VOREStation Add - NSFW Batteries + var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/suit_cooling_unit/emergency, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/device/defib_kit, /obj/item/ammo_casing/microbattery, /obj/item/device/paicard, /obj/item/device/personal_shield_generator) //VOREStation Add - NSFW Batteries var/icon_state_charged = "recharger2" var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" //also when unpowered diff --git a/code/game/objects/items/devices/personal_shield_generator_vr.dm b/code/game/objects/items/devices/personal_shield_generator_vr.dm index 541eaa38cdb..06e306c3e92 100644 --- a/code/game/objects/items/devices/personal_shield_generator_vr.dm +++ b/code/game/objects/items/devices/personal_shield_generator_vr.dm @@ -38,6 +38,7 @@ var/has_weapon = 1 // Backpack units generally have weapons. var/shield_active = 0 // If the shield gen is active. + var/effect_color = "#99FFFF" // Allows for changing shield colors. Default cyan. /obj/item/device/personal_shield_generator/get_cell() return bcell @@ -101,6 +102,18 @@ add_overlay("[initial(icon_state)]-nocell") */ +/obj/item/device/personal_shield_generator/emp_act(severity) + if(bcell) + switch(severity) + if(1) //Point blank EMP shots have a good chance of burning the cell charge." + if(prob(50)) + bcell.emp_act(severity) + bcell.corrupt() + else + if(prob(25)) + bcell.emp_act(severity) + ..() + /obj/item/device/personal_shield_generator/ui_action_click() toggle_shield() @@ -156,6 +169,10 @@ active_weapon.power_supply = null //No power cell anymore! to_chat(user, "You remove the cell from \the [src].") update_icon() + else if(istype(W,/obj/item/device/multitool)) + var/new_color = input(usr, "Choose a color to set the shield to!", "", effect_color) as color|null + if(new_color) + effect_color = new_color else return ..() @@ -198,6 +215,7 @@ to_chat(user, "You activate the shield!") user.remove_modifiers_of_type(/datum/modifier/shield_projection) //Just to make sure they aren't using two at once! user.add_modifier(modifier_type) //TESTING. + user.update_modifier_visuals() //Forces coloration to WORK. START_PROCESSING(SSobj, src) //Let's only bother draining power when we're being used! update_icon() @@ -240,6 +258,7 @@ to_chat(user, "The shield deactivates.!") user.remove_modifiers_of_type(/datum/modifier/shield_projection) STOP_PROCESSING(SSobj, src) + update_icon() @@ -384,30 +403,44 @@ // Mining belts /obj/item/device/personal_shield_generator/belt/mining - name = "mining personal shield generator" + name = "mining PSG" desc = "A personal shield generator designed for mining. It has a warning on the back: 'Do NOT expose the shield to stun-based weaponry.'" modifier_type = /datum/modifier/shield_projection/mining /obj/item/device/personal_shield_generator/belt/mining/loaded bcell = /obj/item/weapon/cell/device/shield_generator -/* +/obj/item/device/personal_shield_generator/belt/mining/update_icon() + if(shield_active) + icon_state = "shield_belt_mining_active" + else + icon_state = "shield_belt_mining" + +/obj/item/borg/upgrade/shield_upgrade + name = "mining PSG upgrade disk." + desc = "A upgrade disk that, when slotted into a mining shield generator, upgrades the efficiency of the internal software, providing a stronger shield \ + in exchange for being weaker to stun-based weaponry." + icon = 'icons/obj/objects_vr.dmi' + icon_state = "modkit" + w_class = ITEMSIZE_SMALL + /obj/item/device/personal_shield_generator/belt/mining/attackby(obj/item/weapon/W, mob/user, params) - if(modifier_type == /datum/modifier/shield_projection/mining/strong)) + if(modifier_type == /datum/modifier/shield_projection/mining/strong) to_chat(user, "This shield generator is already upgraded!") return - if(istype(W, /obj/item/borg/upgrade/modkit/shield_upgrade)) + if(istype(W, /obj/item/borg/upgrade/shield_upgrade)) modifier_type = /datum/modifier/shield_projection/mining/strong + to_chat(user, "You upgrade the [src] with the [W]!") user.drop_from_inventory(W) qdel(W) else ..() -*/ + //Security belts /obj/item/device/personal_shield_generator/belt/security - name = "security personal shield generator" + name = "security PSG" desc = "A personal shield generator designed for security." modifier_type = /datum/modifier/shield_projection/security/weak @@ -426,7 +459,7 @@ bcell = /obj/item/weapon/cell/device/shield_generator /obj/item/device/personal_shield_generator/belt/parry //The 'provides one second of pure immunity to brute/burn/halloss' belt. - name = "personal shield generator variant-P" //Not meant to be used in any serious capacity. + name = "PSG variant-P" //Not meant to be used in any serious capacity. desc = "A personal shield generator that sacrifices long-term usability in exchange for a strong, short-lived shield projection, enabling the user to be nigh \ impervious for a second." modifier_type = /datum/modifier/shield_projection/parry @@ -440,7 +473,7 @@ // HOWEVER, be careful with these. They come loaded with a gun in them, so they shouldn't be handed out willy-nilly. /obj/item/device/personal_shield_generator/security - name = "security personal shield generator" + name = "security PSG" desc = "A personal shield generator designed for security." modifier_type = /datum/modifier/shield_projection/security @@ -465,6 +498,7 @@ /obj/item/weapon/cell/device/shield_generator/backpack //The base power cell the backpack units come with. Double the charge vs the belt. maxcharge = 4800 + charge_amount = 160 /obj/item/weapon/cell/device/shield_generator/upgraded //A stronger version of the normal cell. Double the maxcharge, halved charge time. maxcharge = 4800 @@ -473,6 +507,5 @@ /obj/item/weapon/cell/device/shield_generator/parry //The cell for the 'parry' shield gen. maxcharge = 100 - self_recharge = TRUE charge_amount = 100 charge_delay = 20 //Starts charging two seconds after it's discharged. \ No newline at end of file diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index c100a7a9bc9..09e5a692a6e 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -170,6 +170,7 @@ EQUIPMENT("Thalers - 1000", /obj/item/weapon/spacecash/c1000, 10000), EQUIPMENT("Umbrella", /obj/item/weapon/melee/umbrella/random, 200), EQUIPMENT("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 125), + EQUIPMENT("Mining PSG Upgrade Disk", /obj/item/borg/upgrade/shield_upgrade, 2500), ) prize_list["Extra"] = list() // Used in child vendors //VOREStation Edit End diff --git a/code/modules/mob/_modifiers/modifiers_vr.dm b/code/modules/mob/_modifiers/modifiers_vr.dm index 1f925a76b56..35de7983ae8 100644 --- a/code/modules/mob/_modifiers/modifiers_vr.dm +++ b/code/modules/mob/_modifiers/modifiers_vr.dm @@ -1,4 +1,7 @@ /datum/modifier + var/effect_color // Allows for coloring of modifiers. + var/coloration_applied = 0 // Tells the game is coloration has been applied already or not. + var/icon_override = 0 // Tells the game if it should use modifer_effects_vr.dmi or not. // ENERGY CODE. Variables to allow for energy based modifiers. var/energy_based // Sees if the modifier is based on something electronic based. var/energy_cost // How much the modifier uses per action/special effect blocked. For base values. @@ -91,9 +94,10 @@ on_created_text = "Your shield generator buzzes on." on_expired_text = "Your shield generator buzzes off." - mob_overlay_state = "repel_missiles" //Looks actually pretty good. Could use a better sprite, but that'll work! stacks = MODIFIER_STACK_FORBID //No stacking shields. If you put one one your belt and backpack it won't work. + icon_override = 1 + mob_overlay_state = "deflect" siemens_coefficient = 2 //Stun weapons drain 100% charge per point of damage. They're good at blocking lasers and bullets but not good at blocking stun beams! energy_based = 1 energy_cost = 99999 //This is changed to the shield_generator's energy_cost. @@ -128,7 +132,7 @@ var/obj/item/device/personal_shield_generator/shield_generator //This is the shield generator you're wearing! -/datum/modifier/shield_projection/on_applied() //Don't need to modify this! +/datum/modifier/shield_projection/on_applied() return /datum/modifier/shield_projection/on_expire() //Don't need to modify this! @@ -139,24 +143,24 @@ var/mob/living/carbon/human/H = holder if(istype(H.get_equipped_item(slot_back), /obj/item/device/personal_shield_generator)) shield_generator = H.get_equipped_item(slot_back) //Sets the var on the modifier that the shield gen is their back shield gen. - energy_source = shield_generator.bcell - energy_cost = shield_generator.generator_hit_cost - energy_modifier = shield_generator.energy_modifier else if(istype(H.get_equipped_item(slot_belt), /obj/item/device/personal_shield_generator)) shield_generator = H.get_equipped_item(slot_belt) //No need for other checks. If they got hit by this, they just turned it on. - energy_source = shield_generator.bcell - energy_cost = shield_generator.generator_hit_cost - energy_modifier = shield_generator.energy_modifier else if(istype(H.get_equipped_item(slot_s_store), /obj/item/device/personal_shield_generator) ) //Rigsuits. shield_generator = H.get_equipped_item(slot_s_store) + else + expire(silent = TRUE) + if(shield_generator) //Sanity. energy_source = shield_generator.bcell energy_cost = shield_generator.generator_hit_cost energy_modifier = shield_generator.energy_modifier - else - expire(silent = TRUE) + effect_color = shield_generator.effect_color + if(!coloration_applied) //Does a check if colors have been applied. If not, updates the color. + H.update_modifier_visuals() //This can only happen on the next tick, unfortunately, not the same tick the modifier is applied. Thus, must be done here. + coloration_applied = 1 else expire(silent = TRUE) + /datum/modifier/shield_projection/tick() //When the shield generator runs out of charge, it'll remove this naturally. if(holder.stat == DEAD) expire(silent = TRUE) //If you're dead the generator stops protecting you but keeps running. @@ -200,8 +204,8 @@ max_fire_resistance = 0.5 //SECURITY VARIANTS -/datum/modifier/shield_projection/security // Security backpack. 50% resistance at full charge. 90% resistance for the last shot taken. - max_brute_resistance = 0.5 +/datum/modifier/shield_projection/security // Security backpack. 50% resistance at full charge. 10% resistance for the last shot taken. + max_brute_resistance = 0.50 min_brute_resistance = 0.9 effective_brute_resistance = 1 @@ -213,6 +217,8 @@ min_hal_resistance = 0.9 effective_hal_resistance = 1 + disable_duration_percent = 0.75 + /datum/modifier/shield_projection/security/weak // Security belt. max_brute_resistance = 0.75 min_brute_resistance = 0.95 @@ -225,15 +231,16 @@ max_fire_resistance = 0.25 max_hal_resistance = 0.25 siemens_coefficient = 1.5 //Not as weak as normal, but still weak. + disable_duration_percent = 0.5 //MINING VARIANTS -/datum/modifier/shield_projection/mining //Base mining belt. 45% resistance that fades to 15% resistance - max_brute_resistance = 0.55 +/datum/modifier/shield_projection/mining //Base mining belt. 30% resistance that fades to 15% resistance + max_brute_resistance = 0.70 min_brute_resistance = 0.85 effective_brute_resistance = 1 - max_fire_resistance = 0.55 + max_fire_resistance = 0.70 min_brute_resistance = 0.85 effective_fire_resistance = 1 @@ -243,10 +250,10 @@ disable_duration_percent = 0.75 //Miners often come into contact with things that can stun them. -/datum/modifier/shield_projection/mining/strong // Mining belt, but upgraded. Even weaker to halloss! It also scales from .5 to .75 instead of back to 1.0! - max_brute_resistance = 0.5 +/datum/modifier/shield_projection/mining/strong // Mining belt, but upgraded. Even weaker to halloss! + max_brute_resistance = 0.55 min_brute_resistance = 0.75 - max_fire_resistance = 0.5 + max_fire_resistance = 0.55 min_fire_resistance = 0.75 disable_duration_percent = 0.5 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index c7350d39355..33fc69c562f 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1127,8 +1127,14 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/image/effects = new() for(var/datum/modifier/M in modifiers) if(M.mob_overlay_state) - var/image/I = image(icon = 'icons/mob/modifier_effects.dmi', icon_state = M.mob_overlay_state) - effects.overlays += I // Leaving this as overlays += + if(M.icon_override) //VOREStation Edit. Override for the modifer icon. + var/image/I = image(icon = 'icons/mob/modifier_effects_vr.dmi', icon_state = M.mob_overlay_state) + I.color = M.effect_color + effects.overlays += I // Leaving this as overlays += + else + var/image/I = image(icon = 'icons/mob/modifier_effects.dmi', icon_state = M.mob_overlay_state) + I.color = M.effect_color + effects.overlays += I // Leaving this as overlays += overlays_standing[MODIFIER_EFFECTS_LAYER] = effects diff --git a/icons/mob/modifier_effects_vr.dmi b/icons/mob/modifier_effects_vr.dmi new file mode 100644 index 0000000000000000000000000000000000000000..108fff4f968d831fd6d52391211fe88de0627e0c GIT binary patch literal 1128 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 literal 6379 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