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