Merge branch 'next' into 'setflip'

# Conflicts:
#   src/p_local.h
This commit is contained in:
SMS Alfredo 2023-11-06 00:47:51 +00:00
commit c2c157603b
53 changed files with 1193 additions and 1250 deletions

View file

@ -159,6 +159,9 @@ stages:
Debian testing GCC: Debian testing GCC:
stage: build stage: build
when: manual
image: debian:testing-slim image: debian:testing-slim
allow_failure: true allow_failure: true
@ -198,6 +201,8 @@ Debian testing GCC:
Windows x86: Windows x86:
stage: build stage: build
when: on_success
artifacts: artifacts:
paths: paths:
- "bin/" - "bin/"
@ -228,6 +233,8 @@ Windows x86:
Debian stable:amd64: Debian stable:amd64:
stage: build stage: build
when: on_success
artifacts: artifacts:
paths: paths:
- "bin/" - "bin/"
@ -270,6 +277,8 @@ Debian stable:amd64:
Debian stable:i386: Debian stable:i386:
stage: build stage: build
when: manual
artifacts: artifacts:
paths: paths:
- "bin/" - "bin/"
@ -311,6 +320,8 @@ Debian stable:i386:
Debian stable:arm64: Debian stable:arm64:
stage: build stage: build
when: manual
artifacts: artifacts:
paths: paths:
- "bin/" - "bin/"
@ -345,7 +356,7 @@ Debian stable:arm64:
- - | - - |
# make # make
echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2" echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2"
- make --directory=src --keep-going CCACHE=1 ERRORMODE=1 LINUX64=1 ERRORMODE=1 NONX86=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 LINUX64=1 NONX86=1 - make --directory=src --keep-going CCACHE=1 ERRORMODE=1 LINUX64=1 ERRORMODE=1 NONX86=1C || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 LINUX64=1 NONX86=1 ARM64=1
- | - |
# make # make
echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K"
@ -353,6 +364,8 @@ Debian stable:arm64:
Windows x64: Windows x64:
stage: build stage: build
when: manual
artifacts: artifacts:
paths: paths:
- "bin/" - "bin/"
@ -383,6 +396,8 @@ Windows x64:
Debian stable Clang: Debian stable Clang:
stage: build stage: build
when: manual
allow_failure: true allow_failure: true
artifacts: artifacts:
@ -419,9 +434,50 @@ Debian stable Clang:
# make # make
echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K"
Debian stable musl:
stage: build
when: manual
allow_failure: true
artifacts:
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-musl"
variables:
CC: musl-gcc
LDD: musl-ldd
script:
- - |
# apt_toolchain
echo -e "\e[0Ksection_start:`date +%s`:apt_toolchain[collapsed=true]\r\e[0KInstalling toolchain packages"
- apt-get install gcc
- |
# apt_toolchain
echo -e "\e[0Ksection_end:`date +%s`:apt_toolchain\r\e[0K"
- - |
# apt_development
echo -e "\e[0Ksection_start:`date +%s`:apt_development[collapsed=true]\r\e[0KInstalling development packages"
- apt-get install musl-tools
- |
# apt_development
echo -e "\e[0Ksection_end:`date +%s`:apt_development\r\e[0K"
- - |
# make
echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2"
- make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 SDL=0 NOHW=1 NOZLIB=1 NOCURL=1 NOGME=1 NOOPENMPT=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 SDL=0 NOHW=1 NOZLIB=1 NOCURL=1 NOGME=1 NOOPENMPT=1
- |
# make
echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K"
Debian testing Clang: Debian testing Clang:
extends: Debian stable Clang extends: Debian stable Clang
when: manual
image: debian:testing-slim image: debian:testing-slim
artifacts: artifacts:
@ -432,3 +488,18 @@ Debian testing Clang:
WFLAGS: -Wno-cast-align -Wno-deprecated-non-prototype WFLAGS: -Wno-cast-align -Wno-deprecated-non-prototype
CFLAGS: -Wno-cast-align -Wno-deprecated-non-prototype CFLAGS: -Wno-cast-align -Wno-deprecated-non-prototype
LDFLAGS: -Wl,-fuse-ld=gold LDFLAGS: -Wl,-fuse-ld=gold
Debian testing musl:
extends: Debian stable musl
when: manual
image: debian:testing-slim
artifacts:
name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-testing-musl"
variables:
CC: musl-gcc
LDD: musl-ldd
LDFLAGS: -Wl,-fuse-ld=gold

View file

@ -543,13 +543,13 @@ static void CON_RecalcSize(void)
con_scalefactor = 1; con_scalefactor = 1;
break; break;
case V_SMALLSCALEPATCH: case V_SMALLSCALEPATCH:
con_scalefactor = vid.smalldupx; con_scalefactor = vid.smalldup;
break; break;
case V_MEDSCALEPATCH: case V_MEDSCALEPATCH:
con_scalefactor = vid.meddupx; con_scalefactor = vid.meddup;
break; break;
default: // Full scaling default: // Full scaling
con_scalefactor = vid.dupx; con_scalefactor = vid.dup;
break; break;
} }
@ -667,7 +667,7 @@ static void CON_MoveConsole(void)
} }
// Not instant - Increment fracmovement fractionally // Not instant - Increment fracmovement fractionally
fracmovement += FixedMul(cons_speed.value*vid.fdupy, renderdeltatics); fracmovement += FixedMul(cons_speed.value*vid.fdup, renderdeltatics);
if (con_curlines < con_destlines) // Move the console downwards if (con_curlines < con_destlines) // Move the console downwards
{ {
@ -1764,9 +1764,9 @@ static void CON_DrawBackpic(void)
con_backpic = W_CachePatchNum(piclump, PU_PATCH); con_backpic = W_CachePatchNum(piclump, PU_PATCH);
// Center the backpic, and draw a vertically cropped patch. // Center the backpic, and draw a vertically cropped patch.
w = (con_backpic->width * vid.dupx); w = con_backpic->width * vid.dup;
x = (vid.width / 2) - (w / 2); x = (vid.width / 2) - (w / 2);
h = con_curlines/vid.dupy; h = con_curlines/vid.dup;
// If the patch doesn't fill the entire screen, // If the patch doesn't fill the entire screen,
// then fill the sides with a solid color. // then fill the sides with a solid color.

View file

@ -1614,6 +1614,9 @@ void D_SRB2Main(void)
if (D_CheckNetGame()) if (D_CheckNetGame())
autostart = true; autostart = true;
if (!dedicated)
pickedchar = R_SkinAvailable(cv_defaultskin.string);
// check for a driver that wants intermission stats // check for a driver that wants intermission stats
// start the apropriate game based on parms // start the apropriate game based on parms
if (M_CheckParm("-metal")) if (M_CheckParm("-metal"))
@ -1627,8 +1630,6 @@ void D_SRB2Main(void)
autostart = true; autostart = true;
} }
pickedchar = R_SkinAvailable(cv_defaultskin.string);
// user settings come before "+" parameters. // user settings come before "+" parameters.
if (dedicated) if (dedicated)
COM_ImmedExecute(va("exec \"%s"PATHSEP"adedserv.cfg\"\n", srb2home)); COM_ImmedExecute(va("exec \"%s"PATHSEP"adedserv.cfg\"\n", srb2home));

View file

@ -607,6 +607,7 @@ typedef struct player_s
tic_t jointime; // Timer when player joins game to change skin/color tic_t jointime; // Timer when player joins game to change skin/color
tic_t quittime; // Time elapsed since user disconnected, zero if connected tic_t quittime; // Time elapsed since user disconnected, zero if connected
tic_t lastinputtime; // the last tic the player has made any input
#ifdef HWRENDER #ifdef HWRENDER
fixed_t fovadd; // adjust FOV for hw rendering fixed_t fovadd; // adjust FOV for hw rendering
#endif #endif

View file

@ -297,7 +297,8 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
CacheAndPushConstant(L, word, (lua_Integer)PF_FULLSTASIS); CacheAndPushConstant(L, word, (lua_Integer)PF_FULLSTASIS);
return 1; return 1;
} }
else if (fastcmp(p, "USEDOWN")) // Remove case when 2.3 nears release... // TODO: 2.3: Delete this alias
else if (fastcmp(p, "USEDOWN"))
{ {
CacheAndPushConstant(L, word, (lua_Integer)PF_SPINDOWN); CacheAndPushConstant(L, word, (lua_Integer)PF_SPINDOWN);
return 1; return 1;
@ -583,7 +584,8 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
return 0; return 0;
} }
if (fastcmp(word, "BT_USE")) // Remove case when 2.3 nears release... // TODO: 2.3: Delete this alias
if (fastcmp(word, "BT_USE"))
{ {
CacheAndPushConstant(L, word, (lua_Integer)BT_SPIN); CacheAndPushConstant(L, word, (lua_Integer)BT_SPIN);
return 1; return 1;
@ -771,8 +773,7 @@ int LUA_SOCLib(lua_State *L)
lua_register(L,"getActionName",lib_getActionName); lua_register(L,"getActionName",lib_getActionName);
luaL_newmetatable(L, META_ACTION); luaL_newmetatable(L, META_ACTION);
lua_pushcfunction(L, action_call); LUA_SetCFunctionField(L, "__call", action_call);
lua_setfield(L, -2, "__call");
lua_pop(L, 1); lua_pop(L, 1);
return 0; return 0;

View file

@ -911,6 +911,7 @@ static void readspriteframe(MYFILE *f, spriteinfo_t *sprinfo, UINT8 frame)
sprinfo->pivot[frame].x = value; sprinfo->pivot[frame].x = value;
else if (fastcmp(word, "YPIVOT")) else if (fastcmp(word, "YPIVOT"))
sprinfo->pivot[frame].y = value; sprinfo->pivot[frame].y = value;
// TODO: 2.3: Delete
else if (fastcmp(word, "ROTAXIS")) else if (fastcmp(word, "ROTAXIS"))
deh_warning("SpriteInfo: ROTAXIS is deprecated and will be removed."); deh_warning("SpriteInfo: ROTAXIS is deprecated and will be removed.");
else else
@ -1617,6 +1618,7 @@ void readlevelheader(MYFILE *f, INT32 num)
sizeof(mapheaderinfo[num-1]->musname), va("Level header %d: music", num)); sizeof(mapheaderinfo[num-1]->musname), va("Level header %d: music", num));
} }
} }
// TODO: 2.3: Delete
else if (fastcmp(word, "MUSICSLOT")) else if (fastcmp(word, "MUSICSLOT"))
deh_warning("Level header %d: MusicSlot parameter is deprecated and will be removed.\nUse \"Music\" instead.", num); deh_warning("Level header %d: MusicSlot parameter is deprecated and will be removed.\nUse \"Music\" instead.", num);
else if (fastcmp(word, "MUSICTRACK")) else if (fastcmp(word, "MUSICTRACK"))

View file

@ -1933,6 +1933,13 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_SMALLGRABCHAIN", "S_SMALLGRABCHAIN",
"S_BIGGRABCHAIN", "S_BIGGRABCHAIN",
// Blue spring on a ball
"S_BLUESPRINGBALL",
"S_BLUESPRINGBALL2",
"S_BLUESPRINGBALL3",
"S_BLUESPRINGBALL4",
"S_BLUESPRINGBALL5",
// Yellow spring on a ball // Yellow spring on a ball
"S_YELLOWSPRINGBALL", "S_YELLOWSPRINGBALL",
"S_YELLOWSPRINGBALL2", "S_YELLOWSPRINGBALL2",
@ -3891,6 +3898,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_BIGMACE", // Big Mace "MT_BIGMACE", // Big Mace
"MT_SMALLGRABCHAIN", // Small Grab Chain "MT_SMALLGRABCHAIN", // Small Grab Chain
"MT_BIGGRABCHAIN", // Big Grab Chain "MT_BIGGRABCHAIN", // Big Grab Chain
"MT_BLUESPRINGBALL", // Blue spring on a ball
"MT_YELLOWSPRINGBALL", // Yellow spring on a ball "MT_YELLOWSPRINGBALL", // Yellow spring on a ball
"MT_REDSPRINGBALL", // Red spring on a ball "MT_REDSPRINGBALL", // Red spring on a ball
"MT_SMALLFIREBAR", // Small Firebar "MT_SMALLFIREBAR", // Small Firebar

View file

