Esempio n. 1
0
void	cMonsterSpawn::SideMonsterSpawn( )
{
	if (m_nMaxCount > m_nCount)
	{
		cMonster* pMonster;
		if (m_IsThrow)
		{
			char* pKey = "enemy2";
			bool IsDivide = false;
			float fScale = 0.45f;
			if (rand() % 2)
			{
				IsDivide = true;
				pKey = "enemy3";
				fScale = 2.0f;
			}
			pMonster = CreateMonster(m_vPlayerPosition, pKey);
			pMonster->SetIsDivide(IsDivide);
			pMonster->SetMovePattern(new cThrowMove());
			pMonster->SetGun(new cMonsterGun());
			pMonster->SetScale(pMonster->GetScale() * fScale);
		}
		else
		{
			 pMonster = CreateMonster(m_vPlayerPosition, "enemy");
			 pMonster->SetMovePattern(new cSideMove());

		}
	}
}
Esempio n. 2
0
void
DoSpecificDisaster(disaster_t disaster, UInt16 x, UInt16 y)
{
	Int16 ce = 0;
	Int16 i = 0;

	do {
		switch (disaster) {
		case diFireOutbreak:
			ce = BurnField(x, y, (UInt16)0);
			break;
		case diPlantExplosion:
			ce = 0;
			break;
		case diMonster:
			ce = CreateMonster(x, y);
			break;
		case diDragon:
			ce = CreateDragon(x, y);
			break;
		case diMeteor:
			ce = MeteorDisaster(x, y);
			break;
		default: break;
		}
	} while (i++ < 400 && ce == 0);
	if (ce) {
		UIDisasterNotify(disaster);
		Goto(x, y, goto_center);
		MapHasJumped();
	}
}
Esempio n. 3
0
void	cMonsterSpawn::FrontMonsterSpawn()
{
	if (m_nMaxCount > m_nCount)
	{
		auto pMonster = CreateMonster(m_vPlayerPosition, "enemy");
		pMonster->SetMovePattern(new cRushMove());
		
	}
}
Esempio n. 4
0
// TODO: Items should get their positions from the level file
void World::InitLevelObjects()
{
	RemoveAIEntities();

	LevelMap map = levels[currentLevelIdx].GetMap();

	// Inits monsters
	auto monsterTiles = map.GetTilesForLogicalSprite(TILE_MONSTER);
	for (auto monster = monsterTiles.begin(); monster != monsterTiles.end(); ++monster)
	{
		CreateMonster(monster->position);
	}

	// Inits items
	// TODO: Needs refactoring!
	auto itemPair = itemsForLevel.find(currentLevelIdx + 1); // We use indices corresponding to the 
														     // level files' names
	if (itemPair != itemsForLevel.end())
	{
		auto itemFileNames = itemPair->second;
		for (auto itemFileName = itemFileNames.begin(); itemFileName != itemFileNames.end(); ++itemFileName)
		{
			// Magnificent loading takes place!!!
			InitItemFromFile((*itemFileName));		
		}
	}

	auto shrinePair = shrinesForLevel.find(currentLevelIdx + 1);
	if (shrinePair != shrinesForLevel.end())
	{
		auto shrineFileNames = shrinePair->second;
		for (auto shrineFileName = shrineFileNames.begin(); shrineFileName != shrineFileNames.end(); ++shrineFileName)
		{
			// Magnificent loading takes place!!!
			InitItemFromFile((*shrineFileName));
		}
	}

	// Inits boss
	if (map.HasTileWithLogicalSprite(TILE_BOSS))
	{
		CreateBoss(map.GetTilesForLogicalSprite(TILE_BOSS)[0].position); // TODO: Unsafe. Make better.
	}

	levels[currentLevelIdx].RemoveWorldSpecificTiles();
}
Esempio n. 5
0
void
CarrierSpawn(edict_t *self)
{
	vec3_t f, r, offset, startpoint, spawnpoint;
	edict_t *ent;
	int mytime;

	if (!self)
	{
		return;
	}

	VectorSet(offset, 105, 0, -58);
	AngleVectors(self->s.angles, f, r, NULL);

	G_ProjectSource(self->s.origin, offset, f, r, startpoint);

	/* the +0.1 is because level.time is sometimes a little low */
	mytime = (int)((level.time + 0.1 - self->timestamp) / 0.5);

	if (FindSpawnPoint(startpoint, flyer_mins, flyer_maxs, spawnpoint, 32))
	{
		/* the second flier should be a kamikaze flyer */
		if (mytime != 2)
		{
			ent = CreateMonster(spawnpoint, self->s.angles, "monster_flyer");
		}
		else
		{
			ent = CreateMonster(spawnpoint, self->s.angles, "monster_kamikaze");
		}

		if (!ent)
		{
			return;
		}

		gi.sound(self, CHAN_BODY, sound_spawn, 1, ATTN_NONE, 0);

		self->monsterinfo.monster_slots--;

		ent->nextthink = level.time;
		ent->think(ent);

		ent->monsterinfo.aiflags |= AI_SPAWNED_CARRIER | AI_DO_NOT_COUNT |
									AI_IGNORE_SHOTS;
		ent->monsterinfo.commander = self;

		if ((self->enemy->inuse) && (self->enemy->health > 0))
		{
			ent->enemy = self->enemy;
			FoundTarget(ent);

			if (mytime == 1)
			{
				ent->monsterinfo.lefty = 0;
				ent->monsterinfo.attack_state = AS_SLIDING;
				ent->monsterinfo.currentmove = &flyer_move_attack3;
			}
			else if (mytime == 2)
			{
				ent->monsterinfo.lefty = 0;
				ent->monsterinfo.attack_state = AS_STRAIGHT;
				ent->monsterinfo.currentmove = &flyer_move_kamikaze;
				ent->mass = 100;
				ent->monsterinfo.aiflags |= AI_CHARGING;
			}
			else if (mytime == 3)
			{
				ent->monsterinfo.lefty = 1;
				ent->monsterinfo.attack_state = AS_SLIDING;
				ent->monsterinfo.currentmove = &flyer_move_attack3;
			}
		}
	}
}
Esempio n. 6
0
void World::SpawnMonsterAtPos(const Position &position)
{
	CreateMonster(position);
}
Esempio n. 7
0
void CCarrier::SpawnMonsters ()
{
	vec3f offset (105, 0, -58); // real distance needed is (sqrt (56*56*2) + sqrt(16*16*2)) or 101.8
	anglef angles = Entity->State.GetAngles().ToVectors ();

	vec3f startpoint;
	G_ProjectSource (Entity->State.GetOrigin(), offset, angles, startpoint);

	// the +0.1 is because level.time is sometimes a little low
	FrameNumber mytime = ((Level.Frame + 1 - FrameCalc) / 5);

	vec3f spawnpoint;
	if (FindSpawnPoint (startpoint, flyer_mins, flyer_maxs, spawnpoint, 32))
	{
		CMonsterEntity *ent = NULL;

		// the second flier should be a kamikaze flyer
		if (mytime != 2)
			ent = CreateMonster (spawnpoint, Entity->State.GetAngles(), "monster_flyer");
		else
			ent = CreateMonster (spawnpoint, Entity->State.GetAngles(), "monster_kamikaze");

		if (!ent)
			return;

		Entity->PlaySound (CHAN_BODY, Sounds[SOUND_SPAWN]);

		MonsterSlots--;

		ent->NextThink = Level.Frame;
		void	(IMonster::*TheThink) () = ent->Monster->Think;
		(ent->Monster->*TheThink) ();
		
		ent->Monster->AIFlags |= AI_SPAWNED_CARRIER|AI_DO_NOT_COUNT|AI_IGNORE_SHOTS;
		ent->Monster->Commander = Entity;

		if ((Entity->Enemy->GetInUse()) && (entity_cast<IHurtableEntity>(*Entity->Enemy)->Health > 0))
		{
			ent->Enemy = Entity->Enemy;
			ent->Monster->FoundTarget ();
			if (mytime == 1)
			{
				ent->Monster->Lefty = false;
				ent->Monster->AttackState = AS_SLIDING;
				ent->Monster->CurrentMove = &FlyerMoveAttack2;
			}
			else if (mytime == 2)
			{
				ent->Monster->Lefty = false;
				ent->Monster->AttackState = AS_STRAIGHT;
				ent->Monster->CurrentMove = &FlyerMoveKamikaze;
				ent->Monster->AIFlags |= AI_CHARGING;
			}
			else if (mytime == 3)
			{
				ent->Monster->Lefty = true;
				ent->Monster->AttackState = AS_SLIDING;
				ent->Monster->CurrentMove = &FlyerMoveAttack2;
			}
		}
	}
}