User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 60
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 61
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 63
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 61
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 65
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 65
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 65
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 63
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 62
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 60
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 59
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 59
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 59
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 59
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.y += self.vy;' Line Number: 70
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 58
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 58
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 58
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 58
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 58
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.y += self.vy;' Line Number: 66
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 58
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 55
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 59
User prompt
Please fix the bug: 's.apply(...).then is not a function' in or related to this line: 'self.patternTick += 1;' Line Number: 59
/****
* 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);
if (typeof self.patternTick !== "number" || _typeof2(self.patternTick) === "object" && self.patternTick !== null && typeof self.patternTick.then === "function") self.patternTick = 0;
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" && !(_typeof2(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" || _typeof2(self.patternTick) === "object" && self.patternTick !== null && typeof self.patternTick.then === "function") self.patternTick = 0;
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 _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);
}
// Update lastSoulX and lastSoulY for next frame
lastSoulX = prevSoulX;
lastSoulY = prevSoulY;
};
// Start first wave
spawnWave(waveNum); ===================================================================
--- original.js
+++ change.js
@@ -84,9 +84,9 @@
} else {
if (typeof self.vx === "number") {
self.x += self.vx;
}
- if (typeof self.vy === "number") {
+ if (typeof self.vy === "number" && !(_typeof2(self.vy) === "object" && self.vy !== null && typeof self.vy.then === "function")) {
self.y += self.vy;
}
}
};
@@ -137,10 +137,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 _typeof3(o) {
"@babel/helpers - typeof";
return _typeof3 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;