int16 Op_AddProc() { int pop1 = popVar(); int pop2; int overlay; int param[160]; for (long int i = 0; i < pop1; i++) { param[i] = popVar(); } pop2 = popVar(); overlay = popVar(); if (!overlay) overlay = currentScriptPtr->overlayNumber; if (!overlay) return (0); uint8* procBss = attacheNewScriptToTail(&procHead, overlay, pop2, currentScriptPtr->type, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_PROC); if (procBss) { for (long int i = 0; i < pop1; i++) { int16* ptr = (int16 *)(procBss + i * 2); *ptr = param[i]; bigEndianShortToNative(ptr); } } return (0); }
int16 Op_Exec() { int scriptIdx; int ovlIdx; uint8 *ptr; uint8 *ptr2; int16 popTable[200]; int numOfArgToPop = popVar(); int i = 0; for (i = 0; i < numOfArgToPop; i++) { popTable[numOfArgToPop - i - 1] = popVar(); } scriptIdx = popVar(); ovlIdx = popVar(); if (!ovlIdx) { ovlIdx = currentScriptPtr->overlayNumber; } ptr = attacheNewScriptToTail(&procHead, ovlIdx, scriptIdx, currentScriptPtr->type, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_MinusPROC); if (!ptr) return (0); if (numOfArgToPop <= 0) { return (0); } ptr2 = ptr; for (i = 0; i < numOfArgToPop; i++) { WRITE_BE_UINT16(ptr2, popTable[i]); ptr2 += 2; } return (0); }
bool findRelation(int objOvl, int objIdx, int x, int y) { bool found = false; bool first = true; int testState = -1; int j; int16 objectState; getSingleObjectParam(objOvl, objIdx, 5, &objectState); for (j = 1; j < numOfLoadedOverlay; j++) { if (overlayTable[j].alreadyLoaded) { int idHeader = overlayTable[j].ovlData->numMsgRelHeader; for (int i = 0; i < idHeader; i++) { linkDataStruct* ptrHead = &overlayTable[j].ovlData->arrayMsgRelHeader[i]; int thisOvl = ptrHead->obj1Overlay; if (!thisOvl) { thisOvl = j; } //const char* pName = getObjectName(ptrHead->obj1Number, overlayTable[thisOvl].ovlData->arrayNameObj); objDataStruct* pObject = getObjectDataFromOverlay(thisOvl, ptrHead->obj1Number); if ((thisOvl == objOvl) && (objIdx == ptrHead->obj1Number) && pObject && (pObject->_class != THEME)) { int verbeOvl = ptrHead->verbOverlay; int obj1Ovl = ptrHead->obj1Overlay; int obj2Ovl = ptrHead->obj2Overlay; if (!verbeOvl) verbeOvl = j; if (!obj1Ovl) obj1Ovl = j; if (!obj2Ovl) obj2Ovl = j; char verbe_name[80]; char obj1_name[80]; char obj2_name[80]; char r_verbe_name[80]; char r_obj1_name[80]; char r_obj2_name[80]; verbe_name[0] = 0; obj1_name[0] = 0; obj2_name[0] = 0; r_verbe_name[0] = 0; r_obj1_name[0] = 0; r_obj2_name[0] = 0; ovlDataStruct *ovl2 = NULL; ovlDataStruct *ovl3 = NULL; ovlDataStruct *ovl4 = NULL; if (verbeOvl > 0) ovl2 = overlayTable[verbeOvl].ovlData; if (obj1Ovl > 0) ovl3 = overlayTable[obj1Ovl].ovlData; if (obj2Ovl > 0) ovl4 = overlayTable[obj2Ovl].ovlData; if ((ovl3) && (ptrHead->obj1Number >= 0)) { testState = ptrHead->obj1OldState; if ((first) && (ovl3->arrayNameObj) && ((testState == -1) || (testState == objectState))) { const char *ptrName = getObjectName(ptrHead->obj1Number, ovl3->arrayNameObj); menuTable[0] = createMenu(x, y, ptrName); first = false; } } if ((ovl2) && (ptrHead->verbNumber >= 0)) { if (ovl2->nameVerbGlob) { const char *ptr = getObjectName(ptrHead->verbNumber, ovl2->nameVerbGlob); strcpy(verbe_name, ptr); if ((!first) && ((testState == -1) || (testState == objectState))) { if (!strlen(verbe_name)) { if (currentScriptPtr) { attacheNewScriptToTail(&relHead, j, ptrHead->id, 30, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_REL); } else { attacheNewScriptToTail(&relHead, j, ptrHead->id, 30, 0, 0, scriptType_REL); } } else if (ovl2->nameVerbGlob) { found = true; ptr = getObjectName(ptrHead->verbNumber, ovl2->nameVerbGlob); addSelectableMenuEntry(j, i, menuTable[0], 1, -1, ptr); } } } } } } } } return found; }
bool createDialog(int objOvl, int objIdx, int x, int y) { bool found = false; int testState1 = -1; int testState2 = -1; int j; int16 objectState; int16 objectState2; getSingleObjectParam(objOvl, objIdx, 5, &objectState); menuTable[0] = createMenu(x, y, _vm->langString(ID_SPEAK_ABOUT)); for (j = 1; j < numOfLoadedOverlay; j++) { if (overlayTable[j].alreadyLoaded) { int idHeader = overlayTable[j].ovlData->numMsgRelHeader; for (int i = 0; i < idHeader; i++) { linkDataStruct* ptrHead = &overlayTable[j].ovlData->arrayMsgRelHeader[i]; int thisOvl = ptrHead->obj1Overlay; if (!thisOvl) { thisOvl = j; } objDataStruct* pObject = getObjectDataFromOverlay(thisOvl, ptrHead->obj1Number); getSingleObjectParam(thisOvl, ptrHead->obj1Number, 5, &objectState2); if (pObject && (pObject->_class == THEME) && (objectState2 < -1)) { thisOvl = ptrHead->obj2Overlay; if (!thisOvl) { thisOvl = j; } if ((thisOvl == objOvl) && (ptrHead->obj2Number == objIdx)) { int verbeOvl = ptrHead->verbOverlay; int obj1Ovl = ptrHead->obj1Overlay; int obj2Ovl = ptrHead->obj2Overlay; if (!verbeOvl) verbeOvl = j; if (!obj1Ovl) obj1Ovl = j; if (!obj2Ovl) obj2Ovl = j; char verbe_name[80]; char obj1_name[80]; char obj2_name[80]; char r_verbe_name[80]; char r_obj1_name[80]; char r_obj2_name[80]; verbe_name[0] = 0; obj1_name[0] = 0; obj2_name[0] = 0; r_verbe_name[0] = 0; r_obj1_name[0] = 0; r_obj2_name[0] = 0; ovlDataStruct *ovl2 = NULL; ovlDataStruct *ovl3 = NULL; ovlDataStruct *ovl4 = NULL; if (verbeOvl > 0) ovl2 = overlayTable[verbeOvl].ovlData; if (obj1Ovl > 0) ovl3 = overlayTable[obj1Ovl].ovlData; if (obj2Ovl > 0) ovl4 = overlayTable[obj2Ovl].ovlData; if ((ovl3) && (ptrHead->obj1Number >= 0)) { testState1 = ptrHead->obj1OldState; } if ((ovl4) && (ptrHead->obj2Number >= 0)) { testState2 = ptrHead->obj2OldState; } if ((ovl4) && (ptrHead->verbNumber >= 0) && ((testState1 == -1) || (testState1 == objectState2)) && ((testState2 == -1) || (testState2 == objectState))) { if (ovl2->nameVerbGlob) { const char *ptr = getObjectName(ptrHead->verbNumber, ovl2->nameVerbGlob); strcpy(verbe_name, ptr); if (!strlen(verbe_name)) attacheNewScriptToTail(&relHead, j, ptrHead->id, 30, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_REL); else if (ovl2->nameVerbGlob) { found = true; int color; if (objectState2 == -2) color = subColor; else color = -1; ptr = getObjectName(ptrHead->obj1Number, ovl3->arrayNameObj); addSelectableMenuEntry(j, i, menuTable[0], 1, color, ptr); } } } } } } } } return found; }
void CruiseEngine::initAllData() { int i; setupFuncArray(); initOverlayTable(); stateID = 0; masterScreen = 0; freeDisk(); soundList[0].frameNum = -1; soundList[1].frameNum = -1; soundList[2].frameNum = -1; soundList[3].frameNum = -1; menuTable[0] = NULL; for (i = 0; i < 2000; i++) { globalVars[i] = 0; } for (i = 0; i < 8; i++) { backgroundTable[i].name[0] = 0; } for (i = 0; i < NUM_FILE_ENTRIES; i++) { filesDatabase[i].subData.ptr = NULL; filesDatabase[i].subData.ptrMask = NULL; } initBigVar3(); resetPtr2(&procHead); resetPtr2(&relHead); resetPtr(&cellHead); resetActorPtr(&actorHead); resetBackgroundIncrustList(&backgroundIncrustHead); bootOverlayNumber = loadOverlay("AUTO00"); #ifdef DUMP_SCRIPT loadOverlay("TITRE"); loadOverlay("TOM"); loadOverlay("XX2"); loadOverlay("SUPER"); loadOverlay("BEBE1"); loadOverlay("BIBLIO"); loadOverlay("BRACAGE"); loadOverlay("CONVERS"); loadOverlay("DAF"); loadOverlay("DAPHNEE"); loadOverlay("DESIRE"); loadOverlay("FAB"); loadOverlay("FABIANI"); loadOverlay("FIN"); loadOverlay("FIN01"); loadOverlay("FINBRAC"); loadOverlay("GEN"); loadOverlay("GENDEB"); loadOverlay("GIFLE"); loadOverlay("HECTOR"); loadOverlay("HECTOR2"); loadOverlay("I00"); loadOverlay("I01"); loadOverlay("I04"); loadOverlay("I06"); loadOverlay("I07"); loadOverlay("INVENT"); loadOverlay("JULIO"); loadOverlay("LOGO"); loadOverlay("MANOIR"); loadOverlay("MISSEL"); loadOverlay("POKER"); loadOverlay("PROJ"); loadOverlay("REB"); loadOverlay("REBECCA"); loadOverlay("ROS"); loadOverlay("ROSE"); loadOverlay("S01"); loadOverlay("S02"); loadOverlay("S03"); loadOverlay("S04"); loadOverlay("S06"); loadOverlay("S07"); loadOverlay("S08"); loadOverlay("S09"); loadOverlay("S10"); loadOverlay("S103"); loadOverlay("S11"); loadOverlay("S113"); loadOverlay("S12"); loadOverlay("S129"); loadOverlay("S131"); loadOverlay("S132"); loadOverlay("S133"); loadOverlay("int16"); loadOverlay("S17"); loadOverlay("S18"); loadOverlay("S19"); loadOverlay("S20"); loadOverlay("S21"); loadOverlay("S22"); loadOverlay("S23"); loadOverlay("S24"); loadOverlay("S25"); loadOverlay("S26"); loadOverlay("S27"); loadOverlay("S29"); loadOverlay("S30"); loadOverlay("S31"); loadOverlay("int32"); loadOverlay("S33"); loadOverlay("S33B"); loadOverlay("S34"); loadOverlay("S35"); loadOverlay("S36"); loadOverlay("S37"); loadOverlay("SHIP"); loadOverlay("SUPER"); loadOverlay("SUZAN"); loadOverlay("SUZAN2"); loadOverlay("TESTA1"); loadOverlay("TESTA2"); //exit(1); #endif if (bootOverlayNumber) { positionInStack = 0; attacheNewScriptToTail(&procHead, bootOverlayNumber, 0, 20, 0, 0, scriptType_PROC); scriptFunc2(bootOverlayNumber, &procHead, 1, 0); } strcpy(lastOverlay, "AUTO00"); _gameSpeed = GAME_FRAME_DELAY_1; _speedFlag = false; return; }
void callRelation(menuElementSubStruct *pMenuElement, int nObj2) { if (pMenuElement == NULL) return; menuElementSubStruct* pCurrent = pMenuElement; while (pCurrent != NULL) { int ovlIdx = pCurrent->ovlIdx; int header = pCurrent->header; linkDataStruct* pHeader = &overlayTable[ovlIdx].ovlData->arrayMsgRelHeader[header]; if (pHeader->obj2Number == nObj2) { // REL if (pHeader->type == RT_REL) { if (currentScriptPtr) { attacheNewScriptToTail(&relHead, ovlIdx, pHeader->id, 30, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_REL); } else { attacheNewScriptToTail(&relHead, ovlIdx, pHeader->id, 30, 0, 0, scriptType_REL); } if ((narratorOvl > 0) && (pHeader->trackX != -1) && (pHeader->trackY != -1)) { actorStruct* pTrack = findActor(&actorHead, narratorOvl, narratorIdx, 0); if (pTrack) { animationStart = false; if (pHeader->trackDirection == 9999) { objectParamsQuery naratorParams; getMultipleObjectParam(narratorOvl, narratorIdx, &naratorParams); pTrack->x_dest = naratorParams.X; pTrack->y_dest = naratorParams.Y; pTrack->endDirection = direction(naratorParams.X, naratorParams.Y, pTrack->x_dest, pTrack->y_dest, 0, 0); } else if ((pHeader->trackX == 9999) && (pHeader->trackY == 9999)) { objectParamsQuery naratorParams; getMultipleObjectParam(narratorOvl, narratorIdx, &naratorParams); pTrack->x_dest = naratorParams.X; pTrack->y_dest = naratorParams.Y; pTrack->endDirection = pHeader->trackDirection; } else { pTrack->x_dest = pHeader->trackX; pTrack->y_dest = pHeader->trackY; pTrack->endDirection = pHeader->trackDirection; } pTrack->flag = 1; autoTrack = true; userEnabled = 0; changeScriptParamInList(ovlIdx, pHeader->id, &relHead, 0, 9998); } } } else if (pHeader->type == RT_MSG) { // MSG int obj1Ovl = pHeader->obj1Overlay; if (!obj1Ovl) obj1Ovl = ovlIdx; int x = 60; int y = 40; if (pHeader->obj1Number >= 0) { objectParamsQuery params; getMultipleObjectParam(obj1Ovl, pHeader->obj1Number, ¶ms); if (narratorOvl > 0) { if ((pHeader->trackX != -1) && (pHeader->trackY != -1) && (pHeader->trackX != 9999) && (pHeader->trackY != 9999)) { x = pHeader->trackX - 100; y = pHeader->trackY - 150; } else { getMultipleObjectParam(narratorOvl, narratorIdx, ¶ms); x = params.X - 100; y = params.Y - 150; } } else if (params.scale >= 0) { x = params.X - 100; y = params.Y - 40; } if (pHeader->obj1NewState != -1) { objInit(obj1Ovl, pHeader->obj1Number, pHeader->obj1NewState); } } if (currentScriptPtr) { createTextObject(&cellHead, ovlIdx, pHeader->id, x, y, 200, findHighColor(), masterScreen, currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber); } else { createTextObject(&cellHead, ovlIdx, pHeader->id, x, y, 200, findHighColor(), masterScreen, 0, 0); } userWait = 1; autoOvl = ovlIdx; autoMsg = pHeader->id; if ((narratorOvl > 0) && (pHeader->trackX != -1) && (pHeader->trackY != -1)) { actorStruct* pTrack = findActor(&actorHead, narratorOvl, narratorIdx, 0); if (pTrack) { animationStart = false; if (pHeader->trackDirection == 9999) { objectParamsQuery naratorParams; getMultipleObjectParam(narratorOvl, narratorIdx, &naratorParams); pTrack->x_dest = naratorParams.X; pTrack->y_dest = naratorParams.Y; pTrack->endDirection = direction(naratorParams.X, naratorParams.Y, pTrack->x_dest, pTrack->y_dest, 0, 0); } else if ((pHeader->trackX == 9999) && (pHeader->trackY == 9999)) { objectParamsQuery naratorParams; getMultipleObjectParam(narratorOvl, narratorIdx, &naratorParams); pTrack->x_dest = naratorParams.X; pTrack->y_dest = naratorParams.Y; pTrack->endDirection = pHeader->trackDirection; } else { pTrack->x_dest = pHeader->trackX; pTrack->y_dest = pHeader->trackY; pTrack->endDirection = pHeader->trackDirection; } pTrack->flag = 1; autoTrack = true; userWait = 0; userEnabled = 0; freezeCell(&cellHead, ovlIdx, pHeader->id, 5, -1, 0, 9998); } } } } else { linkedRelation = pMenuElement; } pCurrent = pCurrent->pNext; } }