diff --git a/code/datums/components/crafting/recipes/weapons.dm b/code/datums/components/crafting/recipes/weapons.dm
index 6baa4b5e9bf..b8fe974e056 100644
--- a/code/datums/components/crafting/recipes/weapons.dm
+++ b/code/datums/components/crafting/recipes/weapons.dm
@@ -48,3 +48,11 @@
time = 40
category = CAT_WEAPONRY
subcategory = CAT_AMMO
+
+/datum/crafting_recipe/primitive_shield
+ name = "Primitive Shield"
+ result = /obj/item/weapon/shield/primitive
+ reqs = list(list(/obj/item/stack/material/wood = 2), list(/obj/item/weapon/reagent_containers/glass/bucket/wood =1), list(/obj/item/stack/material/cloth = 5))
+ time = 120
+ category = CAT_WEAPONRY
+ subcategory = CAT_WEAPON
diff --git a/code/datums/outfits/costumes/halloween.dm b/code/datums/outfits/costumes/halloween.dm
index 76b510807aa..35f4aa238d5 100644
--- a/code/datums/outfits/costumes/halloween.dm
+++ b/code/datums/outfits/costumes/halloween.dm
@@ -25,8 +25,8 @@
var/obj/item/weapon/storage/briefcase/new_briefcase = new(H)
for(var/obj/item/briefcase_item in new_briefcase)
qdel(briefcase_item)
- new_briefcase.contents += new /obj/item/toy/crossbow
- new_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/capgun
+ new_briefcase.contents += new /obj/item/weapon/gun/projectile/pistol/toy
+ new_briefcase.contents += new /obj/item/ammo_magazine/mfoam_dart/pistol
new_briefcase.contents += new /obj/item/clothing/mask/gas/clown_hat
H.equip_to_slot_or_del(new_briefcase, slot_l_hand)
@@ -102,7 +102,7 @@
suit = /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless
shoes = /obj/item/clothing/shoes/boots/jackboots
gloves = /obj/item/clothing/gloves/fingerless
- l_pocket = /obj/item/toy/crossbow
+ l_pocket = /obj/item/weapon/gun/projectile/revolver/toy/crossbow/halloween
r_pocket = /obj/item/device/flashlight/color/red
/decl/hierarchy/outfit/costume/pirate
@@ -119,4 +119,12 @@
shoes = /obj/item/clothing/shoes/white
suit = /obj/item/clothing/suit/storage/hooded/chaplain_hoodie/whiteout
gloves = /obj/item/clothing/gloves/white
- mask = /obj/item/clothing/mask/surgical
\ No newline at end of file
+ mask = /obj/item/clothing/mask/surgical
+
+/decl/hierarchy/outfit/costume/marine
+ name = OUTFIT_COSTUME("Ruin Marine")
+ uniform = /obj/item/clothing/under/color/grey
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/marine
+ suit = /obj/item/clothing/suit/marine
+ r_hand = /obj/item/weapon/gun/projectile/revolver/toy/sawnoff
\ No newline at end of file
diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm
index a3b6ad30d59..ba6a33d48cb 100644
--- a/code/datums/supplypacks/recreation.dm
+++ b/code/datums/supplypacks/recreation.dm
@@ -1,7 +1,7 @@
/*
-* Here is where any supply packs
-* related to recreation live.
-*/
+ * Here is where any supply packs
+ * related to recreation live.
+ */
/datum/supply_pack/recreation
@@ -23,6 +23,25 @@
containertype = /obj/structure/closet/crate/allico
containername = "foam weapon crate"
+/datum/supply_pack/recreation/donksoftweapons
+ name = "Donk-Soft Weapon Crate"
+ contains = list(
+ /obj/item/ammo_magazine/ammo_box/foam = 2,
+ /obj/item/weapon/gun/projectile/shotgun/pump/toy = 2,
+ /obj/item/weapon/gun/projectile/pistol/toy = 2,
+ /obj/item/ammo_magazine/mfoam_dart/pistol = 2
+ )
+ cost = 50
+ containertype = /obj/structure/closet/crate/allico
+ containername = "foam weapon crate"
+
+/datum/supply_pack/recreation/donksoftvend
+ name = "Donk-Soft Vendor Crate"
+ contains = list()
+ cost = 75
+ containertype = /obj/structure/largecrate/donksoftvendor
+ containername = "\improper Donk-Soft vendor crate"
+
/datum/supply_pack/recreation/lasertag
name = "Lasertag equipment"
contains = list(
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 9919fc3ee46..b4f85da77db 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -8,8 +8,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/storage/box/capguntoy = 2,
+ /obj/item/weapon/gun/projectile/revolver/toy/crossbow = 2,
/obj/item/clothing/suit/syndicatefake = 2,
/obj/item/weapon/storage/fancy/crayons = 2,
/obj/item/toy/spinningtoy = 2,
diff --git a/code/game/machinery/computer/arcade_vr.dm b/code/game/machinery/computer/arcade_vr.dm
index 210f31360f7..cc5bd8fe749 100644
--- a/code/game/machinery/computer/arcade_vr.dm
+++ b/code/game/machinery/computer/arcade_vr.dm
@@ -3,8 +3,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/storage/box/capguntoy = 2,
+ /obj/item/weapon/gun/projectile/revolver/toy/crossbow = 2,
/obj/item/clothing/suit/syndicatefake = 2,
/obj/item/weapon/storage/fancy/crayons = 2,
/obj/item/toy/spinningtoy = 2,
diff --git a/code/game/objects/items/toys/mech_toys.dm b/code/game/objects/items/toys/mech_toys.dm
index a8dd875f30b..3fdb9c66598 100644
--- a/code/game/objects/items/toys/mech_toys.dm
+++ b/code/game/objects/items/toys/mech_toys.dm
@@ -2,7 +2,7 @@
* Mech toys (previously labeled prizes, but that's unintuitive)
* Mech toy combat
*/
-
+
// Mech battle special attack types.
#define SPECIAL_ATTACK_HEAL 1
#define SPECIAL_ATTACK_DAMAGE 2
@@ -17,7 +17,7 @@
icon_state = "ripleytoy"
drop_sound = 'sound/mecha/mechstep.ogg'
reach = 2 // So you can battle across the table!
-
+
// Mech Battle Vars
var/timer = 0 // Timer when it'll be off cooldown
var/cooldown = 1.5 SECONDS // Cooldown between play sessions (and interactions)
@@ -34,7 +34,7 @@
var/special_attack_cooldown = 0 // Current cooldown of their special attack
var/wins = 0 // This mech's win count in combat
var/losses = 0 // ...And their loss count in combat
-
+
/obj/item/toy/mecha/Initialize()
. = ..()
desc = "Mini-Mecha action figure! Collect them all! Attack your friends or another mech with one to initiate epic mech combat! [desc]."
@@ -58,7 +58,7 @@
return 0 //not in range and not telekinetic
/**
- * this proc combines "sleep" while also checking for if the battle should continue
+ * this proc combines "sleep" while also checking for if the battle should continue
*
* this goes through some of the checks - the toys need to be next to each other to fight!
* if it's player vs themself: They need to be able to "control" both mechs (either must be adjacent or using TK).
@@ -112,7 +112,7 @@
// If all that is good, then we can sleep peacefully.
sleep(delay)
return TRUE
-
+
//all credit to skasi for toy mech fun ideas
/obj/item/toy/mecha/attack_self(mob/user)
if(timer < world.time)
@@ -130,15 +130,15 @@
attack_self(user)
/**
- * If you attack a mech with a mech, initiate combat between them
+ * If you attack a mech with a mech, initiate combat between them
*/
/obj/item/toy/mecha/attackby(obj/item/user_toy, mob/living/user)
- if(istype(user_toy, /obj/item/toy/mecha))
+ if(istype(user_toy, /obj/item/toy/mecha))
var/obj/item/toy/mecha/M = user_toy
if(check_battle_start(user, M))
mecha_brawl(M, user)
..()
-
+
/**
* Attack is called from the user's toy, aimed at target(another human), checking for target's toy.
*/
@@ -241,9 +241,9 @@
sleep(1 SECONDS)
//--THE BATTLE BEGINS--
- while(combat_health > 0 && attacker.combat_health > 0 && battle_length < MAX_BATTLE_LENGTH)
+ while(combat_health > 0 && attacker.combat_health > 0 && battle_length < MAX_BATTLE_LENGTH)
if(!combat_sleep(0.5 SECONDS, attacker, attacker_controller, opponent)) //combat_sleep checks everything we need to have checked for combat to continue
- break
+ break
//before we do anything - deal with charged attacks
if(special_attack_charged)
@@ -269,7 +269,7 @@
attacker.special_attack_charged = TRUE
attacker_controller.visible_message(" [attacker] begins charging its special attack!! ", \
" You begin charging [attacker]'s special attack! ")
- else //just attack
+ else //just attack
attacker.SpinAnimation(5, 0)
playsound(attacker, 'sound/mecha/mechstep.ogg', 30, TRUE)
combat_health--
@@ -322,7 +322,7 @@
special_attack_charged = TRUE
src_controller.visible_message(" [src] begins charging its special attack!! ", \
" You begin charging [src]'s special attack! ")
- else //just attack
+ else //just attack
SpinAnimation(5, 0)
playsound(src, 'sound/mecha/mechstep.ogg', 30, TRUE)
attacker.combat_health--
@@ -333,12 +333,12 @@
attacker.combat_health--
playsound(attacker, 'sound/effects/meteorimpact.ogg', 20, TRUE)
src_controller.visible_message(" ...and lands a CRIPPLING BLOW! ", \
- " ...and you land a CRIPPLING blow on [attacker]! ", null)
+ " ...and you land a CRIPPLING blow on [attacker]! ", null)
else
attacker_controller.visible_message(" [src] and [attacker] stand around awkwardly.", \
- " You don't know what to do next.")
+ " You don't know what to do next.")
- battle_length++
+ battle_length++
sleep(0.5 SECONDS)
/// Lines chosen for the winning mech
@@ -347,7 +347,7 @@
if(attacker.combat_health <= 0 && combat_health <= 0) //both lose
playsound(src, 'sound/machines/warning-buzzer.ogg', 20, TRUE)
attacker_controller.visible_message(" MUTUALLY ASSURED DESTRUCTION!! [src] and [attacker] both end up destroyed!", \
- " Both [src] and [attacker] are destroyed!")
+ " Both [src] and [attacker] are destroyed!")
else if(attacker.combat_health <= 0) //src wins
wins++
attacker.losses++
@@ -359,7 +359,7 @@
" You raise up [src] victoriously over [attacker]!")
else if (combat_health <= 0) //attacker wins
attacker.wins++
- losses++
+ losses++
playsound(src, 'sound/effects/light_flicker.ogg', 20, TRUE)
src_controller.visible_message(" [src] collapses!", \
" [src] collapses!", null)
@@ -374,7 +374,7 @@
in_combat = FALSE
attacker.in_combat = FALSE
- combat_health = max_combat_health
+ combat_health = max_combat_health
attacker.combat_health = attacker.max_combat_health
return
@@ -382,49 +382,49 @@
/**
* This proc checks if a battle can be initiated between src and attacker.
*
- * Both SRC and attacker (if attacker is included) timers are checked if they're on cooldown, and
+ * Both SRC and attacker (if attacker is included) timers are checked if they're on cooldown, and
* both SRC and attacker (if attacker is included) are checked if they are in combat already.
* If any of the above are true, the proc returns FALSE and sends a message to user (and target, if included) otherwise, it returns TRUE
* Arguments:
* * user: the user who is initiating the battle
- * * attacker: optional arg for checking two mechs at once
+ * * attacker: optional arg for checking two mechs at once
* * target: optional arg used in Mech PvP battles (if used, attacker is target's toy)
*/
-/obj/item/toy/mecha/proc/check_battle_start(mob/living/carbon/user, obj/item/toy/mecha/attacker, mob/living/carbon/target)
- var/datum/gender/T
+/obj/item/toy/mecha/proc/check_battle_start(mob/living/carbon/user, obj/item/toy/mecha/attacker, mob/living/carbon/target)
+ var/datum/gender/T
if(target)
T = gender_datums[target.get_visible_gender()] // Doing this because Polaris Code has shitty gender datums and it's clunkier than FUCK.
if(attacker && attacker.in_combat)
to_chat(user, "[target ? T.His : "Your" ] [attacker.name] is in combat.")
- if(target)
+ if(target)
to_chat(target, "Your [attacker.name] is in combat.")
- return FALSE
+ return FALSE
if(in_combat)
to_chat(user, "Your [name] is in combat.")
- if(target)
+ if(target)
to_chat(target, "[T.His] [name] is in combat.")
- return FALSE
+ return FALSE
if(attacker && attacker.timer > world.time)
to_chat(user, "[target?T.His : "Your" ] [attacker.name] isn't ready for battle.")
- if(target)
+ if(target)
to_chat(target, "Your [attacker.name] isn't ready for battle.")
- return FALSE
+ return FALSE
if(timer > world.time)
to_chat(user, "Your [name] isn't ready for battle.")
- if(target)
+ if(target)
to_chat(target, "[T.His] [name] isn't ready for battle.")
- return FALSE
+ return FALSE
return TRUE
/**
- * Processes any special attack moves that happen in the battle (called in the mechaBattle proc).
+ * Processes any special attack moves that happen in the battle (called in the mechaBattle proc).
*
* Makes the toy shout their special attack cry and updates its cooldown. Then, does the special attack.
* Arguments:
* * victim - the toy being hit by the special move
*/
-/obj/item/toy/mecha/proc/special_attack_move(obj/item/toy/mecha/victim)
+/obj/item/toy/mecha/proc/special_attack_move(obj/item/toy/mecha/victim)
visible_message(special_attack_cry + "!!")
special_attack_charged = FALSE
@@ -447,15 +447,15 @@
visible_message("I FORGOT MY SPECIAL ATTACK...")
/**
- * Base proc for 'other' special attack moves.
+ * Base proc for 'other' special attack moves.
*
- * This one is only for inheritance, each mech with an 'other' type move has their procs below.
+ * This one is only for inheritance, each mech with an 'other' type move has their procs below.
* Arguments:
* * victim - the toy being hit by the super special move (doesn't necessarily need to be used)
*/
-/obj/item/toy/mecha/proc/super_special_attack(obj/item/toy/mecha/victim)
+/obj/item/toy/mecha/proc/super_special_attack(obj/item/toy/mecha/victim)
visible_message(" [src] does a cool flip.")
-
+
/obj/random/mech_toy
name = "Random Mech Toy"
desc = "This is a random mech toy."
@@ -488,8 +488,8 @@
special_attack_type = SPECIAL_ATTACK_OTHER
special_attack_type_message = "instantly destroys the opposing mech if its health is less than this mech's health."
special_attack_cry = "KILLER CLAMP"
-
-/obj/item/toy/mecha/deathripley/super_special_attack(obj/item/toy/mecha/victim)
+
+/obj/item/toy/mecha/deathripley/super_special_attack(obj/item/toy/mecha/victim)
playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 20, TRUE)
if(victim.combat_health < combat_health) // Instantly kills the other mech if it's health is below our's.
visible_message("EXECUTE!!")
@@ -522,7 +522,7 @@
special_attack_type_message = "puts the opposing mech's special move on cooldown and heals this mech."
special_attack_cry = "MEGA HORN"
-/obj/item/toy/mecha/honk/super_special_attack(obj/item/toy/mecha/victim)
+/obj/item/toy/mecha/honk/super_special_attack(obj/item/toy/mecha/victim)
playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 20, TRUE)
victim.special_attack_cooldown += 3 // Adds cooldown to the other mech and gives a minor self heal
combat_health++
@@ -577,7 +577,7 @@
special_attack_type_message = "has a lower cooldown than normal special moves, increases the opponent's cooldown, and deals damage."
special_attack_cry = "*wave"
-/obj/item/toy/mecha/reticence/super_special_attack(obj/item/toy/mecha/victim)
+/obj/item/toy/mecha/reticence/super_special_attack(obj/item/toy/mecha/victim)
special_attack_cooldown-- //Has a lower cooldown...
victim.special_attack_cooldown++ //and increases the opponent's cooldown by 1...
victim.combat_health-- //and some free damage.
diff --git a/code/game/objects/items/toys/toys.dm b/code/game/objects/items/toys/toys.dm
index dc5a811a0e6..0b1343d63e6 100644
--- a/code/game/objects/items/toys/toys.dm
+++ b/code/game/objects/items/toys/toys.dm
@@ -3,8 +3,6 @@
* Balloons
* Fake telebeacon
* Fake singularity
- * Toy gun
- * Toy crossbow
* Toy swords
* Toy bosun's whistle
* Snap pops
@@ -145,127 +143,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_icons = list(
- icon_l_hand = 'icons/mob/items/lefthand_guns.dmi',
- icon_r_hand = 'icons/mob/items/righthand_guns.dmi',
- )
- slot_flags = SLOT_HOLSTER
- w_class = ITEMSIZE_SMALL
- attack_verb = list("attacked", "struck", "hit")
- var/bullets = 5
- drop_sound = 'sound/items/drop/gun.ogg'
-
-/obj/item/toy/crossbow/examine(mob/user)
- . = ..()
- if(bullets && get_dist(user, src) <= 2)
- . += "It is loaded with [bullets] foam darts!"
-
-/obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob)
- 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(src, '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
- for(var/mob/O in viewers(world.view, D))
- O.show_message(text("\The [] was hit by the foam dart!", M), 1)
- 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)
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\The [] realized they were out of ammo and starting scrounging for some!", user), 1)
-
-
-/obj/item/toy/crossbow/attack(mob/M as mob, mob/user as mob)
- src.add_fingerprint(user)
-
-// ******* Check
-
- if (src.bullets > 0 && M.lying)
-
- for(var/mob/O in viewers(M, null))
- if(O.client)
- O.show_message(text("\The [] casually lines up a shot with []'s head and pulls the trigger!", user, M), 1, "You hear the sound of foam against skull", 2)
- O.show_message(text("\The [] was hit in the head by the foam dart!", M), 1)
-
- playsound(src, 'sound/items/syringeproj.ogg', 50, 1)
- new /obj/item/toy/ammo/crossbow(M.loc)
- src.bullets--
- else if (M.lying && src.bullets == 0)
- for(var/mob/O in viewers(M, null))
- if (O.client) O.show_message(text("\The [] casually lines up a shot with []'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", user, M), 1, "You hear someone fall", 2)
- user.Weaken(5)
- return
-
-/obj/item/toy/ammo/crossbow
- name = "foam dart"
- desc = "It's nerf or nothing! Ages 8 and up."
- icon = 'icons/obj/toy.dmi'
- icon_state = "foamdart"
- w_class = ITEMSIZE_TINY
- slot_flags = SLOT_EARS
- drop_sound = 'sound/items/drop/food.ogg'
-
-/obj/effect/foam_dart_dummy
- name = ""
- desc = ""
- icon = 'icons/obj/toy.dmi'
- icon_state = "null"
- anchored = TRUE
- density = FALSE
-
/*
* Toy swords
*/
@@ -394,7 +271,6 @@
/*
* Bosun's whistle
*/
-
/obj/item/toy/bosunwhistle
name = "bosun's whistle"
desc = "A genuine Admiral Krush Bosun's Whistle, for the aspiring ship's captain! Suitable for ages 8 and up, do not swallow."
@@ -1526,7 +1402,7 @@
name = "black king"
desc = "A black king chess piece."
description_info = "The King can move exactly one square horizontally, vertically, or diagonally. If your opponent captures this piece, you lose."
- icon_state = "black_king"
+ icon_state = "black_king"
/// Balloon structures
diff --git a/code/game/objects/items/toys/toys_vr.dm b/code/game/objects/items/toys/toys_vr.dm
index 21f2f1cc071..a13046dc63c 100644
--- a/code/game/objects/items/toys/toys_vr.dm
+++ b/code/game/objects/items/toys/toys_vr.dm
@@ -1,9 +1,42 @@
+/* Virgo Toys!
+ * Contains:
+ * Mistletoe
+ * Plushies
+ * Pet rocks
+ * Chew toys
+ * Cat toys
+ * Fake flash
+ * Big red button
+ * Garden gnome
+ * Toy AI
+ * Hand buzzer
+ * Toy cuffs
+ * Toy nuke
+ * Toy gibber
+ * Toy xeno
+ * Russian revolver
+ * Trick revolver
+ * Toy chainsaw
+ * Random miniature spawner
+ * Snake popper
+ * Professor Who universal ID
+ * Professor Who sonic driver
+ * Action figures
+ */
+
+
+/*
+ * Mistletoe
+ */
/obj/item/toy/mistletoe
name = "mistletoe"
desc = "You are supposed to kiss someone under these"
icon = 'icons/obj/toy_vr.dmi'
icon_state = "mistletoe"
+/*
+ * Plushies
+ */
// HEY FUTURE PLUSHIE CODERS: IF YOU'RE ADDING A SNOWFLAKE PLUSH ITEM USE PATH /obj/item/toy/plushie/fluff
// the loadout entry shouldn't be able to grab those if everything goes right
/obj/item/toy/plushie/lizardplushie
@@ -103,38 +136,6 @@
/obj/item/toy/plushie/vox/proc/cooldownreset()
cooldown = 0
-/*
-* 4/9/21 *
-* IPC Plush
-* Toaster plush
-* Snake plush
-* Cube plush
-* Pip plush
-* Moth plush
-* Crab plush
-* Possum plush
-* Goose plush
-* White mouse plush
-* Pet rock
-* Pet rock (m)
-* Pet rock (f)
-* Chew toys
-* Cat toy * 2
-* Toy flash
-* Toy button
-* Gnome
-* Toy AI
-* Buzzer ring
-* Fake handcuffs
-* Nuke toy
-* Toy gibber
-* Toy xeno
-* Fake gun * 2
-* Toy chainsaw
-* Random tabletop miniature spawner
-* snake popper
-*/
-
/obj/item/toy/plushie/ipc
name = "IPC plushie"
desc = "A pleasing soft-toy of a monitor-headed robot. Toaster functionality included."
@@ -174,7 +175,6 @@
else
return ..()
-
/obj/item/toy/plushie/ipc/attack_self(mob/user as mob)
if(!cooldown)
playsound(user, 'sound/machines/ping.ogg', 10, 0)
@@ -276,7 +276,9 @@
/obj/item/toy/plushie/goose
name = "goose plushie"
- desc = "An adorable likeness of a terrifying beast. It's simple existance chills you to the bone and compells you to hide any loose objects it might steal."
+ desc = "An adorable likeness of a terrifying beast. \
+ It's simple existance chills you to the bone and \
+ compells you to hide any loose objects it might steal."
icon = 'icons/obj/toy_vr.dmi'
icon_state = "goose"
attack_verb = list("honked")
@@ -286,9 +288,54 @@
icon_state = "mouse"
icon = 'icons/obj/toy_vr.dmi'
+/obj/item/toy/plushie/susred
+ name = "red spaceman plushie"
+ desc = "A suspicious looking red spaceman plushie. Why does it smell like the vents?"
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "sus_red"
+ attack_verb = list("stabbed", "slashed")
+
+/obj/item/toy/plushie/ipc/toaster/attack_self(mob/user as mob)
+ if(!cooldown)
+ playsound(user, 'sound/weapons/slice.ogg', 10, 0)
+ src.visible_message("Stab!")
+ cooldown = 1
+ addtimer(CALLBACK(src, .proc/cooldownreset), 50)
+ return ..()
+
+/obj/item/toy/plushie/susblue
+ name = "blue spaceman plushie"
+ desc = "A dapper looking blue spaceman plushie. Looks very intuitive."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "sus_blue"
+
+/obj/item/toy/plushie/suswhite
+ name = "white spaceman plushie"
+ desc = "A whiny looking white spaceman plushie. Looks like it could cry at any moment."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "sus_white"
+
+/obj/item/toy/plushie/bigcat
+ name = "big cat plushie"
+ desc = "A big, fluffy looking cat that just looks very huggable."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "big_cat"
+
+/obj/item/toy/plushie/basset
+ name = "basset plushie"
+ desc = "A sleepy looking basset hound plushie."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "basset"
+
+/*
+ * Pet rocks
+ */
/obj/item/toy/rock
name = "pet rock"
- desc = "A stuffed version of the classic pet. The soft ones were made after kids kept throwing them at each other. It has a small piece of soft plastic that you can draw on if you wanted."
+ desc = "A stuffed version of the classic pet. \
+ The soft ones were made after kids kept throwing \
+ them at each other. It has a small piece of soft \
+ plastic that you can draw on if you wanted."
icon = 'icons/obj/toy_vr.dmi'
icon_state = "rock"
attack_verb = list("grug'd", "unga'd")
@@ -309,6 +356,9 @@
to_chat(user, "You draw a face on the rock and pull aside the plastic slightly, revealing a small pink bow.")
return
+/*
+ * Chew toys
+ */
/obj/item/toy/chewtoy
name = "chew toy"
desc = "A red hard-rubber chew toy shaped like a bone. Perfect for your dog! You wouldn't want to chew on it, right?"
@@ -332,6 +382,9 @@
playsound(loc, 'sound/items/drop/plushie.ogg', 50, 1)
user.visible_message("\The [user] gnaws on [src]!","You gnaw on [src]!")
+/*
+ * Cat toys
+ */
/obj/item/toy/cat_toy
name = "toy mouse"
desc = "A colorful toy mouse!"
@@ -351,6 +404,9 @@
slot_r_hand_str = 'icons/mob/items/righthand_material.dmi',
)
+/*
+ * Fake flash
+ */
/obj/item/toy/flash
name = "toy flash"
desc = "FOR THE REVOLU- Oh wait, that's just a toy."
@@ -376,6 +432,9 @@
/obj/item/toy/flash/proc/cooldownreset()
cooldown = 0
+/*
+ * Big red button
+ */
/obj/item/toy/redbutton
name = "big red button"
desc = "A big, plastic red button. Reads 'From HonkCo Pranks?' on the back."
@@ -396,12 +455,18 @@
else
to_chat(user, "Nothing happens.")
+/*
+ * Garden gnome
+ */
/obj/item/toy/gnome
name = "garden gnome"
desc = "It's a gnome, not a gnelf. Made of weak ceramic."
icon = 'icons/obj/toy_vr.dmi'
icon_state = "gnome"
+/*
+ * Toy AI
+ */
/obj/item/toy/AI
name = "toy AI"
desc = "A little toy model AI core with real law announcing action!"
@@ -436,6 +501,9 @@
/obj/item/toy/AI/proc/cooldownreset()
cooldown = 0
+/*
+ * Hand buzzer
+ */
/obj/item/clothing/gloves/ring/buzzer/toy
name = "steel ring"
desc = "Torus shaped finger decoration. It has a small piece of metal on the palm-side."
@@ -462,6 +530,9 @@
return 0
+/*
+ * Toy cuffs
+ */
/obj/item/weapon/handcuffs/fake
name = "plastic handcuffs"
desc = "Use this to keep plastic prisoners in line."
@@ -486,6 +557,9 @@
foldable = null
can_hold = list(/obj/item/weapon/handcuffs/fake, /obj/item/weapon/handcuffs/legcuffs/fake)
+/*
+ * Toy nuke
+ */
/obj/item/toy/nuke
name = "\improper Nuclear Fission Explosive toy"
desc = "A plastic model of a Nuclear Fission Explosive."
@@ -512,6 +586,9 @@
if(istype(I, /obj/item/weapon/disk/nuclear))
to_chat(user, "Nice try. Put that disk back where it belongs.")
+/*
+ * Toy gibber
+ */
/obj/item/toy/minigibber
name = "miniature gibber"
desc = "A miniature recreation of NanoTrasen's famous meat grinder. Equipped with a special interlock that prevents insertion of organic material."
@@ -549,6 +626,9 @@
else ..()
+/*
+ * Toy xeno
+ */
/obj/item/toy/toy_xeno
icon = 'icons/obj/toy_vr.dmi'
icon_state = "xeno"
@@ -573,6 +653,9 @@
to_chat(user, "The string on [src] hasn't rewound all the way!")
return
+/*
+ * Russian revolver
+ */
/obj/item/toy/russian_revolver
name = "russian revolver"
desc = "For fun and games!"
@@ -643,6 +726,9 @@
to_chat(user, "[src] needs to be reloaded.")
return FALSE
+/*
+ * Trick revolver
+ */
/obj/item/toy/russian_revolver/trick_revolver
name = "\improper .357 revolver"
desc = "A suspicious revolver. Uses .357 ammo."
@@ -670,6 +756,9 @@
sleep(5)
icon_state = "[initial(icon_state)]"
+/*
+ * Toy chainsaw
+ */
/obj/item/toy/chainsaw
name = "Toy Chainsaw"
desc = "A toy chainsaw with a rubber edge. Ages 8 and up"
@@ -692,6 +781,9 @@
/obj/item/toy/chainsaw/proc/cooldownreset()
cooldown = 0
+/*
+ * Random miniature spawner
+ */
/obj/random/miniature
name = "Random miniature"
desc = "This is a random miniature."
@@ -701,6 +793,9 @@
/obj/random/miniature/item_to_spawn()
return pick(typesof(/obj/item/toy/character))
+/*
+ * Snake popper
+ */
/obj/item/toy/snake_popper
name = "bread tube"
desc = "Bread in a tube. Chewy...and surprisingly tasty."
@@ -777,3 +872,93 @@
real = 2
to_chat(user, "You short out the bluespace refill system of [src].")
+/*
+ * Professor Who universal ID
+ */
+/obj/item/clothing/under/universalid
+ name = "identification card"
+ desc = "A novelty identification card based on Professor Who's Universal ID."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "universal_id"
+ w_class = ITEMSIZE_TINY
+ slot_flags = SLOT_ID | SLOT_EARS
+ body_parts_covered = 0
+ equip_sound = null
+
+ sprite_sheets = null
+
+ item_state = "golem" //This is dumb and hacky but was here when I got here.
+ worn_state = "golem" //It's basically just a coincidentally black iconstate in the file.
+
+/*
+ * Professor Who sonic driver
+ */
+/obj/item/weapon/tool/screwdriver/sdriver
+ name = "sonic driver"
+ desc = "A novelty screwdriver that uses tiny magnets to manipulate screws."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "sonic_driver"
+ item_state = "screwdriver_black"
+ usesound = 'sound/items/sonic_driver.ogg'
+ toolspeed = 1
+ random_color = FALSE
+
+/*
+ * Professor Who time capsule
+ */
+/obj/item/weapon/storage/box/timecap
+ name = "action time capsule"
+ desc = "A toy recreation of the Time Capsule from Professor Who. Can hold up to two action figures."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "time_cap"
+ can_hold = list(/obj/item/toy/figure)
+ max_w_class = ITEMSIZE_TINY
+ max_storage_space = ITEMSIZE_COST_TINY * 2
+ use_sound = 'sound/machines/click.ogg'
+ drop_sound = 'sound/items/drop/accessory.ogg'
+ pickup_sound = 'sound/items/pickup/accessory.ogg'
+
+/*
+ * Action figures
+ */
+/obj/item/toy/figure/ranger
+ name = "Space Ranger action figure"
+ desc = "A \"Space Life\" brand Space Ranger action figure."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "ranger"
+ toysay = "To the Fontier and beyond!"
+
+/obj/item/toy/figure/leadbandit
+ name = "Bandit Leader action figure"
+ desc = "A \"Space Life\" brand Bandit Leader action figure."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "bandit_lead"
+ toysay = "Give us yer bluespace crystals!"
+
+/obj/item/toy/figure/bandit
+ name = "Bandit action figure"
+ desc = "A \"Space Life\" brand Bandit action figure."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "bandit"
+ toysay = "Stick em' up!"
+
+/obj/item/toy/figure/abe
+ name = "Action Abe action figure"
+ desc = "A \"Space Life\" brand Action Abe action figure."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "action_abe"
+ toysay = "Four score and seven decades ago..."
+
+/obj/item/toy/figure/profwho
+ name = "Professor Who action figure"
+ desc = "A \"Space Life\" brand Professor Who action figure."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "prof_who"
+ toysay = "Smells like... bad wolf..."
+
+/obj/item/toy/figure/prisoner
+ name = "prisoner action figure"
+ desc = "A \"Space Life\" brand prisoner action figure."
+ icon = 'icons/obj/toy_vr.dmi'
+ icon_state = "prisoner"
+ toysay = "I did not hit her! I did not!"
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index 285fba5bfda..d7fcb01fce9 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -85,8 +85,8 @@
/obj/item/weapon/beach_ball/holoball,
/obj/item/toy/balloon,
/obj/item/toy/blink,
- /obj/item/toy/crossbow,
- /obj/item/weapon/gun/projectile/revolver/capgun,
+ /obj/item/weapon/gun/projectile/revolver/toy/crossbow,
+ /obj/item/weapon/storage/box/capguntoy,
/obj/item/toy/katana,
/obj/item/toy/mecha/deathripley,
/obj/item/toy/mecha/durand,
diff --git a/code/game/objects/items/weapons/shields_vr.dm b/code/game/objects/items/weapons/shields_vr.dm
index 514ecd15c92..a311a740891 100644
--- a/code/game/objects/items/weapons/shields_vr.dm
+++ b/code/game/objects/items/weapons/shields_vr.dm
@@ -92,3 +92,11 @@
icon_state = "explorer_shield_P_lighted"
else
icon_state = "explorer_shield_P"
+
+/obj/item/weapon/shield/primitive
+ name = "primitive shield"
+ desc = "A defensive object that is little more than planks strapped your arm"
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "buckler"
+ w_class = ITEMSIZE_LARGE
+ base_block_chance = 30
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 9e82b6f434b..96d03266544 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -123,11 +123,11 @@
)
/obj/item/weapon/storage/belt/utility/holding
- name = "tool-belt of holding"
+ name = "tool-belt of holding"
desc = "A belt that uses localized bluespace pockets to hold more items than expected!"
icon_state = "utility_holding"
storage_slots = 14 //twice the amount as a normal belt
- max_storage_space = ITEMSIZE_COST_NORMAL * 14
+ max_storage_space = ITEMSIZE_COST_NORMAL * 14
can_hold = list(
/obj/item/weapon/tool/crowbar,
/obj/item/weapon/tool/screwdriver,
@@ -164,7 +164,7 @@
/obj/item/stack/material/steel,
/obj/item/stack/material/glass,
/obj/item/device/lightreplacer,
- /obj/item/weapon/pickaxe/plasmacutter
+ /obj/item/weapon/pickaxe/plasmacutter
)
@@ -207,11 +207,11 @@
icon_state = "ems"
/obj/item/weapon/storage/belt/medical/holding
- name = "medical belt of holding"
+ name = "medical belt of holding"
desc = "A belt that uses localized bluespace pockets to hold more items than expected!"
icon_state = "med_holding"
storage_slots = 14 //twice the amount as a normal belt
- max_storage_space = ITEMSIZE_COST_NORMAL * 14
+ max_storage_space = ITEMSIZE_COST_NORMAL * 14
/obj/item/weapon/storage/belt/security
name = "security belt"
@@ -530,3 +530,12 @@
desc = "The fancy utility-belt holding the tools, cuffs and gadgets of the Go Go ERT-Rangers. The belt buckle is not real phoron, but it is still surprisingly comfortable to wear."
icon = 'icons/obj/clothing/ranger.dmi'
icon_state = "ranger_belt"
+
+/obj/item/weapon/storage/belt/dbandolier
+ name = "\improper Donk-Soft bandolier"
+ desc = "A Donk-Soft bandolier! Carry your spare darts anywhere! Ages 8 and up."
+ icon_state = "dbandolier"
+ storage_slots = 8
+ can_hold = list(
+ /obj/item/ammo_casing/afoam_dart
+ )
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 2f293ddde9b..4eac505ebf0 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -568,3 +568,17 @@
name = "ambrosia deus seeds box"
desc = "Contains the seeds you need to get a proper healthy high."
starts_with = list(/obj/item/seeds/ambrosiadeusseed = 7)
+
+/obj/item/weapon/storage/box/capguntoy
+ name = "\improper AlliCo \"Zipper\" Cap Gun"
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "cap_gun_box"
+ desc = "This box is shaped on the inside so that only the \"Zipper\" Capgun and extra caps can fit."
+ item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit")
+ storage_slots = 2
+ max_w_class = ITEMSIZE_NORMAL
+ can_hold = list(/obj/item/weapon/gun/projectile/revolver/capgun, /obj/item/ammo_magazine/ammo_box/cap)
+ starts_with = list(
+ /obj/item/weapon/gun/projectile/revolver/capgun = 1,
+ /obj/item/ammo_magazine/ammo_box/cap = 1
+ )
diff --git a/code/game/objects/random/gradient.dm b/code/game/objects/random/gradient.dm
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index ef1584fb573..ac7d0457046 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -734,7 +734,7 @@
/obj/item/toy/snappop,
/obj/item/toy/sword,
/obj/item/toy/balloon,
- /obj/item/toy/crossbow,
+ /obj/item/weapon/gun/projectile/revolver/toy/crossbow,
/obj/item/toy/blink,
/obj/item/weapon/reagent_containers/spray/waterflower,
/obj/item/toy/eight_ball,
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index 2a626c52c9d..6b338895e30 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -32,7 +32,7 @@
if(AM.simulated)
AM.forceMove(T)
//VOREStation Add Start
- if(isanimal(AM))
+ if(isanimal(AM))
var/mob/living/simple_mob/AMBLINAL = AM
if(!AMBLINAL.mind)
AMBLINAL.ghostjoin = 1
@@ -65,6 +65,11 @@
ME.attach(H)
..()
+/obj/structure/largecrate/donksoftvendor
+ name = "\improper Donk-Soft vendor crate"
+ desc = "A hefty wooden crate displaying the logo of Donk-Soft. It's rather heavy."
+ starts_with = list(/obj/machinery/vending/donksoft)
+
/obj/structure/largecrate/vehicle
name = "vehicle crate"
desc = "Wulf Aeronautics says it comes in a box for the consumer's sake... How is this so light?"
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 0351e16fcaf..d299396f79d 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -529,4 +529,27 @@
/obj/item/clothing/head/wheat
name = "straw hat"
desc = "It's a hat made from synthetic straw. Brought to you by \"Country Girls LLC.\" the choice brand for the galaxy's working class."
- icon_state = "wheat"
\ No newline at end of file
+ icon_state = "wheat"
+
+//Ruin Marine (Doom Marine)
+/obj/item/clothing/head/marine
+ name = "marine helmet"
+ desc = "A marine helmet prop from the popular game 'Ruin'."
+ icon_state = "marine"
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR
+ body_parts_covered = HEAD|FACE|EYES
+
+//Laser Tag Helmets
+/obj/item/clothing/head/bluetag
+ name = "blue laser tag helmet"
+ desc = "Blue Pride, Station Wide."
+ icon_state = "bluetag"
+ flags_inv = HIDEEARS|BLOCKHEADHAIR
+ body_parts_covered = HEAD|EYES
+
+/obj/item/clothing/head/redtag
+ name = "red laser tag helmet"
+ desc = "Reputed to go faster."
+ icon_state = "redtag"
+ flags_inv = HIDEEARS|BLOCKHEADHAIR
+ body_parts_covered = HEAD|EYES
\ No newline at end of file
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 3d44c893fe1..61825a6e5dd 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -13,7 +13,7 @@
*/
/obj/item/clothing/suit/bluetag
- name = "blue laser tag armour"
+ name = "blue laser tag armor"
desc = "Blue Pride, Station Wide."
icon_state = "bluetag"
item_state_slots = list(slot_r_hand_str = "tdblue", slot_l_hand_str = "tdblue")
@@ -22,8 +22,13 @@
allowed = list (/obj/item/weapon/gun/energy/lasertag/blue)
siemens_coefficient = 3.0
+/obj/item/clothing/suit/bluetag/sub
+ name = "Brigader Armor"
+ desc = "Repilca rmor commonly worn by Spacer Union Brigade members from the hit series Spacer Trail. Modified for Laser Tag (Blue Team)."
+ icon_state = "bluetag2"
+
/obj/item/clothing/suit/redtag
- name = "red laser tag armour"
+ name = "red laser tag armor"
desc = "Reputed to go faster."
icon_state = "redtag"
item_state_slots = list(slot_r_hand_str = "tdred", slot_l_hand_str = "tdred")
@@ -32,6 +37,11 @@
allowed = list (/obj/item/weapon/gun/energy/lasertag/red)
siemens_coefficient = 3.0
+/obj/item/clothing/suit/redtag/dom
+ name = "Mu'tu'bi Armor"
+ desc = "Repilca rmor commonly worn by Dominion Of Mu'tu'bi soldiers from the hit series Spacer Trail. Modified for Laser Tag (Red Team)."
+ icon_state = "redtag2"
+
/*
* Costume
*/
@@ -984,4 +994,13 @@
src.icon_state = "caution"
src.item_state = "caution"
usr.show_message("You turn the wet floor sign off.")
- update_clothing_icon()
\ No newline at end of file
+ update_clothing_icon()
+
+//Ruin Marine (Doom Marine)
+/obj/item/clothing/suit/marine
+ name = "marine armor"
+ desc = "A set of marine prop armor from the popular game 'Ruin'."
+ icon_state = "marine"
+ body_parts_covered = FEET|LOWER_TORSO|UPPER_TORSO|LEGS
+ flags_inv = HIDESHOES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
+ item_state_slots = list(slot_r_hand_str = "green_labcoat", slot_l_hand_str = "green_labcoat")
\ No newline at end of file
diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm
index 9d61eed47e7..dc0939fdf61 100644
--- a/code/modules/economy/vending_machines.dm
+++ b/code/modules/economy/vending_machines.dm
@@ -1132,6 +1132,46 @@
idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan.
vending_sound = "machines/vending/vending_cans.ogg"
+///////////////////////Donk-Soft!///////////////////////////////////////
+
+/obj/machinery/vending/donksoft
+ name = "Donk-Soft!"
+ desc = "A toy vendor owned by Donk-Soft, a NanoTrasen sub-company."
+ description_fluff = "Donk-Soft is a sub-company owned by NanoTrasen that distribute replica weapons that shoot squishy foam darts. \
+ They've been a staple of personal entertainment for decades but their buisness has only just moved to the fringes of the galaxy."
+ icon_state = "donksoft"
+ product_slogans = "Get your cool toys today!;Quality toy weapons for cheap prices!"
+ product_ads = "Express your inner child today!;Who needs responsibilities when you have toy weapons?;Make your next murder FUN!"
+ products = list(/obj/item/ammo_magazine/ammo_box/foam = 20,
+ /obj/item/weapon/storage/belt/dbandolier = 5,
+ /obj/item/ammo_magazine/mfoam_dart/pistol = 10,
+ /obj/item/ammo_magazine/mfoam_dart/smg = 10,
+ /obj/item/weapon/gun/projectile/shotgun/pump/toy = 5,
+ /obj/item/weapon/gun/projectile/revolver/toy/sawnoff = 5,
+ /obj/item/weapon/gun/projectile/pistol/toy = 5,
+ /obj/item/weapon/gun/projectile/pistol/toy/n99 = 5,
+ /obj/item/weapon/gun/projectile/shotgun/pump/toy/levergun = 5,
+ /obj/item/weapon/gun/projectile/revolver/toy = 5,
+ /obj/item/weapon/gun/projectile/revolver/toy/big_iron = 5,
+ /obj/item/weapon/gun/projectile/revolver/toy/crossbow = 5,
+ /obj/item/weapon/gun/projectile/automatic/toy = 5
+ )
+ contraband = list()
+ prices = list(/obj/item/ammo_magazine/ammo_box/foam = 50,
+ /obj/item/weapon/storage/belt/dbandolier = 100,
+ /obj/item/ammo_magazine/mfoam_dart/pistol = 25,
+ /obj/item/ammo_magazine/mfoam_dart/smg = 25,
+ /obj/item/weapon/gun/projectile/shotgun/pump/toy = 250,
+ /obj/item/weapon/gun/projectile/revolver/toy/sawnoff = 150,
+ /obj/item/weapon/gun/projectile/pistol/toy = 100,
+ /obj/item/weapon/gun/projectile/pistol/toy/n99 = 175,
+ /obj/item/weapon/gun/projectile/shotgun/pump/toy/levergun = 250,
+ /obj/item/weapon/gun/projectile/revolver/toy = 100,
+ /obj/item/weapon/gun/projectile/revolver/toy/big_iron = 175,
+ /obj/item/weapon/gun/projectile/revolver/toy/crossbow = 75,
+ /obj/item/weapon/gun/projectile/automatic/toy = 300)
+ vending_sound = "machines/vending/vending_cans.ogg"
+
/*
* Department/job vendors to sit in place of lockers taking up space
*/
diff --git a/code/modules/games/cah_black_cards.dm b/code/modules/games/cah_black_cards.dm
index 0bc5cc6d0f8..c2c32b99482 100644
--- a/code/modules/games/cah_black_cards.dm
+++ b/code/modules/games/cah_black_cards.dm
@@ -1,4 +1,6 @@
-// Black cards.
+/*
+ * Black CAH cards
+ */
/obj/item/weapon/deck/cah/black/card_text_list = list(
"Why am I itchy?",
"Today, Security shot ____.",
diff --git a/code/modules/games/cah_white_cards.dm b/code/modules/games/cah_white_cards.dm
index 5c8e592b7ec..3ab0df883a9 100644
--- a/code/modules/games/cah_white_cards.dm
+++ b/code/modules/games/cah_white_cards.dm
@@ -1,4 +1,6 @@
-// White cards.
+/*
+ * White CAH cards
+ */
/obj/item/weapon/deck/cah/var/list/card_text_list = list(
"Those motherfucking carp",
"Having sex in the maintenance tunnels",
diff --git a/code/modules/games/cardemon.dm b/code/modules/games/cardemon.dm
index a99e656add0..0345cf0d189 100644
--- a/code/modules/games/cardemon.dm
+++ b/code/modules/games/cardemon.dm
@@ -1,3 +1,6 @@
+/*
+ * Cardmon trading card game
+ */
/obj/item/weapon/pack/cardemon
name = "cardemon booster pack"
desc = "Finally! A children's card game in space!"
diff --git a/code/modules/games/spaceball_cards.dm b/code/modules/games/spaceball_cards.dm
index d9c932908cc..48c54077596 100644
--- a/code/modules/games/spaceball_cards.dm
+++ b/code/modules/games/spaceball_cards.dm
@@ -1,3 +1,6 @@
+/*
+ * Spaceball collectable cards
+ */
/obj/item/weapon/pack/spaceball
name = "spaceball booster pack"
desc = "Officially licensed to take your money."
diff --git a/code/modules/games/tarot.dm b/code/modules/games/tarot.dm
index 7c49f7ec435..df5fb73b23c 100644
--- a/code/modules/games/tarot.dm
+++ b/code/modules/games/tarot.dm
@@ -1,6 +1,6 @@
-/* this is a playing card deck based off of the Rider-Waite Tarot Deck.
-*/
-
+/*
+ * This is a playing card deck based off of the Rider-Waite Tarot Deck.
+ */
/obj/item/weapon/deck/tarot
name = "deck of tarot cards"
desc = "For all your occult needs!"
diff --git a/code/modules/games/wizoff.dm b/code/modules/games/wizoff.dm
new file mode 100644
index 00000000000..11cf1797352
--- /dev/null
+++ b/code/modules/games/wizoff.dm
@@ -0,0 +1,57 @@
+/* It's Wiz-Off, the wizard themed card game!
+ * Each player draws 5 cards. There are five rounds. Each round,
+ * a player selects a card to play, and the winner is selected
+ * based on the following rules:
+ * -Defensive (D) beats Offensive (O)!
+ * -Offensive (O) beats Utility (U)!
+ * -Utility (U) beats Defensive (D)!
+ * -If both players play the same type of spell, the higher number wins!
+ * The player who wins the most of the 5 rounds wins the game!
+ * Now get ready to battle for the fate of the universe: Wiz-Off!
+ */
+
+/obj/item/weapon/deck/wizoff
+ name = "\improper Wiz-Off deck"
+ desc = "A Wiz-Off deck. Fight an arcane battle for the fate of the universe: Draw 5! Play 5! Best of 5!"
+ icon_state = "wizoff"
+
+/obj/item/weapon/deck/wizoff/New()
+ ..()
+ var/datum/playingcard/P
+ for(var/cardtext in card_wiz_list)
+ P = new()
+ P.name = "[cardtext]"
+ P.card_icon = "[icon_state]_card"
+ P.back_icon = "[icon_state]_card_back"
+ cards += P
+
+/obj/item/weapon/deck/wizoff/var/list/card_wiz_list = list(
+ "O1: Spell Cards",
+ "O2: Summon Bees",
+ "O3: Polymorph",
+ "O4: Tesla Blast",
+ "O5: Rod Form",
+ "O6: Mutate",
+ "O7: Fireball",
+ "O8: Mjolnir",
+ "O9: Smite",
+ "D1: Smoke",
+ "D2: Battlemage Armor",
+ "D3: Repulse",
+ "D4: Magic Missile",
+ "D5: Disable Technology",
+ "D6: Spell Trap",
+ "D7: Forcewall",
+ "D8: Arcane Heal",
+ "D9: Stop Time",
+ "U1: Shapechange",
+ "U2: Spacetime Distortion",
+ "U3: Scrying Orb",
+ "U4: Blink",
+ "U5: Knock",
+ "U6: Teleport",
+ "U7: Bind Soul",
+ "U8: Warp Whistle",
+ "U9: Jaunt"
+ )
+
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
index fa6d2b8314d..1622321c526 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
@@ -283,6 +283,21 @@
log_admin("[key_name_admin(src)] offered [M] to swap bodies as a morph.")
if(tgui_alert(M, "\The [src] has elected to attempt to take over your body and control you. Is this something you will allow to happen?", "Allow Morph To Take Over",list("No","Yes")) == "Yes")
if(tgui_alert(M, "Are you sure? The only way to undo this on your own is to OOC Escape.", "Allow Morph To Take Over",list("No","Yes")) == "Yes")
+ if(buckled)
+ buckled.unbuckle_mob()
+ if(M.buckled)
+ M.buckled.unbuckle_mob()
+ if(LAZYLEN(buckled_mobs))
+ for(var/buckledmob in buckled_mobs)
+ riding_datum.force_dismount(buckledmob)
+ if(LAZYLEN(M.buckled_mobs))
+ for(var/p_buckledmob in M.buckled_mobs)
+ M.riding_datum.force_dismount(p_buckledmob)
+ if(pulledby)
+ pulledby.stop_pulling()
+ if(M.pulledby)
+ M.pulledby.stop_pulling()
+ stop_pulling()
original_ckey = ckey
log_and_message_admins("[key_name_admin(src)] has swapped bodies with [key_name_admin(M)] as a morph at [get_area(src)] - [COORD(src)].")
new /mob/living/simple_mob/vore/hostile/morph/dominated_prey(M.vore_selected, M.ckey, src, M)
@@ -327,6 +342,22 @@
prey_body = null
/mob/living/simple_mob/vore/hostile/morph/dominated_prey/proc/undo_prey_takeover(ooc_escape)
+ if(buckled)
+ buckled.unbuckle_mob()
+ if(prey_body.buckled)
+ prey_body.buckled.unbuckle_mob()
+ if(LAZYLEN(buckled_mobs))
+ for(var/buckledmob in buckled_mobs)
+ riding_datum.force_dismount(buckledmob)
+ if(LAZYLEN(prey_body.buckled_mobs))
+ for(var/p_buckledmob in prey_body.buckled_mobs)
+ prey_body.riding_datum.force_dismount(p_buckledmob)
+ if(pulledby)
+ pulledby.stop_pulling()
+ if(prey_body.pulledby)
+ prey_body.pulledby.stop_pulling()
+ stop_pulling()
+
if(ooc_escape)
prey_body.forceMove(get_turf(src))
parent_morph.forceMove(get_turf(src))
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 67524ac86c6..46736474b7e 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -246,3 +246,39 @@
magazine_icondata_keys[M.type] = icon_keys
magazine_icondata_states[M.type] = ammo_states
+/*
+ * Ammo Boxes
+ */
+
+/obj/item/ammo_magazine/ammo_box
+ name = "ammo box"
+ desc = "A box that holds some kind of ammo."
+ icon = 'icons/obj/ammo_boxes.dmi'
+ icon_state = "pistol"
+ slot_flags = null //You can't fit a box on your belt
+ item_state = "paper"
+ matter = null
+ throwforce = 3
+ throw_speed = 5
+ throw_range = 12
+ preserve_item = 1
+ caliber = ".357"
+ drop_sound = 'sound/items/drop/matchbox.ogg'
+ pickup_sound = 'sound/items/pickup/matchbox.ogg'
+
+/obj/item/ammo_magazine/ammo_box/AltClick(mob/user)
+ if(can_remove_ammo)
+ if(isliving(user) && Adjacent(user))
+ if(stored_ammo.len)
+ var/obj/item/ammo_casing/C = stored_ammo[stored_ammo.len]
+ stored_ammo-=C
+ user.put_in_hands(C)
+ user.visible_message("\The [user] removes \a [C] from [src].", "You remove \a [C] from [src].")
+ update_icon()
+ return
+ ..()
+
+/obj/item/ammo_magazine/ammo_box/examine(mob/user)
+ . = ..()
+
+ . += to_chat(usr, "Alt-click to extract contents")
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/ammo_boxes.dm b/code/modules/projectiles/ammunition/ammo_boxes.dm
new file mode 100644
index 00000000000..332b634a0f7
--- /dev/null
+++ b/code/modules/projectiles/ammunition/ammo_boxes.dm
@@ -0,0 +1,58 @@
+/************************************************************************/
+/*
+# An explaination of the naming format for guns and ammo:
+#
+# a = Ammo, as in individual rounds of ammunition.
+# b = Box, intended to have ammo taken out one at a time by hand.
+# c = Clips, intended to reload magazines or guns quickly.
+# m = Magazine, intended to hold rounds of ammo.
+# s = Speedloaders, intended to reload guns quickly.
+#
+# Use this format, followed by the caliber. For example, a shotgun's caliber
+# variable is "12g" as a result. Ergo, a shotgun round's path would have "a12g",
+# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion
+# for developers and in-game admins spawning these items, stick to this format.
+# Likewise, when creating new rounds, the caliber variable should match whatever
+# the name says.
+#
+# This comment is copied in rounds.dm and magazines.dm as well.
+#
+# Also, to remove bullets from ammo boxes, use Alt-Click on the box.
+*/
+/************************************************************************/
+
+/*
+ * Foam
+ */
+
+/obj/item/ammo_magazine/ammo_box/foam
+ name = "\improper Donk-Soft ammo box"
+ desc = "Contains Donk-Soft foam darts. It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "foambox"
+ caliber = "foam"
+ ammo_type = /obj/item/ammo_casing/afoam_dart
+ matter = list(MAT_PLASTIC = 1800)
+ max_ammo = 30
+ multiple_sprites = null
+
+/obj/item/ammo_magazine/ammo_box/foam/riot
+ name = "\improper Donk-Soft riot ammo box"
+ desc = "Contains Donk-Soft riot darts. It's Donk or Don't! Ages 18 and up."
+ icon_state = "foambox_riot"
+ matter = list(MAT_STEEL = 5040, MAT_PLASTIC = 1800)
+
+/*
+ * Cap
+ */
+
+/obj/item/ammo_magazine/ammo_box/cap
+ name = "\improper AlliCo SNAP! Caps"
+ desc = "A box of spare caps for capguns. Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "capbox"
+ caliber = "caps"
+ ammo_type = /obj/item/ammo_casing/cap
+ matter = list(MAT_STEEL = 2040)
+ max_ammo = 24
+ multiple_sprites = null
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 41b000d82f6..aa43a547922 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -22,7 +22,42 @@
*/
/************************************************************************/
+///////// Foam /////////
+/obj/item/ammo_magazine/mfoam_dart/pistol
+ name = "\improper Donk-Soft pistol magazine"
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "toy"
+ mag_type = MAGAZINE
+ ammo_type = /obj/item/ammo_casing/afoam_dart
+ matter = list(MAT_PLASTIC = 250)
+ caliber = "foam"
+ max_ammo = 9
+ multiple_sprites = 1
+
+/obj/item/ammo_magazine/mfoam_dart/pistol/riot
+ ammo_type = /obj/item/ammo_casing/afoam_dart/riot
+
+/obj/item/ammo_magazine/mfoam_dart/pistol/empty
+ initial_ammo = 0
+
+/obj/item/ammo_magazine/mfoam_dart/smg
+ name = "\improper Donk-Soft smg magazine"
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "toysmg"
+ mag_type = MAGAZINE
+ ammo_type = /obj/item/ammo_casing/afoam_dart
+ matter = list(MAT_PLASTIC = 250)
+ caliber = "foam"
+ max_ammo = 20
+ multiple_sprites = 1
+
+/obj/item/ammo_magazine/mfoam_dart/smg/riot
+ ammo_type = /obj/item/ammo_casing/afoam_dart/riot
+ matter = list(MAT_PLASTIC = 1260, MAT_PLASTIC = 250)
+
+/obj/item/ammo_magazine/mfoam_dart/smg/empty
+ initial_ammo = 0
///////// .357 /////////
diff --git a/code/modules/projectiles/ammunition/rounds.dm b/code/modules/projectiles/ammunition/rounds.dm
index c10cf8f7b35..0ea73396f89 100644
--- a/code/modules/projectiles/ammunition/rounds.dm
+++ b/code/modules/projectiles/ammunition/rounds.dm
@@ -19,6 +19,26 @@
*/
/************************************************************************/
+/*
+ * Foam
+ */
+
+/obj/item/ammo_casing/afoam_dart
+ name = "foam dart"
+ desc = "It's Donk or Don't! Ages 8 and up."
+ projectile_type = /obj/item/projectile/bullet/foam_dart
+ matter = list(MAT_PLASTIC = 60)
+ caliber = "foam"
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "foamdart"
+ caseless = 1
+
+/obj/item/ammo_casing/afoam_dart/riot
+ name = "riot foam dart"
+ desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
+ matter = list(MAT_STEEL = 210, MAT_PLASTIC = 60)
+ icon_state = "foamdart_riot"
+
/*
* .357
*/
@@ -427,12 +447,13 @@
/obj/item/ammo_casing/cap
name = "cap"
- desc = "A cap for children toys."
+ desc = "A cap for children toys. Ages 8 and up."
caliber = "caps"
- icon_state = "r-casing"
- color = "#FF0000"
- projectile_type = /obj/item/projectile/bullet/pistol/cap
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "cap"
+ projectile_type = /obj/item/projectile/bullet/cap
matter = list(MAT_STEEL = 85)
+ caseless = 1
/obj/item/ammo_casing/spent // For simple hostile mobs only, so they don't cough up usable bullets when firing. This is for literally nothing else.
icon_state = "s-casing-spent"
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index e0f4b936b8e..e4cd464663e 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -278,41 +278,6 @@
accuracy = 0
scoped_accuracy = 20
-////////Laser Tag////////////////////
-
-/obj/item/weapon/gun/energy/lasertag
- name = "laser tag gun"
- item_state = "laser"
- desc = "Standard issue weapon of the Imperial Guard"
- origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2)
- matter = list(MAT_STEEL = 2000)
- projectile_type = /obj/item/projectile/beam/lasertag/blue
- cell_type = /obj/item/weapon/cell/device/weapon/recharge
- battery_lock = 1
- var/required_vest
-
-/obj/item/weapon/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M)
- if(ishuman(M))
- if(!istype(M.wear_suit, required_vest))
- to_chat(M, "You need to be wearing your laser tag vest!")
- return 0
- return ..()
-
-/obj/item/weapon/gun/energy/lasertag/blue
- icon_state = "bluetag"
- item_state = "bluetag"
- projectile_type = /obj/item/projectile/beam/lasertag/blue
- required_vest = /obj/item/clothing/suit/bluetag
-
-/obj/item/weapon/gun/energy/lasertag/red
- icon_state = "redtag"
- item_state = "redtag"
- projectile_type = /obj/item/projectile/beam/lasertag/red
- required_vest = /obj/item/clothing/suit/redtag
-
-/obj/item/weapon/gun/energy/lasertag/omni
- projectile_type = /obj/item/projectile/beam/lasertag/omni
-
// Laser scattergun, proof of concept.
/obj/item/weapon/gun/energy/lasershotgun
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 5d158e5d0ae..678146eb182 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -148,18 +148,6 @@
flick("deckard-reload",src)
..()
-/obj/item/weapon/gun/projectile/revolver/capgun
- name = "cap gun"
- desc = "Looks almost like the real thing! Ages 8 and up."
- icon_state = "revolver"
- item_state = "revolver"
- caliber = "caps"
- origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
- handle_casings = CYCLE_CASINGS
- max_shells = 7
- ammo_type = /obj/item/ammo_casing/cap
- projectile_type = /obj/item/projectile/bullet/pistol/strong
-
/obj/item/weapon/gun/projectile/revolver/judge
name = "\"The Judge\""
desc = "A revolving hand-shotgun by Jindal Arms that packs the power of a 12 guage in the palm of your hand (if you don't break your wrist). Uses 12g rounds."
diff --git a/code/modules/projectiles/guns/toy.dm b/code/modules/projectiles/guns/toy.dm
new file mode 100644
index 00000000000..e3b90bd1be0
--- /dev/null
+++ b/code/modules/projectiles/guns/toy.dm
@@ -0,0 +1,251 @@
+/* Toys Guns!
+ *
+ * Contains:
+ * Cap Gun
+ * Shotgun
+ * Pistol
+ * N99 Pistol
+ * Levergun
+ * Revolver
+ * Big Iron
+ * Crossbow
+ * Crossbow (Halloween)
+ * Sawn Off
+ * SMG
+ * Laser Tag
+ */
+
+/*
+ * Cap Gun
+ */
+/obj/item/weapon/gun/projectile/revolver/capgun
+ name = "cap gun"
+ desc = "Looks almost like the real thing! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "cap_gun"
+ item_state = "revolver"
+ caliber = "caps"
+ origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
+ ammo_type = /obj/item/ammo_casing/cap
+ projectile_type = /obj/item/projectile/bullet/cap
+ matter = list(MAT_STEEL = 1000)
+ handle_casings = null
+ recoil = 1 //it's a toy
+
+/*
+ * Shotgun
+ */
+/obj/item/weapon/gun/projectile/shotgun/pump/toy
+ name = "\improper Donk-Soft shotgun"
+ desc = "Donk-Soft foam shotgun! It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "shotgun"
+ item_state = "shotgun"
+ max_shells = 6
+ w_class = ITEMSIZE_LARGE
+ force = 2
+ slot_flags = null
+ caliber = "foam"
+ origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
+ load_method = SINGLE_CASING
+ ammo_type = /obj/item/ammo_casing/afoam_dart
+ projectile_type = /obj/item/projectile/bullet/foam_dart
+ matter = list(MAT_PLASTIC = 2000)
+ handle_casings = null
+ recoil = null //it's a toy
+
+/*
+ * Pistol
+ */
+/obj/item/weapon/gun/projectile/pistol/toy
+ name = "\improper Donk-Soft pistol"
+ desc = "Donk-Soft foam pistol! It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "pistol"
+ item_state = "gun"
+ magazine_type = /obj/item/ammo_magazine/mfoam_dart/pistol
+ allowed_magazines = list(/obj/item/ammo_magazine/mfoam_dart/pistol)
+ projectile_type = /obj/item/projectile/bullet/foam_dart
+ caliber = "foam"
+ origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
+ load_method = MAGAZINE
+ matter = list(MAT_PLASTIC = 1000)
+ recoil = null //it's a toy
+
+/obj/item/weapon/gun/projectile/pistol/toy/update_icon()
+ if(ammo_magazine)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]-e"
+
+/*
+ * N99 Pistol
+ */
+/obj/item/weapon/gun/projectile/pistol/toy/n99
+ name = "\improper Donk-Soft commemorative pistol"
+ desc = "A special made Donk-Soft pistol to promote 'Radius: Legend of the Demon Core', a popular post-apocolyptic TV series."
+ icon_state = "n99"
+ item_state = "gun"
+
+/obj/item/weapon/gun/projectile/pistol/toy/n99/update_icon()
+ if(ammo_magazine)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]-e"
+
+/*
+ * Levergun
+ */
+/obj/item/weapon/gun/projectile/shotgun/pump/toy/levergun
+ name = "\improper Donk-Soft levergun"
+ desc = "Donk-Soft foam levergun! Time to cowboy up! Ages 8 and up."
+ icon_state = "leveraction"
+ item_state = "leveraction"
+ max_shells = 5
+ pump_animation = "leveraction-cycling"
+
+/*
+ * Revolver
+ */
+/obj/item/weapon/gun/projectile/revolver/toy
+ name = "\improper Donk-Soft revolver"
+ desc = "Donk-Soft foam revolver! Time to cowboy up! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "revolver"
+ item_state = "revolver"
+ caliber = "foam"
+ ammo_type = /obj/item/ammo_casing/afoam_dart
+ projectile_type = /obj/item/projectile/bullet/foam_dart
+ origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
+ load_method = SINGLE_CASING
+ max_shells = 6
+ matter = list(MAT_PLASTIC = 1000)
+ handle_casings = null
+ recoil = null //it's a toy
+
+/*
+ * Big Iron
+ */
+/obj/item/weapon/gun/projectile/revolver/toy/big_iron
+ name = "\improper Donk-Soft big iron"
+ desc = "A special made Donk-Soft pistol to promote 'A Fistful of Phoron', a popular frontier novel series."
+ icon_state = "big_iron"
+ item_state = "revolver"
+
+/*
+ * Crossbow
+ */
+/obj/item/weapon/gun/projectile/revolver/toy/crossbow
+ name = "\improper Donk-Soft crossbow"
+ desc = "Donk-Soft foam crossbow! It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "foamcrossbow"
+ item_state = "foamcrossbow"
+ max_shells = 5
+
+/*
+ * Crossbow (Halloween)
+ */
+/obj/item/weapon/gun/projectile/revolver/toy/crossbow/halloween
+ name = "\improper Donk-Soft special edition crossbow"
+ desc = "A special edition Donk-Soft crossbow! Made special for your Halloween cosplay. It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "foamcrossbow_halloween"
+ item_state = "foamcrossbow_halloween"
+ max_shells = 5
+
+/*
+ * Sawn Off
+ */
+/obj/item/weapon/gun/projectile/revolver/toy/sawnoff //revolver code just because it's easier
+ name = "\improper Donk-Soft sawn off shotgun"
+ desc = "Donk-Soft foam sawn off! It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "sawnshotgun"
+ item_state = "dshotgun"
+ max_shells = 2
+ w_class = ITEMSIZE_NORMAL
+ matter = list(MAT_PLASTIC = 1500)
+
+/*
+ * SMG
+ */
+/obj/item/weapon/gun/projectile/automatic/toy
+ name = "\improper Donk-Soft SMG"
+ desc = "Donk-Soft foam SMG! It's Donk or Don't! Ages 8 and up."
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "smg"
+ caliber = "foam"
+ w_class = ITEMSIZE_NORMAL
+ load_method = MAGAZINE
+ origin_tech = list(TECH_COMBAT = 1, TECH_MATERIAL = 1)
+ slot_flags = SLOT_BELT
+ magazine_type = /obj/item/ammo_magazine/mfoam_dart/smg
+ allowed_magazines = list(/obj/item/ammo_magazine/mfoam_dart/smg)
+ projectile_type = /obj/item/projectile/bullet/foam_dart
+ matter = list(MAT_PLASTIC = 1500)
+ recoil = null //it's a toy
+
+ firemodes = list(
+ list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null),
+ list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=2, burst_accuracy=list(0,-2,-2), dispersion=null)
+ )
+
+/obj/item/weapon/gun/projectile/automatic/toy/riot
+ magazine_type = /obj/item/ammo_magazine/mfoam_dart/smg/riot
+
+/obj/item/weapon/gun/projectile/automatic/toy/update_icon()
+ if(ammo_magazine)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)]-e"
+
+/*
+ * Laser Tag
+ */
+/obj/item/weapon/gun/energy/lasertag
+ name = "laser tag gun"
+ desc = "Standard issue weapon of the Imperial Guard"
+ icon = 'icons/obj/gun_toy.dmi'
+ item_state = "omnitag"
+ item_state = "retro"
+ origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2)
+ matter = list(MAT_STEEL = 2000)
+ projectile_type = /obj/item/projectile/beam/lasertag/blue
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
+ var/required_vest
+
+/obj/item/weapon/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M)
+ if(ishuman(M))
+ if(!istype(M.wear_suit, required_vest))
+ to_chat(M, "You need to be wearing your laser tag vest!")
+ return 0
+ return ..()
+
+/obj/item/weapon/gun/energy/lasertag/blue
+ icon_state = "bluetag"
+ item_state = "bluetag"
+ projectile_type = /obj/item/projectile/beam/lasertag/blue
+ required_vest = /obj/item/clothing/suit/bluetag
+
+/obj/item/weapon/gun/energy/lasertag/blue/sub
+ name = "Brigader Sidearm"
+ desc = "A laser tag replica of the standard issue weapon for the Spacer Union Brigade from the hit series Spacer Trail (Blue Team)."
+ icon_state = "bluetwo"
+ item_state = "retro"
+
+/obj/item/weapon/gun/energy/lasertag/red
+ icon_state = "redtag"
+ item_state = "redtag"
+ projectile_type = /obj/item/projectile/beam/lasertag/red
+ required_vest = /obj/item/clothing/suit/redtag
+
+/obj/item/weapon/gun/energy/lasertag/red/dom
+ name = "Mu'tu'bi sidearm"
+ desc = "A laser tag replica of the Mu'tu'bi sidearm from the hit series Spacer Trail (Red Team)."
+ icon_state = "redtwo"
+ item_state = "retro"
+
+/obj/item/weapon/gun/energy/lasertag/omni
+ projectile_type = /obj/item/projectile/beam/lasertag/omni
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 84e6674020f..5941b7f4c62 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -321,10 +321,6 @@
embed_chance = 0
sharp = FALSE
-/obj/item/projectile/bullet/blank/cap/process()
- loc = null
- qdel(src)
-
/* BB Rounds */
/obj/item/projectile/bullet/bb // Generic single BB
name = "BB"
@@ -332,7 +328,7 @@
agony = 0
embed_chance = 0
sharp = FALSE
- silenced = TRUE
+ silenced = TRUE
/obj/item/projectile/bullet/pellet/shotgun/bb // Shotgun
name = "BB"
@@ -343,4 +339,54 @@
pellets = 6
range_step = 1
spread_step = 10
- silenced = TRUE
\ No newline at end of file
+ silenced = TRUE
+
+/* toy projectiles */
+/obj/item/projectile/bullet/cap
+ name = "cap"
+ desc = "SNAP!"
+ damage = 0 // It's a damn toy.
+ embed_chance = 0
+ nodamage = TRUE
+ sharp = FALSE
+ damage_type = HALLOSS
+ impact_effect_type = null
+ fire_sound = 'sound/effects/snap.ogg'
+ combustion = FALSE
+
+/obj/item/projectile/bullet/cap/process()
+ loc = null
+ qdel(src)
+
+/obj/item/projectile/bullet/foam_dart
+ name = "foam dart"
+ desc = "I hope you're wearing eye protection."
+ damage = 0 // It's a damn toy.
+ embed_chance = 0
+ nodamage = TRUE
+ sharp = FALSE
+ damage_type = HALLOSS
+ impact_effect_type = null
+ fire_sound = 'sound/items/syringeproj.ogg'
+ combustion = FALSE
+ icon = 'icons/obj/gun_toy.dmi'
+ icon_state = "foamdart_proj"
+ range = 15
+
+/obj/item/projectile/bullet/foam_dart/on_impact(var/atom/A)
+ . = ..()
+ var/turf/T = get_turf(loc)
+ if(istype(T))
+ new /obj/item/ammo_casing/afoam_dart(get_turf(loc))
+
+/obj/item/projectile/bullet/foam_dart/on_range(var/atom/A)
+ . = ..()
+ var/turf/T = get_turf(loc)
+ if(istype(T))
+ new /obj/item/ammo_casing/afoam_dart(get_turf(loc))
+
+/obj/item/projectile/bullet/foam_dart/riot
+ name = "riot foam dart"
+ desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
+ agony = 50
+ icon_state = "foamdart_riot_proj"
\ No newline at end of file
diff --git a/icons/inventory/belt/item.dmi b/icons/inventory/belt/item.dmi
index 8c32c4552bc..bde59b458b2 100644
Binary files a/icons/inventory/belt/item.dmi and b/icons/inventory/belt/item.dmi differ
diff --git a/icons/inventory/belt/mob.dmi b/icons/inventory/belt/mob.dmi
index 25de9748581..a8e2aaacd75 100644
Binary files a/icons/inventory/belt/mob.dmi and b/icons/inventory/belt/mob.dmi differ
diff --git a/icons/inventory/head/item.dmi b/icons/inventory/head/item.dmi
index bfdea47a734..76b81184092 100644
Binary files a/icons/inventory/head/item.dmi and b/icons/inventory/head/item.dmi differ
diff --git a/icons/inventory/head/mob.dmi b/icons/inventory/head/mob.dmi
index 17728e25f67..0917a414bd5 100644
Binary files a/icons/inventory/head/mob.dmi and b/icons/inventory/head/mob.dmi differ
diff --git a/icons/inventory/suit/item.dmi b/icons/inventory/suit/item.dmi
index 4e8e3f86576..e5d75cd19ea 100644
Binary files a/icons/inventory/suit/item.dmi and b/icons/inventory/suit/item.dmi differ
diff --git a/icons/inventory/suit/mob.dmi b/icons/inventory/suit/mob.dmi
index 9aa489853fb..0eb7b2b6e13 100644
Binary files a/icons/inventory/suit/mob.dmi and b/icons/inventory/suit/mob.dmi differ
diff --git a/icons/obj/ammo_boxes.dmi b/icons/obj/ammo_boxes.dmi
new file mode 100644
index 00000000000..37069700416
Binary files /dev/null and b/icons/obj/ammo_boxes.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index c94a289290b..9de92931db4 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/icons/obj/gun_toy.dmi b/icons/obj/gun_toy.dmi
new file mode 100644
index 00000000000..bee6bcc49d6
Binary files /dev/null and b/icons/obj/gun_toy.dmi differ
diff --git a/icons/obj/playing_cards.dmi b/icons/obj/playing_cards.dmi
index 04e7af96fea..0195f8e6f47 100644
Binary files a/icons/obj/playing_cards.dmi and b/icons/obj/playing_cards.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index b7235b7e581..98519ef6592 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/icons/obj/toy_vr.dmi b/icons/obj/toy_vr.dmi
index 3ad106945b6..9b3ca4d9d02 100644
Binary files a/icons/obj/toy_vr.dmi and b/icons/obj/toy_vr.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index a1fbfc9479c..91285fd3a12 100755
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index cb9f6904ed4..f658a6da072 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -33290,7 +33290,7 @@
"gWO" = (
/obj/structure/table/rack,
/obj/effect/floor_decal/rust,
-/obj/item/toy/crossbow,
+/obj/item/weapon/gun/projectile/revolver/toy/crossbow,
/turf/simulated/floor/plating,
/area/tether/surfacebase/funny/hideyhole)
"gYx" = (
@@ -36719,8 +36719,8 @@
/area/maintenance/lower/trash_pit)
"qhs" = (
/obj/structure/table/rack,
-/obj/item/toy/crossbow,
/obj/item/weapon/coin/silver,
+/obj/item/weapon/gun/projectile/revolver/toy/crossbow,
/turf/simulated/floor/plating,
/area/tether/surfacebase/funny/hideyhole)
"qjE" = (
diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm
index 61598a61f48..5a9fd154e5c 100644
--- a/maps/tether/tether-03-surface3.dmm
+++ b/maps/tether/tether-03-surface3.dmm
@@ -32172,7 +32172,6 @@
/obj/item/weapon/soap/nanotrasen,
/obj/item/weapon/soap/deluxe,
/obj/item/weapon/staff/gentcane,
-/obj/item/toy/crossbow,
/obj/item/toy/eight_ball/conch,
/obj/item/weapon/cell/potato,
/obj/structure/cable/green{
@@ -32182,6 +32181,7 @@
},
/obj/item/device/megaphone,
/obj/random/cutout,
+/obj/item/weapon/gun/projectile/revolver/toy/crossbow,
/turf/simulated/floor/lino,
/area/tether/surfacebase/entertainment/backstage)
"bcV" = (
diff --git a/sound/items/sonic_driver.ogg b/sound/items/sonic_driver.ogg
new file mode 100644
index 00000000000..d02a2b67098
Binary files /dev/null and b/sound/items/sonic_driver.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index 43e5fe19f7f..c03aab5deb8 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -3487,6 +3487,7 @@
#include "code\modules\projectiles\dnalocking.dm"
#include "code\modules\projectiles\gun.dm"
#include "code\modules\projectiles\projectile.dm"
+#include "code\modules\projectiles\ammunition\ammo_boxes.dm"
#include "code\modules\projectiles\ammunition\magazines.dm"
#include "code\modules\projectiles\ammunition\magazines_vr.dm"
#include "code\modules\projectiles\ammunition\magnetic.dm"
@@ -3501,6 +3502,7 @@
#include "code\modules\projectiles\guns\magic.dm"
#include "code\modules\projectiles\guns\modular_guns.dm"
#include "code\modules\projectiles\guns\projectile.dm"
+#include "code\modules\projectiles\guns\toy.dm"
#include "code\modules\projectiles\guns\vox.dm"
#include "code\modules\projectiles\guns\energy\bsharpoon_vr.dm"
#include "code\modules\projectiles\guns\energy\crestrose_vr.dm"