Add game mode categories, character creation, on-foot ship/hub mode, RAM currency, and in-ship navigation

Bundles several sessions' worth of previously uncommitted work: map
categories with Domination/Conquest/King of the Hill mode stubs and a
server-list mode filter; a procedurally-drawn character-creation screen
replacing the old callsign-only PROFILE overlay; the on-foot groundwork
(walkable station hub, ship interior, character controller) plus the RAM
currency backend; and today's addition, an in-ship Helldivers-2-style
navigation table that QUICK PLAY's queue/connect flow and the Belters/
Military hub travel now live behind, with hub-and-ship return paths and a
context-aware pause menu usable both in-match and inside the ship.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-19 12:30:22 -04:00
parent be5c41f82f
commit d3bed34c6c
124 changed files with 3347 additions and 159 deletions
+18 -1
View File
@@ -2,7 +2,7 @@ import enum
import uuid
from datetime import datetime
from sqlalchemy import DateTime, Float, ForeignKey, Integer, String
from sqlalchemy import BigInteger, DateTime, Float, ForeignKey, Integer, String
from sqlalchemy import Enum as SAEnum
from sqlalchemy.orm import Mapped, mapped_column, relationship
@@ -38,6 +38,13 @@ class Player(Base):
kills: Mapped[int] = mapped_column(Integer, default=0)
deaths: Mapped[int] = mapped_column(Integer, default=0)
hours_played: Mapped[float] = mapped_column(Float, default=0.0)
# In-game currency, see overview/onfoot.md -- named RAM, stored as a
# single integer count of kilobytes (the smallest denomination); the
# client formats it up into KB/MB/GB/TB (1000 per step, not 1024) for
# display. BigInteger since a long-lived player's total is expected to
# climb well past 32-bit Integer's ~2.1 billion ceiling (2.1 billion KB
# is only ~2.1 TB).
ram_kb: Mapped[int] = mapped_column(BigInteger, default=0)
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
@@ -57,6 +64,16 @@ class GameServer(Base):
# once that probe answers.
player_count: Mapped[int] = mapped_column(Integer, default=0)
max_players: Mapped[int] = mapped_column(Integer, default=50)
# The actual in-match GameMode id (e.g. "team_deathmatch") and map
# display name (e.g. "Sector Alpha") this server is running -- distinct
# from `mode` above, which is only the matchmaking queue mode ("casual").
# Plain strings, not a Mode-style enum: the set of GameMode ids lives in
# the Godot client (spacewar/world/game_modes/, world.gd's MAPS), which
# this API has no reason to duplicate/validate against. Reported by the
# hosting server on every register/heartbeat call (see
# spacewar/autoload/network_manager.gd's host_server()).
game_mode: Mapped[str] = mapped_column(String(64), default="team_deathmatch")
map_name: Mapped[str] = mapped_column(String(64), default="Sector Alpha")
class Match(Base):