User prompt
put lazer enemy down and in different attacks
User prompt
put more styliş attack styles
User prompt
put the attack button after wave 15
User prompt
some freeze attacks will come from side
User prompt
put more freeze attacks
User prompt
add multiple attacks in waves
User prompt
there no wait for different attacks in waves. two attacks can come in one wave make it
User prompt
add in differect waves
User prompt
put more circle lazer enemy with different angles
User prompt
put more lazers with differet angles
User prompt
make crit 9999 attack text red
User prompt
make the text red
User prompt
after waves on a button will come . named attack. and we will won with 99999 crit attack
User prompt
new attack style a circle will come and shot thick lazer one time
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick = n + 1;' Line Number: 97
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick = n + 1;' Line Number: 95
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick = Number(self.patternTick) + 1;' Line Number: 91
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick = Number(self.patternTick) + 1;' Line Number: 91
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick = Number(self.patternTick) + 1;' Line Number: 91
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick = Number(self.patternTick) + 1;' Line Number: 87
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick = Number(self.patternTick) + 1;' Line Number: 83
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick = Number(self.patternTick) + 1;' Line Number: 80
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick = Number(self.patternTick) + 1;' Line Number: 80
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick = Number(self.patternTick) + 1;' Line Number: 76
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick = Number(self.patternTick) + 1;' Line Number: 72
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Enemy (for future expansion, currently just a box at the top) var Enemy = Container.expand(function () { var self = Container.call(this); var enemyBox = self.attachAsset('enemyBox', { width: 400, height: 260, // Increased height for a longer (taller) enemy box, width unchanged color: 0x2222ff, shape: 'box', anchorX: 0.5, anchorY: 0.5 }); return self; }); // Enemy Bullet var EnemyBullet = Container.expand(function () { var self = Container.call(this); // Attach bullet asset (white circle) var bullet = self.attachAsset('enemyBullet', { width: 60, height: 60, color: 0xffffff, shape: 'ellipse', anchorX: 0.5, anchorY: 0.5 }); // Movement properties self.vx = 0; self.vy = 0; // For pattern logic self.pattern = null; // Always initialize patternTick to 0 for each bullet self.patternTick = 0; // Called every tick self.update = function () { if (self.pattern) { self.pattern(self, self.patternTick); // Defensive: ensure self.patternTick is a number and not a thenable before incrementing (fix for s.apply(...).then is not a function) if (typeof self.patternTick !== "number" || self.patternTick && typeof self.patternTick.then === "function") { self.patternTick = 0; } else { // Defensive: ensure self.patternTick is a number and not a thenable before incrementing (fix for s.apply(...).then is not a function) if (typeof self.patternTick !== "number" || self.patternTick && typeof self.patternTick.then === "function") { self.patternTick = 0; } else { // Defensive: ensure self.patternTick is a number and not a thenable before incrementing (fix for s.apply(...).then is not a function) if (typeof self.patternTick !== "number" || self.patternTick && typeof self.patternTick.then === "function") { self.patternTick = 1; } else { // Defensive: ensure self.patternTick is a number and not a thenable before incrementing (fix for s.apply(...).then is not a function) if (typeof self.patternTick !== "number" || self.patternTick && typeof self.patternTick.then === "function") { self.patternTick = 1; } else { // Defensive: ensure self.patternTick is a number and not a thenable before incrementing (fix for s.apply(...).then is not a function) if (typeof self.patternTick !== "number" || self.patternTick && typeof self.patternTick.then === "function") { self.patternTick = 1; } else { // Defensive: ensure self.patternTick is a number and not a thenable before incrementing (fix for s.apply(...).then is not a function) if (typeof self.patternTick !== "number" || self.patternTick && typeof self.patternTick.then === "function") { self.patternTick = 1; } else { self.patternTick = Number(self.patternTick) + 1; } } } } } } } else { // Defensive: ensure self.vx is a number before using if (typeof self.vx === "number") { self.x += self.vx; } // Defensive: ensure self.vy is a number and not a thenable before using if (typeof self.vy === "number" && !(_typeof6(self.vy) === "object" && self.vy !== null && typeof self.vy.then === "function")) { self.y += self.vy; } } }; return self; }); // Freeze Bullet (special: only damages if player is not moving) var FreezeBullet = Container.expand(function () { var self = Container.call(this); // Attach freeze bullet asset (blue ellipse) var bullet = self.attachAsset('freezeBullet', { width: 60, height: 60, color: 0x3399ff, shape: 'ellipse', anchorX: 0.5, anchorY: 0.5 }); // Movement properties self.vx = 0; self.vy = 0; // For pattern logic self.pattern = null; self.patternTick = 0; self.update = function () { if (self.pattern) { self.pattern(self, self.patternTick); if (typeof self.patternTick !== "number" || _typeof5(self.patternTick) === "object" && self.patternTick !== null && typeof self.patternTick.then === "function") { self.patternTick = 0; } if (typeof self.patternTick === "number" && !(_typeof5(self.patternTick) === "object" && self.patternTick !== null && typeof self.patternTick.then === "function")) { self.patternTick += 1; } else { self.patternTick = 1; } } else { if (typeof self.vx === "number") { self.x += self.vx; } if (typeof self.vy === "number" && !(_typeof2(self.vy) === "object" && self.vy !== null && typeof self.vy.then === "function")) { self.y += self.vy; } } }; return self; }); // Heart-shaped Soul (Player) var Soul = Container.expand(function () { var self = Container.call(this); // Attach heart asset (ellipse, red, scaled to look like a heart) // Since we can't draw a heart, use an ellipse and scale it to look heart-like var heart = self.attachAsset('soulHeart', { width: 60, height: 50, color: 0xff2d55, shape: 'ellipse', anchorX: 0.5, anchorY: 0.5 }); // Squash to make it more heart-like heart.scaleY = 1.1; heart.scaleX = 1.2; // For hit feedback self.flash = function () { tween(heart, { tint: 0xffffff }, { duration: 80, onFinish: function onFinish() { tween(heart, { tint: 0xff2d55 }, { duration: 120 }); } }); }; // For movement bounds self.radius = 30; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Game area (the "box" where the soul can move) // Tween plugin for movement and effects function _typeof12(o) { "@babel/helpers - typeof"; return _typeof12 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof12(o); } function _typeof11(o) { "@babel/helpers - typeof"; return _typeof11 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof11(o); } function _typeof10(o) { "@babel/helpers - typeof"; return _typeof10 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof10(o); } function _typeof1(o) { "@babel/helpers - typeof"; return _typeof1 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof1(o); } function _typeof0(o) { "@babel/helpers - typeof"; return _typeof0 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof0(o); } function _typeof9(o) { "@babel/helpers - typeof"; return _typeof9 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof9(o); } function _typeof8(o) { "@babel/helpers - typeof"; return _typeof8 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof8(o); } function _typeof7(o) { "@babel/helpers - typeof"; return _typeof7 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof7(o); } function _typeof6(o) { "@babel/helpers - typeof"; return _typeof6 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof6(o); } function _typeof5(o) { "@babel/helpers - typeof"; return _typeof5 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof5(o); } function _typeof4(o) { "@babel/helpers - typeof"; return _typeof4 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof4(o); } function _typeof3(o) { "@babel/helpers - typeof"; return _typeof3 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof3(o); } function _typeof2(o) { "@babel/helpers - typeof"; return _typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof2(o); } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var boxWidth = 900; var boxHeight = 900; var boxX = (2048 - boxWidth) / 2; var boxY = 2732 - boxHeight - 200; // Draw the box (white border, transparent fill) var boxBorder = LK.getAsset('boxBorder', { width: boxWidth, height: boxHeight, color: 0xffffff, shape: 'box', anchorX: 0, anchorY: 0 }); boxBorder.alpha = 0.15; boxBorder.x = boxX; boxBorder.y = boxY; game.addChild(boxBorder); // Add a big enemy (bi) at the top of the game area var enemy = new Enemy(); enemy.x = 2048 / 2; enemy.y = 2732 / 2 - 120; // Move enemy a little up from center enemy.scaleX = 2.2; enemy.scaleY = 2.2; game.addChild(enemy); // Enemy health bar var enemyMaxHP = 20; var enemyHP = enemyMaxHP; var enemyHealthBarWidth = 700; var enemyHealthBarHeight = 60; var enemyHealthBarBg = LK.getAsset('boxBorder', { width: enemyHealthBarWidth, height: enemyHealthBarHeight, color: 0x333333, shape: 'box', anchorX: 0.5, anchorY: 0.5 }); // Place health bar background further below the enemy enemyHealthBarBg.x = enemy.x; enemyHealthBarBg.y = enemy.y + 260; // Move health bar further down to match new enemy position game.addChild(enemyHealthBarBg); var enemyHealthBar = LK.getAsset('boxBorder', { width: enemyHealthBarWidth - 8, height: enemyHealthBarHeight - 2, color: 0xFFFF00, // yellow shape: 'box', anchorX: 0.5, anchorY: 0.5 }); enemyHealthBar.x = enemy.x; enemyHealthBar.y = enemy.y + 260; game.addChild(enemyHealthBar); // Add soul (player) at center of box var soul = new Soul(); soul.x = boxX + boxWidth / 2; soul.y = boxY + boxHeight / 2; game.addChild(soul); // Health system var maxHP = 5; var hp = maxHP; // Score (number of waves survived) var score = 0; // Bullets array var enemyBullets = []; // GUI: HP display (top right, avoid top left) var hpText = new Text2('HP: ' + hp, { size: 90, fill: 0xFF2D55 }); hpText.anchor.set(1, 0); LK.gui.topRight.addChild(hpText); // GUI: Score display (top center) var scoreText = new Text2('WAVES: 0', { size: 90, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); // Touch controls for soul movement var draggingSoul = false; var dragOffsetX = 0; var dragOffsetY = 0; // Helper: clamp soul inside box function clampSoulPosition(x, y) { var r = soul.radius; var minX = boxX + r; var maxX = boxX + boxWidth - r; var minY = boxY + r; var maxY = boxY + boxHeight - r; if (x < minX) x = minX; if (x > maxX) x = maxX; if (y < minY) y = minY; if (y > maxY) y = maxY; return { x: x, y: y }; } // Touch down: start dragging if inside soul game.down = function (x, y, obj) { // Only allow drag if inside soul var dx = x - soul.x; var dy = y - soul.y; if (dx * dx + dy * dy <= soul.radius * soul.radius) { draggingSoul = true; dragOffsetX = soul.x - x; dragOffsetY = soul.y - y; } }; // Touch up: stop dragging game.up = function (x, y, obj) { draggingSoul = false; }; // Touch move: move soul game.move = function (x, y, obj) { // Always follow the mouse/touch, clamped to the box var pos = clampSoulPosition(x, y); soul.x = pos.x; soul.y = pos.y; }; // Bullet patterns function spawnWave(waveNum) { // Clear bullets for (var i = 0; i < enemyBullets.length; i++) { enemyBullets[i].destroy(); } enemyBullets.length = 0; // Choose pattern based on waveNum for variety var patternType = waveNum % 5; if (patternType === 0) { // Radial burst (classic) var count = 8; // constant var speed = 3 + waveNum * 0.3; for (var i = 0; i < count; i++) { var angle = Math.PI * 2 * i / count; var b = new EnemyBullet(); b.x = 2048 / 2; b.y = boxY + 40; b.vx = Math.cos(angle) * speed; b.vy = Math.sin(angle) * speed; enemyBullets.push(b); game.addChild(b); } } else if (patternType === 1) { // Sine wave bullets from both sides var sineCount = 4; // constant var sineSpeed = 4 + waveNum * 0.3; for (var i = 0; i < sineCount; i++) { var b = new EnemyBullet(); b.x = boxX + 40; b.y = boxY + 120 + i * 120; b.vx = sineSpeed; b.vy = 0; b.pattern = function (self, t) { self.x += self.vx; self.y += Math.sin((self.x + t * 2) / 80) * 5; }; enemyBullets.push(b); game.addChild(b); } for (var i = 0; i < sineCount; i++) { var b = new EnemyBullet(); b.x = boxX + boxWidth - 40; b.y = boxY + 120 + i * 120; b.vx = -sineSpeed; b.vy = 0; b.pattern = function (self, t) { self.x += self.vx; self.y += Math.sin((self.x + t * 2) / 80) * 5; }; enemyBullets.push(b); game.addChild(b); } } else if (patternType === 2) { // Falling zigzag bullets from above var zigzagCount = 8; // constant var zigzagSpeed = 4 + waveNum * 0.2; for (var i = 0; i < zigzagCount; i++) { var b = new EnemyBullet(); b.x = boxX + 80 + (boxWidth - 160) * (i / zigzagCount); b.y = boxY + 20; b.vx = 0; b.vy = zigzagSpeed; b.pattern = function (self, t) { self.y += self.vy; self.x += Math.sin(self.y / 60) * 3; }; enemyBullets.push(b); game.addChild(b); } } else if (patternType === 3) { // Spiral pattern from center (spawn a little further down) var spiralCount = 18; // constant var spiralSpawnY = boxY + 180; // moved further down from boxY + 40 var spiralSpeed = 3.5 + waveNum * 0.25; for (var i = 0; i < spiralCount; i++) { var b = new EnemyBullet(); b.x = 2048 / 2; b.y = spiralSpawnY; var baseAngle = Math.PI * 2 * i / spiralCount; b.pattern = function (angleOffset) { return function (self, t) { var speed = spiralSpeed; var angle = angleOffset + t * 0.07; self.x = 2048 / 2 + Math.cos(angle) * speed * t; self.y = spiralSpawnY + Math.sin(angle) * speed * t; }; }(baseAngle); enemyBullets.push(b); game.addChild(b); } } else if (patternType === 4) { // Aimed shots at the player (soul), with some spread var shots = 7; // constant var aimedSpeed = 5 + waveNum * 0.2; for (var i = 0; i < shots; i++) { var b = new EnemyBullet(); b.x = 2048 / 2; b.y = boxY + 40; // Aim at soul, add spread var dx = soul.x - b.x; var dy = soul.y - b.y; var angle = Math.atan2(dy, dx) + (i - (shots - 1) / 2) * 0.12; b.vx = Math.cos(angle) * aimedSpeed; b.vy = Math.sin(angle) * aimedSpeed; enemyBullets.push(b); game.addChild(b); } } // New attack style: FreezeBullets (special blue bullets) // Every 6th wave (patternType === 5) if (waveNum % 6 === 5) { var freezeCount = 7; var freezeSpeed = 4 + waveNum * 0.25; for (var i = 0; i < freezeCount; i++) { var b = new FreezeBullet(); // Spawn from top, spread horizontally b.x = boxX + 80 + (boxWidth - 160) * (i / (freezeCount - 1)); b.y = boxY + 20; b.vx = 0; b.vy = freezeSpeed; enemyBullets.push(b); game.addChild(b); } } } // Game state var waveNum = 0; var waveTimer = 0; var waveDuration = 240; // 4 seconds per wave // Invincibility after hit var invincibleTicks = 0; // Main update loop game.update = function () { // Track last soul position for freeze bullet logic if (typeof lastSoulX !== "number") lastSoulX = soul.x; if (typeof lastSoulY !== "number") lastSoulY = soul.y; var prevSoulX = soul.x; var prevSoulY = soul.y; // Update bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var b = enemyBullets[i]; b.update(); // Remove if out of box if (b.x < boxX - 80 || b.x > boxX + boxWidth + 80 || b.y < boxY - 80 || b.y > boxY + boxHeight + 80) { b.destroy(); enemyBullets.splice(i, 1); continue; } // Collision with soul if (invincibleTicks === 0 && b.intersects(soul)) { // If it's a FreezeBullet, only damage if player is not moving if (b.constructor && b.constructor === FreezeBullet) { // Check if player is moving: compare soul.x/y to lastSoulX/lastSoulY if (typeof lastSoulX === "number" && typeof lastSoulY === "number" && soul.x === lastSoulX && soul.y === lastSoulY) { // Player is NOT moving, do NOT damage // Optionally, flash blue to indicate safe LK.effects.flashObject(soul, 0x3399ff, 200); } else { // Player is moving, take damage hp--; soul.flash(); invincibleTicks = 60; // 1 second invincibility hpText.setText('HP: ' + hp); LK.effects.flashObject(soul, 0xffffff, 300); if (hp <= 0) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } } else { // Normal bullet: always damage hp--; soul.flash(); invincibleTicks = 60; // 1 second invincibility hpText.setText('HP: ' + hp); LK.effects.flashObject(soul, 0xffffff, 300); if (hp <= 0) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } } // Example: Decrease enemyHP for demonstration (remove this in real game, or connect to your attack logic) // if (someCondition) { enemyHP--; } enemyHealthBar.width = (enemyHealthBarWidth - 8) * Math.max(0, enemyHP) / enemyMaxHP; } // Invincibility timer if (invincibleTicks > 0) { invincibleTicks--; } // Wave logic waveTimer++; if (waveTimer >= waveDuration) { waveNum++; score++; scoreText.setText('WAVES: ' + score); waveTimer = 0; spawnWave(waveNum); } // After wave 10, allow player to attack sans (enemy) if (waveNum >= 10) { // Enable player attack mode if (!game.playerAttackEnabled) { game.playerAttackEnabled = true; // Show a visual cue or instruction (optional) // e.g. flash enemy or show "Tap enemy to attack!" LK.effects.flashObject(enemy, 0xffff00, 600); } // Listen for tap on enemy to attack if (!enemy._attackHandlerAttached) { enemy._attackHandlerAttached = true; enemy.down = function (x, y, obj) { // Only allow attack if player attack is enabled and enemy is alive if (game.playerAttackEnabled && enemyHP > 0) { enemyHP--; LK.getSound('sans').play(); LK.effects.flashObject(enemy, 0xffffff, 120); enemyHealthBar.width = (enemyHealthBarWidth - 8) * Math.max(0, enemyHP) / enemyMaxHP; if (enemyHP <= 0) { // Player wins! LK.effects.flashScreen(0x00ff00, 1000); LK.showYouWin(); } } }; } } // Update lastSoulX and lastSoulY for next frame lastSoulX = prevSoulX; lastSoulY = prevSoulY; }; // Start first wave spawnWave(waveNum);
===================================================================
--- original.js
+++ change.js
@@ -62,9 +62,14 @@
// Defensive: ensure self.patternTick is a number and not a thenable before incrementing (fix for s.apply(...).then is not a function)
if (typeof self.patternTick !== "number" || self.patternTick && typeof self.patternTick.then === "function") {
self.patternTick = 1;
} else {
- self.patternTick = Number(self.patternTick) + 1;
+ // Defensive: ensure self.patternTick is a number and not a thenable before incrementing (fix for s.apply(...).then is not a function)
+ if (typeof self.patternTick !== "number" || self.patternTick && typeof self.patternTick.then === "function") {
+ self.patternTick = 1;
+ } else {
+ self.patternTick = Number(self.patternTick) + 1;
+ }
}
}
}
}
@@ -167,10 +172,10 @@
/****
* Game Code
****/
-// Tween plugin for movement and effects
// Game area (the "box" where the soul can move)
+// Tween plugin for movement and effects
function _typeof12(o) {
"@babel/helpers - typeof";
return _typeof12 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;