@ -1327,7 +1327,7 @@ void F_CreditDrawer(void)
y += 12<<FRACBITS; y += 12<<FRACBITS;
break; break;
} }
if (FixedMul(y,vid.dupy) > vid.height) if (FixedMul(y,vid.dup) > vid.height)
break; break;
} }
} }
@ -1362,7 +1362,7 @@ void F_CreditTicker(void)
case 1: y += 30<<FRACBITS; break; case 1: y += 30<<FRACBITS; break;
default: y += 12<<FRACBITS; break; default: y += 12<<FRACBITS; break;
} }
if (FixedMul(y,vid.dupy) > vid.height) if (FixedMul(y,vid.dup) > vid.height)
break; break;
} }
@ -2082,7 +2082,7 @@ void F_EndingDrawer(void)
if (goodending && finalecount >= TICRATE && finalecount < INFLECTIONPOINT) if (goodending && finalecount >= TICRATE && finalecount < INFLECTIONPOINT)
{ {
INT32 workingtime = finalecount - TICRATE; INT32 workingtime = finalecount - TICRATE;
fixed_t radius = ((vid.width/vid.dupx)*(INFLECTIONPOINT - TICRATE - workingtime))/(INFLECTIONPOINT - TICRATE); fixed_t radius = ((vid.width/vid.dup)*(INFLECTIONPOINT - TICRATE - workingtime))/(INFLECTIONPOINT - TICRATE);
angle_t fa; angle_t fa;
INT32 eemeralds_cur[4]; INT32 eemeralds_cur[4];
char patchname[7] = "CEMGx0"; char patchname[7] = "CEMGx0";
@ -2287,7 +2287,6 @@ void F_InitMenuPresValues(void)
void F_SkyScroll(const char *patchname) void F_SkyScroll(const char *patchname)
{ {
INT32 x, basey = 0; INT32 x, basey = 0;
INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy);
patch_t *pat; patch_t *pat;
if (rendermode == render_none) if (rendermode == render_none)
@ -2315,17 +2314,17 @@ void F_SkyScroll(const char *patchname)
curbgy %= pat->height * 16; curbgy %= pat->height * 16;
// Ooh, fancy frame interpolation // Ooh, fancy frame interpolation
x = ((curbgx*dupz) + FixedInt((rendertimefrac-FRACUNIT) * curbgxspeed*dupz)) / 16; x = ((curbgx*vid.dup) + FixedInt((rendertimefrac-FRACUNIT) * curbgxspeed*vid.dup)) / 16;
basey = ((curbgy*dupz) + FixedInt((rendertimefrac-FRACUNIT) * curbgyspeed*dupz)) / 16; basey = ((curbgy*vid.dup) + FixedInt((rendertimefrac-FRACUNIT) * curbgyspeed*vid.dup)) / 16;
if (x > 0) // Make sure that we don't leave the left or top sides empty if (x > 0) // Make sure that we don't leave the left or top sides empty
x -= pat->width * dupz; x -= pat->width * vid.dup;
if (basey > 0) if (basey > 0)
basey -= pat->height * dupz; basey -= pat->height * vid.dup;
for (; x < vid.width; x += pat->width * dupz) for (; x < vid.width; x += pat->width * vid.dup)
{ {
for (INT32 y = basey; y < vid.height; y += pat->height * dupz) for (INT32 y = basey; y < vid.height; y += pat->height * vid.dup)
V_DrawScaledPatch(x, y, V_NOSCALESTART, pat); V_DrawScaledPatch(x, y, V_NOSCALESTART, pat);
} }
@ -2603,7 +2602,7 @@ static void F_LoadAlacroixGraphics(SINT8 newttscale)
static void F_FigureActiveTtScale(void) static void F_FigureActiveTtScale(void)
{ {
SINT8 newttscale = max(1, min(6, vid.dupx)); SINT8 newttscale = max(1, min(6, vid.dup));
SINT8 oldttscale = activettscale; SINT8 oldttscale = activettscale;
if (newttscale == testttscale) if (newttscale == testttscale)
@ -4095,7 +4094,7 @@ static fixed_t F_GetPromptHideHudBound(void)
F_GetPageTextGeometry(&pagelines, &rightside, &boxh, &texth, &texty, &namey, &chevrony, &textx, &textr); F_GetPageTextGeometry(&pagelines, &rightside, &boxh, &texth, &texty, &namey, &chevrony, &textx, &textr);
// calc boxheight (see V_DrawPromptBack) // calc boxheight (see V_DrawPromptBack)
boxh *= vid.dupy; boxh *= vid.dup;
boxh = (boxh * 4) + (boxh/2)*5; // 4 lines of space plus gaps between and some leeway boxh = (boxh * 4) + (boxh/2)*5; // 4 lines of space plus gaps between and some leeway
// return a coordinate to check // return a coordinate to check

View file

@ -1492,8 +1492,9 @@ void G_BeginRecording(void)
demo_p += 16; demo_p += 16;
// Skin // Skin
for (i = 0; i < 16 && cv_skin.string[i]; i++) const char *skinname = skins[players[0].skin].name;
name[i] = cv_skin.string[i]; for (i = 0; i < 16 && skinname[i]; i++)
name[i] = skinname[i];
for (; i < 16; i++) for (; i < 16; i++)
name[i] = '\0'; name[i] = '\0';
M_Memcpy(demo_p,name,16); M_Memcpy(demo_p,name,16);

View file

@ -51,6 +51,7 @@
#include "r_fps.h" // frame interpolation/uncapped #include "r_fps.h" // frame interpolation/uncapped
#include "lua_hud.h" #include "lua_hud.h"
#include "lua_libs.h"
gameaction_t gameaction; gameaction_t gameaction;
gamestate_t gamestate = GS_NULL; gamestate_t gamestate = GS_NULL;
@ -1170,7 +1171,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
// why build a ticcmd if we're paused? // why build a ticcmd if we're paused?
// Or, for that matter, if we're being reborn. // Or, for that matter, if we're being reborn.
// ...OR if we're blindfolded. No looking into the floor. // ...OR if we're blindfolded. No looking into the floor.
if (paused || P_AutoPause() || (gamestate == GS_LEVEL && (player->playerstate == PST_REBORN || ((gametyperules & GTR_TAG) if (ignoregameinputs || paused || P_AutoPause() || (gamestate == GS_LEVEL && (player->playerstate == PST_REBORN || ((gametyperules & GTR_TAG)
&& (leveltime < hidetime * TICRATE) && (player->pflags & PF_TAGIT))))) && (leveltime < hidetime * TICRATE) && (player->pflags & PF_TAGIT)))))
{//@TODO splitscreen player {//@TODO splitscreen player
cmd->angleturn = ticcmd_oldangleturn[forplayer]; cmd->angleturn = ticcmd_oldangleturn[forplayer];
@ -4346,7 +4347,7 @@ void G_LoadGameSettings(void)
} }
#define GAMEDATA_ID 0x86E4A27C // Change every major version, as usual #define GAMEDATA_ID 0x86E4A27C // Change every major version, as usual
#define COMPAT_GAMEDATA_ID 0xFCAFE211 // Can be removed entirely for 2.3 #define COMPAT_GAMEDATA_ID 0xFCAFE211 // TODO: 2.3: Delete
// G_LoadGameData // G_LoadGameData
// Loads the main data file, which stores information such as emblems found, etc. // Loads the main data file, which stores information such as emblems found, etc.

View file

@ -18,6 +18,8 @@
#include "hu_stuff.h" // need HUFONT start & end #include "hu_stuff.h" // need HUFONT start & end
#include "netcode/d_net.h" #include "netcode/d_net.h"
#include "console.h" #include "console.h"
#include "lua_script.h"
#include "lua_libs.h"
#define MAXMOUSESENSITIVITY 100 // sensitivity steps #define MAXMOUSESENSITIVITY 100 // sensitivity steps
@ -116,7 +118,10 @@ void G_MapEventsToControls(event_t *ev)
{ {
case ev_keydown: case ev_keydown:
if (ev->key < NUMINPUTS) if (ev->key < NUMINPUTS)
gamekeydown[ev->key] = 1; {
if (!ignoregameinputs)
gamekeydown[ev->key] = 1;
}
#ifdef PARANOIA #ifdef PARANOIA
else else
{ {
@ -144,7 +149,7 @@ void G_MapEventsToControls(event_t *ev)
case ev_joystick: // buttons are virtual keys case ev_joystick: // buttons are virtual keys
i = ev->key; i = ev->key;
if (i >= JOYAXISSET || menuactive || CON_Ready() || chat_on) if (i >= JOYAXISSET || menuactive || CON_Ready() || chat_on || ignoregameinputs)
break; break;
if (ev->x != INT32_MAX) joyxmove[i] = ev->x; if (ev->x != INT32_MAX) joyxmove[i] = ev->x;
if (ev->y != INT32_MAX) joyymove[i] = ev->y; if (ev->y != INT32_MAX) joyymove[i] = ev->y;
@ -152,7 +157,7 @@ void G_MapEventsToControls(event_t *ev)
case ev_joystick2: // buttons are virtual keys case ev_joystick2: // buttons are virtual keys
i = ev->key; i = ev->key;
if (i >= JOYAXISSET || menuactive || CON_Ready() || chat_on) if (i >= JOYAXISSET || menuactive || CON_Ready() || chat_on || ignoregameinputs)
break; break;
if (ev->x != INT32_MAX) joy2xmove[i] = ev->x; if (ev->x != INT32_MAX) joy2xmove[i] = ev->x;
if (ev->y != INT32_MAX) joy2ymove[i] = ev->y; if (ev->y != INT32_MAX) joy2ymove[i] = ev->y;
@ -997,7 +1002,7 @@ static void setcontrol(INT32 (*gc)[2])
INT32 player = ((void*)gc == (void*)&gamecontrolbis ? 1 : 0); INT32 player = ((void*)gc == (void*)&gamecontrolbis ? 1 : 0);
boolean nestedoverride = false; boolean nestedoverride = false;
// Update me for 2.3 // TODO: 2.3: Delete the "use" alias
namectrl = (stricmp(COM_Argv(1), "use")) ? COM_Argv(1) : "spin"; namectrl = (stricmp(COM_Argv(1), "use")) ? COM_Argv(1) : "spin";
for (numctrl = 0; numctrl < NUM_GAMECONTROLS && stricmp(namectrl, gamecontrolname[numctrl]); for (numctrl = 0; numctrl < NUM_GAMECONTROLS && stricmp(namectrl, gamecontrolname[numctrl]);

View file

@ -78,10 +78,8 @@ void HWR_DrawPatch(patch_t *gpatch, INT32 x, INT32 y, INT32 option)
// | /| // | /|
// |/ | // |/ |
// 0--1 // 0--1
float sdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f; float sdup = FIXED_TO_FLOAT(vid.fdup)*2.0f;
float sdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f; float pdup = FIXED_TO_FLOAT(vid.fdup)*2.0f;
float pdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f;
float pdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f;
// make patch ready in hardware cache // make patch ready in hardware cache
HWR_GetPatch(gpatch); HWR_GetPatch(gpatch);
@ -90,25 +88,23 @@ void HWR_DrawPatch(patch_t *gpatch, INT32 x, INT32 y, INT32 option)
switch (option & V_SCALEPATCHMASK) switch (option & V_SCALEPATCHMASK)
{ {
case V_NOSCALEPATCH: case V_NOSCALEPATCH:
pdupx = pdupy = 2.0f; pdup = 2.0f;
break; break;
case V_SMALLSCALEPATCH: case V_SMALLSCALEPATCH:
pdupx = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupx); pdup = 2.0f * FIXED_TO_FLOAT(vid.fsmalldup);
pdupy = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupy);
break; break;
case V_MEDSCALEPATCH: case V_MEDSCALEPATCH:
pdupx = 2.0f * FIXED_TO_FLOAT(vid.fmeddupx); pdup = 2.0f * FIXED_TO_FLOAT(vid.fmeddup);
pdupy = 2.0f * FIXED_TO_FLOAT(vid.fmeddupy);
break; break;
} }
if (option & V_NOSCALESTART) if (option & V_NOSCALESTART)
sdupx = sdupy = 2.0f; sdup = 2.0f;
v[0].x = v[3].x = (x*sdupx-(gpatch->leftoffset)*pdupx)/vid.width - 1; v[0].x = v[3].x = (x*sdup-(gpatch->leftoffset)*pdup)/vid.width - 1;
v[2].x = v[1].x = (x*sdupx+(gpatch->width-gpatch->leftoffset)*pdupx)/vid.width - 1; v[2].x = v[1].x = (x*sdup+(gpatch->width-gpatch->leftoffset)*pdup)/vid.width - 1;
v[0].y = v[1].y = 1-(y*sdupy-(gpatch->topoffset)*pdupy)/vid.height; v[0].y = v[1].y = 1-(y*sdup-(gpatch->topoffset)*pdup)/vid.height;
v[2].y = v[3].y = 1-(y*sdupy+(gpatch->height-gpatch->topoffset)*pdupy)/vid.height; v[2].y = v[3].y = 1-(y*sdup+(gpatch->height-gpatch->topoffset)*pdup)/vid.height;
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f; v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
@ -137,7 +133,7 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
// | /| // | /|
// |/ | // |/ |
// 0--1 // 0--1
float dupx, dupy, fscalew, fscaleh, fwidth, fheight; float dup, fscalew, fscaleh, fwidth, fheight;
UINT8 perplayershuffle = 0; UINT8 perplayershuffle = 0;
@ -149,25 +145,21 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
hwrPatch = ((GLPatch_t *)gpatch->hardware); hwrPatch = ((GLPatch_t *)gpatch->hardware);
dupx = (float)vid.dupx; dup = (float)vid.dup;
dupy = (float)vid.dupy;
switch (option & V_SCALEPATCHMASK) switch (option & V_SCALEPATCHMASK)
{ {
case V_NOSCALEPATCH: case V_NOSCALEPATCH:
dupx = dupy = 1.0f; dup = 1.0f;
break; break;
case V_SMALLSCALEPATCH: case V_SMALLSCALEPATCH:
dupx = (float)vid.smalldupx; dup = (float)vid.smalldup;
dupy = (float)vid.smalldupy;
break; break;
case V_MEDSCALEPATCH: case V_MEDSCALEPATCH:
dupx = (float)vid.meddupx; dup = (float)vid.meddup;
dupy = (float)vid.meddupy;
break; break;
} }
dupx = dupy = (dupx < dupy ? dupx : dupy);
fscalew = fscaleh = FIXED_TO_FLOAT(pscale); fscalew = fscaleh = FIXED_TO_FLOAT(pscale);
if (vscale != pscale) if (vscale != pscale)
fscaleh = FIXED_TO_FLOAT(vscale); fscaleh = FIXED_TO_FLOAT(vscale);
@ -261,8 +253,8 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
if (!(option & V_NOSCALESTART)) if (!(option & V_NOSCALESTART))
{ {
cx = cx * dupx; cx = cx * dup;
cy = cy * dupy; cy = cy * dup;
if (!(option & V_SCALEPATCHMASK)) if (!(option & V_SCALEPATCHMASK))
{ {
@ -279,40 +271,40 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
} }
} }
// centre screen // centre screen
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f) if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dup) > 1.0E-36f)
{ {
if (option & V_SNAPTORIGHT) if (option & V_SNAPTORIGHT)
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup));
else if (!(option & V_SNAPTOLEFT)) else if (!(option & V_SNAPTOLEFT))
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2; cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup))/2;
if (perplayershuffle & 4) if (perplayershuffle & 4)
cx -= ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/4; cx -= ((float)vid.width - ((float)BASEVIDWIDTH * dup))/4;
else if (perplayershuffle & 8) else if (perplayershuffle & 8)
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/4; cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup))/4;
} }
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dup) > 1.0E-36f)
{ {
if (option & V_SNAPTOBOTTOM) if (option & V_SNAPTOBOTTOM)
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup));
else if (!(option & V_SNAPTOTOP)) else if (!(option & V_SNAPTOTOP))
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/2; cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/2;
if (perplayershuffle & 1) if (perplayershuffle & 1)
cy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/4; cy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/4;
else if (perplayershuffle & 2) else if (perplayershuffle & 2)
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/4; cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/4;
} }
} }
} }
if (pscale != FRACUNIT || vscale != FRACUNIT || (splitscreen && option & V_PERPLAYER)) if (pscale != FRACUNIT || vscale != FRACUNIT || (splitscreen && option & V_PERPLAYER))
{ {
fwidth = (float)(gpatch->width) * fscalew * dupx; fwidth = (float)(gpatch->width) * fscalew * dup;
fheight = (float)(gpatch->height) * fscaleh * dupy; fheight = (float)(gpatch->height) * fscaleh * dup;
} }
else else
{ {
fwidth = (float)(gpatch->width) * dupx; fwidth = (float)(gpatch->width) * dup;
fheight = (float)(gpatch->height) * dupy; fheight = (float)(gpatch->height) * dup;
} }
// positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1
@ -379,7 +371,7 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
// | /| // | /|
// |/ | // |/ |
// 0--1 // 0--1
float dupx, dupy, fscalew, fscaleh, fwidth, fheight; float dup, fscalew, fscaleh, fwidth, fheight;
UINT8 perplayershuffle = 0; UINT8 perplayershuffle = 0;
@ -391,25 +383,21 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
hwrPatch = ((GLPatch_t *)gpatch->hardware); hwrPatch = ((GLPatch_t *)gpatch->hardware);
dupx = (float)vid.dupx; dup = (float)vid.dup;
dupy = (float)vid.dupy;
switch (option & V_SCALEPATCHMASK) switch (option & V_SCALEPATCHMASK)
{ {
case V_NOSCALEPATCH: case V_NOSCALEPATCH:
dupx = dupy = 1.0f; dup = 1.0f;
break; break;
case V_SMALLSCALEPATCH: case V_SMALLSCALEPATCH:
dupx = (float)vid.smalldupx; dup = (float)vid.smalldup;
dupy = (float)vid.smalldupy;
break; break;
case V_MEDSCALEPATCH: case V_MEDSCALEPATCH:
dupx = (float)vid.meddupx; dup = (float)vid.meddup;
dupy = (float)vid.meddupy;
break; break;
} }
dupx = dupy = (dupx < dupy ? dupx : dupy);
fscalew = fscaleh = FIXED_TO_FLOAT(pscale); fscalew = fscaleh = FIXED_TO_FLOAT(pscale);
if (vscale != pscale) if (vscale != pscale)
fscaleh = FIXED_TO_FLOAT(vscale); fscaleh = FIXED_TO_FLOAT(vscale);
@ -487,8 +475,8 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
if (!(option & V_NOSCALESTART)) if (!(option & V_NOSCALESTART))
{ {
cx = cx * dupx; cx = cx * dup;
cy = cy * dupy; cy = cy * dup;
if (!(option & V_SCALEPATCHMASK)) if (!(option & V_SCALEPATCHMASK))
{ {
@ -496,27 +484,27 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
// no the patch is cropped do not do this ever // no the patch is cropped do not do this ever
// centre screen // centre screen
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f) if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dup) > 1.0E-36f)
{ {
if (option & V_SNAPTORIGHT) if (option & V_SNAPTORIGHT)
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup));
else if (!(option & V_SNAPTOLEFT)) else if (!(option & V_SNAPTOLEFT))
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2; cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup))/2;
if (perplayershuffle & 4) if (perplayershuffle & 4)
cx -= ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/4; cx -= ((float)vid.width - ((float)BASEVIDWIDTH * dup))/4;
else if (perplayershuffle & 8) else if (perplayershuffle & 8)
cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/4; cx += ((float)vid.width - ((float)BASEVIDWIDTH * dup))/4;
} }
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dup) > 1.0E-36f)
{ {
if (option & V_SNAPTOBOTTOM) if (option & V_SNAPTOBOTTOM)
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup));
else if (!(option & V_SNAPTOTOP)) else if (!(option & V_SNAPTOTOP))
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/2; cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/2;
if (perplayershuffle & 1) if (perplayershuffle & 1)
cy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/4; cy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/4;
else if (perplayershuffle & 2) else if (perplayershuffle & 2)
cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/4; cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup))/4;
} }
} }
} }
@ -532,13 +520,13 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
if (pscale != FRACUNIT || vscale != FRACUNIT || (splitscreen && option & V_PERPLAYER)) if (pscale != FRACUNIT || vscale != FRACUNIT || (splitscreen && option & V_PERPLAYER))
{ {
fwidth *= fscalew * dupx; fwidth *= fscalew * dup;
fheight *= fscaleh * dupy; fheight *= fscaleh * dup;
} }
else else
{ {
fwidth *= dupx; fwidth *= dup;
fheight *= dupy; fheight *= dup;
} }
// positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1
@ -674,9 +662,9 @@ void HWR_DrawPic(INT32 x, INT32 y, lumpnum_t lumpnum)
// 0--1 // 0--1
v[0].x = v[3].x = 2.0f * (float)x/vid.width - 1; v[0].x = v[3].x = 2.0f * (float)x/vid.width - 1;
v[2].x = v[1].x = 2.0f * (float)(x + patch->width*FIXED_TO_FLOAT(vid.fdupx))/vid.width - 1; v[2].x = v[1].x = 2.0f * (float)(x + patch->width*FIXED_TO_FLOAT(vid.fdup))/vid.width - 1;
v[0].y = v[1].y = 1.0f - 2.0f * (float)y/vid.height; v[0].y = v[1].y = 1.0f - 2.0f * (float)y/vid.height;
v[2].y = v[3].y = 1.0f - 2.0f * (float)(y + patch->height*FIXED_TO_FLOAT(vid.fdupy))/vid.height; v[2].y = v[3].y = 1.0f - 2.0f * (float)(y + patch->height*FIXED_TO_FLOAT(vid.fdup))/vid.height;
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f; v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
@ -866,35 +854,33 @@ void HWR_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT16 ac
if (!(color & V_NOSCALESTART)) if (!(color & V_NOSCALESTART))
{ {
float dupx = (float)vid.dupx, dupy = (float)vid.dupy; fx *= vid.dup;
fy *= vid.dup;
fw *= vid.dup;
fh *= vid.dup;
fx *= dupx; if (fabsf((float)vid.width - (float)BASEVIDWIDTH * vid.dup) > 1.0E-36f)
fy *= dupy;
fw *= dupx;
fh *= dupy;
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f)
{ {
if (color & V_SNAPTORIGHT) if (color & V_SNAPTORIGHT)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup));
else if (!(color & V_SNAPTOLEFT)) else if (!(color & V_SNAPTOLEFT))
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2; fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 2;
if (perplayershuffle & 4) if (perplayershuffle & 4)
fx -= ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx -= ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 4;
else if (perplayershuffle & 8) else if (perplayershuffle & 8)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 4;
} }
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * vid.dup) > 1.0E-36f)
{ {
// same thing here // same thing here
if (color & V_SNAPTOBOTTOM) if (color & V_SNAPTOBOTTOM)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup));
else if (!(color & V_SNAPTOTOP)) else if (!(color & V_SNAPTOTOP))
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 2;
if (perplayershuffle & 1) if (perplayershuffle & 1)
fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 4;
else if (perplayershuffle & 2) else if (perplayershuffle & 2)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 4;
} }
} }
@ -1032,10 +1018,10 @@ void HWR_DrawViewBorder(INT32 clearlines)
clearlines = BASEVIDHEIGHT; // refresh all clearlines = BASEVIDHEIGHT; // refresh all
// calc view size based on original game resolution // calc view size based on original game resolution
baseviewwidth = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewwidth), vid.fdupx)); //(cv_viewsize.value * BASEVIDWIDTH/10)&~7; baseviewwidth = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewwidth), vid.fdup)); //(cv_viewsize.value * BASEVIDWIDTH/10)&~7;
baseviewheight = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewheight), vid.fdupy)); baseviewheight = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewheight), vid.fdup));
top = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_baseviewwindowy), vid.fdupy)); top = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_baseviewwindowy), vid.fdup));
side = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewwindowx), vid.fdupx)); side = FixedInt(FixedDiv(FLOAT_TO_FIXED(gl_viewwindowx), vid.fdup));
// top // top
HWR_DrawFlatFill(0, 0, HWR_DrawFlatFill(0, 0,
@ -1250,35 +1236,35 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32
if (!(color & V_NOSCALESTART)) if (!(color & V_NOSCALESTART))
{ {
float dupx = (float)vid.dupx, dupy = (float)vid.dupy; float dup = (float)vid.dup;
fx *= dupx; fx *= dup;
fy *= dupy; fy *= dup;
fw *= dupx; fw *= dup;
fh *= dupy; fh *= dup;
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f) if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dup) > 1.0E-36f)
{ {
if (color & V_SNAPTORIGHT) if (color & V_SNAPTORIGHT)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); fx += ((float)vid.width - ((float)BASEVIDWIDTH * dup));
else if (!(color & V_SNAPTOLEFT)) else if (!(color & V_SNAPTOLEFT))
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2; fx += ((float)vid.width - ((float)BASEVIDWIDTH * dup)) / 2;
if (perplayershuffle & 4) if (perplayershuffle & 4)
fx -= ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx -= ((float)vid.width - ((float)BASEVIDWIDTH * dup)) / 4;
else if (perplayershuffle & 8) else if (perplayershuffle & 8)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx += ((float)vid.width - ((float)BASEVIDWIDTH * dup)) / 4;
} }
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dup) > 1.0E-36f)
{ {
// same thing here // same thing here
if (color & V_SNAPTOBOTTOM) if (color & V_SNAPTOBOTTOM)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup));
else if (!(color & V_SNAPTOTOP)) else if (!(color & V_SNAPTOTOP))
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup)) / 2;
if (perplayershuffle & 1) if (perplayershuffle & 1)
fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dup)) / 4;
else if (perplayershuffle & 2) else if (perplayershuffle & 2)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dup)) / 4;
} }
} }
@ -1416,8 +1402,6 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
if (!(color & V_NOSCALESTART)) if (!(color & V_NOSCALESTART))
{ {
float dupx = (float)vid.dupx, dupy = (float)vid.dupy;
if (x == 0 && y == 0 && w == BASEVIDWIDTH && h == BASEVIDHEIGHT) if (x == 0 && y == 0 && w == BASEVIDWIDTH && h == BASEVIDHEIGHT)
{ {
RGBA_t rgbaColour = V_GetColor(color); RGBA_t rgbaColour = V_GetColor(color);
@ -1430,33 +1414,33 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
return; return;
} }
fx *= dupx; fx *= vid.dup;
fy *= dupy; fy *= vid.dup;
fw *= dupx; fw *= vid.dup;
fh *= dupy; fh *= vid.dup;
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f) if (fabsf((float)vid.width - (float)BASEVIDWIDTH * vid.dup) > 1.0E-36f)
{ {
if (color & V_SNAPTORIGHT) if (color & V_SNAPTORIGHT)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup));
else if (!(color & V_SNAPTOLEFT)) else if (!(color & V_SNAPTOLEFT))
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2; fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 2;
if (perplayershuffle & 4) if (perplayershuffle & 4)
fx -= ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx -= ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 4;
else if (perplayershuffle & 8) else if (perplayershuffle & 8)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 4; fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 4;
} }
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f) if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * vid.dup) > 1.0E-36f)
{ {
// same thing here // same thing here
if (color & V_SNAPTOBOTTOM) if (color & V_SNAPTOBOTTOM)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup));
else if (!(color & V_SNAPTOTOP)) else if (!(color & V_SNAPTOTOP))
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 2;
if (perplayershuffle & 1) if (perplayershuffle & 1)
fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 4;
else if (perplayershuffle & 2) else if (perplayershuffle & 2)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 4; fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 4;
} }
} }

View file

@ -341,6 +341,7 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_BMCH &lspr[NOLIGHT], // SPR_BMCH
&lspr[NOLIGHT], // SPR_SMCE &lspr[NOLIGHT], // SPR_SMCE
&lspr[NOLIGHT], // SPR_BMCE &lspr[NOLIGHT], // SPR_BMCE
&lspr[NOLIGHT], // SPR_BSPB
&lspr[NOLIGHT], // SPR_YSPB &lspr[NOLIGHT], // SPR_YSPB
&lspr[NOLIGHT], // SPR_RSPB &lspr[NOLIGHT], // SPR_RSPB
&lspr[REDBALL_L], // SPR_SFBR &lspr[REDBALL_L], // SPR_SFBR

