View Page Source

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