예제 #1
0
void Game::oop_initializeObject() {
	debug(DBG_OPCODES, "Game::oop_initializeObject");
	int index = findObjectByName(_objectScript.currentObjectNum, _objectScript.testObjectNum, &_objectScript.objectFound);
	if (index != -1) {
		SceneObject *so = derefSceneObject(index);
		int16 op = _objectScript.fetchNextWord();
		if (op == 0) {
			if (so->state != 0) {
				so->x = so->xPrev;
				so->y = so->yPrev;
				so->frameNum = so->frameNumPrev;
				if (so->state == 2) {
					SceneObjectFrame *sof = derefSceneObjectFrame(so->frameNum);
					copyBufferToBuffer(so->x, _bitmapBuffer1.h + 1 - so->y - sof->hdr.h, sof->hdr.w, sof->hdr.h, &_bitmapBuffer3, &_bitmapBuffer1);
				}
				so->state = -1;
			}
		} else if (op == 1) {
			int16 mode = so->mode;
			so->mode = 1;
			reinitializeObject(index);
			so->mode = mode;
			if (so->state == 2) {
				so->state = 1;
			}
		} else if (op == 2) {
			if (so->state == 1) {
				so->x = so->xPrev;
				so->y = so->yPrev;
				so->frameNum = so->frameNumPrev;
				so->state = 2;
			} else {
				int16 mode = so->mode;
				so->mode = 3;
				reinitializeObject(index);
				so->mode = mode;
			}
		}
	} else {
		_objectScript.dataOffset += 2;
	}
}
예제 #2
0
파일: game.cpp 프로젝트: raziel-/bermuda
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);
					}
				}
			}
		}
	}
}
예제 #3
0
파일: game.cpp 프로젝트: raziel-/bermuda
void Game::redrawObjects() {
	sortObjects();
	int previousObject = -1;
	for (int i = 0; i < _sceneObjectsCount; ++i) {
		SceneObject *so = _sortedSceneObjectsTable[i];
		if (so->state == 1 || so->state == 2) {
			if (previousObject >= 0) {
				redrawObjectBoxes(previousObject, i);
			}
			previousObject = i;
			_sceneObjectFramesTable[so->frameNum].decode(_sceneObjectFramesTable[so->frameNum].data, _tempDecodeBuffer);
			if (_isDemo && _sceneNumber == 1 && i == 14) {
				// FIXME fixes wrong overlapping icon in the first scene of the demo
				//   object 13 pos 582,423 frame 1885 - should be displayed
				//   object 14 pos 582,423 frame 1884 - shouldn't be displayed
				continue;
			}
			if (so->flip == 2) {
				int16_t y = _bitmapBuffer1.h + 1 - so->y - _sceneObjectFramesTable[so->frameNum].hdr.h;
				drawObjectVerticalFlip(so->x, y, _tempDecodeBuffer, &_bitmapBuffer1);
			} else {
				int16_t y = _bitmapBuffer1.h + 1 - so->y - _sceneObjectFramesTable[so->frameNum].hdr.h;
				drawObject(so->x, y, _tempDecodeBuffer, &_bitmapBuffer1);
			}
		}
	}
	if (previousObject >= 0) {
		redrawObjectBoxes(previousObject, previousObject);
	}

	// no overlay graphics on static screens
	//
	// retail data files
	//   PIC0.SCN:        SceneNumber    -1000
	//   PIC1.SCN:        SceneNumber    -1000
	//   PIC2.SCN:        SceneNumber    -1000
	//   PIC3.SCN:        SceneNumber    -1000
	//
	// demo data files
	//   A01.SCN:        SceneNumber    -1000
	//   A02.SCN:        SceneNumber    -1001
	//   A03.SCN:        SceneNumber    -1003
	//

	if (_sceneNumber > -1000 && _sceneObjectsCount != 0) {
		if (!_isDemo && _gameOver) {
			decodeLzss(_bermudaOvrData + 2, _tempDecodeBuffer);
			drawObject(93, _bitmapBuffer1.h - 230, _tempDecodeBuffer, &_bitmapBuffer1);
		}
		if (_currentBagObject >= 0 && _currentBagObject < _bagObjectsCount && _currentBagAction == 3) {
			drawObject(_bagPosX, _bitmapBuffer1.h + 1 - _bagPosY - getBitmapHeight(_iconBackgroundImage), _iconBackgroundImage, &_bitmapBuffer1);
			int invW = getBitmapWidth(_iconBackgroundImage);
			int invH = getBitmapHeight(_iconBackgroundImage);
			int bagObjW = getBitmapWidth(_bagObjectsTable[_currentBagObject].data);
			int bagObjH = getBitmapHeight(_bagObjectsTable[_currentBagObject].data);
			int y = _bitmapBuffer1.h + 1 - _bagPosY - (invH - bagObjH) / 2 - bagObjH;
			int x = _bagPosX + (invW - bagObjW) / 2;
			drawObject(x, y, _bagObjectsTable[_currentBagObject].data, &_bitmapBuffer1);
		}
		if (_lifeBarDisplayed) {
			drawObject(386, _bitmapBuffer1.h - 18 - getBitmapHeight(_lifeBarImage), _lifeBarImage, &_bitmapBuffer1);
			if (_varsTable[1] == 1) {
				drawObject(150, _bitmapBuffer1.h - 18 - getBitmapHeight(_lifeBarImage), _lifeBarImage, &_bitmapBuffer1);
				if (_swordIconImage) {
					drawObject(173, _bitmapBuffer1.h - 18 - getBitmapHeight(_swordIconImage), _swordIconImage, &_bitmapBuffer1);
				}
			} else if (_varsTable[2] == 1) {
				drawObject(150, _bitmapBuffer1.h - 18 - getBitmapHeight(_lifeBarImage), _lifeBarImage, &_bitmapBuffer1);
				int index = MIN(13, 13 - _varsTable[4]);
				drawObject(173, _bitmapBuffer1.h - 31 - getBitmapHeight(_weaponIconImageTable[index]), _weaponIconImageTable[index], &_bitmapBuffer1);
				if (_varsTable[3] < 5) {
					index = (_varsTable[4] <= 0) ? 0 : 1;
					uint8_t *p = _ammoIconImageTable[index][_varsTable[3]];
					drawObject(184, _bitmapBuffer1.h - 41 - getBitmapHeight(p), p, &_bitmapBuffer1);
				}
			}
			int index = (_varsTable[0] >= 10) ? 10 : _varsTable[0];
			uint8_t *lifeBarFrame = _lifeBarImageTable[index][_lifeBarCurrentFrame];
			drawObject(409, _bitmapBuffer1.h - 36 - getBitmapHeight(lifeBarFrame), lifeBarFrame, &_bitmapBuffer1);
			++_lifeBarCurrentFrame;
			if (_lifeBarCurrentFrame >= 12) {
				_lifeBarCurrentFrame = 0;
			}
		}
#if 0
		if (_lifeBarDisplayed || _lifeBarDisplayed2) {
			if (_varsTable[2] == 1 || _varsTable[1] == 1) {
				win16_stretchBits(&_bitmapBuffer1,
					getBitmapHeight(_lifeBarImage),
					getBitmapWidth(_lifeBarImage),
					_bitmapBuffer1.h - 18 - getBitmapHeight(_lifeBarImage),
					150,
					getBitmapHeight(_lifeBarImage),
					getBitmapWidth(_lifeBarImage),
					19,
					150
				);
			}
			win16_stretchBits(&_bitmapBuffer1,
				getBitmapHeight(_lifeBarImage),
				getBitmapWidth(_lifeBarImage),
				_bitmapBuffer1.h - 18 - getBitmapHeight(_lifeBarImage),
				386,
				getBitmapHeight(_lifeBarImage),
				getBitmapWidth(_lifeBarImage),
				19,
				386
			);
			_lifeBarDisplayed2 = _lifeBarDisplayed;
		}
		if (_previousBagAction == kActionUseObject || _currentBagAction == kActionUseObject) {
			if (_currentBagObject != _previousBagObject || _previousBagAction != _currentBagAction) {
				win16_stretchBits(&_bitmapBuffer1,
					getBitmapHeight(_iconBackgroundImage),
					getBitmapWidth(_iconBackgroundImage),
					_bitmapBuffer1.h + 1 - _bagPosY - getBitmapHeight(_iconBackgroundImage),
					_bagPosX,
					getBitmapHeight(_iconBackgroundImage),
					getBitmapWidth(_iconBackgroundImage),
					_bagPosY,
					_bagPosX
				);
			}
		}
#endif
	}
	win16_stretchBits(&_bitmapBuffer1, _bitmapBuffer1.h + 1, _bitmapBuffer1.w + 1, 0, 0, _bitmapBuffer1.h + 1, _bitmapBuffer1.w + 1, 0, 0);
	memcpy(_bitmapBuffer1.bits, _bitmapBuffer3.bits, kGameScreenWidth * kGameScreenHeight);
	if (_lifeBarDisplayed) {
		copyBufferToBuffer(386,
			_bitmapBuffer1.h + 1 - 19 - getBitmapHeight(_lifeBarImage),
			getBitmapWidth(_lifeBarImage),
			getBitmapHeight(_lifeBarImage),
			&_bitmapBuffer3,
			&_bitmapBuffer1
		);
		copyBufferToBuffer(150,
			_bitmapBuffer1.h + 1 - 19 - getBitmapHeight(_lifeBarImage),
			getBitmapWidth(_lifeBarImage),
			getBitmapHeight(_lifeBarImage),
			&_bitmapBuffer3,
			&_bitmapBuffer1
		);
	}
	_previousBagAction = _currentBagAction;
}