View file

@ -229,6 +229,8 @@ void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, extracolormap_t *col
// Clamp the light level, since it can sometimes go out of the 0-255 range from animations // Clamp the light level, since it can sometimes go out of the 0-255 range from animations
light_level = min(max(light_level, 0), 255); light_level = min(max(light_level, 0), 255);
V_CubeApply(&tint_color.s.red, &tint_color.s.green, &tint_color.s.blue);
V_CubeApply(&fade_color.s.red, &fade_color.s.green, &fade_color.s.blue);
Surface->PolyColor.rgba = poly_color.rgba; Surface->PolyColor.rgba = poly_color.rgba;
Surface->TintColor.rgba = tint_color.rgba; Surface->TintColor.rgba = tint_color.rgba;
Surface->FadeColor.rgba = fade_color.rgba; Surface->FadeColor.rgba = fade_color.rgba;

View file

@ -250,6 +250,7 @@ char sprnames[NUMSPRITES + 1][5] =
"BMCH", // Big Mace Chain "BMCH", // Big Mace Chain
"SMCE", // Small Mace "SMCE", // Small Mace
"BMCE", // Big Mace "BMCE", // Big Mace
"BSPB", // Blue spring on a ball
"YSPB", // Yellow spring on a ball "YSPB", // Yellow spring on a ball
"RSPB", // Red spring on a ball "RSPB", // Red spring on a ball
"SFBR", // Small Firebar "SFBR", // Small Firebar
@ -2297,6 +2298,13 @@ state_t states[NUMSTATES] =
{SPR_SMCH, 1, -1, {NULL}, 0, 0, S_NULL}, // S_SMALLGRABCHAIN {SPR_SMCH, 1, -1, {NULL}, 0, 0, S_NULL}, // S_SMALLGRABCHAIN
{SPR_BMCH, 1, -1, {NULL}, 0, 0, S_NULL}, // S_BIGGRABCHAIN {SPR_BMCH, 1, -1, {NULL}, 0, 0, S_NULL}, // S_BIGGRABCHAIN
// Blue spring on a ball
{SPR_BSPB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BLUESPRINGBALL
{SPR_BSPB, 4, 4, {A_Pain}, 0, 0, S_BLUESPRINGBALL3}, // S_BLUESPRINGBALL2
{SPR_BSPB, 3, 1, {NULL}, 0, 0, S_BLUESPRINGBALL4}, // S_BLUESPRINGBALL3
{SPR_BSPB, 2, 1, {NULL}, 0, 0, S_BLUESPRINGBALL5}, // S_BLUESPRINGBALL4
{SPR_BSPB, 1, 1, {NULL}, 0, 0, S_BLUESPRINGBALL}, // S_BLUESPRINGBALL5
// Yellow spring on a ball // Yellow spring on a ball
{SPR_YSPB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_YELLOWSPRINGBALL {SPR_YSPB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_YELLOWSPRINGBALL
{SPR_YSPB, 4, 4, {A_Pain}, 0, 0, S_YELLOWSPRINGBALL3}, // S_YELLOWSPRINGBALL2 {SPR_YSPB, 4, 4, {A_Pain}, 0, 0, S_YELLOWSPRINGBALL3}, // S_YELLOWSPRINGBALL2
@ -11679,6 +11687,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate S_NULL // raisestate
}, },
{ // MT_BLUESPRINGBALL
1133, // doomednum
S_BLUESPRINGBALL, // spawnstate
1000, // spawnhealth
S_BLUESPRINGBALL2, // seestate
sfx_None, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_spring, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
24*FRACUNIT, // speed
17*FRACUNIT, // radius
34*FRACUNIT, // height
1, // display offset
11*FRACUNIT, // mass
0, // damage
sfx_mswing, // activesound
MF_SCENERY|MF_SPRING|MF_NOGRAVITY, // flags
S_BLUESPRINGBALL2 // raisestate
},
{ // MT_YELLOWSPRINGBALL { // MT_YELLOWSPRINGBALL
1134, // doomednum 1134, // doomednum
S_YELLOWSPRINGBALL, // spawnstate S_YELLOWSPRINGBALL, // spawnstate

View file

@ -797,6 +797,7 @@ typedef enum sprite
SPR_BMCH, // Big Mace Chain SPR_BMCH, // Big Mace Chain
SPR_SMCE, // Small Mace SPR_SMCE, // Small Mace
SPR_BMCE, // Big Mace SPR_BMCE, // Big Mace
SPR_BSPB, // Blue spring on a ball
SPR_YSPB, // Yellow spring on a ball SPR_YSPB, // Yellow spring on a ball
SPR_RSPB, // Red spring on a ball SPR_RSPB, // Red spring on a ball
SPR_SFBR, // Small Firebar SPR_SFBR, // Small Firebar
@ -2744,6 +2745,13 @@ typedef enum state
S_SMALLGRABCHAIN, S_SMALLGRABCHAIN,
S_BIGGRABCHAIN, S_BIGGRABCHAIN,
// Blue spring on a ball
S_BLUESPRINGBALL,
S_BLUESPRINGBALL2,
S_BLUESPRINGBALL3,
S_BLUESPRINGBALL4,
S_BLUESPRINGBALL5,
// Yellow spring on a ball // Yellow spring on a ball
S_YELLOWSPRINGBALL, S_YELLOWSPRINGBALL,
S_YELLOWSPRINGBALL2, S_YELLOWSPRINGBALL2,
@ -4722,6 +4730,7 @@ typedef enum mobj_type
MT_BIGMACE, // Big Mace MT_BIGMACE, // Big Mace
MT_SMALLGRABCHAIN, // Small Grab Chain MT_SMALLGRABCHAIN, // Small Grab Chain
MT_BIGGRABCHAIN, // Big Grab Chain MT_BIGGRABCHAIN, // Big Grab Chain
MT_BLUESPRINGBALL, // Blue spring on a ball
MT_YELLOWSPRINGBALL, // Yellow spring on a ball MT_YELLOWSPRINGBALL, // Yellow spring on a ball
MT_REDSPRINGBALL, // Red spring on a ball MT_REDSPRINGBALL, // Red spring on a ball
MT_SMALLFIREBAR, // Small Firebar MT_SMALLFIREBAR, // Small Firebar

View file

@ -1031,6 +1031,20 @@ static int lib_pRailThinker(lua_State *L)
return 1; return 1;
} }
static int lib_pCheckSkyHit(lua_State *L)
{
mobj_t *mobj = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
line_t *line = *((line_t **)luaL_checkudata(L, 2, META_LINE));
//HUDSAFE
INLEVEL
if (!mobj)
return LUA_ErrInvalid(L, "mobj_t");
if (!line)
return LUA_ErrInvalid(L, "line_t");
lua_pushboolean(L, P_CheckSkyHit(mobj, line));
return 1;
}
static int lib_pXYMovement(lua_State *L) static int lib_pXYMovement(lua_State *L)
{ {
mobj_t *actor = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); mobj_t *actor = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
@ -1425,6 +1439,18 @@ static int lib_pGivePlayerRings(lua_State *L)
return 0; return 0;
} }
static int lib_pGivePlayerSpheres(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
INT32 num_spheres = (INT32)luaL_checkinteger(L, 2);
NOHUD
INLEVEL
if (!player)
return LUA_ErrInvalid(L, "player_t");
P_GivePlayerSpheres(player, num_spheres);
return 0;
}
static int lib_pGivePlayerLives(lua_State *L) static int lib_pGivePlayerLives(lua_State *L)
{ {
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
@ -1567,6 +1593,19 @@ static int lib_pInstaThrust(lua_State *L)
return 0; return 0;
} }
static int lib_pInstaThrustEvenIn2D(lua_State *L)
{
mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
angle_t angle = luaL_checkangle(L, 2);
fixed_t move = luaL_checkfixed(L, 3);
NOHUD
INLEVEL
if (!mo)
return LUA_ErrInvalid(L, "mobj_t");
P_InstaThrustEvenIn2D(mo, angle, move);
return 0;
}
static int lib_pReturnThrustX(lua_State *L) static int lib_pReturnThrustX(lua_State *L)
{ {
angle_t angle; angle_t angle;
@ -1668,6 +1707,17 @@ static int lib_pDoJump(lua_State *L)
return 0; return 0;
} }
static int lib_pDoSpinDashDust(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
NOHUD
INLEVEL
if (!player)
return LUA_ErrInvalid(L, "player_t");
P_DoSpinDashDust(player);
return 0;
}
static int lib_pSpawnThokMobj(lua_State *L) static int lib_pSpawnThokMobj(lua_State *L)
{ {
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
@ -1718,6 +1768,48 @@ static int lib_pSwitchShield(lua_State *L)
return 0; return 0;
} }
static int lib_pDoTailsOverlay(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
mobj_t *tails = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
NOHUD
INLEVEL
if (!player)
return LUA_ErrInvalid(L, "player_t");
if (!tails)
return LUA_ErrInvalid(L, "mobj_t");
P_DoTailsOverlay(player, tails);
return 0;
}
static int lib_pDoMetalJetFume(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
mobj_t *fume = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
NOHUD
INLEVEL
if (!player)
return LUA_ErrInvalid(L, "player_t");
if (!fume)
return LUA_ErrInvalid(L, "mobj_t");
P_DoMetalJetFume(player, fume);
return 0;
}
static int lib_pDoFollowMobj(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
mobj_t *followmobj = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
NOHUD
INLEVEL
if (!player)
return LUA_ErrInvalid(L, "player_t");
if (!followmobj)
return LUA_ErrInvalid(L, "mobj_t");
P_DoFollowMobj(player, followmobj);
return 0;
}
static int lib_pPlayerCanEnterSpinGaps(lua_State *L) static int lib_pPlayerCanEnterSpinGaps(lua_State *L)
{ {
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
@ -1789,6 +1881,7 @@ static int lib_pMove(lua_State *L)
return 2; return 2;
} }
// TODO: 2.3: Delete
static int lib_pTeleportMove(lua_State *L) static int lib_pTeleportMove(lua_State *L)
{ {
mobj_t *ptmthing = tmthing; mobj_t *ptmthing = tmthing;
@ -2199,6 +2292,21 @@ static int lib_pDoMatchSuper(lua_State *L)
return 0; return 0;
} }
static int lib_pTouchSpecialThing(lua_State *L)
{
mobj_t *special = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
mobj_t *toucher = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
boolean heightcheck = lua_optboolean(L, 3);
NOHUD
INLEVEL
if (!special || !toucher)
return LUA_ErrInvalid(L, "mobj_t");
if (!toucher->player)
return luaL_error(L, "P_TouchSpecialThing requires a valid toucher.player.");
P_TouchSpecialThing(special, toucher, heightcheck);
return 0;
}
// P_SPEC // P_SPEC
//////////// ////////////
@ -2215,6 +2323,40 @@ static int lib_pThrust(lua_State *L)
return 0; return 0;
} }
static int lib_pThrustEvenIn2D(lua_State *L)
{
mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
angle_t angle = luaL_checkangle(L, 2);
fixed_t move = luaL_checkfixed(L, 3);
NOHUD
INLEVEL
if (!mo)
return LUA_ErrInvalid(L, "mobj_t");
P_ThrustEvenIn2D(mo, angle, move);
return 0;
}
static int lib_pVectorInstaThrust(lua_State *L)
{
fixed_t xa = luaL_checkfixed(L, 1);
fixed_t xb = luaL_checkfixed(L, 2);
fixed_t xc = luaL_checkfixed(L, 3);
fixed_t ya = luaL_checkfixed(L, 4);
fixed_t yb = luaL_checkfixed(L, 5);
fixed_t yc = luaL_checkfixed(L, 6);
fixed_t za = luaL_checkfixed(L, 7);
fixed_t zb = luaL_checkfixed(L, 8);
fixed_t zc = luaL_checkfixed(L, 9);
fixed_t momentum = luaL_checkfixed(L, 10);
mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 11, META_MOBJ));
NOHUD
INLEVEL
if (!mo)
return LUA_ErrInvalid(L, "mobj_t");
P_VectorInstaThrust(xa, xb, xc, ya, yb, yc, za, zb, zc, momentum, mo);
return 0;
}
static int lib_pSetMobjStateNF(lua_State *L) static int lib_pSetMobjStateNF(lua_State *L)
{ {
mobj_t *mobj = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); mobj_t *mobj = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
@ -2267,6 +2409,7 @@ static int lib_pMobjTouchingSectorSpecial(lua_State *L)
return 1; return 1;
} }
// TODO: 2.3: Delete
static int lib_pThingOnSpecial3DFloor(lua_State *L) static int lib_pThingOnSpecial3DFloor(lua_State *L)
{ {
mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ));
@ -3571,6 +3714,7 @@ static int lib_gAddPlayer(lua_State *L)
newplayer->jointime = 0; newplayer->jointime = 0;
newplayer->quittime = 0; newplayer->quittime = 0;
newplayer->lastinputtime = 0;
// Read the skin argument (defaults to Sonic) // Read the skin argument (defaults to Sonic)
if (!lua_isnoneornil(L, 1)) if (!lua_isnoneornil(L, 1))
@ -4080,6 +4224,7 @@ static luaL_Reg lib[] = {
{"P_CreateFloorSpriteSlope",lib_pCreateFloorSpriteSlope}, {"P_CreateFloorSpriteSlope",lib_pCreateFloorSpriteSlope},
{"P_RemoveFloorSpriteSlope",lib_pRemoveFloorSpriteSlope}, {"P_RemoveFloorSpriteSlope",lib_pRemoveFloorSpriteSlope},
{"P_RailThinker",lib_pRailThinker}, {"P_RailThinker",lib_pRailThinker},
{"P_CheckSkyHit",lib_pCheckSkyHit},
{"P_XYMovement",lib_pXYMovement}, {"P_XYMovement",lib_pXYMovement},
{"P_RingXYMovement",lib_pRingXYMovement}, {"P_RingXYMovement",lib_pRingXYMovement},
{"P_SceneryXYMovement",lib_pSceneryXYMovement}, {"P_SceneryXYMovement",lib_pSceneryXYMovement},
@ -4112,6 +4257,7 @@ static luaL_Reg lib[] = {
{"P_SpawnShieldOrb",lib_pSpawnShieldOrb}, {"P_SpawnShieldOrb",lib_pSpawnShieldOrb},
{"P_SpawnGhostMobj",lib_pSpawnGhostMobj}, {"P_SpawnGhostMobj",lib_pSpawnGhostMobj},
{"P_GivePlayerRings",lib_pGivePlayerRings}, {"P_GivePlayerRings",lib_pGivePlayerRings},
{"P_GivePlayerSpheres",lib_pGivePlayerSpheres},
{"P_GivePlayerLives",lib_pGivePlayerLives}, {"P_GivePlayerLives",lib_pGivePlayerLives},
{"P_GiveCoopLives",lib_pGiveCoopLives}, {"P_GiveCoopLives",lib_pGiveCoopLives},
{"P_ResetScore",lib_pResetScore}, {"P_ResetScore",lib_pResetScore},
@ -4124,6 +4270,7 @@ static luaL_Reg lib[] = {
{"P_DoPlayerFinish",lib_pDoPlayerFinish}, {"P_DoPlayerFinish",lib_pDoPlayerFinish},
{"P_DoPlayerExit",lib_pDoPlayerExit}, {"P_DoPlayerExit",lib_pDoPlayerExit},
{"P_InstaThrust",lib_pInstaThrust}, {"P_InstaThrust",lib_pInstaThrust},
{"P_InstaThrustEvenIn2D",lib_pInstaThrustEvenIn2D},
{"P_ReturnThrustX",lib_pReturnThrustX}, {"P_ReturnThrustX",lib_pReturnThrustX},
{"P_ReturnThrustY",lib_pReturnThrustY}, {"P_ReturnThrustY",lib_pReturnThrustY},
{"P_LookForEnemies",lib_pLookForEnemies}, {"P_LookForEnemies",lib_pLookForEnemies},
@ -4132,10 +4279,14 @@ static luaL_Reg lib[] = {
{"P_HomingAttack",lib_pHomingAttack}, {"P_HomingAttack",lib_pHomingAttack},
{"P_SuperReady",lib_pSuperReady}, {"P_SuperReady",lib_pSuperReady},
{"P_DoJump",lib_pDoJump}, {"P_DoJump",lib_pDoJump},
{"P_DoSpinDashDust",lib_pDoSpinDashDust},
{"P_SpawnThokMobj",lib_pSpawnThokMobj}, {"P_SpawnThokMobj",lib_pSpawnThokMobj},
{"P_SpawnSpinMobj",lib_pSpawnSpinMobj}, {"P_SpawnSpinMobj",lib_pSpawnSpinMobj},
{"P_Telekinesis",lib_pTelekinesis}, {"P_Telekinesis",lib_pTelekinesis},
{"P_SwitchShield",lib_pSwitchShield}, {"P_SwitchShield",lib_pSwitchShield},
{"P_DoTailsOverlay",lib_pDoTailsOverlay},
{"P_DoMetalJetFume",lib_pDoMetalJetFume},
{"P_DoFollowMobj",lib_pDoFollowMobj},
{"P_PlayerCanEnterSpinGaps",lib_pPlayerCanEnterSpinGaps}, {"P_PlayerCanEnterSpinGaps",lib_pPlayerCanEnterSpinGaps},
{"P_PlayerShouldUseSpinHeight",lib_pPlayerShouldUseSpinHeight}, {"P_PlayerShouldUseSpinHeight",lib_pPlayerShouldUseSpinHeight},
@ -4154,6 +4305,7 @@ static luaL_Reg lib[] = {
{"P_FloorzAtPos",lib_pFloorzAtPos}, {"P_FloorzAtPos",lib_pFloorzAtPos},
{"P_CeilingzAtPos",lib_pCeilingzAtPos}, {"P_CeilingzAtPos",lib_pCeilingzAtPos},
{"P_DoSpring",lib_pDoSpring}, {"P_DoSpring",lib_pDoSpring},
{"P_TouchSpecialThing",lib_pTouchSpecialThing},
{"P_TryCameraMove", lib_pTryCameraMove}, {"P_TryCameraMove", lib_pTryCameraMove},
{"P_TeleportCameraMove", lib_pTeleportCameraMove}, {"P_TeleportCameraMove", lib_pTeleportCameraMove},
@ -4177,6 +4329,8 @@ static luaL_Reg lib[] = {
// p_spec // p_spec
{"P_Thrust",lib_pThrust}, {"P_Thrust",lib_pThrust},
{"P_ThrustEvenIn2D",lib_pThrustEvenIn2D},
{"P_VectorInstaThrust",lib_pVectorInstaThrust},
{"P_SetMobjStateNF",lib_pSetMobjStateNF}, {"P_SetMobjStateNF",lib_pSetMobjStateNF},
{"P_DoSuperTransformation",lib_pDoSuperTransformation}, {"P_DoSuperTransformation",lib_pDoSuperTransformation},
{"P_ExplodeMissile",lib_pExplodeMissile}, {"P_ExplodeMissile",lib_pExplodeMissile},
@ -4301,8 +4455,7 @@ int LUA_BaseLib(lua_State *L)
// Set metatable for string // Set metatable for string
lua_pushliteral(L, ""); // dummy string lua_pushliteral(L, ""); // dummy string
lua_getmetatable(L, -1); // get string metatable lua_getmetatable(L, -1); // get string metatable
lua_pushcfunction(L,lib_concat); // push concatination function LUA_SetCFunctionField(L, "__add", lib_concat);
lua_setfield(L,-2,"__add"); // ... store it as mathematical addition
lua_pop(L, 2); // pop metatable and dummy string lua_pop(L, 2); // pop metatable and dummy string
lua_newtable(L); lua_newtable(L);

View file

@ -194,6 +194,7 @@ static int lib_comAddCommand(lua_State *L)
if (lua_gettop(L) >= 3) if (lua_gettop(L) >= 3)
{ // For the third argument, only take a boolean or a number. { // For the third argument, only take a boolean or a number.
lua_settop(L, 3); lua_settop(L, 3);
// TODO: 2.3: Remove boolean option
if (lua_type(L, 3) == LUA_TBOOLEAN) if (lua_type(L, 3) == LUA_TBOOLEAN)
{ {
CONS_Alert(CONS_WARNING, CONS_Alert(CONS_WARNING,
@ -374,6 +375,9 @@ static int lib_cvRegisterVar(lua_State *L)
size_t count = 0; size_t count = 0;
CV_PossibleValue_t *cvpv; CV_PossibleValue_t *cvpv;
const char * const MINMAX[2] = {"MIN", "MAX"};
int minmax_unset = 3;
lua_pushnil(L); lua_pushnil(L);
while (lua_next(L, 4)) while (lua_next(L, 4))
{ {
@ -392,16 +396,45 @@ static int lib_cvRegisterVar(lua_State *L)
lua_pushnil(L); lua_pushnil(L);
while (lua_next(L, 4)) while (lua_next(L, 4))
{ {
INT32 n;
const char * strval;
// stack: [...] PossibleValue table, index, value // stack: [...] PossibleValue table, index, value
// 4 5 6 // 4 5 6
if (lua_type(L, 5) != LUA_TSTRING if (lua_type(L, 5) != LUA_TSTRING
|| lua_type(L, 6) != LUA_TNUMBER) || lua_type(L, 6) != LUA_TNUMBER)
FIELDERROR("PossibleValue", "custom PossibleValue table requires a format of string=integer, i.e. {MIN=0, MAX=9999}"); FIELDERROR("PossibleValue", "custom PossibleValue table requires a format of string=integer, i.e. {MIN=0, MAX=9999}");
cvpv[i].strvalue = Z_StrDup(lua_tostring(L, 5));
cvpv[i].value = (INT32)lua_tonumber(L, 6); strval = lua_tostring(L, 5);
i++;
if (
stricmp(strval, MINMAX[n=0]) == 0 ||
stricmp(strval, MINMAX[n=1]) == 0
){
/* need to shift forward */
if (minmax_unset == 3)
{
memmove(&cvpv[2], &cvpv[0],
i * sizeof *cvpv);
i += 2;
}
cvpv[n].strvalue = MINMAX[n];
minmax_unset &= ~(1 << n);
}
else
{
n = i++;
cvpv[n].strvalue = Z_StrDup(strval);
}
cvpv[n].value = (INT32)lua_tonumber(L, 6);
lua_pop(L, 1); lua_pop(L, 1);
} }
if (minmax_unset && minmax_unset != 3)
FIELDERROR("PossibleValue", "custom PossibleValue table requires requires both MIN and MAX keys if one is present");
cvpv[i].value = 0; cvpv[i].value = 0;
cvpv[i].strvalue = NULL; cvpv[i].strvalue = NULL;
cvar->PossibleValue = cvpv; cvar->PossibleValue = cvpv;
@ -626,10 +659,7 @@ static int cvar_get(lua_State *L)
int LUA_ConsoleLib(lua_State *L) int LUA_ConsoleLib(lua_State *L)
{ {
// Metatable for consvar_t // Metatable for consvar_t
luaL_newmetatable(L, META_CVAR); LUA_RegisterUserdataMetatable(L, META_CVAR, cvar_get, NULL, NULL);
lua_pushcfunction(L, cvar_get);
lua_setfield(L, -2, "__index");
lua_pop(L,1);
cvar_fields_ref = Lua_CreateFieldTable(L, cvar_opt); cvar_fields_ref = Lua_CreateFieldTable(L, cvar_opt);

View file

@ -1206,19 +1206,11 @@ static int libd_height(lua_State *L)
return 1; return 1;
} }
static int libd_dupx(lua_State *L) static int libd_dup(lua_State *L)
{ {
HUDONLY HUDONLY
lua_pushinteger(L, vid.dupx); // push integral scale (patch scale) lua_pushinteger(L, vid.dup); // push integral scale (patch scale)
lua_pushfixed(L, vid.fdupx); // push fixed point scale (position scale) lua_pushfixed(L, vid.fdup); // push fixed point scale (position scale)
return 2;
}
static int libd_dupy(lua_State *L)
{
HUDONLY
lua_pushinteger(L, vid.dupy); // push integral scale (patch scale)
lua_pushfixed(L, vid.fdupy); // push fixed point scale (position scale)
return 2; return 2;
} }
@ -1338,8 +1330,8 @@ static luaL_Reg lib_draw[] = {
// properties // properties
{"width", libd_width}, {"width", libd_width},
{"height", libd_height}, {"height", libd_height},
{"dupx", libd_dupx}, {"dupx", libd_dup},
{"dupy", libd_dupy}, {"dupy", libd_dup},
{"renderer", libd_renderer}, {"renderer", libd_renderer},
{"localTransFlag", libd_getlocaltransflag}, {"localTransFlag", libd_getlocaltransflag},
{"userTransFlag", libd_getusertransflag}, {"userTransFlag", libd_getusertransflag},
@ -1404,52 +1396,16 @@ int LUA_HudLib(lua_State *L)
luaL_register(L, NULL, lib_draw); luaL_register(L, NULL, lib_draw);
lib_draw_ref = luaL_ref(L, LUA_REGISTRYINDEX); lib_draw_ref = luaL_ref(L, LUA_REGISTRYINDEX);
luaL_newmetatable(L, META_HUDINFO); LUA_RegisterUserdataMetatable(L, META_HUDINFO, hudinfo_get, hudinfo_set, hudinfo_num);
lua_pushcfunction(L, hudinfo_get); LUA_RegisterUserdataMetatable(L, META_COLORMAP, colormap_get, NULL, NULL);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_PATCH, patch_get, patch_set, NULL);
LUA_RegisterUserdataMetatable(L, META_CAMERA, camera_get, camera_set, NULL);
lua_pushcfunction(L, hudinfo_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, hudinfo_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getHudInfo);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_hudinfolen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "hudinfo");
luaL_newmetatable(L, META_COLORMAP);
lua_pushcfunction(L, colormap_get);
lua_setfield(L, -2, "__index");
lua_pop(L,1);
luaL_newmetatable(L, META_PATCH);
lua_pushcfunction(L, patch_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, patch_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L,1);
patch_fields_ref = Lua_CreateFieldTable(L, patch_opt); patch_fields_ref = Lua_CreateFieldTable(L, patch_opt);
luaL_newmetatable(L, META_CAMERA);
lua_pushcfunction(L, camera_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, camera_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L,1);
camera_fields_ref = Lua_CreateFieldTable(L, camera_opt); camera_fields_ref = Lua_CreateFieldTable(L, camera_opt);
LUA_RegisterGlobalUserdata(L, "hudinfo", lib_getHudInfo, NULL, lib_hudinfolen);
luaL_register(L, "hud", lib_hud); luaL_register(L, "hud", lib_hud);
return 0; return 0;
} }

View file

@ -318,6 +318,7 @@ static int PopPivotSubTable(spriteframepivot_t *pivot, lua_State *L, int stk, in
pivot[idx].x = (INT32)value; pivot[idx].x = (INT32)value;
else if (ikey == 2 || (key && fastcmp(key, "y"))) else if (ikey == 2 || (key && fastcmp(key, "y")))
pivot[idx].y = (INT32)value; pivot[idx].y = (INT32)value;
// TODO: 2.3: Delete
else if (ikey == 3 || (key && fastcmp(key, "rotaxis"))) else if (ikey == 3 || (key && fastcmp(key, "rotaxis")))
LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.") LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.")
else if (ikey == -1 && (key != NULL)) else if (ikey == -1 && (key != NULL))
@ -571,6 +572,7 @@ static int framepivot_get(lua_State *L)
lua_pushinteger(L, framepivot->x); lua_pushinteger(L, framepivot->x);
else if (fastcmp("y", field)) else if (fastcmp("y", field))
lua_pushinteger(L, framepivot->y); lua_pushinteger(L, framepivot->y);
// TODO: 2.3: Delete
else if (fastcmp("rotaxis", field)) else if (fastcmp("rotaxis", field))
{ {
LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed."); LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.");
@ -600,6 +602,7 @@ static int framepivot_set(lua_State *L)
framepivot->x = luaL_checkinteger(L, 3); framepivot->x = luaL_checkinteger(L, 3);
else if (fastcmp("y", field)) else if (fastcmp("y", field))
framepivot->y = luaL_checkinteger(L, 3); framepivot->y = luaL_checkinteger(L, 3);
// TODO: 2.3: delete
else if (fastcmp("rotaxis", field)) else if (fastcmp("rotaxis", field))
LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.") LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.")
else else
@ -1914,206 +1917,28 @@ int LUA_InfoLib(lua_State *L)
lua_newtable(L); lua_newtable(L);
lua_setfield(L, LUA_REGISTRYINDEX, LREG_ACTIONS); lua_setfield(L, LUA_REGISTRYINDEX, LREG_ACTIONS);
luaL_newmetatable(L, META_STATE); LUA_RegisterUserdataMetatable(L, META_STATE, state_get, state_set, state_num);
lua_pushcfunction(L, state_get); LUA_RegisterUserdataMetatable(L, META_MOBJINFO, mobjinfo_get, mobjinfo_set, mobjinfo_num);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_SKINCOLOR, skincolor_get, skincolor_set, skincolor_num);
LUA_RegisterUserdataMetatable(L, META_COLORRAMP, colorramp_get, colorramp_set, colorramp_len);
lua_pushcfunction(L, state_set); LUA_RegisterUserdataMetatable(L, META_SFXINFO, sfxinfo_get, sfxinfo_set, sfxinfo_num);
lua_setfield(L, -2, "__newindex"); LUA_RegisterUserdataMetatable(L, META_SPRITEINFO, spriteinfo_get, spriteinfo_set, spriteinfo_num);
LUA_RegisterUserdataMetatable(L, META_PIVOTLIST, pivotlist_get, pivotlist_set, pivotlist_num);
lua_pushcfunction(L, state_num); LUA_RegisterUserdataMetatable(L, META_FRAMEPIVOT, framepivot_get, framepivot_set, framepivot_num);
lua_setfield(L, -2, "__len"); LUA_RegisterUserdataMetatable(L, META_LUABANKS, lib_getluabanks, lib_setluabanks, lib_luabankslen);
lua_pop(L, 1);
luaL_newmetatable(L, META_MOBJINFO);
lua_pushcfunction(L, mobjinfo_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, mobjinfo_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, mobjinfo_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
mobjinfo_fields_ref = Lua_CreateFieldTable(L, mobjinfo_opt); mobjinfo_fields_ref = Lua_CreateFieldTable(L, mobjinfo_opt);
luaL_newmetatable(L, META_SKINCOLOR); LUA_RegisterGlobalUserdata(L, "sprnames", lib_getSprname, NULL, lib_sprnamelen);
lua_pushcfunction(L, skincolor_get); LUA_RegisterGlobalUserdata(L, "spr2names", lib_getSpr2name, NULL, lib_spr2namelen);
lua_setfield(L, -2, "__index"); LUA_RegisterGlobalUserdata(L, "spr2defaults", lib_getSpr2default, lib_setSpr2default, lib_spr2namelen);
LUA_RegisterGlobalUserdata(L, "states", lib_getState, lib_setState, lib_statelen);
lua_pushcfunction(L, skincolor_set); LUA_RegisterGlobalUserdata(L, "mobjinfo", lib_getMobjInfo, lib_setMobjInfo, lib_mobjinfolen);
lua_setfield(L, -2, "__newindex"); LUA_RegisterGlobalUserdata(L, "skincolors", lib_getSkinColor, lib_setSkinColor, lib_skincolorslen);
LUA_RegisterGlobalUserdata(L, "spriteinfo", lib_getSpriteInfo, lib_setSpriteInfo, lib_spriteinfolen);
lua_pushcfunction(L, skincolor_num); LUA_RegisterGlobalUserdata(L, "sfxinfo", lib_getSfxInfo, lib_setSfxInfo, lib_sfxlen);
lua_setfield(L, -2, "__len"); // TODO: 2.3: Delete this alias
lua_pop(L, 1); LUA_RegisterGlobalUserdata(L, "S_sfx", lib_getSfxInfo, lib_setSfxInfo, lib_sfxlen);
luaL_newmetatable(L, META_COLORRAMP);
lua_pushcfunction(L, colorramp_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, colorramp_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, colorramp_len);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
luaL_newmetatable(L, META_SFXINFO);
lua_pushcfunction(L, sfxinfo_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, sfxinfo_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, sfxinfo_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_SPRITEINFO);
lua_pushcfunction(L, spriteinfo_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, spriteinfo_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, spriteinfo_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_PIVOTLIST);
lua_pushcfunction(L, pivotlist_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, pivotlist_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, pivotlist_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_FRAMEPIVOT);
lua_pushcfunction(L, framepivot_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, framepivot_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, framepivot_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSprname);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_sprnamelen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "sprnames");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSpr2name);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_spr2namelen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "spr2names");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSpr2default);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setSpr2default);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_spr2namelen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "spr2defaults");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getState);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setState);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_statelen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "states");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getMobjInfo);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setMobjInfo);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_mobjinfolen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "mobjinfo");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSkinColor);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setSkinColor);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_skincolorslen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "skincolors");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSfxInfo);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setSfxInfo);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_sfxlen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_pushvalue(L, -1);
lua_setglobal(L, "S_sfx");
lua_setglobal(L, "sfxinfo");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSpriteInfo);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setSpriteInfo);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_spriteinfolen);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "spriteinfo");
luaL_newmetatable(L, META_LUABANKS);
lua_pushcfunction(L, lib_getluabanks);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setluabanks);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_luabankslen);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
return 0; return 0;
} }

