一套能自己找到路的界面
我们重做了第一次打开游戏的玩家要走的路,从标题画面一直到第一个房间,底部栏也成了所有功能汇合的地方。之前,游戏有一半的内容只有知道去哪找的人才看得到。
为什么
我们把每个画面过了一遍,拿服务器能提供的东西和界面实际显示的东西对照,列出来的清单让人心惊。按 Esc 会让会话掉线,Android 的“返回”会直接关掉应用。花 3 把钥匙开一个传说不会要求确认。装备一件东西要靠 tooltip,而手机上根本没有 tooltip。技能栏里技能的顺序,只是代码存数据的顺序。创建账号还要先过四个画面才能开始玩。
怎么运作
标题画面有“开始游戏”和“训练”。登录会记住用户名,按 Enter 就能提交。已经有队伍的玩家,会带着上次用的队伍直接进入城镇;新账号则走一个叫“你的搭档”的向导:选两个职业,看它们一起能触发什么反应,调整外观,然后进入城镇。
在城镇里,底部栏有角色面板、技能、背包、地图、日程、公会、聊天和菜单,有事可做时会出现红点(有属性点可以分配、有宝箱可以开、本周有免费的传说)。在房间里,栏里是技能、两名角色、聊天和菜单。离开房间挪到了菜单里,需要确认;房间结束后会出现一个大按钮“返回城镇”。同一时间只开一个面板:Esc 和手机的返回键会关掉当前打开的面板,没有面板可关时则打开菜单,绝不会断开连接。
角色面板里有属性(带 +1 和 +5 按钮)、典籍、飞升,以及中间放着角色模型的装备栏。点一个栏位会列出能装的装备,属性差值用绿色和红色显示。在技能页,技能树按已学会、可学习、未解锁(附原因)分组,你可以选哪些技能放进房间里的技能栏,以及它们的顺序。背包有物品、装备、宝箱和食物几个标签页,典籍可以直接在这里对队伍里的任何角色使用。
地图显示城镇:点一个传送门或建筑,角色就会走过去,并绕开房屋。日程汇总了团队突袭、四个传说(本周免费还是付费)、地下城的词缀、钥匙和存着的宝箱。不退出游戏就可以切换队伍、编辑、删除和创建角色。在城镇里点别的玩家,会弹出一张名片,显示对方的队伍、公会和装备,带有“切换”“邀请入队”“邀请入会”和“举报”。聊天有“附近”“全部”“队伍”“公会”和“系统”几个标签页,并保留历史记录。
我们没有做强制教程,而是做了一本 13 章的简短手册(按 H 键或从菜单打开),外加 17 条提示,每条只在合适的时机出现一次,带一个“了解更多”,点开就是对应章节。训练仍然是练习切换和反应的地方。
设置里有屏幕震动、伤害数字、语言、快捷键、借用美术素材的署名,以及游戏版本;星辰商店会显示各项概率。服务器的提示现在显示为屏幕顶部的通知,不会再淹没在聊天里。
下一步
给旧面板换上手指大小的按钮,让手机上的画面清晰起来。
变更
- 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).