diff --git a/server/gameserver/airraid.cc b/server/gameserver/airraid.cc index 1d794a43..6dc2529f 100644 --- a/server/gameserver/airraid.cc +++ b/server/gameserver/airraid.cc @@ -51,44 +51,7 @@ void AirRaid::Exec(int airraid_id) if (room_->IsGameOver()) { return; } - for (auto& tuple : raid_meta->_raid_waves) { - int num = std::get<0>(tuple); - int delay = std::get<1>(tuple); - glm::vec3 born_pos = center; - - auto bomb_cb = - [this, raid_meta, num, delay, born_pos] - (int event, const a8::Args* args) - { - if (a8::TIMER_EXEC_EVENT == event) { - if (room_->IsGameOver()) { - return; - } - glm::vec3 dir = GlmHelper::UP; - GlmHelper::RotateY(dir, a8::RandAngle()); - glm::vec3 pos = born_pos + dir * (50.0f + rand() % 100); - if (room_->grid_service->CanAdd(pos.x, pos.y)) { - for (auto bomb_id : raid_meta->_bomb_ids) { - RoomObstacle* obstacle = room_->CreateObstacle - ( - bomb_id, - pos.x, - pos.y, - pos.z - ); - obstacle->Active(); - } - } - } - }; - - for (int i = 0; i < num; ++i) { - room_->xtimer.SetTimeoutEx - (delay / FRAME_RATE_MS, - bomb_cb, - &room_->xtimer_attacher_); - } - } + ExecOneRoundAirRaid(raid_meta, center); }; room_->xtimer.SetTimeoutEx @@ -124,3 +87,45 @@ bool AirRaid::GenAirRaidPos(const mt::AirRaid* raid_meta, glm::vec3& center) } room_->frame_event.AddAirRaid(raid_meta->appear_time(), center, raid_meta->rad()); } + +void AirRaid::ExecOneRoundAirRaid(const mt::AirRaid* raid_meta, const glm::vec3& pos) +{ + for (auto& tuple : raid_meta->_raid_waves) { + int num = std::get<0>(tuple); + int delay = std::get<1>(tuple); + glm::vec3 born_pos = pos; + + auto bomb_cb = + [this, raid_meta, num, delay, born_pos] + (int event, const a8::Args* args) + { + if (a8::TIMER_EXEC_EVENT == event) { + if (room_->IsGameOver()) { + return; + } + glm::vec3 dir = GlmHelper::UP; + GlmHelper::RotateY(dir, a8::RandAngle()); + glm::vec3 pos = born_pos + dir * (50.0f + rand() % 100); + if (room_->grid_service->CanAdd(pos.x, pos.y)) { + for (auto bomb_id : raid_meta->_bomb_ids) { + RoomObstacle* obstacle = room_->CreateObstacle + ( + bomb_id, + pos.x, + pos.y, + pos.z + ); + obstacle->Active(); + } + } + } + }; + + for (int i = 0; i < num; ++i) { + room_->xtimer.SetTimeoutEx + (delay / FRAME_RATE_MS, + bomb_cb, + &room_->xtimer_attacher_); + } + } +} diff --git a/server/gameserver/airraid.h b/server/gameserver/airraid.h index 0d38356b..df9211e3 100644 --- a/server/gameserver/airraid.h +++ b/server/gameserver/airraid.h @@ -13,6 +13,7 @@ class AirRaid void Exec(int airraid_id); bool GenAirRaidPos(const mt::AirRaid* raid_meta, glm::vec3& center); + void ExecOneRoundAirRaid(const mt::AirRaid* raid_meta, const glm::vec3& pos); private: Room* room_ = nullptr;