-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add soul event infrastructure for boss fight (#84)
supplementarily: - make `datapack/test` workflow run regardless of if `datapack/lint` passes -- [`f36d384` (#84)](f36d384) - add objective setup and `reset_scores` functions to run on `/reload` -- [`d5ac716` (#84)](d5ac716) - refactor AJ removal function calls into standalone function -- [`1a3a311` (#84)](1a3a311) - add convenience function to stop the boss fight -- [`26db866` (#84)](26db866) - let `attack-flies` trigger next boss-fight attack sooner -- [`1a73212` (#84)](1a73212) - add missing models to `remove_animated_java_models` -- [`a0d30c5` (#84)](a0d30c5)
- Loading branch information
1 parent
1fa99b3
commit e4dca8e
Showing
53 changed files
with
1,288 additions
and
36 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 2 additions & 0 deletions
2
datapacks/omega-flowey/data/_/functions/boss_fight/stop.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
function entity:remove_animated_java_models | ||
kill @e[tag=boss_fight] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
...data/entity/functions/directorial/boss_fight/vanilla/phase/attack/initialize/1.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
20 changes: 20 additions & 0 deletions
20
...wey/data/entity/functions/directorial/boss_fight/vanilla/phase/soul/initialize.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
# Split on phase score | ||
execute if score @s boss-fight.progress.phase.i matches 0 run function entity:directorial/boss_fight/vanilla/phase/soul/initialize/0 | ||
|
||
## Set scores | ||
# the negative time duration is how long the static length lasts (25 ticks) | ||
scoreboard players set @s boss-fight.progress.clock.i -26 | ||
scoreboard players set @s boss-fight.progress.clock.total 27 | ||
|
||
function entity:directorial/boss_fight/vanilla/phase/soul/static | ||
|
||
# Move players to soul arena | ||
execute as @a at @s unless entity @s[team=!player,team=!spectator] run teleport @s ~ ~ ~-75.0 | ||
|
||
# Add tags | ||
tag @s add boss_fight.phase.soul | ||
|
||
# Delete main flowey models for performance reasons | ||
function entity:hostile/omega-flowey/summon/remove_preexisting_models/except_tv_screen | ||
execute as @e[tag=aj.soul.root,tag=soul.warning] run function animated_java:soul/remove/this | ||
execute as @e[tag=aj.tv_screen.root,tag=tv_screen.boss_fight] run function animated_java:tv_screen/remove/this |
Empty file.
4 changes: 4 additions & 0 deletions
4
...ga-flowey/data/entity/functions/directorial/boss_fight/vanilla/phase/soul/loop.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
# we check the score's larger range first because we could otherwise unintentionally | ||
# run both loop functions in one tick if `pre_static` incremented the score from -1 -> 0 | ||
execute if score @s boss-fight.progress.clock.i matches 0.. run function entity:directorial/boss_fight/vanilla/phase/soul/loop/post_static | ||
execute if score @s boss-fight.progress.clock.i matches ..-1 run function entity:directorial/boss_fight/vanilla/phase/soul/loop/pre_static |
6 changes: 6 additions & 0 deletions
6
...entity/functions/directorial/boss_fight/vanilla/phase/soul/loop/event_finished.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
tag @s remove has_active_soul_event | ||
|
||
function entity:directorial/boss_fight/vanilla/phase/soul/static | ||
|
||
# Delete floating soul model | ||
execute as @e[tag=aj.soul.root,tag=soul.soul_event] run function animated_java:soul/remove/this |
10 changes: 10 additions & 0 deletions
10
...ata/entity/functions/directorial/boss_fight/vanilla/phase/soul/loop/next_event.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
# Split on phase score | ||
execute if score @s boss-fight.progress.phase.i matches 0 run function entity:directorial/boss_fight/vanilla/phase/soul/loop/next_event/0 | ||
|
||
# Change tv screen variant | ||
execute as @e[tag=aj.tv_screen.root,tag=tv_screen.soul] run function animated_java:tv_screen/apply_variant/default | ||
|
||
# Summon and begin animating soul heart model in front of soul screen | ||
execute store result storage animate:soul soul_index int 1 run scoreboard players get @s boss-fight.progress.phase.i | ||
function entity:hostile/omega-flowey/summon/soul/soul with storage animate:soul | ||
execute as @e[tag=aj.soul.root,tag=soul.soul_event] run function entity:hostile/omega-flowey/animate/soul/soul |
1 change: 1 addition & 0 deletions
1
...a/entity/functions/directorial/boss_fight/vanilla/phase/soul/loop/next_event/0.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
function entity:soul/soul_0/start |
6 changes: 6 additions & 0 deletions
6
...ta/entity/functions/directorial/boss_fight/vanilla/phase/soul/loop/post_static.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
# wait until the soul event finishes before continuing the boss_fight's loop | ||
execute if entity @s[tag=has_active_soul_event] run return 0 | ||
|
||
scoreboard players add @s boss-fight.progress.clock.i 1 | ||
|
||
execute if score @s boss-fight.progress.clock.i = @s boss-fight.progress.clock.total run function entity:directorial/boss_fight/vanilla/phase/soul/terminate |
8 changes: 8 additions & 0 deletions
8
...ata/entity/functions/directorial/boss_fight/vanilla/phase/soul/loop/pre_static.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
## Initial TV screen static, before the soul event starts | ||
scoreboard players add @s boss-fight.progress.clock.i 1 | ||
|
||
# Start new soul event at clock index 0 | ||
execute if score @s boss-fight.progress.clock.i matches 0 run function entity:directorial/boss_fight/vanilla/phase/soul/loop/next_event | ||
|
||
# Add tags | ||
tag @s add has_active_soul_event |
1 change: 1 addition & 0 deletions
1
...-flowey/data/entity/functions/directorial/boss_fight/vanilla/phase/soul/static.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
execute as @e[tag=aj.tv_screen.root,tag=tv_screen.soul] at @s run function entity:directorial/boss_fight/vanilla/phase/soul/static/as_root |
4 changes: 4 additions & 0 deletions
4
...data/entity/functions/directorial/boss_fight/vanilla/phase/soul/static/as_root.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
# Play static sound | ||
playsound omega-flowey:boss-fight.static ambient @a ~ ~ ~ 10 | ||
|
||
function animated_java:tv_screen/apply_variant/static |
12 changes: 12 additions & 0 deletions
12
...owey/data/entity/functions/directorial/boss_fight/vanilla/phase/soul/terminate.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
# Remove tags | ||
tag @s remove boss_fight.phase.soul | ||
|
||
# Next phase | ||
function entity:directorial/boss_fight/vanilla/phase/attack/initialize | ||
|
||
# Move players to main arena | ||
execute as @a at @s unless entity @s[team=!player,team=!spectator] run teleport @s ~ ~ ~75.0 | ||
|
||
# Re-summon main Omega Flowey models | ||
function entity:hostile/omega-flowey/summon | ||
function entity:hostile/omega-flowey/animate |
19 changes: 14 additions & 5 deletions
19
...ity/functions/directorial/boss_fight/vanilla/phase/warn/initialize/after_delay.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,18 @@ | ||
# Play WARNING sound | ||
execute at @e[tag=aj.tv_screen.root] run playsound omega-flowey:boss-fight.alarm hostile @a ~ ~ ~ 10 1 | ||
execute at @e[tag=aj.tv_screen.root,tag=tv_screen.boss_fight] run playsound omega-flowey:boss-fight.alarm ambient @a ~ ~ ~ 10 1 | ||
|
||
# Set Omega Flowey to WARNING variant | ||
function entity:hostile/omega-flowey/animate/tv-screen/warning | ||
# Set tv screen to WARNING variant | ||
execute as @e[tag=aj.tv_screen.root,tag=tv_screen.boss_fight] run function entity:hostile/omega-flowey/animate/warning/tv_screen | ||
|
||
execute store result storage animate:soul soul_index int 1 run scoreboard players get @s boss-fight.progress.phase.i | ||
|
||
# Set applicable petal-pipe to soul-color variant | ||
execute store result storage animate:pipe soul_index int 1 run scoreboard players get @s boss-fight.progress.phase.i | ||
function entity:hostile/omega-flowey/animate/pipe with storage animate:pipe | ||
function entity:hostile/omega-flowey/animate/pipe with storage animate:soul | ||
|
||
# Summon and begin animating soul heart model in front of WARNING screen | ||
function entity:hostile/omega-flowey/summon/warning/soul with storage animate:soul | ||
execute as @e[tag=aj.soul.root,tag=soul.warning] run function entity:hostile/omega-flowey/animate/warning/soul | ||
|
||
# Summon and begin animating soul tv_screen in other arena | ||
function entity:hostile/omega-flowey/summon/soul/tv_screen | ||
execute as @e[tag=aj.tv_screen.root,tag=tv_screen.soul] run function entity:hostile/omega-flowey/animate/soul/tv_screen |
3 changes: 3 additions & 0 deletions
3
...owey/data/entity/functions/directorial/boss_fight/vanilla/phase/warn/terminate.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,5 @@ | ||
# Remove tags | ||
tag @s remove boss_fight.phase.warn | ||
|
||
# Next phase | ||
function entity:directorial/boss_fight/vanilla/phase/soul/initialize |
1 change: 1 addition & 0 deletions
1
...acks/omega-flowey/data/entity/functions/hostile/omega-flowey/animate/soul/soul.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
function animated_java:soul/animations/float/play |
2 changes: 2 additions & 0 deletions
2
...omega-flowey/data/entity/functions/hostile/omega-flowey/animate/soul/tv_screen.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
function animated_java:tv_screen/animations/move/play | ||
function animated_java:tv_screen/apply_variant/default |
2 changes: 0 additions & 2 deletions
2
...ga-flowey/data/entity/functions/hostile/omega-flowey/animate/tv-screen/warning.mcfunction
This file was deleted.
Oops, something went wrong.
1 change: 1 addition & 0 deletions
1
...s/omega-flowey/data/entity/functions/hostile/omega-flowey/animate/warning/soul.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
function animated_java:soul/animations/shake/play |
2 changes: 2 additions & 0 deletions
2
...ga-flowey/data/entity/functions/hostile/omega-flowey/animate/warning/tv_screen.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
function animated_java:tv_screen/apply_variant/warning | ||
execute on passengers if entity @s[tag=aj.tv_screen.bone.screen] run data merge entity @s { brightness: { block: 15, sky: 0 } } |
5 changes: 4 additions & 1 deletion
5
...a/entity/functions/hostile/omega-flowey/attack/flies/indicator/maybe_terminate.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,9 @@ | ||
## terminate if there are no more associated flies | ||
## terminate indicator if there are no more associated flies | ||
# (`function entity:group/start` has already been ran by the bullet who called this function) | ||
scoreboard players set #attack.flies.count math.0 0 | ||
execute as @e[scores={group.id=0},tag=attack-bullet,tag=flies] run scoreboard players add #attack.flies.count math.0 1 | ||
execute if score #attack.flies.count math.0 matches 1 run scoreboard players set @s attack.clock.i -1 | ||
execute if score #attack.flies.count math.0 matches 1 run tag @s add flies_are_done | ||
|
||
# let boss fight perform next attack if there are 5 flies remaining | ||
execute if score #attack.flies.count math.0 matches 5 as @e[tag=boss_fight] run function entity:hostile/omega-flowey/attack/flies/indicator/terminate/boss_fight |
2 changes: 0 additions & 2 deletions
2
...ey/data/entity/functions/hostile/omega-flowey/attack/flies/indicator/terminate.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1 @@ | ||
execute as @e[tag=boss_fight] run function entity:hostile/omega-flowey/attack/flies/indicator/terminate/boss_fight | ||
|
||
function animated_java:venus_fly_trap/remove/this |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 1 addition & 6 deletions
7
...ey/data/entity/functions/hostile/omega-flowey/summon/remove_preexisting_models.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,2 @@ | ||
function animated_java:large_side_vine/remove/all | ||
function animated_java:lower_eye/remove/all | ||
function animated_java:nose/remove/all | ||
function animated_java:petal_pipe_circle/remove/all | ||
function animated_java:petal_pipe_middle/remove/all | ||
function entity:hostile/omega-flowey/summon/remove_preexisting_models/except_tv_screen | ||
function animated_java:tv_screen/remove/all | ||
function animated_java:upper_eye/remove/all |
6 changes: 6 additions & 0 deletions
6
...nctions/hostile/omega-flowey/summon/remove_preexisting_models/except_tv_screen.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
function animated_java:large_side_vine/remove/all | ||
function animated_java:lower_eye/remove/all | ||
function animated_java:nose/remove/all | ||
function animated_java:petal_pipe_circle/remove/all | ||
function animated_java:petal_pipe_middle/remove/all | ||
function animated_java:upper_eye/remove/all |
3 changes: 3 additions & 0 deletions
3
...packs/omega-flowey/data/entity/functions/hostile/omega-flowey/summon/soul/soul.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
## Soul heart (soul_event) | ||
$execute at @e[tag=aj.tv_screen.locator.soul_event] run function animated_java:soul/summon/$(soul_index) | ||
tag @e[tag=aj.soul.root,tag=!soul.soul_event,tag=!soul.warning] add soul.soul_event |
2 changes: 2 additions & 0 deletions
2
.../omega-flowey/data/entity/functions/hostile/omega-flowey/summon/soul/tv_screen.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
execute positioned 0 49 -81 rotated 0 45 run function animated_java:tv_screen/summon | ||
tag @e[tag=aj.tv_screen.root,tag=!tv_screen.soul,tag=!tv_screen.boss_fight] add tv_screen.soul |
3 changes: 3 additions & 0 deletions
3
...ks/omega-flowey/data/entity/functions/hostile/omega-flowey/summon/warning/soul.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
## Soul heart (warning) | ||
$execute at @e[tag=aj.tv_screen.locator.warning] run function animated_java:soul/summon/$(soul_index) | ||
tag @e[tag=aj.soul.root,tag=!soul.soul_event,tag=!soul.warning] add soul.warning |
19 changes: 19 additions & 0 deletions
19
datapacks/omega-flowey/data/entity/functions/remove_animated_java_models.mcfunction
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
# Omega Flowey model | ||
function entity:hostile/omega-flowey/summon/remove_preexisting_models | ||
|
||
# Attack models | ||
function animated_java:bomb/remove/all | ||
function animated_java:dentata_snake_ball/remove/all | ||
function animated_java:finger_gun/remove/all | ||
function animated_java:finger_gun_bullet/remove/all | ||
function animated_java:finger_gun_laser/remove/all | ||
function animated_java:friendliness_pellet/remove/all | ||
function animated_java:friendliness_pellet_ring/remove/all | ||
function animated_java:homing_vine/remove/all | ||
function animated_java:homing_vine_blinking_lane/remove/all | ||
function animated_java:housefly/remove/all | ||
function animated_java:projectile_star/remove/all | ||
function animated_java:venus_fly_trap/remove/all | ||
|
||
# Soul models | ||
function animated_java:soul/remove/all |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
datapacks/omega-flowey/data/minecraft/tags/functions/load.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
{ | ||
"replace": false, | ||
"values": [ | ||
"omega-flowey:setup/objectives", | ||
"_:reset_scores" | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.