bool Game::cop_isObjectNotInBox() { debug(DBG_OPCODES, "Game::cop_isObjectNotInBox()"); bool ret = true; int16 var1A = _objectScript.fetchNextWord(); // boxNum int index = findObjectByName(_objectScript.currentObjectNum, _objectScript.testObjectNum, &_objectScript.objectFound); // var18 if (index == -1) { ret = false; } if (ret) { SceneObject *so = derefSceneObject(index); if (so->statePrev != 0) { int16 var1E = getObjectTransformXPos(index); int16 var20 = getObjectTransformXPos(index); int16 var22 = getObjectTransformYPos(index); int16 var24 = getObjectTransformYPos(index); bool foundBox = false; for (int i = 0; i < _boxesCountTable[var1A]; ++i) { Box *box = derefBox(var1A, i); if (boxInRect(box, var1E, var20, var22, var24) && box->state == 1) { foundBox = true; break; } } if (foundBox) { if (index == _objectScript.testObjectNum) { _objectScript.dataOffset = _objectScript.testDataOffset; assert(0); // XXX } else { ret = false; } return ret; } foundBox = false; for (int i = 0; i < _boxesCountTable[10 + var1A]; ++i) { Box *box = derefBox(10 + var1A, i); if (boxInRect(box, var1E, var20, var22, var24) && box->state == 1) { foundBox = true; break; } } if (foundBox) { if (index == _objectScript.testObjectNum) { _objectScript.dataOffset = _objectScript.testDataOffset; assert(0); // XXX } else { ret = false; } return ret; } return true; } } if (index == _objectScript.testObjectNum) { _objectScript.dataOffset = _objectScript.testDataOffset; assert(0); // XXX } else { ret = false; } return ret; }
bool Game::intersectsBox(int num, int index, int x1, int y1, int x2, int y2) { const Box *b = derefBox(num, index); if (b->state == 1) { if (b->x1 <= x1 && b->x2 >= x1 && b->y1 <= y1 && b->y2 >= y1) { return true; } if (b->x1 <= x2 && b->x2 >= x2 && b->y1 <= y2 && b->y2 >= y2) { return true; } if (b->x2 >= MIN(x1, x2) && b->x1 <= MAX(x1, x2) && b->y2 >= MIN(y1, y2) && b->y1 <= MAX(y1, y2)) { if (x1 == x2 || y1 == y2) { return true; } int iy = y1 - (y1 - y2) * (x1 - b->x1) / (x1 - x2); if (b->y1 <= iy && b->y2 >= iy && MIN(y1, y2) <= iy && MAX(y1, y2) >= iy) { return true; } iy = y1 - (y1 - y2) * (x1 - b->x2) / (x1 - x2); if (b->y1 <= iy && b->y2 >= iy && MIN(y1, y2) <= iy && MAX(y1, y2) >= iy) { return true; } int ix = x1 - (x1 - x2) * (y1 - b->y1) / (y1 - y2); if (b->x1 <= ix && b->x2 >= ix && MIN(x1, x2) <= ix && MAX(x1, x2) >= ix) { return true; } ix = x1 - (x1 - x2) * (y1 - b->y2) / (y1 - y2); if (b->x1 <= ix && b->x2 >= ix && MIN(x1, x2) <= ix && MAX(x1, x2) >= ix) { return true; } } } return false; }
void Game::oop_disableBox() { debug(DBG_OPCODES, "Game::oop_disableBox()"); int box = _objectScript.fetchNextWord(); int index = _objectScript.fetchNextWord(); // FIXME: workaround no box for using raft (C2_17.SCN, FLY*.SCN) if (_objectScript.currentObjectNum == 0 && (_objectScript.statementNum == 38 || _objectScript.statementNum == 39)) { return; } derefBox(box, index)->state = 0; }
void Game::oop_evalBoxesYPos() { debug(DBG_OPCODES, "Game::oop_evalBoxesYPos()"); for (int b = 0; b < 10; ++b) { for (int i = 0; i < _boxesCountTable[b]; ++i) { Box *box = derefBox(b, i); evalExpr(&box->y1); _objectScript.dataOffset -= 4; evalExpr(&box->y2); _objectScript.dataOffset -= 4; } } _objectScript.dataOffset += 4; }
void Game::oop_clipBoxes() { debug(DBG_OPCODES, "Game::oop_clipBoxes()"); int16 x1 = _objectScript.fetchNextWord(); int16 y1 = _objectScript.fetchNextWord(); int16 x2 = _objectScript.fetchNextWord(); int16 y2 = _objectScript.fetchNextWord(); for (int b = 0; b < 10; ++b) { for (int i = 0; i < _boxesCountTable[b]; ++i) { Box *box = derefBox(b, i); box->x1 = CLIP(box->x1, x1, x2); box->x2 = CLIP(box->x2, x1, x2); box->y1 = CLIP(box->y1, y1, y2); box->y2 = CLIP(box->y2, y1, y2); } } }
void Game::redrawObjectBoxes(int previousObject, int currentObject) { debug(DBG_GAME, "Game::redrawObjectBoxes(%d, %d)", previousObject, currentObject); for (int b = 0; b < 10; ++b) { for (int i = 0; i < _boxesCountTable[b]; ++i) { Box *box = derefBox(b, i); if (box->state == 2 && box->z <= _sortedSceneObjectsTable[previousObject]->z) { const int w = box->x2 - box->x1 + 1; const int h = box->y2 - box->y1 + 1; const int x = box->x1; const int y = _bitmapBuffer1.h + 1 - box->y2; if (previousObject == currentObject || box->z > _sortedSceneObjectsTable[currentObject]->z) { if (box->endColor != 0) { drawBox(x, y, w, h, &_bitmapBuffer3, &_bitmapBuffer1, box->startColor, box->startColor + box->endColor - 1); } else { copyBufferToBuffer(x, y, w, h, &_bitmapBuffer3, &_bitmapBuffer1); } } } } } }
void Game::oop_setBoxToObject() { debug(DBG_OPCODES, "Game::oop_setBoxToObject()"); int16 var1A = _objectScript.fetchNextWord(); int16 var1C = _objectScript.fetchNextWord(); int index = findObjectByName(_objectScript.currentObjectNum, _objectScript.testObjectNum, &_objectScript.objectFound); if (index != -1) { SceneObject *so = derefSceneObject(index); if (so->statePrev != 0) { int16 var1E = getObjectTransformXPos(index); int16 var20 = getObjectTransformXPos(index); int16 var22 = getObjectTransformYPos(index); int16 var24 = getObjectTransformYPos(index); Box *box = derefBox(var1A, var1C); box->x1 = MIN(var1E, var20); box->x2 = MAX(var1E, var20); box->y1 = MIN(var24, var22); box->y2 = MAX(var24, var22); return; } } _objectScript.dataOffset += 24; }
void Game::oop_enableBox() { debug(DBG_OPCODES, "Game::oop_enableBox()"); int box = _objectScript.fetchNextWord(); int index = _objectScript.fetchNextWord(); derefBox(box, index)->state = 1; }