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

📄 aliens.cpp

📁 After decades of war one company, who had gained powerful supplying both sides with weaponary, steps
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*Copyright (C) 2003 Parallel RealitiesThis program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the GNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.*/#include "aliens.h"signed char placeAlien(object *theEnemy){	if (rand() % 2 == 0)		theEnemy->x = Math::rrand(800, 1600);	else		theEnemy->x = Math::rrand(-800, 0);	if (rand() % 2 == 0)		theEnemy->y = Math::rrand(600, 1200);	else		theEnemy->y = Math::rrand(-600, 0);	if (currentGame.area == 24)	{		theEnemy->x = 800;		theEnemy->y = Math::rrand(200, 400);	}	for (int i = 0 ; i < MAX_ALIENS ; i++)	{		if ((enemy[i].owner != theEnemy) && (enemy[i].shield > 0))		{			if (Collision::collision(theEnemy->x, theEnemy->y, theEnemy->image[0]->w, theEnemy->image[0]->h, enemy[i].x, enemy[i].y, enemy[i].image[0]->w, enemy[i].image[0]->h))				return 0;		}	}	return 1;}/*This simply pulls back an alien from the array that is"dead" (no shield) and returns the index number so we can havea new one.*/int getAlien(){	for (int i = 0 ; i < engine.maxAliens ; i++)	{		if (!enemy[i].active)		{			return i;		}	}	return -1;}void addDrone(object *host){	int index = getAlien();	if (index == -1)		return;	enemy[index] = defEnemy[CD_DRONE];	enemy[index].active = 1;	enemy[index].face = rand() % 2;	enemy[index].owner = &enemy[index]; // Most enemies will own themselves	enemy[index].target = &enemy[index];	enemy[index].thinktime = (50 + rand() % 50);	enemy[index].systemPower = enemy[index].maxShield;	enemy[index].deathCounter = 0 - (enemy[index].maxShield * 3);	enemy[index].hit = 0;	enemy[index].x = host->x + rand() % 50;	enemy[index].y = host->y + rand() % 50;}void addSmallAsteroid(object *host){	if (engine.missionCompleteTimer != 0)		return;	int index = -1;	int debris = 1 + rand() % 10;	for (int i = 0 ; i < debris ; i++)		addBullet(&weapon[W_ROCKETS], host, 0, 0);	for (int i = 10 ; i < 20 ; i++)		if (enemy[i].active == 0)			index = i;	if (index == -1)		return;	if ((rand() % 10) > 3)	{		enemy[index] = defEnemy[CD_ASTEROID2];		enemy[index].imageIndex[0] = enemy[index].imageIndex[1] = 39 + rand() % 2;		enemy[index].image[0] = graphics.shipShape[enemy[index].imageIndex[0]];		enemy[index].image[1] = graphics.shipShape[enemy[index].imageIndex[1]];	}	else	{		enemy[index] = defEnemy[CD_DRONE];	}	enemy[index].owner = &enemy[index]; // Most enemies will own themselves	enemy[index].target = &enemy[index];	enemy[index].thinktime = 1;	enemy[index].systemPower = enemy[index].maxShield;	enemy[index].deathCounter = 0 - (enemy[index].maxShield * 3);	enemy[index].hit = 0;	enemy[index].x = host->x;	enemy[index].y = host->y;	enemy[index].active = 1;}signed char addAlien(){	int index = getAlien();	if ((index == -1) || (currentGame.area == 23) || (currentGame.area == 26))		return 0;	signed char *alienArray;	signed char numberOfAliens = 1;	alienArray = new signed char[5];	switch(currentGame.area)	{		case 0:		case 3:		case 11:			numberOfAliens = 1;			alienArray[0] = CD_DUALFIGHTER;			break;		case 1:		case 2:		case 4:		case 5:			numberOfAliens = 2;			alienArray[0] = CD_DUALFIGHTER;			alienArray[1] = CD_PROTOFIGHTER;			break;		case 9:		case 13:		case 14:		case 16:			numberOfAliens = 4;			alienArray[0] = CD_DUALFIGHTER;			alienArray[1] = CD_PROTOFIGHTER;			alienArray[2] = CD_MISSILEBOAT;			alienArray[3] = CD_AIMFIGHTER;			break;		case 25:			numberOfAliens = 6;			alienArray[0] = CD_DUALFIGHTER;			alienArray[1] = CD_PROTOFIGHTER;			alienArray[2] = CD_MISSILEBOAT;			alienArray[3] = CD_AIMFIGHTER;			alienArray[4] = CD_ESCORT;			alienArray[5] = CD_MOBILE_RAY;			break;		case 22:			numberOfAliens = 2;			alienArray[0] = CD_AIMFIGHTER;			alienArray[1] = CD_DUALFIGHTER;			break;		case 7:		case 8:			numberOfAliens = 3;			alienArray[0] = CD_DUALFIGHTER;			alienArray[1] = CD_PROTOFIGHTER;			alienArray[2] = CD_AIMFIGHTER;			break;		case 18:			numberOfAliens = 2;			alienArray[0] = CD_DUALFIGHTER;			alienArray[1] = CD_MINER;			break;		case 10:		case 15:			numberOfAliens = 1;			alienArray[0] = CD_ASTEROID;			break;		case 24:			numberOfAliens = 2;			alienArray[0] = CD_ASTEROID;			alienArray[1] = CD_ASTEROID2;			break;		case MAX_MISSIONS - 1:			numberOfAliens = 3;			alienArray[0] = CD_DUALFIGHTER;			alienArray[1] = CD_MISSILEBOAT;			alienArray[2] = CD_AIMFIGHTER;			if (currentGame.system == 2)			{				numberOfAliens = 4;				alienArray[3] = CD_PROTOFIGHTER;			}			break;		default:			numberOfAliens = 1;			alienArray[0] = CD_DUALFIGHTER;			break;	}	signed char randEnemy = alienArray[rand() % numberOfAliens];	if ((currentGame.area != 10) && (currentGame.area != 15) && (currentGame.area != 24))	{		if ((currentGame.system == 1) && (currentGame.area == MAX_MISSIONS - 1))		{			if ((rand() % 5) == 0)				randEnemy = CD_SLAVETRANSPORT;		}		if ((rand() % 6) == 0)			randEnemy = CD_TRANSPORTSHIP;	}	delete(alienArray);	enemy[index] = defEnemy[randEnemy];	enemy[index].active = 1;	enemy[index].face = rand() % 2;	enemy[index].owner = &enemy[index]; // Most enemies will own themselves	enemy[index].target = &enemy[index];	enemy[index].thinktime = (50 + rand() % 50);	enemy[index].systemPower = enemy[index].maxShield;	enemy[index].deathCounter = 0 - (enemy[index].maxShield * 3);	enemy[index].hit = 0;	Math::limitInt(&enemy[index].deathCounter, -250, 0);	// Attempts to place an alien. If it fails, the alien is deactivated.	for (int i = 0 ; i < 100 ; i++)	{		if (placeAlien(&enemy[index]))			break;		enemy[index].active = 0;		return 0;	}	if (enemy[index].classDef == CD_CARGOSHIP)		addCargo(&enemy[index], P_CARGO);	if (enemy[index].classDef == CD_MOBILE_RAY)		enemy[index].shield = 25;	if (enemy[index].classDef == CD_ESCORT)		enemy[index].shield = 50;	enemy[index].dx = Math::rrand(-2, 2);	enemy[index].dy = Math::rrand(-2, 2);	enemy[index].ammo[0] = 0;	if (currentGame.area == 18)		enemy[index].flags += FL_HASMINIMUMSPEED;	return 1;}void getPreDefinedAliens(){	FILE *fp;	char string[255];	strcpy(string, "");	int index, alienType, placeAttempt;	int barrierSpeed = 1;	sprintf(string, "data/aliens%d.dat", currentGame.area);	#if USEPACK	int dataLocation = locateDataInPak(string, 0);	if (dataLocation == -1)		return;	fp = fopen(PACKLOCATION, "rb");	fseek(fp, dataLocation, SEEK_SET);	#else	fp = fopen(string, "rb");	if (fp == NULL)		return;	#endif	fscanf(fp, "%d ", &index);	while (index != -1)	{		placeAttempt = 0;		fscanf(fp, "%d ", &alienType);		enemy[index] = defEnemy[alienType];		enemy[index].owner = &enemy[index];		enemy[index].target = &enemy[index];		enemy[index].face = rand() % 2;		enemy[index].active = 1;		/*		we make 1000 attempts to place this enemy since it is required. If after 1000 attempts		we still have managed to place the alien, then it simple isn't going to happen and we		will just exit the same. The chances of this happening are very very low!		*/		while (true)		{			placeAttempt++;			if (placeAlien(&enemy[index]))				break;			if (placeAttempt > 1000)				showErrorAndExit(2, "");		}		if (currentGame.area == 2)			addCargo(&enemy[index], P_CARGO);		else if (currentGame.area == 7)			addCargo(&enemy[index], P_PHOEBE);		if (index == WC_KLINE)		{			enemy[WC_KLINE].target = &player;			if (currentGame.area == 25)				enemy[WC_KLINE].shield = 500;		}		if (enemy[index].classDef == CD_CLOAKFIGHTER)		{			enemy[index].active = 0;			enemy[index].maxShield = enemy[index].shield = 400;			enemy[index].flags -= FL_RUNSAWAY;			enemy[index].speed = 3;		}		if ((enemy[index].classDef == CD_MOBILE_RAY) && (index >= 11))		{			enemy[index].active = 0;		}		if (enemy[index].classDef == CD_FIREFLY)		{			enemy[index].active = 0;		}		if (enemy[index].classDef == CD_BARRIER)		{			enemy[index].owner = &enemy[WC_BOSS];			enemy[index].speed = barrierSpeed;			barrierSpeed++;		}		if ((currentGame.area == 17) && (enemy[index].classDef == CD_BOSS))		{			enemy[index].imageIndex[1] = 29;			enemy[index].flags += FL_IMMORTAL;		}		if (currentGame.area == 18)			enemy[index].flags += FL_HASMINIMUMSPEED;		if (currentGame.area == 23)		{			enemy[index].flags = FL_WEAPCO;			if (index == WC_BOSS)				enemy[index].chance[1] = 5;		}		fscanf(fp, "%d ", &index);	}	fclose(fp);	if (currentGame.area == 5)	{		enemy[WC_BOSS].target = &player;		enemy[WC_BOSS].x = -400;		enemy[WC_BOSS].y = 300;		enemy[13].owner = &enemy[WC_BOSS];		enemy[13].target = &player;		enemy[13].dx = -25;		enemy[13].dy = -21;		enemy[12].owner = &enemy[WC_BOSS];		enemy[12].target = &player;		enemy[12].dx = -20;		enemy[12].dy = 37;	}	else if ((currentGame.area == 11) || (currentGame.area == 14))	{		enemy[WC_BOSS].target = &player;		enemy[WC_BOSS].x = -400;		enemy[WC_BOSS].y = 300;		enemy[13].owner = &enemy[WC_BOSS];		enemy[13].target = &player;		enemy[13].dx = 15;		enemy[13].dy = -22;		enemy[12].owner = &enemy[WC_BOSS];		enemy[12].target = &player;		enemy[12].dx = 15;		enemy[12].dy = 22;		enemy[11].owner = &enemy[13];		enemy[11].target = &player;		enemy[11].dx = -35;		enemy[11].dy = -12;		enemy[10].owner = &enemy[12];		enemy[10].target = &player;		enemy[10].dx = -35;		enemy[10].dy = 20;		if (currentGame.area == 14)		{			enemy[WC_BOSS].AIType = AI_EVASIVE;			for (int i = 10 ; i < 15 ; i++)			{				enemy[i].imageIndex[0] += 15;				enemy[i].imageIndex[1] += 15;				enemy[i].image[0] = graphics.shipShape[enemy[i].imageIndex[0]];				enemy[i].image[1] = graphics.shipShape[enemy[i].imageIndex[1]];			}		}	}	else if (currentGame.area == 21)	{		enemy[WC_BOSS].target = &player;		enemy[WC_BOSS].x = 400;		enemy[WC_BOSS].y = 300;		enemy[13].owner = &enemy[WC_BOSS];		enemy[13].dy = 20;		enemy[12].owner = &enemy[WC_BOSS];		enemy[12].dy = -16;	}}void addFriendly(int type){	if (type != FR_SID)		enemy[type] = defEnemy[CD_FRIEND];	else		enemy[type] = defEnemy[CD_SID];	enemy[type].owner = &enemy[type];	enemy[type].target = &enemy[type];	enemy[type].active = 1;	if (rand() % 2 == 0)		enemy[type].x = Math::rrand(400, 550);	else		enemy[type].x = Math::rrand(250, 400);	if (rand() % 2 == 0)		enemy[type].y = Math::rrand(300, 450);	else		enemy[type].y = Math::rrand(150, 300);	if (type == FR_PHOEBE)		enemy[type].classDef = CD_PHOEBE;	if (type == FR_URSULA)		enemy[type].classDef = CD_URSULA;	// For the sake of it being the final battle :)	if (currentGame.area == 25)		enemy[type].flags += FL_IMMORTAL;}void setTarget(int index){	engine.targetIndex = index;	engine.targetShield = 85;	engine.targetShield /= enemy[index].shield;	engine.targetArrowTimer = -1;	if (currentGame.area == 10)		engine.targetArrowTimer = 0;}void initAliens(){	for (int i = 0 ; i < MAX_ALIENS ; i++)	{		enemy[i].active = 0;

⌨️ 快捷键说明

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