112 Commits
Author SHA1 Message Date
Waterdish 5cadb5923d Modern Menu GUI Scaling Hacks 2024-11-14 23:12:27 -08:00
Waterdish f51b428de4 Bump version in config files 2024-11-14 21:18:02 -08:00
Waterdish 7fb49b5e01 1.1.1 Update 2024-11-14 20:59:31 -08:00
ArchezandGitHub 5a735395da Merge pull request #853 from HarbourMasters/develop-satoko
develop-satoko -> develop
2024-11-13 23:49:02 -05:00
ArchezandGitHub dda4e4b5c9 Bump Satoko Bravo (#852) 2024-11-13 22:10:44 -05:00
ArchezandGitHub 6d76ce9f5e Fix crashing with modern menu and UIWidgets with no tooltips (#851)
* Fix crashing with modern menu and UIWidgets when null is passed for tooltips

* move to shiputils
2024-11-13 20:13:54 -05:00
ArchezandGitHub e0ed28543b Improve extended culling options and account for song cutscene fading (#850)
* Improve extended culling options and account for song cutscene fading

* unify actor distance sliders into one
2024-11-13 17:49:47 -05:00
ArchezandGitHub 1afe496fed Fix clock spinning violently from undefined behavior with bad casting (#849) 2024-11-13 14:18:47 -05:00
ArchezandGitHub 31685557d2 Fix linux auto rom detection for built-in extractor (#842) 2024-11-12 11:13:44 -05:00
ArchezandGitHub cf92349436 Fix skip intro and skip first cycle logic running when it shouldn't (#846) 2024-11-12 11:00:45 -05:00
MalkierianandGitHub 8a74695a74 Cleanup Controller Navigation Option in Menu (#847)
* Change references of menubar in controller navigation option to menu, and change SOH to 2s2h.

* 2s2h to 2Ship
2024-11-12 10:50:19 -05:00
ArchezandGitHub ebb9e3fc8e Fix modern menu not interacting properly with some mouse events (#844) 2024-11-12 10:39:29 -05:00
ArchezandGitHub 01b127b7f3 Fix GfxPrint for Japanese UTF8 characters (#843) 2024-11-12 10:30:27 -05:00
ArchezandGitHub 422839dea4 Fix linux crash with KeepExpressMail (#840) 2024-11-12 10:15:30 -05:00
ArchezandGitHub a2e93687f6 Fix crash when toggling alt assets while paused (#839) 2024-11-12 10:06:35 -05:00
ArchezandGitHub fab4340461 Various fixes for spelling and save editor time change lightning state (#841)
* Set lightning off when changing save time

* various typo fixes
2024-11-12 10:01:16 -05:00
Garrett CoxandGitHub b7a607b765 Fix some issues caused by the extended scene geometry enhancement by patching DLs (#830) 2024-11-11 22:43:03 -06:00
MalkierianandGitHub 4669337a3f Bump LUS to OpenGL Patch commit. (#837) 2024-11-11 23:06:50 -05:00
EbloandGitHub 7b11b129f7 Use global player for sword magic form check hook (#828) 2024-11-11 10:19:07 -05:00
EbloandGitHub b18eb6b649 Use correct CVar name for modern menu climb speed (#833) 2024-11-10 23:19:18 -05:00
Waterdish 0879154432 Bump Version to 1.1.0 2024-11-10 18:19:45 -08:00
Waterdish f1698ae721 Merge Upstream 2024-11-10 17:45:18 -08:00
Garrett CoxandGitHub ad50070aba Bump for Satoko Alfa (#825) 2024-11-09 20:43:03 -06:00
ArchezandGitHub 449a2ebc70 Archive version checking and regeneration (#822)
* Add archive version checking and regeneration

* update building docs and copy assets for visual studio
2024-11-09 20:15:10 -06:00
be70a5a123 Item tracker (#707)
* Core tracker code mostly done.

* Format

* Clean up enums.

* Format

* Header cleanup

* Update

* use CVars

* format

* Add editor to modern menu

* format

* Fix item tracker cvar loading/saving and add item tracker button for modern menu

* update button label

---------

Co-authored-by: Archez <archez39@me.com>
2024-11-08 11:51:58 -05:00
ArchezandGitHub d1bbba626d Add alt assets toggle to menus (#824)
* Add alt assets toggle to menus

* Add toggle to control alt asset hotkey
2024-11-07 18:08:37 -05:00
ArchezandGitHub 2141922ee3 Fix authentic overflowed textures (#794)
* fix authentic overflow textures

* Add overflow assets and enable patching them
2024-11-05 23:25:31 -05:00
ArchezandGitHub c2ec2f2cc3 Fix installed macports detection for github runner (#821) 2024-11-05 23:17:14 -05:00
EbloandGitHub 207df24ffd Fix bug with two-handed sword magic and dance (#819) 2024-11-03 15:13:09 -06:00
Garrett CoxandGitHub 0966633d2a Implement simple notifications system (#816)
* Implement simple notifications system

* Remove demoWindow call

* Fix initializer order
2024-11-02 15:44:21 -05:00
50bc007d46 Adds an option to the save editor to invert Stone Tower (#812)
* add option to invert st in save editor

* only allow inverting in stone tower scenes

* change tooltip to disabledTooltip

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

---------

Co-authored-by: Archez <Archez@users.noreply.github.com>
2024-10-31 00:37:24 -04:00
Garrett CoxandGitHub 941b48b802 Add swordsman school options (#779) 2024-10-26 14:28:08 +09:00
louist103andGitHub cbc89b8af4 Fix item id type (#813)
* fix wrong type

* Update z_kaleido_item.c
2024-10-21 10:51:47 -05:00
MegaMechandGitHub 9cd2f6e784 Update BUILDING.md (#810) 2024-10-15 17:39:07 +00:00
EbloandGitHub 64ebfa222e [Enhancement] Two-handed sword spin attacks (#679)
* Enhancement to enable magic for 2-handed swords

Create a new magic charge size for the two-handed swords
Add utility method for determining if the held item's button is being pressed, not just B

* Clean up two-handed sword spin attacks

Add hook for thunder matrix transformation, move that logic into TwoHandedSwordSpinAttack
Move held item button press function into TwoHandedSwordSpinAttack.cpp
Add enhancement to the searchable menu
Clean up logic for magic spin attack form check
Use variadic args for hooks

* Remove redundant includes from TwoHandedSwordSpinAttack.cpp

* Use extern on TwoHandedSwordSpinAttack structs
2024-10-10 14:38:51 -05:00
Garrett CoxandGitHub 0129959d7b Fix fairy container and seahorse rendering (#804) 2024-10-10 13:38:58 -05:00
EbloandGitHub 3ebfdb3928 [Enhancement] Skip the scarecrow song (#723)
* Add enhancement to skip the scarecrow song

* Update SkipScarecrowSong to use variadic args
2024-10-10 10:51:05 -05:00
bb386e25a0 [Enhancement] Enable putaway as Fierce Deity (#717)
* Add enhancement to enable putaway as Fierce Deity

* Fix hooks for putaway and FD sword wield

---------

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2024-10-10 07:51:05 -05:00
balloondude2andGitHub 4d3c39224c [Enhancement] Add First Cycle Skip (#716)
* add option to skip first cycle

* nest cycle skip in intro skip

* set persistant flags from first cycle

* better comments

* missed a flag

* add modern menu option

* clang format

* add entrance cutscene flags
2024-10-09 23:48:21 -05:00
EbloandGitHub 0b16bced84 [Cheat] Allow Elegy of Emptiness anywhere (#712)
* Add cheat to allow Elegy of Emptiness anywhere

* Use modern menu for Elegy Anywhere, rename VB

Removed redundant null from Elegy scene check
Moved ElegyAnywhere enhancement's menu order

* Remove extraneous widgets from ElegyAnywhere menu
2024-10-09 23:46:05 -05:00
balloondude2andGitHub b7d7a2d9bf [Enhancement] Add option to always get the Cremia Hug Cutscene after completing the milk run (#688)
* Cremia always gives hugs after getting Romani Mask. Adds enhancement option but the option doesn't change anything yet

* moved cremia enhancement out of cutscene files

* hook works now

* change enhancement to picklist

* cleaned conditional

* move to minigame section and add modern menu item

* clang format
2024-10-08 23:26:13 -05:00
ArchezandGitHub fa702ed90c Extract pause maps and minimaps, support alt assets, fix pause map icons (#780)
* extract pause maps and minimaps and support alt assets

* Fix missing door transitions on pause menu map
2024-10-07 13:05:17 -04:00
mckinleeandGitHub 7e10b1315e [Enhancement] Disable Takkuri Steal (#776)
* simple and works

* implement proxy's feedback
Co-authored-by: Garrett Joe Cox <garrettjcox@gmail.com>

* forgot to remove unneeded check from testing

* remove null arg

* simple and works

* implement proxy's feedback
Co-authored-by: Garrett Joe Cox <garrettjcox@gmail.com>

* forgot to remove unneeded check from testing

* remove null arg

* changes

* bump lus

* add checkbox to modern menu

* clang

* archez feedback

* proxy feedback
2024-10-07 11:02:36 -05:00
ArchezandGitHub cae9c27c62 Add HD support for Igos room curtains (#783) 2024-10-07 10:25:34 -05:00
Garrett CoxandGitHub cd4ee56d48 Implement faster song playback enhancement (#801) 2024-10-07 10:25:09 -05:00
Garrett CoxandGitHub 790d36bfbc Add options for first person aiming (#596) 2024-10-06 20:55:16 -05:00
MalkierianandGitHub da793a5bf2 Fix Sidebar Search (#796)
* Ensures the sidebar search gets added if on at boot.
Searches the sidebar entries to find an entry with a label that matches the searchSidebarEntry label to delete when disabling sidebar search, just in case something goes wrong and it's not actually where it's supposed to be (sidebarSearchIndex).

* ... clang...
2024-10-05 12:54:23 -04:00
ArchezandGitHub 69edc89292 [Enhancement] Keep Express Mail in the same cycle (#791)
* Add enhancement for reusing letter to mama in one cycle

* add menu widget item for express mail
2024-10-05 12:54:00 -04:00
Garrett CoxandGitHub a93f011253 Move GameInteractor & NameTag src up to root of 2s2h (#799) 2024-10-05 10:33:10 -05:00
4c670ad342 Use glob_recurse across all of 2s2h/ (#797)
* Use glob_recurse across all of 2s2h/

* Update mm/CMakeLists.txt

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

* Remove old source_group calls

---------

Co-authored-by: Archez <Archez@users.noreply.github.com>
2024-10-05 10:13:31 -05:00
Garrett CoxandGitHub d9d6dbdf51 Remove unnecessary headers in favor of directory headers (#800) 2024-10-05 10:06:49 -05:00
Garrett CoxandGitHub da04b7f859 Change GI_VB_ to VB_ (#798) 2024-10-05 10:02:53 -05:00
Garrett CoxandGitHub 8e0b482b23 Fix crash when search contains only spaces (#795) 2024-10-05 10:25:10 -04:00
ArchezandGitHub d3933591b5 Simplify Pause Warp confirming logic and message handling (#793) 2024-10-04 15:30:10 -04:00
Garrett CoxandGitHub f31674a12e Add fix for ikana great fairy fountain color (#788) 2024-10-03 16:02:51 -04:00
c474a82a94 Mirror Mode (#535)
* Mirror mode initial version

* Update mm/src/code/z_actor.c

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

* mirror mode support for minimaps and dungeon pause map

* mirror mode support overworld pause map and song of soaring

* mirror mode support for various remaining things

* mirror mode support pause warp enhancement

* Add searchable menu item

---------

Co-authored-by: Archez <Archez@users.noreply.github.com>
Co-authored-by: Archez <archez39@me.com>
2024-10-02 23:44:36 -04:00
71c2c94ece Modern menu (#701)
* Start the framework.

* Start header bar.

* Header buttons now toggle. Sections show accordingly.
Basic audio section done. Needs subdividing for sane widget widths.

* Add fonts and multiple sizes.
Add graphics settings to menu.

* Finalized fonts, more sizes.

* Modularized the menu structure. Has an errant EndChild somewhere.

* Finished first step modularization.
Parameterized menu height.

* Some adaptive menu size.

* Moved all enhancements over and organized.
Tried to add button option for sidebar entries.

* Finished Enhancements Menu.
Sidebar window button still broken (can't reference window variables properly, not drawing in the right place).

* Developer Tools header started.
Menu now pops out with a checkbox in Developer Tools.
Menu sizing works for smaller game sizes.
Popout docking disabled.
Port bool added for disallowing popout regardless of cvar.

* Better auto-sizing. Columns collapse to 1 below 800 window width, and scroll.

* Move inside of HudEditorWindow::DrawElement to DrawContents, and call DrawContents from DrawElement.

* Menu resizability complete.
Menu popout complete.
Menu popout position/size is retained when popped in.
Apply HUD editor changes, draw contents in menu if window is closed.
All child sizes properly calculated.
SidebarEntry drawing separated into its own custom element.

* Split header entries into separate widget.
Header now dynamically sized and shows scrollbar when necessary.

* Modify EventLog to be drawable with the DrawContents setup.
Prevent menu from covering other windows (always in back).

* Add reset, close menu, and quit buttons to the header.

* Fix reset and quit button placement.

* Swap Actor Viewer, Collision Viewer, Save Editor to DrawContents concept.
Change reset icon to FA_ICON_UNDO (single arrow) and quit icon to FA_ICON_POWER_OFF.
Add button to close menu button tooltip, add parentheses to button for reset tooltip.

* Custom InputEditorWindow to work with menu.
Fix LUS references in Menu.cpp for Window backend changes.
Implement gamepad navigation and forced cursor visibility checkboxes.
Toggle cursor visibility according to menu status and forced visibility CVar.

* clang-format

* Swap std for fmt (runner build error).
Ensure cursor visibility is restored if started in full screen with the menu open.

* Oops, still had #include <format>

* Swap to LUS GetMenu() functionality.
Add option to hide "F1 to open enhancements menu" text at startup if menus aren't open.

* Remove last vestiges of pre-LUS-menu functionality.

* cleanup

* Adapt to GuiElement, GuiWindow changes on the menu support PR.

* LUS PR bump.
Adapt to cursor visibility changes in LUS.
Adapt to menu toggle changes in LUS.
Fix input editor not hiding in menu when popped out.

* Add new enhancements and cheats to Modern Menu from rebase.

* clang

* Apply Graphics Menu Lag Fix to Menu structure.

* Remove unnecessary window children to simplify controller navigation.

* clang

* Add `UpdateWindowBackendObjects()` call to backend combobox.

* Rebase to latest develop. Remove redundant window backend stuff that exists now in BenMenuBar.

* Search Enhancement (#2)

* 90% complete, Commit for review.

* Updated remaining Menu Entries, Reverted Backends and other Window Buttons for now.

Motion Blur copied to Search Menu.

* Did I mention I dislike this clang thing? lol

* Updating MotionBlur options and reverting soem things.

* Integrates .disabled and .disabledTooltip to the constructors. Allows for multiple qualifications to be checked against for disabling widgets and for setting the tooltip accordingly.

* Updated Disabled Reasoning

* Better Disabled State registration system

* Clean up from testing

* Expand WidgetOptions to be able to handle string and float values. bool and uint32_t are handled through int32_t.
Numerous renames.
Added several data structures to allow for dynamic updating of CVars for DisableOptions, as well as dynamic evaluation of status with enumerated conditions (less than, greater than, equal to).
Added menuThemeIndex variable to store state of menu theme selection instead of having all the individual calls to CVarGetInteger for it. Updated once per frame.

* Changed color vector to map with enum as key and UIWidget::Colors as the value.
More renames.
Moved float slider values into case block.

* Add Color_RGB8 and Color_RGBA8 to CVarVariant in preparation for adding color widgets to menu item system.
Not happy it required comparison operator overrides, but it is what it is.

* Changed disable conditions to lambdas.

* Convert Stats and Collision Viewer to menu item system.
Swap out DisableOption vector for activeDisables and a lambda function for evaluating disabled and hidden. Set the precedent to still use the DisableInfo system.

* Add DisableOption for both camera settings being off.
Put Debug Camera in Free Look column, disable common widgets for both cameras, hide widgets specific to either if off.

* Moved more widgets to MenuItem system. Some need proper initialization routines because of Ship::Context references.

* Convert menu items to nested vector setup.
Remove MenuItem enum.
Add menu item location display to search results.

* Partial removal of SidebarEntryIndex enum.

* Finish removing SidebarEntryIndex.
Rework drawing code to handle the change back to direct vector access.
Add tooltips to search.

* Fix Graphics enhancements section title.

* Copy added menu items to modern menu system.

* clang

* Add some documentation for the menu system components.

* Revert change to std::map

* `size_t` because GCC has to be happy

* Fixed HUD Editor Widescreen mode not displaying the sliders properly.
Changed all windows to full-section-width display.

* Revert changes to MotionBlur.cpp

* Add non-CVar variants of checkbox, combobox, and the sliders.
Fix motion blur functionality with new non-CVar widgets.

* Add non-CVar variants of checkbox, combobox, and the sliders.
Fix motion blur functionality with those non-CVar widgets.
Add size and labelPosition to widgetOptions, implemented on button and checkbox/combobox/sliders.
Change window popout buttons to inline size type.

* Rename SearchMenu.h to SearchableMenuItems.h and move to BenGui folder.

* Forgot to change the include XD

* Change `modifierFunc` to `preFunc`, updated documentation for that and including `postFunc`.

* Modify code to require variable for non-CVar widget initialization when necessary. Check for `valuePointer` being nullptr, and preventing widget drawing with a debug assert and error log entry.
Remove all `has_variant` calls and wrap entire widget type switch in `SearchMenuGetItem` with a try/catch on `std::bad_variant_access` with another error log and debug assert.

* More review changes.

* Implement `isPercentage`, `format`, and `showButtons` for sliders.
Pull values of those over from menubar.
Add documentation on `widgetOptions` for those and others added for previous review changes.
Move Fast Magic Arrow and Instant Fin Recall to Gameplay section.

* Modify header and sidebar "buttons" to match theming of regular buttons.

* Add precision clamping to SliderFloat value. At least 1.0 seems to be consistent at "100%".
Change IR slider to be percentage.

* Mention weirdness with SDL and pad menu button in controller nav tooltip.

* Move Menu files to 2s2h/BenGui.

* Add Warp Points to Developer Tools.
Make "Press F1" prompt show only when a menu isn't registered.

* clang

* Make search input take focus when search menu is open.

* Forgot include.

* Global search (#3)

* Restore Sidebar search entry, but lock it behind a checkbox in Settings. Dynamically adds or removes the sidebar entry, and header search is toggled inversely.

* Make menu toggle its visibility when using the button in the menu to close. Couldn't handle Alt+F4 without a hook I didn't want to add.
Remove unneeded commented code.

---------

Co-authored-by: Caladius <Caladius@users.noreply.github.com>
Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2024-10-02 20:25:26 -04:00
ArchezandGitHub 75bc685360 Fix pr-artifacts fetch script after version update (#786) 2024-10-01 15:32:03 -04:00
ArchezandGitHub 200aaf7be8 bump lus (#782) 2024-10-01 12:15:30 -04:00
Garrett CoxandGitHub f33f994adc Update pr-artifacts for node20 (#784) 2024-10-01 12:15:16 -04:00
ArchezandGitHub b1eea9ca76 Use variadic arguments with GameInteractor_Should (#766)
* PoC of using variadic arguments with GameInteractor_Should

* va_list boilerplate in SHOULD macro

* drop opt arg in favor of variadic arg changes

* account for default type promotion

* remove demo code
2024-09-26 12:39:05 -04:00
ArchezandGitHub 1475e6af7b Fix 3ds clock fill texture position (#772) 2024-09-19 18:47:28 -07:00
ArchezandGitHub 25887952c9 [Enhancement] Actor Nametags (#746)
* add new GI hooks

* move collision viewer to draw hook

* actor viewer tweaks; prevent crash when actors are killed

* add ShipUtils

* add actor name tags

* add debug name tags to actor viewer

* fixes

* headers?

* cleanup actor viewer

* Add more options for actor name tags

* headers

* headers

* ditch fmt::join cause linux package managers use old spdlog/fmt

* just a little more cleanup
2024-09-13 10:10:59 -04:00
ArchezandGitHub 137ca0de12 fix zora magic shield alpha (#768) 2024-09-12 16:32:19 -04:00
ArchezandGitHub a5059beaeb fix enum value for woodfall restoration (#769) 2024-09-12 14:32:09 -04:00
balloondude2andGitHub 4d1ddff798 Fix some Fierce Diety interactions in Clock Town (#730)
* fix fd town archery softlock

* allow FD to leave town
2024-09-08 19:01:02 -04:00
ArchezandGitHub bbfa903a99 fix more incorrect dpad handling for hud updates (#764) 2024-09-08 18:54:11 -04:00
ArchezandGitHub 6ff3be97de fix some actor shadow textures not updating (#758) 2024-09-08 18:45:54 -04:00
ArchezandGitHub 466a716222 Add restoration for woodfall mountain cleared state (#765)
* Add restoration for woodfall mountain cleared state

* enum
2024-09-08 18:27:36 -04:00
185e761f78 [Enhancement] Fierce Deity Anchored Backwalk Animation (#670)
* Add Fierce Deity anchored backwalk enhancement

* adjust ztarget hook to clamp speed instead of modifying animation frame logic

---------

Co-authored-by: Archez <archez39@me.com>
2024-09-03 23:00:11 -04:00
balloondude2andGitHub ea8809ddd0 Allow non-ascii characters in filepath on Windows (#743) 2024-09-03 22:41:16 -04:00
MalkierianandGitHub 13035d72a4 Change recommended build tools from 142 to 143, minimum VS to 2022. (#762) 2024-08-30 14:46:04 -04:00
MothsteryandGitHub 136a928883 [Enhancement] Custom Zora Egg Count (#624)
* initial commit of relevant files

* attempt to appease clang formatting

* fix edge case of marine researcher dialogue being wrong with low egg counts

* refactored to better use hooks and no longer touch main mm code directly

* undo GameInteractor.h changes

* removed useless egg checks, only need the researcher

* trigger remote build

* removing useless includes leftover from the old approach.

* move UIWidgets for egg into existing section
2024-08-24 12:22:30 -04:00
ArchezandGitHub 0c2a51c9f4 Various custom asset support (#756)
* use asset paths for better custom asset support

* fix keyframe animation timings

* display title cards as a full texture

* asset support for gfxprint

* support pause menu overworld map

* fix more resources that need to be loaded

* pr feedback
2024-08-23 17:19:41 -04:00
d74699740e [Enhancement] Instant Recall (#589)
* Instant Recall

* clang it

* Moved to Category "Equipment"

* pr review feedback

---------

Co-authored-by: Archez <archez39@me.com>
2024-08-18 23:24:14 -04:00
ArchezandGitHub 542feb038e Implement save backups and better invalid json detection (#749) 2024-08-18 18:04:25 -04:00
HoeloeandGitHub b0ca99f18c [Enhancement] MM3D style clock (#713) 2024-08-18 17:55:02 -04:00
Garrett CoxandGitHub 53faf37dc1 Add persistent bunny mask enhancement (#537) 2024-08-18 11:41:17 -04:00
ArchezandGitHub 63ffddb67b Bump LUS (#754) 2024-08-14 18:41:31 -04:00
Garrett CoxandGitHub 4a57bdbc5f Add widescreen actor culling option (#652) 2024-08-09 16:42:34 -04:00
mckinleeandGitHub 0ec23b34ba [Enhancement] Pause Owl Warp (#620)
* Add Pause Owl Warp Enhancement

- **mm/2s2h/BenGui/BenMenuBar.cpp**: Updated menu to include new enhancement options.
- **mm/2s2h/Enhancements/Enhancements.cpp**: Registered the new Pause Owl Warp enhancement.
- **mm/2s2h/Enhancements/Enhancements.h**: Declared functions for the new enhancement.
- **mm/2s2h/Enhancements/Songs/PauseOwlWarp.cpp**: Implemented the Pause Owl Warp functionality.
- **mm/2s2h/Enhancements/Songs/PauseOwlWarp.h**: Header file for the Pause Owl Warp implementation.
- **mm/include/functions.h**: Added function declarations related to the new enhancement.
- **mm/src/overlays/kaleido_scope/ovl_kaleido_map.c**: Modified to support the new enhancement.
- **mm/src/overlays/kaleido_scope/ovl_kaleido_scope_NES.c**: Modified to support the new enhancement.

* ran clang-format script

* Additional logic and bug fixes

* Fix PauseOwlWarp cursor logic triggering on dungeon map
-Added a check to ensure PauseOwlWarp's cursor logic is only triggered when not in a dungeon.

* Add Song of Soaring check
- To make it more in line with vanilla, you are now required to have the Song of Soaring to use this enhancement.

* bug fix and ran clang-format script
-My previous commit had a extra condition that wasn't needed that caused a bug where the world map points locations pointed to activated owl statues.

* added more checks

* Simplified complex conditional statements

* possibly fix macos build issue?

* index warping logic added

* implement feedback from Archez

* shot in the dark macos build fix?

* how bout now?

* revert back to previous commit

* if this fixed the macos build issue it'll be thanks to cclark25... let's pray

* add debugeditor check - thanks archez!

* Moved debugEditor check to prevent triggering ALL pauseOwlWarp logic. wtf was I thinking earlier
2024-08-05 15:18:52 -04:00
d0caa0f78c [Cheat] Stop time in Temples and Dungeons (#700)
* add cheat to stop time in temples

* better tooltip

* adds option to stop time in dungeons

* clean up

* add other pirate fortress scenes

* add new hook

* update tooltips

* rename hook

* add clarification

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

* clean combobox

---------

Co-authored-by: Archez <Archez@users.noreply.github.com>
2024-08-05 15:12:08 -04:00
51af06463f Item drops 3D! (#633)
* Initial 3D Item Drops Toggle

* Use generic hooks and other tweaks

* 3d drop fixes and changes

* move slime item draw to VB hook; fix arrow GID

* whitespacing

---------

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
Co-authored-by: Archez <archez39@me.com>
2024-07-23 21:39:25 -04:00
ArchezandGitHub 57cb5d2b51 Merge develop-rika -> develop
Merge develop-rika -> develop
2024-07-11 22:36:55 -04:00
Archez 24d8d47ab2 Merge remote-tracking branch 'origin/develop' into merge-develop-rika 2024-07-11 22:05:15 -04:00
aa1b0108f4 [Enhancement] Preseve time speed during cycle reset (#658)
* preseve time speed during cycle reset enhancement

* clang format

* update variable assignment

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

* add default value

* better initial value

---------

Co-authored-by: Archez <Archez@users.noreply.github.com>
2024-07-11 21:44:08 -04:00
2e4710c6c2 Tweaks to warp point (#666)
* Tweaks to warp point

* wait for console logo exit

---------

Co-authored-by: Archez <Archez@users.noreply.github.com>
2024-06-25 00:16:10 -04:00
balloondude2andGitHub 3ef3e7a239 [Enhancement] Fix Fierce Deity interactions with Bombers (#674)
* Allow FD to talk to Bomber Jim. Adds comments to unknown data.

* fd works with blue bombers and guard bomber

* clang format
2024-06-24 20:46:58 -04:00
ArchezandGitHub a38b9daa6d Add HUD Editor support for horse carrots (#704) 2024-06-23 15:19:33 -04:00
ArchezandGitHub 120562952c bump lus with color combiner fixes (#711) 2024-06-23 14:51:57 -04:00
ArchezandGitHub fc309f5eaa bump lus with ucode change (#708) 2024-06-22 15:05:32 -04:00
inspectredcandGitHub e87d7c6954 Delete z_message_tables.inc (#685) 2024-06-18 20:01:17 -04:00
ArchezandGitHub 8b2b12dbe8 Bump latest lus and bring over Array resource (#689)
* bump latest lus and bring over array resource

* use upstream otrexporter
2024-06-18 20:00:16 -04:00
inspectredcandGitHub e60ca15ae6 Merge pull request #683 from HarbourMasters/develop-rika
`develop-rika` -> `develop`
2024-06-10 11:51:48 +01:00
Garrett CoxandGitHub 6fd7fc3a9d Merge pull request #659 from HarbourMasters/develop-rika
`develop-rika` -> `develop`
2024-06-04 07:42:49 -05:00
51a6d9d926 [Enhancement] Fast Deku Flower Launch (#549)
* Add fast deku flower launch enhancement

Co-authored-by: Patrick12115 <115201185+Patrick12115@users.noreply.github.com>

* Migrate to a hook

---------

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2024-06-04 01:58:32 -05:00
5e17828cc4 [Cheat] Longer Deku Flower Gliding (#548)
* Add Longer Flower Glide enhancement

Co-authored-by: Patrick12115 <115201185+Patrick12115@users.noreply.github.com>

* Tweak to just modify an array

* Update mm/2s2h/Enhancements/Cheats/LongerFlowerGlide.cpp

---------

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2024-06-04 00:02:48 -05:00
d2a11f1476 [Enhancement] Instant Putaway (#547)
* Instant Putaway Enhancement

Co-authored-by: Patrick12115 <115201185+Patrick12115@users.noreply.github.com>

* Tweak some things and merge with Player Movement

---------

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2024-06-03 22:38:29 -05:00
Garrett CoxandGitHub f8f00e6d9b Add draw distance enhancements for actors and scene geometry (#539) 2024-06-02 23:15:33 -05:00
2d8bc175fe [Enhancement] Blast Mask with Powder Keg (#642)
* Blast Mask adds Powder Keg explosive property.

* Alphabetical Menu Listing + clang

* Apply suggestions from code review

---------

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2024-06-02 22:27:33 -05:00
5de6a9ac8f Add 2ship-specific BUILDING.md and supportedHashes.json. (#551)
* Add 2ship-specific BUILDING.md and supportedHashes.json.

* Somehow missed N64 hash.
Shipwright -> 2ship2harkinian
Ship.sln -> 2s2h.sln

* Mac dependencies

Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com>

---------

Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com>
2024-06-02 21:54:36 -05:00
03a597d44c [Enhancement] Banker - Adds Min Max Functionality (#591)
* Adds min and max functionality by pressing the R and Z buttons while the Deposit Rupees dialogue box is opened.

* Place functionality behind a cvar.

* clangified

* I slished when i shoulda slashed!

* removal of src/

* Typo in tooltip

* Updated to dynamic hook registration and fix sfx spam.

* clang

* Remove double assignment.

* Update to HOOK_ID and adds Withdrawal functionaility.

* Updated currentTextId's to actual format.

* Clangs

* Move to dialogue menu

---------

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2024-06-02 21:52:30 -05:00
139a240ed3 [Graphics] Disable Black Bar Letterboxes (#590)
* Black Bars be gone

* Move it to draw/apply functions

Updates in real time now

* Added return instead

* added space

* Update mm/2s2h/Enhancements/Enhancements.cpp

* Update mm/2s2h/Enhancements/Enhancements.cpp

---------

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2024-06-02 21:32:19 -05:00
26321c9a17 Adds Dungeon Items to the Save Editor (#585)
* Adds Dungeon Items to the Save Editor

* clang'd up

* Update mm/include/z64save.h

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

* Move a few static arrays

---------

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2024-06-02 21:18:17 -05:00
888b8fe24a Skip Magic Arrow Equip Animation (#546)
* Recreate Magic Equip Animation Skip PR for new Fork.

* After Running Clang Powershell Script

* Delete clang-format.exe

* Apply suggestions from code review

---------

Co-authored-by: Garrett Cox <garrettjcox@gmail.com>
2024-06-02 20:18:16 -05:00
Garrett CoxandGitHub 53e76c5aeb Add time-moves-when-you-move mode (#536) 2024-06-02 20:10:08 -05:00
Garrett CoxandGitHub 04e5ac449d Merge pull request #631 from HarbourMasters/develop-rika
`develop-rika` -> `develop`
2024-05-31 23:36:54 -05:00
QloneverandGitHub e484e0ba82 fix control code logic (#586) 2024-05-30 22:36:14 -04:00
inspectredcandGitHub 291973fffe Use HOOK_ID typedef (#581) 2024-05-28 13:14:39 -05:00
Garrett CoxandGitHub 01ae001de5 Merge pull request #564 from HarbourMasters/develop-rika
develop-rika -> develop THIRD TIMES THE CHARM
2024-05-27 21:19:23 -05:00
ArchezandGitHub 711b02be55 Merge pull request #554 from HarbourMasters/develop-rika
develop-rika -> develop
2024-05-27 20:47:57 -04:00
Garrett CoxandGitHub 513e89c073 Merge pull request #540 from HarbourMasters/develop-rika
develop-rika -> develop
2024-05-27 11:40:47 -05:00
269 changed files with 11815 additions and 3435 deletions
+4 -2
View File
@@ -192,15 +192,17 @@ jobs:
key: ${{ runner.os }}-14-macports-${{ hashFiles('.github/workflows/macports-deps.txt') }} key: ${{ runner.os }}-14-macports-${{ hashFiles('.github/workflows/macports-deps.txt') }}
restore-keys: | restore-keys: |
${{ runner.os }}-14-macports- ${{ runner.os }}-14-macports-
# Updated PATH applies to the next step and onwards
- name: Install MacPorts (if necessary) - name: Install MacPorts (if necessary)
run: | run: |
if [ command -v port &>/dev/null ]; then if command -v /opt/local/bin/port 2>&1 >/dev/null; then
echo "MacPorts already installed" echo "MacPorts already installed"
else else
echo "Installing MacPorts"
wget https://github.com/macports/macports-base/releases/download/v2.9.3/MacPorts-2.9.3-14-Sonoma.pkg wget https://github.com/macports/macports-base/releases/download/v2.9.3/MacPorts-2.9.3-14-Sonoma.pkg
sudo installer -pkg ./MacPorts-2.9.3-14-Sonoma.pkg -target / sudo installer -pkg ./MacPorts-2.9.3-14-Sonoma.pkg -target /
fi fi
echo "/opt/local/bin:/opt/local/sbin" >> $GITHUB_PATH echo "/opt/local/bin:/opt/local/sbin" >> "$GITHUB_PATH"
- name: Install dependencies - name: Install dependencies
run: | run: |
brew uninstall --ignore-dependencies libpng brew uninstall --ignore-dependencies libpng
+6 -5
View File
@@ -12,7 +12,7 @@ jobs:
if: ${{ github.event.workflow_run.event == 'pull_request' }} if: ${{ github.event.workflow_run.event == 'pull_request' }}
steps: steps:
- id: 'pr-number' - id: 'pr-number'
uses: actions/github-script@v6 uses: actions/github-script@v7
with: with:
result-encoding: string result-encoding: string
script: | script: |
@@ -20,8 +20,9 @@ jobs:
const pullHeadSHA = '${{github.event.workflow_run.head_sha}}'; const pullHeadSHA = '${{github.event.workflow_run.head_sha}}';
const pullUserId = ${{github.event.sender.id}}; const pullUserId = ${{github.event.sender.id}};
const prNumber = await (async () => { const prNumber = await (async () => {
const pulls = await github.rest.pulls.list({owner, repo}); for await (const { data } of github.paginate.iterator(
for await (const {data} of github.paginate.iterator(pulls)) { github.rest.pulls.list, { owner, repo }
)) {
for (const pull of data) { for (const pull of data) {
if (pull.head.sha === pullHeadSHA && pull.user.id === pullUserId) { if (pull.head.sha === pullHeadSHA && pull.user.id === pullUserId) {
return pull.number; return pull.number;
@@ -36,7 +37,7 @@ jobs:
return prNumber; return prNumber;
- id: 'artifacts-text' - id: 'artifacts-text'
uses: actions/github-script@v6 uses: actions/github-script@v7
with: with:
result-encoding: string result-encoding: string
script: | script: |
@@ -54,7 +55,7 @@ jobs:
return acc; return acc;
}, '### Build Artifacts'); }, '### Build Artifacts');
- id: 'add-to-pr' - id: 'add-to-pr'
uses: garrettjoecox/pr-section@3.1.0 uses: garrettjoecox/pr-section@4.0.0
with: with:
repo-token: '${{ secrets.GITHUB_TOKEN }}' repo-token: '${{ secrets.GITHUB_TOKEN }}'
pr-number: ${{ steps.pr-number.outputs.result }} pr-number: ${{ steps.pr-number.outputs.result }}
+2 -2
View File
@@ -16,8 +16,8 @@ android {
} }
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 31 targetSdkVersion 31
versionCode 3 versionCode 4
versionName "1.0.2" versionName "1.1.1"
externalNativeBuild { externalNativeBuild {
//ndkBuild { //ndkBuild {
// arguments "APP_PLATFORM=android-23" // arguments "APP_PLATFORM=android-23"
+2 -2
View File
@@ -4,8 +4,8 @@
--> -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dishii.mm" package="com.dishii.mm"
android:versionCode="3" android:versionCode="4"
android:versionName="1.0.2" android:versionName="1.1.1"
android:installLocation="auto"> android:installLocation="auto">
<!-- OpenGL ES 3.0 --> <!-- OpenGL ES 3.0 -->
+3 -3
View File
@@ -5,10 +5,10 @@ set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use")
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
project(2s2h VERSION 1.0.2 LANGUAGES C CXX) project(2s2h VERSION 1.1.1 LANGUAGES C CXX)
include(CMake/2ship-cvars.cmake) include(CMake/2ship-cvars.cmake)
include(CMake/lus-cvars.cmake) include(CMake/lus-cvars.cmake)
set(PROJECT_BUILD_NAME "Rika Charlie" CACHE STRING "" FORCE) set(PROJECT_BUILD_NAME "Satoko Bravo" CACHE STRING "" FORCE)
set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "" FORCE) set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "" FORCE)
set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT 2ship) set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT 2ship)
@@ -32,7 +32,7 @@ endif()
set(GFX_DEBUG_DISASSEMBLER ON) set(GFX_DEBUG_DISASSEMBLER ON)
# Tell LUS we're using F3DEX_GBI_2 (in a way that doesn't break libgfxd) # Tell LUS we're using F3DEX_GBI_2 (in a way that doesn't break libgfxd)
set(USE_F3DEX2 ON) set(GBI_UCODE F3DEX_GBI_2)
################################################################################ ################################################################################
# Set target arch type if empty. Visual studio solution generator provides it. # Set target arch type if empty. Visual studio solution generator provides it.
+239
View File
@@ -0,0 +1,239 @@
# Building 2 Ship 2 Harkinian
## Windows
Requires:
* At least 8GB of RAM (machines with 4GB have seen complier failures)
* Visual Studio 2022 Community Edition with the C++ feature set
* One of the Windows SDKs that comes with Visual Studio, for example the current Windows 10 version 10.0.19041.0
* The `MSVC v143 - VS 2022 C++ build tools` component of Visual Studio
* Python 3 (can be installed manually or as part of Visual Studio)
* Git (can be installed manually or as part of Visual Studio)
* Cmake (can be installed via chocolatey or manually)
During installation, check the "Desktop development with C++" feature set:
![image](https://user-images.githubusercontent.com/30329717/183511274-d11aceea-7900-46ec-acb6-3f2cc110021a.png)
Doing so should also check one of the Windows SDKs by default. Then, in the installation details in the right-hand column, make sure you also check the v143 toolset. This is often done by default.
It is recommended that you install Python and Git standalone, the install process in VS Installer has given some issues in the past.
1. Clone the 2 Ship 2 Harkinian repository
_Note: Be sure to either clone with the ``--recursive`` flag or do ``git submodule update --init`` after cloning to pull in the libultraship submodule!_
2. After setup and initial build, use the built-in O2R extraction to make your mm.o2r file.
_Note: Instructions assume using powershell_
```powershell
# Navigate to the 2ship2harkinian repo within powershell. ie: cd "C:\yourpath\2ship2harkinian"
cd 2ship2harkinian
# Setup cmake project
# Add `-DCMAKE_BUILD_TYPE:STRING=Release` if you're packaging
& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 17 2022" -T v143 -A x64
# Generate 2ship.o2r
& 'C:\Program Files\CMake\bin\cmake.exe' --build .\build\x64 --target Generate2ShipOtr
# Compile project
# Add `--config Release` if you're packaging
& 'C:\Program Files\CMake\bin\cmake.exe' --build .\build\x64
# Now you can run the executable in .\build\x64 or run in Visual Studio
```
### Developing 2S2H
With the cmake build system you have two options for working on the project:
#### Visual Studio
To develop using Visual Studio you only need to use cmake to generate the solution file:
```powershell
# Generates 2s2h.sln at `build/x64` for Visual Studio 2022
& 'C:\Program Files\CMake\bin\cmake' -S . -B "build/x64" -G "Visual Studio 17 2022" -T v143 -A x64
```
#### Visual Studio Code or another editor
To develop using Visual Studio Code or another editor you only need to open the repository in it.
To build you'll need to follow the instructions from the building section.
_Note: If you're using Visual Studio Code, the [cpack plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._
_Experimental: You can also use another build system entirely rather than MSVC like [Ninja](https://ninja-build.org/) for possibly better performance._
### Generating the distributable
After compiling the project you can generate the distributable by running:
```powershell
# Go to build folder
cd "build/x64"
# Generate
& 'C:\Program Files\CMake\bin\cpack.exe' -G ZIP
```
### Additional CMake Targets
#### Clean
```powershell
# If you need to clean the project you can run
C:\Program Files\CMake\bin\cmake.exe --build build-cmake --target clean
```
#### Regenerate Asset Headers
```powershell
# If you need to regenerate the asset headers to check them into source
C:\Program Files\CMake\bin\cmake.exe --build build-cmake --target ExtractAssetHeaders
```
## Linux
### Install dependencies
#### Debian/Ubuntu
```sh
# using gcc
apt-get install gcc g++ git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libboost-dev libopengl-dev
# or using clang
apt-get install clang git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libboost-dev libopengl-dev
```
#### Arch
```sh
# using gcc
pacman -S gcc git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net boost
# or using clang
pacman -S clang git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net boost
```
#### Fedora
```sh
# using gcc
dnf install gcc gcc-c++ git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools nlohmann-json-devel tinyxml2-devel spdlog-devel boost-devel
# or using clang
dnf install clang git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools nlohmann-json-devel tinyxml2-devel spdlog-devel boost-devel
```
#### openSUSE
```sh
# using gcc
zypper in gcc gcc-c++ git cmake ninja SDL2-devel libpng16-devel libzip-devel libzip-tools nlohmann_json-devel tinyxml2-devel spdlog-devel
# or using clang
zypper in clang libstdc++-devel git cmake ninja SDL2-devel libpng16-devel libzip-devel libzip-tools nlohmann_json-devel tinyxml2-devel spdlog-devel
```
### Build
_Note: If you're using Visual Studio Code, the [CMake Tools plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._
```bash
# Clone the repo and enter the directory
git clone https://github.com/HarbourMasters/2ship2harkinian.git
cd 2ship2harkinian
# Clone the submodules
git submodule update --init
# Generate Ninja project
# Add `-DCMAKE_BUILD_TYPE:STRING=Release` if you're packaging
# Add `-DPython3_EXECUTABLE=$(which python3)` if you are using non-standard Python installations such as PyEnv
cmake -H. -Bbuild-cmake -GNinja
# Generate 2ship.o2r
cmake --build build-cmake --target Generate2ShipOtr
# Compile the project
# Add `--config Release` if you're packaging
cmake --build build-cmake
# Now you can run the executable in ./build-cmake/mm/2s2h.elf
# To develop the project open the repository in VSCode (or your preferred editor)
```
### Generate a distributable
After compiling the project you can generate a distributable by running of the following:
```bash
# Go to build folder
cd build-cmake
# Generate
cpack -G DEB
cpack -G ZIP
cpack -G External (creates appimage)
```
### Additional CMake Targets
#### Clean
```bash
# If you need to clean the project you can run
cmake --build build-cmake --target clean
```
#### Regenerate Asset Headers
```bash
# If you need to regenerate the asset headers to check them into source
cmake --build build-cmake --target ExtractAssetHeaders
```
## macOS
Requires Xcode (or xcode-tools) && `sdl2, libpng, glew, ninja, cmake, nlohmann-json, libzip` (can be installed via homebrew, macports, etc)
**Important: For maximum performance make sure you have ninja build tools installed!**
_Note: If you're using Visual Studio Code, the [cpack plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._
```bash
# Clone the repo
git clone https://github.com/HarbourMasters/2ship2harkinian.git
cd 2ship2harkinian
# Clone the submodule libultraship
git submodule update --init
# Generate Ninja project
# Add `-DCMAKE_BUILD_TYPE:STRING=Release` if you're packaging
cmake -H. -Bbuild-cmake -GNinja
# Generate 2ship.o2r
cmake --build build-cmake --target Generate2ShipOtr
# Compile the project
# Add `--config Release` if you're packaging
cmake --build build-cmake
# Now you can run the executable file:
./build-cmake/mm/2s2h-macos
# To develop the project open the repository in VSCode (or your preferred editor)
```
### Generating a distributable
After compiling the project you can generate a distributable by running of the following:
```bash
# Go to build folder
cd build-cmake
# Generate
cpack
```
### Additional CMake Targets
#### Clean
```bash
# If you need to clean the project you can run
cmake --build build-cmake --target clean
```
#### Regenerate Asset Headers
```bash
# If you need to regenerate the asset headers to check them into source
cmake --build build-cmake --target ExtractAssetHeaders
```
# Compatible Roms
See [`supportedHashes.json`](supportedHashes.json)
## Getting CI to work on your fork
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 `mm/`.
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. Make sure to add the 'asset-builder' tag to your newly added runner to assign it to run this step. 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).
### Runner on Windows
You'll have to enable the ability to run unsigned scripts through PowerShell. To do this, open Powershell as administrator and run `set-executionpolicy remotesigned`. Most dependencies get installed as part of the CI process. You will also need to separately install 7z and add it to the PATH so `7z` can be run as a command. [Chocolatey](https://chocolatey.org/) or other package managers can be used to install it easily.
### Runner on UNIX systems
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.
+1 -1
View File
@@ -7,4 +7,4 @@
"name": "NTSC-U GC", "name": "NTSC-U GC",
"sha1": "9743aa026e9269b339eb0e3044cd5830a440c1fd" "sha1": "9743aa026e9269b339eb0e3044cd5830a440c1fd"
} }
] ]
+42 -14
View File
@@ -8,6 +8,7 @@
#include <Fast3D/gfx_pc.h> #include <Fast3D/gfx_pc.h>
#include "UIWidgets.hpp" #include "UIWidgets.hpp"
#include "HudEditor.h" #include "HudEditor.h"
#include "Notification.h"
#ifdef __APPLE__ #ifdef __APPLE__
#include "graphic/Fast3D/gfx_metal.h" #include "graphic/Fast3D/gfx_metal.h"
@@ -20,6 +21,9 @@
#include "include/global.h" #include "include/global.h"
#include "include/z64audio.h" #include "include/z64audio.h"
#include "Enhancements/Trackers/ItemTracker.h"
#include "Enhancements/Trackers/ItemTrackerSettings.h"
namespace BenGui { namespace BenGui {
// MARK: - Delegates // MARK: - Delegates
@@ -27,7 +31,6 @@ std::shared_ptr<BenMenuBar> mBenMenuBar;
std::shared_ptr<Ship::GuiWindow> mConsoleWindow; std::shared_ptr<Ship::GuiWindow> mConsoleWindow;
std::shared_ptr<Ship::GuiWindow> mStatsWindow; std::shared_ptr<Ship::GuiWindow> mStatsWindow;
std::shared_ptr<Ship::GuiWindow> mInputEditorWindow;
std::shared_ptr<Ship::GuiWindow> mGfxDebuggerWindow; std::shared_ptr<Ship::GuiWindow> mGfxDebuggerWindow;
std::shared_ptr<SaveEditorWindow> mSaveEditorWindow; std::shared_ptr<SaveEditorWindow> mSaveEditorWindow;
@@ -35,6 +38,11 @@ std::shared_ptr<HudEditorWindow> mHudEditorWindow;
std::shared_ptr<ActorViewerWindow> mActorViewerWindow; std::shared_ptr<ActorViewerWindow> mActorViewerWindow;
std::shared_ptr<CollisionViewerWindow> mCollisionViewerWindow; std::shared_ptr<CollisionViewerWindow> mCollisionViewerWindow;
std::shared_ptr<EventLogWindow> mEventLogWindow; std::shared_ptr<EventLogWindow> mEventLogWindow;
std::shared_ptr<BenMenu> mBenMenu;
std::shared_ptr<BenInputEditorWindow> mBenInputEditorWindow;
std::shared_ptr<Notification::Window> mNotificationWindow;
std::shared_ptr<ItemTrackerWindow> mItemTrackerWindow;
std::shared_ptr<ItemTrackerSettingsWindow> mItemTrackerSettingsWindow;
void SetupGuiElements() { void SetupGuiElements() {
auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui(); auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui();
@@ -47,7 +55,7 @@ void SetupGuiElements() {
mBenMenuBar = std::make_shared<BenMenuBar>(CVAR_MENU_BAR_OPEN, CVarGetInteger(CVAR_MENU_BAR_OPEN, 0)); mBenMenuBar = std::make_shared<BenMenuBar>(CVAR_MENU_BAR_OPEN, CVarGetInteger(CVAR_MENU_BAR_OPEN, 0));
gui->SetMenuBar(std::reinterpret_pointer_cast<Ship::GuiMenuBar>(mBenMenuBar)); gui->SetMenuBar(std::reinterpret_pointer_cast<Ship::GuiMenuBar>(mBenMenuBar));
if (gui->GetMenuBar() && !gui->GetMenuBar()->IsVisible()) { if (!gui->GetMenuBar() && !CVarGetInteger("gSettings.DisableMenuShortcutNotify", 0)) {
#if defined(__SWITCH__) || defined(__WIIU__) || defined(__ANDROID__) #if defined(__SWITCH__) || defined(__WIIU__) || defined(__ANDROID__)
gui->GetGameOverlay()->TextDrawNotification(30.0f, true, "Press - to access enhancements menu"); gui->GetGameOverlay()->TextDrawNotification(30.0f, true, "Press - to access enhancements menu");
#else #else
@@ -55,6 +63,9 @@ void SetupGuiElements() {
#endif #endif
} }
mBenMenu = std::make_shared<BenMenu>("gWindows.Menu", "Settings Menu");
gui->SetMenu(mBenMenu);
mStatsWindow = gui->GetGuiWindow("Stats"); mStatsWindow = gui->GetGuiWindow("Stats");
if (mStatsWindow == nullptr) { if (mStatsWindow == nullptr) {
SPDLOG_ERROR("Could not find stats window"); SPDLOG_ERROR("Could not find stats window");
@@ -65,43 +76,60 @@ void SetupGuiElements() {
SPDLOG_ERROR("Could not find console window"); SPDLOG_ERROR("Could not find console window");
} }
mInputEditorWindow = gui->GetGuiWindow("Input Editor");
if (mInputEditorWindow == nullptr) {
SPDLOG_ERROR("Could not find input editor window");
}
mGfxDebuggerWindow = gui->GetGuiWindow("GfxDebuggerWindow"); mGfxDebuggerWindow = gui->GetGuiWindow("GfxDebuggerWindow");
if (mGfxDebuggerWindow == nullptr) { if (mGfxDebuggerWindow == nullptr) {
SPDLOG_ERROR("Could not find input GfxDebuggerWindow"); SPDLOG_ERROR("Could not find input GfxDebuggerWindow");
} }
mSaveEditorWindow = std::make_shared<SaveEditorWindow>("gWindows.SaveEditor", "Save Editor"); mBenInputEditorWindow = std::make_shared<BenInputEditorWindow>("gWindows.BenInputEditor", "2S2H Input Editor");
gui->AddGuiWindow(mBenInputEditorWindow);
mSaveEditorWindow = std::make_shared<SaveEditorWindow>("gWindows.SaveEditor", "Save Editor", ImVec2(480, 600));
gui->AddGuiWindow(mSaveEditorWindow); gui->AddGuiWindow(mSaveEditorWindow);
mHudEditorWindow = std::make_shared<HudEditorWindow>("gWindows.HudEditor", "Hud Editor"); mHudEditorWindow = std::make_shared<HudEditorWindow>("gWindows.HudEditor", "HUD Editor", ImVec2(480, 600));
gui->AddGuiWindow(mHudEditorWindow); gui->AddGuiWindow(mHudEditorWindow);
mActorViewerWindow = std::make_shared<ActorViewerWindow>("gWindows.ActorViewer", "Actor Viewer"); mActorViewerWindow = std::make_shared<ActorViewerWindow>("gWindows.ActorViewer", "Actor Viewer", ImVec2(520, 600));
gui->AddGuiWindow(mActorViewerWindow); gui->AddGuiWindow(mActorViewerWindow);
mCollisionViewerWindow = std::make_shared<CollisionViewerWindow>("gWindows.CollisionViewer", "Collision Viewer"); mCollisionViewerWindow =
std::make_shared<CollisionViewerWindow>("gWindows.CollisionViewer", "Collision Viewer", ImVec2(390, 475));
gui->AddGuiWindow(mCollisionViewerWindow); gui->AddGuiWindow(mCollisionViewerWindow);
mEventLogWindow = std::make_shared<EventLogWindow>("gWindows.EventLog", "Event Log"); mEventLogWindow = std::make_shared<EventLogWindow>("gWindows.EventLog", "Event Log", ImVec2(520, 600));
gui->AddGuiWindow(mEventLogWindow); gui->AddGuiWindow(mEventLogWindow);
mItemTrackerWindow = std::make_shared<ItemTrackerWindow>("gWindows.ItemTracker", "Item Tracker");
gui->AddGuiWindow(mItemTrackerWindow);
mItemTrackerSettingsWindow = std::make_shared<ItemTrackerSettingsWindow>("gWindows.ItemTrackerSettings",
"Item Tracker Settings", ImVec2(800, 400));
gui->AddGuiWindow(mItemTrackerSettingsWindow);
gui->SetPadBtnTogglesMenu();
mNotificationWindow = std::make_shared<Notification::Window>("gWindows.Notifications", "Notifications Window");
gui->AddGuiWindow(mNotificationWindow);
mNotificationWindow->Show();
} }
void Destroy() { void Destroy() {
auto gui = Ship::Context::GetInstance()->GetWindow()->GetGui();
gui->RemoveAllGuiWindows();
mBenMenuBar = nullptr; mBenMenuBar = nullptr;
mBenMenu = nullptr;
mStatsWindow = nullptr; mStatsWindow = nullptr;
mConsoleWindow = nullptr; mConsoleWindow = nullptr;
mInputEditorWindow = nullptr; mBenInputEditorWindow = nullptr;
mGfxDebuggerWindow = nullptr; mGfxDebuggerWindow = nullptr;
mCollisionViewerWindow = nullptr; mCollisionViewerWindow = nullptr;
mEventLogWindow = nullptr; mEventLogWindow = nullptr;
mNotificationWindow = nullptr;
mSaveEditorWindow = nullptr; mSaveEditorWindow = nullptr;
mHudEditorWindow = nullptr; mHudEditorWindow = nullptr;
mActorViewerWindow = nullptr; mActorViewerWindow = nullptr;
mItemTrackerWindow = nullptr;
mItemTrackerSettingsWindow = nullptr;
} }
} // namespace BenGui } // namespace BenGui
+2
View File
@@ -7,6 +7,8 @@
#include "DeveloperTools/ActorViewer.h" #include "DeveloperTools/ActorViewer.h"
#include "DeveloperTools/CollisionViewer.h" #include "DeveloperTools/CollisionViewer.h"
#include "DeveloperTools/EventLog.h" #include "DeveloperTools/EventLog.h"
#include "BenInputEditorWindow.h"
#include "Menu.h"
namespace BenGui { namespace BenGui {
void SetupHooks(); void SetupHooks();
File diff suppressed because it is too large Load Diff
+90
View File
@@ -0,0 +1,90 @@
#pragma once
#include "stdint.h"
#include "window/gui/GuiWindow.h"
#ifndef IMGUI_DEFINE_MATH_OPERATORS
#define IMGUI_DEFINE_MATH_OPERATORS
#endif
#include <imgui.h>
#include <unordered_map>
#include <string>
#include <vector>
#include <set>
#include "controller/controldevice/controller/Controller.h"
class BenInputEditorWindow : public Ship::GuiWindow {
public:
using Ship::GuiWindow::GuiWindow;
~BenInputEditorWindow();
void DrawButton(const char* label, int32_t n64Btn, int32_t currentPort, int32_t* btnReading);
void DrawInputChip(const char* buttonName, ImVec4 color);
void DrawAnalogPreview(const char* label, ImVec2 stick, float deadzone = 0, bool gyro = false);
void DrawControllerSchema();
bool TestingRumble();
void DrawFullContents();
void DrawPortTabContents(uint8_t portIndex);
protected:
void InitElement() override;
void DrawElement() override;
void UpdateElement() override;
private:
void DrawStickDirectionLine(const char* axisDirectionName, uint8_t port, uint8_t stick, Ship::Direction direction,
ImVec4 color);
void DrawButtonLine(const char* buttonName, uint8_t port, CONTROLLERBUTTONS_T bitmask, ImVec4 color);
void DrawButtonLineEditMappingButton(uint8_t port, CONTROLLERBUTTONS_T bitmask, std::string id);
void DrawButtonLineAddMappingButton(uint8_t port, CONTROLLERBUTTONS_T bitmask);
void DrawStickDirectionLineEditMappingButton(uint8_t port, uint8_t stick, Ship::Direction direction,
std::string id);
void DrawStickDirectionLineAddMappingButton(uint8_t port, uint8_t stick, Ship::Direction direction);
void DrawStickSection(uint8_t port, uint8_t stick, int32_t id, ImVec4 color);
void DrawRumbleSection(uint8_t port);
void DrawRemoveRumbleMappingButton(uint8_t port, std::string id);
void DrawAddRumbleMappingButton(uint8_t port);
void DrawLEDSection(uint8_t port);
void DrawRemoveLEDMappingButton(uint8_t port, std::string id);
void DrawAddLEDMappingButton(uint8_t port);
void DrawGyroSection(uint8_t port);
void DrawRemoveGyroMappingButton(uint8_t port, std::string id);
void DrawAddGyroMappingButton(uint8_t port);
int32_t mGameInputBlockTimer;
int32_t mMappingInputBlockTimer;
int32_t mRumbleTimer;
std::shared_ptr<Ship::ControllerRumbleMapping> mRumbleMappingToTest;
// mBitmaskToMappingIds[port][bitmask] = { id0, id1, ... }
std::unordered_map<uint8_t, std::unordered_map<CONTROLLERBUTTONS_T, std::vector<std::string>>> mBitmaskToMappingIds;
// mStickDirectionToMappingIds[port][stick][direction] = { id0, id1, ... }
std::unordered_map<uint8_t,
std::unordered_map<uint8_t, std::unordered_map<Ship::Direction, std::vector<std::string>>>>
mStickDirectionToMappingIds;
void UpdateBitmaskToMappingIds(uint8_t port);
void UpdateStickDirectionToMappingIds(uint8_t port);
void GetButtonColorsForShipDeviceIndex(Ship::ShipDeviceIndex lusIndex, ImVec4& buttonColor,
ImVec4& buttonHoveredColor);
void DrawPortTab(uint8_t portIndex);
std::set<CONTROLLERBUTTONS_T> mButtonsBitmasks;
std::set<CONTROLLERBUTTONS_T> mDpadBitmasks;
void DrawButtonDeviceIcons(uint8_t portIndex, std::set<CONTROLLERBUTTONS_T> bitmasks);
void DrawAnalogStickDeviceIcons(uint8_t portIndex, Ship::Stick stick);
void DrawRumbleDeviceIcons(uint8_t portIndex);
void DrawGyroDeviceIcons(uint8_t portIndex);
void DrawLEDDeviceIcons(uint8_t portIndex);
bool mInputEditorPopupOpen;
void DrawSetDefaultsButton(uint8_t portIndex);
void DrawClearAllButton(uint8_t portIndex);
std::map<Ship::ShipDeviceIndex, bool> mDeviceIndexVisiblity;
void DrawDeviceVisibilityButtons();
};
+262 -28
View File
@@ -8,12 +8,13 @@
#include <unordered_map> #include <unordered_map>
#include <string> #include <string>
#include "2s2h/Enhancements/Enhancements.h" #include "2s2h/Enhancements/Enhancements.h"
#include "2s2h/Enhancements/Graphics/MotionBlur.h" #include "2s2h/Enhancements/GfxPatcher/AuthenticGfxPatches.h"
#include "2s2h/Enhancements/Graphics/PlayAsKafei.h"
#include "2s2h/DeveloperTools/DeveloperTools.h" #include "2s2h/DeveloperTools/DeveloperTools.h"
#include "2s2h/DeveloperTools/WarpPoint.h"
#include "HudEditor.h" #include "HudEditor.h"
#include "2s2h/Enhancements/Trackers/ItemTracker.h"
#include "2s2h/Enhancements/Trackers/ItemTrackerSettings.h"
extern "C" { extern "C" {
#include "z64.h" #include "z64.h"
#include "functions.h" #include "functions.h"
@@ -38,14 +39,14 @@ static const std::unordered_map<Ship::AudioBackend, const char*> audioBackendsMa
}; };
static std::unordered_map<Ship::WindowBackend, const char*> windowBackendsMap = { static std::unordered_map<Ship::WindowBackend, const char*> windowBackendsMap = {
{ Ship::WindowBackend::DX11, "DirectX" }, { Ship::WindowBackend::FAST3D_DXGI_DX11, "DirectX" },
{ Ship::WindowBackend::SDL_OPENGL, "OpenGL" }, { Ship::WindowBackend::FAST3D_SDL_OPENGL, "OpenGL" },
{ Ship::WindowBackend::SDL_METAL, "Metal" }, { Ship::WindowBackend::FAST3D_SDL_METAL, "Metal" },
{ Ship::WindowBackend::GX2, "GX2" }
}; };
static const std::unordered_map<int32_t, const char*> clockTypeOptions = { static const std::unordered_map<int32_t, const char*> clockTypeOptions = {
{ CLOCK_TYPE_ORIGINAL, "Original" }, { CLOCK_TYPE_ORIGINAL, "Original" },
{ CLOCK_TYPE_3DS, "MM3D style" },
{ CLOCK_TYPE_TEXT_BASED, "Text only" }, { CLOCK_TYPE_TEXT_BASED, "Text only" },
}; };
@@ -55,6 +56,18 @@ static const std::unordered_map<int32_t, const char*> alwaysWinDoggyraceOptions
{ ALWAYS_WIN_DOGGY_RACE_ALWAYS, "Always" }, { ALWAYS_WIN_DOGGY_RACE_ALWAYS, "Always" },
}; };
static const std::unordered_map<int32_t, const char*> cremiaRewardOptions = {
{ CREMIA_REWARD_RANDOM, "Vanilla" },
{ CREMIA_REWARD_ALWAYS_HUG, "Hug" },
{ CREMIA_REWARD_ALWAYS_RUPEE, "Rupee" },
};
static const std::unordered_map<int32_t, const char*> timeStopOptions = {
{ TIME_STOP_OFF, "Off" },
{ TIME_STOP_TEMPLES, "Temples" },
{ TIME_STOP_TEMPLES_DUNGEONS, "Temples + Mini Dungeons" },
};
namespace BenGui { namespace BenGui {
std::shared_ptr<std::vector<Ship::WindowBackend>> availableWindowBackends; std::shared_ptr<std::vector<Ship::WindowBackend>> availableWindowBackends;
std::unordered_map<Ship::WindowBackend, const char*> availableWindowBackendsMap; std::unordered_map<Ship::WindowBackend, const char*> availableWindowBackendsMap;
@@ -63,7 +76,7 @@ Ship::WindowBackend configWindowBackend;
void UpdateWindowBackendObjects() { void UpdateWindowBackendObjects() {
Ship::WindowBackend runningWindowBackend = Ship::Context::GetInstance()->GetWindow()->GetWindowBackend(); Ship::WindowBackend runningWindowBackend = Ship::Context::GetInstance()->GetWindow()->GetWindowBackend();
int32_t configWindowBackendId = Ship::Context::GetInstance()->GetConfig()->GetInt("Window.Backend.Id", -1); int32_t configWindowBackendId = Ship::Context::GetInstance()->GetConfig()->GetInt("Window.Backend.Id", -1);
if (configWindowBackendId != -1 && configWindowBackendId < static_cast<int>(Ship::WindowBackend::BACKEND_COUNT)) { if (Ship::Context::GetInstance()->GetWindow()->IsAvailableWindowBackend(configWindowBackendId)) {
configWindowBackend = static_cast<Ship::WindowBackend>(configWindowBackendId); configWindowBackend = static_cast<Ship::WindowBackend>(configWindowBackendId);
} else { } else {
configWindowBackend = runningWindowBackend; configWindowBackend = runningWindowBackend;
@@ -147,7 +160,7 @@ void DrawBenMenu() {
} }
} }
extern std::shared_ptr<Ship::GuiWindow> mInputEditorWindow; extern std::shared_ptr<BenInputEditorWindow> mBenInputEditorWindow;
void DrawSettingsMenu() { void DrawSettingsMenu() {
if (UIWidgets::BeginMenu("Settings")) { if (UIWidgets::BeginMenu("Settings")) {
@@ -214,19 +227,21 @@ void DrawSettingsMenu() {
{ // FPS Slider { // FPS Slider
constexpr unsigned int minFps = 20; constexpr unsigned int minFps = 20;
static unsigned int maxFps; static unsigned int maxFps;
if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::DX11) { if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() ==
Ship::WindowBackend::FAST3D_DXGI_DX11) {
maxFps = 360; maxFps = 360;
} else { } else {
maxFps = Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); maxFps = Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate();
} }
unsigned int currentFps = unsigned int currentFps =
std::max(std::min(OTRGlobals::Instance->GetInterpolationFPS(), maxFps), minFps); std::max(std::min(OTRGlobals::Instance->GetInterpolationFPS(), maxFps), minFps);
bool matchingRefreshRate = bool matchingRefreshRate = CVarGetInteger("gMatchRefreshRate", 0) &&
CVarGetInteger("gMatchRefreshRate", 0) && Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() !=
Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() != Ship::WindowBackend::DX11; Ship::WindowBackend::FAST3D_DXGI_DX11;
UIWidgets::CVarSliderInt((currentFps == 20) ? "FPS: Original (20)" : "FPS: %d", "gInterpolationFPS", UIWidgets::CVarSliderInt((currentFps == 20) ? "FPS: Original (20)" : "FPS: %d", "gInterpolationFPS",
minFps, maxFps, 20, { .disabled = matchingRefreshRate }); minFps, maxFps, 20, { .disabled = matchingRefreshRate });
if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::DX11) { if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() ==
Ship::WindowBackend::FAST3D_DXGI_DX11) {
UIWidgets::Tooltip( UIWidgets::Tooltip(
"Uses Matrix Interpolation to create extra frames, resulting in smoother graphics. This is " "Uses Matrix Interpolation to create extra frames, resulting in smoother graphics. This is "
"purely visual and does not impact game logic, execution of glitches etc.\n\n A higher target " "purely visual and does not impact game logic, execution of glitches etc.\n\n A higher target "
@@ -238,7 +253,8 @@ void DrawSettingsMenu() {
} }
} // END FPS Slider } // END FPS Slider
if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::DX11) { if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() ==
Ship::WindowBackend::FAST3D_DXGI_DX11) {
// UIWidgets::Spacer(0); // UIWidgets::Spacer(0);
if (ImGui::Button("Match Refresh Rate")) { if (ImGui::Button("Match Refresh Rate")) {
int hz = Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate(); int hz = Ship::Context::GetInstance()->GetWindow()->GetCurrentRefreshRate();
@@ -252,7 +268,8 @@ void DrawSettingsMenu() {
} }
UIWidgets::Tooltip("Matches interpolation value to the current game's window refresh rate"); UIWidgets::Tooltip("Matches interpolation value to the current game's window refresh rate");
if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() == Ship::WindowBackend::DX11) { if (Ship::Context::GetInstance()->GetWindow()->GetWindowBackend() ==
Ship::WindowBackend::FAST3D_DXGI_DX11) {
UIWidgets::CVarSliderInt(CVarGetInteger("gExtraLatencyThreshold", 80) == 0 ? "Jitter fix: Off" UIWidgets::CVarSliderInt(CVarGetInteger("gExtraLatencyThreshold", 80) == 0 ? "Jitter fix: Off"
: "Jitter fix: >= %d FPS", : "Jitter fix: >= %d FPS",
"gExtraLatencyThreshold", 0, 360, 80); "gExtraLatencyThreshold", 0, 360, 80);
@@ -302,8 +319,8 @@ void DrawSettingsMenu() {
// #region 2S2H [Todo] None of this works yet // #region 2S2H [Todo] None of this works yet
/* /*
if (UIWidgets::BeginMenu("Controller")) { */ if (UIWidgets::BeginMenu("Controller")) { */
if (mInputEditorWindow) { if (mBenInputEditorWindow) {
UIWidgets::WindowButton("Controller Mapping", "gWindows.InputEditor", mInputEditorWindow); UIWidgets::WindowButton("Controller Mapping", "gWindows.InputEditor", mBenInputEditorWindow);
} }
/* /*
#ifndef __SWITCH__ #ifndef __SWITCH__
@@ -334,16 +351,60 @@ void DrawSettingsMenu() {
} }
extern std::shared_ptr<HudEditorWindow> mHudEditorWindow; extern std::shared_ptr<HudEditorWindow> mHudEditorWindow;
extern std::shared_ptr<ItemTrackerWindow> mItemTrackerWindow;
extern std::shared_ptr<ItemTrackerSettingsWindow> mItemTrackerSettingsWindow;
void DrawEnhancementsMenu() { void DrawEnhancementsMenu() {
if (UIWidgets::BeginMenu("Enhancements")) { if (UIWidgets::BeginMenu("Enhancements")) {
if (UIWidgets::BeginMenu("Camera")) { if (UIWidgets::BeginMenu("Camera")) {
ImGui::SeparatorText("Fixes"); ImGui::SeparatorText("Fixes");
UIWidgets::CVarCheckbox( UIWidgets::CVarCheckbox(
"Fix Targetting Camera Snap", "gEnhancements.Camera.FixTargettingCameraSnap", "Fix Targeting Camera Snap", "gEnhancements.Camera.FixTargettingCameraSnap",
{ .tooltip = { .tooltip = "Fixes the camera snap that occurs when you are moving and press the targeting button." });
"Fixes the camera snap that occurs when you are moving and press the targetting button." });
ImGui::SeparatorText("First Person");
UIWidgets::CVarCheckbox("Disable Auto-Centering",
"gEnhancements.Camera.FirstPerson.DisableFirstPersonAutoCenterView");
UIWidgets::CVarCheckbox("Invert X Axis", "gEnhancements.Camera.FirstPerson.InvertX");
UIWidgets::CVarCheckbox("Invert Y Axis", "gEnhancements.Camera.FirstPerson.InvertY",
{ .defaultValue = true });
UIWidgets::CVarSliderFloat("X Axis Sensitivity: %.0f%%", "gEnhancements.Camera.FirstPerson.SensitivityX",
0.1f, 2.0f, 1.0f, { .isPercentage = true });
UIWidgets::CVarSliderFloat("Y Axis Sensitivity: %.0f%%", "gEnhancements.Camera.FirstPerson.SensitivityY",
0.1f, 2.0f, 1.0f, { .isPercentage = true });
UIWidgets::CVarCheckbox(
"Gyro Aiming", "gEnhancements.Camera.FirstPerson.GyroEnabled",
{ .tooltip = "Enables gyro aiming in first person mode. Requires a controller with gyro support, and "
"for it to be mapped in the Controller Mapping menu" });
if (CVarGetInteger("gEnhancements.Camera.FirstPerson.GyroEnabled", 0)) {
UIWidgets::CVarCheckbox("Invert Gyro X Axis", "gEnhancements.Camera.FirstPerson.GyroInvertX");
UIWidgets::CVarCheckbox("Invert Gyro Y Axis", "gEnhancements.Camera.FirstPerson.GyroInvertY");
UIWidgets::CVarSliderFloat("Gyro X Axis Sensitivity: %.0f%%",
"gEnhancements.Camera.FirstPerson.GyroSensitivityX", 0.1f, 2.0f, 1.0f,
{ .isPercentage = true });
UIWidgets::CVarSliderFloat("Gyro Y Axis Sensitivity: %.0f%%",
"gEnhancements.Camera.FirstPerson.GyroSensitivityY", 0.1f, 2.0f, 1.0f,
{ .isPercentage = true });
}
UIWidgets::CVarCheckbox(
"Right Stick Aiming", "gEnhancements.Camera.FirstPerson.RightStickEnabled",
{ .tooltip = "Enables right stick aiming in first person mode. Requires the controller right stick to "
"be mapped in the Controller Mapping menu" });
if (CVarGetInteger("gEnhancements.Camera.FirstPerson.RightStickEnabled", 0)) {
UIWidgets::CVarCheckbox("Move with left stick while in first person",
"gEnhancements.Camera.FirstPerson.MoveInFirstPerson");
UIWidgets::CVarCheckbox("Invert Right Stick X Axis",
"gEnhancements.Camera.FirstPerson.RightStickInvertX");
UIWidgets::CVarCheckbox("Invert Right Stick Y Axis",
"gEnhancements.Camera.FirstPerson.RightStickInvertY", { .defaultValue = true });
UIWidgets::CVarSliderFloat("Right Stick X Axis Sensitivity: %.0f%%",
"gEnhancements.Camera.FirstPerson.RightStickSensitivityX", 0.1f, 2.0f, 1.0f,
{ .isPercentage = true });
UIWidgets::CVarSliderFloat("Right Stick Y Axis Sensitivity: %.0f%%",
"gEnhancements.Camera.FirstPerson.RightStickSensitivityY", 0.1f, 2.0f, 1.0f,
{ .isPercentage = true });
}
ImGui::SeparatorText("Free Look"); ImGui::SeparatorText("Free Look");
if (UIWidgets::CVarCheckbox( if (UIWidgets::CVarCheckbox(
@@ -419,6 +480,12 @@ void DrawEnhancementsMenu() {
{ {
.tooltip = "When starting a game you will be taken straight to South Clock Town as Deku Link.", .tooltip = "When starting a game you will be taken straight to South Clock Town as Deku Link.",
}); });
if (CVarGetInteger("gEnhancements.Cutscenes.SkipIntroSequence", 0)) {
UIWidgets::CVarCheckbox(
"Skip First Cycle", "gEnhancements.Cutscenes.SkipFirstCycle",
{ .tooltip = "When starting a game you will be taken straight to South Clock Town as Human Link "
"with Deku Mask, Ocarina, Song of Time, and Song of Healing." });
}
UIWidgets::CVarCheckbox( UIWidgets::CVarCheckbox(
"Skip Story Cutscenes", "gEnhancements.Cutscenes.SkipStoryCutscenes", "Skip Story Cutscenes", "gEnhancements.Cutscenes.SkipStoryCutscenes",
{ {
@@ -468,6 +535,17 @@ void DrawEnhancementsMenu() {
{ .tooltip = "Playing the Song Of Time will not reset the Sword back to Kokiri Sword." }); { .tooltip = "Playing the Song Of Time will not reset the Sword back to Kokiri Sword." });
UIWidgets::CVarCheckbox("Do not reset Rupees", "gEnhancements.Cycle.DoNotResetRupees", UIWidgets::CVarCheckbox("Do not reset Rupees", "gEnhancements.Cycle.DoNotResetRupees",
{ .tooltip = "Playing the Song Of Time will not reset the your rupees." }); { .tooltip = "Playing the Song Of Time will not reset the your rupees." });
UIWidgets::CVarCheckbox(
"Do not reset Time Speed", "gEnhancements.Cycle.DoNotResetTimeSpeed",
{ .tooltip =
"Playing the Song Of Time will not reset the current time speed set by Inverted Song of Time." });
if (UIWidgets::CVarCheckbox(
"Keep Express Mail", "gEnhancements.Cycle.KeepExpressMail",
{ .tooltip = "Allows the player to keep the Express Mail in their inventory after delivering it "
"the first time, so that both deliveries can be done within one cycle" })) {
RegisterKeepExpressMail();
}
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(255, 255, 0, 255)); ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(255, 255, 0, 255));
ImGui::SeparatorText("Unstable"); ImGui::SeparatorText("Unstable");
@@ -480,7 +558,12 @@ void DrawEnhancementsMenu() {
ImGui::EndMenu(); ImGui::EndMenu();
} }
if (UIWidgets::BeginMenu("Dialogues")) { if (UIWidgets::BeginMenu("Dialogue")) {
UIWidgets::CVarCheckbox(
"Fast Bank Selection", "gEnhancements.Dialogue.FastBankSelection",
{ .tooltip =
"Pressing the Z or R buttons while the Deposit/Withdrawal Rupees dialogue is open will set "
"the Rupees to Links current Rupees or 0 respectively." });
UIWidgets::CVarCheckbox( UIWidgets::CVarCheckbox(
"Fast Text", "gEnhancements.Dialogue.FastText", "Fast Text", "gEnhancements.Dialogue.FastText",
{ .tooltip = "Speeds up text rendering, and enables holding of B progress to next message" }); { .tooltip = "Speeds up text rendering, and enables holding of B progress to next message" });
@@ -495,15 +578,49 @@ void DrawEnhancementsMenu() {
ImGui::EndMenu(); ImGui::EndMenu();
} }
if (UIWidgets::BeginMenu("Equipment")) {
UIWidgets::CVarCheckbox("Fast Magic Arrow Equip Animation", "gEnhancements.Equipment.MagicArrowEquipSpeed",
{ .tooltip = "Removes the animation for equipping Magic Arrows." });
UIWidgets::CVarCheckbox(
"Instant Fin Boomerangs Recall", "gEnhancements.PlayerActions.InstantRecall",
{ .tooltip =
"Pressing B will instantly recall the fin boomerang back to Zora Link after they are thrown." });
UIWidgets::CVarCheckbox(
"Two-Handed Sword Spin Attack", "gEnhancements.Equipment.TwoHandedSwordSpinAttack",
{ .tooltip = "Enables magic spin attacks for the Fierce Deity Sword and Great Fairy's Sword." });
ImGui::EndMenu();
}
if (UIWidgets::BeginMenu("Fixes")) { if (UIWidgets::BeginMenu("Fixes")) {
UIWidgets::CVarCheckbox("Fix Ammo Count Color", "gFixes.FixAmmoCountEnvColor", UIWidgets::CVarCheckbox("Fix Ammo Count Color", "gFixes.FixAmmoCountEnvColor",
{ .tooltip = "Fixes a missing gDPSetEnvColor, which causes the ammo count to be " { .tooltip = "Fixes a missing gDPSetEnvColor, which causes the ammo count to be "
"the wrong color prior to obtaining magic or other conditions." }); "the wrong color prior to obtaining magic or other conditions." });
UIWidgets::CVarCheckbox("Fix Fierce Deity Z-Target movement",
"gEnhancements.Fixes.FierceDeityZTargetMovement",
{ .tooltip = "Fixes Fierce Deity movement being choppy when Z-targeting" });
UIWidgets::CVarCheckbox("Fix Hess and Weirdshot Crash", "gEnhancements.Fixes.HessCrash", UIWidgets::CVarCheckbox("Fix Hess and Weirdshot Crash", "gEnhancements.Fixes.HessCrash",
{ .tooltip = "Fixes a crash that can occur when performing a HESS or Weirdshot.", { .tooltip = "Fixes a crash that can occur when performing a HESS or Weirdshot.",
.defaultValue = true }); .defaultValue = true });
UIWidgets::CVarCheckbox("Fix Text Control Characters", "gEnhancements.Fixes.ControlCharacters",
{ .tooltip = "Fixes certain control characters not functioning properly "
"depending on their position within the text." });
UIWidgets::CVarCheckbox("Fix Ikana Great Fairy Fountain Color", "gFixes.FixIkanaGreatFairyFountainColor",
{ .tooltip = "Fixes a bug that results in the Ikana Great Fairy fountain looking "
"green instead of yellow, this was fixed in the EU version" });
if (UIWidgets::CVarCheckbox(
"Fix Texture overflow OOB", "gEnhancements.Fixes.FixTexturesOOB",
{ .tooltip = "Fixes textures that normally overflow to be patched with the correct size or format",
.defaultValue = true })) {
GfxPatcher_ApplyOverflowTexturePatches();
}
ImGui::EndMenu(); ImGui::EndMenu();
} }
@@ -511,6 +628,12 @@ void DrawEnhancementsMenu() {
ImGui::SeparatorText("Clock"); ImGui::SeparatorText("Clock");
UIWidgets::CVarCombobox("Clock Type", "gEnhancements.Graphics.ClockType", clockTypeOptions); UIWidgets::CVarCombobox("Clock Type", "gEnhancements.Graphics.ClockType", clockTypeOptions);
UIWidgets::CVarCheckbox("24 Hours Clock", "gEnhancements.Graphics.24HoursClock"); UIWidgets::CVarCheckbox("24 Hours Clock", "gEnhancements.Graphics.24HoursClock");
ImGui::SeparatorText("Mods");
UIWidgets::CVarCheckbox("Use Alternate Assets", "gEnhancements.Mods.AlternateAssets",
{ .tooltip = "Toggle between standard assets and alternate assets. Usually mods "
"will indicate if this setting has to be used or not." });
MotionBlur_RenderMenuOptions(); MotionBlur_RenderMenuOptions();
ImGui::SeparatorText("Other"); ImGui::SeparatorText("Other");
UIWidgets::CVarCheckbox("Authentic logo", "gEnhancements.Graphics.AuthenticLogo", UIWidgets::CVarCheckbox("Authentic logo", "gEnhancements.Graphics.AuthenticLogo",
@@ -518,15 +641,48 @@ void DrawEnhancementsMenu() {
"model and texture on the boot logo start screen" }); "model and texture on the boot logo start screen" });
UIWidgets::CVarCheckbox("Bow Reticle", "gEnhancements.Graphics.BowReticle", UIWidgets::CVarCheckbox("Bow Reticle", "gEnhancements.Graphics.BowReticle",
{ .tooltip = "Gives the bow a reticle when you draw an arrow" }); { .tooltip = "Gives the bow a reticle when you draw an arrow" });
if (UIWidgets::CVarCheckbox("3D Item Drops", "gEnhancements.Graphics.3DItemDrops",
{ .tooltip = "Makes item drops 3D" })) {
Register3DItemDrops();
}
UIWidgets::CVarCheckbox(
"Disable Black Bar Letterboxes", "gEnhancements.Graphics.DisableBlackBars",
{ .tooltip = "Disables Black Bar Letterboxes during cutscenes and Z-targeting\nNote: there may be "
"minor visual glitches that were covered up by the black bars\nPlease disable this "
"setting before reporting a bug" });
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(255, 255, 0, 255));
ImGui::SeparatorText("Unstable");
ImGui::PopStyleColor();
if (UIWidgets::CVarCheckbox(
"Disable Scene Geometry Distance Check", "gEnhancements.Graphics.DisableSceneGeometryDistanceCheck",
{ .tooltip =
"Disables the distance check for scene geometry, allowing it to be drawn no matter how far "
"away it is from the player. This may have unintended side effects." })) {
GfxPatcher_ApplyGeometryIssuePatches();
}
UIWidgets::CVarCheckbox("Widescreen Actor Culling",
"gEnhancements.Graphics.ActorCullingAccountsForWidescreen",
{ .tooltip = "Adjusts the culling planes to account for widescreen resolutions. "
"This may have unintended side effects." });
UIWidgets::CVarSliderInt(
"Increase Actor Draw Distance: %dx", "gEnhancements.Graphics.IncreaseActorDrawDistance", 1, 5, 1,
{ .tooltip = "Increase the range in which Actors are drawn. This may have unintended side effects." });
ImGui::EndMenu(); ImGui::EndMenu();
} }
if (UIWidgets::BeginMenu("Masks")) { if (UIWidgets::BeginMenu("Masks")) {
UIWidgets::CVarCheckbox("Blast Mask has Powder Keg Force", "gEnhancements.Masks.BlastMaskKeg");
UIWidgets::CVarCheckbox("Fast Transformation", "gEnhancements.Masks.FastTransformation"); UIWidgets::CVarCheckbox("Fast Transformation", "gEnhancements.Masks.FastTransformation");
UIWidgets::CVarCheckbox("Fierce Deity's Mask Anywhere", "gEnhancements.Masks.FierceDeitysAnywhere", UIWidgets::CVarCheckbox("Fierce Deity's Mask Anywhere", "gEnhancements.Masks.FierceDeitysAnywhere",
{ .tooltip = "Allow using Fierce Deity's mask outside of boss rooms." }); { .tooltip = "Allow using Fierce Deity's mask outside of boss rooms." });
UIWidgets::CVarCheckbox("No Blast Mask Cooldown", "gEnhancements.Masks.NoBlastMaskCooldown", {}); UIWidgets::CVarCheckbox("No Blast Mask Cooldown", "gEnhancements.Masks.NoBlastMaskCooldown", {});
if (UIWidgets::CVarCheckbox("Persistent Bunny Hood", "gEnhancements.Masks.PersistentBunnyHood.Enabled",
{ .tooltip = "Permanently toggle a speed boost from the bunny hood by pressing "
"'A' on it in the mask menu." })) {
UpdatePersistentMasksState();
}
ImGui::EndMenu(); ImGui::EndMenu();
} }
@@ -534,6 +690,15 @@ void DrawEnhancementsMenu() {
if (UIWidgets::BeginMenu("Minigames")) { if (UIWidgets::BeginMenu("Minigames")) {
UIWidgets::CVarCombobox("Always Win Doggy Race", "gEnhancements.Minigames.AlwaysWinDoggyRace", UIWidgets::CVarCombobox("Always Win Doggy Race", "gEnhancements.Minigames.AlwaysWinDoggyRace",
alwaysWinDoggyraceOptions); alwaysWinDoggyraceOptions);
UIWidgets::CVarCombobox(
"Milk Run Reward Options", "gEnhancements.Minigames.CremiaHugs", cremiaRewardOptions,
{ .tooltip = "Choose what reward you get for winning the Milk Run minigame after the first time. \n"
"-Vanilla: Reward is Random\n"
"-Hug: Get the hugging cutscene\n"
"-Rupee: Get the rupee reward",
.defaultIndex = CREMIA_REWARD_RANDOM });
UIWidgets::CVarSliderInt("Swordsman School Winning Score: %d",
"gEnhancements.Minigames.SwordsmanSchoolScore", 1, 30, 30);
ImGui::EndMenu(); ImGui::EndMenu();
} }
@@ -541,12 +706,33 @@ void DrawEnhancementsMenu() {
if (UIWidgets::BeginMenu("Modes")) { if (UIWidgets::BeginMenu("Modes")) {
UIWidgets::CVarCheckbox("Play As Kafei", "gModes.PlayAsKafei", UIWidgets::CVarCheckbox("Play As Kafei", "gModes.PlayAsKafei",
{ .tooltip = "Requires scene reload to take effect." }); { .tooltip = "Requires scene reload to take effect." });
if (UIWidgets::CVarCheckbox("Time Moves When You Move", "gModes.TimeMovesWhenYouMove")) {
RegisterTimeMovesWhenYouMove();
}
if (UIWidgets::CVarCheckbox("Mirrored World", "gModes.MirroredWorld.Mode")) {
if (CVarGetInteger("gModes.MirroredWorld.Mode", 0)) {
CVarSetInteger("gModes.MirroredWorld.State", 1);
} else {
CVarClear("gModes.MirroredWorld.State");
}
}
ImGui::EndMenu(); ImGui::EndMenu();
} }
if (UIWidgets::BeginMenu("Player Movement")) {
UIWidgets::CVarSliderInt("Climb speed", "gEnhancements.PlayerMovement.ClimbSpeed", 1, 5, 1,
{ .tooltip = "Increases the speed at which Link climbs vines and ladders." });
if (UIWidgets::BeginMenu("Player")) {
UIWidgets::CVarSliderInt("Climb speed", "gEnhancements.Player.ClimbSpeed", 1, 5, 1,
{ .tooltip = "Increases the speed at which Link climbs vines and ladders." });
if (UIWidgets::CVarCheckbox("Fast Deku Flower Launch", "gEnhancements.Player.FastFlowerLaunch",
{ .tooltip =
"Speeds up the time it takes to be able to get maximum height from "
"launching out of a deku flower" })) {
RegisterFastFlowerLaunch();
}
UIWidgets::CVarCheckbox("Instant Putaway", "gEnhancements.Player.InstantPutaway",
{ .tooltip = "Allows Link to instantly puts away held item without waiting." });
UIWidgets::CVarCheckbox("Fierce Deity Putaway", "gEnhancements.Player.FierceDeityPutaway",
{ .tooltip = "Allows Fierce Deity Link to put away his sword." });
ImGui::EndMenu(); ImGui::EndMenu();
} }
@@ -563,6 +749,14 @@ void DrawEnhancementsMenu() {
UIWidgets::CVarCheckbox("Tatl ISG", "gEnhancements.Restorations.TatlISG", UIWidgets::CVarCheckbox("Tatl ISG", "gEnhancements.Restorations.TatlISG",
{ .tooltip = "Restores Navi ISG from OOT, but now with Tatl." }); { .tooltip = "Restores Navi ISG from OOT, but now with Tatl." });
if (UIWidgets::CVarCheckbox(
"Woodfall Mountain Appearance", "gEnhancements.Restorations.WoodfallMountainAppearance",
{ .tooltip = "Restores the appearance of Woodfall mountain to not look poisoned "
"when viewed from Termina Field after clearing Woodfall Temple\n\n"
"Requires a scene reload to take effect" })) {
RegisterWoodfallMountainAppearance();
}
ImGui::EndMenu(); ImGui::EndMenu();
} }
@@ -576,15 +770,40 @@ void DrawEnhancementsMenu() {
{ .tooltip = "Enables using the Dpad for Ocarina playback." }); { .tooltip = "Enables using the Dpad for Ocarina playback." });
UIWidgets::CVarCheckbox("Prevent Dropped Ocarina Inputs", "gEnhancements.Playback.NoDropOcarinaInput", UIWidgets::CVarCheckbox("Prevent Dropped Ocarina Inputs", "gEnhancements.Playback.NoDropOcarinaInput",
{ .tooltip = "Prevent dropping inputs when playing the ocarina quickly" }); { .tooltip = "Prevent dropping inputs when playing the ocarina quickly" });
UIWidgets::CVarCheckbox("Skip Scarecrow Song", "gEnhancements.Playback.SkipScarecrowSong",
{ .tooltip = "Pierre appears when the Ocarina is pulled out." });
UIWidgets::CVarCheckbox("Pause Owl Warp", "gEnhancements.Songs.PauseOwlWarp",
{ .tooltip = "Allows the player to use the pause menu map to owl warp instead of "
"having to play the Song of Soaring." });
UIWidgets::CVarSliderInt("Zora Eggs For Bossa Nova", "gEnhancements.Songs.ZoraEggCount", 1, 7, 7,
{ .tooltip = "The number of eggs required to unlock new wave bossa nova." });
ImGui::EndMenu(); ImGui::EndMenu();
} }
if (UIWidgets::BeginMenu("Difficulty Options")) {
if (UIWidgets::CVarCheckbox("Disable Takkuri Steal", "gEnhancements.Cheats.DisableTakkuriSteal",
{ .tooltip = "Prevents the Takkuri from stealing key items like bottles and "
"swords. It may still steal other items." })) {
RegisterDisableTakkuriSteal();
}
ImGui::EndMenu();
}
if (mHudEditorWindow) { if (mHudEditorWindow) {
UIWidgets::WindowButton("Hud Editor", "gWindows.HudEditor", mHudEditorWindow, UIWidgets::WindowButton("Hud Editor", "gWindows.HudEditor", mHudEditorWindow,
{ .tooltip = "Enables the Hud Editor window, allowing you to edit your hud" }); { .tooltip = "Enables the Hud Editor window, allowing you to edit your hud" });
} }
if (mItemTrackerWindow) {
UIWidgets::WindowButton("Item Tracker", "gWindows.ItemTracker", mItemTrackerWindow);
}
if (mItemTrackerSettingsWindow) {
UIWidgets::WindowButton("Item Tracker Settings", "gWindows.ItemTrackerSettings",
mItemTrackerSettingsWindow);
}
ImGui::EndMenu(); ImGui::EndMenu();
} }
} }
@@ -595,13 +814,28 @@ void DrawCheatsMenu() {
UIWidgets::CVarCheckbox("Infinite Magic", "gCheats.InfiniteMagic"); UIWidgets::CVarCheckbox("Infinite Magic", "gCheats.InfiniteMagic");
UIWidgets::CVarCheckbox("Infinite Rupees", "gCheats.InfiniteRupees"); UIWidgets::CVarCheckbox("Infinite Rupees", "gCheats.InfiniteRupees");
UIWidgets::CVarCheckbox("Infinite Consumables", "gCheats.InfiniteConsumables"); UIWidgets::CVarCheckbox("Infinite Consumables", "gCheats.InfiniteConsumables");
if (UIWidgets::CVarCheckbox(
"Longer Deku Flower Glide", "gCheats.LongerFlowerGlide",
{ .tooltip = "Allows Deku Link to glide longer, no longer dropping after a certain distance" })) {
RegisterLongerFlowerGlide();
}
UIWidgets::CVarCheckbox("No Clip", "gCheats.NoClip");
UIWidgets::CVarCheckbox("Unbreakable Razor Sword", "gCheats.UnbreakableRazorSword"); UIWidgets::CVarCheckbox("Unbreakable Razor Sword", "gCheats.UnbreakableRazorSword");
UIWidgets::CVarCheckbox("Unrestricted Items", "gCheats.UnrestrictedItems"); UIWidgets::CVarCheckbox("Unrestricted Items", "gCheats.UnrestrictedItems");
if (UIWidgets::CVarCheckbox("Moon Jump on L", "gCheats.MoonJumpOnL", if (UIWidgets::CVarCheckbox("Moon Jump on L", "gCheats.MoonJumpOnL",
{ .tooltip = "Holding L makes you float into the air" })) { { .tooltip = "Holding L makes you float into the air" })) {
RegisterMoonJumpOnL(); RegisterMoonJumpOnL();
} }
UIWidgets::CVarCheckbox("No Clip", "gCheats.NoClip"); UIWidgets::CVarCheckbox("Elegy of Emptiness Anywhere", "gCheats.ElegyAnywhere",
{ .tooltip = "Allows Elegy of Emptiness outside of Ikana" });
UIWidgets::CVarCombobox(
"Stop Time in Dungeons", "gCheats.TempleTimeStop", timeStopOptions,
{ .tooltip = "Stops time from advancing in selected areas. Requires a room change to update.\n\n"
"- Off: Vanilla behaviour.\n"
"- Temples: Stops time in Woodfall, Snowhead, Great Bay, and Stone Tower Temples.\n"
"- Temples + Mini Dungeons: In addition to the above temples, stops time in both Spider "
"Houses, Pirate's Fortress, Beneath the Well, Ancient Castle of Ikana, and Secret Shrine.",
.defaultIndex = TIME_STOP_OFF });
ImGui::EndMenu(); ImGui::EndMenu();
} }
@@ -659,7 +893,7 @@ void DrawDeveloperToolsMenu() {
"Change the behavior of creating saves while debug mode is enabled:\n\n" "Change the behavior of creating saves while debug mode is enabled:\n\n"
"- Empty Save: The default 3 heart save file in first cycle\n" "- Empty Save: The default 3 heart save file in first cycle\n"
"- Vanilla Debug Save: Uses the title screen save info (8 hearts, all items and masks)\n" "- Vanilla Debug Save: Uses the title screen save info (8 hearts, all items and masks)\n"
"- 100\% Save: All items, equipment, mask, quast status and bombers notebook complete", "- 100\% Save: All items, equipment, mask, quest status and bombers notebook complete",
.defaultIndex = DEBUG_SAVE_INFO_NONE })) { .defaultIndex = DEBUG_SAVE_INFO_NONE })) {
RegisterDebugSaveCreate(); RegisterDebugSaveCreate();
} }
+1
View File
@@ -7,6 +7,7 @@
#include "DeveloperTools/ActorViewer.h" #include "DeveloperTools/ActorViewer.h"
#include "DeveloperTools/CollisionViewer.h" #include "DeveloperTools/CollisionViewer.h"
#include "DeveloperTools/EventLog.h" #include "DeveloperTools/EventLog.h"
#include "BenInputEditorWindow.h"
namespace BenGui { namespace BenGui {
class BenMenuBar : public Ship::GuiMenuBar { class BenMenuBar : public Ship::GuiMenuBar {
+6 -9
View File
@@ -17,6 +17,7 @@ HudEditorElement hudEditorElements[HUD_EDITOR_ELEMENT_MAX] = {
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_D_PAD, "D-Pad", "DPad", 271, 55, 255, 255, 255, 255), HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_D_PAD, "D-Pad", "DPad", 271, 55, 255, 255, 255, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_MINIMAP, "Minimap", "Minimap", 295, 220, 0, 255, 255, 160), HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_MINIMAP, "Minimap", "Minimap", 295, 220, 0, 255, 255, 160),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_START, "Start Button", "Start", 136, 17, 255, 130, 60, 255), HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_START, "Start Button", "Start", 136, 17, 255, 130, 60, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_CARROT, "Horse Carrots", "Carrots", 160, 64, 236, 92, 41, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_CLOCK, "Three Day Clock", "Clock", 160, 206, 255, 255, 255, 255), HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_CLOCK, "Three Day Clock", "Clock", 160, 206, 255, 255, 255, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_HEARTS, "Hearts", "Hearts", 30, 26, 255, 70, 50, 255), HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_HEARTS, "Hearts", "Hearts", 30, 26, 255, 70, 50, 255),
HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_MAGIC_METER, "Magic", "Magic", 18, 34, 0, 200, 0, 255), HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_MAGIC_METER, "Magic", "Magic", 18, 34, 0, 200, 0, 255),
@@ -166,12 +167,6 @@ enum Presets {
}; };
void HudEditorWindow::DrawElement() { void HudEditorWindow::DrawElement() {
ImGui::SetNextWindowSize(ImVec2(480, 600), ImGuiCond_FirstUseEver);
if (!ImGui::Begin("Hud Editor", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) {
ImGui::End();
return;
}
static HudEditor::Presets preset = HudEditor::Presets::VANILLA; static HudEditor::Presets preset = HudEditor::Presets::VANILLA;
if (UIWidgets::Combobox("Preset", &preset, presetNames)) { if (UIWidgets::Combobox("Preset", &preset, presetNames)) {
for (int i = HUD_EDITOR_ELEMENT_B; i < HUD_EDITOR_ELEMENT_MAX; i++) { for (int i = HUD_EDITOR_ELEMENT_B; i < HUD_EDITOR_ELEMENT_MAX; i++) {
@@ -206,6 +201,8 @@ void HudEditorWindow::DrawElement() {
HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT); HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_START].modeCvar, CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_START].modeCvar,
HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT); HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_CARROT].modeCvar,
HUD_EDITOR_ELEMENT_MODE_MOVABLE_43);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_CLOCK].modeCvar, CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_CLOCK].modeCvar,
HUD_EDITOR_ELEMENT_MODE_MOVABLE_43); HUD_EDITOR_ELEMENT_MODE_MOVABLE_43);
CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_HEARTS].modeCvar, CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_HEARTS].modeCvar,
@@ -249,7 +246,9 @@ void HudEditorWindow::DrawElement() {
} }
if (CVarGetInteger(hudEditorElements[i].modeCvar, HUD_EDITOR_ELEMENT_MODE_VANILLA) >= if (CVarGetInteger(hudEditorElements[i].modeCvar, HUD_EDITOR_ELEMENT_MODE_VANILLA) >=
HUD_EDITOR_ELEMENT_MODE_MOVABLE_43) { HUD_EDITOR_ELEMENT_MODE_MOVABLE_43) {
if (ImGui::BeginTable("##table", 3, ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_NoBordersInBody)) { if (ImGui::BeginTable("##table", 3,
ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_NoBordersInBody |
ImGuiTableFlags_SizingStretchSame)) {
ImGui::TableNextColumn(); ImGui::TableNextColumn();
UIWidgets::CVarSliderInt("X", hudEditorElements[i].xCvar, -10, 330, hudEditorElements[i].defaultX, UIWidgets::CVarSliderInt("X", hudEditorElements[i].xCvar, -10, 330, hudEditorElements[i].defaultX,
{ {
@@ -276,6 +275,4 @@ void HudEditorWindow::DrawElement() {
} }
ImGui::PopID(); ImGui::PopID();
} }
ImGui::End();
} }
+1
View File
@@ -32,6 +32,7 @@ typedef enum {
HUD_EDITOR_ELEMENT_D_PAD, HUD_EDITOR_ELEMENT_D_PAD,
HUD_EDITOR_ELEMENT_MINIMAP, HUD_EDITOR_ELEMENT_MINIMAP,
HUD_EDITOR_ELEMENT_START, HUD_EDITOR_ELEMENT_START,
HUD_EDITOR_ELEMENT_CARROT,
HUD_EDITOR_ELEMENT_CLOCK, HUD_EDITOR_ELEMENT_CLOCK,
HUD_EDITOR_ELEMENT_HEARTS, HUD_EDITOR_ELEMENT_HEARTS,
HUD_EDITOR_ELEMENT_MAGIC_METER, HUD_EDITOR_ELEMENT_MAGIC_METER,
+488
View File
@@ -0,0 +1,488 @@
#include "Menu.h"
#include "BenPort.h"
#include "BenGui.hpp"
#include "UIWidgets.hpp"
#include "graphic/Fast3D/gfx_rendering_api.h"
#include "2s2h/Enhancements/Enhancements.h"
#include "2s2h/DeveloperTools/DeveloperTools.h"
#include "window/gui/GuiMenuBar.h"
#include "window/gui/GuiElement.h"
#include "DeveloperTools/SaveEditor.h"
#include "DeveloperTools/ActorViewer.h"
#include "DeveloperTools/CollisionViewer.h"
#include "DeveloperTools/EventLog.h"
#include "HudEditor.h"
#include "SearchableMenuItems.h"
extern "C" {
#include "z64.h"
#include "functions.h"
extern PlayState* gPlayState;
}
std::vector<ImVec2> windowTypeSizes = { {} };
namespace BenGui {
extern std::shared_ptr<HudEditorWindow> mHudEditorWindow;
extern std::shared_ptr<Ship::GuiWindow> mStatsWindow;
extern std::shared_ptr<Ship::GuiWindow> mConsoleWindow;
extern std::shared_ptr<Ship::GuiWindow> mGfxDebuggerWindow;
extern std::shared_ptr<SaveEditorWindow> mSaveEditorWindow;
extern std::shared_ptr<ActorViewerWindow> mActorViewerWindow;
extern std::shared_ptr<CollisionViewerWindow> mCollisionViewerWindow;
extern std::shared_ptr<EventLogWindow> mEventLogWindow;
extern std::shared_ptr<BenInputEditorWindow> mBenInputEditorWindow;
extern std::shared_ptr<std::vector<Ship::WindowBackend>> availableWindowBackends;
extern std::unordered_map<Ship::WindowBackend, const char*> availableWindowBackendsMap;
extern Ship::WindowBackend configWindowBackend;
extern void UpdateWindowBackendObjects();
// BENTODO: Not implemented yet
// UIWidgets::CVarCheckbox("Widescreen Actor Culling",
// "gEnhancements.Graphics.ActorCullingAccountsForWidescreen",
// { .tooltip = "Adjusts the culling planes to account for widescreen resolutions. "
// "This may have unintended side effects." });
// if (gPlayState != NULL) {
// ImGui::Separator();
// SearchMenuGetItem(MENU_ITEM_FRAME_ADVANCE_ENABLE);
// if (gPlayState->frameAdvCtx.enabled) {
// SearchMenuGetItem(MENU_ITEM_FRAME_ADVANCE_SINGLE);
// SearchMenuGetItem(MENU_ITEM_FRAME_ADVANCE_HOLD);
// if (ImGui::IsItemActive()) {
// CVarSetInteger("gDeveloperTools.FrameAdvanceTick", 1);
// }
// }
// }
// ImGui::PushStyleColor(ImGuiCol_Button, menuTheme[menuThemeIndex]);
// RenderWarpPointSection();
// ImGui::PopStyleColor(1);
//}
BenMenu::BenMenu(const std::string& consoleVariable, const std::string& name) : GuiWindow(consoleVariable, name) {
}
void BenMenu::InitElement() {
popped = CVarGetInteger("gSettings.Menu.Popout", 0);
poppedSize.x = CVarGetInteger("gSettings.Menu.PoppedWidth", 1280);
poppedSize.y = CVarGetInteger("gSettings.Menu.PoppedHeight", 800);
poppedPos.x = CVarGetInteger("gSettings.Menu.PoppedPos.x", 0);
poppedPos.y = CVarGetInteger("gSettings.Menu.PoppedPos.y", 0);
AddSettings();
AddEnhancements();
AddDevTools();
menuEntries = { { "Settings", settingsSidebar, "gSettings.Menu.SettingsSidebarIndex" },
{ "Enhancements", enhancementsSidebar, "gSettings.Menu.EnhancementsSidebarIndex" },
{ "Developer Tools", devToolsSidebar, "gSettings.Menu.DevToolsSidebarIndex" } };
UpdateWindowBackendObjects();
}
void BenMenu::UpdateElement() {
}
bool ModernMenuSidebarEntry(std::string label) {
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
ImGuiStyle& style = ImGui::GetStyle();
ImVec2 pos = window->DC.CursorPos;
const ImGuiID sidebarId = window->GetID(std::string(label + "##Sidebar").c_str());
ImVec2 labelSize = ImGui::CalcTextSize(label.c_str(), ImGui::FindRenderedTextEnd(label.c_str()), true);
pos.y += style.FramePadding.y;
pos.x = window->WorkRect.GetCenter().x - labelSize.x / 2;
ImRect bb = { pos - style.FramePadding, pos + labelSize + style.FramePadding };
ImGui::ItemSize(bb, style.FramePadding.y);
ImGui::ItemAdd(bb, sidebarId);
bool hovered, held;
bool pressed = ImGui::ButtonBehavior(bb, sidebarId, &hovered, &held);
if (pressed) {
ImGui::MarkItemEdited(sidebarId);
}
window->DrawList->AddRectFilled(pos - style.FramePadding, pos + labelSize + style.FramePadding,
ImGui::GetColorU32((held && hovered) ? ImGuiCol_ButtonActive
: hovered ? ImGuiCol_ButtonHovered
: ImGuiCol_Button),
3.0f);
UIWidgets::RenderText(pos, label.c_str(), ImGui::FindRenderedTextEnd(label.c_str()), true);
return pressed;
}
bool ModernMenuHeaderEntry(std::string label) {
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
ImGuiStyle& style = ImGui::GetStyle();
ImVec2 pos = window->DC.CursorPos;
const ImGuiID headerId = window->GetID(std::string(label + "##Header").c_str());
ImVec2 labelSize = ImGui::CalcTextSize(label.c_str(), ImGui::FindRenderedTextEnd(label.c_str()), true);
ImRect bb = { pos, pos + labelSize + style.FramePadding * 2 };
ImGui::ItemSize(bb, style.FramePadding.y);
ImGui::ItemAdd(bb, headerId);
bool hovered, held;
bool pressed = ImGui::ButtonBehavior(bb, headerId, &hovered, &held);
window->DrawList->AddRectFilled(bb.Min, bb.Max,
ImGui::GetColorU32((held && hovered) ? ImGuiCol_ButtonActive
: hovered ? ImGuiCol_ButtonHovered
: ImGuiCol_Button),
3.0f);
pos += style.FramePadding;
UIWidgets::RenderText(pos, label.c_str(), ImGui::FindRenderedTextEnd(label.c_str()), true);
return pressed;
}
void BenMenu::Draw() {
if (!IsVisible()) {
return;
}
DrawElement();
// Sync up the IsVisible flag if it was changed by ImGui
SyncVisibilityConsoleVariable();
}
void BenMenu::DrawElement() {
for (auto& [reason, info] : disabledMap) {
info.active = info.evaluation(info);
}
menuThemeIndex = static_cast<ColorOption>(CVarGetInteger("gSettings.MenuTheme", 3));
windowHeight = ImGui::GetMainViewport()->WorkSize.y;
windowWidth = ImGui::GetMainViewport()->WorkSize.x;
auto windowFlags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings;
bool popout = CVarGetInteger("gSettings.Menu.Popout", 0) && allowPopout;
if (popout) {
windowFlags = ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoDocking;
}
if (popout != popped) {
if (popout) {
windowHeight = poppedSize.y;
windowWidth = poppedSize.x;
ImGui::SetNextWindowSize({ static_cast<float>(windowWidth), static_cast<float>(windowHeight) },
ImGuiCond_Always);
ImGui::SetNextWindowPos(poppedPos, ImGuiCond_Always);
} else if (popped) {
CVarSetFloat("gSettings.Menu.PoppedWidth", poppedSize.x);
CVarSetFloat("gSettings.Menu.PoppedHeight", poppedSize.y);
CVarSave();
}
}
popped = popout;
auto windowCond = ImGuiCond_Always;
if (!popout) {
ImGui::SetNextWindowSize({ static_cast<float>(windowWidth), static_cast<float>(windowHeight) }, windowCond);
ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), windowCond, { 0.5f, 0.5f });
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
}
if (!ImGui::Begin("Main Menu", NULL, windowFlags)) {
if (!popout) {
ImGui::PopStyleVar();
}
ImGui::End();
return;
}
if (popped != popout) {
if (!popout) {
ImGui::PopStyleVar();
}
CVarSetInteger("gSettings.Menu.Popout", popped);
CVarSetFloat("gSettings.Menu.PoppedWidth", poppedSize.x);
CVarSetFloat("gSettings.Menu.PoppedHeight", poppedSize.y);
CVarSetFloat("gSettings.Menu.PoppedPos.x", poppedSize.x);
CVarSetFloat("gSettings.Menu.PoppedPos.y", poppedSize.y);
CVarSave();
ImGui::End();
return;
}
ImGui::PushFont(OTRGlobals::Instance->fontStandardLargest);
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
ImGuiStyle& style = ImGui::GetStyle();
windowHeight = window->WorkRect.GetHeight();
windowWidth = window->WorkRect.GetWidth();
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10.0f, 8.0f));
auto sectionCount = menuEntries.size();
const char* headerCvar = "gSettings.Menu.SelectedHeader";
uint8_t headerIndex = CVarGetInteger(headerCvar, 0);
ImVec2 pos = window->DC.CursorPos;
float centerX = pos.x + windowWidth / 2 - (style.ItemSpacing.x * (sectionCount + 1));
std::vector<ImVec2> headerSizes;
#ifdef __ANDROID__
float headerWidth = 600.0f + style.ItemSpacing.x;
#else
float headerWidth = 200.0f + style.ItemSpacing.x;
#endif
for (int i = 0; i < sectionCount; i++) {
ImVec2 size = ImGui::CalcTextSize(menuEntries.at(i).label.c_str());
headerSizes.push_back(size);
headerWidth += size.x + style.FramePadding.x * 2;
if (i + 1 < sectionCount) {
headerWidth += style.ItemSpacing.x;
}
}
#ifdef __ANDROID__
ImVec2 menuSize = {windowWidth,windowHeight};
#else
ImVec2 menuSize = {std::fminf(1280, windowWidth), std::fminf(800, windowHeight) };
#endif
pos += window->WorkRect.GetSize() / 2 - menuSize / 2;
ImGui::SetNextWindowPos(pos);
ImGui::BeginChild("Menu Block", menuSize,
ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize,
ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar);
std::vector<SidebarEntry> sidebar;
float headerHeight = headerSizes.at(0).y + style.FramePadding.y * 2;
ImVec2 buttonSize = ImGui::CalcTextSize(ICON_FA_TIMES_CIRCLE) + style.FramePadding * 2;
bool scrollbar = false;
if (headerWidth > menuSize.x - buttonSize.x * 3 - style.ItemSpacing.x * 3) {
headerHeight += style.ScrollbarSize;
scrollbar = true;
}
if (UIWidgets::Button(ICON_FA_TIMES_CIRCLE, { .size = UIWidgets::Sizes::Inline, .tooltip = "Close Menu (Esc)" })) {
ToggleVisibility();
}
ImGui::SameLine();
ImGui::SetNextWindowSizeConstraints({ 0, headerHeight }, { headerWidth, headerHeight });
ImVec2 headerSelSize = { menuSize.x - buttonSize.x * 3 - style.ItemSpacing.x * 3, headerHeight };
if (scrollbar) {
headerSelSize.y += style.ScrollbarSize;
}
bool autoFocus = CVarGetInteger("gSettings.SearchAutofocus", 0);
bool headerSearch = !CVarGetInteger("gSettings.SidebarSearch", 0);
ImGui::BeginChild("Header Selection", headerSelSize,
ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize,
ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_HorizontalScrollbar);
for (int i = 0; i < sectionCount; i++) {
auto entry = menuEntries.at(i);
uint8_t nextIndex = i;
UIWidgets::PushStyleButton(menuTheme[menuThemeIndex]);
if (headerIndex != i) {
ImGui::PushStyleColor(ImGuiCol_Button, { 0, 0, 0, 0 });
}
if (ModernMenuHeaderEntry(entry.label)) {
if (autoFocus) {
menuSearch.Clear();
}
CVarSetInteger(headerCvar, i);
CVarSave();
nextIndex = i;
}
if (headerIndex != i) {
ImGui::PopStyleColor();
}
UIWidgets::PopStyleButton();
if (headerIndex == i) {
sidebar = entry.sidebarEntries;
}
if (i + 1 < sectionCount) {
ImGui::SameLine();
}
if (nextIndex != i) {
headerIndex = nextIndex;
}
}
std::string menuSearchText = "";
if (headerSearch) {
ImGui::SameLine();
if (autoFocus && ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) && !ImGui::IsAnyItemActive() &&
!ImGui::IsMouseClicked(0)) {
ImGui::SetKeyboardFocusHere(0);
}
ImGui::PushStyleColor(ImGuiCol_FrameBg, { 0, 0, 0, 0 });
menuSearch.Draw("##search", 200.0f);
menuSearchText = menuSearch.InputBuf;
menuSearchText.erase(std::remove(menuSearchText.begin(), menuSearchText.end(), ' '), menuSearchText.end());
if (menuSearchText.length() < 1) {
#ifdef __ANDROID__
ImGui::SameLine(headerWidth - 600.0f + style.ItemSpacing.x);
#else
ImGui::SameLine(headerWidth - 200.0f + style.ItemSpacing.x);
#endif
ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "Search...");
}
ImGui::PopStyleColor();
}
ImGui::EndChild();
ImGui::SameLine(menuSize.x - (buttonSize.x * 2) - style.ItemSpacing.x);
if (UIWidgets::Button(ICON_FA_UNDO, { .color = UIWidgets::Colors::Red,
.size = UIWidgets::Sizes::Inline,
.tooltip = "Reset"
#ifdef __APPLE__
" (Command-R)"
#elif !defined(__SWITCH__) && !defined(__WIIU__) && !defined(__ANDROID__)
" (Ctrl+R)"
#else
""
#endif
})) {
std::reinterpret_pointer_cast<Ship::ConsoleWindow>(
Ship::Context::GetInstance()->GetWindow()->GetGui()->GetGuiWindow("Console"))
->Dispatch("reset");
}
ImGui::SameLine();
if (UIWidgets::Button(
ICON_FA_POWER_OFF,
{ .color = UIWidgets::Colors::Red, .size = UIWidgets::Sizes::Inline, .tooltip = "Quit 2S2H" })) {
if (!popped) {
ToggleVisibility();
}
Ship::Context::GetInstance()->GetWindow()->Close();
}
ImGui::PopStyleVar();
pos.y += headerHeight + style.ItemSpacing.y;
pos.x = centerX - menuSize.x / 2 + (style.ItemSpacing.x * (sectionCount + 1));
window->DrawList->AddRectFilled(pos, pos + ImVec2{ menuSize.x, 4 }, ImGui::GetColorU32({ 255, 255, 255, 255 }),
true, style.WindowRounding);
pos.y += style.ItemSpacing.y;
float sectionHeight = menuSize.y - headerHeight - 4 - style.ItemSpacing.y * 2;
float columnHeight = sectionHeight - style.ItemSpacing.y * 4;
ImGui::SetNextWindowPos(pos + style.ItemSpacing * 2);
#ifdef __ANDROID__
float sidebarWidth = 600 - style.ItemSpacing.x;
#else
float sidebarWidth = 200 - style.ItemSpacing.x;
#endif
const char* sidebarCvar = menuEntries.at(headerIndex).sidebarCvar;
uint8_t sectionIndex = CVarGetInteger(sidebarCvar, 0);
if (sectionIndex > sidebar.size() - 1)
sectionIndex = sidebar.size() - 1;
if (sectionIndex < 0)
sectionIndex = 0;
float sectionCenterX = pos.x + (sidebarWidth / 2);
float topY = pos.y;
ImGui::SetNextWindowSizeConstraints({ sidebarWidth, 0 }, { sidebarWidth, columnHeight });
ImGui::BeginChild((menuEntries.at(headerIndex).label + " Section").c_str(), { sidebarWidth, columnHeight * 3 },
ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_AlwaysAutoResize, ImGuiWindowFlags_NoTitleBar);
for (size_t i = 0; i < sidebar.size(); i++) {
auto sidebarEntry = sidebar.at(i);
uint8_t nextIndex = i;
UIWidgets::PushStyleButton(menuTheme[menuThemeIndex]);
if (sectionIndex != i) {
ImGui::PushStyleColor(ImGuiCol_Button, { 0, 0, 0, 0 });
}
if (ModernMenuSidebarEntry(sidebarEntry.label)) {
if (autoFocus) {
menuSearch.Clear();
}
CVarSetInteger(sidebarCvar, i);
CVarSave();
nextIndex = i;
}
if (sectionIndex != i) {
ImGui::PopStyleColor();
}
UIWidgets::PopStyleButton();
if (nextIndex != i) {
sectionIndex = i;
}
}
ImGui::EndChild();
ImGui::PushFont(OTRGlobals::Instance->fontMonoLarger);
pos = ImVec2{ sectionCenterX + (sidebarWidth / 2), topY } + style.ItemSpacing * 2;
window->DrawList->AddRectFilled(pos, pos + ImVec2{ 4, sectionHeight - style.FramePadding.y * 2 },
ImGui::GetColorU32({ 255, 255, 255, 255 }), true, style.WindowRounding);
pos.x += 4 + style.ItemSpacing.x;
ImGui::SetNextWindowPos(pos + style.ItemSpacing);
float sectionWidth = menuSize.x - sidebarWidth - 4 - style.ItemSpacing.x * 4;
std::string sectionMenuId = sidebar.at(sectionIndex).label + " Settings";
int columns = sidebar.at(sectionIndex).columnCount;
size_t columnFuncs = sidebar.at(sectionIndex).columnWidgets.size();
if (windowWidth < 800) {
columns = 1;
}
#ifdef __ANDROID__
columns=1;
#endif
float columnWidth = (sectionWidth - style.ItemSpacing.x * columns) / columns;
bool useColumns = columns > 1;
if (!useColumns || (headerSearch && menuSearchText.length() > 0)) {
ImGui::SameLine();
ImGui::SetNextWindowSizeConstraints({ sectionWidth, 0 }, { sectionWidth, columnHeight });
ImGui::BeginChild(sectionMenuId.c_str(), { sectionWidth, windowHeight * 4 }, ImGuiChildFlags_AutoResizeY,
ImGuiWindowFlags_NoTitleBar);
}
if (headerSearch && menuSearchText.length() > 0) {
ImGui::BeginChild("Search Results");
int searchCount = 0;
for (auto& [menuLabel, menuSidebar, cvar] : menuEntries) {
for (auto& sidebar : menuSidebar) {
for (auto& widgets : sidebar.columnWidgets) {
int column = 1;
for (auto& info : widgets) {
if (info.widgetType == WIDGET_SEPARATOR || info.widgetType == WIDGET_SEPARATOR_TEXT ||
info.isHidden) {
continue;
}
std::string widgetStr = std::string(info.widgetName) +
std::string(info.widgetTooltip != NULL ? info.widgetTooltip : "");
std::transform(menuSearchText.begin(), menuSearchText.end(), menuSearchText.begin(), ::tolower);
std::transform(widgetStr.begin(), widgetStr.end(), widgetStr.begin(), ::tolower);
widgetStr.erase(std::remove(widgetStr.begin(), widgetStr.end(), ' '), widgetStr.end());
if (widgetStr.find(menuSearchText) != std::string::npos) {
SearchMenuGetItem(info);
searchCount++;
ImGui::PushStyleColor(ImGuiCol_Text, UIWidgets::Colors::Gray);
std::string origin = fmt::format(" ({} -> {}, Clmn {})", menuLabel, sidebar.label, column);
ImGui::Text("%s", origin.c_str());
ImGui::PopStyleColor();
}
}
column++;
}
}
}
if (searchCount == 0) {
ImGui::SetCursorPosX((ImGui::GetWindowWidth() - ImGui::CalcTextSize("No results found").x) / 2);
ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 10.0f);
ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.4f), "No results found");
ImGui::SetCursorPosX((ImGui::GetWindowWidth() - ImGui::CalcTextSize("Clear Search").x) / 2 - 10.0f);
ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 10.0f);
if (UIWidgets::Button("Clear Search", { .size = UIWidgets::Sizes::Inline })) {
menuSearch.Clear();
}
}
ImGui::EndChild();
} else {
for (int i = 0; i < columnFuncs; i++) {
std::string sectionId = fmt::format("{} Column {}", sectionMenuId, i);
if (useColumns) {
ImGui::SetNextWindowSizeConstraints({ columnWidth, 0 }, { columnWidth, columnHeight });
ImGui::BeginChild(sectionId.c_str(), { columnWidth, windowHeight * 4 }, ImGuiChildFlags_AutoResizeY,
ImGuiWindowFlags_NoTitleBar);
}
for (auto& entry : sidebar.at(sectionIndex).columnWidgets.at(i)) {
SearchMenuGetItem(entry);
}
if (useColumns) {
ImGui::EndChild();
}
if (i < columns - 1) {
ImGui::SameLine();
}
}
}
if (!useColumns || menuSearchText.length() > 0) {
ImGui::EndChild();
}
ImGui::PopFont();
ImGui::PopFont();
if (!popout) {
ImGui::PopStyleVar();
}
ImGui::EndChild();
if (popout) {
poppedSize = ImGui::GetWindowSize();
poppedPos = ImGui::GetWindowPos();
}
ImGui::End();
}
} // namespace BenGui
+31
View File
@@ -0,0 +1,31 @@
#pragma once
#include <libultraship/libultraship.h>
#include "UIWidgets.hpp"
namespace BenGui {
class BenMenu : public Ship::GuiWindow {
public:
using Ship::GuiWindow::GuiWindow;
BenMenu(const std::string& consoleVariable, const std::string& name);
void InitElement() override;
void DrawElement() override;
void UpdateElement() override;
void Draw() override;
protected:
ImVec2 mOriginalSize;
std::string mName;
uint32_t mWindowFlags;
private:
bool allowPopout = true; // PortNote: should be set to false on small screen ports
bool popped;
ImVec2 poppedSize;
ImVec2 poppedPos;
float windowHeight;
float windowWidth;
};
} // namespace BenGui
+140
View File
@@ -0,0 +1,140 @@
#include "Notification.h"
#include <libultraship/libultraship.h>
extern "C" {
#include "functions.h"
#include "macros.h"
#include "variables.h"
}
namespace Notification {
static uint32_t nextId = 0;
static std::vector<Options> notifications = {};
void Window::Draw() {
auto vp = ImGui::GetMainViewport();
const float margin = 30.0f;
const float padding = 10.0f;
int position = CVarGetInteger("gNotifications.Position", 3);
// Top Left
ImVec2 basePosition;
switch (position) {
case 0: // Top Left
basePosition = ImVec2(vp->Pos.x + margin, vp->Pos.y + margin);
break;
case 1: // Top Right
basePosition = ImVec2(vp->Pos.x + vp->Size.x - margin, vp->Pos.y + margin);
break;
case 2: // Bottom Left
basePosition = ImVec2(vp->Pos.x + margin, vp->Pos.y + vp->Size.y - margin);
break;
case 3: // Bottom Right
basePosition = ImVec2(vp->Pos.x + vp->Size.x - margin, vp->Pos.y + vp->Size.y - margin);
break;
case 4: // Hidden
return;
}
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0, 0, 0, CVarGetFloat("gNotifications.BgOpacity", 0.5f)));
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0));
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f);
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(8.0f * CVarGetFloat("gNotifications.Size", 1.8f), 6.0f));
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(8.0f * CVarGetFloat("gNotifications.Size", 1.8f), 8.0f));
for (int index = 0; index < notifications.size(); ++index) {
auto& notification = notifications[index];
int inverseIndex = -ABS(index - (notifications.size() - 1));
ImGui::SetNextWindowViewport(vp->ID);
if (notification.remainingTime < 4.0f) {
ImGui::PushStyleVar(ImGuiStyleVar_Alpha, (notification.remainingTime - 1) / 3.0f);
} else {
ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 1.0f);
}
ImGui::Begin(("notification#" + std::to_string(notification.id)).c_str(), nullptr,
ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoFocusOnAppearing |
ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar |
ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove |
ImGuiWindowFlags_NoScrollbar);
ImGui::SetWindowFontScale(CVarGetFloat("gNotifications.Size", 1.8f));
ImVec2 notificationPos;
switch (position) {
case 0: // Top Left
notificationPos =
ImVec2(basePosition.x, basePosition.y + ((ImGui::GetWindowSize().y + padding) * inverseIndex));
break;
case 1: // Top Right
notificationPos = ImVec2(basePosition.x - ImGui::GetWindowSize().x,
basePosition.y + ((ImGui::GetWindowSize().y + padding) * inverseIndex));
break;
case 2: // Bottom Left
notificationPos = ImVec2(basePosition.x,
basePosition.y - ((ImGui::GetWindowSize().y + padding) * (inverseIndex + 1)));
break;
case 3: // Bottom Right
notificationPos = ImVec2(basePosition.x - ImGui::GetWindowSize().x,
basePosition.y - ((ImGui::GetWindowSize().y + padding) * (inverseIndex + 1)));
break;
}
ImGui::SetWindowPos(notificationPos);
ImGui::AlignTextToFramePadding();
if (notification.itemIcon != nullptr) {
ImGui::Image(
Ship::Context::GetInstance()->GetWindow()->GetGui()->GetTextureByName(notification.itemIcon),
ImVec2(22 * CVarGetFloat("gNotifications.Size", 1.8f), 22 * CVarGetFloat("gNotifications.Size", 1.8f)));
ImGui::SameLine();
}
if (!notification.prefix.empty()) {
ImGui::TextColored(notification.prefixColor, "%s", notification.prefix.c_str());
ImGui::SameLine();
}
ImGui::TextColored(notification.messageColor, "%s", notification.message.c_str());
if (!notification.suffix.empty()) {
ImGui::SameLine();
ImGui::TextColored(notification.suffixColor, "%s", notification.suffix.c_str());
}
ImGui::End();
ImGui::PopStyleVar();
}
ImGui::PopStyleVar(3);
ImGui::PopStyleColor(2);
}
void Window::UpdateElement() {
for (int index = 0; index < notifications.size(); ++index) {
auto& notification = notifications[index];
// decrement remainingTime
notification.remainingTime -= ImGui::GetIO().DeltaTime;
// remove notification if it has expired
if (notification.remainingTime <= 0) {
notifications.erase(notifications.begin() + index);
--index;
}
}
}
void Emit(Options notification) {
notification.id = nextId++;
if (notification.remainingTime == 0.0f) {
notification.remainingTime = CVarGetFloat("gNotifications.Duration", 10.0f);
}
notifications.push_back(notification);
AudioSfx_PlaySfx(NA_SE_SY_METRONOME, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultReverb);
}
} // namespace Notification

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