diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8f2ae5611835..5b431fb48ec4 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -67,6 +67,10 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) ///Sound uses when dropping the item, or when its thrown. var/drop_sound + ///Dripstation edit + ///Sound which is produced when blocking an attack + var/block_sound + var/w_class = WEIGHT_CLASS_NORMAL var/slot_flags = 0 //This is used to determine on which slots an item can fit. pass_flags = PASSTABLE @@ -126,6 +130,11 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) var/block_chance = 0 var/hit_reaction_chance = 0 //If you want to have something unrelated to blocking/armour piercing etc. Maybe not needed, but trying to think ahead/allow more freedom + ///Effect of blocking, Dripstation edit + var/block_effect = /obj/effect/temp_visual/block + var/block_color = COLOR_YELLOW + //Dripstation edit end + //The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot. var/list/slot_equipment_priority = null // for default list, see /mob/proc/equip_to_appropriate_slot() @@ -522,6 +531,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return 1 if(prob(final_block_chance)) owner.visible_message(span_danger("[owner] blocks [attack_text] with [src]!")) + var/owner_turf = get_turf(owner) //dripstation edit + new block_effect(owner_turf, block_color) //dripstation edit + playsound(src, block_sound, 70, vary = TRUE) //dripstation edit return 1 return 0 diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 1a837b6338d3..6bae815ba593 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -29,6 +29,7 @@ max_integrity = 75 var/obj/item/stack/sheet/mineral/repair_material = /obj/item/stack/sheet/mineral/titanium +/* /obj/item/shield/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(transparent && (hitby.pass_flags & PASSGLASS)) return FALSE @@ -37,6 +38,7 @@ if(attack_type == LEAP_ATTACK) final_block_chance = 100 return ..() +*/ /obj/item/shield/riot/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/melee/baton)) @@ -218,11 +220,13 @@ . = ..() icon_state = "[base_icon_state]0" +/* /obj/item/shield/energy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) return 0 /obj/item/shield/energy/IsReflect() return (active) +*/ /obj/item/shield/energy/attack_self(mob/living/carbon/human/user) if(clumsy_check && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 4e4cb41200f2..1b95ca02416e 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -1190,8 +1190,12 @@ /obj/item/storage/belt/sabre/update_icon(updates=ALL) . = ..() + /* Dripstation edit icon_state = "sheath" item_state = "sheath" + */ + icon_state = initial(icon_state) + item_state = initial(item_state) if(contents.len) icon_state += "-sabre" item_state += "-sabre" diff --git a/code/game/objects/items/teleprod.dm b/code/game/objects/items/teleprod.dm index 1fee2b090143..24306b983111 100644 --- a/code/game/objects/items/teleprod.dm +++ b/code/game/objects/items/teleprod.dm @@ -27,6 +27,7 @@ SEND_SIGNAL(M, COMSIG_LIVING_MINOR_SHOCK) do_teleport(M, get_turf(M), 15, channel = TELEPORT_CHANNEL_BLUESPACE) +/* dripstation edit /obj/item/melee/baton/cattleprod/attackby(obj/item/I, mob/user, params)//handles sticking a crystal onto a stunprod to make a teleprod if(istype(I, /obj/item/stack/ore/bluespace_crystal)) if(!cell) @@ -41,3 +42,4 @@ user.visible_message(span_warning("You can't put the crystal onto the stunprod while it has a power cell installed!")) else return ..() +*/ diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 03e843876db3..d2312116abb8 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -297,6 +297,7 @@ /obj/item/gun/energy/disabler) crate_name = "disabler crate" +/* /datum/supply_pack/security/energypistol name = "Energy Pistol Single-Pack" desc = "Contains one energy pistol for personal defense, capable of firing both lethal and nonlethal blasts of light. Requires Security access to open." @@ -304,6 +305,7 @@ access_view = ACCESS_SECURITY small_item = TRUE contains = list(/obj/item/gun/energy/e_gun/mini) +*/ /datum/supply_pack/security/forensics name = "Forensics Crate" @@ -553,6 +555,26 @@ crate_name = "energy gun crate" crate_type = /obj/structure/closet/crate/secure/plasma +//Dripstation +/datum/supply_pack/security/armory/laser //dripstation mooving lethals to the armory + name = "Lethal E-gun Crate" + desc = "Contains three lethal energy guns. Requires Armory access to open." + cost = 1500 + contains = list(/obj/item/gun/energy/e_gun/ancient, + /obj/item/gun/energy/e_gun/ancient, + /obj/item/gun/energy/e_gun/ancient) + crate_name = "lethal e-gun crate" + +/datum/supply_pack/security/armory/reallaser + name = "Lasers Crate" + desc = "Contains three lethal, high-energy laser guns. Requires Armory access to open." + cost = 5000 + contains = list(/obj/item/gun/energy/laser, + /obj/item/gun/energy/laser, + /obj/item/gun/energy/laser) + crate_name = "laser crate" +//Dripstation end + /datum/supply_pack/security/armory/mindshield name = "Mindshield Implants Crate" desc = "Prevent against radical thoughts with three Mindshield implants. Requires Armory access to open." diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 3bf719b03290..25c99c707f28 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -38,6 +38,8 @@ /obj/item/storage/box/flashbangs = 10, /obj/item/storage/box/rubbershot = 10, /obj/effect/spawner/lootdrop/techshell = 10, + /obj/item/storage/box/laserbuckshot = 10, //dripstation edit + /obj/item/storage/belt/sabre/stunsword = 5, //dripstation edit /obj/item/storage/box/lethalshot = 5 ) diff --git a/code/modules/projectiles/boxes_magazines/external/lmg.dm b/code/modules/projectiles/boxes_magazines/external/lmg.dm index 0a5c9ab5599c..f7ce33dbb0ad 100644 --- a/code/modules/projectiles/boxes_magazines/external/lmg.dm +++ b/code/modules/projectiles/boxes_magazines/external/lmg.dm @@ -1,5 +1,6 @@ //L6 SAW +/* Dripstation edit /obj/item/ammo_box/magazine/mm712x82 name = "box magazine (7.12x82mm)" desc = "A 50-round box magazine designed for the L6 Saw." @@ -35,3 +36,4 @@ /obj/item/ammo_box/magazine/mm712x82/update_icon_state() . = ..() icon_state = "a762[sprite_designation]-[round(ammo_count(),10)]" +*/ diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index b655c5b8f016..f567845e2f8e 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -276,7 +276,10 @@ /obj/item/gun/ballistic/automatic/l6_saw/update_overlays() . = ..() + /* dripstation edit . += "l6_door_[cover_open ? "open" : "closed"]" + */ + . += "[initial(item_state)]_door_[cover_open ? "open" : "closed"]" // Dripstation edit /obj/item/gun/ballistic/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 7d2e06ec1d04..2e2b1bb02d88 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -168,6 +168,7 @@ return item_state = "[initial(icon_state)][modifystate ? "[shot.select_name]" : ""][ratio]" +/* Dripstation edit /obj/item/gun/energy/update_overlays() if(QDELETED(src)) return @@ -193,6 +194,7 @@ charge_overlay.pixel_x = ammo_x_offset * (i - 1) charge_overlay.pixel_y = ammo_y_offset * (i - 1) . += charge_overlay +*/ ///Used by update_icon_state() and update_overlays() /obj/item/gun/energy/proc/get_charge_ratio() diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 4c51d5f16d52..d23b8d4a31f8 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -1,3 +1,4 @@ +/* /obj/projectile/energy/electrode name = "electrode" icon_state = "spark" @@ -33,3 +34,4 @@ /obj/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet do_sparks(1, TRUE, src) ..() +*/ \ No newline at end of file diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 2bbd35ed0428..acb2e00cbc6b 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -300,6 +300,7 @@ taste_description = "scorching agony" metabolization_rate = 6 * REAGENTS_METABOLISM +/* dripstation edit /datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, methods=TOUCH, reac_volume) if(!ishuman(M) && !ismonkey(M)) return @@ -341,6 +342,7 @@ victim.Paralyze(14 SECONDS) M.adjustStaminaLoss(5) victim.update_damage_hud() +*/ /datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M) if(prob(15)) diff --git a/modular_dripstation/code/datums/reagent/condensed_capsaicin.dm b/modular_dripstation/code/datums/reagent/condensed_capsaicin.dm new file mode 100644 index 000000000000..a7036ceb3c2a --- /dev/null +++ b/modular_dripstation/code/datums/reagent/condensed_capsaicin.dm @@ -0,0 +1,43 @@ +/datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, methods=TOUCH, reac_volume) + if(!ishuman(M) && !ismonkey(M)) + return + + var/mob/living/carbon/victim = M + if(methods & (TOUCH|VAPOR)) + //check for protection + var/mouth_covered = victim.is_mouth_covered() + var/eyes_covered = victim.is_eyes_covered() + + //actually handle the pepperspray effects + if ( eyes_covered && mouth_covered ) + return + else if ( mouth_covered ) // Reduced effects if partially protected + if(prob(50)) + victim.emote("scream") + victim.adjust_eye_blur(14) + victim.blind_eyes(10) + victim.set_confusion_if_lower(10 SECONDS) + victim.damageoverlaytemp = 75 + victim.Knockdown(6 SECONDS) + M.adjustStaminaLoss(5) + return + else if ( eyes_covered ) // Eye cover is better than mouth cover + if(prob(20)) + victim.emote("cough") + victim.adjust_eye_blur(4) + victim.set_confusion_if_lower(5 SECONDS) + victim.damageoverlaytemp = 50 + M.adjustStaminaLoss(5) + return + else // Oh dear :D + if(prob(60)) + victim.emote("scream") + else + victim.emote("cough") + victim.adjust_eye_blur(14) + victim.blind_eyes(10) + victim.set_confusion_if_lower(12 SECONDS) + victim.damageoverlaytemp = 100 + victim.Knockdown(14 SECONDS) + M.adjustStaminaLoss(10) + victim.update_damage_hud() \ No newline at end of file diff --git a/modular_dripstation/code/game/effects/temporary_visuals/misc.dm b/modular_dripstation/code/game/effects/temporary_visuals/misc.dm index dd1e291b0133..86ae07c04d92 100644 --- a/modular_dripstation/code/game/effects/temporary_visuals/misc.dm +++ b/modular_dripstation/code/game/effects/temporary_visuals/misc.dm @@ -8,4 +8,17 @@ . = ..() pixel_x = rand(-4,0) pixel_y = rand(8,12) - animate(src, pixel_y = pixel_y + 16, alpha = 0, time = duration) \ No newline at end of file + animate(src, pixel_y = pixel_y + 16, alpha = 0, time = duration) + +/obj/effect/temp_visual/block //color is white by default, set to whatever is needed + name = "blocking glow" + icon_state = "block" + icon = 'modular_dripstation/icons/effects/effects.dmi' + duration = 6.7 + +/obj/effect/temp_visual/block/Initialize(mapload, set_color) + if(set_color) + add_atom_colour(set_color, FIXED_COLOUR_PRIORITY) + . = ..() + pixel_x = rand(-12, 12) + pixel_y = rand(-9, 0) \ No newline at end of file diff --git a/modular_dripstation/code/game/effects/temporary_visuals/projectiles.dm b/modular_dripstation/code/game/effects/temporary_visuals/projectiles.dm new file mode 100644 index 000000000000..8f8605a7e9b9 --- /dev/null +++ b/modular_dripstation/code/game/effects/temporary_visuals/projectiles.dm @@ -0,0 +1,44 @@ +/obj/effect/projectile/impact/laser/hitscan + name = "laser impact" + icon_state = "impact_laser_red" + icon = 'modular_dripstation/icons/effects/projectiles/impact.dmi' + +/obj/effect/projectile/tracer/laser/hitscan + name = "laser tracer" + icon_state = "tracer_laser_red" + icon = 'modular_dripstation/icons/effects/projectiles/tracer.dmi' + +/obj/effect/projectile/muzzle/laser/hitscan + name = "laser muzzle" + icon_state = "muzzle_laser_red" + icon = 'modular_dripstation/icons/effects/projectiles/muzzle.dmi' + +/obj/effect/projectile/impact/laser/hitscan/sniper + name = "sniper laser impact" + icon_state = "impact_scc" + icon = 'modular_dripstation/icons/effects/projectiles/impact.dmi' + +/obj/effect/projectile/tracer/laser/hitscan/sniper + name = "sniper laser tracer" + icon_state = "beam_scc" + icon = 'modular_dripstation/icons/effects/projectiles/tracer.dmi' + +/obj/effect/projectile/muzzle/laser/hitscan/sniper + name = "sniper laser muzzle" + icon_state = "muzzle_scc" + icon = 'modular_dripstation/icons/effects/projectiles/muzzle.dmi' + +/obj/effect/projectile/impact/bfg + name = "bfg impact" + icon_state = "bfg" + icon = 'modular_dripstation/icons/effects/projectiles/impact.dmi' + +/obj/effect/projectile/tracer/bfg + name = "bfg tracer" + icon_state = "bfg" + icon = 'modular_dripstation/icons/effects/projectiles/tracer.dmi' + +/obj/effect/projectile/muzzle/bfg + name = "bfg muzzle" + icon_state = "bfg" + icon = 'modular_dripstation/icons/effects/projectiles/muzzle.dmi' \ No newline at end of file diff --git a/modular_dripstation/code/game/objects/items/baton.dm b/modular_dripstation/code/game/objects/items/baton.dm new file mode 100644 index 000000000000..3c0e4764d1a4 --- /dev/null +++ b/modular_dripstation/code/game/objects/items/baton.dm @@ -0,0 +1,285 @@ +/obj/item/melee/baton + var/item_state_updating = TRUE + icon = 'modular_dripstation/icons/obj/weapons/security.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/security_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/security_righthand.dmi' + +/obj/item/melee/baton/update_icon_state() + if(item_state_updating) + if(status) + item_state = "[initial(item_state)]_active" + else + item_state = "[initial(item_state)]" + ..() + +/obj/item/melee/baton/stunsword + icon_state = "stunsword" + item_state = "sword" + slot_flags = null + +/obj/item/melee/baton/stunsword/loaded + preload_cell_type = /obj/item/stock_parts/cell/high + +/obj/item/storage/belt/sabre/stunsword + name = "security sheath" + desc = "A statement on modern practical fashion; this limber black sheath is fitted to a lightened security belt, allowing one to look fashionable with their sword-shaped stun-baton, while of course carrying less things." + icon_state = "secsheath" + item_state = "security" + icon = 'modular_dripstation/icons/obj/weapons/security.dmi' + lefthand_file = 'icons/mob/inhands/equipment/belt_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/belt_righthand.dmi' + +/obj/item/storage/belt/sabre/stunsword/Initialize(mapload) + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 6 + STR.max_combined_w_class = 18 + STR.max_w_class = WEIGHT_CLASS_NORMAL + STR.set_holdable(list( + /obj/item/melee/baton/stunsword, + /obj/item/grenade, + /obj/item/reagent_containers/spray/pepper, + /obj/item/restraints/handcuffs, + /obj/item/assembly/flash/handheld, + /obj/item/clothing/glasses, + /obj/item/ammo_casing/shotgun, + /obj/item/ammo_box, + /obj/item/storage/box/rubbershot, + /obj/item/storage/box/lethalshot, + /obj/item/storage/box/breacherslug, + /obj/item/storage/box/beanbag, + /obj/item/reagent_containers/food/snacks/donut, + /obj/item/kitchen/knife/combat, + /obj/item/flashlight/seclite, + /obj/item/radio, + /obj/item/pinpointer/tracker, + /obj/item/clothing/gloves, + /obj/item/restraints/legcuffs/bola, + /obj/item/gun/ballistic/revolver/tracking, + /obj/item/holosign_creator/security, + /obj/item/shield/riot/tele, + /obj/item/barrier_taperoll/police + )) + +/obj/item/storage/belt/sabre/stunsword/PopulateContents() + SSwardrobe.provide_type(/obj/item/melee/baton/stunsword/loaded, src) + update_appearance(UPDATE_ICON) + +/obj/item/storage/belt/sabre/stunsword/full/PopulateContents() + SSwardrobe.provide_type(/obj/item/melee/baton/stunsword/loaded, src) + SSwardrobe.provide_type(/obj/item/reagent_containers/spray/pepper, src) + SSwardrobe.provide_type(/obj/item/restraints/handcuffs, src) + SSwardrobe.provide_type(/obj/item/grenade/flashbang, src) + SSwardrobe.provide_type(/obj/item/assembly/flash/handheld, src) + SSwardrobe.provide_type(/obj/item/barrier_taperoll/police, src) + update_appearance(UPDATE_ICON) + +/obj/item/melee/baton/cattleprod + icon = 'icons/obj/weapons/baton.dmi' + item_state_updating = FALSE + +/obj/item/melee/baton/cattleprod/tactical + item_state_updating = FALSE + +/obj/item/melee/baton/cattleprod/telecrystalprod + name = "snatcherprod" + desc = "A prod with a telecrystal on the end. It sparks with a desire for theft and subversion." + w_class = WEIGHT_CLASS_NORMAL + icon_state = "telecrystalprod" + item_state = "telecrystalprod" + icon = 'modular_dripstation/icons/obj/weapons/melee.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + slot_flags = null + throw_hit_chance = 50 //I think it'd be funny + +/obj/item/melee/baton/cattleprod/telecrystalprod/attack(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit + ..() + if(status && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) + user.visible_message(span_danger("[user] accidentally hits [user.p_them()]self with [src]!"), \ + span_userdanger("You accidentally hit yourself with [src]!")) + if(do_teleport(src, get_turf(user), 50, channel = TELEPORT_CHANNEL_BLUESPACE)) //Wait, where did it go? + SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) + user.Paralyze(stunforce*3) + deductcharge(hitcost) + else + SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) + user.Paralyze(stunforce*3) + deductcharge(hitcost/4) + return + else + SEND_SIGNAL(M, COMSIG_LIVING_MINOR_SHOCK) + var/obj/item/stuff_in_hand = M.get_active_held_item() + if(!user || !stuff_in_hand || !M.temporarilyRemoveItemFromInventory(stuff_in_hand)) + return + if(user.put_in_inactive_hand(stuff_in_hand)) + stuff_in_hand.loc.visible_message(span_warning("[stuff_in_hand] suddenly appears in [user]'s hand!")) + else + stuff_in_hand.forceMove(user.drop_location()) + stuff_in_hand.loc.visible_message(span_warning("[stuff_in_hand] suddenly appears!")) + +/obj/item/melee/baton/cattleprod/attackby(obj/item/I, mob/user, params)//handles sticking a crystal onto a stunprod to make a teleprod + if(istype(I, /obj/item/stack/ore/bluespace_crystal)) + if(!cell) + var/obj/item/stack/ore/bluespace_crystal/BSC = I + var/obj/item/melee/baton/cattleprod/teleprod/S = new /obj/item/melee/baton/cattleprod/teleprod + remove_item_from_storage(user) + qdel(src) + BSC.use(1) + user.put_in_hands(S) + to_chat(user, span_notice("You place the bluespace crystal firmly into the igniter.")) + else + user.visible_message(span_warning("You can't put the crystal onto the stunprod while it has a power cell installed!")) + else if(istype(I, /obj/item/stack/telecrystal)) + if(!cell) + var/obj/item/stack/telecrystal/TC = I + var/obj/item/melee/baton/cattleprod/telecrystalprod/S = new /obj/item/melee/baton/cattleprod/telecrystalprod + remove_item_from_storage(user) + qdel(src) + TC.use(1) + user.put_in_hands(S) + to_chat(user, span_notice("You place the telecrystal firmly into the igniter.")) + else + user.visible_message(span_warning("You can't put the crystal onto the stunprod while it has a power cell installed!")) + else + return ..() + +/obj/item/melee/shocker + name = "disposable shocker" + desc = "A non-lethal weapon capable of incapacitating any enemy within the range of an electric arc." + icon_state = "shocker" + item_state = "shocker" + icon = 'modular_dripstation/icons/obj/weapons/security.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + force = 0 + throwforce = 0 + w_class = WEIGHT_CLASS_SMALL + ///Active? + var/status = FALSE + ///how many charges left + var/charge = 1 + ///how much stamina damage we deal per hit, this is combatted by energy armor + var/stamina_damage = 30 + ///how long a clown stuns themself for, or someone is stunned for if they are hit to >90 stamina damage + var/stunforce = 4 SECONDS + +/obj/item/melee/shocker/examine(mob/user) + . = ..() + if(status) + . += span_notice("\The [src] is activated.") + else + . += span_warning("\The [src] is deactivated.") + if(charge) + . += span_notice("\The [src] is charged.") + else + . += span_warning("\The [src] is used.") + +/obj/item/melee/baton/update_icon_state() + . = ..() + if(status) + icon_state = "[initial(icon_state)]_active" + else + icon_state = "[initial(icon_state)]" + +/obj/item/melee/shocker/attack_self(mob/user) + if(charge) + status = !status + to_chat(user, span_notice("[src] is now [status ? "on" : "off"].")) + playsound(loc, "sparks", 75, 1, -1) + do_sparks(1, TRUE, src) + else + status = FALSE + to_chat(user, span_warning("[src] have it`s cell depleated!")) + update_appearance(UPDATE_ICON) + add_fingerprint(user) + +/obj/item/melee/shocker/attack(mob/M, mob/living/carbon/human/user) + if(charge && status && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) + user.visible_message(span_danger("[user] accidentally hits [user.p_them()]self with [src]!"), \ + span_userdanger("You accidentally hit yourself with [src]!")) + user.Paralyze(stunforce*3) + return + if(!synth_check(user, SYNTH_RESTRICTED_WEAPON)) + return + if(HAS_TRAIT(user, TRAIT_NO_STUN_WEAPONS)) + to_chat(user, span_warning("You can't seem to remember how this works!")) + return + if(iscyborg(M)) + ..() + return + + if(ishuman(M)) + var/mob/living/carbon/human/L = M + var/datum/martial_art/A = L.check_block() + if(A) + A.handle_counter(L, user) + return + +//I hate myself + if(charge) + if(status) + if(shocker_stun(M, user)) + user.do_attack_animation(M) + else + to_chat(user, span_danger("[src] isn`t active!")) + else + to_chat(user, span_danger("The cell is depleted!")) + ..() + + +/obj/item/melee/shocker/proc/shocker_stun(mob/living/L, mob/user) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that + playsound(L, 'sound/weapons/genhit.ogg', 50, 1) + return 0 + + var/obj/item/bodypart/affecting = L.get_bodypart(user? user.zone_selected : BODY_ZONE_CHEST) + var/armor_block = L.run_armor_check(affecting, ENERGY) //check armor on the limb because that's where we are slapping... + L.apply_damage(stamina_damage, STAMINA, BODY_ZONE_CHEST, armor_block) //...then deal damage to chest so we can't do the old hit-a-disabled-limb-200-times thing, batons are electrical not directed. + + + if(isipc(L)) + var/datum/effect_system/spark_spread/s = new + s.set_up(2, 1, L) + s.start() + + SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) + SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased) + var/current_actual_damage = L.getStaminaLoss() + L.getBruteLoss() + L.getFireLoss() + L.getOxyLoss() + + if(current_actual_damage >= 90) + if(!L.IsParalyzed()) + to_chat(L, span_warning("You muscles seize, making you collapse!")) + else + L.Paralyze(stunforce) + L.adjust_jitter(20 SECONDS) + L.apply_effect(EFFECT_STUTTER, stunforce) + else if(current_actual_damage > 70) + L.adjust_jitter(10 SECONDS) + L.apply_effect(10 SECONDS, EFFECT_KNOCKDOWN) + L.apply_effect(EFFECT_STUTTER, stunforce) + else if(current_actual_damage >= 20) + L.adjust_jitter(5 SECONDS) + L.apply_effect(5 SECONDS, EFFECT_KNOCKDOWN) + L.apply_effect(EFFECT_STUTTER, stunforce) + + if(user) + L.lastattacker = user.real_name + L.lastattackerckey = user.ckey + L.visible_message(span_danger("[user] has stunned [L] with [src]!"), \ + span_userdanger("[user] has stunned you with [src]!")) + log_combat(user, L, "stunned") + + charge -= 1 + playsound(loc, 'modular_dripstation/sound/weapons/taser.ogg', 40, 0, -5) + status = FALSE + update_appearance(UPDATE_ICON) + + return TRUE + +/obj/item/melee/shocker/emp_act(severity) + . = ..() + if (!(. & EMP_PROTECT_SELF)) + charge = 0 \ No newline at end of file diff --git a/modular_dripstation/code/game/objects/items/errata.dm b/modular_dripstation/code/game/objects/items/errata.dm new file mode 100644 index 000000000000..93fe649c9e09 --- /dev/null +++ b/modular_dripstation/code/game/objects/items/errata.dm @@ -0,0 +1,198 @@ +/obj/item/melee/errata + name = "\improper Errata" + desc = "Glorious nippon steel, folded 1000 times." + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/back.dmi' + icon_state = "errata" + item_state = "errata" + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + pickup_sound = 'modular_dripstation/sound/weapons/Katana_Select01.ogg' + drop_sound = 'modular_dripstation/sound/weapons/metal_drop.ogg' + flags_1 = CONDUCT_1 + obj_flags = UNIQUE_RENAME + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK + sharpness = SHARP_EDGED + force = 20 + throw_speed = 4 + throw_range = 5 + throwforce = 12 + block_chance = 40 + armour_penetration = 50 + hitsound = 'sound/weapons/bladeslice.ogg' + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_parry.ogg' + block_color = COLOR_RED + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "diced", "cut") + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + +/obj/item/melee/errata/Initialize() + . = ..() + AddComponent(/datum/component/butchering, 25, 90, 5) //Not made for scalping victims, but will work nonetheless + +/obj/item/melee/errata/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(attack_type == PROJECTILE_ATTACK) + final_block_chance = block_chance / 2 //Pretty good... + if(prob(final_block_chance)) + if(istype(hitby, /obj/projectile/bullet)) + owner.visible_message(span_danger("[attack_text] hits [owner]'s [src], while he cuts the air, splitting the bullet in half!")) + else + owner.visible_message(span_danger("[owner] blocks [attack_text] with [src]!")) + playsound(src, block_sound, 70, vary = TRUE) + return 1 + return 0 + +/obj/item/melee/errata/attack(atom/target, blocked = FALSE) + if(iscarbon(target)) + var/mob/living/carbon/M = target + if(prob(10)) + M.adjust_fire_stacks(2) + M.ignite_mob() + if(M.fire_stacks > 0) + var/fire_force = 35 + force = fire_force + ..() + + +/obj/item/melee/errata/on_exit_storage(datum/component/storage/concrete/S) + var/obj/item/storage/belt/errata/B = S.real_location() + if(istype(B)) + playsound(B, 'modular_dripstation/sound/weapons/Katana_Select02.ogg', 25, TRUE) + +/obj/item/melee/errata/on_enter_storage(datum/component/storage/concrete/S) + var/obj/item/storage/belt/errata/B = S.real_location() + if(istype(B)) + playsound(B, 'modular_dripstation/sound/weapons/blade_sheath.ogg', 25, TRUE) + +/obj/item/melee/errata/suicide_act(mob/user) + if(prob(50)) + user.visible_message("[user] carves deep into [user.p_their()] torso! It looks like [user.p_theyre()] trying to commit seppuku...") + else + user.visible_message("[user] carves a grid into [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit sudoku...") + return (BRUTELOSS) + +/obj/item/storage/belt/errata + name = "nanoforged blade sheath" + desc = "It yearns to bath in the blood of your enemies... but you hold it back!" + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/belt.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + icon_state = "errata_sheath" + item_state = "errata_sheath" + w_class = WEIGHT_CLASS_BULKY + force = 3 + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + var/primed = FALSE + var/dash_sound = 'modular_dripstation/sound/weapons/unsheathed_blade.ogg' + var/beam_effect = "blood_beam" + var/phasein = /obj/effect/temp_visual/dir_setting/cult/phase + var/phaseout = /obj/effect/temp_visual/dir_setting/cult/phase + +/obj/item/storage/belt/errata/Initialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 1 + STR.max_w_class = WEIGHT_CLASS_BULKY + STR.set_holdable(list( + /obj/item/melee/errata + )) + +/obj/item/storage/belt/errata/examine(mob/user) + . = ..() + if(length(contents)) + . += "Use [src] in-hand to prime for an opening strike." + . += "Alt-click it to quickly draw the blade." + +/obj/item/storage/belt/errata/AltClick(mob/user) + if(!iscarbon(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)) || primed) + return + if(length(contents)) + var/obj/item/I = contents[1] + playsound(user, dash_sound, 25, TRUE) + user.visible_message("[user] swiftly draws \the [I].", "You draw \the [I].") + user.put_in_hands(I) + update_icon() + else + to_chat(user, "[src] is empty!") + +/obj/item/storage/belt/errata/attack_self(mob/user) + if(!iscarbon(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + if(length(contents)) + if(primed) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) + playsound(user, 'sound/items/sheath.ogg', 25, TRUE) + to_chat(user, "You return your stance.") + primed = FALSE + update_icon() + else + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) + playsound(user, 'sound/items/unsheath.ogg', 25, TRUE) + user.visible_message("[user] grips the blade within [src] and primes to attack.", "You take an opening stance...", "You hear a weapon being drawn...") + primed = TRUE + update_icon() + else + to_chat(user, "[src] is empty!") + +/obj/item/storage/belt/errata/afterattack(atom/A, mob/living/user, proximity_flag, params) + . = ..() + if(primed && length(contents)) + var/obj/item/I = contents[1] + if(!user.put_in_inactive_hand(I)) + to_chat(user, "You need a free hand!") + return + if(!(A in view(user.client.view, user))) + return + var/datum/component/storage/CP = GetComponent(/datum/component/storage) + CP.locked = FALSE + primed = FALSE + update_icon() + primed_attack(A, user) + if(CanReach(A, I)) + I.melee_attack_chain(user, A, params) + user.swap_hand() + +/obj/item/storage/belt/errata/proc/primed_attack(atom/target, mob/living/user) + var/turf/end = get_turf(user) + var/turf/start = get_turf(user) + var/obj/spot1 = new phaseout(start, user.dir) + var/halt = FALSE + // Stolen dash code + for(var/T in getline(start, get_turf(target))) + var/turf/tile = T + for(var/mob/living/victim in tile) + if(victim != user) + playsound(victim, 'sound/weapons/bladeslice.ogg', 10, TRUE) + victim.take_bodypart_damage(15) + // Unlike actual ninjas, we stop noclip-dashing here. + if(isclosedturf(T)) + halt = TRUE + for(var/obj/O in tile) + // We ignore mobs as we are cutting through them + if(!O.CanPass(user, tile)) + halt = TRUE + if(halt) + break + else + end = T + user.forceMove(end) // YEET + playsound(start, dash_sound, 35, TRUE) + var/obj/spot2 = new phasein(end, user.dir) + spot1.Beam(spot2, beam_effect, time=20) + user.visible_message("In a flash of red, [user] draws [user.p_their()] blade!", "You dash forward while drawing your weapon!", "You hear a blade slice through the air at impossible speeds!") + +/obj/item/storage/belt/errata/update_icon_state() + . = ..() + icon_state = "errata_sheath" + item_state = "errata_sheath" + if(contents.len) + if(primed) + icon_state += "-primed" + else + icon_state += "-blade" + item_state += "-sabre" + +/obj/item/storage/belt/errata/PopulateContents() + new /obj/item/melee/errata(src) + update_appearance(UPDATE_ICON) diff --git a/modular_dripstation/code/game/objects/items/implants/mindshield.dm b/modular_dripstation/code/game/objects/items/implants/mindshield.dm index 5fc76bbb9d0e..d426df8113bb 100644 --- a/modular_dripstation/code/game/objects/items/implants/mindshield.dm +++ b/modular_dripstation/code/game/objects/items/implants/mindshield.dm @@ -52,6 +52,12 @@ name = "implant case - 'High Quality Mindshield'" imp_type = /obj/item/implant/mindshield/centcom +/obj/item/implant/mindshield/centcom/proc/toggle_activation(status = TRUE) + active = status + to_chat(imp_in, "You feel a faint click as [name] [active ? "activates" : "deactivates"]") + implant_visible_as = "[active ? "hud_imp_loyal_ert" : null]" + imp_in.sec_hud_set_implants() + /////Syndicate variants///// /////Syndicate agent variant///// /obj/item/implant/mindshield/tot diff --git a/modular_dripstation/code/game/objects/items/melee/energy.dm b/modular_dripstation/code/game/objects/items/melee/energy.dm new file mode 100644 index 000000000000..30bf5d80ce0c --- /dev/null +++ b/modular_dripstation/code/game/objects/items/melee/energy.dm @@ -0,0 +1,93 @@ +/obj/item/melee/transforming/energy + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_block_blade.ogg' + block_color = COLOR_BLUE + +/obj/item/melee/transforming/energy/axe + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + block_color = COLOR_RED + +/obj/item/melee/transforming/energy/sword + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + +/obj/item/holo/esword + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_block_blade.ogg' + +/obj/item/toy/sword + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_block_blade.ogg' + +/obj/item/melee/transforming/energy/sword/saber + slot_flags = ITEM_SLOT_BELT + var/slot_flags_transform = ITEM_SLOT_BELT + +/obj/item/melee/transforming/energy/sword/saber/transform_weapon(mob/living/user, supress_message_text) + . = ..() + if(. && active) + slot_flags = null + if(. && !active) + slot_flags = slot_flags_transform + +/obj/item/melee/transforming/energy/sword/saber/sabre + name = "energy sabre" + desc = "A powerful energy-based hardlight blade that is easily stored when not in use. Used by boarding parties." + icon_state = "esaber0" + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + +/obj/item/melee/transforming/energy/sword/saber/sabre/transform_weapon(mob/living/user, supress_message_text) + . = ..() + if(. && active && saber_color) + icon_state = "esaber[saber_color]" + +/obj/item/melee/transforming/energy/sword/nt + name = "hardlight blade" + desc = "A powerful energy-based hardlight blade that is easily stored when not in use. NT property." + icon_state = "ntesword0" + icon_state_on = "ntesword1" + item_state = "sword0" + icon_state_on = "swordblue" + saber_color = null + light_color = "#40ceff" + +/obj/item/melee/transforming/energy/machete + name = "energy machete" + desc = "A powerful energy-based hardlight sword that is easily stored when not in use. Used by Cybersun strike teams." + icon_state = "machete_cybersun" + item_state = "machete_cybersun" + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/belt.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + force = 10 + force_on = 40 + throwforce = 5 + throwforce_on = 30 + hitsound = 'sound/weapons/bladeslice.ogg' + flags_1 = CONDUCT_1 + armour_penetration = 60 + block_chance = 30 + light_color = "#a52019" + +/obj/item/melee/transforming/energy/machete/transform_weapon(mob/living/user, supress_message_text) + . = ..() + if(.) + if(active) + icon_state = "[initial(icon_state)]_active" + item_state = "[initial(item_state)]_active" + START_PROCESSING(SSobj, src) + else + icon_state = initial(icon_state) + item_state = initial(item_state) + STOP_PROCESSING(SSobj, src) + set_light_on(active) + +/obj/item/melee/transforming/energy/machete/unknown + name = "alien energy machete" + desc = "A powerful energy-based hardlight sword that is easily stored when not in use. Used by alien parties." + icon_state = "machete_energy" + item_state = "machete_energy" + light_color = "#6600cc" diff --git a/modular_dripstation/code/game/objects/items/projectiles/guns/ballistic/rifle.dm b/modular_dripstation/code/game/objects/items/projectiles/guns/ballistic/rifle.dm deleted file mode 100644 index c0ace431eb21..000000000000 --- a/modular_dripstation/code/game/objects/items/projectiles/guns/ballistic/rifle.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/item/gun/ballistic/rifle/boltaction/brand_new - desc = "A brand new Mosin Nagant issued by Nanotrasen for their interns. You would rather not to damage it." - icon_state = "mosinprime" - item_state = "mosinprime" - sawn_desc = "A sawn-off Brand New Nagant... Doing this was a sin, I hope you're happy. \ - You are now probably one of the few people in the universe to ever hold a \"Brand New Obrez\". \ - Even thinking about that name combination makes you ill." - icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' - worn_icon = 'modular_dripstation/icons/mob/clothing/guns_on_back.dmi' - lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' - righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' - -/obj/item/gun/ballistic/rifle/boltaction/brand_new/sawoff(mob/user) - . = ..() - if(.) - name = "\improper Brand New Obrez" // wear it loud and proud - -/obj/item/gun/ballistic/rifle/boltaction/qmrifle - name = "\improper 'Forbidden' precision rifle" - desc = "Modernized boltaction rifle, the frame feels robust as cargotech liver. \ - This thing was probably built with a conversion kit from a shady NTnet site. \ -

