User prompt
Geri al butonunu 1000 pixel aşağı taşı
User prompt
Gemiyi çevir butonu 500 pixel aşağı taşı
User prompt
Gemiyi çevir ve geri al butonunu 500 pixel aşağı taşı
User prompt
Biraz yukarı taşı
User prompt
Gemiyi çevir ve geri al butonunu oyun alanının altına taşı
User prompt
İmleç yerleştirilecek gemi olsun ve sadece oyun alanı içerinde gezebilsin
User prompt
Yerleştirme sırasında kontrol padi yerleştirilecek geminin ön izlemesini oyun alanına taşısın
User prompt
Yerleştirme işlemini daha kolay kontrol edecek şekilde optimize et
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'if (playerGrid.cells[row][col].hasShip) {' Line Number: 3328
User prompt
Yerleştirme sırasında kontrol padı gemiyi oyun alanına taşımak yerleştirmek için kullanılsın çalışmıyor
User prompt
Yerleştirme sırasında kontrol padinin etrafındaki seçenekleri kaldır
User prompt
Yerleştirme alanında kontrol padı yerleştirelecek gemi kontrol etsin
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'if (playerGrid.cells[row][col].hasShip) {' Line Number: 3379
User prompt
Yerleştirme padı gemiyi tutup oyun alanında gezdirebilsin
User prompt
Yerleştirme sırasında kontrol padı benim alanımda gemiyi taşıma yerleştirmede kullanılabilsin
User prompt
Yerleştirme sırasında kontrol padı benim alanımda gemiyi taşıma yerleştirmede kullanılabilsin
User prompt
Yerleştirme padını sağ alta taşı
User prompt
Yerleştirme sırasında kontrol padı sağ alta taşı
User prompt
Yerleştirme sırasında kontrol padını En yukarı taşı
User prompt
Oyun yerleştirme sırasında kontrolcü padı ekranın üstünde göster
User prompt
Please fix the bug: 'undefined is not an object (evaluating 'enemyFleetTitle.setText')' in or related to this line: 'enemyFleetTitle.setText('');' Line Number: 1999
User prompt
Oyun yerleştirme alanında düşman filosu yazısını gizle
User prompt
Zorluk seviyesinin olduğu ekranda geri al bıtonunu gizle
User prompt
Geri al butonu sadece yerleştirme işlemi sırasında görünsün
User prompt
Yerleştirme işlemine geri al seçeneği ekle
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var GameGrid = Container.expand(function (isPlayerGrid) {
var self = Container.call(this);
self.isPlayerGrid = isPlayerGrid;
self.cells = [];
self.ships = [];
var currentGridSize = gridSize; // Use global gridSize variable
var cellSize = 60;
// Initialize grid cells
for (var row = 0; row < currentGridSize; row++) {
self.cells[row] = [];
for (var col = 0; col < currentGridSize; col++) {
var cell = new GridCell(row, col, isPlayerGrid);
cell.x = col * cellSize;
cell.y = row * cellSize;
self.cells[row][col] = cell;
self.addChild(cell);
}
}
// Draw grid lines
for (var i = 0; i <= currentGridSize; i++) {
// Vertical lines
var vLine = self.attachAsset('gridLine', {
width: 2,
height: currentGridSize * cellSize,
x: i * cellSize,
y: 0
});
// Horizontal lines
var hLine = self.attachAsset('gridLine', {
width: currentGridSize * cellSize,
height: 2,
x: 0,
y: i * cellSize
});
}
self.placeShip = function (startRow, startCol, length, isHorizontal, shipType) {
var shipCells = [];
// Check if placement is valid
for (var i = 0; i < length; i++) {
var row = isHorizontal ? startRow : startRow + i;
var col = isHorizontal ? startCol + i : startCol;
if (row >= currentGridSize || col >= currentGridSize || self.cells[row][col].hasShip) {
return false;
}
shipCells.push({
row: row,
col: col
});
}
// Place ship
var ship = {
cells: shipCells,
hits: 0,
sunk: false,
type: shipType || 'cruiser',
length: length,
isHorizontal: isHorizontal,
shipGraphic: null
};
// Create unified ship graphic that spans all cells
if (self.isPlayerGrid) {
var cellSize = 60;
var shipWidth = isHorizontal ? length * cellSize - 8 : cellSize - 8;
var shipHeight = isHorizontal ? cellSize - 8 : length * cellSize - 8;
var shipX = startCol * cellSize + 4;
var shipY = startRow * cellSize + 4;
ship.shipGraphic = self.attachAsset(shipType || 'cruiser', {
width: shipWidth,
height: shipHeight,
x: shipX,
y: shipY
});
// Add protection zone visual for air defense systems
if (shipType === 'airDefense') {
ship.protectionZoneGraphic = self.attachAsset('protectionZone', {
anchorX: 0.5,
anchorY: 0.5,
x: startCol * cellSize + cellSize / 2,
y: startRow * cellSize + cellSize / 2,
alpha: 0.15,
scaleX: 1.0,
scaleY: 1.0
});
}
}
// Mark cells as having ship but don't create individual graphics
for (var j = 0; j < shipCells.length; j++) {
var cellPos = shipCells[j];
var cell = self.cells[cellPos.row][cellPos.col];
cell.hasShip = true;
}
self.ships.push(ship);
return true;
};
self.checkHit = function (row, col) {
var cell = self.cells[row][col];
// Check if position is protected by air defense (only for attacks, not direct hits on defense system)
var isDirectDefenseHit = false;
if (cell.hasShip) {
// Check if this is a direct hit on air defense system
for (var i = 0; i < self.ships.length; i++) {
var ship = self.ships[i];
if (ship.type === 'airDefense') {
for (var j = 0; j < ship.cells.length; j++) {
if (ship.cells[j].row === row && ship.cells[j].col === col) {
isDirectDefenseHit = true;
break;
}
}
}
if (isDirectDefenseHit) break;
}
}
// If not a direct hit on defense system, check for protection
if (!isDirectDefenseHit && self.isProtectedByAirDefense(row, col)) {
// Attack blocked by air defense
cell.markMiss();
// Add special blocked effect
var blockedEffect = self.attachAsset('protectionZone', {
anchorX: 0.5,
anchorY: 0.5,
x: col * 60 + 30,
y: row * 60 + 30,
alpha: 0.8,
scaleX: 0.3,
scaleY: 0.3
});
tween(blockedEffect, {
scaleX: 1.0,
scaleY: 1.0,
alpha: 0
}, {
duration: 800,
onFinish: function onFinish() {
blockedEffect.destroy();
}
});
return 'blocked';
}
if (cell.hasShip) {
cell.markHit();
// Find which ship was hit
for (var i = 0; i < self.ships.length; i++) {
var ship = self.ships[i];
for (var j = 0; j < ship.cells.length; j++) {
if (ship.cells[j].row === row && ship.cells[j].col === col) {
ship.hits++;
if (ship.hits === ship.cells.length && !ship.sunk) {
ship.sunk = true;
LK.getSound('sunk').play();
// Add fireworks effect for sunk ship
self.createFireworks(ship.cells);
updateFleetStatus();
return 'sunk';
}
return 'hit';
}
}
}
} else {
cell.markMiss();
return 'miss';
}
};
self.allShipsSunk = function () {
for (var i = 0; i < self.ships.length; i++) {
if (!self.ships[i].sunk) {
return false;
}
}
return true;
};
self.isProtectedByAirDefense = function (row, col) {
// Check if this position is protected by any active air defense system
for (var i = 0; i < self.ships.length; i++) {
var ship = self.ships[i];
if (ship.type === 'airDefense' && !ship.sunk) {
// Get air defense position
var defensePos = ship.cells[0];
var defenseRow = defensePos.row;
var defenseCol = defensePos.col;
// Check if target is within 3x3 protection zone (excluding the defense system itself)
var rowDiff = Math.abs(row - defenseRow);
var colDiff = Math.abs(col - defenseCol);
// Protection zone is 3x3 centered on defense system
if (rowDiff <= 1 && colDiff <= 1) {
// Don't protect the defense system itself
if (row !== defenseRow || col !== defenseCol) {
return true;
}
}
}
}
return false;
};
self.createFireworks = function (shipCells) {
var cellSize = 60;
for (var i = 0; i < shipCells.length; i++) {
var cellPos = shipCells[i];
var centerX = cellPos.col * cellSize + cellSize / 2;
var centerY = cellPos.row * cellSize + cellSize / 2;
// Create multiple firework particles
for (var f = 0; f < 5; f++) {
var firework = self.attachAsset('firework', {
anchorX: 0.5,
anchorY: 0.5,
x: centerX,
y: centerY,
alpha: 1,
scaleX: 0.5,
scaleY: 0.5
});
var angle = f / 5 * Math.PI * 2;
var distance = 50 + Math.random() * 30;
var targetX = centerX + Math.cos(angle) * distance;
var targetY = centerY + Math.sin(angle) * distance;
tween(firework, {
x: targetX,
y: targetY,
scaleX: 1.2,
scaleY: 1.2,
alpha: 0
}, {
duration: 800 + Math.random() * 400,
easing: tween.easeOut,
onFinish: function onFinish() {
firework.destroy();
}
});
}
}
};
return self;
});
var GridCell = Container.expand(function (row, col, isPlayerGrid) {
var self = Container.call(this);
self.row = row;
self.col = col;
self.isPlayerGrid = isPlayerGrid;
self.hasShip = false;
self.isHit = false;
self.isMiss = false;
var cellSize = 60;
var waterTile = self.attachAsset('water', {
width: cellSize,
height: cellSize,
x: 0,
y: 0,
color: 0xffffff
});
var shipGraphic = null;
var hitMarker = null;
var missMarker = null;
self.placeShip = function (shipType, segmentIndex, totalLength, isHorizontal) {
// Only show ship graphics on player's own grid, hide enemy ships
if (!shipGraphic && self.isPlayerGrid) {
shipType = shipType || 'cruiser';
// Create single unified ship graphic that spans the entire ship length
var shipWidth = isHorizontal ? totalLength * cellSize - 8 : cellSize - 8;
var shipHeight = isHorizontal ? cellSize - 8 : totalLength * cellSize - 8;
// Calculate position to center the ship across all its cells
var shipX = isHorizontal ? segmentIndex * cellSize + 4 - segmentIndex * cellSize : 4;
var shipY = isHorizontal ? 4 : segmentIndex * cellSize + 4 - segmentIndex * cellSize;
// Only create the ship graphic on the first segment (bow)
if (segmentIndex === 0) {
shipGraphic = self.attachAsset(shipType, {
width: shipWidth,
height: shipHeight,
x: shipX,
y: shipY
});
}
}
self.hasShip = true;
};
self.removeShip = function () {
// Ship graphics are now handled at the GameGrid level
// Just mark the cell as not having a ship
self.hasShip = false;
};
self.markHit = function () {
if (!self.isHit) {
hitMarker = self.attachAsset('hit', {
anchorX: 0.5,
anchorY: 0.5,
x: cellSize / 2,
y: cellSize / 2
});
self.isHit = true;
LK.getSound('hit').play();
LK.getSound('shoot').play();
// Add explosion effect
var explosion = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5,
x: cellSize / 2,
y: cellSize / 2,
alpha: 0
});
tween(explosion, {
alpha: 1,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 300,
onFinish: function onFinish() {
tween(explosion, {
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
explosion.destroy();
}
});
}
});
}
};
self.markMiss = function () {
if (!self.isMiss) {
missMarker = self.attachAsset('miss', {
anchorX: 0.5,
anchorY: 0.5,
x: cellSize / 2,
y: cellSize / 2
});
self.isMiss = true;
LK.getSound('miss').play();
// Add missile effect for miss
var missile = self.attachAsset('missile', {
anchorX: 0.5,
anchorY: 1,
x: cellSize / 2,
y: -50,
alpha: 0.8
});
LK.getSound('shoot').play();
tween(missile, {
y: cellSize / 2,
alpha: 0.3
}, {
duration: 400,
onFinish: function onFinish() {
missile.destroy();
}
});
}
};
self.down = function (x, y, obj) {
if (gamePhase === 'placement' && self.isPlayerGrid) {
handleShipPlacement(self.row, self.col);
} else if (gamePhase === 'battle' && !self.isPlayerGrid && !self.isHit && !self.isMiss) {
handlePlayerShot(self.row, self.col);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x001122
});
/****
* Game Code
****/
// Gun turrets
// Deck details
// Hull details
// Submarine - smallest
// Destroyer - smaller
// Cruiser - medium
// Battleship - large
// Aircraft Carrier - long and wide
// Game state
var gamePhase = 'placement'; // 'placement', 'battle', 'gameOver'
var currentShipIndex = 0;
var isHorizontal = true;
var playerTurn = true;
var aiTargets = [];
var aiLastHit = null;
var aiHuntMode = false;
var airBombardmentUsed = false;
var airBombardmentInProgress = false;
var submarineAttackUsed = false;
var submarineAttackInProgress = false;
var sihaAttackUsed = false;
var sihaAttackInProgress = false;
var lastAttackType = null; // Track the last attack type to prevent consecutive use
var aiAttackOptions = ['air', 'submarine', 'siha']; // Available AI attack options
var aiLastAttackType = null; // Track AI's last attack type
var aiAttackCooldowns = {
air: false,
submarine: false,
siha: false
}; // Track which AI attacks have been used
// Attack rights tracking
var playerAttackRights = {
air: 2,
submarine: 2,
siha: 2
};
var aiAttackRights = {
air: 2,
submarine: 2,
siha: 2
};
// Ship sizes to place - realistic naval fleet
var shipSizes = [5, 4, 3, 3, 2, 1]; // Carrier, Battleship, Cruiser, Cruiser, Destroyer, Air Defense
var shipTypes = ['Uçak Gemisi', 'Savaş Gemisi', 'Kruvazör', 'Kruvazör', 'Muhrip', 'Hava Savunma'];
var shipAssets = ['carrier', 'battleship', 'cruiser', 'cruiser', 'destroyer', 'airDefense'];
// Create grids
var playerGrid = new GameGrid(true);
var enemyGrid = new GameGrid(false);
// Scale up grids for better visibility - increased for closer view
playerGrid.scaleX = 2.0;
playerGrid.scaleY = 2.0;
enemyGrid.scaleX = 2.0;
enemyGrid.scaleY = 2.0;
// Center grids on screen
var gridWidth = 8 * 60 * 2.0; // 8 cells * 60px * scale
var screenCenterX = 2048 / 2;
var gridCenterX = gridWidth / 2;
playerGrid.x = screenCenterX - gridCenterX;
playerGrid.y = 1300;
enemyGrid.x = screenCenterX - gridCenterX;
enemyGrid.y = 300;
game.addChild(playerGrid);
game.addChild(enemyGrid);
// Hide enemy grid during placement phase
enemyGrid.visible = false;
// UI Elements
var statusText = new Text2('Gemilerinizi yerleştirin. ' + shipSizes[0] + ' uzunluğunda gemi yerleştirmek için dokunun', {
size: 40,
fill: 0xFFFFFF
});
statusText.anchor.set(0.5, 0);
LK.gui.top.addChild(statusText);
var turnText = new Text2('', {
size: 35,
fill: 0xFFFF00
});
turnText.anchor.set(0.5, 0);
turnText.y = 80;
LK.gui.top.addChild(turnText);
// Labels for grids
var enemyLabel = new Text2('Düşman Suları', {
size: 45,
fill: 0xFF6666
});
enemyLabel.anchor.set(0.5, 0.5);
enemyLabel.x = enemyGrid.x + 8 * 60 * 1.5 / 2;
enemyLabel.y = enemyGrid.y - 60;
game.addChild(enemyLabel);
var playerLabel = new Text2('Filonuz', {
size: 45,
fill: 0x66FF66
});
playerLabel.anchor.set(0.5, 0.5);
playerLabel.x = playerGrid.x + 8 * 60 * 1.5 / 2;
playerLabel.y = playerGrid.y - 60;
game.addChild(playerLabel);
// Rotation button for ship placement
var rotateButton = new Text2('Gemiyi Çevir', {
size: 60,
fill: 0xFFFF00
});
rotateButton.anchor.set(0.5, 0.5);
rotateButton.x = 300;
rotateButton.y = 1200;
game.addChild(rotateButton);
rotateButton.down = function (x, y, obj) {
if (gamePhase === 'placement') {
isHorizontal = !isHorizontal;
updateStatusText();
updateShipPreview();
}
};
// Auto-placement button
var autoPlaceButton = new Text2('Otomatik Yerleştir', {
size: 60,
fill: 0x00FF00
});
autoPlaceButton.anchor.set(0.5, 0.5);
autoPlaceButton.x = 300;
autoPlaceButton.y = 1300;
game.addChild(autoPlaceButton);
autoPlaceButton.down = function (x, y, obj) {
if (gamePhase === 'placement') {
autoPlacePlayerShips();
}
};
// Undo button for ship placement
var undoButton = new Text2('Geri Al', {
size: 60,
fill: 0xFFAA00
});
undoButton.anchor.set(0.5, 0.5);
undoButton.x = 1700;
undoButton.y = 1200;
game.addChild(undoButton);
undoButton.down = function (x, y, obj) {
if (gamePhase === 'placement' && currentShipIndex > 0) {
undoLastShipPlacement();
}
};
// Start battle button
var startBattleButton = new Text2('Savaşı Başlat', {
size: 60,
fill: 0xFF0000
});
startBattleButton.anchor.set(0.5, 0.5);
startBattleButton.x = 300;
startBattleButton.y = 1400;
game.addChild(startBattleButton);
startBattleButton.down = function (x, y, obj) {
if (gamePhase === 'placement' && currentShipIndex >= shipSizes.length) {
placeAIShips();
gamePhase = 'battle';
rotateButton.visible = false;
autoPlaceButton.visible = false;
startBattleButton.visible = false;
undoButton.visible = false;
enemyGrid.visible = true;
airBombardmentButton.visible = true;
submarineAttackButton.visible = true;
sihaAttackButton.visible = true;
// Move and scale down player grid to bottom left
tween(playerGrid, {
x: 50,
y: 2150,
scaleX: playerGrid.originalScaleX * 0.6,
scaleY: playerGrid.originalScaleY * 0.6
}, {
duration: 1000,
easing: tween.easeInOut
});
// Update player label position
tween(playerLabel, {
x: 50 + gridSize * 60 * playerGrid.originalScaleX * 0.6 / 2,
y: 2150 - 60
}, {
duration: 1000,
easing: tween.easeInOut
});
updateStatusText();
}
};
// Air bombardment button
var airBombardmentButton = new Container();
airBombardmentButton.x = 50;
airBombardmentButton.y = 900;
airBombardmentButton.visible = false;
game.addChild(airBombardmentButton);
// Button background
var airButtonBg = airBombardmentButton.attachAsset('water', {
width: 420,
height: 90,
x: -10,
y: -45,
color: 0xFF6600
});
airButtonBg.alpha = 0.9;
// Button border
var airButtonBorder = airBombardmentButton.attachAsset('gridLine', {
width: 424,
height: 94,
x: -12,
y: -47,
color: 0xFFFFFF
});
airButtonBorder.alpha = 0.8;
// Button text
var airButtonText = new Text2('🚁 Hava Bombardımanı', {
size: 42,
fill: 0xFFFFFF
});
airButtonText.anchor.set(0, 0.5);
airButtonText.x = 15;
airButtonText.y = 0;
airBombardmentButton.addChild(airButtonText);
// Button press effect
airBombardmentButton.down = function (x, y, obj) {
if (gamePhase === 'battle' && playerTurn && !airBombardmentUsed && !airBombardmentInProgress && lastAttackType !== 'air') {
// Press effect
tween(airBombardmentButton, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100,
onFinish: function onFinish() {
tween(airBombardmentButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
executeAirBombardment();
}
};
// Submarine attack button
var submarineAttackButton = new Container();
submarineAttackButton.x = 50;
submarineAttackButton.y = 1050;
submarineAttackButton.visible = false;
game.addChild(submarineAttackButton);
// Button background
var subButtonBg = submarineAttackButton.attachAsset('water', {
width: 420,
height: 90,
x: -10,
y: -45,
color: 0x0066CC
});
subButtonBg.alpha = 0.9;
// Button border
var subButtonBorder = submarineAttackButton.attachAsset('gridLine', {
width: 424,
height: 94,
x: -12,
y: -47,
color: 0xFFFFFF
});
subButtonBorder.alpha = 0.8;
// Button text
var subButtonText = new Text2('🚢 Denizaltı Saldırısı', {
size: 42,
fill: 0xFFFFFF
});
subButtonText.anchor.set(0, 0.5);
subButtonText.x = 15;
subButtonText.y = 0;
submarineAttackButton.addChild(subButtonText);
// Button press effect
submarineAttackButton.down = function (x, y, obj) {
if (gamePhase === 'battle' && playerTurn && !submarineAttackUsed && !submarineAttackInProgress && lastAttackType !== 'submarine') {
// Press effect
tween(submarineAttackButton, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100,
onFinish: function onFinish() {
tween(submarineAttackButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
executeSubmarineAttack();
}
};
// SIHA attack button
var sihaAttackButton = new Container();
sihaAttackButton.x = 50;
sihaAttackButton.y = 1200;
sihaAttackButton.visible = false;
game.addChild(sihaAttackButton);
// Button background
var sihaButtonBg = sihaAttackButton.attachAsset('water', {
width: 420,
height: 90,
x: -10,
y: -45,
color: 0x9900FF
});
sihaButtonBg.alpha = 0.9;
// Button border
var sihaButtonBorder = sihaAttackButton.attachAsset('gridLine', {
width: 424,
height: 94,
x: -12,
y: -47,
color: 0xFFFFFF
});
sihaButtonBorder.alpha = 0.8;
// Button text
var sihaButtonText = new Text2('🛩️ SİHA Saldırısı', {
size: 42,
fill: 0xFFFFFF
});
sihaButtonText.anchor.set(0, 0.5);
sihaButtonText.x = 15;
sihaButtonText.y = 0;
sihaAttackButton.addChild(sihaButtonText);
// Button press effect
sihaAttackButton.down = function (x, y, obj) {
if (gamePhase === 'battle' && playerTurn && !sihaAttackUsed && !sihaAttackInProgress && lastAttackType !== 'siha') {
// Press effect
tween(sihaAttackButton, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100,
onFinish: function onFinish() {
tween(sihaAttackButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
executeSihaAttack();
}
};
// Attack rights display
var attackRightsContainer = new Container();
attackRightsContainer.x = 50;
attackRightsContainer.y = playerGrid.y + 200;
game.addChild(attackRightsContainer);
var attackRightsTitle = new Text2('Saldırı Hakları', {
size: 60,
fill: 0xFFFFFF
});
attackRightsTitle.anchor.set(0, 0);
attackRightsTitle.x = 0;
attackRightsTitle.y = 0;
attackRightsContainer.addChild(attackRightsTitle);
// Player attack rights
var playerRightsTitle = new Text2('Oyuncu:', {
size: 50,
fill: 0x00FF00
});
playerRightsTitle.anchor.set(0, 0);
playerRightsTitle.x = 0;
playerRightsTitle.y = 60;
attackRightsContainer.addChild(playerRightsTitle);
var playerAirRightsText = new Text2('Hava: 2', {
size: 45,
fill: 0x00FF00
});
playerAirRightsText.anchor.set(0, 0);
playerAirRightsText.x = 0;
playerAirRightsText.y = 110;
attackRightsContainer.addChild(playerAirRightsText);
var playerSubRightsText = new Text2('Denizaltı: 2', {
size: 45,
fill: 0x00FF00
});
playerSubRightsText.anchor.set(0, 0);
playerSubRightsText.x = 0;
playerSubRightsText.y = 160;
attackRightsContainer.addChild(playerSubRightsText);
var playerSihaRightsText = new Text2('SİHA: 2', {
size: 45,
fill: 0x00FF00
});
playerSihaRightsText.anchor.set(0, 0);
playerSihaRightsText.x = 0;
playerSihaRightsText.y = 210;
attackRightsContainer.addChild(playerSihaRightsText);
// AI attack rights
var aiRightsTitle = new Text2('Düşman:', {
size: 50,
fill: 0xFF0000
});
aiRightsTitle.anchor.set(0, 0);
aiRightsTitle.x = 0;
aiRightsTitle.y = 280;
attackRightsContainer.addChild(aiRightsTitle);
var aiAirRightsText = new Text2('Hava: 2', {
size: 45,
fill: 0xFF0000
});
aiAirRightsText.anchor.set(0, 0);
aiAirRightsText.x = 0;
aiAirRightsText.y = 330;
attackRightsContainer.addChild(aiAirRightsText);
var aiSubRightsText = new Text2('Denizaltı: 2', {
size: 45,
fill: 0xFF0000
});
aiSubRightsText.anchor.set(0, 0);
aiSubRightsText.x = 0;
aiSubRightsText.y = 380;
attackRightsContainer.addChild(aiSubRightsText);
var aiSihaRightsText = new Text2('SİHA: 2', {
size: 45,
fill: 0xFF0000
});
aiSihaRightsText.anchor.set(0, 0);
aiSihaRightsText.x = 0;
aiSihaRightsText.y = 430;
attackRightsContainer.addChild(aiSihaRightsText);
function updateAttackRightsDisplay() {
playerAirRightsText.setText('Hava: ' + playerAttackRights.air);
playerSubRightsText.setText('Denizaltı: ' + playerAttackRights.submarine);
playerSihaRightsText.setText('SİHA: ' + playerAttackRights.siha);
aiAirRightsText.setText('Hava: ' + aiAttackRights.air);
aiSubRightsText.setText('Denizaltı: ' + aiAttackRights.submarine);
aiSihaRightsText.setText('SİHA: ' + aiAttackRights.siha);
// Update button visibility based on available rights
if (gamePhase === 'battle') {
attackRightsContainer.visible = true;
airBombardmentButton.visible = false;
submarineAttackButton.visible = false;
sihaAttackButton.visible = false;
// Update pad attack button visibility and opacity
if (padAttackButtonsContainer) {
padAirButton.alpha = playerAttackRights.air > 0 && lastAttackType !== 'air' ? 1.0 : 0.3;
padSubButton.alpha = playerAttackRights.submarine > 0 && lastAttackType !== 'submarine' ? 1.0 : 0.3;
padSihaButton.alpha = playerAttackRights.siha > 0 && lastAttackType !== 'siha' ? 1.0 : 0.3;
}
} else {
attackRightsContainer.visible = false;
}
}
// Ship preview container for placement phase
var shipPreviewContainer = new Container();
shipPreviewContainer.x = 2048 / 2;
shipPreviewContainer.y = 1050; // Position above player grid (player grid is at y=1300)
game.addChild(shipPreviewContainer);
// Ship placement preview container for showing preview on grid
var shipPlacementPreview = new Container();
game.addChild(shipPlacementPreview);
function updateShipPreview() {
// Clear existing preview
for (var i = shipPreviewContainer.children.length - 1; i >= 0; i--) {
shipPreviewContainer.children[i].destroy();
}
// Clear existing placement preview
for (var i = shipPlacementPreview.children.length - 1; i >= 0; i--) {
shipPlacementPreview.children[i].destroy();
}
if (gamePhase === 'placement' && currentShipIndex < shipSizes.length) {
var shipLength = shipSizes[currentShipIndex];
var shipType = shipAssets[currentShipIndex];
var cellSize = 60;
// Create preview ship graphic
var previewWidth = isHorizontal ? shipLength * cellSize - 8 : cellSize - 8;
var previewHeight = isHorizontal ? cellSize - 8 : shipLength * cellSize - 8;
var previewX = isHorizontal ? -(previewWidth / 2) : -(previewWidth / 2);
var previewY = isHorizontal ? -(previewHeight / 2) : -(previewHeight / 2);
var shipPreview = shipPreviewContainer.attachAsset(shipType, {
width: previewWidth,
height: previewHeight,
x: previewX,
y: previewY,
alpha: 0.8
});
// Add ship name label
var shipNameText = new Text2(shipTypes[currentShipIndex], {
size: 35,
fill: 0xFFFFFF
});
shipNameText.anchor.set(0.5, 0.5);
shipNameText.x = 0;
shipNameText.y = previewHeight / 2 + 50;
shipPreviewContainer.addChild(shipNameText);
// Add orientation label
var orientationText = new Text2(isHorizontal ? 'Yatay' : 'Dikey', {
size: 30,
fill: 0xFFFF00
});
orientationText.anchor.set(0.5, 0.5);
orientationText.x = 0;
orientationText.y = previewHeight / 2 + 90;
shipPreviewContainer.addChild(orientationText);
}
}
function updateStatusText() {
if (gamePhase === 'placement') {
if (currentShipIndex < shipSizes.length) {
var orientation = isHorizontal ? 'yatay' : 'dikey';
var shipName = shipTypes[currentShipIndex];
statusText.setText(shipName + ' yerleştirin (' + shipSizes[currentShipIndex] + ' kare, ' + orientation + ')');
updateShipPreview();
} else {
statusText.setText('Tüm gemiler yerleştirildi! Savaşı başlatmak için butona tıklayın.');
shipPreviewContainer.visible = false;
}
} else if (gamePhase === 'battle') {
shipPreviewContainer.visible = false;
if (playerTurn && !airBombardmentInProgress && !submarineAttackInProgress && !sihaAttackInProgress) {
var bombardmentText = playerAttackRights.air > 0 && lastAttackType !== 'air' ? ' | Hava bombardımanı mevcut!' : '';
var submarineText = playerAttackRights.submarine > 0 && lastAttackType !== 'submarine' ? ' | Denizaltı saldırısı mevcut!' : '';
var sihaText = playerAttackRights.siha > 0 && lastAttackType !== 'siha' ? ' | SİHA saldırısı mevcut!' : '';
statusText.setText('Sıra sizde - Düşman ızgarasına ateş edin!' + bombardmentText + submarineText + sihaText);
turnText.setText('SİZİN SIRANIZ');
} else if (airBombardmentInProgress) {
statusText.setText('Hava bombardımanı devam ediyor...');
turnText.setText('HAVA SALDIRISI');
airBombardmentButton.visible = false;
submarineAttackButton.visible = false;
sihaAttackButton.visible = false;
} else if (submarineAttackInProgress) {
statusText.setText('Denizaltı saldırısı devam ediyor...');
turnText.setText('DENİZALTI SALDIRISI');
airBombardmentButton.visible = false;
submarineAttackButton.visible = false;
sihaAttackButton.visible = false;
} else if (sihaAttackInProgress) {
statusText.setText('SİHA saldırısı devam ediyor...');
turnText.setText('SİHA SALDIRISI');
airBombardmentButton.visible = false;
submarineAttackButton.visible = false;
sihaAttackButton.visible = false;
} else {
var aiHasAttacks = aiAttackRights.air > 0 || aiAttackRights.submarine > 0 || aiAttackRights.siha > 0;
var aiAttackText = aiHasAttacks && aiLastAttackType !== 'regular' ? ' (Özel saldırı hazırlanıyor...)' : '';
statusText.setText('Düşman düşünüyor...' + aiAttackText);
turnText.setText('DÜŞMAN SIRASI');
}
}
updateAttackRightsDisplay();
}
function undoLastShipPlacement() {
if (currentShipIndex <= 0) return;
// Get the last placed ship
currentShipIndex--;
var lastShip = playerGrid.ships[playerGrid.ships.length - 1];
// Remove ship graphic if it exists
if (lastShip.shipGraphic) {
lastShip.shipGraphic.destroy();
lastShip.shipGraphic = null;
}
// Remove protection zone graphic if it exists (for air defense)
if (lastShip.protectionZoneGraphic) {
lastShip.protectionZoneGraphic.destroy();
lastShip.protectionZoneGraphic = null;
}
// Clear ship from cells
for (var j = 0; j < lastShip.cells.length; j++) {
var cellPos = lastShip.cells[j];
var cell = playerGrid.cells[cellPos.row][cellPos.col];
cell.hasShip = false;
}
// Remove ship from ships array
playerGrid.ships.pop();
// Update UI
updateStatusText();
updateFleetStatus();
updateShipPreview();
}
function handleShipPlacement(row, col) {
if (currentShipIndex >= shipSizes.length) return;
var shipLength = shipSizes[currentShipIndex];
var shipType = shipAssets[currentShipIndex];
if (playerGrid.placeShip(row, col, shipLength, isHorizontal, shipType)) {
currentShipIndex++;
updateFleetStatus();
if (currentShipIndex >= shipSizes.length) {
// All ships placed, show start battle button but don't start battle yet
updateStatusText();
} else {
updateStatusText();
}
}
}
function autoPlacePlayerShips() {
// Clear existing ships and their graphics
for (var i = 0; i < playerGrid.ships.length; i++) {
var ship = playerGrid.ships[i];
if (ship.shipGraphic) {
ship.shipGraphic.destroy();
ship.shipGraphic = null;
}
for (var j = 0; j < ship.cells.length; j++) {
var cellPos = ship.cells[j];
playerGrid.cells[cellPos.row][cellPos.col].removeShip();
}
}
playerGrid.ships = [];
// Clear all hit and miss markers from the board
for (var row = 0; row < gridSize; row++) {
for (var col = 0; col < gridSize; col++) {
var cell = playerGrid.cells[row][col];
cell.isHit = false;
cell.isMiss = false;
// Remove any visual markers that might exist
if (cell.hitMarker) {
cell.hitMarker.destroy();
cell.hitMarker = null;
}
if (cell.missMarker) {
cell.missMarker.destroy();
cell.missMarker = null;
}
}
}
// Reset ship placement index
currentShipIndex = 0;
var playerShipSizes = [5, 4, 3, 3, 2, 1];
var playerShipTypes = ['carrier', 'battleship', 'cruiser', 'cruiser', 'destroyer', 'airDefense'];
for (var i = 0; i < playerShipSizes.length; i++) {
var placed = false;
var attempts = 0;
while (!placed && attempts < 100) {
var row = Math.floor(Math.random() * gridSize);
var col = Math.floor(Math.random() * gridSize);
var horizontal = Math.random() < 0.5;
if (playerGrid.placeShip(row, col, playerShipSizes[i], horizontal, playerShipTypes[i])) {
placed = true;
currentShipIndex++;
}
attempts++;
}
}
// Update status text to show current placement state
updateStatusText();
updateFleetStatus();
}
function placeAIShips() {
var aiShipSizes = [5, 4, 3, 3, 2, 1];
var aiShipTypes = ['carrier', 'battleship', 'cruiser', 'cruiser', 'destroyer', 'airDefense'];
for (var i = 0; i < aiShipSizes.length; i++) {
var placed = false;
var attempts = 0;
while (!placed && attempts < 100) {
var row = Math.floor(Math.random() * gridSize);
var col = Math.floor(Math.random() * gridSize);
var horizontal = Math.random() < 0.5;
if (enemyGrid.placeShip(row, col, aiShipSizes[i], horizontal, aiShipTypes[i])) {
placed = true;
}
attempts++;
}
}
}
updateFleetStatus();
function handlePlayerShot(row, col) {
if (!playerTurn) return;
lastAttackType = 'regular'; // Set last attack type for regular shots
// Clear target selection after firing
selectedTarget = null;
targetSelectionActive = false;
lastSelectedCell = null;
targetSelectorActive = false;
availableTargets = [];
// Play enhanced shooting sound effect with target confirmation
LK.getSound('shoot').play();
var result = enemyGrid.checkHit(row, col);
if (result === 'blocked') {
statusText.setText('Saldırı hava savunma sistemi tarafından engellendi!');
// Continue player turn since attack was blocked
return;
} else if (result === 'hit' || result === 'sunk') {
LK.setScore(LK.getScore() + (result === 'sunk' ? 100 : 50));
if (enemyGrid.allShipsSunk()) {
gamePhase = 'gameOver';
statusText.setText('Zafer! Tüm düşman gemileri yok edildi!');
turnText.setText('KAZANDINIZ!');
LK.showYouWin();
return;
}
}
playerTurn = false;
airBombardmentButton.visible = false;
submarineAttackButton.visible = false;
sihaAttackButton.visible = false;
updateStatusText();
// AI turn after delay
LK.setTimeout(function () {
aiTurn();
}, 1000);
}
function executeAirBombardment() {
if (playerAttackRights.air <= 0 || airBombardmentInProgress) return;
playerAttackRights.air--;
airBombardmentInProgress = true;
lastAttackType = 'air'; // Set last attack type
playerTurn = false;
updateAttackRightsDisplay();
statusText.setText('Hava bombardımanı başlatıldı! Uçaklar hedefe yaklaşıyor...');
turnText.setText('HAVA SALDIRISI');
// Generate 5 random target positions
var targets = [];
var attempts = 0;
while (targets.length < 5 && attempts < 100) {
var row = Math.floor(Math.random() * gridSize);
var col = Math.floor(Math.random() * gridSize);
var duplicate = false;
for (var i = 0; i < targets.length; i++) {
if (targets[i].row === row && targets[i].col === col) {
duplicate = true;
break;
}
}
if (!duplicate) {
targets.push({
row: row,
col: col
});
}
attempts++;
}
// Create aircraft animation
var aircraft = game.attachAsset('missile', {
anchorX: 0.5,
anchorY: 0.5,
x: -100,
y: 200,
scaleX: 2,
scaleY: 2,
rotation: Math.PI / 4
});
// Animate aircraft flying across screen
tween(aircraft, {
x: 2148,
y: 300
}, {
duration: 2000,
easing: tween.linear,
onFinish: function onFinish() {
aircraft.destroy();
// Execute bombardment hits with delays
executeTargetHits(targets, 0);
}
});
}
function executeTargetHits(targets, currentIndex) {
if (currentIndex >= targets.length) {
// All hits completed
LK.setTimeout(function () {
airBombardmentInProgress = false;
if (enemyGrid.allShipsSunk()) {
gamePhase = 'gameOver';
statusText.setText('Zafer! Tüm düşman gemileri yok edildi!');
turnText.setText('KAZANDINIZ!');
LK.showYouWin();
return;
}
// AI turn after air bombardment
aiLastAttackType = null; // Reset AI attack type to allow AI special attacks
LK.setTimeout(function () {
aiTurn();
}, 1000);
}, 1000);
return;
}
var target = targets[currentIndex];
// Create bomb falling animation
var bomb = game.attachAsset('missile', {
anchorX: 0.5,
anchorY: 1,
x: enemyGrid.x + target.col * 60 * 1.5 + 30 * 1.5,
y: 100,
alpha: 0.8
});
tween(bomb, {
y: enemyGrid.y + target.row * 60 * 1.5 + 30 * 1.5,
alpha: 0.3
}, {
duration: 600,
onFinish: function onFinish() {
bomb.destroy();
// Check hit result
var result = enemyGrid.checkHit(target.row, target.col);
if (result === 'hit' || result === 'sunk') {
LK.setScore(LK.getScore() + (result === 'sunk' ? 100 : 50));
}
// Continue with next target after short delay
LK.setTimeout(function () {
executeTargetHits(targets, currentIndex + 1);
}, 300);
}
});
}
function executeSubmarineAttack() {
if (playerAttackRights.submarine <= 0 || submarineAttackInProgress) return;
playerAttackRights.submarine--;
submarineAttackInProgress = true;
lastAttackType = 'submarine'; // Set last attack type
playerTurn = false;
updateAttackRightsDisplay();
statusText.setText('Denizaltı saldırısı başlatıldı! Torpido hazırlanıyor...');
turnText.setText('DENİZALTI SALDIRISI');
// Find all enemy ships that are not yet sunk
var availableTargets = [];
for (var i = 0; i < enemyGrid.ships.length; i++) {
var ship = enemyGrid.ships[i];
if (!ship.sunk) {
// Add all unhit cells of this ship as potential targets
for (var j = 0; j < ship.cells.length; j++) {
var cellPos = ship.cells[j];
var cell = enemyGrid.cells[cellPos.row][cellPos.col];
if (!cell.isHit) {
availableTargets.push({
row: cellPos.row,
col: cellPos.col
});
}
}
}
}
// If no available targets (all ships sunk or all remaining cells hit), just end
if (availableTargets.length === 0) {
submarineAttackInProgress = false;
playerTurn = true;
updateStatusText();
return;
}
// Select random target from available unhit ship cells
var target = availableTargets[Math.floor(Math.random() * availableTargets.length)];
// Create submarine animation from bottom of screen
var submarine = game.attachAsset('submarine', {
anchorX: 0.5,
anchorY: 0.5,
x: enemyGrid.x + target.col * 60 * 1.5 + 30 * 1.5,
y: 2732 + 100,
scaleX: 2,
scaleY: 2,
alpha: 0.7
});
// Animate submarine rising
tween(submarine, {
y: enemyGrid.y + target.row * 60 * 1.5 + 200,
alpha: 1
}, {
duration: 1500,
easing: tween.easeOut,
onFinish: function onFinish() {
// Create torpedo
var torpedo = game.attachAsset('missile', {
anchorX: 0.5,
anchorY: 0.5,
x: submarine.x,
y: submarine.y,
scaleX: 1.5,
scaleY: 1.5,
rotation: -Math.PI / 2,
alpha: 0.9
});
// Animate torpedo to target
tween(torpedo, {
x: enemyGrid.x + target.col * 60 * 1.5 + 30 * 1.5,
y: enemyGrid.y + target.row * 60 * 1.5 + 30 * 1.5,
alpha: 0.5
}, {
duration: 800,
easing: tween.linear,
onFinish: function onFinish() {
torpedo.destroy();
// Guaranteed hit on ship
var result = enemyGrid.checkHit(target.row, target.col);
LK.setScore(LK.getScore() + (result === 'sunk' ? 150 : 75));
// Submarine disappears
tween(submarine, {
y: 2732 + 100,
alpha: 0
}, {
duration: 1000,
easing: tween.easeIn,
onFinish: function onFinish() {
submarine.destroy();
submarineAttackInProgress = false;
if (enemyGrid.allShipsSunk()) {
gamePhase = 'gameOver';
statusText.setText('Zafer! Tüm düşman gemileri yok edildi!');
turnText.setText('KAZANDINIZ!');
LK.showYouWin();
return;
}
// AI turn after submarine attack
aiLastAttackType = null; // Reset AI attack type to allow AI special attacks
LK.setTimeout(function () {
aiTurn();
}, 1000);
}
});
}
});
}
});
}
function executeSihaAttack() {
if (playerAttackRights.siha <= 0 || sihaAttackInProgress) return;
playerAttackRights.siha--;
sihaAttackInProgress = true;
lastAttackType = 'siha'; // Set last attack type
playerTurn = false;
updateAttackRightsDisplay();
statusText.setText('SİHA saldırısı başlatıldı! Hedef aranıyor...');
turnText.setText('SİHA SALDIRISI');
// Find all enemy ships that are not yet sunk
var availableShips = [];
for (var i = 0; i < enemyGrid.ships.length; i++) {
var ship = enemyGrid.ships[i];
if (!ship.sunk) {
availableShips.push(ship);
}
}
// If no available ships, just end
if (availableShips.length === 0) {
sihaAttackInProgress = false;
playerTurn = true;
updateStatusText();
return;
}
// Select random ship to completely destroy
var targetShip = availableShips[Math.floor(Math.random() * availableShips.length)];
var targetCells = [];
// Get all cells of the target ship
for (var j = 0; j < targetShip.cells.length; j++) {
targetCells.push(targetShip.cells[j]);
}
// Create SIHA drone animation from top of screen
var siha = game.attachAsset('missile', {
anchorX: 0.5,
anchorY: 0.5,
x: -100,
y: -100,
scaleX: 1.8,
scaleY: 1.8,
rotation: Math.PI / 6,
alpha: 0.9
});
// Animate SIHA flying to target area
var targetCenterX = enemyGrid.x + targetCells[0].col * 60 * 1.5 + 30 * 1.5;
var targetCenterY = enemyGrid.y + targetCells[0].row * 60 * 1.5 + 30 * 1.5;
tween(siha, {
x: targetCenterX,
y: targetCenterY - 150,
rotation: 0
}, {
duration: 2500,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Hover for targeting
tween(siha, {
y: targetCenterY - 100,
alpha: 1
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
// Execute precision strike - hit all cells of the ship
executeShipDestruction(targetCells, 0, siha);
}
});
}
});
}
function executeShipDestruction(targetCells, currentIndex, siha) {
if (currentIndex >= targetCells.length) {
// All cells destroyed, SIHA returns
tween(siha, {
x: 2200,
y: -100,
alpha: 0.5
}, {
duration: 2000,
easing: tween.easeIn,
onFinish: function onFinish() {
siha.destroy();
sihaAttackInProgress = false;
if (enemyGrid.allShipsSunk()) {
gamePhase = 'gameOver';
statusText.setText('Zafer! Tüm düşman gemileri yok edildi!');
turnText.setText('KAZANDINIZ!');
LK.showYouWin();
return;
}
// AI turn after SIHA attack
aiLastAttackType = null; // Reset AI attack type to allow AI special attacks
LK.setTimeout(function () {
aiTurn();
}, 1000);
}
});
return;
}
var target = targetCells[currentIndex];
// Create precision missile
var missile = game.attachAsset('missile', {
anchorX: 0.5,
anchorY: 1,
x: siha.x,
y: siha.y,
scaleX: 0.8,
scaleY: 0.8,
alpha: 0.9
});
tween(missile, {
x: enemyGrid.x + target.col * 60 * 1.5 + 30 * 1.5,
y: enemyGrid.y + target.row * 60 * 1.5 + 30 * 1.5,
alpha: 0.4
}, {
duration: 400,
easing: tween.linear,
onFinish: function onFinish() {
missile.destroy();
// Guaranteed hit
var result = enemyGrid.checkHit(target.row, target.col);
if (result === 'hit' || result === 'sunk') {
LK.setScore(LK.getScore() + (result === 'sunk' ? 200 : 100));
}
// Continue with next target after short delay
LK.setTimeout(function () {
executeShipDestruction(targetCells, currentIndex + 1, siha);
}, 200);
}
});
}
function executeAIAirBombardment() {
aiAttackRights.air--;
aiLastAttackType = 'air';
updateAttackRightsDisplay();
statusText.setText('Düşman hava bombardımanı başlattı!');
turnText.setText('DÜŞMAN HAVA SALDIRISI');
// Generate 5 random target positions on player grid
var targets = [];
var attempts = 0;
while (targets.length < 5 && attempts < 100) {
var row = Math.floor(Math.random() * gridSize);
var col = Math.floor(Math.random() * gridSize);
var cell = playerGrid.cells[row][col];
// Only target untouched cells
if (!cell.isHit && !cell.isMiss) {
var duplicate = false;
for (var i = 0; i < targets.length; i++) {
if (targets[i].row === row && targets[i].col === col) {
duplicate = true;
break;
}
}
if (!duplicate) {
targets.push({
row: row,
col: col
});
}
}
attempts++;
}
// Create AI aircraft animation
var aircraft = game.attachAsset('missile', {
anchorX: 0.5,
anchorY: 0.5,
x: 2148,
y: 200,
scaleX: 2,
scaleY: 2,
rotation: -Math.PI * 3 / 4,
tint: 0xFF0000
});
// Animate aircraft flying across screen
tween(aircraft, {
x: -100,
y: 300
}, {
duration: 2000,
easing: tween.linear,
onFinish: function onFinish() {
aircraft.destroy();
executeAITargetHits(targets, 0);
}
});
}
function executeAITargetHits(targets, currentIndex) {
if (currentIndex >= targets.length) {
// All hits completed
LK.setTimeout(function () {
if (playerGrid.allShipsSunk()) {
gamePhase = 'gameOver';
statusText.setText('Yenilgi! Filonuz yok edildi!');
turnText.setText('KAYBETTİNİZ!');
LK.showGameOver();
return;
}
playerTurn = true;
lastAttackType = null;
updateStatusText();
}, 1000);
return;
}
var target = targets[currentIndex];
// Create bomb falling animation
var bomb = game.attachAsset('missile', {
anchorX: 0.5,
anchorY: 1,
x: playerGrid.x + target.col * 60 * 1.5 + 30 * 1.5,
y: 100,
alpha: 0.8,
tint: 0xFF0000
});
tween(bomb, {
y: playerGrid.y + target.row * 60 * 1.5 + 30 * 1.5,
alpha: 0.3
}, {
duration: 600,
onFinish: function onFinish() {
bomb.destroy();
var result = playerGrid.checkHit(target.row, target.col);
LK.setTimeout(function () {
executeAITargetHits(targets, currentIndex + 1);
}, 300);
}
});
}
function executeAISubmarineAttack() {
aiAttackRights.submarine--;
aiLastAttackType = 'submarine';
updateAttackRightsDisplay();
statusText.setText('Düşman denizaltı saldırısı başlattı!');
turnText.setText('DÜŞMAN DENİZALTI SALDIRISI');
// Find player ships that are not yet sunk
var availableTargets = [];
for (var i = 0; i < playerGrid.ships.length; i++) {
var ship = playerGrid.ships[i];
if (!ship.sunk) {
for (var j = 0; j < ship.cells.length; j++) {
var cellPos = ship.cells[j];
var cell = playerGrid.cells[cellPos.row][cellPos.col];
if (!cell.isHit) {
availableTargets.push({
row: cellPos.row,
col: cellPos.col
});
}
}
}
}
if (availableTargets.length === 0) {
playerTurn = true;
lastAttackType = null;
updateStatusText();
return;
}
// Select random target from available unhit ship cells
var target = availableTargets[Math.floor(Math.random() * availableTargets.length)];
// Create submarine animation
var submarine = game.attachAsset('submarine', {
anchorX: 0.5,
anchorY: 0.5,
x: playerGrid.x + target.col * 60 * 1.5 + 30 * 1.5,
y: 2732 + 100,
scaleX: 2,
scaleY: 2,
alpha: 0.7,
tint: 0xFF0000
});
// Animate submarine rising
tween(submarine, {
y: playerGrid.y + target.row * 60 * 1.5 + 200,
alpha: 1
}, {
duration: 1500,
easing: tween.easeOut,
onFinish: function onFinish() {
// Create torpedo
var torpedo = game.attachAsset('missile', {
anchorX: 0.5,
anchorY: 0.5,
x: submarine.x,
y: submarine.y,
scaleX: 1.5,
scaleY: 1.5,
rotation: -Math.PI / 2,
alpha: 0.9,
tint: 0xFF0000
});
// Animate torpedo to target
tween(torpedo, {
x: playerGrid.x + target.col * 60 * 1.5 + 30 * 1.5,
y: playerGrid.y + target.row * 60 * 1.5 + 30 * 1.5,
alpha: 0.5
}, {
duration: 800,
easing: tween.linear,
onFinish: function onFinish() {
torpedo.destroy();
var result = playerGrid.checkHit(target.row, target.col);
// Submarine disappears
tween(submarine, {
y: 2732 + 100,
alpha: 0
}, {
duration: 1000,
easing: tween.easeIn,
onFinish: function onFinish() {
submarine.destroy();
if (playerGrid.allShipsSunk()) {
gamePhase = 'gameOver';
statusText.setText('Yenilgi! Filonuz yok edildi!');
turnText.setText('KAYBETTİNİZ!');
LK.showGameOver();
return;
}
playerTurn = true;
lastAttackType = null;
updateStatusText();
}
});
}
});
}
});
}
function executeAISihaAttack() {
aiAttackRights.siha--;
aiLastAttackType = 'siha';
updateAttackRightsDisplay();
statusText.setText('Düşman SİHA saldırısı başlattı!');
turnText.setText('DÜŞMAN SİHA SALDIRISI');
// Find all player ships that are not yet sunk
var availableShips = [];
for (var i = 0; i < playerGrid.ships.length; i++) {
var ship = playerGrid.ships[i];
if (!ship.sunk) {
availableShips.push(ship);
}
}
if (availableShips.length === 0) {
playerTurn = true;
lastAttackType = null;
updateStatusText();
return;
}
// Select random ship to completely destroy
var targetShip = availableShips[Math.floor(Math.random() * availableShips.length)];
var targetCells = [];
for (var j = 0; j < targetShip.cells.length; j++) {
targetCells.push(targetShip.cells[j]);
}
// Create AI SIHA drone animation
var siha = game.attachAsset('missile', {
anchorX: 0.5,
anchorY: 0.5,
x: 2148,
y: -100,
scaleX: 1.8,
scaleY: 1.8,
rotation: -Math.PI / 6,
alpha: 0.9,
tint: 0xFF0000
});
// Animate SIHA flying to target area
var targetCenterX = playerGrid.x + targetCells[0].col * 60 * 1.5 + 30 * 1.5;
var targetCenterY = playerGrid.y + targetCells[0].row * 60 * 1.5 + 30 * 1.5;
tween(siha, {
x: targetCenterX,
y: targetCenterY - 150,
rotation: 0
}, {
duration: 2500,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(siha, {
y: targetCenterY - 100,
alpha: 1
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
executeAIShipDestruction(targetCells, 0, siha);
}
});
}
});
}
function executeAIShipDestruction(targetCells, currentIndex, siha) {
if (currentIndex >= targetCells.length) {
// All cells destroyed, SIHA returns
tween(siha, {
x: 2200,
y: -100,
alpha: 0.5
}, {
duration: 2000,
easing: tween.easeIn,
onFinish: function onFinish() {
siha.destroy();
if (playerGrid.allShipsSunk()) {
gamePhase = 'gameOver';
statusText.setText('Yenilgi! Filonuz yok edildi!');
turnText.setText('KAYBETTİNİZ!');
LK.showGameOver();
return;
}
playerTurn = true;
lastAttackType = null;
updateStatusText();
}
});
return;
}
var target = targetCells[currentIndex];
// Create precision missile
var missile = game.attachAsset('missile', {
anchorX: 0.5,
anchorY: 1,
x: siha.x,
y: siha.y,
scaleX: 0.8,
scaleY: 0.8,
alpha: 0.9,
tint: 0xFF0000
});
tween(missile, {
x: playerGrid.x + target.col * 60 * 1.5 + 30 * 1.5,
y: playerGrid.y + target.row * 60 * 1.5 + 30 * 1.5,
alpha: 0.4
}, {
duration: 400,
easing: tween.linear,
onFinish: function onFinish() {
missile.destroy();
var result = playerGrid.checkHit(target.row, target.col);
LK.setTimeout(function () {
executeAIShipDestruction(targetCells, currentIndex + 1, siha);
}, 200);
}
});
}
function aiTurn() {
// Check if AI should use a special attack (30% chance if available and not consecutive)
var shouldUseSpecialAttack = Math.random() < 0.3;
var availableAttacks = [];
// Check which attacks are available (have rights remaining and not the last attack type)
if (aiAttackRights.air > 0 && aiLastAttackType !== 'air') {
availableAttacks.push('air');
}
if (aiAttackRights.submarine > 0 && aiLastAttackType !== 'submarine') {
availableAttacks.push('submarine');
}
if (aiAttackRights.siha > 0 && aiLastAttackType !== 'siha') {
availableAttacks.push('siha');
}
// Use special attack if conditions are met
if (shouldUseSpecialAttack && availableAttacks.length > 0) {
var selectedAttack = availableAttacks[Math.floor(Math.random() * availableAttacks.length)];
if (selectedAttack === 'air') {
executeAIAirBombardment();
return;
} else if (selectedAttack === 'submarine') {
executeAISubmarineAttack();
return;
} else if (selectedAttack === 'siha') {
executeAISihaAttack();
return;
}
}
// Regular attack logic
var row, col;
var attempts = 0;
var targetFound = false;
if (aiHuntMode && aiLastHit) {
// First priority: Try adjacent cells to last hit
var adjacents = [{
row: aiLastHit.row - 1,
col: aiLastHit.col
}, {
row: aiLastHit.row + 1,
col: aiLastHit.col
}, {
row: aiLastHit.row,
col: aiLastHit.col - 1
}, {
row: aiLastHit.row,
col: aiLastHit.col + 1
}];
var validTargets = [];
for (var i = 0; i < adjacents.length; i++) {
var target = adjacents[i];
if (target.row >= 0 && target.row < gridSize && target.col >= 0 && target.col < gridSize) {
var cell = playerGrid.cells[target.row][target.col];
if (!cell.isHit && !cell.isMiss) {
validTargets.push(target);
}
}
}
if (validTargets.length > 0) {
var chosen = validTargets[Math.floor(Math.random() * validTargets.length)];
row = chosen.row;
col = chosen.col;
targetFound = true;
} else {
// Second priority: Look for any hit cells that still have adjacent untested cells
var allHitCells = [];
for (var r = 0; r < gridSize; r++) {
for (var c = 0; c < gridSize; c++) {
var cell = playerGrid.cells[r][c];
if (cell.isHit && cell.hasShip) {
// Check if this hit cell's ship is not sunk
var shipNotSunk = false;
for (var s = 0; s < playerGrid.ships.length; s++) {
var ship = playerGrid.ships[s];
if (!ship.sunk) {
for (var sc = 0; sc < ship.cells.length; sc++) {
if (ship.cells[sc].row === r && ship.cells[sc].col === c) {
shipNotSunk = true;
break;
}
}
}
if (shipNotSunk) break;
}
if (shipNotSunk) {
allHitCells.push({
row: r,
col: c
});
}
}
}
}
// Find hit cells that still have adjacent untested targets
var validHitCells = [];
for (var h = 0; h < allHitCells.length; h++) {
var hitCell = allHitCells[h];
var hitAdjacents = [{
row: hitCell.row - 1,
col: hitCell.col
}, {
row: hitCell.row + 1,
col: hitCell.col
}, {
row: hitCell.row,
col: hitCell.col - 1
}, {
row: hitCell.row,
col: hitCell.col + 1
}];
for (var ha = 0; ha < hitAdjacents.length; ha++) {
var adj = hitAdjacents[ha];
if (adj.row >= 0 && adj.row < gridSize && adj.col >= 0 && adj.col < gridSize) {
var adjCell = playerGrid.cells[adj.row][adj.col];
if (!adjCell.isHit && !adjCell.isMiss) {
validHitCells.push(adj);
}
}
}
}
if (validHitCells.length > 0) {
var chosen = validHitCells[Math.floor(Math.random() * validHitCells.length)];
row = chosen.row;
col = chosen.col;
targetFound = true;
} else {
aiHuntMode = false;
aiLastHit = null;
}
}
}
if (!targetFound) {
// Random targeting
do {
row = Math.floor(Math.random() * gridSize);
col = Math.floor(Math.random() * gridSize);
attempts++;
} while ((playerGrid.cells[row][col].isHit || playerGrid.cells[row][col].isMiss) && attempts < 100);
}
var result = playerGrid.checkHit(row, col);
if (result === 'hit' || result === 'sunk') {
aiLastHit = {
row: row,
col: col
};
aiHuntMode = true;
if (result === 'sunk') {
aiHuntMode = false;
aiLastHit = null;
} else if (result === 'hit') {
// Ship was hit but not sunk, continue attacking surrounding area
LK.setTimeout(function () {
aiTurn(); // Continue attacking immediately
}, 1500);
return;
}
if (playerGrid.allShipsSunk()) {
gamePhase = 'gameOver';
statusText.setText('Yenilgi! Filonuz yok edildi!');
turnText.setText('KAYBETTİNİZ!');
LK.showGameOver();
return;
}
}
playerTurn = true;
lastAttackType = null; // Reset attack type after AI turn to allow alternating attacks
aiLastAttackType = 'regular'; // Set AI's last attack as regular
updateStatusText();
}
// Fleet status displays
var playerFleetStatus = new Container();
playerFleetStatus.x = 1700;
playerFleetStatus.y = 1500;
game.addChild(playerFleetStatus);
var enemyFleetStatus = new Container();
enemyFleetStatus.x = 1700;
enemyFleetStatus.y = 900;
game.addChild(enemyFleetStatus);
// Fleet status title texts
var playerFleetTitle = new Text2('Filonuz', {
size: 40,
fill: 0x66FF66
});
playerFleetTitle.anchor.set(0.5, 0);
playerFleetTitle.x = 0;
playerFleetTitle.y = -60;
playerFleetStatus.addChild(playerFleetTitle);
var enemyFleetTitle = new Text2('Düşman Filosu', {
size: 40,
fill: 0xFF6666
});
enemyFleetTitle.anchor.set(0.5, 0);
enemyFleetTitle.x = 0;
enemyFleetTitle.y = -60;
enemyFleetStatus.addChild(enemyFleetTitle);
// Fleet status arrays
var playerFleetDisplay = [];
var enemyFleetDisplay = [];
function updateFleetStatus() {
// Initialize arrays if they don't exist
if (!playerFleetDisplay) playerFleetDisplay = [];
if (!enemyFleetDisplay) enemyFleetDisplay = [];
// Clear existing displays
for (var i = 0; i < playerFleetDisplay.length; i++) {
playerFleetDisplay[i].destroy();
}
for (var i = 0; i < enemyFleetDisplay.length; i++) {
enemyFleetDisplay[i].destroy();
}
playerFleetDisplay = [];
enemyFleetDisplay = [];
// Create player fleet status
createFleetStatusDisplay(playerGrid, playerFleetStatus, playerFleetDisplay, true);
// Create enemy fleet status
createFleetStatusDisplay(enemyGrid, enemyFleetStatus, enemyFleetDisplay, false);
}
function createFleetStatusDisplay(grid, statusContainer, displayArray, isPlayerFleet) {
for (var i = 0; i < grid.ships.length; i++) {
var ship = grid.ships[i];
// Create main ship container
var shipContainer = new Container();
shipContainer.x = 0;
shipContainer.y = i * 50; // Reduced spacing for text-only
statusContainer.addChild(shipContainer);
displayArray.push(shipContainer);
// Create ship info display (text only)
createShipTextDisplay(ship, shipContainer, i, isPlayerFleet);
}
}
function createShipTextDisplay(ship, container, shipIndex, isPlayerFleet) {
// Ship name and status
var shipName = shipTypes[shipIndex];
var statusText = shipName;
var statusColor = 0xCCCCCC;
// Determine status and color
if (isPlayerFleet) {
if (ship.sunk) {
statusColor = 0xFF4444;
statusText += ' - BATIK (' + ship.hits + '/' + ship.length + ')';
} else if (ship.hits > 0) {
statusColor = 0xFFAA00;
statusText += ' - Hasarlı (' + ship.hits + '/' + ship.length + ')';
} else {
statusColor = 0x66FF99;
statusText += ' - Sağlam (' + ship.hits + '/' + ship.length + ')';
}
} else {
// Enemy fleet - only show detailed status if damaged or sunk
if (ship.sunk) {
statusColor = 0xFF4444;
statusText += ' - BATIK (' + ship.hits + '/' + ship.length + ')';
} else if (ship.hits > 0) {
statusColor = 0xFFAA00;
statusText += ' - Hasarlı (' + ship.hits + '/' + ship.length + ')';
} else {
statusColor = 0x888888;
statusText += ' - Bilinmiyor';
}
}
var nameText = new Text2(statusText, {
size: 28,
fill: statusColor
});
nameText.anchor.set(0, 0);
nameText.x = 0;
nameText.y = 0;
container.addChild(nameText);
}
// Removed - no longer needed for text-only display
// Removed - no longer needed for text-only display
// Special features description container
var specialFeaturesContainer = new Container();
specialFeaturesContainer.x = 230;
specialFeaturesContainer.y = 940;
game.addChild(specialFeaturesContainer);
// Features title
var featuresTitle = new Text2('ÖZEL SİSTEMLER', {
size: 45,
fill: 0xFFFFFF
});
featuresTitle.anchor.set(0.5, 0);
featuresTitle.x = 0;
featuresTitle.y = 0;
specialFeaturesContainer.addChild(featuresTitle);
// Attack systems description
var attackSystemsText = new Text2('SALDIRI SİSTEMLERİ:', {
size: 35,
fill: 0xFF6666
});
attackSystemsText.anchor.set(0, 0);
attackSystemsText.x = -150;
attackSystemsText.y = 60;
specialFeaturesContainer.addChild(attackSystemsText);
var airAttackDesc = new Text2('✈️ Hava: 5 rastgele hedef', {
size: 28,
fill: 0xFFFFFF
});
airAttackDesc.anchor.set(0, 0);
airAttackDesc.x = -150;
airAttackDesc.y = 100;
specialFeaturesContainer.addChild(airAttackDesc);
var subAttackDesc = new Text2('🚢 Denizaltı: Garantili isabet', {
size: 28,
fill: 0xFFFFFF
});
subAttackDesc.anchor.set(0, 0);
subAttackDesc.x = -150;
subAttackDesc.y = 130;
specialFeaturesContainer.addChild(subAttackDesc);
var sihaAttackDesc = new Text2('🛩️ SİHA: Tam gemi imhası', {
size: 28,
fill: 0xFFFFFF
});
sihaAttackDesc.anchor.set(0, 0);
sihaAttackDesc.x = -150;
sihaAttackDesc.y = 160;
specialFeaturesContainer.addChild(sihaAttackDesc);
// Defense systems description
var defenseSystemsText = new Text2('SAVUNMA SİSTEMLERİ:', {
size: 35,
fill: 0x66FF66
});
defenseSystemsText.anchor.set(0, 0);
defenseSystemsText.x = -150;
defenseSystemsText.y = 220;
specialFeaturesContainer.addChild(defenseSystemsText);
var airDefenseDesc = new Text2('🛡️ Hava Savunma: 3x3 koruma', {
size: 28,
fill: 0xFFFFFF
});
airDefenseDesc.anchor.set(0, 0);
airDefenseDesc.x = -150;
airDefenseDesc.y = 260;
specialFeaturesContainer.addChild(airDefenseDesc);
var defenseZoneDesc = new Text2(' Saldırıları engeller', {
size: 24,
fill: 0xFFFFFF
});
defenseZoneDesc.anchor.set(0, 0);
defenseZoneDesc.x = -150;
defenseZoneDesc.y = 290;
specialFeaturesContainer.addChild(defenseZoneDesc);
// Usage limits description
var usageLimitsText = new Text2('KULLANIM SINIRLARI:', {
size: 35,
fill: 0xFFAA00
});
usageLimitsText.anchor.set(0, 0);
usageLimitsText.x = -150;
usageLimitsText.y = 350;
specialFeaturesContainer.addChild(usageLimitsText);
var limitsDesc = new Text2('Her saldırı türü: 2 hak', {
size: 28,
fill: 0xFFFFFF
});
limitsDesc.anchor.set(0, 0);
limitsDesc.x = -150;
limitsDesc.y = 390;
specialFeaturesContainer.addChild(limitsDesc);
// Game info page variables
var gameInfoShown = false;
var currentInfoPage = 0;
var totalInfoPages = 3;
// Difficulty selection variables
var difficultySelected = false;
var selectedDifficulty = 'easy'; // default
var gridSize = 8; // will be updated based on difficulty
// Game information page UI
var gameInfoContainer = new Container();
gameInfoContainer.x = 2048 / 2;
gameInfoContainer.y = 2732 / 2;
game.addChild(gameInfoContainer);
// Info page background
var infoBg = LK.getAsset('water', {
width: 1800,
height: 2400,
x: -900,
y: -1200,
color: 0x001122
});
infoBg.alpha = 0.95;
gameInfoContainer.addChild(infoBg);
// Info page title
var infoTitle = new Text2('AMİRAL BATTI', {
size: 80,
fill: 0xFFD700
});
infoTitle.anchor.set(0.5, 0.5);
infoTitle.x = 0;
infoTitle.y = -1000;
gameInfoContainer.addChild(infoTitle);
// Page indicator
var pageIndicator = new Text2('Sayfa 1 / 3', {
size: 50,
fill: 0xCCCCCC
});
pageIndicator.anchor.set(0.5, 0.5);
pageIndicator.x = 0;
pageIndicator.y = -900;
gameInfoContainer.addChild(pageIndicator);
// Info content container
var infoContentContainer = new Container();
infoContentContainer.x = 0;
infoContentContainer.y = -400;
gameInfoContainer.addChild(infoContentContainer);
// Navigation buttons
var prevButton = new Text2('← ÖNCEKİ', {
size: 60,
fill: 0x888888
});
prevButton.anchor.set(0.5, 0.5);
prevButton.x = -300;
prevButton.y = 1000;
gameInfoContainer.addChild(prevButton);
var nextButton = new Text2('SONRAKİ →', {
size: 60,
fill: 0x00FF00
});
nextButton.anchor.set(0.5, 0.5);
nextButton.x = 300;
nextButton.y = 1000;
gameInfoContainer.addChild(nextButton);
var startGameButton = new Text2('OYUNA BAŞLA', {
size: 70,
fill: 0xFF0000
});
startGameButton.anchor.set(0.5, 0.5);
startGameButton.x = 0;
startGameButton.y = 900;
startGameButton.visible = false;
gameInfoContainer.addChild(startGameButton);
// Info page content arrays
var infoPages = [
// Page 1: Basic Rules
['OYUN KURALLARI', '', '• Deniz savaşı oyununda amacınız düşman', ' filosunu tamamen yok etmektir', '', '• Filonuzda 5 farklı gemi türü bulunur:', ' - Uçak Gemisi (5 kare)', ' - Savaş Gemisi (4 kare)', ' - Kruvazör x2 (3 kare)', ' - Muhrip (2 kare)', '', '• Gemiler yatay veya dikey olarak', ' yerleştirilebilir', '', '• Düşman ızgarasına tıklayarak ateş edin', '• İsabet: Kırmızı, Kaçan: Mavi'],
// Page 2: Special Attacks
['ÖZEL SALDIRILAR', '', '🛩️ HAVA BOMBARDIMANI (2 Hak)', '• 5 rastgele hedefe eş zamanlı saldırı', '• Geniş alan hasarı', '• Ardışık kullanılamaz', '', '🚢 DENİZALTI SALDIRISI (2 Hak)', '• Düşman gemisine garantili isabet', '• Hedef otomatik seçilir', '• Yüksek hasar', '', '🛸 SİHA SALDIRISI (2 Hak)', '• Seçilen gemiyi tamamen yok eder', '• Hassas hedefleme', '• En güçlü saldırı türü'],
// Page 3: Game Tips
['OYUN İPUÇLARI', '', '⚡ STRATEJİ TAVSİYELERİ:', '', '• Gemilerinizi rastgele yerleştirin', '• Özel saldırıları akıllıca kullanın', '• Düşman vuruşlarından kalıp çıkarın', '• Isabet aldığınız bölgelerin etrafını', ' sistematik olarak tarayın', '', '🎯 ZORLUK SEVİYELERİ:', '• Kolay: Yavaş yapay zeka', '• Orta: Dengeli yapay zeka', '• Zor: Agresif yapay zeka', '', '• Düşman da özel saldırılara sahiptir!', '• Savunmanızı güçlü tutun!']];
// Button event handlers
prevButton.down = function (x, y, obj) {
if (currentInfoPage > 0) {
currentInfoPage--;
updateInfoPage();
}
};
nextButton.down = function (x, y, obj) {
if (currentInfoPage < totalInfoPages - 1) {
currentInfoPage++;
updateInfoPage();
}
};
var patchNotesInfoButton = new Text2('YAMA NOTLARI', {
size: 60,
fill: 0x00AAFF
});
patchNotesInfoButton.anchor.set(0.5, 0.5);
patchNotesInfoButton.x = 0;
patchNotesInfoButton.y = 800;
patchNotesInfoButton.visible = false;
gameInfoContainer.addChild(patchNotesInfoButton);
patchNotesInfoButton.down = function (x, y, obj) {
gameInfoContainer.visible = false;
patchNotesContainer.visible = true;
currentPatchPage = 0;
updatePatchPage();
};
startGameButton.down = function (x, y, obj) {
gameInfoShown = true;
gameInfoContainer.visible = false;
difficultyContainer.visible = true;
};
function updateInfoPage() {
// Clear existing content
for (var i = infoContentContainer.children.length - 1; i >= 0; i--) {
infoContentContainer.children[i].destroy();
}
// Update page indicator
pageIndicator.setText('Sayfa ' + (currentInfoPage + 1) + ' / ' + totalInfoPages);
// Add new content
var content = infoPages[currentInfoPage];
for (var i = 0; i < content.length; i++) {
var line = content[i];
var isTitle = i === 0;
var isEmpty = line === '';
if (!isEmpty) {
var textSize = isTitle ? 80 : 55;
var textColor = isTitle ? 0xFFD700 : line.startsWith('•') ? 0xCCCCCC : line.startsWith('🛩️') || line.startsWith('🚢') || line.startsWith('🛸') ? 0x00FFFF : line.startsWith('⚡') || line.startsWith('🎯') ? 0xFFAA00 : 0xFFFFFF;
var lineText = new Text2(line, {
size: textSize,
fill: textColor
});
lineText.anchor.set(0.5, 0);
lineText.x = 0;
lineText.y = i * 60 - 200;
infoContentContainer.addChild(lineText);
}
}
// Update button visibility
prevButton.visible = currentInfoPage > 0;
prevButton.fill = currentInfoPage > 0 ? 0xFFFFFF : 0x888888;
nextButton.visible = currentInfoPage < totalInfoPages - 1;
nextButton.fill = currentInfoPage < totalInfoPages - 1 ? 0x00FF00 : 0x888888;
startGameButton.visible = currentInfoPage === totalInfoPages - 1;
patchNotesInfoButton.visible = currentInfoPage === totalInfoPages - 1;
}
// Initialize first page
updateInfoPage();
// Difficulty selection UI
var difficultyContainer = new Container();
difficultyContainer.x = 2048 / 2;
difficultyContainer.y = 2732 / 2;
difficultyContainer.visible = false;
game.addChild(difficultyContainer);
var difficultyTitle = new Text2('Zorluk Seviyesi Seçin', {
size: 80,
fill: 0xFFFFFF
});
difficultyTitle.anchor.set(0.5, 0.5);
difficultyTitle.x = 0;
difficultyTitle.y = -200;
difficultyContainer.addChild(difficultyTitle);
// Easy button
var easyButton = new Text2('KOLAY (8x8)', {
size: 65,
fill: 0x00FF00
});
easyButton.anchor.set(0.5, 0.5);
easyButton.x = -400;
easyButton.y = 0;
difficultyContainer.addChild(easyButton);
easyButton.down = function (x, y, obj) {
selectedDifficulty = 'easy';
gridSize = 8;
startGameWithDifficulty();
};
// Medium button
var mediumButton = new Text2('ORTA (8x8)', {
size: 65,
fill: 0xFFFF00
});
mediumButton.anchor.set(0.5, 0.5);
mediumButton.x = 0;
mediumButton.y = 0;
difficultyContainer.addChild(mediumButton);
mediumButton.down = function (x, y, obj) {
selectedDifficulty = 'medium';
gridSize = 8;
startGameWithDifficulty();
};
// Hard button
var hardButton = new Text2('ZOR (8x8)', {
size: 65,
fill: 0xFF0000
});
hardButton.anchor.set(0.5, 0.5);
hardButton.x = 400;
hardButton.y = 0;
difficultyContainer.addChild(hardButton);
hardButton.down = function (x, y, obj) {
selectedDifficulty = 'hard';
gridSize = 8;
startGameWithDifficulty();
};
function startGameWithDifficulty() {
difficultySelected = true;
difficultyContainer.visible = false;
// Recreate grids with new size
playerGrid.destroy();
enemyGrid.destroy();
playerGrid = new GameGrid(true);
enemyGrid = new GameGrid(false);
// Use same scale for all difficulties to match easy layout
var baseScale = 2.0;
playerGrid.scaleX = baseScale;
playerGrid.scaleY = baseScale;
enemyGrid.scaleX = baseScale;
enemyGrid.scaleY = baseScale;
// Center grids on screen
var gridWidth = gridSize * 60 * baseScale;
var screenCenterX = 2048 / 2;
var gridCenterX = gridWidth / 2;
playerGrid.x = screenCenterX - gridCenterX;
playerGrid.y = 1400;
enemyGrid.x = screenCenterX - gridCenterX;
enemyGrid.y = 400;
// Store original positions for battle phase repositioning
playerGrid.originalX = playerGrid.x;
playerGrid.originalY = playerGrid.y;
playerGrid.originalScaleX = playerGrid.scaleX;
playerGrid.originalScaleY = playerGrid.scaleY;
game.addChild(playerGrid);
game.addChild(enemyGrid);
// Hide enemy grid during placement phase
enemyGrid.visible = false;
// Update labels position
enemyLabel.x = enemyGrid.x + gridSize * 60 * baseScale / 2;
enemyLabel.y = enemyGrid.y - 60;
playerLabel.x = playerGrid.x + gridSize * 60 * baseScale / 2;
playerLabel.y = playerGrid.y - 60;
// Add separator line between player and enemy grids
var separatorLine = game.attachAsset('gridLine', {
width: 2048,
height: 4,
x: 0,
y: (enemyGrid.y + gridSize * 60 * baseScale + playerGrid.y) / 2,
color: 0xFFFFFF
});
// Reset game state
gamePhase = 'placement';
currentShipIndex = 0;
// Clear ship placement preview
for (var i = shipPlacementPreview.children.length - 1; i >= 0; i--) {
shipPlacementPreview.children[i].destroy();
}
// Initial setup
updateStatusText();
updateAttackRightsDisplay();
}
// Control pad variables
var controlPadActive = false;
var controlPadContainer = new Container();
var controlPadKnob = null;
var controlPadBaseCenter = {
x: 0,
y: 0
};
var controlPadMaxDistance = 120;
var cursorSpeed = 8;
var lastControlPadUpdate = 0;
// Create cursor/crosshair system
var cursorContainer = new Container();
game.addChild(cursorContainer);
// Create control pad
controlPadContainer.x = 2048 / 2;
controlPadContainer.y = 200;
controlPadContainer.scaleX = 1.8;
controlPadContainer.scaleY = 1.8;
controlPadContainer.visible = false;
game.addChild(controlPadContainer);
// Control pad border
var controlPadBorder = controlPadContainer.attachAsset('controlPadBorder', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
// Control pad base
var controlPadBase = controlPadContainer.attachAsset('controlPadBase', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.6
});
// Control pad knob
controlPadKnob = controlPadContainer.attachAsset('controlPadKnob', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8
});
// Store base center position
controlPadBaseCenter.x = 0;
controlPadBaseCenter.y = 0;
// Create simplified targeting crosshair for enemy area - sized to fit single cell
var targetCrosshair = cursorContainer.attachAsset('crosshairH', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8,
scaleX: 0.8,
scaleY: 0.8
});
var targetCenter = cursorContainer.attachAsset('cursorCenter', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1.0,
scaleX: 1.0,
scaleY: 1.0
});
// Create placement cursor (for ship placement phase)
var placementCursor = cursorContainer.attachAsset('water', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7,
width: 50,
height: 50,
color: 0x00FF00
});
placementCursor.visible = false;
// Initialize cursor position
cursorContainer.x = 2048 / 2;
cursorContainer.y = 2732 / 2;
cursorContainer.visible = false; // Initially hidden
// Add subtle pulse animation to cursor ring for better visibility
var cursorPulseDirection = 1;
var cursorPulseTimer = 0;
function updateCursorPulse() {
cursorPulseTimer++;
if (cursorPulseTimer % 40 === 0) {
// Every 0.67 seconds at 60fps for smoother targeting pulse
if (cursorPulseDirection === 1) {
// Pulse crosshair for precision feedback - sized for single cell
tween(targetCenter, {
scaleX: 1.3,
scaleY: 1.3,
alpha: 0.7
}, {
duration: 600,
easing: tween.easeInOut
});
tween(targetCrosshair, {
scaleX: 1.0,
scaleY: 1.0,
alpha: 0.6
}, {
duration: 600,
easing: tween.easeInOut
});
cursorPulseDirection = -1;
} else {
tween(targetCenter, {
scaleX: 1.0,
scaleY: 1.0,
alpha: 1.0
}, {
duration: 600,
easing: tween.easeInOut
});
tween(targetCrosshair, {
scaleX: 0.8,
scaleY: 0.8,
alpha: 0.8
}, {
duration: 600,
easing: tween.easeInOut
});
cursorPulseDirection = 1;
}
}
}
// Hide all game elements initially
playerGrid.visible = false;
enemyGrid.visible = false;
statusText.visible = false;
turnText.visible = false;
enemyLabel.visible = false;
playerLabel.visible = false;
rotateButton.visible = false;
autoPlaceButton.visible = false;
startBattleButton.visible = false;
airBombardmentButton.visible = false;
submarineAttackButton.visible = false;
sihaAttackButton.visible = false;
attackRightsContainer.visible = false;
playerFleetStatus.visible = false;
enemyFleetStatus.visible = false;
shipPreviewContainer.visible = false;
specialFeaturesContainer.visible = false;
// Special attack buttons around control pad
var padAttackButtonsContainer = new Container();
padAttackButtonsContainer.x = controlPadContainer.x;
padAttackButtonsContainer.y = controlPadContainer.y;
padAttackButtonsContainer.visible = false;
game.addChild(padAttackButtonsContainer);
// Air bombardment button (top)
var padAirButton = new Container();
padAirButton.x = 0;
padAirButton.y = -300;
padAttackButtonsContainer.addChild(padAirButton);
var padAirBg = padAirButton.attachAsset('water', {
width: 240,
height: 100,
x: -120,
y: -50,
color: 0xFF6600
});
padAirBg.alpha = 0.9;
var padAirText = new Text2('✈️ HAVA', {
size: 24,
fill: 0xFFFFFF
});
padAirText.anchor.set(0.5, 0.5);
padAirText.x = 0;
padAirText.y = 0;
padAirButton.addChild(padAirText);
padAirButton.down = function (x, y, obj) {
if (gamePhase === 'battle' && playerTurn && !airBombardmentUsed && !airBombardmentInProgress && lastAttackType !== 'air') {
tween(padAirButton, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100,
onFinish: function onFinish() {
tween(padAirButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
executeAirBombardment();
}
};
// Submarine attack button (bottom left)
var padSubButton = new Container();
padSubButton.x = -200;
padSubButton.y = 250;
padAttackButtonsContainer.addChild(padSubButton);
var padSubBg = padSubButton.attachAsset('water', {
width: 240,
height: 100,
x: -120,
y: -50,
color: 0x0066CC
});
padSubBg.alpha = 0.9;
var padSubText = new Text2('🚢 DENİZ', {
size: 22,
fill: 0xFFFFFF
});
padSubText.anchor.set(0.5, 0.5);
padSubText.x = 0;
padSubText.y = 0;
padSubButton.addChild(padSubText);
padSubButton.down = function (x, y, obj) {
if (gamePhase === 'battle' && playerTurn && !submarineAttackUsed && !submarineAttackInProgress && lastAttackType !== 'submarine') {
tween(padSubButton, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100,
onFinish: function onFinish() {
tween(padSubButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
executeSubmarineAttack();
}
};
// SIHA attack button (bottom right)
var padSihaButton = new Container();
padSihaButton.x = 200;
padSihaButton.y = 250;
padAttackButtonsContainer.addChild(padSihaButton);
var padSihaBg = padSihaButton.attachAsset('water', {
width: 240,
height: 100,
x: -120,
y: -50,
color: 0x9900FF
});
padSihaBg.alpha = 0.9;
var padSihaText = new Text2('🛸 SİHA', {
size: 24,
fill: 0xFFFFFF
});
padSihaText.anchor.set(0.5, 0.5);
padSihaText.x = 0;
padSihaText.y = 0;
padSihaButton.addChild(padSihaText);
padSihaButton.down = function (x, y, obj) {
if (gamePhase === 'battle' && playerTurn && !sihaAttackUsed && !sihaAttackInProgress && lastAttackType !== 'siha') {
tween(padSihaButton, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100,
onFinish: function onFinish() {
tween(padSihaButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
executeSihaAttack();
}
};
// Regular attack button (center)
var padRegularButton = new Container();
padRegularButton.x = 400;
padRegularButton.y = 0;
padAttackButtonsContainer.addChild(padRegularButton);
var padRegularBg = padRegularButton.attachAsset('water', {
width: 240,
height: 100,
x: -120,
y: -50,
color: 0x444444
});
padRegularBg.alpha = 0.7;
var padRegularText = new Text2('🎯 ATEŞ', {
size: 20,
fill: 0xFFFFFF
});
padRegularText.anchor.set(0.5, 0.5);
padRegularText.x = 0;
padRegularText.y = 0;
padRegularButton.addChild(padRegularText);
padRegularButton.down = function (x, y, obj) {
if (gamePhase === 'battle' && playerTurn && selectedTarget && targetSelectionActive && !selectedTarget.cell.isHit && !selectedTarget.cell.isMiss) {
tween(padRegularButton, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100,
onFinish: function onFinish() {
tween(padRegularButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
handlePlayerShot(selectedTarget.row, selectedTarget.col);
}
};
// Control pad event handlers
controlPadContainer.down = function (x, y, obj) {
if (gamePhase === 'battle' && playerTurn && !airBombardmentInProgress && !submarineAttackInProgress && !sihaAttackInProgress) {
controlPadActive = true;
// Use local coordinates for better control
var localPos = {
x: x,
y: y
};
// Calculate distance and constrain properly
var distance = Math.sqrt(localPos.x * localPos.x + localPos.y * localPos.y);
if (distance > controlPadMaxDistance) {
var angle = Math.atan2(localPos.y, localPos.x);
localPos.x = Math.cos(angle) * controlPadMaxDistance;
localPos.y = Math.sin(angle) * controlPadMaxDistance;
}
controlPadKnob.x = localPos.x;
controlPadKnob.y = localPos.y;
}
};
controlPadContainer.up = function (x, y, obj) {
// Handle tap functionality for both battle and placement phases
if (controlPadActive) {
var tapDistance = Math.sqrt(controlPadKnob.x * controlPadKnob.x + controlPadKnob.y * controlPadKnob.y);
if (tapDistance < 20) {
// Quick tap threshold
if (gamePhase === 'battle' && playerTurn) {
// Battle phase - fire at selected target if valid
if (selectedTarget && targetSelectionActive && !selectedTarget.cell.isHit && !selectedTarget.cell.isMiss) {
// Enhanced target confirmation feedback
tween(targetCenter, {
scaleX: 4.0,
scaleY: 4.0,
alpha: 0.8
}, {
duration: 150,
easing: tween.easeIn,
onFinish: function onFinish() {
// Fire at the selected target
handlePlayerShot(selectedTarget.row, selectedTarget.col);
}
});
// Add visual confirmation flash
tween(targetCrosshair, {
scaleX: 3.0,
scaleY: 3.0,
alpha: 0.4
}, {
duration: 150,
easing: tween.easeIn
});
} else {
// Try to fire at current cursor position as fallback
if (enemyGrid.visible) {
var localX = cursorContainer.x - enemyGrid.x;
var localY = cursorContainer.y - enemyGrid.y;
var cellSize = 60 * enemyGrid.scaleX;
if (localX >= 0 && localX < gridSize * cellSize && localY >= 0 && localY < gridSize * cellSize) {
var gridCol = Math.floor(localX / cellSize);
var gridRow = Math.floor(localY / cellSize);
if (gridRow >= 0 && gridRow < gridSize && gridCol >= 0 && gridCol < gridSize) {
var targetCell = enemyGrid.cells[gridRow][gridCol];
if (!targetCell.isHit && !targetCell.isMiss) {
handlePlayerShot(gridRow, gridCol);
}
}
}
}
}
} else if (gamePhase === 'placement') {
// Placement phase - place ship at cursor position
var localX = cursorContainer.x - playerGrid.x;
var localY = cursorContainer.y - playerGrid.y;
var cellSize = 60 * playerGrid.scaleX;
if (localX >= 0 && localX < gridSize * cellSize && localY >= 0 && localY < gridSize * cellSize) {
var gridCol = Math.floor(localX / cellSize);
var gridRow = Math.floor(localY / cellSize);
if (gridRow >= 0 && gridRow < gridSize && gridCol >= 0 && gridCol < gridSize) {
handleShipPlacement(gridRow, gridCol);
}
}
}
}
}
controlPadActive = false;
// Animate knob back to center
tween(controlPadKnob, {
x: 0,
y: 0
}, {
duration: 200,
easing: tween.easeOut
});
};
controlPadContainer.move = function (x, y, obj) {
if (gamePhase === 'battle' && playerTurn && !airBombardmentInProgress && !submarineAttackInProgress && !sihaAttackInProgress) {
// Convert coordinates to local space properly
var localPos = {
x: x,
y: y
};
// Calculate distance from center
var distance = Math.sqrt(localPos.x * localPos.x + localPos.y * localPos.y);
// Constrain knob within the control pad with smooth movement
if (distance > controlPadMaxDistance) {
var angle = Math.atan2(localPos.y, localPos.x);
localPos.x = Math.cos(angle) * controlPadMaxDistance;
localPos.y = Math.sin(angle) * controlPadMaxDistance;
}
// Smooth knob movement for better responsiveness
controlPadKnob.x = localPos.x;
controlPadKnob.y = localPos.y;
// Move cursor directly based on knob position
var knobOffsetX = controlPadKnob.x / controlPadMaxDistance;
var knobOffsetY = controlPadKnob.y / controlPadMaxDistance;
var dynamicSpeed = cursorSpeed * 1.0; // Default responsiveness
cursorContainer.x += knobOffsetX * dynamicSpeed;
cursorContainer.y += knobOffsetY * dynamicSpeed;
// Keep cursor within screen bounds
cursorContainer.x = Math.max(20, Math.min(2028, cursorContainer.x));
cursorContainer.y = Math.max(20, Math.min(2712, cursorContainer.y));
// Set control pad as active when moving
controlPadActive = true;
}
};
// Target selection variables
var selectedTarget = null;
var targetSelectionActive = false;
var lastSelectedCell = null;
// Selected cell cursor in enemy waters
var selectedCellCursor = new Container();
selectedCellCursor.zIndex = 1000; // Ensure cursor is always on top
game.addChild(selectedCellCursor);
// Create cursor components for selected cell - sized to fit single cell
var selectedCellBorder = selectedCellCursor.attachAsset('cursorRing', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.9,
scaleX: 1.2,
scaleY: 1.2,
tint: 0x00ffff
});
var selectedCellInner = selectedCellCursor.attachAsset('cursorCenter', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8,
scaleX: 1.5,
scaleY: 1.5,
tint: 0xffff00
});
// Initially hide the selected cell cursor
selectedCellCursor.visible = false;
// Add cursor movement handler with enhanced aiming for enemy waters
game.move = function (x, y, obj) {
// Show ship placement preview during placement phase
if (gamePhase === 'placement') {
showShipPlacementPreview(x, y);
}
// Update cursor position based on control pad if active, otherwise use mouse/touch
if (!controlPadActive && gamePhase === 'battle' && enemyGrid.visible) {
// Restrict cursor movement to enemy grid area only
var localX = x - enemyGrid.x;
var localY = y - enemyGrid.y;
var cellSize = 60 * enemyGrid.scaleX;
var gridWidth = gridSize * cellSize;
var gridHeight = gridSize * cellSize;
// Constrain to enemy grid boundaries
if (localX >= 0 && localX < gridWidth && localY >= 0 && localY < gridHeight) {
cursorContainer.x = x;
cursorContainer.y = y;
}
} else if (!controlPadActive && gamePhase !== 'battle') {
// Allow free movement outside battle phase
cursorContainer.x = x;
cursorContainer.y = y;
}
// Show appropriate cursor for each phase
if (gamePhase === 'battle') {
cursorContainer.visible = true;
targetCrosshair.visible = true;
targetCenter.visible = true;
placementCursor.visible = false;
} else if (gamePhase === 'placement') {
cursorContainer.visible = true;
targetCrosshair.visible = false;
targetCenter.visible = false;
placementCursor.visible = true;
// Enhanced targeting for enemy waters
if (enemyGrid.visible) {
// Convert screen coordinates to grid coordinates
var localX = cursorContainer.x - enemyGrid.x;
var localY = cursorContainer.y - enemyGrid.y;
var cellSize = 60 * enemyGrid.scaleX;
// Check if cursor is over enemy grid
if (localX >= 0 && localX < gridSize * cellSize && localY >= 0 && localY < gridSize * cellSize) {
var gridCol = Math.floor(localX / cellSize);
var gridRow = Math.floor(localY / cellSize);
// Check if valid target
if (gridRow >= 0 && gridRow < gridSize && gridCol >= 0 && gridCol < gridSize) {
var targetCell = enemyGrid.cells[gridRow][gridCol];
var currentCellKey = gridRow + '_' + gridCol;
// Check if we've moved to a new cell for target selection
if (lastSelectedCell !== currentCellKey) {
// Play target change sound when cursor moves to new target
LK.getSound('button_press').play();
lastSelectedCell = currentCellKey;
selectedTarget = {
row: gridRow,
col: gridCol,
cell: targetCell
};
targetSelectionActive = true;
// Update selected cell cursor position
var cellCenterX = enemyGrid.x + gridCol * cellSize + cellSize / 2;
var cellCenterY = enemyGrid.y + gridRow * cellSize + cellSize / 2;
selectedCellCursor.x = cellCenterX;
selectedCellCursor.y = cellCenterY;
selectedCellCursor.visible = true;
// Bring cursor to front to ensure visibility above enemy grid
game.removeChild(selectedCellCursor);
game.addChild(selectedCellCursor);
// Animate selected cell cursor with pulsing effect - sized for single cell
tween(selectedCellBorder, {
scaleX: 1.4,
scaleY: 1.4,
alpha: 0.7
}, {
duration: 400,
easing: tween.easeInOut
});
tween(selectedCellInner, {
scaleX: 1.7,
scaleY: 1.7,
alpha: 0.6
}, {
duration: 400,
easing: tween.easeInOut
});
// Stop any ongoing crosshair animations
tween.stop(targetCenter);
tween.stop(targetCrosshair);
}
if (!targetCell.isHit && !targetCell.isMiss) {
// Enhanced aiming for enemy waters - bright targeting crosshair
targetCrosshair.tint = 0x00ffff;
targetCenter.tint = 0xff4444;
// Enhanced aiming animation for valid targets - sized for single cell
tween(targetCenter, {
scaleX: 1.3,
scaleY: 1.3,
alpha: 1.0
}, {
duration: 300,
easing: tween.easeOut
});
tween(targetCrosshair, {
scaleX: 1.0,
scaleY: 1.0,
alpha: 1.0
}, {
duration: 300,
easing: tween.easeOut
});
} else {
// Already targeted - red crosshair with warning colors
targetCrosshair.tint = 0xff0000;
targetCenter.tint = 0xff0000;
// Scale up but reduce opacity for invalid targets - sized for single cell
tween(targetCenter, {
scaleX: 1.0,
scaleY: 1.0,
alpha: 0.8
}, {
duration: 200,
easing: tween.easeOut
});
tween(targetCrosshair, {
scaleX: 0.9,
scaleY: 0.9,
alpha: 0.7
}, {
duration: 200,
easing: tween.easeOut
});
}
} else {
// Outside enemy grid targeting area - hide cursor completely
selectedTarget = null;
targetSelectionActive = false;
lastSelectedCell = null;
cursorContainer.visible = false;
}
} else {
// Outside enemy waters - hide all cursors
selectedTarget = null;
targetSelectionActive = false;
lastSelectedCell = null;
// Hide selected cell cursor when outside enemy waters
selectedCellCursor.visible = false;
cursorContainer.visible = false;
}
}
} else {
// Hide cursor during other phases
cursorContainer.visible = false;
targetCrosshair.visible = false;
targetCenter.visible = false;
placementCursor.visible = false;
selectedTarget = null;
targetSelectionActive = false;
lastSelectedCell = null;
// Hide selected cell cursor during non-battle phases
selectedCellCursor.visible = false;
}
};
// Patch notes page variables
var patchNotesShown = false;
var currentPatchPage = 0;
var totalPatchPages = 2;
// Patch notes page UI
var patchNotesContainer = new Container();
patchNotesContainer.x = 2048 / 2;
patchNotesContainer.y = 2732 / 2;
patchNotesContainer.visible = false;
game.addChild(patchNotesContainer);
// Patch notes background
var patchBg = LK.getAsset('water', {
width: 1800,
height: 2400,
x: -900,
y: -1200,
color: 0x001122
});
patchBg.alpha = 0.95;
patchNotesContainer.addChild(patchBg);
// Patch notes title
var patchTitle = new Text2('YAMA NOTLARI', {
size: 80,
fill: 0xFFD700
});
patchTitle.anchor.set(0.5, 0.5);
patchTitle.x = 0;
patchTitle.y = -1000;
patchNotesContainer.addChild(patchTitle);
// Patch page indicator
var patchPageIndicator = new Text2('Sayfa 1 / 2', {
size: 50,
fill: 0xCCCCCC
});
patchPageIndicator.anchor.set(0.5, 0.5);
patchPageIndicator.x = 0;
patchPageIndicator.y = -900;
patchNotesContainer.addChild(patchPageIndicator);
// Patch content container
var patchContentContainer = new Container();
patchContentContainer.x = 0;
patchContentContainer.y = -400;
patchNotesContainer.addChild(patchContentContainer);
// Patch navigation buttons
var patchPrevButton = new Text2('← ÖNCEKİ', {
size: 60,
fill: 0x888888
});
patchPrevButton.anchor.set(0.5, 0.5);
patchPrevButton.x = -300;
patchPrevButton.y = 1000;
patchNotesContainer.addChild(patchPrevButton);
var patchNextButton = new Text2('SONRAKİ →', {
size: 60,
fill: 0x00FF00
});
patchNextButton.anchor.set(0.5, 0.5);
patchNextButton.x = 300;
patchNextButton.y = 1000;
patchNotesContainer.addChild(patchNextButton);
var closePatchButton = new Text2('KAPAT', {
size: 70,
fill: 0xFF0000
});
closePatchButton.anchor.set(0.5, 0.5);
closePatchButton.x = 0;
closePatchButton.y = 900;
patchNotesContainer.addChild(closePatchButton);
// Patch notes content arrays
var patchPages = [
// Page 1: Latest Updates (v2.0)
['Versiyon 2.0 - Son Güncellemeler', '', '🎮 YENİ ÖZELLİKLER:', '', '• Gelişmiş kontrol sistemi eklendi', '• Hedef seçim ses efektleri', '• Hava savunma sistemi entegrasyonu', '• Özel saldırı sistemleri yenilendi', '', '🔧 İYİLEŞTİRMELER:', '', '• Oyun performansı optimize edildi', '• Görsel efektler güçlendirildi', '• AI saldırı stratejileri geliştirildi', '• Arayüz tasarımı modernleştirildi'],
// Page 2: Previous Updates (v1.5 & v1.0)
['Versiyon 1.5 & 1.0 - Önceki Güncellemeler', '', '📋 VERSİYON 1.5:', '', '• Zorluk seviyeleri eklendi', '• Fleet durumu göstergeleri', '• Gelişmiş animasyon sistemi', '• Ses efektleri zenginleştirildi', '', '🚀 VERSİYON 1.0 (İlk Sürüm):', '', '• Temel oyun mekaniği', '• Gemi yerleştirme sistemi', '• Sıra tabanlı savaş sistemi', '• Temel yapay zeka']];
// Patch button event handlers
patchPrevButton.down = function (x, y, obj) {
if (currentPatchPage > 0) {
currentPatchPage--;
updatePatchPage();
}
};
patchNextButton.down = function (x, y, obj) {
if (currentPatchPage < totalPatchPages - 1) {
currentPatchPage++;
updatePatchPage();
}
};
closePatchButton.down = function (x, y, obj) {
patchNotesShown = true;
patchNotesContainer.visible = false;
gameInfoContainer.visible = true;
};
function updatePatchPage() {
// Clear existing patch content
for (var i = patchContentContainer.children.length - 1; i >= 0; i--) {
patchContentContainer.children[i].destroy();
}
// Update patch page indicator
patchPageIndicator.setText('Sayfa ' + (currentPatchPage + 1) + ' / ' + totalPatchPages);
// Add new patch content
var content = patchPages[currentPatchPage];
for (var i = 0; i < content.length; i++) {
var line = content[i];
var isTitle = i === 0;
var isEmpty = line === '';
if (!isEmpty) {
var textSize = isTitle ? 80 : 55;
var textColor = isTitle ? 0xFFD700 : line.startsWith('•') ? 0xCCCCCC : line.startsWith('🎮') || line.startsWith('🔧') || line.startsWith('📋') || line.startsWith('🚀') ? 0x00FFFF : 0xFFFFFF;
var lineText = new Text2(line, {
size: textSize,
fill: textColor
});
lineText.anchor.set(0.5, 0);
lineText.x = 0;
lineText.y = i * 60 - 200;
patchContentContainer.addChild(lineText);
}
}
// Update button visibility
patchPrevButton.visible = currentPatchPage > 0;
patchPrevButton.fill = currentPatchPage > 0 ? 0xFFFFFF : 0x888888;
patchNextButton.visible = currentPatchPage < totalPatchPages - 1;
patchNextButton.fill = currentPatchPage < totalPatchPages - 1 ? 0x00FF00 : 0x888888;
}
// Initialize first patch page
updatePatchPage();
// Play background music from game start
LK.playMusic('deniz');
// Show patch notes initially
patchNotesContainer.visible = true;
game.update = function () {
if (!patchNotesShown) {
// Show patch notes first
patchNotesContainer.visible = true;
gameInfoContainer.visible = false;
difficultyContainer.visible = false;
undoButton.visible = false;
} else if (!gameInfoShown) {
// Show info page
patchNotesContainer.visible = false;
gameInfoContainer.visible = true;
difficultyContainer.visible = false;
undoButton.visible = false;
} else if (!difficultySelected) {
// Show difficulty selection
gameInfoContainer.visible = false;
difficultyContainer.visible = true;
undoButton.visible = false;
} else if (difficultySelected) {
// Show game elements once difficulty is selected
gameInfoContainer.visible = false;
difficultyContainer.visible = false;
playerGrid.visible = true;
enemyGrid.visible = gamePhase === 'battle';
statusText.visible = true;
turnText.visible = true;
enemyLabel.visible = gamePhase === 'battle';
playerLabel.visible = true;
rotateButton.visible = gamePhase === 'placement';
autoPlaceButton.visible = gamePhase === 'placement';
undoButton.visible = gamePhase === 'placement';
startBattleButton.visible = gamePhase === 'placement' && currentShipIndex >= shipSizes.length;
shipPreviewContainer.visible = gamePhase === 'placement' && currentShipIndex < shipSizes.length;
playerFleetStatus.visible = true;
enemyFleetStatus.visible = true;
specialFeaturesContainer.visible = gamePhase === 'battle';
// Update cursor visibility and animation
if (gamePhase === 'battle' && playerTurn && !airBombardmentInProgress && !submarineAttackInProgress && !sihaAttackInProgress) {
controlPadContainer.x = 2048 / 2; // Reset to center for battle
controlPadContainer.y = 200; // Reset to top for battle
cursorContainer.visible = true;
controlPadContainer.visible = true;
padAttackButtonsContainer.visible = true;
updateCursorPulse();
} else if (gamePhase === 'placement') {
// Show control pad during ship placement phase
controlPadContainer.x = 1700; // Move to bottom right
controlPadContainer.y = 2400; // Move to bottom right
controlPadContainer.visible = true;
padAttackButtonsContainer.visible = false; // Hide attack buttons during placement
cursorContainer.visible = true; // Show cursor during placement
// Continuous cursor movement based on control pad position
if (controlPadContainer.visible) {
var knobOffsetX = controlPadKnob.x / controlPadMaxDistance;
var knobOffsetY = controlPadKnob.y / controlPadMaxDistance;
// Calculate movement speed based on knob distance for variable sensitivity
var knobDistance = Math.sqrt(knobOffsetX * knobOffsetX + knobOffsetY * knobOffsetY);
// Only move cursor if knob is displaced significantly
if (knobDistance > 0.05) {
var dynamicSpeed = cursorSpeed * (0.8 + knobDistance * 1.2); // Increased speed for placement
// Calculate new cursor position
var newX = cursorContainer.x + knobOffsetX * dynamicSpeed;
var newY = cursorContainer.y + knobOffsetY * dynamicSpeed;
// Use player grid area for placement cursor movement
var cellSize = 60 * playerGrid.scaleX;
var gridWidth = gridSize * cellSize;
var gridHeight = gridSize * cellSize;
var playerGridLeft = playerGrid.x;
var playerGridRight = playerGrid.x + gridWidth;
var playerGridTop = playerGrid.y;
var playerGridBottom = playerGrid.y + gridHeight;
// Constrain cursor to player grid boundaries during placement
cursorContainer.x = Math.max(playerGridLeft, Math.min(playerGridRight - 1, newX));
cursorContainer.y = Math.max(playerGridTop, Math.min(playerGridBottom - 1, newY));
// Add grid snapping for easier placement
var localX = cursorContainer.x - playerGrid.x;
var localY = cursorContainer.y - playerGrid.y;
var snapCol = Math.round(localX / cellSize);
var snapRow = Math.round(localY / cellSize);
// Snap cursor to grid center
cursorContainer.x = playerGrid.x + snapCol * cellSize + cellSize / 2;
cursorContainer.y = playerGrid.y + snapRow * cellSize + cellSize / 2;
}
}
} else {
cursorContainer.visible = false;
controlPadContainer.visible = false;
padAttackButtonsContainer.visible = false;
}
}
};
function showShipPlacementPreview(mouseX, mouseY) {
// Clear existing placement preview
for (var i = shipPlacementPreview.children.length - 1; i >= 0; i--) {
shipPlacementPreview.children[i].destroy();
}
if (gamePhase !== 'placement' || currentShipIndex >= shipSizes.length) return;
// Convert mouse position to grid coordinates
var localX = mouseX - playerGrid.x;
var localY = mouseY - playerGrid.y;
var cellSize = 60 * playerGrid.scaleX;
var gridCol = Math.floor(localX / cellSize);
var gridRow = Math.floor(localY / cellSize);
// Check if cursor is over player grid
if (gridRow >= 0 && gridRow < gridSize && gridCol >= 0 && gridCol < gridSize) {
var shipLength = shipSizes[currentShipIndex];
var shipType = shipAssets[currentShipIndex];
// Check if ship can be placed at this position
var canPlace = true;
var previewCells = [];
for (var i = 0; i < shipLength; i++) {
var row = isHorizontal ? gridRow : gridRow + i;
var col = isHorizontal ? gridCol + i : gridCol;
if (row >= gridSize || col >= gridSize || row < 0 || col < 0) {
canPlace = false;
break;
}
if (playerGrid.cells[row][col].hasShip) {
canPlace = false;
break;
}
previewCells.push({
row: row,
col: col
});
}
// Show preview cells
for (var i = 0; i < previewCells.length; i++) {
var cell = previewCells[i];
var previewCellGraphic = shipPlacementPreview.attachAsset('water', {
width: cellSize - 4,
height: cellSize - 4,
x: playerGrid.x + cell.col * cellSize + 2,
y: playerGrid.y + cell.row * cellSize + 2,
alpha: 0.5,
color: canPlace ? 0x00FF00 : 0xFF0000
});
}
// Show ship preview graphic
if (canPlace) {
var previewWidth = isHorizontal ? shipLength * cellSize - 8 : cellSize - 8;
var previewHeight = isHorizontal ? cellSize - 8 : shipLength * cellSize - 8;
var previewX = playerGrid.x + gridCol * cellSize + 4;
var previewY = playerGrid.y + gridRow * cellSize + 4;
var shipPreviewGraphic = shipPlacementPreview.attachAsset(shipType, {
width: previewWidth,
height: previewHeight,
x: previewX,
y: previewY,
alpha: 0.6
});
}
}
} ===================================================================
--- original.js
+++ change.js
@@ -1479,16 +1479,8 @@
}, 1000);
return;
}
var target = targets[currentIndex];
- // Validate target coordinates before processing
- if (target.row < 0 || target.row >= gridSize || target.col < 0 || target.col >= gridSize) {
- // Skip invalid target and continue with next
- LK.setTimeout(function () {
- executeAITargetHits(targets, currentIndex + 1);
- }, 300);
- return;
- }
// Create bomb falling animation
var bomb = game.attachAsset('missile', {
anchorX: 0.5,
anchorY: 1,
@@ -2400,8 +2392,18 @@
alpha: 1.0,
scaleX: 1.0,
scaleY: 1.0
});
+// Create placement cursor (for ship placement phase)
+var placementCursor = cursorContainer.attachAsset('water', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.7,
+ width: 50,
+ height: 50,
+ color: 0x00FF00
+});
+placementCursor.visible = false;
// Initialize cursor position
cursorContainer.x = 2048 / 2;
cursorContainer.y = 2732 / 2;
cursorContainer.visible = false; // Initially hidden
@@ -2637,9 +2639,9 @@
}
};
// Control pad event handlers
controlPadContainer.down = function (x, y, obj) {
- if (gamePhase === 'battle' && playerTurn && !airBombardmentInProgress && !submarineAttackInProgress && !sihaAttackInProgress || gamePhase === 'placement') {
+ if (gamePhase === 'battle' && playerTurn && !airBombardmentInProgress && !submarineAttackInProgress && !sihaAttackInProgress) {
controlPadActive = true;
// Use local coordinates for better control
var localPos = {
x: x,
@@ -2656,53 +2658,68 @@
controlPadKnob.y = localPos.y;
}
};
controlPadContainer.up = function (x, y, obj) {
- // If this was a quick tap (not a drag), try to fire at selected target
- if (controlPadActive && gamePhase === 'battle' && playerTurn) {
+ // Handle tap functionality for both battle and placement phases
+ if (controlPadActive) {
var tapDistance = Math.sqrt(controlPadKnob.x * controlPadKnob.x + controlPadKnob.y * controlPadKnob.y);
if (tapDistance < 20) {
- // Quick tap threshold - fire at selected target if valid
- if (selectedTarget && targetSelectionActive && !selectedTarget.cell.isHit && !selectedTarget.cell.isMiss) {
- // Enhanced target confirmation feedback
- tween(targetCenter, {
- scaleX: 4.0,
- scaleY: 4.0,
- alpha: 0.8
- }, {
- duration: 150,
- easing: tween.easeIn,
- onFinish: function onFinish() {
- // Fire at the selected target
- handlePlayerShot(selectedTarget.row, selectedTarget.col);
- }
- });
- // Add visual confirmation flash
- tween(targetCrosshair, {
- scaleX: 3.0,
- scaleY: 3.0,
- alpha: 0.4
- }, {
- duration: 150,
- easing: tween.easeIn
- });
- } else {
- // Try to fire at current cursor position as fallback
- if (enemyGrid.visible) {
- var localX = cursorContainer.x - enemyGrid.x;
- var localY = cursorContainer.y - enemyGrid.y;
- var cellSize = 60 * enemyGrid.scaleX;
- if (localX >= 0 && localX < gridSize * cellSize && localY >= 0 && localY < gridSize * cellSize) {
- var gridCol = Math.floor(localX / cellSize);
- var gridRow = Math.floor(localY / cellSize);
- if (gridRow >= 0 && gridRow < gridSize && gridCol >= 0 && gridCol < gridSize) {
- var targetCell = enemyGrid.cells[gridRow][gridCol];
- if (!targetCell.isHit && !targetCell.isMiss) {
- handlePlayerShot(gridRow, gridCol);
+ // Quick tap threshold
+ if (gamePhase === 'battle' && playerTurn) {
+ // Battle phase - fire at selected target if valid
+ if (selectedTarget && targetSelectionActive && !selectedTarget.cell.isHit && !selectedTarget.cell.isMiss) {
+ // Enhanced target confirmation feedback
+ tween(targetCenter, {
+ scaleX: 4.0,
+ scaleY: 4.0,
+ alpha: 0.8
+ }, {
+ duration: 150,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ // Fire at the selected target
+ handlePlayerShot(selectedTarget.row, selectedTarget.col);
+ }
+ });
+ // Add visual confirmation flash
+ tween(targetCrosshair, {
+ scaleX: 3.0,
+ scaleY: 3.0,
+ alpha: 0.4
+ }, {
+ duration: 150,
+ easing: tween.easeIn
+ });
+ } else {
+ // Try to fire at current cursor position as fallback
+ if (enemyGrid.visible) {
+ var localX = cursorContainer.x - enemyGrid.x;
+ var localY = cursorContainer.y - enemyGrid.y;
+ var cellSize = 60 * enemyGrid.scaleX;
+ if (localX >= 0 && localX < gridSize * cellSize && localY >= 0 && localY < gridSize * cellSize) {
+ var gridCol = Math.floor(localX / cellSize);
+ var gridRow = Math.floor(localY / cellSize);
+ if (gridRow >= 0 && gridRow < gridSize && gridCol >= 0 && gridCol < gridSize) {
+ var targetCell = enemyGrid.cells[gridRow][gridCol];
+ if (!targetCell.isHit && !targetCell.isMiss) {
+ handlePlayerShot(gridRow, gridCol);
+ }
}
}
}
}
+ } else if (gamePhase === 'placement') {
+ // Placement phase - place ship at cursor position
+ var localX = cursorContainer.x - playerGrid.x;
+ var localY = cursorContainer.y - playerGrid.y;
+ var cellSize = 60 * playerGrid.scaleX;
+ if (localX >= 0 && localX < gridSize * cellSize && localY >= 0 && localY < gridSize * cellSize) {
+ var gridCol = Math.floor(localX / cellSize);
+ var gridRow = Math.floor(localY / cellSize);
+ if (gridRow >= 0 && gridRow < gridSize && gridCol >= 0 && gridCol < gridSize) {
+ handleShipPlacement(gridRow, gridCol);
+ }
+ }
}
}
}
controlPadActive = false;
@@ -2715,9 +2732,9 @@
easing: tween.easeOut
});
};
controlPadContainer.move = function (x, y, obj) {
- if (gamePhase === 'battle' && playerTurn && !airBombardmentInProgress && !submarineAttackInProgress && !sihaAttackInProgress || gamePhase === 'placement') {
+ if (gamePhase === 'battle' && playerTurn && !airBombardmentInProgress && !submarineAttackInProgress && !sihaAttackInProgress) {
// Convert coordinates to local space properly
var localPos = {
x: x,
y: y
@@ -2732,39 +2749,17 @@
}
// Smooth knob movement for better responsiveness
controlPadKnob.x = localPos.x;
controlPadKnob.y = localPos.y;
- if (gamePhase === 'battle') {
- // Move cursor directly based on knob position for battle
- var knobOffsetX = controlPadKnob.x / controlPadMaxDistance;
- var knobOffsetY = controlPadKnob.y / controlPadMaxDistance;
- var dynamicSpeed = cursorSpeed * 1.0; // Default responsiveness
- cursorContainer.x += knobOffsetX * dynamicSpeed;
- cursorContainer.y += knobOffsetY * dynamicSpeed;
- // Keep cursor within screen bounds
- cursorContainer.x = Math.max(20, Math.min(2028, cursorContainer.x));
- cursorContainer.y = Math.max(20, Math.min(2712, cursorContainer.y));
- } else if (gamePhase === 'placement') {
- // Move placement cursor based on knob position for ship placement
- var knobOffsetX = controlPadKnob.x / controlPadMaxDistance;
- var knobOffsetY = controlPadKnob.y / controlPadMaxDistance;
- var dynamicSpeed = cursorSpeed * 1.0;
- var newX = placementCursor.x + knobOffsetX * dynamicSpeed;
- var newY = placementCursor.y + knobOffsetY * dynamicSpeed;
- // Restrict cursor movement to player grid area only
- var cellSize = 60 * playerGrid.scaleX;
- var gridWidth = gridSize * cellSize;
- var gridHeight = gridSize * cellSize;
- var playerGridLeft = playerGrid.x;
- var playerGridRight = playerGrid.x + gridWidth;
- var playerGridTop = playerGrid.y;
- var playerGridBottom = playerGrid.y + gridHeight;
- // Constrain cursor to player grid boundaries
- placementCursor.x = Math.max(playerGridLeft, Math.min(playerGridRight - 1, newX));
- placementCursor.y = Math.max(playerGridTop, Math.min(playerGridBottom - 1, newY));
- // Update ship placement preview with cursor position
- showShipPlacementPreview(placementCursor.x, placementCursor.y);
- }
+ // Move cursor directly based on knob position
+ var knobOffsetX = controlPadKnob.x / controlPadMaxDistance;
+ var knobOffsetY = controlPadKnob.y / controlPadMaxDistance;
+ var dynamicSpeed = cursorSpeed * 1.0; // Default responsiveness
+ cursorContainer.x += knobOffsetX * dynamicSpeed;
+ cursorContainer.y += knobOffsetY * dynamicSpeed;
+ // Keep cursor within screen bounds
+ cursorContainer.x = Math.max(20, Math.min(2028, cursorContainer.x));
+ cursorContainer.y = Math.max(20, Math.min(2712, cursorContainer.y));
// Set control pad as active when moving
controlPadActive = true;
}
};
@@ -2818,11 +2813,19 @@
// Allow free movement outside battle phase
cursorContainer.x = x;
cursorContainer.y = y;
}
- // Show cursor during battle phase
+ // Show appropriate cursor for each phase
if (gamePhase === 'battle') {
cursorContainer.visible = true;
+ targetCrosshair.visible = true;
+ targetCenter.visible = true;
+ placementCursor.visible = false;
+ } else if (gamePhase === 'placement') {
+ cursorContainer.visible = true;
+ targetCrosshair.visible = false;
+ targetCenter.visible = false;
+ placementCursor.visible = true;
// Enhanced targeting for enemy waters
if (enemyGrid.visible) {
// Convert screen coordinates to grid coordinates
var localX = cursorContainer.x - enemyGrid.x;
@@ -2939,8 +2942,11 @@
}
} else {
// Hide cursor during other phases
cursorContainer.visible = false;
+ targetCrosshair.visible = false;
+ targetCenter.visible = false;
+ placementCursor.visible = false;
selectedTarget = null;
targetSelectionActive = false;
lastSelectedCell = null;
// Hide selected cell cursor during non-battle phases
@@ -3125,137 +3131,59 @@
// Show control pad during ship placement phase
controlPadContainer.x = 1700; // Move to bottom right
controlPadContainer.y = 2400; // Move to bottom right
controlPadContainer.visible = true;
- padAttackButtonsContainer.x = controlPadContainer.x;
- padAttackButtonsContainer.y = controlPadContainer.y;
- padAttackButtonsContainer.visible = true; // Show placement button during placement
- placementCursor.visible = true; // Show placement cursor during placement
- // Continuous placement cursor movement based on control pad position
+ padAttackButtonsContainer.visible = false; // Hide attack buttons during placement
+ cursorContainer.visible = true; // Show cursor during placement
+ // Continuous cursor movement based on control pad position
if (controlPadContainer.visible) {
var knobOffsetX = controlPadKnob.x / controlPadMaxDistance;
var knobOffsetY = controlPadKnob.y / controlPadMaxDistance;
// Calculate movement speed based on knob distance for variable sensitivity
var knobDistance = Math.sqrt(knobOffsetX * knobOffsetX + knobOffsetY * knobOffsetY);
// Only move cursor if knob is displaced significantly
if (knobDistance > 0.05) {
- var dynamicSpeed = cursorSpeed * (0.5 + knobDistance * 0.5); // Default speed scaling
+ var dynamicSpeed = cursorSpeed * (0.8 + knobDistance * 1.2); // Increased speed for placement
// Calculate new cursor position
- var newX = placementCursor.x + knobOffsetX * dynamicSpeed;
- var newY = placementCursor.y + knobOffsetY * dynamicSpeed;
- // Restrict cursor movement to player grid area only
+ var newX = cursorContainer.x + knobOffsetX * dynamicSpeed;
+ var newY = cursorContainer.y + knobOffsetY * dynamicSpeed;
+ // Use player grid area for placement cursor movement
var cellSize = 60 * playerGrid.scaleX;
var gridWidth = gridSize * cellSize;
var gridHeight = gridSize * cellSize;
var playerGridLeft = playerGrid.x;
var playerGridRight = playerGrid.x + gridWidth;
var playerGridTop = playerGrid.y;
var playerGridBottom = playerGrid.y + gridHeight;
- // Constrain cursor to player grid boundaries
- placementCursor.x = Math.max(playerGridLeft, Math.min(playerGridRight - 1, newX));
- placementCursor.y = Math.max(playerGridTop, Math.min(playerGridBottom - 1, newY));
- // Update ship placement preview with cursor position
- showShipPlacementPreview(placementCursor.x, placementCursor.y);
+ // Constrain cursor to player grid boundaries during placement
+ cursorContainer.x = Math.max(playerGridLeft, Math.min(playerGridRight - 1, newX));
+ cursorContainer.y = Math.max(playerGridTop, Math.min(playerGridBottom - 1, newY));
+ // Add grid snapping for easier placement
+ var localX = cursorContainer.x - playerGrid.x;
+ var localY = cursorContainer.y - playerGrid.y;
+ var snapCol = Math.round(localX / cellSize);
+ var snapRow = Math.round(localY / cellSize);
+ // Snap cursor to grid center
+ cursorContainer.x = playerGrid.x + snapCol * cellSize + cellSize / 2;
+ cursorContainer.y = playerGrid.y + snapRow * cellSize + cellSize / 2;
}
}
} else {
cursorContainer.visible = false;
controlPadContainer.visible = false;
padAttackButtonsContainer.visible = false;
- placementCursor.visible = false;
}
}
};
-// Ship placement cursor for control pad during placement
-var placementCursor = new Container();
-placementCursor.x = 2048 / 2;
-placementCursor.y = 1400; // Start at center of player grid
-game.addChild(placementCursor);
-// Create placement cursor visuals
-var placementBorder = placementCursor.attachAsset('cursorRing', {
- anchorX: 0.5,
- anchorY: 0.5,
- alpha: 0.8,
- scaleX: 1.5,
- scaleY: 1.5,
- tint: 0xFFFF00
-});
-var placementCenter = placementCursor.attachAsset('cursorCenter', {
- anchorX: 0.5,
- anchorY: 0.5,
- alpha: 1.0,
- scaleX: 2.0,
- scaleY: 2.0,
- tint: 0xFF4444
-});
-// Initially hide placement cursor
-placementCursor.visible = false;
-// Add placement button to control pad
-var padPlaceButton = new Container();
-padPlaceButton.x = 0;
-padPlaceButton.y = 350;
-padAttackButtonsContainer.addChild(padPlaceButton);
-var padPlaceBg = padPlaceButton.attachAsset('water', {
- width: 240,
- height: 100,
- x: -120,
- y: -50,
- color: 0x00AA00
-});
-padPlaceBg.alpha = 0.9;
-var padPlaceText = new Text2('🚢 YERLEŞTİR', {
- size: 20,
- fill: 0xFFFFFF
-});
-padPlaceText.anchor.set(0.5, 0.5);
-padPlaceText.x = 0;
-padPlaceText.y = 0;
-padPlaceButton.addChild(padPlaceText);
-padPlaceButton.down = function (x, y, obj) {
- if (gamePhase === 'placement' && currentShipIndex < shipSizes.length) {
- // Convert placement cursor position to grid coordinates
- var localX = placementCursor.x - playerGrid.x;
- var localY = placementCursor.y - playerGrid.y;
- var cellSize = 60 * playerGrid.scaleX;
- var gridCol = Math.floor(localX / cellSize);
- var gridRow = Math.floor(localY / cellSize);
- if (gridRow >= 0 && gridRow < gridSize && gridCol >= 0 && gridCol < gridSize) {
- tween(padPlaceButton, {
- scaleX: 0.9,
- scaleY: 0.9
- }, {
- duration: 100,
- onFinish: function onFinish() {
- tween(padPlaceButton, {
- scaleX: 1,
- scaleY: 1
- }, {
- duration: 100
- });
- }
- });
- handleShipPlacement(gridRow, gridCol);
- }
- }
-};
function showShipPlacementPreview(mouseX, mouseY) {
// Clear existing placement preview
for (var i = shipPlacementPreview.children.length - 1; i >= 0; i--) {
shipPlacementPreview.children[i].destroy();
}
if (gamePhase !== 'placement' || currentShipIndex >= shipSizes.length) return;
- // Use placement cursor position if control pad is active, otherwise use mouse
- var targetX, targetY;
- if (controlPadContainer.visible && gamePhase === 'placement') {
- targetX = placementCursor.x;
- targetY = placementCursor.y;
- } else {
- targetX = mouseX;
- targetY = mouseY;
- }
- // Convert position to grid coordinates
- var localX = targetX - playerGrid.x;
- var localY = targetY - playerGrid.y;
+ // Convert mouse position to grid coordinates
+ var localX = mouseX - playerGrid.x;
+ var localY = mouseY - playerGrid.y;
var cellSize = 60 * playerGrid.scaleX;
var gridCol = Math.floor(localX / cellSize);
var gridRow = Math.floor(localY / cellSize);
// Check if cursor is over player grid
sketch tarzında carrier gemisi. In-Game asset. 2d. High contrast. No shadows
sketch tarzında cruıser savas gemısı. In-Game asset. 2d. High contrast. No shadows
skecth tarzında destroyer savas gemisi. In-Game asset. 2d. High contrast. No shadows
suya düşen füze. In-Game asset. 2d. High contrast. No shadows
suya düşen nesne sonrası oluşan dalgacıklar. In-Game asset. 2d. High contrast. No shadows
patlama sonrası kıvılcımlar. In-Game asset. 2d. High contrast. No shadows
aşağı yönde giden füze. In-Game asset. 2d. High contrast. No shadows
denizaltı gemisi torpidosundan ateşleme. In-Game asset. 2d. High contrast. No shadows
Red crosshair. In-Game asset. 2d. High contrast. No shadows