Skip to content

Instantly share code, notes, and snippets.

@toasterparty
Last active September 26, 2022 21:49
Show Gist options
  • Save toasterparty/cf5fa8eedfd6ac30aad515d041ecdcf6 to your computer and use it in GitHub Desktop.
Save toasterparty/cf5fa8eedfd6ac30aad515d041ecdcf6 to your computer and use it in GitHub Desktop.

Overcooked! 2: Archipelago Testing Methodology

1. Unit Tests

Unit tests have been added to ensure that Overcooked! 2 data is maintained properly. Unit tests will fail if data structures are detrimentally modified in a way otherwise invisible to a game-agnostic test suite.

Command:

python -m pytest test/overcooked2

Result:

6 passed in 0.50s

2. Bulk Generation Testing

In order to test both edge cases and generation stability, games were bulk generated in various configurations. Bulk generation done by using a dirty version of Generate.py which multithreads 1,000 instances of generation instances (seeds 0-999) and counts the number of exceptions thrown at the end.

Tests were ran on an i9-11950H @ stock.

Generate.py Code Snippet
import threading, time

start = time.time()

games_to_gen = 1000
max_threads = 25

exceptions = list()
threads = list()
genned = 0

def thread(seed):
    global successes
    try:
        main(my_seed=seed)
        successes += 1
    except Exception as e:
        exceptions.append(str(e))

while genned < games_to_gen:
    if len(threads) >= max_threads:
        for t in threads:
            if not t.is_alive():
                threads.remove(t)

        time.sleep(0.5)
        continue

    t = threading.Thread(target=thread, args=(genned,))
    t.start()
    threads.append(t)
    genned += 1

for t in threads:
    t.join()

print(f"{successes} out of {genned} ({int((successes*100)/games_to_gen)}%) ({int(time.time()-start)} seconds) passed:\n\texceptions:\n{exceptions}")

2.1 Solo Game Using Default Options

Results

996 out of 1000 (99%) (376 seconds) passed
exceptions
['No more spots to place [Calmer Unbread (Player 1)], locations [Kevin-2 Completed, 4-4 Completed, 6-4 Completed, 3-4 Completed, 3-2 Completed, 3-3 Completed, 3-6 Completed, 5-6 Completed, Kevin-1 Completed, 6-1 Completed, Kevin-7 Completed, 6-3 Completed, 1-5 Completed, 2-4 Completed, 3-1 Completed, 5-3 Completed, Kevin-5 Completed, 1-6 Completed, Kevin-8 Completed, 6-2 Completed, 2-2 Completed] are invalid. Already placed 22: 2-3 Completed, 5-4 Completed, 3-5 Completed, 4-5 Completed, 5-5 Completed, Kevin-4 Completed, 1-1 Completed, 1-4 Completed, 4-6 Completed, 5-1 Completed, 2-5 Completed, 4-2 Completed, 1-3 Completed, 4-3 Completed, 4-1 Completed, 2-6 Completed, 2-1 Completed, 1-2 Completed, 5-2 Completed, 6-5 Completed, Kevin-3 Completed, Kevin-6 Completed', 'No more spots to place [Larger Tip Jar (Player 1), Faster Condiment/Drink Switch (Player 1)], locations [5-6 Completed, 6-3 Completed, 6-5 Completed, 2-3 Completed, 1-1 Completed, 2-5 Completed, Kevin-6 Completed, 1-4 Completed, 4-5 Completed, 2-4 Completed, 3-3 Completed, Kevin-5 Completed, 6-1 Completed, 1-5 Completed, 1-2 Completed, 1-6 Completed, 4-4 Completed, Kevin-4 Completed, 1-3 Completed, 6-2 Completed, 3-5 Completed, 3-1 Completed, 2-6 Completed] are invalid. Already placed 20: Kevin-3 Completed, 2-2 Completed, 5-5 Completed, Kevin-1 Completed, Kevin-8 Completed, Kevin-7 Completed, 3-6, Completed, 4-3 Completed, 5-4 Completed, 3-4 Completed, 5-3 Completed, 5-2 Completed, 4-6 Completed, 4-2 Completed, 3-2 Completed, 2-1 Completed, 6-4 Completed, Kevin-2 Completed, 4-1 Completed, 5-1 Completed', 'No more spots to place [Fire Extinguisher (Player 1)], locations [Kevin-1 Completed, 6-1 Completed, 2-3 Completed, 2-5 Completed, 3-6 Completed, 4-6 Completed, 2-2 Completed, 4-5 Completed, 3-5 Completed, 6-5 Completed, 5-5 Completed, 5-3 Completed, 3-1 Completed, 6-4 Completed, 2-4 Completed, 1-6 Completed, 3-2 Completed, 3-3 Completed, 2-6 Completed, 6-2 Completed, 5-6 Completed, Kevin-8 Completed] are invalid. Already placed 21: Kevin-5 Completed, 1-5 Completed, Kevin-2, Completed, Kevin-6 Completed, 4-4 Completed, Kevin-4 Completed, 4-1 Completed, 5-1 Completed, 5-4 Completed, 4-2 Completed, 1-2 Completed, 1-4 Completed, Kevin-3 Completed, 4-3 Completed, 6-3 Completed, 2-1 Completed, 5-2 Completed, 1-1 Completed, Kevin-7 Completed, 3-4 Completed, 1-3 Completed', 'No more spots to place [Kevin-2 (Player 1), Progressive Dash (Player 1)], locations [2-3 Completed, 4-6 Completed, 3-1 Completed, 1-5 Completed, 3-6 Completed, 4-4 Completed, 6-5 Completed, 3-3 Completed, 1-4 Completed, 6-3 Completed, 5-6 Completed, 2-4 Completed, 5-5 Completed, 6-2 Completed, 3-5 Completed, 2-5 Completed, 3-4 Completed, Kevin-8 Completed, 5-4 Completed, Kevin-6 Completed, 4-2 Completed, 4-5 Completed] are invalid. Already placed 21: 3-2 Completed, 1-1 Completed, 1-3 Completed, 5-3 Completed, 1-6 Completed, Kevin-5 Completed, Kevin-7 Completed, 1-2 Completed, Kevin-1 Completed, Kevin-3 Completed 6-4 Completed, Kevin-4 Completed, 5-2 Completed, Kevin-2 Completed, 2-6 Completed, 4-3 Completed, 2-2 Completed, 6-1 Completed, 5-1 Completed, 4-1 Completed, 2-1 Completed']
yaml
Overcooked! 2:
  progression_balancing: 50
  accessibility: items
