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: OGEngine Client 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
OGEngine Client✅ 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 ↗ · OGEngine Client: OGEngine Client ↗