diff --git a/Source/objects.cpp b/Source/objects.cpp index a9b4ce995..cd61288aa 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -4417,107 +4417,73 @@ void BreakCrux(int i) } // 676190: using guessed type int deltaload; -void BreakBarrel(int pnum, int i, int dam, unsigned char forcebreak, int sendmsg) -{ - int v5; // esi - BOOLEAN v6; // zf - int v7; // eax - int v8; // edx - int v9; // eax - int v10; // eax - int v11; // eax - char v12; // al - char v13; // al - int v14; // edx - int v15; // [esp-4h] [ebp-24h] - short param2; // [esp+Ch] [ebp-14h] - int param1; // [esp+10h] [ebp-10h] - int v18; // [esp+14h] [ebp-Ch] - int *v19; // [esp+18h] [ebp-8h] - int v20; // [esp+1Ch] [ebp-4h] - int forcebreaka; // [esp+2Ch] [ebp+Ch] - - param2 = i; - v5 = i; - param1 = pnum; - if (object[i]._oSelFlag) { - if (forcebreak) { - object[v5]._oVar1 = 0; - } else { - object[v5]._oVar1 -= dam; - if (pnum != myplr && object[v5]._oVar1 <= 0) - object[v5]._oVar1 = 1; - } - if (object[v5]._oVar1 <= 0) { - object[v5]._oBreak = -1; - v6 = deltaload == 0; - object[v5]._oVar1 = 0; - object[v5]._oAnimFlag = 1; - object[v5]._oAnimFrame = 1; - object[v5]._oAnimDelay = 1; - object[v5]._oSolidFlag = FALSE; - object[v5]._oMissFlag = TRUE; - object[v5]._oSelFlag = 0; - object[v5]._oPreFlag = TRUE; - if (v6) { - v8 = object[v5]._ox; - v15 = object[v5]._oy; - if (object[v5]._otype == OBJ_BARRELEX) { - PlaySfxLoc(IS_BARLFIRE, v8, v15); - v9 = object[v5]._oy; - v20 = v9 - 1; - if (v9 - 1 <= v9 + 1) { - do { - v10 = object[v5]._ox; - v18 = v10 - 1; - if (v10 - 1 <= v10 + 1) { - forcebreaka = 112 * (v10 - 1) + v20; - v19 = (int *)((char *)dMonster + 4 * forcebreaka); - do { - v11 = *v19; - if (*v19 > 0) - MonsterTrapHit(v11 - 1, 1, 4, 0, 1, 0); - v12 = dPlayer[0][forcebreaka]; - if (v12 > 0) - PlayerMHit(v12 - 1, -1, 0, 8, 16, 1, 0, 0); - v13 = dObject[0][forcebreaka]; - if (v13 > 0) { - v14 = v13 - 1; - if (object[v14]._otype == OBJ_BARRELEX && object[v14]._oBreak != -1) - BreakBarrel(param1, v14, dam, 1u, sendmsg); - } - ++v18; - v19 += 112; - forcebreaka += 112; - } while (v18 <= object[v5]._ox + 1); - } - ++v20; - } while (v20 <= object[v5]._oy + 1); - } - } else { - PlaySfxLoc(IS_BARREL, v8, v15); - SetRndSeed(object[v5]._oRndSeed); - if (object[v5]._oVar2 <= 1) { - if (object[v5]._oVar3) - CreateRndItem(object[v5]._ox, object[v5]._oy, 0, sendmsg, 0); - else - CreateRndUseful(param1, object[v5]._ox, object[v5]._oy, sendmsg); - } - if (object[v5]._oVar2 >= 8) - SpawnSkeleton(object[v5]._oVar4, object[v5]._ox, object[v5]._oy); +void BreakBarrel(int pnum, int i, int dam, BOOL forcebreak, int sendmsg) +{ + int oi; + int xp, yp; + + if (!object[i]._oSelFlag) + return; + if (forcebreak) { + object[i]._oVar1 = 0; + } else { + object[i]._oVar1 -= dam; + if (pnum != myplr && object[i]._oVar1 <= 0) + object[i]._oVar1 = 1; + } + if (object[i]._oVar1 > 0) { + if (deltaload) + return; + + PlaySfxLoc(IS_IBOW, object[i]._ox, object[i]._oy); + return; + } + + object[i]._oBreak = -1; + object[i]._oVar1 = 0; + object[i]._oAnimFlag = 1; + object[i]._oAnimFrame = 1; + object[i]._oAnimDelay = 1; + object[i]._oSolidFlag = FALSE; + object[i]._oMissFlag = TRUE; + object[i]._oSelFlag = 0; + object[i]._oPreFlag = TRUE; + if (deltaload != 0) { + object[i]._oAnimCnt = 0; + object[i]._oAnimFrame = object[i]._oAnimLen; + object[i]._oAnimDelay = 1000; + return; + } + + if (object[i]._otype == OBJ_BARRELEX) { + PlaySfxLoc(IS_BARLFIRE, object[i]._ox, object[i]._oy); + for (yp = object[i]._oy - 1; yp <= object[i]._oy + 1; yp++) { + for (xp = object[i]._ox - 1; xp <= object[i]._ox + 1; xp++) { + if (dMonster[xp][yp] > 0) + MonsterTrapHit(dMonster[xp][yp] - 1, 1, 4, 0, 1, 0); + if (dPlayer[xp][yp] > 0) + PlayerMHit(dPlayer[xp][yp] - 1, -1, 0, 8, 16, 1, 0, 0); + if (dObject[xp][yp] > 0) { + oi = dObject[xp][yp] - 1; + if (object[oi]._otype == OBJ_BARRELEX && object[oi]._oBreak != -1) + BreakBarrel(pnum, oi, dam, TRUE, sendmsg); } - if (param1 == myplr) - NetSendCmdParam2(FALSE, CMD_BREAKOBJ, param1, param2); - } else { - v7 = object[v5]._oAnimLen; - object[v5]._oAnimCnt = 0; - object[v5]._oAnimFrame = v7; - object[v5]._oAnimDelay = 1000; } - } else if (!deltaload) { - PlaySfxLoc(IS_IBOW, object[v5]._ox, object[v5]._oy); } + } else { + PlaySfxLoc(IS_BARREL, object[i]._ox, object[i]._oy); + SetRndSeed(object[i]._oRndSeed); + if (object[i]._oVar2 <= 1) { + if (!object[i]._oVar3) + CreateRndUseful(pnum, object[i]._ox, object[i]._oy, sendmsg); + else + CreateRndItem(object[i]._ox, object[i]._oy, 0, sendmsg, 0); + } + if (object[i]._oVar2 >= 8) + SpawnSkeleton(object[i]._oVar4, object[i]._ox, object[i]._oy); } + if (pnum == myplr) + NetSendCmdParam2(FALSE, CMD_BREAKOBJ, pnum, i); } // 676190: using guessed type int deltaload; diff --git a/Source/objects.h b/Source/objects.h index 5ca062bd7..55657ceae 100644 --- a/Source/objects.h +++ b/Source/objects.h @@ -133,7 +133,7 @@ void SyncOpL2Door(int pnum, int cmd, int i); void SyncOpL3Door(int pnum, int cmd, int i); void SyncOpObject(int pnum, int cmd, int i); void BreakCrux(int i); -void BreakBarrel(int pnum, int i, int dam, unsigned char forcebreak, int sendmsg); +void BreakBarrel(int pnum, int i, int dam, BOOL forcebreak, int sendmsg); void BreakObject(int pnum, int oi); void SyncBreakObj(int pnum, int oi); void SyncL1Doors(int i);