View file

@ -20,6 +20,7 @@
#include "lua_libs.h" #include "lua_libs.h"
boolean mousegrabbedbylua = true; boolean mousegrabbedbylua = true;
boolean ignoregameinputs = false;
/////////////// ///////////////
// FUNCTIONS // // FUNCTIONS //
@ -145,6 +146,51 @@ static luaL_Reg lib[] = {
{NULL, NULL} {NULL, NULL}
}; };
///////////////
// VARIABLES //
///////////////
static int lib_get(lua_State *L)
{
const char *field = luaL_checkstring(L, 2);
if (fastcmp(field, "mouse"))
{
LUA_PushUserdata(L, &mouse, META_MOUSE);
return 1;
}
else if (fastcmp(field, "mouse2"))
{
LUA_PushUserdata(L, &mouse2, META_MOUSE);
return 1;
}
else if (fastcmp(field, "ignoregameinputs"))
{
lua_pushboolean(L, ignoregameinputs);
return 1;
}
else
{
return 0;
}
}
static int lib_set(lua_State *L)
{
const char *field = luaL_checkstring(L, 2);
if (fastcmp(field, "ignoregameinputs"))
{
ignoregameinputs = luaL_checkboolean(L, 3);
}
else
{
lua_rawset(L, 1);
}
return 0;
}
/////////////////// ///////////////////
// gamekeydown[] // // gamekeydown[] //
/////////////////// ///////////////////
@ -239,32 +285,18 @@ static int mouse_num(lua_State *L)
int LUA_InputLib(lua_State *L) int LUA_InputLib(lua_State *L)
{ {
lua_newuserdata(L, 0); LUA_RegisterUserdataMetatable(L, META_KEYEVENT, keyevent_get, NULL, NULL);
lua_createtable(L, 0, 2); LUA_RegisterUserdataMetatable(L, META_MOUSE, mouse_get, NULL, mouse_num);
lua_pushcfunction(L, lib_getGameKeyDown);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_setGameKeyDown);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, lib_lenGameKeyDown);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "gamekeydown");
luaL_newmetatable(L, META_KEYEVENT);
lua_pushcfunction(L, keyevent_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
luaL_newmetatable(L, META_MOUSE);
lua_pushcfunction(L, mouse_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, mouse_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
// Register the library, then add __index and __newindex
// metamethods to it to allow global variables
luaL_register(L, "input", lib); luaL_register(L, "input", lib);
LUA_CreateAndSetMetatable(L, lib_get, lib_set, NULL, false);
LUA_CreateAndSetUserdataField(L, -1, "gamekeydown", lib_getGameKeyDown, lib_setGameKeyDown, lib_lenGameKeyDown, false);
// TODO: 2.3: Delete this alias (moved to input library)
LUA_RegisterGlobalUserdata(L, "gamekeydown", lib_getGameKeyDown, lib_setGameKeyDown, lib_lenGameKeyDown);
lua_pop(L, 1);
return 0; return 0;
} }

View file

@ -13,6 +13,7 @@
extern lua_State *gL; extern lua_State *gL;
extern boolean mousegrabbedbylua; extern boolean mousegrabbedbylua;
extern boolean ignoregameinputs;
#define MUTABLE_TAGS #define MUTABLE_TAGS

View file

