random wave pattern
This commit is contained in:
parent
99c401c0c0
commit
acb76c195b
62
Script.js
62
Script.js
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user