toygame/src/game/game_manager.c

308 lines
7.7 KiB
C
Raw Normal View History

2021-07-24 16:42:22 +03:00
#include "game_manager.h"
#include "../graphics/renderer.h"
#include "../graphics/ui_manager.h"
#include "../util/transform.h"
#include "config.h"
#include "console.h"
#include "monster_manager.h"
#include "time_manager.h"
mg_game_manager_t *g_game_manager;
void mg_game_manager_init()
{
g_game_manager = gs_malloc_init(mg_game_manager_t);
g_game_manager->player = mg_player_new();
mg_game_manager_load_map("assets/maps/q3dm1.bsp");
mg_game_manager_spawn_player();
mg_monster_manager_init();
mg_cmd_arg_type types[] = {MG_CMD_ARG_STRING};
mg_cmd_new("map", "Load map", &mg_game_manager_load_map, (mg_cmd_arg_type *)types, 1);
mg_cmd_new("spawn", "Spawn player", &mg_game_manager_spawn_player, NULL, 0);
}
void mg_game_manager_free()
{
mg_monster_manager_free();
mg_player_free(g_game_manager->player);
g_game_manager->player = NULL;
bsp_map_free(g_game_manager->map);
g_game_manager->map = NULL;
gs_free(g_game_manager);
g_game_manager = NULL;
}
void mg_game_manager_update()
{
if (g_ui_manager->console_open)
{
mg_game_manager_input_console();
}
else if (g_ui_manager->menu_open)
{
mg_game_manager_input_menu();
}
else if (g_game_manager->player)
{
mg_game_manager_input_alive();
mg_player_update(g_game_manager->player);
mg_monster_manager_update();
}
mg_game_manager_input_general();
}
void mg_game_manager_load_map(char *filename)
{
if (!gs_platform_file_exists(filename))
{
mg_println("mg_game_manager_load_map() failed: file not found '%s'", filename);
return false;
}
if (g_game_manager->map != NULL)
{
bsp_map_free(g_game_manager->map);
g_game_manager->map = NULL;
}
g_game_manager->map = gs_malloc_init(bsp_map_t);
load_bsp(filename, g_game_manager->map);
if (g_game_manager->map->valid)
{
bsp_map_init(g_game_manager->map);
mg_game_manager_spawn_player();
}
else
{
mg_println("Failed to load map %s", filename);
bsp_map_free(g_game_manager->map);
g_game_manager->map = NULL;
}
}
void mg_game_manager_spawn_player()
{
if (g_game_manager->map->valid)
{
g_game_manager->player->velocity = gs_v3(0, 0, 0);
g_game_manager->player->camera.pitch = 0;
bsp_map_find_spawn_point(g_game_manager->map, &g_game_manager->player->transform.position, &g_game_manager->player->yaw);
g_game_manager->player->last_valid_pos = g_game_manager->player->transform.position;
g_game_manager->player->yaw -= 90;
g_renderer->cam = &g_game_manager->player->camera.cam;
}
}
#ifdef __ANDROID__
mg_player_input_t mg_game_manager_get_input()
{
mg_player_input_t input = {0};
// Testing
input.move.x += 1.0f;
if (gs_platform_touch_down(0))
{
input.delta_aim = gs_vec2_scale(gs_platform_touch_deltav(0), mg_cvar("cl_sensitivity")->value.f * 0.022f);
}
return input;
}
#else
mg_player_input_t mg_game_manager_get_input()
{
double dt = g_time_manager->unscaled_delta;
mg_player_input_t input = {0};
input.delta_aim = gs_vec2_scale(gs_platform_mouse_deltav(), mg_cvar("cl_sensitivity")->value.f * 0.022f);
f32 scroll_x, scroll_y;
gs_platform_mouse_wheel(&scroll_x, &scroll_y);
if (gs_platform_key_down(GS_KEYCODE_UP))
input.delta_aim.y -= 150.0f * dt;
if (gs_platform_key_down(GS_KEYCODE_DOWN))
input.delta_aim.y += 150.0f * dt;
if (gs_platform_key_down(GS_KEYCODE_RIGHT))
input.delta_aim.x += 150.0f * dt;
if (gs_platform_key_down(GS_KEYCODE_LEFT))
input.delta_aim.x -= 150.0f * dt;
if (gs_platform_key_down(GS_KEYCODE_W))
input.move.x += 1.0f;
if (gs_platform_key_down(GS_KEYCODE_S))
input.move.x -= 1.0f;
if (gs_platform_key_down(GS_KEYCODE_D))
input.move.y += 1.0f;
if (gs_platform_key_down(GS_KEYCODE_A))
input.move.y -= 1.0f;
if (gs_platform_key_down(GS_KEYCODE_SPACE))
input.jump = true;
if (gs_platform_key_down(GS_KEYCODE_LEFT_CONTROL))
input.crouch = true;
if (gs_platform_mouse_down(GS_MOUSE_LBUTTON))
input.shoot = true;
input.wish_slot = -1;
if (gs_platform_key_pressed(GS_KEYCODE_1))
input.wish_slot = 0;
if (gs_platform_key_pressed(GS_KEYCODE_2))
input.wish_slot = 1;
if (gs_platform_key_pressed(GS_KEYCODE_3))
input.wish_slot = 2;
if (gs_platform_key_pressed(GS_KEYCODE_4))
input.wish_slot = 3;
if (gs_platform_key_pressed(GS_KEYCODE_5))
input.wish_slot = 4;
if (gs_platform_key_pressed(GS_KEYCODE_6))
input.wish_slot = 5;
if (gs_platform_key_pressed(GS_KEYCODE_7))
input.wish_slot = 6;
if (gs_platform_key_pressed(GS_KEYCODE_8))
input.wish_slot = 7;
if (gs_platform_key_pressed(GS_KEYCODE_9))
input.wish_slot = 8;
if (gs_platform_key_pressed(GS_KEYCODE_0))
input.wish_slot = 9;
// TODO: weapon scroll
// if (scroll_y > 0)
// ...
// else if (scroll_y < 0)
// ...
return input;
}
#endif
void mg_game_manager_input_alive()
{
gs_platform_t *platform = gs_subsystem(platform);
// Reset
g_game_manager->player->wish_move = gs_v3(0, 0, 0);
g_game_manager->player->wish_jump = false;
g_game_manager->player->wish_crouch = false;
mg_player_input_t input = mg_game_manager_get_input();
// Rotate
g_game_manager->player->camera.pitch = gs_clamp(g_game_manager->player->camera.pitch + input.delta_aim.y, -90.0f, 90.0f);
g_game_manager->player->yaw = fmodf(g_game_manager->player->yaw - input.delta_aim.x, 360.0f);
g_game_manager->player->transform.rotation = gs_quat_angle_axis(gs_deg2rad(g_game_manager->player->yaw), MG_AXIS_UP);
// Move dir
if (input.move.x != 0)
g_game_manager->player->wish_move = gs_vec3_add(g_game_manager->player->wish_move, gs_vec3_scale(mg_get_forward(g_game_manager->player->transform.rotation), input.move.x));
if (input.move.y != 0)
g_game_manager->player->wish_move = gs_vec3_add(g_game_manager->player->wish_move, gs_vec3_scale(mg_get_right(g_game_manager->player->transform.rotation), input.move.y));
g_game_manager->player->wish_move.z = 0;
g_game_manager->player->wish_move = gs_vec3_norm(g_game_manager->player->wish_move);
// Actions
g_game_manager->player->wish_jump = input.jump;
g_game_manager->player->wish_crouch = input.crouch;
g_game_manager->player->wish_shoot = input.shoot;
if (input.wish_slot >= 0)
{
mg_player_switch_weapon(g_game_manager->player, input.wish_slot);
}
// TODO: platform
if (gs_platform_key_pressed(GS_KEYCODE_ESC))
{
g_ui_manager->menu_open = true;
}
if (gs_platform_key_pressed(GS_KEYCODE_F))
{
mg_monster_manager_spawn_monster(
gs_vec3_add(g_game_manager->player->transform.position, gs_vec3_scale(mg_get_forward(g_game_manager->player->transform.rotation), 250.0f)),
"cube.md3");
}
}
void mg_game_manager_input_console()
{
f32 scroll_x, scroll_y;
gs_platform_mouse_wheel(&scroll_x, &scroll_y);
if (gs_platform_key_down(GS_KEYCODE_LSHIFT))
{
scroll_x = scroll_y;
scroll_y = 0;
}
if (scroll_y != 0)
{
g_ui_manager->console_scroll_y += scroll_y < 0 ? -4 : 4;
g_ui_manager->console_scroll_y = gs_clamp(g_ui_manager->console_scroll_y, 0, MG_CON_LINES - 1);
}
if (scroll_x != 0)
{
g_ui_manager->console_scroll_x += scroll_x < 0 ? -4 : 4;
g_ui_manager->console_scroll_x = gs_min(g_ui_manager->console_scroll_x, 0);
}
if (gs_platform_key_pressed(GS_KEYCODE_ENTER))
{
mg_console_input(g_ui_manager->console_input);
memset(g_ui_manager->console_input, 0, 256);
}
if (gs_platform_key_pressed(GS_KEYCODE_ESC))
{
g_ui_manager->console_open = false;
}
}
void mg_game_manager_input_menu()
{
if (gs_platform_key_pressed(GS_KEYCODE_ESC))
{
g_ui_manager->menu_open = false;
}
}
void mg_game_manager_input_general()
{
if (gs_platform_key_pressed(GS_KEYCODE_F1))
{
g_ui_manager->console_open = !g_ui_manager->console_open;
g_ui_manager->console_scroll_y = 0;
g_ui_manager->console_scroll_x = 0;
}
if (gs_platform_key_pressed(GS_KEYCODE_F2))
{
g_ui_manager->debug_open = !g_ui_manager->debug_open;
}
if (gs_platform_key_pressed(GS_KEYCODE_F3))
{
mg_cvar_t *fs = mg_cvar("vid_fullscreen");
fs->value.i = !fs->value.i;
}
}