User:CanvasK

From SmashWiki, the Super Smash Bros. wiki
Revision as of 18:25, December 20, 2022 by CanvasK (talk | contribs) (I'm going to focus on testing stuff in the funny moon-brother-god exploder simulator. I'd prefer to not spend hours away from that to unbreak things here. Only thing I want to see break is moon-brother-god's hammer via ukulele)
Jump to navigationJump to search
An icon used in notice templates. NOTE: I'm doing testing for a different game. That, plus the holidays, likely means I won't be as active. Don't break anything.

A man with too much time on his hands and an unusual obsession with consistency and testing. I worked out the majority of values for spirits and stickers, extensively tested and documented spirit experience and attack multiplier limiter, documented finer details of hitlag, enforced parity in listings of Spirit Battles and trophies as well as documented region differences in the latter, uploaded/improved numerous files for on-screen appearances, victory poses, taunts, attack demos, trophy boxes, Pokémon, have done weird things that caused Porple to take time out of his day to add backend code, and so on.

I know next to nothing about competitive Smash, so don't expect any edits or answers regarding it. Feel free to use information on this page and my sub-pages for the mainspace.

Apparently I have ownership of the clean-up project. I recommend everyone look through it to get an idea of the scope and to help clean it up.

To-do

  • Attempt to find HRC thresholds for different angles, if they exist
  • Find when WoL music changes
  • Update spirit effect translations
  • Spirit Battle condition translations, at least for Japanese
  • Keep an eye on Spirit Battles. Someones gotta
    • Python script is functional, still quite a bit of manual work but at least it doesn't take 3 days. Thanks to SnorlaxMonster for getting me on track

GIFs

  • A lot of attacks. May just scorched earth it since almost all of them are "misleading".

Pages to keep updated with DLC

Quick links

Facility test data Spirit translations Unused spirit effects Spirit changelog

How to GIF

There's a lot of sites that make GIFs, however most of them either lack control, add watermarks, or both; ezgif.com has decent control and no watermarks and I recommend it if you don't want to go through with the process below. There are two things that will be needed to make your own GIFs without websites or expensive editing programs: FFmpeg and Gifsicle (optional). Both of these programs are free command-line tools. Below is a command that will work for most situations:

ffmpeg -ss <start_time> -t <duration> -i <video_file> -vf "crop=<c_width>:<c_height>:<c_topleft_x>:<c_topleft_y>,fps=<framerate>,scale=<width>:<height>:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=bayer" -loop 0 <output_file>

Note: if "ffmpeg" or "gifsicle" aren't recognized as commands, find the location of the executable and use that. Example ffmpeg -> "C:\ffmpeg-4.2.2-win64-static\bin\ffmpeg.exe"

start_time    = The first frame of the video. Can either be seconds or [HH:]MM:SS[.ms] format
duration      = How far after start_time to go
video_file    = Source file
output_file   = Output file
c_...         = Cropping. The width and height and the top-left corner coordinates
framerate     = The frames per second (fps) of the output. Due to GIF specifications, 50 fps is the technical max framerate possible
width, height = The width and height of the output. Either can be set to -1 to automatically change with the other. iw*x and ih*y can also be used to scale, example iw*.5 = 50% width

Any of the inputs (except video_file and output_file) can be removed if they are unneeded

split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=bayer is to skirt around GIFs limited 256 color limit, either by dithering or creating a new set of 256 colors at a certain point. Optional, tends to increase filesize
-loop 0 forces looping. Never tried without it so I don't know what happens without it

Example: ffmpeg -ss 4.0 -t 2.8333 -i "Min Min.mp4" -vf "fps=15,scale=600:-1:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=bayer" -loop 0 "MinMinOnScreenAppearanceSSBU.gif"
Use "Min Min.mp4", start 4 seconds in, go for 2.8333 seconds, play at 15 fps, scale width to 600, output to MinMinOnScreenAppearanceSSBU.gif.

You are effectively done at this point. Afterwards Gifsicle can be used to reduce the filesize.

gifsicle -b <gif_file> -O3 --lossy > <output_file>
gif_file    = Source file
output_file = Output file

-O3 lets Gifsicle determine how to optimize the file
--lossy means some data will may be lost. This isn't a concern because GIF's 256 color limit makes it barely noticeable

To avoid doing multiple lines, we can "pipe" the FFmpeg output into Gifsicle's input:

ffmpeg -ss <start_time> -t <duration> -i <video_file> -vf "crop=<c_width>:<c_height>:<c_topleft_x>:<c_topleft_y>,fps=<framerate>,scale=<width>:<height>:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=bayer" -loop 0 -f gif - | gifsicle -O3 --lossy > <output_file>

-f gif tells FFmpeg that the file will be a GIF, which is necessary for Gifsicle to process

Example: Example: ffmpeg -ss 4.0 -t 2.8333 -i "Min Min.mp4" -vf "fps=15,scale=600:-1:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=bayer" -loop 0 -f gif - | gifsicle -O3 --lossy > "MinMinOnScreenAppearanceSSBU.gif"

This will take care of almost everything you need for GIFs. See FFmpeg's and Gifsicle's documentation for more details and other commands. And remember, it is pronounced GIF not GIF.

Formats

Victory Poses
  • <CHAR>VictoryPose<d>SSBU
    • d: 1=left, 2=up, 3=right
  • 25 FPS, 600x338px
  • Start is 30f before fade (check histogram for new spikes)
  • 4 seconds with palettegen, around 8 seconds for extended animations without palettegen
    • Mirror match for extended to include clapping animation
On-screen appearances
  • <CHAR>OnScreenAppearanceSSBU
  • 15 FPS, 600x338px
  • Start is 6f after the black start screen
  • 2.83333 seconds
  • Mirror match on Omega Battlefield. Stationary camera to prevent jumping around; better compression, smoother, and allows the full animation to be shown
Moves
  • <CHAR> <MOVE NAME/DIRECTION> <variation num?> SSBU
  • 25 FPS; 480x270px (480-30x until <10MB)
  • Start is 12f before move's first frame
  • End is 12f after move ends or opponent stops moving, whichever is longer
  • Mirror match on Omega relevant stage
Taunts/Idle poses
  • SSBU<CHAR>Idle/Taunt<d>
    • d: 1=up, 2=side, 3=down
  • 25 FPS, 600x338
  • Minimum 6f before and after, mess with the values until it is smooth
  • Character should face the direction that makes their body point towards the screen
  • Camera zoomed a little larger than a Battlefield platform
  • Relevant Battlefield

WebM test

This is a comparison of WebM and GIF

WebM: 60 fps, full color-space, 1.07 MiB/1.12 MB (1,122,784 bytes)

GunnerOnScreenAppearanceSSBU.gif

GIF: 15 fps, 256 colors, 3.53 MiB/3.70 MB (3,707,356 bytes)

Pros of WebM:

  1. Smaller file size
  2. Higher potential frame rate
  3. Larger color space

Cons of WebM:

  1. Not as many browsers support it
  2. Doesn't autoplay; May be a good thing considering point #4
  3. Doesn't autoloop Loops if the time is <15 seconds
  4. Much greater CPU usage

Handy Regex

Remove duplicate text in links when a suffix would work:
Search: \[\[([^\|]+)\|\1([^\]]+)\]\]
Replace: [[$1]]$2

