MushRog

An interface that finds itself

October 15, 2026 designbastidores

We redid the path of someone opening the game for the first time, from the title screen to the first room, and the bottom bar became the place where everything can be found. Before, half the game only existed for people who knew where to look.

Why

We went through every screen, comparing what the server offers with what the interface shows, and the list was scary. Esc dropped the session and Android’s back button closed the app. Spending 3 keys on a legend asked for no confirmation. Equipping a piece depended on a tooltip that doesn’t exist on a phone. The order of skills on the bar was simply the order the code stored the data in. And creating an account went through four screens before you could play.

How it works

The title screen has Play and Training. Login remembers the user and submits with Enter. Anyone who already has a team goes straight to town with the last team used, and a new account goes through a wizard, “Your duo”: pick two classes, see the reaction they make together, adjust the look and land in town.

In town, the bottom bar has Sheet, Skills, Bag, Map, Agenda, Guild, Chat and Menu, with red dots when there’s something to do (points to spend, a chest ready to open, a free legend this week). In a room you get the skills, the two characters, Chat and Menu. Leaving the room moved to the Menu, with a confirmation, and a big “Back to town” button appears when the room ends. Only one panel is open at a time: Esc and the phone’s back button close whatever is open and, with nothing open, bring up the Menu. They never disconnect.

The Sheet has attributes with +1 and +5, tomes, ascension and equipment with the doll in the middle. Tapping a slot shows the pieces that fit, with the attribute difference in green and red. In Skills, the tree is grouped into learned, available and locked (with the reason), and you choose which ones go on the room bar and in what order. The Bag has tabs for items, equipment, chests and food, and tomes are used right from there, on any character in the team.

The Map shows the town: tap a portal or building and the character walks there, going around the houses. The Agenda gathers the Raid, the four legends (free or paid this week), the dungeon modifier, the keys and the stored chests. You can switch teams, edit, delete and create characters without leaving the game. Tapping someone in town opens a card with their team, guild and equipment, with Swap, Invite to party, Invite to guild and Report. Chat has tabs for Nearby, All, Party, Guild and System, with history.

We didn’t add a forced tutorial. Instead there’s a Manual with 13 short chapters (H key or Menu) and 17 tips that each show up once, at the right moment, with a “Learn more” that opens the chapter. Training is still the place to practice swaps and reactions.

Options include screen shake, damage numbers, language, shortcuts, the credits for the borrowed art and the game version, and the Star Shop shows the rates. Server notices now appear as a banner at the top of the screen instead of vanishing into chat.

Next step

Finger-sized buttons on the old panels and a crisp screen on phones.