\ - BRAND NEW: Cannot be sawn off." - icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' - worn_icon = 'modular_dripstation/icons/mob/clothing/guns_on_back.dmi' - lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' - righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' - icon_state = "mosintactical" - item_state = "mosintactical" - can_be_sawn_off = FALSE diff --git a/modular_dripstation/code/game/objects/items/shield.dm b/modular_dripstation/code/game/objects/items/shield.dm new file mode 100644 index 000000000000..2693cf5a77ff --- /dev/null +++ b/modular_dripstation/code/game/objects/items/shield.dm @@ -0,0 +1,139 @@ +/obj/item/shield + var/antithrow_bonus = 30 + var/leap_block = TRUE + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_block_shield.ogg' + +/obj/item/shield/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(transparent && (hitby.pass_flags & PASSGLASS)) + return FALSE + if(attack_type == THROWN_PROJECTILE_ATTACK) + final_block_chance += antithrow_bonus + if(attack_type == LEAP_ATTACK) + final_block_chance = leap_block + return ..() + +/obj/item/shield/riot + icon = 'modular_dripstation/icons/obj/weapons/shield.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/back.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/shield_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/shield_righthand.dmi' + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_block_shield.ogg' + +/obj/item/shield/riot/robust + name = "riot control shield" + desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder. This one is pretty robust." + max_integrity = 100 + slowdown = 0 + block_chance = 60 + slot_flags = null + icon_state = "riot_robust" + item_state = "riot_robust" + +/obj/item/shield/riot/robust/nt + name = "NT riot control shield" + desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder. This one is pretty robust. Has Nanotrasen logo on it." + icon_state = "riot_robust_nt" + item_state = "riot_robust_nt" + +/obj/item/shield/riot/roman + icon = 'icons/obj/shields.dmi' + worn_icon = 'icons/mob/clothing/back.dmi' + +/obj/item/shield/riot/roman + icon = 'icons/obj/shields.dmi' + worn_icon = 'icons/mob/clothing/back.dmi' + +/obj/item/shield/riot/buckler + icon = 'icons/obj/shields.dmi' + worn_icon = 'icons/mob/clothing/back.dmi' + +/obj/item/shield/riot/goliath + icon = 'icons/obj/shields.dmi' + worn_icon = 'icons/mob/clothing/back.dmi' + +/obj/item/shield/riot/tele + icon = 'icons/obj/shields.dmi' + worn_icon = 'icons/mob/clothing/back.dmi' + +/obj/item/shield/bulletproof + name = "bulletproof shield" + desc = "A shield adept at blocking physical projectiles from connecting with the torso of the shield wielder." + icon_state = "metal" + item_state = "metal" + icon = 'modular_dripstation/icons/obj/weapons/shield.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/back.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/shield_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/shield_righthand.dmi' + max_integrity = 200 + transparent = FALSE + antithrow_bonus = 0 + force = 15 + throwforce = 20 + throw_speed = 1 + throw_range = 2 + +/obj/item/shield/bulletproof/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(istype(hitby, /obj/projectile/bullet)) + final_block_chance += 30 + return ..() + +/obj/item/shield/bulletproof/proc/shatter(mob/living/carbon/human/owner) + playsound(owner, 'sound/effects/bang.ogg', 100) + new /obj/item/stack/sheet/metal((get_turf(src)), 5) + +/obj/item/shield/bulletproof/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) + if(!damage) + return ..() + var/dam = damage + if(attack_type == PROJECTILE_ATTACK && !istype(hitby, /obj/projectile/bullet)) + dam += damage + if (atom_integrity <= dam) + var/turf/T = get_turf(owner) + T.visible_message(span_warning("[hitby] destroys [src]!")) + shatter(owner) + qdel(src) + return FALSE + take_damage(dam) + return ..() + +/obj/item/shield/energy + base_icon_state = "syndieeshield" + icon = 'modular_dripstation/icons/obj/weapons/shield.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/shield_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/shield_righthand.dmi' + block_chance = 40 + antithrow_bonus = 0 + block_sound = 'modular_dripstation/sound/shield_drained.ogg' + block_color = COLOR_RED + +/obj/item/shield/energy/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) + if(istype(hitby, /obj/projectile/bullet)) + var/obj/projectile/bullet/P = hitby + if(P.damage >= 30 || P.armour_penetration >= 30) + var/turf/T = get_turf(owner) + T.visible_message(span_warning("The sheer force from [P] passes through the [src]!")) + var/datum/effect_system/spark_spread/sparks = new + sparks.set_up(5, 1, T) + playsound(T, 'sound/effects/empulse.ogg', 100) + return 0 + return ..() + return 0 + +/obj/item/shield/energy/IsReflect() + return (active*(block_chance+35)/100) + +/obj/item/shield/energy/advanced + base_icon_state = "eshield" + icon = 'modular_dripstation/icons/obj/weapons/shield.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/shield_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/shield_righthand.dmi' + block_chance = 65 + block_color = COLOR_BLUE + +/obj/item/shield/energy/bananium + base_icon_state = "bananaeshield" + icon = 'modular_dripstation/icons/obj/weapons/shield.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/shield_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/shield_righthand.dmi' + block_color = COLOR_YELLOW diff --git a/modular_dripstation/code/game/objects/items/storage/boxes.dm b/modular_dripstation/code/game/objects/items/storage/boxes.dm index 953252e0e445..9bad7d2385e7 100644 --- a/modular_dripstation/code/game/objects/items/storage/boxes.dm +++ b/modular_dripstation/code/game/objects/items/storage/boxes.dm @@ -1,3 +1,59 @@ +//ammo boxes for 12mm +/obj/item/storage/box/beanbag + icon_state = "beanbag_box" + icon = 'modular_dripstation/icons/obj/ammo.dmi' + +/obj/item/storage/box/slug + name = "box of slug shotgun shots" + desc = "A box full of slug lethal shots designed for shotguns. The box itself is designed for holding any kind of shotgun shell." + icon_state = "slug_box" + icon = 'modular_dripstation/icons/obj/ammo.dmi' + illustration = null + +/obj/item/storage/box/slug/Initialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 7 + STR.set_holdable(list(/obj/item/ammo_casing/shotgun)) + +/obj/item/storage/box/slug/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/ammo_casing/shotgun(src) + +/obj/item/storage/box/incendiary + name = "box of incendiary slug shotgun shots" + desc = "A box full of incendiary lethal shots designed for shotguns. The box itself is designed for holding any kind of shotgun shell." + icon_state = "incendiary_box" + icon = 'modular_dripstation/icons/obj/ammo.dmi' + illustration = null + +/obj/item/storage/box/incendiary/Initialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 7 + STR.set_holdable(list(/obj/item/ammo_casing/shotgun)) + +/obj/item/storage/box/incendiary/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/ammo_casing/shotgun/incendiary(src) + +/obj/item/storage/box/laserbuckshot + name = "box of laserbuckshot slug shotgun shots" + desc = "A box full of laserbuckshot lethal shots designed for shotguns. The box itself is designed for holding any kind of shotgun shell." + icon_state = "laserbuckshot_box" + icon = 'modular_dripstation/icons/obj/ammo.dmi' + illustration = null + +/obj/item/storage/box/laserbuckshot/Initialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 7 + STR.set_holdable(list(/obj/item/ammo_casing/shotgun)) + +/obj/item/storage/box/laserbuckshot/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/ammo_casing/shotgun/laserbuckshot(src) + /obj/item/storage/box icon = 'modular_dripstation/icons/obj/storage.dmi' lefthand_file = 'modular_dripstation/icons/mob/inhands/misc/boxes_lefthand.dmi' diff --git a/modular_dripstation/code/game/objects/items/twohanded/dualsaber.dm b/modular_dripstation/code/game/objects/items/twohanded/dualsaber.dm new file mode 100644 index 000000000000..06353812b780 --- /dev/null +++ b/modular_dripstation/code/game/objects/items/twohanded/dualsaber.dm @@ -0,0 +1,16 @@ +/obj/item/melee/dualsaber + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + block_chance = 50 + force_wielded = 40 + desc = "A more powerful version on the energy sword, it is more capable of blocking energy projectiles in throw mode than its single bladed counterpart. 'At last we will have revenge' is carved on the side of the handle." + +/obj/item/melee/dualsaber/IsReflect(mob/user) + if(HAS_TRAIT(src, TRAIT_WIELDED)) + if(prob(75)) + return TRUE + return FALSE + +/obj/item/melee/dualsaber/makeshift/IsReflect()//only 50% chance to reflect, so it still has the cool effect, but not 100% chance + if(prob(50)) + return TRUE + return FALSE \ No newline at end of file diff --git a/modular_dripstation/code/game/objects/items/weaponry.dm b/modular_dripstation/code/game/objects/items/weaponry.dm index fd5c1b6383f2..4930974a3975 100644 --- a/modular_dripstation/code/game/objects/items/weaponry.dm +++ b/modular_dripstation/code/game/objects/items/weaponry.dm @@ -1,6 +1,718 @@ /obj/item/ectoplasm icon = 'modular_dripstation/icons/obj/wizard.dmi' +/obj/item/vibro_weapon + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_parry.ogg' + +/obj/item/melee/transforming/vib_blade + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_parry.ogg' + +/obj/item/energy_katana + icon_state = "energy_katana" + item_state = "energy_katana" + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_block_blade.ogg' + block_color = COLOR_GREEN + +/obj/item/energy_katana/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_BELT) + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + if(slot == ITEM_SLOT_BACK) + worn_icon = 'modular_dripstation/icons/mob/clothing/back.dmi' + //if(slot == ITEM_SLOT_SUITSTORE) + // worn_icon = 'modular_dripstation/icons/mob/clothing/suit_storage.dmi' + update_appearance(UPDATE_ICON) + +/obj/item/katana + name = "modern katana" + desc = "Modern recreation of ancient terran weapon, capable to slice through variety of materials." + icon_state = "modern_katana" + item_state = "modern_katana" + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + block_chance = 50 + var/block_projectile_mod = 0.5 + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_parry.ogg' + +/obj/item/katana/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(attack_type == PROJECTILE_ATTACK) + final_block_chance = block_chance*block_projectile_mod //Pretty good... + if(prob(final_block_chance)) + if(istype(hitby, /obj/projectile/bullet)) + owner.visible_message(span_danger("[attack_text] hits [owner]'s [src], while he cuts the air, splitting the bullet in half!")) + else if(istype(hitby, /obj/projectile)) + var/obj/projectile/hit = hitby + if(hit.hitscan) + owner.visible_message(span_danger("[attack_text] hits [owner]'s [src], and he mirrors it back!")) + else + owner.visible_message(span_danger("[owner] blocks [attack_text] with [src]!")) + playsound(src, block_sound, 70, vary = TRUE) + return 1 + return 0 + +/obj/item/katana/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_BELT) + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + if(slot == ITEM_SLOT_BACK) + worn_icon = 'modular_dripstation/icons/mob/clothing/back.dmi' + //if(slot == ITEM_SLOT_SUITSTORE) + // worn_icon = 'modular_dripstation/icons/mob/clothing/suit_storage.dmi' + update_appearance(UPDATE_ICON) + +/obj/item/katana/bloody + name = "bloody katana" + desc = "Modern katana covered in blood. And thirsts for even more of it..." + icon_state = "bloody_katana" + item_state = "bloody_katana" + slot_flags = null + block_projectile_mod = 1 //here for more + +/obj/item/katana/basalt + icon_state = "basalt_katana" + item_state = "basalt_katana" + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + block_projectile_mod = 0 //too heavy + +/obj/item/katana/cursed + icon_state = "cursed" + item_state = "cursed" + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + block_projectile_mod = 0.2 //curse uppon ya + +/obj/item/katana/monomolecular + name = "molecular katana" + icon_state = "monomolecular" + item_state = "monomolecular" + desc = "An elegant weapon, its molecular edge is capable of cutting through flesh and bone with ease." + block_chance = 40 //pretty hard + block_projectile_mod = 1.5 // 60 projectile block chance + armour_penetration = 75 + +/obj/item/katana/murasame/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(istype(hitby, /obj/projectile/bullet) && prob(final_block_chance)) + if(istype(hitby, /obj/projectile/bullet)) + owner.visible_message(span_danger("[attack_text] hits [owner]'s [src], while he cuts the air, splitting the bullet in half!")) + playsound(src, block_sound, 70, vary = TRUE) + return 1 + return 0 + +/obj/item/katana/murasame + name = "\improper Murasame" + icon_state = "murasame" + item_state = "murasame" + desc = "Murasame is a katana whose blade is coated with poison, which nearly instantly kills its victim. As soon as the blade's blade pierces the skin, a deadly poison is injected into the victim's wound, killing him in a matter of seconds." + block_chance = 50 + armour_penetration = 40 + var/next_blow + var/death_imminent = FALSE + var/mob/living/death_wisher = null + +/obj/item/katana/murasame/afterattack(atom/target, blocked) + . = ..() + if((blocked != 100) && iscarbon(target)) + var/mob/living/carbon/victim = target + victim.reagents.add_reagent(/datum/reagent/toxin/ambusher_toxin, 5) + victim.reagents.add_reagent(/datum/reagent/toxin/amanitin, 5) + victim.reagents.add_reagent(/datum/reagent/toxin/initropidril, 5) + victim.reagents.add_reagent(/datum/reagent/toxin/cyanide, 5) + victim.reagents.add_reagent(/datum/reagent/toxin/venom, 5) + victim.reagents.add_reagent(/datum/reagent/toxin/acid/fluacid, 5) + +/obj/item/katana/murasame/attack_self(mob/living/user) + if(world.time > next_blow && (istype(user, death_wisher)|| !death_wisher)) + balloon_alert(user, "you starting to cut yourself with [src]!") + if(do_after(user, 0.5 SECONDS, src)) + to_chat(user, span_notice("You feel a sudden surge of energy!")) + user.adjustStaminaLoss(-60) + user.adjustBruteLoss(-40) + user.adjustFireLoss(-40) + user.reagents.add_reagent(/datum/reagent/medicine/stimulants, 10) + if (!death_imminent) + death_imminent = TRUE + death_wisher = user + addtimer(CALLBACK(src, PROC_REF(user_death), death_wisher), 30 SECONDS) + return + else + next_blow = world.time + 5 SECONDS + return + else + balloon_alert(user, "interrupted!") + return + else + to_chat(user, span_notice("You catch your breath and can`s blow yourself now!")) + +/obj/item/katana/murasame/proc/user_death(mob/living/user) + user.reagents.add_reagent(/datum/reagent/toxin/cyanide, 5) + user.reagents.add_reagent(/datum/reagent/toxin/venom, 5) + sleep(10 SECONDS) + user.adjustToxLoss(200) + death_imminent = FALSE + death_wisher = null + +/obj/item/toy/katana + icon_state = "modern_katana" + item_state = "modern_katana" + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + +/obj/item/toy/katana/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_BELT) + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + if(slot == ITEM_SLOT_BACK) + worn_icon = 'modular_dripstation/icons/mob/clothing/back.dmi' + //if(slot == ITEM_SLOT_SUITSTORE) + // worn_icon = 'modular_dripstation/icons/mob/clothing/suit_storage.dmi' + update_appearance(UPDATE_ICON) + +/obj/item/melee/sabre + name = "officer's rapier" + desc = "An elegant weapon, for a more civilized age. Ceremonial version issued to NanoTrasen finest." + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_parry.ogg' + +/obj/item/storage/belt/sabre + name = "rapier sheath" + desc = "An ornate sheath designed to hold an officer's rapier." + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + hit_reaction_chance = 20 + block_sound = 'modular_dripstation/sound/weapons/block/sound_weapons_parry.ogg' + +/obj/item/storage/belt/sabre/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(attack_type == MELEE_ATTACK && prob(hit_reaction_chance)) + owner.visible_message(span_danger("[owner] fends off [attack_text] with [src]!")) + playsound(src, block_sound, 70, vary = TRUE) + return 1 + return 0 + +/obj/item/storage/belt/sabre/AltClick(mob/user) + if(!iscarbon(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + if(length(contents)) + var/obj/item/I = contents[1] + user.visible_message("[user] takes [I] out of [src].", span_notice("You take [I] out of [src].")) + user.put_in_hands(I) + playsound(I, 'sound/items/unsheath.ogg', 25, TRUE) + update_appearance(UPDATE_ICON) + else + to_chat(user, "[src] is empty.") + +/obj/item/melee/sabre/mono + name = "\improper molecular NanoTrasen rapier" + desc = "An elegant combat ready weapon of NanoTrasen finest, its molecular edge is capable of cutting through flesh and bone with ease." + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + icon_state = "monorapier" + item_state = "monorapier" + force = 30 + block_chance = 60 + armour_penetration = 100 + +/obj/item/storage/belt/sabre/mono + name = "rapier sheath" + desc = "An ornate sheath designed to preserve molecular edge of combat rapier." + icon_state = "msheath" + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + +/obj/item/storage/belt/sabre/mono/PopulateContents() + new /obj/item/melee/sabre/mono(src) + update_appearance(UPDATE_ICON) + +/obj/item/melee/sabre/syndie + name = "\improper combat sabre" + desc = "An elegant plastitanium combat ready weapon of pirate capitans, its edge is capable of cutting through flesh and bone with ease." + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + icon_state = "sabre" + force = 30 + block_chance = 40 + armour_penetration = 30 + +/obj/item/storage/belt/sabre/syndie + name = "sabre sheath" + desc = "An red and black sheath designed to preserve edge of combat sabre." + icon_state = "ssheath" + item_state = "ssheath" + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + icon = 'modular_dripstation/icons/obj/weapons/blades.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + +/obj/item/storage/belt/sabre/syndie/PopulateContents() + new /obj/item/melee/sabre/syndie(src) + update_appearance(UPDATE_ICON) + +/obj/item/melee/ntrep_cane + name = "\improper NanoTrasen Representative`s cane" + desc = "A compact yet robust personal defense weapon." + icon_state = "cane_nt" + item_state = "cane_nt" + icon = 'modular_dripstation/icons/obj/weapons/melee.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + slot_flags = ITEM_SLOT_BELT + var/cooldown = 1.5 SECONDS + var/on = FALSE + + var/on_item_state = "cane_nt_active" + var/force_on = 3 + var/force_off = 7 + var/stamina_damage = 35 + var/block_threshold = 40 + bare_wound_bonus = 10 + + var/on_stun_sound = "sound/effects/woodhit.ogg" // Default path to sound for when we stun. + var/knockdown_time_carbon = 1.5 SECONDS // Knockdown length for carbons. + var/cooldown_check = 0 + ///how long a clown stuns themself for, or someone is stunned for if they are hit to >90 stamina damage + var/stunforce = 10 SECONDS + ///how much stamina damage we deal per hit, this is combatted by energy armor + var/stamina_damage_on = 70 + ///the cell used by the baton + var/obj/item/stock_parts/cell/cell + ///how much charge is deducted from the cell when we slap someone while on + var/hitcost = 1000 + ///% chance we hit someone with the correct side of the baton when thrown + var/throw_hit_chance = 35 + ///if not empty the baton starts with this type of cell + var/preload_cell_type + ///used for passive discharge + var/cell_last_used = 0 + +// Description for when turning their baton "on" +/obj/item/melee/ntrep_cane/proc/get_on_description() + . = list() + + .["local_on"] = span_danger("You activate the hidden function of the cane.") + .["local_off"] = span_danger("You deactivate your cane.") + + return . + +/obj/item/melee/ntrep_cane/get_cell() + return cell + +/obj/item/melee/ntrep_cane/Initialize(mapload) + . = ..() + if(preload_cell_type) + if(!ispath(preload_cell_type,/obj/item/stock_parts/cell)) + log_mapping("[src] at [AREACOORD(src)] had an invalid preload_cell_type: [preload_cell_type].") + else + cell = new preload_cell_type(src) + update_appearance(UPDATE_ICON) + +/obj/item/melee/ntrep_cane/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + if(..()) + return + //Only mob/living types have stun handling + if(on && prob(throw_hit_chance) && iscarbon(hit_atom)) + baton_stun(hit_atom) + +/obj/item/melee/ntrep_cane/loaded //this one starts with a cell pre-installed. + preload_cell_type = /obj/item/stock_parts/cell/high + +/obj/item/melee/ntrep_cane/proc/deductcharge(chrgdeductamt) + if(cell) + //Note this value returned is significant, as it will determine + //if a stun is applied or not + var/mob/living/M = loc + if(M && iscyborg(M)) + var/mob/living/silicon/robot/R = loc + R.cell.use(chrgdeductamt) + else + . = cell.use(chrgdeductamt) + if(on && cell.charge < hitcost) + //we're below minimum, turn off + on = FALSE + update_appearance(UPDATE_ICON) + playsound(loc, "sparks", 75, 1, -1) + STOP_PROCESSING(SSobj, src) // no more charge? stop checking for discharge + +/obj/item/melee/ntrep_cane/update_icon_state() + . = ..() + if(on) + icon_state = "[initial(icon_state)]_active" + else if(!cell) + icon_state = "[initial(icon_state)]_nocell" + else + icon_state = "[initial(icon_state)]" + +/obj/item/melee/ntrep_cane/process() + if(on) + ++cell_last_used // Will discharge in 13 processes if it is not turned off + if(cell_last_used >= STUNBATON_DISCHARGE_INTERVAL) + deductcharge(500) + cell_last_used = 6 // Will discharge again in 7 processes if it is not turned off + +/obj/item/melee/ntrep_cane/examine(mob/user) + . = ..() + if(cell) + . += span_notice("\The [src] is [round(cell.percent())]% charged.") + else + . += span_warning("\The [src] does not have a power source installed.") + +/obj/item/melee/ntrep_cane/suicide_act(mob/user) + if(on) + user.visible_message(span_suicide("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!")) + return FIRELOSS + user.visible_message(span_suicide("[user] is putting the [name] in [user.p_their()] mouth! But forgot to turn the [name] on.")) + return SHAME + +/obj/item/melee/ntrep_cane/attack_self(mob/user) + if(cell && cell.charge > hitcost) + var/list/desc = get_on_description() + on = !on + playsound(loc, "sparks", 75, 1, -1) + cell_last_used = 0 + if(on) + to_chat(user, desc["local_on"]) + item_state = on_item_state + force = force_on + stamina_damage = stamina_damage_on + attack_verb = list("beaten") + START_PROCESSING(SSobj, src) + else + to_chat(user, desc["local_off"]) + item_state = initial(item_state) + force = force_off + stamina_damage = initial(stamina_damage) + attack_verb = list("smacked", "struck", "cracked", "robusted") + STOP_PROCESSING(SSobj, src) + to_chat(user, span_notice("[src] is now [on ? "on" : "off"].")) + else + on = FALSE + item_state = initial(item_state) + force = force_off + stamina_damage = initial(stamina_damage) + attack_verb = list("smacked", "struck", "cracked", "robusted") + if(!cell) + to_chat(user, span_warning("[src] does not have a power source!")) + else + to_chat(user, span_warning("[src] is out of charge.")) + update_appearance(UPDATE_ICON) + add_fingerprint(user) + +/obj/item/melee/ntrep_cane/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/stock_parts/cell)) + var/obj/item/stock_parts/cell/C = W + if(cell) + to_chat(user, span_notice("[src] already has a cell.")) + else + if(C.maxcharge < hitcost) + to_chat(user, span_notice("[src] requires a higher capacity cell.")) + return + if(!user.transferItemToLoc(W, src)) + return + cell = W + to_chat(user, span_notice("You install a cell in [src].")) + update_appearance(UPDATE_ICON) + else if(W.tool_behaviour == TOOL_SCREWDRIVER) + if(cell) + cell.update_appearance(UPDATE_ICON) + cell.forceMove(get_turf(src)) + cell = null + to_chat(user, span_notice("You remove the cell from [src].")) + on = FALSE + STOP_PROCESSING(SSobj, src) // no cell, no charge; stop processing for on because it cant be on + update_appearance(UPDATE_ICON) + else + return ..() + +/obj/item/melee/ntrep_cane/attack(mob/living/target, mob/living/user) + if(HAS_TRAIT(user, TRAIT_NO_STUN_WEAPONS)) + to_chat(user, span_warning("You can't seem to remember how this works!")) + return + add_fingerprint(user) + if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50)) + to_chat(user, "You hit yourself over the head.") + user.Paralyze(knockdown_time_carbon * force) + user.adjustStaminaLoss(stamina_damage) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD) + else + user.take_bodypart_damage(2*force) + return + if(iscyborg(target)) + ..() + return + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if (H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) + playsound(target, 'sound/weapons/genhit.ogg', 50, 1) + return + var/datum/martial_art/M = H.check_block() + if(M) + M.handle_counter(target, user) + return + if(!isliving(target)) + return + if (user.a_intent == INTENT_HARM) + if(!..()) + return + if(!iscyborg(target)) + return + else + if(cooldown_check <= world.time) + user.do_attack_animation(target) + if(!on) + stun(target, user) + else + baton_stun(target, user) + else + var/wait_desc = get_wait_description() + if (wait_desc) + to_chat(user, wait_desc) + +/obj/item/melee/ntrep_cane/proc/get_wait_description() + if(!on) + return span_danger("You are too exosted to do that!") + else + return span_danger("The cane is still charging!") + +/obj/item/melee/ntrep_cane/proc/stun(mob/living/target, mob/living/user) + var/list/desc = get_hit_description(target, user) + + var/obj/item/bodypart/affecting = target.get_bodypart(user.zone_selected) + var/armor_block = target.run_armor_check(affecting, MELEE) + target.apply_damage(stamina_damage, STAMINA, user.zone_selected, armor_block) + var/current_stamina_damage = target.getStaminaLoss() + + if(user) + target.lastattacker = user.real_name + target.lastattackerckey = user.ckey + log_combat(user, target, "stunned") + + playsound(get_turf(src), on_stun_sound, 75, 1, -1) + + if(current_stamina_damage >= 100) + desc = get_stun_description(target, user) + target.Knockdown(knockdown_time_carbon) + target.visible_message(desc["visible"], desc["local"]) + return + + if(armor_block >= block_threshold) + target.visible_message(desc["visible"], desc["local"]) + playsound(target, 'sound/weapons/genhit.ogg', 50, 1) + return + + // Special effects + if(affecting?.stamina_dam >= 50 && (istype(affecting, /obj/item/bodypart/l_leg) || istype(affecting, /obj/item/bodypart/r_leg))) + desc = get_stun_description(target, user) + target.Knockdown(knockdown_time_carbon) + + else if(istype(affecting, /obj/item/bodypart/l_arm) && target.held_items[LEFT_HANDS]) + target.dropItemToGround(target.held_items[LEFT_HANDS]) + else if(istype(affecting, /obj/item/bodypart/r_arm) && target.held_items[RIGHT_HANDS]) + target.dropItemToGround(target.held_items[RIGHT_HANDS]) + target.visible_message(desc["visible"], desc["local"]) + +// Default message for stunning mob. +/obj/item/melee/ntrep_cane/proc/get_stun_description(mob/living/target, mob/living/user) + . = list() + + .["visible"] = span_danger("[user] has knocked down [target] with [src]!") + .["local"] = span_danger("[user] has knocked down [target] with [src]!") + + return . + +// Default message for hitting mob. +/obj/item/melee/ntrep_cane/proc/get_hit_description(mob/living/target, mob/living/user) + . = list() + + .["visible"] = span_danger("[user] struck [target] with [src]!") + .["local"] = span_danger("[user] struck [target] with [src]!") + + return . + +/obj/item/melee/ntrep_cane/proc/baton_stun(mob/living/L, mob/user) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that + playsound(L, 'sound/weapons/genhit.ogg', 50, 1) + return 0 + if(iscyborg(loc)) + var/mob/living/silicon/robot/R = loc + if(!R || !R.cell || !R.cell.use(hitcost)) + return FALSE + else + if(!deductcharge(hitcost)) + return FALSE + + var/obj/item/bodypart/affecting = L.get_bodypart(user? user.zone_selected : BODY_ZONE_CHEST) + var/armor_block = L.run_armor_check(affecting, ENERGY) //check armor on the limb because that's where we are slapping... + L.apply_damage(stamina_damage, STAMINA, BODY_ZONE_CHEST, armor_block) //...then deal damage to chest so we can't do the old hit-a-disabled-limb-200-times thing, batons are electrical not directed. + + + SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) + var/current_stamina_damage = L.getStaminaLoss() + + if(current_stamina_damage >= 90) + if(!L.IsParalyzed()) + to_chat(L, span_warning("You muscles seize, making you collapse!")) + else + L.Paralyze(stunforce) + L.adjust_jitter(20 SECONDS) + L.apply_effect(EFFECT_STUTTER, stunforce) + else if(current_stamina_damage > 70) + L.adjust_jitter(10 SECONDS) + L.apply_effect(EFFECT_STUTTER, stunforce) + else if(current_stamina_damage >= 20) + L.adjust_jitter(5 SECONDS) + L.apply_effect(EFFECT_STUTTER, stunforce) + + if(user) + L.lastattacker = user.real_name + L.lastattackerckey = user.ckey + L.visible_message(span_danger("[user] has stunned [L] with [src]!"), \ + span_userdanger("[user] has stunned you with [src]!")) + log_combat(user, L, "stunned") + + playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1) + + if(ishuman(L)) + var/mob/living/carbon/human/H = L + H.forcesay(GLOB.hit_appends) + + cooldown_check = world.time + cooldown + + return TRUE + +/obj/item/melee/ntrep_cane/emp_act(severity) + . = ..() + if (!(. & EMP_PROTECT_SELF)) + deductcharge(100 * severity) + +/obj/item/melee/classic_baton/telescopic + lefthand_file = 'modular_dripstation/icons/mob/inhands/security_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/security_righthand.dmi' + item_state = "telebaton_0" + on_item_state = "telebaton_1" + +/obj/item/melee/classic_baton/telescopic/cane + icon_state = "telecane" + item_state = "telecane" + on_icon_state = "telecane_active" + off_icon_state = "telecane" + on_item_state = "telecane_active" + +/obj/item/melee/hardlight_cane + icon_state = "holocane" + item_state = "holocane" + force = 0 + attack_verb = list("hit", "poked") + +/obj/item/melee/hardlight_cane/Initialize(mapload) + . = ..() + + AddComponent( \ + /datum/component/transforming, \ + force_on = 20, \ + throwforce_on = 18, \ + throw_speed_on = throw_speed, \ + sharpness_on = SHARP_EDGED, \ + hitsound_on = 'sound/weapons/bladeslice.ogg', \ + w_class_on = WEIGHT_CLASS_NORMAL, \ + attack_verb_on = list("cuted", "stabed", "slashed"), \ + ) + +/obj/item/melee/cultblade/dagger + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + +/obj/item/melee/emergency_forcing_tool + name = "emergency forcing tool" + desc = "Basic forcing tool, capable of prying firelocks or destroing stuff in critical situations." + force = 20 + armour_penetration = -30 + throwforce = 5 + throw_range = 2 + throw_speed = 1 + toolspeed = 1.2 + demolition_mod = 2 + usesound = 'sound/items/jaws_pry.ogg' + tool_behaviour = TOOL_MINING + icon = 'modular_dripstation/icons/obj/weapons/melee.dmi' + icon_state = "emergency_forcing_tool" + item_state = "emergency_forcing_tool" + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("attacked", "slashed", "sliced", "torn", "ripped", "diced") + sharpness = SHARP_EDGED + wound_bonus = -20 + bare_wound_bonus = 20 + +/obj/item/melee/emergency_forcing_tool/afterattack(atom/target, mob/user, proximity) + . = ..() + if(!proximity) + return + if(istype(target, /obj/structure/table)) + var/obj/structure/table/T = target + T.deconstruct(FALSE) + + else if(istype(target, /obj/machinery/computer)) + var/obj/machinery/computer/C = target + C.attack_alien(user) //muh copypasta + + else if(istype(target, /obj/machinery/door/airlock)) + var/obj/machinery/door/airlock/A = target + + if((!A.requiresID() || A.allowed(user)) && A.hasPower()) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message, power requirement is so this doesn't stop unpowered doors from being pried open if you have access + return + + if(A.locked) + to_chat(user, span_warning("The airlock's bolts prevent it from being forced!")) + return + if(A.welded) + to_chat(user, span_warning("The airlock is welded shut, it won't budge!")) + return + + if(A.hasPower()) + user.visible_message(span_warning("[user] jams [src] into the airlock and starts prying it open!"), span_warning("We start forcing the airlock open."), //yogs modified description + span_italics("You hear a metal screeching sound.")) + playsound(A, 'sound/machines/airlock_alien_prying.ogg', 100, 1) + if(!do_after(user, 6 SECONDS, A)) + return + //user.say("Heeeeeeeeeerrre's Johnny!") + user.visible_message(span_warning("[user] forces the airlock to open with [user.p_their()] [src]!"), span_warning("We force the airlock to open."), //yogs modified description + span_italics("You hear a metal screeching sound.")) + A.open(2) + +/obj/item/melee/emergency_forcing_tool/varyag + name = "Varyag" + desc = "Combat forcing tool, capable of prying firelocks, destroing stuff and killing someone in emergency situations." + force = 30 + armour_penetration = -10 + wound_bonus = 0 + throwforce = 30 + throw_range = 7 + throw_speed = 2 + icon_state = "varyag" + item_state = "varyag" + /obj/item/phone icon = 'modular_dripstation/icons/obj/misc.dmi' diff --git a/modular_dripstation/code/game/objects/items/wielded/sledgehammer.dm b/modular_dripstation/code/game/objects/items/wielded/sledgehammer.dm new file mode 100644 index 000000000000..e9a920ef9c8f --- /dev/null +++ b/modular_dripstation/code/game/objects/items/wielded/sledgehammer.dm @@ -0,0 +1,43 @@ +/obj/item/melee/sledgehammer + var/force_wielded_twohand = 15 + +/obj/item/melee/sledgehammer/Initialize(mapload) + . = ..() + AddComponent(/datum/component/two_handed, \ + force_wielded = force_wielded_twohand, \ + wield_callback = CALLBACK(src, PROC_REF(on_wield)), \ + unwield_callback = CALLBACK(src, PROC_REF(on_unwield)), \ + require_twohands = TRUE, \ + wielded_stats = list(SWING_SPEED = 1.5, ENCUMBRANCE = 0.5, ENCUMBRANCE_TIME = 1 SECONDS, REACH = 1, DAMAGE_LOW = 0, DAMAGE_HIGH = 0), \ + ) + AddComponent(/datum/component/cleave_attack, \ + arc_size=180, \ + requires_wielded=TRUE, \ + no_multi_hit=TRUE, \ + ) // big and heavy hammer makes wide arc + +/obj/item/melee/sledgehammer/security + name = "/improper security kuvalda" + desc = "Tactical version of sledgehammer with more unbalanced weight. Was designed to harm walls, not crewmembers." + icon = 'modular_dripstation/icons/obj/weapons/security.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/back.dmi' + icon_state = "sledgehammer" + item_state = "sledgehammer" + lefthand_file = 'modular_dripstation/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/melee_righthand.dmi' + slowdown = 0.2 //You need some strength to cary this shit + armour_penetration = -10//Tactical, but still not very practical + throwforce = 30 //OUCH + throw_range = 3 //Doesn't throw very far + wound_bonus = -10 //So it`s somewhat combat + bare_wound_bonus = 20 //So it`s somewhat combat + force_wielded_twohand = 25 + +/obj/item/melee/sledgehammer/security/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(ishuman(target)) + var/mob/living/carbon/human/H = target + H.adjustStaminaLoss(10) + var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) + H.throw_at(throw_target, 200, 4) + to_chat(H, span_danger("\The [src] hits you very hard and throws you back!")) diff --git a/modular_dripstation/code/game/objects/structures/crates_lockers/closets.dm b/modular_dripstation/code/game/objects/structures/crates_lockers/closets.dm index f48a87d2d585..a1c72769f989 100644 --- a/modular_dripstation/code/game/objects/structures/crates_lockers/closets.dm +++ b/modular_dripstation/code/game/objects/structures/crates_lockers/closets.dm @@ -270,7 +270,7 @@ GLOBAL_LIST_INIT(closet_cutting_types, typecacheof(list( new /obj/item/circuitboard/machine/techfab/department/service(src) new /obj/item/storage/photo_album/HoP(src) new /obj/item/clipboard/yog/paperwork/hop(src) - new /obj/item/gun/energy/e_gun/mini(src) + new /obj/item/gun/energy/e_gun/mini/secure(src) new /obj/item/storage/bag/garment/hop(src) new /obj/item/clothing/shoes/leather(src) new /obj/item/clothing/shoes/laceup(src) diff --git a/modular_dripstation/code/modules/cargo/packs.dm b/modular_dripstation/code/modules/cargo/packs.dm index d38a7f21ff19..0d1deb6b3b4b 100644 --- a/modular_dripstation/code/modules/cargo/packs.dm +++ b/modular_dripstation/code/modules/cargo/packs.dm @@ -184,11 +184,8 @@ /obj/item/clothing/suit/armor/riot/hos) crate_name = "hos supply crate" -/datum/supply_pack/security/armory/laser //dripstation mooving lethals to the armory - name = "Lasers Crate" - desc = "Contains three lethal, high-energy laser guns. Requires Armory access to open." - cost = 2000 - contains = list(/obj/item/gun/energy/laser, - /obj/item/gun/energy/laser, - /obj/item/gun/energy/laser) - crate_name = "laser crate" +/datum/supply_pack/weaponry/ballistic + desc = "For when the enemy absolutely needs to be replaced with lead. Contains three Militech-designed Combat Shotguns, and three Shotgun Bandoliers. Requires Armory access to open." + +/datum/supply_pack/weaponry/ballistic_single + desc = "For when the enemy absolutely needs to be replaced with lead. Contains one Militech-designed Combat Shotgun, and one Shotgun Bandolier. Requires Armory access to open." \ No newline at end of file diff --git a/modular_dripstation/code/modules/cargo/supplypod.dm b/modular_dripstation/code/modules/cargo/supplypod.dm index f66e9d187bd2..bdb1d3d9005f 100644 --- a/modular_dripstation/code/modules/cargo/supplypod.dm +++ b/modular_dripstation/code/modules/cargo/supplypod.dm @@ -7,7 +7,7 @@ GLOBAL_LIST_INIT(podstyles, list(\ list(POD_SHAPE_OTHER, "cultpod", TRUE, FALSE, FALSE, RUBBLE_NORMAL, "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ list(POD_SHAPE_OTHER, "missile", FALSE, FALSE, FALSE, RUBBLE_THIN, "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxiliary payload hatch on the side, though manually opening it is likely impossible."),\ list(POD_SHAPE_OTHER, "smissile", FALSE, FALSE, FALSE, RUBBLE_THIN, "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxiliary payload hatch on the side, though manually opening it is likely impossible."),\ - list(POD_SHAPE_OTHER, "box", TRUE, FALSE, FALSE, RUBBLE_WIDE, "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ + list(POD_SHAPE_OTHER, "box", TRUE, FALSE, FALSE, RUBBLE_WIDE, "\improper Militech supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Militech Armory - 2532' engraved on the side."),\ list(POD_SHAPE_OTHER, "clownpod",TRUE, FALSE, FALSE, RUBBLE_NORMAL, "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ list(POD_SHAPE_OTHER, "orange", TRUE, FALSE, FALSE, RUBBLE_NONE, "\improper Orange", "An angry orange."),\ list(POD_SHAPE_OTHER, FALSE, FALSE, FALSE, FALSE, RUBBLE_NONE, "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\ diff --git a/modular_dripstation/code/modules/projectiles/ammunition/ballistic.dm b/modular_dripstation/code/modules/projectiles/ammunition/ballistic.dm new file mode 100644 index 000000000000..145d0e276066 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/ammunition/ballistic.dm @@ -0,0 +1,19 @@ +///AP 5.56 +/obj/item/ammo_casing/a556/ap + name = "5.56mm M995 bullet casing" + desc = "A 5.56x45mm M995 cartridge with a 3.4 gram armor-piercing bullet with a tungsten carbide penetrator over an aluminum base with a copper jacket, in a brass case. " + +///New SSAAP 5.56 +/obj/item/ammo_casing/a556/ssaap + name = "5.56mm TGov SSA AP bullet casing" + desc = "A 5.56x45mm TGov SSA AP cartridge with a two-part armor-piercing projectile, the bullet consists of a sabot and a tungsten carbide penetrator body, in a brass case." + icon_state = "556ap-casing" + projectile_type = /obj/projectile/bullet/a556/ssaap + +/obj/item/ammo_casing/shotgun/syndie + name = "12g AP-СSS (Armor Piercing Ceramic Shotgun Slug)" + desc = "A high penetrative 12-gauge сeramic slug without manufacturer's marking." + +/obj/item/ammo_casing/shotgun/buckshot/syndie + name = "12/70 RIP-S shell (Syndicate Radically Invasive Projectile)" + desc = "An 12-gauge heavy tungsten buckshot shell without manufacturer's marking." \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/ammunition/energy.dm b/modular_dripstation/code/modules/projectiles/ammunition/energy.dm new file mode 100644 index 000000000000..5d47f6d514f9 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/ammunition/energy.dm @@ -0,0 +1,37 @@ +/obj/item/ammo_casing/energy/laser/hitscan + projectile_type = /obj/projectile/beam/laser/hitscan + select_name = "kill" + e_cost = 83 + +/obj/item/ammo_casing/energy/laser/hitscan/sniper + projectile_type = /obj/projectile/beam/laser/hitscan/sniper + e_cost = 200 + delay = 15 + select_name = "snipe" + fire_sound = 'sound/weapons/marauder.ogg' + +/obj/item/ammo_casing/energy/laser/practice/hitscan + projectile_type = /obj/projectile/beam/practice/hitscan + +/obj/item/ammo_casing/energy/bolt/large + projectile_type = /obj/projectile/energy/bolt/large + +/obj/item/ammo_casing/energy/laser/hellfire/scatter + projectile_type = /obj/projectile/beam/laser/hellfire/scatter + pellets = 5 + variance = 25 + e_cost = 130 + select_name = "scatter" + +/obj/item/ammo_casing/energy/laser/hellfire/precise + projectile_type = /obj/projectile/beam/laser/heavylaser + e_cost = 83 + select_name = "precise" + +/obj/item/ammo_casing/energy/laser_spec + projectile_type = /obj/projectile/beam/laser/spec + e_cost = 83 + select_name = "kill" + +/obj/item/ammo_casing/energy/laser/pulse/pistol + projectile_type = /obj/projectile/beam/pulse/pistol diff --git a/modular_dripstation/code/modules/projectiles/ammunition/plasma.dm b/modular_dripstation/code/modules/projectiles/ammunition/plasma.dm new file mode 100644 index 000000000000..515db300ab2c --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/ammunition/plasma.dm @@ -0,0 +1,6 @@ +/obj/item/ammo_casing/energy/plasma/combat + projectile_type = /obj/projectile/plasma/combat + delay = 4 + e_cost = 50 + select_name = "plasma" + fire_sound = 'sound/weapons/marauder.ogg' \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/external/mg.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/external/mg.dm new file mode 100644 index 000000000000..b6fd6eb9dec1 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/external/mg.dm @@ -0,0 +1,81 @@ +//L6 SAW +/obj/item/ammo_box/magazine/mm556x45_100 + name = "box magazine (5.56x45mm)" + desc = "A 100-round box magazine designed for the L6 SAW." + icon_state = "a556-100" + icon = 'modular_dripstation/icons/obj/ammo.dmi' + ammo_type = /obj/item/ammo_casing/a556 + caliber = CALIBER_556NATO + max_ammo = 100 + +/obj/item/ammo_box/magazine/mm556x45_100/update_icon_state() + . = ..() + icon_state = "a556[sprite_designation]-[round(ammo_count(),20)]" + +/obj/item/ammo_box/magazine/mm556x45_100/ap + name = "box magazine (Armor-Piercing 5.56x45mm)" + desc = "A 100-round box magazine designed for the L6 SAW. \ + These rounds deal less damage but penetrate cleanly through standart protective equipment." + icon_state = "a556A-100" + ammo_type = /obj/item/ammo_casing/a556/ap + sprite_designation = "A" + +/obj/item/ammo_box/magazine/mm556x45_100/ssaap + name = "box magazine (TGov SSA AP 5.56x45mm)" + desc = "A 100-round box magazine designed for the L6 SAW. \ + These rounds deal less damage but penetrate cleanly through special protective equipment." + icon_state = "a556SA-100" + ammo_type = /obj/item/ammo_casing/a556/ssaap + sprite_designation = "SA" + +/obj/item/ammo_box/magazine/mm556x45_100/inc + name = "box magazine (Incendiary 5.56x45mm)" + desc = "A 100-round box magazine designed for the L6 SAW. \ + These rounds deal less damage but ignite targets." + icon_state = "a556I-100" + ammo_type = /obj/item/ammo_casing/a556/inc + sprite_designation = "I" + + + +//L4 GPMG +/obj/item/ammo_box/magazine/mm712x82 + name = "box magazine (7.12x82mm)" + desc = "A 50-round box magazine designed for the L4 GPMG." + icon_state = "a762-50" + icon = 'modular_dripstation/icons/obj/ammo.dmi' + ammo_type = /obj/item/ammo_casing/mm712x82 + caliber = CALIBER_712X82 + max_ammo = 50 + +/obj/item/ammo_box/magazine/mm712x82/update_icon_state() + . = ..() + icon_state = "a762[sprite_designation]-[ammo_count() ? "50" : "0"]" + +/obj/item/ammo_box/magazine/mm712x82/hollow + name = "box magazine (Hollow-Point 7.12x82mm)" + desc = "A 50-round box magazine designed for the L4 GPMG. \ + These rounds suffer against armor but can massively wound bare limbs." + icon_state = "a762H-50" + ammo_type = /obj/item/ammo_casing/mm712x82/hollow + sprite_designation = "H" + +/obj/item/ammo_box/magazine/mm712x82/ap + name = "box magazine (Armor-Piercing 7.12x82mm)" + desc = "A 50-round box magazine designed for the L4 GPMG. \ + These rounds deal less damage but penetrate cleanly through the best protective equipment." + icon_state = "a762A-50" + ammo_type = /obj/item/ammo_casing/mm712x82/ap + sprite_designation = "A" + +/obj/item/ammo_box/magazine/mm712x82/incen + name = "box magazine (Incendiary 7.12x82mm)" + desc = "A 50-round box magazine designed for the L4 GPMG. \ + These rounds deal less damage but ignite targets." + icon_state = "a762I-50" + ammo_type = /obj/item/ammo_casing/mm712x82/inc + sprite_designation = "I" + +/obj/item/ammo_box/magazine/mm712x82/update_icon_state() + . = ..() + icon_state = "a762[sprite_designation]-[round(ammo_count(),10)]" diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/external/pistol.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/external/pistol.dm new file mode 100644 index 000000000000..98441a609b6d --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -0,0 +1,130 @@ +//ammo boxes for 9mm +/obj/item/ammo_box/c9mm/fire + name = "ammo box (9mm Incendiary)" + ammo_type = /obj/item/ammo_casing/c9mm/inc + +/obj/item/ammo_box/c9mm/ap + name = "ammo box (9mm Armor-Piercing)" + ammo_type = /obj/item/ammo_casing/c9mm/ap + +/obj/item/ammo_box/no_direct/c38 + name = "ammo box (.38 special)" + icon_state = "38box" + ammo_type = /obj/item/ammo_casing/c38 + max_ammo = 20 + +/obj/item/ammo_box/no_direct/c38/rubber + name = "ammo box (.38 rubber)" + ammo_type = /obj/item/ammo_casing/c38/rubber + +//APS, Glock, STM-9 Mag +/obj/item/ammo_box/magazine/pistolm9mm/ap + name = "pistol magazine (9mm Armor-Piercing)" + icon_state = "9x19pA-10" + desc= "A 15-round 9mm magazine designed for the Stechkin APS Pistol. Loaded with rounds which penetrate armor but are less effective against normal targets." + ammo_type = /obj/item/ammo_casing/c9mm/ap + +/obj/item/ammo_box/magazine/pistolm9mm/ap/update_icon_state() + . = ..() + icon_state = "9x19pA-[ammo_count() ? "10" : "0"]" + +/obj/item/ammo_box/magazine/pistolm9mm/fire + name = "pistol magazine (9mm Incendiary)" + icon_state = "9x19pI-10" + desc = "A 15-round 9mm magazine designed for the A Stechkin APS Pistol. Loaded with rounds which trade lethality for ignition of target." + ammo_type = /obj/item/ammo_casing/c9mm/inc + +/obj/item/ammo_box/magazine/pistolm9mm/fire/update_icon_state() + . = ..() + icon_state = "9x19pI-[ammo_count() ? "10" : "0"]" + +/obj/item/ammo_box/magazine/pistolm9mm/pmag + name = "Glock PMAG magazine (9mm)" + desc = "A 21-round magazine for TSF side arm that contains 9mm rounds." + icon = 'modular_dripstation/icons/obj/ammo.dmi' + icon_state = "pmag9x19-21" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 21 + +/obj/item/ammo_box/magazine/pistolm9mm/pmag/update_icon_state() + . = ..() + icon_state = "pmag9x19-[ammo_count() ? "21" : "0"]" + +/obj/item/ammo_box/magazine/pistolm9mm/pmag/ap + name = "Glock PMAG magazine (9mm Armor-Piercing)" + icon_state = "pmag9x19A" + desc= "A 21-round magazine for TSF side arm. Loaded with rounds which penetrate armor but are less effective against normal targets." + ammo_type = /obj/item/ammo_casing/c9mm/ap + +/obj/item/ammo_box/magazine/pistolm9mm/pmag/ap/update_icon_state() + . = ..() + icon_state = "pmag9x19A-[ammo_count() ? "21" : "0"]" + +/obj/item/ammo_box/magazine/pistolm9mm/pmag/fire + name = "Glock PMAG magazine (9mm Incendiary)" + icon_state = "pmag9x19I" + desc = "A 21-round magazine for TSF side arm. Loaded with rounds which trade lethality for ignition of target." + ammo_type = /obj/item/ammo_casing/c9mm/inc + +/obj/item/ammo_box/magazine/pistolm9mm/pmag/fire/update_icon_state() + . = ..() + icon_state = "pmag9x19I-[ammo_count() ? "21" : "0"]" + +/obj/item/ammo_box/magazine/pistolm9mm/drum + name = "Glock Drum magazine (9mm)" + desc = "A 50-round magazine for TSF side arm that contains 9mm rounds." + icon = 'modular_dripstation/icons/obj/ammo.dmi' + icon_state = "stm9mag-50" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 50 + +/obj/item/ammo_box/magazine/pistolm9mm/pmag/drum/update_icon_state() + . = ..() + icon_state = "stm9mag-[ammo_count() ? "50" : "0"]" + +/obj/item/ammo_box/magazine/pistolm9mm/drum/ap + name = "Glock Drum magazine (9mm Armor-Piercing)" + icon_state = "stm9magA-50" + desc= "A 50-round magazine for TSF side arm. Loaded with rounds which penetrate armor but are less effective against normal targets." + ammo_type = /obj/item/ammo_casing/c9mm/ap + +/obj/item/ammo_box/magazine/pistolm9mm/pmag/drum/ap/update_icon_state() + . = ..() + icon_state = "stm9magA-[ammo_count() ? "50" : "0"]" + +/obj/item/ammo_box/magazine/pistolm9mm/drum/fire + name = "Glock Drum magazine (9mm Incendiary)" + icon_state = "stm9magI-50" + desc = "A 50-round magazine for TSF side arm. Loaded with rounds which trade lethality for ignition of target." + ammo_type = /obj/item/ammo_casing/c9mm/inc + +/obj/item/ammo_box/magazine/pistolm9mm/pmag/drum/fire/update_icon_state() + . = ..() + icon_state = "stm9magI-[ammo_count() ? "50" : "0"]" + +/obj/item/ammo_box/magazine/fn45 + name = "FNX-45 magazine (.45 ACP)" + desc = "An 15-round .45 ACP magazine designed for the FNX-45 pistol." + icon_state = "fn45" + icon = 'modular_dripstation/icons/obj/ammo.dmi' + max_ammo = 15 + ammo_type = /obj/item/ammo_casing/c45 + caliber = ".45" + multiple_sprites = AMMO_BOX_FULL_EMPTY + +/obj/item/ammo_box/magazine/fn45/ap + name = "FNX-45 magazine (Armor-Piercing .45 ACP)" + icon_state = "fn45A" + ammo_type = /obj/item/ammo_casing/c45/ap + +/obj/item/ammo_box/magazine/fn45/hp + name = "FNX-45 magazine (Hollow-Point .45 ACP)" + icon_state = "fn45H" + ammo_type = /obj/item/ammo_casing/c45/hp + +/obj/item/ammo_box/magazine/fn45/v + name = "FNX-45 magazine (Venom .45 ACP)" + icon_state = "fn45V" + ammo_type = /obj/item/ammo_casing/c45/venom \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/external/rifle.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/external/rifle.dm new file mode 100644 index 000000000000..5646049ad907 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/external/rifle.dm @@ -0,0 +1,35 @@ +//////intermediate bullets////// +///Standart 5.56 +/obj/item/ammo_box/magazine/m556 + name = "toploader magazine (5.56mm)" + desc = "A 30-round toploading magazine filled with 5.56 rounds, designed for assault rifles." //Da fack they should be designed for submachine gun? + +///AP 5.56 + +/obj/item/ammo_box/magazine/m556/ap + name = "toploader magazine (Armor-Piercing M995 5.56mm)" + desc = "A 30-round toploading magazine filled with M995 5.56 rounds, designed for assault rifles. \ + These rounds sacrifice some stopping power for bypassing standard protective equipment." + +/obj/item/ammo_box/magazine/r556/ap + name = "rifle magazine (Armor-Piercing M995 5.56mm)" + desc = "An alternative 30-round magazine for the NT ARG 'Boarder' Rifle. Filled with M995 5.56 rounds. \ + These rounds sacrifice some stopping power for bypassing standard protective equipment." + + +///New SSAAP 5.56 +/obj/item/ammo_box/magazine/m556/ssaap + name = "toploader magazine (SSA AP 5.56mm)" + desc = "A 30-round toploading magazine filled with armor-piercing 5.56 rounds, designed for TGov military. \ + These rounds sacrifice some stopping power for bypassing special protective equipment." + icon_state = "5.56mA-30" + ammo_type = /obj/item/ammo_casing/a556/ssaap + sprite_designation = "A" + +/obj/item/ammo_box/magazine/r556/ssaap + name = "rifle magazine (SSA AP 5.56mm)" + desc = "An alternative 30-round magazine for the NT ARG 'Boarder' Rifle. Filled with TGov SSA AP 5.56 rounds. \ + These rounds sacrifice some stopping power for bypassing special protective equipment." + icon_state = "arg556A" + ammo_type = /obj/item/ammo_casing/a556/ssaap + sprite_designation = "A" diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/external/shotgun.dm new file mode 100644 index 000000000000..54d53a456fa9 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/external/shotgun.dm @@ -0,0 +1,13 @@ +//Bulldog Shotgun + +/obj/item/ammo_box/magazine/m12g/slug + name = "shotgun magazine (12g ceramic slugs)" + desc = "A drum magazine designed for the Bulldog shotgun. \ + Ceramic AP slugs are the best armor issue choice. \ + Armor Piercing death to the Nanotrasen scum!" + +/obj/item/ammo_box/magazine/m12g + name = "shotgun magazine (12g RIP-S)" + desc = "A drum magazine designed for the Bulldog shotgun. \ + RIP-S is more effective choice for anti-personnel use. \ + RIP and death to the Nanotrasen!" \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/external/smg.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/external/smg.dm new file mode 100644 index 000000000000..0dcd57b3afb0 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/external/smg.dm @@ -0,0 +1,36 @@ +/obj/item/ammo_box/magazine/sa450 + name = "\improper SA-450 magazine (4.6x30mm)" + desc = "A 30-round 4.6x30mm magazine, designed for the SA-450 Carbine." + icon_state = "arg556" + ammo_type = /obj/item/ammo_casing/c46x30mm + caliber = CALIBER_46X30 + max_ammo = 30 + icon_state = "arg556" + +/obj/item/ammo_box/magazine/sa450/update_icon_state() + . = ..() + if(ammo_count()) + icon_state = "arg556[sprite_designation]" + else + icon_state = "arg556[sprite_designation]_empty" + +/obj/item/ammo_box/magazine/sa450/ap + name = "\improper SA-450 magazine (Armor-Piercing 4.6x30mm)" + desc = "A 30-round 4.6x30mm magazine, designed for the SA-450 Carbine." + icon_state = "arg556A" + ammo_type = /obj/item/ammo_casing/c46x30mm/ap + sprite_designation = "A" + +/obj/item/ammo_box/magazine/sa450/inc + name = "\improper SA-450 magazine (Incendiary 4.6x30mm)" + desc = "A 30-round 4.6x30mm magazine, designed for the SA-450 Carbine." + icon_state = "arg556I" + ammo_type = /obj/item/ammo_casing/c46x30mm/inc + sprite_designation = "I" + +/obj/item/ammo_box/magazine/sa450/snake + name = "\improper SA-450 magazine (snakebite Rounds 4.6x30mm)" + desc = "A 30-round 4.6x30mm magazine, designed for the SA-450 Carbine." + icon_state = "arg556R" + ammo_type = /obj/item/ammo_casing/c46x30mm/snakebite + sprite_designation = "R" \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm new file mode 100644 index 000000000000..7b47c450a3bd --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -0,0 +1,61 @@ +/obj/item/ammo_box/magazine/internal/cylinder + name = "revolver cylinder" + ammo_type = /obj/item/ammo_casing/a357 + caliber = "357" + max_ammo = 7 + +/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0) + rotate() + + var/b = stored_ammo[1] + if(!keep) + stored_ammo[1] = null + + return b + +/obj/item/ammo_box/magazine/internal/cylinder/proc/rotate() + var/b = stored_ammo[1] + stored_ammo.Cut(1,2) + stored_ammo.Insert(0, b) + +/obj/item/ammo_box/magazine/internal/cylinder/proc/spin() + for(var/i in 1 to rand(0, max_ammo*2)) + rotate() + +/obj/item/ammo_box/magazine/internal/cylinder/ammo_list(drop_list = FALSE) + var/list/L = list() + for(var/i=1 to stored_ammo.len) + var/obj/item/ammo_casing/bullet = stored_ammo[i] + if(bullet) + L.Add(bullet) + if(drop_list)//We have to maintain the list size, to emulate a cylinder + stored_ammo[i] = null + return L + +/obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0) + if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) + return FALSE + + for(var/i in 1 to stored_ammo.len) + var/obj/item/ammo_casing/bullet = stored_ammo[i] + if(!bullet || !bullet.BB) // found a spent ammo + stored_ammo[i] = R + R.forceMove(src) + + if(bullet) + bullet.forceMove(drop_location()) + return TRUE + + return FALSE + +/obj/item/ammo_box/magazine/internal/cylinder/top_off(load_type, starting=FALSE) + if(starting) // nulls don't exist when we're starting off + return ..() + + if(!load_type) + load_type = ammo_type + + for(var/i = 1, i <= max_ammo, i++) + if(!give_round(new load_type(src))) + break + update_appearance(UPDATE_ICON) diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/_internal.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/_internal.dm new file mode 100644 index 000000000000..c14e66af82cf --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/_internal.dm @@ -0,0 +1,8 @@ +/obj/item/ammo_box/magazine/internal + desc = "Oh god, this shouldn't be here" + flags_1 = CONDUCT_1 + item_flags = ABSTRACT + +//internals magazines are accessible, so replace spent ammo if full when trying to put a live one in +/obj/item/ammo_box/magazine/internal/give_round(obj/item/ammo_casing/R) + return ..(R,1) diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/bow.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/bow.dm new file mode 100644 index 000000000000..785dbfbe51b3 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/bow.dm @@ -0,0 +1,31 @@ +/obj/item/ammo_box/magazine/internal/bow + name = "bow... magazine?" //shouldnt see this item + ammo_type = /obj/item/ammo_casing/reusable/arrow + caliber = "arrow" + max_ammo = 1 + start_empty = TRUE + +/obj/item/ammo_box/magazine/internal/bow/energy + ammo_type = /obj/item/ammo_casing/reusable/arrow/energy + start_empty = FALSE + var/list/selectable_types = list(/obj/item/ammo_casing/reusable/arrow/energy, /obj/item/ammo_casing/reusable/arrow/energy/disabler) + +/obj/item/ammo_box/magazine/internal/bow/energy/advanced + selectable_types = list(/obj/item/ammo_casing/reusable/arrow/energy, /obj/item/ammo_casing/reusable/arrow/energy/disabler, /obj/item/ammo_casing/reusable/arrow/energy/xray, /obj/item/ammo_casing/reusable/arrow/energy/pulse, /obj/item/ammo_casing/reusable/arrow/energy/shock) + +/obj/item/ammo_box/magazine/internal/bow/energy/ert + selectable_types = list(/obj/item/ammo_casing/reusable/arrow/energy, /obj/item/ammo_casing/reusable/arrow/energy/disabler, /obj/item/ammo_casing/reusable/arrow/energy/pulse, /obj/item/ammo_casing/reusable/arrow/energy/shock) + +/obj/item/ammo_box/magazine/internal/bow/energy/syndicate + selectable_types = list(/obj/item/ammo_casing/reusable/arrow/energy, /obj/item/ammo_casing/reusable/arrow/energy/xray) + +/obj/item/ammo_box/magazine/internal/bow/energy/clockcult + ammo_type = /obj/item/ammo_casing/reusable/arrow/energy/clockbolt + selectable_types = list(/obj/item/ammo_casing/reusable/arrow/energy/clockbolt) + +/obj/item/ammo_box/magazine/arrow + name = "crossbow magazine" + ammo_type = /obj/item/ammo_casing/reusable/arrow + icon_state = ".50mag" + caliber = "arrow" + max_ammo = 5 diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/grenade.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/grenade.dm new file mode 100644 index 000000000000..c0d1d8d54269 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/grenade.dm @@ -0,0 +1,30 @@ +/obj/item/ammo_box/magazine/internal/cylinder/grenademulti + name = "grenade launcher internal magazine" + ammo_type = /obj/item/ammo_casing/a40mm + caliber = "40mm" + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/grenadelauncher + name = "grenade launcher internal magazine" + ammo_type = /obj/item/ammo_casing/a40mm + caliber = "40mm" + max_ammo = 1 + +/obj/item/ammo_box/magazine/internal/rocketlauncher + name = "rocket launcher internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/rocket + caliber = "84mm" + max_ammo = 1 + +/obj/item/ammo_box/magazine/internal/cannonball + name = "cannonball" + ammo_type = /obj/item/ammo_casing/caseless/cannonball + caliber = "100mm" + max_ammo = 1 + +/obj/item/ammo_box/magazine/internal/rods + name = "rods" + ammo_type = /obj/item/ammo_casing/caseless/bolts + caliber = null + max_ammo = 1 + diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/misc.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/misc.dm new file mode 100644 index 000000000000..bb0a404f7307 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/misc.dm @@ -0,0 +1,11 @@ +/obj/item/ammo_box/magazine/internal/minigun + name = "gatling gun fusion core" + ammo_type = /obj/item/ammo_casing/caseless/laser/gatling + caliber = "gatling" + max_ammo = 5000 + +/obj/item/ammo_box/magazine/internal/minigunosprey + name = "Minigun back stash box" + ammo_type = /obj/item/ammo_casing/a546 + caliber = "a556" + max_ammo = 500 \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/revolver.dm new file mode 100644 index 000000000000..56624d03b8eb --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/revolver.dm @@ -0,0 +1,38 @@ +/obj/item/ammo_box/magazine/internal/cylinder/rev38 + name = "detective revolver cylinder" + ammo_type = /obj/item/ammo_casing/c38/rubber + caliber = "38" + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/cylinder/tra32 + name = "\improper Caldwell revolver cylinder" + ammo_type = /obj/item/ammo_casing/tra32 + caliber = "32trac" + max_ammo = 7 + +/obj/item/ammo_box/magazine/internal/cylinder/rev44 + name = "\improper Mateba revolver cylinder" + ammo_type = /obj/item/ammo_casing/m44 + caliber = "44" + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/cylinder/rev762 + name = "\improper Nagant revolver cylinder" + ammo_type = /obj/item/ammo_casing/n762 + caliber = "n762" + max_ammo = 7 + +/obj/item/ammo_box/magazine/internal/cylinder/rus357 + name = "\improper Russian revolver cylinder" + ammo_type = /obj/item/ammo_casing/a357 + caliber = "357" + max_ammo = 6 + multiload = 0 + +/obj/item/ammo_box/magazine/internal/rus357/Initialize(mapload) + stored_ammo += new ammo_type(src) + . = ..() + +/obj/item/ammo_box/magazine/internal/cylinder/derringer + name = "derringer revolver cylinder" + max_ammo = 2 diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/rifle.dm new file mode 100644 index 000000000000..a7469284a5c7 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -0,0 +1,15 @@ +/obj/item/ammo_box/magazine/internal/boltaction + name = "bolt action rifle internal magazine" + desc = "Oh god, this shouldn't be here" + ammo_type = /obj/item/ammo_casing/a762 + caliber = "a762" + max_ammo = 5 + multiload = 1 + +/obj/item/ammo_box/magazine/internal/boltaction/enchanted + max_ammo = 1 + ammo_type = /obj/item/ammo_casing/a762/enchanted + +/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage + ammo_type = /obj/item/ammo_casing/magic/arcane_barrage + diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/shotgun.dm new file mode 100644 index 000000000000..6837764791b1 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -0,0 +1,50 @@ +/obj/item/ammo_box/magazine/internal/shot + name = "shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/beanbag + caliber = "shotgun" + max_ammo = 4 + multiload = 0 + +/obj/item/ammo_box/magazine/internal/shot/tube + name = "dual feed shotgun internal tube" + ammo_type = /obj/item/ammo_casing/shotgun/rubbershot + max_ammo = 4 + +/obj/item/ammo_box/magazine/internal/shot/lethal + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + +/obj/item/ammo_box/magazine/internal/shot/com + name = "combat shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/shot/com/compact + name = "compact combat shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + max_ammo = 4 + +/obj/item/ammo_box/magazine/internal/shot/dual + name = "double-barrel shotgun internal magazine" + max_ammo = 2 + +/obj/item/ammo_box/magazine/internal/shot/improvised + name = "improvised shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/improvised + max_ammo = 1 + +/obj/item/ammo_box/magazine/internal/shot/riot + name = "riot shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/rubbershot + max_ammo = 6 + +/obj/item/ammo_box/magazine/internal/shot/breaching + name = "breaching shotgun internal magazine" + ammo_type = /obj/item/ammo_casing/shotgun/breacher + max_ammo = 3 + caliber = "breaching" + +/obj/item/ammo_box/magazine/internal/shot/lever + name = "lever-action rifle internal magazine" + ammo_type = /obj/item/ammo_casing/m308 + max_ammo = 8 + caliber = "m308" diff --git a/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/toy.dm b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/toy.dm new file mode 100644 index 000000000000..10653bab7062 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/boxes_magazines/internal/toy.dm @@ -0,0 +1,7 @@ +/obj/item/ammo_box/magazine/internal/shot/toy + ammo_type = /obj/item/ammo_casing/reusable/foam_dart + caliber = "foam_force" + max_ammo = 4 + +/obj/item/ammo_box/magazine/internal/shot/toy/crossbow + max_ammo = 5 diff --git a/modular_dripstation/code/modules/projectiles/guns/_energy.dm b/modular_dripstation/code/modules/projectiles/guns/_energy.dm new file mode 100644 index 000000000000..c7e053b18b33 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/guns/_energy.dm @@ -0,0 +1,26 @@ +/obj/item/gun/energy/update_overlays() + if(QDELETED(src)) + return + . = ..() + if(!automatic_charge_overlays) + return + + var/overlay_icon_state = "[icon_state]_charge" + var/obj/item/ammo_casing/energy/shot = ammo_type[select] + if(modifystate) + . += mutable_appearance(icon, "[icon_state]_[initial(shot.select_name)]") + if(cell.charge < shot.e_cost) + . += "[icon_state]_empty" + return + if(modifystate) + overlay_icon_state += "_[initial(shot.select_name)]" + + var/ratio = get_charge_ratio() + if(shaded_charge) + . += "[icon_state]_charge[ratio]" + return + for(var/i = ratio, i >= 1, i--) + var/mutable_appearance/charge_overlay = mutable_appearance(icon, overlay_icon_state) + charge_overlay.pixel_x = ammo_x_offset * (i - 1) + charge_overlay.pixel_y = ammo_y_offset * (i - 1) + . += charge_overlay \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/guns/ballistic/automatic.dm b/modular_dripstation/code/modules/projectiles/guns/ballistic/automatic.dm new file mode 100644 index 000000000000..4319b9f0ca29 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/guns/ballistic/automatic.dm @@ -0,0 +1,319 @@ +/obj/item/gun/ballistic/automatic/proto + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + +/obj/item/gun/ballistic/automatic/c20r + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + +/obj/item/gun/ballistic/automatic/c20r/cobra + name = "\improper 'Cobra' 18" + desc = "An older model of SMG manufactured by Scarborough Arms, a predecessor to the military C-20 series. Chambered in .45." + can_bayonet = FALSE + can_suppress = TRUE + icon_state = "c18_cobra" + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + +/obj/item/gun/ballistic/automatic/c20r/waffle + name = "\improper W-20" + desc = "A brand new SMG manufactured by Waffle Arms. Chambered in .45." + can_bayonet = FALSE + empty_indicator = FALSE + can_suppress = TRUE + spread = 0 + icon_state = "waffle_smg" + pin = /obj/item/firing_pin/fucked + +/obj/item/gun/ballistic/automatic/c20r/waffle/unrestricted + pin = /obj/item/firing_pin + +/obj/item/gun/ballistic/automatic/c20r/vector + name = "\improper UNN PDW-45 'Vector'" + desc = "A brand new SMG manufactured by UNN nicknamed Vector. Chambered in .45." + can_bayonet = FALSE + empty_indicator = TRUE + can_suppress = FALSE + icon_state = "unn_vector" + fire_delay = 0 + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + pin = /obj/item/firing_pin/dna/secure + +/obj/item/gun/ballistic/automatic/c20r/aegis + name = "\improper 'Aegis'" + desc = "An SMG manufactured for Nanotrasen`s Special Operations Department. Chambered in .45." + can_bayonet = FALSE + can_suppress = FALSE + mag_display_ammo = FALSE + icon_state = "nt_aegis" + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + +/obj/item/gun/ballistic/automatic/wt550 + item_state = "wt550" + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + +/obj/item/gun/ballistic/automatic/wt550/armory + icon_state = "wt550_secure" + item_state = "wt550_secure" + pin = /obj/item/firing_pin/implant/mindshield + +/obj/item/gun/ballistic/automatic/sa450 + name = "\improper Shellgard security auto carbine" + desc = "A personal defence weapon that uses 4.6x30mm rounds, designated the SA-450 Automatic Carbine. Has a four-round burst or a semi-automatic firing mode." + icon_state = "shelg_smg" + item_state = "shelg_smg" + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + mag_type = /obj/item/ammo_box/magazine/sa450 + fire_delay = 2 + burst_size = 4 + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_MEDIUM + can_suppress = TRUE + can_bayonet = TRUE + knife_x_offset = 25 + knife_y_offset = 12 + mag_display = TRUE + +/obj/item/gun/ballistic/automatic/mini_uzi + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + +/obj/item/gun/ballistic/automatic/tommygun + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + +/obj/item/gun/ballistic/automatic/m90 + name = "\improper Militech M-90gl" + desc = "A three-round burst 5.56 toploading rifle, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off." + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + mag_display_ammo = TRUE + +/obj/item/gun/ballistic/automatic/m90/m31a1 + name = "\improper Militech M-31a1 Advanced Infantry Combat Weapon" + desc = "A three-round burst 5.56 toploading rifle, designated 'M-31a1', is more expensive in manufacturing predecessor of 'M-90gl'. It has an attached underbarrel grenade launcher which can be toggled on and off." + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + icon_state = "m31a1" + empty_indicator = FALSE + can_suppress = TRUE + pin = /obj/item/firing_pin + +/obj/item/gun/ballistic/automatic/p90 + name = "\improper P-90 Personal Defense Weapon" + desc = "A three-round burst 5.56 toploading rifle, designated 'P-90PDW'." + icon_state = "p90" + item_state = "m90" + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + mag_type = /obj/item/ammo_box/magazine/m556 + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = FALSE + burst_size = 3 + fire_delay = 2 + pin = /obj/item/firing_pin + mag_display = TRUE + empty_indicator = TRUE + +/obj/item/gun/ballistic/automatic/ar + mag_display = TRUE + can_suppress = TRUE + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + fire_sound = 'sound/weapons/rifleshot.ogg' + item_state = "arifle" + fire_sound_volume = 80 + vary_fire_sound = 0 + +/obj/item/gun/ballistic/automatic/ar/mk4 + name = "\improper Militech M-K4 Infantry Assault Rifle" + desc = "A robust assault rifle used by Militech fighting forces." + icon_state = "militech_mkIV" + pin = /obj/item/firing_pin/dna + +/obj/item/gun/ballistic/automatic/ar/mk4/grn + name = "\improper Militech M-K4 Infantry Assault Rifle" + desc = "A robust assault rifle used by Militech fighting forces." + icon_state = "militech_mkIV_grn" + item_state = "militech_mkIV_grn" + +/obj/item/gun/ballistic/automatic/ar/tgm16 + name = "\improper TGM-16 Infantry Assault Rifle" + desc = "A robust assault rifle used by Terra Gov Marine Corps." + icon_state = "tgm16" + pin = /obj/item/firing_pin + +/obj/item/gun/ballistic/automatic/ar/waffle + name = "\improper W-5 Infantry Assault Rifle" + desc = "A robust assault rifle used by Waffle Special Operations Division." + icon_state = "waffle_assault" + pin = /obj/item/firing_pin/fucked + +/obj/item/gun/ballistic/automatic/ar/waffle/unrestricted + pin = /obj/item/firing_pin + +//STM-9 +/obj/item/gun/ballistic/automatic/stm9 + name = "\improper Souze TM-9 Gen.3" + desc = "STM 9x19mm sport pistol-carbine supplied by some unknown union to Terra Gov. Speed, accuracy and comfort recoil." + icon_state = "stm9" + item_state = "lwt650" + mag_type = /obj/item/ammo_box/magazine/pistolm9mm + starting_mag_type = /obj/item/ammo_box/magazine/pistolm9mm/pmag + fire_delay = 0 //800 shots per minute, hello there + burst_size = 1 + spread = 3 //need simple scope + recoil = 0.5 + pin = /obj/item/firing_pin + w_class = WEIGHT_CLASS_BULKY + weapon_weight = WEAPON_MEDIUM + mag_display = TRUE + can_suppress = TRUE + can_unsuppress = TRUE + actions_types = list() + vary_fire_sound = FALSE + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + load_sound = "sound/weapons/rifleload.ogg" + load_empty_sound = "sound/weapons/rifleload.ogg" + rack_sound = "sound/weapons/riflerack.ogg" + eject_sound = "sound/weapons/rifleunload.ogg" + eject_empty_sound = "sound/weapons/rifleunload.ogg" + +/obj/item/gun/ballistic/automatic/k41s + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + + + +/obj/item/gun/ballistic/automatic/pistol + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + +/obj/item/gun/ballistic/automatic/pistol/stickman + icon = 'icons/obj/guns/projectile.dmi' + + +/obj/item/gun/ballistic/automatic/pistol/glock17 + name = "\improper Glock-17" + desc = "A weapon from bygone times, this has been made to look like an old, blocky firearm from the 21st century. Chambered in 9x19mm." + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + icon_state = "glock" + w_class = WEIGHT_CLASS_NORMAL + mag_type = /obj/item/ammo_box/magazine/pistolm9mm + starting_mag_type = /obj/item/ammo_box/magazine/pistolm9mm/pmag + can_suppress = FALSE + fire_sound = 'modular_dripstation/sound/weapons/pistol/shot_alt.ogg' + fire_delay = 1 + +/obj/item/gun/ballistic/automatic/pistol/glock17/ancile + name = "\improper NB-2 'Ancile'" + desc = "Nanotrasen easily concealable servise pistol. Chambered in 9x19mm." + icon_state = "nt_ancile" + w_class = WEIGHT_CLASS_SMALL + can_suppress = FALSE + starting_mag_type = /obj/item/ammo_box/magazine/pistolm9mm + +/obj/item/gun/ballistic/automatic/pistol/glock18 + name = "\improper Glock-18" + desc = "Terra Gov burst firing cheap polymer pistol chambered in 9x19mm. Its heavy duty barrel affects firerate." + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + icon_state = "glock18" + w_class = WEIGHT_CLASS_NORMAL + mag_type = /obj/item/ammo_box/magazine/pistolm9mm + starting_mag_type = /obj/item/ammo_box/magazine/pistolm9mm/pmag + can_suppress = FALSE + fire_sound = 'modular_dripstation/sound/weapons/pistol/shot_alt.ogg' + burst_size = 3 + fire_delay = 2 + +/obj/item/gun/ballistic/automatic/pistol/glock18/shelg + name = "\improper SSP-7 'Lawer'" + desc = "Burst firing cheap pocket polymer pistol chambered in 9x19mm manufactured by Shellgard Arms branch. Nicknamed 'Lawer' by Shellgard security officers." + icon_state = "shelg_lawyer" + w_class = WEIGHT_CLASS_SMALL + fire_delay = 1 + starting_mag_type = /obj/item/ammo_box/magazine/pistolm9mm + +/obj/item/gun/ballistic/automatic/pistol/fn45 + name = "\improper FNX-45 Tactical" + desc = "Tactical modern Terra Gov service pistol. Better, faster, stronger than other service pistols. \ + Do not as iconic as M1911, but reliable and modern. Chambered in .45 caliber. Has a threaded barrel for suppressors." + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + icon_state = "fnx" + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + w_class = WEIGHT_CLASS_NORMAL + mag_type = /obj/item/ammo_box/magazine/fn45 + starting_mag_type = /obj/item/ammo_box/magazine/fn45 + spread = 3 + can_suppress = TRUE + can_unsuppress = TRUE + fire_sound = "sound/weapons/pistolshotsmall.ogg" + feedback_types = list( + "fire" = 3 + ) + +/obj/item/gun/ballistic/automatic/pistol/m1911/alt + name = "\improper M1911M" + desc = "A modern variant of classic .45 handgun with a small magazine capacity." + icon_state = "m1911b" + +/obj/item/gun/ballistic/automatic/pistol/m1911/signature + name = "\improper M1911 Signature" + desc = "A rare variant of classic .45 handgun with a small magazine capacity." + icon_state = "ma_signature1911" + +/obj/item/gun/ballistic/automatic/pistol/ntusp + icon = 'icons/obj/guns/projectile.dmi' + + +// L6 SAW // + +/obj/item/gun/ballistic/automatic/l6_saw + desc = "A modified 5.56x45mm light machine gun, designated 'L6 SAW'. Has 'Militech Armoury - 2503' engraved on the receiver below the designation." + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + item_state = "l6" + mag_type = /obj/item/ammo_box/magazine/mm556x45_100 + +/obj/item/gun/ballistic/automatic/l6_saw/Initialize(mapload) + . = ..() + update_appearance(UPDATE_ICON) + +/obj/item/gun/ballistic/automatic/l6_saw/update_icon() + . = ..() + item_state = "[initial(item_state)][cover_open ? "open" : "closed"][magazine ? "mag" : "nomag"]" + if(ismob(loc)) + var/mob/M = loc + M.update_inv_hands() + +/obj/item/gun/ballistic/automatic/l6_saw/m60 + name = "\improper L4 GPMG" + desc = "A general purpose 7.62 machine gun, designated 'L4 GPMG'. Heavyly modified for single combatant usage." + icon_state = "m60" + item_state = "m60" + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + mag_type = /obj/item/ammo_box/magazine/mm712x82 + +/obj/item/gun/ballistic/automatic/l6_saw/m60/unrestricted + pin = /obj/item/firing_pin + +///Borg L6 +/obj/item/gun/energy/printer + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + +///Laser rifle +/obj/item/gun/ballistic/automatic/laser + name = "\improper energy carbine" + +/obj/item/gun/ballistic/automatic/laser/tgmc + name = "\improper TGM 43" + desc = "Assault energy carabine, designated 'TGM 43'. This energy rifle is commonly found in the hands of Terra Gov Marines." + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + icon_state = "tgm43" + mag_display = TRUE + mag_display_ammo = TRUE + empty_indicator = TRUE \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/guns/ballistic/flamethrower.dm b/modular_dripstation/code/modules/projectiles/guns/ballistic/flamethrower.dm new file mode 100644 index 000000000000..3daf5095ce13 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/guns/ballistic/flamethrower.dm @@ -0,0 +1,7 @@ +/obj/item/flamethrower + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + +///Borg flame +/obj/item/gun/energy/printer/flamethrower + icon_state = "flamethrower1" + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/guns/ballistic/launchers.dm b/modular_dripstation/code/modules/projectiles/guns/ballistic/launchers.dm new file mode 100644 index 000000000000..37b8c9addc3a --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/guns/ballistic/launchers.dm @@ -0,0 +1,2 @@ +/obj/item/gun/ballistic/gauss + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/guns/ballistic/rifle.dm b/modular_dripstation/code/modules/projectiles/guns/ballistic/rifle.dm new file mode 100644 index 000000000000..463c8261e8b2 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/guns/ballistic/rifle.dm @@ -0,0 +1,69 @@ +///Sniper/// +/obj/item/gun/ballistic/rifle/sniper_rifle + name = "\improper anti-material sniper rifle" + icon_state = "antimaterial_rifle" + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + +/obj/item/gun/ballistic/rifle/sniper_rifle/syndicate + icon_state = "antimaterial_rifle_blc" + +/obj/item/gun/ballistic/rifle/sniper_rifle/ultrasecure + icon_state = "antimaterial_rifle_blc" + +/obj/item/gun/ballistic/rifle/sniper_rifle/waffle + name = "\improper anti-material sniper rifle W-7" + icon_state = "waffle_sniper" + item_state = "waffle_sniper" + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + pin = /obj/item/firing_pin/fucked + +/obj/item/gun/ballistic/rifle/sniper_rifle/waffle/unrestricted + pin = /obj/item/firing_pin + +///Boltaction/// +/obj/item/gun/ballistic/rifle/boltaction/brand_new + desc = "A brand new Mosin Nagant issued by Nanotrasen for their interns. You would rather not to damage it." + icon_state = "mosinprime" + item_state = "mosinprime" + sawn_desc = "A sawn-off Brand New Nagant... Doing this was a sin, I hope you're happy. \ + You are now probably one of the few people in the universe to ever hold a \"Brand New Obrez\". \ + Even thinking about that name combination makes you ill." + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/guns_on_back.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + zoomable = TRUE + zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. + zoom_out_amt = 2 + actions_types = list() + +/obj/item/gun/ballistic/rifle/boltaction/brand_new/sawoff(mob/user) + . = ..() + if(.) + name = "\improper Brand New Obrez" // wear it loud and proud + +/obj/item/gun/ballistic/rifle/boltaction/qmrifle + name = "\improper 'Forbidden' precision rifle" + desc = "Modernized boltaction rifle, the frame feels robust as cargotech liver. \ + This thing was probably built with a conversion kit from a shady NTnet site. \ +