game: Overcooked! 2
name: test

2.2 Solo Game Using Random Options

Results

997 out of 1000 (99%) (386 seconds) passed
exceptions
['No more spots to place [Progressive Dash (Player 1)], locations [2-5 Completed, 6-5 Completed, Kevin-1 Completed, 1-3 Completed, 1-4 Completed, 5-5 Completed, 1-5 Completed, Kevin-8 Completed, Kevin-4 Completed, 3-2 Completed, Kevin-7 Completed, 3-4 Completed, 4-6 Completed, 5-3 Completed, 4-4 Completed, 5-6 Completed, 4-5 Completed, 5-4 Completed, Kevin-5 Completed, 6-4 Completed, 3-3 Completed] are invalid. Already placed 22: 2-3 Completed, 1-2 Complete spots to place [Kevin-2 (Player 1), Progressive Dash (Player 1)], locations [2-3 Completed, 4-6 Completed, 3-1 Completed, 1-5 Completed, 3-6 Completed, 4-4 Completed, 6-5 Completed, 3-3 Completed, 1-4 Completed, 6-3 Completed, 5-6 Completed, 2-4 Completed, 5-5 Completed, 6-2 Completed, 3-5 Completed, 2-5 Completed, 3-4 Completed, Kevin-8 Completed, 5-4 Completed, Kevin-6 Completed, 4-2 Completed, 4-5 Completed] are invalid. Already placed 21: 3-2 Completed, 1-1 Completed, 1-3 Completed, 5-3 Completed, 1-6 Completed, Kevin-5 Completed, Kevin-7 Completed, 1-2 Completed, Kevin-1 Completed, Kevin-3 Completed, 6-4 Completed, Kevin-4 Completed, 5-2 Completed, Kevin-2 Completed, 2-6 Completed, 4-3 Completed, 2-2 Completed, 6-1 Completed, 5-1 Completed, 4-1 Completed, 2-1 Completed']
yaml
# Random settings weighted by how frequently users are expected to use
name: test
game:
  Overcooked! 2: 1
