/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Acid = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('acid', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = 1;
self.speed = 2;
self.lastX = 0;
self.update = function () {
self.lastX = self.x;
self.x += self.direction * self.speed;
if (self.x <= 75 || self.x >= 1973) {
self.direction *= -1;
}
};
return self;
});
var Animal = Container.expand(function (type) {
var self = Container.call(this);
self.animalType = type;
self.isSelected = false;
self.speed = 3;
self.lastX = 0;
self.lastY = 0;
var graphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
// Animal specific properties
if (type === 'owl' || type === 'crow') {
self.canFly = true;
self.speed = 4;
} else if (type === 'shark' || type === 'otter') {
self.canSwim = true;
self.speed = 5;
} else if (type === 'bear' || type === 'trex') {
self.hasStrength = true;
self.speed = 2;
}
self.select = function () {
self.isSelected = true;
graphics.tint = 0xFFFFFF;
tween(graphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200
});
};
self.deselect = function () {
self.isSelected = false;
graphics.tint = 0xFFFFFF;
tween(graphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 200
});
};
self.moveTo = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - 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;
}
};
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
// Keep animals within bounds
if (self.x < 50) self.x = 50;
if (self.x > 1998) self.x = 1998;
if (self.y < 50) self.y = 50;
if (self.y > 2682) self.y = 2682;
};
return self;
});
var Collectible = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('collectible', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.pulse = 0;
self.update = function () {
if (!self.collected) {
self.pulse += 0.1;
graphics.scaleX = 1 + Math.sin(self.pulse) * 0.2;
graphics.scaleY = 1 + Math.sin(self.pulse) * 0.2;
}
};
self.collect = function () {
if (!self.collected) {
self.collected = true;
LK.getSound('collect').play();
tween(graphics, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300
});
}
};
return self;
});
var Wall = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('wall', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = 1;
self.speed = 1;
self.lastY = 0;
self.update = function () {
self.lastY = self.y;
self.y += self.direction * self.speed;
if (self.y <= 100 || self.y >= 2632) {
self.direction *= -1;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2F1B14
});
/****
* Game Code
****/
// Game variables
var animals = [];
var animalTypes = ['koala', 'otter', 'bear', 'trex', 'lion', 'owl', 'crow', 'shark', 'cow'];
var selectedAnimal = null;
var selectedIndex = 0;
var targetX = 0;
var targetY = 0;
var isMoving = false;
var acids = [];
var walls = [];
var collectibles = [];
var collectiblesFound = 0;
var totalCollectibles = 6;
var currentLevel = 1;
var animalsEscaped = 0;
// Background
var background = game.attachAsset('stomach_bg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
// Create exit
var exit = game.attachAsset('exit', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 150
});
// Create animals
for (var i = 0; i < animalTypes.length; i++) {
var animal = new Animal(animalTypes[i]);
animal.x = 200 + i % 3 * 150;
animal.y = 2400 + Math.floor(i / 3) * 100;
animals.push(animal);
game.addChild(animal);
}
// Select first animal
selectedAnimal = animals[0];
selectedAnimal.select();
// Create hazards
for (var i = 0; i < 4; i++) {
var acid = new Acid();
acid.x = 200 + i * 400;
acid.y = 800 + i * 300;
acids.push(acid);
game.addChild(acid);
}
for (var i = 0; i < 3; i++) {
var wall = new Wall();
wall.x = 300 + i * 600;
wall.y = 1200 + i * 200;
walls.push(wall);
game.addChild(wall);
}
// Create collectibles
for (var i = 0; i < totalCollectibles; i++) {
var collectible = new Collectible();
collectible.x = 300 + i % 2 * 1400;
collectible.y = 600 + Math.floor(i / 2) * 400;
collectibles.push(collectible);
game.addChild(collectible);
}
// UI
var instructionText = new Text2('Tap to select animal, tap again to move', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
var scoreText = new Text2('Collectibles: 0/' + totalCollectibles, {
size: 80,
fill: 0xFFD700
});
scoreText.anchor.set(0, 0);
scoreText.x = 150;
scoreText.y = 100;
LK.gui.topLeft.addChild(scoreText);
var animalText = new Text2('Animal: ' + selectedAnimal.animalType.toUpperCase(), {
size: 70,
fill: 0x87CEEB
});
animalText.anchor.set(1, 0);
LK.gui.topRight.addChild(animalText);
// Event handlers
game.down = function (x, y, obj) {
// Check if clicking on an animal
var clickedAnimal = null;
for (var i = 0; i < animals.length; i++) {
var animal = animals[i];
var dx = x - animal.x;
var dy = y - animal.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 50) {
clickedAnimal = animal;
break;
}
}
if (clickedAnimal) {
// Select new animal
if (selectedAnimal) {
selectedAnimal.deselect();
}
selectedAnimal = clickedAnimal;
selectedAnimal.select();
selectedIndex = animals.indexOf(selectedAnimal);
animalText.setText('Animal: ' + selectedAnimal.animalType.toUpperCase());
LK.getSound('switch').play();
} else {
// Move selected animal
if (selectedAnimal) {
targetX = x;
targetY = y;
isMoving = true;
}
}
};
// Game update loop
game.update = function () {
// Move selected animal
if (isMoving && selectedAnimal) {
selectedAnimal.moveTo(targetX, targetY);
var dx = targetX - selectedAnimal.x;
var dy = targetY - selectedAnimal.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 10) {
isMoving = false;
}
}
// Check collisions with acids
for (var i = 0; i < acids.length; i++) {
var acid = acids[i];
for (var j = 0; j < animals.length; j++) {
var animal = animals[j];
if (animal.intersects(acid)) {
// Reset animal position
animal.x = 200 + j % 3 * 150;
animal.y = 2400 + Math.floor(j / 3) * 100;
LK.getSound('danger').play();
LK.effects.flashScreen(0xFF0000, 500);
break;
}
}
}
// Check collisions with walls
for (var i = 0; i < walls.length; i++) {
var wall = walls[i];
for (var j = 0; j < animals.length; j++) {
var animal = animals[j];
if (animal.intersects(wall)) {
// Push animal away from wall
var dx = animal.x - wall.x;
var dy = animal.y - wall.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
animal.x = wall.x + dx / distance * 100;
animal.y = wall.y + dy / distance * 100;
}
}
}
}
// Check collectible collection
for (var i = 0; i < collectibles.length; i++) {
var collectible = collectibles[i];
if (!collectible.collected) {
for (var j = 0; j < animals.length; j++) {
var animal = animals[j];
if (animal.intersects(collectible)) {
collectible.collect();
collectiblesFound++;
scoreText.setText('Collectibles: ' + collectiblesFound + '/' + totalCollectibles);
break;
}
}
}
}
// Check exit condition
if (collectiblesFound >= totalCollectibles) {
for (var i = 0; i < animals.length; i++) {
var animal = animals[i];
if (animal.intersects(exit)) {
animalsEscaped++;
animal.x = -100; // Move off screen
animal.y = -100;
if (animalsEscaped >= animals.length) {
LK.setScore(100);
LK.showYouWin();
}
break;
}
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Acid = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('acid', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = 1;
self.speed = 2;
self.lastX = 0;
self.update = function () {
self.lastX = self.x;
self.x += self.direction * self.speed;
if (self.x <= 75 || self.x >= 1973) {
self.direction *= -1;
}
};
return self;
});
var Animal = Container.expand(function (type) {
var self = Container.call(this);
self.animalType = type;
self.isSelected = false;
self.speed = 3;
self.lastX = 0;
self.lastY = 0;
var graphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
// Animal specific properties
if (type === 'owl' || type === 'crow') {
self.canFly = true;
self.speed = 4;
} else if (type === 'shark' || type === 'otter') {
self.canSwim = true;
self.speed = 5;
} else if (type === 'bear' || type === 'trex') {
self.hasStrength = true;
self.speed = 2;
}
self.select = function () {
self.isSelected = true;
graphics.tint = 0xFFFFFF;
tween(graphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200
});
};
self.deselect = function () {
self.isSelected = false;
graphics.tint = 0xFFFFFF;
tween(graphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 200
});
};
self.moveTo = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - 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;
}
};
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
// Keep animals within bounds
if (self.x < 50) self.x = 50;
if (self.x > 1998) self.x = 1998;
if (self.y < 50) self.y = 50;
if (self.y > 2682) self.y = 2682;
};
return self;
});
var Collectible = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('collectible', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.pulse = 0;
self.update = function () {
if (!self.collected) {
self.pulse += 0.1;
graphics.scaleX = 1 + Math.sin(self.pulse) * 0.2;
graphics.scaleY = 1 + Math.sin(self.pulse) * 0.2;
}
};
self.collect = function () {
if (!self.collected) {
self.collected = true;
LK.getSound('collect').play();
tween(graphics, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300
});
}
};
return self;
});
var Wall = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('wall', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = 1;
self.speed = 1;
self.lastY = 0;
self.update = function () {
self.lastY = self.y;
self.y += self.direction * self.speed;
if (self.y <= 100 || self.y >= 2632) {
self.direction *= -1;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2F1B14
});
/****
* Game Code
****/
// Game variables
var animals = [];
var animalTypes = ['koala', 'otter', 'bear', 'trex', 'lion', 'owl', 'crow', 'shark', 'cow'];
var selectedAnimal = null;
var selectedIndex = 0;
var targetX = 0;
var targetY = 0;
var isMoving = false;
var acids = [];
var walls = [];
var collectibles = [];
var collectiblesFound = 0;
var totalCollectibles = 6;
var currentLevel = 1;
var animalsEscaped = 0;
// Background
var background = game.attachAsset('stomach_bg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
// Create exit
var exit = game.attachAsset('exit', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 150
});
// Create animals
for (var i = 0; i < animalTypes.length; i++) {
var animal = new Animal(animalTypes[i]);
animal.x = 200 + i % 3 * 150;
animal.y = 2400 + Math.floor(i / 3) * 100;
animals.push(animal);
game.addChild(animal);
}
// Select first animal
selectedAnimal = animals[0];
selectedAnimal.select();
// Create hazards
for (var i = 0; i < 4; i++) {
var acid = new Acid();
acid.x = 200 + i * 400;
acid.y = 800 + i * 300;
acids.push(acid);
game.addChild(acid);
}
for (var i = 0; i < 3; i++) {
var wall = new Wall();
wall.x = 300 + i * 600;
wall.y = 1200 + i * 200;
walls.push(wall);
game.addChild(wall);
}
// Create collectibles
for (var i = 0; i < totalCollectibles; i++) {
var collectible = new Collectible();
collectible.x = 300 + i % 2 * 1400;
collectible.y = 600 + Math.floor(i / 2) * 400;
collectibles.push(collectible);
game.addChild(collectible);
}
// UI
var instructionText = new Text2('Tap to select animal, tap again to move', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
var scoreText = new Text2('Collectibles: 0/' + totalCollectibles, {
size: 80,
fill: 0xFFD700
});
scoreText.anchor.set(0, 0);
scoreText.x = 150;
scoreText.y = 100;
LK.gui.topLeft.addChild(scoreText);
var animalText = new Text2('Animal: ' + selectedAnimal.animalType.toUpperCase(), {
size: 70,
fill: 0x87CEEB
});
animalText.anchor.set(1, 0);
LK.gui.topRight.addChild(animalText);
// Event handlers
game.down = function (x, y, obj) {
// Check if clicking on an animal
var clickedAnimal = null;
for (var i = 0; i < animals.length; i++) {
var animal = animals[i];
var dx = x - animal.x;
var dy = y - animal.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 50) {
clickedAnimal = animal;
break;
}
}
if (clickedAnimal) {
// Select new animal
if (selectedAnimal) {
selectedAnimal.deselect();
}
selectedAnimal = clickedAnimal;
selectedAnimal.select();
selectedIndex = animals.indexOf(selectedAnimal);
animalText.setText('Animal: ' + selectedAnimal.animalType.toUpperCase());
LK.getSound('switch').play();
} else {
// Move selected animal
if (selectedAnimal) {
targetX = x;
targetY = y;
isMoving = true;
}
}
};
// Game update loop
game.update = function () {
// Move selected animal
if (isMoving && selectedAnimal) {
selectedAnimal.moveTo(targetX, targetY);
var dx = targetX - selectedAnimal.x;
var dy = targetY - selectedAnimal.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 10) {
isMoving = false;
}
}
// Check collisions with acids
for (var i = 0; i < acids.length; i++) {
var acid = acids[i];
for (var j = 0; j < animals.length; j++) {
var animal = animals[j];
if (animal.intersects(acid)) {
// Reset animal position
animal.x = 200 + j % 3 * 150;
animal.y = 2400 + Math.floor(j / 3) * 100;
LK.getSound('danger').play();
LK.effects.flashScreen(0xFF0000, 500);
break;
}
}
}
// Check collisions with walls
for (var i = 0; i < walls.length; i++) {
var wall = walls[i];
for (var j = 0; j < animals.length; j++) {
var animal = animals[j];
if (animal.intersects(wall)) {
// Push animal away from wall
var dx = animal.x - wall.x;
var dy = animal.y - wall.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
animal.x = wall.x + dx / distance * 100;
animal.y = wall.y + dy / distance * 100;
}
}
}
}
// Check collectible collection
for (var i = 0; i < collectibles.length; i++) {
var collectible = collectibles[i];
if (!collectible.collected) {
for (var j = 0; j < animals.length; j++) {
var animal = animals[j];
if (animal.intersects(collectible)) {
collectible.collect();
collectiblesFound++;
scoreText.setText('Collectibles: ' + collectiblesFound + '/' + totalCollectibles);
break;
}
}
}
}
// Check exit condition
if (collectiblesFound >= totalCollectibles) {
for (var i = 0; i < animals.length; i++) {
var animal = animals[i];
if (animal.intersects(exit)) {
animalsEscaped++;
animal.x = -100; // Move off screen
animal.y = -100;
if (animalsEscaped >= animals.length) {
LK.setScore(100);
LK.showYouWin();
}
break;
}
}
}
};