@ -35,7 +35,7 @@ enum sector_e {
sector_floorpic, sector_floorpic,
sector_floorxoffset, sector_floorxoffset,
sector_flooryoffset, sector_flooryoffset,
sector_floorangle, sector_floorangle,
sector_ceilingpic, sector_ceilingpic,
sector_ceilingxoffset, sector_ceilingxoffset,
sector_ceilingyoffset, sector_ceilingyoffset,
@ -43,7 +43,7 @@ enum sector_e {
sector_lightlevel, sector_lightlevel,
sector_floorlightlevel, sector_floorlightlevel,
sector_floorlightabsolute, sector_floorlightabsolute,
sector_floorlightsec, sector_floorlightsec,
sector_ceilinglightlevel, sector_ceilinglightlevel,
sector_ceilinglightabsolute, sector_ceilinglightabsolute,
sector_ceilinglightsec, sector_ceilinglightsec,
@ -77,14 +77,14 @@ static const char *const sector_opt[] = {
"ceilingpic", "ceilingpic",
"ceilingxoffset", "ceilingxoffset",
"ceilingyoffset", "ceilingyoffset",
"ceilingangle", "ceilingangle",
"lightlevel", "lightlevel",
"floorlightlevel", "floorlightlevel",
"floorlightabsolute", "floorlightabsolute",
"floorlightsec", "floorlightsec",
"ceilinglightlevel", "ceilinglightlevel",
"ceilinglightabsolute", "ceilinglightabsolute",
"ceilinglightsec", "ceilinglightsec",
"special", "special",
"tag", "tag",
"taglist", "taglist",
@ -663,11 +663,11 @@ static int sector_get(lua_State *L)
lua_pushfixed(L, sector->flooryoffset); lua_pushfixed(L, sector->flooryoffset);
return 1; return 1;
} }
case sector_floorangle: case sector_floorangle:
{ {
lua_pushangle(L, sector->floorangle); lua_pushangle(L, sector->floorangle);
return 1; return 1;
} }
case sector_ceilingpic: // ceilingpic case sector_ceilingpic: // ceilingpic
{ {
levelflat_t *levelflat = &levelflats[sector->ceilingpic]; levelflat_t *levelflat = &levelflats[sector->ceilingpic];
@ -691,7 +691,7 @@ static int sector_get(lua_State *L)
{ {
lua_pushangle(L, sector->ceilingangle); lua_pushangle(L, sector->ceilingangle);
return 1; return 1;
} }
case sector_lightlevel: case sector_lightlevel:
lua_pushinteger(L, sector->lightlevel); lua_pushinteger(L, sector->lightlevel);
return 1; return 1;
@ -703,7 +703,7 @@ static int sector_get(lua_State *L)
return 1; return 1;
case sector_floorlightsec: case sector_floorlightsec:
lua_pushinteger(L, sector->floorlightsec); lua_pushinteger(L, sector->floorlightsec);
return 1; return 1;
case sector_ceilinglightlevel: case sector_ceilinglightlevel:
lua_pushinteger(L, sector->ceilinglightlevel); lua_pushinteger(L, sector->ceilinglightlevel);
return 1; return 1;
@ -712,7 +712,7 @@ static int sector_get(lua_State *L)
return 1; return 1;
case sector_ceilinglightsec: case sector_ceilinglightsec:
lua_pushinteger(L, sector->ceilinglightsec); lua_pushinteger(L, sector->ceilinglightsec);
return 1; return 1;
case sector_special: case sector_special:
lua_pushinteger(L, sector->special); lua_pushinteger(L, sector->special);
return 1; return 1;
@ -842,7 +842,7 @@ static int sector_set(lua_State *L)
break; break;
case sector_floorangle: case sector_floorangle:
sector->floorangle = luaL_checkangle(L, 3); sector->floorangle = luaL_checkangle(L, 3);
break; break;
case sector_ceilingpic: case sector_ceilingpic:
sector->ceilingpic = P_AddLevelFlatRuntime(luaL_checkstring(L, 3)); sector->ceilingpic = P_AddLevelFlatRuntime(luaL_checkstring(L, 3));
break; break;
@ -866,7 +866,7 @@ static int sector_set(lua_State *L)
break; break;
case sector_floorlightsec: case sector_floorlightsec:
sector->floorlightsec = (INT32)luaL_checkinteger(L, 3); sector->floorlightsec = (INT32)luaL_checkinteger(L, 3);
break; break;
case sector_ceilinglightlevel: case sector_ceilinglightlevel:
sector->ceilinglightlevel = (INT16)luaL_checkinteger(L, 3); sector->ceilinglightlevel = (INT16)luaL_checkinteger(L, 3);
break; break;
@ -875,7 +875,7 @@ static int sector_set(lua_State *L)
break; break;
case sector_ceilinglightsec: case sector_ceilinglightsec:
sector->ceilinglightsec = (INT32)luaL_checkinteger(L, 3); sector->ceilinglightsec = (INT32)luaL_checkinteger(L, 3);
break; break;
case sector_special: case sector_special:
sector->special = (INT16)luaL_checkinteger(L, 3); sector->special = (INT16)luaL_checkinteger(L, 3);
break; break;
@ -1043,17 +1043,7 @@ static int line_get(lua_State *L)
lua_pushinteger(L, line->special); lua_pushinteger(L, line->special);
return 1; return 1;
case line_tag: case line_tag:
// HELLO // TODO: 2.3: Always return a unsigned value
// THIS IS LJ SONIC
// HOW IS YOUR DAY?
// BY THE WAY WHEN 2.3 OR 3.0 OR 4.0 OR SRB3 OR SRB4 OR WHATEVER IS OUT
// YOU SHOULD REMEMBER TO CHANGE THIS SO IT ALWAYS RETURNS A UNSIGNED VALUE
// HAVE A NICE DAY
//
//
//
//
// you are ugly
lua_pushinteger(L, Tag_FGet(&line->tags)); lua_pushinteger(L, Tag_FGet(&line->tags));
return 1; return 1;
case line_taglist: case line_taglist:
@ -1108,6 +1098,7 @@ static int line_get(lua_State *L)
case line_polyobj: case line_polyobj:
LUA_PushUserdata(L, line->polyobj, META_POLYOBJ); LUA_PushUserdata(L, line->polyobj, META_POLYOBJ);
return 1; return 1;
// TODO: 2.3: Delete
case line_text: case line_text:
{ {
if (udmf) if (udmf)
@ -1241,6 +1232,7 @@ static int side_get(lua_State *L)
case side_repeatcnt: case side_repeatcnt:
lua_pushinteger(L, side->repeatcnt); lua_pushinteger(L, side->repeatcnt);
return 1; return 1;
// TODO: 2.3: Delete
case side_text: case side_text:
{ {
if (udmf) if (udmf)
@ -2843,170 +2835,36 @@ static int mapheaderinfo_get(lua_State *L)
int LUA_MapLib(lua_State *L) int LUA_MapLib(lua_State *L)
{ {
luaL_newmetatable(L, META_SECTORLINES); LUA_RegisterUserdataMetatable(L, META_SECTORLINES, sectorlines_get, NULL, sectorlines_num);
lua_pushcfunction(L, sectorlines_get); LUA_RegisterUserdataMetatable(L, META_SECTOR, sector_get, sector_set, sector_num);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_SUBSECTOR, subsector_get, NULL, subsector_num);
LUA_RegisterUserdataMetatable(L, META_LINE, line_get, NULL, line_num);
lua_pushcfunction(L, sectorlines_num); LUA_RegisterUserdataMetatable(L, META_LINEARGS, lineargs_get, NULL, lineargs_len);
lua_setfield(L, -2, "__len"); LUA_RegisterUserdataMetatable(L, META_LINESTRINGARGS, linestringargs_get, NULL, linestringargs_len);
lua_pop(L, 1); LUA_RegisterUserdataMetatable(L, META_SIDENUM, sidenum_get, NULL, NULL);
LUA_RegisterUserdataMetatable(L, META_SIDE, side_get, side_set, side_num);
luaL_newmetatable(L, META_SECTOR); LUA_RegisterUserdataMetatable(L, META_VERTEX, vertex_get, NULL, vertex_num);
lua_pushcfunction(L, sector_get); LUA_RegisterUserdataMetatable(L, META_FFLOOR, ffloor_get, ffloor_set, NULL);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_BBOX, bbox_get, NULL, NULL);
LUA_RegisterUserdataMetatable(L, META_SLOPE, slope_get, slope_set, NULL);
lua_pushcfunction(L, sector_set); LUA_RegisterUserdataMetatable(L, META_VECTOR2, vector2_get, NULL, NULL);
lua_setfield(L, -2, "__newindex"); LUA_RegisterUserdataMetatable(L, META_VECTOR3, vector3_get, NULL, NULL);
LUA_RegisterUserdataMetatable(L, META_MAPHEADER, mapheaderinfo_get, NULL, NULL);
lua_pushcfunction(L, sector_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
sector_fields_ref = Lua_CreateFieldTable(L, sector_opt); sector_fields_ref = Lua_CreateFieldTable(L, sector_opt);
luaL_newmetatable(L, META_SUBSECTOR);
lua_pushcfunction(L, subsector_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, subsector_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
subsector_fields_ref = Lua_CreateFieldTable(L, subsector_opt); subsector_fields_ref = Lua_CreateFieldTable(L, subsector_opt);
luaL_newmetatable(L, META_LINE);
lua_pushcfunction(L, line_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, line_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
line_fields_ref = Lua_CreateFieldTable(L, line_opt); line_fields_ref = Lua_CreateFieldTable(L, line_opt);
luaL_newmetatable(L, META_LINEARGS);
lua_pushcfunction(L, lineargs_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lineargs_len);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_LINESTRINGARGS);
lua_pushcfunction(L, linestringargs_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, linestringargs_len);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_SIDENUM);
lua_pushcfunction(L, sidenum_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
luaL_newmetatable(L, META_SIDE);
lua_pushcfunction(L, side_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, side_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, side_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
side_fields_ref = Lua_CreateFieldTable(L, side_opt); side_fields_ref = Lua_CreateFieldTable(L, side_opt);
luaL_newmetatable(L, META_VERTEX);
lua_pushcfunction(L, vertex_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, vertex_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
vertex_fields_ref = Lua_CreateFieldTable(L, vertex_opt); vertex_fields_ref = Lua_CreateFieldTable(L, vertex_opt);
luaL_newmetatable(L, META_FFLOOR);
lua_pushcfunction(L, ffloor_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, ffloor_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L, 1);
ffloor_fields_ref = Lua_CreateFieldTable(L, ffloor_opt); ffloor_fields_ref = Lua_CreateFieldTable(L, ffloor_opt);
#ifdef HAVE_LUA_SEGS
luaL_newmetatable(L, META_SEG);
lua_pushcfunction(L, seg_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, seg_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
seg_fields_ref = Lua_CreateFieldTable(L, seg_opt);
luaL_newmetatable(L, META_NODE);
lua_pushcfunction(L, node_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, node_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
node_fields_ref = Lua_CreateFieldTable(L, node_opt);
luaL_newmetatable(L, META_NODEBBOX);
//lua_pushcfunction(L, nodebbox_get);
//lua_setfield(L, -2, "__index");
lua_pushcfunction(L, nodebbox_call);
lua_setfield(L, -2, "__call");
lua_pop(L, 1);
luaL_newmetatable(L, META_NODECHILDREN);
lua_pushcfunction(L, nodechildren_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
#endif
luaL_newmetatable(L, META_BBOX);
lua_pushcfunction(L, bbox_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
luaL_newmetatable(L, META_SLOPE);
lua_pushcfunction(L, slope_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, slope_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L, 1);
slope_fields_ref = Lua_CreateFieldTable(L, slope_opt); slope_fields_ref = Lua_CreateFieldTable(L, slope_opt);
luaL_newmetatable(L, META_VECTOR2);
lua_pushcfunction(L, vector2_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
luaL_newmetatable(L, META_VECTOR3);
lua_pushcfunction(L, vector3_get);
lua_setfield(L, -2, "__index");
lua_pop(L, 1);
luaL_newmetatable(L, META_MAPHEADER);
lua_pushcfunction(L, mapheaderinfo_get);
lua_setfield(L, -2, "__index");
//lua_pushcfunction(L, mapheaderinfo_num);
//lua_setfield(L, -2, "__len");
lua_pop(L, 1);
mapheaderinfo_fields_ref = Lua_CreateFieldTable(L, mapheaderinfo_opt); mapheaderinfo_fields_ref = Lua_CreateFieldTable(L, mapheaderinfo_opt);
LUA_RegisterGlobalUserdata(L, "subsectors", lib_getSubsector, NULL, lib_numsubsectors);
LUA_RegisterGlobalUserdata(L, "sides", lib_getSide, NULL, lib_numsides);
LUA_RegisterGlobalUserdata(L, "vertexes", lib_getVertex, NULL, lib_numvertexes);
LUA_RegisterGlobalUserdata(L, "mapheaderinfo", lib_getMapheaderinfo, NULL, lib_nummapheaders);
LUA_PushTaggableObjectArray(L, "sectors", LUA_PushTaggableObjectArray(L, "sectors",
lib_iterateSectors, lib_iterateSectors,
lib_getSector, lib_getSector,
@ -3015,16 +2873,6 @@ int LUA_MapLib(lua_State *L)
&numsectors, &sectors, &numsectors, &sectors,
sizeof (sector_t), META_SECTOR); sizeof (sector_t), META_SECTOR);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSubsector);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numsubsectors);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "subsectors");
LUA_PushTaggableObjectArray(L, "lines", LUA_PushTaggableObjectArray(L, "lines",
lib_iterateLines, lib_iterateLines,
lib_getLine, lib_getLine,
@ -3033,56 +2881,22 @@ int LUA_MapLib(lua_State *L)
&numlines, &lines, &numlines, &lines,
sizeof (line_t), META_LINE); sizeof (line_t), META_LINE);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSide);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numsides);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "sides");
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getVertex);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numvertexes);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "vertexes");
#ifdef HAVE_LUA_SEGS #ifdef HAVE_LUA_SEGS
lua_newuserdata(L, 0); LUA_RegisterUserdataMetatable(L, META_SEG, seg_get, NULL, seg_num);
lua_createtable(L, 0, 2); LUA_RegisterUserdataMetatable(L, META_NODE, node_get, NULL, node_num);
lua_pushcfunction(L, lib_getSeg); LUA_RegisterUserdataMetatable(L, META_NODECHILDREN, nodechildren_get, NULL, NULL);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numsegs); seg_fields_ref = Lua_CreateFieldTable(L, seg_opt);
lua_setfield(L, -2, "__len"); node_fields_ref = Lua_CreateFieldTable(L, node_opt);
lua_setmetatable(L, -2);
lua_setglobal(L, "segs");
lua_newuserdata(L, 0); luaL_newmetatable(L, META_NODEBBOX);
lua_createtable(L, 0, 2); //LUA_SetCFunctionField(L, "__index", nodebbox_get);
lua_pushcfunction(L, lib_getNode); LUA_SetCFunctionField(L, "__call", nodebbox_call);
lua_setfield(L, -2, "__index"); lua_pop(L, 1);
lua_pushcfunction(L, lib_numnodes); LUA_RegisterGlobalUserdata(L, "segs", lib_getSeg, NULL, lib_numsegs);
lua_setfield(L, -2, "__len"); LUA_RegisterGlobalUserdata(L, "nodes", lib_getNode, NULL, lib_numnodes);
lua_setmetatable(L, -2);
lua_setglobal(L, "nodes");
#endif #endif
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getMapheaderinfo);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_nummapheaders);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "mapheaderinfo");
return 0; return 0;
} }

View file

@ -125,6 +125,7 @@ static int lib_fixeddiv(lua_State *L)
return 1; return 1;
} }
// TODO: 2.3: Delete
static int lib_fixedrem(lua_State *L) static int lib_fixedrem(lua_State *L)
{ {
LUA_Deprecated(L, "FixedRem(a, b)", "a % b"); LUA_Deprecated(L, "FixedRem(a, b)", "a % b");

View file

@ -1163,43 +1163,12 @@ static int lib_nummapthings(lua_State *L)
int LUA_MobjLib(lua_State *L) int LUA_MobjLib(lua_State *L)
{ {
luaL_newmetatable(L, META_MOBJ); LUA_RegisterUserdataMetatable(L, META_MOBJ, mobj_get, mobj_set, NULL);
lua_pushcfunction(L, mobj_get); LUA_RegisterUserdataMetatable(L, META_THINGARGS, thingargs_get, NULL, thingargs_len);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_THINGSTRINGARGS, thingstringargs_get, NULL, thingstringargs_len);
LUA_RegisterUserdataMetatable(L, META_MAPTHING, mapthing_get, mapthing_set, mapthing_num);
lua_pushcfunction(L, mobj_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L,1);
mobj_fields_ref = Lua_CreateFieldTable(L, mobj_opt); mobj_fields_ref = Lua_CreateFieldTable(L, mobj_opt);
luaL_newmetatable(L, META_THINGARGS);
lua_pushcfunction(L, thingargs_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, thingargs_len);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_THINGSTRINGARGS);
lua_pushcfunction(L, thingstringargs_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, thingstringargs_len);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_MAPTHING);
lua_pushcfunction(L, mapthing_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, mapthing_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, mapthing_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
mapthing_fields_ref = Lua_CreateFieldTable(L, mapthing_opt); mapthing_fields_ref = Lua_CreateFieldTable(L, mapthing_opt);
LUA_PushTaggableObjectArray(L, "mapthings", LUA_PushTaggableObjectArray(L, "mapthings",

View file

@ -223,6 +223,7 @@ enum player_e
player_blocked, player_blocked,
player_jointime, player_jointime,
player_quittime, player_quittime,
player_lastinputtime,
player_ping, player_ping,
#ifdef HWRENDER #ifdef HWRENDER
player_fovadd, player_fovadd,
@ -371,6 +372,7 @@ static const char *const player_opt[] = {
"blocked", "blocked",
"jointime", "jointime",
"quittime", "quittime",
"lastinputtime",
"ping", "ping",
#ifdef HWRENDER #ifdef HWRENDER
"fovadd", "fovadd",
@ -407,7 +409,7 @@ static int player_get(lua_State *L)
case player_realmo: case player_realmo:
LUA_PushUserdata(L, plr->mo, META_MOBJ); LUA_PushUserdata(L, plr->mo, META_MOBJ);
break; break;
// Kept for backward-compatibility // TODO: 2.3: Kept for backward-compatibility
// Should be fixed to work like "realmo" later // Should be fixed to work like "realmo" later
case player_mo: case player_mo:
if (plr->spectator) if (plr->spectator)
@ -826,6 +828,9 @@ static int player_get(lua_State *L)
case player_quittime: case player_quittime:
lua_pushinteger(L, plr->quittime); lua_pushinteger(L, plr->quittime);
break; break;
case player_lastinputtime:
lua_pushinteger(L, plr->lastinputtime);
break;
case player_ping: case player_ping:
lua_pushinteger(L, playerpingtable[plr - players]); lua_pushinteger(L, playerpingtable[plr - players]);
break; break;
@ -1349,6 +1354,9 @@ static int player_set(lua_State *L)
case player_quittime: case player_quittime:
plr->quittime = (tic_t)luaL_checkinteger(L, 3); plr->quittime = (tic_t)luaL_checkinteger(L, 3);
break; break;
case player_lastinputtime:
plr->lastinputtime = (tic_t)luaL_checkinteger(L, 3);
break;
#ifdef HWRENDER #ifdef HWRENDER
case player_fovadd: case player_fovadd:
plr->fovadd = luaL_checkfixed(L, 3); plr->fovadd = luaL_checkfixed(L, 3);
@ -1523,48 +1531,13 @@ static int ticcmd_set(lua_State *L)
int LUA_PlayerLib(lua_State *L) int LUA_PlayerLib(lua_State *L)
{ {
luaL_newmetatable(L, META_PLAYER); LUA_RegisterUserdataMetatable(L, META_PLAYER, player_get, player_set, player_num);
lua_pushcfunction(L, player_get); LUA_RegisterUserdataMetatable(L, META_POWERS, power_get, power_set, power_len);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_TICCMD, ticcmd_get, ticcmd_set, NULL);
lua_pushcfunction(L, player_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, player_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
player_fields_ref = Lua_CreateFieldTable(L, player_opt); player_fields_ref = Lua_CreateFieldTable(L, player_opt);
luaL_newmetatable(L, META_POWERS);
lua_pushcfunction(L, power_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, power_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, power_len);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
luaL_newmetatable(L, META_TICCMD);
lua_pushcfunction(L, ticcmd_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, ticcmd_set);
lua_setfield(L, -2, "__newindex");
lua_pop(L,1);
ticcmd_fields_ref = Lua_CreateFieldTable(L, ticcmd_opt); ticcmd_fields_ref = Lua_CreateFieldTable(L, ticcmd_opt);
lua_newuserdata(L, 0); LUA_RegisterGlobalUserdata(L, "players", lib_getPlayer, NULL, lib_lenPlayer);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getPlayer);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_lenPlayer);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "players");
return 0; return 0;
} }

View file

@ -447,41 +447,10 @@ static int lib_numPolyObjects(lua_State *L)
int LUA_PolyObjLib(lua_State *L) int LUA_PolyObjLib(lua_State *L)
{ {
luaL_newmetatable(L, META_POLYOBJVERTICES); LUA_RegisterUserdataMetatable(L, META_POLYOBJVERTICES, polyobjvertices_get, NULL, polyobjvertices_num);
lua_pushcfunction(L, polyobjvertices_get); LUA_RegisterUserdataMetatable(L, META_POLYOBJLINES, polyobjlines_get, NULL, polyobjlines_num);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_POLYOBJ, polyobj_get, polyobj_set, polyobj_num);
lua_pushcfunction(L, polyobjvertices_num); LUA_RegisterGlobalUserdata(L, "polyobjects", lib_getPolyObject, NULL, lib_numPolyObjects);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_POLYOBJLINES);
lua_pushcfunction(L, polyobjlines_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, polyobjlines_num);
lua_setfield(L, -2, "__len");
lua_pop(L, 1);
luaL_newmetatable(L, META_POLYOBJ);
lua_pushcfunction(L, polyobj_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, polyobj_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, polyobj_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getPolyObject);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numPolyObjects);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "polyobjects");
return 0; return 0;
} }

View file

