random wave pattern

This commit is contained in:
Bluwww 2025-12-15 19:54:56 +07:00
parent 99c401c0c0
commit acb76c195b

View File

@ -830,7 +830,12 @@ function addShips() {
if (currentWave.spawnTimer <= 0) { if (currentWave.spawnTimer <= 0) {
spawnEnemyFromWave(currentWave); spawnEnemyFromWave(currentWave);
currentWave.spawned++; currentWave.spawned++;
currentWave.spawnTimer = currentWave.spacing; // --- RANDOM SPACING ---
// Membuat jarak muncul antar musuh bervariasi
// Kadang cepat, kadang ada jeda.
let randomSpacing =
currentWave.spacing + Math.floor(Math.random() * 30);
currentWave.spawnTimer = randomSpacing;
} else { } else {
currentWave.spawnTimer--; currentWave.spawnTimer--;
} }
@ -850,19 +855,21 @@ function addShips() {
} }
function startNewWave() { function startNewWave() {
const patterns = ["line", "v", "sine", "scatter"]; // --- CHAOS WAVE MODE ---
const pattern = patterns[Math.floor(Math.random() * patterns.length)]; // Tidak ada pattern 'line', 'v', 'zigzag'.
// Kita hanya menentukan jumlah musuh yang akan muncul di wave ini.
let baseCount = 3; let baseCount = 3;
let scalingCount = Math.floor(game.level / 2); let scalingCount = Math.floor(game.level / 2);
let count = Math.min( let count = Math.min(
15, 20, // Max musuh ditingkatkan sedikit untuk kompensasi sebaran
baseCount + scalingCount + Math.floor(Math.random() * 3) baseCount + scalingCount + Math.floor(Math.random() * 5)
); );
let spacing = Math.max(20, 50 - game.level);
// Spacing dasar (nanti diacak lagi per musuh)
let spacing = Math.max(15, 40 - game.level);
currentWave = { currentWave = {
pattern: pattern,
count: count, count: count,
spacing: spacing, spacing: spacing,
spawned: 0, spawned: 0,
@ -871,41 +878,34 @@ function startNewWave() {
} }
function spawnEnemyFromWave(wave) { function spawnEnemyFromWave(wave) {
const baseY = canvasHeight / 2; // --- POSISI BENAR-BENAR ACAK ---
const spread = 250; // Tentukan Y sembarang di area layar
const index = wave.spawned; // Area aman: 60px dari atas, 100px dari bawah
let y = Math.random() * (canvasHeight - 120) + 60; const minY = 60;
const maxY = canvasHeight - 120;
if (wave.pattern === "line") { const y = Math.random() * (maxY - minY) + minY;
const step = (spread * 2) / Math.max(1, wave.count - 1);
y = baseY - spread + step * index;
} else if (wave.pattern === "v") {
const centerIndex = (wave.count - 1) / 2;
const offset = (index - centerIndex) * 50;
y = baseY + Math.abs(offset) * 1.2;
} else if (wave.pattern === "sine") {
const angle = (index / wave.count) * Math.PI * 2;
y = baseY + Math.sin(angle) * spread;
} else if (wave.pattern === "scatter") {
y = Math.random() * (canvasHeight - 150) + 75;
}
y = Math.max(60, Math.min(canvasHeight - 100, y)); // Random X Offset biar tidak muncul dalam satu garis lurus sempurna
const xOffset = Math.random() * 200;
const randomShip = Math.floor(Math.random() * enemyImgArray.length); const randomShip = Math.floor(Math.random() * enemyImgArray.length);
// --- KECEPATAN MUSUH DIPERLAMBAT ---
// Lama: 4 + Math.random()*3 + game.level*0.25 (Cepat) // Scaling Speed per 5 Level (0.2 factor)
// Baru: 3.5 + Math.random()*2 + game.level*0.1 (Lambat & Scaling Halus)
// Max Speed: 8 (Agar tidak teleportasi)
let rawSpeed = 3.5 + Math.random() * 2 + game.level * 0.2; let rawSpeed = 3.5 + Math.random() * 2 + game.level * 0.2;
const speed = Math.min(rawSpeed, 8); const speed = Math.min(rawSpeed, 8);
// --- RANDOM MOVEMENT TYPE ---
// Setiap musuh melempar dadu sendiri untuk menentukan tipe gerakannya
// 30% kemungkinan gerak gelombang (sine), sisanya lurus.
let movementType = Math.random() < 0.3 ? "sine" : "straight";
let enemy = new EnemyObj( let enemy = new EnemyObj(
canvasWidth + 50, canvasWidth + 50 + xOffset, // X position + random offset
y, y,
speed, speed,
enemyImgArray[randomShip], enemyImgArray[randomShip],
wave.pattern === "sine" ? "sine" : "straight" movementType
); );
// BALANCING HEALTH // BALANCING HEALTH