NetDuke32
About
NetDuke32 is a multiplayer-centric port based on EDuke32, developed by Jordon "StrikerTheHedgefox" Moss. Started late 2015 as a series of maintenance builds of EDuke32-OldMP, it has since branched out and evolved. NetDuke32 brings new features, QoL (Quality of Life) and netcode improvements, and tries to improve the overall multiplayer experience.
Features
(Page is a work in progress)
Documentation
NetDuke32 has a few exclusive DEF tokens, GameVars, and structure members to access a few of its features. They will be listed here.
NOTE: Since NetDuke32 is still very much an early work in progress, these may be subject to changes, deprecation, or outright removal.
DEF Tokens
- addplayercolor <palnum> <name> - Adds a palswap to the list of selectable player colors for multiplayer.
- Example:
addplayercolor 17 "Green (Blue Skin)"
- Example:
- delplayercolor <palnum> - Deletes a palswap from the list of selectable player colors for multiplayer. A value of -1 deletes them all. (Make sure to define your own after!)
- Example:
delplayercolor 23
(Which would make "Yellow" un-selectable.)
- Example:
CON Commands
- getinterpolatedpos <x1> <y1> <z1> <x2> <y2> <z2> <xreturn> <yreturn> <zreturn> - Returns the interpolated position between x1/y1/z1 and x2/y2/z2 for the currently drawn frame, useful in EVENT_ANIMATESPRITES and other display events where you might want to interpolate custom coordinates, or inherit the interpolated coords of another sprite.
- ldistvar <x1> <y1> <x2> <y2> <return> - Returns the distance between two arbitrary x/y coordinates.
- distvar <x1> <y1> <z1> <x2> <y2> <z2> <return> - Returns the distance between two arbitrary x/y/z coordinates.
GameVars
- predicting (Read-only) - Returns the processing state of NetDuke32's prediction system. Useful to prevent desynchronization or visual artifacts in certain scenarios; For example, trying to call
spawn
in player code that is normally predicted would result in a de-sync, but guarding it withifvare predicting 0
will make sure it only happens during the canonical gamestate, preserving synchronization.
- Values:
- 0 = Currently processing canonical gamestate.
- 1 = Currently predicting upcoming gamestate.
- 2 = Making corrections to any mispredictions.
- Values:
- numteams (Read-only) - Returns the number of currently defined teams for TDM.
- Example:
whilevarvarl TEMP numteams { addvar TEMP 1 }
(Will loop while TEMP is less than numteams. Useful for things like displaying information for all teams, or setting an attribute for all.)
- Example:
- DMFLAGS - Gets or sets the current DMFlags. See UserDefs section for a list of flags.
- Examples:
ifvarand DMFLAGS 4 { spawn LIZTROOP }
(Will spawn a LIZTROOP if DMFLAG_RESPAWNMONSTERS is enabled.)orvar DMFLAGS 256
(Will enable DMFLAG_NOPLAYERID)
- Examples:
Structure Members
UserDefs (get/setuserdef[].)
- teampal <teamnum> - Team's palette number.
- Example:
getuserdef[].teampal 2 TEMP // Gets team's palswap.
- Example:
- teamfrags <teamnum> - Team's frag count.
- Example:
getuserdef[].teampal 2 TEMP // Gets team's frag count.
- Example:
- teamsuicides <teamnum> - Team's number of suicides.
- Example:
setuserdef[].teamsuicides 2 0 // Sets team's suicides to 0.
- Example:
- dmflags - A bitfield containing a series of gameplay-affecting flags, such as friendly fire, respawning items, whether or not FOV changes are allowed, etc.
- Flags:
- DMFLAG_FRIENDLYFIRE = 1
- DMFLAG_NOMONSTERS = 2
- DMFLAG_RESPAWNMONSTERS = 4
- DMFLAG_RESPAWNITEMS = 8
- DMFLAG_RESPAWNINVENTORY = 16
- DMFLAG_MARKERS = 32
- DMFLAG_NOEXITS = 64
- DMFLAG_WEAPONSTAY = 128
- DMFLAG_NOPLAYERID = 256
- DMFLAG_NOFOVCHANGE = 512
- DMFLAG_NOWEAPONICONS = 1024
- DMFLAG_ALLOWVISIBILITYCHANGE = 2048
- DMFLAG_NODMWEAPONSPAWNS = 4096
- Flags:
- m_dmflags - Same as above, but contains the flags selected in the menu, before being confirmed and transferred to dmflags when starting a new map.
Player (get/setplayer[].)
- lowsprite - The sprite the player is standing above, if applicable. (-1 if no sprite, >= 0 if there is one.)
- highsprite - The sprite the player is standing underneath, if applicable. (-1 if no sprite, >= 0 if there is one.)
- Examples:
getplayer[THISACTOR].on_ground TEMP ifvare TEMP 1 // We're standing on something... { getplayer[THISACTOR].lowsprite TEMP // Get sprite we're above ifvarn TEMP -1 // We're above something... { getactor[TEMP].picnum TEMP2 // Get picnum... ifvare TEMP2 SEENINE // We're standing on a SEENINE! { setactor[TEMP].htextra 9999 // It's unstable! It's gonna explode! } } } getplayer[THISACTOR].highsprite TEMP // Get sprite we're under. ifvarn TEMP -1 // We're under something... { getactor[TEMP].picnum TEMP2 // Get picnum... ifvare TEMP2 THWOMP // Oh no, it's a thwomp from mario! (implying a custom actor, here.) { setactorvar[TEMP].CRUSH_DUKE 1 // Signal to the thwomp to make a Duke Burger. } }
Compiling NetDuke32
The process of compiling NetDuke32 is identical to these articles, except in MinGW and Linux, you type make oldmp
instead of make
.