diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index fd1db8295..c722cb429 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -66,6 +66,104 @@ void ClearCursor() // CODE_FIX: this was supposed to be in cursor.cpp sgdwCursWdtOld = 0; } +static void scrollrt_draw_cursor_back_buffer() +{ + int i; + BYTE *src, *dst; + + if (sgdwCursWdt == 0) { + return; + } + + /// ASSERT: assert(gpBuffer); + src = sgSaveBack; + dst = &gpBuffer[SCREENXY(sgdwCursX, sgdwCursY)]; + + for (i = sgdwCursHgt; i != 0; i--, src += sgdwCursWdt, dst += BUFFER_WIDTH) { + memcpy(dst, src, sgdwCursWdt); + } + + sgdwCursXOld = sgdwCursX; + sgdwCursYOld = sgdwCursY; + sgdwCursWdtOld = sgdwCursWdt; + sgdwCursHgtOld = sgdwCursHgt; + sgdwCursWdt = 0; +} + +static void scrollrt_draw_cursor_item() +{ + int i, mx, my, col; + BYTE *src, *dst; + + /// ASSERT: assert(! sgdwCursWdt); + + if (pcurs <= 0 || cursW == 0 || cursH == 0) { + return; + } + + mx = MouseX - 1; + if (mx < 0) { + mx = 0; + } else if (mx > SCREEN_WIDTH - 1) { + return; + } + my = MouseY - 1; + if (my < 0) { + my = 0; + } else if (my > SCREEN_HEIGHT - 1) { + return; + } + + sgdwCursX = mx; + sgdwCursWdt = sgdwCursX + cursW + 1; + if (sgdwCursWdt > SCREEN_WIDTH - 1) { + sgdwCursWdt = SCREEN_WIDTH - 1; + } + sgdwCursX &= ~3; + sgdwCursWdt |= 3; + sgdwCursWdt -= sgdwCursX; + sgdwCursWdt++; + + sgdwCursY = my; + sgdwCursHgt = sgdwCursY + cursH + 1; + if (sgdwCursHgt > SCREEN_HEIGHT - 1) { + sgdwCursHgt = SCREEN_HEIGHT - 1; + } + sgdwCursHgt -= sgdwCursY; + sgdwCursHgt++; + + /// ASSERT: assert(sgdwCursWdt * sgdwCursHgt < sizeof sgSaveBack); + /// ASSERT: assert(gpBuffer); + dst = sgSaveBack; + src = &gpBuffer[SCREENXY(sgdwCursX, sgdwCursY)]; + + for (i = sgdwCursHgt; i != 0; i--, dst += sgdwCursWdt, src += BUFFER_WIDTH) { + memcpy(dst, src, sgdwCursWdt); + } + + mx++; + my++; + gpBufEnd = &gpBuffer[PitchTbl[SCREEN_HEIGHT + SCREEN_Y] - cursW - 2]; + + if (pcurs >= CURSOR_FIRSTITEM) { + col = PAL16_YELLOW + 5; + if (plr[myplr].HoldItem._iMagical != 0) { + col = PAL16_BLUE + 5; + } + if (!plr[myplr].HoldItem._iStatFlag) { + col = PAL16_RED + 5; + } + CelDrawHdrClrHL(col, mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8); + if (col != PAL16_RED + 5) { + Cel2DrawHdrOnly(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8); + } else { + Cel2DrawHdrLightRed(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8, 1); + } + } else { + Cel2DrawHdrOnly(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8); + } +} + void DrawMissile(int x, int y, int sx, int sy, int CelSkip, int CelCap, BOOL pre) { int i, mx, my, nCel; @@ -188,43 +286,113 @@ void DrawClippedMissile(int x, int y, int sx, int sy, int CelSkip, int CelCap, B } } -void DrawDeadPlayer(int x, int y, int sx, int sy, int CelSkip, int CelCap, BOOL clipped) +static void DrawMonster(int x, int y, int mx, int my, int m, int CelSkip, int CelCap) { - int i, px, py, nCel; - PlayerStruct *p; + int nCel; + char trans; BYTE *pCelBuff; DWORD *pFrameTable; - if (clipped) - DrawPlrProc = DrawClippedPlayer; - else - DrawPlrProc = DrawPlayer; + if ((DWORD)m >= MAXMONSTERS) { + // app_fatal("Draw Monster: tried to draw illegal monster %d", m); + return; + } - dFlags[x][y] &= ~BFLAG_DEAD_PLAYER; + pCelBuff = monster[m]._mAnimData; + if (!pCelBuff) { + // app_fatal("Draw Monster \"%s\": NULL Cel Buffer", monster[m].mName); + return; + } - for (i = 0; i < MAX_PLRS; i++) { - p = &plr[i]; - if (p->plractive && !p->_pHitPoints && p->plrlevel == (BYTE)currlevel && p->WorldX == x && p->WorldY == y) { - pCelBuff = p->_pAnimData; - if (!pCelBuff) { - // app_fatal("Drawing dead player %d \"%s\": NULL Cel Buffer", i, p->_pName); - break; - } - nCel = p->_pAnimFrame; - pFrameTable = (DWORD *)pCelBuff; - if (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { - // app_fatal("Drawing dead player %d \"%s\": facing %d, frame %d of %d", i, p->_pName, p->_pdir, nCel, pFrameTable[0]); - break; - } - dFlags[x][y] |= BFLAG_DEAD_PLAYER; - px = sx + p->_pxoff - p->_pAnimWidth2; - py = sy + p->_pyoff; - DrawPlrProc(i, x, y, px, py, p->_pAnimData, p->_pAnimFrame, p->_pAnimWidth, CelSkip, CelCap); - } + nCel = monster[m]._mAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + /* + const char *szMode = "unknown action"; + if(monster[m]._mmode <= 17) + szMode = szMonModeAssert[monster[m]._mmode]; + app_fatal( + "Draw Monster \"%s\" %s: facing %d, frame %d of %d", + monster[m].mName, + szMode, + monster[m]._mdir, + nCel, + pFrameTable[0]); + */ + return; + } + + if (!(dFlags[x][y] & BFLAG_LIT)) { + Cl2DecodeFrm3(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, 1); + } else { + trans = 0; + if (monster[m]._uniqtype) + trans = monster[m]._uniqtrans + 4; + if (monster[m]._mmode == MM_STONE) + trans = 2; + if (plr[myplr]._pInfraFlag && light_table_index > 8) + trans = 1; + if (trans) + Cl2DecodeFrm3(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, trans); + else + Cl2DecodeLightTbl(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap); + } +} + +static void DrawClippedMonster(int x, int y, int mx, int my, int m, int CelSkip, int CelCap) +{ + int nCel; + char trans; + BYTE *pCelBuff; + DWORD *pFrameTable; + + if ((DWORD)m >= MAXMONSTERS) { + // app_fatal("Draw Monster Clipped: tried to draw illegal monster %d", m); + return; + } + + pCelBuff = monster[m]._mAnimData; + if (!pCelBuff) { + // app_fatal("Draw Monster \"%s\" Clipped: NULL Cel Buffer", monster[m].mName); + return; + } + + nCel = monster[m]._mAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + /* + const char *szMode = "unknown action"; + if(monster[m]._mmode <= 17) + szMode = szMonModeAssert[monster[m]._mmode]; + app_fatal( + "Draw Monster \"%s\" %s Clipped: facing %d, frame %d of %d", + monster[m].mName, + szMode, + monster[m]._mdir, + nCel, + pFrameTable[0]); + */ + return; + } + + if (!(dFlags[x][y] & BFLAG_LIT)) { + Cl2DecodeFrm5(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, 1); + } else { + trans = 0; + if (monster[m]._uniqtype) + trans = monster[m]._uniqtrans + 4; + if (monster[m]._mmode == MM_STONE) + trans = 2; + if (plr[myplr]._pInfraFlag && light_table_index > 8) + trans = 1; + if (trans) + Cl2DecodeFrm5(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, trans); + else + Cl2DecodeFrm6(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap); } } -void DrawPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap) +static void DrawPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap) { int l; DWORD *pFrameTable; @@ -297,7 +465,7 @@ void DrawPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel } } -void DrawClippedPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap) +static void DrawClippedPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap) { int l; DWORD *pFrameTable; @@ -370,314 +538,196 @@ void DrawClippedPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, i } } -void DrawView(int StartX, int StartY) +void DrawDeadPlayer(int x, int y, int sx, int sy, int CelSkip, int CelCap, BOOL clipped) { - if (zoomflag) { - DrawGame(StartX, StartY); - } else { - DrawZoom(StartX, StartY); - } - if (automapflag) { - DrawAutomap(); - } - if (invflag) { - DrawInv(); - } else if (sbookflag) { - DrawSpellBook(); - } + int i, px, py, nCel; + PlayerStruct *p; + BYTE *pCelBuff; + DWORD *pFrameTable; - DrawDurIcon(); + if (clipped) + DrawPlrProc = DrawClippedPlayer; + else + DrawPlrProc = DrawPlayer; - if (chrflag) { - DrawChr(); - } else if (questlog) { - DrawQuestLog(); - } else if (plr[myplr]._pStatPts != 0 && !spselflag) { - DrawLevelUpIcon(); - } - if (uitemflag) { - DrawUniqueInfo(); - } - if (qtextflag) { - DrawQText(); - } - if (spselflag) { - DrawSpellList(); - } - if (dropGoldFlag) { - DrawGoldSplit(dropGoldValue); - } - if (helpflag) { - DrawHelp(); - } - if (msgflag) { - DrawDiabloMsg(); - } - if (deathflag) { - RedBack(); - } else if (PauseMode != 0) { - gmenu_draw_pause(); - } + dFlags[x][y] &= ~BFLAG_DEAD_PLAYER; - DrawPlrMsg(); - gmenu_draw(); - doom_draw(); - DrawInfoBox(); - DrawLifeFlask(); - DrawManaFlask(); + for (i = 0; i < MAX_PLRS; i++) { + p = &plr[i]; + if (p->plractive && !p->_pHitPoints && p->plrlevel == (BYTE)currlevel && p->WorldX == x && p->WorldY == y) { + pCelBuff = p->_pAnimData; + if (!pCelBuff) { + // app_fatal("Drawing dead player %d \"%s\": NULL Cel Buffer", i, p->_pName); + break; + } + nCel = p->_pAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + // app_fatal("Drawing dead player %d \"%s\": facing %d, frame %d of %d", i, p->_pName, p->_pdir, nCel, pFrameTable[0]); + break; + } + dFlags[x][y] |= BFLAG_DEAD_PLAYER; + px = sx + p->_pxoff - p->_pAnimWidth2; + py = sy + p->_pyoff; + DrawPlrProc(i, x, y, px, py, p->_pAnimData, p->_pAnimFrame, p->_pAnimWidth, CelSkip, CelCap); + } + } } -void DrawGame(int x, int y) +static void DrawObject(int x, int y, int ox, int oy, BOOL pre, int CelSkip, int CelCap) { - int i, sx, sy, chunks, blocks; + int sx, sy, xx, yy, nCel; + char bv; + BYTE *pCelBuff; + DWORD *pFrameTable; - scr_pix_width = SCREEN_WIDTH; - scr_pix_height = VIEWPORT_HEIGHT; - dword_5C2FF8 = SCREEN_WIDTH / 64; - dword_5C2FFC = VIEWPORT_HEIGHT / 32; + if (dObject[x][y] > 0) { + bv = dObject[x][y] - 1; + if (object[bv]._oPreFlag != pre) + return; + sx = ox - object[bv]._oAnimWidth2; + sy = oy; + } else { + bv = -(dObject[x][y] + 1); + if (object[bv]._oPreFlag != pre) + return; + xx = object[bv]._ox - x; + yy = object[bv]._oy - y; + sx = (xx << 5) + ox - object[bv]._oAnimWidth2 - (yy << 5); + sy = oy + (yy << 4) + (xx << 4); + CelSkip = 0; + CelCap = 8; + } - sx = ScrollInfo._sxoff + 64; - sy = ScrollInfo._syoff + 175; - x -= 10; - y--; - chunks = 10; - blocks = 8; + /// ASSERT: assert((unsigned char)bv < MAXOBJECTS); + if ((BYTE)bv >= MAXOBJECTS) + return; - if (chrflag || questlog) { - x += 2; - y -= 2; - sx += 288; - chunks = 6; + pCelBuff = object[bv]._oAnimData; + if (!pCelBuff) { + // app_fatal("Draw Object type %d: NULL Cel Buffer", object[bv]._otype); + return; } - if (invflag || sbookflag) { - x += 2; - y -= 2; - sx -= 32; - chunks = 6; + + nCel = object[bv]._oAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + // app_fatal("Draw Object: frame %d of %d, object type==%d", nCel, pFrameTable[0], object[bv]._otype); + return; } - switch (ScrollInfo._sdir) { - case SDIR_NONE: - break; - case SDIR_NE: - chunks++; - case SDIR_N: - sy -= 32; - x--; - y--; - blocks++; - break; - case SDIR_SE: - blocks++; - case SDIR_E: - chunks++; - break; - case SDIR_S: - blocks++; - break; - case SDIR_SW: - blocks++; - case SDIR_W: - sx -= 64; - x--; - y++; - chunks++; - break; - case SDIR_NW: - sx -= 64; - sy -= 32; - x -= 2; - chunks++; - blocks++; - break; + if (bv == pcursobj) + CelDecodeClr(194, sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); + if (object[bv]._oLight) { + CelDecodeHdrLightOnly(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); + } else { + /// ASSERT: assert(object[bv]._oAnimData); + if (object[bv]._oAnimData) // BUGFIX: _oAnimData was already checked, this is redundant + CelDrawHdrOnly(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); } +} - /// ASSERT: assert(gpBuffer); - gpBufEnd = &gpBuffer[PitchTbl[0 + SCREEN_Y]]; - for (i = 0; i < 4; i++) { - scrollrt_draw_upper(x, y, sx, sy, chunks, i, 0); - y++; - sx -= 32; - sy += 16; - scrollrt_draw_upper(x, y, sx, sy, chunks, i, 1); - x++; - sx += 32; - sy += 16; +static void DrawClippedObject(int x, int y, int ox, int oy, BOOL pre, int CelSkip, int CelCap) +{ + int sx, sy, xx, yy, nCel; + char bv; + BYTE *pCelBuff; + DWORD *pFrameTable; + + if (dObject[x][y] > 0) { + bv = dObject[x][y] - 1; + if (object[bv]._oPreFlag != pre) + return; + sx = ox - object[bv]._oAnimWidth2; + sy = oy; + } else { + bv = -(dObject[x][y] + 1); + if (object[bv]._oPreFlag != pre) + return; + xx = object[bv]._ox - x; + yy = object[bv]._oy - y; + sx = (xx << 5) + ox - object[bv]._oAnimWidth2 - (yy << 5); + sy = oy + (yy << 4) + (xx << 4); + CelSkip = 0; + CelCap = 8; } - /// ASSERT: assert(gpBuffer); - gpBufEnd = &gpBuffer[PitchTbl[VIEWPORT_HEIGHT + SCREEN_Y]]; - for (i = 0; i < blocks; i++) { - scrollrt_draw_lower(x, y, sx, sy, chunks, 0); - y++; - sx -= 32; - sy += 16; - scrollrt_draw_lower(x, y, sx, sy, chunks, 1); - x++; - sx += 32; - sy += 16; + + /// ASSERT: assert((unsigned char)bv < MAXOBJECTS); + if ((BYTE)bv >= MAXOBJECTS) + return; + + pCelBuff = object[bv]._oAnimData; + if (!pCelBuff) { + // app_fatal("Draw Object type %d Clipped: NULL Cel Buffer", object[bv]._otype); + return; } - arch_draw_type = 0; - for (i = 0; i < 4; i++) { - scrollrt_draw_lower_2(x, y, sx, sy, chunks, i, 0); - y++; - sx -= 32; - sy += 16; - scrollrt_draw_lower_2(x, y, sx, sy, chunks, i, 1); - x++; - sx += 32; - sy += 16; + + nCel = object[bv]._oAnimFrame; + pFrameTable = (DWORD *)pCelBuff; + if (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { + // app_fatal("Draw Clipped Object: frame %d of %d, object type==%d", nCel, pFrameTable[0], object[bv]._otype); + return; } + + if (bv == pcursobj) + CelDrawHdrClrHL(194, sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); + if (object[bv]._oLight) + Cel2DecodeHdrLight(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); + else + Cel2DrawHdrOnly(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); } -void scrollrt_draw_lower(int x, int y, int sx, int sy, int chunks, int eflag) +static void scrollrt_draw_clipped_dungeon(BYTE *pBuff, int sx, int sy, int dx, int dy, int eflag); + +static void scrollrt_draw_clipped_e_flag(BYTE *pBuff, int x, int y, int sx, int sy) { - int i, j; + int i, lti_old, cta_old, lpi_old; BYTE *dst; MICROS *pMap; - /// ASSERT: assert(gpBuffer); + lti_old = light_table_index; + cta_old = cel_transparency_active; + lpi_old = level_piece_id; + level_piece_id = dPiece[x][y]; + light_table_index = dLight[x][y]; + cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); pMap = &dpiece_defs_map_1[IsometricCoord(x, y)]; - if (eflag) { - if ((DWORD)y < MAXDUNY && (DWORD)x < MAXDUNX) { - level_piece_id = dPiece[x][y]; - light_table_index = dLight[x][y]; - if (level_piece_id != 0) { - dst = &gpBuffer[sx + 32 + PitchTbl[sy]]; - cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); - arch_draw_type = 2; - level_cel_block = pMap->mt[1]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - arch_draw_type = 0; - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[3]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[5]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[7]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[9]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[11]; - if (level_cel_block != 0 && leveltype == DTYPE_HELL) { - drawLowerScreen(dst); - } - scrollrt_draw_clipped_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, 0); - } else { - world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); - } - } - x++; - y--; - sx += 64; - pMap++; - chunks--; + dst = pBuff; + arch_draw_type = 1; + level_cel_block = pMap->mt[0]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + arch_draw_type = 2; + level_cel_block = pMap->mt[1]; + if (level_cel_block != 0) { + drawLowerScreen(dst + 32); } - j = chunks; - while (j-- != 0) { - if (y < 0 || x >= MAXDUNX) { - break; + dst = pBuff; + arch_draw_type = 0; + for (i = 2; i < MicroTileLen; i += 2) { + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[i]; + if (level_cel_block != 0) { + drawLowerScreen(dst); } - if (y < MAXDUNY && x >= 0) { - level_piece_id = dPiece[x][y]; - light_table_index = dLight[x][y]; - if (level_piece_id == 0) { - world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); - } else { - dst = &gpBuffer[sx + PitchTbl[sy]]; - cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); - arch_draw_type = 1; - level_cel_block = pMap->mt[0]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - arch_draw_type = 2; - level_cel_block = pMap->mt[1]; - if (level_cel_block != 0) { - drawLowerScreen(dst + 32); - } - arch_draw_type = 0; - for (i = 2; i < MicroTileLen; i += 2) { - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[i]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - level_cel_block = pMap->mt[i + 1]; - if (level_cel_block != 0) { - drawLowerScreen(dst + 32); - } - } - scrollrt_draw_clipped_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, 1); - } + level_cel_block = pMap->mt[i + 1]; + if (level_cel_block != 0) { + drawLowerScreen(dst + 32); } - x++; - y--; - sx += 64; - pMap++; } - if (eflag && (DWORD)y < MAXDUNY && (DWORD)x < MAXDUNX) { - level_piece_id = dPiece[x][y]; - light_table_index = dLight[x][y]; - if (level_piece_id == 0) { - world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); - } else { - dst = &gpBuffer[sx + PitchTbl[sy]]; - cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); - arch_draw_type = 1; - level_cel_block = pMap->mt[0]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - arch_draw_type = 0; - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[2]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[4]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[6]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[8]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[10]; - if (level_cel_block != 0 && leveltype == DTYPE_HELL) { - drawLowerScreen(dst); - } - scrollrt_draw_clipped_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, 0); - } - } + scrollrt_draw_clipped_dungeon(pBuff, x, y, sx, sy, 0); + + light_table_index = lti_old; + cel_transparency_active = cta_old; + level_piece_id = lpi_old; } -void scrollrt_draw_clipped_dungeon(BYTE *pBuff, int sx, int sy, int dx, int dy, int eflag) +static void scrollrt_draw_clipped_dungeon(BYTE *pBuff, int sx, int sy, int dx, int dy, int eflag) { int px, py, nCel, nMon, negMon, p; char bFlag, bDead, bObj, bItem, bPlr, bArch, bMap, negPlr, dd; @@ -863,140 +913,187 @@ void scrollrt_draw_clipped_dungeon(BYTE *pBuff, int sx, int sy, int dx, int dy, if (pCelBuff != NULL) { pFrameTable = (DWORD *)pCelBuff; nCel = pItem->_iAnimFrame; - if (nCel >= 1 && pFrameTable[0] <= 50 && nCel <= (int)pFrameTable[0]) { - px = dx - pItem->_iAnimWidth2; - if (bItem - 1 == pcursitem) { - CelDrawHdrClrHL(181, px, dy, pCelBuff, nCel, pItem->_iAnimWidth, 0, 8); - } - Cel2DecodeHdrLight(px, dy, pItem->_iAnimData, pItem->_iAnimFrame, pItem->_iAnimWidth, 0, 8); - } else { - /* - app_fatal( - "Draw Clipped \"%s\" Item 2: frame %d of %d, item type==%d", - pItem->_iIName, - nCel, - pFrameTable[0], - pItem->_itype); - */ - } - } else { - // app_fatal("Draw Item \"%s\" Clipped 2: NULL Cel Buffer", pItem->_iIName); - } - } - } - } - if (bArch != 0) { - cel_transparency_active = TransList[bMap]; - Cel2DecodeLightTrans(pBuff, pSpecialCels, bArch, 64, 0, 8); - } -} - -void DrawClippedMonster(int x, int y, int mx, int my, int m, int CelSkip, int CelCap) -{ - int nCel; - char trans; - BYTE *pCelBuff; - DWORD *pFrameTable; - - if ((DWORD)m >= MAXMONSTERS) { - // app_fatal("Draw Monster Clipped: tried to draw illegal monster %d", m); - return; - } - - pCelBuff = monster[m]._mAnimData; - if (!pCelBuff) { - // app_fatal("Draw Monster \"%s\" Clipped: NULL Cel Buffer", monster[m].mName); - return; - } - - nCel = monster[m]._mAnimFrame; - pFrameTable = (DWORD *)pCelBuff; - if (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { - /* - const char *szMode = "unknown action"; - if(monster[m]._mmode <= 17) - szMode = szMonModeAssert[monster[m]._mmode]; - app_fatal( - "Draw Monster \"%s\" %s Clipped: facing %d, frame %d of %d", - monster[m].mName, - szMode, - monster[m]._mdir, - nCel, - pFrameTable[0]); - */ - return; + if (nCel >= 1 && pFrameTable[0] <= 50 && nCel <= (int)pFrameTable[0]) { + px = dx - pItem->_iAnimWidth2; + if (bItem - 1 == pcursitem) { + CelDrawHdrClrHL(181, px, dy, pCelBuff, nCel, pItem->_iAnimWidth, 0, 8); + } + Cel2DecodeHdrLight(px, dy, pItem->_iAnimData, pItem->_iAnimFrame, pItem->_iAnimWidth, 0, 8); + } else { + /* + app_fatal( + "Draw Clipped \"%s\" Item 2: frame %d of %d, item type==%d", + pItem->_iIName, + nCel, + pFrameTable[0], + pItem->_itype); + */ + } + } else { + // app_fatal("Draw Item \"%s\" Clipped 2: NULL Cel Buffer", pItem->_iIName); + } + } + } } - - if (!(dFlags[x][y] & BFLAG_LIT)) { - Cl2DecodeFrm5(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, 1); - } else { - trans = 0; - if (monster[m]._uniqtype) - trans = monster[m]._uniqtrans + 4; - if (monster[m]._mmode == MM_STONE) - trans = 2; - if (plr[myplr]._pInfraFlag && light_table_index > 8) - trans = 1; - if (trans) - Cl2DecodeFrm5(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, trans); - else - Cl2DecodeFrm6(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap); + if (bArch != 0) { + cel_transparency_active = TransList[bMap]; + Cel2DecodeLightTrans(pBuff, pSpecialCels, bArch, 64, 0, 8); } } -void DrawClippedObject(int x, int y, int ox, int oy, BOOL pre, int CelSkip, int CelCap) +static void scrollrt_draw_lower(int x, int y, int sx, int sy, int chunks, int eflag) { - int sx, sy, xx, yy, nCel; - char bv; - BYTE *pCelBuff; - DWORD *pFrameTable; + int i, j; + BYTE *dst; + MICROS *pMap; - if (dObject[x][y] > 0) { - bv = dObject[x][y] - 1; - if (object[bv]._oPreFlag != pre) - return; - sx = ox - object[bv]._oAnimWidth2; - sy = oy; - } else { - bv = -(dObject[x][y] + 1); - if (object[bv]._oPreFlag != pre) - return; - xx = object[bv]._ox - x; - yy = object[bv]._oy - y; - sx = (xx << 5) + ox - object[bv]._oAnimWidth2 - (yy << 5); - sy = oy + (yy << 4) + (xx << 4); - CelSkip = 0; - CelCap = 8; - } + /// ASSERT: assert(gpBuffer); - /// ASSERT: assert((unsigned char)bv < MAXOBJECTS); - if ((BYTE)bv >= MAXOBJECTS) - return; + pMap = &dpiece_defs_map_1[IsometricCoord(x, y)]; - pCelBuff = object[bv]._oAnimData; - if (!pCelBuff) { - // app_fatal("Draw Object type %d Clipped: NULL Cel Buffer", object[bv]._otype); - return; + if (eflag) { + if ((DWORD)y < MAXDUNY && (DWORD)x < MAXDUNX) { + level_piece_id = dPiece[x][y]; + light_table_index = dLight[x][y]; + if (level_piece_id != 0) { + dst = &gpBuffer[sx + 32 + PitchTbl[sy]]; + cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); + arch_draw_type = 2; + level_cel_block = pMap->mt[1]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + arch_draw_type = 0; + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[3]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[5]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[7]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[9]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[11]; + if (level_cel_block != 0 && leveltype == DTYPE_HELL) { + drawLowerScreen(dst); + } + scrollrt_draw_clipped_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, 0); + } else { + world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); + } + } + x++; + y--; + sx += 64; + pMap++; + chunks--; } - nCel = object[bv]._oAnimFrame; - pFrameTable = (DWORD *)pCelBuff; - if (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { - // app_fatal("Draw Clipped Object: frame %d of %d, object type==%d", nCel, pFrameTable[0], object[bv]._otype); - return; + j = chunks; + while (j-- != 0) { + if (y < 0 || x >= MAXDUNX) { + break; + } + if (y < MAXDUNY && x >= 0) { + level_piece_id = dPiece[x][y]; + light_table_index = dLight[x][y]; + if (level_piece_id == 0) { + world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); + } else { + dst = &gpBuffer[sx + PitchTbl[sy]]; + cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); + arch_draw_type = 1; + level_cel_block = pMap->mt[0]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + arch_draw_type = 2; + level_cel_block = pMap->mt[1]; + if (level_cel_block != 0) { + drawLowerScreen(dst + 32); + } + arch_draw_type = 0; + for (i = 2; i < MicroTileLen; i += 2) { + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[i]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + level_cel_block = pMap->mt[i + 1]; + if (level_cel_block != 0) { + drawLowerScreen(dst + 32); + } + } + scrollrt_draw_clipped_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, 1); + } + } + x++; + y--; + sx += 64; + pMap++; } - if (bv == pcursobj) - CelDrawHdrClrHL(194, sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); - if (object[bv]._oLight) - Cel2DecodeHdrLight(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); - else - Cel2DrawHdrOnly(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); + if (eflag && (DWORD)y < MAXDUNY && (DWORD)x < MAXDUNX) { + level_piece_id = dPiece[x][y]; + light_table_index = dLight[x][y]; + if (level_piece_id == 0) { + world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); + } else { + dst = &gpBuffer[sx + PitchTbl[sy]]; + cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); + arch_draw_type = 1; + level_cel_block = pMap->mt[0]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + arch_draw_type = 0; + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[2]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[4]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[6]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[8]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[10]; + if (level_cel_block != 0 && leveltype == DTYPE_HELL) { + drawLowerScreen(dst); + } + scrollrt_draw_clipped_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, 0); + } + } } -void scrollrt_draw_clipped_e_flag(BYTE *pBuff, int x, int y, int sx, int sy) +static void scrollrt_draw_clipped_dungeon_2(BYTE *pBuff, int sx, int sy, int skipChunks, int CelSkip, int dx, int dy, int eflag); + +static void scrollrt_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int skipChunks, int CelSkip, int sx, int sy) { - int i, lti_old, cta_old, lpi_old; + int lti_old, cta_old, lpi_old; BYTE *dst; MICROS *pMap; @@ -1006,143 +1103,63 @@ void scrollrt_draw_clipped_e_flag(BYTE *pBuff, int x, int y, int sx, int sy) level_piece_id = dPiece[x][y]; light_table_index = dLight[x][y]; + dst = &pBuff[BUFFER_WIDTH * 32 * skipChunks]; cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); pMap = &dpiece_defs_map_1[IsometricCoord(x, y)]; - dst = pBuff; - arch_draw_type = 1; - level_cel_block = pMap->mt[0]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - arch_draw_type = 2; - level_cel_block = pMap->mt[1]; - if (level_cel_block != 0) { - drawLowerScreen(dst + 32); - } - - dst = pBuff; - arch_draw_type = 0; - for (i = 2; i < MicroTileLen; i += 2) { + switch (skipChunks) { + case 0: + level_cel_block = pMap->mt[2]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + level_cel_block = pMap->mt[3]; + if (level_cel_block != 0) { + drawLowerScreen(dst + 32); + } + case 1: + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[4]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + level_cel_block = pMap->mt[5]; + if (level_cel_block != 0) { + drawLowerScreen(dst + 32); + } + case 2: + dst -= BUFFER_WIDTH * 32; + level_cel_block = pMap->mt[6]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } + level_cel_block = pMap->mt[7]; + if (level_cel_block != 0) { + drawLowerScreen(dst + 32); + } + case 3: dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[i]; + level_cel_block = pMap->mt[8]; if (level_cel_block != 0) { drawLowerScreen(dst); } - level_cel_block = pMap->mt[i + 1]; + level_cel_block = pMap->mt[9]; if (level_cel_block != 0) { drawLowerScreen(dst + 32); } + break; } - scrollrt_draw_clipped_dungeon(pBuff, x, y, sx, sy, 0); + if (CelSkip < 8) { + scrollrt_draw_clipped_dungeon_2(pBuff, x, y, skipChunks, CelSkip, sx, sy, 0); + } light_table_index = lti_old; cel_transparency_active = cta_old; level_piece_id = lpi_old; } -void scrollrt_draw_lower_2(int x, int y, int sx, int sy, int chunks, int skipChunks, int eflag) -{ - int i, j, CelSkip; - BYTE *dst; - MICROS *pMap; - - /// ASSERT: assert(gpBuffer); - - pMap = &dpiece_defs_map_1[IsometricCoord(x, y)]; - CelSkip = 2 * skipChunks + 2; - - if (eflag) { - if (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) { - level_piece_id = dPiece[x][y]; - light_table_index = dLight[x][y]; - if (level_piece_id != 0) { - dst = &gpBuffer[sx - (BUFFER_WIDTH * 32 - 32) + PitchTbl[sy]]; - cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); - for (i = 0; i < (MicroTileLen >> 1) - 1; i++) { - if (skipChunks <= i) { - level_cel_block = pMap->mt[2 * i + 3]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - } - dst -= BUFFER_WIDTH * 32; - } - if (CelSkip < 8) { - scrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - BUFFER_WIDTH * 16 * CelSkip], x, y, skipChunks, CelSkip, sx, sy, 0); - } - } - } - x++; - y--; - sx += 64; - chunks--; - pMap++; - } - - j = chunks; - while (j-- != 0) { - if (x >= MAXDUNX || y < 0) { - break; - } - if (y < MAXDUNY && x >= 0) { - level_piece_id = dPiece[x][y]; - light_table_index = dLight[x][y]; - if (level_piece_id != 0) { - dst = &gpBuffer[sx - BUFFER_WIDTH * 32 + PitchTbl[sy]]; - cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); - i = 0; - while (i < (MicroTileLen >> 1) - 1) { - if (skipChunks <= i) { - level_cel_block = pMap->mt[2 * i + 2]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - level_cel_block = pMap->mt[2 * i + 3]; - if (level_cel_block != 0) { - drawLowerScreen(dst + 32); - } - } - i++; - dst -= BUFFER_WIDTH * 32; - } - if (CelSkip < 8) { - scrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - BUFFER_WIDTH * 32 * (skipChunks + 1)], x, y, skipChunks, CelSkip, sx, sy, 1); - } - } - } - x++; - y--; - sx += 64; - pMap++; - } - - if (eflag) { - if ((DWORD)y < MAXDUNY && (DWORD)x < MAXDUNX) { - level_piece_id = dPiece[x][y]; - light_table_index = dLight[x][y]; - if (level_piece_id != 0) { - dst = &gpBuffer[sx - BUFFER_WIDTH * 32 + PitchTbl[sy]]; - cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); - for (i = 0; i < (MicroTileLen >> 1) - 1; i++) { - if (skipChunks <= i) { - level_cel_block = pMap->mt[2 * i + 2]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - } - dst -= BUFFER_WIDTH * 32; - } - if (CelSkip < 8) { - scrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - BUFFER_WIDTH * 16 * CelSkip], x, y, skipChunks, CelSkip, sx, sy, 0); - } - } - } - } -} - -void scrollrt_draw_clipped_dungeon_2(BYTE *pBuff, int sx, int sy, int skipChunks, int CelSkip, int dx, int dy, int eflag) +static void scrollrt_draw_clipped_dungeon_2(BYTE *pBuff, int sx, int sy, int skipChunks, int CelSkip, int dx, int dy, int eflag) { int px, py, nCel, nMon, negMon, p; char bFlag, bDead, bObj, bItem, bPlr, bArch, bMap, negPlr, dd; @@ -1356,127 +1373,36 @@ void scrollrt_draw_clipped_dungeon_2(BYTE *pBuff, int sx, int sy, int skipChunks } } -void scrollrt_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int skipChunks, int CelSkip, int sx, int sy) -{ - int lti_old, cta_old, lpi_old; - BYTE *dst; - MICROS *pMap; - - lti_old = light_table_index; - cta_old = cel_transparency_active; - lpi_old = level_piece_id; - - level_piece_id = dPiece[x][y]; - light_table_index = dLight[x][y]; - dst = &pBuff[BUFFER_WIDTH * 32 * skipChunks]; - cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); - pMap = &dpiece_defs_map_1[IsometricCoord(x, y)]; - - switch (skipChunks) { - case 0: - level_cel_block = pMap->mt[2]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - level_cel_block = pMap->mt[3]; - if (level_cel_block != 0) { - drawLowerScreen(dst + 32); - } - case 1: - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[4]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - level_cel_block = pMap->mt[5]; - if (level_cel_block != 0) { - drawLowerScreen(dst + 32); - } - case 2: - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[6]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - level_cel_block = pMap->mt[7]; - if (level_cel_block != 0) { - drawLowerScreen(dst + 32); - } - case 3: - dst -= BUFFER_WIDTH * 32; - level_cel_block = pMap->mt[8]; - if (level_cel_block != 0) { - drawLowerScreen(dst); - } - level_cel_block = pMap->mt[9]; - if (level_cel_block != 0) { - drawLowerScreen(dst + 32); - } - break; - } - - if (CelSkip < 8) { - scrollrt_draw_clipped_dungeon_2(pBuff, x, y, skipChunks, CelSkip, sx, sy, 0); - } - - light_table_index = lti_old; - cel_transparency_active = cta_old; - level_piece_id = lpi_old; -} - -void scrollrt_draw_upper(int x, int y, int sx, int sy, int chunks, int capChunks, int eflag) +static void scrollrt_draw_lower_2(int x, int y, int sx, int sy, int chunks, int skipChunks, int eflag) { - int i, j, CelCap; + int i, j, CelSkip; BYTE *dst; MICROS *pMap; /// ASSERT: assert(gpBuffer); pMap = &dpiece_defs_map_1[IsometricCoord(x, y)]; - CelCap = 2 * capChunks + 2; - if (CelCap > 8) { - CelCap = 8; - } + CelSkip = 2 * skipChunks + 2; if (eflag) { if (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) { level_piece_id = dPiece[x][y]; light_table_index = dLight[x][y]; if (level_piece_id != 0) { - dst = &gpBuffer[sx + 32 + PitchTbl[sy]]; + dst = &gpBuffer[sx - (BUFFER_WIDTH * 32 - 32) + PitchTbl[sy]]; cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); - if (capChunks >= 0) { - level_cel_block = pMap->mt[1]; - if (level_cel_block != 0) { - arch_draw_type = 2; - drawUpperScreen(dst); - arch_draw_type = 0; - } - } - dst -= BUFFER_WIDTH * 32; - if (capChunks >= 1) { - level_cel_block = pMap->mt[3]; - if (level_cel_block != 0) { - drawUpperScreen(dst); - } - } - dst -= BUFFER_WIDTH * 32; - if (capChunks >= 2) { - level_cel_block = pMap->mt[5]; - if (level_cel_block != 0) { - drawUpperScreen(dst); + for (i = 0; i < (MicroTileLen >> 1) - 1; i++) { + if (skipChunks <= i) { + level_cel_block = pMap->mt[2 * i + 3]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } } + dst -= BUFFER_WIDTH * 32; } - dst -= BUFFER_WIDTH * 32; - if (capChunks >= 3) { - level_cel_block = pMap->mt[7]; - if (level_cel_block != 0) { - drawUpperScreen(dst); - } + if (CelSkip < 8) { + scrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - BUFFER_WIDTH * 16 * CelSkip], x, y, skipChunks, CelSkip, sx, sy, 0); } - scrollrt_draw_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, capChunks, CelCap, sx, sy, 0); - } else { - world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); } } x++; @@ -1486,40 +1412,35 @@ void scrollrt_draw_upper(int x, int y, int sx, int sy, int chunks, int capChunks pMap++; } - for (j = 0; j < chunks; j++) { - if (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) { + j = chunks; + while (j-- != 0) { + if (x >= MAXDUNX || y < 0) { + break; + } + if (y < MAXDUNY && x >= 0) { level_piece_id = dPiece[x][y]; light_table_index = dLight[x][y]; if (level_piece_id != 0) { - dst = &gpBuffer[sx + PitchTbl[sy]]; + dst = &gpBuffer[sx - BUFFER_WIDTH * 32 + PitchTbl[sy]]; cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); - arch_draw_type = 1; - level_cel_block = pMap->mt[0]; - if (level_cel_block != 0) { - drawUpperScreen(dst); - } - arch_draw_type = 2; - level_cel_block = pMap->mt[1]; - if (level_cel_block != 0) { - drawUpperScreen(dst + 32); - } - arch_draw_type = 0; - for (i = 1; i < (MicroTileLen >> 1) - 1; i++) { - dst -= BUFFER_WIDTH * 32; - if (capChunks >= i) { - level_cel_block = pMap->mt[2 * i]; + i = 0; + while (i < (MicroTileLen >> 1) - 1) { + if (skipChunks <= i) { + level_cel_block = pMap->mt[2 * i + 2]; if (level_cel_block != 0) { - drawUpperScreen(dst); + drawLowerScreen(dst); } - level_cel_block = pMap->mt[2 * i + 1]; + level_cel_block = pMap->mt[2 * i + 3]; if (level_cel_block != 0) { - drawUpperScreen(dst + 32); + drawLowerScreen(dst + 32); } } + i++; + dst -= BUFFER_WIDTH * 32; + } + if (CelSkip < 8) { + scrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - BUFFER_WIDTH * 32 * (skipChunks + 1)], x, y, skipChunks, CelSkip, sx, sy, 1); } - scrollrt_draw_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, capChunks, CelCap, sx, sy, 1); - } else { - world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); } } x++; @@ -1529,50 +1450,81 @@ void scrollrt_draw_upper(int x, int y, int sx, int sy, int chunks, int capChunks } if (eflag) { - if (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) { + if ((DWORD)y < MAXDUNY && (DWORD)x < MAXDUNX) { level_piece_id = dPiece[x][y]; light_table_index = dLight[x][y]; if (level_piece_id != 0) { - dst = &gpBuffer[sx + PitchTbl[sy]]; + dst = &gpBuffer[sx - BUFFER_WIDTH * 32 + PitchTbl[sy]]; cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); - arch_draw_type = 1; - if (capChunks >= 0) { - level_cel_block = pMap->mt[0]; - if (level_cel_block != 0) { - drawUpperScreen(dst); - } - } - arch_draw_type = 0; - dst -= BUFFER_WIDTH * 32; - if (capChunks >= 1) { - level_cel_block = pMap->mt[2]; - if (level_cel_block != 0) { - drawUpperScreen(dst); - } - } - dst -= BUFFER_WIDTH * 32; - if (capChunks >= 2) { - level_cel_block = pMap->mt[4]; - if (level_cel_block != 0) { - drawUpperScreen(dst); + for (i = 0; i < (MicroTileLen >> 1) - 1; i++) { + if (skipChunks <= i) { + level_cel_block = pMap->mt[2 * i + 2]; + if (level_cel_block != 0) { + drawLowerScreen(dst); + } } + dst -= BUFFER_WIDTH * 32; } - dst -= BUFFER_WIDTH * 32; - if (capChunks >= 3) { - level_cel_block = pMap->mt[6]; - if (level_cel_block != 0) { - drawUpperScreen(dst); - } + if (CelSkip < 8) { + scrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - BUFFER_WIDTH * 16 * CelSkip], x, y, skipChunks, CelSkip, sx, sy, 0); } - scrollrt_draw_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, capChunks, CelCap, sx, sy, 0); - } else { - world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); } } } } -void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int capChunks, int CelCap, int dx, int dy, int eflag) +static void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int capChunks, int CelCap, int dx, int dy, int eflag); + +static void scrollrt_draw_e_flag(BYTE *pBuff, int x, int y, int capChunks, int CelCap, int sx, int sy) +{ + int i, lti_old, cta_old, lpi_old; + BYTE *dst; + MICROS *pMap; + + lti_old = light_table_index; + cta_old = cel_transparency_active; + lpi_old = level_piece_id; + + level_piece_id = dPiece[x][y]; + light_table_index = dLight[x][y]; + dst = pBuff; + cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); + pMap = &dpiece_defs_map_1[IsometricCoord(x, y)]; + + arch_draw_type = 1; + level_cel_block = pMap->mt[0]; + if (level_cel_block != 0) { + drawUpperScreen(dst); + } + arch_draw_type = 2; + level_cel_block = pMap->mt[1]; + if (level_cel_block != 0) { + drawUpperScreen(dst + 32); + } + + arch_draw_type = 0; + for (i = 1; i < (MicroTileLen >> 1) - 1; i++) { + dst -= BUFFER_WIDTH * 32; + if (capChunks >= i) { + level_cel_block = pMap->mt[2 * i]; + if (level_cel_block != 0) { + drawUpperScreen(dst); + } + level_cel_block = pMap->mt[2 * i + 1]; + if (level_cel_block != 0) { + drawUpperScreen(dst + 32); + } + } + } + + scrollrt_draw_dungeon(pBuff, x, y, capChunks, CelCap, sx, sy, 0); + + light_table_index = lti_old; + cel_transparency_active = cta_old; + level_piece_id = lpi_old; +} + +static void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int capChunks, int CelCap, int dx, int dy, int eflag) { int px, py, nCel, nMon, negMon, p, tx, ty; char bFlag, bDead, bObj, bItem, bPlr, bArch, bMap, negPlr, dd; @@ -1776,162 +1728,257 @@ void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int capChunks, int CelCa } } -void DrawMonster(int x, int y, int mx, int my, int m, int CelSkip, int CelCap) +static void scrollrt_draw_upper(int x, int y, int sx, int sy, int chunks, int capChunks, int eflag) { - int nCel; - char trans; - BYTE *pCelBuff; - DWORD *pFrameTable; + int i, j, CelCap; + BYTE *dst; + MICROS *pMap; - if ((DWORD)m >= MAXMONSTERS) { - // app_fatal("Draw Monster: tried to draw illegal monster %d", m); - return; + /// ASSERT: assert(gpBuffer); + + pMap = &dpiece_defs_map_1[IsometricCoord(x, y)]; + CelCap = 2 * capChunks + 2; + if (CelCap > 8) { + CelCap = 8; } - pCelBuff = monster[m]._mAnimData; - if (!pCelBuff) { - // app_fatal("Draw Monster \"%s\": NULL Cel Buffer", monster[m].mName); - return; + if (eflag) { + if (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) { + level_piece_id = dPiece[x][y]; + light_table_index = dLight[x][y]; + if (level_piece_id != 0) { + dst = &gpBuffer[sx + 32 + PitchTbl[sy]]; + cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); + if (capChunks >= 0) { + level_cel_block = pMap->mt[1]; + if (level_cel_block != 0) { + arch_draw_type = 2; + drawUpperScreen(dst); + arch_draw_type = 0; + } + } + dst -= BUFFER_WIDTH * 32; + if (capChunks >= 1) { + level_cel_block = pMap->mt[3]; + if (level_cel_block != 0) { + drawUpperScreen(dst); + } + } + dst -= BUFFER_WIDTH * 32; + if (capChunks >= 2) { + level_cel_block = pMap->mt[5]; + if (level_cel_block != 0) { + drawUpperScreen(dst); + } + } + dst -= BUFFER_WIDTH * 32; + if (capChunks >= 3) { + level_cel_block = pMap->mt[7]; + if (level_cel_block != 0) { + drawUpperScreen(dst); + } + } + scrollrt_draw_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, capChunks, CelCap, sx, sy, 0); + } else { + world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); + } + } + x++; + y--; + sx += 64; + chunks--; + pMap++; } - nCel = monster[m]._mAnimFrame; - pFrameTable = (DWORD *)pCelBuff; - if (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { - /* - const char *szMode = "unknown action"; - if(monster[m]._mmode <= 17) - szMode = szMonModeAssert[monster[m]._mmode]; - app_fatal( - "Draw Monster \"%s\" %s: facing %d, frame %d of %d", - monster[m].mName, - szMode, - monster[m]._mdir, - nCel, - pFrameTable[0]); - */ - return; + for (j = 0; j < chunks; j++) { + if (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) { + level_piece_id = dPiece[x][y]; + light_table_index = dLight[x][y]; + if (level_piece_id != 0) { + dst = &gpBuffer[sx + PitchTbl[sy]]; + cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); + arch_draw_type = 1; + level_cel_block = pMap->mt[0]; + if (level_cel_block != 0) { + drawUpperScreen(dst); + } + arch_draw_type = 2; + level_cel_block = pMap->mt[1]; + if (level_cel_block != 0) { + drawUpperScreen(dst + 32); + } + arch_draw_type = 0; + for (i = 1; i < (MicroTileLen >> 1) - 1; i++) { + dst -= BUFFER_WIDTH * 32; + if (capChunks >= i) { + level_cel_block = pMap->mt[2 * i]; + if (level_cel_block != 0) { + drawUpperScreen(dst); + } + level_cel_block = pMap->mt[2 * i + 1]; + if (level_cel_block != 0) { + drawUpperScreen(dst + 32); + } + } + } + scrollrt_draw_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, capChunks, CelCap, sx, sy, 1); + } else { + world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); + } + } + x++; + y--; + sx += 64; + pMap++; } - if (!(dFlags[x][y] & BFLAG_LIT)) { - Cl2DecodeFrm3(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, 1); - } else { - trans = 0; - if (monster[m]._uniqtype) - trans = monster[m]._uniqtrans + 4; - if (monster[m]._mmode == MM_STONE) - trans = 2; - if (plr[myplr]._pInfraFlag && light_table_index > 8) - trans = 1; - if (trans) - Cl2DecodeFrm3(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, trans); - else - Cl2DecodeLightTbl(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap); + if (eflag) { + if (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) { + level_piece_id = dPiece[x][y]; + light_table_index = dLight[x][y]; + if (level_piece_id != 0) { + dst = &gpBuffer[sx + PitchTbl[sy]]; + cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); + arch_draw_type = 1; + if (capChunks >= 0) { + level_cel_block = pMap->mt[0]; + if (level_cel_block != 0) { + drawUpperScreen(dst); + } + } + arch_draw_type = 0; + dst -= BUFFER_WIDTH * 32; + if (capChunks >= 1) { + level_cel_block = pMap->mt[2]; + if (level_cel_block != 0) { + drawUpperScreen(dst); + } + } + dst -= BUFFER_WIDTH * 32; + if (capChunks >= 2) { + level_cel_block = pMap->mt[4]; + if (level_cel_block != 0) { + drawUpperScreen(dst); + } + } + dst -= BUFFER_WIDTH * 32; + if (capChunks >= 3) { + level_cel_block = pMap->mt[6]; + if (level_cel_block != 0) { + drawUpperScreen(dst); + } + } + scrollrt_draw_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, capChunks, CelCap, sx, sy, 0); + } else { + world_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]); + } + } } } -void DrawObject(int x, int y, int ox, int oy, BOOL pre, int CelSkip, int CelCap) +static void DrawGame(int x, int y) { - int sx, sy, xx, yy, nCel; - char bv; - BYTE *pCelBuff; - DWORD *pFrameTable; + int i, sx, sy, chunks, blocks; - if (dObject[x][y] > 0) { - bv = dObject[x][y] - 1; - if (object[bv]._oPreFlag != pre) - return; - sx = ox - object[bv]._oAnimWidth2; - sy = oy; - } else { - bv = -(dObject[x][y] + 1); - if (object[bv]._oPreFlag != pre) - return; - xx = object[bv]._ox - x; - yy = object[bv]._oy - y; - sx = (xx << 5) + ox - object[bv]._oAnimWidth2 - (yy << 5); - sy = oy + (yy << 4) + (xx << 4); - CelSkip = 0; - CelCap = 8; - } + scr_pix_width = SCREEN_WIDTH; + scr_pix_height = VIEWPORT_HEIGHT; + dword_5C2FF8 = SCREEN_WIDTH / 64; + dword_5C2FFC = VIEWPORT_HEIGHT / 32; - /// ASSERT: assert((unsigned char)bv < MAXOBJECTS); - if ((BYTE)bv >= MAXOBJECTS) - return; + sx = ScrollInfo._sxoff + 64; + sy = ScrollInfo._syoff + 175; + x -= 10; + y--; + chunks = 10; + blocks = 8; - pCelBuff = object[bv]._oAnimData; - if (!pCelBuff) { - // app_fatal("Draw Object type %d: NULL Cel Buffer", object[bv]._otype); - return; + if (chrflag || questlog) { + x += 2; + y -= 2; + sx += 288; + chunks = 6; } - - nCel = object[bv]._oAnimFrame; - pFrameTable = (DWORD *)pCelBuff; - if (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) { - // app_fatal("Draw Object: frame %d of %d, object type==%d", nCel, pFrameTable[0], object[bv]._otype); - return; + if (invflag || sbookflag) { + x += 2; + y -= 2; + sx -= 32; + chunks = 6; } - if (bv == pcursobj) - CelDecodeClr(194, sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); - if (object[bv]._oLight) { - CelDecodeHdrLightOnly(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); - } else { - /// ASSERT: assert(object[bv]._oAnimData); - if (object[bv]._oAnimData) // BUGFIX: _oAnimData was already checked, this is redundant - CelDrawHdrOnly(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap); + switch (ScrollInfo._sdir) { + case SDIR_NONE: + break; + case SDIR_NE: + chunks++; + case SDIR_N: + sy -= 32; + x--; + y--; + blocks++; + break; + case SDIR_SE: + blocks++; + case SDIR_E: + chunks++; + break; + case SDIR_S: + blocks++; + break; + case SDIR_SW: + blocks++; + case SDIR_W: + sx -= 64; + x--; + y++; + chunks++; + break; + case SDIR_NW: + sx -= 64; + sy -= 32; + x -= 2; + chunks++; + blocks++; + break; } -} -void scrollrt_draw_e_flag(BYTE *pBuff, int x, int y, int capChunks, int CelCap, int sx, int sy) -{ - int i, lti_old, cta_old, lpi_old; - BYTE *dst; - MICROS *pMap; - - lti_old = light_table_index; - cta_old = cel_transparency_active; - lpi_old = level_piece_id; - - level_piece_id = dPiece[x][y]; - light_table_index = dLight[x][y]; - dst = pBuff; - cel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]); - pMap = &dpiece_defs_map_1[IsometricCoord(x, y)]; - - arch_draw_type = 1; - level_cel_block = pMap->mt[0]; - if (level_cel_block != 0) { - drawUpperScreen(dst); + /// ASSERT: assert(gpBuffer); + gpBufEnd = &gpBuffer[PitchTbl[0 + SCREEN_Y]]; + for (i = 0; i < 4; i++) { + scrollrt_draw_upper(x, y, sx, sy, chunks, i, 0); + y++; + sx -= 32; + sy += 16; + scrollrt_draw_upper(x, y, sx, sy, chunks, i, 1); + x++; + sx += 32; + sy += 16; } - arch_draw_type = 2; - level_cel_block = pMap->mt[1]; - if (level_cel_block != 0) { - drawUpperScreen(dst + 32); + /// ASSERT: assert(gpBuffer); + gpBufEnd = &gpBuffer[PitchTbl[VIEWPORT_HEIGHT + SCREEN_Y]]; + for (i = 0; i < blocks; i++) { + scrollrt_draw_lower(x, y, sx, sy, chunks, 0); + y++; + sx -= 32; + sy += 16; + scrollrt_draw_lower(x, y, sx, sy, chunks, 1); + x++; + sx += 32; + sy += 16; } - arch_draw_type = 0; - for (i = 1; i < (MicroTileLen >> 1) - 1; i++) { - dst -= BUFFER_WIDTH * 32; - if (capChunks >= i) { - level_cel_block = pMap->mt[2 * i]; - if (level_cel_block != 0) { - drawUpperScreen(dst); - } - level_cel_block = pMap->mt[2 * i + 1]; - if (level_cel_block != 0) { - drawUpperScreen(dst + 32); - } - } + for (i = 0; i < 4; i++) { + scrollrt_draw_lower_2(x, y, sx, sy, chunks, i, 0); + y++; + sx -= 32; + sy += 16; + scrollrt_draw_lower_2(x, y, sx, sy, chunks, i, 1); + x++; + sx += 32; + sy += 16; } - - scrollrt_draw_dungeon(pBuff, x, y, capChunks, CelCap, sx, sy, 0); - - light_table_index = lti_old; - cel_transparency_active = cta_old; - level_piece_id = lpi_old; } -void DrawZoom(int x, int y) +static void DrawZoom(int x, int y) { int i, sx, sy, chunks, blocks; int wdt, nSrcOff, nDstOff; @@ -2068,24 +2115,81 @@ void DrawZoom(int x, int y) dec edx jnz label1 } -#else - int hgt; - BYTE *src, *dst1, *dst2; - - src = &gpBuffer[nSrcOff]; - dst1 = &gpBuffer[nDstOff]; - dst2 = &gpBuffer[nDstOff + BUFFER_WIDTH]; - - for (hgt = 176; hgt != 0; hgt--, src -= BUFFER_WIDTH + wdt, dst1 -= 2 * (BUFFER_WIDTH + wdt), dst2 -= 2 * (BUFFER_WIDTH + wdt)) { - for (i = wdt; i != 0; i--) { - *dst1++ = *src; - *dst1++ = *src; - *dst2++ = *src; - *dst2++ = *src; - src++; - } +#else + int hgt; + BYTE *src, *dst1, *dst2; + + src = &gpBuffer[nSrcOff]; + dst1 = &gpBuffer[nDstOff]; + dst2 = &gpBuffer[nDstOff + BUFFER_WIDTH]; + + for (hgt = 176; hgt != 0; hgt--, src -= BUFFER_WIDTH + wdt, dst1 -= 2 * (BUFFER_WIDTH + wdt), dst2 -= 2 * (BUFFER_WIDTH + wdt)) { + for (i = wdt; i != 0; i--) { + *dst1++ = *src; + *dst1++ = *src; + *dst2++ = *src; + *dst2++ = *src; + src++; + } + } +#endif +} + +void DrawView(int StartX, int StartY) +{ + if (zoomflag) { + DrawGame(StartX, StartY); + } else { + DrawZoom(StartX, StartY); + } + if (automapflag) { + DrawAutomap(); + } + if (invflag) { + DrawInv(); + } else if (sbookflag) { + DrawSpellBook(); + } + + DrawDurIcon(); + + if (chrflag) { + DrawChr(); + } else if (questlog) { + DrawQuestLog(); + } else if (plr[myplr]._pStatPts != 0 && !spselflag) { + DrawLevelUpIcon(); + } + if (uitemflag) { + DrawUniqueInfo(); + } + if (qtextflag) { + DrawQText(); + } + if (spselflag) { + DrawSpellList(); + } + if (dropGoldFlag) { + DrawGoldSplit(dropGoldValue); + } + if (helpflag) { + DrawHelp(); } -#endif + if (msgflag) { + DrawDiabloMsg(); + } + if (deathflag) { + RedBack(); + } else if (PauseMode != 0) { + gmenu_draw_pause(); + } + + DrawPlrMsg(); + gmenu_draw(); + doom_draw(); + DrawInfoBox(); + DrawLifeFlask(); + DrawManaFlask(); } void ClearScreenBuffer() @@ -2148,310 +2252,65 @@ void ScrollView() } } if (MouseX > SCREEN_WIDTH - 20) { - if (dmaxx - 1 <= ViewX || dminy >= ViewY) { - if (dmaxx - 1 > ViewX) { - ViewX++; - scroll = TRUE; - } - if (dminy < ViewY) { - ViewY--; - scroll = TRUE; - } - } else { - ViewY--; - ViewX++; - scroll = TRUE; - } - } - if (MouseY < 20) { - if (dminy >= ViewY || dminx >= ViewX) { - if (dminy < ViewY) { - ViewY--; - scroll = TRUE; - } - if (dminx < ViewX) { - ViewX--; - scroll = TRUE; - } - } else { - ViewX--; - ViewY--; - scroll = TRUE; - } - } - if (MouseY > SCREEN_HEIGHT - 20) { - if (dmaxy - 1 <= ViewY || dmaxx - 1 <= ViewX) { - if (dmaxy - 1 > ViewY) { - ViewY++; - scroll = TRUE; - } - if (dmaxx - 1 > ViewX) { - ViewX++; - scroll = TRUE; - } - } else { - ViewX++; - ViewY++; - scroll = TRUE; - } - } - - if (scroll) - ScrollInfo._sdir = SDIR_NONE; -} - -void EnableFrameCount() -{ - frameflag = frameflag == 0; - framestart = GetTickCount(); -} -#endif - -void scrollrt_draw_game_screen(BOOL draw_cursor) -{ - int hgt; - - if (drawpanflag == 255) { - drawpanflag = 0; - hgt = SCREEN_HEIGHT; - } else { - hgt = 0; - } - - if (draw_cursor) { - lock_buf(0); - scrollrt_draw_cursor_item(); - unlock_buf(0); - } - - DrawMain(hgt, 0, 0, 0, 0, 0); - - if (draw_cursor) { - lock_buf(0); - scrollrt_draw_cursor_back_buffer(); - unlock_buf(0); - } -} - -void scrollrt_draw_cursor_back_buffer() -{ - int i; - BYTE *src, *dst; - - if (sgdwCursWdt == 0) { - return; - } - - /// ASSERT: assert(gpBuffer); - src = sgSaveBack; - dst = &gpBuffer[SCREENXY(sgdwCursX, sgdwCursY)]; - - for (i = sgdwCursHgt; i != 0; i--, src += sgdwCursWdt, dst += BUFFER_WIDTH) { - memcpy(dst, src, sgdwCursWdt); - } - - sgdwCursXOld = sgdwCursX; - sgdwCursYOld = sgdwCursY; - sgdwCursWdtOld = sgdwCursWdt; - sgdwCursHgtOld = sgdwCursHgt; - sgdwCursWdt = 0; -} - -void scrollrt_draw_cursor_item() -{ - int i, mx, my, col; - BYTE *src, *dst; - - /// ASSERT: assert(! sgdwCursWdt); - - if (pcurs <= 0 || cursW == 0 || cursH == 0) { - return; - } - - mx = MouseX - 1; - if (mx < 0) { - mx = 0; - } else if (mx > SCREEN_WIDTH - 1) { - return; - } - my = MouseY - 1; - if (my < 0) { - my = 0; - } else if (my > SCREEN_HEIGHT - 1) { - return; - } - - sgdwCursX = mx; - sgdwCursWdt = sgdwCursX + cursW + 1; - if (sgdwCursWdt > SCREEN_WIDTH - 1) { - sgdwCursWdt = SCREEN_WIDTH - 1; - } - sgdwCursX &= ~3; - sgdwCursWdt |= 3; - sgdwCursWdt -= sgdwCursX; - sgdwCursWdt++; - - sgdwCursY = my; - sgdwCursHgt = sgdwCursY + cursH + 1; - if (sgdwCursHgt > SCREEN_HEIGHT - 1) { - sgdwCursHgt = SCREEN_HEIGHT - 1; - } - sgdwCursHgt -= sgdwCursY; - sgdwCursHgt++; - - /// ASSERT: assert(sgdwCursWdt * sgdwCursHgt < sizeof sgSaveBack); - /// ASSERT: assert(gpBuffer); - dst = sgSaveBack; - src = &gpBuffer[SCREENXY(sgdwCursX, sgdwCursY)]; - - for (i = sgdwCursHgt; i != 0; i--, dst += sgdwCursWdt, src += BUFFER_WIDTH) { - memcpy(dst, src, sgdwCursWdt); - } - - mx++; - my++; - gpBufEnd = &gpBuffer[PitchTbl[SCREEN_HEIGHT + SCREEN_Y] - cursW - 2]; - - if (pcurs >= CURSOR_FIRSTITEM) { - col = PAL16_YELLOW + 5; - if (plr[myplr].HoldItem._iMagical != 0) { - col = PAL16_BLUE + 5; - } - if (!plr[myplr].HoldItem._iStatFlag) { - col = PAL16_RED + 5; - } - CelDrawHdrClrHL(col, mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8); - if (col != PAL16_RED + 5) { - Cel2DrawHdrOnly(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8); - } else { - Cel2DrawHdrLightRed(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8, 1); - } - } else { - Cel2DrawHdrOnly(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8); - } -} - -void DrawMain(int dwHgt, BOOL draw_desc, BOOL draw_hp, BOOL draw_mana, BOOL draw_sbar, BOOL draw_btn) -{ - int ysize; - DWORD dwTicks; - BOOL retry; - HRESULT hDDVal; - - ysize = dwHgt; - - if (!gbActive || lpDDSPrimary == NULL) { - return; - } - -#ifdef __cplusplus - if (lpDDSPrimary->IsLost() == DDERR_SURFACELOST) { - if (lpDDSPrimary->Restore() != DD_OK) { - return; - } -#else - if (lpDDSPrimary->lpVtbl->IsLost(lpDDSPrimary) == DDERR_SURFACELOST) { - if (lpDDSPrimary->lpVtbl->Restore(lpDDSPrimary) != DD_OK) { - return; - } -#endif - ResetPal(); - ysize = SCREEN_HEIGHT; - } - - if (lpDDSBackBuf == NULL) { - retry = TRUE; - dwTicks = GetTickCount(); - while (1) { - DDS_desc.dwSize = sizeof(DDS_desc); -#ifdef __cplusplus - hDDVal = lpDDSPrimary->Lock(NULL, &DDS_desc, DDLOCK_WRITEONLY | DDLOCK_WAIT, NULL); -#else - hDDVal = lpDDSPrimary->lpVtbl->Lock(lpDDSPrimary, NULL, &DDS_desc, DDLOCK_WRITEONLY | DDLOCK_WAIT, NULL); -#endif - if (hDDVal == DD_OK) { - break; + if (dmaxx - 1 <= ViewX || dminy >= ViewY) { + if (dmaxx - 1 > ViewX) { + ViewX++; + scroll = TRUE; } - if (dwTicks - GetTickCount() > 5000) { - break; + if (dminy < ViewY) { + ViewY--; + scroll = TRUE; } - Sleep(1); - if (hDDVal == DDERR_SURFACELOST) { - return; + } else { + ViewY--; + ViewX++; + scroll = TRUE; + } + } + if (MouseY < 20) { + if (dminy >= ViewY || dminx >= ViewX) { + if (dminy < ViewY) { + ViewY--; + scroll = TRUE; } - if (hDDVal != DDERR_WASSTILLDRAWING && hDDVal != DDERR_SURFACEBUSY) { - if (!retry || hDDVal != DDERR_GENERIC) { - break; - } - retry = FALSE; - dx_reinit(); - ysize = SCREEN_HEIGHT; - dwTicks = GetTickCount(); + if (dminx < ViewX) { + ViewX--; + scroll = TRUE; } + } else { + ViewX--; + ViewY--; + scroll = TRUE; } - if (hDDVal == DDERR_SURFACELOST - || hDDVal == DDERR_WASSTILLDRAWING - || hDDVal == DDERR_SURFACEBUSY) { - return; - } - if (hDDVal != DD_OK) { - DDErrMsg(hDDVal, 3707, "C:\\Src\\Diablo\\Source\\SCROLLRT.CPP"); - } - } - - /// ASSERT: assert(ysize >= 0 && ysize <= 480); // SCREEN_HEIGHT - - if (ysize > 0) { - DoBlitScreen(0, 0, SCREEN_WIDTH, ysize); } - if (ysize < SCREEN_HEIGHT) { - if (draw_sbar) { - DoBlitScreen(204, 357, 232, 28); - } - if (draw_desc) { - DoBlitScreen(176, 398, 288, 60); - } - if (draw_mana) { - DoBlitScreen(460, 352, 88, 72); - DoBlitScreen(564, 416, 56, 56); - } - if (draw_hp) { - DoBlitScreen(96, 352, 88, 72); - } - if (draw_btn) { - DoBlitScreen(8, 357, 72, 119); - DoBlitScreen(556, 357, 72, 48); - if (gbMaxPlayers > 1) { - DoBlitScreen(84, 443, 36, 32); - DoBlitScreen(524, 443, 36, 32); + if (MouseY > SCREEN_HEIGHT - 20) { + if (dmaxy - 1 <= ViewY || dmaxx - 1 <= ViewX) { + if (dmaxy - 1 > ViewY) { + ViewY++; + scroll = TRUE; } - } - if (sgdwCursWdtOld != 0) { - DoBlitScreen(sgdwCursXOld, sgdwCursYOld, sgdwCursWdtOld, sgdwCursHgtOld); - } - if (sgdwCursWdt != 0) { - DoBlitScreen(sgdwCursX, sgdwCursY, sgdwCursWdt, sgdwCursHgt); + if (dmaxx - 1 > ViewX) { + ViewX++; + scroll = TRUE; + } + } else { + ViewX++; + ViewY++; + scroll = TRUE; } } - if (lpDDSBackBuf == NULL) { -#ifdef __cplusplus - hDDVal = lpDDSPrimary->Unlock(NULL); -#else - hDDVal = lpDDSPrimary->lpVtbl->Unlock(lpDDSPrimary, NULL); -#endif - if (hDDVal != DDERR_SURFACELOST && hDDVal != DD_OK) { - DDErrMsg(hDDVal, 3779, "C:\\Src\\Diablo\\Source\\SCROLLRT.CPP"); - } - } + if (scroll) + ScrollInfo._sdir = SDIR_NONE; +} -#ifdef _DEBUG - DrawFPS(); -#endif +void EnableFrameCount() +{ + frameflag = frameflag == 0; + framestart = GetTickCount(); } -#ifdef _DEBUG -void DrawFPS() +static void DrawFPS() { DWORD tc, frames; char String[12]; @@ -2484,7 +2343,7 @@ void DrawFPS() } #endif -void DoBlitScreen(DWORD dwX, DWORD dwY, DWORD dwWdt, DWORD dwHgt) +static void DoBlitScreen(DWORD dwX, DWORD dwY, DWORD dwWdt, DWORD dwHgt) { int nSrcOff, nDstOff, nSrcWdt, nDstWdt; DWORD dwTicks; @@ -2581,6 +2440,151 @@ void DoBlitScreen(DWORD dwX, DWORD dwY, DWORD dwWdt, DWORD dwHgt) } } +static void DrawMain(int dwHgt, BOOL draw_desc, BOOL draw_hp, BOOL draw_mana, BOOL draw_sbar, BOOL draw_btn) +{ + int ysize; + DWORD dwTicks; + BOOL retry; + HRESULT hDDVal; + + ysize = dwHgt; + + if (!gbActive || lpDDSPrimary == NULL) { + return; + } + +#ifdef __cplusplus + if (lpDDSPrimary->IsLost() == DDERR_SURFACELOST) { + if (lpDDSPrimary->Restore() != DD_OK) { + return; + } +#else + if (lpDDSPrimary->lpVtbl->IsLost(lpDDSPrimary) == DDERR_SURFACELOST) { + if (lpDDSPrimary->lpVtbl->Restore(lpDDSPrimary) != DD_OK) { + return; + } +#endif + ResetPal(); + ysize = SCREEN_HEIGHT; + } + + if (lpDDSBackBuf == NULL) { + retry = TRUE; + dwTicks = GetTickCount(); + while (1) { + DDS_desc.dwSize = sizeof(DDS_desc); +#ifdef __cplusplus + hDDVal = lpDDSPrimary->Lock(NULL, &DDS_desc, DDLOCK_WRITEONLY | DDLOCK_WAIT, NULL); +#else + hDDVal = lpDDSPrimary->lpVtbl->Lock(lpDDSPrimary, NULL, &DDS_desc, DDLOCK_WRITEONLY | DDLOCK_WAIT, NULL); +#endif + if (hDDVal == DD_OK) { + break; + } + if (dwTicks - GetTickCount() > 5000) { + break; + } + Sleep(1); + if (hDDVal == DDERR_SURFACELOST) { + return; + } + if (hDDVal != DDERR_WASSTILLDRAWING && hDDVal != DDERR_SURFACEBUSY) { + if (!retry || hDDVal != DDERR_GENERIC) { + break; + } + retry = FALSE; + dx_reinit(); + ysize = SCREEN_HEIGHT; + dwTicks = GetTickCount(); + } + } + if (hDDVal == DDERR_SURFACELOST + || hDDVal == DDERR_WASSTILLDRAWING + || hDDVal == DDERR_SURFACEBUSY) { + return; + } + if (hDDVal != DD_OK) { + DDErrMsg(hDDVal, 3707, "C:\\Src\\Diablo\\Source\\SCROLLRT.CPP"); + } + } + + /// ASSERT: assert(ysize >= 0 && ysize <= 480); // SCREEN_HEIGHT + + if (ysize > 0) { + DoBlitScreen(0, 0, SCREEN_WIDTH, ysize); + } + if (ysize < SCREEN_HEIGHT) { + if (draw_sbar) { + DoBlitScreen(204, 357, 232, 28); + } + if (draw_desc) { + DoBlitScreen(176, 398, 288, 60); + } + if (draw_mana) { + DoBlitScreen(460, 352, 88, 72); + DoBlitScreen(564, 416, 56, 56); + } + if (draw_hp) { + DoBlitScreen(96, 352, 88, 72); + } + if (draw_btn) { + DoBlitScreen(8, 357, 72, 119); + DoBlitScreen(556, 357, 72, 48); + if (gbMaxPlayers > 1) { + DoBlitScreen(84, 443, 36, 32); + DoBlitScreen(524, 443, 36, 32); + } + } + if (sgdwCursWdtOld != 0) { + DoBlitScreen(sgdwCursXOld, sgdwCursYOld, sgdwCursWdtOld, sgdwCursHgtOld); + } + if (sgdwCursWdt != 0) { + DoBlitScreen(sgdwCursX, sgdwCursY, sgdwCursWdt, sgdwCursHgt); + } + } + + if (lpDDSBackBuf == NULL) { +#ifdef __cplusplus + hDDVal = lpDDSPrimary->Unlock(NULL); +#else + hDDVal = lpDDSPrimary->lpVtbl->Unlock(lpDDSPrimary, NULL); +#endif + if (hDDVal != DDERR_SURFACELOST && hDDVal != DD_OK) { + DDErrMsg(hDDVal, 3779, "C:\\Src\\Diablo\\Source\\SCROLLRT.CPP"); + } + } + +#ifdef _DEBUG + DrawFPS(); +#endif +} + +void scrollrt_draw_game_screen(BOOL draw_cursor) +{ + int hgt; + + if (drawpanflag == 255) { + drawpanflag = 0; + hgt = SCREEN_HEIGHT; + } else { + hgt = 0; + } + + if (draw_cursor) { + lock_buf(0); + scrollrt_draw_cursor_item(); + unlock_buf(0); + } + + DrawMain(hgt, 0, 0, 0, 0, 0); + + if (draw_cursor) { + lock_buf(0); + scrollrt_draw_cursor_back_buffer(); + unlock_buf(0); + } +} + void DrawAndBlit() { int hgt; diff --git a/Source/scrollrt.h b/Source/scrollrt.h index 982e7e486..4b334c622 100644 --- a/Source/scrollrt.h +++ b/Source/scrollrt.h @@ -17,37 +17,13 @@ void ClearCursor(); void DrawMissile(int x, int y, int sx, int sy, int CelSkip, int capChunks, BOOL pre); void DrawClippedMissile(int x, int y, int sx, int sy, int CelSkip, int capChunks, BOOL pre); void DrawDeadPlayer(int x, int y, int sx, int sy, int CelSkip, int capChunks, BOOL clipped); -void DrawPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int capChunks); -void DrawClippedPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int capChunks); void DrawView(int StartX, int StartY); -void DrawGame(int x, int y); -void scrollrt_draw_lower(int x, int y, int sx, int sy, int chunks, int eflag); -void scrollrt_draw_clipped_dungeon(BYTE *pBuff, int sx, int sy, int dx, int dy, int eflag); -void DrawClippedMonster(int x, int y, int mx, int my, int m, int CelSkip, int capChunks); -void DrawClippedObject(int x, int y, int ox, int oy, BOOL pre, int CelSkip, int capChunks); -void scrollrt_draw_clipped_e_flag(BYTE *pBuff, int x, int y, int sx, int sy); -void scrollrt_draw_lower_2(int x, int y, int sx, int sy, int chunks, int skipChunks, int eflag); -void scrollrt_draw_clipped_dungeon_2(BYTE *pBuff, int sx, int sy, int skipChunks, int CelSkip, int dx, int dy, int eflag); -void scrollrt_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int skipChunks, int CelSkip, int sx, int sy); -void scrollrt_draw_upper(int x, int y, int sx, int sy, int chunks, int capChunks, int eflag); -void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int capChunks, int CelCap, int dx, int dy, int eflag); -void DrawMonster(int x, int y, int mx, int my, int m, int CelSkip, int CelCap); -void DrawObject(int x, int y, int ox, int oy, BOOL pre, int CelSkip, int capChunks); -void scrollrt_draw_e_flag(BYTE *pBuff, int x, int y, int capChunks, int CelCap, int sx, int sy); -void DrawZoom(int x, int y); void ClearScreenBuffer(); #ifdef _DEBUG void ScrollView(); void EnableFrameCount(); #endif void scrollrt_draw_game_screen(BOOL draw_cursor); -void scrollrt_draw_cursor_back_buffer(); -void scrollrt_draw_cursor_item(); -void DrawMain(int dwHgt, BOOL draw_desc, BOOL draw_hp, BOOL draw_mana, BOOL draw_sbar, BOOL draw_btn); -#ifdef _DEBUG -void DrawFPS(); -#endif -void DoBlitScreen(DWORD dwX, DWORD dwY, DWORD dwWdt, DWORD dwHgt); void DrawAndBlit(); /* rdata */