diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index b30fd2e6d73..cea40670060 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -3030,7 +3030,7 @@ }, /area/awaymission/cabin/caves/sovietcave) "il" = ( -/obj/item/toy/prize/deathripley{ +/obj/item/toy/mecha/deathripley{ desc = "The mining mecha of the exploration team."; name = "exploraton squad Ripley"; pixel_y = 15 diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index dce777a43c4..b887cecbf40 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -24922,13 +24922,20 @@ /area/command/heads_quarters/cmo) "deG" = ( /obj/structure/table/wood, -/obj/item/storage/pill_bottle/dice, /obj/structure/sign/poster/official/help_others{ pixel_x = -32 }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/toy/figure/paramedic{ + pixel_x = 2; + pixel_y = 8 + }, +/obj/item/storage/pill_bottle/dice{ + pixel_x = -4; + pixel_y = 2 + }, /turf/open/floor/iron, /area/medical/medbay/central) "deJ" = ( @@ -24985,6 +24992,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/item/toy/figure/psychologist{ + pixel_y = 18 + }, /turf/open/floor/iron/white, /area/medical/psychology) "deR" = ( @@ -69777,6 +69787,12 @@ "mZD" = ( /turf/closed/wall, /area/engineering/atmos) +"mZH" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron/grimy, +/area/commons/vacant_room/office) "mZW" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -74510,6 +74526,7 @@ c_tag = "Vacant Office"; dir = 1 }, +/obj/item/toy/figure/assistant, /turf/open/floor/iron/grimy, /area/commons/vacant_room/office) "oft" = ( @@ -89639,6 +89656,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 10 }, +/obj/item/toy/figure/prisoner, /turf/open/floor/iron/dark, /area/security/execution/education) "rZb" = ( @@ -111904,6 +111922,11 @@ /obj/effect/landmark/start/captain, /turf/open/floor/iron/grimy, /area/command/heads_quarters/captain) +"xYl" = ( +/obj/structure/lattice, +/obj/item/toy/figure/ninja, +/turf/open/space, +/area/space/nearstation) "xYr" = ( /obj/machinery/light_switch/directional/west, /obj/structure/table/reinforced, @@ -146414,7 +146437,7 @@ gNW vAo gQS xJg -oLJ +mZH ldY alg gvd @@ -159306,7 +159329,7 @@ aaa aaa aad aaa -aad +xYl aaa aad aaa diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index f53bfb2b99f..fd09883fbe4 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -12050,6 +12050,9 @@ }, /obj/effect/turf_decal/tile/blue, /obj/structure/bookcase/random/reference, +/obj/item/toy/figure/psychologist{ + pixel_y = 18 + }, /turf/open/floor/iron/showroomfloor, /area/medical/psychology) "aOy" = ( @@ -29824,10 +29827,6 @@ /area/hallway/primary/aft) "bZX" = ( /obj/structure/table, -/obj/item/toy/figure/dsquad{ - pixel_x = 6; - pixel_y = 6 - }, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, @@ -88963,6 +88962,10 @@ pixel_x = -8; pixel_y = 2 }, +/obj/item/toy/figure/prisoner{ + pixel_x = 3; + pixel_y = 6 + }, /turf/open/floor/iron/white, /area/security/prison) "xNl" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index c8288e72a29..4d0a2377963 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -64847,7 +64847,7 @@ /area/security/brig) "tkI" = ( /obj/structure/table/wood, -/obj/item/toy/prize/honk{ +/obj/item/toy/mecha/honk{ pixel_y = 12 }, /obj/item/toy/dummy, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 7075a391f00..3102a42e995 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -8506,7 +8506,6 @@ /area/centcom/supplypod/loading/one) "AL" = ( /obj/structure/table/reinforced, -/obj/item/flashlight/seclite, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -8517,6 +8516,11 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/toy/figure/dsquad{ + pixel_x = -3; + pixel_y = 11 + }, +/obj/item/flashlight/seclite, /turf/open/floor/iron/dark, /area/centcom/ferry) "AM" = ( diff --git a/_maps/shuttles/arrival_delta.dmm b/_maps/shuttles/arrival_delta.dmm index 68b0266801d..938a8e5b179 100644 --- a/_maps/shuttles/arrival_delta.dmm +++ b/_maps/shuttles/arrival_delta.dmm @@ -291,7 +291,6 @@ "B" = ( /obj/structure/table/reinforced, /obj/item/clipboard, -/obj/item/toy/figure/assistant, /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/shuttle/arrival) diff --git a/code/datums/elements/series.dm b/code/datums/elements/series.dm new file mode 100644 index 00000000000..a9863cd468c --- /dev/null +++ b/code/datums/elements/series.dm @@ -0,0 +1,33 @@ +/** + * ## series element! + * + * bespoke element that assigns a series number to toys on examine, and shows their series name! + * used for mechas and rare collectable hats, should totally be used for way more ;) + */ +/datum/element/series + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + var/list/subtype_list + var/series_name + +/datum/element/series/Attach(datum/target, subtype, series_name) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + if(!subtype) + stack_trace("series element without subtype given!") + return ELEMENT_INCOMPATIBLE + subtype_list = subtypesof(subtype) + src.series_name = series_name + var/atom/attached = target + RegisterSignal(attached, COMSIG_PARENT_EXAMINE, .proc/on_examine) + +/datum/element/series/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_PARENT_EXAMINE) + +///signal called examining +/datum/element/series/proc/on_examine(datum/target, mob/user, list/examine_list) + var/series_number = subtype_list.Find(target.type) + examine_list += span_boldnotice("[target] is part of the \"[series_name]\" series!") + examine_list += span_notice("Collect them all: [series_number]/[length(subtype_list)].") diff --git a/code/game/machinery/computer/arcade/arcade.dm b/code/game/machinery/computer/arcade/arcade.dm index 464b56e1e1b..5bb0a24ed0a 100644 --- a/code/game/machinery/computer/arcade/arcade.dm +++ b/code/game/machinery/computer/arcade/arcade.dm @@ -10,19 +10,24 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/storage/crayons = 2, /obj/item/toy/spinningtoy = 2, /obj/item/toy/balloon/arrest = 2, - /obj/item/toy/prize/ripley = 1, - /obj/item/toy/prize/fireripley = 1, - /obj/item/toy/prize/deathripley = 1, - /obj/item/toy/prize/gygax = 1, - /obj/item/toy/prize/durand = 1, - /obj/item/toy/prize/honk = 1, - /obj/item/toy/prize/marauder = 1, - /obj/item/toy/prize/seraph = 1, - /obj/item/toy/prize/mauler = 1, - /obj/item/toy/prize/odysseus = 1, - /obj/item/toy/prize/phazon = 1, - /obj/item/toy/prize/reticence = 1, - /obj/item/toy/prize/clarke = 1, + /obj/item/toy/mecha/ripley = 1, + /obj/item/toy/mecha/ripleymkii = 1, + /obj/item/toy/mecha/hauler = 1, + /obj/item/toy/mecha/clarke = 1, + /obj/item/toy/mecha/odysseus = 1, + /obj/item/toy/mecha/gygax = 1, + /obj/item/toy/mecha/durand = 1, + /obj/item/toy/mecha/savannahivanov = 1, + /obj/item/toy/mecha/phazon = 1, + /obj/item/toy/mecha/honk = 1, + /obj/item/toy/mecha/darkgygax = 1, + /obj/item/toy/mecha/mauler = 1, + /obj/item/toy/mecha/darkhonk = 1, + /obj/item/toy/mecha/deathripley = 1, + /obj/item/toy/mecha/reticence = 1, + /obj/item/toy/mecha/marauder = 1, + /obj/item/toy/mecha/seraph = 1, + /obj/item/toy/mecha/firefighter = 1, /obj/item/toy/cards/deck = 2, /obj/item/toy/nuke = 2, /obj/item/toy/minimeteor = 2, diff --git a/code/game/objects/items/toy_mechs.dm b/code/game/objects/items/toy_mechs.dm index f7ae99edc81..0055ea16f93 100644 --- a/code/game/objects/items/toy_mechs.dm +++ b/code/game/objects/items/toy_mechs.dm @@ -11,9 +11,9 @@ /// Max length of a mech battle #define MAX_BATTLE_LENGTH 50 -/obj/item/toy/prize +/obj/item/toy/mecha icon = 'icons/obj/toy.dmi' - icon_state = "ripleytoy" + icon_state = "fivestarstoy" verb_say = "beeps" verb_ask = "beeps" verb_exclaim = "beeps" @@ -50,9 +50,9 @@ /// ...And their loss count in combat var/losses = 0 -/obj/item/toy/prize/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]." + AddElement(/datum/element/series, /obj/item/toy/mecha, "Mini-Mecha action figures") combat_health = max_combat_health switch(special_attack_type) if(SPECIAL_ATTACK_DAMAGE) @@ -80,7 +80,7 @@ * * 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/prize/proc/combat_sleep(delay, obj/item/toy/prize/attacker, mob/living/carbon/attacker_controller, mob/living/carbon/opponent) +/obj/item/toy/mecha/proc/combat_sleep(delay, obj/item/toy/mecha/attacker, mob/living/carbon/attacker_controller, mob/living/carbon/opponent) if(!attacker_controller) return FALSE @@ -90,8 +90,8 @@ return FALSE else // if there's an attacker, we can procede as normal if(!in_range(src, attacker)) //and the two toys aren't next to each other, the battle ends - attacker_controller.visible_message(span_notice(" [attacker] and [src] separate, ending the battle. "), \ - span_notice(" [attacker] and [src] separate, ending the battle. ")) + attacker_controller.visible_message(span_notice("[attacker] and [src] separate, ending the battle."), \ + span_notice("[attacker] and [src] separate, ending the battle.")) return FALSE //dead men tell no tales, incapacitated men fight no fights @@ -99,8 +99,8 @@ 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.dna.check_mutation(TK))) - attacker_controller.visible_message(span_notice(" [attacker_controller.name] seperates from [attacker], ending the battle."), \ - span_notice(" You separate from [attacker], ending the battle. ")) + attacker_controller.visible_message(span_notice("[attacker_controller.name] seperates from [attacker], ending the battle."), \ + span_notice("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 @@ -108,14 +108,14 @@ if(opponent.incapacitated()) return FALSE if(!in_range(src, opponent) && !(opponent.dna.check_mutation(TK))) - opponent.visible_message(span_notice(" [opponent.name] seperates from [src], ending the battle."), \ - span_notice(" You separate from [src], ending the battle. ")) + opponent.visible_message(span_notice("[opponent.name] seperates from [src], ending the battle."), \ + span_notice("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.dna.check_mutation(TK))) - attacker_controller.visible_message(span_notice(" [attacker_controller.name] seperates from [src] and [attacker], ending the battle."), \ - span_notice(" You separate [attacker] and [src], ending the battle. ")) + attacker_controller.visible_message(span_notice("[attacker_controller.name] seperates from [src] and [attacker], ending the battle."), \ + span_notice("You separate [attacker] and [src], ending the battle.")) return FALSE //if all that is good, then we can sleep peacefully @@ -123,7 +123,7 @@ return TRUE //all credit to skasi for toy mech fun ideas -/obj/item/toy/prize/attack_self(mob/user) +/obj/item/toy/mecha/attack_self(mob/user) if(timer < world.time) to_chat(user, span_notice("You play with [src].")) timer = world.time + cooldown @@ -132,7 +132,7 @@ else . = ..() -/obj/item/toy/prize/attack_hand(mob/user, list/modifiers) +/obj/item/toy/mecha/attack_hand(mob/user, list/modifiers) . = ..() if(.) return @@ -142,9 +142,9 @@ /** * If you attack a mech with a mech, initiate combat between them */ -/obj/item/toy/prize/attackby(obj/item/user_toy, mob/living/user) - if(istype(user_toy, /obj/item/toy/prize)) - var/obj/item/toy/prize/P = 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/P = user_toy if(check_battle_start(user, P)) mecha_brawl(P, user) ..() @@ -152,7 +152,7 @@ /** * Attack is called from the user's toy, aimed at target(another human), checking for target's toy. */ -/obj/item/toy/prize/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, span_notice("Target another toy mech if you want to start a battle with yourself.")) return @@ -164,8 +164,8 @@ return for(var/obj/item/I in target.held_items) - if(istype(I, /obj/item/toy/prize)) //if you attack someone with a mech who's also holding a mech, offer to battle them - var/obj/item/toy/prize/P = 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/P = I if(!P.check_battle_start(target, null, user)) //check if the attacker mech is ready break @@ -187,7 +187,7 @@ /** * Overrides attack_tk - Sorry, you have to be face to face to initiate a battle, it's good sportsmanship */ -/obj/item/toy/prize/attack_tk(mob/user) +/obj/item/toy/mecha/attack_tk(mob/user) if(timer < world.time) to_chat(user, span_notice("You telekinetically play with [src].")) timer = world.time + cooldown @@ -203,14 +203,14 @@ * Arguments: * * user - the user wanting to do battle */ -/obj/item/toy/prize/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, span_notice("You get the feeling they don't want to battle.")) /** * Starts a battle, toy mech vs player. Player... doesn't win. */ -/obj/item/toy/prize/suicide_act(mob/living/carbon/user) +/obj/item/toy/mecha/suicide_act(mob/living/carbon/user) if(in_combat) to_chat(user, span_notice("[src] is in battle, let it finish first.")) return @@ -251,9 +251,9 @@ wins++ return BRUTELOSS -/obj/item/toy/prize/examine() +/obj/item/toy/mecha/examine() . = ..() - . += span_notice("This toy's special attack is [special_attack_cry], [special_attack_type_message] ") + . += span_notice("This toy's special attack is [special_attack_cry], [special_attack_type_message]") if(in_combat) . += span_notice("This toy has a maximum health of [max_combat_health]. Currently, it's [combat_health].") . += span_notice("Its special move light is [special_attack_cooldown? "flashing red." : "green and is ready!"]") @@ -266,7 +266,7 @@ /** * Override the say proc if they're mute */ -/obj/item/toy/prize/say() +/obj/item/toy/mecha/say() if(!quiet) . = ..() @@ -283,11 +283,11 @@ * * 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/prize/proc/mecha_brawl(obj/item/toy/prize/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(span_danger(" [attacker_controller.name] collides [attacker] with [src]! Looks like they're preparing for a brawl! "), \ - span_danger(" You collide [attacker] into [src], sparking a fierce battle! "), \ - span_hear(" You hear hard plastic smacking into hard plastic."), COMBAT_MESSAGE_RANGE) + attacker_controller.visible_message(span_danger("[attacker_controller.name] collides [attacker] with [src]! Looks like they're preparing for a brawl!"), \ + span_danger("You collide [attacker] into [src], sparking a fierce battle!"), \ + span_hear("You hear hard plastic smacking into hard plastic."), COMBAT_MESSAGE_RANGE) /// Who's in control of the defender (src)? var/mob/living/carbon/src_controller = (opponent)? opponent : attacker_controller @@ -309,13 +309,13 @@ //before we do anything - deal with charged attacks if(special_attack_charged) - src_controller.visible_message(span_danger(" [src] unleashes its special attack!! "), \ - span_danger(" You unleash [src]'s special attack! ")) + src_controller.visible_message(span_danger("[src] unleashes its special attack!!"), \ + span_danger("You unleash [src]'s special attack!")) special_attack_move(attacker) else if(attacker.special_attack_charged) - attacker_controller.visible_message(span_danger(" [attacker] unleashes its special attack!! "), \ - span_danger(" You unleash [attacker]'s special attack! ")) + attacker_controller.visible_message(span_danger("[attacker] unleashes its special attack!!"), \ + span_danger("You unleash [attacker]'s special attack!")) attacker.special_attack_move(src) else //process the cooldowns @@ -329,20 +329,20 @@ 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(span_danger(" [attacker] begins charging its special attack!! "), \ - span_danger(" You begin charging [attacker]'s special attack! ")) + attacker_controller.visible_message(span_danger("[attacker] begins charging its special attack!!"), \ + span_danger("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(span_danger(" [attacker] devastates [src]! "), \ - span_danger(" You ram [attacker] into [src]! "), \ - span_hear(" You hear hard plastic smacking hard plastic."), COMBAT_MESSAGE_RANGE) + attacker_controller.visible_message(span_danger("[attacker] devastates [src]!"), \ + span_danger("You ram [attacker] into [src]!"), \ + span_hear("You hear hard plastic smacking hard plastic."), COMBAT_MESSAGE_RANGE) if(prob(5)) combat_health-- playsound(src, 'sound/effects/meteorimpact.ogg', 20, TRUE) - attacker_controller.visible_message(span_boldwarning(" ...and lands a CRIPPLING BLOW! "), \ - span_boldwarning(" ...and you land a CRIPPLING blow on [src]! "), null, COMBAT_MESSAGE_RANGE) + attacker_controller.visible_message(span_boldwarning("...and lands a CRIPPLING BLOW!"), \ + span_boldwarning("...and you land a CRIPPLING blow on [src]!"), null, COMBAT_MESSAGE_RANGE) if(4) //both lose attacker.SpinAnimation(5, 0) @@ -352,44 +352,44 @@ do_sparks(2, FALSE, src) do_sparks(2, FALSE, attacker) if(prob(50)) - attacker_controller.visible_message(span_danger(" [attacker] and [src] clash dramatically, causing sparks to fly! "), \ - span_danger(" [attacker] and [src] clash dramatically, causing sparks to fly! "), \ - span_hear(" You hear hard plastic rubbing against hard plastic."), COMBAT_MESSAGE_RANGE) + attacker_controller.visible_message(span_danger("[attacker] and [src] clash dramatically, causing sparks to fly!"), \ + span_danger("[attacker] and [src] clash dramatically, causing sparks to fly!"), \ + span_hear("You hear hard plastic rubbing against hard plastic."), COMBAT_MESSAGE_RANGE) else - src_controller.visible_message(span_danger(" [src] and [attacker] clash dramatically, causing sparks to fly! "), \ - span_danger(" [src] and [attacker] clash dramatically, causing sparks to fly! "), \ - span_hear(" You hear hard plastic rubbing against hard plastic."), COMBAT_MESSAGE_RANGE) + src_controller.visible_message(span_danger("[src] and [attacker] clash dramatically, causing sparks to fly!"), \ + span_danger("[src] and [attacker] clash dramatically, causing sparks to fly!"), \ + span_hear("You hear hard plastic rubbing against hard plastic."), COMBAT_MESSAGE_RANGE) if(5) //both win playsound(attacker, 'sound/weapons/parry.ogg', 20, TRUE) if(prob(50)) - attacker_controller.visible_message(span_danger(" [src]'s attack deflects off of [attacker]. "), \ - span_danger(" [src]'s attack deflects off of [attacker]. "), \ - span_hear(" You hear hard plastic bouncing off hard plastic."), COMBAT_MESSAGE_RANGE) + attacker_controller.visible_message(span_danger("[src]'s attack deflects off of [attacker]."), \ + span_danger("[src]'s attack deflects off of [attacker]."), \ + span_hear("You hear hard plastic bouncing off hard plastic."), COMBAT_MESSAGE_RANGE) else - src_controller.visible_message(span_danger(" [attacker]'s attack deflects off of [src]. "), \ - span_danger(" [attacker]'s attack deflects off of [src]. "), \ - span_hear(" You hear hard plastic bouncing off hard plastic."), COMBAT_MESSAGE_RANGE) + src_controller.visible_message(span_danger("[attacker]'s attack deflects off of [src]."), \ + span_danger("[attacker]'s attack deflects off of [src]."), \ + span_hear("You hear hard plastic bouncing off hard plastic."), COMBAT_MESSAGE_RANGE) 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(span_danger(" [src] begins charging its special attack!! "), \ - span_danger(" You begin charging [src]'s special attack! ")) + src_controller.visible_message(span_danger("[src] begins charging its special attack!!"), \ + span_danger("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(span_danger(" [src] smashes [attacker]! "), \ - span_danger(" You smash [src] into [attacker]! "), \ - span_hear(" You hear hard plastic smashing hard plastic."), COMBAT_MESSAGE_RANGE) + src_controller.visible_message(span_danger("[src] smashes [attacker]!"), \ + span_danger("You smash [src] into [attacker]!"), \ + span_hear("You hear hard plastic smashing hard plastic."), COMBAT_MESSAGE_RANGE) if(prob(5)) attacker.combat_health-- playsound(attacker, 'sound/effects/meteorimpact.ogg', 20, TRUE) - src_controller.visible_message(span_boldwarning(" ...and lands a CRIPPLING BLOW! "), \ - span_boldwarning(" ...and you land a CRIPPLING blow on [attacker]! "), null, COMBAT_MESSAGE_RANGE) + src_controller.visible_message(span_boldwarning("...and lands a CRIPPLING BLOW!"), \ + span_boldwarning("...and you land a CRIPPLING blow on [attacker]!"), null, COMBAT_MESSAGE_RANGE) else - attacker_controller.visible_message(span_notice(" [src] and [attacker] stand around awkwardly."), \ - span_notice(" You don't know what to do next.")) + attacker_controller.visible_message(span_notice("[src] and [attacker] stand around awkwardly."), \ + span_notice("You don't know what to do next.")) battle_length++ sleep(0.5 SECONDS) @@ -399,26 +399,26 @@ if(attacker.combat_health <= 0 && combat_health <= 0) //both lose playsound(src, 'sound/machines/warning-buzzer.ogg', 20, TRUE) - attacker_controller.visible_message(span_boldnotice(" MUTUALLY ASSURED DESTRUCTION!! [src] and [attacker] both end up destroyed!"), \ - span_boldnotice(" Both [src] and [attacker] are destroyed!")) + attacker_controller.visible_message(span_boldnotice("MUTUALLY ASSURED DESTRUCTION!! [src] and [attacker] both end up destroyed!"), \ + span_boldnotice("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(span_notice(" [attacker] falls apart!"), \ - span_notice(" [attacker] falls apart!"), null, COMBAT_MESSAGE_RANGE) + attacker_controller.visible_message(span_notice("[attacker] falls apart!"), \ + span_notice("[attacker] falls apart!"), null, COMBAT_MESSAGE_RANGE) say("[pick(winlines)]") - src_controller.visible_message(span_notice(" [src] destroys [attacker] and walks away victorious!"), \ - span_notice(" You raise up [src] victoriously over [attacker]!")) + src_controller.visible_message(span_notice("[src] destroys [attacker] and walks away victorious!"), \ + span_notice("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(span_notice(" [src] collapses!"), \ - span_notice(" [src] collapses!"), null, COMBAT_MESSAGE_RANGE) + src_controller.visible_message(span_notice("[src] collapses!"), \ + span_notice("[src] collapses!"), null, COMBAT_MESSAGE_RANGE) attacker.say("[pick(winlines)]") - attacker_controller.visible_message(span_notice(" [attacker] demolishes [src] and walks away victorious!"), \ - "[span_notice(" You raise up [attacker] proudly over [src]")]!") + attacker_controller.visible_message(span_notice("[attacker] demolishes [src] and walks away victorious!"), \ + "[span_notice("You raise up [attacker] proudly over [src]")]!") else //both win? say("NEXT TIME.") //don't want to make this a one sided conversation @@ -443,7 +443,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/prize/proc/check_battle_start(mob/living/carbon/user, obj/item/toy/prize/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) if(attacker?.in_combat) to_chat(user, span_notice("[target?target.p_their() : "Your" ] [attacker.name] is in combat.")) to_chat(target, span_notice("Your [attacker.name] is in combat.")) @@ -470,7 +470,7 @@ * Arguments: * * victim - the toy being hit by the special move */ -/obj/item/toy/prize/proc/special_attack_move(obj/item/toy/prize/victim) +/obj/item/toy/mecha/proc/special_attack_move(obj/item/toy/mecha/victim) say(special_attack_cry + "!!") special_attack_charged = FALSE @@ -499,34 +499,115 @@ * Arguments: * * victim - the toy being hit by the super special move (doesn't necessarily need to be used) */ -/obj/item/toy/prize/proc/super_special_attack(obj/item/toy/prize/victim) - visible_message(span_notice(" [src] does a cool flip.")) +/obj/item/toy/mecha/proc/super_special_attack(obj/item/toy/mecha/victim) + visible_message(span_notice("[src] does a cool flip.")) -/obj/item/toy/prize/ripley - name = "toy Ripley" - desc = "1/13" +/obj/item/toy/mecha/ripley + name = "toy Ripley MK-I" + icon_state = "ripleytoy" max_combat_health = 4 //200 integrity special_attack_type = SPECIAL_ATTACK_DAMAGE + special_attack_cry = "CLAMP SMASH" + +/obj/item/toy/mecha/ripleymkii + name = "toy Ripley MK-II" + icon_state = "ripleymkiitoy" + max_combat_health = 5 //250 integrity + special_attack_type = SPECIAL_ATTACK_DAMAGE special_attack_cry = "GIGA DRILL BREAK" -/obj/item/toy/prize/fireripley //rip - name = "toy Firefighting Ripley" - desc = "2/13" - icon_state = "fireripleytoy" - max_combat_health = 5 //250 integrity? +/obj/item/toy/mecha/hauler + name = "toy Hauler" + icon_state = "haulertoy" + max_combat_health = 3 //100 integrity? special_attack_type = SPECIAL_ATTACK_UTILITY - special_attack_cry = "FIRE SHIELD" + special_attack_cry = "HAUL AWAY" -/obj/item/toy/prize/deathripley - name = "toy Deathsquad Ripley" - desc = "3/13" +/obj/item/toy/mecha/clarke + name = "toy Clarke" + icon_state = "clarketoy" + max_combat_health = 4 //200 integrity + special_attack_type = SPECIAL_ATTACK_UTILITY + special_attack_cry = "ROLL OUT" + +/obj/item/toy/mecha/odysseus + name = "toy Odysseus" + icon_state = "odysseustoy" + max_combat_health = 4 //120 integrity + special_attack_type = SPECIAL_ATTACK_HEAL + special_attack_cry = "MECHA BEAM" + +/obj/item/toy/mecha/gygax + name = "toy Gygax" + icon_state = "gygaxtoy" + max_combat_health = 5 //250 integrity + special_attack_type = SPECIAL_ATTACK_UTILITY + special_attack_cry = "SUPER SERVOS" + +/obj/item/toy/mecha/durand + name = "toy Durand" + icon_state = "durandtoy" + max_combat_health = 6 //400 integrity + special_attack_type = SPECIAL_ATTACK_HEAL + special_attack_cry = "SHIELD OF PROTECTION" + +/obj/item/toy/mecha/savannahivanov + name = "toy Savannah-Ivanov" + icon_state = "savannahivanovtoy" + max_combat_health = 7 //450 integrity + special_attack_type = SPECIAL_ATTACK_UTILITY + special_attack_cry = "SKYFALL!! IVANOV STRIKE" + +/obj/item/toy/mecha/phazon + name = "toy Phazon" + icon_state = "phazontoy" + max_combat_health = 6 //200 integrity + special_attack_type = SPECIAL_ATTACK_UTILITY + special_attack_cry = "NO-CLIP" + +/obj/item/toy/mecha/honk + name = "toy H.O.N.K." + icon_state = "honktoy" + max_combat_health = 4 //140 integrity + special_attack_type = SPECIAL_ATTACK_OTHER + special_attack_type_message = "puts the opposing mech's special move on cooldown and heals this mech." + special_attack_cry = "MEGA HORN" + +/obj/item/toy/mecha/honk/super_special_attack(obj/item/toy/mecha/victim) + playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 20, TRUE) + victim.special_attack_cooldown += 3 //Adds cooldown to the other mech and gives a minor self heal + combat_health++ + +/obj/item/toy/mecha/darkgygax + name = "toy Dark Gygax" + icon_state = "darkgygaxtoy" + max_combat_health = 6 //300 integrity + special_attack_type = SPECIAL_ATTACK_UTILITY + special_attack_cry = "ULTRA SERVOS" + +/obj/item/toy/mecha/mauler + name = "toy Mauler" + icon_state = "maulertoy" + max_combat_health = 7 //500 integrity + special_attack_type = SPECIAL_ATTACK_DAMAGE + special_attack_cry = "BULLET STORM" + +/obj/item/toy/mecha/darkhonk + name = "toy Dark H.O.N.K." + icon_state = "darkhonktoy" + max_combat_health = 5 //300 integrity + special_attack_type = SPECIAL_ATTACK_DAMAGE + special_attack_cry = "BOMBANANA SPREE" + +/obj/item/toy/mecha/deathripley + name = "toy Death-Ripley" 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/prize/deathripley/super_special_attack(obj/item/toy/prize/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. say("EXECUTE!!") @@ -534,79 +615,8 @@ else //Otherwise, just deal one damage. victim.combat_health-- -/obj/item/toy/prize/gygax - name = "toy Gygax" - desc = "4/13" - icon_state = "gygaxtoy" - max_combat_health = 5 //250 integrity - special_attack_type = SPECIAL_ATTACK_UTILITY - special_attack_cry = "SUPER SERVOS" - -/obj/item/toy/prize/durand - name = "toy Durand" - desc = "5/13" - icon_state = "durandtoy" - max_combat_health = 6 //400 integrity - special_attack_type = SPECIAL_ATTACK_HEAL - special_attack_cry = "SHIELD OF PROTECTION" - -/obj/item/toy/prize/honk - name = "toy H.O.N.K." - desc = "6/13" - 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/prize/honk/super_special_attack(obj/item/toy/prize/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/prize/marauder - name = "toy Marauder" - desc = "7/13" - icon_state = "maraudertoy" - max_combat_health = 7 //500 integrity - special_attack_type = SPECIAL_ATTACK_DAMAGE - special_attack_cry = "BEAM BLAST" - -/obj/item/toy/prize/seraph - name = "toy Seraph" - desc = "8/13" - icon_state = "seraphtoy" - max_combat_health = 8 //550 integrity - special_attack_type = SPECIAL_ATTACK_DAMAGE - special_attack_cry = "ROCKET BARRAGE" - -/obj/item/toy/prize/mauler - name = "toy Mauler" - desc = "9/13" - icon_state = "maulertoy" - max_combat_health = 7 //500 integrity - special_attack_type = SPECIAL_ATTACK_DAMAGE - special_attack_cry = "BULLET STORM" - -/obj/item/toy/prize/odysseus - name = "toy Odysseus" - desc = "10/13" - icon_state = "odysseustoy" - max_combat_health = 4 //120 integrity - special_attack_type = SPECIAL_ATTACK_HEAL - special_attack_cry = "MECHA BEAM" - -/obj/item/toy/prize/phazon - name = "toy Phazon" - desc = "11/13" - icon_state = "phazontoy" - max_combat_health = 6 //200 integrity - special_attack_type = SPECIAL_ATTACK_UTILITY - special_attack_cry = "NO-CLIP" - -/obj/item/toy/prize/reticence +/obj/item/toy/mecha/reticence name = "toy Reticence" - desc = "12/13" icon_state = "reticencetoy" quiet = TRUE max_combat_health = 4 //100 integrity @@ -614,18 +624,31 @@ 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/prize/reticence/super_special_attack(obj/item/toy/prize/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/prize/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" +/obj/item/toy/mecha/marauder + name = "toy Marauder" + icon_state = "maraudertoy" + max_combat_health = 7 //500 integrity + special_attack_type = SPECIAL_ATTACK_DAMAGE + special_attack_cry = "BEAM BLAST" + +/obj/item/toy/mecha/seraph + name = "toy Seraph" + icon_state = "seraphtoy" + max_combat_health = 8 //550 integrity + special_attack_type = SPECIAL_ATTACK_DAMAGE + special_attack_cry = "ROCKET BARRAGE" + +/obj/item/toy/mecha/firefighter //rip + name = "toy Firefighter" + icon_state = "firefightertoy" + max_combat_health = 5 //250 integrity? + special_attack_type = SPECIAL_ATTACK_HEAL + special_attack_cry = "FIRE SHIELD" #undef SPECIAL_ATTACK_HEAL #undef SPECIAL_ATTACK_DAMAGE diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ad53ae1cb7d..4f7aa397219 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1247,8 +1247,7 @@ */ /obj/item/toy/figure - name = "Non-Specific Action Figure action figure" - desc = null + name = "\improper Non-Specific Action Figure action figure" icon = 'icons/obj/toy.dmi' icon_state = "nuketoy" var/cooldown = 0 @@ -1267,195 +1266,205 @@ playsound(user, toysound, 20, TRUE) /obj/item/toy/figure/cmo - name = "Chief Medical Officer action figure" + name = "\improper Chief Medical Officer action figure" icon_state = "cmo" toysay = "Suit sensors!" /obj/item/toy/figure/assistant - name = "Assistant action figure" + name = "\improper Assistant action figure" icon_state = "assistant" inhand_icon_state = "assistant" - toysay = "Grey tide world wide!" + toysay = "Greytide world wide!" /obj/item/toy/figure/atmos - name = "Atmospheric Technician action figure" + name = "\improper Atmospheric Technician action figure" icon_state = "atmos" toysay = "Glory to Atmosia!" /obj/item/toy/figure/bartender - name = "Bartender action figure" + name = "\improper Bartender action figure" icon_state = "bartender" toysay = "Where is Pun Pun?" /obj/item/toy/figure/borg - name = "Cyborg action figure" + name = "\improper Cyborg action figure" icon_state = "borg" toysay = "I. LIVE. AGAIN." toysound = 'sound/voice/liveagain.ogg' /obj/item/toy/figure/botanist - name = "Botanist action figure" + name = "\improper Botanist action figure" icon_state = "botanist" toysay = "Blaze it!" /obj/item/toy/figure/captain - name = "Captain action figure" + name = "\improper Captain action figure" icon_state = "captain" toysay = "Any heads of staff?" /obj/item/toy/figure/cargotech - name = "Cargo Technician action figure" + name = "\improper Cargo Technician action figure" icon_state = "cargotech" toysay = "For Cargonia!" /obj/item/toy/figure/ce - name = "Chief Engineer action figure" + name = "\improper Chief Engineer action figure" icon_state = "ce" toysay = "Wire the solars!" /obj/item/toy/figure/chaplain - name = "Chaplain action figure" + name = "\improper Chaplain action figure" icon_state = "chaplain" toysay = "Praise Space Jesus!" /obj/item/toy/figure/chef - name = "Chef action figure" + name = "\improper Cook action figure" icon_state = "chef" - toysay = " I'll make you into a burger!" + toysay = "I'll make you into a burger!" /obj/item/toy/figure/chemist - name = "Chemist action figure" + name = "\improper Chemist action figure" icon_state = "chemist" toysay = "Get your pills!" /obj/item/toy/figure/clown - name = "Clown action figure" + name = "\improper Clown action figure" icon_state = "clown" toysay = "Honk!" toysound = 'sound/items/bikehorn.ogg' /obj/item/toy/figure/ian - name = "Ian action figure" + name = "\improper Ian action figure" icon_state = "ian" toysay = "Arf!" /obj/item/toy/figure/detective - name = "Detective action figure" + name = "\improper Detective action figure" icon_state = "detective" toysay = "This airlock has grey jumpsuit and insulated glove fibers on it." /obj/item/toy/figure/dsquad - name = "Death Squad Officer action figure" + name = "\improper Deathsquad Officer action figure" icon_state = "dsquad" - toysay = "Kill em all!" + toysay = "Kill 'em all!" /obj/item/toy/figure/engineer - name = "Engineer action figure" + name = "\improper Station Engineer action figure" icon_state = "engineer" toysay = "Oh god, the singularity is loose!" /obj/item/toy/figure/geneticist - name = "Geneticist action figure" + name = "\improper Geneticist action figure" icon_state = "geneticist" toysay = "Smash!" /obj/item/toy/figure/hop - name = "Head of Personnel action figure" + name = "\improper Head of Personnel action figure" icon_state = "hop" toysay = "Giving out all access!" /obj/item/toy/figure/hos - name = "Head of Security action figure" + name = "\improper Head of Security action figure" icon_state = "hos" toysay = "Go ahead, make my day." /obj/item/toy/figure/qm - name = "Quartermaster action figure" + name = "\improper Quartermaster action figure" icon_state = "qm" toysay = "Please sign this form in triplicate and we will see about geting you a welding mask within 3 business days." /obj/item/toy/figure/janitor - name = "Janitor action figure" + name = "\improper Janitor action figure" icon_state = "janitor" toysay = "Look at the signs, you idiot." /obj/item/toy/figure/lawyer - name = "Lawyer action figure" + name = "\improper Lawyer action figure" icon_state = "lawyer" toysay = "My client is a dirty traitor!" /obj/item/toy/figure/curator - name = "Curator action figure" + name = "\improper Curator action figure" icon_state = "curator" toysay = "One day while..." /obj/item/toy/figure/md - name = "Medical Doctor action figure" + name = "\improper Medical Doctor action figure" icon_state = "md" toysay = "The patient is already dead!" /obj/item/toy/figure/paramedic - name = "Paramedic action figure" + name = "\improper Paramedic action figure" icon_state = "paramedic" toysay = "And the best part? I'm not even a real doctor!" +/obj/item/toy/figure/psychologist + name = "\improper Psychologist action figure" + icon_state = "psychologist" + toysay = "Alright, just take these happy pills!" + +/obj/item/toy/figure/prisoner + name = "\improper Prisoner action figure" + icon_state = "prisoner" + toysay = "I did not hit her! I did not!" + /obj/item/toy/figure/mime - name = "Mime action figure" + name = "\improper Mime action figure" icon_state = "mime" toysay = "..." toysound = null /obj/item/toy/figure/miner - name = "Shaft Miner action figure" + name = "\improper Shaft Miner action figure" icon_state = "miner" toysay = "COLOSSUS RIGHT OUTSIDE THE BASE!" /obj/item/toy/figure/ninja - name = "Ninja action figure" + name = "\improper Space Ninja action figure" icon_state = "ninja" - toysay = "Oh god! Stop shooting, I'm friendly!" + toysay = "I am the shadow warrior!" /obj/item/toy/figure/wizard - name = "Wizard action figure" + name = "\improper Wizard action figure" icon_state = "wizard" - toysay = "Ei Nath!" + toysay = "EI NATH!" toysound = 'sound/magic/disintegrate.ogg' /obj/item/toy/figure/rd - name = "Research Director action figure" + name = "\improper Research Director action figure" icon_state = "rd" toysay = "Blowing all of the borgs!" /obj/item/toy/figure/roboticist - name = "Roboticist action figure" + name = "\improper Roboticist action figure" icon_state = "roboticist" toysay = "Big stompy mechs!" toysound = 'sound/mecha/mechstep.ogg' /obj/item/toy/figure/scientist - name = "Scientist action figure" + name = "\improper Scientist action figure" icon_state = "scientist" toysay = "I call toxins." toysound = 'sound/effects/explosionfar.ogg' /obj/item/toy/figure/syndie - name = "Nuclear Operative action figure" + name = "\improper Nuclear Operative action figure" icon_state = "syndie" toysay = "Get that fucking disk!" /obj/item/toy/figure/secofficer - name = "Security Officer action figure" + name = "\improper Security Officer action figure" icon_state = "secofficer" toysay = "I am the law!" toysound = 'sound/runtime/complionator/dredd.ogg' /obj/item/toy/figure/virologist - name = "Virologist action figure" + name = "\improper Virologist action figure" icon_state = "virologist" toysay = "The cure is potassium!" /obj/item/toy/figure/warden - name = "Warden action figure" + name = "\improper Warden action figure" icon_state = "warden" toysay = "Seventeen minutes for coughing at an officer!" @@ -1606,6 +1615,9 @@ animate(pixel_y = user.pixel_y + (1 * direction), time = 1, easing = SINE_EASING) user.changeNext_move(CLICK_CD_MELEE) +///All people who have used an Intento this round along with their high scores. +GLOBAL_LIST_EMPTY(intento_players) + #define HELP "help" #define DISARM "disarm" #define GRAB "grab" @@ -1756,12 +1768,12 @@ COOLDOWN_START(src, next_process, TIME_PER_DEMO_STEP) /obj/item/toy/intento/proc/process_end(mob/user) - if(user) - var/award_score = score + if(user && GLOB.intento_players[user.ckey] < score) + GLOB.intento_players[user.ckey] = score var/award_status = user.client.get_award_status(/datum/award/score/intento_score) - if(award_score - award_status > 0) - award_score -= award_status - user.client.give_award(/datum/award/score/intento_score, user, award_score) + var/award_score = score - award_status + if(award_score > 0) + user.client.give_award(/datum/award/score/intento_score, user, award_score) say("GAME OVER. Your score was [score]!") playsound(src, 'sound/machines/synth_no.ogg', 50, FALSE) diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 3649fe4b889..5a56806a6c1 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -6,6 +6,10 @@ desc = "A rare collectable hat." icon_state = null +/obj/item/clothing/head/collectable/Initialize() + . = ..() + AddElement(/datum/element/series, /obj/item/clothing/head/collectable, "Super duper collectable hats") + /obj/item/clothing/head/collectable/petehat name = "ultra rare Pete's hat!" desc = "It smells faintly of plasma." diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index a33b1c807f4..7d97e330c23 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -158,37 +158,26 @@ icon_state = "egg-[eggcolor]" /obj/item/food/egg/proc/dispensePrize(turf/where) - var/won = pick(/obj/item/clothing/head/bunnyhead, - /obj/item/clothing/suit/bunnysuit, - /obj/item/storage/backpack/satchel/bunnysatchel, - /obj/item/food/grown/carrot, - /obj/item/toy/balloon, - /obj/item/toy/gun, - /obj/item/toy/sword, - /obj/item/toy/talking/ai, - /obj/item/toy/talking/owl, - /obj/item/toy/talking/griffin, - /obj/item/toy/minimeteor, - /obj/item/toy/clockwork_watch, - /obj/item/toy/toy_xeno, - /obj/item/toy/foamblade, - /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/marauder, - /obj/item/toy/prize/seraph, - /obj/item/toy/prize/mauler, - /obj/item/toy/prize/odysseus, - /obj/item/toy/prize/phazon, - /obj/item/toy/prize/reticence, - /obj/item/toy/prize/honk, - /obj/item/toy/prize/clarke, - /obj/item/toy/plush/carpplushie, - /obj/item/toy/redbutton, - /obj/item/toy/windup_toolbox, - /obj/item/clothing/head/collectable/rabbitears) + var/prize_list = list(/obj/item/clothing/head/bunnyhead, + /obj/item/clothing/suit/bunnysuit, + /obj/item/storage/backpack/satchel/bunnysatchel, + /obj/item/food/grown/carrot, + /obj/item/toy/balloon, + /obj/item/toy/gun, + /obj/item/toy/sword, + /obj/item/toy/talking/ai, + /obj/item/toy/talking/owl, + /obj/item/toy/talking/griffin, + /obj/item/toy/minimeteor, + /obj/item/toy/clockwork_watch, + /obj/item/toy/toy_xeno, + /obj/item/toy/foamblade, + /obj/item/toy/plush/carpplushie, + /obj/item/toy/redbutton, + /obj/item/toy/windup_toolbox, + /obj/item/clothing/head/collectable/rabbitears + ) + subtypesof(/obj/item/toy/mecha) + var/won = pick(prize_list) new won(where) new/obj/item/food/chocolateegg(where) diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 7ddda4ab706..17abb5a043b 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -29,7 +29,7 @@ /datum/job/roboticist/New() . = ..() - family_heirlooms += subtypesof(/obj/item/toy/prize) + family_heirlooms += subtypesof(/obj/item/toy/mecha) /datum/outfit/job/roboticist name = "Roboticist" diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index e558bf03f63..6966b41d5d5 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -154,7 +154,7 @@ if(53 to 54) new /obj/item/toy/balloon/corgi(src) if(55 to 56) - var/newitem = pick(subtypesof(/obj/item/toy/prize)) + var/newitem = pick(subtypesof(/obj/item/toy/mecha)) new newitem(src) if(57 to 58) new /obj/item/toy/balloon/syndicate(src) diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index e678cc390b6..8934ed0af98 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/tgstation.dme b/tgstation.dme index ba8be3e2234..4f7d7ad24c4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -716,6 +716,7 @@ #include "code\datums\elements\rad_insulation.dm" #include "code\datums\elements\ridable.dm" #include "code\datums\elements\selfknockback.dm" +#include "code\datums\elements\series.dm" #include "code\datums\elements\simple_flying.dm" #include "code\datums\elements\skittish.dm" #include "code\datums\elements\snail_crawl.dm"