User prompt
Whenever the player ranks up, the game pauses and a popup window appears asking the player to choose one of three powerups. For now, the powerups are "Pitching Arm!" which causes santaโs rate of fire to increase by 35%, "Rocket Sled!โ which causes houses to spawn 50% faster and move 50% faster for the next 10 seconds, and "More Reindeer!" which causes santa to move 35% faster. After the player chooses a powerup, the popup closes and the game resumes.
User prompt
If the XP required to rank up ends in a decimal, round that number down to the nearest whole number
User prompt
Let's clean up the Rank and XP system because it's not behaving correctly. A player's rank starts at 1. A player's XP starts at 0 and increases every time their score goes up (it does not decrease if their score goes down). When a player earns 6 XP, their rank increases to 2, their XP resets to 0, and the XP required to increase in rank goes up by 35% rounded down. Then the Rank and XP UI refreshes.
User prompt
Every time a rank increases, reset the player's XP to zero
User prompt
Every time a rank increases, reset XP to 0 and increase XP needed to rank up by 35% rounded down
User prompt
At ranks 3 and above, have no spaces before the XP line
User prompt
At rank 2, only have 1 space before the XP line
User prompt
At Rank 2, reduce to 1 space
User prompt
The two spaces should always be present even as the XP values are updated
User prompt
Add two spaces before the XP line
User prompt
Center align the Rank UI text
User prompt
Beneath rank, show Current XP / XP to Next Rank as numbers
User prompt
Why are old numbers not going away as new numbers are displayed?
User prompt
Update rank XP display to only show numbers and move it below the Rank
User prompt
Anchor the Rank UI 20 pixels to the right of the countdown timer
User prompt
Anchor the Rank UI 50 pixels to the right of the countdown timer
User prompt
Anchor the Rank UI 75 pixels to the right of the countdown timer
User prompt
Instead of "Current XP / XP to Next Rank" only show the numbers, "X / Y"
User prompt
Ensure there are 150 pixels between the right edge of the Score UI and the countdown timer
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in this line: 'scoreTxt.x = timerTxt.x - 150;' Line Number: 98
User prompt
Anchor the Score UI 150 pixels to the left of the countdown timer
User prompt
Anchor the Rank UI 150 pixels to the right of the countdown timer
User prompt
Center the Rank UI between the right edge of the screen and the center of the screen
User prompt
After rank, show (Current XP / XP to Next Rank)
User prompt
Rank increases every 6 XP
var Present = Container.expand(function () { var self = Container.call(this); var presentGraphics = self.createAsset('present', 'Present Graphics', .5, .5); self.speed = -10; self.move = function () { self.y += self.speed; }; }); var NaughtyHouse = Container.expand(function () { var self = Container.call(this); var houseGraphics = self.createAsset('naughtyHouse', 'Naughty House Graphics', .5, .5); houseGraphics.tint = 0xFF0000; self.speed = 2; self.move = function () { self.y += self.speed; if (self.y > 2732 + self.height) { self.destroy(); } }; }); var NiceHouse = Container.expand(function () { var self = Container.call(this); var houseGraphics = self.createAsset('niceHouse', 'Nice House Graphics', .5, .5); houseGraphics.tint = 0x00FF00; self.speed = 2; self.hitCount = 0; self.move = function () { self.y += self.speed; if (self.y > 2732 + self.height) { self.destroy(); } }; }); var HappyHouse = Container.expand(function () { var self = Container.call(this); var houseGraphics = self.createAsset('happyHouse', 'Happy House Graphics', .5, .5); houseGraphics.tint = 0xFFFF00; self.speed = 2; self.move = function () { self.y += self.speed; if (self.y > 2732 + self.height) { self.destroy(); } }; }); var DarkHouse = Container.expand(function () { var self = Container.call(this); var houseGraphics = self.createAsset('darkHouse', 'Dark House Graphics', .5, .5); houseGraphics.tint = 0x808080; self.speed = 2; self.move = function () { self.y += self.speed; if (self.y > 2732 + self.height) { self.destroy(); } }; }); var Santa = Container.expand(function () { var self = Container.call(this); var santaGraphics = self.createAsset('santa', 'Santa Graphics', .5, .5); self.targetPosition = null; self.moveSpeed = 5; self.move = function (position) { if (position) { self.targetPosition = position; } if (self.targetPosition) { var dx = self.targetPosition.x - self.x; var dy = self.targetPosition.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 1) { var angle = Math.atan2(dy, dx); var tentativeX = self.x + Math.cos(angle) * self.moveSpeed; var tentativeY = self.y + Math.sin(angle) * self.moveSpeed; self.x = tentativeX; if (tentativeY > 2732 - 2732 / 3) { self.y = tentativeY; } } else { if (self.targetPosition.y > 2732 - 2732 / 3) { self.x = self.targetPosition.x; self.y = self.targetPosition.y; } self.targetPosition = null; } } }; }); var Game = Container.expand(function () { var self = Container.call(this); function checkRankUp() { var xpThreshold = 6 * Math.pow(1.35, rank - 1); if (xp >= xpThreshold) { rank++; xp = 0; rankTxt.setText('Rank: ' + rank); updateXPDisplay(); } } var countdown = 60; var score = 0; var scoreTxt = new Text2('Score: ' + score, { size: 75, fill: "#ffffff" }); scoreTxt.anchor.set(0, 0); scoreTxt.x += 50; scoreTxt.y += 30; LK.gui.topLeft.addChild(scoreTxt); var timerTxt = new Text2(countdown.toString(), { size: 150, fill: "#ffffff" }); timerTxt.anchor.set(.5, 0); LK.gui.topCenter.addChild(timerTxt); var xp = 0; var rank = 1; var rankTxt = new Text2('Rank: ' + rank, { size: 75, fill: "#ffffff" }); rankTxt.anchor.set(0, 0); rankTxt.x = timerTxt.x + timerTxt.width + 230; rankTxt.y = scoreTxt.y; LK.gui.topCenter.addChild(rankTxt); var xpDisplayTxt = new Text2(xp + ' / ' + 6 * (rank - 1 + 1), { size: 75, fill: "#ffffff" }); xpDisplayTxt.anchor.set(0, 0); xpDisplayTxt.x = rankTxt.x; xpDisplayTxt.y = rankTxt.y + rankTxt.height + 20; LK.gui.topCenter.addChild(xpDisplayTxt); function updateXPDisplay() { var xpThreshold = Math.floor(6 * Math.pow(1.35, rank - 1)); xpDisplayTxt.setText(xp + ' / ' + xpThreshold); } function addXP(amount) { if (amount > 0) { xp += amount; checkRankUp(); } updateXPDisplay(); } var timer = LK.setInterval(function () { countdown--; timerTxt.setText(countdown.toString()); if (countdown <= 0) { LK.clearInterval(timer); LK.showGameOver(); } }, 1000); var houses = []; self.spawnHouse = function () { var nextSpawnTime = Math.random() * 1000 + 1000; var newHouseX = Math.random() * 2048; var newHouseY = -Math.random() * 500; var canSpawn = true; for (var i = 0; i < houses.length; i++) { var house = houses[i]; if (Math.abs(newHouseX - house.x) < house.width && Math.abs(newHouseY - house.y) < house.height) { canSpawn = false; break; } } if (canSpawn) { var houseTypes = [NaughtyHouse, NiceHouse]; var randomIndex = Math.random() < 0.34 ? 0 : 1; var house = new houseTypes[randomIndex](); house.x = newHouseX; house.y = newHouseY; houses.push(house); self.addChild(house); } LK.setTimeout(self.spawnHouse, nextSpawnTime); }; self.spawnHouse(); var houses = []; var presents = []; var santa = self.addChild(new Santa()); santa.x = 2048 / 2; santa.y = 2732 - 2732 * 0.1; var presentFireRate = 60; var presentFireCounter = 0; stage.on('down', function (obj) { var pos = obj.event.getLocalPosition(self); santa.move(pos); }); LK.on('tick', function () { santa.move(); if (presentFireCounter++ >= presentFireRate) { var present = new Present(); present.x = santa.x; present.y = santa.y; presents.push(present); self.addChild(present); presentFireCounter = 0; } for (var i = presents.length - 1; i >= 0; i--) { var present = presents[i]; present.move(); for (var j = houses.length - 1; j >= 0; j--) { var house = houses[j]; if (house instanceof NaughtyHouse && present.intersects(house)) { var darkHouse = new DarkHouse(); darkHouse.x = house.x; darkHouse.y = house.y; houses[j] = darkHouse; self.addChild(darkHouse); house.destroy(); present.destroy(); score = Math.max(0, score - 2); scoreTxt.setText('Score: ' + score); presents.splice(i, 1); break; } else if (house instanceof NiceHouse && present.intersects(house)) { house.hitCount++; score++; addXP(1); scoreTxt.setText('Score: ' + score); present.destroy(); presents.splice(i, 1); if (house.hitCount >= 3) { var happyHouse = new HappyHouse(); happyHouse.x = house.x; happyHouse.y = house.y; houses[j] = happyHouse; self.addChild(happyHouse); house.destroy(); } break; } } if (present.y < -present.height) { present.destroy(); presents.splice(i, 1); } } for (var i = houses.length - 1; i >= 0; i--) { var house = houses[i]; house.move(); if (house.y > 2732 + house.height) { houses.splice(i, 1); } } }); });
===================================================================
--- original.js
+++ change.js
@@ -87,8 +87,17 @@
};
});
var Game = Container.expand(function () {
var self = Container.call(this);
+ function checkRankUp() {
+ var xpThreshold = 6 * Math.pow(1.35, rank - 1);
+ if (xp >= xpThreshold) {
+ rank++;
+ xp = 0;
+ rankTxt.setText('Rank: ' + rank);
+ updateXPDisplay();
+ }
+ }
var countdown = 60;
var score = 0;
var scoreTxt = new Text2('Score: ' + score, {
size: 75,
@@ -122,29 +131,17 @@
xpDisplayTxt.x = rankTxt.x;
xpDisplayTxt.y = rankTxt.y + rankTxt.height + 20;
LK.gui.topCenter.addChild(xpDisplayTxt);
function updateXPDisplay() {
- xpDisplayTxt.setText(xp + ' / ' + 6 * rank);
+ var xpThreshold = Math.floor(6 * Math.pow(1.35, rank - 1));
+ xpDisplayTxt.setText(xp + ' / ' + xpThreshold);
}
- var oldUpdateRank = updateRank;
- updateRank = function () {
- oldUpdateRank();
- updateXPDisplay();
- };
- function updateRank() {
- var newRank = 1 + Math.floor(xp / 6);
- if (newRank > rank) {
- xp = 0;
- updateXPDisplay();
- }
- rank = newRank;
- rankTxt.setText('Rank: ' + rank);
- }
function addXP(amount) {
if (amount > 0) {
xp += amount;
- updateRank();
+ checkRankUp();
}
+ updateXPDisplay();
}
var timer = LK.setInterval(function () {
countdown--;
timerTxt.setText(countdown.toString());
overhead view of simple box house christmas decorations giant christmas tree out front video game asset 2d blank background Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
overhead view of drab house with giant prohibition symbol snowy lawn video game asset 2d blank background Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
overhead view of charred remains of a completely burned down box house snowy lawn video game asset 2d blank background Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Santa on sleigh pulled by reindeer blank background no shadows flying forward away straight top down Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
simple red christmas ornament 2d blank background high contrast no shadows in game asset Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
simple snowflake In-Game asset. 2d. Blank background. High contrast. No shadows. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
old white scroll unfurled blank no shadows Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
top down simple wrapped red present with gold bow. In-Game asset. 2d. Blank background. High contrast. No shadows. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
top down plate of cookies glass of milk. In-Game asset. Blank background. No shadows. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.