diff --git a/.gitignore b/.gitignore index 5756e51..f40e964 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,22 @@ -# Ignore everything -* +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib -# But not these files... -!/.gitignore +# Test binary, built with `go test -c` +*.test -!*.go -!go.sum -!go.mod +# Output of the go coverage tool, specifically when used with LiteIDE +*.out -!README.md -!LICENSE +# Dependency directories (remove the comment below to include it) +# vendor/ -# !Makefile +# Go workspace file +go.work +go.work.sum -# ...even if they are in subdirectories -!*/ +# env file +.env diff --git a/client/Makefile.am b/client/Makefile.am deleted file mode 100644 index d724d78..0000000 --- a/client/Makefile.am +++ /dev/null @@ -1,4 +0,0 @@ -bin_PROGRAMS = roleplay -roleplay_SOURCES = src/main.c -roleplay_LDADD = @RAYLIB_LIBS@ -roleplay_CFLAGS = @RAYLIB_CFLAGS@ diff --git a/client/configure.ac b/client/configure.ac deleted file mode 100644 index e7ae189..0000000 --- a/client/configure.ac +++ /dev/null @@ -1,28 +0,0 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ([2.00]) -AC_INIT([roleplay], [v1.0]) -AC_CONFIG_SRCDIR([src/main.c]) -AC_CONFIG_AUX_DIR([config]) - -# Initialize automake -AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects]) - -# Checks for programs. -AC_PROG_CC - -# Checks for libraries. -PKG_CHECK_MODULES([RAYLIB], [raylib]) -AC_SUBST([RAYLIB_CFLAGS]) -AC_SUBST([RAYLIB_LIBS]) - -# Checks for header files. -AC_CHECK_HEADER([stdint.h]) - -# Checks for typedefs, structures, and compiler characteristics. - -# Checks for library functions. - -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT diff --git a/client/main.go b/client/main.go new file mode 100644 index 0000000..5332d19 --- /dev/null +++ b/client/main.go @@ -0,0 +1,150 @@ +package main + +import ( + "github.com/gen2brain/raylib-go/raylib" +) + +type ClientAuth struct { + +} + +type LoginState int + +const ( + LOGIN_STATE_CREDENTIALS LoginState = iota + LOGIN_STATE_ATTEMPTING + LOGIN_STATE_ERROR +) + +type ButtonState int + +const ( + BUTTON_STATE_IDLE ButtonState = iota + BUTTON_STATE_HOVER + BUTTON_STATE_PRESSED +) + +type ClientState struct { + auth *ClientAuth + login LoginState + login_button ButtonState + ui_scale uint + window_scale rl.Vector2 +} + +const ( + WIDTH uint = 1600 + HEIGHT uint = 1000 +) + +func scale(original rl.Rectangle, ui_scale uint, window_scale rl.Vector2) rl.Rectangle { + return rl.Rectangle{ +X: original.X/window_scale.X, + Y: original.Y/window_scale.Y, + Width: original.Width*float32(ui_scale)/window_scale.X, + Height: original.Height*float32(ui_scale)/window_scale.Y, + } +} + +func center(original rl.Rectangle, off_x, off_y int, window_scale rl.Vector2, width, height uint) rl.Rectangle { + return rl.Rectangle{ + X: (float32(width) /window_scale.X - original.Width )/2 + float32(off_x)/window_scale.X, + Y: (float32(height)/window_scale.Y - original.Height)/2 + float32(off_y)/window_scale.Y, + Width: original.Width, + Height: original.Height, + } +} + +func button(rectangle rl.Rectangle, idle, hover, pressed rl.Color, text string, font_size int32, text_color rl.Color, last_state ButtonState) (action bool, next_state ButtonState) { + over := rl.CheckCollisionPointRec(rl.GetMousePosition(), rectangle) + action = false + next_state = last_state + + if(rl.IsMouseButtonPressed(rl.MouseButtonLeft) && over) { + next_state = BUTTON_STATE_PRESSED + } else if(rl.IsMouseButtonReleased(rl.MouseButtonLeft) && last_state == BUTTON_STATE_PRESSED) { + next_state = BUTTON_STATE_IDLE + if(over) { + action = true + } + } else if(rl.IsMouseButtonUp(rl.MouseButtonLeft)) { + if(last_state == BUTTON_STATE_IDLE && over) { + next_state = BUTTON_STATE_HOVER + } else if (last_state == BUTTON_STATE_HOVER && !over) { + next_state = BUTTON_STATE_IDLE + } + } + + var color rl.Color + switch(next_state) { + case BUTTON_STATE_HOVER: + color = hover + case BUTTON_STATE_PRESSED: + color = pressed + default: + color = idle + } + rl.DrawRectangleRec(rectangle, color) + text_size := rl.MeasureTextEx(rl.GetFontDefault(), text, float32(font_size), 1.0) + rl.DrawText(text, int32(rectangle.X + rectangle.Width/2 - text_size.X/2), int32(rectangle.Y + rectangle.Height/2 - text_size.Y/2), font_size, text_color) + + return action, next_state +} + +func main() { + state := ClientState{ + auth: nil, + login: LOGIN_STATE_CREDENTIALS, + login_button: BUTTON_STATE_IDLE, + ui_scale: 1, + } + + rl.SetConfigFlags(rl.FlagWindowHighdpi) + rl.InitWindow(0, 0, "roleplay") + rl.SetExitKey(0) + rl.SetTargetFPS(60) + + state.window_scale = rl.GetWindowScaleDPI() + rl.SetWindowSize(int(float32(WIDTH)/state.window_scale.X), int(float32(HEIGHT)/state.window_scale.Y)) + + for(rl.WindowShouldClose() == false) { + if(state.auth == nil) { + // Draw login + rl.BeginDrawing() + rl.ClearBackground(rl.White) + + logo_rect := scale(rl.Rectangle{Width: 1200, Height: 300}, state.ui_scale, state.window_scale) + logo_rect = center(logo_rect, 0, -300, state.window_scale, WIDTH, HEIGHT) + rl.DrawRectangleRec(logo_rect, rl.Gray) + + form_rect := scale(rl.Rectangle{Width: 600, Height: 400}, state.ui_scale, state.window_scale) + form_rect = center(form_rect, 0, 150, state.window_scale, WIDTH, HEIGHT) + rl.DrawRectangleRec(form_rect, rl.Gray) + + switch(state.login) { + case LOGIN_STATE_CREDENTIALS: + submit_rect := scale(rl.Rectangle{Width: 100, Height: 50}, state.ui_scale, state.window_scale) + submit_rect = center(submit_rect, 0, 300, state.window_scale, WIDTH, HEIGHT) + var submit_action bool + submit_action, state.login_button = button(submit_rect, rl.Black, rl.Brown, rl.Red, "Submit", 12, rl.White, state.login_button) + if submit_action { + state.login = LOGIN_STATE_ATTEMPTING + } + case LOGIN_STATE_ATTEMPTING: + text := "Logging in..." + text_size := rl.MeasureTextEx(rl.GetFontDefault(), text, 20, 1.0) + text_rect := center(rl.Rectangle{Width: text_size.X, Height: text_size.Y}, 0, 0, state.window_scale, WIDTH, HEIGHT) + rl.DrawText(text, int32(text_rect.X), int32(text_rect.Y), 20, rl.Black) + case LOGIN_STATE_ERROR: + text := "Error: {TODO}" + text_size := rl.MeasureTextEx(rl.GetFontDefault(), text, 20, 1.0) + text_rect := center(rl.Rectangle{Width: text_size.X, Height: text_size.Y}, 0, 0, state.window_scale, WIDTH, HEIGHT) + rl.DrawText(text, int32(text_rect.X), int32(text_rect.Y), 20, rl.Black) + } + + rl.EndDrawing() + } else { + // Draw game + } + } +} diff --git a/client/src/main.c b/client/src/main.c deleted file mode 100644 index b59a3ff..0000000 --- a/client/src/main.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "raylib.h" - -int main() { - InitWindow(800, 600, "roleplay"); - SetTargetFPS(60); - - while(!WindowShouldClose()) { - BeginDrawing(); - ClearBackground(WHITE); - DrawText("Hello, World!", 100, 100, 20, BLACK); - EndDrawing(); - } - - CloseWindow(); -} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..1c3ed55 --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module git.metznet.ca/MetzNet/roleplay + +go 1.23.1 + +require github.com/gen2brain/raylib-go/raylib v0.0.0-20240930075631-c66f9e2942fe + +require ( + github.com/ebitengine/purego v0.7.1 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/sys v0.20.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e6b4a22 --- /dev/null +++ b/go.sum @@ -0,0 +1,8 @@ +github.com/ebitengine/purego v0.7.1 h1:6/55d26lG3o9VCZX8lping+bZcmShseiqlh2bnUDiPA= +github.com/ebitengine/purego v0.7.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= +github.com/gen2brain/raylib-go/raylib v0.0.0-20240930075631-c66f9e2942fe h1:mInjrbJkUglTM7tBmXG+epnPCE744aj15J7vjJwM4gs= +github.com/gen2brain/raylib-go/raylib v0.0.0-20240930075631-c66f9e2942fe/go.mod h1:BaY76bZk7nw1/kVOSQObPY1v1iwVE1KHAGMfvI6oK1Q= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/server/go.mod b/server/go.mod deleted file mode 100644 index c853533..0000000 --- a/server/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module git.metznet.ca/MetzNet/roleplay/server - -go 1.23.1