diff --git a/baystation12.dme b/baystation12.dme
index 0537e357be..f71ff8f3c5 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1331,7 +1331,9 @@
#include "code\modules\projectiles\guns\launcher\crossbow.dm"
#include "code\modules\projectiles\guns\launcher\pneumatic.dm"
#include "code\modules\projectiles\guns\launcher\rocket.dm"
+#include "code\modules\projectiles\guns\launcher\syringe_gun.dm"
#include "code\modules\projectiles\guns\projectile\automatic.dm"
+#include "code\modules\projectiles\guns\projectile\dartgun.dm"
#include "code\modules\projectiles\guns\projectile\pistol.dm"
#include "code\modules\projectiles\guns\projectile\revolver.dm"
#include "code\modules\projectiles\guns\projectile\shotgun.dm"
@@ -1351,11 +1353,9 @@
#include "code\modules\reagents\Chemistry-Reagents-Antidepressants.dm"
#include "code\modules\reagents\Chemistry-Reagents.dm"
#include "code\modules\reagents\Chemistry-Recipes.dm"
-#include "code\modules\reagents\dartgun.dm"
#include "code\modules\reagents\grenade_launcher.dm"
#include "code\modules\reagents\reagent_containers.dm"
#include "code\modules\reagents\reagent_dispenser.dm"
-#include "code\modules\reagents\syringe_gun.dm"
#include "code\modules\reagents\reagent_containers\blood_pack.dm"
#include "code\modules\reagents\reagent_containers\borghydro.dm"
#include "code\modules\reagents\reagent_containers\dropper.dm"
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 4f424e0315..e513a7db37 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -67,7 +67,7 @@
icon_state = "bike_horn"
item_state = "bike_horn"
throwforce = 3
- w_class = 1.0
+ w_class = 2
throw_speed = 3
throw_range = 15
attack_verb = list("HONKED")
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index ff158590fa..8f6dd78996 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -99,13 +99,13 @@
New()
..()
- new /obj/item/ammo_casing/gas_cartridge( src )
- new /obj/item/ammo_casing/gas_cartridge( src )
- new /obj/item/ammo_casing/gas_cartridge( src )
- new /obj/item/ammo_casing/gas_cartridge( src )
- new /obj/item/ammo_casing/gas_cartridge( src )
- new /obj/item/ammo_casing/gas_cartridge( src )
- new /obj/item/ammo_casing/gas_cartridge( src )
+ new /obj/item/weapon/syringe_cartridge( src )
+ new /obj/item/weapon/syringe_cartridge( src )
+ new /obj/item/weapon/syringe_cartridge( src )
+ new /obj/item/weapon/syringe_cartridge( src )
+ new /obj/item/weapon/syringe_cartridge( src )
+ new /obj/item/weapon/syringe_cartridge( src )
+ new /obj/item/weapon/syringe_cartridge( src )
/obj/item/weapon/storage/box/beakers
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 858bee60c1..ac86766bde 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -304,10 +304,7 @@ emp_act
throw_mode_off()
return
- var/dtype = BRUTE
- if(istype(O,/obj/item/weapon))
- var/obj/item/weapon/W = O
- dtype = W.damtype
+ var/dtype = O.damtype
var/throw_damage = O.throwforce*(speed/THROWFORCE_SPEED_DIVISOR)
var/zone
@@ -370,17 +367,21 @@ emp_act
affecting.embed(I)
// Begin BS12 momentum-transfer code.
- if(O.throw_source && speed >= THROWNOBJ_KNOCKBACK_SPEED)
- var/obj/item/weapon/W = O
- var/momentum = speed/THROWNOBJ_KNOCKBACK_DIVISOR
+ var/mass = 1.5
+ if(istype(O, /obj/item))
+ var/obj/item/I = O
+ mass = I.w_class/THROWNOBJ_KNOCKBACK_DIVISOR
+ var/momentum = speed*mass
+
+ if(O.throw_source && momentum >= THROWNOBJ_KNOCKBACK_SPEED)
var/dir = get_dir(O.throw_source, src)
visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
+
+ if(!O || !src) return
- if(!W || !src) return
-
- if(W.loc == src && W.sharp) //Projectile is embedded and suitable for pinning.
+ if(O.loc == src && O.sharp) //Projectile is embedded and suitable for pinning.
var/turf/T = near_wall(dir,2)
if(T)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 2fa9cdc4b6..faafc23b2d 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -103,10 +103,7 @@
/mob/living/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR)//Standardization and logging -Sieve
if(istype(AM,/obj/))
var/obj/O = AM
- var/dtype = BRUTE
- if(istype(O,/obj/item/weapon))
- var/obj/item/weapon/W = O
- dtype = W.damtype
+ var/dtype = O.damtype
var/throw_damage = O.throwforce*(speed/THROWFORCE_SPEED_DIVISOR)
var/miss_chance = 15
@@ -136,17 +133,21 @@
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (JMP)")
// Begin BS12 momentum-transfer code.
- if(O.throw_source && speed >= THROWNOBJ_KNOCKBACK_SPEED)
- var/obj/item/weapon/W = O
- var/momentum = speed/THROWNOBJ_KNOCKBACK_DIVISOR
+ var/mass = 1.5
+ if(istype(O, /obj/item))
+ var/obj/item/I = O
+ mass = I.w_class/THROWNOBJ_KNOCKBACK_DIVISOR
+ var/momentum = speed*mass
+
+ if(O.throw_source && momentum >= THROWNOBJ_KNOCKBACK_SPEED)
var/dir = get_dir(O.throw_source, src)
visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
- if(!W || !src) return
+ if(!O || !src) return
- if(W.sharp) //Projectile is suitable for pinning.
+ if(O.sharp) //Projectile is suitable for pinning.
//Handles embedding for non-humans and simple_animals.
embed(O)
diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm
index c8048026c3..d26b1601cc 100644
--- a/code/modules/projectiles/guns/alien.dm
+++ b/code/modules/projectiles/guns/alien.dm
@@ -1,6 +1,6 @@
//Vox pinning weapon.
/obj/item/weapon/gun/launcher/spikethrower
- name = "Vox spike thrower"
+ name = "vox spike thrower"
desc = "A vicious alien projectile weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive."
var/last_regen = 0
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index e4d1b0070a..6bbc2aed3e 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -49,7 +49,7 @@
projectile_type = /obj/item/projectile/energy/dart
/obj/item/weapon/gun/energy/crossbow/largecrossbow
- name = "Energy Crossbow"
+ name = "energy crossbow"
desc = "A weapon favored by mercenary infiltration teams."
w_class = 4
force = 10
diff --git a/code/modules/projectiles/guns/launcher.dm b/code/modules/projectiles/guns/launcher.dm
index 82998ef60a..ea86814afa 100644
--- a/code/modules/projectiles/guns/launcher.dm
+++ b/code/modules/projectiles/guns/launcher.dm
@@ -22,14 +22,10 @@
/obj/item/weapon/gun/launcher/proc/update_release_force(obj/item/projectile)
return 0
-/obj/item/weapon/gun/launcher/process_projectile(obj/projectile, mob/user, atom/target, var/target_zone, var/params=null, var/pointblank=0, var/reflex=0)
- if(!istype(projectile, /obj/item)) return 0
-
- var/obj/item/I = projectile
-
- update_release_force(I)
- I.loc = get_turf(user)
- I.throw_at(target, throw_distance, release_force, user)
+/obj/item/weapon/gun/launcher/process_projectile(obj/item/projectile, mob/user, atom/target, var/target_zone, var/params=null, var/pointblank=0, var/reflex=0)
+ update_release_force(projectile)
+ projectile.loc = get_turf(user)
+ projectile.throw_at(target, throw_distance, release_force, user)
return 1
/obj/item/weapon/gun/launcher/attack_self(mob/living/user as mob)
diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm
index 3e653bfeeb..712e74e150 100644
--- a/code/modules/projectiles/guns/launcher/pneumatic.dm
+++ b/code/modules/projectiles/guns/launcher/pneumatic.dm
@@ -62,7 +62,7 @@
icon_state = "pneumatic-tank"
item_state = "pneumatic-tank"
user.update_icons()
- else if(W.w_class <= max_w_class)
+ else if(istype(W) && W.w_class <= max_w_class)
var/total_stored = 0
for(var/obj/item/O in src.contents)
total_stored += O.w_class
diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm
new file mode 100644
index 0000000000..b0275599de
--- /dev/null
+++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm
@@ -0,0 +1,135 @@
+/obj/item/weapon/syringe_cartridge
+ name = "compressed gas cartridge"
+ desc = "An impact-triggered compressed gas cartridge that can fitted to a syringe for rapid injection."
+ icon = 'icons/obj/ammo.dmi'
+ icon_state = "syringe-cartridge"
+ var/icon_flight = "syringe-cartridge-flight" //so it doesn't look so weird when shot
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+ throwforce = 3
+ force = 3
+ w_class = 1
+ var/obj/item/weapon/reagent_containers/syringe/syringe
+ var/primed = 0
+
+/obj/item/weapon/syringe_cartridge/update_icon()
+ underlays.Cut()
+ if(syringe)
+ underlays += image(syringe.icon, src, syringe.icon_state)
+ underlays += syringe.filling
+
+/obj/item/weapon/syringe_cartridge/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/reagent_containers/syringe))
+ syringe = I
+ user << "You carefully insert [syringe] into [src]."
+ user.remove_from_mob(syringe)
+ syringe.loc = src
+ sharp = 1
+ update_icon()
+
+/obj/item/weapon/syringe_cartridge/attack_self(mob/user)
+ if(syringe)
+ user << "You remove [syringe] from [src]."
+ user.put_in_hands(syringe)
+ syringe = null
+ sharp = initial(sharp)
+ update_icon()
+
+/obj/item/weapon/syringe_cartridge/proc/prime()
+ //the icon state will revert back when update_icon() is called from throw_impact()
+ icon_state = icon_flight
+ underlays.Cut()
+ primed = 1
+
+/obj/item/weapon/syringe_cartridge/throw_impact(atom/hit_atom, var/speed)
+ ..() //handles embedding for us. Should have a decent chance if thrown fast enough
+ if(syringe)
+ //check speed to see if we hit hard enough to trigger the rapid injection
+ //incidentally, this means syringe_cartridges can be used with the pneumatic launcher
+ if(speed >= 10 && primed && isliving(hit_atom))
+ var/mob/living/L = hit_atom
+ //unfortuately we don't know where the dart will actually hit, since that's done by the parent.
+ if(L.can_inject())
+ if(syringe.reagents)
+ syringe.reagents.trans_to(L, 15)
+
+ syringe.break_syringe(iscarbon(hit_atom)? hit_atom : null)
+ syringe.update_icon()
+
+ icon_state = initial(icon_state) //reset icon state
+ update_icon()
+
+/obj/item/weapon/gun/launcher/syringe
+ name = "syringe gun"
+ desc = "A spring loaded rifle designed to fit syringes, designed to incapacitate unruly patients from a distance."
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "syringegun"
+ item_state = "syringegun"
+ w_class = 3
+ force = 7
+ matter = list("metal" = 2000)
+ slot_flags = SLOT_BELT
+
+ fire_sound = 'sound/weapons/empty.ogg'
+ fire_sound_text = "a metallic thunk"
+ recoil = 0
+ release_force = 10
+ throw_distance = 10
+
+ var/list/darts = list()
+ var/max_darts = 1
+ var/obj/item/weapon/syringe_cartridge/next
+
+/obj/item/weapon/gun/launcher/syringe/consume_next_projectile()
+ if(next)
+ next.prime()
+ return next
+ return null
+
+/obj/item/weapon/gun/launcher/syringe/handle_post_fire()
+ ..()
+ darts -= next
+ next = null
+
+/obj/item/weapon/gun/launcher/syringe/attack_self(mob/living/user as mob)
+ if(next)
+ user.visible_message("[user] unlatches and carefully relax the bolt on [src].", "You unlatch and carefully relax the bolt on [src], unloading the spring.")
+ next = null
+ else if(darts.len)
+ playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1)
+ user.visible_message("[user] draws back the bolt on [src], clicking it into place.", "You draw back the bolt on the [src], loading the spring!")
+ next = darts[1]
+
+/obj/item/weapon/gun/launcher/syringe/attack_hand(mob/living/user as mob)
+ if(src in user)
+ if(!darts.len)
+ user << "[src] is empty."
+ return
+ if(next)
+ user << "The cover on [src] is locked shut."
+ return
+ var/obj/item/weapon/syringe_cartridge/C = darts[1]
+ darts -= C
+ user.put_in_hands(C)
+ user.visible_message("[user] removes \a [C] from [src].", "You remove \a [C] from [src].")
+ else
+ ..()
+
+/obj/item/weapon/gun/launcher/syringe/attackby(var/obj/item/A as obj, mob/user as mob)
+ if(istype(A, /obj/item/weapon/syringe_cartridge))
+ var/obj/item/weapon/syringe_cartridge/C = A
+ if(darts.len >= max_darts)
+ user << "[src] is full!"
+ return
+ user.remove_from_mob(C)
+ C.loc = src
+ darts += C //add to the end
+ user.visible_message("[user] inserts \a [C] into [src].", "You insert \a [C] into [src].")
+ else
+ ..()
+
+/obj/item/weapon/gun/launcher/syringe/rapid
+ name = "rapid syringe gun"
+ desc = "A modification of the syringe gun design, using a rotating cylinder to store up to four syringes. The spring still needs to be drawn between shots."
+ icon_state = "rapidsyringegun"
+ max_darts = 4
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 26b42308ad..128eddccde 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -78,12 +78,12 @@
switch(AM.mag_type)
if(MAGAZINE)
if(ammo_magazine)
- user << "[src] already has a magazine loaded!" //already a magazine here
+ user << "[src] already has a magazine loaded." //already a magazine here
return
user.remove_from_mob(AM)
AM.loc = src
ammo_magazine = AM
- user.visible_message("[user] inserts [AM] into [src].", "You insert [AM] into [src]!")
+ user.visible_message("[user] inserts [AM] into [src].", "You insert [AM] into [src].")
playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1)
if(SPEEDLOADER)
if(loaded.len >= max_shells)
@@ -99,7 +99,7 @@
AM.stored_ammo -= C //should probably go inside an ammo_magazine proc, but I guess less proc calls this way...
count++
if(count)
- user.visible_message("[user] reloads [src].", "You load [count] round\s into [src]!")
+ user.visible_message("[user] reloads [src].", "You load [count] round\s into [src].")
playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1)
AM.update_icon()
else if(istype(A, /obj/item/ammo_casing))
@@ -107,13 +107,13 @@
if(!(load_method & SINGLE_CASING) || caliber != C.caliber)
return //incompatible
if(loaded.len >= max_shells)
- user << "[src] is full!"
+ user << "[src] is full."
return
user.remove_from_mob(C)
C.loc = src
loaded.Insert(1, C) //add to the head of the list
- user.visible_message("[user] inserts \a [C] into [src].", "You insert \a [C] into [src]!")
+ user.visible_message("[user] inserts \a [C] into [src].", "You insert \a [C] into [src].")
playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1)
update_icon()
@@ -123,7 +123,7 @@
/obj/item/weapon/gun/projectile/proc/unload_ammo(mob/user, var/allow_dump=1)
if(ammo_magazine)
user.put_in_hands(ammo_magazine)
- user.visible_message("[user] removes [ammo_magazine] from [src].", "You remove [ammo_magazine] from [src]!")
+ user.visible_message("[user] removes [ammo_magazine] from [src].", "You remove [ammo_magazine] from [src].")
playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1)
ammo_magazine.update_icon()
ammo_magazine = null
@@ -138,14 +138,14 @@
count++
loaded.Cut()
if(count)
- user.visible_message("[user] unloads [src].", "You unload [count] round\s from [src]!")
+ user.visible_message("[user] unloads [src].", "You unload [count] round\s from [src].")
else if(load_method & SINGLE_CASING)
var/obj/item/ammo_casing/C = loaded[loaded.len]
loaded.len--
user.put_in_hands(C)
- user.visible_message("[user] removes \a [C] from [src].", "You remove \a [C] from [src]!")
+ user.visible_message("[user] removes \a [C] from [src].", "You remove \a [C] from [src].")
else
- user << "[src] is empty!"
+ user << "[src] is empty."
update_icon()
/obj/item/weapon/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob)
diff --git a/code/modules/reagents/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm
similarity index 100%
rename from code/modules/reagents/dartgun.dm
rename to code/modules/projectiles/guns/projectile/dartgun.dm
diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm
deleted file mode 100644
index 23a9eaa36b..0000000000
--- a/code/modules/reagents/syringe_gun.dm
+++ /dev/null
@@ -1,130 +0,0 @@
-/obj/item/ammo_casing/gas_cartridge
- name = "compressed gas cartridge"
- desc = "An impact-triggered compressed gas cartridge that can fitted to a syringe for rapid injection. It's not very useful until primed though." //i.e. only works when shot out of a syringe gun.
- icon_state = "syringe-cartridge"
- caliber = "syringe"
- projectile_type = /obj/item/projectile/bullet/syringe
- w_class = 2 //mainly so that they can be yanked out
- var/obj/item/weapon/reagent_containers/syringe/syringe
-
-/obj/item/ammo_casing/gas_cartridge/update_icon()
- underlays.Cut()
- if(syringe)
- underlays += image(syringe.icon, src, syringe.icon_state)
- underlays += syringe.filling
-
-/obj/item/ammo_casing/gas_cartridge/attackby(obj/item/I, mob/user)
- if(istype(I, /obj/item/weapon/reagent_containers/syringe))
- syringe = I
- user << "You carefully insert [syringe] into [src]."
- user.remove_from_mob(syringe)
- syringe.loc = src
- var/obj/item/projectile/bullet/syringe/S = BB
- if(istype(S))
- S.damage = 1
- S.sharp = 1
- update_icon()
-
-/obj/item/ammo_casing/gas_cartridge/attack_self(mob/user)
- if(syringe)
- user << "You remove [syringe] from [src]."
- user.put_in_hands(syringe)
- syringe = null
- var/obj/item/projectile/bullet/syringe/S = BB
- if(istype(S))
- S.damage = initial(S.damage)
- S.sharp = initial(S.sharp)
- update_icon()
-
-//This was kind of rushed, there may very well be a simpler way to implement this.
-//Sort of hacky, though nearly not as bad as the previous implementation:
-//Basically the syringe gun is supposed to launch the entire syringe+cartrige assemby, but hitby() isn't powerfull enough to do what we need.
-//Instead, we fire a projectile that transfers the reagents, and teleport the cartridge once we impact something.
-/obj/item/projectile/bullet/syringe
- name = "syringe dart"
- icon_state = "cbbolt"
- damage = 3
- check_armour = "bullet"
- sharp = 0
- embed = 0 //we handle this ourselves
- var/obj/item/ammo_casing/gas_cartridge/cartridge
- var/embedded = 0
- kill_count = 10 //short range
-
-/obj/item/projectile/bullet/syringe/New(newloc)
- ..()
- //ensure that cartridge is always set
- cartridge = newloc
- if(!istype(cartridge))
- del(src)
-
-/obj/item/projectile/bullet/syringe/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null)
- //..() //not really necessary
- if(blocked < 2 && cartridge.syringe && isliving(target))
- var/mob/living/L = target
-
- //inject
- if(L.can_inject(target_zone=def_zone))
- if(cartridge.syringe.reagents)
- cartridge.syringe.reagents.trans_to(L, 15)
- cartridge.syringe.update_icon()
- cartridge.update_icon()
-
- //embed
- L.embed(cartridge, def_zone)
- embedded = 1
-
-/obj/item/projectile/bullet/syringe/on_impact(atom/A)
- if(!embedded)
- cartridge.loc = src.loc
- if(cartridge.syringe)
- cartridge.syringe.break_syringe(iscarbon(A)? A : null)
- cartridge.update_icon()
-
-
-
-/obj/item/weapon/gun/projectile/syringe
- name = "syringe gun"
- desc = "A spring loaded rifle designed to fit syringes, designed to incapacitate unruly patients from a distance."
- icon = 'icons/obj/gun.dmi'
- icon_state = "syringegun"
- item_state = "syringegun"
- w_class = 3
- force = 7
- matter = list("metal" = 2000)
- slot_flags = SLOT_BELT
-
- caliber = "syringe"
- fire_sound = 'sound/weapons/empty.ogg'
- fire_sound_text = "a metallic thunk"
- recoil = 0
- handle_casings = HOLD_CASINGS
- load_method = SINGLE_CASING
- max_shells = 1
- var/drawn = 0
-
-/obj/item/weapon/gun/projectile/syringe/consume_next_projectile()
- if(chambered)
- return chambered.BB
- return null
-
-/obj/item/weapon/gun/projectile/syringe/attack_self(mob/living/user as mob)
- if(!chambered && loaded.len)
- playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1)
- user.visible_message("[user] draws back the bolt on [src], clicking it into place.", "You draw back the bolt on the [src], loading the spring!")
- var/obj/item/ammo_casing/AC = loaded[1] //load next casing.
- loaded -= AC //Remove casing from loaded list.
- chambered = AC
- max_shells -= 1 //to prevent people from storing an extra syringe
- update_icon()
-
-/obj/item/weapon/gun/projectile/syringe/handle_post_fire()
- ..()
- chambered = null
- max_shells = initial(max_shells)
-
-/obj/item/weapon/gun/projectile/syringe/rapid
- name = "rapid syringe gun"
- desc = "A modification of the syringe gun design, using a rotating cylinder to store up to four syringes. The spring still needs to be drawn between shots."
- icon_state = "rapidsyringegun"
- max_shells = 4
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index faf7e34d98..9083a47e1c 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -1312,7 +1312,7 @@ datum/design/item/weapon/rapidsyringe
id = "rapidsyringe"
req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2)
materials = list("$metal" = 5000, "$glass" = 1000)
- build_path = /obj/item/weapon/gun/projectile/syringe/rapid
+ build_path = /obj/item/weapon/gun/launcher/syringe/rapid
/*
datum/design/item/weapon/largecrossbow
name = "Energy Crossbow"
diff --git a/code/setup.dm b/code/setup.dm
index 59cf86f868..06235da7fc 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -83,7 +83,7 @@
#define FIRE_MAX_FIRESUIT_STACKS 20 // If the number of stacks goes above this firesuits won't protect you anymore. If not, you can walk around while on fire like a badass.
#define THROWFORCE_SPEED_DIVISOR 5 // The throwing speed value at which the throwforce multiplier is exactly 1.
-#define THROWNOBJ_KNOCKBACK_SPEED 15 // The minumum speed of a thrown object that will cause living mobs it hits to be knocked back.
+#define THROWNOBJ_KNOCKBACK_SPEED 15 // The minumum speed of a w_class 2 thrown object that will cause living mobs it hits to be knocked back. Heavier objects can cause knockback at lower speeds.
#define THROWNOBJ_KNOCKBACK_DIVISOR 2 // Affects how much speed the mob is knocked back with.
#define PRESSURE_DAMAGE_COEFFICIENT 4 // The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE.
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index acade2ce1b..e47e53e736 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index 067e2ff133..ca37fea7ed 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -5795,7 +5795,7 @@
"chw" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/virologyaccess)
"chx" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating/airless,/area/medical/virology)
"chy" = (/obj/structure/bedsheetbin,/obj/structure/table,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage)
-"chz" = (/obj/structure/table,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/weapon/gun/projectile/syringe,/obj/item/weapon/storage/box/syringegun,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage)
+"chz" = (/obj/structure/table,/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/bodybag/cryobag{pixel_x = -3},/obj/item/weapon/gun/launcher/syringe,/obj/item/weapon/storage/box/syringegun,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage)
"chA" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/research_port)
"chB" = (/turf/simulated/floor/plating,/area/maintenance/research_port)
"chC" = (/obj/machinery/door/airlock/medical{autoclose = 0; icon_state = "door_open"; id_tag = "cubicle1"; name = "Cubicle 1"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/patient_wing)