Pokéballs in Super Smash Bros

Super Smash Bros for N64

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.

Special edition Nintendo 64 playing Super Smash Bros

Special edition Nintendo 64 playing Super Smash Bros


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

  1. I recommend you watch the indie documentary on YouTube about the rise of SSB Melee tournaments.

  2. Also check out the geom_pokemon() function in the ggimage package by Guangchuang Yu, which plots points as Pokémon sprites.