Initial commit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shweetandClaude Opus 5.5 committed 2026-11-08 01:30:33 -05:00
commit 2007fb7edc
200 files changed
+27710

No files matched your search

+126
View File
@@ -0,0 +1,126 @@
#pragma once
#include "common.h"
#include "protocol.h"
#include "ui.h"
struct Game;
// The menu's frame: a panel (header then body) centred across the top, with the item tabs' hotbars a row under it and
// the gamepad hints under those.
constexpr float MENU_TOP = 24;
constexpr float MENU_WIDTH = 440;
constexpr float HEADER_HEIGHT = 28;
constexpr float BODY_HEIGHT = 240;
constexpr float BAR_SPACING = 12;
constexpr float BAR_Y = MENU_TOP + HEADER_HEIGHT + BODY_HEIGHT + BAR_SPACING;
constexpr float HINT_GAP = 3;
enum MenuTab
{
TAB_WEAPONS,
TAB_TRINKETS,
TAB_PLAY,
TAB_CUSTOMIZE,
TAB_SETTINGS,
TAB_COUNT
};
enum PlayPage
{
PAGE_MAIN,
PAGE_RULES,
PAGE_ONLINE,
// A lobby's Queue a Game: the rules again, with Host for Play.
PAGE_QUEUE
};
constexpr int ITEM_TABS = TAB_PLAY;
// Where everything in the open menu sits. Rows is how many grid rows fit on screen.
struct MenuLayout
{
Rect body;
Rect description;
Rect divider;
Rect grid;
Rect header;
Rect panel;
Rect scroll;
int columns = 1;
int rows = 1;
};
// The Tab menu. In the sandbox: browse every weapon or trinket, read about it, level it and assign it to hotbar slots,
// set up and start a game from Play, change your name in Customize, and Settings. In a match: Settings and a Forfeit
// button (pressed twice), or only the item tabs being chosen from while a round's countdown lets fighters choose
// them, with a Ready button. On an item tab the hotbars sit under the menu. Play asks the match to start on its next
// tick (through the input). On a gamepad (or the arrow keys and Enter) the focus moves between widgets, the bumpers
// switch tabs and B goes back a page or closes the menu.
class Menu
{
public:
Page pages[TAB_COUNT];
int tab = TAB_WEAPONS;
bool isOpen = false;
// Whether this tick's Escape went to the menu, so nothing else takes it too.
bool isEscapeTaken = false;
void update(Game& game);
void draw(Game& game);
void choice_open(Game& game);
void online_open();
void targets_reset(Game& game);
void target_fill(Game& game);
bool is_bars_open();
Rect slot_rect(bool isTrinket, int index, int count);
bool is_choosable(Game& game, bool isTrinket);
int target_get(Game& game, bool isTrinket);
private:
Page description;
int described = -1;
// A hotbar slot clicked to read about (its item shown instead of the selection) while still on the tab it was
// clicked on, or -1.
int pinnedSlot = -1;
// Each item tab's target slot: where an item clicked a second time goes.
int targets[ITEM_TABS] = {};
int pinnedTab = -1;
bool isPinnedTrinket = false;
bool wasReady = false;
int scrolls[ITEM_TABS] = {};
int selections[ITEM_TABS] = {};
int page = PAGE_MAIN;
bool isForfeitArmed = false;
bool isMultiplayer = false;
// The rules a game queued in a lobby is hosted with (kept apart from this screen's own single player ones).
Rules queueRules = rules_get(MODE_DEATHMATCH);
// The lobby code typed on the Multiplayer page.
char joinCode[LOBBY_CODE_LENGTH + 1] = {};
// Which lobby copy button (code or link) was last used, and until when it says so.
int copiedButton = -1;
Uint64 copiedUntil = 0;
MenuLayout layout_get();
Rect box_rect(int index);
int tabs_get(Game& game, int* tabs);
int item_count();
int row_count();
void slot_assign(Game& game, int slot);
void slot_clear(Game& game, bool isTrinket, int slot);
void loadout_set(Game& game, bool isTrinket, int slot, int item);
void item_toggle(Game& game);
void level_step(Game& game, int step, Vec2 mouse);
void slot_level_step(Game& game, bool isTrinket, int slot, int step);
void pad_update(Game& game);
void hints_draw(Game& game, MenuLayout& layout);
void header_draw(Game& game, MenuLayout& layout);
void items_draw(Game& game, MenuLayout& layout);
void play_draw(Game& game, MenuLayout& layout);
void rules_draw(Game& game, Rect area, Rules& rules, bool isQueue);
void online_draw(Game& game, Rect area);
void play_button_draw(Game& game, Rect button, bool isQueue);
void players_join(Game& game);
void sandbox_players_join(Game& game);
void crumbs_draw(Game& game, MenuLayout& layout);
};