diff --git a/code/game/objects/items/godfigures.dm b/code/game/objects/items/toys/godfigures.dm
similarity index 100%
rename from code/game/objects/items/godfigures.dm
rename to code/game/objects/items/toys/godfigures.dm
diff --git a/code/game/objects/items/toys/mech_toys.dm b/code/game/objects/items/toys/mech_toys.dm
new file mode 100644
index 0000000000..a49977c141
--- /dev/null
+++ b/code/game/objects/items/toys/mech_toys.dm
@@ -0,0 +1,643 @@
+/*
+ * 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
+#define SPECIAL_ATTACK_UTILITY 3
+#define SPECIAL_ATTACK_OTHER 4
+
+// Max length of a mech battle
+#define MAX_BATTLE_LENGTH 50
+
+/obj/item/toy/mecha
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "ripleytoy"
+ drop_sound = 'sound/mecha/mechstep.ogg'
+ description_info = "To engage in mech battles, hold this mech while clicking on another toy mech, or a player who is also holding a toy mech. You must be within 2 tiles (This allows you to battle across a table). Battles are entirely randomized, and mechs with higher health and special abilities have a better chance of winning."
+ 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)
+ var/cooldown_multiplier = 20 // Cooldown multiplier after a battle (by default: battle cooldowns are 30 seconds)
+ var/quiet = FALSE // If it makes noise when played with
+ var/wants_to_battle = FALSE // TRUE = Offering battle to someone || FALSE = Not offering battle
+ var/in_combat = FALSE // TRUE = in combat currently || FALSE = Not in combat
+ var/combat_health = 0 // The mech's health in battle
+ var/max_combat_health = 0 // The mech's max combat health
+ var/special_attack_charged = FALSE // TRUE = the special attack is charged || FALSE = not charged
+ var/special_attack_type = 0 // What type of special attack they use - SPECIAL_ATTACK_DAMAGE, SPECIAL_ATTACK_HEAL, SPECIAL_ATTACK_UTILITY, SPECIAL_ATTACK_OTHER
+ var/special_attack_type_message = "" // What message their special move gets on examining
+ var/special_attack_cry = "*flip" // The battlecry when using the special attack
+ 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]."
+ combat_health = max_combat_health
+ switch(special_attack_type)
+ if(SPECIAL_ATTACK_DAMAGE)
+ special_attack_type_message = "an aggressive move, which deals bonus damage."
+ if(SPECIAL_ATTACK_HEAL)
+ special_attack_type_message = "a defensive move, which grants bonus healing."
+ if(SPECIAL_ATTACK_UTILITY)
+ special_attack_type_message = "a utility move, which heals the user and damages the opponent."
+ if(SPECIAL_ATTACK_OTHER)
+ special_attack_type_message = "a special move, which [special_attack_type_message]"
+ else
+ special_attack_type_message = "a mystery move, even I don't know."
+
+/obj/item/toy/mecha/proc/in_range(source, user) // Modify our in_range proc specifically for mech battles!
+ if(get_dist(source, user) <= 2)
+ return 1
+
+ return 0 //not in range and not telekinetic
+
+/**
+ * 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).
+ * if it's player vs player: Both players need to be able to "control" their mechs (either must be adjacent or using TK).
+ * if it's player vs mech (suicide): the mech needs to be in range of the player.
+ * if all the checks are TRUE, it does the sleeps, and returns TRUE. Otherwise, it returns FALSE.
+ * Arguments:
+ * * delay - the amount of time the sleep at the end of the check will sleep for
+ * * attacker - the attacking toy in the battle.
+ * * attacker_controller - the controller of the attacking toy. there should ALWAYS be an attacker_controller
+ * * opponent - (optional) the defender controller in the battle, for PvP
+ */
+
+/obj/item/toy/mecha/proc/combat_sleep(var/delay, obj/item/toy/mecha/attacker, mob/living/carbon/attacker_controller, mob/living/carbon/opponent)
+ if(!attacker_controller) // If the attacker for whatever reason is null, don't continue.
+ return FALSE
+
+ if(!attacker) // If there's no attacker, then attacker_controller IS the attacker.
+ if(!in_range(src, attacker_controller))
+ attacker_controller.visible_message("[attacker_controller] is running from [src]! The coward!")
+ return FALSE
+ else // If there's an attacker, we can procede as normal.
+ if(!in_range(src, attacker)) // The two toys aren't next to each other, the battle ends.
+ attacker_controller.visible_message(" [attacker] and [src] separate, ending the battle. ", \
+ " [attacker] and [src] separate, ending the battle. ")
+ return FALSE
+
+ // Dead men tell no tales, incapacitated men fight no fights.
+ if(attacker_controller.incapacitated())
+ return FALSE
+ // If the attacker_controller isn't next to the attacking toy (and doesn't have telekinesis), the battle ends.
+ if(!in_range(attacker, attacker_controller))
+ attacker_controller.visible_message(" [attacker_controller.name] seperates from [attacker], ending the battle.", \
+ " You separate from [attacker], ending the battle. ")
+ return FALSE
+
+ // If it's PVP and the opponent is not next to the defending(src) toy (and doesn't have telekinesis), the battle ends.
+ if(opponent)
+ if(opponent.incapacitated())
+ return FALSE
+ if(!in_range(src, opponent))
+ opponent.visible_message(" [opponent.name] seperates from [src], ending the battle.", \
+ " You separate from [src], ending the battle. ")
+ return FALSE
+ // If it's not PVP and the attacker_controller isn't next to the defending toy (and doesn't have telekinesis), the battle ends.
+ else
+ if (!in_range(src, attacker_controller))
+ attacker_controller.visible_message(" [attacker_controller.name] seperates from [src] and [attacker], ending the battle.", \
+ " You separate [attacker] and [src], ending the battle. ")
+ return FALSE
+
+ // 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)
+ to_chat(user, "You play with [src].")
+ timer = world.time + cooldown
+ playsound(user, 'sound/mecha/mechstep.ogg', 20, TRUE)
+ else
+ . = ..()
+
+/obj/item/toy/mecha/attack_hand(mob/user)
+ . = ..()
+ if(.)
+ return
+ if(loc == user)
+ attack_self(user)
+
+/**
+ * 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))
+ 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.
+ */
+/obj/item/toy/mecha/attack(mob/living/carbon/human/target, mob/living/carbon/human/user)
+ if(target == user)
+ to_chat(user, "Target another toy mech if you want to start a battle with yourself.")
+ return
+ else if(user.a_intent != I_HURT)
+ if(wants_to_battle) //prevent spamming someone with offers
+ to_chat(user, "You already are offering battle to someone!")
+ return
+ if(!check_battle_start(user)) //if the user's mech isn't ready, don't bother checking
+ return
+
+ for(var/obj/item/I in target.get_all_held_items())
+ if(istype(I, /obj/item/toy/mecha)) //if you attack someone with a mech who's also holding a mech, offer to battle them
+ var/obj/item/toy/mecha/M = I
+ if(!M.check_battle_start(target, null, user)) //check if the attacker mech is ready
+ break
+
+ //slap them with the metaphorical white glove
+ if(M.wants_to_battle) //if the target mech wants to battle, initiate the battle from their POV
+ mecha_brawl(M, target, user) //P = defender's mech / SRC = attacker's mech / target = defender / user = attacker
+ M.wants_to_battle = FALSE
+ return
+
+ //extend the offer of battle to the other mech
+ var/datum/gender/T = gender_datums[user.get_visible_gender()]
+ to_chat(user, "You offer battle to [target.name]!")
+ to_chat(target, "[user.name] wants to battle with [T.His] [name]! Attack them with a toy mech to initiate combat.")
+ wants_to_battle = TRUE
+ addtimer(CALLBACK(src, .proc/withdraw_offer, user), 6 SECONDS)
+ return
+
+ ..()
+
+/**
+ * Overrides attack_tk - Sorry, you have to be face to face to initiate a battle, it's good sportsmanship
+ */
+/obj/item/toy/mecha/attack_tk(mob/user)
+ if(timer < world.time)
+ to_chat(user, "You telekinetically play with [src].")
+ timer = world.time + cooldown
+ playsound(user, 'sound/mecha/mechstep.ogg', 20, TRUE)
+
+/**
+ * Resets the request for battle.
+ *
+ * For use in a timer, this proc resets the wants_to_battle variable after a short period.
+ * Arguments:
+ * * user - the user wanting to do battle
+ */
+/obj/item/toy/mecha/proc/withdraw_offer(mob/living/carbon/user)
+ if(wants_to_battle)
+ wants_to_battle = FALSE
+ to_chat(user, "You get the feeling they don't want to battle.")
+/**
+ * Starts a battle, toy mech vs player. Player... doesn't win. Commented out for now as suicide_act is not physically doable.
+ */
+/obj/item/toy/mecha/suicide_act(mob/living/carbon/user)
+ if(in_combat)
+ to_chat(user, "[src] is in battle, let it finish first.")
+ return
+
+ var/datum/gender/T = gender_datums[user.get_visible_gender()]
+ user.visible_message("[user] begins a fight [T.His] can't win with [src]! It looks like [T.His] trying to commit suicide!")
+
+ in_combat = TRUE
+ sleep(1.5 SECONDS)
+ for(var/i in 1 to 4)
+ switch(i)
+ if(1, 3)
+ SpinAnimation(5, 0)
+ playsound(src, 'sound/mecha/mechstep.ogg', 30, TRUE)
+ user.adjustBruteLoss(25)
+ if(2)
+ user.SpinAnimation(5, 0)
+ playsound(user, 'sound/weapons/smash.ogg', 20, TRUE)
+ combat_health-- //we scratched it!
+ if(4)
+ visible_message(special_attack_cry + "!!")
+
+ if(!combat_sleep(1 SECONDS, null, user))
+ visible_message("PATHETIC.")
+ combat_health = max_combat_health
+ in_combat = FALSE
+ return (BRUTELOSS)
+
+ sleep(0.5 SECONDS)
+ user.adjustBruteLoss(450)
+
+ in_combat = FALSE
+ visible_message("AN EASY WIN. MY POWER INCREASES.") // steal a soul, become swole
+ color= "#ff7373"
+ max_combat_health = round(max_combat_health*1.5 + 0.1)
+ combat_health = max_combat_health
+ wins++
+ return (BRUTELOSS)
+
+/obj/item/toy/mecha/examine()
+ . = ..()
+ . += "This toy's special attack is [special_attack_cry], [special_attack_type_message] "
+ if(in_combat)
+ . += "This toy has a maximum health of [max_combat_health]. Currently, it's [combat_health]."
+ . += "Its special move light is [special_attack_cooldown? "flashing red." : "green and is ready!"]"
+ else
+ . += "This toy has a maximum health of [max_combat_health]."
+
+ if(wins || losses)
+ . += "This toy has [wins] wins, and [losses] losses."
+
+/**
+ * The 'master' proc of the mech battle. Processes the entire battle's events and makes sure it start and finishes correctly.
+ *
+ * src is the defending toy, and the battle proc is called on it to begin the battle.
+ * After going through a few checks at the beginning to ensure the battle can start properly, the battle begins a loop that lasts
+ * until either toy has no more health. During this loop, it also ensures the mechs stay in combat range of each other.
+ * It will then randomly decide attacks for each toy, occasionally making one or the other use their special attack.
+ * When either mech has no more health, the loop ends, and it displays the victor and the loser while updating their stats and resetting them.
+ * Arguments:
+ * * attacker - the attacking toy, the toy in the attacker_controller's hands
+ * * attacker_controller - the user, the one who is holding the toys / controlling the fight
+ * * opponent - optional arg used in Mech PvP battles: the other person who is taking part in the fight (controls src)
+ */
+/obj/item/toy/mecha/proc/mecha_brawl(obj/item/toy/mecha/attacker, mob/living/carbon/attacker_controller, mob/living/carbon/opponent)
+ //A GOOD DAY FOR A SWELL BATTLE!
+ attacker_controller.visible_message(" [attacker_controller.name] collides [attacker] with [src]! Looks like they're preparing for a brawl! ", \
+ " You collide [attacker] into [src], sparking a fierce battle! ", \
+ " You hear hard plastic smacking into hard plastic.")
+
+ /// Who's in control of the defender (src)?
+ var/mob/living/carbon/src_controller = (opponent)? opponent : attacker_controller
+ /// How long has the battle been going?
+ var/battle_length = 0
+
+ in_combat = TRUE
+ attacker.in_combat = TRUE
+
+ //1.5 second cooldown * 20 = 30 second cooldown after a fight
+ timer = world.time + cooldown*cooldown_multiplier
+ attacker.timer = world.time + attacker.cooldown*attacker.cooldown_multiplier
+
+ sleep(1 SECONDS)
+ //--THE BATTLE BEGINS--
+ 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
+
+ //before we do anything - deal with charged attacks
+ if(special_attack_charged)
+ src_controller.visible_message(" [src] unleashes its special attack!! ", \
+ " You unleash [src]'s special attack! ")
+ special_attack_move(attacker)
+ else if(attacker.special_attack_charged)
+
+ attacker_controller.visible_message(" [attacker] unleashes its special attack!! ", \
+ " You unleash [attacker]'s special attack! ")
+ attacker.special_attack_move(src)
+ else
+ //process the cooldowns
+ if(special_attack_cooldown > 0)
+ special_attack_cooldown--
+ if(attacker.special_attack_cooldown > 0)
+ attacker.special_attack_cooldown--
+
+ //combat commences
+ switch(rand(1,8))
+ if(1 to 3) //attacker wins
+ if(attacker.special_attack_cooldown == 0 && attacker.combat_health <= round(attacker.max_combat_health/3)) //if health is less than 1/3 and special off CD, use it
+ 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
+ attacker.SpinAnimation(5, 0)
+ playsound(attacker, 'sound/mecha/mechstep.ogg', 30, TRUE)
+ combat_health--
+ attacker_controller.visible_message(" [attacker] devastates [src]! ", \
+ " You ram [attacker] into [src]! ", \
+ " You hear hard plastic smacking hard plastic.")
+ if(prob(5))
+ combat_health--
+ playsound(src, 'sound/effects/meteorimpact.ogg', 20, TRUE)
+ attacker_controller.visible_message(" ...and lands a CRIPPLING BLOW! ", \
+ " ...and you land a CRIPPLING blow on [src]! ", null)
+
+ if(4) //both lose
+ attacker.SpinAnimation(5, 0)
+ SpinAnimation(5, 0)
+ combat_health--
+ attacker.combat_health--
+ // This is sloppy but we don't have do_sparks.
+ var/datum/effect/effect/system/spark_spread/sparksrc = new(src)
+ playsound(src, "sparks", 50, 1)
+ sparksrc.set_up(2, 0, src)
+ sparksrc.attach(src)
+ sparksrc.start()
+ var/datum/effect/effect/system/spark_spread/sparkatk = new(attacker)
+ playsound(attacker, "sparks", 50, 1)
+ sparkatk.set_up(2, 0, attacker)
+ sparkatk.attach(attacker)
+ sparkatk.start()
+ if(prob(50))
+ attacker_controller.visible_message(" [attacker] and [src] clash dramatically, causing sparks to fly! ", \
+ " [attacker] and [src] clash dramatically, causing sparks to fly! ", \
+ " You hear hard plastic rubbing against hard plastic.")
+ else
+ src_controller.visible_message(" [src] and [attacker] clash dramatically, causing sparks to fly! ", \
+ " [src] and [attacker] clash dramatically, causing sparks to fly! ", \
+ " You hear hard plastic rubbing against hard plastic.")
+ if(5) //both win
+ playsound(attacker, 'sound/weapons/parry.ogg', 20, TRUE)
+ if(prob(50))
+ attacker_controller.visible_message(" [src]'s attack deflects off of [attacker]. ", \
+ " [src]'s attack deflects off of [attacker]. ", \
+ " You hear hard plastic bouncing off hard plastic.")
+ else
+ src_controller.visible_message(" [attacker]'s attack deflects off of [src]. ", \
+ " [attacker]'s attack deflects off of [src]. ", \
+ " You hear hard plastic bouncing off hard plastic.")
+
+ if(6 to 8) //defender wins
+ if(special_attack_cooldown == 0 && combat_health <= round(max_combat_health/3)) //if health is less than 1/3 and special off CD, use it
+ special_attack_charged = TRUE
+ src_controller.visible_message(" [src] begins charging its special attack!! ", \
+ " You begin charging [src]'s special attack! ")
+ else //just attack
+ SpinAnimation(5, 0)
+ playsound(src, 'sound/mecha/mechstep.ogg', 30, TRUE)
+ attacker.combat_health--
+ src_controller.visible_message(" [src] smashes [attacker]! ", \
+ " You smash [src] into [attacker]! ", \
+ " You hear hard plastic smashing hard plastic.")
+ if(prob(5))
+ 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)
+ else
+ attacker_controller.visible_message(" [src] and [attacker] stand around awkwardly.", \
+ " You don't know what to do next.")
+
+ battle_length++
+ sleep(0.5 SECONDS)
+
+ /// Lines chosen for the winning mech
+ var/list/winlines = list("YOU'RE NOTHING BUT SCRAP!", "I'LL YIELD TO NONE!", "GLORY IS MINE!", "AN EASY FIGHT.", "YOU SHOULD HAVE NEVER FACED ME.", "ROCKED AND SOCKED.")
+
+ 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!")
+ else if(attacker.combat_health <= 0) //src wins
+ wins++
+ attacker.losses++
+ playsound(attacker, 'sound/effects/light_flicker.ogg', 20, TRUE)
+ attacker_controller.visible_message(" [attacker] falls apart!", \
+ " [attacker] falls apart!", null)
+ visible_message("[pick(winlines)]")
+ src_controller.visible_message(" [src] destroys [attacker] and walks away victorious!", \
+ " You raise up [src] victoriously over [attacker]!")
+ else if (combat_health <= 0) //attacker wins
+ attacker.wins++
+ losses++
+ playsound(src, 'sound/effects/light_flicker.ogg', 20, TRUE)
+ src_controller.visible_message(" [src] collapses!", \
+ " [src] collapses!", null)
+ attacker.visible_message("[pick(winlines)]")
+ attacker_controller.visible_message(" [attacker] demolishes [src] and walks away victorious!", \
+ " You raise up [attacker] proudly over [src]!")
+ else //both win?
+ visible_message("NEXT TIME.")
+ //don't want to make this a one sided conversation
+ quiet? attacker.visible_message("I WENT EASY ON YOU.") : attacker.visible_message("OF COURSE.")
+
+ in_combat = FALSE
+ attacker.in_combat = FALSE
+
+ combat_health = max_combat_health
+ attacker.combat_health = attacker.max_combat_health
+
+ return
+
+/**
+ * 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) 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
+ * * 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
+ 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)
+ to_chat(target, "Your [attacker.name] is in combat.")
+ return FALSE
+ if(in_combat)
+ to_chat(user, "Your [name] is in combat.")
+ if(target)
+ to_chat(target, "[T.His] [name] is in combat.")
+ return FALSE
+ if(attacker && attacker.timer > world.time)
+ to_chat(user, "[target?T.His : "Your" ] [attacker.name] isn't ready for battle.")
+ if(target)
+ to_chat(target, "Your [attacker.name] isn't ready for battle.")
+ return FALSE
+ if(timer > world.time)
+ to_chat(user, "Your [name] isn't ready for battle.")
+ if(target)
+ to_chat(target, "[T.His] [name] isn't ready for battle.")
+ return FALSE
+
+ return TRUE
+
+/**
+ * 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)
+ visible_message(special_attack_cry + "!!")
+
+ special_attack_charged = FALSE
+ special_attack_cooldown = 3
+
+ switch(special_attack_type)
+ if(SPECIAL_ATTACK_DAMAGE) //+2 damage
+ victim.combat_health-=2
+ playsound(src, 'sound/weapons/marauder.ogg', 20, TRUE)
+ if(SPECIAL_ATTACK_HEAL) //+2 healing
+ combat_health+=2
+ playsound(src, 'sound/mecha/mech_shield_raise.ogg', 20, TRUE)
+ if(SPECIAL_ATTACK_UTILITY) //+1 heal, +1 damage
+ victim.combat_health--
+ combat_health++
+ playsound(src, 'sound/mecha/mechmove01.ogg', 30, TRUE)
+ if(SPECIAL_ATTACK_OTHER) //other
+ super_special_attack(victim)
+ else
+ visible_message("I FORGOT MY SPECIAL ATTACK...")
+
+/**
+ * Base proc for 'other' special attack moves.
+ *
+ * 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)
+ visible_message(" [src] does a cool flip.")
+
+/obj/random/mech_toy
+ name = "Random Mech Toy"
+ desc = "This is a random mech toy."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "ripleytoy"
+
+/obj/random/mech_toy/item_to_spawn()
+ return pick(typesof(/obj/item/toy/mecha))
+
+/obj/item/toy/mecha/ripley
+ name = "toy ripley"
+ desc = "Mini-Mecha action figure! Collect them all! 1/11."
+ max_combat_health = 4 // 200 integrity
+ special_attack_type = SPECIAL_ATTACK_DAMAGE
+ special_attack_cry = "GIGA DRILL BREAK"
+
+/obj/item/toy/mecha/fireripley
+ name = "toy firefighting ripley"
+ desc = "Mini-Mecha action figure! Collect them all! 2/11."
+ icon_state = "fireripleytoy"
+ max_combat_health = 5 // 250 integrity?
+ special_attack_type = SPECIAL_ATTACK_UTILITY
+ special_attack_cry = "FIRE SHIELD"
+
+/obj/item/toy/mecha/deathripley
+ name = "toy deathsquad ripley"
+ desc = "Mini-Mecha action figure! Collect them all! 3/11."
+ icon_state = "deathripleytoy"
+ max_combat_health = 5 // 250 integrity
+ 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)
+ 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!!")
+ victim.combat_health = 0
+ else // Otherwise, just deal one damage.
+ victim.combat_health--
+
+/obj/item/toy/mecha/gygax
+ name = "toy gygax"
+ desc = "Mini-Mecha action figure! Collect them all! 4/11."
+ icon_state = "gygaxtoy"
+ max_combat_health = 5 // 250 integrity
+ special_attack_type = SPECIAL_ATTACK_UTILITY
+ special_attack_cry = "SUPER SERVOS"
+
+/obj/item/toy/mecha/durand
+ name = "toy durand"
+ desc = "Mini-Mecha action figure! Collect them all! 5/11."
+ icon_state = "durandtoy"
+ max_combat_health = 6 // 400 integrity
+ special_attack_type = SPECIAL_ATTACK_HEAL
+ special_attack_cry = "SHIELD OF PROTECTION"
+
+/obj/item/toy/mecha/honk
+ name = "toy H.O.N.K."
+ desc = "Mini-Mecha action figure! Collect them all! 6/11."
+ icon_state = "honktoy"
+ max_combat_health = 4 // 140 integrity
+ special_attack_type = SPECIAL_ATTACK_OTHER
+ 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)
+ 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++
+
+/obj/item/toy/mecha/marauder
+ name = "toy marauder"
+ desc = "Mini-Mecha action figure! Collect them all! 7/11."
+ icon_state = "maraudertoy"
+ max_combat_health = 7 // 500 integrity
+ special_attack_type = SPECIAL_ATTACK_DAMAGE
+ special_attack_cry = "BEAM BLAST"
+
+/obj/item/toy/mecha/seraph
+ name = "toy seraph"
+ desc = "Mini-Mecha action figure! Collect them all! 8/11."
+ icon_state = "seraphtoy"
+ max_combat_health = 8 // 550 integrity
+ special_attack_type = SPECIAL_ATTACK_DAMAGE
+ special_attack_cry = "ROCKET BARRAGE"
+
+/obj/item/toy/mecha/mauler
+ name = "toy mauler"
+ desc = "Mini-Mecha action figure! Collect them all! 9/11."
+ icon_state = "maulertoy"
+ max_combat_health = 7 // 500 integrity
+ special_attack_type = SPECIAL_ATTACK_DAMAGE
+ special_attack_cry = "BULLET STORM"
+
+/obj/item/toy/mecha/odysseus
+ name = "toy odysseus"
+ desc = "Mini-Mecha action figure! Collect them all! 10/11."
+ icon_state = "odysseustoy"
+ max_combat_health = 4 // 120 integrity
+ special_attack_type = SPECIAL_ATTACK_HEAL
+ special_attack_cry = "MECHA BEAM"
+
+/obj/item/toy/mecha/phazon
+ name = "toy phazon"
+ desc = "Mini-Mecha action figure! Collect them all! 11/11."
+ icon_state = "phazontoy"
+ max_combat_health = 6 // 200 integrity
+ special_attack_type = SPECIAL_ATTACK_UTILITY
+ special_attack_cry = "NO-CLIP"
+
+/* // TG-Station Added toys, commenting these out until I port 'em later.
+/obj/item/toy/mecha/reticence
+ name = "toy Reticence"
+ desc = "12/13"
+ icon_state = "reticencetoy"
+ quiet = TRUE
+ max_combat_health = 4 //100 integrity
+ special_attack_type = SPECIAL_ATTACK_OTHER
+ 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)
+ 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.
+
+/obj/item/toy/mecha/clarke
+ name = "toy Clarke"
+ desc = "13/13"
+ icon_state = "clarketoy"
+ max_combat_health = 4 //200 integrity
+ special_attack_type = SPECIAL_ATTACK_UTILITY
+ special_attack_cry = "ROLL OUT"
+*/
+
+#undef SPECIAL_ATTACK_HEAL
+#undef SPECIAL_ATTACK_DAMAGE
+#undef SPECIAL_ATTACK_UTILITY
+#undef SPECIAL_ATTACK_OTHER
+#undef MAX_BATTLE_LENGTH
\ No newline at end of file
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys/toys.dm
similarity index 92%
rename from code/game/objects/items/toys.dm
rename to code/game/objects/items/toys/toys.dm
index 7873f78a60..7ce9851c7b 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys/toys.dm
@@ -1,1530 +1,1441 @@
-/* Toys!
- * Contains:
- * Balloons
- * Fake telebeacon
- * Fake singularity
- * Toy gun
- * Toy crossbow
- * Toy swords
- * Toy bosun's whistle
- * Toy mechs
- * Snap pops
- * Water flower
- * Therapy dolls
- * Toddler doll
- * Inflatable duck
- * Action figures
- * Plushies
- * Toy cult sword
- * Bouquets
- Stick Horse
- */
-
-
-/obj/item/toy
- throwforce = 0
- throw_speed = 4
- throw_range = 20
- force = 0
- drop_sound = 'sound/items/drop/gloves.ogg'
-
-
-/*
- * Balloons
- */
-/obj/item/toy/balloon
- name = "water balloon"
- desc = "A translucent balloon. There's nothing in it."
- icon = 'icons/obj/toy.dmi'
- icon_state = "waterballoon-e"
- drop_sound = 'sound/items/drop/rubber.ogg'
-
-/obj/item/toy/balloon/New()
- var/datum/reagents/R = new/datum/reagents(10)
- reagents = R
- R.my_atom = src
-
-/obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob)
- return
-
-/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user as mob, proximity)
- if(!proximity) return
- if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1)
- A.reagents.trans_to_obj(src, 10)
- to_chat(user, "You fill the balloon with the contents of [A].")
- src.desc = "A translucent balloon with some form of liquid sloshing around in it."
- src.update_icon()
- return
-
-/obj/item/toy/balloon/attackby(obj/O as obj, mob/user as mob)
- if(istype(O, /obj/item/weapon/reagent_containers/glass))
- if(O.reagents)
- if(O.reagents.total_volume < 1)
- to_chat(user, "The [O] is empty.")
- else if(O.reagents.total_volume >= 1)
- if(O.reagents.has_reagent("pacid", 1))
- to_chat(user, "The acid chews through the balloon!")
- O.reagents.splash(user, reagents.total_volume)
- qdel(src)
- else
- src.desc = "A translucent balloon with some form of liquid sloshing around in it."
- to_chat(user, "You fill the balloon with the contents of [O].")
- O.reagents.trans_to_obj(src, 10)
- src.update_icon()
- return
-
-/obj/item/toy/balloon/throw_impact(atom/hit_atom)
- if(src.reagents.total_volume >= 1)
- src.visible_message("\The [src] bursts!","You hear a pop and a splash.")
- src.reagents.touch_turf(get_turf(hit_atom))
- for(var/atom/A in get_turf(hit_atom))
- src.reagents.touch(A)
- src.icon_state = "burst"
- spawn(5)
- if(src)
- qdel(src)
- return
-
-/obj/item/toy/balloon/update_icon()
- if(src.reagents.total_volume >= 1)
- icon_state = "waterballoon"
- else
- icon_state = "waterballoon-e"
-
-/obj/item/toy/syndicateballoon
- name = "criminal balloon"
- desc = "There is a tag on the back that reads \"FUK NT!11!\"."
- throwforce = 0
- throw_speed = 4
- throw_range = 20
- force = 0
- icon = 'icons/obj/weapons.dmi'
- icon_state = "syndballoon"
- w_class = ITEMSIZE_LARGE
- drop_sound = 'sound/items/drop/rubber.ogg'
-
-/obj/item/toy/nanotrasenballoon
- name = "criminal balloon"
- desc = "Across the balloon the following is printed: \"Man, I love NanoTrasen soooo much. I use only NT products. You have NO idea.\""
- throwforce = 0
- throw_speed = 4
- throw_range = 20
- force = 0
- icon = 'icons/obj/weapons.dmi'
- icon_state = "ntballoon"
- w_class = ITEMSIZE_LARGE
- drop_sound = 'sound/items/drop/rubber.ogg'
-
-/*
- * Fake telebeacon
- */
-/obj/item/toy/blink
- name = "electronic blink toy game"
- desc = "Blink. Blink. Blink. Ages 8 and up."
- icon = 'icons/obj/radio.dmi'
- icon_state = "beacon"
- item_state = "signaler"
-
-/*
- * Fake singularity
- */
-/obj/item/toy/spinningtoy
- name = "gravitational singularity"
- desc = "\"Singulo\" brand spinning toy."
- 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'
-
- examine(mob/user)
- . = ..()
- if(bullets && get_dist(user, src) <= 2)
- . += "It is loaded with [bullets] foam darts!"
-
- 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.")
-
-
- 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)
-
-
- 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 = 1
- density = 0
-
-/*
- * Toy swords
- */
-/obj/item/toy/sword
- name = "toy sword"
- desc = "A cheap, plastic replica of an energy sword. Realistic sounds! Ages 8 and up."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "esword"
- drop_sound = 'sound/items/drop/gun.ogg'
- var/lcolor
- var/rainbow = FALSE
- item_icons = list(
- slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
- slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
- )
- var/active = 0
- w_class = ITEMSIZE_SMALL
- attack_verb = list("attacked", "struck", "hit")
-
- attack_self(mob/user as mob)
- src.active = !( src.active )
- if (src.active)
- to_chat(user, "You extend the plastic blade with a quick flick of your wrist.")
- playsound(src, 'sound/weapons/saberon.ogg', 50, 1)
- src.item_state = "[icon_state]_blade"
- src.w_class = ITEMSIZE_LARGE
- else
- to_chat(user, "You push the plastic blade back down into the handle.")
- playsound(src, 'sound/weapons/saberoff.ogg', 50, 1)
- src.item_state = "[icon_state]"
- src.w_class = ITEMSIZE_SMALL
- update_icon()
- src.add_fingerprint(user)
- return
-
-/obj/item/toy/sword/update_icon()
- . = ..()
- var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade")
- blade_overlay.color = lcolor
- cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
- if(active)
- add_overlay(blade_overlay)
- if(istype(usr,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = usr
- H.update_inv_l_hand()
- H.update_inv_r_hand()
-
-/obj/item/toy/sword/AltClick(mob/living/user)
- if(!in_range(src, user)) //Basic checks to prevent abuse
- return
- if(user.incapacitated() || !istype(user))
- to_chat(user, "You can't do that right now!")
- return
-
- if(alert("Are you sure you want to recolor your blade?", "Confirm Recolor", "Yes", "No") == "Yes")
- var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null
- if(energy_color_input)
- lcolor = sanitize_hexcolor(energy_color_input)
- update_icon()
-
-/obj/item/toy/sword/examine(mob/user)
- . = ..()
- . += "Alt-click to recolor it."
-
-/obj/item/toy/sword/attackby(obj/item/weapon/W, mob/user)
- if(istype(W, /obj/item/device/multitool) && !active)
- if(!rainbow)
- rainbow = TRUE
- else
- rainbow = FALSE
- to_chat(user, "You manipulate the color controller in [src].")
- update_icon()
-/obj/item/toy/katana
- name = "replica katana"
- desc = "Woefully underpowered in D20."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "katana"
- item_state = "katana"
- item_icons = list(
- slot_l_hand_str = 'icons/mob/items/lefthand_material.dmi',
- slot_r_hand_str = 'icons/mob/items/righthand_material.dmi',
- )
- slot_flags = SLOT_BELT | SLOT_BACK
- force = 5
- throwforce = 5
- w_class = ITEMSIZE_NORMAL
- attack_verb = list("attacked", "slashed", "stabbed", "sliced")
-
-/*
- * Snap pops
- */
-/obj/item/toy/snappop
- name = "snap pop"
- desc = "Wow!"
- icon = 'icons/obj/toy.dmi'
- icon_state = "snappop"
- w_class = ITEMSIZE_TINY
- drop_sound = null
-
- throw_impact(atom/hit_atom)
- ..()
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- new /obj/effect/decal/cleanable/ash(src.loc)
- src.visible_message("The [src.name] explodes!","You hear a snap!")
- playsound(src, 'sound/effects/snap.ogg', 50, 1)
- qdel(src)
-
-/obj/item/toy/snappop/Crossed(atom/movable/H as mob|obj)
- if(H.is_incorporeal())
- return
- if((ishuman(H))) //i guess carp and shit shouldn't set them off
- var/mob/living/carbon/M = H
- if(M.m_intent == "run")
- to_chat(M, "You step on the snap pop!")
-
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(2, 0, src)
- s.start()
- new /obj/effect/decal/cleanable/ash(src.loc)
- src.visible_message("The [src.name] explodes!","You hear a snap!")
- playsound(src, 'sound/effects/snap.ogg', 50, 1)
- qdel(src)
-
-/*
- * 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."
- icon = 'icons/obj/toy.dmi'
- icon_state = "bosunwhistle"
- drop_sound = 'sound/items/drop/card.ogg'
- var/cooldown = 0
- w_class = ITEMSIZE_TINY
- slot_flags = SLOT_EARS | SLOT_HOLSTER
-
-/obj/item/toy/bosunwhistle/attack_self(mob/user as mob)
- if(cooldown < world.time - 35)
- to_chat(user, "You blow on [src], creating an ear-splitting noise!")
- playsound(src, 'sound/misc/boatswain.ogg', 20, 1)
- cooldown = world.time
-
-/*
- * Mech prizes
- */
-/obj/item/toy/prize
- icon = 'icons/obj/toy.dmi'
- icon_state = "ripleytoy"
- var/cooldown = 0
- drop_sound = 'sound/mecha/mechstep.ogg'
-
-//all credit to skasi for toy mech fun ideas
-/obj/item/toy/prize/attack_self(mob/user as mob)
- if(cooldown < world.time - 8)
- to_chat(user, "You play with [src].")
- playsound(src, 'sound/mecha/mechstep.ogg', 20, 1)
- cooldown = world.time
-
-/obj/item/toy/prize/attack_hand(mob/user as mob)
- if(loc == user)
- if(cooldown < world.time - 8)
- to_chat(user, "You play with [src].")
- playsound(src, 'sound/mecha/mechturn.ogg', 20, 1)
- cooldown = world.time
- return
- ..()
-
-/obj/random/mech_toy
- name = "Random Mech Toy"
- desc = "This is a random mech toy."
- icon = 'icons/obj/toy.dmi'
- icon_state = "ripleytoy"
-
-/obj/random/mech_toy/item_to_spawn()
- return pick(typesof(/obj/item/toy/prize))
-
-/obj/item/toy/prize/ripley
- name = "toy ripley"
- desc = "Mini-Mecha action figure! Collect them all! 1/11."
-
-/obj/item/toy/prize/fireripley
- name = "toy firefighting ripley"
- desc = "Mini-Mecha action figure! Collect them all! 2/11."
- icon_state = "fireripleytoy"
-
-/obj/item/toy/prize/deathripley
- name = "toy deathsquad ripley"
- desc = "Mini-Mecha action figure! Collect them all! 3/11."
- icon_state = "deathripleytoy"
-
-/obj/item/toy/prize/gygax
- name = "toy gygax"
- desc = "Mini-Mecha action figure! Collect them all! 4/11."
- icon_state = "gygaxtoy"
-
-/obj/item/toy/prize/durand
- name = "toy durand"
- desc = "Mini-Mecha action figure! Collect them all! 5/11."
- icon_state = "durandprize"
-
-/obj/item/toy/prize/honk
- name = "toy H.O.N.K."
- desc = "Mini-Mecha action figure! Collect them all! 6/11."
- icon_state = "honkprize"
-
-/obj/item/toy/prize/marauder
- name = "toy marauder"
- desc = "Mini-Mecha action figure! Collect them all! 7/11."
- icon_state = "marauderprize"
-
-/obj/item/toy/prize/seraph
- name = "toy seraph"
- desc = "Mini-Mecha action figure! Collect them all! 8/11."
- icon_state = "seraphprize"
-
-/obj/item/toy/prize/mauler
- name = "toy mauler"
- desc = "Mini-Mecha action figure! Collect them all! 9/11."
- icon_state = "maulerprize"
-
-/obj/item/toy/prize/odysseus
- name = "toy odysseus"
- desc = "Mini-Mecha action figure! Collect them all! 10/11."
- icon_state = "odysseusprize"
-
-/obj/item/toy/prize/phazon
- name = "toy phazon"
- desc = "Mini-Mecha action figure! Collect them all! 11/11."
- icon_state = "phazonprize"
-
-/*
- * Action figures
- */
-/obj/item/toy/figure
- name = "Non-Specific Action Figure action figure"
- desc = "A \"Space Life\" brand... wait, what the hell is this thing?"
- icon = 'icons/obj/toy.dmi'
- icon_state = "nuketoy"
- var/cooldown = 0
- var/toysay = "What the fuck did you do?"
- drop_sound = 'sound/items/drop/accessory.ogg'
-
-/obj/item/toy/figure/New()
- ..()
- desc = "A \"Space Life\" brand [name]"
-
-/obj/item/toy/figure/attack_self(mob/user as mob)
- if(cooldown < world.time)
- cooldown = (world.time + 30) //3 second cooldown
- user.visible_message("The [src] says \"[toysay]\".")
- playsound(src, 'sound/machines/click.ogg', 20, 1)
-
-/obj/item/toy/figure/cmo
- name = "Chief Medical Officer action figure"
- desc = "A \"Space Life\" brand Chief Medical Officer action figure."
- icon_state = "cmo"
- toysay = "Suit sensors!"
-
-/obj/item/toy/figure/assistant
- name = "Assistant action figure"
- desc = "A \"Space Life\" brand Assistant action figure."
- icon_state = "assistant"
- toysay = "Grey tide station wide!"
-
-/obj/item/toy/figure/atmos
- name = "Atmospheric Technician action figure"
- desc = "A \"Space Life\" brand Atmospheric Technician action figure."
- icon_state = "atmos"
- toysay = "Glory to Atmosia!"
-
-/obj/item/toy/figure/bartender
- name = "Bartender action figure"
- desc = "A \"Space Life\" brand Bartender action figure."
- icon_state = "bartender"
- toysay = "Where's my monkey?"
-
-/obj/item/toy/figure/borg
- name = "Drone action figure"
- desc = "A \"Space Life\" brand Drone action figure."
- icon_state = "borg"
- toysay = "I. LIVE. AGAIN."
-
-/obj/item/toy/figure/gardener
- name = "Gardener action figure"
- desc = "A \"Space Life\" brand Gardener action figure."
- icon_state = "botanist"
- toysay = "Dude, I see colors..."
-
-/obj/item/toy/figure/captain
- name = "Colony Director action figure"
- desc = "A \"Space Life\" brand Colony Director action figure."
- icon_state = "captain"
- toysay = "How do I open this display case?"
-
-/obj/item/toy/figure/cargotech
- name = "Cargo Technician action figure"
- desc = "A \"Space Life\" brand Cargo Technician action figure."
- icon_state = "cargotech"
- toysay = "For Cargonia!"
-
-/obj/item/toy/figure/ce
- name = "Chief Engineer action figure"
- desc = "A \"Space Life\" brand Chief Engineer action figure."
- icon_state = "ce"
- toysay = "Wire the solars!"
-
-/obj/item/toy/figure/chaplain
- name = "Chaplain action figure"
- desc = "A \"Space Life\" brand Chaplain action figure."
- icon_state = "chaplain"
- toysay = "Gods make me a killing machine please!"
-
-/obj/item/toy/figure/chef
- name = "Chef action figure"
- desc = "A \"Space Life\" brand Chef action figure."
- icon_state = "chef"
- toysay = "I swear it's not human meat."
-
-/obj/item/toy/figure/chemist
- name = "Chemist action figure"
- desc = "A \"Space Life\" brand Chemist action figure."
- icon_state = "chemist"
- toysay = "Get your pills!"
-
-/obj/item/toy/figure/clown
- name = "Clown action figure"
- desc = "A \"Space Life\" brand Clown action figure."
- icon_state = "clown"
- toysay = "Honk!"
-
-/obj/item/toy/figure/corgi
- name = "Corgi action figure"
- desc = "A \"Space Life\" brand Corgi action figure."
- icon_state = "ian"
- toysay = "Arf!"
-
-/obj/item/toy/figure/detective
- name = "Detective action figure"
- desc = "A \"Space Life\" brand Detective action figure."
- icon_state = "detective"
- toysay = "This airlock has grey jumpsuit and insulated glove fibers on it."
-
-/obj/item/toy/figure/dsquad
- name = "Space Commando action figure"
- desc = "A \"Space Life\" brand Space Commando action figure."
- icon_state = "dsquad"
- toysay = "Eliminate all threats!"
-
-/obj/item/toy/figure/engineer
- name = "Engineer action figure"
- desc = "A \"Space Life\" brand Engineer action figure."
- icon_state = "engineer"
- toysay = "Oh god, the engine is gonna go!"
-
-/obj/item/toy/figure/geneticist
- name = "Geneticist action figure"
- desc = "A \"Space Life\" brand Geneticist action figure, which was recently dicontinued."
- icon_state = "geneticist"
- toysay = "I'm not qualified for this job."
-
-/obj/item/toy/figure/hop
- name = "Head of Personnel action figure"
- desc = "A \"Space Life\" brand Head of Personnel action figure."
- icon_state = "hop"
- toysay = "Giving out all access!"
-
-/obj/item/toy/figure/hos
- name = "Head of Security action figure"
- desc = "A \"Space Life\" brand Head of Security action figure."
- icon_state = "hos"
- toysay = "I'm here to win, anything else is secondary."
-
-/obj/item/toy/figure/qm
- name = "Quartermaster action figure"
- desc = "A \"Space Life\" brand Quartermaster action figure."
- icon_state = "qm"
- toysay = "Hail Cargonia!"
-
-/obj/item/toy/figure/janitor
- name = "Janitor action figure"
- desc = "A \"Space Life\" brand Janitor action figure."
- icon_state = "janitor"
- toysay = "Look at the signs, you idiot."
-
-/obj/item/toy/figure/agent
- name = "Internal Affairs Agent action figure"
- desc = "A \"Space Life\" brand Internal Affairs Agent action figure."
- icon_state = "agent"
- toysay = "Standard Operating Procedure says they're guilty! Hacking is proof they're an Enemy of the Corporation!"
-
-/obj/item/toy/figure/librarian
- name = "Librarian action figure"
- desc = "A \"Space Life\" brand Librarian action figure."
- icon_state = "librarian"
- toysay = "One day while..."
-
-/obj/item/toy/figure/md
- name = "Medical Doctor action figure"
- desc = "A \"Space Life\" brand Medical Doctor action figure."
- icon_state = "md"
- toysay = "The patient is already dead!"
-
-/obj/item/toy/figure/mime
- name = "Mime action figure"
- desc = "A \"Space Life\" brand Mime action figure."
- icon_state = "mime"
- toysay = "..."
-
-/obj/item/toy/figure/miner
- name = "Shaft Miner action figure"
- desc = "A \"Space Life\" brand Shaft Miner action figure."
- icon_state = "miner"
- toysay = "Oh god, it's eating my intestines!"
-
-/obj/item/toy/figure/ninja
- name = "Space Ninja action figure"
- desc = "A \"Space Life\" brand Space Ninja action figure."
- icon_state = "ninja"
- toysay = "Oh god! Stop shooting, I'm friendly!"
-
-/obj/item/toy/figure/wizard
- name = "Wizard action figure"
- desc = "A \"Space Life\" brand Wizard action figure."
- icon_state = "wizard"
- toysay = "Ei Nath!"
-
-/obj/item/toy/figure/rd
- name = "Research Director action figure"
- desc = "A \"Space Life\" brand Research Director action figure."
- icon_state = "rd"
- toysay = "Blowing all of the borgs!"
-
-/obj/item/toy/figure/roboticist
- name = "Roboticist action figure"
- desc = "A \"Space Life\" brand Roboticist action figure."
- icon_state = "roboticist"
- toysay = "He asked to be borged!"
-
-/obj/item/toy/figure/scientist
- name = "Scientist action figure"
- desc = "A \"Space Life\" brand Scientist action figure."
- icon_state = "scientist"
- toysay = "Someone else must have made those bombs!"
-
-/obj/item/toy/figure/syndie
- name = "Doom Operative action figure"
- desc = "A \"Space Life\" brand Doom Operative action figure."
- icon_state = "syndie"
- toysay = "Get that fucking disk!"
-
-/obj/item/toy/figure/secofficer
- name = "Security Officer action figure"
- desc = "A \"Space Life\" brand Security Officer action figure."
- icon_state = "secofficer"
- toysay = "I am the law!"
-
-/obj/item/toy/figure/virologist
- name = "Virologist action figure"
- desc = "A \"Space Life\" brand Virologist action figure."
- icon_state = "virologist"
- toysay = "The cure is potassium!"
-
-/obj/item/toy/figure/warden
- name = "Warden action figure"
- desc = "A \"Space Life\" brand Warden action figure."
- icon_state = "warden"
- toysay = "Execute him for breaking in!"
-
-/obj/item/toy/figure/psychologist
- name = "Psychologist action figure"
- desc = "A \"Space Life\" brand Psychologist action figure."
- icon_state = "psychologist"
- toysay = "The analyzer says you're fine!"
-
-/obj/item/toy/figure/paramedic
- name = "Paramedic action figure"
- desc = "A \"Space Life\" brand Paramedic action figure."
- icon_state = "paramedic"
- toysay = "WHERE ARE YOU??"
-
-/obj/item/toy/figure/ert
- name = "Emergency Response Team Commander action figure"
- desc = "A \"Space Life\" brand Emergency Response Team Commander action figure."
- icon_state = "ert"
- toysay = "We're probably the good guys!"
-
-/*
- * Plushies
- */
-
-/*
- * Carp plushie
- */
-
-/obj/item/toy/plushie/carp
- name = "space carp plushie"
- desc = "An adorable stuffed toy that resembles a space carp."
- icon = 'icons/obj/toy.dmi'
- icon_state = "basecarp"
- attack_verb = list("bitten", "eaten", "fin slapped")
- var/bitesound = 'sound/weapons/bite.ogg'
-
-// Attack mob
-/obj/item/toy/plushie/carp/attack(mob/M as mob, mob/user as mob)
- playsound(src, bitesound, 20, 1) // Play bite sound in local area
- return ..()
-
-// Attack self
-/obj/item/toy/plushie/carp/attack_self(mob/user as mob)
- playsound(src, bitesound, 20, 1)
- return ..()
-
-
-/obj/random/carp_plushie
- name = "Random Carp Plushie"
- desc = "This is a random plushie"
- icon = 'icons/obj/toy.dmi'
- icon_state = "basecarp"
-
-/obj/random/carp_plushie/item_to_spawn()
- return pick(typesof(/obj/item/toy/plushie/carp)) //can pick any carp plushie, even the original.
-
-/obj/item/toy/plushie/carp/ice
- name = "ice carp plushie"
- icon_state = "icecarp"
-
-/obj/item/toy/plushie/carp/silent
- name = "monochrome carp plushie"
- icon_state = "silentcarp"
-
-/obj/item/toy/plushie/carp/electric
- name = "electric carp plushie"
- icon_state = "electriccarp"
-
-/obj/item/toy/plushie/carp/gold
- name = "golden carp plushie"
- icon_state = "goldcarp"
-
-/obj/item/toy/plushie/carp/toxin
- name = "toxic carp plushie"
- icon_state = "toxincarp"
-
-/obj/item/toy/plushie/carp/dragon
- name = "dragon carp plushie"
- icon_state = "dragoncarp"
-
-/obj/item/toy/plushie/carp/pink
- name = "pink carp plushie"
- icon_state = "pinkcarp"
-
-/obj/item/toy/plushie/carp/candy
- name = "candy carp plushie"
- icon_state = "candycarp"
-
-/obj/item/toy/plushie/carp/nebula
- name = "nebula carp plushie"
- icon_state = "nebulacarp"
-
-/obj/item/toy/plushie/carp/void
- name = "void carp plushie"
- icon_state = "voidcarp"
-
-//Large plushies.
-/obj/structure/plushie
- name = "generic plush"
- desc = "A very generic plushie. It seems to not want to exist."
- icon = 'icons/obj/toy.dmi'
- icon_state = "ianplushie"
- anchored = 0
- density = 1
- var/phrase = "I don't want to exist anymore!"
- var/searching = FALSE
- var/opened = FALSE // has this been slit open? this will allow you to store an object in a plushie.
- var/obj/item/stored_item // Note: Stored items can't be bigger than the plushie itself.
-
-/obj/structure/plushie/examine(mob/user)
- . = ..()
- if(opened)
- . += "You notice an incision has been made on [src]."
- if(in_range(user, src) && stored_item)
- . += "You can see something in there..."
-
-/obj/structure/plushie/attack_hand(mob/user)
- user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
-
- if(stored_item && opened && !searching)
- searching = TRUE
- if(do_after(user, 10))
- to_chat(user, "You find \icon[stored_item] [stored_item] in [src]!")
- stored_item.forceMove(get_turf(src))
- stored_item = null
- searching = FALSE
- return
- else
- searching = FALSE
-
- if(user.a_intent == I_HELP)
- user.visible_message("\The [user] hugs [src]!","You hug [src]!")
- else if (user.a_intent == I_HURT)
- user.visible_message("\The [user] punches [src]!","You punch [src]!")
- else if (user.a_intent == I_GRAB)
- user.visible_message("\The [user] attempts to strangle [src]!","You attempt to strangle [src]!")
- else
- user.visible_message("\The [user] pokes the [src].","You poke the [src].")
- visible_message("[src] says, \"[phrase]\"")
-
-
-/obj/structure/plushie/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I, /obj/item/device/threadneedle) && opened)
- to_chat(user, "You sew the hole in [src].")
- opened = FALSE
- return
-
- if(is_sharp(I) && !opened)
- to_chat(user, "You open a small incision in [src]. You can place tiny items inside.")
- opened = TRUE
- return
-
- if(opened)
- if(stored_item)
- to_chat(user, "There is already something in here.")
- return
-
- if(!(I.w_class > w_class))
- to_chat(user, "You place [I] inside [src].")
- user.drop_from_inventory(I, src)
- I.forceMove(src)
- stored_item = I
- return
- else
- to_chat(user, "You open a small incision in [src]. You can place tiny items inside.")
-
-
- ..()
-
-/obj/structure/plushie/ian
- name = "plush corgi"
- desc = "A plushie of an adorable corgi! Don't you just want to hug it and squeeze it and call it \"Ian\"?"
- icon_state = "ianplushie"
- phrase = "Arf!"
-
-/obj/structure/plushie/drone
- name = "plush drone"
- desc = "A plushie of a happy drone! It appears to be smiling."
- icon_state = "droneplushie"
- phrase = "Beep boop!"
-
-/obj/structure/plushie/carp
- name = "plush carp"
- desc = "A plushie of an elated carp! Straight from the wilds of the Vir frontier, now right here in your hands."
- icon_state = "carpplushie"
- phrase = "Glorf!"
-
-/obj/structure/plushie/beepsky
- name = "plush Officer Sweepsky"
- desc = "A plushie of a popular industrious cleaning robot! If it could feel emotions, it would love you."
- icon_state = "beepskyplushie"
- phrase = "Ping!"
-
-//Small plushies.
-/obj/item/toy/plushie
- name = "generic small plush"
- desc = "A small toy plushie. It's very cute."
- icon = 'icons/obj/toy.dmi'
- icon_state = "nymphplushie"
- drop_sound = 'sound/items/drop/plushie.ogg'
- w_class = ITEMSIZE_TINY
- var/last_message = 0
- var/pokephrase = "Uww!"
- var/searching = FALSE
- var/opened = FALSE // has this been slit open? this will allow you to store an object in a plushie.
- var/obj/item/stored_item // Note: Stored items can't be bigger than the plushie itself.
-
-
-/obj/item/toy/plushie/examine(mob/user)
- . = ..()
- if(opened)
- . += "You notice an incision has been made on [src]."
- if(in_range(user, src) && stored_item)
- . += "You can see something in there..."
-
-/obj/item/toy/plushie/attack_self(mob/user as mob)
- if(stored_item && opened && !searching)
- searching = TRUE
- if(do_after(user, 10))
- to_chat(user, "You find \icon[stored_item] [stored_item] in [src]!")
- stored_item.forceMove(get_turf(src))
- stored_item = null
- searching = FALSE
- return
- else
- searching = FALSE
-
- if(world.time - last_message <= 1 SECOND)
- return
- if(user.a_intent == I_HELP)
- user.visible_message("\The [user] hugs [src]!","You hug [src]!")
- else if (user.a_intent == I_HURT)
- user.visible_message("\The [user] punches [src]!","You punch [src]!")
- else if (user.a_intent == I_GRAB)
- user.visible_message("\The [user] attempts to strangle [src]!","You attempt to strangle [src]!")
- else
- user.visible_message("\The [user] pokes [src].","You poke [src].")
- playsound(src, 'sound/items/drop/plushie.ogg', 25, 0)
- visible_message("[src] says, \"[pokephrase]\"")
- last_message = world.time
-
-/obj/item/toy/plushie/verb/rename_plushie()
- set name = "Name Plushie"
- set category = "Object"
- set desc = "Give your plushie a cute name!"
- var/mob/M = usr
- if(!M.mind)
- return 0
-
- var/input = sanitizeSafe(input("What do you want to name the plushie?", ,""), MAX_NAME_LEN)
-
- if(src && input && !M.stat && in_range(M,src))
- name = input
- to_chat(M, "You name the plushie [input], giving it a hug for good luck.")
- return 1
-
-/obj/item/toy/plushie/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I, /obj/item/toy/plushie) || istype(I, /obj/item/organ/external/head))
- user.visible_message("[user] makes \the [I] kiss \the [src]!.", \
- "You make \the [I] kiss \the [src]!.")
- return
-
-
- if(istype(I, /obj/item/device/threadneedle) && opened)
- to_chat(user, "You sew the hole underneath [src].")
- opened = FALSE
- return
-
- if(is_sharp(I) && !opened)
- to_chat(user, "You open a small incision in [src]. You can place tiny items inside.")
- opened = TRUE
- return
-
- if( (!(I.w_class > w_class)) && opened)
- if(stored_item)
- to_chat(user, "There is already something in here.")
- return
-
- to_chat(user, "You place [I] inside [src].")
- user.drop_from_inventory(I, src)
- I.forceMove(src)
- stored_item = I
- to_chat(user, "You placed [I] into [src].")
- return
-
- return ..()
-
-/obj/item/toy/plushie/nymph
- name = "diona nymph plush"
- desc = "A plushie of an adorable diona nymph! While its level of self-awareness is still being debated, its level of cuteness is not."
- icon_state = "nymphplushie"
- pokephrase = "Chirp!"
-
-/obj/item/toy/plushie/teshari
- name = "teshari plush"
- desc = "This is a plush teshari. Very soft, with a pompom on the tail. The toy is made well, as if alive. Looks like she is sleeping. Shhh!"
- icon_state = "teshariplushie"
- pokephrase = "Rya!"
-
-/obj/item/toy/plushie/mouse
- name = "mouse plush"
- desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend."
- icon_state = "mouseplushie" //TFF 12/11/19 - updated icon to show a sprite that doesn't replicate a dead mouse. Heck you for that! >:C
- pokephrase = "Squeak!"
-
-/obj/item/toy/plushie/kitten
- name = "kitten plush"
- desc = "A plushie of a cute kitten! Watch as it purrs its way right into your heart."
- icon_state = "kittenplushie"
- pokephrase = "Mrow!"
-
-/obj/item/toy/plushie/lizard
- name = "lizard plush"
- desc = "A plushie of a scaly lizard! Very controversial, after being accused as \"racist\" by some Unathi."
- icon_state = "lizardplushie"
- pokephrase = "Hiss!"
-
-/obj/item/toy/plushie/spider
- name = "spider plush"
- desc = "A plushie of a fuzzy spider! It has eight legs - all the better to hug you with."
- icon_state = "spiderplushie"
- pokephrase = "Sksksk!"
-
-/obj/item/toy/plushie/farwa
- name = "farwa plush"
- desc = "A farwa plush doll. It's soft and comforting!"
- icon_state = "farwaplushie"
- pokephrase = "Squaw!"
-
-/obj/item/toy/plushie/corgi
- name = "corgi plushie"
- icon_state = "corgi"
- pokephrase = "Woof!"
-
-/obj/item/toy/plushie/girly_corgi
- name = "corgi plushie"
- icon_state = "girlycorgi"
- pokephrase = "Arf!"
-
-/obj/item/toy/plushie/robo_corgi
- name = "borgi plushie"
- icon_state = "robotcorgi"
- pokephrase = "Bark."
-
-/obj/item/toy/plushie/octopus
- name = "octopus plushie"
- icon_state = "loveable"
- pokephrase = "Squish!"
-
-/obj/item/toy/plushie/face_hugger
- name = "facehugger plushie"
- icon_state = "huggable"
- pokephrase = "Hug!"
-
-//foxes are basically the best
-
-/obj/item/toy/plushie/red_fox
- name = "red fox plushie"
- icon_state = "redfox"
- pokephrase = "Gecker!"
-
-/obj/item/toy/plushie/black_fox
- name = "black fox plushie"
- icon_state = "blackfox"
- pokephrase = "Ack!"
-
-/obj/item/toy/plushie/marble_fox
- name = "marble fox plushie"
- icon_state = "marblefox"
- pokephrase = "Awoo!"
-
-/obj/item/toy/plushie/blue_fox
- name = "blue fox plushie"
- icon_state = "bluefox"
- pokephrase = "Yoww!"
-
-/obj/item/toy/plushie/orange_fox
- name = "orange fox plushie"
- icon_state = "orangefox"
- pokephrase = "Yagh!"
-
-/obj/item/toy/plushie/coffee_fox
- name = "coffee fox plushie"
- icon_state = "coffeefox"
- pokephrase = "Gerr!"
-
-/obj/item/toy/plushie/pink_fox
- name = "pink fox plushie"
- icon_state = "pinkfox"
- pokephrase = "Yack!"
-
-/obj/item/toy/plushie/purple_fox
- name = "purple fox plushie"
- icon_state = "purplefox"
- pokephrase = "Whine!"
-
-/obj/item/toy/plushie/crimson_fox
- name = "crimson fox plushie"
- icon_state = "crimsonfox"
- pokephrase = "Auuu!"
-
-/obj/item/toy/plushie/deer
- name = "deer plushie"
- icon_state = "deer"
- pokephrase = "Bleat!"
-
-/obj/item/toy/plushie/black_cat
- name = "black cat plushie"
- icon_state = "blackcat"
- pokephrase = "Mlem!"
-
-/obj/item/toy/plushie/grey_cat
- name = "grey cat plushie"
- icon_state = "greycat"
- pokephrase = "Mraw!"
-
-/obj/item/toy/plushie/white_cat
- name = "white cat plushie"
- icon_state = "whitecat"
- pokephrase = "Mew!"
-
-/obj/item/toy/plushie/orange_cat
- name = "orange cat plushie"
- icon_state = "orangecat"
- pokephrase = "Meow!"
-
-/obj/item/toy/plushie/siamese_cat
- name = "siamese cat plushie"
- icon_state = "siamesecat"
- pokephrase = "Mrew?"
-
-/obj/item/toy/plushie/tabby_cat
- name = "tabby cat plushie"
- icon_state = "tabbycat"
- pokephrase = "Purr!"
-
-/obj/item/toy/plushie/tuxedo_cat
- name = "tuxedo cat plushie"
- icon_state = "tuxedocat"
- pokephrase = "Mrowww!!"
-
-// nah, squids are better than foxes :>
-
-/obj/item/toy/plushie/squid/green
- name = "green squid plushie"
- desc = "A small, cute and loveable squid friend. This one is green."
- icon = 'icons/obj/toy.dmi'
- icon_state = "greensquid"
- slot_flags = SLOT_HEAD
- pokephrase = "Squrr!"
-
-/obj/item/toy/plushie/squid/mint
- name = "mint squid plushie"
- desc = "A small, cute and loveable squid friend. This one is mint coloured."
- icon = 'icons/obj/toy.dmi'
- icon_state = "mintsquid"
- slot_flags = SLOT_HEAD
- pokephrase = "Blurble!"
-
-/obj/item/toy/plushie/squid/blue
- name = "blue squid plushie"
- desc = "A small, cute and loveable squid friend. This one is blue."
- icon = 'icons/obj/toy.dmi'
- icon_state = "bluesquid"
- slot_flags = SLOT_HEAD
- pokephrase = "Blob!"
-
-/obj/item/toy/plushie/squid/orange
- name = "orange squid plushie"
- desc = "A small, cute and loveable squid friend. This one is orange."
- icon = 'icons/obj/toy.dmi'
- icon_state = "orangesquid"
- slot_flags = SLOT_HEAD
- pokephrase = "Squash!"
-
-/obj/item/toy/plushie/squid/yellow
- name = "yellow squid plushie"
- desc = "A small, cute and loveable squid friend. This one is yellow."
- icon = 'icons/obj/toy.dmi'
- icon_state = "yellowsquid"
- slot_flags = SLOT_HEAD
- pokephrase = "Glorble!"
-
-/obj/item/toy/plushie/squid/pink
- name = "pink squid plushie"
- desc = "A small, cute and loveable squid friend. This one is pink."
- icon = 'icons/obj/toy.dmi'
- icon_state = "pinksquid"
- slot_flags = SLOT_HEAD
- pokephrase = "Wobble!"
-
-/obj/item/toy/plushie/therapy/red
- name = "red therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is red."
- icon = 'icons/obj/toy.dmi'
- icon_state = "therapyred"
- item_state = "egg4" // It's the red egg in items_left/righthand
-
-/obj/item/toy/plushie/therapy/purple
- name = "purple therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is purple."
- icon = 'icons/obj/toy.dmi'
- icon_state = "therapypurple"
- item_state = "egg1" // It's the magenta egg in items_left/righthand
-
-/obj/item/toy/plushie/therapy/blue
- name = "blue therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is blue."
- icon = 'icons/obj/toy.dmi'
- icon_state = "therapyblue"
- item_state = "egg2" // It's the blue egg in items_left/righthand
-
-/obj/item/toy/plushie/therapy/yellow
- name = "yellow therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is yellow."
- icon = 'icons/obj/toy.dmi'
- icon_state = "therapyyellow"
- item_state = "egg5" // It's the yellow egg in items_left/righthand
-
-/obj/item/toy/plushie/therapy/orange
- name = "orange therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is orange."
- icon = 'icons/obj/toy.dmi'
- icon_state = "therapyorange"
- item_state = "egg4" // It's the red one again, lacking an orange item_state and making a new one is pointless
-
-/obj/item/toy/plushie/therapy/green
- name = "green therapy doll"
- desc = "A toy for therapeutic and recreational purposes. This one is green."
- icon = 'icons/obj/toy.dmi'
- icon_state = "therapygreen"
- item_state = "egg3" // It's the green egg in items_left/righthand
-
-
-//Toy cult sword
-/obj/item/toy/cultsword
- name = "foam sword"
- desc = "An arcane weapon (made of foam) wielded by the followers of the hit Saturday morning cartoon \"King Nursee and the Acolytes of Heroism\"."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "cultblade"
- item_icons = list(
- slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
- slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
- )
- w_class = ITEMSIZE_LARGE
- attack_verb = list("attacked", "slashed", "stabbed", "poked")
-
-//Flowers fake & real
-
-/obj/item/toy/bouquet
- name = "bouquet"
- desc = "A lovely bouquet of flowers. Smells nice!"
- icon = 'icons/obj/items.dmi'
- icon_state = "bouquet"
- w_class = ITEMSIZE_SMALL
-
-/obj/item/toy/bouquet/fake
- name = "plastic bouquet"
- desc = "A cheap plastic bouquet of flowers. Smells like cheap, toxic plastic."
-
-/obj/item/toy/stickhorse
- name = "stick horse"
- desc = "A pretend horse on a stick for any aspiring little cowboy to ride."
- icon = 'icons/obj/toy.dmi'
- icon_state = "stickhorse"
- w_class = ITEMSIZE_LARGE
-
-//////////////////////////////////////////////////////
-// Magic 8-Ball / Conch //
-//////////////////////////////////////////////////////
-
-/obj/item/toy/eight_ball
- name = "\improper Magic 8-Ball"
- desc = "Mystical! Magical! Ages 8+!"
- icon = 'icons/obj/toy.dmi'
- icon_state = "eight-ball"
- var/use_action = "shakes the ball"
- var/cooldown = 0
- var/list/possible_answers = list("Definitely.", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.")
-
-/obj/item/toy/eight_ball/attack_self(mob/user as mob)
- if(!cooldown)
- var/answer = pick(possible_answers)
- user.visible_message("[user] focuses on their question and [use_action]...")
- user.visible_message("The [src] says \"[answer]\"")
- spawn(30)
- cooldown = 0
- return
-
-/obj/item/toy/eight_ball/conch
- name = "Magic Conch shell"
- desc = "All hail the Magic Conch!"
- icon_state = "conch"
- use_action = "pulls the string"
- possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.")
-
-// DND Character minis. Use the naming convention (type)character for the icon states.
-/obj/item/toy/character
- icon = 'icons/obj/toy.dmi'
- w_class = ITEMSIZE_SMALL
- pixel_z = 5
-
-/obj/item/toy/character/alien
- name = "xenomorph xiniature"
- desc = "A miniature xenomorph. Scary!"
- icon_state = "aliencharacter"
-/obj/item/toy/character/cleric
- name = "cleric miniature"
- desc = "A wee little cleric, with his wee little staff."
- icon_state = "clericcharacter"
-/obj/item/toy/character/warrior
- name = "warrior miniature"
- desc = "That sword would make a decent toothpick."
- icon_state = "warriorcharacter"
-/obj/item/toy/character/thief
- name = "thief miniature"
- desc = "Hey, where did my wallet go!?"
- icon_state = "thiefcharacter"
-/obj/item/toy/character/wizard
- name = "wizard miniature"
- desc = "MAGIC!"
- icon_state = "wizardcharacter"
-/obj/item/toy/character/voidone
- name = "void one miniature"
- desc = "The dark lord has risen!"
- icon_state = "darkmastercharacter"
-/obj/item/toy/character/lich
- name = "lich miniature"
- desc = "Murderboner extraordinaire."
- icon_state = "lichcharacter"
-/obj/item/weapon/storage/box/characters
- name = "box of miniatures"
- desc = "The nerd's best friends."
- icon_state = "box"
-/obj/item/weapon/storage/box/characters/starts_with = list(
-// /obj/item/toy/character/alien,
- /obj/item/toy/character/cleric,
- /obj/item/toy/character/warrior,
- /obj/item/toy/character/thief,
- /obj/item/toy/character/wizard,
- /obj/item/toy/character/voidone,
- /obj/item/toy/character/lich
- )
-
-/obj/item/toy/AI
- name = "toy AI"
- desc = "A little toy model AI core!"// with real law announcing action!" //Alas, requires a rewrite of how ion laws work.
- icon = 'icons/obj/toy.dmi'
- icon_state = "AI"
- w_class = ITEMSIZE_SMALL
- var/cooldown = 0
-/*
-/obj/item/toy/AI/attack_self(mob/user)
- if(!cooldown) //for the sanity of everyone
- var/message = generate_ion_law()
- to_chat(user, "You press the button on [src].")
- playsound(src, 'sound/machines/click.ogg', 20, 1)
- visible_message("[message]")
- cooldown = 1
- spawn(30) cooldown = 0
- return
- ..()
-*/
-/obj/item/toy/owl
- name = "owl action figure"
- desc = "An action figure modeled after 'The Owl', defender of justice."
- icon = 'icons/obj/toy.dmi'
- icon_state = "owlprize"
- w_class = ITEMSIZE_SMALL
- var/cooldown = 0
-
-/obj/item/toy/owl/attack_self(mob/user)
- if(!cooldown) //for the sanity of everyone
- var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!")
- to_chat(user, "You pull the string on the [src].")
- //playsound(src, 'sound/misc/hoot.ogg', 25, 1)
- visible_message("[message]")
- cooldown = 1
- spawn(30) cooldown = 0
- return
- ..()
-
-/obj/item/toy/griffin
- name = "griffin action figure"
- desc = "An action figure modeled after 'The Griffin', criminal mastermind."
- icon = 'icons/obj/toy.dmi'
- icon_state = "griffinprize"
- w_class = ITEMSIZE_SMALL
- var/cooldown = 0
-
-/obj/item/toy/griffin/attack_self(mob/user)
- if(!cooldown) //for the sanity of everyone
- var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!")
- to_chat(user, "You pull the string on the [src].")
- //playsound(src, 'sound/misc/caw.ogg', 25, 1)
- visible_message("[message]")
- cooldown = 1
- spawn(30) cooldown = 0
- return
- ..()
-
-/* NYET.
-/obj/item/weapon/toddler
- icon_state = "toddler"
- name = "toddler"
- desc = "This baby looks almost real. Wait, did it just burp?"
- force = 5
- w_class = ITEMSIZE_LARGE
- slot_flags = SLOT_BACK
-*/
-
-//This should really be somewhere else but I don't know where. w/e
-
-/obj/item/weapon/inflatable_duck
- name = "inflatable duck"
- desc = "No bother to sink or swim when you can just float!"
- icon_state = "inflatable"
- icon = 'icons/obj/clothing/belts.dmi'
- slot_flags = SLOT_BELT
- drop_sound = 'sound/items/drop/rubber.ogg'
-
-/obj/item/toy/xmastree
- name = "Miniature Christmas tree"
- desc = "Tiny cute Christmas tree."
- icon = 'icons/obj/toy.dmi'
- icon_state = "tinyxmastree"
- w_class = ITEMSIZE_TINY
- force = 1
- throwforce = 1
- drop_sound = 'sound/items/drop/box.ogg'
-
-//////////////////////////////////////////////////////
-// Chess Pieces //
-//////////////////////////////////////////////////////
-
-/obj/item/toy/chess
- name = "chess piece"
- desc = "This should never display."
- icon = 'icons/obj/chess.dmi'
- w_class = ITEMSIZE_SMALL
- force = 1
- throwforce = 1
- drop_sound = 'sound/items/drop/glass.ogg'
-
-/obj/item/toy/chess/pawn_white
- name = "blue pawn"
- desc = "A large pawn piece for playing chess. It's made of a blue-colored glass."
- description_info = "Pawns can move forward one square, if that square is unoccupied. If the pawn has not yet moved, it has the option of moving two squares forward provided both squares in front of the pawn are unoccupied. A pawn cannot move backward. They can only capture an enemy piece on either of the two tiles diagonally in front of them, but not the tile directly in front of them."
- icon_state = "w-pawn"
-/obj/item/toy/chess/pawn_black
- name = "purple pawn"
- desc = "A large pawn piece for playing chess. It's made of a purple-colored glass."
- description_info = "Pawns can move forward one square, if that square is unoccupied. If the pawn has not yet moved, it has the option of moving two squares forward provided both squares in front of the pawn are unoccupied. A pawn cannot move backward. They can only capture an enemy piece on either of the two tiles diagonally in front of them, but not the tile directly in front of them."
- icon_state = "b-pawn"
-/obj/item/toy/chess/rook_white
- name = "blue rook"
- desc = "A large rook piece for playing chess. It's made of a blue-colored glass."
- description_info = "The Rook can move any number of vacant squares vertically or horizontally."
- icon_state = "w-rook"
-/obj/item/toy/chess/rook_black
- name = "purple rook"
- desc = "A large rook piece for playing chess. It's made of a purple-colored glass."
- description_info = "The Rook can move any number of vacant squares vertically or horizontally."
- icon_state = "b-rook"
-/obj/item/toy/chess/knight_white
- name = "blue knight"
- desc = "A large knight piece for playing chess. It's made of a blue-colored glass. Sadly, you can't ride it."
- description_info = "The Knight can either move two squares horizontally and one square vertically or two squares vertically and one square horizontally. The knight's movement can also be viewed as an 'L' laid out at any horizontal or vertical angle."
- icon_state = "w-knight"
-/obj/item/toy/chess/knight_black
- name = "purple knight"
- desc = "A large knight piece for playing chess. It's made of a purple-colored glass. 'Just a flesh wound.'"
- description_info = "The Knight can either move two squares horizontally and one square vertically or two squares vertically and one square horizontally. The knight's movement can also be viewed as an 'L' laid out at any horizontal or vertical angle."
- icon_state = "b-knight"
-/obj/item/toy/chess/bishop_white
- name = "blue bishop"
- desc = "A large bishop piece for playing chess. It's made of a blue-colored glass."
- description_info = "The Bishop can move any number of vacant squares in any diagonal direction."
- icon_state = "w-bishop"
-/obj/item/toy/chess/bishop_black
- name = "purple bishop"
- desc = "A large bishop piece for playing chess. It's made of a purple-colored glass."
- description_info = "The Bishop can move any number of vacant squares in any diagonal direction."
- icon_state = "b-bishop"
-/obj/item/toy/chess/queen_white
- name = "blue queen"
- desc = "A large queen piece for playing chess. It's made of a blue-colored glass."
- description_info = "The Queen can move any number of vacant squares diagonally, horizontally, or vertically."
- icon_state = "w-queen"
-/obj/item/toy/chess/queen_black
- name = "purple queen"
- desc = "A large queen piece for playing chess. It's made of a purple-colored glass."
- description_info = "The Queen can move any number of vacant squares diagonally, horizontally, or vertically."
- icon_state = "b-queen"
-/obj/item/toy/chess/king_white
- name = "blue king"
- desc = "A large king piece for playing chess. It's made of a blue-colored glass."
- description_info = "The King can move exactly one square horizontally, vertically, or diagonally. If your opponent captures this piece, you lose."
- icon_state = "w-king"
-/obj/item/toy/chess/king_black
- name = "purple king"
- desc = "A large king piece for playing chess. It's made of a purple-colored glass."
- description_info = "The King can move exactly one square horizontally, vertically, or diagonally. If your opponent captures this piece, you lose."
+/* Toys!
+ * Contains:
+ * Balloons
+ * Fake telebeacon
+ * Fake singularity
+ * Toy gun
+ * Toy crossbow
+ * Toy swords
+ * Toy bosun's whistle
+ * Snap pops
+ * Water flower
+ * Therapy dolls
+ * Toddler doll
+ * Inflatable duck
+ * Action figures
+ * Plushies
+ * Toy cult sword
+ * Bouquets
+ Stick Horse
+ */
+
+
+/obj/item/toy
+ throwforce = 0
+ throw_speed = 4
+ throw_range = 20
+ force = 0
+ drop_sound = 'sound/items/drop/gloves.ogg'
+
+
+/*
+ * Balloons
+ */
+/obj/item/toy/balloon
+ name = "water balloon"
+ desc = "A translucent balloon. There's nothing in it."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "waterballoon-e"
+ drop_sound = 'sound/items/drop/rubber.ogg'
+
+/obj/item/toy/balloon/New()
+ var/datum/reagents/R = new/datum/reagents(10)
+ reagents = R
+ R.my_atom = src
+
+/obj/item/toy/balloon/attack(mob/living/carbon/human/M as mob, mob/user as mob)
+ return
+
+/obj/item/toy/balloon/afterattack(atom/A as mob|obj, mob/user as mob, proximity)
+ if(!proximity) return
+ if (istype(A, /obj/structure/reagent_dispensers/watertank) && get_dist(src,A) <= 1)
+ A.reagents.trans_to_obj(src, 10)
+ to_chat(user, "You fill the balloon with the contents of [A].")
+ src.desc = "A translucent balloon with some form of liquid sloshing around in it."
+ src.update_icon()
+ return
+
+/obj/item/toy/balloon/attackby(obj/O as obj, mob/user as mob)
+ if(istype(O, /obj/item/weapon/reagent_containers/glass))
+ if(O.reagents)
+ if(O.reagents.total_volume < 1)
+ to_chat(user, "The [O] is empty.")
+ else if(O.reagents.total_volume >= 1)
+ if(O.reagents.has_reagent("pacid", 1))
+ to_chat(user, "The acid chews through the balloon!")
+ O.reagents.splash(user, reagents.total_volume)
+ qdel(src)
+ else
+ src.desc = "A translucent balloon with some form of liquid sloshing around in it."
+ to_chat(user, "You fill the balloon with the contents of [O].")
+ O.reagents.trans_to_obj(src, 10)
+ src.update_icon()
+ return
+
+/obj/item/toy/balloon/throw_impact(atom/hit_atom)
+ if(src.reagents.total_volume >= 1)
+ src.visible_message("\The [src] bursts!","You hear a pop and a splash.")
+ src.reagents.touch_turf(get_turf(hit_atom))
+ for(var/atom/A in get_turf(hit_atom))
+ src.reagents.touch(A)
+ src.icon_state = "burst"
+ spawn(5)
+ if(src)
+ qdel(src)
+ return
+
+/obj/item/toy/balloon/update_icon()
+ if(src.reagents.total_volume >= 1)
+ icon_state = "waterballoon"
+ else
+ icon_state = "waterballoon-e"
+
+/obj/item/toy/syndicateballoon
+ name = "criminal balloon"
+ desc = "There is a tag on the back that reads \"FUK NT!11!\"."
+ throwforce = 0
+ throw_speed = 4
+ throw_range = 20
+ force = 0
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "syndballoon"
+ w_class = ITEMSIZE_LARGE
+ drop_sound = 'sound/items/drop/rubber.ogg'
+
+/obj/item/toy/nanotrasenballoon
+ name = "criminal balloon"
+ desc = "Across the balloon the following is printed: \"Man, I love NanoTrasen soooo much. I use only NT products. You have NO idea.\""
+ throwforce = 0
+ throw_speed = 4
+ throw_range = 20
+ force = 0
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "ntballoon"
+ w_class = ITEMSIZE_LARGE
+ drop_sound = 'sound/items/drop/rubber.ogg'
+
+/*
+ * Fake telebeacon
+ */
+/obj/item/toy/blink
+ name = "electronic blink toy game"
+ desc = "Blink. Blink. Blink. Ages 8 and up."
+ icon = 'icons/obj/radio.dmi'
+ icon_state = "beacon"
+ item_state = "signaler"
+
+/*
+ * Fake singularity
+ */
+/obj/item/toy/spinningtoy
+ name = "gravitational singularity"
+ desc = "\"Singulo\" brand spinning toy."
+ 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'
+
+ examine(mob/user)
+ . = ..()
+ if(bullets && get_dist(user, src) <= 2)
+ . += "It is loaded with [bullets] foam darts!"
+
+ 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.")
+
+
+ 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)
+
+
+ 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 = 1
+ density = 0
+
+/*
+ * Toy swords
+ */
+/obj/item/toy/sword
+ name = "toy sword"
+ desc = "A cheap, plastic replica of an energy sword. Realistic sounds! Ages 8 and up."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "esword"
+ drop_sound = 'sound/items/drop/gun.ogg'
+ var/lcolor
+ var/rainbow = FALSE
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
+ )
+ var/active = 0
+ w_class = ITEMSIZE_SMALL
+ attack_verb = list("attacked", "struck", "hit")
+
+ attack_self(mob/user as mob)
+ src.active = !( src.active )
+ if (src.active)
+ to_chat(user, "You extend the plastic blade with a quick flick of your wrist.")
+ playsound(src, 'sound/weapons/saberon.ogg', 50, 1)
+ src.item_state = "[icon_state]_blade"
+ src.w_class = ITEMSIZE_LARGE
+ else
+ to_chat(user, "You push the plastic blade back down into the handle.")
+ playsound(src, 'sound/weapons/saberoff.ogg', 50, 1)
+ src.item_state = "[icon_state]"
+ src.w_class = ITEMSIZE_SMALL
+ update_icon()
+ src.add_fingerprint(user)
+ return
+
+/obj/item/toy/sword/update_icon()
+ . = ..()
+ var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade")
+ blade_overlay.color = lcolor
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
+ if(active)
+ add_overlay(blade_overlay)
+ if(istype(usr,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = usr
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
+
+/obj/item/toy/sword/AltClick(mob/living/user)
+ if(!in_range(src, user)) //Basic checks to prevent abuse
+ return
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+
+ if(alert("Are you sure you want to recolor your blade?", "Confirm Recolor", "Yes", "No") == "Yes")
+ var/energy_color_input = input(usr,"","Choose Energy Color",lcolor) as color|null
+ if(energy_color_input)
+ lcolor = sanitize_hexcolor(energy_color_input)
+ update_icon()
+
+/obj/item/toy/sword/examine(mob/user)
+ . = ..()
+ . += "Alt-click to recolor it."
+
+/obj/item/toy/sword/attackby(obj/item/weapon/W, mob/user)
+ if(istype(W, /obj/item/device/multitool) && !active)
+ if(!rainbow)
+ rainbow = TRUE
+ else
+ rainbow = FALSE
+ to_chat(user, "You manipulate the color controller in [src].")
+ update_icon()
+/obj/item/toy/katana
+ name = "replica katana"
+ desc = "Woefully underpowered in D20."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "katana"
+ item_state = "katana"
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_material.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_material.dmi',
+ )
+ slot_flags = SLOT_BELT | SLOT_BACK
+ force = 5
+ throwforce = 5
+ w_class = ITEMSIZE_NORMAL
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced")
+
+/*
+ * Snap pops
+ */
+/obj/item/toy/snappop
+ name = "snap pop"
+ desc = "Wow!"
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "snappop"
+ w_class = ITEMSIZE_TINY
+ drop_sound = null
+
+ throw_impact(atom/hit_atom)
+ ..()
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ new /obj/effect/decal/cleanable/ash(src.loc)
+ src.visible_message("The [src.name] explodes!","You hear a snap!")
+ playsound(src, 'sound/effects/snap.ogg', 50, 1)
+ qdel(src)
+
+/obj/item/toy/snappop/Crossed(atom/movable/H as mob|obj)
+ if(H.is_incorporeal())
+ return
+ if((ishuman(H))) //i guess carp and shit shouldn't set them off
+ var/mob/living/carbon/M = H
+ if(M.m_intent == "run")
+ to_chat(M, "You step on the snap pop!")
+
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 0, src)
+ s.start()
+ new /obj/effect/decal/cleanable/ash(src.loc)
+ src.visible_message("The [src.name] explodes!","You hear a snap!")
+ playsound(src, 'sound/effects/snap.ogg', 50, 1)
+ qdel(src)
+
+/*
+ * 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."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "bosunwhistle"
+ drop_sound = 'sound/items/drop/card.ogg'
+ var/cooldown = 0
+ w_class = ITEMSIZE_TINY
+ slot_flags = SLOT_EARS | SLOT_HOLSTER
+
+/obj/item/toy/bosunwhistle/attack_self(mob/user as mob)
+ if(cooldown < world.time - 35)
+ to_chat(user, "You blow on [src], creating an ear-splitting noise!")
+ playsound(src, 'sound/misc/boatswain.ogg', 20, 1)
+ cooldown = world.time
+
+/*
+ * Action figures
+ */
+/obj/item/toy/figure
+ name = "Non-Specific Action Figure action figure"
+ desc = "A \"Space Life\" brand... wait, what the hell is this thing?"
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "nuketoy"
+ var/cooldown = 0
+ var/toysay = "What the fuck did you do?"
+ drop_sound = 'sound/items/drop/accessory.ogg'
+
+/obj/item/toy/figure/New()
+ ..()
+ desc = "A \"Space Life\" brand [name]"
+
+/obj/item/toy/figure/attack_self(mob/user as mob)
+ if(cooldown < world.time)
+ cooldown = (world.time + 30) //3 second cooldown
+ user.visible_message("The [src] says \"[toysay]\".")
+ playsound(src, 'sound/machines/click.ogg', 20, 1)
+
+/obj/item/toy/figure/cmo
+ name = "Chief Medical Officer action figure"
+ desc = "A \"Space Life\" brand Chief Medical Officer action figure."
+ icon_state = "cmo"
+ toysay = "Suit sensors!"
+
+/obj/item/toy/figure/assistant
+ name = "Assistant action figure"
+ desc = "A \"Space Life\" brand Assistant action figure."
+ icon_state = "assistant"
+ toysay = "Grey tide station wide!"
+
+/obj/item/toy/figure/atmos
+ name = "Atmospheric Technician action figure"
+ desc = "A \"Space Life\" brand Atmospheric Technician action figure."
+ icon_state = "atmos"
+ toysay = "Glory to Atmosia!"
+
+/obj/item/toy/figure/bartender
+ name = "Bartender action figure"
+ desc = "A \"Space Life\" brand Bartender action figure."
+ icon_state = "bartender"
+ toysay = "Where's my monkey?"
+
+/obj/item/toy/figure/borg
+ name = "Drone action figure"
+ desc = "A \"Space Life\" brand Drone action figure."
+ icon_state = "borg"
+ toysay = "I. LIVE. AGAIN."
+
+/obj/item/toy/figure/gardener
+ name = "Gardener action figure"
+ desc = "A \"Space Life\" brand Gardener action figure."
+ icon_state = "botanist"
+ toysay = "Dude, I see colors..."
+
+/obj/item/toy/figure/captain
+ name = "Colony Director action figure"
+ desc = "A \"Space Life\" brand Colony Director action figure."
+ icon_state = "captain"
+ toysay = "How do I open this display case?"
+
+/obj/item/toy/figure/cargotech
+ name = "Cargo Technician action figure"
+ desc = "A \"Space Life\" brand Cargo Technician action figure."
+ icon_state = "cargotech"
+ toysay = "For Cargonia!"
+
+/obj/item/toy/figure/ce
+ name = "Chief Engineer action figure"
+ desc = "A \"Space Life\" brand Chief Engineer action figure."
+ icon_state = "ce"
+ toysay = "Wire the solars!"
+
+/obj/item/toy/figure/chaplain
+ name = "Chaplain action figure"
+ desc = "A \"Space Life\" brand Chaplain action figure."
+ icon_state = "chaplain"
+ toysay = "Gods make me a killing machine please!"
+
+/obj/item/toy/figure/chef
+ name = "Chef action figure"
+ desc = "A \"Space Life\" brand Chef action figure."
+ icon_state = "chef"
+ toysay = "I swear it's not human meat."
+
+/obj/item/toy/figure/chemist
+ name = "Chemist action figure"
+ desc = "A \"Space Life\" brand Chemist action figure."
+ icon_state = "chemist"
+ toysay = "Get your pills!"
+
+/obj/item/toy/figure/clown
+ name = "Clown action figure"
+ desc = "A \"Space Life\" brand Clown action figure."
+ icon_state = "clown"
+ toysay = "Honk!"
+
+/obj/item/toy/figure/corgi
+ name = "Corgi action figure"
+ desc = "A \"Space Life\" brand Corgi action figure."
+ icon_state = "ian"
+ toysay = "Arf!"
+
+/obj/item/toy/figure/detective
+ name = "Detective action figure"
+ desc = "A \"Space Life\" brand Detective action figure."
+ icon_state = "detective"
+ toysay = "This airlock has grey jumpsuit and insulated glove fibers on it."
+
+/obj/item/toy/figure/dsquad
+ name = "Space Commando action figure"
+ desc = "A \"Space Life\" brand Space Commando action figure."
+ icon_state = "dsquad"
+ toysay = "Eliminate all threats!"
+
+/obj/item/toy/figure/engineer
+ name = "Engineer action figure"
+ desc = "A \"Space Life\" brand Engineer action figure."
+ icon_state = "engineer"
+ toysay = "Oh god, the engine is gonna go!"
+
+/obj/item/toy/figure/geneticist
+ name = "Geneticist action figure"
+ desc = "A \"Space Life\" brand Geneticist action figure, which was recently dicontinued."
+ icon_state = "geneticist"
+ toysay = "I'm not qualified for this job."
+
+/obj/item/toy/figure/hop
+ name = "Head of Personnel action figure"
+ desc = "A \"Space Life\" brand Head of Personnel action figure."
+ icon_state = "hop"
+ toysay = "Giving out all access!"
+
+/obj/item/toy/figure/hos
+ name = "Head of Security action figure"
+ desc = "A \"Space Life\" brand Head of Security action figure."
+ icon_state = "hos"
+ toysay = "I'm here to win, anything else is secondary."
+
+/obj/item/toy/figure/qm
+ name = "Quartermaster action figure"
+ desc = "A \"Space Life\" brand Quartermaster action figure."
+ icon_state = "qm"
+ toysay = "Hail Cargonia!"
+
+/obj/item/toy/figure/janitor
+ name = "Janitor action figure"
+ desc = "A \"Space Life\" brand Janitor action figure."
+ icon_state = "janitor"
+ toysay = "Look at the signs, you idiot."
+
+/obj/item/toy/figure/agent
+ name = "Internal Affairs Agent action figure"
+ desc = "A \"Space Life\" brand Internal Affairs Agent action figure."
+ icon_state = "agent"
+ toysay = "Standard Operating Procedure says they're guilty! Hacking is proof they're an Enemy of the Corporation!"
+
+/obj/item/toy/figure/librarian
+ name = "Librarian action figure"
+ desc = "A \"Space Life\" brand Librarian action figure."
+ icon_state = "librarian"
+ toysay = "One day while..."
+
+/obj/item/toy/figure/md
+ name = "Medical Doctor action figure"
+ desc = "A \"Space Life\" brand Medical Doctor action figure."
+ icon_state = "md"
+ toysay = "The patient is already dead!"
+
+/obj/item/toy/figure/mime
+ name = "Mime action figure"
+ desc = "A \"Space Life\" brand Mime action figure."
+ icon_state = "mime"
+ toysay = "..."
+
+/obj/item/toy/figure/miner
+ name = "Shaft Miner action figure"
+ desc = "A \"Space Life\" brand Shaft Miner action figure."
+ icon_state = "miner"
+ toysay = "Oh god, it's eating my intestines!"
+
+/obj/item/toy/figure/ninja
+ name = "Space Ninja action figure"
+ desc = "A \"Space Life\" brand Space Ninja action figure."
+ icon_state = "ninja"
+ toysay = "Oh god! Stop shooting, I'm friendly!"
+
+/obj/item/toy/figure/wizard
+ name = "Wizard action figure"
+ desc = "A \"Space Life\" brand Wizard action figure."
+ icon_state = "wizard"
+ toysay = "Ei Nath!"
+
+/obj/item/toy/figure/rd
+ name = "Research Director action figure"
+ desc = "A \"Space Life\" brand Research Director action figure."
+ icon_state = "rd"
+ toysay = "Blowing all of the borgs!"
+
+/obj/item/toy/figure/roboticist
+ name = "Roboticist action figure"
+ desc = "A \"Space Life\" brand Roboticist action figure."
+ icon_state = "roboticist"
+ toysay = "He asked to be borged!"
+
+/obj/item/toy/figure/scientist
+ name = "Scientist action figure"
+ desc = "A \"Space Life\" brand Scientist action figure."
+ icon_state = "scientist"
+ toysay = "Someone else must have made those bombs!"
+
+/obj/item/toy/figure/syndie
+ name = "Doom Operative action figure"
+ desc = "A \"Space Life\" brand Doom Operative action figure."
+ icon_state = "syndie"
+ toysay = "Get that fucking disk!"
+
+/obj/item/toy/figure/secofficer
+ name = "Security Officer action figure"
+ desc = "A \"Space Life\" brand Security Officer action figure."
+ icon_state = "secofficer"
+ toysay = "I am the law!"
+
+/obj/item/toy/figure/virologist
+ name = "Virologist action figure"
+ desc = "A \"Space Life\" brand Virologist action figure."
+ icon_state = "virologist"
+ toysay = "The cure is potassium!"
+
+/obj/item/toy/figure/warden
+ name = "Warden action figure"
+ desc = "A \"Space Life\" brand Warden action figure."
+ icon_state = "warden"
+ toysay = "Execute him for breaking in!"
+
+/obj/item/toy/figure/psychologist
+ name = "Psychologist action figure"
+ desc = "A \"Space Life\" brand Psychologist action figure."
+ icon_state = "psychologist"
+ toysay = "The analyzer says you're fine!"
+
+/obj/item/toy/figure/paramedic
+ name = "Paramedic action figure"
+ desc = "A \"Space Life\" brand Paramedic action figure."
+ icon_state = "paramedic"
+ toysay = "WHERE ARE YOU??"
+
+/obj/item/toy/figure/ert
+ name = "Emergency Response Team Commander action figure"
+ desc = "A \"Space Life\" brand Emergency Response Team Commander action figure."
+ icon_state = "ert"
+ toysay = "We're probably the good guys!"
+
+/*
+ * Plushies
+ */
+
+/*
+ * Carp plushie
+ */
+
+/obj/item/toy/plushie/carp
+ name = "space carp plushie"
+ desc = "An adorable stuffed toy that resembles a space carp."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "basecarp"
+ attack_verb = list("bitten", "eaten", "fin slapped")
+ var/bitesound = 'sound/weapons/bite.ogg'
+
+// Attack mob
+/obj/item/toy/plushie/carp/attack(mob/M as mob, mob/user as mob)
+ playsound(src, bitesound, 20, 1) // Play bite sound in local area
+ return ..()
+
+// Attack self
+/obj/item/toy/plushie/carp/attack_self(mob/user as mob)
+ playsound(src, bitesound, 20, 1)
+ return ..()
+
+
+/obj/random/carp_plushie
+ name = "Random Carp Plushie"
+ desc = "This is a random plushie"
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "basecarp"
+
+/obj/random/carp_plushie/item_to_spawn()
+ return pick(typesof(/obj/item/toy/plushie/carp)) //can pick any carp plushie, even the original.
+
+/obj/item/toy/plushie/carp/ice
+ name = "ice carp plushie"
+ icon_state = "icecarp"
+
+/obj/item/toy/plushie/carp/silent
+ name = "monochrome carp plushie"
+ icon_state = "silentcarp"
+
+/obj/item/toy/plushie/carp/electric
+ name = "electric carp plushie"
+ icon_state = "electriccarp"
+
+/obj/item/toy/plushie/carp/gold
+ name = "golden carp plushie"
+ icon_state = "goldcarp"
+
+/obj/item/toy/plushie/carp/toxin
+ name = "toxic carp plushie"
+ icon_state = "toxincarp"
+
+/obj/item/toy/plushie/carp/dragon
+ name = "dragon carp plushie"
+ icon_state = "dragoncarp"
+
+/obj/item/toy/plushie/carp/pink
+ name = "pink carp plushie"
+ icon_state = "pinkcarp"
+
+/obj/item/toy/plushie/carp/candy
+ name = "candy carp plushie"
+ icon_state = "candycarp"
+
+/obj/item/toy/plushie/carp/nebula
+ name = "nebula carp plushie"
+ icon_state = "nebulacarp"
+
+/obj/item/toy/plushie/carp/void
+ name = "void carp plushie"
+ icon_state = "voidcarp"
+
+//Large plushies.
+/obj/structure/plushie
+ name = "generic plush"
+ desc = "A very generic plushie. It seems to not want to exist."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "ianplushie"
+ anchored = 0
+ density = 1
+ var/phrase = "I don't want to exist anymore!"
+ var/searching = FALSE
+ var/opened = FALSE // has this been slit open? this will allow you to store an object in a plushie.
+ var/obj/item/stored_item // Note: Stored items can't be bigger than the plushie itself.
+
+/obj/structure/plushie/examine(mob/user)
+ . = ..()
+ if(opened)
+ . += "You notice an incision has been made on [src]."
+ if(in_range(user, src) && stored_item)
+ . += "You can see something in there..."
+
+/obj/structure/plushie/attack_hand(mob/user)
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+
+ if(stored_item && opened && !searching)
+ searching = TRUE
+ if(do_after(user, 10))
+ to_chat(user, "You find \icon[stored_item] [stored_item] in [src]!")
+ stored_item.forceMove(get_turf(src))
+ stored_item = null
+ searching = FALSE
+ return
+ else
+ searching = FALSE
+
+ if(user.a_intent == I_HELP)
+ user.visible_message("\The [user] hugs [src]!","You hug [src]!")
+ else if (user.a_intent == I_HURT)
+ user.visible_message("\The [user] punches [src]!","You punch [src]!")
+ else if (user.a_intent == I_GRAB)
+ user.visible_message("\The [user] attempts to strangle [src]!","You attempt to strangle [src]!")
+ else
+ user.visible_message("\The [user] pokes the [src].","You poke the [src].")
+ visible_message("[src] says, \"[phrase]\"")
+
+
+/obj/structure/plushie/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I, /obj/item/device/threadneedle) && opened)
+ to_chat(user, "You sew the hole in [src].")
+ opened = FALSE
+ return
+
+ if(is_sharp(I) && !opened)
+ to_chat(user, "You open a small incision in [src]. You can place tiny items inside.")
+ opened = TRUE
+ return
+
+ if(opened)
+ if(stored_item)
+ to_chat(user, "There is already something in here.")
+ return
+
+ if(!(I.w_class > w_class))
+ to_chat(user, "You place [I] inside [src].")
+ user.drop_from_inventory(I, src)
+ I.forceMove(src)
+ stored_item = I
+ return
+ else
+ to_chat(user, "You open a small incision in [src]. You can place tiny items inside.")
+
+
+ ..()
+
+/obj/structure/plushie/ian
+ name = "plush corgi"
+ desc = "A plushie of an adorable corgi! Don't you just want to hug it and squeeze it and call it \"Ian\"?"
+ icon_state = "ianplushie"
+ phrase = "Arf!"
+
+/obj/structure/plushie/drone
+ name = "plush drone"
+ desc = "A plushie of a happy drone! It appears to be smiling."
+ icon_state = "droneplushie"
+ phrase = "Beep boop!"
+
+/obj/structure/plushie/carp
+ name = "plush carp"
+ desc = "A plushie of an elated carp! Straight from the wilds of the Vir frontier, now right here in your hands."
+ icon_state = "carpplushie"
+ phrase = "Glorf!"
+
+/obj/structure/plushie/beepsky
+ name = "plush Officer Sweepsky"
+ desc = "A plushie of a popular industrious cleaning robot! If it could feel emotions, it would love you."
+ icon_state = "beepskyplushie"
+ phrase = "Ping!"
+
+//Small plushies.
+/obj/item/toy/plushie
+ name = "generic small plush"
+ desc = "A small toy plushie. It's very cute."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "nymphplushie"
+ drop_sound = 'sound/items/drop/plushie.ogg'
+ w_class = ITEMSIZE_TINY
+ var/last_message = 0
+ var/pokephrase = "Uww!"
+ var/searching = FALSE
+ var/opened = FALSE // has this been slit open? this will allow you to store an object in a plushie.
+ var/obj/item/stored_item // Note: Stored items can't be bigger than the plushie itself.
+
+
+/obj/item/toy/plushie/examine(mob/user)
+ . = ..()
+ if(opened)
+ . += "You notice an incision has been made on [src]."
+ if(in_range(user, src) && stored_item)
+ . += "You can see something in there..."
+
+/obj/item/toy/plushie/attack_self(mob/user as mob)
+ if(stored_item && opened && !searching)
+ searching = TRUE
+ if(do_after(user, 10))
+ to_chat(user, "You find \icon[stored_item] [stored_item] in [src]!")
+ stored_item.forceMove(get_turf(src))
+ stored_item = null
+ searching = FALSE
+ return
+ else
+ searching = FALSE
+
+ if(world.time - last_message <= 1 SECOND)
+ return
+ if(user.a_intent == I_HELP)
+ user.visible_message("\The [user] hugs [src]!","You hug [src]!")
+ else if (user.a_intent == I_HURT)
+ user.visible_message("\The [user] punches [src]!","You punch [src]!")
+ else if (user.a_intent == I_GRAB)
+ user.visible_message("\The [user] attempts to strangle [src]!","You attempt to strangle [src]!")
+ else
+ user.visible_message("\The [user] pokes [src].","You poke [src].")
+ playsound(src, 'sound/items/drop/plushie.ogg', 25, 0)
+ visible_message("[src] says, \"[pokephrase]\"")
+ last_message = world.time
+
+/obj/item/toy/plushie/verb/rename_plushie()
+ set name = "Name Plushie"
+ set category = "Object"
+ set desc = "Give your plushie a cute name!"
+ var/mob/M = usr
+ if(!M.mind)
+ return 0
+
+ var/input = sanitizeSafe(input("What do you want to name the plushie?", ,""), MAX_NAME_LEN)
+
+ if(src && input && !M.stat && in_range(M,src))
+ name = input
+ to_chat(M, "You name the plushie [input], giving it a hug for good luck.")
+ return 1
+
+/obj/item/toy/plushie/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I, /obj/item/toy/plushie) || istype(I, /obj/item/organ/external/head))
+ user.visible_message("[user] makes \the [I] kiss \the [src]!.", \
+ "You make \the [I] kiss \the [src]!.")
+ return
+
+
+ if(istype(I, /obj/item/device/threadneedle) && opened)
+ to_chat(user, "You sew the hole underneath [src].")
+ opened = FALSE
+ return
+
+ if(is_sharp(I) && !opened)
+ to_chat(user, "You open a small incision in [src]. You can place tiny items inside.")
+ opened = TRUE
+ return
+
+ if( (!(I.w_class > w_class)) && opened)
+ if(stored_item)
+ to_chat(user, "There is already something in here.")
+ return
+
+ to_chat(user, "You place [I] inside [src].")
+ user.drop_from_inventory(I, src)
+ I.forceMove(src)
+ stored_item = I
+ to_chat(user, "You placed [I] into [src].")
+ return
+
+ return ..()
+
+/obj/item/toy/plushie/nymph
+ name = "diona nymph plush"
+ desc = "A plushie of an adorable diona nymph! While its level of self-awareness is still being debated, its level of cuteness is not."
+ icon_state = "nymphplushie"
+ pokephrase = "Chirp!"
+
+/obj/item/toy/plushie/teshari
+ name = "teshari plush"
+ desc = "This is a plush teshari. Very soft, with a pompom on the tail. The toy is made well, as if alive. Looks like she is sleeping. Shhh!"
+ icon_state = "teshariplushie"
+ pokephrase = "Rya!"
+
+/obj/item/toy/plushie/mouse
+ name = "mouse plush"
+ desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend."
+ icon_state = "mouseplushie" //TFF 12/11/19 - updated icon to show a sprite that doesn't replicate a dead mouse. Heck you for that! >:C
+ pokephrase = "Squeak!"
+
+/obj/item/toy/plushie/kitten
+ name = "kitten plush"
+ desc = "A plushie of a cute kitten! Watch as it purrs its way right into your heart."
+ icon_state = "kittenplushie"
+ pokephrase = "Mrow!"
+
+/obj/item/toy/plushie/lizard
+ name = "lizard plush"
+ desc = "A plushie of a scaly lizard! Very controversial, after being accused as \"racist\" by some Unathi."
+ icon_state = "lizardplushie"
+ pokephrase = "Hiss!"
+
+/obj/item/toy/plushie/spider
+ name = "spider plush"
+ desc = "A plushie of a fuzzy spider! It has eight legs - all the better to hug you with."
+ icon_state = "spiderplushie"
+ pokephrase = "Sksksk!"
+
+/obj/item/toy/plushie/farwa
+ name = "farwa plush"
+ desc = "A farwa plush doll. It's soft and comforting!"
+ icon_state = "farwaplushie"
+ pokephrase = "Squaw!"
+
+/obj/item/toy/plushie/corgi
+ name = "corgi plushie"
+ icon_state = "corgi"
+ pokephrase = "Woof!"
+
+/obj/item/toy/plushie/girly_corgi
+ name = "corgi plushie"
+ icon_state = "girlycorgi"
+ pokephrase = "Arf!"
+
+/obj/item/toy/plushie/robo_corgi
+ name = "borgi plushie"
+ icon_state = "robotcorgi"
+ pokephrase = "Bark."
+
+/obj/item/toy/plushie/octopus
+ name = "octopus plushie"
+ icon_state = "loveable"
+ pokephrase = "Squish!"
+
+/obj/item/toy/plushie/face_hugger
+ name = "facehugger plushie"
+ icon_state = "huggable"
+ pokephrase = "Hug!"
+
+//foxes are basically the best
+
+/obj/item/toy/plushie/red_fox
+ name = "red fox plushie"
+ icon_state = "redfox"
+ pokephrase = "Gecker!"
+
+/obj/item/toy/plushie/black_fox
+ name = "black fox plushie"
+ icon_state = "blackfox"
+ pokephrase = "Ack!"
+
+/obj/item/toy/plushie/marble_fox
+ name = "marble fox plushie"
+ icon_state = "marblefox"
+ pokephrase = "Awoo!"
+
+/obj/item/toy/plushie/blue_fox
+ name = "blue fox plushie"
+ icon_state = "bluefox"
+ pokephrase = "Yoww!"
+
+/obj/item/toy/plushie/orange_fox
+ name = "orange fox plushie"
+ icon_state = "orangefox"
+ pokephrase = "Yagh!"
+
+/obj/item/toy/plushie/coffee_fox
+ name = "coffee fox plushie"
+ icon_state = "coffeefox"
+ pokephrase = "Gerr!"
+
+/obj/item/toy/plushie/pink_fox
+ name = "pink fox plushie"
+ icon_state = "pinkfox"
+ pokephrase = "Yack!"
+
+/obj/item/toy/plushie/purple_fox
+ name = "purple fox plushie"
+ icon_state = "purplefox"
+ pokephrase = "Whine!"
+
+/obj/item/toy/plushie/crimson_fox
+ name = "crimson fox plushie"
+ icon_state = "crimsonfox"
+ pokephrase = "Auuu!"
+
+/obj/item/toy/plushie/deer
+ name = "deer plushie"
+ icon_state = "deer"
+ pokephrase = "Bleat!"
+
+/obj/item/toy/plushie/black_cat
+ name = "black cat plushie"
+ icon_state = "blackcat"
+ pokephrase = "Mlem!"
+
+/obj/item/toy/plushie/grey_cat
+ name = "grey cat plushie"
+ icon_state = "greycat"
+ pokephrase = "Mraw!"
+
+/obj/item/toy/plushie/white_cat
+ name = "white cat plushie"
+ icon_state = "whitecat"
+ pokephrase = "Mew!"
+
+/obj/item/toy/plushie/orange_cat
+ name = "orange cat plushie"
+ icon_state = "orangecat"
+ pokephrase = "Meow!"
+
+/obj/item/toy/plushie/siamese_cat
+ name = "siamese cat plushie"
+ icon_state = "siamesecat"
+ pokephrase = "Mrew?"
+
+/obj/item/toy/plushie/tabby_cat
+ name = "tabby cat plushie"
+ icon_state = "tabbycat"
+ pokephrase = "Purr!"
+
+/obj/item/toy/plushie/tuxedo_cat
+ name = "tuxedo cat plushie"
+ icon_state = "tuxedocat"
+ pokephrase = "Mrowww!!"
+
+// nah, squids are better than foxes :>
+
+/obj/item/toy/plushie/squid/green
+ name = "green squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is green."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "greensquid"
+ slot_flags = SLOT_HEAD
+ pokephrase = "Squrr!"
+
+/obj/item/toy/plushie/squid/mint
+ name = "mint squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is mint coloured."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "mintsquid"
+ slot_flags = SLOT_HEAD
+ pokephrase = "Blurble!"
+
+/obj/item/toy/plushie/squid/blue
+ name = "blue squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is blue."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "bluesquid"
+ slot_flags = SLOT_HEAD
+ pokephrase = "Blob!"
+
+/obj/item/toy/plushie/squid/orange
+ name = "orange squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is orange."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "orangesquid"
+ slot_flags = SLOT_HEAD
+ pokephrase = "Squash!"
+
+/obj/item/toy/plushie/squid/yellow
+ name = "yellow squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is yellow."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "yellowsquid"
+ slot_flags = SLOT_HEAD
+ pokephrase = "Glorble!"
+
+/obj/item/toy/plushie/squid/pink
+ name = "pink squid plushie"
+ desc = "A small, cute and loveable squid friend. This one is pink."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "pinksquid"
+ slot_flags = SLOT_HEAD
+ pokephrase = "Wobble!"
+
+/obj/item/toy/plushie/therapy/red
+ name = "red therapy doll"
+ desc = "A toy for therapeutic and recreational purposes. This one is red."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "therapyred"
+ item_state = "egg4" // It's the red egg in items_left/righthand
+
+/obj/item/toy/plushie/therapy/purple
+ name = "purple therapy doll"
+ desc = "A toy for therapeutic and recreational purposes. This one is purple."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "therapypurple"
+ item_state = "egg1" // It's the magenta egg in items_left/righthand
+
+/obj/item/toy/plushie/therapy/blue
+ name = "blue therapy doll"
+ desc = "A toy for therapeutic and recreational purposes. This one is blue."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "therapyblue"
+ item_state = "egg2" // It's the blue egg in items_left/righthand
+
+/obj/item/toy/plushie/therapy/yellow
+ name = "yellow therapy doll"
+ desc = "A toy for therapeutic and recreational purposes. This one is yellow."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "therapyyellow"
+ item_state = "egg5" // It's the yellow egg in items_left/righthand
+
+/obj/item/toy/plushie/therapy/orange
+ name = "orange therapy doll"
+ desc = "A toy for therapeutic and recreational purposes. This one is orange."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "therapyorange"
+ item_state = "egg4" // It's the red one again, lacking an orange item_state and making a new one is pointless
+
+/obj/item/toy/plushie/therapy/green
+ name = "green therapy doll"
+ desc = "A toy for therapeutic and recreational purposes. This one is green."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "therapygreen"
+ item_state = "egg3" // It's the green egg in items_left/righthand
+
+
+//Toy cult sword
+/obj/item/toy/cultsword
+ name = "foam sword"
+ desc = "An arcane weapon (made of foam) wielded by the followers of the hit Saturday morning cartoon \"King Nursee and the Acolytes of Heroism\"."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "cultblade"
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
+ )
+ w_class = ITEMSIZE_LARGE
+ attack_verb = list("attacked", "slashed", "stabbed", "poked")
+
+//Flowers fake & real
+
+/obj/item/toy/bouquet
+ name = "bouquet"
+ desc = "A lovely bouquet of flowers. Smells nice!"
+ icon = 'icons/obj/items.dmi'
+ icon_state = "bouquet"
+ w_class = ITEMSIZE_SMALL
+
+/obj/item/toy/bouquet/fake
+ name = "plastic bouquet"
+ desc = "A cheap plastic bouquet of flowers. Smells like cheap, toxic plastic."
+
+/obj/item/toy/stickhorse
+ name = "stick horse"
+ desc = "A pretend horse on a stick for any aspiring little cowboy to ride."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "stickhorse"
+ w_class = ITEMSIZE_LARGE
+
+//////////////////////////////////////////////////////
+// Magic 8-Ball / Conch //
+//////////////////////////////////////////////////////
+
+/obj/item/toy/eight_ball
+ name = "\improper Magic 8-Ball"
+ desc = "Mystical! Magical! Ages 8+!"
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "eight-ball"
+ var/use_action = "shakes the ball"
+ var/cooldown = 0
+ var/list/possible_answers = list("Definitely.", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.")
+
+/obj/item/toy/eight_ball/attack_self(mob/user as mob)
+ if(!cooldown)
+ var/answer = pick(possible_answers)
+ user.visible_message("[user] focuses on their question and [use_action]...")
+ user.visible_message("The [src] says \"[answer]\"")
+ spawn(30)
+ cooldown = 0
+ return
+
+/obj/item/toy/eight_ball/conch
+ name = "Magic Conch shell"
+ desc = "All hail the Magic Conch!"
+ icon_state = "conch"
+ use_action = "pulls the string"
+ possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.")
+
+// DND Character minis. Use the naming convention (type)character for the icon states.
+/obj/item/toy/character
+ icon = 'icons/obj/toy.dmi'
+ w_class = ITEMSIZE_SMALL
+ pixel_z = 5
+
+/obj/item/toy/character/alien
+ name = "xenomorph xiniature"
+ desc = "A miniature xenomorph. Scary!"
+ icon_state = "aliencharacter"
+/obj/item/toy/character/cleric
+ name = "cleric miniature"
+ desc = "A wee little cleric, with his wee little staff."
+ icon_state = "clericcharacter"
+/obj/item/toy/character/warrior
+ name = "warrior miniature"
+ desc = "That sword would make a decent toothpick."
+ icon_state = "warriorcharacter"
+/obj/item/toy/character/thief
+ name = "thief miniature"
+ desc = "Hey, where did my wallet go!?"
+ icon_state = "thiefcharacter"
+/obj/item/toy/character/wizard
+ name = "wizard miniature"
+ desc = "MAGIC!"
+ icon_state = "wizardcharacter"
+/obj/item/toy/character/voidone
+ name = "void one miniature"
+ desc = "The dark lord has risen!"
+ icon_state = "darkmastercharacter"
+/obj/item/toy/character/lich
+ name = "lich miniature"
+ desc = "Murderboner extraordinaire."
+ icon_state = "lichcharacter"
+/obj/item/weapon/storage/box/characters
+ name = "box of miniatures"
+ desc = "The nerd's best friends."
+ icon_state = "box"
+/obj/item/weapon/storage/box/characters/starts_with = list(
+// /obj/item/toy/character/alien,
+ /obj/item/toy/character/cleric,
+ /obj/item/toy/character/warrior,
+ /obj/item/toy/character/thief,
+ /obj/item/toy/character/wizard,
+ /obj/item/toy/character/voidone,
+ /obj/item/toy/character/lich
+ )
+
+/obj/item/toy/AI
+ name = "toy AI"
+ desc = "A little toy model AI core!"// with real law announcing action!" //Alas, requires a rewrite of how ion laws work.
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "AI"
+ w_class = ITEMSIZE_SMALL
+ var/cooldown = 0
+/*
+/obj/item/toy/AI/attack_self(mob/user)
+ if(!cooldown) //for the sanity of everyone
+ var/message = generate_ion_law()
+ to_chat(user, "You press the button on [src].")
+ playsound(src, 'sound/machines/click.ogg', 20, 1)
+ visible_message("[message]")
+ cooldown = 1
+ spawn(30) cooldown = 0
+ return
+ ..()
+*/
+/obj/item/toy/owl
+ name = "owl action figure"
+ desc = "An action figure modeled after 'The Owl', defender of justice."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "owlprize"
+ w_class = ITEMSIZE_SMALL
+ var/cooldown = 0
+
+/obj/item/toy/owl/attack_self(mob/user)
+ if(!cooldown) //for the sanity of everyone
+ var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!")
+ to_chat(user, "You pull the string on the [src].")
+ //playsound(src, 'sound/misc/hoot.ogg', 25, 1)
+ visible_message("[message]")
+ cooldown = 1
+ spawn(30) cooldown = 0
+ return
+ ..()
+
+/obj/item/toy/griffin
+ name = "griffin action figure"
+ desc = "An action figure modeled after 'The Griffin', criminal mastermind."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "griffinprize"
+ w_class = ITEMSIZE_SMALL
+ var/cooldown = 0
+
+/obj/item/toy/griffin/attack_self(mob/user)
+ if(!cooldown) //for the sanity of everyone
+ var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!")
+ to_chat(user, "You pull the string on the [src].")
+ //playsound(src, 'sound/misc/caw.ogg', 25, 1)
+ visible_message("[message]")
+ cooldown = 1
+ spawn(30) cooldown = 0
+ return
+ ..()
+
+/* NYET.
+/obj/item/weapon/toddler
+ icon_state = "toddler"
+ name = "toddler"
+ desc = "This baby looks almost real. Wait, did it just burp?"
+ force = 5
+ w_class = ITEMSIZE_LARGE
+ slot_flags = SLOT_BACK
+*/
+
+//This should really be somewhere else but I don't know where. w/e
+
+/obj/item/weapon/inflatable_duck
+ name = "inflatable duck"
+ desc = "No bother to sink or swim when you can just float!"
+ icon_state = "inflatable"
+ icon = 'icons/obj/clothing/belts.dmi'
+ slot_flags = SLOT_BELT
+ drop_sound = 'sound/items/drop/rubber.ogg'
+
+/obj/item/toy/xmastree
+ name = "Miniature Christmas tree"
+ desc = "Tiny cute Christmas tree."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "tinyxmastree"
+ w_class = ITEMSIZE_TINY
+ force = 1
+ throwforce = 1
+ drop_sound = 'sound/items/drop/box.ogg'
+
+//////////////////////////////////////////////////////
+// Chess Pieces //
+//////////////////////////////////////////////////////
+
+/obj/item/toy/chess
+ name = "chess piece"
+ desc = "This should never display."
+ icon = 'icons/obj/chess.dmi'
+ w_class = ITEMSIZE_SMALL
+ force = 1
+ throwforce = 1
+ drop_sound = 'sound/items/drop/glass.ogg'
+
+/obj/item/toy/chess/pawn_white
+ name = "blue pawn"
+ desc = "A large pawn piece for playing chess. It's made of a blue-colored glass."
+ description_info = "Pawns can move forward one square, if that square is unoccupied. If the pawn has not yet moved, it has the option of moving two squares forward provided both squares in front of the pawn are unoccupied. A pawn cannot move backward. They can only capture an enemy piece on either of the two tiles diagonally in front of them, but not the tile directly in front of them."
+ icon_state = "w-pawn"
+/obj/item/toy/chess/pawn_black
+ name = "purple pawn"
+ desc = "A large pawn piece for playing chess. It's made of a purple-colored glass."
+ description_info = "Pawns can move forward one square, if that square is unoccupied. If the pawn has not yet moved, it has the option of moving two squares forward provided both squares in front of the pawn are unoccupied. A pawn cannot move backward. They can only capture an enemy piece on either of the two tiles diagonally in front of them, but not the tile directly in front of them."
+ icon_state = "b-pawn"
+/obj/item/toy/chess/rook_white
+ name = "blue rook"
+ desc = "A large rook piece for playing chess. It's made of a blue-colored glass."
+ description_info = "The Rook can move any number of vacant squares vertically or horizontally."
+ icon_state = "w-rook"
+/obj/item/toy/chess/rook_black
+ name = "purple rook"
+ desc = "A large rook piece for playing chess. It's made of a purple-colored glass."
+ description_info = "The Rook can move any number of vacant squares vertically or horizontally."
+ icon_state = "b-rook"
+/obj/item/toy/chess/knight_white
+ name = "blue knight"
+ desc = "A large knight piece for playing chess. It's made of a blue-colored glass. Sadly, you can't ride it."
+ description_info = "The Knight can either move two squares horizontally and one square vertically or two squares vertically and one square horizontally. The knight's movement can also be viewed as an 'L' laid out at any horizontal or vertical angle."
+ icon_state = "w-knight"
+/obj/item/toy/chess/knight_black
+ name = "purple knight"
+ desc = "A large knight piece for playing chess. It's made of a purple-colored glass. 'Just a flesh wound.'"
+ description_info = "The Knight can either move two squares horizontally and one square vertically or two squares vertically and one square horizontally. The knight's movement can also be viewed as an 'L' laid out at any horizontal or vertical angle."
+ icon_state = "b-knight"
+/obj/item/toy/chess/bishop_white
+ name = "blue bishop"
+ desc = "A large bishop piece for playing chess. It's made of a blue-colored glass."
+ description_info = "The Bishop can move any number of vacant squares in any diagonal direction."
+ icon_state = "w-bishop"
+/obj/item/toy/chess/bishop_black
+ name = "purple bishop"
+ desc = "A large bishop piece for playing chess. It's made of a purple-colored glass."
+ description_info = "The Bishop can move any number of vacant squares in any diagonal direction."
+ icon_state = "b-bishop"
+/obj/item/toy/chess/queen_white
+ name = "blue queen"
+ desc = "A large queen piece for playing chess. It's made of a blue-colored glass."
+ description_info = "The Queen can move any number of vacant squares diagonally, horizontally, or vertically."
+ icon_state = "w-queen"
+/obj/item/toy/chess/queen_black
+ name = "purple queen"
+ desc = "A large queen piece for playing chess. It's made of a purple-colored glass."
+ description_info = "The Queen can move any number of vacant squares diagonally, horizontally, or vertically."
+ icon_state = "b-queen"
+/obj/item/toy/chess/king_white
+ name = "blue king"
+ desc = "A large king piece for playing chess. It's made of a blue-colored glass."
+ description_info = "The King can move exactly one square horizontally, vertically, or diagonally. If your opponent captures this piece, you lose."
+ icon_state = "w-king"
+/obj/item/toy/chess/king_black
+ name = "purple king"
+ desc = "A large king piece for playing chess. It's made of a purple-colored glass."
+ description_info = "The King can move exactly one square horizontally, vertically, or diagonally. If your opponent captures this piece, you lose."
icon_state = "b-king"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index 88d9b0ff5d..22abe36ab4 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -87,17 +87,17 @@
/obj/item/toy/crossbow,
/obj/item/weapon/gun/projectile/revolver/capgun,
/obj/item/toy/katana,
- /obj/item/toy/prize/deathripley,
- /obj/item/toy/prize/durand,
- /obj/item/toy/prize/fireripley,
- /obj/item/toy/prize/gygax,
- /obj/item/toy/prize/honk,
- /obj/item/toy/prize/marauder,
- /obj/item/toy/prize/mauler,
- /obj/item/toy/prize/odysseus,
- /obj/item/toy/prize/phazon,
- /obj/item/toy/prize/ripley,
- /obj/item/toy/prize/seraph,
+ /obj/item/toy/mecha/deathripley,
+ /obj/item/toy/mecha/durand,
+ /obj/item/toy/mecha/fireripley,
+ /obj/item/toy/mecha/gygax,
+ /obj/item/toy/mecha/honk,
+ /obj/item/toy/mecha/marauder,
+ /obj/item/toy/mecha/mauler,
+ /obj/item/toy/mecha/odysseus,
+ /obj/item/toy/mecha/phazon,
+ /obj/item/toy/mecha/ripley,
+ /obj/item/toy/mecha/seraph,
/obj/item/toy/spinningtoy,
/obj/item/toy/sword,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus,
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index 0c8223a5bc..db799f8e8d 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -507,17 +507,17 @@
/obj/item/weapon/reagent_containers/spray/waterflower,
/obj/item/toy/eight_ball,
/obj/item/toy/eight_ball/conch,
- /obj/item/toy/prize/ripley,
- /obj/item/toy/prize/fireripley,
- /obj/item/toy/prize/deathripley,
- /obj/item/toy/prize/gygax,
- /obj/item/toy/prize/durand,
- /obj/item/toy/prize/honk,
- /obj/item/toy/prize/marauder,
- /obj/item/toy/prize/seraph,
- /obj/item/toy/prize/mauler,
- /obj/item/toy/prize/odysseus,
- /obj/item/toy/prize/phazon)
+ /obj/item/toy/mecha/ripley,
+ /obj/item/toy/mecha/fireripley,
+ /obj/item/toy/mecha/deathripley,
+ /obj/item/toy/mecha/gygax,
+ /obj/item/toy/mecha/durand,
+ /obj/item/toy/mecha/honk,
+ /obj/item/toy/mecha/marauder,
+ /obj/item/toy/mecha/seraph,
+ /obj/item/toy/mecha/mauler,
+ /obj/item/toy/mecha/odysseus,
+ /obj/item/toy/mecha/phazon)
/obj/random/mouseremains
name = "random mouseremains"
diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm
index 47e52f3b61..063a2de903 100644
--- a/code/modules/mining/abandonedcrates.dm
+++ b/code/modules/mining/abandonedcrates.dm
@@ -58,7 +58,7 @@
if(53 to 54)
new/obj/item/latexballon(src)
if(55 to 56)
- var/newitem = pick(typesof(/obj/item/toy/prize) - /obj/item/toy/prize)
+ var/newitem = pick(typesof(/obj/item/toy/mecha) - /obj/item/toy/mecha)
new newitem(src)
if(57 to 58)
new/obj/item/toy/syndicateballoon(src)
diff --git a/html/changelogs/rykka-stormheart.yml b/html/changelogs/rykka-stormheart.yml
new file mode 100644
index 0000000000..5967df1bfa
--- /dev/null
+++ b/html/changelogs/rykka-stormheart.yml
@@ -0,0 +1,38 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Rykka Stormheart
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Adds a mech vs mech combat system for the toy mechs earned from arcades and found around the station."
+ - rscadd: "You can initiate combat with yourself by hitting a toy mech with another toy mech, or fight another player if you attack a player holding a mech with a mech."
+ - rscadd: "Each mech has its own health stat and special ability that they'll use in combat against each other."
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 15f9143b69..21b649006c 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/polaris.dme b/polaris.dme
index f216a60065..0b793eba39 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -955,7 +955,6 @@
#include "code\game\objects\items\contraband.dm"
#include "code\game\objects\items\crayons.dm"
#include "code\game\objects\items\glassjar.dm"
-#include "code\game\objects\items\godfigures.dm"
#include "code\game\objects\items\gunbox.dm"
#include "code\game\objects\items\latexballoon.dm"
#include "code\game\objects\items\paintkit.dm"
@@ -963,7 +962,6 @@
#include "code\game\objects\items\robobag.dm"
#include "code\game\objects\items\shooting_range.dm"
#include "code\game\objects\items\tailoring.dm"
-#include "code\game\objects\items\toys.dm"
#include "code\game\objects\items\trash.dm"
#include "code\game\objects\items\trash_material.dm"
#include "code\game\objects\items\uav.dm"
@@ -1035,6 +1033,9 @@
#include "code\game\objects\items\stacks\sheets\leather.dm"
#include "code\game\objects\items\stacks\tiles\fifty_spawner_tiles.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
+#include "code\game\objects\items\toys\godfigures.dm"
+#include "code\game\objects\items\toys\mech_toys.dm"
+#include "code\game\objects\items\toys\toys.dm"
#include "code\game\objects\items\weapons\AI_modules.dm"
#include "code\game\objects\items\weapons\autopsy.dm"
#include "code\game\objects\items\weapons\bones.dm"
diff --git a/sound/machines/honkbot_evil_laugh.ogg b/sound/machines/honkbot_evil_laugh.ogg
new file mode 100644
index 0000000000..7b12edf8a3
Binary files /dev/null and b/sound/machines/honkbot_evil_laugh.ogg differ
diff --git a/sound/mecha/mech_shield_deflect.ogg b/sound/mecha/mech_shield_deflect.ogg
new file mode 100644
index 0000000000..5c1970d872
Binary files /dev/null and b/sound/mecha/mech_shield_deflect.ogg differ
diff --git a/sound/mecha/mech_shield_drop.ogg b/sound/mecha/mech_shield_drop.ogg
new file mode 100644
index 0000000000..21c6cb5edb
Binary files /dev/null and b/sound/mecha/mech_shield_drop.ogg differ
diff --git a/sound/mecha/mech_shield_raise.ogg b/sound/mecha/mech_shield_raise.ogg
new file mode 100644
index 0000000000..65ad70ad14
Binary files /dev/null and b/sound/mecha/mech_shield_raise.ogg differ
diff --git a/sound/weapons/parry.ogg b/sound/weapons/parry.ogg
new file mode 100644
index 0000000000..ff60f3c8b8
Binary files /dev/null and b/sound/weapons/parry.ogg differ