Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
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;
}
Пример #5
0
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);
		}
	}
}
Пример #6
0
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);
					}
				}
			}
		}
	}
}
Пример #7
0
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;
}
Пример #8
0
void Game::oop_enableBox() {
	debug(DBG_OPCODES, "Game::oop_enableBox()");
	int box = _objectScript.fetchNextWord();
	int index = _objectScript.fetchNextWord();
	derefBox(box, index)->state = 1;
}