โก Case Study: OQuake
OQuake is a fork of vkQuake โ the Vulkan-based Quake source port โ extended with full OASIS WEB4 and WEB5 integration via the same OGLib + STARAPIClient stack used by ODOOM. It shares the Key Hunters Trilogy cross-game quest chain and inventory system with ODOOM and Our World. The Blue Key found in Quake's e1m1 is the same item that appears in ODOOM and Our World.
Tech stack
- Base engine: vkQuake (C, Vulkan) extended with OGEngine OASIS layer
- OGLib: shared C helper library โ same config, beamin, session, and cross-game layer as ODOOM (
oglib.h) - OASIS integration: STARAPIClient C ABI โ identical interface to ODOOM, different game
- OASIS WEB4: Avatar auth, Karma, cross-game Inventory, HyperDrive save
- OASIS WEB5: Missions, Quests (Key Hunters chain), Inventory Items (Blue Key), CelestialBody (Nexara Prime)
- Shared with: ODOOM (quest chain), Our World (inventory)
- Renderer: Vulkan 1.1+ โ fully Vulkan-native, no OpenGL fallback
OQuake vs ODOOM โ What's Different?
| ODOOM | OQuake | |
|---|---|---|
| Base engine | UZDoom (C) | vkQuake (C, Vulkan) |
| Renderer | Software / OpenGL | Vulkan 1.1+ |
| OGLib | โ same oglib.h | โ same oglib.h |
| STARAPIClient | โ same DLL | โ same DLL |
| star_api.h | โ same header | โ same header |
| Quest chain | Mission 1 (Crimson Key) | Mission 2 (Blue Key) |
| Inventory item | Crimson Key | Blue Key |
| Karma events | Doom monsters | Quake monsters |
| CelestialBody | Doom Planet | Nexara Prime |
Both games use the identical star_api.h interface and the shared oglib.h helper layer. OGLib eliminates the boilerplate duplication that previously existed between them โ config loading, session forwarders, beamin workflow, and cross-game mapping are defined once in OGLib and included by both integration files. Only the engine-specific hooks (monster types, level triggers, HUD rendering) differ per game.
Step 1 โ OGEngine Init (Vulkan-aware)
// oquake_star_integration.c โ OGLib handles all session/config boilerplate #define OGLIB_SESSION_IMPL #define OGLIB_CONFIG_IMPL #define OGLIB_BEAMIN_IMPL #include "oglib.h" // config, beamin, session forwarders, cross-game, JSON/str utils #include "star_api.h" void Host_Init(void) { VID_Init(); // Vulkan renderer init S_Init(); // Audio init // OGLib loads oasisstar.json and restores saved session โ same as ODOOM oglib_config_load(&g_star_config, "oasisstar.json", NULL, NULL); star_api_init(g_star_config.star_api_url); oglib_beamin_restore_session(&g_star_config); // Register Nexara Prime as the CelestialBody for OQuake's world star_api_register_celestial_body("Nexara Prime", "Planet"); }
Step 2 โ The Blue Key
The Blue Key in Quake's e1m1 is the second item in the Key Hunters Trilogy cross-game quest chain.
// sv_phys.c โ when player touches the blue key entity void SV_TouchTrigger(edict_t *ent, edict_t *other) { if (strcmp(ent->classname, "item_key2") == 0) { // Add Blue Key to cross-game inventory star_api_add_inventory_item("blue_key", "Blue Key", "Key discovered in Quake e1m1 โ completes the second part of the Trilogy."); // Complete quest objective 1 of the Key Hunters Trilogy star_api_complete_quest_objective(KEY_HUNTERS_QUEST_ID, 1, avatar_id); // Award karma for the find star_api_award_karma(150, "BlueKeyFound"); } }
Step 3 โ Karma for Quake Monsters
// sv_main.c โ entity dies void ED_EntityDied(edict_t *ent) { static const struct { const char *classname; int karma; } monster_karma[] = { { "monster_zombie", 3 }, { "monster_dog", 5 }, { "monster_knight", 15 }, { "monster_shambler", 75 }, { "monster_chthon", 500 }, // end boss }; for (int i = 0; i < ARRAY_SIZE(monster_karma); i++) { if (!strcmp(ent->classname, monster_karma[i].classname)) { star_api_award_karma(monster_karma[i].karma, "Kill"); break; } } }
Step 4 โ Cross-Game Door (Crimson Key from ODOOM)
A secret room in OQuake's e2m1 only opens if the player already holds the Crimson Key found in ODOOM.
// func_door trigger โ checks cross-game inventory void door_blocked(edict_t *self, edict_t *other) { if (strcmp(self->targetname, "doom_crimson_gate") == 0) { if (star_api_has_item("crimson_key")) { door_go_up(self); // open the secret passage star_api_award_karma(200, "SecretUnlocked_DoomCross"); } else { SV_ClientPrint(other, "This door only opens for those who conquered Doom...\n"); } } }
OQuake game code: vkQuake fork โ ยท OASIS OQuake integration: OASIS Omniverse/OQuake โ ยท OGLib: OASIS Omniverse/OGLib โ ยท STARAPIClient: STARAPIClient โ