azurkit 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- azurkit/__init__.py +46 -0
- azurkit/__main__.py +18 -0
- azurkit/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/__pycache__/__main__.cpython-314.pyc +0 -0
- azurkit/__pycache__/cli.cpython-314.pyc +0 -0
- azurkit/__pycache__/sdk.cpython-314.pyc +0 -0
- azurkit/__pycache__/store.cpython-314.pyc +0 -0
- azurkit/app/__init__.py +1290 -0
- azurkit/app/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/app/__pycache__/ahead.cpython-314.pyc +0 -0
- azurkit/app/__pycache__/art.cpython-314.pyc +0 -0
- azurkit/app/__pycache__/engine.cpython-314.pyc +0 -0
- azurkit/app/__pycache__/live.cpython-314.pyc +0 -0
- azurkit/app/__pycache__/memo.cpython-314.pyc +0 -0
- azurkit/app/__pycache__/procpool.cpython-314.pyc +0 -0
- azurkit/app/__pycache__/swapcache.cpython-314.pyc +0 -0
- azurkit/app/__pycache__/warm.cpython-314.pyc +0 -0
- azurkit/app/ahead.py +359 -0
- azurkit/app/art.py +45 -0
- azurkit/app/engine.py +660 -0
- azurkit/app/live.py +186 -0
- azurkit/app/memo.py +235 -0
- azurkit/app/procpool.py +428 -0
- azurkit/app/swapcache.py +320 -0
- azurkit/app/warm.py +335 -0
- azurkit/cli.py +455 -0
- azurkit/commit.txt +1 -0
- azurkit/core/__init__.py +2 -0
- azurkit/core/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/coff.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/facts.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/fdlibm.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/filelist.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/gate.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/host.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/inflate.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/iso.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/jsondepth.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/native.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/progress.cpython-314.pyc +0 -0
- azurkit/core/__pycache__/xbe.cpython-314.pyc +0 -0
- azurkit/core/_native/emscripten-wasm32.so +0 -0
- azurkit/core/_native/linux-aarch64.so +0 -0
- azurkit/core/_native/linux-x86_64.so +0 -0
- azurkit/core/_native/macos-arm64.dylib +0 -0
- azurkit/core/_native/macos-x86_64.dylib +0 -0
- azurkit/core/_native/windows-x86_64.dll +0 -0
- azurkit/core/coff.py +211 -0
- azurkit/core/facts.europe.json +4097 -0
- azurkit/core/facts.py +156 -0
- azurkit/core/facts.usa.json +3826 -0
- azurkit/core/fdlibm.py +532 -0
- azurkit/core/filelist.py +68 -0
- azurkit/core/gate.py +287 -0
- azurkit/core/host.py +166 -0
- azurkit/core/inflate.py +36 -0
- azurkit/core/iso.py +823 -0
- azurkit/core/jsondepth.py +28 -0
- azurkit/core/manifests/europe.json +98 -0
- azurkit/core/manifests/usa.json +1200 -0
- azurkit/core/native.py +805 -0
- azurkit/core/progress.py +132 -0
- azurkit/core/xbe.py +224 -0
- azurkit/core/xbr/__init__.py +8 -0
- azurkit/core/xbr/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/core/xbr/__pycache__/append.cpython-314.pyc +0 -0
- azurkit/core/xbr/__pycache__/clone.cpython-314.pyc +0 -0
- azurkit/core/xbr/__pycache__/document.cpython-314.pyc +0 -0
- azurkit/core/xbr/__pycache__/edits.cpython-314.pyc +0 -0
- azurkit/core/xbr/__pycache__/graph.cpython-314.pyc +0 -0
- azurkit/core/xbr/__pycache__/keyed.cpython-314.pyc +0 -0
- azurkit/core/xbr/__pycache__/nodes.cpython-314.pyc +0 -0
- azurkit/core/xbr/append.py +430 -0
- azurkit/core/xbr/clone.py +182 -0
- azurkit/core/xbr/document.py +195 -0
- azurkit/core/xbr/edits.py +128 -0
- azurkit/core/xbr/graph.py +514 -0
- azurkit/core/xbr/keyed.py +161 -0
- azurkit/core/xbr/node_types.json +764 -0
- azurkit/core/xbr/nodes.py +213 -0
- azurkit/edits/__init__.py +3 -0
- azurkit/edits/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/edits/__pycache__/files.cpython-314.pyc +0 -0
- azurkit/edits/__pycache__/layer.cpython-314.pyc +0 -0
- azurkit/edits/__pycache__/manifest.cpython-314.pyc +0 -0
- azurkit/edits/__pycache__/preset.cpython-314.pyc +0 -0
- azurkit/edits/__pycache__/xbr.cpython-314.pyc +0 -0
- azurkit/edits/files.py +145 -0
- azurkit/edits/layer.py +306 -0
- azurkit/edits/manifest.py +335 -0
- azurkit/edits/preset.py +205 -0
- azurkit/edits/xbr.py +211 -0
- azurkit/sdk.py +1646 -0
- azurkit/store.py +276 -0
- azurkit/tools/__init__.py +3 -0
- azurkit/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/tools/characters/__init__.py +547 -0
- azurkit/tools/characters/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_borrow.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_character.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_crossfade.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_damage_marker.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_fx_ring.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_kit.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_match.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_power_fx.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_slots.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_sounds.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_throw.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_variants.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_victory.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/_player_weapons.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/body_codec.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/characters.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/clip_import.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/content.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/decimate.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/draw.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/fx_edit.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/fx_mesh.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/fx_templates.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/gltf.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/gltf_import.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/grades.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/index_xbr.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/jiggle.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/jiggle_rt.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/lods.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/mesh_edit.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/model_chains.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/model_inspect.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/paint.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/picker.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/pool.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/ports.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/pose.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/render.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/retarget.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/shipped.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/skeleton.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/synth.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/textures.cpython-314.pyc +0 -0
- azurkit/tools/characters/__pycache__/xbox_adpcm.cpython-314.pyc +0 -0
- azurkit/tools/characters/_player_borrow.py +150 -0
- azurkit/tools/characters/_player_character.py +11603 -0
- azurkit/tools/characters/_player_crossfade.py +219 -0
- azurkit/tools/characters/_player_damage_marker.py +229 -0
- azurkit/tools/characters/_player_fx_ring.py +815 -0
- azurkit/tools/characters/_player_kit.py +309 -0
- azurkit/tools/characters/_player_match.py +156 -0
- azurkit/tools/characters/_player_power_fx.py +554 -0
- azurkit/tools/characters/_player_slots.py +536 -0
- azurkit/tools/characters/_player_sounds.py +648 -0
- azurkit/tools/characters/_player_throw.py +762 -0
- azurkit/tools/characters/_player_variants.py +4366 -0
- azurkit/tools/characters/_player_victory.py +238 -0
- azurkit/tools/characters/_player_weapons.py +3257 -0
- azurkit/tools/characters/body_codec.py +934 -0
- azurkit/tools/characters/chains.json +47 -0
- azurkit/tools/characters/characters.py +835 -0
- azurkit/tools/characters/clip_import.py +561 -0
- azurkit/tools/characters/clips/townsfolk/children.glb +0 -0
- azurkit/tools/characters/clips/townsfolk/kit.json +179 -0
- azurkit/tools/characters/clips/townsfolk/townsmen.glb +0 -0
- azurkit/tools/characters/clips/townsfolk/townswomen.glb +0 -0
- azurkit/tools/characters/content.py +521 -0
- azurkit/tools/characters/decimate.py +711 -0
- azurkit/tools/characters/draw.py +412 -0
- azurkit/tools/characters/fx/air_elemental/air_funnel.glb +0 -0
- azurkit/tools/characters/fx/air_elemental/air_funnel_swirl.png +0 -0
- azurkit/tools/characters/fx_edit.py +705 -0
- azurkit/tools/characters/fx_mesh.py +232 -0
- azurkit/tools/characters/fx_templates.json +250 -0
- azurkit/tools/characters/fx_templates.py +417 -0
- azurkit/tools/characters/gltf.py +1027 -0
- azurkit/tools/characters/gltf_import.py +489 -0
- azurkit/tools/characters/grades.py +32 -0
- azurkit/tools/characters/index_xbr.py +182 -0
- azurkit/tools/characters/jiggle.py +1602 -0
- azurkit/tools/characters/jiggle_rt.py +1750 -0
- azurkit/tools/characters/lods.py +143 -0
- azurkit/tools/characters/mesh_edit.py +5718 -0
- azurkit/tools/characters/mode_grades.json +112 -0
- azurkit/tools/characters/model_chains.py +245 -0
- azurkit/tools/characters/model_inspect.py +694 -0
- azurkit/tools/characters/paint.py +1112 -0
- azurkit/tools/characters/picker.py +399 -0
- azurkit/tools/characters/player_model/air_blast.c +215 -0
- azurkit/tools/characters/player_model/air_blast.o +0 -0
- azurkit/tools/characters/player_model/attack_box.c +143 -0
- azurkit/tools/characters/player_model/attack_box.o +0 -0
- azurkit/tools/characters/player_model/attack_carry.c +423 -0
- azurkit/tools/characters/player_model/attack_carry.o +0 -0
- azurkit/tools/characters/player_model/attack_rotation.c +131 -0
- azurkit/tools/characters/player_model/attack_rotation.o +0 -0
- azurkit/tools/characters/player_model/attack_sets.c +335 -0
- azurkit/tools/characters/player_model/attack_sets.o +0 -0
- azurkit/tools/characters/player_model/body_key.c +51 -0
- azurkit/tools/characters/player_model/body_key.o +0 -0
- azurkit/tools/characters/player_model/borrow.c +178 -0
- azurkit/tools/characters/player_model/borrow.o +0 -0
- azurkit/tools/characters/player_model/borrow_first.c +76 -0
- azurkit/tools/characters/player_model/borrow_first.o +0 -0
- azurkit/tools/characters/player_model/climb.c +598 -0
- azurkit/tools/characters/player_model/climb.o +0 -0
- azurkit/tools/characters/player_model/damage_marker.c +219 -0
- azurkit/tools/characters/player_model/damage_marker.o +0 -0
- azurkit/tools/characters/player_model/drain.c +907 -0
- azurkit/tools/characters/player_model/drain.o +0 -0
- azurkit/tools/characters/player_model/eye.c +459 -0
- azurkit/tools/characters/player_model/eye.o +0 -0
- azurkit/tools/characters/player_model/eye_hang.c +112 -0
- azurkit/tools/characters/player_model/eye_hang.o +0 -0
- azurkit/tools/characters/player_model/eye_sweep.c +353 -0
- azurkit/tools/characters/player_model/eye_sweep.o +0 -0
- azurkit/tools/characters/player_model/fade_floor.c +513 -0
- azurkit/tools/characters/player_model/fade_floor.o +0 -0
- azurkit/tools/characters/player_model/finish_range.c +69 -0
- azurkit/tools/characters/player_model/finish_range.o +0 -0
- azurkit/tools/characters/player_model/fx_default.c +56 -0
- azurkit/tools/characters/player_model/fx_default.o +0 -0
- azurkit/tools/characters/player_model/fx_ring.c +1178 -0
- azurkit/tools/characters/player_model/fx_ring.o +0 -0
- azurkit/tools/characters/player_model/hang_ease.c +356 -0
- azurkit/tools/characters/player_model/hang_ease.o +0 -0
- azurkit/tools/characters/player_model/hang_hold.c +749 -0
- azurkit/tools/characters/player_model/hang_hold.o +0 -0
- azurkit/tools/characters/player_model/hit_delay.c +94 -0
- azurkit/tools/characters/player_model/hit_delay.o +0 -0
- azurkit/tools/characters/player_model/hit_fx.c +83 -0
- azurkit/tools/characters/player_model/hit_fx.o +0 -0
- azurkit/tools/characters/player_model/hit_reaction.c +114 -0
- azurkit/tools/characters/player_model/hit_reaction.o +0 -0
- azurkit/tools/characters/player_model/idle_pick.c +141 -0
- azurkit/tools/characters/player_model/idle_pick.o +0 -0
- azurkit/tools/characters/player_model/jiggle.c +1079 -0
- azurkit/tools/characters/player_model/jiggle.o +0 -0
- azurkit/tools/characters/player_model/light_hit.c +156 -0
- azurkit/tools/characters/player_model/light_hit.o +0 -0
- azurkit/tools/characters/player_model/near_draw.c +91 -0
- azurkit/tools/characters/player_model/near_draw.o +0 -0
- azurkit/tools/characters/player_model/over_top.c +179 -0
- azurkit/tools/characters/player_model/over_top.o +0 -0
- azurkit/tools/characters/player_model/roll.c +125 -0
- azurkit/tools/characters/player_model/roll.o +0 -0
- azurkit/tools/characters/player_model/seek.c +109 -0
- azurkit/tools/characters/player_model/seek.o +0 -0
- azurkit/tools/characters/player_model/slots.c +126 -0
- azurkit/tools/characters/player_model/slots.o +0 -0
- azurkit/tools/characters/player_model/sounds.c +89 -0
- azurkit/tools/characters/player_model/sounds.o +0 -0
- azurkit/tools/characters/player_model/stance_term.c +183 -0
- azurkit/tools/characters/player_model/stance_term.o +0 -0
- azurkit/tools/characters/player_model/target_search.c +89 -0
- azurkit/tools/characters/player_model/target_search.o +0 -0
- azurkit/tools/characters/player_model/throw.c +774 -0
- azurkit/tools/characters/player_model/throw.o +0 -0
- azurkit/tools/characters/player_model/thud.c +78 -0
- azurkit/tools/characters/player_model/thud.o +0 -0
- azurkit/tools/characters/player_model/touch.c +61 -0
- azurkit/tools/characters/player_model/touch.o +0 -0
- azurkit/tools/characters/player_model/victory_cancel.c +103 -0
- azurkit/tools/characters/player_model/victory_cancel.o +0 -0
- azurkit/tools/characters/player_model/water_push.c +464 -0
- azurkit/tools/characters/player_model/water_push.o +0 -0
- azurkit/tools/characters/player_model/wings.c +336 -0
- azurkit/tools/characters/player_model/wings.o +0 -0
- azurkit/tools/characters/pool.py +88 -0
- azurkit/tools/characters/ports.py +1068 -0
- azurkit/tools/characters/pose.py +61 -0
- azurkit/tools/characters/render.py +305 -0
- azurkit/tools/characters/retarget.py +1303 -0
- azurkit/tools/characters/shipped.json +3437 -0
- azurkit/tools/characters/shipped.py +451 -0
- azurkit/tools/characters/skeleton.py +203 -0
- azurkit/tools/characters/species.json +1 -0
- azurkit/tools/characters/synth.py +125 -0
- azurkit/tools/characters/textures.py +322 -0
- azurkit/tools/characters/variant_grades.json +59 -0
- azurkit/tools/characters/variants.json +1028 -0
- azurkit/tools/characters/weapon_grades.json +52 -0
- azurkit/tools/characters/weapons.json +104 -0
- azurkit/tools/characters/xbox_adpcm.py +184 -0
- azurkit/tools/data/__init__.py +441 -0
- azurkit/tools/data/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/tools/data/__pycache__/views.cpython-314.pyc +0 -0
- azurkit/tools/data/config.xbr +0 -0
- azurkit/tools/data/schema.json +1371 -0
- azurkit/tools/data/views.py +574 -0
- azurkit/tools/mods/__init__.py +142 -0
- azurkit/tools/mods/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/tools/mods/__pycache__/community.cpython-314.pyc +0 -0
- azurkit/tools/mods/__pycache__/engine.cpython-314.pyc +0 -0
- azurkit/tools/mods/community.py +259 -0
- azurkit/tools/mods/engine.py +651 -0
- azurkit/tools/mods/packs/__init__.py +1 -0
- azurkit/tools/mods/packs/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/air_shield_flaps.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/enemy_damage.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/enemy_scaling.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/fps_unlock.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/player_max_hp.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/player_physics.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/qol_alloc_race.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/qol_memory.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/qol_photo_mode.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/qol_pickup_anims.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/qol_popups.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/qol_save_warp.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/__pycache__/qol_skip_logo.cpython-314.pyc +0 -0
- azurkit/tools/mods/packs/air_shield_flaps.py +28 -0
- azurkit/tools/mods/packs/enemy_damage.py +98 -0
- azurkit/tools/mods/packs/enemy_scaling.py +240 -0
- azurkit/tools/mods/packs/fps_unlock.py +125 -0
- azurkit/tools/mods/packs/player_max_hp.py +37 -0
- azurkit/tools/mods/packs/player_physics.py +311 -0
- azurkit/tools/mods/packs/qol_alloc_race.py +148 -0
- azurkit/tools/mods/packs/qol_memory.py +124 -0
- azurkit/tools/mods/packs/qol_photo_mode.py +37 -0
- azurkit/tools/mods/packs/qol_pickup_anims.py +16 -0
- azurkit/tools/mods/packs/qol_popups.py +31 -0
- azurkit/tools/mods/packs/qol_save_warp.py +28 -0
- azurkit/tools/mods/packs/qol_skip_logo.py +31 -0
- azurkit/tools/mods/shims/enemy_scaling.c +356 -0
- azurkit/tools/mods/shims/enemy_scaling.o +0 -0
- azurkit/tools/mods/shims/player_physics.c +273 -0
- azurkit/tools/mods/shims/player_physics.o +0 -0
- azurkit/tools/mods/shims/qol_alloc_race.c +222 -0
- azurkit/tools/mods/shims/qol_alloc_race.o +0 -0
- azurkit/tools/mods/shims/qol_memory_budget.c +45 -0
- azurkit/tools/mods/shims/qol_memory_budget.o +0 -0
- azurkit/tools/mods/shims/qol_memory_heap.h +330 -0
- azurkit/tools/mods/shims/qol_memory_upper256.c +57 -0
- azurkit/tools/mods/shims/qol_memory_upper256.o +0 -0
- azurkit/tools/mods/shims/qol_memory_upper64.c +80 -0
- azurkit/tools/mods/shims/qol_memory_upper64.o +0 -0
- azurkit/tools/mods/shims/qol_memory_upper64_gpu.c +183 -0
- azurkit/tools/mods/shims/qol_memory_upper64_gpu.o +0 -0
- azurkit/tools/mods/shims/qol_photo_mode.c +208 -0
- azurkit/tools/mods/shims/qol_photo_mode.o +0 -0
- azurkit/tools/mods/shims/qol_save_warp.c +306 -0
- azurkit/tools/mods/shims/qol_save_warp.o +0 -0
- azurkit/tools/mods/shims/qol_skip_logo.c +26 -0
- azurkit/tools/mods/shims/qol_skip_logo.o +0 -0
- azurkit/tools/mods/shims/xboxkrnl_resolver.c +74 -0
- azurkit/tools/mods/shims/xboxkrnl_resolver.o +0 -0
- azurkit/tools/randomizer/__init__.py +461 -0
- azurkit/tools/randomizer/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/__pycache__/dbcache.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/__pycache__/generator.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/__pycache__/layer.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/__pycache__/levels.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/__pycache__/movement.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/__pycache__/needs.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/__pycache__/physics.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/__pycache__/ports.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/__pycache__/tracker.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/__pycache__/tracking.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/__pycache__/writer.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/art/__init__.py +196 -0
- azurkit/tools/randomizer/art/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/art/__pycache__/collision.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/art/__pycache__/draw.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/art/__pycache__/icons.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/art/__pycache__/maps.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/art/__pycache__/nodes.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/art/__pycache__/reach.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/art/__pycache__/render.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/art/__pycache__/tern.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/art/collision.py +142 -0
- azurkit/tools/randomizer/art/draw.py +345 -0
- azurkit/tools/randomizer/art/icons.py +265 -0
- azurkit/tools/randomizer/art/maps.py +805 -0
- azurkit/tools/randomizer/art/node_types.json +764 -0
- azurkit/tools/randomizer/art/nodes.py +526 -0
- azurkit/tools/randomizer/art/reach.py +75 -0
- azurkit/tools/randomizer/art/render.py +305 -0
- azurkit/tools/randomizer/art/tern.py +188 -0
- azurkit/tools/randomizer/data/contact.json +509 -0
- azurkit/tools/randomizer/data/derived/a1.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/a3.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/a5.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/a6.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/airship.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/d1.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/d2.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/e2.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/e5.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/e6.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/e7.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/f1.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/f2.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/f3.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/f4.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/f6.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/life.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/town.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/w1.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/w2.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/w3.json.gz +0 -0
- azurkit/tools/randomizer/data/derived/w4.json.gz +0 -0
- azurkit/tools/randomizer/data/forcing.json +2452 -0
- azurkit/tools/randomizer/data/generated/a1.json +2148 -0
- azurkit/tools/randomizer/data/generated/a3.json +606 -0
- azurkit/tools/randomizer/data/generated/a5.json +2301 -0
- azurkit/tools/randomizer/data/generated/a6.json +1687 -0
- azurkit/tools/randomizer/data/generated/airship.json +156 -0
- azurkit/tools/randomizer/data/generated/d1.json +1423 -0
- azurkit/tools/randomizer/data/generated/d2.json +1297 -0
- azurkit/tools/randomizer/data/generated/e2.json +1598 -0
- azurkit/tools/randomizer/data/generated/e5.json +3671 -0
- azurkit/tools/randomizer/data/generated/e6.json +1902 -0
- azurkit/tools/randomizer/data/generated/e7.json +3607 -0
- azurkit/tools/randomizer/data/generated/f1.json +3022 -0
- azurkit/tools/randomizer/data/generated/f2.json +2243 -0
- azurkit/tools/randomizer/data/generated/f3.json +2369 -0
- azurkit/tools/randomizer/data/generated/f4.json +2669 -0
- azurkit/tools/randomizer/data/generated/f6.json +2104 -0
- azurkit/tools/randomizer/data/generated/life.json +2115 -0
- azurkit/tools/randomizer/data/generated/town.json +3555 -0
- azurkit/tools/randomizer/data/generated/training_room.json +375 -0
- azurkit/tools/randomizer/data/generated/w1.json +2692 -0
- azurkit/tools/randomizer/data/generated/w2.json +2400 -0
- azurkit/tools/randomizer/data/generated/w3.json +2964 -0
- azurkit/tools/randomizer/data/generated/w4.json +2686 -0
- azurkit/tools/randomizer/data/items.toml +398 -0
- azurkit/tools/randomizer/data/levels/a1.toml +1213 -0
- azurkit/tools/randomizer/data/levels/a3.toml +344 -0
- azurkit/tools/randomizer/data/levels/a5.toml +1397 -0
- azurkit/tools/randomizer/data/levels/a6.toml +1263 -0
- azurkit/tools/randomizer/data/levels/airship.toml +37 -0
- azurkit/tools/randomizer/data/levels/d1.toml +876 -0
- azurkit/tools/randomizer/data/levels/d2.toml +716 -0
- azurkit/tools/randomizer/data/levels/e2.toml +3393 -0
- azurkit/tools/randomizer/data/levels/e5.toml +1580 -0
- azurkit/tools/randomizer/data/levels/e6.toml +1349 -0
- azurkit/tools/randomizer/data/levels/e7.toml +865 -0
- azurkit/tools/randomizer/data/levels/f1.toml +2544 -0
- azurkit/tools/randomizer/data/levels/f2.toml +1590 -0
- azurkit/tools/randomizer/data/levels/f3.toml +1249 -0
- azurkit/tools/randomizer/data/levels/f4.toml +1061 -0
- azurkit/tools/randomizer/data/levels/f6.toml +1100 -0
- azurkit/tools/randomizer/data/levels/life.toml +571 -0
- azurkit/tools/randomizer/data/levels/town.toml +1139 -0
- azurkit/tools/randomizer/data/levels/w1.toml +1131 -0
- azurkit/tools/randomizer/data/levels/w2.toml +1024 -0
- azurkit/tools/randomizer/data/levels/w3.toml +1743 -0
- azurkit/tools/randomizer/data/levels/w4.toml +422 -0
- azurkit/tools/randomizer/data/movement/a1.json +321 -0
- azurkit/tools/randomizer/data/movement/a3.json +93 -0
- azurkit/tools/randomizer/data/movement/a5.json +141 -0
- azurkit/tools/randomizer/data/movement/a6.json +110 -0
- azurkit/tools/randomizer/data/movement/airship.json +12 -0
- azurkit/tools/randomizer/data/movement/d1.json +60 -0
- azurkit/tools/randomizer/data/movement/d2.json +60 -0
- azurkit/tools/randomizer/data/movement/e2.json +867 -0
- azurkit/tools/randomizer/data/movement/e5.json +392 -0
- azurkit/tools/randomizer/data/movement/e6.json +234 -0
- azurkit/tools/randomizer/data/movement/e7.json +124 -0
- azurkit/tools/randomizer/data/movement/f1.json +601 -0
- azurkit/tools/randomizer/data/movement/f2.json +395 -0
- azurkit/tools/randomizer/data/movement/f3.json +332 -0
- azurkit/tools/randomizer/data/movement/f4.json +250 -0
- azurkit/tools/randomizer/data/movement/f6.json +220 -0
- azurkit/tools/randomizer/data/movement/life.json +12 -0
- azurkit/tools/randomizer/data/movement/town.json +142 -0
- azurkit/tools/randomizer/data/movement/w1.json +188 -0
- azurkit/tools/randomizer/data/movement/w2.json +193 -0
- azurkit/tools/randomizer/data/movement/w3.json +155 -0
- azurkit/tools/randomizer/data/movement/w4.json +59 -0
- azurkit/tools/randomizer/data/proofs.jsonl +21 -0
- azurkit/tools/randomizer/data/route.toml +3627 -0
- azurkit/tools/randomizer/data/settings/defaults.toml +16 -0
- azurkit/tools/randomizer/data/slider_tiers.json +19 -0
- azurkit/tools/randomizer/data/tricks.toml +2432 -0
- azurkit/tools/randomizer/data/world.toml +368 -0
- azurkit/tools/randomizer/dbcache.py +197 -0
- azurkit/tools/randomizer/draft/__init__.py +11 -0
- azurkit/tools/randomizer/draft/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/draft/__pycache__/envelope.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/draft/__pycache__/floors.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/draft/__pycache__/geometry.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/draft/__pycache__/wiring.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/draft/envelope.py +211 -0
- azurkit/tools/randomizer/draft/floors.py +221 -0
- azurkit/tools/randomizer/draft/geometry.py +682 -0
- azurkit/tools/randomizer/draft/tiers.toml +97 -0
- azurkit/tools/randomizer/draft/wiring.py +632 -0
- azurkit/tools/randomizer/generator.py +466 -0
- azurkit/tools/randomizer/layer.py +302 -0
- azurkit/tools/randomizer/levels.py +1134 -0
- azurkit/tools/randomizer/live/__init__.py +15 -0
- azurkit/tools/randomizer/live/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/live/__pycache__/errors.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/live/__pycache__/game.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/live/__pycache__/link.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/live/__pycache__/pages.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/live/__pycache__/recipes.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/live/__pycache__/regions.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/live/errors.py +8 -0
- azurkit/tools/randomizer/live/game.py +775 -0
- azurkit/tools/randomizer/live/link.py +534 -0
- azurkit/tools/randomizer/live/pages.py +76 -0
- azurkit/tools/randomizer/live/recipes.py +168 -0
- azurkit/tools/randomizer/live/regions.py +42 -0
- azurkit/tools/randomizer/movement.py +116 -0
- azurkit/tools/randomizer/needs.py +344 -0
- azurkit/tools/randomizer/physics.py +711 -0
- azurkit/tools/randomizer/planner/__init__.py +8 -0
- azurkit/tools/randomizer/planner/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/planner/__pycache__/difficulty.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/planner/__pycache__/fill.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/planner/__pycache__/grammar.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/planner/__pycache__/loader.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/planner/__pycache__/plan.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/planner/__pycache__/proofs.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/planner/__pycache__/settings.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/planner/__pycache__/solver.cpython-314.pyc +0 -0
- azurkit/tools/randomizer/planner/difficulty.py +547 -0
- azurkit/tools/randomizer/planner/fill.py +1084 -0
- azurkit/tools/randomizer/planner/grammar.py +138 -0
- azurkit/tools/randomizer/planner/loader.py +1764 -0
- azurkit/tools/randomizer/planner/plan.py +905 -0
- azurkit/tools/randomizer/planner/proofs.py +144 -0
- azurkit/tools/randomizer/planner/settings.py +414 -0
- azurkit/tools/randomizer/planner/solver.py +1192 -0
- azurkit/tools/randomizer/ports.py +70 -0
- azurkit/tools/randomizer/shipped/ec11036b553991593c84383ad37ebd62.pickle +4 -0
- azurkit/tools/randomizer/tracker.py +376 -0
- azurkit/tools/randomizer/tracking.py +309 -0
- azurkit/tools/randomizer/writer.py +384 -0
- azurkit/tools/saves/__init__.py +93 -0
- azurkit/tools/saves/__pycache__/__init__.cpython-314.pyc +0 -0
- azurkit/tools/saves/__pycache__/container.cpython-314.pyc +0 -0
- azurkit/tools/saves/__pycache__/fatx.cpython-314.pyc +0 -0
- azurkit/tools/saves/__pycache__/session.cpython-314.pyc +0 -0
- azurkit/tools/saves/__pycache__/sign.cpython-314.pyc +0 -0
- azurkit/tools/saves/container.py +275 -0
- azurkit/tools/saves/fatx.py +275 -0
- azurkit/tools/saves/session.py +92 -0
- azurkit/tools/saves/sign.py +117 -0
- azurkit-1.0.0.dist-info/METADATA +102 -0
- azurkit-1.0.0.dist-info/RECORD +547 -0
- azurkit-1.0.0.dist-info/WHEEL +4 -0
- azurkit-1.0.0.dist-info/entry_points.txt +3 -0
- azurkit-1.0.0.dist-info/licenses/LICENSE +21 -0
- azurkit-1.0.0.dist-info/licenses/NOTICE.md +2108 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
# Imported at Step R1.4 from the R0 evidence repo @ 4b8f3f3 (db-draft/world.toml), re-imported at Step R1.4b @ 7530b0b (D145, rjc5), format keys /1; R0's scripts stay there.
|
|
2
|
+
# Below, FORMAT is docs/RANDOMIZER_DB.md, db-draft/ is azurik_mod/randomizer/data/, and R0's checks (db_check.py,
|
|
3
|
+
# tricks_check.py) are `azurik-mod rando check`.
|
|
4
|
+
# world.toml: start, hub, victory, the trick families and the non-monotone mechanisms (DRAFT, R0.6, 2026-10-11;
|
|
5
|
+
# trick families revised 2026-10-12 for D113; six added for D120).
|
|
6
|
+
# Spec: db-draft/FORMAT.md section 7.
|
|
7
|
+
|
|
8
|
+
format = "azurik-rando-world/1" # prefilled
|
|
9
|
+
start = "w1_beach" # migrated, unverified (starting_node; the owner's notes agree)
|
|
10
|
+
hub = "town_central" # prefilled (RANDOMIZER_PLAN section 2.3; logic_db's town_core)
|
|
11
|
+
victory = "flag:d1.spideyzar.killed" # prefilled (D76 / RQ-1; replaces logic_db's discs + placement events)
|
|
12
|
+
starting_items = [] # migrated, unverified
|
|
13
|
+
# logic_db victory_condition was: {"type":"all_of","items":["disc_air","disc_water","disc_fire","disc_earth","disc_life","event_place_disc_air","event_place_disc_water","event_place_disc_fire","event_place_disc_earth","event_place_disc_life"]} # migrated, unverified
|
|
14
|
+
|
|
15
|
+
# Trick families (D113, 2026-10-12): a trick has no tier; difficulty sits on each skip, in the levels' [[skip]]
|
|
16
|
+
# lists (FORMAT 4.8). Drafted from tricks/tricks.toml, whose `name` and `description` project here (tricks_check).
|
|
17
|
+
# Before D113 each entry also carried default_tier (bskip 2, pstorage 3, saveanywhere 5, rjump 3, tjump 3, itrig 3,
|
|
18
|
+
# nolight 1; prefilled proposals).
|
|
19
|
+
|
|
20
|
+
[[trick]] # drafted (D113)
|
|
21
|
+
name = "bskip" # prefilled (OWNER_NOTES)
|
|
22
|
+
description = "barrier skips: a general term for skipping any barrier, such as the fire barrier between w1 and town (e.g. around it with air power 2)" # drafted from tricks/tricks.toml (the owner's words, shortened)
|
|
23
|
+
|
|
24
|
+
[[trick]] # drafted (D113)
|
|
25
|
+
name = "pstorage" # prefilled (OWNER_NOTES)
|
|
26
|
+
description = "power storage: in the tutorial select powers with LT held but don't evoke them, load another save, then release LT: the power is evoked even if that save has no access to it (e.g. an air flap with no air levels)" # drafted from tricks/tricks.toml (the owner's words, shortened)
|
|
27
|
+
|
|
28
|
+
[[trick]] # drafted (D113)
|
|
29
|
+
name = "saveanywhere" # prefilled (OWNER_NOTES)
|
|
30
|
+
description = "save anywhere: the in-game cheat White, Up, Down, A, B, right-stick press saves anywhere; saving and reloading allows falling infinitely, resets fall damage, or rarely clips through geometry" # drafted from tricks/tricks.toml (the owner's words, shortened)
|
|
31
|
+
|
|
32
|
+
[[trick]] # drafted (D113)
|
|
33
|
+
name = "rjump" # prefilled (OWNER_NOTES)
|
|
34
|
+
description = "roll jump: chain rolls off a ledge and jump on the frame a roll ends; the fall is cancelled and air flaps work again; limited by deaths after free falling too long" # drafted from tricks/tricks.toml (the owner's words, shortened)
|
|
35
|
+
|
|
36
|
+
[[trick]] # drafted (D113)
|
|
37
|
+
name = "tjump" # prefilled (OWNER_NOTES)
|
|
38
|
+
description = "tree jump: hold up and press jump repeatedly on a ladder against certain geometry, with no air shield worn, to charge jump velocity, released as a super jump at the top; mostly used to skip the puzzle that opens the Great Tree to the air realm, with no powers" # drafted from tricks/tricks.toml (the owner's words, shortened)
|
|
39
|
+
|
|
40
|
+
[[trick]] # drafted (D113)
|
|
41
|
+
name = "itrig" # prefilled (OWNER_NOTES)
|
|
42
|
+
description = "invisible triggers: clip through the level geometry in a few rare places and activate a trigger such as a level-loading zone; mostly in w1, to skip the dark cave and reach the alternate route to town where a water disc fragment is" # drafted from tricks/tricks.toml (the owner's words, shortened)
|
|
43
|
+
|
|
44
|
+
[[trick]] # drafted (D113)
|
|
45
|
+
name = "nolight" # prefilled (OWNER_NOTES)
|
|
46
|
+
description = "no light: doing a dark room or maze without the fire power; possible but inconvenient" # drafted from tricks/tricks.toml (the owner's words, shortened)
|
|
47
|
+
|
|
48
|
+
# D120 (owner, 2026-10-12): the six video moves become families, each its own and with no tier; their skips stay
|
|
49
|
+
# held until xemu or the owner confirms them (D114).
|
|
50
|
+
|
|
51
|
+
[[trick]] # D120 (owner, 2026-10-12)
|
|
52
|
+
name = "elevbounce" # D120
|
|
53
|
+
description = "elevator bounce: land on the moving d1 central-spire elevator at the right moment and spot (holding forward, steadied with flaps) and bounce past most or all of its puzzle" # drafted from tricks/tricks.toml (VIDEO_CATALOGUE 1.2, in plain words)
|
|
54
|
+
|
|
55
|
+
[[trick]] # D120 (owner, 2026-10-12)
|
|
56
|
+
name = "iceclimb" # D120
|
|
57
|
+
description = "ice climb: get up slippery ice, or a slide meant for coming down, by hopping up its centre line or flying it with flaps (w3's ice jet or bridge to frag_fire_1 without the frost switch; the e6 slide)" # drafted from tricks/tricks.toml (VIDEO_CATALOGUE 1.2, in plain words)
|
|
58
|
+
|
|
59
|
+
[[trick]] # D120 (owner, 2026-10-12)
|
|
60
|
+
name = "ledgepop" # D120
|
|
61
|
+
description = "ledge pop: from high ground, drop off one ledge just right and Azurik pops up the wall; in f4 it skips most of the level and the Blaze Sentinel fight on the way to the battle platform, and needs a lot of air fuel" # drafted from tricks/tricks.toml (VIDEO_CATALOGUE 1.2, in plain words)
|
|
62
|
+
|
|
63
|
+
[[trick]] # D120 (owner, 2026-10-12)
|
|
64
|
+
name = "elevjump" # D120
|
|
65
|
+
description = "lift jump: jump at the top of a rising lift, or touch a moving platform while moving, and keep its speed for extra height (f3's lifts, e2's tower lift, e5's moving platform)" # drafted from tricks/tricks.toml (VIDEO_CATALOGUE 1.2, in plain words)
|
|
66
|
+
|
|
67
|
+
[[trick]] # D120 (owner, 2026-10-12)
|
|
68
|
+
name = "botstep" # D120
|
|
69
|
+
description = "bot step: draw enemies' attention and use their invisible hitboxes as steps (w3, over the icebergs); how it is done is not known" # drafted from tricks/tricks.toml (VIDEO_CATALOGUE 1.2, in plain words)
|
|
70
|
+
|
|
71
|
+
[[trick]] # D120 (owner, 2026-10-12)
|
|
72
|
+
name = "flipcancel" # D120
|
|
73
|
+
description = "flip cancel: a little flip on landing after a roll jump cancels momentum that would otherwise kill (a5's monolith); the input is not known" # drafted from tricks/tricks.toml (VIDEO_CATALOGUE 1.2, in plain words)
|
|
74
|
+
|
|
75
|
+
[[trick]] # D630 (owner, 2026-10-24, Step R2.18)
|
|
76
|
+
name = "flutter" # D630: the owner's name, "air fluttering"
|
|
77
|
+
description = "air fluttering: in mid-air, cast the air armor again (LT+Y) once its flaps are spent, for another flap, at 2 air fuel a cast; a flight is bounded by the air fuel, not the armor's flap count" # drafted from tricks/tricks.toml (the owner's X.67 demo, D630)
|
|
78
|
+
|
|
79
|
+
# Time-savers (D145, owner 2026-10-12, verbatim: "keep in mind some of the tricks you saw in the speedrun video are
|
|
80
|
+
# not skips, bur rather just meant to save time."): each goes where plain movement with the same kit already goes,
|
|
81
|
+
# only faster, so it is never in logic. Listed here (id, name, level, tricks; projected from tricks/tricks.toml
|
|
82
|
+
# [[time_saver]], which tricks_check checks) for the spoiler's routing notes and so the loader can refuse one in
|
|
83
|
+
# logic: no expression may name skip:<its id>, no level file may hold it, and no settings toggle may name it
|
|
84
|
+
# (FORMAT 4.9). The level files never name one.
|
|
85
|
+
|
|
86
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
87
|
+
id = "w1.rjump_teleporter_island"
|
|
88
|
+
name = "w1 teleporter-island roll jump"
|
|
89
|
+
level = "w1"
|
|
90
|
+
tricks = ["rjump"]
|
|
91
|
+
|
|
92
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
93
|
+
id = "f3.rjump_earth_frag"
|
|
94
|
+
name = "f3 roll jump to frag_earth_2"
|
|
95
|
+
level = "f3"
|
|
96
|
+
tricks = ["rjump"]
|
|
97
|
+
|
|
98
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
99
|
+
id = "f3.rjump_earth_power"
|
|
100
|
+
name = "f3 roll jump to the earth power 1 platform"
|
|
101
|
+
level = "f3"
|
|
102
|
+
tricks = ["rjump"]
|
|
103
|
+
|
|
104
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
105
|
+
id = "e2.rjump_lethal_drop"
|
|
106
|
+
name = "e2 four-roll lethal drop"
|
|
107
|
+
level = "e2"
|
|
108
|
+
tricks = ["rjump"]
|
|
109
|
+
|
|
110
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
111
|
+
id = "e2.rjump_entrance_tree"
|
|
112
|
+
name = "e2 four-roll jump into the tree"
|
|
113
|
+
level = "e2"
|
|
114
|
+
tricks = ["rjump"]
|
|
115
|
+
|
|
116
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
117
|
+
id = "e2.rjump_gondola_key_slope"
|
|
118
|
+
name = "e2 roll jump down the slope (second gondola key)"
|
|
119
|
+
level = "e2"
|
|
120
|
+
tricks = ["rjump"]
|
|
121
|
+
|
|
122
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
123
|
+
id = "e2.rjump_drill_room_drop"
|
|
124
|
+
name = "e2 drill-room roll jump"
|
|
125
|
+
level = "e2"
|
|
126
|
+
tricks = ["rjump"]
|
|
127
|
+
|
|
128
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
129
|
+
id = "e2.rjump_bridge"
|
|
130
|
+
name = "e2 three-roll jump onto the bridge"
|
|
131
|
+
level = "e2"
|
|
132
|
+
tricks = ["rjump"]
|
|
133
|
+
|
|
134
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
135
|
+
id = "e2.rjump_excavator"
|
|
136
|
+
name = "e2 roll jump to the excavator"
|
|
137
|
+
level = "e2"
|
|
138
|
+
tricks = ["rjump"]
|
|
139
|
+
|
|
140
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
141
|
+
id = "e5.rjump_conveyor_ladder"
|
|
142
|
+
name = "e5 conveyor roll jump to the ladder (air 2)"
|
|
143
|
+
level = "e5"
|
|
144
|
+
tricks = ["rjump"]
|
|
145
|
+
|
|
146
|
+
[[time_saver]] # Step R1.31b (2026-10-19, the owner's X.35 C3)
|
|
147
|
+
id = "e5.rjump_conveyor_ladder_air1"
|
|
148
|
+
name = "e5 conveyor roll jump to the ladder (air 1)"
|
|
149
|
+
level = "e5"
|
|
150
|
+
tricks = ["rjump"]
|
|
151
|
+
|
|
152
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
153
|
+
id = "e5.rjump_five_roll_drop"
|
|
154
|
+
name = "e5 five-roll drop (air 2)"
|
|
155
|
+
level = "e5"
|
|
156
|
+
tricks = ["rjump"]
|
|
157
|
+
|
|
158
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
159
|
+
id = "e5.double_rjump_earth_power2"
|
|
160
|
+
name = "e5 double roll jump to earth power 2"
|
|
161
|
+
level = "e5"
|
|
162
|
+
tricks = ["rjump"]
|
|
163
|
+
|
|
164
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
165
|
+
id = "e6.rjump_entrance_drop"
|
|
166
|
+
name = "e6 three-roll drop after the entrance"
|
|
167
|
+
level = "e6"
|
|
168
|
+
tricks = ["rjump"]
|
|
169
|
+
|
|
170
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
171
|
+
id = "a1.rjump_branches"
|
|
172
|
+
name = "a1 branch-to-branch roll jump"
|
|
173
|
+
level = "a1"
|
|
174
|
+
tricks = ["rjump"]
|
|
175
|
+
|
|
176
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
177
|
+
id = "a1.pipe_flight"
|
|
178
|
+
name = "a1 pipe flight to the tree top"
|
|
179
|
+
level = "a1"
|
|
180
|
+
tricks = ["rjump"]
|
|
181
|
+
|
|
182
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
183
|
+
id = "a5.monolith_flipcancel"
|
|
184
|
+
name = "a5 monolith roll jump with a flip cancel"
|
|
185
|
+
level = "a5"
|
|
186
|
+
tricks = ["rjump", "flipcancel"]
|
|
187
|
+
|
|
188
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
189
|
+
id = "town.towerfall_centre"
|
|
190
|
+
name = "town centre towerfall (five-roll jump)"
|
|
191
|
+
level = "town"
|
|
192
|
+
tricks = ["rjump"]
|
|
193
|
+
|
|
194
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
195
|
+
id = "d1.spires"
|
|
196
|
+
name = "d1 spires (skips d2)"
|
|
197
|
+
level = "d1"
|
|
198
|
+
tricks = ["rjump"]
|
|
199
|
+
|
|
200
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
201
|
+
id = "a6.rjump_platforms_green"
|
|
202
|
+
name = "a6 roll jumps to the green key"
|
|
203
|
+
level = "a6"
|
|
204
|
+
tricks = ["rjump"]
|
|
205
|
+
|
|
206
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
207
|
+
id = "a6.iceblock010_air2"
|
|
208
|
+
name = "a6 IceBlock_010 round the end (air 2)"
|
|
209
|
+
level = "a6"
|
|
210
|
+
tricks = ["bskip"]
|
|
211
|
+
|
|
212
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
213
|
+
id = "a6.iceblock012_air2"
|
|
214
|
+
name = "a6 IceBlock_012 round the end (air 2)"
|
|
215
|
+
level = "a6"
|
|
216
|
+
tricks = ["bskip"]
|
|
217
|
+
|
|
218
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
219
|
+
id = "e6.firewall01_air1"
|
|
220
|
+
name = "e6 FireWall_01 (air 1)"
|
|
221
|
+
level = "e6"
|
|
222
|
+
tricks = ["bskip"]
|
|
223
|
+
|
|
224
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
225
|
+
id = "w2.iceblock01_air3"
|
|
226
|
+
name = "w2 IceBlock_01 (air 3)"
|
|
227
|
+
level = "w2"
|
|
228
|
+
tricks = ["bskip"]
|
|
229
|
+
|
|
230
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
231
|
+
id = "w3.iceblock016_air2"
|
|
232
|
+
name = "w3 IceBlock_016 (air 2)"
|
|
233
|
+
level = "w3"
|
|
234
|
+
tricks = ["bskip"]
|
|
235
|
+
|
|
236
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
237
|
+
id = "w3.iceblock024_air1"
|
|
238
|
+
name = "w3 IceBlock_024 (air 1)"
|
|
239
|
+
level = "w3"
|
|
240
|
+
tricks = ["bskip"]
|
|
241
|
+
|
|
242
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
243
|
+
id = "w3.iceblock024_no_air"
|
|
244
|
+
name = "w3 IceBlock_024 (no air)"
|
|
245
|
+
level = "w3"
|
|
246
|
+
tricks = ["bskip"]
|
|
247
|
+
|
|
248
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
249
|
+
id = "w3.iceblock026_air2"
|
|
250
|
+
name = "w3 IceBlock_026 (air 2)"
|
|
251
|
+
level = "w3"
|
|
252
|
+
tricks = ["bskip"]
|
|
253
|
+
|
|
254
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
255
|
+
id = "a6.acid_fly_around"
|
|
256
|
+
name = "a6 level-3 acid fly-around (a key)"
|
|
257
|
+
level = "a6"
|
|
258
|
+
tricks = ["bskip"]
|
|
259
|
+
|
|
260
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
261
|
+
id = "e2.firewall_walkthrough"
|
|
262
|
+
name = "e2 lit fire wall walk-through (fire power 1)"
|
|
263
|
+
level = "e2"
|
|
264
|
+
tricks = ["bskip"]
|
|
265
|
+
|
|
266
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
267
|
+
id = "e6.vine_launch_upper"
|
|
268
|
+
name = "e6 vine launch to the upper section"
|
|
269
|
+
level = "e6"
|
|
270
|
+
tricks = ["tjump"]
|
|
271
|
+
|
|
272
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
273
|
+
id = "a1.air_tube_oob"
|
|
274
|
+
name = "a1 out-of-bounds to the air tubes"
|
|
275
|
+
level = "a1"
|
|
276
|
+
tricks = ["itrig", "rjump"]
|
|
277
|
+
|
|
278
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
279
|
+
id = "e5.dark_interior_nolight"
|
|
280
|
+
name = "e5 frag_fire_3 interior without light"
|
|
281
|
+
level = "e5"
|
|
282
|
+
tricks = ["nolight"]
|
|
283
|
+
|
|
284
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
285
|
+
id = "f3.elevjump_earth_frag"
|
|
286
|
+
name = "f3 lift boost to frag_earth_2"
|
|
287
|
+
level = "f3"
|
|
288
|
+
tricks = ["elevjump"]
|
|
289
|
+
|
|
290
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
291
|
+
id = "e2.elevjump_excavator_key1"
|
|
292
|
+
name = "e2 tower lift jump to excavator key 1"
|
|
293
|
+
level = "e2"
|
|
294
|
+
tricks = ["elevjump"]
|
|
295
|
+
|
|
296
|
+
[[time_saver]] # D145 (2026-10-12)
|
|
297
|
+
id = "e5.elevjump_earth_power2"
|
|
298
|
+
name = "e5 moving-platform jump to earth power 2"
|
|
299
|
+
level = "e5"
|
|
300
|
+
tricks = ["elevjump"]
|
|
301
|
+
|
|
302
|
+
[[time_saver]] # Step R2.17b (2026-10-24, the owner's D657)
|
|
303
|
+
id = "w3.botstep_icebergs"
|
|
304
|
+
name = "w3 bot steps over the icebergs"
|
|
305
|
+
level = "w3"
|
|
306
|
+
tricks = ["botstep"]
|
|
307
|
+
|
|
308
|
+
[[time_saver]] # Step R2.18 (2026-10-24, the owner's X.67 demo, D655)
|
|
309
|
+
id = "f6.seal_skip"
|
|
310
|
+
name = "fire power 3 / fire disc 4 skip (f6 seal)"
|
|
311
|
+
level = "f6"
|
|
312
|
+
tricks = ["bskip"]
|
|
313
|
+
|
|
314
|
+
[[time_saver]] # Step R2.18 (2026-10-24, the owner's X.67 demo, D656)
|
|
315
|
+
id = "a5.rings_air_power3"
|
|
316
|
+
name = "a5 ring roll jump to air power 3"
|
|
317
|
+
level = "a5"
|
|
318
|
+
tricks = ["rjump"]
|
|
319
|
+
# Non-monotone mechanisms (RANDOMIZER_PLAN section 3.1): the loader refuses a database that uses one without
|
|
320
|
+
# declaring it here. Handling: forfeitable | product_bit | out_of_logic | harmless | keys_vanilla.
|
|
321
|
+
|
|
322
|
+
[[mechanism]] # prefilled
|
|
323
|
+
id = "disc_teleport" # prefilled
|
|
324
|
+
kind = "one_shot_teleport" # prefilled
|
|
325
|
+
handling = "forfeitable" # prefilled (RQ-4 / D81)
|
|
326
|
+
note = "a6, w3, f6, e5: count >= 4 AND the town has not placed the disc; w1 BossDefeated: water >= 4 and a touch, no placed check; life: none (thresholds/disc_chains.txt). Level-triggered [inferred, static: the gameState is refreshed every frame, 0x711C0]; TODO(R0.4b-ii) I-7(a,d,e)" # prefilled
|
|
327
|
+
|
|
328
|
+
[[mechanism]] # prefilled
|
|
329
|
+
id = "timed_barriers" # prefilled
|
|
330
|
+
kind = "respawn" # prefilled
|
|
331
|
+
handling = "harmless" # prefilled proposal
|
|
332
|
+
note = "barriers with persist timed or level_reset are re-checked on every crossing; the 32 FireWall OpenNCloseToggles are unsaved with a stored turnOff (thresholds/barrier_levels.txt) [inferred, static]; TODO(R0.4b-i) I-8, I-15" # prefilled
|
|
333
|
+
|
|
334
|
+
[[mechanism]] # prefilled
|
|
335
|
+
id = "toggles" # prefilled
|
|
336
|
+
kind = "toggle" # prefilled
|
|
337
|
+
handling = "out_of_logic" # prefilled proposal
|
|
338
|
+
note = "a toggle whose off state gates an edge is a load error until modelled (RANDOMIZER_PLAN 2.5)" # prefilled
|
|
339
|
+
|
|
340
|
+
[[mechanism]] # prefilled
|
|
341
|
+
id = "key_slot_cap" # prefilled
|
|
342
|
+
kind = "capacity" # prefilled
|
|
343
|
+
handling = "keys_vanilla" # prefilled proposal
|
|
344
|
+
note = "5 key slots, a 6th type is refused [verified static, RAM_RECIPES section 4: 0x58090, 0x587B0]; TODO(R0.4a) confirm in xemu, then RANDOMIZER_PLAN risk 4 applies" # prefilled
|
|
345
|
+
|
|
346
|
+
[[mechanism]] # prefilled
|
|
347
|
+
id = "w4_daynight" # prefilled
|
|
348
|
+
kind = "cycle" # prefilled
|
|
349
|
+
handling = "harmless" # prefilled proposal
|
|
350
|
+
note = "the 5 fan platforms unfold while day night timer is in [0.25,0.75) (generated/w4.json; thresholds/w4_daynight.txt); no clock-driven node is saved (wiring/saved_nodes.json), so nothing latches on the clock [inferred]: a wait, not a flag; TODO(owner, R0.7) I-19" # prefilled
|
|
351
|
+
|
|
352
|
+
[[mechanism]] # prefilled
|
|
353
|
+
id = "gem_fuel_upgrade" # prefilled
|
|
354
|
+
kind = "spend" # prefilled
|
|
355
|
+
handling = "out_of_logic" # prefilled proposal
|
|
356
|
+
note = "a gem pickup can run the fuel-cap upgrade, which subtracts gems from the slot (0x58639-0x58642) and raises a fuel cap (0x586BB) [verified static, ramdis.py dis 0x585f0:70; RAM_RECIPES section 2.1]; the gem counters count items collected, not the in-game value, so a data gate on the in-game gem counters is non-monotone; gems stay out of v1 logic (plan 2.8)" # prefilled
|
|
357
|
+
|
|
358
|
+
[[mechanism]] # prefilled
|
|
359
|
+
id = "minecart_e2e5" # prefilled
|
|
360
|
+
kind = "cart" # prefilled
|
|
361
|
+
handling = "out_of_logic" # prefilled proposal
|
|
362
|
+
note = "e2-side one-bit state DownToggle (saved), set by riding SwitchE5a and cleared only by arriving at E5a_E2a and touching TriggerShape (logic_dump.py e2); e5's MineCarToggle is e5's side [inferred, static]; both e2 gondolas need the 2 key_circuitboard locks [inferred, physical]; TODO(R0.4b-ii) I-10" # prefilled
|
|
363
|
+
|
|
364
|
+
[[mechanism]] # prefilled
|
|
365
|
+
id = "minecart_e2e7" # prefilled
|
|
366
|
+
kind = "cart" # prefilled
|
|
367
|
+
handling = "harmless" # prefilled proposal
|
|
368
|
+
note = "e2-side one-bit state DownToggle1 (saved), cleared by arriving at E7_E2 and touching Trigger2Shape; e7's only exit E7_E2_switch lands at E7_E2 (generated/e7.json), so the round trip resets it [inferred, static]; SwitchE5a1 is the only exit into e7 (generated), so it stays in logic, with both circuitboard locks [inferred, physical]; TODO(R0.4b-ii)" # prefilled
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""The planner loader's database key and load (``planner/loader.py``'s
|
|
2
|
+
``load_database`` and ``kept_logic`` call them), in place of Modkit's
|
|
3
|
+
``planner/dbcache.py``, which keeps the checked database as a pickle in the
|
|
4
|
+
user cache. AzurKit keeps none on disk: the site's worker has no lasting
|
|
5
|
+
disk, and a pickle read back from a folder the program writes runs what it
|
|
6
|
+
holds. ``kept_logic`` keeps the :class:`~.planner.solver.Logic` it builds
|
|
7
|
+
for the process, under :func:`entry`'s key.
|
|
8
|
+
|
|
9
|
+
The wheel and the frozen app ship the checked database instead (Step 4.3g,
|
|
10
|
+
P4): ``shipped/<key>.pickle`` beside this module, which their builds write
|
|
11
|
+
(:func:`ship`, from ``scripts/web_tools.py`` and ``scripts/freeze.py``;
|
|
12
|
+
generated, never in the checkout). :func:`load` serves it for the key it was
|
|
13
|
+
made for, so a changed data file or planner module reads and checks the
|
|
14
|
+
database as before (about 4 s); it is read only from the wheel (its RECORD
|
|
15
|
+
lists it) or the frozen app, never from a checkout. Its file holds the
|
|
16
|
+
database's skip table first (:func:`shipped_skips`: a page's remembered
|
|
17
|
+
randomizer is checked against it, about 14 KB, never the 87.6 MB logic,
|
|
18
|
+
Step 4.4bd), then the database; the logic's read is counted.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import dataclasses
|
|
24
|
+
import gc
|
|
25
|
+
import hashlib
|
|
26
|
+
import importlib.metadata
|
|
27
|
+
import io
|
|
28
|
+
import pickle
|
|
29
|
+
import sys
|
|
30
|
+
from collections.abc import Callable
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
|
|
33
|
+
from azurkit.core import progress
|
|
34
|
+
|
|
35
|
+
PLANNER = Path(__file__).resolve().parent / "planner"
|
|
36
|
+
SHIPPED = Path(__file__).resolve().parent / "shipped"
|
|
37
|
+
# The frozen app's planner is in its archive, not files, sealed with the data it ships: its key is the data's alone.
|
|
38
|
+
FROZEN = bool(getattr(sys, "frozen", False))
|
|
39
|
+
NOTES = 20 # the logic's read is a core.progress note each twentieth of its file ("reading its logic, k of 20")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def entry(root: Path, planner: Path | None = None if FROZEN else PLANNER) -> Path:
|
|
43
|
+
"""The key of the database at ``root``, as a path whose name is the
|
|
44
|
+
sha256 (32 hex digits) of the name and bytes of each file under it and
|
|
45
|
+
under the planner's code (``planner``; None: the data's alone, as the
|
|
46
|
+
frozen app's): a changed file gives another key. Each file's bytes are
|
|
47
|
+
hashed again only once its size or its modification or change time
|
|
48
|
+
differs (:func:`_file`): ``kept_logic`` asks the key each call, eight
|
|
49
|
+
times in a plan's first tracker view."""
|
|
50
|
+
h = hashlib.sha256()
|
|
51
|
+
for folder in (Path(root), *([planner] if planner is not None else [])):
|
|
52
|
+
for path in sorted(folder.rglob("*")):
|
|
53
|
+
if path.is_file() and "__pycache__" not in path.parts:
|
|
54
|
+
h.update(f"{path.relative_to(folder).as_posix()}\0".encode())
|
|
55
|
+
h.update(_file(path))
|
|
56
|
+
return Path(h.hexdigest()[:32])
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
_FILES: dict[Path, tuple[tuple[int, int, int], bytes]] = {} # a file -> (its size and times, its bytes' sha256)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _file(path: Path) -> bytes:
|
|
63
|
+
"""The sha256 of ``path``'s bytes, kept while its size, modification and change times stay as they were."""
|
|
64
|
+
at = path.stat()
|
|
65
|
+
stamp = (at.st_size, at.st_mtime_ns, at.st_ctime_ns)
|
|
66
|
+
if (kept := _FILES.get(path)) is not None and kept[0] == stamp:
|
|
67
|
+
return kept[1]
|
|
68
|
+
digest = hashlib.sha256(path.read_bytes()).digest()
|
|
69
|
+
_FILES[path] = (stamp, digest)
|
|
70
|
+
return digest
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _path(root: Path, key: str | None = None) -> Path | None:
|
|
74
|
+
"""The shipped file of ``root``'s key (``key``, :func:`entry`'s when the caller has it, else worked out now), or
|
|
75
|
+
None (no such file, or this isn't the wheel's or the frozen app's own)."""
|
|
76
|
+
if not SHIPPED.is_dir():
|
|
77
|
+
return None
|
|
78
|
+
path = SHIPPED / f"{key or entry(root).name}.pickle"
|
|
79
|
+
return path if path.is_file() and (FROZEN or _installed(path)) else None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _table(skips: object, path: Path) -> dict:
|
|
83
|
+
"""The skip table read from the front of ``path``, or :class:`RuntimeError` naming a file of another layout."""
|
|
84
|
+
if not isinstance(skips, dict):
|
|
85
|
+
raise RuntimeError(f"{path.name}: not a shipped database of this AzurKit's layout (its skip table, then its "
|
|
86
|
+
"database)")
|
|
87
|
+
return skips
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class _Counted(io.RawIOBase):
|
|
91
|
+
"""``raw`` read on, each twentieth of its ``size`` read a core.progress
|
|
92
|
+
note ("reading its logic, k of 20"), so the logic's read is counted by
|
|
93
|
+
the bytes it has taken (Step 4.4bd)."""
|
|
94
|
+
|
|
95
|
+
def __init__(self, raw: io.RawIOBase, size: int):
|
|
96
|
+
self.raw, self.size, self.done, self.told = raw, max(size, 1), 0, 0
|
|
97
|
+
|
|
98
|
+
def readable(self) -> bool:
|
|
99
|
+
return True
|
|
100
|
+
|
|
101
|
+
def readinto(self, buffer) -> int:
|
|
102
|
+
got = self.raw.readinto(buffer)
|
|
103
|
+
self.done += got
|
|
104
|
+
if (k := min(self.done * NOTES // self.size + 1, NOTES)) > self.told:
|
|
105
|
+
self.told = k
|
|
106
|
+
progress.note(f"reading its logic, {k} of {NOTES}")
|
|
107
|
+
return got
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def shipped(root: Path, key: str | None = None) -> tuple | None:
|
|
111
|
+
"""(the checked database at ``root``, its Logic's tables, its memos'
|
|
112
|
+
types) as the wheel's or the frozen app's build made them for ``root``'s
|
|
113
|
+
key (``key``, :func:`entry`'s, when the caller has it), its ``root``
|
|
114
|
+
put back, or None (as :func:`_path`). It is read as a stream, counted
|
|
115
|
+
(:class:`_Counted`). What it reads (about a million
|
|
116
|
+
objects, kept for the process) is frozen out of the cycle collector's
|
|
117
|
+
walks (``gc.freeze``): read at once, two full walks of it (0.4 s each,
|
|
118
|
+
the GIL held) came with the next call's allocations, which held the app's
|
|
119
|
+
server, a model's pictures asked meanwhile waiting a second (train B2)."""
|
|
120
|
+
if (path := _path(root, key)) is None:
|
|
121
|
+
return None
|
|
122
|
+
with open(path, "rb", buffering=0) as raw:
|
|
123
|
+
stream = io.BufferedReader(_Counted(raw, path.stat().st_size), 1 << 20)
|
|
124
|
+
_table(pickle.Unpickler(stream).load(), path) # the skip table ahead of it (shipped_skips')
|
|
125
|
+
db, tables, memos = pickle.Unpickler(stream).load()
|
|
126
|
+
gc.freeze()
|
|
127
|
+
db.root = Path(root)
|
|
128
|
+
return db, tables, memos
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def shipped_skips(root: Path) -> dict | None:
|
|
132
|
+
"""The shipped database's skip table (``{id: skip}``, the skips of
|
|
133
|
+
its ``skips``, each beside its level there), read from the front of its
|
|
134
|
+
file (about 14 KB, not the 87.6 MB of the database after it), or None
|
|
135
|
+
(as :func:`_path`): what a page's remembered randomizer is checked
|
|
136
|
+
against without reading the logic (Step 4.4bd)."""
|
|
137
|
+
if (path := _path(root)) is None:
|
|
138
|
+
return None
|
|
139
|
+
with path.open("rb") as f:
|
|
140
|
+
return _table(pickle.load(f), path)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _installed(path: Path) -> bool:
|
|
144
|
+
"""Whether ``path`` is a file the installed wheel put there (its RECORD lists it)."""
|
|
145
|
+
try:
|
|
146
|
+
files = importlib.metadata.files("azurkit") or []
|
|
147
|
+
except importlib.metadata.PackageNotFoundError:
|
|
148
|
+
return False
|
|
149
|
+
rel = path.relative_to(path.parents[4]).as_posix() # azurkit/tools/randomizer/shipped/<key>.pickle
|
|
150
|
+
return any(f.as_posix() == rel and Path(f.locate()).resolve() == path for f in files)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def load[T](root: Path, build: Callable[[Path], T]) -> T:
|
|
154
|
+
"""The database at ``root``: the shipped one for its key (:func:`shipped`), else read and checked now
|
|
155
|
+
(``build(root)``)."""
|
|
156
|
+
got = shipped(root)
|
|
157
|
+
return got[0] if got is not None else build(root)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def shipped_logic(root: Path, logic_type: type, key: str | None = None) -> object | None:
|
|
161
|
+
"""A ``logic_type`` (the planner's Logic) of :func:`shipped`'s database
|
|
162
|
+
(for ``key``, the loader's, so it is worked out once) with the tables
|
|
163
|
+
its build made and its memos empty, or None: the loader's
|
|
164
|
+
``kept_logic`` builds one in about 1.4 s otherwise."""
|
|
165
|
+
if (got := shipped(root, key)) is None:
|
|
166
|
+
return None
|
|
167
|
+
db, tables, memos = got
|
|
168
|
+
logic = logic_type.__new__(logic_type)
|
|
169
|
+
vars(logic).update(tables, db=db, **{name: kind() for name, kind in memos.items()})
|
|
170
|
+
return logic
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def ship(out: Path, planner: Path | None = PLANNER) -> Path:
|
|
174
|
+
"""Check the shipped database and write ``out/<key>.pickle`` (the key
|
|
175
|
+
:func:`entry` gives under ``planner``): its skip table
|
|
176
|
+
(:func:`shipped_skips`), then the database with its ``root``
|
|
177
|
+
dropped, so no path of the checkout that built it is in it, the tables
|
|
178
|
+
its Logic built and its memos' types. Only under ``PYTHONHASHSEED=0``
|
|
179
|
+
(never ``python -I``, which ignores it), so its sets pickle in one order
|
|
180
|
+
and a build gives the same bytes every time."""
|
|
181
|
+
if sys.flags.hash_randomization:
|
|
182
|
+
raise RuntimeError("the shipped database is written under PYTHONHASHSEED=0 (not python -I, which ignores it)")
|
|
183
|
+
from azurkit.tools.randomizer.planner import loader
|
|
184
|
+
from azurkit.tools.randomizer.planner.solver import Logic
|
|
185
|
+
|
|
186
|
+
report = loader.check_database(loader.DATA_DIR)
|
|
187
|
+
if report.issues:
|
|
188
|
+
raise loader.DatabaseError(loader.DATA_DIR, report.issues)
|
|
189
|
+
logic = Logic(report.database)
|
|
190
|
+
tables = {k: v for k, v in vars(logic).items() if k not in loader._MEMOS}
|
|
191
|
+
memos = {k: type(v) for k, v in vars(logic).items() if k in loader._MEMOS and k != "db"}
|
|
192
|
+
path = Path(out) / f"{entry(loader.DATA_DIR, planner).name}.pickle"
|
|
193
|
+
skips = {sid: s for sid, (_, s) in report.database.skips.items()}
|
|
194
|
+
path.write_bytes(pickle.dumps(skips, pickle.HIGHEST_PROTOCOL)
|
|
195
|
+
+ pickle.dumps((dataclasses.replace(report.database, root=None), tables, memos),
|
|
196
|
+
pickle.HIGHEST_PROTOCOL))
|
|
197
|
+
return path
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Randomizer authoring drafts: tools that derive logic data from the game.
|
|
2
|
+
|
|
3
|
+
Authoring only (REORG_PLAN Phase R1, §12.1's layout): the planner and the
|
|
4
|
+
writer never import this package. :mod:`.envelope` holds the movement
|
|
5
|
+
tiers as margins over the physics envelope (``tiers.toml``,
|
|
6
|
+
:mod:`azurkit.tools.randomizer.physics`);
|
|
7
|
+
:mod:`.reach` is the reach model (:mod:`.geometry`, :mod:`.floors`,
|
|
8
|
+
:mod:`.flights`, :mod:`.wiring`, :mod:`.moves`, :mod:`.gates`,
|
|
9
|
+
:mod:`.coverage`), which needs numpy (a runtime dependency), and
|
|
10
|
+
:mod:`.export` writes its derived data (``azurik-mod rando derive``).
|
|
11
|
+
"""
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|