Skip to content

id Tech 3 Engine Features

Zack Middleton edited this page Mar 12, 2018 · 78 revisions

What's new in the different id Tech 3 engines? (And how they relate to Spearmint as I try to make an engine to run all the games.)

Lines that start with...

  • Just a bullet, does not apply to Spearmint.
  • IOQ3: feature exists in ioquake3 and Spearmint.
  • SPEARMINT: feature exists in Spearmint.
  • NOTSPEARMINT: feature decided not to be supported in Spearmint.
  • TURTLEARENA: feature exists in Turtle Arena, but not Spearmint. (This means I'll probably merge it into Spearmint at some point.)
  • NOTIMPLEMENTED: Client/server for whatever game does not handle this system call (unusable) or just returns 0.

This documentation is mainly focused on VM APIs, yet lacks notes of syscalls with modified arguments. tr_types.h and shaders for most games have not been not documented here yet.

Table of Contents

Open Source

ioquake3

Way to much stuff to list. Some of it like off-server downloads had already been added to RTCW.

(Also, I'm less interested in the fixes and features I already have in Spearmint...)

Tremulous

Status: I have not reviewed the game/cgame/ui outside of API.

As far as I know, Tremulous was the first standalone open source id Tech 3 game.

  • SPEARMINT: BiSphere trace and some trace cleanup
  • SPEARMINT: Renderer clip region (trap_R_ClipRegion) for DrawStretchPic
  • Removed r_move; uses r_width, r_height, and r_pixelAspect instead.
  • SPEARMINT: From tr_local.h
// These two variables should live inside glConfig but can't because of compatibility issues to the original ID vms. // If you release a stand-alone game and your mod uses tr_types.h from this build you can safely move them to // the glconfig_t struct. extern qboolean textureFilterAnisotropic; extern int maxAnisotropy; extern float displayAspect;
  • Better renderer cvar defaults? See GL_ResolveHardwareType
  • SPEARMINT: Added UI_MOUSE_POSITION UI_SET_MOUSE_POSITION client to ui calls.
  • SPEARMINT: Added CG_S_SOUNDDURATION
  • SPEARMINT: Added CG_FS_GETFILELIST (available in q3a UI)
  • SPEARMINT: Added CG_LITERAL_ARGS (used by CG_ConsoleText)
  • SPEARMINT: Added CG_R_SETCLIPREGION
  • SPEARMINT: Added CG_GETDEMOSTATE/POS/NAME
    • ZTM: NOTE: I added a CG_GETDEMOLENGTH for demo playback so percent could be shown.
  • SPEARMINT: Added CG_KEY_KEYNUMTOSTRINGBUF (available in q3a UI)
  • SPEARMINT: Added CG_KEY_GETBINDINGBUF (available in q3a UI) (Allows showing the key(s) to press to do an action in game.)
  • SPEARMINT: Added CG_KEY_SETBINDING (available in q3a UI)

Added client to cgame commands

  • SPEARMINT: CG_CONSOLE_TEXT
  // void (*CG_ConsoleText)( void );
  // pass text that has been printed to the console to cgame
  // use Cmd_Argc() / Cmd_Argv() to read it
  • SPEARMINT(modified): CG_VOIP_STRING
  // Tremulous:
  // char *(*CG_VoIPString)( void );
  // returns a string of comma-delimited clientnums based on cl_voipSendTarget
    • ZTM: NOTE: In Spearmint, unknown tokens get sent to cgame using CG_VOIP_STRING, cgame reads using trap_Argv, whereas in Tremulous cgame just reads cl_voidSendTarget directly.
So in Spearmint one can having cl_voidSendTarget = "0,6,team,spatial" with cgame just telling client what client nums "team" refers to.
  // Spearmint:
  // char *(*CG_VoIPString)( void );
  // pass voip target token unknown by client to cgame to convert into clientNums
  // use Cmd_Argc() / Cmd_Argv() to read the target token, return a
  // string of comma-delimited clientnums based on target token or
  // NULL if unknown token.
  • Added support for showing news in the client (UI_GETNEWS)
    • Uses cURL to get http://tremulous.net/clientnews.txt and put in cvar cl_newsString
    • ZTM: I'd want to makes the URL be set by UI (for mod support), but I do not feel safe doing it. :-/
        • Maybe if only allow UI to fetch a single URL per-load, it would be safer?
  • SPEARMINT: Added UI_R_SETCLIPREGION

Server/game

  • SPEARMINT: Config string restrictions (limit which clients receive specific config strings) (G_SET_CONFIGSTRING_RESTRICTIONS)
  • Sends stats to the master server (G_SEND_GAMESTAT, SV_MasterGameStat)
    • Going to want to make changes to protocol for supporting multiple games. (And update/rename dpmaster-ta for Spearmint, supporting gamestat.)
    • In Termulous, game stats are only sent by Internet dedicated servers. In Spearmint I support running Internet servers in client, should they send stats?
  • SPEARMINT: qagame.qvm renamed to game.qvm
  • SPEARMINT: G_ADDCOMMAND and G_REMOVECOMMAND (for auto complete)
  • Command flood protection moved from server to game.

OpenArena

Reviewed Debian's ioquake3 engine which supports running Open Arena.

Engine has some small patches, game can run on unmodified ioq3?

Q3Rally

Only things in the engine were ported from Turtle Arena iirc. I'd really like to port Q3Rally to Spearmint someday, either as Q3Rally or a new game.

  • SPEARMINT: Added trap call for Q_acos to game and ui
  • SPEARMINT: Added trap call for Q_asin to cgame, game, and ui
  • HACK: There is an ugly, yet really neat, hack to allow license plates to have names on them.
    • Load plate image and font image. Copy letters for name onto plate. save. load shader.
    • It would be nice to allow text to be rendered to directly via shader stage.
      • DeformText? Or maybe just render as polys over the plate in real time...

URL: http://q3rallysa.svn.sourceforge.net/viewvc/q3rallysa/

World of Padman

Review status: There are changes to the music command, and maybe some other stuff, if I remember correct. I should look at the changes again.

  • Has support for Ogg Theora video playback
  • SPEARMINT: Has new UI to client calls for getting voip info
case UI_GET_VOICEMUTECLIENT: return CLUI_GetVoiceMuteClient(args[1]);

case UI_GET_VOICEMUTEALL: return CLUI_GetVoiceMuteAll();

case UI_GET_VOICEGAIN: return FloatAsInt( CLUI_GetVoiceGain(args[1]) );

ZTM: Renamed syscall enums to UI_GET_VOIP_GAIN etc, renamed the trap calls to trap_GetVoipGain etc. ZTM: Added to cgame as well.

  • SPEARMINT: Has new CGAME to engine call for getting voip info
case CG_GET_VOIP_TIMES: CL_GetVoipTimes( VMA(1) ); return 0;

ZTM: Added to UI as well.

  • SPEARMINT: Has new GAME to engine call for botlib access
case BOTLIB_AAS_BESTREACHABLEAREA: return botlib_export->aas.AAS_BestReachableArea( VMA(1), VMA(2), VMA(3), VMA(4) );
  • SPEARMINT: Increased SDL sound freq to 44100.
  • HACK: There is a hack to avoid not having FS_GetFileList in cgame for spray logos, they put list in cvar in ui... (FS_GetFileList was added to Spearmint, so would not need hack.)
  • Notes that trap_addCommand is only available in cgame, they want to game.

Xreal

I have not reviewed Xreal much at all.

  • Support for MD5 and Unreal Tournament 3 models.
  • Graphics enhancements.
  • Prey-like wall walking?

Return To Castle Wolfenstein

  • SPEARMINT: Added MDC (compressed version of MD3) and MDS model formats
  • AAS version 8 (Q3 uses 4/5).
    • New Area flag AREA_USEFORROUTING (1024)
    • Changed AREACONTENTS_MOVER from 1024 to 2048.
    • Added new flag AREACONTENTS_DONOTENTER_LARGE (1024) sets TFL_DONOTENTER_LARGE, tells NPCs with large bounding box do not enter.
    • aas_areasettings_t has float groundsteepness. 0 = flat, 1 = steep. // Ridah, add a ground steepness stat, so we can avoid terrain when we can take a close-by flat route
    • Each map_b#.aas file can have a map_b#.rcd (route cache dump), to speed load time?
  • The engine will loaded 2 aas files (mapname_b0.aas and mapname_b1.aas), for each of the bounding box sizes. (b0 is the one used for player and some NPCs, b1 is used by larger NPCs)

Note: RF_HILIGHT bit for refEntity_t::renderfx is unimplemented in RTCW-SP/MP/ET. Instead "float hilightIntensity;" in refEntity_t is used.

RTCW-SP

I've hardly reviewed SP, this section will only note additions/changes from RTCW MP!

  • Savegames (loadgame and savegame commands in server, Turtle Arena moved them to game and ui VM.)
    • ZTM: Turtle Arena has code based on RTCW for savegames in game and ui. No engine changes are needed.
    • ZTM: TODO: Hmm, actually save games in RTCW change/set sv.time when quick-loading (on same map) and restoring in middle of level. So game needs a system call to set sv.time it seems.

New game to server calls

  • G_BOT_ALLOCATE_CLIENT (has modified argument list, takes clientNum for restoring bots from save games)

New server to game calls

  • NOTSPEARMINT: GAME_GETMODELINFO
    • ZTM: Takes pointers from cgame and set them to point at memory in game (so avoid duplicate loading and memory for model text files). Not demo or QVM friendly. For demos, no game VM is loaded. So you have to put fallback loading code in cgame to support demos. QVMs can use fallback code for demos. (I added fallback code to iortcw SP for demos/QVMs.)

RTCW-MP

MP maps do not have aas files. So no bots in mp... I think botfiles directory would need to be added too.

New UI to client calls

  • SPEARMINT: UI_FS_DELETEFILE
    • ZTM: Renamed to UI_FS_DELETE in Spearmint as it can delete directories too.
  • SPEARMINT: UI_R_ADDPOLYSTOSCENE
  • SPEARMINT: UI_R_ADDCORONATOSCENE
  • NOTIMPLEMENTED: UI_LAN_GETLOCALSERVERCOUNT
  • NOTIMPLEMENTED: UI_LAN_GETLOCALSERVERADDRESSSTRING
  • NOTIMPLEMENTED: UI_LAN_GETGLOBALSERVERCOUNT
  • NOTIMPLEMENTED: UI_LAN_GETGLOBALSERVERADDRESSSTRING
  • NOTSPEARMINT: UI_CL_GETLIMBOSTRING
    • ZTM-NEW: Spearmint merged cgame/ui VMs, so UI can directly access strings in cgame now.
    • ZTM-OLD: Get text from client (that cgame give to client using CG_LIMBOSTRING). Just add a ui console comment instead?
  • UI_CL_TRANSLATE_STRING
    • ZTM: I'd rather support "gettext" like Unvanquished instead. I do not want to support all the different translation systems in various id Tech 3 games. It may be possible to support RTCW-style translation in cgame/ui VM anyway though.
  • UI_CHECKAUTOUPDATE
  • UI_GET_AUTOUPDATE
    • ZTM: Currently not planning to support updates via client, could add post-1.0 if I change my mind.
  • UI_OPENURL
    • ZTM: I'd rather not add this, could add post-1.0 if I change my mind.
  • NOTSPEARMINT: UI_SET_PBCLSTATUS
  • NOTSPEARMINT: UI_SET_PBSVSTATUS

New client to UI calls

  • NOTSPEARMINT: UI_GET_ACTIVE_MENU
    • ZTM: can duplicate the behavior in CL_KeyEvent in the cgame/ui VM using trap_Key_GetBindingBuf.
  • NOTSPEARMINT: UI_CHECKEXECKEY
    • ZTM-NEW: Can be done in Spearmint CGame VM.
    • ZTM-OLD: part of system for allowing a menu to open and do something when a key is pressed, without interfering other mouse movement and other binds. also see cl_bypassMouseInput.
      • ZTM-OLD: I've added a system call trap_Mouse_SetState() to replace need for cl_bypassMouseInput in CL_MouseEvent (can set if should update viewangles and/or call CG_MOUSE_EVENT). If add bind parsing code to cgame/ui vm for unhandled keys in CG_KEY_EVENT, I think you can have non-interfering popup menus.

New cgame to client calls

  • SPEARMINT: CG_FS_WRITE (returns bytes written)
  • CG_S_STARTSOUNDEX
  • CG_S_GETVOICEAMPLITUDE
    • ZTM: This sounds cool. And hard to get working with OpenAL...
  • SPEARMINT(modified): CG_S_STARTSTREAMINGSOUND
  • NOTSPEARMINT: CG_R_GETSKINMODEL // client allowed to view what the .skin loaded so they can set their model appropriately
    • ZTM: Spearmint moved skin parsing from renderer to cgame.
  • SPEARMINT: CG_R_GETMODELSHADER, // client allowed the shader handle for given model/surface (for things like debris inheriting shader from explosive)
    • ZTM: Neat, I've wanted this. Well, this is much more limited than I wanted.. so I also added surfaceNum from trace_t, for use with (new) trap_R_GetSurfaceShader.
  • SPEARMINT: CG_R_ADDCORONATOSCENE
  • NOTSPEARMINT: CG_R_SETFOG
    • ZTM: Not needed in Spearmint, fog is set in refdef_t with get syscalls for global and water fog values.
  • SPEARMINT: CG_R_DRAWSTRETCHPIC_GRADIENT
  • NOTSPEARMINT: CG_SETCLIENTLERPORIGIN
    • ZTM: used for setting player origin to be used by client to make other players be NODRAW if not visible. I assume this is for anti-wallhack, which is pointless with open source client.
  • NOTSPEARMINT: CG_SENDMOVESPEEDSTOGAME
    • ZTM: ugly hack, based on idea that game and cgame will both run on same computer. (no dedicated servers.) Useless for non RTCW-SP? I'd rather not add support for stuff that does not work in network games.
  • CG_LOADCAMERA (note: commented out in q3 source)
  • CG_STARTCAMERA (note: commented out in q3 source)
  • CG_GETCAMERAINFO (note: commented out in q3 source)
  • NOTSPEARMINT: CG_INGAME_POPUP
    • ZTM-NEW: Spearmint merged cgame/ui, so can call UI function directly now.
    • ZTM-OLD: Can replace with a ui console command.
  • NOTSPEARMINT: CG_INGAME_CLOSEPOPUP
    • ZTM-NEW: Spearmint merged cgame/ui, so can call UI function directly now.
    • ZTM-OLD: Can replace with a ui console command.
  • NOTSPEARMINT: CG_LIMBOCHAT
    • ZTM-NEW: Spearmint merged cgame/ui, so UI can directly access now.
    • ZTM-OLD: Pass text to client so UI can fetch using UI_CL_GETLIMBOSTRING. Just add a ui console comment instead?
  • SPEARMINT: CG_R_DRAWROTATEDPIC
  • SPEARMINT: CG_KEY_GETBINDINGBUF
  • SPEARMINT: CG_KEY_SETBINDING
  • SPEARMINT: CG_KEY_KEYNUMTOSTRINGBUF
  • CG_TRANSLATE_STRING

New client to cgame calls

ZTM: They're not worth adding to Spearmint.

  • NOTSPEARMINT: CG_GET_TAG
// qboolean CG_GetTag( int clientNum, char *tagname, orientation_t *or );
    • ZTM: G_GETTAG -> client (CG_GET_TAG) -> cgame (does not work with dedicated server)
    • ZTM: Some usage of G_GETTAG is NPCs, but also used for headshots (has fallback for G_GETTAG returning false, so code works with dedicated servers).
  • NOTSPEARMINT: CG_CHECKCENTERVIEW
    • ZTM: Used for limiting how often client can run "centerview" command. Related comment // prevent centerview exploits
    • ZTM: NOTE: WolfET just disables "centerview" command. Related comment // this is an exploit nowadays
      • ZTM: This needs to be fixed in server/game. Because the client is open source, people could readd the command.

New game to server calls

  • SPEARMINT: G_FS_WRITE (returns bytes written)
  • SPEARMINT: G_FS_RENAME
  • NOTSPEARMINT: G_GETTAG
    • ZTM: This just calls CG_GET_TAG to get info from cgame, which does not work using dedicated server. It's a single player left over. Use Spearmint's game VM's trap_R_RegisterModel and trap_R_LerpTag instead? Requires more work server side, to know what frames client model is using... but will work as listen and dedicated server.
  • removed: BOTLIB_AAS_ENABLE_ROUTING_AREA = 300,
  • removed: BOTLIB_AAS_BBOX_AREAS (it's back in WolfET)
  • removed: BOTLIB_AAS_AREA_INFO,
  • NOTIMPLEMENTED: BOTLIB_AAS_ENTITY_VISIBLE = 300, //FIXME: remove
  • NOTIMPLEMENTED: BOTLIB_AAS_IN_FIELD_OF_VISION, //FIXME: remove
  • NOTIMPLEMENTED: BOTLIB_AAS_VISIBLE_CLIENTS, //FIXME: remove
  • BOTLIB_AAS_SETCURRENTWORLD
    • ZTM: Interesting, used for having NPCs use different AAS routing info(?) and whatnot. This explains the silly looking (*aasworld). replacing aasworld. in quake3.
  • BOTLIB_AAS_RT_SHOWROUTE
    • ZTM: Debug function for showing route between two points.
  • BOTLIB_AAS_RT_GETHIDEPOS
    • ZTM: Get nearest hide position. Calls AAS_NearestHideArea, can it be ported to game VM? looks complicated to port... though not used by BSPC, so it "could be" ported (though probably need more new system calls).
  • BOTLIB_AAS_FINDATTACKSPOTWITHINRANGE
    • ZTM: Get (nearest?) attack position. Copy-paste edit of AAS_NearestHideArea.
  • BOTLIB_AAS_SETAASBLOCKINGENTITY
    • ZTM: Add absmin and absmax for blocking aas routing. This can be done in game VM using Q3's BOTLIB_AAS_BBOX_AREAS and BOTLIB_AAS_ENABLE_ROUTING_AREA, though would need RTCW's BOTLIB_AAS_SETCURRENTWORLD to fully remake BOTLIB_AAS_SETAASBLOCKINGENTITY in game VM.
    • ZTM: this (one) syscall is probably faster than making all the other syscalls though.
      • ut-oh, they pass blocking -1 to reset but it's a boolean... and looks sort of broke.
        • AAS_SetAASBlockingEntity( vec3_t absmin, vec3_t absmax, qboolean blocking )
  • removed: BOTLIB_EA_ACTION
  • SPEARMINT(not-a-trap): BOTLIB_EA_USE_ITEM
  • SPEARMINT(not-a-trap): BOTLIB_EA_DROP_ITEM
  • SPEARMINT(not-a-trap): BOTLIB_EA_USE_INV
  • SPEARMINT(not-a-trap): BOTLIB_EA_DROP_INV
    • ZTM: the functions they call already in q3, so it's not hard to add them. However, I'm not sure why they're not just in game. Edit: They're in game now, code/game/ai_ea.c!
  • SPEARMINT(does-not-need-a-trap): BOTLIB_EA_RELOAD
  • SPEARMINT(does-not-need-a-trap): BOTLIB_AI_INIT_AVOID_REACH

New server to game calls

  • AICAST_VISIBLEFROMPOS
  • AICAST_CHECKATTACKATPOS
    • ZTM: Used for Single Player Cast AI NPCs. Renamed to BOT_* in WolfET.
  • NOTSPEARMINT: GAME_RETRIEVE_MOVESPEEDS_FROM_CLIENT
    • ZTM: Used to set move speed for NPCs. Cgame -> client -> game (Note: move speeds not updated when running dedicated server)

Wolf ET

Wolf ET is a multiplayer only game built on-top of what seems to be a merger of RTCW SP and MP.

WolfET does not have bots enabled in released version. Bot code might be broke, only intended for unfinished SP, or could not get them to work for the game modes?

  • SPEARMINT: Added MDM (mesh data) and MDX (skeleton data) formats for player models.
  • NOTSPEARMINT: Removes SVF_CLIENTMASK (only works upto 32 clients, the engine support 64 so I'm not sure when it would really be useful...)
    • ZTM: Spearmint supports upto 64 clients, kept SVF_CLIENTMASK. (Though renamed to SVF_PLAYERMASK.)
  • SPEARMINT: External lightmaps
  • NOTSPEARMINT: gameinfo.dat, defines single player gametypes and default gametype (allowing full controls of gametype numbers to be given to mods!) Also allows enable/disable usage of user profiles.
    • ZTM: I've managed to kick hardcoded gametype values out of client/server/botlib without it!
  • User profiles
  • SPEARMINT(fixed another way): Correct trace contents of non-brush entities! CM_SetTempBoxModelContents( entity->r.contents )

New UI to client calls

  • SPEARMINT: UI_CVAR_LATCHEDVARIABLESTRINGBUFFER
  • SPEARMINT: UI_ADDCOMMAND
  • SPEARMINT: UI_FS_DELETEFILE (also in RTCW SP/MP)
    • ZTM: Renamed to UI_FS_DELETE in Spearmint as it can delete directories too.
  • NOTIMPLEMENTED: UI_FS_COPYFILE
  • SPEARMINT: UI_R_ADDPOLYSTOSCENE (also in RTCW SP/MP)
  • SPEARMINT: UI_R_ADDCORONATOSCENE (also in RTCW SP/MP)
  • SPEARMINT: UI_R_DRAW2DPOLYS
  • UI_S_FADESTREAMINGSOUND (also in RTCW SP)
  • UI_S_FADEALLSOUNDS (also in RTCW SP)
  • NOTSPEARMINT: UI_KEY_BINDINGTOKEYS (const char *binding, int *key1, int *key2);
    • ZTM: This is not needed in Spearmint, the modified Key_GetKey allows doing this, plus allows more than two keys. So can easily do without this now.
    • ZTM: NOTE: WolfET creates hashes of all binds to it's faster to find them.
  • NOTIMPLEMENTED:UI_LAN_GETLOCALSERVERCOUNT (also in RTCW SP/MP)
  • NOTIMPLEMENTED:UI_LAN_GETLOCALSERVERADDRESSSTRING (also in RTCWSP/MP)
  • NOTIMPLEMENTED:UI_LAN_GETGLOBALSERVERCOUNT (also in RTCWSP/MP)
  • NOTIMPLEMENTED:UI_LAN_GETGLOBALSERVERADDRESSSTRING (also in RTCWSP/MP)
  • SPEARMINT: UI_PC_REMOVE_ALL_GLOBAL_DEFINES
  • SPEARMINT: UI_PC_UNREAD_TOKEN
  • SPEARMINT: UI_LAN_SERVERISINFAVORITELIST
  • NOTSPEARMINT: UI_CL_GETLIMBOSTRING (also in RTCW SP/MP)
    • ZTM: see RTCWMP note. Also UI_CL_GETLIMBOSTRING is unused and useless in ET, lacks CG_LIMBOSTRING. Nothing is ever added to be got.
  • UI_CHECKAUTOUPDATE (also in RTCW MP)
  • UI_GET_AUTOUPDATE (also in RTCW MP)
  • UI_CL_TRANSLATE_STRING (also in RTCW MP)
  • UI_OPENURL (also in RTCW MP)
  • NOTSPEARMINT: UI_SET_PBCLSTATUS (also in RTCW MP)
  • NOTSPEARMINT: UI_SET_PBSVSTATUS (also in RTCW MP)
  • UI_GETHUNKDATA

New client to UI calls

  • NOTSPEARMINT: UI_CHECKEXECKEY (also in RTCW MP)
    • ZTM: See note for RTCW MP.
  • NOTSPEARMINT: UI_WANTSBINDKEYS
    • ZTM: I added this, but later moved behavior into CGame VM.

New cgame to client calls

  • SPEARMINT: CG_FS_WRITE (returns bytes written, also done in RTCW SP/MP)
  • SPEARMINT: CG_CVAR_LATCHEDVARIABLESTRINGBUFFER
  • SPEARMINT: CG_FS_GETFILELIST
  • SPEARMINT: CG_FS_DELETEFILE
    • ZTM: Renamed to UI_FS_DELETE in Spearmint as it can delete directories too.
  • NOTSPEARMINT: CG_R_PROJECTDECAL, // ydnar: projects a decal onto brush models
  • NOTSPEARMINT: CG_R_CLEARDECALS, // ydnar: clears world/entity decals
    • ZTM: I don't like the decal API (must have decals in all world scenes, decals only added if on screen -- grenade explodes right next to you off screen, no explosion mark decal). Instead I've extended the R_MarkFragments API to work with entity brush models.
  • CG_S_STARTSOUNDEX (also in RTCW SP/MP)
  • CG_S_CLEARSOUNDS
  • CG_S_GETVOICEAMPLITUDE (also in RTCW SP/MP)
  • CG_S_FADESTREAMINGSOUND (also in RTCW SP)
  • CG_S_FADEALLSOUNDS (also in RTCW SP)
  • SPEARMINT(modified): CG_S_STARTSTREAMINGSOUND (also in RTCW SP/MP)
  • SPEARMINT(renamed): CG_S_GETSOUNDLENGTH (also in Tremulous as CG_S_SOUNDDURATION)
    • ZTM: Added Tremulous' CG_S_SOUNDDURATION which does the same thing.
  • CG_S_GETCURRENTSOUNDTIME
  • NOTSPEARMINT: CG_R_GETSKINMODEL (also in RTCW SP/MP)
    • ZTM: see note for RTCW MP.
  • SPEARMINT: CG_R_GETMODELSHADER (also in RTCW SP/MP)
    • ZTM: see note for RTCW MP.
  • SPEARMINT: CG_R_ADDPOLYBUFFERTOSCENE
  • SPEARMINT: CG_R_ADDCORONATOSCENE (also in RTCW SP/MP)
  • NOTSPEARMINT: CG_R_SETFOG (also in RTCW SP/MP)
  • NOTSPEARMINT: CG_R_SETGLOBALFOG
    • ZTM: These are not needed in Spearmint, fog is set in refdef_t with get syscalls for global and water fog values.
  • NOTSPEARMINT: CG_R_SAVEVIEWPARMS
  • NOTSPEARMINT: CG_R_RESTOREVIEWPARMS
    • ZTM: These are not needed in Spearmint. ProjectRadius in tr_animation_mdm.c has been fixed, also fixed decal issue (committed to ET:legacy).
  • SPEARMINT: CG_R_DRAWSTRETCHPIC_GRADIENT (also in RTCW SP/MP)
  • NOTSPEARMINT: CG_SETCLIENTLERPORIGIN (also in RTCW MP)
    • ZTM: See note for RTCWMP.
  • SPEARMINT: CG_KEY_GETOVERSTRIKEMODE
  • SPEARMINT: CG_KEY_SETOVERSTRIKEMODE
  • SPEARMINT: CG_PC_UNREAD_TOKEN
  • removed: CG_S_STOPLOOPINGSOUND
  • SPEARMINT(modified): CG_S_STOPSTREAMINGSOUND (also in RTCW SP)
  • removed: CG_R_ADDADDITIVELIGHTTOSCENE
  • CG_LOADCAMERA (also in RTCW SP/MP)
  • CG_STARTCAMERA (also in RTCW SP/MP)
  • CG_STOPCAMERA (also in RTCW SP)
  • CG_GETCAMERAINFO (also in RTCW SP/MP)
  • NOTSPEARMINT: CG_INGAME_POPUP (also in RTCW SP/MP)
    • ZTM: Can replace with a ui console command, or just call UI function now that CGame and UI VMs are merged.
  • NOTIMPLEMENTED: CG_INGAME_CLOSEPOPUP (also in RTCW SP/MP)
    • ZTM: Just returns 0.
  • SPEARMINT: CG_R_DRAWROTATEDPIC (also in RTCW MP)
  • SPEARMINT: CG_R_DRAW2DPOLYS
  • SPEARMINT: CG_KEY_GETBINDINGBUF (also in RTCW MP)
  • SPEARMINT: CG_KEY_SETBINDING (also in RTCW MP)
  • SPEARMINT: CG_KEY_KEYNUMTOSTRINGBUF (also in RTCW MP)
  • NOTSPEARMINT: CG_KEY_BINDINGTOKEYS
    • ZTM: see note for ET UI_KEY_BINDINGTOKEYS.
  • CG_TRANSLATE_STRING (also in RTCW MP)
  • NOTSPEARMINT: CG_GETHUNKDATA
    • ZTM: This gets hunk usage (aka `com_hunkMegs * 1024 * 1024 - trap_MemoryRemaining()`) and expected hunk value from hunkusage.dat for current map. In non-Spearmint, the actual hunk may be larger than com_hunkMegs if manually set below hunk minimum size (different for client and server). Spearmint updates the cvar value when forcing a minimum.
  • NOTIMPLEMENTED: CG_PUMPEVENTLOOP
  • CG_SENDMESSAGE
  • CG_MESSAGESTATUS
  • CG_R_LOADDYNAMICSHADER
  • CG_R_RENDERTOTEXTURE
  • CG_R_GETTEXTUREID
  • CG_R_FINISH

New client to cgame calls

  • NOTSPEARMINT: CG_GET_TAG (also in RTCW SP/MP)
    • ZTM: See comment in RTCW MP section.
  • NOTSPEARMINT: CG_CHECKEXECKEY
    • ZTM: See note for RTCW MP's UI_CHECKEXECKEY.
  • NOTSPEARMINT: CG_WANTSBINDKEYS
    • ZTM: See comment in RTCW MP section.
  • CG_MESSAGERECEIVED
    • ZTM: Just returns -1. Though, the binary message code might be used by mods.

New game to server calls

  • SPEARMINT: G_FS_WRITE (returns bytes written, also done in RTCW SP/MP)
  • SPEARMINT: G_CVAR_LATCHEDVARIABLESTRINGBUFFER
  • SPEARMINT: G_FS_RENAME (also in RTCW SP/MP)
  • G_BOT_ALLOCATE_CLIENT (modified argument list like in RTCW SP)
  • NOTSPEARMINT: G_REGISTERTAG, // Gordon: load a serverside tag
    • ZTM: Only useful for games/mods that already use this. Spearmint allows game VM to use trap_R_RegisterModel and trap_R_LerpTag, so no special .tag files are needed (and have to be updated/maintained) and uses less memory when running listen server.
    • Game will need to handle endianness correctly when reading the binary files, but it's doable.
  • NOTSPEARMINT: G_GETTAG (modified from RTCW SP/MP)
    • ZTM: Dual purpose system call. WolfET adds support getting from registered tag files and kept rtcw style get tag from client model using cgame.
  • NOTSPEARMINT: G_REGISTERSOUND, // xkan, 10/28/2002 - register the sound
  • NOTSPEARMINT: G_GET_SOUND_LENGTH, // xkan, 10/28/2002 - get the length of the sound
    • ZTM: These are unused and I do not want to add them...
  • removed: BOTLIB_AAS_ENABLE_ROUTING_AREA = 300,
  • removed: BOTLIB_AAS_AREA_INFO,
  • NOTIMPLEMENTED: BOTLIB_AAS_ENTITY_VISIBLE = 300, //FIXME: remove
  • NOTIMPLEMENTED: BOTLIB_AAS_IN_FIELD_OF_VISION, //FIXME: remove
  • NOTIMPLEMENTED: BOTLIB_AAS_VISIBLE_CLIENTS, //FIXME: remove
  • BOTLIB_AAS_SETCURRENTWORLD (also in RTCW SP/MP)
  • SPEAPRMINT: BOTLIB_AAS_BBOX_AREAS (present in Q3 but not RTCW SP/MP strangely)
  • BOTLIB_AAS_AREA_CENTER
  • BOTLIB_AAS_AREA_WAYPOINT
  • SPEARMINT: BOTLIB_AAS_AREA_LADDER
  • BOTLIB_AAS_RT_SHOWROUTE (also in RTCW SP/MP)
    • ZTM: see RTCWMP note.
  • BOTLIB_AAS_NEARESTHIDEAREA (hmm, mostly looks like renamed/improved BOTLIB_AAS_RT_GETHIDEPOS from RTCW SP/MP)
    • ZTM: see RTCWMP note for BOTLIB_AAS_RT_GETHIDEPOS.
  • BOTLIB_AAS_LISTAREASINRANGE (hmm, sort of looks like another edit of AAS_NearestHideArea?)
  • BOTLIB_AAS_AVOIDDANGERAREA (...and another edit of AAS_NearestHideArea?)
  • BOTLIB_AAS_RETREAT (...and another edit of AAS_NearestHideArea?)
    • ZTM: not used in game, not sure what that means considering bot code was not enabled at release anyway.
  • SPEARMINT(modified): BOTLIB_AAS_ALTROUTEGOALS
    • ZTM: Calls same function as Q3's BOTLIB_AAS_ALTERNATIVE_ROUTE_GOAL, but takes less args. Q3's has better API imo.
  • NOTSPEARMINT: BOTLIB_AAS_SETAASBLOCKINGENTITY (also in RTCW SP/MP)
    • ZTM: see RTCWMP note.
  • BOTLIB_AAS_RECORDTEAMDEATHAREA
    • ZTM: has a return before it does anything and usage is disabled in game, saying "disabling for now, seems to cause routing loops".
  • SPEARMINT(not-a-trap): BOTLIB_EA_USE_ITEM (also in RTCW SP/MP)
  • SPEARMINT(not-a-trap): BOTLIB_EA_DROP_ITEM (also in RTCW SP/MP)
  • SPEARMINT(not-a-trap): BOTLIB_EA_USE_INV (also in RTCW SP/MP)
  • SPEARMINT(not-a-trap): BOTLIB_EA_DROP_INV (also in RTCW SP/MP)
  • removed: BOTLIB_EA_ACTION
  • SPEARMINT(does-not-need-a-trap): BOTLIB_EA_RELOAD (also in RTCW SP/MP)
  • SPEARMINT(not-a-trap): BOTLIB_EA_WALK
  • SPEARMINT(does-not-need-a-trap): BOTLIB_EA_PRONE
  • SPEARMINT(does-not-need-a-trap): BOTLIB_AI_INIT_AVOID_REACH (also in RTCW SP/MP)
  • SPREAMINT: BOTLIB_PC_UNREAD_TOKEN
  • NOTSPEARMINT: PB_STAT_REPORT
  • G_SENDMESSAGE
  • G_MESSAGESTATUS

New server to game calls

  • SPEARMINT: GAME_SNAPSHOT_CALLBACK, // ( int entityNum, int clientNum ); // return qfalse if you don't want it to be added
  • BOT_VISIBLEFROMPOS
  • BOT_CHECKATTACKATPOS
    • ZTM: BOT_* were renamed from RTCW AICAST_*
  • GAME_MESSAGERECEIVED, // ( int cno, const char *buf, int buflen, int commandTime );
    • ZTM: Just returns -1.
  • removed GAME_RETRIEVE_MOVESPEEDS_FROM_CLIENT which was added in RTCW

Elite Force Multiplayer (engine recreation)

Engine created by Thilo is free software, game logic is under a SDK license.

  • IOQ3: Add MDR model format.
  • SPEARMINT: MP3 support.
  • SPEARMINT: Adds depthfunc disable to shaders.
  • SPEARMINT: Add new wave types noise and random to shaders.
  • SPEARMINT: Adds a entity renderer flag for forcing alpha, so any model can be made transparent (RF_FORCE_ENT_ALPHA)
  • NOTSPEARMINT: Adds a entity renderer flag that forces full bright (RF_FULLBRIGHT)
    • ZTM: Replaced in Spearmint with RF_CONST_AMBIENT and float ambientLight[3] in refEntity_t
  • Adds new rendering types
    • ZTM: Planning to allow putting them in the cgame code. See issue 135.
  • TURTLEARENA: Add new animations.cfg option "soundpath", allows setting directory name for "sounds/players/MODELNAME/"
    • ZTM: Added in Turtle Arena (but changed many data structs for holding/loading animations.cfg so not really easy to share between Speamint and Turtle Arena at the moment).
  • NOTSPEARMINT: SVF_SHIELD_BBOX -- changes how what bounds are bit packed in entityState_t::int solid and sets EF_SHIELD_BOX_X or EF_SHIELD_BOX_Y. (Spearmint sends all bounds, so this is not needed.)

New cgame to client calls

  • (modifed) CG_S_STARTBACKGROUNDTRACK. if intro is NULL or "", calls S_StopBackgroundTrack
  • NOTSPEARMINT: CG_R_REGISTERSHADER3D (Register shader using LIGHTMAP_NONE, like R_RegisterSkin. CG_R_REGISTERSHADER uses LIGHTMAP_2D.)
    • ZTM: Added CG_R_REGISTERSHADEREX which takes lightmap index and nomipmaps.
  • NOTIMPLEMENTED: CG_CVAR_SET_NO_MODIFY (just returns qfalse)

Jedi Knight 2: Jedi Outcast

TODO: Review what is new in the engine.

Jedi Academy

TODO: Finish reviewing what is new in the engine.

JA URL: https://sourceforge.net/projects/jedioutcast/ (it was mislabled at release as outcast)

JA Xbox URL: https://sourceforge.net/projects/jediacademy/

Note: have been removed from sourceforge.

JAMP

Major things

  • ICARUS scripting engine (server/game) (ZTM: what exactly is it used for?)
  • New navigation code for NPCs
  • Ghoul2 models, which has various IK and ragdoll features.
  • Ambient sound effect system

Other notable things

  • Extra playerState_t sent for vehicle player is riding
  • Removed SVF_CLIENTMASK, replaced with int broadcastClients[2] in entityShared_t ?
  • SPEARMINT: MP3 support

New server flags (Note: removed SVF_CLIENTMASK, replaced with int broadcastClients[2]

#define SVF_PLAYER_USABLE		0x00000010	// player can use this with the use button

...

#define SVF_OWNERNOTSHARED		0x00001000	// If it's owned by something and another thing owned by that something
											// hits it, it will still touch

#define	SVF_ICARUS_FREEZE		0x00008000	// NPCs are frozen, ents don't execute ICARUS commands

#define SVF_GLASS_BRUSH			0x08000000	// Ent is a glass brush

#define SVF_NO_BASIC_SOUNDS		0x10000000	// No basic sounds
#define SVF_NO_COMBAT_SOUNDS	0x20000000	// No combat sounds
#define SVF_NO_EXTRA_SOUNDS		0x40000000	// No extra or jedi sounds

New UI to client calls

  • SPEARMINT(modified): UI_R_SHADERNAMEFROMINDEX,
    • ZTM: added a system call (trap_R_GetShaderName) that has different API, both get shader name for handle.
  • UI_R_FONT_STRLENPIXELS,
  • UI_R_FONT_STRLENCHARS,
  • UI_R_FONT_STRHEIGHTPIXELS,
  • UI_R_FONT_DRAWSTRING,
  • UI_LANGUAGE_ISASIAN,
  • UI_LANGUAGE_USESSPACES,
  • UI_ANYLANGUAGE_READCHARFROMSTRING,
  • UI_PC_LOAD_GLOBAL_DEFINES,
  • SPEARMINT: UI_PC_REMOVE_ALL_GLOBAL_DEFINES (Also in WolfET)
  • NOTSPEARMINT: UI_MATRIXMULTIPLY,
  • NOTSPEARMINT: UI_ANGLEVECTORS,
  • NOTSPEARMINT: UI_PERPENDICULARVECTOR,
  • SPEARMINT: UI_FLOOR,
  • SPEARMINT: UI_CEIL,
  • NOTSPEARMINT: UI_TESTPRINTINT,
  • NOTSPEARMINT: UI_TESTPRINTFLOAT,
  • SPEARMINT: UI_ACOS,
  • SPEARMINT: UI_ASIN,
  • UI_SP_GETNUMLANGUAGES,
  • UI_SP_GETLANGUAGENAME,
  • UI_SP_GETSTRINGTEXTSTRING = 200,
  • UI_G2_LISTSURFACES,
  • UI_G2_LISTBONES,
  • UI_G2_SETMODELS,
  • UI_G2_HAVEWEGHOULMODELS,
  • UI_G2_GETBOLT,
  • UI_G2_GETBOLT_NOREC,
  • UI_G2_GETBOLT_NOREC_NOROT,
  • UI_G2_INITGHOUL2MODEL,
  • UI_G2_COLLISIONDETECT,
  • UI_G2_COLLISIONDETECTCACHE,
  • UI_G2_CLEANMODELS,
  • UI_G2_ANGLEOVERRIDE,
  • UI_G2_PLAYANIM,
  • UI_G2_GETBONEANIM,
  • UI_G2_GETBONEFRAME,
  • UI_G2_GETGLANAME,
  • UI_G2_COPYGHOUL2INSTANCE,
  • UI_G2_COPYSPECIFICGHOUL2MODEL,
  • UI_G2_DUPLICATEGHOUL2INSTANCE,
  • UI_G2_HASGHOUL2MODELONINDEX,
  • UI_G2_REMOVEGHOUL2MODEL,
  • UI_G2_ADDBOLT,
  • UI_G2_SETBOLTON,
  • UI_G2_SETROOTSURFACE,
  • UI_G2_SETSURFACEONOFF,
  • UI_G2_SETNEWORIGIN,
  • UI_G2_GETTIME,
  • UI_G2_SETTIME,
  • UI_G2_SETRAGDOLL,
  • UI_G2_ANIMATEG2MODELS,
  • UI_G2_SETBONEIKSTATE,
  • UI_G2_IKMOVE,
  • UI_G2_GETSURFACENAME,
  • UI_G2_SETSKIN,
  • UI_G2_ATTACHG2MODEL,

New client to UI calls

  • UI_MENU_RESET

New client to UI menu commands

  • UIMENU_PLAYERCONFIG,
  • UIMENU_PLAYERFORCE,
  • UIMENU_SIEGEMESSAGE,
  • UIMENU_SIEGEOBJECTIVES,
  • UIMENU_VOICECHAT,
  • UIMENU_CLOSEALL,
  • UIMENU_CLASSSEL

New cgame to client calls

// for profiling.. do not use for game related tasks.

  • CG_PRECISIONTIMER_START,
  • CG_PRECISIONTIMER_END,
  • NOTSPEARMINT: CG_CVAR_GETHIDDENVALUE
    • ZTM: unused. it does atoi( .. ) on uninitialized variable.
  • SPEARMINT: CG_FS_GETFILELIST
  • CG_S_GETVOICEVOLUME, (ZTM: Sounds similar to RTCW's CG_S_GETVOICEAMPLITUDE)
  • CG_S_MUTESOUND,
  • CG_S_SHUTUP,
    • ZTM: used for disabling/enabling missing sound file warnings, I think I'd rather pass an arg to trap_S_RegisterSound...
  • //rww - AS trap implem
  • CG_S_UPDATEAMBIENTSET,
  • CG_AS_PARSESETS,
  • CG_AS_ADDPRECACHEENTRY,
  • CG_S_ADDLOCALSET,
  • CG_AS_GETBMODELSOUND,
  • CG_R_FONT_STRLENPIXELS,
  • CG_R_FONT_STRLENCHARS,
  • CG_R_FONT_STRHEIGHTPIXELS,
  • CG_R_FONT_DRAWSTRING,
  • CG_LANGUAGE_ISASIAN,
  • CG_LANGUAGE_USESSPACES,
  • CG_ANYLANGUAGE_READCHARFROMSTRING,
  • SPEARMINT: CGAME_ACOS,
  • SPEARMINT: CGAME_ASIN,
  • CG_R_ADDDECALTOSCENE, (WolfET has CG_R_PROJECTDECAL which might be similar?)
  • CG_R_CLEARDECALS (WolfET has a syscall named this)
  • CG_R_DRAWROTATEPIC, // ZTM: Rotated at upper right
  • SPEARMINT(modified): CG_R_DRAWROTATEPIC2, // ZTM: Rotated at center
    • ZTM: Spearmint has RTCW's CG_R_DRAWROTATEDPIC which is center rotated, last 2 args are different order. I do not know if they rotate the same direction.
  • NOTSPEARMINT: CG_R_SETRANGEFOG, //linear fogging, with settable range -rww
    • ZTM: Spearmint's view fog in refdef should handle use case for this. Though code might be useful for fixing GL fog mode, though RTCW might still be useful for that too.
  • CG_R_SETREFRACTIONPROP, //set some properties for the draw layer for my refractive effect (here primarily for mod authors) -rww
  • CG_R_GET_LIGHT_STYLE,
  • CG_R_SET_LIGHT_STYLE,
  • CG_R_GET_BMODEL_VERTS,
  • NOTSPEARMINT: CG_R_GETDISTANCECULL,
    • ZTM: gets "distanceCull" from worldspawn, which cgame can access and get directly in cg_spawn.c. Though I have not fully looked at usage in renderer and cgame. The renderer code distance limiting/culling looks similar to how rtcw and/or et handled global fog (and merged in Spearmint).
  • NOTSPEARMINT: CG_R_GETREALRES,
    • ZTM: Can get it from glconfig instead.
  • CG_R_AUTOMAPELEVADJ,
  • CG_R_INITWIREFRAMEAUTO,
  • CG_FX_ADDLINE,
  • CG_GETDEFAULTSTATE
    • ZTM: If entity has EF_PERMANENT isn't not sent in snapshots. This syscall gets entityState_t baseline if has eFlag EF_PERMANENT set. This allows non-changing entities to not take up a slot in snapshots. Interesting.
      • ZTM: Used for misc_bsp, func_static in bsp loaded by misc_bsp, and some target_speaker entities.
  • NOTSPEARMINT: CG_SETCLIENTFORCEANGLE
    • ZTM: Forces viewangles to a specified direction until a time is reached. Can do in Spearmint CGame VM.
  • NOTIMPLEMENTED: CG_SETCLIENTTURNEXTENT
    • ZTM: Just returns 0.
  • NOTSPEARMINT: CG_OPENUIMENU
    • ZTM: Calls set active menu in UI VM, passing a menu number. Can do in Spearmint CGame directly, or (in other games) add a ui command for cgame to run.
  • CG_PC_LOAD_GLOBAL_DEFINES,
  • SPEARMINT: CG_PC_REMOVE_ALL_GLOBAL_DEFINES, (Also in WolfET)

// New effects system

  • CG_FX_REGISTER_EFFECT,
  • CG_FX_PLAY_EFFECT,
  • CG_FX_PLAY_ENTITY_EFFECT,
  • CG_FX_PLAY_EFFECT_ID,
  • CG_FX_PLAY_PORTAL_EFFECT_ID,
  • CG_FX_PLAY_ENTITY_EFFECT_ID,
  • CG_FX_PLAY_BOLTED_EFFECT_ID,
  • CG_FX_ADD_SCHEDULED_EFFECTS,
  • CG_FX_INIT_SYSTEM,
  • CG_FX_SET_REFDEF,
  • CG_FX_FREE_SYSTEM,
  • CG_FX_ADJUST_TIME,
  • CG_FX_DRAW_2D_EFFECTS,
  • CG_FX_RESET,
  • CG_FX_ADDPOLY,
  • CG_FX_ADDBEZIER,
  • CG_FX_ADDPRIMITIVE,
  • CG_FX_ADDSPRITE,
  • CG_FX_ADDELECTRICITY,
//
  • CG_SP_GETSTRINGTEXTSTRING,
    • ZTM: for translation, gettext might be better for new games.

// ZTM: used for moving player/entities (looks like stated via ICARUS scripts)

  • CG_ROFF_CLEAN,
  • CG_ROFF_UPDATE_ENTITIES,
  • CG_ROFF_CACHE,
  • CG_ROFF_PLAY,
  • CG_ROFF_PURGE_ENT,

//rww - dynamic vm memory allocation!

  • CG_TRUEMALLOC,
  • CG_TRUEFREE,
    • ZTM: JA code for these is not qvm compatible. I've added my own trap_Alloc that works for qvms. No free yet though.

// Ghoul2 API

  • CG_G2_LISTSURFACES,
  • CG_G2_LISTBONES,
  • CG_G2_SETMODELS,
  • CG_G2_HAVEWEGHOULMODELS,
  • CG_G2_GETBOLT,
  • CG_G2_GETBOLT_NOREC,
  • CG_G2_GETBOLT_NOREC_NOROT,
  • CG_G2_INITGHOUL2MODEL,
  • CG_G2_SETSKIN,
  • CG_G2_COLLISIONDETECT,
  • CG_G2_COLLISIONDETECTCACHE,
  • CG_G2_CLEANMODELS,
  • CG_G2_ANGLEOVERRIDE,
  • CG_G2_PLAYANIM,
  • CG_G2_GETBONEANIM,
  • CG_G2_GETBONEFRAME,
  • CG_G2_GETGLANAME,
  • CG_G2_COPYGHOUL2INSTANCE,
  • CG_G2_COPYSPECIFICGHOUL2MODEL,
  • CG_G2_DUPLICATEGHOUL2INSTANCE,
  • CG_G2_HASGHOUL2MODELONINDEX,
  • CG_G2_REMOVEGHOUL2MODEL,
  • CG_G2_SKINLESSMODEL,
  • CG_G2_GETNUMGOREMARKS,
  • CG_G2_ADDSKINGORE,
  • CG_G2_CLEARSKINGORE,
  • CG_G2_SIZE,
  • CG_G2_ADDBOLT,
  • CG_G2_ATTACHENT,
  • CG_G2_SETBOLTON,
  • CG_G2_SETROOTSURFACE,
  • CG_G2_SETSURFACEONOFF,
  • CG_G2_SETNEWORIGIN,
  • CG_G2_DOESBONEEXIST,
  • CG_G2_GETSURFACERENDERSTATUS,
  • CG_G2_GETTIME,
  • CG_G2_SETTIME,
  • CG_G2_ABSURDSMOOTHING,
  • CG_G2_SETRAGDOLL,
  • CG_G2_ANIMATEG2MODELS,
  • CG_G2_RAGPCJCONSTRAINT,
  • CG_G2_RAGPCJGRADIENTSPEED,
  • CG_G2_RAGEFFECTORGOAL,
  • CG_G2_GETRAGBONEPOS,
  • CG_G2_RAGEFFECTORKICK,
  • CG_G2_RAGFORCESOLVE,
  • CG_G2_SETBONEIKSTATE,
  • CG_G2_IKMOVE,
  • CG_G2_REMOVEBONE,
  • CG_G2_ATTACHINSTANCETOENTNUM,
  • CG_G2_CLEARATTACHEDINSTANCE,
  • CG_G2_CLEANENTATTACHMENTS,
  • CG_G2_OVERRIDESERVER,
  • CG_G2_GETSURFACENAME,

//

  • CG_SET_SHARED_BUFFER,
    • ZTM: Used for "passing" data from client to cgame, in a way that is compatible with qvms. Interesting.

// Random Map Generation stuff.

  • CG_CM_REGISTER_TERRAIN,
  • CG_RMG_INIT,
  • CG_RE_INIT_RENDERER_TERRAIN,

// Weather effects stuff

  • CG_R_WEATHER_CONTENTS_OVERRIDE,
  • CG_R_WORLDEFFECTCOMMAND,
  • CG_WE_ADDWEATHERZONE

New client to cgame calls

  • CG_POINT_CONTENTS,
// int CG_PointContents( const vec3_t point, int passEntityNum );
    • ZTM: Unused.
  • CG_GET_LERP_ORIGIN,
// void CG_LerpOrigin(int num, vec3_t result);
  • ZTM: Used by FX code to find entity locations.
  • CG_GET_LERP_DATA,
  • CG_GET_GHOUL2,
  • CG_GET_MODEL_LIST,
  • CG_CALC_LERP_POSITIONS,
// void CG_CalcEntityLerpPositions(int num);
    • ZTM: Unused. SP CGame calls it directly from FX code. For MP, FX code is in engine, though this call is not used.
  • CG_TRACE,
  • CG_G2TRACE,
//void CG_Trace( trace_t *result, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, // int skipNumber, int mask );
  • CG_G2MARK,
  • CG_RAG_CALLBACK,
  • NOTSPEARMINT: CG_INCOMING_CONSOLE_COMMAND
    • ZTM: Lets CGame reject/replace commands entered in in-game console and in binds. Can be done in Spearmint CGame VM because console and bind executing is handled there.
  • CG_GET_USEABLE_FORCE,
  • CG_GET_ORIGIN, // int entnum, vec3_t origin
  • CG_GET_ANGLES, // int entnum, vec3_t angle
  • CG_GET_ORIGIN_TRAJECTORY, // int entnum
  • CG_GET_ANGLE_TRAJECTORY, // int entnum
  • CG_ROFF_NOTETRACK_CALLBACK, // int entnum, char *notetrack
  • CG_IMPACT_MARK,
//void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir, // float orientation, float red, float green, float blue, float alpha, // qboolean alphaFade, float radius, qboolean temporary )
  • CG_MAP_CHANGE,
  • CG_AUTOMAP_INPUT,
  • CG_MISC_ENT, //rwwRMG - added
  • CG_GET_SORTED_FORCE_POWER,
  • CG_FX_CAMERASHAKE,//mcg post-gold added

New game to server calls

  • // for profiling.. do not use for game related tasks.
  • G_PRECISIONTIMER_START,
  • G_PRECISIONTIMER_END,
  • G_SET_SERVER_CULL, //server culling to reduce traffic on open maps -rww
    • ZTM: Used for "distanceCull" worldspawn key to set entity cull distance.
      • Can this be done in GAME_SNAPSHOT_CALLBACK ? Yes, though performance would be better in engine.
        • Should entityShared_t's portalCullDistance be changed so it works with all entity types? It would fully replace use case for G_SET_SERVER_CULL.
  • G_G2TRACE, // ( trace_t *results, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentmask ); // collision detection against all linked entities with ghoul2 check
  • NOTSPEARMINT: G_SIEGEPERSSET,
  • NOTSPEARMINT: G_SIEGEPERSGET,
    • ZTM: These are used to save three numbers across levels, which can be done using a console variable.
  • SP_GETSTRINGTEXTSTRING,
    • ZTM: Used for translation, gettext might be better a option for new games.

// ZTM: used for moving player/entities (looks like stated via ICARUS scripts)

  • G_ROFF_CLEAN, // qboolean ROFF_Clean(void);
  • G_ROFF_UPDATE_ENTITIES, // void ROFF_UpdateEntities(void);
  • G_ROFF_CACHE, // int ROFF_Cache(char *file);
  • G_ROFF_PLAY, // qboolean ROFF_Play(int entID, int roffID, qboolean doTranslation);
  • G_ROFF_PURGE_ENT, // qboolean ROFF_PurgeEnt( int entID )

//rww - dynamic vm memory allocation!

  • G_TRUEMALLOC,
  • G_TRUEFREE,
    • ZTM: See cgame note above for CG_TRUEMALLOC.

// Map/entity scripting stuff

  • G_ICARUS_RUNSCRIPT,
  • G_ICARUS_REGISTERSCRIPT,
  • G_ICARUS_INIT,
  • G_ICARUS_VALIDENT,
  • G_ICARUS_ISINITIALIZED,
  • G_ICARUS_MAINTAINTASKMANAGER,
  • G_ICARUS_ISRUNNING,
  • G_ICARUS_TASKIDPENDING,
  • G_ICARUS_INITENT,
  • G_ICARUS_FREEENT,
  • G_ICARUS_ASSOCIATEENT,
  • G_ICARUS_SHUTDOWN,
  • G_ICARUS_TASKIDSET,
  • G_ICARUS_TASKIDCOMPLETE,
  • G_ICARUS_SETVAR,
  • G_ICARUS_VARIABLEDECLARED,
  • G_ICARUS_GETFLOATVARIABLE,
  • G_ICARUS_GETSTRINGVARIABLE,
  • G_ICARUS_GETVECTORVARIABLE,
  • G_SET_SHARED_BUFFER,
    • ZTM: Used for "passing" data from server to game, in a way that is compatible with qvms. Interesting.
  • SPEARMINT: G_ACOS,
  • SPEARMINT: G_ASIN,

// ZTM: New C++ NPC Navigation stuff.

  • G_NAV_INIT = 200,
  • G_NAV_FREE,
  • G_NAV_LOAD,
  • G_NAV_SAVE,
  • G_NAV_ADDRAWPOINT,
  • G_NAV_CALCULATEPATHS,
  • G_NAV_HARDCONNECT,
  • G_NAV_SHOWNODES,
  • G_NAV_SHOWEDGES,
  • G_NAV_SHOWPATH,
  • G_NAV_GETNEARESTNODE,
  • G_NAV_GETBESTNODE,
  • G_NAV_GETNODEPOSITION,
  • G_NAV_GETNODENUMEDGES,
  • G_NAV_GETNODEEDGE,
  • G_NAV_GETNUMNODES,
  • G_NAV_CONNECTED,
  • G_NAV_GETPATHCOST,
  • G_NAV_GETEDGECOST,
  • G_NAV_GETPROJECTEDNODE,
  • G_NAV_CHECKFAILEDNODES,
  • G_NAV_ADDFAILEDNODE,
  • G_NAV_NODEFAILED,
  • G_NAV_NODESARENEIGHBORS,
  • G_NAV_CLEARFAILEDEDGE,
  • G_NAV_CLEARALLFAILEDEDGES,
  • G_NAV_EDGEFAILED,
  • G_NAV_ADDFAILEDEDGE,
  • G_NAV_CHECKFAILEDEDGE,
  • G_NAV_CHECKALLFAILEDEDGES,
  • G_NAV_ROUTEBLOCKED,
  • G_NAV_GETBESTNODEALTROUTE,
  • G_NAV_GETBESTNODEALT2,
  • G_NAV_GETBESTPATHBETWEENENTS,
  • G_NAV_GETNODERADIUS,
  • G_NAV_CHECKBLOCKEDEDGES,
  • G_NAV_CLEARCHECKEDNODES,
  • G_NAV_CHECKEDNODE,
  • G_NAV_SETCHECKEDNODE,
  • G_NAV_FLAGALLNODES,
  • G_NAV_GETPATHSCALCULATED,
  • G_NAV_SETPATHSCALCULATED,
  • SPEARMINT(does-not-need-a-trap): BOTLIB_EA_ALT_ATTACK,
  • SPEARMINT(does-not-need-a-trap): BOTLIB_EA_FORCEPOWER,

// Ghoul2 API

  • G_G2_LISTBONES,
  • G_G2_LISTSURFACES,
  • G_G2_HAVEWEGHOULMODELS,
  • G_G2_SETMODELS,
  • G_G2_GETBOLT,
  • G_G2_GETBOLT_NOREC,
  • G_G2_GETBOLT_NOREC_NOROT,
  • G_G2_INITGHOUL2MODEL,
  • G_G2_SETSKIN,
  • G_G2_SIZE,
  • G_G2_ADDBOLT,
  • G_G2_SETBOLTINFO,
  • G_G2_ANGLEOVERRIDE,
  • G_G2_PLAYANIM,
  • G_G2_GETBONEANIM,
  • G_G2_GETGLANAME,
  • G_G2_COPYGHOUL2INSTANCE,
  • G_G2_COPYSPECIFICGHOUL2MODEL,
  • G_G2_DUPLICATEGHOUL2INSTANCE,
  • G_G2_HASGHOUL2MODELONINDEX,
  • G_G2_REMOVEGHOUL2MODEL,
  • G_G2_REMOVEGHOUL2MODELS,
  • G_G2_CLEANMODELS,
  • G_G2_COLLISIONDETECT,
  • G_G2_COLLISIONDETECTCACHE,
  • G_G2_SETROOTSURFACE,
  • G_G2_SETSURFACEONOFF,
  • G_G2_SETNEWORIGIN,
  • G_G2_DOESBONEEXIST,
  • G_G2_GETSURFACERENDERSTATUS,
  • G_G2_ABSURDSMOOTHING,
  • G_G2_SETRAGDOLL,
  • G_G2_ANIMATEG2MODELS,
  • G_G2_RAGPCJCONSTRAINT,
  • G_G2_RAGPCJGRADIENTSPEED,
  • G_G2_RAGEFFECTORGOAL,
  • G_G2_GETRAGBONEPOS,
  • G_G2_RAGEFFECTORKICK,
  • G_G2_RAGFORCESOLVE,
  • G_G2_SETBONEIKSTATE,
  • G_G2_IKMOVE,
  • G_G2_REMOVEBONE,
  • G_G2_ATTACHINSTANCETOENTNUM,
  • G_G2_CLEARATTACHEDINSTANCE,
  • G_G2_CLEANENTATTACHMENTS,
  • G_G2_OVERRIDESERVER,
  • G_G2_GETSURFACENAME,
  • G_SET_ACTIVE_SUBBSP,
    • ZTM: Used for JA's misc_bsp entity which displays a BSP inside of a map. Interesting.

// Random Map Generation stuff

  • G_CM_REGISTER_TERRAIN,
  • G_RMG_INIT,

// Bot

  • G_BOT_UPDATEWAYPOINTS,
  • G_BOT_CALCULATEPATHS

New server to game calls

  • GAME_ROFF_NOTETRACK_CALLBACK, // int entnum, char *notetrack
  • GAME_SPAWN_RMG_ENTITY, // ZTM: Random Map Generation callback for spawning entities
  • GAME_ICARUS_PLAYSOUND,
  • GAME_ICARUS_SET,
  • GAME_ICARUS_LERP2POS,
  • GAME_ICARUS_LERP2ORIGIN,
  • GAME_ICARUS_LERP2ANGLES,
  • GAME_ICARUS_GETTAG,
  • GAME_ICARUS_LERP2START,
  • GAME_ICARUS_LERP2END,
  • GAME_ICARUS_USE,
  • GAME_ICARUS_KILL,
  • GAME_ICARUS_REMOVE,
  • GAME_ICARUS_PLAY,
  • GAME_ICARUS_GETFLOAT,
  • GAME_ICARUS_GETVECTOR,
  • GAME_ICARUS_GETSTRING,
  • GAME_ICARUS_SOUNDINDEX,
  • GAME_ICARUS_GETSETIDFORSTRING,
  • GAME_NAV_CLEARPATHTOPOINT,
  • GAME_NAV_CLEARLOS,
  • GAME_NAV_CLEARPATHBETWEENPOINTS,
  • GAME_NAV_CHECKNODEFAILEDFORENT,
  • GAME_NAV_ENTISUNLOCKEDDOOR,
  • GAME_NAV_ENTISDOOR,
  • GAME_NAV_ENTISBREAKABLE,
  • GAME_NAV_ENTISREMOVABLEUSABLE,
  • GAME_NAV_FINDCOMBATPOINTWAYPOINTS,
  • NOTSPEARMINT: GAME_GETITEMINDEXBYTAG
    • ZTM: Unused and I do not see a use for it.

JAMP (Xbox)

The Jedi Academy GPL release appears to be the Xbox port, which as some changes made to multiplayer VM APIs. Mostly removing stuff some is commented out, others are just gone. :S

Removed server entity flags

  • SVF_NO_BASIC_SOUNDS // No basic sounds
  • SVF_NO_COMBAT_SOUNDS // No combat sounds
  • SVF_NO_EXTRA_SOUNDS // No extra or jedi sounds

New client to UI calls

  • removed UI_G2_COLLISIONDETECTCACHE

New client to UI menu commands

  • UIMENU_DEDICATED,
  • UIMENU_NOCONTROLLERINGAME,
  • UIMENU_NOCONTROLLER

New cgame to client calls

  • CG_PRINTALWAYS
  • CG_G2_GETMODELNAME
  • removed CG_G2_COLLISIONDETECTCACHE

New client to cgame calls

  • removed CG_FX_CAMERASHAKE,//mcg post-gold added

New game to server calls

  • removed BOTLIB_AI_ALLOC_CHAT_STATE,
  • removed BOTLIB_AI_FREE_CHAT_STATE,
  • removed BOTLIB_AI_QUEUE_CONSOLE_MESSAGE,
  • removed BOTLIB_AI_REMOVE_CONSOLE_MESSAGE,
  • removed BOTLIB_AI_NEXT_CONSOLE_MESSAGE,
  • removed BOTLIB_AI_NUM_CONSOLE_MESSAGE,
  • removed BOTLIB_AI_INITIAL_CHAT,
  • removed BOTLIB_AI_REPLY_CHAT,
  • removed BOTLIB_AI_CHAT_LENGTH,
  • removed BOTLIB_AI_ENTER_CHAT,
  • removed BOTLIB_AI_STRING_CONTAINS,
  • removed BOTLIB_AI_FIND_MATCH,
  • removed BOTLIB_AI_MATCH_VARIABLE,
  • removed BOTLIB_AI_UNIFY_WHITE_SPACES,
  • removed BOTLIB_AI_REPLACE_SYNONYMS,
  • removed BOTLIB_AI_LOAD_CHAT_FILE,
  • removed BOTLIB_AI_SET_CHAT_GENDER,
  • removed BOTLIB_AI_SET_CHAT_NAME,
  • removed G_G2_COLLISIONDETECTCACHE

New server to game calls

No change.

Smokin' Guns

TODO: Review what's new in the engine beyond cg_public.h, g_public.h, and ui_public.h

  • Has FBO post processor effects?

New Cgame system calls:

  • CG_R_CULL_BBOX
  • CG_R_CULL_SPHERE
  • CG_R_FRUSTUM_PLANE
  • CG_GETENV

Space Trader

TODO: Fully review Space Trader.

  • Has post-processor effects (such as bloom)
  • Has new game/cgame/ui system calls for SQL
  • DDS image support
  • x42 skeleton model support (a new format, created for Space Trader), see https://github.com/pdjonov/x42/wiki

There is quite a few new system calls.

OpenWolf

OpenWolf is based on ETXreal. It has support for running WolfET and Tremulous. And Q3A? Well, it probably has all the needed engine features since it can run Tremulous.

It was a straight forward merge of ET and Tremulous entityState_t, playerState_t, etc.

(incomplete features list) IRC client, MySQL database access for Game VM, RSA Public Keys, and dynamic OpenSSL libraries. Parts of Doom 3 were merged in as well.

I'm not planning to merge it's features into Spearmint.

URL: https://github.com/TheDushan/OpenWolf

Unvanquished

Unvanquished ("Daemon engine") is based on OpenWolf. It's a Tremulous-based game. It's using new things like libRocket for UI, portable native client (PNaCl), and has graphic enhancements. It's being rewritten in C++.

I'm not planning to merge it's features into Spearmint.

URL: https://github.com/Unvanquished/Unvanquished

Close Source

Could play, check SDKs, dump EXE/DLL strings, and look through pk3s.

Elite Force Single Player

  • IOQ3: Add MDR model format.
  • TURTLEARENA: Animations.cfg supports using animation keywords for defining animations (Example: BOTH_DEATH 0 5 0 0)

Heavy Metal: F.A.K.K.²

TODO: review this more.

A few games are based on this engine, Alice, Medal of Honor, and Elite Force 2. The new stuff added to the engine is call Ritual's ÜberTools. http://www.ritualistic.com/content.php/games/uber/features.php (Note: describes features that are not present/used in FAKK from what I can tell, maybe in EF2 though?)

  • SPEARMINT: Adds new texture format (FTX) similar to uncompressed TGA.
    • ZTM: The format has a 12 byte header (width, height, has transparency) followed by unsigned RGBA bytes. Total data size is 12 + 4 * width * height bytes.
  • SPEARMINT: Adds if no_mtex .. endif to shaders.
  • SPEARMINT: Adds "nextbundle" shader stage keyword, allows multi-texturing to be used for things besides lightmaps.
  • Tiki scripts, model, and animation formats.
  • Modified BSP format.
    • ZTM: No open source map compiler as far as I know. SDK has engine headers with lump names though. I have not look to see if MoHAA uses same format, if it does then OpenMoHAA code could be used to load them.

Alice

TODO: review this more. It reuses many features from FAKK. FTX, TIKI, no_mtex, nextbundle, ...

UI designed is very similar to FAKK2.

Spearmint Supported FAKK features

  • SPEARMINT: Has support (and uses) for FTX images.
  • SPEARMINT: Adds if no_mtex .. endif to shaders.
  • SPEARMINT: nextbundle keyword for shaders.

New

  • SPEARMINT: Adds if shaderlod > <0.0 to 1.0> .. endif to shaders.

Elite Force 2

TODO: review this more. I have not looked at it much at all.

UI designed is very similar to FAKK2.

  • SPEARMINT: Adds if [no]vertexlight .. endif to shaders.
  • SPEARMINT: Adds if [no]detail .. endif to shaders.
  • nextbundle keyword for shaders. Spearmint only supports 2 bundles (as needed by FAKK/Alice), EF2 uses up to like 6 iirc.
  • DDS images. (and no FTX images iirc)

Medal of Honor

There is an incomplete engine recreation project. It has code for ritual fonts and tiki models, so it would be a useful start for any FAKK based engine recreation.

URL: http://sourceforge.net/projects/openmohaa/

  • Does not use if ... endif in shaders (a feature that was added to FAKK), it does have a commented #if 0 ... #endif iirc.

Call of Duty

Based on RTCW engine. Yet another war game.

Other Tools

(Because I wanted to stick this somewhere.)

Game Log Parser For Online Stats

URL: https://github.com/ppetr/tremstats