/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Fighter = Container.expand(function (isPlayer) { var self = Container.call(this); self.isPlayer = isPlayer || false; self.maxHealth = 100; self.health = self.maxHealth; self.isBlocking = false; self.isAttacking = false; self.attackCooldown = 0; self.comboCount = 0; self.comboTimer = 0; var fighterGraphics = self.attachAsset(self.isPlayer ? 'player' : 'enemy', { anchorX: 0.5, anchorY: 1.0 }); self.takeDamage = function (damage) { if (self.isBlocking) { damage = Math.floor(damage * 0.3); LK.getSound('block').play(); } else { LK.getSound('hit').play(); LK.effects.flashObject(self, 0xff0000, 300); } self.health = Math.max(0, self.health - damage); return self.health <= 0; }; self.punch = function () { if (self.attackCooldown > 0 || self.isAttacking) return false; self.isAttacking = true; self.attackCooldown = 30; self.comboCount++; self.comboTimer = 60; LK.getSound('punch').play(); var originalX = self.x; var moveDistance = self.isPlayer ? 50 : -50; tween(self, { x: originalX + moveDistance }, { duration: 150, easing: tween.easeOut, onFinish: function onFinish() { tween(self, { x: originalX }, { duration: 150, easing: tween.easeIn, onFinish: function onFinish() { self.isAttacking = false; } }); } }); return true; }; self.kick = function () { if (self.attackCooldown > 0 || self.isAttacking) return false; self.isAttacking = true; self.attackCooldown = 45; self.comboCount++; self.comboTimer = 60; LK.getSound('kick').play(); var originalY = self.y; tween(self, { y: originalY - 30 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { tween(self, { y: originalY }, { duration: 200, easing: tween.easeIn, onFinish: function onFinish() { self.isAttacking = false; } }); } }); return true; }; self.block = function (blocking) { self.isBlocking = blocking; fighterGraphics.tint = blocking ? 0x888888 : 0xffffff; }; self.update = function () { if (self.attackCooldown > 0) { self.attackCooldown--; } if (self.comboTimer > 0) { self.comboTimer--; if (self.comboTimer <= 0) { self.comboCount = 0; } } }; return self; }); var HealthBar = Container.expand(function (fighter, isPlayer) { var self = Container.call(this); self.fighter = fighter; self.isPlayer = isPlayer; var bgBar = self.attachAsset('healthBarBg', { anchorX: isPlayer ? 0 : 1, anchorY: 0 }); var healthBar = self.attachAsset('healthBar', { anchorX: isPlayer ? 0 : 1, anchorY: 0 }); healthBar.x = isPlayer ? 2 : -2; healthBar.y = 2; self.update = function () { var healthPercent = self.fighter.health / self.fighter.maxHealth; healthBar.width = 400 * healthPercent; if (healthPercent > 0.6) { healthBar.tint = 0x00cc00; } else if (healthPercent > 0.3) { healthBar.tint = 0xcccc00; } else { healthBar.tint = 0xcc0000; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game state variables var gameState = 'playing'; var playerWins = 0; var enemyWins = 0; var roundsToWin = 2; var aiDifficulty = 1; var aiTimer = 0; var aiAction = 'idle'; var blockHeld = false; var lastTapTime = 0; var tapCount = 0; // Create ground var ground = game.addChild(LK.getAsset('ground', { anchorX: 0.5, anchorY: 0 })); ground.x = 2048 / 2; ground.y = 2632; // Create fighters var player = game.addChild(new Fighter(true)); player.x = 400; player.y = 2632; var enemy = game.addChild(new Fighter(false)); enemy.x = 1648; enemy.y = 2632; // Create health bars var playerHealthBar = LK.gui.topLeft.addChild(new HealthBar(player, true)); playerHealthBar.x = 50; playerHealthBar.y = 150; var enemyHealthBar = LK.gui.topRight.addChild(new HealthBar(enemy, false)); enemyHealthBar.x = -50; enemyHealthBar.y = 150; // Create invisible control areas var punchArea = game.addChild(LK.getAsset('punchArea', { anchorX: 0, anchorY: 0 })); punchArea.x = 0; punchArea.y = 300; punchArea.alpha = 0; var kickArea = game.addChild(LK.getAsset('kickArea', { anchorX: 0, anchorY: 0 })); kickArea.x = 0; kickArea.y = 1500; kickArea.alpha = 0; // Score display var scoreText = new Text2('Round 1 - Fight!', { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); scoreText.y = 50; // Combat functions function checkCombat() { var distance = Math.abs(player.x - enemy.x); var attackRange = 170; if (distance < attackRange && player.isAttacking && !enemy.isBlocking) { var damage = player.comboCount >= 3 ? 25 : 15; var enemyDead = enemy.takeDamage(damage); if (enemyDead) { endRound('player'); } } if (distance < attackRange && enemy.isAttacking && !player.isBlocking) { var damage = 12 + aiDifficulty * 3; var playerDead = player.takeDamage(damage); if (playerDead) { endRound('enemy'); } } } function endRound(winner) { if (gameState !== 'playing') return; gameState = 'roundEnd'; if (winner === 'player') { playerWins++; LK.setScore(LK.getScore() + 100); scoreText.setText('You Win Round ' + (playerWins + enemyWins) + '!'); } else { enemyWins++; scoreText.setText('Enemy Wins Round ' + (playerWins + enemyWins) + '!'); } LK.setTimeout(function () { if (playerWins >= roundsToWin) { LK.setScore(LK.getScore() + 500); aiDifficulty++; startNewMatch(); } else if (enemyWins >= roundsToWin) { LK.showGameOver(); } else { startNewRound(); } }, 2000); } function startNewRound() { player.health = player.maxHealth; enemy.health = enemy.maxHealth; player.x = 400; enemy.x = 1648; player.block(false); enemy.block(false); gameState = 'playing'; scoreText.setText('Round ' + (playerWins + enemyWins + 1) + ' - Fight!'); } function startNewMatch() { playerWins = 0; enemyWins = 0; startNewRound(); scoreText.setText('New Opponent! Round 1 - Fight!'); } function updateAI() { if (gameState !== 'playing') return; aiTimer++; var distance = Math.abs(player.x - enemy.x); var reactionTime = Math.max(5, 30 - aiDifficulty * 5); if (aiTimer >= reactionTime) { aiTimer = 0; if (player.isAttacking && distance < 200) { enemy.block(true); aiAction = 'block'; } else if (distance < 170 && Math.random() < 0.3 + aiDifficulty * 0.1) { enemy.block(false); if (Math.random() < 0.6) { enemy.punch(); } else { enemy.kick(); } aiAction = 'attack'; } else { enemy.block(false); aiAction = 'idle'; } } } // Touch controls punchArea.down = function (x, y, obj) { if (gameState !== 'playing') return; var currentTime = LK.ticks; if (currentTime - lastTapTime < 20) { tapCount++; } else { tapCount = 1; } lastTapTime = currentTime; player.punch(); }; kickArea.down = function (x, y, obj) { if (gameState !== 'playing') return; var currentTime = LK.ticks; if (currentTime - lastTapTime < 20) { tapCount++; } else { tapCount = 1; } lastTapTime = currentTime; player.kick(); }; game.down = function (x, y, obj) { if (gameState !== 'playing') return; blockHeld = true; player.block(true); }; game.up = function (x, y, obj) { if (gameState !== 'playing') return; blockHeld = false; player.block(false); }; // Main game loop game.update = function () { if (gameState !== 'playing') return; updateAI(); checkCombat(); // Reset tap count after delay if (LK.ticks - lastTapTime > 60) { tapCount = 0; } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Fighter = Container.expand(function (isPlayer) {
var self = Container.call(this);
self.isPlayer = isPlayer || false;
self.maxHealth = 100;
self.health = self.maxHealth;
self.isBlocking = false;
self.isAttacking = false;
self.attackCooldown = 0;
self.comboCount = 0;
self.comboTimer = 0;
var fighterGraphics = self.attachAsset(self.isPlayer ? 'player' : 'enemy', {
anchorX: 0.5,
anchorY: 1.0
});
self.takeDamage = function (damage) {
if (self.isBlocking) {
damage = Math.floor(damage * 0.3);
LK.getSound('block').play();
} else {
LK.getSound('hit').play();
LK.effects.flashObject(self, 0xff0000, 300);
}
self.health = Math.max(0, self.health - damage);
return self.health <= 0;
};
self.punch = function () {
if (self.attackCooldown > 0 || self.isAttacking) return false;
self.isAttacking = true;
self.attackCooldown = 30;
self.comboCount++;
self.comboTimer = 60;
LK.getSound('punch').play();
var originalX = self.x;
var moveDistance = self.isPlayer ? 50 : -50;
tween(self, {
x: originalX + moveDistance
}, {
duration: 150,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
x: originalX
}, {
duration: 150,
easing: tween.easeIn,
onFinish: function onFinish() {
self.isAttacking = false;
}
});
}
});
return true;
};
self.kick = function () {
if (self.attackCooldown > 0 || self.isAttacking) return false;
self.isAttacking = true;
self.attackCooldown = 45;
self.comboCount++;
self.comboTimer = 60;
LK.getSound('kick').play();
var originalY = self.y;
tween(self, {
y: originalY - 30
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
y: originalY
}, {
duration: 200,
easing: tween.easeIn,
onFinish: function onFinish() {
self.isAttacking = false;
}
});
}
});
return true;
};
self.block = function (blocking) {
self.isBlocking = blocking;
fighterGraphics.tint = blocking ? 0x888888 : 0xffffff;
};
self.update = function () {
if (self.attackCooldown > 0) {
self.attackCooldown--;
}
if (self.comboTimer > 0) {
self.comboTimer--;
if (self.comboTimer <= 0) {
self.comboCount = 0;
}
}
};
return self;
});
var HealthBar = Container.expand(function (fighter, isPlayer) {
var self = Container.call(this);
self.fighter = fighter;
self.isPlayer = isPlayer;
var bgBar = self.attachAsset('healthBarBg', {
anchorX: isPlayer ? 0 : 1,
anchorY: 0
});
var healthBar = self.attachAsset('healthBar', {
anchorX: isPlayer ? 0 : 1,
anchorY: 0
});
healthBar.x = isPlayer ? 2 : -2;
healthBar.y = 2;
self.update = function () {
var healthPercent = self.fighter.health / self.fighter.maxHealth;
healthBar.width = 400 * healthPercent;
if (healthPercent > 0.6) {
healthBar.tint = 0x00cc00;
} else if (healthPercent > 0.3) {
healthBar.tint = 0xcccc00;
} else {
healthBar.tint = 0xcc0000;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game state variables
var gameState = 'playing';
var playerWins = 0;
var enemyWins = 0;
var roundsToWin = 2;
var aiDifficulty = 1;
var aiTimer = 0;
var aiAction = 'idle';
var blockHeld = false;
var lastTapTime = 0;
var tapCount = 0;
// Create ground
var ground = game.addChild(LK.getAsset('ground', {
anchorX: 0.5,
anchorY: 0
}));
ground.x = 2048 / 2;
ground.y = 2632;
// Create fighters
var player = game.addChild(new Fighter(true));
player.x = 400;
player.y = 2632;
var enemy = game.addChild(new Fighter(false));
enemy.x = 1648;
enemy.y = 2632;
// Create health bars
var playerHealthBar = LK.gui.topLeft.addChild(new HealthBar(player, true));
playerHealthBar.x = 50;
playerHealthBar.y = 150;
var enemyHealthBar = LK.gui.topRight.addChild(new HealthBar(enemy, false));
enemyHealthBar.x = -50;
enemyHealthBar.y = 150;
// Create invisible control areas
var punchArea = game.addChild(LK.getAsset('punchArea', {
anchorX: 0,
anchorY: 0
}));
punchArea.x = 0;
punchArea.y = 300;
punchArea.alpha = 0;
var kickArea = game.addChild(LK.getAsset('kickArea', {
anchorX: 0,
anchorY: 0
}));
kickArea.x = 0;
kickArea.y = 1500;
kickArea.alpha = 0;
// Score display
var scoreText = new Text2('Round 1 - Fight!', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
scoreText.y = 50;
// Combat functions
function checkCombat() {
var distance = Math.abs(player.x - enemy.x);
var attackRange = 170;
if (distance < attackRange && player.isAttacking && !enemy.isBlocking) {
var damage = player.comboCount >= 3 ? 25 : 15;
var enemyDead = enemy.takeDamage(damage);
if (enemyDead) {
endRound('player');
}
}
if (distance < attackRange && enemy.isAttacking && !player.isBlocking) {
var damage = 12 + aiDifficulty * 3;
var playerDead = player.takeDamage(damage);
if (playerDead) {
endRound('enemy');
}
}
}
function endRound(winner) {
if (gameState !== 'playing') return;
gameState = 'roundEnd';
if (winner === 'player') {
playerWins++;
LK.setScore(LK.getScore() + 100);
scoreText.setText('You Win Round ' + (playerWins + enemyWins) + '!');
} else {
enemyWins++;
scoreText.setText('Enemy Wins Round ' + (playerWins + enemyWins) + '!');
}
LK.setTimeout(function () {
if (playerWins >= roundsToWin) {
LK.setScore(LK.getScore() + 500);
aiDifficulty++;
startNewMatch();
} else if (enemyWins >= roundsToWin) {
LK.showGameOver();
} else {
startNewRound();
}
}, 2000);
}
function startNewRound() {
player.health = player.maxHealth;
enemy.health = enemy.maxHealth;
player.x = 400;
enemy.x = 1648;
player.block(false);
enemy.block(false);
gameState = 'playing';
scoreText.setText('Round ' + (playerWins + enemyWins + 1) + ' - Fight!');
}
function startNewMatch() {
playerWins = 0;
enemyWins = 0;
startNewRound();
scoreText.setText('New Opponent! Round 1 - Fight!');
}
function updateAI() {
if (gameState !== 'playing') return;
aiTimer++;
var distance = Math.abs(player.x - enemy.x);
var reactionTime = Math.max(5, 30 - aiDifficulty * 5);
if (aiTimer >= reactionTime) {
aiTimer = 0;
if (player.isAttacking && distance < 200) {
enemy.block(true);
aiAction = 'block';
} else if (distance < 170 && Math.random() < 0.3 + aiDifficulty * 0.1) {
enemy.block(false);
if (Math.random() < 0.6) {
enemy.punch();
} else {
enemy.kick();
}
aiAction = 'attack';
} else {
enemy.block(false);
aiAction = 'idle';
}
}
}
// Touch controls
punchArea.down = function (x, y, obj) {
if (gameState !== 'playing') return;
var currentTime = LK.ticks;
if (currentTime - lastTapTime < 20) {
tapCount++;
} else {
tapCount = 1;
}
lastTapTime = currentTime;
player.punch();
};
kickArea.down = function (x, y, obj) {
if (gameState !== 'playing') return;
var currentTime = LK.ticks;
if (currentTime - lastTapTime < 20) {
tapCount++;
} else {
tapCount = 1;
}
lastTapTime = currentTime;
player.kick();
};
game.down = function (x, y, obj) {
if (gameState !== 'playing') return;
blockHeld = true;
player.block(true);
};
game.up = function (x, y, obj) {
if (gameState !== 'playing') return;
blockHeld = false;
player.block(false);
};
// Main game loop
game.update = function () {
if (gameState !== 'playing') return;
updateAI();
checkCombat();
// Reset tap count after delay
if (LK.ticks - lastTapTime > 60) {
tapCount = 0;
}
};