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()); } } }
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(); } }
void cMonsterSpawn::FrontMonsterSpawn() { if (m_nMaxCount > m_nCount) { auto pMonster = CreateMonster(m_vPlayerPosition, "enemy"); pMonster->SetMovePattern(new cRushMove()); } }
// 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(); }
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; } } } }
void World::SpawnMonsterAtPos(const Position &position) { CreateMonster(position); }
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; } } } }