User prompt
yılanın hızlanma süreci daha yavaş olsun. Arada da bazı kaya engelleri çıksın
User prompt
yılan yandığında da yanma efekti olsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
yangın söndürülürken su püskürtme efekti olsun
User prompt
sesi kapatma tuşu ekle
User prompt
Asset kısmına collect.wav dosyası ekledim. Su alınca o ses çıksın
User prompt
Ateşler çık hızlı çoğalıyor ateşler bu kadar hızlı çoğalmasın
User prompt
Su daha fazla olsun. Yangınları söndürmeye yetmiyor
User prompt
Ses efektleri de yükle, arkaya da bir müzik koy
User prompt
If the snake is going to the right, if it's at the bottom, if I click on it a little, go to the top. It doesn't necessarily have to be towards the top of the middle of the screen
User prompt
Yılana göre hangi yöne tıklarsan o yöne dön
User prompt
O halde kontrolü daha kolay hale getir
User prompt
Yılan dokunulduğu tarafa sağa sola ya da yukarı doğru yön değiştirsin
User prompt
Ateşin içinden birkaç tane hayvan çıksın, sular daha fazla çıksın
User prompt
Sular daha sık çıksın
User prompt
Suların boyutu büyüsün, daha sık çıksın
User prompt
Tamam joystick olmasın
User prompt
Oyun çok çabuk hızlanıyor hemen hızlanmasın. Ateşten çıkan hayvanlar daha uzağa gitsin. Ekrandan kaybolana kadar gitsin ve boyutları da biraz genişlesin. Yangın büyüdükçe ateşin etrafındaki alana gelince de yangın sönsün
User prompt
Ateşin seviyesi arttıkça onu söndürme noktaları da genişlesin.
User prompt
yılanın gövde deseni de yöne göre dönsün
User prompt
bir de ateş büyüdükçe ateşin kapladığı alana gelince ateş sönsün sadece merkeze gelince değil
User prompt
12 saniye olsun
User prompt
10 saniye yapalım
User prompt
ateşin leveli 7 saniyede bir değişsin
User prompt
ateş çok hızlı büyüyor. Büyüme hızı levele göre değişsin.
User prompt
Please fix the bug: 'Error: Error: Invalid color format. Expected 0xRRGGBB format, received: 18501249' in or related to this line: 'tween(fireGraphics, {' Line Number: 77 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Animal = Container.expand(function () {
var self = Container.call(this);
var animalGraphics = self.attachAsset('animal', {
anchorX: 0.5,
anchorY: 0.5
});
self.speedX = (Math.random() - 0.5) * 4;
self.speedY = (Math.random() - 0.5) * 4;
self.lifeTime = 300; // 5 seconds at 60fps
self.update = function () {
self.x += self.speedX;
self.y += self.speedY;
self.lifeTime--;
if (self.lifeTime <= 0) {
self.destroy();
}
};
return self;
});
var Fire = Container.expand(function (size) {
var self = Container.call(this);
self.size = size || 1;
self.maxSize = 10; // Maximum fire size
self.waterNeeded = self.size;
self.growthTimer = 0;
// Fire grows every 12 seconds (720 ticks at 60fps)
self.growthInterval = 720; // 12 seconds fixed interval
var fireGraphics = self.attachAsset(self.size === 1 ? 'smallFire' : 'largeFire', {
anchorX: 0.5,
anchorY: 0.5
});
// Add flickering animation
self.animOffset = Math.random() * Math.PI * 2;
self.update = function () {
// Growth logic - fire grows every 7 seconds
self.growthTimer++;
if (self.growthTimer >= self.growthInterval && self.size < self.maxSize) {
self.size++;
self.waterNeeded = self.size;
self.growthTimer = 0;
// Update size text
if (self.sizeText) {
self.sizeText.setText(self.size.toString());
}
// Update visual scale based on size
var scale = 1 + (self.size - 1) * 0.2; // Increase scale by 20% per size level
tween(fireGraphics, {
scaleX: scale,
scaleY: scale
}, {
duration: 500,
easing: tween.easeOut
});
// Change color intensity based on size
var intensity = Math.min(1, 0.5 + (self.size - 1) * 0.1);
var redComponent = 0xFF;
var greenBlueComponent = Math.floor((1 - intensity) * 0x44);
var redTint = redComponent << 16 | greenBlueComponent << 8 | greenBlueComponent;
tween(fireGraphics, {
tint: redTint
}, {
duration: 500,
easing: tween.easeOut
});
}
// Flickering animation
var flicker = 0.8 + Math.sin(LK.ticks * 0.1 + self.animOffset) * 0.2;
fireGraphics.alpha = flicker;
var baseScaleX = fireGraphics.scaleX || 1;
var baseScaleY = fireGraphics.scaleY || 1;
fireGraphics.scaleX = baseScaleX + Math.sin(LK.ticks * 0.08 + self.animOffset) * 0.1;
fireGraphics.scaleY = baseScaleY + Math.sin(LK.ticks * 0.08 + self.animOffset) * 0.1;
};
return self;
});
var SnakeSegment = Container.expand(function (isHead) {
var self = Container.call(this);
var segmentGraphics = self.attachAsset(isHead ? 'snakeHead' : 'snakeBody', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var WaterDroplet = Container.expand(function () {
var self = Container.call(this);
var waterGraphics = self.attachAsset('water', {
anchorX: 0.5,
anchorY: 0.5
});
// Add floating animation
self.animOffset = Math.random() * Math.PI * 2;
self.update = function () {
waterGraphics.y = Math.sin(LK.ticks * 0.05 + self.animOffset) * 5;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2F4F2F
});
/****
* Game Code
****/
// Add forest background
var forestBackground = game.attachAsset('forest', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
// Game variables
var snake = [];
var snakeDirection = {
x: 1,
y: 0
};
var nextDirection = {
x: 1,
y: 0
};
var gridSize = 60;
var gameWidth = 2048;
var gameHeight = 2732;
var cols = Math.floor(gameWidth / gridSize);
var rows = Math.floor(gameHeight / gridSize);
var waterDroplets = [];
var fires = [];
var waterCollected = 0;
var moveTimer = 0;
var moveInterval = 15; // Snake moves every 15 ticks
var gameRunning = true;
var animals = [];
var maxFires = 1; // Start with 1 fire, increase with level
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var waterTxt = new Text2('Water: 0', {
size: 50,
fill: 0x1E90FF
});
waterTxt.anchor.set(1, 0);
waterTxt.x = -20;
waterTxt.y = 80;
LK.gui.topRight.addChild(waterTxt);
// Initialize snake
function initSnake() {
// Create initial snake with 3 segments
for (var i = 0; i < 3; i++) {
var segment = new SnakeSegment(i === 0);
segment.x = (5 - i) * gridSize + gridSize / 2;
segment.y = 5 * gridSize + gridSize / 2;
snake.push(segment);
game.addChild(segment);
}
}
// Convert grid coordinates to world coordinates
function gridToWorld(gridX, gridY) {
return {
x: gridX * gridSize + gridSize / 2,
y: gridY * gridSize + gridSize / 2
};
}
// Convert world coordinates to grid coordinates
function worldToGrid(worldX, worldY) {
return {
x: Math.floor(worldX / gridSize),
y: Math.floor(worldY / gridSize)
};
}
// Get random empty grid position
function getRandomEmptyPosition() {
var attempts = 0;
while (attempts < 100) {
var gridX = Math.floor(Math.random() * cols);
var gridY = Math.floor(Math.random() * rows);
var worldPos = gridToWorld(gridX, gridY);
var occupied = false;
// Check if position is occupied by snake
for (var i = 0; i < snake.length; i++) {
var snakeGrid = worldToGrid(snake[i].x, snake[i].y);
if (snakeGrid.x === gridX && snakeGrid.y === gridY) {
occupied = true;
break;
}
}
// Check if position is occupied by water
if (!occupied) {
for (var i = 0; i < waterDroplets.length; i++) {
var waterGrid = worldToGrid(waterDroplets[i].x, waterDroplets[i].y);
if (waterGrid.x === gridX && waterGrid.y === gridY) {
occupied = true;
break;
}
}
}
// Check if position is occupied by fire
if (!occupied) {
for (var i = 0; i < fires.length; i++) {
var fireGrid = worldToGrid(fires[i].x, fires[i].y);
if (fireGrid.x === gridX && fireGrid.y === gridY) {
occupied = true;
break;
}
}
}
if (!occupied) {
return worldPos;
}
attempts++;
}
// Fallback to center if no empty position found
return gridToWorld(Math.floor(cols / 2), Math.floor(rows / 2));
}
// Spawn water droplet
function spawnWater() {
var pos = getRandomEmptyPosition();
var water = new WaterDroplet();
water.x = pos.x;
water.y = pos.y;
waterDroplets.push(water);
game.addChild(water);
}
// Spawn fire
function spawnFire() {
var pos = getRandomEmptyPosition();
var fireSize = Math.random() < 0.7 ? 1 : 2; // 70% chance for small fire
var fire = new Fire(fireSize);
fire.x = pos.x;
fire.y = pos.y;
// Add size display text
fire.sizeText = new Text2(fire.size.toString(), {
size: 30,
fill: 0xFFFFFF
});
fire.sizeText.anchor.set(0.5, 0.5);
fire.sizeText.x = 0;
fire.sizeText.y = -50;
fire.addChild(fire.sizeText);
fires.push(fire);
game.addChild(fire);
// Spawn multiple escaping animals near fire
var animalCount = Math.floor(Math.random() * 3) + 2; // 2-4 animals
for (var j = 0; j < animalCount; j++) {
var animal = new Animal();
animal.x = pos.x + (Math.random() - 0.5) * 120;
animal.y = pos.y + (Math.random() - 0.5) * 120;
animals.push(animal);
game.addChild(animal);
}
}
// Move snake
function moveSnake() {
if (!gameRunning) {
return;
}
// Update direction
snakeDirection.x = nextDirection.x;
snakeDirection.y = nextDirection.y;
// Calculate new head position
var head = snake[0];
var headGrid = worldToGrid(head.x, head.y);
var newHeadGrid = {
x: headGrid.x + snakeDirection.x,
y: headGrid.y + snakeDirection.y
};
// Check boundaries
if (newHeadGrid.x < 0 || newHeadGrid.x >= cols || newHeadGrid.y < 0 || newHeadGrid.y >= rows) {
gameOver();
return;
}
// Check self collision
for (var i = 0; i < snake.length; i++) {
var segmentGrid = worldToGrid(snake[i].x, snake[i].y);
if (segmentGrid.x === newHeadGrid.x && segmentGrid.y === newHeadGrid.y) {
gameOver();
return;
}
}
// Move snake body and rotate segments
for (var i = snake.length - 1; i > 0; i--) {
// Store previous position for rotation calculation
var prevX = snake[i].x;
var prevY = snake[i].y;
// Move to new position
snake[i].x = snake[i - 1].x;
snake[i].y = snake[i - 1].y;
// Calculate direction for body segment rotation
var dirX = snake[i].x - prevX;
var dirY = snake[i].y - prevY;
// Rotate body segment based on movement direction
if (dirX > 0 && dirY === 0) {
// Moving right
snake[i].children[0].rotation = 0;
} else if (dirX < 0 && dirY === 0) {
// Moving left
snake[i].children[0].rotation = Math.PI;
} else if (dirX === 0 && dirY > 0) {
// Moving down
snake[i].children[0].rotation = Math.PI / 2;
} else if (dirX === 0 && dirY < 0) {
// Moving up
snake[i].children[0].rotation = -Math.PI / 2;
}
}
// Move head
var newHeadPos = gridToWorld(newHeadGrid.x, newHeadGrid.y);
head.x = newHeadPos.x;
head.y = newHeadPos.y;
// Rotate head based on direction
if (snakeDirection.x === 1 && snakeDirection.y === 0) {
// Moving right
head.children[0].rotation = 0;
} else if (snakeDirection.x === -1 && snakeDirection.y === 0) {
// Moving left
head.children[0].rotation = Math.PI;
} else if (snakeDirection.x === 0 && snakeDirection.y === 1) {
// Moving down
head.children[0].rotation = Math.PI / 2;
} else if (snakeDirection.x === 0 && snakeDirection.y === -1) {
// Moving up
head.children[0].rotation = -Math.PI / 2;
}
// Check water collection
for (var i = waterDroplets.length - 1; i >= 0; i--) {
var water = waterDroplets[i];
var waterGrid = worldToGrid(water.x, water.y);
if (waterGrid.x === newHeadGrid.x && waterGrid.y === newHeadGrid.y) {
// Collect water
waterCollected++;
waterTxt.setText('Water: ' + waterCollected);
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
// Grow snake
var lastSegment = snake[snake.length - 1];
var newSegment = new SnakeSegment(false);
newSegment.x = lastSegment.x;
newSegment.y = lastSegment.y;
snake.push(newSegment);
game.addChild(newSegment);
// Remove water
water.destroy();
waterDroplets.splice(i, 1);
// Play sound
LK.getSound('collect').play();
// Spawn new water
spawnWater();
break;
}
}
// Check fire extinguishing - use area-based collision instead of grid-based
for (var i = fires.length - 1; i >= 0; i--) {
var fire = fires[i];
// Calculate fire's collision radius based on size
var fireRadius = gridSize / 2 + (fire.size - 1) * 10; // Base radius + size bonus
// Calculate distance between snake head and fire center
var deltaX = head.x - fire.x;
var deltaY = head.y - fire.y;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
// Check if snake head is within fire's area
if (distance <= fireRadius) {
if (waterCollected >= fire.waterNeeded) {
// Extinguish fire
waterCollected -= fire.waterNeeded;
waterTxt.setText('Water: ' + waterCollected);
LK.setScore(LK.getScore() + (fire.size === 1 ? 50 : 100));
scoreTxt.setText('Score: ' + LK.getScore());
// Remove fire
fire.destroy();
fires.splice(i, 1);
// Play sound
LK.getSound('extinguish').play();
// Spawn extra water after extinguishing fire
spawnWater();
if (waterDroplets.length < 5) {
spawnWater();
}
// Spawn new fire if needed
if (fires.length < maxFires) {
spawnFire();
}
// Flash effect
LK.effects.flashObject(head, 0x00FF00, 300);
} else {
// Snake burns when touching fire without enough water
LK.effects.flashObject(head, 0xFF0000, 500);
gameOver();
return;
}
break;
}
}
}
// Game over
function gameOver() {
gameRunning = false;
LK.showGameOver();
}
// Touch controls
game.down = function (x, y, obj) {
// No need to store touch start position for direct touch controls
};
game.up = function (x, y, obj) {
if (!gameRunning) {
return;
}
// Get snake head position
var head = snake[0];
var snakeX = head.x;
var snakeY = head.y;
// Calculate direction from snake head to touch position
var deltaX = x - snakeX;
var deltaY = y - snakeY;
// Turn based on snake's current direction and touch relative position
if (snakeDirection.x === 1) {
// Snake moving right
if (deltaY < 0) {
// Touch above snake - turn up
nextDirection = {
x: 0,
y: -1
};
} else if (deltaY > 0) {
// Touch below snake - turn down
nextDirection = {
x: 0,
y: 1
};
}
} else if (snakeDirection.x === -1) {
// Snake moving left
if (deltaY < 0) {
// Touch above snake - turn up
nextDirection = {
x: 0,
y: -1
};
} else if (deltaY > 0) {
// Touch below snake - turn down
nextDirection = {
x: 0,
y: 1
};
}
} else if (snakeDirection.y === 1) {
// Snake moving down
if (deltaX < 0) {
// Touch left of snake - turn left
nextDirection = {
x: -1,
y: 0
};
} else if (deltaX > 0) {
// Touch right of snake - turn right
nextDirection = {
x: 1,
y: 0
};
}
} else if (snakeDirection.y === -1) {
// Snake moving up
if (deltaX < 0) {
// Touch left of snake - turn left
nextDirection = {
x: -1,
y: 0
};
} else if (deltaX > 0) {
// Touch right of snake - turn right
nextDirection = {
x: 1,
y: 0
};
}
}
};
// Initialize game
initSnake();
spawnWater();
spawnWater();
spawnWater();
spawnWater();
spawnFire();
// Start background music
LK.playMusic('bgmusic');
// Game update loop
game.update = function () {
if (!gameRunning) {
return;
}
moveTimer++;
if (moveTimer >= moveInterval) {
moveTimer = 0;
moveSnake();
}
// Spawn additional water periodically
if (LK.ticks % 80 === 0 && waterDroplets.length < 6) {
spawnWater();
}
// Increase difficulty - add more fires at higher scores
var currentLevel = Math.floor(LK.getScore() / 300) + 1;
maxFires = Math.min(currentLevel, 5); // Maximum 5 fires
if (fires.length < maxFires && LK.ticks % 900 === 0) {
spawnFire();
}
// Clean up dead animals
for (var i = animals.length - 1; i >= 0; i--) {
if (animals[i].lifeTime <= 0) {
animals.splice(i, 1);
}
}
// Make game slightly faster as score increases
if (LK.getScore() > 0 && LK.getScore() % 200 === 0) {
moveInterval = Math.max(8, moveInterval - 1);
}
}; ===================================================================
--- original.js
+++ change.js
@@ -384,8 +384,13 @@
fire.destroy();
fires.splice(i, 1);
// Play sound
LK.getSound('extinguish').play();
+ // Spawn extra water after extinguishing fire
+ spawnWater();
+ if (waterDroplets.length < 5) {
+ spawnWater();
+ }
// Spawn new fire if needed
if (fires.length < maxFires) {
spawnFire();
}
@@ -487,8 +492,10 @@
// Initialize game
initSnake();
spawnWater();
spawnWater();
+spawnWater();
+spawnWater();
spawnFire();
// Start background music
LK.playMusic('bgmusic');
// Game update loop
@@ -501,9 +508,9 @@
moveTimer = 0;
moveSnake();
}
// Spawn additional water periodically
- if (LK.ticks % 100 === 0 && waterDroplets.length < 4) {
+ if (LK.ticks % 80 === 0 && waterDroplets.length < 6) {
spawnWater();
}
// Increase difficulty - add more fires at higher scores
var currentLevel = Math.floor(LK.getScore() / 300) + 1;