Expose every registered Joker from a paged review screen entered with Start or Select. Reuse the gameplay card art and description renderers, support controller navigation, and clean up the preview object when returning to the menu.
Extend the bitmap font pipeline with the Chinese Joker glyph subset and encode supported UTF-8 text for Tonc TTE. Move the affine map clear of the expanded font, add a compile-time VRAM overlap guard, and cover every custom glyph with host tests.
* Updated all static variables to have the s_ prefix and constants to upper case
* Renamed missed sneaky functions in round.c (+ clang-format...)
* Renamed a few more missed constants
* Updated rng_update() documentation
* Apply suggestions from Copilot's code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Added missed suggestion
* Updated rng_update() comment
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Turned SpriteObject into a member of JokerObject and CardObject and expiremented with casting
* Extracted shop code to use generic `SpriteObject`
* Extracted shop joker generation to a function
* Renamed object -> item
* Added setters and getters for `SpriteObject` members and updated all accesses to use them with casting (AI used for tedious work and reviewed - model Raptor mini)
* Added sprite_object_set_vx() because sprite_object_set_vy() exists and reordered the function order to have x,y parameters first, then targets
* Added Item object to act as a purchasable interface for the shop - AI used (model Raptor mini)
* Added -fms-extensions and switched to anonymous inheritance
* Fixed anonymous inheritance for joker and added direct access for that too
* fix build error from previous commit + clang-format
* Fixed build errors + clang-format for real this time (I hope...)
* clang-format one last time, I don't understand it anymore
* clang-format is annoying
* Added uses of CHECK_NULL_ARG macros
* Merged item_defs.h into item.h and fixed build error from previous commit
* clang-format...?
* Changed sprite_object_new() into sprite_object_init() and made it accept a parameter instead of returning one to make it less awkward
* Updated sprite_object_init() documentation
* Updated sprite_object_destroy documentation
* More clang-format
* Renamed add_to_inventory to acquire and updated documentation
* Added function documentations
* Update documentation + swap order of consumable and playing card types
* Added documentation for new files (+ small addition to button.h)
* clang-format
* Used typedef
* A bit more documentation
* Changed sho pcode to use generic Item instead of SpriteObject
* clang-format + fixed NULL-check error
* Revert weird clang-format...?
* clang-format for real
* Fixed errors from rebase on log_function_name
* Fixed build errors from rebase on main
* Added some more documentation about first member struct inheritance
* typo fix
* typo fix for real
* Removed SpriteObject field getters/setters (AI used - model Raptor mini)
* Renamed item_acquire -> item_on_acquired
* Added item_can_acquire()
* clang-format
* Fixed some sprite issues but not all...
* Fixed some more issues
* Cleanup JokerObject some more JokerObjects in the shop
* Added `item_destroy()`
* Added item_set_available_to_shop, CHECK_ITEM_TYPE macros + small documentation updates
* Another small JokerObject->Item replacement
* Removed item_set_available_to_shop and replaced with item_roll_new() and item_dispose(), also changed "available_to_shop" semantics to "rollable"
* Re-applied changes from game.c to round.c after rebase on main
* Added partial implementations of item functions for playing cards
* Line endings fix...
* Macro renames, function documentations
* Updated documentations
* Apply fixes from Copilot review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Fix card_object_get_buy_price type checking
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Avoid double pointer cast on dispose
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Apply suggestions from @ricfehr3's code review
Co-authored-by: Rickey <ric@rf3.xyz>
* Remove redundant comments
* Moved error checking before joker_get_random_rarity
Co-authored-by: Rickey <ric@rf3.xyz>
* Fixed build error from rebase
* clang-format
* Added doxygen documentation for Item explaining inheritance
* Removed unnecessary comment
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Rickey <ric@rf3.xyz>
* Added function name logging to mgba_logger
* Addendum to no-op defines
* Fixed compile errors
* Added "()" to function name in log to make it clearer it's a function
* Corrected documentation
* clang-format...?
* Removed MGBA_LOG_LEVEL_MASK magic number
* Added CHECK_NULL_ARG macros
* clang-format...?
* clang-format for real
* Added documentation for CHECK_NULL_ARG_VOID and CHECK_NULL_ARG_RET
* Fixed typo
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Fixed macro safety by wrappinh with do-while
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Fixed format string cut risk in mgba_func_printf
* clang-format
* clang-format some more
* clang-format for real
* Fixed DEBUG -> INFO in comment
Co-authored-by: Rickey <ric@rf3.xyz>
* Moved NULL-check macros to util.h and renamed them
* Small additions - macro rename + clang-format
* Truncate the string instead of the function name
* Cleaned up code from previous commit
* clang-format
* Added mgba_logger_available check to mgba_func_printf
* Updated documentation for latest change
* Changed CHECK_NULL_ARG functions to generic RETURN_ON_ERROR_VAL functions.
* clang-format
* Changed back to specifically check NULL
* clang-format
* Changed "=" into "==" in the error message
* clang-format
* Fixed forgotten "=="
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Rickey <ric@rf3.xyz>
* Everything works, need to clean up
* cleanup
* fix rebase issue
* clang format
* docs
* clang format
* clang format
* address part of review
* Protect against edge case when discarding at end of hand
* Protect undiscard against popping a discarded card that doesn't exist
* Protect against out of bounds access to the `played` cards stack
* fix condition in `select_four_of_a_kind_cards_in_played_hand`
* change `get_played_top() + 1` to `get_played_size()`
* move `can_play/discard_hand` functions to round.c
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
* Implement `sprite_object_update_all`
* clang format
* Change update order
* tmp
* make it crash
* Fix bad address crash
* Address @MeirGavish's comments
* Tweaked card draw position further
* Tweaked card draw position further, again
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
* WIP
* WIP
* WIP
* WIP
* Tags are bugged but it's looking good
* Centering is bugged, almost there
* WIP
* Fixed centeriiiing, yaaaay
* good progress
* add proper '\n' support
* WIP descriptions
* All descriptions are there ^^
* missing 9-patch for pretty display
* WIP
* fix rebase issues
* Fix minor Run Setup screen issues
* Almost done, only one fix to go
* Aaaalmooost doooneeeee
* make desc frame size adaptative
* add rarity color and text
* final cleanup
* clang format
* clang format
* clang format
* clang format
* clang format
* Fix Joker update loop index
* Fix const and Bull description
* Fix unwanted button SFX
* fix tte colors
* Add misprint description
* Fix justified line length computation
* Add safeguards to tag parsing loop
* clang format
* Fix Ante bugged display at boss blind end
* Tweak suit colors
* Final fixes
* Simplified the way we print descriptions
* simplify further
* get rid of weird macro
* Fix Onwed joker price when holding A after showing its description
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
* initial commit
* wip
* WIP
* WIP
* clang format
* Choose Seed navigation mostly done
* seed input navigation done
* seed input done
* cleanup and clang format
* Implement base 10 to 36 conversions
* Enable seeded runs
* clang format
* show default deck sprite, name and description
* Rename Deck enum to DeckType
* Implement arbitrary 9-patch expand system
* Make 9-patch example smaller in the docs
* Improve NinePatchRect docs
* fix Deck back side sprite palette
* clang format
* Add last deck description
* clang format
* Fix 'Z' in seed input keyboard
* Fix rebase issue
* fix deck sprite not updating
* Documents static funcs in run_setup.c
* more documentation
* clang format
* Move Play button to the left in its row
* Tests WIP
* removing tests for random.h
* use the new StateMachine struct
* First wave of fixes
* Fix the 9-patch again
* Changed the base 36 logic so it's in big endian
* properly set end of base 36 string to '\0'
* typos
* fix cursor position after rolling a seed + fix random seed generation
* Make keyboard more intuitive to use
* static const var
* Address more comment from @ricfehr3
* clang format
* clang format
* clang format
* clang format
* clang format
* clang format
* clang format
* fix deck palette
* create the `DEF_SEED_KEYBOARD_BUTTON_OBJECT` macro
* Replace `expand_3x3` by a call to `expand_9-patch`
* clang format
* clang format
* clang format
* fix rebase iussue in state_machine.h
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
* initial additions
* Move current_blind to game vars
* tmp
* tmp
* tmp
* tmp
* tmp
* tmp
* tmp
* Compile but is broken
* temp fix for token location
* tmp
* Working, lets clean up
* remove todo
* Remove odd reroll blind variable
* fix skipping blind screen
* fix reroll
* remove magic for blind token locations
* clang format
* Cleanup button highlight in blind menu
* some cleanup
* Add layout file for global UI rects
* remove dead code
* Clang format
* clang format it up
* Move reset top left funct to gfx utils
* make note of soon-to-be removed vars
* Cleanup gamevars declaration
* Cleanup layout file
* Apply suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Add include for stdbool.h in common_ui.h
* Cleanup rect declaration
* Start moving state machine stuff to new file
* quick tmp
* oops, add new files
* working call list
* fixed pointer stuff
* working as per norm
* working replacement
* move defines to static const
* fix compile issue
* Add some missing "void"s
* Working new substates
* add statemachine to blind select
* Fix game restart statemachine leak
* clang-format
* Clang format
* Rework shop exit logic
* Use new state machine in shop
* Remove substates entirely
* Remove debug stuff
* Clang format
* document state machine better
* update list tests
* clang-format
* Update for PR
* Claaaaang format
* another clang-format
* Remove extra state in round_end
* cleanup docs for removals in lists
* clang-format... again
* update doxygen format
* Clang format
* tmp
* Update for Pr
* clang-format
* Cleanup for only supporting losing
* bug fix, thanks logs!
* Fix dangling pointer bug
The control of removing statemachines may call issues if starting the
function is done from another state machine call. To remedy this, add a
flag to determine if a state machine is registered and return early
instead of blindly removing it to re-add.
* Fix bug with audio iterations possibly going in reverse
* Remove extra includes
* Clang-format
* Add sound effects for game win/lose
* adjust audio steps
* tmp
* Nice sounding and cleaned up
* Fix and cleanup
* clang-format
* clang-format
* clang format again
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Options menu revamp
* Implement readable card sprites
* redraw characters to fix the original style
* clang format
* remove usage of UNDEFINED (-1) for unsigned values
* typo
* change save fix for something cleaner
* remove dependency to game_variables.h from card.c
* Make the palette look less silly ^^'
* Address @ricfehr3's comments
* clang format
* quick rename
* clang format
---------
Co-authored-by: Geralt <84459734+MathisMartin31@users.noreply.github.com>
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
Co-authored-by: Turro75 <valerio.turrini@gmail.com>
* Options menu revamp
* Implement readable card sprites
* redraw characters to fix the original style
* clang format
* remove usage of UNDEFINED (-1) for unsigned values
* typo
* change save fix for something cleaner
* remove dependency to game_variables.h from card.c
* Make the palette look less silly ^^'
* Address @ricfehr3's comments
* clang format
* quick rename
* clang format
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
* initial additions
* Move current_blind to game vars
* tmp
* tmp
* tmp
* tmp
* tmp
* tmp
* tmp
* Compile but is broken
* temp fix for token location
* tmp
* Working, lets clean up
* remove todo
* Remove odd reroll blind variable
* fix skipping blind screen
* fix reroll
* remove magic for blind token locations
* clang format
* Cleanup button highlight in blind menu
* some cleanup
* Add layout file for global UI rects
* remove dead code
* Clang format
* clang format it up
* Move reset top left funct to gfx utils
* make note of soon-to-be removed vars
* Cleanup gamevars declaration
* Cleanup layout file
* Apply suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Add include for stdbool.h in common_ui.h
* Cleanup rect declaration
* Start moving state machine stuff to new file
* quick tmp
* oops, add new files
* working call list
* fixed pointer stuff
* working as per norm
* working replacement
* move defines to static const
* fix compile issue
* Add some missing "void"s
* Working new substates
* add statemachine to blind select
* Fix game restart statemachine leak
* clang-format
* Clang format
* Rework shop exit logic
* Use new state machine in shop
* Remove substates entirely
* Remove debug stuff
* Clang format
* document state machine better
* update list tests
* clang-format
* Update for PR
* Claaaaang format
* another clang-format
* Remove extra state in round_end
* cleanup docs for removals in lists
* clang-format... again
* update doxygen format
* Clang format
* Update list docs
* Update lists tests
* Fix bad conflict resolution
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* move all hand funcs to their new file. now to clean up
* WIP
* Cleanup + doc hand.h
* clang format
* Refactor loose variables in hand.c into a proper Hand struct
* Fix some more issues
* Apply *some* suggestions from code review
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* remove outdated comment
* fix rebase issue
* fix rng_info missing from g_game_vars init
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Extract rng manipulation to its own file
* clang format
* Get CPU cycles since game start to use for RNG
* change a few things
* clang format
* Implement suggestions from @ricfehr3
* clang format
* Fix rebase issue
* clang format
* Create RngInfo struct to hold seed and step
* clang format
* Make a note about rng_restore system not having been tested properly yet
* Apply suggestions from @ricfehr3
Co-authored-by: Rickey <ric@rf3.xyz>
* clang format
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
Co-authored-by: Rickey <ric@rf3.xyz>
* optimizations
* fix prototype
* clang-format
* changes
* fix bug
* fix bug that came back after rebase
* make is_sprite_object_static more readable
* make it not broken
* actually make it compile...
* clang-format
* remove first extra check
* remove second extra check
* remove third extra check
* helper function 1
* second helper function
* how did i do this that wrong
* seperate epsilon
* combine if statements
* clarify comment
* remove redundant checks
* Remove braces around return
Co-authored-by: Rickey <ric@rf3.xyz>
* Move comment to above
Co-authored-by: Rickey <ric@rf3.xyz>
* clang-format
* simplify using abs()
Co-authored-by: Rickey <ric@rf3.xyz>
* fix syntax error from suggestion
* drop second epsilon + use abs()
* update comment
* extract sprite_oject_needs_position_sync from is_sprite_object_static
* figured out the root cause :)
* make it compile
---------
Co-authored-by: Rickey <ric@rf3.xyz>
* initial commit, DOES NOT COMPILE
* Rename joker interactions file to `joker_row`
* IT'S WORKIIING (now to make it pretty lol)
* fixed rebase issues
* fix rebase + undo state machine changes
* Document shop state functions
* clang format
* fix reroll cost not appearing on shop init
* Move generic SpriteObject text/price printing functions to sprite.c + some minor fixes
* Resolve weird defines/include order issue
* clang format
* Implement suggestions from @ricfehr3
* clang format
* clang format
* fix rebase
* Implement sugegstions from @ricfehr3
* Refactored shop to use the Button struct
* missed some memsets
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
* Initial round_end extraction
* move hands to game vars
* Checkpoint
* Finish removing all variables for state fns
* Move over round_end substate functions
* Move over round_end with compile
* working in general
* Fix round start state issue
* clang-format
* Fix clang format issue
* PR fixes and standardize types in game vars struct
* Clang-format
* Make save changes their own branch
* Make SaveData tags char[] instead of u32[]
* Make Game and Options data saving independent
* removed unused functions
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* mark save sections as valid only after they are actually written to SRAM
* fix comparison between different integer types
* Implement some suggestions from @ricfehr3
* Add extensive documentation on the structure of the savefile
* fix doxygen doc generation
* fix it again
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Move game over (win/lose) state functions to their own file
* remove unused enum
* clang format
* Implement suggestions from @ricfehr3
* Fixing lack of highlighted button after skipping ablind
* factorize as much game over state code as possible
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
* background
* Implement Options button
* Update main menu artwork
* add options menu tiles
* prepare options menu handling
* incorporate main menu refactor
* toto
* add all menu interactions
* do not reset selection_x in main_menu
* options struct
* fix rebase from ricfehr3's repo
* Implement high contrast cards
* Save/Load options values to SRAM
* load options on game_init and validate data within the load_options function
* Get changes from ricfehr3's PR
* recover fix for glitched ace
* clang format
* clang format
* clang format
* Save 500B of image data by using only minimal set of tiles instead of keeping final window in source file
* clang format
* clang format
* Implement Options button
* Update main menu artwork
* progress, leaving it alone for now until discussion
* make game_vars an extern
* Move options vars into their own struct
* rollback previous commit
* Implement save validation. Version check to come
* implement data validity + version check for game saves
* clang format
* Save position in rng sequence for consistent run after load
* fix rebase issues
* fix rebase issue
* remove unused/duplicate define
* Oops, made a mistake when testing PR #424
* encode high contrast palette into an image, and load it at game_start
* document save.c/h and correct typos
* correct alignment
* game speed and high contrast buttons working
* small cleanup
* sliders also work again now
* clang format
* Moved balatro_version extern declaration to version.h file
* removed unsused variable
* make showing ROM version a toggle
* move ante, round and money to the GameVariables struct
* Rename SaveCheckInfo struct to SaveHeader for clarity
* Add SaveHeader struct explanation
* clang format
* Revert unnecessary tileset optimization
* SFX now follows the sound volume slider
* clang format
* Music now follows volume slider
* Changed volume slider increment from 5 to 20 to avoid having the music sound too rough under 20% volume
* refactor main_menu.c to use SelectionGrid and Button structs
* clang format
* make a "new" save button so we don't save during the state transition
* clang format
* Reduced state transition flicker by only changing affine background to a different one
* Fix loading game too late in game init sequence
* First batch of suggestions from @MeirGavish
* Remove unnecessary intermediary buffers for high contrast palette swapping
* comment row warp hack for button input
* Add some of Copilot's suggestions
* rename balatro_version into gbalatro_version for rebranding reasons + version display erase screen fix
* remove unnecessary NULL check on `on_selection_changed` method
* implement small game speed arrow buttons animation
* factorize some code
* remove unnecessary data validation in load_game(), since we already checked the header
* Implement @MeirGavish 's suggestion regarding splitting the huge `on_update` function
* clang format
* implement @ricfehr3 's suggestion about keeping last selected button instead of using an obscure `on_boot` boolean
* Apply @ricfehr3's suggestions
* fix clang-format flags
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
* Add basic common_ui background gfx functions
* Move game main menu to separate file
* clang format
* tmp commit basic docs
* clang format
* scope vars and cleanup
* Quick consistency update. Finalize.
This branch is based on: https://github.com/GBALATRO/balatro-gba/pull/363
Co-authored-by: emiyl <me@emiyl.com>
* Simplify global struct
* clang-format
* Add clang-format to subdirs
* Move timer definitions into their own file
* clang-format
* Fix action yml
* docs
* Update for PR
* Move game start to a state
* Remove lag switch
* Remove GameVariables pointer for callbacks
* Make game_vars a global
* move declaration of game vars in header
* Fix multiple game_vars
* fix for pr
* remove change_background in update again
* clang format
* Make bgCallbacks table static const
---------
Co-authored-by: emiyl <me@emiyl.com>
* Created sprite bank for all blinds
* progress city, it's a beatiful city that progress city!
* Sprite appears in blind selection screen
* Added all blind colors
* fix magic numbers + disable boss reroll
* Fix boss blind token not moving after a reroll
* fix always rolling the Needle due to choosing too early for the rng seed to be set
* No need for affine sprite for blind tokens, regular is enough
* address Copilot's review 1/2
* address Copilot's review 2/2
* correct Blind Tokens/Types
* Index palette colors into the files instead of code
* Fix blind sprites (flip bug not solved)
* Fix magic number, tile index and Mark colors
* load boss blind palette only when changing spritesheet
* Adressing clang format and ease of modification of the blinds' list
* Removed some magic numbers
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
* Add optional exit indexes to selection grid rows & fix shop reroll button movement (#316)
- Added has_exit_idx and exit_idx to SelGridRowAttributes to simulate subgrid-like behavior that was desired in shop reroll button
- Add logic to use exit index if given inside selection_grid_move_selection_horz()
- Add joker focus logic to shop_reroll_row_on_selection_changed()
* clang-format fix
* clang format fix#2
errors due to version mismatch in local fixed (i hope)
* important fix: check x instead of y for next_roudn_btn_sel_x
was checking y against an X value
* changed commenting
* selection_grid.h clang-format fix
* changed commenting again
trying to make docs understandable
* set shop selection rows explicit
Co-authored-by: Rickey <ric@rf3.xyz>
* syntax fix
* clang format fix onceagain
* guard clause when moving down from jokers
---------
Co-authored-by: Rickey <ric@rf3.xyz>
* Convert static joker sprites indexes to maps for dynamic spritesheets size
* tmp commit
* reorder Joker spritesheets
* more reordering
* Joker maps, will test later
* More reorders and palette optimizations. Sprites now work
* Fix Joker gfx
* Format joker.c
* Fix rebase error
* Integrate Shoot the Moon art
* format
* format
* removing useless GBAL_UNUSED from photograph Joker effect func
* Tidy up joker.c variables formatting
* Fix magic number
* Add context for map in joker.c
Co-authored-by: Rickey <ric@rf3.xyz>
* Update source/joker.c
Co-authored-by: Rickey <ric@rf3.xyz>
* Apply suggestion from @ricfehr3
Co-authored-by: Rickey <ric@rf3.xyz>
* format
* reduce clutter in joker_effects.c file by defining a macro for forward static declarations of joker effect funcs
* refactored some maps in joker.c to make it more concise
* clang format
* adding back how to mark functions as unused when Jokers don't have a sprite yet
* format
* Remove comment about unused functions for Jokers without art
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
Co-authored-by: Rickey <ric@rf3.xyz>
* Changed L and R keys to play and discard respectively, removed sorting key in favor of on-screen buttons
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Introduce a ContainedHandTypes type
* Separate computing of hand_type and _contained_hand_types variables
---------
Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
* Fixed to truncate as "1.234M" instead of "1234K"
* Optimized by switching to strings to avoid divisions
* Changed FP constants to strings
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>