/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { resources: { wood: 0, stone: 0, food: 0, water: 0 }, crafted: { raft: false, axe: false, firepit: false }, mapExplored: 0 }); /**** * Classes ****/ var CraftingButton = Container.expand(function (itemName, requiredResources) { var self = Container.call(this); self.itemName = itemName; self.requiredResources = requiredResources; var buttonGraphics = self.attachAsset('craftingButton', { anchorX: 0, anchorY: 0 }); self.nameText = new Text2(itemName, { size: 22, fill: 0xFFFFFF }); self.nameText.anchor.set(0.5, 0.5); self.nameText.x = 75; self.nameText.y = 30; self.addChild(self.nameText); self.isCrafted = function () { return storage.crafted[itemName] || false; }; self.canCraft = function () { if (self.isCrafted()) { return false; } for (var resource in self.requiredResources) { if ((storage.resources[resource] || 0) < self.requiredResources[resource]) { return false; } } return true; }; self.updateAppearance = function () { if (self.isCrafted()) { buttonGraphics.alpha = 0.5; } else if (self.canCraft()) { buttonGraphics.alpha = 1; } else { buttonGraphics.alpha = 0.7; } }; self.down = function (x, y, obj) { if (self.canCraft()) { self.craftItem(); } }; self.craftItem = function () { if (self.isCrafted() || !self.canCraft()) { return; } // Consume resources for (var resource in self.requiredResources) { storage.resources[resource] -= self.requiredResources[resource]; } // Mark item as crafted storage.crafted[self.itemName] = true; // Give additional score LK.setScore(LK.getScore() + 10); // Play sound LK.getSound('craft').play(); // Update inventory display updateInventoryDisplay(); // Update crafting menu updateCraftingButtons(); // Special actions based on item if (self.itemName === 'raft' && storage.mapExplored >= 10) { // Player has built a raft and explored enough - they win! LK.showYouWin(); } }; self.update = function () { self.updateAppearance(); }; return self; }); var InventorySlot = Container.expand(function (index, resourceType) { var self = Container.call(this); self.index = index; self.resourceType = resourceType; var slotGraphics = self.attachAsset('inventorySlot', { anchorX: 0, anchorY: 0 }); self.countText = new Text2('0', { size: 30, fill: 0xFFFFFF }); self.countText.anchor.set(1, 1); self.countText.x = 65; self.countText.y = 65; self.addChild(self.countText); self.typeText = new Text2(resourceType, { size: 16, fill: 0xFFFFFF }); self.typeText.anchor.set(0, 0); self.typeText.x = 5; self.typeText.y = 5; self.addChild(self.typeText); self.update = function () { var count = storage.resources[resourceType] || 0; self.countText.setText(count.toString()); }; return self; }); var MapTile = Container.expand(function (tileType) { var self = Container.call(this); self.type = tileType || 'beach'; var assetId; switch (self.type) { case 'beach': assetId = 'beachTile'; break; case 'jungle': assetId = 'jungleTile'; break; case 'water': assetId = 'waterTile'; break; case 'mountain': assetId = 'mountainTile'; break; case 'cave': assetId = 'caveTile'; break; default: assetId = 'beachTile'; } var tileGraphics = self.attachAsset(assetId, { anchorX: 0, anchorY: 0 }); self.isWalkable = self.type !== 'water' && self.type !== 'mountain'; self.down = function (x, y, obj) { if (self.isWalkable && player) { player.moveTowards(self.x + 50, self.y + 50); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('playerShape', { anchorX: 0.5, anchorY: 0.5 }); self.energy = 100; self.maxEnergy = 100; self.speed = 5; self.isMoving = false; self.targetX = 0; self.targetY = 0; self.moveTowards = function (x, y) { self.isMoving = true; self.targetX = x; self.targetY = y; }; self.stop = function () { self.isMoving = false; }; self.update = function () { if (self.isMoving) { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.speed) { var ratio = self.speed / distance; self.x += dx * ratio; self.y += dy * ratio; // Reduce energy while moving if (LK.ticks % 30 === 0) { self.energy = Math.max(0, self.energy - 1); } } else { self.x = self.targetX; self.y = self.targetY; self.isMoving = false; } } }; return self; }); var Resource = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'wood'; var assetId; switch (self.type) { case 'wood': assetId = 'resourceWood'; break; case 'stone': assetId = 'resourceStone'; break; case 'food': assetId = 'resourceFood'; break; case 'water': assetId = 'waterResource'; break; default: assetId = 'resourceWood'; } var resourceGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; self.down = function (x, y, obj) { if (!self.collected && playerCanReach(self)) { self.collect(); } }; self.collect = function () { if (self.collected) { return; } self.collected = true; LK.getSound('collect').play(); // Add resource to inventory storage.resources[self.type]++; updateInventoryDisplay(); // Visual feedback tween(resourceGraphics, { alpha: 0, scaleX: 0.2, scaleY: 0.2 }, { duration: 500, onFinish: function onFinish() { self.destroy(); // Remove from resources array var index = resources.indexOf(self); if (index !== -1) { resources.splice(index, 1); } } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1AA7EC }); /**** * Game Code ****/ // Game state variables var player; var resources = []; var mapTiles = []; var inventorySlots = []; var craftingButtons = []; var energyBar; var energyBarBackground; var dayNightCycle = 0; // 0-1000 representing time of day var isDragging = false; var gameMapContainer; var uiContainer; var mapWidth = 20; var mapHeight = 20; var tileSize = 100; // Game functions function initGame() { // Set up containers gameMapContainer = new Container(); game.addChild(gameMapContainer); uiContainer = new Container(); game.addChild(uiContainer); // Generate map generateMap(); // Create player player = new Player(); player.x = 150; player.y = 150; gameMapContainer.addChild(player); // Generate resources generateResources(); // Create UI createUI(); // Start playing music LK.playMusic('islandMusic'); // Center map initially centerMapOnPlayer(); } function generateMap() { for (var y = 0; y < mapHeight; y++) { for (var x = 0; x < mapWidth; x++) { var tileType = determineMapTileType(x, y); var tile = new MapTile(tileType); tile.x = x * tileSize; tile.y = y * tileSize; mapTiles.push(tile); gameMapContainer.addChild(tile); } } } function determineMapTileType(x, y) { // Create interesting map with different biomes var centerX = mapWidth / 2; var centerY = mapHeight / 2; var distFromCenter = Math.sqrt(Math.pow(x - centerX, 2) + Math.pow(y - centerY, 2)); // Water around the edges if (x <= 1 || y <= 1 || x >= mapWidth - 2 || y >= mapHeight - 2) { return 'water'; } // Beach near water if (x <= 3 || y <= 3 || x >= mapWidth - 4 || y >= mapHeight - 4) { return 'beach'; } // Mountain range in one area if (x > mapWidth * 0.6 && y < mapHeight * 0.4 && Math.random() < 0.7) { return 'mountain'; } // A few caves scattered around if (distFromCenter > 5 && Math.random() < 0.05) { return 'cave'; } // Jungle in the middle return 'jungle'; } function generateResources() { // Place resources on appropriate tiles for (var i = 0; i < mapTiles.length; i++) { var tile = mapTiles[i]; // Skip non-walkable tiles if (!tile.isWalkable) { continue; } // Determine if we should place a resource here var chance = 0; var resourceType = ''; switch (tile.type) { case 'beach': chance = 0.1; resourceType = Math.random() < 0.8 ? 'food' : 'water'; break; case 'jungle': chance = 0.2; resourceType = Math.random() < 0.7 ? 'wood' : 'food'; break; case 'cave': chance = 0.5; resourceType = 'stone'; break; } if (Math.random() < chance) { var resource = new Resource(resourceType); resource.x = tile.x + 50 + (Math.random() * 20 - 10); resource.y = tile.y + 50 + (Math.random() * 20 - 10); resources.push(resource); gameMapContainer.addChild(resource); } } } function createUI() { // Energy bar background energyBarBackground = LK.getAsset('energyBarBg', { anchorX: 0, anchorY: 0, x: 1598, y: 50 }); uiContainer.addChild(energyBarBackground); // Energy bar energyBar = LK.getAsset('energyBar', { anchorX: 0, anchorY: 0, x: 1598, y: 50 }); uiContainer.addChild(energyBar); // Inventory slots var resourceTypes = ['wood', 'stone', 'food', 'water']; for (var i = 0; i < resourceTypes.length; i++) { var slot = new InventorySlot(i, resourceTypes[i]); slot.x = 1598 + i % 2 * 80; slot.y = 100 + Math.floor(i / 2) * 80; inventorySlots.push(slot); uiContainer.addChild(slot); } // Create crafting buttons createCraftingMenu(); // Score display var scoreText = new Text2('Score: 0', { size: 30, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); scoreText.x = 120; scoreText.y = 50; uiContainer.addChild(scoreText); // Update function for score scoreText.update = function () { this.setText('Score: ' + LK.getScore()); }; // Instructions var instructionText = new Text2('Collect resources and craft items to escape the island!', { size: 24, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0); instructionText.x = 1024; instructionText.y = 50; uiContainer.addChild(instructionText); } function createCraftingMenu() { var craftingItems = [{ name: 'axe', resources: { wood: 3, stone: 2 } }, { name: 'firepit', resources: { wood: 5, stone: 3 } }, { name: 'raft', resources: { wood: 10, stone: 5 } }]; for (var i = 0; i < craftingItems.length; i++) { var item = craftingItems[i]; var button = new CraftingButton(item.name, item.resources); button.x = 1598; button.y = 280 + i * 70; craftingButtons.push(button); uiContainer.addChild(button); } } function updateInventoryDisplay() { for (var i = 0; i < inventorySlots.length; i++) { inventorySlots[i].update(); } } function updateCraftingButtons() { for (var i = 0; i < craftingButtons.length; i++) { craftingButtons[i].update(); } } function updateEnergyBar() { var percentage = player.energy / player.maxEnergy; energyBar.width = 400 * percentage; // Change color based on energy level if (percentage < 0.2) { energyBar.tint = 0xE74C3C; // Red } else if (percentage < 0.5) { energyBar.tint = 0xF39C12; // Orange } else { energyBar.tint = 0x27AE60; // Green } // Check if player is out of energy if (player.energy <= 0 && !gameLost) { gameLost = true; LK.showGameOver(); } } function centerMapOnPlayer() { gameMapContainer.x = 1024 - player.x; gameMapContainer.y = 1366 - player.y; // Constrain map position var minX = 2048 - mapWidth * tileSize; var minY = 2732 - mapHeight * tileSize; if (gameMapContainer.x > 0) { gameMapContainer.x = 0; } if (gameMapContainer.y > 0) { gameMapContainer.y = 0; } if (gameMapContainer.x < minX) { gameMapContainer.x = minX; } if (gameMapContainer.y < minY) { gameMapContainer.y = minY; } } function playerCanReach(object) { var dx = object.x - player.x; var dy = object.y - player.y; var distance = Math.sqrt(dx * dx + dy * dy); return distance < 100; // Player can reach within 100 pixels } function restoreEnergy() { // Restore energy if the player has food and water if (storage.resources.food > 0 && storage.resources.water > 0) { storage.resources.food--; storage.resources.water--; player.energy = Math.min(player.maxEnergy, player.energy + 50); updateInventoryDisplay(); } } function handleMapClick(x, y) { var localPoint = gameMapContainer.toLocal({ x: x, y: y }); // Convert to tile coordinates var tileX = Math.floor(localPoint.x / tileSize); var tileY = Math.floor(localPoint.y / tileSize); // Make sure coordinates are valid if (tileX >= 0 && tileX < mapWidth && tileY >= 0 && tileY < mapHeight) { // Find the tile at these coordinates var tileIndex = tileY * mapWidth + tileX; var tile = mapTiles[tileIndex]; if (tile && tile.isWalkable) { // Move player to center of tile player.moveTowards(tileX * tileSize + tileSize / 2, tileY * tileSize + tileSize / 2); // Mark tile as explored if it wasn't already if (!tile.explored) { tile.explored = true; storage.mapExplored++; LK.setScore(LK.getScore() + 1); } } } } // Game initialization var gameLost = false; initGame(); // Update function called every tick game.update = function () { // Update day/night cycle dayNightCycle = (dayNightCycle + 1) % 1000; // Update player player.update(); // Center map on player centerMapOnPlayer(); // Update energy bar updateEnergyBar(); // Restore energy automatically over time if player has crafted a firepit if (storage.crafted.firepit && LK.ticks % 300 === 0) { player.energy = Math.min(player.maxEnergy, player.energy + 2); } // Make harvesting more efficient if player has axe if (storage.crafted.axe && LK.ticks % 300 === 0 && resources.length > 0) { // Find nearest wood resource and collect it automatically var nearestWood = null; var nearestDistance = Infinity; for (var i = 0; i < resources.length; i++) { if (resources[i].type === 'wood') { var dx = resources[i].x - player.x; var dy = resources[i].y - player.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < nearestDistance && distance < 200) { nearestDistance = distance; nearestWood = resources[i]; } } } if (nearestWood) { nearestWood.collect(); } } }; // Event handlers game.down = function (x, y, obj) { // Check if we clicked a UI element first var targetUI = false; // Check if click was on inventory or crafting UI if (x > 1598) { targetUI = true; } // If not a UI element, handle map click if (!targetUI) { handleMapClick(x, y); } }; // Keyboard shortcuts (for testing and convenience) LK.setTimeout(function () { // 'R' key to restore energy using food and water window.addEventListener('keydown', function (e) { if (e.key === 'r' || e.key === 'R') { restoreEnergy(); } }); }, 1000);
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,605 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ resources: {
+ wood: 0,
+ stone: 0,
+ food: 0,
+ water: 0
+ },
+ crafted: {
+ raft: false,
+ axe: false,
+ firepit: false
+ },
+ mapExplored: 0
+});
+
+/****
+* Classes
+****/
+var CraftingButton = Container.expand(function (itemName, requiredResources) {
+ var self = Container.call(this);
+ self.itemName = itemName;
+ self.requiredResources = requiredResources;
+ var buttonGraphics = self.attachAsset('craftingButton', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ self.nameText = new Text2(itemName, {
+ size: 22,
+ fill: 0xFFFFFF
+ });
+ self.nameText.anchor.set(0.5, 0.5);
+ self.nameText.x = 75;
+ self.nameText.y = 30;
+ self.addChild(self.nameText);
+ self.isCrafted = function () {
+ return storage.crafted[itemName] || false;
+ };
+ self.canCraft = function () {
+ if (self.isCrafted()) {
+ return false;
+ }
+ for (var resource in self.requiredResources) {
+ if ((storage.resources[resource] || 0) < self.requiredResources[resource]) {
+ return false;
+ }
+ }
+ return true;
+ };
+ self.updateAppearance = function () {
+ if (self.isCrafted()) {
+ buttonGraphics.alpha = 0.5;
+ } else if (self.canCraft()) {
+ buttonGraphics.alpha = 1;
+ } else {
+ buttonGraphics.alpha = 0.7;
+ }
+ };
+ self.down = function (x, y, obj) {
+ if (self.canCraft()) {
+ self.craftItem();
+ }
+ };
+ self.craftItem = function () {
+ if (self.isCrafted() || !self.canCraft()) {
+ return;
+ }
+ // Consume resources
+ for (var resource in self.requiredResources) {
+ storage.resources[resource] -= self.requiredResources[resource];
+ }
+ // Mark item as crafted
+ storage.crafted[self.itemName] = true;
+ // Give additional score
+ LK.setScore(LK.getScore() + 10);
+ // Play sound
+ LK.getSound('craft').play();
+ // Update inventory display
+ updateInventoryDisplay();
+ // Update crafting menu
+ updateCraftingButtons();
+ // Special actions based on item
+ if (self.itemName === 'raft' && storage.mapExplored >= 10) {
+ // Player has built a raft and explored enough - they win!
+ LK.showYouWin();
+ }
+ };
+ self.update = function () {
+ self.updateAppearance();
+ };
+ return self;
+});
+var InventorySlot = Container.expand(function (index, resourceType) {
+ var self = Container.call(this);
+ self.index = index;
+ self.resourceType = resourceType;
+ var slotGraphics = self.attachAsset('inventorySlot', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ self.countText = new Text2('0', {
+ size: 30,
+ fill: 0xFFFFFF
+ });
+ self.countText.anchor.set(1, 1);
+ self.countText.x = 65;
+ self.countText.y = 65;
+ self.addChild(self.countText);
+ self.typeText = new Text2(resourceType, {
+ size: 16,
+ fill: 0xFFFFFF
+ });
+ self.typeText.anchor.set(0, 0);
+ self.typeText.x = 5;
+ self.typeText.y = 5;
+ self.addChild(self.typeText);
+ self.update = function () {
+ var count = storage.resources[resourceType] || 0;
+ self.countText.setText(count.toString());
+ };
+ return self;
+});
+var MapTile = Container.expand(function (tileType) {
+ var self = Container.call(this);
+ self.type = tileType || 'beach';
+ var assetId;
+ switch (self.type) {
+ case 'beach':
+ assetId = 'beachTile';
+ break;
+ case 'jungle':
+ assetId = 'jungleTile';
+ break;
+ case 'water':
+ assetId = 'waterTile';
+ break;
+ case 'mountain':
+ assetId = 'mountainTile';
+ break;
+ case 'cave':
+ assetId = 'caveTile';
+ break;
+ default:
+ assetId = 'beachTile';
+ }
+ var tileGraphics = self.attachAsset(assetId, {
+ anchorX: 0,
+ anchorY: 0
+ });
+ self.isWalkable = self.type !== 'water' && self.type !== 'mountain';
+ self.down = function (x, y, obj) {
+ if (self.isWalkable && player) {
+ player.moveTowards(self.x + 50, self.y + 50);
+ }
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('playerShape', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.energy = 100;
+ self.maxEnergy = 100;
+ self.speed = 5;
+ self.isMoving = false;
+ self.targetX = 0;
+ self.targetY = 0;
+ self.moveTowards = function (x, y) {
+ self.isMoving = true;
+ self.targetX = x;
+ self.targetY = y;
+ };
+ self.stop = function () {
+ self.isMoving = false;
+ };
+ self.update = function () {
+ if (self.isMoving) {
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > self.speed) {
+ var ratio = self.speed / distance;
+ self.x += dx * ratio;
+ self.y += dy * ratio;
+ // Reduce energy while moving
+ if (LK.ticks % 30 === 0) {
+ self.energy = Math.max(0, self.energy - 1);
+ }
+ } else {
+ self.x = self.targetX;
+ self.y = self.targetY;
+ self.isMoving = false;
+ }
+ }
+ };
+ return self;
+});
+var Resource = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'wood';
+ var assetId;
+ switch (self.type) {
+ case 'wood':
+ assetId = 'resourceWood';
+ break;
+ case 'stone':
+ assetId = 'resourceStone';
+ break;
+ case 'food':
+ assetId = 'resourceFood';
+ break;
+ case 'water':
+ assetId = 'waterResource';
+ break;
+ default:
+ assetId = 'resourceWood';
+ }
+ var resourceGraphics = self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.collected = false;
+ self.down = function (x, y, obj) {
+ if (!self.collected && playerCanReach(self)) {
+ self.collect();
+ }
+ };
+ self.collect = function () {
+ if (self.collected) {
+ return;
+ }
+ self.collected = true;
+ LK.getSound('collect').play();
+ // Add resource to inventory
+ storage.resources[self.type]++;
+ updateInventoryDisplay();
+ // Visual feedback
+ tween(resourceGraphics, {
+ alpha: 0,
+ scaleX: 0.2,
+ scaleY: 0.2
+ }, {
+ duration: 500,
+ onFinish: function onFinish() {
+ self.destroy();
+ // Remove from resources array
+ var index = resources.indexOf(self);
+ if (index !== -1) {
+ resources.splice(index, 1);
+ }
+ }
+ });
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x1AA7EC
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var player;
+var resources = [];
+var mapTiles = [];
+var inventorySlots = [];
+var craftingButtons = [];
+var energyBar;
+var energyBarBackground;
+var dayNightCycle = 0; // 0-1000 representing time of day
+var isDragging = false;
+var gameMapContainer;
+var uiContainer;
+var mapWidth = 20;
+var mapHeight = 20;
+var tileSize = 100;
+// Game functions
+function initGame() {
+ // Set up containers
+ gameMapContainer = new Container();
+ game.addChild(gameMapContainer);
+ uiContainer = new Container();
+ game.addChild(uiContainer);
+ // Generate map
+ generateMap();
+ // Create player
+ player = new Player();
+ player.x = 150;
+ player.y = 150;
+ gameMapContainer.addChild(player);
+ // Generate resources
+ generateResources();
+ // Create UI
+ createUI();
+ // Start playing music
+ LK.playMusic('islandMusic');
+ // Center map initially
+ centerMapOnPlayer();
+}
+function generateMap() {
+ for (var y = 0; y < mapHeight; y++) {
+ for (var x = 0; x < mapWidth; x++) {
+ var tileType = determineMapTileType(x, y);
+ var tile = new MapTile(tileType);
+ tile.x = x * tileSize;
+ tile.y = y * tileSize;
+ mapTiles.push(tile);
+ gameMapContainer.addChild(tile);
+ }
+ }
+}
+function determineMapTileType(x, y) {
+ // Create interesting map with different biomes
+ var centerX = mapWidth / 2;
+ var centerY = mapHeight / 2;
+ var distFromCenter = Math.sqrt(Math.pow(x - centerX, 2) + Math.pow(y - centerY, 2));
+ // Water around the edges
+ if (x <= 1 || y <= 1 || x >= mapWidth - 2 || y >= mapHeight - 2) {
+ return 'water';
+ }
+ // Beach near water
+ if (x <= 3 || y <= 3 || x >= mapWidth - 4 || y >= mapHeight - 4) {
+ return 'beach';
+ }
+ // Mountain range in one area
+ if (x > mapWidth * 0.6 && y < mapHeight * 0.4 && Math.random() < 0.7) {
+ return 'mountain';
+ }
+ // A few caves scattered around
+ if (distFromCenter > 5 && Math.random() < 0.05) {
+ return 'cave';
+ }
+ // Jungle in the middle
+ return 'jungle';
+}
+function generateResources() {
+ // Place resources on appropriate tiles
+ for (var i = 0; i < mapTiles.length; i++) {
+ var tile = mapTiles[i];
+ // Skip non-walkable tiles
+ if (!tile.isWalkable) {
+ continue;
+ }
+ // Determine if we should place a resource here
+ var chance = 0;
+ var resourceType = '';
+ switch (tile.type) {
+ case 'beach':
+ chance = 0.1;
+ resourceType = Math.random() < 0.8 ? 'food' : 'water';
+ break;
+ case 'jungle':
+ chance = 0.2;
+ resourceType = Math.random() < 0.7 ? 'wood' : 'food';
+ break;
+ case 'cave':
+ chance = 0.5;
+ resourceType = 'stone';
+ break;
+ }
+ if (Math.random() < chance) {
+ var resource = new Resource(resourceType);
+ resource.x = tile.x + 50 + (Math.random() * 20 - 10);
+ resource.y = tile.y + 50 + (Math.random() * 20 - 10);
+ resources.push(resource);
+ gameMapContainer.addChild(resource);
+ }
+ }
+}
+function createUI() {
+ // Energy bar background
+ energyBarBackground = LK.getAsset('energyBarBg', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 1598,
+ y: 50
+ });
+ uiContainer.addChild(energyBarBackground);
+ // Energy bar
+ energyBar = LK.getAsset('energyBar', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 1598,
+ y: 50
+ });
+ uiContainer.addChild(energyBar);
+ // Inventory slots
+ var resourceTypes = ['wood', 'stone', 'food', 'water'];
+ for (var i = 0; i < resourceTypes.length; i++) {
+ var slot = new InventorySlot(i, resourceTypes[i]);
+ slot.x = 1598 + i % 2 * 80;
+ slot.y = 100 + Math.floor(i / 2) * 80;
+ inventorySlots.push(slot);
+ uiContainer.addChild(slot);
+ }
+ // Create crafting buttons
+ createCraftingMenu();
+ // Score display
+ var scoreText = new Text2('Score: 0', {
+ size: 30,
+ fill: 0xFFFFFF
+ });
+ scoreText.anchor.set(0, 0);
+ scoreText.x = 120;
+ scoreText.y = 50;
+ uiContainer.addChild(scoreText);
+ // Update function for score
+ scoreText.update = function () {
+ this.setText('Score: ' + LK.getScore());
+ };
+ // Instructions
+ var instructionText = new Text2('Collect resources and craft items to escape the island!', {
+ size: 24,
+ fill: 0xFFFFFF
+ });
+ instructionText.anchor.set(0.5, 0);
+ instructionText.x = 1024;
+ instructionText.y = 50;
+ uiContainer.addChild(instructionText);
+}
+function createCraftingMenu() {
+ var craftingItems = [{
+ name: 'axe',
+ resources: {
+ wood: 3,
+ stone: 2
+ }
+ }, {
+ name: 'firepit',
+ resources: {
+ wood: 5,
+ stone: 3
+ }
+ }, {
+ name: 'raft',
+ resources: {
+ wood: 10,
+ stone: 5
+ }
+ }];
+ for (var i = 0; i < craftingItems.length; i++) {
+ var item = craftingItems[i];
+ var button = new CraftingButton(item.name, item.resources);
+ button.x = 1598;
+ button.y = 280 + i * 70;
+ craftingButtons.push(button);
+ uiContainer.addChild(button);
+ }
+}
+function updateInventoryDisplay() {
+ for (var i = 0; i < inventorySlots.length; i++) {
+ inventorySlots[i].update();
+ }
+}
+function updateCraftingButtons() {
+ for (var i = 0; i < craftingButtons.length; i++) {
+ craftingButtons[i].update();
+ }
+}
+function updateEnergyBar() {
+ var percentage = player.energy / player.maxEnergy;
+ energyBar.width = 400 * percentage;
+ // Change color based on energy level
+ if (percentage < 0.2) {
+ energyBar.tint = 0xE74C3C; // Red
+ } else if (percentage < 0.5) {
+ energyBar.tint = 0xF39C12; // Orange
+ } else {
+ energyBar.tint = 0x27AE60; // Green
+ }
+ // Check if player is out of energy
+ if (player.energy <= 0 && !gameLost) {
+ gameLost = true;
+ LK.showGameOver();
+ }
+}
+function centerMapOnPlayer() {
+ gameMapContainer.x = 1024 - player.x;
+ gameMapContainer.y = 1366 - player.y;
+ // Constrain map position
+ var minX = 2048 - mapWidth * tileSize;
+ var minY = 2732 - mapHeight * tileSize;
+ if (gameMapContainer.x > 0) {
+ gameMapContainer.x = 0;
+ }
+ if (gameMapContainer.y > 0) {
+ gameMapContainer.y = 0;
+ }
+ if (gameMapContainer.x < minX) {
+ gameMapContainer.x = minX;
+ }
+ if (gameMapContainer.y < minY) {
+ gameMapContainer.y = minY;
+ }
+}
+function playerCanReach(object) {
+ var dx = object.x - player.x;
+ var dy = object.y - player.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ return distance < 100; // Player can reach within 100 pixels
+}
+function restoreEnergy() {
+ // Restore energy if the player has food and water
+ if (storage.resources.food > 0 && storage.resources.water > 0) {
+ storage.resources.food--;
+ storage.resources.water--;
+ player.energy = Math.min(player.maxEnergy, player.energy + 50);
+ updateInventoryDisplay();
+ }
+}
+function handleMapClick(x, y) {
+ var localPoint = gameMapContainer.toLocal({
+ x: x,
+ y: y
+ });
+ // Convert to tile coordinates
+ var tileX = Math.floor(localPoint.x / tileSize);
+ var tileY = Math.floor(localPoint.y / tileSize);
+ // Make sure coordinates are valid
+ if (tileX >= 0 && tileX < mapWidth && tileY >= 0 && tileY < mapHeight) {
+ // Find the tile at these coordinates
+ var tileIndex = tileY * mapWidth + tileX;
+ var tile = mapTiles[tileIndex];
+ if (tile && tile.isWalkable) {
+ // Move player to center of tile
+ player.moveTowards(tileX * tileSize + tileSize / 2, tileY * tileSize + tileSize / 2);
+ // Mark tile as explored if it wasn't already
+ if (!tile.explored) {
+ tile.explored = true;
+ storage.mapExplored++;
+ LK.setScore(LK.getScore() + 1);
+ }
+ }
+ }
+}
+// Game initialization
+var gameLost = false;
+initGame();
+// Update function called every tick
+game.update = function () {
+ // Update day/night cycle
+ dayNightCycle = (dayNightCycle + 1) % 1000;
+ // Update player
+ player.update();
+ // Center map on player
+ centerMapOnPlayer();
+ // Update energy bar
+ updateEnergyBar();
+ // Restore energy automatically over time if player has crafted a firepit
+ if (storage.crafted.firepit && LK.ticks % 300 === 0) {
+ player.energy = Math.min(player.maxEnergy, player.energy + 2);
+ }
+ // Make harvesting more efficient if player has axe
+ if (storage.crafted.axe && LK.ticks % 300 === 0 && resources.length > 0) {
+ // Find nearest wood resource and collect it automatically
+ var nearestWood = null;
+ var nearestDistance = Infinity;
+ for (var i = 0; i < resources.length; i++) {
+ if (resources[i].type === 'wood') {
+ var dx = resources[i].x - player.x;
+ var dy = resources[i].y - player.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < nearestDistance && distance < 200) {
+ nearestDistance = distance;
+ nearestWood = resources[i];
+ }
+ }
+ }
+ if (nearestWood) {
+ nearestWood.collect();
+ }
+ }
+};
+// Event handlers
+game.down = function (x, y, obj) {
+ // Check if we clicked a UI element first
+ var targetUI = false;
+ // Check if click was on inventory or crafting UI
+ if (x > 1598) {
+ targetUI = true;
+ }
+ // If not a UI element, handle map click
+ if (!targetUI) {
+ handleMapClick(x, y);
+ }
+};
+// Keyboard shortcuts (for testing and convenience)
+LK.setTimeout(function () {
+ // 'R' key to restore energy using food and water
+ window.addEventListener('keydown', function (e) {
+ if (e.key === 'r' || e.key === 'R') {
+ restoreEnergy();
+ }
+ });
+}, 1000);
\ No newline at end of file