From e77ea39458866e91e6ac89115cf1cdad340371a7 Mon Sep 17 00:00:00 2001 From: "C.L" Date: Fri, 9 Sep 2022 22:20:56 -0400 Subject: [PATCH] Adds shield generators. Kinda WIP but it functions ATM. --- .../devices/personal_shield_generator_vr.dm | 364 ++++++++++++++++++ code/modules/mob/_modifiers/modifiers.dm | 4 + code/modules/mob/_modifiers/modifiers_vr.dm | 68 +++- .../mob/living/carbon/human/human_damage.dm | 24 ++ .../mob/living/carbon/human/human_defense.dm | 12 + code/modules/mob/living/living.dm | 23 ++ icons/obj/items_vr.dmi | Bin 5259 -> 6797 bytes vorestation.dme | 1 + 8 files changed, 495 insertions(+), 1 deletion(-) create mode 100644 code/game/objects/items/devices/personal_shield_generator_vr.dm diff --git a/code/game/objects/items/devices/personal_shield_generator_vr.dm b/code/game/objects/items/devices/personal_shield_generator_vr.dm new file mode 100644 index 00000000000..cff54a33d53 --- /dev/null +++ b/code/game/objects/items/devices/personal_shield_generator_vr.dm @@ -0,0 +1,364 @@ +//backpack item +/obj/item/device/personal_shield_generator + name = "personal shield generator" + desc = "A personal shield generator." + icon = 'icons/obj/items_vr.dmi' //Placeholder + icon_state = "shield_pack" //Placeholder + item_state = "defibunit" //Placeholder + slot_flags = SLOT_BACK + force = 5 + throwforce = 6 + preserve_item = 1 + w_class = ITEMSIZE_HUGE //It's a giant shield generator!!! + unacidable = TRUE + origin_tech = list(TECH_BIO = 4, TECH_POWER = 2) //Set this to better stuff later. + action_button_name = "Toggle Shield" + + var/obj/item/weapon/gun/energy/gun/generator/active_weapon + var/obj/item/weapon/cell/device/bcell = null + var/generator_hit_cost = 100 // Power used when a special effect (such as a bullet being blocked) is performed! + var/generator_active_cost = 10 // Power used when turned on. + var/has_weapon = 1 + var/shield_active = 0 // If the shield gen is active. + var/energy_modifier = 25 // 40 damage absorbed per 1000 charge. If the charge used is > the cell's remaining charge, the excess is dealt to the user! + +/obj/item/device/personal_shield_generator/get_cell() + return bcell + +/obj/item/device/personal_shield_generator/New() //starts without a cell for rnd + ..() + if(ispath(bcell)) + bcell = new bcell(src) + + if(has_weapon) + if(ispath(active_weapon)) + active_weapon = new active_weapon(src, src) + active_weapon.power_supply = bcell + else + active_weapon = new(src, src) + active_weapon.power_supply = bcell + else + verbs -= /obj/item/device/personal_shield_generator/verb/weapon_toggle + update_icon() + +/obj/item/device/personal_shield_generator/Destroy() + . = ..() + QDEL_NULL(active_weapon) + QDEL_NULL(bcell) + +/obj/item/device/personal_shield_generator/loaded //starts with a cell + bcell = /obj/item/weapon/cell/device/weapon/recharge + + +/obj/item/device/personal_shield_generator/update_icon() + if(shield_active) + icon_state = "shield_back_active" + else + icon_state = "shield_pack" + +/obj/item/device/personal_shield_generator/examine(mob/user) + . = ..() + if(Adjacent(user)) + . += "The installed cell has has a power rating of [bcell.maxcharge] and is [round(bcell.percent() )]% charged ." + . += "It reads that it can take [bcell.charge/energy_modifier] more damage before the shield goes down." + if(bcell.self_recharge && bcell.charge_amount) + . += "This model is self charging and will take [bcell.maxcharge/bcell.charge_amount] seconds to fully charge from empty." + + +/* //This would be cool, but we need sprites. + cut_overlays() + + if(has_weapon && active_weapon && active_weapon.loc == src) //in case gun gets destroyed somehow. + add_overlay("[initial(icon_state)]-paddles") + if(bcell) + if(bcell.check_charge(generator_hit_cost)) //Can we take a blow? + add_overlay("[initial(icon_state)]-powered") + else if(has_weapon && active_weapon) + if(bcell.check_charge(active_weapon.charge_cost)) //We got enough to go pew pew? + add_overlay("[initial(icon_state)]-powered") + + var/ratio = CEILING(bcell.percent()/25, 1) * 25 + add_overlay("[initial(icon_state)]-charge[ratio]") + else + add_overlay("[initial(icon_state)]-nocell") +*/ + +/obj/item/device/personal_shield_generator/ui_action_click() + toggle_shield() + +/obj/item/device/personal_shield_generator/attack_hand(mob/user) + if(loc == user) + toggle_shield() + else + ..() + +/obj/item/device/personal_shield_generator/AltClick(mob/living/user) + weapon_toggle() + +/obj/item/device/personal_shield_generator/MouseDrop() + if(ismob(src.loc)) + if(!CanMouseDrop(src)) + return + var/mob/M = src.loc + if(!M.unEquip(src)) + return + src.add_fingerprint(usr) + M.put_in_any_hand_if_possible(src) + + +/obj/item/device/personal_shield_generator/attackby(obj/item/weapon/W, mob/user, params) //This should never happen unless admin spawns in an empty one. + if(W == active_weapon) + reattach_gun(user) + else if(istype(W, /obj/item/weapon/cell)) + if(bcell) + to_chat(user, "\The [src] already has a cell.") + else if(!istype(W, /obj/item/weapon/cell/device/weapon)) //Weapon cells only! + to_chat(user, "This cell will not fit in the device.") + else + if(!user.unEquip(W)) + return + W.forceMove(src) + bcell = W + to_chat(user, "You install a cell in \the [src].") + update_icon() + + else if(W.is_screwdriver()) + if(bcell) + if(istype(bcell, /obj/item/weapon/cell/device/weapon/recharge)) //No stealing self charging batteries! + to_chat(user, "You can not remove the cell from \the [src] without destroying the unit.") + return + else + bcell.update_icon() + bcell.forceMove(get_turf(src.loc)) + bcell = null + to_chat(user, "You remove the cell from \the [src].") + update_icon() + else + return ..() + +/* //TODO +/obj/item/device/personal_shield_generator/emag_act(var/remaining_charges, var/mob/user) + if(active_weapon) + . = active_weapon.emag_act(user) + update_icon() + return +*/ + +//Gun stuff + + +/obj/item/device/personal_shield_generator/verb/toggle_shield() + set name = "Toggle Shield" + set category = "Object" + + var/mob/living/carbon/human/user = usr + + if(user.last_special > world.time) + return + user.last_special = world.time + 10 //No spamming! + + if(!bcell || !bcell.check_charge(generator_hit_cost)) + to_chat(user, "You require a charged cell to do this!") + return + + if(!slot_check()) + to_chat(user, "You need to equip [src] before starting the shield up!") + return + else + if(shield_active) + shield_active = !shield_active //Deactivate the shield! + to_chat(user, "You deactive the shield!") + user.remove_modifiers_of_type(/datum/modifier/shield_projection) + STOP_PROCESSING(SSobj, src) + else + shield_active = !shield_active + to_chat(user, "You activate the shield!") + user.add_modifier(/datum/modifier/shield_projection) + START_PROCESSING(SSobj, src) //Let's only bother draining power when we're being used! + update_icon() + +/obj/item/device/personal_shield_generator/verb/weapon_toggle() //Make this work on Alt-Click + set name = "Toggle Gun" + set category = "Object" + + var/mob/living/carbon/human/user = usr + + if(user.last_special > world.time) + return + user.last_special = world.time + 10 //No spamming! + if(!active_weapon) + to_chat(user, "The gun is missing!") + return + + if(active_weapon.loc != src) + reattach_gun(user) //Remove from their hands and back onto the defib unit + return + + if(!slot_check()) + to_chat(user, "You need to equip [src] before taking out [active_weapon].") + else + if(!usr.put_in_hands(active_weapon)) //Detach the gun into the user's hands + to_chat(user, "You need a free hand to hold the gun!") + update_icon() //success + +/obj/item/device/personal_shield_generator/process() + if(shield_active) + bcell.use(generator_active_cost) + if(bcell.charge < generator_hit_cost) //Out of charge... + shield_active = 0 + if(istype(loc, /mob/living/carbon/human)) //We on someone? Tell them it turned off. + var/mob/living/carbon/human/user = loc + to_chat(user, "The shield deactivates.!") + user.remove_modifiers_of_type(/datum/modifier/shield_projection) + STOP_PROCESSING(SSobj, src) + + + +//checks that the base unit is in the correct slot to be used +/obj/item/device/personal_shield_generator/proc/slot_check() + var/mob/M = loc + if(!istype(M)) + return 0 //not equipped + + if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_back) == src) + return 1 + if((slot_flags & SLOT_BELT) && M.get_equipped_item(slot_belt) == src) + return 1 + //RIGSuit compatability. This shouldn't be possible, however, except for select RIGs. + if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_s_store) == src) + return 1 + if((slot_flags & SLOT_BELT) && M.get_equipped_item(slot_s_store) == src) + return 1 + + return 0 + +/obj/item/device/personal_shield_generator/dropped(mob/user) + ..() + reattach_gun(user) //A gun attached to a base unit should never exist outside of their base unit or the mob equipping the base unit + +/obj/item/device/personal_shield_generator/proc/reattach_gun(mob/user) + if(!active_weapon) return + + if(ismob(active_weapon.loc)) + var/mob/M = active_weapon.loc + if(M.drop_from_inventory(active_weapon, src)) + to_chat(user, "\The [active_weapon] snaps back into the main unit.") + else + active_weapon.forceMove(src) + + update_icon() + +/* + Base Unit Subtypes +*/ + +/obj/item/device/personal_shield_generator/belt + name = "personal shield generator" + desc = "A personal shield generator." + icon_state = "shield_back_active" + item_state = "shield_pack" + w_class = ITEMSIZE_LARGE //No putting these in backpacks! + slot_flags = SLOT_BELT + origin_tech = list(TECH_BIO = 5, TECH_POWER = 3) + has_weapon = 0 //No gun with the belt! + +/obj/item/device/personal_shield_generator/belt/loaded + bcell = /obj/item/weapon/cell/device/weapon/recharge + +/obj/item/device/personal_shield_generator/belt/update_icon() + if(shield_active) + icon_state = "shield_back_active" + else + icon_state = "shield_pack" + + +//The gun + +/obj/item/weapon/gun/energy/gun/generator //The gun attached to the personal shield generator. + name = "energy gun" + desc = "Another bestseller of Lawson Arms, the LAEP80 Thor is a versatile energy based pistol, capable of switching between low and high \ + capacity projectile settings. In other words: Stun or Kill." + description_fluff = "Lawson Arms is Hephaestus Industries’ main personal-energy-weapon branding, often sold alongside MarsTech projectile \ + weapons to security and law enforcement agencies." + icon_state = "egunstun" + item_state = null //so the human update icon uses the icon_state instead. + fire_delay = 8 + use_external_power = TRUE + cell_type = null //No cell! It runs off the cell in the shield_gen! + + projectile_type = /obj/item/projectile/beam/stun/med + modifystate = "egunstun" + + firemodes = list( + list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="egunstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 240), + list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="egunkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 480), + ) //Zero charge_cost since it's handled per shot. + + var/obj/item/device/personal_shield_generator/shield_generator //The generator we are linked to! + var/wielded = 0 + var/cooldown = 0 + var/busy = 0 + +/obj/item/weapon/gun/energy/gun/generator/New(newloc, obj/item/device/personal_shield_generator/shield_gen) + ..(newloc) + shield_generator = shield_gen + power_supply = shield_generator.bcell + +/* //Unused. Use for large guns. +/obj/item/weapon/gun/energy/gun/generator/update_held_icon() + var/mob/living/M = loc + if(istype(M) && M.item_is_in_hands(src) && !M.hands_are_full()) + wielded = 1 + name = "[initial(name)] (wielded)" + else + wielded = 0 + name = initial(name) + update_icon() + ..() +*/ + +/obj/item/weapon/gun/energy/gun/generator/proc/can_use(mob/user, mob/M) + if(busy) + return 0 + if(!check_charge(charge_cost)) + to_chat(user, "\The [src] doesn't have enough charge left to do that.") + return 0 + if(!wielded && !isrobot(user)) + to_chat(user, "You need to wield the gun with both hands before you can use it on someone!") + return 0 + if(cooldown) + to_chat(user, "\The [src] are re-energizing!") + return 0 + return 1 + +/* //TODO: Emp act. +/obj/item/weapon/shockpaddles/emp_act(severity) + var/new_safety = rand(0, 1) + if(safety != new_safety) + safety = new_safety + if(safety) + make_announcement("beeps, \"Safety protocols enabled!\"", "notice") + playsound(src, 'sound/machines/defib_safetyon.ogg', 50, 0) + else + make_announcement("beeps, \"Safety protocols disabled!\"", "warning") + playsound(src, 'sound/machines/defib_safetyoff.ogg', 50, 0) + update_icon() + ..() +*/ + +/obj/item/weapon/gun/energy/gun/generator/dropped(mob/user) + ..() //update twohanding + if(shield_generator) + shield_generator.reattach_gun(user) + +/obj/item/weapon/gun/energy/proc/check_charge(var/charge_amt) //In case using any other guns. + return 0 + +/obj/item/weapon/gun/energy/proc/checked_use(var/charge_amt) //In case using any other guns. + return 0 + +/obj/item/weapon/gun/energy/gun/generator/check_charge(var/charge_amt) + return (shield_generator.bcell && shield_generator.bcell.check_charge(charge_amt)) + +/obj/item/weapon/gun/energy/gun/generator/checked_use(var/charge_amt) + return (shield_generator.bcell && shield_generator.bcell.checked_use(charge_amt)) \ No newline at end of file diff --git a/code/modules/mob/_modifiers/modifiers.dm b/code/modules/mob/_modifiers/modifiers.dm index 56422efdf66..2fc4ef03e3f 100644 --- a/code/modules/mob/_modifiers/modifiers.dm +++ b/code/modules/mob/_modifiers/modifiers.dm @@ -64,6 +64,10 @@ var/siemens_coefficient = null // Similar to above two vars but 0 = full protection, to be consistant with siemens numbers everywhere else. var/vision_flags // Vision flags to add to the mob. SEE_MOB, SEE_OBJ, etc. + 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. + var/energy_modifier // How much energy is used when numbers are involed. For values, such as taking damage. Ex: (Damage*energy_modifier) + var/obj/item/weapon/cell/energy_source = null // The source of the above. /datum/modifier/New(var/new_holder, var/new_origin) holder = new_holder diff --git a/code/modules/mob/_modifiers/modifiers_vr.dm b/code/modules/mob/_modifiers/modifiers_vr.dm index a56bc5d2e0a..ab486c3b705 100644 --- a/code/modules/mob/_modifiers/modifiers_vr.dm +++ b/code/modules/mob/_modifiers/modifiers_vr.dm @@ -30,4 +30,70 @@ if(water_floor.depth < 1) //You're not in deep enough water anymore. expire(silent = FALSE) else - expire(silent = FALSE) \ No newline at end of file + expire(silent = FALSE) + + + + + + + + + +/datum/modifier/shield_projection + name = "Shield Projection" + desc = "You are currently protected by a shield, rendering nigh impossible to hit you through conventional means." + + on_created_text = "Your shield generator buzzes on." + on_expired_text = "Your shield generator buzzes off." + mob_overlay_state = "repel_missiles" //Looks alright, I guess. Placeholder. + stacks = MODIFIER_STACK_FORBID //No stacking shields. If you put one one your belt and backpack it won't work. + + siemens_coefficient = 2 //Stun weapons drain 100% charge per damage. They're good at blocking lasers and bullets but not good at blocking stun beams! + incoming_brute_damage_percent = 0 + incoming_fire_damage_percent = 0 + incoming_hal_damage_percent = 0 + energy_based = 1 + energy_cost = 99999 //This is changed to the shield_genertor's energy_cost. + energy_modifier = 50 //This is how much battery is used per damage unit absorbed. Higher damage means higher charge use per damage absorbed. Changed below! + var/obj/item/device/personal_shield_generator/shield_generator //This is the shield generator you're wearing! + + +/datum/modifier/shield_projection/on_applied() + return + +/datum/modifier/shield_projection/on_expire() + return + +/datum/modifier/shield_projection/check_if_valid() //Let's check to make sure you got the stuff and set the vars. + if(ishuman(holder)) //Only humans can use this! + 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) + energy_source = shield_generator.bcell + energy_cost = shield_generator.generator_hit_cost + energy_modifier = shield_generator.energy_modifier + else + expire(silent = TRUE) + 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. + if(!shield_generator || !shield_generator.slot_check()) //No shield to begin with/shield is not on them any longer. + expire(silent = FALSE) + var/shield_efficiency = 1-(energy_source.charge/energy_source.maxcharge) //0 = complete resistance. 1 = no resistance. + incoming_brute_damage_percent = shield_efficiency //Less charge means less resistance! + incoming_fire_damage_percent = shield_efficiency + incoming_hal_damage_percent = shield_efficiency \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index a3554a262f7..e3aa906bf83 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -115,8 +115,12 @@ if(amount > 0) for(var/datum/modifier/M in modifiers) if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_damage_percent if(!isnull(M.incoming_brute_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_brute_damage_percent if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage take_overall_damage(amount, 0) @@ -133,8 +137,12 @@ if(amount > 0) for(var/datum/modifier/M in modifiers) if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_damage_percent if(!isnull(M.incoming_fire_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_fire_damage_percent if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage take_overall_damage(0, amount) @@ -153,8 +161,12 @@ if(amount > 0) for(var/datum/modifier/M in modifiers) if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_damage_percent if(!isnull(M.incoming_brute_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_brute_damage_percent if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage O.take_damage(amount, 0, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) @@ -175,8 +187,12 @@ if(amount > 0) for(var/datum/modifier/M in modifiers) if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_damage_percent if(!isnull(M.incoming_fire_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_fire_damage_percent if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) @@ -497,8 +513,12 @@ This function restores all organs. for(var/datum/modifier/M in modifiers) if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*damage) damage *= M.incoming_damage_percent if(!isnull(M.incoming_brute_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*damage) damage *= M.incoming_brute_damage_percent if(organ.take_damage(damage, 0, sharp, edge, used_weapon)) @@ -510,8 +530,12 @@ This function restores all organs. for(var/datum/modifier/M in modifiers) if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*damage) damage *= M.incoming_damage_percent if(!isnull(M.incoming_brute_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*damage) damage *= M.incoming_fire_damage_percent if(organ.take_damage(0, damage, sharp, edge, used_weapon)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 1988405272f..ce93ed26472 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -37,6 +37,18 @@ emp_act var/armor = getarmor_organ(organ, "bullet") if(!prob(armor/2)) //Even if the armor doesn't stop the bullet from hurting you, it might stop it from embedding. var/hit_embed_chance = P.embed_chance + (P.damage - armor) //More damage equals more chance to embed + + //Modifiers can make bullets less likely to embed! + for(var/datum/modifier/M in modifiers) + if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_cost) //We use energy_cost here for special effects, such as embedding. + hit_embed_chance = hit_embed_chance*M.incoming_damage_percent + if(P.damage_type == BRUTE && (!isnull(M.incoming_brute_damage_percent))) + if(M.energy_based) + M.energy_source.use(M.energy_cost) + hit_embed_chance = hit_embed_chance*M.incoming_brute_damage_percent + if(prob(max(hit_embed_chance, 0))) var/obj/item/weapon/material/shard/shrapnel/SP = new() SP.name = (P.name != "shrapnel")? "[P.name] shrapnel" : "shrapnel" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index cc0d773af26..2fe479ccafc 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -192,8 +192,12 @@ if(amount > 0) for(var/datum/modifier/M in modifiers) if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_damage_percent if(!isnull(M.incoming_brute_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_brute_damage_percent else if(amount < 0) for(var/datum/modifier/M in modifiers) @@ -219,8 +223,12 @@ if(amount > 0) for(var/datum/modifier/M in modifiers) if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_damage_percent if(!isnull(M.incoming_oxy_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_oxy_damage_percent else if(amount < 0) for(var/datum/modifier/M in modifiers) @@ -243,8 +251,12 @@ if(amount > 0) for(var/datum/modifier/M in modifiers) if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_damage_percent if(!isnull(M.incoming_tox_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_tox_damage_percent else if(amount < 0) for(var/datum/modifier/M in modifiers) @@ -273,8 +285,12 @@ if(amount > 0) for(var/datum/modifier/M in modifiers) if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_damage_percent if(!isnull(M.incoming_fire_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_fire_damage_percent else if(amount < 0) for(var/datum/modifier/M in modifiers) @@ -298,8 +314,12 @@ if(amount > 0) for(var/datum/modifier/M in modifiers) if(!isnull(M.incoming_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_damage_percent if(!isnull(M.incoming_clone_damage_percent)) + if(M.energy_based) + M.energy_source.use(M.energy_modifier*amount) amount *= M.incoming_clone_damage_percent else if(amount < 0) for(var/datum/modifier/M in modifiers) @@ -331,6 +351,9 @@ if(status_flags & GODMODE) return 0 //godmode if(amount > 0) for(var/datum/modifier/M in modifiers) + if(M.energy_based && (!isnull(M.incoming_hal_damage_percent) || !isnull(M.disable_duration_percent))) + M.energy_source.use(M.energy_modifier*amount) // Cost of the Damage absorbed. + M.energy_source.use(M.energy_cost) // Cost of the Effect absorbed. if(!isnull(M.incoming_damage_percent)) amount *= M.incoming_damage_percent if(!isnull(M.incoming_hal_damage_percent)) diff --git a/icons/obj/items_vr.dmi b/icons/obj/items_vr.dmi index ca82649d88380c434e50a0941c6be35a551134d5..2c2758763cc471bd73d670d234a6698b05fafb12 100644 GIT binary patch literal 6797 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 D@Y(AF literal 5259 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 diff --git a/vorestation.dme b/vorestation.dme index fb34f310a1c..91f03dda54f 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1199,6 +1199,7 @@ #include "code\game\objects\items\devices\multitool.dm" #include "code\game\objects\items\devices\paicard.dm" #include "code\game\objects\items\devices\paicard_vr.dm" +#include "code\game\objects\items\devices\personal_shield_generator_vr.dm" #include "code\game\objects\items\devices\pipe_painter.dm" #include "code\game\objects\items\devices\powersink.dm" #include "code\game\objects\items\devices\spy_bug.dm"