Smash!
Super Smash Bros (SSB) is a beat ’em up videogame series featuring characters from various Nintendo franchises and beyond.
The series has featured on Nintendo 64 (Super Smash Bros, 1998), Gamecube (SSB Melee, 2001), Wii (SSB Brawl, 2008), Wii U and 3DS (SSB ‘4’, 2014) and an upcoming title for the Switch console.
The game is popular enough to have resulted in a series of organised tournaments1.
You can fight characters directly but you can also make use of items and weapons from games across the Nintendo universe, such as the mushroom (the Super Mario series), the heart container (Zelda) and the home run bat (EarthBound).
One of the more interesting items in SSB is the pokéball. This item is used in the Pokémon series of games to capture and store Pokémon. When a player picks up and throws a pokéball in SSB, it opens to release 1 of a possible 13 Pokémon. The SSB wiki says that all of them are ‘common’, except for ‘uncommon’ Snorlax and ‘rare’ Mew (apparently only once every 151 releases, which is related to the number of Pokémon in the original game).
So how frequently in practice does each Pokémon emerge from a pokéball in SSB on N64?
This is a short post to sate my curiosity. I’ve used R code throughout. The post will update as I gather more data.
Data
I’m a recovering ecologist, so data collection by observation is very important to me. I watched four computer-controlled players face-off in versus mode (it’s a weekend and I’m old enough to do whatever I want (after I’ve done my chores)). Pokéballs were the only items set to ‘on’ and frequency was set to ‘very high’. I saved the file as a CSV on GitHub.
# load packages
library(dplyr) # data manipulation
library(readr) # reading files
# read data from github
balls <- read_csv(
"https://raw.githubusercontent.com/matt-dray/draytasets/master/ssb_pokeballs.csv"
) %>%
mutate(pokemon = tools::toTitleCase(pokemon)) # start names with caps
# preview 25 random observations
sample_n(balls, 25) %>% # sample of 25
pull() # column to vector
## [1] "Goldeen" "Chansey" "Beedrill" "Starmie" "Chansey" "Chansey"
## [7] "Charizard" "Hitmonlee" "Blastoise" "Onix" "Clefairy" "Hitmonlee"
## [13] "Hitmonlee" "Charizard" "Meowth" "Snorlax" "Koffing" "Charizard"
## [19] "Onix" "Hitmonlee" "Meowth" "Goldeen" "Onix" "Blastoise"
## [25] "Clefairy"
Frequency
Table
We can make use of the tabyl()
function from the janitor
package.
library(janitor)
balls_summary <- balls %>%
tabyl(pokemon) %>%
arrange(desc(n)) %>%
mutate(percent = round(percent * 100, 1)) %>%
rename(Pokemon = pokemon, Count = n, Percent = percent)
knitr::kable(balls_summary)
Pokemon | Count | Percent |
---|---|---|
Beedrill | 26 | 9.0 |
Chansey | 26 | 9.0 |
Goldeen | 26 | 9.0 |
Snorlax | 26 | 9.0 |
Blastoise | 25 | 8.6 |
Hitmonlee | 25 | 8.6 |
Onix | 25 | 8.6 |
Koffing | 24 | 8.3 |
Charizard | 23 | 7.9 |
Starmie | 23 | 7.9 |
Meowth | 20 | 6.9 |
Clefairy | 18 | 6.2 |
Mew | 3 | 1.0 |
Plot
Of course we can plot these data a well. It seems fitting to have a Pokémon theme, so we can use the gghealth()
function from the Rokemon
package by David Schoch. This creates a bar chart where the bars look like the health point (HP) meter from the original Pokémon games on the Nintendo Game Boy.2
library(ggplot2) # plots
library(Rokemon) # remotes::install_github("schochastics/Rokemon")
balls %>%
group_by(pokemon) %>%
count() %>%
gghealth("pokemon", "n") +
labs(
x = "", y = "Count",
title = "Pokeball release frequencies",
subtitle = "Super Smash Bros on Nintendo 64"
)
Revelation
So it looks like the ‘common’ Pokémon according to the SSB wiki are indeed more common, though Snorlax appears equal first on this list, despite being labelled as ‘uncommon’. Clefairy also appeared less than expected, given it was labelled as ‘common’.
Mew appeared 3 times out of 290, which is once every 96.7 releases; less than the once every 151 releases I mentioned above.
Bear in mind that this is only based on a sample of 290 so far. I might collect more data at a later point.
For now, here’s a gratuitous shot of my coveted Pokémon Stadium special-edition N64.
Session info
## ─ Session info ───────────────────────────────────────────────────────────────
## setting value
## version R version 3.6.0 (2019-04-26)
## os macOS Mojave 10.14.6
## system x86_64, darwin15.6.0
## ui X11
## language (EN)
## collate en_GB.UTF-8
## ctype en_GB.UTF-8
## tz Europe/London
## date 2020-05-17
##
## ─ Packages ───────────────────────────────────────────────────────────────────
## package * version date lib source
## assertthat 0.2.1 2019-03-21 [1] CRAN (R 3.6.0)
## blogdown 0.12 2019-05-01 [1] CRAN (R 3.6.0)
## bookdown 0.10 2019-05-10 [1] CRAN (R 3.6.0)
## cli 2.0.1 2020-01-08 [1] CRAN (R 3.6.0)
## colorspace 1.4-1 2019-03-18 [1] CRAN (R 3.6.0)
## crayon 1.3.4 2017-09-16 [1] CRAN (R 3.6.0)
## curl 4.3 2019-12-02 [1] CRAN (R 3.6.0)
## digest 0.6.23 2019-11-23 [1] CRAN (R 3.6.0)
## dplyr * 0.8.3 2019-07-04 [1] CRAN (R 3.6.0)
## ellipsis 0.3.0 2019-09-20 [1] CRAN (R 3.6.0)
## evaluate 0.14 2019-05-28 [1] CRAN (R 3.6.0)
## extrafont 0.17 2014-12-08 [1] CRAN (R 3.6.0)
## extrafontdb 1.0 2012-06-11 [1] CRAN (R 3.6.0)
## fansi 0.4.1 2020-01-08 [1] CRAN (R 3.6.0)
## farver 2.0.1 2019-11-13 [1] CRAN (R 3.6.0)
## ggplot2 * 3.2.1 2019-08-10 [1] CRAN (R 3.6.0)
## glue 1.3.1 2019-03-12 [1] CRAN (R 3.6.0)
## gtable 0.3.0 2019-03-25 [1] CRAN (R 3.6.0)
## highr 0.8 2019-03-20 [1] CRAN (R 3.6.0)
## hms 0.5.1 2019-08-23 [1] CRAN (R 3.6.0)
## htmltools 0.4.0 2019-10-04 [1] CRAN (R 3.6.0)
## janitor * 1.2.0 2019-04-21 [1] CRAN (R 3.6.0)
## knitr 1.26 2019-11-12 [1] CRAN (R 3.6.0)
## labeling 0.3 2014-08-23 [1] CRAN (R 3.6.0)
## lazyeval 0.2.2 2019-03-15 [1] CRAN (R 3.6.0)
## lifecycle 0.1.0 2019-08-01 [1] CRAN (R 3.6.0)
## magrittr 1.5 2014-11-22 [1] CRAN (R 3.6.0)
## munsell 0.5.0 2018-06-12 [1] CRAN (R 3.6.0)
## pillar 1.4.3 2019-12-20 [1] CRAN (R 3.6.0)
## pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 3.6.0)
## purrr 0.3.3 2019-10-18 [1] CRAN (R 3.6.0)
## R6 2.4.1 2019-11-12 [1] CRAN (R 3.6.0)
## Rcpp 1.0.3 2019-11-08 [1] CRAN (R 3.6.0)
## readr * 1.3.1 2018-12-21 [1] CRAN (R 3.6.0)
## rlang 0.4.4 2020-01-28 [1] CRAN (R 3.6.0)
## rmarkdown 2.0 2019-12-12 [1] CRAN (R 3.6.0)
## Rokemon * 0.0.1 2020-05-17 [1] Github (schochastics/Rokemon@d9290df)
## Rttf2pt1 1.3.7 2018-06-29 [1] CRAN (R 3.6.0)
## scales 1.1.0 2019-11-18 [1] CRAN (R 3.6.0)
## sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 3.6.0)
## stringi 1.4.5 2020-01-11 [1] CRAN (R 3.6.0)
## stringr 1.4.0 2019-02-10 [1] CRAN (R 3.6.0)
## tibble 2.1.3 2019-06-06 [1] CRAN (R 3.6.0)
## tidyr 1.0.0 2019-09-11 [1] CRAN (R 3.6.0)
## tidyselect 0.2.5 2018-10-11 [1] CRAN (R 3.6.0)
## vctrs 0.2.2 2020-01-24 [1] CRAN (R 3.6.0)
## withr 2.1.2 2018-03-15 [1] CRAN (R 3.6.0)
## xfun 0.11 2019-11-12 [1] CRAN (R 3.6.0)
## yaml 2.2.1 2020-02-01 [1] CRAN (R 3.6.0)
##
## [1] /Library/Frameworks/R.framework/Versions/3.6/Resources/library
I recommend you watch the indie documentary on YouTube about the rise of SSB Melee tournaments.↩
Also check out the
geom_pokemon()
function in theggimage
package by Guangchuang Yu, which plots points as Pokémon sprites.↩