return function(game)
  local U = dofile("tests/drivers/util.lua")
  local Pokemon = require("src.pokemon.Pokemon")
  local BattleState = require("src.battle.BattleState")
  local lib = game.mods.exports.DRAMATIC_SHAPE.lib
  local Battles = lib.require("OverworldBattle")
  local Stadium = lib.require("Stadium")
  local Install = lib.require("StadiumInstall")

  U.teleport(game, "ROUTE_1", 5, 8, "down")
  local w = 0
  while (Install.pending() or Install.status.state == "building") and w < 5400 do
    U.wait(10); w = w + 10
  end
  while game.stack:top() and game.stack:top() ~= game.overworld do U.wait(10) end
  Battles.setting:setValue("stadium", game)
  Battles.backSetting:setValue(false, game)
  U.wait(60)

  local marks = {}
  local inner = BattleState.startGrowIn
  BattleState.startGrowIn = function(self, b)
    marks[#marks + 1] = { side = (b == self.player) and "player" or "enemy" }
    return inner(self, b)
  end

  game.save.party = { Pokemon.new(game.data, "PIDGEY", 30) }
  local battle = BattleState.newWild(game, "PIKACHU", 5)
  battle.onFinish = function() end
  game.overworld:pushBattle(battle)

  local seen, lastState, lastGrow, nMark = {}, "?", false, 0
  local shotAt = {}
  for f = 1, 500 do
    U.wait(1)
    if f % 10 == 0 and battle.phase ~= "menu" then U.tap(game, "a") end
    local st = Stadium.animOf("player") or "-"
    local grow = battle.growIn ~= nil
    if #marks > nMark then
      nMark = #marks
      U.log(("f=%3d  >> startGrowIn(%s)   player model present: %s, state %s")
            :format(f, marks[nMark].side, tostring(Stadium.showing("player")),
                    st))
    end
    local poof = (battle.animPlaying and battle.animName == "POOF_ANIM")
                 and true or false
    local key = ("%s|%s|%s|%s|%s|%s|%s|%s|%s"):format(st,
      tostring(math.floor((Stadium.scaleOf("player") or 1) * 20)),
      tostring(poof), tostring(battle.sendingOut),
      tostring(battle.phase), tostring(Stadium.showing("player")),
      tostring(battle.showPlayerBack), tostring(battle.playerBackPic ~= nil),
      tostring((battle.introSlide or 0) > 0))
    if key ~= lastState then
      U.log(("f=%3d state=%-9s sendingOut=%-5s poof=%-5s growIn=%-5s "
             .. "growScale=%-6s model=%s")
            :format(f, st, tostring(battle.sendingOut), tostring(poof),
                    tostring(grow), tostring(Stadium.scaleOf("player")),
                    tostring(Stadium.showing("player"))))
      lastState = key
    end
    -- stills across the grow, so the ramp can be looked at and not just read
    local sc = Stadium.scaleOf("player")
    if Stadium.showing("player") and sc then
      for _, want in ipairs({ 0.15, 0.45, 0.75, 1.0 }) do
        if not shotAt[want] and sc >= want then
          shotAt[want] = true
          U.shot(game, ("%s/grow_%02d.png")
                 :format(os.getenv("SHOT_DIR") or ".", want * 100))
        end
      end
    end
    seen[st] = true
  end
  for i = 1, 4 do
    U.shot(game, (os.getenv("SHOT_DIR") or ".") .. ("/pidgey_%d.png"):format(i))
    U.wait(2)
  end
  local list = {}
  for k in pairs(seen) do list[#list + 1] = k end
  table.sort(list)
  U.log("states the player's side passed through: " .. table.concat(list, ", "))
  U.log("startGrowIn calls: " .. #marks)
  U.log("done")
end