Changes

  • feat(client): UI foundation for the interface phase

    UiRoot keeps one panel open at a time, a modal stack, toasts and the top status strip; Esc and the Android back button close the open modal, panel or chat and otherwise open the Menu, never disconnecting (quit_on_go_back off). UIPanel is the standard frame for new panels: 624x324 above the bar, title with a 32 px close button, tabs, scrolling content and touch-sized helpers. Old panels plug in through PanelAdapter. The bottom bar has eight city buttons (Character, Skills, Bag, Map, Agenda, Guild, Chat, Menu) with red badges computed from the bag view, and Chat and Menu in rooms; leaving a room moved to Menu with a confirmation, plus a big Back to town button when a room ends. Orbs in town show the lead character's real HP and MP; the inventory view now carries derived stats and active food. Notices are toasts too. C K B I M J G shortcuts, Q swaps, E only with --dev. Title screen with Play, Training and dev modes behind --dev; login remembers the username, submits on Enter, can show the password and validates locally; a returning account goes straight to town with its last team. A new login tells the old session it was replaced instead of it trying to reconnect, the reconnect overlay counts down and can give up, disconnects show a modal, and a paid legend attempt asks for confirmation before spending keys. Protocol 18.

  • feat(client): Character and Skills panels with a configurable room bar

    Character (C) replaces the old Team panel: an A/B selector for the two team members and three tabs. Status shows level and XP, tomes from the bag with Use 1 / Use 10 / Up to the gate, attribute points with +1/+5 and the next point's cost, derived stats and the ascension gate with its cost. Equipment puts the six slots around a large paper doll of the character; tapping a slot opens a drawer with the current piece and the bag pieces the class can wear, with the stat difference in green and red and Equip / Unequip buttons. Job shows job level, points and the second job choice behind a confirmation. Skills (K) lists the job tree grouped as learned, available and locked (with the reason), with Learn and +1 and their costs. The room bar at the bottom has six slots: tap an active skill, then a slot. The order is saved per character in user://skillbar.cfg and _active_skills() follows it, so the room bar and keys 1-6 match; free slots take the remaining skills in the old order. Both panels only look in a room. The armory view now carries affixes so the client can compute stat differences, the character badge also counts payable gates, and team_ui.gd is gone. tools/screenshot.gd opens any registered panel and takes --tab, --scroll and --set.

  • feat: Teams menu, duo wizard, player card and chat tabs

    Server: rq_switch_team swaps the active team in town without leaving it (same pid and position, city info and look re-sent, welcome_city plus inventory and a new teams_rpc reply). rq_leave_city drops the player out of town back to the account screens without disconnecting. rq_edit_team, rq_delete_team and rq_delete_character go through new AccountStore methods: a character in a team cannot be deleted and its gear is unequipped back to the account, the team in use cannot be deleted, and editing the team in use rebuilds the session in place. In town these reply with teams_rpc so the account screens do not pop up. The city static info now carries a player card (both characters with class, level and gear, plus the guild tag). Protocol 19. Client: Menu > Teams panel (TeamsPanel) lists the 3 teams and 6 characters with Play with this team, Edit, Delete and New character (leaves town, opens the creation screen and comes back with the same team). New accounts get the one-screen "Your duo" wizard: 5 class cards with role, weapon and elements, a strip with the reactions the pair makes, quick random looks and suggested names (role, elements and names live in data/classes.json), then create_character x2, create_team and enter_city. Tapping a player in town opens a card with their active character, partner, guild and gear and Trade, Party, Guild invite and Report. The chat has Near, All, Party, Guild and System tabs with 100 lines each, sends to the open tab, keeps /g /gu /p /denunciar, and moves to the top while typing on mobile. Tests: AccountStore edit/delete unit tests; loot_test switches to a second team, checks peer_chars, position and the guild tag on the card, refuses deleting the team in use, and leaves and re-enters town.

  • feat(client): manual, contextual hints, options and gacha rates

    Manual (Codex) with 13 chapters in data/manual.json, bilingual in the data (paragraphs, headings and tables in PT and EN). ManualPanel lists the chapters and opens each one with a back button; it opens from the Menu (city, room and training), the H key and the "Learn more" of every hint. Team and Elements chapters have Train now, which starts the offline Training only outside an online session. Hints: the 17 first-session triggers from the UX review plus one for Training, as a small card above the bar with Ok and Learn more, one at a time (queued), hidden while a panel or modal is open, and shown once per account (user://hints_<user>.cfg, "treino" offline). main.gd only forwards city, portal, room, sim events and the bag view. Options panel replaces the placeholder modal: interface scale (saved; disabled until the anchored canvas_items layout, since content_scale_factor under viewport stretch crops the HUD), screen shake and damage numbers (respected by main.gd), language (reloads outside a session, otherwise applies on next start), show hints again, the shortcut table, CREDITS.md rendered as text (already in every export include_filter) and version + protocol. application/config/version is now set and a test keeps it equal to the export presets. The star shop gets a Rates section read from data/gacha.json: 5 star 2%, guarantee at 30 per banner type, no 50/50, duplicates to fragments. tools/screenshot.gd can open manual/options through UiRoot, show the gacha rates and take --ui-scale.

  • feat(client): Bag, Map and Agenda panels

    Bag (BagPanel) replaces the old bag_ui: gold and keys in the title and four tabs. Items is a grid whose detail uses tomes on a team character, eats food or points to the Market; Gear lists every piece with who wears it or whether it sits in Storage; Chests shows cost, expiry and Open; Food shows the active dish and drink with time left plus food to eat. Map (MapPanel) draws the town from data/city.json with buildings, numbered portals (name, type, minimum level in the side list) and you. Tapping a destination closes the panel and walks there; CityState.route picks a straight line or a one or two point detour around buildings, covered by a test that walks to every portal and building from several starts. In a room it only shows a message. Agenda (AgendaPanel) reads the new Hub op agenda/view: incursion status, countdown, theme, chest, chests left and top 3; the four legends with minimum level and free this week or 3 keys; the weekly dungeon modifier; keys; pending chests. It replaces the incursion dump into chat. The Agenda badge counts an open incursion plus free legends the team can already enter, and the view is requested on entering town. Fixes the incursion never opening: open_days came from JSON as floats and Array.has(3) did not match 3.0. Armory view now says where a piece is stored and who wears it; chest views carry the chest id for Loc. screenshot.gd opens bag, map and agenda through UiRoot and takes --tab, --detail and --seed (fills the host account for prints).

← Back to the devlog