/** * Save current scene. * @param sd Pointer to the scene data */ void DoSaveScene(SAVED_DATA *sd) { sd->SavedSceneHandle = GetSceneHandle(); sd->SavedBgroundHandle = GetBgroundHandle(); SaveMovers(sd->SavedMoverInfo); sd->NumSavedActors = SaveActors(sd->SavedActorInfo); PlayfieldGetPos(FIELD_WORLD, &sd->SavedLoffset, &sd->SavedToffset); SaveInterpretContexts(sd->SavedICInfo); sd->SavedControl = ControlIsOn(); sd->SavedNoBlocking = GetNoBlocking(); GetNoScrollData(&sd->SavedNoScrollData); if (TinselV2) { // Tinsel 2 specific data save SaveActorZ(sd->savedActorZ); SaveZpositions(sd->zPositions); SavePolygonStuff(sd->SavedPolygonStuff); _vm->_pcmMusic->getTunePlaying(sd->SavedTune, sizeof(sd->SavedTune)); sd->bTinselDim = _vm->_pcmMusic->getMusicTinselDimmed(); sd->SavedScrollFocus = GetScrollFocus(); SaveSysVars(sd->SavedSystemVars); SaveSoundReels(sd->SavedSoundReels); } else { // Tinsel 1 specific data save SaveDeadPolys(sd->SavedDeadPolys); CurrentMidiFacts(&sd->SavedMidi, &sd->SavedLoop); } ASceneIsSaved = true; }
/** * Check for moving actor collision. */ PMOVER InMoverBlock(PMOVER pMover, int x, int y) { int caX; // Calling actor's pos'n int caL, caR; // Calling actor's left and right int taX, taY; // Test actor's pos'n int taL, taR; // Test actor's left and right caX = pMover->objX; if (pMover->hFnpath != NOPOLY || GetNoBlocking()) return NULL; caL = GetMoverLeft(pMover) + x - caX; caR = GetMoverRight(pMover) + x - caX; for (int i = 0; i < MAX_MOVERS; i++) { if (pMover == &g_Movers[i] || (TinselV2 && (g_Movers[i].actorObj == NULL)) || (!TinselV2 && !g_Movers[i].bActive)) continue; // At around the same height? GetMoverPosition(&g_Movers[i], &taX, &taY); if (g_Movers[i].hFnpath != NOPOLY) continue; if (ABS(y - taY) > 2) // 2 was 8 continue; // To the left? taL = GetMoverLeft(&g_Movers[i]); if (caR <= taL) continue; // To the right? taR = GetMoverRight(&g_Movers[i]); if (caL >= taR) continue; return &g_Movers[i]; } return NULL; }