mirror of
https://github.com/jmarshall23/Hellfire.git
synced 2026-08-11 23:40:51 +02:00
Lots of feature upgrades.
This commit is contained in:
+46
@@ -126,6 +126,48 @@ BOOL drawhpflag;
|
|||||||
BOOL drawmanaflag;
|
BOOL drawmanaflag;
|
||||||
BOOL chrflag;
|
BOOL chrflag;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
extern BYTE gbHudAnimateActive;
|
||||||
|
extern BYTE gbHudHealthOrbTable[4][256];
|
||||||
|
extern BYTE gbHudManaOrbTable[4][256];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static void HudAnimateRect(int x, int y, int w, int h, BYTE table[4][256], int phase)
|
||||||
|
{
|
||||||
|
int row, col;
|
||||||
|
int wavePhase;
|
||||||
|
BYTE *p;
|
||||||
|
|
||||||
|
if (!gbHudAnimateActive || gpBuffer == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (x < 0) {
|
||||||
|
w += x;
|
||||||
|
x = 0;
|
||||||
|
}
|
||||||
|
if (y < 0) {
|
||||||
|
h += y;
|
||||||
|
y = 0;
|
||||||
|
}
|
||||||
|
if (x + w > BUFFERX)
|
||||||
|
w = BUFFERX - x;
|
||||||
|
if (y + h > BUFFERY)
|
||||||
|
h = BUFFERY - y;
|
||||||
|
if (w <= 0 || h <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (row = 0; row < h; row++) {
|
||||||
|
p = gpBuffer + nBuffWTbl[y + row] + x;
|
||||||
|
for (col = 0; col < w; col++) {
|
||||||
|
wavePhase = (phase + ((row + (col >> 1)) / 10)) & 3;
|
||||||
|
p[col] = table[wavePhase][p[col]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SI_INVALID,
|
SI_INVALID,
|
||||||
@@ -1074,6 +1116,7 @@ void DrawHealthTop()
|
|||||||
app_assert(gpBuffer);
|
app_assert(gpBuffer);
|
||||||
TransBuffCopy(pLifeBuff, 88, 277, gpBuffer, 383405, dy);
|
TransBuffCopy(pLifeBuff, 88, 277, gpBuffer, 383405, dy);
|
||||||
if (dy != 13) TransBuffCopy(pBtmBuff, 640, (dy * 640) + 2029, gpBuffer, (dy * 768) + 383405, 13 - dy);
|
if (dy != 13) TransBuffCopy(pBtmBuff, 640, (dy * 640) + 2029, gpBuffer, (dy * 768) + 383405, 13 - dy);
|
||||||
|
HudAnimateRect(160, 499, 88, 13, gbHudHealthOrbTable, GetTickCount() / 120);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------**
|
/*-----------------------------------------------------------------------**
|
||||||
@@ -1094,6 +1137,7 @@ void DrawHealthBar()
|
|||||||
if (dv > 69) dv = 69;
|
if (dv > 69) dv = 69;
|
||||||
if (dv != 69) BuffCopy(pLifeBuff, 16, 85-dv, 160, 512);
|
if (dv != 69) BuffCopy(pLifeBuff, 16, 85-dv, 160, 512);
|
||||||
if (dv != 0) CopyCtrlPan(96, 85-dv, 88, dv, 160, 581-dv);
|
if (dv != 0) CopyCtrlPan(96, 85-dv, 88, dv, 160, 581-dv);
|
||||||
|
HudAnimateRect(160, 512, 88, 75, gbHudHealthOrbTable, GetTickCount() / 120);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------**
|
/*-----------------------------------------------------------------------**
|
||||||
@@ -1110,6 +1154,7 @@ void DrawManaTop()
|
|||||||
app_assert(gpBuffer);
|
app_assert(gpBuffer);
|
||||||
TransBuffCopy(pManaBuff, 88, 277, gpBuffer, 383771, dy);
|
TransBuffCopy(pManaBuff, 88, 277, gpBuffer, 383771, dy);
|
||||||
if (dy != 13) TransBuffCopy(pBtmBuff, 640, (dy * 640) + 2395, gpBuffer, (dy * 768) + 383771, 13 - dy);
|
if (dy != 13) TransBuffCopy(pBtmBuff, 640, (dy * 640) + 2395, gpBuffer, (dy * 768) + 383771, 13 - dy);
|
||||||
|
HudAnimateRect(528, 499, 88, 13, gbHudManaOrbTable, GetTickCount() / 135);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------**
|
/*-----------------------------------------------------------------------**
|
||||||
@@ -1159,6 +1204,7 @@ void DrawManaBar()
|
|||||||
if (dv > 69) dv = 69;
|
if (dv > 69) dv = 69;
|
||||||
if (dv != 69) BuffCopy(pManaBuff, 16, 85-dv, 528, 512);
|
if (dv != 69) BuffCopy(pManaBuff, 16, 85-dv, 528, 512);
|
||||||
if (dv != 0) CopyCtrlPan(464, 85-dv, 88, dv, 528, 581-dv);
|
if (dv != 0) CopyCtrlPan(464, 85-dv, 88, dv, 528, 581-dv);
|
||||||
|
HudAnimateRect(528, 512, 88, 75, gbHudManaOrbTable, GetTickCount() / 135);
|
||||||
|
|
||||||
DrawSpellIcon();
|
DrawSpellIcon();
|
||||||
}
|
}
|
||||||
|
|||||||
+42
-2
@@ -144,6 +144,7 @@ BOOL gbRunGame;
|
|||||||
BOOL gbRunGameResult;
|
BOOL gbRunGameResult;
|
||||||
BOOL gbProcessPlayers;
|
BOOL gbProcessPlayers;
|
||||||
BOOL gbGameLoopStartup;
|
BOOL gbGameLoopStartup;
|
||||||
|
extern int gnRenderFrameInterp;
|
||||||
|
|
||||||
bool gbTheo = false;
|
bool gbTheo = false;
|
||||||
bool gbCowsuit = false;
|
bool gbCowsuit = false;
|
||||||
@@ -167,6 +168,7 @@ int glMid3Seed[NUMLEVELS+1]; //JKE 7/30 adds new levels
|
|||||||
**-----------------------------------------------------------------------*/
|
**-----------------------------------------------------------------------*/
|
||||||
#define TIMEOUT_CURSOR WATCH_CURS
|
#define TIMEOUT_CURSOR WATCH_CURS
|
||||||
static int sgnTimeoutCurs = NO_CURSOR;
|
static int sgnTimeoutCurs = NO_CURSOR;
|
||||||
|
static DWORD sgdwLastRenderFrame;
|
||||||
|
|
||||||
#define LMOUSE_DOWN 1
|
#define LMOUSE_DOWN 1
|
||||||
#define RMOUSE_DOWN 2
|
#define RMOUSE_DOWN 2
|
||||||
@@ -184,6 +186,8 @@ BYTE sgbMouseDown = 0;
|
|||||||
static void alloc_plr();
|
static void alloc_plr();
|
||||||
static void DoTimedEvents();
|
static void DoTimedEvents();
|
||||||
static void game_loop(BOOL bStartup);
|
static void game_loop(BOOL bStartup);
|
||||||
|
static void DrawInterpolatedFrame();
|
||||||
|
static BOOL TryDrawInterpolatedFrame();
|
||||||
static void plr_encrypt(BOOL bEncrypt);
|
static void plr_encrypt(BOOL bEncrypt);
|
||||||
void InitializeHashSource();
|
void InitializeHashSource();
|
||||||
void Decrypt(LPDWORD data, DWORD bytes, DWORD key);
|
void Decrypt(LPDWORD data, DWORD bytes, DWORD key);
|
||||||
@@ -205,6 +209,7 @@ static LRESULT CALLBACK GM_Game(HWND, UINT, WPARAM, LPARAM);
|
|||||||
void TrackInit(BOOL bMouseDown);
|
void TrackInit(BOOL bMouseDown);
|
||||||
void TrackMouse();
|
void TrackMouse();
|
||||||
void run_delta_info();
|
void run_delta_info();
|
||||||
|
int nthread_get_render_interp();
|
||||||
void toggle_frame_counter();
|
void toggle_frame_counter();
|
||||||
WNDPROC my_SetWindowProc(WNDPROC wndProc);
|
WNDPROC my_SetWindowProc(WNDPROC wndProc);
|
||||||
void plrmsg_update();
|
void plrmsg_update();
|
||||||
@@ -632,10 +637,14 @@ static void run_game_loop(UINT uMsg) {
|
|||||||
BOOL bRun = gbRunGame && nthread_run_gameloop(FALSE);
|
BOOL bRun = gbRunGame && nthread_run_gameloop(FALSE);
|
||||||
//if (! bRun) plr_encrypt(TRUE);
|
//if (! bRun) plr_encrypt(TRUE);
|
||||||
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);
|
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);
|
||||||
if (! bRun) continue;
|
if (! bRun) {
|
||||||
|
TryDrawInterpolatedFrame();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (! nthread_run_gameloop(FALSE)) {
|
else if (! nthread_run_gameloop(FALSE)) {
|
||||||
// not enough time has elapsed since last gameloop
|
// not enough time has elapsed since last gameloop
|
||||||
|
TryDrawInterpolatedFrame();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// pjw.patch2.end
|
// pjw.patch2.end
|
||||||
@@ -645,7 +654,7 @@ static void run_game_loop(UINT uMsg) {
|
|||||||
NetReceivePackets();
|
NetReceivePackets();
|
||||||
game_loop(gbGameLoopStartup);
|
game_loop(gbGameLoopStartup);
|
||||||
gbGameLoopStartup = FALSE;
|
gbGameLoopStartup = FALSE;
|
||||||
DrawAndBlit();
|
DrawInterpolatedFrame();
|
||||||
//plr_encrypt(TRUE);
|
//plr_encrypt(TRUE);
|
||||||
}
|
}
|
||||||
//plr_encrypt(FALSE);
|
//plr_encrypt(FALSE);
|
||||||
@@ -678,6 +687,37 @@ static void run_game_loop(UINT uMsg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//******************************************************************
|
||||||
|
//******************************************************************
|
||||||
|
static void DrawInterpolatedFrame()
|
||||||
|
{
|
||||||
|
sgdwLastRenderFrame = GetTickCount();
|
||||||
|
if (PauseMode || (gbMaxPlayers == 1 && gmenu_is_on()))
|
||||||
|
gnRenderFrameInterp = 0;
|
||||||
|
else
|
||||||
|
gnRenderFrameInterp = nthread_get_render_interp();
|
||||||
|
DrawAndBlit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//******************************************************************
|
||||||
|
//******************************************************************
|
||||||
|
static BOOL TryDrawInterpolatedFrame()
|
||||||
|
{
|
||||||
|
DWORD dwNow;
|
||||||
|
|
||||||
|
dwNow = GetTickCount();
|
||||||
|
if (dwNow - sgdwLastRenderFrame < 1000 / RENDER_FRAMES_PER_SECOND)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (force_redraw == NODRAW)
|
||||||
|
force_redraw = VIEWDRAW;
|
||||||
|
|
||||||
|
DrawInterpolatedFrame();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------**
|
/*-----------------------------------------------------------------------**
|
||||||
// return FALSE to quit game
|
// return FALSE to quit game
|
||||||
// return TRUE to continue game
|
// return TRUE to continue game
|
||||||
|
|||||||
@@ -125,8 +125,9 @@ void trace_fcn(const char * pszFcn);
|
|||||||
**-----------------------------------------------------------------------*/
|
**-----------------------------------------------------------------------*/
|
||||||
#define MAX_PLRS 4
|
#define MAX_PLRS 4
|
||||||
|
|
||||||
// frame rate
|
// logic and render rates
|
||||||
#define GAME_FRAMES_PER_SECOND 20
|
#define GAME_FRAMES_PER_SECOND 20
|
||||||
|
#define RENDER_FRAMES_PER_SECOND 27
|
||||||
|
|
||||||
// Our messages
|
// Our messages
|
||||||
#define WM_DIABNEXTLVL WM_USER+2
|
#define WM_DIABNEXTLVL WM_USER+2
|
||||||
|
|||||||
+216
-47
@@ -1599,6 +1599,109 @@ static int DRLG_PlaceMiniSet(const byte miniset[], int tmin, int tmax, int cx, i
|
|||||||
return(3);
|
return(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BOOL L5MiniSetFits(const byte miniset[], int sx, int sy)
|
||||||
|
{
|
||||||
|
int sw, sh;
|
||||||
|
int xx, yy;
|
||||||
|
int ii;
|
||||||
|
|
||||||
|
sw = miniset[0];
|
||||||
|
sh = miniset[1];
|
||||||
|
|
||||||
|
if (sx < 0 || sy < 0 || sx + sw >= MDMAXX || sy + sh >= MDMAXY)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
ii = 2;
|
||||||
|
for (yy = 0; yy < sh; yy++) {
|
||||||
|
for (xx = 0; xx < sw; xx++) {
|
||||||
|
if ((miniset[ii] != 0) && (dungeon[sx + xx][sy + yy] != miniset[ii]))
|
||||||
|
return FALSE;
|
||||||
|
if (dflags[sx + xx][sy + yy] != 0)
|
||||||
|
return FALSE;
|
||||||
|
ii++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static void L5PlaceMiniSetAt(const byte miniset[], int sx, int sy)
|
||||||
|
{
|
||||||
|
int sw, sh;
|
||||||
|
int xx, yy;
|
||||||
|
int ii;
|
||||||
|
|
||||||
|
sw = miniset[0];
|
||||||
|
sh = miniset[1];
|
||||||
|
ii = (sw * sh) + 2;
|
||||||
|
|
||||||
|
for (yy = 0; yy < sh; yy++) {
|
||||||
|
for (xx = 0; xx < sw; xx++) {
|
||||||
|
if (miniset[ii] != 0)
|
||||||
|
dungeon[sx + xx][sy + yy] = miniset[ii];
|
||||||
|
ii++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BOOL L5TryPlaceLamp(int sx, int sy)
|
||||||
|
{
|
||||||
|
if (!L5MiniSetFits(LAMPS, sx, sy))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
L5PlaceMiniSetAt(LAMPS, sx, sy);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int L5PlaceLampNear(int cx, int cy, int max)
|
||||||
|
{
|
||||||
|
static const int offsets[][2] = {
|
||||||
|
{ -3, -2 }, { 2, -2 }, { -3, 2 }, { 2, 2 },
|
||||||
|
{ -4, 0 }, { 3, 0 }, { 0, -4 }, { 0, 3 },
|
||||||
|
{ -5, -1 }, { 4, -1 }, { -1, 4 }, { -1, -5 },
|
||||||
|
};
|
||||||
|
int i, n, start;
|
||||||
|
int placed;
|
||||||
|
|
||||||
|
placed = 0;
|
||||||
|
n = sizeof(offsets) / sizeof(offsets[0]);
|
||||||
|
start = random(0, n);
|
||||||
|
|
||||||
|
for (i = 0; i < n && placed < max; i++) {
|
||||||
|
if (L5TryPlaceLamp(cx + offsets[(start + i) % n][0], cy + offsets[(start + i) % n][1]))
|
||||||
|
placed++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return placed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static void L5PlaceLevel1Lamps()
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
if (currlevel != 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (j = 1; j < MDMAXY - 1; j++) {
|
||||||
|
for (i = 1; i < MDMAXX - 1; i++) {
|
||||||
|
if (dungeon[i][j] == 64)
|
||||||
|
L5PlaceLampNear(i, j, 2);
|
||||||
|
if (dungeon[i][j] == 59)
|
||||||
|
L5PlaceLampNear(i, j, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------**
|
/*-----------------------------------------------------------------------**
|
||||||
**-----------------------------------------------------------------------*/
|
**-----------------------------------------------------------------------*/
|
||||||
/*
|
/*
|
||||||
@@ -1972,12 +2075,54 @@ void LoadPreL1Dungeon(char sFileName[], int vx, int vy)
|
|||||||
byte L5dungeon[L5DX][L5DY];
|
byte L5dungeon[L5DX][L5DY];
|
||||||
byte L5ConvTbl[16] = { 22, 13, 1, 13, 2, 13, 13, 13, 4, 13, 1, 13, 2, 13, 16, 13 };
|
byte L5ConvTbl[16] = { 22, 13, 1, 13, 2, 13, 13, 13, 4, 13, 1, 13, 2, 13, 16, 13 };
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int minArea;
|
||||||
|
int roomMin;
|
||||||
|
int roomMax;
|
||||||
|
int wallChance;
|
||||||
|
int archWallChance;
|
||||||
|
int grateWallChance;
|
||||||
|
int archDoorChance;
|
||||||
|
int loopChance;
|
||||||
|
int lampMin;
|
||||||
|
int lampMax;
|
||||||
|
} L5CathedralProfile;
|
||||||
|
|
||||||
|
static L5CathedralProfile L5Profile;
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*
|
/*------------------------------------------------------------------------*
|
||||||
** Global variables
|
** Global variables
|
||||||
**------------------------------------------------------------------------*/
|
**------------------------------------------------------------------------*/
|
||||||
static BOOL HR1, HR2, HR3;
|
static BOOL HR1, HR2, HR3;
|
||||||
static BOOL VR1, VR2, VR3;
|
static BOOL VR1, VR2, VR3;
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*
|
||||||
|
**------------------------------------------------------------------------*/
|
||||||
|
static const L5CathedralProfile *GetL5CathedralProfile()
|
||||||
|
{
|
||||||
|
static const L5CathedralProfile profiles[4] = {
|
||||||
|
{ 533, 2, 6, 92, 20, 10, 14, 0, 4, 7 },
|
||||||
|
{ 693, 2, 7, 96, 23, 13, 16, 3, 6, 10 },
|
||||||
|
{ 761, 4, 7, 100, 25, 16, 18, 5, 4, 8 },
|
||||||
|
{ 805, 4, 8, 100, 28, 20, 20, 7, 3, 6 },
|
||||||
|
};
|
||||||
|
static const L5CathedralProfile oldProfile = {
|
||||||
|
761, L5ROOM_MIN, L5ROOM_MAX, 100, 25, 25, 16, 0, 5, 10
|
||||||
|
};
|
||||||
|
|
||||||
|
if (currlevel >= 1 && currlevel <= 4)
|
||||||
|
return &profiles[currlevel - 1];
|
||||||
|
|
||||||
|
return &oldProfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*
|
||||||
|
**------------------------------------------------------------------------*/
|
||||||
|
static void InitL5CathedralProfile()
|
||||||
|
{
|
||||||
|
L5Profile = *GetL5CathedralProfile();
|
||||||
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*
|
/*------------------------------------------------------------------------*
|
||||||
**------------------------------------------------------------------------*/
|
**------------------------------------------------------------------------*/
|
||||||
static void InitL5Dungeon()
|
static void InitL5Dungeon()
|
||||||
@@ -2060,8 +2205,8 @@ static void L5roomGen(int x, int y, int w, int h, int dir)
|
|||||||
// left room
|
// left room
|
||||||
num = 0;
|
num = 0;
|
||||||
do {
|
do {
|
||||||
width = ((random(0, L5ROOM_MAX - L5ROOM_MIN + 1) + L5ROOM_MIN) >> 1) << 1;
|
width = ((random(0, L5Profile.roomMax - L5Profile.roomMin + 1) + L5Profile.roomMin) >> 1) << 1;
|
||||||
height = ((random(0, L5ROOM_MAX - L5ROOM_MIN + 1) + L5ROOM_MIN) >> 1) << 1;
|
height = ((random(0, L5Profile.roomMax - L5Profile.roomMin + 1) + L5Profile.roomMin) >> 1) << 1;
|
||||||
ry = y + (h / 2) - (height / 2);
|
ry = y + (h / 2) - (height / 2);
|
||||||
rx = x - width;
|
rx = x - width;
|
||||||
cx1 = rx - 1;
|
cx1 = rx - 1;
|
||||||
@@ -2089,8 +2234,8 @@ static void L5roomGen(int x, int y, int w, int h, int dir)
|
|||||||
// top room
|
// top room
|
||||||
num = 0;
|
num = 0;
|
||||||
do {
|
do {
|
||||||
width = ((random(0, L5ROOM_MAX - L5ROOM_MIN + 1) + L5ROOM_MIN) >> 1) << 1;
|
width = ((random(0, L5Profile.roomMax - L5Profile.roomMin + 1) + L5Profile.roomMin) >> 1) << 1;
|
||||||
height = ((random(0, L5ROOM_MAX - L5ROOM_MIN + 1) + L5ROOM_MIN) >> 1) << 1;
|
height = ((random(0, L5Profile.roomMax - L5Profile.roomMin + 1) + L5Profile.roomMin) >> 1) << 1;
|
||||||
rx = x + (w / 2) - (width / 2);
|
rx = x + (w / 2) - (width / 2);
|
||||||
ry = y - height;
|
ry = y - height;
|
||||||
cx1 = rx - 1;
|
cx1 = rx - 1;
|
||||||
@@ -2287,26 +2432,23 @@ static int L5VWallOk(int i, int j)
|
|||||||
static void L5HorizWall(int i, int j, char p, int dx)
|
static void L5HorizWall(int i, int j, char p, int dx)
|
||||||
{
|
{
|
||||||
int xx;
|
int xx;
|
||||||
|
int rv;
|
||||||
char wt, dt;
|
char wt, dt;
|
||||||
|
|
||||||
switch (random(0, 4)) {
|
rv = random(0, 100);
|
||||||
case 0:
|
if (rv < L5Profile.archWallChance) {
|
||||||
case 1:
|
|
||||||
wt = 2; // Normal solid wall
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
wt = 12; // Arch wall
|
wt = 12; // Arch wall
|
||||||
if (p == 2) p = 12;
|
if (p == 2) p = 12;
|
||||||
if (p == 4) p = 10;
|
if (p == 4) p = 10;
|
||||||
break;
|
} else if (rv < L5Profile.archWallChance + L5Profile.grateWallChance) {
|
||||||
case 3:
|
|
||||||
wt = 36; // Grate wall
|
wt = 36; // Grate wall
|
||||||
if (p == 2) p = 36;
|
if (p == 2) p = 36;
|
||||||
if (p == 4) p = 27;
|
if (p == 4) p = 27;
|
||||||
break;
|
} else {
|
||||||
|
wt = 2; // Normal solid wall
|
||||||
}
|
}
|
||||||
|
|
||||||
if (random(0, 6) == 5) dt = 12; // Arch
|
if (random(0, 100) < L5Profile.archDoorChance) dt = 12; // Arch
|
||||||
else dt = 26; // Door
|
else dt = 26; // Door
|
||||||
|
|
||||||
if (wt == 12) dt = 12; // If arch wall, force arch door
|
if (wt == 12) dt = 12; // If arch wall, force arch door
|
||||||
@@ -2326,26 +2468,23 @@ static void L5HorizWall(int i, int j, char p, int dx)
|
|||||||
static void L5VertWall(int i, int j, char p, int dy)
|
static void L5VertWall(int i, int j, char p, int dy)
|
||||||
{
|
{
|
||||||
int yy;
|
int yy;
|
||||||
|
int rv;
|
||||||
char wt, dt;
|
char wt, dt;
|
||||||
|
|
||||||
switch (random(0, 4)) {
|
rv = random(0, 100);
|
||||||
case 0:
|
if (rv < L5Profile.archWallChance) {
|
||||||
case 1:
|
|
||||||
wt = 1; // Normal solid wall
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
wt = 11; // Arch wall
|
wt = 11; // Arch wall
|
||||||
if (p == 1) p = 11;
|
if (p == 1) p = 11;
|
||||||
if (p == 4) p = 14;
|
if (p == 4) p = 14;
|
||||||
break;
|
} else if (rv < L5Profile.archWallChance + L5Profile.grateWallChance) {
|
||||||
case 3:
|
|
||||||
wt = 35; // Grate wall
|
wt = 35; // Grate wall
|
||||||
if (p == 1) p = 35;
|
if (p == 1) p = 35;
|
||||||
if (p == 4) p = 37;
|
if (p == 4) p = 37;
|
||||||
break;
|
} else {
|
||||||
|
wt = 1; // Normal solid wall
|
||||||
}
|
}
|
||||||
|
|
||||||
if (random(0, 6) == 5) dt = 11; // Arch
|
if (random(0, 100) < L5Profile.archDoorChance) dt = 11; // Arch
|
||||||
else dt = 25; // Door
|
else dt = 25; // Door
|
||||||
|
|
||||||
if (wt == 11) dt = 11; // If arch wall, force arch door
|
if (wt == 11) dt = 11; // If arch wall, force arch door
|
||||||
@@ -2362,7 +2501,6 @@ static void L5VertWall(int i, int j, char p, int dy)
|
|||||||
|
|
||||||
/*-----------------------------------------------------------------------**
|
/*-----------------------------------------------------------------------**
|
||||||
**-----------------------------------------------------------------------*/
|
**-----------------------------------------------------------------------*/
|
||||||
#define WALLRND 100
|
|
||||||
static void L5AddWall()
|
static void L5AddWall()
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
@@ -2371,27 +2509,27 @@ static void L5AddWall()
|
|||||||
for (j = 0; j < MDMAXY; j++) {
|
for (j = 0; j < MDMAXY; j++) {
|
||||||
for (i = 0; i < MDMAXX; i++) {
|
for (i = 0; i < MDMAXX; i++) {
|
||||||
if (dflags[i][j] == 0) {
|
if (dflags[i][j] == 0) {
|
||||||
if ((dungeon[i][j] == 3) && (random(0, 100) < WALLRND)) {
|
if ((dungeon[i][j] == 3) && (random(0, 100) < L5Profile.wallChance)) {
|
||||||
x = L5HWallOk(i, j);
|
x = L5HWallOk(i, j);
|
||||||
if (x != -1) L5HorizWall(i, j, 2, x);
|
if (x != -1) L5HorizWall(i, j, 2, x);
|
||||||
}
|
}
|
||||||
if ((dungeon[i][j] == 3) && (random(0, 100) < WALLRND)) {
|
if ((dungeon[i][j] == 3) && (random(0, 100) < L5Profile.wallChance)) {
|
||||||
y = L5VWallOk(i, j);
|
y = L5VWallOk(i, j);
|
||||||
if (y != -1) L5VertWall(i, j, 1, y);
|
if (y != -1) L5VertWall(i, j, 1, y);
|
||||||
}
|
}
|
||||||
if ((dungeon[i][j] == 6) && (random(0, 100) < WALLRND)) {
|
if ((dungeon[i][j] == 6) && (random(0, 100) < L5Profile.wallChance)) {
|
||||||
x = L5HWallOk(i, j);
|
x = L5HWallOk(i, j);
|
||||||
if (x != -1) L5HorizWall(i, j, 4, x);
|
if (x != -1) L5HorizWall(i, j, 4, x);
|
||||||
}
|
}
|
||||||
if ((dungeon[i][j] == 7) && (random(0, 100) < WALLRND)) {
|
if ((dungeon[i][j] == 7) && (random(0, 100) < L5Profile.wallChance)) {
|
||||||
y = L5VWallOk(i, j);
|
y = L5VWallOk(i, j);
|
||||||
if (y != -1) L5VertWall(i, j, 4, y);
|
if (y != -1) L5VertWall(i, j, 4, y);
|
||||||
}
|
}
|
||||||
if ((dungeon[i][j] == 2) && (random(0, 100) < WALLRND)) {
|
if ((dungeon[i][j] == 2) && (random(0, 100) < L5Profile.wallChance)) {
|
||||||
x = L5HWallOk(i, j);
|
x = L5HWallOk(i, j);
|
||||||
if (x != -1) L5HorizWall(i, j, 2, x);
|
if (x != -1) L5HorizWall(i, j, 2, x);
|
||||||
}
|
}
|
||||||
if ((dungeon[i][j] == 1) && (random(0, 100) < WALLRND)) {
|
if ((dungeon[i][j] == 1) && (random(0, 100) < L5Profile.wallChance)) {
|
||||||
y = L5VWallOk(i, j);
|
y = L5VWallOk(i, j);
|
||||||
if (y != -1) L5VertWall(i, j, 1, y);
|
if (y != -1) L5VertWall(i, j, 1, y);
|
||||||
}
|
}
|
||||||
@@ -2400,6 +2538,41 @@ static void L5AddWall()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*
|
||||||
|
**------------------------------------------------------------------------*/
|
||||||
|
static BOOL L5OpenFloor(int x, int y)
|
||||||
|
{
|
||||||
|
return dungeon[x][y] == D_FLOOR && dflags[x][y] == NODOOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*
|
||||||
|
**------------------------------------------------------------------------*/
|
||||||
|
static void L5AddLoops()
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
if (L5Profile.loopChance <= 0) return;
|
||||||
|
|
||||||
|
for (j = 2; j < MDMAXY - 2; j++) {
|
||||||
|
for (i = 2; i < MDMAXX - 2; i++) {
|
||||||
|
if (dflags[i][j] != NODOOR) continue;
|
||||||
|
if (random(0, 100) >= L5Profile.loopChance) continue;
|
||||||
|
|
||||||
|
if (dungeon[i][j] == D_VWALL && L5OpenFloor(i - 1, j) && L5OpenFloor(i + 1, j)) {
|
||||||
|
if (random(0, 100) < L5Profile.archDoorChance)
|
||||||
|
dungeon[i][j] = D_AVW;
|
||||||
|
else
|
||||||
|
dflags[i][j] |= VDOOR;
|
||||||
|
} else if (dungeon[i][j] == D_HWALL && L5OpenFloor(i, j - 1) && L5OpenFloor(i, j + 1)) {
|
||||||
|
if (random(0, 100) < L5Profile.archDoorChance)
|
||||||
|
dungeon[i][j] = D_AHW;
|
||||||
|
else
|
||||||
|
dflags[i][j] |= HDOOR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------**
|
/*-----------------------------------------------------------------------**
|
||||||
**-----------------------------------------------------------------------*/
|
**-----------------------------------------------------------------------*/
|
||||||
static void DRLG_L5GChamber(int sx, int sy, int topflag, int bottomflag, int leftflag, int rightflag)
|
static void DRLG_L5GChamber(int sx, int sy, int topflag, int bottomflag, int leftflag, int rightflag)
|
||||||
@@ -3252,6 +3425,7 @@ static void NormalGrate(int chance)
|
|||||||
DRLG_L5PlaceRndSet(FLOOR3, chance);
|
DRLG_L5PlaceRndSet(FLOOR3, chance);
|
||||||
DRLG_L5PlaceRndSet(FLOOR4, chance);
|
DRLG_L5PlaceRndSet(FLOOR4, chance);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*
|
/*-----------------------------------------------------------------------*
|
||||||
**-----------------------------------------------------------------------*/
|
**-----------------------------------------------------------------------*/
|
||||||
static void DRLG_L5(int entry)
|
static void DRLG_L5(int entry)
|
||||||
@@ -3262,21 +3436,9 @@ static void DRLG_L5(int entry)
|
|||||||
int xx, yy;
|
int xx, yy;
|
||||||
|
|
||||||
doneflag = FALSE;
|
doneflag = FALSE;
|
||||||
|
InitL5CathedralProfile();
|
||||||
|
minarea = L5Profile.minArea;
|
||||||
|
|
||||||
switch (currlevel) {
|
|
||||||
case 1:
|
|
||||||
minarea = 533; //(L5DUNX*L5DUNY)/3;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
minarea = 693; //((L5DUNX*L5DUNY)/3) + ((L5DUNX*L5DUNY)/10);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
case 4:
|
|
||||||
minarea = 761; //((L5DUNX*L5DUNY)/3) + ((L5DUNX*L5DUNY)/7);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
minarea = 761; // Crypt levels
|
|
||||||
}
|
|
||||||
while (!doneflag) {
|
while (!doneflag) {
|
||||||
DRLG_InitTrans();
|
DRLG_InitTrans();
|
||||||
do {
|
do {
|
||||||
@@ -3292,6 +3454,7 @@ static void DRLG_L5(int entry)
|
|||||||
L5tileFix();
|
L5tileFix();
|
||||||
|
|
||||||
L5AddWall();
|
L5AddWall();
|
||||||
|
if (currlevel < CRYPTSTART) L5AddLoops();
|
||||||
L5ClearFlags();
|
L5ClearFlags();
|
||||||
DRLG_L5FloodTVal();
|
DRLG_L5FloodTVal();
|
||||||
|
|
||||||
@@ -3435,7 +3598,11 @@ static void DRLG_L5(int entry)
|
|||||||
|
|
||||||
// Random subs
|
// Random subs
|
||||||
if (currlevel < CRYPTSTART) // These are to turn off stuff in the crypt JKE
|
if (currlevel < CRYPTSTART) // These are to turn off stuff in the crypt JKE
|
||||||
|
{
|
||||||
|
// Keep Cathedral levels on the L1-safe substitution table. The broken
|
||||||
|
// wall, grate, statue, and rubble minisets below belong to the Crypt art.
|
||||||
DRLG_L5Subs();
|
DRLG_L5Subs();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -3499,8 +3666,10 @@ static void DRLG_L5(int entry)
|
|||||||
// DRLG_L5Shadows();
|
// DRLG_L5Shadows();
|
||||||
|
|
||||||
// Create mini set pieces
|
// Create mini set pieces
|
||||||
if (currlevel < CRYPTSTART)
|
if (currlevel < CRYPTSTART) {
|
||||||
DRLG_PlaceMiniSet(LAMPS, 5, 10, 0, 0, 0, -1, LVL_NODIR);
|
L5PlaceLevel1Lamps();
|
||||||
|
DRLG_PlaceMiniSet(LAMPS, L5Profile.lampMin, L5Profile.lampMax, 0, 0, 0, -1, LVL_NODIR);
|
||||||
|
}
|
||||||
|
|
||||||
// Floor subs
|
// Floor subs
|
||||||
if (currlevel < CRYPTSTART)
|
if (currlevel < CRYPTSTART)
|
||||||
|
|||||||
+547
@@ -25,6 +25,14 @@
|
|||||||
//******************************************************************
|
//******************************************************************
|
||||||
void ErrorDlg(int nDlgId,DWORD dwErr,const char * pszFile,int nLine);
|
void ErrorDlg(int nDlgId,DWORD dwErr,const char * pszFile,int nLine);
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
extern BYTE gbLevelTileEnhanceActive;
|
||||||
|
extern BYTE gbLevelUnitContrastTable[];
|
||||||
|
extern BYTE gbLevelUnitLumaTable[];
|
||||||
|
extern BYTE gbLevelUnitSharpenLightTable[];
|
||||||
|
extern BYTE gbLevelUnitAoTable[];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//******************************************************************
|
//******************************************************************
|
||||||
// Registration info
|
// Registration info
|
||||||
@@ -3195,6 +3203,359 @@ NextBlock:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
static BYTE LevelUnitPixel(const BYTE *row, int x, int width, BYTE *pLightTable)
|
||||||
|
{
|
||||||
|
BYTE pixel, src;
|
||||||
|
int left, right, curr, nearAvg, darkest;
|
||||||
|
|
||||||
|
src = row[x];
|
||||||
|
if (src == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
pixel = gbLevelUnitContrastTable[src];
|
||||||
|
if (pLightTable != NULL)
|
||||||
|
pixel = pLightTable[pixel];
|
||||||
|
|
||||||
|
if (x <= 0 || x + 1 >= width)
|
||||||
|
return pixel;
|
||||||
|
|
||||||
|
left = gbLevelUnitLumaTable[row[x - 1]];
|
||||||
|
right = gbLevelUnitLumaTable[row[x + 1]];
|
||||||
|
curr = gbLevelUnitLumaTable[src];
|
||||||
|
nearAvg = (left + right) >> 1;
|
||||||
|
darkest = (left < right) ? left : right;
|
||||||
|
|
||||||
|
if (nearAvg - curr > 10)
|
||||||
|
return gbLevelUnitAoTable[pixel];
|
||||||
|
if (curr - darkest > 16 && curr < 230)
|
||||||
|
return gbLevelUnitAoTable[pixel];
|
||||||
|
if (curr - nearAvg > 18)
|
||||||
|
return gbLevelUnitSharpenLightTable[pixel];
|
||||||
|
|
||||||
|
return pixel;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL UseLevelUnitEnhance();
|
||||||
|
|
||||||
|
static void RLEDrawEnhancedUnit(BYTE *pDst, BYTE *pRLEData, int nDataSize, int nWidth, BYTE *pLightTable, BOOL clipped)
|
||||||
|
{
|
||||||
|
BYTE row[BUFFERX];
|
||||||
|
BYTE mask[BUFFERX];
|
||||||
|
BYTE *pSrc, *pRowDst;
|
||||||
|
int remaining, rowLeft, x, i;
|
||||||
|
signed char packet;
|
||||||
|
BYTE pixel;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
if (nWidth <= 0 || nWidth > BUFFERX) {
|
||||||
|
if (pLightTable != NULL) {
|
||||||
|
if (clipped)
|
||||||
|
RLEDrawLitUnitClipped(pDst, pRLEData, nDataSize, nWidth, pLightTable);
|
||||||
|
else
|
||||||
|
RLEDrawLitUnit(pDst, pRLEData, nDataSize, nWidth, pLightTable);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (clipped)
|
||||||
|
RLEDrawUnitClipped(pDst, pRLEData, nDataSize, nWidth);
|
||||||
|
else
|
||||||
|
RLEDrawUnit(pDst, pRLEData, nDataSize, nWidth);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(row, 0, nWidth);
|
||||||
|
memset(mask, 0, nWidth);
|
||||||
|
pSrc = pRLEData;
|
||||||
|
pRowDst = pDst;
|
||||||
|
remaining = nDataSize;
|
||||||
|
rowLeft = nWidth;
|
||||||
|
x = 0;
|
||||||
|
|
||||||
|
while (remaining > 0) {
|
||||||
|
packet = (signed char)*pSrc++;
|
||||||
|
remaining--;
|
||||||
|
|
||||||
|
if (packet >= 0) {
|
||||||
|
count = packet;
|
||||||
|
while (count > 0) {
|
||||||
|
i = (count < rowLeft) ? count : rowLeft;
|
||||||
|
x += i;
|
||||||
|
rowLeft -= i;
|
||||||
|
count -= i;
|
||||||
|
|
||||||
|
if (rowLeft == 0) {
|
||||||
|
if (!clipped || pRowDst < (BYTE *)glClipY) {
|
||||||
|
for (i = 0; i < nWidth; i++) {
|
||||||
|
if (mask[i])
|
||||||
|
pRowDst[i] = LevelUnitPixel(row, i, nWidth, pLightTable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memset(row, 0, nWidth);
|
||||||
|
memset(mask, 0, nWidth);
|
||||||
|
pRowDst -= BUFFERX;
|
||||||
|
rowLeft = nWidth;
|
||||||
|
x = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = -packet;
|
||||||
|
if (count > MAX_RLE_COPY) {
|
||||||
|
count -= MAX_RLE_COPY;
|
||||||
|
if (remaining <= 0)
|
||||||
|
break;
|
||||||
|
pixel = *pSrc++;
|
||||||
|
remaining--;
|
||||||
|
while (count-- > 0) {
|
||||||
|
row[x] = pixel;
|
||||||
|
mask[x] = TRUE;
|
||||||
|
x++;
|
||||||
|
rowLeft--;
|
||||||
|
|
||||||
|
if (rowLeft == 0) {
|
||||||
|
if (!clipped || pRowDst < (BYTE*)glClipY) {
|
||||||
|
for (i = 0; i < nWidth; i++) {
|
||||||
|
if (mask[i])
|
||||||
|
pRowDst[i] = LevelUnitPixel(row, i, nWidth, pLightTable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memset(row, 0, nWidth);
|
||||||
|
memset(mask, 0, nWidth);
|
||||||
|
pRowDst -= BUFFERX;
|
||||||
|
rowLeft = nWidth;
|
||||||
|
x = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
while (count-- > 0 && remaining > 0) {
|
||||||
|
pixel = *pSrc++;
|
||||||
|
remaining--;
|
||||||
|
row[x] = pixel;
|
||||||
|
mask[x] = TRUE;
|
||||||
|
x++;
|
||||||
|
rowLeft--;
|
||||||
|
|
||||||
|
if (rowLeft == 0) {
|
||||||
|
if (!clipped || pRowDst < (BYTE*)glClipY) {
|
||||||
|
for (i = 0; i < nWidth; i++) {
|
||||||
|
if (mask[i])
|
||||||
|
pRowDst[i] = LevelUnitPixel(row, i, nWidth, pLightTable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memset(row, 0, nWidth);
|
||||||
|
memset(mask, 0, nWidth);
|
||||||
|
pRowDst -= BUFFERX;
|
||||||
|
rowLeft = nWidth;
|
||||||
|
x = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void RLEDrawUnitLerpOverlay(BYTE *pDst, BYTE *pRLEData, int nDataSize, int nWidth, BYTE *pLightTable, BOOL clipped, int density)
|
||||||
|
{
|
||||||
|
BYTE row[BUFFERX];
|
||||||
|
BYTE mask[BUFFERX];
|
||||||
|
BYTE *pSrc, *pRowDst;
|
||||||
|
int remaining, rowLeft, x, i, y;
|
||||||
|
signed char packet;
|
||||||
|
BYTE pixel;
|
||||||
|
int count;
|
||||||
|
BOOL enhanced;
|
||||||
|
|
||||||
|
if (density <= 0)
|
||||||
|
return;
|
||||||
|
if (density > 3)
|
||||||
|
density = 3;
|
||||||
|
if (nWidth <= 0 || nWidth > BUFFERX)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memset(row, 0, nWidth);
|
||||||
|
memset(mask, 0, nWidth);
|
||||||
|
enhanced = UseLevelUnitEnhance();
|
||||||
|
pSrc = pRLEData;
|
||||||
|
pRowDst = pDst;
|
||||||
|
remaining = nDataSize;
|
||||||
|
rowLeft = nWidth;
|
||||||
|
x = 0;
|
||||||
|
y = 0;
|
||||||
|
|
||||||
|
while (remaining > 0) {
|
||||||
|
packet = (signed char)*pSrc++;
|
||||||
|
remaining--;
|
||||||
|
|
||||||
|
if (packet >= 0) {
|
||||||
|
count = packet;
|
||||||
|
while (count > 0) {
|
||||||
|
i = (count < rowLeft) ? count : rowLeft;
|
||||||
|
x += i;
|
||||||
|
rowLeft -= i;
|
||||||
|
count -= i;
|
||||||
|
|
||||||
|
if (rowLeft == 0) {
|
||||||
|
if (!clipped || pRowDst < (BYTE*)glClipY) {
|
||||||
|
for (i = 0; i < nWidth; i++) {
|
||||||
|
if (mask[i] && (((i + y) & 3) < density))
|
||||||
|
pRowDst[i] = enhanced ? LevelUnitPixel(row, i, nWidth, pLightTable) : (pLightTable ? pLightTable[row[i]] : row[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memset(row, 0, nWidth);
|
||||||
|
memset(mask, 0, nWidth);
|
||||||
|
pRowDst -= BUFFERX;
|
||||||
|
rowLeft = nWidth;
|
||||||
|
x = 0;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = -packet;
|
||||||
|
if (count > MAX_RLE_COPY) {
|
||||||
|
count -= MAX_RLE_COPY;
|
||||||
|
if (remaining <= 0)
|
||||||
|
break;
|
||||||
|
pixel = *pSrc++;
|
||||||
|
remaining--;
|
||||||
|
while (count-- > 0) {
|
||||||
|
row[x] = pixel;
|
||||||
|
mask[x] = TRUE;
|
||||||
|
x++;
|
||||||
|
rowLeft--;
|
||||||
|
|
||||||
|
if (rowLeft == 0) {
|
||||||
|
if (!clipped || pRowDst < (BYTE*)glClipY) {
|
||||||
|
for (i = 0; i < nWidth; i++) {
|
||||||
|
if (mask[i] && (((i + y) & 3) < density))
|
||||||
|
pRowDst[i] = enhanced ? LevelUnitPixel(row, i, nWidth, pLightTable) : (pLightTable ? pLightTable[row[i]] : row[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memset(row, 0, nWidth);
|
||||||
|
memset(mask, 0, nWidth);
|
||||||
|
pRowDst -= BUFFERX;
|
||||||
|
rowLeft = nWidth;
|
||||||
|
x = 0;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
while (count-- > 0 && remaining > 0) {
|
||||||
|
pixel = *pSrc++;
|
||||||
|
remaining--;
|
||||||
|
row[x] = pixel;
|
||||||
|
mask[x] = TRUE;
|
||||||
|
x++;
|
||||||
|
rowLeft--;
|
||||||
|
|
||||||
|
if (rowLeft == 0) {
|
||||||
|
if (!clipped || pRowDst < (BYTE*)glClipY) {
|
||||||
|
for (i = 0; i < nWidth; i++) {
|
||||||
|
if (mask[i] && (((i + y) & 3) < density))
|
||||||
|
pRowDst[i] = enhanced ? LevelUnitPixel(row, i, nWidth, pLightTable) : (pLightTable ? pLightTable[row[i]] : row[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memset(row, 0, nWidth);
|
||||||
|
memset(mask, 0, nWidth);
|
||||||
|
pRowDst -= BUFFERX;
|
||||||
|
rowLeft = nWidth;
|
||||||
|
x = 0;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL UseLevelUnitEnhance()
|
||||||
|
{
|
||||||
|
return gbLevelTileEnhanceActive && leveltype != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void DrawEnhancedUnitCommon(
|
||||||
|
long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, BYTE *pLightTable, BOOL clipped)
|
||||||
|
{
|
||||||
|
BYTE *pDst, *pSrc;
|
||||||
|
DWORD *pFrameTable;
|
||||||
|
long RLELen, offval, offval2;
|
||||||
|
|
||||||
|
app_assert(gpBuffer != NULL);
|
||||||
|
app_assert(pCelBuff != NULL);
|
||||||
|
app_assert(nCel > 0);
|
||||||
|
#ifdef GRACEFUL_EXIT
|
||||||
|
if (gpBuffer == NULL || pCelBuff == NULL || nCel <= 0)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pFrameTable = (DWORD*)pCelBuff;
|
||||||
|
app_assert(nCel <= (int)pFrameTable[0]);
|
||||||
|
pSrc = pCelBuff + pFrameTable[nCel];
|
||||||
|
offval = *(WORD*)(pSrc + ostart);
|
||||||
|
if (!offval)
|
||||||
|
return;
|
||||||
|
offval2 = (oend == 8) ? 0 : *(WORD*)(pSrc + oend);
|
||||||
|
RLELen = (offval2 ? offval2 : pFrameTable[nCel + 1] - pFrameTable[nCel]) - offval;
|
||||||
|
pSrc += offval;
|
||||||
|
pDst = gpBuffer + nBuffWTbl[yp - ostart * 16] + xp;
|
||||||
|
|
||||||
|
if (UseLevelUnitEnhance()) {
|
||||||
|
RLEDrawEnhancedUnit(pDst, pSrc, RLELen, nCelW, pLightTable, clipped);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pLightTable != NULL) {
|
||||||
|
if (clipped)
|
||||||
|
RLEDrawLitUnitClipped(pDst, pSrc, RLELen, nCelW, pLightTable);
|
||||||
|
else
|
||||||
|
RLEDrawLitUnit(pDst, pSrc, RLELen, nCelW, pLightTable);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (clipped)
|
||||||
|
RLEDrawUnitClipped(pDst, pSrc, RLELen, nCelW);
|
||||||
|
else
|
||||||
|
RLEDrawUnit(pDst, pSrc, RLELen, nCelW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void DrawUnitLerpOverlayCommon(
|
||||||
|
long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, BYTE *pLightTable, BOOL clipped, int density)
|
||||||
|
{
|
||||||
|
BYTE *pDst, *pSrc;
|
||||||
|
DWORD *pFrameTable;
|
||||||
|
long RLELen, offval, offval2;
|
||||||
|
|
||||||
|
if (density <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
app_assert(gpBuffer != NULL);
|
||||||
|
app_assert(pCelBuff != NULL);
|
||||||
|
app_assert(nCel > 0);
|
||||||
|
#ifdef GRACEFUL_EXIT
|
||||||
|
if (gpBuffer == NULL || pCelBuff == NULL || nCel <= 0)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pFrameTable = (DWORD*)pCelBuff;
|
||||||
|
app_assert(nCel <= (int)pFrameTable[0]);
|
||||||
|
pSrc = pCelBuff + pFrameTable[nCel];
|
||||||
|
offval = *(WORD*)(pSrc + ostart);
|
||||||
|
if (!offval)
|
||||||
|
return;
|
||||||
|
offval2 = (oend == 8) ? 0 : *(WORD*)(pSrc + oend);
|
||||||
|
RLELen = (offval2 ? offval2 : pFrameTable[nCel + 1] - pFrameTable[nCel]) - offval;
|
||||||
|
pSrc += offval;
|
||||||
|
pDst = gpBuffer + nBuffWTbl[yp - ostart * 16] + xp;
|
||||||
|
RLEDrawUnitLerpOverlay(pDst, pSrc, RLELen, nCelW, pLightTable, clipped, density);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
@@ -3486,6 +3847,192 @@ void DrawLitUnitClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawEnhancedUnit(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend)
|
||||||
|
{
|
||||||
|
DrawEnhancedUnitCommon(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, NULL, FALSE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawUnitLerpOverlay(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, int density)
|
||||||
|
{
|
||||||
|
DrawUnitLerpOverlayCommon(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, NULL, FALSE, density);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawEnhancedUnitClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend)
|
||||||
|
{
|
||||||
|
DrawEnhancedUnitCommon(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, NULL, TRUE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawUnitLerpOverlayClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, int density)
|
||||||
|
{
|
||||||
|
DrawUnitLerpOverlayCommon(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, NULL, TRUE, density);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawEnhancedLitUnit(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend)
|
||||||
|
{
|
||||||
|
DrawEnhancedUnitCommon(
|
||||||
|
xp,
|
||||||
|
yp,
|
||||||
|
pCelBuff,
|
||||||
|
nCel,
|
||||||
|
nCelW,
|
||||||
|
ostart,
|
||||||
|
oend,
|
||||||
|
nLVal ? pLightTbl + (nLVal << 8) : NULL,
|
||||||
|
FALSE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawLitUnitLerpOverlay(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, int density)
|
||||||
|
{
|
||||||
|
DrawUnitLerpOverlayCommon(
|
||||||
|
xp,
|
||||||
|
yp,
|
||||||
|
pCelBuff,
|
||||||
|
nCel,
|
||||||
|
nCelW,
|
||||||
|
ostart,
|
||||||
|
oend,
|
||||||
|
nLVal ? pLightTbl + (nLVal << 8) : NULL,
|
||||||
|
FALSE,
|
||||||
|
density);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawEnhancedLitUnitClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend)
|
||||||
|
{
|
||||||
|
DrawEnhancedUnitCommon(
|
||||||
|
xp,
|
||||||
|
yp,
|
||||||
|
pCelBuff,
|
||||||
|
nCel,
|
||||||
|
nCelW,
|
||||||
|
ostart,
|
||||||
|
oend,
|
||||||
|
nLVal ? pLightTbl + (nLVal << 8) : NULL,
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawLitUnitLerpOverlayClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, int density)
|
||||||
|
{
|
||||||
|
DrawUnitLerpOverlayCommon(
|
||||||
|
xp,
|
||||||
|
yp,
|
||||||
|
pCelBuff,
|
||||||
|
nCel,
|
||||||
|
nCelW,
|
||||||
|
ostart,
|
||||||
|
oend,
|
||||||
|
nLVal ? pLightTbl + (nLVal << 8) : NULL,
|
||||||
|
TRUE,
|
||||||
|
density);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawEnhancedInfraUnit(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff)
|
||||||
|
{
|
||||||
|
long ltaboff;
|
||||||
|
|
||||||
|
ltaboff = light4flag ? 1024 : 4096;
|
||||||
|
if (loff == LIGHT_STONE)
|
||||||
|
ltaboff += 256;
|
||||||
|
if (loff >= LIGHT_U)
|
||||||
|
ltaboff += ((loff - LIGHT_U) << 8) + 768;
|
||||||
|
DrawEnhancedUnitCommon(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, pLightTbl + ltaboff, FALSE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawInfraUnitLerpOverlay(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff, int density)
|
||||||
|
{
|
||||||
|
long ltaboff;
|
||||||
|
|
||||||
|
ltaboff = light4flag ? 1024 : 4096;
|
||||||
|
if (loff == LIGHT_STONE)
|
||||||
|
ltaboff += 256;
|
||||||
|
if (loff >= LIGHT_U)
|
||||||
|
ltaboff += ((loff - LIGHT_U) << 8) + 768;
|
||||||
|
DrawUnitLerpOverlayCommon(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, pLightTbl + ltaboff, FALSE, density);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawEnhancedInfraUnitClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff)
|
||||||
|
{
|
||||||
|
long ltaboff;
|
||||||
|
|
||||||
|
ltaboff = light4flag ? 1024 : 4096;
|
||||||
|
if (loff == LIGHT_STONE)
|
||||||
|
ltaboff += 256;
|
||||||
|
if (loff >= LIGHT_U)
|
||||||
|
ltaboff += ((loff - LIGHT_U) << 8) + 768;
|
||||||
|
DrawEnhancedUnitCommon(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, pLightTbl + ltaboff, TRUE);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//*************************************************************************
|
||||||
|
//*************************************************************************
|
||||||
|
#if RLE_DRAW
|
||||||
|
void DrawInfraUnitLerpOverlayClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff, int density)
|
||||||
|
{
|
||||||
|
long ltaboff;
|
||||||
|
|
||||||
|
ltaboff = light4flag ? 1024 : 4096;
|
||||||
|
if (loff == LIGHT_STONE)
|
||||||
|
ltaboff += 256;
|
||||||
|
if (loff >= LIGHT_U)
|
||||||
|
ltaboff += ((loff - LIGHT_U) << 8) + 768;
|
||||||
|
DrawUnitLerpOverlayCommon(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, pLightTbl + ltaboff, TRUE, density);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
//*************************************************************************
|
//*************************************************************************
|
||||||
void play_movie(const char * pszMovie,BOOL bAllowCancel);
|
void play_movie(const char * pszMovie,BOOL bAllowCancel);
|
||||||
|
|||||||
@@ -169,6 +169,89 @@ _Skip2: inc edi
|
|||||||
#define INVOMCLR 181
|
#define INVOMCLR 181
|
||||||
#define INVOICLR 229
|
#define INVOICLR 229
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
extern BYTE gbHudAnimateActive;
|
||||||
|
extern BYTE gbHudPotionHealthTable[4][256];
|
||||||
|
extern BYTE gbHudPotionManaTable[4][256];
|
||||||
|
extern BYTE gbHudPotionRejuvTable[4][256];
|
||||||
|
}
|
||||||
|
|
||||||
|
#define HUDPOT_NONE 0
|
||||||
|
#define HUDPOT_HEALTH 1
|
||||||
|
#define HUDPOT_MANA 2
|
||||||
|
#define HUDPOT_REJUV 3
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int HudPotionKind(ItemStruct *item)
|
||||||
|
{
|
||||||
|
switch (item->_iMiscId) {
|
||||||
|
case IMID_PHEAL:
|
||||||
|
case IMID_PLHEAL:
|
||||||
|
case IMID_PSHEAL:
|
||||||
|
case IMID_PDHEAL:
|
||||||
|
return HUDPOT_HEALTH;
|
||||||
|
case IMID_PMANA:
|
||||||
|
case IMID_PFMANA:
|
||||||
|
return HUDPOT_MANA;
|
||||||
|
case IMID_REJUV:
|
||||||
|
case IMID_FREJUV:
|
||||||
|
return HUDPOT_REJUV;
|
||||||
|
default:
|
||||||
|
return HUDPOT_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BYTE *HudPotionTable(int kind, int phase)
|
||||||
|
{
|
||||||
|
phase &= 3;
|
||||||
|
if (kind == HUDPOT_HEALTH)
|
||||||
|
return gbHudPotionHealthTable[phase];
|
||||||
|
if (kind == HUDPOT_MANA)
|
||||||
|
return gbHudPotionManaTable[phase];
|
||||||
|
return gbHudPotionRejuvTable[phase];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static void HudAnimatePotionIcon(int x, int y, int w, int h, int kind, int salt)
|
||||||
|
{
|
||||||
|
int row, col;
|
||||||
|
int xclip, wclip;
|
||||||
|
int yy;
|
||||||
|
BYTE *p;
|
||||||
|
BYTE *table;
|
||||||
|
|
||||||
|
if (kind == HUDPOT_NONE || !gbHudAnimateActive || gpBuffer == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
xclip = x;
|
||||||
|
wclip = w;
|
||||||
|
if (xclip < 0) {
|
||||||
|
wclip += xclip;
|
||||||
|
xclip = 0;
|
||||||
|
}
|
||||||
|
if (xclip + wclip > BUFFERX)
|
||||||
|
wclip = BUFFERX - xclip;
|
||||||
|
if (wclip <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
table = HudPotionTable(kind, (GetTickCount() / 115) + salt);
|
||||||
|
for (row = 0; row < h; row++) {
|
||||||
|
yy = y - row;
|
||||||
|
if (yy < 0 || yy >= BUFFERY)
|
||||||
|
continue;
|
||||||
|
p = gpBuffer + nBuffWTbl[yy] + xclip;
|
||||||
|
for (col = 0; col < wclip; col++)
|
||||||
|
p[col] = table[p[col]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DrawInv()
|
void DrawInv()
|
||||||
{
|
{
|
||||||
int i, f, w, ii, xx, yy, oc;
|
int i, f, w, ii, xx, yy, oc;
|
||||||
@@ -431,6 +514,7 @@ void DrawInv()
|
|||||||
else
|
else
|
||||||
DrawSlabCelI(InvRect[i+25].x + 64, InvRect[i+25].y + 159, pCursCels2, f - ICLAST, w, 0, 8, LIGHT_INFRA);
|
DrawSlabCelI(InvRect[i+25].x + 64, InvRect[i+25].y + 159, pCursCels2, f - ICLAST, w, 0, 8, LIGHT_INFRA);
|
||||||
}
|
}
|
||||||
|
HudAnimatePotionIcon(InvRect[i+25].x + 64, InvRect[i+25].y + 159, w, CursorHeight[f], HudPotionKind(&plr[myplr].InvList[ii]), i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -472,6 +556,7 @@ void DrawSpdBar()
|
|||||||
else
|
else
|
||||||
DrawSlabCelI(InvRect[i+65].x + 64, InvRect[i+65].y + 159, pCursCels2, f - ICLAST, w, 0, 8, LIGHT_INFRA);
|
DrawSlabCelI(InvRect[i+65].x + 64, InvRect[i+65].y + 159, pCursCels2, f - ICLAST, w, 0, 8, LIGHT_INFRA);
|
||||||
}
|
}
|
||||||
|
HudAnimatePotionIcon(InvRect[i+65].x + 64, InvRect[i+65].y + 159, w, CursorHeight[f], HudPotionKind(&plr[myplr].SpdList[i]), i + 8);
|
||||||
idata = plr[myplr].SpdList[i].IDidx;
|
idata = plr[myplr].SpdList[i].IDidx;
|
||||||
if (AllItemsList[idata].iUsable && plr[myplr].SpdList[i]._iStatFlag &&
|
if (AllItemsList[idata].iUsable && plr[myplr].SpdList[i]._iStatFlag &&
|
||||||
(plr[myplr].SpdList[i]._itype != IT_GOLD))
|
(plr[myplr].SpdList[i]._itype != IT_GOLD))
|
||||||
|
|||||||
@@ -207,6 +207,20 @@ char * pCrawlEntry[19] = {
|
|||||||
&(CrawlTable[2460]) // 18
|
&(CrawlTable[2460]) // 18
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int GetEffectiveLightRadius(int nRadius)
|
||||||
|
{
|
||||||
|
if (nRadius <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
nRadius = (nRadius * 4) / 5;
|
||||||
|
if (nRadius < 1)
|
||||||
|
nRadius = 1;
|
||||||
|
if (nRadius > 15)
|
||||||
|
nRadius = 15;
|
||||||
|
|
||||||
|
return nRadius;
|
||||||
|
}
|
||||||
|
|
||||||
BYTE vCrawlTable[23][30] = {
|
BYTE vCrawlTable[23][30] = {
|
||||||
{1,0, 2,0, 3,0, 4,0, 5,0, 6,0, 7,0, 8,0, 9,0, 10,0, 11,0, 12,0, 13,0, 14,0, 15,0}, // 0
|
{1,0, 2,0, 3,0, 4,0, 5,0, 6,0, 7,0, 8,0, 9,0, 10,0, 11,0, 12,0, 13,0, 14,0, 15,0}, // 0
|
||||||
{1,0, 2,0, 3,0, 4,0, 5,0, 6,0, 7,0, 8,1, 9,1, 10,1, 11,1, 12,1, 13,1, 14,1, 15,1}, // 1
|
{1,0, 2,0, 3,0, 4,0, 5,0, 6,0, 7,0, 8,1, 9,1, 10,1, 11,1, 12,1, 13,1, 14,1, 15,1}, // 1
|
||||||
@@ -331,6 +345,7 @@ void DoLighting (int nXPos, int nYPos, int nRadius, int Lnum)
|
|||||||
nYPos--;
|
nYPos--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
nRadius = GetEffectiveLightRadius(nRadius);
|
||||||
rxoff = xoff;
|
rxoff = xoff;
|
||||||
ryoff = yoff;
|
ryoff = yoff;
|
||||||
|
|
||||||
@@ -455,6 +470,7 @@ void DoUnLight (int nXPos, int nYPos, int nRadius)
|
|||||||
int i, j;
|
int i, j;
|
||||||
int x1,y1,x2,y2;
|
int x1,y1,x2,y2;
|
||||||
|
|
||||||
|
nRadius = GetEffectiveLightRadius(nRadius);
|
||||||
nRadius++;
|
nRadius++;
|
||||||
y1 = nYPos - nRadius;
|
y1 = nYPos - nRadius;
|
||||||
y2 = nYPos + nRadius;
|
y2 = nYPos + nRadius;
|
||||||
@@ -476,6 +492,7 @@ void DoUnVision (int nXPos, int nYPos, int nRadius)
|
|||||||
int i, j;
|
int i, j;
|
||||||
int x1,y1,x2,y2;
|
int x1,y1,x2,y2;
|
||||||
|
|
||||||
|
nRadius = GetEffectiveLightRadius(nRadius);
|
||||||
nRadius++;
|
nRadius++;
|
||||||
y1 = nYPos - nRadius;
|
y1 = nYPos - nRadius;
|
||||||
y2 = nYPos + nRadius;
|
y2 = nYPos + nRadius;
|
||||||
@@ -499,6 +516,8 @@ void DoVision (int nXPos, int nYPos, int nRadius, BOOL doautomap, BOOL visible)
|
|||||||
int i, j, k, v;
|
int i, j, k, v;
|
||||||
int x1adj, x2adj, y1adj, y2adj;
|
int x1adj, x2adj, y1adj, y2adj;
|
||||||
|
|
||||||
|
nRadius = GetEffectiveLightRadius(nRadius);
|
||||||
|
|
||||||
// handle origin separately. Why? I don't know.
|
// handle origin separately. Why? I don't know.
|
||||||
if (nXPos >= 0 && nXPos <= DMAXX && nYPos >= 0 && nYPos <= DMAXY) {
|
if (nXPos >= 0 && nXPos <= DMAXX && nYPos >= 0 && nYPos <= DMAXY) {
|
||||||
if (doautomap) {
|
if (doautomap) {
|
||||||
|
|||||||
+17
@@ -703,3 +703,20 @@ BOOL nthread_run_gameloop(BOOL bReloop) {
|
|||||||
|
|
||||||
return (lDelta >= 0);
|
return (lDelta >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//******************************************************************
|
||||||
|
//******************************************************************
|
||||||
|
int nthread_get_render_interp()
|
||||||
|
{
|
||||||
|
long lFrameMs = 1000 / GAME_FRAMES_PER_SECOND;
|
||||||
|
long lUntilNextFrame = sglGameClock - (long)GetTickCount();
|
||||||
|
long lElapsed = lFrameMs - lUntilNextFrame;
|
||||||
|
|
||||||
|
if (lElapsed <= 0)
|
||||||
|
return 0;
|
||||||
|
if (lElapsed >= lFrameMs)
|
||||||
|
return 256;
|
||||||
|
|
||||||
|
return (int)((lElapsed * 256) / lFrameMs);
|
||||||
|
}
|
||||||
|
|||||||
+408
@@ -37,6 +37,405 @@ static PALETTEENTRY sgCurr[256]; // palette to be displayed -- includes rotation
|
|||||||
static const char sgszGamma[] = "Gamma Correction";
|
static const char sgszGamma[] = "Gamma Correction";
|
||||||
static BYTE sgbFadedIn = TRUE;
|
static BYTE sgbFadedIn = TRUE;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
BYTE gbLevelTileEnhanceActive = FALSE;
|
||||||
|
BYTE gbLevelTileContrastTable[256];
|
||||||
|
BYTE gbLevelTileLumaTable[256];
|
||||||
|
BYTE gbLevelTileSharpenLightTable[256];
|
||||||
|
BYTE gbLevelTileAoTable[256];
|
||||||
|
BYTE gbLevelUnitContrastTable[256];
|
||||||
|
BYTE gbLevelUnitLumaTable[256];
|
||||||
|
BYTE gbLevelUnitSharpenLightTable[256];
|
||||||
|
BYTE gbLevelUnitAoTable[256];
|
||||||
|
BYTE gbTownWarmFlickerActive = FALSE;
|
||||||
|
BYTE gbTownWarmFlickerTable[4][256];
|
||||||
|
BYTE gbHudAnimateActive = FALSE;
|
||||||
|
BYTE gbHudHealthOrbTable[4][256];
|
||||||
|
BYTE gbHudManaOrbTable[4][256];
|
||||||
|
BYTE gbHudPotionHealthTable[4][256];
|
||||||
|
BYTE gbHudPotionManaTable[4][256];
|
||||||
|
BYTE gbHudPotionRejuvTable[4][256];
|
||||||
|
BYTE gbWorldGoldShimmerActive = FALSE;
|
||||||
|
BYTE gbWorldGoldShimmerTable[4][256];
|
||||||
|
int gnTownTileX = -1;
|
||||||
|
int gnTownTileY = -1;
|
||||||
|
int gnTownFlickerFrame = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int PalClamp(int value, int max)
|
||||||
|
{
|
||||||
|
if (value < 0) return 0;
|
||||||
|
if (value > max) return max;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static LONG PalDistance(const PALETTEENTRY *a, int red, int green, int blue)
|
||||||
|
{
|
||||||
|
LONG dr, dg, db;
|
||||||
|
|
||||||
|
dr = (LONG)a->peRed - red;
|
||||||
|
dg = (LONG)a->peGreen - green;
|
||||||
|
db = (LONG)a->peBlue - blue;
|
||||||
|
|
||||||
|
return dr * dr + dg * dg + db * db;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BYTE FindNearestPaletteColor(int red, int green, int blue)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
BYTE best;
|
||||||
|
LONG dist, bestDist;
|
||||||
|
|
||||||
|
best = 1;
|
||||||
|
bestDist = PalDistance(&sgLoad[1], red, green, blue);
|
||||||
|
|
||||||
|
for (i = 2; i < 256; i++) {
|
||||||
|
dist = PalDistance(&sgLoad[i], red, green, blue);
|
||||||
|
if (dist < bestDist) {
|
||||||
|
bestDist = dist;
|
||||||
|
best = (BYTE)i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return best;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static void BuildLevelTileEnhanceTables()
|
||||||
|
{
|
||||||
|
int i, max, mid;
|
||||||
|
int red, green, blue, brightness;
|
||||||
|
|
||||||
|
max = 63;
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
if (sgLoad[i].peRed > 63 || sgLoad[i].peGreen > 63 || sgLoad[i].peBlue > 63) {
|
||||||
|
max = 255;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mid = max / 2;
|
||||||
|
|
||||||
|
gbLevelTileContrastTable[0] = 0;
|
||||||
|
gbLevelTileLumaTable[0] = 0;
|
||||||
|
gbLevelTileSharpenLightTable[0] = 0;
|
||||||
|
gbLevelTileAoTable[0] = 0;
|
||||||
|
gbLevelUnitContrastTable[0] = 0;
|
||||||
|
gbLevelUnitLumaTable[0] = 0;
|
||||||
|
gbLevelUnitSharpenLightTable[0] = 0;
|
||||||
|
gbLevelUnitAoTable[0] = 0;
|
||||||
|
for (i = 1; i < 256; i++) {
|
||||||
|
brightness = ((int)sgLoad[i].peRed * 30 + (int)sgLoad[i].peGreen * 59 + (int)sgLoad[i].peBlue * 11) / 100;
|
||||||
|
gbLevelTileLumaTable[i] = (BYTE)((brightness * 255) / max);
|
||||||
|
gbLevelUnitLumaTable[i] = gbLevelTileLumaTable[i];
|
||||||
|
|
||||||
|
red = (int)sgLoad[i].peRed + (((int)max - (int)sgLoad[i].peRed) * 6) / 100;
|
||||||
|
green = (int)sgLoad[i].peGreen + (((int)max - (int)sgLoad[i].peGreen) * 6) / 100;
|
||||||
|
blue = (int)sgLoad[i].peBlue + (((int)max - (int)sgLoad[i].peBlue) * 6) / 100;
|
||||||
|
gbLevelTileSharpenLightTable[i] = FindNearestPaletteColor(
|
||||||
|
PalClamp(red, max),
|
||||||
|
PalClamp(green, max),
|
||||||
|
PalClamp(blue, max));
|
||||||
|
|
||||||
|
red = ((int)sgLoad[i].peRed * 90) / 100;
|
||||||
|
green = ((int)sgLoad[i].peGreen * 90) / 100;
|
||||||
|
blue = ((int)sgLoad[i].peBlue * 90) / 100;
|
||||||
|
gbLevelTileAoTable[i] = FindNearestPaletteColor(
|
||||||
|
PalClamp(red, max),
|
||||||
|
PalClamp(green, max),
|
||||||
|
PalClamp(blue, max));
|
||||||
|
|
||||||
|
red = (int)sgLoad[i].peRed + (((int)max - (int)sgLoad[i].peRed) * 12) / 100;
|
||||||
|
green = (int)sgLoad[i].peGreen + (((int)max - (int)sgLoad[i].peGreen) * 12) / 100;
|
||||||
|
blue = (int)sgLoad[i].peBlue + (((int)max - (int)sgLoad[i].peBlue) * 12) / 100;
|
||||||
|
gbLevelUnitSharpenLightTable[i] = FindNearestPaletteColor(
|
||||||
|
PalClamp(red, max),
|
||||||
|
PalClamp(green, max),
|
||||||
|
PalClamp(blue, max));
|
||||||
|
|
||||||
|
red = ((int)sgLoad[i].peRed * 82) / 100;
|
||||||
|
green = ((int)sgLoad[i].peGreen * 82) / 100;
|
||||||
|
blue = ((int)sgLoad[i].peBlue * 82) / 100;
|
||||||
|
gbLevelUnitAoTable[i] = FindNearestPaletteColor(
|
||||||
|
PalClamp(red, max),
|
||||||
|
PalClamp(green, max),
|
||||||
|
PalClamp(blue, max));
|
||||||
|
|
||||||
|
if (brightness < max / 5 || brightness > (max * 4) / 5) {
|
||||||
|
gbLevelTileContrastTable[i] = (BYTE)i;
|
||||||
|
gbLevelUnitContrastTable[i] = (BYTE)i;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
red = mid + (((int)sgLoad[i].peRed - mid) * 106) / 100;
|
||||||
|
green = mid + (((int)sgLoad[i].peGreen - mid) * 106) / 100;
|
||||||
|
blue = mid + (((int)sgLoad[i].peBlue - mid) * 106) / 100;
|
||||||
|
|
||||||
|
gbLevelTileContrastTable[i] = FindNearestPaletteColor(
|
||||||
|
PalClamp(red, max),
|
||||||
|
PalClamp(green, max),
|
||||||
|
PalClamp(blue, max));
|
||||||
|
|
||||||
|
red = mid + (((int)sgLoad[i].peRed - mid) * 108) / 100;
|
||||||
|
green = mid + (((int)sgLoad[i].peGreen - mid) * 108) / 100;
|
||||||
|
blue = mid + (((int)sgLoad[i].peBlue - mid) * 108) / 100;
|
||||||
|
|
||||||
|
gbLevelUnitContrastTable[i] = FindNearestPaletteColor(
|
||||||
|
PalClamp(red, max),
|
||||||
|
PalClamp(green, max),
|
||||||
|
PalClamp(blue, max));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int IsWarmTownLightColor(int red, int green, int blue, int brightness, int max)
|
||||||
|
{
|
||||||
|
if (brightness < max / 4)
|
||||||
|
return FALSE;
|
||||||
|
if (red < green || green < blue)
|
||||||
|
return FALSE;
|
||||||
|
if (red - blue < max / 7)
|
||||||
|
return FALSE;
|
||||||
|
if (green - blue < max / 12)
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static void BuildTownWarmFlickerTables()
|
||||||
|
{
|
||||||
|
int i, p, max;
|
||||||
|
int red, green, blue, brightness;
|
||||||
|
static const int sPhaseRed[4] = { 6, 14, 9, -3 };
|
||||||
|
static const int sPhaseGreen[4] = { 3, 8, 5, -2 };
|
||||||
|
static const int sPhaseBlue[4] = { -3, -6, -4, 0 };
|
||||||
|
|
||||||
|
max = 63;
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
if (sgLoad[i].peRed > 63 || sgLoad[i].peGreen > 63 || sgLoad[i].peBlue > 63) {
|
||||||
|
max = 255;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
brightness = ((int)sgLoad[i].peRed * 30 + (int)sgLoad[i].peGreen * 59 + (int)sgLoad[i].peBlue * 11) / 100;
|
||||||
|
for (p = 0; p < 4; p++) {
|
||||||
|
if (!IsWarmTownLightColor(sgLoad[i].peRed, sgLoad[i].peGreen, sgLoad[i].peBlue, brightness, max)) {
|
||||||
|
gbTownWarmFlickerTable[p][i] = (BYTE)i;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
red = (int)sgLoad[i].peRed + (((int)max - (int)sgLoad[i].peRed) * sPhaseRed[p]) / 100;
|
||||||
|
green = (int)sgLoad[i].peGreen + (((int)max - (int)sgLoad[i].peGreen) * sPhaseGreen[p]) / 100;
|
||||||
|
if (sPhaseBlue[p] < 0)
|
||||||
|
blue = ((int)sgLoad[i].peBlue * (100 + sPhaseBlue[p])) / 100;
|
||||||
|
else
|
||||||
|
blue = (int)sgLoad[i].peBlue + (((int)max - (int)sgLoad[i].peBlue) * sPhaseBlue[p]) / 100;
|
||||||
|
|
||||||
|
gbTownWarmFlickerTable[p][i] = FindNearestPaletteColor(
|
||||||
|
PalClamp(red, max),
|
||||||
|
PalClamp(green, max),
|
||||||
|
PalClamp(blue, max));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int IsHudHealthColor(int red, int green, int blue, int brightness, int max)
|
||||||
|
{
|
||||||
|
if (brightness < max / 5)
|
||||||
|
return FALSE;
|
||||||
|
if (red < green - max / 16)
|
||||||
|
return FALSE;
|
||||||
|
if (red < blue - max / 12)
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int IsHudManaColor(int red, int green, int blue, int brightness, int max)
|
||||||
|
{
|
||||||
|
if (brightness < max / 5)
|
||||||
|
return FALSE;
|
||||||
|
if (blue < red - max / 16)
|
||||||
|
return FALSE;
|
||||||
|
if (blue < green - max / 12)
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int IsHudRejuvColor(int red, int green, int blue, int brightness, int max)
|
||||||
|
{
|
||||||
|
if (brightness < max / 5)
|
||||||
|
return FALSE;
|
||||||
|
if (red < green + max / 14)
|
||||||
|
return FALSE;
|
||||||
|
if (blue < green + max / 14)
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int HudShiftChannel(int value, int max, int percent)
|
||||||
|
{
|
||||||
|
if (percent >= 0)
|
||||||
|
return value + ((max - value) * percent) / 100;
|
||||||
|
return (value * (100 + percent)) / 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static void BuildHudAnimTable(BYTE table[4][256], const int redPhase[4], const int greenPhase[4], const int bluePhase[4], int kind, int max)
|
||||||
|
{
|
||||||
|
int i, p;
|
||||||
|
int red, green, blue, brightness;
|
||||||
|
int useColor;
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
red = sgLoad[i].peRed;
|
||||||
|
green = sgLoad[i].peGreen;
|
||||||
|
blue = sgLoad[i].peBlue;
|
||||||
|
brightness = (red * 30 + green * 59 + blue * 11) / 100;
|
||||||
|
|
||||||
|
useColor = FALSE;
|
||||||
|
if (kind == 0)
|
||||||
|
useColor = IsHudHealthColor(red, green, blue, brightness, max);
|
||||||
|
else if (kind == 1)
|
||||||
|
useColor = IsHudManaColor(red, green, blue, brightness, max);
|
||||||
|
else
|
||||||
|
useColor = IsHudRejuvColor(red, green, blue, brightness, max);
|
||||||
|
|
||||||
|
for (p = 0; p < 4; p++) {
|
||||||
|
if (!useColor) {
|
||||||
|
table[p][i] = (BYTE)i;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
table[p][i] = FindNearestPaletteColor(
|
||||||
|
PalClamp(HudShiftChannel(red, max, redPhase[p]), max),
|
||||||
|
PalClamp(HudShiftChannel(green, max, greenPhase[p]), max),
|
||||||
|
PalClamp(HudShiftChannel(blue, max, bluePhase[p]), max));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static void BuildHudAnimateTables()
|
||||||
|
{
|
||||||
|
int i, max;
|
||||||
|
static const int sHealthOrbRed[4] = { 6, 16, 9, -4 };
|
||||||
|
static const int sHealthOrbGreen[4] = { 1, 4, 2, -2 };
|
||||||
|
static const int sHealthOrbBlue[4] = { -4, -10, -6, 0 };
|
||||||
|
static const int sManaOrbRed[4] = { -4, -10, -6, 0 };
|
||||||
|
static const int sManaOrbGreen[4] = { 2, 7, 4, -2 };
|
||||||
|
static const int sManaOrbBlue[4] = { 7, 18, 10, -4 };
|
||||||
|
static const int sHealthPotionRed[4] = { 3, 8, 5, -2 };
|
||||||
|
static const int sHealthPotionGreen[4] = { 0, 2, 1, -1 };
|
||||||
|
static const int sHealthPotionBlue[4] = { -2, -5, -3, 0 };
|
||||||
|
static const int sManaPotionRed[4] = { -2, -5, -3, 0 };
|
||||||
|
static const int sManaPotionGreen[4] = { 1, 4, 2, -1 };
|
||||||
|
static const int sManaPotionBlue[4] = { 4, 11, 6, -2 };
|
||||||
|
static const int sRejuvPotionRed[4] = { 4, 11, 6, -2 };
|
||||||
|
static const int sRejuvPotionGreen[4] = { -1, 1, 0, -1 };
|
||||||
|
static const int sRejuvPotionBlue[4] = { 4, 11, 6, -2 };
|
||||||
|
|
||||||
|
max = 63;
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
if (sgLoad[i].peRed > 63 || sgLoad[i].peGreen > 63 || sgLoad[i].peBlue > 63) {
|
||||||
|
max = 255;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BuildHudAnimTable(gbHudHealthOrbTable, sHealthOrbRed, sHealthOrbGreen, sHealthOrbBlue, 0, max);
|
||||||
|
BuildHudAnimTable(gbHudManaOrbTable, sManaOrbRed, sManaOrbGreen, sManaOrbBlue, 1, max);
|
||||||
|
BuildHudAnimTable(gbHudPotionHealthTable, sHealthPotionRed, sHealthPotionGreen, sHealthPotionBlue, 0, max);
|
||||||
|
BuildHudAnimTable(gbHudPotionManaTable, sManaPotionRed, sManaPotionGreen, sManaPotionBlue, 1, max);
|
||||||
|
BuildHudAnimTable(gbHudPotionRejuvTable, sRejuvPotionRed, sRejuvPotionGreen, sRejuvPotionBlue, 2, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int IsWorldGoldColor(int red, int green, int blue, int brightness, int max)
|
||||||
|
{
|
||||||
|
if (brightness < max / 8)
|
||||||
|
return FALSE;
|
||||||
|
if (red < green - max / 5)
|
||||||
|
return FALSE;
|
||||||
|
if (green < blue + max / 24)
|
||||||
|
return FALSE;
|
||||||
|
if (red < blue + max / 12)
|
||||||
|
return FALSE;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static void BuildWorldGoldShimmerTables()
|
||||||
|
{
|
||||||
|
int i, p, max;
|
||||||
|
int red, green, blue, brightness;
|
||||||
|
static const int sGoldRed[4] = { 2, 22, 8, -8 };
|
||||||
|
static const int sGoldGreen[4] = { 1, 18, 6, -7 };
|
||||||
|
static const int sGoldBlue[4] = { -3, -16, -7, -4 };
|
||||||
|
|
||||||
|
max = 63;
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
if (sgLoad[i].peRed > 63 || sgLoad[i].peGreen > 63 || sgLoad[i].peBlue > 63) {
|
||||||
|
max = 255;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
red = sgLoad[i].peRed;
|
||||||
|
green = sgLoad[i].peGreen;
|
||||||
|
blue = sgLoad[i].peBlue;
|
||||||
|
brightness = (red * 30 + green * 59 + blue * 11) / 100;
|
||||||
|
|
||||||
|
for (p = 0; p < 4; p++) {
|
||||||
|
if (!IsWorldGoldColor(red, green, blue, brightness, max)) {
|
||||||
|
gbWorldGoldShimmerTable[p][i] = (BYTE)i;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
gbWorldGoldShimmerTable[p][i] = FindNearestPaletteColor(
|
||||||
|
PalClamp(HudShiftChannel(red, max, sGoldRed[p]), max),
|
||||||
|
PalClamp(HudShiftChannel(green, max, sGoldGreen[p]), max),
|
||||||
|
PalClamp(HudShiftChannel(blue, max, sGoldBlue[p]), max));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------**
|
/*-----------------------------------------------------------------------**
|
||||||
**-----------------------------------------------------------------------*/
|
**-----------------------------------------------------------------------*/
|
||||||
@@ -184,6 +583,15 @@ void LoadRndLvlPal(int l) {
|
|||||||
}
|
}
|
||||||
LoadPalette(filestr);
|
LoadPalette(filestr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BuildLevelTileEnhanceTables();
|
||||||
|
BuildTownWarmFlickerTables();
|
||||||
|
BuildHudAnimateTables();
|
||||||
|
BuildWorldGoldShimmerTables();
|
||||||
|
gbLevelTileEnhanceActive = TRUE;
|
||||||
|
gbTownWarmFlickerActive = (l == 0);
|
||||||
|
gbHudAnimateActive = FALSE;
|
||||||
|
gbWorldGoldShimmerActive = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+481
-70
@@ -71,11 +71,23 @@ void DrawUnit(long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,lo
|
|||||||
void DrawUnitOutline(byte ocolor, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
void DrawUnitOutline(byte ocolor, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
||||||
void DrawInfraUnit(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff);
|
void DrawInfraUnit(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff);
|
||||||
void DrawLitUnit(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
void DrawLitUnit(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
||||||
|
void DrawEnhancedUnit(long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend);
|
||||||
|
void DrawEnhancedInfraUnit(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff);
|
||||||
|
void DrawEnhancedLitUnit(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
||||||
|
void DrawUnitLerpOverlay(long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend,int density);
|
||||||
|
void DrawInfraUnitLerpOverlay(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff, int density);
|
||||||
|
void DrawLitUnitLerpOverlay(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, int density);
|
||||||
|
|
||||||
void DrawUnitClipped(long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend);
|
void DrawUnitClipped(long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend);
|
||||||
void DrawUnitOutlineClipped(byte ocolor, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
void DrawUnitOutlineClipped(byte ocolor, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
||||||
void DrawInfraUnitClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff);
|
void DrawInfraUnitClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff);
|
||||||
void DrawLitUnitClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
void DrawLitUnitClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
||||||
|
void DrawEnhancedUnitClipped(long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend);
|
||||||
|
void DrawEnhancedInfraUnitClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff);
|
||||||
|
void DrawEnhancedLitUnitClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
||||||
|
void DrawUnitLerpOverlayClipped(long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend,int density);
|
||||||
|
void DrawInfraUnitLerpOverlayClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, char loff, int density);
|
||||||
|
void DrawLitUnitLerpOverlayClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, int density);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chflag);
|
void DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chflag);
|
||||||
@@ -98,9 +110,13 @@ extern "C" {
|
|||||||
char gbPartialTrans;
|
char gbPartialTrans;
|
||||||
DWORD gdwPNum;
|
DWORD gdwPNum;
|
||||||
long glClipY;
|
long glClipY;
|
||||||
|
extern BYTE gbWorldGoldShimmerActive;
|
||||||
|
extern BYTE gbWorldGoldShimmerTable[4][256];
|
||||||
}
|
}
|
||||||
int gnMI;
|
int gnMI;
|
||||||
long nBuffWTbl[1024];
|
long nBuffWTbl[1024];
|
||||||
|
int gnRenderFrameInterp;
|
||||||
|
extern int PlrWalkLenTbl[NUM_CLASSES];
|
||||||
|
|
||||||
|
|
||||||
// frame counter
|
// frame counter
|
||||||
@@ -111,6 +127,340 @@ static BYTE sgfFrameCounterEnabled = FALSE;
|
|||||||
|
|
||||||
bool HighLightAllItems = false;
|
bool HighLightAllItems = false;
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static void SetDungeonLightContext(int sx, int sy, int, int)
|
||||||
|
{
|
||||||
|
nLVal = dLight[sx][sy];
|
||||||
|
if (nLVal < lightmax)
|
||||||
|
nLVal++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int VisualHalfStep(long velocity, int fixedShift)
|
||||||
|
{
|
||||||
|
int interp;
|
||||||
|
__int64 step;
|
||||||
|
|
||||||
|
interp = gnRenderFrameInterp;
|
||||||
|
if (interp <= 0 || velocity == 0)
|
||||||
|
return 0;
|
||||||
|
if (interp > 256)
|
||||||
|
interp = 256;
|
||||||
|
|
||||||
|
step = velocity;
|
||||||
|
if (step < 0)
|
||||||
|
return -(int)(((-step) * interp) >> (fixedShift + 8));
|
||||||
|
|
||||||
|
return (int)((step * interp) >> (fixedShift + 8));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BOOL PlayerUsesVisualLerp(PlayerStruct *pPlayer)
|
||||||
|
{
|
||||||
|
return pPlayer->_pmode == PM_WALK
|
||||||
|
|| pPlayer->_pmode == PM_WALK2
|
||||||
|
|| pPlayer->_pmode == PM_WALK3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BOOL PlayerHasVisualStep(PlayerStruct *pPlayer)
|
||||||
|
{
|
||||||
|
int walkLen;
|
||||||
|
|
||||||
|
walkLen = 8;
|
||||||
|
if (currlevel != 0)
|
||||||
|
walkLen = PlrWalkLenTbl[pPlayer->_pClass];
|
||||||
|
|
||||||
|
return pPlayer->_pVar8 < walkLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetPlayerDrawX(PlayerStruct *pPlayer, int xp)
|
||||||
|
{
|
||||||
|
xp += pPlayer->_pxoff;
|
||||||
|
if (PlayerUsesVisualLerp(pPlayer) && PlayerHasVisualStep(pPlayer))
|
||||||
|
xp += VisualHalfStep(pPlayer->_pxvel, 8);
|
||||||
|
|
||||||
|
return xp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetPlayerDrawY(PlayerStruct *pPlayer, int yp)
|
||||||
|
{
|
||||||
|
yp += pPlayer->_pyoff;
|
||||||
|
if (PlayerUsesVisualLerp(pPlayer) && PlayerHasVisualStep(pPlayer))
|
||||||
|
yp += VisualHalfStep(pPlayer->_pyvel, 8);
|
||||||
|
|
||||||
|
return yp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetScrollDrawX()
|
||||||
|
{
|
||||||
|
int sxoff;
|
||||||
|
PlayerStruct *pPlayer;
|
||||||
|
|
||||||
|
sxoff = ScrollInfo._sxoff;
|
||||||
|
if (ScrollInfo._sdir == SCRL_NONE)
|
||||||
|
return sxoff;
|
||||||
|
|
||||||
|
pPlayer = &plr[myplr];
|
||||||
|
if (PlayerUsesVisualLerp(pPlayer) && PlayerHasVisualStep(pPlayer))
|
||||||
|
sxoff -= VisualHalfStep(pPlayer->_pxvel, 8);
|
||||||
|
|
||||||
|
return sxoff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetScrollDrawY()
|
||||||
|
{
|
||||||
|
int syoff;
|
||||||
|
PlayerStruct *pPlayer;
|
||||||
|
|
||||||
|
syoff = ScrollInfo._syoff;
|
||||||
|
if (ScrollInfo._sdir == SCRL_NONE)
|
||||||
|
return syoff;
|
||||||
|
|
||||||
|
pPlayer = &plr[myplr];
|
||||||
|
if (PlayerUsesVisualLerp(pPlayer) && PlayerHasVisualStep(pPlayer))
|
||||||
|
syoff -= VisualHalfStep(pPlayer->_pyvel, 8);
|
||||||
|
|
||||||
|
return syoff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BOOL MonsterUsesVisualLerp(MonsterStruct *pMonster)
|
||||||
|
{
|
||||||
|
return pMonster->_mmode == MM_WALK
|
||||||
|
|| pMonster->_mmode == MM_WALK2
|
||||||
|
|| pMonster->_mmode == MM_WALK3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BOOL MonsterHasVisualStep(MonsterStruct *pMonster)
|
||||||
|
{
|
||||||
|
return pMonster->_mVar8 < pMonster->MType->Anims[MA_WALK].Frames;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetMonsterDrawX(MonsterStruct *pMonster, int xp)
|
||||||
|
{
|
||||||
|
xp += pMonster->_mxoff;
|
||||||
|
if (MonsterUsesVisualLerp(pMonster) && MonsterHasVisualStep(pMonster))
|
||||||
|
xp += VisualHalfStep(pMonster->_mxvel, 4);
|
||||||
|
|
||||||
|
return xp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetMonsterDrawY(MonsterStruct *pMonster, int yp)
|
||||||
|
{
|
||||||
|
yp += pMonster->_myoff;
|
||||||
|
if (MonsterUsesVisualLerp(pMonster) && MonsterHasVisualStep(pMonster))
|
||||||
|
yp += VisualHalfStep(pMonster->_myvel, 4);
|
||||||
|
|
||||||
|
return yp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetMissileDrawX(MissileStruct *pMiss, int xp)
|
||||||
|
{
|
||||||
|
xp += pMiss->_mixoff;
|
||||||
|
if (!(pMiss->_miAnimFlags & MFF_STATIC))
|
||||||
|
xp += VisualHalfStep(pMiss->_mixvel, 16);
|
||||||
|
|
||||||
|
return xp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetMissileDrawY(MissileStruct *pMiss, int yp)
|
||||||
|
{
|
||||||
|
yp += pMiss->_miyoff;
|
||||||
|
if (!(pMiss->_miAnimFlags & MFF_STATIC))
|
||||||
|
yp += VisualHalfStep(pMiss->_miyvel, 16);
|
||||||
|
|
||||||
|
return yp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetVisualLerpDensity(int animCnt, int animDelay)
|
||||||
|
{
|
||||||
|
int interp;
|
||||||
|
int progress;
|
||||||
|
int density;
|
||||||
|
|
||||||
|
if (animDelay <= 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
interp = gnRenderFrameInterp;
|
||||||
|
if (interp < 0)
|
||||||
|
interp = 0;
|
||||||
|
if (interp > 256)
|
||||||
|
interp = 256;
|
||||||
|
|
||||||
|
progress = animCnt * 256 + interp;
|
||||||
|
density = (progress * 4) / (animDelay * 256);
|
||||||
|
if (density < 1)
|
||||||
|
return 0;
|
||||||
|
if (density > 3)
|
||||||
|
density = 3;
|
||||||
|
|
||||||
|
return density;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetForwardFrame(int frame, int length, int add, BOOL allowWrap)
|
||||||
|
{
|
||||||
|
frame += add;
|
||||||
|
if (frame > length)
|
||||||
|
return allowWrap ? 1 : 0;
|
||||||
|
if (frame < 1)
|
||||||
|
return allowWrap ? length : 0;
|
||||||
|
|
||||||
|
return frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetPlayerLerpFrame(PlayerStruct *pPlayer, int *density)
|
||||||
|
{
|
||||||
|
*density = GetVisualLerpDensity(pPlayer->_pAnimCnt, pPlayer->_pAnimDelay);
|
||||||
|
if (*density == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return GetForwardFrame(pPlayer->_pAnimFrame, pPlayer->_pAnimLen, 1, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetMonsterLerpFrame(MonsterStruct *pMonster, int *density)
|
||||||
|
{
|
||||||
|
int add;
|
||||||
|
|
||||||
|
*density = GetVisualLerpDensity(pMonster->_mAnimCnt, pMonster->_mAnimDelay);
|
||||||
|
if (*density == 0 || (pMonster->_mFlags & MFLAG_STILL))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
add = (pMonster->_mFlags & MFLAG_BACKWARDS) ? -1 : 1;
|
||||||
|
return GetForwardFrame(pMonster->_mAnimFrame, pMonster->_mAnimLen, add, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int GetMissileLerpFrame(MissileStruct *pMiss, int *density)
|
||||||
|
{
|
||||||
|
*density = GetVisualLerpDensity(pMiss->_miAnimCnt, pMiss->_miAnimDelay);
|
||||||
|
if (*density == 0 || (pMiss->_miAnimFlags & MFF_STATIC))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return GetForwardFrame(pMiss->_miAnimFrame, pMiss->_miAnimLen, pMiss->_miAnimAdd, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if RLE_DRAW
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static void DrawMissileLerpOverlay(MissileStruct *pMiss, int mx, int my, int ds, int de, BOOL clipped)
|
||||||
|
{
|
||||||
|
int density, nextFrame;
|
||||||
|
|
||||||
|
nextFrame = GetMissileLerpFrame(pMiss, &density);
|
||||||
|
if (!nextFrame)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (pMiss->_miUniqTrans) {
|
||||||
|
if (clipped)
|
||||||
|
DrawInfraUnitLerpOverlayClipped(mx, my, pMiss->_miAnimData, nextFrame, pMiss->_miAnimWidth, ds, de, LIGHT_U + pMiss->_miUniqTrans - 1, density);
|
||||||
|
else
|
||||||
|
DrawInfraUnitLerpOverlay(mx, my, pMiss->_miAnimData, nextFrame, pMiss->_miAnimWidth, ds, de, LIGHT_U + pMiss->_miUniqTrans - 1, density);
|
||||||
|
} else if (pMiss->_miLightFlag) {
|
||||||
|
if (clipped)
|
||||||
|
DrawLitUnitLerpOverlayClipped(mx, my, pMiss->_miAnimData, nextFrame, pMiss->_miAnimWidth, ds, de, density);
|
||||||
|
else
|
||||||
|
DrawLitUnitLerpOverlay(mx, my, pMiss->_miAnimData, nextFrame, pMiss->_miAnimWidth, ds, de, density);
|
||||||
|
} else {
|
||||||
|
if (clipped)
|
||||||
|
DrawUnitLerpOverlayClipped(mx, my, pMiss->_miAnimData, nextFrame, pMiss->_miAnimWidth, ds, de, density);
|
||||||
|
else
|
||||||
|
DrawUnitLerpOverlay(mx, my, pMiss->_miAnimData, nextFrame, pMiss->_miAnimWidth, ds, de, density);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
void ApplyWorldGoldShimmer(ItemStruct *pItem, int itemIndex, int x, int y, int ostart, int oend)
|
||||||
|
{
|
||||||
|
int row, col, frame, fleck, run, xx, yy;
|
||||||
|
int nWidth, nCel;
|
||||||
|
long RLELen, offval, offval2;
|
||||||
|
BYTE *pFrame;
|
||||||
|
BYTE *pRLE;
|
||||||
|
BYTE *pEnd;
|
||||||
|
|
||||||
|
if (!gbWorldGoldShimmerActive || gpBuffer == NULL || pItem->_itype != IT_GOLD)
|
||||||
|
return;
|
||||||
|
|
||||||
|
nCel = pItem->_iAnimFrame;
|
||||||
|
nWidth = pItem->_iAnimWidth;
|
||||||
|
if (pItem->_iAnimData == NULL || nCel < 1 || nWidth <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pFrame = pItem->_iAnimData + *((DWORD *)pItem->_iAnimData + nCel);
|
||||||
|
offval = *(WORD *)(pFrame + ostart);
|
||||||
|
if (!offval)
|
||||||
|
return;
|
||||||
|
RLELen = *((DWORD *)pItem->_iAnimData + nCel + 1) - *((DWORD *)pItem->_iAnimData + nCel);
|
||||||
|
offval2 = (oend == 8) ? 0 : *(WORD *)(pFrame + oend);
|
||||||
|
RLELen = offval2 ? offval2 - offval : RLELen - offval;
|
||||||
|
pRLE = pFrame + offval;
|
||||||
|
pEnd = pRLE + RLELen;
|
||||||
|
|
||||||
|
y -= ostart << 4;
|
||||||
|
frame = (GetTickCount() / 130) + itemIndex * 17 + pItem->_ix * 5 + pItem->_iy * 11;
|
||||||
|
for (row = 0; pRLE < pEnd; row++) {
|
||||||
|
yy = y - row;
|
||||||
|
col = 0;
|
||||||
|
while (col < nWidth && pRLE < pEnd) {
|
||||||
|
run = (signed char)*pRLE++;
|
||||||
|
if (run >= 0) {
|
||||||
|
if (run == 0)
|
||||||
|
break;
|
||||||
|
for (int i = 0; i < run; i++) {
|
||||||
|
xx = x + col + i;
|
||||||
|
if (xx >= 0 && xx < BUFFERX && yy >= 0 && yy < BUFFERY) {
|
||||||
|
BYTE *p = gpBuffer + nBuffWTbl[yy] + xx;
|
||||||
|
fleck = (row * 37 + (col + i) * 53 + frame * 29) & 31;
|
||||||
|
if (*p != IOUTC)
|
||||||
|
*p = gbWorldGoldShimmerTable[fleck < 5 ? 1 : 3][*p];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pRLE += run;
|
||||||
|
col += run;
|
||||||
|
} else {
|
||||||
|
col -= run;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//******************************************************************
|
//******************************************************************
|
||||||
// savecrsr variables
|
// savecrsr variables
|
||||||
//******************************************************************
|
//******************************************************************
|
||||||
@@ -229,8 +579,8 @@ void DrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
if (dMissile[sx][sy] != -1) {
|
if (dMissile[sx][sy] != -1) {
|
||||||
gnMI = dMissile[sx][sy] - 1;
|
gnMI = dMissile[sx][sy] - 1;
|
||||||
if(missile[gnMI]._miPreFlag == pre) {
|
if(missile[gnMI]._miPreFlag == pre) {
|
||||||
mx = missile[gnMI]._mixoff + xp - missile[gnMI]._miAnimWidth2;
|
mx = GetMissileDrawX(&missile[gnMI], xp) - missile[gnMI]._miAnimWidth2;
|
||||||
my = missile[gnMI]._miyoff + yp;
|
my = GetMissileDrawY(&missile[gnMI], yp);
|
||||||
if (missile[gnMI]._miUniqTrans) {
|
if (missile[gnMI]._miUniqTrans) {
|
||||||
DrawSlabCelI(mx, my, missile[gnMI]._miAnimData, missile[gnMI]._miAnimFrame, missile[gnMI]._miAnimWidth, ds, de, LIGHT_U + missile[gnMI]._miUniqTrans - 1);
|
DrawSlabCelI(mx, my, missile[gnMI]._miAnimData, missile[gnMI]._miAnimFrame, missile[gnMI]._miAnimWidth, ds, de, LIGHT_U + missile[gnMI]._miUniqTrans - 1);
|
||||||
}
|
}
|
||||||
@@ -250,8 +600,8 @@ void DrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
if ((missile[gnMI]._mix == sx) && (missile[gnMI]._miy == sy)
|
if ((missile[gnMI]._mix == sx) && (missile[gnMI]._miy == sy)
|
||||||
&& (missile[gnMI]._miPreFlag == pre) && (missile[gnMI]._miDrawFlag == TRUE))
|
&& (missile[gnMI]._miPreFlag == pre) && (missile[gnMI]._miDrawFlag == TRUE))
|
||||||
{
|
{
|
||||||
mx = missile[gnMI]._mixoff + xp - missile[gnMI]._miAnimWidth2;
|
mx = GetMissileDrawX(&missile[gnMI], xp) - missile[gnMI]._miAnimWidth2;
|
||||||
my = missile[gnMI]._miyoff + yp;
|
my = GetMissileDrawY(&missile[gnMI], yp);
|
||||||
if (missile[gnMI]._miUniqTrans) {
|
if (missile[gnMI]._miUniqTrans) {
|
||||||
DrawSlabCelI(mx, my, missile[gnMI]._miAnimData, missile[gnMI]._miAnimFrame, missile[gnMI]._miAnimWidth, ds, de, LIGHT_U + missile[gnMI]._miUniqTrans - 1);
|
DrawSlabCelI(mx, my, missile[gnMI]._miAnimData, missile[gnMI]._miAnimFrame, missile[gnMI]._miAnimWidth, ds, de, LIGHT_U + missile[gnMI]._miUniqTrans - 1);
|
||||||
}
|
}
|
||||||
@@ -280,8 +630,8 @@ void CDrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
if (dMissile[sx][sy] != -1) {
|
if (dMissile[sx][sy] != -1) {
|
||||||
gnMI = dMissile[sx][sy] - 1;
|
gnMI = dMissile[sx][sy] - 1;
|
||||||
if (missile[gnMI]._miPreFlag == pre) {
|
if (missile[gnMI]._miPreFlag == pre) {
|
||||||
mx = missile[gnMI]._mixoff + xp - missile[gnMI]._miAnimWidth2;
|
mx = GetMissileDrawX(&missile[gnMI], xp) - missile[gnMI]._miAnimWidth2;
|
||||||
my = missile[gnMI]._miyoff + yp;
|
my = GetMissileDrawY(&missile[gnMI], yp);
|
||||||
if (missile[gnMI]._miUniqTrans)
|
if (missile[gnMI]._miUniqTrans)
|
||||||
CDrawSlabCelI(mx, my, missile[gnMI]._miAnimData, missile[gnMI]._miAnimFrame, missile[gnMI]._miAnimWidth, ds, de, LIGHT_U + missile[gnMI]._miUniqTrans - 1);
|
CDrawSlabCelI(mx, my, missile[gnMI]._miAnimData, missile[gnMI]._miAnimFrame, missile[gnMI]._miAnimWidth, ds, de, LIGHT_U + missile[gnMI]._miUniqTrans - 1);
|
||||||
else {
|
else {
|
||||||
@@ -295,8 +645,8 @@ void CDrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
if ((missile[gnMI]._mix == sx) && (missile[gnMI]._miy == sy)
|
if ((missile[gnMI]._mix == sx) && (missile[gnMI]._miy == sy)
|
||||||
&& (missile[gnMI]._miPreFlag == pre) && (missile[gnMI]._miDrawFlag == TRUE))
|
&& (missile[gnMI]._miPreFlag == pre) && (missile[gnMI]._miDrawFlag == TRUE))
|
||||||
{
|
{
|
||||||
mx = missile[gnMI]._mixoff + xp - missile[gnMI]._miAnimWidth2;
|
mx = GetMissileDrawX(&missile[gnMI], xp) - missile[gnMI]._miAnimWidth2;
|
||||||
my = missile[gnMI]._miyoff + yp;
|
my = GetMissileDrawY(&missile[gnMI], yp);
|
||||||
if (missile[gnMI]._miUniqTrans)
|
if (missile[gnMI]._miUniqTrans)
|
||||||
CDrawSlabCelI(mx, my, missile[gnMI]._miAnimData, missile[gnMI]._miAnimFrame, missile[gnMI]._miAnimWidth, ds, de, LIGHT_U + missile[gnMI]._miUniqTrans - 1);
|
CDrawSlabCelI(mx, my, missile[gnMI]._miAnimData, missile[gnMI]._miAnimFrame, missile[gnMI]._miAnimWidth, ds, de, LIGHT_U + missile[gnMI]._miUniqTrans - 1);
|
||||||
else {
|
else {
|
||||||
@@ -353,8 +703,8 @@ void DrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
}
|
}
|
||||||
mx = pMiss->_mixoff + xp - pMiss->_miAnimWidth2;
|
mx = GetMissileDrawX(pMiss, xp) - pMiss->_miAnimWidth2;
|
||||||
my = pMiss->_miyoff + yp;
|
my = GetMissileDrawY(pMiss, yp);
|
||||||
if (pMiss->_miUniqTrans) {
|
if (pMiss->_miUniqTrans) {
|
||||||
DrawInfraUnit(
|
DrawInfraUnit(
|
||||||
mx, my,
|
mx, my,
|
||||||
@@ -369,6 +719,7 @@ void DrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
} else {
|
} else {
|
||||||
DrawUnit(mx, my, pMiss->_miAnimData, pMiss->_miAnimFrame, pMiss->_miAnimWidth, ds, de);
|
DrawUnit(mx, my, pMiss->_miAnimData, pMiss->_miAnimFrame, pMiss->_miAnimWidth, ds, de);
|
||||||
}
|
}
|
||||||
|
DrawMissileLerpOverlay(pMiss, mx, my, ds, de, FALSE);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -398,8 +749,8 @@ void DrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
}
|
}
|
||||||
mx = pMiss->_mixoff + xp - pMiss->_miAnimWidth2;
|
mx = GetMissileDrawX(pMiss, xp) - pMiss->_miAnimWidth2;
|
||||||
my = pMiss->_miyoff + yp;
|
my = GetMissileDrawY(pMiss, yp);
|
||||||
if (pMiss->_miUniqTrans) {
|
if (pMiss->_miUniqTrans) {
|
||||||
DrawInfraUnit(
|
DrawInfraUnit(
|
||||||
mx, my,
|
mx, my,
|
||||||
@@ -414,6 +765,7 @@ void DrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
} else {
|
} else {
|
||||||
DrawUnit(mx, my, pMiss->_miAnimData, pMiss->_miAnimFrame, pMiss->_miAnimWidth, ds, de);
|
DrawUnit(mx, my, pMiss->_miAnimData, pMiss->_miAnimFrame, pMiss->_miAnimWidth, ds, de);
|
||||||
}
|
}
|
||||||
|
DrawMissileLerpOverlay(pMiss, mx, my, ds, de, FALSE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -460,8 +812,8 @@ void CDrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
}
|
}
|
||||||
mx = pMiss->_mixoff + xp - pMiss->_miAnimWidth2;
|
mx = GetMissileDrawX(pMiss, xp) - pMiss->_miAnimWidth2;
|
||||||
my = pMiss->_miyoff + yp;
|
my = GetMissileDrawY(pMiss, yp);
|
||||||
if (pMiss->_miUniqTrans) {
|
if (pMiss->_miUniqTrans) {
|
||||||
DrawInfraUnitClipped(
|
DrawInfraUnitClipped(
|
||||||
mx, my,
|
mx, my,
|
||||||
@@ -476,6 +828,7 @@ void CDrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
} else {
|
} else {
|
||||||
DrawUnitClipped(mx,my,pMiss->_miAnimData,pMiss->_miAnimFrame,pMiss->_miAnimWidth,ds,de);
|
DrawUnitClipped(mx,my,pMiss->_miAnimData,pMiss->_miAnimFrame,pMiss->_miAnimWidth,ds,de);
|
||||||
}
|
}
|
||||||
|
DrawMissileLerpOverlay(pMiss, mx, my, ds, de, TRUE);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -505,8 +858,8 @@ void CDrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
}
|
}
|
||||||
mx = pMiss->_mixoff + xp - pMiss->_miAnimWidth2;
|
mx = GetMissileDrawX(pMiss, xp) - pMiss->_miAnimWidth2;
|
||||||
my = pMiss->_miyoff + yp;
|
my = GetMissileDrawY(pMiss, yp);
|
||||||
if (pMiss->_miUniqTrans) {
|
if (pMiss->_miUniqTrans) {
|
||||||
DrawInfraUnitClipped(
|
DrawInfraUnitClipped(
|
||||||
mx, my,
|
mx, my,
|
||||||
@@ -521,6 +874,7 @@ void CDrawMissile(int sx, int sy, int xp, int yp, int ds, int de, BOOL pre)
|
|||||||
} else {
|
} else {
|
||||||
DrawUnitClipped(mx,my,pMiss->_miAnimData,pMiss->_miAnimFrame,pMiss->_miAnimWidth,ds,de);
|
DrawUnitClipped(mx,my,pMiss->_miAnimData,pMiss->_miAnimFrame,pMiss->_miAnimWidth,ds,de);
|
||||||
}
|
}
|
||||||
|
DrawMissileLerpOverlay(pMiss, mx, my, ds, de, TRUE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -605,6 +959,8 @@ inline const char * MonsterActionString(DWORD dwAction) {
|
|||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
static void DrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart, int oend)
|
static void DrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart, int oend)
|
||||||
{
|
{
|
||||||
|
int density, nextFrame;
|
||||||
|
|
||||||
if ((DWORD)gnMI >= MAXMONSTERS)
|
if ((DWORD)gnMI >= MAXMONSTERS)
|
||||||
// jcm.patch1.start.1/14/97
|
// jcm.patch1.start.1/14/97
|
||||||
#ifdef GRACEFUL_EXIT
|
#ifdef GRACEFUL_EXIT
|
||||||
@@ -639,7 +995,7 @@ static void DrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart,
|
|||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
}
|
}
|
||||||
if (!(dFlags[sx][sy] & BFLAG_VISIBLE)) {
|
if (!(dFlags[sx][sy] & BFLAG_VISIBLE)) {
|
||||||
DrawInfraUnit(
|
DrawEnhancedInfraUnit(
|
||||||
xp, yp,
|
xp, yp,
|
||||||
monster[gnMI]._mAnimData,
|
monster[gnMI]._mAnimData,
|
||||||
monster[gnMI]._mAnimFrame,
|
monster[gnMI]._mAnimFrame,
|
||||||
@@ -648,6 +1004,9 @@ static void DrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart,
|
|||||||
oend,
|
oend,
|
||||||
LIGHT_INFRA
|
LIGHT_INFRA
|
||||||
);
|
);
|
||||||
|
nextFrame = GetMonsterLerpFrame(&monster[gnMI], &density);
|
||||||
|
if (nextFrame)
|
||||||
|
DrawInfraUnitLerpOverlay(xp, yp, monster[gnMI]._mAnimData, nextFrame, monster[gnMI].MType->mAnimWidth, ostart, oend, LIGHT_INFRA, density);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
char dinfra = LIGHT_NORM;
|
char dinfra = LIGHT_NORM;
|
||||||
@@ -658,7 +1017,7 @@ static void DrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart,
|
|||||||
if (plr[myplr]._pInfraFlag && (nLVal > 8))
|
if (plr[myplr]._pInfraFlag && (nLVal > 8))
|
||||||
dinfra = LIGHT_INFRA;
|
dinfra = LIGHT_INFRA;
|
||||||
if (dinfra != LIGHT_NORM)
|
if (dinfra != LIGHT_NORM)
|
||||||
DrawInfraUnit(
|
DrawEnhancedInfraUnit(
|
||||||
xp, yp,
|
xp, yp,
|
||||||
monster[gnMI]._mAnimData,
|
monster[gnMI]._mAnimData,
|
||||||
monster[gnMI]._mAnimFrame,
|
monster[gnMI]._mAnimFrame,
|
||||||
@@ -668,7 +1027,7 @@ static void DrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart,
|
|||||||
dinfra
|
dinfra
|
||||||
);
|
);
|
||||||
else
|
else
|
||||||
DrawLitUnit(
|
DrawEnhancedLitUnit(
|
||||||
xp, yp,
|
xp, yp,
|
||||||
monster[gnMI]._mAnimData,
|
monster[gnMI]._mAnimData,
|
||||||
monster[gnMI]._mAnimFrame,
|
monster[gnMI]._mAnimFrame,
|
||||||
@@ -676,6 +1035,13 @@ static void DrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart,
|
|||||||
ostart,
|
ostart,
|
||||||
oend
|
oend
|
||||||
);
|
);
|
||||||
|
nextFrame = GetMonsterLerpFrame(&monster[gnMI], &density);
|
||||||
|
if (nextFrame) {
|
||||||
|
if (dinfra != LIGHT_NORM)
|
||||||
|
DrawInfraUnitLerpOverlay(xp, yp, monster[gnMI]._mAnimData, nextFrame, monster[gnMI].MType->mAnimWidth, ostart, oend, dinfra, density);
|
||||||
|
else
|
||||||
|
DrawLitUnitLerpOverlay(xp, yp, monster[gnMI]._mAnimData, nextFrame, monster[gnMI].MType->mAnimWidth, ostart, oend, density);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -685,6 +1051,8 @@ static void DrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart,
|
|||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
static void CDrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart, int oend)
|
static void CDrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart, int oend)
|
||||||
{
|
{
|
||||||
|
int density, nextFrame;
|
||||||
|
|
||||||
if ((DWORD)gnMI >= MAXMONSTERS)
|
if ((DWORD)gnMI >= MAXMONSTERS)
|
||||||
// jcm.patch1.start.1/14/97
|
// jcm.patch1.start.1/14/97
|
||||||
#ifdef GRACEFUL_EXIT
|
#ifdef GRACEFUL_EXIT
|
||||||
@@ -719,7 +1087,7 @@ static void CDrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart
|
|||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
}
|
}
|
||||||
if (!(dFlags[sx][sy] & BFLAG_VISIBLE)) {
|
if (!(dFlags[sx][sy] & BFLAG_VISIBLE)) {
|
||||||
DrawInfraUnitClipped(
|
DrawEnhancedInfraUnitClipped(
|
||||||
xp, yp,
|
xp, yp,
|
||||||
monster[gnMI]._mAnimData,
|
monster[gnMI]._mAnimData,
|
||||||
monster[gnMI]._mAnimFrame,
|
monster[gnMI]._mAnimFrame,
|
||||||
@@ -728,6 +1096,9 @@ static void CDrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart
|
|||||||
oend,
|
oend,
|
||||||
LIGHT_INFRA
|
LIGHT_INFRA
|
||||||
);
|
);
|
||||||
|
nextFrame = GetMonsterLerpFrame(&monster[gnMI], &density);
|
||||||
|
if (nextFrame)
|
||||||
|
DrawInfraUnitLerpOverlayClipped(xp, yp, monster[gnMI]._mAnimData, nextFrame, monster[gnMI].MType->mAnimWidth, ostart, oend, LIGHT_INFRA, density);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
char dinfra = LIGHT_NORM;
|
char dinfra = LIGHT_NORM;
|
||||||
@@ -738,7 +1109,7 @@ static void CDrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart
|
|||||||
if (plr[myplr]._pInfraFlag && (nLVal > 8))
|
if (plr[myplr]._pInfraFlag && (nLVal > 8))
|
||||||
dinfra = LIGHT_INFRA;
|
dinfra = LIGHT_INFRA;
|
||||||
if (dinfra != LIGHT_NORM)
|
if (dinfra != LIGHT_NORM)
|
||||||
DrawInfraUnitClipped(
|
DrawEnhancedInfraUnitClipped(
|
||||||
xp, yp,
|
xp, yp,
|
||||||
monster[gnMI]._mAnimData,
|
monster[gnMI]._mAnimData,
|
||||||
monster[gnMI]._mAnimFrame,
|
monster[gnMI]._mAnimFrame,
|
||||||
@@ -748,7 +1119,7 @@ static void CDrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart
|
|||||||
dinfra
|
dinfra
|
||||||
);
|
);
|
||||||
else
|
else
|
||||||
DrawLitUnitClipped(
|
DrawEnhancedLitUnitClipped(
|
||||||
xp, yp,
|
xp, yp,
|
||||||
monster[gnMI]._mAnimData,
|
monster[gnMI]._mAnimData,
|
||||||
monster[gnMI]._mAnimFrame,
|
monster[gnMI]._mAnimFrame,
|
||||||
@@ -756,6 +1127,13 @@ static void CDrawMSlabCelL (int sx, int sy, int xp, int yp, int gnMI, int ostart
|
|||||||
ostart,
|
ostart,
|
||||||
oend
|
oend
|
||||||
);
|
);
|
||||||
|
nextFrame = GetMonsterLerpFrame(&monster[gnMI], &density);
|
||||||
|
if (nextFrame) {
|
||||||
|
if (dinfra != LIGHT_NORM)
|
||||||
|
DrawInfraUnitLerpOverlayClipped(xp, yp, monster[gnMI]._mAnimData, nextFrame, monster[gnMI].MType->mAnimWidth, ostart, oend, dinfra, density);
|
||||||
|
else
|
||||||
|
DrawLitUnitLerpOverlayClipped(xp, yp, monster[gnMI]._mAnimData, nextFrame, monster[gnMI].MType->mAnimWidth, ostart, oend, density);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -864,6 +1242,8 @@ inline const char * PlayerActionString(DWORD dwAction) {
|
|||||||
static void DrawPSlabCelL (
|
static void DrawPSlabCelL (
|
||||||
int nPlayer, int sx, int sy, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend)
|
int nPlayer, int sx, int sy, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend)
|
||||||
{
|
{
|
||||||
|
int density, nextFrame;
|
||||||
|
|
||||||
if (!(dFlags[sx][sy] & BFLAG_VISIBLE) && !plr[myplr]._pInfraFlag && (setlevel || currlevel))
|
if (!(dFlags[sx][sy] & BFLAG_VISIBLE) && !plr[myplr]._pInfraFlag && (setlevel || currlevel))
|
||||||
return;
|
return;
|
||||||
if (pCelBuff == NULL)
|
if (pCelBuff == NULL)
|
||||||
@@ -895,17 +1275,26 @@ static void DrawPSlabCelL (
|
|||||||
DrawUnitOutline(POUTC,xp,yp,pCelBuff,nCel,nCelW,ostart,oend);
|
DrawUnitOutline(POUTC,xp,yp,pCelBuff,nCel,nCelW,ostart,oend);
|
||||||
|
|
||||||
if (nPlayer == myplr) {
|
if (nPlayer == myplr) {
|
||||||
DrawUnit(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
DrawEnhancedUnit(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
||||||
|
nextFrame = GetPlayerLerpFrame(&plr[nPlayer], &density);
|
||||||
|
if (nextFrame)
|
||||||
|
DrawUnitLerpOverlay(xp, yp, pCelBuff, nextFrame, nCelW, ostart, oend, density);
|
||||||
}
|
}
|
||||||
else if (!(dFlags[sx][sy] & BFLAG_VISIBLE)
|
else if (!(dFlags[sx][sy] & BFLAG_VISIBLE)
|
||||||
|| plr[myplr]._pInfraFlag && (nLVal > 8)) {
|
|| plr[myplr]._pInfraFlag && (nLVal > 8)) {
|
||||||
DrawInfraUnit(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, LIGHT_INFRA);
|
DrawEnhancedInfraUnit(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, LIGHT_INFRA);
|
||||||
|
nextFrame = GetPlayerLerpFrame(&plr[nPlayer], &density);
|
||||||
|
if (nextFrame)
|
||||||
|
DrawInfraUnitLerpOverlay(xp, yp, pCelBuff, nextFrame, nCelW, ostart, oend, LIGHT_INFRA, density);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Draw other players slightly brighter than monsters
|
// Draw other players slightly brighter than monsters
|
||||||
int templval = nLVal;
|
int templval = nLVal;
|
||||||
nLVal = (nLVal < 5) ? 0 : nLVal - 5;
|
nLVal = (nLVal < 5) ? 0 : nLVal - 5;
|
||||||
DrawLitUnit(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
DrawEnhancedLitUnit(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
||||||
|
nextFrame = GetPlayerLerpFrame(&plr[nPlayer], &density);
|
||||||
|
if (nextFrame)
|
||||||
|
DrawLitUnitLerpOverlay(xp, yp, pCelBuff, nextFrame, nCelW, ostart, oend, density);
|
||||||
nLVal = templval;
|
nLVal = templval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -918,6 +1307,8 @@ static void DrawPSlabCelL (
|
|||||||
static void CDrawPSlabCelL (
|
static void CDrawPSlabCelL (
|
||||||
int nPlayer, int sx, int sy, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend)
|
int nPlayer, int sx, int sy, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend)
|
||||||
{
|
{
|
||||||
|
int density, nextFrame;
|
||||||
|
|
||||||
if (!(dFlags[sx][sy] & BFLAG_VISIBLE) && !plr[myplr]._pInfraFlag)
|
if (!(dFlags[sx][sy] & BFLAG_VISIBLE) && !plr[myplr]._pInfraFlag)
|
||||||
return;
|
return;
|
||||||
if (pCelBuff == NULL)
|
if (pCelBuff == NULL)
|
||||||
@@ -948,15 +1339,29 @@ static void CDrawPSlabCelL (
|
|||||||
if (nPlayer == cursplr)
|
if (nPlayer == cursplr)
|
||||||
DrawUnitOutlineClipped(POUTC,xp,yp,pCelBuff,nCel,nCelW,ostart,oend);
|
DrawUnitOutlineClipped(POUTC,xp,yp,pCelBuff,nCel,nCelW,ostart,oend);
|
||||||
if (nPlayer == myplr) {
|
if (nPlayer == myplr) {
|
||||||
DrawUnitClipped(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
DrawEnhancedUnitClipped(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
||||||
} else if (!(dFlags[sx][sy] & BFLAG_VISIBLE)
|
} else if (!(dFlags[sx][sy] & BFLAG_VISIBLE)
|
||||||
|| plr[myplr]._pInfraFlag && (nLVal > 8)) {
|
|| plr[myplr]._pInfraFlag && (nLVal > 8)) {
|
||||||
DrawInfraUnitClipped(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, LIGHT_INFRA);
|
DrawEnhancedInfraUnitClipped(xp, yp, pCelBuff, nCel, nCelW, ostart, oend, LIGHT_INFRA);
|
||||||
} else {
|
} else {
|
||||||
// Draw other players slightly brighter than monsters
|
// Draw other players slightly brighter than monsters
|
||||||
int templval = nLVal;
|
int templval = nLVal;
|
||||||
nLVal = (nLVal < 5) ? 0 : nLVal - 5;
|
nLVal = (nLVal < 5) ? 0 : nLVal - 5;
|
||||||
DrawLitUnitClipped(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
DrawEnhancedLitUnitClipped(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
||||||
|
nLVal = templval;
|
||||||
|
}
|
||||||
|
nextFrame = GetPlayerLerpFrame(&plr[nPlayer], &density);
|
||||||
|
if (!nextFrame)
|
||||||
|
return;
|
||||||
|
if (nPlayer == myplr) {
|
||||||
|
DrawUnitLerpOverlayClipped(xp, yp, pCelBuff, nextFrame, nCelW, ostart, oend, density);
|
||||||
|
} else if (!(dFlags[sx][sy] & BFLAG_VISIBLE)
|
||||||
|
|| plr[myplr]._pInfraFlag && (nLVal > 8)) {
|
||||||
|
DrawInfraUnitLerpOverlayClipped(xp, yp, pCelBuff, nextFrame, nCelW, ostart, oend, LIGHT_INFRA, density);
|
||||||
|
} else {
|
||||||
|
int templval = nLVal;
|
||||||
|
nLVal = (nLVal < 5) ? 0 : nLVal - 5;
|
||||||
|
DrawLitUnitLerpOverlayClipped(xp, yp, pCelBuff, nextFrame, nCelW, ostart, oend, density);
|
||||||
nLVal = templval;
|
nLVal = templval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1007,8 +1412,8 @@ void DrawDeadPlr(int sx, int sy, int xp, int yp, int ostart, int oend, BOOL clip
|
|||||||
}
|
}
|
||||||
dFlags[sx][sy] |= BFLAG_DEADPLR;
|
dFlags[sx][sy] |= BFLAG_DEADPLR;
|
||||||
PlayerDraw(pnum, sx, sy,
|
PlayerDraw(pnum, sx, sy,
|
||||||
pPlayer->_pxoff + xp - pPlayer->_pAnimWidth2,
|
GetPlayerDrawX(pPlayer, xp) - pPlayer->_pAnimWidth2,
|
||||||
pPlayer->_pyoff + yp,
|
GetPlayerDrawY(pPlayer, yp),
|
||||||
pPlayer->_pAnimData, pPlayer->_pAnimFrame, pPlayer->_pAnimWidth,
|
pPlayer->_pAnimData, pPlayer->_pAnimFrame, pPlayer->_pAnimWidth,
|
||||||
ostart, oend);
|
ostart, oend);
|
||||||
}
|
}
|
||||||
@@ -1158,7 +1563,7 @@ static void DrawEFlag1(BYTE *pTo2, int sx, int sy, int xp, int yp)
|
|||||||
oldnTrans = nTrans;
|
oldnTrans = nTrans;
|
||||||
oldPieceNum = gnPieceNum;
|
oldPieceNum = gnPieceNum;
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
|
||||||
@@ -1361,6 +1766,7 @@ static void DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chflag)
|
|||||||
0,
|
0,
|
||||||
8
|
8
|
||||||
);
|
);
|
||||||
|
ApplyWorldGoldShimmer(pItem, bItem - 1, pxp, yp, 0, 8);
|
||||||
}
|
}
|
||||||
// jcm.patch1.start.1/14/97
|
// jcm.patch1.start.1/14/97
|
||||||
#ifdef GRACEFUL_EXIT
|
#ifdef GRACEFUL_EXIT
|
||||||
@@ -1384,8 +1790,8 @@ static void DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chflag)
|
|||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
PlayerStruct * pPlayer = &plr[nPlayer];
|
PlayerStruct * pPlayer = &plr[nPlayer];
|
||||||
pxp = pPlayer->_pxoff + xp - pPlayer->_pAnimWidth2;
|
pxp = GetPlayerDrawX(pPlayer, xp) - pPlayer->_pAnimWidth2;
|
||||||
pyp = pPlayer->_pyoff + yp;
|
pyp = GetPlayerDrawY(pPlayer, yp);
|
||||||
CDrawPSlabCelL(
|
CDrawPSlabCelL(
|
||||||
-(bPlayerAbove + 1),
|
-(bPlayerAbove + 1),
|
||||||
sx, sy-1,
|
sx, sy-1,
|
||||||
@@ -1433,8 +1839,8 @@ static void DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chflag)
|
|||||||
app_fatal("Draw Monster \"%s\" Clipped: uninitialized monster",pMonster->mName);
|
app_fatal("Draw Monster \"%s\" Clipped: uninitialized monster",pMonster->mName);
|
||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
pxp = pMonster->_mxoff + xp - pMonster->MType->mAnimWidth2;
|
pxp = GetMonsterDrawX(pMonster, xp) - pMonster->MType->mAnimWidth2;
|
||||||
pyp = pMonster->_myoff + yp;
|
pyp = GetMonsterDrawY(pMonster, yp);
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (gnMI == cursmonst)
|
if (gnMI == cursmonst)
|
||||||
DrawUnitOutlineClipped(
|
DrawUnitOutlineClipped(
|
||||||
@@ -1488,8 +1894,8 @@ static void DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chflag)
|
|||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
PlayerStruct * pPlayer = &plr[nPlayer];
|
PlayerStruct * pPlayer = &plr[nPlayer];
|
||||||
pxp = pPlayer->_pxoff + xp - pPlayer->_pAnimWidth2;
|
pxp = GetPlayerDrawX(pPlayer, xp) - pPlayer->_pAnimWidth2;
|
||||||
pyp = pPlayer->_pyoff + yp;
|
pyp = GetPlayerDrawY(pPlayer, yp);
|
||||||
CDrawPSlabCelL(
|
CDrawPSlabCelL(
|
||||||
bPlayer - 1,
|
bPlayer - 1,
|
||||||
sx, sy,
|
sx, sy,
|
||||||
@@ -1537,8 +1943,8 @@ static void DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chflag)
|
|||||||
app_fatal("Draw Monster \"%s\" Clipped: uninitialized monster",pMonster->mName);
|
app_fatal("Draw Monster \"%s\" Clipped: uninitialized monster",pMonster->mName);
|
||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
pxp = pMonster->_mxoff + xp - pMonster->MType->mAnimWidth2;
|
pxp = GetMonsterDrawX(pMonster, xp) - pMonster->MType->mAnimWidth2;
|
||||||
pyp = pMonster->_myoff + yp;
|
pyp = GetMonsterDrawY(pMonster, yp);
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (gnMI == cursmonst)
|
if (gnMI == cursmonst)
|
||||||
DrawUnitOutlineClipped(
|
DrawUnitOutlineClipped(
|
||||||
@@ -1639,6 +2045,7 @@ static void DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chflag)
|
|||||||
0,
|
0,
|
||||||
8
|
8
|
||||||
);
|
);
|
||||||
|
ApplyWorldGoldShimmer(pItem, bItem - 1, pxp, yp, 0, 8);
|
||||||
}
|
}
|
||||||
// jcm.patch1.start.1/14/97
|
// jcm.patch1.start.1/14/97
|
||||||
#ifdef GRACEFUL_EXIT
|
#ifdef GRACEFUL_EXIT
|
||||||
@@ -1668,7 +2075,7 @@ static void DrawHTileLineX (int sx, int sy, int xp, int yp, int nd, int halfflag
|
|||||||
if (halfflag) {
|
if (halfflag) {
|
||||||
if (((unsigned)sy < DMAXY) && ((unsigned)sx < DMAXX)) {
|
if (((unsigned)sy < DMAXY) && ((unsigned)sx < DMAXX)) {
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
if (gnPieceNum) {
|
if (gnPieceNum) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp + 32;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp + 32;
|
||||||
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
||||||
@@ -1717,7 +2124,7 @@ static void DrawHTileLineX (int sx, int sy, int xp, int yp, int nd, int halfflag
|
|||||||
if (sy >= DMAXY || sx < 0)
|
if (sy >= DMAXY || sx < 0)
|
||||||
continue;
|
continue;
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
if (!gnPieceNum) {
|
if (!gnPieceNum) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
||||||
DrawBlankMTile(pTo);
|
DrawBlankMTile(pTo);
|
||||||
@@ -1748,7 +2155,7 @@ static void DrawHTileLineX (int sx, int sy, int xp, int yp, int nd, int halfflag
|
|||||||
if (!halfflag || !((unsigned)sy < DMAXY && (unsigned)sx < DMAXX))
|
if (!halfflag || !((unsigned)sy < DMAXY && (unsigned)sx < DMAXX))
|
||||||
return;
|
return;
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
if (!gnPieceNum) {
|
if (!gnPieceNum) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
||||||
DrawBlankMTile(pTo);
|
DrawBlankMTile(pTo);
|
||||||
@@ -1794,7 +2201,7 @@ static void DrawEFlag2(BYTE *pTo2, int sx, int sy, int sv, int sv2, int xp, int
|
|||||||
oldnTrans = nTrans;
|
oldnTrans = nTrans;
|
||||||
oldPieceNum = gnPieceNum;
|
oldPieceNum = gnPieceNum;
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
pTo = pTo2 + (NBUFFWSL5 * sv);
|
pTo = pTo2 + (NBUFFWSL5 * sv);
|
||||||
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
@@ -2005,6 +2412,7 @@ static void DrawHTLXsub2 (BYTE *pTo, int sx, int sy, int sv, int sv2, int xp, in
|
|||||||
sv2,
|
sv2,
|
||||||
8
|
8
|
||||||
);
|
);
|
||||||
|
ApplyWorldGoldShimmer(pItem, bItem - 1, pxp, yp, sv2, 8);
|
||||||
}
|
}
|
||||||
// jcm.patch1.start.1/14/97
|
// jcm.patch1.start.1/14/97
|
||||||
#ifdef GRACEFUL_EXIT
|
#ifdef GRACEFUL_EXIT
|
||||||
@@ -2028,8 +2436,8 @@ static void DrawHTLXsub2 (BYTE *pTo, int sx, int sy, int sv, int sv2, int xp, in
|
|||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
PlayerStruct * pPlayer = &plr[nPlayer];
|
PlayerStruct * pPlayer = &plr[nPlayer];
|
||||||
pxp = pPlayer->_pxoff + xp - pPlayer->_pAnimWidth2;
|
pxp = GetPlayerDrawX(pPlayer, xp) - pPlayer->_pAnimWidth2;
|
||||||
pyp = pPlayer->_pyoff + yp;
|
pyp = GetPlayerDrawY(pPlayer, yp);
|
||||||
CDrawPSlabCelL(
|
CDrawPSlabCelL(
|
||||||
-(bPlayerAbove + 1),
|
-(bPlayerAbove + 1),
|
||||||
sx, sy-1,
|
sx, sy-1,
|
||||||
@@ -2077,8 +2485,8 @@ static void DrawHTLXsub2 (BYTE *pTo, int sx, int sy, int sv, int sv2, int xp, in
|
|||||||
app_fatal("Draw Monster \"%s\" Clipped: uninitialized monster",pMonster->mName);
|
app_fatal("Draw Monster \"%s\" Clipped: uninitialized monster",pMonster->mName);
|
||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
pxp = pMonster->_mxoff + xp - pMonster->MType->mAnimWidth2;
|
pxp = GetMonsterDrawX(pMonster, xp) - pMonster->MType->mAnimWidth2;
|
||||||
pyp = pMonster->_myoff + yp;
|
pyp = GetMonsterDrawY(pMonster, yp);
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (gnMI == cursmonst)
|
if (gnMI == cursmonst)
|
||||||
DrawUnitOutlineClipped(
|
DrawUnitOutlineClipped(
|
||||||
@@ -2132,8 +2540,8 @@ static void DrawHTLXsub2 (BYTE *pTo, int sx, int sy, int sv, int sv2, int xp, in
|
|||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
PlayerStruct * pPlayer = &plr[nPlayer];
|
PlayerStruct * pPlayer = &plr[nPlayer];
|
||||||
pxp = pPlayer->_pxoff + xp - pPlayer->_pAnimWidth2;
|
pxp = GetPlayerDrawX(pPlayer, xp) - pPlayer->_pAnimWidth2;
|
||||||
pyp = pPlayer->_pyoff + yp;
|
pyp = GetPlayerDrawY(pPlayer, yp);
|
||||||
CDrawPSlabCelL(
|
CDrawPSlabCelL(
|
||||||
bPlayer - 1,
|
bPlayer - 1,
|
||||||
sx, sy,
|
sx, sy,
|
||||||
@@ -2181,8 +2589,8 @@ static void DrawHTLXsub2 (BYTE *pTo, int sx, int sy, int sv, int sv2, int xp, in
|
|||||||
app_fatal("Draw Monster \"%s\" Clipped: uninitialized monster",pMonster->mName);
|
app_fatal("Draw Monster \"%s\" Clipped: uninitialized monster",pMonster->mName);
|
||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
pxp = pMonster->_mxoff + xp - pMonster->MType->mAnimWidth2;
|
pxp = GetMonsterDrawX(pMonster, xp) - pMonster->MType->mAnimWidth2;
|
||||||
pyp = pMonster->_myoff + yp;
|
pyp = GetMonsterDrawY(pMonster, yp);
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (gnMI == cursmonst)
|
if (gnMI == cursmonst)
|
||||||
DrawUnitOutlineClipped(
|
DrawUnitOutlineClipped(
|
||||||
@@ -2283,6 +2691,7 @@ static void DrawHTLXsub2 (BYTE *pTo, int sx, int sy, int sv, int sv2, int xp, in
|
|||||||
sv2,
|
sv2,
|
||||||
8
|
8
|
||||||
);
|
);
|
||||||
|
ApplyWorldGoldShimmer(pItem, bItem - 1, pxp, yp, sv2, 8);
|
||||||
}
|
}
|
||||||
// jcm.patch1.start.1/14/97
|
// jcm.patch1.start.1/14/97
|
||||||
#ifdef GRACEFUL_EXIT
|
#ifdef GRACEFUL_EXIT
|
||||||
@@ -2314,7 +2723,7 @@ static void DrawHTLX2 (int sx, int sy, int xp, int yp, int nd, int sv, int halff
|
|||||||
if (halfflag != 0) {
|
if (halfflag != 0) {
|
||||||
if ((sy >= 0) && (sy < DMAXY) && (sx >= 0) && (sx < DMAXX)) {
|
if ((sy >= 0) && (sy < DMAXY) && (sx >= 0) && (sx < DMAXX)) {
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
if (gnPieceNum != 0) {
|
if (gnPieceNum != 0) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp - NBUFFWSL5 + 32;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp - NBUFFWSL5 + 32;
|
||||||
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
||||||
@@ -2342,7 +2751,7 @@ static void DrawHTLX2 (int sx, int sy, int xp, int yp, int nd, int sv, int halff
|
|||||||
if (sy >= DMAXY || sx < 0)
|
if (sy >= DMAXY || sx < 0)
|
||||||
continue;
|
continue;
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
if (!gnPieceNum)
|
if (!gnPieceNum)
|
||||||
continue;
|
continue;
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp - NBUFFWSL5;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp - NBUFFWSL5;
|
||||||
@@ -2368,7 +2777,7 @@ static void DrawHTLX2 (int sx, int sy, int xp, int yp, int nd, int sv, int halff
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
|
|
||||||
if (!gnPieceNum)
|
if (!gnPieceNum)
|
||||||
return;
|
return;
|
||||||
@@ -2404,7 +2813,7 @@ static void DrawEFlag3(BYTE *pTo2, int sx, int sy, int ev, int ev2, int xp, int
|
|||||||
oldnTrans = nTrans;
|
oldnTrans = nTrans;
|
||||||
oldPieceNum = gnPieceNum;
|
oldPieceNum = gnPieceNum;
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
pTo = pTo2;
|
pTo = pTo2;
|
||||||
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
@@ -2605,6 +3014,7 @@ static void DrawHTLXsub3 (BYTE *pTo, int sx, int sy, int ev, int ev2, int xp, in
|
|||||||
0,
|
0,
|
||||||
ev2//diff
|
ev2//diff
|
||||||
);
|
);
|
||||||
|
ApplyWorldGoldShimmer(pItem, bItem - 1, pxp, yp, 0, ev2);
|
||||||
}
|
}
|
||||||
// jcm.patch1.start.1/14/97
|
// jcm.patch1.start.1/14/97
|
||||||
#ifdef GRACEFUL_EXIT
|
#ifdef GRACEFUL_EXIT
|
||||||
@@ -2628,8 +3038,8 @@ static void DrawHTLXsub3 (BYTE *pTo, int sx, int sy, int ev, int ev2, int xp, in
|
|||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
PlayerStruct * pPlayer = &plr[nPlayer];
|
PlayerStruct * pPlayer = &plr[nPlayer];
|
||||||
pxp = pPlayer->_pxoff + xp - pPlayer->_pAnimWidth2;
|
pxp = GetPlayerDrawX(pPlayer, xp) - pPlayer->_pAnimWidth2;
|
||||||
pyp = pPlayer->_pyoff + yp;
|
pyp = GetPlayerDrawY(pPlayer, yp);
|
||||||
DrawPSlabCelL(
|
DrawPSlabCelL(
|
||||||
-(bPlayerAbove + 1),
|
-(bPlayerAbove + 1),
|
||||||
sx, sy-1,
|
sx, sy-1,
|
||||||
@@ -2677,8 +3087,8 @@ static void DrawHTLXsub3 (BYTE *pTo, int sx, int sy, int ev, int ev2, int xp, in
|
|||||||
app_fatal("Draw Monster \"%s\": uninitialized monster",pMonster->mName);
|
app_fatal("Draw Monster \"%s\": uninitialized monster",pMonster->mName);
|
||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
pxp = pMonster->_mxoff + xp - pMonster->MType->mAnimWidth2;
|
pxp = GetMonsterDrawX(pMonster, xp) - pMonster->MType->mAnimWidth2;
|
||||||
pyp = pMonster->_myoff + yp;
|
pyp = GetMonsterDrawY(pMonster, yp);
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (gnMI == cursmonst)
|
if (gnMI == cursmonst)
|
||||||
DrawUnitOutline(
|
DrawUnitOutline(
|
||||||
@@ -2732,8 +3142,8 @@ static void DrawHTLXsub3 (BYTE *pTo, int sx, int sy, int ev, int ev2, int xp, in
|
|||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
PlayerStruct * pPlayer = &plr[nPlayer];
|
PlayerStruct * pPlayer = &plr[nPlayer];
|
||||||
pxp = pPlayer->_pxoff + xp - pPlayer->_pAnimWidth2;
|
pxp = GetPlayerDrawX(pPlayer, xp) - pPlayer->_pAnimWidth2;
|
||||||
pyp = pPlayer->_pyoff + yp;
|
pyp = GetPlayerDrawY(pPlayer, yp);
|
||||||
DrawPSlabCelL(
|
DrawPSlabCelL(
|
||||||
bPlayer - 1,
|
bPlayer - 1,
|
||||||
sx, sy,
|
sx, sy,
|
||||||
@@ -2781,8 +3191,8 @@ static void DrawHTLXsub3 (BYTE *pTo, int sx, int sy, int ev, int ev2, int xp, in
|
|||||||
app_fatal("Draw Monster \"%s\": uninitialized monster",pMonster->mName);
|
app_fatal("Draw Monster \"%s\": uninitialized monster",pMonster->mName);
|
||||||
#endif
|
#endif
|
||||||
// jcm.patch1.end.1/14/97
|
// jcm.patch1.end.1/14/97
|
||||||
pxp = pMonster->_mxoff + xp - pMonster->MType->mAnimWidth2;
|
pxp = GetMonsterDrawX(pMonster, xp) - pMonster->MType->mAnimWidth2;
|
||||||
pyp = pMonster->_myoff + yp;
|
pyp = GetMonsterDrawY(pMonster, yp);
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (gnMI == cursmonst)
|
if (gnMI == cursmonst)
|
||||||
DrawUnitOutline(
|
DrawUnitOutline(
|
||||||
@@ -2883,6 +3293,7 @@ static void DrawHTLXsub3 (BYTE *pTo, int sx, int sy, int ev, int ev2, int xp, in
|
|||||||
0,
|
0,
|
||||||
ev2
|
ev2
|
||||||
);
|
);
|
||||||
|
ApplyWorldGoldShimmer(pItem, bItem - 1, pxp, yp, 0, ev2);
|
||||||
}
|
}
|
||||||
// jcm.patch1.start.1/14/97
|
// jcm.patch1.start.1/14/97
|
||||||
#ifdef GRACEFUL_EXIT
|
#ifdef GRACEFUL_EXIT
|
||||||
@@ -2915,7 +3326,7 @@ static void DrawHTLX3 (int sx, int sy, int xp, int yp, int nd, int ev, int halff
|
|||||||
if (halfflag != 0) {
|
if (halfflag != 0) {
|
||||||
if ((sy >= 0) && (sy < DMAXY) && (sx >= 0) && (sx < DMAXX)) {
|
if ((sy >= 0) && (sy < DMAXY) && (sx >= 0) && (sx < DMAXX)) {
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
if (gnPieceNum != 0) {
|
if (gnPieceNum != 0) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp + 32;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp + 32;
|
||||||
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
||||||
@@ -2954,7 +3365,7 @@ static void DrawHTLX3 (int sx, int sy, int xp, int yp, int nd, int ev, int halff
|
|||||||
for (i = 0; i < nd; ++i) {
|
for (i = 0; i < nd; ++i) {
|
||||||
if ((sy >= 0) && (sy < DMAXY) && (sx >= 0) && (sx < DMAXX)) {
|
if ((sy >= 0) && (sy < DMAXY) && (sx >= 0) && (sx < DMAXX)) {
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
if (gnPieceNum != 0) {
|
if (gnPieceNum != 0) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
||||||
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
||||||
@@ -2990,7 +3401,7 @@ static void DrawHTLX3 (int sx, int sy, int xp, int yp, int nd, int ev, int halff
|
|||||||
if (halfflag != 0) {
|
if (halfflag != 0) {
|
||||||
if ((sy >= 0) && (sy < DMAXY) && (sx >= 0) && (sx < DMAXX)) {
|
if ((sy >= 0) && (sy < DMAXY) && (sx >= 0) && (sx < DMAXX)) {
|
||||||
gnPieceNum = dPiece[sx][sy];
|
gnPieceNum = dPiece[sx][sy];
|
||||||
nLVal = dLight[sx][sy];
|
SetDungeonLightContext(sx, sy, xp, yp);
|
||||||
if (gnPieceNum != 0) {
|
if (gnPieceNum != 0) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
||||||
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
nTrans = TransList[dTransVal[sx][sy]] & nTransTable[gnPieceNum];
|
||||||
@@ -3032,8 +3443,8 @@ static void SVGADrawView(int StartX, int StartY)
|
|||||||
ViewBX = 10;
|
ViewBX = 10;
|
||||||
ViewBY = 11;
|
ViewBY = 11;
|
||||||
|
|
||||||
xpos = 64 + ScrollInfo._sxoff;
|
xpos = 64 + GetScrollDrawX();
|
||||||
ypos = 175 + ScrollInfo._syoff;
|
ypos = 175 + GetScrollDrawY();
|
||||||
StartX -= 10;
|
StartX -= 10;
|
||||||
StartY -= 1;
|
StartY -= 1;
|
||||||
width = 10;
|
width = 10;
|
||||||
@@ -3139,8 +3550,8 @@ static void VGADrawView (int StartX, int StartY)
|
|||||||
ViewBX = 6;
|
ViewBX = 6;
|
||||||
ViewBY = 6;
|
ViewBY = 6;
|
||||||
|
|
||||||
xpos = 64 + ScrollInfo._sxoff;
|
xpos = 64 + GetScrollDrawX();
|
||||||
ypos = 143 + ScrollInfo._syoff;
|
ypos = 143 + GetScrollDrawY();
|
||||||
StartX -= 6;
|
StartX -= 6;
|
||||||
StartY -= 1;
|
StartY -= 1;
|
||||||
width = 6;
|
width = 6;
|
||||||
|
|||||||
+118
@@ -94,6 +94,16 @@ extern "C" {
|
|||||||
extern BYTE* pDungeonCels;
|
extern BYTE* pDungeonCels;
|
||||||
extern BYTE* pSpeedCels;
|
extern BYTE* pSpeedCels;
|
||||||
extern BYTE nWTypeTable[];
|
extern BYTE nWTypeTable[];
|
||||||
|
extern BYTE gbLevelTileEnhanceActive;
|
||||||
|
extern BYTE gbLevelTileContrastTable[];
|
||||||
|
extern BYTE gbLevelTileLumaTable[];
|
||||||
|
extern BYTE gbLevelTileSharpenLightTable[];
|
||||||
|
extern BYTE gbLevelTileAoTable[];
|
||||||
|
extern BYTE gbTownWarmFlickerActive;
|
||||||
|
extern BYTE gbTownWarmFlickerTable[][256];
|
||||||
|
extern int32_t gnTownTileX;
|
||||||
|
extern int32_t gnTownTileY;
|
||||||
|
extern int32_t gnTownFlickerFrame;
|
||||||
#else
|
#else
|
||||||
int32_t nLVal;
|
int32_t nLVal;
|
||||||
BYTE* glClipY;
|
BYTE* glClipY;
|
||||||
@@ -109,6 +119,16 @@ extern "C" {
|
|||||||
BYTE* pDungeonCels;
|
BYTE* pDungeonCels;
|
||||||
BYTE* pSpeedCels;
|
BYTE* pSpeedCels;
|
||||||
BYTE nWTypeTable[4096];
|
BYTE nWTypeTable[4096];
|
||||||
|
BYTE gbLevelTileEnhanceActive;
|
||||||
|
BYTE gbLevelTileContrastTable[256];
|
||||||
|
BYTE gbLevelTileLumaTable[256];
|
||||||
|
BYTE gbLevelTileSharpenLightTable[256];
|
||||||
|
BYTE gbLevelTileAoTable[256];
|
||||||
|
BYTE gbTownWarmFlickerActive;
|
||||||
|
BYTE gbTownWarmFlickerTable[4][256];
|
||||||
|
int32_t gnTownTileX;
|
||||||
|
int32_t gnTownTileY;
|
||||||
|
int32_t gnTownFlickerFrame;
|
||||||
#endif
|
#endif
|
||||||
#if defined(__cplusplus) && SCROLL_PORT_EXTERN_C_GLOBALS
|
#if defined(__cplusplus) && SCROLL_PORT_EXTERN_C_GLOBALS
|
||||||
}
|
}
|
||||||
@@ -377,6 +397,96 @@ static int PixelSelected(const RenderCtx* ctx, int x)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int InTownLightRect(int x, int y, int cx, int cy, int rx, int ry)
|
||||||
|
{
|
||||||
|
return x >= cx - rx && x <= cx + rx && y >= cy - ry && y <= cy + ry;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int TownWarmLightPhase(void)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (!gbTownWarmFlickerActive) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
x = gnTownTileX;
|
||||||
|
y = gnTownTileY;
|
||||||
|
if (x < 0 || y < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InTownLightRect(x, y, 55, 60, 11, 6)) /* tavern main building */
|
||||||
|
return gnTownFlickerFrame & 3;
|
||||||
|
if (InTownLightRect(x, y, 55, 68, 6, 2)) /* tavern outside spill */
|
||||||
|
return (gnTownFlickerFrame / 2 + 1) & 3;
|
||||||
|
if (InTownLightRect(x, y, 62, 63, 9, 7)) /* smith */
|
||||||
|
return (gnTownFlickerFrame / 2 + 2) & 3;
|
||||||
|
if (InTownLightRect(x, y, 55, 79, 9, 7)) /* healer */
|
||||||
|
return ((gnTownFlickerFrame * 3) / 2 + 1) & 3;
|
||||||
|
if (InTownLightRect(x, y, 80, 20, 10, 8)) /* witch */
|
||||||
|
return (gnTownFlickerFrame / 3 + 3) & 3;
|
||||||
|
if (InTownLightRect(x, y, 62, 16, 9, 7)) /* farmhouse */
|
||||||
|
return ((gnTownFlickerFrame * 2) / 3 + 1) & 3;
|
||||||
|
if (InTownLightRect(x, y, 24, 32, 8, 6)) /* wounded townsman house */
|
||||||
|
return ((gnTownFlickerFrame * 3) / 4 + 2) & 3;
|
||||||
|
if (InTownLightRect(x, y, 75, 68, 9, 7)) /* player house */
|
||||||
|
return ((gnTownFlickerFrame * 4) / 3 + 3) & 3;
|
||||||
|
if (InTownLightRect(x, y, 71, 84, 8, 6)) /* Farnham's house */
|
||||||
|
return ((gnTownFlickerFrame * 5) / 4 + 1) & 3;
|
||||||
|
if (InTownLightRect(x, y, 43, 66, 8, 6)) /* Gillian's house */
|
||||||
|
return ((gnTownFlickerFrame * 2) / 5 + 2) & 3;
|
||||||
|
if (InTownLightRect(x, y, 49, 21, 9, 7)) /* town portal house */
|
||||||
|
return ((gnTownFlickerFrame * 5) / 3 + 3) & 3;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BYTE TownWarmFlickerPixel(BYTE pixel)
|
||||||
|
{
|
||||||
|
int phase;
|
||||||
|
|
||||||
|
phase = TownWarmLightPhase();
|
||||||
|
if (phase < 0) {
|
||||||
|
return pixel;
|
||||||
|
}
|
||||||
|
|
||||||
|
return gbTownWarmFlickerTable[phase][pixel];
|
||||||
|
}
|
||||||
|
|
||||||
|
static BYTE LevelTilePixel(const BYTE* src, const BYTE* lightTbl, int i, int count)
|
||||||
|
{
|
||||||
|
BYTE pixel;
|
||||||
|
int left, right, curr, nearAvg, darkest;
|
||||||
|
|
||||||
|
pixel = gbLevelTileContrastTable[src[i]];
|
||||||
|
if (lightTbl != NULL) {
|
||||||
|
pixel = lightTbl[pixel];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i <= 0 || i + 1 >= count) {
|
||||||
|
return TownWarmFlickerPixel(pixel);
|
||||||
|
}
|
||||||
|
|
||||||
|
left = gbLevelTileLumaTable[src[i - 1]];
|
||||||
|
right = gbLevelTileLumaTable[src[i + 1]];
|
||||||
|
curr = gbLevelTileLumaTable[src[i]];
|
||||||
|
nearAvg = (left + right) >> 1;
|
||||||
|
darkest = (left < right) ? left : right;
|
||||||
|
|
||||||
|
if (nearAvg - curr > 12) {
|
||||||
|
return TownWarmFlickerPixel(gbLevelTileAoTable[pixel]);
|
||||||
|
}
|
||||||
|
if (curr - darkest > 20 && curr < 220) {
|
||||||
|
return TownWarmFlickerPixel(gbLevelTileAoTable[pixel]);
|
||||||
|
}
|
||||||
|
if (curr - nearAvg > 22) {
|
||||||
|
return TownWarmFlickerPixel(gbLevelTileSharpenLightTable[pixel]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TownWarmFlickerPixel(pixel);
|
||||||
|
}
|
||||||
|
|
||||||
static void DrawSpan(RenderCtx* ctx, int count, int xStart, PadMode pad, int draw)
|
static void DrawSpan(RenderCtx* ctx, int count, int xStart, PadMode pad, int draw)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -399,10 +509,18 @@ static void DrawSpan(RenderCtx* ctx, int count, int xStart, PadMode pad, int dra
|
|||||||
if (PixelSelected(ctx, xStart + i)) {
|
if (PixelSelected(ctx, xStart + i)) {
|
||||||
switch (ctx->pixelMode) {
|
switch (ctx->pixelMode) {
|
||||||
case PIXELS_LIGHT:
|
case PIXELS_LIGHT:
|
||||||
|
if (gbLevelTileEnhanceActive) {
|
||||||
|
dst[i] = LevelTilePixel(src, ctx->lightTbl, i, count);
|
||||||
|
} else {
|
||||||
dst[i] = ctx->lightTbl[src[i]];
|
dst[i] = ctx->lightTbl[src[i]];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case PIXELS_PRETRANS:
|
case PIXELS_PRETRANS:
|
||||||
|
if (gbLevelTileEnhanceActive) {
|
||||||
|
dst[i] = LevelTilePixel(src, NULL, i, count);
|
||||||
|
} else {
|
||||||
dst[i] = src[i];
|
dst[i] = src[i];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case PIXELS_BLACK:
|
case PIXELS_BLACK:
|
||||||
dst[i] = 0;
|
dst[i] = 0;
|
||||||
|
|||||||
+202
-2
@@ -410,6 +410,207 @@ BOOL CheckThemeRoom(int tv)
|
|||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int ThemeRoomExitCount(int tv)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
int exits;
|
||||||
|
|
||||||
|
exits = 0;
|
||||||
|
for (j = 1; j < DMAXY - 1; j++) {
|
||||||
|
for (i = 1; i < DMAXX - 1; i++) {
|
||||||
|
if ((dTransVal[i][j] == tv) && (!nSolidTable[dPiece[i][j]])) {
|
||||||
|
if ((dTransVal[i - 1][j] != tv) && (!nSolidTable[dPiece[i - 1][j]])) exits++;
|
||||||
|
if ((dTransVal[i + 1][j] != tv) && (!nSolidTable[dPiece[i + 1][j]])) exits++;
|
||||||
|
if ((dTransVal[i][j - 1] != tv) && (!nSolidTable[dPiece[i][j - 1]])) exits++;
|
||||||
|
if ((dTransVal[i][j + 1] != tv) && (!nSolidTable[dPiece[i][j + 1]])) exits++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return exits;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BOOL IsDeadEndThemeRoom(int tv)
|
||||||
|
{
|
||||||
|
return ThemeRoomExitCount(tv) <= 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int ThemeRoomArea(int tv)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
int area;
|
||||||
|
|
||||||
|
area = 0;
|
||||||
|
for (j = 0; j < DMAXY; j++) {
|
||||||
|
for (i = 0; i < DMAXX; i++) {
|
||||||
|
if ((dTransVal[i][j] == tv) && (!nSolidTable[dPiece[i][j]]))
|
||||||
|
area++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return area;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CATROOM_DEADEND 0x01
|
||||||
|
#define CATROOM_SMALL 0x02
|
||||||
|
#define CATROOM_LARGE 0x04
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int minLevel;
|
||||||
|
int maxLevel;
|
||||||
|
int roomFlags;
|
||||||
|
const int *themeList;
|
||||||
|
int themeListLen;
|
||||||
|
} CathedralRoomPick;
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BOOL CathedralRoomShapeFits(int tv, int roomFlags)
|
||||||
|
{
|
||||||
|
int area;
|
||||||
|
|
||||||
|
if ((roomFlags & CATROOM_DEADEND) && !IsDeadEndThemeRoom(tv))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
area = ThemeRoomArea(tv);
|
||||||
|
if ((roomFlags & CATROOM_SMALL) && area > 36)
|
||||||
|
return FALSE;
|
||||||
|
if ((roomFlags & CATROOM_LARGE) && area < 49)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BOOL PickThemeFromList(int i, const int *themeList, int themeListLen, int *themeType)
|
||||||
|
{
|
||||||
|
int start, n, t;
|
||||||
|
|
||||||
|
if (themeListLen <= 0) return FALSE;
|
||||||
|
|
||||||
|
start = random(0, themeListLen);
|
||||||
|
for (n = 0; n < themeListLen; n++) {
|
||||||
|
t = themeList[(start + n) % themeListLen];
|
||||||
|
if (SpecialThemeFit(i, t)) {
|
||||||
|
*themeType = t;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BOOL PickCathedralArchetypeTheme(int i, int depth, int *themeType)
|
||||||
|
{
|
||||||
|
static const int candlelitEntryChapel[] = {
|
||||||
|
THEME_SHRINE,
|
||||||
|
THEME_LIBRARY,
|
||||||
|
};
|
||||||
|
static const int collapsedPrayerNook[] = {
|
||||||
|
THEME_BARREL,
|
||||||
|
THEME_SHRINE,
|
||||||
|
THEME_SKELRM,
|
||||||
|
};
|
||||||
|
static const int skeletonAmbushCryptlet[] = {
|
||||||
|
THEME_SKELRM,
|
||||||
|
THEME_MONSTPIT,
|
||||||
|
};
|
||||||
|
static const int desecratedShrineRoom[] = {
|
||||||
|
THEME_GOATSHRINE,
|
||||||
|
THEME_BLOODFTN,
|
||||||
|
THEME_MURKYFTN,
|
||||||
|
};
|
||||||
|
static const int abandonedStudy[] = {
|
||||||
|
THEME_LIBRARY,
|
||||||
|
THEME_SHRINE,
|
||||||
|
};
|
||||||
|
static const int guardedSupplyRoom[] = {
|
||||||
|
THEME_BARREL,
|
||||||
|
THEME_TREASURE,
|
||||||
|
THEME_MONSTPIT,
|
||||||
|
};
|
||||||
|
static const int processionHall[] = {
|
||||||
|
THEME_SHRINE,
|
||||||
|
THEME_LIBRARY,
|
||||||
|
THEME_BARREL,
|
||||||
|
};
|
||||||
|
static const int sealedTreasureCloset[] = {
|
||||||
|
THEME_TREASURE,
|
||||||
|
};
|
||||||
|
static const int bloodTrailRoom[] = {
|
||||||
|
THEME_BLOODFTN,
|
||||||
|
THEME_DECAP,
|
||||||
|
THEME_TORTURE,
|
||||||
|
};
|
||||||
|
static const int falseSanctuary[] = {
|
||||||
|
THEME_SHRINE,
|
||||||
|
THEME_GOATSHRINE,
|
||||||
|
THEME_MONSTPIT,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const CathedralRoomPick rooms[] = {
|
||||||
|
{ 1, 2, CATROOM_LARGE, candlelitEntryChapel, sizeof(candlelitEntryChapel) / sizeof(candlelitEntryChapel[0]) },
|
||||||
|
{ 1, 3, CATROOM_DEADEND | CATROOM_SMALL, collapsedPrayerNook, sizeof(collapsedPrayerNook) / sizeof(collapsedPrayerNook[0]) },
|
||||||
|
{ 1, 4, 0, skeletonAmbushCryptlet, sizeof(skeletonAmbushCryptlet) / sizeof(skeletonAmbushCryptlet[0]) },
|
||||||
|
{ 2, 4, CATROOM_LARGE, desecratedShrineRoom, sizeof(desecratedShrineRoom) / sizeof(desecratedShrineRoom[0]) },
|
||||||
|
{ 1, 3, 0, abandonedStudy, sizeof(abandonedStudy) / sizeof(abandonedStudy[0]) },
|
||||||
|
{ 1, 2, CATROOM_DEADEND | CATROOM_SMALL, guardedSupplyRoom, sizeof(guardedSupplyRoom) / sizeof(guardedSupplyRoom[0]) },
|
||||||
|
{ 1, 4, CATROOM_LARGE, processionHall, sizeof(processionHall) / sizeof(processionHall[0]) },
|
||||||
|
{ 1, 4, CATROOM_DEADEND | CATROOM_SMALL, sealedTreasureCloset, sizeof(sealedTreasureCloset) / sizeof(sealedTreasureCloset[0]) },
|
||||||
|
{ 3, 4, 0, bloodTrailRoom, sizeof(bloodTrailRoom) / sizeof(bloodTrailRoom[0]) },
|
||||||
|
{ 2, 4, 0, falseSanctuary, sizeof(falseSanctuary) / sizeof(falseSanctuary[0]) },
|
||||||
|
};
|
||||||
|
int start, n, roomCount;
|
||||||
|
const CathedralRoomPick *room;
|
||||||
|
|
||||||
|
roomCount = sizeof(rooms) / sizeof(rooms[0]);
|
||||||
|
start = random(0, roomCount);
|
||||||
|
|
||||||
|
for (n = 0; n < roomCount; n++) {
|
||||||
|
room = &rooms[(start + n) % roomCount];
|
||||||
|
if (depth < room->minLevel || depth > room->maxLevel)
|
||||||
|
continue;
|
||||||
|
if (!CathedralRoomShapeFits(theme[i].ttval, room->roomFlags))
|
||||||
|
continue;
|
||||||
|
if (PickThemeFromList(i, room->themeList, room->themeListLen, themeType))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static int PickL1Theme(int i)
|
||||||
|
{
|
||||||
|
int depth;
|
||||||
|
int tries;
|
||||||
|
int t;
|
||||||
|
|
||||||
|
depth = currlevel;
|
||||||
|
if (depth < 1) depth = 1;
|
||||||
|
if (depth > 4) depth = 4;
|
||||||
|
|
||||||
|
if (PickCathedralArchetypeTheme(i, depth, &t))
|
||||||
|
return t;
|
||||||
|
|
||||||
|
for (tries = 0; tries < 64; tries++) {
|
||||||
|
t = random(0, TOTAL_THEMES);
|
||||||
|
if (SpecialThemeFit(i, t)) return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
return THEME_BARREL;
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------**
|
/*-----------------------------------------------------------------------**
|
||||||
**-----------------------------------------------------------------------*/
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
@@ -438,8 +639,7 @@ void InitThemes()
|
|||||||
for (i = 0; (i < 256) && (numthemes < MAXTHEMES); i++) {
|
for (i = 0; (i < 256) && (numthemes < MAXTHEMES); i++) {
|
||||||
if (CheckThemeRoom(i)) {
|
if (CheckThemeRoom(i)) {
|
||||||
theme[numthemes].ttval = i;
|
theme[numthemes].ttval = i;
|
||||||
t = ThemeGood[random(0, THEME_NUMGOOD)]; // Normal
|
t = PickL1Theme(numthemes);
|
||||||
while (!SpecialThemeFit(numthemes, t)) t = random(0, TOTAL_THEMES);
|
|
||||||
theme[numthemes].ttype = t;
|
theme[numthemes].ttype = t;
|
||||||
numthemes++;
|
numthemes++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,24 +44,233 @@
|
|||||||
#include "multi.h"
|
#include "multi.h"
|
||||||
|
|
||||||
#define T_POUTC 165
|
#define T_POUTC 165
|
||||||
|
#define TOWN_PLAYER_LIGHT 1
|
||||||
|
|
||||||
// #define TESTINGCRYPT // JKE set this to keep the crypt open
|
// #define TESTINGCRYPT // JKE set this to keep the crypt open
|
||||||
|
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
void DrawUnit (long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend);
|
void DrawUnit (long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend);
|
||||||
|
void DrawLitUnit (long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend);
|
||||||
|
void DrawLitUnitLerpOverlay(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, int density);
|
||||||
void DrawUnitClipped (long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend);
|
void DrawUnitClipped (long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend);
|
||||||
|
void DrawLitUnitClipped (long xp,long yp,BYTE *pCelBuff,long nCel,long nCelW,long ostart,long oend);
|
||||||
|
void DrawLitUnitLerpOverlayClipped(long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, int density);
|
||||||
void DrawUnitOutline(byte ocolor, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
void DrawUnitOutline(byte ocolor, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
||||||
void DrawUnitOutlineClipped(byte ocolor, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
void DrawUnitOutlineClipped(byte ocolor, long xp, long yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
extern int gnTownTileX;
|
||||||
|
extern int gnTownTileY;
|
||||||
|
extern int gnTownFlickerFrame;
|
||||||
|
}
|
||||||
|
extern int gnRenderFrameInterp;
|
||||||
|
extern int PlrWalkLenTbl[NUM_CLASSES];
|
||||||
|
|
||||||
static void T_DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chflag);
|
static void T_DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chflag);
|
||||||
static void T_DrawHTLXsub2 (BYTE *pTo, int sx, int sy, int sv, int sv2, int xp, int yp, BOOL chflag);
|
static void T_DrawHTLXsub2 (BYTE *pTo, int sx, int sy, int sv, int sv2, int xp, int yp, BOOL chflag);
|
||||||
static void T_DrawHTLXsub3 (BYTE *pTo, int sx, int sy, int ev, int ev2, int xp, int yp, BOOL chflag);
|
static void T_DrawHTLXsub3 (BYTE *pTo, int sx, int sy, int ev, int ev2, int xp, int yp, BOOL chflag);
|
||||||
|
static void T_DrawPlayerTownUnit(PlayerStruct *pPlayer, int xp, int yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, BOOL clipped);
|
||||||
|
void ApplyWorldGoldShimmer(ItemStruct *pItem, int itemIndex, int x, int y, int ostart, int oend);
|
||||||
void plrmsg_draw();
|
void plrmsg_draw();
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------**
|
/*-----------------------------------------------------------------------**
|
||||||
**-----------------------------------------------------------------------*/
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void T_SetTownTile(int sx, int sy)
|
||||||
|
{
|
||||||
|
gnTownTileX = sx;
|
||||||
|
gnTownTileY = sy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static int T_VisualHalfStep(long velocity)
|
||||||
|
{
|
||||||
|
int interp;
|
||||||
|
__int64 step;
|
||||||
|
|
||||||
|
interp = gnRenderFrameInterp;
|
||||||
|
if (interp <= 0 || velocity == 0)
|
||||||
|
return 0;
|
||||||
|
if (interp > 256)
|
||||||
|
interp = 256;
|
||||||
|
|
||||||
|
step = velocity;
|
||||||
|
if (step < 0)
|
||||||
|
return -(int)(((-step) * interp) >> 16);
|
||||||
|
|
||||||
|
return (int)((step * interp) >> 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static BOOL T_PlayerUsesVisualLerp(PlayerStruct *pPlayer)
|
||||||
|
{
|
||||||
|
return pPlayer->_pmode == PM_WALK
|
||||||
|
|| pPlayer->_pmode == PM_WALK2
|
||||||
|
|| pPlayer->_pmode == PM_WALK3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
static BOOL T_PlayerHasVisualStep(PlayerStruct *pPlayer)
|
||||||
|
{
|
||||||
|
int walkLen;
|
||||||
|
|
||||||
|
walkLen = 8;
|
||||||
|
if (currlevel != 0)
|
||||||
|
walkLen = PlrWalkLenTbl[pPlayer->_pClass];
|
||||||
|
|
||||||
|
return pPlayer->_pVar8 < walkLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static int T_GetPlayerDrawX(PlayerStruct *pPlayer, int xp)
|
||||||
|
{
|
||||||
|
xp += pPlayer->_pxoff;
|
||||||
|
if (T_PlayerUsesVisualLerp(pPlayer) && T_PlayerHasVisualStep(pPlayer))
|
||||||
|
xp += T_VisualHalfStep(pPlayer->_pxvel);
|
||||||
|
|
||||||
|
return xp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static int T_GetPlayerDrawY(PlayerStruct *pPlayer, int yp)
|
||||||
|
{
|
||||||
|
yp += pPlayer->_pyoff;
|
||||||
|
if (T_PlayerUsesVisualLerp(pPlayer) && T_PlayerHasVisualStep(pPlayer))
|
||||||
|
yp += T_VisualHalfStep(pPlayer->_pyvel);
|
||||||
|
|
||||||
|
return yp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static int T_GetScrollDrawX()
|
||||||
|
{
|
||||||
|
int sxoff;
|
||||||
|
PlayerStruct *pPlayer;
|
||||||
|
|
||||||
|
sxoff = ScrollInfo._sxoff;
|
||||||
|
if (ScrollInfo._sdir == SCRL_NONE)
|
||||||
|
return sxoff;
|
||||||
|
|
||||||
|
pPlayer = &plr[myplr];
|
||||||
|
if (T_PlayerUsesVisualLerp(pPlayer) && T_PlayerHasVisualStep(pPlayer))
|
||||||
|
sxoff -= T_VisualHalfStep(pPlayer->_pxvel);
|
||||||
|
|
||||||
|
return sxoff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static int T_GetScrollDrawY()
|
||||||
|
{
|
||||||
|
int syoff;
|
||||||
|
PlayerStruct *pPlayer;
|
||||||
|
|
||||||
|
syoff = ScrollInfo._syoff;
|
||||||
|
if (ScrollInfo._sdir == SCRL_NONE)
|
||||||
|
return syoff;
|
||||||
|
|
||||||
|
pPlayer = &plr[myplr];
|
||||||
|
if (T_PlayerUsesVisualLerp(pPlayer) && T_PlayerHasVisualStep(pPlayer))
|
||||||
|
syoff -= T_VisualHalfStep(pPlayer->_pyvel);
|
||||||
|
|
||||||
|
return syoff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static int T_GetVisualLerpDensity(int animCnt, int animDelay)
|
||||||
|
{
|
||||||
|
int interp;
|
||||||
|
int progress;
|
||||||
|
int density;
|
||||||
|
|
||||||
|
if (animDelay <= 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
interp = gnRenderFrameInterp;
|
||||||
|
if (interp < 0)
|
||||||
|
interp = 0;
|
||||||
|
if (interp > 256)
|
||||||
|
interp = 256;
|
||||||
|
|
||||||
|
progress = animCnt * 256 + interp;
|
||||||
|
density = (progress * 4) / (animDelay * 256);
|
||||||
|
if (density < 1)
|
||||||
|
return 0;
|
||||||
|
if (density > 3)
|
||||||
|
density = 3;
|
||||||
|
|
||||||
|
return density;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static int T_GetPlayerLerpFrame(PlayerStruct *pPlayer, int *density)
|
||||||
|
{
|
||||||
|
int frame;
|
||||||
|
|
||||||
|
*density = T_GetVisualLerpDensity(pPlayer->_pAnimCnt, pPlayer->_pAnimDelay);
|
||||||
|
if (*density == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
frame = pPlayer->_pAnimFrame + 1;
|
||||||
|
if (frame > pPlayer->_pAnimLen)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static void T_DrawPlayerTownUnit(PlayerStruct *pPlayer, int xp, int yp, BYTE *pCelBuff, long nCel, long nCelW, long ostart, long oend, BOOL clipped)
|
||||||
|
{
|
||||||
|
long oldnLVal;
|
||||||
|
int density, nextFrame;
|
||||||
|
|
||||||
|
oldnLVal = nLVal;
|
||||||
|
nLVal = TOWN_PLAYER_LIGHT;
|
||||||
|
|
||||||
|
#if RLE_DRAW
|
||||||
|
if (clipped)
|
||||||
|
DrawLitUnitClipped(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
||||||
|
else
|
||||||
|
DrawLitUnit(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
||||||
|
nextFrame = T_GetPlayerLerpFrame(pPlayer, &density);
|
||||||
|
if (nextFrame) {
|
||||||
|
if (clipped)
|
||||||
|
DrawLitUnitLerpOverlayClipped(xp, yp, pCelBuff, nextFrame, nCelW, ostart, oend, density);
|
||||||
|
else
|
||||||
|
DrawLitUnitLerpOverlay(xp, yp, pCelBuff, nextFrame, nCelW, ostart, oend, density);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (clipped)
|
||||||
|
CDrawSlabCelL(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
||||||
|
else
|
||||||
|
DrawSlabCelL(xp, yp, pCelBuff, nCel, nCelW, ostart, oend);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
nLVal = oldnLVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------**
|
||||||
|
**-----------------------------------------------------------------------*/
|
||||||
|
|
||||||
void TDrawBlankMini(BYTE *pDecodeTo)
|
void TDrawBlankMini(BYTE *pDecodeTo)
|
||||||
{
|
{
|
||||||
app_assert(gpBuffer);
|
app_assert(gpBuffer);
|
||||||
@@ -289,6 +498,7 @@ void T_DrawEFlag1(BYTE *pTo2, int sx, int sy, int xp, int yp)
|
|||||||
|
|
||||||
pTo = pTo2;
|
pTo = pTo2;
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
for(t = 0; t < 12; t += 2)
|
for(t = 0; t < 12; t += 2)
|
||||||
{
|
{
|
||||||
if (gdwPNum = mt[t]) DrawMTileClipBottom (pTo);
|
if (gdwPNum = mt[t]) DrawMTileClipBottom (pTo);
|
||||||
@@ -315,6 +525,7 @@ static void T_DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chfla
|
|||||||
pxp = xp - item[bv]._iAnimWidth2;
|
pxp = xp - item[bv]._iAnimWidth2;
|
||||||
if (bv == cursitem) COutlineSlabCel(181, pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, 8);
|
if (bv == cursitem) COutlineSlabCel(181, pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, 8);
|
||||||
CDrawSlabCel(pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, 8);
|
CDrawSlabCel(pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, 8);
|
||||||
|
ApplyWorldGoldShimmer(&item[bv], bv, pxp, yp, 0, 8);
|
||||||
}
|
}
|
||||||
if ((dFlags[sx][sy] & BFLAG_MONSTLR) != 0) {
|
if ((dFlags[sx][sy] & BFLAG_MONSTLR) != 0) {
|
||||||
mi = -(dMonster[sx][sy-1] + 1);
|
mi = -(dMonster[sx][sy-1] + 1);
|
||||||
@@ -332,16 +543,15 @@ static void T_DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chfla
|
|||||||
}
|
}
|
||||||
if ((dFlags[sx][sy] & BFLAG_PLRLR) != 0) {
|
if ((dFlags[sx][sy] & BFLAG_PLRLR) != 0) {
|
||||||
bv = -(dPlayer[sx][sy-1] + 1);
|
bv = -(dPlayer[sx][sy-1] + 1);
|
||||||
pxp = plr[bv]._pxoff + xp - plr[bv]._pAnimWidth2;
|
pxp = T_GetPlayerDrawX(&plr[bv], xp) - plr[bv]._pAnimWidth2;
|
||||||
pyp = plr[bv]._pyoff + yp;
|
pyp = T_GetPlayerDrawY(&plr[bv], yp);
|
||||||
|
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (bv == cursplr) DrawUnitOutlineClipped(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
if (bv == cursplr) DrawUnitOutlineClipped(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
||||||
DrawUnitClipped(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
|
||||||
#else
|
#else
|
||||||
if (bv == cursplr) COutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
if (bv == cursplr) COutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
||||||
CDrawSlabCel(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
|
||||||
#endif
|
#endif
|
||||||
|
T_DrawPlayerTownUnit(&plr[bv], pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8, TRUE);
|
||||||
|
|
||||||
if (chflag)
|
if (chflag)
|
||||||
{
|
{
|
||||||
@@ -353,16 +563,15 @@ static void T_DrawHTLXsub (BYTE *pTo, int sx, int sy, int xp, int yp, BOOL chfla
|
|||||||
DrawDeadPlr(sx, sy, xp, yp, 0, 8, TRUE);
|
DrawDeadPlr(sx, sy, xp, yp, 0, 8, TRUE);
|
||||||
if (dPlayer[sx][sy] > 0) {
|
if (dPlayer[sx][sy] > 0) {
|
||||||
bv = dPlayer[sx][sy] - 1;
|
bv = dPlayer[sx][sy] - 1;
|
||||||
pxp = plr[bv]._pxoff + xp - plr[bv]._pAnimWidth2;
|
pxp = T_GetPlayerDrawX(&plr[bv], xp) - plr[bv]._pAnimWidth2;
|
||||||
pyp = plr[bv]._pyoff + yp;
|
pyp = T_GetPlayerDrawY(&plr[bv], yp);
|
||||||
|
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (bv == cursplr) DrawUnitOutlineClipped(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
if (bv == cursplr) DrawUnitOutlineClipped(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
||||||
DrawUnitClipped(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
|
||||||
#else
|
#else
|
||||||
if (bv == cursplr) COutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
if (bv == cursplr) COutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
||||||
CDrawSlabCel(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);
|
|
||||||
#endif
|
#endif
|
||||||
|
T_DrawPlayerTownUnit(&plr[bv], pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8, TRUE);
|
||||||
|
|
||||||
if (chflag)
|
if (chflag)
|
||||||
{
|
{
|
||||||
@@ -390,6 +599,7 @@ void T_DrawHTileLineX (int sx, int sy, int xp, int yp, int nd, int halfflag)
|
|||||||
if (gdwPNum = dPiece[sx][sy]) {
|
if (gdwPNum = dPiece[sx][sy]) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp + 32;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp + 32;
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
|
|
||||||
for(t = 1; t < 17; t += 2)
|
for(t = 1; t < 17; t += 2)
|
||||||
{
|
{
|
||||||
@@ -419,6 +629,7 @@ void T_DrawHTileLineX (int sx, int sy, int xp, int yp, int nd, int halfflag)
|
|||||||
if (gdwPNum != 0) {
|
if (gdwPNum != 0) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
|
|
||||||
for(t = 0; t < 16; t+= 2)
|
for(t = 0; t < 16; t+= 2)
|
||||||
{
|
{
|
||||||
@@ -447,6 +658,7 @@ void T_DrawHTileLineX (int sx, int sy, int xp, int yp, int nd, int halfflag)
|
|||||||
if (gdwPNum != 0) {
|
if (gdwPNum != 0) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
|
|
||||||
for(t = 0; t < 16; t+= 2)
|
for(t = 0; t < 16; t+= 2)
|
||||||
{
|
{
|
||||||
@@ -480,6 +692,7 @@ void T_DrawEFlag2(BYTE *pTo2, int sx, int sy, int sv, int sv2, int xp, int yp)
|
|||||||
else
|
else
|
||||||
pTo = pTo2 + (NBUFFWSL5 * sv);
|
pTo = pTo2 + (NBUFFWSL5 * sv);
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
|
|
||||||
for(t = 0; t < 6; t++)
|
for(t = 0; t < 6; t++)
|
||||||
{
|
{
|
||||||
@@ -509,6 +722,7 @@ static void T_DrawHTLXsub2 (BYTE *pTo, int sx, int sy, int sv, int sv2, int xp,
|
|||||||
pxp = xp - item[bv]._iAnimWidth2;
|
pxp = xp - item[bv]._iAnimWidth2;
|
||||||
if (bv == cursitem) COutlineSlabCel(181, pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, sv2, 8);
|
if (bv == cursitem) COutlineSlabCel(181, pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, sv2, 8);
|
||||||
CDrawSlabCel(pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, sv2, 8);
|
CDrawSlabCel(pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, sv2, 8);
|
||||||
|
ApplyWorldGoldShimmer(&item[bv], bv, pxp, yp, sv2, 8);
|
||||||
}
|
}
|
||||||
if ((dFlags[sx][sy] & BFLAG_MONSTLR) != 0) {
|
if ((dFlags[sx][sy] & BFLAG_MONSTLR) != 0) {
|
||||||
mi = -(dMonster[sx][sy-1] + 1);
|
mi = -(dMonster[sx][sy-1] + 1);
|
||||||
@@ -526,16 +740,15 @@ static void T_DrawHTLXsub2 (BYTE *pTo, int sx, int sy, int sv, int sv2, int xp,
|
|||||||
}
|
}
|
||||||
if ((dFlags[sx][sy] & BFLAG_PLRLR) != 0) {
|
if ((dFlags[sx][sy] & BFLAG_PLRLR) != 0) {
|
||||||
bv = -(dPlayer[sx][sy-1] + 1);
|
bv = -(dPlayer[sx][sy-1] + 1);
|
||||||
pxp = plr[bv]._pxoff + xp - plr[bv]._pAnimWidth2;
|
pxp = T_GetPlayerDrawX(&plr[bv], xp) - plr[bv]._pAnimWidth2;
|
||||||
pyp = plr[bv]._pyoff + yp;
|
pyp = T_GetPlayerDrawY(&plr[bv], yp);
|
||||||
|
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (bv == cursplr) DrawUnitOutlineClipped(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
if (bv == cursplr) DrawUnitOutlineClipped(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
||||||
DrawUnitClipped(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
|
||||||
#else
|
#else
|
||||||
if (bv == cursplr) COutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
if (bv == cursplr) COutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
||||||
CDrawSlabCel(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
|
||||||
#endif
|
#endif
|
||||||
|
T_DrawPlayerTownUnit(&plr[bv], pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8, TRUE);
|
||||||
|
|
||||||
if (chflag)
|
if (chflag)
|
||||||
{
|
{
|
||||||
@@ -547,16 +760,15 @@ static void T_DrawHTLXsub2 (BYTE *pTo, int sx, int sy, int sv, int sv2, int xp,
|
|||||||
DrawDeadPlr(sx, sy, xp, yp, sv2, 8, TRUE);
|
DrawDeadPlr(sx, sy, xp, yp, sv2, 8, TRUE);
|
||||||
if (dPlayer[sx][sy] > 0) {
|
if (dPlayer[sx][sy] > 0) {
|
||||||
bv = dPlayer[sx][sy] - 1;
|
bv = dPlayer[sx][sy] - 1;
|
||||||
pxp = plr[bv]._pxoff + xp - plr[bv]._pAnimWidth2;
|
pxp = T_GetPlayerDrawX(&plr[bv], xp) - plr[bv]._pAnimWidth2;
|
||||||
pyp = plr[bv]._pyoff + yp;
|
pyp = T_GetPlayerDrawY(&plr[bv], yp);
|
||||||
|
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (bv == cursplr) DrawUnitOutlineClipped(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
if (bv == cursplr) DrawUnitOutlineClipped(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
||||||
DrawUnitClipped(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
|
||||||
#else
|
#else
|
||||||
if (bv == cursplr) COutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
if (bv == cursplr) COutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
||||||
CDrawSlabCel(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8);
|
|
||||||
#endif
|
#endif
|
||||||
|
T_DrawPlayerTownUnit(&plr[bv], pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, sv2, 8, TRUE);
|
||||||
|
|
||||||
if (chflag)
|
if (chflag)
|
||||||
{
|
{
|
||||||
@@ -586,6 +798,7 @@ void T_DrawHTLX2 (int sx, int sy, int xp, int yp, int nd, int sv, int halfflag)
|
|||||||
if (gdwPNum = dPiece[sx][sy]) {
|
if (gdwPNum = dPiece[sx][sy]) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp - NBUFFWSL5 + 32;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp - NBUFFWSL5 + 32;
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
|
|
||||||
for(t = 0; t < 7; t++)
|
for(t = 0; t < 7; t++)
|
||||||
{
|
{
|
||||||
@@ -617,6 +830,7 @@ void T_DrawHTLX2 (int sx, int sy, int xp, int yp, int nd, int sv, int halfflag)
|
|||||||
if (gdwPNum != 0) {
|
if (gdwPNum != 0) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp - NBUFFWSL5;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp - NBUFFWSL5;
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
for(t = 0; t < 7; t++)
|
for(t = 0; t < 7; t++)
|
||||||
{
|
{
|
||||||
if (sv <= t) {
|
if (sv <= t) {
|
||||||
@@ -649,6 +863,7 @@ void T_DrawHTLX2 (int sx, int sy, int xp, int yp, int nd, int sv, int halfflag)
|
|||||||
if (gdwPNum != 0) {
|
if (gdwPNum != 0) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp - NBUFFWSL5;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp - NBUFFWSL5;
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
|
|
||||||
for(t = 0; t < 7; t++)
|
for(t = 0; t < 7; t++)
|
||||||
{
|
{
|
||||||
@@ -683,6 +898,7 @@ void T_DrawEFlag3(BYTE *pTo2, int sx, int sy, int ev, int ev2, int xp, int yp)
|
|||||||
|
|
||||||
pTo = pTo2;
|
pTo = pTo2;
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
|
|
||||||
for(t = 0; t < 7; t++)
|
for(t = 0; t < 7; t++)
|
||||||
{
|
{
|
||||||
@@ -710,6 +926,7 @@ static void T_DrawHTLXsub3 (BYTE *pTo, int sx, int sy, int ev, int ev2, int xp,
|
|||||||
if (bv == cursitem) OutlineSlabCel(181, pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, ev2);
|
if (bv == cursitem) OutlineSlabCel(181, pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, ev2);
|
||||||
app_assert(item[bv]._iAnimData);
|
app_assert(item[bv]._iAnimData);
|
||||||
DrawSlabCel(pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, ev2);
|
DrawSlabCel(pxp, yp, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, ev2);
|
||||||
|
ApplyWorldGoldShimmer(&item[bv], bv, pxp, yp, 0, ev2);
|
||||||
}
|
}
|
||||||
if ((dFlags[sx][sy] & BFLAG_MONSTLR) != 0) {
|
if ((dFlags[sx][sy] & BFLAG_MONSTLR) != 0) {
|
||||||
mi = -(dMonster[sx][sy-1] + 1);
|
mi = -(dMonster[sx][sy-1] + 1);
|
||||||
@@ -729,18 +946,17 @@ static void T_DrawHTLXsub3 (BYTE *pTo, int sx, int sy, int ev, int ev2, int xp,
|
|||||||
}
|
}
|
||||||
if ((dFlags[sx][sy] & BFLAG_PLRLR) != 0) {
|
if ((dFlags[sx][sy] & BFLAG_PLRLR) != 0) {
|
||||||
bv = -(dPlayer[sx][sy-1] + 1);
|
bv = -(dPlayer[sx][sy-1] + 1);
|
||||||
pxp = plr[bv]._pxoff + xp - plr[bv]._pAnimWidth2;
|
pxp = T_GetPlayerDrawX(&plr[bv], xp) - plr[bv]._pAnimWidth2;
|
||||||
pyp = plr[bv]._pyoff + yp;
|
pyp = T_GetPlayerDrawY(&plr[bv], yp);
|
||||||
|
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (bv == cursplr) DrawUnitOutline(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
if (bv == cursplr) DrawUnitOutline(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
||||||
app_assert(plr[bv]._pAnimData);
|
app_assert(plr[bv]._pAnimData);
|
||||||
DrawUnit(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
|
||||||
#else
|
#else
|
||||||
if (bv == cursplr) OutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
if (bv == cursplr) OutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
||||||
app_assert(plr[bv]._pAnimData);
|
app_assert(plr[bv]._pAnimData);
|
||||||
DrawSlabCel(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
|
||||||
#endif
|
#endif
|
||||||
|
T_DrawPlayerTownUnit(&plr[bv], pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2, FALSE);
|
||||||
|
|
||||||
if (chflag)
|
if (chflag)
|
||||||
{
|
{
|
||||||
@@ -752,18 +968,17 @@ static void T_DrawHTLXsub3 (BYTE *pTo, int sx, int sy, int ev, int ev2, int xp,
|
|||||||
DrawDeadPlr(sx, sy, xp, yp, 0, ev2, FALSE);
|
DrawDeadPlr(sx, sy, xp, yp, 0, ev2, FALSE);
|
||||||
if (dPlayer[sx][sy] > 0) {
|
if (dPlayer[sx][sy] > 0) {
|
||||||
bv = dPlayer[sx][sy] - 1;
|
bv = dPlayer[sx][sy] - 1;
|
||||||
pxp = plr[bv]._pxoff + xp - plr[bv]._pAnimWidth2;
|
pxp = T_GetPlayerDrawX(&plr[bv], xp) - plr[bv]._pAnimWidth2;
|
||||||
pyp = plr[bv]._pyoff + yp;
|
pyp = T_GetPlayerDrawY(&plr[bv], yp);
|
||||||
|
|
||||||
#if RLE_DRAW
|
#if RLE_DRAW
|
||||||
if (bv == cursplr) DrawUnitOutline(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
if (bv == cursplr) DrawUnitOutline(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
||||||
app_assert(plr[bv]._pAnimData);
|
app_assert(plr[bv]._pAnimData);
|
||||||
DrawUnit(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
|
||||||
#else
|
#else
|
||||||
if (bv == cursplr) OutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
if (bv == cursplr) OutlineSlabCel(T_POUTC, pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
||||||
app_assert(plr[bv]._pAnimData);
|
app_assert(plr[bv]._pAnimData);
|
||||||
DrawSlabCel(pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2);
|
|
||||||
#endif
|
#endif
|
||||||
|
T_DrawPlayerTownUnit(&plr[bv], pxp, pyp, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, ev2, FALSE);
|
||||||
|
|
||||||
if (chflag)
|
if (chflag)
|
||||||
{
|
{
|
||||||
@@ -794,6 +1009,7 @@ void T_DrawHTLX3 (int sx, int sy, int xp, int yp, int nd, int ev, int halfflag)
|
|||||||
if (gdwPNum = dPiece[sx][sy]) {
|
if (gdwPNum = dPiece[sx][sy]) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp + 32;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp + 32;
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
|
|
||||||
for(t = 0; t < 7; t++)
|
for(t = 0; t < 7; t++)
|
||||||
{
|
{
|
||||||
@@ -823,6 +1039,7 @@ void T_DrawHTLX3 (int sx, int sy, int xp, int yp, int nd, int ev, int halfflag)
|
|||||||
if (gdwPNum != 0) {
|
if (gdwPNum != 0) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
for(t = 0; t < 7; t++)
|
for(t = 0; t < 7; t++)
|
||||||
{
|
{
|
||||||
if (ev >= t) {
|
if (ev >= t) {
|
||||||
@@ -853,6 +1070,7 @@ void T_DrawHTLX3 (int sx, int sy, int xp, int yp, int nd, int ev, int halfflag)
|
|||||||
if (gdwPNum != 0) {
|
if (gdwPNum != 0) {
|
||||||
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
pTo = gpBuffer + nBuffWTbl[yp] + xp;
|
||||||
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
mt = &dMT2[CalcRot(sx,sy)].mt[0];
|
||||||
|
T_SetTownTile(sx, sy);
|
||||||
|
|
||||||
for(t = 0; t < 7; t++)
|
for(t = 0; t < 7; t++)
|
||||||
{
|
{
|
||||||
@@ -888,8 +1106,8 @@ void T_SVGADrawView (int StartX, int StartY)
|
|||||||
ViewBX = 10;
|
ViewBX = 10;
|
||||||
ViewBY = 11;
|
ViewBY = 11;
|
||||||
|
|
||||||
xpos = 64 + ScrollInfo._sxoff;
|
xpos = 64 + T_GetScrollDrawX();
|
||||||
ypos = 175 + ScrollInfo._syoff;
|
ypos = 175 + T_GetScrollDrawY();
|
||||||
StartX -= 10;
|
StartX -= 10;
|
||||||
StartY -= 1;
|
StartY -= 1;
|
||||||
width = 10;
|
width = 10;
|
||||||
@@ -1007,8 +1225,8 @@ void T_VGADrawView (int StartX, int StartY)
|
|||||||
ViewBX = 6;
|
ViewBX = 6;
|
||||||
ViewBY = 6;
|
ViewBY = 6;
|
||||||
|
|
||||||
xpos = 64 + ScrollInfo._sxoff;
|
xpos = 64 + T_GetScrollDrawX();
|
||||||
ypos = 143 + ScrollInfo._syoff;
|
ypos = 143 + T_GetScrollDrawY();
|
||||||
StartX -= 6;
|
StartX -= 6;
|
||||||
StartY -= 1;
|
StartY -= 1;
|
||||||
width = 6;
|
width = 6;
|
||||||
@@ -1199,6 +1417,7 @@ _YLp: mov ecx,160
|
|||||||
// walls, so we set them here once for the whole screen
|
// walls, so we set them here once for the whole screen
|
||||||
nLVal = 0;
|
nLVal = 0;
|
||||||
nTrans = 0;
|
nTrans = 0;
|
||||||
|
gnTownFlickerFrame = GetTickCount() / 120;
|
||||||
|
|
||||||
if (svgamode) T_SVGADrawView (StartX, StartY);
|
if (svgamode) T_SVGADrawView (StartX, StartY);
|
||||||
else T_VGADrawView (StartX, StartY);
|
else T_VGADrawView (StartX, StartY);
|
||||||
|
|||||||
Reference in New Issue
Block a user