From 7538411d807a190060324158e10d542deb8d70e8 Mon Sep 17 00:00:00 2001 From: tashcan Date: Thu, 15 Oct 2026 16:40:42 -0700 Subject: [PATCH] Move sources under src Features, game bindings and sync move into their domain directories, reusable libraries under src/libs, entry points under src/platform, and the Swift launcher under src/launcher. User guides and examples move under docs. Includes, build source paths, embedded assets and packaging paths move together. Implementations and dependency versions are unchanged. --- .github/workflows/ci.yaml | 8 ++-- AGENTS.md | 12 ++--- README.md | 6 +-- create-contrib.sh | 2 - docs/FASTER_QUEUE_RECOVERY.md | 2 +- FEATURES.md => docs/FEATURES.md | 4 +- INSTALL.md => docs/INSTALL.md | 0 KEYMAPPING.md => docs/KEYMAPPING.md | 0 docs/VERSION_SUBSTITUTION.md | 18 +++---- .../example_community_patch_settings.toml | 16 +++++++ .../example_community_patch_settings_da.toml | 0 .../example_community_patch_settings_de.toml | 0 ...munity_patch_settings_en-GB-x-cockney.toml | 0 ...mmunity_patch_settings_en-x-minionese.toml | 0 .../example_community_patch_settings_en.toml | 0 .../example_community_patch_settings_es.toml | 0 .../example_community_patch_settings_fr.toml | 0 .../example_community_patch_settings_nl.toml | 0 .../example_community_patch_settings_ru.toml | 0 .../example_community_patch_settings_tlh.toml | 0 example_community_patch_settings.toml | 16 ------- macos-launcher/src/launcher.icns | Bin 109899 -> 0 bytes scripts/check-il2cpp-dump.py | 5 +- scripts/create-mac-dmg.sh | 2 +- scripts/mac-build-test-debug.sh | 2 +- scripts/stamp-version-hash.py | 2 +- scripts/validate-example-configs.py | 2 +- scripts/verify_version_substitution.py | 8 ++-- .../launcher/macos}/ActionView.swift | 0 .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../macos}/Assets.xcassets/Contents.json | 0 .../lcarLightOrange.colorset/Contents.json | 0 .../lcarOrange.colorset/Contents.json | 0 .../lcarPink.colorset/Contents.json | 0 .../lcarPlum.colorset/Contents.json | 0 .../lcarTan.colorset/Contents.json | 0 .../lcarViolet.colorset/Contents.json | 0 .../lcarWhite.colorset/Contents.json | 0 .../ufp-logo.imageset/Contents.json | 0 .../ufp-logo.imageset/ufp-logo.png | Bin .../launcher/macos}/ContentView.swift | 0 .../launcher/macos}/Info.plist.template | 0 .../launcher/macos}/LauncherMain.swift | 0 .../launcher/macos}/PatchEntitlements.swift | 0 .../launcher/macos}/TemporaryFolderURL.swift | 0 .../macos}/UpdaterFileOperations.swift | 0 .../launcher/macos}/XsollaLib.swift | 0 .../src => src/launcher/macos}/ini.swift | 0 .../macos}/macOSLauncher.entitlements | 0 .../launcher/macos}/module.modulemap | 2 +- .../src => src/launcher/macos}/rsync.cc | 0 .../src => src/launcher/macos}/rsync.h | 0 .../src => src/launcher/macos}/rsync.swift | 0 .../launcher/macos}/xmake.lua | 24 +++++----- {libs => src/libs}/il2cpp/GameAssembly.lib | Bin .../libs}/il2cpp/include/il2cpp/api.h | 0 .../libs}/il2cpp/include/il2cpp/hook.h | 0 .../libs}/il2cpp/include/il2cpp/il2cpp.h | 0 .../il2cpp/include/il2cpp/method_contract.h | 0 {libs => src/libs}/il2cpp/src/api.cc | 0 {libs => src/libs}/il2cpp/src/il2cpp.cc | 0 {libs => src/libs}/il2cpp/xmake.lua | 0 {libs => src/libs}/unity/include/unity/core.h | 0 .../libs}/unity/include/unity/input.h | 0 .../libs}/unity/include/unity/tracker.h | 0 {libs => src/libs}/unity/include/unity/ui.h | 0 {libs => src/libs}/unity/src/input.cc | 0 {libs => src/libs}/unity/src/tracker.cc | 0 {libs => src/libs}/unity/xmake.lua | 0 {mods/src => src/mod}/config.cc | 6 +-- {mods/src => src/mod}/config.h | 4 +- .../mod/features}/action_queue.cc | 4 +- .../parts => src/mod/features}/action_queue.h | 0 .../mod/features}/action_queue_guard_policy.h | 0 .../mod/features}/alliance_store.cc | 8 ++-- .../mod/features/anomaly_timer.cc | 8 ++-- .../mod/features/audio.cc | 6 +-- .../mod/features/buffs.cc | 4 +- .../zoom.cc => src/mod/features/camera.cc | 10 ++-- .../parts => src/mod/features}/cargo.cc | 6 +-- .../parts => src/mod/features}/chat.cc | 12 ++--- .../mod/features}/chat_startup.h | 0 .../parts => src/mod/features}/chat_titles.cc | 6 +-- .../mod/features/dock.cc | 8 ++-- .../mod/features}/double_click_assign_ship.h | 2 +- .../patches.h => src/mod/features/features.h | 5 +- .../mod/features/fleet_actions.cc | 14 +++--- .../mod/features}/fleet_labels.cc | 4 +- .../mod/features/forbidden_tech.cc | 4 +- .../mod/features}/forbidden_tech_ship_name.cc | 8 ++-- .../parts => src/mod/features}/game_config.cc | 4 +- .../parts => src/mod/features}/haven.cc | 4 +- .../parts => src/mod/features}/hotkeys.cc | 8 ++-- .../mod/features}/instant_warp.cc | 12 ++--- .../mod/features}/interior_zoom.cc | 6 +-- .../mod/features/keybind_badges.cc | 12 ++--- .../mod/features/loading_screens.cc | 6 +-- .../mod/features/missions.cc | 8 ++-- .../mod/features}/notification_audio.cc | 4 +- .../mod/features}/notification_audio.h | 0 .../mod/features}/notification_audio_mac.mm | 0 .../mod/features/officers.cc | 6 +-- .../mod/features}/pinned_ship_click.cc | 8 ++-- .../mod/features}/pinned_ship_click.h | 2 +- .../mod/features}/queue_address_guard.cc | 6 +-- .../features}/queue_address_guard_policy.h | 0 .../mod/features}/reveal_confirmation.cc | 6 +-- .../parts => src/mod/features}/screens.cc | 18 +++---- .../mod/features}/ship_shortcut_hint.h | 0 .../mod/features}/ship_tile_click.cc | 2 +- .../mod/features}/ship_tile_click.h | 0 .../mod/features/shop.cc | 4 +- .../mod/features}/thin_queue_protection.cc | 6 +-- .../parts => src/mod/features}/toast_text.h | 0 .../parts => src/mod/features}/toasts.cc | 12 ++--- .../mod/features}/tracked_objects.cc | 16 +++---- .../parts => src/mod/features}/ui_scale.cc | 8 ++-- .../parts => src/mod/features}/window.cc | 4 +- {mods/src => src/mod}/file.cc | 0 {mods/src => src/mod}/file.h | 0 {mods/src => src/mod}/file_macos.mm | 0 mods/src/prime/Hub.h => src/mod/game/app.h | 0 {mods/src/prime => src/mod/game}/chat.h | 2 +- {mods/src/prime => src/mod/game}/fleet.h | 6 +-- {mods/src/prime => src/mod/game}/haven.h | 2 +- {mods/src/prime => src/mod/game}/hud.h | 2 +- {mods/src/prime => src/mod/game}/inventory.h | 4 +- {mods/src/prime => src/mod/game}/loading.h | 2 +- {mods/src/prime => src/mod/game}/missions.h | 2 +- .../mod/game}/native_hook_extent.cc | 2 +- .../mod/game}/native_hook_extent.h | 0 {mods/src/prime => src/mod/game}/navigation.h | 6 +-- {mods/src/prime => src/mod/game}/officers.h | 2 +- .../proto/Digit.Client.Localization.proto | 0 .../game}/proto/Digit.Client.SaveSystem.proto | 0 .../game}/proto/Digit.Engine.Attributes.proto | 0 .../game}/proto/Digit.Networking.Core.proto | 0 .../game}/proto/Digit.Platform.Models.proto | 0 .../game}/proto/Digit.Prime.Bookmarks.proto | 0 .../game}/proto/Digit.Prime.Inventories.proto | 0 .../game}/proto/Digit.Prime.Missions.proto | 0 .../game}/proto/Digit.Prime.NewFlags.proto | 0 .../proto/Digit.Prime.PersistentPrefs.proto | 0 .../proto/Digit.Prime.TerritoryCapture.proto | 0 .../proto/Digit.PrimePlatform.Content.proto | 0 .../proto/Digit.PrimePlatform.Models.proto | 0 .../proto/Digit.PrimeServer.Models.proto | 0 .../prime => src/mod/game}/proto/stfc.proto | 0 .../mod/game}/proto/stfc.sync.proto | 0 {mods/src/prime => src/mod/game}/queues.h | 6 +-- {mods/src/prime => src/mod/game}/server.h | 0 {mods/src/prime => src/mod/game}/ui.h | 0 {mods/src/prime => src/mod/game}/viewers.h | 6 +-- mods/src/patches/patches.cc => src/mod/mod.cc | 4 +- {mods/src => src/mod}/mod.h | 0 .../patches/parts/embedded_cc_logo_image.h | 0 .../patches/parts/embedded_loading_image.h | 0 .../mod}/patches/parts/embedded_logo_image.h | 0 {mods/src/patches => src/mod}/shortcuts.cc | 4 +- {mods/src => src/mod}/shortcuts.def | 0 {mods/src/patches => src/mod}/shortcuts.h | 0 .../parts => src/mod}/sync/battlelogs.cc | 2 +- .../patches => src/mod/sync}/fleet_watch.cc | 4 +- .../patches => src/mod/sync}/fleet_watch.h | 2 +- .../patches/parts => src/mod}/sync/fleets.cc | 6 +-- .../patches/parts => src/mod}/sync/records.cc | 4 +- .../patches/parts => src/mod}/sync/state.cc | 2 +- .../patches/parts => src/mod}/sync/sync.cc | 10 ++-- .../src/patches/parts => src/mod}/sync/sync.h | 2 +- .../patches/parts => src/mod}/sync/upload.cc | 2 +- mods/src/str_utils.h => src/mod/text.h | 0 {mods/src => src/mod}/version.h | 0 {mods => src/mod}/xmake.lua | 14 +++--- .../src => src/platform/macos/dylib}/main.cc | 0 .../platform/macos/dylib}/xmake.lua | 2 +- .../platform/macos/loader}/library_dir.mm | 0 .../src => src/platform/macos/loader}/main.cc | 0 .../platform/macos/loader}/xmake.lua | 6 +-- .../src => src/platform/windows}/main.cc | 0 .../src => src/platform/windows}/version.cc | 0 .../src => src/platform/windows}/version.def | 0 .../src => src/platform/windows}/version.rc | 0 .../platform/windows}/xmake.lua | 6 +-- tests/action_queue.cc | 2 +- tests/mod_logic.cc | 10 ++-- tests/queue_address_guard.cc | 2 +- tests/run-action-queue.ps1 | 6 +-- tests/sync_logic.cc | 2 +- tests/thin_queue_protection.cc | 2 +- tests/unity_tracker.cc | 2 +- xmake.lua | 44 +++++++++--------- 192 files changed, 295 insertions(+), 299 deletions(-) delete mode 100644 create-contrib.sh rename FEATURES.md => docs/FEATURES.md (99%) rename INSTALL.md => docs/INSTALL.md (100%) rename KEYMAPPING.md => docs/KEYMAPPING.md (100%) create mode 100644 docs/configuration/example_community_patch_settings.toml rename example_community_patch_settings_da.toml => docs/configuration/example_community_patch_settings_da.toml (100%) rename example_community_patch_settings_de.toml => docs/configuration/example_community_patch_settings_de.toml (100%) rename example_community_patch_settings_en-GB-x-cockney.toml => docs/configuration/example_community_patch_settings_en-GB-x-cockney.toml (100%) rename example_community_patch_settings_en-x-minionese.toml => docs/configuration/example_community_patch_settings_en-x-minionese.toml (100%) rename example_community_patch_settings_en.toml => docs/configuration/example_community_patch_settings_en.toml (100%) rename example_community_patch_settings_es.toml => docs/configuration/example_community_patch_settings_es.toml (100%) rename example_community_patch_settings_fr.toml => docs/configuration/example_community_patch_settings_fr.toml (100%) rename example_community_patch_settings_nl.toml => docs/configuration/example_community_patch_settings_nl.toml (100%) rename example_community_patch_settings_ru.toml => docs/configuration/example_community_patch_settings_ru.toml (100%) rename example_community_patch_settings_tlh.toml => docs/configuration/example_community_patch_settings_tlh.toml (100%) delete mode 100644 example_community_patch_settings.toml delete mode 100644 macos-launcher/src/launcher.icns rename {macos-launcher/src => src/launcher/macos}/ActionView.swift (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/Contents.json (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/lcarLightOrange.colorset/Contents.json (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/lcarOrange.colorset/Contents.json (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/lcarPink.colorset/Contents.json (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/lcarPlum.colorset/Contents.json (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/lcarTan.colorset/Contents.json (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/lcarViolet.colorset/Contents.json (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/lcarWhite.colorset/Contents.json (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/ufp-logo.imageset/Contents.json (100%) rename {macos-launcher/src => src/launcher/macos}/Assets.xcassets/ufp-logo.imageset/ufp-logo.png (100%) rename {macos-launcher/src => src/launcher/macos}/ContentView.swift (100%) rename {macos-launcher/src => src/launcher/macos}/Info.plist.template (100%) rename {macos-launcher/src => src/launcher/macos}/LauncherMain.swift (100%) rename {macos-launcher/src => src/launcher/macos}/PatchEntitlements.swift (100%) rename {macos-launcher/src => src/launcher/macos}/TemporaryFolderURL.swift (100%) rename {macos-launcher/src => src/launcher/macos}/UpdaterFileOperations.swift (100%) rename {macos-launcher/src => src/launcher/macos}/XsollaLib.swift (100%) rename {macos-launcher/src => src/launcher/macos}/ini.swift (100%) rename {macos-launcher/src => src/launcher/macos}/macOSLauncher.entitlements (100%) rename {macos-launcher/src => src/launcher/macos}/module.modulemap (58%) rename {macos-launcher/src => src/launcher/macos}/rsync.cc (100%) rename {macos-launcher/src => src/launcher/macos}/rsync.h (100%) rename {macos-launcher/src => src/launcher/macos}/rsync.swift (100%) rename {macos-launcher => src/launcher/macos}/xmake.lua (84%) rename {libs => src/libs}/il2cpp/GameAssembly.lib (100%) rename {libs => src/libs}/il2cpp/include/il2cpp/api.h (100%) rename {libs => src/libs}/il2cpp/include/il2cpp/hook.h (100%) rename {libs => src/libs}/il2cpp/include/il2cpp/il2cpp.h (100%) rename {libs => src/libs}/il2cpp/include/il2cpp/method_contract.h (100%) rename {libs => src/libs}/il2cpp/src/api.cc (100%) rename {libs => src/libs}/il2cpp/src/il2cpp.cc (100%) rename {libs => src/libs}/il2cpp/xmake.lua (100%) rename {libs => src/libs}/unity/include/unity/core.h (100%) rename {libs => src/libs}/unity/include/unity/input.h (100%) rename {libs => src/libs}/unity/include/unity/tracker.h (100%) rename {libs => src/libs}/unity/include/unity/ui.h (100%) rename {libs => src/libs}/unity/src/input.cc (100%) rename {libs => src/libs}/unity/src/tracker.cc (100%) rename {libs => src/libs}/unity/xmake.lua (100%) rename {mods/src => src/mod}/config.cc (99%) rename {mods/src => src/mod}/config.h (99%) rename {mods/src/patches/parts => src/mod/features}/action_queue.cc (99%) rename {mods/src/patches/parts => src/mod/features}/action_queue.h (100%) rename {mods/src/patches => src/mod/features}/action_queue_guard_policy.h (100%) rename {mods/src/patches/parts => src/mod/features}/alliance_store.cc (99%) rename mods/src/patches/parts/galactic_anomaly_timer.cc => src/mod/features/anomaly_timer.cc (98%) rename mods/src/patches/parts/audio_events.cc => src/mod/features/audio.cc (96%) rename mods/src/patches/parts/buff_fixes.cc => src/mod/features/buffs.cc (97%) rename mods/src/patches/parts/zoom.cc => src/mod/features/camera.cc (99%) rename {mods/src/patches/parts => src/mod/features}/cargo.cc (97%) rename {mods/src/patches/parts => src/mod/features}/chat.cc (98%) rename {mods/src/patches => src/mod/features}/chat_startup.h (100%) rename {mods/src/patches/parts => src/mod/features}/chat_titles.cc (98%) rename mods/src/patches/parts/double_click_assign_ship.cc => src/mod/features/dock.cc (98%) rename {mods/src/patches/parts => src/mod/features}/double_click_assign_ship.h (80%) rename mods/src/patches/patches.h => src/mod/features/features.h (99%) rename mods/src/patches/parts/space_actions.cc => src/mod/features/fleet_actions.cc (99%) rename {mods/src/patches/parts => src/mod/features}/fleet_labels.cc (99%) rename mods/src/patches/parts/forbidden_tech_confirmation.cc => src/mod/features/forbidden_tech.cc (98%) rename {mods/src/patches/parts => src/mod/features}/forbidden_tech_ship_name.cc (98%) rename {mods/src/patches/parts => src/mod/features}/game_config.cc (94%) rename {mods/src/patches/parts => src/mod/features}/haven.cc (99%) rename {mods/src/patches/parts => src/mod/features}/hotkeys.cc (98%) rename {mods/src/patches/parts => src/mod/features}/instant_warp.cc (97%) rename {mods/src/patches/parts => src/mod/features}/interior_zoom.cc (98%) rename mods/src/patches/parts/shortcut_hints.cc => src/mod/features/keybind_badges.cc (97%) rename mods/src/patches/parts/loading_screen.cc => src/mod/features/loading_screens.cc (99%) rename mods/src/patches/parts/daily_faction_bulk_claim.cc => src/mod/features/missions.cc (98%) rename {mods/src/patches/parts => src/mod/features}/notification_audio.cc (98%) rename {mods/src/patches/parts => src/mod/features}/notification_audio.h (100%) rename {mods/src/patches/parts => src/mod/features}/notification_audio_mac.mm (100%) rename mods/src/patches/parts/officer_sort.cc => src/mod/features/officers.cc (98%) rename {mods/src/patches/parts => src/mod/features}/pinned_ship_click.cc (97%) rename {mods/src/patches/parts => src/mod/features}/pinned_ship_click.h (73%) rename {mods/src/patches/parts => src/mod/features}/queue_address_guard.cc (97%) rename {mods/src/patches => src/mod/features}/queue_address_guard_policy.h (100%) rename {mods/src/patches/parts => src/mod/features}/reveal_confirmation.cc (95%) rename {mods/src/patches/parts => src/mod/features}/screens.cc (98%) rename {mods/src/patches => src/mod/features}/ship_shortcut_hint.h (100%) rename {mods/src/patches/parts => src/mod/features}/ship_tile_click.cc (97%) rename {mods/src/patches/parts => src/mod/features}/ship_tile_click.h (100%) rename mods/src/patches/parts/open_bulk_claim_gifts.cc => src/mod/features/shop.cc (99%) rename {mods/src/patches/parts => src/mod/features}/thin_queue_protection.cc (98%) rename {mods/src/patches/parts => src/mod/features}/toast_text.h (100%) rename {mods/src/patches/parts => src/mod/features}/toasts.cc (99%) rename {mods/src/patches/parts => src/mod/features}/tracked_objects.cc (86%) rename {mods/src/patches/parts => src/mod/features}/ui_scale.cc (97%) rename {mods/src/patches/parts => src/mod/features}/window.cc (98%) rename {mods/src => src/mod}/file.cc (100%) rename {mods/src => src/mod}/file.h (100%) rename {mods/src => src/mod}/file_macos.mm (100%) rename mods/src/prime/Hub.h => src/mod/game/app.h (100%) rename {mods/src/prime => src/mod/game}/chat.h (99%) rename {mods/src/prime => src/mod/game}/fleet.h (99%) rename {mods/src/prime => src/mod/game}/haven.h (99%) rename {mods/src/prime => src/mod/game}/hud.h (99%) rename {mods/src/prime => src/mod/game}/inventory.h (99%) rename {mods/src/prime => src/mod/game}/loading.h (98%) rename {mods/src/prime => src/mod/game}/missions.h (96%) rename {mods/src/patches => src/mod/game}/native_hook_extent.cc (99%) rename {mods/src/patches => src/mod/game}/native_hook_extent.h (100%) rename {mods/src/prime => src/mod/game}/navigation.h (99%) rename {mods/src/prime => src/mod/game}/officers.h (99%) rename {mods/src/prime => src/mod/game}/proto/Digit.Client.Localization.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.Client.SaveSystem.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.Engine.Attributes.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.Networking.Core.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.Platform.Models.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.Prime.Bookmarks.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.Prime.Inventories.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.Prime.Missions.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.Prime.NewFlags.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.Prime.PersistentPrefs.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.Prime.TerritoryCapture.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.PrimePlatform.Content.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.PrimePlatform.Models.proto (100%) rename {mods/src/prime => src/mod/game}/proto/Digit.PrimeServer.Models.proto (100%) rename {mods/src/prime => src/mod/game}/proto/stfc.proto (100%) rename {mods/src/prime => src/mod/game}/proto/stfc.sync.proto (100%) rename {mods/src/prime => src/mod/game}/queues.h (99%) rename {mods/src/prime => src/mod/game}/server.h (100%) rename {mods/src/prime => src/mod/game}/ui.h (100%) rename {mods/src/prime => src/mod/game}/viewers.h (98%) rename mods/src/patches/patches.cc => src/mod/mod.cc (99%) rename {mods/src => src/mod}/mod.h (100%) rename {mods/src => src/mod}/patches/parts/embedded_cc_logo_image.h (100%) rename {mods/src => src/mod}/patches/parts/embedded_loading_image.h (100%) rename {mods/src => src/mod}/patches/parts/embedded_logo_image.h (100%) rename {mods/src/patches => src/mod}/shortcuts.cc (99%) rename {mods/src => src/mod}/shortcuts.def (100%) rename {mods/src/patches => src/mod}/shortcuts.h (100%) rename {mods/src/patches/parts => src/mod}/sync/battlelogs.cc (99%) rename {mods/src/patches => src/mod/sync}/fleet_watch.cc (99%) rename {mods/src/patches => src/mod/sync}/fleet_watch.h (98%) rename {mods/src/patches/parts => src/mod}/sync/fleets.cc (99%) rename {mods/src/patches/parts => src/mod}/sync/records.cc (99%) rename {mods/src/patches/parts => src/mod}/sync/state.cc (99%) rename {mods/src/patches/parts => src/mod}/sync/sync.cc (98%) rename {mods/src/patches/parts => src/mod}/sync/sync.h (99%) rename {mods/src/patches/parts => src/mod}/sync/upload.cc (99%) rename mods/src/str_utils.h => src/mod/text.h (100%) rename {mods/src => src/mod}/version.h (100%) rename {mods => src/mod}/xmake.lua (92%) rename {macos-dylib/src => src/platform/macos/dylib}/main.cc (100%) rename {macos-dylib => src/platform/macos/dylib}/xmake.lua (85%) rename {macos-loader/src => src/platform/macos/loader}/library_dir.mm (100%) rename {macos-loader/src => src/platform/macos/loader}/main.cc (100%) rename {macos-loader => src/platform/macos/loader}/xmake.lua (61%) rename {win-proxy-dll/src => src/platform/windows}/main.cc (100%) rename {win-proxy-dll/src => src/platform/windows}/version.cc (100%) rename {win-proxy-dll/src => src/platform/windows}/version.def (100%) rename {win-proxy-dll/src => src/platform/windows}/version.rc (100%) rename {win-proxy-dll => src/platform/windows}/xmake.lua (81%) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 450d941ee..6fa6d1ec9 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -383,7 +383,7 @@ jobs: - name: Set protobuf compiler cache identity shell: bash run: | - echo "SCCACHE_C_CUSTOM_CACHE_BUSTER=stfc-protobuf-${{ env.PROTOBUF_SCCACHE_SCHEMA }}-xmake-${{ env.XMAKE_VERSION }}-macos-${{ matrix.arch }}-release-${{ env.MACOSX_DEPLOYMENT_TARGET }}-${{ hashFiles('mods/src/prime/proto/*.proto', 'mods/xmake.lua', 'xmake.lua', 'xmake-requires.lock', 'xmake/dependencies/common.lua', 'xmake/dependencies/macos.lua', 'xmake/rules/protobuf_sccache.lua') }}" >> "$GITHUB_ENV" + echo "SCCACHE_C_CUSTOM_CACHE_BUSTER=stfc-protobuf-${{ env.PROTOBUF_SCCACHE_SCHEMA }}-xmake-${{ env.XMAKE_VERSION }}-macos-${{ matrix.arch }}-release-${{ env.MACOSX_DEPLOYMENT_TARGET }}-${{ hashFiles('src/mod/prime/proto/*.proto', 'src/mod/xmake.lua', 'xmake.lua', 'xmake-requires.lock', 'xmake/dependencies/common.lua', 'xmake/dependencies/macos.lua', 'xmake/rules/protobuf_sccache.lua') }}" >> "$GITHUB_ENV" - name: Locate XMake caches id: xmake_cache_paths @@ -434,7 +434,7 @@ jobs: uses: actions/cache/restore@v6 with: path: build/.swift-module-cache - key: macos-${{ matrix.arch }}-release-swift-modules-${{ env.SWIFT_MODULE_CACHE_SCHEMA }}-${{ env.MACOSX_DEPLOYMENT_TARGET }}-${{ steps.swift_toolchain.outputs.hash }}-${{ steps.xmake_cache_paths.outputs.plzma_sha }}-${{ hashFiles('macos-launcher/xmake.lua', 'macos-launcher/src/module.modulemap', 'xmake/dependencies/macos.lua', 'xmake-requires.lock', 'xmake-packages/packages/p/PLzmaSDK/**') }} + key: macos-${{ matrix.arch }}-release-swift-modules-${{ env.SWIFT_MODULE_CACHE_SCHEMA }}-${{ env.MACOSX_DEPLOYMENT_TARGET }}-${{ steps.swift_toolchain.outputs.hash }}-${{ steps.xmake_cache_paths.outputs.plzma_sha }}-${{ hashFiles('src/launcher/macos/xmake.lua', 'src/launcher/macos/module.modulemap', 'xmake/dependencies/macos.lua', 'xmake-requires.lock', 'xmake-packages/packages/p/PLzmaSDK/**') }} - name: Restore XMake compiler cache id: restore_build @@ -568,9 +568,9 @@ jobs: test -f build/macosx/arm64/release/macOSLauncher test -f "$APP/Contents/Resources/Assets.car" - test -f macos-launcher/src/Info.plist + test -f src/launcher/macos/Info.plist - cp macos-launcher/src/Info.plist \ + cp src/launcher/macos/Info.plist \ "$APP/Contents/Info.plist" test -f "$APP/Contents/Info.plist" diff --git a/AGENTS.md b/AGENTS.md index 8010ba825..2669b3627 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -58,7 +58,7 @@ Delete the `build/` folder to reset. Also delete `.vs/` for a full Visual Studio ### Source Layout -- **`mods/src/`** — Core mod code (the main codebase) +- **`src/mod/`** — Core mod code (the main codebase) - `config.h/.cc` — Singleton `Config` class, loads TOML settings, controls which patches are enabled - `patches/patches.cc` — Entry point: hooks `il2cpp_init`, then conditionally installs each patch - `patches/parts/` — Individual patch implementations (zoom, hotkeys, chat, UI scale, sync, etc.) @@ -66,9 +66,9 @@ Delete the `build/` folder to reset. Also delete `.vs/` for a full Visual Studio - `prime/` — Header-only IL2CPP type definitions mirroring the game's C# classes - `prime/proto/` — Protobuf definitions for game data sync - `il2cpp/` — IL2CPP helper functions for resolving methods, classes, and icalls at runtime -- **`win-proxy-dll/src/`** — Windows DLL proxy entry point -- **`macos-dylib/src/`** — macOS dylib entry point -- **`macos-loader/src/`** — macOS loader (finds game, injects dylib) +- **`src/platform/windows/`** — Windows DLL proxy entry point +- **`src/platform/macos/dylib/`** — macOS dylib entry point +- **`src/platform/macos/loader/`** — macOS loader (finds game, injects dylib) - **`macos-launcher/`** — Swift macOS GUI app - **`third_party/libil2cpp/`** — IL2CPP SDK headers - **`xmake-packages/`** — Custom xmake package definitions (e.g., `spud`) @@ -92,7 +92,7 @@ static auto class_helper = il2cpp_get_class_helper("Assembly.Name", "Namespace", static auto method = class_helper.GetMethodInfo("MethodName"); ``` -**Adding a new patch** — Create a `.cc` file in `mods/src/patches/parts/`, write an `InstallXxxHooks()` function, declare it in `patches.cc`, add a `bool installXxx` to `Config`, and register it in the `patches[]` array in `patches.cc`. Hook-install toggles are read from the `[patches]` TOML table in all build modes and should default to `true`; they exist as emergency compatibility switches for hook collisions or client drift. +**Adding a new patch** — Create a `.cc` file in `src/mod/patches/parts/`, write an `InstallXxxHooks()` function, declare it in `patches.cc`, add a `bool installXxx` to `Config`, and register it in the `patches[]` array in `patches.cc`. Hook-install toggles are read from the `[patches]` TOML table in all build modes and should default to `true`; they exist as emergency compatibility switches for hook collisions or client drift. **Separate hook installation from feature enablement** — Do not use a user-facing feature setting to decide whether its hooks are installed. Normally install all supported hooks, then have each hook check the feature setting and immediately preserve native behavior (usually by calling `original`) when the feature is disabled. Keep hook-install switches under `[patches]` and feature settings in their relevant sections such as `[ui]`, `[graphics]`, or `[audio]`; never place a feature-only toggle under `[patches]`. If an installer contains an early return based on a feature setting, or a `patches[]` entry points directly at a feature setting, treat that as a design error. Helpers that install no hooks, such as shortcut-only behavior, do not belong in `patches[]` at all. @@ -113,7 +113,7 @@ static auto method = class_helper.GetMethodInfo("MethodName"); ## Code Style - Uses `.clang-format` — 2-space indent, 120 column limit, Linux brace style, aligned assignments/declarations -- Version is defined in `mods/src/version.h` (VERSION_MAJOR/MINOR/REVISION/PATCH) +- Version is defined in `src/mod/version.h` (VERSION_MAJOR/MINOR/REVISION/PATCH) - Prefer narrow platform guards such as `#if _WIN32`, `#if !_WIN32`, and `#if __APPLE__`; do not assume every non-Windows path is macOS. - Logging via `spdlog::info()`, `spdlog::debug()`, etc. diff --git a/README.md b/README.md index dd912ed6d..f6856b3b1 100644 --- a/README.md +++ b/README.md @@ -51,11 +51,11 @@ This project is maintained solely at my own cost of time, energy and money. Any - Create parsed toml file to show what settings have been applied - Customise your keyboard shortcuts -For a full list of features see our [FEATURES.md](FEATURES.md) +For a full list of features see our [FEATURES.md](docs/FEATURES.md) ## Installing -Please see the [INSTALL.md](INSTALL.md) instructions which has steps on how to use this mod with Star Trek Fleet Command. +Please see the [INSTALL.md](docs/INSTALL.md) instructions which has steps on how to use this mod with Star Trek Fleet Command. For the Windows DLL identity marker, artifact-attestation trust boundary, and verification command, see [Windows DLL provenance](docs/WINDOWS_DLL_PROVENANCE.md). @@ -66,7 +66,7 @@ Please note, that whilst Mac support was added in this version, it's supported o Most keyboard shortcuts can be modified by updated your TOML file. If your file is empty, see the VARS file which has all the runtime settings that have -been applied. Valid values for any short can be found in [KEYMAPPING.md](KEYMAPPING.md) +been applied. Valid values for any short can be found in [KEYMAPPING.md](docs/KEYMAPPING.md) ### UI shortcuts diff --git a/create-contrib.sh b/create-contrib.sh deleted file mode 100644 index 15e19bd16..000000000 --- a/create-contrib.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!env /bin/bash -git shortlog -sne --all | awk '{$1=""; print "- " substr($0,2)}' > CONTRIBUTORS.md diff --git a/docs/FASTER_QUEUE_RECOVERY.md b/docs/FASTER_QUEUE_RECOVERY.md index 1d5424119..6ef8a5ed6 100644 --- a/docs/FASTER_QUEUE_RECOVERY.md +++ b/docs/FASTER_QUEUE_RECOVERY.md @@ -50,6 +50,6 @@ The older off-screen Kir'Shara combat-completion repair was fixed by Scopely. Th ## Validation -Run `tests/run-action-queue.ps1` on Windows, or compile `tests/action_queue.cc` with a C++23 compiler and `-Imods/src`. Tests use the production policy and request store with fake weak handles. They cover one-shot recovery, reordered/still-present targets, cross-fleet rejection, stale attempts, replaced/collected queues, expiry, reentrant cancellation, bounded capacity and cleanup. They do not model game ABI or network scheduling. +Run `tests/run-action-queue.ps1` on Windows, or compile `tests/action_queue.cc` with a C++23 compiler and `-Isrc/mod`. Tests use the production policy and request store with fake weak handles. They cover one-shot recovery, reordered/still-present targets, cross-fleet rejection, stale attempts, replaced/collected queues, expiry, reentrant cancellation, bounded capacity and cleanup. They do not model game ABI or network scheduling. The prototype produced two observed handoffs with the next target attempted 1–2 ms later and successful responses within 388–532 ms. Those timings are observations, not a latency guarantee. The final adapter requires its own smoke test: normal queued combat; removal of the outstanding target; removal before the first successful course response; queue clear/rebuild; recall; and session restart. Group-wave behavior needs additional coverage when available. diff --git a/FEATURES.md b/docs/FEATURES.md similarity index 99% rename from FEATURES.md rename to docs/FEATURES.md index 5f6fbb2f8..059288f61 100644 --- a/FEATURES.md +++ b/docs/FEATURES.md @@ -2,7 +2,7 @@ The STFC Community Mod adds configurable quality-of-life improvements to the desktop version of Star Trek Fleet Command. This catalog describes the user-facing features represented by the current source code and English example configuration. -Most options are configured in `community_patch_settings.toml`. The mod creates a default settings file when one is missing and also writes a parsed settings file so you can see the values that were applied. Nearly every shortcut can be remapped; see [`KEYMAPPING.md`](KEYMAPPING.md) for valid key names. +Most options are configured in `community_patch_settings.toml`. The mod creates a default settings file when one is missing and also writes a parsed settings file so you can see the values that were applied. Nearly every shortcut can be remapped; see [`KEYMAPPING.md`](docs/KEYMAPPING.md) for valid key names. ## Display and window controls @@ -176,4 +176,4 @@ The default shortcut map includes the following high-use controls. All of these | Focus search | `CTRL-F` | | Toggle borderless fullscreen | `F11` | -For the complete shortcut list and the names accepted by the configuration parser, see [`README.md`](README.md) and [`KEYMAPPING.md`](KEYMAPPING.md). +For the complete shortcut list and the names accepted by the configuration parser, see [`README.md`](README.md) and [`KEYMAPPING.md`](docs/KEYMAPPING.md). diff --git a/INSTALL.md b/docs/INSTALL.md similarity index 100% rename from INSTALL.md rename to docs/INSTALL.md diff --git a/KEYMAPPING.md b/docs/KEYMAPPING.md similarity index 100% rename from KEYMAPPING.md rename to docs/KEYMAPPING.md diff --git a/docs/VERSION_SUBSTITUTION.md b/docs/VERSION_SUBSTITUTION.md index 89e8dff58..e59213442 100644 --- a/docs/VERSION_SUBSTITUTION.md +++ b/docs/VERSION_SUBSTITUTION.md @@ -2,20 +2,20 @@ ## Overview -The macOS launcher's `Info.plist` file now automatically uses the version defined in `mods/src/version.h` during the build process. This ensures consistency between the application version and the mod version. +The macOS launcher's `Info.plist` file now automatically uses the version defined in `src/mod/version.h` during the build process. This ensures consistency between the application version and the mod version. ## Implementation ### Files Involved -- **Template**: `macos-launcher/src/Info.plist.template` - Contains version placeholders -- **Generated**: `macos-launcher/src/Info.plist` - Generated during build (not committed to git) -- **Source**: `mods/src/version.h` - Contains version definitions -- **Build**: `macos-launcher/xmake.lua` - Contains version extraction and substitution logic +- **Template**: `src/launcher/macos/Info.plist.template` - Contains version placeholders +- **Generated**: `src/launcher/macos/Info.plist` - Generated during build (not committed to git) +- **Source**: `src/mod/version.h` - Contains version definitions +- **Build**: `src/launcher/macos/xmake.lua` - Contains version extraction and substitution logic ### Version Extraction -The build process extracts version components from `mods/src/version.h`: +The build process extracts version components from `src/mod/version.h`: ```c #define VERSION_MAJOR 0 @@ -42,7 +42,7 @@ During build, these placeholders are replaced with the actual version. ## Build Process 1. **Configuration Phase**: `on_config` function in xmake.lua executes -2. **Version Extraction**: Reads and parses `mods/src/version.h` +2. **Version Extraction**: Reads and parses `src/mod/version.h` 3. **Template Processing**: Replaces `${VERSION}` in template with extracted version 4. **File Generation**: Writes processed `Info.plist` to source directory 5. **Build**: Xcode uses the generated `Info.plist` for app bundle creation @@ -66,7 +66,7 @@ This script simulates the build process and verifies: ### Updating Version -Version updates are made in `mods/src/version.h` only. The macOS launcher will automatically pick up changes during the next build. +Version updates are made in `src/mod/version.h` only. The macOS launcher will automatically pick up changes during the next build. ### Modifying Info.plist @@ -76,7 +76,7 @@ Changes to the Info.plist should be made to `Info.plist.template`, not the gener If version substitution fails: -1. Check that `mods/src/version.h` exists and contains expected `VERSION_*` definitions +1. Check that `src/mod/version.h` exists and contains expected `VERSION_*` definitions 2. Verify `Info.plist.template` contains `${VERSION}` placeholders 3. Run the verification script to identify specific issues 4. Check xmake build output for error messages diff --git a/docs/configuration/example_community_patch_settings.toml b/docs/configuration/example_community_patch_settings.toml new file mode 100644 index 000000000..6ae7868b6 --- /dev/null +++ b/docs/configuration/example_community_patch_settings.toml @@ -0,0 +1,16 @@ +# Localized example configuration files are generated from the languages +# supported by https://modconfig.pages.dev: +# +# English (en): https://github.com/STFC-Mod/mod/blob/dev/docs/configuration/example_community_patch_settings_en.toml +# Deutsch (de): https://github.com/STFC-Mod/mod/blob/dev/docs/configuration/example_community_patch_settings_de.toml +# Nederlands (nl): https://github.com/STFC-Mod/mod/blob/dev/docs/configuration/example_community_patch_settings_nl.toml +# Français (fr): https://github.com/STFC-Mod/mod/blob/dev/docs/configuration/example_community_patch_settings_fr.toml +# Español (es): https://github.com/STFC-Mod/mod/blob/dev/docs/configuration/example_community_patch_settings_es.toml +# Русский (ru): https://github.com/STFC-Mod/mod/blob/dev/docs/configuration/example_community_patch_settings_ru.toml +# Dansk (da): https://github.com/STFC-Mod/mod/blob/dev/docs/configuration/example_community_patch_settings_da.toml +# tlhIngan Hol (tlh): https://github.com/STFC-Mod/mod/blob/dev/docs/configuration/example_community_patch_settings_tlh.toml +# Minionese (en-x-minionese): https://github.com/STFC-Mod/mod/blob/dev/docs/configuration/example_community_patch_settings_en-x-minionese.toml +# Cockney (en-GB-x-cockney): https://github.com/STFC-Mod/mod/blob/dev/docs/configuration/example_community_patch_settings_en-GB-x-cockney.toml +# +# Choose the example for your preferred language and save a copy as +# community_patch_settings.toml in the appropriate settings folder. diff --git a/example_community_patch_settings_da.toml b/docs/configuration/example_community_patch_settings_da.toml similarity index 100% rename from example_community_patch_settings_da.toml rename to docs/configuration/example_community_patch_settings_da.toml diff --git a/example_community_patch_settings_de.toml b/docs/configuration/example_community_patch_settings_de.toml similarity index 100% rename from example_community_patch_settings_de.toml rename to docs/configuration/example_community_patch_settings_de.toml diff --git a/example_community_patch_settings_en-GB-x-cockney.toml b/docs/configuration/example_community_patch_settings_en-GB-x-cockney.toml similarity index 100% rename from example_community_patch_settings_en-GB-x-cockney.toml rename to docs/configuration/example_community_patch_settings_en-GB-x-cockney.toml diff --git a/example_community_patch_settings_en-x-minionese.toml b/docs/configuration/example_community_patch_settings_en-x-minionese.toml similarity index 100% rename from example_community_patch_settings_en-x-minionese.toml rename to docs/configuration/example_community_patch_settings_en-x-minionese.toml diff --git a/example_community_patch_settings_en.toml b/docs/configuration/example_community_patch_settings_en.toml similarity index 100% rename from example_community_patch_settings_en.toml rename to docs/configuration/example_community_patch_settings_en.toml diff --git a/example_community_patch_settings_es.toml b/docs/configuration/example_community_patch_settings_es.toml similarity index 100% rename from example_community_patch_settings_es.toml rename to docs/configuration/example_community_patch_settings_es.toml diff --git a/example_community_patch_settings_fr.toml b/docs/configuration/example_community_patch_settings_fr.toml similarity index 100% rename from example_community_patch_settings_fr.toml rename to docs/configuration/example_community_patch_settings_fr.toml diff --git a/example_community_patch_settings_nl.toml b/docs/configuration/example_community_patch_settings_nl.toml similarity index 100% rename from example_community_patch_settings_nl.toml rename to docs/configuration/example_community_patch_settings_nl.toml diff --git a/example_community_patch_settings_ru.toml b/docs/configuration/example_community_patch_settings_ru.toml similarity index 100% rename from example_community_patch_settings_ru.toml rename to docs/configuration/example_community_patch_settings_ru.toml diff --git a/example_community_patch_settings_tlh.toml b/docs/configuration/example_community_patch_settings_tlh.toml similarity index 100% rename from example_community_patch_settings_tlh.toml rename to docs/configuration/example_community_patch_settings_tlh.toml diff --git a/example_community_patch_settings.toml b/example_community_patch_settings.toml deleted file mode 100644 index acaa85f11..000000000 --- a/example_community_patch_settings.toml +++ /dev/null @@ -1,16 +0,0 @@ -# Localized example configuration files are generated from the languages -# supported by https://modconfig.pages.dev: -# -# English (en): https://github.com/STFC-Mod/mod/blob/dev/example_community_patch_settings_en.toml -# Deutsch (de): https://github.com/STFC-Mod/mod/blob/dev/example_community_patch_settings_de.toml -# Nederlands (nl): https://github.com/STFC-Mod/mod/blob/dev/example_community_patch_settings_nl.toml -# Français (fr): https://github.com/STFC-Mod/mod/blob/dev/example_community_patch_settings_fr.toml -# Español (es): https://github.com/STFC-Mod/mod/blob/dev/example_community_patch_settings_es.toml -# Русский (ru): https://github.com/STFC-Mod/mod/blob/dev/example_community_patch_settings_ru.toml -# Dansk (da): https://github.com/STFC-Mod/mod/blob/dev/example_community_patch_settings_da.toml -# tlhIngan Hol (tlh): https://github.com/STFC-Mod/mod/blob/dev/example_community_patch_settings_tlh.toml -# Minionese (en-x-minionese): https://github.com/STFC-Mod/mod/blob/dev/example_community_patch_settings_en-x-minionese.toml -# Cockney (en-GB-x-cockney): https://github.com/STFC-Mod/mod/blob/dev/example_community_patch_settings_en-GB-x-cockney.toml -# -# Choose the example for your preferred language and save a copy as -# community_patch_settings.toml in the appropriate settings folder. diff --git a/macos-launcher/src/launcher.icns b/macos-launcher/src/launcher.icns deleted file mode 100644 index b8cc49296e647da892b098faa4177b8987aaeda5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109899 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 None: parser.add_argument( "--header", type=Path, - default=Path("mods/src/version.h"), + default=Path("src/mod/version.h"), help="version header to update", ) args = parser.parse_args() diff --git a/scripts/validate-example-configs.py b/scripts/validate-example-configs.py index 45d1400c8..b579acbb0 100644 --- a/scripts/validate-example-configs.py +++ b/scripts/validate-example-configs.py @@ -20,7 +20,7 @@ def main() -> int: root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - pattern = os.path.join(root, "example_community_patch_settings*.toml") + pattern = os.path.join(root, "docs/configuration/example_community_patch_settings*.toml") files = sorted(glob.glob(pattern)) if not files: print(f"no example config files matched {pattern!r}", file=sys.stderr) diff --git a/scripts/verify_version_substitution.py b/scripts/verify_version_substitution.py index 98d3815b5..b49f32e78 100755 --- a/scripts/verify_version_substitution.py +++ b/scripts/verify_version_substitution.py @@ -12,7 +12,7 @@ def get_version_from_header(): """Extract version from version.h (mimics the Lua function in xmake.lua)""" - version_file = "mods/src/version.h" + version_file = "src/mod/version.h" if not os.path.isfile(version_file): return "1.0.0.0" @@ -39,7 +39,7 @@ def simulate_build_process(): print(f"1. Extracted version: {version}") # Step 2: Check template file exists - template_file = "macos-launcher/src/Info.plist.template" + template_file = "src/launcher/macos/Info.plist.template" if not os.path.isfile(template_file): print(f"❌ ERROR: Template file not found: {template_file}") return False @@ -56,7 +56,7 @@ def simulate_build_process(): processed_content = template_content.replace("${VERSION}", version) # Step 4: Write generated file - output_file = "macos-launcher/src/Info.plist" + output_file = "src/launcher/macos/Info.plist" with open(output_file, 'w') as f: f.write(processed_content) @@ -107,7 +107,7 @@ def simulate_build_process(): def cleanup(): """Clean up generated files""" - output_file = "macos-launcher/src/Info.plist" + output_file = "src/launcher/macos/Info.plist" if os.path.isfile(output_file): os.remove(output_file) print(f"Cleaned up generated file: {output_file}") diff --git a/macos-launcher/src/ActionView.swift b/src/launcher/macos/ActionView.swift similarity index 100% rename from macos-launcher/src/ActionView.swift rename to src/launcher/macos/ActionView.swift diff --git a/macos-launcher/src/Assets.xcassets/AccentColor.colorset/Contents.json b/src/launcher/macos/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from macos-launcher/src/Assets.xcassets/AccentColor.colorset/Contents.json rename to src/launcher/macos/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/macos-launcher/src/Assets.xcassets/AppIcon.appiconset/Contents.json b/src/launcher/macos/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from macos-launcher/src/Assets.xcassets/AppIcon.appiconset/Contents.json rename to src/launcher/macos/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/macos-launcher/src/Assets.xcassets/Contents.json b/src/launcher/macos/Assets.xcassets/Contents.json similarity index 100% rename from macos-launcher/src/Assets.xcassets/Contents.json rename to src/launcher/macos/Assets.xcassets/Contents.json diff --git a/macos-launcher/src/Assets.xcassets/lcarLightOrange.colorset/Contents.json b/src/launcher/macos/Assets.xcassets/lcarLightOrange.colorset/Contents.json similarity index 100% rename from macos-launcher/src/Assets.xcassets/lcarLightOrange.colorset/Contents.json rename to src/launcher/macos/Assets.xcassets/lcarLightOrange.colorset/Contents.json diff --git a/macos-launcher/src/Assets.xcassets/lcarOrange.colorset/Contents.json b/src/launcher/macos/Assets.xcassets/lcarOrange.colorset/Contents.json similarity index 100% rename from macos-launcher/src/Assets.xcassets/lcarOrange.colorset/Contents.json rename to src/launcher/macos/Assets.xcassets/lcarOrange.colorset/Contents.json diff --git a/macos-launcher/src/Assets.xcassets/lcarPink.colorset/Contents.json b/src/launcher/macos/Assets.xcassets/lcarPink.colorset/Contents.json similarity index 100% rename from macos-launcher/src/Assets.xcassets/lcarPink.colorset/Contents.json rename to src/launcher/macos/Assets.xcassets/lcarPink.colorset/Contents.json diff --git a/macos-launcher/src/Assets.xcassets/lcarPlum.colorset/Contents.json b/src/launcher/macos/Assets.xcassets/lcarPlum.colorset/Contents.json similarity index 100% rename from macos-launcher/src/Assets.xcassets/lcarPlum.colorset/Contents.json rename to src/launcher/macos/Assets.xcassets/lcarPlum.colorset/Contents.json diff --git a/macos-launcher/src/Assets.xcassets/lcarTan.colorset/Contents.json b/src/launcher/macos/Assets.xcassets/lcarTan.colorset/Contents.json similarity index 100% rename from macos-launcher/src/Assets.xcassets/lcarTan.colorset/Contents.json rename to src/launcher/macos/Assets.xcassets/lcarTan.colorset/Contents.json diff --git a/macos-launcher/src/Assets.xcassets/lcarViolet.colorset/Contents.json b/src/launcher/macos/Assets.xcassets/lcarViolet.colorset/Contents.json similarity index 100% rename from macos-launcher/src/Assets.xcassets/lcarViolet.colorset/Contents.json rename to src/launcher/macos/Assets.xcassets/lcarViolet.colorset/Contents.json diff --git a/macos-launcher/src/Assets.xcassets/lcarWhite.colorset/Contents.json b/src/launcher/macos/Assets.xcassets/lcarWhite.colorset/Contents.json similarity index 100% rename from macos-launcher/src/Assets.xcassets/lcarWhite.colorset/Contents.json rename to src/launcher/macos/Assets.xcassets/lcarWhite.colorset/Contents.json diff --git a/macos-launcher/src/Assets.xcassets/ufp-logo.imageset/Contents.json b/src/launcher/macos/Assets.xcassets/ufp-logo.imageset/Contents.json similarity index 100% rename from macos-launcher/src/Assets.xcassets/ufp-logo.imageset/Contents.json rename to src/launcher/macos/Assets.xcassets/ufp-logo.imageset/Contents.json diff --git a/macos-launcher/src/Assets.xcassets/ufp-logo.imageset/ufp-logo.png b/src/launcher/macos/Assets.xcassets/ufp-logo.imageset/ufp-logo.png similarity index 100% rename from macos-launcher/src/Assets.xcassets/ufp-logo.imageset/ufp-logo.png rename to src/launcher/macos/Assets.xcassets/ufp-logo.imageset/ufp-logo.png diff --git a/macos-launcher/src/ContentView.swift b/src/launcher/macos/ContentView.swift similarity index 100% rename from macos-launcher/src/ContentView.swift rename to src/launcher/macos/ContentView.swift diff --git a/macos-launcher/src/Info.plist.template b/src/launcher/macos/Info.plist.template similarity index 100% rename from macos-launcher/src/Info.plist.template rename to src/launcher/macos/Info.plist.template diff --git a/macos-launcher/src/LauncherMain.swift b/src/launcher/macos/LauncherMain.swift similarity index 100% rename from macos-launcher/src/LauncherMain.swift rename to src/launcher/macos/LauncherMain.swift diff --git a/macos-launcher/src/PatchEntitlements.swift b/src/launcher/macos/PatchEntitlements.swift similarity index 100% rename from macos-launcher/src/PatchEntitlements.swift rename to src/launcher/macos/PatchEntitlements.swift diff --git a/macos-launcher/src/TemporaryFolderURL.swift b/src/launcher/macos/TemporaryFolderURL.swift similarity index 100% rename from macos-launcher/src/TemporaryFolderURL.swift rename to src/launcher/macos/TemporaryFolderURL.swift diff --git a/macos-launcher/src/UpdaterFileOperations.swift b/src/launcher/macos/UpdaterFileOperations.swift similarity index 100% rename from macos-launcher/src/UpdaterFileOperations.swift rename to src/launcher/macos/UpdaterFileOperations.swift diff --git a/macos-launcher/src/XsollaLib.swift b/src/launcher/macos/XsollaLib.swift similarity index 100% rename from macos-launcher/src/XsollaLib.swift rename to src/launcher/macos/XsollaLib.swift diff --git a/macos-launcher/src/ini.swift b/src/launcher/macos/ini.swift similarity index 100% rename from macos-launcher/src/ini.swift rename to src/launcher/macos/ini.swift diff --git a/macos-launcher/src/macOSLauncher.entitlements b/src/launcher/macos/macOSLauncher.entitlements similarity index 100% rename from macos-launcher/src/macOSLauncher.entitlements rename to src/launcher/macos/macOSLauncher.entitlements diff --git a/macos-launcher/src/module.modulemap b/src/launcher/macos/module.modulemap similarity index 58% rename from macos-launcher/src/module.modulemap rename to src/launcher/macos/module.modulemap index e29611b4e..66cc1daf3 100644 --- a/macos-launcher/src/module.modulemap +++ b/src/launcher/macos/module.modulemap @@ -1,5 +1,5 @@ module libplzma { - header "../deps/PLzmaSDK/libplzma.h" + header "../../../macos-launcher/deps/PLzmaSDK/libplzma.h" export * } diff --git a/macos-launcher/src/rsync.cc b/src/launcher/macos/rsync.cc similarity index 100% rename from macos-launcher/src/rsync.cc rename to src/launcher/macos/rsync.cc diff --git a/macos-launcher/src/rsync.h b/src/launcher/macos/rsync.h similarity index 100% rename from macos-launcher/src/rsync.h rename to src/launcher/macos/rsync.h diff --git a/macos-launcher/src/rsync.swift b/src/launcher/macos/rsync.swift similarity index 100% rename from macos-launcher/src/rsync.swift rename to src/launcher/macos/rsync.swift diff --git a/macos-launcher/xmake.lua b/src/launcher/macos/xmake.lua similarity index 84% rename from macos-launcher/xmake.lua rename to src/launcher/macos/xmake.lua index ef0ea8722..b5fe1d699 100644 --- a/macos-launcher/xmake.lua +++ b/src/launcher/macos/xmake.lua @@ -2,7 +2,7 @@ add_rules("mode.debug", "mode.release") -- Function to extract version from version.h function get_version_from_header() - local version_file = path.join(os.scriptdir(), "../mods/src/version.h") + local version_file = path.join(os.scriptdir(), "../../mod/version.h") if not os.isfile(version_file) then return "1.0.0.0" end @@ -24,11 +24,11 @@ target("macOSLauncher") set_kind("binary") set_basename("macOSLauncher") - add_files("src/**/*.swift") - add_files("src/*.swift", "src/*.xcassets") - add_files("deps/PlzmaSDK/swift/*.swift") - add_files("src/*.cc") - add_includedirs("deps/PLzmaSDK") + add_files("**/*.swift") + add_files("*.swift", "*.xcassets") + add_files("../../../macos-launcher/deps/PLzmaSDK/swift/*.swift") + add_files("*.cc") + add_includedirs("../../../macos-launcher/deps/PLzmaSDK") add_packages("librsync", "PLzmaSDK") add_ldflags("-lc++", {force = true}) @@ -36,14 +36,14 @@ target("macOSLauncher") add_values("xcode.codesign_identity", "-") add_values("xcode.bundle_display_name", "Star Trek Fleet Command Community Mod") add_values("xcode.product_name", "STFC Community Mod") - add_values("xcode.bundle_info_plist", "src/Info.plist") + add_values("xcode.bundle_info_plist", "Info.plist") -- Keep imported Swift/Clang modules in a stable path that CI can persist. local swift_module_cache = path.join(os.projectdir(), "build", ".swift-module-cache") add_scflags( "-module-cache-path", swift_module_cache, "-Xcc -fmodules", - "-Xcc -fmodule-map-file=macos-launcher/src/module.modulemap", + "-Xcc -fmodule-map-file=src/launcher/macos/module.modulemap", "-D SWIFT_PACKAGE", {force = true}) @@ -57,7 +57,7 @@ target("macOSLauncher") target:add("scflags", "-external-plugin-path", sdk_platform .. "/Developer/usr/lib/swift/host/plugins#" .. sdk_platform .. "/Developer/usr/bin/swift-plugin-server") - local version_file = path.join(os.scriptdir(), "../mods/src/version.h") + local version_file = path.join(os.scriptdir(), "../../mod/version.h") if not os.isfile(version_file) then -- GitHub Actions warning print("::warning file=" .. version_file .. "::version.h not found, using default version 1.0.0.0") @@ -81,8 +81,8 @@ target("macOSLauncher") end -- Generate Info.plist - local info_plist_template = path.join(os.scriptdir(), "src/Info.plist.template") - local info_plist_output = path.join(os.scriptdir(), "src/Info.plist") + local info_plist_template = path.join(os.scriptdir(), "Info.plist.template") + local info_plist_output = path.join(os.scriptdir(), "Info.plist") if os.isfile(info_plist_template) then -- Read the template @@ -101,7 +101,7 @@ target("macOSLauncher") -- Clean up generated file after build (optional) after_clean(function (target) - local info_plist_output = path.join(os.scriptdir(), "src/Info.plist") + local info_plist_output = path.join(os.scriptdir(), "Info.plist") if os.isfile(info_plist_output) then os.rm(info_plist_output) print("Cleaned generated Info.plist") diff --git a/libs/il2cpp/GameAssembly.lib b/src/libs/il2cpp/GameAssembly.lib similarity index 100% rename from libs/il2cpp/GameAssembly.lib rename to src/libs/il2cpp/GameAssembly.lib diff --git a/libs/il2cpp/include/il2cpp/api.h b/src/libs/il2cpp/include/il2cpp/api.h similarity index 100% rename from libs/il2cpp/include/il2cpp/api.h rename to src/libs/il2cpp/include/il2cpp/api.h diff --git a/libs/il2cpp/include/il2cpp/hook.h b/src/libs/il2cpp/include/il2cpp/hook.h similarity index 100% rename from libs/il2cpp/include/il2cpp/hook.h rename to src/libs/il2cpp/include/il2cpp/hook.h diff --git a/libs/il2cpp/include/il2cpp/il2cpp.h b/src/libs/il2cpp/include/il2cpp/il2cpp.h similarity index 100% rename from libs/il2cpp/include/il2cpp/il2cpp.h rename to src/libs/il2cpp/include/il2cpp/il2cpp.h diff --git a/libs/il2cpp/include/il2cpp/method_contract.h b/src/libs/il2cpp/include/il2cpp/method_contract.h similarity index 100% rename from libs/il2cpp/include/il2cpp/method_contract.h rename to src/libs/il2cpp/include/il2cpp/method_contract.h diff --git a/libs/il2cpp/src/api.cc b/src/libs/il2cpp/src/api.cc similarity index 100% rename from libs/il2cpp/src/api.cc rename to src/libs/il2cpp/src/api.cc diff --git a/libs/il2cpp/src/il2cpp.cc b/src/libs/il2cpp/src/il2cpp.cc similarity index 100% rename from libs/il2cpp/src/il2cpp.cc rename to src/libs/il2cpp/src/il2cpp.cc diff --git a/libs/il2cpp/xmake.lua b/src/libs/il2cpp/xmake.lua similarity index 100% rename from libs/il2cpp/xmake.lua rename to src/libs/il2cpp/xmake.lua diff --git a/libs/unity/include/unity/core.h b/src/libs/unity/include/unity/core.h similarity index 100% rename from libs/unity/include/unity/core.h rename to src/libs/unity/include/unity/core.h diff --git a/libs/unity/include/unity/input.h b/src/libs/unity/include/unity/input.h similarity index 100% rename from libs/unity/include/unity/input.h rename to src/libs/unity/include/unity/input.h diff --git a/libs/unity/include/unity/tracker.h b/src/libs/unity/include/unity/tracker.h similarity index 100% rename from libs/unity/include/unity/tracker.h rename to src/libs/unity/include/unity/tracker.h diff --git a/libs/unity/include/unity/ui.h b/src/libs/unity/include/unity/ui.h similarity index 100% rename from libs/unity/include/unity/ui.h rename to src/libs/unity/include/unity/ui.h diff --git a/libs/unity/src/input.cc b/src/libs/unity/src/input.cc similarity index 100% rename from libs/unity/src/input.cc rename to src/libs/unity/src/input.cc diff --git a/libs/unity/src/tracker.cc b/src/libs/unity/src/tracker.cc similarity index 100% rename from libs/unity/src/tracker.cc rename to src/libs/unity/src/tracker.cc diff --git a/libs/unity/xmake.lua b/src/libs/unity/xmake.lua similarity index 100% rename from libs/unity/xmake.lua rename to src/libs/unity/xmake.lua diff --git a/mods/src/config.cc b/src/mod/config.cc similarity index 99% rename from mods/src/config.cc rename to src/mod/config.cc index 93367cc18..6bc85d870 100644 --- a/mods/src/config.cc +++ b/src/mod/config.cc @@ -1,11 +1,11 @@ #include "config.h" #include "file.h" -#include "patches/shortcuts.h" -#include "str_utils.h" +#include "shortcuts.h" +#include "text.h" #include "version.h" -#include "prime/ui.h" +#include "game/ui.h" #include #include diff --git a/mods/src/config.h b/src/mod/config.h similarity index 99% rename from mods/src/config.h rename to src/mod/config.h index 8a3c4e21e..ea6cfa476 100644 --- a/mods/src/config.h +++ b/src/mod/config.h @@ -5,8 +5,8 @@ // startup and again whenever the file changes; a few are also toggled at runtime by hotkeys. Everything runs on // the game thread except sync, whose workers retain immutable snapshots. -#include "patches/parts/notification_audio.h" -#include "patches/shortcuts.h" +#include "features/notification_audio.h" +#include "shortcuts.h" #include diff --git a/mods/src/patches/parts/action_queue.cc b/src/mod/features/action_queue.cc similarity index 99% rename from mods/src/patches/parts/action_queue.cc rename to src/mod/features/action_queue.cc index ccbd516a7..004cfc63d 100644 --- a/mods/src/patches/parts/action_queue.cc +++ b/src/mod/features/action_queue.cc @@ -1,10 +1,10 @@ #include "action_queue.h" -#include "patches/patches.h" +#include "features/features.h" #include // Use the host ABI for the 24-byte value-type callback on Windows and both Mac architectures. // Validate the managed layout before installing. -#include "prime/queues.h" +#include "game/queues.h" #include #include #include diff --git a/mods/src/patches/parts/action_queue.h b/src/mod/features/action_queue.h similarity index 100% rename from mods/src/patches/parts/action_queue.h rename to src/mod/features/action_queue.h diff --git a/mods/src/patches/action_queue_guard_policy.h b/src/mod/features/action_queue_guard_policy.h similarity index 100% rename from mods/src/patches/action_queue_guard_policy.h rename to src/mod/features/action_queue_guard_policy.h diff --git a/mods/src/patches/parts/alliance_store.cc b/src/mod/features/alliance_store.cc similarity index 99% rename from mods/src/patches/parts/alliance_store.cc rename to src/mod/features/alliance_store.cc index 2ad913732..d6c4656b6 100644 --- a/mods/src/patches/parts/alliance_store.cc +++ b/src/mod/features/alliance_store.cc @@ -1,11 +1,11 @@ // alliance_store: native material research tooltips in the Alliance Games store, and its currency refresh once its // bundles are ready. One feature owner, no claim-trace or file probe. [patches] alliancegamesstorehooks. -#include "patches/native_hook_extent.h" -#include "patches/patches.h" +#include "features/features.h" -#include "prime/Hub.h" -#include "prime/inventory.h" +#include "game/app.h" +#include "game/inventory.h" +#include "game/native_hook_extent.h" #include #include diff --git a/mods/src/patches/parts/galactic_anomaly_timer.cc b/src/mod/features/anomaly_timer.cc similarity index 98% rename from mods/src/patches/parts/galactic_anomaly_timer.cc rename to src/mod/features/anomaly_timer.cc index e374ef10d..547736e79 100644 --- a/mods/src/patches/parts/galactic_anomaly_timer.cc +++ b/src/mod/features/anomaly_timer.cc @@ -2,11 +2,11 @@ // Help All / Engage / Claim drawer. All Unity work runs on the frame tick; there are no detours of its own. #include "config.h" -#include "patches/patches.h" +#include "features/features.h" -#include "prime/Hub.h" -#include "prime/hud.h" -#include "prime/ui.h" +#include "game/app.h" +#include "game/hud.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/parts/audio_events.cc b/src/mod/features/audio.cc similarity index 96% rename from mods/src/patches/parts/audio_events.cc rename to src/mod/features/audio.cc index 14a12a26f..bba24de17 100644 --- a/mods/src/patches/parts/audio_events.cc +++ b/src/mod/features/audio.cc @@ -1,10 +1,10 @@ // [audio]: logs the game's sound events by name, and mutes the ones in disabled_events. #include "config.h" -#include "patches/patches.h" -#include "str_utils.h" +#include "features/features.h" +#include "text.h" -#include "prime/Hub.h" +#include "game/app.h" #include #include diff --git a/mods/src/patches/parts/buff_fixes.cc b/src/mod/features/buffs.cc similarity index 97% rename from mods/src/patches/parts/buff_fixes.cc rename to src/mod/features/buffs.cc index 78c8f51be..e3f7a6586 100644 --- a/mods/src/patches/parts/buff_fixes.cc +++ b/src/mod/features/buffs.cc @@ -2,9 +2,9 @@ // against a buff list the game cannot handle. #include "config.h" -#include "patches/patches.h" +#include "features/features.h" -#include "prime/server.h" +#include "game/server.h" #include #include diff --git a/mods/src/patches/parts/zoom.cc b/src/mod/features/camera.cc similarity index 99% rename from mods/src/patches/parts/zoom.cc rename to src/mod/features/camera.cc index 9dede3c57..0a87732b6 100644 --- a/mods/src/patches/parts/zoom.cc +++ b/src/mod/features/camera.cc @@ -3,12 +3,12 @@ // held touches that keep panning. Fleet label detail, which follows the zoom, is in fleet_labels.cc. #include "config.h" -#include "patches/patches.h" -#include "patches/shortcuts.h" +#include "features/features.h" +#include "shortcuts.h" -#include "prime/Hub.h" -#include "prime/navigation.h" -#include "prime/ui.h" +#include "game/app.h" +#include "game/navigation.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/parts/cargo.cc b/src/mod/features/cargo.cc similarity index 97% rename from mods/src/patches/parts/cargo.cc rename to src/mod/features/cargo.cc index 13623af8f..7411da88a 100644 --- a/mods/src/patches/parts/cargo.cc +++ b/src/mod/features/cargo.cc @@ -2,10 +2,10 @@ // count-up animation. #include "config.h" -#include "patches/patches.h" +#include "features/features.h" -#include "prime/server.h" -#include "prime/ui.h" +#include "game/server.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/parts/chat.cc b/src/mod/features/chat.cc similarity index 98% rename from mods/src/patches/parts/chat.cc rename to src/mod/features/chat.cc index aa3b49e14..f8487d9ce 100644 --- a/mods/src/patches/parts/chat.cc +++ b/src/mod/features/chat.cc @@ -3,13 +3,13 @@ // default_chat_width and auto_open_chat, which size side chat and open alliance side chat once per login. #include "config.h" -#include "patches/chat_startup.h" -#include "patches/patches.h" -#include "patches/shortcuts.h" +#include "features/chat_startup.h" +#include "features/features.h" +#include "shortcuts.h" -#include "prime/Hub.h" -#include "prime/chat.h" -#include "prime/ui.h" +#include "game/app.h" +#include "game/chat.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/chat_startup.h b/src/mod/features/chat_startup.h similarity index 100% rename from mods/src/patches/chat_startup.h rename to src/mod/features/chat_startup.h diff --git a/mods/src/patches/parts/chat_titles.cc b/src/mod/features/chat_titles.cc similarity index 98% rename from mods/src/patches/parts/chat_titles.cc rename to src/mod/features/chat_titles.cc index d024167f6..f8502f78d 100644 --- a/mods/src/patches/parts/chat_titles.cc +++ b/src/mod/features/chat_titles.cc @@ -1,9 +1,9 @@ -#include "patches/patches.h" -#include "prime/chat.h" +#include "features/features.h" +#include "game/chat.h" #include #include "config.h" -#include "patches/native_hook_extent.h" +#include "game/native_hook_extent.h" #include diff --git a/mods/src/patches/parts/double_click_assign_ship.cc b/src/mod/features/dock.cc similarity index 98% rename from mods/src/patches/parts/double_click_assign_ship.cc rename to src/mod/features/dock.cc index c9f38db01..4876b421b 100644 --- a/mods/src/patches/parts/double_click_assign_ship.cc +++ b/src/mod/features/dock.cc @@ -5,12 +5,12 @@ // the game's order. #include "config.h" -#include "patches/patches.h" +#include "features/features.h" #include "ship_tile_click.h" -#include "str_utils.h" +#include "text.h" -#include "prime/fleet.h" -#include "prime/ui.h" +#include "game/fleet.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/parts/double_click_assign_ship.h b/src/mod/features/double_click_assign_ship.h similarity index 80% rename from mods/src/patches/parts/double_click_assign_ship.h rename to src/mod/features/double_click_assign_ship.h index 78eb81f51..162977141 100644 --- a/mods/src/patches/parts/double_click_assign_ship.h +++ b/src/mod/features/double_click_assign_ship.h @@ -1,6 +1,6 @@ #pragma once -#include "prime/fleet.h" +#include "game/fleet.h" void AssignShipEnterKeyUpdate(); void DoubleClickOnShipTileClicked(FleetPlayerData* ship); diff --git a/mods/src/patches/patches.h b/src/mod/features/features.h similarity index 99% rename from mods/src/patches/patches.h rename to src/mod/features/features.h index 8b370533f..4c17c9e37 100644 --- a/mods/src/patches/patches.h +++ b/src/mod/features/features.h @@ -76,6 +76,8 @@ void FleetLabelsAfterZoom(NavigationZoom* zoom); // forbidden_tech.cc extern const Feature kForbiddenTechConfirm; + +// forbidden_tech_ship_name.cc extern const Feature kForbiddenTechShipName; // game_config.cc @@ -148,9 +150,6 @@ float WindowDpiScale(bool refresh = false); // sync/sync.cc extern const Feature kSync; - - - extern const Feature kInteriorZoom; extern const Feature kChatTitles; extern const Feature kRevealConfirm; diff --git a/mods/src/patches/parts/space_actions.cc b/src/mod/features/fleet_actions.cc similarity index 99% rename from mods/src/patches/parts/space_actions.cc rename to src/mod/features/fleet_actions.cc index 9bf2d885d..eff2fe8f5 100644 --- a/mods/src/patches/parts/space_actions.cc +++ b/src/mod/features/fleet_actions.cc @@ -4,15 +4,15 @@ #include "action_queue.h" #include "config.h" -#include "patches/patches.h" -#include "patches/shortcuts.h" +#include "features/features.h" +#include "shortcuts.h" #include -#include "prime/Hub.h" -#include "prime/fleet.h" -#include "prime/navigation.h" -#include "prime/ui.h" -#include "prime/viewers.h" +#include "game/app.h" +#include "game/fleet.h" +#include "game/navigation.h" +#include "game/ui.h" +#include "game/viewers.h" #include #include diff --git a/mods/src/patches/parts/fleet_labels.cc b/src/mod/features/fleet_labels.cc similarity index 99% rename from mods/src/patches/parts/fleet_labels.cc rename to src/mod/features/fleet_labels.cc index 5090e3488..7f1a641f4 100644 --- a/mods/src/patches/parts/fleet_labels.cc +++ b/src/mod/features/fleet_labels.cc @@ -3,9 +3,9 @@ // hooks in camera.cc report the zoom here. #include "config.h" -#include "patches/patches.h" +#include "features/features.h" -#include "prime/navigation.h" +#include "game/navigation.h" #include #include diff --git a/mods/src/patches/parts/forbidden_tech_confirmation.cc b/src/mod/features/forbidden_tech.cc similarity index 98% rename from mods/src/patches/parts/forbidden_tech_confirmation.cc rename to src/mod/features/forbidden_tech.cc index 98b5e60ab..7d6745d2a 100644 --- a/mods/src/patches/parts/forbidden_tech_confirmation.cc +++ b/src/mod/features/forbidden_tech.cc @@ -1,9 +1,9 @@ // auto_confirm_ft_upgrade: answers the forbidden tech upgrade confirmation with Confirm instead of showing it. #include "config.h" -#include "patches/patches.h" +#include "features/features.h" -#include "prime/ui.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/parts/forbidden_tech_ship_name.cc b/src/mod/features/forbidden_tech_ship_name.cc similarity index 98% rename from mods/src/patches/parts/forbidden_tech_ship_name.cc rename to src/mod/features/forbidden_tech_ship_name.cc index 067b7b697..617338124 100644 --- a/mods/src/patches/parts/forbidden_tech_ship_name.cc +++ b/src/mod/features/forbidden_tech_ship_name.cc @@ -2,11 +2,11 @@ // panel, including ships without a dock. Inventory tiles keep their native dock badges. #include "config.h" -#include "patches/patches.h" +#include "features/features.h" -#include "prime/fleet.h" -#include "prime/inventory.h" -#include "prime/ui.h" +#include "game/fleet.h" +#include "game/inventory.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/parts/game_config.cc b/src/mod/features/game_config.cc similarity index 94% rename from mods/src/patches/parts/game_config.cc rename to src/mod/features/game_config.cc index c5fba9320..ae8fece20 100644 --- a/mods/src/patches/parts/game_config.cc +++ b/src/mod/features/game_config.cc @@ -2,9 +2,9 @@ // loads. #include "config.h" -#include "patches/patches.h" +#include "features/features.h" -#include "prime/Hub.h" +#include "game/app.h" #include #include diff --git a/mods/src/patches/parts/haven.cc b/src/mod/features/haven.cc similarity index 99% rename from mods/src/patches/parts/haven.cc rename to src/mod/features/haven.cc index 0f7a7ba2c..f1e0545eb 100644 --- a/mods/src/patches/parts/haven.cc +++ b/src/mod/features/haven.cc @@ -1,6 +1,6 @@ // Haven's extended camera range, road surface depth and help-history ordering. -#include "prime/haven.h" -#include "patches/patches.h" +#include "game/haven.h" +#include "features/features.h" #include #include diff --git a/mods/src/patches/parts/hotkeys.cc b/src/mod/features/hotkeys.cc similarity index 98% rename from mods/src/patches/parts/hotkeys.cc rename to src/mod/features/hotkeys.cc index 461310c2d..5bec8490f 100644 --- a/mods/src/patches/parts/hotkeys.cc +++ b/src/mod/features/hotkeys.cc @@ -3,11 +3,11 @@ // shortcuts live with their features: screens.cc, fleet_actions.cc, chat.cc, camera.cc. #include "config.h" -#include "patches/patches.h" -#include "patches/shortcuts.h" +#include "features/features.h" +#include "shortcuts.h" -#include "prime/Hub.h" -#include "prime/ui.h" +#include "game/app.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/parts/instant_warp.cc b/src/mod/features/instant_warp.cc similarity index 97% rename from mods/src/patches/parts/instant_warp.cc rename to src/mod/features/instant_warp.cc index 4236755d3..5e6bc333d 100644 --- a/mods/src/patches/parts/instant_warp.cc +++ b/src/mod/features/instant_warp.cc @@ -2,13 +2,13 @@ // previews that answer on the system card's visit button, and the shortcut that cycles the default. #include "config.h" -#include "patches/patches.h" -#include "str_utils.h" +#include "features/features.h" +#include "text.h" -#include "prime/fleet.h" -#include "prime/navigation.h" -#include "prime/ui.h" -#include "prime/viewers.h" +#include "game/fleet.h" +#include "game/navigation.h" +#include "game/ui.h" +#include "game/viewers.h" #include #include diff --git a/mods/src/patches/parts/interior_zoom.cc b/src/mod/features/interior_zoom.cc similarity index 98% rename from mods/src/patches/parts/interior_zoom.cc rename to src/mod/features/interior_zoom.cc index 0733cfe6e..629068b51 100644 --- a/mods/src/patches/parts/interior_zoom.cc +++ b/src/mod/features/interior_zoom.cc @@ -1,10 +1,10 @@ #include "config.h" -#include "patches/patches.h" +#include "features/features.h" -#include "prime/navigation.h" +#include "game/navigation.h" #include -#include +#include #include diff --git a/mods/src/patches/parts/shortcut_hints.cc b/src/mod/features/keybind_badges.cc similarity index 97% rename from mods/src/patches/parts/shortcut_hints.cc rename to src/mod/features/keybind_badges.cc index 87e75726e..4ecbc099f 100644 --- a/mods/src/patches/parts/shortcut_hints.cc +++ b/src/mod/features/keybind_badges.cc @@ -3,14 +3,14 @@ // action that replaces it. #include "config.h" -#include "patches/patches.h" -#include "patches/ship_shortcut_hint.h" -#include "patches/shortcuts.h" -#include "prime/fleet.h" -#include "str_utils.h" +#include "features/features.h" +#include "features/ship_shortcut_hint.h" +#include "game/fleet.h" +#include "shortcuts.h" +#include "text.h" #include -#include "prime/ui.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/parts/loading_screen.cc b/src/mod/features/loading_screens.cc similarity index 99% rename from mods/src/patches/parts/loading_screen.cc rename to src/mod/features/loading_screens.cc index 905adb8b4..19a917adf 100644 --- a/mods/src/patches/parts/loading_screen.cc +++ b/src/mod/features/loading_screens.cc @@ -2,11 +2,11 @@ // loading tips. They share the embedded images and reset together when the game reloads. #include "config.h" -#include "patches/patches.h" +#include "features/features.h" #include "version.h" -#include "prime/loading.h" -#include "prime/ui.h" +#include "game/loading.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/parts/daily_faction_bulk_claim.cc b/src/mod/features/missions.cc similarity index 98% rename from mods/src/patches/parts/daily_faction_bulk_claim.cc rename to src/mod/features/missions.cc index 30a0742f0..c2769f5d0 100644 --- a/mods/src/patches/parts/daily_faction_bulk_claim.cc +++ b/src/mod/features/missions.cc @@ -3,11 +3,11 @@ // the chosen factions' dailies, show only their icons next to the toggle, and can switch the toggle on. #include "config.h" -#include "patches/patches.h" -#include "str_utils.h" +#include "features/features.h" +#include "text.h" -#include "prime/hud.h" -#include "prime/missions.h" +#include "game/hud.h" +#include "game/missions.h" #include #include diff --git a/mods/src/patches/parts/notification_audio.cc b/src/mod/features/notification_audio.cc similarity index 98% rename from mods/src/patches/parts/notification_audio.cc rename to src/mod/features/notification_audio.cc index 9141272af..968ab6e47 100644 --- a/mods/src/patches/parts/notification_audio.cc +++ b/src/mod/features/notification_audio.cc @@ -1,6 +1,6 @@ // Named notification cues and their generated mono PCM WAV data. -#include "patches/parts/notification_audio.h" -#include "str_utils.h" +#include "features/notification_audio.h" +#include "text.h" #include diff --git a/mods/src/patches/parts/notification_audio.h b/src/mod/features/notification_audio.h similarity index 100% rename from mods/src/patches/parts/notification_audio.h rename to src/mod/features/notification_audio.h diff --git a/mods/src/patches/parts/notification_audio_mac.mm b/src/mod/features/notification_audio_mac.mm similarity index 100% rename from mods/src/patches/parts/notification_audio_mac.mm rename to src/mod/features/notification_audio_mac.mm diff --git a/mods/src/patches/parts/officer_sort.cc b/src/mod/features/officers.cc similarity index 98% rename from mods/src/patches/parts/officer_sort.cc rename to src/mod/features/officers.cc index 12369bd1f..b28219dac 100644 --- a/mods/src/patches/parts/officer_sort.cc +++ b/src/mod/features/officers.cc @@ -2,10 +2,10 @@ // and the officer assignment screen, by appending it to the sort menus after the game builds them. #include "config.h" -#include "patches/patches.h" -#include "str_utils.h" +#include "features/features.h" +#include "text.h" -#include "prime/officers.h" +#include "game/officers.h" #include #include diff --git a/mods/src/patches/parts/pinned_ship_click.cc b/src/mod/features/pinned_ship_click.cc similarity index 97% rename from mods/src/patches/parts/pinned_ship_click.cc rename to src/mod/features/pinned_ship_click.cc index 1e7d816da..0f25c2d2e 100644 --- a/mods/src/patches/parts/pinned_ship_click.cc +++ b/src/mod/features/pinned_ship_click.cc @@ -1,12 +1,12 @@ #include "config.h" +#include "features/features.h" #include "file.h" -#include "patches/patches.h" -#include "str_utils.h" +#include "text.h" +#include "game/fleet.h" +#include "game/ui.h" #include "pinned_ship_click.h" -#include "prime/fleet.h" -#include "prime/ui.h" #include "ship_tile_click.h" #include diff --git a/mods/src/patches/parts/pinned_ship_click.h b/src/mod/features/pinned_ship_click.h similarity index 73% rename from mods/src/patches/parts/pinned_ship_click.h rename to src/mod/features/pinned_ship_click.h index 185a36acf..361bddaa8 100644 --- a/mods/src/patches/parts/pinned_ship_click.h +++ b/src/mod/features/pinned_ship_click.h @@ -1,5 +1,5 @@ #pragma once -#include "prime/fleet.h" +#include "game/fleet.h" void PinShipClickOnTileClicked(FleetPlayerData* ship); diff --git a/mods/src/patches/parts/queue_address_guard.cc b/src/mod/features/queue_address_guard.cc similarity index 97% rename from mods/src/patches/parts/queue_address_guard.cc rename to src/mod/features/queue_address_guard.cc index 5cfaec4eb..868da242a 100644 --- a/mods/src/patches/parts/queue_address_guard.cc +++ b/src/mod/features/queue_address_guard.cc @@ -1,6 +1,6 @@ -#include "patches/patches.h" -#include "patches/queue_address_guard_policy.h" -#include "prime/queues.h" +#include "features/features.h" +#include "features/queue_address_guard_policy.h" +#include "game/queues.h" #include #include #include diff --git a/mods/src/patches/queue_address_guard_policy.h b/src/mod/features/queue_address_guard_policy.h similarity index 100% rename from mods/src/patches/queue_address_guard_policy.h rename to src/mod/features/queue_address_guard_policy.h diff --git a/mods/src/patches/parts/reveal_confirmation.cc b/src/mod/features/reveal_confirmation.cc similarity index 95% rename from mods/src/patches/parts/reveal_confirmation.cc rename to src/mod/features/reveal_confirmation.cc index 34b1b9dd7..b21d73cb6 100644 --- a/mods/src/patches/parts/reveal_confirmation.cc +++ b/src/mod/features/reveal_confirmation.cc @@ -1,10 +1,10 @@ #include "config.h" -#include "patches/patches.h" +#include "features/features.h" #include -#include "prime/fleet.h" -#include "prime/ui.h" +#include "game/fleet.h" +#include "game/ui.h" #include diff --git a/mods/src/patches/parts/screens.cc b/src/mod/features/screens.cc similarity index 98% rename from mods/src/patches/parts/screens.cc rename to src/mod/features/screens.cc index 9221ff1ff..a58408b49 100644 --- a/mods/src/patches/parts/screens.cc +++ b/src/mod/features/screens.cc @@ -3,15 +3,15 @@ // focusing the search box. #include "config.h" -#include "patches/patches.h" -#include "patches/shortcuts.h" - -#include "prime/Hub.h" -#include "prime/fleet.h" -#include "prime/inventory.h" -#include "prime/navigation.h" -#include "prime/officers.h" -#include "prime/ui.h" +#include "features/features.h" +#include "shortcuts.h" + +#include "game/app.h" +#include "game/fleet.h" +#include "game/inventory.h" +#include "game/navigation.h" +#include "game/officers.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/ship_shortcut_hint.h b/src/mod/features/ship_shortcut_hint.h similarity index 100% rename from mods/src/patches/ship_shortcut_hint.h rename to src/mod/features/ship_shortcut_hint.h diff --git a/mods/src/patches/parts/ship_tile_click.cc b/src/mod/features/ship_tile_click.cc similarity index 97% rename from mods/src/patches/parts/ship_tile_click.cc rename to src/mod/features/ship_tile_click.cc index ca1643305..540af2963 100644 --- a/mods/src/patches/parts/ship_tile_click.cc +++ b/src/mod/features/ship_tile_click.cc @@ -3,8 +3,8 @@ #include "config.h" #include "double_click_assign_ship.h" +#include "game/fleet.h" #include "pinned_ship_click.h" -#include "prime/fleet.h" #include diff --git a/mods/src/patches/parts/ship_tile_click.h b/src/mod/features/ship_tile_click.h similarity index 100% rename from mods/src/patches/parts/ship_tile_click.h rename to src/mod/features/ship_tile_click.h diff --git a/mods/src/patches/parts/open_bulk_claim_gifts.cc b/src/mod/features/shop.cc similarity index 99% rename from mods/src/patches/parts/open_bulk_claim_gifts.cc rename to src/mod/features/shop.cc index dd87acfe8..87d737a47 100644 --- a/mods/src/patches/parts/open_bulk_claim_gifts.cc +++ b/src/mod/features/shop.cc @@ -3,9 +3,9 @@ // disable_exchange_all on the artifact shards popup. #include "config.h" -#include "patches/patches.h" +#include "features/features.h" -#include "prime/inventory.h" +#include "game/inventory.h" #include #include diff --git a/mods/src/patches/parts/thin_queue_protection.cc b/src/mod/features/thin_queue_protection.cc similarity index 98% rename from mods/src/patches/parts/thin_queue_protection.cc rename to src/mod/features/thin_queue_protection.cc index 705cd356a..41766efe1 100644 --- a/mods/src/patches/parts/thin_queue_protection.cc +++ b/src/mod/features/thin_queue_protection.cc @@ -1,10 +1,10 @@ -#include "patches/action_queue_guard_policy.h" -#include "patches/patches.h" +#include "features/action_queue_guard_policy.h" +#include "features/features.h" #include // Port of the active v2.1.0-guffa.10 guard, not the dormant completion repair. // Shared 64-bit managed layout; incompatible runtime contracts leave the feature unavailable. -#include "prime/queues.h" +#include "game/queues.h" #include #include #include diff --git a/mods/src/patches/parts/toast_text.h b/src/mod/features/toast_text.h similarity index 100% rename from mods/src/patches/parts/toast_text.h rename to src/mod/features/toast_text.h diff --git a/mods/src/patches/parts/toasts.cc b/src/mod/features/toasts.cc similarity index 99% rename from mods/src/patches/parts/toasts.cc rename to src/mod/features/toasts.cc index 36e8265ee..d4e1655e0 100644 --- a/mods/src/patches/parts/toasts.cc +++ b/src/mod/features/toasts.cc @@ -2,13 +2,13 @@ // Windows notifications, with a readable body for battle results. #include "config.h" -#include "patches/patches.h" -#include "patches/parts/toast_text.h" -#include "str_utils.h" +#include "features/features.h" +#include "features/toast_text.h" +#include "text.h" -#include "prime/fleet.h" -#include "prime/server.h" -#include "prime/ui.h" +#include "game/fleet.h" +#include "game/server.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/parts/tracked_objects.cc b/src/mod/features/tracked_objects.cc similarity index 86% rename from mods/src/patches/parts/tracked_objects.cc rename to src/mod/features/tracked_objects.cc index a5d7b6f44..c1bab45bd 100644 --- a/mods/src/patches/parts/tracked_objects.cc +++ b/src/mod/features/tracked_objects.cc @@ -1,15 +1,15 @@ // The game screens and widgets the shortcuts and labels look up through unity::Newest and unity::Instances. A class // left out here is never found there. -#include "patches/patches.h" +#include "features/features.h" -#include "prime/chat.h" -#include "prime/fleet.h" -#include "prime/inventory.h" -#include "prime/navigation.h" -#include "prime/officers.h" -#include "prime/ui.h" -#include "prime/viewers.h" +#include "game/chat.h" +#include "game/fleet.h" +#include "game/inventory.h" +#include "game/navigation.h" +#include "game/officers.h" +#include "game/ui.h" +#include "game/viewers.h" #include diff --git a/mods/src/patches/parts/ui_scale.cc b/src/mod/features/ui_scale.cc similarity index 97% rename from mods/src/patches/parts/ui_scale.cc rename to src/mod/features/ui_scale.cc index 0a91104ca..bdf800a9b 100644 --- a/mods/src/patches/parts/ui_scale.cc +++ b/src/mod/features/ui_scale.cc @@ -1,11 +1,11 @@ // UI, object viewer, and system ship scaling, and the hotkeys that adjust them at runtime. #include "config.h" -#include "patches/patches.h" -#include "str_utils.h" +#include "features/features.h" +#include "text.h" -#include "prime/fleet.h" -#include "prime/ui.h" +#include "game/fleet.h" +#include "game/ui.h" #include #include diff --git a/mods/src/patches/parts/window.cc b/src/mod/features/window.cc similarity index 98% rename from mods/src/patches/parts/window.cc rename to src/mod/features/window.cc index ccafe2c87..f7017b1d4 100644 --- a/mods/src/patches/parts/window.cc +++ b/src/mod/features/window.cc @@ -1,12 +1,12 @@ // The game window on Windows: free resizing, the -ccm profile in the title bar, allow_cursor, and the monitor's DPI // scale. -#include "patches/patches.h" +#include "features/features.h" #if _WIN32 #include "config.h" #include "file.h" -#include "prime/Hub.h" +#include "game/app.h" #include #include diff --git a/mods/src/file.cc b/src/mod/file.cc similarity index 100% rename from mods/src/file.cc rename to src/mod/file.cc diff --git a/mods/src/file.h b/src/mod/file.h similarity index 100% rename from mods/src/file.h rename to src/mod/file.h diff --git a/mods/src/file_macos.mm b/src/mod/file_macos.mm similarity index 100% rename from mods/src/file_macos.mm rename to src/mod/file_macos.mm diff --git a/mods/src/prime/Hub.h b/src/mod/game/app.h similarity index 100% rename from mods/src/prime/Hub.h rename to src/mod/game/app.h diff --git a/mods/src/prime/chat.h b/src/mod/game/chat.h similarity index 99% rename from mods/src/prime/chat.h rename to src/mod/game/chat.h index c1b3d58eb..e28338d9f 100644 --- a/mods/src/prime/chat.h +++ b/src/mod/game/chat.h @@ -2,7 +2,7 @@ // Chat manager and chat view controllers. -#include "prime/ui.h" +#include "ui.h" #include diff --git a/mods/src/prime/fleet.h b/src/mod/game/fleet.h similarity index 99% rename from mods/src/prime/fleet.h rename to src/mod/game/fleet.h index 7c8ef6aeb..fe5084a80 100644 --- a/mods/src/prime/fleet.h +++ b/src/mod/game/fleet.h @@ -3,9 +3,9 @@ // Player fleets and ships: fleet data and managers, the fleet bar, the action queue, and the ship management screens // and dock. -#include "prime/Hub.h" -#include "prime/server.h" -#include "prime/ui.h" +#include "app.h" +#include "server.h" +#include "ui.h" #include diff --git a/mods/src/prime/haven.h b/src/mod/game/haven.h similarity index 99% rename from mods/src/prime/haven.h rename to src/mod/game/haven.h index 4513e750f..749ca1334 100644 --- a/mods/src/prime/haven.h +++ b/src/mod/game/haven.h @@ -1,7 +1,7 @@ #pragma once // Haven's camera providers, blend frames and help history. -#include "prime/ui.h" +#include "ui.h" #include #include diff --git a/mods/src/prime/hud.h b/src/mod/game/hud.h similarity index 99% rename from mods/src/prime/hud.h rename to src/mod/game/hud.h index 4639af05a..f9df1e4e8 100644 --- a/mods/src/prime/hud.h +++ b/src/mod/game/hud.h @@ -3,7 +3,7 @@ // The HUD around the space views: the mission buttons, the faction and system panel, the alliance drawer, and the // galactic anomaly the viewed system may have. -#include "prime/ui.h" +#include "ui.h" #include diff --git a/mods/src/prime/inventory.h b/src/mod/game/inventory.h similarity index 99% rename from mods/src/prime/inventory.h rename to src/mod/game/inventory.h index 215be81c3..0af6fd59e 100644 --- a/mods/src/prime/inventory.h +++ b/src/mod/game/inventory.h @@ -2,8 +2,8 @@ // The inventory, its use and purchase popups, and the shop and gift screens. -#include "prime/server.h" -#include "prime/ui.h" +#include "server.h" +#include "ui.h" #include diff --git a/mods/src/prime/loading.h b/src/mod/game/loading.h similarity index 98% rename from mods/src/prime/loading.h rename to src/mod/game/loading.h index 29d6b175d..a8c213aa1 100644 --- a/mods/src/prime/loading.h +++ b/src/mod/game/loading.h @@ -2,7 +2,7 @@ // The login screen, the transition screen shown between sections, and their loading tips and slide shows. -#include "prime/ui.h" +#include "ui.h" #include diff --git a/mods/src/prime/missions.h b/src/mod/game/missions.h similarity index 96% rename from mods/src/prime/missions.h rename to src/mod/game/missions.h index 062d1c8ef..a9ea37bca 100644 --- a/mods/src/prime/missions.h +++ b/src/mod/game/missions.h @@ -2,7 +2,7 @@ // The missions screen and its daily goals. -#include "prime/server.h" +#include "server.h" #include #include diff --git a/mods/src/patches/native_hook_extent.cc b/src/mod/game/native_hook_extent.cc similarity index 99% rename from mods/src/patches/native_hook_extent.cc rename to src/mod/game/native_hook_extent.cc index f17e3fe77..aeddfd088 100644 --- a/mods/src/patches/native_hook_extent.cc +++ b/src/mod/game/native_hook_extent.cc @@ -1,4 +1,4 @@ -#include "patches/native_hook_extent.h" +#include "game/native_hook_extent.h" #if __APPLE__ #include diff --git a/mods/src/patches/native_hook_extent.h b/src/mod/game/native_hook_extent.h similarity index 100% rename from mods/src/patches/native_hook_extent.h rename to src/mod/game/native_hook_extent.h diff --git a/mods/src/prime/navigation.h b/src/mod/game/navigation.h similarity index 99% rename from mods/src/prime/navigation.h rename to src/mod/game/navigation.h index 7a4efb1f1..bbe2f06e4 100644 --- a/mods/src/prime/navigation.h +++ b/src/mod/game/navigation.h @@ -2,9 +2,9 @@ // System and galaxy navigation: camera zoom and pan, LOD, sections, bookmarks, course prompts. -#include "prime/Hub.h" -#include "prime/fleet.h" -#include "prime/ui.h" +#include "app.h" +#include "fleet.h" +#include "ui.h" #include diff --git a/mods/src/prime/officers.h b/src/mod/game/officers.h similarity index 99% rename from mods/src/prime/officers.h rename to src/mod/game/officers.h index fa390e9e5..168c233f4 100644 --- a/mods/src/prime/officers.h +++ b/src/mod/game/officers.h @@ -2,7 +2,7 @@ // The officer roster and officer assignment screens, and the sort options their lists offer. -#include "prime/ui.h" +#include "ui.h" #include diff --git a/mods/src/prime/proto/Digit.Client.Localization.proto b/src/mod/game/proto/Digit.Client.Localization.proto similarity index 100% rename from mods/src/prime/proto/Digit.Client.Localization.proto rename to src/mod/game/proto/Digit.Client.Localization.proto diff --git a/mods/src/prime/proto/Digit.Client.SaveSystem.proto b/src/mod/game/proto/Digit.Client.SaveSystem.proto similarity index 100% rename from mods/src/prime/proto/Digit.Client.SaveSystem.proto rename to src/mod/game/proto/Digit.Client.SaveSystem.proto diff --git a/mods/src/prime/proto/Digit.Engine.Attributes.proto b/src/mod/game/proto/Digit.Engine.Attributes.proto similarity index 100% rename from mods/src/prime/proto/Digit.Engine.Attributes.proto rename to src/mod/game/proto/Digit.Engine.Attributes.proto diff --git a/mods/src/prime/proto/Digit.Networking.Core.proto b/src/mod/game/proto/Digit.Networking.Core.proto similarity index 100% rename from mods/src/prime/proto/Digit.Networking.Core.proto rename to src/mod/game/proto/Digit.Networking.Core.proto diff --git a/mods/src/prime/proto/Digit.Platform.Models.proto b/src/mod/game/proto/Digit.Platform.Models.proto similarity index 100% rename from mods/src/prime/proto/Digit.Platform.Models.proto rename to src/mod/game/proto/Digit.Platform.Models.proto diff --git a/mods/src/prime/proto/Digit.Prime.Bookmarks.proto b/src/mod/game/proto/Digit.Prime.Bookmarks.proto similarity index 100% rename from mods/src/prime/proto/Digit.Prime.Bookmarks.proto rename to src/mod/game/proto/Digit.Prime.Bookmarks.proto diff --git a/mods/src/prime/proto/Digit.Prime.Inventories.proto b/src/mod/game/proto/Digit.Prime.Inventories.proto similarity index 100% rename from mods/src/prime/proto/Digit.Prime.Inventories.proto rename to src/mod/game/proto/Digit.Prime.Inventories.proto diff --git a/mods/src/prime/proto/Digit.Prime.Missions.proto b/src/mod/game/proto/Digit.Prime.Missions.proto similarity index 100% rename from mods/src/prime/proto/Digit.Prime.Missions.proto rename to src/mod/game/proto/Digit.Prime.Missions.proto diff --git a/mods/src/prime/proto/Digit.Prime.NewFlags.proto b/src/mod/game/proto/Digit.Prime.NewFlags.proto similarity index 100% rename from mods/src/prime/proto/Digit.Prime.NewFlags.proto rename to src/mod/game/proto/Digit.Prime.NewFlags.proto diff --git a/mods/src/prime/proto/Digit.Prime.PersistentPrefs.proto b/src/mod/game/proto/Digit.Prime.PersistentPrefs.proto similarity index 100% rename from mods/src/prime/proto/Digit.Prime.PersistentPrefs.proto rename to src/mod/game/proto/Digit.Prime.PersistentPrefs.proto diff --git a/mods/src/prime/proto/Digit.Prime.TerritoryCapture.proto b/src/mod/game/proto/Digit.Prime.TerritoryCapture.proto similarity index 100% rename from mods/src/prime/proto/Digit.Prime.TerritoryCapture.proto rename to src/mod/game/proto/Digit.Prime.TerritoryCapture.proto diff --git a/mods/src/prime/proto/Digit.PrimePlatform.Content.proto b/src/mod/game/proto/Digit.PrimePlatform.Content.proto similarity index 100% rename from mods/src/prime/proto/Digit.PrimePlatform.Content.proto rename to src/mod/game/proto/Digit.PrimePlatform.Content.proto diff --git a/mods/src/prime/proto/Digit.PrimePlatform.Models.proto b/src/mod/game/proto/Digit.PrimePlatform.Models.proto similarity index 100% rename from mods/src/prime/proto/Digit.PrimePlatform.Models.proto rename to src/mod/game/proto/Digit.PrimePlatform.Models.proto diff --git a/mods/src/prime/proto/Digit.PrimeServer.Models.proto b/src/mod/game/proto/Digit.PrimeServer.Models.proto similarity index 100% rename from mods/src/prime/proto/Digit.PrimeServer.Models.proto rename to src/mod/game/proto/Digit.PrimeServer.Models.proto diff --git a/mods/src/prime/proto/stfc.proto b/src/mod/game/proto/stfc.proto similarity index 100% rename from mods/src/prime/proto/stfc.proto rename to src/mod/game/proto/stfc.proto diff --git a/mods/src/prime/proto/stfc.sync.proto b/src/mod/game/proto/stfc.sync.proto similarity index 100% rename from mods/src/prime/proto/stfc.sync.proto rename to src/mod/game/proto/stfc.sync.proto diff --git a/mods/src/prime/queues.h b/src/mod/game/queues.h similarity index 99% rename from mods/src/prime/queues.h rename to src/mod/game/queues.h index fb0e76d7c..69dd26fd6 100644 --- a/mods/src/prime/queues.h +++ b/src/mod/game/queues.h @@ -1,8 +1,8 @@ #pragma once // Checked queue metadata and storage access. Unknown layouts retain native behavior. -#include "patches/action_queue_guard_policy.h" -#include "patches/parts/action_queue.h" -#include "patches/queue_address_guard_policy.h" +#include "features/action_queue.h" +#include "features/action_queue_guard_policy.h" +#include "features/queue_address_guard_policy.h" #include #include #include diff --git a/mods/src/prime/server.h b/src/mod/game/server.h similarity index 100% rename from mods/src/prime/server.h rename to src/mod/game/server.h diff --git a/mods/src/prime/ui.h b/src/mod/game/ui.h similarity index 100% rename from mods/src/prime/ui.h rename to src/mod/game/ui.h diff --git a/mods/src/prime/viewers.h b/src/mod/game/viewers.h similarity index 98% rename from mods/src/prime/viewers.h rename to src/mod/game/viewers.h index 439d4e5cb..f0b7fdb47 100644 --- a/mods/src/prime/viewers.h +++ b/src/mod/game/viewers.h @@ -2,9 +2,9 @@ // Object viewer cards shown for targets in space, and their scan/engage buttons. -#include "prime/fleet.h" -#include "prime/navigation.h" -#include "prime/ui.h" +#include "fleet.h" +#include "navigation.h" +#include "ui.h" #include diff --git a/mods/src/patches/patches.cc b/src/mod/mod.cc similarity index 99% rename from mods/src/patches/patches.cc rename to src/mod/mod.cc index 2a7ba3bf3..bd312ba52 100644 --- a/mods/src/patches/patches.cc +++ b/src/mod/mod.cc @@ -1,11 +1,11 @@ #include "mod.h" #include "config.h" -#include "patches/patches.h" +#include "features/features.h" #include "file.h" #include "version.h" -#include "prime/ui.h" +#include "game/ui.h" #include #include diff --git a/mods/src/mod.h b/src/mod/mod.h similarity index 100% rename from mods/src/mod.h rename to src/mod/mod.h diff --git a/mods/src/patches/parts/embedded_cc_logo_image.h b/src/mod/patches/parts/embedded_cc_logo_image.h similarity index 100% rename from mods/src/patches/parts/embedded_cc_logo_image.h rename to src/mod/patches/parts/embedded_cc_logo_image.h diff --git a/mods/src/patches/parts/embedded_loading_image.h b/src/mod/patches/parts/embedded_loading_image.h similarity index 100% rename from mods/src/patches/parts/embedded_loading_image.h rename to src/mod/patches/parts/embedded_loading_image.h diff --git a/mods/src/patches/parts/embedded_logo_image.h b/src/mod/patches/parts/embedded_logo_image.h similarity index 100% rename from mods/src/patches/parts/embedded_logo_image.h rename to src/mod/patches/parts/embedded_logo_image.h diff --git a/mods/src/patches/shortcuts.cc b/src/mod/shortcuts.cc similarity index 99% rename from mods/src/patches/shortcuts.cc rename to src/mod/shortcuts.cc index cc80010d0..c91826eff 100644 --- a/mods/src/patches/shortcuts.cc +++ b/src/mod/shortcuts.cc @@ -1,6 +1,6 @@ -#include "patches/shortcuts.h" +#include "shortcuts.h" -#include "str_utils.h" +#include "text.h" #include #include diff --git a/mods/src/shortcuts.def b/src/mod/shortcuts.def similarity index 100% rename from mods/src/shortcuts.def rename to src/mod/shortcuts.def diff --git a/mods/src/patches/shortcuts.h b/src/mod/shortcuts.h similarity index 100% rename from mods/src/patches/shortcuts.h rename to src/mod/shortcuts.h diff --git a/mods/src/patches/parts/sync/battlelogs.cc b/src/mod/sync/battlelogs.cc similarity index 99% rename from mods/src/patches/parts/sync/battlelogs.cc rename to src/mod/sync/battlelogs.cc index d6e3a271f..cc3cf35c3 100644 --- a/mods/src/patches/parts/sync/battlelogs.cc +++ b/src/mod/sync/battlelogs.cc @@ -1,7 +1,7 @@ // Battle logs: the game only sends battle headers, so each new battle's journal is fetched from the game server // with the participants' player and alliance names resolved, then uploaded. -#include "patches/parts/sync/sync.h" +#include "sync/sync.h" #include "version.h" #include diff --git a/mods/src/patches/fleet_watch.cc b/src/mod/sync/fleet_watch.cc similarity index 99% rename from mods/src/patches/fleet_watch.cc rename to src/mod/sync/fleet_watch.cc index 6acd07c4f..fd0f83f2e 100644 --- a/mods/src/patches/fleet_watch.cc +++ b/src/mod/sync/fleet_watch.cc @@ -1,6 +1,6 @@ -#include "patches/fleet_watch.h" +#include "sync/fleet_watch.h" -#include +#include "game/fleet.h" #include diff --git a/mods/src/patches/fleet_watch.h b/src/mod/sync/fleet_watch.h similarity index 98% rename from mods/src/patches/fleet_watch.h rename to src/mod/sync/fleet_watch.h index fd01b337b..a137c9a4a 100644 --- a/mods/src/patches/fleet_watch.h +++ b/src/mod/sync/fleet_watch.h @@ -1,6 +1,6 @@ #pragma once -#include +#include "game/fleet.h" namespace fleet_watch { diff --git a/mods/src/patches/parts/sync/fleets.cc b/src/mod/sync/fleets.cc similarity index 99% rename from mods/src/patches/parts/sync/fleets.cc rename to src/mod/sync/fleets.cc index 046c4a32e..e0d8b32a7 100644 --- a/mods/src/patches/parts/sync/fleets.cc +++ b/src/mod/sync/fleets.cc @@ -2,11 +2,11 @@ // as a first sync, and late re-reads after server updates. Everything that reads the game runs on the game thread // and only publishes; uploads stay on the target workers. -#include "patches/parts/sync/sync.h" +#include "sync/sync.h" -#include "patches/fleet_watch.h" +#include "sync/fleet_watch.h" -#include +#include "game/fleet.h" #include #include diff --git a/mods/src/patches/parts/sync/records.cc b/src/mod/sync/records.cc similarity index 99% rename from mods/src/patches/parts/sync/records.cc rename to src/mod/sync/records.cc index 90f785296..ab41856a1 100644 --- a/mods/src/patches/parts/sync/records.cc +++ b/src/mod/sync/records.cc @@ -1,6 +1,6 @@ // Game responses become canonical wire records. Delivery owns comparison, removal and initial-sync state. -#include "patches/parts/sync/sync.h" -#include "str_utils.h" +#include "sync/sync.h" +#include "text.h" #include #include #include diff --git a/mods/src/patches/parts/sync/state.cc b/src/mod/sync/state.cc similarity index 99% rename from mods/src/patches/parts/sync/state.cc rename to src/mod/sync/state.cc index b93db361c..eb45c58b9 100644 --- a/mods/src/patches/parts/sync/state.cc +++ b/src/mod/sync/state.cc @@ -1,5 +1,5 @@ // Canonical record state and per-target acknowledgement, without threads or HTTP. -#include "patches/parts/sync/sync.h" +#include "sync/sync.h" #include namespace data_sync diff --git a/mods/src/patches/parts/sync/sync.cc b/src/mod/sync/sync.cc similarity index 98% rename from mods/src/patches/parts/sync/sync.cc rename to src/mod/sync/sync.cc index 79fe63ab5..f1e3ae8d1 100644 --- a/mods/src/patches/parts/sync/sync.cc +++ b/src/mod/sync/sync.cc @@ -2,13 +2,13 @@ // which turns them into records for the sync targets (records.cc), uploaded by upload.cc. It also captures the game's // session for the battle-log requests. -#include "patches/parts/sync/sync.h" +#include "sync/sync.h" -#include "patches/patches.h" -#include "str_utils.h" +#include "features/features.h" +#include "text.h" -#include "prime/Hub.h" -#include "prime/server.h" +#include "game/app.h" +#include "game/server.h" #include #include diff --git a/mods/src/patches/parts/sync/sync.h b/src/mod/sync/sync.h similarity index 99% rename from mods/src/patches/parts/sync/sync.h rename to src/mod/sync/sync.h index faaf0ef1f..5013b2500 100644 --- a/mods/src/patches/parts/sync/sync.h +++ b/src/mod/sync/sync.h @@ -5,7 +5,7 @@ #include "config.h" -#include "prime/server.h" +#include "game/server.h" #include #include diff --git a/mods/src/patches/parts/sync/upload.cc b/src/mod/sync/upload.cc similarity index 99% rename from mods/src/patches/parts/sync/upload.cc rename to src/mod/sync/upload.cc index e5b8dcac3..f6a1ea08a 100644 --- a/mods/src/patches/parts/sync/upload.cc +++ b/src/mod/sync/upload.cc @@ -1,5 +1,5 @@ // One owner for canonical records, target cursors and session identity. HTTP runs outside its lock. -#include "patches/parts/sync/sync.h" +#include "sync/sync.h" #include "version.h" #include #include diff --git a/mods/src/str_utils.h b/src/mod/text.h similarity index 100% rename from mods/src/str_utils.h rename to src/mod/text.h diff --git a/mods/src/version.h b/src/mod/version.h similarity index 100% rename from mods/src/version.h rename to src/mod/version.h diff --git a/mods/xmake.lua b/src/mod/xmake.lua similarity index 92% rename from mods/xmake.lua rename to src/mod/xmake.lua index 8d81cd1b8..c3e9707b8 100644 --- a/mods/xmake.lua +++ b/src/mod/xmake.lua @@ -55,8 +55,8 @@ do ) end - local assets = path.join(target:scriptdir(), "../assets") - local outdir = path.join(target:scriptdir(), "src/features") + local assets = path.join(target:scriptdir(), "../../assets") + local outdir = path.join(target:scriptdir(), "features") local loading = get_config("bg_image") if not loading or loading == "" then @@ -88,11 +88,11 @@ do if is_plat("windows") and os.getenv("STFC_MSVC_SCCACHE") == "1" then add_rules("stfc.cxx.sccache", {override = true}) end - add_files("src/**.cc") + add_files("**.cc") add_deps("unity", {public = true}) add_deps("il2cpp", {public = true}) - add_headerfiles("src/**.h") - add_includedirs("src", { public = true }) + add_headerfiles("**.h") + add_includedirs(".", { public = true }) -- Packages add_packages("spud", "nlohmann_json", "protobuf", "libil2cpp", "toml++", "spdlog", "libcurl", "capstone", "cpr") @@ -101,7 +101,7 @@ do else add_rules("protobuf.cpp") end - add_files("src/prime/proto/*.proto") + add_files("game/proto/*.proto") set_exceptions("cxx") add_defines("NOMINMAX") @@ -122,7 +122,7 @@ do elseif is_plat("macosx") then add_cxflags("-fms-extensions") -- Add Objective-C++ source - add_files("src/**.mm") + add_files("**.mm") -- Link Cocoa framework add_frameworks("Cocoa") end diff --git a/macos-dylib/src/main.cc b/src/platform/macos/dylib/main.cc similarity index 100% rename from macos-dylib/src/main.cc rename to src/platform/macos/dylib/main.cc diff --git a/macos-dylib/xmake.lua b/src/platform/macos/dylib/xmake.lua similarity index 85% rename from macos-dylib/xmake.lua rename to src/platform/macos/dylib/xmake.lua index 5efca0bd6..e3395bcc9 100644 --- a/macos-dylib/xmake.lua +++ b/src/platform/macos/dylib/xmake.lua @@ -1,7 +1,7 @@ target("stfc-community-mod") do set_kind("shared") - add_files("src/*.cc") + add_files("*.cc") add_deps("mods") set_exceptions("cxx") set_policy("build.optimization.lto", true) diff --git a/macos-loader/src/library_dir.mm b/src/platform/macos/loader/library_dir.mm similarity index 100% rename from macos-loader/src/library_dir.mm rename to src/platform/macos/loader/library_dir.mm diff --git a/macos-loader/src/main.cc b/src/platform/macos/loader/main.cc similarity index 100% rename from macos-loader/src/main.cc rename to src/platform/macos/loader/main.cc diff --git a/macos-loader/xmake.lua b/src/platform/macos/loader/xmake.lua similarity index 61% rename from macos-loader/xmake.lua rename to src/platform/macos/loader/xmake.lua index ef00a84a8..36b25b353 100644 --- a/macos-loader/xmake.lua +++ b/src/platform/macos/loader/xmake.lua @@ -1,9 +1,9 @@ target("stfc-community-mod-loader") do set_kind("binary") - add_files("src/*.cc") - add_files("src/*.mm") - add_headerfiles("src/*.h") + add_files("*.cc") + add_files("*.mm") + add_headerfiles("*.h") add_frameworks("Foundation") add_packages("inifile-cpp") end diff --git a/win-proxy-dll/src/main.cc b/src/platform/windows/main.cc similarity index 100% rename from win-proxy-dll/src/main.cc rename to src/platform/windows/main.cc diff --git a/win-proxy-dll/src/version.cc b/src/platform/windows/version.cc similarity index 100% rename from win-proxy-dll/src/version.cc rename to src/platform/windows/version.cc diff --git a/win-proxy-dll/src/version.def b/src/platform/windows/version.def similarity index 100% rename from win-proxy-dll/src/version.def rename to src/platform/windows/version.def diff --git a/win-proxy-dll/src/version.rc b/src/platform/windows/version.rc similarity index 100% rename from win-proxy-dll/src/version.rc rename to src/platform/windows/version.rc diff --git a/win-proxy-dll/xmake.lua b/src/platform/windows/xmake.lua similarity index 81% rename from win-proxy-dll/xmake.lua rename to src/platform/windows/xmake.lua index f41d62e52..d051770a3 100644 --- a/win-proxy-dll/xmake.lua +++ b/src/platform/windows/xmake.lua @@ -2,9 +2,9 @@ target("stfc-community-mod") do set_kind("shared") add_rules("stfc.identity") - add_files("src/*.cc") - add_files("src/*.rc") - add_files("src/version.def") + add_files("*.cc") + add_files("*.rc") + add_files("version.def") add_shflags("/DEF:src/version.def") add_deps("mods") set_exceptions("cxx") diff --git a/tests/action_queue.cc b/tests/action_queue.cc index 39028fb27..7dcafcf13 100644 --- a/tests/action_queue.cc +++ b/tests/action_queue.cc @@ -1,4 +1,4 @@ -#include "patches/parts/action_queue.h" +#include "features/action_queue.h" #include #include #include diff --git a/tests/mod_logic.cc b/tests/mod_logic.cc index b3623fa83..9bcd9f6cb 100644 --- a/tests/mod_logic.cc +++ b/tests/mod_logic.cc @@ -1,10 +1,10 @@ // Settings parsing and shortcut matching, run against production code with Unity input replaced by a fake. #include "config.h" -#include "patches/chat_startup.h" -#include "patches/parts/toast_text.h" -#include "patches/ship_shortcut_hint.h" -#include "patches/shortcuts.h" -#include "str_utils.h" +#include "features/chat_startup.h" +#include "features/ship_shortcut_hint.h" +#include "features/toast_text.h" +#include "shortcuts.h" +#include "text.h" #include #include diff --git a/tests/queue_address_guard.cc b/tests/queue_address_guard.cc index c26580398..1ebaf03fd 100644 --- a/tests/queue_address_guard.cc +++ b/tests/queue_address_guard.cc @@ -1,4 +1,4 @@ -#include "patches/queue_address_guard_policy.h" +#include "features/queue_address_guard_policy.h" #include #include diff --git a/tests/run-action-queue.ps1 b/tests/run-action-queue.ps1 index ab5cdf5b1..3f10aab96 100644 --- a/tests/run-action-queue.ps1 +++ b/tests/run-action-queue.ps1 @@ -5,15 +5,15 @@ $ErrorActionPreference = 'Stop' Push-Location (Split-Path -Parent $PSScriptRoot) try { New-Item -ItemType Directory -Path build -Force | Out-Null - & clang++ -std=c++23 -Imods/src tests/action_queue.cc -o build/action_queue_tests.exe + & clang++ -std=c++23 -Isrc/mod tests/action_queue.cc -o build/action_queue_tests.exe if ($LASTEXITCODE -ne 0) { throw 'Action queue test compilation failed.' } & ./build/action_queue_tests.exe if ($LASTEXITCODE -ne 0) { throw 'Action queue regression failed.' } - & clang++ -std=c++23 -Imods/src tests/thin_queue_protection.cc -o build/thin_queue_protection_tests.exe + & clang++ -std=c++23 -Isrc/mod tests/thin_queue_protection.cc -o build/thin_queue_protection_tests.exe if ($LASTEXITCODE -ne 0) { throw 'Thin Queue Protection test compilation failed.' } & ./build/thin_queue_protection_tests.exe if ($LASTEXITCODE -ne 0) { throw 'Thin Queue Protection regression failed.' } - & clang++ -std=c++23 -Imods/src tests/queue_address_guard.cc -o build/queue_address_guard_tests.exe + & clang++ -std=c++23 -Isrc/mod tests/queue_address_guard.cc -o build/queue_address_guard_tests.exe if ($LASTEXITCODE -ne 0) { throw "Kirshara address guard test compilation failed." } & ./build/queue_address_guard_tests.exe if ($LASTEXITCODE -ne 0) { throw "Kirshara address guard policy regression failed." } diff --git a/tests/sync_logic.cc b/tests/sync_logic.cc index b3ea2aa30..dab8f176e 100644 --- a/tests/sync_logic.cc +++ b/tests/sync_logic.cc @@ -1,5 +1,5 @@ // Production encoders against independent wire fixtures, and delivery against controlled HTTP outcomes/time. -#include "patches/parts/sync/sync.h" +#include "sync/sync.h" #include #include #include diff --git a/tests/thin_queue_protection.cc b/tests/thin_queue_protection.cc index 34ae5330b..91a9e1ccc 100644 --- a/tests/thin_queue_protection.cc +++ b/tests/thin_queue_protection.cc @@ -1,4 +1,4 @@ -#include "patches/action_queue_guard_policy.h" +#include "features/action_queue_guard_policy.h" #include #include diff --git a/tests/unity_tracker.cc b/tests/unity_tracker.cc index cc813bfef..9968fa984 100644 --- a/tests/unity_tracker.cc +++ b/tests/unity_tracker.cc @@ -17,7 +17,7 @@ #undef DO_API #undef DO_API_NO_RETURN -#include "../libs/unity/src/tracker.cc" +#include "../src/libs/unity/src/tracker.cc" #include #include diff --git a/xmake.lua b/xmake.lua index fa30f9877..bd98a6a52 100644 --- a/xmake.lua +++ b/xmake.lua @@ -10,13 +10,13 @@ includes("xmake/rules/stfc_identity.lua") if is_plat("windows") then includes("xmake/dependencies/windows.lua") - includes("win-proxy-dll") + includes("src/platform/windows") add_links("rpcrt4", "runtimeobject") elseif is_plat("macosx") then includes("xmake/dependencies/macos.lua") - includes("macos-dylib") - includes("macos-loader") - includes("macos-launcher") + includes("src/platform/macos/dylib") + includes("src/platform/macos/loader") + includes("src/launcher/macos") end add_rules("mode.debug") @@ -25,17 +25,17 @@ add_rules("mode.releasedbg") includes("xmake/rules/protobuf_sccache.lua") includes("xmake/rules/cxx_sccache.lua") -includes("libs/il2cpp") -includes("libs/unity") -includes("mods") +includes("src/libs/il2cpp") +includes("src/libs/unity") +includes("src/mod") target("il2cpp-bindings-tests") set_kind("binary") set_default(false) set_exceptions("cxx") - add_files("tests/il2cpp_bindings.cc", "libs/unity/src/input.cc") - add_includedirs("libs/unity/include") + add_files("tests/il2cpp_bindings.cc", "src/libs/unity/src/input.cc") + add_includedirs("src/libs/unity/include") add_deps("il2cpp") target("il2cpp-gc-tests") @@ -57,37 +57,37 @@ target("mod-logic-tests") set_kind("binary") set_default(false) set_exceptions("cxx") - add_files("tests/mod_logic.cc", "mods/src/patches/shortcuts.cc", "mods/src/config.cc", "mods/src/file.cc", "mods/src/patches/parts/notification_audio.cc") - add_includedirs("mods/src", "libs/il2cpp/include", "third_party/libil2cpp", "libs/unity/include") + add_files("tests/mod_logic.cc", "src/mod/shortcuts.cc", "src/mod/config.cc", "src/mod/file.cc", "src/mod/features/notification_audio.cc") + add_includedirs("src/mod", "src/libs/il2cpp/include", "third_party/libil2cpp", "src/libs/unity/include") add_packages("spdlog", "toml++") if is_plat("macosx") then add_files("mods/src/file_macos.mm") end if is_plat("macosx") then add_frameworks("Cocoa") - add_files("mods/src/patches/parts/notification_audio_mac.mm") + add_files("src/mod/features/notification_audio_mac.mm") elseif is_plat("windows") then add_syslinks("shell32", "winmm") end - add_defines('STFC_EXAMPLE_SETTINGS="' .. path.translate(path.absolute("example_community_patch_settings_en.toml"), "/") .. '"') + add_defines('STFC_EXAMPLE_SETTINGS="' .. path.translate(path.absolute("docs/configuration/example_community_patch_settings_en.toml"), "/") .. '"') add_defines('STFC_SHORTCUT_DEFAULTS="' .. path.translate(path.absolute("tests/shortcut_defaults.toml"), "/") .. '"') target("sync-logic-tests") set_kind("binary") set_default(false) set_exceptions("cxx") - add_files("tests/sync_logic.cc", "mods/src/patches/parts/sync/records.cc", "mods/src/patches/parts/sync/state.cc") - add_includedirs("mods/src", "libs/il2cpp/include", "third_party/libil2cpp", "libs/unity/include") + add_files("tests/sync_logic.cc", "src/mod/sync/records.cc", "src/mod/sync/state.cc") + add_includedirs("src/mod", "src/libs/il2cpp/include", "third_party/libil2cpp", "src/libs/unity/include") add_packages("protobuf", "spdlog", "toml++", "nlohmann_json") add_rules("protobuf.cpp") - add_files("mods/src/prime/proto/*.proto") + add_files("src/mod/game/proto/*.proto") target("unity-tracker-tests") set_kind("binary") set_default(false) set_exceptions("cxx") add_files("tests/unity_tracker.cc") - add_includedirs("libs/unity/include") + add_includedirs("src/libs/unity/include") add_packages("spud") add_deps("il2cpp") @@ -95,12 +95,12 @@ target("config-reload-tests") set_kind("binary") set_default(false) set_exceptions("cxx") - add_files("tests/config_reload.cc", "mods/src/patches/shortcuts.cc", "mods/src/config.cc", "mods/src/patches/parts/notification_audio.cc") - add_includedirs("mods/src", "libs/il2cpp/include", "third_party/libil2cpp", "libs/unity/include") + add_files("tests/config_reload.cc", "src/mod/shortcuts.cc", "src/mod/config.cc", "src/mod/features/notification_audio.cc") + add_includedirs("src/mod", "src/libs/il2cpp/include", "third_party/libil2cpp", "src/libs/unity/include") add_packages("spdlog", "toml++") if is_plat("macosx") then add_frameworks("Cocoa") - add_files("mods/src/patches/parts/notification_audio_mac.mm") + add_files("src/mod/features/notification_audio_mac.mm") elseif is_plat("windows") then add_syslinks("shell32", "winmm") end @@ -109,6 +109,6 @@ target("launcher-rsync-tests") set_kind("binary") set_default(false) set_exceptions("cxx") - add_files("tests/launcher_rsync.cc", "macos-launcher/src/rsync.cc") - add_includedirs("macos-launcher/src") + add_files("tests/launcher_rsync.cc", "src/launcher/macos/rsync.cc") + add_includedirs("src/launcher/macos") add_packages("librsync")