Simple section/anchor link (Template:H2):
Search: \[\[([^\#]+)\#([^\]]+)\|\2\]\]
Replace: {{h2|$1|$2}}

Bracket simplifier (Template:B):
Search: \[\[([^\)]+) \(([^\]]+)\)\|\1\]\]
Replace: {{b|$1|$2}}

3 param Template:S to Template:IW:
Search: {{s\|([^}]+)\|([^}]+)\|([^}]+)}}
Replace: {{iw|$1|$2|$3}}

Rollover/hover text (Template:Rollover):
Search: <span class="explain" title="([^>]+)">([^<]+)</span>
Replace: {{rollover|$2|$1|?}}

"\…" is used to escape characters, preventing the regex from interpreting them as part of the regex command. "(…)" defines a capture group. "." matches any character. "*" matches 0-infinite of the prior character; ".*" matches 0-infinite of any character. "[…]" defines a set of characters. "^" is a NOT operator; "[^…]" equates to not these characters. "\1,2,3,..." references a capture group in the search field, counting up from left to right. "$1,2,3,..." references a capture group in the replace field, counting up from left to right.

Extreme Spirit Teams

Max speed

Primary Ability Abilities Style Total
Max
Run/walk
Weight ↓ Trade-Off Speed ↑ Undamaged Speed ↑ Undamaged Speed ↑ Ninja 6.272
1.4 1.4 2.0 1.6
No contradiction Weight ↓ Lightweight Undamaged Speed ↑ Undamaged Speed ↑ Ninja 5.824
1.4 1.3 2.0 1.6
Always on Weight ↓ Lightweight Trade-Off Speed ↑ Trade-Off Speed ↑ Ninja 5.2416
1.4 1.3 1.8 1.6