@ -415,9 +415,11 @@ int LUA_PushGlobals(lua_State *L, const char *word)
} else if (fastcmp(word, "stagefailed")) { } else if (fastcmp(word, "stagefailed")) {
lua_pushboolean(L, stagefailed); lua_pushboolean(L, stagefailed);
return 1; return 1;
// TODO: 2.3: Deprecated (moved to the input library)
} else if (fastcmp(word, "mouse")) { } else if (fastcmp(word, "mouse")) {
LUA_PushUserdata(L, &mouse, META_MOUSE); LUA_PushUserdata(L, &mouse, META_MOUSE);
return 1; return 1;
// TODO: 2.3: Deprecated (moved to the input library)
} else if (fastcmp(word, "mouse2")) { } else if (fastcmp(word, "mouse2")) {
LUA_PushUserdata(L, &mouse2, META_MOUSE); LUA_PushUserdata(L, &mouse2, META_MOUSE);
return 1; return 1;
@ -576,8 +578,7 @@ static void LUA_ClearState(void)
// lock the global namespace // lock the global namespace
lua_getmetatable(L, LUA_GLOBALSINDEX); lua_getmetatable(L, LUA_GLOBALSINDEX);
lua_pushcfunction(L, setglobals); LUA_SetCFunctionField(L, "__newindex", setglobals);
lua_setfield(L, -2, "__newindex");
lua_newtable(L); lua_newtable(L);
lua_setfield(L, -2, "__metatable"); lua_setfield(L, -2, "__metatable");
lua_pop(L, 1); lua_pop(L, 1);
@ -1813,20 +1814,107 @@ void LUA_PushTaggableObjectArray
lua_newuserdata(L, 0); lua_newuserdata(L, 0);
lua_createtable(L, 0, 2); lua_createtable(L, 0, 2);
lua_createtable(L, 0, 2); lua_createtable(L, 0, 2);
lua_pushcfunction(L, iterator); LUA_SetCFunctionField(L, "iterate", iterator);
lua_setfield(L, -2, "iterate");
LUA_InsertTaggroupIterator(L, garray, LUA_InsertTaggroupIterator(L, garray,
max_elements, element_array, sizeof_element, meta); max_elements, element_array, sizeof_element, meta);
lua_createtable(L, 0, 1); lua_createtable(L, 0, 1);
lua_pushcfunction(L, indexer); LUA_SetCFunctionField(L, "__index", indexer);
lua_setfield(L, -2, "__index");
lua_setmetatable(L, -2); lua_setmetatable(L, -2);
lua_setfield(L, -2, "__index"); lua_setfield(L, -2, "__index");
lua_pushcfunction(L, counter); LUA_SetCFunctionField(L, "__len", counter);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2); lua_setmetatable(L, -2);
lua_setglobal(L, field); lua_setglobal(L, field);
} }
static void SetBasicMetamethods(
lua_State *L,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len
)
{
if (get)
LUA_SetCFunctionField(L, "__index", get);
if (set)
LUA_SetCFunctionField(L, "__newindex", set);
if (len)
LUA_SetCFunctionField(L, "__len", len);
}
void LUA_SetCFunctionField(lua_State *L, const char *name, lua_CFunction value)
{
lua_pushcfunction(L, value);
lua_setfield(L, -2, name);
}
void LUA_RegisterUserdataMetatable(
lua_State *L,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len
)
{
luaL_newmetatable(L, name);
SetBasicMetamethods(L, get, set, len);
lua_pop(L, 1);
}
// If keep is true, leaves the metatable on the stack.
// Otherwise, the stack size remains unchanged.
void LUA_CreateAndSetMetatable(
lua_State *L,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len,
boolean keep
)
{
lua_newtable(L);
SetBasicMetamethods(L, get, set, len);
lua_pushvalue(L, -1);
lua_setmetatable(L, -3);
if (!keep)
lua_pop(L, 1);
}
// If keep is true, leaves the userdata and metatable on the stack.
// Otherwise, the stack size remains unchanged.
void LUA_CreateAndSetUserdataField(
lua_State *L,
int index,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len,
boolean keep
)
{
if (index < 0 && index > LUA_REGISTRYINDEX)
index -= 3;
lua_newuserdata(L, 0);
LUA_CreateAndSetMetatable(L, get, set, len, true);
lua_pushvalue(L, -2);
lua_setfield(L, index, name);
if (!keep)
lua_pop(L, 2);
}
void LUA_RegisterGlobalUserdata(
lua_State *L,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len
)
{
LUA_CreateAndSetUserdataField(L, LUA_GLOBALSINDEX, name, get, set, len, false);
}

View file

@ -73,6 +73,42 @@ void LUA_PushTaggableObjectArray
size_t sizeof_element, size_t sizeof_element,
const char *meta); const char *meta);
void LUA_SetCFunctionField(lua_State *L, const char *name, lua_CFunction value);
void LUA_RegisterUserdataMetatable(
lua_State *L,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len
);
void LUA_CreateAndSetMetatable(
lua_State *L,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len,
boolean keep
);
void LUA_CreateAndSetUserdataField(
lua_State *L,
int index,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len,
boolean keep
);
void LUA_RegisterGlobalUserdata(
lua_State *L,
const char *name,
lua_CFunction get,
lua_CFunction set,
lua_CFunction len
);
void LUA_InsertTaggroupIterator void LUA_InsertTaggroupIterator
( lua_State *L, ( lua_State *L,
taggroup_t *garray[], taggroup_t *garray[],

View file

@ -373,49 +373,14 @@ static int sprite_get(lua_State *L)
int LUA_SkinLib(lua_State *L) int LUA_SkinLib(lua_State *L)
{ {
luaL_newmetatable(L, META_SKIN); LUA_RegisterUserdataMetatable(L, META_SKIN, skin_get, skin_set, skin_num);
lua_pushcfunction(L, skin_get); LUA_RegisterUserdataMetatable(L, META_SOUNDSID, soundsid_get, NULL, soundsid_num);
lua_setfield(L, -2, "__index"); LUA_RegisterUserdataMetatable(L, META_SKINSPRITES, lib_getSkinSprite, NULL, lib_numSkinsSprites);
LUA_RegisterUserdataMetatable(L, META_SKINSPRITESLIST, sprite_get, NULL, NULL);
lua_pushcfunction(L, skin_set);
lua_setfield(L, -2, "__newindex");
lua_pushcfunction(L, skin_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
skin_fields_ref = Lua_CreateFieldTable(L, skin_opt); skin_fields_ref = Lua_CreateFieldTable(L, skin_opt);
luaL_newmetatable(L, META_SOUNDSID); LUA_RegisterGlobalUserdata(L, "skins", lib_getSkin, NULL, lib_numSkins);
lua_pushcfunction(L, soundsid_get);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, soundsid_num);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
luaL_newmetatable(L, META_SKINSPRITES);
lua_pushcfunction(L, lib_getSkinSprite);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numSkinsSprites);
lua_setfield(L, -2, "__len");
lua_pop(L,1);
luaL_newmetatable(L, META_SKINSPRITESLIST);
lua_pushcfunction(L, sprite_get);
lua_setfield(L, -2, "__index");
lua_pop(L,1);
lua_newuserdata(L, 0);
lua_createtable(L, 0, 2);
lua_pushcfunction(L, lib_getSkin);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numSkins);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "skins");
return 0; return 0;
} }

View file

