diff --git a/ProjectMorault/Morault_Map.cpp b/ProjectMorault/Morault_Map.cpp new file mode 100644 index 0000000..4c6e3a8 --- /dev/null +++ b/ProjectMorault/Morault_Map.cpp @@ -0,0 +1,13 @@ +#include "Morault_Map.h" + +Morault::Maps::Map::Map() +{ +} + +Morault::Maps::Map::Map(std::string path) +{ +} + +Morault::Maps::Map::~Map() +{ +} diff --git a/ProjectMorault/Morault_Map.h b/ProjectMorault/Morault_Map.h index 30e8889..885db3e 100644 --- a/ProjectMorault/Morault_Map.h +++ b/ProjectMorault/Morault_Map.h @@ -1,9 +1,30 @@ #pragma once +#include +#include +#include namespace Morault { namespace Maps { - class Map { + struct MapTriangle { + + Vector2 a, b, c; + std::string wallAB = "pms:none", wallBC = "pms:none", wallCA = "pms:none"; // if empty, no wall + + bool hasCeiling; std::string ceilingTexture = "pms:SKY"; // sky is special texture + bool hasFloor; std::string floorTexture = "pms:SKY"; // sky is special texture + + int heightFloor, heightCeiling; + + }; + + class Map { // Map element for Shuman 1 + public: + std::vector MapTriangles; + Map(); + Map(std::string path); + + ~Map(); }; } } \ No newline at end of file diff --git a/ProjectMorault/Morault_Resources.cpp b/ProjectMorault/Morault_Resources.cpp index 4204af6..6e757be 100644 --- a/ProjectMorault/Morault_Resources.cpp +++ b/ProjectMorault/Morault_Resources.cpp @@ -5,6 +5,8 @@ #include #include std::map __models_map; +std::map __textures_map; + Morault::Resources::_ResourceRequest Morault::Resources::load(std::string modelName) { _ResourceRequest retval; @@ -59,6 +61,28 @@ std::variant Morault::Resources::Models(_ResourceRequest request) } } +std::variant Morault::Resources::Textures(_ResourceRequest request) +{ + switch (request.type) { + case LOAD: + __textures_map[request.req] = LoadTexture(request.req.c_str()); + return true; + break; + case GET: + return __textures_map[request.req]; + break; + case UNLOAD: + UnloadTexture(__textures_map[request.req]); + return true; + break; + case RELOAD: + UnloadTexture(__textures_map[request.req]); + __textures_map[request.req] = LoadTexture(request.req.c_str()); + return true; + break; + } +} + Image Morault::Resources::GenTestImage() { Image retval = GenImageColor(256, 256, BLANK); diff --git a/ProjectMorault/Morault_Resources.h b/ProjectMorault/Morault_Resources.h index a9e216a..9f18dd6 100644 --- a/ProjectMorault/Morault_Resources.h +++ b/ProjectMorault/Morault_Resources.h @@ -21,13 +21,14 @@ namespace Morault { std::string req; }; - _ResourceRequest load(std::string modelName); - _ResourceRequest get(std::string modelName); - _ResourceRequest unload(std::string modelName); - _ResourceRequest reload(std::string modelName); + _ResourceRequest load(std::string resourceName); + _ResourceRequest get(std::string resourceName); + _ResourceRequest unload(std::string resourceName); + _ResourceRequest reload(std::string resourceName); std::variant Models(_ResourceRequest request); + std::variant Textures(_ResourceRequest request); typedef enum { diff --git a/ProjectMorault/ProjectMorault.vcxproj b/ProjectMorault/ProjectMorault.vcxproj index b920807..4215563 100644 --- a/ProjectMorault/ProjectMorault.vcxproj +++ b/ProjectMorault/ProjectMorault.vcxproj @@ -136,6 +136,7 @@ + diff --git a/ProjectMorault/ProjectMorault.vcxproj.filters b/ProjectMorault/ProjectMorault.vcxproj.filters index 0b968f2..3310e54 100644 --- a/ProjectMorault/ProjectMorault.vcxproj.filters +++ b/ProjectMorault/ProjectMorault.vcxproj.filters @@ -30,6 +30,9 @@ Source Files + + Source Files + diff --git a/ProjectMorault/data/maps/mainhub.shuman b/ProjectMorault/data/maps/mainhub.shuman new file mode 100644 index 0000000..e69de29 diff --git a/ProjectMorault/data/textures/test.png b/ProjectMorault/data/textures/test.png new file mode 100644 index 0000000..c30d1c4 Binary files /dev/null and b/ProjectMorault/data/textures/test.png differ diff --git a/ProjectMorault/main.cpp b/ProjectMorault/main.cpp index 5f10e3f..43d2dbb 100644 --- a/ProjectMorault/main.cpp +++ b/ProjectMorault/main.cpp @@ -2,11 +2,26 @@ #include #include "Morault_Resources.h" #include "Morault_Player.h" -#include "Morault_UDMF.h" +#include "Morault_Map.h" #include #include #define MORAULT_MAP_RENDER_SCALE 0.1f + +typedef enum { + NONE, + GAME, + EDITOR +} EngineState; + +typedef enum { + NA, A, B, C +} SectorTriangleSelection; + +struct EditorSelection { + int sector; + SectorTriangleSelection point; +}; int main(int argc, char** argv) { InitWindow(1280, 720, "ProjectMorault"); SetTargetFPS(60); @@ -15,24 +30,151 @@ int main(int argc, char** argv) { DisableCursor(); + Morault::Gameplay::Player player; player.data.playerName = "TestPlayer0001"; player.data.hp = 100; player.data.xp = 0; bool gamePaused = false; + + EngineState eState = GAME; + EditorSelection selection = { -1, NA }; + bool inSelection = false; + Morault::Maps::Map* map = new Morault::Maps::Map(); + + { + using namespace Morault::Resources; + Textures(load("data/textures/test.png")); + } + + + Vector2 editorOffset = { 0,0 }; while (!WindowShouldClose()) { - player.controller.UpdatePlayerController(!gamePaused); - BeginDrawing(); - ClearBackground(BLACK); - BeginMode3D(player.controller.camera); - DrawGrid(100, 10); - EndMode3D(); - - DrawFPS(0, 0); - EndDrawing(); + switch(eState){ + case GAME: { + if (IsKeyPressed(KEY_E)) { + eState = EDITOR; + EnableCursor(); + } + player.controller.UpdatePlayerController(!gamePaused); + + BeginDrawing(); + ClearBackground(BLACK); + BeginMode3D(player.controller.camera); + DrawGrid(100, 10); + + for (int i = 0; i < map->MapTriangles.size(); i++) { + DrawTriangle3D( + { + map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].a.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].b.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].b.y * MORAULT_MAP_RENDER_SCALE + }, + { + map->MapTriangles[i].c.x * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].heightFloor * MORAULT_MAP_RENDER_SCALE, + map->MapTriangles[i].c.y * MORAULT_MAP_RENDER_SCALE + }, + RED + ); + } + + + + EndMode3D(); + + DrawFPS(0, 0); + EndDrawing(); + } break; + case EDITOR: { + if (IsKeyPressed(KEY_E)) { + eState = GAME; + DisableCursor(); + } + if (IsKeyPressed(KEY_ESCAPE)) { + inSelection = false; + } + if (IsKeyDown(KEY_LEFT_SHIFT)) { + if (IsKeyPressed(KEY_N)) { + Morault::Maps::MapTriangle tri; + tri.a = { -128, -128 }; + tri.b = { 128,128 }; + tri.c = { 128,-128 }; + tri.floorTexture = "data/textures/test.png"; + tri.heightFloor = 0; + tri.heightCeiling = 128; + tri.hasFloor = true; + tri.hasCeiling = false; + tri.wallAB = "data/textures/test.png"; + tri.wallBC = "data/textures/test.png"; + tri.wallCA = "data/textures/test.png"; + map->MapTriangles.push_back(tri); + } + } + + if (IsMouseButtonDown(MOUSE_BUTTON_MIDDLE)) editorOffset += GetMouseDelta(); + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { + for (int i = 0; i < map->MapTriangles.size(); i++) { + if (CheckCollisionPointCircle(GetMousePosition() - editorOffset, map->MapTriangles[i].a, 7)) { + inSelection = true; + selection = { i,A }; + } + if (CheckCollisionPointCircle(GetMousePosition() - editorOffset, map->MapTriangles[i].b, 7)) { + inSelection = true; + selection = { i,B }; + } + if (CheckCollisionPointCircle(GetMousePosition() - editorOffset, map->MapTriangles[i].c, 7)) { + inSelection = true; + selection = { i,C }; + } + } + } + + if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) { + if (inSelection) { + switch (selection.point) { + case A: + map->MapTriangles[selection.sector].a += GetMouseDelta(); + break; + case B: + map->MapTriangles[selection.sector].b += GetMouseDelta(); + break; + case C: + map->MapTriangles[selection.sector].c += GetMouseDelta(); + break; + } + } + } + + BeginDrawing(); + ClearBackground(BLACK); + + for (int i = 0; i < map->MapTriangles.size(); i++) { + DrawTriangleLines(map->MapTriangles[i].a + editorOffset, map->MapTriangles[i].b + editorOffset, map->MapTriangles[i].c + editorOffset, YELLOW); + DrawCircle((map->MapTriangles[i].a + editorOffset).x, (map->MapTriangles[i].a + editorOffset).y, 3, RED); + DrawCircle((map->MapTriangles[i].b + editorOffset).x, (map->MapTriangles[i].b + editorOffset).y, 3, RED); + DrawCircle((map->MapTriangles[i].c + editorOffset).x, (map->MapTriangles[i].c + editorOffset).y, 3, RED); + if(inSelection){ + if (selection.sector == i && selection.point == A) DrawCircle((map->MapTriangles[i].a + editorOffset).x, (map->MapTriangles[i].a + editorOffset).y, 5, GREEN); + if (selection.sector == i && selection.point == B) DrawCircle((map->MapTriangles[i].b + editorOffset).x, (map->MapTriangles[i].b + editorOffset).y, 5, GREEN); + if (selection.sector == i && selection.point == C) DrawCircle((map->MapTriangles[i].c + editorOffset).x, (map->MapTriangles[i].c + editorOffset).y, 5, GREEN); + } + + } + + EndDrawing(); + }break; + default: + throw std::runtime_error("what the fuck?"); + } } diff --git a/readme.md b/readme.md index 43a6445..ba898f0 100644 --- a/readme.md +++ b/readme.md @@ -3,6 +3,9 @@ Project Morault is a source-available attempt at a humanist and persistent live-service game. +## Naming +Project Morault is named after Arthur Morault, french mechanic specialized in vintage, sportive and luxury automobiles. He owns a garage, [La Fabrique Auto](https://www.lafabriqueauto.com), with his friend and colleague Joseph Shuman, after whom Project Morault's Shuman map format is named. This naming is a follow-up to the Jossec engine, named after Yann Le Jossec, french drift instructor, powered with the [Levy](https://tilde.town/~safariminer/levy) collision engine, named after Sylvain Levy, french automotive YouTuber. + ## Goals ### Ideological - Establish open standards for items, trading, markets, and user interaction diff --git a/shuman.md b/shuman.md new file mode 100644 index 0000000..6c39db9 --- /dev/null +++ b/shuman.md @@ -0,0 +1 @@ +# Shuman Map Format \ No newline at end of file