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?

ODOOMOQuake
Base engineUZDoom (C)vkQuake (C, Vulkan)
RendererSoftware / OpenGLVulkan 1.1+
OGLibโœ… same oglib.hโœ… same oglib.h
STARAPIClientโœ… same DLLโœ… same DLL
star_api.hโœ… same headerโœ… same header
Quest chainMission 1 (Crimson Key)Mission 2 (Blue Key)
Inventory itemCrimson KeyBlue Key
Karma eventsDoom monstersQuake monsters
CelestialBodyDoom PlanetNexara 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)

c
// 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.

c
// 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

c
// 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.

c
// 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");
        }
    }
}
๐Ÿ’ก
Source code

OQuake game code: vkQuake fork โ†— ยท OASIS OQuake integration: OASIS Omniverse/OQuake โ†— ยท OGLib: OASIS Omniverse/OGLib โ†— ยท STARAPIClient: STARAPIClient โ†—