diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm
index d2a416bba2..2f395e4f1c 100644
--- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm
+++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm
@@ -590,9 +590,9 @@
"bW" = (
/obj/structure/closet/crate/secure/gear,
/obj/item/ammo_box/c10mm,
-/obj/item/ammo_casing/shotgun/meteorshot,
-/obj/item/ammo_casing/shotgun/meteorshot,
-/obj/item/ammo_casing/shotgun/meteorshot,
+/obj/item/ammo_casing/shotgun/meteorslug,
+/obj/item/ammo_casing/shotgun/meteorslug,
+/obj/item/ammo_casing/shotgun/meteorslug,
/turf/open/floor/mineral/titanium/yellow/airless,
/area/ruin/unpowered)
"bX" = (
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index ee8363e1b3..b84de7cf18 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -570,8 +570,8 @@
/obj/machinery/porta_turret/syndicate/pod
integrity_failure = 20
max_integrity = 40
- stun_projectile = /obj/item/projectile/bullet/weakbullet3
- lethal_projectile = /obj/item/projectile/bullet/weakbullet3
+ stun_projectile = /obj/item/projectile/bullet/syndicate_turret
+ lethal_projectile = /obj/item/projectile/bullet/syndicate_turret
/obj/machinery/porta_turret/ai
faction = "silicon"
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index b6b4241402..1e9616ae12 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -251,7 +251,7 @@
icon_state = "mecha_carbine"
origin_tech = "materials=4;combat=4"
equip_cooldown = 10
- projectile = /obj/item/projectile/bullet/incendiary/shell
+ projectile = /obj/item/projectile/bullet/incendiary/fnx99
projectiles = 24
projectile_energy_cost = 15
@@ -271,7 +271,7 @@
icon_state = "mecha_scatter"
origin_tech = "combat=4"
equip_cooldown = 20
- projectile = /obj/item/projectile/bullet/midbullet
+ projectile = /obj/item/projectile/bullet/scattershot
projectiles = 40
projectile_energy_cost = 25
projectiles_per_shot = 4
@@ -283,7 +283,7 @@
icon_state = "mecha_uac2"
origin_tech = "combat=4"
equip_cooldown = 10
- projectile = /obj/item/projectile/bullet/weakbullet3
+ projectile = /obj/item/projectile/bullet/lmg
projectiles = 300
projectile_energy_cost = 20
projectiles_per_shot = 3
diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm
index 8107c5a1f8..df40b2898c 100644
--- a/code/game/objects/items/storage/briefcase.dm
+++ b/code/game/objects/items/storage/briefcase.dm
@@ -1,57 +1,56 @@
-/obj/item/storage/briefcase
- name = "briefcase"
- desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional."
- icon_state = "briefcase"
- lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
- flags_1 = CONDUCT_1
- force = 8
- hitsound = "swing_hit"
- throw_speed = 2
- throw_range = 4
- w_class = WEIGHT_CLASS_BULKY
- max_w_class = WEIGHT_CLASS_NORMAL
- max_combined_w_class = 21
- attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
- resistance_flags = FLAMMABLE
- max_integrity = 150
- var/folder_path = /obj/item/folder //this is the path of the folder that gets spawned in New()
-
-/obj/item/storage/briefcase/PopulateContents()
- new /obj/item/pen(src)
- var/obj/item/folder/folder = new folder_path(src)
- for(var/i in 1 to 6)
- new /obj/item/paper(folder)
-
-/obj/item/storage/briefcase/lawyer
- folder_path = /obj/item/folder/blue
-
-/obj/item/storage/briefcase/lawyer/PopulateContents()
- new /obj/item/stamp/law(src)
- ..()
-
-/obj/item/storage/briefcase/sniperbundle
- name = "briefcase"
- desc = "It's label reads genuine hardened Captain leather, but suspiciously has no other tags or branding. Smells like L'Air du Temps."
- icon_state = "briefcase"
- flags_1 = CONDUCT_1
- force = 10
- hitsound = "swing_hit"
- throw_speed = 2
- throw_range = 4
- w_class = WEIGHT_CLASS_BULKY
- max_w_class = WEIGHT_CLASS_NORMAL
- max_combined_w_class = 21
- attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
- resistance_flags = FLAMMABLE
- max_integrity = 150
-
-/obj/item/storage/briefcase/sniperbundle/PopulateContents()
- ..() // in case you need any paperwork done after your rampage
- new /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate(src)
- new /obj/item/clothing/neck/tie/red(src)
- new /obj/item/clothing/under/syndicate/sniper(src)
- new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
- new /obj/item/ammo_box/magazine/sniper_rounds/haemorrhage(src)
- new /obj/item/suppressor/specialoffer(src)
-
+/obj/item/storage/briefcase
+ name = "briefcase"
+ desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional."
+ icon_state = "briefcase"
+ lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
+ flags_1 = CONDUCT_1
+ force = 8
+ hitsound = "swing_hit"
+ throw_speed = 2
+ throw_range = 4
+ w_class = WEIGHT_CLASS_BULKY
+ max_w_class = WEIGHT_CLASS_NORMAL
+ max_combined_w_class = 21
+ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
+ resistance_flags = FLAMMABLE
+ max_integrity = 150
+ var/folder_path = /obj/item/folder //this is the path of the folder that gets spawned in New()
+
+/obj/item/storage/briefcase/PopulateContents()
+ new /obj/item/pen(src)
+ var/obj/item/folder/folder = new folder_path(src)
+ for(var/i in 1 to 6)
+ new /obj/item/paper(folder)
+
+/obj/item/storage/briefcase/lawyer
+ folder_path = /obj/item/folder/blue
+
+/obj/item/storage/briefcase/lawyer/PopulateContents()
+ new /obj/item/stamp/law(src)
+ ..()
+
+/obj/item/storage/briefcase/sniperbundle
+ name = "briefcase"
+ desc = "It's label reads genuine hardened Captain leather, but suspiciously has no other tags or branding. Smells like L'Air du Temps."
+ icon_state = "briefcase"
+ flags_1 = CONDUCT_1
+ force = 10
+ hitsound = "swing_hit"
+ throw_speed = 2
+ throw_range = 4
+ w_class = WEIGHT_CLASS_BULKY
+ max_w_class = WEIGHT_CLASS_NORMAL
+ max_combined_w_class = 21
+ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
+ resistance_flags = FLAMMABLE
+ max_integrity = 150
+
+/obj/item/storage/briefcase/sniperbundle/PopulateContents()
+ ..() // in case you need any paperwork done after your rampage
+ new /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate(src)
+ new /obj/item/clothing/neck/tie/red(src)
+ new /obj/item/clothing/under/syndicate/sniper(src)
+ new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
+ new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
+ new /obj/item/suppressor/specialoffer(src)
diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm
index e15a655a63..52d9e38f6b 100644
--- a/code/game/objects/structures/manned_turret.dm
+++ b/code/game/objects/structures/manned_turret.dm
@@ -1,214 +1,214 @@
-/////// MANNED TURRET ////////
-
-/obj/machinery/manned_turret
- name = "machine gun turret"
- desc = "While the trigger is held down, this gun will redistribute recoil to allow its user to easily shift targets."
- icon = 'icons/obj/turrets.dmi'
- icon_state = "machinegun"
- can_buckle = TRUE
- density = TRUE
- max_integrity = 100
- buckle_lying = FALSE
- layer = ABOVE_MOB_LAYER
- var/view_range = 10
- var/cooldown = 0
- var/projectile_type = /obj/item/projectile/bullet/weakbullet3
- var/rate_of_fire = 1
- var/number_of_shots = 40
- var/cooldown_duration = 90
- var/atom/target
- var/turf/target_turf
- var/warned = FALSE
- var/list/calculated_projectile_vars
-
-/obj/machinery/manned_turret/Destroy()
- target = null
- target_turf = null
- ..()
-
-//BUCKLE HOOKS
-
-/obj/machinery/manned_turret/unbuckle_mob(mob/living/buckled_mob,force = FALSE)
- playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
- for(var/obj/item/I in buckled_mob.held_items)
- if(istype(I, /obj/item/gun_control))
- qdel(I)
- if(istype(buckled_mob))
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 0
- if(buckled_mob.client)
- buckled_mob.client.change_view(world.view)
- anchored = FALSE
- . = ..()
- STOP_PROCESSING(SSfastprocess, src)
-
-/obj/machinery/manned_turret/user_buckle_mob(mob/living/M, mob/living/carbon/user)
- if(user.incapacitated() || !istype(user))
- return
- M.forceMove(get_turf(src))
- . = ..()
- if(!.)
- return
- for(var/V in M.held_items)
- var/obj/item/I = V
- if(istype(I))
- if(M.dropItemToGround(I))
- var/obj/item/gun_control/TC = new(src)
- M.put_in_hands(TC)
- else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
- var/obj/item/gun_control/TC = new(src)
- M.put_in_hands(TC)
- M.pixel_y = 14
- layer = ABOVE_MOB_LAYER
- setDir(SOUTH)
- playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
- anchored = TRUE
- if(M.client)
- M.client.change_view(view_range)
- START_PROCESSING(SSfastprocess, src)
-
-/obj/machinery/manned_turret/process()
- if(!LAZYLEN(buckled_mobs))
- return PROCESS_KILL
- update_positioning()
-
-/obj/machinery/manned_turret/proc/update_positioning()
- var/mob/living/controller = buckled_mobs[1]
- if(!istype(controller))
- return
- var/client/C = controller.client
- if(C)
- var/atom/A = C.mouseObject
- var/turf/T = get_turf(A)
- if(istype(T)) //They're hovering over something in the map.
- direction_track(controller, T)
- calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(controller, C.mouseParams)
-
-/obj/machinery/manned_turret/proc/direction_track(mob/user, atom/targeted)
- if(user.incapacitated())
- return
- setDir(get_dir(src,targeted))
- user.setDir(dir)
- switch(dir)
- if(NORTH)
- layer = BELOW_MOB_LAYER
- user.pixel_x = 0
- user.pixel_y = -14
- if(NORTHEAST)
- layer = BELOW_MOB_LAYER
- user.pixel_x = -8
- user.pixel_y = -4
- if(EAST)
- layer = ABOVE_MOB_LAYER
- user.pixel_x = -14
- user.pixel_y = 0
- if(SOUTHEAST)
- layer = BELOW_MOB_LAYER
- user.pixel_x = -8
- user.pixel_y = 4
- if(SOUTH)
- layer = ABOVE_MOB_LAYER
- user.pixel_x = 0
- user.pixel_y = 14
- if(SOUTHWEST)
- layer = BELOW_MOB_LAYER
- user.pixel_x = 8
- user.pixel_y = 4
- if(WEST)
- layer = ABOVE_MOB_LAYER
- user.pixel_x = 14
- user.pixel_y = 0
- if(NORTHWEST)
- layer = BELOW_MOB_LAYER
- user.pixel_x = 8
- user.pixel_y = -4
-
-/obj/machinery/manned_turret/proc/checkfire(atom/targeted_atom, mob/user)
- target = targeted_atom
- if(target == user || user.incapacitated() || target == get_turf(src))
- return
- if(world.time < cooldown)
- if(!warned && world.time > (cooldown - cooldown_duration + rate_of_fire*number_of_shots)) // To capture the window where one is done firing
- warned = TRUE
- playsound(src, 'sound/weapons/sear.ogg', 100, 1)
- return
- else
- cooldown = world.time + cooldown_duration
- warned = FALSE
- volley(user)
-
-/obj/machinery/manned_turret/proc/volley(mob/user)
- target_turf = get_turf(target)
- for(var/i in 1 to number_of_shots)
- addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper, user), i*rate_of_fire)
-
-/obj/machinery/manned_turret/proc/fire_helper(mob/user)
- if(user.incapacitated())
- return
- update_positioning() //REFRESH MOUSE TRACKING!!
- var/turf/targets_from = get_turf(src)
- if(QDELETED(target))
- target = target_turf
- var/obj/item/projectile/P = new projectile_type(targets_from)
- P.current = targets_from
- P.starting = targets_from
- P.firer = user
- P.original = target
- playsound(src, 'sound/weapons/gunshot_smg.ogg', 75, 1)
- P.xo = target.x - targets_from.x
- P.yo = target.y - targets_from.y
- P.Angle = calculated_projectile_vars[1] + rand(-9, 9)
- P.p_x = calculated_projectile_vars[2]
- P.p_y = calculated_projectile_vars[3]
- P.fire()
-
-/obj/machinery/manned_turret/ultimate // Admin-only proof of concept for autoclicker automatics
- name = "Infinity Gun"
- view_range = 12
- projectile_type = /obj/item/projectile/bullet/weakbullet3
-
-/obj/machinery/manned_turret/ultimate/checkfire(atom/targeted_atom, mob/user)
- target = targeted_atom
- if(target == user || target == get_turf(src))
- return
- target_turf = get_turf(target)
- fire_helper(user)
-
-/obj/item/gun_control
- name = "turret controls"
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "offhand"
- w_class = WEIGHT_CLASS_HUGE
- flags_1 = ABSTRACT_1 | NODROP_1 | NOBLUDGEON_1 | DROPDEL_1
- resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
- var/obj/machinery/manned_turret/turret
-
-/obj/item/gun_control/Initialize()
- . = ..()
- turret = loc
- if(!istype(turret))
- return INITIALIZE_HINT_QDEL
-
-/obj/item/gun_control/Destroy()
- turret = null
- ..()
-
-/obj/item/gun_control/CanItemAutoclick()
- return TRUE
-
-/obj/item/gun_control/attack_obj(obj/O, mob/living/user)
- user.changeNext_move(CLICK_CD_MELEE)
- O.attacked_by(src, user)
-
-/obj/item/gun_control/attack(mob/living/M, mob/living/user)
- user.lastattacked = M
- M.lastattacker = user
- M.attacked_by(src, user)
- add_fingerprint(user)
-
-/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user, flag, params)
- ..()
- var/obj/machinery/manned_turret/E = user.buckled
- E.calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(user, params)
- E.direction_track(user, targeted_atom)
- E.checkfire(targeted_atom, user)
+/////// MANNED TURRET ////////
+
+/obj/machinery/manned_turret
+ name = "machine gun turret"
+ desc = "While the trigger is held down, this gun will redistribute recoil to allow its user to easily shift targets."
+ icon = 'icons/obj/turrets.dmi'
+ icon_state = "machinegun"
+ can_buckle = TRUE
+ density = TRUE
+ max_integrity = 100
+ buckle_lying = FALSE
+ layer = ABOVE_MOB_LAYER
+ var/view_range = 10
+ var/cooldown = 0
+ var/projectile_type = /obj/item/projectile/bullet/manned_turret
+ var/rate_of_fire = 1
+ var/number_of_shots = 40
+ var/cooldown_duration = 90
+ var/atom/target
+ var/turf/target_turf
+ var/warned = FALSE
+ var/list/calculated_projectile_vars
+
+/obj/machinery/manned_turret/Destroy()
+ target = null
+ target_turf = null
+ ..()
+
+//BUCKLE HOOKS
+
+/obj/machinery/manned_turret/unbuckle_mob(mob/living/buckled_mob,force = FALSE)
+ playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
+ for(var/obj/item/I in buckled_mob.held_items)
+ if(istype(I, /obj/item/gun_control))
+ qdel(I)
+ if(istype(buckled_mob))
+ buckled_mob.pixel_x = 0
+ buckled_mob.pixel_y = 0
+ if(buckled_mob.client)
+ buckled_mob.client.change_view(world.view)
+ anchored = FALSE
+ . = ..()
+ STOP_PROCESSING(SSfastprocess, src)
+
+/obj/machinery/manned_turret/user_buckle_mob(mob/living/M, mob/living/carbon/user)
+ if(user.incapacitated() || !istype(user))
+ return
+ M.forceMove(get_turf(src))
+ . = ..()
+ if(!.)
+ return
+ for(var/V in M.held_items)
+ var/obj/item/I = V
+ if(istype(I))
+ if(M.dropItemToGround(I))
+ var/obj/item/gun_control/TC = new(src)
+ M.put_in_hands(TC)
+ else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
+ var/obj/item/gun_control/TC = new(src)
+ M.put_in_hands(TC)
+ M.pixel_y = 14
+ layer = ABOVE_MOB_LAYER
+ setDir(SOUTH)
+ playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
+ anchored = TRUE
+ if(M.client)
+ M.client.change_view(view_range)
+ START_PROCESSING(SSfastprocess, src)
+
+/obj/machinery/manned_turret/process()
+ if(!LAZYLEN(buckled_mobs))
+ return PROCESS_KILL
+ update_positioning()
+
+/obj/machinery/manned_turret/proc/update_positioning()
+ var/mob/living/controller = buckled_mobs[1]
+ if(!istype(controller))
+ return
+ var/client/C = controller.client
+ if(C)
+ var/atom/A = C.mouseObject
+ var/turf/T = get_turf(A)
+ if(istype(T)) //They're hovering over something in the map.
+ direction_track(controller, T)
+ calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(controller, C.mouseParams)
+
+/obj/machinery/manned_turret/proc/direction_track(mob/user, atom/targeted)
+ if(user.incapacitated())
+ return
+ setDir(get_dir(src,targeted))
+ user.setDir(dir)
+ switch(dir)
+ if(NORTH)
+ layer = BELOW_MOB_LAYER
+ user.pixel_x = 0
+ user.pixel_y = -14
+ if(NORTHEAST)
+ layer = BELOW_MOB_LAYER
+ user.pixel_x = -8
+ user.pixel_y = -4
+ if(EAST)
+ layer = ABOVE_MOB_LAYER
+ user.pixel_x = -14
+ user.pixel_y = 0
+ if(SOUTHEAST)
+ layer = BELOW_MOB_LAYER
+ user.pixel_x = -8
+ user.pixel_y = 4
+ if(SOUTH)
+ layer = ABOVE_MOB_LAYER
+ user.pixel_x = 0
+ user.pixel_y = 14
+ if(SOUTHWEST)
+ layer = BELOW_MOB_LAYER
+ user.pixel_x = 8
+ user.pixel_y = 4
+ if(WEST)
+ layer = ABOVE_MOB_LAYER
+ user.pixel_x = 14
+ user.pixel_y = 0
+ if(NORTHWEST)
+ layer = BELOW_MOB_LAYER
+ user.pixel_x = 8
+ user.pixel_y = -4
+
+/obj/machinery/manned_turret/proc/checkfire(atom/targeted_atom, mob/user)
+ target = targeted_atom
+ if(target == user || user.incapacitated() || target == get_turf(src))
+ return
+ if(world.time < cooldown)
+ if(!warned && world.time > (cooldown - cooldown_duration + rate_of_fire*number_of_shots)) // To capture the window where one is done firing
+ warned = TRUE
+ playsound(src, 'sound/weapons/sear.ogg', 100, 1)
+ return
+ else
+ cooldown = world.time + cooldown_duration
+ warned = FALSE
+ volley(user)
+
+/obj/machinery/manned_turret/proc/volley(mob/user)
+ target_turf = get_turf(target)
+ for(var/i in 1 to number_of_shots)
+ addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper, user), i*rate_of_fire)
+
+/obj/machinery/manned_turret/proc/fire_helper(mob/user)
+ if(user.incapacitated())
+ return
+ update_positioning() //REFRESH MOUSE TRACKING!!
+ var/turf/targets_from = get_turf(src)
+ if(QDELETED(target))
+ target = target_turf
+ var/obj/item/projectile/P = new projectile_type(targets_from)
+ P.current = targets_from
+ P.starting = targets_from
+ P.firer = user
+ P.original = target
+ playsound(src, 'sound/weapons/gunshot_smg.ogg', 75, 1)
+ P.xo = target.x - targets_from.x
+ P.yo = target.y - targets_from.y
+ P.Angle = calculated_projectile_vars[1] + rand(-9, 9)
+ P.p_x = calculated_projectile_vars[2]
+ P.p_y = calculated_projectile_vars[3]
+ P.fire()
+
+/obj/machinery/manned_turret/ultimate // Admin-only proof of concept for autoclicker automatics
+ name = "Infinity Gun"
+ view_range = 12
+ projectile_type = /obj/item/projectile/bullet/manned_turret
+
+/obj/machinery/manned_turret/ultimate/checkfire(atom/targeted_atom, mob/user)
+ target = targeted_atom
+ if(target == user || target == get_turf(src))
+ return
+ target_turf = get_turf(target)
+ fire_helper(user)
+
+/obj/item/gun_control
+ name = "turret controls"
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "offhand"
+ w_class = WEIGHT_CLASS_HUGE
+ flags_1 = ABSTRACT_1 | NODROP_1 | NOBLUDGEON_1 | DROPDEL_1
+ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ var/obj/machinery/manned_turret/turret
+
+/obj/item/gun_control/Initialize()
+ . = ..()
+ turret = loc
+ if(!istype(turret))
+ return INITIALIZE_HINT_QDEL
+
+/obj/item/gun_control/Destroy()
+ turret = null
+ ..()
+
+/obj/item/gun_control/CanItemAutoclick()
+ return TRUE
+
+/obj/item/gun_control/attack_obj(obj/O, mob/living/user)
+ user.changeNext_move(CLICK_CD_MELEE)
+ O.attacked_by(src, user)
+
+/obj/item/gun_control/attack(mob/living/M, mob/living/user)
+ user.lastattacked = M
+ M.lastattacker = user
+ M.attacked_by(src, user)
+ add_fingerprint(user)
+
+/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user, flag, params)
+ ..()
+ var/obj/machinery/manned_turret/E = user.buckled
+ E.calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(user, params)
+ E.direction_track(user, targeted_atom)
+ E.checkfire(targeted_atom, user)
\ No newline at end of file
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 217644c4ae..65a78d0ef0 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -204,9 +204,9 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
-/datum/crafting_recipe/meteorshot
- name = "Meteorshot Shell"
- result = /obj/item/ammo_casing/shotgun/meteorshot
+/datum/crafting_recipe/meteorslug
+ name = "Meteorslug Shell"
+ result = /obj/item/ammo_casing/shotgun/meteorslug
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
/obj/item/rcd_ammo = 1,
/obj/item/stock_parts/manipulator = 2)
@@ -228,7 +228,7 @@
/datum/crafting_recipe/dragonsbreath
name = "Dragonsbreath Shell"
- result = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
+ result = /obj/item/ammo_casing/shotgun/dragonsbreath
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/phosphorus = 5)
tools = list(/obj/item/screwdriver)
time = 5
@@ -270,17 +270,6 @@
category = CAT_WEAPONRY
subcategory = CAT_AMMO
-/datum/crafting_recipe/improvisedslugoverload
- name = "Overload Improvised Shell"
- result = /obj/item/ammo_casing/shotgun/improvised/overload
- reqs = list(/obj/item/ammo_casing/shotgun/improvised = 1,
- /datum/reagent/blackpowder = 10,
- /datum/reagent/toxin/plasma = 20)
- tools = list(/obj/item/screwdriver)
- time = 5
- category = CAT_WEAPONRY
- subcategory = CAT_AMMO
-
/datum/crafting_recipe/laserslug
name = "Laser Slug Shell"
result = /obj/item/ammo_casing/shotgun/laserslug
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
index fd66b8d0ae..44a0a06cdc 100644
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm
@@ -38,7 +38,7 @@
minimum_distance = 5
icon_state = "stickmanranged"
icon_living = "stickmanranged"
- casingtype = /obj/item/ammo_casing/c45nostamina
+ casingtype = /obj/item/ammo_casing/c45/nostamina
projectilesound = 'sound/misc/bang.ogg'
loot = list(/obj/item/gun/ballistic/automatic/pistol/stickman)
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 7cadba01d9..11331e7ab7 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -95,7 +95,7 @@
minimum_distance = 5
icon_state = "syndicateranged"
icon_living = "syndicateranged"
- casingtype = /obj/item/ammo_casing/c45nostamina
+ casingtype = /obj/item/ammo_casing/c45/nostamina
projectilesound = 'sound/weapons/gunshot_smg.ogg'
loot = list(/obj/effect/gibspawner/human)
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 65cce2b7c7..848d690853 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -1,100 +1,126 @@
+// .357 (Syndie Revolver)
+
/obj/item/ammo_casing/a357
+ name = ".357 bullet casing"
desc = "A .357 bullet casing."
caliber = "357"
- projectile_type = /obj/item/projectile/bullet
+ projectile_type = /obj/item/projectile/bullet/a357
+
+// 7.62 (Nagant Rifle)
/obj/item/ammo_casing/a762
+ name = "7.62 bullet casing"
desc = "A 7.62 bullet casing."
icon_state = "762-casing"
caliber = "a762"
- projectile_type = /obj/item/projectile/bullet
+ projectile_type = /obj/item/projectile/bullet/a762
/obj/item/ammo_casing/a762/enchanted
- projectile_type = /obj/item/projectile/bullet/weakbullet3
+ projectile_type = /obj/item/projectile/bullet/a762_enchanted
-/obj/item/ammo_casing/a50
- desc = "A .50AE bullet casing."
- caliber = ".50"
- projectile_type = /obj/item/projectile/bullet
-
-/obj/item/ammo_casing/c38
- desc = "A .38 bullet casing."
- caliber = "38"
- projectile_type = /obj/item/projectile/bullet/weakbullet2
-
-/obj/item/ammo_casing/c10mm
- desc = "A 10mm bullet casing."
- caliber = "10mm"
- projectile_type = /obj/item/projectile/bullet/midbullet3
-
-/obj/item/ammo_casing/c10mm/ap
- projectile_type = /obj/item/projectile/bullet/midbullet3/ap
-
-/obj/item/ammo_casing/c10mm/fire
- projectile_type = /obj/item/projectile/bullet/midbullet3/fire
-
-/obj/item/ammo_casing/c10mm/hp
- projectile_type = /obj/item/projectile/bullet/midbullet3/hp
-
-/obj/item/ammo_casing/c9mm
- desc = "A 9mm bullet casing."
- caliber = "9mm"
- projectile_type = /obj/item/projectile/bullet/weakbullet3
-
-/obj/item/ammo_casing/c9mmap
- desc = "A 9mm bullet casing."
- caliber = "9mm"
- projectile_type =/obj/item/projectile/bullet/armourpiercing
-
-/obj/item/ammo_casing/c9mmtox
- desc = "A 9mm bullet casing."
- caliber = "9mm"
- projectile_type = /obj/item/projectile/bullet/toxinbullet
-
-/obj/item/ammo_casing/c9mminc
- desc = "A 9mm bullet casing."
- caliber = "9mm"
- projectile_type = /obj/item/projectile/bullet/incendiary/firebullet
-
-/obj/item/ammo_casing/c46x30mm
- desc = "A 4.6x30mm bullet casing."
- caliber = "4.6x30mm"
- projectile_type = /obj/item/projectile/bullet/weakbullet3
-
-/obj/item/ammo_casing/c46x30mmap
- desc = "A 4.6x30mm bullet casing."
- caliber = "4.6x30mm"
- projectile_type =/obj/item/projectile/bullet/armourpiercing
-
-/obj/item/ammo_casing/c46x30mmtox
- desc = "A 4.6x30mm bullet casing."
- caliber = "4.6x30mm"
- projectile_type = /obj/item/projectile/bullet/toxinbullet
-
-/obj/item/ammo_casing/c46x30mminc
- desc = "A 4.6x30mm bullet casing."
- caliber = "4.6x30mm"
- projectile_type = /obj/item/projectile/bullet/incendiary/firebullet
-
-/obj/item/ammo_casing/c45
- desc = "A .45 bullet casing."
- caliber = ".45"
- projectile_type = /obj/item/projectile/bullet/midbullet
-
-/obj/item/ammo_casing/c45nostamina
- desc = "A .45 bullet casing."
- caliber = ".45"
- projectile_type = /obj/item/projectile/bullet/midbullet3
+// 7.62x38mmR (Nagant Revolver)
/obj/item/ammo_casing/n762
+ name = "7.62x38mmR bullet casing"
desc = "A 7.62x38mmR bullet casing."
caliber = "n762"
- projectile_type = /obj/item/projectile/bullet
+ projectile_type = /obj/item/projectile/bullet/n762
+
+// .50AE (Desert Eagle)
+
+/obj/item/ammo_casing/a50AE
+ name = ".50AE bullet casing"
+ desc = "A .50AE bullet casing."
+ caliber = ".50"
+ projectile_type = /obj/item/projectile/bullet/a50AE
+
+// .38 (Detective's Gun)
+
+/obj/item/ammo_casing/c38
+ name = ".38 bullet casing"
+ desc = "A .38 bullet casing."
+ caliber = "38"
+ projectile_type = /obj/item/projectile/bullet/c38
+
+// 10mm (Stechkin)
+
+/obj/item/ammo_casing/c10mm
+ name = ".10mm bullet casing"
+ desc = "A 10mm bullet casing."
+ caliber = "10mm"
+ projectile_type = /obj/item/projectile/bullet/c10mm
+
+/obj/item/ammo_casing/c10mm/ap
+ name = ".10mm armor-piercing bullet casing"
+ desc = "A 10mm armor-piercing bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c10mm_ap
+
+/obj/item/ammo_casing/c10mm/hp
+ name = ".10mm hollow-point bullet casing"
+ desc = "A 10mm hollow-point bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c10mm_hp
+
+/obj/item/ammo_casing/c10mm/fire
+ name = ".10mm incendiary bullet casing"
+ desc = "A 10mm incendiary bullet casing."
+ projectile_type = /obj/item/projectile/bullet/incendiary/c10mm
+
+// 9mm (Stechkin APS)
+
+/obj/item/ammo_casing/c9mm
+ name = "9mm bullet casing"
+ desc = "A 9mm bullet casing."
+ caliber = "9mm"
+ projectile_type = /obj/item/projectile/bullet/c9mm
+
+/obj/item/ammo_casing/c9mm/ap
+ name = "9mm armor-piercing bullet casing"
+ desc = "A 9mm armor-piercing bullet casing."
+ projectile_type =/obj/item/projectile/bullet/c9mm_ap
+
+/obj/item/ammo_casing/c9mm/inc
+ name = "9mm incendiary bullet casing"
+ desc = "A 9mm incendiary bullet casing."
+ projectile_type = /obj/item/projectile/bullet/incendiary/c9mm
+
+// 4.6x30mm (Autorifles)
+
+/obj/item/ammo_casing/c46x30mm
+ name = "4.6x30mm bullet casing"
+ desc = "A 4.6x30mm bullet casing."
+ caliber = "4.6x30mm"
+ projectile_type = /obj/item/projectile/bullet/c46x30mm
+
+/obj/item/ammo_casing/c46x30mm/ap
+ name = "4.6x30mm armor-piercing bullet casing"
+ desc = "A 4.6x30mm armor-piercing bullet casing."
+ projectile_type = /obj/item/projectile/bullet/c46x30mm_ap
+
+/obj/item/ammo_casing/c46x30mm/inc
+ name = "4.6x30mm incendiary bullet casing"
+ desc = "A 4.6x30mm incendiary bullet casing."
+ projectile_type = /obj/item/projectile/bullet/incendiary/c46x30mm
+
+// .45 (M1911)
+
+/obj/item/ammo_casing/c45
+ name = ".45 bullet casing"
+ desc = "A .45 bullet casing."
+ caliber = ".45"
+ projectile_type = /obj/item/projectile/bullet/c45
+
+/obj/item/ammo_casing/c45/nostamina
+ projectile_type = /obj/item/projectile/bullet/c45_nostamina
+
+// 5.56mm (M-90gl Carbine)
/obj/item/ammo_casing/a556
+ name = "5.56mm bullet casing"
desc = "A 5.56mm bullet casing."
caliber = "a556"
- projectile_type = /obj/item/projectile/bullet/heavybullet
+ projectile_type = /obj/item/projectile/bullet/a556
+
+// 40mm (Grenade Launcher)
/obj/item/ammo_casing/a40mm
name = "40mm HE shell"
@@ -103,148 +129,93 @@
icon_state = "40mmHE"
projectile_type = /obj/item/projectile/bullet/a40mm
+// .50 (Sniper)
-
-/////SNIPER ROUNDS
-
-/obj/item/ammo_casing/point50
+/obj/item/ammo_casing/p50
+ name = ".50 bullet casing"
desc = "A .50 bullet casing."
caliber = ".50"
- projectile_type = /obj/item/projectile/bullet/sniper
+ projectile_type = /obj/item/projectile/bullet/p50
icon_state = ".50"
-/obj/item/ammo_casing/soporific
+/obj/item/ammo_casing/p50/soporific
+ name = ".50 soporific bullet casing"
desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell."
- caliber = ".50"
- projectile_type = /obj/item/projectile/bullet/sniper/soporific
+ projectile_type = /obj/item/projectile/bullet/p50/soporific
icon_state = "sleeper"
-/obj/item/ammo_casing/haemorrhage
- desc = "A .50 bullet casing, specialised in causing massive bloodloss."
- caliber = ".50"
- projectile_type = /obj/item/projectile/bullet/sniper/haemorrhage
- icon_state = ".50"
-
-/obj/item/ammo_casing/penetrator
+/obj/item/ammo_casing/p50/penetrator
+ name = ".50 penetrator round bullet casing"
desc = "A .50 caliber penetrator round casing."
- caliber = ".50"
- projectile_type = /obj/item/projectile/bullet/sniper/penetrator
- icon_state = ".50"
+ projectile_type = /obj/item/projectile/bullet/p50/penetrator
-/obj/item/ammo_casing/point50/gang
- desc = "A black market .50 bullet casing."
- projectile_type = /obj/item/projectile/bullet/sniper/gang
-
-/obj/item/ammo_casing/point50/gang/sleeper
- desc = "Am illegally modified tranquilizer round."
- projectile_type = /obj/item/projectile/bullet/sniper/gang/sleeper
- icon_state = "sleeper"
-
-/// SAW ROUNDS
+// 1.95x129mm (SAW)
/obj/item/ammo_casing/mm195x129
+ name = "1.95x129mm bullet casing"
desc = "A 1.95x129mm bullet casing."
icon_state = "762-casing"
caliber = "mm195129"
- projectile_type = /obj/item/projectile/bullet/saw
-
-/obj/item/ammo_casing/mm195x129/bleeding
- desc = "A 1.95x129mm bullet casing with specialized inner-casing, that when it makes contact with a target, releases tiny shrapnel to induce internal bleeding."
- icon_state = "762-casing"
- projectile_type = /obj/item/projectile/bullet/saw/bleeding
-
-/obj/item/ammo_casing/mm195x129/hollow
- desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets."
- projectile_type = /obj/item/projectile/bullet/saw/hollow
+ projectile_type = /obj/item/projectile/bullet/mm195x129
/obj/item/ammo_casing/mm195x129/ap
+ name = "1.95x129mm armor-piercing bullet casing"
desc = "A 1.95x129mm bullet casing designed with a hardened-tipped core to help penetrate armored targets."
- projectile_type = /obj/item/projectile/bullet/saw/ap
+ projectile_type = /obj/item/projectile/bullet/mm195x129_ap
+
+/obj/item/ammo_casing/mm195x129/hollow
+ name = "1.95x129mm hollow-point bullet casing"
+ desc = "A 1.95x129mm bullet casing designed to cause more damage to unarmored targets."
+ projectile_type = /obj/item/projectile/bullet/mm195x129_hp
/obj/item/ammo_casing/mm195x129/incen
+ name = "1.95x129mm incendiary bullet casing"
desc = "A 1.95x129mm bullet casing designed with a chemical-filled capsule on the tip that when bursted, reacts with the atmosphere to produce a fireball, engulfing the target in flames. "
- projectile_type = /obj/item/projectile/bullet/saw/incen
+ projectile_type = /obj/item/projectile/bullet/incendiary/mm195x129
-
-
-
-//SHOTGUN ROUNDS
+// Shotgun
/obj/item/ammo_casing/shotgun
name = "shotgun slug"
desc = "A 12 gauge lead slug."
icon_state = "blshell"
caliber = "shotgun"
- projectile_type = /obj/item/projectile/bullet
+ projectile_type = /obj/item/projectile/bullet/shotgun_slug
materials = list(MAT_METAL=4000)
-
-/obj/item/ammo_casing/shotgun/buckshot
- name = "buckshot shell"
- desc = "A 12 gauge buckshot shell."
- icon_state = "gshell"
- projectile_type = /obj/item/projectile/bullet/pellet
- pellets = 6
- variance = 25
-
-/obj/item/ammo_casing/shotgun/rubbershot
- name = "rubber shot"
- desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
- icon_state = "bshell"
- projectile_type = /obj/item/projectile/bullet/rpellet
- pellets = 6
- variance = 25
- materials = list(MAT_METAL=4000)
-
-
/obj/item/ammo_casing/shotgun/beanbag
name = "beanbag slug"
desc = "A weak beanbag slug for riot control."
icon_state = "bshell"
- projectile_type = /obj/item/projectile/bullet/weakbullet
+ projectile_type = /obj/item/projectile/bullet/shotgun_beanbag
materials = list(MAT_METAL=250)
+/obj/item/ammo_casing/shotgun/incendiary
+ name = "incendiary slug"
+ desc = "An incendiary-coated shotgun slug."
+ icon_state = "ishell"
+ projectile_type = /obj/item/projectile/bullet/incendiary/shotgun
-/obj/item/ammo_casing/shotgun/improvised
- name = "improvised shell"
- desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
- icon_state = "improvshell"
- projectile_type = /obj/item/projectile/bullet/pellet/weak
- materials = list(MAT_METAL=250)
- pellets = 10
- variance = 25
-
-
-/obj/item/ammo_casing/shotgun/improvised/overload
- name = "overloaded improvised shell"
- desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards. This one has been packed with even more \
- propellant. It's like playing russian roulette, with a shotgun."
- icon_state = "improvshell"
- projectile_type = /obj/item/projectile/bullet/pellet/overload
- materials = list(MAT_METAL=250)
+/obj/item/ammo_casing/shotgun/dragonsbreath
+ name = "dragonsbreath shell"
+ desc = "A shotgun shell which fires a spread of incendiary pellets."
+ icon_state = "ishell2"
+ projectile_type = /obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath
pellets = 4
- variance = 40
-
+ variance = 35
/obj/item/ammo_casing/shotgun/stunslug
name = "taser slug"
desc = "A stunning taser slug."
icon_state = "stunshell"
- projectile_type = /obj/item/projectile/bullet/stunshot
+ projectile_type = /obj/item/projectile/bullet/shotgun_stunslug
materials = list(MAT_METAL=250)
-
-/obj/item/ammo_casing/shotgun/meteorshot
- name = "meteorshot shell"
+/obj/item/ammo_casing/shotgun/meteorslug
+ name = "meteorslug shell"
desc = "A shotgun shell rigged with CMC technology, which launches a massive slug when fired."
icon_state = "mshell"
- projectile_type = /obj/item/projectile/bullet/meteorshot
-
-/obj/item/ammo_casing/shotgun/breaching
- name = "breaching shell"
- desc = "An economic version of the meteorshot, utilizing similar technologies. Great for busting down doors."
- icon_state = "mshell"
- projectile_type = /obj/item/projectile/bullet/meteorshot/weak
+ projectile_type = /obj/item/projectile/bullet/shotgun_meteorslug
/obj/item/ammo_casing/shotgun/pulseslug
name = "pulse slug"
@@ -252,27 +223,39 @@
energy blast. While the heat and power drain limit it to one use, it can still allow an operator to engage targets that ballistic ammunition \
would have difficulty with."
icon_state = "pshell"
- projectile_type = /obj/item/projectile/beam/pulse/shot
-
-/obj/item/ammo_casing/shotgun/incendiary
- name = "incendiary slug"
- desc = "An incendiary-coated shotgun slug."
- icon_state = "ishell"
- projectile_type = /obj/item/projectile/bullet/incendiary/shell
+ projectile_type = /obj/item/projectile/beam/pulse/shotgun
/obj/item/ammo_casing/shotgun/frag12
name = "FRAG-12 slug"
desc = "A high explosive breaching round for a 12 gauge shotgun."
icon_state = "heshell"
- projectile_type = /obj/item/projectile/bullet/frag12
+ projectile_type = /obj/item/projectile/bullet/shotgun_frag12
-/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
- name = "dragonsbreath shell"
- desc = "A shotgun shell which fires a spread of incendiary pellets."
- icon_state = "ishell2"
- projectile_type = /obj/item/projectile/bullet/incendiary/shell/dragonsbreath
- pellets = 4
- variance = 35
+/obj/item/ammo_casing/shotgun/buckshot
+ name = "buckshot shell"
+ desc = "A 12 gauge buckshot shell."
+ icon_state = "gshell"
+ projectile_type = /obj/item/projectile/bullet/pellet/shotgun_buckshot
+ pellets = 6
+ variance = 25
+
+/obj/item/ammo_casing/shotgun/rubbershot
+ name = "rubber shot"
+ desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
+ icon_state = "bshell"
+ projectile_type = /obj/item/projectile/bullet/pellet/shotgun_rubbershot
+ pellets = 6
+ variance = 25
+ materials = list(MAT_METAL=4000)
+
+/obj/item/ammo_casing/shotgun/improvised
+ name = "improvised shell"
+ desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
+ icon_state = "improvshell"
+ projectile_type = /obj/item/projectile/bullet/pellet/shotgun_improvised
+ materials = list(MAT_METAL=250)
+ pellets = 10
+ variance = 25
/obj/item/ammo_casing/shotgun/ion
name = "ion shell"
@@ -319,4 +302,4 @@
reagents.add_reagent("spore", 6)
reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT
reagents.add_reagent("coniine", 6)
- reagents.add_reagent("sodium_thiopental", 6)
+ reagents.add_reagent("sodium_thiopental", 6)
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm
index fa9c2ae5b0..11fd12da70 100644
--- a/code/modules/projectiles/ammunition/special.dm
+++ b/code/modules/projectiles/ammunition/special.dm
@@ -85,7 +85,7 @@
..()
/obj/item/ammo_casing/energy/c3dbullet
- projectile_type = /obj/item/projectile/bullet/midbullet3
+ projectile_type = /obj/item/projectile/bullet/c3d
select_name = "spraydown"
fire_sound = 'sound/weapons/gunshot_smg.ogg'
e_cost = 20
diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm
index 525466be28..5ffe1b475a 100644
--- a/code/modules/projectiles/boxes_magazines/external_mag.dm
+++ b/code/modules/projectiles/boxes_magazines/external_mag.dm
@@ -1,6 +1,4 @@
-
-
///////////EXTERNAL MAGAZINES////////////////
/obj/item/ammo_box/magazine/m10mm
@@ -72,25 +70,16 @@
/obj/item/ammo_box/magazine/wt550m9/wtap
name = "wt550 magazine (Armour Piercing 4.6x30mm)"
icon_state = "46x30mmtA-20"
- ammo_type = /obj/item/ammo_casing/c46x30mmap
+ ammo_type = /obj/item/ammo_casing/c46x30mm/ap
/obj/item/ammo_box/magazine/wt550m9/wtap/update_icon()
..()
icon_state = "46x30mmtA-[round(ammo_count(),4)]"
-/obj/item/ammo_box/magazine/wt550m9/wttx
- name = "wt550 magazine (Toxin Tipped 4.6x30mm)"
- icon_state = "46x30mmtT-20"
- ammo_type = /obj/item/ammo_casing/c46x30mmtox
-
-/obj/item/ammo_box/magazine/wt550m9/wttx/update_icon()
- ..()
- icon_state = "46x30mmtT-[round(ammo_count(),4)]"
-
/obj/item/ammo_box/magazine/wt550m9/wtic
name = "wt550 magazine (Incindiary 4.6x30mm)"
icon_state = "46x30mmtI-20"
- ammo_type = /obj/item/ammo_casing/c46x30mminc
+ ammo_type = /obj/item/ammo_casing/c46x30mm/inc
/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon()
..()
@@ -120,15 +109,11 @@
/obj/item/ammo_box/magazine/smgm9mm/ap
name = "SMG magazine (Armour Piercing 9mm)"
- ammo_type = /obj/item/ammo_casing/c9mmap
-
-/obj/item/ammo_box/magazine/smgm9mm/toxin
- name = "SMG magazine (Toxin Tipped 9mm)"
- ammo_type = /obj/item/ammo_casing/c9mmtox
+ ammo_type = /obj/item/ammo_casing/c9mm/ap
/obj/item/ammo_box/magazine/smgm9mm/fire
name = "SMG Magazine (Incindiary 9mm)"
- ammo_type = /obj/item/ammo_casing/c9mminc
+ ammo_type = /obj/item/ammo_casing/c9mm/inc
/obj/item/ammo_box/magazine/pistolm9mm
name = "pistol magazine (9mm)"
@@ -145,7 +130,7 @@
name = "SMG magazine (.45)"
icon_state = "c20r45-24"
origin_tech = "combat=2"
- ammo_type = /obj/item/ammo_casing/c45nostamina
+ ammo_type = /obj/item/ammo_casing/c45/nostamina
caliber = ".45"
max_ammo = 24
@@ -164,7 +149,7 @@
name = "handgun magazine (.50ae)"
icon_state = "50ae"
origin_tech = "combat=2"
- ammo_type = /obj/item/ammo_casing/a50
+ ammo_type = /obj/item/ammo_casing/a50AE
caliber = ".50"
max_ammo = 7
multiple_sprites = 1
@@ -212,17 +197,17 @@
/obj/item/ammo_box/magazine/m12g/dragon
name = "shotgun magazine (12g dragon's breath)"
icon_state = "m12gf"
- ammo_type = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
+ ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath
/obj/item/ammo_box/magazine/m12g/bioterror
name = "shotgun magazine (12g bioterror)"
icon_state = "m12gt"
ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror
-/obj/item/ammo_box/magazine/m12g/breach
- name = "shotgun magazine (12g breacher slugs)"
+/obj/item/ammo_box/magazine/m12g/meteor
+ name = "shotgun magazine (12g meteor slugs)"
icon_state = "m12gbc"
- ammo_type = /obj/item/ammo_casing/shotgun/breaching
+ ammo_type = /obj/item/ammo_casing/shotgun/meteorslug
//// SNIPER MAGAZINES
@@ -231,7 +216,7 @@
name = "sniper rounds (.50)"
icon_state = ".50mag"
origin_tech = "combat=6;syndicate=2"
- ammo_type = /obj/item/ammo_casing/point50
+ ammo_type = /obj/item/ammo_casing/p50
max_ammo = 6
caliber = ".50"
@@ -246,37 +231,17 @@
desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..."
icon_state = "soporific"
origin_tech = "combat=6;syndicate=3"
- ammo_type = /obj/item/ammo_casing/soporific
+ ammo_type = /obj/item/ammo_casing/p50/soporific
max_ammo = 3
caliber = ".50"
-/obj/item/ammo_box/magazine/sniper_rounds/haemorrhage
- name = "sniper rounds (Bleed)"
- desc = "Haemorrhage sniper rounds, leaves your target in a pool of crimson pain"
- icon_state = "haemorrhage"
- ammo_type = /obj/item/ammo_casing/haemorrhage
- max_ammo = 5
- caliber = ".50"
-
/obj/item/ammo_box/magazine/sniper_rounds/penetrator
name = "sniper rounds (penetrator)"
desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it."
- ammo_type = /obj/item/ammo_casing/penetrator
+ ammo_type = /obj/item/ammo_casing/p50/penetrator
origin_tech = "combat=6;syndicate=3"
max_ammo = 5
-/obj/item/ammo_box/magazine/sniper_rounds/gang
- name = "black market sniper rounds (.50)"
- icon_state = ".50mag"
- origin_tech = "combat=6"
- ammo_type = /obj/item/ammo_casing/point50/gang
-
-/obj/item/ammo_box/magazine/sniper_rounds/gang/sleeper
- name = "illegally modified tranquilizer round"
- icon_state = "soporific"
- origin_tech = "combat=6"
- ammo_type = /obj/item/ammo_casing/point50/gang/sleeper
-
//// SAW MAGAZINES
/obj/item/ammo_box/magazine/mm195x129
@@ -287,11 +252,6 @@
caliber = "mm195129"
max_ammo = 50
-/obj/item/ammo_box/magazine/mm195x129/bleeding
- name = "box magazine (Bleeding 1.95x129mm)"
- origin_tech = "combat=3"
- ammo_type = /obj/item/ammo_casing/mm195x129/bleeding
-
/obj/item/ammo_box/magazine/mm195x129/hollow
name = "box magazine (Hollow-Point 1.95x129mm)"
origin_tech = "combat=3"
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 5388bf8e0a..423cd56202 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -384,11 +384,6 @@
pin = /obj/item/device/firing_pin/implant/pindicate
origin_tech = "combat=7;syndicate=6"
-/obj/item/gun/ballistic/automatic/sniper_rifle/gang
- name = "black market sniper rifle"
- desc = "A long ranged weapon that does significant damage. It is well worn from years of service."
- mag_type = /obj/item/ammo_box/magazine/sniper_rounds/gang
-
// Old Semi-Auto Rifle //
/obj/item/gun/ballistic/automatic/surplus
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 844a8a4662..d1d7b50cf5 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -77,7 +77,7 @@
if(isturf(target) || istype(target, /obj/structure/))
target.ex_act(EXPLODE_HEAVY)
-/obj/item/projectile/beam/pulse/shot
+/obj/item/projectile/beam/pulse/shotgun
damage = 40
/obj/item/projectile/beam/pulse/heavy
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index d11fa850c2..6f4ae50243 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -3,105 +3,238 @@
icon_state = "bullet"
damage = 60
damage_type = BRUTE
- nodamage = 0
+ nodamage = FALSE
flag = "bullet"
hitsound_wall = "ricochet"
impact_effect_type = /obj/effect/temp_visual/impact_effect
-/obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage
- damage = 5
- stamina = 80
-
-/obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down
- damage = 15
- knockdown = 30
- stamina = 50
-
-/obj/item/projectile/bullet/weakbullet3
- damage = 20
-
-/obj/item/projectile/bullet/toxinbullet
- damage = 15
- damage_type = TOX
-
-/obj/item/projectile/bullet/incendiary/firebullet
- damage = 10
-
-/obj/item/projectile/bullet/armourpiercing
- damage = 15
- armour_penetration = 40
-
-/obj/item/projectile/bullet/pellet
- name = "pellet"
- damage = 12.5
-
/obj/item/projectile/bullet/pellet/Range()
..()
damage += -0.75
if(damage < 0)
qdel(src)
-/obj/item/projectile/bullet/pellet/weak
- damage = 6
-
-/obj/item/projectile/bullet/pellet/weak/New()
- range = rand(1, 8)
- ..()
-
-/obj/item/projectile/bullet/pellet/weak/on_range()
- do_sparks(1, TRUE, src)
- ..()
-
-/obj/item/projectile/bullet/pellet/overload
- damage = 3
-
-/obj/item/projectile/bullet/pellet/overload/New()
- range = rand(1, 10)
- ..()
-
-/obj/item/projectile/bullet/pellet/overload/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, 0, 0, 2)
-
-/obj/item/projectile/bullet/pellet/overload/on_range()
- explosion(src, 0, 0, 2)
- do_sparks(3, TRUE, src)
- ..()
-
-/obj/item/projectile/bullet/midbullet
+/obj/item/projectile/bullet/incendiary
damage = 20
- stamina = 65 //two round bursts from the c20r knocks people down
+ var/fire_stacks = 4
+/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/M = target
+ M.adjust_fire_stacks(fire_stacks)
+ M.IgniteMob()
-/obj/item/projectile/bullet/midbullet2
- damage = 25
+/obj/item/projectile/bullet/incendiary/Move()
+ . = ..()
+ var/turf/location = get_turf(src)
+ if(location)
+ new /obj/effect/hotspot(location)
+ location.hotspot_expose(700, 50, 1)
-/obj/item/projectile/bullet/midbullet3
+// .357 (Syndie Revolver)
+
+/obj/item/projectile/bullet/a357
+ name = ".357 bullet"
+ damage = 60
+
+// 7.62 (Nagant Rifle)
+
+/obj/item/projectile/bullet/a762
+ name = "7.62 bullet"
+ damage = 60
+
+/obj/item/projectile/bullet/a762_enchanted
+ name = "enchanted 7.62 bullet"
+ damage = 5
+ stamina = 80
+
+// 7.62x38mmR (Nagant Revolver)
+
+/obj/item/projectile/bullet/n762
+ name = "7.62x38mmR bullet"
+ damage = 60
+
+// .50AE (Desert Eagle)
+
+/obj/item/projectile/bullet/a50AE
+ name = ".50AE bullet"
+ damage = 60
+
+// .38 (Detective's Gun)
+
+/obj/item/projectile/bullet/c38
+ name = ".38 bullet"
+ damage = 15
+ knockdown = 30
+ stamina = 50
+
+// 10mm (Stechkin)
+
+/obj/item/projectile/bullet/c10mm
+ name = "10mm bullet"
damage = 30
-/obj/item/projectile/bullet/midbullet3/hp
- damage = 40
- armour_penetration = -50
-
-/obj/item/projectile/bullet/midbullet3/ap
+/obj/item/projectile/bullet/c10mm_ap
+ name = "10mm armor-piercing bullet"
damage = 27
armour_penetration = 40
-/obj/item/projectile/bullet/midbullet3/fire/on_hit(atom/target, blocked = FALSE)
- if(..(target, blocked))
- var/mob/living/M = target
- M.adjust_fire_stacks(1)
- M.IgniteMob()
+/obj/item/projectile/bullet/c10mm_hp
+ name = "10mm hollow-point bullet"
+ damage = 40
+ armour_penetration = -50
-/obj/item/projectile/bullet/heavybullet
+/obj/item/projectile/bullet/incendiary/c10mm
+ name = "10mm incendiary bullet"
+ damage = 15
+ fire_stacks = 2
+
+// 9mm (Stechkin APS)
+
+/obj/item/projectile/bullet/c9mm
+ name = "9mm bullet"
+ damage = 20
+
+/obj/item/projectile/bullet/c9mm_ap
+ name = "9mm armor-piercing bullet"
+ damage = 15
+ armour_penetration = 40
+
+/obj/item/projectile/bullet/incendiary/c9mm
+ name = "9mm incendiary bullet"
+ damage = 10
+ fire_stacks = 1
+
+// 4.6x30mm (Autorifles)
+
+/obj/item/projectile/bullet/c46x30mm
+ desc = "4.6x30mm bullet"
+ damage = 20
+
+/obj/item/projectile/bullet/c46x30mm_ap
+ name = "4.6x30mm armor-piercing bullet"
+ damage = 15
+ armour_penetration = 40
+
+/obj/item/projectile/bullet/incendiary/c46x30mm
+ name = "4.6x30mm incendiary bullet"
+ damage = 10
+ fire_stacks = 1
+
+// .45 (M1911)
+
+/obj/item/projectile/bullet/c45
+ name = ".45 bullet"
+ damage = 20
+ stamina = 65
+
+/obj/item/projectile/bullet/c45_nostamina
+ name = ".45 bullet"
+ damage = 20
+
+// 5.56mm (M-90gl Carbine)
+
+/obj/item/projectile/bullet/a556
+ name = "5.56mm bullet"
damage = 35
-/obj/item/projectile/bullet/rpellet
- damage = 3
- stamina = 25
+// 40mm (Grenade Launcher
-/obj/item/projectile/bullet/stunshot //taser slugs for shotguns, nothing special
- name = "stunshot"
+/obj/item/projectile/bullet/a40mm
+ name ="40mm grenade"
+ desc = "USE A WEEL GUN"
+ icon_state= "bolter"
+ damage = 60
+
+/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 0, 2, 1, 0, flame_range = 3)
+ return TRUE
+
+// .50 (Sniper)
+
+/obj/item/projectile/bullet/p50
+ name =".50 bullet"
+ speed = 0 //360 alwaysscope.
+ damage = 70
+ knockdown = 100
+ dismemberment = 50
+ armour_penetration = 50
+ var/breakthings = TRUE
+
+/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0)
+ if((blocked != 100) && (!ismob(target) && breakthings))
+ target.ex_act(rand(1,2))
+ return ..()
+
+/obj/item/projectile/bullet/p50/soporific
+ name =".50 soporific bullet"
+ armour_penetration = 0
+ nodamage = TRUE
+ dismemberment = 0
+ knockdown = 0
+ breakthings = FALSE
+
+/obj/item/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE)
+ if((blocked != 100) && isliving(target))
+ var/mob/living/L = target
+ L.Sleeping(400)
+ return ..()
+
+/obj/item/projectile/bullet/p50/penetrator
+ name =".50 penetrator bullet"
+ icon_state = "gauss"
+ name = "penetrator round"
+ damage = 60
+ forcedodge = TRUE
+ dismemberment = 0 //It goes through you cleanly.
+ knockdown = 0
+ breakthings = FALSE
+
+// 1.95x129mm (SAW)
+
+/obj/item/projectile/bullet/mm195x129
+ name = "1.95x129mm bullet"
+ damage = 45
+ armour_penetration = 5
+
+/obj/item/projectile/bullet/mm195x129_ap
+ name = "1.95x129mm armor-piercing bullet"
+ damage = 40
+ armour_penetration = 75
+
+/obj/item/projectile/bullet/mm195x129_hp
+ name = "1.95x129mm hollow-point bullet"
+ damage = 60
+ armour_penetration = -60
+
+/obj/item/projectile/bullet/incendiary/mm195x129
+ name = "1.95x129mm incendiary bullet"
+ damage = 15
+ fire_stacks = 3
+
+// Shotgun
+
+/obj/item/projectile/bullet/shotgun_slug
+ name = "12g shotgun slug"
+ damage = 60
+
+/obj/item/projectile/bullet/shotgun_beanbag
+ name = "beanbag slug"
+ damage = 5
+ stamina = 80
+
+/obj/item/projectile/bullet/incendiary/shotgun
+ name = "incendiary slug"
+ damage = 20
+
+/obj/item/projectile/bullet/incendiary/shotgun/dragonsbreath
+ name = "dragonsbreath pellet"
+ damage = 5
+
+/obj/item/projectile/bullet/shotgun_stunslug
+ name = "stunslug"
damage = 5
knockdown = 100
stutter = 5
@@ -110,47 +243,90 @@
icon_state = "spark"
color = "#FFFF00"
-/obj/item/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- M.adjust_fire_stacks(4)
- M.IgniteMob()
-
-
-/obj/item/projectile/bullet/incendiary/shell
- name = "incendiary slug"
- damage = 20
-
-/obj/item/projectile/bullet/incendiary/shell/Move()
- ..()
- var/turf/location = get_turf(src)
- if(location)
- new /obj/effect/hotspot(location)
- location.hotspot_expose(700, 50, 1)
-
-/obj/item/projectile/bullet/incendiary/shell/dragonsbreath
- name = "dragonsbreath round"
- damage = 5
-
-
-/obj/item/projectile/bullet/meteorshot
- name = "meteor"
+/obj/item/projectile/bullet/shotgun_meteorslug
+ name = "meteorslug"
icon = 'icons/obj/meteor.dmi'
icon_state = "dust"
- damage = 30
- knockdown = 160
+ damage = 20
+ knockdown = 80
hitsound = 'sound/effects/meteorimpact.ogg'
-/obj/item/projectile/bullet/meteorshot/weak
- damage = 10
- knockdown = 80
+/obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(ismovableatom(target))
+ var/atom/movable/M = target
+ var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
+ M.throw_at(throw_target, 3, 2)
+
+/obj/item/projectile/bullet/shotgun_meteorslug/Initialize()
+ . = ..()
+ SpinAnimation()
+
+/obj/item/projectile/bullet/shotgun_frag12
+ name ="frag12 slug"
+ damage = 25
+ knockdown = 50
+
+/obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE)
+ ..()
+ explosion(target, -1, 0, 1)
+ return TRUE
+
+/obj/item/projectile/bullet/pellet/shotgun_buckshot
+ name = "buckshot pellet"
+ damage = 12.5
+
+/obj/item/projectile/bullet/pellet/shotgun_rubbershot
+ damage = 3
+ stamina = 25
+
+/obj/item/projectile/bullet/pellet/shotgun_improvised
+ damage = 6
+
+/obj/item/projectile/bullet/pellet/shotgun_improvised/Initialize()
+ . = ..()
+ range = rand(1, 8)
+
+/obj/item/projectile/bullet/pellet/shotgun_improvised/on_range()
+ do_sparks(1, TRUE, src)
+ ..()
+
+// Scattershot
+
+/obj/item/projectile/bullet/scattershot
+ damage = 20
+ stamina = 65
+
+// LMD (exosuits)
+
+/obj/item/projectile/bullet/lmg
+ damage = 20
+
+// Turrets
+
+/obj/item/projectile/bullet/manned_turret
+ damage = 20
+
+/obj/item/projectile/bullet/syndicate_turret
+ damage = 20
+
+// FNX-99 (Mechs)
+
+/obj/item/projectile/bullet/incendiary/fnx99
+ damage = 20
+
+// C3D (Borgs)
+
+/obj/item/projectile/bullet/c3d
+ damage = 20
+
+// Honker
/obj/item/projectile/bullet/honker
damage = 0
knockdown = 60
- forcedodge = 1
- nodamage = 1
+ forcedodge = TRUE
+ nodamage = TRUE
hitsound = 'sound/items/bikehorn.ogg'
icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "banana"
@@ -160,17 +336,7 @@
..()
SpinAnimation()
-/obj/item/projectile/bullet/meteorshot/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(ismovableatom(target))
- var/atom/movable/M = target
- var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
- M.throw_at(throw_target, 3, 2)
-
-/obj/item/projectile/bullet/meteorshot/New()
- ..()
- SpinAnimation()
-
+// Mime
/obj/item/projectile/bullet/mime
damage = 20
@@ -181,6 +347,7 @@
var/mob/living/carbon/M = target
M.silent = max(M.silent, 10)
+// Darts
/obj/item/projectile/bullet/dart
name = "dart"
@@ -210,7 +377,7 @@
..(target, blocked)
reagents.set_reacting(TRUE)
reagents.handle_reactions()
- return 1
+ return TRUE
/obj/item/projectile/bullet/dart/metalfoam/New()
..()
@@ -223,18 +390,7 @@
name = "syringe"
icon_state = "syringeproj"
-/obj/item/projectile/bullet/neurotoxin
- name = "neurotoxin spit"
- icon_state = "neurotoxin"
- damage = 5
- damage_type = TOX
- knockdown = 100
-
-/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE)
- if(isalien(target))
- knockdown = 0
- nodamage = 1
- . = ..() // Execute the rest of the code.
+// DNA injector
/obj/item/projectile/bullet/dnainjector
name = "\improper DNA injector"
@@ -261,121 +417,3 @@
QDEL_NULL(injector)
return ..()
-//// SNIPER BULLETS
-
-/obj/item/projectile/bullet/sniper
- speed = 0 //360 alwaysscope.
- damage = 70
- knockdown = 100
- dismemberment = 50
- armour_penetration = 50
- var/breakthings = TRUE
-
-/obj/item/projectile/bullet/sniper/on_hit(atom/target, blocked = FALSE)
- if((blocked != 100) && (!ismob(target) && breakthings))
- target.ex_act(rand(1,2))
- return ..()
-
-/obj/item/projectile/bullet/sniper/gang
- damage = 55
- knockdown = 20
- dismemberment = 15
- armour_penetration = 25
-
-/obj/item/projectile/bullet/sniper/gang/sleeper
- nodamage = 1
- knockdown = 0
- dismemberment = 0
- breakthings = FALSE
-
-/obj/item/projectile/bullet/sniper/gang/sleeper/on_hit(atom/target, blocked = FALSE)
- if((blocked != 100) && isliving(target))
- var/mob/living/L = target
- L.blur_eyes(8)
- if(L.staminaloss >= 40)
- L.Sleeping(400)
- else
- L.adjustStaminaLoss(55)
- return 1
-
-/obj/item/projectile/bullet/sniper/soporific
- armour_penetration = 0
- nodamage = 1
- dismemberment = 0
- knockdown = 0
- breakthings = FALSE
-
-/obj/item/projectile/bullet/sniper/soporific/on_hit(atom/target, blocked = FALSE)
- if((blocked != 100) && isliving(target))
- var/mob/living/L = target
- L.Sleeping(400)
- return ..()
-
-
-/obj/item/projectile/bullet/sniper/haemorrhage
- armour_penetration = 15
- damage = 15
- dismemberment = 0
- knockdown = 0
- breakthings = FALSE
-
-/obj/item/projectile/bullet/sniper/haemorrhage/on_hit(atom/target, blocked = FALSE)
- if((blocked != 100) && iscarbon(target))
- var/mob/living/carbon/C = target
- C.bleed(100)
- return ..()
-
-
-/obj/item/projectile/bullet/sniper/penetrator
- icon_state = "gauss"
- name = "penetrator round"
- damage = 60
- forcedodge = 1
- dismemberment = 0 //It goes through you cleanly.
- knockdown = 0
- breakthings = FALSE
-
-
-
-//// SAW BULLETS
-
-
-/obj/item/projectile/bullet/saw
- damage = 45
- armour_penetration = 5
-
-/obj/item/projectile/bullet/saw/bleeding
- damage = 20
- armour_penetration = 0
-
-/obj/item/projectile/bullet/saw/bleeding/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if((blocked != 100) && iscarbon(target))
- var/mob/living/carbon/C = target
- C.bleed(35)
-
-/obj/item/projectile/bullet/saw/hollow
- damage = 60
- armour_penetration = -60
-
-/obj/item/projectile/bullet/saw/ap
- damage = 40
- armour_penetration = 75
-
-/obj/item/projectile/bullet/saw/incen
- damage = 7
- armour_penetration = 0
-
-/obj/item/projectile/bullet/saw/incen/Move()
- ..()
- var/turf/location = get_turf(src)
- if(location)
- new /obj/effect/hotspot(location)
- location.hotspot_expose(700, 50, 1)
-
-/obj/item/projectile/bullet/saw/incen/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- M.adjust_fire_stacks(3)
- M.IgniteMob()
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index f9f7686a46..79a3d51eec 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -32,17 +32,6 @@
explosion(target, -1, 0, 2)
return 1
-/obj/item/projectile/bullet/a40mm
- name ="40mm grenade"
- desc = "USE A WEEL GUN"
- icon_state= "bolter"
- damage = 60
-
-/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 0, 2, 1, 0, flame_range = 3)
- return 1
-
/obj/item/projectile/bullet/a84mm
name ="anti-armour rocket"
desc = "USE A WEEL GUN"
@@ -184,16 +173,6 @@
qdel(src)
gun.create_portal(src, get_turf(src))
-/obj/item/projectile/bullet/frag12
- name ="explosive slug"
- damage = 25
- knockdown = 50
-
-/obj/item/projectile/bullet/frag12/on_hit(atom/target, blocked = FALSE)
- ..()
- explosion(target, -1, 0, 1)
- return 1
-
/obj/item/projectile/plasma
name = "plasma blast"
icon_state = "plasmacutter"
@@ -616,3 +595,19 @@
/obj/item/projectile/hallucination/death/hal_apply_effect()
new /datum/hallucination/death(hal_target, TRUE)
+
+// Neurotoxin
+
+/obj/item/projectile/bullet/neurotoxin
+ name = "neurotoxin spit"
+ icon_state = "neurotoxin"
+ damage = 5
+ damage_type = TOX
+ knockdown = 100
+
+/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE)
+ if(isalien(target))
+ knockdown = 0
+ nodamage = TRUE
+ return ..()
+
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index a03b8c8127..89adfe8edc 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -203,13 +203,6 @@
materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_GLASS = 1000)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtic
-/datum/design/mag_oldsmg/tx_mag
- name = "WT-550 Auto Gun Uranium Magazine (4.6x30mm TX)"
- desc = "A 20 round uranium tipped magazine for the out of date security WT-550 Auto Rifle"
- id = "mag_oldsmg_tx"
- materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_URANIUM = 2000)
- build_path = /obj/item/ammo_box/magazine/wt550m9/wttx
-
/datum/design/stunshell
name = "Stun Shell"
desc = "A stunning shell for a shotgun."
diff --git a/code/modules/spells/spell_types/mime.dm b/code/modules/spells/spell_types/mime.dm
index 71a0d89f16..4e5c0605e2 100644
--- a/code/modules/spells/spell_types/mime.dm
+++ b/code/modules/spells/spell_types/mime.dm
@@ -1,140 +1,280 @@
-/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall
- name = "Invisible Wall"
- desc = "The mime's performance transmutates into physical reality."
- school = "mime"
- panel = "Mime"
- summon_type = list(/obj/effect/forcefield/mime)
- invocation_type = "emote"
- invocation_emote_self = "You form a wall in front of yourself."
- summon_lifespan = 300
- charge_max = 300
- clothes_req = 0
- range = 0
- cast_sound = null
- human_req = 1
-
- action_icon_state = "mime"
- action_background_icon_state = "bg_mime"
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click()
- if(usr && usr.mind)
- if(!usr.mind.miming)
- to_chat(usr, "You must dedicate yourself to silence first.")
- return
- invocation = "[usr.real_name] looks as if a wall is in front of [usr.p_them()]."
- else
- invocation_type ="none"
- ..()
-
-
-/obj/effect/proc_holder/spell/targeted/mime/speak
- name = "Speech"
- desc = "Make or break a vow of silence."
- school = "mime"
- panel = "Mime"
- clothes_req = 0
- human_req = 1
- charge_max = 3000
- range = -1
- include_user = 1
-
- action_icon_state = "mime"
- action_background_icon_state = "bg_mime"
-
-/obj/effect/proc_holder/spell/targeted/mime/speak/Click()
- if(!usr)
- return
- if(!ishuman(usr))
- return
- var/mob/living/carbon/human/H = usr
- if(H.mind.miming)
- still_recharging_msg = "You can't break your vow of silence that fast!"
- else
- still_recharging_msg = "You'll have to wait before you can give your vow of silence again!"
- ..()
-
-/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr)
- for(var/mob/living/carbon/human/H in targets)
- H.mind.miming=!H.mind.miming
- if(H.mind.miming)
- to_chat(H, "You make a vow of silence.")
- else
- to_chat(H, "You break your vow of silence.")
-
-// These spells can only be gotten from the "Guide for Advanced Mimery series" for Mime Traitors.
-
-/obj/effect/proc_holder/spell/targeted/forcewall/mime
- name = "Invisible Blockade"
- desc = "Form an invisible three tile wide blockade."
- wall_type = /obj/effect/forcefield/mime/advanced
- invocation_type = "emote"
- invocation_emote_self = "You form a blockade in front of yourself."
- charge_max = 600
- sound = null
- clothes_req = 0
- range = -1
- include_user = 1
-
- action_icon_state = "mime"
- action_background_icon_state = "bg_mime"
-
-/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click()
- if(usr && usr.mind)
- if(!usr.mind.miming)
- to_chat(usr, "You must dedicate yourself to silence first.")
- return
- invocation = "[usr.real_name] looks as if a blockade is in front of [usr.p_them()]."
- else
- invocation_type ="none"
- ..()
-
-/obj/effect/proc_holder/spell/aimed/finger_guns
- name = "Finger Guns"
- desc = "Shoot a mimed bullet from your fingers that stuns and does some damage."
- school = "mime"
- panel = "Mime"
- charge_max = 300
- clothes_req = 0
- invocation_type = "emote"
- invocation_emote_self = "You fire your finger gun!"
- range = 20
- projectile_type = /obj/item/projectile/bullet/weakbullet2
- projectile_amount = 3
- sound = null
- active_msg = "You draw your fingers!"
- deactive_msg = "You put your fingers at ease. Another time."
- active = FALSE
-
- action_icon_state = "mime"
- action_background_icon_state = "bg_mime"
- base_icon_state = "mime"
-
-
-/obj/effect/proc_holder/spell/aimed/finger_guns/Click()
- var/mob/living/carbon/human/owner = usr
- if(owner.incapacitated())
- to_chat(owner, "You can't properly point your fingers while incapacitated.")
- return
- if(usr && usr.mind)
- if(!usr.mind.miming)
- to_chat(usr, "You must dedicate yourself to silence first.")
- return
- invocation = "[usr.real_name] fires [usr.p_their()] finger gun!"
- else
- invocation_type ="none"
- ..()
-
-
-/obj/item/spellbook/oneuse/mimery_blockade
- spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime
- spellname = ""
- name = "Guide to Advanced Mimery Vol 1"
- desc = "The pages don't make any sound when turned."
- icon_state ="bookmime"
-
-/obj/item/spellbook/oneuse/mimery_guns
- spell = /obj/effect/proc_holder/spell/aimed/finger_guns
- spellname = ""
- name = "Guide to Advanced Mimery Vol 2"
- desc = "There aren't any words written..."
- icon_state ="bookmime"
+/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall
+ name = "Invisible Wall"
+ desc = "The mime's performance transmutates into physical reality."
+ school = "mime"
+ panel = "Mime"
+ summon_type = list(/obj/effect/forcefield/mime)
+ invocation_type = "emote"
+ invocation_emote_self = "You form a wall in front of yourself."
+ summon_lifespan = 300
+ charge_max = 300
+ clothes_req = 0
+ range = 0
+ cast_sound = null
+ human_req = 1
+
+ action_icon_state = "mime"
+ action_background_icon_state = "bg_mime"
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click()
+ if(usr && usr.mind)
+ if(!usr.mind.miming)
+ to_chat(usr, "You must dedicate yourself to silence first.")
+ return
+ invocation = "[usr.real_name] looks as if a wall is in front of [usr.p_them()]."
+ else
+ invocation_type ="none"
+ ..()
+
+
+/obj/effect/proc_holder/spell/targeted/mime/speak
+ name = "Speech"
+ desc = "Make or break a vow of silence."
+ school = "mime"
+ panel = "Mime"
+ clothes_req = 0
+ human_req = 1
+ charge_max = 3000
+ range = -1
+ include_user = 1
+
+ action_icon_state = "mime"
+ action_background_icon_state = "bg_mime"
+
+/obj/effect/proc_holder/spell/targeted/mime/speak/Click()
+ if(!usr)
+ return
+ if(!ishuman(usr))
+ return
+ var/mob/living/carbon/human/H = usr
+ if(H.mind.miming)
+ still_recharging_msg = "You can't break your vow of silence that fast!"
+ else
+ still_recharging_msg = "You'll have to wait before you can give your vow of silence again!"
+ ..()
+
+/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr)
+ for(var/mob/living/carbon/human/H in targets)
+ H.mind.miming=!H.mind.miming
+ if(H.mind.miming)
+ to_chat(H, "You make a vow of silence.")
+ else
+ to_chat(H, "You break your vow of silence.")
+
+// These spells can only be gotten from the "Guide for Advanced Mimery series" for Mime Traitors.
+
+/obj/effect/proc_holder/spell/targeted/forcewall/mime
+ name = "Invisible Blockade"
+ desc = "Form an invisible three tile wide blockade."
+ wall_type = /obj/effect/forcefield/mime/advanced
+ invocation_type = "emote"
+ invocation_emote_self = "You form a blockade in front of yourself."
+ charge_max = 600
+ sound = null
+ clothes_req = 0
+ range = -1
+ include_user = 1
+
+ action_icon_state = "mime"
+ action_background_icon_state = "bg_mime"
+
+/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click()
+ if(usr && usr.mind)
+ if(!usr.mind.miming)
+ to_chat(usr, "You must dedicate yourself to silence first.")
+ return
+ invocation = "[usr.real_name] looks as if a blockade is in front of [usr.p_them()]."
+ else
+ invocation_type ="none"
+ ..()
+
+/obj/effect/proc_holder/spell/aimed/finger_guns
+ name = "Finger Guns"
+ desc = "Shoot a mimed bullet from your fingers that stuns and does some damage."
+ school = "mime"
+ panel = "Mime"
+ charge_max = 300
+ clothes_req = 0
+ invocation_type = "emote"
+ invocation_emote_self = "You fire your finger gun!"
+ range = 20
+ projectile_type = /obj/item/projectile/bullet/mime
+ projectile_amount = 3
+ sound = null
+ active_msg = "You draw your fingers!"
+ deactive_msg = "You put your fingers at ease. Another time."
+ active = FALSE
+
+ action_icon_state = "mime"
+ action_background_icon_state = "bg_mime"
+ base_icon_state = "mime"
+
+
+/obj/effect/proc_holder/spell/aimed/finger_guns/Click()
+ var/mob/living/carbon/human/owner = usr
+ if(owner.incapacitated())
+ to_chat(owner, "You can't properly point your fingers while incapacitated.")
+ return
+ if(usr && usr.mind)
+ if(!usr.mind.miming)
+ to_chat(usr, "You must dedicate yourself to silence first.")
+ return
+ invocation = "[usr.real_name] fires [usr.p_their()] finger gun!"
+ else
+ invocation_type ="none"
+ ..()
+
+
+/obj/item/spellbook/oneuse/mimery_blockade
+ spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime
+ spellname = ""
+ name = "Guide to Advanced Mimery Vol 1"
+ desc = "The pages don't make any sound when turned."
+ icon_state ="bookmime"
+
+/obj/item/spellbook/oneuse/mimery_guns
+ spell = /obj/effect/proc_holder/spell/aimed/finger_guns
+ spellname = ""
+ name = "Guide to Advanced Mimery Vol 2"
+ desc = "There aren't any words written..."
+ icon_state ="bookmime"
+/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall
+ name = "Invisible Wall"
+ desc = "The mime's performance transmutates into physical reality."
+ school = "mime"
+ panel = "Mime"
+ summon_type = list(/obj/effect/forcefield/mime)
+ invocation_type = "emote"
+ invocation_emote_self = "You form a wall in front of yourself."
+ summon_lifespan = 300
+ charge_max = 300
+ clothes_req = 0
+ range = 0
+ cast_sound = null
+ human_req = 1
+
+ action_icon_state = "mime"
+ action_background_icon_state = "bg_mime"
+
+/obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall/Click()
+ if(usr && usr.mind)
+ if(!usr.mind.miming)
+ to_chat(usr, "You must dedicate yourself to silence first.")
+ return
+ invocation = "[usr.real_name] looks as if a wall is in front of [usr.p_them()]."
+ else
+ invocation_type ="none"
+ ..()
+
+
+/obj/effect/proc_holder/spell/targeted/mime/speak
+ name = "Speech"
+ desc = "Make or break a vow of silence."
+ school = "mime"
+ panel = "Mime"
+ clothes_req = 0
+ human_req = 1
+ charge_max = 3000
+ range = -1
+ include_user = 1
+
+ action_icon_state = "mime"
+ action_background_icon_state = "bg_mime"
+
+/obj/effect/proc_holder/spell/targeted/mime/speak/Click()
+ if(!usr)
+ return
+ if(!ishuman(usr))
+ return
+ var/mob/living/carbon/human/H = usr
+ if(H.mind.miming)
+ still_recharging_msg = "You can't break your vow of silence that fast!"
+ else
+ still_recharging_msg = "You'll have to wait before you can give your vow of silence again!"
+ ..()
+
+/obj/effect/proc_holder/spell/targeted/mime/speak/cast(list/targets,mob/user = usr)
+ for(var/mob/living/carbon/human/H in targets)
+ H.mind.miming=!H.mind.miming
+ if(H.mind.miming)
+ to_chat(H, "You make a vow of silence.")
+ else
+ to_chat(H, "You break your vow of silence.")
+
+// These spells can only be gotten from the "Guide for Advanced Mimery series" for Mime Traitors.
+
+/obj/effect/proc_holder/spell/targeted/forcewall/mime
+ name = "Invisible Blockade"
+ desc = "Form an invisible three tile wide blockade."
+ wall_type = /obj/effect/forcefield/mime/advanced
+ invocation_type = "emote"
+ invocation_emote_self = "You form a blockade in front of yourself."
+ charge_max = 600
+ sound = null
+ clothes_req = 0
+ range = -1
+ include_user = 1
+
+ action_icon_state = "mime"
+ action_background_icon_state = "bg_mime"
+
+/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click()
+ if(usr && usr.mind)
+ if(!usr.mind.miming)
+ to_chat(usr, "You must dedicate yourself to silence first.")
+ return
+ invocation = "[usr.real_name] looks as if a blockade is in front of [usr.p_them()]."
+ else
+ invocation_type ="none"
+ ..()
+
+/obj/effect/proc_holder/spell/aimed/finger_guns
+ name = "Finger Guns"
+ desc = "Shoot a mimed bullet from your fingers that stuns and does some damage."
+ school = "mime"
+ panel = "Mime"
+ charge_max = 300
+ clothes_req = 0
+ invocation_type = "emote"
+ invocation_emote_self = "You fire your finger gun!"
+ range = 20
+ projectile_type = /obj/item/projectile/bullet/mime
+ projectile_amount = 3
+ sound = null
+ active_msg = "You draw your fingers!"
+ deactive_msg = "You put your fingers at ease. Another time."
+ active = FALSE
+
+ action_icon_state = "mime"
+ action_background_icon_state = "bg_mime"
+ base_icon_state = "mime"
+
+
+/obj/effect/proc_holder/spell/aimed/finger_guns/Click()
+ var/mob/living/carbon/human/owner = usr
+ if(owner.incapacitated())
+ to_chat(owner, "You can't properly point your fingers while incapacitated.")
+ return
+ if(usr && usr.mind)
+ if(!usr.mind.miming)
+ to_chat(usr, "You must dedicate yourself to silence first.")
+ return
+ invocation = "[usr.real_name] fires [usr.p_their()] finger gun!"
+ else
+ invocation_type ="none"
+ ..()
+
+
+/obj/item/spellbook/oneuse/mimery_blockade
+ spell = /obj/effect/proc_holder/spell/targeted/forcewall/mime
+ spellname = ""
+ name = "Guide to Advanced Mimery Vol 1"
+ desc = "The pages don't make any sound when turned."
+ icon_state ="bookmime"
+
+/obj/item/spellbook/oneuse/mimery_guns
+ spell = /obj/effect/proc_holder/spell/aimed/finger_guns
+ spellname = ""
+ name = "Guide to Advanced Mimery Vol 2"
+ desc = "There aren't any words written..."
+ icon_state ="bookmime"
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index 70f7a76a7a..38720f81a0 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -165,7 +165,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/nukeoffer/sniper
name = "Sniper bundle"
desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, a hollow-point \
- haemorrhage magazine, a soporific knockout magazine, a free surplus supressor, and a worn out suit and tie."
+ a soporific knockout magazine, a free surplus supressor, and a worn out suit and tie."
item = /obj/item/storage/briefcase/sniperbundle
cost = 20 // normally 26
@@ -449,11 +449,11 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
item = /obj/item/ammo_box/magazine/m12g/dragon
include_modes = list(/datum/game_mode/nuclear)
-/datum/uplink_item/ammo/shotgun/breach
- name = "12g Breaching Shells"
- desc = "An economic variant of the CMC meteorshot slugs, not as effective for knocking \
- down targets, but still great for blasting airlocks off their frames."
- item = /obj/item/ammo_box/magazine/m12g/breach
+/datum/uplink_item/ammo/shotgun/meteor
+ name = "12g Meteorslug Shells"
+ desc = "An alternative 8-round meteorslug magazine for use in the Bulldog shotgun. \
+ Great for blasting airlocks off their frames."
+ item = /obj/item/ammo_box/magazine/m12g/meteor
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/shotgun/bag
@@ -488,12 +488,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
By the time you need to use this, you'll already be on a pile of corpses."
item = /obj/item/ammo_box/magazine/mm195x129
-/datum/uplink_item/ammo/machinegun/bleeding
- name = "1.95x129mm (Bleeding) Box Magazine"
- desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with special properties \
- to induce internal bleeding on targets."
- item = /obj/item/ammo_box/magazine/mm195x129/bleeding
-
/datum/uplink_item/ammo/machinegun/hollow
name = "1.95x129mm (Hollow-Point) Box Magazine"
desc = "A 50-round magazine of 1.95x129mm ammunition for use in the L6 SAW; equipped with hollow-point tips to help \
@@ -527,12 +521,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
item = /obj/item/ammo_box/magazine/sniper_rounds/soporific
cost = 6
-/datum/uplink_item/ammo/sniper/haemorrhage
- name = ".50 Haemorrhage Magazine"
- desc = "A 5-round magazine of haemorrhage ammo designed for use with .50 sniper rifles; causes heavy bleeding \
- in the target."
- item = /obj/item/ammo_box/magazine/sniper_rounds/haemorrhage
-
/datum/uplink_item/ammo/sniper/penetrator
name = ".50 Penetrator Magazine"
desc = "A 5-round magazine of penetrator ammo designed for use with .50 sniper rifles. \