From 13263b41a5a4a0d77538d26ab614e3416dc542a5 Mon Sep 17 00:00:00 2001 From: Rykka Date: Wed, 12 Aug 2020 04:38:30 -0400 Subject: [PATCH 1/4] Adds Mech Toy Battles! Adds a mech vs mech combat system for the toy mechs earned from arcades and found around the station. 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. Each mech has its own health stat and special ability that they'll use in combat against each other. How exciting! Also slightly refactors toy locations and changes toy mechs from being JUST prizes to their own proper toy subtype! Upstream of https://github.com/VOREStation/VOREStation/pull/8665 --- .../objects/items/{ => toys}/godfigures.dm | 0 code/game/objects/items/toys/mech_toys.dm | 642 ++++ code/game/objects/items/{ => toys}/toys.dm | 2969 ++++++++--------- .../objects/items/weapons/gift_wrappaper.dm | 22 +- code/game/objects/random/misc.dm | 22 +- code/modules/mining/abandonedcrates.dm | 2 +- icons/obj/toy.dmi | Bin 67581 -> 67581 bytes polaris.dme | 5 +- sound/machines/honkbot_evil_laugh.ogg | Bin 0 -> 18967 bytes sound/mecha/mech_shield_deflect.ogg | Bin 0 -> 11708 bytes sound/mecha/mech_shield_drop.ogg | Bin 0 -> 17325 bytes sound/mecha/mech_shield_raise.ogg | Bin 0 -> 25055 bytes sound/weapons/parry.ogg | Bin 0 -> 9924 bytes 13 files changed, 2108 insertions(+), 1554 deletions(-) rename code/game/objects/items/{ => toys}/godfigures.dm (100%) create mode 100644 code/game/objects/items/toys/mech_toys.dm rename code/game/objects/items/{ => toys}/toys.dm (92%) create mode 100644 sound/machines/honkbot_evil_laugh.ogg create mode 100644 sound/mecha/mech_shield_deflect.ogg create mode 100644 sound/mecha/mech_shield_drop.ogg create mode 100644 sound/mecha/mech_shield_raise.ogg create mode 100644 sound/weapons/parry.ogg 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..826c5d374d --- /dev/null +++ b/code/game/objects/items/toys/mech_toys.dm @@ -0,0 +1,642 @@ +/* + * 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/mech + icon = 'icons/obj/toy.dmi' + icon_state = "ripleytoy" + drop_sound = 'sound/mecha/mechstep.ogg' + reach = 2 // So you can battle across the table! + + // Mech Battle Vars + var/timer = 0 // Timer when it'll be off cooldown + var/cooldown = 1.5 SECONDS // Cooldown between play sessions (and interactions) + 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/mech/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/mech/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/mech/proc/combat_sleep(var/delay, obj/item/toy/mech/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/mech/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/mech/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/mech/attackby(obj/item/user_toy, mob/living/user) + if(istype(user_toy, /obj/item/toy/mech)) + var/obj/item/toy/mech/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/mech/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/mech)) //if you attack someone with a mech who's also holding a mech, offer to battle them + var/obj/item/toy/mech/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/mech/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/mech/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/mech/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/mech/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/mech/proc/mecha_brawl(obj/item/toy/mech/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/mech/proc/check_battle_start(mob/living/carbon/user, obj/item/toy/mech/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/mech/proc/special_attack_move(obj/item/toy/mech/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/mech/proc/super_special_attack(obj/item/toy/mech/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/mech)) + +/obj/item/toy/mech/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/mech/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/mech/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/mech/deathripley/super_special_attack(obj/item/toy/mech/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/mech/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/mech/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/mech/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/mech/honk/super_special_attack(obj/item/toy/mech/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/mech/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/mech/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/mech/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/mech/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/mech/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/mech/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/mech/reticence/super_special_attack(obj/item/toy/mech/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/mech/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..7739514b4c 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/mech/deathripley, + /obj/item/toy/mech/durand, + /obj/item/toy/mech/fireripley, + /obj/item/toy/mech/gygax, + /obj/item/toy/mech/honk, + /obj/item/toy/mech/marauder, + /obj/item/toy/mech/mauler, + /obj/item/toy/mech/odysseus, + /obj/item/toy/mech/phazon, + /obj/item/toy/mech/ripley, + /obj/item/toy/mech/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..6d520419fd 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/mech/ripley, + /obj/item/toy/mech/fireripley, + /obj/item/toy/mech/deathripley, + /obj/item/toy/mech/gygax, + /obj/item/toy/mech/durand, + /obj/item/toy/mech/honk, + /obj/item/toy/mech/marauder, + /obj/item/toy/mech/seraph, + /obj/item/toy/mech/mauler, + /obj/item/toy/mech/odysseus, + /obj/item/toy/mech/phazon) /obj/random/mouseremains name = "random mouseremains" diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 47e52f3b61..d1a587fef6 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/mech) - /obj/item/toy/mech) new newitem(src) if(57 to 58) new/obj/item/toy/syndicateballoon(src) diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 15f9143b6963247fd49e0d98aa4ec5dfa718d3bb..21b649006c0f1983ecbc2b7789ddf96ce839e87b 100644 GIT binary patch delta 918 zcmV;H18MyIj|BaX1dvF7XtD{gmpOEiqR63r2U?;n*0QKjavbOB_b>%An`EHB$SJ@l zN~9%@?9bi5-@ZTm?CyU&?4Q_*XzGsL?O$K^yH$J*-Ld=oX1@z8W2mQpN~Ox(vHLVA z&7Q1&+V8wr>5kp)em5A+T)Ja-{R$oBaY?W2`eQaI&CaxxUe_jnE{Ss1+;+Lw=cZbz zvh@_BYI~jiVx@kp?)E#+k+$yGT_1k`?RQZ%zX@SF@x_@w7;wJ8E50}|Xf0W5ckHfj z5C0s_0vL_W#Eix$7c#qf&FtoIwh2sf=gO{s%2PX2Umh1~pFmEdBnBRS z0Ddt8u-zW#Ciz84s5` zko{VmaH^1Gr^6r)$hU0COS^baVj6WsCSS=s(A!5&3?`n-<^no>CZn0Xxb`8lb~JCA zILD=g^CDe;xE2c~lsdB9ush>bl7G|3nRA&obec(O<@bxawD-3;2Nch`l=qbZ@Ri2) zv54|Q=F#vai)TaiK(-PbI!L?2R!Q6QOr;vPBZ^~32E6D<1|ppf14A-Pg0eZiGC*^i%taGIJ#u^NBe}^@`)6o0-VnD2 zsf@r=y%AZ2W-bt|)c4Rb>+;NA5y>)!deu{mz{W_x+ei(j>pjLqI5LB?+z-Y{=JTB6{JN0p4OwN)jCQtnWvsu!F s$+8ACn)Qz}*Nj@_q0 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 ooBG)Z(~%b9BTH@j>up2{=41mr_d0-O??6C@Za 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 JU%LU|6#!;eSx*1} literal 0 HcmV?d00001 diff --git a/sound/mecha/mech_shield_deflect.ogg b/sound/mecha/mech_shield_deflect.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5c1970d872408b831b705f2785f4a0fc9dcfd536 GIT binary patch literal 11708 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 literal 0 HcmV?d00001 diff --git a/sound/mecha/mech_shield_drop.ogg b/sound/mecha/mech_shield_drop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..21c6cb5edb9c1646e03eba1e18bca3e2e22b04bc GIT binary patch literal 17325 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 z zHuA7fmMj{G1HLzR&F$*MmfgG%|J@{FKOiF_$0{{um=zW0XZOSlA1{Y+W2 z^f6)}<*#Xh)VyLV5Gh7{C_bA+N zuZ;!ysu#cjEvBC~=W@bO}c>*DGnf z3wKz3tjO`Y7x2uV@=oCshoU-cO>g$3HETbtRDLY2$ACFKUoV2HPVk%wDjCZ5^Q8qm zn?}CziyX_bY>%mB&(M5sCkn>*Ck@HsFJ$Lu0W{*_vPrt&+ByAD9|rE`g+ALHV5MUM z0@v*8g!W7u*=2o;gb-LDyHn#p+~R@zH6C^Gib9(359;BS^BL#_+;J{`bNJF1SwTmGLHPuAVo_!ow%_n_J5*fB)F7mQfw8BVe>@M9DMb1}GeX+5Z$@y3E+ati(; zbFn$3z`M)?90x)5&J{cH%FuDdgjW4vR}(5NKCI0w76R*CmRN7~WX;qN+00;Ak)OCm zXk~k3JdYy|fgA>+QMO4qt?BO%7*;aV-5_0Vr~pb33N_%He7C&%QEtZOtOJ_Lj|A|0 z4&{@1x0^Q;x#6JqQ!Zswr9Eacg5l+n<0KB#$||?aKJ~v&y3mtirD;4;FOcW z1x+B!^!d0K)rem&xWm#&1OFwB<;55)))qsPA@&r1t9&~f=Atn3b>XDp?nmeS_fEsr zB|qYnL+^Xm9%!;71Fe!QH$_e-&07z#aJ;f5vxWo6 zVMGYvfmJim+m@>%uf2$aJWjaRp*Z;RrHv{;XR`>{sYq{M$2f2%xb|{8xi#X?jejWl z*5)dG5xTC@Mq_Ka6MMg060=$&o75jRu$O_*<ZdJsAw7u43TcOMHd4f&|wBzn1cBo%WA(=*TpuPhRBO9V4XXh2^9OKn;mlJDXYWy zX=d!^(_K%{NhjaHnSsc1#JZIvHf~ec^zfd(|HlalhrPs6@YKyF{woiU;}8LS5w9xf zheXW2S_1FqJ8$$zJR+5E?obt8(8zC1H>u#i-7FzW#kDZ%o}-(2KJiSQ!jY;t5T)KsB_pmz;soELceD z3p-oYEx@!QvZ+Sq(G-8En}r&GAtbMF6~i6Yl?o6t^R_vq&^9#6gcf*zDF!WvR(hT+ z0}p-#EN2%^8hUBpuAUS)F8w)izWseitQhv9Q;z3xl5Nf}H5zB>qA%VauQb9D%R}=c zUvBJWiMe}Yc>BL(Y1y${i`IA}e?frBv=H4@7J$-W>RmaPD(^tKxr`C!{?HSGlKn}- z95WhxnF0oisBKa!R-8Ckx%O zY^VS9J|Qb_{}6D!US`TK?sAQ9QjjwV)sJvw4DD;`onbcm*{{})0x|Q^{hhxL^>7aU zUnv|mu>r1@4PU#W*Q~8lFB&;~SXJ~g8THobE|Rd)@xB=PnSFJ@ zXvbeKlGP~-@k386GI!>{1&^@nnYNKMbu27c!1Sx{+ysV5kruu;pCT-F20c^nD~GsT z8HTddiuEvtXCCY3%h8Xt7Y2F2A;S##_$Dq4ONRxS$IdT?`gh$oRW<%M_dj74AnOEy zS%?ONfIJ{%>OHoU;L56$Zh3YG1BZfdwP!5*WFXQS5@1Vn?Q=2HJC2%^lL?Y67-aN1 zWwPJq6@_GR1fi=&5+TG5McB=F<2dG~2uXRfw6@D~Cp-wfEbFg%L4AmNtWcU)lK0;2}1x~y2Heq z=`cYMDvqF;(~6MKSr7cM1OS+==OmWn99{>wpE3$+pSc@xB4ltKy^`LkSfI|$M(CgGiN2vdr(QnW|~K&IW0T|tfS_;&1kpF!KMBc1^m+4+o5+_1zhYrV?~?+4Ot zEUMSE3uQZX#_Os$lzd>;?96KgS|A5Zi0Jf+h<5_OKEw(WVfj})2fW>{Gg#nB+u!}Z zP~l7XwzUE9XM%7byDrXLa^|9I4#c7ol#fz%!|zEQ6`b@RozRp#^j?1HBqL436xiFOC3K^Tj-F4UF*zYI0WKak zHU!HC@U$q;AS;U`_(X>q=4?jusJqZP}SFxL{*qRP#k?j(MyscDb% zam0+l53?a>%HfZS?T(F96nX=6nB4IsjoUvn;<2UT5g-S`-aT z`E9VG>N6U2MnUZfxcNvhpfa-#_`u`6OPd0x;y=;qA%F#Bn%u4SUpEKwA~(U<`@x$( zt%5+;bL=x_WuhsgwP$HEr4=L?szIsZg_w?_vb$Ox5jsP0)!cf)ybP)E&e9a_PZM!! zben~>hyH-*E(Pw0zy+WTNR3sNhjK(v)sROuEjf{zMX)}3y;YHK7Y$RIv(DyR3}Aqw z+nd}Dpql-Api#;H{09m7w50G_kbJ^)HiyJ*4`toS9|vR9TPQb}Te4Sv@pM!0B2b9n zu(~;Jc>o?4L>Y)sz%O5U*z?uQD=cIMm@`T4>yh262XpoGvJZ26Sy^$Y#nAua50B6n_+&ufP1g+@5-OVv zthdNw=OG4V-NM=@)DDm-Gf66d3eMsW&+Mov1vDO{?Nl;mhfb^P(bxNp&z!+tceH00{DOPAVtK)eWH_+n$PC~*`HoTWQb)td7^>t_-Fh&>mRxZ z&aaSrR_tac5$-=~F@tKs#~3`(y0(-MyM%~=uG7tkmM<_JCU@7gB>$$0m>J0eO;Uge z!u*qu{~D0D5)>x{^frf!7bp^ rB~S?qo^1Wsd`14W0XYBZM*6o!^8adi@wY`Eoa^5%|7P;{5kUPv=_6=o literal 0 HcmV?d00001 diff --git a/sound/mecha/mech_shield_raise.ogg b/sound/mecha/mech_shield_raise.ogg new file mode 100644 index 0000000000000000000000000000000000000000..65ad70ad14d61464448b9fab2e278189d360c950 GIT binary patch literal 25055 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 b4m`ZHkqC?^0QQtXD1%MizTk_;BEbIxNX@vh literal 0 HcmV?d00001 diff --git a/sound/weapons/parry.ogg b/sound/weapons/parry.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ff60f3c8b8fea911d4ce05415c693cbda9fd2c66 GIT binary patch literal 9924 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 Date: Wed, 12 Aug 2020 20:13:45 -0400 Subject: [PATCH 2/4] Rename toy/mech to toy/mecha to match mecha code. --- code/game/objects/items/toys/mech_toys.dm | 74 +++++++++---------- .../objects/items/weapons/gift_wrappaper.dm | 22 +++--- code/game/objects/random/misc.dm | 22 +++--- code/modules/mining/abandonedcrates.dm | 2 +- 4 files changed, 60 insertions(+), 60 deletions(-) diff --git a/code/game/objects/items/toys/mech_toys.dm b/code/game/objects/items/toys/mech_toys.dm index 826c5d374d..cf1b493489 100644 --- a/code/game/objects/items/toys/mech_toys.dm +++ b/code/game/objects/items/toys/mech_toys.dm @@ -12,7 +12,7 @@ // Max length of a mech battle #define MAX_BATTLE_LENGTH 50 -/obj/item/toy/mech +/obj/item/toy/mecha icon = 'icons/obj/toy.dmi' icon_state = "ripleytoy" drop_sound = 'sound/mecha/mechstep.ogg' @@ -35,7 +35,7 @@ var/wins = 0 // This mech's win count in combat var/losses = 0 // ...And their loss count in combat -/obj/item/toy/mech/Initialize() +/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 @@ -51,7 +51,7 @@ else special_attack_type_message = "a mystery move, even I don't know." -/obj/item/toy/mech/proc/in_range(source, user) // Modify our in_range proc specifically for mech battles! +/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 @@ -72,7 +72,7 @@ * * opponent - (optional) the defender controller in the battle, for PvP */ -/obj/item/toy/mech/proc/combat_sleep(var/delay, obj/item/toy/mech/attacker, mob/living/carbon/attacker_controller, mob/living/carbon/opponent) +/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 @@ -115,7 +115,7 @@ return TRUE //all credit to skasi for toy mech fun ideas -/obj/item/toy/mech/attack_self(mob/user) +/obj/item/toy/mecha/attack_self(mob/user) if(timer < world.time) to_chat(user, "You play with [src].") timer = world.time + cooldown @@ -123,7 +123,7 @@ else . = ..() -/obj/item/toy/mech/attack_hand(mob/user) +/obj/item/toy/mecha/attack_hand(mob/user) . = ..() if(.) return @@ -133,9 +133,9 @@ /** * If you attack a mech with a mech, initiate combat between them */ -/obj/item/toy/mech/attackby(obj/item/user_toy, mob/living/user) - if(istype(user_toy, /obj/item/toy/mech)) - var/obj/item/toy/mech/M = user_toy +/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) ..() @@ -143,7 +143,7 @@ /** * Attack is called from the user's toy, aimed at target(another human), checking for target's toy. */ -/obj/item/toy/mech/attack(mob/living/carbon/human/target, mob/living/carbon/human/user) +/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 @@ -155,8 +155,8 @@ return for(var/obj/item/I in target.get_all_held_items()) - if(istype(I, /obj/item/toy/mech)) //if you attack someone with a mech who's also holding a mech, offer to battle them - var/obj/item/toy/mech/M = I + 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 @@ -179,7 +179,7 @@ /** * Overrides attack_tk - Sorry, you have to be face to face to initiate a battle, it's good sportsmanship */ -/obj/item/toy/mech/attack_tk(mob/user) +/obj/item/toy/mecha/attack_tk(mob/user) if(timer < world.time) to_chat(user, "You telekinetically play with [src].") timer = world.time + cooldown @@ -192,14 +192,14 @@ * Arguments: * * user - the user wanting to do battle */ -/obj/item/toy/mech/proc/withdraw_offer(mob/living/carbon/user) +/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/mech/suicide_act(mob/living/carbon/user) +/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 @@ -239,7 +239,7 @@ wins++ return (BRUTELOSS) -/obj/item/toy/mech/examine() +/obj/item/toy/mecha/examine() . = ..() . += "This toy's special attack is [special_attack_cry], [special_attack_type_message] " if(in_combat) @@ -264,7 +264,7 @@ * * 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/mech/proc/mecha_brawl(obj/item/toy/mech/attacker, mob/living/carbon/attacker_controller, mob/living/carbon/opponent) +/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! ", \ @@ -433,7 +433,7 @@ * * 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/mech/proc/check_battle_start(mob/living/carbon/user, obj/item/toy/mech/attacker, mob/living/carbon/target) +/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. @@ -467,7 +467,7 @@ * Arguments: * * victim - the toy being hit by the special move */ -/obj/item/toy/mech/proc/special_attack_move(obj/item/toy/mech/victim) +/obj/item/toy/mecha/proc/special_attack_move(obj/item/toy/mecha/victim) visible_message(special_attack_cry + "!!") special_attack_charged = FALSE @@ -496,7 +496,7 @@ * Arguments: * * victim - the toy being hit by the super special move (doesn't necessarily need to be used) */ -/obj/item/toy/mech/proc/super_special_attack(obj/item/toy/mech/victim) +/obj/item/toy/mecha/proc/super_special_attack(obj/item/toy/mecha/victim) visible_message(" [src] does a cool flip.") /obj/random/mech_toy @@ -506,16 +506,16 @@ icon_state = "ripleytoy" /obj/random/mech_toy/item_to_spawn() - return pick(typesof(/obj/item/toy/mech)) + return pick(typesof(/obj/item/toy/mecha)) -/obj/item/toy/mech/ripley +/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/mech/fireripley +/obj/item/toy/mecha/fireripley name = "toy firefighting ripley" desc = "Mini-Mecha action figure! Collect them all! 2/11." icon_state = "fireripleytoy" @@ -523,7 +523,7 @@ special_attack_type = SPECIAL_ATTACK_UTILITY special_attack_cry = "FIRE SHIELD" -/obj/item/toy/mech/deathripley +/obj/item/toy/mecha/deathripley name = "toy deathsquad ripley" desc = "Mini-Mecha action figure! Collect them all! 3/11." icon_state = "deathripleytoy" @@ -532,7 +532,7 @@ 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/mech/deathripley/super_special_attack(obj/item/toy/mech/victim) +/obj/item/toy/mecha/deathripley/super_special_attack(obj/item/toy/mecha/victim) playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 20, TRUE) if(victim.combat_health < combat_health) // Instantly kills the other mech if it's health is below our's. visible_message("EXECUTE!!") @@ -540,7 +540,7 @@ else // Otherwise, just deal one damage. victim.combat_health-- -/obj/item/toy/mech/gygax +/obj/item/toy/mecha/gygax name = "toy gygax" desc = "Mini-Mecha action figure! Collect them all! 4/11." icon_state = "gygaxtoy" @@ -548,7 +548,7 @@ special_attack_type = SPECIAL_ATTACK_UTILITY special_attack_cry = "SUPER SERVOS" -/obj/item/toy/mech/durand +/obj/item/toy/mecha/durand name = "toy durand" desc = "Mini-Mecha action figure! Collect them all! 5/11." icon_state = "durandtoy" @@ -556,7 +556,7 @@ special_attack_type = SPECIAL_ATTACK_HEAL special_attack_cry = "SHIELD OF PROTECTION" -/obj/item/toy/mech/honk +/obj/item/toy/mecha/honk name = "toy H.O.N.K." desc = "Mini-Mecha action figure! Collect them all! 6/11." icon_state = "honktoy" @@ -565,12 +565,12 @@ 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/mech/honk/super_special_attack(obj/item/toy/mech/victim) +/obj/item/toy/mecha/honk/super_special_attack(obj/item/toy/mecha/victim) playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 20, TRUE) victim.special_attack_cooldown += 3 // Adds cooldown to the other mech and gives a minor self heal combat_health++ -/obj/item/toy/mech/marauder +/obj/item/toy/mecha/marauder name = "toy marauder" desc = "Mini-Mecha action figure! Collect them all! 7/11." icon_state = "maraudertoy" @@ -578,7 +578,7 @@ special_attack_type = SPECIAL_ATTACK_DAMAGE special_attack_cry = "BEAM BLAST" -/obj/item/toy/mech/seraph +/obj/item/toy/mecha/seraph name = "toy seraph" desc = "Mini-Mecha action figure! Collect them all! 8/11." icon_state = "seraphtoy" @@ -586,7 +586,7 @@ special_attack_type = SPECIAL_ATTACK_DAMAGE special_attack_cry = "ROCKET BARRAGE" -/obj/item/toy/mech/mauler +/obj/item/toy/mecha/mauler name = "toy mauler" desc = "Mini-Mecha action figure! Collect them all! 9/11." icon_state = "maulertoy" @@ -594,7 +594,7 @@ special_attack_type = SPECIAL_ATTACK_DAMAGE special_attack_cry = "BULLET STORM" -/obj/item/toy/mech/odysseus +/obj/item/toy/mecha/odysseus name = "toy odysseus" desc = "Mini-Mecha action figure! Collect them all! 10/11." icon_state = "odysseustoy" @@ -602,7 +602,7 @@ special_attack_type = SPECIAL_ATTACK_HEAL special_attack_cry = "MECHA BEAM" -/obj/item/toy/mech/phazon +/obj/item/toy/mecha/phazon name = "toy phazon" desc = "Mini-Mecha action figure! Collect them all! 11/11." icon_state = "phazontoy" @@ -611,7 +611,7 @@ special_attack_cry = "NO-CLIP" /* // TG-Station Added toys, commenting these out until I port 'em later. -/obj/item/toy/mech/reticence +/obj/item/toy/mecha/reticence name = "toy Reticence" desc = "12/13" icon_state = "reticencetoy" @@ -621,12 +621,12 @@ 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/mech/reticence/super_special_attack(obj/item/toy/mech/victim) +/obj/item/toy/mecha/reticence/super_special_attack(obj/item/toy/mecha/victim) special_attack_cooldown-- //Has a lower cooldown... victim.special_attack_cooldown++ //and increases the opponent's cooldown by 1... victim.combat_health-- //and some free damage. -/obj/item/toy/mech/clarke +/obj/item/toy/mecha/clarke name = "toy Clarke" desc = "13/13" icon_state = "clarketoy" diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 7739514b4c..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/mech/deathripley, - /obj/item/toy/mech/durand, - /obj/item/toy/mech/fireripley, - /obj/item/toy/mech/gygax, - /obj/item/toy/mech/honk, - /obj/item/toy/mech/marauder, - /obj/item/toy/mech/mauler, - /obj/item/toy/mech/odysseus, - /obj/item/toy/mech/phazon, - /obj/item/toy/mech/ripley, - /obj/item/toy/mech/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 6d520419fd..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/mech/ripley, - /obj/item/toy/mech/fireripley, - /obj/item/toy/mech/deathripley, - /obj/item/toy/mech/gygax, - /obj/item/toy/mech/durand, - /obj/item/toy/mech/honk, - /obj/item/toy/mech/marauder, - /obj/item/toy/mech/seraph, - /obj/item/toy/mech/mauler, - /obj/item/toy/mech/odysseus, - /obj/item/toy/mech/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 d1a587fef6..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/mech) - /obj/item/toy/mech) + 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) From a060680d945c69fac34b1b6cea26f61619d3ac10 Mon Sep 17 00:00:00 2001 From: Rykka Date: Sun, 16 Aug 2020 02:56:42 -0400 Subject: [PATCH 3/4] Adds usage to Description, adds Changelog --- code/game/objects/items/toys/mech_toys.dm | 1 + html/changelogs/rykka-stormheart.yml | 38 +++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 html/changelogs/rykka-stormheart.yml diff --git a/code/game/objects/items/toys/mech_toys.dm b/code/game/objects/items/toys/mech_toys.dm index cf1b493489..b84bb49ae0 100644 --- a/code/game/objects/items/toys/mech_toys.dm +++ b/code/game/objects/items/toys/mech_toys.dm @@ -242,6 +242,7 @@ /obj/item/toy/mecha/examine() . = ..() . += "This toy's special attack is [special_attack_cry], [special_attack_type_message] " + . += "To engage in mech battles, hold this mech while clicking on another toy mech, or a player who is also holding a toy mech." 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!"]" 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." From 3cf157dcfdd95c2e63a64f7ff5e6dac49fe8fae8 Mon Sep 17 00:00:00 2001 From: Rykka Date: Sun, 16 Aug 2020 03:01:08 -0400 Subject: [PATCH 4/4] Relocates additional info to description_info --- code/game/objects/items/toys/mech_toys.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/toys/mech_toys.dm b/code/game/objects/items/toys/mech_toys.dm index b84bb49ae0..a49977c141 100644 --- a/code/game/objects/items/toys/mech_toys.dm +++ b/code/game/objects/items/toys/mech_toys.dm @@ -16,6 +16,7 @@ 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 @@ -242,7 +243,6 @@ /obj/item/toy/mecha/examine() . = ..() . += "This toy's special attack is [special_attack_cry], [special_attack_type_message] " - . += "To engage in mech battles, hold this mech while clicking on another toy mech, or a player who is also holding a toy mech." 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!"]"