/obj/item/clothing/suit/armor allowed = list(/obj/item/gun/energy,/obj/item/reagent_containers/spray/pepper,/obj/item/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/flashlight/seclite,/obj/item/melee/classic_baton/telescopic,/obj/item/kitchen/knife/combat) body_parts_covered = UPPER_TORSO|LOWER_TORSO cold_protection = UPPER_TORSO|LOWER_TORSO min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT heat_protection = UPPER_TORSO|LOWER_TORSO max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT strip_delay = 60 put_on_delay = 40 max_integrity = 250 resistance_flags = NONE armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 50, ACID = 50) sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/suit.dmi', ) w_class = WEIGHT_CLASS_NORMAL /obj/item/clothing/suit/armor/vest name = "armor" desc = "An armored vest that protects against some damage." sprite_sheets = list( "Grey" = 'icons/mob/clothing/species/grey/suit.dmi', "Vox" = 'icons/mob/clothing/species/vox/suit.dmi' ) icon_state = "armor" item_state = "armor" blood_overlay_type = "armor" dog_fashion = /datum/dog_fashion/back /obj/item/clothing/suit/armor/vest/jacket name = "military jacket" desc = "An old military jacket, it has armoring." icon_state = "militaryjacket" item_state = "militaryjacket" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS /obj/item/clothing/suit/armor/vest/combat name = "combat vest" desc = "An armored vest that protects against some damage." icon_state = "armor-combat" item_state = "bulletproof" blood_overlay_type = "armor" /obj/item/clothing/suit/armor/vest/security name = "security armor" desc = "An armored vest that protects against some damage. This one has a clip for a holobadge." sprite_sheets = list( "Grey" = 'icons/mob/clothing/species/grey/suit.dmi', "Vox" = 'icons/mob/clothing/species/vox/suit.dmi' ) icon_state = "armor" item_state = "armor" var/obj/item/clothing/accessory/holobadge/attached_badge /obj/item/clothing/suit/armor/vest/security/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/clothing/accessory/holobadge)) if(user.unEquip(I)) add_fingerprint(user) I.forceMove(src) attached_badge = I var/datum/action/A = new /datum/action/item_action/remove_badge(src) A.Grant(user) icon_state = "armorsec" user.update_inv_wear_suit() desc = "An armored vest that protects against some damage. This one has [attached_badge] attached to it." to_chat(user, "You attach [attached_badge] to [src].") return ..() /obj/item/clothing/suit/armor/vest/security/attack_self(mob/user) if(attached_badge) add_fingerprint(user) user.put_in_hands(attached_badge) QDEL_LIST_CONTENTS(actions) icon_state = "armor" user.update_inv_wear_suit() desc = "An armored vest that protects against some damage. This one has a clip for a holobadge." to_chat(user, "You remove [attached_badge] from [src].") attached_badge = null return ..() /obj/item/clothing/suit/armor/vest/street_judge name = "judge's security armor" desc = "Perfect for when you're looking to send a message rather than performing your actual duties." icon_state = "streetjudgearmor" /obj/item/clothing/suit/armor/vest/blueshield name = "blueshield's security armor" desc = "An armored vest with the badge of a Blueshield." sprite_sheets = list( "Grey" = 'icons/mob/clothing/species/grey/suit.dmi', "Vox" = 'icons/mob/clothing/species/vox/suit.dmi' ) icon_state = "blueshield" item_state = "blueshield" /obj/item/clothing/suit/armor/vest/bloody name = "bloodied security armor" desc = "A vest drenched in the blood of Greytide. It has seen better days." icon_state = "bloody_armor" item_state = "bloody_armor" sprite_sheets = null /obj/item/clothing/suit/armor/secjacket name = "security jacket" desc = "A sturdy black jacket with reinforced fabric. Bears insignia of NT corporate security." icon_state = "secjacket_open" item_state = "hos" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, RAD = 0, FIRE = 20, ACID = 20) cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS heat_protection = UPPER_TORSO|LOWER_TORSO|ARMS ignore_suitadjust = 0 suit_adjusted = 1 actions_types = list(/datum/action/item_action/openclose) adjust_flavour = "unzip" sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/suit.dmi', "Drask" = 'icons/mob/clothing/species/drask/suit.dmi', "Grey" = 'icons/mob/clothing/species/grey/suit.dmi' ) /obj/item/clothing/suit/armor/secponcho name = "security poncho" desc = "A stylish black and red poncho made with reinforced fabric." icon_state = "security_poncho" item_state = "security_poncho" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 5, BOMB = 10, RAD = 0, FIRE = 20, ACID = 20) cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS heat_protection = UPPER_TORSO|LOWER_TORSO|ARMS sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/suit.dmi', "Drask" = 'icons/mob/clothing/species/drask/suit.dmi', "Grey" = 'icons/mob/clothing/species/grey/suit.dmi' ) /obj/item/clothing/suit/armor/hos name = "armored coat" desc = "A trench coat enhanced with a special alloy for some protection and style." icon_state = "hos" item_state = "hos" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 115, ACID = 450) flags_inv = HIDEJUMPSUIT cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS strip_delay = 80 sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/suit.dmi', "Drask" = 'icons/mob/clothing/species/drask/suit.dmi', "Grey" = 'icons/mob/clothing/species/grey/suit.dmi' ) /obj/item/clothing/suit/armor/hos/alt name = "armored trenchcoat" desc = "A trenchcoat enhanced with a special lightweight kevlar. The epitome of tactical plainclothes." icon_state = "hostrench_open" item_state = "hostrench_open" flags_inv = 0 ignore_suitadjust = 0 suit_adjusted = 1 actions_types = list(/datum/action/item_action/openclose) adjust_flavour = "unbutton" /obj/item/clothing/suit/armor/hos/jensen name = "armored trenchcoat" desc = "A trenchcoat augmented with a special alloy for some protection and style." icon_state = "jensencoat" item_state = "jensencoat" flags_inv = 0 sprite_sheets = null /obj/item/clothing/suit/armor/vest/warden name = "warden's armored jacket" desc = "An armored jacket with silver rank pips and livery." icon_state = "warden_jacket" item_state = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS cold_protection = UPPER_TORSO|LOWER_TORSO|HANDS heat_protection = UPPER_TORSO|LOWER_TORSO|HANDS strip_delay = 70 resistance_flags = FLAMMABLE dog_fashion = null sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/suit.dmi', "Drask" = 'icons/mob/clothing/species/drask/suit.dmi', "Grey" = 'icons/mob/clothing/species/grey/suit.dmi' ) /obj/item/clothing/suit/armor/vest/warden/alt name = "warden's jacket" desc = "A navy-blue armored jacket with blue shoulder designations and '/Warden/' stitched into one of the chest pockets." icon_state = "warden_jacket_alt" //Captain /obj/item/clothing/suit/armor/vest/capcarapace name = "captain's carapace" desc = "An armored vest reinforced with ceramic plates and pauldrons to provide additional protection whilst still offering maximum mobility and flexibility. Issued only to the station's finest, although it does chafe your nipples." icon_state = "captain_carapace" item_state = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO armor = list(MELEE = 50, BULLET = 35, LASER = 50, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = INFINITY, ACID = 450) dog_fashion = null resistance_flags = FIRE_PROOF allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/flash, /obj/item/storage/fancy/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/internals/emergency_oxygen, /obj/item/gun/energy, /obj/item/gun/projectile) sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/suit.dmi', "Drask" = 'icons/mob/clothing/species/drask/suit.dmi', "Grey" = 'icons/mob/clothing/species/grey/suit.dmi', "Kidan" = 'icons/mob/clothing/species/kidan/suit.dmi', ) /obj/item/clothing/suit/armor/vest/capcarapace/jacket name = "captain's jacket" desc = "A less formal jacket for everyday captain use." icon_state = "captain_jacket" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS armor = list(MELEE = 40, BULLET = 20, LASER = 25, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = INFINITY, ACID = 450) flags_inv = HIDEJUMPSUIT /obj/item/clothing/suit/armor/vest/capcarapace/jacket/tunic name = "captain's tunic" desc = "Worn by a Captain to show their class." icon_state = "captain_tunic" /obj/item/clothing/suit/armor/vest/capcarapace/coat name = "captain's formal coat" desc = "For when an armored vest isn't fashionable enough." icon_state = "captain_formal" armor = list(MELEE = 35, BULLET = 15, LASER = 20, ENERGY = 5, BOMB = 10, RAD = 0, FIRE = INFINITY, ACID = 450) body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS /obj/item/clothing/suit/armor/vest/capcarapace/coat/white name = "captain's long white tunic" desc = "An old style captain tunic. Makes you look and feel like you're wearing a cardboard box with arm holes cut in it but looks like it would be great for a wedding... or a funeral." icon_state = "captain_white" sprite_sheets = list( //Drask look fine in the regular human version "Vox" = 'icons/mob/clothing/species/vox/suit.dmi', "Grey" = 'icons/mob/clothing/species/grey/suit.dmi', "Kidan" = 'icons/mob/clothing/species/kidan/suit.dmi', ) /obj/item/clothing/suit/armor/riot name = "riot suit" desc = "A suit of armor with heavy padding to protect against melee attacks. Looks like it might impair movement." icon_state = "riot" item_state = "swat_suit" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS armor = list(MELEE = 50, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, RAD = 0, FIRE = 200, ACID = 200) flags_inv = HIDEJUMPSUIT strip_delay = 80 put_on_delay = 60 sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/suit.dmi', "Drask" = 'icons/mob/clothing/species/drask/suit.dmi', "Grey" = 'icons/mob/clothing/species/grey/suit.dmi' ) /obj/item/clothing/suit/armor/riot/sec name = "security riot suit" desc = "A suit of armor with heavy padding to protect against melee attacks. Looks like it might impair movement. This one has security markings on it." icon_state = "riot-sec" item_state = "swat_suit" /obj/item/clothing/suit/armor/riot/knight name = "plate armour" desc = "A classic suit of plate armour, highly effective at stopping melee attacks." icon_state = "knight_green" item_state = "knight_green" slowdown = 1 sprite_sheets = list("Vox" = 'icons/mob/clothing/species/vox/suit.dmi') hide_tail_by_species = list("Vox") /obj/item/clothing/suit/armor/riot/knight/yellow icon_state = "knight_yellow" item_state = "knight_yellow" /obj/item/clothing/suit/armor/riot/knight/blue icon_state = "knight_blue" item_state = "knight_blue" /obj/item/clothing/suit/armor/riot/knight/red icon_state = "knight_red" item_state = "knight_red" /obj/item/clothing/suit/armor/riot/knight/templar name = "crusader armour" desc = "God wills it!" icon_state = "knight_templar" item_state = "knight_templar" allowed = list(/obj/item/nullrod/claymore, /obj/item/storage/bible) armor = list(MELEE = 15, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, RAD = 0, FIRE = 200, ACID = 200) /obj/item/clothing/suit/armor/vest/durathread name = "durathread vest" desc = "A vest made of durathread with strips of leather acting as trauma plates." icon_state = "durathread" item_state = "durathread" strip_delay = 60 max_integrity = 200 resistance_flags = FLAMMABLE armor = list(MELEE = 10, BULLET = 5, LASER = 20, ENERGY = 5, BOMB = 10, RAD = 0, FIRE = 35, ACID = 50) /obj/item/clothing/suit/armor/bulletproof name = "bulletproof vest" desc = "A bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." icon_state = "bulletproof" item_state = "armor" blood_overlay_type = "armor" body_parts_covered = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS heat_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS armor = list(MELEE = 10, BULLET = 50, LASER = 5, ENERGY = 5, BOMB = 35, RAD = 0, FIRE = 50, ACID = 50) strip_delay = 8 SECONDS put_on_delay = 6 SECONDS sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/suit.dmi', "Grey" = 'icons/mob/clothing/species/grey/suit.dmi' ) /obj/item/clothing/suit/armor/bulletproof/sec name = "security bulletproof vest" desc = "A bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent. This one has security markings on it." icon_state = "bulletproof-sec" item_state = "armor" blood_overlay_type = "armor" /obj/item/clothing/suit/armor/swat name = "SWAT armor" desc = "Tactical SWAT armor." icon_state = "heavy" item_state = "swat_suit" body_parts_covered = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/kitchen/knife/combat) armor = list(MELEE = 35, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 50,RAD = 10, FIRE = INFINITY, ACID = INFINITY) strip_delay = 12 SECONDS resistance_flags = FIRE_PROOF | ACID_PROOF sprite_sheets = list( "Vox" = 'icons/mob/clothing/species/vox/suit.dmi' ) /obj/item/clothing/suit/armor/laserproof name = "ablative armor vest" desc = "A vest that excels in protecting the wearer against energy projectiles. Projects an energy field around the user, allowing a chance of energy projectile deflection no matter where on the user it would hit." icon_state = "armor_reflec" item_state = "armor_reflec" blood_overlay_type = "armor" armor = list(MELEE = 5, BULLET = 5, LASER = 75, ENERGY = 50, BOMB = 0, RAD = 0, FIRE = INFINITY, ACID = INFINITY) var/last_reflect_time var/reflect_cooldown = 5 SECONDS /obj/item/clothing/suit/armor/laserproof/IsReflect() var/mob/living/carbon/human/user = loc if(user.wear_suit != src) return 0 if(world.time - last_reflect_time >= reflect_cooldown) last_reflect_time = world.time return 1 if(world.time - last_reflect_time <= 1) // This is so if multiple energy projectiles hit at once, they're all reflected return 1 return 0 /obj/item/clothing/suit/armor/vest/det_suit name = "armor" desc = "An armored vest with a detective's badge on it." sprite_sheets = list( "Grey" = 'icons/mob/clothing/species/grey/suit.dmi', "Vox" = 'icons/mob/clothing/species/vox/suit.dmi' ) icon_state = "detective-armor" item_state = "armor" blood_overlay_type = "armor" allowed = list(/obj/item/tank/internals/emergency_oxygen,/obj/item/reagent_containers/spray/pepper,/obj/item/flashlight,/obj/item/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/storage/fancy/cigarettes,/obj/item/lighter,/obj/item/detective_scanner,/obj/item/taperecorder) resistance_flags = FLAMMABLE dog_fashion = null //Reactive armor /obj/item/clothing/suit/armor/reactive name = "reactive armor" desc = "Doesn't seem to do much for some reason." var/active = FALSE /// Is the armor disabled, and prevented from reactivating temporarly? var/disabled = FALSE icon_state = "reactiveoff" item_state = "reactiveoff" blood_overlay_type = "armor" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = INFINITY, ACID = INFINITY) actions_types = list(/datum/action/item_action/toggle) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF hit_reaction_chance = 50 /// The cell reactive armor uses. var/obj/item/stock_parts/cell/emproof/reactive/cell /// Cost multiplier for armor. "Stronger" armors use 200 charge, other armors use 120. var/energy_cost = 120 /// Is the armor in the one second grace period, to prevent rubbershot / buckshot from draining significant cell useage. var/in_grace_period = FALSE /obj/item/clothing/suit/armor/reactive/Initialize(mapload, ...) . = ..() cell = new(src) RegisterSignal(src, COMSIG_PARENT_QDELETING, PROC_REF(alert_admins_on_destroy)) /obj/item/clothing/suit/armor/reactive/Destroy() QDEL_NULL(cell) return ..() /obj/item/clothing/suit/armor/reactive/examine(mob/user) . = ..() if(cell) . += "The armor is [round(cell.percent())]% charged." /obj/item/clothing/suit/armor/reactive/attack_self(mob/user) active = !(active) if(disabled) to_chat(user, "[src] is disabled and rebooting!") return if(active) to_chat(user, "[src] is now active.") icon_state = "reactive" item_state = "reactive" else to_chat(user, "[src] is now inactive.") icon_state = "reactiveoff" item_state = "reactiveoff" add_fingerprint(user) user.update_inv_wear_suit() for(var/X in actions) var/datum/action/A = X A.UpdateButtons() /obj/item/clothing/suit/armor/reactive/emp_act(severity) var/emp_power = 5 + (severity-1 ? 0 : 5) if(!disabled) //We want ions to drain power, but we do not want it to drain all power in one go, or be one shot via ion scatter cell.use(energy_cost * 4 / severity) disable(emp_power) ..() /obj/item/clothing/suit/armor/reactive/proc/use_power() if(in_grace_period) return TRUE if(!cell.use(energy_cost)) //No working if cells are dry return FALSE in_grace_period = TRUE addtimer(VARSET_CALLBACK(src, in_grace_period, FALSE), 1 SECONDS) return TRUE /obj/item/clothing/suit/armor/reactive/get_cell() return cell /obj/item/clothing/suit/armor/reactive/proc/disable(disable_time = 0) active = FALSE disabled = TRUE icon_state = "reactiveoff" item_state = "reactiveoff" addtimer(CALLBACK(src, PROC_REF(reboot)), disable_time SECONDS) if(ishuman(loc)) var/mob/living/carbon/human/C = loc C.update_inv_wear_suit() /obj/item/clothing/suit/armor/reactive/proc/reboot() disabled = FALSE active = TRUE icon_state = "reactive" item_state = "reactive" if(ishuman(loc)) var/mob/living/carbon/human/C = loc C.update_inv_wear_suit() /obj/item/clothing/suit/armor/reactive/proc/reaction_check(hitby) if(prob(hit_reaction_chance)) if(isprojectile(hitby)) var/obj/item/projectile/P = hitby if(istype(P, /obj/item/projectile/ion)) return FALSE if(!P.nodamage || P.stun || P.weaken) return TRUE else return TRUE //When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!) /obj/item/clothing/suit/armor/reactive/teleport name = "reactive teleport armor" desc = "Someone separated our Research Director from his own head!" energy_cost = 200 var/tele_range = 6 /obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(!active) return 0 if(reaction_check(hitby) && is_teleport_allowed(owner.z) && use_power()) var/mob/living/carbon/human/H = owner if(do_teleport(owner, owner, 6, safe_turf_pick = TRUE)) //Teleport on the same spot with a precision of 6 gets a random tile near the owner. owner.visible_message("The reactive teleport system flings [H] clear of [attack_text]!") return TRUE return FALSE return FALSE /obj/item/clothing/suit/armor/reactive/fire name = "reactive incendiary armor" desc = "This armor uses the power of a pyro anomaly core to shoot protective jets of fire, in addition to absorbing all damage from fire." heat_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT /obj/item/clothing/suit/armor/reactive/fire/equipped(mob/user, slot) ..() if(slot != SLOT_HUD_OUTER_SUIT) return ADD_TRAIT(user, TRAIT_RESISTHEAT, "[UID()]") /obj/item/clothing/suit/armor/reactive/fire/dropped(mob/user, silent) ..() REMOVE_TRAIT(user, TRAIT_RESISTHEAT, "[UID()]") /obj/item/clothing/suit/armor/reactive/fire/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(!active) return FALSE if(reaction_check(hitby) && use_power()) owner.visible_message("[src] blocks [attack_text], sending out jets of flame!") for(var/mob/living/carbon/C in range(6, owner)) if(C != owner) C.fire_stacks += 8 C.IgniteMob() add_attack_logs(owner, C, "[C] was ignited by [owner]'s [src]", ATKLOG_ALMOSTALL) //lord have mercy on almost_all attack log admins return TRUE return FALSE /obj/item/clothing/suit/armor/reactive/cryo name = "reactive gelidic armor" //is "gelidic" a word? probably not, but it sounds cool desc = "This armor harnesses a cryogenic anomaly core to defend its user from the cold and attacks alike. Its unstable thermal regulation system occasionally vents gasses." /obj/item/clothing/suit/armor/reactive/cryo/equipped(mob/user, slot) ..() if(slot != SLOT_HUD_OUTER_SUIT) return ADD_TRAIT(user, TRAIT_RESISTCOLD, "[UID()]") /obj/item/clothing/suit/armor/reactive/cryo/dropped(mob/user, silent) ..() REMOVE_TRAIT(user, TRAIT_RESISTCOLD, "[UID()]") /obj/item/clothing/suit/armor/reactive/cryo/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(!active) return FALSE if(reaction_check(hitby) && use_power()) owner.visible_message("[src] blocks [attack_text], sending out freezing bolts!") for(var/mob/living/M in oview(get_turf(src), 7)) shootAt(M) if(prob(10)) //rarely vent gasses owner.visible_message("[src] vents excess coolant!") playsound(loc, 'sound/effects/refill.ogg', 50, TRUE) var/turf/simulated/T = get_turf(src) if(istype(T)) T.atmos_spawn_air(LINDA_SPAWN_COLD | LINDA_SPAWN_N2O | LINDA_SPAWN_CO2, 20) disable(rand(1, 3)) return TRUE return FALSE /obj/item/clothing/suit/armor/reactive/cryo/proc/shootAt(atom/movable/target) var/turf/T = get_turf(src) var/turf/U = get_turf(target) if(!T || !U) return var/obj/item/projectile/temp/basilisk/O = new /obj/item/projectile/temp/basilisk(T) playsound(get_turf(src), 'sound/weapons/taser2.ogg', 75, TRUE) O.current = T O.yo = U.y - T.y O.xo = U.x - T.x O.fire() /obj/item/clothing/suit/armor/reactive/stealth name = "reactive stealth armor" desc = "This armor uses an anomaly core combined with holographic projectors to make the user invisible temporarly, and make a fake image of the user." energy_cost = 200 /obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(!active) return FALSE if(reaction_check(hitby) && use_power()) var/mob/living/simple_animal/hostile/illusion/escape/stealth/E = new(owner.loc) E.Copy_Parent(owner, 50) E.GiveTarget(owner) //so it starts running right away E.Goto(owner, E.move_to_delay, E.minimum_distance) owner.visible_message("[owner] is hit by [attack_text] in the chest!") //We pretend to be hit, since blocking it would stop the message otherwise owner.make_invisible() disable(rand(4, 5)) //No blocking while invisible addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living, reset_visibility)), 4 SECONDS) return TRUE /obj/item/clothing/suit/armor/reactive/tesla name = "reactive tesla armor" desc = "This armor uses the power of a flux anomaly core to protect the user in shocking ways." /obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(!active) return FALSE if(reaction_check(hitby) && use_power()) owner.visible_message("[src] blocks [attack_text], sending out arcs of lightning!") for(var/mob/living/M in view(6, owner)) if(M == owner) continue owner.Beam(M,icon_state="lightning[rand(1, 12)]",icon='icons/effects/effects.dmi',time=5) M.adjustFireLoss(20) playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1) add_attack_logs(owner, M, "[M] was shocked by [owner]'s [src]", ATKLOG_ALMOSTALL) disable(rand(2, 5)) // let's not have buckshot set it off 4 times and do 80 burn damage. return TRUE /obj/item/clothing/suit/armor/reactive/repulse name = "reactive repulse armor" desc = "An experimental suit of armor that violently throws back attackers with the power of a gravitational anomaly core." ///How strong the reactive armor is for throwing var/repulse_power = 3 /// How far away are we finding things to throw var/repulse_range = 5 /// What the sparkles looks like var/sparkle_path = /obj/effect/temp_visual/gravpush energy_cost = 200 /obj/item/clothing/suit/armor/reactive/repulse/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) if(!active) return FALSE if(reaction_check(hitby) && use_power()) owner.visible_message("[src] blocks [attack_text], converting the attack into a wave of force!") use_power() var/list/thrown_atoms = list() for(var/turf/T in range(repulse_range, owner)) //Done this way so things don't get thrown all around hilariously. for(var/atom/movable/AM in T) thrown_atoms += AM for(var/atom/movable/AM as anything in thrown_atoms) if(AM == owner || AM.anchored || (ismob(AM) && !isliving(AM))) continue var/throw_target = get_edge_target_turf(owner, get_dir(owner, get_step_away(AM, owner))) var/dist_from_user = get_dist(owner, AM) if(dist_from_user == 0) if(isliving(AM)) var/mob/living/M = AM M.Weaken(6 SECONDS) to_chat(M, "You're slammed into the floor by [owner]'s reactive armor!") add_attack_logs(owner, M, "[M] was thrown by [owner]'s [src]", ATKLOG_ALMOSTALL) else new sparkle_path(get_turf(AM), get_dir(owner, AM)) if(isliving(AM)) var/mob/living/M = AM to_chat(M, "You're thrown back by [owner]'s reactive armor!") add_attack_logs(owner, M, "[M] was thrown by [owner]'s [src]", ATKLOG_ALMOSTALL) INVOKE_ASYNC(AM, TYPE_PROC_REF(/atom/movable, throw_at), throw_target, ((clamp((repulse_power - (clamp(dist_from_user - 2, 0, dist_from_user))), 3, repulse_power))), 1) //So stuff gets tossed around at the same time. disable(rand(2, 5)) return TRUE /// Spawner for random reactive armor /obj/item/clothing/suit/armor/reactive/random name = "Random Reactive Armor" /obj/item/clothing/suit/armor/reactive/random/Initialize(mapload) . = ..() var/spawnpath = pick(subtypesof(/obj/item/clothing/suit/armor/reactive) - /obj/item/clothing/suit/armor/reactive/random) new spawnpath(loc) UnregisterSignal(src, COMSIG_PARENT_QDELETING) return INITIALIZE_HINT_QDEL //All of the armor below is mostly unused /obj/item/clothing/suit/armor/centcomm name = "Cent. Com. armor" desc = "A suit that protects against some damage." icon_state = "centcom" item_state = "centcom" w_class = WEIGHT_CLASS_BULKY body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/gun/energy,/obj/item/melee/baton,/obj/item/restraints/handcuffs,/obj/item/tank/internals/emergency_oxygen) flags = THICKMATERIAL flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT sprite_sheets = null armor = list(MELEE = 200, BULLET = 200, LASER = 50, ENERGY = 50, BOMB = INFINITY, RAD = INFINITY, FIRE = 450, ACID = 450) /obj/item/clothing/suit/armor/heavy name = "heavy armor" desc = "A heavily armored suit that protects against moderate damage." icon_state = "heavy" item_state = "swat_suit" armor = list(MELEE = 200, BULLET = 200, LASER = 50, ENERGY = 50, BOMB = INFINITY, RAD = INFINITY, FIRE = 450, ACID = 450) w_class = WEIGHT_CLASS_BULKY gas_transfer_coefficient = 0.90 flags = THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS slowdown = 3 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT hide_tail_by_species = list("Vox") /obj/item/clothing/suit/armor/tdome armor = list(MELEE = 200, BULLET = 200, LASER = 50, ENERGY = 50, BOMB = INFINITY, RAD = INFINITY, FIRE = 450, ACID = 450) body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT flags = THICKMATERIAL cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS hide_tail_by_species = list("Vox") /obj/item/clothing/suit/armor/tdome/red name = "red Thunderdome armor" desc = "Armor worn by the red Thunderdome team." icon_state = "tdred" item_state = "tdred" /obj/item/clothing/suit/armor/tdome/green name = "green Thunderdome armor" desc = "Armor worn by the green Thunderdome team." icon_state = "tdgreen" item_state = "tdgreen" //Non-hardsuit ERT armor. /obj/item/clothing/suit/armor/vest/ert name = "emergency response team armor" desc = "A set of armor worn by members of the Nanotrasen Emergency Response Team." icon_state = "ertarmor_cmd" item_state = "armor" armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 10, RAD = 0, FIRE = 50, ACID = 50) //Commander /obj/item/clothing/suit/armor/vest/ert/command name = "emergency response team commander armor" desc = "A set of armor worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights." //Security /obj/item/clothing/suit/armor/vest/ert/security name = "emergency response team security armor" desc = "A set of armor worn by security members of the Nanotrasen Emergency Response Team. Has red highlights." icon_state = "ertarmor_sec" /obj/item/clothing/suit/armor/vest/ert/security/paranormal name = "emergency response team paranormal armor" desc = "A set of armor worn by paranormal members of the Nanotrasen Emergency Response Team. Has crusader sigils." icon_state = "knight_templar" item_state = "knight_templar" //Engineer /obj/item/clothing/suit/armor/vest/ert/engineer name = "emergency response team engineer armor" desc = "A set of armor worn by engineering members of the Nanotrasen Emergency Response Team. Has orange highlights." icon_state = "ertarmor_eng" //Medical /obj/item/clothing/suit/armor/vest/ert/medical name = "emergency response team medical armor" desc = "A set of armor worn by medical members of the Nanotrasen Emergency Response Team. Has red and white highlights." icon_state = "ertarmor_med" //Janitorial /obj/item/clothing/suit/armor/vest/ert/janitor name = "emergency response team janitor armor" desc = "A set of armor worn by janitorial members of the Nanotrasen Emergency Response Team. Has red and white highlights." icon_state = "ertarmor_jan" //same defense as basic sec armor /obj/item/clothing/suit/storage/iaa/blackjacket/armored desc = "A snappy dress jacket, reinforced with a layer of armor protecting the torso." allowed = list(/obj/item/tank/internals/emergency_oxygen, /obj/item/gun/projectile/revolver, /obj/item/gun/projectile/automatic/pistol) body_parts_covered = UPPER_TORSO|LOWER_TORSO cold_protection = UPPER_TORSO|LOWER_TORSO min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT heat_protection = UPPER_TORSO|LOWER_TORSO max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT armor = list(MELEE = 15, BULLET = 10, LASER = 15, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 35, ACID = 35) //LAVALAND! /obj/item/clothing/suit/hooded/drake name = "drake armour" icon_state = "dragon" item_state = "dragon" desc = "A suit of armour fashioned from the remains of an ash drake." allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/spear) armor = list(MELEE = 115, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 150, RAD = 25, FIRE = INFINITY, ACID = INFINITY) hoodtype = /obj/item/clothing/head/hooded/drake heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF /obj/item/clothing/head/hooded/drake name = "drake helmet" icon_state = "dragon" item_state = "dragon" desc = "The skull of a dragon." armor = list(MELEE = 115, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 150, RAD = 25, FIRE = INFINITY, ACID = INFINITY) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF flags = BLOCKHAIR flags_cover = HEADCOVERSEYES /obj/item/clothing/suit/hooded/goliath name = "goliath cloak" icon_state = "goliath_cloak" item_state = "goliath_cloak" desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits." allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/organ/internal/regenerative_core/legion, /obj/item/kitchen/knife/combat/survival) armor = list(MELEE = 25, BULLET = 5, LASER = 15, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 75, ACID = 75) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot hoodtype = /obj/item/clothing/head/hooded/goliath body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT /obj/item/clothing/head/hooded/goliath name = "goliath cloak hood" icon_state = "golhood" item_state = "golhood" desc = "A protective & concealing hood." armor = list(MELEE = 25, BULLET = 5, LASER = 15, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 75, ACID = 75) flags = BLOCKHAIR flags_cover = HEADCOVERSEYES body_parts_covered = HEAD heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT /obj/item/clothing/suit/armor/bone name = "bone armor" desc = "A tribal armor plate, crafted from animal bone." icon_state = "bonearmor" item_state = "bonearmor" blood_overlay_type = "armor" armor = list(MELEE = 25, BULLET = 15, LASER = 15, ENERGY = 5, BOMB = 15, RAD = 0, FIRE = 50, ACID = 50) body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT