Repository navigation
See the SDK 2.3.0 release notes and the
SDK 2.3.0 scope record.
SDK 2.3.0 packages the entries below without changing frozen plugin ABI 1.1
(include/sco_api.h and tests/abi_v1.c are byte-identical to 2.2.0). Core, legacy,
core-source and host-source-sc use 2.3.0. The candidate adds the game service tables
game.asop 1.0 and game.contracts 1.0 and grows game.loadout to 1.1, so under the
game-pack policy (a release that adds or grows a game service raises the
minor) the game pack and the optional game-sc overlay move to 0.6.0
(SCO_GAME_PACK_VERSION, was 0.5.0; sco-sdk-game-sc-0.6.0.zip). Nothing below has run in the
game: evidence is macOS local builds and synthetic fixtures. Linux, native Windows, GPU and
real-game acceptance are unproven. The new game capabilities (game.asop.claim_timeout,
game.asop.shard_persisted, game.contracts.stream_radius, game.loadout.weapons,
game.pak.all_files) default OFF, and no production adapter turns them on.
game.loadout1.1: weapon and multitool slots 8-21 (vocabulary only),game.loadout.weaponsOFF (docs, contracts).include/sc_loadout.hadds fourteen slot names afterSC_LOADOUT_SLOT_VISOR:SC_LOADOUT_SLOT_PRIMARY(8) andSC_LOADOUT_SLOT_SIDEARM(9) for the weapons themselves;SC_LOADOUT_SLOT_PRIMARY_OPTIC,_PRIMARY_BARREL,_PRIMARY_UNDERBARREL(10-12) andSC_LOADOUT_SLOT_SIDEARM_OPTIC,_SIDEARM_BARREL,_SIDEARM_UNDERBARREL(13-15) for firearm attachments;SC_LOADOUT_SLOT_PRIMARY_TOOL_MODULE,_PRIMARY_TOOL_CANISTER,_PRIMARY_TOOL_BATTERY(16-18) andSC_LOADOUT_SLOT_SIDEARM_TOOL_MODULE,_SIDEARM_TOOL_CANISTER,_SIDEARM_TOOL_BATTERY(19-21) for multitool parts. The records are unchanged (sc_loadout_itemandsc_loadout_v1keep their layout and sizes); a slot number just encodes its parent weapon. Like the body slots these are logical slots, not engine port names, and a batch is still processed in input order, so a consumer sends slot 8 or 9 before the attachment slots it targets. There is no removal:item_classstays 1 to 95 bytes. The version follows thegame.world1.1 precedent:SC_LOADOUT_VERSION_1_0andSC_LOADOUT_VERSION_1_1are added,SC_LOADOUT_SERVICE_VERSIONstays 1.0 while 1.1 is published, so a 1.0 query is still answered. The new capabilitygame.loadout.weaponsdefaults OFF (evidence levelsynthetic_only): slots 8-21 reportSC_LOADOUT_UNSUPPORTEDwhen the installed backend does not declare weapon support and staySC_LOADOUT_UNAVAILABLEwhile the capability is off, with no engine call either way; a 1.0 host reportsSC_LOADOUT_UNSUPPORTEDfor them. There is still no production engine backend:src/game/services/spatial.cppis untouched, so the service starts without one and every slot, body or weapon, reportsSC_LOADOUT_UNAVAILABLEin game. Pinstests/abi_game_loadout.c; provider tests use a synthetic backend. Headless tests only: nothing has run in the game.sco.ui.surfaces1.0: renderer-neutral panel placement (sco_api.hunchanged), a host-owned service (docs, contracts). A plugin shows one of itssco.widgetspanels as a 2D HUD rectangle (SCO_SURFACE_HUD_2D), a camera-facing 3D billboard (SCO_SURFACE_BILLBOARD_3D) or a world-anchored 3D quad (SCO_SURFACE_QUAD_3D):register_surface,update_surface_pose,unregister_surface,last_errorover size-prefixedsco_surface_desc/sco_surface_pose(position, normal, up, size in metres, max distance, an occlusion-raycast flag, the panel id). The host validates every field (finite numbers, unit and perpendicular vectors, bounded sizes, distances and coordinates, 32 surfaces per plugin and 256 in all, panels under the plugin's own id), stores surfaces per plugin and withdraws them on unload or crash throughsco.ui's release hook (no new hook slot). Products read the registry throughsco/surfaces.h(Surfaces(),Revision(),CheckPose) and project it themselves;docs/ui.mddocuments the billboard and quad frames and the panel-to-pixel homography. C++ wrapperscosdk/ui_surfaces.hpp; C# and Lua are unsupported. Pinstests/abi_ui_surfaces.c, host teststests/test_surfaces.cpp; both ship in core-source, the headers in core. Headless tests only: nothing has run in the game.sco::game::pakScope::AllFiles(design plan PR 10), OFF by default: persistent swaps of
the four pinnedICryPakslots (open 0x148, read 0x160, seek 0x1D0, close 0x1E0) serve every
mounted path on every thread, through a sharded map of served handles.Enablerefuses it unless
the product sets the newOptions::allFilesProbed, which no sco-core caller does. The new
capabilitygame.pak.all_filesis registered OFF pending in-game confirmation. Tell, size and
eof slots have no row, so they are never swapped;QueryHandleandServedHandlesreport the
virtual position, size and eof of a served handle.Disabledrains: open served handles keep
their virtual file, and the slots go back when the last one closes. The mount check is guarded
likeOptions::onLoad(try/catch, and SEH on MSVC).Scope::DataCoreLoadbehaves as before.files/replacement mounts (sco/vfs.h):vfs::ReplaceMount(a whole-fileTransform,
refusing absolute, drive and./..game paths, inert at open when the file is missing or over
maxBytes) andvfs::FileMounts(a data pack'sfiles/folder, symlinks skipped). The plugin
content index doesn't listfiles/yet. Nothing here has run in the game: the evidence is
synthetic tests (test_pak_files) over a fakeICryPakvtable.
-
Game services: game.asop 1.0 (insurance claim timeout and IsShardPersisted reads), default OFF.
include/sc_asop.h: sc_asop_v1 (32 bytes, size-prefixed, version 1.0, pinned by
tests/abi_game_asop.c): claim_timeout, shard_persisted, last_error. Capabilities
game.asop.claim_timeout and game.asop.shard_persisted are held OFF (evidence level
off_pending_probe) until an in-game run confirms them; while off every call answers
SCO_UNAVAILABLE without touching the game. Both functions only read rows that already exist
in src/game/asop_sigs.cpp and that docs/game/asop.md documents (insurance.config at
kInsuranceTimeout, asop.shard_persisted); no row, hook, patch or write was added.
src/game/services/asop_service.cpp is the portable policy behind an AsopProvider seam;
src/game/services/asop_engine.cpp (Windows game pack) reads the rows under SEH. The vehicle
list, deliver, retrieve and claim rows stay unwrapped because the repository documents no
plugin-callable meaning for them (docs/game/asop-service.md). Tests: tests/test_asop.cpp
(synthetic provider) and abi_game_asop as C11, C++20 and -fshort-enums. Catalogue records
(sdk/contracts/sc_asop_v1.json) and docs/contracts.md rows added; C++, C# and Lua routes
unsupported. Registry entry, docs/game/status.md rows and sdk/native_index.json regenerated.
Nothing here has run in a game session. -
Game services: game.contracts 1.0 (mission stream radius read), default OFF.
include/sc_contracts.h: sc_contracts_v1 (24 bytes, size-prefixed, version 1.0, pinned by
tests/abi_game_contracts.c): stream_radius, last_error. Capability
game.contracts.stream_radius is held OFF (evidence level off_pending_probe) until an in-game
run confirms it; while off the call answers SCO_UNAVAILABLE without touching the game. The
function only reads the contracts.mission_settings row that already exists in
src/game/contracts_sigs.cpp and that docs/game/contracts.md documents (the float at
kStreamRadius); no row, hook, patch or write was added. The service name game.contracts was
unused; the host-internal contracts.* capabilities and game.missions are separate.
src/game/services/contracts_service.cpp is the portable policy behind a ContractsProvider seam;
src/game/services/contracts_engine.cpp (Windows game pack) reads the row under SEH. The other
contracts rows stay unwrapped (docs/game/contracts-service.md). Tests: tests/test_contracts.cpp
(synthetic provider) and abi_game_contracts as C11, C++20 and -fshort-enums. Catalogue records
(sdk/contracts/sc_contracts_v1.json) and docs/contracts.md rows added; C++, C# and Lua routes
unsupported. Registry entry, docs/game/status.md rows and sdk/native_index.json regenerated.
Nothing here has run in a game session.