@ -372,8 +372,7 @@ void LUA_InsertTaggroupIterator
lua_pushcclosure(L, lib_numTaggroupElements, 2); lua_pushcclosure(L, lib_numTaggroupElements, 2);
lua_setfield(L, -2, "__len"); lua_setfield(L, -2, "__len");
lua_pushcfunction(L, element_iterator); LUA_SetCFunctionField(L, "__call", element_iterator);
lua_setfield(L, -2, "__call");
lua_pushcclosure(L, lib_getTaggroup, 1); lua_pushcclosure(L, lib_getTaggroup, 1);
lua_setfield(L, -2, "tagged"); lua_setfield(L, -2, "tagged");
} }
@ -414,11 +413,9 @@ set_taglist_metatable(lua_State *L, const char *meta)
lua_setfenv(L, -2); lua_setfenv(L, -2);
lua_setfield(L, -2, "__index"); lua_setfield(L, -2, "__index");
lua_pushcfunction(L, taglist_len); LUA_SetCFunctionField(L, "__len", taglist_len);
lua_setfield(L, -2, "__len");
lua_pushcfunction(L, taglist_equal); LUA_SetCFunctionField(L, "__eq", taglist_equal);
lua_setfield(L, -2, "__eq");
#ifdef MUTABLE_TAGS #ifdef MUTABLE_TAGS
return luaL_ref(L, LUA_REGISTRYINDEX); return luaL_ref(L, LUA_REGISTRYINDEX);
#endif #endif
@ -426,17 +423,11 @@ set_taglist_metatable(lua_State *L, const char *meta)
int LUA_TagLib(lua_State *L) int LUA_TagLib(lua_State *L)
{ {
lua_newuserdata(L, 0); LUA_CreateAndSetUserdataField(L, LUA_GLOBALSINDEX, "tags", NULL, NULL, lib_numTags, true);
lua_createtable(L, 0, 2); lua_createtable(L, 0, 1);
lua_createtable(L, 0, 1); LUA_SetCFunctionField(L, "iterate", lib_iterateTags);
lua_pushcfunction(L, lib_iterateTags); lua_setfield(L, -2, "__index");
lua_setfield(L, -2, "iterate"); lua_pop(L, 2);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, lib_numTags);
lua_setfield(L, -2, "__len");
lua_setmetatable(L, -2);
lua_setglobal(L, "tags");
open_taglist(L); open_taglist(L);

View file

@ -127,8 +127,7 @@ static int lib_startIterate(lua_State *L)
int LUA_ThinkerLib(lua_State *L) int LUA_ThinkerLib(lua_State *L)
{ {
luaL_newmetatable(L, META_ITERATIONSTATE); luaL_newmetatable(L, META_ITERATIONSTATE);
lua_pushcfunction(L, iterationState_gc); LUA_SetCFunctionField(L, "__gc", iterationState_gc);
lua_setfield(L, -2, "__gc");
lua_pop(L, 1); lua_pop(L, 1);
lua_createtable(L, 0, 1); lua_createtable(L, 0, 1);

View file

@ -462,7 +462,7 @@ static void GIF_headwrite(void)
// Image width/height // Image width/height
if (gif_downscale) if (gif_downscale)
{ {
scrbuf_downscaleamt = vid.dupx; scrbuf_downscaleamt = vid.dup;
rwidth = (vid.width / scrbuf_downscaleamt); rwidth = (vid.width / scrbuf_downscaleamt);
rheight = (vid.height / scrbuf_downscaleamt); rheight = (vid.height / scrbuf_downscaleamt);
} }

View file

@ -214,7 +214,7 @@ static fixed_t lsoffs[2];
#define lshli levelselectselect[2] #define lshli levelselectselect[2]
#define lshseperation 101 #define lshseperation 101
#define lsbasevseperation ((62*vid.height)/(BASEVIDHEIGHT*vid.dupy)) //62 #define lsbasevseperation ((62*vid.height)/(BASEVIDHEIGHT*vid.dup)) //62
#define lsheadingheight 16 #define lsheadingheight 16
#define getheadingoffset(row) (levelselect.rows[row].header[0] ? lsheadingheight : 0) #define getheadingoffset(row) (levelselect.rows[row].header[0] ? lsheadingheight : 0)
#define lsvseperation(row) (lsbasevseperation + getheadingoffset(row)) #define lsvseperation(row) (lsbasevseperation + getheadingoffset(row))
@ -3574,16 +3574,16 @@ void M_Drawer(void)
{ {
if (customversionstring[0] != '\0') if (customversionstring[0] != '\0')
{ {
V_DrawThinString(vid.dupx, vid.height - 17*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT, "Mod version:"); V_DrawThinString(vid.dup, vid.height - 17*vid.dup, V_NOSCALESTART|V_TRANSLUCENT, "Mod version:");
V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, customversionstring); V_DrawThinString(vid.dup, vid.height - 9*vid.dup, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, customversionstring);
} }
else else
{ {
#ifdef DEVELOP // Development -- show revision / branch info #ifdef DEVELOP // Development -- show revision / branch info
V_DrawThinString(vid.dupx, vid.height - 17*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, compbranch); V_DrawThinString(vid.dup, vid.height - 17*vid.dup, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, compbranch);
V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, comprevision); V_DrawThinString(vid.dup, vid.height - 9*vid.dup, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, comprevision);
#else // Regular build #else // Regular build
V_DrawThinString(vid.dupx, vid.height - 9*vid.dupy, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s", VERSIONSTRING)); V_DrawThinString(vid.dup, vid.height - 9*vid.dup, V_NOSCALESTART|V_TRANSLUCENT|V_ALLOWLOWERCASE, va("%s", VERSIONSTRING));
#endif #endif
} }
} }
@ -5757,16 +5757,15 @@ static void M_DrawRecordAttackForeground(void)
INT32 i; INT32 i;
INT32 height = (fg->height / 2); INT32 height = (fg->height / 2);
INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy);
for (i = -12; i < (BASEVIDHEIGHT/height) + 12; i++) for (i = -12; i < (BASEVIDHEIGHT/height) + 12; i++)
{ {
INT32 y = ((i*height) - (height - ((FixedInt(recatkdrawtimer*2))%height))); INT32 y = ((i*height) - (height - ((FixedInt(recatkdrawtimer*2))%height)));
// don't draw above the screen // don't draw above the screen
{ {
INT32 sy = FixedMul(y, dupz<<FRACBITS) >> FRACBITS; INT32 sy = FixedMul(y, vid.dup<<FRACBITS) >> FRACBITS;
if (vid.height != BASEVIDHEIGHT * dupz) if (vid.height != BASEVIDHEIGHT * vid.dup)
sy += (vid.height - (BASEVIDHEIGHT * dupz)) / 2; sy += (vid.height - (BASEVIDHEIGHT * vid.dup)) / 2;
if ((sy+height) < 0) if ((sy+height) < 0)
continue; continue;
} }
@ -5790,13 +5789,12 @@ static void M_DrawRecordAttackForeground(void)
static void M_DrawNightsAttackMountains(void) static void M_DrawNightsAttackMountains(void)
{ {
static fixed_t bgscrollx; static fixed_t bgscrollx;
INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy);
patch_t *background = W_CachePatchName(curbgname, PU_PATCH); patch_t *background = W_CachePatchName(curbgname, PU_PATCH);
INT16 w = background->width; INT16 w = background->width;
INT32 x = FixedInt(-bgscrollx) % w; INT32 x = FixedInt(-bgscrollx) % w;
INT32 y = BASEVIDHEIGHT - (background->height * 2); INT32 y = BASEVIDHEIGHT - (background->height * 2);
if (vid.height != BASEVIDHEIGHT * dupz) if (vid.height != BASEVIDHEIGHT * vid.dup)
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 158); V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 158);
V_DrawFill(0, y+50, vid.width, BASEVIDHEIGHT, V_SNAPTOLEFT|31); V_DrawFill(0, y+50, vid.width, BASEVIDHEIGHT, V_SNAPTOLEFT|31);
@ -5952,7 +5950,7 @@ static void M_DrawLevelPlatterMenu(void)
} }
// draw from top to bottom // draw from top to bottom
while (y < (vid.height/vid.dupy)) while (y < (vid.height/vid.dup))
{ {
M_DrawLevelPlatterRow(iter, y); M_DrawLevelPlatterRow(iter, y);
y += lsvseperation(iter); y += lsvseperation(iter);
@ -7799,9 +7797,9 @@ static void M_DrawSoundTest(void)
} }
} }
y = (BASEVIDWIDTH-(vid.width/vid.dupx))/2; y = (BASEVIDWIDTH-(vid.width/vid.dup))/2;
V_DrawFill(y, 20, vid.width/vid.dupx, 24, 159); V_DrawFill(y, 20, vid.width/vid.dup, 24, 159);
{ {
static fixed_t st_scroll = -FRACUNIT; static fixed_t st_scroll = -FRACUNIT;
const char* titl; const char* titl;
@ -8371,8 +8369,8 @@ static void M_DrawLoadGameData(void)
INT32 i, prev_i = 1, savetodraw, x, y, hsep = 90; INT32 i, prev_i = 1, savetodraw, x, y, hsep = 90;
skin_t *charskin = NULL; skin_t *charskin = NULL;
if (vid.width != BASEVIDWIDTH*vid.dupx) if (vid.width != BASEVIDWIDTH*vid.dup)
hsep = (hsep*vid.width)/(BASEVIDWIDTH*vid.dupx); hsep = (hsep*vid.width)/(BASEVIDWIDTH*vid.dup);
for (i = 2; prev_i; i = -(i + ((UINT32)i >> 31))) // draws from outwards in; 2, -2, 1, -1, 0 for (i = 2; prev_i; i = -(i + ((UINT32)i >> 31))) // draws from outwards in; 2, -2, 1, -1, 0
{ {
@ -9357,7 +9355,7 @@ static void M_DrawSetupChoosePlayerMenu(void)
INT16 bgwidth = charbg->width; INT16 bgwidth = charbg->width;
INT16 fgwidth = charfg->width; INT16 fgwidth = charfg->width;
INT32 x, y; INT32 x, y;
INT32 w = (vid.width/vid.dupx); INT32 w = (vid.width/vid.dup);
if (abs(char_scroll) > FRACUNIT/4) if (abs(char_scroll) > FRACUNIT/4)
char_scroll -= FixedMul((char_scroll>>2), renderdeltatics); char_scroll -= FixedMul((char_scroll>>2), renderdeltatics);
@ -9393,7 +9391,7 @@ static void M_DrawSetupChoosePlayerMenu(void)
// Background and borders // Background and borders
V_DrawFill(0, 0, bgwidth, vid.height, V_SNAPTOTOP|colormap[101]); V_DrawFill(0, 0, bgwidth, vid.height, V_SNAPTOTOP|colormap[101]);
{ {
INT32 sw = (BASEVIDWIDTH * vid.dupx); INT32 sw = (BASEVIDWIDTH * vid.dup);
INT32 bw = (vid.width - sw) / 2; INT32 bw = (vid.width - sw) / 2;
col = colormap[106]; col = colormap[106];
if (bw) if (bw)
@ -10815,7 +10813,7 @@ void M_DrawMarathon(void)
const char *cvstring; const char *cvstring;
char *work; char *work;
angle_t fa; angle_t fa;
INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy), xspan = (vid.width/dupz), yspan = (vid.height/dupz), diffx = (xspan - BASEVIDWIDTH)/2, diffy = (yspan - BASEVIDHEIGHT)/2, maxy = BASEVIDHEIGHT + diffy; INT32 xspan = (vid.width/vid.dup), yspan = (vid.height/vid.dup), diffx = (xspan - BASEVIDWIDTH)/2, diffy = (yspan - BASEVIDHEIGHT)/2, maxy = BASEVIDHEIGHT + diffy;
curbgxspeed = 0; curbgxspeed = 0;
curbgyspeed = 18; curbgyspeed = 18;
@ -10888,16 +10886,17 @@ void M_DrawMarathon(void)
INT32 trans = V_60TRANS+((cnt&~3)<<(V_ALPHASHIFT-2)); INT32 trans = V_60TRANS+((cnt&~3)<<(V_ALPHASHIFT-2));
INT32 height = fg->height / 2; INT32 height = fg->height / 2;
char patchname[7] = "CEMGx0"; char patchname[7] = "CEMGx0";
INT32 dup;
dupz = (w*7)/6; //(w*42*120)/(360*6); -- I don't know why this works but I'm not going to complain. dup = (w*7)/6; //(w*42*120)/(360*6); -- I don't know why this works but I'm not going to complain.
dupz = ((dupz>>FRACBITS) % height); dup = ((dup>>FRACBITS) % height);
y = height/2; y = height/2;
while (y+dupz >= -diffy) while (y+dup >= -diffy)
y -= height; y -= height;
while (y-2-dupz < maxy) while (y-2-dup < maxy)
{ {
V_DrawFixedPatch(((BASEVIDWIDTH-190)<<(FRACBITS-1)), (y-2-dupz)<<FRACBITS, FRACUNIT/2, trans, fg, NULL); V_DrawFixedPatch(((BASEVIDWIDTH-190)<<(FRACBITS-1)), (y-2-dup)<<FRACBITS, FRACUNIT/2, trans, fg, NULL);
V_DrawFixedPatch(((BASEVIDWIDTH+190)<<(FRACBITS-1)), (y+dupz)<<FRACBITS, FRACUNIT/2, trans|V_FLIP, fg, NULL); V_DrawFixedPatch(((BASEVIDWIDTH+190)<<(FRACBITS-1)), (y+dup)<<FRACBITS, FRACUNIT/2, trans|V_FLIP, fg, NULL);
y += height; y += height;
} }
@ -10915,16 +10914,16 @@ void M_DrawMarathon(void)
} }
height = 18; // prevents the need for the next line height = 18; // prevents the need for the next line
//dupz = (w*height)/18; //dup = (w*height)/18;
dupz = ((w>>FRACBITS) % height); dup = ((w>>FRACBITS) % height);
y = dupz+(height/4); y = dup+(height/4);
x = 105+dupz; x = 105+dup;
while (y >= -diffy) while (y >= -diffy)
{ {
x -= height; x -= height;
y -= height; y -= height;
} }
while (y-dupz < maxy && x < (xspan/2)) while (y-dup < maxy && x < (xspan/2))
{ {
V_DrawFill((BASEVIDWIDTH/2)-x-height, -diffy, height, diffy+y+height, 153); V_DrawFill((BASEVIDWIDTH/2)-x-height, -diffy, height, diffy+y+height, 153);
V_DrawFill((BASEVIDWIDTH/2)+x, (maxy-y)-height, height, height+y, 153); V_DrawFill((BASEVIDWIDTH/2)+x, (maxy-y)-height, height, height+y, 153);

View file

@ -989,7 +989,7 @@ static inline boolean M_PNGLib(void)
static void M_PNGFrame(png_structp png_ptr, png_infop png_info_ptr, png_bytep png_buf) static void M_PNGFrame(png_structp png_ptr, png_infop png_info_ptr, png_bytep png_buf)
{ {
png_uint_16 downscale = apng_downscale ? vid.dupx : 1; png_uint_16 downscale = apng_downscale ? vid.dup : 1;
png_uint_32 pitch = png_get_rowbytes(png_ptr, png_info_ptr); png_uint_32 pitch = png_get_rowbytes(png_ptr, png_info_ptr);
PNG_CONST png_uint_32 width = vid.width / downscale; PNG_CONST png_uint_32 width = vid.width / downscale;
@ -1055,7 +1055,7 @@ static boolean M_SetupaPNG(png_const_charp filename, png_bytep pal)
apng_downscale = (!!cv_apng_downscale.value); apng_downscale = (!!cv_apng_downscale.value);
downscale = apng_downscale ? vid.dupx : 1; downscale = apng_downscale ? vid.dup : 1;
apng_FILE = fopen(filename,"wb+"); // + mode for reading apng_FILE = fopen(filename,"wb+"); // + mode for reading
if (!apng_FILE) if (!apng_FILE)

View file

@ -113,6 +113,7 @@ consvar_t cv_blamecfail = CVAR_INIT ("blamecfail", "Off", CV_SAVE|CV_NETVAR, CV_
static CV_PossibleValue_t playbackspeed_cons_t[] = {{1, "MIN"}, {10, "MAX"}, {0, NULL}}; static CV_PossibleValue_t playbackspeed_cons_t[] = {{1, "MIN"}, {10, "MAX"}, {0, NULL}};
consvar_t cv_playbackspeed = CVAR_INIT ("playbackspeed", "1", 0, playbackspeed_cons_t, NULL); consvar_t cv_playbackspeed = CVAR_INIT ("playbackspeed", "1", 0, playbackspeed_cons_t, NULL);
consvar_t cv_idletime = CVAR_INIT ("idletime", "0", CV_SAVE, CV_Unsigned, NULL);
consvar_t cv_dedicatedidletime = CVAR_INIT ("dedicatedidletime", "10", CV_SAVE, CV_Unsigned, NULL); consvar_t cv_dedicatedidletime = CVAR_INIT ("dedicatedidletime", "10", CV_SAVE, CV_Unsigned, NULL);
void ResetNode(INT32 node) void ResetNode(INT32 node)
@ -226,6 +227,7 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
newplayer->jointime = 0; newplayer->jointime = 0;
newplayer->quittime = 0; newplayer->quittime = 0;
newplayer->lastinputtime = 0;
READSTRINGN(*p, player_names[newplayernum], MAXPLAYERNAME); READSTRINGN(*p, player_names[newplayernum], MAXPLAYERNAME);
@ -492,6 +494,10 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
HU_AddChatText(va("\x82*%s has been banned (%s)", player_names[pnum], reason), false); HU_AddChatText(va("\x82*%s has been banned (%s)", player_names[pnum], reason), false);
kickreason = KR_BAN; kickreason = KR_BAN;
break; break;
case KICK_MSG_IDLE:
HU_AddChatText(va("\x82*%s has left the game (Inactive for too long)", player_names[pnum]), false);
kickreason = KR_TIMEOUT;
break;
} }
if (pnum == consoleplayer) if (pnum == consoleplayer)
@ -507,6 +513,8 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
M_StartMessage(M_GetText("Server closed connection\n(synch failure)\nPress ESC\n"), NULL, MM_NOTHING); M_StartMessage(M_GetText("Server closed connection\n(synch failure)\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_PING_HIGH) else if (msg == KICK_MSG_PING_HIGH)
M_StartMessage(M_GetText("Server closed connection\n(Broke ping limit)\nPress ESC\n"), NULL, MM_NOTHING); M_StartMessage(M_GetText("Server closed connection\n(Broke ping limit)\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_IDLE)
M_StartMessage(M_GetText("Server closed connection\n(Inactive for too long)\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_BANNED) else if (msg == KICK_MSG_BANNED)
M_StartMessage(M_GetText("You have been banned by the server\n\nPress ESC\n"), NULL, MM_NOTHING); M_StartMessage(M_GetText("You have been banned by the server\n\nPress ESC\n"), NULL, MM_NOTHING);
else if (msg == KICK_MSG_CUSTOM_KICK) else if (msg == KICK_MSG_CUSTOM_KICK)
@ -1267,6 +1275,32 @@ static void UpdatePingTable(void)
} }
} }
static void IdleUpdate(void)
{
INT32 i;
if (!server || !netgame)
return;
for (i = 1; i < MAXPLAYERS; i++)
{
if (cv_idletime.value && playeringame[i] && playernode[i] != UINT8_MAX && !players[i].quittime && !players[i].spectator && !players[i].bot && !IsPlayerAdmin(i) && i != serverplayer)
{
if (players[i].cmd.forwardmove || players[i].cmd.sidemove || players[i].cmd.buttons)
players[i].lastinputtime = 0;
else
players[i].lastinputtime++;
if (players[i].lastinputtime > (tic_t)cv_idletime.value * TICRATE * 60)
{
players[i].lastinputtime = 0;
SendKick(i, KICK_MSG_IDLE | KICK_MSG_KEEP_BODY);
}
}
else
players[i].lastinputtime = 0;
}
}
// Handle timeouts to prevent definitive freezes from happenning // Handle timeouts to prevent definitive freezes from happenning
static void HandleNodeTimeouts(void) static void HandleNodeTimeouts(void)
{ {
@ -1299,6 +1333,8 @@ void NetKeepAlive(void)
GetPackets(); GetPackets();
IdleUpdate();
#ifdef MASTERSERVER #ifdef MASTERSERVER
MasterClient_Ticker(); MasterClient_Ticker();
#endif #endif
@ -1419,6 +1455,8 @@ void NetUpdate(void)
GetPackets(); // get packet from client or from server GetPackets(); // get packet from client or from server
IdleUpdate();
// The client sends the command after receiving from the server // The client sends the command after receiving from the server
// The server sends it before because this is better in single player // The server sends it before because this is better in single player

View file

@ -48,7 +48,7 @@ typedef enum
KR_TIMEOUT = 4, //Connection Timeout KR_TIMEOUT = 4, //Connection Timeout
KR_BAN = 5, //Banned by server KR_BAN = 5, //Banned by server
KR_LEAVE = 6, //Quit the game KR_LEAVE = 6, //Quit the game
KR_IDLE = 7, //Remained still for too long
} kickreason_t; } kickreason_t;
/* the max number of name changes in some time period */ /* the max number of name changes in some time period */
@ -73,7 +73,7 @@ extern UINT32 realpingtable[MAXPLAYERS];
extern UINT32 playerpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS];
extern tic_t servermaxping; extern tic_t servermaxping;
extern consvar_t cv_netticbuffer, cv_resynchattempts, cv_blamecfail, cv_playbackspeed, cv_dedicatedidletime; extern consvar_t cv_netticbuffer, cv_resynchattempts, cv_blamecfail, cv_playbackspeed, cv_idletime, cv_dedicatedidletime;
// Used in d_net, the only dependence // Used in d_net, the only dependence
void D_ClientServerInit(void); void D_ClientServerInit(void);

View file

@ -601,6 +601,7 @@ void D_RegisterServerCommands(void)
CV_RegisterVar(&cv_showjoinaddress); CV_RegisterVar(&cv_showjoinaddress);
CV_RegisterVar(&cv_blamecfail); CV_RegisterVar(&cv_blamecfail);
CV_RegisterVar(&cv_dedicatedidletime); CV_RegisterVar(&cv_dedicatedidletime);
CV_RegisterVar(&cv_idletime);
COM_AddCommand("ping", Command_Ping_f, COM_LUA); COM_AddCommand("ping", Command_Ping_f, COM_LUA);
CV_RegisterVar(&cv_nettimeout); CV_RegisterVar(&cv_nettimeout);
@ -1241,7 +1242,7 @@ static void SetColorLocal(INT32 playernum, UINT16 color)
// //
static void SendNameAndColor(void) static void SendNameAndColor(void)
{ {
char buf[MAXPLAYERNAME+6]; char buf[MAXPLAYERNAME+7];
char *p; char *p;
p = buf; p = buf;

View file

@ -331,6 +331,7 @@ typedef struct
#define KICK_MSG_PING_HIGH 6 #define KICK_MSG_PING_HIGH 6
#define KICK_MSG_CUSTOM_KICK 7 #define KICK_MSG_CUSTOM_KICK 7
#define KICK_MSG_CUSTOM_BAN 8 #define KICK_MSG_CUSTOM_BAN 8
#define KICK_MSG_IDLE 9
#define KICK_MSG_KEEP_BODY 0x80 #define KICK_MSG_KEEP_BODY 0x80
#endif #endif

View file

@ -204,6 +204,7 @@ void P_Earthquake(mobj_t *inflictor, mobj_t *source, fixed_t radius);
boolean P_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user boolean P_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user
boolean P_SuperReady(player_t *player); boolean P_SuperReady(player_t *player);
void P_DoJump(player_t *player, boolean soundandstate, boolean allowflip); void P_DoJump(player_t *player, boolean soundandstate, boolean allowflip);
void P_DoSpinDashDust(player_t *player);
#define P_AnalogMove(player) (P_ControlStyle(player) == CS_LMAOGALOG) #define P_AnalogMove(player) (P_ControlStyle(player) == CS_LMAOGALOG)
boolean P_TransferToNextMare(player_t *player); boolean P_TransferToNextMare(player_t *player);
UINT8 P_FindLowestMare(void); UINT8 P_FindLowestMare(void);
@ -214,6 +215,10 @@ void P_SpawnThokMobj(player_t *player);
void P_SpawnSpinMobj(player_t *player, mobjtype_t type); void P_SpawnSpinMobj(player_t *player, mobjtype_t type);
void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range); void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range);
void P_DoTailsOverlay(player_t *player, mobj_t *tails);
void P_DoMetalJetFume(player_t *player, mobj_t *fume);
void P_DoFollowMobj(player_t *player, mobj_t *followmobj);
void P_PlayLivesJingle(player_t *player); void P_PlayLivesJingle(player_t *player);
#define P_PlayRinglossSound(s) S_StartSound(s, (mariomode) ? sfx_mario8 : sfx_altow1 + P_RandomKey(4)); #define P_PlayRinglossSound(s) S_StartSound(s, (mariomode) ? sfx_mario8 : sfx_altow1 + P_RandomKey(4));
#define P_PlayDeathSound(s) S_StartSound(s, sfx_altdi1 + P_RandomKey(4)); #define P_PlayDeathSound(s) S_StartSound(s, sfx_altdi1 + P_RandomKey(4));
@ -298,6 +303,7 @@ void P_RunOverlays(void);
void P_HandleMinecartSegments(mobj_t *mobj); void P_HandleMinecartSegments(mobj_t *mobj);
void P_MobjThinker(mobj_t *mobj); void P_MobjThinker(mobj_t *mobj);
boolean P_RailThinker(mobj_t *mobj); boolean P_RailThinker(mobj_t *mobj);
boolean P_CheckSkyHit(mobj_t *mo, line_t *line);
void P_PushableThinker(mobj_t *mobj); void P_PushableThinker(mobj_t *mobj);
void P_SceneryThinker(mobj_t *mobj); void P_SceneryThinker(mobj_t *mobj);
@ -535,6 +541,9 @@ boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle
boolean P_SetMobjStateNF(mobj_t *mobj, statenum_t state); boolean P_SetMobjStateNF(mobj_t *mobj, statenum_t state);
boolean P_CheckMissileSpawn(mobj_t *th); boolean P_CheckMissileSpawn(mobj_t *th);
void P_Thrust(mobj_t *mo, angle_t angle, fixed_t move); void P_Thrust(mobj_t *mo, angle_t angle, fixed_t move);
void P_ThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move);
void P_VectorInstaThrust(fixed_t xa, fixed_t xb, fixed_t xc, fixed_t ya, fixed_t yb, fixed_t yc,
fixed_t za, fixed_t zb, fixed_t zc, fixed_t momentum, mobj_t *mo);
void P_DoSuperTransformation(player_t *player, boolean giverings); void P_DoSuperTransformation(player_t *player, boolean giverings);
void P_ExplodeMissile(mobj_t *mo); void P_ExplodeMissile(mobj_t *mo);
void P_CheckGravity(mobj_t *mo, boolean affect); void P_CheckGravity(mobj_t *mo, boolean affect);

View file

@ -1779,14 +1779,15 @@ bustupdone:
// //
// P_CheckSkyHit // P_CheckSkyHit
// //
static boolean P_CheckSkyHit(mobj_t *mo) boolean P_CheckSkyHit(mobj_t *mo, line_t *line)
{ {
if (ceilingline && ceilingline->backsector if (line && (line->special == 41 ||
&& ceilingline->backsector->ceilingpic == skyflatnum (line->backsector
&& ceilingline->frontsector && line->backsector->ceilingpic == skyflatnum
&& ceilingline->frontsector->ceilingpic == skyflatnum && line->frontsector
&& (mo->z >= ceilingline->frontsector->ceilingheight && line->frontsector->ceilingpic == skyflatnum
|| mo->z >= ceilingline->backsector->ceilingheight)) && (mo->z >= line->frontsector->ceilingheight
|| mo->z >= line->backsector->ceilingheight))))
return true; return true;
return false; return false;
} }
@ -1893,7 +1894,7 @@ void P_XYMovement(mobj_t *mo)
mo->fuse += ((5 - mo->threshold) * TICRATE); mo->fuse += ((5 - mo->threshold) * TICRATE);
// Check for hit against sky here // Check for hit against sky here
if (P_CheckSkyHit(mo)) if (P_CheckSkyHit(mo, ceilingline))
{ {
// Hack to prevent missiles exploding // Hack to prevent missiles exploding
// against the sky. // against the sky.
@ -1913,7 +1914,7 @@ void P_XYMovement(mobj_t *mo)
mo->flags &= ~MF_STICKY; //Don't check again! mo->flags &= ~MF_STICKY; //Don't check again!
// Check for hit against sky here // Check for hit against sky here
if (P_CheckSkyHit(mo)) if (P_CheckSkyHit(mo, ceilingline))
{ {
// Hack to prevent missiles exploding // Hack to prevent missiles exploding
// against the sky. // against the sky.
@ -1972,7 +1973,7 @@ void P_XYMovement(mobj_t *mo)
else if (mo->flags & MF_MISSILE) else if (mo->flags & MF_MISSILE)
{ {
// explode a missile // explode a missile
if (P_CheckSkyHit(mo)) if (P_CheckSkyHit(mo, ceilingline))
{ {
// Hack to prevent missiles exploding // Hack to prevent missiles exploding
// against the sky. // against the sky.
@ -10544,6 +10545,7 @@ static fixed_t P_DefaultMobjShadowScale (mobj_t *thing)
case MT_SMALLGRABCHAIN: case MT_SMALLGRABCHAIN:
case MT_BIGGRABCHAIN: case MT_BIGGRABCHAIN:
case MT_BLUESPRINGBALL:
case MT_YELLOWSPRINGBALL: case MT_YELLOWSPRINGBALL:
case MT_REDSPRINGBALL: case MT_REDSPRINGBALL:
@ -10571,14 +10573,14 @@ static fixed_t P_DefaultMobjShadowScale (mobj_t *thing)
case MT_EXPLOSIONRING: case MT_EXPLOSIONRING:
case MT_SCATTERRING: case MT_SCATTERRING:
case MT_GRENADERING: case MT_GRENADERING:
case MT_BOUNCEPICKUP: case MT_BOUNCEPICKUP:
case MT_RAILPICKUP: case MT_RAILPICKUP:
case MT_AUTOPICKUP: case MT_AUTOPICKUP:
case MT_EXPLODEPICKUP: case MT_EXPLODEPICKUP:
case MT_SCATTERPICKUP: case MT_SCATTERPICKUP:
case MT_GRENADEPICKUP: case MT_GRENADEPICKUP:
case MT_REDRING: case MT_REDRING:
case MT_THROWNBOUNCE: case MT_THROWNBOUNCE:
case MT_THROWNINFINITY: case MT_THROWNINFINITY:
@ -13319,7 +13321,7 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj, boolean
return true; return true;
} }
// Pre-UDMF backwards compatibility stuff. Remove for 2.3 // TODO: 2.3: Delete (Pre-UDMF backwards compatibility stuff)
static void P_SetAmbush(mapthing_t *mthing, mobj_t *mobj) static void P_SetAmbush(mapthing_t *mthing, mobj_t *mobj)
{ {
if (mobj->type == MT_NIGHTSBUMPER if (mobj->type == MT_NIGHTSBUMPER

View file

@ -175,7 +175,7 @@ static void P_NetArchivePlayers(void)
WRITEUINT16(save_p, players[i].flashpal); WRITEUINT16(save_p, players[i].flashpal);
WRITEUINT16(save_p, players[i].flashcount); WRITEUINT16(save_p, players[i].flashcount);
WRITEUINT8(save_p, players[i].skincolor); WRITEUINT16(save_p, players[i].skincolor);
WRITEINT32(save_p, players[i].skin); WRITEINT32(save_p, players[i].skin);
WRITEUINT32(save_p, players[i].availabilities); WRITEUINT32(save_p, players[i].availabilities);
WRITEUINT32(save_p, players[i].score); WRITEUINT32(save_p, players[i].score);
@ -404,7 +404,7 @@ static void P_NetUnArchivePlayers(void)
players[i].flashpal = READUINT16(save_p); players[i].flashpal = READUINT16(save_p);
players[i].flashcount = READUINT16(save_p); players[i].flashcount = READUINT16(save_p);
players[i].skincolor = READUINT8(save_p); players[i].skincolor = READUINT16(save_p);
players[i].skin = READINT32(save_p); players[i].skin = READINT32(save_p);
players[i].availabilities = READUINT32(save_p); players[i].availabilities = READUINT32(save_p);
players[i].score = READUINT32(save_p); players[i].score = READUINT32(save_p);

View file

@ -18,7 +18,7 @@
#pragma interface #pragma interface
#endif #endif
#define NEWSKINSAVES (INT16_MAX) // Purely for backwards compatibility, remove this for 2.3 #define NEWSKINSAVES (INT16_MAX) // TODO: 2.3: Delete (Purely for backwards compatibility)
// Persistent storage/archiving. // Persistent storage/archiving.
// These are the load / save game routines. // These are the load / save game routines.

View file

@ -1679,7 +1679,7 @@ static void ParseTextmapSectorParameter(UINT32 i, const char *param, const char
if ((id = strchr(id, ' '))) if ((id = strchr(id, ' ')))
id++; id++;
} }
} }
else if (fastcmp(param, "xpanningfloor")) else if (fastcmp(param, "xpanningfloor"))
sectors[i].floorxoffset = FLOAT_TO_FIXED(atof(val)); sectors[i].floorxoffset = FLOAT_TO_FIXED(atof(val));
else if (fastcmp(param, "ypanningfloor")) else if (fastcmp(param, "ypanningfloor"))
@ -6132,6 +6132,7 @@ static void P_ConvertBinarySectorTypes(void)
case 14: //Non-ramp sector case 14: //Non-ramp sector
sectors[i].specialflags |= SSF_NOSTEPDOWN; sectors[i].specialflags |= SSF_NOSTEPDOWN;
break; break;
// TODO: 2.3: Delete
case 15: //Bouncy FOF case 15: //Bouncy FOF
CONS_Alert(CONS_WARNING, M_GetText("Deprecated bouncy FOF sector type detected. Please use linedef type 76 instead.\n")); CONS_Alert(CONS_WARNING, M_GetText("Deprecated bouncy FOF sector type detected. Please use linedef type 76 instead.\n"));
break; break;
@ -6166,12 +6167,14 @@ static void P_ConvertBinarySectorTypes(void)
sectors[i].flags |= MSF_TRIGGERLINE_PLANE; sectors[i].flags |= MSF_TRIGGERLINE_PLANE;
sectors[i].triggerer = TO_PLAYER; sectors[i].triggerer = TO_PLAYER;
break; break;
// TODO: 2.3: Delete
case 6: //Trigger linedef executor (Emerald check) case 6: //Trigger linedef executor (Emerald check)
CONS_Alert(CONS_WARNING, M_GetText("Deprecated emerald check sector type detected. Please use linedef types 337-339 instead.\n")); CONS_Alert(CONS_WARNING, M_GetText("Deprecated emerald check sector type detected. Please use linedef types 337-339 instead.\n"));
sectors[i].triggertag = tag; sectors[i].triggertag = tag;
sectors[i].flags &= ~MSF_TRIGGERLINE_PLANE; sectors[i].flags &= ~MSF_TRIGGERLINE_PLANE;
sectors[i].triggerer = TO_PLAYEREMERALDS; sectors[i].triggerer = TO_PLAYEREMERALDS;
break; break;
// TODO: 2.3: Delete
case 7: //Trigger linedef executor (NiGHTS mare) case 7: //Trigger linedef executor (NiGHTS mare)
CONS_Alert(CONS_WARNING, M_GetText("Deprecated NiGHTS mare sector type detected. Please use linedef types 340-342 instead.\n")); CONS_Alert(CONS_WARNING, M_GetText("Deprecated NiGHTS mare sector type detected. Please use linedef types 340-342 instead.\n"));
sectors[i].triggertag = tag; sectors[i].triggertag = tag;
@ -6181,9 +6184,11 @@ static void P_ConvertBinarySectorTypes(void)
case 8: //Check for linedef executor on FOFs case 8: //Check for linedef executor on FOFs
sectors[i].flags |= MSF_TRIGGERLINE_MOBJ; sectors[i].flags |= MSF_TRIGGERLINE_MOBJ;
break; break;
// TODO: 2.3: Delete
case 10: //Special stage time/spheres requirements case 10: //Special stage time/spheres requirements
CONS_Alert(CONS_WARNING, M_GetText("Deprecated sector type for special stage requirements detected. Please use the SpecialStageTime and SpecialStageSpheres level header options instead.\n")); CONS_Alert(CONS_WARNING, M_GetText("Deprecated sector type for special stage requirements detected. Please use the SpecialStageTime and SpecialStageSpheres level header options instead.\n"));
break; break;
// TODO: 2.3: Delete
case 11: //Custom global gravity case 11: //Custom global gravity
CONS_Alert(CONS_WARNING, M_GetText("Deprecated sector type for global gravity detected. Please use the Gravity level header option instead.\n")); CONS_Alert(CONS_WARNING, M_GetText("Deprecated sector type for global gravity detected. Please use the Gravity level header option instead.\n"));
break; break;
@ -6822,7 +6827,7 @@ static void P_ConvertBinaryThingTypes(void)
default: default:
break; break;
} }
// Clear binary thing height hacks, to prevent interfering with UDMF-only flags // Clear binary thing height hacks, to prevent interfering with UDMF-only flags
mapthings[i].options &= 0xF; mapthings[i].options &= 0xF;
} }

View file

@ -2661,7 +2661,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
titlemapcameraref = altview; titlemapcameraref = altview;
else if (!mo->player->awayviewtics || mo->player->awayviewmobj != altview) { else if (!mo->player->awayviewtics || mo->player->awayviewmobj != altview) {
P_SetTarget(&mo->player->awayviewmobj, altview); P_SetTarget(&mo->player->awayviewmobj, altview);
if (mo->player == &players[displayplayer]) if (mo->player == &players[displayplayer])
P_ResetCamera(mo->player, &camera); // reset p1 camera on p1 getting an awayviewmobj P_ResetCamera(mo->player, &camera); // reset p1 camera on p1 getting an awayviewmobj
else if (splitscreen && mo->player == &players[secondarydisplayplayer]) else if (splitscreen && mo->player == &players[secondarydisplayplayer])
@ -4178,6 +4178,7 @@ sector_t *P_MobjTouchingSectorSpecial(mobj_t *mo, INT32 section, INT32 number)
return NULL; return NULL;
} }
// TODO: 2.3: Delete
// Deprecated in favor of P_MobjTouchingSectorSpecial // Deprecated in favor of P_MobjTouchingSectorSpecial
// Kept for Lua backwards compatibility only // Kept for Lua backwards compatibility only
sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo) sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo)
@ -6229,6 +6230,7 @@ void P_SpawnSpecials(boolean fromnetsave)
sector->flags |= MSF_TRIGGERSPECIAL_TOUCH; sector->flags |= MSF_TRIGGERSPECIAL_TOUCH;
} }
// TODO: 2.3: Delete everything below
// Process deprecated binary sector specials // Process deprecated binary sector specials
if (udmf || !sector->special) if (udmf || !sector->special)
continue; continue;

View file

@ -106,8 +106,7 @@ void P_Thrust(mobj_t *mo, angle_t angle, fixed_t move)
mo->momy += FixedMul(move, FINESINE(angle)); mo->momy += FixedMul(move, FINESINE(angle));
} }
#if 0 void P_ThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move)
static inline void P_ThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move)
{ {
angle >>= ANGLETOFINESHIFT; angle >>= ANGLETOFINESHIFT;
@ -115,7 +114,7 @@ static inline void P_ThrustEvenIn2D(mobj_t *mo, angle_t angle, fixed_t move)
mo->momy += FixedMul(move, FINESINE(angle)); mo->momy += FixedMul(move, FINESINE(angle));
} }
static inline void P_VectorInstaThrust(fixed_t xa, fixed_t xb, fixed_t xc, fixed_t ya, fixed_t yb, fixed_t yc, void P_VectorInstaThrust(fixed_t xa, fixed_t xb, fixed_t xc, fixed_t ya, fixed_t yb, fixed_t yc,
fixed_t za, fixed_t zb, fixed_t zc, fixed_t momentum, mobj_t *mo) fixed_t za, fixed_t zb, fixed_t zc, fixed_t momentum, mobj_t *mo)
{ {
fixed_t a1, b1, c1, a2, b2, c2, i, j, k; fixed_t a1, b1, c1, a2, b2, c2, i, j, k;
@ -145,7 +144,6 @@ static inline void P_VectorInstaThrust(fixed_t xa, fixed_t xb, fixed_t xc, fixed
mo->momy = j; mo->momy = j;
mo->momz = k; mo->momz = k;
} }
#endif
// //
// P_InstaThrust // P_InstaThrust
@ -2775,6 +2773,7 @@ static void P_CheckBouncySectors(player_t *player)
if (!(rover->fofflags & FOF_EXISTS)) if (!(rover->fofflags & FOF_EXISTS))
continue; // FOFs should not be bouncy if they don't even "exist" continue; // FOFs should not be bouncy if they don't even "exist"
// TODO: 2.3: Delete
// Handle deprecated bouncy FOF sector type // Handle deprecated bouncy FOF sector type
if (!udmf && GETSECSPECIAL(rover->master->frontsector->special, 1) == 15) if (!udmf && GETSECSPECIAL(rover->master->frontsector->special, 1) == 15)
{ {
@ -4603,7 +4602,7 @@ void P_DoJump(player_t *player, boolean soundandstate, boolean allowflip)
} }
} }
static void P_DoSpinDashDust(player_t *player) void P_DoSpinDashDust(player_t *player)
{ {
UINT32 i; UINT32 i;
mobj_t *particle; mobj_t *particle;
@ -11193,7 +11192,7 @@ static void P_MinecartThink(player_t *player)
} }
// Handle Tails' fluff // Handle Tails' fluff
static void P_DoTailsOverlay(player_t *player, mobj_t *tails) void P_DoTailsOverlay(player_t *player, mobj_t *tails)
{ {
// init... // init...
boolean smilesonground = P_IsObjectOnGround(player->mo); boolean smilesonground = P_IsObjectOnGround(player->mo);
@ -11390,7 +11389,7 @@ static void P_DoTailsOverlay(player_t *player, mobj_t *tails)
tails->y = player->mo->y + P_ReturnThrustY(tails, tails->angle, FixedMul(backwards, tails->scale)); tails->y = player->mo->y + P_ReturnThrustY(tails, tails->angle, FixedMul(backwards, tails->scale));
tails->z = player->mo->z + zoffs; tails->z = player->mo->z + zoffs;
P_SetThingPosition(tails); P_SetThingPosition(tails);
if (player->mo->flags2 & MF2_SHADOW) if (player->mo->flags2 & MF2_SHADOW)
tails->flags2 |= MF2_SHADOW; tails->flags2 |= MF2_SHADOW;
else else
@ -11398,7 +11397,7 @@ static void P_DoTailsOverlay(player_t *player, mobj_t *tails)
} }
// Metal Sonic's jet fume // Metal Sonic's jet fume
static void P_DoMetalJetFume(player_t *player, mobj_t *fume) void P_DoMetalJetFume(player_t *player, mobj_t *fume)
{ {
static const UINT8 FUME_SKINCOLORS[] = static const UINT8 FUME_SKINCOLORS[] =
{ {
@ -11536,6 +11535,30 @@ static void P_DoMetalJetFume(player_t *player, mobj_t *fume)
} }
} }
// Handle Followmobj behavior
void P_DoFollowMobj(player_t *player, mobj_t *followmobj)
{
if (LUA_HookFollowMobj(player, followmobj) || P_MobjWasRemoved(followmobj))
{;}
else
{
switch (followmobj->type)
{
case MT_TAILSOVERLAY: // c:
P_DoTailsOverlay(player, followmobj);
break;
case MT_METALJETFUME:
P_DoMetalJetFume(player, followmobj);
break;
default:
var1 = 1;
var2 = 0;
A_CapeChase(followmobj);
break;
}
}
}
// //
// P_PlayerThink // P_PlayerThink
// //
@ -11606,7 +11629,7 @@ void P_PlayerThink(player_t *player)
P_SetTarget(&player->awayviewmobj, NULL); // remove awayviewmobj asap if invalid P_SetTarget(&player->awayviewmobj, NULL); // remove awayviewmobj asap if invalid
player->awayviewtics = 1; // reset to one, the below code will immediately set it to zero player->awayviewtics = 1; // reset to one, the below code will immediately set it to zero
} }
if (player->awayviewtics && player->awayviewtics != -1) if (player->awayviewtics && player->awayviewtics != -1)
{ {
player->awayviewtics--; player->awayviewtics--;
@ -12278,11 +12301,11 @@ void P_PlayerThink(player_t *player)
if (!(player->stronganim)) if (!(player->stronganim))
player->stronganim = player->panim; player->stronganim = player->panim;
else if (player->panim != player->stronganim) else if (player->panim != player->stronganim)
player->powers[pw_strong] = STR_NONE; player->powers[pw_strong] = STR_NONE;
} }
else if (player->stronganim) else if (player->stronganim)
player->stronganim = 0; player->stronganim = 0;
//pw_super acts as a timer now //pw_super acts as a timer now
if (player->powers[pw_super] if (player->powers[pw_super]
&& (player->mo->state < &states[S_PLAY_SUPER_TRANS1] && (player->mo->state < &states[S_PLAY_SUPER_TRANS1]
@ -12389,7 +12412,7 @@ void P_PlayerThink(player_t *player)
if (player->jumpfactor < FixedMul(skins[player->skin].jumpfactor, 5*FRACUNIT/4)) // Boost jump height. if (player->jumpfactor < FixedMul(skins[player->skin].jumpfactor, 5*FRACUNIT/4)) // Boost jump height.
player->jumpfactor += FRACUNIT/300; player->jumpfactor += FRACUNIT/300;
if ((player->charflags & SF_MACHINE) && (!(player->powers[pw_strong] == STR_METAL))) if ((player->charflags & SF_MACHINE) && (!(player->powers[pw_strong] == STR_METAL)))
player->powers[pw_strong] = STR_METAL; player->powers[pw_strong] = STR_METAL;
} }
@ -13012,27 +13035,7 @@ void P_PlayerAfterThink(player_t *player)
} }
if (player->followmobj) if (player->followmobj)
{ P_DoFollowMobj(player, player->followmobj);
if (LUA_HookFollowMobj(player, player->followmobj) || P_MobjWasRemoved(player->followmobj))
{;}
else
{
switch (player->followmobj->type)
{
case MT_TAILSOVERLAY: // c:
P_DoTailsOverlay(player, player->followmobj);
break;
case MT_METALJETFUME:
P_DoMetalJetFume(player, player->followmobj);
break;
default:
var1 = 1;
var2 = 0;
A_CapeChase(player->followmobj);
break;
}
}
}
} }
P_DoPlayerHeadSigns(player); // Spawn Tag/CTF signs over player's head P_DoPlayerHeadSigns(player); // Spawn Tag/CTF signs over player's head

