User prompt
Laneleri ortaya hizala
User prompt
Savaş alanını daha yukarı al
User prompt
Savaş alanını daha yukarı al
User prompt
Her lane deki kartlar sadece kendi lanesindeki rakibine vurabilir başka lanedeki kartlara vuramazlar ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
3 lane belli olsun şu anda belli değil lanelerin assetleri olsun
User prompt
3 tane lane olsun her lane bir kart koyulabilsin
User prompt
Kartlar birbirine saldırınca Birbirlerine çarpma animasyonu olsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Kartların savaş animasyonu olsun ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Oyunu arenasını rakibin arenasına hizala
User prompt
Oyun alanını büyüt oyun çok küçük
User prompt
Walter spirit için asset oluştur
Code edit (1 edits merged)
Please save this source code
User prompt
Mystic Card Duel
Initial prompt
Bana bir sıra tabanlı kart oyunu yap
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Card = Container.expand(function (cardData) { var self = Container.call(this); // Card properties self.cardData = cardData || { name: "Basic Card", cost: 1, attack: 2, health: 2, description: "A basic creature card" }; self.maxHealth = self.cardData.health; self.currentHealth = self.cardData.health; self.isPlayable = false; self.isOnBattlefield = false; self.hasAttacked = false; // Create card graphics var cardBg = self.attachAsset('cardFront', { anchorX: 0.5, anchorY: 0.5 }); // Card text elements var nameText = new Text2(self.cardData.name, { size: 24, fill: 0x2C3E50 }); nameText.anchor.set(0.5, 0); nameText.x = 0; nameText.y = -100; self.addChild(nameText); var costText = new Text2(self.cardData.cost.toString(), { size: 32, fill: 0x9B59B6 }); costText.anchor.set(0.5, 0.5); costText.x = -70; costText.y = -100; self.addChild(costText); var attackText = new Text2(self.cardData.attack.toString(), { size: 28, fill: 0xE74C3C }); attackText.anchor.set(0.5, 0.5); attackText.x = -50; attackText.y = 90; self.addChild(attackText); var healthText = new Text2(self.currentHealth.toString(), { size: 28, fill: 0x27AE60 }); healthText.anchor.set(0.5, 0.5); healthText.x = 50; healthText.y = 90; self.addChild(healthText); self.updateHealthDisplay = function () { healthText.setText(self.currentHealth.toString()); if (self.currentHealth <= 0) { cardBg.alpha = 0.5; } }; self.takeDamage = function (damage) { self.currentHealth -= damage; if (self.currentHealth < 0) self.currentHealth = 0; self.updateHealthDisplay(); // Flash red when taking damage LK.effects.flashObject(self, 0xff0000, 500); }; self.canAttack = function () { return self.isOnBattlefield && !self.hasAttacked && self.currentHealth > 0; }; self.attack = function (target) { if (self.canAttack() && target) { target.takeDamage(self.cardData.attack); self.hasAttacked = true; cardBg.alpha = 0.7; LK.getSound('attack').play(); } }; self.resetForNewTurn = function () { self.hasAttacked = false; if (self.currentHealth > 0) { cardBg.alpha = 1.0; } }; return self; }); var Player = Container.expand(function (isHuman) { var self = Container.call(this); self.isHuman = isHuman || false; self.health = 30; self.maxMana = 3; self.currentMana = 3; self.hand = []; self.battlefield = []; self.deck = []; // Initialize deck with basic cards var cardTypes = [{ name: "Fire Imp", cost: 1, attack: 2, health: 1, description: "A small fire creature" }, { name: "Water Spirit", cost: 2, attack: 2, health: 3, description: "A defensive water creature" }, { name: "Earth Golem", cost: 3, attack: 4, health: 3, description: "A powerful earth creature" }, { name: "Air Wisp", cost: 1, attack: 1, health: 2, description: "A quick air creature" }, { name: "Lightning Bolt", cost: 2, attack: 3, health: 1, description: "A shocking creature" }, { name: "Walter Spirit", cost: 2, attack: 2, health: 4, description: "A mystical water spirit with high endurance" }]; for (var i = 0; i < 20; i++) { var randomCard = cardTypes[Math.floor(Math.random() * cardTypes.length)]; self.deck.push(new Card(randomCard)); } self.drawCard = function () { if (self.deck.length > 0 && self.hand.length < 7) { var card = self.deck.pop(); self.hand.push(card); LK.getSound('cardDraw').play(); return card; } return null; }; self.canPlayCard = function (card) { return card && card.cardData.cost <= self.currentMana; }; self.playCard = function (card) { var handIndex = self.hand.indexOf(card); if (handIndex >= 0 && self.canPlayCard(card)) { self.hand.splice(handIndex, 1); self.battlefield.push(card); self.currentMana -= card.cardData.cost; card.isOnBattlefield = true; LK.getSound('cardPlay').play(); return true; } return false; }; self.takeDamage = function (damage) { self.health -= damage; if (self.health < 0) self.health = 0; }; self.startTurn = function () { self.currentMana = Math.min(self.maxMana, self.currentMana + 1); if (self.maxMana < 10) self.maxMana++; // Reset battlefield cards for (var i = 0; i < self.battlefield.length; i++) { self.battlefield[i].resetForNewTurn(); } // Draw a card self.drawCard(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2c3e50 }); /**** * Game Code ****/ // Game state variables var currentPlayer = 0; // 0 = human, 1 = AI var gamePhase = "playing"; // "playing", "gameOver" var selectedCard = null; var draggedCard = null; // Create players var humanPlayer = new Player(true); var aiPlayer = new Player(false); var players = [humanPlayer, aiPlayer]; // Create game areas var opponentAreaBg = game.addChild(LK.getAsset('opponentArea', { anchorX: 0, anchorY: 0, x: 0, y: 200, alpha: 0.3 })); var battlefieldBg = game.addChild(LK.getAsset('battlefield', { anchorX: 0, anchorY: 0, x: 0, y: 900, alpha: 0.3 })); var playerAreaBg = game.addChild(LK.getAsset('playerArea', { anchorX: 0, anchorY: 0, x: 0, y: 1800, alpha: 0.3 })); // UI Elements var playerHealthText = new Text2("Health: 30", { size: 48, fill: 0xECF0F1 }); playerHealthText.anchor.set(0, 0.5); playerHealthText.x = 50; playerHealthText.y = 1950; game.addChild(playerHealthText); var opponentHealthText = new Text2("Enemy: 30", { size: 48, fill: 0xECF0F1 }); opponentHealthText.anchor.set(0, 0.5); opponentHealthText.x = 50; opponentHealthText.y = 350; game.addChild(opponentHealthText); var manaText = new Text2("Mana: 3/3", { size: 36, fill: 0x9B59B6 }); manaText.anchor.set(0, 0.5); manaText.x = 50; manaText.y = 2000; game.addChild(manaText); var turnText = new Text2("Your Turn", { size: 42, fill: 0xF39C12 }); turnText.anchor.set(0.5, 0.5); turnText.x = 1024; turnText.y = 100; game.addChild(turnText); // End turn button var endTurnBtn = game.addChild(LK.getAsset('endTurnButton', { anchorX: 0.5, anchorY: 0.5, x: 1800, y: 1950 })); var endTurnText = new Text2("End Turn", { size: 28, fill: 0x2C3E50 }); endTurnText.anchor.set(0.5, 0.5); endTurnText.x = 1800; endTurnText.y = 1950; game.addChild(endTurnText); // Initialize starting hands for (var i = 0; i < 4; i++) { humanPlayer.drawCard(); aiPlayer.drawCard(); } function updateUI() { playerHealthText.setText("Health: " + humanPlayer.health); opponentHealthText.setText("Enemy: " + aiPlayer.health); manaText.setText("Mana: " + humanPlayer.currentMana + "/" + humanPlayer.maxMana); if (currentPlayer === 0) { turnText.setText("Your Turn"); turnText.fill = "#f39c12"; } else { turnText.setText("Enemy Turn"); turnText.fill = "#e74c3c"; } } function arrangeHand() { var handCards = humanPlayer.hand; var startX = 1024 - handCards.length * 100; for (var i = 0; i < handCards.length; i++) { var card = handCards[i]; if (!game.children.includes(card)) { game.addChild(card); } card.x = startX + i * 200; card.y = 2300; card.isPlayable = humanPlayer.canPlayCard(card); // Visual feedback for playable cards if (card.isPlayable && currentPlayer === 0) { card.alpha = 1.0; } else { card.alpha = 0.6; } } } function arrangeBattlefield() { // Player battlefield var playerCards = humanPlayer.battlefield; var playerStartX = 1024 - playerCards.length * 100; for (var i = 0; i < playerCards.length; i++) { var card = playerCards[i]; if (!game.children.includes(card)) { game.addChild(card); } card.x = playerStartX + i * 200; card.y = 1400; } // AI battlefield var aiCards = aiPlayer.battlefield; var aiStartX = 1024 - aiCards.length * 100; for (var i = 0; i < aiCards.length; i++) { var card = aiCards[i]; if (!game.children.includes(card)) { game.addChild(card); } card.x = aiStartX + i * 200; card.y = 600; } } function checkGameOver() { if (humanPlayer.health <= 0) { gamePhase = "gameOver"; LK.showGameOver(); return true; } else if (aiPlayer.health <= 0) { gamePhase = "gameOver"; LK.showYouWin(); return true; } return false; } function endTurn() { currentPlayer = 1 - currentPlayer; players[currentPlayer].startTurn(); if (currentPlayer === 1) { // AI turn LK.setTimeout(function () { performAITurn(); }, 1000); } updateUI(); arrangeHand(); arrangeBattlefield(); } function performAITurn() { // Simple AI: play random playable card and attack with random creature var playableCards = aiPlayer.hand.filter(function (card) { return aiPlayer.canPlayCard(card); }); if (playableCards.length > 0) { var randomCard = playableCards[Math.floor(Math.random() * playableCards.length)]; aiPlayer.playCard(randomCard); } // AI attacks with random creature var attackers = aiPlayer.battlefield.filter(function (card) { return card.canAttack(); }); if (attackers.length > 0) { var attacker = attackers[Math.floor(Math.random() * attackers.length)]; // Target player directly if no defenders if (humanPlayer.battlefield.length === 0) { humanPlayer.takeDamage(attacker.cardData.attack); attacker.hasAttacked = true; } else { // Attack random player creature var defenders = humanPlayer.battlefield.filter(function (card) { return card.currentHealth > 0; }); if (defenders.length > 0) { var target = defenders[Math.floor(Math.random() * defenders.length)]; attacker.attack(target); } } } // Remove dead cards for (var i = humanPlayer.battlefield.length - 1; i >= 0; i--) { if (humanPlayer.battlefield[i].currentHealth <= 0) { var deadCard = humanPlayer.battlefield[i]; game.removeChild(deadCard); humanPlayer.battlefield.splice(i, 1); } } // End AI turn LK.setTimeout(function () { if (!checkGameOver()) { endTurn(); } }, 1500); } // Event handlers game.down = function (x, y, obj) { if (gamePhase !== "playing" || currentPlayer !== 0) return; // Check if end turn button was clicked if (x >= 1700 && x <= 1900 && y >= 1910 && y <= 1990) { endTurn(); return; } // Check if a hand card was clicked for (var i = 0; i < humanPlayer.hand.length; i++) { var card = humanPlayer.hand[i]; var cardBounds = { left: card.x - 90, right: card.x + 90, top: card.y - 125, bottom: card.y + 125 }; if (x >= cardBounds.left && x <= cardBounds.right && y >= cardBounds.top && y <= cardBounds.bottom) { if (card.isPlayable) { selectedCard = card; draggedCard = card; } return; } } // Check if battlefield card was clicked for attacking for (var i = 0; i < humanPlayer.battlefield.length; i++) { var card = humanPlayer.battlefield[i]; var cardBounds = { left: card.x - 90, right: card.x + 90, top: card.y - 125, bottom: card.y + 125 }; if (x >= cardBounds.left && x <= cardBounds.right && y >= cardBounds.top && y <= cardBounds.bottom) { if (card.canAttack()) { selectedCard = card; } return; } } }; game.move = function (x, y, obj) { if (draggedCard) { draggedCard.x = x; draggedCard.y = y; } }; game.up = function (x, y, obj) { if (draggedCard && y < 1600 && y > 1000) { // Card dropped in battlefield area if (humanPlayer.playCard(draggedCard)) { draggedCard = null; selectedCard = null; updateUI(); arrangeHand(); arrangeBattlefield(); } } else if (selectedCard && selectedCard.isOnBattlefield) { // Attack with selected card if (y < 800) { // Attacking opponent area if (aiPlayer.battlefield.length === 0) { // Direct attack on player aiPlayer.takeDamage(selectedCard.cardData.attack); selectedCard.hasAttacked = true; selectedCard.children[0].alpha = 0.7; } else { // Attack enemy creature for (var i = 0; i < aiPlayer.battlefield.length; i++) { var target = aiPlayer.battlefield[i]; var targetBounds = { left: target.x - 90, right: target.x + 90, top: target.y - 125, bottom: target.y + 125 }; if (x >= targetBounds.left && x <= targetBounds.right && y >= targetBounds.top && y <= targetBounds.bottom) { selectedCard.attack(target); break; } } } } selectedCard = null; } if (draggedCard) { arrangeHand(); draggedCard = null; } // Remove dead cards for (var i = aiPlayer.battlefield.length - 1; i >= 0; i--) { if (aiPlayer.battlefield[i].currentHealth <= 0) { var deadCard = aiPlayer.battlefield[i]; game.removeChild(deadCard); aiPlayer.battlefield.splice(i, 1); } } updateUI(); arrangeBattlefield(); checkGameOver(); }; game.update = function () { if (gamePhase === "playing") { updateUI(); } }; // Initial setup updateUI(); arrangeHand(); arrangeBattlefield();
===================================================================
--- original.js
+++ change.js
@@ -206,23 +206,23 @@
var opponentAreaBg = game.addChild(LK.getAsset('opponentArea', {
anchorX: 0,
anchorY: 0,
x: 0,
- y: 100,
+ y: 200,
alpha: 0.3
}));
var battlefieldBg = game.addChild(LK.getAsset('battlefield', {
anchorX: 0,
anchorY: 0,
x: 0,
- y: 400,
+ y: 900,
alpha: 0.3
}));
var playerAreaBg = game.addChild(LK.getAsset('playerArea', {
anchorX: 0,
anchorY: 0,
x: 0,
- y: 800,
+ y: 1800,
alpha: 0.3
}));
// UI Elements
var playerHealthText = new Text2("Health: 30", {
@@ -230,48 +230,48 @@
fill: 0xECF0F1
});
playerHealthText.anchor.set(0, 0.5);
playerHealthText.x = 50;
-playerHealthText.y = 950;
+playerHealthText.y = 1950;
game.addChild(playerHealthText);
var opponentHealthText = new Text2("Enemy: 30", {
size: 48,
fill: 0xECF0F1
});
opponentHealthText.anchor.set(0, 0.5);
opponentHealthText.x = 50;
-opponentHealthText.y = 250;
+opponentHealthText.y = 350;
game.addChild(opponentHealthText);
var manaText = new Text2("Mana: 3/3", {
size: 36,
fill: 0x9B59B6
});
manaText.anchor.set(0, 0.5);
manaText.x = 50;
-manaText.y = 1000;
+manaText.y = 2000;
game.addChild(manaText);
var turnText = new Text2("Your Turn", {
size: 42,
fill: 0xF39C12
});
turnText.anchor.set(0.5, 0.5);
turnText.x = 1024;
-turnText.y = 50;
+turnText.y = 100;
game.addChild(turnText);
// End turn button
var endTurnBtn = game.addChild(LK.getAsset('endTurnButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1800,
- y: 950
+ y: 1950
}));
var endTurnText = new Text2("End Turn", {
size: 28,
fill: 0x2C3E50
});
endTurnText.anchor.set(0.5, 0.5);
endTurnText.x = 1800;
-endTurnText.y = 950;
+endTurnText.y = 1950;
game.addChild(endTurnText);
// Initialize starting hands
for (var i = 0; i < 4; i++) {
humanPlayer.drawCard();
@@ -297,9 +297,9 @@
if (!game.children.includes(card)) {
game.addChild(card);
}
card.x = startX + i * 200;
- card.y = 1200;
+ card.y = 2300;
card.isPlayable = humanPlayer.canPlayCard(card);
// Visual feedback for playable cards
if (card.isPlayable && currentPlayer === 0) {
card.alpha = 1.0;
@@ -317,9 +317,9 @@
if (!game.children.includes(card)) {
game.addChild(card);
}
card.x = playerStartX + i * 200;
- card.y = 600;
+ card.y = 1400;
}
// AI battlefield
var aiCards = aiPlayer.battlefield;
var aiStartX = 1024 - aiCards.length * 100;
@@ -328,9 +328,9 @@
if (!game.children.includes(card)) {
game.addChild(card);
}
card.x = aiStartX + i * 200;
- card.y = 300;
+ card.y = 600;
}
}
function checkGameOver() {
if (humanPlayer.health <= 0) {
@@ -405,9 +405,9 @@
// Event handlers
game.down = function (x, y, obj) {
if (gamePhase !== "playing" || currentPlayer !== 0) return;
// Check if end turn button was clicked
- if (x >= 1700 && x <= 1900 && y >= 910 && y <= 990) {
+ if (x >= 1700 && x <= 1900 && y >= 1910 && y <= 1990) {
endTurn();
return;
}
// Check if a hand card was clicked
@@ -450,9 +450,9 @@
draggedCard.y = y;
}
};
game.up = function (x, y, obj) {
- if (draggedCard && y < 750 && y > 450) {
+ if (draggedCard && y < 1600 && y > 1000) {
// Card dropped in battlefield area
if (humanPlayer.playCard(draggedCard)) {
draggedCard = null;
selectedCard = null;
@@ -461,9 +461,9 @@
arrangeBattlefield();
}
} else if (selectedCard && selectedCard.isOnBattlefield) {
// Attack with selected card
- if (y < 400) {
+ if (y < 800) {
// Attacking opponent area
if (aiPlayer.battlefield.length === 0) {
// Direct attack on player
aiPlayer.takeDamage(selectedCard.cardData.attack);
End turn button fark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Kart alanı dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Ateş ruhu karakteri dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Lightning spirit character Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Kocaman kayadan oluşan golem kırmızı parıldayan gözlere sahip dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Air wisp character dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Arka planı doldur sadece aynısını yap
Koridor yukarıdan bakış dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Ateş 🔥 dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Ulan yatay tarsfa doğru geniş yap yüksekliğe doğru küçük yap
Shadow drake dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Michael demiurgos dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
İnfinity Minion character dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Fireball dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Magic stand dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Play button Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Deck yaz ama düzgün bir arka planla
Büyü asası logosu Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Suikastçı bıçağı logosu Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Kalkan logosu Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Warrior logo Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Sadece freeze büyüsü yap insan olmasın Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Sadece play yerine Wiki yaz
Spell icon Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
İpuçları icon Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Synergy icon Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Game Rules dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Frost Wolf Man Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Water spirit dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Phoenix woman Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Void Stalker Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows
Crystal guardian Dark souls style 2d pixel art. In-Game asset. 2d. High contrast. No shadows