diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 37dfc417d5..92ff2ea28c 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -1,6 +1,6 @@ /obj/item/shield name = "shield" - icon = 'icons/obj/items_and_weapons.dmi' + icon = 'icons/obj/shields.dmi' block_chance = 50 armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) var/transparent = FALSE // makes beam projectiles pass through the shield @@ -23,6 +23,7 @@ custom_materials = list(/datum/material/glass=7500, /datum/material/iron=1000) attack_verb = list("shoved", "bashed") var/cooldown = 0 //shield bash cooldown. based on world.time + var/fixing = /obj/item/stack/sheet/mineral/titanium transparent = TRUE max_integrity = 75 @@ -45,7 +46,7 @@ user.visible_message("[user] bashes [src] with [W]!") playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) cooldown = world.time - else if(istype(W, /obj/item/stack/sheet/mineral/titanium)) + else if(istype(W, fixing)) if(obj_integrity >= max_integrity) to_chat(user, "[src] is already in perfect condition.") else @@ -81,6 +82,23 @@ take_damage(damage) return ..() +/obj/item/shield/riot/laser_proof + name = "laser resistant shield" + desc = "A far more frail shield made of dark glass meant to block lasers but suffers from being being weak to ballistic projectiles." + armor = list("melee" = 30, "bullet" = -10, "laser" = 80, "energy" = 80, "bomb" = -40, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + icon_state = "riot_laser" + item_state = "riot_laser" + lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' + transparent = FALSE + max_integrity = 55 //Weak + +obj/item/shield/riot/bullet_proof + name = "bullet resistant shield" + desc = "A far more frail shield made of resistant plastics and kevlar meant to block ballistics." + armor = list("melee" = 30, "bullet" = 80, "laser" = 0, "energy" = 0, "bomb" = -40, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) + max_integrity = 55 //Weaker + /obj/item/shield/riot/roman name = "\improper Roman shield" desc = "Bears an inscription on the inside: \"Romanes venio domus\"." @@ -89,6 +107,7 @@ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' transparent = FALSE + fixing = /obj/item/stack/sheet/mineral/wood max_integrity = 65 /obj/item/shield/riot/roman/fake @@ -110,6 +129,7 @@ righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' custom_materials = null resistance_flags = FLAMMABLE + fixing = /obj/item/stack/sheet/mineral/wood block_chance = 30 transparent = FALSE max_integrity = 55 @@ -118,58 +138,6 @@ playsound(owner, 'sound/effects/bang.ogg', 50) new /obj/item/stack/sheet/mineral/wood(get_turf(src)) - -/obj/item/shield/energy - name = "energy combat shield" - desc = "A shield that reflects almost all energy projectiles, but is useless against physical attacks. It can be retracted, expanded, and stored anywhere." - lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - w_class = WEIGHT_CLASS_TINY - attack_verb = list("shoved", "bashed") - throw_range = 5 - force = 3 - throwforce = 3 - throw_speed = 3 - var/base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted - var/on_force = 10 - var/on_throwforce = 8 - var/on_throw_speed = 2 - var/active = 0 - var/clumsy_check = TRUE - -/obj/item/shield/energy/Initialize() - . = ..() - icon_state = "[base_icon_state]0" - -/obj/item/shield/energy/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) - if((attack_type & ATTACK_TYPE_PROJECTILE) && is_energy_reflectable_projectile(object)) - block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT - return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT - return ..() - -/obj/item/shield/energy/attack_self(mob/living/carbon/human/user) - if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) - to_chat(user, "You beat yourself in the head with [src]!") - user.take_bodypart_damage(5) - active = !active - icon_state = "[base_icon_state][active]" - - if(active) - force = on_force - throwforce = on_throwforce - throw_speed = on_throw_speed - w_class = WEIGHT_CLASS_BULKY - playsound(user, 'sound/weapons/saberon.ogg', 35, TRUE) - to_chat(user, "[src] is now active.") - else - force = initial(force) - throwforce = initial(throwforce) - throw_speed = initial(throw_speed) - w_class = WEIGHT_CLASS_TINY - playsound(user, 'sound/weapons/saberoff.ogg', 35, TRUE) - to_chat(user, "[src] can now be concealed.") - add_fingerprint(user) - /obj/item/shield/riot/tele name = "telescopic shield" desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." @@ -222,6 +190,7 @@ custom_materials = list(/datum/material/iron = 18000) slot_flags = null block_chance = 35 + max_integrity = 100 //Made of metal welded together its strong but not unkillable force = 10 throwforce = 7 @@ -240,6 +209,12 @@ item_flags = SLOWS_WHILE_IN_HAND transparent = FALSE +/obj/item/shield/riot/tower/swat + name = "swat shield" + desc = "A massive, heavy shield that can block a lot of attacks, can take a lot of abuse before braking." + max_integrity = 175 + block_chance = 50 + /obj/item/shield/riot/implant name = "riot tower shield" desc = "A massive shield that can block a lot of attacks and can take a lot of abuse before breaking." //It cant break unless it is removed from the implant @@ -255,3 +230,55 @@ if(attack_type & ATTACK_TYPE_PROJECTILE) final_block_chance = 60 //Massive shield return ..() + + +/obj/item/shield/energy + name = "energy combat shield" + desc = "A shield that reflects almost all energy projectiles, but is useless against physical attacks. It can be retracted, expanded, and stored anywhere." + lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' + w_class = WEIGHT_CLASS_TINY + attack_verb = list("shoved", "bashed") + throw_range = 5 + force = 3 + throwforce = 3 + throw_speed = 3 + var/base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted + var/on_force = 10 + var/on_throwforce = 8 + var/on_throw_speed = 2 + var/active = 0 + var/clumsy_check = TRUE + +/obj/item/shield/energy/Initialize() + . = ..() + icon_state = "[base_icon_state]0" + +/obj/item/shield/energy/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) + if((attack_type & ATTACK_TYPE_PROJECTILE) && is_energy_reflectable_projectile(object)) + block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT + return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT + return ..() + +/obj/item/shield/energy/attack_self(mob/living/carbon/human/user) + if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) + to_chat(user, "You beat yourself in the head with [src]!") + user.take_bodypart_damage(5) + active = !active + icon_state = "[base_icon_state][active]" + + if(active) + force = on_force + throwforce = on_throwforce + throw_speed = on_throw_speed + w_class = WEIGHT_CLASS_BULKY + playsound(user, 'sound/weapons/saberon.ogg', 35, TRUE) + to_chat(user, "[src] is now active.") + else + force = initial(force) + throwforce = initial(throwforce) + throw_speed = initial(throw_speed) + w_class = WEIGHT_CLASS_TINY + playsound(user, 'sound/weapons/saberoff.ogg', 35, TRUE) + to_chat(user, "[src] can now be concealed.") + add_fingerprint(user) diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 658e108288..80e91aa92f 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -435,9 +435,9 @@ category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE -////////// -//MISC//// -////////// +/////////// +//Shields// +/////////// /datum/design/tele_shield name = "Telescopic Riot Shield" @@ -449,6 +449,30 @@ category = list("Weapons") departmental_flags = DEPARTMENTAL_FLAG_SECURITY +/datum/design/laser_shield + name = "Laser Resistant Riot Shield" + desc = "An advanced riot shield made of darker glasses to prevent laser fire from passing through." + id = "laser_shield" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 4000, /datum/material/silver = 800, /datum/material/titanium = 600, /datum/material/plasma = 5000) + build_path = /obj/item/shield/riot/laser_proof + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/bullet_shield + name = "Telescopic Riot Shield" + desc = "An advanced riot shield made bullet resistant plastics and heavy metals to protect against projectile harm." + id = "bullet_shield" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/silver = 2000, /datum/material/titanium = 1200, /datum/material/plastic = 100 2500) + build_path = /obj/item/shield/riot/bullet_proof + category = list("Weapons") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +////////// +//MISC//// +////////// + /datum/design/suppressor name = "Suppressor" desc = "A reverse-engineered suppressor that fits on most small arms with threaded barrels." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index dafa119873..a34a82c156 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -535,7 +535,7 @@ display_name = "Combat Cybernetic Implants" description = "Military grade combat implants to improve performance." prereq_ids = list("adv_cyber_implants","weaponry","NVGtech","high_efficiency") - design_ids = list("ci-xray", "ci-thermals", "ci-antidrop", "ci-antistun", "ci-thrusters") + design_ids = list("ci-xray", "ci-thermals", "ci-antidrop", "ci-antistun", "ci-thrusters", "ci-shield") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) ////////////////////////Tools//////////////////////// @@ -609,7 +609,7 @@ display_name = "Advanced Weapon Development Technology" description = "Our weapons are breaking the rules of reality by now." prereq_ids = list("adv_engi", "weaponry") - design_ids = list("pin_loyalty") + design_ids = list("pin_loyalty", "laser_shield", "bullet_shield") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) /datum/techweb_node/electric_weapons diff --git a/icons/mob/inhands/equipment/shields_lefthand.dmi b/icons/mob/inhands/equipment/shields_lefthand.dmi index 3f29410f98..24bb824f1d 100644 Binary files a/icons/mob/inhands/equipment/shields_lefthand.dmi and b/icons/mob/inhands/equipment/shields_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/shields_righthand.dmi b/icons/mob/inhands/equipment/shields_righthand.dmi index 2c3f291e43..31d84f480c 100644 Binary files a/icons/mob/inhands/equipment/shields_righthand.dmi and b/icons/mob/inhands/equipment/shields_righthand.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 6ee7873469..b50a0b2df7 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/shields.dmi b/icons/obj/shields.dmi new file mode 100644 index 0000000000..932fb9a89c Binary files /dev/null and b/icons/obj/shields.dmi differ