This commit is contained in:
aozhiwei 2021-06-18 14:37:29 +08:00
parent e47bcdd646
commit cda47bc442
4 changed files with 52 additions and 22 deletions

View File

@ -641,7 +641,19 @@ namespace MetaData
void AirRaid::Init() void AirRaid::Init()
{ {
{
std::vector<std::string> strings;
a8::Split(i->raid_wave(), strings, '|');
for (auto& str : strings) {
std::vector<std::string> strings2;
a8::Split(str, strings2, ':');
raid_waves.push_back(std::make_tuple(
a8::XValue(strings2[0]).GetInt(),
a8::XValue(strings2[1]).GetInt()
)
);
}
}
} }
void AirLine::Init() void AirLine::Init()

View File

@ -171,6 +171,7 @@ namespace MetaData
struct AirRaid struct AirRaid
{ {
const metatable::AirRaid* i = nullptr; const metatable::AirRaid* i = nullptr;
std::vector<std::tuple<int, int>> raid_waves;
void Init(); void Init();
}; };

View File

@ -3945,32 +3945,49 @@ void Room::AirRaid(int airraid_id)
auto raid_cb = auto raid_cb =
[] (const a8::XParams& param) [] (const a8::XParams& param)
{ {
auto bomb_cb =
[] (const a8::XParams& param)
{
Room* room = (Room*)param.sender.GetUserData();
if (room->IsGameOver()) {
return;
}
MetaData::AirRaid* raid_meta = (MetaData::AirRaid*)param.param1.GetUserData();
a8::Vec2 center = a8::Vec2
(
param.param2.GetDouble(),
param.param3.GetDouble()
);
a8::Vec2 dir = a8::Vec2::UP;
dir.Rotate(a8::RandAngle());
a8::Vec2 pos = center + dir * (50 + rand() % 100);;
RoomObstacle* obstacle = room->CreateObstacle
(
raid_meta->i->bomb_id(),
pos.x,
pos.y
);
obstacle->Active();
};
Room* room = (Room*)param.sender.GetUserData(); Room* room = (Room*)param.sender.GetUserData();
if (room->IsGameOver()) { if (room->IsGameOver()) {
return; return;
} }
MetaData::AirRaid* raid_meta = (MetaData::AirRaid*)param.param1.GetUserData(); MetaData::AirRaid* raid_meta = (MetaData::AirRaid*)param.param1.GetUserData();
a8::Vec2 center = a8::Vec2 for (auto& tuple : raid_meta->raid_waves) {
( int num = std::get<0>(tuple);
param.param2.GetDouble(), int delay = std::get<1>(tuple);
param.param3.GetDouble() for (int i = 0; i < num; ++i) {
); room->xtimer.AddDeadLineTimerAndAttach
for (int i = 0; i < raid_meta->i->bomb_num(); ++i) { (delay / FRAME_RATE_MS,
a8::Vec2 dir = a8::Vec2::UP; a8::XParams()
dir.Rotate(a8::RandAngle()); .SetSender(room)
a8::Vec2 pos = center + dir * (50 + rand() % 100);; .SetParam1(raid_meta)
RoomObstacle* obstacle = room->CreateObstacle .SetParam2(param.param2.GetDouble())
( .SetParam3(param.param3.GetDouble()),
raid_meta->i->bomb_id(), bomb_cb,
pos.x, &room->xtimer_attacher_.timer_list_);
pos.y
);
obstacle->Active();
if (obstacle) {
} }
#if 1
room->BroadcastDebugMsg(a8::Format("airraid pos=%d:%d", {pos.x, pos.y}));
#endif
} }
}; };

View File

@ -269,7 +269,7 @@ message AirRaid
optional int32 time = 2; optional int32 time = 2;
optional int32 appear_time = 3; optional int32 appear_time = 3;
optional int32 bomb_id = 4; optional int32 bomb_id = 4;
optional int32 bomb_num = 5; optional string raid_wave = 5;
optional float rad = 6; optional float rad = 6;
} }