User prompt
Que sea más fácil poner las ratas
User prompt
No funciona
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'to')' in or related to this line: 'tween(resultCard).to({' Line Number: 628 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Que se puedan poner las unidades
User prompt
Que al darle a summon se abra una pantalla que puedes rollear i obtener unidades
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var localPos = self.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 447
User prompt
Pon una zona de invocación i un inventario
User prompt
Please fix the bug: 'Cannot read properties of null (reading 'setText')' in or related to this line: 'cheeseText.setText('Cheese: ' + cheesePoints);' Line Number: 527
User prompt
Please fix the bug: 'Cannot read properties of null (reading 'setText')' in or related to this line: 'cheeseText.setText('Cheese: ' + cheesePoints);' Line Number: 527
User prompt
Que haya un menú
User prompt
Que hayan más indicadores
User prompt
Que el camino se muestre de gris
User prompt
Quitar lag
User prompt
Que las ratas se puedan mejorar más daño y rango
User prompt
Que sea jugable en movil
User prompt
Que sea jugable en móvil
User prompt
Que haya un cat boss y un fast cat boss
User prompt
Que se muestre por donde van los gatos
User prompt
Que el mapa esté en el centro
User prompt
Que se vea adonde puedes poner las ratas
User prompt
Quitar decoración
Code edit (1 edits merged)
Please save this source code
User prompt
Rat Defense: Cheese Guardians
Initial prompt
Rat tower defense defiende el queso de los gatos hay diferentes tipos de ratas
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.damage = 25;
self.targetX = 0;
self.targetY = 0;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distanceSquared = dx * dx + dy * dy;
var speedSquared = self.speed * self.speed;
if (distanceSquared < speedSquared) {
self.x = self.targetX;
self.y = self.targetY;
self.reachedTarget = true;
} else {
var distance = Math.sqrt(distanceSquared);
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
var Cat = Container.expand(function () {
var self = Container.call(this);
self.catType = 'basic';
self.health = 50;
self.maxHealth = 50;
self.speed = 1;
self.pathIndex = 0;
self.cheeseValue = 10;
var graphics = self.attachAsset('catBasic', {
anchorX: 0.5,
anchorY: 0.5
});
// Health bar background
self.healthBarBg = self.attachAsset('healthBarBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -50
});
// Health bar foreground
self.healthBar = self.attachAsset('healthBar', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -50
});
self.update = function () {
if (self.pathIndex < gamePath.length) {
var targetTile = gamePath[self.pathIndex];
var dx = targetTile.x - self.x;
var dy = targetTile.y - self.y;
var distanceSquared = dx * dx + dy * dy;
if (distanceSquared < 25) {
// 5 * 5 = 25
self.pathIndex++;
if (self.pathIndex >= gamePath.length) {
self.reachedCheese = true;
}
} else {
var distance = Math.sqrt(distanceSquared);
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
}
};
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health <= 0) {
self.isDead = true;
LK.effects.flashObject(self, 0xFF0000, 200);
} else {
// Update health bar
var healthPercent = self.health / self.maxHealth;
self.healthBar.scaleX = healthPercent;
if (healthPercent > 0.6) {
self.healthBar.tint = 0x00FF00; // Green
} else if (healthPercent > 0.3) {
self.healthBar.tint = 0xFFFF00; // Yellow
} else {
self.healthBar.tint = 0xFF0000; // Red
}
}
};
return self;
});
var FastCat = Cat.expand(function () {
var self = Cat.call(this);
self.catType = 'fast';
self.health = 30;
self.maxHealth = 30;
self.speed = 2;
self.cheeseValue = 15;
self.removeChild(self.children[0]);
var graphics = self.attachAsset('catFast', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var FastCatBoss = FastCat.expand(function () {
var self = FastCat.call(this);
self.catType = 'fastboss';
self.health = 120;
self.maxHealth = 120;
self.speed = 1.5;
self.cheeseValue = 75;
self.removeChild(self.children[0]);
var graphics = self.attachAsset('catFast', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.8,
scaleY: 1.8
});
graphics.tint = 0x4B0082; // Indigo tint for fast boss
return self;
});
var CatBoss = Cat.expand(function () {
var self = Cat.call(this);
self.catType = 'boss';
self.health = 200;
self.maxHealth = 200;
self.speed = 0.5;
self.cheeseValue = 50;
self.removeChild(self.children[0]);
var graphics = self.attachAsset('catBasic', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
graphics.tint = 0x8B0000; // Dark red tint for boss
return self;
});
var CollectedUnitSlot = Container.expand(function (collectedUnit, index) {
var self = Container.call(this);
self.collectedUnit = collectedUnit;
self.isSelected = false;
var slotGraphics = self.attachAsset('inventorySlot', {
anchorX: 0.5,
anchorY: 0.5
});
slotGraphics.tint = collectedUnit.color;
slotGraphics.scaleX = 0.8;
slotGraphics.scaleY = 0.8;
// Add unit preview
var ratAsset = collectedUnit.type === 'warrior' ? 'ratWarrior' : 'ratArcher';
var ratPreview = self.attachAsset(ratAsset, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.5,
scaleY: 0.5,
y: -10
});
// Add rarity text
var rarityText = new Text2(collectedUnit.rarity.charAt(0).toUpperCase(), {
size: 20,
fill: '#FFFFFF'
});
rarityText.anchor.set(0.5, 0.5);
rarityText.y = 25;
self.addChild(rarityText);
self.setSelected = function (selected) {
self.isSelected = selected;
slotGraphics.alpha = selected ? 0.8 : 1.0;
if (selected) {
slotGraphics.scaleX = 0.9;
slotGraphics.scaleY = 0.9;
} else {
slotGraphics.scaleX = 0.8;
slotGraphics.scaleY = 0.8;
}
};
self.down = function (x, y, obj) {
if (gameStarted && !upgradeMode) {
selectedCollectedUnit = self.collectedUnit;
selectedRatType = null; // Deselect basic rat types
// Update all inventory slots selection
for (var i = 0; i < inventorySlots.length; i++) {
inventorySlots[i].setSelected(false);
}
// Update all collected unit slots selection
updateCollectedUnitsDisplay();
}
};
return self;
});
var InventorySlot = Container.expand(function (ratType, cost) {
var self = Container.call(this);
self.ratType = ratType;
self.cost = cost;
self.isSelected = false;
var slotGraphics = self.attachAsset('inventorySlot', {
anchorX: 0.5,
anchorY: 0.5
});
// Add rat preview
var ratAsset = ratType === 'warrior' ? 'ratWarrior' : 'ratArcher';
var ratPreview = self.attachAsset(ratAsset, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.6,
scaleY: 0.6,
y: -15
});
// Add cost text
var costText = new Text2(cost.toString(), {
size: 25,
fill: '#FFD700'
});
costText.anchor.set(0.5, 0.5);
costText.y = 35;
self.addChild(costText);
// Add type label
var typeText = new Text2(ratType.toUpperCase(), {
size: 20,
fill: '#FFFFFF'
});
typeText.anchor.set(0.5, 0.5);
typeText.y = -45;
self.addChild(typeText);
self.setSelected = function (selected) {
self.isSelected = selected;
slotGraphics.tint = selected ? 0x00FF00 : 0xFFFFFF;
slotGraphics.alpha = selected ? 0.8 : 1.0;
};
self.canAfford = function () {
return cheesePoints >= self.cost;
};
self.updateDisplay = function () {
var affordable = self.canAfford();
ratPreview.alpha = affordable ? 1.0 : 0.5;
costText.tint = affordable ? 0xFFD700 : 0xFF0000;
};
self.down = function (x, y, obj) {
if (gameStarted && !upgradeMode) {
selectedRatType = self.ratType;
selectedCollectedUnit = null; // Deselect collected units
// Update all inventory slots selection
for (var i = 0; i < inventorySlots.length; i++) {
inventorySlots[i].setSelected(inventorySlots[i].ratType === selectedRatType);
}
// Update collected unit slots to deselect them
updateCollectedUnitsDisplay();
updateUI();
}
};
return self;
});
var MainMenu = Container.expand(function () {
var self = Container.call(this);
// Menu background
var menuBg = LK.getAsset('healthBarBg', {
anchorX: 0,
anchorY: 0,
scaleX: 34,
scaleY: 91,
x: 0,
y: 0
});
menuBg.alpha = 0.8;
self.addChild(menuBg);
// Game title
var titleText = new Text2('RAT DEFENSE', {
size: 120,
fill: '#FFD700'
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 800;
self.addChild(titleText);
// Subtitle
var subtitleText = new Text2('Defend Your Cheese!', {
size: 60,
fill: '#FFFFFF'
});
subtitleText.anchor.set(0.5, 0.5);
subtitleText.x = 1024;
subtitleText.y = 950;
self.addChild(subtitleText);
// Start button
var startButton = new Text2('START GAME', {
size: 80,
fill: '#00FF00'
});
startButton.anchor.set(0.5, 0.5);
startButton.x = 1024;
startButton.y = 1400;
self.addChild(startButton);
// Instructions
var instructionsText = new Text2('Place rats to defend against cats\nUpgrade your rats for better defense', {
size: 45,
fill: '#CCCCCC'
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 1024;
instructionsText.y = 1600;
self.addChild(instructionsText);
startButton.down = function () {
self.destroy();
gameStarted = true;
initializeGame();
};
return self;
});
var Rat = Container.expand(function () {
var self = Container.call(this);
self.ratType = 'warrior';
self.range = 150;
self.damage = 25;
self.fireRate = 60;
self.lastShot = 0;
self.cost = 50;
self.upgradeLevel = 0;
self.maxUpgrades = 3;
var graphics = self.attachAsset('ratWarrior', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (LK.ticks - self.lastShot > self.fireRate) {
var target = self.findTarget();
if (target) {
self.shoot(target);
self.lastShot = LK.ticks;
}
}
};
self.findTarget = function () {
var closestCat = null;
var closestDistanceSquared = Infinity;
var rangeSquared = self.range * self.range;
for (var i = 0; i < cats.length; i++) {
var cat = cats[i];
var dx = cat.x - self.x;
var dy = cat.y - self.y;
var distanceSquared = dx * dx + dy * dy;
if (distanceSquared <= rangeSquared && distanceSquared < closestDistanceSquared) {
closestDistanceSquared = distanceSquared;
closestCat = cat;
}
}
return closestCat;
};
self.shoot = function (target) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.targetX = target.x;
bullet.targetY = target.y;
bullet.damage = self.damage;
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
self.upgrade = function () {
if (self.upgradeLevel < self.maxUpgrades) {
self.upgradeLevel++;
// Increase damage by 50% per upgrade
self.damage = Math.floor(self.damage * 1.5);
// Increase range by 25% per upgrade
self.range = Math.floor(self.range * 1.25);
// Visual indicator of upgrade
self.children[0].tint = self.upgradeLevel === 1 ? 0x00FF00 : self.upgradeLevel === 2 ? 0x0000FF : 0xFF00FF;
self.children[0].scaleX = 1 + self.upgradeLevel * 0.2;
self.children[0].scaleY = 1 + self.upgradeLevel * 0.2;
// Update range indicator if visible
self.updateRangeIndicator();
// Add upgrade level stars
self.showUpgradeStars();
return true;
}
return false;
};
self.getUpgradeCost = function () {
return (self.upgradeLevel + 1) * self.cost;
};
self.canUpgrade = function () {
return self.upgradeLevel < self.maxUpgrades;
};
self.showRangeIndicator = function () {
if (!self.rangeIndicator) {
self.rangeIndicator = LK.getAsset('rangeIndicator', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: self.range / 2,
scaleY: self.range / 2,
x: self.x,
y: self.y
});
self.rangeIndicator.alpha = 0.3;
game.addChild(self.rangeIndicator);
}
};
self.hideRangeIndicator = function () {
if (self.rangeIndicator) {
self.rangeIndicator.destroy();
self.rangeIndicator = null;
}
};
self.updateRangeIndicator = function () {
if (self.rangeIndicator) {
self.rangeIndicator.scaleX = self.range / 2;
self.rangeIndicator.scaleY = self.range / 2;
self.rangeIndicator.x = self.x;
self.rangeIndicator.y = self.y;
}
};
self.showUpgradeStars = function () {
// Remove existing stars
if (self.upgradeStars) {
for (var i = 0; i < self.upgradeStars.length; i++) {
self.upgradeStars[i].destroy();
}
}
self.upgradeStars = [];
// Add stars based on upgrade level
for (var i = 0; i < self.upgradeLevel; i++) {
var star = new Text2('★', {
size: 25,
fill: '#FFD700'
});
star.anchor.set(0.5, 0.5);
star.x = self.x - 30 + i * 20;
star.y = self.y - 60;
self.upgradeStars.push(star);
game.addChild(star);
}
};
return self;
});
var ArcherRat = Rat.expand(function () {
var self = Rat.call(this);
self.ratType = 'archer';
self.range = 220;
self.damage = 20;
self.fireRate = 45;
self.cost = 75;
self.upgradeLevel = 0;
self.maxUpgrades = 3;
self.removeChild(self.children[0]);
var graphics = self.attachAsset('ratArcher', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var RollScreen = Container.expand(function () {
var self = Container.call(this);
// Background overlay
var overlay = LK.getAsset('healthBarBg', {
anchorX: 0,
anchorY: 0,
scaleX: 34,
scaleY: 91,
x: 0,
y: 0
});
overlay.alpha = 0.9;
overlay.tint = 0x000033;
self.addChild(overlay);
// Title
var titleText = new Text2('SUMMON UNITS', {
size: 100,
fill: '#FFD700'
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 400;
self.addChild(titleText);
// Roll result area
var resultContainer = new Container();
resultContainer.x = 1024;
resultContainer.y = 1000;
self.addChild(resultContainer);
// Single roll button
var singleRollButton = new Text2('SINGLE ROLL (25 Cheese)', {
size: 60,
fill: '#00FF00'
});
singleRollButton.anchor.set(0.5, 0.5);
singleRollButton.x = 512;
singleRollButton.y = 1600;
self.addChild(singleRollButton);
// Multi roll button
var multiRollButton = new Text2('MULTI ROLL x5 (100 Cheese)', {
size: 60,
fill: '#0080FF'
});
multiRollButton.anchor.set(0.5, 0.5);
multiRollButton.x = 1536;
multiRollButton.y = 1600;
self.addChild(multiRollButton);
// Close button
var closeButton = new Text2('CLOSE', {
size: 50,
fill: '#FF4444'
});
closeButton.anchor.set(0.5, 0.5);
closeButton.x = 1024;
closeButton.y = 2200;
self.addChild(closeButton);
// Roll rarities and chances
var rollTable = [{
type: 'warrior',
rarity: 'common',
chance: 0.6,
color: 0xCCCCCC
}, {
type: 'archer',
rarity: 'common',
chance: 0.25,
color: 0xCCCCCC
}, {
type: 'warrior',
rarity: 'rare',
chance: 0.1,
color: 0x0080FF
}, {
type: 'archer',
rarity: 'rare',
chance: 0.04,
color: 0x0080FF
}, {
type: 'warrior',
rarity: 'legendary',
chance: 0.008,
color: 0xFF8000
}, {
type: 'archer',
rarity: 'legendary',
chance: 0.002,
color: 0xFF8000
}];
self.performRoll = function () {
var random = Math.random();
var cumulative = 0;
for (var i = 0; i < rollTable.length; i++) {
cumulative += rollTable[i].chance;
if (random <= cumulative) {
return rollTable[i];
}
}
return rollTable[0]; // Fallback to common warrior
};
self.showRollResult = function (results) {
// Clear previous results
while (resultContainer.children.length > 0) {
resultContainer.removeChild(resultContainer.children[0]);
}
for (var i = 0; i < results.length; i++) {
var result = results[i];
var resultCard = new Container();
// Card background
var cardBg = LK.getAsset('inventorySlot', {
anchorX: 0.5,
anchorY: 0.5
});
cardBg.tint = result.color;
cardBg.scaleX = 1.5;
cardBg.scaleY = 1.5;
resultCard.addChild(cardBg);
// Unit preview
var unitAsset = result.type === 'warrior' ? 'ratWarrior' : 'ratArcher';
var unitPreview = LK.getAsset(unitAsset, {
anchorX: 0.5,
anchorY: 0.5,
y: -20
});
resultCard.addChild(unitPreview);
// Rarity text
var rarityText = new Text2(result.rarity.toUpperCase(), {
size: 25,
fill: '#FFFFFF'
});
rarityText.anchor.set(0.5, 0.5);
rarityText.y = 60;
resultCard.addChild(rarityText);
// Type text
var typeText = new Text2(result.type.toUpperCase(), {
size: 20,
fill: '#FFFFFF'
});
typeText.anchor.set(0.5, 0.5);
typeText.y = 85;
resultCard.addChild(typeText);
// Position cards
if (results.length === 1) {
resultCard.x = 0;
} else {
resultCard.x = (i - 2) * 200;
}
resultCard.y = 0;
// Scale animation
resultCard.scaleX = 0;
resultCard.scaleY = 0;
tween(resultCard, {
scaleX: 1,
scaleY: 1
}, {
duration: 500
});
resultContainer.addChild(resultCard);
// Add to player inventory based on rarity
var ratCost = result.type === 'warrior' ? 50 : 75;
if (result.rarity === 'rare') {
ratCost = Math.floor(ratCost * 0.8); // 20% discount for rare
} else if (result.rarity === 'legendary') {
ratCost = Math.floor(ratCost * 0.6); // 40% discount for legendary
}
// Add unit to collected units
var collectedUnit = {
type: result.type,
rarity: result.rarity,
color: result.color,
cost: ratCost
};
collectedUnits.push(collectedUnit);
// Give bonus cheese for higher rarities
if (result.rarity === 'rare') {
cheesePoints += 15;
} else if (result.rarity === 'legendary') {
cheesePoints += 50;
}
}
updateUI();
};
singleRollButton.down = function () {
if (cheesePoints >= 25) {
cheesePoints -= 25;
var result = self.performRoll();
self.showRollResult([result]);
LK.effects.flashScreen(0x00FF00, 200);
}
};
multiRollButton.down = function () {
if (cheesePoints >= 100) {
cheesePoints -= 100;
var results = [];
for (var i = 0; i < 5; i++) {
results.push(self.performRoll());
}
self.showRollResult(results);
LK.effects.flashScreen(0x0080FF, 300);
}
};
closeButton.down = function () {
self.destroy();
rollScreen = null;
};
return self;
});
var SummoningZone = Container.expand(function () {
var self = Container.call(this);
var zoneGraphics = self.attachAsset('summonZone', {
anchorX: 0.5,
anchorY: 0.5
});
zoneGraphics.alpha = 0.3;
var zoneText = new Text2('GACHA ROLLS', {
size: 40,
fill: '#FFFFFF'
});
zoneText.anchor.set(0.5, 0.5);
zoneText.y = -30;
self.addChild(zoneText);
var instructionText = new Text2('Tap to open roll screen', {
size: 25,
fill: '#CCCCCC'
});
instructionText.anchor.set(0.5, 0.5);
instructionText.y = 0;
self.addChild(instructionText);
var instructionText2 = new Text2('Place rats on green tiles anywhere', {
size: 25,
fill: '#90EE90'
});
instructionText2.anchor.set(0.5, 0.5);
instructionText2.y = 30;
self.addChild(instructionText2);
// Summon button for gacha rolls
var summonButton = new Text2('OPEN ROLLS', {
size: 35,
fill: '#FFD700'
});
summonButton.anchor.set(0.5, 0.5);
summonButton.y = 60;
self.addChild(summonButton);
self.down = function (x, y, obj) {
if (gameStarted && !upgradeMode) {
// Open roll screen for gacha summons
if (!rollScreen) {
rollScreen = new RollScreen();
game.addChild(rollScreen);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2F4F2F
});
/****
* Game Code
****/
// Game state
var gameStarted = false;
var mainMenu = null;
// Center map offset for mobile display
var mapOffsetX = (2048 - 1200) / 2;
var mapOffsetY = 200;
var gamePath = [{
x: 40 + mapOffsetX,
y: 400 + mapOffsetY
}, {
x: 200 + mapOffsetX,
y: 400 + mapOffsetY
}, {
x: 200 + mapOffsetX,
y: 200 + mapOffsetY
}, {
x: 400 + mapOffsetX,
y: 200 + mapOffsetY
}, {
x: 400 + mapOffsetX,
y: 500 + mapOffsetY
}, {
x: 600 + mapOffsetX,
y: 500 + mapOffsetY
}, {
x: 600 + mapOffsetX,
y: 300 + mapOffsetY
}, {
x: 800 + mapOffsetX,
y: 300 + mapOffsetY
}, {
x: 800 + mapOffsetX,
y: 600 + mapOffsetY
}, {
x: 1000 + mapOffsetX,
y: 600 + mapOffsetY
}, {
x: 1000 + mapOffsetX,
y: 400 + mapOffsetY
}, {
x: 1200 + mapOffsetX,
y: 400 + mapOffsetY
}];
var placementTiles = [{
x: 120 + mapOffsetX,
y: 280 + mapOffsetY
}, {
x: 280 + mapOffsetX,
y: 280 + mapOffsetY
}, {
x: 320 + mapOffsetX,
y: 280 + mapOffsetY
}, {
x: 480 + mapOffsetX,
y: 280 + mapOffsetY
}, {
x: 520 + mapOffsetX,
y: 380 + mapOffsetY
}, {
x: 520 + mapOffsetX,
y: 420 + mapOffsetY
}, {
x: 680 + mapOffsetX,
y: 380 + mapOffsetY
}, {
x: 680 + mapOffsetX,
y: 420 + mapOffsetY
}, {
x: 720 + mapOffsetX,
y: 200 + mapOffsetY
}, {
x: 880 + mapOffsetX,
y: 200 + mapOffsetY
}, {
x: 880 + mapOffsetX,
y: 500 + mapOffsetY
}, {
x: 1080 + mapOffsetX,
y: 500 + mapOffsetY
}, {
x: 1080 + mapOffsetX,
y: 300 + mapOffsetY
}, {
x: 120 + mapOffsetX,
y: 320 + mapOffsetY
}, {
x: 280 + mapOffsetX,
y: 120 + mapOffsetY
}, {
x: 480 + mapOffsetX,
y: 120 + mapOffsetY
}, {
x: 680 + mapOffsetX,
y: 580 + mapOffsetY
}, {
x: 880 + mapOffsetX,
y: 580 + mapOffsetY
}];
var cats = [];
var rats = [];
var bullets = [];
var cheesePoints = 150;
var lives = 5;
var currentWave = 1;
var waveInProgress = false;
var catsToSpawn = 0;
var spawnTimer = 0;
var selectedRatType = 'warrior';
var selectedRat = null;
var upgradeMode = false;
// Initialize game variables
var pathIndicators = [];
var placementIndicators = [];
var cheese = null;
var cheeseText = null;
var livesText = null;
var waveText = null;
var startWaveButton = null;
var ratTypeButton = null;
var upgradeButton = null;
var upgradeInfoText = null;
var summoningZone = null;
var inventorySlots = [];
var rollScreen = null;
// Collected units from rolls
var collectedUnits = [];
var selectedCollectedUnit = null;
function startWave() {
if (!waveInProgress) {
waveInProgress = true;
catsToSpawn = 3 + currentWave * 2;
spawnTimer = 0;
startWaveButton.setText('WAVE IN PROGRESS');
startWaveButton.tint = 0xFF0000;
}
}
function spawnCat() {
var cat;
var random = Math.random();
// Spawn boss cats in later waves
if (currentWave >= 8 && random < 0.15) {
cat = new FastCatBoss();
} else if (currentWave >= 5 && random < 0.2) {
cat = new CatBoss();
} else if (random < 0.3 && currentWave > 2) {
cat = new FastCat();
} else {
cat = new Cat();
}
cat.x = gamePath[0].x;
cat.y = gamePath[0].y;
cat.health += currentWave * 10;
cat.maxHealth = cat.health;
cats.push(cat);
game.addChild(cat);
catsToSpawn--;
}
var collectedUnitSlots = [];
function updateCollectedUnitsDisplay() {
// Remove existing collected unit slots
for (var i = 0; i < collectedUnitSlots.length; i++) {
collectedUnitSlots[i].destroy();
}
collectedUnitSlots = [];
// Create new slots for collected units
for (var i = 0; i < collectedUnits.length && i < 8; i++) {
var slot = new CollectedUnitSlot(collectedUnits[i], i);
slot.x = 500 + i % 4 * 100;
slot.y = 2400 + Math.floor(i / 4) * 100;
collectedUnitSlots.push(slot);
game.addChild(slot);
// Select if this is the selected unit
if (selectedCollectedUnit === collectedUnits[i]) {
slot.setSelected(true);
}
}
}
function updateUI() {
if (!cheeseText) return; // Don't update UI if elements aren't initialized yet
cheeseText.setText('Cheese: ' + cheesePoints);
livesText.setText('Lives: ' + lives);
waveText.setText('Wave: ' + currentWave);
if (selectedCollectedUnit) {
ratTypeButton.setText('COLLECTED: ' + selectedCollectedUnit.type.toUpperCase() + ' (' + selectedCollectedUnit.rarity + ')');
} else if (selectedRatType) {
var ratCost = selectedRatType === 'warrior' ? 50 : 75;
ratTypeButton.setText('RAT: ' + selectedRatType.toUpperCase() + ' (' + ratCost + ')');
} else {
ratTypeButton.setText('SELECT A UNIT');
}
upgradeButton.setText('UPGRADE MODE: ' + (upgradeMode ? 'ON' : 'OFF'));
upgradeButton.tint = upgradeMode ? 0x00FF00 : 0x9932CC;
if (selectedRat && upgradeMode) {
var upgradeCost = selectedRat.getUpgradeCost();
var canAfford = cheesePoints >= upgradeCost;
var canUpgrade = selectedRat.canUpgrade();
if (canUpgrade) {
upgradeInfoText.setText('UPGRADE (' + upgradeCost + ') - DMG:' + Math.floor(selectedRat.damage * 1.5) + ' RNG:' + Math.floor(selectedRat.range * 1.25));
upgradeInfoText.tint = canAfford ? 0x00FF00 : 0xFF0000;
} else {
upgradeInfoText.setText('MAX LEVEL REACHED');
upgradeInfoText.tint = 0xFFFF00;
}
} else {
upgradeInfoText.setText(upgradeMode ? 'SELECT A RAT TO UPGRADE' : '');
upgradeInfoText.tint = 0xFFFFFF;
}
// Update inventory slots
if (inventorySlots && inventorySlots.length > 0) {
for (var i = 0; i < inventorySlots.length; i++) {
inventorySlots[i].updateDisplay();
}
}
// Update collected units display
updateCollectedUnitsDisplay();
}
function canPlaceRat(x, y) {
var placementDistanceSquared = 100 * 100; // 10000 - increased radius for easier targeting
for (var i = 0; i < placementTiles.length; i++) {
var tile = placementTiles[i];
var dx = x - tile.x;
var dy = y - tile.y;
if (dx * dx + dy * dy < placementDistanceSquared) {
// Check if tile is already occupied
for (var j = 0; j < rats.length; j++) {
var ratDx = rats[j].x - tile.x;
var ratDy = rats[j].y - tile.y;
if (ratDx * ratDx + ratDy * ratDy < 60 * 60) {
// Keep original occupied check radius
return false;
}
}
return true;
}
}
return false;
}
function initializeGame() {
// Create visual path indicators to show where cats walk
pathIndicators = [];
for (var i = 0; i < gamePath.length; i++) {
var pathPoint = gamePath[i];
var indicator = LK.getAsset('pathIndicator', {
anchorX: 0.5,
anchorY: 0.5,
x: pathPoint.x,
y: pathPoint.y
});
indicator.alpha = 0.6;
pathIndicators.push(indicator);
game.addChild(indicator);
}
// Create visual indicators for placement tiles
placementIndicators = [];
for (var i = 0; i < placementTiles.length; i++) {
var tile = placementTiles[i];
var indicator = LK.getAsset('summonZone', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.4,
scaleY: 0.4,
x: tile.x,
y: tile.y
});
indicator.alpha = 0.4;
indicator.tint = 0x90EE90;
placementIndicators.push(indicator);
game.addChild(indicator);
}
// Create cheese at the end
cheese = LK.getAsset('cheese', {
anchorX: 0.5,
anchorY: 0.5,
x: gamePath[gamePath.length - 1].x,
y: gamePath[gamePath.length - 1].y
});
game.addChild(cheese);
// UI Elements
cheeseText = new Text2('Cheese: ' + cheesePoints, {
size: 60,
fill: '#FFD700'
});
cheeseText.anchor.set(0, 0);
cheeseText.x = 120;
LK.gui.topLeft.addChild(cheeseText);
livesText = new Text2('Lives: ' + lives, {
size: 60,
fill: '#FF6347'
});
livesText.anchor.set(0, 0);
livesText.x = 120;
livesText.y = 80;
LK.gui.topLeft.addChild(livesText);
waveText = new Text2('Wave: ' + currentWave, {
size: 60,
fill: '#87CEEB'
});
waveText.anchor.set(0, 0);
waveText.x = 120;
waveText.y = 160;
LK.gui.topLeft.addChild(waveText);
startWaveButton = new Text2('START WAVE', {
size: 70,
fill: '#00FF00'
});
startWaveButton.anchor.set(0.5, 0.5);
startWaveButton.down = function () {
startWave();
};
LK.gui.bottom.addChild(startWaveButton);
ratTypeButton = new Text2('RAT: WARRIOR (50)', {
size: 55,
fill: '#8B4513'
});
ratTypeButton.anchor.set(0.5, 0.5);
ratTypeButton.y = -120;
ratTypeButton.down = function () {
selectedRatType = selectedRatType === 'warrior' ? 'archer' : 'warrior';
};
LK.gui.bottom.addChild(ratTypeButton);
upgradeButton = new Text2('UPGRADE MODE: OFF', {
size: 50,
fill: '#9932CC'
});
upgradeButton.anchor.set(0.5, 0.5);
upgradeButton.y = -200;
upgradeButton.down = function () {
upgradeMode = !upgradeMode;
selectedRat = null;
updateUI();
};
LK.gui.bottom.addChild(upgradeButton);
upgradeInfoText = new Text2('', {
size: 45,
fill: '#FFFFFF'
});
upgradeInfoText.anchor.set(0.5, 0.5);
upgradeInfoText.y = -280;
LK.gui.bottom.addChild(upgradeInfoText);
// Create summoning zone
summoningZone = new SummoningZone();
summoningZone.x = 1024;
summoningZone.y = 1800;
game.addChild(summoningZone);
// Create inventory slots
inventorySlots = [];
var warriorSlot = new InventorySlot('warrior', 50);
warriorSlot.x = 200;
warriorSlot.y = 2400;
inventorySlots.push(warriorSlot);
game.addChild(warriorSlot);
var archerSlot = new InventorySlot('archer', 75);
archerSlot.x = 350;
archerSlot.y = 2400;
inventorySlots.push(archerSlot);
game.addChild(archerSlot);
// Set initial selection
selectedRatType = 'warrior';
warriorSlot.setSelected(true);
updateUI();
}
function placeRat(x, y) {
var ratCost = selectedRatType === 'warrior' ? 50 : 75;
if (cheesePoints >= ratCost && canPlaceRat(x, y)) {
var rat;
if (selectedRatType === 'warrior') {
rat = new Rat();
} else {
rat = new ArcherRat();
}
// Snap to nearest placement tile
var nearestTile = null;
var nearestDistanceSquared = Infinity;
for (var i = 0; i < placementTiles.length; i++) {
var tile = placementTiles[i];
var dx = x - tile.x;
var dy = y - tile.y;
var distanceSquared = dx * dx + dy * dy;
if (distanceSquared < nearestDistanceSquared) {
nearestDistanceSquared = distanceSquared;
nearestTile = tile;
}
}
rat.x = nearestTile.x;
rat.y = nearestTile.y;
rats.push(rat);
game.addChild(rat);
cheesePoints -= ratCost;
// Update placement indicator for this tile
for (var k = 0; k < placementTiles.length; k++) {
if (placementTiles[k].x === nearestTile.x && placementTiles[k].y === nearestTile.y) {
placementIndicators[k].tint = 0xFF6347; // Red tint to show occupied
placementIndicators[k].alpha = 0.2; // Make it more transparent
break;
}
}
LK.getSound('ratPlace').play();
updateUI();
}
}
// Show main menu initially
mainMenu = new MainMenu();
game.addChild(mainMenu);
game.down = function (x, y, obj) {
if (!gameStarted) return;
if (upgradeMode) {
// Check if clicking on a rat for upgrade
var clickedRat = null;
var clickDistanceSquared = 60 * 60; // 3600
for (var i = 0; i < rats.length; i++) {
var rat = rats[i];
var dx = x - rat.x;
var dy = y - rat.y;
if (dx * dx + dy * dy < clickDistanceSquared) {
clickedRat = rat;
break;
}
}
if (clickedRat) {
if (selectedRat === clickedRat) {
// Clicking same rat again - perform upgrade
if (clickedRat.canUpgrade() && cheesePoints >= clickedRat.getUpgradeCost()) {
cheesePoints -= clickedRat.getUpgradeCost();
clickedRat.upgrade();
LK.effects.flashObject(clickedRat, 0x00FF00, 500);
updateUI();
}
} else {
// Select this rat
// Hide range indicator for previously selected rat
if (selectedRat) {
selectedRat.hideRangeIndicator();
}
selectedRat = clickedRat;
// Remove selection indicator from all rats
for (var j = 0; j < rats.length; j++) {
rats[j].children[0].alpha = 1.0;
rats[j].hideRangeIndicator();
}
// Add selection indicator and show range
selectedRat.children[0].alpha = 0.7;
selectedRat.showRangeIndicator();
updateUI();
}
} else {
// Clicked empty space - deselect
if (selectedRat) {
selectedRat.hideRangeIndicator();
}
selectedRat = null;
for (var j = 0; j < rats.length; j++) {
rats[j].children[0].alpha = 1.0;
rats[j].hideRangeIndicator();
}
updateUI();
}
} else {
// Try to place a rat if we have one selected and can place it
if (selectedCollectedUnit && canPlaceRat(x, y)) {
// Place collected unit
var rat;
if (selectedCollectedUnit.type === 'warrior') {
rat = new Rat();
} else {
rat = new ArcherRat();
}
// Apply rarity bonuses
if (selectedCollectedUnit.rarity === 'rare') {
rat.damage = Math.floor(rat.damage * 1.3);
rat.range = Math.floor(rat.range * 1.2);
rat.children[0].tint = 0x0080FF;
} else if (selectedCollectedUnit.rarity === 'legendary') {
rat.damage = Math.floor(rat.damage * 1.8);
rat.range = Math.floor(rat.range * 1.5);
rat.children[0].tint = 0xFF8000;
}
// Snap to nearest placement tile
var nearestTile = null;
var nearestDistanceSquared = Infinity;
for (var k = 0; k < placementTiles.length; k++) {
var tile = placementTiles[k];
var dx = x - tile.x;
var dy = y - tile.y;
var distanceSquared = dx * dx + dy * dy;
if (distanceSquared < nearestDistanceSquared) {
nearestDistanceSquared = distanceSquared;
nearestTile = tile;
}
}
rat.x = nearestTile.x;
rat.y = nearestTile.y;
rats.push(rat);
game.addChild(rat);
// Remove unit from collected units
for (var i = 0; i < collectedUnits.length; i++) {
if (collectedUnits[i] === selectedCollectedUnit) {
collectedUnits.splice(i, 1);
break;
}
}
selectedCollectedUnit = null;
LK.getSound('ratPlace').play();
updateUI();
} else if (selectedRatType && canPlaceRat(x, y)) {
// Place basic rat
var ratCost = selectedRatType === 'warrior' ? 50 : 75;
if (cheesePoints >= ratCost) {
var rat;
if (selectedRatType === 'warrior') {
rat = new Rat();
} else {
rat = new ArcherRat();
}
// Snap to nearest placement tile
var nearestTile = null;
var nearestDistanceSquared = Infinity;
for (var k = 0; k < placementTiles.length; k++) {
var tile = placementTiles[k];
var dx = x - tile.x;
var dy = y - tile.y;
var distanceSquared = dx * dx + dy * dy;
if (distanceSquared < nearestDistanceSquared) {
nearestDistanceSquared = distanceSquared;
nearestTile = tile;
}
}
rat.x = nearestTile.x;
rat.y = nearestTile.y;
rats.push(rat);
game.addChild(rat);
cheesePoints -= ratCost;
// Update placement indicator for this tile
for (var k = 0; k < placementTiles.length; k++) {
if (placementTiles[k].x === nearestTile.x && placementTiles[k].y === nearestTile.y) {
placementIndicators[k].tint = 0xFF6347; // Red tint to show occupied
placementIndicators[k].alpha = 0.2; // Make it more transparent
break;
}
}
LK.getSound('ratPlace').play();
updateUI();
}
}
}
};
game.update = function () {
if (!gameStarted) return;
// Spawn cats during wave
if (waveInProgress && catsToSpawn > 0) {
spawnTimer++;
if (spawnTimer >= 90) {
spawnCat();
spawnTimer = 0;
}
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
if (bullet.reachedTarget) {
// Check collision with cats using squared distance (avoid sqrt)
var collisionDistanceSquared = 45 * 45; // 2025
for (var j = cats.length - 1; j >= 0; j--) {
var cat = cats[j];
var dx = bullet.x - cat.x;
var dy = bullet.y - cat.y;
if (dx * dx + dy * dy < collisionDistanceSquared) {
cat.takeDamage(bullet.damage);
break;
}
}
bullet.destroy();
bullets.splice(i, 1);
}
}
// Update cats
for (var i = cats.length - 1; i >= 0; i--) {
var cat = cats[i];
if (cat.isDead) {
cheesePoints += cat.cheeseValue;
cat.destroy();
cats.splice(i, 1);
LK.getSound('catDefeat').play();
updateUI();
} else if (cat.reachedCheese) {
lives--;
cat.destroy();
cats.splice(i, 1);
updateUI();
if (lives <= 0) {
LK.showGameOver();
}
}
}
// Check if wave is complete
if (waveInProgress && catsToSpawn === 0 && cats.length === 0) {
waveInProgress = false;
currentWave++;
if (currentWave > 10) {
LK.showYouWin();
} else {
cheesePoints += 25;
startWaveButton.setText('START WAVE');
startWaveButton.tint = 0x00FF00;
updateUI();
}
}
};
updateUI(); ===================================================================
--- original.js
+++ change.js
@@ -670,100 +670,43 @@
anchorX: 0.5,
anchorY: 0.5
});
zoneGraphics.alpha = 0.3;
- var zoneText = new Text2('SUMMONING ZONE', {
+ var zoneText = new Text2('GACHA ROLLS', {
size: 40,
fill: '#FFFFFF'
});
zoneText.anchor.set(0.5, 0.5);
- zoneText.y = -10;
+ zoneText.y = -30;
self.addChild(zoneText);
- var instructionText = new Text2('Tap to summon selected rat', {
+ var instructionText = new Text2('Tap to open roll screen', {
size: 25,
fill: '#CCCCCC'
});
instructionText.anchor.set(0.5, 0.5);
- instructionText.y = 20;
+ instructionText.y = 0;
self.addChild(instructionText);
+ var instructionText2 = new Text2('Place rats on green tiles anywhere', {
+ size: 25,
+ fill: '#90EE90'
+ });
+ instructionText2.anchor.set(0.5, 0.5);
+ instructionText2.y = 30;
+ self.addChild(instructionText2);
// Summon button for gacha rolls
- var summonButton = new Text2('SUMMON UNITS', {
+ var summonButton = new Text2('OPEN ROLLS', {
size: 35,
fill: '#FFD700'
});
summonButton.anchor.set(0.5, 0.5);
- summonButton.y = 50;
+ summonButton.y = 60;
self.addChild(summonButton);
self.down = function (x, y, obj) {
if (gameStarted && !upgradeMode) {
- // Check if clicking on summon button area (bottom part of zone)
- if (y > 30) {
- // Open roll screen
- if (!rollScreen) {
- rollScreen = new RollScreen();
- game.addChild(rollScreen);
- }
- } else {
- // Get global position for rat placement
- var globalPos = self.toGlobal({
- x: x,
- y: y
- });
- var gamePos = game.toLocal(globalPos);
- // Check if we have a collected unit selected
- if (selectedCollectedUnit) {
- // Place collected unit
- var rat;
- if (selectedCollectedUnit.type === 'warrior') {
- rat = new Rat();
- } else {
- rat = new ArcherRat();
- }
- // Apply rarity bonuses
- if (selectedCollectedUnit.rarity === 'rare') {
- rat.damage = Math.floor(rat.damage * 1.3);
- rat.range = Math.floor(rat.range * 1.2);
- rat.children[0].tint = 0x0080FF;
- } else if (selectedCollectedUnit.rarity === 'legendary') {
- rat.damage = Math.floor(rat.damage * 1.8);
- rat.range = Math.floor(rat.range * 1.5);
- rat.children[0].tint = 0xFF8000;
- }
- // Position rat at click location
- rat.x = gamePos.x;
- rat.y = gamePos.y;
- rats.push(rat);
- game.addChild(rat);
- // Remove unit from collected units
- for (var i = 0; i < collectedUnits.length; i++) {
- if (collectedUnits[i] === selectedCollectedUnit) {
- collectedUnits.splice(i, 1);
- break;
- }
- }
- selectedCollectedUnit = null;
- LK.getSound('ratPlace').play();
- updateUI();
- } else if (selectedRatType) {
- // Original rat placement functionality for basic units
- var ratCost = selectedRatType === 'warrior' ? 50 : 75;
- if (cheesePoints >= ratCost) {
- var rat;
- if (selectedRatType === 'warrior') {
- rat = new Rat();
- } else {
- rat = new ArcherRat();
- }
- // Position rat at click location
- rat.x = gamePos.x;
- rat.y = gamePos.y;
- rats.push(rat);
- game.addChild(rat);
- cheesePoints -= ratCost;
- LK.getSound('ratPlace').play();
- updateUI();
- }
- }
+ // Open roll screen for gacha summons
+ if (!rollScreen) {
+ rollScreen = new RollScreen();
+ game.addChild(rollScreen);
}
}
};
return self;
@@ -995,9 +938,9 @@
// Update collected units display
updateCollectedUnitsDisplay();
}
function canPlaceRat(x, y) {
- var placementDistanceSquared = 60 * 60; // 3600
+ var placementDistanceSquared = 100 * 100; // 10000 - increased radius for easier targeting
for (var i = 0; i < placementTiles.length; i++) {
var tile = placementTiles[i];
var dx = x - tile.x;
var dy = y - tile.y;
@@ -1005,9 +948,10 @@
// Check if tile is already occupied
for (var j = 0; j < rats.length; j++) {
var ratDx = rats[j].x - tile.x;
var ratDy = rats[j].y - tile.y;
- if (ratDx * ratDx + ratDy * ratDy < placementDistanceSquared) {
+ if (ratDx * ratDx + ratDy * ratDy < 60 * 60) {
+ // Keep original occupied check radius
return false;
}
}
return true;
@@ -1033,15 +977,17 @@
// Create visual indicators for placement tiles
placementIndicators = [];
for (var i = 0; i < placementTiles.length; i++) {
var tile = placementTiles[i];
- var indicator = LK.getAsset('ratWarrior', {
+ var indicator = LK.getAsset('summonZone', {
anchorX: 0.5,
anchorY: 0.5,
+ scaleX: 0.4,
+ scaleY: 0.4,
x: tile.x,
y: tile.y
});
- indicator.alpha = 0.3;
+ indicator.alpha = 0.4;
indicator.tint = 0x90EE90;
placementIndicators.push(indicator);
game.addChild(indicator);
}
@@ -1232,9 +1178,94 @@
}
updateUI();
}
} else {
- // Rat placement now handled by summoning zone
+ // Try to place a rat if we have one selected and can place it
+ if (selectedCollectedUnit && canPlaceRat(x, y)) {
+ // Place collected unit
+ var rat;
+ if (selectedCollectedUnit.type === 'warrior') {
+ rat = new Rat();
+ } else {
+ rat = new ArcherRat();
+ }
+ // Apply rarity bonuses
+ if (selectedCollectedUnit.rarity === 'rare') {
+ rat.damage = Math.floor(rat.damage * 1.3);
+ rat.range = Math.floor(rat.range * 1.2);
+ rat.children[0].tint = 0x0080FF;
+ } else if (selectedCollectedUnit.rarity === 'legendary') {
+ rat.damage = Math.floor(rat.damage * 1.8);
+ rat.range = Math.floor(rat.range * 1.5);
+ rat.children[0].tint = 0xFF8000;
+ }
+ // Snap to nearest placement tile
+ var nearestTile = null;
+ var nearestDistanceSquared = Infinity;
+ for (var k = 0; k < placementTiles.length; k++) {
+ var tile = placementTiles[k];
+ var dx = x - tile.x;
+ var dy = y - tile.y;
+ var distanceSquared = dx * dx + dy * dy;
+ if (distanceSquared < nearestDistanceSquared) {
+ nearestDistanceSquared = distanceSquared;
+ nearestTile = tile;
+ }
+ }
+ rat.x = nearestTile.x;
+ rat.y = nearestTile.y;
+ rats.push(rat);
+ game.addChild(rat);
+ // Remove unit from collected units
+ for (var i = 0; i < collectedUnits.length; i++) {
+ if (collectedUnits[i] === selectedCollectedUnit) {
+ collectedUnits.splice(i, 1);
+ break;
+ }
+ }
+ selectedCollectedUnit = null;
+ LK.getSound('ratPlace').play();
+ updateUI();
+ } else if (selectedRatType && canPlaceRat(x, y)) {
+ // Place basic rat
+ var ratCost = selectedRatType === 'warrior' ? 50 : 75;
+ if (cheesePoints >= ratCost) {
+ var rat;
+ if (selectedRatType === 'warrior') {
+ rat = new Rat();
+ } else {
+ rat = new ArcherRat();
+ }
+ // Snap to nearest placement tile
+ var nearestTile = null;
+ var nearestDistanceSquared = Infinity;
+ for (var k = 0; k < placementTiles.length; k++) {
+ var tile = placementTiles[k];
+ var dx = x - tile.x;
+ var dy = y - tile.y;
+ var distanceSquared = dx * dx + dy * dy;
+ if (distanceSquared < nearestDistanceSquared) {
+ nearestDistanceSquared = distanceSquared;
+ nearestTile = tile;
+ }
+ }
+ rat.x = nearestTile.x;
+ rat.y = nearestTile.y;
+ rats.push(rat);
+ game.addChild(rat);
+ cheesePoints -= ratCost;
+ // Update placement indicator for this tile
+ for (var k = 0; k < placementTiles.length; k++) {
+ if (placementTiles[k].x === nearestTile.x && placementTiles[k].y === nearestTile.y) {
+ placementIndicators[k].tint = 0xFF6347; // Red tint to show occupied
+ placementIndicators[k].alpha = 0.2; // Make it more transparent
+ break;
+ }
+ }
+ LK.getSound('ratPlace').play();
+ updateUI();
+ }
+ }
}
};
game.update = function () {
if (!gameStarted) return;
Cat. In-Game asset. 2d. High contrast. No shadows
Chese. In-Game asset. 2d. High contrast. No shadows
Rat with a arco. In-Game asset. 2d. High contrast. No shadows
Rata con pistola. In-Game asset. 2d. High contrast. No shadows
bomberRat. In-Game asset. 2d. High contrast. No shadows
zombie rat. In-Game asset. 2d. High contrast. No shadows
wizard rat. In-Game asset. 2d. High contrast. No shadows
wizard cat. In-Game asset. 2d. High contrast. No shadows
zombie ca. In-Game asset. 2d. High contrast. No shadows
strong cat. In-Game asset. 2d. High contrast. No shadows