Double missile

This commit is contained in:
Bluwww 2025-12-15 21:17:35 +07:00
parent 82ffa5cbed
commit 7cc449240f

View File

@ -178,7 +178,6 @@ function keyDownPressed(e) {
if (e.keyCode === 80) togglePause(); if (e.keyCode === 80) togglePause();
if (e.keyCode === 16) { if (e.keyCode === 16) {
// --- FIX DI SINI: Tambahkan pengecekan !player1.dead ---
if (abilityCharges > 0 && !game.gameOver && !gamePaused && !player1.dead) { if (abilityCharges > 0 && !game.gameOver && !gamePaused && !player1.dead) {
useAbility(); useAbility();
abilityCharges--; abilityCharges--;
@ -194,10 +193,31 @@ function keyUpPressed(e) {
if (e.keyCode === 32) keys.fire = false; if (e.keyCode === 32) keys.fire = false;
} }
// --- UPDATE FIRE BULLET: Cek Skill Double Laser ---
function fireBullet() { function fireBullet() {
missilesArray.push( if (player1.doubleLaserTimer > 0) {
new LaserBullet(player1.x + player1.width, player1.y + player1.height / 2) // --- SKILL AKTIF: TEMBAK 2 PELURU ---
); // Atas
missilesArray.push(
new LaserBullet(
player1.x + player1.width,
player1.y + player1.height / 2 - 15
)
);
// Bawah
missilesArray.push(
new LaserBullet(
player1.x + player1.width,
player1.y + player1.height / 2 + 15
)
);
} else {
// --- NORMAL: TEMBAK 1 PELURU ---
missilesArray.push(
new LaserBullet(player1.x + player1.width, player1.y + player1.height / 2)
);
}
laser.currentTime = 0; laser.currentTime = 0;
laser.volume = 0.4; laser.volume = 0.4;
laser.play(); laser.play();
@ -242,6 +262,8 @@ function updateGame() {
player1.y = canvasHeight / 2 - player1.height / 2; player1.y = canvasHeight / 2 - player1.height / 2;
player1.vx = 0; player1.vx = 0;
player1.vy = 0; player1.vy = 0;
// Reset skill jika mati
player1.doubleLaserTimer = 0;
} }
} }
} }
@ -262,6 +284,7 @@ function drawGame() {
drawParticles(); drawParticles();
// --- LOGIKA PICKUP ORB ---
for (let i = 0; i < abilityTokens.length; i++) { for (let i = 0; i < abilityTokens.length; i++) {
const t = abilityTokens[i]; const t = abilityTokens[i];
t.draw(); t.draw();
@ -276,9 +299,19 @@ function drawGame() {
height: t.height, height: t.height,
}) })
) { ) {
abilityCharges++; // Cek Tipe Orb
if (t.type === "bomb") {
// --- ORB KUNING (Bomb) ---
abilityCharges++;
createParticles(t.x, t.y, 15, "#ffff00"); // Partikel Kuning
} else if (t.type === "double") {
// --- ORB MERAH (Double Laser) ---
// 10 Detik = 60 FPS * 10 = 600 Frames
player1.doubleLaserTimer = 600;
createParticles(t.x, t.y, 15, "#ff0000"); // Partikel Merah
}
abilityTokens.splice(i, 1); abilityTokens.splice(i, 1);
createParticles(t.x, t.y, 15, "#00ffea");
i--; i--;
continue; continue;
} }
@ -454,6 +487,9 @@ function drawUI() {
} }
drawNewText(livesText, 30, canvasHeight - 50, "#ff3366"); drawNewText(livesText, 30, canvasHeight - 50, "#ff3366");
drawNewText("Bombs: " + abilityCharges, 30, 50, "#ffffff"); drawNewText("Bombs: " + abilityCharges, 30, 50, "#ffffff");
// --- (HAPUS) INDIKATOR TIMER DOUBLE LASER ---
// Teks tidak lagi ditampilkan, tapi durasi skill tetap berjalan di update()
} }
class PlayerObject { class PlayerObject {
@ -476,6 +512,9 @@ class PlayerObject {
this.invincible = 0; this.invincible = 0;
this.dead = false; this.dead = false;
// --- SKILL TIMER ---
this.doubleLaserTimer = 0; // Timer dalam frame
this.totalFrames = 5; this.totalFrames = 5;
this.frameIndex = 2; this.frameIndex = 2;
this.spriteWidth = 0; this.spriteWidth = 0;
@ -580,6 +619,11 @@ class PlayerObject {
} else { } else {
this.frameIndex = 2; this.frameIndex = 2;
} }
// --- KURANGI TIMER SKILL ---
if (this.doubleLaserTimer > 0) {
this.doubleLaserTimer--;
}
} }
} }
@ -913,6 +957,7 @@ function spawnEnemyFromWave(wave) {
enemyShipArray.push(enemy); enemyShipArray.push(enemy);
} }
// --- CLASS ORB UPDATE: Support Type ---
class AbilityToken { class AbilityToken {
constructor(x, y) { constructor(x, y) {
this.x = x; this.x = x;
@ -920,6 +965,8 @@ class AbilityToken {
this.width = 32; this.width = 32;
this.height = 32; this.height = 32;
this.speed = 4; this.speed = 4;
// Random Type saat spawn: "bomb" atau "double"
this.type = Math.random() < 0.5 ? "bomb" : "double";
} }
draw() { draw() {
@ -928,10 +975,21 @@ class AbilityToken {
const cx = this.x + this.width / 2; const cx = this.x + this.width / 2;
const cy = this.y + this.height / 2; const cy = this.y + this.height / 2;
ctx.arc(cx, cy, 12, 0, Math.PI * 2); ctx.arc(cx, cy, 12, 0, Math.PI * 2);
// --- WARNA ORB BERDASARKAN TIPE ---
const g = ctx.createRadialGradient(cx, cy, 0, cx, cy, 12); const g = ctx.createRadialGradient(cx, cy, 0, cx, cy, 12);
g.addColorStop(0, "#ffffff"); g.addColorStop(0, "#ffffff");
g.addColorStop(0.5, "#00ffea");
g.addColorStop(1, "#0066ff"); if (this.type === "bomb") {
// Kuning (Bomb)
g.addColorStop(0.5, "#ffff00");
g.addColorStop(1, "#ff9900");
} else {
// Merah (Double Laser)
g.addColorStop(0.5, "#ff3333");
g.addColorStop(1, "#990000");
}
ctx.fillStyle = g; ctx.fillStyle = g;
ctx.fill(); ctx.fill();
ctx.restore(); ctx.restore();
@ -943,6 +1001,7 @@ class AbilityToken {
} }
function maybeSpawnAbilityToken() { function maybeSpawnAbilityToken() {
// --- KEMBALI KE 0.2% (0.002) ---
if (Math.random() < 0.002 && abilityTokens.length < 3) { if (Math.random() < 0.002 && abilityTokens.length < 3) {
const y = Math.random() * (canvasHeight - 120) + 60; const y = Math.random() * (canvasHeight - 120) + 60;
abilityTokens.push(new AbilityToken(canvasWidth + 40, y)); abilityTokens.push(new AbilityToken(canvasWidth + 40, y));