diff --git a/code/game/objects/items/toys/mech_toys.dm b/code/game/objects/items/toys/mech_toys.dm
index a8dd875f30..3fdb9c6659 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_vr.dm b/code/game/objects/items/toys/toys_vr.dm
index 3884b0a17c..cb05e944cf 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
+ */
/obj/item/toy/plushie/lizardplushie
name = "lizard plushie"
desc = "An adorable stuffed toy that resembles a lizardperson."
@@ -101,38 +134,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."
@@ -172,7 +173,6 @@
else
return ..()
-
/obj/item/toy/plushie/ipc/attack_self(mob/user as mob)
if(!cooldown)
playsound(user, 'sound/machines/ping.ogg', 10, 0)
@@ -274,7 +274,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")
@@ -284,9 +286,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")
@@ -307,6 +354,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?"
@@ -330,6 +380,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!"
@@ -349,6 +402,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."
@@ -374,6 +430,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."
@@ -394,12 +453,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!"
@@ -434,6 +499,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."
@@ -460,6 +528,9 @@
return 0
+/*
+ * Toy cuffs
+ */
/obj/item/weapon/handcuffs/fake
name = "plastic handcuffs"
desc = "Use this to keep plastic prisoners in line."
@@ -484,6 +555,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."
@@ -510,6 +584,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."
@@ -547,6 +624,9 @@
else ..()
+/*
+ * Toy xeno
+ */
/obj/item/toy/toy_xeno
icon = 'icons/obj/toy_vr.dmi'
icon_state = "xeno"
@@ -571,6 +651,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!"
@@ -641,6 +724,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."
@@ -668,6 +754,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"
@@ -690,6 +779,9 @@
/obj/item/toy/chainsaw/proc/cooldownreset()
cooldown = 0
+/*
+ * Random miniature spawner
+ */
/obj/random/miniature
name = "Random miniature"
desc = "This is a random miniature."
@@ -699,6 +791,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."
@@ -775,3 +870,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/modules/games/cah_black_cards.dm b/code/modules/games/cah_black_cards.dm
index 0bc5cc6d0f..c2c32b9948 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 5c8e592b7e..3ab0df883a 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 a99e656add..0345cf0d18 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 d9c932908c..48c5407759 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 7c49f7ec43..df5fb73b23 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 0000000000..11cf179735
--- /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/icons/obj/playing_cards.dmi b/icons/obj/playing_cards.dmi
index 04e7af96fe..0195f8e6f4 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 b7235b7e58..98519ef659 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 3ad106945b..9b3ca4d9d0 100644
Binary files a/icons/obj/toy_vr.dmi and b/icons/obj/toy_vr.dmi differ
diff --git a/sound/items/sonic_driver.ogg b/sound/items/sonic_driver.ogg
new file mode 100644
index 0000000000..d02a2b6709
Binary files /dev/null and b/sound/items/sonic_driver.ogg differ