View file

@ -75,6 +75,6 @@ void R_SetupSkyDraw(void)
*/ */
void R_SetSkyScale(void) void R_SetSkyScale(void)
{ {
fixed_t difference = vid.fdupx-(vid.dupx<<FRACBITS); fixed_t difference = vid.fdup-(vid.dup<<FRACBITS);
skyscale = FixedDiv(fovtan, vid.fdupx+difference); skyscale = FixedDiv(fovtan, vid.fdup+difference);
} }

View file

@ -494,7 +494,7 @@ void SCR_CalculateFPS(void)
void SCR_DisplayTicRate(void) void SCR_DisplayTicRate(void)
{ {
INT32 ticcntcolor = 0; INT32 ticcntcolor = 0;
const INT32 h = vid.height-(8*vid.dupy); const INT32 h = vid.height-(8*vid.dup);
UINT32 cap = R_GetFramerateCap(); UINT32 cap = R_GetFramerateCap();
double fps = round(averageFPS); double fps = round(averageFPS);
@ -530,7 +530,7 @@ void SCR_DisplayTicRate(void)
width = V_StringWidth(drawnstr, V_NOSCALESTART); width = V_StringWidth(drawnstr, V_NOSCALESTART);
V_DrawString(vid.width - ((7 * 8 * vid.dupx) + V_StringWidth("FPS: ", V_NOSCALESTART)), h, V_DrawString(vid.width - ((7 * 8 * vid.dup) + V_StringWidth("FPS: ", V_NOSCALESTART)), h,
V_YELLOWMAP|V_NOSCALESTART|V_USERHUDTRANS, "FPS:"); V_YELLOWMAP|V_NOSCALESTART|V_USERHUDTRANS, "FPS:");
V_DrawString(vid.width - width, h, V_DrawString(vid.width - width, h,
ticcntcolor|V_NOSCALESTART|V_USERHUDTRANS, drawnstr); ticcntcolor|V_NOSCALESTART|V_USERHUDTRANS, drawnstr);
@ -589,7 +589,7 @@ void SCR_ClosedCaptions(void)
if (closedcaptions[i].b) if (closedcaptions[i].b)
{ {
y -= closedcaptions[i].b * vid.dupy; y -= closedcaptions[i].b * vid.dup;
if (renderisnewtic) if (renderisnewtic)
{ {
closedcaptions[i].b--; closedcaptions[i].b--;
@ -639,9 +639,9 @@ void SCR_DisplayMarathonInfo(void)
#define PRIMEV1 13 #define PRIMEV1 13
#define PRIMEV2 17 // I can't believe it! I'm on TV! #define PRIMEV2 17 // I can't believe it! I'm on TV!
antisplice[0] += (entertic - oldentertics)*PRIMEV2; antisplice[0] += (entertic - oldentertics)*PRIMEV2;
antisplice[0] %= PRIMEV1*((vid.width/vid.dupx)+1); antisplice[0] %= PRIMEV1*((vid.width/vid.dup)+1);
antisplice[1] += (entertic - oldentertics)*PRIMEV1; antisplice[1] += (entertic - oldentertics)*PRIMEV1;
antisplice[1] %= PRIMEV1*((vid.width/vid.dupx)+1); antisplice[1] %= PRIMEV1*((vid.width/vid.dup)+1);
str = va("%i:%02i:%02i.%02i", str = va("%i:%02i:%02i.%02i",
G_TicsToHours(marathontime), G_TicsToHours(marathontime),
G_TicsToMinutes(marathontime, false), G_TicsToMinutes(marathontime, false),

View file

@ -59,19 +59,19 @@ typedef struct viddef_s
} u; } u;
INT32 recalc; // if true, recalc vid-based stuff INT32 recalc; // if true, recalc vid-based stuff
UINT8 *direct; // linear frame buffer, or vga base mem. UINT8 *direct; // linear frame buffer, or vga base mem.
INT32 dupx, dupy; // scale 1, 2, 3 value for menus & overlays INT32 dup; // scale 1, 2, 3 value for menus & overlays
INT32/*fixed_t*/ fdupx, fdupy; // same as dupx, dupy, but exact value when aspect ratio isn't 320/200 INT32/*fixed_t*/ fdup; // same as dup, but exact value when aspect ratio isn't 320/200
INT32 bpp; // BYTES per pixel: 1 = 256color, 2 = highcolor INT32 bpp; // BYTES per pixel: 1 = 256color, 2 = highcolor
INT32 baseratio; // Used to get the correct value for lighting walls INT32 baseratio; // Used to get the correct value for lighting walls
// for Win32 version // for Win32 version
DNWH WndParent; // handle of the application's window DNWH WndParent; // handle of the application's window
UINT8 smalldupx, smalldupy; // factor for a little bit of scaling UINT8 smalldup; // factor for a little bit of scaling
UINT8 meddupx, meddupy; // factor for moderate, but not full, scaling UINT8 meddup; // factor for moderate, but not full, scaling
#ifdef HWRENDER #ifdef HWRENDER
INT32/*fixed_t*/ fsmalldupx, fsmalldupy; INT32/*fixed_t*/ fsmalldup;
INT32/*fixed_t*/ fmeddupx, fmeddupy; INT32/*fixed_t*/ fmeddup;
INT32 glstate; INT32 glstate;
#endif #endif
} viddef_t; } viddef_t;

View file

@ -513,10 +513,10 @@ static void ST_drawDebugInfo(void)
#define VFLAGS V_MONOSPACE|V_SNAPTOTOP|V_SNAPTORIGHT #define VFLAGS V_MONOSPACE|V_SNAPTOTOP|V_SNAPTORIGHT
if ((moviemode == MM_GIF && cv_gif_downscale.value) || vid.dupx == 1) if ((moviemode == MM_GIF && cv_gif_downscale.value) || vid.dup == 1)
{ {
textfunc = V_DrawRightAlignedString; textfunc = V_DrawRightAlignedString;
lowh = ((vid.height/vid.dupy) - 16); lowh = ((vid.height/vid.dup) - 16);
} }
else else
{ {

File diff suppressed because it is too large Load diff

View file

@ -36,7 +36,7 @@ cv_rsaturation, cv_ysaturation, cv_gsaturation, cv_csaturation, cv_bsaturation,
// Allocates buffer screens, call before R_Init. // Allocates buffer screens, call before R_Init.
void V_Init(void); void V_Init(void);
// Recalculates the viddef (dupx, dupy, etc.) according to the current screen resolution. // Recalculates the viddef (dup, fdup, etc.) according to the current screen resolution.
void V_Recalc(void); void V_Recalc(void);
// Color look-up table // Color look-up table

View file

@ -536,7 +536,7 @@ void Y_IntermissionDrawer(void)
if (animatetic && (tic_t)intertic >= animatetic) if (animatetic && (tic_t)intertic >= animatetic)
{ {
const INT32 scradjust = (vid.width/vid.dupx)>>3; // 40 for BASEVIDWIDTH const INT32 scradjust = (vid.width/vid.dup)>>3; // 40 for BASEVIDWIDTH
INT32 animatetimer = (intertic - animatetic); INT32 animatetimer = (intertic - animatetic);
if (animatetimer <= 16) if (animatetimer <= 16)
{ {
@ -687,7 +687,7 @@ void Y_IntermissionDrawer(void)
if (intertic > 1) if (intertic > 1)
{ {
if (stagefailed && data.spec.emeraldy < (vid.height/vid.dupy)+16) if (stagefailed && data.spec.emeraldy < (vid.height/vid.dup)+16)
{ {
emeraldx += intertic - 6; emeraldx += intertic - 6;
} }
@ -1163,7 +1163,7 @@ void Y_Ticker(void)
} }
else else
{ {
if (data.spec.emeraldy < (vid.height/vid.dupy)+16) if (data.spec.emeraldy < (vid.height/vid.dup)+16)
{ {
data.spec.emeraldy += (++data.spec.emeraldmomy); data.spec.emeraldy += (++data.spec.emeraldmomy);
} }