requires:
Overcooked! 2:
  progression_balancing:
    random: 1
    random-low: 0
    random-high: 0
    disabled: 0
    normal: 1
    extreme: 0
  accessibility:
    locations: 1
    items: 10
    minimal: 1
  shuffle_level_order:
    false: 1
    true: 15
  include_horde_levels:
    false: 1
    true: 5
  prep_levels:
    original: 1
    excluded: 10
    all_you_can_eat: 3
  fix_bugs:
    false: 1
    true: 10
  shorter_level_duration:
    false: 1
    true: 10
  always_preserve_cooking_progress:
    false: 1
    true: 10
  always_serve_oldest_order:
    false: 1
    true: 10
  display_leaderboard_scores:
    false: 1
    true: 10
  stars_to_win:
    random: 1
    random-low: 0
    random-high: 0
    66: 5
  star_threshold_scale:
    1: 0
    100: 0
    random: 1
    random-low: 10
    random-high: 0
    45: 50

2.3 Overcooked and Overcooked Multiworld

Results

997 out of 1000 (99%) (1286 seconds) passed
exceptions
['Not all progression items reachable ({Kevin-8 Completed (test), Kevin-8 (3-Star) (test), Kevin-4 (2-Star) (test2), Kevin-8 (2-Star) (test), Kevin-4 Level Completed (test2), Kevin-4 (1-Star) (test2), Kevin-4 Completed (test2), Kevin-8 Level Completed (test), Kevin-8 (1-Star) (test), Kevin-4 (3-Star) (test2)}). Something went terribly wrong here.', 'Not all progression items reachable ({3-4 Level Completed (test), 3-6 (3-Star) (test), 4-4 Completed (test), 5-6 (3-Star) (test2), 4-6 Completed (test), 1-3 (3-Star) (test), 6-3 (3-Star) (test), 4-3 (3-Star) (test), Kevin-1 (3-Star) (test2), 6-5 (3-Star) (test), 5-5 (3-Star) (test), 5-6 Level Completed (test2), 5-4 (3-Star) (test), Kevin-8 (3-Star) (test), Kevin-1 Level Completed (test2), 3-6 Level Completed (test), 3-5 Level Completed (test), 3-4 Completed (test), 4-4 (2-Star) (test), Kevin-4 (2-Star) (test2), 3-4 (2-Star) (test), 3-4 (3-Star) (test), 6-2 (3-Star) (test), Kevin-8 (2-Star) (test), 5-5 (2-Star) (test2), 5-1 (3-Star) (test), 4-4 (1-Star) (test), 5-5 (1-Star) (test2), 5-6 (1-Star) (test2), 3-3 (3-Star) (test), Kevin-2 (3-Star) (test), 4-4 (3-Star) (test), 4-4 Level Completed (test), 3-6 Completed (test), Kevin-1 (3-Star) (test), 3-5 (1-Star) (test), 6-6 (3-Star) (test), 2-5 (3-Star) (test), 3-6 (2-Star) (test), 1-1 (3-Star) (test), Kevin-4 (3-Star) (test), Kevin-4 Level Completed (test2), 2-1 (3-Star) (test), 3-4 (1-Star) (test), 4-2 (3-Star) (test), 2-2 (3-Star) (test), 5-6 (2-Star) (test2), 4-1 (3-Star) (test), 3-5 (3-Star) (test), 5-6 (3-Star) (test), 2-3 (3-Star) (test), Kevin-3 (3-Star) (test), 4-5 (1-Star) (test), 4-6 (3-Star) (test), 3-6 (1-Star) (test), 3-1 (3-Star) (test), 4-5 (2-Star) (test), 5-2 (3-Star) (test), 2-6 (3-Star) (test), Kevin-6 (3-Star) (test), Kevin-1 (1-Star) (test2), 3-5 Completed (test), 4-5 Level Completed (test), Kevin-5 (3-Star) (test), 5-5 Level Completed (test2), Kevin-4 (1-Star) (test2), 5-5 (3-Star) (test2), 1-6 (3-Star) (test), Kevin-1 (2-Star) (test2), 6-4 (3-Star) (test), 4-5 (3-Star) (test), 1-5 (3-Star) (test), 4-6 (1-Star) (test), 3-5 (2-Star) (test), 5-3 (3-Star) (test), 4-6 (2-Star) (test), Kevin-7 (3-Star) (test), 4-6 Level Completed (test), 3-2 (3-Star) (test), Kevin-8 Level Completed (test), 1-4 (3-Star) (test), Kevin-8 (1-Star) (test), Kevin-4 (3-Star) (test2), 2-4 (3-Star) (test)}). Something went terribly wrong here.', 'Not all progression items reachable ({1-6 Level Completed (test2), Kevin-3 (3-Star) (test2), 1-3 (2-Star) (test2), 3-6 (1-Star) (test2), 1-3 Level Completed (test2), Kevin-1 (3-Star) (test2), 3-6 (2-Star) (test2), Kevin-1 Level Completed (test2), Kevin-3 (1-Star) (test2), 3-4 (1-Star) (test2), 1-5 (3-Star) (test2), 1-4 Level Completed (test2), 5-1 (3-Star) (test), 3-4 Level Completed (test2), 3-6 (3-Star) (test2), 1-5 (1-Star) (test2), 1-3 (3-Star) (test2), Kevin-3 (2-Star) (test2), 1-3 Completed (test2), 1-4 Completed (test2), 1-4 (3-Star) (test2), 3-4 Completed (test2), 3-6 Level Completed (test2), 3-4 (2-Star) (test2), 3-4 (3-Star) (test2), Kevin-1 (1-Star) (test2), 1-5 Level Completed (test2), 1-4 (2-Star) (test2), Kevin-3 Level Completed (test2), 1-6 Completed (test2), 5-1 (2-Star) (test), 1-3 (1-Star) (test2), Kevin-1 (2-Star) (test2), 3-5 Level Completed (test2), 1-5 (2-Star) (test2), Kevin-1 Completed (test2), 1-4 (1-Star) (test2)}). Something went terribly wrong here.']

