diff --git a/SQCSim-common/SQCSim-common.vcxproj b/SQCSim-common/SQCSim-common.vcxproj index 4cebfaf..4ba7bd4 100644 --- a/SQCSim-common/SQCSim-common.vcxproj +++ b/SQCSim-common/SQCSim-common.vcxproj @@ -134,6 +134,7 @@ + @@ -147,6 +148,7 @@ + diff --git a/SQCSim-common/SQCSim-common.vcxproj.filters b/SQCSim-common/SQCSim-common.vcxproj.filters index 26c6c05..45814cf 100644 --- a/SQCSim-common/SQCSim-common.vcxproj.filters +++ b/SQCSim-common/SQCSim-common.vcxproj.filters @@ -54,6 +54,9 @@ Fichiers d%27en-tête + + Fichiers d%27en-tête + @@ -80,5 +83,8 @@ Fichiers sources + + Fichiers sources + \ No newline at end of file diff --git a/SQCSim-common/boostinfo.cpp b/SQCSim-common/boostinfo.cpp new file mode 100644 index 0000000..9b54626 --- /dev/null +++ b/SQCSim-common/boostinfo.cpp @@ -0,0 +1,32 @@ +#include "boostinfo.h" +#include + +BoostInfo::BoostInfo(BoostType type, const std::string& name, float u, float v, float s, int dur) : m_type(type), m_name(name), m_u(u), m_v(v), m_s(s), m_durability(dur) +{ +} + +BoostInfo::~BoostInfo() +{ +} + +BoostType BoostInfo::GetType() const +{ + return m_type; +} + +void BoostInfo::GetTexture(float& u, float& v, float& s) +{ + u = m_u; + v = m_v; + s = m_s; +} + +void BoostInfo::Show() const +{ + std::cout << "Type: " << m_type << std::endl; + std::cout << "Nom: " << m_name << std::endl; + std::cout << "Durabilite: " << m_durability << std::endl; + std::cout << "Coordonnees Texture: " << m_u << ", " << m_v << ", " << m_s << std::endl; +} + + diff --git a/SQCSim-common/boostinfo.h b/SQCSim-common/boostinfo.h new file mode 100644 index 0000000..e76d1ed --- /dev/null +++ b/SQCSim-common/boostinfo.h @@ -0,0 +1,29 @@ +#ifndef BOOSTINFO_H__ +#define BOOSTINFO_H__ + +#include +#include "define.h" + +class BoostInfo +{ +public: + BoostInfo(BoostType type, const std::string& name, float u, float v, float s, int dur); + ~BoostInfo(); + + BoostType GetType() const; + + void GetTexture(float& u, float& v, float& s); + + void Show() const; + +private: + BoostType m_type; + float m_u; + float m_v; + float m_s; + std::string m_name; + int m_durability; + +}; + +#endif // BOOSTINFO_H__ diff --git a/SQCSim-common/bullet.cpp b/SQCSim-common/bullet.cpp index 09dde11..9b26861 100644 --- a/SQCSim-common/bullet.cpp +++ b/SQCSim-common/bullet.cpp @@ -7,7 +7,7 @@ Bullet::Bullet(Vector3f pos, Vector3f dir, uint64_t tid): m_startpos(pos), m_cur Bullet::~Bullet() {} -bool Bullet::Update(World* world, float elapsedtime, int perframe, std::map mapPlayer) { +bool Bullet::Update(World* world, float elapsedtime, int perframe, std::unordered_map mapPlayer) { int max = 100 / perframe; float damage = 0.057f; for (int x = 0; x < max; ++x) { diff --git a/SQCSim-common/bullet.h b/SQCSim-common/bullet.h index cc04737..04bbfad 100644 --- a/SQCSim-common/bullet.h +++ b/SQCSim-common/bullet.h @@ -1,9 +1,9 @@ #ifndef BULLET_H__ #define BULLET_H__ +#include #include "define.h" #include "vector3.h" -#include #include "player.h" @@ -16,7 +16,7 @@ public: Bullet(Vector3f pos, Vector3f dir, uint64_t tid); ~Bullet(); - bool Update(World* world, float elapsedtime, int perframe, std::map m_mapPlayer); + bool Update(World* world, float elapsedtime, int perframe, std::unordered_map m_mapPlayer); void Transpose(int& x, int& z); Vector3f getPos() const; Vector3f getVel() const; diff --git a/SQCSim-common/chunk.cpp b/SQCSim-common/chunk.cpp index 7026166..2e843da 100644 --- a/SQCSim-common/chunk.cpp +++ b/SQCSim-common/chunk.cpp @@ -4,7 +4,7 @@ Chunk::Chunk(unsigned int x, unsigned int y, int64_t seed) : m_posX(x), m_posY(y) { - //std::ostringstream pos; // Vérifie l'existence d'un fichier .chunk avec sa position. + //std::ostringstream pos; // V�rifie l'existence d'un fichier .chunk avec sa position. //pos << CHUNK_PATH << x << '_' << y << ".chunk"; //std::ifstream input(pos.str(), std::fstream::binary); @@ -77,6 +77,38 @@ Chunk::Chunk(unsigned int x, unsigned int y, int64_t seed) : m_posX(x), m_posY(y } #pragma endregion + //int rnd = rand() % 15; + if (ratio == 1) + for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // structure + for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) { + for (int iy = 0; iy < 14; ++iy) { + if (ix == 3) + if (GetBlock(ix, iy, iz) == BTYPE_AIR) + Structure(ix, iy, iz, 2); + } + } + if (ratio == 3) + for (int ix = 0; ix < CHUNK_SIZE_Z; ++ix) // structure + for (int iz = 0; iz < CHUNK_SIZE_X; ++iz) { + for (int iy = 0; iy < 14; ++iy) { + if (iz == 4) + if (GetBlock(ix, iy, iz) == BTYPE_AIR) + Structure(ix, iy, iz, 1); + } + } + if (ratio == 5) + for (int ix = 0; ix < CHUNK_SIZE_X; ++ix) // structure + for (int iz = 0; iz < CHUNK_SIZE_Z; ++iz) { + for (int iy = 0; iy < 14; ++iy) { + if (ix == 3) + if (GetBlock(ix, iy, iz) == BTYPE_AIR) + Structure(ix, iy, iz, 2); + } + } + + + + #pragma region Arbre @@ -109,7 +141,7 @@ Chunk::Chunk(unsigned int x, unsigned int y, int64_t seed) : m_posX(x), m_posY(y int distanceThreshold = 20; - // Vérifie si l'emplacement n'est pas à l'intérieur des lacs + // V�rifie si l'emplacement n'est pas � l'int�rieur des lacs bool isInsideLake = false; for (int iy = 0; iy < 13; ++iy) { if (GetBlock(ix, iy, iz) == BTYPE_ICE) { @@ -146,6 +178,9 @@ Chunk::Chunk(unsigned int x, unsigned int y, int64_t seed) : m_posX(x), m_posY(y + + + //else { // input.seekg(0, std::ios_base::end); // int size = input.tellg(); @@ -231,7 +266,7 @@ void Chunk::RemoveBlock(int x, int y, int z, World* world) { void Chunk::SetBlock(int x, int y, int z, BlockType type, World* world) { m_blocks.Set(x, y, z, type); - if (world) CheckNeighbors(x, z, world); // Si nullptr, ne pas vérifier les chunks voisines. + if (world) CheckNeighbors(x, z, world); // Si nullptr, ne pas v�rifier les chunks voisines. m_isDirty = true; } @@ -271,3 +306,31 @@ void Chunk::MakeClean() { m_isDirty = false; } void Chunk::MakeModified() { m_isModified = true; } + +void Chunk::Structure(int x, int y, int z,int height) +{ + + + + for (int i = 0; i < height; i++) + { + SetBlock(x, i + y, z, BTYPE_GRASS, nullptr); + } + + + + + + + + + + + + + + + + + +} diff --git a/SQCSim-common/chunk.h b/SQCSim-common/chunk.h index 6b80e75..edda885 100644 --- a/SQCSim-common/chunk.h +++ b/SQCSim-common/chunk.h @@ -28,6 +28,8 @@ class Chunk { void CheckNeighbors(unsigned int x, unsigned int z, World* world); void GetPosition(unsigned int& x, unsigned int& y) const; void PlaceTree(int x, int y, int z, int height); + + void Structure(int x, int y, int z, int height); bool IsDirty() const; void MakeDirty(); void MakeClean(); diff --git a/SQCSim-common/define.h b/SQCSim-common/define.h index 05d90da..4e7b0b0 100644 --- a/SQCSim-common/define.h +++ b/SQCSim-common/define.h @@ -7,11 +7,11 @@ #define SRV_PORT 10000 #define CLI_PORT 10001 -#define BUFFER_LENGTH 150 +#define BUFFER_LENGTH 1500 -#define CHUNK_SIZE_X 4 +#define CHUNK_SIZE_X 6 #define CHUNK_SIZE_Y 64 -#define CHUNK_SIZE_Z 4 +#define CHUNK_SIZE_Z 6 #define MAX_SELECTION_DISTANCE 5 #define SEED 0 #define COUNTDOWN 300 @@ -27,25 +27,35 @@ #define THREADS_UPDATE_CHUNKS 6 #define THREADS_DELETE_CHUNKS 3 -#define VIEW_DISTANCE 512 // Si les chunks arrêtent de s'afficher pendant une game et qu'il y a un access violation quand tu quitte, il faut augmenter ce chiffre. +#define VIEW_DISTANCE 512 // Si les chunks arr�tent de s'afficher pendant une game et qu'il y a un access violation quand tu quitte, il faut augmenter ce chiffre. #define TEXTURE_SIZE 512 #define MAX_BULLETS 512 +#define TIME_SPEED_BOOST 10 //secondes +#define TIME_DAMAGE_BOOST 10 //secondes +#define TIME_INVINCIBLE_BOOST 4 //secondes +#define STRENGTH_SPEED_BOOST 10 //Pourcentage #define BULLET_TIME .1 typedef uint8_t BlockType; -enum BLOCK_TYPE { BTYPE_AIR, BTYPE_DIRT, BTYPE_GRASS, BTYPE_METAL, BTYPE_ICE, BTYPE_LAST }; +enum BLOCK_TYPE { BTYPE_AIR, BTYPE_DIRT, BTYPE_GRASS, BTYPE_METAL, BTYPE_ICE, BTYPE_GREENGRASS, BTYPE_LAST }; +typedef uint8_t BoostType; +enum BOOST_TYPE { BTYPE_SPEED, BTYPE_HEAL, BTYPE_DAMAGE, BTYPE_INVINCIBLE, BTYPE_BOOST_LAST }; +enum ANIM_TYPE { STILL = 0, SHOOTING = 8, JUMPING = 16, JUMPINGSHOOTING = 24, DEAD = 32, TYPE_LAST = 40}; +enum ANIM_POS {FRONT, QUARTER_FRONT_LEFT, QUATER_FRONT_RIGHT, PROFIL_LEFT, PROFIL_RIGHT, QUARTER_BACK_LEFT, QUARTER_BACK_RIGHT, BACK , POS_LAST}; typedef uint64_t Timestamp; #ifdef _WIN32 #pragma comment(lib,"wsock32.lib") // Pour pouvoir faire fonctionner le linker sans le vcxproject #pragma comment(lib,"ws2_32.lib") + #include #include #include #include +#define poll WSAPoll #define flag_t u_long #define addrlen_t int #define ioctl ioctlsocket diff --git a/SQCSim-common/netprotocol.cpp b/SQCSim-common/netprotocol.cpp index d31d425..ad1a24b 100644 --- a/SQCSim-common/netprotocol.cpp +++ b/SQCSim-common/netprotocol.cpp @@ -4,38 +4,38 @@ void netprot::Serialize(Input* in, char* buf[], uint32_t* buflen) { *buf[0] = (char)netprot::PACKET_TYPE::INPUT; uint64_t time = in->timestamp; - uint8_t time8[sizeof(uint64_t)] = {(uint8_t)((time >> 56) & 0xFF), + uint8_t time8[sizeof(uint64_t)] = { (uint8_t)((time >> 56) & 0xFF), (uint8_t)((time >> 48) & 0xFF), (uint8_t)((time >> 40) & 0xFF), (uint8_t)((time >> 32) & 0xFF), (uint8_t)((time >> 24) & 0xFF), (uint8_t)((time >> 16) & 0xFF), - (uint8_t)((time >> 8 ) & 0xFF), - (uint8_t)(time & 0xFF)}; + (uint8_t)((time >> 8) & 0xFF), + (uint8_t)(time & 0xFF) }; memcpy(*buf + 1, time8, sizeof(uint64_t)); uint64_t sid = in->sid; - uint8_t sid8[sizeof(uint64_t)] = {(uint8_t)((sid >> 56) & 0xFF), + uint8_t sid8[sizeof(uint64_t)] = { (uint8_t)((sid >> 56) & 0xFF), (uint8_t)((sid >> 48) & 0xFF), (uint8_t)((sid >> 40) & 0xFF), (uint8_t)((sid >> 32) & 0xFF), (uint8_t)((sid >> 24) & 0xFF), (uint8_t)((sid >> 16) & 0xFF), - (uint8_t)((sid >> 8 ) & 0xFF), - (uint8_t)( sid & 0xFF)}; + (uint8_t)((sid >> 8) & 0xFF), + (uint8_t)(sid & 0xFF) }; memcpy(*buf + sizeof(uint64_t) + 1, sid8, sizeof(uint64_t)); Keys keys = in->keys; uint8_t keys8 = // Reste un bit. - keys.forward & 0b10000000 | + keys.forward & 0b10000000 | keys.backward & 0b01000000 | - keys.left & 0b00100000 | - keys.right & 0b00010000 | - keys.jump & 0b00001000 | - keys.shoot & 0b00000100 | - keys.block & 0b00000010 ; + keys.left & 0b00100000 | + keys.right & 0b00010000 | + keys.jump & 0b00001000 | + keys.shoot & 0b00000100 | + keys.block & 0b00000010; memcpy(*buf + sizeof(uint64_t) * 2 + 1, &keys8, sizeof(uint8_t)); @@ -54,7 +54,7 @@ void netprot::Serialize(Input* in, char* buf[], uint32_t* buflen) { (uint8_t)((vec[2] >> 24) & 0xFF), (uint8_t)((vec[2] >> 16) & 0xFF), (uint8_t)((vec[2] >> 8) & 0xFF), - (uint8_t)(vec[2] & 0xFF)}; + (uint8_t)(vec[2] & 0xFF) }; memcpy(*buf + sizeof(uint64_t) * 2 + 2, vec8, sizeof(uint32_t) * 3); @@ -88,7 +88,57 @@ void netprot::Serialize(Output* out, char* buf[], uint32_t* buflen) { memcpy(*buf + sizeof(uint64_t) + 1, sid8, sizeof(uint64_t)); - // TODO: Finir ca. + States states = out->states; + uint8_t states8 = + states.jumping & 0b10000000 | + states.shooting & 0b01000000 | + states.hit & 0b00100000 | + states.powerup & 0b00010000 | + states.dead & 0b00001000 | + states.still & 0b00000100 | + states.jumpshot & 0b00000010 | + states.running & 0b00000001; + + memcpy(*buf + sizeof(uint64_t) * 2 + 1, &states8, sizeof(uint8_t)); + + uint32_t vec[3]; + memcpy(vec, &out->direction, sizeof(Vector3f)); // Pour d�naturer les floats. + + uint8_t vec8[3 * sizeof(uint32_t)] = { + (uint8_t)((vec[0] >> 24) & 0xFF), + (uint8_t)((vec[0] >> 16) & 0xFF), + (uint8_t)((vec[0] >> 8) & 0xFF), + (uint8_t)(vec[0] & 0xFF), + (uint8_t)((vec[1] >> 24) & 0xFF), + (uint8_t)((vec[1] >> 16) & 0xFF), + (uint8_t)((vec[1] >> 8) & 0xFF), + (uint8_t)(vec[1] & 0xFF), + (uint8_t)((vec[2] >> 24) & 0xFF), + (uint8_t)((vec[2] >> 16) & 0xFF), + (uint8_t)((vec[2] >> 8) & 0xFF), + (uint8_t)(vec[2] & 0xFF) }; + + memcpy(*buf + sizeof(uint64_t) * 2 + 2, vec8, sizeof(uint32_t) * 3); + + memcpy(vec, &out->position, sizeof(Vector3f)); // Pour d�naturer les floats. + + uint8_t vec82[3 * sizeof(uint32_t)] = { + (uint8_t)((vec[0] >> 24) & 0xFF), + (uint8_t)((vec[0] >> 16) & 0xFF), + (uint8_t)((vec[0] >> 8) & 0xFF), + (uint8_t)(vec[0] & 0xFF), + (uint8_t)((vec[1] >> 24) & 0xFF), + (uint8_t)((vec[1] >> 16) & 0xFF), + (uint8_t)((vec[1] >> 8) & 0xFF), + (uint8_t)(vec[1] & 0xFF), + (uint8_t)((vec[2] >> 24) & 0xFF), + (uint8_t)((vec[2] >> 16) & 0xFF), + (uint8_t)((vec[2] >> 8) & 0xFF), + (uint8_t)(vec[2] & 0xFF) }; + + memcpy(*buf + sizeof(uint64_t) * 2 + 2 + sizeof(uint32_t) * 3, vec82, sizeof(uint32_t) * 3); + + *buflen = sizeof(uint64_t) * 2 + 2 + sizeof(uint32_t) * 6; } void netprot::Serialize(Sync* sync, char* buf[], uint32_t* buflen) { @@ -104,7 +154,7 @@ void netprot::Serialize(Sync* sync, char* buf[], uint32_t* buflen) { (uint8_t)(time & 0xFF) }; memcpy(*buf + 1, stamp8, sizeof(uint64_t)); - + uint64_t sid = sync->sid; uint8_t sid8[sizeof(uint64_t)] = { (uint8_t)((sid >> 56) & 0xFF), (uint8_t)((sid >> 48) & 0xFF), @@ -118,11 +168,11 @@ void netprot::Serialize(Sync* sync, char* buf[], uint32_t* buflen) { memcpy(*buf + sizeof(uint64_t) + 1, sid8, sizeof(uint64_t)); uint32_t timer = sync->timer; - uint8_t time8[sizeof(uint32_t)] = {(uint8_t)((timer >> 24) & 0xFF), + uint8_t time8[sizeof(uint32_t)] = { (uint8_t)((timer >> 24) & 0xFF), (uint8_t)((timer >> 16) & 0xFF), (uint8_t)((timer >> 8) & 0xFF), (uint8_t)(timer & 0xFF) }; - + memcpy(*buf + sizeof(uint64_t) * 2 + 1, time8, sizeof(uint32_t)); uint16_t ammo = sync->ammo; @@ -169,8 +219,8 @@ void netprot::Serialize(TeamInfo* tinfo, char* buf[], uint32_t* buflen) { (uint8_t)((tid >> 32) & 0xFF), (uint8_t)((tid >> 24) & 0xFF), (uint8_t)((tid >> 16) & 0xFF), - (uint8_t)((tid >> 8) & 0xFF), - (uint8_t)(tid & 0xFF) + (uint8_t)((tid >> 8) & 0xFF), + (uint8_t)(tid & 0xFF) }; memcpy(*buf + namesize + 2, tid8, sizeof(uint64_t)); @@ -182,18 +232,18 @@ void netprot::Serialize(LoginInfo* linfo, char* buf[], uint32_t* buflen) { *buf[0] = (char)netprot::PACKET_TYPE::LOGINF; size_t namesize = std::strlen(linfo->name) + 1; - + memcpy(*buf + 1, &linfo->name, namesize); uint64_t sid = linfo->sid; - uint8_t sid8[sizeof(uint64_t)] = { + uint8_t sid8[sizeof(uint64_t)] = { (uint8_t)((sid >> 56) & 0xFF), (uint8_t)((sid >> 48) & 0xFF), (uint8_t)((sid >> 40) & 0xFF), (uint8_t)((sid >> 32) & 0xFF), (uint8_t)((sid >> 24) & 0xFF), (uint8_t)((sid >> 16) & 0xFF), - (uint8_t)((sid >> 8) & 0xFF), - (uint8_t)(sid & 0xFF) + (uint8_t)((sid >> 8) & 0xFF), + (uint8_t)(sid & 0xFF) }; memcpy(*buf + namesize + 2, sid8, sizeof(uint64_t)); @@ -206,8 +256,8 @@ void netprot::Serialize(LoginInfo* linfo, char* buf[], uint32_t* buflen) { (uint8_t)((tid >> 32) & 0xFF), (uint8_t)((tid >> 24) & 0xFF), (uint8_t)((tid >> 16) & 0xFF), - (uint8_t)((tid >> 8) & 0xFF), - (uint8_t)(tid & 0xFF) + (uint8_t)((tid >> 8) & 0xFF), + (uint8_t)(tid & 0xFF) }; memcpy(*buf + namesize + 2 + sizeof(uint64_t), tid8, sizeof(uint64_t)); @@ -229,8 +279,8 @@ void netprot::Serialize(PlayerInfo* pinfo, char* buf[], uint32_t* buflen) { (uint8_t)((id >> 32) & 0xFF), (uint8_t)((id >> 24) & 0xFF), (uint8_t)((id >> 16) & 0xFF), - (uint8_t)((id >> 8) & 0xFF), - (uint8_t)(id & 0xFF) + (uint8_t)((id >> 8) & 0xFF), + (uint8_t)(id & 0xFF) }; memcpy(*buf + namesize + 2, id8, sizeof(uint64_t)); @@ -243,8 +293,8 @@ void netprot::Serialize(PlayerInfo* pinfo, char* buf[], uint32_t* buflen) { (uint8_t)((tid >> 32) & 0xFF), (uint8_t)((tid >> 24) & 0xFF), (uint8_t)((tid >> 16) & 0xFF), - (uint8_t)((tid >> 8) & 0xFF), - (uint8_t)(tid & 0xFF) + (uint8_t)((tid >> 8) & 0xFF), + (uint8_t)(tid & 0xFF) }; memcpy(*buf + namesize + 2 + sizeof(uint64_t), tid8, sizeof(uint64_t)); @@ -263,8 +313,8 @@ void netprot::Serialize(GameInfo* ginfo, char* buf[], uint32_t* buflen) { (uint8_t)((game >> 32) & 0xFF), (uint8_t)((game >> 24) & 0xFF), (uint8_t)((game >> 16) & 0xFF), - (uint8_t)((game >> 8) & 0xFF), - (uint8_t)(game & 0xFF) + (uint8_t)((game >> 8) & 0xFF), + (uint8_t)(game & 0xFF) }; memcpy(*buf + 1, seed8, sizeof(uint64_t)); @@ -272,27 +322,27 @@ void netprot::Serialize(GameInfo* ginfo, char* buf[], uint32_t* buflen) { game = ginfo->countdown; uint8_t count8[sizeof(uint64_t)] = { (uint8_t)((game >> 56) & 0xFF), - (uint8_t)((game >> 48) & 0xFF), - (uint8_t)((game >> 40) & 0xFF), - (uint8_t)((game >> 32) & 0xFF), - (uint8_t)((game >> 24) & 0xFF), - (uint8_t)((game >> 16) & 0xFF), - (uint8_t)((game >> 8) & 0xFF), - (uint8_t)(game & 0xFF) + (uint8_t)((game >> 48) & 0xFF), + (uint8_t)((game >> 40) & 0xFF), + (uint8_t)((game >> 32) & 0xFF), + (uint8_t)((game >> 24) & 0xFF), + (uint8_t)((game >> 16) & 0xFF), + (uint8_t)((game >> 8) & 0xFF), + (uint8_t)(game & 0xFF) }; memcpy(*buf + sizeof(uint64_t) + 1, count8, sizeof(uint64_t)); game = ginfo->countdown; uint8_t gtype8[sizeof(uint64_t)] = { - (uint8_t)((game >> 56) & 0xFF), + (uint8_t)((game >> 56) & 0xFF), (uint8_t)((game >> 48) & 0xFF), (uint8_t)((game >> 40) & 0xFF), (uint8_t)((game >> 32) & 0xFF), (uint8_t)((game >> 24) & 0xFF), (uint8_t)((game >> 16) & 0xFF), - (uint8_t)((game >> 8) & 0xFF), - (uint8_t)(game & 0xFF) + (uint8_t)((game >> 8) & 0xFF), + (uint8_t)(game & 0xFF) }; memcpy(*buf + sizeof(uint64_t) + 1, gtype8, sizeof(uint64_t)); @@ -311,8 +361,8 @@ void netprot::Serialize(Chat* chat, char* buf[], uint32_t* buflen) { (uint8_t)((src >> 32) & 0xFF), (uint8_t)((src >> 24) & 0xFF), (uint8_t)((src >> 16) & 0xFF), - (uint8_t)((src >> 8) & 0xFF), - (uint8_t)(src & 0xFF) + (uint8_t)((src >> 8) & 0xFF), + (uint8_t)(src & 0xFF) }; memcpy(*buf + 1, src8, sizeof(uint64_t)); @@ -325,8 +375,8 @@ void netprot::Serialize(Chat* chat, char* buf[], uint32_t* buflen) { (uint8_t)((dst >> 32) & 0xFF), (uint8_t)((dst >> 24) & 0xFF), (uint8_t)((dst >> 16) & 0xFF), - (uint8_t)((dst >> 8) & 0xFF), - (uint8_t)(dst & 0xFF) + (uint8_t)((dst >> 8) & 0xFF), + (uint8_t)(dst & 0xFF) }; memcpy(*buf + 1 + sizeof(uint64_t), dst8, sizeof(uint64_t)); @@ -339,10 +389,10 @@ void netprot::Serialize(Chat* chat, char* buf[], uint32_t* buflen) { (uint8_t)((dstteam >> 32) & 0xFF), (uint8_t)((dstteam >> 24) & 0xFF), (uint8_t)((dstteam >> 16) & 0xFF), - (uint8_t)((dstteam >> 8) & 0xFF), - (uint8_t)(dstteam & 0xFF) + (uint8_t)((dstteam >> 8) & 0xFF), + (uint8_t)(dstteam & 0xFF) }; - + memcpy(*buf + 1 + sizeof(uint64_t) * 2, dstt8, sizeof(uint64_t)); size_t messize = std::strlen(chat->mess) + 1; @@ -366,8 +416,8 @@ void netprot::Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen) { -bool netprot::Deserialize(Input* in, char* buf, const uint32_t buflen) { - if (buflen <= sizeof(Input)) +bool netprot::Deserialize(Input* in, char* buf, uint32_t *buflen) { + if (*buflen <= sizeof(Input)) return false; uint8_t diff[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 }; @@ -395,13 +445,13 @@ bool netprot::Deserialize(Input* in, char* buf, const uint32_t buflen) { uint8_t keys = 0; memcpy(&keys, &buf[1 + sizeof(uint64_t) * 2], sizeof(uint8_t)); - in->keys.forward = keys & 0b10000000; - in->keys.backward = keys & 0b01000000; - in->keys.left = keys & 0b00100000; - in->keys.right = keys & 0b00010000; - in->keys.jump = keys & 0b00001000; - in->keys.shoot = keys & 0b00000100; - in->keys.block = keys & 0b00000010; + in->keys.forward = keys & 0b10000000; + in->keys.backward = keys & 0b01000000; + in->keys.left = keys & 0b00100000; + in->keys.right = keys & 0b00010000; + in->keys.jump = keys & 0b00001000; + in->keys.shoot = keys & 0b00000100; + in->keys.block = keys & 0b00000010; uint8_t subvec[3 * sizeof(uint32_t)] = { 0,0,0,0,0,0,0,0,0,0,0,0 }; memcpy(subvec, &buf[2 + sizeof(uint64_t) * 2], sizeof(uint8_t) * 12); @@ -417,19 +467,94 @@ bool netprot::Deserialize(Input* in, char* buf, const uint32_t buflen) { (uint32_t)subvec[8] << 24 | (uint32_t)subvec[9] << 16 | (uint32_t)subvec[10] << 8 | - (uint32_t)subvec[11]}; + (uint32_t)subvec[11] }; memcpy(&in->direction, vec, sizeof(uint32_t) * 3); + *buflen = sizeof(uint64_t) * 2 + 2 + sizeof(uint32_t) * 3; + return true; } -bool netprot::Deserialize(Output* out, char* buf, const uint32_t buflen) { - return false; +bool netprot::Deserialize(Output* out, char* buf, uint32_t *buflen) { + if (*buflen <= sizeof(Output)) + return false; + + uint8_t diff[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 }; + memcpy(diff, &buf[1], sizeof(uint64_t)); + out->timestamp = + (uint64_t)diff[0] << 56 | + (uint64_t)diff[1] << 48 | + (uint64_t)diff[2] << 40 | + (uint64_t)diff[3] << 32 | + (uint64_t)diff[4] << 24 | + (uint64_t)diff[5] << 16 | + (uint64_t)diff[6] << 8 | + (uint64_t)diff[7]; + + memcpy(diff, &buf[1 + sizeof(uint64_t)], sizeof(uint64_t)); + out->id = + (uint64_t)diff[0] << 56 | + (uint64_t)diff[1] << 48 | + (uint64_t)diff[2] << 40 | + (uint64_t)diff[3] << 32 | + (uint64_t)diff[4] << 24 | + (uint64_t)diff[5] << 16 | + (uint64_t)diff[6] << 8 | + (uint64_t)diff[7]; + + uint8_t states = 0; + memcpy(&states, &buf[1 + sizeof(uint64_t) * 2], sizeof(uint8_t)); + out->states.jumping = states & 0b10000000; + out->states.shooting = states & 0b01000000; + out->states.hit = states & 0b00100000; + out->states.dead = states & 0b00010000; + out->states.still = states & 0b00001000; + out->states.jumpshot = states & 0b00000100; + out->states.running = states & 0b00000010; + + uint8_t subvec[3 * sizeof(uint32_t)] = { 0,0,0,0,0,0,0,0,0,0,0,0 }; + memcpy(subvec, &buf[2 + sizeof(uint64_t) * 2], sizeof(uint8_t) * 12); + uint32_t vec[3] = { + (uint32_t)subvec[0] << 24 | + (uint32_t)subvec[1] << 16 | + (uint32_t)subvec[2] << 8 | + (uint32_t)subvec[3], + (uint32_t)subvec[4] << 24 | + (uint32_t)subvec[5] << 16 | + (uint32_t)subvec[6] << 8 | + (uint32_t)subvec[7], + (uint32_t)subvec[8] << 24 | + (uint32_t)subvec[9] << 16 | + (uint32_t)subvec[10] << 8 | + (uint32_t)subvec[11] }; + + memcpy(&out->direction, vec, sizeof(uint32_t) * 3); + + memcpy(subvec, &buf[2 + sizeof(uint64_t) * 2 + sizeof(uint32_t) * 3], sizeof(uint8_t) * 12); + uint32_t vec2[3] = { + (uint32_t)subvec[0] << 24 | + (uint32_t)subvec[1] << 16 | + (uint32_t)subvec[2] << 8 | + (uint32_t)subvec[3], + (uint32_t)subvec[4] << 24 | + (uint32_t)subvec[5] << 16 | + (uint32_t)subvec[6] << 8 | + (uint32_t)subvec[7], + (uint32_t)subvec[8] << 24 | + (uint32_t)subvec[9] << 16 | + (uint32_t)subvec[10] << 8 | + (uint32_t)subvec[11] }; + + memcpy(&out->position, vec2, sizeof(uint32_t) * 3); + + *buflen = sizeof(uint64_t) * 2 + 2 + sizeof(uint32_t) * 6; + + return true; } -bool netprot::Deserialize(Sync* sync, char* buf, const uint32_t buflen) { - if (buflen <= sizeof(Sync)) +bool netprot::Deserialize(Sync* sync, char* buf, uint32_t *buflen) { + if (*buflen <= sizeof(Sync)) return false; uint8_t diff[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 }; @@ -487,11 +612,13 @@ bool netprot::Deserialize(Sync* sync, char* buf, const uint32_t buflen) { memcpy(&sync->position, vec, sizeof(uint32_t) * 3); + *buflen = sizeof(uint64_t) * 2 + sizeof(uint32_t) * 4 + sizeof(uint16_t) + 2; + return true; } -bool netprot::Deserialize(TeamInfo* tinfo, char* buf, const uint32_t buflen) { - if (buflen <= sizeof(LoginInfo)) +bool netprot::Deserialize(TeamInfo* tinfo, char* buf, uint32_t *buflen) { + if (*buflen <= sizeof(LoginInfo)) return false; size_t namesize = std::strlen(buf) + 1; @@ -513,11 +640,13 @@ bool netprot::Deserialize(TeamInfo* tinfo, char* buf, const uint32_t buflen) { (uint64_t)diff[6] << 8 | (uint64_t)diff[7]; + *buflen = namesize + sizeof(uint64_t) + 2; + return true; } -bool netprot::Deserialize(LoginInfo* linfo, char* buf, const uint32_t buflen) { - if (buflen <= sizeof(LoginInfo)) +bool netprot::Deserialize(LoginInfo* linfo, char* buf, uint32_t *buflen) { + if (*buflen <= sizeof(LoginInfo)) return false; size_t namesize = std::strlen(buf) + 1; @@ -550,11 +679,13 @@ bool netprot::Deserialize(LoginInfo* linfo, char* buf, const uint32_t buflen) { (uint64_t)diff[6] << 8 | (uint64_t)diff[7]; + *buflen = namesize + sizeof(uint64_t) * 2 + 2; + return true; } -bool netprot::Deserialize(PlayerInfo* pinfo, char* buf, const uint32_t buflen) { - if (buflen <= sizeof(PlayerInfo)) +bool netprot::Deserialize(PlayerInfo* pinfo, char* buf, uint32_t *buflen) { + if (*buflen <= sizeof(PlayerInfo)) return false; size_t namesize = std::strlen(buf) + 1; @@ -587,11 +718,13 @@ bool netprot::Deserialize(PlayerInfo* pinfo, char* buf, const uint32_t buflen) { (uint64_t)diff[6] << 8 | (uint64_t)diff[7]; + *buflen = namesize + sizeof(uint64_t) * 2 + 2; + return true; } -bool netprot::Deserialize(GameInfo* ginfo, char* buf, const uint32_t buflen) { - if (buflen <= sizeof(GameInfo)) +bool netprot::Deserialize(GameInfo* ginfo, char* buf, uint32_t *buflen) { + if (*buflen <= sizeof(GameInfo)) return false; uint8_t diff[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 }; @@ -628,11 +761,13 @@ bool netprot::Deserialize(GameInfo* ginfo, char* buf, const uint32_t buflen) { (uint64_t)diff[6] << 8 | (uint64_t)diff[7]; + *buflen = sizeof(uint64_t) * 3 + 1; + return true; } -bool netprot::Deserialize(Chat* chat, char* buf, const uint32_t buflen) { - if (buflen <= sizeof(Chat)) +bool netprot::Deserialize(Chat* chat, char* buf, uint32_t *buflen) { + if (*buflen <= sizeof(Chat)) return false; uint8_t src[sizeof(uint64_t)] = { 0,0,0,0,0,0,0,0 }; @@ -677,11 +812,14 @@ bool netprot::Deserialize(Chat* chat, char* buf, const uint32_t buflen) { return false; memcpy(&chat->mess, &buf[1 + sizeof(uint64_t) * 3], messsize); + + *buflen = messsize + sizeof(uint64_t) * 3 + 2; + return true; } -bool netprot::Deserialize(ErrorLog* errlog, char* buf, const uint32_t buflen) { - if (buflen <= sizeof(ErrorLog)) +bool netprot::Deserialize(ErrorLog* errlog, char* buf, uint32_t *buflen) { + if (*buflen <= sizeof(ErrorLog)) return false; size_t messsize = std::strlen(buf) + 1; @@ -692,18 +830,22 @@ bool netprot::Deserialize(ErrorLog* errlog, char* buf, const uint32_t buflen) { memcpy(&errlog->mess, &buf[1], messsize); memcpy(&errlog->is_fatal, &buf[1 + messsize], sizeof(bool)); + *buflen = messsize + sizeof(uint64_t) * 3 + 2; + return true; } + + netprot::PACKET_TYPE netprot::getType(char* buf, const uint32_t buflen) { - if (buflen < 1 || - buf[0] >= (char)netprot::PACKET_TYPE::LAST_PACK || + if (buflen < 1 || + buf[0] >= (char)netprot::PACKET_TYPE::LAST_PACK || buf[0] <= (char)netprot::PACKET_TYPE::ERR) return netprot::PACKET_TYPE::ERR; return (netprot::PACKET_TYPE)buf[0]; } -netprot::Packet netprot::getPack(char* buf, uint32_t buflen) { +netprot::Packet netprot::getPack(char* buf, uint32_t *buflen) { Packet pck = { nullptr, PACKET_TYPE::ERR }; Input* in = nullptr; Output* out = nullptr; @@ -713,7 +855,7 @@ netprot::Packet netprot::getPack(char* buf, uint32_t buflen) { ErrorLog* errlog = nullptr; LoginInfo* loginf = nullptr; - switch (getType(buf, buflen)) { + switch (getType(buf, *buflen)) { case PACKET_TYPE::INPUT: in = new Input(); if (netprot::Deserialize(in, buf, buflen)) { @@ -769,8 +911,8 @@ netprot::Packet netprot::getPack(char* buf, uint32_t buflen) { return pck; } -netprot::Packet netprot::getPack(netprot::Buffer* buf) { - return netprot::getPack(buf->ptr, buf->len); +netprot::Packet netprot::getPack(netprot::Buffer* buf) { + return netprot::getPack(buf->ptr, &buf->len); } bool netprot::emptyPack(netprot::Packet pck) { @@ -808,133 +950,250 @@ netprot::Packet netprot::makePack(void* ptr, PACKET_TYPE type) { return pck; } -std::vector netprot::recvPacks(SOCKET sock, Buffer* buf) { - std::vector lsPck; - int len = 0, end = 0; - bool pck_received = false; - char* cursor = nullptr; +std::vector netprot::recvPacks(SOCKET sock, Buffer* buf, Buffer* outbuf) { + std::vector lsPck; + int len = buf->tmp? buf->tmp - buf->ptr: 0, + end = 0; + char * cursor = buf->tmp ? buf->tmp: nullptr , + * next = buf->tmp ? buf->tmp + 1: buf->ptr, + * last = buf->tmp ? buf->tmp: buf->ptr; + bool ended = true; + struct pollfd fds[1]; + + fds[0].fd = sock; + fds[0].events = POLLIN; while (true) { - while (!pck_received) { - int bytes = recv(sock, &buf->ptr[len], buf->len - len, 0); - if (bytes < 0) // si recv() retourne -1; ça veut dire qu'il y a plus rien a lire. - return lsPck; - len += bytes; - // TODO: Voir si on trouve un footer (5 '\0' d'affilee). - // Si oui, mettre l'index du debut du footer dans - // la variable "end" et mettre pck_received a true. + if (!poll(fds, 1, 0)) { + if (ended) + buf->tmp = nullptr; + return lsPck; + } + + int bytes = recv(sock, &buf->ptr[len], buf->len - len, 0); + if (bytes <= 0) { // si recv() retourne -1 ou 0; ça veut dire qu'il y a plus rien a lire qui n'a pas déjà été traité. + if (ended) + buf->tmp = nullptr; + return lsPck; + } + len += bytes; + end = len; + + ended = false; + + while (true) { + int cmp = 0; + + if (cursor) + end -= (cursor - buf->ptr); + + if (end < 0) + break; + + cursor = (char*)memchr(next, '\r', end); + + if (cursor) { + next = cursor; + cursor--; + + cmp = memcmp(cursor, Footer, sizeof(uint32_t)); + if (cmp == 0) { + if (!outbuf) { + lsPck.push_back(last); + cursor += sizeof(uint32_t); + last = cursor; + next = cursor + 1; + } + else { + memcpy(&outbuf->ptr[cursor - last], last, cursor - last); + lsPck.push_back(&outbuf->ptr[cursor - last]); + cursor += sizeof(uint32_t); + last = cursor; + next = cursor + 1; + } + } + } + else { + if (!outbuf) + buf->tmp = last; + cursor = &buf->ptr[len]; + next = cursor + 1; + break; + }; + } + } +} + +std::vector netprot::recvPacksFrom(SOCKET sock, Buffer* buf, sockaddr_in from, Buffer* outbuf) { + std::vector lsPck; + int len = buf->tmp ? buf->tmp - buf->ptr : 0, + end = 0; + char* cursor = buf->tmp ? buf->tmp : nullptr, + * next = buf->tmp ? buf->tmp + 1 : buf->ptr, + * last = buf->tmp ? buf->tmp : buf->ptr; + bool ended = true; + struct pollfd fds[1]; + sockaddr_in sockad = from; + addrlen_t socklen = sizeof(sockad); + + fds[0].fd = sock; + fds[0].events = POLLIN; + + while (true) { + if (!poll(fds, 1, 0)) { + if (ended) + buf->tmp = nullptr; + return lsPck; } - cursor = &buf->ptr[end]; - - lsPck.push_back(getPack(buf)); - - while (*cursor == '\0') { - cursor++; - end++; + int bytes = recvfrom(sock, &buf->ptr[len], buf->len - len, 0, (sockaddr*)&sockad, &socklen); + if (bytes <= 0) { // si recv() retourne -1 ou 0; ça veut dire qu'il y a plus rien a lire qui n'a pas déjà été traité. + if (ended) + buf->tmp = nullptr; + return lsPck; } + len += bytes; + end = len; - if (cursor) { // mettre le début du prochain paquet au début du buffer. - memcpy(buf->ptr, cursor, buf->len - end); // et voir s'il y a en un autre - len = 0; - pck_received = true; + ended = false; + + while (true) { + int cmp = 0; + + if (cursor) + end -= (cursor - buf->ptr); + + if (end < 0) + break; + + cursor = (char*)memchr(next, '\r', end); + + if (cursor) { + next = cursor; + cursor--; + + cmp = memcmp(cursor, Footer, sizeof(uint32_t)); + if (cmp == 0) { + if (!outbuf) { + lsPck.push_back(last); + cursor += sizeof(uint32_t); + last = cursor; + next = cursor + 1; + } + else { + memcpy(&outbuf->ptr[cursor - last], last, cursor - last); + lsPck.push_back(&outbuf->ptr[cursor - last]); + cursor += sizeof(uint32_t); + last = cursor; + next = cursor + 1; + } + } + } + else { + if (!outbuf) + buf->tmp = last; + cursor = &buf->ptr[len]; + next = cursor + 1; + break; + }; } } } template <> -void netprot::sendPack(SOCKET sock, Packet* pack, char** buf, uint32_t* buflen) { +void netprot::sendPack(SOCKET sock, Packet* pack, Buffer* buf) { switch (pack->type) { - case PACKET_TYPE::INPUT: - sendPack(sock, (Input*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::OUTPUT: - sendPack(sock, (Output*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::SYNC: - sendPack(sock, (Sync*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::TEAMINF: - sendPack(sock, (TeamInfo*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::PLAYINF: - sendPack(sock, (PlayerInfo*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::LOGINF: - sendPack(sock, (LoginInfo*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::CHUNKMOD: - //sendPack(sock, (ChunkMod*)pack->ptr, buf, buflen); - case PACKET_TYPE::PLAYERMOD: - //sendPack(sock, (PlayerMod*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::PICKUPMOD: - //sendPack(sock, (PickupMod*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::GAMEINFO: - sendPack(sock, (GameInfo*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::ENDINFO: - //sendPack(sock, (EndInfo*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::CHAT: - sendPack(sock, (Chat*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::ERRLOG: - sendPack(sock, (ErrorLog*)pack->ptr, buf, buflen); - return; - case PACKET_TYPE::LAST_PACK: [[fallthrough]]; - case PACKET_TYPE::ERR: [[fallthrough]]; - default: - return; - } + case PACKET_TYPE::INPUT: + sendPack(sock, (Input*)pack->ptr, buf); + return; + case PACKET_TYPE::OUTPUT: + sendPack(sock, (Output*)pack->ptr, buf); + return; + case PACKET_TYPE::SYNC: + sendPack(sock, (Sync*)pack->ptr, buf); + return; + case PACKET_TYPE::TEAMINF: + sendPack(sock, (TeamInfo*)pack->ptr, buf); + return; + case PACKET_TYPE::PLAYINF: + sendPack(sock, (PlayerInfo*)pack->ptr, buf); + return; + case PACKET_TYPE::LOGINF: + sendPack(sock, (LoginInfo*)pack->ptr, buf); + return; + case PACKET_TYPE::CHUNKMOD: + //sendPack(sock, (ChunkMod*)pack->ptr, buf); + return; + case PACKET_TYPE::PLAYERMOD: + //sendPack(sock, (PlayerMod*)pack->ptr, buf); + return; + case PACKET_TYPE::PICKUPMOD: + //sendPack(sock, (PickupMod*)pack->ptr, buf); + return; + case PACKET_TYPE::GAMEINFO: + sendPack(sock, (GameInfo*)pack->ptr, buf); + return; + case PACKET_TYPE::ENDINFO: + //sendPack(sock, (EndInfo*)pack->ptr, buf); + return; + case PACKET_TYPE::CHAT: + sendPack(sock, (Chat*)pack->ptr, buf); + return; + case PACKET_TYPE::ERRLOG: + sendPack(sock, (ErrorLog*)pack->ptr, buf); + return; + case PACKET_TYPE::LAST_PACK: [[fallthrough]]; + case PACKET_TYPE::ERR: [[fallthrough]]; + default: + return; + } } template <> -void netprot::sendPackTo(SOCKET sock, Packet* pack, char** buf, uint32_t* buflen, sockaddr_in* sockad) { +void netprot::sendPackTo(SOCKET sock, Packet* pack, Buffer* buf, sockaddr_in* sockad) { switch (pack->type) { - case PACKET_TYPE::INPUT: - sendPackTo(sock, (Input*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::OUTPUT: - sendPackTo(sock, (Output*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::SYNC: - sendPackTo(sock, (Sync*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::TEAMINF: - sendPackTo(sock, (TeamInfo*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::PLAYINF: - sendPackTo(sock, (PlayerInfo*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::LOGINF: - sendPackTo(sock, (LoginInfo*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::CHUNKMOD: - //sendPackTo(sock, (ChunkMod*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::PLAYERMOD: - //sendPackTo(sock, (PlayerMod*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::PICKUPMOD: - //sendPackTo(sock, (PickupMod*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::GAMEINFO: - sendPackTo(sock, (GameInfo*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::ENDINFO: - //sendPackTo(sock, (EndInfo*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::CHAT: - sendPackTo(sock, (Chat*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::ERRLOG: - sendPackTo(sock, (ErrorLog*)pack->ptr, buf, buflen, sockad); - return; - case PACKET_TYPE::LAST_PACK: [[fallthrough]]; - case PACKET_TYPE::ERR: [[fallthrough]]; - default: - return; - } + case PACKET_TYPE::INPUT: + sendPackTo(sock, (Input*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::OUTPUT: + sendPackTo(sock, (Output*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::SYNC: + sendPackTo(sock, (Sync*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::TEAMINF: + sendPackTo(sock, (TeamInfo*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::PLAYINF: + sendPackTo(sock, (PlayerInfo*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::LOGINF: + sendPackTo(sock, (LoginInfo*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::CHUNKMOD: + //sendPackTo(sock, (ChunkMod*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::PLAYERMOD: + //sendPackTo(sock, (PlayerMod*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::PICKUPMOD: + //sendPackTo(sock, (PickupMod*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::GAMEINFO: + sendPackTo(sock, (GameInfo*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::ENDINFO: + //sendPackTo(sock, (EndInfo*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::CHAT: + sendPackTo(sock, (Chat*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::ERRLOG: + sendPackTo(sock, (ErrorLog*)pack->ptr, buf, sockad); + return; + case PACKET_TYPE::LAST_PACK: [[fallthrough]]; + case PACKET_TYPE::ERR: [[fallthrough]]; + default: + return; + } } diff --git a/SQCSim-common/netprotocol.h b/SQCSim-common/netprotocol.h index 987e5fe..b6f78c9 100644 --- a/SQCSim-common/netprotocol.h +++ b/SQCSim-common/netprotocol.h @@ -7,8 +7,6 @@ /* Protocole Particulier de Partie a Plusieurs Personnes (PPPPP) */ -// Packet: packet[0] = PacketType, packet[1..n-1] = {packet} - namespace netprot { enum class PACKET_TYPE: uint8_t { ERR, INPUT, OUTPUT, SYNC, @@ -17,9 +15,11 @@ namespace netprot { GAMEINFO, ENDINFO , CHAT, ERRLOG, LAST_PACK }; + + /* Structures */ struct Buffer { // Pour pouvoir rendre l'utilisation des buffers plus clean. - char* ptr = new char[BUFFER_LENGTH]; + char* ptr = new char[BUFFER_LENGTH] { 1 }, * tmp = nullptr; uint32_t len = BUFFER_LENGTH; ~Buffer() { delete[] ptr; } @@ -31,6 +31,12 @@ namespace netprot { PACKET_TYPE type = PACKET_TYPE::ERR; }; + /* Constantes */ + + inline const char Footer[sizeof(uint32_t)] = { '\0', '\r', '\0', '\n' }; // constante de footer qui est ajoutée à chaque paquet envoyé. + + /* Sous-structures */ + struct Keys { bool forward, backward, @@ -52,6 +58,8 @@ namespace netprot { running; }; + /* Structures de paquets */ + struct Input { // cli -> srv UDP ~frame Timestamp timestamp; uint64_t sid = 0; @@ -67,7 +75,7 @@ namespace netprot { States states; // 0bJSH_____ bit-packing de bool. }; - struct Sync { // srv -> cli TCP ~second + struct Sync { // srv -> cli TCP ~second - un premier sync démarre la partie. Timestamp timestamp; uint64_t sid = 0; uint32_t timer = 0; @@ -98,7 +106,11 @@ namespace netprot { uint64_t id = 0, tid = 0; PlayerInfo() {} - PlayerInfo(PlayerInfo* log) : id(log->id), tid(log->tid) { strcpy(log->name, name); } + PlayerInfo(PlayerInfo* log) : id(log->id), tid(log->tid) { + strcpy(log->name, name); + }; + PlayerInfo(int id, int tid, std::string strname) : id(id), tid(tid) { memcpy((void*)strname.c_str(), name, strname.length()); + } }; struct GameInfo { // cli <-> srv TCP event (before game start)/ once @@ -125,6 +137,8 @@ namespace netprot { ErrorLog(ErrorLog* err) : is_fatal(err->is_fatal) { strcpy(err->mess, mess); } }; + /* Fonctions */ + void Serialize(Input* in, char* buf[], uint32_t* buflen); // cli void Serialize(Output* out, char* buf[], uint32_t* buflen); // srv void Serialize(Sync* sync, char* buf[], uint32_t* buflen); // srv @@ -135,24 +149,26 @@ namespace netprot { void Serialize(Chat* chat, char* buf[], uint32_t* buflen); // cli/srv void Serialize(ErrorLog* errlog, char* buf[], uint32_t* buflen); // srv - bool Deserialize(Input* in, char* buf, const uint32_t buflen); // srv - bool Deserialize(Output* out, char* buf, const uint32_t buflen); // cli - bool Deserialize(Sync* sync, char* buf, const uint32_t buflen); // cli - bool Deserialize(TeamInfo* tinfo, char* buf, const uint32_t buflen); // cli/srv - bool Deserialize(LoginInfo* linfo, char* buf, const uint32_t buflen); // cli/srv - bool Deserialize(PlayerInfo* pinfo, char* buf, const uint32_t buflen); // cli - bool Deserialize(GameInfo* ginfo, char* buf, const uint32_t buflen); // cli - bool Deserialize(Chat* chat, char* buf, const uint32_t buflen); // srv/cli - bool Deserialize(ErrorLog* errlog, char* buf, const uint32_t buflen); // srv + bool Deserialize(Input* in, char* buf, uint32_t* buflen); // srv + bool Deserialize(Output* out, char* buf, uint32_t* buflen); // cli + bool Deserialize(Sync* sync, char* buf, uint32_t* buflen); // cli + bool Deserialize(TeamInfo* tinfo, char* buf, uint32_t* buflen); // cli/srv + bool Deserialize(LoginInfo* linfo, char* buf, uint32_t* buflen); // cli/srv + bool Deserialize(PlayerInfo* pinfo, char* buf, uint32_t* buflen); // cli + bool Deserialize(GameInfo* ginfo, char* buf, uint32_t* buflen); // cli + bool Deserialize(Chat* chat, char* buf, uint32_t* buflen); // srv/cli + bool Deserialize(ErrorLog* errlog, char* buf, uint32_t* buflen); // srv PACKET_TYPE getType(char* buf, uint32_t buflen); - Packet getPack(char* buf, uint32_t buflen); + Packet getPack(char* buf, uint32_t *buflen); Packet getPack(Buffer* buf); bool emptyPack(Packet pck); Packet makePack(void* ptr, PACKET_TYPE type); // Pour pouvoir faire une liste de stock a supprimer sans avoir a en faire une pour chaque type. + + template T copyPack(Packet* pck); template void sendPack(SOCKET sock, T* pack, char** buf, uint32_t* buflen); template void sendPackTo(SOCKET sock, T* pack, char** buf, uint32_t* buflen, sockaddr_in* sockad); @@ -160,23 +176,29 @@ namespace netprot { template void sendPack(SOCKET sock, T* pack, Buffer* buf); template void sendPackTo(SOCKET sock, T* pack, Buffer* buf, sockaddr_in* sockad); - std::vector recvPacks(SOCKET sock, Buffer* buf); + std::vector recvPacks(SOCKET sock, Buffer* buf, Buffer* oufbuf = nullptr); + std::vector recvPacksFrom(SOCKET sock, Buffer* buf, sockaddr_in from, Buffer* oufbuf = nullptr); + + /* Templates */ + + template + T copyPack(Packet* pck) { return T((T*)pck->ptr); } template void sendPack(SOCKET sock, T* pack, char** buf, uint32_t* buflen) { netprot::Serialize(pack, buf, buflen); - memset(&buf[*buflen], '\0', sizeof(uint64_t) + sizeof(uint8_t)); - buflen += (sizeof(uint64_t) + sizeof(uint8_t)); + memcpy(*buf + *buflen, Footer, sizeof(uint32_t)); + *buflen += sizeof(Footer); send(sock, *buf, *buflen, 0); *buflen = BUFFER_LENGTH; } template void sendPackTo(SOCKET sock, T* pack, char** buf, uint32_t* buflen, sockaddr_in* sockad) { - sockaddr_in addr = *sockad; + const sockaddr_in addr = *sockad; netprot::Serialize(pack, buf, buflen); - memset(&buf[*buflen], '\0', sizeof(uint64_t) + sizeof(uint8_t)); - buflen += (sizeof(uint64_t) + sizeof(uint8_t)); + memcpy(*buf + *buflen, Footer, sizeof(uint32_t)); + *buflen += sizeof(Footer); sendto(sock, *buf, *buflen, 0, (sockaddr*)&addr, sizeof(addr)); *buflen = BUFFER_LENGTH; } @@ -184,22 +206,21 @@ namespace netprot { template void sendPack(SOCKET sock, T* pack, Buffer* buf) { netprot::Serialize(pack, &buf->ptr, &buf->len); - memset(&buf->ptr[buf->len], '\0', sizeof(uint64_t) + sizeof(uint8_t)); - buf->len += sizeof(uint64_t) + sizeof(uint8_t); + memcpy(&buf->ptr[buf->len], Footer, sizeof(uint32_t)); + buf->len += sizeof(Footer); send(sock, buf->ptr, buf->len, 0); buf->rstLen(); } template void sendPackTo(SOCKET sock, T* pack, Buffer* buf, sockaddr_in* sockad) { - sockaddr_in addr = *sockad; + const sockaddr_in addr = *sockad; netprot::Serialize(pack, &buf->ptr, &buf->len); - memset(&buf->ptr[buf->len], '\0', sizeof(uint64_t) + sizeof(uint8_t)); - buf->len += sizeof(uint64_t) + sizeof(uint8_t); + memcpy(&buf->ptr[buf->len], Footer, sizeof(uint32_t)); + buf->len += sizeof(Footer); sendto(sock, buf->ptr, buf->len, 0, (sockaddr*)&addr, sizeof(addr)); buf->rstLen(); } - }; #endif diff --git a/SQCSim-common/player.cpp b/SQCSim-common/player.cpp index 790507f..b88ba18 100644 --- a/SQCSim-common/player.cpp +++ b/SQCSim-common/player.cpp @@ -61,6 +61,11 @@ Vector3f Player::GetInput(bool front, bool back, bool left, bool right, bool jum delta.y += jump? .32f: shoot? .1f : 0.f; m_airborne = true; } + if (boostspeed) + { + delta.x += STRENGTH_SPEED_BOOST / 100 * delta.x; + delta.z += STRENGTH_SPEED_BOOST / 100 * delta.z; + } if (shoot) // Recoil! TurnTopBottom(-1); @@ -182,16 +187,65 @@ Player::Sound Player::ApplyPhysics(Vector3f input, World* world, float elapsedTi else isStep = false; m_POV = m_position.y; m_POV += m_airborne ? 0 : (sin(bobbingtime) - 0.5f) * (abs(m_velocity.x) + abs(m_velocity.z)) * .2f; - + RemoveBooster(elapsedTime); return snd; } -void Player::ApplyTransformation(Transformation& transformation, bool rel) const { +void Player::ApplyTransformation(Transformation& transformation, bool rel, bool rot) const { transformation.ApplyRotation(-m_rotX, 1, 0, 0); transformation.ApplyRotation(-m_rotY, 0, 1, 0); if (rel) transformation.ApplyTranslation(-GetPOV()); + if (!rot) { + transformation.ApplyRotation(-m_rotX, 1, 0, 0); + transformation.ApplyRotation(-m_rotY, 0, 1, 0); + } } +void Player::GetBooster(Booster boosttype) +{ + if (boosttype == SPEED) + { + boostspeed = true; + timeboostspeed = 0; + } + if (boosttype == HEAL) + { + m_hp = 100; + } + if (boosttype == DAMAGE) + { + boostdamage = true; + timeboostdamage = 0; + } + if (boosttype == INVINCIBLE) + { + boostinvincible = true; + boostinvincible = 0; + } +} +void Player::RemoveBooster(float elapsedtime) +{ + if (boostspeed) + { + timeboostspeed += elapsedtime; + if (timeboostspeed >= TIME_SPEED_BOOST) + boostspeed = false; + } + if (boostdamage) + { + timeboostdamage += elapsedtime; + if (timeboostdamage >= TIME_DAMAGE_BOOST) + boostdamage = false; + } + if (boostinvincible) + { + timeboostinvincible += elapsedtime; + if (timeboostinvincible >= TIME_INVINCIBLE_BOOST) + boostinvincible = false; + } +} +void Player::SetDirection(Vector3f dir) { m_direction = dir; } + Vector3f Player::GetPosition() const { return Vector3f(m_position.x + CHUNK_SIZE_X * WORLD_SIZE_X / 2, m_position.y, m_position.z + CHUNK_SIZE_Z * WORLD_SIZE_Y / 2); } Vector3f Player::GetVelocity() const { return m_velocity; } diff --git a/SQCSim-common/player.h b/SQCSim-common/player.h index eedbf74..4792d4a 100644 --- a/SQCSim-common/player.h +++ b/SQCSim-common/player.h @@ -5,11 +5,13 @@ #include "transformation.h" #include "vector3.h" + class World; class Player { public: enum Sound { NOSOUND, STEP, FALL }; + enum Booster { SPEED, HEAL, DAMAGE, INVINCIBLE }; Player(const Vector3f& position, float rotX = 0, float rotY = 0); ~Player(); @@ -18,8 +20,11 @@ public: void TurnTopBottom(float value); Vector3f GetInput(bool front, bool back, bool left, bool right, bool jump, bool dash, float elapsedTime); Sound ApplyPhysics(Vector3f input, World* world, float elapsedTime); - void ApplyTransformation(Transformation& transformation, bool rel = true) const; + void GetBooster(Booster boosttype); + void RemoveBooster(float elapsedtime); + void ApplyTransformation(Transformation& transformation, bool rel = true, bool rot = true) const; + void SetDirection(Vector3f dir); Vector3f GetPosition() const; Vector3f GetDirection() const; Vector3f GetVelocity() const; @@ -45,13 +50,20 @@ protected: float m_rotX = 0; float m_rotY = 0; float m_POV; + float timeboostspeed; + float timeboostdamage; + float timeboostinvincible; float m_hp; bool m_airborne; + bool boostspeed; + bool boostdamage; + bool boostinvincible; + + Vector3f InterpolatePosition(const Vector3f& vec1, const Vector3f& vec2, const Timestamp& tim1, const Timestamp& tim2, const Timestamp& now); - }; #endif //_PLAYER_H__ diff --git a/SQCSim-common/world.cpp b/SQCSim-common/world.cpp index c18c32c..70d6eb6 100644 --- a/SQCSim-common/world.cpp +++ b/SQCSim-common/world.cpp @@ -16,6 +16,9 @@ void World::SetSeed(uint64_t seed) { m_seed = seed; } + + + Chunk* World::ChunkAt(float x, float y, float z) const { int cx = (int)x / CHUNK_SIZE_X; int cz = (int)z / CHUNK_SIZE_Z; @@ -31,6 +34,32 @@ Chunk* World::ChunkAt(float x, float y, float z) const { Chunk* World::ChunkAt(const Vector3f& pos) const { return ChunkAt(pos.x, pos.y, pos.z); } +void World::RemoveChunk(int nbReduit) +{ + for (int x = 0; x < WORLD_SIZE_X; ++x) + for (int y = 0; y < WORLD_SIZE_Y; ++y) + { + Chunk* chk = nullptr; + if (x < nbReduit) + chk = m_chunks.Remove(x, y); + if (y < nbReduit) + chk = m_chunks.Remove(x, y); + if (y > WORLD_SIZE_Y - nbReduit) + chk = m_chunks.Remove(x, y); + if (x > WORLD_SIZE_X - nbReduit) + chk = m_chunks.Remove(x, y); + + // TODO: MakeDirty() les voisins pour qu'ils se redessinent. + + if (!chk) + continue; + + m_tbDeleted.emplace_back(chk); + } + + +} + BlockType World::BlockAt(float x, float y, float z, BlockType defaultBlockType) const { Chunk* c = ChunkAt(x, y, z); @@ -226,7 +255,7 @@ void World::UpdateWorld(const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST] int threads = 0; std::future genThList[THREADS_GENERATE_CHUNKS]; //std::future delThList[THREADS_DELETE_CHUNKS]; - + if (frameGenerate > 0) --frameGenerate; if (frameUpdate > 0) --frameUpdate; if (frameDelete > 0) --frameDelete; diff --git a/SQCSim-common/world.h b/SQCSim-common/world.h index 8a166af..e9b4840 100644 --- a/SQCSim-common/world.h +++ b/SQCSim-common/world.h @@ -28,6 +28,8 @@ public: Chunk* ChunkAt(float x, float y, float z) const; Chunk* ChunkAt(const Vector3f& pos) const; + void RemoveChunk(int nbReduit); + BlockType BlockAt(float x, float y, float z, BlockType defaultBlockType = BTYPE_AIR) const; BlockType BlockAt(const Vector3f& pos, BlockType defaultBlockType = BTYPE_AIR) const; diff --git a/SQCSim-srv/connection.cpp b/SQCSim-srv/connection.cpp index 079b0fb..4ac9968 100644 --- a/SQCSim-srv/connection.cpp +++ b/SQCSim-srv/connection.cpp @@ -47,6 +47,70 @@ PlayerInfo* Connection::getInfo() const { return (PlayerInfo*)&m_playinfo; } sockaddr_in* Connection::getAddr() const { return (sockaddr_in*)&m_addr; } +void Connection::getPacks(SOCKET sock) { + std::vector lsPck; + Input in; + while (true) { + lsPck = recvPacksFrom(sock, &m_buf, m_addr); + + for (auto& pck : lsPck) { + uint32_t bsize = m_buf.len - (pck - m_buf.ptr); + switch (netprot::getType(pck, 1)) { + using enum netprot::PACKET_TYPE; + case INPUT: + if (Deserialize(&in, pck, &bsize)) + m_input_manifest[in.timestamp] = in; + break; + default: break; + } + } + lsPck.clear(); + } +} + +void Connection::sendPacks(SOCKET sock, std::unordered_map conns) { + while (m_last_out < m_output_manifest.size()) { + Output out = m_output_manifest.at(m_last_out++); + + for (auto& [key, conn] : conns) { + if (m_playinfo.id == conn->GetHash(true)) + continue; + sendPackTo(sock, &out, &m_bufout, conn->getAddr()); + } + } +} + +void Connection::Run(World* world) { + Input in, last; + Output out; + float el; + + if (m_input_manifest.size() < 2) + return; + + while (m_last_in < m_input_manifest.size()) { + in = m_input_manifest.at(m_last_in + 1); + last = m_input_manifest.at(m_last_in); + + el = (float)(in.timestamp - last.timestamp) / 1000.; + player.get()->SetDirection(in.direction); + player.get()->ApplyPhysics(player.get()->GetInput(in.keys.forward, + in.keys.backward, + in.keys.left, + in.keys.right, + in.keys.jump, false, el), world, el); + + out.position = player.get()->GetPosition(); + out.direction = in.direction; + out.timestamp = in.timestamp; + out.id = m_playinfo.id; + + m_output_manifest[out.timestamp] = out; + + ++m_last_in; + } +} + void Connection::CleanInputManifest(Timestamp time) { auto wat = m_input_manifest.find(time); diff --git a/SQCSim-srv/connection.h b/SQCSim-srv/connection.h index b7a69ee..af9c2df 100644 --- a/SQCSim-srv/connection.h +++ b/SQCSim-srv/connection.h @@ -2,10 +2,11 @@ #define CONNECTION_H__ #include -#include +#include #include "../SQCSim-common/player.h" #include "../SQCSim-common/vector3.h" #include "../SQCSim-common/netprotocol.h" +#include "../SQCSim-common/world.h" #include "define.h" using namespace netprot; @@ -32,16 +33,27 @@ public: PlayerInfo* getInfo() const; sockaddr_in* getAddr() const; + void getPacks(SOCKET sock); + void sendPacks(SOCKET sock, std::unordered_map conns); + + void Run(World* world); + void CleanInputManifest(Timestamp time); private: - std::map m_input_manifest; - std::map m_output_manifest; - std::map m_chatlog; + std::unordered_map m_input_manifest; + std::unordered_map m_output_manifest; + std::unordered_map m_chatlog; SOCKET m_sock; sockaddr_in m_addr; LoginInfo m_loginfo; PlayerInfo m_playinfo; + Timestamp m_startsync; + + uint64_t m_last_in = 0, + m_last_out = 0; + Buffer m_buf, + m_bufout; }; #endif diff --git a/SQCSim-srv/server.cpp b/SQCSim-srv/server.cpp index 983ed59..e724269 100644 --- a/SQCSim-srv/server.cpp +++ b/SQCSim-srv/server.cpp @@ -129,6 +129,7 @@ int Server::Ready() { if (recv(sock, m_buf.ptr, m_buf.len, 0) > 0) { PlayerInfo play; + m_buf.len = BUFFER_LENGTH; Packet pck = getPack(&m_buf); if (pck.type != PACKET_TYPE::LOGINF) { Log("Paquet invalide.", true, false); @@ -139,22 +140,22 @@ int Server::Ready() { LoginInfo* log = (LoginInfo*)pck.ptr; log->sid = getUniqueId(); - log->tid = 0; // TODO: À changer si on implemente un mode en equipe. + log->tid = 1145389380; // TODO: À changer si on implemente un mode en equipe. Log(str.append(" Nom: ").append(log->name), false, false); str.clear(); Log(str.append(log->name).append(" SID: [").append(std::to_string(log->sid).append("]")), false, false); - sendPack(sock, log, &m_buf.ptr, &m_buf.len); + sendPack(sock, log, &m_buf); play.id = getUniqueId(); strcpy(play.name, log->name); play.tid = log->tid; - sendPack(sock, &m_game, &m_buf.ptr, &m_buf.len); - std::unique_ptr conn = std::make_unique(sock, sockad, *log, play); + sendPack(sock, &m_game, &m_buf); + Connection* conn = new Connection(sock, sockad, *log, play); for (auto& [key, player] : m_players) { sendPack(player->getSock(), &play, &m_buf); // Envoyer les infos de joueur distant aux joueurs d�j� connect�s @@ -174,17 +175,20 @@ int Server::Ready() { } void Server::Run() { + bool endgame = false; Input in; sockaddr_in sockad; addrlen_t socklen = sizeof(sockad); Log("Debut de la partie...", false, false); - m_world = std::make_unique(); + int players = m_players.size(); + + m_world = new World(); m_world->SetSeed(m_game.seed); m_world->GetChunks().Reset(nullptr); m_world->BuildWorld(); - + for (auto& [key, conn] : m_players) { // Creation des instances de joueurs et premier sync. conn->player = std::make_unique(Vector3f(8.5f, CHUNK_SIZE_Y + 1.8f, 8.5f)); Sync sync; @@ -197,32 +201,41 @@ void Server::Run() { sendPack(conn->getSock(), &sync, &m_buf); } - while (true) { - if (recvfrom(m_sock_udp, m_buf.ptr, m_buf.len, 0, (sockaddr*)&sockad, &socklen) > 0) { - Packet pck = getPack(&m_buf); - switch (pck.type) { - using enum netprot::PACKET_TYPE; - case ERR: std::puts("ERROR!"); break; - case INPUT: std::puts("INPUT!"); break; - case OUTPUT: std::puts("OUTPUT!"); break; - case SYNC: std::puts("SYNC!"); break; - case TEAMINF: std::puts("TEAMINF!"); break; - case SELFINF: std::puts("SELFINF!"); break; - case PLAYINF: std::puts("PLAYINF!"); break; - case LOGINF: std::puts("LOGINF!"); break; - case CHUNKMOD: std::puts("CHUNKMOD!"); break; - case PLAYERMOD: std::puts("PLAYERMOD!"); break; - case PICKUPMOD: std::puts("PICKUPMOD!"); break; - case GAMEINFO: std::puts("GAMEINFO!"); break; - case ENDINFO: std::puts("ENDINFO!"); break; - case CHAT: std::puts("CHAT!"); break; - case ERRLOG: std::puts("ERRLOG!"); break; - case LAST_PACK: [[falltrough]]; - default: std::puts("wtf?!"); break; - } - netprot::emptyPack(pck); - } + while (!endgame) { + for (auto& [key, conn] : m_players) { + conn->getPacks(m_sock_udp); + conn->Run(m_world); + conn->sendPacks(m_sock_udp, m_players); + } } + + //while (true) { + // if (recvfrom(m_sock_udp, m_buf.ptr, m_buf.len, 0, (sockaddr*)&sockad, &socklen) > 0) { + // Packet pck = getPack(&m_buf); + // switch (pck.type) { + // using enum netprot::PACKET_TYPE; + // case ERR: std::puts("ERROR!"); break; + // case INPUT: std::puts("INPUT!"); break; + // case OUTPUT: std::puts("OUTPUT!"); break; + // case SYNC: std::puts("SYNC!"); break; + // case TEAMINF: std::puts("TEAMINF!"); break; + // case SELFINF: std::puts("SELFINF!"); break; + // case PLAYINF: std::puts("PLAYINF!"); break; + // case LOGINF: std::puts("LOGINF!"); break; + // case CHUNKMOD: std::puts("CHUNKMOD!"); break; + // case PLAYERMOD: std::puts("PLAYERMOD!"); break; + // case PICKUPMOD: std::puts("PICKUPMOD!"); break; + // case GAMEINFO: std::puts("GAMEINFO!"); break; + // case ENDINFO: std::puts("ENDINFO!"); break; + // case CHAT: std::puts("CHAT!"); break; + // case ERRLOG: std::puts("ERRLOG!"); break; + // case LAST_PACK: [[falltrough]]; + // default: std::puts("wtf?!"); break; + // } + // netprot::emptyPack(pck); + // } + //} + } inline std::string Server::LogTimestamp() { diff --git a/SQCSim-srv/server.h b/SQCSim-srv/server.h index 10b7709..dd5a397 100644 --- a/SQCSim-srv/server.h +++ b/SQCSim-srv/server.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "../SQCSim-common/world.h" #include "../SQCSim-common/netprotocol.h" #include "define.h" @@ -35,12 +36,12 @@ private: Buffer m_buf; - std::map> m_players; - std::map m_chatlog; + std::unordered_map m_players; + std::unordered_map m_chatlog; std::vector m_ids; GameInfo m_game; - std::unique_ptr m_world = nullptr; + World* m_world = nullptr; const bool m_manual_setup = SRV_MANUAL_SETUP; std::string LogTimestamp(); diff --git a/SQCSim2021/SQCSim2021.vcxproj b/SQCSim2021/SQCSim2021.vcxproj index fc67c42..31e1b8b 100644 --- a/SQCSim2021/SQCSim2021.vcxproj +++ b/SQCSim2021/SQCSim2021.vcxproj @@ -20,12 +20,14 @@ + + @@ -36,12 +38,14 @@ + + @@ -170,7 +174,7 @@ Fast - Windows + Console false true true @@ -192,7 +196,7 @@ Fast - Windows + Console false true true diff --git a/SQCSim2021/SQCSim2021.vcxproj.filters b/SQCSim2021/SQCSim2021.vcxproj.filters index 5c8a864..417ba37 100644 --- a/SQCSim2021/SQCSim2021.vcxproj.filters +++ b/SQCSim2021/SQCSim2021.vcxproj.filters @@ -53,6 +53,12 @@ Fichiers d%27en-tête + + Fichiers d%27en-tête + + + Fichiers d%27en-tête + @@ -97,5 +103,11 @@ Fichiers sources + + Fichiers sources + + + Fichiers sources + \ No newline at end of file diff --git a/SQCSim2021/audio.cpp b/SQCSim2021/audio.cpp index e849c6f..7691f88 100644 --- a/SQCSim2021/audio.cpp +++ b/SQCSim2021/audio.cpp @@ -48,3 +48,7 @@ void Audio::Render3DAudioObj(irrklang::ISound* sound, Vector3f& pos, Vector3f& v void Audio::ToggleMusicState() { m_music->setIsPaused(!m_music->getIsPaused()); } void Audio::PauseEngine() { m_engine->setAllSoundsPaused(); } + +float Audio::GetMusicVolume() const { + return m_music->getVolume(); +} diff --git a/SQCSim2021/audio.h b/SQCSim2021/audio.h index 775f316..f19682a 100644 --- a/SQCSim2021/audio.h +++ b/SQCSim2021/audio.h @@ -33,6 +33,8 @@ public: void ToggleMusicState(); void PauseEngine(); + + float GetMusicVolume() const; }; #endif // AUDIO_H__ diff --git a/SQCSim2021/booster.cpp b/SQCSim2021/booster.cpp new file mode 100644 index 0000000..593e16e --- /dev/null +++ b/SQCSim2021/booster.cpp @@ -0,0 +1,46 @@ +#include "booster.h"; + +void Booster::RenderBillboard(const Vector3f pos, TextureAtlas& textureAtlas, Shader& shader, Transformation tran) +{ + // + //Vector3f playerToQuad = m_player.GetPosition() - m_position; + //playerToQuad.Normalize(); + //Vector3f targetPosition = m_player.GetPosition() + playerToQuad * 10.0f; + //Matrix4f rotationMatrix; + //rotationMatrix.SetLookAt(m_position, targetPosition, Vector3f(0, 1, 0)); + //glMultMatrixf(rotationMatrix.GetInternalValues()); + float x = pos.x; + float y = pos.y; + float z = pos.z; + float width = 1.0f; + float height = 1.0f; + //Pt override les collisions.. a ce point la je sais pas quoi faire + + //Matrix4 mat4 = tran.GetMatrix(); + //mat4 VP = pMatrix * vMatrix; + //Vector3f CameraRight = Vector3f(mat4.Get11(), mat4.Get21(), mat4.Get31()); + //Vector3f CameraUp = Vector3f(mat4.Get12(), mat4.Get22(), mat4.Get32()); + + //Vector3f v1 = (m_position + CameraRight * 0.5 * width + CameraUp * -0.5 * width); + //Vector3f v2 = (m_position + CameraRight * 0.5 * width + CameraUp * 0.5 * width); + //Vector3f v4 = (m_position + CameraRight * -0.5 * width + CameraUp * -0.5 * width); + //Vector3f v3 = (m_position + CameraRight * -0.5 * width + CameraUp * 0.5 * width); + + //tran.ApplyTranslation(m_position); + float u, v, w, h; + //glDisable(GL_DEPTH_TEST); + shader.Use(); + textureAtlas.Bind(); + textureAtlas.TextureIndexToCoord(8, u, v, w, h); + //glLoadIdentity(); + glLoadMatrixf(tran.GetMatrix().GetInternalValues()); + glBegin(GL_QUADS); + glTexCoord2f(u, v); glVertex3f(x - width / 2., y - height, z); //glVertex3f(v4.x, v4.y, v4.z);//glVertex3f(0, 50, 0); + glTexCoord2f(u + w, v); glVertex3f(x + width / 2., y - height, z); //glVertex3f(v3.x, v3.y, v3.z); //glVertex3f(50,50, 0); + glTexCoord2f(u + w, v + h); glVertex3f(x + width / 2., y, z); //glVertex3f(v2.x, v2.y, v2.z); //glVertex3f(50, 0, 0); + glTexCoord2f(u, v + h); glVertex3f(x - width / 2., y, z); //glVertex3f(v1.x, v1.y, v1.z);// glVertex3f(0, 0, 0); + glEnd(); + shader.Disable(); + //tran.ApplyTranslation(-m_position); + //glEnable(GL_DEPTH_TEST); +} \ No newline at end of file diff --git a/SQCSim2021/booster.h b/SQCSim2021/booster.h new file mode 100644 index 0000000..e06f2b4 --- /dev/null +++ b/SQCSim2021/booster.h @@ -0,0 +1,14 @@ +#ifndef BOOSTER_H__ +#define BOOSTER_H__ +#include "define.h" +#include "textureatlas.h" +#include "shader.h" +#include "../SQCSim-common/vector3.h" +#include "../SQCSim-common/transformation.h" + + +class Booster { +public: + void RenderBillboard(const Vector3f pos, TextureAtlas& textureAtlas, Shader& shader, Transformation tran); +}; +#endif diff --git a/SQCSim2021/connector.cpp b/SQCSim2021/connector.cpp index 3611a37..867e36e 100644 --- a/SQCSim2021/connector.cpp +++ b/SQCSim2021/connector.cpp @@ -69,44 +69,51 @@ int Connector::Connect(const char* srv_addr, std::string name) { netprot::sendPack(m_sock_tcp, &log, &bf); + //using namespace std::chrono_literals; + //std::this_thread::sleep_for(100ms); + + memset(bf.ptr, '\0', BUFFER_LENGTH); + bool ready = false; int errors = 0; - std::vector lsPck; + std::vector lsPck; while (!ready) { lsPck = netprot::recvPacks(m_sock_tcp, &bf); for (auto& pck : lsPck) { - bool bypass_delete = false; + uint32_t bsize = bf.len - (pck - bf.ptr); netprot::PlayerInfo* pl = nullptr; - switch (pck.type) { + switch (netprot::getType(pck, 1)) { using enum netprot::PACKET_TYPE; case LOGINF: - m_loginfo = netprot::LoginInfo((netprot::LoginInfo*)pck.ptr); + if (!netprot::Deserialize(&m_loginfo, pck, &bsize)) + ++errors; break; case GAMEINFO: - m_gameinfo = netprot::GameInfo((netprot::GameInfo*)pck.ptr); + if (!netprot::Deserialize(&m_gameinfo, pck, &bsize)) + ++errors; break; case PLAYINF: - pl = (netprot::PlayerInfo*)pck.ptr; - m_players[pl->id] = pl; - bypass_delete = true; + pl = new netprot::PlayerInfo(); + if (!netprot::Deserialize(pl, pck, &bsize)) + ++errors; + else m_players[pl->id] = pl; break; case TEAMINF: // TODO: Faire dequoi avec TeamInfo si on fini par avoir des teams. break; case SYNC: - m_origin = netprot::Sync((netprot::Sync*)pck.ptr); + if (!netprot::Deserialize(&m_origin, pck, &bsize)) + ++errors; ready = true; break; default: errors++; break; } - if (!bypass_delete) - netprot::emptyPack(pck); } lsPck.clear(); - if (errors > 100) + if (errors > 1000) return 4; } return 0; diff --git a/SQCSim2021/connector.h b/SQCSim2021/connector.h index 4fd883e..c5361ac 100644 --- a/SQCSim2021/connector.h +++ b/SQCSim2021/connector.h @@ -2,6 +2,7 @@ #define CONNECTOR_H__ #include +#include #include "../SQCSim-common/netprotocol.h" #include "define.h" @@ -26,13 +27,13 @@ public: // void updateRemotePlayers(std::map rplayers); - std::map m_players; + std::unordered_map m_players; private: #ifdef _WIN32 WSADATA m_wsaData; #endif - std::map m_inputmanifest; - std::map m_teams; + std::unordered_map m_inputmanifest; + std::unordered_map m_teams; netprot::LoginInfo m_loginfo; netprot::GameInfo m_gameinfo; diff --git a/SQCSim2021/define.h b/SQCSim2021/define.h index 7f4c4af..e8b9e47 100644 --- a/SQCSim2021/define.h +++ b/SQCSim2021/define.h @@ -28,11 +28,28 @@ #define BASE_WIDTH 640 #define BASE_HEIGHT 480 - +#define ANIME_PATH_JUMP "./media/textures/AssetOtherPlayer/FinalPNGJumping/" +#define ANIME_PATH_STILL "./media/textures/AssetOtherPlayer/FinalPNGStanding/" #define TEXTURE_PATH "./media/textures/" #define SHADER_PATH "./media/shaders/" #define AUDIO_PATH "./media/audio/" #define CHUNK_PATH "./media/chunks/" -#define MENU_ITEM_PATH "./media/menu_items/" +#define BOOSTER_TEXTURE_PATH "./media/textures/Booster/" + +enum GameState { + MAIN_MENU, + SPLASH, + OPTIONS, + QUIT, + PLAY, + PAUSE +}; + +enum Resolution { + HD = 0, // 1280x720 (High Definition) + FHD, // 1920x1080 (Full HD) + QHD, // 2560x1440 (Quad HD) + UHD // 3840x2160 (Ultra HD) +}; #endif // DEFINE_H__ diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index 77bb3e7..1fc1afb 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -1,5 +1,7 @@ #include "engine.h" - +#include +#include +#include #include #include #include @@ -16,7 +18,7 @@ struct Notification { // Use a vector to manage notifications std::vector notifications; -Engine::Engine() {} +Engine::Engine() : m_remotePlayer(&m_pinfo), m_pinfo() {} Engine::~Engine() { m_world.CleanUpWorld(m_renderCount, true); @@ -26,258 +28,7 @@ Engine::~Engine() { m_world.GetChunks().Get(x, y)->~Chunk(); } -void Engine::DrawSplachScreen() -{ - glDisable(GL_LIGHTING); - glDisable(GL_DEPTH_TEST); - glDisable(GL_STENCIL_TEST); - - // Définir la matrice de projection en mode orthographique - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glOrtho(-Width() / 2, Width() / 2, -Height() / 2, Height() / 2, -1, 1); - - // Définir la matrice de modèle-vue - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - - // L'image sera centrée autour de l'origine (0, 0, 0) - int imageWidth = Width(); // Remplacez par la largeur de votre image - int imageHeight = Height(); // Remplacez par la hauteur de votre image - - // Texture - SplachScreenTexture.Bind(); - - // Dessiner un quadrilatère centré - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(-imageWidth / 2, -imageHeight / 2); - glTexCoord2f(1, 0); - glVertex2i(imageWidth / 2, -imageHeight / 2); - glTexCoord2f(1, 1); - glVertex2i(imageWidth / 2, imageHeight / 2); - glTexCoord2f(0, 1); - glVertex2i(-imageWidth / 2, imageHeight / 2); - glEnd(); - - // Activer la transparence - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBlendEquation(GL_FUNC_ADD); - glEnable(GL_BLEND); - - // Restaurer les matrices précédentes - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - - m_gamestate = GameState::OPTIONS; -} - - - -void Engine::DrawMenu() -{ - static const int sTitle = 400; - static const int sButton = 225; - - glDisable(GL_LIGHTING); - - - glDisable(GL_DEPTH_TEST); - glDisable(GL_STENCIL_TEST); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glOrtho(0, Width(), 0, Height(), -1, 1); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - - MenuBGTexture.Bind(); - glLoadIdentity(); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 0); - glTexCoord2f(1, 0); - glVertex2i(Width(), 0); // - glTexCoord2f(1, 1); - glVertex2i(Width(), Height()); - glTexCoord2f(0, 1); - glVertex2i(0, Height()); - glEnd(); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBlendEquation(GL_FUNC_ADD); - glEnable(GL_BLEND); - - if (m_gamestate != GameState::OPTIONS) - { - MenuTitleTexture.Bind(); - glTranslated(200, 300, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 200); - glTexCoord2f(1, 0); - glVertex2i(sTitle, 200); - glTexCoord2f(1, 1); - glVertex2i(sTitle, 300); - glTexCoord2f(0, 1); - glVertex2i(0, 300); - glEnd(); - - - - MenuStartTexture.Bind(); - glTranslated(80, -225, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 100); - glTexCoord2f(1, 0); - glVertex2i(sButton , 100); - glTexCoord2f(1, 1); - glVertex2i(sButton, 200); - glTexCoord2f(0, 1); - glVertex2i(0, 200); - glEnd(); - - - /*MenuResumeTexture.Bind(); - glTranslated(0, -100, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 125); - //glTexCoord2f(1, 0); - glVertex2i(sButton, 125); - glTexCoord2f(1, 1); - glVertex2i(sButton, 200); - glTexCoord2f(0, 1); - glVertex2i(0, 200); - glEnd();*/ - - /*MenuOptionsTexture.Bind(); - glTranslated(0, -100, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 125); - glTexCoord2f(1, 0); - glVertex2i(sButton, 125); - glTexCoord2f(1, 1); - glVertex2i(sButton, 200); - glTexCoord2f(0, 1); - glVertex2i(0, 200); - glEnd();*/ - - MenuQuitTexture.Bind(); - glTranslated(0, -100, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 100); - glTexCoord2f(1, 0); - glVertex2i(sButton, 100); - glTexCoord2f(1, 1); - glVertex2i(sButton, 200); - glTexCoord2f(0, 1); - glVertex2i(0, 200); - glEnd(); - - } - else - { - /*MenuOptionsTexture.Bind(); - glTranslated(200, 0, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 0); - glTexCoord2f(1, 0); - glVertex2i(sTitle, 0); - glTexCoord2f(1, 1); - glVertex2i(sTitle, 200); - glTexCoord2f(0, 1); - glVertex2i(0, 200); - glEnd(); - - WireFrameTexture.Bind(); - glTranslated(0, 300, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 125); - glTexCoord2f(1, 0); - glVertex2i(sButton, 125); - glTexCoord2f(1, 1); - glVertex2i(sButton, 200); - glTexCoord2f(0, 1); - glVertex2i(0, 200); - glEnd(); - - OnOffBtnTexture.Bind(); - glTranslated(200, 0, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 125); - glTexCoord2f(1, 0); - glVertex2i(sButton, 125); - glTexCoord2f(1, 1); - glVertex2i(sButton, 200); - glTexCoord2f(0, 1); - glVertex2i(0, 200); - glEnd(); - glTranslated(-400, -300, 0); - - MusicTexture.Bind(); - glTranslated(200, 200, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 125); - glTexCoord2f(1, 0); - glVertex2i(sButton, 125); - glTexCoord2f(1, 1); - glVertex2i(sButton, 200); - glTexCoord2f(0, 1); - glVertex2i(0, 200); - glEnd(); - - OnOffBtnTexture.Bind(); - glTranslated(200, 0, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 125); - glTexCoord2f(1, 0); - glVertex2i(sButton, 125); - glTexCoord2f(1, 1); - glVertex2i(sButton, 200); - glTexCoord2f(0, 1); - glVertex2i(0, 200); - glEnd(); - - BackBtnTexture.Bind(); - glTranslated(-375, 175, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 140); - glTexCoord2f(1, 0); - glVertex2i(sButton, 140); - glTexCoord2f(1, 1); - glVertex2i(sButton, 200); - glTexCoord2f(0, 1); - glVertex2i(0, 200); - glEnd();*/ - } - - //glEnable(GL_LIGHTING); - glDisable(GL_BLEND); - glEnable(GL_DEPTH_TEST); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - ShowCursor(); -} - void Engine::Init() { - - GLenum glewErr = glewInit(); if (glewErr != GLEW_OK) { std::cerr << " ERREUR GLEW : " << glewGetErrorString(glewErr) << std::endl; @@ -285,14 +36,12 @@ void Engine::Init() { } uint64_t seed = SEED; - char ch; glDisable(GL_FRAMEBUFFER_SRGB); - glEnable(GL_DEPTH_TEST); + glEnable(GL_DEPTH_TEST); glEnable(GL_STENCIL_TEST); glEnable(GL_POINT_SMOOTH); glEnable(GL_BLEND); - glEnable(GL_CULL_FACE); glEnable(GL_TEXTURE_2D); glMatrixMode(GL_PROJECTION); @@ -305,11 +54,13 @@ void Engine::Init() { glDisable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_SUBTRACT); - - // + + if (m_istarted) + return; + else m_istarted = true; + // Objet de skybox avec sa propre texture et son propre shader! m_skybox.Init(0.2f); - // Objet de musique! //m_audio.ToggleMusicState(); @@ -319,59 +70,61 @@ void Engine::Init() { m_whoosh[x] = nullptr; } - std::cout << "Jouer en ligne? [o/N] "; - std::cin >> ch; - std::cout << std::endl; + char* ch = new char[2]; - if (ch == 'o' || ch == 'O') { - char* input = new char[32]; - std::string playname, srvname; + std::cout << "Jouer en ligne? [o/N] "; + std::cin.getline(ch, 2); + std::cout << std::endl; - while (playname.size() < 1) { - std::cout << "Veuillez entrer un nom de joueur: "; - std::cin.ignore(); - std::cin.getline(input, 32); - std::cout << std::endl; - playname = input; - if (playname.size() < 1 || playname.size() > 32) - std::puts("Nom invalide."); - } - while (srvname.size() < 1) { - std::cout << "Veuillez entrer une adresse de serveur: "; - std::cin.getline(input, 32); - std::cout << std::endl; - srvname = input; - if (srvname.size() < 1 || srvname.size() > 32) - std::puts("Adresse serveur invalide."); - } - delete[] input; + if (*ch == 'o' || *ch == 'O') { + char* input = new char[32]; + std::string playname, srvname; - if (!m_conn.Init()) { - if (!m_conn.Connect(srvname.c_str(), playname)) { - // setup jeu en reseau. - std::cout << "ID recu du serveur: " << std::to_string(m_conn.getId()) << "!" << std::endl; - std::cout << "Seed recu du serveur: " << std::to_string(m_conn.getSeed()) << "!" << std::endl; - m_player = Player(m_conn.getOrigin().position); - - for (auto& [key, player] : m_conn.m_players) - m_players[key] = new RemotePlayer(player); - - seed = m_conn.getSeed(); - m_networkgame = true; - } - else std::cout << "Erreur de connexion." << std::endl; - } - else std::cout << "Erreur de creation de socket." << std::endl; + while (playname.size() < 1) { + std::cout << "Veuillez entrer un nom de joueur: "; + std::cin.getline(input, 32); + std::cout << std::endl; + playname = input; + if (playname.size() < 1 || playname.size() > 32) + std::puts("Nom invalide."); } + while (srvname.size() < 1) { + std::cout << "Veuillez entrer une adresse de serveur: "; + std::cin.getline(input, 32); + std::cout << std::endl; + srvname = input; + if (srvname.size() < 1 || srvname.size() > 32) + std::puts("Adresse serveur invalide."); + } + delete[] input; + + if (!m_conn.Init()) { + if (!m_conn.Connect(srvname.c_str(), playname)) { + // setup jeu en reseau. + std::cout << "ID recu du serveur: " << std::to_string(m_conn.getId()) << "!" << std::endl; + std::cout << "Seed recu du serveur: " << std::to_string(m_conn.getSeed()) << "!" << std::endl; + m_player = Player(m_conn.getOrigin().position); + + for (auto& [key, player] : m_conn.m_players) + m_players[key] = new RemotePlayer(player); + + seed = m_conn.getSeed(); + m_networkgame = true; + } + else std::cout << "Erreur de connexion." << std::endl; + } + else std::cout << "Erreur de creation de socket." << std::endl; + } + delete[] ch; m_world.SetSeed(seed); // Init Chunks m_world.GetChunks().Reset(nullptr); - // Gestion de souris. - CenterMouse(); - HideCursor(); + m_startTime = std::chrono::high_resolution_clock::now(); + + m_remotePlayer.SetPosition(Vector3f(.5, CHUNK_SIZE_Y + 10., .5)); } void Engine::DeInit() {} @@ -382,22 +135,78 @@ void Engine::LoadResource() { LoadTexture(m_textureFont, TEXTURE_PATH "font.bmp", true); LoadTexture(m_textureGun, TEXTURE_PATH "gun01.png", false); LoadTexture(m_texturePovGun, TEXTURE_PATH "GUN.png", false); - LoadTexture(m_textureSoloMultiMenu, TEXTURE_PATH "single_multi.png", false); - LoadTexture(m_textureSoloText, TEXTURE_PATH "single_player.png", false); - LoadTexture(m_textureMultiText, TEXTURE_PATH "multi_player.png", false); - LoadTexture(m_textureSoloMultiMenu, TEXTURE_PATH "single_multi.png", false); - LoadTexture(m_textureTitle, TEXTURE_PATH "title.png", false); - LoadTexture(MenuTitleTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); - LoadTexture(MenuBGTexture, TEXTURE_PATH "BrouillonbackgroundMenu.png"); - LoadTexture(SplachScreenTexture, TEXTURE_PATH "sc2.png"); - LoadTexture(MenuQuitTexture, MENU_ITEM_PATH "BasicQuit.png"); - LoadTexture(MenuOptionsTexture, MENU_ITEM_PATH "test.png"); - LoadTexture(MenuStartTexture, MENU_ITEM_PATH "BasicPlay.png"); + LoadTexture(m_textureMainMenu, TEXTURE_PATH "menus/backgrounds/bgMainMenu.png", false); + LoadTexture(m_texturePauseMenu, TEXTURE_PATH "menus/backgrounds/bgPause.png", false); + LoadTexture(m_textureOptionsMenu, TEXTURE_PATH "menus/backgrounds/bgOptions.png", false); + LoadTexture(m_textureSplashScreen, TEXTURE_PATH "menus/backgrounds/bgSplash.png", false); + + LoadTexture(m_textureCheck, TEXTURE_PATH "menus/others/check.png", false); + LoadTexture(m_textureChecked, TEXTURE_PATH "menus/others/checked.png", false); + + LoadTexture(m_textureOptAudio, TEXTURE_PATH "menus/buttons/options/optAudio.png", false); + LoadTexture(m_textureOptBack, TEXTURE_PATH "menus/buttons/options/optBack.png", false); + LoadTexture(m_textureOptGameplay, TEXTURE_PATH "menus/buttons/options/optGameplay.png", false); + LoadTexture(m_textureOptGraphics, TEXTURE_PATH "menus/buttons/options/optGraphics.png", false); + LoadTexture(m_textureOptMain, TEXTURE_PATH "menus/buttons/options/optMain.png", false); + LoadTexture(m_textureOptMusic, TEXTURE_PATH "menus/buttons/options/optMusic.png", false); + LoadTexture(m_textureOptOptions, TEXTURE_PATH "menus/buttons/options/optOptions.png", false); + LoadTexture(m_textureOptResolution, TEXTURE_PATH "menus/buttons/options/optResolution.png", false); + LoadTexture(m_textureOptSensitivity, TEXTURE_PATH "menus/buttons/options/optSensitivity.png", false); + LoadTexture(m_textureOptSfx, TEXTURE_PATH "menus/buttons/options/optSfx.png", false); + + LoadTexture(m_textureHd, TEXTURE_PATH "menus/labels/labelHd.png", false); + LoadTexture(m_textureFhd, TEXTURE_PATH "menus/labels/labelFhd.png", false); + LoadTexture(m_textureQhd, TEXTURE_PATH "menus/labels/labelQhd.png", false); + LoadTexture(m_textureUhd, TEXTURE_PATH "menus/labels/labelUhd.png", false); + LoadTexture(m_textureMenuTitle, TEXTURE_PATH "menus/labels/labelTitle.png", false); + + LoadTexture(m_textureMenuBack, TEXTURE_PATH "menus/buttons/main/mainBack.png", false); + LoadTexture(m_textureMenuMulti, TEXTURE_PATH "menus/buttons/main/mainMulti.png", false); + LoadTexture(m_textureMenuOptions, TEXTURE_PATH "menus/buttons/main/mainOptions.png", false); + LoadTexture(m_textureMenuPlay, TEXTURE_PATH "menus/buttons/main/mainPlay.png", false); + LoadTexture(m_textureMenuQuit, TEXTURE_PATH "menus/buttons/main/mainQuit.png", false); + LoadTexture(m_textureMenuSingle, TEXTURE_PATH "menus/buttons/main/mainSingle.png", false); + TextureAtlas::TextureIndex texDirtIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal2.png"); TextureAtlas::TextureIndex texIceIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "metal3.png"); TextureAtlas::TextureIndex texGrassIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "grass.png"); TextureAtlas::TextureIndex texMetalIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "dirt.png"); + TextureAtlas::TextureIndex texGreenGrassIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "greengrass.png"); + TextureAtlas::TextureIndex texBoostHeal = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterVert.png"); + TextureAtlas::TextureIndex texBoostDmg = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterRouge.png"); + TextureAtlas::TextureIndex texBoostSpd = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterBleu.png"); + TextureAtlas::TextureIndex texBoostInv = m_textureAtlas.AddTexture(BOOSTER_TEXTURE_PATH "BoosterJaune.png"); + + //AJOUTER LES TEXTURES DANS L'ORDRE DE L'ÉNUM + + //JUMP + //TextureAtlas::TextureIndex JumpBack = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueBackJumpRight.png"); + //TextureAtlas::TextureIndex JumpFront = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueFrontJumpRight.png"); + //TextureAtlas::TextureIndex JumpQuarterBackLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeftBackJumpLeft.png"); + //TextureAtlas::TextureIndex JumpQuarterBackRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRightBackJumpRight.png"); + //TextureAtlas::TextureIndex JumpProfiltLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilJumpLeft.png"); + //TextureAtlas::TextureIndex JumpProfiltRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilJumpRight.png"); + //TextureAtlas::TextureIndex JumpQuarterFrontLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeftFrontJumpLeft.png"); + //TextureAtlas::TextureIndex JumpQuarterFrontRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRightFrontJumpRight.png"); + + //STILL + //TextureAtlas::TextureIndex StillBack = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueBackRight.png"); + TextureAtlas::TextureIndex StillFront = m_animeAtlas.AddTexture(ANIME_PATH_STILL "BlueFrontRight.png"); + //TextureAtlas::TextureIndex StillQuarterBackLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeftBack.png"); + //TextureAtlas::TextureIndex StillQuarterBackRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRightBack.png"); + //TextureAtlas::TextureIndex StillProfiltLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilLeft.png"); + //TextureAtlas::TextureIndex StillProfiltRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueProfilRight.png"); + //TextureAtlas::TextureIndex StillQuarterFrontLeft = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueLeft.png"); + //TextureAtlas::TextureIndex StillQuarterFrontRight = m_animeAtlas.AddTexture(ANIME_PATH_JUMP "BlueRight.png"); + + //SHOOTINGSTILL + //SHOOTINGJUMP + + if (!m_animeAtlas.Generate(TEXTURE_SIZE, false)) { + std::cout << " Unable to generate texture atlas ..." << std::endl; + abort(); + } if (!m_textureAtlas.Generate(TEXTURE_SIZE, false)) { std::cout << " Unable to generate texture atlas ..." << std::endl; @@ -413,6 +222,18 @@ void Engine::LoadResource() { m_blockinfo[BTYPE_METAL] = new BlockInfo(BTYPE_METAL, "Metal", u, v, s, 1); m_textureAtlas.TextureIndexToCoord(texIceIndex, u, v, s, s); m_blockinfo[BTYPE_ICE] = new BlockInfo(BTYPE_ICE, "Ice", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texGreenGrassIndex, u, v, s, s); + m_blockinfo[BTYPE_GREENGRASS] = new BlockInfo(BTYPE_GREENGRASS, "GreenGrass", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texBoostHeal, u, v, s, s); + m_boostinfo[BTYPE_HEAL] = new BoostInfo(BTYPE_HEAL, "Heal", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texBoostDmg, u, v, s, s); + m_boostinfo[BTYPE_DAMAGE] = new BoostInfo(BTYPE_DAMAGE, "Dmg", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texBoostSpd, u, v, s, s); + m_boostinfo[BTYPE_SPEED] = new BoostInfo(BTYPE_SPEED, "Spd", u, v, s, 1); + m_textureAtlas.TextureIndexToCoord(texIceIndex, u, v, s, s); + m_boostinfo[BTYPE_INVINCIBLE] = new BoostInfo(BTYPE_INVINCIBLE, "Inv", u, v, s, 1); + + m_animeAtlas.TextureIndexToCoord(0, u, v, s, s); std::cout << " Loading and compiling shaders ..." << std::endl; if (!m_shader01.Load(SHADER_PATH "shader01.vert", SHADER_PATH "shader01.frag", true)) { @@ -428,8 +249,9 @@ void Engine::LoadResource() { void Engine::UnloadResource() {} -void Engine::InstantDamage() -{ + + +void Engine::InstantDamage() { m_player.InflictDamage(0.10f); m_damage = false; } @@ -441,6 +263,7 @@ void Engine::SystemNotification(std::string systemLog) { DisplayNotification(message); } + void Engine::KillNotification(Player killer, Player killed) { std::string message = ""; @@ -531,61 +354,7 @@ void Engine::DisplayCrosshair() { glEnd(); } -void Engine::DisplayPovGun() { - // Setter le blend function, tout ce qui sera noir sera transparent - glDisable(GL_STENCIL_TEST); - glDisable(GL_DEPTH_TEST); - - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBlendEquation(GL_FUNC_ADD); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - - glLoadIdentity(); - glOrtho(0, Width(), 0, Height(), -1, 1); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - - float baseXOffsetPercentage = 0.4958; - float baseWidthPercentage = 0.4688; - float baseHeightPercentage = 0.5787; - - float xTranslation = baseXOffsetPercentage * Width(); - float quadWidth = baseWidthPercentage * Width(); - float quadHeight = baseHeightPercentage * Height(); - - m_texturePovGun.Bind(); - glLoadIdentity(); - glTranslated(xTranslation, 0, 0); - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(0, 0); - glTexCoord2f(1, 0); - glVertex2i(quadWidth, 0); - glTexCoord2f(1, 1); - glVertex2i(quadWidth, quadHeight); - glTexCoord2f(0, 1); - glVertex2i(0, quadHeight); - glEnd(); - - // Reset du blend function - glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR); - glBlendEquation(GL_FUNC_SUBTRACT); - - glEnable(GL_STENCIL_TEST); - glEnable(GL_DEPTH_TEST); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); -} - -void Engine::DisplayCurrentItem() { -} - +void Engine::DisplayCurrentItem() {} void Engine::DisplayHud(int timer) { glBindTexture(GL_TEXTURE_2D, 0); @@ -647,12 +416,12 @@ void Engine::DisplayHud(int timer) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor3f(1.0f * facteurOmbrage, 1.0f * facteurOmbrage, 1.0f * facteurOmbrage); - float equipWidthProportion = 0.8f; - float equipHeightProportion = 0.7f; + float equipWidthProportion = 0.8f; + float equipHeightProportion = 0.7f; float equipWidth = itemBackgroundWidth * equipWidthProportion; float equipHeight = itemBackgroundHeight * equipHeightProportion; float equipXOffset = itemBackgroundXPos + (itemBackgroundWidth - equipWidth) * 0.1f; - float equipYOffset = itemBackgroundYPos + (itemBackgroundHeight - equipHeight) * 0.75f; + float equipYOffset = itemBackgroundYPos + (itemBackgroundHeight - equipHeight) * 0.75f; glTranslatef(equipXOffset, equipYOffset, 0); @@ -680,7 +449,7 @@ void Engine::DisplayHud(int timer) { ss.str(""); ss << m_player.GetHP() * 100 << "%"; PrintText(itemBackgroundXPos * 5.25f, fUsernamePosY, ss.str(), 1.5f); - + float countdownXOffset = Width() * 0.2f; float countdownYOffset = Height() * 0.1f; float countdownXPos = Width() - countdownXOffset; @@ -692,178 +461,6 @@ void Engine::DisplayHud(int timer) { PrintText(countdownXPos, countdownYPos, ss.str(), 2.0f); } -void Engine::DisplayInfo(float elapsedTime, BlockType bloc) { - m_textureFont.Bind(); - std::ostringstream ss; - - float marginX = Width() * 0.01; - float marginY = Height() * 0.05; - - float fPosX = marginX; - float fPosY = Height() - marginY; - - float charSize = 20 + (24 - 20) * (Width() - 1600) / (1920 - 1600); - - ss << " Fps : " << GetFps(elapsedTime); - PrintText(fPosX, fPosY, ss.str()); - ss.str(""); - fPosY -= charSize; - - ss << " Rendered Chunks : " << m_renderCount; - PrintText(fPosX, fPosY, ss.str()); - ss.str(""); - fPosY -= charSize; - - ss << " To-Be-Deleted Chunks : " << m_world.GettbDeleted(); - PrintText(fPosX, fPosY, ss.str()); - ss.str(""); - fPosY -= charSize; - - float fPosYJump = Height() * 0.09; - fPosY = fPosYJump; - fPosY -= charSize; - - ss << " Velocity : " << m_player.GetVelocity(); - PrintText(fPosX, fPosY, ss.str()); - ss.str(""); - fPosY -= charSize; - - ss << " Direction : " << m_player.GetDirection(); - PrintText(fPosX, fPosY, ss.str()); - ss.str(""); - fPosY -= charSize; - - ss << " Position : " << m_player.GetPosition(); - PrintText(fPosX, fPosY, ss.str()); - ss.str(""); - fPosY -= charSize; - - ss << " Block : "; - if (bloc == BTYPE_LAST) - ss << "Weapon"; - else - ss << (int)bloc; - PrintText(fPosX, fPosYJump, ss.str()); -} - -void Engine::DisplaySingleOrMultiplayerMenu() { - GLint viewport[4]; - glGetIntegerv(GL_VIEWPORT, viewport); - - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBlendEquation(GL_FUNC_ADD); - - glDisable(GL_STENCIL_TEST); - glDisable(GL_DEPTH_TEST); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - - glLoadIdentity(); - glOrtho(0, Width(), 0, Height(), -1, 1); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - - // Background - m_textureSoloMultiMenu.Bind(); - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); - glTexCoord2f(1.0f, 0.0f); glVertex2f(Width(), 0.0f); - glTexCoord2f(1.0f, 1.0f); glVertex2f(Width(), Height()); - glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, Height()); - glEnd(); - - // Title - float titleWidthProportion = 0.4f; - float titleHeightProportion = 0.4f; - float titleWidth = titleWidthProportion * Width(); - float titleHeight = titleHeightProportion * Height(); - float offsetTitleXFactor = 0.05f; - float offsetTitleYFactor = 0.05f; - m_titleX = (Width() - titleWidth) - (offsetTitleXFactor * Width()); - m_titleY = (Height() - titleHeight) - (offsetTitleYFactor * Height()); - - m_textureTitle.Bind(); - glColor4f(1.0f, 0.5f, 0.0f, 1.0f); - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(m_titleX, m_titleY); - glTexCoord2f(1.0f, 0.0f); glVertex2f(m_titleX + titleWidth, m_titleY); - glTexCoord2f(1.0f, 1.0f); glVertex2f(m_titleX + titleWidth, m_titleY + titleHeight); - glTexCoord2f(0.0f, 1.0f); glVertex2f(m_titleX, m_titleY + titleHeight); - glEnd(); - - glBindTexture(GL_TEXTURE_2D, 0); - - // Single Player and Multiplayer button background quads - float buttonWidthProportion = 0.4f; - float buttonHeightProportion = 0.075f; - float buttonWidth = buttonWidthProportion * Width(); - float buttonHeight = buttonHeightProportion * Height(); - float offsetSingleButtonXFactor = 0.075f; - float offsetSingleButtonYFactor = 0.05f; - - float buttonPosX = m_titleX; - float buttonSinglePosY = m_titleY - buttonHeight - (offsetSingleButtonYFactor * Height()); - float buttonMultiPosY = (buttonSinglePosY * 0.75); - - // Single Player background - glColor4f(1.0f, 1.0f, 1.0f, 0.5f); - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(buttonPosX, buttonSinglePosY); - glTexCoord2f(1.0f, 0.0f); glVertex2f(buttonPosX + buttonWidth, buttonSinglePosY); - glTexCoord2f(1.0f, 1.0f); glVertex2f(buttonPosX + buttonWidth, buttonSinglePosY + buttonHeight); - glTexCoord2f(0.0f, 1.0f); glVertex2f(buttonPosX, buttonSinglePosY + buttonHeight); - glEnd(); - - // Single Player text - m_textureSoloText.Bind(); - glColor4f(0.75f, 0.05f, 0.0f, 1.0f); - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(buttonPosX, buttonSinglePosY); - glTexCoord2f(1.0f, 0.0f); glVertex2f(buttonPosX + buttonWidth, buttonSinglePosY); - glTexCoord2f(1.0f, 1.0f); glVertex2f(buttonPosX + buttonWidth, buttonSinglePosY + buttonHeight); - glTexCoord2f(0.0f, 1.0f); glVertex2f(buttonPosX, buttonSinglePosY + buttonHeight); - glEnd(); - - glBindTexture(GL_TEXTURE_2D, 0); - // Multi Player background - glColor4f(1.0f, 1.0f, 1.0f, 0.5f); - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(buttonPosX, buttonMultiPosY); - glTexCoord2f(1.0f, 0.0f); glVertex2f(buttonPosX + buttonWidth, buttonMultiPosY); - glTexCoord2f(1.0f, 1.0f); glVertex2f(buttonPosX + buttonWidth, buttonMultiPosY + buttonHeight); - glTexCoord2f(0.0f, 1.0f); glVertex2f(buttonPosX, buttonMultiPosY + buttonHeight); - glEnd(); - - // Multi Player text - m_textureMultiText.Bind(); - glColor4f(0.75f, 0.05f, 0.0f, 1.0f); - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex2f(buttonPosX, buttonMultiPosY); - glTexCoord2f(1.0f, 0.0f); glVertex2f(buttonPosX + buttonWidth, buttonMultiPosY); - glTexCoord2f(1.0f, 1.0f); glVertex2f(buttonPosX + buttonWidth, buttonMultiPosY + buttonHeight); - glTexCoord2f(0.0f, 1.0f); glVertex2f(buttonPosX, buttonMultiPosY + buttonHeight); - glEnd(); - - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - - // Reset the state - glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); - - glEnable(GL_STENCIL_TEST); - glEnable(GL_DEPTH_TEST); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - - ShowCursor(); -} - void Engine::DrawHud(float elapsedTime, BlockType bloc) { // Setter le blend function, tout ce qui sera noir sera transparent glDisable(GL_STENCIL_TEST); @@ -883,7 +480,12 @@ void Engine::DrawHud(float elapsedTime, BlockType bloc) { glPushMatrix(); int timer = GetCountdown(elapsedTime); - + for (int i = 1; i < WORLD_SIZE_X; i++) { + if (timer <= COUNTDOWN - m_timerReductionChunk * i) { + m_world.RemoveChunk(m_nbReductionChunk * i); + m_renderer.RemoveChunk(m_nbReductionChunk * i); + } + } if (m_keyK) { SystemNotification(m_messageNotification); m_keyK = false; @@ -919,6 +521,58 @@ void Engine::DrawHud(float elapsedTime, BlockType bloc) { glPopMatrix(); } +void Engine::DisplayPovGun() { + // Setter le blend function, tout ce qui sera noir sera transparent + glDisable(GL_STENCIL_TEST); + glDisable(GL_DEPTH_TEST); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + + glLoadIdentity(); + glOrtho(0, Width(), 0, Height(), -1, 1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + float baseXOffsetPercentage = 0.4958; + float baseWidthPercentage = 0.4688; + float baseHeightPercentage = 0.5787; + + float xTranslation = baseXOffsetPercentage * Width(); + float quadWidth = baseWidthPercentage * Width(); + float quadHeight = baseHeightPercentage * Height(); + + m_texturePovGun.Bind(); + glLoadIdentity(); + glTranslated(xTranslation, 0, 0); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); + glVertex2i(0, 0); + glTexCoord2f(1, 0); + glVertex2i(quadWidth, 0); + glTexCoord2f(1, 1); + glVertex2i(quadWidth, quadHeight); + glTexCoord2f(0, 1); + glVertex2i(0, quadHeight); + glEnd(); + + // Reset du blend function + glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR); + glBlendEquation(GL_FUNC_SUBTRACT); + + glEnable(GL_STENCIL_TEST); + glEnable(GL_DEPTH_TEST); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); +} + void Engine::PrintText(float x, float y, const std::string& t, float charSizeMultiplier) { float windowWidth = static_cast(Width()); float windowHeight = static_cast(Height()); @@ -929,6 +583,7 @@ void Engine::PrintText(float x, float y, const std::string& t, float charSizeMul float baseCharSize = 20 + (24 - 20) * (windowWidth - 1600) / (1920 - 1600); float charSize = baseCharSize * charSizeMultiplier; + glPushMatrix(); glLoadIdentity(); glTranslated(x, y, 0); @@ -946,13 +601,15 @@ void Engine::PrintText(float x, float y, const std::string& t, float charSizeMul glTranslated(0.5555f * charSize, 0, 0); } + glPopMatrix(); } int Engine::GetFps(float elapsedTime) const { return 1 / elapsedTime; } int Engine::GetCountdown(float elapsedTime) { - if (m_resetcountdown) - { + if (m_resetcountdown) { + m_nbReductionChunk = 4; + m_timerReductionChunk = 30; m_countdown = m_time + COUNTDOWN; m_resetcountdown = false; } @@ -963,15 +620,547 @@ int Engine::GetCountdown(float elapsedTime) { return m_countdown - (int)m_time; } +int Engine::GetOptionsChoice() { + return m_selectedOption; +} + +void Engine::DisplayInfo(float elapsedTime, BlockType bloc) { + m_textureFont.Bind(); + std::ostringstream ss; + + float marginX = Width() * 0.01; + float marginY = Height() * 0.05; + + float fPosX = marginX; + float fPosY = Height() - marginY; + + float charSize = 20 + (24 - 20) * (Width() - 1600) / (1920 - 1600); + + ss << " Fps : " << GetFps(elapsedTime); + PrintText(fPosX, fPosY, ss.str()); + ss.str(""); + fPosY -= charSize; + + ss << " Rendered Chunks : " << m_renderCount; + PrintText(fPosX, fPosY, ss.str()); + ss.str(""); + fPosY -= charSize; + + ss << " To-Be-Deleted Chunks : " << m_world.GettbDeleted(); + PrintText(fPosX, fPosY, ss.str()); + ss.str(""); + fPosY -= charSize; + + float fPosYJump = Height() * 0.09; + fPosY = fPosYJump; + fPosY -= charSize; + + ss << " Velocity : " << m_remotePlayer.GetVelocity(); + PrintText(fPosX, fPosY, ss.str()); + ss.str(""); + fPosY -= charSize; + + ss << " Player Position : " << m_player.GetPosition(); + PrintText(fPosX, fPosY, ss.str()); + ss.str(""); + fPosY -= charSize; + + ss << " Remote Position : " << m_remotePlayer.GetPosition();//m_player.GetPosition(); + PrintText(fPosX, fPosY, ss.str()); + ss.str(""); + fPosY -= charSize; + + ss << " Block : "; + if (bloc == BTYPE_LAST) + ss << "Weapon"; + else + ss << (int)bloc; + PrintText(fPosX, fPosYJump, ss.str()); +} + +void Engine::DisplaySplashScreen() { + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); + glDisable(GL_STENCIL_TEST); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(-Width() / 2, Width() / 2, -Height() / 2, Height() / 2, -1, 1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + int imageWidth = Width(); + int imageHeight = Height(); + + m_textureSplashScreen.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(-imageWidth / 2, -imageHeight / 2); + glTexCoord2f(1, 0); glVertex2i(imageWidth / 2, -imageHeight / 2); + glTexCoord2f(1, 1); glVertex2i(imageWidth / 2, imageHeight / 2); + glTexCoord2f(0, 1); glVertex2i(-imageWidth / 2, imageHeight / 2); + glEnd(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); +} + +void Engine::DisplayPauseMenu() { + + m_texturePauseMenu.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(0, 0); + glTexCoord2f(1, 0); glVertex2i(Width(), 0); + glTexCoord2f(1, 1); glVertex2i(Width(), Height()); + glTexCoord2f(0, 1); glVertex2i(0, Height()); + glEnd(); +} + +void Engine::DisplayMainMenu() { + GLint viewport[4]; + glGetIntegerv(GL_VIEWPORT, viewport); + + glDisable(GL_STENCIL_TEST); + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + + glLoadIdentity(); + glOrtho(0, Width(), 0, Height(), -1, 1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + // Background + m_textureMainMenu.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); + glTexCoord2f(1.0f, 0.0f); glVertex2f(Width(), 0.0f); + glTexCoord2f(1.0f, 1.0f); glVertex2f(Width(), Height()); + glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, Height()); + glEnd(); + + // Title + float centerX = Width() * 0.5f; + float centerY = Height() * 0.5f; + + glColor4f(1.0f, 0.5f, 0.0f, 1.0f); + m_textureMenuTitle.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); glVertex2f(centerX + Width() * 0.05, centerY + Height() * 0.05); + glTexCoord2f(1.0f, 0.0f); glVertex2f(centerX + Width() * 0.45, centerY + Height() * 0.05); + glTexCoord2f(1.0f, 1.0f); glVertex2f(centerX + Width() * 0.45, centerY + Height() * 0.45); + glTexCoord2f(0.0f, 1.0f); glVertex2f(centerX + Width() * 0.05, centerY + Height() * 0.45); + glEnd(); + + DrawButtonBackgrounds(centerX, centerY, 3); + + if (m_gamestate == GameState::MAIN_MENU) { + if (m_selectedPlayOptions) { + DrawSingleMultiButtons(centerX, centerY); + } + else { + DrawMainMenuButtons(centerX, centerY); + } + } + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); + + glEnable(GL_STENCIL_TEST); + glEnable(GL_DEPTH_TEST); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + ShowCursor(); +} + +void Engine::DrawMainMenuButtons(float centerX, float centerY) { + m_textureMenuPlay.Bind(); + glColor4f(0.75f, 0.05f, 0.0f, 1.0f); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); glVertex2f(centerX + Width() * 0.16, centerY - Height() * 0.065); + glTexCoord2f(1.0f, 0.0f); glVertex2f(centerX + Width() * 0.34, centerY - Height() * 0.065); + glTexCoord2f(1.0f, 1.0f); glVertex2f(centerX + Width() * 0.34, centerY - Height() * 0.01); + glTexCoord2f(0.0f, 1.0f); glVertex2f(centerX + Width() * 0.16, centerY - Height() * 0.01); + glEnd(); + + m_textureMenuOptions.Bind(); + glColor4f(0.75f, 0.05f, 0.0f, 1.0f); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); glVertex2f(centerX + Width() * 0.08, centerY - Height() * 0.165); + glTexCoord2f(1.0f, 0.0f); glVertex2f(centerX + Width() * 0.42, centerY - Height() * 0.165); + glTexCoord2f(1.0f, 1.0f); glVertex2f(centerX + Width() * 0.42, centerY - Height() * 0.11); + glTexCoord2f(0.0f, 1.0f); glVertex2f(centerX + Width() * 0.08, centerY - Height() * 0.11); + glEnd(); + + m_textureMenuQuit.Bind(); + glColor4f(0.75f, 0.05f, 0.0f, 1.0f); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); glVertex2f(centerX + Width() * 0.16, centerY - Height() * 0.265); + glTexCoord2f(1.0f, 0.0f); glVertex2f(centerX + Width() * 0.34, centerY - Height() * 0.265); + glTexCoord2f(1.0f, 1.0f); glVertex2f(centerX + Width() * 0.34, centerY - Height() * 0.21); + glTexCoord2f(0.0f, 1.0f); glVertex2f(centerX + Width() * 0.16, centerY - Height() * 0.21); + glEnd(); +} + +void Engine::DrawSingleMultiButtons(float centerX, float centerY) { + m_textureMenuSingle.Bind(); + glColor4f(0.75f, 0.05f, 0.0f, 1.0f); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); glVertex2f(centerX + Width() * 0.06, centerY - Height() * 0.065); + glTexCoord2f(1.0f, 0.0f); glVertex2f(centerX + Width() * 0.44, centerY - Height() * 0.065); + glTexCoord2f(1.0f, 1.0f); glVertex2f(centerX + Width() * 0.44, centerY - Height() * 0.01); + glTexCoord2f(0.0f, 1.0f); glVertex2f(centerX + Width() * 0.06, centerY - Height() * 0.01); + glEnd(); + + m_textureMenuMulti.Bind(); + glColor4f(0.75f, 0.05f, 0.0f, 1.0f); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); glVertex2f(centerX + Width() * 0.08, centerY - Height() * 0.165); + glTexCoord2f(1.0f, 0.0f); glVertex2f(centerX + Width() * 0.42, centerY - Height() * 0.165); + glTexCoord2f(1.0f, 1.0f); glVertex2f(centerX + Width() * 0.42, centerY - Height() * 0.11); + glTexCoord2f(0.0f, 1.0f); glVertex2f(centerX + Width() * 0.08, centerY - Height() * 0.11); + glEnd(); + + m_textureMenuBack.Bind(); + glColor4f(0.75f, 0.05f, 0.0f, 1.0f); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); glVertex2f(centerX + Width() * 0.16, centerY - Height() * 0.265); + glTexCoord2f(1.0f, 0.0f); glVertex2f(centerX + Width() * 0.34, centerY - Height() * 0.265); + glTexCoord2f(1.0f, 1.0f); glVertex2f(centerX + Width() * 0.34, centerY - Height() * 0.21); + glTexCoord2f(0.0f, 1.0f); glVertex2f(centerX + Width() * 0.16, centerY - Height() * 0.21); + glEnd(); +} + +void Engine::DrawButtonBackgrounds(float centerX, float centerY, int iterations) { + glColor4f(1.0f, 1.0f, 1.0f, 0.5f); + glBindTexture(GL_TEXTURE_2D, 0); + + float bottomOffset = 0.075f; + float topOffset = 0.0f; + float distanceBetween = 0.1f; + + for (int i = 0; i < iterations; i++) { + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); glVertex2f(centerX + Width() * 0.05, centerY - Height() * bottomOffset); + glTexCoord2f(1.0f, 0.0f); glVertex2f(centerX + Width() * 0.45, centerY - Height() * bottomOffset); + glTexCoord2f(1.0f, 1.0f); glVertex2f(centerX + Width() * 0.45, centerY - Height() * topOffset); + glTexCoord2f(0.0f, 1.0f); glVertex2f(centerX + Width() * 0.05, centerY - Height() * topOffset); + glEnd(); + + bottomOffset += distanceBetween; + topOffset += distanceBetween; + } +} + +void Engine::DisplayOptionsMenu() { + static const int sTitle = 400; + static const int sButton = 225; + + float centerX = Width() * 0.5f; + float centerY = Height() * 0.5f; + + GLint viewport[4]; + glGetIntegerv(GL_VIEWPORT, viewport); + + glDisable(GL_STENCIL_TEST); + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, Width(), 0, Height(), -1, 1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + + m_textureOptionsMenu.Bind(); + glLoadIdentity(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(0, 0); + glTexCoord2f(1, 0); glVertex2i(Width(), 0); + glTexCoord2f(1, 1); glVertex2i(Width(), Height()); + glTexCoord2f(0, 1); glVertex2i(0, Height()); + glEnd(); + + glColor4f(1.0f, 0.0f, 1.0f, 1.0f); + m_textureOptOptions.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.175, centerY + Height() * 0.35); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.175, centerY + Height() * 0.35); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.175, centerY + Height() * 0.45); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.175, centerY + Height() * 0.45); + glEnd(); + + if (m_selectedOption == 0) { + glColor4f(0.5f, 1.0f, 0.0f, 1.0f); + } + m_textureOptAudio.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.35, centerY + Height() * 0.2); + glTexCoord2f(1, 0); glVertex2i(centerX - Width() * 0.2, centerY + Height() * 0.2); + glTexCoord2f(1, 1); glVertex2i(centerX - Width() * 0.2, centerY + Height() * 0.25); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.35, centerY + Height() * 0.25); + glEnd(); + + glColor4f(1.0f, 0.0f, 1.0f, 1.0f); + if (m_selectedOption == 1) { + glColor4f(0.5f, 1.0f, 0.0f, 1.0f); + } + m_textureOptGraphics.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.4, centerY + Height() * 0.05); + glTexCoord2f(1, 0); glVertex2i(centerX - Width() * 0.2, centerY + Height() * 0.05); + glTexCoord2f(1, 1); glVertex2i(centerX - Width() * 0.2, centerY + Height() * 0.1); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.4, centerY + Height() * 0.1); + glEnd(); + + glColor4f(1.0f, 0.0f, 1.0f, 1.0f); + if (m_selectedOption == 2) { + glColor4f(0.5f, 1.0f, 0.0f, 1.0f); + } + m_textureOptGameplay.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.375, centerY - Height() * 0.1); + glTexCoord2f(1, 0); glVertex2i(centerX - Width() * 0.2, centerY - Height() * 0.1); + glTexCoord2f(1, 1); glVertex2i(centerX - Width() * 0.2, centerY - Height() * 0.05); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.375, centerY - Height() * 0.05); + glEnd(); + + // Séparateur + glColor4f(0.0f, 0.0f, 0.0f, 1.0f); + glBindTexture(GL_TEXTURE_2D, 0); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.175, centerY - Height() * 0.1); + glTexCoord2f(1, 0); glVertex2i(centerX - Width() * 0.18, centerY - Height() * 0.1); + glTexCoord2f(1, 1); glVertex2i(centerX - Width() * 0.18, centerY + Height() * 0.25); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.175, centerY + Height() * 0.25); + glEnd(); + + glColor4f(1.0f, 0.0f, 1.0f, 1.0f); + m_textureOptBack.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.075, centerY - Height() * 0.25); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.075, centerY - Height() * 0.25); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.075, centerY - Height() * 0.2); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.075, centerY - Height() * 0.2); + glEnd(); + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + if (m_selectedOption == 0) { + DisplayAudioMenu(centerX, centerY); + } + else if (m_selectedOption == 1) { + DisplayGraphicsMenu(centerX, centerY); + } + else if (m_selectedOption == 2) { + DisplayGameplayMenu(centerX, centerY); + } + + glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); + + glEnable(GL_STENCIL_TEST); + glEnable(GL_DEPTH_TEST); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); +} + +void Engine::DisplayAudioMenu(float centerX, float centerY) { + float minBar = centerX - Width() * 0.15; + float maxBar = centerX + Width() * 0.3; + float percentPosX = centerX + Width() * 0.31f; + + glColor4f(1.0f, 1.0f, 0.0f, 1.0f); + m_textureOptMain.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.215); + glTexCoord2f(1, 0); glVertex2i(centerX - Width() * 0.075, centerY + Height() * 0.215); + glTexCoord2f(1, 1); glVertex2i(centerX - Width() * 0.075, centerY + Height() * 0.25); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.25); + glEnd(); + + float principalBottom = centerY + Height() * 0.165f; + float principalTop = centerY + Height() * 0.2f; + + DrawSliderBackground(centerX, centerY, minBar, maxBar, principalBottom, principalTop); + DrawSlider(centerX, centerY, m_volPrincipal, minBar, maxBar, principalBottom, principalTop); + DisplayBarPercentValue(centerX, centerY, percentPosX, principalBottom, minBar, maxBar, m_volPrincipal); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + + glColor4f(1.0f, 1.0f, 0.0f, 1.0f); + m_textureOptMusic.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.09); + glTexCoord2f(1, 0); glVertex2i(centerX - Width() * 0.05, centerY + Height() * 0.09); + glTexCoord2f(1, 1); glVertex2i(centerX - Width() * 0.05, centerY + Height() * 0.125); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.125); + glEnd(); + + float musiqueBottom = centerY + Height() * 0.04f; + float musiqueTop = centerY + Height() * 0.075f; + + DrawSliderBackground(centerX, centerY, minBar, maxBar, musiqueBottom, musiqueTop); + DrawSlider(centerX, centerY, m_volMusique, minBar, maxBar, musiqueBottom, musiqueTop); + DisplayBarPercentValue(centerX, centerY, percentPosX, musiqueBottom, minBar, maxBar, m_volMusique); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + + glColor4f(1.0f, 1.0f, 0.0f, 1.0f); + m_textureOptSfx.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY - Height() * 0.035); + glTexCoord2f(1, 0); glVertex2i(centerX - Width() * 0.075, centerY - Height() * 0.035); + glTexCoord2f(1, 1); glVertex2i(centerX - Width() * 0.075, centerY - Height() * 0.00001); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY - Height() * 0.00001); + glEnd(); + + float effectsBottom = centerY - Height() * 0.085f; + float effectsTop = centerY - Height() * 0.05f; + + DrawSliderBackground(centerX, centerY, minBar, maxBar, effectsBottom, effectsTop); + DrawSlider(centerX, centerY, m_volEffets, minBar, maxBar, effectsBottom, effectsTop); + DisplayBarPercentValue(centerX, centerY, percentPosX, effectsBottom, minBar, maxBar, m_volEffets); + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); +} + +void Engine::DisplayGraphicsMenu(float centerX, float centerY) { + glColor4f(1.0f, 1.0f, 0.0f, 1.0f); + m_textureOptResolution.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.215); + glTexCoord2f(1, 0); glVertex2i(centerX, centerY + Height() * 0.215); + glTexCoord2f(1, 1); glVertex2i(centerX, centerY + Height() * 0.25); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.25); + glEnd(); + + glColor4f(1.0f, 1.0f, 1.0f, 0.5f); + glBindTexture(GL_TEXTURE_2D, 0); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.16, centerY + Height() * 0.165); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.1, centerY + Height() * 0.165); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.1, centerY - Height() * 0.04); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.16, centerY - Height() * 0.04); + glEnd(); + + glColor4f(0.0f, 0.0f, 0.0f, 1.0f); + m_textureHd.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.125); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.05, centerY + Height() * 0.125); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.05, centerY + Height() * 0.15); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.15); + glEnd(); + + m_textureFhd.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.075); + glTexCoord2f(1, 0); glVertex2i(centerX, centerY + Height() * 0.075); + glTexCoord2f(1, 1); glVertex2i(centerX, centerY + Height() * 0.1); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.1); + glEnd(); + + m_textureQhd.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.025); + glTexCoord2f(1, 0); glVertex2i(centerX, centerY + Height() * 0.025); + glTexCoord2f(1, 1); glVertex2i(centerX, centerY + Height() * 0.05); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.05); + glEnd(); + + m_textureUhd.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY - Height() * 0.025); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.015, centerY - Height() * 0.025); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.015, centerY); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY); + glEnd(); + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + float heightRatioBottom = 0.125f; + float heightRatioTop = 0.15; + + // Checkboxes + for (int i = 0; i < 4; i++) { + if (static_cast(m_resolution) == i) { + m_textureChecked.Bind(); + } + else { + m_textureCheck.Bind(); + } + + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX + Width() * 0.075, centerY + Height() * heightRatioBottom); + glTexCoord2f(1, 0); glVertex2i(centerX + Width() * 0.09, centerY + Height() * heightRatioBottom); + glTexCoord2f(1, 1); glVertex2i(centerX + Width() * 0.09, centerY + Height() * heightRatioTop); + glTexCoord2f(0, 1); glVertex2i(centerX + Width() * 0.075, centerY + Height() * heightRatioTop); + glEnd(); + + heightRatioBottom -= 0.05f; + heightRatioTop -= 0.05f; + } + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); +} + void Engine::Render(float elapsedTime) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - m_time_SplashScreen += elapsedTime; - if (m_time_SplashScreen < 2) { - DrawSplachScreen(); + if (m_gamestate == GameState::SPLASH) { + if (m_splashTime > 0.0f) { + DisplaySplashScreen(); + } + else { + m_gamestate = GameState::MAIN_MENU; + } + + m_splashTime -= elapsedTime; + return; } - else if (m_gamestate == GameState::PLAY) - { + + if (m_gamestate == GameState::MAIN_MENU) { + DisplayMainMenu(); + return; + } + + if (m_gamestate == GameState::OPTIONS) { + DisplayOptionsMenu(); + return; + } + + if (m_gamestate == GameState::PAUSE) { + DisplayPauseMenu(); + return; + } + + if (m_gamestate == GameState::PLAY) { HideCursor(); CenterMouse(); //D�placement de centermouse dans l'action de jouer @@ -979,6 +1168,7 @@ void Engine::Render(float elapsedTime) { static irrklang::ISound* step; // Pour les sons de pas. static float pollTime = 0; static float bulletTime = 0; + static float gameTime = 0; static BlockType bloc = 1; if (elapsedTime > 0.1f) return; @@ -988,6 +1178,8 @@ void Engine::Render(float elapsedTime) { Transformation all; Transformation skybox; + Transformation remotePlayer; + Vector3f vstep; // Transformations initiales @@ -1005,11 +1197,11 @@ void Engine::Render(float elapsedTime) { if (leftright) vstep = Vector3f(m_player.GetPosition().x + m_player.GetDirection().z, m_player.GetPosition().y - 1.7f, m_player.GetPosition().z + m_player.GetDirection().x); else vstep = Vector3f(m_player.GetPosition().x - m_player.GetDirection().z, m_player.GetPosition().y - 1.7f, m_player.GetPosition().z - m_player.GetDirection().x); - m_audio.Create3DAudioObj(step, AUDIO_PATH "step.wav", vstep, m_player.GetVelocity(), false,.8f); + m_audio.Create3DAudioObj(step, AUDIO_PATH "step.wav", vstep, m_player.GetVelocity(), false, .8f); leftright = !leftright; break; case Player::Sound::FALL: - m_audio.Create3DAudioObj(step, AUDIO_PATH "hit.wav", m_player.GetPosition(), m_player.GetVelocity(), false,1.f); + m_audio.Create3DAudioObj(step, AUDIO_PATH "hit.wav", m_player.GetPosition(), m_player.GetVelocity(), false, 1.f); break; default: break; } @@ -1023,11 +1215,16 @@ void Engine::Render(float elapsedTime) { m_player.ApplyTransformation(skybox, false); // Version d'ApplyTransformation qui ne tient compte que de la rotation // (donc l'objet ne bouge pas relativement au joueur, ce qui est pratique pour une skybox!). + m_player.ApplyTransformation(remotePlayer, true, false); + + if (m_key1) bloc++; + else if (m_key2) bloc--; + if (m_mouseWU) bloc++; else if (m_mouseWD) bloc--; if (bloc == BTYPE_LAST + 1) bloc = BTYPE_AIR + 1; else if (bloc == BTYPE_AIR) bloc = BTYPE_LAST; // La selection de BTYPE_LAST �quipe l'arme. - m_mouseWU = m_mouseWD = false; + m_mouseWU = m_mouseWD = m_key1 = m_key2 = false; if (m_mouseL) { if (bloc != BTYPE_LAST) @@ -1050,49 +1247,61 @@ void Engine::Render(float elapsedTime) { glClearColor(0.f, 0.f, 0.f, 1.f); return; } + } } - } - else if (m_mouseR) - m_world.ChangeBlockAtCursor(BTYPE_AIR, m_player.GetPosition(), m_player.GetDirection(), m_block); - - for (int x = 0; x < MAX_BULLETS; ++x) { // Array de bullets en jeu. - if (m_bullets[x]) { - for (int b = 0; b < BULLET_UPDATES_PER_FRAME; ++b) { - if (m_bullets[x]->Update(&m_world, elapsedTime, BULLET_UPDATES_PER_FRAME, m_players)) { - m_bullets[x]->~Bullet(); - if (m_whoosh[x]) - m_whoosh[x]->drop(); - m_bullets[x] = nullptr; - m_whoosh[x] = nullptr; - break; - } - else if (!m_whoosh[x]) { - m_whoosh[x] = m_audio.Create3DAudioObj(m_whoosh[x], AUDIO_PATH "noise.wav", m_bullets[x]->getPos(), m_bullets[x]->getVel(), true, (m_bullets[x]->getPos() - m_player.GetPosition()).Length()); - } - else { - Vector3f pos = m_bullets[x]->getPos(), vel = m_bullets[x]->getVel(); - m_audio.Render3DAudioObj(m_whoosh[x], pos, vel, 5 - (m_bullets[x]->getPos() - m_player.GetPosition()).Length()); + else if (m_mouseR) + m_world.ChangeBlockAtCursor(BTYPE_AIR, m_player.GetPosition(), m_player.GetDirection(), m_block); + + for (int x = 0; x < MAX_BULLETS; ++x) { // Array de bullets en jeu. + if (m_bullets[x]) { + for (int b = 0; b < BULLET_UPDATES_PER_FRAME; ++b) { + if (m_bullets[x]->Update(&m_world, elapsedTime, BULLET_UPDATES_PER_FRAME, m_players)) { + m_bullets[x]->~Bullet(); + if (m_whoosh[x]) + m_whoosh[x]->drop(); + m_bullets[x] = nullptr; + m_whoosh[x] = nullptr; + break; + } + else if (!m_whoosh[x]) { + m_whoosh[x] = m_audio.Create3DAudioObj(m_whoosh[x], AUDIO_PATH "noise.wav", m_bullets[x]->getPos(), m_bullets[x]->getVel(), true, (m_bullets[x]->getPos() - m_player.GetPosition()).Length()); + } + else { + Vector3f pos = m_bullets[x]->getPos(), vel = m_bullets[x]->getVel(); + m_audio.Render3DAudioObj(m_whoosh[x], pos, vel, 5 - (m_bullets[x]->getPos() - m_player.GetPosition()).Length()); + } } } } - } - m_renderer.RenderWorld(&m_world, m_renderCount, m_player.GetPosition(), m_player.GetDirection(), all, m_shader01, m_textureAtlas); + gameTime += elapsedTime * 10; + + Vector3f dance = Vector3f(sin(gameTime), 0, cos(-gameTime)); + dance.Normalize(); + m_remotePlayer.ApplyPhysics(dance, &m_world, elapsedTime); m_world.Update(m_bullets, m_player.GetPosition(), m_blockinfo); m_renderer.UpdateMesh(&m_world, m_player.GetPosition(), m_blockinfo); + m_remotePlayer.Render(m_animeAtlas, m_shader01, all, elapsedTime); + m_booster.RenderBillboard({ 195,16,195 }, m_textureAtlas, m_shader01, all); + + if (m_isSkybox) m_renderer.RenderWorld(&m_world, m_renderCount, m_player.GetPosition(), m_player.GetDirection(), all, m_shader01, m_textureAtlas); + + //glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + //m_remotePlayer.Render(m_textureAtlas, m_shader01, all, elapsedTime); + + m_renderer.RenderWorld(&m_world, m_renderCount, m_player.GetPosition(), m_player.GetDirection(), all, m_shader01, m_textureAtlas); if (m_isSkybox) m_skybox.Render(skybox); DrawHud(elapsedTime, bloc); DisplayPovGun(); ProcessNotificationQueue(); - if (m_damage) - { + if (m_damage) { InstantDamage(); } static bool fell = false; if (m_player.GetPosition().y < 1.7f && !fell) { - m_audio.Create3DAudioObj(m_scream, AUDIO_PATH "scream.wav", m_player.GetPOV(), m_player.GetVelocity(), false,1.f); + m_audio.Create3DAudioObj(m_scream, AUDIO_PATH "scream.wav", m_player.GetPOV(), m_player.GetVelocity(), false, 1.f); fell = true; } else if (m_player.GetPosition().y < -20.f) { @@ -1100,15 +1309,26 @@ void Engine::Render(float elapsedTime) { fell = false; } - if (m_networkgame) { - static char* buf = new char[BUFFER_LENGTH]; - uint32_t buflen = BUFFER_LENGTH; - netprot::Input input; - //sockaddr_in addr = m_conn.m_srvsockaddr; + if (m_networkgame) { // Pour se gerer le paquet. + using namespace std::chrono; + using namespace netprot; + Timestamp tstamp = duration_cast(high_resolution_clock::now() - m_startTime).count(); + Input input; + Sync sync; + uint64_t id = m_conn.getId(); + static std::vector lsPck; + if (false) { // TODO: Faire un checkup pour chaque ~1000ms. + sync.sid = id; + sync.timestamp = tstamp; + sync.position = m_player.GetPosition(); + sync.hp = m_player.GetHP(); + // TODO: Garrocher ca quelque-part. + } + + input.sid = id; input.direction = m_player.GetDirection(); - input.sid = m_conn.getId(); - input.timestamp = 12345; + input.timestamp = tstamp; input.keys.forward = m_keyW; input.keys.backward = m_keyS; input.keys.left = m_keyA; @@ -1117,25 +1337,121 @@ void Engine::Render(float elapsedTime) { input.keys.block = m_mouseR; input.keys.shoot = m_mouseL; - //netprot::Serialize(&input, &buf, &buflen); - //sendto(m_conn.m_sock_udp, buf, buflen, 0, (sockaddr*)&addr, sizeof(addr)); + sendPackTo(m_conn.m_sock_udp, &input, &m_bufout, &m_conn.m_srvsockaddr); - netprot::sendPackTo(m_conn.m_sock_udp, &input, &buf, &buflen, &m_conn.m_srvsockaddr); + lsPck = recvPacks(m_conn.m_sock_udp, &m_buf); + char* prevptr = nullptr; + for (auto& pck : lsPck) { // We could make a few threads out of this. + Sync sync; + Output out; + if (!prevptr) + prevptr = m_buf.ptr; + uint32_t bsize = m_buf.len - (pck - prevptr); + prevptr = pck; + switch (getType(pck, 1)) { + using enum PACKET_TYPE; + case SYNC: + if (Deserialize(&sync, pck, &bsize)) { + if (sync.sid != m_conn.getId()) + break; + // TODO: Vérifier si les positions concordent au sync local. + } + break; + case OUTPUT: + if (Deserialize(&out, pck, &bsize)) { + RemotePlayer* r = (RemotePlayer*)m_players[out.id]; + r->Feed(out); + } + break; + default: + break; + } + } + lsPck.clear(); } } - else if (m_gamestate == GameState::MAIN_MENU || m_gamestate == GameState::OPTIONS) - { - if (!m_soloMultiChoiceMade) { - DisplaySingleOrMultiplayerMenu(); - } - else { - DrawMenu(); - } - } - else if (m_gamestate == GameState::QUIT) - Stop(); } +void Engine::DisplayGameplayMenu(float centerX, float centerY) { + float minBar = centerX - Width() * 0.15; + float maxBar = centerX + Width() * 0.3; + float percentPosX = centerX + Width() * 0.31f; + + glColor4f(1.0f, 1.0f, 0.0f, 1.0f); + m_textureOptSensitivity.Bind(); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.215); + glTexCoord2f(1, 0); glVertex2i(centerX, centerY + Height() * 0.215); + glTexCoord2f(1, 1); glVertex2i(centerX, centerY + Height() * 0.25); + glTexCoord2f(0, 1); glVertex2i(centerX - Width() * 0.15, centerY + Height() * 0.25); + glEnd(); + + float sensibleBottom = centerY + Height() * 0.165f; + float sensibleTop = centerY + Height() * 0.2f; + + DrawSliderBackground(centerX, centerY, minBar, maxBar, sensibleBottom, sensibleTop); + DrawSlider(centerX, centerY, m_volSensible, minBar, maxBar, sensibleBottom, sensibleTop); + DisplayBarPercentValue(centerX, centerY, percentPosX, sensibleBottom, minBar, maxBar, m_volSensible); + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); +} + +void Engine::DrawSliderBackground(float centerX, float centerY, float minVal, float maxVal, float bottomSideValue, float topSideValue) { + glColor4f(0.0f, 0.0f, 0.0f, 1.0f); + glBindTexture(GL_TEXTURE_2D, 0); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(minVal, bottomSideValue); + glTexCoord2f(1, 0); glVertex2i(maxVal, bottomSideValue); + glTexCoord2f(1, 1); glVertex2i(maxVal, topSideValue); + glTexCoord2f(0, 1); glVertex2i(minVal, topSideValue); + glEnd(); +} + +void Engine::DisplayBarPercentValue(float centerX, float centerY, float posX, float posY, float minVal, float maxVal, float value) { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + float percentage = (value / (maxVal - minVal)) * 100; + + if (percentage < 0.0f) { + percentage = 0.0f; + } + else if (percentage > 100.0f) { + percentage = 100.0f; + } + + m_textureFont.Bind(); + std::ostringstream ss; + ss.str(""); + ss << std::fixed << std::setprecision(2); + ss << percentage << "%"; + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + PrintText(posX, posY, ss.str(), 2.0f); + + glDisable(GL_BLEND); +} + +void Engine::DrawSlider(float centerX, float centerY, float value, float minVal, float maxVal, float bottomSideValue, float topSideValue) { + if (value < 0.0f) { + value = 0.0f; + } + else if (value > (maxVal - minVal)) { + value = (maxVal - minVal); + } + + if (value >= 0.0f && value <= (maxVal - minVal)) { + glColor4f(0.0f, 1.0f, 0.0f, 1.0f); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(minVal, bottomSideValue); + glTexCoord2f(1, 0); glVertex2i(minVal + value, bottomSideValue); + glTexCoord2f(1, 1); glVertex2i(minVal + value, topSideValue); + glTexCoord2f(0, 1); glVertex2i(minVal, topSideValue); + glEnd(); + } +} + + + void Engine::KeyPressEvent(unsigned char key) { switch (key) { case 0: // A - Gauche @@ -1159,7 +1475,12 @@ void Engine::KeyPressEvent(unsigned char key) { } break; case 36: // ESC - Quitter - m_gamestate = GameState::MAIN_MENU; + if (m_gamestate == GameState::PLAY) { + m_gamestate = GameState::PAUSE; + } + else if (m_gamestate == GameState::PAUSE) { + m_gamestate = GameState::PLAY; + } //Stop(); break; case 57: // Space - Sauter @@ -1200,6 +1521,10 @@ void Engine::KeyPressEvent(unsigned char key) { break; case 24: // Y - Ignorer break; + case 27: // 1 + break; + case 28: // 2 + break; case 255: // Fn - Ignorer break; default: @@ -1214,7 +1539,6 @@ void Engine::KeyReleaseEvent(unsigned char key) { break; case 2: // C - Toggle crosshair m_displayCrosshair = !m_displayCrosshair; - std::cout << "DISPLAY CROSSHAIR " << (m_displayCrosshair ? "enabled" : "disabled") << std::endl; break; case 3: // D - Stop droite m_keyD = false; @@ -1246,7 +1570,7 @@ void Engine::KeyReleaseEvent(unsigned char key) { case 15: for (int x = 0; x < MAX_BULLETS; ++x) // Ajouter une balle dans l'array (aussi connu sous le nom de "faire pow pow"). if (!m_bullets[x]) { - m_bullets[x] = new Bullet(m_player.GetPOV() - Vector3f(1.f, 0.f, 1.f), Vector3f(1.f,0.f,1.f)); + m_bullets[x] = new Bullet(m_player.GetPOV() - Vector3f(1.f, 0.f, 1.f), Vector3f(1.f, 0.f, 1.f)); break; } else if (x == MAX_BULLETS - 1) { // S'il y a pas d'espace dans l'array, prendre la place de la premi�re balle de l'array. @@ -1274,6 +1598,12 @@ void Engine::KeyReleaseEvent(unsigned char key) { else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); break; + case 27: // 1 + m_key1 = true; + break; + case 28: // 2 + m_key2 = true; + break; case 57: // Espace - Stop sauter m_keySpace = false; break; @@ -1281,25 +1611,49 @@ void Engine::KeyReleaseEvent(unsigned char key) { } void Engine::MouseMoveEvent(int x, int y) { - m_player.TurnLeftRight(x - (Width() / 2)); - m_player.TurnTopBottom(y - (Height() / 2)); + if (m_gamestate == GameState::PLAY) { + m_player.TurnLeftRight(x - (Width() / 2)); + m_player.TurnTopBottom(y - (Height() / 2)); - // Centrer la souris seulement si elle n'est pas d�j� centr�e - // Il est n�cessaire de faire la v�rification pour �viter de tomber - // dans une boucle infinie o� l'appel � CenterMouse g�n�re un - // MouseMoveEvent, qui rapelle CenterMouse qui rapelle un autre - // MouseMoveEvent, etc - if (x == (Width() / 2) && y == (Height() / 2)) - return; + // Centrer la souris seulement si elle n'est pas d�j� centr�e + // Il est n�cessaire de faire la v�rification pour �viter de tomber + // dans une boucle infinie o� l'appel � CenterMouse g�n�re un + // MouseMoveEvent, qui rapelle CenterMouse qui rapelle un autre + // MouseMoveEvent, etc + if (x == (Width() / 2) && y == (Height() / 2)) + return; + } + else if (m_gamestate == GameState::MAIN_MENU) { + DisplayMainMenu(); + } + else if (m_gamestate == GameState::OPTIONS) { + float centerX = Width() * 0.5f; + float centerY = Height() * 0.5f; + float leftBar = centerX - Width() * 0.15f; + float rightBar = centerX + Width() * 0.3f; + if (m_selectedOption == 0 && m_selectedOptAudioMainBar) { + m_volPrincipal = x - leftBar; + } + else if (m_selectedOption == 0 && m_selectedOptAudioMusicBar) { + m_volMusique = x - leftBar; + } + else if (m_selectedOption == 0 && m_selectedOptAudioSfxBar) { + m_volEffets = x - leftBar; + } + else if (m_selectedOption == 2 && m_selectedGameplaySensitivityBar) { + m_volSensible = x - leftBar; + } + } } void Engine::MousePressEvent(const MOUSE_BUTTON& button, int x, int y) { m_mousemx = x; m_mousemy = y; + float centerX = Width() * 0.5f; + float centerY = Height() * 0.5f; - if (m_gamestate == GameState::PLAY) - { + if (m_gamestate == GameState::PLAY) { switch (button) { case MOUSE_BUTTON_LEFT: m_mouseL = true; @@ -1319,42 +1673,138 @@ void Engine::MousePressEvent(const MOUSE_BUTTON& button, int x, int y) { case MOUSE_BUTTON_NONE: break; } } - else if (m_gamestate == GameState::MAIN_MENU) - { - if ((m_mousemx >= 285 && m_mousemx <= 490) && (m_mousemy >= 150 && m_mousemy <= 250)) - m_gamestate = GameState::PLAY; - if ((m_mousemx >= 305 && m_mousemx <= 450) && (m_mousemy >= 300 && m_mousemy <= 400)) - m_gamestate = GameState::QUIT; - } - else if (m_gamestate == GameState::OPTIONS) - { - float buttonWidthProportion = 0.4f; - float buttonHeightProportion = 0.075f; - float buttonWidth = buttonWidthProportion * Width(); - float buttonHeight = buttonHeightProportion * Height(); - float offsetSingleButtonXFactor = 0.075f; - float offsetSingleButtonYFactor = 0.05f; + else if (m_gamestate == GameState::MAIN_MENU) { - float buttonPosX = m_titleX; - float buttonSinglePosY = m_titleY - buttonHeight - (offsetSingleButtonYFactor * Height()); - float buttonMultiPosY = buttonSinglePosY * 0.75; - float adjustedMouseY = Height() - m_mousemy; + float leftButton = centerX + Width() * 0.045f; + float rightButton = centerX + Width() * 0.4455f; - // Single Player - if (m_mousemx >= buttonPosX && m_mousemx <= (buttonPosX + buttonWidth) && - adjustedMouseY >= buttonSinglePosY && adjustedMouseY <= (buttonSinglePosY + buttonHeight)) - { - std::cout << "Single Player button clicked" << std::endl; - m_soloMultiChoiceMade = true; - m_gamestate = GameState::PLAY; + float topFirst = centerY + Height() * 0.073f; + float bottomFirst = centerY; + + float topSecond = centerY + Height() * 0.177f; + float bottomSecond = centerY + Height() * 0.105f; + + float topThird = centerY + Height() * 0.275f; + float bottomThird = centerY + Height() * 0.198f; + + if (x > leftButton && x < rightButton && y > bottomFirst && y < topFirst) { + if (m_selectedPlayOptions) { + m_gamestate = GameState::PLAY; + } + else { + m_selectedPlayOptions = true; + } } - // Multiplayer - else if (m_mousemx >= buttonPosX && m_mousemx <= (buttonPosX + buttonWidth) && - adjustedMouseY >= buttonMultiPosY && adjustedMouseY <= (buttonMultiPosY + buttonHeight)) - { - std::cout << "Multiplayer button clicked" << std::endl; - m_soloMultiChoiceMade = true; - m_gamestate = GameState::PLAY; + else if (x > leftButton && x < rightButton && y > bottomSecond && y < topSecond) { + if (m_selectedPlayOptions) { + m_gamestate = GameState::PLAY; + } + else { + m_gamestate = GameState::OPTIONS; + } + } + else if (x > leftButton && x < rightButton && y > bottomThird && y < topThird) { + if (m_selectedPlayOptions) { + m_selectedPlayOptions = false; + } + else { + m_gamestate = GameState::QUIT; + } + } + } + else if (m_gamestate == GameState::OPTIONS) { + float leftAudio = centerX - Width() * 0.35f; + float rightAudio = centerX - Width() * 0.2f; + float topAudio = (Height() * 0.25f) + ((Height() * 0.25f) - (Height() * 0.2f)); + float bottomAudio = (Height() * 0.2f) + ((Height() * 0.25f) - (Height() * 0.2f)); + + float leftGraph = centerX - Width() * 0.4f; + float rightGraph = centerX - Width() * 0.2f; + float topGraph = centerY - Height() * 0.05f; + float bottomGraph = centerY - Height() * 0.1f; + + float leftGameplay = centerX - Width() * 0.375f; + float rightGameplay = centerX - Width() * 0.2f; + float topGameplay = centerY + Height() * 0.1f; + float bottomGameplay = centerY + Height() * 0.05f; + + float leftBack = centerX - Width() * 0.075f; + float rightBack = centerX + Width() * 0.075f; + float topBack = centerY + Height() * 0.25f; + float bottomBack = centerY + Height() * 0.2f; + + if (x > leftAudio && x < rightAudio && y > bottomAudio && y < topAudio) { + m_selectedOption = 0; // Volume + } + else if (x > leftGraph && x < rightGraph && y > bottomGraph && y < topGraph) { + m_selectedOption = 1; // Graphics + } + else if (x > leftGameplay && x < rightGameplay && y > bottomGameplay && y < topGameplay) { + m_selectedOption = 2; // Gameplay + } + else if (x > leftBack && x < rightBack && y > bottomBack && y < topBack) { + m_gamestate = GameState::MAIN_MENU; + } + + // Audio + float leftBar = centerX - Width() * 0.15f; + float rightBar = centerX + Width() * 0.3f; + + float topBarPrincipal = centerY - Height() * 0.165f; + float bottomBarPrincipal = centerY - Height() * 0.2f; + + float topBarMusique = centerY - Height() * 0.0415f; + float bottomBarMusique = centerY - Height() * 0.075f; + + float topBarEffets = centerY + Height() * 0.085f; + float bottomBarEffets = centerY + Height() * 0.05f; + + if (m_selectedOption == 0 && x > leftBar && x < rightBar && y > bottomBarPrincipal && y < topBarPrincipal) { + m_volPrincipal = x - leftBar; + m_selectedOptAudioMainBar = true; + } + else if (m_selectedOption == 0 && x > leftBar && x < rightBar && y > bottomBarMusique && y < topBarMusique) { + m_volMusique = x - leftBar; + m_selectedOptAudioMusicBar = true; + } + else if (m_selectedOption == 0 && x > leftBar && x < rightBar && y > bottomBarEffets && y < topBarEffets) { + m_volEffets = x - leftBar; + m_selectedOptAudioSfxBar = true; + } + + // Resolution + float leftChk = centerX + Width() * 0.075f; + float rightChk = centerX + Width() * 0.09f; + + float topChkHD = centerY - Height() * 0.125f; + float bottomChkHD = centerY - Height() * 0.155f; + + float topChkFHD = centerY - Height() * 0.0725f; + float bottomChkFHD = centerY - Height() * 0.1f; + + float topChkQHD = centerY - Height() * 0.025f; + float bottomChkQHD = centerY - Height() * 0.05f; + + float topChkUHD = centerY + Height() * 0.025f; + float bottomChkUHD = centerY; + + if (m_selectedOption == 1 && leftChk && x < rightChk && y > bottomChkHD && y < topChkHD) { + m_resolution = HD; + } + else if (m_selectedOption == 1 && x > leftChk && x < rightChk && y > bottomChkFHD && y < topChkFHD) { + m_resolution = FHD; + } + else if (m_selectedOption == 1 && x > leftChk && x < rightChk && y > bottomChkQHD && y < topChkQHD) { + m_resolution = QHD; + } + else if (m_selectedOption == 1 && x > leftChk && x < rightChk && y > bottomChkUHD && y < topChkUHD) { + m_resolution = UHD; + } + + // Gameplay + if (m_selectedOption == 2 && x > leftBar && x < rightBar && y > bottomBarPrincipal && y < topBarPrincipal) { + m_volSensible = x - leftBar; + m_selectedGameplaySensitivityBar = true; } } } @@ -1364,6 +1814,10 @@ void Engine::MouseReleaseEvent(const MOUSE_BUTTON& button, int x, int y) { case MOUSE_BUTTON_LEFT: m_mouseL = false; m_block = false; + m_selectedOptAudioMainBar = false; + m_selectedOptAudioMusicBar = false; + m_selectedOptAudioSfxBar = false; + m_selectedGameplaySensitivityBar = false; break; case MOUSE_BUTTON_RIGHT: m_mouseR = false; @@ -1394,3 +1848,5 @@ bool Engine::LoadTexture(Texture& texture, const std::string& filename, bool use return true; } + + diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index d51d064..aff6ebd 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -2,9 +2,12 @@ #define ENGINE_H__ #include +#include #include +#include #include "../SQCSim-common/array2d.h" #include "../SQCSim-common/blockinfo.h" +#include "../SQCSim-common/boostinfo.h" #include "../SQCSim-common/bullet.h" #include "../SQCSim-common/chunk.h" #include "../SQCSim-common/world.h" @@ -20,13 +23,13 @@ #include "connector.h" #include "renderer.h" #include "remoteplayer.h" +#include "booster.h" +#include "settings.h" class Engine : public OpenglContext { public: Engine(); virtual ~Engine(); - virtual void DrawMenu(); - virtual void DrawSplachScreen(); virtual void Init(); virtual void DeInit(); virtual void LoadResource(); @@ -41,74 +44,141 @@ public: private: int GetFps(float elapsedTime) const; int GetCountdown(float elapsedTime); + int GetOptionsChoice(); bool LoadTexture(Texture& texture, const std::string& filename, bool useMipmaps = true, bool stopOnError = true); void InstantDamage(); void SystemNotification(std::string systemLog); void KillNotification(Player killer, Player killed); + void DisplayNotification(std::string message); - void ProcessNotificationQueue(); void DisplayCrosshair(); void DisplayPovGun(); void DisplayCurrentItem(); void DisplayHud(int timer); - void DisplayInfo(float elapsedTime, BlockType bloc); - void DisplaySingleOrMultiplayerMenu(); void DrawHud(float elapsedTime, BlockType bloc); + void DisplayInfo(float elapsedTime, BlockType bloc); + + void DisplaySplashScreen(); + void DisplayPauseMenu(); + + void DisplayMainMenu(); + void DrawButtonBackgrounds(float centerX, float centerY, int iterations); + void DrawMainMenuButtons(float centerX, float centerY); + void DrawSingleMultiButtons(float centerX, float centerY); + + void DisplayOptionsMenu(); + void DisplayAudioMenu(float centerX, float centerY); + void DisplayGraphicsMenu(float centerX, float centerY); + void DisplayGameplayMenu(float centerX, float centerY); + void DrawSliderBackground(float centerX, float centerY, float minVal, float maxVal, float bottomSideValue, float topSideValue); + void DisplayBarPercentValue(float centerX, float centerY, float posX, float posY, float minVal, float maxVal, float value); + void DrawSlider(float centerX, float centerY, float value, float minVal, float maxVal, float bottomSideValue, float topSideValue); + + void PrintText(float x, float y, const std::string& t, float charSizeMultiplier = 1.0f); + void ProcessNotificationQueue(); Connector m_conn; - Shader m_shader01; - BlockInfo* m_blockinfo[BTYPE_LAST]; - TextureAtlas m_textureAtlas = TextureAtlas(BTYPE_LAST); + + Audio m_audio = Audio(AUDIO_PATH "start.wav"); + irrklang::ISound* m_powpow, * m_scream; + irrklang::ISound* m_whoosh[MAX_BULLETS]; + + Bullet* m_bullets[MAX_BULLETS]; + + std::chrono::high_resolution_clock::time_point m_startTime; + std::unordered_map m_players; + netprot::Buffer m_buf, m_bufout; + + netprot::PlayerInfo m_pinfo; + RemotePlayer m_remotePlayer = RemotePlayer(netprot::PlayerInfo(), Vector3f(5.5f, CHUNK_SIZE_Y + 1.8f, 5.5f)); + std::string m_messageNotification = ""; World m_world = World(); + Player m_player = Player(Vector3f(.5f, CHUNK_SIZE_Y + 1.8f, .5f)); + Renderer m_renderer = Renderer(); + Booster m_booster = Booster(); + BlockInfo* m_blockinfo[BTYPE_LAST]; + BoostInfo* m_boostinfo[BTYPE_BOOST_LAST]; + + GameState m_gamestate = GameState::SPLASH; + + Shader m_shader01; + + Skybox m_skybox; + + TextureAtlas m_textureAtlas = TextureAtlas(BTYPE_LAST); + TextureAtlas m_animeAtlas = TextureAtlas(TYPE_LAST + POS_LAST); + + TextureAtlas::TextureIndex texBoostHeal; + Texture m_textureCrosshair; Texture m_textureFont; Texture m_textureGun; Texture m_texturePovGun; Texture m_textureSkybox; - Texture m_textureSoloMultiMenu; - Texture m_textureSoloText; - Texture m_textureMultiText; - Texture m_textureTitle; - Skybox m_skybox; - Audio m_audio = Audio(AUDIO_PATH "start.wav"); + Texture m_textureMainMenu; + Texture m_textureOptionsMenu; + Texture m_texturePauseMenu; + Texture m_textureSplashScreen; - irrklang::ISound* m_powpow, - * m_scream; - irrklang::ISound *m_whoosh[MAX_BULLETS]; + Texture m_textureHd; + Texture m_textureFhd; + Texture m_textureQhd; + Texture m_textureUhd; + Texture m_textureCheck; + Texture m_textureChecked; - Player m_player = Player(Vector3f(.5f, CHUNK_SIZE_Y + 1.8f, .5f)); - - Bullet* m_bullets[MAX_BULLETS]; + Texture m_textureOptAudio; + Texture m_textureOptBack; + Texture m_textureOptGameplay; + Texture m_textureOptGraphics; + Texture m_textureOptMain; + Texture m_textureOptMusic; + Texture m_textureOptOptions; + Texture m_textureOptResolution; + Texture m_textureOptSensitivity; + Texture m_textureOptSfx; - std::map m_players; + Texture m_textureMenuBack; + Texture m_textureMenuMulti; + Texture m_textureMenuOptions; + Texture m_textureMenuPlay; + Texture m_textureMenuQuit; + Texture m_textureMenuSingle; + Texture m_textureMenuTitle; - //Menu - enum class GameState: uint8_t { MAIN_MENU, OPTIONS, QUIT, NEWG, PLAY }; - GameState m_gamestate = GameState::MAIN_MENU; - Texture MenuTitleTexture; - Texture MenuBGTexture; - Texture MenuStartTexture; - Texture MenuQuitTexture; - Texture MenuOptionsTexture; - Texture SplachScreenTexture; + Settings m_options = Settings(m_audio); + Resolution m_resolution = HD; + + float m_splashTime = 2.0f; float m_scale; float m_time = 0; - float m_time_SplashScreen = 0; float m_titleX = 0; float m_titleY = 0; - float m_Width = 0; - float m_Height = 0; int m_renderCount = 0; int m_countdown = COUNTDOWN; + int m_nbReductionChunk = 4; + int m_timerReductionChunk = 30; + + float m_volPrincipal = 0.0f; + float m_volMusique = 0.0f; + float m_volEffets = 0.0f; + float m_volSensible = 0.0f; + + int m_selectedOption = 0; + + bool m_selectedOptAudioMainBar = false; + bool m_selectedOptAudioMusicBar = false; + bool m_selectedOptAudioSfxBar = false; + bool m_selectedGameplaySensitivityBar = false; bool m_damage = false; @@ -118,11 +188,17 @@ private: bool m_flash = true; bool m_displayCrosshair = true; bool m_displayHud = true; - bool m_displayInfo = false; + bool m_displayInfo = true; bool m_resetcountdown = false; bool m_soloMultiChoiceMade = false; bool m_stopcountdown = false; + + bool m_selectedPlayOptions = false; + bool m_selectedOptions = false; + bool m_selectedQuit = false; + bool m_key1 = false; + bool m_key2 = false; bool m_keyK = false; bool m_keyL = false; bool m_keyW = false; @@ -130,18 +206,17 @@ private: bool m_keyS = false; bool m_keyD = false; bool m_keySpace = false; + bool m_mouseL = false; bool m_mouseR = false; bool m_mouseC = false; bool m_mouseWU = false; bool m_mouseWD = false; - //Pour trouver ou est la souris + float m_mousemx = 0; float m_mousemy = 0; bool m_networkgame = false; - - std::string m_messageNotification = ""; }; #endif // ENGINE_H__ diff --git a/SQCSim2021/media/shaders/shader01.frag b/SQCSim2021/media/shaders/shader01.frag index 8adf697..99b1d70 100644 --- a/SQCSim2021/media/shaders/shader01.frag +++ b/SQCSim2021/media/shaders/shader01.frag @@ -7,7 +7,7 @@ void main() texel = texture2D(tex,gl_TexCoord[0].st); texel *= light; - texel.a = 255.; + gl_FragColor = texel; } diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueBackJumpLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueBackJumpLeft.png deleted file mode 100644 index 09283ba..0000000 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueBackJumpLeft.png and /dev/null differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueBackJumpRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueBackJumpRight.png index 73935c1..dcd7109 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueBackJumpRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueBackJumpRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueFrontJumpLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueFrontJumpLeft.png deleted file mode 100644 index 08420cf..0000000 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueFrontJumpLeft.png and /dev/null differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueFrontJumpRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueFrontJumpRight.png index 940581c..74ee547 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueFrontJumpRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueFrontJumpRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueLeftBackJumpLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueLeftBackJumpLeft.png index ecf6195..4b4d6db 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueLeftBackJumpLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueLeftBackJumpLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueLeftFrontJumpLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueLeftFrontJumpLeft.png index b0f3100..23e61ec 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueLeftFrontJumpLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueLeftFrontJumpLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueRightBackJumpRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueRightBackJumpRight.png index ffbea70..5c7047b 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueRightBackJumpRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueRightBackJumpRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueRightFrontJumpRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueRightFrontJumpRight.png index 3766095..77506b8 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueRightFrontJumpRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumping/BlueRightFrontJumpRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackJumpLeftShootingLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackJumpLeftShootingLeft.png index d2d9827..8c25fc0 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackJumpLeftShootingLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackJumpLeftShootingLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackJumpRightShootingRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackJumpRightShootingRight.png index 729f5a2..42d6ffd 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackJumpRightShootingRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackJumpRightShootingRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackLeftJumpLeftShootingLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackLeftJumpLeftShootingLeft.png index b12ab88..85657f1 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackLeftJumpLeftShootingLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackLeftJumpLeftShootingLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackRightJumpRightShootingRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackRightJumpRightShootingRight.png index 8f035fe..5399cee 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackRightJumpRightShootingRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueBackRightJumpRightShootingRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontJumpLeftShootingLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontJumpLeftShootingLeft.png index a2560db..7a188ea 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontJumpLeftShootingLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontJumpLeftShootingLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontJumpRightShootingRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontJumpRightShootingRight.png index a5d3b76..46f7ce9 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontJumpRightShootingRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontJumpRightShootingRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontLeftJumpLeftShootingLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontLeftJumpLeftShootingLeft.png index db2a3b7..636c6c4 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontLeftJumpLeftShootingLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontLeftJumpLeftShootingLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontRightJumpRightShootingRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontRightJumpRightShootingRight.png index 6bf9ebd..5944785 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontRightJumpRightShootingRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueFrontRightJumpRightShootingRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueProfilLeftJumpLeftShootingLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueProfilLeftJumpLeftShootingLeft.png index 8ff7a91..375894c 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueProfilLeftJumpLeftShootingLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BlueProfilLeftJumpLeftShootingLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BluerProfilRightJumprightShootingRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BluerProfilRightJumprightShootingRight.png index 1e86cbf..ddc2913 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BluerProfilRightJumprightShootingRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/BluerProfilRightJumprightShootingRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot1.png index e7b53c8..af6713c 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot2.png index f6abe72..76034b6 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot3.png index c93e3b9..8c11253 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpLeftShootingLeftShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot1.png index fa1b9aa..9402e58 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot2.png index feaa0fa..c4352fb 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot3.png index a9d8731..b34731a 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackJumpRightShootingRightShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot1.png index eaa2fbe..97b4154 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot2.png index bf2ff7e..24e2aa7 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot3.png index d4a390b..5c79715 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackLeftJumpLeftShootingLeftShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot1.png index d728b29..ebea87f 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot2.png index cb9a181..872a578 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot3.png index f8b9cbc..04b952b 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueBackRightJumpRightShootingRightShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot1.png index d9b56e8..5264479 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot2.png index 17ca3d6..1be545e 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot3.png index fd7c64e..73c4660 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpLeftShootingLeftShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot1.png index 05e0658..180df1a 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot2.png index c7da648..f7b4715 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot3.png index 0ffaae2..a71cc5d 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontJumpRightShootingRightShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot1.png index 2924904..7c3606e 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot2.png index 1afde54..c75b037 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot3.png index abb3ccb..a0440f6 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontLeftJumpLeftShootingLeftShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot1.png index 9e170c9..9320112 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot2.png index c844481..37a678b 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot3.png index 90e0c73..a117be2 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueFrontRightJumpRightShootingRightShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot1.png index 3a3a354..54a421f 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot2.png index b2aa174..09352ab 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot3.png index 1834bb0..bba70d6 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BlueProfilLeftJumpLeftShootingLeftShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot1.png index c24be96..6ef6a7c 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot2.png index a94919f..c6f96b8 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot3.png index 8f932ee..66ab97f 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGJumpingShooting/ShootingJump/BluerProfilRightJumprightShootingRightShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueBackLeftShootingLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueBackLeftShootingLeft.png index 0842f01..885e6c7 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueBackLeftShootingLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueBackLeftShootingLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueBackRightShootingRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueBackRightShootingRight.png index 91b2684..3e76747 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueBackRightShootingRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueBackRightShootingRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueFrontLeftShootingLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueFrontLeftShootingLeft.png index 56865bf..58f5bd6 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueFrontLeftShootingLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueFrontLeftShootingLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueFrontRightShootingRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueFrontRightShootingRight.png index 1ead66b..970ca2a 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueFrontRightShootingRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueFrontRightShootingRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueLeftShootingLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueLeftShootingLeft.png index 7d8f578..253d24a 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueLeftShootingLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueLeftShootingLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueProfilShootingLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueProfilShootingLeft.png index 306e94e..c97f569 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueProfilShootingLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueProfilShootingLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueProfilShootingRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueProfilShootingRight.png index 43b7817..e1499cd 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueProfilShootingRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueProfilShootingRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueRightShootingRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueRightShootingRight.png index def4afb..ab5a315 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueRightShootingRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueRightShootingRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueShootingBackLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueShootingBackLeft.png index 3ca0714..0befc0d 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueShootingBackLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueShootingBackLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueShootingBackRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueShootingBackRight.png index 7ea7d9e..271da83 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueShootingBackRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/BlueShootingBackRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot1.png index 5d552d0..47be7a1 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot2.png index 6fb898c..33a5e19 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot3.png index 5597961..79598e2 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackLeftShootingLeftShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot1.png index 74c9f18..94108dc 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot2.png index 7c033ec..0487033 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot3.png index fcb900b..f8e267e 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueBackRightShootingRightShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot1.png index 5902c40..4b91cf1 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot2.png index 5f85afe..7119eae 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot3.png index 61792ed..c830274 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontLeftShootingLeftShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot1.png index d6b8aed..fdb48a1 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot2.png index 7175d87..7a7fb71 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot3.png index ba991bd..aa161b1 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueFrontRightShootingRightShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot1.png index 517a261..2a1018d 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot2.png index 60c44b9..9b8082c 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot3.png index eb3a984..851451b 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueLeftShootingLeftShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot1.png index d1f51ab..2d24097 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot2.png index aae48a8..a281dae 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot3.png index eb72cb8..af357b7 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingLeftShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot1.png index 5a84914..53f57fb 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot2.png index baeb4eb..c73b3d6 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot3.png index 8e1f794..c9f30ea 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueProfilShootingRightShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot1.png index 0c80ebc..acec7d3 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot2.png index 4e40664..276722b 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot3.png index d174798..d446c80 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueRightShootingRightShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot1.png index 3a26f64..e5b6580 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot2.png index 5958dec..e70cd33 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot3.png index 55b416a..729b637 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackLeftShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot1.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot1.png index 88af064..14dbf49 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot1.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot1.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot2.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot2.png index 3005b9f..cbdb64a 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot2.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot2.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot3.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot3.png index 1ba9e13..bfd0541 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot3.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGShooting/Shooting/BlueShootingBackRightShoot3.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueBackLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueBackLeft.png deleted file mode 100644 index 79fbcdd..0000000 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueBackLeft.png and /dev/null differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueBackRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueBackRight.png index 10bf254..b99b838 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueBackRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueBackRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueFrontLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueFrontLeft.png deleted file mode 100644 index c66ec21..0000000 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueFrontLeft.png and /dev/null differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueFrontRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueFrontRight.png index 6957dc8..9ac44e6 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueFrontRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueFrontRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueLeft.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueLeft.png index decb952..88e12c1 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueLeft.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueLeft.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueLeftBack.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueLeftBack.png index e6efc82..fb165d2 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueLeftBack.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueLeftBack.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueRight.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueRight.png index abb089e..610f547 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueRight.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueRight.png differ diff --git a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueRightBack.png b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueRightBack.png index 16349c8..f7b7664 100644 Binary files a/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueRightBack.png and b/SQCSim2021/media/textures/AssetOtherPlayer/FinalPNGStanding/BlueRightBack.png differ diff --git a/SQCSim2021/media/textures/Booster/BoosterVert.png b/SQCSim2021/media/textures/Booster/BoosterVert.png new file mode 100644 index 0000000..b731b74 Binary files /dev/null and b/SQCSim2021/media/textures/Booster/BoosterVert.png differ diff --git a/SQCSim2021/media/textures/Bouton/BasicPlay.png b/SQCSim2021/media/textures/Bouton/BasicPlay.png deleted file mode 100644 index 109f65a..0000000 Binary files a/SQCSim2021/media/textures/Bouton/BasicPlay.png and /dev/null differ diff --git a/SQCSim2021/media/textures/Bouton/BasicQuit.png b/SQCSim2021/media/textures/Bouton/BasicQuit.png deleted file mode 100644 index db7ad29..0000000 Binary files a/SQCSim2021/media/textures/Bouton/BasicQuit.png and /dev/null differ diff --git a/SQCSim2021/media/textures/BrouillonbackgroundMenu.png b/SQCSim2021/media/textures/BrouillonbackgroundMenu.png deleted file mode 100644 index ba8631c..0000000 Binary files a/SQCSim2021/media/textures/BrouillonbackgroundMenu.png and /dev/null differ diff --git a/SQCSim2021/media/textures/greengrass.png b/SQCSim2021/media/textures/greengrass.png new file mode 100644 index 0000000..71350e6 Binary files /dev/null and b/SQCSim2021/media/textures/greengrass.png differ diff --git a/SQCSim2021/media/textures/single_multi.png b/SQCSim2021/media/textures/menus/backgrounds/bgMainMenu.png similarity index 100% rename from SQCSim2021/media/textures/single_multi.png rename to SQCSim2021/media/textures/menus/backgrounds/bgMainMenu.png diff --git a/SQCSim2021/media/textures/menus/backgrounds/bgOptions.png b/SQCSim2021/media/textures/menus/backgrounds/bgOptions.png new file mode 100644 index 0000000..3a8dc45 Binary files /dev/null and b/SQCSim2021/media/textures/menus/backgrounds/bgOptions.png differ diff --git a/SQCSim2021/media/textures/menus/backgrounds/bgPause.png b/SQCSim2021/media/textures/menus/backgrounds/bgPause.png new file mode 100644 index 0000000..c236e26 Binary files /dev/null and b/SQCSim2021/media/textures/menus/backgrounds/bgPause.png differ diff --git a/SQCSim2021/media/textures/sc2.png b/SQCSim2021/media/textures/menus/backgrounds/bgSplash.png similarity index 100% rename from SQCSim2021/media/textures/sc2.png rename to SQCSim2021/media/textures/menus/backgrounds/bgSplash.png diff --git a/SQCSim2021/media/textures/menus/buttons/main/mainBack.png b/SQCSim2021/media/textures/menus/buttons/main/mainBack.png new file mode 100644 index 0000000..8a0e568 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/main/mainBack.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/main/mainMulti.png b/SQCSim2021/media/textures/menus/buttons/main/mainMulti.png new file mode 100644 index 0000000..502891a Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/main/mainMulti.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/main/mainOptions.png b/SQCSim2021/media/textures/menus/buttons/main/mainOptions.png new file mode 100644 index 0000000..8984ca6 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/main/mainOptions.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/main/mainPlay.png b/SQCSim2021/media/textures/menus/buttons/main/mainPlay.png new file mode 100644 index 0000000..0cfbb14 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/main/mainPlay.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/main/mainQuit.png b/SQCSim2021/media/textures/menus/buttons/main/mainQuit.png new file mode 100644 index 0000000..0c61ab4 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/main/mainQuit.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/main/mainSingle.png b/SQCSim2021/media/textures/menus/buttons/main/mainSingle.png new file mode 100644 index 0000000..6fe2074 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/main/mainSingle.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/options/optAudio.png b/SQCSim2021/media/textures/menus/buttons/options/optAudio.png new file mode 100644 index 0000000..de3bbf4 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/options/optAudio.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/options/optBack.png b/SQCSim2021/media/textures/menus/buttons/options/optBack.png new file mode 100644 index 0000000..03e2563 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/options/optBack.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/options/optGameplay.png b/SQCSim2021/media/textures/menus/buttons/options/optGameplay.png new file mode 100644 index 0000000..687c857 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/options/optGameplay.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/options/optGraphics.png b/SQCSim2021/media/textures/menus/buttons/options/optGraphics.png new file mode 100644 index 0000000..8aa8b66 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/options/optGraphics.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/options/optMain.png b/SQCSim2021/media/textures/menus/buttons/options/optMain.png new file mode 100644 index 0000000..c9e1098 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/options/optMain.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/options/optMusic.png b/SQCSim2021/media/textures/menus/buttons/options/optMusic.png new file mode 100644 index 0000000..c6f4d57 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/options/optMusic.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/options/optOptions.png b/SQCSim2021/media/textures/menus/buttons/options/optOptions.png new file mode 100644 index 0000000..5c15729 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/options/optOptions.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/options/optResolution.png b/SQCSim2021/media/textures/menus/buttons/options/optResolution.png new file mode 100644 index 0000000..8003a75 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/options/optResolution.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/options/optSensitivity.png b/SQCSim2021/media/textures/menus/buttons/options/optSensitivity.png new file mode 100644 index 0000000..b8af10f Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/options/optSensitivity.png differ diff --git a/SQCSim2021/media/textures/menus/buttons/options/optSfx.png b/SQCSim2021/media/textures/menus/buttons/options/optSfx.png new file mode 100644 index 0000000..43babb6 Binary files /dev/null and b/SQCSim2021/media/textures/menus/buttons/options/optSfx.png differ diff --git a/SQCSim2021/media/textures/menus/labels/labelFhd.png b/SQCSim2021/media/textures/menus/labels/labelFhd.png new file mode 100644 index 0000000..0e78428 Binary files /dev/null and b/SQCSim2021/media/textures/menus/labels/labelFhd.png differ diff --git a/SQCSim2021/media/textures/menus/labels/labelHd.png b/SQCSim2021/media/textures/menus/labels/labelHd.png new file mode 100644 index 0000000..9594d91 Binary files /dev/null and b/SQCSim2021/media/textures/menus/labels/labelHd.png differ diff --git a/SQCSim2021/media/textures/menus/labels/labelQhd.png b/SQCSim2021/media/textures/menus/labels/labelQhd.png new file mode 100644 index 0000000..1da6626 Binary files /dev/null and b/SQCSim2021/media/textures/menus/labels/labelQhd.png differ diff --git a/SQCSim2021/media/textures/title.png b/SQCSim2021/media/textures/menus/labels/labelTitle.png similarity index 100% rename from SQCSim2021/media/textures/title.png rename to SQCSim2021/media/textures/menus/labels/labelTitle.png diff --git a/SQCSim2021/media/textures/menus/labels/labelUhd.png b/SQCSim2021/media/textures/menus/labels/labelUhd.png new file mode 100644 index 0000000..696a558 Binary files /dev/null and b/SQCSim2021/media/textures/menus/labels/labelUhd.png differ diff --git a/SQCSim2021/media/textures/menus/others/check.png b/SQCSim2021/media/textures/menus/others/check.png new file mode 100644 index 0000000..9b3968b Binary files /dev/null and b/SQCSim2021/media/textures/menus/others/check.png differ diff --git a/SQCSim2021/media/textures/menus/others/checked.png b/SQCSim2021/media/textures/menus/others/checked.png new file mode 100644 index 0000000..2debe55 Binary files /dev/null and b/SQCSim2021/media/textures/menus/others/checked.png differ diff --git a/SQCSim2021/media/textures/multi_player.png b/SQCSim2021/media/textures/multi_player.png deleted file mode 100644 index d8db6e0..0000000 Binary files a/SQCSim2021/media/textures/multi_player.png and /dev/null differ diff --git a/SQCSim2021/media/textures/single_player.png b/SQCSim2021/media/textures/single_player.png deleted file mode 100644 index f553d08..0000000 Binary files a/SQCSim2021/media/textures/single_player.png and /dev/null differ diff --git a/SQCSim2021/mesh.cpp b/SQCSim2021/mesh.cpp index 04294af..c6f6b9b 100644 --- a/SQCSim2021/mesh.cpp +++ b/SQCSim2021/mesh.cpp @@ -9,7 +9,7 @@ Mesh::~Mesh() { void Mesh::FlushMeshToVBO() { m_vertexBuffer.SetMeshData(m_vd, m_vcount); m_vcount = 0; - //delete[] m_vd; + delete[] m_vd; } void Mesh::FlushVBO() { diff --git a/SQCSim2021/mesh.h b/SQCSim2021/mesh.h index 0a070ff..138d0e2 100644 --- a/SQCSim2021/mesh.h +++ b/SQCSim2021/mesh.h @@ -15,7 +15,7 @@ private: Chunk* m_chunk; // NE PAS DÉTRUIRE ICI. void AddBlockToMesh(VertexBuffer::VertexData* vd, int& count, BlockType bt, int x, int y, int z, float u, float v, float s, World* world); - + void RemoveChunk(int nbReduit); public: Mesh(Chunk* chunk); ~Mesh(); diff --git a/SQCSim2021/openglcontext.cpp b/SQCSim2021/openglcontext.cpp index 7a61b07..6284446 100644 --- a/SQCSim2021/openglcontext.cpp +++ b/SQCSim2021/openglcontext.cpp @@ -15,7 +15,7 @@ bool OpenglContext::Start(const std::string& title, int width, int height, bool m_title = title; m_fullscreen = fullscreen; InitWindow(width, height); - + Init(); LoadResource(); diff --git a/SQCSim2021/openglcontext.h b/SQCSim2021/openglcontext.h index 3825b26..2718540 100644 --- a/SQCSim2021/openglcontext.h +++ b/SQCSim2021/openglcontext.h @@ -52,6 +52,8 @@ protected: void HideCursor(); void ShowCrossCursor() const; + bool m_istarted = false; + private: void InitWindow(int width, int height); MOUSE_BUTTON ConvertMouseButton(sf::Mouse::Button button) const; diff --git a/SQCSim2021/remoteplayer.cpp b/SQCSim2021/remoteplayer.cpp index 7769ddc..c2247ba 100644 --- a/SQCSim2021/remoteplayer.cpp +++ b/SQCSim2021/remoteplayer.cpp @@ -2,69 +2,141 @@ #include #include +#include +#include -RemotePlayer::RemotePlayer(netprot::PlayerInfo pinfo) : Player(Vector3f(0, 0, 0), 0, 0), m_pinfo(pinfo), m_aminacc(0.0f), m_animstate(Anim::STILL), m_team_id(0), current(), previous() { + + + +RemotePlayer::RemotePlayer(netprot::PlayerInfo pinfo) : m_pinfo(pinfo), m_aminacc(0.0f), m_animstate(Anim::STILL), m_team_id(0), current(), previous(), m_texture_front(), Player(Vector3f(0, 0, 0)){ + + LoadTexture(m_texture_front, TEXTURE_PATH "AssetOtherPlayer/FinalPNGStanding/BlueFrontRight.png", false, false); } -void RemotePlayer::Init() { +RemotePlayer::RemotePlayer(netprot::PlayerInfo pinfo, const Vector3f& pos) : m_pinfo(pinfo), m_aminacc(0.0f), m_animstate(Anim::STILL), m_team_id(0), current(), previous(), m_texture_front(), Player(pos) { + + LoadTexture(m_texture_front, TEXTURE_PATH "AssetOtherPlayer/FinalPNGStanding/BlueFrontRight.png", false, false); + +} + + +RemotePlayer::~RemotePlayer() +{ + +} + +void RemotePlayer::Init() +{ } void RemotePlayer::Feed(const netprot::Output out) { - current.position = out.position; - current.direction = out.direction; - current.states = out.states; - current.id = out.id; + //current.position = out.position; + //current.direction = out.direction; + //current.states = out.states; + //current.id = out.id; - //a revoir pour le jump et le shoot en meme temps lorsque les test seront possible + //if (current.position != previous.position) + //{ + // Vector3f positionDelta = current.position - previous.position; + // m_position = current.position + positionDelta; + // m_direction = current.direction; - if (current.position != previous.position) - { - Vector3f positionDelta = current.position - previous.position; - m_position = current.position + positionDelta; - m_direction = current.direction; + //} - } + //if(current.direction != previous.direction) + //{ + // m_direction = current.direction; + // current.direction = current.direction; + //} - if(current.direction != previous.direction) - { - m_direction = current.direction; - current.direction = current.direction; - } + //if (current.states.shooting) { + // m_animstate = Anim::SHOOTING; + //} + //else if (current.states.jumping) { + // m_animstate = Anim::JUMPING; + //} + //else if (current.states.dead) { + // m_animstate = Anim::DEAD; + //} + //else if(current.states.powerup){ + // m_animstate = Anim::POWERUP; + //} + //else if (current.states.still) { + // m_animstate = Anim::STILL; + //} + //else if (current.states.running) { + // m_animstate = Anim::RUNNING; + //} - if (current.states.shooting) { - //true; - m_animstate = Anim::SHOOTING; - } - else if (current.states.jumping) { - //true; - m_animstate = Anim::JUMPING; - } - else if (current.states.dead) { - //true; - m_animstate = Anim::DEAD; - } - else if(current.states.powerup){ - //true; - m_animstate = Anim::POWERUP; - } - else if (current.states.still) { - //true; - m_animstate = Anim::STILL; - } - else if (current.states.running) { - //true; - m_animstate = Anim::RUNNING; - } + //previous.direction = current.direction; + //previous.position = current.position; + //previous.states = current.states; + //previous.id = current.id; +} + +void RemotePlayer::Render(TextureAtlas& atlas, Shader& shader, Transformation tran, float elapsedTime) +{ + + float x = GetPosition().x; + float y = GetPosition().y; + float z = GetPosition().z; + float width = 1.f; + float height = 1.7f; - previous.direction = current.direction; - previous.position = current.position; - previous.states = current.states; - previous.id = current.id; + //Matrix4 mat4 = tran.GetMatrix(); + //mat4 VP = pMatrix * vMatrix; + //Vector3f CameraRight = Vector3f(mat4.Get11(), mat4.Get21(), mat4.Get31()); + //Vector3f CameraUp = Vector3f(mat4.Get12(), mat4.Get22(), mat4.Get32()); + + //Vector3f v1 = (m_position + CameraRight * 0.5 * width + CameraUp * -0.5 * width); + //Vector3f v2 = (m_position + CameraRight * 0.5 * width + CameraUp * 0.5 * width); + //Vector3f v4 = (m_position + CameraRight * -0.5 * width + CameraUp * -0.5 * width); + //Vector3f v3 = (m_position + CameraRight * -0.5 * width + CameraUp * 0.5 * width); + + //tran.ApplyTranslation(m_position); + float u, v, w, h; + //glDisable(GL_DEPTH_TEST); + shader.Use(); + atlas.Bind(); + atlas.TextureIndexToCoord(0, u, v, w, h); + //glLoadIdentity(); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendEquation(GL_FUNC_ADD); + + glLoadMatrixf(tran.GetMatrix().GetInternalValues()); + glBegin(GL_QUADS); + glTexCoord2f(u, v); glVertex3f(x - width/2., y - height, z); //glVertex3f(v4.x, v4.y, v4.z);//glVertex3f(0, 50, 0); + glTexCoord2f(u + w, v); glVertex3f(x+width/2., y - height, z); //glVertex3f(v3.x, v3.y, v3.z); //glVertex3f(50,50, 0); + glTexCoord2f(u + w, v + h); glVertex3f(x+width/2., y, z); //glVertex3f(v2.x, v2.y, v2.z); //glVertex3f(50, 0, 0); + glTexCoord2f(u, v + h); glVertex3f(x-width/2., y, z); //glVertex3f(v1.x, v1.y, v1.z);// glVertex3f(0, 0, 0); + glEnd(); + glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR); + glBlendEquation(GL_FUNC_SUBTRACT); + glDisable(GL_BLEND); -} \ No newline at end of file + shader.Disable(); + //tran.ApplyTranslation(-m_position); + //glEnable(GL_DEPTH_TEST); +} + +bool RemotePlayer::LoadTexture(Texture& texture, const std::string& filename, bool useMipmaps, bool stopOnError) +{ + texture.Load(filename, useMipmaps); + if (!texture.IsValid()) { + std::cerr << "Unable to load texture (" << filename << ")" << std::endl; + if (stopOnError) + return false; + + return false; + } + + return true; +} diff --git a/SQCSim2021/remoteplayer.h b/SQCSim2021/remoteplayer.h index e8fb8a5..e782000 100644 --- a/SQCSim2021/remoteplayer.h +++ b/SQCSim2021/remoteplayer.h @@ -5,22 +5,38 @@ #include "define.h" #include "textureatlas.h" #include "shader.h" +#include "texture.h" +#include "openglcontext.h" +#include "vertexbuffer.h" +#include "../SQCSim-common/matrix4.h" class RemotePlayer : public Player { public: - enum Anim { STILL = 1, RUNNING = 2, JUMPING = 4, SHOOTING = 8, POWERUP = 16, DEAD = 32 }; - + enum Anim: uint8_t { STILL = 1, RUNNING = 2, JUMPING = 4, SHOOTING = 8, POWERUP = 16, DEAD = 32 }; // A REVOIR VOIR DEFINE.H POUR LES ANIMES + RemotePlayer(netprot::PlayerInfo pinfo); + RemotePlayer(netprot::PlayerInfo pinfo, const Vector3f& pos); + ~RemotePlayer(); + void Init(); void Feed(const netprot::Output out); + void Render(TextureAtlas& atlas, Shader& shader, Transformation tran, float elapsedTime); + bool LoadTexture(Texture& texture, const std::string& filename, bool useMipmaps, bool stopOnError); + + void SetPosition(Vector3f pos) { m_position = pos; } private: netprot::Output current, previous; + std::map m_outbuf; netprot::PlayerInfo m_pinfo; float m_aminacc; Anim m_animstate; uint64_t m_team_id; + Texture m_texture_front; + + + }; #endif \ No newline at end of file diff --git a/SQCSim2021/renderer.cpp b/SQCSim2021/renderer.cpp index b4c8f91..3e5fc97 100644 --- a/SQCSim2021/renderer.cpp +++ b/SQCSim2021/renderer.cpp @@ -1,4 +1,9 @@ #include "renderer.h" +#include +#include + +#include +#include Renderer::Renderer() { m_meshes.Reset(nullptr); @@ -7,7 +12,33 @@ Renderer::Renderer() { Renderer::~Renderer() { } -void Renderer::RenderWorld(World* origin, int& rendercount, const Vector3f& player_pos, const Vector3f& player_dir, Transformation& world, Shader& shader, TextureAtlas& atlas) const { +void Renderer::RemoveChunk(int nbReduit) +{ + for (int x = 0; x < WORLD_SIZE_X; ++x) + for (int y = 0; y < WORLD_SIZE_Y; ++y) + { + Mesh* chk = nullptr; + if (x < nbReduit) + chk = m_meshes.Remove(x, y); + if (y < nbReduit) + chk = m_meshes.Remove(x, y); + if (y > WORLD_SIZE_Y - nbReduit) + chk = m_meshes.Remove(x, y); + if (x > WORLD_SIZE_X - nbReduit) + chk = m_meshes.Remove(x, y); + + // TODO: MakeDirty() les voisins pour qu'ils se redessinent. + + if (!chk) + continue; + + delete chk; + } + + +} + +void Renderer::RenderWorld(World* origin, int& rendercount, const Vector3f& player_pos, const Vector3f& player_dir, Transformation world, Shader& shader, TextureAtlas& atlas) const { rendercount = 0; Vector3f angle; Vector3f cursor; @@ -105,7 +136,8 @@ void Renderer::RenderWorld(World* origin, int& rendercount, const Vector3f& play } shader.Disable(); glStencilFunc(GL_GREATER, 1, 0xFF); -}; +} + void Renderer::UpdateMesh(World* origin, const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST]) { int cx = player.x; @@ -212,6 +244,30 @@ void Renderer::UpdateMesh(World* origin, const Vector3f& player, BlockInfo* bloc } } +void Renderer::RenderBillboard(const Vector3f pos, TextureAtlas textureAtlas, TextureAtlas::TextureIndex idx, Shader& shader, Transformation tran) +{ + //float x = pos.x; + //float y = pos.y; + //float z = pos.z; + //float width = 1.0f; + //float height = 1.0f; + + //float u, v, w, h; + //shader.Use(); + //textureAtlas.Bind(); + //textureAtlas.TextureIndexToCoord(idx, u, v, w, h); + + //glLoadMatrixf(tran.GetMatrix().GetInternalValues()); + //glBegin(GL_QUADS); + //glTexCoord2f(u, v); glVertex3f(x - width / 2., y - height, z); //glVertex3f(v4.x, v4.y, v4.z);//glVertex3f(0, 50, 0); + //glTexCoord2f(u + w, v); glVertex3f(x + width / 2., y - height, z); //glVertex3f(v3.x, v3.y, v3.z); //glVertex3f(50,50, 0); + //glTexCoord2f(u + w, v + h); glVertex3f(x + width / 2., y, z); //glVertex3f(v2.x, v2.y, v2.z); //glVertex3f(50, 0, 0); + //glTexCoord2f(u, v + h); glVertex3f(x - width / 2., y, z); //glVertex3f(v1.x, v1.y, v1.z);// glVertex3f(0, 0, 0); + //glEnd(); + //shader.Disable(); +} + + void Renderer::RenderPlayer(Player* player, Transformation tran) const { } diff --git a/SQCSim2021/renderer.h b/SQCSim2021/renderer.h index 8afdc3b..5a13709 100644 --- a/SQCSim2021/renderer.h +++ b/SQCSim2021/renderer.h @@ -9,6 +9,9 @@ #include "textureatlas.h" #include "shader.h" #include "remoteplayer.h" +#include "openglcontext.h" +#include "vertexbuffer.h" +#include "../SQCSim-common/matrix4.h" class Renderer { private: @@ -16,14 +19,19 @@ private: TextureAtlas* m_playertext = nullptr; Shader* m_playershader = nullptr; + bool test = true; public: Renderer(); ~Renderer(); + void RemoveChunk(int nbReduit); + void UpdateMesh(World* origin, const Vector3f& player, BlockInfo* blockinfo[BTYPE_LAST]); - void RenderWorld(World* origin, int& rendercount, const Vector3f& player_pos, const Vector3f& player_dir, Transformation& world, Shader& shader, TextureAtlas& atlas) const; + void RenderBillboard(const Vector3f pos, TextureAtlas textureAtlas, TextureAtlas::TextureIndex idx, Shader& shader, Transformation tran); + + void RenderWorld(World* origin, int& rendercount, const Vector3f& player_pos, const Vector3f& player_dir, Transformation world, Shader& shader, TextureAtlas& atlas) const; void RenderPlayer(Player* player, Transformation tran) const; void RenderPlayer(RemotePlayer* rplayer, const Vector3f& player_pos, const Vector3f& player_dir) const; }; diff --git a/SQCSim2021/settings.cpp b/SQCSim2021/settings.cpp new file mode 100644 index 0000000..b84effc --- /dev/null +++ b/SQCSim2021/settings.cpp @@ -0,0 +1,146 @@ +#include "settings.h" + +Settings::Settings(Audio& audio) + : m_audio(audio), + m_mainVolume(0.5f), + m_musicVolume(0.5f), + m_sfxVolume(0.5f), + m_resolution(FHD), + m_fullscreen(false), + m_brightness(0.5f), + m_contrast(0.5f), + m_mouseSensitivity(0.5f) { + ApplyResolution(m_resolution); +} + +void Settings::SaveFile(const std::string& filename) { + std::ofstream file(filename); + if (!file.is_open()) { + std::cerr << "Failed to open file for saving parameters" << std::endl; + return; + } + + file << m_mainVolume << '\n'; + file << m_musicVolume << '\n'; + file << m_sfxVolume << '\n'; + + file << static_cast(m_resolution) << '\n'; + file << m_fullscreen << '\n'; + file << m_brightness << '\n'; + file << m_contrast << '\n'; + + file << m_mouseSensitivity << '\n'; + + file.close(); +} + +void Settings::LoadFile(const std::string& filename) { + std::ifstream file(filename); + if (!file.is_open()) { + std::cerr << "Failed to open file for loading parameters" << std::endl; + return; + } + + file >> m_mainVolume; + file >> m_musicVolume; + file >> m_sfxVolume; + + int resolutionValue; + file >> resolutionValue; + m_resolution = static_cast(resolutionValue); + + file >> m_fullscreen; + file >> m_brightness; + file >> m_contrast; + + file >> m_mouseSensitivity; + + file.close(); +} + +float Settings::GetMainVolume() const { + return m_mainVolume; +} + +void Settings::SetMainVolume(float volume) { + m_mainVolume = volume; +} + +void Settings::GetMusicVolume() { + m_musicVolume = m_audio.GetMusicVolume(); +} + +void Settings::SetMusicVolume(float volume) { + m_musicVolume = volume; +} + +float Settings::GetSfxVolume() const { + return m_sfxVolume; +} + +void Settings::SetSfxVolume(float volume) { + m_sfxVolume = volume; +} + +float Settings::GetBrightness() const { + return m_brightness; +} + +void Settings::SetBrightness(float brightness) { + m_brightness = brightness; +} + +float Settings::GetContrast() const { + return m_contrast; +} + +void Settings::SetContrast(float contrast) { + m_contrast = contrast; +} + +bool Settings::GetFullscreen() const { + return m_fullscreen; +} + +void Settings::SetFullscreen(bool fullscreen) { + m_fullscreen = fullscreen; +} + +const Resolution& Settings::GetResolution() const { + return m_resolution; +} + +void Settings::SetResolution(const Resolution& resolution) { + m_resolution = resolution; +} + +float Settings::GetMouseSensitivity() const { + return m_mouseSensitivity; +} + +void Settings::SetMouseSensitivity(float sensitivity) { + m_mouseSensitivity = sensitivity; +} + +void Settings::ApplyResolution(Resolution resolution) { + switch (resolution) { + case HD: + m_rezWidth = 1280; + m_rezHeight = 720; + break; + case FHD: + m_rezWidth = 1920; + m_rezHeight = 1080; + break; + case QHD: + m_rezWidth = 2560; + m_rezHeight = 1440; + break; + case UHD: + m_rezWidth = 3840; + m_rezHeight = 2160; + break; + default: + break; + } +} diff --git a/SQCSim2021/settings.h b/SQCSim2021/settings.h new file mode 100644 index 0000000..e871529 --- /dev/null +++ b/SQCSim2021/settings.h @@ -0,0 +1,70 @@ +#ifndef SETTINGS_H__ +#define SETTINGS_H__ + +#include +#include +#include +#include +#include + +#include "define.h" +#include "audio.h" + +class Settings { +public: + Settings(Audio& audio); + + void SaveFile(const std::string& filename); + void LoadFile(const std::string& filename); + + // Audio + float GetMainVolume() const; + void SetMainVolume(float volume); + + void GetMusicVolume(); + void SetMusicVolume(float volume); + + float GetSfxVolume() const; + void SetSfxVolume(float volume); + + // Graphic + float GetBrightness() const; + void SetBrightness(float brightness); + + float GetContrast() const; + void SetContrast(float contrast); + + bool GetFullscreen() const; + void SetFullscreen(bool fullscreen); + + const Resolution& GetResolution() const; + void SetResolution(const Resolution& resolution); + + // Gameplay + float GetMouseSensitivity() const; + void SetMouseSensitivity(float sensitivity); + + void ApplyResolution(Resolution resolution); + +private: + + Audio& m_audio; + // Audio + float m_mainVolume; + float m_musicVolume; + float m_sfxVolume; + + // Graphic + Resolution m_resolution; + bool m_fullscreen; + int m_rezWidth; + int m_rezHeight; + float m_brightness; + float m_contrast; + + // Gameplay + float m_mouseSensitivity; +}; + + +#endif // PARAMETERS_H \ No newline at end of file diff --git a/SQCSim2021/textureatlas.cpp b/SQCSim2021/textureatlas.cpp index d293c84..ccefd2c 100644 --- a/SQCSim2021/textureatlas.cpp +++ b/SQCSim2021/textureatlas.cpp @@ -40,6 +40,9 @@ TextureAtlas::TextureIndex TextureAtlas::AddTexture(const std::string& fname) { } bool TextureAtlas::Generate(int textureSize, bool mipmap) { + + + // TODO mipmap pas encore 100% parfait... assert(!mipmap); @@ -66,6 +69,8 @@ bool TextureAtlas::Generate(int textureSize, bool mipmap) { ilOriginFunc(IL_ORIGIN_LOWER_LEFT); ilEnable(IL_ORIGIN_SET); + ilEnable(IL_ALPHA); + ilEnable(IL_BLIT_BLEND); if (!ilLoadImage((const ILstring)it->first.c_str())) return false; @@ -170,8 +175,10 @@ bool TextureAtlas::Generate(int textureSize, bool mipmap) { mipmapSize /= 2; } + m_isValid = true; return true; + }