/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // Player class var Player = Container.expand(function () { var self = Container.call(this); // Properties self.name = ''; self.isStar = false; self.goals = 0; self.assists = 0; self.price = 0; self.position = ''; self.team = ''; // Team name // Visual var icon = self.attachAsset(self.isStar ? 'starPlayer' : 'playerIcon', { anchorX: 0.5, anchorY: 0.5 }); // Set up player display self.setPlayer = function (playerData) { self.name = playerData.name; self.isStar = playerData.isStar; self.goals = playerData.goals || 0; self.assists = playerData.assists || 0; self.price = playerData.price || 0; self.position = playerData.position || ''; self.team = playerData.team || ''; // Change icon color for star icon.tint = self.isStar ? 0xff5733 : 0xf5d142; }; return self; }); // Button class var UIButton = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('button', { anchorX: 0.5, anchorY: 0.5 }); var label = new Text2('', { size: 60, fill: 0xFFFFFF }); label.anchor.set(0.5, 0.5); self.addChild(label); self.setText = function (txt) { label.setText(txt); }; // Highlight on press self.down = function () { bg.tint = 0x1e90ff; }; self.up = function () { bg.tint = 0x333333; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0a1a2f }); /**** * Game Code ****/ // Team colors and player icons (simple shapes for now) // --- Data --- var ALL_PLAYERS = [ // Star players { name: "Messi", isStar: true, price: 120, position: "FW" }, { name: "Yamal", isStar: true, price: 100, position: "FW" }, { name: "Salah", isStar: true, price: 110, position: "FW" }, { name: "Haaland", isStar: true, price: 130, position: "FW" }, // Regulars { name: "Ramos", isStar: false, price: 60, position: "DF" }, { name: "Modric", isStar: false, price: 70, position: "MF" }, { name: "Kimmich", isStar: false, price: 80, position: "MF" }, { name: "Alisson", isStar: false, price: 75, position: "GK" }, { name: "Walker", isStar: false, price: 65, position: "DF" }, { name: "Pedri", isStar: false, price: 85, position: "MF" }, { name: "Foden", isStar: false, price: 90, position: "FW" }, { name: "Gvardiol", isStar: false, price: 60, position: "DF" }, { name: "Musiala", isStar: false, price: 80, position: "MF" }, { name: "Onana", isStar: false, price: 60, position: "GK" }, { name: "Araujo", isStar: false, price: 65, position: "DF" }, { name: "Bellingham", isStar: false, price: 95, position: "MF" }, { name: "Saka", isStar: false, price: 90, position: "FW" }, { name: "Kane", isStar: false, price: 110, position: "FW" }, { name: "De Bruyne", isStar: false, price: 100, position: "MF" }, { name: "Robertson", isStar: false, price: 70, position: "DF" }]; var TEAM_NAMES = ["Lions FC", "Eagles United", "Sharks", "Tigers", "Wolves", "Dragons", "Falcons", "Bulls", "Panthers", "Your Team"]; // --- State --- var leagueTable = []; // [{name, points, played, won, drawn, lost, gf, ga}] var fixtures = []; // [{home, away}] var currentMatchIndex = 0; var userTeamName = "Your Team"; var userSquad = []; // [{name, isStar, goals, assists, price, position}] var userMoney = 200; // Start money var transferMarket = []; // Available players to buy var userStats = {}; // {playerName: {goals, assists}} var matchResult = null; // {home, away, homeGoals, awayGoals} var leagueFinished = false; // --- UI Elements --- var mainPanel = null; var infoText = null; var moneyText = null; var tablePanel = null; var squadPanel = null; var marketPanel = null; var nextButton = null; var buyButtons = []; var lineupText = null; // --- Helper Functions --- function shuffleArray(arr) { for (var i = arr.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } // Generate league table function initLeagueTable() { leagueTable = []; for (var i = 0; i < TEAM_NAMES.length; i++) { leagueTable.push({ name: TEAM_NAMES[i], points: 0, played: 0, won: 0, drawn: 0, lost: 0, gf: 0, ga: 0 }); } } // Generate fixtures (single round robin) function initFixtures() { fixtures = []; var teams = TEAM_NAMES.slice(); for (var i = 0; i < teams.length; i++) { for (var j = i + 1; j < teams.length; j++) { fixtures.push({ home: teams[i], away: teams[j] }); } } shuffleArray(fixtures); currentMatchIndex = 0; } // Generate initial user squad (random 7 players) function initUserSquad() { userSquad = []; var pool = ALL_PLAYERS.slice(); shuffleArray(pool); for (var i = 0; i < 7; i++) { var p = Object.assign({}, pool[i]); userSquad.push(p); userStats[p.name] = { goals: 0, assists: 0 }; } } // Generate transfer market (players not in userSquad) function updateTransferMarket() { var owned = {}; for (var i = 0; i < userSquad.length; i++) { owned[userSquad[i].name] = true; } transferMarket = []; for (var j = 0; j < ALL_PLAYERS.length; j++) { if (!owned[ALL_PLAYERS[j].name]) { transferMarket.push(Object.assign({}, ALL_PLAYERS[j])); } } shuffleArray(transferMarket); transferMarket = transferMarket.slice(0, 5); // Show 5 at a time } // Find team in leagueTable function getTeamRow(name) { for (var i = 0; i < leagueTable.length; i++) { if (leagueTable[i].name === name) return leagueTable[i]; } return null; } // Simulate a match function simulateMatch(home, away) { // User team gets a small boost var homeSquad = home === userTeamName ? userSquad : []; var awaySquad = away === userTeamName ? userSquad : []; var homeStrength = 50 + (home === userTeamName ? getSquadStrength(userSquad) : getRandomInt(40, 70)); var awayStrength = 50 + (away === userTeamName ? getSquadStrength(userSquad) : getRandomInt(40, 70)); // Add random factor homeStrength += getRandomInt(-10, 10); awayStrength += getRandomInt(-10, 10); var homeGoals = Math.max(0, Math.round(homeStrength / 30 + getRandomInt(0, 2))); var awayGoals = Math.max(0, Math.round(awayStrength / 30 + getRandomInt(0, 2))); // If user team, assign goals/assists to players if (home === userTeamName || away === userTeamName) { var userIsHome = home === userTeamName; var userGoals = userIsHome ? homeGoals : awayGoals; var userAssists = 0; for (var g = 0; g < userGoals; g++) { var scorerIdx = getRandomInt(0, userSquad.length - 1); var assistIdx = getRandomInt(0, userSquad.length - 1); while (assistIdx === scorerIdx && userSquad.length > 1) { assistIdx = getRandomInt(0, userSquad.length - 1); } var scorer = userSquad[scorerIdx]; var assister = userSquad[assistIdx]; userStats[scorer.name].goals += 1; userStats[assister.name].assists += 1; } } return { home: home, away: away, homeGoals: homeGoals, awayGoals: awayGoals }; } // Calculate squad strength function getSquadStrength(squad) { var sum = 0; for (var i = 0; i < squad.length; i++) { sum += squad[i].price; if (squad[i].isStar) sum += 10; } return Math.round(sum / squad.length); } // Update league table with match result function updateLeagueTable(result) { var home = getTeamRow(result.home); var away = getTeamRow(result.away); home.played += 1; away.played += 1; home.gf += result.homeGoals; home.ga += result.awayGoals; away.gf += result.awayGoals; away.ga += result.homeGoals; if (result.homeGoals > result.awayGoals) { home.won += 1; home.points += 3; away.lost += 1; } else if (result.homeGoals < result.awayGoals) { away.won += 1; away.points += 3; home.lost += 1; } else { home.drawn += 1; away.drawn += 1; home.points += 1; away.points += 1; } } // Sort league table function sortLeagueTable() { leagueTable.sort(function (a, b) { if (b.points !== a.points) return b.points - a.points; var gdA = a.gf - a.ga, gdB = b.gf - b.ga; if (gdB !== gdA) return gdB - gdA; return b.gf - a.gf; }); } // --- UI Functions --- function clearPanel(panel) { if (panel && panel.children) { for (var i = panel.children.length - 1; i >= 0; i--) { var c = panel.children[i]; if (c.destroy) c.destroy(); panel.removeChild(c); } } } function showMainPanel() { if (!mainPanel) { mainPanel = new Container(); mainPanel.x = 0; mainPanel.y = 0; game.addChild(mainPanel); } clearPanel(mainPanel); // Title var title = new Text2("Football League Manager", { size: 100, fill: 0xFFFFFF }); title.anchor.set(0.5, 0); title.x = 2048 / 2; title.y = 120; mainPanel.addChild(title); // Money if (!moneyText) { moneyText = new Text2("", { size: 60, fill: 0xF5D142 }); moneyText.anchor.set(1, 0); moneyText.x = 2048 - 60; moneyText.y = 120; mainPanel.addChild(moneyText); } updateMoneyText(); // Info if (!infoText) { infoText = new Text2("", { size: 60, fill: 0xFFFFFF }); infoText.anchor.set(0.5, 0); infoText.x = 2048 / 2; infoText.y = 250; mainPanel.addChild(infoText); } // League Table showLeagueTable(); // Squad showSquad(); // Transfer Market showTransferMarket(); // Next Match Button if (!nextButton) { nextButton = new UIButton(); nextButton.x = 2048 / 2; nextButton.y = 2732 - 200; nextButton.setText("Play Next Match"); nextButton.up = function () { playNextMatch(); }; mainPanel.addChild(nextButton); } nextButton.visible = !leagueFinished; // If league finished, show message if (leagueFinished) { infoText.setText("Season Finished! Tap to restart."); nextButton.visible = false; mainPanel.down = function () { restartGame(); }; } else { infoText.setText("Manage your team, buy players, and win the league!"); mainPanel.down = undefined; } } function updateMoneyText() { if (moneyText) { moneyText.setText("Money: $" + userMoney); } } function showLeagueTable() { if (!tablePanel) { tablePanel = new Container(); tablePanel.x = 80; tablePanel.y = 350; mainPanel.addChild(tablePanel); } clearPanel(tablePanel); var tableTitle = new Text2("League Table", { size: 60, fill: 0x1E90FF }); tableTitle.anchor.set(0, 0); tableTitle.x = 0; tableTitle.y = 0; tablePanel.addChild(tableTitle); sortLeagueTable(); for (var i = 0; i < leagueTable.length; i++) { var row = leagueTable[i]; var y = 80 + i * 60; var txt = i + 1 + ". " + row.name + " " + row.points + "pts " + row.played + "P " + row.won + "W " + row.drawn + "D " + row.lost + "L " + row.gf + "-" + row.ga; var color = row.name === userTeamName ? "#f5d142" : "#ffffff"; var t = new Text2(txt, { size: 44, fill: color }); t.anchor.set(0, 0); t.x = 0; t.y = y; tablePanel.addChild(t); } } function showSquad() { if (!squadPanel) { squadPanel = new Container(); squadPanel.x = 1100; squadPanel.y = 350; mainPanel.addChild(squadPanel); } clearPanel(squadPanel); var squadTitle = new Text2("Your Squad", { size: 60, fill: 0x1E90FF }); squadTitle.anchor.set(0, 0); squadTitle.x = 0; squadTitle.y = 0; squadPanel.addChild(squadTitle); for (var i = 0; i < userSquad.length; i++) { var p = userSquad[i]; var y = 80 + i * 90; var icon = LK.getAsset(p.isStar ? 'starPlayer' : 'playerIcon', { anchorX: 0.5, anchorY: 0.5, x: 40, y: y + 40 }); squadPanel.addChild(icon); var stat = userStats[p.name] || { goals: 0, assists: 0 }; // Ballon d'Or logic: Award if player has 7 or more goals var hasBallonDor = stat.goals >= 7; var ballonDorText = hasBallonDor ? " 🏆" : ""; var txt = p.name + " (" + p.position + ")" + (p.isStar ? " ★" : "") + ballonDorText + " G:" + stat.goals + " A:" + stat.assists; var t = new Text2(txt, { size: 44, fill: hasBallonDor ? 0xf5d142 : 0xFFFFFF }); t.anchor.set(0, 0.5); t.x = 90; t.y = y + 40; squadPanel.addChild(t); } } function showTransferMarket() { if (!marketPanel) { marketPanel = new Container(); // Expanded and moved further down for more space marketPanel.x = 350; // More to the left for wider panel marketPanel.y = 1600; // Lower on the screen for more room mainPanel.addChild(marketPanel); } clearPanel(marketPanel); buyButtons = []; var marketTitle = new Text2("Transfer Market", { size: 60, fill: 0x1E90FF }); marketTitle.anchor.set(0, 0); marketTitle.x = 0; marketTitle.y = 0; marketPanel.addChild(marketTitle); // Increase width and spacing for better visibility for (var i = 0; i < transferMarket.length; i++) { var p = transferMarket[i]; var y = 100 + i * 180; // More vertical space var icon = LK.getAsset(p.isStar ? 'starPlayer' : 'playerIcon', { anchorX: 0.5, anchorY: 0.5, x: 100, y: y + 70 }); marketPanel.addChild(icon); var txt = p.name + " (" + p.position + ")" + (p.isStar ? " ★" : "") + " $" + p.price; var t = new Text2(txt, { size: 72, // Larger text for better visibility fill: 0xFFFFFF }); t.anchor.set(0, 0.5); t.x = 220; t.y = y + 70; marketPanel.addChild(t); // Buy button var btn = new UIButton(); btn.x = 700; btn.y = y + 70; btn.setText("Buy"); btn.up = function (player) { return function () { buyPlayer(player); }; }(p); marketPanel.addChild(btn); buyButtons.push(btn); } } function playNextMatch() { if (currentMatchIndex >= fixtures.length) { leagueFinished = true; showMainPanel(); return; } var match = fixtures[currentMatchIndex]; currentMatchIndex += 1; matchResult = simulateMatch(match.home, match.away); updateLeagueTable(matchResult); showMatchResult(matchResult); updateMoneyText(); showLeagueTable(); showSquad(); updateTransferMarket(); showTransferMarket(); } function showMatchResult(result) { var msg = result.home + " " + result.homeGoals + " - " + result.awayGoals + " " + result.away; var userInvolved = result.home === userTeamName || result.away === userTeamName; var userWon = false, userDraw = false; if (userInvolved) { if (result.home === userTeamName && result.homeGoals > result.awayGoals || result.away === userTeamName && result.awayGoals > result.homeGoals) { userWon = true; } else if (result.homeGoals === result.awayGoals) { userDraw = true; } } var reward = 0; if (userWon) { reward = 50; userMoney += reward; } else if (userDraw) { reward = 20; userMoney += reward; } var statMsg = ""; if (userInvolved) { statMsg = "\n"; for (var i = 0; i < userSquad.length; i++) { var p = userSquad[i]; var s = userStats[p.name]; if (s.goals > 0 || s.assists > 0) { statMsg += p.name + ": G" + s.goals + " A" + s.assists + "\n"; } } } infoText.setText("Match Result:\n" + msg + (userInvolved ? "\nYou " + (userWon ? "won! +$" + reward : userDraw ? "drew! +$" + reward : "lost.") : "") + statMsg + "\nTap 'Play Next Match' to continue."); } function buyPlayer(player) { if (userMoney < player.price) { infoText.setText("Not enough money to buy " + player.name + "!"); return; } if (userSquad.length >= 11) { infoText.setText("Squad full! Max 11 players."); return; } userMoney -= player.price; var p = Object.assign({}, player); userSquad.push(p); userStats[p.name] = { goals: 0, assists: 0 }; updateMoneyText(); updateTransferMarket(); showTransferMarket(); showSquad(); infoText.setText("Bought " + p.name + "!"); } function restartGame() { leagueFinished = false; userMoney = 200; userStats = {}; initLeagueTable(); initFixtures(); initUserSquad(); updateTransferMarket(); showMainPanel(); } // --- Game Start --- function startGame() { leagueFinished = false; userMoney = 200; userStats = {}; initLeagueTable(); initFixtures(); initUserSquad(); updateTransferMarket(); showMainPanel(); } // --- Start --- startGame();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
// Properties
self.name = '';
self.isStar = false;
self.goals = 0;
self.assists = 0;
self.price = 0;
self.position = '';
self.team = ''; // Team name
// Visual
var icon = self.attachAsset(self.isStar ? 'starPlayer' : 'playerIcon', {
anchorX: 0.5,
anchorY: 0.5
});
// Set up player display
self.setPlayer = function (playerData) {
self.name = playerData.name;
self.isStar = playerData.isStar;
self.goals = playerData.goals || 0;
self.assists = playerData.assists || 0;
self.price = playerData.price || 0;
self.position = playerData.position || '';
self.team = playerData.team || '';
// Change icon color for star
icon.tint = self.isStar ? 0xff5733 : 0xf5d142;
};
return self;
});
// Button class
var UIButton = Container.expand(function () {
var self = Container.call(this);
var bg = self.attachAsset('button', {
anchorX: 0.5,
anchorY: 0.5
});
var label = new Text2('', {
size: 60,
fill: 0xFFFFFF
});
label.anchor.set(0.5, 0.5);
self.addChild(label);
self.setText = function (txt) {
label.setText(txt);
};
// Highlight on press
self.down = function () {
bg.tint = 0x1e90ff;
};
self.up = function () {
bg.tint = 0x333333;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x0a1a2f
});
/****
* Game Code
****/
// Team colors and player icons (simple shapes for now)
// --- Data ---
var ALL_PLAYERS = [
// Star players
{
name: "Messi",
isStar: true,
price: 120,
position: "FW"
}, {
name: "Yamal",
isStar: true,
price: 100,
position: "FW"
}, {
name: "Salah",
isStar: true,
price: 110,
position: "FW"
}, {
name: "Haaland",
isStar: true,
price: 130,
position: "FW"
},
// Regulars
{
name: "Ramos",
isStar: false,
price: 60,
position: "DF"
}, {
name: "Modric",
isStar: false,
price: 70,
position: "MF"
}, {
name: "Kimmich",
isStar: false,
price: 80,
position: "MF"
}, {
name: "Alisson",
isStar: false,
price: 75,
position: "GK"
}, {
name: "Walker",
isStar: false,
price: 65,
position: "DF"
}, {
name: "Pedri",
isStar: false,
price: 85,
position: "MF"
}, {
name: "Foden",
isStar: false,
price: 90,
position: "FW"
}, {
name: "Gvardiol",
isStar: false,
price: 60,
position: "DF"
}, {
name: "Musiala",
isStar: false,
price: 80,
position: "MF"
}, {
name: "Onana",
isStar: false,
price: 60,
position: "GK"
}, {
name: "Araujo",
isStar: false,
price: 65,
position: "DF"
}, {
name: "Bellingham",
isStar: false,
price: 95,
position: "MF"
}, {
name: "Saka",
isStar: false,
price: 90,
position: "FW"
}, {
name: "Kane",
isStar: false,
price: 110,
position: "FW"
}, {
name: "De Bruyne",
isStar: false,
price: 100,
position: "MF"
}, {
name: "Robertson",
isStar: false,
price: 70,
position: "DF"
}];
var TEAM_NAMES = ["Lions FC", "Eagles United", "Sharks", "Tigers", "Wolves", "Dragons", "Falcons", "Bulls", "Panthers", "Your Team"];
// --- State ---
var leagueTable = []; // [{name, points, played, won, drawn, lost, gf, ga}]
var fixtures = []; // [{home, away}]
var currentMatchIndex = 0;
var userTeamName = "Your Team";
var userSquad = []; // [{name, isStar, goals, assists, price, position}]
var userMoney = 200; // Start money
var transferMarket = []; // Available players to buy
var userStats = {}; // {playerName: {goals, assists}}
var matchResult = null; // {home, away, homeGoals, awayGoals}
var leagueFinished = false;
// --- UI Elements ---
var mainPanel = null;
var infoText = null;
var moneyText = null;
var tablePanel = null;
var squadPanel = null;
var marketPanel = null;
var nextButton = null;
var buyButtons = [];
var lineupText = null;
// --- Helper Functions ---
function shuffleArray(arr) {
for (var i = arr.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
// Generate league table
function initLeagueTable() {
leagueTable = [];
for (var i = 0; i < TEAM_NAMES.length; i++) {
leagueTable.push({
name: TEAM_NAMES[i],
points: 0,
played: 0,
won: 0,
drawn: 0,
lost: 0,
gf: 0,
ga: 0
});
}
}
// Generate fixtures (single round robin)
function initFixtures() {
fixtures = [];
var teams = TEAM_NAMES.slice();
for (var i = 0; i < teams.length; i++) {
for (var j = i + 1; j < teams.length; j++) {
fixtures.push({
home: teams[i],
away: teams[j]
});
}
}
shuffleArray(fixtures);
currentMatchIndex = 0;
}
// Generate initial user squad (random 7 players)
function initUserSquad() {
userSquad = [];
var pool = ALL_PLAYERS.slice();
shuffleArray(pool);
for (var i = 0; i < 7; i++) {
var p = Object.assign({}, pool[i]);
userSquad.push(p);
userStats[p.name] = {
goals: 0,
assists: 0
};
}
}
// Generate transfer market (players not in userSquad)
function updateTransferMarket() {
var owned = {};
for (var i = 0; i < userSquad.length; i++) {
owned[userSquad[i].name] = true;
}
transferMarket = [];
for (var j = 0; j < ALL_PLAYERS.length; j++) {
if (!owned[ALL_PLAYERS[j].name]) {
transferMarket.push(Object.assign({}, ALL_PLAYERS[j]));
}
}
shuffleArray(transferMarket);
transferMarket = transferMarket.slice(0, 5); // Show 5 at a time
}
// Find team in leagueTable
function getTeamRow(name) {
for (var i = 0; i < leagueTable.length; i++) {
if (leagueTable[i].name === name) return leagueTable[i];
}
return null;
}
// Simulate a match
function simulateMatch(home, away) {
// User team gets a small boost
var homeSquad = home === userTeamName ? userSquad : [];
var awaySquad = away === userTeamName ? userSquad : [];
var homeStrength = 50 + (home === userTeamName ? getSquadStrength(userSquad) : getRandomInt(40, 70));
var awayStrength = 50 + (away === userTeamName ? getSquadStrength(userSquad) : getRandomInt(40, 70));
// Add random factor
homeStrength += getRandomInt(-10, 10);
awayStrength += getRandomInt(-10, 10);
var homeGoals = Math.max(0, Math.round(homeStrength / 30 + getRandomInt(0, 2)));
var awayGoals = Math.max(0, Math.round(awayStrength / 30 + getRandomInt(0, 2)));
// If user team, assign goals/assists to players
if (home === userTeamName || away === userTeamName) {
var userIsHome = home === userTeamName;
var userGoals = userIsHome ? homeGoals : awayGoals;
var userAssists = 0;
for (var g = 0; g < userGoals; g++) {
var scorerIdx = getRandomInt(0, userSquad.length - 1);
var assistIdx = getRandomInt(0, userSquad.length - 1);
while (assistIdx === scorerIdx && userSquad.length > 1) {
assistIdx = getRandomInt(0, userSquad.length - 1);
}
var scorer = userSquad[scorerIdx];
var assister = userSquad[assistIdx];
userStats[scorer.name].goals += 1;
userStats[assister.name].assists += 1;
}
}
return {
home: home,
away: away,
homeGoals: homeGoals,
awayGoals: awayGoals
};
}
// Calculate squad strength
function getSquadStrength(squad) {
var sum = 0;
for (var i = 0; i < squad.length; i++) {
sum += squad[i].price;
if (squad[i].isStar) sum += 10;
}
return Math.round(sum / squad.length);
}
// Update league table with match result
function updateLeagueTable(result) {
var home = getTeamRow(result.home);
var away = getTeamRow(result.away);
home.played += 1;
away.played += 1;
home.gf += result.homeGoals;
home.ga += result.awayGoals;
away.gf += result.awayGoals;
away.ga += result.homeGoals;
if (result.homeGoals > result.awayGoals) {
home.won += 1;
home.points += 3;
away.lost += 1;
} else if (result.homeGoals < result.awayGoals) {
away.won += 1;
away.points += 3;
home.lost += 1;
} else {
home.drawn += 1;
away.drawn += 1;
home.points += 1;
away.points += 1;
}
}
// Sort league table
function sortLeagueTable() {
leagueTable.sort(function (a, b) {
if (b.points !== a.points) return b.points - a.points;
var gdA = a.gf - a.ga,
gdB = b.gf - b.ga;
if (gdB !== gdA) return gdB - gdA;
return b.gf - a.gf;
});
}
// --- UI Functions ---
function clearPanel(panel) {
if (panel && panel.children) {
for (var i = panel.children.length - 1; i >= 0; i--) {
var c = panel.children[i];
if (c.destroy) c.destroy();
panel.removeChild(c);
}
}
}
function showMainPanel() {
if (!mainPanel) {
mainPanel = new Container();
mainPanel.x = 0;
mainPanel.y = 0;
game.addChild(mainPanel);
}
clearPanel(mainPanel);
// Title
var title = new Text2("Football League Manager", {
size: 100,
fill: 0xFFFFFF
});
title.anchor.set(0.5, 0);
title.x = 2048 / 2;
title.y = 120;
mainPanel.addChild(title);
// Money
if (!moneyText) {
moneyText = new Text2("", {
size: 60,
fill: 0xF5D142
});
moneyText.anchor.set(1, 0);
moneyText.x = 2048 - 60;
moneyText.y = 120;
mainPanel.addChild(moneyText);
}
updateMoneyText();
// Info
if (!infoText) {
infoText = new Text2("", {
size: 60,
fill: 0xFFFFFF
});
infoText.anchor.set(0.5, 0);
infoText.x = 2048 / 2;
infoText.y = 250;
mainPanel.addChild(infoText);
}
// League Table
showLeagueTable();
// Squad
showSquad();
// Transfer Market
showTransferMarket();
// Next Match Button
if (!nextButton) {
nextButton = new UIButton();
nextButton.x = 2048 / 2;
nextButton.y = 2732 - 200;
nextButton.setText("Play Next Match");
nextButton.up = function () {
playNextMatch();
};
mainPanel.addChild(nextButton);
}
nextButton.visible = !leagueFinished;
// If league finished, show message
if (leagueFinished) {
infoText.setText("Season Finished! Tap to restart.");
nextButton.visible = false;
mainPanel.down = function () {
restartGame();
};
} else {
infoText.setText("Manage your team, buy players, and win the league!");
mainPanel.down = undefined;
}
}
function updateMoneyText() {
if (moneyText) {
moneyText.setText("Money: $" + userMoney);
}
}
function showLeagueTable() {
if (!tablePanel) {
tablePanel = new Container();
tablePanel.x = 80;
tablePanel.y = 350;
mainPanel.addChild(tablePanel);
}
clearPanel(tablePanel);
var tableTitle = new Text2("League Table", {
size: 60,
fill: 0x1E90FF
});
tableTitle.anchor.set(0, 0);
tableTitle.x = 0;
tableTitle.y = 0;
tablePanel.addChild(tableTitle);
sortLeagueTable();
for (var i = 0; i < leagueTable.length; i++) {
var row = leagueTable[i];
var y = 80 + i * 60;
var txt = i + 1 + ". " + row.name + " " + row.points + "pts " + row.played + "P " + row.won + "W " + row.drawn + "D " + row.lost + "L " + row.gf + "-" + row.ga;
var color = row.name === userTeamName ? "#f5d142" : "#ffffff";
var t = new Text2(txt, {
size: 44,
fill: color
});
t.anchor.set(0, 0);
t.x = 0;
t.y = y;
tablePanel.addChild(t);
}
}
function showSquad() {
if (!squadPanel) {
squadPanel = new Container();
squadPanel.x = 1100;
squadPanel.y = 350;
mainPanel.addChild(squadPanel);
}
clearPanel(squadPanel);
var squadTitle = new Text2("Your Squad", {
size: 60,
fill: 0x1E90FF
});
squadTitle.anchor.set(0, 0);
squadTitle.x = 0;
squadTitle.y = 0;
squadPanel.addChild(squadTitle);
for (var i = 0; i < userSquad.length; i++) {
var p = userSquad[i];
var y = 80 + i * 90;
var icon = LK.getAsset(p.isStar ? 'starPlayer' : 'playerIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: 40,
y: y + 40
});
squadPanel.addChild(icon);
var stat = userStats[p.name] || {
goals: 0,
assists: 0
};
// Ballon d'Or logic: Award if player has 7 or more goals
var hasBallonDor = stat.goals >= 7;
var ballonDorText = hasBallonDor ? " 🏆" : "";
var txt = p.name + " (" + p.position + ")" + (p.isStar ? " ★" : "") + ballonDorText + " G:" + stat.goals + " A:" + stat.assists;
var t = new Text2(txt, {
size: 44,
fill: hasBallonDor ? 0xf5d142 : 0xFFFFFF
});
t.anchor.set(0, 0.5);
t.x = 90;
t.y = y + 40;
squadPanel.addChild(t);
}
}
function showTransferMarket() {
if (!marketPanel) {
marketPanel = new Container();
// Expanded and moved further down for more space
marketPanel.x = 350; // More to the left for wider panel
marketPanel.y = 1600; // Lower on the screen for more room
mainPanel.addChild(marketPanel);
}
clearPanel(marketPanel);
buyButtons = [];
var marketTitle = new Text2("Transfer Market", {
size: 60,
fill: 0x1E90FF
});
marketTitle.anchor.set(0, 0);
marketTitle.x = 0;
marketTitle.y = 0;
marketPanel.addChild(marketTitle);
// Increase width and spacing for better visibility
for (var i = 0; i < transferMarket.length; i++) {
var p = transferMarket[i];
var y = 100 + i * 180; // More vertical space
var icon = LK.getAsset(p.isStar ? 'starPlayer' : 'playerIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: 100,
y: y + 70
});
marketPanel.addChild(icon);
var txt = p.name + " (" + p.position + ")" + (p.isStar ? " ★" : "") + " $" + p.price;
var t = new Text2(txt, {
size: 72,
// Larger text for better visibility
fill: 0xFFFFFF
});
t.anchor.set(0, 0.5);
t.x = 220;
t.y = y + 70;
marketPanel.addChild(t);
// Buy button
var btn = new UIButton();
btn.x = 700;
btn.y = y + 70;
btn.setText("Buy");
btn.up = function (player) {
return function () {
buyPlayer(player);
};
}(p);
marketPanel.addChild(btn);
buyButtons.push(btn);
}
}
function playNextMatch() {
if (currentMatchIndex >= fixtures.length) {
leagueFinished = true;
showMainPanel();
return;
}
var match = fixtures[currentMatchIndex];
currentMatchIndex += 1;
matchResult = simulateMatch(match.home, match.away);
updateLeagueTable(matchResult);
showMatchResult(matchResult);
updateMoneyText();
showLeagueTable();
showSquad();
updateTransferMarket();
showTransferMarket();
}
function showMatchResult(result) {
var msg = result.home + " " + result.homeGoals + " - " + result.awayGoals + " " + result.away;
var userInvolved = result.home === userTeamName || result.away === userTeamName;
var userWon = false,
userDraw = false;
if (userInvolved) {
if (result.home === userTeamName && result.homeGoals > result.awayGoals || result.away === userTeamName && result.awayGoals > result.homeGoals) {
userWon = true;
} else if (result.homeGoals === result.awayGoals) {
userDraw = true;
}
}
var reward = 0;
if (userWon) {
reward = 50;
userMoney += reward;
} else if (userDraw) {
reward = 20;
userMoney += reward;
}
var statMsg = "";
if (userInvolved) {
statMsg = "\n";
for (var i = 0; i < userSquad.length; i++) {
var p = userSquad[i];
var s = userStats[p.name];
if (s.goals > 0 || s.assists > 0) {
statMsg += p.name + ": G" + s.goals + " A" + s.assists + "\n";
}
}
}
infoText.setText("Match Result:\n" + msg + (userInvolved ? "\nYou " + (userWon ? "won! +$" + reward : userDraw ? "drew! +$" + reward : "lost.") : "") + statMsg + "\nTap 'Play Next Match' to continue.");
}
function buyPlayer(player) {
if (userMoney < player.price) {
infoText.setText("Not enough money to buy " + player.name + "!");
return;
}
if (userSquad.length >= 11) {
infoText.setText("Squad full! Max 11 players.");
return;
}
userMoney -= player.price;
var p = Object.assign({}, player);
userSquad.push(p);
userStats[p.name] = {
goals: 0,
assists: 0
};
updateMoneyText();
updateTransferMarket();
showTransferMarket();
showSquad();
infoText.setText("Bought " + p.name + "!");
}
function restartGame() {
leagueFinished = false;
userMoney = 200;
userStats = {};
initLeagueTable();
initFixtures();
initUserSquad();
updateTransferMarket();
showMainPanel();
}
// --- Game Start ---
function startGame() {
leagueFinished = false;
userMoney = 200;
userStats = {};
initLeagueTable();
initFixtures();
initUserSquad();
updateTransferMarket();
showMainPanel();
}
// --- Start ---
startGame();