yaml: Two instances of the yaml from 1.2

2.4 Overcooked and Timespinner MultiWorld

Results

999 out of 1000 (99%) (531 seconds) passed
exceptions
['Not all progression items reachable ({5-4 (2-Star) (test), 5-4 (3-Star) (test), 3-4 (2-Star) (test), 3-4 (3-Star) (test), 5-4 (1-Star) (test), 5-6 (3-Star) (test), 3-6 Level Completed (test), 5-6 (1-Star) (test), 3-6 (2-Star) (test), 5-5 (2-Star) (test), Kevin-3 (1-Star) (test), 3-4 Completed (test), 3-4 Level Completed (test), 3-6 Completed (test), 5-5 (3-Star) (test), 5-4 Level Completed (test), 3-6 (1-Star) (test), 3-6 (3-Star) (test), Kevin-3 Level Completed (test), 5-6 (2-Star) (test), 3-4 (1-Star) (test), 3-5 Level Completed (test), 5-5 (1-Star) (test), Kevin-3 (3-Star) (test), Kevin-3 (2-Star) (test), 5-4 Completed (test), 5-5 Level Completed (test), 5-6 Level Completed (test)}). Something went terribly wrong here.']
yaml

yaml from 1.2 plus this timspinner yaml:

# TS1.yaml
name: TS1
game: Timespinner
description: mostly random, non-inverted, non-minimal
Timespinner:
  progression_balancing: 0
  accessibility:
    items: 1
    locations: 1
    minimal: 0
  StartWithJewelryBox: random
  DownloadableItems: random
  EyeSpy: random
  StartWithMeyef: random
  QuickSeed: random
  SpecificKeycards: random
  Inverted: 'false'
  GyreArchives: random
  Cantoran: random
  LoreChecks: random
  BossRando: random
  BossScaling: random
  DamageRando: random
  HpCap: 999
  BossHealing: random
  ShopFill: random
  ShopWarpShards: random
  ShopMultiplier: 1
  LootPool: random
  DropRateCategory: random
  FixedDropRate: 5
  LootTierDistro: random
  ShowBestiary: random
  ShowDrops: random
  DeathLink: random

3. Solo Seed Testing

"Solo seed" meaning a single AP slot; "Local/Online Co-Op" meaning multiple chefs played in that slot

  • Played 3 non-co-op solo seeds
  • Played 1 local co-op solo seeds
  • Played 2 online co-op solo seeds with:
    • hotswapping player counts (1, 2, 3 and 4 players)
    • 1-4 game instances in the slot where each game took turns hosting it
    • Different combination of local co-op and online co-op at the same time

4. MultiWorld Testing

  • Played a full SM + non-co-op OC2 Multi
  • Played a full SC2 + non-co-op OC2 Multi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment