⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 missions.cpp

📁 打飞机的过关游戏(linux)
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "missions.h"

// God, I hate this file! :((

void initPlanetMissions(signed char system)
{
	for (int i = 0 ; i < 10 ; i++)
	{
		systemPlanet[i].missionNumber = -1; // no mission for this planet
		systemPlanet[i].missionCompleted = 1;
	}

	switch(system)
	{
		// Spirit
		case 0:
			for (int i = 0 ; i < 4 ; i++)
			{
				systemPlanet[i].missionNumber = i + 1;
				systemPlanet[i].missionCompleted = 0;
			}

			systemPlanet[4].missionNumber = 5;
			systemPlanet[4].missionCompleted = -1;

			break;

		// Eyananth
		case 1:
			systemPlanet[0].missionNumber = 7;
			systemPlanet[0].missionCompleted = 0;

			systemPlanet[1].missionNumber = 8;
			systemPlanet[1].missionCompleted = 0;

			systemPlanet[2].missionNumber = 9;
			systemPlanet[2].missionCompleted = -1;

			systemPlanet[3].missionNumber = 10;
			systemPlanet[3].missionCompleted = -1;

			systemPlanet[4].missionNumber = 11;
			systemPlanet[4].missionCompleted = -2;

			// This one is for the slaves
			systemPlanet[9].missionNumber = 6;
			systemPlanet[9].missionCompleted = 0;

			break;

		// Mordor
		case 2:
			systemPlanet[0].missionNumber = 13;
			systemPlanet[0].missionCompleted = 0;

			systemPlanet[1].missionNumber = 14;
			systemPlanet[1].missionCompleted = 0;

			systemPlanet[2].missionNumber = 15;
			systemPlanet[2].missionCompleted = -1;

			systemPlanet[3].missionNumber = 16;
			systemPlanet[3].missionCompleted = -1;

			systemPlanet[4].missionNumber = 17;
			systemPlanet[4].missionCompleted = -2;

			systemPlanet[5].missionNumber = 18;
			systemPlanet[5].missionCompleted = -3;

			// This one is for the experimental fighter
			systemPlanet[9].missionNumber = 12;
			systemPlanet[9].missionCompleted = 0;

			break;

		// Sol
		case 3:
			systemPlanet[8].missionNumber = 19;
			systemPlanet[8].missionCompleted = 0;

			systemPlanet[7].missionNumber = 20;
			systemPlanet[7].missionCompleted = 0;

			systemPlanet[6].missionNumber = 21;
			systemPlanet[6].missionCompleted = 0;

			systemPlanet[5].missionNumber = 22;
			systemPlanet[5].missionCompleted = -1;

			systemPlanet[4].missionNumber = 23;
			systemPlanet[4].missionCompleted = -2;

			systemPlanet[3].missionNumber = 24;
			systemPlanet[3].missionCompleted = -3;

			systemPlanet[2].missionNumber = 25;
			systemPlanet[2].missionCompleted = -4;

			systemPlanet[1].missionNumber = 26;
			systemPlanet[1].missionCompleted = -5;

			break;
	}
}

void checkForBossMission()
{
	for (int i = 0 ; i < 10 ; i++)
	{
		if ((systemPlanet[i].missionCompleted == 0) && (systemPlanet[i].missionNumber != -1))
			return;
	}

	for (int i = 0 ; i < 10 ; i++)
	{
		if (systemPlanet[i].missionCompleted < 0)
			systemPlanet[i].missionCompleted++;
	}
}

void updateSystemStatus()
{
	if (currentGame.area == 0)
	{
		currentGame.stationedPlanet = 0;
		currentGame.area = 1;
		strcpy(currentGame.stationedName, "Hail");
		initPlanetMissions(currentGame.system);
	}
	else if (currentGame.area == 5)
	{
		currentGame.stationedPlanet = 0;
		currentGame.system = 1;
		currentGame.area = 6;
		strcpy(currentGame.stationedName, "Nerod");
		initPlanetMissions(currentGame.system);

		currentGame.shieldUnits = 2;
	}
	else if (currentGame.area == 11)
	{
		currentGame.stationedPlanet = 0;
		currentGame.system = 2;
		currentGame.area = 12;
		strcpy(currentGame.stationedName, "Odeon");
		initPlanetMissions(currentGame.system);

		currentGame.shieldUnits = 3;
	}
	else if (currentGame.area == 18)
	{
		currentGame.stationedPlanet = 8;
		currentGame.system = 3;
		currentGame.area = 19;
		strcpy(currentGame.stationedName, "Pluto");
		initPlanetMissions(currentGame.system);

		currentGame.shieldUnits = 4;
	}
	else // Update the mission for the planet
	{
		systemPlanet[currentGame.stationedPlanet].missionCompleted = 1;
	}

	strcpy(currentGame.destinationName, "None");
	currentGame.destinationPlanet = currentGame.stationedPlanet;
}

/*
Mission Completed Variables:

0  : Not Completed
1  : Completed
2  : Just Completed
3  : Constraint
-1 : Mission Failed
-2 : Just Failed

Timer Variable:
1+ : Time in minutes
-1 : Time up
-2 : No timer
*/
void clearAllMissions()
{
	for (int m = 0 ; m < MAX_MISSIONS ; m++)
	{
		for (int i = 0 ; i < 3 ; i++)
		{
			strcpy(missions[m].primaryObjective[i], "");
			missions[m].primaryType[i] = NONE;
			missions[m].target1[i] = -1;
			missions[m].targetValue1[i] = -1;
			missions[m].timeLimit1[i] = -2;
			missions[m].completed1[i] = 1;
		}

		for (int i = 0 ; i < 3 ; i++)
		{
			strcpy(missions[m].secondaryObjective[i], "");
			missions[m].secondaryType[i] = NONE;
			missions[m].target2[i] = -1;
			missions[m].targetValue2[i] = -1;
			missions[m].timeLimit2[i] = -2;
			missions[m].completed2[i] = 1;
		}

		missions[m].addAliens = -1;
	}
}

/*
Sets the currentMission object to the mission number the player
is currently on. Timing is assigned if it is required. The rate
at which to add enemies in this mission is also set.
*/
void setMission(int mission)
{
	currentMission = missions[mission];
	engine.minutes = currentMission.timeLimit1[0];

	for (int i = 0 ; i < 3 ; i++)
	{
		if (currentMission.timeLimit1[i] > engine.minutes)
			engine.minutes = currentMission.timeLimit1[i];
		if (currentMission.timeLimit2[i] > engine.minutes)
			engine.minutes = currentMission.timeLimit2[i];

		if (currentMission.completed1[i] == 0)
			currentMission.remainingObjectives1++;
		if (currentMission.completed2[i] == 0)
			currentMission.remainingObjectives1++;
	}

	engine.addAliens = currentMission.addAliens;

	if (engine.minutes > -1)
	{
		engine.timeMission = 1;
		engine.seconds = 0;
	}

	engine.counter2 = 0;
	engine.timeTaken = 0;
}

void checkTimer()
{
	for (int i = 0 ; i < 3 ; i++)
	{
		if ((currentMission.timeLimit1[i] == -1) && (currentMission.completed1[i] == OB_INCOMPLETE))
			currentMission.completed1[i] = -2;
	}

	for (int i = 0 ; i < 3 ; i++)
	{
		if ((currentMission.timeLimit2[i] == -1) && (currentMission.completed2[i] == OB_INCOMPLETE))
			currentMission.completed2[i] = -2;
	}

	// Find out if there are any uncompleted missions that require the timer
	engine.timeMission = 0;
	for (int i = 0 ; i < 3 ; i++)
	{
		if ((currentMission.timeLimit1[i] > -1) && (currentMission.completed1[i] == OB_INCOMPLETE))
			engine.timeMission = 1;
		if ((currentMission.timeLimit2[i] > -1) && (currentMission.completed2[i] == OB_INCOMPLETE))
			engine.timeMission = 1;
	}

	// specific to Spirit Boss
	if ((currentGame.area == 5) && (currentMission.completed1[0] < OB_INCOMPLETE))
		engine.timeMission = 1;

	// specific to the Asteroid belt
	if ((currentGame.area == 24) && (currentMission.completed1[0] < OB_INCOMPLETE))
	{
		currentMission.completed1[0] = OB_COMPLETED;
		killAllAliens();
		engine.addAliens = -1;
		setInfoLine("*** All Primary Objectives Completed ***", FONT_GREEN);
	}
}

void evaluteRequirement(int type, int id, int value, int *completed, int *targetValue, int fontColor)
{
	char message[25];

	if ((*targetValue <= 0) && (type != M_PROTECT_TARGET) && (type != M_PROTECT_PICKUP))
	{
		*completed = 2;
		checkTimer();
		if ((currentGame.area == 9) && (type == M_DISABLE_TARGET))
			setRadioMessage(FACE_SID, "All vessels disabled!", 1);
	}
	else
	{
		strcpy(message, "");
		switch(type)
		{
			case M_COLLECT:
				switch(id)
				{
					case P_CASH:
						sprintf(message, "Collect $%d more...", *targetValue);
						if ((rand() % 2) == 0)
							sprintf(message, "$%d more to go...", *targetValue);
						break;
					case P_CARGO:
						sprintf(message, "Collect %d more...", *targetValue);
						if ((rand() % 2) == 0)
							sprintf(message, "%d more to go...", *targetValue);
						break;
					case P_ORE:
						sprintf(message, "Collect %d more...", *targetValue);
						if ((rand() % 2) == 0)
							sprintf(message, "%d more to go...", *targetValue);
						break;
				}
				break;
			case M_PROTECT_PICKUP:
				*completed = -2;
				switch(id)
				{
					case P_CARGO:
						sprintf(message, "Cargo pod destroy!");
						if (currentGame.area == 2) // Get lectured by Sid
							setRadioMessage(FACE_SID, "Chris, we needed that pod!! I warned you that we couldn't afford to lose a single one!!", 1);
						break;
					case P_ESCAPEPOD:
						sprintf(message, "Escape Pod lost!");
						if (currentGame.area == 13) // Get lectured by Phoebe
							setRadioMessage(FACE_PHOEBE, "No... Ursula...", 1);
						break;
				}
				break;
			case M_PROTECT_TARGET:
				if (*targetValue <= 0)
				{
					*completed = -2;
					switch (currentGame.area)
					{
						case 7:
							setRadioMessage(FACE_SID, "Dammit, Chris! We just lost her!", 1);
							break;
						case 8:
							setRadioMessage(FACE_CREW, "Noooo!! Hull bre...", 1);
							break;
						case 9:
							setRadioMessage(FACE_SID, "Chris, we've got to disable them, not destroy them!!", 1);
							break;
					}
				}
				break;
			case M_DESTROY_TARGET_TYPE:
				if ((*targetValue <= 10) || (*targetValue % 10 == 0))
				{
					sprintf(message, "Destroy %d more...", *targetValue);
					if ((rand() % 2) == 0)
						sprintf(message, "%d more to go...", *targetValue);
				}
				break;
			case M_DISABLE_TARGET:
				sprintf(message, "Disable %d more...", *targetValue);
				break;
		}

		if (strcmp(message, "") != 0)
			setInfoLine(message, fontColor);
	}
}

void updateMissionRequirements(int type, int id, int value)
{
	// Can't complete missions if you're dead!
	if (engine.missionCompleteTimer != 0)
		return;

	char message[25];
	char matched = 0;

	// We don't need to worry here since if Sid dies,
	// you will automatically fail the mission(!)
	if ((type == M_DESTROY_TARGET_TYPE) && (id == CD_SID))
	{
		setInfoLine("Sid has been killed!!", FONT_RED);
		setRadioMessage(FACE_CHRIS, "Sid... I... I'm sorry...", 1);
		currentMission.completed1[0] = -2;
	}

	for (int i = 0 ; i < 3 ; i++)
	{
		if ((currentMission.completed1[i] == OB_INCOMPLETE) || (currentMission.completed1[i] == OB_CONDITION))
		{
			if ((currentMission.primaryType[i] == type) && ((currentMission.target1[i] == id) || (currentMission.target1[i] == CD_ANY)))
			{
				matched = 1;
				currentMission.targetValue1[i] -= value;
				evaluteRequirement(type, id, value, &currentMission.completed1[i], &currentMission.targetValue1[i], FONT_CYAN);
			}
		}
	}

	// Don't evaluate secondary objectives at the same time!
	if (matched)
		return;

	for (int i = 0 ; i < 3 ; i++)
	{
		if ((currentMission.completed2[i] == OB_INCOMPLETE) || (currentMission.completed2[i] == OB_CONDITION))
		{
			if ((currentMission.secondaryType[i] == type) && ((currentMission.target2[i] == id) || (currentMission.target2[i] == CD_ANY)))
			{
				currentMission.targetValue2[i] -= value;
				evaluteRequirement(type, id, value, &currentMission.completed2[i], &currentMission.targetValue2[i], FONT_YELLOW);
				return;
			}
		}
	}

	// Special Case - Interceptions
	if (currentGame.area == MAX_MISSIONS - 1)
	{
		if ((type == M_COLLECT) && (id == P_SLAVES))
		{
			if (systemPlanet[9].missionCompleted == 0)
			{
				if (currentGame.slavesRescued >= 250)
				{
					setInfoLine("*** Slaves Rescued - Mission Completed ***", FONT_GREEN);
					systemPlanet[9].missionCompleted = 1;
				}
				else
				{
					sprintf(message, "Rescue %d more...", 250 - currentGame.slavesRescued);
					setInfoLine(message, FONT_CYAN);
				}
			}
		}

		if ((type == M_DESTROY_TARGET_TYPE) && (id == CD_CLOAKFIGHTER))
		{
			setInfoLine("*** Experimental Fighter Destroyed - Mission Completed ***", FONT_GREEN);
			systemPlanet[9].missionCompleted = 1;
			setRadioMessage(FACE_CHRIS, "That's one less suprise that WEAPCO can spring on us!", 1);
			currentGame.experimentalShield = 0;
		}
	}
}

/*
This is only used as few times in the game.
Missions 11 and 23 to be exact!
*/
char revealHiddenObjectives()
{
	char allDone = 1;
	char string[255];
	strcpy(string, "");

	for (int i = 0 ; i < 3 ; i++)
	{
		if (currentMission.completed1[i] == OB_HIDDEN)
		{
			currentMission.completed1[i] = OB_INCOMPLETE;
			sprintf(string, "New Objective - %s", currentMission.primaryObjective[i]);
			setInfoLine(string, FONT_CYAN);
			allDone = 0;
		}
	}

	if (!allDone)
	{
		// Activate Kline!! :)
		if (currentGame.area == 11)
		{
			killAllAliens();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -