Browse Source

Add configs to server

Make server optionally have a mountpoint for putting assets.
feature/data-structs
TheoryOfNekomata 2 years ago
parent
commit
508967fcb7
18 changed files with 178 additions and 122 deletions
  1. +5
    -0
      CMakeLists.txt
  2. +2
    -2
      src/packages/game/IZ_app.c
  3. +40
    -0
      src/packages/game/IZ_app.h
  4. +0
    -3
      src/packages/game/IZ_common.h
  5. +5
    -1
      src/packages/game/IZ_config.c
  6. +1
    -1
      src/packages/game/input/IZ_input.c
  7. +4
    -4
      src/packages/game/input/IZ_input.h
  8. +11
    -11
      src/packages/game/input/IZ_joystick.c
  9. +5
    -5
      src/packages/game/input/IZ_joystick.h
  10. +7
    -7
      src/packages/game/input/IZ_keyboard.c
  11. +4
    -4
      src/packages/game/input/IZ_keyboard.h
  12. +10
    -10
      src/packages/game/input/IZ_midi.c
  13. +5
    -5
      src/packages/game/input/IZ_midi.h
  14. +36
    -36
      src/packages/game/input/input.test.c
  15. +2
    -2
      src/packages/game/output/IZ_video.c
  16. +1
    -1
      src/packages/server/IZ_config.c
  17. +32
    -25
      src/packages/server/network/IZ_wsserver.c
  18. +8
    -5
      src/packages/server/network/IZ_wsserver.h

+ 5
- 0
CMakeLists.txt View File

@@ -13,6 +13,11 @@ if (WIN32)
endif () endif ()
endif () endif ()


add_definitions(-DIZ_APP_NAME="Izanagi" -DIZ_PLAYERS=1)
if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
add_definitions(-DIZ_DEBUG)
endif()

include_directories( include_directories(
"${PROJECT_SOURCE_DIR}/dependencies/SDL2/include" "${PROJECT_SOURCE_DIR}/dependencies/SDL2/include"
"${PROJECT_SOURCE_DIR}/dependencies/minIni/dev" "${PROJECT_SOURCE_DIR}/dependencies/minIni/dev"


+ 2
- 2
src/packages/game/IZ_app.c View File

@@ -140,7 +140,7 @@ void IZ_AppHandlePortMIDIEvents(IZ_App* app) {
u8 player_index; u8 player_index;
i32* midi_events_count; i32* midi_events_count;
u32 midi_event_index; u32 midi_event_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
if (!app->input_state.midi_input_state[player_index].device_info) { if (!app->input_state.midi_input_state[player_index].device_info) {
continue; continue;
} }
@@ -385,7 +385,7 @@ IZ_ProcedureResult IZ_WSClientWritable(struct lws* wsi) {
} }


IZ_WebsocketMessage* IZ_WSClientCreateMessage(struct lws* wsi, bool binary, void* in, size_t len) { IZ_WebsocketMessage* IZ_WSClientCreateMessage(struct lws* wsi, bool binary, void* in, size_t len) {
IZ_WebsocketMessage amsg;
static IZ_WebsocketMessage amsg;
amsg.first = (char)lws_is_first_fragment(wsi); amsg.first = (char)lws_is_first_fragment(wsi);
amsg.final = (char)lws_is_final_fragment(wsi); amsg.final = (char)lws_is_final_fragment(wsi);
amsg.binary = binary; amsg.binary = binary;


+ 40
- 0
src/packages/game/IZ_app.h View File

@@ -27,6 +27,46 @@ typedef struct {
u64 ticks; u64 ticks;
} IZ_App; } IZ_App;


typedef struct {
u8 player_index: 3;
u8 player_state: 5;
u16 action_set;
} IZ_AppPlayerActionSyncMessage;

typedef struct {
u8 player_index: 3;
f32 x;
f32 y;
f32 right;
f32 up;
} IZ_AppPlayerState;

typedef enum {
IZ_MESSAGE_KIND_ACTION_SYNC = 0,
IZ_MESSAGE_KIND_STATE_SYNC = 1,
} IZ_MessageKind;

typedef struct {
u8 message_kind; // player
u64 client_elapsed_time; // for synchronization
} IZ_AppMessageHeader;

typedef struct {
u8 player_actions_count;
IZ_AppPlayerActionSyncMessage player_actions[];
} IZ_AppPlayerActionSection;

typedef struct {
IZ_AppMessageHeader header;
IZ_AppPlayerActionSection player_actions;
} IZ_AppActionSyncMessage;

typedef struct {
IZ_AppMessageHeader header;
IZ_AppPlayerState player_state[IZ_PLAYERS];
IZ_AppPlayerActionSection player_actions;
} IZ_AppStateSyncMessage;

IZ_ProcedureResult IZ_AppRun(IZ_App*, u8, const char**); IZ_ProcedureResult IZ_AppRun(IZ_App*, u8, const char**);


#endif #endif

+ 0
- 3
src/packages/game/IZ_common.h View File

@@ -4,9 +4,6 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>


#define PLAYERS (unsigned char) 1
#define APP_NAME "SDL2"

typedef uint8_t u8; typedef uint8_t u8;
typedef uint16_t u16; typedef uint16_t u16;
typedef uint32_t u32; typedef uint32_t u32;


+ 5
- 1
src/packages/game/IZ_config.c View File

@@ -1,8 +1,12 @@
#include "IZ_config.h" #include "IZ_config.h"


void IZ_ConfigGetDefaultPath(const char* config_path, size_t string_size) { void IZ_ConfigGetDefaultPath(const char* config_path, size_t string_size) {
//const char* config_path_dir = SDL_GetPrefPath("Modal Studios", APP_NAME);
#ifdef IZ_DEBUG
const char* config_path_dir = SDL_GetBasePath(); const char* config_path_dir = SDL_GetBasePath();
#else
const char* config_path_dir = SDL_GetPrefPath("Modal Studios", IZ_APP_NAME);
#endif

memcpy_s(config_path, string_size, config_path_dir, 128); memcpy_s(config_path, string_size, config_path_dir, 128);
strcat_s(config_path, string_size, "config-game.ini"); strcat_s(config_path, string_size, "config-game.ini");
} }


+ 1
- 1
src/packages/game/input/IZ_input.c View File

@@ -32,7 +32,7 @@ IZ_ProcedureResult IZ_InputInitialize(IZ_InputState* state, const char* config_p
} }


u8 player_index; u8 player_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
state->action[player_index] = 0; state->action[player_index] = 0;
} }




+ 4
- 4
src/packages/game/input/IZ_input.h View File

@@ -7,10 +7,10 @@
#include "IZ_midi.h" #include "IZ_midi.h"


typedef struct { typedef struct {
IZ_Action action[PLAYERS];
IZ_KeyboardState keyboard_state[PLAYERS];
IZ_JoystickState joystick_state[PLAYERS];
IZ_MIDIInputState midi_input_state[PLAYERS];
IZ_Action action[IZ_PLAYERS];
IZ_KeyboardState keyboard_state[IZ_PLAYERS];
IZ_JoystickState joystick_state[IZ_PLAYERS];
IZ_MIDIInputState midi_input_state[IZ_PLAYERS];
} IZ_InputState; } IZ_InputState;


void IZ_InputHandleSDLEvents(IZ_InputState*, SDL_Event); void IZ_InputHandleSDLEvents(IZ_InputState*, SDL_Event);


+ 11
- 11
src/packages/game/input/IZ_joystick.c View File

@@ -2,7 +2,7 @@


void IZ_JoystickHandleDeviceEvents(IZ_JoystickState* state, SDL_Event e) { void IZ_JoystickHandleDeviceEvents(IZ_JoystickState* state, SDL_Event e) {
if (e.type == SDL_JOYDEVICEADDED) { if (e.type == SDL_JOYDEVICEADDED) {
if (SDL_NumJoysticks() <= PLAYERS && !state->device) {
if (SDL_NumJoysticks() <= IZ_PLAYERS && !state->device) {
state->device = SDL_JoystickOpen(e.jdevice.which); state->device = SDL_JoystickOpen(e.jdevice.which);
} }
return; return;
@@ -83,9 +83,9 @@ void IZ_JoystickHandleButtonEvents(IZ_JoystickState* state, IZ_Action* action, S
} }
} }


void IZ_JoystickHandleEvents(IZ_JoystickState(* state)[PLAYERS], IZ_Action(* action)[PLAYERS], SDL_Event e) {
void IZ_JoystickHandleEvents(IZ_JoystickState(* state)[IZ_PLAYERS], IZ_Action(* action)[IZ_PLAYERS], SDL_Event e) {
u8 player_index; u8 player_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
IZ_JoystickHandleDeviceEvents(&(*state)[player_index], e); IZ_JoystickHandleDeviceEvents(&(*state)[player_index], e);
IZ_JoystickHandleAxisEvents(&(*state)[player_index], &(*action)[player_index], e); IZ_JoystickHandleAxisEvents(&(*state)[player_index], &(*action)[player_index], e);
IZ_JoystickHandleHatEvents(&(*action)[player_index], e); IZ_JoystickHandleHatEvents(&(*action)[player_index], e);
@@ -93,13 +93,13 @@ void IZ_JoystickHandleEvents(IZ_JoystickState(* state)[PLAYERS], IZ_Action(* act
} }
} }


void IZ_JoystickLoadConfig(IZ_JoystickState(* state)[PLAYERS], const char* config_path) {
void IZ_JoystickLoadConfig(IZ_JoystickState(* state)[IZ_PLAYERS], const char* config_path) {
char control_mapping_section_name[26]; char control_mapping_section_name[26];
char main_section_name[11]; char main_section_name[11];


u8 player_index; u8 player_index;
u8 control_index; u8 control_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
sprintf_s(control_mapping_section_name, 26, "Joystick.%d.ControlMapping", player_index); sprintf_s(control_mapping_section_name, 26, "Joystick.%d.ControlMapping", player_index);


for (control_index = 4; control_index < CONTROLS; control_index += 1) { for (control_index = 4; control_index < CONTROLS; control_index += 1) {
@@ -117,7 +117,7 @@ void IZ_JoystickLoadConfig(IZ_JoystickState(* state)[PLAYERS], const char* confi
} }
} }


IZ_ProcedureResult IZ_JoystickSaveConfig(IZ_JoystickState(* state)[PLAYERS], const char* config_path) {
IZ_ProcedureResult IZ_JoystickSaveConfig(IZ_JoystickState(* state)[IZ_PLAYERS], const char* config_path) {
u8 problem = 0; u8 problem = 0;


char control_mapping_section_name[26]; char control_mapping_section_name[26];
@@ -125,7 +125,7 @@ IZ_ProcedureResult IZ_JoystickSaveConfig(IZ_JoystickState(* state)[PLAYERS], con


u8 player_index; u8 player_index;
u8 control_index; u8 control_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
sprintf_s(control_mapping_section_name, 26, "Joystick.%d.ControlMapping", player_index); sprintf_s(control_mapping_section_name, 26, "Joystick.%d.ControlMapping", player_index);
for (control_index = 4; control_index < CONTROLS; control_index += 1) { for (control_index = 4; control_index < CONTROLS; control_index += 1) {
if (!ini_putl( if (!ini_putl(
@@ -161,7 +161,7 @@ IZ_ProcedureResult IZ_JoystickSaveConfig(IZ_JoystickState(* state)[PLAYERS], con
return -problem; return -problem;
} }


IZ_ProcedureResult IZ_JoystickInitialize(IZ_JoystickState(* state)[PLAYERS], const char* config_path, u8 argc, const char* argv[]) {
IZ_ProcedureResult IZ_JoystickInitialize(IZ_JoystickState(* state)[IZ_PLAYERS], const char* config_path, u8 argc, const char* argv[]) {
SDL_memcpy(state, &IZ_DEFAULT_JOYSTICK_STATE, sizeof(IZ_JoystickState)); SDL_memcpy(state, &IZ_DEFAULT_JOYSTICK_STATE, sizeof(IZ_JoystickState));


IZ_JoystickLoadConfig(state, config_path); IZ_JoystickLoadConfig(state, config_path);
@@ -172,7 +172,7 @@ IZ_ProcedureResult IZ_JoystickInitialize(IZ_JoystickState(* state)[PLAYERS], con
u8 joysticks_count = SDL_NumJoysticks(); u8 joysticks_count = SDL_NumJoysticks();
u8 player_index; u8 player_index;
for (player_index = 0; player_index < joysticks_count; player_index += 1) { for (player_index = 0; player_index < joysticks_count; player_index += 1) {
if (player_index >= PLAYERS) {
if (player_index >= IZ_PLAYERS) {
break; break;
} }
(*state)[player_index].device = SDL_JoystickOpen(state[player_index]->config.device_id); (*state)[player_index].device = SDL_JoystickOpen(state[player_index]->config.device_id);
@@ -181,9 +181,9 @@ IZ_ProcedureResult IZ_JoystickInitialize(IZ_JoystickState(* state)[PLAYERS], con
return 0; return 0;
} }


void IZ_JoystickTeardown(IZ_JoystickState(* state)[PLAYERS]) {
void IZ_JoystickTeardown(IZ_JoystickState(* state)[IZ_PLAYERS]) {
u8 player_index; u8 player_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
if (!(*state)[player_index].device) { if (!(*state)[player_index].device) {
continue; continue;
} }


+ 5
- 5
src/packages/game/input/IZ_joystick.h View File

@@ -29,7 +29,7 @@ typedef struct {
IZ_JoystickConfig config; IZ_JoystickConfig config;
} IZ_JoystickState; } IZ_JoystickState;


static const IZ_JoystickState IZ_DEFAULT_JOYSTICK_STATE[PLAYERS] = {
static const IZ_JoystickState IZ_DEFAULT_JOYSTICK_STATE[IZ_PLAYERS] = {
{ {
.config = { .config = {
.control_mapping = { .control_mapping = {
@@ -82,12 +82,12 @@ static const IZ_JoystickState IZ_DEFAULT_JOYSTICK_STATE[PLAYERS] = {
}, },
}; };


IZ_ProcedureResult IZ_JoystickSaveConfig(IZ_JoystickState(*)[PLAYERS], const char*);
IZ_ProcedureResult IZ_JoystickSaveConfig(IZ_JoystickState(*)[IZ_PLAYERS], const char*);


void IZ_JoystickHandleEvents(IZ_JoystickState(*)[PLAYERS], IZ_Action(*)[PLAYERS], SDL_Event);
void IZ_JoystickHandleEvents(IZ_JoystickState(*)[IZ_PLAYERS], IZ_Action(*)[IZ_PLAYERS], SDL_Event);


IZ_ProcedureResult IZ_JoystickInitialize(IZ_JoystickState(*)[PLAYERS], const char*, u8, const char**);
IZ_ProcedureResult IZ_JoystickInitialize(IZ_JoystickState(*)[IZ_PLAYERS], const char*, u8, const char**);


void IZ_JoystickTeardown(IZ_JoystickState(*)[PLAYERS]);
void IZ_JoystickTeardown(IZ_JoystickState(*)[IZ_PLAYERS]);


#endif #endif

+ 7
- 7
src/packages/game/input/IZ_keyboard.c View File

@@ -17,19 +17,19 @@ void IZ_KeyboardHandleKeyUpDownEvents(IZ_KeyboardState* state, IZ_Action* action
} }
} }


void IZ_KeyboardHandleEvents(IZ_KeyboardState(* state)[PLAYERS], IZ_Action(* action)[PLAYERS], SDL_Event e) {
for (u8 player_index = 0; player_index < PLAYERS; player_index += 1) {
void IZ_KeyboardHandleEvents(IZ_KeyboardState(* state)[IZ_PLAYERS], IZ_Action(* action)[IZ_PLAYERS], SDL_Event e) {
for (u8 player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
IZ_KeyboardHandleKeyUpDownEvents(&(*state)[player_index], &(*action)[player_index], e); IZ_KeyboardHandleKeyUpDownEvents(&(*state)[player_index], &(*action)[player_index], e);
} }
} }


IZ_ProcedureResult IZ_KeyboardSaveConfig(IZ_KeyboardState(* state)[PLAYERS], const char* config_path) {
IZ_ProcedureResult IZ_KeyboardSaveConfig(IZ_KeyboardState(* state)[IZ_PLAYERS], const char* config_path) {
u8 problem = 0; u8 problem = 0;
char control_mapping_section_name[26]; char control_mapping_section_name[26];


u8 player_index; u8 player_index;
u8 control_index; u8 control_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
sprintf_s(control_mapping_section_name, 26, "Keyboard.%d.ControlMapping", player_index); sprintf_s(control_mapping_section_name, 26, "Keyboard.%d.ControlMapping", player_index);
for (control_index = 0; control_index < CONTROLS; control_index += 1) { for (control_index = 0; control_index < CONTROLS; control_index += 1) {
if (!ini_puts( if (!ini_puts(
@@ -46,13 +46,13 @@ IZ_ProcedureResult IZ_KeyboardSaveConfig(IZ_KeyboardState(* state)[PLAYERS], con
return problem; return problem;
} }


void IZ_KeyboardLoadConfig(IZ_KeyboardState(* state)[PLAYERS], const char* config_path) {
void IZ_KeyboardLoadConfig(IZ_KeyboardState(* state)[IZ_PLAYERS], const char* config_path) {
char buffer[128]; char buffer[128];
char keyboard_section_name[26]; char keyboard_section_name[26];


u8 player_index; u8 player_index;
u8 control_index; u8 control_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
sprintf_s(keyboard_section_name, 26, "Keyboard.%d.ControlMapping", player_index); sprintf_s(keyboard_section_name, 26, "Keyboard.%d.ControlMapping", player_index);
for (control_index = 0; control_index < CONTROLS; control_index += 1) { for (control_index = 0; control_index < CONTROLS; control_index += 1) {
ini_gets( ini_gets(
@@ -69,7 +69,7 @@ void IZ_KeyboardLoadConfig(IZ_KeyboardState(* state)[PLAYERS], const char* confi
} }
} }


IZ_ProcedureResult IZ_KeyboardInitialize(IZ_KeyboardState(* state)[PLAYERS], const char* config_path, u8 argc, const char* argv[]) {
IZ_ProcedureResult IZ_KeyboardInitialize(IZ_KeyboardState(* state)[IZ_PLAYERS], const char* config_path, u8 argc, const char* argv[]) {
SDL_memcpy(state, &IZ_DEFAULT_KEYBOARD_STATE, sizeof(IZ_KeyboardState)); SDL_memcpy(state, &IZ_DEFAULT_KEYBOARD_STATE, sizeof(IZ_KeyboardState));
IZ_KeyboardLoadConfig(state, config_path); IZ_KeyboardLoadConfig(state, config_path);
return IZ_KeyboardSaveConfig(state, config_path); return IZ_KeyboardSaveConfig(state, config_path);


+ 4
- 4
src/packages/game/input/IZ_keyboard.h View File

@@ -15,7 +15,7 @@ typedef struct {
IZ_KeyboardConfig config; IZ_KeyboardConfig config;
} IZ_KeyboardState; } IZ_KeyboardState;


static const IZ_KeyboardState IZ_DEFAULT_KEYBOARD_STATE[PLAYERS] = {
static const IZ_KeyboardState IZ_DEFAULT_KEYBOARD_STATE[IZ_PLAYERS] = {
{ {
.config = { .config = {
.control_mapping = { .control_mapping = {
@@ -62,10 +62,10 @@ static const IZ_KeyboardState IZ_DEFAULT_KEYBOARD_STATE[PLAYERS] = {
}, },
}; };


IZ_ProcedureResult IZ_KeyboardSaveConfig(IZ_KeyboardState(*)[PLAYERS], const char*);
IZ_ProcedureResult IZ_KeyboardSaveConfig(IZ_KeyboardState(*)[IZ_PLAYERS], const char*);


void IZ_KeyboardHandleEvents(IZ_KeyboardState(*)[PLAYERS], IZ_Action(*)[PLAYERS], SDL_Event);
void IZ_KeyboardHandleEvents(IZ_KeyboardState(*)[IZ_PLAYERS], IZ_Action(*)[IZ_PLAYERS], SDL_Event);


IZ_ProcedureResult IZ_KeyboardInitialize(IZ_KeyboardState(*)[PLAYERS], const char*, u8, const char**);
IZ_ProcedureResult IZ_KeyboardInitialize(IZ_KeyboardState(*)[IZ_PLAYERS], const char*, u8, const char**);


#endif #endif

+ 10
- 10
src/packages/game/input/IZ_midi.c View File

@@ -29,14 +29,14 @@ void IZ_MIDIInputHandleNoteOnOffEvents(IZ_MIDIInputState* state, IZ_Action* acti
} }
} }


void IZ_MIDIInputHandleEvents(IZ_MIDIInputState(* state)[PLAYERS], IZ_Action(* action)[PLAYERS], PmEvent e) {
void IZ_MIDIInputHandleEvents(IZ_MIDIInputState(* state)[IZ_PLAYERS], IZ_Action(* action)[IZ_PLAYERS], PmEvent e) {
u8 player_index; u8 player_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
IZ_MIDIInputHandleNoteOnOffEvents(&(*state)[player_index], &(*action)[player_index], e); IZ_MIDIInputHandleNoteOnOffEvents(&(*state)[player_index], &(*action)[player_index], e);
} }
} }


IZ_ProcedureResult IZ_MIDIInputSaveConfig(IZ_MIDIInputState(* state)[PLAYERS], const char* config_path) {
IZ_ProcedureResult IZ_MIDIInputSaveConfig(IZ_MIDIInputState(* state)[IZ_PLAYERS], const char* config_path) {
u8 problem = 0; u8 problem = 0;


char control_mapping_section_name[27]; char control_mapping_section_name[27];
@@ -44,7 +44,7 @@ IZ_ProcedureResult IZ_MIDIInputSaveConfig(IZ_MIDIInputState(* state)[PLAYERS], c


u8 player_index; u8 player_index;
u8 control_index; u8 control_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
sprintf_s(control_mapping_section_name, 27, "MIDIInput.%d.ControlMapping", player_index); sprintf_s(control_mapping_section_name, 27, "MIDIInput.%d.ControlMapping", player_index);
for (control_index = 0; control_index < CONTROLS; control_index += 1) { for (control_index = 0; control_index < CONTROLS; control_index += 1) {
if (!ini_puts( if (!ini_puts(
@@ -80,14 +80,14 @@ IZ_ProcedureResult IZ_MIDIInputSaveConfig(IZ_MIDIInputState(* state)[PLAYERS], c
return problem; return problem;
} }


void IZ_MIDIInputLoadConfig(IZ_MIDIInputState(* state)[PLAYERS], const char* config_path) {
void IZ_MIDIInputLoadConfig(IZ_MIDIInputState(* state)[IZ_PLAYERS], const char* config_path) {
char buffer[128]; char buffer[128];
char control_mapping_section_name[27]; char control_mapping_section_name[27];
char main_section_name[12]; char main_section_name[12];


u8 player_index; u8 player_index;
u8 control_index; u8 control_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
sprintf_s(control_mapping_section_name, 27, "MIDIInput.%d.ControlMapping", player_index); sprintf_s(control_mapping_section_name, 27, "MIDIInput.%d.ControlMapping", player_index);
for (control_index = 0; control_index < CONTROLS; control_index += 1) { for (control_index = 0; control_index < CONTROLS; control_index += 1) {
ini_gets( ini_gets(
@@ -108,7 +108,7 @@ void IZ_MIDIInputLoadConfig(IZ_MIDIInputState(* state)[PLAYERS], const char* con
} }
} }


IZ_ProcedureResult IZ_MIDIInputInitialize(IZ_MIDIInputState(* state)[PLAYERS], const char* config_path, u8 argc, const char* argv[]) {
IZ_ProcedureResult IZ_MIDIInputInitialize(IZ_MIDIInputState(* state)[IZ_PLAYERS], const char* config_path, u8 argc, const char* argv[]) {
if (Pm_Initialize()) { if (Pm_Initialize()) {
return 1; return 1;
} }
@@ -133,7 +133,7 @@ IZ_ProcedureResult IZ_MIDIInputInitialize(IZ_MIDIInputState(* state)[PLAYERS], c
} }


for (player_index = 0; player_index < input_midi_devices_count; player_index += 1) { for (player_index = 0; player_index < input_midi_devices_count; player_index += 1) {
if (player_index >= PLAYERS) {
if (player_index >= IZ_PLAYERS) {
break; break;
} }
(*state)[player_index].device_info = Pm_GetDeviceInfo((*state)[player_index].config.device_id); (*state)[player_index].device_info = Pm_GetDeviceInfo((*state)[player_index].config.device_id);
@@ -151,9 +151,9 @@ IZ_ProcedureResult IZ_MIDIInputInitialize(IZ_MIDIInputState(* state)[PLAYERS], c
return 0; return 0;
} }


void IZ_MIDIInputTeardown(IZ_MIDIInputState(* state)[PLAYERS]) {
void IZ_MIDIInputTeardown(IZ_MIDIInputState(* state)[IZ_PLAYERS]) {
u8 player_index; u8 player_index;
for (player_index = 0; player_index < PLAYERS; player_index += 1) {
for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
if (!(*state)[player_index].stream) { if (!(*state)[player_index].stream) {
continue; continue;
} }


+ 5
- 5
src/packages/game/input/IZ_midi.h View File

@@ -35,7 +35,7 @@ typedef struct {
i32 midi_events_count; i32 midi_events_count;
} IZ_MIDIInputState; } IZ_MIDIInputState;


static const IZ_MIDIInputState IZ_DEFAULT_MIDI_INPUT_STATE[PLAYERS] = {
static const IZ_MIDIInputState IZ_DEFAULT_MIDI_INPUT_STATE[IZ_PLAYERS] = {
{ {
.config = { .config = {
.control_mapping = { .control_mapping = {
@@ -92,12 +92,12 @@ static const IZ_MIDIInputState IZ_DEFAULT_MIDI_INPUT_STATE[PLAYERS] = {
}, },
}; };


IZ_ProcedureResult IZ_MIDIInputSaveConfig(IZ_MIDIInputState(*)[PLAYERS], const char*);
IZ_ProcedureResult IZ_MIDIInputSaveConfig(IZ_MIDIInputState(*)[IZ_PLAYERS], const char*);


void IZ_MIDIInputHandleEvents(IZ_MIDIInputState(*)[PLAYERS], IZ_Action(*)[PLAYERS], PmEvent);
void IZ_MIDIInputHandleEvents(IZ_MIDIInputState(*)[IZ_PLAYERS], IZ_Action(*)[IZ_PLAYERS], PmEvent);


IZ_ProcedureResult IZ_MIDIInputInitialize(IZ_MIDIInputState(*)[PLAYERS], const char*, u8, const char**);
IZ_ProcedureResult IZ_MIDIInputInitialize(IZ_MIDIInputState(*)[IZ_PLAYERS], const char*, u8, const char**);


void IZ_MIDIInputTeardown(IZ_MIDIInputState(*)[PLAYERS]);
void IZ_MIDIInputTeardown(IZ_MIDIInputState(*)[IZ_PLAYERS]);


#endif #endif

+ 36
- 36
src/packages/game/input/input.test.c View File

@@ -18,7 +18,7 @@ i16 GenerateAxisValueOutsideThreshold(u16 threshold) {
spec("input") { spec("input") {
describe("joystick") { describe("joystick") {
describe("Initialize") { describe("Initialize") {
static IZ_JoystickState state[PLAYERS];
static IZ_JoystickState state[IZ_PLAYERS];


after_each() { after_each() {
mock_reset(SDL_memcpy); mock_reset(SDL_memcpy);
@@ -48,7 +48,7 @@ spec("input") {
} }


it("calls load method") { it("calls load method") {
mock_set_expected_calls(ini_getl, ((CONTROLS - 4) + 2) * PLAYERS);
mock_set_expected_calls(ini_getl, ((CONTROLS - 4) + 2) * IZ_PLAYERS);


IZ_JoystickInitialize(&state, "config.ini", 0, NULL); IZ_JoystickInitialize(&state, "config.ini", 0, NULL);


@@ -61,7 +61,7 @@ spec("input") {
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_putl, ((CONTROLS - 4) + 2) * PLAYERS);
mock_set_expected_calls(ini_putl, ((CONTROLS - 4) + 2) * IZ_PLAYERS);


IZ_JoystickInitialize(&state, "config.ini", 0, NULL); IZ_JoystickInitialize(&state, "config.ini", 0, NULL);


@@ -89,11 +89,11 @@ spec("input") {


describe("HandleEvents") { describe("HandleEvents") {
static SDL_Event e; static SDL_Event e;
static IZ_JoystickState state[PLAYERS] = {};
static IZ_Action action[PLAYERS] = {};
static IZ_JoystickState state[IZ_PLAYERS] = {};
static IZ_Action action[IZ_PLAYERS] = {};


u8 p; u8 p;
for (p = 0; p < PLAYERS; p += 1) {
for (p = 0; p < IZ_PLAYERS; p += 1) {
describe("on player %u", p) { describe("on player %u", p) {
describe("on axis motion events") { describe("on axis motion events") {
before_each() { before_each() {
@@ -334,14 +334,14 @@ spec("input") {
} }


describe("SaveConfig") { describe("SaveConfig") {
static IZ_JoystickState state[PLAYERS];
static IZ_JoystickState state[IZ_PLAYERS];


after_each() { after_each() {
mock_reset(ini_putl); mock_reset(ini_putl);
} }


before_each() { before_each() {
for (u8 p = 0; p < PLAYERS; p += 1) {
for (u8 p = 0; p < IZ_PLAYERS; p += 1) {
for (u8 i = 0; i < CONTROLS; i += 1) { for (u8 i = 0; i < CONTROLS; i += 1) {
state[p].config.control_mapping[i] = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i]; state[p].config.control_mapping[i] = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i];
} }
@@ -349,7 +349,7 @@ spec("input") {
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_putl, ((CONTROLS - 4) + 2) * PLAYERS);
mock_set_expected_calls(ini_putl, ((CONTROLS - 4) + 2) * IZ_PLAYERS);


IZ_JoystickSaveConfig(&state, "config.ini"); IZ_JoystickSaveConfig(&state, "config.ini");


@@ -364,10 +364,10 @@ spec("input") {


describe("Teardown") { describe("Teardown") {
static SDL_Joystick device; static SDL_Joystick device;
static IZ_JoystickState state[PLAYERS] = {};
static IZ_JoystickState state[IZ_PLAYERS] = {};


before_each() { before_each() {
for (u8 p = 0; p < PLAYERS; p += 1) {
for (u8 p = 0; p < IZ_PLAYERS; p += 1) {
state[p].device = &device; state[p].device = &device;
} }
} }
@@ -377,7 +377,7 @@ spec("input") {
} }


it("closes opened devices") { it("closes opened devices") {
mock_set_expected_calls(SDL_JoystickClose, PLAYERS);
mock_set_expected_calls(SDL_JoystickClose, IZ_PLAYERS);


IZ_JoystickTeardown(&state); IZ_JoystickTeardown(&state);


@@ -393,7 +393,7 @@ spec("input") {


describe("keyboard") { describe("keyboard") {
describe("Initialize") { describe("Initialize") {
static IZ_KeyboardState state[PLAYERS] = {};
static IZ_KeyboardState state[IZ_PLAYERS] = {};


after_each() { after_each() {
mock_reset(SDL_memcpy); mock_reset(SDL_memcpy);
@@ -408,7 +408,7 @@ spec("input") {
} }


before_each() { before_each() {
for (u8 p = 0; p < PLAYERS; p += 1) {
for (u8 p = 0; p < IZ_PLAYERS; p += 1) {
for (u8 i = 0; i < CONTROLS; i += 1) { for (u8 i = 0; i < CONTROLS; i += 1) {
state[p].config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; state[p].config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i];
} }
@@ -422,7 +422,7 @@ spec("input") {
} }


it("calls load method") { it("calls load method") {
mock_set_expected_calls(ini_gets, CONTROLS * PLAYERS);
mock_set_expected_calls(ini_gets, CONTROLS * IZ_PLAYERS);


IZ_KeyboardInitialize(&state, "config.ini", 0, NULL); IZ_KeyboardInitialize(&state, "config.ini", 0, NULL);


@@ -435,7 +435,7 @@ spec("input") {
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_puts, CONTROLS * PLAYERS);
mock_set_expected_calls(ini_puts, CONTROLS * IZ_PLAYERS);


IZ_KeyboardInitialize(&state, "config.ini", 0, NULL); IZ_KeyboardInitialize(&state, "config.ini", 0, NULL);


@@ -450,10 +450,10 @@ spec("input") {


describe("HandleEvents") { describe("HandleEvents") {
static SDL_Event e; static SDL_Event e;
static IZ_KeyboardState state[PLAYERS] = {};
static IZ_Action action[PLAYERS] = {};
static IZ_KeyboardState state[IZ_PLAYERS] = {};
static IZ_Action action[IZ_PLAYERS] = {};


for (u8 p = 0; p < PLAYERS; p += 1) {
for (u8 p = 0; p < IZ_PLAYERS; p += 1) {
describe("on player %u", p) { describe("on player %u", p) {
for (u8 i = 0; i < CONTROLS; i += 1) { for (u8 i = 0; i < CONTROLS; i += 1) {
it("handles %s action activation", ACTION_NAMES[i]) { it("handles %s action activation", ACTION_NAMES[i]) {
@@ -487,14 +487,14 @@ spec("input") {
} }


describe("SaveConfig") { describe("SaveConfig") {
static IZ_KeyboardState state[PLAYERS] = {};
static IZ_KeyboardState state[IZ_PLAYERS] = {};


after_each() { after_each() {
mock_reset(ini_puts); mock_reset(ini_puts);
} }


before_each() { before_each() {
for (u8 p = 0; p < PLAYERS; p += 1) {
for (u8 p = 0; p < IZ_PLAYERS; p += 1) {
for (u8 i = 0; i < CONTROLS; i += 1) { for (u8 i = 0; i < CONTROLS; i += 1) {
state[p].config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; state[p].config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i];
} }
@@ -502,7 +502,7 @@ spec("input") {
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_puts, CONTROLS * PLAYERS);
mock_set_expected_calls(ini_puts, CONTROLS * IZ_PLAYERS);


IZ_KeyboardSaveConfig("config.ini", &state); IZ_KeyboardSaveConfig("config.ini", &state);


@@ -518,7 +518,7 @@ spec("input") {


describe("midi") { describe("midi") {
describe("Initialize") { describe("Initialize") {
static IZ_MIDIInputState state[PLAYERS];
static IZ_MIDIInputState state[IZ_PLAYERS];


after_each() { after_each() {
mock_reset(SDL_memcpy); mock_reset(SDL_memcpy);
@@ -556,8 +556,8 @@ spec("input") {
} }


it("calls load method") { it("calls load method") {
mock_set_expected_calls(ini_gets, CONTROLS * PLAYERS);
mock_set_expected_calls(ini_getl, 2 * PLAYERS);
mock_set_expected_calls(ini_gets, CONTROLS * IZ_PLAYERS);
mock_set_expected_calls(ini_getl, 2 * IZ_PLAYERS);


IZ_MIDIInputInitialize(&state, "config.ini", 0, NULL); IZ_MIDIInputInitialize(&state, "config.ini", 0, NULL);


@@ -577,8 +577,8 @@ spec("input") {
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_puts, CONTROLS * PLAYERS);
mock_set_expected_calls(ini_putl, 2 * PLAYERS);
mock_set_expected_calls(ini_puts, CONTROLS * IZ_PLAYERS);
mock_set_expected_calls(ini_putl, 2 * IZ_PLAYERS);


IZ_MIDIInputInitialize(&state, "config.ini", 0, NULL); IZ_MIDIInputInitialize(&state, "config.ini", 0, NULL);


@@ -612,7 +612,7 @@ spec("input") {
} }


describe("SaveConfig") { describe("SaveConfig") {
static IZ_MIDIInputState state[PLAYERS];
static IZ_MIDIInputState state[IZ_PLAYERS];


after_each() { after_each() {
mock_reset(ini_puts); mock_reset(ini_puts);
@@ -623,8 +623,8 @@ spec("input") {
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_puts, CONTROLS * PLAYERS);
mock_set_expected_calls(ini_putl, 2 * PLAYERS);
mock_set_expected_calls(ini_puts, CONTROLS * IZ_PLAYERS);
mock_set_expected_calls(ini_putl, 2 * IZ_PLAYERS);


IZ_MIDIInputSaveConfig("config.ini", &state); IZ_MIDIInputSaveConfig("config.ini", &state);


@@ -646,10 +646,10 @@ spec("input") {


describe("HandleEvents") { describe("HandleEvents") {
static PmEvent e; static PmEvent e;
static IZ_MIDIInputState state[PLAYERS] = {};
static IZ_Action action[PLAYERS] = {};
static IZ_MIDIInputState state[IZ_PLAYERS] = {};
static IZ_Action action[IZ_PLAYERS] = {};


for (u8 p = 0; p < PLAYERS; p += 1) {
for (u8 p = 0; p < IZ_PLAYERS; p += 1) {
describe("on player %u", p) { describe("on player %u", p) {
for (u8 i = 0; i < CONTROLS; i += 1) { for (u8 i = 0; i < CONTROLS; i += 1) {
it("handles %s action activation", ACTION_NAMES[i]) { it("handles %s action activation", ACTION_NAMES[i]) {
@@ -682,10 +682,10 @@ spec("input") {


describe("Teardown") { describe("Teardown") {
static PmStream* stream; static PmStream* stream;
static IZ_MIDIInputState state[PLAYERS] = {};
static IZ_MIDIInputState state[IZ_PLAYERS] = {};


before_each() { before_each() {
for (u8 p = 0; p < PLAYERS; p += 1) {
for (u8 p = 0; p < IZ_PLAYERS; p += 1) {
state[p].stream = &stream; state[p].stream = &stream;
} }
} }
@@ -695,7 +695,7 @@ spec("input") {
} }


it("closes opened devices") { it("closes opened devices") {
mock_set_expected_calls(Pm_Close, PLAYERS);
mock_set_expected_calls(Pm_Close, IZ_PLAYERS);


IZ_MIDIInputTeardown(&state); IZ_MIDIInputTeardown(&state);




+ 2
- 2
src/packages/game/output/IZ_video.c View File

@@ -38,7 +38,7 @@ IZ_ProcedureResult IZ_VideoInitialize(IZ_VideoState* state, const char* config_p
state->last_update_at = 0u; state->last_update_at = 0u;


SDL_Window* window = SDL_CreateWindow( SDL_Window* window = SDL_CreateWindow(
APP_NAME,
IZ_APP_NAME,
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
state->config.width, state->config.width,
@@ -87,7 +87,7 @@ void IZ_VideoUpdateForDebugInput(IZ_VideoState* video_state, IZ_InputState* inpu


u8 p; u8 p;
u8 i; u8 i;
for (p = 0; p < PLAYERS; p += 1) {
for (p = 0; p < IZ_PLAYERS; p += 1) {
IZ_Action the_action = input_state->action[p]; IZ_Action the_action = input_state->action[p];
for (i = 0; i < CONTROLS; i += 1) { for (i = 0; i < CONTROLS; i += 1) {
column = (i % 4) + (p * 4); column = (i % 4) + (p * 4);


+ 1
- 1
src/packages/server/IZ_config.c View File

@@ -1,7 +1,7 @@
#include "IZ_config.h" #include "IZ_config.h"


void IZ_ConfigGetDefaultPath(const char* config_path, size_t string_size) { void IZ_ConfigGetDefaultPath(const char* config_path, size_t string_size) {
//const char* config_path_dir = SDL_GetPrefPath("Modal Studios", APP_NAME);
//const char* config_path_dir = SDL_GetPrefPath("Modal Studios", IZ_APP_NAME);
const char* config_path_dir = SDL_GetBasePath(); const char* config_path_dir = SDL_GetBasePath();
memcpy_s(config_path, string_size, config_path_dir, 128); memcpy_s(config_path, string_size, config_path_dir, 128);
strcat_s(config_path, string_size, "config-server.ini"); strcat_s(config_path, string_size, "config-server.ini");


+ 32
- 25
src/packages/server/network/IZ_wsserver.c View File

@@ -42,6 +42,12 @@ void IZ_WSServerLoadConfig(IZ_WSServerState* state, const char* config_path, u8
if ((cmdline_buffer = IZ_ConfigGetCommandlineOption(argc, argv, "-p"))) { if ((cmdline_buffer = IZ_ConfigGetCommandlineOption(argc, argv, "-p"))) {
state->config.port = atoi(cmdline_buffer); state->config.port = atoi(cmdline_buffer);
} }

if ((cmdline_buffer = IZ_ConfigGetCommandlineOption(argc, argv, "-n"))) {
sprintf_s(state->config.server_name, 64, "%s Dedicated Server [%s]", IZ_APP_NAME, cmdline_buffer);
} else {
sprintf_s(state->config.server_name, 128, "%s Dedicated Server", IZ_APP_NAME);
}
} }


IZ_ProcedureResult IZ_WSServerInitialize(IZ_WSServerState* state, void* userdata, const char* config_path, u8 argc, const char* argv[]) { IZ_ProcedureResult IZ_WSServerInitialize(IZ_WSServerState* state, void* userdata, const char* config_path, u8 argc, const char* argv[]) {
@@ -52,32 +58,33 @@ IZ_ProcedureResult IZ_WSServerInitialize(IZ_WSServerState* state, void* userdata
memset(&info, 0, sizeof info); memset(&info, 0, sizeof info);
info.port = state->config.port; info.port = state->config.port;


static struct lws_http_mount mount = {
.mount_next = NULL, /* linked-list "next" */
.mountpoint = "/", /* mountpoint URL */
.origin = "./public", /* serve from dir */
.def = "index.html", /* default filename */
.protocol = "http",
.cgienv = NULL,
.extra_mimetypes = NULL,
.interpret = NULL,
.cgi_timeout = 0,
.cache_max_age = 0,
.auth_mask = 0,
.cache_reusable = 0,
.cache_revalidate = 0,
.cache_intermediaries = 0,
.origin_protocol = LWSMPRO_FILE, /* files in a dir */
.mountpoint_len = 1, /* char count */
.basic_auth_login_file = NULL,
};
if (state->config.origin) {
mount.origin = state->config.origin;
}
if (state->config.default_filename) {
mount.def = state->config.default_filename;
const char* origin = "./public";

struct stat stats;
stat(origin, &stats);
if (S_ISDIR(stats.st_mode)) {
static struct lws_http_mount mount = {
.mount_next = NULL, /* linked-list "next" */
.mountpoint = "/", /* mountpoint URL */
.origin = NULL, /* serve from dir */
.def = "index.html", /* default filename */
.protocol = "http",
.cgienv = NULL,
.extra_mimetypes = NULL,
.interpret = NULL,
.cgi_timeout = 0,
.cache_max_age = 0,
.auth_mask = 0,
.cache_reusable = 0,
.cache_revalidate = 0,
.cache_intermediaries = 0,
.origin_protocol = LWSMPRO_FILE, /* files in a dir */
.mountpoint_len = 1, /* char count */
.basic_auth_login_file = NULL,
};
mount.origin = origin;
info.mounts = &mount;
} }
info.mounts = &mount;


static const struct lws_protocols protocols[] = { static const struct lws_protocols protocols[] = {
{ {


+ 8
- 5
src/packages/server/network/IZ_wsserver.h View File

@@ -1,12 +1,17 @@
#ifndef IZ_WSSERVER_H #ifndef IZ_WSSERVER_H
#define IZ_WSSERVER_H #define IZ_WSSERVER_H


#include "libwebsockets.h"
#include <sys/stat.h>
#include <libwebsockets.h>
#include <string.h> #include <string.h>
#include "../IZ_common.h" #include "../IZ_common.h"
#include "../IZ_config.h" #include "../IZ_config.h"
#include "IZ_websocket.h" #include "IZ_websocket.h"


#ifndef S_ISDIR
#define S_ISDIR(s) s & S_IFDIR
#endif

/* one of these is created for each client connecting to us */ /* one of these is created for each client connecting to us */
typedef struct IZ_WSServerSessionData { typedef struct IZ_WSServerSessionData {
struct IZ_WSServerSessionData* pss_list; struct IZ_WSServerSessionData* pss_list;
@@ -28,8 +33,7 @@ typedef struct {


typedef struct { typedef struct {
u16 port; u16 port;
const char* origin;
const char* default_filename;
const char server_name[64];
} IZ_WSServerInitializeParams; } IZ_WSServerInitializeParams;


typedef struct { typedef struct {
@@ -41,8 +45,7 @@ typedef struct {
static IZ_WSServerState IZ_DEFAULT_STATE = { static IZ_WSServerState IZ_DEFAULT_STATE = {
.config = { .config = {
.port = 42069, .port = 42069,
.origin = "./public",
.default_filename = "index.html",
.server_name = NULL,
}, },
.userdata = NULL, .userdata = NULL,
.ws = { .ws = {


Loading…
Cancel
Save