Browse Source

scrollrt_draw_clipped_dungeon_2

pull/93/head
galaxyhaxz 7 years ago committed by Anders Jenbo
parent
commit
f44ef05e5e
  1. 389
      Source/scrollrt.cpp
  2. 2
      Source/scrollrt.h

389
Source/scrollrt.cpp

@ -1108,7 +1108,7 @@ void scrollrt_draw_lower_2(int x, int y, int sx, int sy, int chunks, int skipChu
dst -= 768 * 32; dst -= 768 * 32;
} }
if (CelSkip < 8) { if (CelSkip < 8) {
scrollrt_draw_clipped_dungeon_2((char *)&gpBuffer[sx + PitchTbl[sy] - 768 * 16 * CelSkip], x, y, skipChunks, CelSkip, sx, sy, 0); scrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - 768 * 16 * CelSkip], x, y, skipChunks, CelSkip, sx, sy, 0);
} }
} }
} }
@ -1147,7 +1147,7 @@ void scrollrt_draw_lower_2(int x, int y, int sx, int sy, int chunks, int skipChu
dst -= 768 * 32; dst -= 768 * 32;
} }
if (CelSkip < 8) { if (CelSkip < 8) {
scrollrt_draw_clipped_dungeon_2((char *)&gpBuffer[sx + PitchTbl[sy] - 768 * 32 * (skipChunks + 1)], x, y, skipChunks, CelSkip, sx, sy, 1); scrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - 768 * 32 * (skipChunks + 1)], x, y, skipChunks, CelSkip, sx, sy, 1);
} }
} }
} }
@ -1173,7 +1173,7 @@ void scrollrt_draw_lower_2(int x, int y, int sx, int sy, int chunks, int skipChu
dst -= 768 * 32; dst -= 768 * 32;
} }
if (CelSkip < 8) { if (CelSkip < 8) {
scrollrt_draw_clipped_dungeon_2((char *)&gpBuffer[sx + PitchTbl[sy] - 768 * 16 * CelSkip], x, y, skipChunks, CelSkip, sx, sy, 0); scrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - 768 * 16 * CelSkip], x, y, skipChunks, CelSkip, sx, sy, 0);
} }
} }
} }
@ -1183,240 +1183,217 @@ void scrollrt_draw_lower_2(int x, int y, int sx, int sy, int chunks, int skipChu
// 69CF94: using guessed type int cel_transparency_active; // 69CF94: using guessed type int cel_transparency_active;
// 69CF98: using guessed type int level_piece_id; // 69CF98: using guessed type int level_piece_id;
void scrollrt_draw_clipped_dungeon_2(char *buffer, int x, int y, int skipChunks, int CelSkip, int sx, int sy, int eflag) void scrollrt_draw_clipped_dungeon_2(BYTE *pBuff, int sx, int sy, int skipChunks, int CelSkip, int dx, int dy, int eflag)
{ {
int v8; // eax int px, py, nCel, nMon, negMon, p;
char v9; // bl char bFlag, bDead, bObj, bItem, bPlr, bArch, bMap, negPlr, dd;
char v10; // cl DeadStruct *pDeadGuy;
char v11; // dl ItemStruct *pItem;
int *v12; // eax PlayerStruct *pPlayer;
int v13; // edi MonsterStruct *pMonster;
DeadStruct *v14; // eax BYTE *pCelBuff;
int *v15; // esi DWORD *pFrameTable;
int v16; // ecx
int v17; // edx /// ASSERT: assert((DWORD)sx < MAXDUNX);
char v18; // bl /// ASSERT: assert((DWORD)sy < MAXDUNY);
ItemStruct *v19; // esi bFlag = dFlags[sx][sy];
char *v20; // eax bDead = dDead[sx][sy];
signed int v21; // ebx bObj = dObject[sx][sy];
int v22; // ebx bItem = dItem[sx][sy];
unsigned int v23; // ecx bPlr = dPlayer[sx][sy];
PlayerStruct *v24; // esi bArch = dArch[sx][sy];
int v25; // esi bMap = dTransVal[sx][sy];
int v26; // eax nMon = dMonster[sx][sy];
MonsterStruct *v27; // esi
CMonster *v28; // ecx /// ASSERT: assert((DWORD)(sy-1) < MAXDUNY);
int v29; // ebx negPlr = dPlayer[sx][sy - 1];
int v30; // edi negMon = dMonster[sx][sy - 1];
unsigned int v31; // ecx
PlayerStruct *v32; // esi if(visiondebug && bFlag & DFLAG_LIT) {
int v33; // esi Cel2DecodeHdrOnly(pBuff, (BYTE *)pSquareCel, 1, 64, CelSkip, 8);
int v34; // eax
MonsterStruct *v35; // esi
CMonster *v36; // ecx
int v37; // ebx
int v38; // edi
ItemStruct *v39; // esi
char *v40; // eax
int v41; // ecx
int v42; // edi
int v43; // [esp+Ch] [ebp-18h]
int v44; // [esp+10h] [ebp-14h]
char *dst_buf; // [esp+14h] [ebp-10h]
int a1; // [esp+18h] [ebp-Ch]
char v47; // [esp+1Dh] [ebp-7h]
char v48; // [esp+1Eh] [ebp-6h]
char v49; // [esp+1Fh] [ebp-5h]
char v50; // [esp+20h] [ebp-4h]
char v51; // [esp+21h] [ebp-3h]
char v52; // [esp+22h] [ebp-2h]
char v53; // [esp+23h] [ebp-1h]
a1 = x;
dst_buf = buffer;
v8 = 112 * x + y;
v9 = dDead[0][v8];
v53 = dFlags[0][v8];
v50 = dObject[0][v8];
v52 = dItem[0][v8];
v10 = dPlayer[0][v8 - 1];
v51 = dPlayer[0][v8];
v49 = dArch[0][v8];
v11 = dTransVal[0][v8];
v12 = (int *)((char *)dMonster + 4 * v8);
v47 = v11;
v48 = v10;
v43 = *v12;
v44 = *(v12 - 1);
if (visiondebug && v53 & DFLAG_LIT)
Cel2DecodeHdrOnly((BYTE *)dst_buf, (BYTE *)pSquareCel, 1, 64, CelSkip, 8);
if (MissilePreFlag && v53 & DFLAG_MISSILE) {
v13 = sx;
DrawClippedMissile(a1, y, sx, sy, CelSkip, 8, TRUE);
} else {
v13 = sx;
} }
if (light_table_index < lightmax) { if(MissilePreFlag && bFlag & DFLAG_MISSILE) {
if (v9) { DrawClippedMissile(sx, sy, dx, dy, CelSkip, 8, 1);
v14 = &dead[(v9 & 0x1F) - 1]; }
v15 = (int *)v14->_deadData[(v9 >> 5) & 7]; if(light_table_index < lightmax) {
v16 = v13 - v14->_deadWidth2; if(bDead != 0) {
if (v15) { pDeadGuy = &dead[(bDead & 0x1F) - 1];
v17 = v14->_deadFrame; dd = (bDead >> 5) & 7;
if (v17 >= 1 && (unsigned int)*v15 <= 0x32 && v17 <= *v15) { px = dx - pDeadGuy->_deadWidth2;
v18 = v14->_deadtrans; pCelBuff = pDeadGuy->_deadData[dd];
if (v18) /// ASSERT: assert(pDeadGuy->_deadData[dd] != NULL);
Cl2DecodeFrm5(v16, sy, (BYTE *)v15, v17, v14->_deadWidth, CelSkip, 8, v18); if(pCelBuff != NULL) {
else pFrameTable = (DWORD *)pDeadGuy->_deadData[dd];
Cl2DecodeFrm6(v16, sy, (BYTE *)v15, v17, v14->_deadWidth, CelSkip, 8); nCel = pDeadGuy->_deadFrame;
if(nCel >= 1 && pFrameTable[0] <= 50 && nCel <= (int)pFrameTable[0]) {
if(pDeadGuy->_deadtrans != 0) {
Cl2DecodeFrm5(px, dy, pCelBuff, pDeadGuy->_deadFrame, pDeadGuy->_deadWidth, CelSkip, 8, pDeadGuy->_deadtrans);
} else {
Cl2DecodeFrm6(px, dy, pCelBuff, pDeadGuy->_deadFrame, pDeadGuy->_deadWidth, CelSkip, 8);
}
} else {
// app_fatal("Clipped dead sub2: frame %d of %d, deadnum==%d", nCel, pFrameTable[0], (bDead & 0x1F) - 1);
} }
} }
} }
if (v50) if(bObj != 0) {
DrawClippedObject(a1, y, v13, sy, 1, CelSkip, 8); DrawClippedObject(sx, sy, dx, dy, 1, CelSkip, 8);
} }
if (v52) { }
v19 = &item[v52 - 1]; if(bItem != 0) {
if (!v19->_iPostDraw && (unsigned char)v52 <= MAXITEMS) { pItem = &item[bItem - 1];
v20 = (char *)v19->_iAnimData; if(!pItem->_iPostDraw) {
if (v20) { /// ASSERT: assert((unsigned char)bItem <= MAXITEMS);
v21 = v19->_iAnimFrame; if((unsigned char)bItem <= MAXITEMS) {
if (v21 >= 1 && *(_DWORD *)v20 <= 0x32u && v21 <= *(_DWORD *)v20) { pCelBuff = pItem->_iAnimData;
v22 = v13 - v19->_iAnimWidth2; if(pCelBuff != NULL) {
if (v52 - 1 == pcursitem) pFrameTable = (DWORD *)pCelBuff;
CelDrawHdrClrHL(ICOL_BLUE, v22, sy, (BYTE *)v20, v19->_iAnimFrame, v19->_iAnimWidth, CelSkip, 8); nCel = pItem->_iAnimFrame;
Cel2DecodeHdrLight(v22, sy, v19->_iAnimData, v19->_iAnimFrame, v19->_iAnimWidth, CelSkip, 8); if(nCel >= 1 && pFrameTable[0] <= 50 && nCel <= (int)pFrameTable[0]) {
px = dx - pItem->_iAnimWidth2;
if(bItem - 1 == pcursitem) {
CelDrawHdrClrHL(181, px, dy, pCelBuff, pItem->_iAnimFrame, pItem->_iAnimWidth, CelSkip, 8);
}
Cel2DecodeHdrLight(px, dy, pItem->_iAnimData, pItem->_iAnimFrame, pItem->_iAnimWidth, CelSkip, 8);
} else {
/*
app_fatal(
"Draw Clipped \"%s\" Item 3: frame %d of %d, item type==%d",
pItem->_iIName,
nCel,
pFrameTable[0],
pItem->_itype);
*/
}
} else {
// app_fatal("Draw Item \"%s\" Clipped 3: NULL Cel Buffer", pItem->_iIName);
} }
} }
} }
} }
if (v53 & DFLAG_PLAYER) { if(bFlag & DFLAG_PLAYER) {
v23 = -1 - v48; p = -(negPlr + 1);
if (v23 < 4) { if((DWORD)p < MAX_PLRS) {
v24 = &plr[v23]; pPlayer = &plr[p];
DrawClippedPlayer( px = dx + pPlayer->_pxoff - pPlayer->_pAnimWidth2;
v23, py = dy + pPlayer->_pyoff;
a1, DrawClippedPlayer(p, sx, sy - 1, px, py, pPlayer->_pAnimData, pPlayer->_pAnimFrame, pPlayer->_pAnimWidth, CelSkip, 8);
y - 1, if(eflag && pPlayer->_peflag != 0) {
v13 + v24->_pxoff - v24->_pAnimWidth2, if(pPlayer->_peflag == 2) {
sy + v24->_pyoff, scrollrt_draw_clipped_e_flag_2(pBuff - (768 * 16 + 96), sx - 2, sy + 1, skipChunks, CelSkip, dx - 96, dy - 16);
v24->_pAnimData,
v24->_pAnimFrame,
v24->_pAnimWidth,
CelSkip,
8);
if (eflag) {
v25 = v24->_peflag;
if (v25) {
if (v25 == 2)
scrollrt_draw_clipped_e_flag_2((BYTE *)dst_buf - 12384, a1 - 2, y + 1, skipChunks, CelSkip, v13 - 96, sy - 16);
scrollrt_draw_clipped_e_flag_2((BYTE *)dst_buf - 64, a1 - 1, y + 1, skipChunks, CelSkip, v13 - 64, sy);
} }
scrollrt_draw_clipped_e_flag_2(pBuff - 64, sx - 1, sy + 1, skipChunks, CelSkip, dx - 64, dy);
} }
} else {
// app_fatal("draw player clipped: tried to draw illegal player %d", p);
} }
} }
if (v53 & DFLAG_MONSTER && (v53 & DFLAG_LIT || plr[myplr]._pInfraFlag) && v44 < 0) { if(bFlag & DFLAG_MONSTER && (bFlag & DFLAG_LIT || plr[myplr]._pInfraFlag) && negMon < 0) {
v26 = -1 - v44; draw_monster_num = -(negMon + 1);
draw_monster_num = -1 - v44; if((DWORD)draw_monster_num < MAXMONSTERS) {
if ((unsigned int)(-1 - v44) < MAXMONSTERS) { pMonster = &monster[draw_monster_num];
v27 = &monster[v26]; if(!(pMonster->_mFlags & 1)) {
if (!(v27->_mFlags & MFLAG_HIDDEN)) { if(pMonster->MType != NULL) {
v28 = v27->MType; px = dx + pMonster->_mxoff - pMonster->MType->width2;
if (v28) { py = dy + pMonster->_myoff;
v29 = sy + v27->_myoff; if(draw_monster_num == pcursmonst) {
v30 = sx + v27->_mxoff - v28->width2; Cl2DecodeClrHL(233, px, py, pMonster->_mAnimData, pMonster->_mAnimFrame, pMonster->MType->width, CelSkip, 8);
if (v26 == pcursmonst) {
Cl2DecodeClrHL(233, v30, v29, v27->_mAnimData, v27->_mAnimFrame, v28->width, CelSkip, 8);
v26 = draw_monster_num;
} }
DrawClippedMonster(a1, y, v30, v29, v26, CelSkip, 8); DrawClippedMonster(sx, sy, px, py, draw_monster_num, CelSkip, 8);
if (eflag && !v27->_meflag) if(eflag && !pMonster->_meflag) {
scrollrt_draw_clipped_e_flag_2((BYTE *)dst_buf - 64, a1 - 1, y + 1, skipChunks, CelSkip, sx - 64, sy); scrollrt_draw_clipped_e_flag_2(pBuff - 64, sx - 1, sy + 1, skipChunks, CelSkip, dx - 64, dy);
v13 = sx; }
} else {
// app_fatal("Draw Monster \"%s\" Clipped: uninitialized monster", pMonster->mName);
} }
} }
} else {
// app_fatal("Draw Monster Clipped: tried to draw illegal monster %d", draw_monster_num);
} }
} }
if (v53 & DFLAG_DEAD_PLAYER) if(bFlag & DFLAG_DEAD_PLAYER) {
DrawDeadPlayer(a1, y, v13, sy, CelSkip, 8, 1); DrawDeadPlayer(sx, sy, dx, dy, CelSkip, 8, 1);
if (v51 > 0) { }
v31 = v51 - 1; if(bPlr > 0) {
if (v31 < 4) { p = bPlr - 1;
v32 = &plr[v31]; if((DWORD)p < MAX_PLRS) {
DrawClippedPlayer( pPlayer = &plr[p];
v31, px = dx + pPlayer->_pxoff - pPlayer->_pAnimWidth2;
a1, py = dy + pPlayer->_pyoff;
y, DrawClippedPlayer(p, sx, sy, px, py, pPlayer->_pAnimData, pPlayer->_pAnimFrame, pPlayer->_pAnimWidth, CelSkip, 8);
v13 + v32->_pxoff - v32->_pAnimWidth2, if(eflag && pPlayer->_peflag != 0) {
sy + v32->_pyoff, if(pPlayer->_peflag == 2) {
v32->_pAnimData, scrollrt_draw_clipped_e_flag_2(pBuff - (768 * 16 + 96), sx - 2, sy + 1, skipChunks, CelSkip, dx - 96, dy - 16);
v32->_pAnimFrame,
v32->_pAnimWidth,
CelSkip,
8);
if (eflag) {
v33 = v32->_peflag;
if (v33) {
if (v33 == 2)
scrollrt_draw_clipped_e_flag_2((BYTE *)dst_buf - 12384, a1 - 2, y + 1, skipChunks, CelSkip, v13 - 96, sy - 16);
scrollrt_draw_clipped_e_flag_2((BYTE *)dst_buf - 64, a1 - 1, y + 1, skipChunks, CelSkip, v13 - 64, sy);
} }
scrollrt_draw_clipped_e_flag_2(pBuff - 64, sx - 1, sy + 1, skipChunks, CelSkip, dx - 64, dy);
} }
} else {
// app_fatal("draw player clipped: tried to draw illegal player %d", p);
} }
} }
if (v43 > 0 && (v53 & DFLAG_LIT || plr[myplr]._pInfraFlag)) { if(nMon > 0 && (bFlag & DFLAG_LIT || plr[myplr]._pInfraFlag)) {
v34 = v43 - 1; draw_monster_num = nMon - 1;
draw_monster_num = v43 - 1; if((DWORD)draw_monster_num < MAXMONSTERS) {
if ((unsigned int)(v43 - 1) < MAXMONSTERS) { pMonster = &monster[draw_monster_num];
v35 = &monster[v34]; if(!(pMonster->_mFlags & 1)) {
if (!(v35->_mFlags & MFLAG_HIDDEN)) { if(pMonster->MType != NULL) {
v36 = v35->MType; px = dx + pMonster->_mxoff - pMonster->MType->width2;
if (v36) { py = dy + pMonster->_myoff;
v37 = sy + v35->_myoff; if(draw_monster_num == pcursmonst) {
v38 = sx + v35->_mxoff - v36->width2; Cl2DecodeClrHL(233, px, py, pMonster->_mAnimData, pMonster->_mAnimFrame, pMonster->MType->width, CelSkip, 8);
if (v34 == pcursmonst) { }
Cl2DecodeClrHL(233, v38, v37, v35->_mAnimData, v35->_mAnimFrame, v36->width, CelSkip, 8); DrawClippedMonster(sx, sy, px, py, draw_monster_num, CelSkip, 8);
v34 = draw_monster_num; if(eflag && !pMonster->_meflag) {
scrollrt_draw_clipped_e_flag_2(pBuff - 64, sx - 1, sy + 1, skipChunks, CelSkip, dx - 64, dy);
} }
DrawClippedMonster(a1, y, v38, v37, v34, CelSkip, 8); } else {
if (eflag && !v35->_meflag) // app_fatal("Draw Monster \"%s\" Clipped: uninitialized monster", pMonster->mName);
scrollrt_draw_clipped_e_flag_2((BYTE *)dst_buf - 64, a1 - 1, y + 1, skipChunks, CelSkip, sx - 64, sy);
v13 = sx;
} }
} }
} else {
// app_fatal("Draw Monster Clipped: tried to draw illegal monster %d", draw_monster_num);
} }
} }
if (v53 & DFLAG_MISSILE) if(bFlag & DFLAG_MISSILE) {
DrawClippedMissile(a1, y, v13, sy, CelSkip, 8, FALSE); DrawClippedMissile(sx, sy, dx, dy, CelSkip, 8, 0);
if (v50 && light_table_index < lightmax) }
DrawClippedObject(a1, y, v13, sy, 0, CelSkip, 8); if(bObj != 0 && light_table_index < lightmax) {
if (v52) { DrawClippedObject(sx, sy, dx, dy, 0, CelSkip, 8);
v39 = &item[v52 - 1]; }
if (v39->_iPostDraw) { if(bItem != 0) {
if ((unsigned char)v52 <= MAXITEMS) { pItem = &item[bItem - 1];
v40 = (char *)v39->_iAnimData; if(pItem->_iPostDraw) {
if (v40) { /// ASSERT: assert((unsigned char)bItem <= MAXITEMS);
v41 = v39->_iAnimFrame; if((unsigned char)bItem <= MAXITEMS) {
if (v41 >= 1 && *(_DWORD *)v40 <= 0x32u && v41 <= *(_DWORD *)v40) { pCelBuff = pItem->_iAnimData;
v42 = v13 - v39->_iAnimWidth2; if(pCelBuff != NULL) {
if (v52 - 1 == pcursitem) pFrameTable = (DWORD *)pCelBuff;
CelDrawHdrClrHL(ICOL_BLUE, v42, sy, (BYTE *)v40, v41, v39->_iAnimWidth, CelSkip, 8); nCel = pItem->_iAnimFrame;
Cel2DecodeHdrLight( if(nCel >= 1 && pFrameTable[0] <= 50 && nCel <= (int)pFrameTable[0]) {
v42, px = dx - pItem->_iAnimWidth2;
sy, if(bItem - 1 == pcursitem) {
v39->_iAnimData, CelDrawHdrClrHL(181, px, dy, pCelBuff, nCel, pItem->_iAnimWidth, CelSkip, 8);
v39->_iAnimFrame, }
v39->_iAnimWidth, Cel2DecodeHdrLight(px, dy, pItem->_iAnimData, pItem->_iAnimFrame, pItem->_iAnimWidth, CelSkip, 8);
CelSkip, } else {
8); /*
app_fatal(
"Draw Clipped \"%s\" Item 4: frame %d of %d, item type==%d",
pItem->_iIName,
nCel,
pFrameTable[0],
pItem->_itype);
*/
} }
} else {
// app_fatal("Draw Item \"%s\" Clipped 4: NULL Cel Buffer", pItem->_iIName);
} }
} }
} }
} }
if (v49) { if(bArch != 0) {
cel_transparency_active = (unsigned char)TransList[v47]; cel_transparency_active = (unsigned char)TransList[bMap];
Cel2DecodeLightTrans((BYTE *)dst_buf, (BYTE *)level_special_cel, v49, 64, CelSkip, 8); Cel2DecodeLightTrans(pBuff, (BYTE *)level_special_cel, bArch, 64, CelSkip, 8);
} }
} }
// 4B8CC0: using guessed type char pcursitem; // 4B8CC0: using guessed type char pcursitem;
@ -1487,7 +1464,7 @@ void scrollrt_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int skipChunks, s
} }
if (CelSkip < 8) { if (CelSkip < 8) {
scrollrt_draw_clipped_dungeon_2((char *)pBuff, x, y, skipChunks, CelSkip, sx, sy, 0); scrollrt_draw_clipped_dungeon_2(pBuff, x, y, skipChunks, CelSkip, sx, sy, 0);
} }
light_table_index = lti_old; light_table_index = lti_old;

2
Source/scrollrt.h

@ -27,7 +27,7 @@ void DrawClippedMonster(int x, int y, int mx, int my, int m, int CelSkip, int ca
void DrawClippedObject(int x, int y, int ox, int oy, BOOL pre, 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_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_lower_2(int x, int y, int sx, int sy, int chunks, int skipChunks, int eflag);
void scrollrt_draw_clipped_dungeon_2(char *buffer, int x, int y, int skipChunks, int CelSkip, int sx, int sy, 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, signed int CelSkip, int sx, int sy); void scrollrt_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int skipChunks, signed 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_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 scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int capChunks, int CelCap, int dx, int dy, int eflag);

Loading…
Cancel
Save