summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/asset_defs.c3
-rw-r--r--src/game.c3
-rw-r--r--src/players.c15
-rw-r--r--src/throwables.c91
-rw-r--r--src/zombies.c2
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
diff --git a/src/game.c b/src/game.c
index 4c5f682..697624f 100644
--- a/src/game.c
+++ b/src/game.c
@@ -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);