From f8b61d6edd40e73dfbafad3f2c855fa37f34daf4 Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Sun, 18 Feb 2024 23:58:45 +0200 Subject: [PATCH] make weak enemies faster --- src/main-scene.zig | 59 +++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/src/main-scene.zig b/src/main-scene.zig index 5c09425..fef90be 100644 --- a/src/main-scene.zig +++ b/src/main-scene.zig @@ -11,15 +11,17 @@ const friction = 0.99; const walkForce = 4000; const maxSpeed = 200; const handDistance = 50; -const deathBallSize: f32 = 13; +const death_ball_size: f32 = 13; const playerSize = 20; const virtualWidth = 350; const virtualHeight = 350; + const safeRadius = 500; const spawnAreaWidth = 400; - const arenaRadius = safeRadius + spawnAreaWidth; +const shadow_offset = rl.Vector2.one().scale(8); + const enemyFriction = friction; const Enemy = struct { @@ -41,7 +43,7 @@ const Enemy = struct { .color = rl.YELLOW, .size = 10.0, .acceleration = 5000.0, - .maxSpeed = 150, + .maxSpeed = 200, }; } @@ -295,8 +297,11 @@ fn updateEnemies(self: *Self) !void { if (self.enemyTimer <= 0 and player.alive()) { self.enemyTimer = 0.5 + rng.float(f32) * 2; self.spawnedEnemiesCount += 1; - const enemyPosition = rl.Vector2.randomOnUnitCircle(rng).scale(400); - try enemies.append(Enemy.initStrong(enemyPosition)); + + const spawn_distance = rng.floatNorm(f32) * spawnAreaWidth/8 + spawnAreaWidth/2 + safeRadius; + const spawn_angle = rng.float(f32) * 2 * rl.PI; + const enemy_position = (rl.Vector2{ .x = spawn_distance, .y = 0 }).rotate(spawn_angle); + try enemies.append(Enemy.initStrong(enemy_position)); } const deathBallPosition = rope.lastNodePosition(); @@ -307,7 +312,7 @@ fn updateEnemies(self: *Self) !void { self.damagePlayer(); } - if (enemy.vulnerable() and player.alive() and rl.Vector2Distance(enemy.position, deathBallPosition) < enemy.size + deathBallSize) { + if (enemy.vulnerable() and player.alive() and rl.Vector2Distance(enemy.position, deathBallPosition) < enemy.size + death_ball_size) { self.damageEnemy(enemy); } @@ -375,8 +380,8 @@ fn damageEnemy(self: *Self, enemy: *Enemy) void { enemy.health -= 1; } - enemy.invincibility = 0.5; - enemy.stunned = 0.75; + enemy.invincibility = 0.75; + enemy.stunned = 0.9; enemy.velocity = deathBallVelocity.scale(20000); } @@ -565,7 +570,7 @@ fn drawWorld(self: *Self) void { rl.rlSetLineWidth(1); var enemies = &self.enemies; var rope = &self.rope; - const deathBallPosition = rope.nodePositions.get(rope.nodePositions.len-1); + const death_ball_position = rope.lastNodePosition(); rl.ClearBackground(rl.BLACK); rl.DrawCircle(0, 0, arenaRadius, rl.BROWN); @@ -574,7 +579,13 @@ fn drawWorld(self: *Self) void { rl.DrawCircleLines(0, 0, safeRadius, rl.WHITE); rl.DrawCircleLines(0, 0, safeRadius + spawnAreaWidth, rl.WHITE); - self.drawPlayer(); + for (enemies.items) |*enemy| { + rl.DrawCircleV( + enemy.position.add(shadow_offset), + enemy.size, + rgba(0, 0, 0, 100) + ); + } for (enemies.items) |*enemy| { var color = enemy.color; @@ -582,14 +593,15 @@ fn drawWorld(self: *Self) void { color = rl.LIGHTGRAY; } - rl.DrawCircle( - @intFromFloat(enemy.position.x), - @intFromFloat(enemy.position.y), + rl.DrawCircleV( + enemy.position, enemy.size, color ); } + self.drawPlayer(); + rl.rlDrawRenderBatchActive(); rl.rlSetLineWidth(3); for (0..(rope.nodePositions.len-1)) |i| { @@ -610,17 +622,26 @@ fn drawWorld(self: *Self) void { rl.DrawCircle( @intFromFloat(node.x), @intFromFloat(node.y), - 5, - rgb(194, 12, 30) + 6, + rgb(110, 10, 20) ); } + const death_ball_color = rgb(239, 48, 67); rl.DrawCircle( - @intFromFloat(deathBallPosition.x), - @intFromFloat(deathBallPosition.y), - deathBallSize, - rgb(239, 48, 67) + @intFromFloat(death_ball_position.x), + @intFromFloat(death_ball_position.y), + death_ball_size, + death_ball_color, ); + + const spikes_count = 5; + const spike_size = 8; + for (0..spikes_count) |i| { + const percent = @as(f32, @floatFromInt(i)) / spikes_count; + const extent = rl.Vector2.fromAngle(percent * 2 * rl.PI).scale(death_ball_size + spike_size); + rl.DrawLineV(death_ball_position.add(extent), death_ball_position.sub(extent), death_ball_color); + } } pub fn tick(self: *Self) !void {