Compare commits

..

439 Commits

Author SHA1 Message Date
briaguya 3f896f126f bump version (#2752) 2023-04-27 20:21:55 -04:00
briaguya 4166dbf907 spockalicious (#2751)
* Rough mockup of LUS XML loading

* Updated code for merge

* Loading from FS support and custom DList WIP implementation

* Added current directory support to F3D and impl most of the dlist cmds

* WIP Skeleton support

* Almost done

* Rebase fixes

* Submodule updates

* HD Texture Support

* Fixes

* bump lus

* fix exporter build, header update

* soh builds

* setMesh image path cleanup

* Update soh/src/overlays/actors/ovl_player_actor/z_player.c

* Update soh/src/overlays/actors/ovl_player_actor/z_player.c

* Update OTRExporter/OTRExporter/Main.cpp

* Update ZAPDTR/ZAPD/ZResource.h

* Update soh/src/code/z_skelanime.c

* Update OTRExporter/OTRExporter/Main.cpp

* Fixed jpeg backgrounds and decreased icon buffer size

* Bump lus

* Increased even more the buffer because it crashes on long texts

* Removed print because sometimes the if is not triggered when the image is already byteswapped

* fix non-windows build

* fix build

Co-authored-by: Kenix <kenixwhisperwind@gmail.com>

* add hd checkbox

* Various fixes for custom model support (#23)

* Some fixes

* Updated LUS Version

* Fixed issue with Link Skirt on pause menu

* Added CVar for custom link model changes

* Fixed headers

* Additional header fixes

* Tweaks

* Unload HD game assets on scene transition. (#16)

* Unload game assets on scene transition.

* Bump LUS

* Unloads all HD assets on scene transition.

* Only unload hd assets if hd assets are turned on.

* Fixes issues on toggling between HD and non HD assets.

---------

Co-authored-by: briaguya <briaguya@alice>

* fix: actually load hd debug font (#27)

* fix: actually load hd debug font

* toggle debug text correctly

---------

Co-authored-by: briaguya <briaguya>

* Yes. (#28)

* Merge branch 'develop' into dev-to-ghost

* HD Skeleton Swapping and Language Fixes (#32)

* Yes.

* HD Skeleton Swapping and Language Fixes

* Test

* Fixed issues with ganon cape (#34)

* Fixed Bongo Bongo Crash (#35)

* Added HD Assets Toggle (#37)

* Ivan the Fairy - Coop Mode (#36)

* wip

* hookshotable ivan

* added hookshot item

* new items & changes & fixes & restored navi

* farore, din and nayru's spells are done

* fixed slingshot & bow

* added more items supported

* done with all main items

* bug fixes & ready

* added imgui button

* wip

* hookshotable ivan

* added hookshot item

* new items & changes & fixes & restored navi

* farore, din and nayru's spells are done

* fixed slingshot & bow

* added more items supported

* fix own dungeon items on shuffled boss rooms (#2683)

* bump lus (#2692)

* fix: lowercase package names for vcpkg (#2693)

vcpkg was throwing an error `error: invalid character in package name (must be lowercase, digits, '-')`
this updates our calls to `vcpkg_install_packages` to use lowercase package names instead of uppercase

* fix death mountain cloud in rando (#2691)

* Fix: Switch Age No Longer Reloads Start Room (#2679)

* [Reduced Clutter] Disable Hot/Underwater Warning Text (#2684)

* Disable Warning Text

* Moved to Reduced Clutter

* done with all main items

* bug fixes & ready

* fix: process roms in consistent order (#2696)

* chore: move rando savefile setup and document flags (#2697)

* remove rando save init from sram

* move rando savefile init logic and set more flags

* document flags for rando save creation

* Fix: Use correct fps value for frame interpolation with match refresh rate (#2694)

* Fix: Kak GS placement on construction site (#2695)

* added imgui button

* addressed kenix's comments

* fixed useless null

* added rupee dash mode in extra modes

* changed menu position

---------

Co-authored-by: Adam Bird <Archez@users.noreply.github.com>
Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com>
Co-authored-by: Patrick12115 <115201185+Patrick12115@users.noreply.github.com>

* LUS Scancodes (#42)

* Added HD Assets Toggle

* Switched out SDL for LUS scancodes

* Ivan tweaks (#45)

* Magic consumption slowed down;
Bosses now affected by Ivan's Din spell

* Adjust magic timer

* clean up imgui

* model fixes/improvements (#50)

* replace `gUseCustomLinkModel` with custom resource check

* handle adult/child

* bump lus

* fix model switching with tab

* use lus main

* fix carpet man (#52)

Co-authored-by: Rozelette <Rozelette@users.noreply.github.com>

* get ship model and lus texture into soh.otr, use `gAuthenticLogo` to toggle between ship and authentic (#55)

* Use libultra features for CPU-modified textures (#40)

* Use libultra features for CPU-modified textures

* Comment

* bump lus on ghost (#58)

* fix: properly use `Interface_LoadActionLabel` to display start button text (#61)

* Changes hd -> alt for texture replacement. (#65)

* Changes hd -> alt for texture replacement.

* Renames variables in gfxprint for hd -> alt change.

* Update soh/soh/resource/type/Skeleton.cpp

---------

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Fixes kaleido dungeon maps (#67)

* skeleton stuff (#69)

* comment out wii u build (#70)

* bump lus (#71)

* Rework readme (#72)

* Update README.md

* docs

* put custom music docs somewhere

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* dark/light title image

* lus

* Update README.md

* Fixed vanilla minimap (#73)

* Fixed vanilla minimap

* Workaround for pulsing SD maps with non-broken HD maps.

---------

Co-authored-by: Christopher Leggett <chris@leggett.dev>

* Skeleton fix fixed (#75)

* WIP skelton patcher fix

* Fixes skeleton reference change.

* Adds const back to name in ResourceMgr_LoadSkeletonByName

---------

Co-authored-by: Christopher Leggett <chris@leggett.dev>
Co-authored-by: Kenix <kenixwhisperwind@gmail.com>

* Fixes z_message_otr memory leak.

* Update soh/soh/z_message_OTR.cpp

* Update soh/src/code/game.c

* docs: add how to find otr files to switch instructions (#78)

* bump lus (#79)

* comment out RegisterBlendedTexture in king d (#80)

---------

Co-authored-by: Nicholas Estelami <NEstelami@users.noreply.github.com>
Co-authored-by: David Chavez <david@dcvz.io>
Co-authored-by: briaguya <briaguya@alice>
Co-authored-by: Kenix3 <kenixwhisperwind@gmail.com>
Co-authored-by: KiritoDv <kiritodev01@gmail.com>
Co-authored-by: briaguya <briaguya>
Co-authored-by: Ralphie Morell <stratomaster64@gmail.com>
Co-authored-by: MelonSpeedruns <melonspeedruns@outlook.com>
Co-authored-by: Adam Bird <Archez@users.noreply.github.com>
Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com>
Co-authored-by: Patrick12115 <115201185+Patrick12115@users.noreply.github.com>
Co-authored-by: Rozelette <Rozelette@users.noreply.github.com>
Co-authored-by: Christopher Leggett <chris@leggett.dev>
Co-authored-by: Lywx <36680385+KiritoDv@users.noreply.github.com>
2023-04-27 19:20:41 -04:00
briaguya 2af99dfc3a ci: don't build/ship OTRGui (#2748) 2023-04-26 22:21:31 -04:00
briaguya 6d2fd664fb fix: support building for switch on selfhosted runners (#2747) 2023-04-25 19:28:41 -04:00
Adam Bird 000a5d28f3 Add version info and other details to windows exe properties (#2743)
* add version info and other details to windows exe properties

* configure properties file directly to src dir

* move version name in properties and change to Title Case
2023-04-25 10:36:35 -04:00
louist103 aea46e7cb2 Implement built in Extractor for Windows (#2730)
* wip

* const

* split zapd into two targets

* Workingish.

* fix working dir and copy xmls on build (#2)

* dont change current working dir with dialog prompts

* copy asset xmls to target dir

* make zpadlib public

* Messagebox.

* Check for WIN32

* threading

* Cleanups to the exporter and main.

* Multi extraction.

* Fix byteswap header includes.

* Fix another byteswap include.

* fix again.

* stddef size_t

* Add other targets for ZAPDLib

* Non windows.

* IDYES IDNO

* Linux fixes

* hopefully remove switch and wiiu from building extractor

* Please?

* validate roms and add another valid rom

* ifdef out extract.h for switch and wiiu

* Maybe update lux

* Remove ZAPDlib from switch and WiiU

* more rules

* Update soh/soh/Extractor/Extract.cpp

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Update ZAPDTR/ZAPD/ExecutableMain.cpp

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Update ZAPDTR/ZAPD/CMakeLists.txt

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Update ZAPDTR/ZAPD/GameConfig.cpp

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Update ZAPDTR/ZAPD/Globals.cpp

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Update ZAPDTR/ZAPD/Main.cpp

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Update soh/CMakeLists.txt

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Update soh/soh/Extractor/Extract.cpp

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Update soh/soh/Extractor/Extract.cpp

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Update soh/soh/Extractor/Extract.cpp

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* the last fix

* Add context to a comment

---------

Co-authored-by: Adam Bird <archez39@me.com>
Co-authored-by: Adam Bird <Archez@users.noreply.github.com>
Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
2023-04-25 00:01:17 -04:00
briaguya 44d3f1ccbb fix: update xml resolution for FireTempleBigVerticalFlame to match dlist resolution (#2741) 2023-04-24 14:44:30 -04:00
briaguya bd3ee64d81 improve ci compat by not using touch on windows (#2740)
* improve ci compat by not using touch on windows

* try new-item
2023-04-24 01:23:19 -04:00
briaguya 9be85df4b2 bump lus (#2739) 2023-04-23 22:29:56 -04:00
Adam Bird d0041d28ea Implement patches for authentic texture overflows (#2737)
* implement dlist patching for authentic texture overflows

* add overflow patch to deku stick; move toggle
2023-04-23 19:42:59 -04:00
briaguya 5324dfae67 clean up build info on logo screen (#2736) 2023-04-23 19:13:51 -04:00
RaelCappra 25ceca0fbf Enhancement: Aiming reticle for the bow/slingshot (#2715)
* Bow reticle enhancement

* Menu bar checkbox

* fix

* simplify bow/slingshot reticle logic

* Comment on RETICLE_MAX

* Tooltip clarity update

---------

Co-authored-by: briaguya <briaguya@alice>
2023-04-22 21:59:34 -04:00
briaguya c4b90d0bfe chore: add mods dir for windows (#2735)
* chore: add empty mods dir for windows

* add placeholder file to mods dir
2023-04-22 20:06:00 -04:00
briaguya 512336f858 bump lus (#2733) 2023-04-22 02:08:30 -04:00
Adam Bird 42ff9742ed Tweak: Unique GetItemEntry for Progressive Bombchus with particle effects (#2732)
* give progressive bombchus its own getitementry to allow custom draw effects

* fix timestamp item check
2023-04-21 19:01:19 -04:00
aMannus 37c0345529 ImGui Cleanup - Move Experimental entries, clean up presets (#2725)
* ImGui cleanup

* Fix Wii U

* Fix Wii U build 2: Electric Boogaloo

* Review comments

* Review Comments 2: Electric Boogaloo
2023-04-21 16:05:38 -04:00
briaguya 359cc3d5f6 bump lus (#2731) 2023-04-20 21:55:23 -04:00
inspectredc c146ca4aa5 Fix: SoT Time Travel B-Button Behaviour (#2720)
* time travel allows fishing rod + fixes vanilla ToT age change behaviour

* oops removed too much
2023-04-20 21:53:56 -04:00
Adam Bird 8f0f8c7644 Rando: Add Granny's Potion Shop to Merchant Shuffle (#2723)
* add granny shuffle to 3ds code

* add granny shuffle to soh randomizer

* make granny hand out merchant check

* have medigoron set pending sale mod

* capitalize granny shop item
2023-04-20 21:25:11 -04:00
Adam Bird 1b63f4ca1a Tweak: Shopsanity Heart Pieces and Containers now refill Link's health (#2724)
Heart Pieces and Heart Containers normally refill Links health when the text box with their respective textID is closed.
However, with shops and shopsanity, after receiving the heart piece, the textbox isn't actually closed. The shop keeper keeps it open to prompt the player if they want to continue shopping. This prevents the health refill logic from running.

This PR adds a check for these items in the BuyEvent for randomizer items and manually refills Links health.
2023-04-20 21:00:00 -04:00
Adam Bird 7d20509b5b correctly handle vanilla/mq dungeon location exclusions (#2726)
The logic for showing/hiding Vanilla/MQ dungeon locations in the exclusion tab was not accounting for the case if MQ dungeons is set to "Random".

This rewrites the logic check to account for all 3 cases, and only looks at the count value when set to "Set Number".
Also the CVar get for MQ count needs to default to 12 instead 0, to match the declared default behavior everywhere else.
2023-04-20 20:58:43 -04:00
briaguya 37390c441f feat: allow toggling vsync, fix: vrr support (#2716) 2023-04-20 20:57:32 -04:00
briaguya 853bff3e41 dinner room (#2729) 2023-04-20 20:16:21 -04:00
briaguya 7a96e700bf bump lus (#2721) 2023-04-18 02:15:58 -04:00
Adam Bird 16ee259d0b zapd fix text extraction overflowing (#2717) 2023-04-18 01:08:06 -04:00
PurpleHato 6562823b72 Readability - Magic Numbers (#2707) 2023-04-18 00:55:02 -04:00
Adam Bird 4aee3b6cc9 fix lake hylia sun granting multiple fire arrows in vanilla (#2708) 2023-04-18 00:53:38 -04:00
Adam Bird 19d8d38082 Fix: Update GetItem value for freestanding items and shopsanity plentiful (#2718)
* fix freestanding items not changing getItem value on the fly

* fix getItem models in shops for plentiful items
2023-04-18 00:41:08 -04:00
Adam Bird 579087e527 fix tts crash pause menu with any cursor position (#2719) 2023-04-18 00:38:12 -04:00
aMannus 831711a459 Revert FPS slider behaviour for DX11 (#2686) 2023-04-14 10:44:58 -04:00
Adam Bird e72eeb95aa chore: copy otrs in windows into target dir (#2704)
* copy otrs in windows into target dir

* improve status messaging for otr copy script
2023-04-14 09:56:38 -04:00
aMannus ead17892fe Change console commands to bind commands with parameters (#2706) 2023-04-14 09:55:24 -04:00
Adam Bird 1861335cf0 chore: move asset header generation to new ExtractAssetsHeaders target (#2705)
* add dedicated build target for extracting asset headers conditionally

* dont gen otr when generating headers

* simplify python array
2023-04-14 09:54:56 -04:00
Adam Bird 660c3ec3b0 fix soh otr asset building not detecting textures (#2702) 2023-04-13 18:37:10 -04:00
aMannus 92fa54c3f9 Replaces text chevron with Font Awesome icon (#2687) 2023-04-13 09:32:51 -04:00
briaguya 08828da9fc fix: don't try to install deps on selfhosted linux (#2701) 2023-04-12 23:16:33 -04:00
briaguya c4ce2f10cd build/package/ship soh.otr (#2699)
* update

* Update generate-builds.yml

* Update generate-builds.yml

* sohotr in CI?

* paths

* gitignore soh.otr

* Fix

* no COMMAND maybe?

* try generating otr as it's own step

* deps

* f

* g

* h

* a

* cc

* ccc

* m

* blarg

* try uploading

* try

* s

* copy things

* wii u?

* wiiu

* don't fail

* windows without cpack?

* wut

* whoops

* see all the things plz

* b

* v

* zip working maybe

* ok but this tho

* pdb and switch

* mac lus

* soh.otr in appimage

* down first

* mac

* bundle soh otr into mac app and read it from the bundle

* appimage fix

* try just downloading for mac?

* i like to mv it mv it

* mv to the right place

* no more otrgui

* bring back otrgui and assets

* echo blarg

* echo

* zapd.exe

* clean and remove

* a

* space

---------

Co-authored-by: louis <louist103@gmail.com>
Co-authored-by: louist103 <35883445+louist103@users.noreply.github.com>
Co-authored-by: briaguya <briaguya@alice>
Co-authored-by: Adam Bird <archez39@me.com>
2023-04-12 21:14:33 -04:00
briaguya 38c31d2d4e bump lus (#2700) 2023-04-12 20:49:40 -04:00
Adam Bird 40b6dae261 Fix: Kak GS placement on construction site (#2695) 2023-04-11 18:56:57 -04:00
Adam Bird ac506c8b3e Fix: Use correct fps value for frame interpolation with match refresh rate (#2694) 2023-04-11 18:54:10 -04:00
Adam Bird 059df8187e chore: move rando savefile setup and document flags (#2697)
* remove rando save init from sram

* move rando savefile init logic and set more flags

* document flags for rando save creation
2023-04-11 18:27:51 -04:00
briaguya 82b6c48497 fix: process roms in consistent order (#2696) 2023-04-11 18:24:36 -04:00
Patrick12115 fe71cdfbb6 [Reduced Clutter] Disable Hot/Underwater Warning Text (#2684)
* Disable Warning Text

* Moved to Reduced Clutter
2023-04-11 08:18:03 -04:00
inspectredc 6f8207d3bb Fix: Switch Age No Longer Reloads Start Room (#2679) 2023-04-11 08:15:47 -04:00
Adam Bird d56899dd0b fix death mountain cloud in rando (#2691) 2023-04-11 08:14:21 -04:00
briaguya b6e9e9cd0f fix: lowercase package names for vcpkg (#2693)
vcpkg was throwing an error `error: invalid character in package name (must be lowercase, digits, '-')`
this updates our calls to `vcpkg_install_packages` to use lowercase package names instead of uppercase
2023-04-11 08:13:21 -04:00
briaguya 6f9c31dd6c bump lus (#2692) 2023-04-11 07:38:36 -04:00
Adam Bird b47d538e62 fix own dungeon items on shuffled boss rooms (#2683) 2023-04-11 07:31:37 -04:00
briaguya 330da0b5ec khan -> dev 2023-04-07 17:06:58 -04:00
inspectredc 1fa31410c2 Switch age fix (#2676)
* specific scenarios for switch age button, non rando

* Working fix for vanilla swordless change age

* Fix now works for randomiser

* Fixed room load on change age transition

* Removed potentially unnecessary function call

Need to investigate this more, maybe wait for more room documentation.

* Suggested Edits

Moves setting cvar back into mods.cpp and makes clear the condition expected for the no sword flag
2023-04-07 17:05:12 -04:00
Adam Bird 2149cd1fdd fix boss clear logic and add bongo logic trick (#2677) 2023-04-07 15:54:49 -04:00
RaelCappra 0f6147f41d Link voice pitch v0 (#2430)
* Link voice pitch v0

* Using a new variable instead

* Move voice pitch slider to Options tab

* fallback to original behavior if freqMultiplier is set to 1

* Move reset button to Options tab with its slider

* Fix voice pitch slider width in Options tab

* [Review] Always use freqMultiplier
2023-04-07 15:54:26 -04:00
Adam Bird 693f778b60 fix jabu mq clear condition for boss entrance rando (#2671) 2023-04-07 11:24:35 -04:00
Adam Bird b10e489cc6 fix cobra statue shadow and small doc updates (#2666) 2023-04-07 11:22:42 -04:00
Adam Bird ad60ad7c2b Fix: Goron Link's text in randomizer and have Big rolling goron continue rolling (#2670)
* fix link the gorons text ids in rando

* document goron link flags

* check for fire temple clear instead of medallion for link goron

* stop goron link from shivering after opening doors and have big rolling goron resume rolling after giving check

* remove unneeded rando check

* add comments
2023-04-07 11:21:28 -04:00
briaguya 196de9d05d build: don't install deps on selfhosted windows (#2675) 2023-04-07 00:57:03 -04:00
briaguya bd05cb8b5d bump lus (#2674) 2023-04-07 00:25:00 -04:00
Ralphie Morell d434941724 Fix: Gameplay Stats OOB (#2673)
* Handle `sceneMapping` OOB behavior

* whoops

* More solid definition of upper bound
2023-04-06 23:09:25 -04:00
briaguya 44906598e4 fix: properly display static background scenes (#2669) 2023-04-04 03:12:09 -04:00
Ralphie Morell ff1d8a9e9d Enhancement: Room/Scene Timers (#2478)
* Groundwork on scene/room timers; naming changes

* added to save manager; reworked storing timestamps

* actually saved stuff to savemanager;
accounted for null playstate

* finally fixed the fucking timers

* Added scene mapping

* Added CVar for room/scene level; fixed some displays

* reworked logic

* increase name spec for scene timestamps

* Actually save item timestamps when loading v3 save

* Cleanup

* fix merge artifact

* apply suggestions
2023-04-03 00:06:55 -04:00
briaguya 0f40472c1a khan -> dev 2023-04-02 21:37:00 -04:00
Patrick12115 2af952b180 [Time Saver Enhancement] Nighttime GS Always Spawn (#2611)
* Nighttime GS Always Spawn

* add hook onSceneSpawnActors

* implement onSceneSpawnActors hook to spawn GS in various day scenes

* handle the kak tree skull during the day

* Update mods.cpp

* Add the &

* Fixes

* Update soh/soh/Enhancements/mods.cpp

Co-authored-by: Adam Bird <Archez@users.noreply.github.com>

---------

Co-authored-by: Adam Bird <archez39@me.com>
Co-authored-by: Adam Bird <Archez@users.noreply.github.com>
2023-04-02 21:11:08 -04:00
briaguya 5f708251a6 bump version (#2665) 2023-04-02 15:41:01 -04:00
briaguya 94ad837c02 bump lus (#2661)
* bump lus

* start fixing build errors

* update resources to support lus changes

Co-authored-by: Kenix <kenixwhisperwind@gmail.com>

---------

Co-authored-by: briaguya <briaguya>
Co-authored-by: Kenix <kenixwhisperwind@gmail.com>
2023-04-02 14:18:45 -04:00
Adam Bird 62bd4b0ba7 remove rando allowing grave pulling during day (#2660) 2023-04-02 14:18:21 -04:00
PurpleHato 77cc91d0de ADD: Time Saver --> Time Travel with the Song of Time (#2575)
* ADD: Time Saver --> Time Travel with the Song of Time

Co-Authored-By: aMannus <4244591+aMannus@users.noreply.github.com>
Co-Authored-By: David Chavez <david@dcvz.io>

* TWEAK: one liner for the gPlayState check

* ADD: Time Saver --> Time Travel with the Song of Time

Co-Authored-By: aMannus <4244591+aMannus@users.noreply.github.com>
Co-Authored-By: David Chavez <david@dcvz.io>

* TWEAK: one liner for the gPlayState check

* Timetravel stuff

* tweazk oopsies

* Fixes timeline

* tweak frog dist

* ADD: Time Saver --> Time Travel with the Song of Time

Co-Authored-By: aMannus <4244591+aMannus@users.noreply.github.com>
Co-Authored-By: David Chavez <david@dcvz.io>

* TWEAK: one liner for the gPlayState check

* Timetravel stuff

* tweazk oopsies

* Fixes timeline

* tweak frog dist

* oppsie²

* del dupe

* del dupe

* tweak tooltip

---------

Co-authored-by: aMannus <4244591+aMannus@users.noreply.github.com>
Co-authored-by: David Chavez <david@dcvz.io>
2023-04-02 12:34:02 -04:00
Patrick12115 fb8dacbc69 [Cheat] No ReDead/Gibdo freeze (#2643)
* No freeze

* Simplified

* removed random spaces

* Removed unnecessary parenthesis
2023-04-02 05:13:34 -04:00
pancake-byte f6ce7e6492 Update README.md (#2592)
* Update README.md

Changed some murky language with respect to the "mods" folder location.

* Update README.md

* Update README.md

Readme overhaul for more consistent language and some updated instruction. Truncated certain sections, removed archaic instructions, elaborated where needed.

* Update README.md

* Update README.md

Does version info belong in additional setup info? Changing that.

* Update README.md

Making suggested changes.

* Update README.md

Made recommended changes.
2023-04-02 04:47:54 -04:00
Malkierian 04d0cd8532 Adds OnTransitionEnd hook to GameInteractor, called at the end of a transition after all mid-transition setup is called. (#2635)
Transitions final autosave location to `OnTransitionEnd`.

Adds functionality to autosave to set a delayed save flag if AutoSave is set to Major or All Items and one is obtained in a grotto, to avoid grotto autosaving but still provide for the autosave when location-based saving is off.

Fixes small bug with item lookup where sometimes an item's `modIndex` would sometimes be reported one way, but the way Randomizer does things it would be in a the other `modIndex`, and the lookup would fail.

Minor variable name clarification in ItemTableManager.

Modifies AutoSave to account for item ID overlap from `MOD_RANDOMIZER` table (all items in the randomizer table is considered major for AutoSave purposes except ice traps).
2023-04-02 04:47:23 -04:00
Patrick12115 b099b5649b [Time Saver Enhancement] Dampe Appears All Night (#2618)
* Dampe Appears All Night

* Take out time check
2023-04-02 04:19:58 -04:00
aMannus ca23d87a3a Hyper Bosses (act and move twice as fast) (#2555)
* Hyper bosses

* Actor* to void* + cast to fix build

* Cleaner implementation

* Fix enemies taking double damage

* Fix smaller dodongo's being sped up

* Additional fix and code cleanup

* Proper fix for double damage

* Extern variable -> GI state
2023-04-02 04:00:21 -04:00
Josh Bodner 21d82e7c4c Cleanup of ImGui code (#2576)
* Change sliders to have +/- buttons by default

* Remove unnecessary margin setting

* Add +/- buttons to remaining sliders and fix some broken UI

* Update EnhancementComboBox to not need array size

* Remove redundant widgets from randomizer

* Miscellaneous fixes

* Fix Switch build break

* Consolidate disabled styling in widgets

* Simplify widget logic

* Merge with most recent PRs

* Fix audio fanfare and sound effect sliders mixup

* Fix sliders being one button too wide

* Fix sliders being too long

* Fix sliders being too long on console
2023-04-01 16:10:49 -04:00
briaguya 2aa7c71eac khan -> dev 2023-04-01 15:09:27 -04:00
briaguya 2a0a31ae7e Merge branch 'develop-khan' into khan-to-dev 2023-04-01 14:19:41 -04:00
Adam Bird f5bcc6dccf fix crash when fishing rod is cast and scene is reloaded (#2657) 2023-04-01 14:06:53 -04:00
Malkierian f7703e14e8 Fix Missing Custom Sequences (#2649)
* Modifies custom sequence loading to bypass other sounds being loaded in AudioCollection to fix missing custom sequences on load.

* Modified `audio_load`'s sequenceMap allocation to utilize `AudioCollection`'s sequenceMap size to account for all audio assets already loaded into that sequenceMap. This gives a non-arbitrary number in addition to the vanilla sequence count to allocate with for `audio_load`'s sequenceMap.

Added `HasSequenceNum` to `AudioCollection` as well to streamline the check against `AudioCollection`'s sequenceMap to skip the non-sequence assets in there.

Added clarification comment for seqNum and MAX_AUTHENTIC_SEQID section.

* Clarified comment about AudioCollection seqNum and MAX_AUTHENTIC_SEQID.

* A bit more on comment from the last commit.
2023-03-31 23:35:29 -04:00
Adam Bird 0c43fe7e48 fix mido blocking pathway when link has kokiri emerald (#2653) 2023-03-31 23:13:24 -04:00
Adam Bird 545bc21fbe Tweak: CTMC/CSMC for treasure mini game reward and set loser green rupee as junk (#2652)
* set green rupee to junk category for ctmc

* allow treasure chest game reward to use CSTMC and cleanup logic
2023-03-31 22:22:45 -04:00
Adam Bird 21a3bd9f5c Fix: Actually display correct GS token count in message for vanilla and rando (#2651)
* Revert "fix skulltula token count message on vanilla (#2597)"

This reverts commit 2117d98178.

* fix vanilla vs rando gs token count to be correct
2023-03-31 22:05:14 -04:00
Adam Bird f682102c96 fix theater mask checks not always granting items (#2650) 2023-03-31 21:29:35 -04:00
RaelCappra c9c7fc7df6 Restore 1.0 quick Bongo kill glitch (#2641)
* Restore 1.0 quick Bongo kill glitch

* Address review comments
2023-03-22 20:59:44 -04:00
Malkierian e76b990c8a Randomzier: Fix starting rupee item collection (#2645)
* When rupees are given as starting items, they still modify `gSaveContext.rupeeAccumulator`, which means that if you make a new file, start it, and reload without saving, or exit SoH before starting the new file, those rupees were lost. This adds a check for `gPlayState` being NULL, and if it is, adds those initial rupees to the rupee count directly.

* Update soh/src/code/z_parameter.c

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

---------

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
2023-03-22 20:59:08 -04:00
Malkierian 533ee9379a Balanced Shopsanity Bugfix (#2640)
* Fixes settings bug with Balanced shopsanity prices from Shopsanity Affordable Update.

* Wrong location

* Updated fixed comment
2023-03-15 22:46:30 -04:00
Malkierian 7f5f4251ca Another Item_Give bug fixed... (#2636) 2023-03-15 13:25:24 -04:00
briaguya bd07a56022 khan -> dev 2023-03-14 07:13:26 -07:00
briaguya b2698fa126 Merge branch 'develop-khan' into khan-dev 2023-03-14 09:45:00 -04:00
briaguya 72b12890fd bump version (#2632) 2023-03-14 09:16:54 -04:00
Christopher Leggett 58ef377d87 Fixes some XML texture size and offeset errors. (#2621) 2023-03-14 10:46:52 +01:00
Malkierian 1b158015e6 Fixes bug introduced by 73052617ed where keys, among others, would corrupt inventory slots. (#2626) 2023-03-14 10:46:33 +01:00
briaguya 0ade1aad69 use LUS with atmosphere fix (#2629) 2023-03-14 03:56:14 -04:00
briaguya 356d959b70 bump lus 2023-03-14 02:45:19 -04:00
briaguya b157cc5a16 khan -> dev 2023-03-13 21:50:15 -07:00
briaguya 2bd8316d54 Merge remote-tracking branch 'hm/develop-khan' into khan-to-dev 2023-03-14 00:29:30 -04:00
Malkierian 264623f40a Shopsanity Affordable Logic Update (#2617)
* Modified Affordable logic to select randomly from 10, 105, 205, and 505 depending on the selected wallet tier. Updated the tooltip to reflect.

* Clarified logic in comments and variable names.

* Streamlined affordable check for starter wallet.

One more function comment.

* More streamlining of affordable price generation, comment clarification.
2023-03-13 17:24:51 -04:00
aMannus 866882e4c6 CrowdControl V2: Effect Overhaul (#2433) 2023-03-13 11:37:50 +01:00
Christopher Leggett d9008938f8 Makes sequenceMap and seqLoadStatus a dynamic size (#2610)
Refactors to allow the above two arrays to be a dynamic size when the game launches, size is set during the AudioLoad_Init function.
2023-03-12 15:55:25 -04:00
aMannus 76e99ffe19 Feature - Bonk damage under difficulty options (#2584) 2023-03-12 08:10:03 +01:00
Adam Bird 1ce9634f65 clear bongo bongo static effect on actor reset (#2603) 2023-03-12 08:06:52 +01:00
Adam Bird 39acd71fc4 remove left over boss location logic from mq logic (#2619) 2023-03-12 08:01:18 +01:00
Malkierian 73052617ed [GI] Item_Give and OnReceiveItem updates (#2580)
* Changed OnReceiveItem hook to pass GetItemEntry, which required the following changes:

Reworked the references to it in `z_parameter` to call a single function with the item return and hook call in it for ease of editing.

Modified the pendingSale functionality to set and pass a modIndex value as well, as mod items (like randomizer) in shops still use the vanilla sale path.

* Missed some files for the pendingSale changes.

Also added Randomizer_Item_Give to the OnReceiveItem system.

* Ice traps now trigger OnReceiveItem.

* All ice traps truly do work now.

As a side effect, item autosave doesn't work for shop/scrub/merchant transactions, requires new OnSaleEnded hook that can also call the autosave.

* Removed unnecessary calls to ItemTable_RetrieveEntry where GetItemEntry properties were being used to call it.  General code cleanup.

* Added OnSaleEnd hook for when rupees are finished deducting after a sale.

Migrated AutoSave to its own function, registered AutoSave function to OnReceiveItem and OnSaleEnd hooks to help with autsaving after buying items.

Some futureproofing for AutoSave function with parameters for skipping autosave, for when transition end is migrated to AutoSave function (whether through direct call or through a hook).

* Renamed hook paramaters, and registered hook function parameters, to a more descriptive alternative.

* Missed a couple, fixed a typo.

* One more missed paramater name refactor.

Refactored all references to OnReceiveItem to OnItemReceive to mirror upcoming full hook refactor for name ordering conventions.

Up-to-date with develop.
2023-03-12 08:00:03 +01:00
aMannus 095066ffcd Enemy Rando - Arwing range check (Khan Edition) (#2613)
* Arwing range check

* Small code cleanup
2023-03-11 09:47:56 -08:00
aMannus 1c00d56053 Exclude club moblins in clear rooms (#2593) 2023-03-08 13:10:14 -05:00
Adam Bird 7c558ae089 fix rando quest selection falling back to vanilla saves (#2599) 2023-03-08 13:09:22 -05:00
Adam Bird 60f4f71495 fix flag wind speed to use correct uint type (#2600) 2023-03-08 13:08:54 -05:00
Adam Bird 2117d98178 fix skulltula token count message on vanilla (#2597) 2023-03-08 10:18:02 -05:00
briaguya 4a89c20ac9 bump lus + resolve lus conflicts (#2598) 2023-03-07 23:03:00 -05:00
briaguya eb28d114cd khan -> dev 2023-03-06 23:39:08 -05:00
Malkierian 5d32343919 Modify cutsceneIndex in scene transition autosave to include use-cases outside of normal vanilla play. (#2588) 2023-03-06 23:17:27 -05:00
Adam Bird ce115272cd fix equip now enhancement running with non-equipment items (#2590) 2023-03-06 23:15:51 -05:00
Pierre Wendling dbcc6b4818 [CMake] Do not force CMAKE_OSX_DEPLOYMENT_TARGET (#2581)
This leaves the default of 10.15, but allows a user to change it in the
cache. When using Homebrew libraries on newer macOS version, the linker
emits warnings:

```
ld: warning: dylib (/opt/homebrew/lib/libSDL2.dylib) was built
for newer macOS version (13.0) than being linked (11.0)
```
2023-03-05 08:38:22 +01:00
Adam Bird 0a67e42f6c handle angry happy mask throwing link out in entrance randomizer (#2578) 2023-03-04 00:30:20 -05:00
briaguya 76ceda3118 khan -> dev 2023-03-02 17:13:31 -05:00
Adam Bird a5bf135541 fix change age cheat causing link to spawn in the wrong spot (#2573) 2023-03-02 17:12:46 -05:00
Josh Bodner 0d54cb15df Spot fix so autosave dropdown will save immediately (#2568) 2023-03-02 16:57:55 -05:00
David Chavez 981c6348ab Fix voice compilation (#2571) 2023-03-02 21:58:27 +01:00
Amaro Martínez d3f864cea9 Simplify Asset Headers (#2474) 2023-03-02 15:37:47 +01:00
David Chavez 21466192e5 [Accessibility] Text to Speech (#2487) 2023-03-02 09:27:28 +01:00
briaguya 72777a0eb2 build: use fromJSON to parse runner repo vars, don't add deps on self-hosted (#2564) 2023-03-01 19:41:04 -05:00
David Chavez b13f6f4b70 [Interpolation] Allow Matching & Limit Max FPS (#2466) 2023-03-01 16:12:55 +01:00
briaguya 7551fba3d2 [CI] Allow selfhosted runner configuration using repository variables (#2560) 2023-03-01 11:50:16 +01:00
David Chavez 109345e94d [Resources] Properly encode soh textures and remove raw load (#2548) 2023-03-01 10:18:26 +01:00
briaguya e07de4b3b5 bump version (#2559) 2023-03-01 00:56:31 -05:00
briaguya 05723bc8d6 bump lus (#2558) 2023-02-28 23:13:37 -05:00
David Chavez b74be9196c [Accessibility] Add ability to disable camera re-centering on idle (#2503)
* Add ability to disable camera recentering on idle

* Remove platform check

* Update else camera comment
2023-02-28 21:42:15 -05:00
Dakota Brown 0daa91f4e3 Update BUILDING.md (#2385)
I use PyEnv and rebuilding after recent commits was giving me a cmake error about not being able to find the Python3 executable. Advising other users who might run into this problem on how to fix it.
2023-02-28 21:10:19 -05:00
Adam Bird 1fc6a2f08f Rando version warning on different builds (#2420)
* save build version to savefile

* adjust rando hash icons to use fade in/out

* add dialog message support on the file select screen and display rando version warning

* remove duplicated message functions and use stubbed play state instead for rando warning

* add major/minor/patch version saving to file and compare against

* use strncpy and memset for build version

* don't show rando warning one copy/erase screens

* review feedback

* Add german and french translations for rando warning

Co-authored-by: PurpleHato <linkvssangoku.jr@gmail.com>

---------

Co-authored-by: PurpleHato <linkvssangoku.jr@gmail.com>
2023-02-28 20:46:55 -05:00
David Chavez 27d7cb0bc1 [CMake] Clean soh/CMakeLists (#2556) 2023-02-28 19:19:34 +01:00
briaguya 2df6acc908 Fix: some greg hint stuff (#2557)
Co-authored-by: briaguya <briaguya@alice>
2023-02-28 18:23:22 +01:00
David Chavez c91a044d46 [GameInteractor] Introduce GameFrameUpdate Hook and Migrate Cheats (#2554) 2023-02-28 11:20:43 +01:00
Evgenii Babinets afc61e65ee Restored vanilla pause buffering and input behavior broken by 'easy frame advance' cheat (#2511)
* Restored vanilla pause buffering and input behavior broken by 'easy frame advance' cheat

Currently, holding A and repeatedly pausing and unpausing will cause that A input to be repeated, resulting in Link rolling without additional A inputs. Similarly, holding Z and unpausing in front of a candidate actor will cause Link to switch Z-targeting to that actor.

As a side effect, this also does not allow inputs to be buffered before the Subscreen has finished its closing animation, which is how vanilla also works. This is slightly unfortunate because the "freeze" before the game resumes is considerably shorter in Shipwright, but it'd be better to implement a fake delay there if we want to make it more forgiving.

* Fixed writing past end of the buffer when loading personal item tracker notes longer than 8 characters

* Revert "Fixed writing past end of the buffer when loading personal item tracker notes longer than 8 characters"

This reverts commit 721c18d488.
2023-02-28 04:22:26 -05:00
briaguya 7f5221b149 Supersonic merge fixes (#2553)
* ss2

* Remove Comments and Rupees when dead.

* Rupees removal for real

* Updated Inline formatting as well as changed Mode Idenitifier from Super Sonic to Rupee Dash.

* Add OnPlayerUpdate hook

* Move rupee dash to hooks

* Update comment for DashInterval

* ss2

* Remove Comments and Rupees when dead.

* Rupees removal for real

* Updated Inline formatting as well as changed Mode Idenitifier from Super Sonic to Rupee Dash.

* Add OnPlayerUpdate hook

* Move rupee dash to hooks

* Update comment for DashInterval

* Update Health to not crash on less than 16 units.

* lus

* fix build, use `Health_ChangeBy`

---------

Co-authored-by: Caladius <Caladius@users.noreply.github.com>
Co-authored-by: David Chavez <david@dcvz.io>
2023-02-28 03:52:32 -05:00
David Chavez f0be8c7b0c [Dev] Add Support for Github Codespaces (#2551)
* Add apt packages

* Move to docker based codspace
2023-02-28 01:11:56 -05:00
Josh Bodner f481b86386 Change autosave to use dropdown (#2550) 2023-02-28 00:07:47 -05:00
briaguya 061e232685 fix greg hint (and an RSK parsing issue) (#2547)
* fix RSK parsing error introduced by  #2541

* add logic to not give greg hint when we shouldn't

---------

Co-authored-by: briaguya <briaguya@alice>
2023-02-27 21:03:00 -05:00
Adam Bird 9ec091a636 add missing settings values that weren't being parsed (#2541) 2023-02-26 23:05:07 -05:00
Adam Bird f7bb807940 [Game Interactor] Add LoadGame and ExitGame hooks (#2542)
* add loadgame/exitgame GI hooks

* implement loadgame/exitgame hooks in game code

* move entrance tracker data lifecycle to hooks

* update cosmetic editor to update onloadgame hook
2023-02-26 23:04:57 -05:00
briaguya 17aeec4b13 add greg to gameplay stats (#2544)
Co-authored-by: briaguya <briaguya>
2023-02-26 23:04:47 -05:00
David Chavez 2cb4a6ee7e [Resources] Cleanup old hacks and rename (#2546) 2023-02-27 02:55:40 +01:00
David Chavez 448b4e49d3 [GameInteractor] Update Naming Modhooks (#2543) 2023-02-27 01:46:25 +01:00
Adam Bird c1ddeec02a fix cutscenes loading wrong resource when only an mq rom is loaded (#2545) 2023-02-27 01:44:30 +01:00
briaguya 60b206140d Greg Hint + Hint cleanup (#2537)
* Restore greg stuff

* Cleanup

* Actually check for Greg when creating Greg hint

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* whoops

* Update soh/soh/Enhancements/randomizer/3drando/hints.cpp

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* fix greg hint crash, clean up hint generation (clear out hints when setting is off)

* update vanillafill too

* fix text id, parse json, expand array to fit hint

* actually parse/use greg hint RSK

* specify "after buying a key" in hover text hint

---------

Co-authored-by: David Chavez <david@dcvz.io>
Co-authored-by: Ralphie Morell <stratomaster64@gmail.com>
2023-02-24 20:35:15 -05:00
briaguya 390bdf10f6 bump lus (#2536) 2023-02-24 16:27:52 -05:00
briaguya fef230bc87 make greg bridge more greg (#2532)
* make greg bridge more greg

* use green rupee color from cosmetics editor

* use hooks to not patch/unpatch every frame

* use gi hook

---------

Co-authored-by: briaguya <briaguya@alice>
2023-02-24 15:55:53 -05:00
Malkierian 29daec879b Shopsanity price range selection (#2517)
* Adds price range select box for shopsanity when shopsanity is 1 or more items.
Default option is the original functionality, now under "Random" select option.

Other options include Affordable, which makes each item 10 rupees, and one option for each level of wallet available with shopsanity, where each wallet's max capacity is the upper limit on the price randomization. These still go in 5 rupee increments, like Random.

Also keeps track of and saves/loads settings appropriately on game start.

* Changed "Random" default shopsanity price selection to "Balanced" to be more properly descriptive.

Refactored GetRandomShopPrice to try to keep Balanced as the default, with a sane fallback price of 150 should the weighted randomizer somehow fail.

* Missed one change from Random to Balanced.

* Changed wallet range to minimum of 5, and removed the multiple of 5 requirement (full rando within range).

* Modified the system to add a checkbox for affordability which then adds a price cap that is just above the max value of the previous wallet tier. Effectively this keeps the wallet lock in place, but prevents anything from getting more expensive than 5 past the previous tier.

* Fixed hover help text and tooltip formatting.

* Changed wallet ranges to generate multiples of 5. May need weighted generation after playtesting.
2023-02-24 04:21:13 -05:00
briaguya 23d2e4a2cc improve cvar usage in AudioEditor (#2523)
Co-authored-by: briaguya <briaguya@alice>
2023-02-24 03:21:46 -05:00
briaguya 95fe6b492b fix: use trick names for scrub and house of skulltula hints (#2528)
* update writealllocations to always write trickname and start seeing where things break

* handle simple vs complex items

* always grab a trick name

---------

Co-authored-by: briaguya <briaguya@alice>
2023-02-24 03:21:35 -05:00
briaguya df6da69f7d add greg bridge altar text (#2524)
Co-authored-by: briaguya <briaguya@alice>
2023-02-24 03:20:24 -05:00
briaguya 96dd7073e4 always add a gossip stone hint for greg when greg bridge is enabled (#2530)
* always add a gossip stone hint for greg when greg bridge is enabled

* don't double loop

---------

Co-authored-by: briaguya <briaguya@alice>
2023-02-24 02:57:31 -05:00
briaguya 231b7eecca "greg the green rupee" (#2529)
Co-authored-by: briaguya <briaguya@alice>
2023-02-24 02:57:19 -05:00
briaguya e25b11c5ac Add menu option for changing disappearing path behavior (#2527)
* Adding CVar for z-fighting fix

* ultraship update

* remove commented out code

* formatting

---------

Co-authored-by: Bagbar <ckonrad86@gmx.de>
2023-02-23 22:42:58 -05:00
briaguya ff94d35ea9 fix a couple junk hints that were making AutoFormatHintTextString loop forever (#2525) 2023-02-23 22:14:17 -05:00
Adam Bird 6e4b1aec2a fix excluded locations being removed if you haven't viewed the location tab (#2518) 2023-02-23 08:47:13 +01:00
Adam Bird 3d30f1701a make the gf chest as child use the correct RC check (#2519) 2023-02-23 08:47:13 +01:00
Adam Bird ffbaef7823 fix incorrect hint key for child spawn location (#2507) 2023-02-23 08:47:13 +01:00
Amaro Martínez 656e593a67 Fix Lakeside Laboratory title card (#2501) 2023-02-23 08:47:13 +01:00
Adam Bird 6a09934e3b fix logic to use fire timer for deku scrub in DMC (#2502) 2023-02-23 08:47:13 +01:00
briaguya d238533aba bump lus (#2521) 2023-02-23 01:49:54 -05:00
Matt Wiens 7860f88241 Fix menu bar fix description typo (#2504) 2023-02-23 01:14:27 -05:00
Evgenii Babinets e8e4afbbcd Fixed potential memory corruption when loading personal item tracker notes (#2512) 2023-02-23 01:13:32 -05:00
Ralphie Morell 4a4f7e6d96 [Fix] Static Bomb Radius (#2515) 2023-02-21 08:49:53 +01:00
David Chavez 12e1814dad Update to latest LUS (#2514) 2023-02-21 01:38:27 +01:00
briaguya 9325e6d0a5 fix: don't show duplicate gregs on item tracker (#2498)
Co-authored-by: briaguya <briaguya@alice>
2023-02-17 11:05:15 -05:00
briaguya 494bdcdb25 gibbs -> dev 2023-02-17 08:02:08 -05:00
Malkierian 868689ce3e Entrance tracker tweaks (#2446)
* Hide return transitions for dungeon, grotto and interior entrances when "Decouple entrances" is off.

* "Highlight last entrance" now highlights the override reverseIndex entry in the list if "Decouple entrances" is off, to correspond with not displaying return directions for the same setting (without this, nothing gets highlighted with the return transitions hidden with "Decouple entrances" off).

* Removed unnecessary printf

* Moved redundancy check to filtering loop instead of display loop.

Introduced setting to optionally force showing redundant entrances when decoupled is off.

Formatting changes suggested by Archez.

* Changed "show redundant" to "hide reverse" where applicable, and change

Added option disabling based on Decouple Entrances.

* Finished descriptive comment.

* Moved "Hide reverse" to left column of tracker settings.

Changed to PaddedEnhancementCheckbox, changed checkbox padding accordingly, and set default to true.

* Restore tooltip to Hide Reverse option, fix default value.

Co-authored-by: Adam Bird <Archez@users.noreply.github.com>

* Restored padding underneath last option in entrance tracker List Items section.

---------

Co-authored-by: Adam Bird <Archez@users.noreply.github.com>
2023-02-17 07:38:07 -05:00
Adam Bird 3f3f4ff3ef Fix: Prevent certain items from being marked as "major" (#2496)
* fix certain items being marked as major

* simplify check

* avoid string check
2023-02-17 07:14:43 -05:00
briaguya 68c8f50a71 greg bridge in logic (#2460)
* greg bridge in logic

---------

Co-authored-by: briaguya <briaguya@alice>
2023-02-16 21:53:08 -05:00
briaguya 3d8752b3aa you found greg! (#2458)
adds greg to the item tracker

---------

Co-authored-by: briaguya <briaguya@alice>
2023-02-16 20:10:31 -05:00
briaguya f4f10e4a49 don't show duped sequence names, don't repeat track intros on barinade (#2482)
* better fix for repeated sequence names, add delay to fix repeated bgm on barinade

---------

Co-authored-by: briaguya <briaguya@alice>
2023-02-16 18:45:51 -05:00
briaguya 6b93da37d4 fix: use cache on LoadFileRaw (#2489)
* fix: use cache on LoadFileRaw

this makes it so explosions don't use the dpad texture

---------

Co-authored-by: briaguya <briaguya@alice>
2023-02-16 18:05:36 -05:00
David Chavez 6cd7066706 Generate assets with MQ present (#2485) 2023-02-16 13:32:01 -05:00
AltoXorg 877fc2dcca use the convenient printf fomat as ImGui::Text supports it (#2486) 2023-02-16 11:37:27 -05:00
briaguya 1e6ec1bdda exclude audio from shuffle (#2411)
* Rename "SFX Editor" to "Audio Editor"
* Move some functionality out into a new class `AudioCollection`
* Add a tab to exclude sfx/sequences from shuffle pool 

---------

Co-authored-by: briaguya <briaguya@alice>
Co-authored-by: briaguya <briaguya>
Co-authored-by: David Chavez <david@dcvz.io>
2023-02-16 09:49:45 -05:00
briaguya 27f961ac4f bump lus (#2483)
Co-authored-by: briaguya <briaguya@alice>
2023-02-16 00:27:01 -05:00
briaguya deb47ea430 hintless altar text (#2456)
Co-authored-by: briaguya <briaguya@alice>
2023-02-15 21:00:44 -05:00
Bigs d275740c88 Separate X/Y axis sensitivity sliders (#2472)
* Update z_camera.c

* Update GameControlEditor.cpp

* Update GameControlEditor.cpp

* Update GameControlEditor.cpp

Adding Sliders for first person X and Y axis

* Update z_player.c

Modified variables to allowed separate sensitivity settings for x and y axis
2023-02-15 20:42:21 -05:00
David Chavez 8934274c67 [GameInteractor] Game Hooks (#2481) 2023-02-15 20:30:34 +01:00
David Chavez 2c10bca615 Fix compilation against latest libultraship (#2479) 2023-02-15 11:06:19 +01:00
Bigs b19c72070d Enhancement Toggle - Disable Automatic First Person Mode for Bombchus (#2471)
* Update z_camera.c

* Revert "Update z_camera.c"

* Update GameMenuBar.cpp

Added tickbox for NoFPChus

* Update z_player.c

Added check for Disable First Person Bomchus enhancement

* Update z_player.c

Removed comment as statement is clear on its own

* Update GameMenuBar.cpp
2023-02-15 01:47:38 -05:00
Kenix3 3a4a260e21 SoH now uses the multithreaded resource manager. (#2467)
* SoH now uses the multithreaded resource manager.

* Fixes build errors on Linux and decreases audio heap size.

* Updates LUS.
2023-02-15 01:02:09 -05:00
Ralphie Morell 7c3c662eba Rando: Allow strings as seed hashes (#2438)
* Allows strings to be used for rando seed hashes;
updated conversion method from `stoi` to `stoul`

* apply suggestions

* Allow spaces + autoselect on input field focus

* Added new text filter; applied suggestions

* leaving 3d rando logic alone

* Apply more suggestions

* Revert buffer size to 1024
2023-02-14 21:43:25 -05:00
PurpleHato e60f2b0c55 ADD: Time Savers -> Link as default file name (#2475) 2023-02-14 21:15:15 -05:00
Cardboy777 2241635ac5 Option for link's models reflect the projectile weapon he's holding (Bow/Slingshot) (#2454)
* Link's models reflect the projectile weapon he's holding

extracted logic from months-old PR

* apply bow/slingshot model changes only if 'gBowSlingShotAmmoFix' is enabled

* Apply suggestions from code review

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* whitespace

---------

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
2023-02-14 21:14:42 -05:00
Cardboy777 218971c4a9 Option for projectile ammo to match item instead of age (#2453)
* Projectile ammo matches ItemAction instead of age

extracted logic from months-old PR

* Added cvar under "Enhancements -> Gameplay -> Items" for bow/slingshot ammo

* Update GameMenuBar.cpp
2023-02-14 21:14:20 -05:00
Garrett Cox 462ab00c7e Save skipped checks (#2476) 2023-02-14 20:50:59 -05:00
PurpleHato 622d8c4aff TWEAK: Debug Warp Translations errors (#2464)
Volvagia is Vulcania in french (I'm so used to it in English)
and I somehow put the german version of dodongo's cavern in french, oops
2023-02-14 08:56:25 -05:00
PurpleHato 75782e4019 TWEAK: German Rando Navi Hint (Shiek Name) (#2463)
In German Shiek is called Sheik (something related to how they switched letter to conserve the wanted pronunciation of the name)
2023-02-14 08:55:12 -05:00
David Chavez 66b2d2d5fa Add asset headers (#2465) 2023-02-14 08:29:46 -05:00
louist103 8c87bc13db More junk hints. (#2417)
* More junk hints.

* More hints.

* Update soh/soh/Enhancements/randomizer/3drando/hint_list.cpp

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* More junk hints.

* More hints.

* Remove a hint.

---------

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
2023-02-13 22:50:13 -05:00
Adam Bird 67421179e4 Fix: Rando settings not being initialized in time (#2461)
* fix entrance init and entrance tracker not working properly when no spoiler log is loaded

* fix rando adult trade spoilable items reverting when no spoiler log loaded
2023-02-13 02:00:59 -05:00
Adam Bird 1e9f8df33b Fix: Hyrule Field bridge entrance and sun song placing link out of bounds in Entrance Rando (#2457)
* fix market night escape to work with entrance rando; adjust HF bridge spawn to not have link fall in water at night

* use scene enums for ER logic instead of magic nums

* fix sun song loading are with wrong link position with grotto shuffle on

* Update soh/soh/Enhancements/randomizer/randomizer_entrance.c
2023-02-12 23:34:16 -05:00
PurpleHato 8f9dc17752 FIX: Inverted Night and Day in German (#2448) 2023-02-12 17:58:57 -05:00
briaguya df1e26d4cd fix rainbow popping (#2441) 2023-02-08 00:19:48 -05:00
Adam Bird fdf9d51444 update cvar name for n64 mode (#2440) 2023-02-08 00:18:53 -05:00
briaguya 242a35c3a0 bump version (#2434) 2023-02-07 00:04:19 -05:00
Adam Bird f57cae120d Fix: exclude locations not updating and add more location logic (#2428)
* fix location tab not updating and remove hidden excludes during generation

* add more exclude locations and fix broken ones

* update check tracker check visibility

* rename enum

* rename enums again
2023-02-06 20:51:26 -05:00
PurpleHato 177194ca5a ADD: Exit Market at Night to rando preset (#2432) 2023-02-06 17:06:40 -05:00
PurpleHato 3218b2def2 FIX: Song's Overlay with Fast Ocarina Playback (#2431)
* FIX: Affected songs

* TWEAK: Addressed comments
2023-02-06 10:56:40 -05:00
David Chavez 8a76a3aa83 Fix: Hang on exit game and CC is enabled (#2427)
Happens during dev - might affect release, so PRing this.
2023-02-06 11:02:51 +01:00
Ralphie Morell 5771e6cd1f Fix spillover on goron messages (#2425) 2023-02-01 00:12:21 -05:00
aMannus e14fcf92d2 Fix GI overruling link size over anything else (#2424) 2023-01-31 07:21:16 -05:00
aMannus 612700c2ab Change gPauseAnyCursor into combobox (#2423)
* Change gPauseAnyCursor into combobox

* Add enums

* Change naming
2023-01-31 06:53:22 -05:00
Adam Bird 4e08eca1b9 adjust closed forest and starting age settings for edge cases (#2421) 2023-01-30 22:51:41 -05:00
Sirius902 44f963e310 Rumble and check tracker fixes (#2419)
* Fix rumble

* Fix check tracker crash
2023-01-30 12:33:52 -05:00
Sirius902 544460d909 QPA restoration (#2422) 2023-01-30 08:43:30 -05:00
PurpleHato f6c310ae84 TWEAK: Controller Navigation rename + tooltip (#2407)
* TWEAK: Controller Navigation rename + tooltip

* TWEAK: add back FW

* TWEAK: Button size + name

* TWEAK: Tooltip and text position

* TWEAK: added a PaddedSeparator

* TWEAK: Removed the padding from aMannus Request
2023-01-28 12:02:38 -05:00
PurpleHato 9b020c0986 TWEAK: Misspelling "Gold" in German + Box formating (#2416) 2023-01-28 10:51:41 -05:00
lilDavid 3617b2e5b7 Fix chest sizes making contents unobtainable (#2410) 2023-01-28 10:17:47 -05:00
aMannus 72dcf3466b Check tracker fixes (#2414) 2023-01-27 19:16:31 -05:00
Adam Bird 0aab836d1f Fix: Override jail capture for the Gerudo fighter (#2413)
* handle overriding gerudo capture for the fighter

* add entrance include
2023-01-27 18:36:38 -05:00
Garrett Cox 9fe7839f9a Adjustment to gFastFarores tooltip (#2409) 2023-01-27 01:39:35 -05:00
David Chavez 22efba8cd7 Fix: Quit Game (#2403)
* Fix quit implemention in console & window

* Point to latest LUS

* match lus from develop
2023-01-26 20:10:00 -05:00
Adam Bird 1e2b60c6e0 clear cvars that lock up randomizer menu on boot (#2405) 2023-01-26 20:09:33 -05:00
PurpleHato 279553e6b3 TWEAK: Forgot some translation on Debug Warp Screen (#2406) 2023-01-26 20:09:21 -05:00
briaguya 0df5060541 bump lus (#2408) 2023-01-26 19:41:16 -05:00
Kenix3 47f206825d Debug camera (#2400)
* Moves SoH mixer to SoH from LUS.

* Debug camera now works in SoH, but mempak saving does not (yet).

* Debug camera is now enabled/disabled based on the gDebugEnabled cvar.

* Updates OTRGlobals comments

* Updates OTRGlobals comments
2023-01-26 18:43:09 -05:00
Christopher Leggett 569013535e Improves the Block Pushing Speed Enhancement (#2396)
* Increases the actual block pushing speed.

Previously this enhancement only decreased the delay between pushes in any noticeable way because the top speed of the blocks was clamped. The enhancement now increases the top speed of the blocks according to the slider's value.

* Applies previous changes to milk crates.

* Applies same fix to fire temple stone blocks

(I believe these are the ones with the faces on them)

* Applies fixes to Poe painting blocks (forest temple)
2023-01-26 00:58:26 -05:00
Adam Bird 589e25948e Add manual seed input for rando generation (#2057)
* add manual seed input for rando generation

* add tooltip for seed input

* switch to calloc

* add seed testing count generator

* add console command for rando gen

* add boost and custom hash_32 functions

* use hash_32 funcs for rando generation

* limit seed input field to uint32

* rename custom boost header imports to boost_custom
2023-01-25 18:33:27 -05:00
aMannus 170a9103f9 Implement GameInteractor & move CrowdControl and console commands to it (#2358)
* Begin GameInteractor

* Basic skeleton of PoC

* WIP

* First 2 CC effects transitioned to GameInteractor

* Prepare GameInteractor classes for CrowdControl

* More effects & replace chaosEffects with GameInteractor

* CC connection fixes & all CC effects (enemy spawns still borked)

* First couple of build error fixes

* Fix build

* Proper enemy spawning

* Clean up old CC code

* Extract link size/invisibility into GameInteractor

* Small fix/cleanup

* Suggestions for PR

* Address PR comment

* Addressed more comments & small adjustments

* Fix crash when spawning enemies

* Remove Remove()

* Move checks into Apply() and move CC and some console commands to it

* Use inheritance to abstract check on application

* Rename prefix Actions with RawAction

* Make Remove return a Result

* Fix issue with compilation

* debugconsole -> GameInteractionEffects progress

* Add State in GI

* Unify some Effects

* Port more debug console items

* Remove state modifyiers from raw actions

* Port over last raw action / state in console

* Adjust some types

* Consolidate link size modifier effect

* Adjust more types

* Define category strings in CC

* Clean up remaining non defined strings

* Fix bug in timed effects

* Rename old pack

* CC fixes

* Translate GI enum function

* Console cleanup/fixes/consistency

Co-authored-by: David Chavez <david@dcvz.io>
2023-01-25 18:13:33 -05:00
tcpowell ec4cee787c Gameplay Stats Tweaks (#2379)
* persist stat tracker across sessions

* fix tab spaces

* configurable gameplay stats display

* streamline to use AddWindow method
2023-01-25 17:43:50 -05:00
Garrett Cox 7a75fe8411 Add faster farores enhancement (#2394)
* Add faster farores enhancement

* Add preset entry
2023-01-25 17:27:11 -05:00
Ralphie Morell 6d6c1c8c32 Enhancement: Better Farore's Wind (#2374)
* Updated SaveManager, SaveContext;
lifted restriction from gtg and ganon's castle;
disabled clearing fw during master sword lift;
added checkbox

* increment load version (whoops); clear age fw after use

* beef up fw console handler (for testing)

* Simplify better FW (2 copies > 1 copy)

* Apply suggestions

* whoops
2023-01-25 14:32:21 -05:00
Garrett Cox 21ae445548 Add missing trade sequence items from gameplay stats (#2393)
* Add missing trade sequence items from gameplay stats

* Update soh/soh/Enhancements/gameplaystats.cpp
2023-01-24 16:08:38 -05:00
PurpleHato 5c21bb0b8a TWEAK: German mistake (#2392) 2023-01-24 15:39:37 -05:00
briaguya 6b6cfa5ebe rupee name cleanup (#2391)
* fix: add missing comma to fix oob

* bring back some old rupee names, remove some that don't render properly

Co-authored-by: briaguya <briaguya@alice>
2023-01-24 01:11:48 -05:00
Adam Bird 402d7dd3b7 fix wrong flag name for zeldas letter define (#2390) 2023-01-24 00:51:48 -05:00
Garrett Cox 0629140357 Don't require input for credits textboxes (#2193)
* Don't require input for credits textboxes

* Use cvar instead of rando flag
2023-01-23 17:47:54 -05:00
Garrett Cox beb414eb0a Add cheat for extending hookshot reach (#2178)
* Add cheat for extending hookshot reach

* Adjust cvar usage
2023-01-23 17:28:50 -05:00
lilDavid 2422c94f6b Rando: Shuffle 100 Gold Skulltula Reward (#1944)
* Shuffle 100 token reward

* Add 100 token hint

* 100 GS Shuffle: Fix name inconsistency

* Add 10 tokens to plentiful pool

* Ganon's Boss Key on 100 GS Reward

* Golden Skull Token -> Gold Skulltula Token

* Properly disable 100 GS reward shuffle check box

* Use enums for 100 GS shuffle

* Fix mismatched LUS

* Fix CVar calls

* ADD: French translation

* Only add extra tokens in Tokensanity

Co-authored-by: PurpleHato <linkvssangoku.jr@gmail.com>
2023-01-23 17:01:52 -05:00
Garrett Cox e5bc5188e7 Actor view values now using pointers rather than copies, add playerState flags to save editor (#2388) 2023-01-23 16:39:05 -05:00
Garrett Cox eb222f3998 Add enhancement for dog following you everywhere (#2050)
* Add enhancement for dog following you everywhere

* Persist dogParams to save file

* Make doggo float in water

* Wrap change in cvar condition and update cvar usage
2023-01-23 16:22:28 -05:00
Garrett Cox a1cb921042 v1 Dlist Viewer (#2387) 2023-01-23 16:04:37 -05:00
PurpleHato e79bd2587d ADD: Debug Warp Restoration + Translations (#2386)
* Finish translations for Map Select

* First Pass

* TWEAK: Add back Japanese as default to conserve vanilla

* TWEAK: replace some array with structs + some translations

* TWEAK: loading messages [TODO: proper translations]

* TWEAK: forgot to push z64.h for loading messages + translated scene type

* TWEAK: spacing

* TWEAK: comment

* TWEAK: Small german OPT position

* TWEAK: german typo

* TWEAK: translation to cutsceneLabels

* TWEAK: Nabooru's name + Lairs

* TWEAK: Updated Cvar to new way to call them

* ADD: German

* Debug localization

* TWEAK: Age

They are noted as a flag thingy and not a literal age

* Tweak: Frogot the Great Fairy

* TWEAK: adressed comment

Co-authored-by: Amaro Martínez <xoas@airmail.cc>
2023-01-23 15:36:28 -05:00
Adam Bird cb5faa1ac8 fix mido spawn for dungeon entrance rando (#2384) 2023-01-23 14:08:16 -05:00
Adam Bird 37f31116b3 Add reset/randomize all SFX and Cosmetic commands to console (#2378)
* add reset/randomize all commands to debug console for sfx and cosmetic editor

* fix cvar func
2023-01-22 03:51:23 -05:00
AltoXorg 52a976489b implement audio backend fallbacks (#1857)
* audio & rendering backend option greyed out if theres only one

* add audio fallback code

* InitializeAudioPlayer/WindowManager add param

* string -> string_view

* Revert "audio & rendering backend option greyed out if theres only one"

This reverts commit e94a7fff50.

* revert lus changes

* moved fallback function to LUS

* use audioplayerbridge
2023-01-21 18:05:05 -05:00
splemb 643a98244b Enhancement: MM-Style Static Explosion Radius (#2322)
* Adds Static Explosion Radius Enhancement

* Changed default value

* Update libultraship

* Update CVar Syntax

* Revert "Update libultraship"

This reverts commit d0e243565a.
2023-01-21 17:45:43 -05:00
nianjiilical a58705eaf4 Rando: Adds 90~ new random rupee names, alphabetizes them (#2330)
* more rupee names

* typo

* feedback

* more feedback
2023-01-21 17:09:42 -05:00
briaguya a9e7faa180 Full health spawn (#2377)
* full health spawn

Co-authored-by: MoriyaFaith <46070717+MoriyaFaith@users.noreply.github.com>

* add enahancement to gamemenubar, update to use new cvar method names, simplify save loading logic so loading a save with less than 3 hearts spawns with full hearts with enhancement enabled instead of spawing with 3

* formatting

Co-authored-by: MoriyaFaith <46070717+MoriyaFaith@users.noreply.github.com>
2023-01-21 09:36:35 -05:00
aMannus 4291ec8252 Rando - Ganon & Ganondorf cutscene skips (#2321)
* Ganon(dorf) cutscene skips

* Remove leftover code

* Comment out the Ganondorf dying cutscene skip
2023-01-21 07:55:53 -05:00
briaguya 2a9d93dd65 fix: return enum value so mido moves away properly (#2376)
when pulling in documentation i missed a couple returns
this was causing mido to never stop blocking the path to the deku tree
after searchign the codebase, i found two instances of this mistake
this pr fixes them

Co-authored-by: briaguya <briaguya@alice>
2023-01-21 06:31:33 -05:00
David Chavez 33539be458 [CI] Linux Performance Builds (#2323)
* Add linux matrix for performance linux build

* Update README
2023-01-20 22:23:35 -05:00
pancake-byte 6e417713b9 Update BUILDING.md (#2332)
* Update BUILDING.md

Adds a note to be sure to pull in libultraship when building for Windows

* Fix syntax for consistency

* Maybe this is better?

I'm doing great. XD
2023-01-20 22:06:14 -05:00
Christopher Leggett 1b9962dfc2 Enhancement: Adds Slider for Duration of Sequence Names on the Overlay (#2375)
* New function: overlay text duration in seconds.

`Overlay_DisplayText` took a float as an argument, with no clear indication of what that float represented. That float also evaluates to different durations given different frame rates. However, since we know what the frame rate should be at any given time (since it's stored in a CVar) we can calculate what this duration should be based on the number of seconds we want the overlay to be displayed. That's what `Overlay_DisplayText_Seconds` does.

* Adds Slider for Overlay Sequence Name Durations
2023-01-20 21:48:17 -05:00
aMannus 1b9ab52e35 Tweak - Rando freestanding/skulltula ice trap behaviour (#2230)
* Improve skulltula ice traps

* Improve freestanding ice traps

* Merge fix
2023-01-20 21:30:49 -05:00
Adam Bird 261db2c3e1 Rando: Boss Entrance Shuffle (#2194)
* sync 3ds upstream logic changes for boss rooms

* add boss shuffle settings and handling to 3ds code

* add boss shuffle handling to game code

* repair authentically bugged entrances for boss shuffle

* add boss entrances to the entrance tracker

* unset hint area for boss rooms to fix altar hint

* update boss reward hints to not mention dungeons

* one more boss heart container hint fix

* reorder entrance rando funcs

* support closed forest with boss shuffle and simple boss room entrance pairs in shuffle table

* fix death warp in boss rooms without saving; fix KD boss room in tracker

* remove boss shuffle check from dungeon open checks and some cleanups

* add boss shuffle to preset clear

* remove dungeon entry exit connection from boss rooms

* another no hint fix for boss shuffle

* undo change for exact location hints

* clarify comments
2023-01-20 01:00:12 -05:00
Ralphie Morell 7964bde063 Rando: Misc. Hints (#1947)
* Added too much

* Added 3d settings and brought over to soh

* fixed conditionals for replacing LA hint

* whoops

* Finshed making settings consistent; minor text edit

* fix leftovers from adding warp hints

* more fixes from merge

* fix skull hint messages

* Added fire temple goron junk hints; menu stuff

* Address feedback

* Added optional scrub text

* whoops

* Add hint cvars to clear preset func

* whoops again

* whoops the third

* ADD: French Pass

* FIXED: Dampe + Skull Reward

* TWEAK: German skulltula hint

* TWEAK: French oopsie

* Address feedback

* whoops

* remove "staticness" from altar/ganon text funcs

* ADD: German

* actually add warp song hints to things;
always generate ganon hint and let OTRGlobals handle showing it

* Fix CVar Getters

* whoops

* for real this time

* Actually implemented scrub text in 3d rando

Co-authored-by: PurpleHato <linkvssangoku.jr@gmail.com>
2023-01-19 23:45:34 -05:00
Christopher Leggett 1e178c4497 Bugfix: Update LUS submodule to fix Matrix crash. (#2373) 2023-01-19 21:55:19 -05:00
Patrick12115 c0ad43e509 Add Starting Songs Option (#2221) 2023-01-19 04:54:29 -05:00
th-2021 d6dbaacb03 add OPTIONAL flag to avaid error when OTRGui is not build (#2299) 2023-01-19 04:47:21 -05:00
briaguya d9662ab63b fix: update cvar usage from merge 2023-01-19 04:33:07 -05:00
briaguya 52b182d4dc Merge pull request #2371 from HarbourMasters/develop-bradley
brad -> dev
2023-01-19 04:31:34 -05:00
Christopher Leggett 12737143c7 Adds option to add higher pitches to silver rupee jingle (#2246)
* Adds option to add higher pitches to silver rupee jingle.

Some rooms in Master Quest had 10 silver rupees, but the game was programmed to only play the jingle 5 times and then just went silent for the rest. This option adds 5 more transposition values to the array, and an option to play them (so that authentic behavior is preserved by default).

* Adds the new option to Vanilla Plus preset and up

Also adds it to the list to be reset back to 0 when applying the default preset.

* Changes display name of checkbox.

* Change CVar_GetS32 to CVarGetInteger
2023-01-19 04:10:47 -05:00
Christopher Leggett a335aba987 Adds option for showing sequence names on the overlay (#2237)
* Adds option for showing sequence names on the overlay

Allows sequences to appear on the overlay in the bottom right corner for a few seconds whenever a new one is loaded into the primary sequence player. This means it does not apply to fanfares or enemy bgm. Fanfares I chose not to display because it would cause a lot of text to display back to back in some areas, and enemy bgm would have some technical challenges with this due to the way it loads. Mainly because the Lost Woods music would load in Goron City the same way (as well as the opposite).

* Fixes crash when a sequence without a name is attempted to be displayed.

* Removes accidentally committed CMakeSettings.json

* Updates CVar_GetS32 to CVarGetInteger
2023-01-19 03:50:50 -05:00
Christopher Leggett edceb2d460 Adds lock/unlock all buttons to Cosmetics Editor. (#2225)
* Adds lock/unlock all buttons to Cosmetics Editor.

Adds Lock All and Unlock All, which locks all visible cosmetics options (i.e. does not lock the advanced options if Advanced isn't checked, just like the existing randomize all buttons), and a Lock All Advanced and Unlock All Advanced button that is only visible while the Advanced Options are enabled.

* Updates latest develop and CVar API Changes.
2023-01-19 03:32:05 -05:00
briaguya 7c8be2153c documentation: use NpcInteractInfo from zret (#2370) 2023-01-19 02:38:04 -05:00
David Chavez 32ad0ab4b8 Bump version 2023-01-18 19:21:38 +01:00
aMannus a5f7478b99 Fix CC connection bugs (#2367) 2023-01-18 16:56:32 +01:00
briaguya 207d38e476 bradley -> dev #2365 2023-01-18 01:43:46 -05:00
briaguya c36e9cc32d Merge remote-tracking branch 'origin/develop-bradley' into bradmerge 2023-01-18 01:21:18 -05:00
briaguya 745444fa90 update LUS submodule (#2363) 2023-01-18 01:15:54 -05:00
briaguya 750ae907c2 sdl windowed fullscreen (#2351) 2023-01-17 22:14:45 -05:00
Kenix3 2e4a19c0ee Moves SoH mixer to SoH from LUS. (#2361) 2023-01-17 22:03:55 -05:00
briaguya f665326a67 workaround for vanilla save check tracker crash (#2359)
Co-authored-by: briaguya <briaguya@alice>
2023-01-17 21:40:02 -05:00
briaguya 418d0f8e6c fix: default cvar values before applying presets (#2357) 2023-01-17 17:57:02 -05:00
UltraHDR 13b8f26435 Set LSApplicationCategoryType to games 2023-01-17 17:19:35 -05:00
AltoXorg ba5d5c25d1 changes to the asset extraction script (#2068)
- fixes exiting with Ctrl+C on linux
- chooseROM returns Z64Rom object in addition to speed
- adds simple verbosity for inspecting roms
2023-01-17 17:05:24 -05:00
briaguya 6be1f28d7b brad -> dev 2023-01-17 16:45:59 -05:00
briaguya 15a6568607 Merge branch 'develop' into bradmerge 2023-01-17 16:44:46 -05:00
briaguya 1fe862515d fix top left dungeon entrance icon in graveyard (#2303)
Co-authored-by: briaguya <briaguya>
2023-01-17 15:42:09 -05:00
Adam Bird 6eef813e5d fix wrong entrances in epona check handler (#2352) 2023-01-17 15:20:21 -05:00
Adam Bird 76c9895432 add missing medigoron hint text (#2339) 2023-01-17 15:19:22 -05:00
Adam Bird 048207eb7d Fix exiting courtyard at night not taking link to castle grounds in dungeon entrance randomizer (#2316) 2023-01-17 15:18:59 -05:00
Amaro Martínez 170b9c1224 Disable BEL char by default when terminal attached (#2306) 2023-01-17 15:18:13 -05:00
Adam Bird 1e7cf8858f fix one-way entrances making some entrances disappear from the overrides (#2318) 2023-01-17 21:07:58 +01:00
Adam Bird 4b10a887a6 Fix: Remove MQ Spirit Temple silver block for child to guarantee access to the chest (#2342) 2023-01-17 21:05:19 +01:00
Adam Bird ff3548a1b6 Rando: Adjust locked door logic for temples and give starting keys for MQ Spirit (#2343) 2023-01-17 21:03:08 +01:00
Adam Bird fda198db76 Fix: Reset waterbox collisions in Lake Hylia and Morphas room (#2346) 2023-01-17 21:01:45 +01:00
Andrew Van Caem 7f06087cef Altered save flag docs concerning events in Mido's house (#2311) 2023-01-17 14:46:42 -05:00
Garrett Cox 6ae28273d1 Fix Ganon Boss Key for MQ only otrs (#2295) 2023-01-17 14:23:00 -05:00
Amaro Martínez 5b2a50cac2 Remove repeated preset entries (#2294) 2023-01-17 14:01:45 -05:00
briaguya 1e258318a1 fix: properly randomize mirror shield and silver gaunts chests when using only an mq otr (#2291) 2023-01-17 13:17:00 -05:00
PurpleHato 156de816fb FIX: Equip now message (#2286) 2023-01-17 12:40:05 -05:00
briaguya ba13e6b2c4 refactor: use LUS 1.0 RC
Co-authored-by: kenix3 <kenixwhisperwind@gmail.com>
Co-authored-by: David Chavez <david@dcvz.io>
Co-authored-by: KiritoDv <kiritodev01@gmail.com>
Co-authored-by: Christopher Leggett <chris@leggett.dev>
2023-01-17 00:33:56 -05:00
briaguya ecb10e6ac2 chore: bump sdl version in appimage (#2288)
Co-authored-by: briaguya <briaguya@alice>
2022-12-27 19:33:40 -05:00
briaguya ab104623a7 Merge pull request #2233 from HarbourMasters/develop-bradley
bradley -> dev
2022-12-27 16:47:49 -05:00
briaguya f42f86e3ef fix: make fisherman rumble text work (#2279)
we weren't correctly setting the pakType in padMgr because
the depreciated `gRumbleEnabled` cvar was being checked
2022-12-26 06:37:40 -05:00
briaguya 85bccab1bb bump lus version (#2269)
* bump lus version

* Fixed StringHelper issues caused by the latest lus version

Co-authored-by: KiritoDv <kiritodev01@gmail.com>
2022-12-24 17:49:54 -05:00
briaguya 7768869251 bump version 2022-12-24 00:58:15 -05:00
briaguya 013244560e hi mom (#2261)
Co-authored-by: aMannus <mannusmenting@gmail.com>
2022-12-24 00:45:02 -05:00
Adam Bird 9529cc1217 SFX: Support replaying the current BGM when changed (#2150)
* add support for reloading the current bgm when changing it in the sfx editor

* clarify audio command with comment

* fix wrong seq type after merge
2022-12-23 23:50:39 -05:00
briaguya 0017bf1fcc fix: correct item ordering in kak potion shop (#2256)
Co-authored-by: briaguya <briaguya>
2022-12-23 22:27:19 -05:00
aMannus f6a7f3d13c Fix enemy rando flags (#2253) 2022-12-23 22:27:01 -05:00
aMannus 99367ebb53 Fix silver rupee room in GtG (#2252) 2022-12-23 22:26:26 -05:00
Adam Bird d215c76eba fix shopsanity spawning objects for actors (#2247) 2022-12-23 22:26:01 -05:00
aMannus 07bae6b84c Fix common enemy rando crashes (#2242) 2022-12-23 22:25:38 -05:00
briaguya 6eaf51c2bd version bump (#2232) 2022-12-21 14:11:19 -05:00
aMannus 565775a3dc Fix ice trap particles (#2229) 2022-12-21 11:14:00 -05:00
aMannus 9eb190e734 Fix particle regression (#2228) 2022-12-21 10:40:23 -05:00
briaguya 5ce4e75bd2 Merge pull request #2227 from HarbourMasters/develop-bradley
bradley -> dev
2022-12-21 03:46:12 -05:00
Garrett Cox 0e7a89d117 Fix crash on mac with custom sequences (#2226) 2022-12-21 03:04:11 -05:00
briaguya 73873a6dbc fix: no longer leak memory, invalidate textures properly (#2223)
* Revert "Fix Ganondorf boss battle ending (MQ only) (#2072)"

This reverts commit 52b896271c.

* yolo this should work

* finish comment

* see if this doesn't lag switches!

* formatting

* formatting

Co-authored-by: briaguya <briaguya@alice>
2022-12-21 01:26:13 -05:00
aMannus e03ef85f3b Enemy Rando Hyrule Field crash hotfix (#2222) 2022-12-21 01:03:05 -05:00
Christopher Leggett 8c8111c7b8 Small improvement to sfx randomize button. (#2219)
Should result in less allocations.
2022-12-21 00:31:51 -05:00
GaryOderNichts 1a10d8f627 Fix AdpcmBook allocations (#2214) 2022-12-21 00:15:05 -05:00
aMannus a1a6c07549 Rando - Fix ice traps & get item logic (#2210)
* Fix ice traps & get item logic

* Fix shop keepers & more draw logic cleanup
2022-12-20 23:32:01 -05:00
Adam Bird 6f7361e1a4 only save authentic sequence cvars (#2216) 2022-12-20 17:09:12 -05:00
Garrett Cox 95f1ba7202 Fix cosmetic oob hacks (#2211) 2022-12-20 16:21:00 -05:00
GaryOderNichts 4eee417520 WiiU: Don't invalidate tex cache for dodongo (#2220) 2022-12-20 15:52:13 -05:00
GaryOderNichts 0f3c2d7c78 Fix gfx patching on 32-bit platforms (#2213) 2022-12-20 14:19:25 -05:00
louist103 4d8c70fb1f git subrepo push ZAPDTR
subrepo:
  subdir:   "ZAPDTR"
  merged:   "e23b125d8"
upstream:
  origin:   "https://github.com/HarbourMasters/ZAPDTR.git"
  branch:   "master"
  commit:   "e23b125d8"
git-subrepo:
  version:  "0.4.3"
  origin:   "???"
  commit:   "???"
2022-12-20 02:54:33 +01:00
aMannus 17b1a8e7fd [CI] Support for Windows runners + update docs (#2192) 2022-12-19 13:58:22 +01:00
briaguya a95b1067b4 Merge pull request #2207 from HarbourMasters/develop-bradley
bradley -> dev
2022-12-19 05:31:43 -05:00
Christopher Leggett 56ac27b8f4 Fixes crash during randomization of individual sound effects. (#2203)
* Fixes randomization of individual sound effects.

* Re-adds the mistakenly removed const specifier.

* Implements new randomization syntax that actually fixes the crash.

* Increases default width of sfx editor menu.

The default width was cutting off a lot of the text in the dropdowns due to the added Randomize button.
2022-12-19 05:12:36 -05:00
PurpleHato 4999df5395 TWEAK: Rando Text (French / German) (#2204)
* TWEAK: Some Rando Text

French and German tweaks (German made by Timmy_GamerNepgear on Discord)

Tweak: water control level style to fits Navi's style textboxes

* TWEAK: %c instead of %w
2022-12-18 21:07:05 -05:00
Adam Bird 51f3e37010 fix medi goron not selling randomized item and continuously selling knifes (#2206) 2022-12-18 20:07:35 -05:00
Adam Bird c4b077d83b fix warp song hints not being set if gossip stones are turned off (#2197) 2022-12-17 20:06:23 -05:00
Garrett Cox be38b41644 [#361] Fix ganon boss offset on retail rom (#2190) 2022-12-17 19:51:52 -05:00
Garrett Cox d3f2da2a8f [#1803] Fix hookshot target offset on retail rom (#2189) 2022-12-17 19:21:00 -05:00
KiritoDev 166a6691fc Fixed nintendo switch debug flags (#2202) 2022-12-17 19:08:32 -05:00
briaguya a6120811d5 bradley -> dev #2187 2022-12-14 01:33:30 -05:00
briaguya a05bc1e29f bump version (#2185)
Co-authored-by: briaguya <briaguya@alice>
2022-12-13 23:48:54 -05:00
briaguya 2720292b08 bump lus verison (#2184)
Co-authored-by: briaguya <briaguya@alice>
2022-12-13 23:47:12 -05:00
Christopher Leggett 8a69f1f020 Fixes receiving the wrong item when picking up ammo drops near a chest. (#2183)
* Fixes receiving the wrong item when picking up ammo drops near a chest.

Still shows the wrong model above links head but does give the right
item and shows the right text.

* Fixes get item model during first time pickup anim near chest.
2022-12-13 23:27:51 -05:00
briaguya e71583d47c fix: populate merchant prices table with expensive scrub prices (#2181)
* fix: populate merchant prices with vanilla scrub prices

* temporary expensive scrub workaround

Co-authored-by: briaguya <briaguya@alice>
2022-12-13 21:57:59 -05:00
Garrett Cox 5965cdb193 Fix save compatibility issue from renames (#2177)
* Revert json key changes in save v1 and v2

* Introduce save v3

* Add workaround for breaking save compatibility in 5.1.0

* Handle scarecrow long song a bit differently since the array is never empty
2022-12-13 19:18:18 -05:00
Christopher Leggett 7718e74d73 Always use authentic cache policy for replaced seqs (#2176) 2022-12-13 14:55:00 -05:00
briaguya 639e51bb8e bump version (#2174)
Co-authored-by: briaguya <briaguya@alice>
2022-12-12 23:59:05 -05:00
briaguya 9a9b4bd679 fix: set color picker alpha on reset (#2173)
* fix: set color picker alpha on reset

Fixes a bug where the colour picker enhancement widget without alpha uses a garbage value for alpha on reset

Co-authored-by: sonoftunk <sonoftunk@gmail.com>

* formatting

Co-authored-by: sonoftunk <sonoftunk@gmail.com>
Co-authored-by: briaguya <briaguya@alice>
2022-12-12 23:40:27 -05:00
Garrett Cox 99c1f046a6 Move entrance tracker button down one (#2172) 2022-12-12 23:07:46 -05:00
Adam Bird d2a5f6a06c Add missing randomizer options to default preset (#2171)
* add all randomizer options to the default preset clear

* fix typo in randomizer menu

* remove enhancements from randomizer preset clear list
2022-12-12 22:36:50 -05:00
Garrett Cox 389a3b1709 [#2165] Rename big key to boss key for spoiler files (#2170) 2022-12-12 21:58:32 -05:00
Garrett Cox 462eb6d25a Fix issue with hover boots interpolation when wearing bunny hood (#2167) 2022-12-12 21:32:24 -05:00
briaguya efd40d0b89 fix: show always shuffled scrubs on check tracker (#2161)
Co-authored-by: briaguya <briaguya@alice>
2022-12-12 21:14:16 -05:00
briaguya 7676cca589 fix: always add anju as adult and trade claim check to location tracker (#2162)
Co-authored-by: briaguya <briaguya@alice>
2022-12-12 20:53:13 -05:00
Christopher Leggett f80091af77 Prevents autosave during Ganon fight. (#2163)
* Prevents autosave during Ganon fight.

* Removes unnecessary switch case.
2022-12-12 20:50:13 -05:00
briaguya 0b24f3274a add rupee name (#2164)
add "Strawbs" from Celeste

Co-authored-by: briaguya <briaguya@alice>
2022-12-12 20:39:14 -05:00
briaguya a99892c09b fix: get gravedigging tour in check tracker working in rando (#2159) 2022-12-13 02:04:13 +01:00
frizzle101101 cabcfb009c improving free cam settings configurability (#1987)
* Initial camera distance slider

* works with freecam

* improving the settings configurability, adding distance slider and transition speed for the free camera
adding seperate sensitivity and invert settings for aiming/first person camera

* spelling

* tooltip msg on camera invvert

* typos

* removing the original free camera checkbox in experimental menu

* adding name change to new presets file

Co-authored-by: RaelCappra <rael.cappra@gmail.com>
2022-12-12 16:10:28 -05:00
frizzle101101 cb4a0aa21b added fix option to fix camera swing; (#1992)
* added fix option to fix camera swing; Fixes camera getting stuck on collision when standing still, also fixes slight shift back in camera when stop moving

* add option to fix hang off ledge swing rate; Fixes camera swing rate when player falls of a ledge and camera swings around

* adding camera fixes to preset list
2022-12-12 15:31:33 -05:00
Christopher Leggett e4ebdf76d9 Fixes crash due to OOB soundfont access. (#2157) 2022-12-12 13:35:34 -05:00
Adam Bird 72d53d61ed rename decouple entrances option (#2154) 2022-12-12 01:59:55 -05:00
Christopher Leggett 071e48f589 Removes problematic sequences from the list. (#2153)
* Removes problematic sequences from the list.

These sequences were part of the ending and credits and thus didn't loop correctly.

* Readds problematic sequences as `SEQ_NOSHUFFLE`
2022-12-12 00:54:17 -05:00
briaguya 43ff9713e9 fix: bool defintion causing fast file select crash (#2142)
Co-authored-by: briaguya <briaguya@alice>
2022-12-11 17:12:02 -05:00
sonoftunk 15c8ccd0cf Check Tracker - Fixes colours not initializing correctly in Check Tracker settings (#2141) 2022-12-11 13:14:50 -05:00
Adam Bird 41db15be48 Rando: Add Lake Hylia water control system (#2108)
* add lake hylia water control system

* fix actor spawn params

* remove non-working switch details

* adjust french translation

* fix object spawn

* use flag funcs

* use renamed eventchk flag for raise lh water
2022-12-11 01:00:18 -05:00
aMannus 6e70cff145 Customize behaviour cleanup (#2132) 2022-12-11 00:45:35 -05:00
Ralphie Morell cb232b87c7 Add QoL sneak option (#2128)
* Added sneak option

* fix french/german choices

* market sneak uses cvar instead of n64dd;
added toggle in gamebar

* whoops

* move enhancement from rando to regular

* address feedback

* accounted for entrance rando

* damn it archez

* added TODO about AI translated messages

* fix variable names
2022-12-10 23:28:22 -05:00
Amaro Martínez dc1b8f017e Add: Title Screen Translation (#1461)
* Add: PRESS START Translation

* Translate Title Screen

* Update z_en_mag.c
2022-12-10 23:07:43 -05:00
sonoftunk b56e8926f0 Randomizer Auto Location tracker (#1942)
* Initial Auto-Location Tracking

* Updates styling for checked items in Check Tracker

* Fixes crashing issues with Check Tracker rendering

* Auto scroll Check Tracker windows to current area

* Checks Tracker only shows checked locations once in game

* Fixes issue where Check Tracker would auto-scroll to wrong location when entering a grotto

* Fixes gerudo fortress checks showing in tracker when settings have them removed

* InfTable Check Location Fixes: Lost Dog Richard, Rolling Gorons, HBA 1000, Thawed Zora

* Fixes most Event Chk Inf Checks on Check Tracker, and Frogs

* Check Tracker - Song from Malon now works

* Check Tracker
- Fixes Claim Check check not tracking
- Fixes spoiler for Claim Check check when getting Biggoron's Sword
- Fixes LACS being spoiled and not tracking

* Check Tracker - Fixes #2 for Skull Mask and Mask of Truth checks

* Check Tracker
- Adds support for merchants
- Fixes #7 for Bomchu Salesman
- Fixes #12 for Medigoron

* Check Tracker - Fixes #8 for Song from Saria

* Check Tracker - Fixes #9 for Adult Shooting Gallery

* Check Tracker - Fixes #10 for Composer Grave

* Check Tracker - Fixes #14 for Song from Ocarina of Time

* Check Tracker - Fixes #16 for Shooting the Sun

* Check Tracker - Fixes #19 for Darunia's Joy

* Save Editor - Adds missing label for Treasure Chest Game

* Check Tracker - Fixes Great Faries checks

* Check Tracker - Fixes Sheik at Temple

* Check Tracker - Fixes Great Fairy auto-scroll to wrong location

* Check Tracker - Updates blue warp checks
- Fixes Bongo Bongo and Twinrova checks

* Check Tracker - Fixes Dampe's Gravedigging Tour

* Check Tracker - Fixes Prescription to King Zora

* Check Tracker - Fixes Bazaar showing under wrong area on tracker between adult/child

* Check Tracker - Fixes scroll for Hyrule Market and Bazaar

* Check Tracker - Fixes giving Adult Trade Items shown on tracker: Broken Sword, Saw, Cojiro, Eyeball Froge, and Eyedrops

* Cleans up item_location

* Check Tracker - Item List
- Fixes item list not updating when changing seeds/options
- Separates item exclusion list from item check list
- Clean up comments

* Check Tracker - Adds Skip functionality to buttons

* Check Tracker - Refactors adult trade items to RandomizerInf

* Check Tracker - Fixes an issue where any time an item is removed the tracker would cause an application crash

* Check Tracker - Item names are now dependent on file language

* Check Tracker - Fixes Gerudo Card check not showing in Fast setting

* Reorders headers to (hopefully) avoid CI build conflicts on linux/consoles

* Explicitly defines vector header in randomizer.h to fix compile errors

* Complete Refactor of Check Tracker ImGui

* Adds missing check tracker files to CMakeLists

* Reverts the Item_location whitespace cleanup from ad10807c

* Check Tracker - Loading Fixes
- Fixes a bug where loading a save file a second time would add all the checks again
- Fixes a bug where the check tracker would not render at all until in a save file

* Check Tracker - Fixes a bug where checks would sometimes fail to load

* Check Tracker - Fixes duplicated checks when using Only on Pause or Only on Combo

* Check Tracker - Works around issue where single characters don't show in EnhancementCombobox, and fixes a label for combo buttons held option

* Check Tracker - Applies all Check Tracker changes to Item Location

* Check Tracker - Updated Check List
- Adds Link's pocket, either in KF or HM depending on starting age
- Supports Scrubs and Merchants
- Uses enums instead of magic numbers
- Updates DC Scrub Short Names for MQ

* Check Tracker - Adds a performance mode option

* Check Tracker - List Fixes (requires new rando generation)
- Fixes Frogs Rupees always visible
- Fixes Kokiri Sword Chest not showing
- Fixes Weird Egg not showing

* Check Tracker - MQ List basic support

* Check Tracker - MQ/Vanilla anti-spoilers

* Check Tracker - Collecting a compass now spoils the area

* Check Tracker - Basic Vanilla Support and fixes
- Vanilla items show in check tracker, even if many won't auto check
- Fixes an issue with Gerudo Fortress Keys
- Refactors IsVisibleInCheckTracker to randomizer_check_tracjer

* Check Tracker - Fixes merge conflict from 08a487f35e

* Check Tracker - Fixes tracker loading as Floating when default value is set to Windowed

* Randomizer Location Exclusion List
- Adds Scrubs, Merchants, Shops. Adult Trade items, MQ Dungeons, and Bean Salesman
- Fixes Kokiri Sword Chest, Weird Egg, and Frog Song Rupees from misbehaving
- Updates Gerudo Fortress logic to be dependent on Open/Fast/Normal Fortress
- Removes Invalid Check
- Adds RO Enum for MQ settings
- Updates magic values to RO enum

* Location Exclusion List - Scrubs that are always randomized now always show on the list

* For now, removes some extra code only needed for a Check Tracker.

* Randomizer Location Exclusion List - Fixes Eyeball Frog from showing up when Adult Trade Items was off

* Location Tracker - Updates Eyedrops to use RandomizerInf instead of Chest

* Check Tracker - Fixes a bug where Link's Pocket item wasn't acting as checked for area item count

* Check Tracker - Fixes a bug where Locations would incorrectly say Vanilla due to the first check in the area being a non-MQ check

* Check Tracker - Fixes a crash when Check Tracker is docked but not visible

* Check Tracker - Fixes areas being spoiled when loading different save files

* Check Tracker - Only reset variables if they are initialized

* Check Tracker - Cleans up old comments, unused variables, methods, and macros, adds language TODOs,

* Check Tracker - Readds rainbow UI elements after Cosmetics Editor refactor

* Check Tracker - Removal of flag lookup that was refactored, no longer needed header, and some trivial whitespace fixes.

* Check Tracker - Refactors Index to Bitmask code to a macro

* Check Tracker - Changes ordering from alphabetical to RandomizerCheck ordering

* Check Tracker - Wraps everything in a namespace to avoid global variable usage

* Check Tracker - Explicitly defines for-loop scope

* Check Tracker - refactors dungeon lookup from static array to function

* Fixes a bug when using EnhancementColor with alpha

* Check Tracker - Refactors all colour to use direct conversions

* Check Tracker - refactors settings loading and check visibility for readability

* Check Tracker - Fixes a bug where the wrong label showed on the Check Tracker BG Color

* UIWidgets - Adds Alpha bar to EnhancementColor when using alpha parameter
2022-12-10 22:39:23 -05:00
sonoftunk 40cb4a6d7d Randomizer Location Exclusion List (#2070)
* Randomizer Location Exclusion List
- Adds Scrubs, Merchants, Shops. Adult Trade items, MQ Dungeons, and Bean Salesman
- Fixes Kokiri Sword Chest, Weird Egg, and Frog Song Rupees from misbehaving
- Updates Gerudo Fortress logic to be dependent on Open/Fast/Normal Fortress
- Removes Invalid Check
- Adds RO Enum for MQ settings
- Updates magic values to RO enum

* Location Exclusion List - Scrubs that are always randomized now always show on the list

* For now, removes some extra code only needed for a Check Tracker.

* Randomizer Location Exclusion List - Fixes Eyeball Frog from showing up when Adult Trade Items was off

* Apply suggestions from code review

Location Exclusion List - Applies suggested dungeon item defaults

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
2022-12-10 18:21:36 -05:00
Josh Bodner 26ec69606a Don't autosave immediately after purchasing from a shop (#2079) 2022-12-10 21:39:26 +01:00
Sarge-117 8c23bcd67c Gameplay stats 1.1 (#2129) 2022-12-10 21:37:33 +01:00
Garrett Cox 8021f29c3e Add toggle for all locations reachable (#2125) 2022-12-10 21:36:17 +01:00
Garrett Cox fd20753849 Add docs for custom sequences (#2124) 2022-12-10 21:35:26 +01:00
Adam Bird 875b9aaff8 fix lab dive check with eye drops (#2119) 2022-12-10 21:28:11 +01:00
Oliver Schall c1e0db336d Disable potion menu elements when potion change is turned off (#2049) 2022-12-10 21:27:38 +01:00
AltoXorg 816122546b [Fix] ZAPD: Fix 1-core cpu machines in OTR generation tool (#2130) 2022-12-10 09:08:37 +01:00
briaguya 408143ec8c fix: prevent oob access of sequenceMap (#2123)
Co-authored-by: briaguya <briaguya@alice>
2022-12-09 02:25:45 -05:00
Garrett Cox 274c12f3cb Cosmetic Editor v3 (#1898)
* Cosmetic Editor v3

* Workaround for cvar_clear not working correctly

* Nest RGBA values under Value key

* Implement arrow cosmetics

* Implement keese cosmetics

* Tweaks to life meter

* Implement file choose color

* Remove old title fire colors

* A few more silly things

* Fix from upstream pulls

* Fix hilts and sword during ganon cutscene

* Add slingshot

* Add metal trap and red ice

* Add iron knuckles cosmetics

* Add navi cosmetics

* Attempt to fix linux error

* adjust some comments and alignment

* Implement trails cosmetics

* Implement charged sword spins

* Comment out options that haven't been implemented

* Fix exploded rupee color in shooting gallery

* Add two silly options

* Add comments and minor changes from feedback

* Adjust comment about boomerang gem

* Gracefully handle chest textures missing
2022-12-08 23:24:39 -05:00
Christopher Leggett 8c8c761726 Custom Sequences (#2066)
* Allows OTRExporter to parse pairs of .seq and .meta files

* Gets added sequences available to SfxEditor and playing in game.

* Some cleanup of the names appearing in the SfxEditor.

* Moves sequence swap lower in the audio command stack.

* Increases temp cache memory available on title/file-select screen.

Certain sequences wouldn't play on the file select and title screen
because they were too large to be cached.

* Introduces workaround for 255 sequence limit.

* Bug fixes and cleanup.

* Fixes bug where fanfares would sometimes disable the sequence player.

* Fixes bug causing certain areas to discard caches when loading enemy music.

* Fixes potential config-related crash by replacing invalid characters.

* Allows custom bgm to play in all BGM categories.

* Properly randomizes the custom tracks.

* Moves custom sequences to a patch OTR.

* If custom music was not loaded, fall back to default values.

* Prevents OOB crash on Synthwave array and adds octave drop feature.

Added octave drop to experimental features, which drops the octave of
a note that is too high for the audio engine to actually play. Without
this, some custom sequences have notes which cap at a specific value
and sound terrible. At least with this they will still harmonize with
the other notes. Experimental tab added to the SfxEditor to house
the checkbox for the octave drop feature.

* Adds more pool memory for a few tracks that couldn't fit.

* Some cleanup on the generated music archive process.

* Fixes missed memory boost from earlier.

* Adds ability to remove enemy proximity music.

* Applies correct cache policy to fanfares to prevent unloading sequences.

* Removes case-sensitiveness of the sequence type.

* Fixes not reverting to sequence after miniboss.

* Fixes transition to/from miniboss (again) and ocarina bug.

To be clear, fixes the more rampant portable ocarina bug present in my earlier builds, not the authentic one.

* Finally properly fixes transitions between sequences

For miniboss fights and SfxEditor previews.

* Removes unneeded boolean expression.

* Adds randomize button to individual SFX Editor entries.

* Fixes lost woods music overwriting goron city music.

* Plays swapped Hyrule Field music when transitioning to daytime.

* Fixes swapping Gerudo Valley music when transitioning from daytime.

* Updates custom sequence OTRPath to match SequenceOTRizer.

* Reverts changes to OTRExporter in favor of external tool

* Fixes formatting issues.

* Attempts to fix formatting issue in git diff.

* Should actually fix formatting issues.

* Should fix mac/linux exclusive build error.

* Fixes segfault on macos.

* sort custom seqs

* Fixes audioseq crash when under 255 seqs

* Removes magic numbers.

* Removes commented out code.

* fixes formatting in SfxEditor.h

Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>

* Cleans up the one hardcoded QueueSeqCmd call.

* Fixes unneeded erroneous memory boost applied earlier.

* Applies additional formatting/cleanliness suggestions from review

* Fixes small logic bug

Co-authored-by: RaelCappra <rael.cappra@gmail.com>
Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
2022-12-08 23:07:45 -05:00
briaguya 4a35b9e798 fix: correctly parse custom nocturne warp text (#2116)
This was causing an issue where hints were not being properly parsed,
because ParseHintLocationsFile was erroring out when trying to read
from a part of the json that didn't exist. Since that method is using
pokemon exception handling, it was failing silently.

This just makes it so the key in the spoiler log matches the key we're trying
to read (and brings it in line with the rest of the warp text names)

Co-authored-by: briaguya <briaguya>
2022-12-08 10:44:30 -05:00
briaguya fa4ffb5913 fix: ensure play isn't null when reading from it (#2115)
Co-authored-by: briaguya <briaguya>
2022-12-08 10:44:08 -05:00
Adam Bird 025e18e7e5 clear the rando generating cvar on launch to prevent softlocking generating a new seed (#2109) 2022-12-08 00:17:05 +01:00
aMannus b593e27384 ER - Shabom timer fix (#2110) 2022-12-08 00:16:08 +01:00
Adam Bird 924e9147aa Update OTRGui to extract MQ roms with the correct name (#2114)
* Extract MQ roms to oot-mq.otr as the game expects

* correctly export mq otrs and handle outside soh folder properly

* support mq export on old export method

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2022-12-07 16:40:12 -05:00
louist103 31947cd51b Copy cleanups (#1932) 2022-12-07 00:28:35 -05:00
Adam Bird 8337e4e24f Rando: Entrance Tracker v1 (#2005)
* initial pass for entrance tracker

* add search meta tags to entrance tracker data; clear entrance tracker on title screen

* rename to use playstate/play

* fix lus imports

* move discovered entrance info to SohStats struct

* Add scene info and highlighting to entrance tracker

* hide undiscovered text when searching

* add comments for entrance tracker

* fix merge conflict error

* account for zora river -> hyrule field water entrance in tracker

* fix assignement error

* remove unneeded defaults from debug file init

* adjust entrance tracker settings and add more search tags

* convert magic numbers to defines; add more comments to entrance tracker; clarify variable names

* add reverse index to entrance tracker data to compare with instead of using strings

* rename variables
2022-12-06 23:44:14 -05:00
briaguya f9fe3f8fb3 Merge Flynn Charlie into develop 2022-12-06 21:51:53 -05:00
briaguya 4f109178ff Merge branch 'develop-flynn' into flynn-to-dev 2022-12-06 21:29:27 -05:00
briaguya 00cbd347b2 bump version (#2104)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 20:21:38 -05:00
Adam Bird 77123196d1 fix lake hylia water level raised flag not being set in rando (#2103) 2022-12-06 20:09:05 -05:00
Amaro Martínez 52b896271c Fix Ganondorf boss battle ending (MQ only) (#2072) 2022-12-06 19:24:09 -05:00
Adam Bird d9f3844b2d [Feature] Entrance Rando v2 (#2071) 2022-12-07 00:37:50 +01:00
PurpleHato 7f4a19461c ADD: Rando German Custom Messages (#2102)
* ADD: Rando German Custom Messages

Thanks to Timmy_GamerNepgear on Discord for the translation, I basically just formatted the text

* TWEAK: Forgot a small breakline
2022-12-06 22:54:54 +01:00
PurpleHato b8465a9ef9 TWEAK: Rando french typos 2022-12-06 15:00:55 -05:00
lilDavid db4af238f2 Kaleidoscope: Fix C buttons when closing the menu (#2100) 2022-12-06 14:17:07 -05:00
aMannus 598cac725e [Feature] Rando: Enemy Randomizer V1 (#1781) 2022-12-06 10:33:50 +01:00
Oliver Schall d9a08d0747 Added bombchu minigame difficulty menu (#2080)
* Added bombchu bowling difficulty menu

* Removed incorrect diff

* Added bombchu bowling difficulty presets

* Shortened cucco removal logic
2022-12-06 01:17:20 -05:00
briaguya 3921f15264 use enum for boss keysanity (#2096)
* use enum for boss keysanity

* merge

Co-authored-by: briaguya <briaguya@alice>
2022-12-06 01:03:55 -05:00
briaguya 767b707a8c use enum for keyrings (#2095)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 01:00:36 -05:00
briaguya dbfdb42406 use enum for hint clarity (#2092)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 01:00:24 -05:00
briaguya 541d1d35a4 use enum for shuffle scrubs (#2089)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 01:00:12 -05:00
briaguya ca4875befc use enums for tokensanity (#2088)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 00:59:59 -05:00
briaguya a93728599d use enum values for maps and compasses (#2086)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 00:59:48 -05:00
briaguya d03e876289 use enum for logic (#2098)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 00:37:07 -05:00
briaguya 4ee0ddaa15 use enum for language (#2097)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 00:36:53 -05:00
briaguya 1e0e80f580 use enum for hint distribution (#2093)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 00:36:28 -05:00
briaguya 8b96c023fb use enum for gerudo keys (#2094)
* use enum for gerudo keys

* don't use cvar that doesn't exist

Co-authored-by: briaguya <briaguya@alice>
2022-12-06 00:36:13 -05:00
briaguya 52bf2d600b use enum for gossip stone hints (#2091)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 00:35:59 -05:00
briaguya 306183aa1b use enum for shuffle merchants (#2090)
* use enum for shuffle merchants

* remove comment that isn't needed anymore

Co-authored-by: briaguya <briaguya@alice>
2022-12-06 00:35:44 -05:00
briaguya 22c4b1afa3 use enum for shuffle songs (#2087)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 00:35:08 -05:00
briaguya 321e563c82 use enum for starting age (#2085)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 00:34:30 -05:00
briaguya acd07f2a07 add/use enum values for rando mq dungeon options (#2056)
Co-authored-by: briaguya <briaguya@alice>
2022-12-06 00:32:53 -05:00
aMannus d3bfc102fe [Fix} Small Crowd Control fixes (#2061) 2022-12-06 06:28:50 +01:00
Amaro Martínez 1a9898b918 Fix Ganondorf title card (#2082) 2022-12-05 14:38:28 -05:00
frizzle101101 da1aa270ad making edit and continue compiling in vs possible (#1988)
* making edit and continue compiling in vs possible

* fix tab spacing
2022-12-04 23:25:24 -05:00
Josh Bodner 656dcd2021 Don't autosave after obtaining bombchus if bombchu drops are enabled (#2077) 2022-12-04 20:54:23 -05:00
Josh Bodner 39b80137f6 Don't autosave in the Chamber of Sages (#2076) 2022-12-04 20:13:29 -05:00
aMannus 5d2b794c00 Fix hookshot retraction on dpad (#2065) 2022-12-04 19:27:15 -05:00
aMannus 5b5310ea92 Disable bunny hood NPC interactions with MM bunny hood on (#2058)
* Disable bunny hood NPC interactions

* Enum
2022-12-04 19:03:04 -05:00
aMannus d4aeb79341 Fix jabu skulltula check (#2062) 2022-11-30 10:13:00 -05:00
briaguya 8d398f7130 refactor: separate RandoOption enum, use max (#2055)
* refactor: separate RandoOption enum, use max

* missed a couple magic array sizes

* couple more

Co-authored-by: briaguya <briaguya@alice>
2022-11-30 01:40:55 -05:00
briaguya d6c528d9d0 use shopsanity enum (#2054)
* enums for rainbow bridge

* reorder enum

* use enums for shopsanity

* remove space

Co-authored-by: briaguya <briaguya@alice>
2022-11-30 00:30:51 -05:00
briaguya e193f0dc0e enums for rainbow bridge (#2052)
* enums for rainbow bridge

* reorder enum

Co-authored-by: briaguya <briaguya@alice>
2022-11-29 23:41:46 -05:00
briaguya 00a862a252 use trial enum instead of magic numbers (#2039)
* use trial enum instead of magic numbers

* simplify trial count/random trial logic

* set default to set number

Co-authored-by: briaguya <briaguya@alice>
2022-11-29 22:43:05 -05:00
Christopher Leggett 806b9dc84b Re-implements Ninja and CCache for Windows Builds (#2051)
* Keeps default compiler flags.

* Updates github actions to use ninja and ccache for windows builds.

* Fixes ghactions to use MSVC.

* Removes commented out CMake code.
2022-11-29 22:33:43 -05:00
briaguya 06df45efc7 use forest enum values instead of magic numbers (#2038) 2022-11-30 02:32:22 +01:00
briaguya 17c6a3653c use enum for keysanity (#2044) 2022-11-30 02:05:11 +01:00
briaguya b976ef58fe use enum for ganon's boss key (#2046) 2022-11-30 02:01:41 +01:00
briaguya a15f89a3e4 Use enum values for ice trap setting (#2041)
Co-authored-by: briaguya <briaguya@alice>
Co-authored-by: David Chavez <david@dcvz.io>
2022-11-30 00:40:35 +01:00
briaguya aba034ef53 Use enum for links pocket, dungeon reward shuffle (#2045)
Co-authored-by: briaguya <briaguya@alice>
2022-11-30 00:37:53 +01:00
briaguya ec8ec8d322 Use enum for kak gate (#2043)
Co-authored-by: briaguya <briaguya@alice>
Co-authored-by: David Chavez <david@dcvz.io>
2022-11-30 00:33:38 +01:00
briaguya bfc0ca5388 Use enum values for item pool (#2042)
* use enum values for item pool

* Update soh/soh/Enhancements/presets.h

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>

Co-authored-by: briaguya <briaguya@alice>
Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2022-11-30 00:31:59 +01:00
briaguya 7e9c5d428c Use gerudo fortress enum (#2040)
Co-authored-by: briaguya <briaguya@alice>
2022-11-30 00:30:52 +01:00
Garrett Cox 3cb9f93ff4 [docs] Pull upstream updates: SetupDL (#2048) 2022-11-30 00:29:36 +01:00
Garrett Cox d7c3522142 [docs] Upstream updates 1 (#1955)
* First round of upstream updates and commenting patternss

* Renames from z64player

* Renames from z64save

* Undo changes to legacy save struct

* Add missing reference from entrance rando

* Fixes from stat tracker

* More tweaks
2022-11-30 00:28:57 +01:00
briaguya aa1adc1a69 fix missing rom error (#2036)
* add an if

* don't rebuild

Co-authored-by: briaguya <briaguya@alice>
2022-11-28 19:40:22 -05:00
Oliver Schall 8064ad9dfe Add git submodule update to BUILDING.md (#2027)
* Added git submodule to building instructions

* Fixed git submodule build instruction order

* Removed --recursive flag from git submodule building instructions

* Removed windows git submodule instruction
2022-11-28 19:04:24 -05:00
Garrett Cox e3af07aa27 Fix PR artifacts workflow (#2028) 2022-11-28 18:48:09 -05:00
PurpleHato 453eb7af88 Missing space (#2024) 2022-11-28 18:21:25 -05:00
briaguya 5037b99740 rename 3drando dot enums to match soh enum naming (#2034) 2022-11-28 23:49:21 +01:00
Ada 9027d85671 TWEAK: Game controls menu simplification (#2007) 2022-11-28 23:45:07 +01:00
briaguya 0424c5aaf3 fix: rando door of time enum usage (#2032) 2022-11-28 22:41:33 +01:00
briaguya 97e612b921 flynn -> dev
flynn -> dev
2022-11-28 15:59:00 -05:00
Garrett Cox 091b6a2987 [Fix] Issue with first two rainbow bridge settings getting swapped (#2023)
Fixes #2022
2022-11-26 19:39:45 +01:00
PurpleHato 80bb4577b0 Google Translation Strikes back (#2014) 2022-11-24 13:17:47 -05:00
sonoftunk bd54ac5d15 Removes duplicated rando option enum for merchant (#2008) 2022-11-23 21:05:48 -05:00
Sarge-117 67e325a0b9 Fix C-button counts and ice trap count (#2009) 2022-11-23 20:53:10 -05:00
frizzle101101 d65718db85 fix int sliders to fill the window like float sliders (#1984)
* fix int sliders to fill the window like float sliders

* add a spacer to make it consistent with float slider

* add a spacer to make it consistent with float slider

* adding pop width further constancy with float slider
2022-11-23 16:14:11 -05:00
Oliver Schall 4526550e95 [Enhancement] Added checkbox to disable finishing difficulty behavior changes (#1990) 2022-11-23 13:43:06 +01:00
sonoftunk c3f51fef2a [Format] Lines up checks in item_location (#2004) 2022-11-23 13:42:14 +01:00
m4xw 67453dd4f8 Use shallow clone for vcpkg (#2006) 2022-11-23 13:28:51 +01:00
Sarge-117 9c162fc0ec Gameplay Stat Tracker V1 (#1986)
* First test of gathering some gameplay stats

* timer changes and other stuff

* Move code to new files + rename

* Name change - gamePlayStats

* Finish rename, remove n64ddFlag checks

* Improve item get times

* Better time tracking, more stats,

* Put button under Enhancements

* Fix merge conflict

* Add pauseCount, fix bug with rando items

* Adjust inits/declarations

* step counter

* Name change: "itemGetTime" to "timestamp"

* Tidying + CI test

* Set up array for stat counts

* Macro

#define GAMEPLAYSTAT_TOTAL_TIME (gSaveContext.gameplayStats.playTimer / 2 + gSaveContext.gameplayStats.pauseTimer / 3)

* Add boss defeat timestamps

* Add sword swings, pots broken, bushes cut

* fix int type

* Add counts for enemies defeated

Broken down by enemy, with a total

* Add ammo used

* Hide breakdowns until count > 0

* Forgot Big Octo

* Count chests opened

* Update after LUS submodule

* Enemy count spacing

* Comments

* Count 3 mini Floormasters as 1 Floormaster

+ some cleanup

* Comments

* Colour coding for timestamps on quest items

i.e. medallions/stones/songs

* Move stat into the sohStats struct

+ rearrange the counts enum for easier addition of future counts

* Some documentation + count button presses

* Stop counting button presses when Ganon defeated

* Couple bugfixes

Add count for Gerudo Thief, fix step counter counting in some situations where it shouldn't

* Fix comment
2022-11-22 20:04:40 -05:00
Ralphie Morell 9cfe7bff47 Rando: Settings Enum (#1761)
* added rando option enum; added options to load from spoiler file

* whoops

* Moved to `randomizerTypes` header; fixed ammo drop enum

* Actually populated options with new enums

* Added add'l enums for ganon boss key
2022-11-22 17:11:05 -05:00
Amaro Martínez 0fca1019a2 Do not use Yes/No hardcoded options for Better Owl (#2002) 2022-11-22 14:23:48 -05:00
Garrett Cox 8461ea4abd Add s6 and hellmode presets for rando (#1904)
* Refactor how presets are created and used, and add presets for rando

* Add new enhancements to clear

* Tweaks and feedback
2022-11-22 12:30:18 -05:00
Alto1772 156f713e19 [Enhancement] Add option to hide build details on boot screen (#1948) 2022-11-22 09:42:01 +01:00
DeusVexus 1ae4e2c1f7 [Enhancement] Include minigame ammo in infinite ammo cheat (#1973) 2022-11-22 09:18:23 +01:00
frizzle101101 c569a46933 [Enhancement] Add fix camera drift option to fixes menu (#1983) 2022-11-22 08:57:26 +01:00
3058 changed files with 111736 additions and 20597 deletions
+27
View File
@@ -0,0 +1,27 @@
FROM mcr.microsoft.com/devcontainers/cpp:ubuntu-22.04
RUN apt-get update && apt-get install -y libsdl2-dev libsdl2-net-dev libpng-dev libglew-dev ninja-build
# Install latest SDL2
RUN wget https://www.libsdl.org/release/SDL2-2.26.1.tar.gz && \
tar -xzf SDL2-2.26.1.tar.gz && \
cd SDL2-2.26.1 && \
./configure && \
make && \
make install && \
cd .. && \
rm -rf SDL2-2.26.1 && \
rm SDL2-2.26.1.tar.gz && \
cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/
# Install latest SDL2_net
RUN wget https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.2.0.tar.gz && \
tar -xzf SDL2_net-2.2.0.tar.gz && \
cd SDL2_net-2.2.0 && \
./configure && \
make && \
make install && \
cd .. && \
rm -rf SDL2_net-2.2.0 && \
rm SDL2_net-2.2.0.tar.gz && \
cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/
+29
View File
@@ -0,0 +1,29 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/cpp
{
"name": "SoH",
"build": {
"dockerfile": "Dockerfile"
},
// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
// Configure tool-specific properties.
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
"settings": {},
"extensions": []
}
}
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "gcc -v",
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
+1
View File
@@ -0,0 +1 @@
* text=auto eol=lf
+154 -91
View File
@@ -6,26 +6,59 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
extract-assets:
runs-on: [ self-hosted, asset-builder ]
generate-soh-otr:
runs-on: ${{ (vars.LINUX_RUNNER && fromJSON(vars.LINUX_RUNNER)) || 'ubuntu-latest' }}
steps:
- uses: actions/checkout@v3
with:
submodules: true
- name: Extract assets
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
key: ${{ runner.os }}-soh-otr-ccache
- name: Install dependencies
if: ${{ !vars.LINUX_RUNNER }}
run: |
cp ../../../ZELOOTD.z64 OTRExporter/baserom_non_mq.z64
sudo apt-get update
sudo apt-get install -y $(cat .github/workflows/apt-deps.txt)
- name: Install latest SDL
if: ${{ !vars.LINUX_RUNNER }}
run: |
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
wget https://www.libsdl.org/release/SDL2-2.26.1.tar.gz
tar -xzf SDL2-2.26.1.tar.gz
cd SDL2-2.26.1
./configure
make -j 10
sudo make install
sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/
- name: Install latest SDL_net
if: ${{ !vars.LINUX_RUNNER }}
run: |
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
wget https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.2.0.tar.gz
tar -xzf SDL2_net-2.2.0.tar.gz
cd SDL2_net-2.2.0
./configure
make -j 10
sudo make install
sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/
- name: Generate soh.otr
run: |
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release
cmake --build build-cmake --target ExtractAssets --config Release
zip -r assets.zip soh/assets
cmake --build build-cmake --config Release --target ZAPD
mkdir Extract
cp -r OTRExporter/assets/ ./Extract/assets
./build-cmake/ZAPD/ZAPD.out botr -se OTR --norom
- uses: actions/upload-artifact@v3
with:
name: assets
path: assets.zip
name: soh.otr
path: soh.otr
retention-days: 1
build-macos:
needs: extract-assets
runs-on: macos-12
needs: generate-soh-otr
runs-on: ${{ (vars.MAC_RUNNER && fromJSON(vars.MAC_RUNNER)) || 'macos-12' }}
steps:
- uses: actions/checkout@v3
with:
@@ -35,12 +68,14 @@ jobs:
with:
key: ${{ runner.os }}-ccache
- name: Install gtar wrapper
if: ${{ !vars.MAC_RUNNER }}
run: |
sudo mv /usr/local/bin/gtar /usr/local/bin/gtar.orig
sudo cp .github/workflows//gtar /usr/local/bin/gtar
sudo chmod +x /usr/local/bin/gtar
- name: Cache MacPorts
id: cache-macports
if: ${{ !vars.MAC_RUNNER }}
uses: actions/cache@v2
with:
path: /opt/local/
@@ -48,6 +83,7 @@ jobs:
restore-keys: |
${{ runner.os }}-macports-
- name: Install MacPorts (if necessary)
if: ${{ !vars.MAC_RUNNER }}
run: |
if [ -d /opt/local/ ]; then
echo "MacPorts already installed"
@@ -57,21 +93,21 @@ jobs:
fi
echo "/opt/local/bin:/opt/local/sbin" >> $GITHUB_PATH
- name: Install dependencies
if: ${{ !vars.MAC_RUNNER }}
run: |
brew uninstall --ignore-dependencies libpng
sudo port install $(cat .github/workflows/macports-deps.txt)
brew install ninja
- name: Restore assets
- name: Download soh.otr
uses: actions/download-artifact@v3
with:
name: assets
name: soh.otr
- name: Build SoH
run: |
unzip -o assets.zip
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
cmake --build build-cmake --config Release --parallel 10
mv soh.otr build-cmake/soh
(cd build-cmake && cpack)
mv _packages/*.dmg SoH.dmg
@@ -84,31 +120,44 @@ jobs:
SoH.dmg
readme.txt
build-linux:
needs: extract-assets
runs-on: ubuntu-20.04
needs: generate-soh-otr
strategy:
fail-fast: true
matrix:
include:
- os: ubuntu-20.04
gcc: 10
archive-suffix: compatibility
- os: ubuntu-22.04
gcc: 12
archive-suffix: performance
runs-on: ${{ (matrix.os == 'ubuntu-20.04' && ((vars.LINUX_COMPATIBILITY_RUNNER && fromJSON(vars.LINUX_COMPATIBILITY_RUNNER)) || matrix.os)) || (matrix.os == 'ubuntu-22.04' && ((vars.LINUX_PERFORMANCE_RUNNER && fromJSON(vars.LINUX_PERFORMANCE_RUNNER)) || matrix.os)) }}
steps:
- uses: actions/checkout@v3
with:
submodules: true
- name: Install dependencies
if: ${{ (matrix.os == 'ubuntu-20.04' && !vars.LINUX_COMPATIBILITY_RUNNER) || (matrix.os == 'ubuntu-22.04' && !vars.LINUX_PERFORMANCE_RUNNER) }}
run: |
sudo apt-get update
sudo apt-get install -y $(cat .github/workflows/apt-deps.txt)
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
key: ${{ runner.os }}-ccache
key: ${{ matrix.os }}-ccache
- name: Install latest SDL
if: ${{ (matrix.os == 'ubuntu-20.04' && !vars.LINUX_COMPATIBILITY_RUNNER) || (matrix.os == 'ubuntu-22.04' && !vars.LINUX_PERFORMANCE_RUNNER) }}
run: |
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
wget https://www.libsdl.org/release/SDL2-2.24.1.tar.gz
tar -xzf SDL2-2.24.1.tar.gz
cd SDL2-2.24.1
wget https://www.libsdl.org/release/SDL2-2.26.1.tar.gz
tar -xzf SDL2-2.26.1.tar.gz
cd SDL2-2.26.1
./configure
make -j 10
sudo make install
sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/
- name: Install latest SDL_net
if: ${{ (matrix.os == 'ubuntu-20.04' && !vars.LINUX_COMPATIBILITY_RUNNER) || (matrix.os == 'ubuntu-22.04' && !vars.LINUX_PERFORMANCE_RUNNER) }}
run: |
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
wget https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.2.0.tar.gz
@@ -118,35 +167,32 @@ jobs:
make -j 10
sudo make install
sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/
- name: Restore assets
- name: Download soh.otr
uses: actions/download-artifact@v3
with:
name: assets
name: soh.otr
- name: Build SoH
run: |
unzip -o assets.zip
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release
cmake --build build-cmake --target OTRGui -j3
cmake --build build-cmake --config Release -j3
(cd build-cmake && cpack -G External)
mv README.md readme.txt
mv build-cmake/*.appimage soh.appimage
env:
CC: gcc-10
CXX: g++-10
CC: gcc-${{ matrix.gcc }}
CXX: g++-${{ matrix.gcc }}
- name: Upload build
uses: actions/upload-artifact@v3
with:
name: soh-linux
name: soh-linux-${{ matrix.archive-suffix }}
path: |
soh.appimage
readme.txt
build-switch:
needs: extract-assets
runs-on: ubuntu-latest
needs: generate-soh-otr
runs-on: ${{ (vars.LINUX_RUNNER && fromJSON(vars.LINUX_RUNNER)) || 'ubuntu-latest' }}
container:
image: devkitpro/devkita64:latest
steps:
@@ -154,6 +200,9 @@ jobs:
run: |
sudo apt-get update
sudo apt-get install -y ninja-build
- name: Fix dubious ownership error
if: ${{ vars.LINUX_RUNNER }}
run: git config --global --add safe.directory '*'
- uses: actions/checkout@v3
with:
submodules: true
@@ -161,93 +210,107 @@ jobs:
uses: hendrikmuhs/ccache-action@v1.2
with:
key: ${{ runner.os }}-switch-ccache
- name: Restore assets
uses: actions/download-artifact@v3
with:
name: assets
- name: Build SoH
run: |
unzip -o assets.zip
cmake -H. -Bbuild-switch -GNinja -DCMAKE_TOOLCHAIN_FILE=/opt/devkitpro/cmake/Switch.cmake -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache
cmake --build build-switch --target soh_nro -j3
mv build-switch/soh/*.nro soh.nro
mv README.md readme.txt
- name: Download soh.otr
uses: actions/download-artifact@v3
with:
name: soh.otr
- name: Upload build
uses: actions/upload-artifact@v3
with:
name: soh-switch
path: |
soh.nro
soh.otr
readme.txt
build-wiiu:
needs: extract-assets
runs-on: ubuntu-latest
container:
image: devkitpro/devkitppc:latest
# build-wiiu:
# needs: generate-soh-otr
# runs-on: ${{ (vars.LINUX_RUNNER && fromJSON(vars.LINUX_RUNNER)) || 'ubuntu-latest' }}
# container:
# image: devkitpro/devkitppc:latest
# steps:
# - name: Install dependencies
# if: ${{ !vars.LINUX_RUNNER }}
# run: |
# sudo apt-get update
# sudo apt-get install -y ninja-build
# - uses: actions/checkout@v3
# with:
# submodules: true
# - name: ccache
# uses: hendrikmuhs/ccache-action@v1.2
# with:
# key: ${{ runner.os }}-wiiu-ccache
# - name: Build SoH
# run: |
# cmake -H. -Bbuild-wiiu -GNinja -DCMAKE_TOOLCHAIN_FILE=/opt/devkitpro/cmake/WiiU.cmake -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache
# cmake --build build-wiiu --target soh_wuhb --config Release -j3
# mv build-wiiu/soh/*.rpx soh.rpx
# mv build-wiiu/soh/*.wuhb soh.wuhb
# mv README.md readme.txt
# env:
# DEVKITPRO: /opt/devkitpro
# DEVKITPPC: /opt/devkitpro/devkitPPC
# - name: Download soh.otr
# uses: actions/download-artifact@v3
# with:
# name: soh.otr
# - name: Upload build
# uses: actions/upload-artifact@v3
# with:
# name: soh-wiiu
# path: |
# soh.rpx
# soh.wuhb
# soh.otr
# readme.txt
build-windows:
needs: generate-soh-otr
runs-on: ${{ (vars.WINDOWS_RUNNER && fromJSON(vars.WINDOWS_RUNNER)) || 'windows-latest' }}
steps:
- name: Install dependencies
if: ${{ !vars.WINDOWS_RUNNER }}
run: |
sudo apt-get update
sudo apt-get install -y ninja-build
choco install ninja
Remove-Item -Path "C:\ProgramData\Chocolatey\bin\ccache.exe" -Force
- uses: actions/checkout@v3
with:
submodules: true
- name: ccache
uses: hendrikmuhs/ccache-action@v1.2
uses: dcvz/ccache-action@27b9f33213c0079872f064f6b6ba0233dfa16ba2
with:
key: ${{ runner.os }}-wiiu-ccache
- name: Restore assets
uses: actions/download-artifact@v3
with:
name: assets
key: ${{ runner.os }}-ccache
- uses: ilammy/msvc-dev-cmd@v1
- name: Build SoH
run: |
unzip -o assets.zip
cmake -H. -Bbuild-wiiu -GNinja -DCMAKE_TOOLCHAIN_FILE=/opt/devkitpro/cmake/WiiU.cmake -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache
cmake --build build-wiiu --target soh_wuhb --config Release -j3
mv build-wiiu/soh/*.rpx soh.rpx
mv build-wiiu/soh/*.wuhb soh.wuhb
mv README.md readme.txt
env:
DEVKITPRO: /opt/devkitpro
DEVKITPPC: /opt/devkitpro/devkitPPC
- name: Upload build
uses: actions/upload-artifact@v3
with:
name: soh-wiiu
path: |
soh.rpx
soh.wuhb
readme.txt
build-windows:
needs: extract-assets
runs-on: [self-hosted, Windows, x64]
steps:
- uses: actions/checkout@v3
with:
submodules: true
- name: Restore assets
uses: actions/download-artifact@v3
with:
name: assets
- name: Setup 7-Zip
run: |
"C:\Program Files\7-Zip" >> $env:GITHUB_PATH
- name: Build SoH
run: |
7z x assets.zip -aoa
cmake -S . -B build-windows -G "Visual Studio 17 2022" -T v142 -A x64 -DCMAKE_BUILD_TYPE:STRING=Release
cmake --build build-windows --target OTRGui --config Release --parallel 10
set $env:PATH="$env:USERPROFILE/.cargo/bin;$env:PATH"
cmake -S . -B build-windows -G Ninja -DCMAKE_MAKE_PROGRAM=ninja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
cmake --build build-windows --config Release --parallel 10
cd build-windows
cpack -G ZIP
mkdir soh-windows
mv ./x64/Release/soh.exe ./soh-windows/soh.exe
mkdir soh-windows/debug
mkdir soh-windows/mods
New-Item soh-windows/mods/custom_otr_files_go_here.txt -type file
mv ./x64/Release/soh.pdb ./soh-windows/debug/soh.pdb
mv ./README.md ./soh-windows/readme.txt
mv ./build-windows/gamecontrollerdb.txt ./soh-windows/gamecontrollerdb.txt
mv ./build-windows/OTRGui/assets ./soh-windows
mv ./build-windows/ZAPD/ZAPD.exe ./soh-windows/assets/extractor/ZAPD.exe
- name: Download soh.otr
uses: actions/download-artifact@v3
with:
name: soh.otr
path: soh-windows
- name: Upload build
uses: actions/upload-artifact@v3
with:
name: soh-windows
path: _packages/*.zip
path: soh-windows
+28 -4
View File
@@ -11,7 +11,31 @@ jobs:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.event == 'pull_request' }}
steps:
- id: 'get-info'
- id: 'pr-number'
uses: actions/github-script@v6
with:
result-encoding: string
script: |
const {owner, repo} = context.repo;
const pullHeadSHA = '${{github.event.workflow_run.head_sha}}';
const pullUserId = ${{github.event.sender.id}};
const prNumber = await (async () => {
const pulls = await github.rest.pulls.list({owner, repo});
for await (const {data} of github.paginate.iterator(pulls)) {
for (const pull of data) {
if (pull.head.sha === pullHeadSHA && pull.user.id === pullUserId) {
return pull.number;
}
}
}
})();
if (!prNumber) {
return core.error(`No matching pull request found`);
}
return prNumber;
- id: 'artifacts-text'
uses: actions/github-script@v6
with:
result-encoding: string
@@ -25,13 +49,13 @@ jobs:
return allArtifacts.data.artifacts.reduce((acc, item) => {
if (item.name === "assets") return acc;
acc += `
- [${item.name}](${context.payload.repository.html_url}/suites/${context.payload.workflow_run.check_suite_id}/artifacts/${item.id})`;
- [${item.name}.zip](https://nightly.link/${context.repo.owner}/${context.repo.repo}/actions/artifacts/${item.id}.zip)`;
return acc;
}, '### Build Artifacts');
- id: 'add-to-pr'
uses: garrettjoecox/pr-section@3.1.0
with:
repo-token: '${{ secrets.GITHUB_TOKEN }}'
pr-number: ${{ github.event.workflow_run.pull_requests[0].number }}
pr-number: ${{ steps.pr-number.outputs.result }}
section-name: 'artifacts'
section-value: '${{ steps.get-info.outputs.result }}'
section-value: '${{ steps.artifacts-text.outputs.result }}'
+4 -3
View File
@@ -409,8 +409,7 @@ DebugObj/*
ReleaseObj/*
.tags
tags
oot.otr
oot-mq.otr
*.otr
*.sav
shipofharkinian.ini
shipofharkinian.json
@@ -447,4 +446,6 @@ CTestTestfile.cmake
_deps
*/extract_assets_cmake*
/build*
build.c
soh/build.c
soh/properties.h
+1 -1
View File
@@ -116,7 +116,7 @@ endmacro()
macro(_install_or_update_vcpkg)
if(NOT EXISTS ${VCPKG_ROOT})
message(STATUS "Cloning vcpkg in ${VCPKG_ROOT}")
execute_process(COMMAND git clone https://github.com/Microsoft/vcpkg.git ${VCPKG_ROOT})
execute_process(COMMAND git clone https://github.com/Microsoft/vcpkg.git ${VCPKG_ROOT} --depth 1)
# If a reproducible build is desired (and potentially old libraries are # ok), uncomment the
# following line and pin the vcpkg repository to a specific githash.
+21 -44
View File
@@ -2,13 +2,11 @@ cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR)
set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE)
set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use")
#set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard to use") - issue with soh compile with MSVC
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE)
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
project(Ship LANGUAGES C CXX
VERSION 5.0.1)
set(PROJECT_BUILD_NAME "FLYNN BRAVO" CACHE STRING "")
project(Ship VERSION 7.0.0 LANGUAGES C CXX)
set(PROJECT_BUILD_NAME "Spock Alfa" CACHE STRING "")
set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "")
set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh)
@@ -27,7 +25,7 @@ set(VCPKG_TRIPLET x64-windows-static)
set(VCPKG_TARGET_TRIPLET x64-windows-static)
vcpkg_bootstrap()
vcpkg_install_packages(zlib bzip2 libpng SDL2 SDL2-net GLEW glfw3)
vcpkg_install_packages(zlib bzip2 libpng sdl2 sdl2-net glew glfw3)
endif()
################################################################################
@@ -49,8 +47,8 @@ endif()
# Global configuration types
################################################################################
if (CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch")
set(CMAKE_C_FLAGS_DEBUG "-O3 -ffast-math")
set(CMAKE_CXX_FLAGS_DEBUG "-O3 -ffast-math")
set(CMAKE_C_FLAGS_DEBUG "-g -ffast-math -DDEBUG")
set(CMAKE_CXX_FLAGS_DEBUG "-g -ffast-math -DDEBUG")
set(CMAKE_C_FLAGS_RELEASE "-O3 -ffast-math -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ffast-math -DNDEBUG")
else()
@@ -63,38 +61,6 @@ if(NOT CMAKE_BUILD_TYPE )
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build." FORCE)
endif()
################################################################################
# Global compiler options
################################################################################
if(MSVC)
# remove default flags provided with CMake for MSVC
set(CMAKE_C_FLAGS "")
set(CMAKE_C_FLAGS_DEBUG "")
set(CMAKE_C_FLAGS_RELEASE "")
set(CMAKE_CXX_FLAGS "")
set(CMAKE_CXX_FLAGS_DEBUG "")
set(CMAKE_CXX_FLAGS_RELEASE "")
endif()
################################################################################
# Global linker options
################################################################################
if(MSVC)
# remove default flags provided with CMake for MSVC
set(CMAKE_EXE_LINKER_FLAGS "")
set(CMAKE_MODULE_LINKER_FLAGS "")
set(CMAKE_SHARED_LINKER_FLAGS "")
set(CMAKE_STATIC_LINKER_FLAGS "")
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS}")
set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "${CMAKE_STATIC_LINKER_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS}")
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS}")
endif()
################################################################################
# Common utils
################################################################################
@@ -124,7 +90,7 @@ add_subdirectory(libultraship ${CMAKE_BINARY_DIR}/libultraship)
add_subdirectory(ZAPDTR/ZAPD ${CMAKE_BINARY_DIR}/ZAPD)
add_subdirectory(OTRExporter)
add_subdirectory(soh)
if(NOT CMAKE_SYSTEM_NAME MATCHES "Darwin|NintendoSwitch|CafeOS")
if(CMAKE_SYSTEM_NAME MATCHES "Windows|Linux")
add_subdirectory(OTRGui)
endif()
@@ -134,20 +100,31 @@ set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
install(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.sh" DESTINATION . COMPONENT appimage)
install(FILES "${CMAKE_SOURCE_DIR}/soh.otr" DESTINATION . COMPONENT appimage)
endif()
find_package(Python3 COMPONENTS Interpreter)
# Target to generate OTRs
add_custom_target(
ExtractAssets
# CMake versions prior to 3.17 do not have the rm command, use remove instead for older versions
COMMAND ${CMAKE_COMMAND} -E $<IF:$<VERSION_LESS:${CMAKE_VERSION},3.17>,remove,rm> -f oot.otr oot-mq.otr
COMMAND ${CMAKE_COMMAND} -E $<IF:$<VERSION_LESS:${CMAKE_VERSION},3.17>,remove,rm> -f oot.otr oot-mq.otr soh.otr
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>" --non-interactive
COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake
COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$<TARGET_FILE_DIR:ZAPD>" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter
COMMENT "Running asset extraction..."
DEPENDS ZAPD
BYPRODUCTS oot.otr ${CMAKE_SOURCE_DIR}/oot.otr oot-mq.otr ${CMAKE_SOURCE_DIR}/oot-mq.otr
BYPRODUCTS oot.otr ${CMAKE_SOURCE_DIR}/oot.otr oot-mq.otr ${CMAKE_SOURCE_DIR}/oot-mq.otr ${CMAKE_SOURCE_DIR}/soh.otr
)
# Target to generate headers
add_custom_target(
ExtractAssetHeaders
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>" --non-interactive --gen-headers
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter
COMMENT "Generating asset headers..."
DEPENDS ZAPD
)
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
@@ -1,11 +1,11 @@
#include "AnimationExporter.h"
#include <Animation.h>
#include <resource/type/Animation.h>
void OTRExporter_Animation::Save(ZResource* res, const fs::path& outPath, BinaryWriter* writer)
{
ZAnimation* anim = (ZAnimation*)res;
WriteHeader(res, outPath, writer, Ship::ResourceType::Animation);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Animation);
ZNormalAnimation* normalAnim = dynamic_cast<ZNormalAnimation*>(anim);
ZCurveAnimation* curveAnim = dynamic_cast<ZCurveAnimation*>(anim);
+4 -5
View File
@@ -1,6 +1,5 @@
#include "AudioExporter.h"
#include "Main.h"
#include <Animation.h>
#include <Utils/MemoryStream.h>
#include <Globals.h>
#include <Utils/File.h>
@@ -30,7 +29,7 @@ void OTRExporter_Audio::WriteSampleEntryReference(ZAudio* audio, SampleEntry* en
void OTRExporter_Audio::WriteSampleEntry(SampleEntry* entry, BinaryWriter* writer)
{
WriteHeader(nullptr, "", writer, Ship::ResourceType::AudioSample, Ship::Version::Rachael);
WriteHeader(nullptr, "", writer, Ship::ResourceType::SOH_AudioSample, Ship::Version::Rachael);
writer->Write(entry->codec);
writer->Write(entry->medium);
@@ -82,7 +81,7 @@ void OTRExporter_Audio::Save(ZResource* res, const fs::path& outPath, BinaryWrit
{
ZAudio* audio = (ZAudio*)res;
WriteHeader(res, outPath, writer, Ship::ResourceType::Audio, Ship::Version::Rachael);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Audio, Ship::Version::Rachael);
// Write Samples as individual files
for (auto pair : audio->samples)
@@ -115,7 +114,7 @@ void OTRExporter_Audio::Save(ZResource* res, const fs::path& outPath, BinaryWrit
MemoryStream* fntStream = new MemoryStream();
BinaryWriter fntWriter = BinaryWriter(fntStream);
WriteHeader(nullptr, "", &fntWriter, Ship::ResourceType::AudioSoundFont, Ship::Version::Rachael);
WriteHeader(nullptr, "", &fntWriter, Ship::ResourceType::SOH_AudioSoundFont, Ship::Version::Rachael);
fntWriter.Write((uint32_t)i);
fntWriter.Write(audio->soundFontTable[i].medium);
@@ -174,7 +173,7 @@ void OTRExporter_Audio::Save(ZResource* res, const fs::path& outPath, BinaryWrit
MemoryStream* seqStream = new MemoryStream();
BinaryWriter seqWriter = BinaryWriter(seqStream);
WriteHeader(nullptr, "", &seqWriter, Ship::ResourceType::AudioSequence, Ship::Version::Rachael);
WriteHeader(nullptr, "", &seqWriter, Ship::ResourceType::SOH_AudioSequence, Ship::Version::Rachael);
seqWriter.Write((uint32_t)seq.size());
seqWriter.Write(seq.data(), seq.size());
@@ -4,6 +4,10 @@
void OTRExporter_Background::Save(ZResource* res, const fs::path& outPath, BinaryWriter* writer)
{
ZBackground* bg = (ZBackground*)res;
WriteHeader(bg, outPath, writer, Ship::ResourceType::SOH_Background);
writer->Write((uint32_t)bg->GetRawDataSize());
auto data = bg->parent->GetRawData();
writer->Write((char*)data.data() + bg->GetRawDataIndex(), bg->GetRawDataSize());
+10 -7
View File
@@ -158,16 +158,19 @@ endif()
target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../../ZAPDTR/ZAPD/
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/extern/ZAPDUtils
${CMAKE_CURRENT_SOURCE_DIR}/../../ZAPDTR/lib/tinyxml2
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/include
# TODO: these should no longer be necessary if we were to link against LUS
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/src
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/src/resource
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/src/resource/types
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/extern
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/extern/spdlog/include
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/src/graphic/Fast3D/U64
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/extern/Mercury
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/extern/tinyxml2
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/extern/ZAPDUtils
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/extern/StormLib/src
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/extern/spdlog/include
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/extern/nlohmann-json/include
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/src/resource
${CMAKE_CURRENT_SOURCE_DIR}/../../soh/soh
.
)
@@ -1,11 +1,11 @@
#include "CollisionExporter.h"
#include <Resource.h>
#include <libultraship/bridge.h>
void OTRExporter_Collision::Save(ZResource* res, const fs::path& outPath, BinaryWriter* writer)
{
ZCollisionHeader* col = (ZCollisionHeader*)res;
WriteHeader(res, outPath, writer, Ship::ResourceType::CollisionHeader);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_CollisionHeader);
writer->Write(col->absMinX);
writer->Write(col->absMinY);
+2 -2
View File
@@ -1,11 +1,11 @@
#include "CutsceneExporter.h"
#include <Resource.h>
#include <libultraship/bridge.h>
void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryWriter* writer)
{
ZCutscene* cs = (ZCutscene*)res;
WriteHeader(cs, outPath, writer, Ship::ResourceType::Cutscene);
WriteHeader(cs, outPath, writer, Ship::ResourceType::SOH_Cutscene);
//writer->Write((uint32_t)cs->commands.size() + 2 + 2);
writer->Write((uint32_t)0);
@@ -5,7 +5,7 @@
#include <Utils/BitConverter.h>
#include "StrHash64/StrHash64.h"
#include "spdlog/spdlog.h"
#include "PR/ultra64/gbi.h"
#include <libultraship/libultra/gbi.h>
#include <Globals.h>
#include <iostream>
#include <string>
@@ -15,7 +15,7 @@
#define GFX_SIZE 8
#define gsDPSetCombineLERP2(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
#define gsDPSetCombineLERP_NoMacros(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
{ \
_SHIFTL(G_SETCOMBINE, 24, 8) | \
@@ -76,7 +76,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
F3DZEXOpcode opF3D = (F3DZEXOpcode)opcode;
if ((int)opF3D == G_DL)// || (int)opF3D == G_BRANCH_Z)
opcode = (uint8_t)G_DL_OTR;
opcode = (uint8_t)G_DL_OTR_HASH;
if ((int)opF3D == G_MTX)
opcode = (uint8_t)G_MTX_OTR;
@@ -85,10 +85,10 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
opcode = (uint8_t)G_BRANCH_Z_OTR;
if ((int)opF3D == G_VTX)
opcode = (uint8_t)G_VTX_OTR;
opcode = (uint8_t)G_VTX_OTR_HASH;
if ((int)opF3D == G_SETTIMG)
opcode = (uint8_t)G_SETTIMG_OTR;
opcode = (uint8_t)G_SETTIMG_OTR_HASH;
word0 += (opcode << 24);
@@ -607,7 +607,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
int32_t ab1 = (data & 0b00000000000000000000000000000000000000000000000000000000111000) >> 3;
int32_t ad1 = (data & 0b00000000000000000000000000000000000000000000000000000000000111) >> 0;
Gfx value = {gsDPSetCombineLERP2(a0, b0, c0, d0, aa0, ab0, ac0, ad0, a1, b1, c1, d1, aa1, ab1, ac1, ad1)};
Gfx value = { gsDPSetCombineLERP_NoMacros(a0, b0, c0, d0, aa0, ab0, ac0, ad0, a1, b1, c1, d1, aa1, ab1, ac1, ad1)};
word0 = value.words.w0;
word1 = value.words.w1;
}
@@ -686,7 +686,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
Gfx value = {gsDPSetTextureImage(fmt, siz, www + 1, __)};
word0 = value.words.w0 & 0x00FFFFFF;
word0 += (G_SETTIMG_OTR << 24);
word0 += (G_SETTIMG_OTR_HASH << 24);
//word1 = value.words.w1;
word1 = 0;
@@ -754,7 +754,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
word0 = value.words.w0;
word0 &= 0x00FFFFFF;
word0 += (G_VTX_OTR << 24);
word0 += (G_VTX_OTR_HASH << 24);
word1 = value.words.w1;
writer->Write(word0);
+1 -1
View File
@@ -3,7 +3,7 @@
#include "ZArray.h"
//#include "OTRExporter.h"
#include <Utils/BinaryWriter.h>
#include <Resource.h>
#include <libultraship/bridge.h>
#include "VersionInfo.h"
class OTRExporter : public ZResourceExporter
+92 -58
View File
@@ -1,4 +1,5 @@
#include <Archive.h>
#include "Main.h"
#include "Exporter.h"
#include "BackgroundExporter.h"
#include "TextureExporter.h"
#include "RoomExporter.h"
@@ -22,6 +23,7 @@
#include <Utils/MemoryStream.h>
#include <Utils/BinaryWriter.h>
#include <bit>
#include <mutex>
std::string otrFileName = "oot.otr";
std::shared_ptr<Ship::Archive> otrArchive;
@@ -62,35 +64,34 @@ static void ExporterParseFileMode(const std::string& buildMode, ZFileMode& fileM
static void ExporterProgramEnd()
{
uint32_t crc = 0xFFFFFFFF;
const uint8_t endianness = (uint8_t)Endianness::Big;
if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory)
{
std::string romPath = Globals::Instance->baseRomPath.string();
const std::vector<uint8_t>& romData = File::ReadAllBytes(romPath);
crc = BitConverter::ToUInt32BE(romData, 0x10);
printf("Creating version file...\n");
// Get crc from rom
std::string romPath = Globals::Instance->baseRomPath.string();
std::vector<uint8_t> romData = File::ReadAllBytes(romPath);
uint32_t crc = BitConverter::ToUInt32BE(romData, 0x10);
uint8_t endianness = (uint8_t)Endianness::Big;
// Write crc to version file
fs::path versionPath("Extract/version");
MemoryStream* versionStream = new MemoryStream();
BinaryWriter writer(versionStream);
writer.SetEndianness(Endianness::Big);
writer.Write(endianness);
writer.Write(crc);
std::ofstream versionFile(versionPath.c_str(), std::ios::out | std::ios::binary);
versionFile.write(versionStream->ToVector().data(), versionStream->GetLength());
versionFile.flush();
versionFile.close();
writer.Close();
MemoryStream *versionStream = new MemoryStream();
BinaryWriter writer(versionStream);
writer.SetEndianness(Endianness::Big);
writer.Write(endianness);
writer.Write(crc);
writer.Close();
printf("Created version file.\n");
printf("Generating OTR Archive...\n");
otrArchive = Ship::Archive::CreateArchive(otrFileName, 40000);
for (auto item : files) {
otrArchive->AddFile("version", (uintptr_t)versionStream->ToVector().data(), versionStream->GetLength());
for (const auto& item : files)
{
std::string fName = item.first;
if (fName.find("gTitleZeldaShieldLogoMQTex") != std::string::npos && !ZRom(romPath).IsMQ())
{
@@ -100,46 +101,76 @@ static void ExporterProgramEnd()
fName.replace(pos, 27, "gTitleZeldaShieldLogoTex");
}
}
auto fileData = item.second;
const auto& fileData = item.second;
otrArchive->AddFile(fName, (uintptr_t)fileData.data(),
fileData.size());
fileData.size());
}
// Add any additional files that need to be manually copied...
auto lst = Directory::ListFiles("Extract");
for (auto item : lst)
{
std::vector<std::string> splitPath = StringHelper::Split(item, ".");
if (splitPath.size() >= 3) {
std::string extension = splitPath.at(splitPath.size() - 1);
std::string format = splitPath.at(splitPath.size() - 2);
splitPath.pop_back();
splitPath.pop_back();
std::string afterPath = std::accumulate(splitPath.begin(), splitPath.end(), std::string(""));
if (extension == "png" && (format == "rgba32" || format == "rgb5a1" || format == "i4" || format == "i8" || format == "ia4" || format == "ia8" || format == "ia16" || format == "ci4" || format == "ci8")) {
Globals::Instance->buildRawTexture = true;
Globals::Instance->BuildAssetTexture(item, ZTexture::GetTextureTypeFromString(format), afterPath);
Globals::Instance->buildRawTexture = false;
auto fileData = File::ReadAllBytes(afterPath);
printf("otrArchive->AddFile(%s)\n", StringHelper::Split(afterPath, "Extract/")[1].c_str());
otrArchive->AddFile(StringHelper::Split(afterPath, "Extract/")[1], (uintptr_t)fileData.data(), fileData.size());
}
}
auto fileData = File::ReadAllBytes(item);
printf("otrArchive->AddFile(%s)\n", StringHelper::Split(item, "Extract/")[1].c_str());
otrArchive->AddFile(StringHelper::Split(item, "Extract/")[1], (uintptr_t)fileData.data(), fileData.size());
}
//otrArchive->AddFile("Audiobank", (uintptr_t)Globals::Instance->GetBaseromFile("Audiobank").data(), Globals::Instance->GetBaseromFile("Audiobank").size());
//otrArchive->AddFile("Audioseq", (uintptr_t)Globals::Instance->GetBaseromFile("Audioseq").data(), Globals::Instance->GetBaseromFile("Audioseq").size());
//otrArchive->AddFile("Audiotable", (uintptr_t)Globals::Instance->GetBaseromFile("Audiotable").data(), Globals::Instance->GetBaseromFile("Audiotable").size());
}
}
otrArchive = nullptr;
delete fileWriter;
files.clear();
// Add any additional files that need to be manually copied...
if (File::Exists("soh.otr")) {
return;
}
const auto& lst = Directory::ListFiles("Extract");
std::shared_ptr<Ship::Archive> sohOtr = Ship::Archive::CreateArchive("soh.otr", 4096);
//sohOtr->AddFile("version", (uintptr_t)versionStream->ToVector().data(), versionStream->GetLength());
for (const auto& item : lst)
{
std::vector<std::string> splitPath = StringHelper::Split(item, ".");
if (splitPath.size() >= 3)
{
const std::string extension = splitPath.at(splitPath.size() - 1);
const std::string format = splitPath.at(splitPath.size() - 2);
splitPath.pop_back();
splitPath.pop_back();
std::string afterPath = std::accumulate(splitPath.begin(), splitPath.end(), std::string(""));
if (extension == "png" && (format == "rgba32" || format == "rgb5a1" || format == "i4" || format == "i8" || format == "ia4" || format == "ia8" || format == "ia16" || format == "ci4" || format == "ci8"))
{
ZTexture tex(nullptr);
Globals::Instance->buildRawTexture = true;
tex.FromPNG(item, ZTexture::GetTextureTypeFromString(format));
printf("sohOtr->AddFile(%s)\n", StringHelper::Split(afterPath, "Extract/")[1].c_str());
OTRExporter_Texture exporter;
MemoryStream* stream = new MemoryStream();
BinaryWriter writer(stream);
exporter.Save(&tex, "", &writer);
std::string src = tex.GetBodySourceCode();
writer.Write((char *)src.c_str(), src.size());
std::vector<char> fileData = stream->ToVector();
sohOtr->AddFile(StringHelper::Split(afterPath, "Extract/assets/")[1], (uintptr_t)fileData.data(), fileData.size());
continue;
}
}
if (item.find("accessibility") != std::string::npos)
{
std::string extension = splitPath.at(splitPath.size() - 1);
splitPath.pop_back();
if (extension == "json")
{
const auto &fileData = File::ReadAllBytes(item);
printf("Adding accessibility texts %s\n", StringHelper::Split(item, "texts/")[1].c_str());
sohOtr->AddFile(StringHelper::Split(item, "Extract/assets/")[1], (uintptr_t)fileData.data(), fileData.size());
}
continue;
}
const auto& fileData = File::ReadAllBytes(item);
printf("sohOtr->AddFile(%s)\n", StringHelper::Split(item, "Extract/")[1].c_str());
sohOtr->AddFile(StringHelper::Split(item, item.find("Extract/assets/") != std::string::npos ? "Extract/assets/" : "Extract/")[1], (uintptr_t)fileData.data(), fileData.size());
}
sohOtr = nullptr;
}
static void ExporterParseArgs(int argc, char* argv[], int& i)
{
@@ -228,6 +259,11 @@ static void ExporterResourceEnd(ZResource* res, BinaryWriter& writer)
//printf("Exported Resource End %s in %zums\n", res->GetName().c_str(), diff);
}
static void ExporterProcessCompilable(tinyxml2::XMLElement* reader)
{
std::string nodeName = reader->Name();
}
static void ExporterXMLBegin()
{
}
@@ -247,13 +283,14 @@ void AddFile(std::string fName, std::vector<char> data)
}
}
static void ImportExporters()
void ImportExporters()
{
// In this example we set up a new exporter called "EXAMPLE".
// By running ZAPD with the argument -se EXAMPLE, we tell it that we want to use this exporter for our resources.
ExporterSet* exporterSet = new ExporterSet();
exporterSet->processFileModeFunc = ExporterProcessFileMode;
exporterSet->parseFileModeFunc = ExporterParseFileMode;
exporterSet->processCompilableFunc = ExporterProcessCompilable;
exporterSet->parseArgsFunc = ExporterParseArgs;
exporterSet->beginFileFunc = ExporterFileBegin;
exporterSet->endFileFunc = ExporterFileEnd;
@@ -286,6 +323,3 @@ static void ImportExporters()
InitVersionInfo();
}
// When ZAPD starts up, it will automatically call the below function, which in turn sets up our exporters.
REGISTER_EXPORTER(ImportExporters);
+1 -1
View File
@@ -1,6 +1,6 @@
#pragma once
#include <Archive.h>
#include <libultraship/bridge.h>
extern std::shared_ptr<Ship::Archive> otrArchive;
extern std::map<std::string, std::vector<char>> files;
+1 -1
View File
@@ -5,7 +5,7 @@ void OTRExporter_Path::Save(ZResource* res, const fs::path& outPath, BinaryWrite
{
ZPath* path = (ZPath*)res;
WriteHeader(res, outPath, writer, Ship::ResourceType::Path);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Path);
writer->Write((uint32_t)path->pathways.size());
@@ -1,11 +1,11 @@
#include "PlayerAnimationExporter.h"
#include <Resource.h>
#include <libultraship/bridge.h>
void OTRExporter_PlayerAnimationExporter::Save(ZResource* res, const fs::path& outPath, BinaryWriter* writer)
{
ZPlayerAnimationData* anim = (ZPlayerAnimationData*)res;
WriteHeader(res, outPath, writer, Ship::ResourceType::PlayerAnimation);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_PlayerAnimation);
auto start = std::chrono::steady_clock::now();
+2 -2
View File
@@ -23,7 +23,7 @@
#include <ZRoom/Commands/SetAlternateHeaders.h>
#include "CollisionExporter.h"
#include "DisplayListExporter.h"
#include "Resource.h"
#include <libultraship/bridge.h>
#include <Globals.h>
#include <ZRoom/Commands/SetExitList.h>
#include <ZRoom/Commands/SetPathways.h>
@@ -39,7 +39,7 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite
{
ZRoom* room = (ZRoom*)res;
WriteHeader(res, outPath, writer, Ship::ResourceType::Room);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Room);
writer->Write((uint32_t)room->commands.size());
+2 -2
View File
@@ -1,5 +1,5 @@
#include "SkeletonExporter.h"
#include <Resource.h>
#include <libultraship/bridge.h>
#include <Globals.h>
#include "DisplayListExporter.h"
@@ -7,7 +7,7 @@ void OTRExporter_Skeleton::Save(ZResource* res, const fs::path& outPath, BinaryW
{
ZSkeleton* skel = (ZSkeleton*)res;
WriteHeader(res, outPath, writer, Ship::ResourceType::Skeleton);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Skeleton);
writer->Write((uint8_t)skel->type);
writer->Write((uint8_t)skel->limbType);
@@ -1,13 +1,13 @@
#include "SkeletonLimbExporter.h"
#include "DisplayListExporter.h"
#include <Resource.h>
#include <libultraship/bridge.h>
#include <Globals.h>
void OTRExporter_SkeletonLimb::Save(ZResource* res, const fs::path& outPath, BinaryWriter* writer)
{
ZLimb* limb = (ZLimb*)res;
WriteHeader(res, outPath, writer, Ship::ResourceType::SkeletonLimb);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_SkeletonLimb);
writer->Write((uint8_t)limb->type);
writer->Write((uint8_t)limb->skinSegmentType);
+1 -1
View File
@@ -5,7 +5,7 @@ void OTRExporter_Text::Save(ZResource* res, const fs::path& outPath, BinaryWrite
{
ZText* txt = (ZText*)res;
WriteHeader(txt, outPath, writer, Ship::ResourceType::Text);
WriteHeader(txt, outPath, writer, Ship::ResourceType::SOH_Text);
writer->Write((uint32_t)txt->messages.size());
+4 -3
View File
@@ -17,9 +17,10 @@ void OTRExporter_Texture::Save(ZResource* res, const fs::path& outPath, BinaryWr
writer->Write((uint32_t)tex->GetRawDataSize());
auto data = tex->parent->GetRawData();
writer->Write((char*)data.data() + tex->GetRawDataIndex(), tex->GetRawDataSize());
if (tex->parent != nullptr) {
auto data = tex->parent->GetRawData();
writer->Write((char*)data.data() + tex->GetRawDataIndex(), tex->GetRawDataSize());
}
auto end = std::chrono::steady_clock::now();
size_t diff = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
+10 -12
View File
@@ -1,27 +1,25 @@
#include "VersionInfo.h"
#include <Resource.h>
#include <libultraship/bridge.h>
std::map<Ship::ResourceType, uint32_t> resourceVersions;
void InitVersionInfo()
{
resourceVersions = std::map<Ship::ResourceType, uint32_t> {
{ Ship::ResourceType::Animation, 0 },
{ Ship::ResourceType::Model, 0 },
{ Ship::ResourceType::SOH_Animation, 0 },
{ Ship::ResourceType::Texture, 0 },
{ Ship::ResourceType::Material, 0 },
{ Ship::ResourceType::PlayerAnimation, 0 },
{ Ship::ResourceType::SOH_PlayerAnimation, 0 },
{ Ship::ResourceType::DisplayList, 0 },
{ Ship::ResourceType::Room, 0 },
{ Ship::ResourceType::CollisionHeader, 0 },
{ Ship::ResourceType::Skeleton, 0 },
{ Ship::ResourceType::SkeletonLimb, 0 },
{ Ship::ResourceType::SOH_Room, 0 },
{ Ship::ResourceType::SOH_CollisionHeader, 0 },
{ Ship::ResourceType::SOH_Skeleton, 0 },
{ Ship::ResourceType::SOH_SkeletonLimb, 0 },
{ Ship::ResourceType::Matrix, 0 },
{ Ship::ResourceType::Path, 0 },
{ Ship::ResourceType::SOH_Path, 0 },
{ Ship::ResourceType::Vertex, 0 },
{ Ship::ResourceType::Cutscene, 0 },
{ Ship::ResourceType::SOH_Cutscene, 0 },
{ Ship::ResourceType::Array, 0 },
{ Ship::ResourceType::Text, 0 },
{ Ship::ResourceType::SOH_Text, 0 },
{ Ship::ResourceType::Blob, 0 },
};
}
+1 -1
View File
@@ -1,5 +1,5 @@
#include "VtxExporter.h"
#include "Resource.h"
#include <libultraship/bridge.h>
#include "VersionInfo.h"
+1 -1
View File
@@ -2,7 +2,7 @@
#define Z64CUTSCENE_H
#if 0
#include "ultra64.h"
#include <libultraship/libultra.h>
typedef struct {
/* 0x00 */ u16 entrance; // entrance index upon which the cutscene should trigger
@@ -0,0 +1,16 @@
{
"file1": "File 1",
"file2": "File 2",
"file3": "File 3",
"options": "Options",
"copy": "Copy",
"erase": "Erase",
"quit": "Quit",
"confirm": "Yes",
"audio_stereo": "Sound - Stereo",
"audio_mono": "Sound - Mono",
"audio_headset": "Sound - Headset",
"audio_surround": "Sound - Surround",
"target_switch": "Targetting Mode - Switch",
"target_hold": "Targetting Mode - Hold"
}
@@ -0,0 +1,16 @@
{
"file1": "Fichier 1",
"file2": "Fichier 2",
"file3": "Fichier 3",
"options": "Options",
"copy": "Copier",
"erase": "Effacer",
"quit": "Retour",
"confirm": "Oui",
"audio_stereo": "Son - Stéréo",
"audio_mono": "Son - Mono",
"audio_headset": "Son - Casque",
"audio_surround": "Son - Surround",
"target_switch": "Visée - Fixe",
"target_hold": "Visée - Maintenue"
}
@@ -0,0 +1,16 @@
{
"file1": "Datei 1",
"file2": "Datei 2",
"file3": "Datei 3",
"options": "Optionen",
"copy": "Kopieren",
"erase": "Löschen",
"quit": "Zurück",
"confirm": "Ja",
"audio_stereo": "Sound - Stereo",
"audio_mono": "Sound - Mono",
"audio_headset": "Sound - Kopfhörer",
"audio_surround": "Sound - Surround",
"target_switch": "Zielerfassung - Einmal drücken",
"target_hold": "Zielerfassung - Trigger halten"
}
@@ -0,0 +1,220 @@
{
"health": "health $0",
"magic": "magic $0",
"rupees": "rupees $0",
"0": "Deku Stick $0",
"1": "Deku Nut $0",
"2": "Bomb $0",
"3": "Fairy Bow $0",
"4": "Fire Arrow",
"5": "Din's Fire",
"6": "Fairy Slingshot $0",
"7": "Fairy Ocarina",
"8": "Ocarina of Time",
"9": "Bombchu $0",
"10": "Hookshot",
"11": "Longshot",
"12": "Ice Arrow",
"13": "Farore's Wind",
"14": "Boomerang",
"15": "Lens of Truth",
"16": "Magic Beans $0",
"17": "Megaton Hammer",
"18": "Light Arrow",
"19": "Nayru's Love",
"20": "Empty Bottle",
"21": "Red Potion",
"22": "Green Potion",
"23": "Blue Potion",
"24": "Fairy",
"25": "Fish",
"26": "Milk Bottle",
"27": "Ruto's Letter",
"28": "Blue Fire",
"29": "Bugs",
"30": "Big Poe",
"31": "Milk Bottle (Half)",
"32": "Poe",
"33": "Weird Egg",
"34": "Chicken",
"35": "Zelda's Letter",
"36": "Keaton Mask",
"37": "Skull Mask",
"38": "Spooky Mask",
"39": "Bunny Mask",
"40": "Goron Mask",
"41": "Zora Mask",
"42": "Gerudo Mask",
"43": "Mask of Truth",
"44": "Sold Out",
"45": "Pocket Egg",
"46": "Pocket Cucco",
"47": "Cojiro",
"48": "Odd Mushroom",
"49": "Odd Potion",
"50": "Saw",
"51": "Broken Sword",
"52": "Prescription",
"53": "Eyeball Frog",
"54": "Eyedrops",
"55": "Claim Check",
"56": "Bow Fire Arrow",
"57": "Bow Ice Arrow",
"58": "Bow Light Arrow",
"59": "Kokiri Sword",
"60": "Master Sword",
"61": "Giant's Knife",
"62": "Deku Shield",
"63": "Hylian Shield",
"64": "Mirror Shield",
"65": "Kokiri Tunic",
"66": "Goron Tunic",
"67": "Zora Tunic",
"68": "Kokiri Boots",
"69": "Iron Boots",
"70": "Hover Boots",
"71": "Bullet Bag (Holds 30)",
"72": "Bullet Bag (Holds 40)",
"73": "Bullet Bag (Holds 50)",
"74": "Quiver (Holds 30)",
"75": "Quiver (Holds 40)",
"76": "Quiver (Holds 50)",
"77": "Bomb Bag (Holds 20)",
"78": "Bomb Bag (Holds 30)",
"79": "Bomb Bag (Holds 40)",
"80": "Goron's Bracelet",
"81": "Silver Gauntlets",
"82": "Golden Gauntlets",
"83": "Silver Scale",
"84": "Golden Scale",
"85": "Giant's Knife (Broken)",
"86": "WALLET ADULT",
"87": "Giant's Wallet",
"88": "Deku Seeds",
"89": "Fishing Pole",
"90": "Minuet of Forest",
"91": "Bolero of Fire",
"92": "Serenade of Water",
"93": "Requiem of Spirit",
"94": "Nocturne of Shadow",
"95": "Prelude of Light",
"96": "Zelda's Lullaby",
"97": "Epona's Song",
"98": "Saria's Song",
"99": "Sun's Song",
"100": "Song of Time",
"101": "Song of Storms",
"102": "Forest Medallion",
"103": "Fire Medallion",
"104": "Water Medallion",
"105": "Spirit Medallion",
"106": "Shadow Medallion",
"107": "Light Medallion",
"108": "Kokiri's Emerald",
"109": "Goron's Ruby",
"110": "Zora Sapphire",
"111": "Stone of Agony",
"112": "Gerudo's Card",
"113": "Skulltula Token $0",
"114": "Heart Container $0",
"115": "Piece of Heart",
"116": "Boss Key",
"117": "Compass",
"118": "Dungeon Map",
"119": "Small Key",
"120": "MAGIC SMALL",
"121": "MAGIC LARGE",
"122": "PIECE OF HEART 2",
"123": "INVALID 1",
"124": "INVALID 2",
"125": "INVALID 3",
"126": "INVALID 4",
"127": "INVALID 5",
"128": "INVALID 6",
"129": "INVALID 7",
"130": "Milk",
"131": "Recovery Heart",
"132": "Green Rupee",
"133": "Blue Rupee",
"134": "Red Rupee",
"135": "Purple Rupee",
"136": "Gold Rupee",
"137": "INVALID 8",
"138": "STICKS 5",
"139": "STICKS 10",
"140": "NUTS 5",
"141": "NUTS 10",
"142": "BOMBS 5",
"143": "BOMBS 10",
"144": "BOMBS 20",
"145": "BOMBS 30",
"146": "ARROWS SMALL",
"147": "ARROWS MEDIUM",
"148": "ARROWS LARGE",
"149": "SEEDS 30",
"150": "BOMBCHUS 5",
"151": "BOMBCHUS 20",
"152": "STICK UPGRADE 20",
"153": "STICK UPGRADE 30",
"154": "NUT UPGRADE 30",
"155": "NUT UPGRADE 40",
"255": "",
"256": "Haunted Wasteland",
"257": "Gerudos Fortress",
"258": "Gerudo Valley",
"259": "Hylia Lakeside",
"260": "Lon Lon Ranch",
"261": "Market",
"262": "Hyrule Field",
"263": "Death Mountain",
"264": "Kakariko Village",
"265": "Lost Woods",
"266": "Kokiri Forest",
"267": "Zoras Domain",
"268": "",
"269": "",
"270": "",
"271": "",
"272": "",
"273": "",
"274": "",
"275": "",
"276": "",
"277": "",
"278": "",
"279": "",
"280": "",
"281": "",
"282": "",
"283": "",
"284": "",
"285": "",
"286": "",
"287": "",
"288": "",
"289": "",
"290": "",
"291": "",
"292": "Hyrule Field",
"293": "Kakariko Village",
"294": "Graveyard",
"295": "Zoras River",
"296": "Kokiri Forest",
"297": "Sacred Forest Meadow",
"298": "Lake Hylia",
"299": "Zoras Domain",
"300": "Zoras Fountain",
"301": "Gerudo Valley",
"302": "Lost Woods",
"303": "Desert Colossus",
"304": "Gerudo's Fortress",
"305": "Haunted Wasteland",
"306": "Market",
"307": "Hyrule Castle",
"308": "Death Mountain Trail",
"309": "Death Mountain Crater",
"310": "Goron City",
"311": "Lon Lon Ranch",
"312": "Question Mark",
"313": "Ganon's Castle"
}
@@ -0,0 +1,220 @@
{
"health": "vie $0",
"magic": "magie $0",
"rupees": "rubis $0",
"0": "Bâton Mojo $0",
"1": "Noix Mojo $0",
"2": "Bombes $0",
"3": "Arc des Fées $0",
"4": "Flèche de Feu",
"5": "Feu de Din",
"6": "Lance-Pierre des Fées $0",
"7": "Ocarina des Fées",
"8": "Ocarina of Temps",
"9": "Missiles Teigneux $0",
"10": "Grappin",
"11": "Super Grappin",
"12": "Flèche de Glace",
"13": "Vent de Farore",
"14": "Boomerang",
"15": "Monocle de Vérité",
"16": "Haricot Magique $0",
"17": "Masse des Titans",
"18": "Flèche de Lumière",
"19": "Amour de Nayru",
"20": "Bouteille Vide",
"21": "Potion Rouge",
"22": "Potion Verte",
"23": "Potion Bleue",
"24": "Fée",
"25": "Poisson",
"26": "Lait de Lon Lon",
"27": "Lettre de Ruto",
"28": "Flammme Bleue",
"29": "Insectes",
"30": "Âme",
"31": "Lait de Lon Lon (moitié)",
"32": "Esprit",
"33": "Oeuf Curieux",
"34": "Poulet",
"35": "Lettre de Zelda",
"36": "Masque du Renard",
"37": "Masque de Mort",
"38": "Masque d'Effroi",
"39": "Masque du Lapin",
"40": "Masque de Goron",
"41": "Masque de Zora",
"42": "Masque de Gerudo",
"43": "Masque de Vérité",
"44": "VENDU",
"45": "Oeuf de Poche",
"46": "Cocotte de poche",
"47": "P'tit Poulet",
"48": "Champignon suspect",
"49": "Mixture suspecte",
"50": "Scie du chasseur",
"51": "Épée de Goron (brisée)",
"52": "Ordonnance",
"53": "Crapaud-qui-louche",
"54": "Gouttes",
"55": "Certificat",
"56": "Arc et Flèche de Feu",
"57": "Arc et Flèche de Glace",
"58": "Arc et Flèche de Lumière",
"59": "Épée Kokiri",
"60": "Épée de Légende",
"61": "Lame des Géants",
"62": "Bouclier Mojo",
"63": "Bouclier Hylien",
"64": "Bouclier Miroir",
"65": "Tunique Kokiri",
"66": "Tunique Goron",
"67": "Tunique Zora",
"68": "Bottes Kokiri",
"69": "Bottes de plomb",
"70": "Bottes des airs",
"71": "Sac de graines (Contient 30)",
"72": "Sac de graines (Contient 40)",
"73": "Sac de graines (Contient 50)",
"74": "Carquois (Contient 30)",
"75": "Carquois (Contient 40)",
"76": "Carquois (Contient 50)",
"77": "Sac de bombes (Contient 20)",
"78": "Sac de bombes (Contient 30)",
"79": "Sac de bombes (Contient 40)",
"80": "Bracelet Goron",
"81": "Gantelets d'argent",
"82": "Gentelets d'or",
"83": "Écaille d'argent",
"84": "Écaille d'or",
"85": "Lame des Géants (Brisée)",
"86": "GRANDE BOURSE",
"87": "Bourse de Géant",
"88": "Deku Seeds",
"89": "Canne à pèche",
"90": "Menuet des Bois",
"91": "Boléro du Feu",
"92": "Sérénade de l'Eau",
"93": "Requiem des Esprits",
"94": "Nocturne de l'Ombre",
"95": "Prélude de la Lumière",
"96": "Berceuse de Zelda",
"97": "Chant d'Epona",
"98": "Chant de Saria",
"99": "Chant du Soleil",
"100": "Chant du Temps",
"101": "Chant des Tempêtes",
"102": "Médaillon de la Forêt",
"103": "Médaillon du Feu",
"104": "Médaillon de l'Eau",
"105": "Médaillon de l'Esprit",
"106": "Médaillon de l'Ombre",
"107": "Médaillon de la Lumière",
"108": "Émeraude Kokiri",
"109": "Rubis Goron",
"110": "Saphir Zora",
"111": "Pierre de Souffrance",
"112": "Carte Gerudo",
"113": "Skulltula d'or $0",
"114": "Coeur d'Énergie $0",
"115": "Quart de Coeur",
"116": "Clé d'or",
"117": "Boussole",
"118": "Carte du Donjon",
"119": "Petite Clé",
"120": "PETITE BOUTEILLE DE MAGIE",
"121": "GRANDE BOUTEILLE DE MAGIE",
"122": "QUART DE COEUR 2",
"123": "INVALIDE 1",
"124": "INVALIDE 2",
"125": "INVALIDE 3",
"126": "INVALIDE 4",
"127": "INVALIDE 5",
"128": "INVALIDE 6",
"129": "INVALIDE 7",
"130": "Lait de Lon Lon",
"131": "Coeur de Vie",
"132": "Rubis Vert",
"133": "Rubis Bleu",
"134": "Rubis Rouge",
"135": "Rubis Pourpre",
"136": "Énorme Rubis",
"137": "INVALIDE 8",
"138": "BÂTON MOJO 5",
"139": "BÂTON MOJO 10",
"140": "NOIX MOJO 5",
"141": "NOIX MOJO 10",
"142": "BOMBES 5",
"143": "BOMBES 10",
"144": "BOMBES 20",
"145": "BOMBES 30",
"146": "ARROWS SMALL",
"147": "ARROWS MEDIUM",
"148": "ARROWS LARGE",
"149": "GRAINES MOJO 30",
"150": "MISSILES TEIGNEUX 5",
"151": "MISSILES TEIGNEUX 20",
"152": "AMÉLIORATION BÂTON MOJO 20",
"153": "AMÉLIORATION BÂTON MOJO 30",
"154": "AMÉLIORATION NOIX MOJO 30",
"155": "AMÉLIORATION NOIX MOJO 40",
"255": "",
"256": "Désert Hanté",
"257": "Forteresse Gerudo",
"258": "Vallée Gerudo",
"259": "Laboratoire du Lac",
"260": "Ranch Lon Lon",
"261": "Place du Marché",
"262": "Plaine d'Hyrule",
"263": "Montagne du Péril",
"264": "Village Cocorico",
"265": "Bois Perdus",
"266": "Forêt Kokiri",
"267": "Domaine Zora",
"268": "",
"269": "",
"270": "",
"271": "",
"272": "",
"273": "",
"274": "",
"275": "",
"276": "",
"277": "",
"278": "",
"279": "",
"280": "",
"281": "",
"282": "",
"283": "",
"284": "",
"285": "",
"286": "",
"287": "",
"288": "",
"289": "",
"290": "",
"291": "",
"292": "Plaine d'Hyrule",
"293": "Village Cocorico",
"294": "Cimetière",
"295": "Rivière Zora",
"296": "Forêt Kokiri",
"297": "Bosquet Sacré",
"298": "Lac Hylia",
"299": "Domaine Zora",
"300": "Fountaine Zora",
"301": "Vallée Gerudo",
"302": "Bois Perdus",
"303": "Colosse du Désert",
"304": "Forteresse Gerudo",
"305": "Désert Hanté",
"306": "Place du Marché",
"307": "Château d'Hyrule",
"308": "Chemin du Péril",
"309": "Cratère du Péril",
"310": "Village Goron",
"311": "Ranch Lon Lon",
"312": "Point d'interrogation",
"313": "Château de Ganon"
}
@@ -0,0 +1,220 @@
{
"health": "Energie $0",
"magic": "Magie $0",
"rupees": "Rubine $0",
"0": "Deku-Stab $0",
"1": "Deku-Nuß $0",
"2": "Bombe $0",
"3": "Feen-Bogen $0",
"4": "Feuer-Pfeil",
"5": "Dins Feuerinferno",
"6": "Feen-Schleuder $0",
"7": "Feen-Okarina",
"8": "Okarina der Zeit",
"9": "Krabbelmine $0",
"10": "Fanghaken",
"11": "Enterhaken",
"12": "Eis-Pfeil",
"13": "Farores Donnersturm",
"14": "Bumerang",
"15": "Auge der Wahrheit",
"16": "Wundererbsen $0",
"17": "Stahlhammer",
"18": "Licht-Pfeil",
"19": "Nayrus Umarmung",
"20": "Flasche",
"21": "Rotes Elixier",
"22": "Grünes Elixier",
"23": "Blaues Elixier",
"24": "Fee",
"25": "Fisch",
"26": "Milch",
"27": "Brief",
"28": "Blaues Feuer",
"29": "Käfer",
"30": "Nachtschwärmer",
"31": "Milch (1/2)",
"32": "Irrlicht",
"33": "Seltsames Ei",
"34": "Huhn",
"35": "Zeldas Brief",
"36": "Fuchs-Maske",
"37": "Schädel-Maske",
"38": "Geister-Maske",
"39": "Hasenohren",
"40": "Goronen-Maske",
"41": "Zora-Maske",
"42": "Gerudo-Maske",
"43": "Maske des Wissens",
"44": "Verkauft",
"45": "Ei",
"46": "Kiki",
"47": "Henni",
"48": "Schimmelpilz",
"49": "Modertrank",
"50": "Säge",
"51": "Goronen-Schwert (zerbrochen)",
"52": "Rezept",
"53": "Glotzfrosch",
"54": "Augentropfen",
"55": "Zertifikat",
"56": "Bogen Feuer-Pfeil",
"57": "Bogen Eis-Pfeil",
"58": "Bogen Licht-Pfeil",
"59": "Kokiri-Schwert",
"60": "Master-Schwert",
"61": "Langschwert",
"62": "Deku-schild",
"63": "Hylia-Schild",
"64": "Spiegel-Schild",
"65": "Kokiri-Rüstung",
"66": "Goronen-Rüstung",
"67": "Zora-Rüstung",
"68": "Lederstiefel",
"69": "Eisenstiefel",
"70": "Gleitstiefel",
"71": "Munitionstasche (30)",
"72": "Munitionstasche (40)",
"73": "Munitionstasche (50)",
"74": "Köcher (30)",
"75": "Köcher (40)",
"76": "Köcher (50)",
"77": "Bombentasche (20)",
"78": "Bombentasche (30)",
"79": "Bombentasche (40)",
"80": "Goronen-Armband",
"81": "Krafthandschuh",
"82": "Titanhandschuh",
"83": "Silberschuppe",
"84": "Goldschuppe",
"85": "Langschwert (gebrochen)",
"86": "Große Börse",
"87": "Riesenbörse",
"88": "Deku-Kerne",
"89": "Angel",
"90": "Menuett des Waldes",
"91": "Bolero des Feuers",
"92": "Serenade des Wassers",
"93": "Requiem der Geister",
"94": "Nocturne des Schattens",
"95": "Kantate des Lichts",
"96": "Zeldas Wiegenlied",
"97": "Eponas Lied",
"98": "Salias Lied",
"99": "Hymne der Sonne",
"100": "Hymne der Zeit",
"101": "Song of Storms",
"102": "Amulett des Waldes",
"103": "Amulett des Feuers",
"104": "Amulett des Wassers",
"105": "Amulett der Geister",
"106": "Amulett des Schattens",
"107": "Amulett des Lichts",
"108": "Kokiri-Smaragd",
"109": "Goronen-Opal",
"110": "Zora-Saphir",
"111": "Stein des Wissens",
"112": "Gerudo-Paß",
"113": "Skulltula-Symbol $0",
"114": "Herzcontainer $0",
"115": "Herzteil",
"116": "Master-Schlüssel",
"117": "Kompaß",
"118": "Labyrinth-Karte",
"119": "Kleiner Schlüssel",
"120": "MAGIE KLEIN",
"121": "MAGIE GROß",
"122": "HERZTEIL 2",
"123": "UNGÜLTIG 1",
"124": "UNGÜLTIG 2",
"125": "UNGÜLTIG 3",
"126": "UNGÜLTIG 4",
"127": "UNGÜLTIG 5",
"128": "UNGÜLTIG 6",
"129": "UNGÜLTIG 7",
"130": "Milch",
"131": "Herz",
"132": "ein Rubin",
"133": "5 Rubine",
"134": "20 Rubine",
"135": "50 Rubine",
"136": "200 Rubine",
"137": "UNGÜLTIG 8",
"138": "STÄBE 5",
"139": "STÄBE 10",
"140": "NÜSSE 5",
"141": "NÜSSE 10",
"142": "BOMBEN 5",
"143": "BOMBEN 10",
"144": "BOMBEN 20",
"145": "BOMBEN 30",
"146": "PFEILE KLEIN",
"147": "PFEILE MITTEL",
"148": "PFEILE GROß",
"149": "KERNE 30",
"150": "KRABBELMINEN 5",
"151": "KRABBELMINEN 20",
"152": "STAB UPGRADE 20",
"153": "STAB UPGRADE 30",
"154": "NUß UPGRADE 30",
"155": "NUß UPGRADE 40",
"255": "",
"256": "Gespensterwüste",
"257": "Gerudo-Festung",
"258": "Gerudotal",
"259": "Hylia-See",
"260": "Lon Lon-Farm",
"261": "Marktplatz",
"262": "Hylianische Steppe",
"263": "Todesberg",
"264": "Kakariko",
"265": "Verlorene Wälder",
"266": "Kokiri-Wald",
"267": "Zoras Reich",
"268": "",
"269": "",
"270": "",
"271": "",
"272": "",
"273": "",
"274": "",
"275": "",
"276": "",
"277": "",
"278": "",
"279": "",
"280": "",
"281": "",
"282": "",
"283": "",
"284": "",
"285": "",
"286": "",
"287": "",
"288": "",
"289": "",
"290": "",
"291": "",
"292": "Hylianische Steppe",
"293": "Kakariko",
"294": "Friedhof",
"295": "Zora-Fluss",
"296": "Kokiri-Wald",
"297": "Heilige Lichtung",
"298": "Hylia-See",
"299": "Zoras Reich",
"300": "Zoras Quelle",
"301": "Gerudotal",
"302": "Verlorene Wälder",
"303": "Wüstenkoloss",
"304": "Gerudo-Festung",
"305": "Gespensterwüste",
"306": "Marktplatz",
"307": "Schloß Hyrule",
"308": "Pfad zum Todesberg",
"309": "Todeskrater",
"310": "Goronia",
"311": "Lon Lon-Farm",
"312": "Fragezeichen",
"313": "Teufelsturm"
}
@@ -0,0 +1,18 @@
{
"minutes_plural" : "$0 minutes",
"minutes_singular" : "$0 minute",
"seconds_plural" : "$0 seconds",
"seconds_singular" : "$0 second",
"input_button_a": "the A button",
"input_button_b": "the B button",
"input_button_c": "the C button",
"input_button_l": "the L button",
"input_button_r": "the R button",
"input_button_z": "the Z button",
"input_button_c_up": "C Up",
"input_button_c_down": "C Down",
"input_button_c_left": "C Left",
"input_button_c_right": "C Right",
"input_analog_stick": "the Analog Stick",
"input_d_pad": "the D-Pad"
}
@@ -0,0 +1,18 @@
{
"minutes_plural" : "$0 minutes",
"minutes_singular" : "$0 minute",
"seconds_plural" : "$0 secondes",
"seconds_singular" : "$0 seconde",
"input_button_a": "le bouton A",
"input_button_b": "le bouton B",
"input_button_c": "le bouton C",
"input_button_l": "le bouton L",
"input_button_r": "le bouton R",
"input_button_z": "le bouton Z",
"input_button_c_up": "C Haut",
"input_button_c_down": "C Bas",
"input_button_c_left": "C Gauche",
"input_button_c_right": "C Droit",
"input_analog_stick": "le Stick Analogique",
"input_d_pad": "D-Pad"
}
@@ -0,0 +1,18 @@
{
"minutes_plural" : "$0 Minuten",
"minutes_singular" : "eine Minute",
"seconds_plural" : "$0 Sekunden",
"seconds_singular" : "eine Sekunde",
"input_button_a": "den A-Knopf",
"input_button_b": "den B-Knopf",
"input_button_c": "den C-Knopf",
"input_button_l": "den L-Knopf",
"input_button_r": "den R-Knopf",
"input_button_z": "den Z-Knopf",
"input_button_c_up": "C Oben",
"input_button_c_down": "C Unten",
"input_button_c_left": "C Links",
"input_button_c_right": "C Rechts",
"input_analog_stick": "den Analog-Stick",
"input_d_pad": "das Steuerkreuz"
}
@@ -0,0 +1,112 @@
{
"0": "Inside the Deku Tree",
"1": "Dodongo's Cavern",
"2": "Inside Jabu-Jabu's Belly",
"3": "Forest Temple",
"4": "Fire Temple",
"5": "Water Temple",
"6": "Spirit Temple",
"7": "Shadow Temple",
"8": "Bottom of The Well",
"9": "Ice Cavern",
"10": "", // Stairs to Ganondorf's Lair (No title card)
"11": "Gerudo Training Ground",
"12": "Thieves' Hideout",
"13": "Ganon's Castle",
"14": "", // Escape from Ganon's Castle (No title card)
"15": "", // Escape from Ganon's Castle 5 (No title card)x
"16": "Treasure Box Shop",
"17": "Parasitic Armored Arachnid - Gohma",
"18": "Infernal Dinosaur - King Dodongo",
"19": "Bio-electric Anemone - Barinade",
"20": "Evil Spirit from Beyond - Phantom Ganon",
"21": "Subterranean Lava Dragon - Volvagia",
"22": "Giant Aquatic Amoeba - Morpha",
"23": "Sorceress Sisters - Twinrova",
"24": "Phantom Shadow Beast - Bongo Bongo",
"25": "Great King of Evil - Ganondorf",
"26": "",
"27": "", // Entrance to Market (No title card)
"28": "",
"29": "",
"30": "Back Alley",
"31": "Back Alley",
"32": "Market",
"33": "Market",
"34": "Market",
"35": "", // Temple of Time Exterior (No title card)
"36": "SCENE_SHRINE_N",
"37": "SCENE_SHRINE_R",
"38": "", // House of the Know-it-All Brothers (No title card)
"39": "", // House of Twins (No title card)
"40": "", // House of the Great Mido (No title card)
"41": "", // Saria's House (No title card)
"42": "", // Kakariko House 1 (No title card)
"43": "", // Back Alley House 1 (No title card)
"44": "Bazaar",
"45": "Kokiri Shop",
"46": "Goron Shop",
"47": "Zora Shop",
"48": "", // Closed Shop (No title card)
"49": "Potion Shop",
"50": "", // Bombchu Shop (No title card)
"51": "Happy Mask Shop",
"52": "", // Link's House (No title card)
"53": "", // Dog Lady's House (No title card)
"54": "Stable",
"55": "", // Impa's House (No title card)
"56": "Lakeside Laboratory",
"57": "", // Running Man's Tent (No title card)
"58": "Gravekeepers Hut",
"59": "Great Fairy's Fountain",
"60": "Fairy's Fountain",
"61": "Great Fairy's Fountain",
"62": "", // Grottos (No title card)
"63": "", // Tomb 1 (No title card)
"64": "", // Tomb 2 (No title card)
"65": "Royal Family's Tomb",
"66": "Shooting Gallery",
"67": "Temple of Time",
"68": "Chamber of The Sages",
"69": "Castle Courtyard",
"70": "Castle Courtyard",
"71": "", // Goddesses Cutscene (No title card)
"72": "Unknown Place",
"73": "Fishing Pond",
"74": "Castle Courtyard",
"75": "Bombchu Bowling Alley",
"76": "", // Lon Lon Ranch House/Silo (No title card)
"77": "", // Guard House (No title card)
"78": "", // Potion Shop (No title card)
"79": "Ganon",
"80": "House of Skulltula",
"81": "Hyrule Field",
"82": "Kakariko Village",
"83": "Graveyard",
"84": "Zora's River",
"85": "Kokiri Forest",
"86": "Sacred Forest Meadow",
"87": "Lake Hylia",
"88": "Zoras Domain",
"89": "Zoras Fountain",
"90": "Gerudo Valley",
"91": "Lost Woods",
"92": "Desert Colossus",
"93": "Gerudo's Fortress",
"94": "Haunted Wasteland",
"95": "Hyrule Castle",
"96": "Death Mountain Trail",
"97": "Death Mountain Crater",
"98": "Goron City",
"99": "Lon Lon Ranch",
"100": "",
"101": "", // Debug: Test Map (No title card)
"102": "", // Debug: Test Room (No title card)
"103": "", // Debug: Depth Test (No title card)
"104": "", // Debug: Stalfos Miniboss Room (No title card)
"105": "", // Debug: Stalfos Boss Room (No title card)
"106": "", // Debug: Dark Link Room (No title card)
"107": "",
"108": "", // Debug: SRD Room (No title card)
"109": "" // Debug: Treasure Chest Warp (No title card)
}
@@ -0,0 +1,112 @@
{
"0": "Abre Mojo",
"1": "Caverne Dodongo",
"2": "Ventre de Jabu-Jabu",
"3": "Temple de la Forêt",
"4": "Temple du Feu",
"5": "Temple de l'Eau",
"6": "Temple de l'Esprit",
"7": "Temple de l'Ombre",
"8": "Puits",
"9": "Caverne Polaire",
"10": "", // Escaliers vers le Repaire de Ganondorf (No title card)
"11": "Gymnase Gerudo",
"12": "Repaire des Voleurs",
"13": "Tour de Ganon",
"14": "", // Fuite du Château de Ganon (No title card)
"15": "", // Fuite du Château de Ganon 5 (No title card)
"16": "Chasse aux Trésors",
"17": "Monstre Insectoide Géant - Gohma",
"18": "Dinosaure Infernal - King Dodongo",
"19": "Anémone Bio-Electrique - Barinade",
"20": "Esprit Maléfique de l'Au-Delà - Ganon Spectral",
"21": "Dragon des Profondeurs - Volcania",
"22": "Amibe Aquatique Géante - Morpha",
"23": "Sorcières Jumelles - Duo Maléfique",
"24": "Monstre de l'Ombre - Bongo Bongo",
"25": "Seigneur du Malin - Ganondorf",
"26": "",
"27": "", // Entrée vers le Marché (No title card)
"28": "",
"29": "",
"30": "Ruelle",
"31": "Ruelle",
"32": "Place du Marché",
"33": "Place du Marché",
"34": "Place du Marché",
"35": "", // Extérieur du Temple du Temps (No title card)
"36": "SCENE_SHRINE_N",
"37": "SCENE_SHRINE_R",
"38": "", // Cabane des Frères Je-Sais-Tout (No title card)
"39": "", // Cabane des Jumelles (No title card)
"40": "", // Cabane du Grand Mido (No title card)
"41": "", // Cabane de Saria (No title card)
"42": "", // Maison du Village Cocorico 1 (No title card)
"43": "", // Maison de la Ruelle 1 (No title card)
"44": "Bazar",
"45": "Boutique Kokiri",
"46": "Boutique Goron",
"47": "Boutique Zora",
"48": "", // Magasin Fermé (No title card)
"49": "Apothicaire",
"50": "", // Magasin de Missiles (No title card)
"51": "Foire aux Masques",
"52": "", // Cabane de Link (No title card)
"53": "", // Dog Lady's House (No title card)
"54": "Étable",
"55": "", // Maison d'Impa (No title card)
"56": "Laboratoire du Lac",
"57": "", // Tente du Marathonien (No title card)
"58": "Cabane du fossoyeur",
"59": "Fountaine Royale des Fées",
"60": "Fountaine des Fées",
"61": "Fountaine Royale des Fées",
"62": "", // Grottes (No title card)
"63": "", // Tombe 1 (No title card)
"64": "", // Tombe 2 (No title card)
"65": "Tombe Royale",
"66": "Jeu d'adresse",
"67": "Temple du Temps",
"68": "Sanctuaire des Sages",
"69": "Cour du Château",
"70": "Cour du Château",
"71": "", // Goddesses Cutscene (No title card)
"72": "Endroit Inconnu",
"73": "Étang",
"74": "Cour du Château",
"75": "Bowling Teigneux",
"76": "", // Lon Lon Ranch House/Silo (No title card)
"77": "", // Guard House (No title card)
"78": "", // Potion Shop (No title card)
"79": "Ganon",
"80": "Maison des Araignées",
"81": "Plaine d'Hyrule",
"82": "Village Cocorico",
"83": "Cimetière",
"84": "Fleuve Zora",
"85": "Forêt Kokiri",
"86": "Bosquet Sacré",
"87": "Lac Hylia",
"88": "Domaine Zora",
"89": "Fontaine Zora",
"90": "Vallée Gerudo",
"91": "Bois Perdu",
"92": "Colosse du Désert",
"93": "Forteresse Gerudo",
"94": "Désert Hanté",
"95": "Château d'Hyrule",
"96": "Chemin du Péril",
"97": "Cratère du Péril",
"98": "Village Goron",
"99": "Ranch Lon Lon",
"100": "",
"101": "", // Debug: Test Map (No title card)
"102": "", // Debug: Test Room (No title card)
"103": "", // Debug: Depth Test (No title card)
"104": "", // Debug: Stalfos Miniboss Room (No title card)
"105": "", // Debug: Stalfos Boss Room (No title card)
"106": "", // Debug: Dark Link Room (No title card)
"107": "",
"108": "", // Debug: SRD Room (No title card)
"109": "" // Debug: Treasure Chest Warp (No title card)
}
@@ -0,0 +1,112 @@
{
"0": "Im Deku-Baum",
"1": "Dodongos Höhle",
"2": "Jabu-Jabus Bauch",
"3": "Waldtempel",
"4": "Feuertempel",
"5": "Wassertempel",
"6": "Geistertempel",
"7": "Schattentempel",
"8": "Grund des Brunnens",
"9": "Eishöhle",
"10": "", // Treppe zu Ganondorfs Verließ (Keine Title-Card)
"11": "Gerudo-Arena",
"12": "Diebesversteck",
"13": "Ganons Schloß",
"14": "", // Flucht aus Ganons Schloß (Keine Title-Card)
"15": "", // Flucht aus Ganons Schloß 5 (Keine Title-Card)
"16": "Truhenlotterie",
"17": "Gepanzerter Spinnenparasit - Gohma",
"18": "Infernosaurus - King Dodongo",
"19": "Elektroterristrisches Biotentakel - Barinade",
"20": "Reitendes Unheil - Phantom-Ganon",
"21": "Subterraner Lavadrachoid - Volvagia",
"22": "Aquamöbes Wassertentakel - Morpha",
"23": "Höllische Hexenarmada - Killa Ohmaz",
"24": "Bestialische Schattenmonstrosität - Bongo Bongo",
"25": "Großmeister des Bösen - Ganondorf",
"26": "",
"27": "", // Eingang zum Marktplatz (Keine Title-Card)
"28": "",
"29": "",
"30": "Seitenstraße",
"31": "Seitenstraße",
"32": "Marktplatz",
"33": "Marktplatz",
"34": "Marktplatz",
"35": "", // Vor der Zitadelle der Zeit (Keine Title-Card)
"36": "SCENE_SHRINE_N",
"37": "SCENE_SHRINE_R",
"38": "", // Haus der Allwissenden Brüder (Keine Title-Card)
"39": "", // Haus der Zwillinge (Keine Title-Card)
"40": "", // Midos Haus (Keine Title-Card)
"41": "", // Salias Haus (Keine Title-Card)
"42": "", // Kakariko Haus 1 (Keine Title-Card)
"43": "", // Steinstraßen Haus 1 (Keine Title-Card)
"44": "Basar",
"45": "Kokiri-Laden",
"46": "Goronen-Laden",
"47": "Zora-Laden",
"48": "", // Geschlossener Laden (Keine Title-Card)
"49": "Magie-Laden",
"50": "", // Krabbelminen-Laden (Keine Title-Card)
"51": "Maskenhändler",
"52": "", // Links Haus (Keine Title-Card)
"53": "", // Haus der Hunde-Dame (Keine Title-Card)
"54": "Stall",
"55": "", // Impas Haus (Keine Title-Card)
"56": "Hylia-See Laboratorium",
"57": "", // Zelt des Rennläufers (Keine Title-Card)
"58": "Hütte des Totengräbers",
"59": "Feen-Quelle",
"60": "Feen-Brunnen",
"61": "Feen-Quelle",
"62": "", // Grotten (Keine Title-Card)
"63": "", // Grab 1 (Keine Title-Card)
"64": "", // Grab 2 (Keine Title-Card)
"65": "Königsgrab",
"66": "Schießbude",
"67": "Zitadelle der Zeit",
"68": "Halle der Weisen",
"69": "Burghof",
"70": "Burghof",
"71": "", // Göttinnen Cutscene (Keine Title-Card)
"72": "Unbekannter Ort",
"73": "Fischweiher",
"74": "Burghof",
"75": "Minenbowlingbahn",
"76": "", // Lon Lon-Farm Haus/Silo (Keine Title-Card)
"77": "", // Wachposten (Keine Title-Card)
"78": "", // Magie-Laden (Keine Title-Card)
"79": "Ganon",
"80": "Skulltulas Haus",
"81": "Hylianische Steppe",
"82": "Kakariko",
"83": "Friedhof",
"84": "Zora-Fluß",
"85": "Kokiri-Wald",
"86": "Waldlichtung",
"87": "Hylia-See",
"88": "Zoras Reich",
"89": "Zoras Quelle",
"90": "Gerudotal",
"91": "Verlorene Wälder",
"92": "Wüstenkoloss",
"93": "Gerudo-Festung",
"94": "Geisterwüste",
"95": "Schloß Hyrule",
"96": "Pfad zum Todesberg",
"97": "Todeskrater",
"98": "Goronia",
"99": "Lon Lon-Farm",
"100": "",
"101": "", // Debug: Test Karte (Keine Title-Card)
"102": "", // Debug: Test Raum (Keine Title-Card)
"103": "", // Debug: Tiefen Test (Keine Title-Card)
"104": "", // Debug: Stalfos-Ritter Miniboss Raum (Keine Title-Card)
"105": "", // Debug: Stalfos-Ritter Boss Raum (Keine Title-Card)
"106": "", // Debug: Schwarzer Link Raum (Keine Title-Card)
"107": "",
"108": "", // Debug: SRD Raum (Keine Title-Card)
"109": "" // Debug: Schatzkisten Teleport (Keine Title-Card)
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 355 B

After

Width:  |  Height:  |  Size: 355 B

Before

Width:  |  Height:  |  Size: 379 B

After

Width:  |  Height:  |  Size: 379 B

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -0,0 +1,21 @@
<DisplayList Version="0">
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_003"/>
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_0"/>
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_003"/>
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_002"/>
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_1"/>
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_002"/>
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material"/>
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_2"/>
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material"/>
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_001"/>
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_3"/>
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_001"/>
<PipeSync/>
<SetGeometryMode G_LIGHTING="1" />
<ClearGeometryMode G_TEXTURE_GEN="1" />
<SetCombineLERP A0="G_CCMUX_0" B0="G_CCMUX_0" C0="G_CCMUX_0" D0="G_CCMUX_SHADE" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_ENVIRONMENT" A1="G_CCMUX_0" B1="G_CCMUX_0" C1="G_CCMUX_0" D1="G_CCMUX_SHADE" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_ENVIRONMENT"/>
<Texture S="65535" T="65535" Level="0" Tile="0" On="0"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,241 @@
<DisplayList Version="0">
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="4" V02="5"/>
<Triangle1 V00="3" V01="6" V02="4"/>
<Triangle1 V00="6" V01="7" V02="4"/>
<Triangle1 V00="6" V01="8" V02="7"/>
<Triangle1 V00="8" V01="9" V02="7"/>
<Triangle1 V00="7" V01="9" V02="10"/>
<Triangle1 V00="9" V01="11" V02="10"/>
<Triangle1 V00="12" V01="10" V02="11"/>
<Triangle1 V00="11" V01="13" V02="12"/>
<Triangle1 V00="11" V01="14" V02="13"/>
<Triangle1 V00="11" V01="15" V02="14"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="2" V01="3" V02="0"/>
<Triangle1 V00="3" V01="4" V02="0"/>
<Triangle1 V00="4" V01="3" V02="5"/>
<Triangle1 V00="6" V01="4" V02="5"/>
<Triangle1 V00="7" V01="8" V02="9"/>
<Triangle1 V00="7" V01="10" V02="8"/>
<Triangle1 V00="10" V01="11" V02="8"/>
<Triangle1 V00="10" V01="12" V02="11"/>
<Triangle1 V00="13" V01="14" V02="15"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="32" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="4" V02="5"/>
<Triangle1 V00="3" V01="6" V02="4"/>
<Triangle1 V00="7" V01="8" V02="9"/>
<Triangle1 V00="7" V01="10" V02="8"/>
<Triangle1 V00="11" V01="8" V02="10"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="12" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="48" Count="14"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="6" V01="7" V02="4"/>
<Triangle1 V00="4" V01="7" V02="8"/>
<Triangle1 V00="7" V01="9" V02="8"/>
<Triangle1 V00="10" V01="11" V02="12"/>
<Triangle1 V00="10" V01="13" V02="11"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="62" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="4" V01="7" V02="5"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="11" V02="9"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="12" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="78" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="4" V01="7" V02="5"/>
<Triangle1 V00="7" V01="8" V02="5"/>
<Triangle1 V00="7" V01="9" V02="8"/>
<Triangle1 V00="9" V01="10" V02="8"/>
<Triangle1 V00="9" V01="11" V02="10"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="12" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="94" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="4" V01="7" V02="5"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="11" V02="9"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="12" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="110" Count="14"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="3" V01="4" V02="1"/>
<Triangle1 V00="3" V01="5" V02="4"/>
<Triangle1 V00="6" V01="7" V02="8"/>
<Triangle1 V00="6" V01="9" V02="7"/>
<Triangle1 V00="9" V01="10" V02="7"/>
<Triangle1 V00="9" V01="11" V02="10"/>
<Triangle1 V00="11" V01="12" V02="10"/>
<Triangle1 V00="11" V01="13" V02="12"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="124" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="4" V01="7" V02="5"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="11" V02="9"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="12" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="140" Count="15"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="1" V02="3"/>
<Triangle1 V00="4" V01="3" V02="5"/>
<Triangle1 V00="6" V01="5" V02="3"/>
<Triangle1 V00="7" V01="6" V02="3"/>
<Triangle1 V00="7" V01="8" V02="6"/>
<Triangle1 V00="6" V01="9" V02="5"/>
<Triangle1 V00="5" V01="9" V02="10"/>
<Triangle1 V00="9" V01="11" V02="10"/>
<Triangle1 V00="10" V01="12" V02="5"/>
<Triangle1 V00="5" V01="12" V02="13"/>
<Triangle1 V00="4" V01="5" V02="13"/>
<Triangle1 V00="13" V01="14" V02="4"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="155" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="4" V01="7" V02="5"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="11" V02="9"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="12" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="171" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="3" V02="0"/>
<Triangle1 V00="0" V01="5" V02="4"/>
<Triangle1 V00="0" V01="6" V02="5"/>
<Triangle1 V00="4" V01="7" V02="3"/>
<Triangle1 V00="8" V01="7" V02="4"/>
<Triangle1 V00="8" V01="9" V02="7"/>
<Triangle1 V00="10" V01="9" V02="8"/>
<Triangle1 V00="8" V01="11" V02="10"/>
<Triangle1 V00="8" V01="12" V02="11"/>
<Triangle1 V00="10" V01="13" V02="9"/>
<Triangle1 V00="14" V01="13" V02="10"/>
<Triangle1 V00="14" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="187" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="2" V01="3" V02="0"/>
<Triangle1 V00="2" V01="4" V02="3"/>
<Triangle1 V00="0" V01="5" V02="1"/>
<Triangle1 V00="6" V01="5" V02="0"/>
<Triangle1 V00="6" V01="7" V02="5"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="11" V02="9"/>
<Triangle1 V00="12" V01="11" V02="8"/>
<Triangle1 V00="12" V01="13" V02="11"/>
<Triangle1 V00="14" V01="13" V02="12"/>
<Triangle1 V00="14" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="203" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="0" V01="4" V02="3"/>
<Triangle1 V00="0" V01="5" V02="4"/>
<Triangle1 V00="5" V01="6" V02="4"/>
<Triangle1 V00="5" V01="7" V02="6"/>
<Triangle1 V00="8" V01="6" V02="7"/>
<Triangle1 V00="8" V01="9" V02="6"/>
<Triangle1 V00="10" V01="11" V02="12"/>
<Triangle1 V00="12" V01="13" V02="10"/>
<Triangle1 V00="13" V01="14" V02="10"/>
<Triangle1 V00="15" V01="14" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="219" Count="14"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="4" V02="5"/>
<Triangle1 V00="6" V01="3" V02="5"/>
<Triangle1 V00="5" V01="7" V02="6"/>
<Triangle1 V00="7" V01="8" V02="6"/>
<Triangle1 V00="7" V01="9" V02="8"/>
<Triangle1 V00="10" V01="11" V02="12"/>
<Triangle1 V00="10" V01="13" V02="11"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="233" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="4" V01="7" V02="5"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="11" V02="9"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="12" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="249" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="4" V01="7" V02="5"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="11" V02="9"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="12" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="265" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="4" V01="7" V02="5"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="11" V02="9"/>
<Triangle1 V00="9" V01="11" V02="12"/>
<Triangle1 V00="9" V01="12" V02="13"/>
<Triangle1 V00="14" V01="15" V02="7"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="281" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="4" V02="5"/>
<Triangle1 V00="3" V01="6" V02="4"/>
<Triangle1 V00="6" V01="7" V02="4"/>
<Triangle1 V00="6" V01="8" V02="7"/>
<Triangle1 V00="9" V01="8" V02="6"/>
<Triangle1 V00="10" V01="9" V02="6"/>
<Triangle1 V00="10" V01="11" V02="9"/>
<Triangle1 V00="9" V01="12" V02="8"/>
<Triangle1 V00="13" V01="14" V02="15"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="297" Count="14"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="2" V01="3" V02="0"/>
<Triangle1 V00="3" V01="4" V02="0"/>
<Triangle1 V00="5" V01="6" V02="7"/>
<Triangle1 V00="8" V01="7" V02="6"/>
<Triangle1 V00="6" V01="9" V02="8"/>
<Triangle1 V00="9" V01="10" V02="8"/>
<Triangle1 V00="9" V01="11" V02="10"/>
<Triangle1 V00="10" V01="11" V02="12"/>
<Triangle1 V00="11" V01="13" V02="12"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="311" Count="14"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="2" V02="3"/>
<Triangle1 V00="3" V01="4" V02="0"/>
<Triangle1 V00="3" V01="5" V02="4"/>
<Triangle1 V00="6" V01="7" V02="8"/>
<Triangle1 V00="6" V01="9" V02="7"/>
<Triangle1 V00="7" V01="9" V02="10"/>
<Triangle1 V00="7" V01="10" V02="11"/>
<Triangle1 V00="11" V01="10" V02="12"/>
<Triangle1 V00="11" V01="12" V02="13"/>
<Triangle1 V00="12" V01="8" V02="13"/>
<Triangle1 V00="12" V01="6" V02="8"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="325" Count="8"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="3" V01="4" V02="1"/>
<Triangle1 V00="3" V01="5" V02="4"/>
<Triangle1 V00="6" V01="4" V02="5"/>
<Triangle1 V00="6" V01="7" V02="4"/>
<Triangle1 V00="0" V01="7" V02="6"/>
<Triangle1 V00="0" V01="2" V02="7"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,80 @@
<DisplayList Version="0">
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="4" V01="7" V02="5"/>
<Triangle1 V00="7" V01="8" V02="5"/>
<Triangle1 V00="7" V01="9" V02="8"/>
<Triangle1 V00="9" V01="10" V02="8"/>
<Triangle1 V00="9" V01="11" V02="10"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="12" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="3" V02="0"/>
<Triangle1 V00="4" V01="5" V02="3"/>
<Triangle1 V00="6" V01="5" V02="4"/>
<Triangle1 V00="6" V01="7" V02="5"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="11" V02="9"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="12" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="32" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="3" V01="4" V02="1"/>
<Triangle1 V00="3" V01="5" V02="4"/>
<Triangle1 V00="6" V01="4" V02="5"/>
<Triangle1 V00="6" V01="7" V02="4"/>
<Triangle1 V00="8" V01="7" V02="6"/>
<Triangle1 V00="8" V01="9" V02="7"/>
<Triangle1 V00="10" V01="11" V02="12"/>
<Triangle1 V00="10" V01="12" V02="13"/>
<Triangle1 V00="13" V01="12" V02="14"/>
<Triangle1 V00="13" V01="14" V02="15"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="48" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="2" V02="3"/>
<Triangle1 V00="2" V01="4" V02="3"/>
<Triangle1 V00="2" V01="5" V02="4"/>
<Triangle1 V00="6" V01="7" V02="8"/>
<Triangle1 V00="8" V01="9" V02="6"/>
<Triangle1 V00="9" V01="10" V02="6"/>
<Triangle1 V00="9" V01="11" V02="10"/>
<Triangle1 V00="11" V01="12" V02="10"/>
<Triangle1 V00="10" V01="12" V02="13"/>
<Triangle1 V00="12" V01="14" V02="13"/>
<Triangle1 V00="15" V01="13" V02="14"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="64" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="1" V02="0"/>
<Triangle1 V00="4" V01="3" V02="0"/>
<Triangle1 V00="4" V01="0" V02="5"/>
<Triangle1 V00="6" V01="4" V02="5"/>
<Triangle1 V00="5" V01="7" V02="6"/>
<Triangle1 V00="8" V01="6" V02="7"/>
<Triangle1 V00="9" V01="8" V02="7"/>
<Triangle1 V00="7" V01="10" V02="9"/>
<Triangle1 V00="11" V01="12" V02="13"/>
<Triangle1 V00="14" V01="11" V02="13"/>
<Triangle1 V00="15" V01="14" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="80" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="2" V02="1"/>
<Triangle1 V00="4" V01="3" V02="1"/>
<Triangle1 V00="4" V01="1" V02="5"/>
<Triangle1 V00="6" V01="4" V02="5"/>
<Triangle1 V00="6" V01="5" V02="7"/>
<Triangle1 V00="8" V01="6" V02="7"/>
<Triangle1 V00="7" V01="9" V02="8"/>
<Triangle1 V00="10" V01="8" V02="9"/>
<Triangle1 V00="9" V01="11" V02="10"/>
<Triangle1 V00="11" V01="12" V02="10"/>
<Triangle1 V00="10" V01="12" V02="13"/>
<Triangle1 V00="12" V01="14" V02="13"/>
<Triangle1 V00="14" V01="15" V02="13"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,259 @@
<DisplayList Version="0">
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="4" V02="5"/>
<Triangle1 V00="6" V01="7" V02="8"/>
<Triangle1 V00="6" V01="9" V02="7"/>
<Triangle1 V00="10" V01="11" V02="12"/>
<Triangle1 V00="10" V01="13" V02="11"/>
<Triangle1 V00="13" V01="10" V02="14"/>
<Triangle1 V00="15" V01="14" V02="10"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="0" V02="2"/>
<Triangle1 V00="4" V01="3" V02="2"/>
<Triangle1 V00="4" V01="2" V02="5"/>
<Triangle1 V00="6" V01="4" V02="5"/>
<Triangle1 V00="5" V01="7" V02="6"/>
<Triangle1 V00="5" V01="8" V02="7"/>
<Triangle1 V00="8" V01="5" V02="9"/>
<Triangle1 V00="5" V01="10" V02="9"/>
<Triangle1 V00="5" V01="11" V02="10"/>
<Triangle1 V00="12" V01="8" V02="9"/>
<Triangle1 V00="12" V01="9" V02="13"/>
<Triangle1 V00="14" V01="12" V02="13"/>
<Triangle1 V00="13" V01="15" V02="14"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="32" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="2" V01="3" V02="0"/>
<Triangle1 V00="3" V01="2" V02="4"/>
<Triangle1 V00="4" V01="2" V02="5"/>
<Triangle1 V00="5" V01="2" V02="6"/>
<Triangle1 V00="2" V01="7" V02="6"/>
<Triangle1 V00="8" V01="6" V02="7"/>
<Triangle1 V00="7" V01="9" V02="8"/>
<Triangle1 V00="9" V01="10" V02="8"/>
<Triangle1 V00="11" V01="5" V02="6"/>
<Triangle1 V00="11" V01="6" V02="12"/>
<Triangle1 V00="13" V01="14" V02="15"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="48" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="1" V02="0"/>
<Triangle1 V00="3" V01="0" V02="4"/>
<Triangle1 V00="4" V01="5" V02="3"/>
<Triangle1 V00="4" V01="6" V02="5"/>
<Triangle1 V00="3" V01="5" V02="7"/>
<Triangle1 V00="3" V01="7" V02="8"/>
<Triangle1 V00="8" V01="9" V02="3"/>
<Triangle1 V00="10" V01="9" V02="8"/>
<Triangle1 V00="10" V01="8" V02="11"/>
<Triangle1 V00="12" V01="9" V02="10"/>
<Triangle1 V00="12" V01="13" V02="9"/>
<Triangle1 V00="12" V01="14" V02="13"/>
<Triangle1 V00="12" V01="15" V02="14"/>
<Triangle1 V00="14" V01="1" V02="13"/>
<Triangle1 V00="14" V01="2" V02="1"/>
<Triangle1 V00="13" V01="1" V02="3"/>
<Triangle1 V00="13" V01="3" V02="9"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="64" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="0" V02="2"/>
<Triangle1 V00="3" V01="2" V02="4"/>
<Triangle1 V00="3" V01="4" V02="5"/>
<Triangle1 V00="6" V01="3" V02="5"/>
<Triangle1 V00="5" V01="7" V02="6"/>
<Triangle1 V00="7" V01="8" V02="6"/>
<Triangle1 V00="9" V01="10" V02="11"/>
<Triangle1 V00="9" V01="12" V02="10"/>
<Triangle1 V00="13" V01="10" V02="12"/>
<Triangle1 V00="13" V01="12" V02="14"/>
<Triangle1 V00="15" V01="13" V02="14"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="80" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="4" V02="5"/>
<Triangle1 V00="3" V01="6" V02="4"/>
<Triangle1 V00="7" V01="6" V02="3"/>
<Triangle1 V00="7" V01="8" V02="6"/>
<Triangle1 V00="9" V01="8" V02="7"/>
<Triangle1 V00="9" V01="10" V02="8"/>
<Triangle1 V00="11" V01="10" V02="9"/>
<Triangle1 V00="11" V01="12" V02="10"/>
<Triangle1 V00="13" V01="12" V02="11"/>
<Triangle1 V00="13" V01="11" V02="14"/>
<Triangle1 V00="15" V01="13" V02="14"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="96" Count="14"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="2" V01="3" V02="0"/>
<Triangle1 V00="3" V01="4" V02="0"/>
<Triangle1 V00="4" V01="5" V02="0"/>
<Triangle1 V00="6" V01="7" V02="8"/>
<Triangle1 V00="6" V01="9" V02="7"/>
<Triangle1 V00="10" V01="11" V02="12"/>
<Triangle1 V00="10" V01="13" V02="11"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="110" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="3" V02="0"/>
<Triangle1 V00="4" V01="5" V02="3"/>
<Triangle1 V00="6" V01="5" V02="4"/>
<Triangle1 V00="6" V01="7" V02="5"/>
<Triangle1 V00="6" V01="8" V02="7"/>
<Triangle1 V00="6" V01="9" V02="8"/>
<Triangle1 V00="9" V01="10" V02="8"/>
<Triangle1 V00="9" V01="11" V02="10"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="15" V01="12" V02="14"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="126" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="2" V02="3"/>
<Triangle1 V00="4" V01="0" V02="3"/>
<Triangle1 V00="4" V01="3" V02="5"/>
<Triangle1 V00="6" V01="4" V02="5"/>
<Triangle1 V00="7" V01="6" V02="5"/>
<Triangle1 V00="8" V01="6" V02="7"/>
<Triangle1 V00="8" V01="7" V02="9"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="10" V02="11"/>
<Triangle1 V00="11" V01="10" V02="12"/>
<Triangle1 V00="13" V01="11" V02="12"/>
<Triangle1 V00="13" V01="12" V02="14"/>
<Triangle1 V00="15" V01="13" V02="14"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="142" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="1" V01="0" V02="3"/>
<Triangle1 V00="1" V01="3" V02="4"/>
<Triangle1 V00="4" V01="3" V02="5"/>
<Triangle1 V00="4" V01="6" V02="1"/>
<Triangle1 V00="6" V01="7" V02="1"/>
<Triangle1 V00="6" V01="8" V02="7"/>
<Triangle1 V00="8" V01="9" V02="7"/>
<Triangle1 V00="7" V01="9" V02="10"/>
<Triangle1 V00="9" V01="11" V02="10"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="12" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="158" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="7" V01="5" V02="4"/>
<Triangle1 V00="7" V01="4" V02="8"/>
<Triangle1 V00="9" V01="7" V02="8"/>
<Triangle1 V00="9" V01="10" V02="7"/>
<Triangle1 V00="10" V01="9" V02="11"/>
<Triangle1 V00="12" V01="10" V02="11"/>
<Triangle1 V00="13" V01="12" V02="11"/>
<Triangle1 V00="13" V01="11" V02="14"/>
<Triangle1 V00="14" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="174" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="4" V02="5"/>
<Triangle1 V00="6" V01="3" V02="5"/>
<Triangle1 V00="7" V01="6" V02="5"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="11" V01="10" V02="9"/>
<Triangle1 V00="11" V01="12" V02="10"/>
<Triangle1 V00="13" V01="12" V02="11"/>
<Triangle1 V00="11" V01="14" V02="13"/>
<Triangle1 V00="14" V01="15" V02="13"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="190" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="3" V02="0"/>
<Triangle1 V00="4" V01="5" V02="3"/>
<Triangle1 V00="4" V01="6" V02="5"/>
<Triangle1 V00="4" V01="7" V02="6"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="11" V02="9"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="13" V01="12" V02="15"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="206" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="1" V01="3" V02="2"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="7" V01="5" V02="4"/>
<Triangle1 V00="7" V01="8" V02="5"/>
<Triangle1 V00="9" V01="8" V02="7"/>
<Triangle1 V00="9" V01="7" V02="10"/>
<Triangle1 V00="11" V01="9" V02="10"/>
<Triangle1 V00="12" V01="11" V02="10"/>
<Triangle1 V00="13" V01="14" V02="15"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="222" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="1" V02="0"/>
<Triangle1 V00="3" V01="4" V02="1"/>
<Triangle1 V00="5" V01="4" V02="3"/>
<Triangle1 V00="5" V01="3" V02="6"/>
<Triangle1 V00="7" V01="5" V02="6"/>
<Triangle1 V00="7" V01="6" V02="8"/>
<Triangle1 V00="9" V01="7" V02="8"/>
<Triangle1 V00="9" V01="8" V02="10"/>
<Triangle1 V00="11" V01="12" V02="13"/>
<Triangle1 V00="11" V01="13" V02="14"/>
<Triangle1 V00="11" V01="14" V02="15"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="238" Count="14"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="2" V02="3"/>
<Triangle1 V00="4" V01="0" V02="3"/>
<Triangle1 V00="4" V01="3" V02="5"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="6" V01="7" V02="4"/>
<Triangle1 V00="6" V01="8" V02="7"/>
<Triangle1 V00="6" V01="9" V02="8"/>
<Triangle1 V00="10" V01="11" V02="12"/>
<Triangle1 V00="10" V01="13" V02="11"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="252" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="0" V02="2"/>
<Triangle1 V00="4" V01="3" V02="2"/>
<Triangle1 V00="2" V01="5" V02="4"/>
<Triangle1 V00="6" V01="7" V02="8"/>
<Triangle1 V00="9" V01="8" V02="7"/>
<Triangle1 V00="9" V01="7" V02="10"/>
<Triangle1 V00="7" V01="11" V02="10"/>
<Triangle1 V00="12" V01="13" V02="14"/>
<Triangle1 V00="15" V01="12" V02="14"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="268" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="1" V01="3" V02="2"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="6" V01="7" V02="4"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="10" V02="11"/>
<Triangle1 V00="8" V01="11" V02="12"/>
<Triangle1 V00="13" V01="8" V02="12"/>
<Triangle1 V00="12" V01="14" V02="13"/>
<Triangle1 V00="15" V01="13" V02="14"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="284" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="4" V02="5"/>
<Triangle1 V00="5" V01="6" V02="3"/>
<Triangle1 V00="6" V01="7" V02="3"/>
<Triangle1 V00="8" V01="3" V02="7"/>
<Triangle1 V00="9" V01="8" V02="7"/>
<Triangle1 V00="7" V01="10" V02="9"/>
<Triangle1 V00="10" V01="11" V02="9"/>
<Triangle1 V00="12" V01="11" V02="10"/>
<Triangle1 V00="12" V01="10" V02="13"/>
<Triangle1 V00="14" V01="12" V02="13"/>
<Triangle1 V00="14" V01="13" V02="15"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="300" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="2" V02="3"/>
<Triangle1 V00="3" V01="4" V02="0"/>
<Triangle1 V00="3" V01="5" V02="4"/>
<Triangle1 V00="6" V01="7" V02="8"/>
<Triangle1 V00="6" V01="9" V02="7"/>
<Triangle1 V00="10" V01="9" V02="6"/>
<Triangle1 V00="11" V01="10" V02="6"/>
<Triangle1 V00="11" V01="6" V02="12"/>
<Triangle1 V00="13" V01="12" V02="6"/>
<Triangle1 V00="13" V01="6" V02="8"/>
<Triangle1 V00="10" V01="14" V02="9"/>
<Triangle1 V00="9" V01="14" V02="15"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="316" Count="5"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="0" V02="2"/>
<Triangle1 V00="3" V01="4" V02="0"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,118 @@
<DisplayList Version="0">
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="0" Count="15"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="3" V02="0"/>
<Triangle1 V00="4" V01="5" V02="3"/>
<Triangle1 V00="5" V01="6" V02="3"/>
<Triangle1 V00="5" V01="7" V02="6"/>
<Triangle1 V00="7" V01="8" V02="6"/>
<Triangle1 V00="7" V01="9" V02="8"/>
<Triangle1 V00="9" V01="10" V02="8"/>
<Triangle1 V00="9" V01="11" V02="10"/>
<Triangle1 V00="8" V01="10" V02="12"/>
<Triangle1 V00="8" V01="12" V02="13"/>
<Triangle1 V00="6" V01="8" V02="13"/>
<Triangle1 V00="6" V01="13" V02="14"/>
<Triangle1 V00="1" V01="6" V02="14"/>
<Triangle1 V00="1" V01="3" V02="6"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="15" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="3" V01="4" V02="1"/>
<Triangle1 V00="3" V01="5" V02="4"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="4" V01="6" V02="7"/>
<Triangle1 V00="7" V01="6" V02="8"/>
<Triangle1 V00="7" V01="8" V02="9"/>
<Triangle1 V00="9" V01="8" V02="10"/>
<Triangle1 V00="9" V01="10" V02="11"/>
<Triangle1 V00="10" V01="12" V02="11"/>
<Triangle1 V00="13" V01="14" V02="15"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="31" Count="14"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="1" V02="0"/>
<Triangle1 V00="3" V01="4" V02="1"/>
<Triangle1 V00="4" V01="5" V02="1"/>
<Triangle1 V00="4" V01="6" V02="5"/>
<Triangle1 V00="6" V01="7" V02="5"/>
<Triangle1 V00="6" V01="8" V02="7"/>
<Triangle1 V00="7" V01="8" V02="9"/>
<Triangle1 V00="7" V01="9" V02="10"/>
<Triangle1 V00="7" V01="10" V02="11"/>
<Triangle1 V00="7" V01="11" V02="12"/>
<Triangle1 V00="5" V01="7" V02="12"/>
<Triangle1 V00="5" V01="12" V02="13"/>
<Triangle1 V00="2" V01="5" V02="13"/>
<Triangle1 V00="2" V01="1" V02="5"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="45" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="3" V02="0"/>
<Triangle1 V00="4" V01="5" V02="3"/>
<Triangle1 V00="3" V01="5" V02="6"/>
<Triangle1 V00="3" V01="6" V02="7"/>
<Triangle1 V00="7" V01="1" V02="3"/>
<Triangle1 V00="7" V01="8" V02="1"/>
<Triangle1 V00="9" V01="10" V02="11"/>
<Triangle1 V00="12" V01="11" V02="10"/>
<Triangle1 V00="12" V01="10" V02="13"/>
<Triangle1 V00="14" V01="12" V02="13"/>
<Triangle1 V00="14" V01="13" V02="15"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="61" Count="14"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="2" V02="3"/>
<Triangle1 V00="4" V01="0" V02="3"/>
<Triangle1 V00="4" V01="5" V02="0"/>
<Triangle1 V00="6" V01="5" V02="4"/>
<Triangle1 V00="6" V01="7" V02="5"/>
<Triangle1 V00="8" V01="9" V02="10"/>
<Triangle1 V00="8" V01="11" V02="9"/>
<Triangle1 V00="12" V01="11" V02="8"/>
<Triangle1 V00="12" V01="13" V02="11"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="75" Count="15"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="3" V02="0"/>
<Triangle1 V00="4" V01="5" V02="3"/>
<Triangle1 V00="5" V01="6" V02="3"/>
<Triangle1 V00="5" V01="7" V02="6"/>
<Triangle1 V00="3" V01="6" V02="8"/>
<Triangle1 V00="3" V01="8" V02="1"/>
<Triangle1 V00="9" V01="10" V02="11"/>
<Triangle1 V00="9" V01="12" V02="10"/>
<Triangle1 V00="13" V01="12" V02="9"/>
<Triangle1 V00="13" V01="14" V02="12"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="90" Count="15"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="3" V01="4" V02="1"/>
<Triangle1 V00="3" V01="5" V02="4"/>
<Triangle1 V00="4" V01="5" V02="6"/>
<Triangle1 V00="4" V01="6" V02="7"/>
<Triangle1 V00="7" V01="6" V02="8"/>
<Triangle1 V00="9" V01="10" V02="11"/>
<Triangle1 V00="9" V01="12" V02="10"/>
<Triangle1 V00="13" V01="12" V02="9"/>
<Triangle1 V00="13" V01="14" V02="12"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="105" Count="16"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="0" V01="3" V02="1"/>
<Triangle1 V00="4" V01="3" V02="0"/>
<Triangle1 V00="4" V01="5" V02="3"/>
<Triangle1 V00="3" V01="5" V02="6"/>
<Triangle1 V00="7" V01="3" V02="6"/>
<Triangle1 V00="7" V01="6" V02="8"/>
<Triangle1 V00="7" V01="8" V02="9"/>
<Triangle1 V00="1" V01="3" V02="7"/>
<Triangle1 V00="10" V01="11" V02="12"/>
<Triangle1 V00="13" V01="10" V02="12"/>
<Triangle1 V00="13" V01="12" V02="14"/>
<Triangle1 V00="15" V01="13" V02="14"/>
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="121" Count="5"/>
<Triangle1 V00="0" V01="1" V02="2"/>
<Triangle1 V00="3" V01="1" V02="0"/>
<Triangle1 V00="3" V01="4" V02="1"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,335 @@
<Vertex Version="0">
<Vtx X="0" Y="-5" Z="11" S="391" T="-468" R="0" G="10" B="127" A="255"/>
<Vtx X="-1" Y="-6" Z="13" S="391" T="-447" R="162" G="39" B="76" A="255"/>
<Vtx X="0" Y="-6" Z="13" S="408" T="-447" R="94" G="39" B="76" A="255"/>
<Vtx X="-3" Y="2" Z="-27" S="120" T="-327" R="81" G="50" B="84" A="255"/>
<Vtx X="1" Y="0" Z="-21" S="171" T="-251" R="185" G="93" B="49" A="255"/>
<Vtx X="2" Y="2" Z="-27" S="181" T="-327" R="175" G="50" B="84" A="255"/>
<Vtx X="-2" Y="0" Z="-21" S="130" T="-251" R="71" G="93" B="49" A="255"/>
<Vtx X="2" Y="0" Z="-20" S="185" T="-228" R="188" G="87" B="63" A="255"/>
<Vtx X="-3" Y="0" Z="-20" S="116" T="-228" R="68" G="87" B="63" A="255"/>
<Vtx X="-5" Y="-1" Z="-17" S="83" T="-191" R="88" G="79" B="46" A="255"/>
<Vtx X="5" Y="-1" Z="-17" S="218" T="-191" R="168" G="79" B="46" A="255"/>
<Vtx X="-6" Y="-1" Z="-11" S="70" T="-103" R="92" G="87" B="7" A="255"/>
<Vtx X="6" Y="-1" Z="-11" S="231" T="-103" R="164" G="87" B="7" A="255"/>
<Vtx X="0" Y="-1" Z="-1" S="151" T="35" R="0" G="115" B="202" A="255"/>
<Vtx X="-1" Y="-1" Z="0" S="139" T="48" R="202" G="115" B="0" A="255"/>
<Vtx X="-6" Y="-1" Z="3" S="70" T="94" R="75" G="78" B="190" A="255"/>
<Vtx X="0" Y="-1" Z="1" S="151" T="60" R="0" G="115" B="54" A="255"/>
<Vtx X="-1" Y="-1" Z="0" S="139" T="48" R="202" G="115" B="0" A="255"/>
<Vtx X="-6" Y="-1" Z="3" S="70" T="94" R="75" G="78" B="190" A="255"/>
<Vtx X="6" Y="-1" Z="3" S="231" T="94" R="181" G="78" B="190" A="255"/>
<Vtx X="1" Y="-1" Z="0" S="162" T="48" R="54" G="115" B="0" A="255"/>
<Vtx X="6" Y="-1" Z="-11" S="231" T="-103" R="164" G="87" B="7" A="255"/>
<Vtx X="0" Y="-1" Z="-1" S="151" T="35" R="0" G="115" B="202" A="255"/>
<Vtx X="-1" Y="-6" Z="13" S="65" T="-396" R="162" G="39" B="76" A="255"/>
<Vtx X="0" Y="-8" Z="12" S="48" T="-424" R="114" G="12" B="55" A="255"/>
<Vtx X="0" Y="-6" Z="13" S="49" T="-396" R="94" G="39" B="76" A="255"/>
<Vtx X="-1" Y="-8" Z="12" S="65" T="-424" R="142" G="12" B="55" A="255"/>
<Vtx X="0" Y="-12" Z="14" S="49" T="-483" R="83" G="232" B="94" A="255"/>
<Vtx X="-1" Y="-12" Z="14" S="65" T="-483" R="173" G="232" B="94" A="255"/>
<Vtx X="0" Y="2" Z="12" S="-34" T="-437" R="0" G="21" B="125" A="255"/>
<Vtx X="3" Y="3" Z="11" S="-55" T="-468" R="0" G="21" B="125" A="255"/>
<Vtx X="0" Y="3" Z="11" S="-55" T="-437" R="0" G="21" B="125" A="255"/>
<Vtx X="0" Y="2" Z="12" S="-34" T="-437" R="0" G="21" B="125" A="255"/>
<Vtx X="3" Y="2" Z="12" S="-34" T="-468" R="0" G="21" B="125" A="255"/>
<Vtx X="3" Y="3" Z="11" S="-55" T="-468" R="0" G="21" B="125" A="255"/>
<Vtx X="4" Y="2" Z="12" S="20" T="-447" R="0" G="21" B="125" A="255"/>
<Vtx X="6" Y="3" Z="11" S="-1" T="-478" R="0" G="21" B="125" A="255"/>
<Vtx X="4" Y="3" Z="11" S="-1" T="-447" R="0" G="21" B="125" A="255"/>
<Vtx X="6" Y="2" Z="12" S="20" T="-478" R="0" G="21" B="125" A="255"/>
<Vtx X="-1" Y="-12" Z="14" S="-372" T="-427" R="173" G="232" B="94" A="255"/>
<Vtx X="0" Y="-13" Z="13" S="-389" T="-438" R="84" G="161" B="250" A="255"/>
<Vtx X="0" Y="-12" Z="14" S="-389" T="-427" R="83" G="232" B="94" A="255"/>
<Vtx X="-1" Y="-13" Z="13" S="-372" T="-438" R="172" G="161" B="250" A="255"/>
<Vtx X="0" Y="-11" Z="11" S="-389" T="-468" R="0" G="146" B="64" A="255"/>
<Vtx X="-1" Y="2" Z="12" S="221" T="-475" R="0" G="21" B="125" A="255"/>
<Vtx X="-3" Y="3" Z="11" S="200" T="-444" R="0" G="21" B="125" A="255"/>
<Vtx X="-3" Y="2" Z="12" S="221" T="-444" R="0" G="21" B="125" A="255"/>
<Vtx X="-1" Y="3" Z="11" S="200" T="-476" R="0" G="21" B="125" A="255"/>
<Vtx X="-4" Y="3" Z="11" S="186" T="-444" R="0" G="21" B="125" A="255"/>
<Vtx X="-6" Y="2" Z="12" S="165" T="-476" R="0" G="21" B="125" A="255"/>
<Vtx X="-4" Y="2" Z="12" S="165" T="-444" R="0" G="21" B="125" A="255"/>
<Vtx X="-6" Y="3" Z="11" S="186" T="-475" R="0" G="21" B="125" A="255"/>
<Vtx X="-1" Y="-8" Z="12" S="212" T="-395" R="142" G="12" B="55" A="255"/>
<Vtx X="-1" Y="-6" Z="13" S="221" T="-422" R="162" G="39" B="76" A="255"/>
<Vtx X="0" Y="-5" Z="11" S="206" T="-444" R="0" G="10" B="127" A="255"/>
<Vtx X="0" Y="-11" Z="11" S="186" T="-357" R="0" G="146" B="64" A="255"/>
<Vtx X="-1" Y="-12" Z="14" S="221" T="-333" R="173" G="232" B="94" A="255"/>
<Vtx X="-1" Y="-13" Z="13" S="207" T="-327" R="172" G="161" B="250" A="255"/>
<Vtx X="-1" Y="27" Z="0" S="20" T="-494" R="169" G="61" B="70" A="255"/>
<Vtx X="-5" Y="27" Z="0" S="28" T="-447" R="183" G="183" B="73" A="255"/>
<Vtx X="-1" Y="27" Z="0" S="28" T="-494" R="169" G="195" B="70" A="255"/>
<Vtx X="-5" Y="27" Z="0" S="20" T="-447" R="183" G="73" B="73" A="255"/>
<Vtx X="1" Y="4" Z="0" S="427" T="389" R="87" G="195" B="70" A="255"/>
<Vtx X="8" Y="4" Z="-1" S="415" T="495" R="85" G="163" B="239" A="255"/>
<Vtx X="8" Y="4" Z="0" S="427" T="495" R="73" G="183" B="73" A="255"/>
<Vtx X="0" Y="4" Z="-1" S="415" T="377" R="0" G="155" B="179" A="255"/>
<Vtx X="-1" Y="5" Z="0" S="-343" T="-272" R="169" G="61" B="70" A="255"/>
<Vtx X="0" Y="19" Z="-1" S="-330" T="-71" R="0" G="130" B="15" A="255"/>
<Vtx X="0" Y="5" Z="-1" S="-330" T="-272" R="0" G="125" B="236" A="255"/>
<Vtx X="-1" Y="19" Z="0" S="-343" T="-71" R="169" G="195" B="70" A="255"/>
<Vtx X="0" Y="19" Z="-1" S="-132" T="-270" R="0" G="130" B="15" A="255"/>
<Vtx X="1" Y="5" Z="0" S="-144" T="-69" R="87" G="61" B="70" A="255"/>
<Vtx X="0" Y="5" Z="-1" S="-132" T="-69" R="0" G="125" B="236" A="255"/>
<Vtx X="1" Y="19" Z="0" S="-144" T="-270" R="87" G="195" B="70" A="255"/>
<Vtx X="0" Y="27" Z="-1" S="-431" T="-469" R="0" G="115" B="202" A="255"/>
<Vtx X="1" Y="28" Z="0" S="-441" T="-456" R="68" G="149" B="0" A="255"/>
<Vtx X="1" Y="27" Z="0" S="-431" T="-456" R="87" G="61" B="70" A="255"/>
<Vtx X="0" Y="28" Z="-1" S="-441" T="-469" R="0" G="149" B="188" A="255"/>
<Vtx X="-1" Y="28" Z="0" S="-431" T="-469" R="188" G="149" B="0" A="255"/>
<Vtx X="0" Y="27" Z="-1" S="-421" T="-456" R="0" G="115" B="202" A="255"/>
<Vtx X="-1" Y="27" Z="0" S="-421" T="-469" R="169" G="61" B="70" A="255"/>
<Vtx X="0" Y="28" Z="-1" S="-431" T="-456" R="0" G="149" B="188" A="255"/>
<Vtx X="0" Y="29" Z="0" S="-5" T="-177" R="54" G="115" B="0" A="255"/>
<Vtx X="0" Y="31" Z="0" S="-2" T="-148" R="0" G="0" B="127" A="255"/>
<Vtx X="0" Y="29" Z="0" S="-2" T="-178" R="0" G="115" B="54" A="255"/>
<Vtx X="0" Y="31" Z="0" S="-5" T="-148" R="97" G="206" B="66" A="255"/>
<Vtx X="0" Y="34" Z="0" S="-2" T="-105" R="0" G="0" B="127" A="255"/>
<Vtx X="0" Y="34" Z="0" S="-5" T="-104" R="98" G="50" B="64" A="255"/>
<Vtx X="0" Y="35" Z="0" S="-2" T="-96" R="0" G="73" B="104" A="255"/>
<Vtx X="0" Y="35" Z="0" S="-5" T="-96" R="104" G="73" B="0" A="255"/>
<Vtx X="2" Y="28" Z="0" S="35" T="-483" R="107" G="188" B="0" A="255"/>
<Vtx X="0" Y="29" Z="-3" S="48" T="-447" R="0" G="73" B="152" A="255"/>
<Vtx X="2" Y="29" Z="0" S="48" T="-483" R="104" G="73" B="0" A="255"/>
<Vtx X="0" Y="28" Z="-3" S="35" T="-447" R="0" G="188" B="149" A="255"/>
<Vtx X="2" Y="28" Z="0" S="-330" T="-475" R="107" G="188" B="0" A="255"/>
<Vtx X="0" Y="29" Z="3" S="-344" T="-439" R="0" G="73" B="104" A="255"/>
<Vtx X="0" Y="28" Z="3" S="-330" T="-438" R="0" G="188" B="107" A="255"/>
<Vtx X="2" Y="29" Z="0" S="-344" T="-475" R="104" G="73" B="0" A="255"/>
<Vtx X="-3" Y="29" Z="0" S="200" T="-444" R="152" G="73" B="0" A="255"/>
<Vtx X="0" Y="28" Z="-3" S="186" T="-481" R="0" G="188" B="149" A="255"/>
<Vtx X="-3" Y="28" Z="0" S="186" T="-444" R="149" G="188" B="0" A="255"/>
<Vtx X="0" Y="29" Z="-3" S="200" T="-481" R="0" G="73" B="152" A="255"/>
<Vtx X="0" Y="29" Z="3" S="165" T="-445" R="0" G="73" B="104" A="255"/>
<Vtx X="-3" Y="28" Z="0" S="152" T="-481" R="149" G="188" B="0" A="255"/>
<Vtx X="0" Y="28" Z="3" S="152" T="-444" R="0" G="188" B="107" A="255"/>
<Vtx X="-3" Y="29" Z="0" S="165" T="-481" R="152" G="73" B="0" A="255"/>
<Vtx X="0" Y="29" Z="0" S="-2" T="-14" R="0" G="115" B="54" A="255"/>
<Vtx X="-1" Y="31" Z="0" S="-5" T="-43" R="129" G="0" B="0" A="255"/>
<Vtx X="-1" Y="29" Z="0" S="-5" T="-14" R="202" G="115" B="0" A="255"/>
<Vtx X="0" Y="31" Z="0" S="-2" T="-43" R="0" G="0" B="127" A="255"/>
<Vtx X="0" Y="31" Z="0" S="-2" T="-43" R="0" G="0" B="127" A="255"/>
<Vtx X="-1" Y="34" Z="0" S="-5" T="-87" R="129" G="0" B="0" A="255"/>
<Vtx X="-1" Y="31" Z="0" S="-5" T="-43" R="129" G="0" B="0" A="255"/>
<Vtx X="0" Y="34" Z="0" S="-2" T="-87" R="0" G="0" B="127" A="255"/>
<Vtx X="-1" Y="35" Z="0" S="-5" T="-96" R="152" G="73" B="0" A="255"/>
<Vtx X="0" Y="35" Z="0" S="-2" T="-96" R="0" G="73" B="104" A="255"/>
<Vtx X="-1" Y="29" Z="0" S="-2" T="68" R="202" G="115" B="0" A="255"/>
<Vtx X="0" Y="31" Z="0" S="-5" T="39" R="187" G="201" B="164" A="255"/>
<Vtx X="0" Y="29" Z="0" S="-5" T="68" R="0" G="115" B="202" A="255"/>
<Vtx X="-1" Y="31" Z="0" S="-2" T="39" R="129" G="0" B="0" A="255"/>
<Vtx X="0" Y="34" Z="0" S="-5" T="-5" R="189" G="55" B="163" A="255"/>
<Vtx X="-1" Y="34" Z="0" S="-2" T="-5" R="129" G="0" B="0" A="255"/>
<Vtx X="0" Y="35" Z="0" S="-5" T="-14" R="0" G="73" B="152" A="255"/>
<Vtx X="-1" Y="35" Z="0" S="-2" T="-14" R="152" G="73" B="0" A="255"/>
<Vtx X="0" Y="29" Z="0" S="-1" T="-221" R="0" G="115" B="202" A="255"/>
<Vtx X="0" Y="31" Z="0" S="-4" T="-251" R="97" G="206" B="66" A="255"/>
<Vtx X="0" Y="29" Z="0" S="-4" T="-222" R="54" G="115" B="0" A="255"/>
<Vtx X="0" Y="31" Z="0" S="-1" T="-251" R="187" G="201" B="164" A="255"/>
<Vtx X="-1" Y="35" Z="0" S="-350" T="-271" R="152" G="73" B="0" A="255"/>
<Vtx X="0" Y="35" Z="0" S="-345" T="-266" R="104" G="73" B="0" A="255"/>
<Vtx X="0" Y="35" Z="0" S="-345" T="-271" R="0" G="73" B="152" A="255"/>
<Vtx X="0" Y="35" Z="0" S="-350" T="-266" R="0" G="73" B="104" A="255"/>
<Vtx X="0" Y="34" Z="0" S="-1" T="-251" R="189" G="55" B="163" A="255"/>
<Vtx X="0" Y="35" Z="0" S="-4" T="-260" R="104" G="73" B="0" A="255"/>
<Vtx X="0" Y="34" Z="0" S="-4" T="-251" R="98" G="50" B="64" A="255"/>
<Vtx X="0" Y="35" Z="0" S="-1" T="-260" R="0" G="73" B="152" A="255"/>
<Vtx X="1" Y="19" Z="0" S="434" T="-341" R="87" G="195" B="70" A="255"/>
<Vtx X="8" Y="19" Z="-1" S="445" T="-447" R="105" G="193" B="33" A="255"/>
<Vtx X="8" Y="19" Z="0" S="434" T="-447" R="73" G="183" B="74" A="255"/>
<Vtx X="0" Y="19" Z="-1" S="445" T="-329" R="0" G="130" B="15" A="255"/>
<Vtx X="-1" Y="21" Z="0" S="391" T="-393" R="169" G="61" B="69" A="255"/>
<Vtx X="-9" Y="21" Z="-1" S="379" T="-287" R="166" G="90" B="0" A="255"/>
<Vtx X="-9" Y="21" Z="0" S="391" T="-287" R="183" G="74" B="73" A="255"/>
<Vtx X="0" Y="21" Z="-1" S="379" T="-405" R="0" G="115" B="202" A="255"/>
<Vtx X="-9" Y="21" Z="-1" S="371" T="-287" R="166" G="90" B="0" A="255"/>
<Vtx X="0" Y="21" Z="-1" S="371" T="-405" R="0" G="127" B="0" A="255"/>
<Vtx X="8" Y="21" Z="-1" S="379" T="-524" R="90" G="90" B="0" A="255"/>
<Vtx X="1" Y="21" Z="0" S="391" T="-418" R="87" G="61" B="69" A="255"/>
<Vtx X="8" Y="21" Z="0" S="391" T="-524" R="73" G="74" B="73" A="255"/>
<Vtx X="8" Y="21" Z="-1" S="371" T="-524" R="90" G="90" B="0" A="255"/>
<Vtx X="4" Y="21" Z="-2" S="363" T="-464" R="91" G="85" B="231" A="255"/>
<Vtx X="8" Y="21" Z="-2" S="363" T="-524" R="73" G="73" B="183" A="255"/>
<Vtx X="0" Y="21" Z="-2" S="363" T="-405" R="0" G="97" B="82" A="255"/>
<Vtx X="-5" Y="21" Z="-2" S="363" T="-346" R="165" G="87" B="236" A="255"/>
<Vtx X="-9" Y="21" Z="-2" S="363" T="-287" R="183" G="73" B="183" A="255"/>
<Vtx X="-1" Y="21" Z="0" S="-55" T="-437" R="169" G="61" B="69" A="255"/>
<Vtx X="-9" Y="19" Z="0" S="-31" T="-331" R="183" G="183" B="74" A="255"/>
<Vtx X="-1" Y="19" Z="0" S="-31" T="-437" R="169" G="195" B="70" A="255"/>
<Vtx X="-9" Y="21" Z="0" S="-55" T="-331" R="183" G="74" B="73" A="255"/>
<Vtx X="-1" Y="19" Z="0" S="427" T="389" R="169" G="195" B="70" A="255"/>
<Vtx X="-9" Y="19" Z="-1" S="439" T="495" R="151" G="193" B="33" A="255"/>
<Vtx X="0" Y="19" Z="-1" S="439" T="377" R="0" G="130" B="15" A="255"/>
<Vtx X="-9" Y="19" Z="0" S="427" T="495" R="183" G="183" B="74" A="255"/>
<Vtx X="0" Y="4" Z="-1" S="-461" T="-495" R="0" G="155" B="179" A="255"/>
<Vtx X="1" Y="-1" Z="0" S="-473" T="-427" R="54" G="115" B="0" A="255"/>
<Vtx X="0" Y="-1" Z="-1" S="-461" T="-427" R="0" G="115" B="202" A="255"/>
<Vtx X="1" Y="4" Z="0" S="-473" T="-496" R="87" G="195" B="70" A="255"/>
<Vtx X="-1" Y="4" Z="0" S="281" T="-423" R="169" G="195" B="70" A="255"/>
<Vtx X="0" Y="-1" Z="-1" S="293" T="-492" R="0" G="115" B="202" A="255"/>
<Vtx X="-1" Y="-1" Z="0" S="281" T="-491" R="202" G="115" B="0" A="255"/>
<Vtx X="0" Y="4" Z="-1" S="293" T="-423" R="0" G="155" B="179" A="255"/>
<Vtx X="1" Y="4" Z="0" S="-29" T="-262" R="87" G="195" B="70" A="255"/>
<Vtx X="0" Y="-1" Z="1" S="-17" T="-331" R="0" G="115" B="54" A="255"/>
<Vtx X="1" Y="-1" Z="0" S="-29" T="-331" R="54" G="115" B="0" A="255"/>
<Vtx X="0" Y="4" Z="1" S="-17" T="-263" R="0" G="0" B="127" A="255"/>
<Vtx X="1" Y="5" Z="0" S="-29" T="-250" R="87" G="61" B="70" A="255"/>
<Vtx X="8" Y="5" Z="0" S="-132" T="-251" R="73" G="73" B="73" A="255"/>
<Vtx X="8" Y="4" Z="0" S="-132" T="-262" R="73" G="183" B="73" A="255"/>
<Vtx X="0" Y="5" Z="1" S="-17" T="-251" R="0" G="0" B="127" A="255"/>
<Vtx X="1" Y="19" Z="0" S="-29" T="-50" R="87" G="195" B="70" A="255"/>
<Vtx X="0" Y="19" Z="1" S="-17" T="-50" R="0" G="0" B="127" A="255"/>
<Vtx X="1" Y="21" Z="0" S="-29" T="-25" R="87" G="61" B="69" A="255"/>
<Vtx X="8" Y="21" Z="0" S="-132" T="-25" R="73" G="74" B="73" A="255"/>
<Vtx X="8" Y="19" Z="0" S="-132" T="-50" R="73" G="183" B="74" A="255"/>
<Vtx X="0" Y="21" Z="1" S="-17" T="-26" R="0" G="0" B="127" A="255"/>
<Vtx X="1" Y="27" Z="0" S="-29" T="50" R="87" G="195" B="70" A="255"/>
<Vtx X="0" Y="27" Z="1" S="-17" T="50" R="0" G="0" B="127" A="255"/>
<Vtx X="1" Y="27" Z="0" S="-29" T="58" R="87" G="61" B="70" A="255"/>
<Vtx X="0" Y="27" Z="1" S="-17" T="50" R="0" G="0" B="127" A="255"/>
<Vtx X="1" Y="27" Z="0" S="-29" T="50" R="87" G="195" B="70" A="255"/>
<Vtx X="4" Y="27" Z="0" S="-75" T="58" R="73" G="73" B="73" A="255"/>
<Vtx X="4" Y="27" Z="0" S="-75" T="50" R="73" G="183" B="73" A="255"/>
<Vtx X="0" Y="27" Z="1" S="-17" T="57" R="0" G="0" B="127" A="255"/>
<Vtx X="1" Y="28" Z="0" S="-29" T="68" R="68" G="149" B="0" A="255"/>
<Vtx X="0" Y="28" Z="1" S="-17" T="68" R="0" G="149" B="68" A="255"/>
<Vtx X="0" Y="4" Z="1" S="-5" T="0" R="0" G="0" B="127" A="255"/>
<Vtx X="-1" Y="-1" Z="0" S="-17" T="68" R="202" G="115" B="0" A="255"/>
<Vtx X="0" Y="-1" Z="1" S="-5" T="68" R="0" G="115" B="54" A="255"/>
<Vtx X="-1" Y="4" Z="0" S="-17" T="0" R="169" G="195" B="70" A="255"/>
<Vtx X="0" Y="5" Z="1" S="-5" T="-12" R="0" G="0" B="127" A="255"/>
<Vtx X="-1" Y="5" Z="0" S="-17" T="-12" R="169" G="61" B="70" A="255"/>
<Vtx X="0" Y="19" Z="1" S="-5" T="-213" R="0" G="0" B="127" A="255"/>
<Vtx X="-1" Y="19" Z="0" S="-17" T="-213" R="169" G="195" B="70" A="255"/>
<Vtx X="0" Y="21" Z="1" S="-5" T="-238" R="0" G="0" B="127" A="255"/>
<Vtx X="-1" Y="19" Z="0" S="-17" T="-213" R="169" G="195" B="70" A="255"/>
<Vtx X="0" Y="19" Z="1" S="-5" T="-213" R="0" G="0" B="127" A="255"/>
<Vtx X="-1" Y="21" Z="0" S="-17" T="-238" R="169" G="61" B="69" A="255"/>
<Vtx X="-1" Y="27" Z="0" S="-17" T="-313" R="169" G="195" B="70" A="255"/>
<Vtx X="0" Y="27" Z="1" S="-5" T="-313" R="0" G="0" B="127" A="255"/>
<Vtx X="-1" Y="27" Z="0" S="-17" T="-321" R="169" G="61" B="70" A="255"/>
<Vtx X="0" Y="27" Z="1" S="-5" T="-321" R="0" G="0" B="127" A="255"/>
<Vtx X="0" Y="28" Z="1" S="-5" T="-331" R="0" G="149" B="68" A="255"/>
<Vtx X="-1" Y="28" Z="0" S="-17" T="-331" R="188" G="149" B="0" A="255"/>
<Vtx X="-9" Y="21" Z="-1" S="-431" T="-436" R="166" G="90" B="0" A="255"/>
<Vtx X="-9" Y="21" Z="-2" S="-431" T="-427" R="183" G="73" B="183" A="255"/>
<Vtx X="-9" Y="19" Z="-2" S="-407" T="-427" R="158" G="20" B="177" A="255"/>
<Vtx X="-9" Y="19" Z="-1" S="-407" T="-444" R="151" G="193" B="33" A="255"/>
<Vtx X="-9" Y="21" Z="-1" S="-431" T="-444" R="166" G="90" B="0" A="255"/>
<Vtx X="-9" Y="19" Z="0" S="-407" T="-456" R="183" G="183" B="74" A="255"/>
<Vtx X="-9" Y="19" Z="0" S="-407" T="-456" R="183" G="183" B="74" A="255"/>
<Vtx X="-9" Y="21" Z="0" S="-431" T="-456" R="183" G="74" B="73" A="255"/>
<Vtx X="-9" Y="21" Z="-1" S="-431" T="-444" R="166" G="90" B="0" A="255"/>
<Vtx X="8" Y="19" Z="-2" S="-431" T="-456" R="98" G="20" B="177" A="255"/>
<Vtx X="8" Y="21" Z="-2" S="-455" T="-456" R="73" G="73" B="183" A="255"/>
<Vtx X="8" Y="21" Z="-1" S="-455" T="-448" R="90" G="90" B="0" A="255"/>
<Vtx X="8" Y="19" Z="-1" S="-431" T="-439" R="105" G="193" B="33" A="255"/>
<Vtx X="8" Y="21" Z="-1" S="-455" T="-439" R="90" G="90" B="0" A="255"/>
<Vtx X="8" Y="19" Z="0" S="-431" T="-427" R="73" G="183" B="74" A="255"/>
<Vtx X="8" Y="21" Z="0" S="-455" T="-427" R="73" G="74" B="73" A="255"/>
<Vtx X="8" Y="5" Z="-1" S="-418" T="-468" R="98" G="79" B="20" A="255"/>
<Vtx X="8" Y="4" Z="0" S="-407" T="-456" R="73" G="183" B="73" A="255"/>
<Vtx X="8" Y="4" Z="-1" S="-407" T="-468" R="85" G="163" B="239" A="255"/>
<Vtx X="8" Y="5" Z="0" S="-418" T="-456" R="73" G="73" B="73" A="255"/>
<Vtx X="1" Y="5" Z="0" S="457" T="-341" R="87" G="61" B="70" A="255"/>
<Vtx X="8" Y="5" Z="-1" S="445" T="-447" R="98" G="79" B="20" A="255"/>
<Vtx X="0" Y="5" Z="-1" S="445" T="-329" R="0" G="125" B="236" A="255"/>
<Vtx X="8" Y="5" Z="0" S="457" T="-447" R="73" G="73" B="73" A="255"/>
<Vtx X="-9" Y="5" Z="0" S="-133" T="-291" R="183" G="73" B="73" A="255"/>
<Vtx X="-9" Y="4" Z="-1" S="-144" T="-303" R="171" G="163" B="239" A="255"/>
<Vtx X="-9" Y="4" Z="0" S="-144" T="-291" R="183" G="183" B="73" A="255"/>
<Vtx X="-9" Y="5" Z="-1" S="-133" T="-303" R="158" G="79" B="20" A="255"/>
<Vtx X="-1" Y="5" Z="0" S="450" T="389" R="169" G="61" B="70" A="255"/>
<Vtx X="-9" Y="5" Z="-1" S="439" T="495" R="158" G="79" B="20" A="255"/>
<Vtx X="-9" Y="5" Z="0" S="450" T="495" R="183" G="73" B="73" A="255"/>
<Vtx X="0" Y="5" Z="-1" S="439" T="377" R="0" G="125" B="236" A="255"/>
<Vtx X="-1" Y="4" Z="0" S="434" T="-341" R="169" G="195" B="70" A="255"/>
<Vtx X="-9" Y="4" Z="-1" S="422" T="-447" R="171" G="163" B="239" A="255"/>
<Vtx X="0" Y="4" Z="-1" S="422" T="-329" R="0" G="155" B="179" A="255"/>
<Vtx X="-9" Y="4" Z="0" S="434" T="-447" R="183" G="183" B="73" A="255"/>
<Vtx X="-1" Y="5" Z="0" S="-125" T="-521" R="169" G="61" B="70" A="255"/>
<Vtx X="-9" Y="4" Z="0" S="-113" T="-415" R="183" G="183" B="73" A="255"/>
<Vtx X="-1" Y="4" Z="0" S="-113" T="-521" R="169" G="195" B="70" A="255"/>
<Vtx X="-9" Y="5" Z="0" S="-125" T="-415" R="183" G="73" B="73" A="255"/>
<Vtx X="0" Y="27" Z="-1" S="-15" T="-417" R="0" G="129" B="253" A="255"/>
<Vtx X="1" Y="21" Z="0" S="-3" T="-492" R="87" G="61" B="69" A="255"/>
<Vtx X="0" Y="21" Z="-1" S="-15" T="-493" R="0" G="115" B="202" A="255"/>
<Vtx X="1" Y="27" Z="0" S="-3" T="-417" R="87" G="195" B="70" A="255"/>
<Vtx X="-1" Y="21" Z="0" S="-27" T="-492" R="169" G="61" B="69" A="255"/>
<Vtx X="0" Y="27" Z="-1" S="-15" T="-417" R="0" G="129" B="253" A="255"/>
<Vtx X="0" Y="21" Z="-1" S="-15" T="-492" R="0" G="115" B="202" A="255"/>
<Vtx X="-1" Y="27" Z="0" S="-27" T="-417" R="169" G="195" B="70" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="-137" T="-282" R="102" G="185" B="27" A="255"/>
<Vtx X="4" Y="27" Z="0" S="-144" T="-270" R="73" G="73" B="73" A="255"/>
<Vtx X="4" Y="27" Z="0" S="-137" T="-270" R="73" G="183" B="73" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="-144" T="-282" R="90" G="90" B="0" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="-137" T="-282" R="102" G="185" B="27" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="-144" T="-291" R="73" G="73" B="183" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="-144" T="-282" R="90" G="90" B="0" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="-137" T="-291" R="103" G="30" B="188" A="255"/>
<Vtx X="1" Y="27" Z="0" S="-348" T="-474" R="87" G="195" B="70" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="-360" T="-427" R="102" G="185" B="27" A="255"/>
<Vtx X="4" Y="27" Z="0" S="-348" T="-427" R="73" G="183" B="73" A="255"/>
<Vtx X="0" Y="27" Z="-1" S="-360" T="-486" R="0" G="129" B="253" A="255"/>
<Vtx X="-5" Y="27" Z="0" S="408" T="-468" R="183" G="73" B="73" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="415" T="-456" R="154" G="185" B="27" A="255"/>
<Vtx X="-5" Y="27" Z="0" S="415" T="-468" R="183" G="183" B="73" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="408" T="-456" R="166" G="90" B="0" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="408" T="-447" R="183" G="73" B="183" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="415" T="-447" R="153" G="30" B="188" A="255"/>
<Vtx X="-1" Y="27" Z="0" S="-372" T="-474" R="169" G="195" B="70" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="-360" T="-427" R="154" G="185" B="27" A="255"/>
<Vtx X="-1" Y="27" Z="0" S="-372" T="-474" R="169" G="195" B="70" A="255"/>
<Vtx X="-5" Y="27" Z="0" S="-372" T="-427" R="183" G="183" B="73" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="-360" T="-427" R="154" G="185" B="27" A="255"/>
<Vtx X="-1" Y="27" Z="0" S="-156" T="-378" R="169" G="61" B="70" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="-144" T="-425" R="166" G="90" B="0" A="255"/>
<Vtx X="-5" Y="27" Z="0" S="-156" T="-425" R="183" G="73" B="73" A="255"/>
<Vtx X="0" Y="27" Z="-1" S="-144" T="-366" R="0" G="115" B="202" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="-136" T="-425" R="183" G="73" B="183" A="255"/>
<Vtx X="0" Y="27" Z="-1" S="-136" T="-366" R="0" G="90" B="166" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="-144" T="-307" R="90" G="90" B="0" A="255"/>
<Vtx X="1" Y="27" Z="0" S="-156" T="-354" R="87" G="61" B="70" A="255"/>
<Vtx X="4" Y="27" Z="0" S="-156" T="-307" R="73" G="73" B="73" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="-136" T="-307" R="73" G="73" B="183" A="255"/>
<Vtx X="0" Y="-13" Z="13" S="173" T="-444" R="84" G="161" B="250" A="255"/>
<Vtx X="0" Y="-11" Z="11" S="151" T="-415" R="0" G="146" B="64" A="255"/>
<Vtx X="0" Y="-12" Z="14" S="186" T="-438" R="83" G="232" B="94" A="255"/>
<Vtx X="0" Y="-8" Z="12" S="177" T="-376" R="114" G="12" B="55" A="255"/>
<Vtx X="0" Y="-12" Z="14" S="186" T="-438" R="83" G="232" B="94" A="255"/>
<Vtx X="0" Y="-11" Z="11" S="151" T="-415" R="0" G="146" B="64" A="255"/>
<Vtx X="0" Y="-5" Z="11" S="171" T="-327" R="0" G="10" B="127" A="255"/>
<Vtx X="0" Y="-6" Z="13" S="186" T="-349" R="94" G="39" B="76" A="255"/>
<Vtx X="8" Y="21" Z="-2" S="495" T="-143" R="73" G="73" B="183" A="255"/>
<Vtx X="8" Y="19" Z="-2" S="471" T="-143" R="98" G="20" B="177" A="255"/>
<Vtx X="4" Y="21" Z="-2" S="495" T="-83" R="91" G="85" B="231" A="255"/>
<Vtx X="4" Y="21" Z="-2" S="487" T="-78" R="11" G="222" B="134" A="255"/>
<Vtx X="0" Y="19" Z="-2" S="471" T="-24" R="0" G="31" B="133" A="255"/>
<Vtx X="-4" Y="21" Z="-2" S="488" T="31" R="243" G="222" B="134" A="255"/>
<Vtx X="-9" Y="19" Z="-2" S="471" T="94" R="158" G="20" B="177" A="255"/>
<Vtx X="-5" Y="21" Z="-2" S="495" T="35" R="165" G="87" B="236" A="255"/>
<Vtx X="-9" Y="21" Z="-2" S="495" T="94" R="183" G="73" B="183" A="255"/>
<Vtx X="0" Y="27" Z="-1" S="450" T="436" R="0" G="90" B="166" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="450" T="495" R="73" G="73" B="183" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="458" T="495" R="103" G="30" B="188" A="255"/>
<Vtx X="0" Y="27" Z="-1" S="458" T="436" R="0" G="51" B="140" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="450" T="377" R="183" G="73" B="183" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="458" T="377" R="153" G="30" B="188" A="255"/>
<Vtx X="-1" Y="28" Z="0" S="269" T="-389" R="188" G="149" B="0" A="255"/>
<Vtx X="0" Y="28" Z="3" S="253" T="-423" R="0" G="188" B="107" A="255"/>
<Vtx X="-3" Y="28" Z="0" S="253" T="-373" R="149" G="188" B="0" A="255"/>
<Vtx X="0" Y="28" Z="1" S="269" T="-407" R="0" G="149" B="68" A="255"/>
<Vtx X="1" Y="28" Z="0" S="285" T="-407" R="68" G="149" B="0" A="255"/>
<Vtx X="2" Y="28" Z="0" S="302" T="-423" R="107" G="188" B="0" A="255"/>
<Vtx X="0" Y="28" Z="-1" S="285" T="-389" R="0" G="149" B="188" A="255"/>
<Vtx X="0" Y="28" Z="-3" S="302" T="-373" R="0" G="188" B="149" A="255"/>
<Vtx X="0" Y="29" Z="0" S="26" T="-419" R="0" G="115" B="202" A="255"/>
<Vtx X="2" Y="29" Z="0" S="-1" T="-396" R="104" G="73" B="0" A="255"/>
<Vtx X="0" Y="29" Z="-3" S="48" T="-396" R="0" G="73" B="152" A="255"/>
<Vtx X="0" Y="29" Z="0" S="22" T="-419" R="54" G="115" B="0" A="255"/>
<Vtx X="0" Y="29" Z="3" S="-1" T="-447" R="0" G="73" B="104" A="255"/>
<Vtx X="0" Y="29" Z="0" S="22" T="-424" R="0" G="115" B="54" A="255"/>
<Vtx X="-1" Y="29" Z="0" S="26" T="-424" R="202" G="115" B="0" A="255"/>
<Vtx X="-3" Y="29" Z="0" S="48" T="-447" R="152" G="73" B="0" A="255"/>
</Vertex>
@@ -0,0 +1,98 @@
<Vertex Version="0">
<Vtx X="3" Y="34" Z="-1" S="302" T="-467" R="72" G="84" B="194" A="255"/>
<Vtx X="3" Y="31" Z="0" S="293" T="-423" R="64" G="160" B="202" A="255"/>
<Vtx X="3" Y="31" Z="-1" S="302" T="-423" R="72" G="172" B="194" A="255"/>
<Vtx X="3" Y="34" Z="0" S="293" T="-467" R="64" G="96" B="202" A="255"/>
<Vtx X="3" Y="34" Z="0" S="-128" T="-469" R="64" G="96" B="202" A="255"/>
<Vtx X="3" Y="31" Z="0" S="-135" T="-425" R="23" G="154" B="183" A="255"/>
<Vtx X="3" Y="31" Z="0" S="-128" T="-425" R="64" G="160" B="202" A="255"/>
<Vtx X="3" Y="34" Z="0" S="-135" T="-469" R="23" G="102" B="183" A="255"/>
<Vtx X="4" Y="31" Z="0" S="-147" T="-425" R="234" G="160" B="176" A="255"/>
<Vtx X="4" Y="34" Z="0" S="-147" T="-469" R="234" G="96" B="176" A="255"/>
<Vtx X="5" Y="31" Z="0" S="-156" T="-425" R="59" G="186" B="168" A="255"/>
<Vtx X="5" Y="34" Z="0" S="-156" T="-469" R="59" G="70" B="168" A="255"/>
<Vtx X="3" Y="31" Z="1" S="112" T="-416" R="183" G="171" B="61" A="255"/>
<Vtx X="2" Y="34" Z="0" S="104" T="-460" R="193" G="96" B="54" A="255"/>
<Vtx X="2" Y="31" Z="0" S="104" T="-416" R="193" G="160" B="54" A="255"/>
<Vtx X="3" Y="34" Z="1" S="112" T="-460" R="183" G="85" B="61" A="255"/>
<Vtx X="3" Y="31" Z="1" S="260" T="-423" R="226" G="175" B="94" A="255"/>
<Vtx X="3" Y="34" Z="1" S="253" T="-467" R="183" G="85" B="61" A="255"/>
<Vtx X="3" Y="31" Z="1" S="253" T="-423" R="183" G="171" B="61" A="255"/>
<Vtx X="3" Y="34" Z="1" S="260" T="-467" R="226" G="81" B="94" A="255"/>
<Vtx X="4" Y="31" Z="1" S="271" T="-423" R="25" G="172" B="92" A="255"/>
<Vtx X="4" Y="34" Z="1" S="271" T="-467" R="25" G="84" B="92" A="255"/>
<Vtx X="5" Y="31" Z="1" S="281" T="-423" R="84" G="178" B="56" A="255"/>
<Vtx X="5" Y="34" Z="1" S="281" T="-467" R="84" G="78" B="56" A="255"/>
<Vtx X="5" Y="34" Z="1" S="-401" T="-471" R="84" G="78" B="56" A="255"/>
<Vtx X="5" Y="31" Z="0" S="-389" T="-427" R="59" G="186" B="168" A="255"/>
<Vtx X="5" Y="34" Z="0" S="-389" T="-471" R="59" G="70" B="168" A="255"/>
<Vtx X="5" Y="31" Z="1" S="-401" T="-427" R="84" G="178" B="56" A="255"/>
<Vtx X="0" Y="31" Z="0" S="-1" T="-178" R="187" G="201" B="164" A="255"/>
<Vtx X="0" Y="34" Z="-1" S="-5" T="-221" R="171" G="82" B="209" A="255"/>
<Vtx X="0" Y="31" Z="-1" S="-5" T="-178" R="171" G="174" B="210" A="255"/>
<Vtx X="0" Y="34" Z="0" S="-1" T="-221" R="189" G="55" B="163" A="255"/>
<Vtx X="0" Y="31" Z="0" S="70" T="-417" R="97" G="206" B="66" A="255"/>
<Vtx X="0" Y="34" Z="0" S="74" T="-460" R="34" G="89" B="84" A="255"/>
<Vtx X="0" Y="34" Z="0" S="70" T="-460" R="98" G="50" B="64" A="255"/>
<Vtx X="0" Y="31" Z="0" S="74" T="-417" R="33" G="166" B="84" A="255"/>
<Vtx X="1" Y="34" Z="0" S="82" T="-461" R="12" G="97" B="81" A="255"/>
<Vtx X="1" Y="31" Z="0" S="82" T="-417" R="12" G="159" B="81" A="255"/>
<Vtx X="2" Y="31" Z="0" S="94" T="-417" R="227" G="157" B="75" A="255"/>
<Vtx X="2" Y="34" Z="0" S="94" T="-461" R="227" G="99" B="75" A="255"/>
<Vtx X="2" Y="31" Z="0" S="104" T="-416" R="193" G="160" B="54" A="255"/>
<Vtx X="2" Y="34" Z="0" S="104" T="-460" R="193" G="96" B="54" A="255"/>
<Vtx X="0" Y="31" Z="-1" S="151" T="-416" R="171" G="174" B="210" A="255"/>
<Vtx X="0" Y="34" Z="-1" S="151" T="-460" R="171" G="82" B="209" A="255"/>
<Vtx X="0" Y="34" Z="-1" S="143" T="-460" R="205" G="85" B="177" A="255"/>
<Vtx X="0" Y="31" Z="-1" S="143" T="-416" R="205" G="171" B="177" A="255"/>
<Vtx X="1" Y="34" Z="-1" S="135" T="-460" R="242" G="84" B="161" A="255"/>
<Vtx X="1" Y="31" Z="-1" S="135" T="-416" R="242" G="172" B="161" A="255"/>
<Vtx X="1" Y="31" Z="-1" S="135" T="-416" R="242" G="172" B="161" A="255"/>
<Vtx X="1" Y="34" Z="-1" S="135" T="-460" R="242" G="84" B="161" A="255"/>
<Vtx X="2" Y="34" Z="-1" S="123" T="-460" R="35" G="83" B="166" A="255"/>
<Vtx X="2" Y="31" Z="-1" S="123" T="-416" R="35" G="173" B="166" A="255"/>
<Vtx X="3" Y="31" Z="-1" S="113" T="-416" R="72" G="172" B="194" A="255"/>
<Vtx X="3" Y="34" Z="-1" S="113" T="-460" R="72" G="84" B="194" A="255"/>
<Vtx X="4" Y="31" Z="0" S="-72" T="-478" R="234" G="160" B="176" A="255"/>
<Vtx X="5" Y="31" Z="0" S="-64" T="-485" R="59" G="186" B="168" A="255"/>
<Vtx X="5" Y="31" Z="1" S="-76" T="-489" R="84" G="178" B="56" A="255"/>
<Vtx X="4" Y="31" Z="1" S="-84" T="-481" R="25" G="172" B="92" A="255"/>
<Vtx X="3" Y="31" Z="0" S="-77" T="-467" R="23" G="154" B="183" A="255"/>
<Vtx X="3" Y="31" Z="1" S="-89" T="-471" R="226" G="175" B="94" A="255"/>
<Vtx X="3" Y="31" Z="1" S="-86" T="-461" R="183" G="171" B="61" A="255"/>
<Vtx X="3" Y="31" Z="0" S="-74" T="-458" R="64" G="160" B="202" A="255"/>
<Vtx X="2" Y="31" Z="0" S="-79" T="-454" R="193" G="160" B="54" A="255"/>
<Vtx X="3" Y="31" Z="-1" S="-67" T="-450" R="72" G="172" B="194" A="255"/>
<Vtx X="2" Y="31" Z="0" S="-76" T="-441" R="227" G="157" B="75" A="255"/>
<Vtx X="3" Y="31" Z="-1" S="-67" T="-450" R="72" G="172" B="194" A="255"/>
<Vtx X="2" Y="31" Z="0" S="-79" T="-454" R="193" G="160" B="54" A="255"/>
<Vtx X="2" Y="31" Z="-1" S="-64" T="-438" R="35" G="173" B="166" A="255"/>
<Vtx X="1" Y="31" Z="-1" S="-67" T="-426" R="242" G="172" B="161" A="255"/>
<Vtx X="1" Y="31" Z="0" S="-79" T="-430" R="12" G="159" B="81" A="255"/>
<Vtx X="0" Y="31" Z="-1" S="-73" T="-419" R="205" G="171" B="177" A="255"/>
<Vtx X="0" Y="31" Z="0" S="-85" T="-423" R="33" G="166" B="84" A="255"/>
<Vtx X="0" Y="31" Z="-1" S="-83" T="-415" R="171" G="174" B="210" A="255"/>
<Vtx X="0" Y="31" Z="0" S="-86" T="-415" R="187" G="201" B="164" A="255"/>
<Vtx X="0" Y="31" Z="0" S="-88" T="-420" R="97" G="206" B="66" A="255"/>
<Vtx X="0" Y="34" Z="0" S="-111" T="-488" R="189" G="55" B="163" A="255"/>
<Vtx X="0" Y="34" Z="0" S="-113" T="-484" R="98" G="50" B="64" A="255"/>
<Vtx X="0" Y="34" Z="0" S="-110" T="-481" R="34" G="89" B="84" A="255"/>
<Vtx X="0" Y="34" Z="-1" S="-107" T="-489" R="171" G="82" B="209" A="255"/>
<Vtx X="0" Y="34" Z="-1" S="-98" T="-484" R="205" G="85" B="177" A="255"/>
<Vtx X="0" Y="34" Z="0" S="-110" T="-481" R="34" G="89" B="84" A="255"/>
<Vtx X="1" Y="34" Z="0" S="-104" T="-474" R="12" G="97" B="81" A="255"/>
<Vtx X="0" Y="34" Z="-1" S="-98" T="-484" R="205" G="85" B="177" A="255"/>
<Vtx X="1" Y="34" Z="-1" S="-92" T="-477" R="242" G="84" B="161" A="255"/>
<Vtx X="2" Y="34" Z="-1" S="-89" T="-466" R="35" G="83" B="166" A="255"/>
<Vtx X="2" Y="34" Z="0" S="-101" T="-462" R="227" G="99" B="75" A="255"/>
<Vtx X="3" Y="34" Z="-1" S="-92" T="-453" R="72" G="84" B="194" A="255"/>
<Vtx X="2" Y="34" Z="0" S="-104" T="-450" R="193" G="96" B="54" A="255"/>
<Vtx X="3" Y="34" Z="0" S="-98" T="-446" R="64" G="96" B="202" A="255"/>
<Vtx X="3" Y="34" Z="1" S="-110" T="-442" R="183" G="85" B="61" A="255"/>
<Vtx X="3" Y="34" Z="0" S="-101" T="-436" R="23" G="102" B="183" A="255"/>
<Vtx X="3" Y="34" Z="1" S="-113" T="-433" R="226" G="81" B="94" A="255"/>
<Vtx X="4" Y="34" Z="1" S="-109" T="-422" R="25" G="84" B="92" A="255"/>
<Vtx X="4" Y="34" Z="0" S="-97" T="-426" R="234" G="96" B="176" A="255"/>
<Vtx X="5" Y="34" Z="1" S="-101" T="-415" R="84" G="78" B="56" A="255"/>
<Vtx X="5" Y="34" Z="0" S="-89" T="-418" R="59" G="70" B="168" A="255"/>
</Vertex>
@@ -0,0 +1,323 @@
<Vertex Version="0">
<Vtx X="-2" Y="1" Z="-22" S="-343" T="-266" R="155" G="77" B="11" A="255"/>
<Vtx X="-3" Y="3" Z="-26" S="-350" T="-196" R="71" G="66" B="82" A="255"/>
<Vtx X="-3" Y="5" Z="-28" S="-343" T="-169" R="183" G="100" B="227" A="255"/>
<Vtx X="2" Y="1" Z="-22" S="-343" T="-71" R="101" G="77" B="11" A="255"/>
<Vtx X="3" Y="5" Z="-28" S="-343" T="-169" R="73" G="100" B="227" A="255"/>
<Vtx X="2" Y="3" Z="-26" S="-350" T="-141" R="185" G="66" B="82" A="255"/>
<Vtx X="7" Y="4" Z="5" S="-348" T="-432" R="82" G="187" B="69" A="255"/>
<Vtx X="7" Y="-1" Z="5" S="-343" T="-368" R="82" G="185" B="66" A="255"/>
<Vtx X="7" Y="4" Z="5" S="-343" T="-432" R="118" G="227" B="38" A="255"/>
<Vtx X="7" Y="-1" Z="5" S="-348" T="-367" R="118" G="226" B="35" A="255"/>
<Vtx X="7" Y="4" Z="11" S="-528" T="-505" R="4" G="95" B="85" A="255"/>
<Vtx X="7" Y="4" Z="11" S="-522" T="-510" R="85" G="196" B="73" A="255"/>
<Vtx X="7" Y="4" Z="11" S="-529" T="-510" R="71" G="88" B="58" A="255"/>
<Vtx X="7" Y="4" Z="11" S="-522" T="-506" R="53" G="243" B="115" A="255"/>
<Vtx X="6" Y="3" Z="11" S="-510" T="-495" R="0" G="21" B="125" A="255"/>
<Vtx X="4" Y="3" Z="11" S="-510" T="-464" R="0" G="21" B="125" A="255"/>
<Vtx X="3" Y="3" Z="11" S="-510" T="-452" R="0" G="21" B="125" A="255"/>
<Vtx X="4" Y="3" Z="11" S="-510" T="-464" R="0" G="21" B="125" A="255"/>
<Vtx X="7" Y="4" Z="11" S="-528" T="-505" R="4" G="95" B="85" A="255"/>
<Vtx X="0" Y="3" Z="11" S="-510" T="-421" R="0" G="21" B="125" A="255"/>
<Vtx X="-1" Y="3" Z="11" S="-510" T="-398" R="0" G="21" B="125" A="255"/>
<Vtx X="-7" Y="4" Z="11" S="-528" T="-314" R="252" G="95" B="85" A="255"/>
<Vtx X="-3" Y="3" Z="11" S="-510" T="-367" R="0" G="21" B="125" A="255"/>
<Vtx X="-4" Y="3" Z="11" S="-510" T="-355" R="0" G="21" B="125" A="255"/>
<Vtx X="-6" Y="3" Z="11" S="-510" T="-324" R="0" G="21" B="125" A="255"/>
<Vtx X="-7" Y="4" Z="11" S="-522" T="-314" R="203" G="243" B="115" A="255"/>
<Vtx X="-7" Y="4" Z="11" S="-522" T="-309" R="171" G="196" B="73" A="255"/>
<Vtx X="-7" Y="4" Z="11" S="-529" T="-310" R="185" G="88" B="58" A="255"/>
<Vtx X="-6" Y="2" Z="12" S="-489" T="-324" R="0" G="21" B="125" A="255"/>
<Vtx X="-7" Y="0" Z="12" S="-473" T="-309" R="156" G="221" B="70" A="255"/>
<Vtx X="-4" Y="2" Z="12" S="-489" T="-355" R="0" G="21" B="125" A="255"/>
<Vtx X="0" Y="0" Z="12" S="-473" T="-409" R="0" G="215" B="120" A="255"/>
<Vtx X="-3" Y="2" Z="12" S="-489" T="-367" R="0" G="21" B="125" A="255"/>
<Vtx X="-4" Y="2" Z="12" S="-489" T="-355" R="0" G="21" B="125" A="255"/>
<Vtx X="0" Y="0" Z="12" S="-473" T="-409" R="0" G="215" B="120" A="255"/>
<Vtx X="-1" Y="2" Z="12" S="-489" T="-398" R="0" G="21" B="125" A="255"/>
<Vtx X="0" Y="2" Z="12" S="-489" T="-421" R="0" G="21" B="125" A="255"/>
<Vtx X="3" Y="2" Z="12" S="-489" T="-452" R="0" G="21" B="125" A="255"/>
<Vtx X="4" Y="2" Z="12" S="-489" T="-464" R="0" G="21" B="125" A="255"/>
<Vtx X="7" Y="0" Z="12" S="-473" T="-510" R="100" G="221" B="70" A="255"/>
<Vtx X="6" Y="2" Z="12" S="-489" T="-495" R="0" G="21" B="125" A="255"/>
<Vtx X="7" Y="4" Z="11" S="-522" T="-506" R="53" G="243" B="115" A="255"/>
<Vtx X="6" Y="3" Z="11" S="-510" T="-495" R="0" G="21" B="125" A="255"/>
<Vtx X="3" Y="3" Z="11" S="-510" T="-452" R="0" G="21" B="125" A="255"/>
<Vtx X="4" Y="3" Z="11" S="-510" T="-464" R="0" G="21" B="125" A="255"/>
<Vtx X="7" Y="-10" Z="-10" S="70" T="194" R="104" G="186" B="237" A="255"/>
<Vtx X="2" Y="-9" Z="-17" S="136" T="95" R="21" G="160" B="176" A="255"/>
<Vtx X="6" Y="-8" Z="-17" S="85" T="94" R="92" G="201" B="188" A="255"/>
<Vtx X="7" Y="-10" Z="-10" S="70" T="194" R="104" G="186" B="237" A="255"/>
<Vtx X="2" Y="-13" Z="-10" S="137" T="196" R="26" G="134" B="231" A="255"/>
<Vtx X="2" Y="-9" Z="-17" S="136" T="95" R="21" G="160" B="176" A="255"/>
<Vtx X="2" Y="-13" Z="4" S="137" T="393" R="27" G="132" B="9" A="255"/>
<Vtx X="7" Y="-10" Z="4" S="70" T="391" R="106" G="186" B="6" A="255"/>
<Vtx X="2" Y="-11" Z="11" S="137" T="495" R="19" G="169" B="91" A="255"/>
<Vtx X="7" Y="-9" Z="11" S="74" T="494" R="84" G="207" B="82" A="255"/>
<Vtx X="0" Y="-11" Z="11" S="175" T="495" R="0" G="146" B="64" A="255"/>
<Vtx X="-2" Y="-11" Z="11" S="196" T="495" R="237" G="169" B="91" A="255"/>
<Vtx X="-2" Y="-13" Z="4" S="195" T="393" R="229" G="132" B="9" A="255"/>
<Vtx X="-7" Y="-10" Z="4" S="263" T="391" R="150" G="186" B="6" A="255"/>
<Vtx X="-7" Y="-9" Z="11" S="259" T="494" R="172" G="207" B="82" A="255"/>
<Vtx X="-7" Y="-10" Z="-10" S="263" T="194" R="152" G="186" B="237" A="255"/>
<Vtx X="-2" Y="-13" Z="-10" S="195" T="196" R="230" G="134" B="231" A="255"/>
<Vtx X="-3" Y="-9" Z="-17" S="197" T="95" R="235" G="160" B="176" A="255"/>
<Vtx X="-6" Y="-8" Z="-17" S="248" T="94" R="164" G="201" B="188" A="255"/>
<Vtx X="3" Y="0" Z="-21" S="335" T="-265" R="74" G="215" B="161" A="255"/>
<Vtx X="2" Y="1" Z="-22" S="346" T="-287" R="101" G="77" B="11" A="255"/>
<Vtx X="3" Y="0" Z="-21" S="330" T="-265" R="70" G="191" B="172" A="255"/>
<Vtx X="6" Y="0" Z="-17" S="306" T="-211" R="81" G="166" B="218" A="255"/>
<Vtx X="6" Y="0" Z="-17" S="302" T="-211" R="89" G="177" B="211" A="255"/>
<Vtx X="7" Y="-1" Z="-10" S="305" T="-112" R="95" G="172" B="248" A="255"/>
<Vtx X="7" Y="-1" Z="-10" S="309" T="-112" R="91" G="168" B="248" A="255"/>
<Vtx X="7" Y="-1" Z="5" S="342" T="94" R="82" G="185" B="66" A="255"/>
<Vtx X="7" Y="-1" Z="5" S="346" T="94" R="118" G="226" B="35" A="255"/>
<Vtx X="2" Y="-1" Z="-22" S="140" T="-416" R="100" G="222" B="185" A="255"/>
<Vtx X="2" Y="2" Z="-28" S="140" T="-327" R="29" G="191" B="151" A="255"/>
<Vtx X="3" Y="2" Z="-28" S="151" T="-328" R="93" G="233" B="172" A="255"/>
<Vtx X="1" Y="-1" Z="-22" S="133" T="-416" R="29" G="170" B="168" A="255"/>
<Vtx X="-2" Y="2" Z="-28" S="81" T="-327" R="227" G="191" B="151" A="255"/>
<Vtx X="-2" Y="-1" Z="-22" S="88" T="-416" R="227" G="170" B="168" A="255"/>
<Vtx X="-2" Y="-1" Z="-22" S="81" T="-416" R="156" G="222" B="185" A="255"/>
<Vtx X="-2" Y="-1" Z="-22" S="81" T="-416" R="156" G="222" B="185" A="255"/>
<Vtx X="-3" Y="2" Z="-28" S="70" T="-328" R="163" G="233" B="172" A="255"/>
<Vtx X="-2" Y="2" Z="-28" S="81" T="-327" R="227" G="191" B="151" A="255"/>
<Vtx X="2" Y="1" Z="-22" S="-380" T="405" R="101" G="77" B="11" A="255"/>
<Vtx X="3" Y="2" Z="-28" S="-366" T="495" R="93" G="233" B="172" A="255"/>
<Vtx X="3" Y="5" Z="-28" S="-330" T="488" R="73" G="100" B="227" A="255"/>
<Vtx X="2" Y="-1" Z="-22" S="-403" T="409" R="100" G="222" B="185" A="255"/>
<Vtx X="3" Y="0" Z="-21" S="-395" T="385" R="74" G="215" B="161" A="255"/>
<Vtx X="3" Y="-2" Z="-21" S="-414" T="398" R="81" G="253" B="159" A="255"/>
<Vtx X="6" Y="0" Z="-17" S="-398" T="338" R="81" G="166" B="218" A="255"/>
<Vtx X="6" Y="-8" Z="-17" S="-495" T="336" R="92" G="201" B="188" A="255"/>
<Vtx X="7" Y="-1" Z="-10" S="-397" T="239" R="91" G="168" B="248" A="255"/>
<Vtx X="7" Y="-10" Z="-10" S="-529" T="237" R="104" G="186" B="237" A="255"/>
<Vtx X="7" Y="-10" Z="4" S="-525" T="39" R="106" G="186" B="6" A="255"/>
<Vtx X="7" Y="-1" Z="5" S="-398" T="30" R="118" G="226" B="35" A="255"/>
<Vtx X="7" Y="-9" Z="11" S="-509" T="-64" R="84" G="207" B="82" A="255"/>
<Vtx X="7" Y="0" Z="11" S="-387" T="-61" R="102" G="218" B="66" A="255"/>
<Vtx X="7" Y="-9" Z="11" S="-509" T="-64" R="84" G="207" B="82" A="255"/>
<Vtx X="7" Y="-1" Z="5" S="-398" T="30" R="118" G="226" B="35" A="255"/>
<Vtx X="7" Y="4" Z="5" S="-335" T="33" R="82" G="187" B="69" A="255"/>
<Vtx X="7" Y="4" Z="11" S="-330" T="-61" R="53" G="243" B="115" A="255"/>
<Vtx X="7" Y="0" Z="12" S="-378" T="-71" R="100" G="221" B="70" A="255"/>
<Vtx X="-4" Y="3" Z="11" S="-510" T="-355" R="0" G="21" B="125" A="255"/>
<Vtx X="-3" Y="2" Z="12" S="-489" T="-367" R="0" G="21" B="125" A="255"/>
<Vtx X="-3" Y="3" Z="11" S="-510" T="-367" R="0" G="21" B="125" A="255"/>
<Vtx X="-4" Y="2" Z="12" S="-489" T="-355" R="0" G="21" B="125" A="255"/>
<Vtx X="-7" Y="4" Z="5" S="-55" T="-479" R="174" G="187" B="69" A="255"/>
<Vtx X="-8" Y="-1" Z="5" S="-59" T="-415" R="174" G="185" B="66" A="255"/>
<Vtx X="-7" Y="-1" Z="5" S="-55" T="-415" R="138" G="226" B="35" A="255"/>
<Vtx X="-8" Y="4" Z="5" S="-59" T="-480" R="138" G="227" B="38" A="255"/>
<Vtx X="6" Y="0" Z="-11" S="412" T="-103" R="174" G="97" B="6" A="255"/>
<Vtx X="6" Y="-1" Z="3" S="418" T="93" R="181" G="78" B="190" A="255"/>
<Vtx X="6" Y="0" Z="3" S="431" T="94" R="223" G="119" B="228" A="255"/>
<Vtx X="6" Y="-1" Z="-11" S="399" T="-103" R="164" G="87" B="7" A="255"/>
<Vtx X="5" Y="0" Z="-17" S="404" T="-191" R="185" G="99" B="36" A="255"/>
<Vtx X="5" Y="-1" Z="-17" S="391" T="-191" R="168" G="79" B="46" A="255"/>
<Vtx X="2" Y="1" Z="-20" S="404" T="-228" R="186" G="82" B="68" A="255"/>
<Vtx X="2" Y="0" Z="-20" S="391" T="-229" R="188" G="87" B="63" A="255"/>
<Vtx X="1" Y="0" Z="-21" S="395" T="-252" R="185" G="93" B="49" A="255"/>
<Vtx X="1" Y="1" Z="-21" S="408" T="-252" R="167" G="83" B="38" A="255"/>
<Vtx X="2" Y="2" Z="-27" S="418" T="-329" R="175" G="50" B="84" A="255"/>
<Vtx X="2" Y="3" Z="-26" S="431" T="-328" R="185" G="66" B="82" A="255"/>
<Vtx X="2" Y="1" Z="-22" S="-2" T="134" R="101" G="77" B="11" A="255"/>
<Vtx X="2" Y="3" Z="-26" S="0" T="68" R="185" G="66" B="82" A="255"/>
<Vtx X="1" Y="1" Z="-21" S="-11" T="144" R="167" G="83" B="38" A="255"/>
<Vtx X="3" Y="1" Z="-20" S="14" T="159" R="5" G="126" B="18" A="255"/>
<Vtx X="3" Y="1" Z="-20" S="14" T="159" R="5" G="126" B="18" A="255"/>
<Vtx X="1" Y="1" Z="-21" S="-11" T="144" R="167" G="83" B="38" A="255"/>
<Vtx X="2" Y="1" Z="-20" S="3" T="167" R="186" G="82" B="68" A="255"/>
<Vtx X="5" Y="0" Z="-17" S="36" T="204" R="185" G="99" B="36" A="255"/>
<Vtx X="6" Y="0" Z="-17" S="51" T="200" R="254" G="127" B="6" A="255"/>
<Vtx X="6" Y="0" Z="-11" S="50" T="292" R="174" G="97" B="6" A="255"/>
<Vtx X="7" Y="0" Z="4" S="65" T="495" R="246" G="89" B="166" A="255"/>
<Vtx X="6" Y="0" Z="3" S="50" T="489" R="223" G="119" B="228" A="255"/>
<Vtx X="0" Y="0" Z="4" S="-31" T="495" R="0" G="90" B="166" A="255"/>
<Vtx X="0" Y="0" Z="4" S="-31" T="492" R="0" G="104" B="183" A="255"/>
<Vtx X="-6" Y="0" Z="3" S="-112" T="489" R="33" G="119" B="228" A="255"/>
<Vtx X="-7" Y="0" Z="4" S="-128" T="495" R="10" G="89" B="166" A="255"/>
<Vtx X="-6" Y="0" Z="-11" S="-112" T="292" R="82" G="97" B="6" A="255"/>
<Vtx X="-6" Y="0" Z="-17" S="-113" T="200" R="2" G="127" B="6" A="255"/>
<Vtx X="-5" Y="0" Z="-17" S="-99" T="204" R="71" G="99" B="36" A="255"/>
<Vtx X="-4" Y="1" Z="-20" S="-76" T="159" R="251" G="126" B="18" A="255"/>
<Vtx X="-3" Y="1" Z="-20" S="-66" T="167" R="70" G="82" B="68" A="255"/>
<Vtx X="-4" Y="1" Z="-20" S="-76" T="159" R="251" G="126" B="18" A="255"/>
<Vtx X="-5" Y="0" Z="-17" S="-99" T="204" R="71" G="99" B="36" A="255"/>
<Vtx X="-2" Y="1" Z="-21" S="-52" T="144" R="89" G="83" B="38" A="255"/>
<Vtx X="-2" Y="1" Z="-22" S="-60" T="134" R="155" G="77" B="11" A="255"/>
<Vtx X="-3" Y="3" Z="-26" S="-62" T="68" R="71" G="66" B="82" A="255"/>
<Vtx X="-4" Y="1" Z="-20" S="-80" T="158" R="199" G="109" B="224" A="255"/>
<Vtx X="-6" Y="0" Z="-17" S="-113" T="200" R="2" G="127" B="6" A="255"/>
<Vtx X="-7" Y="0" Z="-17" S="-117" T="199" R="170" G="85" B="216" A="255"/>
<Vtx X="-8" Y="0" Z="-10" S="-132" T="297" R="165" G="88" B="250" A="255"/>
<Vtx X="-7" Y="0" Z="4" S="-128" T="495" R="10" G="89" B="166" A="255"/>
<Vtx X="-8" Y="0" Z="4" S="-132" T="494" R="144" G="45" B="216" A="255"/>
<Vtx X="-3" Y="3" Z="-26" S="-68" T="-341" R="71" G="66" B="82" A="255"/>
<Vtx X="3" Y="5" Z="-28" S="-89" T="-415" R="73" G="100" B="227" A="255"/>
<Vtx X="-3" Y="5" Z="-28" S="-89" T="-331" R="183" G="100" B="227" A="255"/>
<Vtx X="2" Y="3" Z="-26" S="-68" T="-404" R="185" G="66" B="82" A="255"/>
<Vtx X="-3" Y="2" Z="-27" S="-55" T="-341" R="81" G="50" B="84" A="255"/>
<Vtx X="2" Y="3" Z="-26" S="-68" T="-404" R="185" G="66" B="82" A="255"/>
<Vtx X="-3" Y="3" Z="-26" S="-68" T="-341" R="71" G="66" B="82" A="255"/>
<Vtx X="2" Y="2" Z="-27" S="-55" T="-404" R="175" G="50" B="84" A="255"/>
<Vtx X="3" Y="1" Z="-20" S="255" T="70" R="57" G="109" B="224" A="255"/>
<Vtx X="3" Y="0" Z="-21" S="246" T="76" R="70" G="191" B="172" A="255"/>
<Vtx X="2" Y="1" Z="-22" S="261" T="94" R="101" G="77" B="11" A="255"/>
<Vtx X="6" Y="0" Z="-17" S="242" T="29" R="89" G="177" B="211" A="255"/>
<Vtx X="6" Y="0" Z="-17" S="252" T="29" R="86" G="85" B="216" A="255"/>
<Vtx X="7" Y="0" Z="-10" S="251" T="-70" R="91" G="88" B="250" A="255"/>
<Vtx X="7" Y="-1" Z="-10" S="239" T="-70" R="95" G="172" B="248" A="255"/>
<Vtx X="7" Y="0" Z="4" S="248" T="-267" R="112" G="45" B="216" A="255"/>
<Vtx X="7" Y="-1" Z="5" S="231" T="-279" R="82" G="185" B="66" A="255"/>
<Vtx X="7" Y="4" Z="5" S="294" T="-278" R="118" G="227" B="38" A="255"/>
<Vtx X="7" Y="4" Z="4" S="302" T="-268" R="65" G="75" B="176" A="255"/>
<Vtx X="7" Y="4" Z="11" S="302" T="-372" R="71" G="88" B="58" A="255"/>
<Vtx X="7" Y="4" Z="11" S="302" T="-372" R="71" G="88" B="58" A="255"/>
<Vtx X="7" Y="4" Z="11" S="295" T="-373" R="85" G="196" B="73" A="255"/>
<Vtx X="7" Y="4" Z="5" S="294" T="-278" R="118" G="227" B="38" A="255"/>
<Vtx X="-6" Y="-1" Z="3" S="-343" T="-272" R="75" G="78" B="190" A="255"/>
<Vtx X="-6" Y="0" Z="3" S="-330" T="-272" R="33" G="119" B="228" A="255"/>
<Vtx X="0" Y="0" Z="4" S="-331" T="-355" R="0" G="104" B="183" A="255"/>
<Vtx X="6" Y="-1" Z="3" S="-343" T="-438" R="181" G="78" B="190" A="255"/>
<Vtx X="6" Y="0" Z="3" S="-330" T="-438" R="223" G="119" B="228" A="255"/>
<Vtx X="2" Y="1" Z="-22" S="-2" T="134" R="101" G="77" B="11" A="255"/>
<Vtx X="3" Y="1" Z="-20" S="14" T="159" R="5" G="126" B="18" A="255"/>
<Vtx X="3" Y="1" Z="-20" S="18" T="158" R="57" G="109" B="224" A="255"/>
<Vtx X="6" Y="0" Z="-17" S="51" T="200" R="254" G="127" B="6" A="255"/>
<Vtx X="6" Y="0" Z="-17" S="55" T="199" R="86" G="85" B="216" A="255"/>
<Vtx X="7" Y="0" Z="-10" S="70" T="297" R="91" G="88" B="250" A="255"/>
<Vtx X="7" Y="0" Z="4" S="65" T="495" R="246" G="89" B="166" A="255"/>
<Vtx X="7" Y="0" Z="4" S="70" T="494" R="112" G="45" B="216" A="255"/>
<Vtx X="7" Y="4" Z="4" S="264" T="101" R="242" G="91" B="168" A="255"/>
<Vtx X="7" Y="4" Z="11" S="363" T="100" R="71" G="88" B="58" A="255"/>
<Vtx X="7" Y="4" Z="4" S="263" T="97" R="65" G="75" B="176" A="255"/>
<Vtx X="7" Y="4" Z="11" S="364" T="105" R="4" G="95" B="85" A="255"/>
<Vtx X="-7" Y="4" Z="4" S="264" T="300" R="14" G="91" B="168" A="255"/>
<Vtx X="-7" Y="4" Z="11" S="364" T="296" R="252" G="95" B="85" A="255"/>
<Vtx X="-7" Y="4" Z="11" S="363" T="301" R="185" G="88" B="58" A="255"/>
<Vtx X="-8" Y="4" Z="4" S="263" T="304" R="191" G="75" B="176" A="255"/>
<Vtx X="7" Y="4" Z="5" S="-59" T="-509" R="82" G="187" B="69" A="255"/>
<Vtx X="7" Y="4" Z="11" S="-64" T="-416" R="85" G="196" B="73" A="255"/>
<Vtx X="7" Y="4" Z="11" S="-59" T="-415" R="53" G="243" B="115" A="255"/>
<Vtx X="7" Y="4" Z="5" S="-64" T="-510" R="118" G="227" B="38" A="255"/>
<Vtx X="2" Y="-11" Z="11" S="415" T="370" R="19" G="169" B="91" A="255"/>
<Vtx X="0" Y="-5" Z="11" S="327" T="391" R="0" G="10" B="127" A="255"/>
<Vtx X="0" Y="-11" Z="11" S="415" T="391" R="0" G="146" B="64" A="255"/>
<Vtx X="7" Y="-9" Z="11" S="385" T="304" R="84" G="207" B="82" A="255"/>
<Vtx X="7" Y="-9" Z="11" S="385" T="304" R="84" G="207" B="82" A="255"/>
<Vtx X="7" Y="0" Z="11" S="263" T="305" R="102" G="218" B="66" A="255"/>
<Vtx X="0" Y="-5" Z="11" S="327" T="391" R="0" G="10" B="127" A="255"/>
<Vtx X="0" Y="0" Z="11" S="263" T="400" R="0" G="205" B="116" A="255"/>
<Vtx X="-4" Y="0" Z="-21" S="379" T="72" R="182" G="215" B="161" A="255"/>
<Vtx X="-4" Y="0" Z="-21" S="375" T="72" R="186" G="191" B="172" A="255"/>
<Vtx X="-2" Y="1" Z="-22" S="391" T="94" R="155" G="77" B="11" A="255"/>
<Vtx X="-6" Y="0" Z="-17" S="351" T="18" R="175" G="166" B="218" A="255"/>
<Vtx X="-7" Y="0" Z="-17" S="346" T="18" R="167" G="177" B="211" A="255"/>
<Vtx X="-8" Y="-1" Z="-10" S="349" T="-81" R="161" G="172" B="248" A="255"/>
<Vtx X="-7" Y="-1" Z="-10" S="354" T="-81" R="165" G="168" B="248" A="255"/>
<Vtx X="-8" Y="-1" Z="5" S="386" T="-287" R="174" G="185" B="66" A="255"/>
<Vtx X="-7" Y="-1" Z="5" S="391" T="-287" R="138" G="226" B="35" A="255"/>
<Vtx X="-2" Y="1" Z="-21" S="448" T="16" R="89" G="83" B="38" A="255"/>
<Vtx X="-3" Y="2" Z="-27" S="458" T="94" R="81" G="50" B="84" A="255"/>
<Vtx X="-3" Y="3" Z="-26" S="471" T="93" R="71" G="66" B="82" A="255"/>
<Vtx X="-2" Y="1" Z="-21" S="448" T="16" R="89" G="83" B="38" A="255"/>
<Vtx X="-2" Y="0" Z="-21" S="435" T="17" R="71" G="93" B="49" A="255"/>
<Vtx X="-3" Y="2" Z="-27" S="458" T="94" R="81" G="50" B="84" A="255"/>
<Vtx X="-3" Y="1" Z="-20" S="444" T="-6" R="70" G="82" B="68" A="255"/>
<Vtx X="-3" Y="0" Z="-20" S="431" T="-6" R="68" G="87" B="63" A="255"/>
<Vtx X="-5" Y="-1" Z="-17" S="431" T="-43" R="88" G="79" B="46" A="255"/>
<Vtx X="-5" Y="0" Z="-17" S="444" T="-43" R="71" G="99" B="36" A="255"/>
<Vtx X="-6" Y="-1" Z="-11" S="439" T="-130" R="92" G="87" B="7" A="255"/>
<Vtx X="-6" Y="0" Z="-11" S="452" T="-131" R="82" G="97" B="6" A="255"/>
<Vtx X="-6" Y="-1" Z="3" S="458" T="-327" R="75" G="78" B="190" A="255"/>
<Vtx X="-6" Y="0" Z="3" S="471" T="-327" R="33" G="119" B="228" A="255"/>
<Vtx X="-4" Y="1" Z="-20" S="23" T="-373" R="199" G="109" B="224" A="255"/>
<Vtx X="-2" Y="1" Z="-22" S="29" T="-396" R="155" G="77" B="11" A="255"/>
<Vtx X="-4" Y="0" Z="-21" S="14" T="-379" R="186" G="191" B="172" A="255"/>
<Vtx X="-7" Y="0" Z="-17" S="10" T="-333" R="167" G="177" B="211" A="255"/>
<Vtx X="-7" Y="0" Z="-17" S="20" T="-333" R="170" G="85" B="216" A="255"/>
<Vtx X="-8" Y="0" Z="-10" S="19" T="-235" R="165" G="88" B="250" A="255"/>
<Vtx X="-7" Y="0" Z="-17" S="20" T="-333" R="170" G="85" B="216" A="255"/>
<Vtx X="-7" Y="0" Z="-17" S="10" T="-333" R="167" G="177" B="211" A="255"/>
<Vtx X="-8" Y="-1" Z="-10" S="7" T="-235" R="161" G="172" B="248" A="255"/>
<Vtx X="-8" Y="0" Z="4" S="16" T="-37" R="144" G="45" B="216" A="255"/>
<Vtx X="-8" Y="-1" Z="5" S="-1" T="-26" R="174" G="185" B="66" A="255"/>
<Vtx X="-8" Y="4" Z="5" S="62" T="-26" R="138" G="227" B="38" A="255"/>
<Vtx X="-8" Y="4" Z="4" S="70" T="-36" R="191" G="75" B="176" A="255"/>
<Vtx X="-7" Y="4" Z="11" S="70" T="67" R="185" G="88" B="58" A="255"/>
<Vtx X="-7" Y="4" Z="11" S="63" T="68" R="171" G="196" B="73" A="255"/>
<Vtx X="-7" Y="4" Z="11" S="-348" T="-366" R="171" G="196" B="73" A="255"/>
<Vtx X="-7" Y="4" Z="5" S="-343" T="-273" R="174" G="187" B="69" A="255"/>
<Vtx X="-7" Y="4" Z="11" S="-343" T="-367" R="203" G="243" B="115" A="255"/>
<Vtx X="-8" Y="4" Z="5" S="-348" T="-272" R="138" G="227" B="38" A="255"/>
<Vtx X="-2" Y="-11" Z="11" S="415" T="430" R="237" G="169" B="91" A="255"/>
<Vtx X="0" Y="-11" Z="11" S="415" T="409" R="0" G="146" B="64" A="255"/>
<Vtx X="0" Y="-5" Z="11" S="327" T="409" R="0" G="10" B="127" A="255"/>
<Vtx X="-7" Y="-9" Z="11" S="385" T="495" R="172" G="207" B="82" A="255"/>
<Vtx X="-7" Y="0" Z="11" S="263" T="495" R="154" G="218" B="66" A="255"/>
<Vtx X="0" Y="0" Z="11" S="263" T="400" R="0" G="205" B="116" A="255"/>
<Vtx X="7" Y="0" Z="12" S="230" T="-327" R="100" G="221" B="70" A="255"/>
<Vtx X="0" Y="0" Z="12" S="230" T="-428" R="0" G="215" B="120" A="255"/>
<Vtx X="7" Y="0" Z="11" S="221" T="-332" R="102" G="218" B="66" A="255"/>
<Vtx X="0" Y="0" Z="11" S="221" T="-428" R="0" G="205" B="116" A="255"/>
<Vtx X="-7" Y="0" Z="11" S="221" T="-523" R="154" G="218" B="66" A="255"/>
<Vtx X="-7" Y="0" Z="12" S="230" T="-529" R="156" G="221" B="70" A="255"/>
<Vtx X="-2" Y="2" Z="-28" S="-89" T="-403" R="227" G="191" B="151" A="255"/>
<Vtx X="-3" Y="2" Z="-28" S="-96" T="-415" R="163" G="233" B="172" A="255"/>
<Vtx X="-3" Y="5" Z="-28" S="-132" T="-415" R="183" G="100" B="227" A="255"/>
<Vtx X="2" Y="2" Z="-28" S="-89" T="-343" R="29" G="191" B="151" A="255"/>
<Vtx X="-3" Y="5" Z="-28" S="-132" T="-415" R="183" G="100" B="227" A="255"/>
<Vtx X="3" Y="5" Z="-28" S="-132" T="-331" R="73" G="100" B="227" A="255"/>
<Vtx X="2" Y="2" Z="-28" S="-89" T="-343" R="29" G="191" B="151" A="255"/>
<Vtx X="3" Y="2" Z="-28" S="-96" T="-331" R="93" G="233" B="172" A="255"/>
<Vtx X="-1" Y="3" Z="11" S="-510" T="-398" R="0" G="21" B="125" A="255"/>
<Vtx X="-1" Y="2" Z="12" S="-489" T="-398" R="0" G="21" B="125" A="255"/>
<Vtx X="0" Y="2" Z="12" S="-489" T="-421" R="0" G="21" B="125" A="255"/>
<Vtx X="0" Y="3" Z="11" S="-510" T="-421" R="0" G="21" B="125" A="255"/>
<Vtx X="7" Y="4" Z="4" S="364" T="300" R="242" G="91" B="168" A="255"/>
<Vtx X="7" Y="4" Z="4" S="364" T="304" R="65" G="75" B="176" A="255"/>
<Vtx X="7" Y="0" Z="4" S="418" T="304" R="112" G="45" B="216" A="255"/>
<Vtx X="7" Y="0" Z="4" S="418" T="300" R="246" G="89" B="166" A="255"/>
<Vtx X="0" Y="0" Z="4" S="418" T="201" R="0" G="90" B="166" A="255"/>
<Vtx X="-7" Y="4" Z="4" S="364" T="101" R="14" G="91" B="168" A="255"/>
<Vtx X="-7" Y="0" Z="4" S="418" T="101" R="10" G="89" B="166" A="255"/>
<Vtx X="-8" Y="0" Z="4" S="418" T="97" R="144" G="45" B="216" A="255"/>
<Vtx X="-8" Y="0" Z="4" S="418" T="97" R="144" G="45" B="216" A="255"/>
<Vtx X="-8" Y="4" Z="4" S="364" T="97" R="191" G="75" B="176" A="255"/>
<Vtx X="-7" Y="4" Z="4" S="364" T="101" R="14" G="91" B="168" A="255"/>
<Vtx X="-7" Y="0" Z="11" S="-189" T="486" R="154" G="218" B="66" A="255"/>
<Vtx X="-7" Y="0" Z="12" S="-180" T="495" R="156" G="221" B="70" A="255"/>
<Vtx X="-7" Y="4" Z="11" S="-132" T="486" R="203" G="243" B="115" A="255"/>
<Vtx X="-7" Y="4" Z="5" S="-137" T="392" R="174" G="187" B="69" A="255"/>
<Vtx X="-7" Y="-1" Z="5" S="-199" T="395" R="138" G="226" B="35" A="255"/>
<Vtx X="-7" Y="-9" Z="11" S="-311" T="488" R="172" G="207" B="82" A="255"/>
<Vtx X="-7" Y="-10" Z="4" S="-327" T="385" R="150" G="186" B="6" A="255"/>
<Vtx X="-7" Y="-1" Z="-10" S="-199" T="185" R="165" G="168" B="248" A="255"/>
<Vtx X="-7" Y="-10" Z="-10" S="-330" T="188" R="152" G="186" B="237" A="255"/>
<Vtx X="-6" Y="-8" Z="-17" S="-297" T="89" R="164" G="201" B="188" A="255"/>
<Vtx X="-6" Y="0" Z="-17" S="-200" T="87" R="175" G="166" B="218" A="255"/>
<Vtx X="-4" Y="-2" Z="-21" S="-216" T="29" R="175" G="253" B="159" A="255"/>
<Vtx X="-4" Y="0" Z="-21" S="-197" T="41" R="182" G="215" B="161" A="255"/>
<Vtx X="-2" Y="-1" Z="-22" S="-205" T="18" R="156" G="222" B="185" A="255"/>
<Vtx X="-4" Y="-2" Z="-21" S="-216" T="29" R="175" G="253" B="159" A="255"/>
<Vtx X="-4" Y="0" Z="-21" S="-197" T="41" R="182" G="215" B="161" A="255"/>
<Vtx X="-2" Y="1" Z="-22" S="-182" T="22" R="155" G="77" B="11" A="255"/>
<Vtx X="-3" Y="2" Z="-28" S="-168" T="-69" R="163" G="233" B="172" A="255"/>
<Vtx X="-3" Y="5" Z="-28" S="-132" T="-62" R="183" G="100" B="227" A="255"/>
<Vtx X="-2" Y="-2" Z="-22" S="-313" T="-419" R="232" G="199" B="145" A="255"/>
<Vtx X="2" Y="-9" Z="-17" S="-213" T="-360" R="21" G="160" B="176" A="255"/>
<Vtx X="-3" Y="-9" Z="-17" S="-213" T="-423" R="235" G="160" B="176" A="255"/>
<Vtx X="2" Y="-2" Z="-22" S="-313" T="-360" R="24" G="199" B="145" A="255"/>
<Vtx X="-2" Y="-1" Z="-22" S="-326" T="-412" R="227" G="170" B="168" A="255"/>
<Vtx X="-2" Y="-1" Z="-22" S="-330" T="-419" R="156" G="222" B="185" A="255"/>
<Vtx X="-4" Y="-2" Z="-21" S="-319" T="-435" R="175" G="253" B="159" A="255"/>
<Vtx X="-6" Y="-8" Z="-17" S="-237" T="-475" R="164" G="201" B="188" A="255"/>
<Vtx X="1" Y="-1" Z="-22" S="-326" T="-366" R="29" G="170" B="168" A="255"/>
<Vtx X="2" Y="-1" Z="-22" S="-330" T="-359" R="100" G="222" B="185" A="255"/>
<Vtx X="2" Y="-2" Z="-22" S="-313" T="-360" R="24" G="199" B="145" A="255"/>
<Vtx X="2" Y="-1" Z="-22" S="-330" T="-359" R="100" G="222" B="185" A="255"/>
<Vtx X="3" Y="-2" Z="-21" S="-319" T="-343" R="81" G="253" B="159" A="255"/>
<Vtx X="6" Y="-8" Z="-17" S="-237" T="-307" R="92" G="201" B="188" A="255"/>
<Vtx X="2" Y="-9" Z="-17" S="-213" T="-360" R="21" G="160" B="176" A="255"/>
</Vertex>
@@ -0,0 +1,128 @@
<Vertex Version="0">
<Vtx X="0" Y="19" Z="-1" S="-529" T="-189" R="0" G="130" B="15" A="255"/>
<Vtx X="8" Y="17" Z="-3" S="-493" T="-308" R="93" G="215" B="77" A="255"/>
<Vtx X="8" Y="19" Z="-1" S="-529" T="-308" R="105" G="193" B="33" A="255"/>
<Vtx X="0" Y="17" Z="-3" S="-493" T="-190" R="0" G="195" B="112" A="255"/>
<Vtx X="-9" Y="19" Z="-1" S="-529" T="-71" R="151" G="193" B="33" A="255"/>
<Vtx X="-9" Y="17" Z="-3" S="-493" T="-71" R="163" G="215" B="77" A="255"/>
<Vtx X="0" Y="13" Z="-4" S="-444" T="-190" R="0" G="233" B="125" A="255"/>
<Vtx X="-9" Y="13" Z="-4" S="-444" T="-72" R="159" G="241" B="81" A="255"/>
<Vtx X="0" Y="9" Z="-4" S="-390" T="-190" R="0" G="28" B="124" A="255"/>
<Vtx X="-9" Y="9" Z="-4" S="-390" T="-72" R="160" G="18" B="82" A="255"/>
<Vtx X="0" Y="6" Z="-3" S="-350" T="-190" R="0" G="86" B="94" A="255"/>
<Vtx X="-9" Y="6" Z="-3" S="-350" T="-72" R="156" G="53" B="58" A="255"/>
<Vtx X="8" Y="6" Z="-3" S="-350" T="-308" R="100" G="53" B="58" A="255"/>
<Vtx X="8" Y="9" Z="-4" S="-390" T="-309" R="96" G="18" B="82" A="255"/>
<Vtx X="8" Y="13" Z="-4" S="-444" T="-309" R="97" G="241" B="81" A="255"/>
<Vtx X="-9" Y="19" Z="-2" S="-172" T="-520" R="158" G="20" B="177" A="255"/>
<Vtx X="-9" Y="17" Z="-3" S="-181" T="-481" R="163" G="215" B="77" A="255"/>
<Vtx X="-9" Y="19" Z="-1" S="-156" T="-520" R="151" G="193" B="33" A="255"/>
<Vtx X="-9" Y="17" Z="-3" S="-190" T="-485" R="168" G="39" B="174" A="255"/>
<Vtx X="-9" Y="13" Z="-4" S="-202" T="-430" R="159" G="241" B="81" A="255"/>
<Vtx X="-9" Y="13" Z="-5" S="-213" T="-430" R="172" G="17" B="162" A="255"/>
<Vtx X="-9" Y="9" Z="-5" S="-211" T="-375" R="171" G="236" B="163" A="255"/>
<Vtx X="-9" Y="9" Z="-4" S="-201" T="-375" R="160" G="18" B="82" A="255"/>
<Vtx X="-9" Y="6" Z="-3" S="-191" T="-328" R="173" G="195" B="181" A="255"/>
<Vtx X="-9" Y="6" Z="-3" S="-183" T="-334" R="156" G="53" B="58" A="255"/>
<Vtx X="-9" Y="5" Z="-2" S="-171" T="-313" R="169" G="174" B="212" A="255"/>
<Vtx X="-9" Y="5" Z="-1" S="-156" T="-319" R="158" G="79" B="20" A="255"/>
<Vtx X="-9" Y="4" Z="-1" S="-156" T="-307" R="171" G="163" B="239" A="255"/>
<Vtx X="0" Y="19" Z="-2" S="-330" T="-189" R="0" G="31" B="133" A="255"/>
<Vtx X="-9" Y="17" Z="-3" S="-297" T="-306" R="168" G="39" B="174" A="255"/>
<Vtx X="-9" Y="19" Z="-2" S="-330" T="-307" R="158" G="20" B="177" A="255"/>
<Vtx X="0" Y="19" Z="-2" S="-330" T="-189" R="0" G="31" B="133" A="255"/>
<Vtx X="0" Y="17" Z="-3" S="-297" T="-188" R="0" G="54" B="141" A="255"/>
<Vtx X="-9" Y="17" Z="-3" S="-297" T="-306" R="168" G="39" B="174" A="255"/>
<Vtx X="8" Y="19" Z="-2" S="-330" T="-70" R="98" G="20" B="177" A="255"/>
<Vtx X="8" Y="17" Z="-3" S="-297" T="-70" R="88" G="39" B="174" A="255"/>
<Vtx X="0" Y="13" Z="-5" S="-243" T="-187" R="0" G="22" B="131" A="255"/>
<Vtx X="8" Y="13" Z="-5" S="-243" T="-69" R="84" G="17" B="162" A="255"/>
<Vtx X="0" Y="9" Z="-5" S="-189" T="-188" R="0" G="229" B="132" A="255"/>
<Vtx X="8" Y="9" Z="-5" S="-189" T="-69" R="85" G="236" B="163" A="255"/>
<Vtx X="8" Y="6" Z="-3" S="-144" T="-70" R="83" G="195" B="181" A="255"/>
<Vtx X="0" Y="6" Z="-3" S="-144" T="-188" R="0" G="176" B="157" A="255"/>
<Vtx X="-9" Y="6" Z="-3" S="-144" T="-306" R="173" G="195" B="181" A="255"/>
<Vtx X="-9" Y="9" Z="-5" S="-189" T="-306" R="171" G="236" B="163" A="255"/>
<Vtx X="-9" Y="13" Z="-5" S="-243" T="-306" R="172" G="17" B="162" A="255"/>
<Vtx X="0" Y="6" Z="-3" S="455" T="215" R="0" G="176" B="157" A="255"/>
<Vtx X="-9" Y="5" Z="-2" S="433" T="333" R="169" G="174" B="212" A="255"/>
<Vtx X="-9" Y="6" Z="-3" S="455" T="333" R="173" G="195" B="181" A="255"/>
<Vtx X="0" Y="5" Z="-2" S="433" T="215" R="0" G="144" B="195" A="255"/>
<Vtx X="8" Y="6" Z="-3" S="455" T="97" R="83" G="195" B="181" A="255"/>
<Vtx X="8" Y="5" Z="-2" S="433" T="97" R="87" G="174" B="212" A="255"/>
<Vtx X="8" Y="4" Z="-1" S="418" T="97" R="85" G="163" B="239" A="255"/>
<Vtx X="0" Y="4" Z="-1" S="418" T="215" R="0" G="155" B="179" A="255"/>
<Vtx X="-9" Y="4" Z="-1" S="418" T="333" R="171" G="163" B="239" A="255"/>
<Vtx X="8" Y="4" Z="-1" S="358" T="-499" R="85" G="163" B="239" A="255"/>
<Vtx X="8" Y="5" Z="-2" S="344" T="-494" R="87" G="174" B="212" A="255"/>
<Vtx X="8" Y="5" Z="-1" S="358" T="-488" R="98" G="79" B="20" A="255"/>
<Vtx X="8" Y="6" Z="-3" S="332" T="-472" R="100" G="53" B="58" A="255"/>
<Vtx X="8" Y="6" Z="-3" S="323" T="-478" R="83" G="195" B="181" A="255"/>
<Vtx X="8" Y="9" Z="-4" S="314" T="-431" R="96" G="18" B="82" A="255"/>
<Vtx X="8" Y="9" Z="-5" S="304" T="-432" R="85" G="236" B="163" A="255"/>
<Vtx X="8" Y="13" Z="-4" S="312" T="-376" R="97" G="241" B="81" A="255"/>
<Vtx X="8" Y="9" Z="-4" S="314" T="-431" R="96" G="18" B="82" A="255"/>
<Vtx X="8" Y="9" Z="-5" S="304" T="-432" R="85" G="236" B="163" A="255"/>
<Vtx X="8" Y="13" Z="-5" S="302" T="-377" R="84" G="17" B="162" A="255"/>
<Vtx X="8" Y="17" Z="-3" S="324" T="-321" R="88" G="39" B="174" A="255"/>
<Vtx X="8" Y="17" Z="-3" S="334" T="-325" R="93" G="215" B="77" A="255"/>
<Vtx X="8" Y="19" Z="-2" S="342" T="-287" R="98" G="20" B="177" A="255"/>
<Vtx X="8" Y="19" Z="-1" S="358" T="-287" R="105" G="193" B="33" A="255"/>
<Vtx X="0" Y="6" Z="-3" S="455" T="215" R="0" G="86" B="94" A="255"/>
<Vtx X="8" Y="5" Z="-1" S="483" T="97" R="98" G="79" B="20" A="255"/>
<Vtx X="8" Y="6" Z="-3" S="455" T="97" R="100" G="53" B="58" A="255"/>
<Vtx X="0" Y="5" Z="-1" S="483" T="215" R="0" G="125" B="236" A="255"/>
<Vtx X="-9" Y="6" Z="-3" S="455" T="333" R="156" G="53" B="58" A="255"/>
<Vtx X="-9" Y="5" Z="-1" S="483" T="333" R="158" G="79" B="20" A="255"/>
<Vtx X="0" Y="25" Z="-2" S="-407" T="-368" R="0" G="191" B="109" A="255"/>
<Vtx X="4" Y="24" Z="-3" S="-383" T="-427" R="96" G="254" B="83" A="255"/>
<Vtx X="4" Y="25" Z="-2" S="-407" T="-427" R="99" G="216" B="69" A="255"/>
<Vtx X="0" Y="24" Z="-3" S="-383" T="-368" R="0" G="252" B="127" A="255"/>
<Vtx X="-5" Y="25" Z="-2" S="-407" T="-309" R="157" G="216" B="69" A="255"/>
<Vtx X="-5" Y="24" Z="-3" S="-383" T="-309" R="160" G="254" B="83" A="255"/>
<Vtx X="0" Y="21" Z="-2" S="-348" T="-368" R="0" G="97" B="82" A="255"/>
<Vtx X="-5" Y="21" Z="-2" S="-348" T="-309" R="165" G="87" B="236" A="255"/>
<Vtx X="4" Y="21" Z="-2" S="-348" T="-427" R="91" G="85" B="231" A="255"/>
<Vtx X="0" Y="27" Z="-1" S="407" T="-388" R="0" G="51" B="140" A="255"/>
<Vtx X="-5" Y="25" Z="-3" S="422" T="-447" R="174" G="49" B="172" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="407" T="-447" R="153" G="30" B="188" A="255"/>
<Vtx X="0" Y="25" Z="-3" S="422" T="-388" R="0" G="65" B="147" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="407" T="-329" R="103" G="30" B="188" A="255"/>
<Vtx X="4" Y="25" Z="-3" S="422" T="-329" R="82" G="49" B="172" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="245" T="-456" R="153" G="30" B="188" A="255"/>
<Vtx X="-5" Y="25" Z="-2" S="240" T="-439" R="157" G="216" B="69" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="253" T="-457" R="154" G="185" B="27" A="255"/>
<Vtx X="-5" Y="25" Z="-3" S="232" T="-437" R="174" G="49" B="172" A="255"/>
<Vtx X="-5" Y="24" Z="-3" S="239" T="-413" R="160" G="254" B="83" A="255"/>
<Vtx X="-5" Y="24" Z="-3" S="231" T="-412" R="171" G="3" B="161" A="255"/>
<Vtx X="-5" Y="21" Z="-3" S="243" T="-380" R="172" G="209" B="172" A="255"/>
<Vtx X="-5" Y="21" Z="-2" S="251" T="-380" R="165" G="87" B="236" A="255"/>
<Vtx X="-4" Y="21" Z="-2" S="253" T="-373" R="243" G="222" B="134" A="255"/>
<Vtx X="0" Y="27" Z="-1" S="391" T="-388" R="0" G="129" B="253" A="255"/>
<Vtx X="4" Y="25" Z="-2" S="407" T="-447" R="99" G="216" B="69" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="391" T="-447" R="102" G="185" B="27" A="255"/>
<Vtx X="0" Y="25" Z="-2" S="407" T="-388" R="0" G="191" B="109" A="255"/>
<Vtx X="-5" Y="27" Z="-1" S="391" T="-329" R="154" G="185" B="27" A="255"/>
<Vtx X="-5" Y="25" Z="-2" S="407" T="-329" R="157" G="216" B="69" A="255"/>
<Vtx X="0" Y="25" Z="-3" S="-473" T="-368" R="0" G="65" B="147" A="255"/>
<Vtx X="-5" Y="24" Z="-3" S="-449" T="-427" R="171" G="3" B="161" A="255"/>
<Vtx X="-5" Y="25" Z="-3" S="-473" T="-427" R="174" G="49" B="172" A="255"/>
<Vtx X="0" Y="24" Z="-3" S="-449" T="-368" R="0" G="4" B="129" A="255"/>
<Vtx X="4" Y="25" Z="-3" S="-473" T="-309" R="82" G="49" B="172" A="255"/>
<Vtx X="4" Y="24" Z="-3" S="-449" T="-309" R="85" G="3" B="161" A="255"/>
<Vtx X="4" Y="21" Z="-3" S="-416" T="-309" R="84" G="209" B="173" A="255"/>
<Vtx X="-5" Y="21" Z="-3" S="-416" T="-427" R="172" G="209" B="172" A="255"/>
<Vtx X="4" Y="21" Z="-2" S="-407" T="-314" R="11" G="222" B="134" A="255"/>
<Vtx X="-4" Y="21" Z="-2" S="-407" T="-424" R="243" G="222" B="134" A="255"/>
<Vtx X="4" Y="21" Z="-2" S="-6" T="-408" R="91" G="85" B="231" A="255"/>
<Vtx X="4" Y="21" Z="-2" S="-5" T="-417" R="11" G="222" B="134" A="255"/>
<Vtx X="4" Y="21" Z="-3" S="-15" T="-408" R="84" G="209" B="173" A="255"/>
<Vtx X="4" Y="24" Z="-3" S="-19" T="-375" R="96" G="254" B="83" A="255"/>
<Vtx X="4" Y="24" Z="-3" S="-27" T="-377" R="85" G="3" B="161" A="255"/>
<Vtx X="4" Y="25" Z="-3" S="-26" T="-351" R="82" G="49" B="172" A="255"/>
<Vtx X="4" Y="25" Z="-3" S="-26" T="-351" R="82" G="49" B="172" A="255"/>
<Vtx X="4" Y="25" Z="-2" S="-18" T="-349" R="99" G="216" B="69" A="255"/>
<Vtx X="4" Y="24" Z="-3" S="-19" T="-375" R="96" G="254" B="83" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="-13" T="-333" R="103" G="30" B="188" A="255"/>
<Vtx X="4" Y="27" Z="-1" S="-5" T="-331" R="102" G="185" B="27" A="255"/>
</Vertex>
@@ -0,0 +1,20 @@
<DisplayList Version="0">
<PipeSync/>
<SetCombineLERP A0="G_CCMUX_1" B0="G_CCMUX_TEXEL0" C0="G_CCMUX_PRIMITIVE" D0="G_CCMUX_TEXEL0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_SHADE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_2CYCLE="1"/>
<PipelineMode G_PM_NPRIMITIVE="1"/>
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
<TileSync/>
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
<LoadSync/>
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
<PipeSync/>
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
<SetPrimColor M="0" L="0" R="158" G="66" B="3" A="255"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,20 @@
<DisplayList Version="0">
<PipeSync/>
<SetCombineLERP A0="G_CCMUX_1" B0="G_CCMUX_TEXEL0" C0="G_CCMUX_PRIMITIVE" D0="G_CCMUX_TEXEL0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_SHADE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_2CYCLE="1"/>
<PipelineMode G_PM_NPRIMITIVE="1"/>
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
<TileSync/>
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
<LoadSync/>
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
<PipeSync/>
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
<SetPrimColor M="0" L="0" R="124" G="127" B="126" A="255"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,20 @@
<DisplayList Version="0">
<PipeSync/>
<SetCombineLERP A0="G_CCMUX_1" B0="G_CCMUX_TEXEL0" C0="G_CCMUX_PRIMITIVE" D0="G_CCMUX_TEXEL0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_SHADE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_2CYCLE="1"/>
<PipelineMode G_PM_NPRIMITIVE="1"/>
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
<TileSync/>
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
<LoadSync/>
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
<PipeSync/>
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
<SetPrimColor M="0" L="0" R="255" G="7" B="0" A="255"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,20 @@
<DisplayList Version="0">
<PipeSync/>
<SetCombineLERP A0="G_CCMUX_TEXEL0" B0="G_CCMUX_0" C0="G_CCMUX_SHADE" D0="G_CCMUX_0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_PRIMITIVE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_2CYCLE="1"/>
<PipelineMode G_PM_NPRIMITIVE="1"/>
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
<TileSync/>
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
<LoadSync/>
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
<PipeSync/>
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
<SetPrimColor M="0" L="0" R="88" G="46" B="16" A="255"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,8 @@
<DisplayList Version="0">
<PipeSync/>
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_1CYCLE="1"/>
<PipelineMode G_PM_1PRIMITIVE="1"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,8 @@
<DisplayList Version="0">
<PipeSync/>
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_1CYCLE="1"/>
<PipelineMode G_PM_1PRIMITIVE="1"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,8 @@
<DisplayList Version="0">
<PipeSync/>
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_1CYCLE="1"/>
<PipelineMode G_PM_1PRIMITIVE="1"/>
<EndDisplayList/>
</DisplayList>
@@ -0,0 +1,8 @@
<DisplayList Version="0">
<PipeSync/>
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_1CYCLE="1"/>
<PipelineMode G_PM_1PRIMITIVE="1"/>
<EndDisplayList/>
</DisplayList>
Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

+15 -9
View File
@@ -8,16 +8,22 @@ import struct
import subprocess
import argparse
def BuildOTR(xmlPath, rom, zapd_exe=None):
def BuildOTR(xmlPath, rom, zapd_exe=None, genHeaders=None):
shutil.copytree("assets", "Extract/assets")
if not zapd_exe:
zapd_exe = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPDTR/ZAPD.out"
exec_cmd = [zapd_exe, "ed", "-i", xmlPath, "-b", rom, "-fl", "CFG/filelists",
"-o", "placeholder", "-osf", "placeholder", "-gsf", "1",
"-rconf", "CFG/Config.xml", "-se", "OTR", "--otrfile",
"oot-mq.otr" if Z64Rom.isMqRom(rom) else "oot.otr"]
"-o", "placeholder", "-osf", "placeholder", "-rconf", "CFG/Config.xml"]
# generate headers, but not otrs by excluding the otr exporter
if genHeaders:
exec_cmd.extend(["-gsf", "1"])
else:
# generate otrs, but not headers
exec_cmd.extend(["-gsf", "0", "-se", "OTR", "--otrfile",
"oot-mq.otr" if Z64Rom.isMqRom(rom) else "oot.otr"])
print(exec_cmd)
exitValue = subprocess.call(exec_cmd)
@@ -32,17 +38,17 @@ def main():
parser.add_argument("-z", "--zapd", help="Path to ZAPD executable", dest="zapd_exe", type=str)
parser.add_argument("rom", help="Path to the rom", type=str, nargs="?")
parser.add_argument("--non-interactive", help="Runs the script non-interactively for use in build scripts.", dest="non_interactive", action="store_true")
parser.add_argument("-v", "--verbose", help="Display rom's header checksums and their corresponding xml folder", dest="verbose", action="store_true")
parser.add_argument("--gen-headers", help="Generate source headers to be checked in", dest="gen_headers", action="store_true")
args = parser.parse_args()
rom_paths = [ args.rom ] if args.rom else rom_chooser.chooseROM(args.non_interactive)
for rom_path in rom_paths:
rom = Z64Rom(rom_path)
roms = [ Z64Rom(args.rom) ] if args.rom else rom_chooser.chooseROM(args.verbose, args.non_interactive)
for rom in roms:
if (os.path.exists("Extract")):
shutil.rmtree("Extract")
BuildOTR("../soh/assets/xml/" + rom.version.xml_ver + "/", rom_path, zapd_exe=args.zapd_exe)
BuildOTR("../soh/assets/xml/" + rom.version.xml_ver + "/", rom.file_path, zapd_exe=args.zapd_exe, genHeaders=args.gen_headers)
if __name__ == "__main__":
main()
+19 -16
View File
@@ -2,12 +2,13 @@ import os, sys, glob
from rom_info import Z64Rom
def chooseROM(non_interactive=False):
def chooseROM(verbose=False, non_interactive=False):
roms = []
for file in glob.glob("*.z64"):
if Z64Rom.isValidRom(file):
roms.append(file)
rom = Z64Rom(file)
if rom.is_valid:
roms.append(rom)
if not (roms):
print("Error: No roms located, place one in the OTRExporter directory", file=os.sys.stderr)
@@ -17,27 +18,29 @@ def chooseROM(non_interactive=False):
return roms
if non_interactive:
romsToExtract = []
foundMq = False
foundOot = False
mq_rom = None
non_mq_rom = None
for rom in roms:
isMq = Z64Rom.isMqRom(rom)
if isMq and not foundMq:
romsToExtract.append(rom)
foundMq = True
elif not isMq and not foundOot:
romsToExtract.append(rom)
foundOot = True
return romsToExtract
if rom.isMq and mq_rom is None:
mq_rom = rom
elif not rom.isMq and non_mq_rom is None:
non_mq_rom = rom
return [rom for rom in [non_mq_rom, mq_rom] if rom is not None]
print(str(len(roms))+ " roms found, please select one by pressing 1-"+str(len(roms)))
print(f"{len(roms)} roms found, please select one by pressing 1-{len(roms)}")
print()
for i in range(len(roms)):
print(str(i+1)+ ". " + roms[i])
print(f"[{i+1:>2d}] {roms[i].file_path}")
if verbose:
print(f" Checksum: {roms[i].checksum.value}, Version XML: {roms[i].version.xml_ver}")
print()
while(1):
try:
selection = int(input())
except KeyboardInterrupt:
sys.exit(1)
except:
print("Bad input. Try again with the number keys.")
continue
+1 -1
View File
@@ -59,7 +59,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE
.
)
INSTALL(TARGETS OTRGui DESTINATION . COMPONENT ship)
INSTALL(TARGETS OTRGui DESTINATION . COMPONENT ship OPTIONAL)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/assets
DESTINATION .
COMPONENT ship
+4 -3
View File
@@ -67,7 +67,7 @@ void OTRGame::init(){
mat.shader = shader;
}
if((fs::exists("soh.exe") || fs::exists("soh.elf")) && !fs::exists("oot.otr")) {
if (fs::exists("soh.exe") || fs::exists("soh.elf")) {
hide_second_btn = true;
sohFolder = ".";
}
@@ -83,7 +83,8 @@ void ExtractRom()
result.error = NULLSTR;
if (result.error == NULLSTR) {
if (MoonUtils::exists("oot.otr")) MoonUtils::rm("oot.otr");
if (MoonUtils::exists("oot.otr") && !version.isMQ) MoonUtils::rm("oot.otr");
if (MoonUtils::exists("oot-mq.otr") && version.isMQ) MoonUtils::rm("oot-mq.otr");
if (MoonUtils::exists("Extract")) MoonUtils::rm("Extract");
MoonUtils::mkdir("Extract");
@@ -100,7 +101,7 @@ void ExtractRom()
}
void OTRGame::update(){
updateWorker(sohFolder);
updateWorker(sohFolder, version);
this->ModelRotation += 50 * GetFrameTime();
UpdateLightValues(shader, light);
@@ -56,90 +56,107 @@ RomVersion GetVersion(FILE* rom) {
version.crc = __bswap_32(version.crc);
switch (version.crc) {
case OOT_NTSC_10:
case OOT_NTSC_US_10:
version.version = "N64 NTSC 1.0";
version.listPath = "ntsc_oot.txt";
version.offset = OOT_OFF_NTSC_10;
version.isMQ = false;
break;
case OOT_NTSC_11:
case OOT_NTSC_US_11:
version.version = "N64 NTSC 1.1";
version.listPath = "ntsc_oot.txt";
version.offset = OOT_OFF_NTSC_11;
version.isMQ = false;
break;
case OOT_NTSC_12:
case OOT_NTSC_US_12:
version.version = "N64 NTSC 1.2";
version.listPath = "ntsc_oot.txt";
version.offset = OOT_OFF_NTSC_12;
version.isMQ = false;
break;
case OOT_PAL_10:
version.version = "N64 PAL 1.0";
version.listPath = "pal_oot.txt";
version.offset = OOT_OFF_PAL_10;
version.isMQ = false;
break;
case OOT_PAL_11:
version.version = "N64 PAL 1.1";
version.listPath = "pal_oot.txt";
version.offset = OOT_OFF_PAL_11;
version.isMQ = false;
break;
case OOT_NTSC_JP_GC:
version.version = "JP GameCube (MQ Disk)";
version.listPath = "gamecube.txt";
version.offset = OOT_OFF_JP_GC;
version.isMQ = true;
break;
case OOT_NTSC_JP_GC_CE:
version.version = "GameCube (Collectors Edition Disk)";
version.listPath = "gamecube.txt";
version.offset = OOT_OFF_JP_GC_CE;
version.isMQ = false;
break;
case OOT_NTSC_JP_MQ:
version.version = "JP Master Quest";
version.listPath = "gamecube.txt";
version.offset = OOT_OFF_JP_MQ;
version.isMQ = true;
break;
case OOT_NTSC_US_MQ:
version.version = "NTSC Master Quest";
version.listPath = "gamecube.txt";
version.offset = OOT_OFF_JP_MQ;
version.isMQ = true;
break;
case OOT_NTSC_US_GC:
version.version = "NTSC GameCube";
version.listPath = "gamecube.txt";
version.offset = OOT_OFF_US_MQ;
version.isMQ = true;
break;
case OOT_PAL_GC:
version.version = "PAL GameCube";
version.listPath = "gamecube_pal.txt";
version.offset = OOT_OFF_PAL_GC;
version.isMQ = false;
break;
case OOT_PAL_MQ:
version.version = "PAL Master Quest";
version.listPath = "gamecube_pal.txt";
version.offset = OOT_OFF_PAL_MQ;
version.isMQ = true;
break;
case OOT_PAL_GC_DBG1:
version.version = "GameCube Debug 1.0";
version.listPath = "dbg.txt";
version.offset = OOT_OFF_PAL_GC_DBG1;
version.isMQ = false;
break;
case OOT_PAL_GC_DBG2:
version.version = "GameCube Debug 2.0";
version.listPath = "dbg.txt";
version.offset = OOT_OFF_PAL_GC_DBG2;
version.isMQ = false;
break;
case OOT_PAL_GC_MQ_DBG:
version.version = "GameCube MQ-Debug";
version.listPath = "dbg.txt";
version.offset = OOT_OFF_PAL_MQ_DBG;
version.isMQ = true;
break;
case OOT_IQUE_CN:
version.version = "OoT IQue";
version.listPath = "ique.txt";
version.offset = OOT_OFF_CN_IQUE;
version.isMQ = false;
break;
case OOT_IQUE_TW:
version.version = "TW IQue";
version.listPath = "ique.txt";
version.offset = OOT_OFF_TW_IQUE;
version.isMQ = false;
break;
default:
version.error = MoonUtils::format("Unknown CRC %x given: ", version.crc);
@@ -9,6 +9,7 @@ struct RomVersion {
std::string version = "None";
std::string error = "None";
std::string listPath = "None";
bool isMQ;
int offset;
uint32_t crc;
};
+23 -10
View File
@@ -36,7 +36,7 @@ std::string GetXMLVersion(RomVersion version)
return "ERROR";
}
void BuildOTR(const std::string output) {
void BuildOTR(const std::string output, RomVersion version) {
if (oldExtractMode)
{
std::string execStr = Util::format("assets/extractor/%s", isWindows() ? "ZAPD.exe" : "ZAPD.out") + " botr -se OTR";
@@ -49,16 +49,28 @@ void BuildOTR(const std::string output) {
setCurrentStep("Done!");
if (output == ".") return;
const std::string outputPath = MoonUtils::join(output, "oot.otr");
if(MoonUtils::exists(outputPath)) MoonUtils::rm(outputPath);
// If a custom SoH folder was not selected, or the custom SOH folder is the same location as OTRGui,
// then the otr file should already be where it is expected
if (output == "." || output == MoonUtils::absolute(".")) {
return;
}
MoonUtils::copy("oot.otr", outputPath);
// Otherwise an outside SoH folder was selected so we need to copy the exported otr to the correct folder
const std::string otrName = version.isMQ ? "oot-mq.otr" : "oot.otr";
const std::string outputPath = MoonUtils::join(output, otrName);
if (MoonUtils::exists(outputPath)) MoonUtils::rm(outputPath);
MoonUtils::copy(otrName, outputPath);
}
void ExtractFile(std::string xmlPath, std::string outPath, std::string outSrcPath, RomVersion version) {
std::string otrExporterArgs = Util::format("--otrfile %s", version.isMQ ? "oot-mq.otr" : "oot.otr");
if (xmlPath.find("overlays") != std::string::npos) {
otrExporterArgs += " --static";
}
std::string execStr = Util::format("assets/extractor/%s", isWindows() ? "ZAPD.exe" : "ZAPD.out");
std::string args = Util::format(" e -eh -i %s -b tmp/baserom/ -o %s -osf %s -gsf 1 -rconf assets/extractor/Config_%s.xml -se OTR %s", xmlPath.c_str(), outPath.c_str(), outSrcPath.c_str(), GetXMLVersion(version).c_str(), xmlPath.find("overlays") != std::string::npos ? "--static" : "");
std::string args = Util::format(" e -eh -i %s -b tmp/baserom/ -o %s -osf %s -gsf 1 -rconf assets/extractor/Config_%s.xml -se OTR %s", xmlPath.c_str(), outPath.c_str(), outSrcPath.c_str(), GetXMLVersion(version).c_str(), otrExporterArgs);
ProcessResult result = NativeFS->LaunchProcess(execStr + args);
if (result.exitCode != 0) {
@@ -110,8 +122,9 @@ void startWorker(RomVersion version) {
}
else
{
std::string otrExporterArgs = Util::format("--otrfile %s", version.isMQ ? "oot-mq.otr" : "oot.otr");
std::string execStr = Util::format("assets/extractor/%s", isWindows() ? "ZAPD.exe" : "ZAPD.out");
std::string args = Util::format(" ed -eh -i %s -b tmp/rom.z64 -fl assets/extractor/filelists -o %s -osf %s -gsf 1 -rconf assets/extractor/Config_%s.xml -se OTR %s", path.c_str(), (path + "/../").c_str(), (path + "/../").c_str(), GetXMLVersion(version).c_str(), "");
std::string args = Util::format(" ed -eh -i %s -b tmp/rom.z64 -fl assets/extractor/filelists -o %s -osf %s -gsf 1 -rconf assets/extractor/Config_%s.xml -se OTR %s", path.c_str(), (path + "/../").c_str(), (path + "/../").c_str(), GetXMLVersion(version).c_str(), otrExporterArgs.c_str());
ProcessResult result = NativeFS->LaunchProcess(execStr + args);
if (result.exitCode != 0) {
@@ -127,7 +140,7 @@ void startWorker(RomVersion version) {
}
}
void updateWorker(const std::string& output) {
void updateWorker(const std::string& output, RomVersion version) {
if (maxResources > 0 && !buildingOtr && (extractedResources >= maxResources || !oldExtractMode))
{
setCurrentStep("Building OTR...");
@@ -138,10 +151,10 @@ void updateWorker(const std::string& output) {
buildingOtr = true;
if (single_thread || !oldExtractMode){
BuildOTR(output);
BuildOTR(output, version);
return;
}
std::thread otr(BuildOTR, output);
std::thread otr(BuildOTR, output, version);
otr.detach();
}
}
+1 -1
View File
@@ -8,4 +8,4 @@ enum Platforms {
struct RomVersion;
void startWorker(RomVersion version);
void updateWorker(const std::string& output);
void updateWorker(const std::string& output, RomVersion version);
+4
View File
@@ -102,6 +102,10 @@ namespace MoonUtils {
else fs::remove(path);
}
string absolute(string path) {
return normalize(fs::absolute(path).string());
}
string relative(string parent, string child){
return normalize(fs::relative(child, parent).string());
}
+1
View File
@@ -37,6 +37,7 @@ namespace MoonUtils {
bool exists(std::string path);
void mkdir(std::string path);
void rm(std::string path);
std::string absolute(std::string path);
std::string relative(std::string parent, std::string child);
void move(std::string src, std::string dst);
void copy(std::string src, std::string dst);
+75 -143
View File
@@ -1,97 +1,72 @@
# Welcome to the Ship of Harkinian!
![Ship of Harkinian](docs/shiptitle.darkmode.png#gh-dark-mode-only)
![Ship of Harkinian](docs/shiptitle.lightmode.png#gh-light-mode-only)
A PC port of OoT allowing you to enjoy the game with modern controls, widescreen, high-resolution, gyroscopy and other great features! Setup is simple, let's get started!
## Website
The Ship does not include assets and as such requires a prior copy of the game to play.
Official Website: https://www.shipofharkinian.com/
## Quick Start (Windows)
## Discord
1) Download The Ship of Harkinian from [Discord](https://discord.com/invite/BtBmd55HVH).
2) Requires a supported copy of the game (See supported games below).
3) Use the OTRGui to generate an `oot.otr` archive file.
4) Launch `soh.exe`
Official Discord: https://discord.com/invite/shipofharkinian
### Supported Games
#### Ocarina of Time Debug PAL GC (not Master Quest)
> Currently the recommended option
If you're having any trouble after reading through this `README`, feel free ask for help in the Support text channels. Please keep in mind that we do not condone piracy.
# Quick Start
The Ship does not include any copyrighted assets. You are required to provide a supported copy of the game.
### 1. Check your `sha1`
You can verify you have a supported copy of the game by checking the `sha1` hash. There are many ways to do this, one of the simplest is using the [`hasher-js`](https://github.com/snarfblam/hasher-js) webapp hosted at https://www.romhacking.net/hash/.
| Supported Version | `sha1` |
| - | - |
| PAL GC | `0227d7c0074f2d0ac935631990da8ec5914597b4` |
| PAL GC (Debug) | `cee6bc3c2a634b41728f2af8da54d9bf8cc14099` |
| PAL MQ | `079b855b943d6ad8bd1eb026c0ed169ecbdac7da` |
| PAL MQ | `50bebedad9e0f10746a52b07239e47fa6c284d03` |
### 2. Download The Ship of Harkinian from [Discord](https://discord.com/invite/shipofharkinian)
The latest release is available in the most recent post in the `#downloads` channel.
### 3. Launch the Game!
#### Windows
* Extract the zip
* Launch `soh.exe`
#### Linux
* Place your supported copy of the game in the same folder as the appimage.
* Execute `soh.appimage`. You may have to `chmod +x` the appimage via terminal.
#### macOS
* Run `soh.app`. When prompted, select your supported copy of the game.
* You should see a notification saying `Processing OTR`, then, once the process is complete, you should get a notification saying `OTR Successfully Generated`, then the game should start.
#### Nintendo Switch
* Run one of the PC releases to generate an `oot.otr` and/or `oot-mq.otr` file. After launching the game on PC, you will be able to find these files in the same directory as `soh.exe` or `soh.appimage`. On macOS, these files can be found in `/Users/<username>/Library/Application Support/com.shipofharkinian.soh/`
* Copy the files to your sd card
```
Build team: `zelda@srd022j`
Build date: `03-02-21 00:49:18` (year-month-day)
sha1: cee6bc3c2a634b41728f2af8da54d9bf8cc14099
```
#### Ocarina of Time PAL GameCube
> May lead to crashes and instability
```
sha1: 0227d7c0074f2d0ac935631990da8ec5914597b4
```
#### Ocarina of Time Debug PAL GC MQ (Dungeons will be Master Quest)
```
Build team: `zelda@srd022j`
Build date: `03-02-21 00:16:31` (year-month-day)
sha1: 079b855b943d6ad8bd1eb026c0ed169ecbdac7da (Produced by decomp)
sha1: 50bebedad9e0f10746a52b07239e47fa6c284d03 (Alternate)
sdcard
└── switch
└── soh
├── oot-mq.otr
├── oot.otr
├── soh.nro
└── soh.otr
```
* Launch via Atmosphere's `Game+R` launcher method.
### 4. Play!
Congratulations, you are now sailing with the Ship of Harkinian! Have fun!
## Additional Setup Information
# Configuration
The Ship of Harkinian uses a proprietary versioning system consisting of a sci-fi film character followed by a phonetic alphabet code word. The film character represents a major release version which increments with the addition of many new features and bug fixes. The code word represents a minor release version which increments with small updates mainly comprised of bug fixes. For example, `DECKARD ALFA`.
### Windows Rom Extraction
* Open OTRGui.exe, and select one of the supported roms listed above, to generate the `oot.otr` archive file.
* If a second button already exits then `oot.otr` already exists. To prevent overwriting the old `oot.otr` use this button to choose a new game directory. The new directory must not already contain an `oot.otr` to prevent an error.
* When the process completes, place `oot.otr` beside `soh.exe` if it is not already.
This packaging process can take up to **5 minutes**.
Close the OTRGui when the `Done!` message appears.
If you get another message, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum.
### Linux Rom Extraction
* Place one of the supported roms in the same folder as the appimage.
* When you run the soh appimage, it should begin generating the `oot.otr` archive file.
* When the process completes, place `oot.otr` in the same folder as the appimage, if it is not already, then run the appimage.
The packaging process can take up to **5 minutes**.
If you get any errors, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum.
### MacOS Rom Extraction
* Run `soh.app`, and when prompted, select one of the supported roms listed above.
* You should see a notification saying `Processing OTR`, then, once the process is complete, you should get a notification saying `OTR Successfully Generated`, then the game should start.
The packing process can take up to **5 minutes**.
If you get an error saying `Incompatible ROM hash`, you have selected the wrong rom, make sure the checksum matches one of the ones listed above.
### Nintendo Switch Rom Extraction
* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform.
* Place the `.nro` and the `oot.otr` archive into a folder called `soh` in your Switch folder on your Switch
### Nintendo Wii U Rom Extraction
* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform.
* Copy the `.rpx` and the `oot.otr` archive to `wiiu/apps/soh`
---
If you still cannot get the tool to work, join our [Discord Server](https://discord.com/invite/BtBmd55HVH) and ask for help in the `#support` text channel. Keep-in-mind that we do not condone piracy in any way.
### Running The Ship of Harkinian
Launch the game. If the window immediately closes, or if there are visual artifacts, you may have selected the wrong rom in the OTRGui tool.
Default keyboard configuration:
### Default keyboard configuration
| N64 | A | B | Z | Start | Analog stick | C buttons | D-Pad |
| - | - | - | - | - | - | - | - |
| Keyboard | X | C | Z | Space | WASD | Arrow keys | TFGH |
Other shortcuts:
### Other shortcuts
| Keys | Action |
| - | - |
| F1 | Toggle menubar |
@@ -102,75 +77,32 @@ Other shortcuts:
| Alt+Enter | Fullscreen (DirectX) |
| Ctrl+R | Reset |
Currently, DirectX 11 and OpenGL are supported. Change the renderer by opening the `shipofharkinian.json` configuration file in notepad and add `sdl` to the quotes in `"GfxBackend": ""` for OpenGL or leave blank for DirectX.
### Graphics Backends
Currently, there are three rendering APIs supported: DirectX11 (Windows), OpenGL (all platforms), and Metal (MacOS). You can change which API to use in the `Settings` menu of the menubar, which requires a restart. If you're having an issue with crashing, you can change the API in the `shipofharkinian.json` file by finding the line `gfxbackend:""` and changing the value to `sdl` for OpenGL. DirectX 11 is the default on Windows.
## Take The Survey
Want to use cartridge readers in tandem with the OTRGui?
Take [this survey](https://retroarchopenhardware.com/survey.php) to increase chances of this becoming reality.
# Custom Assets
## Discord
Custom assets are packed in `.otr` files. To use custom assets, place them in the `mods` folder.
Official Discord: https://discord.com/invite/BtBmd55HVH
If you're interested in creating and/or packing your own custom asset `.otr` files, check out [**retro**](https://github.com/HarbourMasters64/retro)!
## Building The Ship of Harkinian
# Development
### Building
Refer to the [building instructions](BUILDING.md) to compile SoH.
If you want to manually compile SoH, please consult the [building instructions](docs/BUILDING.md).
## Getting CI to work on your fork
### Playtesting
If you want to playtest a continuous integration build, you can find them at the links below. Keep in mind that these are for playtesting only, and you will likely encounter bugs and possibly crashes.
The CI works via [Github Actions](https://github.com/features/actions) where we mostly make use of machines hosted by Github; except for the very first step of the CI process called "Extract assets". This steps extracts assets from the game file and generates an "assets" folder in `soh/`.
* [Windows](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-windows.zip)
* [macOS](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-mac.zip)
* [Linux (performance)](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux-performance.zip) _(requires `glibc 2.35` or newer, but will be more performant than the compatibility build.)_
* [Linux (compatibility)](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux-compatiblity.zip) _(compatible with most Linux distributions, but may not be as performant as the performance build.)_
* [Switch](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-switch.zip)
To get this step working on your fork, you'll need to add a machine to your own repository as a self-hosted runner via "Settings > Actions > Runners" in your repository settings. If you're on macOS or Linux take a look at `macports-deps.txt` or `apt-deps.txt` to see the dependencies expected to be on your machine. For Windows, deps get installed as part of the CI process. To setup your runner as a service read the docs [here](https://docs.github.com/en/actions/hosting-your-own-runners/configuring-the-self-hosted-runner-application-as-a-service?platform=linux).
## Troubleshooting The Exporter
- Confirm that you have an `/assets` folder filled with XMLs in the same directory as OTRGui.exe
- Confirm that `zapd.exe` exists in the `/assets/extractor` folder
## Nightly Builds
Nightly builds of Ship of Harkinian are available here: [Windows](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-windows.zip), [macOS](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-mac.zip), [Linux](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux.zip), [Switch](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-switch.zip), [Wii U](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-wiiu.zip)
## The Harbour Masters Are...
Kenix | Lead Developer/Public Relations - Resource Management Programmer, Audio System Programmer, and General Programmer
Jack Walker | Lead Developer - OTR Format Programmer, Resource Load Programmer, and General Programmer
Louist103 | Developer - Save System Programmer and General Programmer
Emil | Developer - Fast3D Programmer
m4xw | Developer - Shipwright, Throwing Baguettes, and General Programmer
MelonSpeedruns | Developer - General Programmer
Rozlette | Developer - General Programmer
JoshDuMan | Developer - General Programmer
KiritoDev/Lywx | Developer - General Programmer
Theo3 | Developer - General Programmer
Random06457 | Developer - Linux Build
## Special Thanks
Decomp & ZAPD | Made this project even possible in the first place!
MNGoldenEagle | Patiently explained audio data formats, encouragement, and founding ZSO which was the first source of the game's code and resource format documentation.
Rrrrry123 | Speedbunner, encouragement, and community moderation
Fierce deity | Encouragement and community moderation
mzxrules | For his contributions to decomp
zel. | For his contributions to decomp
Aloxado | Developer - General Programmer
MegaMech | Developer - General Programmer
Revo | Tester - GCC support and General Testing
zfg | Tester - General Testing
Horseless Headman | Tester - General Testing
Steven Pritchett | Tester - General Testing
Trenton May | Tester - General Testing
Zeldaboy14 | Tester - General Testing, encouragement, and community moderation
Koby Howell | Tester - General Testing
Logg | Tester - General Testing
Taylor Daley | Graphic Design
Can't Sleep | Graphic Design
## Video Credits
Kenix | Producer / Writer
briaguya | Writer
rainbow_fash | Executive Producer
ReveriePass | Editor
MicTheMicrophone | Gwonam / The King
Amphibibro | Link
AceHeart | Zelda
<a href="https://github.com/Kenix3/libultraship/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="./docs/poweredbylus.darkmode.png">
<img alt="Powered by libultraship" src="./docs/poweredbylus.lightmode.png">
</picture>
</a>
+3 -3
View File
@@ -6,7 +6,7 @@
[subrepo]
remote = https://github.com/HarbourMasters/ZAPDTR.git
branch = master
commit = a53a53ea4216b926253dde2c942ae0ca6e2f2ccd
parent = f52a2a6406eb1bbd2b631c65923d879a83983ccb
commit = e23b125d89bd973998d2eb00896bcbaf1b53a329
parent = 17b1a8e7fd5517f9232e531da0fed6ef80a87f04
method = rebase
cmdver = 0.4.1
cmdver = 0.4.3
+21 -10
View File
@@ -1,4 +1,4 @@
set(PROJECT_NAME ZAPD)
set(PROJECT_NAME ZAPDLib)
set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use")
#set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard to use")
@@ -260,10 +260,17 @@ set(ALL_FILES
################################################################################
# Target
################################################################################
add_executable(${PROJECT_NAME} ${ALL_FILES})
add_library(${PROJECT_NAME} STATIC ${ALL_FILES})
add_executable(ZAPD ExecutableMain.cpp)
target_link_libraries(ZAPD ${PROJECT_NAME})
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
use_props(${PROJECT_NAME} "${CMAKE_CONFIGURATION_TYPES}" "${DEFAULT_CXX_PROPS}")
use_props(ZAPD "${CMAKE_CONFIGURATION_TYPES}" "${DEFAULT_CXX_PROPS}")
endif()
################################################################################
# Includes for CMake from *.props
@@ -282,7 +289,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
)
endif()
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin")
set_target_properties(${PROJECT_NAME} PROPERTIES
set_target_properties(ZAPD PROPERTIES
OUTPUT_NAME "ZAPD.out"
)
endif()
@@ -290,7 +297,8 @@ endif()
# MSVC runtime library
################################################################################
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
get_property(MSVC_RUNTIME_LIBRARY_DEFAULT TARGET ${PROJECT_NAME} PROPERTY MSVC_RUNTIME_LIBRARY)
foreach(ZTarget ${PROJECT_NAME} ZAPD)
get_property(MSVC_RUNTIME_LIBRARY_DEFAULT TARGET ${ZTarget} PROPERTY MSVC_RUNTIME_LIBRARY)
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
string(CONCAT "MSVC_RUNTIME_LIBRARY_STR"
$<$<CONFIG:Debug>:
@@ -302,7 +310,8 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
$<$<NOT:$<OR:$<CONFIG:Debug>,$<CONFIG:Release>>>:${MSVC_RUNTIME_LIBRARY_DEFAULT}>
)
endif()
set_target_properties(${PROJECT_NAME} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR})
set_target_properties(${ZTarget} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR})
endforeach()
endif()
################################################################################
# Compile definitions
@@ -336,6 +345,8 @@ find_package(PNG REQUIRED)
target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/extern/ZAPDUtils
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/src/resource
${CMAKE_CURRENT_SOURCE_DIR}/../../libultraship/include
${CMAKE_CURRENT_SOURCE_DIR}/../../ZAPDTR/lib/tinyxml2
${CMAKE_CURRENT_SOURCE_DIR}/../../ZAPDTR/lib/libgfxd
${PNG_PNG_INCLUDE_DIR}/
@@ -402,7 +413,7 @@ if(MSVC)
endif()
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang|AppleClang")
target_compile_options(${PROJECT_NAME} PRIVATE
target_compile_options(${PROJECT_NAME} PUBLIC
-Wall -Wextra -Wno-error
-Wno-unused-parameter
-Wno-unused-function
@@ -415,11 +426,11 @@ if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang|AppleClang")
)
if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
target_link_options(${PROJECT_NAME} PRIVATE
target_link_options(${PROJECT_NAME} PUBLIC
-pthread
)
else()
target_link_options(${PROJECT_NAME} PRIVATE
target_link_options(${PROJECT_NAME} PUBLIC
-pthread
-Wl,-export-dynamic
)
@@ -489,7 +500,7 @@ endif()
if(CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch|CafeOS")
add_library(pathconf OBJECT pathconf.c)
target_link_libraries(${PROJECT_NAME} PRIVATE "${ADDITIONAL_LIBRARY_DEPENDENCIES}" $<TARGET_OBJECTS:pathconf> )
target_link_libraries(${PROJECT_NAME} PUBLIC "${ADDITIONAL_LIBRARY_DEPENDENCIES}" $<TARGET_OBJECTS:pathconf> )
else()
target_link_libraries(${PROJECT_NAME} PRIVATE "${ADDITIONAL_LIBRARY_DEPENDENCIES}")
target_link_libraries(${PROJECT_NAME} PUBLIC "${ADDITIONAL_LIBRARY_DEPENDENCIES}")
endif()
+5
View File
@@ -0,0 +1,5 @@
extern "C" int zapd_main(int argc, char* argv[]);
int main(int argc, char* argv[]) {
return zapd_main(argc, argv);
}
+7 -4
View File
@@ -27,11 +27,14 @@ Globals::Globals()
Globals::~Globals()
{
auto& exporters = GetExporterMap();
for (auto& it : exporters)
for (const auto& w : workerData)
{
delete it.second;
delete w.second;
}
if (rom != nullptr)
{
delete rom;
}
}
+6 -2
View File
@@ -22,6 +22,7 @@ typedef bool (*ExporterSetFuncBool)(ZFileMode fileMode);
typedef void (*ExporterSetFuncVoid)(int argc, char* argv[], int& i);
typedef void (*ExporterSetFuncVoid2)(const std::string& buildMode, ZFileMode& fileMode);
typedef void (*ExporterSetFuncVoid3)();
typedef void (*ExporterSetFuncVoid4)(tinyxml2::XMLElement* reader);
typedef void (*ExporterSetResSave)(ZResource* res, BinaryWriter& writer);
class ExporterSet
@@ -39,6 +40,8 @@ public:
ExporterSetFuncVoid3 endXMLFunc = nullptr;
ExporterSetResSave resSaveFunc = nullptr;
ExporterSetFuncVoid3 endProgramFunc = nullptr;
ExporterSetFuncVoid4 processCompilableFunc = nullptr;
};
class Globals
@@ -54,7 +57,7 @@ public:
bool useLegacyZDList;
bool singleThreaded;
VerbosityLevel verbosity; // ZAPD outputs additional information
ZFileMode fileMode;
ZFileMode fileMode = ZFileMode::Invalid;
fs::path baseRomPath, inputPath, outputPath, sourceOutputPath, cfgPath, fileListPath;
TextureType texType;
ZGame game;
@@ -65,8 +68,9 @@ public:
bool forceUnaccountedStatic = false;
bool otrMode = true;
bool buildRawTexture = false;
bool onlyGenSohOtr = false;
ZRom* rom;
ZRom* rom = nullptr;
std::vector<ZFile*> files;
std::vector<ZFile*> externalFiles;
std::vector<int32_t> segments;
+85 -25
View File
@@ -4,9 +4,71 @@
#include "Utils/File.h"
#include "Utils/Path.h"
#include "WarningHandler.h"
#include "ZAnimation.h"
ZNormalAnimation nAnim(nullptr);
ZCurveAnimation cAnim(nullptr);
ZLinkAnimation lAnim(nullptr);
ZLegacyAnimation lAnim2(nullptr);
#include "ZArray.h"
ZArray arr(nullptr);
#include "ZAudio.h"
ZAudio audio(nullptr);
#include "ZBackground.h"
ZBackground back(nullptr);
#include "ZBlob.h"
ZBlob blob(nullptr);
#include "ZCollision.h"
ZCollisionHeader colHeader(nullptr);
#include "ZCutscene.h"
ZCutscene cs(nullptr);
#include "ZLimb.h"
ZLimb limb(nullptr);
#include "ZMtx.h"
ZMtx mtx(nullptr);
#include "ZPath.h"
ZPath path(nullptr);
#include "ZPlayerAnimationData.h"
ZPlayerAnimationData pAnimData(nullptr);
#include "ZScalar.h"
ZScalar scalar(nullptr);
#include "ZSkeleton.h"
ZLimbTable limbTbl(nullptr);
ZSkeleton skel(nullptr);
#include "ZString.h"
ZString str(nullptr);
#include "ZSymbol.h"
ZSymbol sym(nullptr);
#include "ZText.h"
ZText txt(nullptr);
#include "ZTexture.h"
ZTexture tex(nullptr);
#include "ZVector.h"
ZVector vec(nullptr);
#include "ZVtx.h"
ZVtx vtx(nullptr);
#include "ZRoom/ZRoom.h"
ZRoom room(nullptr);
#include "ZFile.h"
#include "ZTexture.h"
@@ -29,29 +91,6 @@
const char gBuildHash[] = "";
// LINUX_TODO: remove, those are because of soh <-> lus dependency problems
float divisor_num = 0.0f;
extern "C" void Audio_SetGameVolume(int player_id, float volume)
{
}
extern "C" int ResourceMgr_OTRSigCheck(char* imgData)
{
return 0;
}
void DebugConsole_SaveCVars()
{
}
void DebugConsole_LoadCVars()
{
}
bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path& outPath,
ZFileMode fileMode, int workerID);
@@ -119,7 +158,9 @@ void ErrorHandler(int sig)
}
#endif
int main(int argc, char* argv[])
extern void ImportExporters();
extern "C" int zapd_main(int argc, char* argv[])
{
// Syntax: ZAPD.out [mode (btex/bovl/e)] (Arbritrary Number of Arguments)
@@ -242,6 +283,7 @@ int main(int argc, char* argv[])
}
else if (arg == "-se" || arg == "--set-exporter") // Set Current Exporter
{
ImportExporters();
Globals::Instance->currentExporter = argv[++i];
}
else if (arg == "--gcc-compat") // GCC compatibility
@@ -260,10 +302,23 @@ int main(int argc, char* argv[])
{
Globals::Instance->buildRawTexture = true;
}
else if (arg == "--norom")
{
Globals::Instance->onlyGenSohOtr = true;
}
}
// Parse File Mode
ExporterSet* exporterSet = Globals::Instance->GetExporterSet();
if(Globals::Instance->onlyGenSohOtr) {
exporterSet->endProgramFunc();
delete g;
return 0;
}
std::string buildMode = argv[1];
ZFileMode fileMode = ZFileMode::Invalid;
@@ -328,7 +383,7 @@ int main(int argc, char* argv[])
Directory::ListFiles(Globals::Instance->inputPath.string());
const int num_threads = std::thread::hardware_concurrency();
ctpl::thread_pool pool(num_threads / 2);
ctpl::thread_pool pool(num_threads > 1 ? num_threads / 2 : 1);
bool parseSuccessful;
@@ -420,6 +475,11 @@ int main(int argc, char* argv[])
if (exporterSet != nullptr && exporterSet->endProgramFunc != nullptr)
exporterSet->endProgramFunc();
end:
delete exporterSet;
//Globals::Instance->GetExporterSet() = nullptr; //TODO NULL this out. Compiler complains about lvalue assignment.
delete g;
return 0;
}
+27 -14
View File
@@ -128,6 +128,9 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename)
if (reader->Attribute("RangeEnd") != nullptr)
rangeEnd = StringHelper::StrToL(reader->Attribute("RangeEnd"), 16);
if (reader->Attribute("Compilable") != nullptr)
isCompilable = true;
if (rangeStart > rangeEnd)
HANDLE_ERROR_PROCESS(
WarningType::Always,
@@ -221,7 +224,7 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename)
// Check for repeated attributes.
if (offsetXml != nullptr)
{
rawDataIndex = strtol(StringHelper::Split(offsetXml, "0x")[1].c_str(), NULL, 16);
rawDataIndex = strtol(StringHelper::Split(std::string(offsetXml), "0x")[1].c_str(), NULL, 16);
if (offsetSet.find(offsetXml) != offsetSet.end())
{
@@ -261,16 +264,19 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename)
}
nameSet.insert(nameXml);
}
std::string nodeName = std::string(child->Name());
if (nodeMap.find(nodeName) != nodeMap.end())
{
ZResource* nRes = nodeMap[nodeName](this);
if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile || mode == ZFileMode::ExtractDirectory)
nRes->ExtractFromXML(child, rawDataIndex);
if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile ||
mode == ZFileMode::ExtractDirectory)
{
if (!isCompilable)
nRes->ExtractFromXML(child, rawDataIndex);
}
switch (nRes->GetResourceType())
{
case ZResourceType::Texture:
@@ -800,19 +806,22 @@ void ZFile::GenerateSourceHeaderFiles()
{
OutputFormatter formatter;
formatter.Write("#pragma once\n");
formatter.Write("#pragma once\n\n");
formatter.Write("#include \"align_asset_macro.h\"\n");
std::set<std::string> nameSet;
for (ZResource* res : resources)
{
std::string resSrc = res->GetSourceOutputHeader("", &nameSet);
formatter.Write(resSrc);
if (resSrc != "")
formatter.Write("\n");
if (!resSrc.empty())
{
formatter.Write(resSrc.front() == '\n' ? resSrc : "\n" + resSrc);
formatter.Write(res == resources.back() ? "" : "\n");
}
}
for (auto& sym : symbolResources)
{
formatter.Write("\n\n");
formatter.Write(sym.second->GetSourceOutputHeader("", &nameSet));
}
@@ -823,15 +832,19 @@ void ZFile::GenerateSourceHeaderFiles()
if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO)
printf("Writing H file: %s\n", headerFilename.c_str());
std::string output = formatter.GetOutput();
while (output.back() == '\n')
output.pop_back();
if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory)
File::WriteAllText(headerFilename, formatter.GetOutput());
File::WriteAllText(headerFilename, output);
else if (Globals::Instance->sourceOutputPath != "")
{
std::string xmlPath = xmlFilePath.string();
xmlPath = StringHelper::Replace(xmlPath, "\\", "/");
auto pathList = StringHelper::Split(xmlPath, "/");
std::string outPath = "";
for (int i = 0; i < 3; i++)
outPath += pathList[i] + "/";
@@ -849,7 +862,7 @@ void ZFile::GenerateSourceHeaderFiles()
outPath += "/";
}
File::WriteAllText(outPath, formatter.GetOutput());
File::WriteAllText(outPath, output);
}
}
@@ -1192,7 +1205,7 @@ std::string ZFile::ProcessTextureIntersections([[maybe_unused]] const std::strin
if (declarations.find(currentOffset) != declarations.end())
declarations.at(currentOffset)->size = currentTex->GetRawDataSize();
currentTex->DeclareVar(GetName(), "");
}
else
+1
View File
@@ -36,6 +36,7 @@ public:
std::vector<ZResource*> resources;
int workerID;
bool isCompilable = false;
// Default to using virtual addresses
uint32_t segment = 0x80;
+7 -17
View File
@@ -309,7 +309,7 @@ std::string ZResource::GetSourceOutputHeader([[maybe_unused]] const std::string&
{
if (Globals::Instance->otrMode && genOTRDef)
{
std::string str = "";;
std::string str = "";
std::string nameStr = StringHelper::Strip(StringHelper::Strip(name, "\n"), "\r");
std::string outName = parent->GetOutName();
@@ -344,18 +344,13 @@ std::string ZResource::GetSourceOutputHeader([[maybe_unused]] const std::string&
if (prefix != "") {
str += StringHelper::Sprintf("#define d%s \"__OTR__%s/%s/%s\"", name.c_str(), prefix.c_str(), outName.c_str(), nameStr.c_str());
}
}
else
str += StringHelper::Sprintf("#define d%s \"__OTR__%s/%s\"", name.c_str(), outName.c_str(), nameStr.c_str());
if (nameSet && nameSet->find(name) == nameSet->end()) {
str += StringHelper::Sprintf(R"(
#ifdef _WIN32
static const __declspec(align(2)) char %s[] = d%s;
#else
static const char %s[] __attribute__((aligned (2))) = d%s;
#endif
)", name.c_str(), name.c_str(), name.c_str(), name.c_str());
str += StringHelper::Sprintf("\n");
str += StringHelper::Sprintf(R"(static const ALIGN_ASSET(2) char %s[] = d%s;)", name.c_str(), name.c_str());
if (nameSet) {
nameSet->insert(name);
@@ -366,16 +361,11 @@ static const char %s[] __attribute__((aligned (2))) = d%s;
{
std::string addName = "gTitleZeldaShieldLogoTex";
nameStr = StringHelper::Strip(StringHelper::Strip(addName, "\n"), "\r");
str += StringHelper::Sprintf("\n#define d%s \"__OTR__%s/%s/%s\"", addName.c_str(), prefix.c_str(), outName.c_str(), nameStr.c_str());
str += StringHelper::Sprintf("\n\n#define d%s \"__OTR__%s/%s/%s\"", addName.c_str(), prefix.c_str(), outName.c_str(), nameStr.c_str());
if (nameSet && nameSet->find(addName) == nameSet->end())
{
str += StringHelper::Sprintf(R"(
#ifdef _WIN32
static const __declspec(align(2)) char %s[] = d%s;
#else
static const char %s[] __attribute__((aligned (2))) = d%s;
#endif
)", addName.c_str(), addName.c_str(), addName.c_str(), addName.c_str());
str += StringHelper::Sprintf("\n");
str += StringHelper::Sprintf(R"(static const ALIGN_ASSET(2) char %s[] = d%s;)", addName.c_str(), addName.c_str());
if (nameSet)
{
+2 -2
View File
@@ -7,8 +7,8 @@
#include <string>
#include <vector>
#include "Declaration.h"
#include "Utils/BinaryWriter.h"
#include "Utils/Directory.h"
#include <Utils/BinaryWriter.h>
#include <Utils/Directory.h>
#include "tinyxml2.h"
#define SEGMENT_SCENE 2
+9 -1
View File
@@ -63,18 +63,26 @@ void ZText::ParseRawData()
unsigned int extra = 0;
bool stop = false;
// Continue parsing until we are told to stop and all extra bytes are read
while ((c != '\0' && !stop) || extra > 0)
{
msgEntry.msg += c;
msgPtr++;
// Some control codes require reading extra bytes
if (extra == 0)
{
if (c == 0x05 || c == 0x13 || c == 0x0E || c == 0x0C || c == 0x1E || c == 0x06 ||
// End marker, so stop this message and do not read anything else
if (c == 0x02)
{
stop = true;
}
else if (c == 0x05 || c == 0x13 || c == 0x0E || c == 0x0C || c == 0x1E || c == 0x06 ||
c == 0x14)
{
extra = 1;
}
// "Continue to new text ID", so stop this message and read two more bytes for the text ID
else if (c == 0x07)
{
extra = 2;

Some files were not shown because too many files have changed in this diff Show More