merge lobby

This commit is contained in:
Bluub
2021-06-15 16:28:29 +02:00
parent 744ba32b80
commit 35d07117a7
4 changed files with 105 additions and 42 deletions
+64 -18
View File
@@ -8,7 +8,7 @@ mapinfo.dist { }
]]
------------
------ Debug variables
local debug = false
if not debug then
@@ -18,9 +18,15 @@ else
print(a)
end
end
----- Global variables
Dirs = {{x = 1, y = 0}, {x = -1, y = 0}, {x = 0, y = -1}, {x = 0, y = 1}}
MaxX = 0
MaxY = 0
Map = {}
function PrintMap(map, maxX, maxZ)
for i=0,maxX + 1 do
----- Map functions
function PrintMap(map, MaxX, maxZ)
for i=0,MaxX + 1 do
local s = "| "
for j=0,maxZ + 1 do
s = s .. tostring(map[i][j]) .. " | ";
@@ -30,18 +36,18 @@ function PrintMap(map, maxX, maxZ)
end
end
function CreateMyMap(infos, maxX, maxY)
function CreateMyMap(infos, MaxX, MaxY)
local map = {}
for i=0,maxX + 1 do
for i=0,MaxX + 1 do
map[i] = {}
for j=0,maxY + 1 do
for j=0,MaxY + 1 do
map[i][j] = 0
end
end
for i, info in ipairs(infos) do
map[info.x][info.y] = info.type
end
PrintMap(map, maxX, maxY)
PrintMap(map, MaxX, MaxY)
return map
end
@@ -54,21 +60,61 @@ function isInExplosionRange(mapinfo, x, y)
return false
end
function Update(mapinfo)
local maxX = 0
local maxY = 0
for i, info in ipairs(mapinfo.raw) do
if info.x > maxX then
maxX = info.x
end
if info.y > maxY then
maxY = info.y
---- Pathfinding
function pathfind(root, target)
local closed = {}
local open = {}
local came_from = {}
end
function dist(nodeA, nodeB)
return math.sqrt(math.pow(nodeB.x - nodeA.x, 2) + math.pow(nodeB.y - nodeA.y, 2))
end
function getPathToSafeSpace(player, danger)
local minXesc = (player.x - 3 < 0) and 0 or (player.x - 3);
local MaxXesc = (player.x + 3 > MaxX) and MaxX or (player.x + 3);
local minYesc = (player.y - 3 < 0) and 0 or (player.y - 3);
local MaxYesc = (player.y + 3 > MaxY) and MaxY or (player.y + 3);
local maybeSafeSpace = {}
for i=minXesc,MaxXesc do
for j=minYesc, MaxYesc do
if myMap[i][j] == 0 or danger[i][j] == 0 then
table.insert(maybeSafeSpace, {x = i, y = j})
end
end
end
local minDist = 100000
local res = {}
for safe in pairs(maybeSafeSpace) do
local currDist = dist(player, safe)
if currDist < minDist then
minDist, res = currDist, safe
end
end
local path = pathfind(player, res)
end
------ Update
function Update(mapinfo)
MaxX = 0
MaxY = 0
for i, info in ipairs(mapinfo.raw) do
if info.x > MaxX then
MaxX = info.x
end
if info.y > MaxY then
MaxY = info.y
end
end
Map = CreateMyMap(mapinfo.raw, MaxX, MaxY)
local roundedPlayerPos = {x = math.floor(mapinfo.player.x+0.5), y = math.floor(mapinfo.player.y+0.5)}
local myMap = CreateMyMap(mapinfo.raw, maxX, maxY)
if (isInExplosionRange(mapinfo, roundedPlayerPos.x, roundedPlayerPos.y)) then
if (myMap[roundedPlayerPos.x + 1][roundedPlayerPos.y] ~= 0) then
--local pathToSafeSpace = getPathToSafeSpace(roundedPlayerPos)
if (Map[roundedPlayerPos.x + 1][roundedPlayerPos.y] ~= 0) then
return -1, 0, false, false
else
return 1, 0, false, false
@@ -4,6 +4,7 @@
#include "Component/Bomb/BasicBombComponent.hpp"
#include "Component/Tag/TagComponent.hpp"
#include "Component/Timer/TimerComponent.hpp"
#include "Component/Controllable/ControllableComponent.hpp"
#include "Component/IAControllable/IAControllableComponent.hpp"
#include "System/IAControllable/IAControllableSystem.hpp"
@@ -15,7 +16,7 @@ namespace BBM
: System(wal), _wal(wal), _cached(false)
{ }
void IAControllableSystem::UpdateMapInfos(WAL::ViewEntity<PositionComponent, ControllableComponent, IAControllableComponent> &entity)
void IAControllableSystem::UpdateMapInfos(WAL::ViewEntity<PositionComponent, ControllableComponent, IAControllableComponent, BombHolderComponent> &entity)
{
_players.clear();
for (auto &[other, pos, _] : _wal.getScene()->view<PositionComponent, TagComponent<Player>>()) {
@@ -35,13 +36,13 @@ namespace BBM
_map.push_back(MapInfo(pos.position, MapGenerator::BUMPER));
for (auto &[other, pos, _] : _wal.getScene()->view<PositionComponent, TagComponent<Hole>>())
_map.push_back(MapInfo(pos.position, MapGenerator::HOLE));
for (auto &[other, pos, bomb] : _wal.getScene()->view<PositionComponent, BasicBombComponent>())
_bombs.push_back(std::make_pair(pos.position, bomb.explosionRadius));
for (auto &[other, pos, bomb, timer] : _wal.getScene()->view<PositionComponent, BasicBombComponent, TimerComponent>())
_bombs.push_back(std::make_tuple(pos.position, bomb.explosionRadius, timer.ringIn));
_cached = true;
}
void IAControllableSystem::pushInfoPlayer(LuaG::State &state, MapInfo &player)
void IAControllableSystem::pushInfoPlayer(LuaG::State &state, MapInfo &player, BombHolderComponent &bombHolder)
{
state.push("player");
state.newTable();
@@ -51,6 +52,12 @@ namespace BBM
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();
}
@@ -76,7 +83,7 @@ namespace BBM
state.setTable();
}
void IAControllableSystem::pushInfoDangerPos(LuaG::State &state, int &index, float xpos, float ypos)
void IAControllableSystem::pushInfoDangerPos(LuaG::State &state, int &index, float xpos, float ypos, int dangerLevel)
{
state.push(index++);
state.newTable();
@@ -86,6 +93,9 @@ namespace BBM
state.push("y");
state.push(ypos);
state.setTable();
state.push("level");
state.push(dangerLevel);
state.setTable();
state.setTable();
}
@@ -97,34 +107,39 @@ namespace BBM
for (auto &bomb : _bombs) {
Vector3f bombPos = std::get<0>(bomb);
int bombRadius = std::get<1>(bomb);
pushInfoDangerPos(state, index, bombPos.x, bombPos.z);
std::chrono::nanoseconds timeleft = std::get<2>(bomb);
int dangerLevel = timeleft.count() / 1000000000;
if (dangerLevel == 0)
dangerLevel = 1;
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);
pushInfoDangerPos(state, index, pos.x, pos.z, dangerLevel);
pos = bombPos - Vector3f(-i, 0, 0);
pushInfoDangerPos(state, index, pos.x, pos.z);
pushInfoDangerPos(state, index, pos.x, pos.z, dangerLevel);
pos = bombPos - Vector3f(0, 0, i);
pushInfoDangerPos(state, index, pos.x, pos.z);
pushInfoDangerPos(state, index, pos.x, pos.z, dangerLevel);
pos = bombPos - Vector3f(0, 0, -i);
pushInfoDangerPos(state, index, pos.x, pos.z);
pushInfoDangerPos(state, index, pos.x, pos.z, dangerLevel);
}
}
state.setTable();
}
void IAControllableSystem::pushInfo(LuaG::State &state, MapInfo &player)
void IAControllableSystem::pushInfo(LuaG::State &state, MapInfo &player, BombHolderComponent &bombHolder)
{
state.newTable();
pushInfoPlayer(state, player);
pushInfoPlayer(state, player, bombHolder);
pushInfoRaw(state);
pushInfoDanger(state);
}
void IAControllableSystem::onFixedUpdate(WAL::ViewEntity<PositionComponent, ControllableComponent, IAControllableComponent> &entity)
void IAControllableSystem::onFixedUpdate(WAL::ViewEntity<PositionComponent, ControllableComponent, IAControllableComponent, BombHolderComponent> &entity)
{
auto &ia = entity.get<IAControllableComponent>();
auto &controllable = entity.get<ControllableComponent>();
auto &pos = entity.get<PositionComponent>();
auto &bombHolder = entity.get<BombHolderComponent>();
MapInfo player(pos.position, MapGenerator::NOTHING);
UpdateMapInfos(entity);
@@ -132,10 +147,10 @@ namespace BBM
ia._state.getGlobal("Update");
if (!lua_isfunction(ia._state.getState(), -1))
return;
pushInfo(ia._state, player);
pushInfo(ia._state, player, bombHolder);
ia._state.callFunction(1, 4);
controllable.bomb = ia._state.getReturnBool();
controllable.jump = ia._state.getReturnBool();
controllable.select = ia._state.getReturnBool();
controllable.move.y = ia._state.getReturnNumber();
controllable.move.x = ia._state.getReturnNumber();
ia._state.popLast();
@@ -5,13 +5,14 @@
#pragma once
#include <vector>
#include "Component/BombHolder/BombHolderComponent.hpp"
#include "Map/MapInfo.hpp"
#include "System/System.hpp"
namespace BBM
{
//! @brief A system to handle keyboard entities.
class IAControllableSystem : public WAL::System<PositionComponent, ControllableComponent, IAControllableComponent>
class IAControllableSystem : public WAL::System<PositionComponent, ControllableComponent, IAControllableComponent, BombHolderComponent>
{
private:
//! @brief Reference to wal to get Views
@@ -27,16 +28,16 @@ namespace BBM
std::vector<MapInfo> _players;
//! @brief All bombs on the map
std::vector<std::pair<Vector3f, int>> _bombs;
std::vector<std::tuple<Vector3f, int, std::chrono::nanoseconds>> _bombs;
//! @brief update the raw info of the map
void UpdateMapInfos(WAL::ViewEntity<PositionComponent, ControllableComponent, IAControllableComponent> &entity);
void UpdateMapInfos(WAL::ViewEntity<PositionComponent, ControllableComponent, IAControllableComponent, BombHolderComponent> &entity);
//! @brief push danger info position
void pushInfoDangerPos(LuaG::State &state, int &index, float xpos, float ypos);
void pushInfoDangerPos(LuaG::State &state, int &index, float xpos, float ypos, int dangerLevel);
//! @brief push player info
void pushInfoPlayer(LuaG::State &state, MapInfo &player);
void pushInfoPlayer(LuaG::State &state, MapInfo &player, BombHolderComponent &bombHolder);
//! @brief push raw map info
void pushInfoRaw(LuaG::State &state);
@@ -44,12 +45,12 @@ namespace BBM
//! @brief push danger map info
void pushInfoDanger(LuaG::State &state);
//! @brief push all the infos to the ai stack
void pushInfo(LuaG::State &state, MapInfo &player);
//! @brief push all the infos to the lua stack
void pushInfo(LuaG::State &state, MapInfo &player, BombHolderComponent &bombHolder);
public:
//! @inherit
void onFixedUpdate(WAL::ViewEntity<PositionComponent, ControllableComponent, IAControllableComponent> &entity) override;
void onFixedUpdate(WAL::ViewEntity<PositionComponent, ControllableComponent, IAControllableComponent, BombHolderComponent> &entity) override;
//! @inherit
void onSelfUpdate() override;
+2 -1
View File
@@ -12,6 +12,7 @@
#include <Runner/Runner.hpp>
#include <Component/Keyboard/KeyboardComponent.hpp>
#include <Component/Gamepad/GamepadComponent.hpp>
#include "Component/IAControllable/IAControllableComponent.hpp"
#include <Component/Position/PositionComponent.hpp>
#include <Component/Renderer/Drawable3DComponent.hpp>
@@ -185,7 +186,7 @@ namespace BBM
player.addComponent<GamepadComponent>(3);
break;
case ControllableComponent::AI:
throw std::runtime_error("Not implemented error");
player.addComponent<IAControllableComponent>("./ai_scripts/john.lua");
break;
default:
throw std::runtime_error("Invalid controller for a player.");