Back to Page
Revision 10 (current)
Edited by Sand on 9/29/2024 7:14 PM
!!! Movement
There are two important things to know about movement:
# The [https://archive.org/download/retrokit-manuals/gb/gb-compressed.zip/Kwirk%20-%20He%27s%20A-maze-ing%21%20%28en%29.pdf#page=8|bird's-eye view] is faster than the diagonal view, for two reasons: there is less lag between levels, and [Forum/Posts/527990|filling a hole with a block] takes 18 frames in bird's-eye but 26 frames in diagonal.
# Switching players (in Going Up? floors with more than one player) costs 30 frames if you do it once, but 32 frames if you do it again immediately after another switch. Therefore you want to [Forum/Posts/527971|insert at least one non-switch move] between switches when possible.
The game also counts "steps" per floor.
Every movement counts as one "step", except for switching players.
||Move||Frames||Steps||Note||
|Step into empty tile|9|1| |
|Push a block into empty tile|10|1| |
|Push a block into hole|28|1|In bird's-eye view, 10 frames to push + 18 frames to fill the hole. In diagonal view, it's 10+26.|
|Push a turnstile|12|1|Whether moving 1 tile or 2.|
|Switch players|30|0|32 frames if immediately after another switch.|
!!! Floor numbers
The game has 150 floors,
which internally are numbered as follows:
||#||Game mode||
|0–9|Going Up? Easy|
|10–19|Going Up? Average|
|20–29|Going Up? Hard|
|30–59|[#HeadingOut|Heading Out?] Easy|
|60–109|[#HeadingOut|Heading Out?] Average|
|110–149|[#HeadingOut|Heading Out?] Hard|
!!! RNG
The random number generator is only used in the
[#HeadingOut|Heading Out?] game mode.
It is used to generate a random schedule of floors
in the chosen skill level,
and to decide whether to invert each floor.
The RNG is seeded from the current frame count mod 60.
(Roughly—the frame counter variable [/Forum/Posts/529194|doesn't always increment on a vblank].)
There are therefore only 60 possible RNG seeds,
all of which are accessible by waiting for up to 1 second
before starting a Heading Out? run.
(This doesn't mean there are only 60 possible floor schedules
in each Heading Out? skill level,
because the [#HeadingOutFloorSchedules|schedule generation algorithm]
also depends on a history of recently played floors
that carries over between runs.)
The random number generator uses 4 1-byte state variables at
0xcf28, 0xcf29, 0xcf2a, and 0xcf2b.
The RNG state is initialized to 4 copies of the current frame counter mod 60
in the subroutine at 0x31e7.
The frame count comes from the 1-byte variable at 0xc377,
which is a copy of the variable at 0xc2ec,
which gets incremented inside the vblank interrupt at 0x0fdf.
The subroutine that advances the RNG state
and returns a 1-byte random number starts at 0x3254:
%%SRC_EMBED asm
define rng_state_a 0xcf28
define rng_state_b 0xcf29
define rng_state_c 0xcf2a
define rng_state_d 0xcf2b
; Returns a 1-byte random number in the a register.
rng_next:
ld a, [rng_state_d]
rr a
ld [rng_state_d], a
ld a, [rng_state_a]
adc 0x25
ld [rng_state_a], a
ld b, a
ld a, [rng_state_b]
adc 0x33
ld [rng_state_b], a
adc b
ld b, a
ld a, [rng_state_c]
adc 0x53
ld [rng_state_c], a
adc b
ld b, a
ld a, [rng_state_d]
rl a
xor b
ld [rng_state_d], a
ret
%%END_EMBED
This is a Python implementation of {{rng_next}}:
%%SRC_EMBED python
def rng_seed(seed):
a = seed
b = seed
c = seed
d = seed
return (a, b, c, d)
def add_u8_with_carry(x, y, carry):
r = x + y + carry
carry = (r >> 8) & 1
return r & 0xff, carry
# Returns the new (a, b, c, d) RNG state, as well as the RNG output.
def rng_next(a, b, c, d):
carry = d & 1
a, carry = add_u8_with_carry(a, 0x25, carry)
s = a
b, carry = add_u8_with_carry(b, 0x33, carry)
s, carry = add_u8_with_carry(s, b, carry)
c, carry = add_u8_with_carry(c, 0x53, carry)
s, carry = add_u8_with_carry(s, c, carry)
d = ((d & 0xfe) | carry) ^ s
return (a, b, c, d), d
%%END_EMBED
!!! Heading Out?
In the Heading Out? game mode, you play a sequence of up to 99 mini-puzzles
in one of the skill levels Easy, Medium, or Hard.
There are 120 distinct floors in the Heading Out? mode:
30 in Easy, 50 in Average, and 40 in Hard.
!! Heading Out? floor schedules
The schedule of floors for a run
is generated using the [#Rng|RNG],
drawing from the pool of floors in the chosen skill level.
A full schedule of 99 rooms is always generated,
no matter how many the player configured.
The schedule is completely determined at the start of the run.
There is no way to affect the schedule
once a run has started.
To generate the next floor in the schedule,
the algorithm takes the next RNG output
and reduces it modulo the number of available floors in the skill level.
But repeating a floor at an interval smaller than 20 is not allowed.
The algorithm a history of the 20 most recently generated floors.
If a newly generated floor conflicts with the history,
it rolls a new RNG output and tries again,
until it gets a floor that is not a repeat.
The history buffer is initially filled with 0xee,
which is not equal to any real floor number.
The history of recently played floors carries over across runs.
When you finish a run, the last 20 played floors
are copied into the history buffer for the next run.
The history buffer even carries over across skill levels, in a slightly strange way.
The buffer stores, not absolute [#FloorNumbers|floor numbers],
but floor numbers ''relative to the start of the skill level''.
So, for example, if you play a run on Easy and finish on floor 35,
not only will you not see floor 35
in the first 20 floors of a new Easy run,
you also will not see floor 65
in the first 20 floors of a new Average run,
nor floor 115
in the first 20 floors of a new Hard run.
That's because they are all at the same offset relative to the first floor number in the skill level
(30, 60, and 110 respectively).
The floor schedule generation algorithm starts at 0x31e7 in the ROM:
%%SRC_EMBED asm
define game_mode 0xc2b8 ; 0 = Going Up?, 1 = Heading Out?
define heading_out_num_floors 0xc2b9
define heading_out_num_floors_remaining 0xc2ba
define heading_out_floor_schedule 0xc311 ; Array of 99 bytes.
define frame_counter_copy 0xc377
generate_random_floor_schedule:
ld de, heading_out_floor_schedule
ld a, [frame_counter_copy]
ld [rng_state_a], a
ld [rng_state_b], a
ld [rng_state_c], a
ld [rng_state_d], a
ld c, 99 ; Generate a schedule of 99 floors.
loop:
call rng_next ; a = next RNG output.
ld l, a
ld h, 0 ; hl = a extended to 16 bits.
call heading_out_num_floors_for_skill_level ; b = 30 (Easy), 50 (Average), or 40 (Hard).
ld a, b
call remainder_16b ; a = rand % num_floors
add 30
call check_history
cp 0xab ; Is this floor number a duplicate?
jr Z, loop ; Repeat floor, try again.
ld [de], a ; Store the newly generated floor.
inc de ; Next schedule array index.
dec c
jr nZ, loop ; If less than 99, generate the next floor.
ld a, [heading_out_num_floors]
ld b, a
ld a, [game_mode]
cp 1
jr Z, copy_history ; Branch is always taken; this function is only called when game_mode == 1.
ld a, [heading_out_num_floors_remaining]
ld c, a
sub b
jr C, copy_history
ld b, c
copy_history:
; Copy the last 20 floors to be played into the history buffer for the next run.
; memcpy(heading_out_floor_schedule - 20, heading_out_floor_schedule + heading_out_num_floors - 20, 20)
ld a, b ; a = heading_out_num_floors
ld hl, heading_out_floor_schedule - 20
call add_16b ; hl = heading_out_floor_schedule - 20 + heading_out_num_floors
ld b, 20
ld de, heading_out_floor_schedule - 20
copy_history_next:
ldi a, [hl]
ld [de], a
inc de
dec b
jr nZ, copy_history_next
ret
; Checks if the value of register a is present in the 20 array elements before de.
; Sets a to 0xab if a duplicate is found. Otherwise leaves a unchanged.
check_history:
push de
push bc
ld b, 20
ld c, a
dec de
loop:
ld a, [de]
cp c
jr Z, found_dup
dec de
dec b
jr nZ, loop
jr no_dup
found_dup:
ld a, 0xab
jr return
no_dup:
ld a, c
return:
pop bc
pop de
ret
%%END_EMBED asm
!! Heading Out? inverted floors
Each floor in the schedule has a 50% random chance of being vertically inverted.
The inverted version of a floor has essentially the same solution as the regular version
(substitute Up moves for Down and vice versa),
but inversion also changes the paths to the entrance/exit tiles,
which are at fixed positions.
Therefore an inverted floor may be slightly faster or slower
than its non-inverted version, usually by 2 steps.
For example, here are the non-inverted and inverted versions of floor 31.
There's an extra bend in the entrance/exit paths in the inverted version,
requiring 2 additional steps.
31
####################
####################
####################
####################
####################
####################
######........######
######........######
......~.####......1#
######..####..######
######.a......######
######.#......######
####################
####################
####################
####################
####################
####################
31i
####################
####################
####################
####################
####################
####################
######.#......######
######.a......######
....##..####..##..1#
###...~.####.....###
######........######
######........######
####################
####################
####################
####################
####################
####################
The vertical inversion decision happens
in the subroutine at 0x06f2.
%%SRC_EMBED asm
define current_floor 0xc2bf
define vertical_invert 0xc2fa
define num_floors_completed 0xc375
increment_num_floors_completed_and_roll_vertical_invert:
ld a, [num_floors_completed]
inc a
ld [num_floors_completed], a
ld e, a
ld d, 0
ld hl, heading_out_floor_schedule
add hl, de
ld a, [hl]
ld [current_floor], a
xor a
ld [vertical_invert], a
call rng_next
and 1
ld [vertical_invert], a
ret
%%END_EMBED asm
!! Heading Out? solutions
These are optimal solutions for every
Heading Out? floor:
||Skill||#||Invert?||Frames||Steps||Solution||
|Easy|30| |222|24|((((WWWWWWNWSWNWSWSWNWWWWWWW))))|
|Easy|30|i|240|26|((((WWSWWWWNWSWNWSWNWSWWWWNWWW))))|
|Easy|31| |429|44|((((WWWWWNWWWWWWSSWSEEEEESENNNENWWWWWWNWSSWWWWWW))))|
|Easy|31|i|447|46|((((WWSWWWWSWWWWWNNWNEEEEENESSSESWWWWWWSWNNWWWNWWW))))|
|Easy|32| |228|24|((((WWWWWWNWWWSENWWWSWWWWWWW))))|
|Easy|32|i|246|26|((((WWSWWWWNWWWSENWWWSWWWWNWWW))))|
|Easy|33| |252|26|((((WWNWWWWSWWNNWWSNWWSWWWSWWW))))|
|Easy|33|i|270|28|((((WWSSWWWWSWWNNWWSNWWSWWWNNWWW))))|
|Easy|34| |381|41|((((WWWWWWWWWWSEEEEENNWWWWWWNEEEESWWWWWWWWWWW))))|
|Easy|34|i|399|43|((((WWSWWWWWWWWNEEEEESSWWWWWWSEEEENWWWWWWWWNWWW))))|
|Easy|35| |383|42|((((WWSSSWWWWWNNEWNENWNWWWWWSSSEESSWWWWWNNNWWW))))|
|Easy|35|i|365|40|((((WWNNWWWWWSSEWSESWSWWWWWNNNEENNWWWWWSSWWW))))|
|Easy|36| |257|28|((((WWWWWSSSWWWWWWNENNNWSWWWWWWW))))|
|Easy|36|i|275|30|((((WWSWWWNNNWWWWWWSESSSWNWWWWNWWW))))|
|Easy|37| |247|27|((((WWWWWWNNWSENNWWWSSWWWWWWWWW))))|
|Easy|37|i|265|29|((((WWSWWWWSSWNESSWWWNNWWWWWWNWWW))))|
|Easy|38| |330|34|((((WWNNWWWSSSSSWNNENNNWWWWWWWWWWSSWWW))))|
|Easy|38|i|348|36|((((WWSSSWWWNNNNNWSSESSSWWWWWWWWWWNNNWWW))))|
|Easy|39| |288|30|((((WWNNWWWWSSWWSSWNNWWNNWWWWSSWWW))))|
|Easy|39|i|306|32|((((WWSSSWWWWNNWWNNWSSWWSSWWWWNNNWWW))))|
|Easy|40| |273|30|((((WWSWWWWWNNWWEESSSWWNWWWWWWNWWW))))|
|Easy|40|i|255|28|((((WWWWWWWSSWWEENNNWWSWWWWWWWWW))))|
|Easy|41| |369|40|((((WWWWWNNWWWWWSWEENEEEESSSSWWWWWNWWNWWWWWW))))|
|Easy|41|i|387|42|((((WWSWWWSSWWWWWNWESEEEEENNNNWWWWSWWWSWWWNWWW))))|
|Easy|42| |278|30|((((WWWWWNNWWWWWWSENSWNESSWWWWWWWW))))|
|Easy|42|i|296|32|((((WWSWWWNNWWWWWWSENSWNESSWWWWWNWWW))))|
|Easy|43| |406|42|((((WWNNWWWWSESWNWSESWSWWSWNENWSWNNNNWWWWSSWWW))))|
|Easy|43|i|424|44|((((WWSSSWWWWNENWSWNENWNWWNWSESWNWSSSSWWWWNNNWWW))))|
|Easy|44| |363|38|((((WWSSSWWWWWWNESSWWNWWSSEENNNNWWWWWSSWWW))))|
|Easy|44|i|363|38|((((WWNNWWWWWWSENNWWSWWNNEESSSSWWWWWNNNWWW))))|
|Easy|45| |258|28|((((WWWWWWWNSSSWWNENNWSWWWWWWWWW))))|
|Easy|45|i|276|30|((((WWSWWWWSNWNNWWSESSWNWWWWWWNWWW))))|
|Easy|46| |260|28|((((WWWWWWWWENNWSWWESSWNWWWWWWWW))))|
|Easy|46|i|278|30|((((WWSWWWWWWESSWNWWENNWSWWWWWNWWW))))|
|Easy|47| |328|36|((((WWNNWWWWSSSSWWWEENNNWSWWWNNWWWWSSWWW))))|
|Easy|47|i|346|38|((((WWSSSWWWWNNNNWWWEESSSWNWWWSSWWWWNNNWWW))))|
|Easy|48| |459|50|((((WWNWWWWWNWWWWWSEEEEEEWWWWWSSEENEESSSWWWWWWWWNNNWWW))))|
|Easy|48|i|459|50|((((WWSSWWWWWSWWWWWNEEEEEEWWWWWNNEESEENNNWWWWWWWWSSWWW))))|
|Easy|49| |345|37|((((WWWWWWWWEENNWSSESSWNENNNWWWSWSWWWWWWW))))|
|Easy|49|i|363|39|((((WWSWWWWWWEENNNWSSESSWNESSWWWWNNWWWWNWWW))))|
|Easy|50| |296|32|((((WWWWWWWWNNWSESSSSWWNENWWNWWWWWWW))))|
|Easy|50|i|314|34|((((WWSWWWWWWSSWNENNNNWWSESWWSWWWWNWWW))))|
|Easy|51| |324|34|((((WWSSSWWWWWNNNWSENWWWWSSSWWWWNNNWWW))))|
|Easy|51|i|306|32|((((WWNNWWWWWSSSWNESWWWWNNNWWWWSSWWW))))|
|Easy|52| |510|54|((((WWNWWWSWWWWWNEEEEESSWNESSWWWNEEESSWNESSWWWWWWWNWWWSWWW))))|
|Easy|52|i|528|56|((((WWSSWWWNWWWWWSEEEEENNWSENNWWWSEEENNWSENNWWWWWWWSWWWNNWWW))))|
|Easy|53| |324|34|((((WWNNWWWWWWWSEESSWSWNESWWWWWWNNNWWW))))|
|Easy|53|i|324|34|((((WWSSSWWWWWWWNEENNNWWSENWWWWWWSSWWW))))|
|Easy|54| |293|32|((((WWNNWWWSSSWNWNWWWSSWSWSWWWNNNWWW))))|
|Easy|54|i|293|32|((((WWSSSWWWNNNWSWSWWWNNWNWNWWWSSWWW))))|
|Easy|55| |277|30|((((WWSWWWWWWNNWWSENWWSSSWWWWWNWWW))))|
|Easy|55|i|259|28|((((WWWWWWWWSSWWNESWWNNNWWWWWWWW))))|
|Easy|56| |300|30|((((WWWWWWWSWESEENWWWWNSWWWNWWWWWW))))|
|Easy|56|i|318|32|((((WWSWWWWWNWENEESWWWWSNWWWSWWWNWWW))))|
|Easy|57| |272|30|((((WWNNWWWWWWWWSWSSESSWWWWWNNNWWW))))|
|Easy|57|i|272|30|((((WWSSSWWWWWWWWNWNNENNWWWWWSSWWW))))|
|Easy|58| |495|51|((((WWWWWWSWWSWWWNENNEESSESWWWWEENNWSSSWWWNNNNNWWWSSWWW))))|
|Easy|58|i|513|53|((((WWSWWWWNWWWNWWSESSEENNENWWWWEESSWNNWNWSSSSSWWWWNNNWWW))))|
|Easy|59| |399|43|((((WWSWWWWWSWWEENNWSENNWWNEEWWSENWWSSWWWWWNWWW))))|
|Easy|59|i|381|41|((((WWWWWWWNWWEESSWNESSWWSEEWWNESWWNNWWWWWWWW))))|
|Average|60| |479|48|((((WWWWWNNWWSSNNEESSSSWNENWWWWEEESSWNENWWWWWWWWWWWW))))|
|Average|60|i|497|50|((((WWSWWWNNWWSSNNEESSSSWNENWWWWEEESSWNENWWWWWWWWWNWWW))))|
|Average|61| |435|46|((((WWWWWWNWWWNEESESESNNWWNWWSEEESSSSWWNWWWNWWWWWW))))|
|Average|61|i|453|48|((((WWSWWWWSWWWSEENNEENSSWWSWWNEEENNNNWWSWWWSWWWNWWW))))|
|Average|62| |585|63|((((WWSWWWNWWNEESSWWWSWENEEENNWWSEENNWWWWSSESEEENNNNWWWWSWWWWWWSWWW))))|
|Average|62|i|585|63|((((WWWWWWSWSEENNWWWNWESEEESSWWNEESSWWWWNNENEEESSSSWWWWNWWWWWWNNWWW))))|
|Average|63| |476|52|((((WWNNWWWWSSSSSWNNNNWWNWWSSSNNNEESWSSEESSWWWWWWWNNNWWW))))|
|Average|63|i|476|52|((((WWSSSWWWWNNNNNWSSSSWWSWWNNNSSSEENWNNEENNWWWWWWWSSWWW))))|
|Average|64| |328|35|((((WWNNWWWWSWWWEEESSSWNWWSWWWWWWNNNWWW))))|
|Average|64|i|328|35|((((WWSSSWWWWNWWWEEENNNWSWWNWWWWWWSSWWW))))|
|Average|65| |342|36|((((WWWWWWWNNWWSEWSENWWNEESSSWWNWWWWWWWW))))|
|Average|65|i|360|38|((((WWSWWWWWSSWWNEWNESWWSEENNNWSWWWWWWNWWW))))|
|Average|66| |246|26|((((WWSWWWWWWWWNEWWNESWWWWWWWW))))|
|Average|66|i|246|26|((((WWWWWWWWWWSEWWSENWWWWWNWWW))))|
|Average|67| |317|34|((((WWNNWWWSWSSWSWWSWWNNEENNWWWWWSSWWW))))|
|Average|67|i|335|36|((((WWSSSWWWNWNNWNWWNWWSSEESSWWWWWNNNWWW))))|
|Average|68| |243|26|((((WWWWWWNWWSWNWWESSWNWWWWWWW))))|
|Average|68|i|261|28|((((WWSWWWWSWWNWSWWENNWSWWWWNWWW))))|
|Average|69| |320|34|((((WWNWWWWSWNSWSWNEENENWWWWSWWWWWSWWW))))|
|Average|69|i|338|36|((((WWSSWWWNWWSNWNWSEESESWWWWNWWWWWNNWWW))))|
|Average|70| |393|42|((((WWNNWWWSSSSSWWNENENNWSNNWWWWWSSSWWWWNNNWWW))))|
|Average|70|i|393|42|((((WWSSSWWWNNNNNWWSEESSSWNSSWWWWWNNWNWWWSSWWW))))|
|Average|71| |382|42|((((WWNNWWWSSSSWWNNENNWWWSSESSWWWNNNNWWWWSSWWW))))|
|Average|71|i|400|44|((((WWSSSWWWNNNNWWSSESSWWWNNENNWWWSSSSWWWWNNNWWW))))|
|Average|72| |360|39|((((WWSWWWWWSWWEENNNNWWSESSWNESSWWWWWWWNWWW))))|
|Average|72|i|342|37|((((WWWWWWWNWWEESSSSWWNENNWSENNWWWWWWWWWW))))|
|Average|73| |353|36|((((WWWWWWNWWSENENWWWEESSWNNWWSSWWWWWWWW))))|
|Average|73|i|371|38|((((WWSWWWWSWWNESESWWWEENNWSSWWNNWWWWWNWWW))))|
|Average|74| |429|43|((((WWWWWSSWSWWWNNESWNNWWNEEENEESSWWWWWWWWWWWWW))))|
|Average|74|i|447|45|((((WWSWWWNNNWWWWSSENWSSWWSEEESEENNWWWWWWWWWWNWWW))))|
|Average|75| |390|42|((((WWNNWWWWWWWWSSEEESENNNWWWWSSESWSWWWWNNNWWW))))|
|Average|75|i|390|42|((((WWSSSWWWWWWWWNNEEENESSSWWWWNNENWNWWWWSSWWW))))|
|Average|76| |238|26|((((WWWWWWWSWNENNWWWSSWWWWWWWW))))|
|Average|76|i|256|28|((((WWSWWWWWNWSESSWWWNNWWWWWNWWW))))|
|Average|77| |306|33|((((WWWWWWSSWWNNNEESSSSWWWWNWWNWWWWWW))))|
|Average|77|i|324|35|((((WWSWWWNNWWWSSSEENNNNWWWWWSWSWWWNWWW))))|
|Average|78| |282|30|((((WWWWWSSSWWWEENNWWNWWWSWWWWNWWW))))|
|Average|78|i|282|30|((((WWSWWWNNNWWWEESSWWSWWWNWWWWWWW))))|
|Average|79| |314|34|((((WWWWWWNNWWWEEESSSSWNWWWSWNNWWWWWWW))))|
|Average|79|i|332|36|((((WWSWWWWSSWWWEEENNNNWSWWWNWSSWWWWNWWW))))|
|Average|80| |314|30|((((WWNNWWWSSSWWWNWNWWSSWSWWWNNWWW))))|
|Average|80|i|314|30|((((WWSSSWWWNNNWWWSWSWWNNWNWWWSWWW))))|
|Average|81| |507|54|((((WWNNWWWSSSWSSWWNWSEENNEENNNWWSSSSWWNESWWNNWSSWWWNNNWWW))))|
|Average|81|i|507|54|((((WWSSSWWWNNNWNNWWSWNEESSEESSSWWNNNNWWSENWWSSWNNWWWSSWWW))))|
|Average|82| |276|30|((((WWWWWWNNWWWEESSWNWWWSSWWWWNWWW))))|
|Average|82|i|276|30|((((WWSWWWWSSWWWEENNWSWWWNNWWWWWWW))))|
|Average|83| |259|28|((((WWWWWWWNWESSWNWNSSWWWNWWWWWW))))|
|Average|83|i|277|30|((((WWSWWWWWNWESSWNWNSSWWWNWWWNWWW))))|
|Average|84| |371|36|((((WWWWWWWWWSNNESEESSWWNNENWWWWSWWWWWWW))))|
|Average|84|i|389|38|((((WWSWWWWWWWSNNESEESSWWNNENWWWWSWWWWNWWW))))|
|Average|85| |353|36|((((WWWWWSSWWNWWWEEENEENNWWSWWWSWWWWWWWW))))|
|Average|85|i|371|38|((((WWSWWWSSWWNWWWEEENEENNWWSWWWSWWWWWNWWW))))|
|Average|86| |1218|128|((((WWNNWWWWSSWNESSWWWNEEESSWNESSWWWWWNEEEEESSWNESSWWWNEEESSWNESSSSWNESSWWWNEEESSWNESSWWWWWNEEEEESSWNESSWWWNEEESSWNESSWWWWWWWWWNNWWW))))|
|Average|86|i|1218|128|((((WWSSSWWWWNNWSENNWWWSEEENNWSENNWWWWWSEEEEENNWSENNWWWSEEENNWSENNNNWSENNWWWSEEENNWSENNWWWWWSEEEEENNWSENNWWWSEEENNWSENNWWWWWWWWWSWWW))))|
|Average|87| |486|52|((((WWWWWNNWWEESSSSWWEENNWSNNWSENNWWWSWWNESWWNNWSSWWWWWW))))|
|Average|87|i|504|54|((((WWSWWWNNWWEESSSSWWEENNWNSSWNESSWWWNWWSENWWSSWNNWWWNWWW))))|
|Average|88| |884|90|((((WWNNWWWWWSSNNWWSSSSSWWWNNEEWWSSEEENNNNSSSSEENENWWENNNWWWEEESSSSSWWNNNNSSEENNNWWWWWWWWSSWWW))))|
|Average|88|i|902|92|((((WWSSSWWWWWNNSSWWNNNNNEESESWWENNWWSSSSNNEESSSWWWENNNNNWWWSSEEWWNNEEESSSSNNEESSSWWWWWWWWNNNWWW))))|
|Average|89| |577|60|((((WWNNWWWSWWWSWWNEEESEENNWSESWWWWNWSSSWSEEENEESWWWWWWWWWNNNWWW))))|
|Average|89|i|577|60|((((WWSSSWWWNWWWNWWSEEENEESSWNENWWWWSWNNNWNEEESEENWWWWWWWWWSSWWW))))|
|Average|90| |388|41|((((WWNNWWWWSSSSSWWWNWSEEENENNWWSWWNWWWWSSWWW))))|
|Average|90|i|406|43|((((WWSSSWWWWNNNNNWWSWWNEESEESSWWNWWSWWWWNNNWWW))))|
|Average|91| |604|62|((((WWWWWNNWWWWWWSSESSSEEEENNWEENNWNWSSNEESSWWWWESSWWNNENWWWWWWWWW))))|
|Average|91|i|622|64|((((WWSWWWSWSWWWWWNNENNNEEEESSWEESSSWWNNSEENNWWWWENNWWSSESWWWWWWNWWW))))|
|Average|92| |483|46|((((WWWWWNNWWSSWSWSEEENENWWWWWSESEENENWWWWWWWWWWWW))))|
|Average|92|i|501|48|((((WWSWWWNNWWSSWSWSEEENENWWWWWESESENENWWWWWWWWWNWWW))))|
|Average|93| |296|31|((((WWSWWWWWSSWWNENNWWNESWWSWWWNWWW))))|
|Average|93|i|278|29|((((WWWWWWWNNWWSESSWWSENWWNWWWWWW))))|
|Average|94| |320|34|((((WWWWWWNWWEESSWWNWSWENNWSWNWSWWWWWW))))|
|Average|94|i|338|36|((((WWSWWWWNWWEESSWWNWSWENNWSWNWSWWWNWWW))))|
|Average|95| |319|34|((((WWWWWNNWWSESNNWWSSWWSSWSWNNNWWWWWW))))|
|Average|95|i|337|36|((((WWSWWWSSWWNENSSWWNNWWNNWNWSSSWWWNWWW))))|
|Average|96| |502|51|((((WWNNWWWWSSWESNNNWWWWSSENSWWWSNNNEEESSWSSWWWWWNNNWWW))))|
|Average|96|i|502|51|((((WWSSSWWWWNNWENSSSWWWWNNESNWWWNSSSEEENNWNNWWWWWSSWWW))))|
|Average|97| |365|38|((((WWNNWWWSSSWWSWWNNNEENNWSENNWWWWWWSSWWW))))|
|Average|97|i|383|40|((((WWSSSWWWNNNWWNWWSSSEESSWNESSWWWWWWNNNWWW))))|
|Average|98| |370|40|((((WWWWWWNNWWSESESSWNNNSSSWWWNENNWSWWWWWWWW))))|
|Average|98|i|388|42|((((WWSWWWWSSWWNENENNWSSSNNWNWWSESSWNWWWWWNWWW))))|
|Average|99| |652|66|((((WWNNWWWSWSWSWWWNNWSESSWWNEEEESENNWNEENESSSWSWWWWSWNNNENWWNWWWSSWWW))))|
|Average|99|i|670|68|((((WWSSSWWWNWNWNWWWSSWNENNWWSEEEENESSWSEESENNNWNWWWWNWSSSESWWSWWWNNNWWW))))|
|Average|100| |499|48|((((WWWWWNWNWSSNWEEESWWWNWSESWENEESWWWWWWSSWWWNNNWWW))))|
|Average|100|i|499|48|((((WWSWWWSWSWWENNSEENWWWSWNENWSEEENWWWWWWNNWWWSSWWW))))|
|Average|101| |873|82|((((WWNNWWWSSWWSWWNWESEENWWWWEESWESSWNESENNENWWWWEESWWWNSEESSEEENNENWWWWWSWNNNWWWSSWWW))))|
|Average|101|i|891|84|((((WWSSSWWWNNWWNWWSWENEESWWWWEENWENNWSENESSESWWWWEENWWWSNEEENNEESSESWWWWWNWSSSWWWNNNWWW))))|
|Average|102| |755|74|((((WWSSSWWWNNNWWSSEENNNWWSEWWWNNEEEESSSWWWWNWWNNWSSEEWWSSENENWNWSSSSWWWNNNWWW))))|
|Average|102|i|737|72|((((WWNNWWWSSSWWNNEESSSWWNEWWWSSEEEENNNWWWWSWWSSWNNEEWWNNESESWSWNNNNWWWSSWWW))))|
|Average|103| |692|73|((((WWSSSWWWWWWWNNNEEENNWWWSSWWSSSEENNSSWWNNNEEWWNSSSSEENNNNEEESSWWWWWWWWWWWW))))|
|Average|103|i|692|73|((((WWNNWWWWWWWSSSEEESSWWWNNWWNNNEESSNNWWSSSEEWWSNNNNEESSSSEEENNWWWWWWWWWNWWW))))|
|Average|104| |600|60|((((WWSSSWWWNWWWWWSWWNEEEEESEENWSWNNNWWWEEENNWSESWWWWWNNWWWSSWWW))))|
|Average|104|i|600|60|((((WWNNWWWSWWWWWNWWSEEEEENEESWNWSSSWWWEEESSWNENWWWWWSSWWWNNNWWW))))|
|Average|105| |423|43|((((WWSWWWNNWWWSNWWSSWEEESEESNWWSNWWSWWNWWWNWWW))))|
|Average|105|i|405|41|((((WWWWWSSWWWNNWENEENSWWNNWWSWESSSNWWNWWWWWW))))|
|Average|106| |464|50|((((WWNNWWWSWSWSWNESSWWSWWEENEENNWNWWSSSWNESSWWWWWNWWW))))|
|Average|106|i|464|50|((((WWSSSWWWNWNWNWSENNWWNWWEESEESSSWWWNNNWSENNWWWWWWWW))))|
|Average|107| |544|58|((((WWSWWWWSNNWWWNNWWWSENEEEEESSWNESSWWWNSESWWNESSWWSWWWWNNWWW))))|
|Average|107|i|526|56|((((WWWWWWNSSWWWSSWWWNESEEEEENNWSENNWWWSNENWWSENNWWNWWWWSWWW))))|
|Average|108| |314|34|((((WWSWWWWSWWWEEENNNWWSWNSSWNWWWWWWWW))))|
|Average|108|i|314|34|((((WWWWWWNWWWEEESSSWWNWSNNWSWWWWWNWWW))))|
|Average|109| |1083|115|((((WWWWWWWWWEEEESSWNESSWWWNEEESSWNESSWWWWWEEEEENNWSENNWWWSEEENNWSENNWWWWWSWENEEEEENNWSENNWWWSEEENNWSENNWWWWWSWSWWWWWWW))))|
|Average|109|i|1101|117|((((WWSWWWWWWWEEEESSWNESSWWWNEEESSWNESSWWWWWEEEEENNWSENNWWWSEEENNWSENNWWWWWSWENEEEEENNWSENNWWWSEEENNWSENNWWWWWSWSWWWWNWWW))))|
|Hard|110| |502|46|((((WWWWWNWNWWWSSSSSWWNESENSEENWWWSWNENWSWNNWWWWWW))))|
|Hard|110|i|520|48|((((WWSWWWSWSWWWNNNNNWWSENESNEESWWWNWSESWNWSSWWWNWWW))))|
|Hard|111| |551|55|((((WWWWWWSWWSWEEESWWNNEENNWWSSSWWWENENNNWWWSESSENNWWWWWWWW))))|
|Hard|111|i|569|57|((((WWSWWWWNWWNWNESEESSSWNNENWSWNWWWESESSSWWWNENNESSWWWWWNWWW))))|
|Hard|112| |344|36|((((WWWWWWNNWWESESSWNNENWWWSSSWWNWWWWWWW))))|
|Hard|112|i|362|38|((((WWSWWWWNNWWESESSWNNENWWWSSSWWNWWWWNWWW))))|
|Hard|113| |542|57|((((WWSWWWNWWWWSEEESSWNNWWSWWSSEEENNNEENNWSESSWWNNNWWSSWWWWWW))))|
|Hard|113|i|542|57|((((WWWWWSWWWWNEEENNWSSWWNWWNNEEESSSEESSWNNENWWSSSWWNNWWWNWWW))))|
|Hard|114| |351|32|((((WWSWWWNNWWSWWNWWSESWSSWNNWWWNWWW))))|
|Hard|114|i|333|30|((((WWWWWSSWWNWWSWWNENWNNWSSWWWWWW))))|
|Hard|115| |578|58|((((WWSSSWWWNNWWWEEESSWNENWWWWNWSEEEESSWNENWWWSWNNNNWWWWWSSWWW))))|
|Hard|115|i|578|58|((((WWNNWWWSSWWWEEENNWSESWWWWSWNEEEENNWSESWWWNWSSSSWWWWWNNNWWW))))|
|Hard|116| |466|49|((((WWWWWSSSWWWWWNSEEEEENNNNNWWWSSWWWNEEESSWWWWWWWWWW))))|
|Hard|116|i|484|51|((((WWSWWWNNNWWWWWSNEEEEESSSSSWWWNNWWWSEEENNWWWWWWWNWWW))))|
|Hard|117| |474|49|((((WWNNWWWWWSEESWWSNWWSNNNWWSSSENWWNNEESSSWWNWWWNWWW))))|
|Hard|117|i|474|49|((((WWSSSWWWWWNEENWWNSWWNSSSWWNNNESWWSSEENNNWWSWWWWWW))))|
|Hard|118| |445|46|((((WWSWWWWSWWWWEEEENESWWWWWENNNNWESSWSNNWWSWWWWWW))))|
|Hard|118|i|445|46|((((WWWWWWNWWWWEEEESENWWWWWESSSSWENNWNSSWWNWWWNWWW))))|
|Hard|119| |545|58|((((WWNNWWWWWWSSNNWWWSENEEESWNEESSENNSSWNESSWWWSSWWWWWWWNNNWWW))))|
|Hard|119|i|545|58|((((WWSSSWWWWWWNNSSEENWSWWWNESEEENNESSNNWSENNWWWNNWWWWWWWSSWWW))))|
|Hard|120| |333|32|((((WWWWWSSSWWWNNNSEENNWWWWWWSWWWWWW))))|
|Hard|120|i|351|34|((((WWSWWWNNNWWWSSSNEESSWWWWWWNWWWNWWW))))|
|Hard|121| |629|58|((((WWNNWWWWWWWWSWSENEEEEESSSSWNNENNWWWWNWSESWNWSSSWSWWWNNNWWW))))|
|Hard|121|i|629|58|((((WWSSSWWWWWWWWNWNESEEEEENNNNWSSESSWWWWSWNENWSWNNNWNWWWSSWWW))))|
|Hard|122| |462|48|((((WWWWWWWWNWWNWESESESSESEENWWSWNNSEENNWWWWWWWWWWWW))))|
|Hard|122|i|480|50|((((WWSWWWWWWSWWSWENENENNENEESWWNWSSNEESSWWWWWWWWWNWWW))))|
|Hard|123| |624|64|((((WWSSSWWWNNSSWWNNNESSSSWWNNWSEENNNWWSSSWSENEESSWNENWWWWSWNNWWWWWW))))|
|Hard|123|i|624|64|((((WWNNWWWSSNNWWSSSENNNNWWSSWNEESSSWWNNNWNESEENNWSESWWWWNWSSWWWNWWW))))|
|Hard|124| |624|62|((((WWWWWSSSWWWWWNSEENWSEENNNNNWESEESSWWEESSWWWNNNNENWWWWWSSWWWWWW))))|
|Hard|124|i|642|64|((((WWSWWWNNNWWWWWSNEESWNEESSSSSWENEENNWWEENNWWWSSSSESWWWWWNNWWWNWWW))))|
|Hard|125| |1207|118|((((WWWWWNNWWWSSESWNNNESSNNEESSWWEESSSWNNWWWEENNNWSESSWWWEENNNEESESSWWWWWWEEEEESSWNENWWWWWNWSEEEEESSWNENWWWWNWSSSWWWNNNWWW))))|
|Hard|125|i|1207|118|((((WWSWWWSSWWWNNENWSSSENNSSEENNWWEENNNWSSWWWEESSSWNENNWWWEESSSEENENNWWWWWWEEEEENNWSESWWWWWSWNEEEEENNWSESWWWWSWNNNWWWSSWWW))))|
|Hard|126| |534|36|((((WWWWWNNWWWWWWSSSNNNEESSSSWWWNNWWWWWW))))|
|Hard|126|i|552|38|((((WWSWWWSSWWWWWWNNNSSSEENNNNWWWSSWWWNWWW))))|
|Hard|127| |595|60|((((WWWWWSSSWWNWWNWSENEEENNNWSWWSWEEEESWSSEENWSWNNENWWWWWWWWWWWW))))|
|Hard|127|i|613|62|((((WWSWWWNNNWWSWWSWNSEEEESSSWNWWNWEEEENWNNEESWNWSSESWWWWWWWWWNWWW))))|
|Hard|128| |765|71|((((WWNNWWWSWWNWWSSSEEENNWSSWWWSWNNNEEENESSESSESWWWNENESSESWWWWWWWWWWNNNWWW))))|
|Hard|128|i|765|71|((((WWSSSWWWNWWSWWNNNEEESSWNNWWWNWSSSEEESENNENNENWWWSESENNENWWWWWWWWWWSSWWW))))|
|Hard|129| |601|60|((((WWWWWNWWWWWWSENEEEESESSWWWWSWWNEEEESENNNENWWWWWSWNNWWWWSSWWW))))|
|Hard|129|i|619|62|((((WWSWWWSWWWWNWSEEEENNENWWWWNWWSEEEENESSSESWWWWNWSESWWWWWWNNNWWW))))|
|Hard|130| |611|56|((((WWWWWNNWWWWSSNNEESSWWWSEESSEENENWWWWWEESSWWNNENWWWWWWWWW))))|
|Hard|130|i|629|58|((((WWSWWWSSWWWWNNSSEENNWWWNEENNEESESWWWWWWWNNEESSESWWWWWWNWWW))))|
|Hard|131| |318|34|((((WWSWWWNWNWSWSSESWWWNENNWWWSWWWNWWW))))|
|Hard|131|i|300|32|((((WWWWWSWSWNWNNENWWWSESSWWWNWWWWWW))))|
|Hard|132| |518|48|((((WWWWWWSWWWEENENWNWWSSNNEESSWSWWNNESESWWWWWWWNWWW))))|
|Hard|132|i|518|48|((((WWSWWWWNWWWEESESWSWWNNSSEENNWNWWSSENENWWWWWWWWWW))))|
|Hard|133| |811|81|((((WWWWWWSSSWWWWWNENEESSEENWSEENNNWWNESNWSENNWWWSWWEESESWNNNWWSSSSEENNWNNWWSSWWWWWWW))))|
|Hard|133|i|829|83|((((WWSWWWWNNNWWWWWESSEENNEESWNEESSSWWSENSWNESSWWWNWWEENENWSSSWWNNNNEESSWSSWWNNWWWWNWWW))))|
|Hard|134| |597|60|((((WWWWWSSSWWWNNEWWNESEEENWWSWNENWWSSSENENENWSWNENWWWWWSSWWWWWW))))|
|Hard|134|i|615|62|((((WWSWWWNNNWWWSSEWWSENEEESWWNWSESWWNNNESESESWNWSESWWWWWNNWWWNWWW))))|
|Hard|135| |665|68|((((WWNNWWWSWWWNWWSEENESWSSSNNENEESSWENNWSSSSWWNNENENWSWNENWWWWWWWWSSWWW))))|
|Hard|135|i|683|70|((((WWSSSWWWNWWWSWWNEESENWNNNSSESEENNWESSWNNNNWWSSESESWNWSESWWWWWWWWNNNWWW))))|
|Hard|136| |741|76|((((WWSSSWWWWWWWWNNWWNNENEESEWWSWWSENENNWSSSNNEEEEEESSWNENWWWWWNWSSSSSWWWWNNNWWW))))|
|Hard|136|i|723|74|((((WWNNWWWWWWWWSSWWSSESEENEWWNWWNESESSWNNNSSEEEEEENNWSESWWWWWSWNNNNNWWWWSSWWW))))|
|Hard|137| |1079|109|((((WWSSSWWWNNNNNWWWSESSSSWNENNNEESSSSWESWWWWWWEEEENNWSENNNENNWWSSENENNWWSWNEEWWSENWWSSSNNNWSEENEEESWWWWWWSWWWWWW))))|
|Hard|137|i|1079|109|((((WWNNWWWSSSSSWWWNENNNNWSESSSEENNNNWENWWWWWWEEEESSWNESSSESSWWNNESESSWWNWSEEWWNESWWNNNSSSWNEESEEENWWWWWWNWWWNWWW))))|
|Hard|138| |671|70|((((WWSSSWWWWWNNNNENWSSSSSEENWSWNNNNESWSSWWWNEEEWWWSENSWNEEWWSENNWWWWWWWWW))))|
|Hard|138|i|671|70|((((WWNNWWWWWSSSSESWNNNNNEESWNWSSSSENWNNWWWSEEEWWWNESNWSEEWWNESSWWWWWWNWWW))))|
|Hard|139| |883|94|((((WWWWWWWWWNNWSSEEESSSENNWNNEESWWWWEESSSWWNNSSWWNESEEENNNNNWWWSSSNNNEEESSWWEESSSWWNWWSWNNNWWWWWW))))|
|Hard|139|i|901|96|((((WWSWWWWWWWSSWNNEEENNNESSWSSEENWWWWEENNNWWSSNNWWSENEEESSSSSWWWNNNSSSEEENNWWEENNNWWSWWNWSSSWWWNWWW))))|
|Hard|140| |559|55|((((WWWWWNNWWWSSNNWWWESESSEESEENWWNNWWWEEESSWNENWWWWWWWWWWW))))|
|Hard|140|i|577|57|((((WWSWWWSSWWWNNSSWWWENENNEENEESWWSSWWWEEENNWSESWWWWWWWWNWWW))))|
|Hard|141| |659|65|((((WWWWWSSWWNNNSSSWWWNEESSEENNNWWWWEESSWNESSWSSENNNNENWWWWSSWWWWWWWW))))|
|Hard|141|i|677|67|((((WWSWWWNNWWSSSNNNWWWSEENNEESSSWWWWEENNWSENNWNNESSSSESWWWWNNWWWWWNWWW))))|
|Hard|142| |847|82|((((WWWWWSWENNNWSSSESWNWSESWWWWNWNESSENSEENNWWSWNEEEENNWNWWSSNNEEESSSWWWSWNENWWWWWWWWW))))|
|Hard|142|i|865|84|((((WWSWWWNWSESSWNNNENWSWNENWWWWSWSENNESNEESSWWNWSEEEESSWSWWNNSSEENENNWWWNWSESWWWWWWNWWW))))|
|Hard|143| |709|74|((((WWNNWWWWWSSENSEESSSWWWNNWWNNNEESNWWSSSEEWWSNNNNEESSSSEEENNNWWSWWWNWWWWWWWW))))|
|Hard|143|i|727|76|((((WWSSSWWWWWNNESNEENNNWWWSSWWSSSEENSWWNNNEEWWNSSSSEENNNNEEESSSWWNWWWWWSWWWNWWW))))|
|Hard|144| |1051|107|((((WWWWWWSSSWWWWWNNENENWSSWSSEEENEEENNWWWESSWSWWWNNENSWSSEEEEENNNNNWSESWWESSSWWWWNNENEEEESSWWNSEENNWWWWWWWWWWW))))|
|Hard|144|i|1069|109|((((WWSWWWWNNNWWWWWSSESESWNNWNNEEESEEESSWWWENNWNWWWSSESNWNNEEESESSESSWNENWWENNNWWWWSSESEEEENNWWSNEESSWWWWWWWWNWWW))))|
|Hard|145| |1129|115|((((WWWWWNNWWWWSENWWSSSNNEESSSSEENNWNWSNNNWWSWSENESENENWWWWEESSEESSWWNNNENNWWWSWWESNESWNNWEEENEESWWWWWEESSWNNWWSSWWWWWW))))|
|Hard|145|i|1147|117|((((WWSWWWSSWWWWNESWWNNNSSEENNNNEESSWSWNSSSWWWNNESENESESWWWWWWENSEEENEENNNWWSSSESSWWWNNWSSWESEEEENWWWWWEENNWSSWWNNWWWNWWW))))|
|Hard|146| |1022|104|((((WWWWWSSWSWWEENENNNWNWWEESSWNESSWWWNEEWWSENWSSWEEEENNWWWEEESSWSSENNWWWSEEEWWNNWSENNEWNENESESWWWWWWWWWWWWW))))|
|Hard|146|i|1040|106|((((WWSWWWNNWNWWEESESSSWSWWEENNWSENNWWWSEEWWNESWNNWEEEESSWWWEEENNWNNESSWWWNEEEWWSSWNESSEWSESENENWWWWWWWWWWNWWW))))|
|Hard|147| |968|100|((((WWSSSWWWNNNWWSWENEESSSWWNNEESSSWWWWNNWWSENEEEESSEENWSWNNWNNWSESEENWWWESWSSWWNESENNNENWSWNNWWWWWSSWWW))))|
|Hard|147|i|968|100|((((WWNNWWWSSSWWNWSEEENNNWWSSEENNNWWWWSSWWNESEEESSWNENWNNWWSENESSESWWNEEENNEESWNWSSESWWWNWSSSWWWWWNNNWWW))))|
|Hard|148| |1239|132|((((WWSSSWWWWENNNNNWWWSSEENNWWWWWWSSEESSNNEENNEEESSWWWEESSWWNNEENNWWWWWWSSEEEEEWWWWWNNEEEESNWWWWSSEEEESSEENNWWWWWEEENNWWWWSSSSSWWWNNNWWW))))|
|Hard|148|i|1221|130|((((WWNNWWWWESSSSSWWWNNEESSWWWWWWNNEENNSSEESSEEENNWWWEENNWWSSEESSWWWWWWNNEEEEEWWWWWSSEEEENSWWWWNNEEEENNEESSWWWWWEEESSWWWWNNNNNWWWSSWWW))))|
|Hard|149| |903|94|((((WWWWWSSWWWSWWWWNEENSSEEEENWWWEEEENNWSENNWWWSSEENENNWWWWWSSNNWNSEENNESWSESSSEENENNWWWWWWWWWWWWW))))|
|Hard|149|i|921|96|((((WWSWWWNNWWWNWWWWSEESNNEEEESWWWEEEESSWNESSWWWNNEESESSWWWWWNNSSWSNEESSENWNENNNEESESSWWWWWWWWWWNWWW))))|
!!! Resources
* [372G|TASVideos game page]
* [Forum/Topics/4996|TASVideos discussion thread]
* [Forum/Topics/8667|Thread about algorithmic optimization]
!! Movies
* 2024 [6203M]
* 2024 [5850M]
* 2020 [4105M]
* 2018 [3755M]
* 2007 [857M]
!! Tools
* [https://github.com/CyberShadow/DDD|DDD] and [https://github.com/CyberShadow/DDD-Kwirk|DDD-Kwirk], algorithmic optimizer
* {{git clone !https://www.bamsoftware.com/git/kwirk.git}} [user:Sand]'s utilities