LAB: Move doActions() to LabEngine class

This commit is contained in:
Eugene Sandulenko 2015-12-03 11:33:22 +01:00 committed by Willem Jan Palenstijn
parent 4424463f06
commit 3b40199ab6
2 changed files with 120 additions and 118 deletions

View file

@ -131,8 +131,6 @@ private:
bool _lastMessageLong; bool _lastMessageLong;
bool _lastTooLong; bool _lastTooLong;
TextFont *_msgFont; TextFont *_msgFont;
public:
bool _longWinInFront; bool _longWinInFront;
CloseDataPtr _cptr; CloseDataPtr _cptr;
@ -203,6 +201,10 @@ private:
void mayShowCrumbIndicator(); void mayShowCrumbIndicator();
void mayShowCrumbIndicatorOff(); void mayShowCrumbIndicatorOff();
const char *getInvName(uint16 curInv); const char *getInvName(uint16 curInv);
public:
void doActions(Action *aPtr, CloseDataPtr *lcptr);
}; };
extern LabEngine *g_lab; extern LabEngine *g_lab;

View file

@ -321,92 +321,92 @@ bool takeItem(uint16 x, uint16 y, CloseDataPtr *cptr) {
/*****************************************************************************/ /*****************************************************************************/
/* Processes the action list. */ /* Processes the action list. */
/*****************************************************************************/ /*****************************************************************************/
static void doActions(Action *APtr, CloseDataPtr *lcptr) { void LabEngine::doActions(Action *aptr, CloseDataPtr *lcptr) {
CloseDataPtr tlcptr; CloseDataPtr tlcptr;
bool FirstLoaded = true; bool firstLoaded = true;
char **str, *Test; char **str;
uint32 StartSecs, StartMicros, CurSecs, CurMicros; uint32 startSecs, startMicros, curSecs, curMicros;
while (APtr) { while (aptr) {
g_lab->_music->updateMusic(); _music->updateMusic();
switch (APtr->ActionType) { switch (aptr->ActionType) {
case PLAYSOUND: case PLAYSOUND:
g_lab->_music->_loopSoundEffect = false; _music->_loopSoundEffect = false;
g_lab->_music->_waitTillFinished = true; _music->_waitTillFinished = true;
readMusic((char *)APtr->Data, true); readMusic((char *)aptr->Data, true);
g_lab->_music->_waitTillFinished = false; _music->_waitTillFinished = false;
break; break;
case PLAYSOUNDB: case PLAYSOUNDB:
g_lab->_music->_loopSoundEffect = false; _music->_loopSoundEffect = false;
g_lab->_music->_waitTillFinished = false; _music->_waitTillFinished = false;
readMusic((char *)APtr->Data, false); readMusic((char *)aptr->Data, false);
break; break;
case PLAYSOUNDCONT: case PLAYSOUNDCONT:
g_lab->_music->_doNotFilestopSoundEffect = true; _music->_doNotFilestopSoundEffect = true;
g_lab->_music->_loopSoundEffect = true; _music->_loopSoundEffect = true;
readMusic((char *)APtr->Data, g_lab->_music->_waitTillFinished); readMusic((char *)aptr->Data, _music->_waitTillFinished);
break; break;
case SHOWDIFF: case SHOWDIFF:
readPict((char *)APtr->Data, true); readPict((char *)aptr->Data, true);
break; break;
case SHOWDIFFCONT: case SHOWDIFFCONT:
readPict((char *)APtr->Data, false); readPict((char *)aptr->Data, false);
break; break;
case LOADDIFF: case LOADDIFF:
if (FirstLoaded) { if (firstLoaded) {
resetBuffer(); resetBuffer();
FirstLoaded = false; firstLoaded = false;
} }
if (APtr->Data) if (aptr->Data)
g_lab->_music->newOpen((char *)APtr->Data); /* Puts a file into memory */ _music->newOpen((char *)aptr->Data); /* Puts a file into memory */
break; break;
case WIPECMD: case WIPECMD:
g_lab->doWipe(APtr->Param1, lcptr, (char *)APtr->Data); doWipe(aptr->Param1, lcptr, (char *)aptr->Data);
break; break;
case NOUPDATE: case NOUPDATE:
noupdatediff = true; noupdatediff = true;
g_lab->_anim->_doBlack = false; _anim->_doBlack = false;
break; break;
case FORCEUPDATE: case FORCEUPDATE:
g_lab->_curFileName = " "; _curFileName = " ";
break; break;
case SHOWCURPICT: case SHOWCURPICT: {
Test = getPictName(lcptr); char *test = getPictName(lcptr);
if (strcmp(Test, g_lab->_curFileName) != 0) { if (strcmp(test, _curFileName) != 0) {
g_lab->_curFileName = Test; _curFileName = test;
readPict(g_lab->_curFileName, true); readPict(_curFileName, true);
}
} }
break; break;
case SETELEMENT: case SETELEMENT:
g_lab->_conditions->inclElement(APtr->Param1); _conditions->inclElement(aptr->Param1);
break; break;
case UNSETELEMENT: case UNSETELEMENT:
g_lab->_conditions->exclElement(APtr->Param1); _conditions->exclElement(aptr->Param1);
break; break;
case SHOWMESSAGE: case SHOWMESSAGE:
DoNotDrawMessage = false; DoNotDrawMessage = false;
if (g_lab->_longWinInFront) if (_longWinInFront)
g_lab->longDrawMessage((char *)APtr->Data); longDrawMessage((char *)aptr->Data);
else else
g_lab->drawMessage((char *)APtr->Data); drawMessage((char *)aptr->Data);
DoNotDrawMessage = true; DoNotDrawMessage = true;
break; break;
@ -414,38 +414,38 @@ static void doActions(Action *APtr, CloseDataPtr *lcptr) {
case CSHOWMESSAGE: case CSHOWMESSAGE:
if (*lcptr == NULL) { if (*lcptr == NULL) {
DoNotDrawMessage = false; DoNotDrawMessage = false;
g_lab->drawMessage((char *)APtr->Data); drawMessage((char *)aptr->Data);
DoNotDrawMessage = true; DoNotDrawMessage = true;
} }
break; break;
case SHOWMESSAGES: case SHOWMESSAGES:
str = (char **)APtr->Data; str = (char **)aptr->Data;
DoNotDrawMessage = false; DoNotDrawMessage = false;
g_lab->drawMessage(str[getRandom(APtr->Param1)]); drawMessage(str[getRandom(aptr->Param1)]);
DoNotDrawMessage = true; DoNotDrawMessage = true;
break; break;
case SETPOSITION: case SETPOSITION:
if (APtr->Param1 & 0x8000) { if (aptr->Param1 & 0x8000) {
// This is a Wyrmkeep Windows trial version, thus stop at this // This is a Wyrmkeep Windows trial version, thus stop at this
// point, since we can't check for game payment status // point, since we can't check for game payment status
readPict(getPictName(lcptr), true); readPict(getPictName(lcptr), true);
APtr = NULL; aptr = NULL;
GUI::MessageDialog trialMessage("This is the end of the trial version. You can play the full game using the original interpreter from Wyrmkeep"); GUI::MessageDialog trialMessage("This is the end of the trial version. You can play the full game using the original interpreter from Wyrmkeep");
trialMessage.runModal(); trialMessage.runModal();
continue; continue;
} }
g_lab->_roomNum = APtr->Param1; _roomNum = aptr->Param1;
Direction = APtr->Param2 - 1; Direction = aptr->Param2 - 1;
*lcptr = NULL; *lcptr = NULL;
g_lab->_anim->_doBlack = true; _anim->_doBlack = true;
break; break;
case SETCLOSEUP: case SETCLOSEUP:
tlcptr = getObject(scaleX(APtr->Param1), scaleY(APtr->Param2), *lcptr); tlcptr = getObject(scaleX(aptr->Param1), scaleY(aptr->Param2), *lcptr);
if (tlcptr) if (tlcptr)
*lcptr = tlcptr; *lcptr = tlcptr;
@ -457,17 +457,17 @@ static void doActions(Action *APtr, CloseDataPtr *lcptr) {
break; break;
case SUBINV: case SUBINV:
if (Inventory[APtr->Param1].Many) if (Inventory[aptr->Param1].Many)
(Inventory[APtr->Param1].Many)--; (Inventory[aptr->Param1].Many)--;
if (Inventory[APtr->Param1].Many == 0) if (Inventory[aptr->Param1].Many == 0)
g_lab->_conditions->exclElement(APtr->Param1); _conditions->exclElement(aptr->Param1);
break; break;
case ADDINV: case ADDINV:
(Inventory[APtr->Param1].Many) += APtr->Param2; (Inventory[aptr->Param1].Many) += aptr->Param2;
g_lab->_conditions->inclElement(APtr->Param1); _conditions->inclElement(aptr->Param1);
break; break;
case SHOWDIR: case SHOWDIR:
@ -475,66 +475,66 @@ static void doActions(Action *APtr, CloseDataPtr *lcptr) {
break; break;
case WAITSECS: case WAITSECS:
g_lab->addCurTime(APtr->Param1, 0, &StartSecs, &StartMicros); addCurTime(aptr->Param1, 0, &startSecs, &startMicros);
g_lab->screenUpdate(); screenUpdate();
while (1) { while (1) {
g_lab->_music->updateMusic(); _music->updateMusic();
g_lab->_anim->diffNextFrame(); _anim->diffNextFrame();
g_lab->getTime(&CurSecs, &CurMicros); getTime(&curSecs, &curMicros);
if ((CurSecs > StartSecs) || ((CurSecs == StartSecs) && if ((curSecs > startSecs) || ((curSecs == startSecs) &&
(CurMicros >= StartMicros))) (curMicros >= startMicros)))
break; break;
} }
break; break;
case STOPMUSIC: case STOPMUSIC:
g_lab->_music->setMusic(false); _music->setMusic(false);
break; break;
case STARTMUSIC: case STARTMUSIC:
g_lab->_music->setMusic(true); _music->setMusic(true);
break; break;
case CHANGEMUSIC: case CHANGEMUSIC:
g_lab->_music->changeMusic((const char *)APtr->Data); _music->changeMusic((const char *)aptr->Data);
g_lab->_music->setMusicReset(false); _music->setMusicReset(false);
break; break;
case RESETMUSIC: case RESETMUSIC:
g_lab->_music->resetMusic(); _music->resetMusic();
g_lab->_music->setMusicReset(true); _music->setMusicReset(true);
break; break;
case FILLMUSIC: case FILLMUSIC:
g_lab->_music->updateMusic(); _music->updateMusic();
break; break;
case WAITSOUND: case WAITSOUND:
while (g_lab->_music->isSoundEffectActive()) { while (_music->isSoundEffectActive()) {
g_lab->_music->updateMusic(); _music->updateMusic();
g_lab->_anim->diffNextFrame(); _anim->diffNextFrame();
g_lab->waitTOF(); waitTOF();
} }
break; break;
case CLEARSOUND: case CLEARSOUND:
if (g_lab->_music->_loopSoundEffect) { if (_music->_loopSoundEffect) {
g_lab->_music->_loopSoundEffect = false; _music->_loopSoundEffect = false;
g_lab->_music->stopSoundEffect(); _music->stopSoundEffect();
} else if (g_lab->_music->isSoundEffectActive()) } else if (_music->isSoundEffectActive())
g_lab->_music->stopSoundEffect(); _music->stopSoundEffect();
break; break;
case WINMUSIC: case WINMUSIC:
g_lab->_music->_winmusic = true; _music->_winmusic = true;
g_lab->_music->freeMusic(); _music->freeMusic();
g_lab->_music->initMusic(); _music->initMusic();
break; break;
case WINGAME: case WINGAME:
@ -550,53 +550,53 @@ static void doActions(Action *APtr, CloseDataPtr *lcptr) {
break; break;
case SPECIALCMD: case SPECIALCMD:
if (APtr->Param1 == 0) if (aptr->Param1 == 0)
g_lab->_anim->_doBlack = true; _anim->_doBlack = true;
else if (APtr->Param1 == 1) else if (aptr->Param1 == 1)
g_lab->_anim->_doBlack = (g_lab->_cptr == NULL); _anim->_doBlack = (_cptr == NULL);
else if (APtr->Param1 == 2) else if (aptr->Param1 == 2)
g_lab->_anim->_doBlack = (g_lab->_cptr != NULL); _anim->_doBlack = (_cptr != NULL);
else if (APtr->Param1 == 5) { /* inverse the palette */ else if (aptr->Param1 == 5) { /* inverse the palette */
for (uint16 idx = (8 * 3); idx < (255 * 3); idx++) for (uint16 idx = (8 * 3); idx < (255 * 3); idx++)
g_lab->_anim->_diffPalette[idx] = 255 - g_lab->_anim->_diffPalette[idx]; _anim->_diffPalette[idx] = 255 - _anim->_diffPalette[idx];
g_lab->waitTOF(); waitTOF();
g_lab->setPalette(g_lab->_anim->_diffPalette, 256); setPalette(_anim->_diffPalette, 256);
g_lab->waitTOF(); waitTOF();
g_lab->waitTOF(); waitTOF();
} else if (APtr->Param1 == 4) { /* white the palette */ } else if (aptr->Param1 == 4) { /* white the palette */
whiteScreen(); whiteScreen();
g_lab->waitTOF(); waitTOF();
g_lab->waitTOF(); waitTOF();
} else if (APtr->Param1 == 6) { /* Restore the palette */ } else if (aptr->Param1 == 6) { /* Restore the palette */
g_lab->waitTOF(); waitTOF();
g_lab->setPalette(g_lab->_anim->_diffPalette, 256); setPalette(_anim->_diffPalette, 256);
g_lab->waitTOF(); waitTOF();
g_lab->waitTOF(); waitTOF();
} else if (APtr->Param1 == 7) { /* Quick pause */ } else if (aptr->Param1 == 7) { /* Quick pause */
g_lab->waitTOF(); waitTOF();
g_lab->waitTOF(); waitTOF();
g_lab->waitTOF(); waitTOF();
} }
break; break;
} }
APtr = APtr->NextAction; aptr = aptr->NextAction;
} }
if (g_lab->_music->_loopSoundEffect) { if (_music->_loopSoundEffect) {
g_lab->_music->_loopSoundEffect = false; _music->_loopSoundEffect = false;
g_lab->_music->stopSoundEffect(); _music->stopSoundEffect();
} else { } else {
while (g_lab->_music->isSoundEffectActive()) { while (_music->isSoundEffectActive()) {
g_lab->_music->updateMusic(); _music->updateMusic();
g_lab->_anim->diffNextFrame(); _anim->diffNextFrame();
g_lab->waitTOF(); waitTOF();
} }
} }
g_lab->_music->_doNotFilestopSoundEffect = false; _music->_doNotFilestopSoundEffect = false;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -621,7 +621,7 @@ static bool doActionRuleSub(int16 action, int16 roomNum, CloseDataPtr lcptr, Clo
|| ||
((action == 1) && ((*rule)->Param2 == (-lcptr->CloseUpType)))) { ((action == 1) && ((*rule)->Param2 == (-lcptr->CloseUpType)))) {
if (checkConditions((*rule)->Condition)) { if (checkConditions((*rule)->Condition)) {
doActions((*rule)->ActionList, Set); g_lab->doActions((*rule)->ActionList, Set);
return true; return true;
} }
} }
@ -675,7 +675,7 @@ static bool doOperateRuleSub(int16 ItemNum, int16 roomNum, CloseDataPtr lcptr, C
(((*rule)->Param1 == ItemNum) || (((*rule)->Param1 == 0) && AllowDefaults)) && (((*rule)->Param1 == ItemNum) || (((*rule)->Param1 == 0) && AllowDefaults)) &&
(((*rule)->Param2 == lcptr->CloseUpType) || (((*rule)->Param2 == 0) && AllowDefaults))) { (((*rule)->Param2 == lcptr->CloseUpType) || (((*rule)->Param2 == 0) && AllowDefaults))) {
if (checkConditions((*rule)->Condition)) { if (checkConditions((*rule)->Condition)) {
doActions((*rule)->ActionList, Set); g_lab->doActions((*rule)->ActionList, Set);
return true; return true;
} }
} }
@ -728,7 +728,7 @@ bool doGoForward(CloseDataPtr *lcptr) {
for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) { for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
if (((*rule)->RuleType == GOFORWARD) && ((*rule)->Param1 == (Direction + 1))) { if (((*rule)->RuleType == GOFORWARD) && ((*rule)->Param1 == (Direction + 1))) {
if (checkConditions((*rule)->Condition)) { if (checkConditions((*rule)->Condition)) {
doActions((*rule)->ActionList, lcptr); g_lab->doActions((*rule)->ActionList, lcptr);
return true; return true;
} }
} }
@ -751,7 +751,7 @@ bool doTurn(uint16 from, uint16 to, CloseDataPtr *lcptr) {
(((*rule)->RuleType == TURNFROMTO) && (((*rule)->RuleType == TURNFROMTO) &&
((*rule)->Param1 == from) && ((*rule)->Param2 == to))) { ((*rule)->Param1 == from) && ((*rule)->Param2 == to))) {
if (checkConditions((*rule)->Condition)) { if (checkConditions((*rule)->Condition)) {
doActions((*rule)->ActionList, lcptr); g_lab->doActions((*rule)->ActionList, lcptr);
return true; return true;
} }
} }
@ -768,7 +768,7 @@ bool doMainView(CloseDataPtr *lcptr) {
for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) { for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
if ((*rule)->RuleType == GOMAINVIEW) { if ((*rule)->RuleType == GOMAINVIEW) {
if (checkConditions((*rule)->Condition)) { if (checkConditions((*rule)->Condition)) {
doActions((*rule)->ActionList, lcptr); g_lab->doActions((*rule)->ActionList, lcptr);
return true; return true;
} }
} }