Min speed

Primary Ability Abilities Style Total
Min
Dash
Weight ↑ ↑ (Support) Slow Super Armor Gravity (Ground Speed) 0.09
0.6 0.3 0.5

Max jump

Primary Ability Abilities Style Total
Max
Jump
Lightweight Lightweight Jump ↑ (Support, Jump Height) Gravity (Jump) 4.32
1.6 1.8 1.5
Max
Short-Hop
Lightweight Lightweight Jump ↑ (Support, Jump Speed) Gravity (Jump) 3.42
1.9 1.2 1.5

Min jump

Primary Ability Abilities Style Total
Min
Jump
Weight ↑ ↑ (Support) Slow Super Armor Runner (Jump) 0.18
0.6 0.5 0.6

Spirit Experience

This is the results of testing experience.

The amount of experience a Spirit needs to reach lv.99 is based on its max power, rank, number of slots, if it is enhanceable, and if it is neutral or not. Power does not refer to 'Team Power'; power is attack+defense, team power is power modified by styles and skills.

Max Experience

The equation is:
max_exp = Power * slot_multiplier + class_exp
If the Spirit is neutral, divide the result by 2.

Slot Multiplier

  • 0 slots: 0.5
  • 1 slot : 0.55
  • 2 slots: 0.605
  • 3 slots: 0.6655

If the Spirit is enhanceable, multiply this value by 1.5.

Class Experience

For non-enhanceable:

  • 1: 12000
  • 2: 20000
  • 3: 40000
  • 4: 60000

For enhanceable:

  • Starts at class 1:
    • 2: 22000
    • 3: 32000
    • 4: 42000
  • Starts at class 2:
    • 3: 30000
    • 4: 40000
  • Starts at class 3:
    • 4: 50000

Experience Growth

With max_exp determined it is possible to find the experience needed to reach any level.

Exp at any level = max_exp × (ratio^(level - 1) - 1)/(ratio^(98) - 1)
Exp to the next level = max_exp × (ratio^(level - 1))/(ratio^(98) - 1) × (ratio - 1)

Ratio

Ratio is based on class.

  • 1: 1.03
  • 2: 1.035
  • 3: 1.04
  • 4: 1.04

Exceptions

Between versions 1.0.0 and 1.1.0 Baby Mario (Superstar Mario), Tiki (Naga's Voice), K.K. Slider, Soma Cruz, and Dr. Kawashima (Concentration Training) had their stats changed without their max experience being updated. This causes them to require less experience than normal. Link (Link's Awakening) is also an exception, but instead requires more experience than normal (24276 vs 22851). Possible explanations are that his Power was 1.5× higher at one point or he was enhance-able from class 2 to 4.

Limiter

The "Limiter", as I call it, is a hidden function involving Spirits and their damage multipliers. It only affects damage multipliers related to Sword types, Throw types (not attacks, types... I think), and 'Generic', 'Generic' being a term I use for damage multipliers that affect everything.

The first step to the function is to combine all of the related multipliers (Fist to fist, sword to sword, generic to generic, etc.) to get the raw_combined_mult (terms are my own, not official). This includes both positive (>1.0×) and negative multipliers (<1.0×) from traits, skills, and styles.

Next step, if the multiplier is for sword or generic, is to go through the following:

IF raw_combined_mult < 1.3:
    do nothing
IF raw_combined_mult > 1.3 AND raw_combined_mult < 1.5:
    final_combined_mult = raw_combined_mult * 0.5 + 0.65
IF raw_combined_mult > 1.5:
    final_combined_mult = raw_combined_mult * 0.2 + 1.2

The final_combined_mult is what is used when an attack hits. Critical Hit ↑, Metal Killer, and Giant Killer do not use generic, they act outside everything similar to the 1v1 multiplier. Skills that will easily get you to experience the limiter are Trade-Off Attacks ↑ and Poison Power Up. Poison Power Up has a multiplier of 2.0×, but the limiter causes it to come out as 1.6×. Trade-Off Attacks ↑ has a multiplier of 1.23×, requiring an additional multiplier of 1.057× to reach the limiter. Trade-Off Attacks ↑ (1.23×) + Trade-Off Abilities ↑ (1.18×) will give 1.3757× instead of 1.4514×.

Lists

World of Light exclusive

The following spirits must be obtained in World of Light. Some can be gotten in other ways, but they must be gotten in World of Light first. Boss, Master, Chest

  • Toadette
  • Kamek
  • Honey Queen
  • Kammy Koopa
  • Funky Kong
  • Candy Kong
  • Wrinkly Kong
  • Link (The Legend of Zelda)
  • Ganon
  • Saria
  • Impa
  • Darunia
  • Beedle
  • Linebeck
  • Alfonzo & Engineer Link
  • Kraid
  • Marx
  • Susie
  • Chef Kawasaki
  • Peppy Hare
  • ROB 64
  • Slowpoke
  • Gyarados
  • Lapras
  • Solgaleo
  • Lunala
  • Dr. Stewart
  • Pico
  • Anna
  • Ryoma
  • Medusa
  • Dyntos
  • Kat & Ana
  • Hal Emmerich
  • Cardboard Box
  • Charlie
  • Timmy & Tommy
  • Copper & Booker
  • Kapp'n
  • Kapp'n (Wild World)
  • Cyrus & Reese
  • Auto
  • Gravity Man
  • MegaMan.EXE
  • ProtoMan.EXE
  • Wii Balance Board
  • Doc Louis
  • Riki (Xenoblade Chronicles)
  • Mythra
  • Zangief
  • Balrog
  • Vega
  • Sagat
  • Sheldon
  • Cap'n Cuttlefish
  • Great Zapfish
  • Mummy
  • The Creature & Flea Man
  • Death
  • Werewolf
  • Dracula
  • Dracula (2nd Form)
  • Master Hand
  • Crazy Hand
  • Giga Bowser
  • Galleom
  • Galeem
  • Dharkon
  • Diskun
  • Lip
  • Ray Mk II
  • Bomberman
  • Rathalos

New file criteria

  • Must be a primary spirit
  • Must be an Advanced-class
  • Must have 1 or 2 slots
  • Can't be enhanceable
  • Can't be summonable
  • Can't be a challenge reward
  • Can't be exclusive to World of Light
  • Can't be from a paid DLC Spirit Board

Shop criteria

  • Can't be a fighter spirit of a fighter that hasn't been unlocked
  • Can't be summonable
  • Can't be a challenge reward
  • Can't be exclusive to World of Light

Spirit Board criteria

Classic Mode reward