diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 1cf7a2c62a8..b7c61460170 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -328,6 +328,7 @@ #define SPECIES_CUSTOM "Custom Species" #define SPECIES_LLEILL "Lleill" #define SPECIES_HANNER "Hanner" +#define SPECIES_SPARKLE "Sparkle Dog" // Monkey and alien monkeys. #define SPECIES_MONKEY "Monkey" diff --git a/code/__defines/species_languages_vr.dm b/code/__defines/species_languages_vr.dm index 8e9a54569e6..aa0d97e5edb 100644 --- a/code/__defines/species_languages_vr.dm +++ b/code/__defines/species_languages_vr.dm @@ -19,3 +19,5 @@ #define LANGUAGE_SHADEKIN "Shadekin Empathy" #define LANGUAGE_LLEILL "Glamour Speak" + +#define LANGUAGE_SPARKLE "Sparkle" diff --git a/code/modules/mob/language/station_vr.dm b/code/modules/mob/language/station_vr.dm index f73a30717ab..cb9b5876802 100644 --- a/code/modules/mob/language/station_vr.dm +++ b/code/modules/mob/language/station_vr.dm @@ -180,3 +180,16 @@ partial_understanding = list(LANGUAGE_TRADEBAND = 30, LANGUAGE_SOL_COMMON = 10) /datum/language/human/animal flags = RESTRICTED + +/datum/language/sparkle + name = LANGUAGE_SPARKLE + desc = "Eeeeeeeeeeeeee." + speech_verb = "says" + ask_verb = "asks" + exclaim_verb = "squeals" + colour = "rainbow" + key = "Z" + syllables = list( + "lol", "lmao", "rofl", "rawr", "XD", "eeeee", "hehe", "lolz", "0_o", ":>", "l1k3", "mudk1pz", "l33t", "br00tal", "hXc", "wtf", "pwn" + ) + flags = WHITELISTED diff --git a/code/modules/mob/living/carbon/human/human_powers_vr.dm b/code/modules/mob/living/carbon/human/human_powers_vr.dm index 90a1eacd15a..c51b27914ce 100644 --- a/code/modules/mob/living/carbon/human/human_powers_vr.dm +++ b/code/modules/mob/living/carbon/human/human_powers_vr.dm @@ -257,3 +257,37 @@ player1.visible_message(span_notice("After a gruelling battle, [player1] eventually manages to subdue the thumb of [player2]!")) else player2.visible_message(span_notice("After a gruelling battle, [player2] eventually manages to subdue the thumb of [player1]!")) + +///Play dead for sparkledog memes + +/mob/living/carbon/human/proc/play_dead() + set name = "Play Dead" + set desc = "Literally just die on the spot. It's okay, you can get better." + set category = "Abilities.Sparkledog" + + if(stat) + to_chat(src, span_warning("You're too messed up right now to act all messed up, it's, like, for real.")) + return + + if(!resting) + SetResting(1) + add_modifier(/datum/modifier/play_dead, null, src) //Tracks whether they are still resting to remove the status indicator + add_status_indicator("dead") + visible_message(span_warning("\The [src] literally just dies!")) + else + SetResting(0) + +/datum/modifier/play_dead + name = "playing dead" + desc = "You are are pretending to be dead, you aren't very convincing!" + on_created_text = span_notice("You begin to play dead!") + on_expired_text = span_notice("You got better.") + +/datum/modifier/play_dead/tick() + if(!holder.resting) + expire() + +/datum/modifier/play_dead/expire() + holder.remove_status_indicator("dead") + holder.visible_message(span_warning("\The [src] literally just dies!")) + ..() diff --git a/code/modules/mob/living/carbon/human/human_species_vr.dm b/code/modules/mob/living/carbon/human/human_species_vr.dm index 3a6bba3189d..4a018a2ed33 100644 --- a/code/modules/mob/living/carbon/human/human_species_vr.dm +++ b/code/modules/mob/living/carbon/human/human_species_vr.dm @@ -37,3 +37,6 @@ /mob/living/carbon/human/hanner/New(var/new_loc) ..(new_loc, SPECIES_HANNER) + +/mob/living/carbon/human/sparkledog/New(var/new_loc) + ..(new_loc, SPECIES_SPARKLE) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index a6cadd0524e..589e1d2ac6a 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -1982,3 +1982,48 @@ name = "danger level" icon_state = "danger00" //first number is bool of whether or not we're in danger, second is whether or not we're feral alpha = 200 + +/datum/species/sparkledog //Exists primarily as an april fools joke, along with everything tied to it! + name = SPECIES_SPARKLE + name_plural = "Sparklies" + icobase = 'icons/mob/human_races/r_sparkle.dmi' + icobase_tail = 1 + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + slowdown = -0.5 + brute_mod = 1.5 + burn_mod = 1.5 + bloodloss_rate = 1.5 + toxins_mod = 0.5 + radiation_mod = 0 + flash_mod = 2 + siemens_coefficient = 10 + + darksight = 2 + + num_alternate_languages = 3 + language = LANGUAGE_SPARKLE + species_language = LANGUAGE_SPARKLE + secondary_langs = list(LANGUAGE_SPARKLE, LANGUAGE_SOL_COMMON) + color_mult = 1 + assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN) + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/proc/toggle_sparkles, /mob/living/proc/healing_rainbows, /mob/living/carbon/human/proc/play_dead) + min_age = 18 + max_age = 21 + digi_allowed = FALSE //No time for making rainbow legs for the meme, sorry! + + pass_flags = PASSTABLE + + blurb = "Th3 ultimate lifeform, th3 l@st of th3 sp@rkl3 d0gg0s. M0r3 p0w3rful th@nn @ny 0th3r sp3ci3s in th3 3ntir3 un1v3rs3!!! When 3v3ryth1ng is crashing d0wn, y0u c@nn always r3ly 0n th3m to s@v3 th3 d@y. N0 0n3 3ls3 h@s th@t k1nd of str3ngth. R@wr XD #sp@rkl3d0gg0 #s@v1ngth3d@y #n0b0dyc@r3s" + + wikilink="https://wiki.vore-station.net/" + + primitive_form = SPECIES_MONKEY_VULPKANIN + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR + + flesh_color = "#ffffff" + base_color = "#ffffff" + blood_color = "#ff00d9" diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index 4735f0d9d5c..b006ae7d023 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -54,3 +54,62 @@ else touch_reaction_flags |= SPECIES_TRAIT_PERSONAL_BUBBLE to_chat(src,span_notice("You will now dodge all attempts at hugging, patting, booping, licking, smelling and hand shaking.")) + +/mob/living/proc/toggle_sparkles() + set name = "Toggle Sparkles" + set desc = "Toggle fancy glowing sparkles!" + set category = "Abilities.Sparkledog" + + if(!glow_toggle) + glow_range = 3 + glow_intensity = 2 + glow_color = "#FFFFFF" + glow_toggle = TRUE + add_modifier(/datum/modifier/sparkle, null, src) + else + glow_toggle = FALSE + +/datum/modifier/sparkle + name = "sparkling" + desc = "You are sparkling, woo!" + mob_overlay_state = "cyan_sparkles" + on_created_text = span_notice("You begin to sparkle!") + on_expired_text = span_notice("Your sparkling fades away...") + +/datum/modifier/sparkle/tick() + if(!holder.glow_toggle || holder.stat) + expire() + +/mob/living/proc/healing_rainbows() + set name = "Firin Mah Lazor" + set desc = "Fire a glowing beam of rainbows at another person to heal them!" + set category = "Abilities.Sparkledog" + + if(src.stat) + to_chat(src, span_warning("You can't vomit rainbows in this condition!")) + + var/list/targets = list() + for(var/mob/living/carbon/human/M in oview(7,src)) + if(M.z != src.z || get_dist(src,M) > 7) + continue + if(src == M) + continue + targets |= M + + if(!targets) + to_chat(src, span_warning("There is nobody next to you.")) + return + + var/mob/living/carbon/human/chosen_target = tgui_input_list(src, "Who do you wish to shoot rainbows at?", "Rainbow", targets) + if(!chosen_target) + return + + visible_message(span_warning("[src] begins chargin' their lazor!")) + if(!do_after(src, 5 SECONDS, chosen_target, exclusive = TASK_USER_EXCLUSIVE)) + return + if(chosen_target.z != src.z || get_dist(src,chosen_target) > 7) + return + visible_message(span_warning("[src] fires their lazor at [chosen_target]!")) + var/obj/item/projectile/P = new /obj/item/projectile/beam/sparkledog(get_turf(src)) + playsound(src, "'sound/weapons/sparkle.ogg'", 50, 1) + P.launch_projectile(chosen_target, BP_TORSO, src) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 5b637ea7775..fbbff18767c 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -37,7 +37,7 @@ GLOBAL_LIST_INIT(fancy_sprite_accessory_color_channel_names, list("Primary", "Se var/gender = NEUTER // Restrict some styles to specific species. Default to all species to avoid runtimes in character creator. - var/list/species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_HANNER, SPECIES_ZADDAT) + var/list/species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_HANNER, SPECIES_ZADDAT, SPECIES_SPARKLE) // Whether or not the accessory can be affected by colouration var/do_colouration = 1 diff --git a/code/modules/mob/new_player/sprite_accessories_ear.dm b/code/modules/mob/new_player/sprite_accessories_ear.dm index 581c849bad7..8c1991e91a3 100644 --- a/code/modules/mob/new_player/sprite_accessories_ear.dm +++ b/code/modules/mob/new_player/sprite_accessories_ear.dm @@ -15,7 +15,7 @@ var/extra_overlay2 var/desc = DEVELOPER_WARNING_NAME em_block = TRUE - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_HANNER) + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_HANNER, SPECIES_SPARKLE) /** * Gets the number of color channels we have. diff --git a/code/modules/mob/new_player/sprite_accessories_wing.dm b/code/modules/mob/new_player/sprite_accessories_wing.dm index 88ffb71f594..c58d35b120d 100644 --- a/code/modules/mob/new_player/sprite_accessories_wing.dm +++ b/code/modules/mob/new_player/sprite_accessories_wing.dm @@ -21,7 +21,7 @@ var/extra_overlay_w // Flapping state for extra overlay var/extra_overlay2_w - species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_HANNER) + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_HANNER, SPECIES_SPARKLE) var/wing_offset = 0 var/multi_dir = FALSE // Does it use different sprites at different layers? _front will be added for sprites on low layer, _back to high layer diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 4a50dd022b1..5d8ea9f07b4 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -443,6 +443,29 @@ impact_type = /obj/effect/projectile/impact/rainbow hud_state = "laser" damage = 20 + +/obj/item/projectile/beam/sparkledog + name = "rainbow" + fire_sound = 'sound/weapons/sparkle.ogg' + icon_state = "rainbow" + light_color = "#ffffff" + muzzle_type = /obj/effect/projectile/muzzle/rainbow + tracer_type = /obj/effect/projectile/tracer/rainbow + impact_type = /obj/effect/projectile/impact/rainbow + hud_state = "laser" + damage = 0 + nodamage = TRUE + +/obj/item/projectile/beam/sparkledog/on_hit(var/atom/target, var/blocked = 0) + if(ishuman(target)) + var/mob/living/carbon/human/M = target + M.druggy = max(M.druggy, 20) + if(M.health < M.maxHealth) + to_chat(target, span_notice("As the beam strikes you, you feel a little healthier!")) + M.adjustBruteLoss(-5) + M.adjustFireLoss(-5) + return 1 + // // Projectile Beam Definitions // diff --git a/icons/misc/title_vr_2.dmi b/icons/misc/title_vr_2.dmi index ab92eb07abc..33101e63a34 100644 Binary files a/icons/misc/title_vr_2.dmi and b/icons/misc/title_vr_2.dmi differ diff --git a/icons/mob/human_races/r_sparkle.dmi b/icons/mob/human_races/r_sparkle.dmi new file mode 100644 index 00000000000..10ae3055cb9 Binary files /dev/null and b/icons/mob/human_races/r_sparkle.dmi differ diff --git a/icons/mob/status_indicators.dmi b/icons/mob/status_indicators.dmi index 6dd81546893..4456425112b 100644 Binary files a/icons/mob/status_indicators.dmi and b/icons/mob/status_indicators.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 07a3c3116e2..3e7c7b2a6af 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -147,6 +147,7 @@ h1.alert, h2.alert {color: #000000;} .teppi {color: #816540; word-spacing:4pt; font-family: "Segoe Script Bold","Segoe Script",sans-serif,Verdana;} .marish {color: #9e31a4;} .shadekin {color: #be3cc5; font-size: 150%; font-weight: bold; font-family: "Gabriola", cursive, sans-serif;} +.rainbow-text {color: #ff00ff;} BIG IMG.icon {width: 32px; height: 32px;} diff --git a/maps/stellar_delight/stellar_delight_defines.dm b/maps/stellar_delight/stellar_delight_defines.dm index 2188eb3b95e..7d47081bc86 100644 --- a/maps/stellar_delight/stellar_delight_defines.dm +++ b/maps/stellar_delight/stellar_delight_defines.dm @@ -1,6 +1,6 @@ /datum/map/stellar_delight/New() ..() - var/choice = pickweight(list( +/* var/choice = pickweight(list( "logo1" = 50, "logo2" = 50, "gateway" = 5, @@ -9,7 +9,7 @@ "above3b" = 200, )) if(choice) - lobby_screens = list(choice) + lobby_screens = list(choice)*/ /datum/map/stellar_delight name = "StellarDelight" @@ -24,8 +24,8 @@ zlevel_datum_type = /datum/map_z_level/stellar_delight - lobby_icon = 'icons/misc/title_vr.dmi' - lobby_screens = list("youcanttaketheskyfromme") + lobby_icon = 'icons/misc/title_vr_2.dmi' //remove the _2 after the event + lobby_screens = list("sparkles") //set back to youcanttaketheskyfromme id_hud_icons = 'icons/mob/hud_jobs_vr.dmi' diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index e66650f4ecb..5c8a73ae40c 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -1436,6 +1436,37 @@ $border-width-px: $border-width * 1px; font-family: Wingdings, Webdings; } +.rainbow { + font-family: monospace; + font-weight: bold; + background: linear-gradient( + to right, + hsl(300, 76%, 72%), + hsl(275, 100%, 25%), + hsl(240, 100%, 50%), + hsl(120, 100%, 25%), + hsl(60, 100%, 50%), + hsl(39, 100%, 50%), + hsl(0, 100%, 50%) + ); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + animation: rainbow_animation 6s ease-in-out infinite; + background-size: 400% 100%; +} + +@keyframes rainbow_animation { + 0%, + 100% { + background-position: 0 0; + } + + 50% { + background-position: 100% 0; + } +} + .spoiler { background-color: hsl(0, 0%, 50%); color: transparent; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index cf7756037a7..128836341cc 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -1463,6 +1463,37 @@ $border-width-px: $border-width * 1px; font-family: Wingdings, Webdings; } +.rainbow { + font-family: monospace; + font-weight: bold; + background: linear-gradient( + to right, + hsl(300, 76%, 72%), + hsl(275, 100%, 25%), + hsl(240, 100%, 50%), + hsl(120, 100%, 25%), + hsl(60, 100%, 50%), + hsl(39, 100%, 50%), + hsl(0, 100%, 50%) + ); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + animation: rainbow_animation 6s ease-in-out infinite; + background-size: 400% 100%; +} + +@keyframes rainbow_animation { + 0%, + 100% { + background-position: 0 0; + } + + 50% { + background-position: 100% 0; + } +} + .spoiler { background-color: hsl(0, 0%, 50%); color: transparent; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss index 9719b6f7082..c6d54071d4b 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss @@ -1437,6 +1437,37 @@ $border-width-px: $border-width * 1px; font-family: Wingdings, Webdings; } +.rainbow { + font-family: monospace; + font-weight: bold; + background: linear-gradient( + to right, + hsl(300, 76%, 72%), + hsl(275, 100%, 25%), + hsl(240, 100%, 50%), + hsl(120, 100%, 25%), + hsl(60, 100%, 50%), + hsl(39, 100%, 50%), + hsl(0, 100%, 50%) + ); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + animation: rainbow_animation 6s ease-in-out infinite; + background-size: 400% 100%; +} + +@keyframes rainbow_animation { + 0%, + 100% { + background-position: 0 0; + } + + 50% { + background-position: 100% 0; + } +} + .spoiler { background-color: hsl(0, 0%, 50%); color: transparent; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss index 0300499a5a1..f530c2ec83d 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss @@ -1461,6 +1461,37 @@ $border-width-px: $border-width * 1px; font-family: Wingdings, Webdings; } +.rainbow { + font-family: monospace; + font-weight: bold; + background: linear-gradient( + to right, + hsl(300, 76%, 72%), + hsl(275, 100%, 25%), + hsl(240, 100%, 50%), + hsl(120, 100%, 25%), + hsl(60, 100%, 50%), + hsl(39, 100%, 50%), + hsl(0, 100%, 50%) + ); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + animation: rainbow_animation 6s ease-in-out infinite; + background-size: 400% 100%; +} + +@keyframes rainbow_animation { + 0%, + 100% { + background-position: 0 0; + } + + 50% { + background-position: 100% 0; + } +} + .spoiler { background-color: hsl(0, 0%, 50%); color: transparent;