diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm
index 9258caf0cfb..f5ecc09bfe4 100644
--- a/_maps/map_files/RandomZLevels/academy.dmm
+++ b/_maps/map_files/RandomZLevels/academy.dmm
@@ -160,7 +160,7 @@
"dd" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/wood,/area/awaymission/academy/classrooms)
"de" = (/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms)
"df" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms)
-"dg" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: A+ Educator's Notes: Excellent form."; name = "Summoning Midterm Exam"},/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
+"dg" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: A+ Educator's Notes: Excellent form."; name = "Summoning Midterm Exam"},/obj/item/weapon/gun/projectile/automatic/tommygun/toy,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
"dh" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/awaymission/academy/classrooms)
"di" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/academy/classrooms)
"dj" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/academy/classrooms)
@@ -340,7 +340,7 @@
"gB" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/window/reinforced{dir = 5},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms)
"gC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
"gD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
-"gE" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: B- Educator's Notes: Keep applying yourself, you're showing improvement."; name = "Summoning Midterm Exam"},/obj/item/toy/crossbow,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
+"gE" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: B- Educator's Notes: Keep applying yourself, you're showing improvement."; name = "Summoning Midterm Exam"},/obj/item/weapon/gun/projectile/automatic/tommygun/toy,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
"gG" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
"gH" = (/obj/structure/window/reinforced,/obj/item/ammo_casing,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaymission/academy/classrooms)
"gI" = (/mob/living/simple_animal/hostile/bear,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms)
@@ -672,4 +672,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
-
diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm
index 62503cc3dd1..ce1e5a290e9 100644
--- a/_maps/map_files/RandomZLevels/spacehotel.dmm
+++ b/_maps/map_files/RandomZLevels/spacehotel.dmm
@@ -189,7 +189,7 @@
"dJ" = (/obj/item/target/syndicate,/turf/simulated/floor/carpet,/area/awaymission)
"dK" = (/obj/item/trash/candy,/turf/simulated/floor/carpet,/area/awaymission)
"dL" = (/obj/item/toy/spinningtoy,/turf/simulated/floor/carpet,/area/awaymission)
-"dM" = (/obj/item/toy/crossbow,/turf/simulated/floor/carpet,/area/awaymission)
+"dM" = (/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/turf/simulated/floor/carpet,/area/awaymission)
"dN" = (/obj/structure/barricade/wooden,/obj/structure/barricade/wooden,/turf/simulated/floor/carpet,/area/awaymission)
"dO" = (/obj/machinery/door/airlock,/turf/simulated/floor/carpet,/area/awaymission)
"dP" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/wall,/area/awaymission)
@@ -322,4 +322,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabReWeXbDbDbDbDbDeSeSeSbDbDbDbDeYeUeVaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZbRfabDeSeWeSbDbDeRbDbDfbfceSeTeUeVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZeNeMeHeIeNeLeLeLeNeMeHeIeNfdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
-
diff --git a/_maps/map_files/RandomZLevels/stationCollision.dmm b/_maps/map_files/RandomZLevels/stationCollision.dmm
index d91ef330c60..0f6741251de 100644
--- a/_maps/map_files/RandomZLevels/stationCollision.dmm
+++ b/_maps/map_files/RandomZLevels/stationCollision.dmm
@@ -286,8 +286,8 @@
"fz" = (/obj/structure/table,/obj/item/device/analyzer,/obj/item/device/mass_spectrometer{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/research)
"fA" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/weapon/paper/sc_safehint_paper_caf,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
"fB" = (/obj/structure/target_stake,/obj/item/weapon/grown/sunflower,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/research)
-"fC" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
-"fD" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
+"fC" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/gun/projectile/automatic/tommygun/toy,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
+"fD" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/tommygun/toy,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
"fE" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/airless,/area/awaymission/midblock)
"fF" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched1"},/area/awaymission/midblock)
"fG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/awaymission/midblock)
@@ -315,7 +315,7 @@
"gc" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/arrivalblock)
"gd" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/northblock)
"ge" = (/obj/item/weapon/storage/secure/safe/sc_ssafe{pixel_x = 4; pixel_y = -26},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/northblock)
-"gf" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
+"gf" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/automatic/tommygun/toy,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
"gg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"},/area/awaymission/midblock)
"gh" = (/obj/structure/closet/wardrobe/generic,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
"gi" = (/turf/simulated/floor/plasteel,/area/awaymission/midblock)
@@ -689,4 +689,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaagzltlFlGlHhuhuhuiYlIkfkfkpkRjKlJjKlKiYlLlMlNlOlOlP
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaagzgzgzgzgzgzgzgziYlVlWlXiYkfkdlYlZmaiYjKjKjKmbmbmbmbmcjulCmdmejuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYjujujujujuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
-
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index f3117a67215..0db941e3ca5 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -1348,9 +1348,19 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/misc/mafia
name = "Mafia Supply Crate"
- contains = list(/obj/item/clothing/suit/browntrenchcoat =1,/obj/item/clothing/suit/blacktrenchcoat =1,/obj/item/clothing/head/fedora/whitefedora =1,
- /obj/item/clothing/head/fedora/brownfedora =1,/obj/item/clothing/head/fedora =1,/obj/item/clothing/under/flappers =1,/obj/item/clothing/under/mafia =1,/obj/item/clothing/under/mafia/vest =1,/obj/item/clothing/under/mafia/white =1,
- /obj/item/clothing/under/mafia/sue =1,/obj/item/clothing/under/mafia/tan =1, /obj/item/toy/crossbow/tommygun =2)
+ contains = list(/obj/item/clothing/suit/browntrenchcoat,
+ /obj/item/clothing/suit/blacktrenchcoat,
+ /obj/item/clothing/head/fedora/whitefedora,
+ /obj/item/clothing/head/fedora/brownfedora,
+ /obj/item/clothing/head/fedora,
+ /obj/item/clothing/under/flappers,
+ /obj/item/clothing/under/mafia,
+ /obj/item/clothing/under/mafia/vest,
+ /obj/item/clothing/under/mafia/white,
+ /obj/item/clothing/under/mafia/sue,
+ /obj/item/clothing/under/mafia/tan,
+ /obj/item/weapon/gun/projectile/automatic/tommygun/toy,
+ /obj/item/weapon/gun/projectile/automatic/tommygun/toy)
cost = 15
containername = "mafia supply crate"
@@ -1385,6 +1395,29 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
..()
+/datum/supply_packs/misc/foamforce
+ name = "Foam Force Crate"
+ contains = list(/obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy)
+ cost = 25
+ containername = "foam force crate"
+
+/datum/supply_packs/misc/foamforce/bonus
+ name = "Foam Force Pistols Crate"
+ contains = list(/obj/item/weapon/gun/projectile/automatic/toy/pistol,
+ /obj/item/weapon/gun/projectile/automatic/toy/pistol,
+ /obj/item/ammo_box/magazine/toy/pistol,
+ /obj/item/ammo_box/magazine/toy/pistol)
+ cost = 40
+ containername = "foam force pistols crate"
+ contraband = 1
+
/datum/supply_packs/misc/randomised/contraband
num_contained = 5
contains = list(/obj/item/weapon/storage/pill_bottle/random_drug_bottle,
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index cf997f6f28d..cc10ee566af 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -407,6 +407,31 @@ var/list/uplink_items = list()
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
+/datum/uplink_item/dangerous/foamsmg
+ name = "Toy Submachine Gun"
+ desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine."
+ item = /obj/item/weapon/gun/projectile/automatic/c20r/toy
+ cost = 12
+ gamemodes = list(/datum/game_mode/nuclear)
+ surplus = 0
+
+/datum/uplink_item/dangerous/foammachinegun
+ name = "Toy Machine Gun"
+ desc = "A fully-loaded Donksoft belt-fed machine gun. This weapon has a massive 50-round magazine of devastating riot grade darts, that can briefly incapacitate someone in just one volley."
+ item = /obj/item/weapon/gun/projectile/automatic/l6_saw/toy
+ cost = 30
+ gamemodes = list(/datum/game_mode/nuclear)
+ surplus = 0
+
+/datum/uplink_item/ammo/toydarts
+ name = "Box of Riot Darts"
+ desc = "A box of 40 Donksoft foam riot darts, for reloading any compatible foam dart gun. Don't forget to share!"
+ item = /obj/item/ammo_box/foambox/riot
+ cost = 10
+ gamemodes = list(/datum/game_mode/nuclear)
+ surplus = 0
+
+
//for refunding the syndieborg teleporter
/datum/uplink_item/dangerous/syndieborg/spawn_item()
var/obj/item/weapon/antag_spawner/borg_tele/T = ..()
@@ -550,6 +575,13 @@ var/list/uplink_items = list()
cost = 8
excludefrom = list(/datum/game_mode/nuclear)
+/datum/uplink_item/stealthy_weapons/foampistol
+ name = "Toy Gun (with Stun Darts)"
+ desc = "An innocent looking toy pistol designed to fire foam darts. Comes loaded with riot grade darts, to incapacitate a target."
+ item = /obj/item/weapon/gun/projectile/automatic/toy/pistol/riot
+ cost = 10
+ surplus = 10
+
/datum/uplink_item/stealthy_weapons/soap
name = "Syndicate Soap"
desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. You can also drop it underfoot to slip people."
@@ -1105,4 +1137,4 @@ var/list/uplink_items = list()
U.purchase_log += "\icon[C]"
for(var/item in bought_items)
new item(C)
- U.purchase_log += "\icon[item]"
\ No newline at end of file
+ U.purchase_log += "\icon[item]"
diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm
index f46e2361192..7e15df8676c 100644
--- a/code/game/objects/items/random_items.dm
+++ b/code/game/objects/items/random_items.dm
@@ -5,7 +5,7 @@
name = "Random Toy"
New()
..()
- var/list/types = list(/obj/item/toy/crossbow,/obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/weapon/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/prize)
+ var/list/types = list(/obj/item/weapon/gun/projectile/shotgun/toy/crossbow, /obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/weapon/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/prize)
var/T = pick(types)
new T(loc)
spawn(1)
@@ -332,4 +332,4 @@
new nade3(src)
new nade4(src)
new nade5(src)
- new nade6(src)
\ No newline at end of file
+ new nade6(src)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 8911a3e60f6..6a863bcc60f 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -3,8 +3,6 @@
* Balloons
* Fake telebeacon
* Fake singularity
- * Toy crossbow
- * Toy Tommy Gun
* Toy swords
* Toy mechs
* Snap pops
@@ -132,142 +130,6 @@
icon = 'icons/obj/singularity.dmi'
icon_state = "singularity_s1"
-
-/*
- * Toy crossbow
- */
-
-/obj/item/toy/crossbow
- name = "foam dart crossbow"
- desc = "A weapon favored by many overactive children. Ages 8 and up."
- icon = 'icons/obj/gun.dmi'
- icon_state = "crossbow"
- item_state = "crossbow"
- lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
- w_class = 2.0
- attack_verb = list("attacked", "struck", "hit")
- var/bullets = 5
-
-/obj/item/toy/crossbow/examine(mob/user)
- ..(user)
- if (bullets)
- to_chat(user, "It is loaded with [bullets] foam darts!")
-
-/obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob, params)
- if(istype(I, /obj/item/toy/ammo/crossbow))
- if(bullets <= 4)
- user.drop_item()
- qdel(I)
- bullets++
- to_chat(user, "You load the foam dart into the crossbow.")
- else
- to_chat(usr, "It's already fully loaded.")
-
-
-/obj/item/toy/crossbow/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
- if(!isturf(target.loc) || target == user) return
- if(flag) return
-
- if (locate (/obj/structure/table, src.loc))
- return
- else if (bullets)
- var/turf/trg = get_turf(target)
- var/obj/effect/foam_dart_dummy/D = new/obj/effect/foam_dart_dummy(get_turf(src))
- bullets--
- D.icon_state = "foamdart"
- D.name = "foam dart"
- playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
-
- for(var/i=0, i<6, i++)
- if (D)
- if(D.loc == trg) break
- step_towards(D,trg)
-
- for(var/mob/living/M in D.loc)
- if(!istype(M,/mob/living)) continue
- if(M == user) continue
- D.visible_message("[M] was hit by the foam dart!")
- new /obj/item/toy/ammo/crossbow(M.loc)
- qdel(D)
- return
-
- for(var/atom/A in D.loc)
- if(A == user) continue
- if(A.density)
- new /obj/item/toy/ammo/crossbow(A.loc)
- qdel(D)
-
- sleep(1)
-
- spawn(10)
- if(D)
- new /obj/item/toy/ammo/crossbow(D.loc)
- qdel(D)
-
- return
- else if (bullets == 0)
- user.Weaken(5)
- user.visible_message("[user] realized they were out of ammo and starting scrounging for some!")
-
-
-
-/obj/item/toy/crossbow/attack(mob/M as mob, mob/user as mob)
- add_fingerprint(user)
-
-// ******* Check
-
- if (bullets > 0 && M.lying)
- visible_message("[user] casually lines up a shot with [M]'s head and pulls the trigger!", "You hear the sound of foam against skull.")
- M.visible_message("[M] was hit in the head by the foam dart!")
- playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
- new /obj/item/toy/ammo/crossbow(M.loc)
- bullets--
- else if (M.lying && bullets == 0)
- visible_message("[user] casually lines up a shot with [M]'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", "You hear someone fall.")
- user.Weaken(5)
- return
-
-/obj/item/toy/ammo/crossbow
- name = "foam dart"
- desc = "Its nerf or nothing! Ages 8 and up."
- icon = 'icons/obj/toy.dmi'
- icon_state = "foamdart"
- w_class = 1.0
-
-/obj/effect/foam_dart_dummy
- name = ""
- desc = ""
- icon = 'icons/obj/toy.dmi'
- icon_state = "null"
- anchored = 1
- density = 0
-
-
-/*
- * Tommy gun
- */
-
-/obj/item/toy/crossbow/tommygun
- name = "tommy gun"
- desc = "Looks almost like the real thing! Great for practicing Drive-bys"
- icon_state = "tommy"
- item_state = "tommy"
- flags = CONDUCT
- w_class = 1.0
- attack_verb = list("struck", "hammered", "hit", "bashed")
- bullets = 20.0
-
-/obj/item/toy/crossbow/tommygun/attackby(obj/item/I as obj, mob/user as mob, params)
- if(istype(I, /obj/item/toy/ammo/crossbow))
- if(bullets <= 19)
- user.drop_item()
- qdel(I)
- bullets++
- to_chat(user, "You load the foam dart into the tommy gun.")
- else
- to_chat(user, "It's already fully loaded.")
-
/*
* Toy swords
*/
@@ -1777,4 +1639,4 @@ obj/item/toy/cards/deck/syndicate/black
desc = "All hail the Magic Conch!"
icon_state = "conch"
use_action = "pulls the string"
- possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.")
\ No newline at end of file
+ possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.")
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index 00433885ad5..c4c1fd38604 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -80,7 +80,7 @@
/obj/item/weapon/banhammer,
/obj/item/toy/balloon,
/obj/item/toy/blink,
- /obj/item/toy/crossbow,
+ /obj/item/weapon/gun/projectile/shotgun/toy/crossbow,
/obj/item/weapon/gun/projectile/revolver/capgun,
/obj/item/toy/katana,
/obj/random/mech,
@@ -115,7 +115,7 @@
/obj/item/toy/AI,
/obj/item/clothing/under/syndicate/tacticool,
/obj/item/weapon/storage/box/fakesyndiesuit,
- /obj/item/toy/crossbow/tommygun,
+ /obj/item/weapon/gun/projectile/automatic/tommygun/toy,
/obj/item/stack/tile/fakespace/loaded,
)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index b93fc3b06b1..ce1e6aad9bb 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -685,14 +685,3 @@
new /obj/item/weapon/lipstick/green(src)
new /obj/item/weapon/lipstick/blue(src)
new /obj/item/weapon/lipstick/white(src)
-
-/obj/item/weapon/storage/box/foam_darts
- name = "Foam Dart Pack"
- desc = "Extra ammo for foam dart launchers. Contains 10 darts."
- storage_slots = 10
- max_combined_w_class = 10
-
-/obj/item/weapon/storage/box/foam_darts/New()
- ..()
- for(var/i=1; i <= storage_slots; i++)
- new /obj/item/toy/ammo/crossbow(src)
diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm
index d67adf97bcb..d404fbaf855 100644
--- a/code/modules/arcade/prize_datums.dm
+++ b/code/modules/arcade/prize_datums.dm
@@ -93,8 +93,8 @@ var/global/datum/prizes/global_prizes = new
/datum/prize_item/foam_darts
name = "Pack of Foam Darts"
- desc = "A refill pack of 10 foam darts."
- typepath = /obj/item/weapon/storage/box/foam_darts
+ desc = "A refill pack with foam darts."
+ typepath = /obj/item/ammo_box/foambox
cost = 20
/datum/prize_item/minigibber
@@ -174,9 +174,10 @@ var/global/datum/prizes/global_prizes = new
/datum/prize_item/crossbow
name = "Foam Dart Crossbow"
desc = "A toy crossbow that fires foam darts."
- typepath = /obj/item/toy/crossbow
+ typepath = /obj/item/weapon/gun/projectile/shotgun/toy/crossbow
cost = 100
+
/datum/prize_item/toy_xeno
name = "Xeno Action Figure"
desc = "A lifelike replica of the horrific xeno scourge."
@@ -252,9 +253,10 @@ var/global/datum/prizes/global_prizes = new
/datum/prize_item/tommygun
name = "Tommygun"
desc = "A replica tommygun that fires foam darts."
- typepath = /obj/item/toy/crossbow/tommygun
+ typepath = /obj/item/weapon/gun/projectile/automatic/tommygun/toy
cost = 175
+
/datum/prize_item/esword
name = "Toy Energy Sword"
desc = "A plastic replica of an energy blade."
diff --git a/code/modules/computer3/computers/arcade.dm b/code/modules/computer3/computers/arcade.dm
index a99c05410ae..6949bfff107 100644
--- a/code/modules/computer3/computers/arcade.dm
+++ b/code/modules/computer3/computers/arcade.dm
@@ -7,8 +7,8 @@
/obj/item/toy/blink = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
/obj/item/toy/sword = 2,
- /obj/item/weapon/gun/projectile/revolver/capgun = 2,
- /obj/item/toy/crossbow = 2,
+ /obj/item/weapon/gun/projectile/revolver/capgun = 2,
+ /obj/item/weapon/gun/projectile/shotgun/toy/crossbow = 2,
/obj/item/clothing/suit/syndicatefake = 2,
/obj/item/weapon/storage/fancy/crayons = 2,
/obj/item/toy/spinningtoy = 2,
@@ -177,4 +177,4 @@
if(interactable())
computer.updateUsrDialog()
blocked = 0
- return
\ No newline at end of file
+ return
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 8fc29a6ce7b..1527dfc2b64 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -255,4 +255,43 @@
desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher."
caliber = "40mm"
icon_state = "40mmHE"
- projectile_type = "/obj/item/projectile/bullet/a40mm"
\ No newline at end of file
+ projectile_type = "/obj/item/projectile/bullet/a40mm"
+
+//FOAM DARTS
+/obj/item/ammo_casing/caseless/foam_dart
+ name = "foam dart"
+ desc = "Its nerf or nothing! Ages 8 and up."
+ projectile_type = "/obj/item/projectile/bullet/reusable/foam_dart"
+ caliber = "foam_force"
+ icon = 'icons/obj/toyguns.dmi'
+ icon_state = "foamdart"
+ var/modified = 0
+
+/obj/item/ammo_casing/caseless/foam_dart/update_icon()
+ ..()
+ if (modified)
+ icon_state = "foamdart_empty"
+ desc = "Its nerf or nothing! ...Although, this one doesn't look too safe."
+
+/obj/item/ammo_casing/caseless/foam_dart/attackby(var/obj/item/A as obj, mob/user as mob, params)
+ ..()
+ if (istype(A, /obj/item/weapon/screwdriver) && !modified)
+ modified = 1
+ BB.damage_type = BRUTE
+ icon_state = "foamdart_empty"
+ desc = "Its nerf or nothing! ...Although, this one doesn't look too safe."
+ user << "You pop the safety cap off of [src]."
+ else if ((istype(A, /obj/item/weapon/pen)) && modified && !BB.contents.len)
+ if (!user.unEquip(A))
+ return
+ A.loc = BB
+ BB.damage = 5
+ BB.nodamage = 0
+ user << "You insert [A] into [src]."
+ return
+
+/obj/item/ammo_casing/caseless/foam_dart/riot
+ name = "riot foam dart"
+ desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
+ projectile_type = "/obj/item/projectile/bullet/reusable/foam_dart/riot"
+ icon_state = "foamdart_riot"
diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm
index 96f8cca31c0..eb998823b6a 100644
--- a/code/modules/projectiles/ammunition/boxes.dm
+++ b/code/modules/projectiles/ammunition/boxes.dm
@@ -86,4 +86,16 @@
name = "Ammunition Box (tranquilizer darts)"
icon_state = "45box"
ammo_type = /obj/item/ammo_casing/shotgun/tranquilizer
- materials = list(MAT_METAL=1750)
\ No newline at end of file
+ materials = list(MAT_METAL=1750)
+
+//FOAM DARTS
+/obj/item/ammo_box/foambox
+ name = "ammo box (Foam Darts)"
+ icon = 'icons/obj/toyguns.dmi'
+ icon_state = "foambox"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ max_ammo = 40
+
+/obj/item/ammo_box/foambox/riot
+ icon_state = "foambox_riot"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 7cf8e9fcdb0..13757e8de0d 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -101,6 +101,14 @@
max_ammo = 5
multiload = 1
+/obj/item/ammo_box/magazine/internal/shot/toy
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart"
+ caliber = "foam_force"
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/internal/shot/toy/crossbow
+ max_ammo = 5
+
///////////EXTERNAL MAGAZINES////////////////
/obj/item/ammo_box/magazine/m10mm
@@ -290,4 +298,54 @@
/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"
\ No newline at end of file
+ ammo_type = "/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath"
+
+//FOAM DARTS
+/obj/item/ammo_box/magazine/toy
+ name = "foam force META magazine"
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart"
+ caliber = "foam_force"
+
+/obj/item/ammo_box/magazine/toy/smg
+ name = "foam force SMG magazine"
+ icon_state = "smg9mm-30"
+ max_ammo = 30
+
+/obj/item/ammo_box/magazine/toy/smg/update_icon()
+ ..()
+ icon_state = "smg9mm-[round(ammo_count(),6)]"
+
+/obj/item/ammo_box/magazine/toy/smg/riot
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
+
+/obj/item/ammo_box/magazine/toy/pistol
+ name = "foam force pistol magazine"
+ icon_state = "9x19p"
+ max_ammo = 8
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/toy/pistol/riot
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
+
+/obj/item/ammo_box/magazine/toy/smgm45
+ name = "donksoft SMG magazine"
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
+ ..()
+ icon_state = "c20r45-[round(ammo_count(),2)]"
+
+/obj/item/ammo_box/magazine/toy/m762
+ name = "donksoft box magazine"
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
+ max_ammo = 50
+
+/obj/item/ammo_box/magazine/toy/m762/update_icon()
+ ..()
+ icon_state = "a762-[round(ammo_count(),10)]"
+
+/obj/item/ammo_box/magazine/toy/tommygunm45
+ name = "little tommy's mag"
+ icon_state = "drum45"
+ max_ammo = 50
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 2aea246d314..e68e384e940 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -279,19 +279,19 @@
//Suicide handling.
if (M == user && user.zone_sel.selecting == "mouth" && !mouthshoot)
mouthshoot = 1
- M.visible_message("\red [user] sticks their gun in their mouth, ready to pull the trigger...")
+ M.visible_message(" [user] sticks their gun in their mouth, ready to pull the trigger...")
if(!do_after(user, 40, target = M))
- M.visible_message("\blue [user] decided life was worth living")
+ M.visible_message(" [user] decided life was worth living")
mouthshoot = 0
return
if (process_chambered())
- user.visible_message("[user] pulls the trigger.")
+ user.visible_message("[user] pulls the trigger.")
if(silenced)
playsound(user, fire_sound, 10, 1)
else
playsound(user, fire_sound, 50, 1)
- if(istype(in_chamber, /obj/item/projectile/lasertag))
- user.show_message("You feel rather silly, trying to commit suicide with a toy.")
+ if(istype(in_chamber, /obj/item/projectile/lasertag) || istype(in_chamber, /obj/item/projectile/bullet/reusable/foam_dart))
+ user.show_message("You feel rather silly, trying to commit suicide with a toy.")
mouthshoot = 0
return
in_chamber.on_hit(M)
@@ -299,7 +299,7 @@
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1)
user.death()
else
- to_chat(user, "Ow...")
+ to_chat(user, "Ow...")
user.apply_effect(110,STAMINA,0)
del(in_chamber)
mouthshoot = 0
@@ -383,4 +383,4 @@
update_icon()
else
set_light(0)
- return
\ No newline at end of file
+ return
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index d6fb9d9aff0..8844f5cd7ab 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -16,15 +16,18 @@
+
+
/obj/item/weapon/gun/projectile/New()
..()
- magazine = new mag_type(src)
+ if (!magazine)
+ magazine = new mag_type(src)
chamber_round()
update_icon()
return
-/obj/item/weapon/gun/projectile/process_chambered(var/eject_casing = 1, var/empty_chamber = 1)
+/obj/item/weapon/gun/projectile/process_chambered(var/eject_casing = 1, var/empty_chamber = 1 )
// if(in_chamber)
// return 1
@@ -146,4 +149,4 @@
item_state = "suppressor"
w_class = 2
var/oldsound = null
- var/initial_w_class = null
\ No newline at end of file
+ var/initial_w_class = null
diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm
new file mode 100644
index 00000000000..350b53f9aa1
--- /dev/null
+++ b/code/modules/projectiles/guns/projectile/toy.dm
@@ -0,0 +1,102 @@
+/obj/item/weapon/gun/projectile/automatic/toy
+ name = "foam force SMG"
+ desc = "A prototype three-round burst toy submachine gun. Ages 8 and up."
+ icon = 'icons/obj/toyguns.dmi'
+ icon_state = "saber"
+ item_state = "gun"
+ mag_type = "/obj/item/ammo_box/magazine/toy/smg"
+ fire_sound = 'sound/items/syringeproj.ogg'
+ force = 0
+ throwforce = 0
+ burst_size = 3
+ can_suppress = 0
+ clumsy_check = 0
+ needs_permit = 0
+
+/obj/item/weapon/gun/projectile/automatic/toy/process_chambered()
+ return ..(0, 1)
+
+/obj/item/weapon/gun/projectile/automatic/toy/pistol
+ name = "foam force pistol"
+ desc = "A small, easily concealable toy handgun. Ages 8 and up."
+ icon_state = "pistol"
+ w_class = 2
+ mag_type = "/obj/item/ammo_box/magazine/toy/pistol"
+ can_suppress = 0
+ burst_size = 1
+ fire_delay = 0
+ action_button_name = null
+
+/obj/item/weapon/gun/projectile/automatic/toy/pistol/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+/obj/item/weapon/gun/projectile/automatic/toy/pistol/riot
+ name = "foam force riot pistol"
+ desc = "RIOT! Ages 8 and up."
+
+/obj/item/weapon/gun/projectile/automatic/toy/pistol/riot/New()
+ magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src)
+ ..()
+
+/obj/item/weapon/gun/projectile/automatic/c20r/toy
+ name = "donksoft SMG"
+ desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up."
+ icon = 'icons/obj/toyguns.dmi'
+ can_suppress = 0
+ needs_permit = 0
+ mag_type = "/obj/item/ammo_box/magazine/toy/smgm45"
+
+/obj/item/weapon/gun/projectile/automatic/c20r/toy/process_chambered()
+ return ..(0, 1)
+
+/obj/item/weapon/gun/projectile/automatic/l6_saw/toy
+ name = "donksoft LMG"
+ desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up."
+ icon = 'icons/obj/toyguns.dmi'
+ can_suppress = 0
+ needs_permit = 0
+ mag_type = "/obj/item/ammo_box/magazine/toy/m762"
+
+/obj/item/weapon/gun/projectile/automatic/l6_saw/toy/process_chambered()
+ return ..(0, 1)
+
+/obj/item/weapon/gun/projectile/automatic/tommygun/toy
+ name = "tommy gun"
+ desc = "Looks almost like the real thing! Great for practicing Drive-bys. Ages 8 and up."
+ icon_state = "tommygun"
+ item_state = "shotgun"
+ w_class = 2
+ mag_type = "/obj/item/ammo_box/magazine/toy/tommygunm45"
+ fire_sound = 'sound/items/syringeproj.ogg'
+
+/obj/item/weapon/gun/projectile/automatic/tommygun/toy/process_chambered()
+ return ..(0, 1)
+
+/obj/item/weapon/gun/projectile/shotgun/toy
+ name = "foam force shotgun"
+ desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up."
+ icon = 'icons/obj/toyguns.dmi'
+ force = 0
+ throwforce = 0
+ origin_tech = null
+ mag_type = "/obj/item/ammo_box/magazine/internal/shot/toy"
+ fire_sound = 'sound/items/syringeproj.ogg'
+ clumsy_check = 0
+ needs_permit = 0
+
+/obj/item/weapon/gun/projectile/shotgun/toy/pump_unload()
+ if(chambered)//We have a shell in the chamber
+ chambered = null
+ if(in_chamber)
+ in_chamber = null
+
+/obj/item/weapon/gun/projectile/shotgun/toy/crossbow
+ name = "foam force crossbow"
+ desc = "A weapon favored by many overactive children. Ages 8 and up."
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "crossbow"
+ item_state = "crossbow"
+ mag_type = "/obj/item/ammo_box/magazine/internal/shot/toy/crossbow"
+ slot_flags = SLOT_BELT
+ w_class = 2
diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm
new file mode 100644
index 00000000000..367d20b6992
--- /dev/null
+++ b/code/modules/projectiles/projectile/reusable.dm
@@ -0,0 +1,43 @@
+/obj/item/projectile/bullet/reusable
+ name = "reusable bullet"
+ desc = "How do you even reuse a bullet?"
+ var/obj/item/ammo_casing/caseless/ammo_type = /obj/item/ammo_casing/caseless/
+ var/hit = 0
+
+/obj/item/projectile/bullet/reusable/on_hit(var/atom/target, var/blocked = 0)
+ if(!proj_hit)
+ proj_hit = 1
+ if (src.contents.len)
+ var/obj/content
+ for(content in src.contents)
+ content.loc = src.loc
+ else
+ new ammo_type(src.loc)
+ ..()
+
+/obj/item/projectile/bullet/reusable/on_range()
+ if(!proj_hit)
+ if (src.contents.len)
+ var/obj/content
+ for(content in src.contents)
+ content.loc = src.loc
+ else
+ new ammo_type(src.loc)
+ ..()
+
+/obj/item/projectile/bullet/reusable/foam_dart
+ name = "foam dart"
+ desc = "I hope you're wearing eye protection."
+ damage = 0 // It's a damn toy.
+ damage_type = OXY
+ nodamage = 1
+ icon = 'icons/obj/toyguns.dmi'
+ icon_state = "foamdart"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ range = 10
+
+/obj/item/projectile/bullet/reusable/foam_dart/riot
+ name = "riot foam dart"
+ icon_state = "foamdart_riot"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+ stamina = 25
diff --git a/icons/obj/toyguns.dmi b/icons/obj/toyguns.dmi
new file mode 100644
index 00000000000..fee7774cae5
Binary files /dev/null and b/icons/obj/toyguns.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 2b31b12a8c4..d8eeaf66327 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1766,11 +1766,13 @@
#include "code\modules\projectiles\guns\projectile\revolver.dm"
#include "code\modules\projectiles\guns\projectile\rocket.dm"
#include "code\modules\projectiles\guns\projectile\shotgun.dm"
+#include "code\modules\projectiles\guns\projectile\toy.dm"
#include "code\modules\projectiles\projectile\beams.dm"
#include "code\modules\projectiles\projectile\bullets.dm"
#include "code\modules\projectiles\projectile\energy.dm"
#include "code\modules\projectiles\projectile\force.dm"
#include "code\modules\projectiles\projectile\magic.dm"
+#include "code\modules\projectiles\projectile\reusable.dm"
#include "code\modules\projectiles\projectile\special.dm"
#include "code\modules\reagents\Chemistry-Colours.dm"
#include "code\modules\reagents\Chemistry-Holder.dm"