\ + BRAND NEW: Cannot be sawn off." + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/guns_on_back.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + icon_state = "mosintactical" + item_state = "mosintactical" + can_be_sawn_off = FALSE + +// The Lionhunter, a gun for heretics +// The ammo it uses takes time to "charge" before firing, +// releasing a homing, very damaging projectile +/obj/item/gun/ballistic/rifle/boltaction/lionhunter + name = "\improper Lionhunter's Rifle" + desc = "An antique looking rifle that looks immaculate despite being clearly very old. There are visually no aiming devices on the weapon." + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + worn_icon = 'modular_dripstation/icons/mob/clothing/guns_on_back.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/guns/ballistic/shotgun.dm b/modular_dripstation/code/modules/projectiles/guns/ballistic/shotgun.dm new file mode 100644 index 000000000000..e57b77f6f5de --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -0,0 +1,30 @@ +/obj/item/gun/ballistic/shotgun/automatic/dual_tube + icon = 'modular_dripstation/icons/obj/weapons/ballistic.dmi' + icon_state = "cycler" + +/obj/item/gun/ballistic/shotgun/bulldog + desc = "A semi-auto, mag-fed Scarborough Arms shotgun for combat in narrow corridors, nicknamed the 'Bulldog' by boarding parties. Only compatible with specialized 8-round drum magazines." + +/obj/item/gun/ballistic/shotgun/bulldog/m12 + name = "\improper Combat Assault Shotgun M-12" + desc = "A semi-auto, mag-fed Militech shotgun for combat in narrow corridors, nicknamed 'Saiga' by boarding parties. Compatible only with specialized 8-round drum magazines." + icon_state = "militech_bulldogCAS" + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + mag_display_ammo = FALSE + pin = /obj/item/firing_pin/dna + +/obj/item/gun/ballistic/shotgun/bulldog/waffle + name = "\improper Waffle Combat Assault Shotgun W-12" + desc = "A semi-auto, mag-fed Waffle shotgun for combat in narrow corridors. Compatible only with specialized 8-round drum magazines." + icon_state = "waffle_shotgun" + item_state = "waffle_shotgun" + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + can_suppress = TRUE + mag_display_ammo = FALSE + empty_indicator = FALSE + pin = /obj/item/firing_pin/fucked + +/obj/item/gun/ballistic/shotgun/bulldog/waffle/unrestricted + pin = /obj/item/firing_pin \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_dripstation/code/modules/projectiles/guns/energy/energy_gun.dm new file mode 100644 index 000000000000..b5b65da67337 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/guns/energy/energy_gun.dm @@ -0,0 +1,107 @@ +/obj/item/gun/energy/e_gun + icon = 'modular_dripstation/icons/obj/weapons/energy.dmi' + +/obj/item/gun/energy/e_gun/ancient + name = "NT-E1 gun" + desc = "The NT-E2 is a basic energy gun that has only one mode. Kill." + icon_state = "energyold" + ammo_type = list(/obj/item/ammo_casing/energy/laser) + +/obj/item/gun/energy/e_gun/nuclear + ammo_x_offset = 2 + +/obj/item/gun/energy/e_gun/stun + cell_type = /obj/item/stock_parts/cell/pulse/pistol //specops grade cell + +/obj/item/gun/energy/e_gun/energyrevolver + name = "\improper NT-S02 Revolver Energy Gun" + desc = "An expensive, modern recreation of the antique laser gun, and the second of the 'S' or personal defense weapons meant for the use of high ranking Nanotrasen`s Special Operations Department personnel. Like the standard energy gun, it has a stun and kill setting, but also provides specops grade taser setting." + pin = /obj/item/firing_pin/implant/centcom_mindshield + icon_state = "energyrevolver" + item_state = "gun" + ammo_x_offset = 2 + force = 10 + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode/spec, /obj/item/ammo_casing/energy/laser) + +/obj/item/gun/energy/e_gun/hos + name = "\improper NT-S03 MultiPhase Energy Gun" + desc = "An expensive recreation of the antique laser gun, and the third of the 'S' or personal defense weapons meant for the use of high ranking Nanotrasen`s Special Operations Department personnel. Like the standard energy gun, it has a stun and kill setting, but due to the increase in demand of portable EMP-based weaponry, this weapon is equipped with an ion mode. Lacks the ability to recharge on its own but provides military grade taser setting." + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/ion/hos) + +/obj/item/gun/energy/e_gun/pdwpistol + name = "\improper NT-S04 MultiPhase Energy Gun" + desc = "An expensive, modern remake of the NT-S03 MultiPhase Energy gun, and the fourth of the 'S' or special class weapons meant for the use of high ranking Nanotrasen`s Special Operations Department personnel. Robust gun with multiple modes for combat issue. Glory to the NanoTrasen!" + icon_state = "pdwpistol" + item_state = "gun" + force = 15 + ammo_x_offset = 2 + pin = /obj/item/firing_pin/implant/centcom_mindshield + cell_type = /obj/item/stock_parts/cell/pulse/pistol + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode/spec, /obj/item/ammo_casing/energy/laser_spec, /obj/item/ammo_casing/energy/ion) + +/obj/item/gun/energy/sniperrifle + name = "L.W.A.P. Sniper Rifle" + desc = "A beam rifle constructed of lightweight materials, fitted with a SMART aiming-system scope." + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + icon_state = "esniper" + ammo_type = list(/obj/item/ammo_casing/energy/laser/hitscan/sniper) + slot_flags = ITEM_SLOT_BACK + w_class = WEIGHT_CLASS_BULKY + zoomable = TRUE + zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. + fire_delay = 10 + ammo_x_offset = 2 + charge_sections = 3 + pin = /obj/item/firing_pin/implant/mindshield + +/obj/item/gun/energy/sniperrifle + icon_state = "esniper_black" + +/obj/item/gun/energy/plasmarifle + name = "Plasma Assault Rifle" + desc = "A plasma rifle constructed of lightweight materials, Cybersun Armory. Slowly fires powerful plasma projectiles." + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + icon_state = "cybersun_plasmarifle" + ammo_type = list(/obj/item/ammo_casing/energy/plasma/combat) + slot_flags = ITEM_SLOT_BACK + w_class = WEIGHT_CLASS_BULKY + pin = /obj/item/firing_pin/fucked + charge_sections = 1 + shaded_charge = 1 + +/obj/item/gun/energy/e_gun/mini + name = "miniature energy gun" + desc = "A small, pistol-sized version of the energy gun with a built-in flashlight. The NT-E4 functions as a popular self defense weapon among the elite due to its small size and cheap price. It has three settings: disable, stun and kill." + icon_state = "mini" + item_state = "gun" + w_class = WEIGHT_CLASS_SMALL + cell_type = /obj/item/stock_parts/cell/mini_egun + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) + +/obj/item/gun/energy/e_gun/mini/secure + icon_state = "minialt" + pin = /obj/item/firing_pin/implant/mindshield + +/obj/item/gun/energy/e_gun/mini/specops //easy concealable gun for NT special operations department + cell_type = /obj/item/stock_parts/cell/pulse/pistol //specops grade cell + pin = /obj/item/firing_pin/implant/centcom_mindshield + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/electrode/spec, /obj/item/ammo_casing/energy/laser_spec) + +/obj/item/gun/energy/e_gun/mini/practice_phaser + icon = 'icons/obj/guns/energy.dmi' + +/obj/item/gun/energy/e_gun/bouncer + icon = 'icons/obj/guns/energy.dmi' + +/obj/item/gun/energy/e_gun/dragnet + icon = 'icons/obj/guns/energy.dmi' + +/obj/item/gun/energy/e_gun/turret + icon = 'icons/obj/guns/energy.dmi' + +/obj/item/gun/energy/e_gun/stun + desc = "NT-ME5 Hybrid Energy Gun" + desc = "The NT-ME5 hybrid energy gun is the newest generation of standardized energy equipment for use by NT private military forces. This hybrid energy gun comes equipped with two settings: disable and kill." + pin = /obj/item/firing_pin/implant/mindshield diff --git a/modular_dripstation/code/modules/projectiles/guns/energy/laser.dm b/modular_dripstation/code/modules/projectiles/guns/energy/laser.dm new file mode 100644 index 000000000000..0a3fb7b189bf --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/guns/energy/laser.dm @@ -0,0 +1,79 @@ +/obj/item/gun/energy/laser + name = "NT-L4 laser gun" + desc = "The NT-L4 is a basic energy-based laser gun that uses full potential of beam guns and hits targets through glass and thin metal at the speed of light." + icon = 'modular_dripstation/icons/obj/weapons/energy.dmi' + ammo_type = list(/obj/item/ammo_casing/energy/laser/hitscan) + +/obj/item/gun/energy/laser/practice + ammo_type = list(/obj/item/ammo_casing/energy/laser/practice/hitscan) + +/obj/item/gun/energy/laser/tactical + name = "NT-L5 laser gun" + desc = "The NT-L5 is a basic energy-based laser gun that uses full potential of beam guns and hits targets through glass and thin metal at the speed of light. Has a preinstalled mindshield pin." + icon_state = "laser-new" + pin = /obj/item/firing_pin/implant/centcom_mindshield + +/obj/item/gun/energy/laser/cybersun + name = "laser carbine (Cybersun)" + desc = "Basic energy-based laser gun that uses full potential of beam guns and hits targets through glass and thin metal at the speed of light. Cybersun model used by contract paramilitary forces." + icon_state = "lasercarbine-cybersun" + item_state = LASER + w_class = WEIGHT_CLASS_NORMAL + materials = list(/datum/material/iron=2000) + ammo_type = list(/obj/item/ammo_casing/energy/laser/hitscan) + ammo_x_offset = 1 + shaded_charge = 1 + +/obj/item/gun/energy/laser/captain + name = "antique energy gun" + desc = "The NT-S01 energy gun is NT`s first attempt to provide an inbuilt recharger, and is the first in its line as an 'S' or special class weapon given to Nanotrasen`s Special Operations Department members. Due to how expensive it is to produce, and that the material used to do so deteriorates quickly, it was decommissioned, and the few models left are used as prizes meant to never see the light of day." + ammo_type = list(/obj/item/ammo_casing/energy/laser) + +/obj/item/gun/energy/laser/centcom + name = "\improper NT-S05 Laser Service Pistol" + icon_state = "centcomlaser" + item_state = "gun" + w_class = WEIGHT_CLASS_NORMAL + desc = "The NT-S05 laser gun is NT`s recreation of NT-S01 aiming to provide an inbuilt recharger with laser functions. It also has 'S' or special class weapon given to Nanotrasen`s Special Operations Department members. Now in service with NanoTrasen`s Special Operations Department agents." + pin = /obj/item/firing_pin/implant/centcom_mindshield + force = 10 + selfcharge = 1 + charge_amount = 2 + cell_type = /obj/item/stock_parts/cell/pulse/pistol + ammo_type = list(/obj/item/ammo_casing/energy/laser/hitscan) + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + +/obj/item/gun/energy/laser/hellgun + name ="hellfire energy gun" + desc = "The NT-E2, nicknamed 'hellgun', is the second non-experimental model laser gun, built before NT began installing regulators on its laser weaponry. This pattern of laser gun became infamous for the gruesome burn wounds and fires that it caused, and was quietly discontinued once it began to affect NT's reputation." + icon_state = "immolator" + modifystate = TRUE + +/obj/item/gun/energy/laser/hellgun/scattershot + name = "scatter shot hellfire laser rifle" + icon_state = "multilensimmolator" + item_state = LASER + desc = "The NT-E2 gun equipped with a refraction kit that spreads and precise energy bolts." + w_class = WEIGHT_CLASS_BULKY + ammo_type = list(/obj/item/ammo_casing/energy/laser/hellfire/scatter, /obj/item/ammo_casing/energy/laser/hellfire/precise) + shaded_charge = 1 + selfcharge = 1 + +/obj/item/gun/energy/lasercannon + modifystate = TRUE + icon = 'modular_dripstation/icons/obj/weapons/energy.dmi' + +/obj/item/gun/energy/xray + w_class = WEIGHT_CLASS_BULKY + ammo_x_offset = 4 + modifystate = TRUE + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + +/obj/item/gun/energy/laser/redtag + icon = 'icons/obj/guns/energy.dmi' + +/obj/item/gun/energy/laser/bluetag + icon = 'icons/obj/guns/energy.dmi' + +/obj/item/gun/energy/laser/instakill + icon = 'icons/obj/guns/energy.dmi' \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/guns/energy/pulse.dm b/modular_dripstation/code/modules/projectiles/guns/energy/pulse.dm new file mode 100644 index 000000000000..01b521d2953a --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/guns/energy/pulse.dm @@ -0,0 +1,21 @@ +/obj/item/gun/energy/pulse + icon = 'modular_dripstation/icons/obj/weapons/energy.dmi' + pin = /obj/item/firing_pin/implant/centcom_mindshield + +/obj/item/gun/energy/pulse/pistol + ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse/pistol, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) + +/obj/item/gun/energy/pulse/destroyer + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + icon_state = "pulse_destroyer" + item_state = "pulse" + +/obj/item/gun/energy/pulse/pistol/m1911 + icon = 'icons/obj/guns/energy.dmi' + +/obj/item/gun/energy/pulse/carbine/tgm + name = "\improper TGM 19c4" + desc = "Assault pulse carabine, designated 'TGM 19c4'. This pulse rifle is commonly found in the hands of Terra Gov Marines." + icon = 'modular_dripstation/icons/obj/weapons/48x32.dmi' + icon_state = "tgm19c4" + item_state = "pulse" \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/guns/energy/special.dm b/modular_dripstation/code/modules/projectiles/guns/energy/special.dm new file mode 100644 index 000000000000..1f3e4655444b --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/guns/energy/special.dm @@ -0,0 +1,62 @@ +/obj/item/gun/energy/ionrifle + icon = 'modular_dripstation/icons/obj/weapons/energy.dmi' + +/obj/item/gun/energy/ionrifle/pistol + name = "ion pistol" + desc = "The NT-I3 Prototype Ion Projector is a compact ion pistol, built for personal defense." + icon_state = "ionpistol" + item_state = null + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL + slot_flags = ITEM_SLOT_BELT + ammo_type = list(/obj/item/ammo_casing/energy/ion/weak) + cell_type = /obj/item/stock_parts/cell/mini_egun + ammo_x_offset = 2 + charge_sections = 2 + +/obj/item/gun/energy/ionrifle/cybersun + name = "compact ion rifle" + desc = "The CS-I7 Prototype Ion Projector is a compact ion rifle, built to be very ergonomic and deadly efficient." + icon_state = "ioncarbine-cybersun" + w_class = WEIGHT_CLASS_NORMAL + slot_flags = ITEM_SLOT_BELT + ammo_x_offset = 3 + charge_sections = 3 + +/obj/item/gun/energy/temperature + icon = 'modular_dripstation/icons/obj/weapons/energy.dmi' + +/obj/item/gun/energy/temperature/security + icon_state = "freezegun_secure" + pin = /obj/item/firing_pin/implant/mindshield + +/obj/item/gun/energy/kinetic_accelerator/crossbow + icon = 'modular_dripstation/icons/obj/weapons/energy.dmi' + +/obj/item/gun/energy/kinetic_accelerator/crossbow/large + name = "energy crossbow" + desc = "A weapon favored by Madmen." + icon_state = "crossbowlarge" + w_class = WEIGHT_CLASS_NORMAL + materials = list(/datum/material/iron=4000) + suppressed = null + ammo_type = list(/obj/item/ammo_casing/energy/bolt/large) + pin = null + +/obj/item/gun/syringe + icon_state = "medicalsyringegun" + item_state = "medicalsyringegun" + icon = 'modular_dripstation/icons/obj/weapons/syringegun.dmi' + lefthand_file = 'modular_dripstation/icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'modular_dripstation/icons/mob/inhands/guns_righthand.dmi' + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK + +/obj/item/gun/syringe/syndicate + icon_state = "dartsyringegun" + item_state = "dartsyringegun" + slot_flags = ITEM_SLOT_BELT + +/obj/item/gun/syringe/dna + icon_state = "dnasyringegun" \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/guns/energy/stun.dm b/modular_dripstation/code/modules/projectiles/guns/energy/stun.dm new file mode 100644 index 000000000000..7f6e87eff967 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/guns/energy/stun.dm @@ -0,0 +1,18 @@ +/obj/item/gun/energy/pulse + icon = 'modular_dripstation/icons/obj/weapons/energy.dmi' + +/obj/item/gun/energy/taser + icon = 'modular_dripstation/icons/obj/weapons/energy.dmi' + +/obj/item/gun/energy/tesla_revolver + modifystate = TRUE + icon = 'modular_dripstation/icons/obj/weapons/energy.dmi' + +/obj/item/gun/energy/disabler + icon = 'modular_dripstation/icons/obj/weapons/energy.dmi' + +/obj/item/gun/energy/disabler/secure + name = "NT-D2S" + desc = "The NT-D2 is a self-defense weapon that exhausts organic targets, weakening them until they collapse. Has white painting and secured pin." + icon_state = "disabler_secure" + pin = /obj/item/firing_pin/implant/mindshield \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/pins.dm b/modular_dripstation/code/modules/projectiles/pins.dm new file mode 100644 index 000000000000..19e657fd0863 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/pins.dm @@ -0,0 +1,10 @@ +/obj/item/firing_pin/dna/secure + name = "secure dna firing pin" + +/obj/item/firing_pin/dna/secure/gun_remove(mob/living/user) + auth_fail(user) + return FALSE + +/obj/item/firing_pin/dna/dredd/gun_remove(mob/living/user) + auth_fail(user) + return FALSE \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/projectile/bullets/grenade.dm b/modular_dripstation/code/modules/projectiles/projectile/bullets/grenade.dm new file mode 100644 index 000000000000..f8f09249dcf5 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/projectile/bullets/grenade.dm @@ -0,0 +1,5 @@ +// 40mm (Grenade Launcher + +/obj/projectile/bullet/a40mm + icon_state = "40mm" + icon = 'modular_dripstation/icons/effects/projectiles/projectiles.dmi' \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/projectile/bullets/pistol.dm b/modular_dripstation/code/modules/projectiles/projectile/bullets/pistol.dm new file mode 100644 index 000000000000..7d28bc205be5 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/projectile/bullets/pistol.dm @@ -0,0 +1,5 @@ +/obj/projectile/bullet/c9mm/ap + armour_penetration = 30 + +/obj/projectile/bullet/c10mm/ap + armour_penetration = 30 \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/projectile/bullets/rifle.dm b/modular_dripstation/code/modules/projectiles/projectile/bullets/rifle.dm new file mode 100644 index 000000000000..da48330c292b --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/projectile/bullets/rifle.dm @@ -0,0 +1,25 @@ +//////intermediate bullets////// +// 5.56mm (M-90gl Rifle + NT ARG) +///Standart 5.56 +/obj/projectile/bullet/a556 + armour_penetration = 10 + +///Incendiary 5.56 +/obj/projectile/bullet/incendiary/a556 + armour_penetration = 20 + +///New SSAAP 5.56 +/obj/projectile/bullet/a556/ssaap + name = "5.56mm TGov SSA AP bullet" + damage = 29 + armour_penetration = 60 + penetration_flags = PENETRATE_MOBS + penetrations = 1 + wound_bonus = -45 + +///AP 5.56 +/obj/projectile/bullet/a556/ap + damage = 32 + name = "5.56mm M995 bullet" + armour_penetration = 40 + wound_bonus = -45 \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/projectile/bullets/shotgun.dm b/modular_dripstation/code/modules/projectiles/projectile/bullets/shotgun.dm new file mode 100644 index 000000000000..bf88fbd19596 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -0,0 +1,9 @@ +/obj/projectile/bullet/pellet/shotgun_buckshot/syndie + name = "12/70 RIP-S" + bare_wound_bonus = 10 //shotgunning assistants, PAINfully + +/obj/projectile/bullet/shotgun/slug/syndie + name = "12g AP-СSS" + damage = 50 //damage reduced + armour_penetration = 20 // Armor Piercing + wound_bonus = -10 // better bleeding chance \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/projectile/bullets/smg.dm b/modular_dripstation/code/modules/projectiles/projectile/bullets/smg.dm new file mode 100644 index 000000000000..126c6ccde2e8 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/projectile/bullets/smg.dm @@ -0,0 +1,2 @@ +/obj/projectile/bullet/c45/ap + armour_penetration = 30 \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/projectile/energy/beams.dm b/modular_dripstation/code/modules/projectiles/projectile/energy/beams.dm new file mode 100644 index 000000000000..604886913305 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/projectile/energy/beams.dm @@ -0,0 +1,56 @@ +/obj/projectile/beam/laser/hitscan + tracer_type = /obj/effect/projectile/tracer/laser/hitscan + muzzle_type = /obj/effect/projectile/muzzle/laser/hitscan + impact_type = /obj/effect/projectile/impact/laser/hitscan + hitscan = TRUE + eyeblur = 0 + +/obj/projectile/beam/practice/hitscan + tracer_type = /obj/effect/projectile/tracer/laser/hitscan + muzzle_type = /obj/effect/projectile/muzzle/laser/hitscan + impact_type = /obj/effect/projectile/impact/laser/hitscan + hitscan = TRUE + eyeblur = 0 + +/obj/projectile/beam/laser/hitscan/sniper + tracer_type = /obj/effect/projectile/tracer/laser/hitscan/sniper + muzzle_type = /obj/effect/projectile/muzzle/laser/hitscan/sniper + impact_type = /obj/effect/projectile/impact/laser/hitscan/sniper + damage = 60 + light_color = LIGHT_COLOR_LAVENDER + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser + penetrations = 3 + penetration_flags = PENETRATE_OBJECTS | PENETRATE_MOBS + range = 16 + +/obj/projectile/beam/laser/hitscan/sniper/on_hit(atom/target, blocked = FALSE) + if((blocked != 100) && iscarbon(target)) + var/mob/living/carbon/M = target + M.adjustStaminaLoss(40) + M.Knockdown(2 SECONDS) + return ..() + +/obj/projectile/beam/laser/spec //basicly overpowered + speed = 1 + armour_penetration = 10 + wound_bonus = -20 + bare_wound_bonus = 40 + damage = 30 + +/obj/projectile/beam/laser/hellfire/scatter + name = "hellfire pellet" + icon_state = "scatterlaser" + damage = 10 + +/obj/projectile/beam/pulse + icon_state = "pulse" + icon = 'modular_dripstation/icons/effects/projectiles/projectiles.dmi' + +/obj/projectile/beam/pulse/pistol + icon_state = "pulse2" + +/obj/projectile/beam/pulse/shotgun + icon_state = "pulse1" + +/obj/projectile/beam/pulse/heavy + icon_state = "pulse_heavy" \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/projectile/energy/ebow.dm b/modular_dripstation/code/modules/projectiles/projectile/energy/ebow.dm new file mode 100644 index 000000000000..463c2acebe71 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/projectile/energy/ebow.dm @@ -0,0 +1,15 @@ +/obj/projectile/energy/bolt + icon_state = "dart" + icon = 'modular_dripstation/icons/effects/projectiles/projectiles.dmi' + +/obj/projectile/energy/bolt/large //big ebow bolts + name = "large bolt" + irradiate = 300 + pass_flags = PASSGLASS + +/obj/projectile/energy/bolt/on_hit(atom/target, blocked = FALSE) + ..() + if(ishuman(target)) + target.reagents.add_reagent(/datum/reagent/toxin/relaxant, 8) + target.reagents.add_reagent(/datum/reagent/toxin/mutetoxin, 8) + target.reagents.add_reagent(/datum/reagent/toxin/anacea, 6) diff --git a/modular_dripstation/code/modules/projectiles/projectile/energy/plasma.dm b/modular_dripstation/code/modules/projectiles/projectile/energy/plasma.dm new file mode 100644 index 000000000000..9ec88fcde968 --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/projectile/energy/plasma.dm @@ -0,0 +1,16 @@ +/obj/projectile/plasma/combat + range = 7 + mine_range = 5 + light_power = 2 + speed = 1.4 // plasma ball slow + damage = 40 + wound_bonus = 10 + light_color = LIGHT_COLOR_GREEN + damage_type = BURN + pass_flags = PASSTABLE | PASSGRILLE + icon_state = "plasma" + icon = 'modular_dripstation/icons/effects/projectiles/projectiles.dmi' + impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser + tracer_type = /obj/effect/projectile/tracer/bfg + muzzle_type = /obj/effect/projectile/muzzle/bfg + impact_type = /obj/effect/projectile/impact/bfg \ No newline at end of file diff --git a/modular_dripstation/code/modules/projectiles/projectile/energy/stun.dm b/modular_dripstation/code/modules/projectiles/projectile/energy/stun.dm new file mode 100644 index 000000000000..01ce29ece69a --- /dev/null +++ b/modular_dripstation/code/modules/projectiles/projectile/energy/stun.dm @@ -0,0 +1,41 @@ +/obj/projectile/energy/electrode + name = "electrode" + icon_state = "spark" + color = "#FFFF00" + nodamage = TRUE + hitsound = 'sound/weapons/taserhit.ogg' + range = 7 + reflectable = NONE //Yeah, it`s phisical, not energy + tracer_type = /obj/effect/projectile/tracer/stun + muzzle_type = /obj/effect/projectile/muzzle/stun + impact_type = /obj/effect/projectile/impact/stun + +/obj/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) + . = ..() + if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks! + do_sparks(1, TRUE, src) + else if(iscarbon(target)) + var/mob/living/carbon/C = target + SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased) + SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) + if(C.dna && (C.dna.check_mutation(HULK))) + C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") + else if((C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE)) + C.set_confusion_if_lower(10 SECONDS) + C.set_stutter_if_lower(16 SECONDS) + addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 1.5 SECONDS), 0.5 SECONDS) + addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, apply_stun_effect)), 2 SECONDS) + //yogstation edit begin ------------------------------------------- + if(istype(C.getorganslot(ORGAN_SLOT_STOMACH), /obj/item/organ/stomach/cell/ethereal)) + C.adjust_nutrition(40) + to_chat(C,span_notice("You get charged by [src].")) + //yogstation edit end --------------------------------------------- + +/obj/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet + do_sparks(1, TRUE, src) + ..() + +/mob/living/carbon/proc/apply_stun_effect() + adjustStaminaLoss(30) + Knockdown(10 SECONDS) + do_jitter_animation(10 SECONDS) \ No newline at end of file diff --git a/modular_dripstation/code/modules/uplink/uplink_items.dm b/modular_dripstation/code/modules/uplink/uplink_items.dm index 7cf6380e2799..dd6060ff1027 100644 --- a/modular_dripstation/code/modules/uplink/uplink_items.dm +++ b/modular_dripstation/code/modules/uplink/uplink_items.dm @@ -33,6 +33,88 @@ cost = 9 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/infiltration) //you can't buy it in nuke, because the elite hardsuit costs the same while being better // yogs: infiltration +/datum/uplink_item/dangerous/errata + name = "Nanoforged Katana" + desc = "A tailor-made blade forged from unknown ninja clan within the Syndicate. \ + Merely weilding this weapon grants incredible agility." + item = /obj/item/storage/belt/errata + cost = 12 + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/infiltration) // yogs: infiltration + +/datum/uplink_item/dangerous/murasame + name = "Cursed Katana" + desc = "Edgy looking katana that has a posibility to kill humans in one blow. Wield with caution -\ + blade is coated with poison - one pierce of the skin will end your life, agent." + item = /obj/item/katana/murasame + cost = 20 + surplus = 0 + player_minimum = 25 + exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops, /datum/game_mode/infiltration) // yogs: infiltration + +/datum/uplink_item/dangerous/machinegun + name = "L6 Squad Automatic Weapon" + desc = "A fully-loaded Militech Armoury belt-fed machine gun. \ + This deadly weapon has a massive 100-round magazine of light 5.56x45mm ammunition." + item = /obj/item/gun/ballistic/automatic/l6_saw + cost = 16 + surplus = 0 + include_modes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/dangerous/heavymachinegun + name = "L4 General Purpose Machine Gun" + desc = "A fully-loaded Militech Armoury belt-fed machine gun. \ + This deadly weapon has a massive 50-round magazine of devastating 7.12x82mm ammunition." + item = /obj/item/gun/ballistic/automatic/l6_saw/m60 + cost = 20 + surplus = 0 + include_modes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/ammo/machinegun/basic + desc = "A 50-round magazine of 7.12x82mm ammunition for use with the L4 GPMG. \ + By the time you need to use this, you'll already be standing on a pile of corpses." + +/datum/uplink_item/ammo/machinegun/ap + desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L4 GPMG; equipped with special properties \ + to puncture even the most durable armor." + +/datum/uplink_item/ammo/machinegun/hollow + desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L4 GPMG; equipped with hollow-point tips to help \ + with the unarmored masses of crew." + +/datum/uplink_item/ammo/machinegun/inc + desc = "A 50-round magazine of 7.12x82mm ammunition for use in the L4 GPMG; tipped with a special flammable \ + mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn." + +/datum/uplink_item/ammo/machinegun556 + cost = 4 + surplus = 0 + include_modes = list(/datum/game_mode/nuclear) + +/datum/uplink_item/ammo/machinegun556/basic + name = "5.56x45mm Box Magazine" + desc = "A 100-round magazine of 5.56x45mm ammunition for use with the L6 SAW. \ + By the time you need to use this, you'll already be standing on a pile of corpses." + item = /obj/item/ammo_box/magazine/mm556x45_100 + +/datum/uplink_item/ammo/machinegun556/ap + name = "5.56x45mm (Armor-Piercing) Box Magazine" + desc = "A 100-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \ + to puncture regular grade bulletproof armor." + item = /obj/item/ammo_box/magazine/mm556x45_100/ap + +/datum/uplink_item/ammo/machinegun556/ssaap + name = "5.56x45mm (TGov SSA AP) Box Magazine" + desc = "A 100-round magazine of 5.56x45mm ammunition for use in the L6 SAW; equipped with special properties \ + to puncture special grade bulletproof armor." + item = /obj/item/ammo_box/magazine/mm556x45_100/ssaap + cost = 6 + +/datum/uplink_item/ammo/machinegun556/inc + name = "5.56x45mm (Incendiary) Box Magazine" + desc = "A 100-round magazine of 5.56x45mm ammunition for use in the L6 SAW; tipped with a special flammable \ + mixture that'll ignite anyone struck by the bullet. Some men just want to watch the world burn." + item = /obj/item/ammo_box/magazine/mm556x45_100/inc + /datum/uplink_item/role_restricted/hardsuit name = "GEC Blood-Red RIG" desc = "Hardsuit of Global Engineering Consortium, represented in Syndicate as a minor force. Freedom for Engineers!" diff --git a/modular_dripstation/icons/effects/projectiles/impact.dmi b/modular_dripstation/icons/effects/projectiles/impact.dmi new file mode 100644 index 000000000000..a00b8f9f0b8c Binary files /dev/null and b/modular_dripstation/icons/effects/projectiles/impact.dmi differ diff --git a/modular_dripstation/icons/effects/projectiles/muzzle.dmi b/modular_dripstation/icons/effects/projectiles/muzzle.dmi new file mode 100644 index 000000000000..6ef1a3458eb5 Binary files /dev/null and b/modular_dripstation/icons/effects/projectiles/muzzle.dmi differ diff --git a/modular_dripstation/icons/effects/projectiles/projectiles.dmi b/modular_dripstation/icons/effects/projectiles/projectiles.dmi new file mode 100644 index 000000000000..a5d3bed082a8 Binary files /dev/null and b/modular_dripstation/icons/effects/projectiles/projectiles.dmi differ diff --git a/modular_dripstation/icons/effects/projectiles/tracer.dmi b/modular_dripstation/icons/effects/projectiles/tracer.dmi new file mode 100644 index 000000000000..408462b9497b Binary files /dev/null and b/modular_dripstation/icons/effects/projectiles/tracer.dmi differ diff --git a/modular_dripstation/icons/mob/clothing/back.dmi b/modular_dripstation/icons/mob/clothing/back.dmi new file mode 100644 index 000000000000..6afd0c028a8a Binary files /dev/null and b/modular_dripstation/icons/mob/clothing/back.dmi differ diff --git a/modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi b/modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi new file mode 100644 index 000000000000..a941fcbd2319 Binary files /dev/null and b/modular_dripstation/icons/mob/clothing/weapons_on_belt.dmi differ diff --git a/modular_dripstation/icons/mob/inhands/guns_lefthand.dmi b/modular_dripstation/icons/mob/inhands/guns_lefthand.dmi index 87d9332db003..510fcdc0eb1c 100644 Binary files a/modular_dripstation/icons/mob/inhands/guns_lefthand.dmi and b/modular_dripstation/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/modular_dripstation/icons/mob/inhands/guns_righthand.dmi b/modular_dripstation/icons/mob/inhands/guns_righthand.dmi index be3e720e8a37..5aa4c74e6d6d 100644 Binary files a/modular_dripstation/icons/mob/inhands/guns_righthand.dmi and b/modular_dripstation/icons/mob/inhands/guns_righthand.dmi differ diff --git a/modular_dripstation/icons/mob/inhands/melee_lefthand.dmi b/modular_dripstation/icons/mob/inhands/melee_lefthand.dmi new file mode 100644 index 000000000000..9064b91633ec Binary files /dev/null and b/modular_dripstation/icons/mob/inhands/melee_lefthand.dmi differ diff --git a/modular_dripstation/icons/mob/inhands/melee_righthand.dmi b/modular_dripstation/icons/mob/inhands/melee_righthand.dmi new file mode 100644 index 000000000000..b1f4fccc3ed2 Binary files /dev/null and b/modular_dripstation/icons/mob/inhands/melee_righthand.dmi differ diff --git a/modular_dripstation/icons/mob/inhands/security_lefthand.dmi b/modular_dripstation/icons/mob/inhands/security_lefthand.dmi index b3f49af053ef..13290593d770 100644 Binary files a/modular_dripstation/icons/mob/inhands/security_lefthand.dmi and b/modular_dripstation/icons/mob/inhands/security_lefthand.dmi differ diff --git a/modular_dripstation/icons/mob/inhands/security_righthand.dmi b/modular_dripstation/icons/mob/inhands/security_righthand.dmi index 65c48c22f7e6..de5460847d0d 100644 Binary files a/modular_dripstation/icons/mob/inhands/security_righthand.dmi and b/modular_dripstation/icons/mob/inhands/security_righthand.dmi differ diff --git a/modular_dripstation/icons/mob/inhands/shield_lefthand.dmi b/modular_dripstation/icons/mob/inhands/shield_lefthand.dmi new file mode 100644 index 000000000000..8087c67cfba6 Binary files /dev/null and b/modular_dripstation/icons/mob/inhands/shield_lefthand.dmi differ diff --git a/modular_dripstation/icons/mob/inhands/shield_righthand.dmi b/modular_dripstation/icons/mob/inhands/shield_righthand.dmi new file mode 100644 index 000000000000..19698d81cf3e Binary files /dev/null and b/modular_dripstation/icons/mob/inhands/shield_righthand.dmi differ diff --git a/modular_dripstation/icons/obj/ammo.dmi b/modular_dripstation/icons/obj/ammo.dmi new file mode 100644 index 000000000000..5c73f929694c Binary files /dev/null and b/modular_dripstation/icons/obj/ammo.dmi differ diff --git a/modular_dripstation/icons/obj/weapons/48x32.dmi b/modular_dripstation/icons/obj/weapons/48x32.dmi index 7b7ee4064aa2..cea01c6c4fcb 100644 Binary files a/modular_dripstation/icons/obj/weapons/48x32.dmi and b/modular_dripstation/icons/obj/weapons/48x32.dmi differ diff --git a/modular_dripstation/icons/obj/weapons/ballistic.dmi b/modular_dripstation/icons/obj/weapons/ballistic.dmi new file mode 100644 index 000000000000..8877c1c7113f Binary files /dev/null and b/modular_dripstation/icons/obj/weapons/ballistic.dmi differ diff --git a/modular_dripstation/icons/obj/weapons/blades.dmi b/modular_dripstation/icons/obj/weapons/blades.dmi new file mode 100644 index 000000000000..b777a1f97c96 Binary files /dev/null and b/modular_dripstation/icons/obj/weapons/blades.dmi differ diff --git a/modular_dripstation/icons/obj/weapons/bows.dmi b/modular_dripstation/icons/obj/weapons/bows.dmi new file mode 100644 index 000000000000..ce4a31798660 Binary files /dev/null and b/modular_dripstation/icons/obj/weapons/bows.dmi differ diff --git a/modular_dripstation/icons/obj/weapons/energy.dmi b/modular_dripstation/icons/obj/weapons/energy.dmi new file mode 100644 index 000000000000..005f0a93e9ca Binary files /dev/null and b/modular_dripstation/icons/obj/weapons/energy.dmi differ diff --git a/modular_dripstation/icons/obj/weapons/grenade.dmi b/modular_dripstation/icons/obj/weapons/grenade.dmi new file mode 100644 index 000000000000..2cae47be47c2 Binary files /dev/null and b/modular_dripstation/icons/obj/weapons/grenade.dmi differ diff --git a/modular_dripstation/icons/obj/weapons/melee.dmi b/modular_dripstation/icons/obj/weapons/melee.dmi new file mode 100644 index 000000000000..c139c3c71c31 Binary files /dev/null and b/modular_dripstation/icons/obj/weapons/melee.dmi differ diff --git a/modular_dripstation/icons/obj/weapons/security.dmi b/modular_dripstation/icons/obj/weapons/security.dmi index d510634d6f16..843a91c1dcc0 100644 Binary files a/modular_dripstation/icons/obj/weapons/security.dmi and b/modular_dripstation/icons/obj/weapons/security.dmi differ diff --git a/modular_dripstation/icons/obj/weapons/shield.dmi b/modular_dripstation/icons/obj/weapons/shield.dmi new file mode 100644 index 000000000000..c8ca2723cdd1 Binary files /dev/null and b/modular_dripstation/icons/obj/weapons/shield.dmi differ diff --git a/modular_dripstation/icons/obj/weapons/syringegun.dmi b/modular_dripstation/icons/obj/weapons/syringegun.dmi new file mode 100644 index 000000000000..a794f66f6f93 Binary files /dev/null and b/modular_dripstation/icons/obj/weapons/syringegun.dmi differ diff --git a/modular_dripstation/includes.dm b/modular_dripstation/includes.dm index 8d97786d439b..2edb318e89b4 100644 --- a/modular_dripstation/includes.dm +++ b/modular_dripstation/includes.dm @@ -15,6 +15,7 @@ #include "code\datums\mood_events\generic_positive_events.dm" #include "code\datums\reagent\baldium.dm" #include "code\datums\reagent\chemoverride.dm" +#include "code\datums\reagent\condensed_capsaicin.dm" #include "code\datums\reagent\leadacetate.dm" #include "code\datums\reagent\ondansetron.dm" #include "code\datums\reagent\restore_nanites.dm" @@ -26,6 +27,7 @@ #include "code\datums\traits\positive.dm" #include "code\game\effects\effects_foam.dm" #include "code\game\effects\temporary_visuals\misc.dm" +#include "code\game\effects\temporary_visuals\projectiles.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\machinery\airlock_control.dm" #include "code\game\machinery\aug_manipulator.dm" @@ -66,6 +68,7 @@ #include "code\game\objects\effects\effect_system\effects_explosions.dm" #include "code\game\objects\items\ashtray.dm" #include "code\game\objects\items\barriertape.dm" +#include "code\game\objects\items\baton.dm" #include "code\game\objects\items\bepis_items\boomerang.dm" #include "code\game\objects\items\bepis_items\eng_gloves.dm" #include "code\game\objects\items\bepis_items\explorerpin.dm" @@ -98,6 +101,7 @@ #include "code\game\objects\items\devices\radio\encryptionkey.dm" #include "code\game\objects\items\devices\radio\radio.dm" #include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\errata.dm" #include "code\game\objects\items\handcuffs.dm" #include "code\game\objects\items\holotool.dm" #include "code\game\objects\items\holy_weapons.dm" @@ -109,11 +113,12 @@ #include "code\game\objects\items\implants\implantuplink.dm" #include "code\game\objects\items\implants\mindshield.dm" #include "code\game\objects\items\manuals.dm" +#include "code\game\objects\items\melee\energy.dm" #include "code\game\objects\items\miscellaneous.dm" #include "code\game\objects\items\mop.dm" #include "code\game\objects\items\pinpointer.dm" -#include "code\game\objects\items\projectiles\guns\ballistic\rifle.dm" #include "code\game\objects\items\robot\robot_items.dm" +#include "code\game\objects\items\shield.dm" #include "code\game\objects\items\stacks\cash.dm" #include "code\game\objects\items\stacks\medical.dm" #include "code\game\objects\items\stacks\sheet_type.dm" @@ -132,7 +137,9 @@ #include "code\game\objects\items\tools_syndicate.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" +#include "code\game\objects\items\twohanded\dualsaber.dm" #include "code\game\objects\items\weaponry.dm" +#include "code\game\objects\items\wielded\sledgehammer.dm" #include "code\game\objects\structures\artstuff.dm" #include "code\game\objects\structures\beds_chairs\chair.dm" #include "code\game\objects\structures\beds_chairs\sofa.dm" @@ -337,6 +344,35 @@ #include "code\modules\power\singularity\collector.dm" #include "code\modules\power\singularity\generator.dm" #include "code\modules\power\supermatter\supermatter.dm" +#include "code\modules\projectiles\ammunition\ballistic.dm" +#include "code\modules\projectiles\ammunition\energy.dm" +#include "code\modules\projectiles\ammunition\plasma.dm" +#include "code\modules\projectiles\boxes_magazines\external\mg.dm" +#include "code\modules\projectiles\boxes_magazines\external\pistol.dm" +#include "code\modules\projectiles\boxes_magazines\external\rifle.dm" +#include "code\modules\projectiles\boxes_magazines\external\shotgun.dm" +#include "code\modules\projectiles\boxes_magazines\external\smg.dm" +#include "code\modules\projectiles\guns\_energy.dm" +#include "code\modules\projectiles\guns\ballistic\automatic.dm" +#include "code\modules\projectiles\guns\ballistic\flamethrower.dm" +#include "code\modules\projectiles\guns\ballistic\launchers.dm" +#include "code\modules\projectiles\guns\ballistic\rifle.dm" +#include "code\modules\projectiles\guns\ballistic\shotgun.dm" +#include "code\modules\projectiles\guns\energy\energy_gun.dm" +#include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\pulse.dm" +#include "code\modules\projectiles\guns\energy\special.dm" +#include "code\modules\projectiles\guns\energy\stun.dm" +#include "code\modules\projectiles\projectile\bullets\grenade.dm" +#include "code\modules\projectiles\projectile\bullets\pistol.dm" +#include "code\modules\projectiles\projectile\bullets\rifle.dm" +#include "code\modules\projectiles\projectile\bullets\shotgun.dm" +#include "code\modules\projectiles\projectile\bullets\smg.dm" +#include "code\modules\projectiles\projectile\energy\beams.dm" +#include "code\modules\projectiles\projectile\energy\ebow.dm" +#include "code\modules\projectiles\projectile\energy\plasma.dm" +#include "code\modules\projectiles\projectile\energy\stun.dm" +#include "code\modules\projectiles\pins.dm" #include "code\modules\reagents\autoinjector.dm" #include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" #include "code\modules\reagents\chemistry\machinery\chem_master.dm" diff --git a/modular_dripstation/sound/weapons/Katana_Select01.ogg b/modular_dripstation/sound/weapons/Katana_Select01.ogg new file mode 100644 index 000000000000..b31efeab7b16 Binary files /dev/null and b/modular_dripstation/sound/weapons/Katana_Select01.ogg differ diff --git a/modular_dripstation/sound/weapons/Katana_Select02.ogg b/modular_dripstation/sound/weapons/Katana_Select02.ogg new file mode 100644 index 000000000000..437c9f26c0b2 Binary files /dev/null and b/modular_dripstation/sound/weapons/Katana_Select02.ogg differ diff --git a/modular_dripstation/sound/weapons/blade_sheath.ogg b/modular_dripstation/sound/weapons/blade_sheath.ogg new file mode 100644 index 000000000000..4d01d529c84b Binary files /dev/null and b/modular_dripstation/sound/weapons/blade_sheath.ogg differ diff --git a/modular_dripstation/sound/weapons/blade_unsheath.ogg b/modular_dripstation/sound/weapons/blade_unsheath.ogg new file mode 100644 index 000000000000..befe44eeab91 Binary files /dev/null and b/modular_dripstation/sound/weapons/blade_unsheath.ogg differ diff --git a/modular_dripstation/sound/weapons/block/sound_weapons_block_blade.ogg b/modular_dripstation/sound/weapons/block/sound_weapons_block_blade.ogg new file mode 100644 index 000000000000..7358b291b39b Binary files /dev/null and b/modular_dripstation/sound/weapons/block/sound_weapons_block_blade.ogg differ diff --git a/modular_dripstation/sound/weapons/block/sound_weapons_block_shield.ogg b/modular_dripstation/sound/weapons/block/sound_weapons_block_shield.ogg new file mode 100644 index 000000000000..86b0bda6fd9f Binary files /dev/null and b/modular_dripstation/sound/weapons/block/sound_weapons_block_shield.ogg differ diff --git a/modular_dripstation/sound/weapons/block/sound_weapons_parry.ogg b/modular_dripstation/sound/weapons/block/sound_weapons_parry.ogg new file mode 100644 index 000000000000..f9d5638b85f7 Binary files /dev/null and b/modular_dripstation/sound/weapons/block/sound_weapons_parry.ogg differ diff --git a/modular_dripstation/sound/weapons/gun_drop.ogg b/modular_dripstation/sound/weapons/gun_drop.ogg new file mode 100644 index 000000000000..84853a33a434 Binary files /dev/null and b/modular_dripstation/sound/weapons/gun_drop.ogg differ diff --git a/modular_dripstation/sound/weapons/gun_pickup.ogg b/modular_dripstation/sound/weapons/gun_pickup.ogg new file mode 100644 index 000000000000..7e9ae86f1492 Binary files /dev/null and b/modular_dripstation/sound/weapons/gun_pickup.ogg differ diff --git a/modular_dripstation/sound/weapons/metal_drop.ogg b/modular_dripstation/sound/weapons/metal_drop.ogg new file mode 100644 index 000000000000..477b884d368d Binary files /dev/null and b/modular_dripstation/sound/weapons/metal_drop.ogg differ diff --git a/modular_dripstation/sound/weapons/pistol/shot_alt.ogg b/modular_dripstation/sound/weapons/pistol/shot_alt.ogg new file mode 100644 index 000000000000..583c3f36034d Binary files /dev/null and b/modular_dripstation/sound/weapons/pistol/shot_alt.ogg differ diff --git a/modular_dripstation/sound/weapons/taser.ogg b/modular_dripstation/sound/weapons/taser.ogg new file mode 100644 index 000000000000..c51cc8a37282 Binary files /dev/null and b/modular_dripstation/sound/weapons/taser.ogg differ diff --git a/modular_dripstation/sound/weapons/unsheathed_blade.ogg b/modular_dripstation/sound/weapons/unsheathed_blade.ogg new file mode 100644 index 000000000000..3e6f0cce180f Binary files /dev/null and b/modular_dripstation/sound/weapons/unsheathed_blade.ogg differ diff --git a/yogstation/code/game/objects/items/wielded/sledgehammer.dm b/yogstation/code/game/objects/items/wielded/sledgehammer.dm index 9c1c26c8df9f..6d238539ed96 100644 --- a/yogstation/code/game/objects/items/wielded/sledgehammer.dm +++ b/yogstation/code/game/objects/items/wielded/sledgehammer.dm @@ -24,6 +24,7 @@ wound_bonus = -15 bare_wound_bonus = 15 +/* /obj/item/melee/sledgehammer/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, \ @@ -38,6 +39,7 @@ requires_wielded=TRUE, \ no_multi_hit=TRUE, \ ) // big and heavy hammer makes wide arc +*/ /obj/item/melee/sledgehammer/proc/on_wield(atom/source, mob/living/user) hitsound = "swing_hit"