/****
* 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;
}
};