aboutsummaryrefslogtreecommitdiff
path: root/engines/cine/various.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/cine/various.cpp')
-rw-r--r--engines/cine/various.cpp833
1 files changed, 147 insertions, 686 deletions
diff --git a/engines/cine/various.cpp b/engines/cine/various.cpp
index a6bd9964c0..9b98ddb253 100644
--- a/engines/cine/various.cpp
+++ b/engines/cine/various.cpp
@@ -87,7 +87,6 @@ char newPrcName[20];
char newRelName[20];
char newObjectName[20];
char newMsgName[20];
-char currentBgName[8][15];
char currentCtName[15];
char currentPartName[15];
char currentDatName[30];
@@ -96,8 +95,6 @@ int16 saveVar2;
byte isInPause = 0;
-uint16 defaultMenuBoxColor;
-
byte inputVar1 = 0;
uint16 inputVar2 = 0, inputVar3 = 0;
@@ -114,7 +111,6 @@ CommandeType objectListCommand[20];
int16 objListTab[20];
uint16 exitEngine;
-uint16 defaultMenuBoxColor2;
uint16 zoneData[NUM_MAX_ZONE];
@@ -140,6 +136,7 @@ void addPlayerCommandMessage(int16 cmd) {
tmp.type = 3;
overlayList.push_back(tmp);
+ waitForPlayerClick = 1;
}
int16 getRelEntryForObject(uint16 param1, uint16 param2, SelectedObjStruct *pSelectedObject) {
@@ -393,11 +390,14 @@ bool brokenSave(Common::InSaveFile &fHandle) {
return broken;
}
+/*! \todo Implement Operation Stealth loading, this is obviously Future Wars only
+ */
bool CineEngine::makeLoad(char *saveName) {
int16 i;
int16 size;
bool broken;
Common::InSaveFile *fHandle;
+ char bgName[13];
fHandle = g_saveFileMan->openForLoading(saveName);
@@ -440,7 +440,6 @@ bool CineEngine::makeLoad(char *saveName) {
strcpy(newRelName, "");
strcpy(newObjectName, "");
strcpy(newMsgName, "");
- strcpy(currentBgName[0], "");
strcpy(currentCtName, "");
allowPlayerInput = 0;
@@ -455,9 +454,7 @@ bool CineEngine::makeLoad(char *saveName) {
fadeRequired = false;
- for (i = 0; i < 16; i++) {
- c_palette[i] = 0;
- }
+ renderer->clear();
checkForPendingDataLoadSwitch = 0;
@@ -473,7 +470,7 @@ bool CineEngine::makeLoad(char *saveName) {
fHandle->read(currentPrcName, 13);
fHandle->read(currentRelName, 13);
fHandle->read(currentMsgName, 13);
- fHandle->read(currentBgName[0], 13);
+ fHandle->read(bgName, 13);
fHandle->read(currentCtName, 13);
checkDataDisk(currentDisk);
@@ -490,12 +487,12 @@ bool CineEngine::makeLoad(char *saveName) {
loadRel(currentRelName);
}
- if (strlen(currentBgName[0])) {
- loadBg(currentBgName[0]);
+ if (strlen(bgName)) {
+ loadBg(bgName);
}
if (strlen(currentCtName)) {
- loadCt(currentCtName);
+ loadCtFW(currentCtName);
}
fHandle->readUint16BE();
@@ -511,13 +508,7 @@ bool CineEngine::makeLoad(char *saveName) {
objectTable[i].part = fHandle->readUint16BE();
}
- for (i = 0; i < 16; i++) {
- c_palette[i] = fHandle->readUint16BE();
- }
-
- for (i = 0; i < 16; i++) {
- tempPalette[i] = fHandle->readUint16BE();
- }
+ renderer->restorePalette(*fHandle);
globalVars.load(*fHandle, NUM_MAX_VAR - 1);
@@ -530,8 +521,10 @@ bool CineEngine::makeLoad(char *saveName) {
}
fHandle->read(commandBuffer, 0x50);
+ renderer->setCommand(commandBuffer);
+
+ renderer->_cmdY = fHandle->readUint16BE();
- defaultMenuBoxColor = fHandle->readUint16BE();
bgVar0 = fHandle->readUint16BE();
allowPlayerInput = fHandle->readUint16BE();
playerCommand = fHandle->readSint16BE();
@@ -542,7 +535,8 @@ bool CineEngine::makeLoad(char *saveName) {
var3 = fHandle->readUint16BE();
var2 = fHandle->readUint16BE();
commandVar2 = fHandle->readSint16BE();
- defaultMenuBoxColor2 = fHandle->readUint16BE();
+
+ renderer->_messageBg = fHandle->readUint16BE();
fHandle->readUint16BE();
fHandle->readUint16BE();
@@ -615,7 +609,7 @@ void makeSave(char *saveFileName) {
fHandle->write(currentPrcName, 13);
fHandle->write(currentRelName, 13);
fHandle->write(currentMsgName, 13);
- fHandle->write(currentBgName[0], 13);
+ renderer->saveBg(*fHandle);
fHandle->write(currentCtName, 13);
fHandle->writeUint16BE(0xFF);
@@ -631,13 +625,7 @@ void makeSave(char *saveFileName) {
fHandle->writeUint16BE(objectTable[i].part);
}
- for (i = 0; i < 16; i++) {
- fHandle->writeUint16BE(c_palette[i]);
- }
-
- for (i = 0; i < 16; i++) {
- fHandle->writeUint16BE(tempPalette[i]);
- }
+ renderer->savePalette(*fHandle);
globalVars.save(*fHandle, NUM_MAX_VAR - 1);
@@ -651,7 +639,8 @@ void makeSave(char *saveFileName) {
fHandle->write(commandBuffer, 0x50);
- fHandle->writeUint16BE(defaultMenuBoxColor);
+ fHandle->writeUint16BE(renderer->_cmdY);
+
fHandle->writeUint16BE(bgVar0);
fHandle->writeUint16BE(allowPlayerInput);
fHandle->writeUint16BE(playerCommand);
@@ -662,7 +651,8 @@ void makeSave(char *saveFileName) {
fHandle->writeUint16BE(var3);
fHandle->writeUint16BE(var2);
fHandle->writeUint16BE(commandVar2);
- fHandle->writeUint16BE(defaultMenuBoxColor2);
+
+ fHandle->writeUint16BE(renderer->_messageBg);
fHandle->writeUint16BE(0xFF);
fHandle->writeUint16BE(0x1E);
@@ -864,26 +854,6 @@ void CineEngine::makeSystemMenu(void) {
}
}
-int drawChar(byte character, int16 x, int16 y) {
- if (character == ' ') {
- x += 5;
- } else {
- byte characterWidth = fontParamTable[character].characterWidth;
-
- if (characterWidth) {
- byte characterIdx = fontParamTable[character].characterIdx;
- if (g_cine->getGameType() == Cine::GType_OS) {
- drawSpriteRaw2(textTable[characterIdx][0], 0, 2, 8, page1Raw, x, y);
- } else {
- drawSpriteRaw(textTable[characterIdx][0], textTable[characterIdx][1], 2, 8, page1Raw, x, y);
- }
- x += characterWidth + 1;
- }
- }
-
- return x;
-}
-
void drawMessageBox(int16 x, int16 y, int16 width, int16 currentY, int16 offset, int16 color, byte* page) {
gfxDrawLine(x + offset, y + offset, x + width - offset, y + offset, color, page); // top
gfxDrawLine(x + offset, currentY + 4 - offset, x + width - offset, currentY + 4 - offset, color, page); // bottom
@@ -896,49 +866,6 @@ void drawDoubleMessageBox(int16 x, int16 y, int16 width, int16 currentY, int16 c
drawMessageBox(x, y, width, currentY, 0, color, page);
}
-void makeTextEntry(const CommandeType commandList[], uint16 height, uint16 X, uint16 Y, uint16 width) {
- byte color = 2;
- byte color2 = defaultMenuBoxColor2;
- int16 paramY = (height * 9) + 10;
- int16 currentX, currentY;
- int16 i;
- uint16 j;
- byte currentChar;
-
- if (X + width > 319) {
- X = 319 - width;
- }
-
- if (Y + paramY > 199) {
- Y = 199 - paramY;
- }
-
- hideMouse();
- blitRawScreen(page1Raw);
-
- gfxDrawPlainBoxRaw(X, Y, X + width, Y + 4, color2, page1Raw);
-
- currentX = X + 4;
- currentY = Y + 4;
-
- for (i = 0; i < height; i++) {
- gfxDrawPlainBoxRaw(X, currentY, X + width, currentY + 9, color2, page1Raw);
- currentX = X + 4;
-
- for (j = 0; j < strlen(commandList[i]); j++) {
- currentChar = commandList[i][j];
- currentX = drawChar(currentChar, currentX, currentY);
- }
-
- currentY += 9;
- }
-
- gfxDrawPlainBoxRaw(X, currentY, X + width, currentY + 4, color2, page1Raw); // bottom part
- drawDoubleMessageBox(X, Y, width, currentY, color, page1Raw);
-
- blitRawScreen(page1Raw);
-}
-
void processInventory(int16 x, int16 y) {
int16 listSize = buildObjectListCommand(-2);
uint16 button;
@@ -946,7 +873,8 @@ void processInventory(int16 x, int16 y) {
if (!listSize)
return;
- makeTextEntry(objectListCommand, listSize, x, y, 140);
+ renderer->drawMenu(objectListCommand, listSize, x, y, 140, -1);
+ renderer->blit();
do {
manageEvents();
@@ -1085,7 +1013,7 @@ void makeCommandLine(void) {
}
if (!disableSystemMenu) {
- isDrawCommandEnabled = 1;
+ renderer->setCommand(commandBuffer);
}
}
@@ -1094,13 +1022,8 @@ uint16 needMouseSave = 0;
uint16 menuVar4 = 0;
uint16 menuVar5 = 0;
-int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X, uint16 Y,
- uint16 width, bool recheckValue) {
- byte color = 2;
- byte color2 = defaultMenuBoxColor2;
+int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X, uint16 Y, uint16 width, bool recheckValue) {
int16 paramY;
- int16 currentX, currentY;
- int16 i;
uint16 button;
int16 var_A;
int16 di;
@@ -1110,7 +1033,6 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
int16 var_14;
int16 currentSelection, oldSelection;
int16 var_4;
- byte currentChar;
if (disableSystemMenu)
return -1;
@@ -1125,30 +1047,8 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
Y = 199 - paramY;
}
- hideMouse();
- blitRawScreen(page1Raw);
-
- gfxDrawPlainBoxRaw(X, Y, X + width, Y + 4, color2, page1Raw);
-
- currentX = X + 4;
- currentY = Y + 4;
-
- for (i = 0; i < height; i++) {
- gfxDrawPlainBoxRaw(X, currentY, X + width, currentY + 9, color2, page1Raw);
- currentX = X + 4;
-
- for (j = 0; j < strlen(commandList[i]); j++) {
- currentChar = commandList[i][j];
- currentX = drawChar(currentChar, currentX, currentY);
- }
-
- currentY += 9;
- }
-
- gfxDrawPlainBoxRaw(X, currentY, X + width, currentY + 4, color2, page1Raw); // bottom part
- drawDoubleMessageBox(X, Y, width, currentY, color, page1Raw);
-
- blitRawScreen(page1Raw);
+ renderer->drawMenu(commandList, height, X, Y, width, -1);
+ renderer->blit();
do {
manageEvents();
@@ -1160,15 +1060,9 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
currentSelection = 0;
di = currentSelection * 9 + Y + 4;
- gfxDrawPlainBoxRaw(X + 2, di - 1, X + width - 2, di + 7, 0, page1Raw); // draw black box behind selection
- currentX = X + 4;
-
- for (j = 0; j < strlen(commandList[currentSelection]); j++) {
- currentChar = commandList[currentSelection][j];
- currentX = drawChar(currentChar, currentX, di);
- }
- blitRawScreen(page1Raw);
+ renderer->drawMenu(commandList, height, X, Y, width, currentSelection);
+ renderer->blit();
manageEvents();
getMouseData(mouseUpdateStatus, &button, (uint16 *)&mouseX, (uint16 *)&mouseY);
@@ -1219,29 +1113,10 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
hideMouse();
}
- di = oldSelection * 9 + Y + 4;
-
- gfxDrawPlainBoxRaw(X + 2, di - 1, X + width - 2, di + 7, color2, page1Raw); // restore color
-
- currentX = X + 4;
-
- for (j = 0; j < strlen(commandList[oldSelection]); j++) {
- currentChar = commandList[oldSelection][j];
- currentX = drawChar(currentChar, currentX, di);
- }
-
di = currentSelection * 9 + Y + 4;
- gfxDrawPlainBoxRaw(X + 2, di - 1, X + width - 2, di + 7, 0, page1Raw); // black new
-
- currentX = X + 4;
-
- for (j = 0; j < strlen(commandList[currentSelection]); j++) {
- currentChar = commandList[currentSelection][j];
- currentX = drawChar(currentChar, currentX, di);
- }
-
- blitRawScreen(page1Raw);
+ renderer->drawMenu(commandList, height, X, Y, width, currentSelection);
+ renderer->blit();
// if (needMouseSave) {
// gfxRedrawMouseCursor();
@@ -1271,38 +1146,6 @@ int16 makeMenuChoice(const CommandeType commandList[], uint16 height, uint16 X,
return currentSelection;
}
-void drawMenuBox(char *command, int16 x, int16 y) {
- byte j;
- byte lColor = 2;
-
- hideMouse();
-
- gfxDrawPlainBoxRaw(x, y, x + 300, y + 10, 0, page2Raw);
-
- drawMessageBox(x, y, 300, y + 6, -1, lColor, page2Raw);
-
- x += 2;
- y += 2;
-
- for (j = 0; j < strlen(command); j++) {
- byte currentChar = command[j];
-
- if (currentChar == ' ') {
- x += 5;
- } else {
- byte characterWidth = fontParamTable[currentChar].characterWidth;
-
- if (characterWidth) {
- byte characterIdx = fontParamTable[currentChar].characterIdx;
- drawSpriteRaw(textTable[characterIdx][0], textTable[characterIdx][1], 2, 8, page2Raw, x, y);
- x += characterWidth + 1;
- }
- }
- }
-
-// gfxRedrawMouseCursor();
-}
-
void makeActionMenu(void) {
uint16 mouseButton;
uint16 mouseX;
@@ -1342,11 +1185,6 @@ uint16 executePlayerInput(void) {
}
if (allowPlayerInput) {
- if (isDrawCommandEnabled) {
- drawMenuBox(commandBuffer, 10, defaultMenuBoxColor);
- isDrawCommandEnabled = 0;
- }
-
getMouseData(mouseUpdateStatus, &mouseButton, &mouseX, &mouseY);
while (mouseButton && currentEntry < 200) {
@@ -1393,7 +1231,6 @@ uint16 executePlayerInput(void) {
if (choiceResultTable[playerCommand] == commandVar1) {
int16 relEntry;
- drawMenuBox(commandBuffer, 10, defaultMenuBoxColor);
SelectedObjStruct obj;
obj.idx = commandVar3[0];
obj.param = commandVar3[1];
@@ -1410,41 +1247,40 @@ uint16 executePlayerInput(void) {
commandVar1 = 0;
strcpy(commandBuffer, "");
+ renderer->setCommand("");
}
} else {
globalVars[VAR_MOUSE_X_POS] = mouseX;
globalVars[VAR_MOUSE_Y_POS] = mouseY;
}
}
- } else {
- if (mouseButton & 2) {
- if (mouseButton & 1) {
- g_cine->makeSystemMenu();
- }
+ } else if (mouseButton & 2) {
+ if (mouseButton & 1) {
+ g_cine->makeSystemMenu();
+ }
- makeActionMenu();
- makeCommandLine();
- } else {
- int16 objIdx;
+ makeActionMenu();
+ makeCommandLine();
+ } else {
+ int16 objIdx;
- objIdx = getObjectUnderCursor(mouseX, mouseY);
+ objIdx = getObjectUnderCursor(mouseX, mouseY);
- if (commandVar2 != objIdx) {
- if (objIdx != -1) {
- char command[256];
+ if (commandVar2 != objIdx) {
+ if (objIdx != -1) {
+ char command[256];
- strcpy(command, commandBuffer);
- strcat(command, " ");
- strcat(command, objectTable[objIdx].name);
+ strcpy(command, commandBuffer);
+ strcat(command, " ");
+ strcat(command, objectTable[objIdx].name);
- drawMenuBox(command, 10, defaultMenuBoxColor);
- } else {
- isDrawCommandEnabled = 1;
- }
+ renderer->setCommand(command);
+ } else {
+ isDrawCommandEnabled = 1;
}
-
- commandVar2 = objIdx;
}
+
+ commandVar2 = objIdx;
}
} else {
if (mouseButton & 2) {
@@ -1653,257 +1489,9 @@ void drawSprite(Common::List<overlay>::iterator it, const byte *spritePtr, const
free(msk);
}
-int16 additionalBgVScroll = 0;
-
-void backupOverlayPage(void) {
- byte *scrollBg;
- byte *bgPage = additionalBgTable[currentAdditionalBgIdx];
-
- if (bgPage) {
- if (!additionalBgVScroll) {
- memcpy(page1Raw, bgPage, 320 * 200);
- } else {
- scrollBg = additionalBgTable[currentAdditionalBgIdx2];
-
- for (int16 i = additionalBgVScroll; i < 200 + additionalBgVScroll; i++) {
- if (i > 200) {
- memcpy(page1Raw + (i - additionalBgVScroll) * 320, scrollBg + (i - 200) * 320, 320);
- } else {
- memcpy(page1Raw + (i - additionalBgVScroll) * 320, bgPage + (i-1) * 320, 320);
- }
- }
- }
- }
-}
-
-void drawMessage(const char *messagePtr, int16 x, int16 y, int16 width, int16 color) {
- byte color2 = 2;
- byte endOfMessageReached = 0;
- int16 localX, localY, localWidth;
- uint16 messageLength = 0, numWords = 0, messageWidth = 0;
- uint16 lineResult, fullLineWidth;
- uint16 interWordSize, interWordSizeRemain;
- const char *endOfMessagePtr;
- byte currentChar; //, characterWidth;
-
- gfxDrawPlainBoxRaw(x, y, x + width, y + 4, color, page1Raw);
-
- localX = x + 4;
- localY = y + 4;
- localWidth = width - 8;
-
- do {
- messageLength = 0;
-
- while (messagePtr[messageLength] == ' ') {
- messageLength++;
- }
-
- messagePtr += messageLength;
-
- messageLength = computeMessageLength((const byte *)messagePtr, localWidth, &numWords, &messageWidth, &lineResult);
-
- endOfMessagePtr = messagePtr + messageLength;
-
- if (lineResult) {
- fullLineWidth = localWidth - messageWidth;
-
- if (numWords) {
- interWordSize = fullLineWidth / numWords;
- interWordSizeRemain = fullLineWidth % numWords;
- } else {
- interWordSize = 5;
- interWordSizeRemain = 0;
- }
- } else {
- interWordSize = 5;
- interWordSizeRemain = 0;
- }
-
- gfxDrawPlainBoxRaw(x, localY, x + width, localY + 9, color, page1Raw);
-
- do {
- currentChar = *(messagePtr++);
-
- if (currentChar == 0) {
- endOfMessageReached = 1;
- } else if (currentChar == ' ') {
- localX += interWordSizeRemain + interWordSize;
-
- if (interWordSizeRemain)
- interWordSizeRemain = 0;
- } else {
- localX = drawChar(currentChar, localX, localY);
- }
- } while ((messagePtr < endOfMessagePtr) && !endOfMessageReached);
-
- localX = x + 4;
- localY += 9;
- } while (!endOfMessageReached);
-
- gfxDrawPlainBoxRaw(x, localY, x + width, localY + 4, color, page1Raw);
-
- drawDoubleMessageBox(x, y, width, localY, color2, page1Raw);
-}
-
-void drawDialogueMessage(byte msgIdx, int16 x, int16 y, int16 width, int16 color) {
- if (msgIdx >= messageTable.size()) {
-// removeOverlay(msgIdx, 2);
- return;
- }
-
- _messageLen += messageTable[msgIdx].size();
- drawMessage(messageTable[msgIdx].c_str(), x, y, width, color);
-
- // this invalidates the iterator in drawOverlays()
-// removeOverlay(msgIdx, 2);
-}
-
-void drawFailureMessage(byte cmd) {
- byte msgIdx = cmd * 4 + g_cine->_rnd.getRandomNumber(3);
-
- const char *messagePtr = failureMessages[msgIdx];
- int len = strlen(messagePtr);
-
- _messageLen += len;
-
- int16 width = 6 * len + 20;
-
- if (width > 300)
- width = 300;
-
- int16 x = (320 - width) / 2;
- int16 y = 80;
- int16 color = 4;
-
- drawMessage(messagePtr, x, y, width, color);
-
- // this invalidates the iterator in drawOverlays()
-// removeOverlay(cmd, 3);
-}
-
-void drawOverlays(void) {
- uint16 width, height;
- AnimData *pPart;
- int16 x, y;
- objectStruct *objPtr;
- byte messageIdx;
+void removeMessages() {
Common::List<overlay>::iterator it;
- backupOverlayPage();
-
- _messageLen = 0;
-
- for (it = overlayList.begin(); it != overlayList.end(); ++it) {
- switch (it->type) {
- case 0: // sprite
- assert(it->objIdx < NUM_MAX_OBJECT);
-
- objPtr = &objectTable[it->objIdx];
- x = objPtr->x;
- y = objPtr->y;
-
- if (objPtr->frame < 0) {
- continue;
- }
-
- pPart = &animDataTable[objPtr->frame];
- width = pPart->_realWidth;
- height = pPart->_height;
-
- if (!pPart->data()) {
- continue;
- }
-
- // drawSprite ignores masks of Operation Stealth sprites
- drawSprite(it, pPart->data(), pPart->mask(), width, height, page1Raw, x, y);
- break;
-
- case 2: // text
- // gfxWaitVSync();
- // hideMouse();
-
- messageIdx = it->objIdx;
- x = it->x;
- y = it->y;
- width = it->width;
- height = it->color;
-
- blitRawScreen(page1Raw);
-
- drawDialogueMessage(messageIdx, x, y, width, height);
-
- // blitScreen(page0, NULL);
- // gfxRedrawMouseCursor();
-
- waitForPlayerClick = 1;
-
- break;
-
- case 3:
- // gfxWaitSync()
- // hideMouse();
-
- blitRawScreen(page1Raw);
-
- drawFailureMessage(it->objIdx);
-
- // blitScreen(page0, NULL);
- // gfxRedrawMouseCursor();
-
- waitForPlayerClick = 1;
-
- break;
-
- case 4:
- assert(it->objIdx < NUM_MAX_OBJECT);
-
- objPtr = &objectTable[it->objIdx];
- x = objPtr->x;
- y = objPtr->y;
-
- if (objPtr->frame < 0) {
- continue;
- }
-
- assert(objPtr->frame < NUM_MAX_ANIMDATA);
-
- pPart = &animDataTable[objPtr->frame];
-
- width = pPart->_realWidth;
- height = pPart->_height;
-
- if (!pPart->data()) {
- continue;
- }
-
- gfxFillSprite(pPart->data(), width, height, page1Raw, x, y);
- break;
-
- case 20:
- assert(it->objIdx < NUM_MAX_OBJECT);
-
- objPtr = &objectTable[it->objIdx];
- x = objPtr->x;
- y = objPtr->y;
- var5 = it->x;
-
- if (objPtr->frame < 0 || var5 > 8 || !additionalBgTable[var5] || animDataTable[objPtr->frame]._bpp != 1) {
- continue;
- }
-
- width = animDataTable[objPtr->frame]._realWidth;
- height = animDataTable[objPtr->frame]._height;
-
- if (!animDataTable[objPtr->frame].data()) {
- continue;
- }
-
- maskBgOverlay(additionalBgTable[var5], animDataTable[objPtr->frame].data(), width, height, page1Raw, x, y);
- break;
- }
- }
-
for (it = overlayList.begin(); it != overlayList.end(); ) {
if (it->type == 2 || it->type == 3) {
it = overlayList.erase(it);
@@ -1978,115 +1566,96 @@ void addMessage(byte param1, int16 param2, int16 param3, int16 param4, int16 par
tmp.color = param5;
overlayList.push_back(tmp);
+ waitForPlayerClick = 1;
}
-SeqListElement seqList;
+Common::List<SeqListElement> seqList;
void removeSeq(uint16 param1, uint16 param2, uint16 param3) {
- SeqListElement *currentHead = &seqList;
- SeqListElement *tempHead = currentHead;
+ Common::List<SeqListElement>::iterator it;
- while (currentHead && (currentHead->var6 != param1 || currentHead->var4 != param2 || currentHead->varE != param3)) {
- tempHead = currentHead;
- currentHead = tempHead->next;
- }
-
- if (currentHead && currentHead->var6 == param1 && currentHead->var4 == param2 && currentHead->varE == param3) {
- currentHead->var4 = -1;
+ for (it = seqList.begin(); it != seqList.end(); ++it) {
+ if (it->objIdx == param1 && it->var4 == param2 && it->varE == param3) {
+ it->var4 = -1;
+ break;
+ }
}
}
uint16 isSeqRunning(uint16 param1, uint16 param2, uint16 param3) {
- SeqListElement *currentHead = &seqList;
- SeqListElement *tempHead = currentHead;
-
- while (currentHead && (currentHead->var6 != param1 || currentHead->var4 != param2 || currentHead->varE != param3)) {
- tempHead = currentHead;
- currentHead = tempHead->next;
- }
+ Common::List<SeqListElement>::iterator it;
- if (currentHead && currentHead->var6 == param1 && currentHead->var4 == param2 && currentHead->varE == param3) {
- return 1;
+ for (it = seqList.begin(); it != seqList.end(); ++it) {
+ if (it->objIdx == param1 && it->var4 == param2 && it->varE == param3) {
+ return 1;
+ }
}
return 0;
}
-void addSeqListElement(int16 param0, int16 param1, int16 param2, int16 param3, int16 param4, int16 param5, int16 param6, int16 param7, int16 param8) {
- SeqListElement *currentHead = &seqList;
- SeqListElement *tempHead = currentHead;
- SeqListElement *newElement;
-
- currentHead = tempHead->next;
-
- while (currentHead && currentHead->varE < param7) {
- tempHead = currentHead;
- currentHead = tempHead->next;
- }
-
- newElement = new SeqListElement;
-
- newElement->next = tempHead->next;
- tempHead->next = newElement;
-
- newElement->var6 = param0;
- newElement->var4 = param1;
- newElement->var8 = param2;
- newElement->varA = param3;
- newElement->varC = param4;
- newElement->var14 = 0;
- newElement->var16 = 0;
- newElement->var18 = param5;
- newElement->var1A = param6;
- newElement->varE = param7;
- newElement->var10 = param8;
- newElement->var12 = param8;
- newElement->var1C = 0;
- newElement->var1E = 0;
-}
-
-void resetSeqList() {
- seqList.next = NULL;
+void addSeqListElement(uint16 objIdx, int16 param1, int16 param2, int16 frame, int16 param4, int16 param5, int16 param6, int16 param7, int16 param8) {
+ Common::List<SeqListElement>::iterator it;
+ SeqListElement tmp;
+
+ for (it = seqList.begin(); it != seqList.end() && it->varE < param7; ++it) ;
+
+ tmp.objIdx = objIdx;
+ tmp.var4 = param1;
+ tmp.var8 = param2;
+ tmp.frame = frame;
+ tmp.varC = param4;
+ tmp.var14 = 0;
+ tmp.var16 = 0;
+ tmp.var18 = param5;
+ tmp.var1A = param6;
+ tmp.varE = param7;
+ tmp.var10 = param8;
+ tmp.var12 = param8;
+ tmp.var1C = 0;
+ tmp.var1E = 0;
+
+ seqList.insert(it, tmp);
}
-void computeMove1(SeqListElement *element, int16 x, int16 y, int16 param1,
+void computeMove1(SeqListElement &element, int16 x, int16 y, int16 param1,
int16 param2, int16 x2, int16 y2) {
- element->var16 = 0;
- element->var14 = 0;
+ element.var16 = 0;
+ element.var14 = 0;
if (y2) {
if (y - param2 > y2) {
- element->var16 = 2;
+ element.var16 = 2;
}
if (y + param2 < y2) {
- element->var16 = 1;
+ element.var16 = 1;
}
}
if (x2) {
if (x - param1 > x2) {
- element->var14 = 2;
+ element.var14 = 2;
}
if (x + param1 < x2) {
- element->var14 = 1;
+ element.var14 = 1;
}
}
}
-uint16 computeMove2(SeqListElement *element) {
+uint16 computeMove2(SeqListElement &element) {
int16 returnVar = 0;
- if (element->var16 == 1) {
+ if (element.var16 == 1) {
returnVar = 4;
- } else if (element->var16 == 2) {
+ } else if (element.var16 == 2) {
returnVar = 3;
}
- if (element->var14 == 1) {
+ if (element.var14 == 1) {
returnVar = 1;
- } else if (element->var14 == 2) {
+ } else if (element.var14 == 2) {
returnVar = 2;
}
@@ -2165,14 +1734,13 @@ void resetGfxEntityEntry(uint16 objIdx) {
#endif
}
-uint16 addAni(uint16 param1, uint16 param2, const byte *ptr, SeqListElement *element, uint16 param3, int16 *param4) {
+uint16 addAni(uint16 param1, uint16 objIdx, const byte *ptr, SeqListElement &element, uint16 param3, int16 *param4) {
const byte *currentPtr = ptr;
const byte *ptrData;
const byte *ptr2;
int16 di;
assert(ptr);
- assert(element);
assert(param4);
dummyU16 = READ_BE_UINT16((currentPtr + param1 * 2) + 8);
@@ -2181,25 +1749,25 @@ uint16 addAni(uint16 param1, uint16 param2, const byte *ptr, SeqListElement *ele
assert(*ptrData);
- di = (objectTable[param2].costume + 1) % (*ptrData);
+ di = (objectTable[objIdx].costume + 1) % (*ptrData);
ptr2 = (ptrData + (di * 8)) + 1;
- if ((checkCollision(param2, ptr2[0], ptr2[1], ptr2[2], ptr[0]) & 1)) {
+ if ((checkCollision(objIdx, ptr2[0], ptr2[1], ptr2[2], ptr[0]) & 1)) {
return 0;
}
- objectTable[param2].x += (int8)ptr2[4];
- objectTable[param2].y += (int8)ptr2[5];
- objectTable[param2].mask += (int8)ptr2[6];
+ objectTable[objIdx].x += (int8)ptr2[4];
+ objectTable[objIdx].y += (int8)ptr2[5];
+ objectTable[objIdx].mask += (int8)ptr2[6];
- if (objectTable[param2].frame) {
- resetGfxEntityEntry(param2);
+ if (objectTable[objIdx].frame) {
+ resetGfxEntityEntry(objIdx);
}
- objectTable[param2].frame = ptr2[7] + element->var8;
+ objectTable[objIdx].frame = ptr2[7] + element.var8;
- if (param3 || !element->var14) {
- objectTable[param2].costume = di;
+ if (param3 || !element.var14) {
+ objectTable[objIdx].costume = di;
} else {
*param4 = di;
}
@@ -2207,86 +1775,86 @@ uint16 addAni(uint16 param1, uint16 param2, const byte *ptr, SeqListElement *ele
return 1;
}
-void processSeqListElement(SeqListElement *element) {
- int16 x = objectTable[element->var6].x;
- int16 y = objectTable[element->var6].y;
- const byte *ptr1 = animDataTable[element->varA].data();
+void processSeqListElement(SeqListElement &element) {
+ int16 x = objectTable[element.objIdx].x;
+ int16 y = objectTable[element.objIdx].y;
+ const byte *ptr1 = animDataTable[element.frame].data();
int16 var_10;
int16 var_4;
int16 var_2;
- if (element->var12 < element->var10) {
- element->var12++;
+ if (element.var12 < element.var10) {
+ element.var12++;
return;
}
- element->var12 = 0;
+ element.var12 = 0;
if (ptr1) {
uint16 param1 = ptr1[1];
uint16 param2 = ptr1[2];
- if (element->varC != 255) {
+ if (element.varC != 255) {
// FIXME: Why is this here? Fingolfin gets lots of these
// in his copy of Operation Stealth (value 0 or 236) under
// Mac OS X. Maybe it's a endian issue? At least the graphics
// in the copy protection screen are partially messed up.
- warning("processSeqListElement: varC = %d", element->varC);
+ warning("processSeqListElement: varC = %d", element.varC);
}
if (globalVars[VAR_MOUSE_X_POS] || globalVars[VAR_MOUSE_Y_POS]) {
computeMove1(element, ptr1[4] + x, ptr1[5] + y, param1, param2, globalVars[VAR_MOUSE_X_POS], globalVars[VAR_MOUSE_Y_POS]);
} else {
- element->var16 = 0;
- element->var14 = 0;
+ element.var16 = 0;
+ element.var14 = 0;
}
var_10 = computeMove2(element);
if (var_10) {
- element->var1C = var_10;
- element->var1E = var_10;
+ element.var1C = var_10;
+ element.var1E = var_10;
}
var_4 = -1;
- if ((element->var16 == 1
- && !addAni(3, element->var6, ptr1, element, 0, &var_4)) || (element->var16 == 2 && !addAni(2, element->var6, ptr1, element, 0,
+ if ((element.var16 == 1
+ && !addAni(3, element.objIdx, ptr1, element, 0, &var_4)) || (element.var16 == 2 && !addAni(2, element.objIdx, ptr1, element, 0,
&var_4))) {
- if (element->varC == 255) {
+ if (element.varC == 255) {
globalVars[VAR_MOUSE_Y_POS] = 0;
}
}
- if ((element->var14 == 1
- && !addAni(0, element->var6, ptr1, element, 1, &var_2))) {
- if (element->varC == 255) {
+ if ((element.var14 == 1
+ && !addAni(0, element.objIdx, ptr1, element, 1, &var_2))) {
+ if (element.varC == 255) {
globalVars[VAR_MOUSE_X_POS] = 0;
if (var_4 != -1) {
- objectTable[element->var6].costume = var_4;
+ objectTable[element.objIdx].costume = var_4;
}
}
}
- if ((element->var14 == 2 && !addAni(1, element->var6, ptr1, element, 1, &var_2))) {
- if (element->varC == 255) {
+ if ((element.var14 == 2 && !addAni(1, element.objIdx, ptr1, element, 1, &var_2))) {
+ if (element.varC == 255) {
globalVars[VAR_MOUSE_X_POS] = 0;
if (var_4 != -1) {
- objectTable[element->var6].costume = var_4;
+ objectTable[element.objIdx].costume = var_4;
}
}
}
- if (element->var16 + element->var14) {
- if (element->var1C) {
- if (element->var1E) {
- objectTable[element->var6].costume = 0;
- element->var1E = 0;
+ if (element.var16 + element.var14) {
+ if (element.var1C) {
+ if (element.var1E) {
+ objectTable[element.objIdx].costume = 0;
+ element.var1E = 0;
}
- addAni(element->var1C + 3, element->var6, ptr1, element, 1, (int16 *) & var2);
+ addAni(element.var1C + 3, element.objIdx, ptr1, element, 1, (int16 *) & var2);
}
}
@@ -2295,119 +1863,28 @@ void processSeqListElement(SeqListElement *element) {
}
void processSeqList(void) {
- SeqListElement *currentHead = &seqList;
- SeqListElement *tempHead = currentHead;
+ Common::List<SeqListElement>::iterator it;
- currentHead = tempHead->next;
-
- while (currentHead) {
- if (currentHead->var4 != -1) {
- processSeqListElement(currentHead);
+ for (it = seqList.begin(); it != seqList.end(); ++it) {
+ if (it->var4 == -1) {
+ continue;
}
- tempHead = currentHead;
- currentHead = tempHead->next;
+ processSeqListElement(*it);
}
}
bool makeTextEntryMenu(const char *messagePtr, char *inputString, int stringMaxLength, int y) {
- int16 color = 2;
- byte color2 = defaultMenuBoxColor2;
- byte endOfMessageReached = 0;
- int16 localX, localY, localWidth;
- int margins = 16;
int len = strlen(messagePtr);
int16 width = 6 * len + 20;
- uint16 messageLength = 0, numWords = 0, messageWidth = 0;
- uint16 lineResult, fullLineWidth;
- uint16 interWordSize, interWordSizeRemain;
- const char *endOfMessagePtr;
- byte currentChar, characterWidth;
width = CLIP((int)width, 180, 250);
int16 x = (320 - width) / 2;
- gfxDrawPlainBoxRaw(x - margins, y, x + width + margins, y + 4, color2, page1Raw);
-
- localX = x + 4;
- localY = y + 4;
- localWidth = width;
-
getKeyData(); // clear input key
- do {
- messageLength = 0;
-
- while (messagePtr[messageLength] == ' ') {
- messageLength++;
- }
-
- messagePtr += messageLength;
-
- messageLength = computeMessageLength((const byte *)messagePtr, localWidth, &numWords, &messageWidth, &lineResult);
-
- endOfMessagePtr = messagePtr + messageLength;
-
- if (lineResult) {
- fullLineWidth = localWidth - messageWidth;
-
- if (numWords) {
- interWordSize = fullLineWidth / numWords;
- interWordSizeRemain = fullLineWidth % numWords;
- } else {
- interWordSize = 5;
- interWordSizeRemain = 0;
- }
- } else {
- interWordSize = 5;
- interWordSizeRemain = 0;
- }
-
- gfxDrawPlainBoxRaw(x - margins, localY, x + width + margins, localY + 9, color2, page1Raw);
-
- do {
- currentChar = *(messagePtr++);
-
- if (currentChar == 0) {
- endOfMessageReached = 1;
- } else if (currentChar == ' ') {
- localX += interWordSizeRemain + interWordSize;
-
- if (interWordSizeRemain)
- interWordSizeRemain = 0;
- } else {
- characterWidth = fontParamTable[currentChar].characterWidth;
-
- if (characterWidth) {
- byte characterIdx = fontParamTable[currentChar].characterIdx;
- drawSpriteRaw(textTable[characterIdx][0], textTable[characterIdx][1], 2, 8, page1Raw, localX, localY);
- localX += characterWidth + 1;
- }
- }
- } while ((messagePtr < endOfMessagePtr) && !endOfMessageReached);
-
- localX = x + 4;
- localY += 9;
- } while (!endOfMessageReached);
-
- // Input string
- gfxDrawPlainBoxRaw(x - margins, localY, x + width + margins, localY + 9, color2, page1Raw);
- localY += 9;
-
- x -= margins;
- width += margins * 2;
-
- gfxDrawPlainBoxRaw(x, localY, x + width, localY + 4, color2, page1Raw);
-
- drawDoubleMessageBox(x, y, width, localY, color, page1Raw);
-
- x += margins;
- width -= margins * 2;
- localY -= 9;
-
-
int quit = 0;
bool redraw = true;
CommandeType tempString;
@@ -2416,24 +1893,8 @@ bool makeTextEntryMenu(const char *messagePtr, char *inputString, int stringMaxL
while (!quit) {
if (redraw) {
- gfxDrawPlainBoxRaw(x, localY - 1, x + width, localY + 8, 0, page1Raw);
-
- int currentX = x + 4;
-
- for (uint j = 0; j < strlen(inputString); j++) {
- currentChar = inputString[j];
- currentX = drawChar(currentChar, currentX, localY);
-
- // draw cursor here
- if (inputPos == (int)(j + 2))
- gfxDrawLine(currentX, localY - 1, currentX, localY + 8, color, page1Raw);
-
- }
-
- if (strlen(inputString) == 0 || inputPos == 1) // cursor wasn't yet drawn
- gfxDrawLine(x + 4, localY - 1, x + 4, localY + 8, color, page1Raw);
-
- blitRawScreen(page1Raw);
+ renderer->drawInputBox(messagePtr, inputString, inputPos, x - 16, y, width + 32);
+ renderer->blit();
redraw = false;
}