User prompt
Add the brush to appears when player clean polluted spirits show the animation of brush left and right like its cleaning āŖš” Consider importing and using the following plugins: @upit/tween.v1
User prompt
Show the brush with animation on the pullutedspirit asset when get touched by player or when it get cleaned by it āŖš” Consider importing and using the following plugins: @upit/tween.v1
User prompt
show the brush on the pollutedspirits not on spirits that respawn from the top āŖš” Consider importing and using the following plugins: @upit/tween.v1
User prompt
Add brush asset to the game when player clean the spirits show the brush on them with animation left and right by small distance to look like its brushing them. āŖš” Consider importing and using the following plugins: @upit/tween.v1
User prompt
Add gamebackground
User prompt
play intro music when intro music only so when the game is starts play only game music
User prompt
Please fix the bug: 'ReferenceError: spawnToken is not defined' in or related to this line: 'spawnToken();' Line Number: 347
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'length')' in or related to this line: 'for (var i = tokens.length - 1; i >= 0; i--) {' Line Number: 358
User prompt
The startbutton not working!
User prompt
Add introbackground before game starts and startbutton close to the bottom.
User prompt
add bathmusic for the game
User prompt
don't show the game objects till it starts or startbutton is clicked!
User prompt
Add introbackground for the intro before game start and startbutton close to the bottom by 100px
User prompt
Import of asset
User prompt
Change direction for the player when go to the left and right from the middle of the screen.
User prompt
free one spirit took all the tokens! reduce that to 1 token only per spirit before it change to dark spirit.
User prompt
Add the asset for the dark spirt is missing on the list of assets!
User prompt
Lower the game screen from the top by 200px but let the text in its position so the healthbar
User prompt
move health bar to top max close to top by 30px on the same area on the left side not to the middle or right side!
User prompt
move health bar to the max top before 30px
User prompt
change health to a sky blue bar of 100% decreased by random % from 3 to 10.
Code edit (1 edits merged)
Please save this source code
User prompt
Spirit Bath House Adventure
Initial prompt
Create a spirited a way game. story game. from the anime movie "spirited a way".
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var HealthBar = Container.expand(function () {
var self = Container.call(this);
// Background bar
self.bgBar = self.attachAsset('healthBarBg', {
anchorX: 0,
anchorY: 0.5
});
// Health bar
self.healthBar = self.attachAsset('healthBarFill', {
anchorX: 0,
anchorY: 0.5
});
self.maxWidth = 300;
self.updateHealth = function (healthPercent) {
self.healthBar.scaleX = healthPercent / 100;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.tokens = 0;
self.health = 100;
self.maxHealth = 100;
self.collectToken = function () {
self.tokens++;
};
self.deliverTokens = function () {
var delivered = self.tokens;
self.tokens = 0;
return delivered;
};
self.takeDamage = function () {
var damage = Math.random() * 7 + 3; // Random between 3-10
self.health -= damage;
self.health = Math.max(0, self.health); // Ensure health doesn't go below 0
LK.effects.flashObject(self, 0xff0000, 500);
return self.health <= 0;
};
return self;
});
var PollutedSpirit = Container.expand(function () {
var self = Container.call(this);
var pollutedGraphics = self.attachAsset('pollutedSpirit', {
anchorX: 0.5,
anchorY: 0.5
});
self.tokensNeeded = 3;
self.isCleansed = false;
self.cleanse = function () {
self.isCleansed = true;
tween(pollutedGraphics, {
tint: 0x98fb98
}, {
duration: 1000,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
var RiverSpirit = Container.expand(function () {
var self = Container.call(this);
var riverGraphics = self.attachAsset('riverSpirit', {
anchorX: 0.5,
anchorY: 0.5
});
self.bonusValue = 20;
self.speed = 0.5;
self.update = function () {
self.x += self.speed;
self.rotation += 0.01;
};
return self;
});
var ShadowSpirit = Container.expand(function () {
var self = Container.call(this);
var shadowGraphics = self.attachAsset('shadowSpirit', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.targetPlayer = null;
self.update = function () {
if (self.targetPlayer) {
var dx = self.targetPlayer.x - self.x;
var dy = self.targetPlayer.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
}
};
return self;
});
var Spirit = Container.expand(function () {
var self = Container.call(this);
var spiritGraphics = self.attachAsset('spirit', {
anchorX: 0.5,
anchorY: 0.5
});
self.waitTime = 0;
self.maxWaitTime = 600; // 10 seconds at 60fps
self.isDark = false;
self.speed = 1;
self.update = function () {
self.waitTime++;
if (!self.isDark && self.waitTime >= self.maxWaitTime) {
self.turnDark();
}
if (self.isDark) {
self.y += self.speed;
}
};
self.turnDark = function () {
self.isDark = true;
spiritGraphics.tint = 0x2a0845;
tween(spiritGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500
});
};
return self;
});
var Token = Container.expand(function () {
var self = Container.call(this);
var tokenGraphics = self.attachAsset('token', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.update = function () {
if (!self.collected) {
self.rotation += 0.02;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
var gameStarted = false;
var introBackground = null;
var startButton = null;
// Declare game variables in global scope
var player, tokens, spirits, shadowSpirits, pollutedSpirits, riverSpirit;
var spawnTimer, spawnInterval, shadowSpawnTimer, shadowSpawnInterval;
var scoreTxt, tokenTxt, healthBar;
var brush;
// Show intro screen
function showIntroScreen() {
introBackground = game.addChild(LK.getAsset('introbackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
startButton = game.addChild(LK.getAsset('startbutton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 2400
}));
LK.playMusic('intromusic');
}
// Start the actual game
function startGame() {
gameStarted = true;
if (introBackground) {
introBackground.destroy();
introBackground = null;
}
if (startButton) {
startButton.destroy();
startButton = null;
}
LK.stopMusic();
LK.playMusic('bathhouse');
initializeGame();
}
// Spawn functions in global scope
function spawnToken() {
var token = new Token();
token.x = Math.random() * 1848 + 100;
token.y = Math.random() * 2332 + 300;
tokens.push(token);
game.addChild(token);
}
function spawnSpirit() {
var spirit = new Spirit();
spirit.x = Math.random() * 1848 + 100;
spirit.y = 300;
spirits.push(spirit);
game.addChild(spirit);
}
function spawnShadowSpirit() {
var shadow = new ShadowSpirit();
shadow.x = Math.random() * 1848 + 100;
shadow.y = Math.random() * 400 + 300;
shadow.targetPlayer = player;
shadowSpirits.push(shadow);
game.addChild(shadow);
}
function spawnPollutedSpirit() {
var polluted = new PollutedSpirit();
polluted.x = Math.random() * 1848 + 100;
polluted.y = Math.random() * 1000 + 700;
pollutedSpirits.push(polluted);
game.addChild(polluted);
}
function spawnRiverSpirit() {
if (!riverSpirit) {
riverSpirit = new RiverSpirit();
riverSpirit.x = -100;
riverSpirit.y = Math.random() * 1000 + 1066;
game.addChild(riverSpirit);
}
}
function showBrushAnimation(targetSpirit) {
brush.visible = true;
brush.x = targetSpirit.x;
brush.y = targetSpirit.y;
// Animate brush left and right with small movements
tween(brush, {
x: targetSpirit.x - 20
}, {
duration: 150,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(brush, {
x: targetSpirit.x + 20
}, {
duration: 150,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(brush, {
x: targetSpirit.x - 15
}, {
duration: 150,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(brush, {
x: targetSpirit.x + 15
}, {
duration: 150,
easing: tween.easeInOut,
onFinish: function onFinish() {
brush.visible = false;
}
});
}
});
}
});
}
});
}
function initializeGame() {
game.setBackgroundColor(0x16213e);
// Add game background
var gameBackground = game.addChild(LK.getAsset('gamebackground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
player = game.addChild(new Player());
player.x = 1024;
player.y = 2200;
tokens = [];
spirits = [];
shadowSpirits = [];
pollutedSpirits = [];
riverSpirit = null;
spawnTimer = 0;
spawnInterval = 180; // 3 seconds initially
shadowSpawnTimer = 0;
shadowSpawnInterval = 300; // 5 seconds
scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
tokenTxt = new Text2('Tokens: 0', {
size: 60,
fill: 0xFFD700
});
tokenTxt.anchor.set(1, 0);
tokenTxt.x = -20;
LK.gui.topRight.addChild(tokenTxt);
healthBar = new HealthBar();
healthBar.x = 20;
healthBar.y = 30;
LK.gui.topLeft.addChild(healthBar);
// Initialize brush
brush = game.addChild(LK.getAsset('brush', {
anchorX: 0.5,
anchorY: 0.5
}));
brush.visible = false;
// Initial spawns
for (var i = 0; i < 5; i++) {
spawnToken();
}
spawnSpirit();
spawnPollutedSpirit();
}
var dragActive = false;
game.down = function (x, y, obj) {
if (!gameStarted && startButton) {
// Check if click is within start button bounds
var buttonLeft = startButton.x - startButton.width * startButton.anchor.x;
var buttonRight = startButton.x + startButton.width * (1 - startButton.anchor.x);
var buttonTop = startButton.y - startButton.height * startButton.anchor.y;
var buttonBottom = startButton.y + startButton.height * (1 - startButton.anchor.y);
if (x >= buttonLeft && x <= buttonRight && y >= buttonTop && y <= buttonBottom) {
startGame();
return;
}
}
if (gameStarted) {
dragActive = true;
}
};
game.up = function (x, y, obj) {
if (gameStarted) {
dragActive = false;
}
};
game.move = function (x, y, obj) {
if (gameStarted && dragActive && player) {
player.x = x;
player.y = y;
}
};
game.update = function () {
if (!gameStarted) {
return;
}
// Update spawn timers
spawnTimer++;
shadowSpawnTimer++;
if (spawnTimer >= spawnInterval) {
spawnSpirit();
spawnTimer = 0;
// Increase difficulty
if (spawnInterval > 60) {
spawnInterval -= 2;
}
}
if (shadowSpawnTimer >= shadowSpawnInterval) {
spawnShadowSpirit();
shadowSpawnTimer = 0;
}
// Token spawning
if (LK.ticks % 120 === 0) {
spawnToken();
}
// Polluted spirit spawning
if (LK.ticks % 600 === 0) {
spawnPollutedSpirit();
}
// River spirit spawning
if (LK.getScore() > 0 && LK.getScore() % 50 === 0 && !riverSpirit) {
spawnRiverSpirit();
}
// Check token collection
for (var i = tokens.length - 1; i >= 0; i--) {
var token = tokens[i];
if (!token.collected && player.intersects(token)) {
token.collected = true;
player.collectToken();
tokenTxt.setText('Tokens: ' + player.tokens);
LK.getSound('collect').play();
token.destroy();
tokens.splice(i, 1);
}
}
// Check spirit interactions
for (var j = spirits.length - 1; j >= 0; j--) {
var spirit = spirits[j];
if (!spirit.isDark && player.intersects(spirit) && player.tokens > 0) {
player.tokens -= 1; // Only consume 1 token per spirit
LK.setScore(LK.getScore() + 5); // Award 5 points per spirit freed
scoreTxt.setText('Score: ' + LK.getScore());
tokenTxt.setText('Tokens: ' + player.tokens);
LK.getSound('deliver').play();
spirit.destroy();
spirits.splice(j, 1);
}
if (spirit.isDark && spirit.y > 2932) {
spirit.destroy();
spirits.splice(j, 1);
}
}
// Check shadow spirit collisions
for (var k = shadowSpirits.length - 1; k >= 0; k--) {
var shadow = shadowSpirits[k];
if (shadow.lastIntersecting === undefined) {
shadow.lastIntersecting = false;
}
var currentIntersecting = player.intersects(shadow);
if (!shadow.lastIntersecting && currentIntersecting) {
LK.getSound('damage').play();
var gameOver = player.takeDamage();
healthBar.updateHealth(player.health);
if (gameOver) {
LK.showGameOver();
}
shadow.destroy();
shadowSpirits.splice(k, 1);
continue;
}
shadow.lastIntersecting = currentIntersecting;
}
// Check polluted spirit cleansing
for (var l = pollutedSpirits.length - 1; l >= 0; l--) {
var polluted = pollutedSpirits[l];
if (polluted.lastTouching === undefined) {
polluted.lastTouching = false;
}
var currentTouching = player.intersects(polluted);
// Show brush animation when player touches polluted spirit
if (!polluted.lastTouching && currentTouching) {
showBrushAnimation(polluted);
}
if (!polluted.isCleansed && currentTouching && player.tokens >= polluted.tokensNeeded) {
player.tokens -= polluted.tokensNeeded;
tokenTxt.setText('Tokens: ' + player.tokens);
LK.setScore(LK.getScore() + 15);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('cleanse').play();
showBrushAnimation(polluted);
polluted.cleanse();
pollutedSpirits.splice(l, 1);
}
polluted.lastTouching = currentTouching;
}
// Check river spirit collection
if (riverSpirit) {
if (riverSpirit.lastIntersecting === undefined) {
riverSpirit.lastIntersecting = false;
}
var riverIntersecting = player.intersects(riverSpirit);
if (!riverSpirit.lastIntersecting && riverIntersecting) {
LK.setScore(LK.getScore() + riverSpirit.bonusValue);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('cleanse').play();
riverSpirit.destroy();
riverSpirit = null;
} else if (riverSpirit && riverSpirit.x > 2200) {
riverSpirit.destroy();
riverSpirit = null;
}
if (riverSpirit) {
riverSpirit.lastIntersecting = riverIntersecting;
}
}
// Player direction based on position
var screenMiddle = 1024;
if (player.x < screenMiddle) {
// Player is on left side, face left (flip horizontally)
player.scaleX = -1;
} else {
// Player is on right side, face right (normal orientation)
player.scaleX = 1;
}
// Win condition
if (LK.getScore() >= 500) {
LK.showYouWin();
}
};
// Show intro screen initially
showIntroScreen(); ===================================================================
--- original.js
+++ change.js
@@ -453,8 +453,9 @@
tokenTxt.setText('Tokens: ' + player.tokens);
LK.setScore(LK.getScore() + 15);
scoreTxt.setText('Score: ' + LK.getScore());
LK.getSound('cleanse').play();
+ showBrushAnimation(polluted);
polluted.cleanse();
pollutedSpirits.splice(l, 1);
}
polluted.lastTouching = currentTouching;
damage
Sound effect
cleanse
Sound effect
collect
Sound effect
deliver
Sound effect
playermovment
Sound effect
level1music
Music
level2music
Music
level3music
Music
level4music
Music
Shadowspiritsound
Sound effect
darkspiritsound
Sound effect
intromusic
Music