updating danger map correctly

This commit is contained in:
Bluub
2021-06-18 14:58:07 +02:00
parent 81784bf0f8
commit 60697a5e2d
5 changed files with 56 additions and 119 deletions
@@ -36,109 +36,38 @@ namespace BBM
for (auto &[other, pos, _] : _wal.getScene()->view<PositionComponent, TagComponent<Hole>>())
_luamap._map[pos.position.z][pos.position.x] = MapGenerator::HOLE;
for (auto &[other, pos, bomb, timer] : _wal.getScene()->view<PositionComponent, BasicBombComponent, TimerComponent>())
_bombs.push_back(std::make_tuple(pos.position, bomb.explosionRadius, timer.ringIn));
updateDangerBomb(pos.position, bomb.explosionRadius, timer.ringIn);
_cached = true;
}
void IAControllableSystem::pushInfoPlayer(LuaG::State &state, MapInfo &player, BombHolderComponent &bombHolder)
void IAControllableSystem::updateDangerBomb(Vector3f bombPos, int radius, std::chrono::nanoseconds ringIn)
{
state.push("player");
state.newTable();
state.push("x");
state.push(player.x);
state.setTable();
state.push("y");
state.push(player.z);
state.setTable();
state.push("bombCount");
state.push(bombHolder.bombCount);
state.setTable();
state.push("radius");
state.push(bombHolder.explosionRadius);
state.setTable();
state.setTable();
}
void IAControllableSystem::pushInfoRaw(LuaG::State &state)
{
int index = 0;
state.push("raw");
state.newTable();
for (auto &info : _map) {
state.push(index++);
state.newTable();
state.push("x");
state.push(info.x);
state.setTable();
state.push("y");
state.push(info.z);
state.setTable();
state.push("type");
state.push(info.type);
state.setTable();
state.setTable();
Vector3f pos;
int dangerLevel = std::chrono::duration_cast<std::chrono::seconds>(ringIn).count();
if (dangerLevel == 0)
dangerLevel = 1;
std::cout << "bomb: " <<bombPos << std::endl << std::flush;
_luamap._danger[bombPos.z][bombPos.x] = dangerLevel;
for (auto i = 1; i < radius; i++) {
pos = bombPos - Vector3f(i, 0, 0);
if (!_luamap.setDanger(pos.x, pos.z, dangerLevel))
break;
}
for (auto &bomb : _bombs) {
Vector3f bombPos = std::get<0>(bomb);
state.push(index++);
state.newTable();
state.push("x");
state.push(bombPos.x);
state.setTable();
state.push("y");
state.push(bombPos.z);
state.setTable();
state.push("type");
state.push(10);
state.setTable();
state.setTable();
for (auto i = 1; i < radius; i++) {
pos = bombPos - Vector3f(-i, 0, 0);
if (!_luamap.setDanger(pos.x, pos.z, dangerLevel))
break;
}
state.setTable();
}
void IAControllableSystem::pushInfoDangerPos(LuaG::State &state, int &index, float xpos, float ypos, int dangerLevel)
{
state.push(index++);
state.newTable();
state.push("x");
state.push(xpos);
state.setTable();
state.push("y");
state.push(ypos);
state.setTable();
state.push("level");
state.push(dangerLevel);
state.setTable();
state.setTable();
}
void IAControllableSystem::pushInfoDanger(LuaG::State &state)
{
int index = 0;
state.push("danger");
state.newTable();
for (auto &bomb : _bombs) {
Vector3f bombPos = std::get<0>(bomb);
int bombRadius = std::get<1>(bomb);
std::chrono::nanoseconds timeleft = std::get<2>(bomb);
int dangerLevel = std::chrono::duration_cast<std::chrono::seconds>(timeleft).count();
if (dangerLevel == 0)
dangerLevel = 1;
pushInfoDangerPos(state, index, bombPos.x, bombPos.z, dangerLevel);
pushInfoDangerPos(state, index, bombPos.x, bombPos.z, dangerLevel);
for (int i = 1; i < bombRadius; i++) {
Vector3f pos = bombPos - Vector3f(i, 0, 0);
pushInfoDangerPos(state, index, pos.x, pos.z, dangerLevel);
pos = bombPos - Vector3f(-i, 0, 0);
pushInfoDangerPos(state, index, pos.x, pos.z, dangerLevel);
pos = bombPos - Vector3f(0, 0, i);
pushInfoDangerPos(state, index, pos.x, pos.z, dangerLevel);
pos = bombPos - Vector3f(0, 0, -i);
pushInfoDangerPos(state, index, pos.x, pos.z, dangerLevel);
}
for (auto i = 1; i < radius; i++) {
pos = bombPos - Vector3f(0, 0, i);
if (!_luamap.setDanger(pos.x, pos.z, dangerLevel))
break;
}
for (auto i = 1; i < radius; i++) {
pos = bombPos - Vector3f(0, 0, -i);
if (!_luamap.setDanger(pos.x, pos.z, dangerLevel))
break;
}
state.setTable();
}
void IAControllableSystem::pushInfoEnemies(LuaG::State &state)
@@ -163,9 +92,6 @@ namespace BBM
void IAControllableSystem::pushInfo(LuaG::State &state, MapInfo &player, BombHolderComponent &bombHolder)
{
state.newTable();
pushInfoPlayer(state, player, bombHolder);
pushInfoRaw(state);
pushInfoDanger(state);
pushInfoEnemies(state);
}
@@ -210,7 +136,6 @@ namespace BBM
void IAControllableSystem::onSelfUpdate()
{
_cached = false;
_map.clear();
_bombs.clear();
_luamap.clearDanger();
}
}