diff options
| author | Aldrik Ramaekers <aldrik@amftech.nl> | 2023-10-27 21:01:21 +0200 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrik@amftech.nl> | 2023-10-27 21:01:21 +0200 |
| commit | 641f81317a5b5cea6b3c5a4c65b1ca4313b0d8c0 (patch) | |
| tree | 391bb0b6536ca2247a371f16a44249b8a5f963d6 /src | |
| parent | 9d0bb9f229155546fde8b4f666d2682ad5ac606f (diff) | |
audio, add throwable
Diffstat (limited to 'src')
| -rw-r--r-- | src/asset_defs.c | 3 | ||||
| -rw-r--r-- | src/game.c | 3 | ||||
| -rw-r--r-- | src/players.c | 15 | ||||
| -rw-r--r-- | src/throwables.c | 91 | ||||
| -rw-r--r-- | src/zombies.c | 2 |
5 files changed, 113 insertions, 1 deletions
diff --git a/src/asset_defs.c b/src/asset_defs.c index 52df3b0..2c51369 100644 --- a/src/asset_defs.c +++ b/src/asset_defs.c @@ -31,4 +31,7 @@ void load_assets() { // Tiles img_tile_cobblestone = assets_load_image_from_file("data/imgs/tiles/tile_cobblestone.png"); img_tile_grass1 = assets_load_image_from_file("data/imgs/tiles/tile_grass1.png"); + + // sounds + wav_throwable_bounce = Mix_LoadWAV("data/sounds/throwable_bounce.wav"); }
\ No newline at end of file @@ -189,6 +189,7 @@ void update_server(platform_window* window) { update_zombies_server(window); broadcast_zombies = platform_get_time(TIME_FULL, TIME_NS) - broadcast_zombies; + update_throwables_server(window); broadcast_stamp = platform_get_time(TIME_FULL, TIME_NS); broadcast_to_clients(create_protocol_user_list()); @@ -277,6 +278,7 @@ void update_client(platform_window* window) { void update_game(platform_window* window) { clear_bullets(); + clear_throwables(); if (global_state.server) { update_server(window); @@ -295,6 +297,7 @@ void update_game(platform_window* window) { draw_zombie_chunks(window); draw_drops(window); draw_bullets(window); + draw_throwables(window); #ifdef MODE_DEBUG if (!is_editing_map) diff --git a/src/players.c b/src/players.c index 2488693..fda8700 100644 --- a/src/players.c +++ b/src/players.c @@ -194,6 +194,21 @@ void take_player_input(platform_window* window) { network_message message = create_protocol_user_shoot(player_id, dirx, diry); add_message_to_outgoing_queuex(message, *global_state.client); } + + // throwing + if (is_right_clicked()) { + float dirx = (_global_mouse.x - (window->width/2)); + float diry = (_global_mouse.y - (window->height/2)); + double length = sqrt(dirx * dirx + diry * diry); + dirx /= length; + diry /= length; + log_info("THROWING!"); + throw_throwable(window, player_id, THROWABLE_GRENADE, dirx, diry); + //network_message message = create_protocol_user_shoot(player_id, dirx, diry); + //add_message_to_outgoing_queuex(message, *global_state.client); + } + + } void update_players_server() { diff --git a/src/throwables.c b/src/throwables.c new file mode 100644 index 0000000..9676c3a --- /dev/null +++ b/src/throwables.c @@ -0,0 +1,91 @@ +#include "../include/throwables.h" + +void clear_throwables() { + for (int i = 0; i < max_throwables; i++) { + if (!throwables[i].active) continue; + throwables[i].alive_time += update_delta; + if (throwables[i].alive_time >= 3.0f) { + throwables[i].active = false; + } + } +} + +void throw_throwable(platform_window* window, u32 id, throwable_type type, float dirx, float diry) { + for (int i = 0; i < max_throwables; i++) { + if (throwables[i].active) continue; + + player* p = get_player_by_id(id); + if (!p) { + log_info("User with unknown id throwing stuff"); + } + + throwable t = {.active = true, .alive_time = 0.0f, .type = type, .direction = (vec3f){.x = dirx, .y = diry, .z = -0.2f}, + .player_id = id, .position = (vec3f){.x = p->playerx, .y = p->playery, .z = p->height}}; + + throwables[i] = t; + break; + } +} + + +void update_throwables_server(platform_window* window) { + float speed = 7.0f * SERVER_TICK_RATE; + float gravity = 0.015f; + + float max_audible_throwable_dist = 10.0f; + + for (int i = 0; i < max_throwables; i++) { + throwable b = throwables[i]; + if (!b.active) continue; + player *p = get_player_by_id(b.player_id); + if (!p) continue; + + throwables[i].position.x += throwables[i].direction.x * speed; + throwables[i].position.y += throwables[i].direction.y * speed; + + if (throwables[i].direction.z != 0) throwables[i].direction.z += gravity; + throwables[i].position.z -= throwables[i].direction.z; + + float floor = get_height_of_tile_under_coords(throwables[i].position.x, throwables[i].position.y); + if (throwables[i].position.z < floor && throwables[i].direction.z != 0) { + throwables[i].position.z = floor; + throwables[i].direction.z = -throwables[i].direction.z*0.7; + + // calculate volume + int tiles_between_throwable_and_player = distance_between_3f((vec3f){.x = p->playerx, .y = p->playery, .z = p->height}, b.position); + float volume = (tiles_between_throwable_and_player / max_audible_throwable_dist); + if (volume > 1.0f) volume = 1.0f; + + // calculate angle + float dirx = (throwables[i].position.x - p->playerx); + float diry = (throwables[i].position.y - p->playery); + float rads = atan2(diry, dirx) * 180.0f/M_PI; + if (rads < 0) rads = 360 + rads; + rads += 90; + if (rads > 360) rads -= 360; + + log_infox("rads: %.2f", rads) + + Mix_SetPosition(0, rads, volume*255); + Mix_PlayChannel(0, wav_throwable_bounce, 0); + if (throwables[i].direction.z > -0.03f && throwables[i].direction.z < 0.03f) throwables[i].direction.z = 0; + } + } +} + + +void draw_throwables(platform_window* window) { + map_info info = get_map_info(window); + + for (int i = 0; i < max_throwables; i++) { + throwable t = throwables[i]; + if (!t.active) continue; + + THROWABLE_RENDER_DEPTH((int)t.position.y); + + float throwable_render_x = t.position.x*info.tile_width + (t.position.y*info.px_incline); + float throwable_render_y = t.position.y*info.tile_height - (t.position.z*info.px_raised_per_h); + + renderer->render_rectangle(throwable_render_x, throwable_render_y, 10, 10, rgb(255, 51, 51)); + } +}
\ No newline at end of file diff --git a/src/zombies.c b/src/zombies.c index 2c19220..55c0c57 100644 --- a/src/zombies.c +++ b/src/zombies.c @@ -220,7 +220,7 @@ void update_zombies_server(platform_window* window) { if (zombies[i].request.active) { if (zombies[i].request.to_fill->length) { - mutex_trylock(&zombies[i].request.mutex); + mutex_lock(&zombies[i].request.mutex); array_destroy(&zombies[i].path); zombies[i].path = array_copy(zombies[i].request.to_fill); |
