2025-06-05 12:05:01 -04:00

384 lines
13 KiB
C++

#include <iostream>
#include <raylib.h>
#include "Morault_Resources.h"
#include "Morault_Player.h"
#include "Morault_Map.h"
#include <raymath.h>
#include <rlgl.h>
#include <string>
#define MORAULT_MAP_RENDER_SCALE 0.1f
typedef enum {
NONE = 0,
GAME,
EDITOR
} EngineState;
typedef enum {
NA, A, B, C
} SectorTriangleSelection;
typedef enum {
NOLINE, AB, BC, CA
} SectorLineSelection;
struct EditorSelection {
int sector;
SectorTriangleSelection point;
SectorLineSelection line;
};
int main(int argc, char** argv) {
InitWindow(1280, 720, "ProjectMorault");
SetTargetFPS(60);
SetExitKey(0);
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, SectorTriangleSelection::NA, SectorLineSelection::NOLINE };
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()) {
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
);
DrawTriangle3D(
{
map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].a.y * MORAULT_MAP_RENDER_SCALE
},
{
map->MapTriangles[i].c.x * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].c.y * MORAULT_MAP_RENDER_SCALE
},
{
map->MapTriangles[i].b.x * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].b.y * MORAULT_MAP_RENDER_SCALE
},
RED
);
if (map->MapTriangles[i].wallAB != "pms:none") {
DrawTriangle3D({
map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].heightCeiling * 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].heightCeiling * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].b.y * MORAULT_MAP_RENDER_SCALE
},
{
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
},
BLUE
);
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].heightCeiling * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].b.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
},
BLUE
);
}
if (map->MapTriangles[i].wallBC != "pms:none") {
DrawTriangle3D({
map->MapTriangles[i].b.x * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].heightCeiling * 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].heightCeiling * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].c.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
},
GREEN
);
DrawTriangle3D({
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].heightCeiling * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].c.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
},
GREEN
);
}
if (map->MapTriangles[i].wallCA != "pms:none") {
DrawTriangle3D({
map->MapTriangles[i].c.x * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].c.y * MORAULT_MAP_RENDER_SCALE
},
{
map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].a.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
},
PURPLE
);
DrawTriangle3D({
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
},
{
map->MapTriangles[i].a.x * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].heightCeiling * MORAULT_MAP_RENDER_SCALE,
map->MapTriangles[i].a.y * MORAULT_MAP_RENDER_SCALE
},
{
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
},
PURPLE
);
}
}
EndMode3D();
DrawFPS(0, 0);
EndDrawing();
} break;
case EDITOR: {
if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_J)) {
if (inSelection) {
Vector2 selectedPoint;
if (selection.point == A) selectedPoint = map->MapTriangles[selection.sector].a;
if (selection.point == B) selectedPoint = map->MapTriangles[selection.sector].b;
if (selection.point == C) selectedPoint = map->MapTriangles[selection.sector].c;
for (int i = 0; i < map->MapTriangles.size(); i++) {
if (i != selection.sector) {
if (Vector2Distance(map->MapTriangles[i].a, selectedPoint) <= 3) map->MapTriangles[i].a = selectedPoint;
if (Vector2Distance(map->MapTriangles[i].b, selectedPoint) <= 3) map->MapTriangles[i].b = selectedPoint;
if (Vector2Distance(map->MapTriangles[i].c, selectedPoint) <= 3) map->MapTriangles[i].c = selectedPoint;
}
}
}
}
if (IsKeyPressed(KEY_E)) {
eState = GAME;
DisableCursor();
}
if (IsKeyPressed(KEY_ESCAPE)) {
inSelection = false;
selection.line = SectorLineSelection::NOLINE;
}
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,SectorLineSelection::NOLINE };
}
if (CheckCollisionPointCircle(GetMousePosition() - editorOffset, map->MapTriangles[i].b, 7)) {
inSelection = true;
selection = { i,B,SectorLineSelection::NOLINE };
}
if (CheckCollisionPointCircle(GetMousePosition() - editorOffset, map->MapTriangles[i].c, 7)) {
inSelection = true;
selection = { i,C,SectorLineSelection::NOLINE };
}
}
}
if (inSelection) {
if (IsKeyDown(KEY_RIGHT_SHIFT) && IsKeyDown(KEY_L)) {
switch (selection.point) {
case A:
if (IsKeyPressed(KEY_B)) {
selection.line = AB;
}
if (IsKeyPressed(KEY_C)) {
selection.line = CA;
}
break;
case B:
if (IsKeyPressed(KEY_A)) {
selection.line = AB;
}
if (IsKeyPressed(KEY_C)) {
selection.line = BC;
}
break;
case C:
if (IsKeyPressed(KEY_B)) {
selection.line = BC;
}
if (IsKeyPressed(KEY_A)) {
selection.line = CA;
}
break;
}
}
}
if (IsKeyPressed(KEY_T) && selection.line != NOLINE) {
std::cout << "Texture for line " << selection.sector << ":" << (selection.line == AB ? "AB" : selection.line == BC ? "BC" : "CA") << "? (current texture is: " << (selection.line == AB ? map->MapTriangles[selection.sector].wallAB : selection.line == BC ? map->MapTriangles[selection.sector].wallBC : map->MapTriangles[selection.sector].wallCA) << ") >>>";
std::string texture;
std::getline(std::cin, texture);
if (texture != "") {
if (selection.line == AB) map->MapTriangles[selection.sector].wallAB = texture;
if (selection.line == BC) map->MapTriangles[selection.sector].wallBC = texture;
if (selection.line == CA) map->MapTriangles[selection.sector].wallCA = texture;
}
}
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);
DrawText("A", (map->MapTriangles[i].a + editorOffset).x, (map->MapTriangles[i].a + editorOffset).y, 5, WHITE);
DrawCircle((map->MapTriangles[i].b + editorOffset).x, (map->MapTriangles[i].b + editorOffset).y, 3, RED);
DrawText("B", (map->MapTriangles[i].b + editorOffset).x, (map->MapTriangles[i].b + editorOffset).y, 5, WHITE);
DrawCircle((map->MapTriangles[i].c + editorOffset).x, (map->MapTriangles[i].c + editorOffset).y, 3, RED);
DrawText("C", (map->MapTriangles[i].c + editorOffset).x, (map->MapTriangles[i].c + editorOffset).y, 5, WHITE);
if(inSelection && selection.sector == i){
if (selection.point == A) DrawCircle((map->MapTriangles[i].a + editorOffset).x, (map->MapTriangles[i].a + editorOffset).y, 5, GREEN);
if (selection.point == B) DrawCircle((map->MapTriangles[i].b + editorOffset).x, (map->MapTriangles[i].b + editorOffset).y, 5, GREEN);
if (selection.point == C) DrawCircle((map->MapTriangles[i].c + editorOffset).x, (map->MapTriangles[i].c + editorOffset).y, 5, GREEN);
if (selection.line == AB) DrawLineEx(map->MapTriangles[i].a + editorOffset, map->MapTriangles[i].b + editorOffset, 4, PURPLE);
if (selection.line == BC) DrawLineEx(map->MapTriangles[i].b + editorOffset, map->MapTriangles[i].c + editorOffset, 4, PURPLE);
if (selection.line == CA) DrawLineEx(map->MapTriangles[i].c + editorOffset, map->MapTriangles[i].a + editorOffset, 4, PURPLE);
}
}
EndDrawing();
}break;
default:
throw std::runtime_error("what the fuck?");
}
}
CloseWindow();
}