Started to implement button handling (atm only the inventory works)
Also implemented following opcodes: - cmd_waitForConfirmationMouseClick - cmd_drawItemShapeIntoScene - cmd_setFireberryGlowPalette - cmd_findBrightestFireberry - cmd_sceneToDirection - cmd_createAmuletJewel - cmd_getCharactersMovementDelay - cmd_setNoDrawShapesFlag - cmd_checkClickOnNPC - cmd_getFoyerItem - cmd_setFoyerItem - cmd_passiveProtection - cmd_fillRect Fixed bugs in some opcodes (mostly wrong debug calls) Also changed debuglevel of all sprite functions to level 6 (from 5). svn-id: r19831
This commit is contained in:
parent
268d05955f
commit
515b69ddb8
6 changed files with 630 additions and 96 deletions
303
kyra/kyra.cpp
303
kyra/kyra.cpp
|
@ -282,6 +282,7 @@ int KyraEngine::init(GameDetector &detector) {
|
|||
assert(_characterList);
|
||||
for (int i = 0; i < 11; ++i) {
|
||||
memset(&_characterList[i], 0, sizeof(Character));
|
||||
memset(_characterList[i].inventoryItems, 0xFF, sizeof(_characterList[i].inventoryItems));
|
||||
}
|
||||
_characterList[0].sceneId = 5;
|
||||
_characterList[0].height = 48;
|
||||
|
@ -339,6 +340,7 @@ int KyraEngine::init(GameDetector &detector) {
|
|||
memset(_currSentenceColor, 0, 3);
|
||||
_startSentencePalIndex = -1;
|
||||
_fadeText = false;
|
||||
_noDrawShapesFlag = 0;
|
||||
|
||||
_brandonPosX = _brandonPosY = -1;
|
||||
_brandonDrawFrame = 113;
|
||||
|
@ -358,6 +360,7 @@ int KyraEngine::init(GameDetector &detector) {
|
|||
_configTalkspeed = 1;
|
||||
|
||||
_marbleVaseItem = -1;
|
||||
memset(_foyerItemTable, -1, sizeof(_foyerItemTable));
|
||||
_mouseState = _itemInHand = -1;
|
||||
_handleInput = false;
|
||||
|
||||
|
@ -373,6 +376,7 @@ int KyraEngine::init(GameDetector &detector) {
|
|||
_unkScreenVar3 = 0;
|
||||
|
||||
memset(_specialPalettes, 0, sizeof(_specialPalettes));
|
||||
_mousePressFlag = false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -398,6 +402,13 @@ KyraEngine::~KyraEngine() {
|
|||
|
||||
delete [] _movFacingTable;
|
||||
|
||||
free(_buttonShape0);
|
||||
free(_buttonShape1);
|
||||
free(_buttonShape2);
|
||||
free(_buttonShape3);
|
||||
free(_buttonShape4);
|
||||
free(_buttonShape5);
|
||||
|
||||
for (int i = 0; i < ARRAYSIZE(_shapes); ++i) {
|
||||
if (_shapes[i] != 0) {
|
||||
free(_shapes[i]);
|
||||
|
@ -492,6 +503,8 @@ void KyraEngine::startup() {
|
|||
loadCharacterShapes();
|
||||
loadSpecialEffectShapes();
|
||||
loadItems();
|
||||
loadButtonShapes();
|
||||
initMainButtonList();
|
||||
loadMainScreen();
|
||||
setupTimers();
|
||||
loadPalette("PALETTE.COL", _screen->_currentPalette);
|
||||
|
@ -528,6 +541,7 @@ void KyraEngine::delay(uint32 amount, bool update) {
|
|||
OSystem::Event event;
|
||||
char saveLoadSlot[20];
|
||||
|
||||
_mousePressFlag = false;
|
||||
uint32 start = _system->getMillis();
|
||||
do {
|
||||
while (_system->pollEvent(event)) {
|
||||
|
@ -556,6 +570,7 @@ void KyraEngine::delay(uint32 amount, bool update) {
|
|||
quitGame();
|
||||
break;
|
||||
case OSystem::EVENT_LBUTTONDOWN:
|
||||
_mousePressFlag = true;
|
||||
if (_abortWalkFlag2) {
|
||||
_abortWalkFlag = true;
|
||||
_mouseX = event.mouse.x;
|
||||
|
@ -627,6 +642,7 @@ void KyraEngine::mainLoop() {
|
|||
|
||||
while (!_quitFlag) {
|
||||
int32 frameTime = (int32)_system->getMillis();
|
||||
processButtonList(_buttonList);
|
||||
updateMousePointer();
|
||||
updateGameTimers();
|
||||
_sprites->updateSceneAnims();
|
||||
|
@ -718,6 +734,18 @@ void KyraEngine::waitTicks(int ticks) {
|
|||
} while (!_fastMode && _system->getMillis() < end);
|
||||
}
|
||||
|
||||
void KyraEngine::delayWithTicks(int ticks) {
|
||||
uint32 nextTime = _system->getMillis() + ticks * _tickLength;
|
||||
while (_system->getMillis() < nextTime) {
|
||||
_sprites->updateSceneAnims();
|
||||
updateAllObjectShapes();
|
||||
//if (_currentCharacter->sceneId == 210) {
|
||||
// updateKyragemFading();
|
||||
// seq_playEnd();
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
void KyraEngine::seq_demo() {
|
||||
debug(9, "KyraEngine::seq_demo()");
|
||||
|
||||
|
@ -893,6 +921,66 @@ void KyraEngine::seq_introKallakMalcolm() {
|
|||
_seq->playSequence(_seq_KallakMalcolm, true);
|
||||
}
|
||||
|
||||
void KyraEngine::seq_createAmuletJewel(int jewel, int page, int noSound, int drawOnly) {
|
||||
debug(9, "seq_createAmuletJewel(%d, %d, %d, %d)", jewel, page, noSound, drawOnly);
|
||||
const static uint16 specialJewelTable[] = {
|
||||
0x167, 0x162, 0x15D, 0x158, 0x153, 0xFFFF
|
||||
};
|
||||
const static uint16 specialJewelTable1[] = {
|
||||
0x14F, 0x154, 0x159, 0x15E, 0x163, 0xFFFF
|
||||
};
|
||||
const static uint16 specialJewelTable2[] = {
|
||||
0x150, 0x155, 0x15A, 0x15F, 0x164, 0xFFFF
|
||||
};
|
||||
const static uint16 specialJewelTable3[] = {
|
||||
0x151, 0x156, 0x15B, 0x160, 0x165, 0xFFFF
|
||||
};
|
||||
const static uint16 specialJewelTable4[] = {
|
||||
0x152, 0x157, 0x15C, 0x161, 0x166, 0xFFFF
|
||||
};
|
||||
if (!noSound)
|
||||
// snd_playSoundEffect(0x5F)
|
||||
_screen->hideMouse();
|
||||
if (!drawOnly) {
|
||||
for (int i = 0; specialJewelTable[i] != 0xFFFF; ++i) {
|
||||
_screen->drawShape(page, _shapes[4+specialJewelTable[i]], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
|
||||
_screen->updateScreen();
|
||||
delayWithTicks(3);
|
||||
}
|
||||
|
||||
const uint16 *opcodes = 0;
|
||||
switch (jewel - 1) {
|
||||
case 0:
|
||||
opcodes = specialJewelTable1;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
opcodes = specialJewelTable2;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
opcodes = specialJewelTable3;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
opcodes = specialJewelTable4;
|
||||
break;
|
||||
}
|
||||
|
||||
if (opcodes) {
|
||||
for (int i = 0; opcodes[i] != 0xFFFF; ++i) {
|
||||
_screen->drawShape(page, _shapes[4+opcodes[i]], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
|
||||
_screen->updateScreen();
|
||||
delayWithTicks(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
_screen->drawShape(page, _shapes[327+jewel], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
|
||||
_screen->updateScreen();
|
||||
_screen->showMouse();
|
||||
setGameFlag(0x55+jewel);
|
||||
}
|
||||
|
||||
bool KyraEngine::seq_skipSequence() const {
|
||||
debug(9, "KyraEngine::seq_skipSequence()");
|
||||
return _quitFlag || _abortIntroFlag;
|
||||
|
@ -1080,6 +1168,25 @@ void KyraEngine::loadItems() {
|
|||
delete[] fileData;
|
||||
}
|
||||
|
||||
void KyraEngine::loadButtonShapes() {
|
||||
loadBitmap("BUTTONS2.CPS", 3, 3, 0);
|
||||
_screen->_curPage = 2;
|
||||
_buttonShape0 = _screen->encodeShape(0, 0, 24, 14, 1);
|
||||
_buttonShape1 = _screen->encodeShape(24, 0, 24, 14, 1);
|
||||
_buttonShape2 = _screen->encodeShape(48, 0, 24, 14, 1);
|
||||
_buttonShape3 = _screen->encodeShape(0, 15, 24, 14, 1);
|
||||
_buttonShape4 = _screen->encodeShape(24, 15, 24, 14, 1);
|
||||
_buttonShape5 = _screen->encodeShape(48, 15, 24, 14, 1);
|
||||
_screen->_curPage = 0;
|
||||
}
|
||||
|
||||
void KyraEngine::initMainButtonList() {
|
||||
_buttonList = &_buttonData[0];
|
||||
for (int i = 0; _buttonDataListPtr[i]; ++i) {
|
||||
_buttonList = initButton(_buttonList, _buttonDataListPtr[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void KyraEngine::loadMainScreen() {
|
||||
if ((_features & GF_ENGLISH) && (_features & GF_TALKIE))
|
||||
loadBitmap("MAIN_ENG.CPS", 3, 3, 0);
|
||||
|
@ -1177,6 +1284,8 @@ void KyraEngine::enterNewScene(int sceneId, int facing, int unk1, int unk2, int
|
|||
debug(9, "enterNewScene(%d, %d, %d, %d, %d)", sceneId, facing, unk1, unk2, brandonAlive);
|
||||
int unkVar1 = 1;
|
||||
_screen->hideMouse();
|
||||
_handleInput = false;
|
||||
_abortWalkFlag = false;
|
||||
_abortWalkFlag2 = false;
|
||||
if (_currentCharacter->sceneId == 7 && sceneId == 24) {
|
||||
_newMusicTheme = 2;
|
||||
|
@ -1338,6 +1447,7 @@ void KyraEngine::enterNewScene(int sceneId, int facing, int unk1, int unk2, int
|
|||
// XXX seq_poisionDeathNow
|
||||
}
|
||||
updateMousePointer(true);
|
||||
_changedScene = true;
|
||||
}
|
||||
|
||||
void KyraEngine::transcendScenes(int roomIndex, int roomName) {
|
||||
|
@ -2786,12 +2896,12 @@ void KyraEngine::wipeDownMouseItem(int xpos, int ypos) {
|
|||
while (height >= 0) {
|
||||
restoreRect1(xpos, ypos);
|
||||
_screen->setNewShapeHeight(_shapes[220+_itemInHand], height);
|
||||
uint32 nextTime = _system->getMillis() + 1 * _tickLength;
|
||||
_screen->drawShape(0, _shapes[220+_itemInHand], xpos, y, 0, 0);
|
||||
_screen->updateScreen();
|
||||
y += 2;
|
||||
height -= 2;
|
||||
// XXX
|
||||
waitTicks(1);
|
||||
while (_system->getMillis() < nextTime) {}
|
||||
}
|
||||
restoreRect1(xpos, ypos);
|
||||
_screen->resetShapeHeight(_shapes[220+_itemInHand]);
|
||||
|
@ -3579,7 +3689,8 @@ void KyraEngine::prepDrawAllObjects() {
|
|||
AnimObject *curObject = _objectQueue;
|
||||
int drawPage = 2;
|
||||
int flagUnk1 = 0, flagUnk2 = 0, flagUnk3 = 0;
|
||||
// XXX
|
||||
if (_noDrawShapesFlag)
|
||||
return;
|
||||
if (_brandonStatusBit & 0x20)
|
||||
flagUnk1 = 0x200;
|
||||
if (_brandonStatusBit & 0x40)
|
||||
|
@ -4583,6 +4694,7 @@ int KyraEngine::processSceneChange(int *table, int unk1, int frameReset) {
|
|||
int returnValue = 0;
|
||||
uint32 nextFrame = 0;
|
||||
_abortWalkFlag = false;
|
||||
_mousePressFlag = false;
|
||||
while (running) {
|
||||
if (_abortWalkFlag) {
|
||||
*table = 8;
|
||||
|
@ -4611,15 +4723,18 @@ int KyraEngine::processSceneChange(int *table, int unk1, int frameReset) {
|
|||
break;
|
||||
}
|
||||
|
||||
returnValue = (changeScene(_currentCharacter->facing) != 0);
|
||||
returnValue = changeScene(_currentCharacter->facing);
|
||||
if (returnValue) {
|
||||
running = false;
|
||||
_abortWalkFlag = false;
|
||||
}
|
||||
|
||||
if (unk1) {
|
||||
// XXX running = false;
|
||||
if (_mousePressFlag) {
|
||||
running = false;
|
||||
_sceneChangeState = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (forceContinue || !running) {
|
||||
continue;
|
||||
|
@ -5030,7 +5145,9 @@ void KyraEngine::processInput(int xpos, int ypos) {
|
|||
}
|
||||
uint8 item = findItemAtPos(xpos, ypos);
|
||||
if (item == 0xFF) {
|
||||
if (clickEventHandler(xpos, ypos))
|
||||
_changedScene = false;
|
||||
clickEventHandler(xpos, ypos);
|
||||
if (_changedScene)
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -5118,6 +5235,7 @@ int KyraEngine::clickEventHandler(int xpos, int ypos) {
|
|||
while (_scriptInterpreter->validScript(_scriptClick)) {
|
||||
_scriptInterpreter->runScript(_scriptClick);
|
||||
}
|
||||
|
||||
return _scriptClick->variables[3];
|
||||
}
|
||||
|
||||
|
@ -5479,4 +5597,177 @@ void KyraEngine::saveGame(const char *fileName, const char *saveName) {
|
|||
delete out;
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark - Button handling
|
||||
#pragma mark -
|
||||
|
||||
Button *KyraEngine::initButton(Button *list, Button *newButton) {
|
||||
if (!newButton)
|
||||
return list;
|
||||
if (!list)
|
||||
return newButton;
|
||||
Button *cur = list;
|
||||
while (true) {
|
||||
if (!cur->nextButton) {
|
||||
break;
|
||||
}
|
||||
cur = cur->nextButton;
|
||||
}
|
||||
cur->nextButton = newButton;
|
||||
return list;
|
||||
}
|
||||
|
||||
int KyraEngine::buttonInventoryCallback(Button *caller) {
|
||||
int itemOffset = caller->specialValue - 2;
|
||||
uint8 inventoryItem = _currentCharacter->inventoryItems[itemOffset];
|
||||
if (_itemInHand == -1) {
|
||||
if (inventoryItem == 0xFF) {
|
||||
// snd_playSoundEffect(0x36);
|
||||
return 0;
|
||||
} else {
|
||||
_screen->hideMouse();
|
||||
_screen->fillRect(_itemPosX[itemOffset], _itemPosY[itemOffset], _itemPosX[itemOffset] + 15, _itemPosY[itemOffset] + 15, 12);
|
||||
// snd_playSoundEffect(0x35);
|
||||
setMouseItem(inventoryItem);
|
||||
updateSentenceCommand(_itemList[inventoryItem], _takenList[0], 179);
|
||||
_itemInHand = inventoryItem;
|
||||
_screen->showMouse();
|
||||
_currentCharacter->inventoryItems[itemOffset] = 0xFF;
|
||||
}
|
||||
} else {
|
||||
if (inventoryItem != 0xFF) {
|
||||
// snd_playSoundEffect(0x35);
|
||||
_screen->hideMouse();
|
||||
_screen->fillRect(_itemPosX[itemOffset], _itemPosY[itemOffset], _itemPosX[itemOffset] + 15, _itemPosY[itemOffset] + 15, 12);
|
||||
_screen->drawShape(0, _shapes[220+_itemInHand], _itemPosX[itemOffset], _itemPosY[itemOffset], 0, 0);
|
||||
setMouseItem(inventoryItem);
|
||||
updateSentenceCommand(_itemList[inventoryItem], _takenList[1], 179);
|
||||
_screen->showMouse();
|
||||
_currentCharacter->inventoryItems[itemOffset] = _itemInHand;
|
||||
_itemInHand = inventoryItem;
|
||||
} else {
|
||||
// snd_playSoundEffect(0x32);
|
||||
_screen->hideMouse();
|
||||
_screen->drawShape(0, _shapes[220+_itemInHand], _itemPosX[itemOffset], _itemPosY[itemOffset], 0, 0);
|
||||
_screen->setMouseCursor(1, 1, _shapes[4]);
|
||||
updateSentenceCommand(_itemList[_itemInHand], _placedList[0], 179);
|
||||
_screen->showMouse();
|
||||
_currentCharacter->inventoryItems[itemOffset] = _itemInHand;
|
||||
_itemInHand = -1;
|
||||
}
|
||||
}
|
||||
_screen->updateScreen();
|
||||
// XXX clearKyrandiaButtonIO
|
||||
return 0;
|
||||
}
|
||||
|
||||
void KyraEngine::processButtonList(Button *list) {
|
||||
while (list) {
|
||||
if (list->flags & 8) {
|
||||
list = list->nextButton;
|
||||
continue;
|
||||
}
|
||||
|
||||
int x = list->x;
|
||||
int y = list->y;
|
||||
assert(list->dimTableIndex < _screen->_screenDimTableCount);
|
||||
if (x < 0) {
|
||||
x += _screen->_screenDimTable[list->dimTableIndex].w << 3;
|
||||
}
|
||||
x += _screen->_screenDimTable[list->dimTableIndex].sx << 3;
|
||||
|
||||
if (y < 0) {
|
||||
y += _screen->_screenDimTable[list->dimTableIndex].h;
|
||||
}
|
||||
y += _screen->_screenDimTable[list->dimTableIndex].sy;
|
||||
|
||||
if (_mouseX >= x && _mouseY >= y && x + list->width >= _mouseX && y + list->height >= _mouseY) {
|
||||
int processMouseClick = 0;
|
||||
if (list->flags & 0x400) {
|
||||
if (_mousePressFlag) {
|
||||
if (!(list->flags2 & 1)) {
|
||||
list->flags2 |= 1;
|
||||
processButton(list);
|
||||
}
|
||||
} else {
|
||||
if (list->flags2 & 1) {
|
||||
list->flags2 &= 0xFFFE;
|
||||
processButton(list);
|
||||
processMouseClick = 1;
|
||||
}
|
||||
}
|
||||
} else if (_mousePressFlag) {
|
||||
processMouseClick = 1;
|
||||
}
|
||||
|
||||
if (processMouseClick) {
|
||||
if (list->buttonCallback) {
|
||||
if ((this->*(list->buttonCallback))(list)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (list->flags2 & 1) {
|
||||
list->flags2 &= 0xFFFE;
|
||||
processButton(list);
|
||||
}
|
||||
list = list->nextButton;
|
||||
continue;
|
||||
}
|
||||
|
||||
list = list->nextButton;
|
||||
}
|
||||
}
|
||||
|
||||
void KyraEngine::processButton(Button *button) {
|
||||
if (!button)
|
||||
return;
|
||||
|
||||
int processType = 0;
|
||||
uint8 *shape = 0;
|
||||
Button::ButtonCallback callback = 0;
|
||||
|
||||
int flags = (button->flags2 & 5);
|
||||
if (flags == 1) {
|
||||
processType = button->process2;
|
||||
if (processType == 1) {
|
||||
shape = button->process2PtrShape;
|
||||
} else if (processType == 4) {
|
||||
callback = button->process2PtrCallback;
|
||||
}
|
||||
} else if (flags == 4 || flags == 5) {
|
||||
processType = button->process1;
|
||||
if (processType == 1) {
|
||||
shape = button->process1PtrShape;
|
||||
} else if (processType == 4) {
|
||||
callback = button->process1PtrCallback;
|
||||
}
|
||||
} else {
|
||||
processType = button->process0;
|
||||
if (processType == 1) {
|
||||
shape = button->process0PtrShape;
|
||||
} else if (processType == 4) {
|
||||
callback = button->process0PtrCallback;
|
||||
}
|
||||
}
|
||||
|
||||
int x = button->x;
|
||||
int y = button->y;
|
||||
assert(button->dimTableIndex < _screen->_screenDimTableCount);
|
||||
if (x < 0) {
|
||||
x += _screen->_screenDimTable[button->dimTableIndex].w << 3;
|
||||
}
|
||||
|
||||
if (y < 0) {
|
||||
y += _screen->_screenDimTable[button->dimTableIndex].h;
|
||||
}
|
||||
|
||||
if (processType == 1 && shape) {
|
||||
_screen->drawShape(_screen->_curPage, shape, x, y, button->dimTableIndex, 0x10);
|
||||
} else if (processType == 4 && callback) {
|
||||
(this->*callback)(button);
|
||||
}
|
||||
}
|
||||
|
||||
} // End of namespace Kyra
|
||||
|
|
60
kyra/kyra.h
60
kyra/kyra.h
|
@ -152,6 +152,34 @@ struct Timer {
|
|||
void (KyraEngine::*func)(int timerNum);
|
||||
};
|
||||
|
||||
struct Button {
|
||||
Button *nextButton;
|
||||
uint16 specialValue;
|
||||
// uint8 unk[4];
|
||||
uint8 process0;
|
||||
uint8 process1;
|
||||
uint8 process2;
|
||||
// uint8 unk
|
||||
uint16 flags;
|
||||
typedef int (KyraEngine::*ButtonCallback)(Button*);
|
||||
// using 6 pointers instead of 3 as in the orignal here (safer for use with classes)
|
||||
uint8 *process0PtrShape;
|
||||
uint8 *process1PtrShape;
|
||||
uint8 *process2PtrShape;
|
||||
ButtonCallback process0PtrCallback;
|
||||
ButtonCallback process1PtrCallback;
|
||||
ButtonCallback process2PtrCallback;
|
||||
uint16 dimTableIndex;
|
||||
uint16 x;
|
||||
uint16 y;
|
||||
uint16 width;
|
||||
uint16 height;
|
||||
// uint8 unk[8];
|
||||
uint32 flags2;
|
||||
ButtonCallback buttonCallback;
|
||||
// uint8 unk[8];
|
||||
};
|
||||
|
||||
class KyraEngine : public Engine {
|
||||
friend class MusicPlayer;
|
||||
friend class Debugger;
|
||||
|
@ -225,6 +253,7 @@ public:
|
|||
void wsa_play(WSAMovieV1 *wsa, int frameNum, int x, int y, int pageNum);
|
||||
|
||||
void waitTicks(int ticks);
|
||||
void delayWithTicks(int ticks);
|
||||
void updateAllObjectShapes();
|
||||
void flagAllObjectsForRefresh();
|
||||
void animRefreshNPC(int character);
|
||||
|
@ -520,6 +549,7 @@ protected:
|
|||
void seq_introMalcolmTree();
|
||||
void seq_introKallakWriting();
|
||||
void seq_introKallakMalcolm();
|
||||
void seq_createAmuletJewel(int jewel, int page, int noSound, int drawOnly);
|
||||
|
||||
void wsa_processFrame(WSAMovieV1 *wsa, int frameNum, uint8 *dst);
|
||||
|
||||
|
@ -550,6 +580,8 @@ protected:
|
|||
void loadCharacterShapes();
|
||||
void loadSpecialEffectShapes();
|
||||
void loadItems();
|
||||
void loadButtonShapes();
|
||||
void initMainButtonList();
|
||||
void loadMainScreen();
|
||||
void setCharactersInDefaultScene();
|
||||
void resetBrandonPosionFlags();
|
||||
|
@ -567,6 +599,12 @@ protected:
|
|||
void timerFadeText(int timerNum);
|
||||
void drawAmulet();
|
||||
void setTextFadeTimerCountdown(int16 countdown);
|
||||
|
||||
int buttonInventoryCallback(Button *caller);
|
||||
Button *initButton(Button *list, Button *newButton);
|
||||
void processButtonList(Button *list);
|
||||
void processButton(Button *button);
|
||||
|
||||
uint8 _game;
|
||||
bool _fastMode;
|
||||
bool _quitFlag;
|
||||
|
@ -574,6 +612,7 @@ protected:
|
|||
bool _abortIntroFlag;
|
||||
bool _abortWalkFlag;
|
||||
bool _abortWalkFlag2;
|
||||
bool _mousePressFlag;
|
||||
char _talkBuffer[300];
|
||||
char _talkSubstrings[TALK_SUBSTRING_LEN * TALK_SUBSTRING_NUM];
|
||||
TalkCoords _talkCoords;
|
||||
|
@ -592,7 +631,9 @@ protected:
|
|||
int _mouseState;
|
||||
bool _handleInput;
|
||||
bool _updateScreen;
|
||||
bool _changedScene;
|
||||
int _unkScreenVar1, _unkScreenVar2, _unkScreenVar3;
|
||||
int _noDrawShapesFlag;
|
||||
|
||||
WSAMovieV1 *_wsaObjects[10];
|
||||
uint16 _entranceMouseCursorTracks[8];
|
||||
|
@ -610,6 +651,7 @@ protected:
|
|||
uint8 _idolGemsTable[3];
|
||||
|
||||
int16 _marbleVaseItem;
|
||||
int16 _foyerItemTable[3];
|
||||
|
||||
uint16 _brandonStatusBit;
|
||||
uint8 _unkBrandonPoisonFlags[256]; // this seem not to be posion flags, it is used for drawing once
|
||||
|
@ -680,6 +722,15 @@ protected:
|
|||
|
||||
Character *_characterList;
|
||||
|
||||
Button *_buttonList;
|
||||
|
||||
uint8 *_buttonShape0;
|
||||
uint8 *_buttonShape1;
|
||||
uint8 *_buttonShape2;
|
||||
uint8 *_buttonShape3;
|
||||
uint8 *_buttonShape4;
|
||||
uint8 *_buttonShape5;
|
||||
|
||||
uint8 *_seq_Forest;
|
||||
uint8 *_seq_KallakWriting;
|
||||
uint8 *_seq_KyrandiaLogo;
|
||||
|
@ -739,8 +790,11 @@ protected:
|
|||
static const int8 _addYPosTable[];
|
||||
|
||||
// positions of the inventory
|
||||
static const int16 _itemPosX[];
|
||||
static const int8 _itemPosY[];
|
||||
static const uint16 _itemPosX[];
|
||||
static const uint8 _itemPosY[];
|
||||
|
||||
static Button _buttonData[];
|
||||
static Button *_buttonDataListPtr[];
|
||||
|
||||
static const uint8 _magicMouseItemStartFrame[];
|
||||
static const uint8 _magicMouseItemEndFrame[];
|
||||
|
@ -749,6 +803,8 @@ protected:
|
|||
|
||||
static const uint16 _amuletX[];
|
||||
static const uint16 _amuletY[];
|
||||
static const uint16 _amuletX2[];
|
||||
static const uint16 _amuletY2[];
|
||||
};
|
||||
|
||||
} // End of namespace Kyra
|
||||
|
|
|
@ -138,6 +138,8 @@ public:
|
|||
uint8 *_currentPalette;
|
||||
uint8 *_shapePages[2];
|
||||
|
||||
static const ScreenDim _screenDimTable[];
|
||||
static const int _screenDimTableCount;
|
||||
private:
|
||||
int16 encodeShapeAndCalculateSize(uint8 *from, uint8 *to, int size);
|
||||
void restoreMouseRect();
|
||||
|
@ -160,9 +162,6 @@ private:
|
|||
|
||||
OSystem *_system;
|
||||
KyraEngine *_vm;
|
||||
|
||||
static const ScreenDim _screenDimTable[];
|
||||
static const int _screenDimTableCount;
|
||||
};
|
||||
|
||||
} // End of namespace Kyra
|
||||
|
|
|
@ -402,6 +402,11 @@ int KyraEngine::cmd_walkPlayerToPoint(ScriptState *script) {
|
|||
if (reinitScript) {
|
||||
_scriptInterpreter->initScript(script, script->dataPtr);
|
||||
}
|
||||
|
||||
if (_sceneChangeState) {
|
||||
_sceneChangeState = 0;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -450,7 +455,7 @@ int KyraEngine::cmd_drawAnimShapeIntoScene(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_createMouseItem(ScriptState *script) {
|
||||
debug(3, "cmd_createMouseItem(0x%X) (%d)", stackPos(0));
|
||||
debug(3, "cmd_createMouseItem(0x%X) (%d)", script, stackPos(0));
|
||||
createMouseItem(stackPos(0));
|
||||
return 0;
|
||||
}
|
||||
|
@ -473,7 +478,7 @@ int KyraEngine::cmd_sceneAnimOff(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_getElapsedSeconds(ScriptState *script) {
|
||||
debug(3, "cmd_getElapsedSeconds(0x%X) ()");
|
||||
debug(3, "cmd_getElapsedSeconds(0x%X) ()", script);
|
||||
return _system->getMillis() / 1000;
|
||||
}
|
||||
|
||||
|
@ -531,25 +536,50 @@ int KyraEngine::cmd_phaseInSameScene(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_setScenePhasingFlag(ScriptState *script) {
|
||||
debug(3, "cmd_setScenePhasingFlag(0x%X) ()");
|
||||
debug(3, "cmd_setScenePhasingFlag(0x%X) ()", script);
|
||||
_scenePhasingFlag = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_resetScenePhasingFlag(ScriptState *script) {
|
||||
debug(3, "cmd_resetScenePhasingFlag(0x%X) ()");
|
||||
debug(3, "cmd_resetScenePhasingFlag(0x%X) ()", script);
|
||||
_scenePhasingFlag = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_queryScenePhasingFlag(ScriptState *script) {
|
||||
debug(3, "cmd_queryScenePhasingFlag(0x%X) ()");
|
||||
debug(3, "cmd_queryScenePhasingFlag(0x%X) ()", script);
|
||||
return _scenePhasingFlag;
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_sceneToDirection(ScriptState *script) {
|
||||
warning("STUB: cmd_sceneToDirection");
|
||||
return 0;
|
||||
debug(3, "cmd_sceneToDirection(0x%X) (%d, %d)", script, stackPos(0), stackPos(1));
|
||||
assert(stackPos(0) < _roomTableSize);
|
||||
Room *curRoom = &_roomTable[stackPos(0)];
|
||||
uint16 returnValue = 0xFFFF;
|
||||
switch (stackPos(1)) {
|
||||
case 0:
|
||||
returnValue = curRoom->northExit;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
returnValue = curRoom->eastExit;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
returnValue = curRoom->southExit;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
returnValue = curRoom->westExit;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (returnValue == 0xFFFF)
|
||||
return -1;
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_setBirthstoneGem(ScriptState *script) {
|
||||
|
@ -943,19 +973,21 @@ int KyraEngine::cmd_displayWSASequentialFrames(ScriptState *script) {
|
|||
while (_system->getMillis() < continueTime) {
|
||||
_sprites->updateSceneAnims();
|
||||
updateAllObjectShapes();
|
||||
if (continueTime - _system->getMillis() >= 10)
|
||||
delay(10);
|
||||
}
|
||||
++frame;
|
||||
}
|
||||
} else {
|
||||
int frame = endFrame;
|
||||
while (startFrame <= frame) {
|
||||
int frame = startFrame;
|
||||
while (endFrame <= frame) {
|
||||
wsa_play(_wsaObjects[wsaIndex], frame, xpos, ypos, 0);
|
||||
_updateScreen = true;
|
||||
uint32 continueTime = waitTime * _tickLength + _system->getMillis();
|
||||
while (_system->getMillis() < continueTime) {
|
||||
_sprites->updateSceneAnims();
|
||||
updateAllObjectShapes();
|
||||
if (continueTime - _system->getMillis() >= 10)
|
||||
delay(10);
|
||||
}
|
||||
--frame;
|
||||
|
@ -1008,18 +1040,18 @@ int KyraEngine::cmd_changeCharactersXAndY(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_clearSceneAnimatorBeacon(ScriptState *script) {
|
||||
debug(3, "cmd_clearSceneAnimatorBeacon(0x%X) ()");
|
||||
debug(3, "cmd_clearSceneAnimatorBeacon(0x%X) ()", script);
|
||||
_sprites->_sceneAnimatorBeaconFlag = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_querySceneAnimatorBeacon(ScriptState *script) {
|
||||
debug(3, "cmd_querySceneAnimatorBeacon(0x%X) ()");
|
||||
debug(3, "cmd_querySceneAnimatorBeacon(0x%X) ()", script);
|
||||
return _sprites->_sceneAnimatorBeaconFlag;
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_refreshSceneAnimator(ScriptState *script) {
|
||||
debug(3, "cmd_refreshSceneAnimator(0x%X) ()");
|
||||
debug(3, "cmd_refreshSceneAnimator(0x%X) ()", script);
|
||||
_sprites->updateSceneAnims();
|
||||
updateAllObjectShapes();
|
||||
return 0;
|
||||
|
@ -1071,7 +1103,7 @@ int KyraEngine::cmd_placeCharacterInOtherScene(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_getKey(ScriptState *script) {
|
||||
debug(3, "cmd_getKey(0x%X) ()");
|
||||
debug(3, "cmd_getKey(0x%X) ()", script);
|
||||
waitForEvent();
|
||||
return 0;
|
||||
}
|
||||
|
@ -1314,12 +1346,83 @@ int KyraEngine::cmd_dispelMagicAnimation(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_findBrightestFireberry(ScriptState *script) {
|
||||
warning("STUB: cmd_findBrightestFireberry");
|
||||
return 0;
|
||||
debug(3, "cmd_findBrightestFireberry(0x%X) ()", script);
|
||||
if (_currentCharacter->sceneId >= 187 && _currentCharacter->sceneId <= 198) {
|
||||
return 29;
|
||||
}
|
||||
if (_currentCharacter->sceneId == 133 || _currentCharacter->sceneId == 137 ||
|
||||
_currentCharacter->sceneId == 165 || _currentCharacter->sceneId == 173) {
|
||||
return 29;
|
||||
}
|
||||
if (_itemInHand == 28)
|
||||
return 28;
|
||||
int brightestFireberry = 107;
|
||||
if (_itemInHand >= 29 && _itemInHand <= 33)
|
||||
brightestFireberry = _itemInHand;
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
uint8 item = _currentCharacter->inventoryItems[i];
|
||||
if (item == 0xFF)
|
||||
continue;
|
||||
if (item == 28)
|
||||
return 28;
|
||||
if (item >= 29 && item <= 33) {
|
||||
if (item < brightestFireberry)
|
||||
brightestFireberry = item;
|
||||
}
|
||||
}
|
||||
assert(_currentCharacter->sceneId < _roomTableSize);
|
||||
Room *curRoom = &_roomTable[_currentCharacter->sceneId];
|
||||
for (int i = 0; i < 12; ++i) {
|
||||
uint8 item = curRoom->itemsTable[i];
|
||||
if (item == 0xFF)
|
||||
continue;
|
||||
if (item == 28)
|
||||
return 28;
|
||||
if (item >= 29 && item <= 33) {
|
||||
if (item < brightestFireberry)
|
||||
brightestFireberry = item;
|
||||
}
|
||||
}
|
||||
if (brightestFireberry == 107)
|
||||
return -1;
|
||||
return brightestFireberry;
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_setFireberryGlowPalette(ScriptState *script) {
|
||||
warning("STUB: cmd_setFireberryGlowPalette");
|
||||
debug(3, "cmd_setFireberryGlowPalette(0x%X) (%d)", script, stackPos(0));
|
||||
int palIndex = 0;
|
||||
switch (stackPos(0)) {
|
||||
case 0x1E:
|
||||
palIndex = 9;
|
||||
break;
|
||||
|
||||
case 0x1F:
|
||||
palIndex = 10;
|
||||
break;
|
||||
|
||||
case 0x20:
|
||||
palIndex = 11;
|
||||
break;
|
||||
|
||||
case 0x21:
|
||||
case -1:
|
||||
palIndex = 12;
|
||||
break;
|
||||
|
||||
default:
|
||||
palIndex = 8;
|
||||
break;
|
||||
}
|
||||
if (_brandonStatusBit & 2) {
|
||||
if (_currentCharacter->sceneId != 133 && _currentCharacter->sceneId != 137 &&
|
||||
_currentCharacter->sceneId != 165 && _currentCharacter->sceneId != 173 &&
|
||||
(_currentCharacter->sceneId < 187 || _currentCharacter->sceneId > 198)) {
|
||||
palIndex = 14;
|
||||
}
|
||||
}
|
||||
uint8 *palette = _specialPalettes[palIndex];
|
||||
memcpy(&_screen->_currentPalette[684], palette, 44);
|
||||
_screen->setScreenPalette(_screen->_currentPalette);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1373,7 +1476,26 @@ int KyraEngine::cmd_makeAmuletAppear(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_drawItemShapeIntoScene(ScriptState *script) {
|
||||
warning("STUB: cmd_drawItemShapeIntoScene");
|
||||
debug(3, "cmd_drawItemShapeIntoScene(0x%X) (%d, %d, %d, %d, %d)", script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
|
||||
int item = stackPos(0);
|
||||
int x = stackPos(1);
|
||||
int y = stackPos(2);
|
||||
int flags = stackPos(3);
|
||||
int onlyHidPage = stackPos(4);
|
||||
if (flags)
|
||||
flags = 1;
|
||||
if (onlyHidPage) {
|
||||
_screen->drawShape(2, _shapes[220+item], x, y, 0, flags);
|
||||
} else {
|
||||
_screen->hideMouse();
|
||||
restoreAllObjectBackgrounds();
|
||||
_screen->drawShape(2, _shapes[220+item], x, y, 0, flags);
|
||||
_screen->drawShape(0, _shapes[220+item], x, y, 0, flags);
|
||||
flagAllObjectsForBkgdChange();
|
||||
flagAllObjectsForRefresh();
|
||||
updateAllObjectShapes();
|
||||
_screen->showMouse();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1384,7 +1506,25 @@ int KyraEngine::cmd_setCharactersCurrentFrame(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_waitForConfirmationMouseClick(ScriptState *script) {
|
||||
warning("STUB: cmd_waitForConfirmationMouseClick");
|
||||
debug(3, "cmd_waitForConfirmationMouseClick(0x%X) ()", script);
|
||||
// if (mouseEnabled) {
|
||||
while (!_mousePressFlag) {
|
||||
updateMousePointer();
|
||||
_sprites->updateSceneAnims();
|
||||
updateAllObjectShapes();
|
||||
delay(10);
|
||||
}
|
||||
|
||||
while (_mousePressFlag) {
|
||||
updateMousePointer();
|
||||
_sprites->updateSceneAnims();
|
||||
updateAllObjectShapes();
|
||||
delay(10);
|
||||
}
|
||||
// }
|
||||
// XXX processButtonList calls
|
||||
script->variables[1] = _mouseX;
|
||||
script->variables[2] = _mouseY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1426,7 +1566,8 @@ int KyraEngine::cmd_shakeScreen(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_createAmuletJewel(ScriptState *script) {
|
||||
warning("STUB: cmd_createAmuletJewel");
|
||||
debug(3, "cmd_createAmuletJewel(0x%X) (%d)", script, stackPos(0));
|
||||
seq_createAmuletJewel(stackPos(0), 0, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1448,8 +1589,8 @@ int KyraEngine::cmd_fillFlaskWithWater(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_getCharactersMovementDelay(ScriptState *script) {
|
||||
warning("STUB: cmd_getCharactersMovementDelay");
|
||||
return 0;
|
||||
debug(3, "cmd_getCharactersMovementDelay(0x%X) (%d)", script, stackPos(0));
|
||||
return getTimerDelay(stackPos(0)+5);
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_getBirthstoneGem(ScriptState *script) {
|
||||
|
@ -1526,7 +1667,8 @@ int KyraEngine::cmd_itemAppearsOnGround(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_setNoDrawShapesFlag(ScriptState *script) {
|
||||
warning("STUB: cmd_setNoDrawShapesFlag");
|
||||
debug(3, "cmd_setNoDrawShapesFlag(0x%X) (%d)", script, stackPos(0));
|
||||
_noDrawShapesFlag = stackPos(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1608,18 +1750,21 @@ int KyraEngine::cmd_message(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_checkClickOnNPC(ScriptState *script) {
|
||||
warning("STUB: cmd_checkClickOnNPC");
|
||||
return 0;
|
||||
debug(3, "cmd_checkClickOnNPC(0x%X) (%d, %d)", script, stackPos(0), stackPos(1));
|
||||
return checkForNPCScriptRun(stackPos(0), stackPos(1));
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_getFoyerItem(ScriptState *script) {
|
||||
warning("STUB: cmd_getFoyerItem");
|
||||
return 0;
|
||||
debug(3, "cmd_getFoyerItem(0x%X) (%d)", stackPos(0));
|
||||
assert(stackPos(0) < ARRAYSIZE(_foyerItemTable));
|
||||
return _foyerItemTable[stackPos(0)];
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_setFoyerItem(ScriptState *script) {
|
||||
warning("STUB: cmd_setFoyerItem");
|
||||
return 0;
|
||||
debug(3, "cmd_setFoyerItem(0x%X) (%d, %d)", stackPos(0), stackPos(1));
|
||||
assert(stackPos(0) < ARRAYSIZE(_foyerItemTable));
|
||||
_foyerItemTable[stackPos(0)] = stackPos(1);
|
||||
return stackPos(1);
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_setNoItemDropRegion(ScriptState *script) {
|
||||
|
@ -1634,8 +1779,8 @@ int KyraEngine::cmd_walkMalcolmOn(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_passiveProtection(ScriptState *script) {
|
||||
warning("STUB: cmd_passiveProtection");
|
||||
return 0;
|
||||
debug(3, "cmd_passiveProtection(0x%X) ()", script);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int KyraEngine::cmd_setPlayingLoop(ScriptState *script) {
|
||||
|
@ -1675,7 +1820,11 @@ int KyraEngine::cmd_setPaletteChangeFlag(ScriptState *script) {
|
|||
}
|
||||
|
||||
int KyraEngine::cmd_fillRect(ScriptState *script) {
|
||||
warning("STUB: cmd_fillRect");
|
||||
debug(3, "cmd_fillRect(0x%X) (%d, %d, %d, %d, %d, 0x%X)", script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
|
||||
int videoPageBackup = _screen->_curPage;
|
||||
_screen->_curPage = stackPos(0);
|
||||
_screen->fillRect(stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
|
||||
_screen->_curPage = videoPageBackup;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -149,16 +149,16 @@ void Sprites::updateSceneAnims() {
|
|||
switch (READ_LE_UINT16(data)) {
|
||||
case 0xFF88:
|
||||
data += 2;
|
||||
debug(5, "func: Set sprite image.");
|
||||
debug(5, "Sprite index %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Set sprite image.");
|
||||
debug(6, "Sprite index %i", READ_LE_UINT16(data));
|
||||
_anims[i].sprite = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
//debug(5, "Unused %i", READ_LE_UINT16(data));
|
||||
//debug(6, "Unused %i", READ_LE_UINT16(data));
|
||||
data += 2;
|
||||
debug(5, "X %i", READ_LE_UINT16(data));
|
||||
debug(6, "X %i", READ_LE_UINT16(data));
|
||||
_anims[i].x = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
debug(5, "Y %i", READ_LE_UINT16(data));
|
||||
debug(6, "Y %i", READ_LE_UINT16(data));
|
||||
_anims[i].y = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
_anims[i].flipX = false;
|
||||
|
@ -166,16 +166,16 @@ void Sprites::updateSceneAnims() {
|
|||
break;
|
||||
case 0xFF8D:
|
||||
data += 2;
|
||||
debug(5, "func: Set sprite image, flipped.");
|
||||
debug(5, "Sprite index %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Set sprite image, flipped.");
|
||||
debug(6, "Sprite index %i", READ_LE_UINT16(data));
|
||||
_anims[i].sprite = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
//debug(9, "Unused %i", READ_LE_UINT16(data));
|
||||
data += 2;
|
||||
debug(5, "X %i", READ_LE_UINT16(data));
|
||||
debug(6, "X %i", READ_LE_UINT16(data));
|
||||
_anims[i].x = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
debug(5, "Y %i", READ_LE_UINT16(data));
|
||||
debug(6, "Y %i", READ_LE_UINT16(data));
|
||||
_anims[i].y = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
_anims[i].flipX = true;
|
||||
|
@ -183,24 +183,24 @@ void Sprites::updateSceneAnims() {
|
|||
break;
|
||||
case 0xFF8A:
|
||||
data += 2;
|
||||
debug(5, "func: Set time to wait");
|
||||
debug(5, "Time %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Set time to wait");
|
||||
debug(6, "Time %i", READ_LE_UINT16(data));
|
||||
_anims[i].nextRun = _system->getMillis() + READ_LE_UINT16(data) * _animDelay;
|
||||
data += 2;
|
||||
break;
|
||||
case 0xFFB3:
|
||||
data += 2;
|
||||
debug(5, "func: Set time to wait to random value");
|
||||
debug(6, "func: Set time to wait to random value");
|
||||
rndNr = READ_LE_UINT16(data) + _rnd.getRandomNumber( READ_LE_UINT16(data) + 2);
|
||||
debug(5, "Minimum time %i", READ_LE_UINT16(data));
|
||||
debug(6, "Minimum time %i", READ_LE_UINT16(data));
|
||||
data += 2;
|
||||
debug(5, "Maximum time %i", READ_LE_UINT16(data));
|
||||
debug(6, "Maximum time %i", READ_LE_UINT16(data));
|
||||
data += 2;
|
||||
_anims[i].nextRun = _system->getMillis() + rndNr * _animDelay;
|
||||
break;
|
||||
case 0xFF8C:
|
||||
data += 2;
|
||||
debug(5, "func: Wait until wait time has elapsed");
|
||||
debug(6, "func: Wait until wait time has elapsed");
|
||||
_anims[i].reentry = data;
|
||||
endLoop = true;
|
||||
//assert( _anims[i].nextRun > _system->getMillis());
|
||||
|
@ -217,35 +217,35 @@ void Sprites::updateSceneAnims() {
|
|||
break;
|
||||
case 0xFF97:
|
||||
data += 2;
|
||||
debug(5, "func: Set default X coordinate of sprite");
|
||||
debug(5, "X %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Set default X coordinate of sprite");
|
||||
debug(6, "X %i", READ_LE_UINT16(data));
|
||||
_anims[i].x = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
break;
|
||||
case 0xFF98:
|
||||
data += 2;
|
||||
debug(5, "func: Set default Y coordinate of sprite");
|
||||
debug(5, "Y %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Set default Y coordinate of sprite");
|
||||
debug(6, "Y %i", READ_LE_UINT16(data));
|
||||
_anims[i].y = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
break;
|
||||
case 0xFF8B:
|
||||
debug(5, "func: Jump to start of script section");
|
||||
debug(6, "func: Jump to start of script section");
|
||||
//data = scriptStart;
|
||||
_anims[i].nextRun = _system->getMillis();
|
||||
endLoop = true;
|
||||
break;
|
||||
case 0xFF8E:
|
||||
data += 2;
|
||||
debug(5, "func: Begin for () loop");
|
||||
debug(5, "Iterations: %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Begin for () loop");
|
||||
debug(6, "Iterations: %i", READ_LE_UINT16(data));
|
||||
_anims[i].loopsLeft = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
_anims[i].loopStart = data;
|
||||
break;
|
||||
case 0xFF8F:
|
||||
data += 2;
|
||||
debug(5, "func: End for () loop");
|
||||
debug(6, "func: End for () loop");
|
||||
if (_anims[i].loopsLeft > 0) {
|
||||
_anims[i].loopsLeft--;
|
||||
data = _anims[i].loopStart;
|
||||
|
@ -253,8 +253,8 @@ void Sprites::updateSceneAnims() {
|
|||
break;
|
||||
case 0xFF90:
|
||||
data += 2;
|
||||
debug(5, "func: Set sprite image using default X and Y");
|
||||
debug(5, "Sprite index %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Set sprite image using default X and Y");
|
||||
debug(6, "Sprite index %i", READ_LE_UINT16(data));
|
||||
_anims[i].sprite = READ_LE_UINT16(data);
|
||||
_anims[i].flipX = false;
|
||||
data += 2;
|
||||
|
@ -262,8 +262,8 @@ void Sprites::updateSceneAnims() {
|
|||
break;
|
||||
case 0xFF91:
|
||||
data += 2;
|
||||
debug(5, "func: Set sprite image using default X and Y, flipped.");
|
||||
debug(5, "Sprite index %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Set sprite image using default X and Y, flipped.");
|
||||
debug(6, "Sprite index %i", READ_LE_UINT16(data));
|
||||
_anims[i].sprite = READ_LE_UINT16(data);
|
||||
_anims[i].flipX = true;
|
||||
data += 2;
|
||||
|
@ -271,29 +271,29 @@ void Sprites::updateSceneAnims() {
|
|||
break;
|
||||
case 0xFF92:
|
||||
data += 2;
|
||||
debug(5, "func: Increase value of default X-coordinate");
|
||||
debug(5, "Increment %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Increase value of default X-coordinate");
|
||||
debug(6, "Increment %i", READ_LE_UINT16(data));
|
||||
_anims[i].x += READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
break;
|
||||
case 0xFF93:
|
||||
data += 2;
|
||||
debug(5, "func: Increase value of default Y-coordinate");
|
||||
debug(5, "Increment %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Increase value of default Y-coordinate");
|
||||
debug(6, "Increment %i", READ_LE_UINT16(data));
|
||||
_anims[i].y += READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
break;
|
||||
case 0xFF94:
|
||||
data += 2;
|
||||
debug(5, "func: Decrease value of default X-coordinate");
|
||||
debug(5, "Decrement %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Decrease value of default X-coordinate");
|
||||
debug(6, "Decrement %i", READ_LE_UINT16(data));
|
||||
_anims[i].x -= READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
break;
|
||||
case 0xFF95:
|
||||
data += 2;
|
||||
debug(5, "func: Decrease value of default Y-coordinate");
|
||||
debug(5, "Decrement %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Decrease value of default Y-coordinate");
|
||||
debug(6, "Decrement %i", READ_LE_UINT16(data));
|
||||
_anims[i].y -= READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
break;
|
||||
|
@ -312,22 +312,22 @@ void Sprites::updateSceneAnims() {
|
|||
break;*/
|
||||
case 0xFFAD:
|
||||
data += 2;
|
||||
debug(5, "func: Set Brandon's X coordinate");
|
||||
debug(5, "X %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Set Brandon's X coordinate");
|
||||
debug(6, "X %i", READ_LE_UINT16(data));
|
||||
_engine->_currentCharacter->x1 = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
break;
|
||||
case 0xFFAE:
|
||||
data += 2;
|
||||
debug(5, "func: Set Brandon's Y coordinate");
|
||||
debug(5, "Y %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Set Brandon's Y coordinate");
|
||||
debug(6, "Y %i", READ_LE_UINT16(data));
|
||||
_engine->_currentCharacter->y1 = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
break;
|
||||
case 0xFFAF:
|
||||
data += 2;
|
||||
debug(5, "func: Set Brandon's sprite");
|
||||
debug(5, "Sprite %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Set Brandon's sprite");
|
||||
debug(6, "Sprite %i", READ_LE_UINT16(data));
|
||||
_engine->_currentCharacter->currentAnimFrame = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
break;
|
||||
|
@ -337,15 +337,15 @@ void Sprites::updateSceneAnims() {
|
|||
break;
|
||||
case 0xFFAB:
|
||||
data += 2;
|
||||
debug(5, "func: Update Brandon's sprite");
|
||||
debug(6, "func: Update Brandon's sprite");
|
||||
_engine->animRefreshNPC(0);
|
||||
_engine->flagAllObjectsForRefresh();
|
||||
_engine->updateAllObjectShapes();
|
||||
break;
|
||||
case 0xFFB0:
|
||||
data += 2;
|
||||
debug(5, "func: Play sound");
|
||||
debug(5, "Sound index %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Play sound");
|
||||
debug(6, "Sound index %i", READ_LE_UINT16(data));
|
||||
//_engine->snd_playSoundEffect(READ_LE_UINT16(data));
|
||||
data += 2;
|
||||
break;
|
||||
|
@ -359,11 +359,11 @@ void Sprites::updateSceneAnims() {
|
|||
break;
|
||||
case 0xFFB4:
|
||||
data += 2;
|
||||
debug(5, "func: Play (at random) a certain sound at a certain percentage of time");
|
||||
debug(5, "Sound index %i", READ_LE_UINT16(data));
|
||||
debug(6, "func: Play (at random) a certain sound at a certain percentage of time");
|
||||
debug(6, "Sound index %i", READ_LE_UINT16(data));
|
||||
sound = READ_LE_UINT16(data);
|
||||
data += 2;
|
||||
debug(5, "Percentage %i", READ_LE_UINT16(data));
|
||||
debug(6, "Percentage %i", READ_LE_UINT16(data));
|
||||
rndNr = _rnd.getRandomNumber(100);
|
||||
//if (rndNr <= READ_LE_UINT16(data))
|
||||
//_engine->snd_playSoundEffect(sound);
|
||||
|
|
|
@ -653,14 +653,50 @@ const int8 KyraEngine::_addYPosTable[] = {
|
|||
0, -2, -2, -2, 0, 2, 2, 2
|
||||
};
|
||||
|
||||
const int16 KyraEngine::_itemPosX[] = {
|
||||
const uint16 KyraEngine::_itemPosX[] = {
|
||||
95, 115, 135, 155, 175, 95, 115, 135, 155, 175
|
||||
};
|
||||
|
||||
const int8 KyraEngine::_itemPosY[] = {
|
||||
const uint8 KyraEngine::_itemPosY[] = {
|
||||
160, 160, 160, 160, 160, 181, 181, 181, 181, 181
|
||||
};
|
||||
|
||||
Button KyraEngine::_buttonData[] = {
|
||||
{ 0, 0x02, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x05D, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
|
||||
{ 0, 0x01, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x009, 0xA4, 0x36, 0x1E, /*XXX,*/ 0, 0/*opt_handleMenu, XXX*/ },
|
||||
{ 0, 0x03, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x071, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
|
||||
{ 0, 0x04, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x085, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
|
||||
{ 0, 0x05, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x099, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
|
||||
{ 0, 0x06, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x0AD, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
|
||||
{ 0, 0x07, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x05D, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
|
||||
{ 0, 0x08, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x071, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
|
||||
{ 0, 0x09, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x085, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
|
||||
{ 0, 0x0A, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x099, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
|
||||
{ 0, 0x0B, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x0AD, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine::buttonInventoryCallback/*, XXX*/ },
|
||||
{ 0, 0x15, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0FD, 0x9C, 0x1A, 0x12, /*XXX,*/ 0, 0/*buttonAmuletCallback, XXX*/ },
|
||||
{ 0, 0x16, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0E7, 0xAA, 0x1A, 0x12, /*XXX,*/ 0, 0/*buttonAmuletCallback, XXX*/ },
|
||||
{ 0, 0x17, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0FD, 0xB5, 0x1A, 0x12, /*XXX,*/ 0, 0/*buttonAmuletCallback, XXX*/ },
|
||||
{ 0, 0x18, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x113, 0xAA, 0x1A, 0x12, /*XXX,*/ 0, 0/*buttonAmuletCallback, XXX*/ }
|
||||
};
|
||||
|
||||
Button *KyraEngine::_buttonDataListPtr[] = {
|
||||
&_buttonData[1],
|
||||
&_buttonData[2],
|
||||
&_buttonData[3],
|
||||
&_buttonData[4],
|
||||
&_buttonData[5],
|
||||
&_buttonData[6],
|
||||
&_buttonData[7],
|
||||
&_buttonData[8],
|
||||
&_buttonData[9],
|
||||
&_buttonData[10],
|
||||
&_buttonData[11],
|
||||
&_buttonData[12],
|
||||
&_buttonData[13],
|
||||
&_buttonData[14],
|
||||
0
|
||||
};
|
||||
|
||||
const uint8 KyraEngine::_magicMouseItemStartFrame[] = {
|
||||
0xAD, 0xB7, 0xBE, 0x00
|
||||
};
|
||||
|
@ -679,4 +715,7 @@ const uint8 KyraEngine::_magicMouseItemEndFrame2[] = {
|
|||
|
||||
const uint16 KyraEngine::_amuletX[] = { 231, 275, 253, 253 };
|
||||
const uint16 KyraEngine::_amuletY[] = { 170, 170, 159, 181 };
|
||||
|
||||
const uint16 KyraEngine::_amuletX2[] = { 0x000, 0x0FD, 0x0E7, 0x0FD, 0x113, 0x000 };
|
||||
const uint16 KyraEngine::_amuletY2[] = { 0x000, 0x09F, 0x0AA, 0x0B5, 0x0AA, 0x000 };
|
||||
} // End of namespace Kyra
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue