User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'down')' in or related to this line: 'coin.down = function () {' Line Number: 688
User prompt
Chance Logic: A random value is generated for each enemy defeat. If the random value is less than 0.5, a silver coin is dropped. If it is between 0.5 and 0.6, a gold coin is dropped. Otherwise, nothing is dropped.
Code edit (2 edits merged)
Please save this source code
User prompt
change the logic to 50% chance to drop a silver_coin, 10% chance to drop a gold coin and 40% chance to drop no coins
Code edit (2 edits merged)
Please save this source code
User prompt
change the logic to 50% chance to drop a silver_coin, 10% chance to drop a gold coin and 40% chance to drop nothing
User prompt
change the logic to 50% chance to drop a silver_coin, 10% chance to drop a gold coin and 40% chance to drop nothing
User prompt
add a logic that when a coin is pressed, it flies towards the player and adds 5 points to the score if its a silver_coin and 10 points if its a gold coin
User prompt
when an enemy is killed, it has a 90% chance to drop a silver_coin that is worth 5 points to the score when picked up and 10% chance to drop a gold_coin that is worth 10 points to the score when picked up, do it
User prompt
can you do 2.5/3
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: setTimeout is not a function' in or related to this line: 'attackTimeout = setTimeout(function () {' Line Number: 423
Code edit (3 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: setTimeout is not a function' in or related to this line: 'attackTimeout = setTimeout(function () {' Line Number: 401
Code edit (3 edits merged)
Please save this source code
User prompt
play throwsnd when player_throw is instantiated
User prompt
Please fix the bug: 'Uncaught TypeError: setTimeout is not a function' in or related to this line: 'attackTimeout = setTimeout(function () {' Line Number: 396
Code edit (1 edits merged)
Please save this source code
User prompt
make player_throw move faster
User prompt
cloudsmoke alpha to 75%
User prompt
0.5 seconds instead of 0.1
User prompt
make a tween out of cloudsmoke, add a pop and a disappear after 0.1 seconds ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
add 50% transparency to cloud smoke
User prompt
cloudsmoke should instantiate where player_throw appears which is next to the player_idle, why is it not working? fix it
User prompt
instantiate cloudsmoke where player_throw is created
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Shape = Container.expand(function (options) { var self = Container.call(this); self.attachAsset('shape', { width: options.width, height: options.height, anchorX: options.anchorX || 0, anchorY: options.anchorY || 0, color: options.color || 0x66ff00, alpha: typeof options.alpha === 'number' ? options.alpha : 0 // invisible shape }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ /**** * Global Variables ****/ var jumpColGlobal = null; // For projectile input tracking var isPressHeld = false; var pressHoldStartTime = 0; var pressDownX = 0; var pressDownY = 0; var attackTimeout = null; // To delay melee attack /**** * Score Setup ****/ var score = 0; var scoreTxt; // container for the score text function updateScoreDisplay() { game.removeChild(scoreTxt); scoreTxt = createScoreText(score); scoreTxt.scaleX = 1.0; scoreTxt.scaleY = 1.0; game.addChild(scoreTxt); tween(scoreTxt, { scaleX: 1.5, scaleY: 1.5 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { tween(scoreTxt, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100, easing: tween.easeIn }); } }); } function incrementScore() { score++; updateScoreDisplay(); } function createScoreText(value) { var shadow = new Text2(String(value), { size: 600, fill: 0x000000, fontFamily: "Arial" }); shadow.name = "shadow"; shadow.anchor.set(0.5, 0); shadow.x = 4; shadow.y = 4; var main = new Text2(String(value), { size: 600, fill: 0xFF69B4, fontFamily: "Arial" }); main.name = "main"; main.anchor.set(0.5, 0); var container = new Container(); container.name = "scoreTxt"; container.x = 1024; container.y = 50; container.addChild(shadow); container.addChild(main); return container; } scoreTxt = createScoreText(score); scoreTxt.scaleX = 1.0; scoreTxt.scaleY = 1.0; LK.playMusic('bgm', { loop: true }); var bg01 = LK.getAsset('bg01', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366 }); game.addChild(bg01); game.addChild(scoreTxt); /**** * Petals ****/ var petals = []; for (var i = 0; i < 50; i++) { var petal = new Container(); petal.attachAsset('petals', { anchorX: 0.5, anchorY: 0.5, rotation: Math.random() * Math.PI * 2 }); petal.x = Math.random() * 2048; petal.y = Math.random() * 2732; petal.speedY = Math.random() * 2 + 1; petal.speedX = Math.random() * 2 - 1; petal.update = function () { this.y += this.speedY; this.x += this.speedX; if (this.y > 2732) { this.y = -50; this.x = Math.random() * 2048; } }; petals.push(petal); game.addChild(petal); } /**** * Player Setup ****/ var player = new Container(); var visualContainer = new Container(); visualContainer.name = 'visual'; var playerSprite = visualContainer.attachAsset('player_idle', { anchorX: 0.5, anchorY: 0.5 }); player.addChild(visualContainer); player.x = 1024; player.y = 2732 - 250; game.addChild(player); /**** * Idle Animations ****/ function startBreathingAnimation() { tween(player, { scaleX: 1.05, scaleY: 1.05 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { tween(player, { scaleX: 1.0, scaleY: 1.0 }, { duration: 1000, easing: tween.easeInOut, onFinish: startBreathingAnimation }); } }); } function startTiltAnimation() { tween(player, { rotation: Math.PI / 32 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { tween(player, { rotation: -Math.PI / 32 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { tween(player, { rotation: 0 }, { duration: 500, easing: tween.easeInOut, onFinish: startTiltAnimation }); } }); } }); } startBreathingAnimation(); startTiltAnimation(); /**** * Attack Collider ****/ var attackCol = LK.getAsset('attackcol', { anchorX: 0.5, anchorY: 0.5, alpha: 0.75 }); game.addChild(attackCol); attackCol.visible = false; attackCol.alpha = 0; /**** * Swap Player Sprite ****/ function swapPlayerVisual(newVisualId, x, y) { var flip = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1; var onDone = arguments.length > 4 ? arguments[4] : undefined; var visualContainer = player.findChildByName('visual'); if (!visualContainer) { visualContainer = new Container(); visualContainer.name = 'visual'; player.addChild(visualContainer); } else { visualContainer.removeChildAt(0); } playerSprite = visualContainer.attachAsset(newVisualId, { anchorX: 0.5, anchorY: 0.5 }); visualContainer.scaleX = flip; player.x = x; player.y = y; if (newVisualId === 'player_jump') { flip = Math.random() < 0.5 ? -1 : 1; visualContainer.scaleX = flip; jumpColGlobal = LK.getAsset('jumpcol', { anchorX: 0.5, anchorY: 0.5, x: x, y: y + player.height / 2, alpha: 0 }); game.addChild(jumpColGlobal); tween(jumpColGlobal, { y: jumpColGlobal.y - 600 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(jumpColGlobal, { y: 2732 - 250 + player.height / 2 }, { duration: 300, easing: tween.bounceOut, onFinish: function onFinish() { jumpColGlobal.destroy(); jumpColGlobal = null; } }); } }); } if (typeof onDone === 'function') { if (newVisualId === 'player_idle') { startBreathingAnimation(); startTiltAnimation(); } onDone(); } } /**** * Input Logic ****/ var isSequenceRunning = false; var isJumping = false; var playerState = 'idle'; game.down = function (x, y) { if (isSequenceRunning) { return; } // Record press info for projectile later. isPressHeld = true; pressHoldStartTime = Date.now(); pressDownX = x; pressDownY = y; // If tapped in top 2/3, jump immediately. if (y < 2732 * 2 / 3 && !isJumping) { isJumping = true; LK.getSound('hup').play(); swapPlayerVisual('player_jump', player.x, player.y); // (Jump dust and tweening effects here remain unchanged.) for (var i = 0; i < 10; i++) { var p = LK.getAsset('dust', { anchorX: 0.5, anchorY: 0.5, x: player.x + (Math.random() * 100 - 50), y: player.y + (Math.random() * 100 - 50) }); game.addChild(p); tween(p, { alpha: 0, x: p.x + (Math.random() * 200 - 100), y: p.y - Math.random() * 200 }, { duration: 500, onFinish: function onFinish() { p.destroy(); } }); } tween(player, { y: player.y - 600 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(player, { y: 2732 - 250 }, { duration: 300, easing: tween.bounceOut, onFinish: function onFinish() { for (var j = 0; j < 10; j++) { var pp = LK.getAsset('dust', { anchorX: 0.5, anchorY: 0.5, x: player.x + (Math.random() * 100 - 50), y: player.y + (Math.random() * 100 - 50) }); game.addChild(pp); tween(pp, { alpha: 0, x: pp.x + (Math.random() * 200 - 100), y: pp.y + Math.random() * 200 }, { duration: 500, onFinish: function onFinish() { pp.destroy(); } }); } isJumping = false; swapPlayerVisual('player_idle', 1024, 2732 - 250, 1, function () { startBreathingAnimation(); startTiltAnimation(); }); var v = player.findChildByName('visual'); if (v) { var dir = v.scaleX < 0 ? -1 : 1; tween(v, { scaleX: dir * 1.3, scaleY: 1.3 }, { duration: 50, onFinish: function onFinish() { tween(v, { scaleX: dir * 1.0, scaleY: 1.0 }, { duration: 100 }); } }); } } }); } }); return; } // Otherwise, if tapped in the bottom 1/3, delay the melee attack. attackTimeout = LK.setTimeout(function () { if (isPressHeld) { // Only execute if the press hasn't become a long press. isSequenceRunning = true; var flip = x < 1024 ? -1 : 1; swapPlayerVisual('player_attackf01', 1024, 2732 - 250, flip); LK.getSound('retroslash').play(); var vis = player.findChildByName('visual'); if (vis) { tween(vis, { scaleX: flip * 1.3, scaleY: 1.3 }, { duration: 50, onFinish: function onFinish() { tween(vis, { scaleX: flip * 1.0, scaleY: 1.0 }, { duration: 100 }); } }); } LK.setTimeout(function () { swapPlayerVisual('player_attackf02', 1024, 2732 - 250, flip); attackCol.width = 180; attackCol.height = 180; attackCol.x = flip === -1 ? 874 : 1174; attackCol.y = 2732 - 250; attackCol.scaleX = flip; attackCol.visible = true; LK.setTimeout(function () { if (attackCol) { attackCol.visible = false; } swapPlayerVisual('player_idle', 1024, 2732 - 250, 1, function () { startBreathingAnimation(); startTiltAnimation(); }); isSequenceRunning = false; playerState = 'idle'; }, 250); }, 250); } }, 250); }; /**** * game.up: Cancel melee attack if long press is detected. ****/ game.up = function (x, y) { if (isPressHeld) { var holdDuration = Date.now() - pressHoldStartTime; if (holdDuration > 500 && attackTimeout) { clearTimeout(attackTimeout); attackTimeout = null; } } isPressHeld = false; pressHoldStartTime = 0; }; /**** * Enemies Array + Spawn ****/ var enemies = []; function spawnEnemy() { var e = new Container(); var hitbox = new Shape({ width: 200, height: 209, anchorX: 0.5, anchorY: 0.5, color: 0x00FF00, alpha: 0 }); hitbox.x = 0; hitbox.y = 0; e.addChild(hitbox); var gfx = e.attachAsset('enemy01', { anchorX: 0.5, anchorY: 0.5 }); var fromLeft = Math.random() < 0.5; e.x = fromLeft ? -gfx.width / 2 : 2048 + gfx.width / 2; e.y = 2732 - 225; e.speedX = fromLeft ? Math.random() * 4 + 2 : -(Math.random() * 4 + 2); gfx.scaleX = fromLeft ? 1 : -1; var baseY = e.y; function bounce() { tween(e, { y: baseY - 50 }, { duration: 500, easing: tween.bounceInOut, onFinish: function onFinish() { tween(e, { y: baseY }, { duration: 500, easing: tween.bounceInOut, onFinish: bounce }); } }); } bounce(); enemies.push(e); game.addChild(e); } LK.setInterval(spawnEnemy, Math.random() * 1500 + 1000); /**** * NEW CODE: Projectile Logic ****/ var projectiles = []; function spawnProjectile(targetX, targetY) { var proj = new Container(); proj.attachAsset('player_throw', { anchorX: 0.5, anchorY: 0.5 }); proj.x = player.x; proj.y = player.y; // Optionally, create a cloudsmoke effect. var cloudSmoke = LK.getAsset('cloudsmoke', { anchorX: 0.5, anchorY: 0.5, x: proj.x, y: proj.y, alpha: 0.75 }); game.addChild(cloudSmoke); tween(cloudSmoke, { scaleX: 1.5, scaleY: 1.5, alpha: 0 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { cloudSmoke.destroy(); } }); // Calculate direction. var dx = targetX - player.x; var dy = targetY - player.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist !== 0) { dx /= dist; dy /= dist; } var speed = 25; proj.vx = dx * speed; proj.vy = dy * speed; proj.scaleX = targetX < player.x ? -1 : 1; proj.distanceTraveled = 0; proj.maxDistance = 1000; projectiles.push(proj); game.addChild(proj); } /**** * Main Update ****/ game.update = function () { // Check hold duration for projectile. if (isPressHeld) { var holdDuration = Date.now() - pressHoldStartTime; if (holdDuration > 500) { console.log("Long press detected, spawn projectile!"); isPressHeld = false; spawnProjectile(pressDownX, pressDownY); } } // Update projectiles. for (var p = projectiles.length - 1; p >= 0; p--) { var proj = projectiles[p]; proj.x += proj.vx; proj.y += proj.vy; var stepDist = Math.sqrt(proj.vx * proj.vx + proj.vy * proj.vy); proj.distanceTraveled += stepDist; if (proj.distanceTraveled > proj.maxDistance) { projectiles.splice(p, 1); proj.destroy(); continue; } if (proj.x < -100 || proj.x > 2148 || proj.y < -100 || proj.y > 2832) { projectiles.splice(p, 1); proj.destroy(); continue; } // Check collision with enemies. for (var ei = enemies.length - 1; ei >= 0; ei--) { var enemy = enemies[ei]; if (proj.intersects(enemy)) { // 'throw' attack type for projectile. handleEnemyHit(enemy, ei, 'throw'); projectiles.splice(p, 1); proj.destroy(); break; } } } // Update enemies. for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; e.x += e.speedX; if (e.x < -300 || e.x > 2048 + 300) { var index = enemies.indexOf(e); if (index !== -1) { enemies.splice(index, 1); } e.destroy(); continue; } // Check collision with jump collider. if (jumpColGlobal && jumpColGlobal.visible && e.intersects(jumpColGlobal)) { handleEnemyJumpHit(e, i); continue; } // Check collision with melee attack collider. if (attackCol.visible && e.intersects(attackCol)) { handleEnemyHit(e, i, 'melee'); } // Check collision with player (game over). if (!isJumping && !attackCol.visible && e.intersects(player)) { LK.showGameOver(); } } }; /**** * Enemy Hit Logic (Melee or Throw) ****/ function handleEnemyHit(enemy, index, attackType) { if (!enemies.includes(enemy)) { return; } LK.getSound('slimedeath').play(); if (enemy.bounceTween && typeof enemy.bounceTween.cancel === 'function') { enemy.bounceTween.cancel(); } tween(enemy, { tint: 0xFF0000 }, { duration: 0, onFinish: function onFinish() { tween(enemy, { scaleX: 1.3, scaleY: 1.3 }, { duration: 50, onFinish: function onFinish() { tween(enemy, { scaleX: 0.5, scaleY: 0.5, alpha: 0 }, { duration: 100, onFinish: function onFinish() { var idx = enemies.indexOf(enemy); if (idx !== -1) { enemies.splice(idx, 1); } enemy.destroy(); if (!enemy.scoreCounted) { if (attackType === 'melee') { score += 2; } else if (attackType === 'throw') { score += 1; } else { score++; } updateScoreDisplay(); enemy.scoreCounted = true; } } }); } }); } }); } /**** * Enemy Hit Logic for Jump Collider ****/ function handleEnemyJumpHit(enemy, index) { if (!enemies.includes(enemy)) { return; } LK.getSound('boing').play(); if (enemy.bounceTween && typeof enemy.bounceTween.cancel === 'function') { enemy.bounceTween.cancel(); } tween(enemy, { tint: 0xFF0000 }, { duration: 0, onFinish: function onFinish() { var targetX = enemy.x < 1024 ? -300 : 2048 + 300; var targetY = enemy.y - 600; tween(enemy, { x: targetX, y: targetY, alpha: 0 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { var idx = enemies.indexOf(enemy); if (idx !== -1) { enemies.splice(idx, 1); } enemy.destroy(); if (!enemy.scoreCounted) { score += 3; updateScoreDisplay(); enemy.scoreCounted = true; } } }); } }); } /**** * findChildByName Helper ****/ Container.prototype.findChildByName = function (name) { for (var i = 0; i < this.children.length; i++) { if (this.children[i].name === name) { return this.children[i]; } } return null; }; /**** * game.up: Reset Press Info ****/ game.up = function (x, y) { if (isPressHeld) { var holdDuration = Date.now() - pressHoldStartTime; if (holdDuration > 500 && attackTimeout) { clearTimeout(attackTimeout); attackTimeout = null; } } isPressHeld = false; pressHoldStartTime = 0; };
===================================================================
--- original.js
+++ change.js
@@ -32,29 +32,247 @@
/****
* Global Variables
****/
var jumpColGlobal = null;
+// For projectile input tracking
var isPressHeld = false;
var pressHoldStartTime = 0;
var pressDownX = 0;
var pressDownY = 0;
-var attackTimeout = null; // NEW: timeout ID for delayed melee attack
+var attackTimeout = null; // To delay melee attack
/****
* Score Setup
****/
-// [score setup code remains unchanged...]
+var score = 0;
+var scoreTxt; // container for the score text
+function updateScoreDisplay() {
+ game.removeChild(scoreTxt);
+ scoreTxt = createScoreText(score);
+ scoreTxt.scaleX = 1.0;
+ scoreTxt.scaleY = 1.0;
+ game.addChild(scoreTxt);
+ tween(scoreTxt, {
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 100,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(scoreTxt, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 100,
+ easing: tween.easeIn
+ });
+ }
+ });
+}
+function incrementScore() {
+ score++;
+ updateScoreDisplay();
+}
+function createScoreText(value) {
+ var shadow = new Text2(String(value), {
+ size: 600,
+ fill: 0x000000,
+ fontFamily: "Arial"
+ });
+ shadow.name = "shadow";
+ shadow.anchor.set(0.5, 0);
+ shadow.x = 4;
+ shadow.y = 4;
+ var main = new Text2(String(value), {
+ size: 600,
+ fill: 0xFF69B4,
+ fontFamily: "Arial"
+ });
+ main.name = "main";
+ main.anchor.set(0.5, 0);
+ var container = new Container();
+ container.name = "scoreTxt";
+ container.x = 1024;
+ container.y = 50;
+ container.addChild(shadow);
+ container.addChild(main);
+ return container;
+}
+scoreTxt = createScoreText(score);
+scoreTxt.scaleX = 1.0;
+scoreTxt.scaleY = 1.0;
+LK.playMusic('bgm', {
+ loop: true
+});
+var bg01 = LK.getAsset('bg01', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 1366
+});
+game.addChild(bg01);
+game.addChild(scoreTxt);
/****
-* Petals, Player Setup, Idle Animations, Attack Collider
+* Petals
****/
-// [these sections remain unchanged...]
+var petals = [];
+for (var i = 0; i < 50; i++) {
+ var petal = new Container();
+ petal.attachAsset('petals', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ rotation: Math.random() * Math.PI * 2
+ });
+ petal.x = Math.random() * 2048;
+ petal.y = Math.random() * 2732;
+ petal.speedY = Math.random() * 2 + 1;
+ petal.speedX = Math.random() * 2 - 1;
+ petal.update = function () {
+ this.y += this.speedY;
+ this.x += this.speedX;
+ if (this.y > 2732) {
+ this.y = -50;
+ this.x = Math.random() * 2048;
+ }
+ };
+ petals.push(petal);
+ game.addChild(petal);
+}
/****
-* Swap player sprite
+* Player Setup
****/
-// [swapPlayerVisual remains unchanged]
+var player = new Container();
+var visualContainer = new Container();
+visualContainer.name = 'visual';
+var playerSprite = visualContainer.attachAsset('player_idle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+});
+player.addChild(visualContainer);
+player.x = 1024;
+player.y = 2732 - 250;
+game.addChild(player);
/****
-* Input logic
+* Idle Animations
****/
-// Modified game.down: Delay melee attack so that a long press can cancel it.
+function startBreathingAnimation() {
+ tween(player, {
+ scaleX: 1.05,
+ scaleY: 1.05
+ }, {
+ duration: 1000,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(player, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 1000,
+ easing: tween.easeInOut,
+ onFinish: startBreathingAnimation
+ });
+ }
+ });
+}
+function startTiltAnimation() {
+ tween(player, {
+ rotation: Math.PI / 32
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(player, {
+ rotation: -Math.PI / 32
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(player, {
+ rotation: 0
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: startTiltAnimation
+ });
+ }
+ });
+ }
+ });
+}
+startBreathingAnimation();
+startTiltAnimation();
+/****
+* Attack Collider
+****/
+var attackCol = LK.getAsset('attackcol', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.75
+});
+game.addChild(attackCol);
+attackCol.visible = false;
+attackCol.alpha = 0;
+/****
+* Swap Player Sprite
+****/
+function swapPlayerVisual(newVisualId, x, y) {
+ var flip = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
+ var onDone = arguments.length > 4 ? arguments[4] : undefined;
+ var visualContainer = player.findChildByName('visual');
+ if (!visualContainer) {
+ visualContainer = new Container();
+ visualContainer.name = 'visual';
+ player.addChild(visualContainer);
+ } else {
+ visualContainer.removeChildAt(0);
+ }
+ playerSprite = visualContainer.attachAsset(newVisualId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ visualContainer.scaleX = flip;
+ player.x = x;
+ player.y = y;
+ if (newVisualId === 'player_jump') {
+ flip = Math.random() < 0.5 ? -1 : 1;
+ visualContainer.scaleX = flip;
+ jumpColGlobal = LK.getAsset('jumpcol', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: x,
+ y: y + player.height / 2,
+ alpha: 0
+ });
+ game.addChild(jumpColGlobal);
+ tween(jumpColGlobal, {
+ y: jumpColGlobal.y - 600
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(jumpColGlobal, {
+ y: 2732 - 250 + player.height / 2
+ }, {
+ duration: 300,
+ easing: tween.bounceOut,
+ onFinish: function onFinish() {
+ jumpColGlobal.destroy();
+ jumpColGlobal = null;
+ }
+ });
+ }
+ });
+ }
+ if (typeof onDone === 'function') {
+ if (newVisualId === 'player_idle') {
+ startBreathingAnimation();
+ startTiltAnimation();
+ }
+ onDone();
+ }
+}
+/****
+* Input Logic
+****/
var isSequenceRunning = false;
var isJumping = false;
var playerState = 'idle';
game.down = function (x, y) {
@@ -65,21 +283,97 @@
isPressHeld = true;
pressHoldStartTime = Date.now();
pressDownX = x;
pressDownY = y;
- // If in top 2/3, do jump immediately.
+ // If tapped in top 2/3, jump immediately.
if (y < 2732 * 2 / 3 && !isJumping) {
isJumping = true;
LK.getSound('hup').play();
swapPlayerVisual('player_jump', player.x, player.y);
- // [jump dust effect and tweening code... remains unchanged]
+ // (Jump dust and tweening effects here remain unchanged.)
+ for (var i = 0; i < 10; i++) {
+ var p = LK.getAsset('dust', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: player.x + (Math.random() * 100 - 50),
+ y: player.y + (Math.random() * 100 - 50)
+ });
+ game.addChild(p);
+ tween(p, {
+ alpha: 0,
+ x: p.x + (Math.random() * 200 - 100),
+ y: p.y - Math.random() * 200
+ }, {
+ duration: 500,
+ onFinish: function onFinish() {
+ p.destroy();
+ }
+ });
+ }
+ tween(player, {
+ y: player.y - 600
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(player, {
+ y: 2732 - 250
+ }, {
+ duration: 300,
+ easing: tween.bounceOut,
+ onFinish: function onFinish() {
+ for (var j = 0; j < 10; j++) {
+ var pp = LK.getAsset('dust', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: player.x + (Math.random() * 100 - 50),
+ y: player.y + (Math.random() * 100 - 50)
+ });
+ game.addChild(pp);
+ tween(pp, {
+ alpha: 0,
+ x: pp.x + (Math.random() * 200 - 100),
+ y: pp.y + Math.random() * 200
+ }, {
+ duration: 500,
+ onFinish: function onFinish() {
+ pp.destroy();
+ }
+ });
+ }
+ isJumping = false;
+ swapPlayerVisual('player_idle', 1024, 2732 - 250, 1, function () {
+ startBreathingAnimation();
+ startTiltAnimation();
+ });
+ var v = player.findChildByName('visual');
+ if (v) {
+ var dir = v.scaleX < 0 ? -1 : 1;
+ tween(v, {
+ scaleX: dir * 1.3,
+ scaleY: 1.3
+ }, {
+ duration: 50,
+ onFinish: function onFinish() {
+ tween(v, {
+ scaleX: dir * 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 100
+ });
+ }
+ });
+ }
+ }
+ });
+ }
+ });
return;
}
- // Otherwise, assume attack if in bottom 1/3.
- // Instead of immediately performing melee attack, delay it.
- attackTimeout = setTimeout(function () {
- // Only execute attack if the press was not long enough for projectile.
+ // Otherwise, if tapped in the bottom 1/3, delay the melee attack.
+ attackTimeout = LK.setTimeout(function () {
if (isPressHeld) {
+ // Only execute if the press hasn't become a long press.
isSequenceRunning = true;
var flip = x < 1024 ? -1 : 1;
swapPlayerVisual('player_attackf01', 1024, 2732 - 250, flip);
LK.getSound('retroslash').play();
@@ -120,15 +414,14 @@
playerState = 'idle';
}, 250);
}, 250);
}
- }, 250); // Delay melee attack for 250ms.
+ }, 250);
};
/****
-* game.up to reset press
+* game.up: Cancel melee attack if long press is detected.
****/
game.up = function (x, y) {
- // When the press is released, cancel the melee attack if the press was long.
if (isPressHeld) {
var holdDuration = Date.now() - pressHoldStartTime;
if (holdDuration > 500 && attackTimeout) {
clearTimeout(attackTimeout);
@@ -138,14 +431,288 @@
isPressHeld = false;
pressHoldStartTime = 0;
};
/****
-* Enemies, Projectile Logic, and Main update
+* Enemies Array + Spawn
****/
-// [The remainder of your code (enemy spawn, projectile logic, enemy hit functions, etc.) remains unchanged.]
-/* --- For brevity, the rest of the code remains as in your original version, including:
- - spawnEnemy
- - projectile logic (spawnProjectile)
- - game.update loop that checks hold duration (for long press), updates projectiles, enemies, etc.
- - handleEnemyHit and handleEnemyJumpHit
- - findChildByName helper
-*/
\ No newline at end of file
+var enemies = [];
+function spawnEnemy() {
+ var e = new Container();
+ var hitbox = new Shape({
+ width: 200,
+ height: 209,
+ anchorX: 0.5,
+ anchorY: 0.5,
+ color: 0x00FF00,
+ alpha: 0
+ });
+ hitbox.x = 0;
+ hitbox.y = 0;
+ e.addChild(hitbox);
+ var gfx = e.attachAsset('enemy01', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var fromLeft = Math.random() < 0.5;
+ e.x = fromLeft ? -gfx.width / 2 : 2048 + gfx.width / 2;
+ e.y = 2732 - 225;
+ e.speedX = fromLeft ? Math.random() * 4 + 2 : -(Math.random() * 4 + 2);
+ gfx.scaleX = fromLeft ? 1 : -1;
+ var baseY = e.y;
+ function bounce() {
+ tween(e, {
+ y: baseY - 50
+ }, {
+ duration: 500,
+ easing: tween.bounceInOut,
+ onFinish: function onFinish() {
+ tween(e, {
+ y: baseY
+ }, {
+ duration: 500,
+ easing: tween.bounceInOut,
+ onFinish: bounce
+ });
+ }
+ });
+ }
+ bounce();
+ enemies.push(e);
+ game.addChild(e);
+}
+LK.setInterval(spawnEnemy, Math.random() * 1500 + 1000);
+/****
+* NEW CODE: Projectile Logic
+****/
+var projectiles = [];
+function spawnProjectile(targetX, targetY) {
+ var proj = new Container();
+ proj.attachAsset('player_throw', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ proj.x = player.x;
+ proj.y = player.y;
+ // Optionally, create a cloudsmoke effect.
+ var cloudSmoke = LK.getAsset('cloudsmoke', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: proj.x,
+ y: proj.y,
+ alpha: 0.75
+ });
+ game.addChild(cloudSmoke);
+ tween(cloudSmoke, {
+ scaleX: 1.5,
+ scaleY: 1.5,
+ alpha: 0
+ }, {
+ duration: 500,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ cloudSmoke.destroy();
+ }
+ });
+ // Calculate direction.
+ var dx = targetX - player.x;
+ var dy = targetY - player.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist !== 0) {
+ dx /= dist;
+ dy /= dist;
+ }
+ var speed = 25;
+ proj.vx = dx * speed;
+ proj.vy = dy * speed;
+ proj.scaleX = targetX < player.x ? -1 : 1;
+ proj.distanceTraveled = 0;
+ proj.maxDistance = 1000;
+ projectiles.push(proj);
+ game.addChild(proj);
+}
+/****
+* Main Update
+****/
+game.update = function () {
+ // Check hold duration for projectile.
+ if (isPressHeld) {
+ var holdDuration = Date.now() - pressHoldStartTime;
+ if (holdDuration > 500) {
+ console.log("Long press detected, spawn projectile!");
+ isPressHeld = false;
+ spawnProjectile(pressDownX, pressDownY);
+ }
+ }
+ // Update projectiles.
+ for (var p = projectiles.length - 1; p >= 0; p--) {
+ var proj = projectiles[p];
+ proj.x += proj.vx;
+ proj.y += proj.vy;
+ var stepDist = Math.sqrt(proj.vx * proj.vx + proj.vy * proj.vy);
+ proj.distanceTraveled += stepDist;
+ if (proj.distanceTraveled > proj.maxDistance) {
+ projectiles.splice(p, 1);
+ proj.destroy();
+ continue;
+ }
+ if (proj.x < -100 || proj.x > 2148 || proj.y < -100 || proj.y > 2832) {
+ projectiles.splice(p, 1);
+ proj.destroy();
+ continue;
+ }
+ // Check collision with enemies.
+ for (var ei = enemies.length - 1; ei >= 0; ei--) {
+ var enemy = enemies[ei];
+ if (proj.intersects(enemy)) {
+ // 'throw' attack type for projectile.
+ handleEnemyHit(enemy, ei, 'throw');
+ projectiles.splice(p, 1);
+ proj.destroy();
+ break;
+ }
+ }
+ }
+ // Update enemies.
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var e = enemies[i];
+ e.x += e.speedX;
+ if (e.x < -300 || e.x > 2048 + 300) {
+ var index = enemies.indexOf(e);
+ if (index !== -1) {
+ enemies.splice(index, 1);
+ }
+ e.destroy();
+ continue;
+ }
+ // Check collision with jump collider.
+ if (jumpColGlobal && jumpColGlobal.visible && e.intersects(jumpColGlobal)) {
+ handleEnemyJumpHit(e, i);
+ continue;
+ }
+ // Check collision with melee attack collider.
+ if (attackCol.visible && e.intersects(attackCol)) {
+ handleEnemyHit(e, i, 'melee');
+ }
+ // Check collision with player (game over).
+ if (!isJumping && !attackCol.visible && e.intersects(player)) {
+ LK.showGameOver();
+ }
+ }
+};
+/****
+* Enemy Hit Logic (Melee or Throw)
+****/
+function handleEnemyHit(enemy, index, attackType) {
+ if (!enemies.includes(enemy)) {
+ return;
+ }
+ LK.getSound('slimedeath').play();
+ if (enemy.bounceTween && typeof enemy.bounceTween.cancel === 'function') {
+ enemy.bounceTween.cancel();
+ }
+ tween(enemy, {
+ tint: 0xFF0000
+ }, {
+ duration: 0,
+ onFinish: function onFinish() {
+ tween(enemy, {
+ scaleX: 1.3,
+ scaleY: 1.3
+ }, {
+ duration: 50,
+ onFinish: function onFinish() {
+ tween(enemy, {
+ scaleX: 0.5,
+ scaleY: 0.5,
+ alpha: 0
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ var idx = enemies.indexOf(enemy);
+ if (idx !== -1) {
+ enemies.splice(idx, 1);
+ }
+ enemy.destroy();
+ if (!enemy.scoreCounted) {
+ if (attackType === 'melee') {
+ score += 2;
+ } else if (attackType === 'throw') {
+ score += 1;
+ } else {
+ score++;
+ }
+ updateScoreDisplay();
+ enemy.scoreCounted = true;
+ }
+ }
+ });
+ }
+ });
+ }
+ });
+}
+/****
+* Enemy Hit Logic for Jump Collider
+****/
+function handleEnemyJumpHit(enemy, index) {
+ if (!enemies.includes(enemy)) {
+ return;
+ }
+ LK.getSound('boing').play();
+ if (enemy.bounceTween && typeof enemy.bounceTween.cancel === 'function') {
+ enemy.bounceTween.cancel();
+ }
+ tween(enemy, {
+ tint: 0xFF0000
+ }, {
+ duration: 0,
+ onFinish: function onFinish() {
+ var targetX = enemy.x < 1024 ? -300 : 2048 + 300;
+ var targetY = enemy.y - 600;
+ tween(enemy, {
+ x: targetX,
+ y: targetY,
+ alpha: 0
+ }, {
+ duration: 200,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ var idx = enemies.indexOf(enemy);
+ if (idx !== -1) {
+ enemies.splice(idx, 1);
+ }
+ enemy.destroy();
+ if (!enemy.scoreCounted) {
+ score += 3;
+ updateScoreDisplay();
+ enemy.scoreCounted = true;
+ }
+ }
+ });
+ }
+ });
+}
+/****
+* findChildByName Helper
+****/
+Container.prototype.findChildByName = function (name) {
+ for (var i = 0; i < this.children.length; i++) {
+ if (this.children[i].name === name) {
+ return this.children[i];
+ }
+ }
+ return null;
+};
+/****
+* game.up: Reset Press Info
+****/
+game.up = function (x, y) {
+ if (isPressHeld) {
+ var holdDuration = Date.now() - pressHoldStartTime;
+ if (holdDuration > 500 && attackTimeout) {
+ clearTimeout(attackTimeout);
+ attackTimeout = null;
+ }
+ }
+ isPressHeld = false;
+ pressHoldStartTime = 0;
+};
\ No newline at end of file
high definition super nintendo background of a japanese sakura tree forest Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
2d snes dust particle. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
silver coin, $ sign on it, snes art. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
gold coin, $ sign on it, snes art. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
snes white feather. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
add a wooden shield
white 3d questionmark with a shadow. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
caligraphy paper front facing flat. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
the letters 'Ready' in 3d with a japanese cartoon cherry blossom flair. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
add eyebrows