diff --git a/modular_citadel/code/game/objects/items/balls.dm b/modular_citadel/code/game/objects/items/balls.dm
new file mode 100644
index 0000000000..4095a4bb20
--- /dev/null
+++ b/modular_citadel/code/game/objects/items/balls.dm
@@ -0,0 +1,92 @@
+/* BALLS - GLORIOUS BALLS
+//
+// Includes:-
+// 1) Tennis balls, lines 10 - 92
+//
+//
+//
+*/
+
+/obj/item/toy/tennis
+ name = "tennis ball"
+ desc = "A classical tennis ball. It appears to have faint bite marks scattered all over its surface."
+ icon = 'modular_citadel/icons/obj/balls.dmi'
+ icon_state = "tennis_classic"
+ lefthand_file = 'modular_citadel/icons/mob/inhands/balls_left.dmi'
+ righthand_file = 'modular_citadel/icons/mob/inhands/balls_right.dmi'
+ item_state = "tennis_classic"
+ alternate_worn_icon = 'modular_citadel/icons/mob/mouthball.dmi'
+ slot_flags = SLOT_HEAD | SLOT_NECK | SLOT_EARS //Fluff item, put it wherever you want!
+ throw_range = 14
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/toy/tennis/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
+ altafterattack(A, user, TRUE, params)
+ return TRUE
+
+/obj/item/toy/tennis/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes
+ if(istype(user))
+ user.visible_message("[user] waggles [src] at [target].", "You waggle [src] at [target].")
+ return TRUE
+
+/obj/item/toy/tennis/rainbow
+ name = "pseudo-euclidean interdimensional tennis sphere"
+ desc = "A tennis ball from another plane of existance. Really groovy."
+ icon_state = "tennis_rainbow"
+ item_state = "tennis_rainbow"
+ actions_types = list(/datum/action/item_action/squeeze) //Giving the masses easy access to unilimted honks would be annoying
+
+/obj/item/toy/tennis/rainbow/Initialize()
+ . = ..()
+ AddComponent(/datum/component/squeak)
+
+/obj/item/toy/tennis/rainbow/izzy //izzyinbox's donator item
+ name = "Katlin's Ball"
+ desc = "A tennis ball that's seen a good bit of love, being covered in a few black and white hairs and slobber."
+ icon_state = "tennis_izzy"
+ item_state = "tennis_izzy"
+
+/obj/item/toy/tennis/red //da red wuns go fasta
+ name = "red tennis ball"
+ desc = "A red tennis ball. It goes three times faster!"
+ icon_state = "tennis_red"
+ item_state = "tennis_red"
+ throw_speed = 9
+
+/obj/item/toy/tennis/yellow //because yellow is hot I guess
+ name = "yellow tennis ball"
+ desc = "A yellow tennis ball. It seems to have a flame-retardant coating."
+ icon_state = "tennis_yellow"
+ item_state = "tennis_yellow"
+ resistance_flags = FIRE_PROOF
+
+/obj/item/toy/tennis/green //pestilence
+ name = "green tennis ball"
+ desc = "A green tennis ball. It seems to have an impermeable coating."
+ icon_state = "tennis_green"
+ item_state = "tennis_green"
+ permeability_coefficient = 0.9
+
+/obj/item/toy/tennis/cyan //electric
+ name = "cyan tennis ball"
+ desc = "A cyan tennis ball. It seems to have odd electrical properties."
+ icon_state = "tennis_cyan"
+ item_state = "tennis_cyan"
+ siemens_coefficient = 0.9
+
+/obj/item/toy/tennis/blue //reliability
+ name = "blue tennis ball"
+ desc = "A blue tennis ball. It seems ever so slightly more robust than normal."
+ icon_state = "tennis_blue"
+ item_state = "tennis_blue"
+ max_integrity = 300
+
+/obj/item/toy/tennis/purple //because purple dyes have high pH and would neutralize acids I guess
+ name = "purple tennis ball"
+ desc = "A purple tennis ball. It seems to have an acid-resistant coating."
+ icon_state = "tennis_purple"
+ item_state = "tennis_purple"
+ resistance_flags = ACID_PROOF
+
+/datum/action/item_action/squeeze
+ name = "Squeak!"
\ No newline at end of file
diff --git a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
index 29de14a120..0d03d21c0f 100644
--- a/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
+++ b/modular_citadel/code/game/objects/items/melee/eutactic_blades.dm
@@ -26,6 +26,15 @@
light_color = "#37FFF7"
actions_types = list()
+/obj/item/melee/transforming/energy/sword/cx/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
+ altafterattack(A, user, TRUE, params)
+ return TRUE
+
+/obj/item/melee/transforming/energy/sword/cx/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes
+ if(istype(user))
+ user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
+ return TRUE
+
/obj/item/melee/transforming/energy/sword/cx/transform_weapon(mob/living/user, supress_message_text)
active = !active //I'd use a ..() here but it'd inherit from the regular esword's proc instead, so SPAGHETTI CODE
if(active) //also I'd need to rip out the iconstate changing bits
@@ -120,6 +129,15 @@
var/light_brightness = 3
actions_types = list()
+/obj/item/toy/sword/cx/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
+ altafterattack(A, user, TRUE, params)
+ return TRUE
+
+/obj/item/toy/sword/cx/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes
+ if(istype(user))
+ user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
+ return TRUE
+
/obj/item/toy/sword/cx/attack_self(mob/user)
active = !( active )
@@ -233,6 +251,16 @@
var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
flags_2 = SLOWS_WHILE_IN_HAND_2
+/obj/item/twohanded/hypereutactic/pre_altattackby(atom/A, mob/living/user, params) //checks if it can do right click memes
+ altafterattack(A, user, TRUE, params)
+ return TRUE
+
+/obj/item/twohanded/hypereutactic/altafterattack(atom/target, mob/living/carbon/user, proximity_flag, click_parameters) //does right click memes
+ if(istype(user))
+ user.visible_message("[user] points the tip of [src] at [target].", "You point the tip of [src] at [target].")
+ return TRUE
+
+
/obj/item/twohanded/hypereutactic/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds.
if(M.has_dna())
if(M.dna.check_mutation(HULK))
@@ -402,4 +430,22 @@
/obj/item/melee/transforming/energy/sword/cx/traitor/transform_messages(mob/living/user, supress_message_text)
playsound(user, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, 1)
if(!supress_message_text)
- to_chat(user, "[src] [active ? "is now active":"can now be concealed"].")
\ No newline at end of file
+ to_chat(user, "[src] [active ? "is now active":"can now be concealed"].")
+
+//RAINBOW MEMES
+
+/obj/item/twohanded/hypereutactic/toy/rainbow
+ name = "\improper Hyper-Euclidean Reciprocating Trigonometric Zweihander"
+ desc = "A custom-built toy with fancy rainbow lights built-in."
+ flags_2 = NONE
+ var/list/rainbow_colors = list("#FF0000", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF","#FF00FF", "#3399ff", "#ff9900", "#fb008b", "#9800ff", "#00ffa3", "#ccff00")
+
+/obj/item/twohanded/hypereutactic/toy/rainbow/process()
+ . = ..()
+ var/set_color = pick(rainbow_colors)
+ light_color = set_color
+ update_light()
+ update_icon()
+
+/obj/item/twohanded/hypereutactic/toy/rainbow/AltClick(mob/living/user)
+ return
\ No newline at end of file
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 9836b3b2ed..640e728c2d 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -217,6 +217,12 @@
path = /obj/item/clothing/suit/toggle/labcoat/labredblack
ckeywhitelist = list("blakeryan")
+/datum/gear/torisword
+ name = "Rainbow Zweihander"
+ category = slot_in_backpack
+ path = /obj/item/twohanded/hypereutactic/toy/rainbow
+ ckeywhitelist = list("annoymous35")
+
/datum/gear/darksabre
name = "Dark Sabre"
category = slot_in_backpack
@@ -229,8 +235,14 @@ datum/gear/darksabresheath
path = /obj/item/storage/belt/sabre/darksabre
ckeywhitelist = list("inferno707")
+/datum/gear/toriball
+ name = "Rainbow Tennis Ball"
+ category = slot_in_backpack
+ path = /obj/item/toy/tennis/rainbow
+ ckeywhitelist = list("annoymous35")
-
-
-
-
+/datum/gear/izzyball
+ name = "Katlin's Ball"
+ category = slot_in_backpack
+ path = /obj/item/toy/tennis/rainbow/izzy
+ ckeywhitelist = list("izzyinbox")
\ No newline at end of file
diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm
index 2779d6f124..3c8d74cdac 100644
--- a/modular_citadel/code/modules/client/loadout/backpack.dm
+++ b/modular_citadel/code/modules/client/loadout/backpack.dm
@@ -18,7 +18,42 @@
category = slot_in_backpack
path = /obj/item/toy/plush/slimeplushie
+/datum/gear/tennis
+ name = "Classic Tennis Ball"
+ category = slot_in_backpack
+ path = /obj/item/toy/tennis
+
+/datum/gear/tennisred
+ name = "Red Tennis Ball"
+ category = slot_in_backpack
+ path = /obj/item/toy/tennis/red
+
+/datum/gear/tennisyellow
+ name = "Yellow Tennis Ball"
+ category = slot_in_backpack
+ path = /obj/item/toy/tennis/yellow
+
+/datum/gear/tennisgreen
+ name = "Green Tennis Ball"
+ category = slot_in_backpack
+ path = /obj/item/toy/tennis/green
+
+/datum/gear/tenniscyan
+ name = "Cyan Tennis Ball"
+ category = slot_in_backpack
+ path = /obj/item/toy/tennis/cyan
+
+/datum/gear/tennisblue
+ name = "Blue Tennis Ball"
+ category = slot_in_backpack
+ path = /obj/item/toy/tennis/blue
+
+/datum/gear/tennispurple
+ name = "Purple Tennis Ball"
+ category = slot_in_backpack
+ path = /obj/item/toy/tennis/purple
+
/datum/gear/dildo
name = "Customizable dildo"
category = slot_in_backpack
- path = /obj/item/dildo/custom
+ path = /obj/item/dildo/custom
\ No newline at end of file
diff --git a/modular_citadel/icons/mob/inhands/balls_left.dmi b/modular_citadel/icons/mob/inhands/balls_left.dmi
new file mode 100644
index 0000000000..2e751d0f44
Binary files /dev/null and b/modular_citadel/icons/mob/inhands/balls_left.dmi differ
diff --git a/modular_citadel/icons/mob/inhands/balls_right.dmi b/modular_citadel/icons/mob/inhands/balls_right.dmi
new file mode 100644
index 0000000000..45ee6864f0
Binary files /dev/null and b/modular_citadel/icons/mob/inhands/balls_right.dmi differ
diff --git a/modular_citadel/icons/mob/mouthball.dmi b/modular_citadel/icons/mob/mouthball.dmi
new file mode 100644
index 0000000000..b5c08dd648
Binary files /dev/null and b/modular_citadel/icons/mob/mouthball.dmi differ
diff --git a/modular_citadel/icons/obj/balls.dmi b/modular_citadel/icons/obj/balls.dmi
new file mode 100644
index 0000000000..9b9f4575b3
Binary files /dev/null and b/modular_citadel/icons/obj/balls.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index e57765a3dc..a0c0b60e8c 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2586,7 +2586,6 @@
#include "interface\interface.dm"
#include "interface\menu.dm"
#include "interface\stylesheet.dm"
-#include "modular_citadel\cit_medkits.dm"
#include "modular_citadel\cit_screenshake.dm"
#include "modular_citadel\cit_turfs.dm"
#include "modular_citadel\citadel_ghostrole_spawners.dm"
@@ -2636,6 +2635,7 @@
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm"
+#include "modular_citadel\code\game\objects\items\balls.dm"
#include "modular_citadel\code\game\objects\items\handcuffs.dm"
#include "modular_citadel\code\game\objects\items\holy_weapons.dm"
#include "modular_citadel\code\game\objects\items\stunsword.dm"