Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
7d6befe
Migrate build system to Ninja Multi-Config for VS 2026 compatibility
Seltraeh Apr 20, 2026
44b8fc9
Add unit MST cache, user_units migrations, and DB-seeded unit inventory
Seltraeh Apr 21, 2026
e96ac64
Add UnitMix, UnitSell, UnitEvo handlers; DB-backed userinfo; unit KDLs
Seltraeh Apr 24, 2026
da4a0d7
Add Town page support: facilities, locations, upgrade persistence
Seltraeh Apr 25, 2026
0a97334
Add quest infrastructure: world map, campaign subsystem, mission batt…
Seltraeh May 6, 2026
3625944
Update packet-generator submodule to packet-generator-quests
Seltraeh May 6, 2026
1c88b2b
Quest/Campaign playable end-to-end: PermitPlace category roles + Miss…
Seltraeh May 11, 2026
9fb8037
Cleanup: prune stale experiment narrative, replace placeholders with …
Seltraeh May 11, 2026
f58aba2
Import upstream PR #23: BadgeInfo response wrapper + ChallengeArenaRe…
Seltraeh May 13, 2026
22eeae1
Bump packet-generator submodule: PR #21 review fixes
Seltraeh May 13, 2026
be61a9b
Bump packet-generator submodule: MST hash audit (eb3de83)
Seltraeh May 13, 2026
2d586d6
Mission/MissionEnd: real energy cost, level-up, per-mission rewards
Seltraeh May 15, 2026
c864e87
Mission/Friend pass + MST porting + release build
Seltraeh May 18, 2026
fcfaa83
Rework release flow: portable standalone bundle instead of APPX
Seltraeh May 18, 2026
4d030cb
Remove rebuild_release.bat: APPX flow superseded by portable standalo…
Seltraeh Jul 2, 2026
7ab95a0
Merge origin/dev: adopt upstream helper architecture as base
Seltraeh Jul 2, 2026
ba0a41b
Post-merge fixes: archive codegen in CMake, struct-name drift, headle…
Seltraeh Jul 2, 2026
005d9c2
Merge origin/dev: archive-driven gacha summoning + user_info table re…
Seltraeh Jul 5, 2026
0533c17
Post-merge fixes: gacha data alignment, unbuffered boot logging
Seltraeh Jul 5, 2026
d61b63c
Items as mission-droppable + natural tutorial potion
Seltraeh Jul 5, 2026
2d0932f
Add tools/frida scaffold for client runtime debugging
Seltraeh Jul 5, 2026
d787cc2
Item ops, quest-map PermitPlace, mission archive hot-reload
Seltraeh Jul 17, 2026
fce7ad7
Add mission editor + MST-porting tooling
Seltraeh Jul 17, 2026
0687488
Untrack local dev tooling + docs for upstream PR
Seltraeh Jul 18, 2026
b9f7cd1
Address PR #28 review: drop hot-reload, guard migration uniqueness, c…
Seltraeh Jul 18, 2026
7293a39
PR #28: drop fork-only release staging; make debug CLI local-only
Seltraeh Jul 18, 2026
6029a1a
PR #28: CampaignBattleEnd archive-driven reward + getUserIdentity
Seltraeh Jul 18, 2026
1245e4e
PR #28: Campaign group — getUserIdentity via KDL request structs
Seltraeh Jul 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -479,8 +479,18 @@ Makefile
.ninja_log
*.ninja

deploy/
# Per-deploy state and large game assets stay untracked, but
# `deploy/system/*.json` (decoded MST data the server reads at boot)
# must be committed — without it, fresh checkouts can't run the server.
deploy/gme.sqlite
deploy/log/
deploy/game_content/
deploy/config.json
config.json

# IDA Pro audit tooling — kept off the public repo because the binary
# pseudocode dumps are private reverse-engineering artifacts.
tools/ida/
vcpkg_installed/
.idea
.vscode
Expand All @@ -490,3 +500,11 @@ generated/
# Project-specific
CONTEXT.md
out/

# Local dev tooling + docs — not for upstream
tools/
*.md

# Local-only debug CLI (dev tool, kept out of upstream)
standalone_frontend/DebugCli.cpp
standalone_frontend/DebugCli.hpp
75 changes: 75 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,82 @@ find_package(Drogon CONFIG REQUIRED)
find_package(unofficial-sqlite3 CONFIG REQUIRED)
find_package(glaze CONFIG REQUIRED) # c++ JSON abstraction

# glaze's vcpkg port pins /GL (whole-program opt) and /LTCG on its imported
# target for Release/MinSizeRel. Those flags propagate through gimuserver to
# every consumer, and MSVC's LTCG code-gen pass chokes on the coroutine
# HANDLEF bodies (UserInfo.cpp, GachaAction.cpp) with C4737 -> LNK1257.
# Drop the LTCG flags so Release links cleanly. We give up cross-TU inlining
# from glaze; the tradeoff is the build actually completing.
if (MSVC AND TARGET glaze::glaze)
set_property(TARGET glaze::glaze PROPERTY INTERFACE_COMPILE_OPTIONS
"/Zc:preprocessor;/permissive-;/Zc:lambda")
set_property(TARGET glaze::glaze PROPERTY INTERFACE_LINK_OPTIONS
"$<$<CONFIG:Release>:/INCREMENTAL:NO>;$<$<CONFIG:MinSizeRel>:/INCREMENTAL:NO>")
endif()

add_subdirectory(packet-generator/assets/runtime/cpp)

# KDL -> C++ codegen. The packet-generator Rust CLI compiles assets/all.kdl
# into a single flat header (all.hpp) that gimuserver includes. The first
# build compiles the Rust generator itself (one-time, a few minutes); every
# subsequent build only re-runs it when a .kdl file has changed.
find_program(CARGO_EXECUTABLE cargo
DOC "Rust/Cargo toolchain, required to build packet-generator"
)
if (NOT CARGO_EXECUTABLE)
message(FATAL_ERROR
"cargo not found on PATH. Install Rust from https://rustup.rs/ "
"and re-run CMake configure."
)
endif()

set(PKGEN_SRC_DIR "${CMAKE_SOURCE_DIR}/packet-generator")
set(PKGEN_ENTRY "assets/all.kdl")
# App.hpp includes <gimuserver/packets/all.hpp>, so emit directly into the
# source tree under gimuserver/packets/. That directory has a .gitignore
# (*.hpp) that keeps the generated header out of version control.
set(PKGEN_OUT_DIR "${CMAKE_SOURCE_DIR}/gimuserver/packets")
set(PKGEN_OUT_HEADER "${PKGEN_OUT_DIR}/all.hpp")

file(GLOB_RECURSE KDL_SCHEMAS CONFIGURE_DEPENDS
"${PKGEN_SRC_DIR}/assets/*.kdl"
)

file(MAKE_DIRECTORY "${PKGEN_OUT_DIR}")

# The archive schema (assets/archive.kdl) generates a second header consumed
# by gimuserver/archive/*Archiver; gimuserver/archive/.gitignore keeps it out
# of version control just like packets/all.hpp.
set(PKGEN_ARCHIVE_ENTRY "assets/archive.kdl")
set(PKGEN_ARCHIVE_OUT_DIR "${CMAKE_SOURCE_DIR}/gimuserver/archive")
set(PKGEN_ARCHIVE_OUT_HEADER "${PKGEN_ARCHIVE_OUT_DIR}/archive.hpp")

add_custom_command(
OUTPUT "${PKGEN_OUT_HEADER}" "${PKGEN_ARCHIVE_OUT_HEADER}"
COMMAND "${CARGO_EXECUTABLE}" run --release --
generate --cxx --glaze
-i "${PKGEN_ENTRY}"
-o "${PKGEN_OUT_DIR}"
COMMAND "${CARGO_EXECUTABLE}" run --release --
generate --cxx --glaze
-i "${PKGEN_ARCHIVE_ENTRY}"
-o "${PKGEN_ARCHIVE_OUT_DIR}"
WORKING_DIRECTORY "${PKGEN_SRC_DIR}"
DEPENDS ${KDL_SCHEMAS}
COMMENT "Regenerating C++ packet headers from KDL schemas"
VERBATIM
)

add_custom_target(pkgen_generate ALL
DEPENDS "${PKGEN_OUT_HEADER}" "${PKGEN_ARCHIVE_OUT_HEADER}"
SOURCES ${KDL_SCHEMAS}
)

message(STATUS
"packet-generator: first build compiles the Rust generator (~2-5 min); "
"subsequent builds only re-run it when .kdl files change."
)

add_subdirectory(gimuserver)

if (STANDALONE)
Expand Down
52 changes: 42 additions & 10 deletions CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
{
"name": "default-debug",
"displayName": "Config Debug",
"description": "General default debug configuration",
"description": "General default debug configuration (single-config generators only)",
"inherits": "default-base",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
Expand All @@ -26,7 +26,7 @@
{
"name": "default-release",
"displayName": "Config Release",
"description": "General default release configuration",
"description": "General default release configuration (single-config generators only)",
"inherits": "default-base",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "RelWithDebInfo"
Expand All @@ -35,10 +35,11 @@
},
{
"name": "debug-win64",
"displayName": "Development config for Windows (64-bit)",
"inherits": "default-debug",
"generator": "Visual Studio 17 2022",
"architecture": "x64",
"displayName": "Development config for Windows (Ninja Multi-Config)",
"description": "Multi-config (Debug + Release) build for Windows x64. Must be run from an x64 Native Tools environment (VsDevCmd.bat -arch=amd64 -host_arch=amd64) so the x64-hosted cl.exe is on PATH. Do NOT set CMAKE_C/CXX_COMPILER here — let CMake find the compiler from the environment so it inherits the correct host/target architecture.",
"inherits": "default-base",
"generator": "Ninja Multi-Config",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
Expand Down Expand Up @@ -78,10 +79,15 @@
},
{
"name": "release-win32",
"displayName": "Deployment for Brave Frontier for Windows",
"inherits": "default-release",
"generator": "Visual Studio 17 2022",
"architecture": "x64",
"displayName": "Deployment for Brave Frontier for Windows (APPX)",
"description": "Multi-config build producing the APPX-embedded server. Requires running from a Developer Command Prompt for Visual Studio.",
"inherits": "default-base",
"generator": "Ninja Multi-Config",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"architecture": {
"value": "x64",
"strategy": "external"
},
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
Expand All @@ -98,5 +104,31 @@
}
}
}
],
"buildPresets": [
{
"name": "debug-win64-debug",
"configurePreset": "debug-win64",
"configuration": "Debug"
},
{
"name": "debug-win64-release",
"configurePreset": "debug-win64",
"configuration": "Release"
},
{
"name": "release-win32-debug",
"configurePreset": "release-win32",
"configuration": "Debug"
},
{
"name": "release-win32-release",
"configurePreset": "release-win32",
"configuration": "Release"
},
{
"name": "debug-lnx64",
"configurePreset": "debug-lnx64"
}
]
}
5 changes: 4 additions & 1 deletion deploy/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,10 @@
"initial_free_gems": 5,
"initial_zel": 10000000,
"initial_karma": 10000000,
"initial_bcoins": 0
"initial_bcoins": 0,
// Client render-loop cap delivered to the offline-proxy via
// GET /offline_mod/fps_cap. 0 disables the client-side cap.
"fps_cap": 60
}
}
}
Expand Down
Loading