Exemple #1
0
void Game::oop_addObjectToBag() {
	debug(DBG_OPCODES, "Game::oop_addObjectToBag()");
	int index = findObjectByName(_objectScript.currentObjectNum, _objectScript.testObjectNum, &_objectScript.objectFound);
	if (index != -1) {
		SceneObject *so = derefSceneObject(index);
		if (findBagObjectByName(so->name) == -1) {
			assert(_bagObjectsCount < NUM_BAG_OBJECTS);
			BagObject *bo = &_bagObjectsTable[_bagObjectsCount];
			strcpy(bo->name, so->name);

			SceneObjectFrame *sof = &_sceneObjectFramesTable[so->frameNumPrev];
			uint32 size = sof->hdr.w * sof->hdr.h + 4;
			bo->data = (uint8 *)malloc(size);
			if (bo->data) {
				bo->dataSize = decodeLzss(sof->data, bo->data);
				assert(bo->dataSize == size);
			}

			++_bagObjectsCount;
			if (_bagObjectsCount != 0 && _currentBagObject == -1) {
				_currentBagObject = 0;
			}
		}
	}
}
Exemple #2
0
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;
}