// DecMove.cpp // #include "def.h" #include "decor.h" #include "misc.h" #include "dectables.h" void CDecor::MoveObjectPollution() { POINT blupiPos = m_blupiPos; POINT pos = { 0, 0 }; BOOL bPollution; int num = 20; bPollution = FALSE; if (m_blupiAction == 3) { return; } if (m_blupiHelico) { if (m_blupiVitesse.y < -5.0) { if (m_time % 20 != 0 && m_time % 20 != 2 && m_time % 20 != 5 && m_time % 20 != 8 && m_time % 20 != 10 && m_time % 20 != 11 && m_time % 20 != 16 && m_time % 20 != 18) { return; } } else if (m_blupiVitesse.x == 0.0) { if (m_time % 50 != 0 && m_time % 50 != 12 && m_time % 50 != 30) { return; } } else if (m_time % 20 != 0 && m_time % 20 != 3 && m_time % 20 != 5 && m_time % 20 != 11 && m_time % 20 != 15) { return; } pos.x = 22; bPollution = TRUE; } if (m_blupiOver) { // more } } void CDecor::MoveObjectPlouf(POINT pos) { for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type == 14) { return; } } pos.y -= 45; PlaySound(23, pos); ObjectStart(pos, 14, 0); } void CDecor::MoveObjectTiplouf(POINT pos) { for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type == 35) { return; } } if (m_blupiDir == 2) { pos.x += 5; } else { pos.x -= 5; } pos.y -= 45; PlaySound(64, pos); ObjectStart(pos, 35, 0); } void CDecor::MoveObjectBlup(POINT pos) { PlaySound(24, pos); pos.y -= 20; int num = 0; POINT tinyPoint = pos; while (tinyPoint.y > 0) { int icon = m_decor[(tinyPoint.x + 16) / DIMOBJX][tinyPoint.y / DIMOBJY].icon; if (icon != 91 && icon != 92) { break; } num++; tinyPoint.y -= DIMOBJY; } num--; if (num <= 0) { return; } int num2 = MoveObjectFree(); if (num2 == -1) { return; } m_moveObject[num2].type = 15; m_moveObject[num2].phase = 0; m_moveObject[num2].posCurrent.x = pos.x; m_moveObject[num2].posCurrent.y = pos.y; m_moveObject[num2].posStart = m_moveObject[num2].posCurrent; m_moveObject[num2].posEnd.x = pos.x; m_moveObject[num2].posEnd.y = pos.y - num * DIMOBJY; m_moveObject[num2].timeStopStart = 0; m_moveObject[num2].stepAdvance = num * 10; m_moveObject[num2].step = 2; m_moveObject[num2].time = 0; MoveObjectStepIcon(num2); } void CDecor::FlushBalleTraj() { for (int i = 0; i < 1300; i++) { m_balleTraj[i] = 0; } } void CDecor::SetBalleTraj(POINT pos) { if (pos.x < 0 || pos.x >= 100 || pos.y < 0 || pos.y >= 100) { return; } int num = pos.y * 13; num += pos.x / 8; int num2 = pos.x & 7; m_balleTraj[num] |= 1 << num2; } BOOL CDecor::IsBalleTraj(POINT pos) { pos.x = (pos.x + DIMOBJX / 2) / DIMOBJX; pos.y = (pos.y + DIMOBJY / 2) / DIMOBJY; if (!IsValidCel(pos)) return FALSE; int num = pos.y * 13; num += pos.x / 8; int num2 = pos.x & 7; return (m_balleTraj[num] & 1 << num2) != 0; } void CDecor::FlushMoveTraj() { memset(m_moveTraj, 0, sizeof(m_moveTraj)); } void CDecor::SetMoveTraj(POINT pos) { if (pos.x < 0 || pos.x >= 100 || pos.y < 0 || pos.y >= 100) { return; } int num = pos.y * 13; num += pos.x / 8; int num2 = pos.x & 7; m_moveTraj[num] |= 1 << num2; } BOOL CDecor::IsMoveTraj(POINT pos) { pos.x = (pos.x + 32) / 64; pos.y = (pos.y + 32) / 64; if (pos.x < 0 || pos.x >= 100 || pos.y < 0 || pos.y >= 100) { return FALSE; } int num = pos.y * 13; num += pos.x / 8; int num2 = pos.x & 7; return (m_moveTraj[num] & 1 << num2) != 0; } int CDecor::SearchDistRight(POINT pos, POINT dir, int type) { int num = 0; if (type == 36 || type == 39 || type == 41 || type == 42 || type == 93) { return 500; } pos.x = (pos.x + 32) / 64; pos.y = (pos.y + 32) / 64; while (pos.x >= 0 && pos.x < 100 && pos.y >= 0 && pos.y < 100 && !IsBlocIcon(m_decor[pos.x][pos.y].icon)) { if (type == 23) { SetBalleTraj(pos); } num += 64; pos.x += dir.x; pos.y += dir.y; } if ((type == 34 || type == 38) && num >= 64) { num -= 64; } if (type == 23 && num >= 10) { num -= 10; } return num; } void CDecor::StartSploutchGlu(POINT pos) { POINT pos2; pos2.x = pos.x; pos2.y = pos.y; ObjectStart(pos2, 98, 0); pos2.x = pos.x + 15; pos2.y = pos.y + 20; ObjectStart(pos2, 99, 0); pos2.x = pos.x - 20; pos2.y = pos.y + 18; ObjectStart(pos2, 99, 0); pos2.x = pos.x + 23; pos2.y = pos.y - 18; ObjectStart(pos2, 99, 0); pos2.x = pos.x - 15; pos2.y = pos.y - 18; ObjectStart(pos2, 99, 0); pos2.x = pos.x + 32; pos2.y = pos.y + 10; ObjectStart(pos2, 100, 0); pos2.x = pos.x - 28; pos2.y = pos.y + 15; ObjectStart(pos2, 100, 0); StopSound(16); StopSound(18); StopSound(29); StopSound(31); PlaySound(51, pos); } BOOL CDecor::ObjectStart(POINT pos, int type, int speed) { return ObjectStart(pos, type, speed, FALSE); } BOOL CDecor::ObjectStart(POINT pos, int type, int speed, BOOL bMulti) { int num = MoveObjectFree(); if (num == -1) { return FALSE; } m_moveObject[num].type = type; m_moveObject[num].phase = 0; m_moveObject[num].posCurrent = pos; m_moveObject[num].posStart = pos; m_moveObject[num].posEnd = pos; MoveObjectStepIcon(num); if (speed != 0) { POINT tinyPoint = pos; int num2 = speed; int num3 = 0; if (num2 > 50) { num2 -= 50; POINT dir; dir.x = 0; dir.y = 1; num3 = SearchDistRight(tinyPoint, dir, type); tinyPoint.y += num3; } else if (num < -50) { num2 += 50; POINT dir; dir.x = 0; dir.y = -1; num3 = SearchDistRight(tinyPoint, dir, type); tinyPoint.y -= num3; } else if (num2 > 0) { POINT dir; dir.x = 1; dir.y = 0; num3 = SearchDistRight(tinyPoint, dir, type); tinyPoint.x += num3; } else if (num2 < 0) { POINT dir; dir.x = -1; dir.y = 0; num3 = SearchDistRight(tinyPoint, dir, type); tinyPoint.x -= num3; } if (num3 == 0) { if (type == TYPE_BALLE) { m_moveObject[num].type = 0; return TRUE; } } else { m_moveObject[num].posEnd = tinyPoint; m_moveObject[num].timeStopStart = 0; m_moveObject[num].stepAdvance = abs(num2 * num3 / 64); m_moveObject[num].step = STEP_ADVANCE; m_moveObject[num].time = 0; } } MoveObjectPriority(num); if (bMulti) { NetMessage msg; msg.data1 = speed; msg.type = MESS_OBJECTSTART; msg.x = pos.x; msg.y = pos.y; msg.channel = type; NetMessagePush(&msg); } return TRUE; } BOOL CDecor::ObjectDelete(POINT pos, int type) { int num = MoveObjectSearch(pos, type); if (num == -1) { return FALSE; } if (m_moveObject[num].type == 4 || m_moveObject[num].type == 12 || m_moveObject[num].type == 16 || m_moveObject[num].type == 17 || m_moveObject[num].type == 20 || m_moveObject[num].type == 40 || m_moveObject[num].type == 96 || m_moveObject[num].type == 97) { int num2 = 17; double animationSpeed = 1.0; if (m_moveObject[num].type == 4) { num2 = 7; } if (m_moveObject[num].type == 17 || m_moveObject[num].type == 20) { num2 = 33; } if (m_moveObject[num].type == 40) { animationSpeed = 0.5; } } m_moveObject[num].type = 0; return TRUE; } void CDecor::MoveObjectStep() { m_blupiVector = POINT( 0, 0 ); m_blupiTransport = -1; for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type != 0) { MoveObjectStepLine(i); MoveObjectStepIcon(i); if (m_moveObject[i].type == TYPE_BULLDOZER || m_moveObject[i].type == TYPE_BLUPITANK || m_moveObject[i].type == TYPE_BLUPIHELICO) { int num = MovePersoDetect(m_moveObject[i].posCurrent); if (num != -1) { POINT posCurrent = m_moveObject[i].posCurrent; posCurrent.x -= 34; posCurrent.y -= 34; ObjectStart(posCurrent, TYPE_EXPLO1, 0, TRUE); PlaySound(SOUND_BOUM, m_moveObject[i].posCurrent); m_decorAction = 1; m_decorPhase = 0; posCurrent = m_moveObject[i].posCurrent; posCurrent.x += 2; posCurrent.y += BLUPIOFFY; ObjectDelete(m_moveObject[i].posCurrent, m_moveObject[i].type); ObjectStart(posCurrent, 37, 0); ObjectDelete(m_moveObject[num].posCurrent, m_moveObject[num].type); } if (BlupiElectro(m_moveObject[i].posCurrent)) { POINT posCurrent = m_moveObject[i].posCurrent; posCurrent.x += 2; posCurrent.y += BLUPIOFFY; ObjectDelete(m_moveObject[i].posCurrent, m_moveObject[i].type); ObjectStart(posCurrent, 38, 55); PlaySound(59, posCurrent); } } } } } void CDecor::MoveObjectStepLine(int i) { MoveObject moveObject; POINT tinyPoint; BOOL flag = FALSE; RECT tinyRect = { 0, 0, 0, 0 }; if (m_moveObject[i].type == TYPE_ASCENSEUR || m_moveObject[i].type == TYPE_ASCENSEURs || m_moveObject[i].type == TYPE_ASCENSEURsi && !m_blupiSuspend) { RECT src; src.left = m_blupiPos.x + 20; src.right = m_blupiPos.x + DIMBLUPIX - 20; src.top = m_blupiPos.y + DIMBLUPIY - 2; src.bottom = m_blupiPos.y + DIMBLUPIY - 1; tinyRect.left = m_moveObject[i].posCurrent.x; tinyRect.right = m_moveObject[i].posCurrent.x + DIMOBJX; tinyRect.top = m_moveObject[i].posCurrent.y; tinyRect.bottom = m_moveObject[i].posCurrent.y + 16; RECT tinyRect2; flag = IntersectRect(&tinyRect2, &tinyRect, &src); tinyPoint = m_moveObject[i].posCurrent; } POINT posCurrent; if (m_blupiFocus && !m_blupiHide && m_moveObject[i].type == TYPE_BOMBEFOLLOW2) { posCurrent = m_moveObject[i].posCurrent; if (posCurrent.x < m_blupiPos.x) { posCurrent.x++; } if (posCurrent.x > m_blupiPos.x) { posCurrent.x--; } if (posCurrent.y < m_blupiPos.y) { posCurrent.y++; } if (posCurrent.y > m_blupiPos.y) { posCurrent.y--; } tinyRect.left = posCurrent.x + 10; tinyRect.right = posCurrent.x + DIMBLUPIX - 10; tinyRect.top = posCurrent.y + 10; tinyRect.bottom = posCurrent.y + DIMBLUPIX - 10; if (TestPath(tinyRect, m_moveObject[i].posCurrent, &posCurrent)) { m_moveObject[i].posCurrent = posCurrent; m_moveObject[i].posStart = posCurrent; m_moveObject[i].posEnd = posCurrent; } else { ObjectDelete(m_moveObject[i].posCurrent, m_moveObject[i].type); posCurrent.x -= DIMOBJX / 2 + 2; posCurrent.y -= DIMOBJY / 2 + 2; ObjectStart(posCurrent, TYPE_EXPLO2, 0); PlaySound(SOUND_BOUM, posCurrent); m_decorAction = 1; m_decorPhase = 0; } } if (m_moveObject[i].posStart.x != m_moveObject[i].posEnd.x || m_moveObject[i].posStart.y != m_moveObject[i].posEnd.y) { if (m_moveObject[i].step == STEP_STOPSTART) { if (m_moveObject[i].time < m_moveObject[i].timeStopStart) { m_moveObject[i].time ++; } else { m_moveObject[i].step = STEP_ADVANCE; m_moveObject[i].time = 0; } } else if (m_moveObject[i].step == STEP_ADVANCE) { if (m_moveObject[i].posCurrent.x != m_moveObject[i].posEnd.x || m_moveObject[i].posCurrent.y != m_moveObject[i].posEnd.y) { m_moveObject[i].time ++; if (m_moveObject[i].stepAdvance != 0) { //m_moveObject[i].posCurrent = (m_moveObject[i].posEnd - m_moveObject[i].posStart) * m_moveObject[i].time / m_moveObject[i].stepAdvance + m_moveObject[i].posStart; m_moveObject[i].posCurrent.x = (m_moveObject[i].posEnd.x - m_moveObject[i].posStart.x) * m_moveObject[i].time / m_moveObject[i].stepAdvance + m_moveObject[i].posStart.x; m_moveObject[i].posCurrent.y = (m_moveObject[i].posEnd.y - m_moveObject[i].posStart.y) * m_moveObject[i].time / m_moveObject[i].stepAdvance + m_moveObject[i].posStart.y; } } else if (m_moveObject[i].type == TYPE_BLUP || m_moveObject[i].type == TYPE_BALLE) { m_moveObject[i].type = 0; } else if (m_moveObject[i].type == TYPE_GLU) { m_moveObject[i].posStart = m_moveObject[i].posCurrent; m_moveObject[i].posEnd = m_moveObject[i].posCurrent; m_moveObject[i].step = STEP_STOPEND; m_moveObject[i].time = 0; } else { m_moveObject[i].step = STEP_STOPEND; m_moveObject[i].time = 0; } } else if (m_moveObject[i].step == STEP_STOPEND) { if (m_moveObject[i].time < m_moveObject[i].timeStopEnd) { m_moveObject[i].time ++; } else { m_moveObject[i].step = STEP_RECEDE; m_moveObject[i].time = 0; } } else if (m_moveObject[i].step == STEP_RECEDE) { if (m_moveObject[i].posCurrent.x != m_moveObject[i].posStart.x || m_moveObject[i].posCurrent.y != m_moveObject[i].posStart.y) { m_moveObject[i].time ++; if (m_moveObject[i].stepRecede != 0) { //m_moveObject[i].posCurrent = (m_moveObject[i].posStart - m_moveObject[i].posEnd) * m_moveObject[i].time / m_moveObject[i].stepRecede + m_moveObject[i].posEnd; m_moveObject[i].posCurrent.x = (m_moveObject[i].posStart.x - m_moveObject[i].posEnd.x) * m_moveObject[i].time / m_moveObject[i].stepRecede + m_moveObject[i].posEnd.x; m_moveObject[i].posCurrent.y = (m_moveObject[i].posStart.y - m_moveObject[i].posEnd.y) * m_moveObject[i].time / m_moveObject[i].stepRecede + m_moveObject[i].posEnd.y; } } else { m_moveObject[i].step = STEP_STOPSTART; m_moveObject[i].time = 0; } } } if (m_moveObject[i].type == TYPE_DOOR && m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].type = 0; } posCurrent = m_moveObject[i].posCurrent; if (m_moveObject[i].type == TYPE_ASCENSEUR || m_moveObject[i].type == TYPE_ASCENSEURs || m_moveObject[i].type == TYPE_ASCENSEURsi) { posCurrent.y -= DIMOBJY; } posCurrent.x = (posCurrent.x + DIMOBJX / 2) / DIMOBJX; posCurrent.y = (posCurrent.y + DIMOBJY / 2) / DIMOBJY; SetMoveTraj(posCurrent); if (flag) { m_blupiVector.x = m_moveObject[i].posCurrent.x - tinyPoint.x; m_blupiVector.y = m_moveObject[i].posCurrent.y - (m_blupiPos.y + DIMBLUPIY - BLUPIFLOOR); if (m_moveObject[i].type == TYPE_ASCENSEURs) { m_blupiVector.x += 2; } if (m_moveObject[i].type == TYPE_ASCENSEURsi) { m_blupiVector.x -= 2; } if (m_blupiTimeNoAsc == 0) { m_blupiTransport = i; } } } void CDecor::MoveObjectStepIcon(int i) { POINT pos; if (m_moveObject[i].type == TYPE_ASCENSEURs) { m_moveObject[i].icon = table_chenille[m_moveObject[i].phase / 1 % 6]; } if (m_moveObject[i].type == TYPE_ASCENSEURsi) { m_moveObject[i].icon = table_chenillei[m_moveObject[i].phase / 1 % 6]; } if (m_moveObject[i].type == TYPE_BOMBEDOWN) { m_moveObject[i].icon = 12 + m_moveObject[i].phase / 2 % 9; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_BOMBEUP) { m_moveObject[i].icon = 48 + m_moveObject[i].phase / 2 % 9; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_BOMBEMOVE) { m_moveObject[i].icon = 69 + m_moveObject[i].phase / 1 % 9; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_BOMBEFOLLOW1) { m_moveObject[i].icon = table_follow1[m_moveObject[i].phase / 1 % 26]; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_BOMBEFOLLOW2) { m_moveObject[i].icon = table_follow2[m_moveObject[i].phase / 1 % 5]; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_BOMBEPERSO1) { m_moveObject[i].icon = 257 + m_moveObject[i].phase / 1 % 6; m_moveObject[i].channel = CHBLUPI; } if (m_moveObject[i].type == TYPE_BOMBEPERSO2) { m_moveObject[i].icon = 257 + m_moveObject[i].phase / 1 % 6; m_moveObject[i].channel = CHBLUPI1; } if (m_moveObject[i].type == TYPE_BOMBEPERSO3) { m_moveObject[i].icon = 257 + m_moveObject[i].phase / 1 % 6; m_moveObject[i].channel = CHBLUPI2; } if (m_moveObject[i].type == TYPE_BOMBEPERSO4) { m_moveObject[i].icon = 257 + m_moveObject[i].phase / 1 % 6; m_moveObject[i].channel = CHBLUPI3; } if (m_moveObject[i].type == TYPE_DYNAMITE) { m_moveObject[i].icon = 252; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_DYNAMITEf) { m_moveObject[i].icon = table_dynamitef[m_moveObject[i].phase / 1 % 100]; m_moveObject[i].channel = CHELEMENT; if (m_moveObject[i].phase == 50) { DynamiteStart(i, 0, 0); } if (m_moveObject[i].phase == 53) { DynamiteStart(i, -100, 8); } if (m_moveObject[i].phase == 55) { DynamiteStart(i, 80, 10); } if (m_moveObject[i].phase == 56) { DynamiteStart(i, -15, -100); } if (m_moveObject[i].phase == 59) { DynamiteStart(i, 20, 70); } if (m_moveObject[i].phase == 62) { DynamiteStart(i, 30, -50); } if (m_moveObject[i].phase == 64) { DynamiteStart(i, -40, 30); } if (m_moveObject[i].phase == 67) { DynamiteStart(i, -180, 10); } if (m_moveObject[i].phase == 69) { DynamiteStart(i, 200, -10); } if (m_moveObject[i].phase >= 70) { m_moveObject[i].type = 0; } } if (m_moveObject[i].type == TYPE_TRESOR) { if (m_moveObject[i].phase / 3 % 22 < 11) { m_moveObject[i].icon = m_moveObject[i].phase / 3 % 11; } else { m_moveObject[i].icon = 11 - m_moveObject[i].phase / 3 % 11; } m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_EGG) { m_moveObject[i].icon = 21 + m_moveObject[i].phase / 4 % 8; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_GOAL) { m_moveObject[i].icon = 29 + m_moveObject[i].phase / 3 % 8; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_CLE) { m_moveObject[i].icon = table_cle[m_moveObject[i].phase / 3 % 12]; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_CLE1) { m_moveObject[i].icon = table_cle1[m_moveObject[i].phase / 3 % 12]; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_CLE2) { m_moveObject[i].icon = table_cle2[m_moveObject[i].phase / 3 % 12]; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_CLE3) { m_moveObject[i].icon = table_cle3[m_moveObject[i].phase / 3 % 12]; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_SKATE) { m_moveObject[i].icon = table_skate[m_moveObject[i].phase / 1 % 34]; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_SHIELD) { m_moveObject[i].icon = table_shield[m_moveObject[i].phase / 2 % 16]; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_POWER) { m_moveObject[i].icon = table_power[m_moveObject[i].phase / 2 % 8]; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_INVERT) { m_moveObject[i].icon = table_invert[m_moveObject[i].phase / 2 % 20]; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_CHARGE) { m_moveObject[i].icon = table_charge[m_moveObject[i].phase / 2 % 6]; m_moveObject[i].channel = CHOBJECT; } if (m_moveObject[i].type == TYPE_MAGICTRACK) { m_moveObject[i].icon = table_magictrack[m_moveObject[i].phase / 1 % 24]; m_moveObject[i].channel = CHELEMENT; if (m_moveObject[i].phase >= 24) { m_moveObject[i].type = 0; } } if (m_moveObject[i].type == TYPE_SHIELDTRACK) { m_moveObject[i].icon = table_shieldtrack[m_moveObject[i].phase / 1 % 20]; m_moveObject[i].channel = CHELEMENT; if (m_moveObject[i].phase >= 20) { m_moveObject[i].type = 0; } } if (m_moveObject[i].type == TYPE_TRESORTRACK) { m_moveObject[i].icon = table_tresortrack[m_moveObject[i].phase / 1 % 11]; m_moveObject[i].channel = CHELEMENT; if (m_moveObject[i].phase >= 11) { m_moveObject[i].type = 0; } } if (m_moveObject[i].type == TYPE_HIDETRACK && m_moveObject[i].phase >= 20) { m_moveObject[i].type = 0; } if (m_moveObject[i].type == TYPE_EXPLO1) { if (m_moveObject[i].phase >= table_explo1[0]) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_explo1[m_moveObject[i].phase]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_EXPLO2) { if (m_moveObject[i].phase >= 20) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_explo2[m_moveObject[i].phase % 20]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_EXPLO3) { if (m_moveObject[i].phase >= 20) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_explo3[m_moveObject[i].phase / 1 % 20]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_EXPLO4) { if (m_moveObject[i].phase >= 9) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_explo4[m_moveObject[i].phase / 1 % 9]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_EXPLO5) { if (m_moveObject[i].phase >= 12) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_explo5[m_moveObject[i].phase / 1 % 12]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_EXPLO6) { if (m_moveObject[i].phase >= 6) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_explo6[m_moveObject[i].phase / 1 % 6]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_EXPLO7) { if (m_moveObject[i].phase >= 128) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_explo7[m_moveObject[i].phase / 1 % 128]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_EXPLO8) { if (m_moveObject[i].phase >= 5) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_explo8[m_moveObject[i].phase / 1 % 5]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_SPLOUTCH1) { if (m_moveObject[i].phase >= 10) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_sploutch1[m_moveObject[i].phase / 1 % 10]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_SPLOUTCH2) { if (m_moveObject[i].phase >= 13) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_sploutch2[m_moveObject[i].phase / 1 % 13]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_SPLOUTCH3) { if (m_moveObject[i].phase >= 18) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_sploutch3[m_moveObject[i].phase / 1 % 18]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_TENTACULE) { if (m_moveObject[i].phase >= 90) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_tentacule[m_moveObject[i].phase / 2 % 45]; m_moveObject[i].channel = CHEXPLO; } } if (m_moveObject[i].type == TYPE_BRIDGE) { if (m_moveObject[i].phase == 0) { PlaySound(SOUND_BRIDGE1, m_moveObject[i].posStart); } if (m_moveObject[i].phase == 137) { PlaySound(SOUND_BRIDGE2, m_moveObject[i].posStart); } if (m_moveObject[i].phase >= 157) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_bridge[m_moveObject[i].phase / 1 % 157]; m_moveObject[i].channel = CHOBJECT; pos.x = m_moveObject[i].posStart.x / DIMOBJX; pos.y = m_moveObject[i].posStart.y / DIMOBJY; m_decor[pos.x][pos.y].icon = m_moveObject[i].icon; } } if (m_moveObject[i].type == TYPE_POLLUTION) { if (m_moveObject[i].phase >= 16) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_pollution[m_moveObject[i].phase / 2 % 8]; m_moveObject[i].channel = CHELEMENT; } } if (m_moveObject[i].type == TYPE_INVERTSTART) { if (m_moveObject[i].phase >= 16) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_invertstart[m_moveObject[i].phase / 2 % 8]; m_moveObject[i].channel = CHELEMENT; } } if (m_moveObject[i].type == TYPE_INVERTSTOP) { if (m_moveObject[i].phase >= 16) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_invertstop[m_moveObject[i].phase / 2 % 8]; m_moveObject[i].channel = CHELEMENT; } } if (m_moveObject[i].type == TYPE_PLOUF) { if (m_moveObject[i].phase >= 14) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_plouf[m_moveObject[i].phase / 2 % 7]; m_moveObject[i].channel = CHOBJECT; } } if (m_moveObject[i].type == TYPE_TIPLOUF) { if (m_moveObject[i].phase >= 6) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_tiplouf[m_moveObject[i].phase / 2 % 7]; m_moveObject[i].channel = CHOBJECT; } } if (m_moveObject[i].type == TYPE_BLUP) { m_moveObject[i].icon = table_blup[m_moveObject[i].phase / 2 % 20]; m_moveObject[i].channel = CHOBJECT; } if (m_moveObject[i].type == TYPE_BULLDOZER) { if (m_moveObject[i].posStart.x > m_moveObject[i].posEnd.x) { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_bulldozer_turn2l[m_moveObject[i].time % 22]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_bulldozer_turn2r[m_moveObject[i].time % 22]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_bulldozer_left[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_bulldozer_right[m_moveObject[i].time % 8]; } } else { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_bulldozer_turn2r[m_moveObject[i].time % 22]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_bulldozer_turn2l[m_moveObject[i].time % 22]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_bulldozer_right[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_bulldozer_left[m_moveObject[i].time % 8]; } } m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_POISSON) { if (m_moveObject[i].posStart.x > m_moveObject[i].posEnd.x) { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_poisson_turn2l[m_moveObject[i].time % 48]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_poisson_turn2r[m_moveObject[i].time % 48]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_poisson_left[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_poisson_right[m_moveObject[i].time % 8]; } } else { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_poisson_turn2r[m_moveObject[i].time % 48]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_poisson_turn2l[m_moveObject[i].time % 48]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_poisson_right[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_poisson_left[m_moveObject[i].time % 8]; } } m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == 20) { if (m_moveObject[i].posStart.x > m_moveObject[i].posEnd.x) { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_oiseau_turn2l[m_moveObject[i].time % 10]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_oiseau_turn2r[m_moveObject[i].time % 10]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_oiseau_left[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_oiseau_right[m_moveObject[i].time % 8]; } } else { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_oiseau_turn2r[m_moveObject[i].time % 10]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_oiseau_turn2l[m_moveObject[i].time % 10]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_oiseau_right[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_oiseau_left[m_moveObject[i].time % 8]; } } m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_GUEPE) { if (m_moveObject[i].posStart.x > m_moveObject[i].posEnd.x) { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_guepe_turn2l[m_moveObject[i].time % 5]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_guepe_turn2r[m_moveObject[i].time % 5]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_guepe_left[m_moveObject[i].time % 6]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_guepe_right[m_moveObject[i].time % 6]; } } else { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_guepe_turn2r[m_moveObject[i].time % 5]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_guepe_turn2l[m_moveObject[i].time % 5]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_guepe_right[m_moveObject[i].time % 6]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_guepe_left[m_moveObject[i].time % 6]; } } m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_CREATURE) { if (m_moveObject[i].posStart.x > m_moveObject[i].posEnd.x) { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_creature_turn2[m_moveObject[i].time % 152]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_creature_turn2[m_moveObject[i].time % 152]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_creature_left[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_creature_right[m_moveObject[i].time % 8]; } } else { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_creature_turn2[m_moveObject[i].time % 152]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_creature_turn2[m_moveObject[i].time % 152]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_creature_right[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_creature_left[m_moveObject[i].time % 8]; } } m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_BLUPIHELICO) { if (m_moveObject[i].posStart.x > m_moveObject[i].posEnd.x) { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_blupih_turn2l[m_moveObject[i].time % 26]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_blupih_turn2r[m_moveObject[i].time % 26]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_blupih_left[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_blupih_right[m_moveObject[i].time % 8]; } } else { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_blupih_turn2r[m_moveObject[i].time % 26]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_blupih_turn2l[m_moveObject[i].time % 26]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_blupih_right[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_blupih_left[m_moveObject[i].time % 8]; } } if ((m_moveObject[i].step == STEP_STOPSTART || m_moveObject[i].step == STEP_STOPEND) && m_moveObject[i].time == 21) { pos.x = m_moveObject[i].posCurrent.x; pos.y = m_moveObject[i].posCurrent.y + 40; if (ObjectStart(pos, TYPE_BALLE, 55) != -1) { PlaySound(SOUND_FIREOK, pos); } } } if (m_moveObject[i].type == TYPE_BLUPITANK) { if (m_moveObject[i].posStart.x > m_moveObject[i].posEnd.x) { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_blupit_turn2l[m_moveObject[i].time % 24]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_blupit_turn2r[m_moveObject[i].time % 24]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_blupit_left[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_blupit_right[m_moveObject[i].time % 8]; } } else { if (m_moveObject[i].step == STEP_STOPSTART) { m_moveObject[i].icon = table_blupit_turn2r[m_moveObject[i].time % 24]; } if (m_moveObject[i].step == STEP_STOPEND) { m_moveObject[i].icon = table_blupit_turn2l[m_moveObject[i].time % 24]; } if (m_moveObject[i].step == STEP_ADVANCE) { m_moveObject[i].icon = table_blupit_right[m_moveObject[i].time % 8]; } if (m_moveObject[i].step == STEP_RECEDE) { m_moveObject[i].icon = table_blupit_left[m_moveObject[i].time % 8]; } } if ((m_moveObject[i].step == STEP_STOPSTART || m_moveObject[i].step == STEP_STOPEND) && m_moveObject[i].time == 3) { int speed; if ((m_moveObject[i].posStart.x < m_moveObject[i].posEnd.x && m_moveObject[i].step == STEP_STOPSTART) || (m_moveObject[i].posStart.x > m_moveObject[i].posEnd.x && m_moveObject[i].step == STEP_STOPEND)) { pos.x = m_moveObject[i].posCurrent.x - 30; pos.y = m_moveObject[i].posCurrent.x + BLUPIOFFY; speed = -5; } else { pos.x = m_moveObject[i].posCurrent.x + 30; pos.y = m_moveObject[i].posCurrent.y + BLUPIOFFY; speed = 5; } if (ObjectStart(pos, TYPE_BALLE, speed) != -1) { PlaySound(SOUND_FIREOK, pos); } } if ((m_moveObject[i].step == STEP_STOPSTART || m_moveObject[i].step == STEP_STOPEND) && m_moveObject[i].time == 21) { int speed; if ((m_moveObject[i].posStart.x < m_moveObject[i].posEnd.x && m_moveObject[i].step == STEP_STOPSTART) || (m_moveObject[i].posStart.x > m_moveObject[i].posEnd.x && m_moveObject[i].step == STEP_STOPEND)) { pos.x = m_moveObject[i].posCurrent.x + 30; pos.y = m_moveObject[i].posCurrent.y + BLUPIOFFY; speed = 5; } else { pos.x = m_moveObject[i].posCurrent.x - 30; pos.y = m_moveObject[i].posCurrent.y + BLUPIOFFY; speed = -5; } if (ObjectStart(pos, TYPE_BALLE, speed) != -1) { PlaySound(SOUND_FIREOK, pos); } } } if (m_moveObject[i].type == TYPE_GLU) { m_moveObject[i].icon = table_glu[m_moveObject[i].phase / 1 % 25]; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_CLEAR) { if (m_moveObject[i].phase >= 70) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_clear[m_moveObject[i].phase / 1 % 70]; m_moveObject[i].channel = CHELEMENT; } } if (m_moveObject[i].type == TYPE_ELECTRO) { if (m_moveObject[i].phase >= 90) { m_moveObject[i].type = 0; } else { m_moveObject[i].icon = table_electro[m_moveObject[i].phase / 1 % 90]; if (m_moveObject[i].phase < 30) { m_moveObject[i].channel = CHBLUPI2; } else { m_moveObject[i].channel = CHELEMENT; } } } if (m_moveObject[i].type == TYPE_HELICO) { m_moveObject[i].icon = 68; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_OVER) { m_moveObject[i].icon = 208; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_JEEP) { m_moveObject[i].icon = 89; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_TANK) { m_moveObject[i].icon = 167; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_BALLE) { m_moveObject[i].icon = 176; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_BULLET) { m_moveObject[i].icon = 177; m_moveObject[i].channel = CHELEMENT; } if (m_moveObject[i].type == TYPE_DRINK) { m_moveObject[i].icon = 178; m_moveObject[i].channel = CHELEMENT; } m_moveObject[i].phase ++; if (m_moveObject[i].phase > 32700) { m_moveObject[i].phase = 0; } } void CDecor::DynamiteStart(int i, int dx, int dy) { POINT posStart = m_moveObject[i].posStart; posStart.x -= 34; posStart.y -= 34; posStart.x += dx; posStart.y -= dy; ObjectStart(posStart, TYPE_EXPLO1, 0); if (dx == 0 && dy == 0) { PlaySound(10, posStart); m_decorAction = 1; m_decorPhase = 0; } RECT src; src.left = posStart.x; src.right = posStart.x + DIMOBJX * 2; src.top = posStart.y; src.bottom = posStart.y + DIMOBJY * 2; POINT tinyPoint; tinyPoint.y = posStart.y / DIMOBJY; for (int j = 0; j < 2; j++) { tinyPoint.x = posStart.x / DIMOBJX; for (int k = 0; k < 2; j++) { if (tinyPoint.x >= 0 && tinyPoint.x < MAXCELX && tinyPoint.y >= 0 && tinyPoint.y < MAXCELY) { int icon = m_decor[tinyPoint.x][tinyPoint.y].icon; if (icon == 378 || icon == 379 || icon == 404 || icon == 410) { POINT pos; pos.x = tinyPoint.x * DIMOBJX; pos.y = tinyPoint.y * DIMOBJY; ModifDecor(pos, -1); } } tinyPoint.x++; } tinyPoint.y++; } for (i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type == TYPE_BOMBEDOWN || m_moveObject[i].type == TYPE_BOMBEUP || m_moveObject[i].type == TYPE_BOMBEFOLLOW1 || m_moveObject[i].type == TYPE_BOMBEFOLLOW2 || m_moveObject[i].type == TYPE_BULLDOZER || m_moveObject[i].type == TYPE_EGG | m_moveObject[i].type == TYPE_CAISSE || m_moveObject[i].type == TYPE_HELICO || m_moveObject[i].type == TYPE_BOMBEMOVE || m_moveObject[i].type == TYPE_POISSON || m_moveObject[i].type == TYPE_TOMATES || m_moveObject[i].type == TYPE_JEEP || m_moveObject[i].type == TYPE_OISEAU || m_moveObject[i].type == TYPE_SKATE || m_moveObject[i].type == TYPE_SHIELD || m_moveObject[i].type == TYPE_POWER || m_moveObject[i].type == TYPE_TANK || m_moveObject[i].type == TYPE_DRINK || m_moveObject[i].type == TYPE_BLUPIHELICO || m_moveObject[i].type == TYPE_BLUPITANK || m_moveObject[i].type == TYPE_GLU || m_moveObject[i].type == TYPE_INVERT || m_moveObject[i].type == TYPE_GUEPE || m_moveObject[i].type == TYPE_OVER || m_moveObject[i].type == TYPE_BRIDGE || m_moveObject[i].type == TYPE_CREATURE || m_moveObject[i].type == TYPE_BOMBEPERSO1 || m_moveObject[i].type == TYPE_BOMBEPERSO2 || m_moveObject[i].type == TYPE_BOMBEPERSO3 || m_moveObject[i].type == TYPE_BOMBEPERSO4) { RECT src2; src2.left = m_moveObject[i].posCurrent.x; src2.right = m_moveObject[i].posCurrent.x + 60; src2.top = m_moveObject[i].posCurrent.y; src2.bottom = m_moveObject[i].posCurrent.y + 20; RECT tinyRect = { 0, 0, 0, 0 }; if (IntersectRect(&tinyRect, &src2, &src)) { if (m_moveObject[i].type == TYPE_CAISSE) { SearchLinkCaisse(i, TRUE); for (int L = 0; L < m_nbLinkCaisse; L++) { int channel = m_moveObject[m_linkCaisse[L]].channel; int icon2 = m_moveObject[m_linkCaisse[L]].icon; POINT posCurrent = m_moveObject[m_linkCaisse[L]].posCurrent; m_moveObject[m_linkCaisse[L]].type = 0; } ObjectDelete(m_moveObject[i].posCurrent, m_moveObject[i].type); UpdateCaisse(); } else { ObjectDelete(m_moveObject[i].posCurrent, m_moveObject[i].type); } } } } if (m_blupiFocus && !m_blupiShield && !m_blupiHide && !m_bSuperBlupi && m_blupiPos.x > posStart.x - 30 && m_blupiPos.x < posStart.x + 30 + DIMOBJX && m_blupiPos.y > posStart.y - 30 && m_blupiPos.y < posStart.y + 30 + DIMOBJY) { BlupiDead(ACTION_CLEAR1, -1); m_blupiAir = TRUE; } } int CDecor::AscenseurDetect(RECT rect, POINT oldpos, POINT newpos) { if (m_blupiTimeNoAsc != 0) { return -1; } int num = newpos.y - oldpos.y; int num2; if (num < 0) { num2 = -30; } else { num2 = 30; } num = abs(num); for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type == 1 || m_moveObject[i].type == 47 || m_moveObject[i].type == 48) { RECT src; src.left = m_moveObject[i].posCurrent.x; src.right = m_moveObject[i].posCurrent.x + 64; src.top = m_moveObject[i].posCurrent.y; src.bottom = m_moveObject[i].posCurrent.y + 16; if (num < 30) { RECT tinyRect = { 0, 0, 0, 0 }; if (IntersectRect(&tinyRect, &src, &rect)) { return i; } } else { RECT src2 = rect; src2.top -= num / 30 * num2; src2.bottom -= num / 30 * num2; for (int j = 0; j <= num / 30; j++) { RECT tinyRect = { 0, 0, 0, 0 }; if (IntersectRect(&tinyRect, &src, &src2)) { return i; } src2.top += num2; src2.bottom += num; } } } } return -1; } void CDecor::AscenseurVertigo(int i, BOOL* pbVertigoLeft, BOOL* pbVertigoRight) { *pbVertigoLeft = FALSE; *pbVertigoRight = FALSE; if (m_blupiPos.x + 20 + 4 < m_moveObject[i].posCurrent.x) { *pbVertigoLeft = TRUE; } if (m_blupiPos.x + DIMBLUPIX - 20 - 4 > m_moveObject[i].posCurrent.x + DIMOBJX) { *pbVertigoRight = TRUE; } if (AscenseurShift(i)) { if (*pbVertigoLeft) { *pbVertigoLeft = FALSE; *pbVertigoRight = TRUE; m_blupiTimeNoAsc = 10; return; } if (*pbVertigoRight) { *pbVertigoRight = FALSE; *pbVertigoLeft = TRUE; m_blupiTimeNoAsc = 10; } } } BOOL CDecor::AscenseurShift(int i) { return i != -1 && m_moveObject[i].icon >= 311 && m_moveObject[i].icon <= 316; } void CDecor::AscenseurSynchro(int i) { for (i = 0; i < MAXMOVEOBJECT; i++) { m_moveObject[i].posCurrent = m_moveObject[i].posStart; m_moveObject[i].step = STEP_STOPSTART; m_moveObject[i].time = 0; m_moveObject[i].phase = 0; } } void CDecor::UpdateCaisse() { m_nbRankCaisse = 0; for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type == TYPE_CAISSE) { m_rankCaisse[m_nbRankCaisse++] = i; } } } BOOL CDecor::TestPushCaisse(int i, POINT pos, BOOL bPop) { POINT move; int j; move.x = pos.x - m_moveObject[i].posCurrent.x; move.y = 0; SearchLinkCaisse(i, bPop); int y = m_moveObject[i].posCurrent.y; for (j = 0; j < m_nbLinkCaisse; j++) { i = m_linkCaisse[j]; if (!TestPushOneCaisse(i, move, y)) { return FALSE; } } for (j = 0; j < m_nbLinkCaisse; j++) { i = m_linkCaisse[j]; int num = i; m_moveObject[num].posCurrent.x = m_moveObject[num].posCurrent.x + move.x; m_moveObject[num].posStart.x = m_moveObject[num].posStart.x + move.x; int num2 = i; m_moveObject[num].posEnd.x = m_moveObject[num].posEnd.x + move.x; } return TRUE; } BOOL CDecor::TestPushOneCaisse(int i, POINT move, int b) { int num; RECT rect; num = m_moveObject[i].posCurrent.x + move.x; rect.left = num; rect.right = num + DIMOBJX; rect.top = m_moveObject[i].posCurrent.y; rect.bottom = m_moveObject[i].posCurrent.y + DIMOBJY; if (DecorDetect(rect, FALSE)) { return FALSE; } if (m_moveObject[i].posCurrent.y != b) { return TRUE; } rect.left = num; rect.right = num + 20; rect.top = m_moveObject[i].posCurrent.y + DIMOBJY; rect.bottom = m_moveObject[i].posCurrent.y + DIMOBJY + 2; if (!DecorDetect(rect)) { return FALSE; } rect.left = num + DIMOBJX - 20; rect.right = num + DIMOBJX; rect.top = m_moveObject[i].posCurrent.y + DIMOBJY; rect.bottom = m_moveObject[i].posCurrent.y + DIMOBJY + 2; return DecorDetect(rect); } void CDecor::SearchLinkCaisse(int rank, BOOL bPop) { m_nbLinkCaisse = 0; AddLinkCaisse(rank); POINT posCurrent = m_moveObject[rank].posCurrent; BOOL flag; do { flag = FALSE; for (int i = 0; i < m_nbLinkCaisse; i++) { int num = m_linkCaisse[i]; if (m_moveObject[num].posCurrent.y <= posCurrent.y && (!bPop || (m_moveObject [num].posCurrent.x >= posCurrent.x - DIMOBJX / 2 && m_moveObject[num].posCurrent.x <= posCurrent.x + DIMOBJX / 2))) { RECT src; src.left = m_moveObject[num].posCurrent.x - 1; src.top = m_moveObject[num].posCurrent.y - 1; src.right = src.left + DIMOBJX + 1; src.bottom = src.top + DIMOBJY + 1; for (int j = 0; j < m_nbRankCaisse; j++) { int num2 = m_rankCaisse[j]; if (num2 != num && m_moveObject[num2].posCurrent.y <= posCurrent.y && (!bPop || (m_moveObject[num2].posCurrent.x >= posCurrent.x - 32 && m_moveObject[num2].posCurrent.x <= posCurrent.x + 32))) { RECT src2; src2.left = m_moveObject[num2].posCurrent.x - 1; src2.top = m_moveObject[num2].posCurrent.y - 1; src2.right = src2.left + DIMOBJX + 1; src2.bottom = src2.top + DIMOBJY + 1; RECT tinyRect = { 0,0,0,0 }; if (IntersectRect(&tinyRect, &src2, &src) && AddLinkCaisse(num2)) { flag = TRUE; } } } } } } while (flag); } BOOL CDecor::AddLinkCaisse(int rank) { for (int i = 0; i < m_nbLinkCaisse; i++) { if (m_linkCaisse[i] == rank) { return FALSE; } } m_linkCaisse[m_nbLinkCaisse] = rank; m_nbLinkCaisse++; return TRUE; } int CDecor::CaisseInFront() { POINT tinyPoint; if (m_blupiDir == DIR_LEFT) { tinyPoint.x = m_blupiPos.x + 16 - DIMOBJX / 2; tinyPoint.y = m_blupiPos.y; } else { tinyPoint.x = m_blupiPos.x + DIMBLUPIX - 16 + DIMOBJX / 2; tinyPoint.y = m_blupiPos.y; } for (int i = 0; i < m_nbRankCaisse; i++) { int num = m_rankCaisse[i]; if (tinyPoint.x > m_moveObject[num].posCurrent.x && tinyPoint.x < m_moveObject[num].posCurrent.x + DIMOBJX && tinyPoint.y > m_moveObject[num].posCurrent.y && tinyPoint.y < m_moveObject[num].posCurrent.y + DIMOBJY) { return num; } } return -1; } int CDecor::CaisseGetMove(int max) { max -= (m_nbLinkCaisse - 1) / 2; if (max < 1) { max = 1; } if (m_blupiPower) { max *= 2; } if (m_blupiPhase < 20) { max = max * m_blupiPhase / 20; if (max == 0) { max++; } } return max; } int CDecor::MockeryDetect(POINT pos) { if (m_blupiTimeMockery > 0) { return 0; } if (m_blupiAir) { POINT tinyPoint; tinyPoint.x = pos.x + 30; tinyPoint.y = pos.y + 30 + DIMOBJY; if (tinyPoint.x >= 0 && tinyPoint.x < DIMOBJX*MAXCELX && tinyPoint.y >= 0 && tinyPoint.y < DIMOBJY*MAXCELY) { int icon = m_decor[tinyPoint.x / DIMOBJX][tinyPoint.y / DIMOBJY].icon; if (icon == 68 || icon == 317) { return 64; } } } RECT src; src.left = pos.x; src.right = pos.x + DIMBLUPIX; src.top = pos.y + 11; src.bottom = pos.y + DIMBLUPIY; if (m_blupiAir) { src.bottom += 90; } for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type == TYPE_BOMBEDOWN || m_moveObject[i].type == TYPE_BOMBEMOVE || m_moveObject[i].type == TYPE_BOMBEFOLLOW1 || m_moveObject[i].type == TYPE_BOMBEFOLLOW2 || m_moveObject[i].type == TYPE_BULLDOZER || m_moveObject[i].type == TYPE_OISEAU || m_moveObject[i].type == TYPE_GUEPE || m_moveObject[i].type == TYPE_CREATURE || m_moveObject[i].type == TYPE_BALLE || m_moveObject[i].type == TYPE_BLUPIHELICO || m_moveObject[i].type == TYPE_BLUPITANK) { RECT src2; src2.left = m_moveObject[i].posCurrent.x; src2.right = m_moveObject[i].posCurrent.x + DIMBLUPIX; src2.top = m_moveObject[i].posCurrent.y + 36; src2.bottom = m_moveObject[i].posCurrent.y + DIMBLUPIY; RECT tinyRect = { 0,0,0,0 }; if (IntersectRect(&tinyRect, &src2, &src)) { if (m_moveObject[i].type == TYPE_CREATURE) { return 83; } if (m_blupiDir == DIR_RIGHT) { if (pos.x >= src2.left) { return 64; } if (m_moveObject[i].type == TYPE_BOMBEDOWN) { return 0; } return 63; } else { if (pos.x < src2.left) { return 64; } if (m_moveObject[i].type == TYPE_BOMBEDOWN) { return 0; } return 63; } } } } return 0; } BOOL CDecor::BlupiElectro(POINT pos) { if (m_phase == WM_PHASE_BUILD) return FALSE; if (!m_blupiCloud) return FALSE; RECT src; src.left = pos.x + 16; src.right = pos.x + DIMBLUPIX - 16; src.top = pos.y + 11; src.bottom = pos.y + DIMBLUPIY - 2; RECT src2; src2.left = m_blupiPos.x - 16 - 40; src2.right = m_blupiPos.x + DIMBLUPIX + 16 + 40; src2.top = m_blupiPos.y + 11 - 40; src2.bottom = m_blupiPos.y + DIMBLUPIY - 2 + 40; RECT tinyRect = { 0,0,0,0 }; return IntersectRect(&tinyRect, &src, &src2); } void CDecor::MoveObjectFollow(POINT pos) { if (m_blupiHide) return; RECT src = BlupiRect(pos); src.left = pos.x + 16; src.right = pos.x + DIMBLUPIX - 16; for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type == 96) { RECT src2; src2.left = m_moveObject[i].posCurrent.x - 100; src2.right = m_moveObject[i].posCurrent.x + DIMBLUPIX + 100; src2.top = m_moveObject[i].posCurrent.y - 100; src2.bottom = m_moveObject[i].posCurrent.y + DIMBLUPIY + 100; RECT tinyRect = { 0, 0, 0, 0 }; if (IntersectRect(&tinyRect, &src2, &src)) { m_moveObject[i].type = TYPE_BOMBEFOLLOW2; PlaySound(SOUND_FOLLOW, m_moveObject[i].posCurrent); } } } } int CDecor::MoveObjectDetect(POINT pos, BOOL* pbNear) { RECT src = BlupiRect(pos); src.left = pos.x + 16; src.right = pos.x + DIMBLUPIX - 16; RECT src2; src2.left = src.left - 20; src2.right = src.right + 20; src2.top = src.top - 40; src2.bottom = src.bottom + 30; for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type != 0 && m_moveObject[i].type != TYPE_MAGICTRACK && m_moveObject[i].type != TYPE_SHIELDTRACK && m_moveObject[i].type != TYPE_TRESORTRACK && m_moveObject[i].type != TYPE_HIDETRACK && m_moveObject[i].type != TYPE_GLU && m_moveObject[i].type != TYPE_CLEAR && m_moveObject[i].type != TYPE_ELECTRO && (m_blupiAction != ACTION_PUSH && m_blupiAction != ACTION_POP) || m_moveObject[i].type != TYPE_HELICO) { RECT src3; src3.left = m_moveObject[i].posCurrent.x + 16; src3.right = m_moveObject[i].posCurrent.x + DIMBLUPIX - 16; src3.top = m_moveObject[i].posCurrent.y + 36; src3.bottom = m_moveObject[i].posCurrent.y + DIMBLUPIY; if (m_moveObject[i].type == TYPE_BOMBEUP) { if (m_blupiAction == ACTION_DOWN) { //goto IL_427; } src3.top = m_moveObject[i].posCurrent.y; src3.bottom = m_moveObject[i].posCurrent.y + 69 - 36; } if (m_moveObject[i].type == TYPE_HELICO) { src3.left = m_moveObject[i].posCurrent.x - 16; src3.right = m_moveObject[i].posCurrent.x + DIMOBJX + 16; src3.top = m_moveObject[i].posCurrent.y; src3.bottom = m_moveObject[i].posCurrent.y + DIMOBJY; if (m_blupiDir == 1) { src3.left += 20; } else { src3.right -= 20; } } if (m_moveObject[i].type == TYPE_POISSON || m_moveObject[i].type == TYPE_OISEAU || m_moveObject[i].type == TYPE_GUEPE || m_moveObject[i].type == TYPE_CREATURE) { src3.top = m_moveObject[i].posCurrent.y + 16; src3.bottom = m_moveObject[i].posCurrent.y + DIMBLUPIY - 16; } if (m_moveObject[i].type == TYPE_BALLE) { src3.left = m_moveObject[i].posCurrent.x + 24; src3.right = m_moveObject[i].posCurrent.x + DIMOBJX - 24; src3.top = m_moveObject[i].posCurrent.y + 10; src3.bottom = m_moveObject[i].posCurrent.y + DIMBLUPIY - 32; } RECT rect = { 0, 0, 0, 0 }; if (IntersectRect(&rect, &src3, &src)) { *pbNear = TRUE; return i; } if (m_moveObject[i].type == TYPE_BOMBEDOWN && IntersectRect(&rect, &src3, &src2)) { *pbNear = FALSE; return i; } } } *pbNear = FALSE; return -1; } int CDecor::MoveAscenseurDetect(POINT pos, int height) { if (m_blupiTimeNoAsc != 0) { return -1; } RECT src; src.left = pos.x + 12; src.right = pos.x + DIMBLUPIX - 12; src.top = pos.y + DIMBLUPIY - 2; src.bottom = pos.y + DIMBLUPIY + height - 1; for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type == TYPE_ASCENSEUR || m_moveObject[i].type == TYPE_ASCENSEURs || m_moveObject[i].type == TYPE_ASCENSEURsi) { RECT src2; src2.left = m_moveObject[i].posCurrent.x; src2.right = m_moveObject[i].posCurrent.x + DIMOBJX; src2.top = m_moveObject[i].posCurrent.y; src2.bottom = m_moveObject[i].posCurrent.y + 16; RECT tinyRect = { 0, 0, 0, 0 }; if (IntersectRect(&tinyRect, &src2, &src)) { return i; } } } return -1; } int CDecor::MoveChargeDetect(POINT pos) { RECT src; src.left = pos.x + 16; src.right = pos.x + DIMBLUPIX - 16; src.top = pos.y + 11; src.bottom = pos.y + DIMBLUPIY - 2; for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type == TYPE_CHARGE) { RECT src2; src2.left = m_moveObject[i].posCurrent.x - 10; src2.right = m_moveObject[i].posCurrent.x + DIMBLUPIX + 10; src2.top = m_moveObject[i].posCurrent.y + 36; src2.bottom = m_moveObject[i].posCurrent.y + DIMBLUPIY; RECT tinyRect = { 0, 0, 0, 0 }; if (IntersectRect(&tinyRect, &src2, &src)) { return i; } } } return -1; } int CDecor::MovePersoDetect(POINT pos) { RECT src; if (m_phase == WM_PHASE_BUILD) return -1; src.left = pos.x + 16; src.right = pos.x + DIMBLUPIX - 16; src.top = pos.y + 11; src.bottom = pos.y + DIMBLUPIY - 2; for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type >= TYPE_BOMBEPERSO1 && m_moveObject[i].type <= TYPE_BOMBEPERSO4) { RECT src2; src2.left = m_moveObject[i].posCurrent.x - 16; src2.right = m_moveObject[i].posCurrent.x + DIMBLUPIX + 16; src2.top = m_moveObject[i].posCurrent.y + 36; src2.bottom = m_moveObject[i].posCurrent.y + DIMBLUPIY; RECT tinyRect = { 0, 0, 0, 0 }; if (IntersectRect(&tinyRect, &src2, &src)) { return i; } } } return -1; } int CDecor::MoveBalleDetect(POINT pos) { RECT rcSrc1, rcSrc2; tagRECT rcDst; int i; if (m_phase == WM_PHASE_BUILD) return -1; rcSrc2.right = pos.x + 44; rcSrc2.left = pos.x + 20; rcSrc2.top = pos.y + 10; rcSrc2.bottom = pos.y + 28; for (i = 0; i < MAXMOVEOBJECT - 1; i++) { if (m_moveObject->type == TYPE_BULLDOZER || m_moveObject->type == TYPE_POISSON || m_moveObject->type == TYPE_OISEAU || m_moveObject->type == TYPE_GUEPE || m_moveObject->type == TYPE_BLUPIHELICO || m_moveObject->type == TYPE_BLUPITANK) { rcSrc1.right = m_moveObject->posCurrent.x + 44; rcSrc1.left = m_moveObject->posCurrent.x + 16; rcSrc1.bottom = m_moveObject->posCurrent.y + 50; rcSrc1.top = m_moveObject->posCurrent.y + 16; rcDst = RECT( 0, 0, 0, 0 ); if (IntersectRect(&rcDst, &rcSrc1, &rcSrc2)) return i; } } return -1; } int CDecor::MoveObjectDelete(POINT cel) { int result = -1; for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type != 0) { if (cel.x == m_moveObject[i].posStart.x / DIMOBJX && cel.y == m_moveObject[i].posStart.y / DIMOBJY) { result = m_moveObject[i].type; m_moveObject[i].type = 0; } else if (cel.x == m_moveObject[i].posEnd.x / DIMOBJX && cel.y == m_moveObject[i].posEnd.y / DIMOBJY) { result = m_moveObject[i].type; m_moveObject[i].type = 0; } } } return result; } int CDecor::MoveObjectFree() { for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type == 0) { ZeroMemory(&m_moveObject[i], sizeof(MoveObject)); return i; } } return -1; } int CDecor::SortGetType(int type) { if (type == TYPE_BOMBEDOWN || type == TYPE_BOMBEUP || type == TYPE_BOMBEFOLLOW1 || type == TYPE_BOMBEFOLLOW2) { return 1; } if (type == TYPE_CAISSE) { return 2; } return 3; } void CDecor::MoveObjectSort() { MoveObject src; int i; int num = 0; for (i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type != 0) { MoveObjectCopy(&m_moveObject[num++], &m_moveObject[i]); } } for (i = num; i < MAXMOVEOBJECT; i++) { m_moveObject[i].type = 0; } if (num <= 1) { return; } BOOL flag; do { flag = FALSE; for (i = 0; i < num - 1; i++) { if (SortGetType(m_moveObject[i].type) > SortGetType(m_moveObject[i + 1].type)) { MoveObjectCopy(&src, &m_moveObject[i]); MoveObjectCopy(&m_moveObject[i], &m_moveObject[i + 1]); MoveObjectCopy(&m_moveObject[i + 1], &src); flag = TRUE; } } } while (flag); UpdateCaisse(); m_nbLinkCaisse = 0; } void CDecor::MoveObjectPriority(int i) { MoveObject src; int j; if (i == 0) { return; } if (m_moveObject[i].type != TYPE_BALLE) { return; } j = 0; while (j < MAXMOVEOBJECT) { if (m_moveObject[j].type != TYPE_BALLE) { if (j > i) { return; } MoveObjectCopy(&src, &m_moveObject[i]); MoveObjectCopy(&m_moveObject[i], &m_moveObject[j]); MoveObjectCopy(&m_moveObject[j], &src); if (m_moveObject[i].type == TYPE_CAISSE || m_moveObject[j].type == TYPE_CAISSE) { UpdateCaisse(); } return; } else { j++; } } } int CDecor::MoveObjectSearch(POINT pos, int type) { for (int i = 0; i < MAXMOVEOBJECT; i++) { if (m_moveObject[i].type != 0 && (type == -1 || m_moveObject[i].type == type)) { if (m_moveObject[i].type == TYPE_BALLE && m_moveObject[i].posStart.x != m_moveObject[i].posEnd.x) { if (m_moveObject[i].posCurrent.x >= pos.x - 100 && m_moveObject[i].posCurrent.x <= pos.x + 100 && m_moveObject[i].posCurrent.y == pos.y) { return i; } } else if (m_moveObject[i].type == TYPE_BALLE && m_moveObject[i].posStart.y != m_moveObject[i].posEnd.y) { if (m_moveObject[i].posCurrent.y >= pos.y - 100 && m_moveObject[i].posCurrent.y <= pos.y + 100 && m_moveObject[i].posCurrent.x == pos.x) { return i; } } else if (m_moveObject[i].posCurrent.x == pos.x && m_moveObject[i].posCurrent.y == pos.y) { return i; } } } return -1; }