- Confirm Pokeheim logo on main menu
- Confirm custom menu music
- Enter world with new character
- Confirm that Pokeheim tips are shown on loading screen
- Check that custom Pokeheim intro plays
- After intro, check that no Valkyrie animation plays
- Character should have a torch and rag clothing
- Confirm that Professor Raven has appropriate name, hover text, and alert messages
- Confirm that Professor Raven appears with tutorials on welcome, catching, and crafting
- Confirm that the welcome message contains the correct number of bosses
- Install CustomWigs mod
- Enter world with new character
- Check that wardrobe exists at starting location
- Check wardrobe height
- Check that wardrobe faces the center of the circle
- Go to wardrobe
- Check hover message says "Wardrobe" and "Open"
- Press "E" to open
- Check that player faces camera
- Check that outfit dialog has correct defaults (current clothing)
- Check that CustomWigs items appear in helmets list
- Check that "CAPE TEST" doesn't appear in the capes list
- Check that DLC doesn't appear in the list (helmets, capes) in a release build
- Change each piece to something non-empty
- Check that changes take effect immediately
- Check that no "new item" popup occurs for these changes
- Click "x" to close dialog
- Check that old clothing was removed from inventory
- Press "E" to open again
- Check that the dialog defaults to current clothing still
- Press escape to close the dialog
- Check that game menu does not show
- Press F5 to open console
- Type "dressup"
- Check that wardrobe dialog appears
- Press F5 to close console
- Press escape to close dialog
- Press F5 to open console
- Type "devcommands" to enable dev commands if not enabled
- Type "tod 0" to force night time
- Type "dressup"
- Check that player now wields a torch for visibility
- Press escape to close dialog
- Press "TAB" to open inventory
- Check that style icon appears next to inventory grid
- Check style icon mouseover text
- Click style icon
- Check that wardrobe dialog appears
- Press escape to close dialog
- Have at least 2 greylings, The Elder, plus several pokeballs
- Release a greyling
- Check mouseover text, should show you as the owner, can pet
- Log out & back in
- Check the greyling is still owned by you, can still pet
- Recall greyling
- Release greyling
- Check the greyling is still owned by you, can still pet
- Equip a torch
- Check that the greyling is not afraid of fire
- Recall greyling
- Check stats in ball description
- Spawn "pickaxeiron"
- Dig a small pit (2-3m deep, 2m x 4m wide) to force monsters together
- Spawn a greydwarf in the pit and faint it
- Release a greyling in the pit, rename it to "Fainted"
- Spawn another greydwarf in the pit and wait for it to faint the greyling
- Run debug command "freeze Greydwarf" (case sensitive)
- Release a greyling in the pit and rename it "Awake"
- Run debug command "freeze Greyling" (case sensitive)
- Confirm that ball catches wild fainted greydwarf first ("Gotcha!")
- Confirm that ball catches tame fainted greyling next ("Fainted, return!")
- Confirm that ball catches wild awake greyling next ("Gotcha!")
- Confirm that ball catches tame awake greyling next ("Awake, return!")
- Open settings
- Confirm that "Recall Monsters" appears in key settings (default "R")
- Recall anything that might be out
- Release The Elder
- Check how many "root" balls you have
- Spawn Eikthyr
- Wait for The Elder to spawn roots
- Recall The Elder
- Check that the screen didn't say "root, return!"
- Check that the roots disappear without being captured/recalled
- Log out and log back in
- Check that all ball items were correctly generated and placed in inventory
- Have at least one greyling, one deer, and four trolls captured
- Release greyling
- Run away
- Check that greyling follows you
- Log out & back in
- Run away
- Check that greyling follows you
- Spawn wild greyling
- Check that they fight each other
- Get rid of wild greyling
- Release captured greyling
- Spawn Eikthyr
- Freeze Eikthyr to ensure it doesn't kill the greyling too quickly
- Check that greyling fights Eikthyr (no monster natively fights a boss)
- Unfreeze Eikthyr
- Check that Eikthyr fights greyling
- Remove Eikthyr
- Release deer
- Check that deer follows you
- Run debug command "nospawns"
- Run debug command "catchemall"
- Release troll x4
- Check that the trolls don't crowd you so closely that they push you around
- Spawn Eikthyr
- Run far away quickly
- Check that trolls stay behind to fight, don't follow until Eikthyr fainted
- Have at least two greylings
- Check greyling stats in ball description, should show "Name: (none)"
- Release greyling
- Check mouseover text, should allow petting and renaming
- Rename greyling to "Foo"
- Recall greyling
- Check that the ball is separate name shows "Foo"
- Check stats in ball description, should show "Name: Foo"
- Release Foo
- Check mouseover text, should show "Foo"
- Pet Foo, message should be "Foo loves you"
- Log out & back in
- Check mouseover text, should show "Foo"
- Rename to something long, confirm that 20 characters are allowed
- Rename to "greyling" (all lowercase)
- Check mouseover text, should show "Greyling" (capital)
- Recall greyling
- Check that the ball stacked with the other greylings
- Change language to German
- Quit & restart
- Release greyling
- Check mouseover text, should show "Gräuling"
- Rename greyling to "Foo"
- Change language to English
- Quit & restart
- Check mouseover text, should show "Foo"
- Rename to ""
- Check mouseover text, should show "Greyling"
- Release boar and rename to "Francis Bacon"
- Release Moder and rename to "Freddie Mercury"
- Run debug command "faintall"
- Catch Francis and Freddie
- Confirm that their names are still correct
- Release Francis and Freddie
- Run debug command "faintall"
- Log out and back in
- Catch Francis and Freddie
- Confirm that their names are still correct
- Have at least 3 captured greylings, one tougher thing like a greydwarf brute
- Release greyling
- Check that PVP is off
- Hit greyling with torch, should not hit
- Punch greyling, should still hit because fists are special
- Punch greyling to death, should actually die
- Wait for cooldown, enable PVP
- Release greyling
- Hit greyling with torch, should hit this time
- Release another two greylings
- Log out
- Change players and log back in
- Check that PVP is off
- Check that new player can pet/rename greyling
- Run away
- Check that greyling does not follow, even with PVP off
- Enable PVP
- Check that greyling attacks
- Disable PVP
- Check that greyling stops attacking
- Enable PVP
- Release own greyling
- Check that greylings attack each other
- Disable PVP
- Check that greylings stop attacking each other
- Catch all greylings
- Release greydwarf brute
- Switch players
- Enable PVP
- Try to catch the brute, should not be trivial
- Check that capture message was "Gotcha!" and not "return!"
- Release more things
- Switch players
- Release one greyling
- Disable PVP
- Recall all, check that only your own things were recalled, with the message "Greyling, return!" and not "Everyone, return!"
- Try to catch the other player's remaining things, should work right away with PVP off
- Check that capture message was "Gotcha!" and not "return!"
- Spawn greyling
- Spawn weapon ("club" or "SwordIronFire")
- Hit greyling with weapon until it faints
- Check that it doesn't die
- Check that its mouseover text is gone
- Wait and check that the ragdoll doesn't explode
- Check that the ragdoll can be pushed around
- Catch it (should always work)
- Spawn greyling
- Type "killall" in dev console
- Confirm that greyling dies
- Release greyling
- Enable PVP and attack it until it faints (or use "faintall" debug command)
- Recall all, check that your fainted greyling does not come back
- Spawn deathsquito and faint it
- Check that it falls from the sky and lands upside down
- Spawn skeleton and faint it
- Check that it stops making noise
- Check that the mouseover HUD doesn't show up
- Log out & back in
- Confirm that skeleton is still on its back and not upside-down
- Check that the mouseover HUD still doesn't show up
- Spawn blob, wraith, and bonemass and faint them
- Check that they stop fuming
- Spawn serpent and faint it
- Check that its tail stops moving
- Spawn "dragon" (Moder) and faint it
- Check that it falls from the sky (no ragdoll)
- Log out and back in
- Check that the dragon is still affected by gravity, even when pushed
- Spawn "hatchling" (Drake) and faint it
- Check that it falls from the sky (ragdoll)
- Spawn "gd_king" (The Elder)
- Wait for The Elder to spawn roots
- Wait for the roots to faint (timed destruction)
- Capture roots
- Capture The Elder
- Release roots
- Check that the roots don't faint (timed destruction)
- Recall roots
- Release The Elder
- Spawn Eikthyr (wild)
- Wait for The Elder to spawn roots
- Check that the roots don't faint (timed destruction)
- Spawn BonePileSpawner
- Faint skeletons as they spawn
- Check that the spawner keeps spawning instead of stopping at 2 skeletons
- Spawn pokeballs, confirm coloring
- Spawn greatballs, confirm coloring
- Spawn ultraballs, confirm coloring
- Throw each, confirm coloring and that projectiles rotate
- Confirm that there's no ooze effect from the ooze bomb they are based on
- Confirm the "hit" sound plays on impact
- Confirm consistent accuracy
- Spawn greyling and faint it
- Confirm that a direct hit is not needed to capture (2m radius OK)
- Spawn troll
- Try to catch troll with pokeball, greatball, and ultraball
- Read catch rate in debug logs, confirm that ball type has an effect
- Kill or capture troll because it will be a pain in the ass now
- Fly so deer won't see/hear you
- Spawn a deer
- Fly far enough away to be out of its sensory range
- Throw a rock nearby the deer
- Check that the deer is startled
- Fly so deer won't see/hear you
- Spawn deer
- Spawn "raspberry"
- Check that the deer is alerted, goes for the berry, and eats it, then relaxes (within 10s interval)
- Remove deer
- Stop flying
- Spawn and pick up "raspberry", "blueberries", and "cloudberry"
- Spawn greyling, wait for it to attack
- Throw raspberry
- Check that the greyling goes for the berry and eats it (within 10s interval)
- Repeat with "blueberries" and "cloudberry"
- Remove greyling
- Spawn boar
- Tame boar with debug command "tame"
- Spawn "carrot"
- Check that the boar does not eat the carrot
- Spawn "raspberry"
- Check that the boar does eat the raspberry
- Remove boar
- Spawn 50 "raspberry" and pick them up
- Spawn greyling
- Throw full stack of 50 "raspberry"
- Check that greyling continues to return to the berry pile every ~10s
- Use debug command "tutorialreset"
- Spawn:
- "stone" x50
- "wood" x50
- "LeatherScraps" x50
- "TrophyDeer"
- "raspberry"
- "blueberries"
- "mushroomyellow"
- Craft:
- pokeball
- greatball
- ultraball
- wood arrows
- stone axe
- club
- hammer
- hoe
- pickaxe
- torch
- bow
- saddle
- Verify that you see tutorials for:
- food
- pokeballs
- hammer
- pickaxe
- Verify that you can build camp fire with hammer
- Verify that you can raise and level ground with hoe
- Find a pine tree
- Knock down pine tree
- Verify that only regular wood spawns
- Spawn, catch, release, and kill greydwarf
- Verify that only wood and stone spawn
- Spawn, catch, release, and kill boar
- Verify that only leather spawns
- Enter game at starting location
- Confirm that the chains on boss stones are not interactable
- Remove any boss locations from map
- Remove any captured bosses from inventory
- Run debug command "removedrops"
- Loop over all Vegvisir:
- Read Vegvisir
- Check that next boss is on the map
- Use debug command "findboss NAME_OR_INDEX" (0-based)
- Check that other locations for this boss are all farther from the start
- Go to next boss (any location, left-ctrl+middle-click on map to teleport)
- Confirm no runestone or item stands
- Confirm altar hovertext says "start encounter"
- Start raid at altar
- Confirm "go!" message shown
- Type "catchemall" in dev console
- Try to start raid again
- Confirm that raid does not start (already caught)
- Loop if Vegvisir present (all but last boss)
- Use debug command "resettutorial boss_trophy"
- Release Eikthyr
- Confirm that Eikthyr does not attack
- Punch Eikthyr to death
- Grab boss trophy
- Verify that Prof. Raven tutorial shows up to shame you for it
- Spawn Eikthyr
- Freeze Eikthyr
- Spawn "SwordBlackmetal"
- Verify that sword does no damage to Eikthyr
- Use debug command "resettutorial inventory_screen"
- Open inventory
- Check that it's twice as large as usual (8x8)
- Check that Professor Raven comes to tell you about sorting and style
- Spawn
TreasureChest_meadows
- Open the chest
- Check that the chest inventory GUI is positioned below the player inventory
- Check that the sort button appears next to inventory grid
- Check that the mouseover text says "sort"
- Click sort and verify that it reorders your things, except the first row:
- Uninhabited balls, getting stronger
- Inhabited balls, going up in Pokedex order
- Non-equippable items
- Equippable, unequipped
- Equippable, equipped
- Confirm base HP of 50
- Spawn 500 rocks (10 stacks), confirm you can carry up to 1000 weight
- Throw away rocks
- Spawn troll
- Get hit by troll
- Confirm that no damage was taken
- Spawn "SwordBlackmetal"
- Hit troll with blackmetal sword
- Verify that very little damage is done
- Remove all armor
- Fly to the mountains
- Confirm that the player is not freezing
- Fly to the swamps
- Run "findlocation SunkenCrypt4"
- Confirm that the player does not need a key to enter
- Fly into the sky
- Stop flying and fall to your death
- Confirm that no tombstone is created
- Check that all items are kept in inventory when respawning
- Run and confirm that you don't get tired
- Swim and confirm that you do get tired swimming
- Drown and confirm death
- Run debug command "resetpokedex"
- Run debug command "resettutorial caught"
- Spawn neck
- Catch neck
- Confirm that Professor Raven appears with first catch tutorial
- Open inventory
- Check that Pokedex icon appears
- Check that hovertext for Pokedex says "Pokédex"
- Check that Pokedex completion and Trainer skill updated and are matched
- Spawn 50 pokeballs
- Spawn Eikthyr
- Throw tons of pokeballs at Eikthyr
- Confirm that Trainer skill does not increase
- Open Pokedex
- Confirm that only neck is filled in
- Confirm that neck stats are shown
- Confirm that other entries are silhouetted
- Go to shoreline
- Search up shore for accessible, non-deep-sea Serpent (random - you may need to find a spot to sit for an hour to be sure one will spawn)
- Spawn "SaddleUniversal"
- Spawn Lox
- Freeze Lox
- Check that you can't saddle the Lox
- Catch Lox
- Release Lox
- Check that you can saddle and ride Lox
- Test various monsters
- For each of these:
- boar
- wolf
- greyling
- greydwarf
- fuling shaman (GoblinShaman)
- greydwarf brute (Greydwarf_Elite)
- drake (Hatchling)
- Moder (Dragon)
- deathsquito
- bat
- wraith
- Spawn, catch, release, saddle
- Spawn wild greyling
- Verify that saddled monster does not react
- Ride
- Run
- Primary attack (if supported)
- Secondary attack (if supported)
- Back stops
- Block stops and changes direction
- Check that we can zoom way out
- Check that the camera is relatively stable
- Check that the riding HUD shows the correct monster icon and name
- If flying monster:
- Test flying up (jump) and down (crouch)
- If Moder:
- Test landing (crouch near ground) and taking off (jump while walking)
- For each of these:
- Mount a deathsquito
- Fly up a bit
- Run debug command "faintall"
- Verify that you are not trapped on the monster
- Verify that the saddle came off
- Catch the deathsquito
- Verify no additional saddle dropped
- Test saddle targeting:
- For each of these tall monsters:
- troll
- The Elder (GD_King)
- Moder (Dragon)
- Saddle the monster
- Verify that the saddle can be reached
- Fly up (if applicable)
- Dismount
- Verify that you don't die on impact on the ground
- Mount again
- Fly up again (if applicable)
- Call "return"
- Verify that you don't die on impact
- For each of these tall monsters:
- Release two greydwarves
- Saddle one greydwarf
- Log out
- Log back in with another character
- Spawn SaddleUniversal
- Enable PVP
- Check that you can't mount the saddled greydwarf
- Check that you can't saddle the unsaddled greydwarf
- Disable PVP
- Check that you can mount the saddled greydwarf
- Check that you can saddle the unsaddled greydwarf
- Use debug command "resettutorial swimming"
- Saddle something
- Jump in the water (yourself)
- Check that no swimming tutorial is given
- Get back to land
- Use debug command "resettutorial swimming"
- Jump in the water again
- Check that a swimming tutorial is given
- Run "findlocation Vendor_BlackForest" if Giovanni location unknown
- Go to Giovanni (left-ctrl + middle-click on map to teleport)
- Verify that his name says "Giovanni"
- Verify that his Lox is named "Persian"
- Verify that Giovanni's speech has been overridden
- Verify that Giovanni cannot be interacted with, no interact hovertext
- Verify that Persian is covered in "shadow smoke"
- Spawn
TreasureChest_meadows
- Open the chest, verify that only useful stuff appears in it
- At the locations below, left-ctrl + middle-click on map to teleport
- Run "findlocation WoodHouse1" or "findlocation WoodHouse2"
- Go there
- Run "catchemall" because crypt monsters are annoying during testing
- Find a chest in the house/crypt
- Verify that only useful stuff appears in it
- Repeat for one of "findlocation Crypt2", "findlocation Crypt3", or "findlocation Crypt4"
- Repeat for "findlocation SunkenCrypt4"
- Repeat for "findlocation MountainCave02"
- Repeat for "findlocation GoblinCamp2"
- Throw away all greydwarf balls
- Run "removedrops"
- Run "spawn greydwarf 1 1"
- Run "catchemall"
- Check that the greydwarf is not marked as shiny in inventory (icon, description)
- Run "spawn greydwarf 1 2"
- Run "catchemall"
- Check that the greydwarf is marked as shiny in inventory (icon, description)
- Release shiny greydwarf
- Confirm that coloring is correct
- Confirm that HUD shows shiny icon instead of Valheim yellow star icons
- Spawn Eikthyr
- Confirm that the boss is not marked "shiny"
- Ensure music volume is on
- Use debug command "skiptime" to fast-forward to night
- Use debug command "sleep" to fast-forward to morning
- Confirm that custom "dawn" music plays
- Go to starting location
- Throw away all boss balls
- Run debug command "removedrops"
- Run debug command "resetpokedex"
- Run debug command "resettutorial caught_boss"
- Run debug command "resettutorial caught_all_bosses"
- Spawn Eikthyr
- Run debug command "catchemall"
- Check that the "caught a boss" tutorial runs
- Spawn GD_King, Bonemass, Dragon, and GoblinKing
- Run debug command "catchemall"
- Check that the "caught all bosses" tutorial runs
- Run debug command "spawnall"
- Run debug command "catchemall"
- Check that the Pokedex is complete
- Check that Odin is not at the starting location
- Check that the "caught em all" tutorial runs
- Check that Odin spawns after you talk to Professor Raven
- Check that Odin rotates to face you no matter where you go
- Talk to Odin
- Dismiss his message
- Verify that you die
- Verify that outro and credits roll
- Watch full credits, check formatting
- Verify that Odin is gone when you respawn
- Run debug command "tutorial caught_em_all"
- Talk to Raven
- Verify that Odin reappears
- Log out
- Click credits in menu
- Verify that Pokeheim credits run first
- Watch Pokeheim part of credits, check formatting
- Log back in
- Verify that Odin is still there
- Verify that Odin still follows you
- Talk to Odin, don't dismiss text
- Run away
- Verify that you die
- During outro, hit escape
- Outro should not be dismissed
- Let credits begin, then hit escape again
- The credits should be dismissed
- The player should respawn right away and not after the time credits would take
- Choose poorly-translated language, quit, and restart game
- Ensure that untranslated "loading" tips fallback to English
- Run debug command "tutorial temple1"
- Ensure that tutorial falls back to English
- Ensure that universally-translated text like Pokeball names, Pokedex name, style dialog heading show in the target language
- TODO: Multiplayer testing script