Code edit (2 edits merged)
Please save this source code
User prompt
Replace the 'Your fishes' with the capacity of the fishes, draw the corresponding fish and add a separator asset for each fish.
Code edit (10 edits merged)
Please save this source code
User prompt
Display the `gameStatus.fishes` fish, rate and value when the fishes tab is shown.
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: shine.destory is not a function' in or related to this line: 'shine.destory();' Line Number: 335
Code edit (5 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of undefined (setting 'x')' in or related to this line: 'gameStatus.shine.x = 2048 / 2;' Line Number: 367
Code edit (2 edits merged)
Please save this source code
User prompt
Make a second shine that is smaller, slower and spins anti-clockwise.
Code edit (4 edits merged)
Please save this source code
User prompt
Add a shine behind the caught fish, and spin it around clockwise, don't use the tween library
User prompt
Add a shine behind the caught fish, and spin it around clockwise linearly โช๐ก Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
Code edit (3 edits merged)
Please save this source code
User prompt
`moneyText` outline disappears when `updateMoney()` get called, fix that
Code edit (4 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught ReferenceError: formatTime is not defined' in or related to this line: 'var rate = formatTime(self.rate, 2);' Line Number: 104
Code edit (1 edits merged)
Please save this source code
Code edit (7 edits merged)
Please save this source code
User prompt
Please fix the bug: 'self.children.remove is not a function' in or related to this line: 'self.children.remove(0);' Line Number: 212
Code edit (14 edits merged)
Please save this source code
User prompt
Please fix the bug: '[object Object]addChildAt: The index [object Object] supplied is out of bounds 0' in or related to this line: 'self.addChildAt(moneyText, {}, 0);' Line Number: 210
Code edit (1 edits merged)
Please save this source code
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Button = Container.expand(function (onPress, config) { var self = Container.call(this); self.onPress = onPress; self.isPressed = false; self.id = config.id; if (config.size) { var buttonWidth = config.size; var buttonHeight = config.size; } else { var buttonWidth = config.width; var buttonHeight = config.height; } var textSize = Math.max(buttonWidth, buttonHeight); var background = self.attachAsset('buttonBackground', { width: buttonWidth, height: buttonHeight }); var backgroundPressed = self.attachAsset('buttonBackgroundPressed', { visible: false, width: buttonWidth, height: buttonHeight }); self.text = config.text; var buttonText = new Text2(self.text, { size: textSize / 5, fill: 0xFFFFFF, weight: 700, font: "Arial Black", stroke: 0x000000, strokeThickness: 20 }); buttonText.anchor.set(0.5, 0.5); buttonText.x = buttonWidth / 2; buttonText.y = buttonHeight / 2; self.addChild(buttonText); self.down = function (x, y, obj) { if (self.onPress) { // If onPress return false, then don't press down the button if (!self.onPress(self)) { return; } } self.isPressed = true; background.visible = false; backgroundPressed.visible = true; currentButton = self; }; self.up = function (x, y, obj) { self.isPressed = false; background.visible = true; backgroundPressed.visible = false; }; return self; }); var Fish = Container.expand(function (fishType) { var self = Container.call(this); // Store fish type self.fishType = fishType || 'blueFish'; // Create fish visual var fishGraphics = self.attachAsset(self.fishType, { anchorX: 0.5, anchorY: 0.5 }); // Swimming properties self.speed = 2 + Math.random() * 3; // Random speed between 2-5 self.direction = Math.random() * Math.PI * 2; // Random initial direction self.turnSpeed = 0.02 + Math.random() * 0.03; // How fast fish can turn self.targetDirection = self.direction; self.wobbleAmount = 0.1 + Math.random() * 0.2; // Slight wobble for natural movement self.wobbleSpeed = 0.05 + Math.random() * 0.05; self.wobbleOffset = Math.random() * Math.PI * 2; // Boundaries with margin self.margin = 100; // Initialize position self.randomPosition = function () { self.x = self.margin + Math.random() * (2048 - self.margin * 2); self.y = self.margin + Math.random() * (2732 - self.margin * 2); }; self.format = function () { if (self.rate.toFixed(2) == 0) { var rate = "frame"; } else { var rate = formatTime(self.rate, 2); } return formatMoney(self.value) + " every " + rate; }; self.update = function () { if (self.isCaught) { return; } // Add wobble to movement var wobble = Math.sin(LK.ticks * self.wobbleSpeed + self.wobbleOffset) * self.wobbleAmount; // Gradually turn towards target direction var directionDiff = self.targetDirection - self.direction; // Normalize angle difference to -PI to PI while (directionDiff > Math.PI) { directionDiff -= Math.PI * 2; } while (directionDiff < -Math.PI) { directionDiff += Math.PI * 2; } self.direction += directionDiff * self.turnSpeed; // Move fish self.x += Math.cos(self.direction + wobble) * self.speed; self.y += Math.sin(self.direction + wobble) * self.speed; // Face the direction of movement fishGraphics.rotation = self.direction; // Check boundaries and change direction var turnAwayForce = 0.1; var boundaryDistance = 200; if (self.x < self.margin + boundaryDistance) { self.targetDirection = 0; // Turn right } else if (self.x > 2048 - self.margin - boundaryDistance) { self.targetDirection = Math.PI; // Turn left } if (self.y < self.margin + boundaryDistance) { self.targetDirection = Math.PI / 2; // Turn down } else if (self.y > 2732 - self.margin - boundaryDistance - 200) { self.targetDirection = -Math.PI / 2; // Turn up } // Occasionally change direction randomly if (Math.random() < 0.005) { // 0.5% chance per frame self.targetDirection = Math.random() * Math.PI * 2; } // Keep fish within bounds (hard limit) self.x = Math.max(self.margin, Math.min(2048 - self.margin, self.x)); self.y = Math.max(self.margin, Math.min(2732 - self.margin, self.y)); }; return self; }); var GameStatus = Container.expand(function () { var self = Container.call(this); self.money = 0; self.fishes = []; self.bait = 20; self.baitTimer = 300; self.fishValue = 1; self.fishMax = 3; self.fishRate = 3.6e+6; self.fishesAtCapacity = function () { return self.fishes.length >= self.fishMax; }; self.formatMoney = function () { if (self.money === Infinity) { return "$Infinity"; } var str = "$"; if (self.money >= 1000) { suffixes = ["K", "M", "B", "T", "Qa", "Qi", "Sx", "Sp", "Oc", "No", "De"]; var digits = countNumber(self.money); var sf = suffixes[Math.floor((digits - 1) / 3) - 1]; if (sf === undefined) { str += String(self.money.toExponential(2)); } else { str += (self.money / Math.pow(10, Math.floor((digits - 1) / 3) * 3)).toFixed(2) + sf; } } else { str += self.money.toFixed(2); } return str; }; self.updateMoney = function () { if (self.children.length > 0) { self.removeChildAt(0); } var moneyText = new Text2(self.formatMoney(), { size: 125, fill: 0xFFFFFF, weight: 700, font: "Arial Black", stroke: 0x000000, strokeThickness: 16 }); moneyText.y = 50; moneyText.x = 50; self.addChildAt(moneyText, 0); }; self.updateMoney(); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x83C7FF }); /**** * Game Code ****/ function countNumber(number) { return Math.floor(Math.log10(Math.abs(number))) + 1; } function formatTime(time, point) { time = time / 1000; var str = ""; if (time > 3600) { str += String((time / 3600).toFixed(point)) + " hour"; } else if (time > 60) { str += String((time / 60).toFixed(point)) + " minute"; } else { str += String(time.toFixed(point)) + " second"; } if (time != 1) { str += "s"; } return str; } function formatMoney(money) { if (money === Infinity) { return "$Infinity"; } var str = "$"; if (money >= 1000) { var suffixes = ["K", "M", "B", "T", "Qa", "Qi", "Sx", "Sp", "Oc", "No", "De"]; var digits = countNumber(money); var sf = suffixes[Math.floor((digits - 1) / 3) - 1]; if (sf === undefined) { str += String(money.toExponential(2)); } else { str += (money / Math.pow(10, Math.floor((digits - 1) / 3) * 3)).toFixed(2) + sf; } } else { str += money.toFixed(2); } return str; } function normalRandom(min, max, skew) { skew = skew | 1; var u = 0, v = 0; while (u === 0) { u = Math.random(); } while (v === 0) { v = Math.random(); } var num = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v); num = num / 10.0 + 0.5; if (num > 1 || num < 0) { num = normalRandom(min, max, skew); } else { num = Math.pow(num, skew); num *= max - min; num += min; } return num; } var gameStatus = new GameStatus(); var tabLayout = {}; var fishTypes = ['blueFish', 'greenFish', 'pinkFish', 'redFish']; function addFish(fish) { gameStatus.caughtFish.scaleX = 1; gameStatus.caughtFish.scaleY = 1; fish.randomPosition(); gameStatus.fishes.push(fish); fishLayer.addChild(fish); } function randomFish(value, rate) { if (value === undefined) { var r = 0; var v = 0; } else { var r = normalRandom(rate - 900 * 1000, rate + 900 * 1000); var v = Number(normalRandom(value / 2, value * 2).toFixed(2)); if (r < 0) { r = 0; } } var randomType = fishTypes[Math.floor(Math.random() * fishTypes.length)]; var fish = new Fish(randomType); fish.value = v; fish.rate = r; return fish; } // Initialise the cast screen var castLayer = new Container(); castLayer.visible = false; castLayer.attachAsset('castBackground', { alpha: 0.5 }); var text = new Text2("You caught a fish", { size: 150, fill: 0xFFFFFF, weight: 700, font: "Arial Black", stroke: 0x000000, strokeThickness: 20 }); text.x = 2048 / 2 - text.width / 2; text.y = 2732 / 2 - 900; castLayer.addChild(text); var keepButton = new Button(function () { game.removeChild(gameStatus.caughtFish); gameStatus.caughtFish.isCaught = false; addFish(gameStatus.caughtFish); castLayer.visible = false; // Clean up cast layer children except buttons while (castLayer.children.length > 3) { castLayer.removeChildAt(3); } gameStatus.caughtFish = undefined; }, { text: "Keep", width: 818, height: 335 }); keepButton.x = 2048 / 2 - 818 - 50; keepButton.y = 2732 / 2 + 500; castLayer.addChild(keepButton); var sellButton = new Button(function () { game.removeChild(gameStatus.caughtFish); castLayer.visible = false; gameStatus.money += gameStatus.caughtFish.value; gameStatus.updateMoney(); // Clean up cast layer children except buttons while (castLayer.children.length > 3) { castLayer.removeChildAt(3); } gameStatus.caughtFish = undefined; }, { text: "Sell", width: 818, height: 335 }); sellButton.x = 2048 / 2 + 50; sellButton.y = 2732 / 2 + 500; castLayer.addChild(sellButton); game.addChild(castLayer); function cast() { if (gameStatus.caughtFish === undefined) { gameStatus.caughtFish = randomFish(gameStatus.fishValue, gameStatus.fishRate); } // Add shine behind fish var shine = LK.getAsset('shine', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 + 150, scaleX: 1.5, scaleY: 1.5 }); castLayer.addChild(shine); // Animate shine rotation function rotateShine() { tween(shine, { rotation: shine.rotation + Math.PI * 2 }, { duration: 3000, easing: tween.linear, onFinish: rotateShine }); } rotateShine(); // Render fish on cast screen gameStatus.caughtFish.x = 2048 / 2; gameStatus.caughtFish.y = 2732 / 2 + 150; gameStatus.caughtFish.scaleX = 2; gameStatus.caughtFish.scaleY = 2; gameStatus.caughtFish.isCaught = true; castLayer.addChild(gameStatus.caughtFish); var text = new Text2(gameStatus.caughtFish.format(), { size: 150, fill: 0xFFFFFF, weight: 700, font: "Arial Black", stroke: 0x000000, strokeThickness: 20 }); text.x = 2048 / 2; text.y = 2732 / 2 - 350; text.anchor.set(0.5, 0); castLayer.addChild(text); var passiveIncome = new Text2("Passive Income:", { size: 150, fill: 0xFFFFFF, weight: 700, font: "Arial Black", stroke: 0x000000, strokeThickness: 20 }); passiveIncome.x = 2048 / 2; passiveIncome.y = 2732 / 2 - 360 - text.height; passiveIncome.anchor.set(0.5, 0); castLayer.addChild(passiveIncome); // Display the cast screen castLayer.visible = true; hideTab(); } function hideTab() { tabBackground.visible = false; if (currTab) { tabLayout[currTab].visible = false; currTab = null; } } var currTab; function tabPressed(button) { if (castLayer.visible) { return false; } tabBackground.visible = true; if (currTab == button.id) { return; } if (currTab) { tabLayout[currTab].visible = false; } currTab = button.id; tabLayout[button.id].visible = true; if (currTab == 'fishes') { console.log(fishes); } return true; } var tabLayer = new Container(); var tabBackground = new Container(); var tabElements = new Container(); var castButton = new Button(cast, { width: 818, height: 335, text: "Cast" }); castButton.x = (946 - 818) / 2; castButton.y = 75; castButton.visible = false; tabLayout.cast = tabElements.addChild(castButton); tabLayout.fishes = tabElements.addChild(new Container()); tabLayout.shop = tabElements.addChild(new Container()); tabLayer.addChild(tabBackground); tabLayer.addChild(tabElements); tabBackground.x = 2048 - 976; tabBackground.y = 25; tabElements.x = 2048 - 976; tabElements.y = 25; tabBackground.visible = false; tabBackground.attachAsset('tabBackgroundTL', {}); tabBackground.attachAsset('tabBackgroundBL', { y: 1155 }); tabBackground.attachAsset('tabBackgroundBR', { x: 473, y: 1155 }); tabBackground.attachAsset('tabBackgroundTR', { x: 473 }); var castTab = new Button(tabPressed, { size: 300, text: "cast", id: "cast" }); castTab.x = 2048 - 325 * 3; castTab.y = 2732 - 325; tabLayer.addChild(castTab); var fishesTab = new Button(tabPressed, { size: 300, text: "fishes", id: "fishes" }); fishesTab.x = 2048 - 325 * 2; fishesTab.y = 2732 - 325; tabLayer.addChild(fishesTab); var shopTab = new Button(tabPressed, { size: 300, text: "shop", id: "shop" }); shopTab.x = 2048 - 325; shopTab.y = 2732 - 325; tabLayer.addChild(shopTab); var fishLayer = new Container(); game.addChild(fishLayer); var fishes = []; game.attachAsset('waterBackground', {}); game.addChild(fishLayer); game.addChild(gameStatus); game.addChild(tabLayer); game.addChild(castLayer); game.down = function (x, y, obj) { if (tabBackground.x > x) { hideTab(); } };
===================================================================
--- original.js
+++ change.js
@@ -1,5 +1,10 @@
/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
* Classes
****/
var Button = Container.expand(function (onPress, config) {
var self = Container.call(this);
@@ -299,8 +304,12 @@
game.removeChild(gameStatus.caughtFish);
gameStatus.caughtFish.isCaught = false;
addFish(gameStatus.caughtFish);
castLayer.visible = false;
+ // Clean up cast layer children except buttons
+ while (castLayer.children.length > 3) {
+ castLayer.removeChildAt(3);
+ }
gameStatus.caughtFish = undefined;
}, {
text: "Keep",
width: 818,
@@ -313,8 +322,12 @@
game.removeChild(gameStatus.caughtFish);
castLayer.visible = false;
gameStatus.money += gameStatus.caughtFish.value;
gameStatus.updateMoney();
+ // Clean up cast layer children except buttons
+ while (castLayer.children.length > 3) {
+ castLayer.removeChildAt(3);
+ }
gameStatus.caughtFish = undefined;
}, {
text: "Sell",
width: 818,
@@ -327,8 +340,29 @@
function cast() {
if (gameStatus.caughtFish === undefined) {
gameStatus.caughtFish = randomFish(gameStatus.fishValue, gameStatus.fishRate);
}
+ // Add shine behind fish
+ var shine = LK.getAsset('shine', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 2048 / 2,
+ y: 2732 / 2 + 150,
+ scaleX: 1.5,
+ scaleY: 1.5
+ });
+ castLayer.addChild(shine);
+ // Animate shine rotation
+ function rotateShine() {
+ tween(shine, {
+ rotation: shine.rotation + Math.PI * 2
+ }, {
+ duration: 3000,
+ easing: tween.linear,
+ onFinish: rotateShine
+ });
+ }
+ rotateShine();
// Render fish on cast screen
gameStatus.caughtFish.x = 2048 / 2;
gameStatus.caughtFish.y = 2732 / 2 + 150;
gameStatus.caughtFish.scaleX = 2;
@@ -344,8 +378,10 @@
strokeThickness: 20
});
text.x = 2048 / 2;
text.y = 2732 / 2 - 350;
+ text.anchor.set(0.5, 0);
+ castLayer.addChild(text);
var passiveIncome = new Text2("Passive Income:", {
size: 150,
fill: 0xFFFFFF,
weight: 700,
@@ -355,9 +391,9 @@
});
passiveIncome.x = 2048 / 2;
passiveIncome.y = 2732 / 2 - 360 - text.height;
passiveIncome.anchor.set(0.5, 0);
- castLayer.addChild(text);
+ castLayer.addChild(passiveIncome);
// Display the cast screen
castLayer.visible = true;
hideTab();
}