void CModelViewRender::PlayAnimation( bool bLoop, int nAnimationId )
{
    if (0 <= nAnimationId)
    {
        m_bLoop = bLoop;
        ANIMATIONSEQUENCE sequence;
        sequence.push_back(nAnimationId);
        PlaySequence(sequence);
    }
}
void DefineEEMacros (void) {
	unsigned int sequence = 0;
	unsigned int prevStart;

	PWM_Set (0, 0, 0, 0);	
	Seq_Find(sequence);
	prevStart = ReadWord(STARTSEQADD);
	if (prevStart == PLAYMACROS) prevStart = 0;	
	do {
		PlaySequence(sequence);
		if (PushButtons_Pressed(BUTTON1)) {
			// advance to next sequence	
			PWM_Set (0, 0, 0, 0);
			PushButtons_Clear(BUTTON1);
			sequence++;
			if (sequence >= Seq_Count()) sequence = 0;
			Seq_Find(sequence);
		}
		if (PushButtons_Pressed(BUTTON2)) {
			// add sequence to EEPROM	
			PWM_Set (0, 0, 0, 0);
			PushButtons_Clear(BUTTON2);
			if (Macros_Add(sequence)) {
				ConfirmCommand();
			} else Error();
		}	
	} while (!PushButtons_Held(BUTTON2));
	PushButtons_Clear(BUTTON2);
	
	if (Macros_Count() != 0) {
		WriteWord(STARTSEQADD, PLAYMACROS);	 	// enable macro playback
	} else {
		// restore previous playback mode
		WriteWord(STARTSEQADD, prevStart);		// enable normal playback		
	}	
	ConfirmCommand();
	ConfirmCommand();
	InitMode();	
}
void CModelViewRender::PlaySequence( bool bLoop, ANIMATIONSEQUENCE &animationSequence )
{
    m_bLoop = bLoop;
    m_AnimationSequence = animationSequence;
    PlaySequence(m_AnimationSequence);
}
示例#4
0
void MisCheck(char plr, char mpad)
{
    int tomflag = 0; // toms checking flag
    int val, safety, save, PROBLEM, i, lc, durxx;
    struct XFails Now;
    unsigned char gork = 0;

    lc = 0; /* XXX check uninitialized */

    STEPnum = STEP;
    FINAL = STEP = MFlag = 0; // Clear Everything
    Unm = MANNED[0] + MANNED[1];
    Dock_Skip = 0; // used for mission branching
    MPad = mpad;
    SCRUBS = noDock = InSpace = 0;



    if (!AI[plr] && !fullscreenMissionPlayback) {
        //FadeOut(1,pal,100,128,1);
        if (plr == 1) {
            fill_rectangle(189, 173, 249, 196, 55);

            for (i = 190; i < 250; i += 2) {
                display::graphics.legacyScreen()->setPixel(i, 178, 61);
                display::graphics.legacyScreen()->setPixel(i, 184, 61);
                display::graphics.legacyScreen()->setPixel(i, 190, 61);
            }

            lc = 191;
        } else if (plr == 0) {
            fill_rectangle(73, 173, 133, 196, 55);

            for (i = 73; i < 133; i += 2) {
                display::graphics.legacyScreen()->setPixel(i, 178, 61);
                display::graphics.legacyScreen()->setPixel(i, 184, 61);
                display::graphics.legacyScreen()->setPixel(i, 190, 61);
            }

            lc = 76;
        }
    } // END if (!AI[plr])

    if (!AI[plr] && !fullscreenMissionPlayback) {
        Tick(2);
    }

    Mev[0].trace = 0;
    death = 0;

    durxx = durx = -1;

    if (Data->P[plr].Mission[mpad].Duration > 0) {
        durxx = Data->P[plr].Mission[mpad].Duration - 1;
        Data->P[plr].Mission[mpad].Duration = 0;
    }

    if (JOINT == 1) {
        durxx = MAX(durxx, Data->P[plr].Mission[mpad + 1].Duration - 1);
        Data->P[plr].Mission[mpad + 1].Duration = 0;
    }

    do {
        if (STEP > 30 || STEP < 0) {
            delay(20);
        }

        if (Dock_Skip == 1) {
            if (Mev[Mev[STEP].trace].loc == 8) {
                Mev[STEP].trace++;    // skip over docking.
            }
        }

        if (Mev[STEP].loc == 16 && Mis.PCat[4] == 22) {
            FirstManOnMoon(plr, 0, Mis.Index);
        }

        // Duration Hack Part 1 of 3   (during the Duration stuff)
        if ((Mev[STEP].loc == 27 || Mev[STEP].loc == 28) && durx > 0) {

            if (Mev[STEP].StepInfo != 1) {
                Data->P[plr].Mission[MPad + Mev[STEP].pad].Duration = 1; //Original code would also return 1
                durx = -1; // end durations
            } else {
                Data->P[plr].Mission[MPad + Mev[STEP].pad].Duration++;
                durx--;

                if ((Data->Def.Lev1 == 0 && plr == 0) || (Data->Def.Lev2 == 0 && plr == 1)) {
                    Mev[STEP].dice = MisRandom();
                } else {
                    Mev[STEP].dice = brandom(100) + 1;
                }

                Mev[STEP].rnum = brandom(10000); // reroll failure type
                Mev[STEP].trace = STEP;
            }
        }

        if (Mev[STEP].Name[0] == 'A' || Mev[STEP].StepInfo == 9 || Mev[STEP].StepInfo == 19) {
            STEP = Mev[STEP].trace;
        } else {
            if (Mev[STEP].trace != 0) {
                STEP = Mev[STEP].trace;
            } else {
                Mev[STEP].trace = STEP + 1;
                STEP++;
            }
        }

        // Duration Hack Part 2 of 3    (set up durx for duration use)
        if ((Mev[STEP].loc == 27 || Mev[STEP].loc == 28) && durx == -1) {
            durx = durxx - 1;
            Data->P[plr].Mission[MPad + Mev[STEP].pad].Duration = 2;
        }

        if (Mev[STEP].Name[0] == 'A') {
            display::graphics.setForegroundColor(11);

            if (!AI[plr] && !fullscreenMissionPlayback) {
                if (plr == 0) {
                    x = 5;
                    y = 112;
                    fill_rectangle(2, 107, 140, 115, 3);
                } else {
                    x = 82, y = 8;
                    fill_rectangle(78, 2, 241, 10, 3);
                }

                draw_string(x, y, "COUNTDOWN");

                if (plr == 0) {
                    fill_rectangle(188, 107, 294, 113, 3);
                    display::graphics.setForegroundColor(1);
                    draw_string(190, 112, (Mev[STEP].pad == 0) ? "PRIMARY LAUNCH" : "SECOND LAUNCH");
                } else {
                    fill_rectangle(244, 56, 314, 62, 3);
                    display::graphics.setForegroundColor(1);
                    draw_string(246, 61, (Mev[STEP].pad == 0) ? "PRIMARY PAD" : "SECOND PAD");
                }

            }

            memset(Name, 0x00, sizeof Name);
            strcpy(Name, Mev[STEP].Name);
            Name[0] = '#'; // Launch Code
            PlaySequence(plr, STEP, Name, 0); // Special Case #47236
        };

        // Necessary to keep code from crashing on bogus mission step
        while (Mev[STEP].E == NULL) {
            STEP++;
        }

        // Draw Mission Step Name
        if (!AI[plr] && !fullscreenMissionPlayback) {
            if (!(fEarly && STEP != 0)) {
                if (plr == 0) {
                    x = 5;
                    y = 112;
                    fill_rectangle(2, 107, 140, 115, 3);
                } else {
                    x = 82, y = 8;
                    fill_rectangle(78, 2, 241, 10, 3);
                }

                display::graphics.setForegroundColor(11);
                MisStep(x, y, Mev[STEP].loc);

                if (plr == 0) {
                    fill_rectangle(188, 107, 294, 113, 3);
                    display::graphics.setForegroundColor(1);
                    draw_string(190, 112, (Mev[STEP].pad == 0) ? "PRIMARY LAUNCH" : "SECOND LAUNCH");
                } else {
                    fill_rectangle(244, 56, 314, 62, 3);
                    display::graphics.setForegroundColor(1);
                    draw_string(246, 61, (Mev[STEP].pad == 0) ? "PRIMARY PAD" : "SECOND PAD");
                }
            }
        }


        // SAFETY FACTOR STUFF

        safety = Mev[STEP].E->MisSaf;

        if ((Mev[STEP].Name[0] == 'A') && MH[Mev[STEP].pad][7] != NULL) {
            // boosters involved
            safety = RocketBoosterSafety(safety, MH[Mev[STEP].pad][7]->Safety);
        }

        // Duration Hack Part 3 of 3
        if (Mev[STEP].loc == 28 || Mev[STEP].loc == 27) {
            safety = Mev[STEP].E->MisSaf; // needs to be for both

            if (InSpace == 2) {
                safety = (MH[0][0]->MisSaf + MH[1][0]->MisSaf) / 2;    //joints
            }
        }

        if (strncmp(Mev[STEP].E->Name, "DO", 2) == 0) {
            if (Mev[STEP].loc == 1 || Mev[STEP].loc == 2) {
                safety = Mev[STEP].E->MSF;
            }
        }

        val = Mev[STEP].dice;
        safety += Mev[STEP].asf;

        if (safety >= 100) {
            safety = 99;
        }

        save = (Mev[STEP].E->SaveCard == 1) ? 1 : 0;

        PROBLEM = val > safety;

        if (!AI[plr] && options.want_cheats) {
            PROBLEM = 0;
        }

        DEBUG6("step %c:%s safety %d rolled %d%s", Mev[STEP].Name[0], S_Name[Mev[STEP].loc],
               safety, val,
               PROBLEM ? " problem" : (options.want_cheats ? " cheating" : ""));

        if (!AI[plr] && !fullscreenMissionPlayback)
            if (!(fEarly && STEP != 0)) {
                lc = MCGraph(plr, lc, MAX(0, safety), MAX(0, val), PROBLEM);    // Graph Chart
            }

        if (PROBLEM && save == 1) {  // Failure Saved
            Mev[STEP].E->SaveCard--;    // Deduct SCard
            PROBLEM = 0; // Fix problem
        }


        // Fix wrong anim thing for the Jt Durations
        if (Mev[STEP].loc == 28 || Mev[STEP].loc == 27) {
            strcpy(Mev[STEP].Name, (plr == 0) ? "_BUSC0\0" : "_BSVC0");
            Mev[STEP].Name[5] = Mev[STEP].E->ID[1];
        }

        if (PROBLEM == 1) {  //Step Problem
            // for the unmanned mission
            if (MANNED[Mev[STEP].pad] == 0 && MANNED[other(Mev[STEP].pad)] == 0) {
                Mev[STEP].rnum = (-1) * (brandom(5) + 1);
            }

            // Unmanned also
            if (MANNED[Mev[STEP].pad] == 0 && noDock == 0) {
                Mev[STEP].rnum = (-1) * (brandom(5) + 1);
            }

            memset(&Now, 0x00, sizeof Now);


            //***************TC Special little HMOON EVA FAILURE FIX

            tomflag = 0;

            if (Mev[STEP].Name[0] == 'H' && Mev[STEP].Name[1] == 'M') {

                gork = Data->P[plr].Mission[mpad].Prog;

                if (gork == 2) {
                    strcpy(Mev[STEP].Name, (plr == 0) ? "HUM3C1" : "HSM3C1");
                } else if (gork == 3) {
                    strcpy(Mev[STEP].Name, (plr == 0) ? "HUM3C2" : "HSM3C2");
                } else {
                    strcpy(Mev[STEP].Name, (plr == 0) ? "HUM3C3" : "HSM3C3");
                }

                tomflag = 1;
            };



            //:::::: Failure docking klugge

            if (Mev[STEP].Name[0] == 'I') {
                gork = Data->P[plr].Mission[mpad].Prog;

                if (gork == 2) {
                    strcpy(Mev[STEP].Name, (plr == 0) ? "IUM4C1" : "ISM4C1");
                } else if (gork == 3) {
                    strcpy(Mev[STEP].Name, (plr == 0) ? "IUM4C2" : "ISM4C2");
                } else {
                    strcpy(Mev[STEP].Name, (plr == 0) ? "IUM4C3" : "ISM4C3");
                }
            };

// *********** TOM's FAIL HMOON KLUDGE

            // if HMOON FAILURE
            if (tomflag) {
                GetFailStat(&Now, Mev[STEP].FName, 7595);
            } else {
                DEBUG3("Failing !tomflag - calling GetFailStat(&Now, Mev[STEP].FName %s, MEV[STEP].rnum %d))", Mev[STEP].FName, Mev[STEP].rnum);
                GetFailStat(&Now, Mev[STEP].FName, Mev[STEP].rnum);     // all others
            }


            memset(Name, 0x00, sizeof Name);
            memcpy(Name, Mev[STEP].Name, strlen(Mev[STEP].Name)); // copy orig failure
            Name[strlen(Name)] = 0x30 + (Now.fail / 10);
            Name[strlen(Name)] = 0x30 + Now.fail % 10;
            Name[strlen(Name)] = 0x00;




            //:::::: STEP FAILURE :::::::::
            //:::::::::::::::::::::::::::::

            PlaySequence(plr, STEP, Name, 1);

            if (!AI[plr]) {
                Tick(2);    //reset dials
            }

            FailEval(plr, Now.code, Now.text, Now.val, Now.xtra);
        } else {   // Step Success

            if (Mev[STEP].loc == 28 || Mev[STEP].loc == 27) {
                strcpy(Mev[STEP].Name, (plr == 0) ? "bUC0" : "bSC0");
                Mev[STEP].Name[5] = Mev[STEP].E->ID[1];
            }

            if (strncmp(Mev[STEP].E->Name, "DO", 2) == 0) {
                if (Mev[STEP].loc == 2) {
                    Data->P[plr].DockingModuleInOrbit = 2;
                }
            }

            //::::::::::::::::::::::::::::::::::
            //::: SUCCESS: Docking klugge ::::::
            //::::::::::::::::::::::::::::::::::
            if (Mev[STEP].Name[0] == 'I') {
                gork = Data->P[plr].Mission[mpad].Prog;

                if (gork == 2) {
                    strcpy(Mev[STEP].Name, (plr == 0) ? "IUM4C1" : "ISM4C1");
                } else if (gork == 3) {
                    strcpy(Mev[STEP].Name, (plr == 0) ? "IUM4C2" : "ISM4C2");
                } else {
                    strcpy(Mev[STEP].Name, (plr == 0) ? "IUM4C3" : "ISM4C3");
                }
            };

            if (Mev[STEP].Name[0] == 'e' && Data->P[plr].Mission[mpad].MissionCode == Mission_LunarFlyby) {
                strcpy(Mev[STEP].Name, (plr == 0) ? "VUP1" : "VSP1");
            }

            //:::::: STEP SUCCESS :::::::::
            //:::::::::::::::::::::::::::::
            // FemaleAstronautsAllowed step klugge
            // third parameter (0 -> MALE) (2 -> FEMALE)
            //:::::::::::::::::::::::::::::

            gork = ((MA[0][0].A != NULL && MA[0][0].A->Sex && EVA[0] == 0)
                    || (MA[0][1].A != NULL && MA[0][1].A->Sex && EVA[0] == 1)
                    || (MA[0][2].A != NULL && MA[0][2].A->Sex && EVA[0] == 2)
                    || (MA[0][3].A != NULL && MA[0][3].A->Sex && EVA[0] == 3)
                    || (MA[1][0].A != NULL && MA[1][0].A->Sex && EVA[1] == 0)
                    || (MA[1][1].A != NULL && MA[1][1].A->Sex && EVA[1] == 1)
                    || (MA[1][2].A != NULL && MA[1][2].A->Sex && EVA[1] == 2)
                    || (MA[1][3].A != NULL && MA[1][3].A->Sex && EVA[1] == 3));

            //if (!((mcc==9 || mcc==11) && (Mev[STEP].Name[0]=='W')))
            PlaySequence(plr, STEP, Mev[STEP].Name, (gork == 1) ? 2 : 0); // Play Animations

            if (Mev[STEP].sgoto == 100) {
                Mev[STEP].trace = 0x7F;
            } else if (Mev[STEP].sgoto != 0) {
                Mev[STEP].trace = Mev[STEP].sgoto;
            } else {
                Mev[STEP].trace = STEP + 1;
            }

            if (!(strncmp(Mev[STEP].E->Name, "DO", 2) == 0 && Mev[STEP].loc == 0x02)) {
                Mev[STEP].E->MisSucc++; // set for all but docking power on
            }

            Mev[STEP].StepInfo = 1;

            // Bottom of success statement
        }

        if (Mev[STEP].loc == 0x7f || Mev[STEP].sgoto == 100) { // force mission end
            Mev[STEP].trace = 0x7f;
        }

        if ((mcc == 10 || mcc == 12 || mcc == 13) && STEP == 2) {
            Mev[STEP].trace = 0x7f;
        }

        if (STEP > 30 || STEP < 0) {
            delay(20);
        }

        if (Mev[STEP].Prest != 0) {
            pAry[pCnt++] = STEP;
        }

        if (Mev[STEP].sgoto == Mev[STEP].fgoto && Mev[STEP].trace != 0x7f) {
            Mev[STEP].trace = Mev[STEP].sgoto;
        }

        if (Mev[STEP].loc == 8 && Mev[STEP].StepInfo == 1) {
            noDock = 1;
        }

        if (Mev[STEP].loc == 0 && MANNED[Mev[STEP].pad] > 0) {
            InSpace++;
        }

        if (Mev[STEP].loc == 4 && MANNED[Mev[STEP].pad] > 0) {
            InSpace--;
        }

        // these two lines fix a problem with Lab Missions failing on launch and
        // ending the mission.
        // Yet another in the ongoing series of special cases.
        //

        if (Mev[STEP].trace == 0x7f && STEP == 3) {
            switch (Mis.Index) {
            case 19:
            case 22:
            case 23:
            case 30:
            case 32:
            case 35:
            case 36:
            case 37:
                InSpace = 1;
                Mev[STEP].trace = Mev[STEP].dgoto;

            default:
                break;
            }
        }

//  if (Mev[STEP].trace==0x7f && InSpace>0) Mev[STEP].trace=STEP+1;

    } while (Mev[STEP].trace != 0x7f);         // End mission

    //end do
    if (!AI[plr] && death == 0) {
        delay(1000);
    }

    if ((MA[0][0].A != NULL && MA[0][0].A->Status == AST_ST_DEAD)
        || (MA[0][1].A != NULL && MA[0][1].A->Status == AST_ST_DEAD)
        || (MA[0][2].A != NULL && MA[0][2].A->Status == AST_ST_DEAD)
        || (MA[0][3].A != NULL && MA[0][3].A->Status == AST_ST_DEAD)
        || (MA[1][0].A != NULL && MA[1][0].A->Status == AST_ST_DEAD)
        || (MA[1][1].A != NULL && MA[1][1].A->Status == AST_ST_DEAD)
        || (MA[1][2].A != NULL && MA[1][2].A->Status == AST_ST_DEAD)
        || (MA[1][3].A != NULL && MA[1][3].A->Status == AST_ST_DEAD)) {
        // Mission Death
        if (!AI[plr]) {
            if (!fullscreenMissionPlayback) {
                display::AutoPal p(display::graphics.legacyScreen());
                memset(&p.pal[64 * 3], 0x00, 64 * 3); //Specs: 0x08

                if (plr == 0) {
                    fill_rectangle(2, 107, 140, 115, 3);
                } else {
                    fill_rectangle(78, 2, 241, 10, 3);
                }

                if (plr == 0) {
                    fill_rectangle(188, 107, 294, 113, 3);
                } else {
                    fill_rectangle(244, 56, 314, 62, 3);
                }
            }

            PlaySequence(plr, STEP, (plr == 0) ? "UFUN" : "SFUN", 0);
        }

        if (!AI[plr]) {
            delay(1000);
        }

        death = 1;
    } else {
        death = 0;
    };

    return;
}