diff --git a/code/__DEFINES/mobfactions.dm b/code/__DEFINES/mobfactions.dm index 9805d40645e4..097a7214e891 100644 --- a/code/__DEFINES/mobfactions.dm +++ b/code/__DEFINES/mobfactions.dm @@ -21,6 +21,8 @@ #define FACTION_CLOWN "clowns" /// Headslugs #define FACTION_CREATURE "creature" +/// Cats +#define FACTION_CAT "cat" /// Faithless and shadowpeople #define FACTION_FAITHLESS "faithless" /// Gnomes diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index 63aa502c20c9..f455985e6853 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -52,6 +52,12 @@ #define CALIBER_ARROW "arrow" /// The caliber used by the harpoon gun. #define CALIBER_HARPOON "harpoon" +/// The caliber used by the rebar crossbow. +#define CALIBER_REBAR "sharpened rod" +/// The caliber used by the rebar crossbow when forced to hold 2 rods. +#define CALIBER_REBAR_FORCED "sharpened rod" +/// The caliber used by the syndicate rebar crossbow. +#define CALIBER_REBAR_SYNDIE "sharpened rod" /// The caliber used by the meat hook. #define CALIBER_HOOK "hook" /// The caliber used by the changeling tentacle mutation. diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index db1506f1be9b..227c01a69162 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -437,7 +437,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Blowing kisses actually does damage to the victim #define TRAIT_KISS_OF_DEATH "kiss_of_death" /// Syndie kisses can apply burn damage -/* #define TRAIT_SYNDIE_KISS "syndie_kiss" */ +#define TRAIT_SYNDIE_KISS "syndie_kiss" /// Used to activate french kissing #define TRAIT_GARLIC_BREATH "kiss_of_garlic_death" /// Addictions don't tick down, basically they're permanently addicted diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 42ce3dbd17bb..7734282dd4d7 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -291,6 +291,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_JAILBIRD" = TRAIT_JAILBIRD, "TRAIT_JOLLY" = TRAIT_JOLLY, "TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH, + "TRAIT_SYNDIE_KISS" = TRAIT_SYNDIE_KISS, "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index 4e57287dba8e..1c71975d1494 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -198,3 +198,14 @@ tool_paths = list(/obj/item/bikehorn) time = 40 SECONDS category = CAT_EQUIPMENT + +/datum/crafting_recipe/rebar_quiver + name = "Rebar Storage Quiver" + result = /obj/item/storage/bag/rebar_quiver + time = 10 + reqs = list( + /obj/item/tank/internals/oxygen = 1, + /obj/item/stack/cable_coil = 15, + ) + category = CAT_EQUIPMENT + tool_behaviors = list(TOOL_WELDER, TOOL_WIRECUTTER) diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index 15bafe9f9e96..c8f680d36778 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -224,6 +224,33 @@ time = 5 SECONDS category = CAT_WEAPON_RANGED +/datum/crafting_recipe/rebarxbow + name = "Heated Rebar Crossbow" + result = /obj/item/gun/ballistic/rifle/rebarxbow + reqs = list( + /obj/item/stack/rods = 6, + /obj/item/stack/cable_coil = 12, + /obj/item/inducer = 1, + ) + tool_behaviors = list(TOOL_WELDER) + time = 5 SECONDS + category = CAT_WEAPON_RANGED + +/datum/crafting_recipe/rebarxbowforced + name = "Forced Rebar Crossbow" + desc = "A much quicker reload... for a chance of shooting yourself when you fire it." + result = /obj/item/gun/ballistic/rifle/rebarxbow/forced + reqs = list( + /obj/item/gun/ballistic/rifle/rebarxbow = 1, + ) + blacklist = list( + /obj/item/gun/ballistic/rifle/rebarxbow/forced, + /obj/item/gun/ballistic/rifle/rebarxbow/syndie, + ) + tool_behaviors = list(TOOL_CROWBAR) + time = 1 SECONDS + category = CAT_WEAPON_RANGED + /datum/crafting_recipe/pipegun_prime name = "Regal Pipegun" always_available = FALSE diff --git a/code/datums/components/crafting/weapon_ammo.dm b/code/datums/components/crafting/weapon_ammo.dm index e7ad919c1de6..4ecaee1fbc2b 100644 --- a/code/datums/components/crafting/weapon_ammo.dm +++ b/code/datums/components/crafting/weapon_ammo.dm @@ -12,6 +12,36 @@ time = 0.5 SECONDS category = CAT_WEAPON_AMMO +/datum/crafting_recipe/paperball + name = "Paper Ball" + result = /obj/item/ammo_casing/rebar/paperball + reqs = list( + /obj/item/paper = 1, + ) + time = 0.1 SECONDS + category = CAT_WEAPON_AMMO + +/datum/crafting_recipe/rebarsyndie + name = "jagged iron rod" + always_available = FALSE + result = /obj/item/ammo_casing/rebar/syndie + reqs = list( + /obj/item/stack/rods = 1, + ) + tool_behaviors = list(TOOL_WIRECUTTER) + time = 0.5 SECONDS + time = 0.1 SECONDS + category = CAT_WEAPON_AMMO + +/datum/crafting_recipe/healium_bolt + name = "healium crystal crossbow bolt" + result = /obj/item/ammo_casing/rebar/healium + reqs = list( + /obj/item/grenade/gas_crystal/healium_crystal = 1 + ) + time = 0.1 SECONDS + category = CAT_WEAPON_AMMO + /datum/crafting_recipe/pulseslug name = "Pulse Slug Shell" result = /obj/item/ammo_casing/shotgun/pulseslug diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm index e52ac35e186b..3ffd95de4d8a 100644 --- a/code/datums/components/fullauto.dm +++ b/code/datums/components/fullauto.dm @@ -8,8 +8,12 @@ var/turf/target_loc //For dealing with locking on targets due to BYOND engine limitations (the mouse input only happening when mouse moves). var/autofire_stat = AUTOFIRE_STAT_IDLE var/mouse_parameters - var/autofire_shot_delay = 0.3 SECONDS //Time between individual shots. - var/mouse_status = AUTOFIRE_MOUSEUP //This seems hacky but there can be two MouseDown() without a MouseUp() in between if the user holds click and uses alt+tab, printscreen or similar. + /// Time between individual shots. + var/autofire_shot_delay = 0.3 SECONDS + /// This seems hacky but there can be two MouseDown() without a MouseUp() in between if the user holds click and uses alt+tab, printscreen or similar. + var/mouse_status = AUTOFIRE_MOUSEUP + /// Should dual wielding be allowed? + var/allow_akimbo ///windup autofire vars ///Whether the delay between shots increases over time, simulating a spooling weapon @@ -26,7 +30,7 @@ var/timerid COOLDOWN_DECLARE(next_shot_cd) -/datum/component/automatic_fire/Initialize(autofire_shot_delay, windup_autofire, windup_autofire_reduction_multiplier, windup_autofire_cap, windup_spindown) +/datum/component/automatic_fire/Initialize(autofire_shot_delay, windup_autofire, windup_autofire_reduction_multiplier, windup_autofire_cap, windup_spindown, allow_akimbo = TRUE) . = ..() if(!isgun(parent)) return COMPONENT_INCOMPATIBLE @@ -34,6 +38,7 @@ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(wake_up)) if(autofire_shot_delay) src.autofire_shot_delay = autofire_shot_delay + src.allow_akimbo = allow_akimbo if(windup_autofire) src.windup_autofire = windup_autofire src.windup_autofire_reduction_multiplier = windup_autofire_reduction_multiplier @@ -291,21 +296,21 @@ return COMPONENT_AUTOFIRE_ONMOUSEDOWN_BYPASS -/obj/item/gun/proc/do_autofire(datum/source, atom/target, mob/living/shooter, params) +/obj/item/gun/proc/do_autofire(datum/source, atom/target, mob/living/shooter, allow_akimbo, params) SIGNAL_HANDLER if(semicd || shooter.incapacitated()) return NONE if(!can_shoot()) shoot_with_empty_chamber(shooter) return NONE - INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params) + INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, allow_akimbo, params) return COMPONENT_AUTOFIRE_SHOT_SUCCESS //All is well, we can continue shooting. -/obj/item/gun/proc/do_autofire_shot(datum/source, atom/target, mob/living/shooter, params) +/obj/item/gun/proc/do_autofire_shot(datum/source, atom/target, mob/living/shooter, allow_akimbo, params) var/obj/item/gun/akimbo_gun = shooter.get_inactive_held_item() var/bonus_spread = 0 - if(istype(akimbo_gun) && weapon_weight < WEAPON_MEDIUM) + if(istype(akimbo_gun) && weapon_weight < WEAPON_MEDIUM && allow_akimbo) if(akimbo_gun.weapon_weight < WEAPON_MEDIUM && akimbo_gun.can_trigger_gun(shooter)) bonus_spread = dual_wield_spread addtimer(CALLBACK(akimbo_gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, shooter, TRUE, params, null, bonus_spread), 1) diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index 3171bd2d8ef1..b81b55c12cf5 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -24,8 +24,8 @@ update_appearance(UPDATE_ICON) /obj/item/lipstick/update_icon_state() - icon_state = "lipstick[open ? "_uncap" : null]" - inhand_icon_state = "lipstick[open ? "open" : null]" + icon_state = "[initial(icon_state)][open ? "_uncap" : null]" + inhand_icon_state = "[initial(icon_state)][open ? "open" : null]" return ..() /obj/item/lipstick/update_overlays() @@ -65,6 +65,13 @@ desc = "An incredibly potent tube of lipstick made from the venom of the dreaded Yellow Spotted Space Lizard, as deadly as it is chic. Try not to smear it!" lipstick_trait = TRAIT_KISS_OF_DEATH +/obj/item/lipstick/syndie + name = "syndie lipstick" + desc = "Syndicate branded lipstick with a killer dose of kisses. Observe safety regulations!" + icon_state = "slipstick" + lipstick_color = COLOR_SYNDIE_RED + lipstick_trait = TRAIT_SYNDIE_KISS + /obj/item/lipstick/random name = "lipstick" icon_state = "random_lipstick" diff --git a/code/game/objects/items/granters/crafting/rebarxbowsyndie.dm b/code/game/objects/items/granters/crafting/rebarxbowsyndie.dm new file mode 100644 index 000000000000..04cee4e18a79 --- /dev/null +++ b/code/game/objects/items/granters/crafting/rebarxbowsyndie.dm @@ -0,0 +1,13 @@ +/obj/item/book/granter/crafting_recipe/dusting/rebarxbowsyndie_ammo + name = "SYNDICATE REBAR CROSSBOW AMMO CRAFTING MANUAL" + desc = "This book will self destruct upon being read a second time." + crafting_recipe_types = list( + /datum/crafting_recipe/rebarsyndie + ) + uses = 1 + remarks = list( + "AIM FOR THE LEGS TO CRIPPLE YOUR FOES", + "USE A ROD AND WIRECUTTERS TO MAKE BETTER AMMO", + "BE AWARE OF THE SCOPE'S BLIND SPOTS", + "READ THIS BOOK AGAIN TO DUST IT.", + ) diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm index 1b9d9ff27d09..616673f72a93 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -71,3 +71,15 @@ inhand_icon_state = null spawner_type = /mob/living/basic/clown/mutant deliveryamt = 5 + +/obj/item/grenade/spawnergrenade/cat + name = "Catnade" + desc = "You can hear faint meowing and the sounds of claws on metal coming from within." + spawner_type = list(/mob/living/simple_animal/hostile/feral, /mob/living/simple_animal/hostile/feraltabby) + deliveryamt = 5 + +/obj/item/grenade/spawnergrenade/cat/syndicate + name = "Syndicatnade" + desc = "You can hear aggressive meowing and the sounds of sharpened claws on metal coming from within." + spawner_type = /mob/living/simple_animal/hostile/syndicat + deliveryamt = 3 diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index 8f24ae13d876..36f326189fd0 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -548,6 +548,12 @@ color = COLOR_BLACK kiss_type = /obj/projectile/kiss/death +/obj/item/hand_item/kisser/syndie + name = "syndie kiss" + desc = "oooooo you like syndicate ur a syndiekisser" + color = COLOR_SYNDIE_RED + kiss_type = /obj/projectile/kiss/syndie + /obj/projectile/kiss name = "kiss" icon = 'icons/mob/simple/animal.dmi' @@ -559,13 +565,17 @@ damage_type = BRUTE damage = 0 // love can't actually hurt you armour_penetration = 100 // but if it could, it would cut through even the thickest plate + var/silent_blown = FALSE /obj/projectile/kiss/fire(angle, atom/direct_target) - if(firer) + if(firer && !silent_blown) name = "[name] blown by [firer]" + return ..() /obj/projectile/kiss/Impact(atom/A) + def_zone = BODY_ZONE_HEAD // let's keep it PG, people + if(damage > 0 || !isliving(A)) // if we do damage or we hit a nonliving thing, we don't have to worry about a harmless hit because we can't wrongly do damage anyway return ..() @@ -619,7 +629,6 @@ living_target.visible_message("[living_target] [other_msg]", span_userdanger("Whoa! [self_msg]")) /obj/projectile/kiss/on_hit(atom/target, blocked, pierce_hit) - def_zone = BODY_ZONE_HEAD // let's keep it PG, people . = ..() if(isliving(target)) var/mob/living/living_target = target @@ -641,6 +650,18 @@ var/obj/item/organ/internal/heart/dont_go_breakin_my_heart = heartbreakee.get_organ_slot(ORGAN_SLOT_HEART) dont_go_breakin_my_heart.apply_organ_damage(999) +// Based on energy gun characteristics +/obj/projectile/kiss/syndie + name = "syndie kiss" + color = COLOR_SYNDIE_RED + impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser + damage_type = BURN + armor_flag = LASER + armour_penetration = 0 + damage = 25 + wound_bonus = -20 + bare_wound_bonus = 40 + silent_blown = TRUE /obj/projectile/kiss/french name = "french kiss (is that a hint of garlic?)" diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 2ba0ab73eab0..e6893f9d73e4 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -12,6 +12,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ new/datum/stack_recipe("catwalk floor tile", /obj/item/stack/tile/catwalk_tile, 1, 4, 20, category = CAT_TILES), \ new/datum/stack_recipe("stairs frame", /obj/structure/stairs_frame, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ new/datum/stack_recipe("white cane", /obj/item/cane/white, 3, time = 1 SECONDS, one_per_turf = FALSE, category = CAT_TOOLS), \ + new/datum/stack_recipe("sharpened iron rod", /obj/item/ammo_casing/rebar, 1, time = 0.2 SECONDS, one_per_turf = FALSE, category = CAT_WEAPON_AMMO), \ )) /obj/item/stack/rods diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index e994da442d5a..0fa0dbcb662e 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -489,6 +489,7 @@ GLOBAL_LIST_INIT(metalhydrogen_recipes, list( new /datum/stack_recipe("ancient armor", /obj/item/clothing/suit/armor/elder_atmosian, req_amount = 5, res_amount = 1, check_density = FALSE, category = CAT_CLOTHING), new /datum/stack_recipe("ancient helmet", /obj/item/clothing/head/helmet/elder_atmosian, req_amount = 3, res_amount = 1, check_density = FALSE, category = CAT_CLOTHING), new /datum/stack_recipe("metallic hydrogen axe", /obj/item/fireaxe/metal_h2_axe, req_amount = 15, res_amount = 1, check_density = FALSE, category = CAT_WEAPON_MELEE), + new /datum/stack_recipe("metallic hydrogen bolts", /obj/item/ammo_casing/rebar/hydrogen, req_amount = 1, res_amount = 1, check_density = FALSE, category = CAT_WEAPON_AMMO), )) /obj/item/stack/sheet/mineral/metal_hydrogen @@ -507,6 +508,10 @@ GLOBAL_LIST_INIT(metalhydrogen_recipes, list( . = ..() . += GLOB.metalhydrogen_recipes +GLOBAL_LIST_INIT(zaukerite_recipes, list( + new /datum/stack_recipe("zaukerite shard", /obj/item/ammo_casing/rebar/zaukerite, req_amount=1, res_amount=1, category = CAT_WEAPON_AMMO), + )) + /obj/item/stack/sheet/mineral/zaukerite name = "zaukerite" icon_state = "zaukerite" @@ -517,3 +522,7 @@ GLOBAL_LIST_INIT(metalhydrogen_recipes, list( mats_per_unit = list(/datum/material/zaukerite = SHEET_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/mineral/zaukerite material_type = /datum/material/zaukerite + +/obj/item/stack/sheet/mineral/zaukerite/get_main_recipes() + . = ..() + . += GLOB.zaukerite_recipes diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index dc35fcbab53c..88f8851242b9 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -573,4 +573,28 @@ for(var/i in 1 to 40) new /obj/item/ammo_casing/caseless/harpoon(src) +/obj/item/storage/bag/rebar_quiver + name = "Rebar Storage Quiver" + icon = 'icons/obj/weapons/guns/bows/quivers.dmi' + icon_state = "rebar_quiver" + worn_icon_state = "rebar_quiver" + inhand_icon_state = "rebar_quiver" + desc = "A oxygen tank cut in half, used for holding sharpened rods for the rebar crossbow." + slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_SUITSTORE + resistance_flags = FLAMMABLE + +/obj/item/storage/bag/rebar_quiver/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_TINY + atom_storage.max_slots = 10 + atom_storage.max_total_storage = 15 + atom_storage.set_holdable(list( + /obj/item/ammo_casing/rebar, + /obj/item/ammo_casing/rebar/syndie, + /obj/item/ammo_casing/rebar/healium, + /obj/item/ammo_casing/rebar/hydrogen, + /obj/item/ammo_casing/rebar/zaukerite, + /obj/item/ammo_casing/rebar/paperball, + )) + #undef ORE_BAG_BALOON_COOLDOWN diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 869b4c659fd6..84d50c607702 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -334,6 +334,14 @@ icon_state = "syndiebox" illustration = "writing_syndie" +/obj/item/storage/box/syndie_kit/rebarxbowsyndie + name = "Boxed Rebar Crossbow" + desc = "A scoped weapon with low armor penetration, but devestating against flesh. Features instruction manual for making specialty ammo." + +/obj/item/storage/box/syndie_kit/rebarxbowsyndie/PopulateContents() + new /obj/item/book/granter/crafting_recipe/dusting/rebarxbowsyndie_ammo(src) + new /obj/item/gun/ballistic/rifle/rebarxbow/syndie(src) + /obj/item/storage/box/syndie_kit/origami_bundle name = "origami kit" desc = "A box full of a number of rather masterfully engineered paper planes and a manual on \"The Art of Origami\"." diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index c1907409d199..09161eb70ff8 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -30,7 +30,6 @@ /obj/item/gbp_punchcard, /obj/item/implanter, /obj/item/lighter, - /obj/item/lipstick, /obj/item/match, /obj/item/paper, /obj/item/pen, diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index c5c22c997064..f5e75b2855df 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -226,6 +226,22 @@ crate_name = "energy gun crate" crate_type = /obj/structure/closet/crate/secure/plasma +/datum/supply_pack/security/armory/laser_carbine + name = "Laser Carbine Crate" + desc = "Contains three laser carbines, capable of rapidly firing weak lasers." + cost = CARGO_CRATE_VALUE * 9 + contains = list(/obj/item/gun/energy/laser/carbine = 3) + crate_name = "laser carbine crate" + crate_type = /obj/structure/closet/crate/secure/plasma + +/datum/supply_pack/security/armory/disabler_smg + name = "Disabler SMG Crate" + desc = "Contains three disabler SMGs, capable of rapidly firing weak disabler beams." + cost = CARGO_CRATE_VALUE * 7 + contains = list(/obj/item/gun/energy/disabler/smg = 3) + crate_name = "disabler smg crate" + crate_type = /obj/structure/closet/crate/secure/plasma + /datum/supply_pack/security/armory/exileimp name = "Exile Implants Crate" desc = "Contains five Exile implants." diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index cf7aed8ec995..cb7a3dc7947c 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -161,8 +161,11 @@ /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, + /obj/item/gun/ballistic/rifle/boltaction/pipegun, /obj/item/gun/ballistic/rifle/boltaction/pipegun/prime, /obj/item/tank/internals/oxygen, //monkestation edit + /obj/item/storage/bag/rebar_quiver, + /obj/item/gun/ballistic/rifle/rebarxbow, ) resistance_flags = NONE species_exception = list(/datum/species/golem) diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 51a85dbac59d..1388818efbf0 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -469,6 +469,10 @@ /obj/item/pipe_dispenser, /obj/item/storage/bag/construction, /obj/item/t_scanner, + /obj/item/construction/rld, + /obj/item/construction/rtd, + /obj/item/gun/ballistic/rifle/rebarxbow, + /obj/item/storage/bag/rebar_quiver, ) armor_type = /datum/armor/wintercoat_engineering hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 2debc27d52f5..47d142a54871 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -257,6 +257,9 @@ return var/kiss_type = /obj/item/hand_item/kisser + if(HAS_TRAIT(user, TRAIT_SYNDIE_KISS)) + kiss_type = /obj/item/hand_item/kisser/syndie + if(HAS_TRAIT(user, TRAIT_KISS_OF_DEATH)) kiss_type = /obj/item/hand_item/kisser/death diff --git a/code/modules/mob/living/simple_animal/hostile/feral.dm b/code/modules/mob/living/simple_animal/hostile/feral.dm new file mode 100644 index 000000000000..307e31892fbe --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/feral.dm @@ -0,0 +1,76 @@ +/mob/living/simple_animal/hostile/feral + name = "feral cat" + desc = "Kitty!! Wait, no no DON'T BITE-" + health = 30 + maxHealth = 30 + melee_damage_lower = 7 + melee_damage_upper = 15 + icon = 'icons/mob/simple/pets.dmi' + icon_state = "cat2" + icon_living = "cat2" + icon_dead = "cat2_dead" + held_state = "cat2" + speak = list("Meow!", "Esp!", "Purr!", "HSSSSS") + speak_emote = list("purrs", "meows") + emote_hear = list("meows.", "mews.") + emote_see = list("shakes their head.", "shivers.") + speak_chance = 1 + turns_per_move = 5 + mob_size = MOB_SIZE_SMALL + mob_biotypes = MOB_ORGANIC|MOB_BEAST + bodytemp_cold_damage_limit = 200 + bodytemp_heat_damage_limit = 400 + unsuitable_atmos_damage = 0.5 + animal_species = /mob/living/simple_animal/pet/cat + butcher_results = list(/obj/item/food/meat/slab = 1, /obj/item/organ/internal/ears/cat = 1, /obj/item/organ/external/tail/cat = 1, /obj/item/stack/sheet/animalhide/cat = 1) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + faction = list(FACTION_CAT, ROLE_SYNDICATE) + attack_verb_continuous = "claws" + attack_verb_simple = "claw" + attack_sound = 'sound/weapons/slash.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW + footstep_type = FOOTSTEP_MOB_CLAW + +/mob/living/simple_animal/hostile/feraltabby + name = "feral cat" + desc = "Kitty!! Wait, no no DON'T BITE-" + health = 45 + maxHealth = 45 + melee_damage_lower = 10 + melee_damage_upper = 20 + icon = 'icons/mob/simple/pets.dmi' + icon_state = "cat" + icon_living = "cat" + icon_dead = "cat_dead" + held_state = "cat" + speak = list("Meow!", "Esp!", "Purr!", "HSSSSS") + speak_emote = list("purrs", "meows") + emote_hear = list("meows.", "mews.") + emote_see = list("shakes their head.", "shivers.") + speak_chance = 1 + turns_per_move = 5 + mob_size = MOB_SIZE_SMALL + mob_biotypes = MOB_ORGANIC|MOB_BEAST + bodytemp_cold_damage_limit = 200 + bodytemp_heat_damage_limit = 400 + unsuitable_atmos_damage = 0.5 + animal_species = /mob/living/simple_animal/pet/cat + childtype = list(/mob/living/simple_animal/pet/cat/kitten = 1) + butcher_results = list(/obj/item/food/meat/slab = 1, /obj/item/organ/internal/ears/cat = 1, /obj/item/organ/external/tail/cat = 1, /obj/item/stack/sheet/animalhide/cat = 1) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + faction = list(FACTION_CAT, ROLE_SYNDICATE) + attack_verb_continuous = "claws" + attack_verb_simple = "claw" + attack_sound = 'sound/weapons/slash.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW + footstep_type = FOOTSTEP_MOB_CLAW diff --git a/code/modules/mob/living/simple_animal/hostile/syndicat.dm b/code/modules/mob/living/simple_animal/hostile/syndicat.dm new file mode 100644 index 000000000000..0f02bc3cd091 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/syndicat.dm @@ -0,0 +1,46 @@ +/mob/living/simple_animal/hostile/syndicat + name = "Syndie Cat" + desc = "OH GOD! RUN!! IT CAN SMELL THE DISK!" + icon = 'icons/mob/simple/pets.dmi' + icon_state = "syndicat" + icon_living = "syndicat" + icon_dead = "syndicat_dead" + held_state = "syndicat" + speak = list("Meow!", "Esp!", "Purr!", "HSSSSS") + speak_emote = list("purrs", "meows") + emote_hear = list("meows.", "mews.") + emote_see = list("shakes their head.", "shivers.") + speak_chance = 1 + turns_per_move = 5 + mob_size = MOB_SIZE_SMALL + mob_biotypes = MOB_ORGANIC|MOB_BEAST + bodytemp_cold_damage_limit = TCMB + bodytemp_heat_damage_limit = T0C + 40 + unsuitable_atmos_damage = 0 + animal_species = /mob/living/simple_animal/pet/cat + childtype = list(/mob/living/simple_animal/pet/cat/kitten = 1) + butcher_results = list(/obj/item/food/meat/slab = 1, /obj/item/organ/internal/ears/cat = 1, /obj/item/organ/external/tail/cat = 1, /obj/item/stack/sheet/animalhide/cat = 1) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + health = 80 + maxHealth = 80 + melee_damage_lower = 20 + melee_damage_upper = 35 + faction = list(FACTION_CAT, ROLE_SYNDICATE) + can_be_held = TRUE + attack_verb_continuous = "claws" + attack_verb_simple = "claw" + attack_sound = 'sound/weapons/slash.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW + footstep_type = FOOTSTEP_MOB_CLAW + +/mob/living/simple_animal/hostile/syndicat/Initialize(mapload) + . = ..() + var/obj/item/implant/toinstall = list(/obj/item/implant/weapons_auth, /obj/item/implant/explosive) + for(var/obj/item/implant/original_implants as anything in toinstall) + var/obj/item/implant/copied_implant = new original_implants.type + copied_implant.implant(src, silent = TRUE, force = TRUE) diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm index 9d785ba091f2..eb897905f9d2 100644 --- a/code/modules/projectiles/ammunition/ballistic/rifle.dm +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -40,6 +40,69 @@ icon_state = "40mmHE" projectile_type = /obj/projectile/bullet/a40mm +/obj/item/ammo_casing/rebar + name = "Sharpened Iron Rod" + desc = "A Sharpened Iron rod. It's Pointy!" + caliber = CALIBER_REBAR + icon_state = "rod_sharp" + base_icon_state = "rod_sharp" + projectile_type = /obj/projectile/bullet/rebar + +/obj/item/ammo_casing/rebar/syndie + name = "Jagged Iron Rod" + desc = "An Iron rod, with notches cut into it. You really dont want this stuck in you." + caliber = CALIBER_REBAR + icon_state = "rod_jagged" + base_icon_state = "rod_jagged" + projectile_type = /obj/projectile/bullet/rebar/syndie + +/obj/item/ammo_casing/rebar/zaukerite + name = "Zaukerite Sliver" + desc = "A sliver of a zaukerite crystal. Due to its irregular, jagged edges, removal of an embedded zaukerite sliver should only be done by trained surgeons." + caliber = CALIBER_REBAR + icon_state = "rod_zaukerite" + base_icon_state = "rod_zaukerite" + projectile_type = /obj/projectile/bullet/rebar/zaukerite + +/obj/item/ammo_casing/rebar/hydrogen + name = "Metallic Hydrogen Bolt" + desc = "An ultra-sharp rod made from pure metallic hydrogen. Armor may as well not exist." + caliber = CALIBER_REBAR + icon_state = "rod_hydrogen" + base_icon_state = "rod_hydrogen" + projectile_type = /obj/projectile/bullet/rebar/hydrogen + +/obj/item/ammo_casing/rebar/healium + name = "Healium Crystal Bolt" + desc = "Who needs a syringe gun, anyway?" + caliber = CALIBER_REBAR + icon_state = "rod_healium" + base_icon_state = "rod_healium" + projectile_type = /obj/projectile/bullet/rebar/healium + +/obj/item/ammo_casing/rebar/supermatter + name = "Supermatter Bolt" + desc = "Wait, how is the bow capable of firing this without dusting?" + caliber = CALIBER_REBAR + icon_state = "rod_supermatter" + base_icon_state = "rod_supermatter" + projectile_type = /obj/projectile/bullet/rebar/supermatter + +/obj/item/ammo_casing/rebar/paperball + name = "Paper Ball" + desc = "Doink!" + caliber = CALIBER_REBAR + icon_state = "paperball" + base_icon_state = "paperball" + projectile_type = /obj/projectile/bullet/paperball + +/obj/item/ammo_casing/rebar/Initialize(mapload) + . = ..() + AddElement(/datum/element/caseless, TRUE) + +/obj/item/ammo_casing/rebar/update_icon_state() + . = ..() + icon_state = "[base_icon_state]" /obj/item/ammo_casing/a223 name = ".223 bullet casing" diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index cd7aa6e7b9ac..f740447fd8da 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -16,6 +16,11 @@ e_cost = 62.5 select_name = "kill" +/obj/item/ammo_casing/energy/lasergun/carbine + projectile_type = /obj/projectile/beam/laser/carbine + e_cost = 25 // 40 shots + select_name = "kill" + /obj/item/ammo_casing/energy/lasergun/old projectile_type = /obj/projectile/beam/laser e_cost = 200 diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index 77ca619f094a..9e4aea73f6ff 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -25,6 +25,11 @@ fire_sound = 'sound/weapons/taser2.ogg' harmful = FALSE +/obj/item/ammo_casing/energy/disabler/smg + projectile_type = /obj/projectile/beam/disabler/weak + e_cost = 40 + fire_sound = 'sound/weapons/taser3.ogg' + /obj/item/ammo_casing/energy/disabler/hos e_cost = 60 diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm index 67afbed5b41d..1fa7c9d1ab7d 100644 --- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -32,3 +32,20 @@ max_ammo = 1 caliber = CALIBER_HARPOON ammo_type = /obj/item/ammo_casing/caseless/harpoon + +/obj/item/ammo_box/magazine/internal/boltaction/rebarxbow/normal + name = "single round magazine" + max_ammo = 1 + caliber = CALIBER_REBAR + ammo_type = /obj/item/ammo_casing/rebar + +/obj/item/ammo_box/magazine/internal/boltaction/rebarxbow/force + name = "two round magazine" + max_ammo = 2 + caliber = CALIBER_REBAR_FORCED + ammo_type = /obj/item/ammo_casing/rebar + +/obj/item/ammo_box/magazine/internal/boltaction/rebarxbow/syndie + max_ammo = 3 + caliber = CALIBER_REBAR_SYNDIE + ammo_type = /obj/item/ammo_casing/rebar diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 4f05d6a6eff2..7edfc7dab7b9 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -162,6 +162,88 @@ if(.) name = "\improper Regal Obrez" // wear it loud and proud +/obj/item/gun/ballistic/rifle/rebarxbow + name = "Heated Rebar Crossbow" + desc = "Made from an inducer, iron rods, and some wire, this crossbow fires sharpened iron rods, made from the plentiful iron rods found stationwide. \ + Additionally, can fire specialty ammo made from the materials in the atmos crystalizer - zaukerite, metallic hydrogen, and healium crytals all work. \ + Very slow to reload - you can craft the crossbow with a crowbar to try loosen the crossbar, but risks a misfire, or worse..." + icon = 'icons/obj/weapons/guns/ballistic.dmi' + icon_state = "rebarxbow" + inhand_icon_state = "rebarxbow" + worn_icon_state = "rebarxbow" + rack_sound = 'sound/weapons/gun/sniper/rack.ogg' + mag_display = FALSE + empty_indicator = TRUE + bolt_type = BOLT_TYPE_LOCKING + semi_auto = FALSE + internal_magazine = TRUE + can_modify_ammo = FALSE + slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_SUITSTORE + bolt_wording = "bowstring" + magazine_wording = "rod" + cartridge_wording = "rod" + misfire_probability = 25 + initial_caliber = CALIBER_REBAR + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/rebarxbow/normal + fire_sound = 'sound/items/xbow_lock.ogg' + can_be_sawn_off = FALSE + tac_reloads = FALSE + var/draw_time = 3 SECONDS + SET_BASE_PIXEL(0, 0) + +/obj/item/gun/ballistic/rifle/rebarxbow/rack(mob/user = null) + if (bolt_locked) + drop_bolt(user) + return + balloon_alert(user, "bowstring loosened") + playsound(src, rack_sound, rack_sound_volume, rack_sound_vary) + handle_chamber(empty_chamber = FALSE, from_firing = FALSE, chamber_next_round = FALSE) + bolt_locked = TRUE + update_appearance() + +/obj/item/gun/ballistic/rifle/rebarxbow/drop_bolt(mob/user = null) + if(!do_after(user, draw_time, target = src)) + return + playsound(src, bolt_drop_sound, bolt_drop_sound_volume, FALSE) + balloon_alert(user, "bowstring drawn") + chamber_round() + bolt_locked = FALSE + update_appearance() + +/obj/item/gun/ballistic/rifle/rebarxbow/can_shoot() + if (bolt_locked) + return FALSE + return ..() + +/obj/item/gun/ballistic/rifle/rebarxbow/examine(mob/user) + . = ..() + . += "The crossbow is [bolt_locked ? "not ready" : "ready"] to fire." + +/obj/item/gun/ballistic/rifle/rebarxbow/forced + name = "Stressed Rebar Crossbow" + desc = "Some idiot decided that they would risk shooting themselves in the face if it meant they could have a draw this crossbow a bit faster. Hopefully, it was worth it." + // Feel free to add a recipe to allow you to change it back if you would like, I just wasn't sure if you could have two recipes for the same thing. + can_misfire = TRUE + draw_time = 1.5 + misfire_probability = 25 + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/rebarxbow/force + +/obj/item/gun/ballistic/rifle/rebarxbow/syndie + name = "Syndicate Rebar Crossbow" + desc = "The syndicate liked the bootleg rebar crossbow NT engineers made, so they showed what it could be if properly developed. \ + Holds three shots without a chance of exploding, and features a built in scope. Compatable with all known crossbow ammunition." + icon_state = "rebarxbowsyndie" + inhand_icon_state = "rebarxbowsyndie" + worn_icon_state = "rebarxbowsyndie" + w_class = WEIGHT_CLASS_NORMAL + initial_caliber = CALIBER_REBAR + draw_time = 1 + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/rebarxbow/syndie + +/obj/item/gun/ballistic/rifle/rebarxbow/syndie/Initialize(mapload) + . = ..() + AddComponent(/datum/component/scope, range_modifier = 2) //enough range to at least be useful for stealth + /obj/item/gun/ballistic/rifle/boltaction/pipegun name = "pipegun" desc = "An excellent weapon for flushing out tunnel rats and enemy assistants, but its rifling leaves much to be desired." diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index ad5a5ce92795..4ecb1b1d2cd1 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -23,6 +23,16 @@ desc = "An older model of the basic lasergun, no longer used by Nanotrasen's private security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." ammo_x_offset = 3 +/obj/item/gun/energy/laser/carbine + name = "laser carbine" + desc = "A modified laser gun which can shoot far faster, but each shot is far less damaging." + icon_state = "laser_carbine" + ammo_type = list(/obj/item/ammo_casing/energy/lasergun/carbine) + +/obj/item/gun/energy/laser/carbine/Initialize(mapload) + . = ..() + AddComponent(/datum/component/automatic_fire, 0.15 SECONDS, allow_akimbo = FALSE) + /obj/item/gun/energy/laser/retro/old name ="laser gun" icon_state = "retro" diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 635570fbb15c..e099176ddd01 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -40,6 +40,26 @@ overlay_x = 15, \ overlay_y = 10) +/obj/item/gun/energy/disabler/smg + name = "disabler smg" + desc = "An automatic disabler variant, as opposed to the conventional model, boasts a higher ammunition capacity at the cost of slightly reduced beam effectiveness." + icon_state = "disabler_smg" + ammo_type = list(/obj/item/ammo_casing/energy/disabler/smg) + shaded_charge = 1 + +/obj/item/gun/energy/disabler/smg/Initialize(mapload) + . = ..() + AddComponent(/datum/component/automatic_fire, 0.15 SECONDS, allow_akimbo = FALSE) + +/obj/item/gun/energy/disabler/add_seclight_point() + AddComponent(\ + /datum/component/seclite_attachable, \ + light_overlay_icon = 'icons/obj/weapons/guns/flashlights.dmi', \ + light_overlay = "flight", \ + overlay_x = 15, \ + overlay_y = 13, \ + ) + /obj/item/gun/energy/disabler/cyborg name = "cyborg disabler" desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating." diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index cbf47d7cdba7..d47c2c05a5be 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -281,7 +281,7 @@ hitx = target.pixel_x + rand(-8, 8) hity = target.pixel_y + rand(-8, 8) - if((isturf(target) || (isobj(target) && target.density)) && hitsound_wall) + if(isturf(target_turf) && hitsound_wall) var/volume = clamp(vol_by_damage() + 20, 0, 100) if(suppressed) volume = 5 @@ -293,11 +293,7 @@ if(damage > 0 && (damage_type == BRUTE || damage_type == BURN) && iswallturf(target_turf) && prob(75)) var/turf/closed/wall/target_wall = target_turf target_wall.add_dent(WALL_DENT_SHOT, hitx, hity) - if(isturf(target) && hitsound_wall) - var/volume = clamp(vol_by_damage() + 20, 0, 100) - if(suppressed) - volume = 5 - playsound(loc, hitsound_wall, volume, TRUE, -1) + return BULLET_ACT_HIT var/mob/living/living_target = target diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 4ee39edd86ce..c1029ea432de 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -28,6 +28,11 @@ wound_bonus = -30 bare_wound_bonus = 40 +/obj/projectile/beam/laser/carbine + icon_state = "carbine_laser" + impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser + damage = 10 + //overclocked laser, does a bit more damage but has much higher wound power (-0 vs -20) /obj/projectile/beam/laser/hellfire name = "hellfire laser" diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index c0fa5e2766c7..775d3e8e8a72 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -47,6 +47,134 @@ embedding = list(embed_chance=100, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10) wound_falloff_tile = -5 +// Rebar (Rebar Crossbow) +/obj/projectile/bullet/rebar + name = "rebar" + icon_state = "rebar" + damage = 30 + speed = 0.4 + dismemberment = 1 //because a 1 in 100 chance to just blow someones arm off is enough to be cool but also not enough to be reliable + armour_penetration = 10 + wound_bonus = -20 + bare_wound_bonus = 20 + embedding = list("embed_chance" = 60, "fall_chance" = 2, "jostle_chance" = 2, "ignore_throwspeed_threshold" = TRUE, "pain_stam_pct" = 0.4, "pain_mult" = 4, "jostle_pain_mult" = 2, "rip_time" = 10) + embed_falloff_tile = -5 + wound_falloff_tile = -2 + shrapnel_type = /obj/item/ammo_casing/rebar + +/obj/projectile/bullet/rebar/proc/handle_drop(datum/source, obj/item/ammo_casing/rebar/newcasing) + +/obj/projectile/bullet/rebar/syndie + name = "rebar" + icon_state = "rebar" + damage = 55 + speed = 0.4 + dismemberment = 2 //It's a budget sniper rifle. + armour_penetration = 20 //A bit better versus armor. Gets past anti laser armor or a vest, but doesnt wound proc on sec armor. + wound_bonus = 10 + bare_wound_bonus = 20 + embedding = list("embed_chance" = 80, "fall_chance" = 1, "jostle_chance" = 3, "ignore_throwspeed_threshold" = TRUE, "pain_stam_pct" = 0.4, "pain_mult" = 3, "jostle_pain_mult" = 2, "rip_time" = 14) + embed_falloff_tile = -3 + shrapnel_type = /obj/item/ammo_casing/rebar/syndie + +/obj/projectile/bullet/rebar/zaukerite + name = "zaukerite shard" + icon_state = "rebar_zaukerite" + damage = 60 + speed = 0.6 + dismemberment = 10 + damage_type = TOX + eyeblur = 5 + armour_penetration = 20 // not nearly as good, as its not as sharp. + wound_bonus = 10 + bare_wound_bonus = 40 + embedding = list("embed_chance" =100, "fall_chance" = 0, "jostle_chance" = 5, "ignore_throwspeed_threshold" = TRUE, "pain_stam_pct" = 0.8, "pain_mult" = 6, "jostle_pain_mult" = 2, "rip_time" = 30) + embed_falloff_tile = 0 // very spiky. + shrapnel_type = /obj/item/ammo_casing/rebar/zaukerite + +/obj/projectile/bullet/rebar/hydrogen + name = "metallic hydrogen bolt" + icon_state = "rebar_hydrogen" + damage = 40 + speed = 0.6 + dismemberment = 0 //goes through clean. + damage_type = BRUTE + armour_penetration = 30 //very pointy. + projectile_piercing = PASSMOB //felt this might have been a nice compromise for the lower damage for the difficulty of getting it + wound_bonus = -15 + bare_wound_bonus = 10 + embedding = list("embed_chance" = 50, "fall_chance" = 2, "jostle_chance" = 3, "ignore_throwspeed_threshold" = TRUE, "pain_stam_pct" = 0.6, "pain_mult" = 4, "jostle_pain_mult" = 2, "rip_time" =18) + embed_falloff_tile = -3 + shrapnel_type = /obj/item/ammo_casing/rebar/hydrogen + +/obj/projectile/bullet/rebar/healium + name = "healium bolt" + icon_state = "rebar_healium" + damage = 0 + speed = 0.4 + dismemberment = 0 + damage_type = BRUTE + armour_penetration = 100 + wound_bonus = -100 + bare_wound_bonus = -100 + embedding = list(embed_chance = 0) + embed_falloff_tile = -3 + shrapnel_type = /obj/item/ammo_casing/rebar/healium + +/obj/projectile/bullet/rebar/healium/on_hit(atom/target, blocked = 0, pierce_hit) + . = ..() + if(!iscarbon(target)) + return BULLET_ACT_HIT + var/mob/living/breather = target + breather.SetSleeping(3 SECONDS) + breather.adjustFireLoss(-30, updating_health = TRUE, required_bodytype = BODYTYPE_ORGANIC) + breather.adjustToxLoss(-30, updating_health = TRUE, required_biotype = BODYTYPE_ORGANIC) + breather.adjustBruteLoss(-30, updating_health = TRUE, required_bodytype = BODYTYPE_ORGANIC) + breather.adjustOxyLoss(-30, updating_health = TRUE, required_biotype = BODYTYPE_ORGANIC, required_respiration_type = ALL) + + return BULLET_ACT_HIT + + +/obj/projectile/bullet/rebar/supermatter + name = "supermatter bolt" + icon_state = "rebar_supermatter" + damage = 0 + speed = 0.4 + dismemberment = 0 + damage_type = TOX + armour_penetration = 100 + shrapnel_type = /obj/item/ammo_casing/rebar/supermatter + +/obj/projectile/bullet/rebar/supermatter/on_hit(atom/target, blocked = 0, pierce_hit) + . = ..() + if(isliving(target)) + var/mob/living/victim = target + victim.investigate_log("has been dusted by [src].", INVESTIGATE_DEATHS) + dust_feedback(target) + victim.dust() + + else if(!isturf(target)&& !isliving(target)) + dust_feedback(target) + qdel(target) + + return BULLET_ACT_HIT + + +/obj/projectile/bullet/rebar/supermatter/proc/dust_feedback(atom/target) + playsound(get_turf(src), 'sound/effects/supermatter.ogg', 10, TRUE) + visible_message(span_danger("[target] is hit by [src], turning [target.p_them()] to dust in a brilliant flash of light!")) + +/obj/projectile/bullet/paperball + desc = "Doink!" + damage = 1 // It's a damn toy. + range = 10 + shrapnel_type = null + embedding = null + name = "paper ball" + desc = "doink!" + damage_type = BRUTE + icon_state = "paperball" + /obj/projectile/bullet/a223 name = ".223 bullet" damage = 35 diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm index 2f1754428c92..af5b1dc6c2f2 100644 --- a/code/modules/uplink/uplink_items/dangerous.dm +++ b/code/modules/uplink/uplink_items/dangerous.dm @@ -99,3 +99,16 @@ cost = 13 surplus = 50 purchasable_from = ~UPLINK_CLOWN_OPS + +/datum/uplink_item/dangerous/cat + name = "Feral cat grenade" + desc = "This grenade is filled with 5 feral cats in stasis. Upon activation, the feral cats are awoken and unleashed unto unlucky bystanders. WARNING: The cats are not trained to discern friend from foe!" + cost = 5 + item = /obj/item/grenade/spawnergrenade/cat + surplus = 30 + +/datum/uplink_item/dangerous/rebarxbowsyndie + name = "Syndicate Rebar Crossbow" + desc = "A much more proffessional version of the engineer's bootleg rebar crossbow. 3 shot mag, quicker loading, and better ammo. Owners manual included." + item = /obj/item/storage/box/syndie_kit/rebarxbowsyndie + cost = 12 diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index 86492961450a..640685892bbf 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -521,6 +521,14 @@ surplus = 35 purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS +/datum/uplink_item/dangerous/syndicat + name = "Syndie cat grenade" + desc = "This grenade is filled with 3 trained angry cats in special syndicate modsuits. Upon activation, the Syndicate cats are awoken and unleashed unto unlucky bystanders." + item = /obj/item/grenade/spawnergrenade/cat/syndicate + cost = 20 + surplus = 50 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + /datum/uplink_item/explosives/pinata name = "Weapons Grade Pinata Kit" desc = "A pinata filled with both candy and explosives as well as two belts to carry them on, crack it open and see what you get!" diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm index 8a2d71d87665..9ea9661de90f 100644 --- a/code/modules/uplink/uplink_items/stealthy.dm +++ b/code/modules/uplink/uplink_items/stealthy.dm @@ -28,6 +28,12 @@ item = /obj/item/pen/edagger cost = 2 +/datum/uplink_item/stealthy_weapons/slipstick + name = "Syndie Lipstick" + desc = "Stylish way to kiss to death, isn't it syndiekisser?" + item = /obj/item/lipstick/syndie + cost = 12 + /datum/uplink_item/stealthy_weapons/traitor_chem_bottle name = "Poison Kit" desc = "An assortment of deadly chemicals packed into a compact box. Comes with a syringe for more precise application." diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index 9021e8c7dd51..64c5582f515f 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi index e4feec31ca20..4f3192c6e1ee 100644 Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index e5b0ae7984ea..451b083540ef 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index ab01445414a2..12a27b6d5ef5 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/inhands/pets_held_lh.dmi b/icons/mob/inhands/pets_held_lh.dmi index 1a864db13410..4ed721c4a368 100644 Binary files a/icons/mob/inhands/pets_held_lh.dmi and b/icons/mob/inhands/pets_held_lh.dmi differ diff --git a/icons/mob/inhands/pets_held_rh.dmi b/icons/mob/inhands/pets_held_rh.dmi index 39332a7e18e4..3e4404b4faab 100644 Binary files a/icons/mob/inhands/pets_held_rh.dmi and b/icons/mob/inhands/pets_held_rh.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 590e3ff2ed06..4a204d07d351 100644 Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi index 5980b17fbe4a..bf0ae03a3cfe 100644 Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/icons/mob/simple/pets.dmi b/icons/mob/simple/pets.dmi index b35d033f84d1..73594f2f7243 100644 Binary files a/icons/mob/simple/pets.dmi and b/icons/mob/simple/pets.dmi differ diff --git a/icons/obj/cosmetic.dmi b/icons/obj/cosmetic.dmi index 8cb1e38ad88e..ee7a7ce1d04d 100644 Binary files a/icons/obj/cosmetic.dmi and b/icons/obj/cosmetic.dmi differ diff --git a/icons/obj/weapons/guns/ballistic.dmi b/icons/obj/weapons/guns/ballistic.dmi index bdc1c596aee2..b3f48a4b3782 100644 Binary files a/icons/obj/weapons/guns/ballistic.dmi and b/icons/obj/weapons/guns/ballistic.dmi differ diff --git a/icons/obj/weapons/guns/bows/quivers.dmi b/icons/obj/weapons/guns/bows/quivers.dmi index 74a7b4bc8bb5..615f96ee6af6 100644 Binary files a/icons/obj/weapons/guns/bows/quivers.dmi and b/icons/obj/weapons/guns/bows/quivers.dmi differ diff --git a/icons/obj/weapons/guns/energy.dmi b/icons/obj/weapons/guns/energy.dmi index b40c7cc1d48d..275d26493829 100644 Binary files a/icons/obj/weapons/guns/energy.dmi and b/icons/obj/weapons/guns/energy.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index 4e57ac40c940..bfb47f5d0acb 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ diff --git a/monkestation/code/modules/mob/living/basic/pets/cat.dm b/monkestation/code/modules/mob/living/basic/pets/cat.dm index 2777d3c5b02f..44fb0356e29b 100644 --- a/monkestation/code/modules/mob/living/basic/pets/cat.dm +++ b/monkestation/code/modules/mob/living/basic/pets/cat.dm @@ -2,3 +2,8 @@ //. = ..() worn_slot_flags = ITEM_SLOT_HEAD head_icon = 'monkestation/icons/mob/pets_held.dmi' + +/mob/living/simple_animal/hostile/syndicat + //. = ..() + worn_slot_flags = ITEM_SLOT_HEAD + head_icon = 'monkestation/icons/mob/pets_held.dmi' diff --git a/monkestation/icons/mob/pets_held.dmi b/monkestation/icons/mob/pets_held.dmi index 1cf59f1d9bd7..c488f970f72c 100644 Binary files a/monkestation/icons/mob/pets_held.dmi and b/monkestation/icons/mob/pets_held.dmi differ diff --git a/sound/items/xbow_lock.ogg b/sound/items/xbow_lock.ogg new file mode 100644 index 000000000000..b9e53d8515cf Binary files /dev/null and b/sound/items/xbow_lock.ogg differ diff --git a/sound/weapons/taser3.ogg b/sound/weapons/taser3.ogg new file mode 100644 index 000000000000..4bc67cd11af8 Binary files /dev/null and b/sound/weapons/taser3.ogg differ diff --git a/tgstation.dme b/tgstation.dme index b96d59144757..b46e28249be6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2351,6 +2351,7 @@ #include "code\game\objects\items\granters\crafting\death_sandwich.dm" #include "code\game\objects\items\granters\crafting\desserts.dm" #include "code\game\objects\items\granters\crafting\pipegun.dm" +#include "code\game\objects\items\granters\crafting\rebarxbowsyndie.dm" #include "code\game\objects\items\granters\crafting\regal_condor.dm" #include "code\game\objects\items\granters\magic\_spell_granter.dm" #include "code\game\objects\items\granters\magic\barnyard.dm" @@ -4825,11 +4826,13 @@ #include "code\modules\mob\living\simple_animal\friendly\gondola.dm" #include "code\modules\mob\living\simple_animal\friendly\pet.dm" #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" +#include "code\modules\mob\living\simple_animal\hostile\feral.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\illusion.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" #include "code\modules\mob\living\simple_animal\hostile\ooze.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" +#include "code\modules\mob\living\simple_animal\hostile\syndicat.dm" #include "code\modules\mob\living\simple_animal\hostile\vatbeast.dm" #include "code\modules\mob\living\simple_animal\hostile\zombie.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm"