User prompt
Please make sure the player can clearly swap a selected squad player with any bench player by tapping on them. The swap must update immediately and reflect visually with refreshed labels."
User prompt
Please make sure the player can tap a squad player to select them, and then tap a bench player to swap their positions. This interaction should clearly allow swapping between squad and bench players in both directions, and it must update the team immediately.
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'name')' in or related to this line: 'showInfo("Tap a squad player to swap with " + bench[selectedBenchIdx].name);' Line Number: 302
User prompt
Please add functionality to allow swapping players between the starting 5 (squad) and the 3 bench players. The player should be able to tap a squad member and then tap a bench player to switch their positions.
User prompt
add Son Heung Min to topplayers
User prompt
add goal difference to the league table
User prompt
make the bench closer to the squad
User prompt
move the league table to left
User prompt
put the league table between the transfer market and the next opponent text
Code edit (1 edits merged)
Please save this source code
User prompt
make the random player names turkish
User prompt
make the sell button and the arrows closer to the player names
User prompt
Please remove the text that says '3 seasons' next to the players in the transfer market.
User prompt
Please reduce the spacing between the bench texts to be almost zero, but keep the texts arranged vertically (one below the other).
User prompt
Please reduce the spacing between the transfer market texts to be almost zero, but keep the texts arranged vertically (one below the other)
User prompt
Please reduce the spacing between the squad texts to be almost zero, but keep the texts arranged vertically (one below the other).
User prompt
"Please reduce the spacing between the squad texts to be almost zero."
User prompt
"Please move the buy buttons slightly to the right and make the transfer and squad sections a bit larger from current."
User prompt
"Please move the buy buttons slightly to the right and make the transfer and squad sections a bit larger."
User prompt
"Please reduce the size of the squad and transfer sections."
User prompt
"Please slightly enlarge the league table and move it a little to the left."
User prompt
"Please slightly enlarge the league table and move it a little to the left."
User prompt
Please resize the league table smaller and place it between the center and the bottom right area of the screen.
User prompt
Do not change any content or text. Only rearrange all visible elements so that none of them touch or overlap. Make sure every element is completely separate with clear space around it.
User prompt
Text resizing alone is not enough. If necessary, change the size of the full UI elements and move them so none of them touch or overlap each other on the screen.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a3d2f
});
/****
* Game Code
****/
// Player class: represents a footballer
// --- CONSTANTS ---
var Player = function Player(name, attack, defense, stamina, value, seasonsRemaining) {
var self = {};
self.name = name;
self.attack = attack;
self.defense = defense;
self.stamina = stamina;
self.value = value;
self.maxStamina = stamina;
self.inSquad = false; // true if in starting 5
self.seasonsRemaining = typeof seasonsRemaining === "number" ? seasonsRemaining : null; // null for non-transfer players, or integer for transfer market
return self;
};
// Team class: holds a list of players
var Team = function Team(name, players) {
var self = {};
self.name = name;
self.players = players; // array of Player
return self;
};
var SQUAD_SIZE = 5;
var BENCH_SIZE = 3;
var INITIAL_BUDGET = 100;
var PLAYER_MIN_VALUE = 10;
var PLAYER_MAX_VALUE = 40;
// --- GLOBALS ---
var allPlayers = []; // All players owned by user
var squad = []; // Starting 5
var bench = []; // Bench 3
var transferList = []; // Players available to buy
var budget = INITIAL_BUDGET;
var opponentTeam = null;
var matchInProgress = false;
var matchLog = [];
var matchResult = null;
var selectedPlayerIdx = null; // For swapping
var selectedBenchIdx = null; // For swapping
var infoText = null;
var budgetText = null;
var matchText = null;
var transferText = null;
var transferBtns = [];
var swapBtns = [];
var playBtn = null;
var nextBtn = null;
var sellBtns = [];
var buyBtns = [];
var squadLabels = [];
var benchLabels = [];
var opponentLabels = [];
var guiY = 0;
// --- UTILS ---
function randomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function randomName() {
var first = ["Ahmet", "Mehmet", "Mustafa", "Ali", "Hüseyin", "Hasan", "Cesur", "Osman", "Yusuf", "Murat", "Emre", "Burak", "Fatih", "Serkan", "Onur", "Barış", "Cem", "Eren", "Kaan", "Deniz"];
var last = ["Yılmaz", "Kaya", "Demir", "Şahin", "Çelik", "Yıldız", "Yıldırım", "Aydın", "Öztürk", "Arslan", "Doğan", "Kılıç", "Aslan", "Polat", "Koç", "Kurt", "Özdemir", "Aksoy", "Güneş", "Bozkurt"];
return first[randomInt(0, first.length - 1)] + " " + last[randomInt(0, last.length - 1)];
}
function makeRandomPlayer() {
var atk = randomInt(5, 15);
var def = randomInt(5, 15);
var sta = randomInt(10, 20);
var val = Math.floor((atk + def + sta) / 3) + randomInt(PLAYER_MIN_VALUE, PLAYER_MAX_VALUE);
return new Player(randomName(), atk, def, sta, val);
}
// Real-life Turkish Super Lig squads (2023/24, main players, 5 per team for demo)
var realSquads = {
"Galatasaray": [new Player("Mauro Icardi", 18, 8, 16, 40), new Player("Dries Mertens", 16, 7, 15, 36), new Player("Lucas Torreira", 10, 16, 17, 34), new Player("Kerem Aktürkoğlu", 15, 8, 15, 32), new Player("Fernando Muslera", 7, 18, 16, 35)],
"Fenerbahce": [new Player("Edin Dzeko", 17, 7, 15, 38), new Player("Dusan Tadic", 16, 8, 15, 36), new Player("Fred", 12, 14, 16, 33), new Player("Sebastian Szymanski", 15, 9, 15, 32), new Player("Dominik Livakovic", 6, 17, 16, 34)],
"Besiktas": [new Player("Cenk Tosun", 16, 7, 15, 34), new Player("Rachid Ghezzal", 15, 8, 14, 32), new Player("Salih Uçan", 12, 13, 15, 30), new Player("Omar Colley", 8, 16, 15, 31), new Player("Mert Günok", 6, 17, 15, 30)],
"Trabzonspor": [new Player("Edin Visca", 15, 8, 15, 32), new Player("Anastasios Bakasetas", 15, 9, 15, 32), new Player("Uğurcan Çakır", 6, 17, 16, 33), new Player("Enis Bardhi", 14, 8, 14, 29), new Player("Joaquin Fernandez", 8, 15, 14, 28)],
"Basaksehir": [new Player("Danijel Aleksic", 14, 8, 14, 28), new Player("Leo Duarte", 8, 15, 14, 27), new Player("Serdar Gürler", 13, 8, 14, 27), new Player("Mahmut Tekdemir", 9, 14, 14, 26), new Player("Volkan Babacan", 6, 16, 14, 25)],
"Sivasspor": [new Player("Mustapha Yatabare", 14, 8, 14, 27), new Player("Max Gradel", 13, 8, 14, 27), new Player("Hakan Arslan", 10, 13, 14, 25), new Player("Uğur Çiftçi", 8, 14, 14, 24), new Player("Ali Şaşal Vural", 6, 16, 14, 24)],
"Konyaspor": [new Player("Sokol Cikalleshi", 14, 8, 14, 27), new Player("Amir Hadziahmetovic", 11, 13, 14, 25), new Player("Guilherme", 10, 13, 14, 25), new Player("Francisco Calvo", 8, 15, 14, 25), new Player("Ibrahim Sehic", 6, 16, 14, 24)],
"Antalyaspor": [new Player("Haji Wright", 14, 8, 14, 27), new Player("Fernando", 11, 13, 14, 25), new Player("Bünyamin Balcı", 10, 13, 14, 24), new Player("Veysel Sarı", 8, 15, 14, 24), new Player("Helton Leite", 6, 16, 14, 24)],
"Alanyaspor": [new Player("Efecan Karaca", 14, 8, 14, 27), new Player("Famara Diedhiou", 13, 8, 14, 26), new Player("Yusuf Özdemir", 10, 13, 14, 24), new Player("Fidan Aliti", 8, 15, 14, 24), new Player("Runar Runarsson", 6, 16, 14, 24)],
"Denizlispor": [new Player("Ömer Şişmanoğlu", 13, 8, 14, 25), new Player("Mustafa Yumlu", 8, 15, 14, 24), new Player("Gökhan Süzen", 10, 13, 14, 23), new Player("Oğuz Yılmaz", 8, 14, 14, 23), new Player("Adam Stachowiak", 6, 16, 14, 23)]
};
function makeOpponentTeam() {
// List of realistic Turkish club names
var clubNames = ["Denizlispor", "Sivasspor", "Galatasaray", "Fenerbahce", "Trabzonspor", "Besiktas", "Basaksehir", "Konyaspor", "Antalyaspor", "Alanyaspor"];
// Pick a random club name for the opponent
var clubName = clubNames[randomInt(0, clubNames.length - 1)];
var oppPlayers;
if (realSquads[clubName]) {
// Use real squad, clone to avoid reference issues
oppPlayers = [];
for (var i = 0; i < SQUAD_SIZE; i++) {
var p = realSquads[clubName][i];
oppPlayers.push(clonePlayer(p));
}
} else {
// Fallback to random
oppPlayers = [];
for (var i = 0; i < SQUAD_SIZE; i++) {
oppPlayers.push(makeRandomPlayer());
}
}
return new Team(clubName, oppPlayers);
}
function clonePlayer(p) {
return new Player(p.name, p.attack, p.defense, p.stamina, p.value, p.seasonsRemaining);
}
// --- INIT DATA ---
function initPlayers() {
allPlayers = [];
for (var i = 0; i < SQUAD_SIZE + BENCH_SIZE; i++) {
allPlayers.push(makeRandomPlayer());
}
updateSquadAndBench();
}
function updateSquadAndBench() {
squad = [];
bench = [];
for (var i = 0; i < allPlayers.length; i++) {
if (i < SQUAD_SIZE) {
allPlayers[i].inSquad = true;
squad.push(allPlayers[i]);
} else {
allPlayers[i].inSquad = false;
bench.push(allPlayers[i]);
}
}
}
function initTransferList() {
transferList = [];
// List of latest, highest-valued real-world football players (2024, top market values, demo)
var topPlayers = [new Player("Kylian Mbappé", 20, 12, 19, 180), new Player("Erling Haaland", 21, 10, 18, 170), new Player("Jude Bellingham", 18, 14, 18, 150), new Player("Vinícius Júnior", 19, 12, 18, 150), new Player("Phil Foden", 17, 13, 17, 130), new Player("Bukayo Saka", 17, 12, 17, 120), new Player("Rodri", 14, 18, 17, 120), new Player("Jamal Musiala", 17, 12, 17, 120), new Player("Victor Osimhen", 19, 10, 17, 110), new Player("Florian Wirtz", 16, 12, 17, 110), new Player("Pedri", 15, 13, 17, 100), new Player("Declan Rice", 13, 17, 17, 100), new Player("Harry Kane", 20, 10, 16, 100), new Player("Martin Ødegaard", 16, 13, 16, 100), new Player("Rafael Leão", 18, 10, 16, 90), new Player("Khvicha Kvaratskhelia", 17, 11, 16, 90), new Player("Josko Gvardiol", 10, 18, 16, 90), new Player("Gavi", 14, 14, 16, 90), new Player("Alejandro Balde", 12, 15, 16, 80), new Player("William Saliba", 9, 18, 16, 80)];
// Always show 6 random top players in the transfer market, no duplicates
var usedIdx = [];
for (var i = 0; i < 6; i++) {
var idx;
do {
idx = randomInt(0, topPlayers.length - 1);
} while (usedIdx.indexOf(idx) !== -1);
usedIdx.push(idx);
// When adding to transferList, set seasonsRemaining=3 for transfer market players
var p = topPlayers[idx];
transferList.push(new Player(p.name, p.attack, p.defense, p.stamina, p.value, 3));
}
}
// --- UI HELPERS ---
function clearArray(arr) {
while (arr.length > 0) {
var el = arr.pop();
if (el && el.destroy) {
el.destroy();
}
}
}
function makeLabel(txt, x, y, size, color) {
var t = new Text2(txt, {
size: size || 60,
fill: color || "#fff"
});
t.x = x;
t.y = y;
return t;
}
function updateBudgetText() {
budgetText.setText("Budget: $" + budget + "M");
}
function showInfo(msg) {
infoText.setText(msg);
}
function updateSquadLabels() {
clearArray(squadLabels);
// Add extra margin at the top for squad section
var startY = guiY + 240; // Keep top margin for squad section
var squadX = 80; // left margin
var swapBtnX = squadX + 700; // move swap arrow much closer to name
var sellBtnX = squadX + 800; // move sell button just after swap arrow
var rowSpacing = 50; // reduced for almost zero vertical space between squad texts
for (var i = 0; i < SQUAD_SIZE; i++) {
var p = squad[i];
var seasonsTxt = typeof p.seasonsRemaining === "number" && p.seasonsRemaining !== null ? " (" + p.seasonsRemaining + "s)" : "";
var t = makeLabel(i + 1 + ". " + p.name + " [A:" + p.attack + " D:" + p.defense + " S:" + p.stamina + "]" + seasonsTxt, squadX, startY + i * rowSpacing, 48, "#ffe066");
game.addChild(t);
squadLabels.push(t);
// Add swap button
var btn = makeLabel("↔", swapBtnX, t.y, 48, "#fff");
btn.idx = i;
btn.interactive = true;
btn.down = function (x, y, obj) {
selectedPlayerIdx = obj.idx;
if (selectedPlayerIdx !== null && squad[selectedPlayerIdx]) {
showInfo("Tap a bench player to swap with " + squad[selectedPlayerIdx].name);
} else {
showInfo("Tap a bench player to swap.");
}
};
game.addChild(btn);
swapBtns.push(btn);
// Add sell button
var sellBtn = makeLabel("Sell", sellBtnX, t.y, 40, "#ff7675");
sellBtn.idx = i;
sellBtn.interactive = true;
sellBtn.down = function (idxCopy) {
return function (x, y, obj) {
var idx = idxCopy;
var p = squad[idx];
if (!p) {
showInfo("Player not available.");
return;
}
// Find the player in allPlayers by reference, not by index
var allIdx = allPlayers.indexOf(p);
if (allIdx !== -1) {
budget += p.value;
allPlayers.splice(allIdx, 1);
updateSquadAndBench();
updateBudgetText();
showInfo("Sold " + p.name + " for $" + p.value + "M");
refreshUI();
} else {
showInfo("Player not found in squad.");
}
};
}(i);
game.addChild(sellBtn);
sellBtns.push(sellBtn);
}
}
function updateBenchLabels() {
clearArray(benchLabels);
// Add extra margin at the top for bench section
var startY = guiY + 240; // Increased for more top margin
var benchX = 1550; // moved further right for more space from squad
var rowSpacing = 48; // reduced for almost zero vertical space between bench texts
for (var i = 0; i < BENCH_SIZE; i++) {
var p = bench[i];
if (!p) {
continue;
}
var seasonsTxt = typeof p.seasonsRemaining === "number" && p.seasonsRemaining !== null ? " (" + p.seasonsRemaining + "s)" : "";
var t = makeLabel("B" + (i + 1) + ". " + p.name + " [A:" + p.attack + " D:" + p.defense + " S:" + p.stamina + "]" + seasonsTxt, benchX, startY + i * rowSpacing, 48, "#b2bec3");
game.addChild(t);
benchLabels.push(t);
// Add swap handler
t.idx = i;
t.interactive = true;
t.down = function (x, y, obj) {
if (selectedPlayerIdx !== null) {
// Swap squad[selectedPlayerIdx] with bench[obj.idx]
var sIdx = selectedPlayerIdx;
var bIdx = obj.idx;
var temp = squad[sIdx];
squad[sIdx] = bench[bIdx];
bench[bIdx] = temp;
// Update allPlayers order
for (var j = 0; j < SQUAD_SIZE; j++) {
allPlayers[j] = squad[j];
}
for (var j = 0; j < BENCH_SIZE; j++) {
allPlayers[SQUAD_SIZE + j] = bench[j];
}
selectedPlayerIdx = null;
showInfo("Swapped players.");
refreshUI();
}
};
}
}
function updateTransferLabels() {
clearArray(transferBtns);
clearArray(buyBtns);
// Position transfer section directly above the opponent team display (bottom-left)
var sectionWidth = 900;
var sectionX = 80; // Align with opponent section (left margin)
var sectionHeight = (transferList.length + 1) * 140 + 120; // Height of transfer section, increased row height and extra margin
// Calculate opponent section Y
var oppStartY = 2048 - (SQUAD_SIZE + 2) * 120 - 200; // increased row height and more margin for opponent section
if (oppStartY < guiY + 1800) {
oppStartY = guiY + 1800;
} // push down if needed for more space
// Place transfer section just above opponent section
var startY = oppStartY - sectionHeight - 120; // 120px gap above opponent section
if (startY < guiY + 600) {
startY = guiY + 600;
} // avoid top overlap, more margin
if (transferText) {
transferText.destroy();
}
transferText = makeLabel("Transfer Market", sectionX, startY - 90, 56, "#00b894");
game.addChild(transferText);
for (var i = 0; i < transferList.length; i++) {
var p = transferList[i];
// Remove seasonsTxt for transfer market display
var t = makeLabel(p.name + " [A:" + p.attack + " D:" + p.defense + " S:" + p.stamina + "] $" + p.value + "M", sectionX, startY + i * 48, 44, "#fff");
game.addChild(t);
transferBtns.push(t);
// Buy button
var buyBtn = makeLabel("Buy", sectionX + 750, t.y, 40, "#00b894"); // moved right for more space
buyBtn.idx = i;
buyBtn.interactive = true;
buyBtn.down = function (idxCopy) {
return function (x, y, obj) {
var idx = idxCopy;
var p = transferList[idx];
if (!p) {
showInfo("Player not available.");
return;
}
if (budget < p.value) {
showInfo("Not enough budget!");
return;
}
if (allPlayers.length >= SQUAD_SIZE + BENCH_SIZE) {
showInfo("Squad full! Sell a player first.");
return;
}
budget -= p.value;
// When buying, always set seasonsRemaining=3
allPlayers.push(new Player(p.name, p.attack, p.defense, p.stamina, p.value, 3));
updateSquadAndBench();
updateBudgetText();
showInfo("Bought " + p.name + " for $" + p.value + "M");
// Remove from transfer list, add new
transferList.splice(idx, 1, makeRandomPlayer());
refreshUI();
};
}(i);
game.addChild(buyBtn);
buyBtns.push(buyBtn);
}
}
function updateOpponentLabels() {
clearArray(opponentLabels);
// Position opponent section at bottom-left (for reference, but now only for opponent info)
var oppStartY = 2048 - (SQUAD_SIZE + 2) * 120 - 200; // increased row height and more margin for opponent section
if (oppStartY < guiY + 1800) {
oppStartY = guiY + 1800;
} // push down if needed for more space
var t = makeLabel("Next Opponent: " + opponentTeam.name, 80, oppStartY, 56, "#fab1a0");
game.addChild(t);
opponentLabels.push(t);
for (var i = 0; i < SQUAD_SIZE; i++) {
var p = opponentTeam.players[i];
var pt = makeLabel(i + 1 + ". " + p.name + " [A:" + p.attack + " D:" + p.defense + " S:" + p.stamina + "]", 80, oppStartY + 120 + i * 120, 40, "#fff");
game.addChild(pt);
opponentLabels.push(pt);
}
// --- League Table: show all teams, slightly larger, and moved a little to the left ---
var leagueWidth = 600; // slightly larger
var leagueX = 2048 - leagueWidth - 260; // move further left (80px more)
var leagueY = 2048 * 0.60; // between center and bottom (60% down the screen)
var leagueHeader = makeLabel("League Table", leagueX, leagueY, 54, "#fdcb6e"); // slightly larger font
game.addChild(leagueHeader);
opponentLabels.push(leagueHeader);
// Sort league by points, then goal difference, then goals for
var sortedLeague = leagueTeams.slice().sort(function (a, b) {
if (b.points !== a.points) {
return b.points - a.points;
}
var gdA = a.goalsFor - a.goalsAgainst;
var gdB = b.goalsFor - b.goalsAgainst;
if (gdB !== gdA) {
return gdB - gdA;
}
return b.goalsFor - a.goalsFor;
});
for (var i = 0; i < sortedLeague.length; i++) {
var team = sortedLeague[i];
var color = team.name === "You" ? "#00cec9" : "#fff";
var labelTxt = i + 1 + ". " + team.name + " Pts:" + team.points + " GP:" + team.played + " W:" + team.wins + " D:" + team.draws + " L:" + team.losses;
var teamLabel = makeLabel(labelTxt, leagueX, leagueY + 70 + i * 48, 38, color); // slightly larger font and spacing
game.addChild(teamLabel);
opponentLabels.push(teamLabel);
}
}
function clearMatchText() {
if (matchText) {
matchText.destroy();
matchText = null;
}
}
function showMatchLog() {
clearMatchText();
var log = matchLog.join("\n");
matchText = new Text2(log, {
size: 48,
fill: "#fff",
wordWrap: true,
wordWrapWidth: 1800
});
// Position match summary directly underneath the Play Match button
var playBtnX = 2048 / 2 - 200; // Same as playBtn X
var playBtnY = 2048 - 200; // Same as playBtn Y
matchText.x = playBtnX;
matchText.y = playBtnY + 180; // 180px below Play Match button for extra separation
game.addChild(matchText);
}
function clearAllUI() {
clearArray(squadLabels);
clearArray(benchLabels);
clearArray(transferBtns);
clearArray(buyBtns);
clearArray(swapBtns);
clearArray(sellBtns);
clearArray(opponentLabels);
if (transferText) {
transferText.destroy();
}
transferText = null;
clearMatchText();
if (playBtn) {
playBtn.destroy();
}
playBtn = null;
if (nextBtn) {
nextBtn.destroy();
}
nextBtn = null;
}
// --- LEAGUE SYSTEM ---
// League teams: user + 10 Turkish clubs
var leagueClubNames = ["Denizlispor", "Sivasspor", "Galatasaray", "Fenerbahce", "Trabzonspor", "Besiktas", "Basaksehir", "Konyaspor", "Antalyaspor", "Alanyaspor"];
var leagueTeams = []; // [{name, points, played, wins, draws, losses, goalsFor, goalsAgainst}]
var leagueFixtures = []; // [{homeIdx, awayIdx}]
var currentFixtureIdx = 0;
var userTeamIdx = 0; // always 0
function initLeague() {
leagueTeams = [];
// User team
leagueTeams.push({
name: "You",
points: 0,
played: 0,
wins: 0,
draws: 0,
losses: 0,
goalsFor: 0,
goalsAgainst: 0
});
// Opponent clubs
for (var i = 0; i < leagueClubNames.length; i++) {
var clubName = leagueClubNames[i];
leagueTeams.push({
name: clubName,
points: 0,
played: 0,
wins: 0,
draws: 0,
losses: 0,
goalsFor: 0,
goalsAgainst: 0,
// Attach real squad if available for league simulation
realSquad: realSquads[clubName] ? realSquads[clubName].map(function (p) {
return clonePlayer(p);
}) : null
});
}
// Generate fixtures: each team plays every other team twice (home/away)
leagueFixtures = [];
var n = leagueTeams.length;
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
if (i !== j) {
// Only add each pair twice (home/away)
if (i < j) {
leagueFixtures.push({
homeIdx: i,
awayIdx: j
});
leagueFixtures.push({
homeIdx: j,
awayIdx: i
});
}
}
}
}
// Shuffle fixtures for variety
for (var k = leagueFixtures.length - 1; k > 0; k--) {
var r = randomInt(0, k);
var temp = leagueFixtures[k];
leagueFixtures[k] = leagueFixtures[r];
leagueFixtures[r] = temp;
}
currentFixtureIdx = 0;
}
function getCurrentOpponentIdx() {
// Find the next fixture where user is home or away
for (var i = currentFixtureIdx; i < leagueFixtures.length; i++) {
var f = leagueFixtures[i];
if (f.homeIdx === userTeamIdx || f.awayIdx === userTeamIdx) {
return f.homeIdx === userTeamIdx ? f.awayIdx : f.homeIdx;
}
}
return null;
}
function getCurrentFixture() {
for (var i = currentFixtureIdx; i < leagueFixtures.length; i++) {
var f = leagueFixtures[i];
if (f.homeIdx === userTeamIdx || f.awayIdx === userTeamIdx) {
return {
idx: i,
fixture: f
};
}
}
return null;
}
function advanceFixture() {
// Move to next user fixture
for (var i = currentFixtureIdx + 1; i < leagueFixtures.length; i++) {
var f = leagueFixtures[i];
if (f.homeIdx === userTeamIdx || f.awayIdx === userTeamIdx) {
currentFixtureIdx = i;
return;
}
}
// No more fixtures: season over
currentFixtureIdx = leagueFixtures.length;
}
function isSeasonOver() {
// If all user fixtures played
for (var i = currentFixtureIdx; i < leagueFixtures.length; i++) {
var f = leagueFixtures[i];
if (f.homeIdx === userTeamIdx || f.awayIdx === userTeamIdx) {
return false;
}
}
return true;
}
// --- GAME LOGIC ---
function simulateMatch() {
matchLog = [];
matchResult = null;
matchInProgress = true;
// Find all fixtures for this matchday (all teams play one match)
if (currentFixtureIdx >= leagueFixtures.length) {
matchLog.push("Season is over!");
showMatchLog();
matchInProgress = false;
return;
}
// Gather all fixtures for this matchday (each team plays once)
var nTeams = leagueTeams.length;
var matchdayFixtures = [];
var teamsPlayed = {};
for (var i = currentFixtureIdx; i < leagueFixtures.length; i++) {
var f = leagueFixtures[i];
if (!teamsPlayed[f.homeIdx] && !teamsPlayed[f.awayIdx]) {
matchdayFixtures.push({
idx: i,
fixture: f
});
teamsPlayed[f.homeIdx] = true;
teamsPlayed[f.awayIdx] = true;
if (Object.keys(teamsPlayed).length >= nTeams) {
break;
}
}
}
// Simulate all matches in this matchday
var userMatchIdx = -1;
for (var m = 0; m < matchdayFixtures.length; m++) {
var fixtureObj = matchdayFixtures[m];
var fixture = fixtureObj.fixture;
var homeIdx = fixture.homeIdx;
var awayIdx = fixture.awayIdx;
var homeTeam = leagueTeams[homeIdx];
var awayTeam = leagueTeams[awayIdx];
// Prepare teams
var homePlayers, awayPlayers;
if (homeIdx === userTeamIdx) {
homePlayers = squad;
} else {
// Use real squad if available, else generate random team
if (homeTeam.realSquad) {
homePlayers = [];
for (var i = 0; i < SQUAD_SIZE; i++) {
homePlayers.push(clonePlayer(homeTeam.realSquad[i]));
}
} else {
homePlayers = [];
for (var i = 0; i < SQUAD_SIZE; i++) {
homePlayers.push(makeRandomPlayer());
}
}
}
if (awayIdx === userTeamIdx) {
awayPlayers = squad;
} else {
if (awayTeam.realSquad) {
awayPlayers = [];
for (var i = 0; i < SQUAD_SIZE; i++) {
awayPlayers.push(clonePlayer(awayTeam.realSquad[i]));
}
} else {
awayPlayers = [];
for (var i = 0; i < SQUAD_SIZE; i++) {
awayPlayers.push(makeRandomPlayer());
}
}
}
// Calculate stats
var homeGoals = 0,
awayGoals = 0;
for (var turn = 0; turn < 5; turn++) {
// Home attack
var atkP = homePlayers[turn];
var defP = awayPlayers[turn];
var atkChance = atkP.attack + randomInt(0, atkP.stamina);
var defChance = defP.defense + randomInt(0, defP.stamina);
if (atkChance > defChance + 3) {
homeGoals++;
}
// Away attack
var oAtkP = awayPlayers[turn];
var oDefP = homePlayers[turn];
var oAtkChance = oAtkP.attack + randomInt(0, oAtkP.stamina);
var oDefChance = oDefP.defense + randomInt(0, oDefP.stamina);
if (oAtkChance > oDefChance + 3) {
awayGoals++;
}
}
// Update league table
homeTeam.played += 1;
awayTeam.played += 1;
homeTeam.goalsFor += homeGoals;
homeTeam.goalsAgainst += awayGoals;
awayTeam.goalsFor += awayGoals;
awayTeam.goalsAgainst += homeGoals;
if (homeGoals > awayGoals) {
homeTeam.points += 3;
homeTeam.wins += 1;
awayTeam.losses += 1;
} else if (homeGoals < awayGoals) {
awayTeam.points += 3;
awayTeam.wins += 1;
homeTeam.losses += 1;
} else {
homeTeam.points += 1;
awayTeam.points += 1;
homeTeam.draws += 1;
awayTeam.draws += 1;
}
// If this is the user's match, log details and handle rewards
if (homeIdx === userTeamIdx || awayIdx === userTeamIdx) {
userMatchIdx = m;
var userGoals = homeIdx === userTeamIdx ? homeGoals : awayGoals;
var oppGoals = homeIdx === userTeamIdx ? awayGoals : homeGoals;
var oppIdx = homeIdx === userTeamIdx ? awayIdx : homeIdx;
var oppName = leagueTeams[oppIdx].name;
for (var turn = 0; turn < 5; turn++) {
// User attack
var atkP = squad[turn];
var defP = homeIdx === userTeamIdx ? awayPlayers[turn] : homePlayers[turn];
var atkChance = atkP.attack + randomInt(0, atkP.stamina);
var defChance = defP.defense + randomInt(0, defP.stamina);
if (atkChance > defChance + 3) {
matchLog.push("Minute " + (turn * 18 + 5) + ": " + atkP.name + " scores!");
} else if (defChance > atkChance + 5) {
matchLog.push("Minute " + (turn * 18 + 8) + ": " + defP.name + " makes a key tackle.");
}
// Opponent attack
var oAtkP = homeIdx === userTeamIdx ? awayPlayers[turn] : homePlayers[turn];
var oDefP = squad[turn];
var oAtkChance = oAtkP.attack + randomInt(0, oAtkP.stamina);
var oDefChance = oDefP.defense + randomInt(0, oDefP.stamina);
if (oAtkChance > oDefChance + 3) {
matchLog.push("Minute " + (turn * 18 + 12) + ": " + oAtkP.name + " scores!");
} else if (oDefChance > oAtkChance + 5) {
matchLog.push("Minute " + (turn * 18 + 15) + ": " + oDefP.name + " blocks a shot.");
}
}
matchLog.push("Full Time: You " + userGoals + " - " + oppGoals + " " + oppName);
// Rewards
if (userGoals > oppGoals) {
matchResult = "win";
matchLog.push("You win! +$20M");
budget += 20;
} else if (userGoals < oppGoals) {
matchResult = "lose";
matchLog.push("You lose.");
} else {
matchResult = "draw";
matchLog.push("Draw. +$5M");
budget += 5;
}
}
}
// Advance fixture pointer by number of fixtures played this matchday
currentFixtureIdx += matchdayFixtures.length;
updateBudgetText();
showMatchLog();
matchInProgress = false;
}
function refreshUI() {
clearAllUI();
// Add extra vertical space between all sections by adjusting guiY and section Y positions
// Squad section
updateSquadLabels();
// Bench section (move further down)
guiY = 0; // reset
updateBenchLabels();
// Transfer section (move further down)
updateTransferLabels();
// Opponent and league table section (move further down)
updateOpponentLabels();
updateBudgetText();
showInfo("Pick lineup, buy/sell, then Play Match!");
// Play match button (bottom middle, with extra margin from all sections)
var playBtnX = 2048 / 2 - 200; // Centered horizontally, adjust for button width
var playBtnY = 2048 - 200; // 200px from bottom
playBtn = makeLabel("Play Match", playBtnX, playBtnY, 70, "#00cec9");
playBtn.interactive = true;
playBtn.down = function (x, y, obj) {
if (matchInProgress) {
return;
}
simulateMatch();
playBtn.destroy();
playBtn = null;
// Next match button (bottom middle, below Play Match)
var nextBtnX = 2048 / 2 - 200;
var nextBtnY = playBtnY + 120;
nextBtn = makeLabel("Next Match", nextBtnX, nextBtnY, 60, "#fdcb6e");
nextBtn.interactive = true;
nextBtn.down = function (x, y, obj) {
// Restore stamina a bit
for (var i = 0; i < allPlayers.length; i++) {
allPlayers[i].stamina = Math.min(allPlayers[i].maxStamina, allPlayers[i].stamina + randomInt(1, 3));
}
// Check if season is over
if (isSeasonOver()) {
// Calculate final league position for user
var sortedLeague = leagueTeams.slice().sort(function (a, b) {
if (b.points !== a.points) {
return b.points - a.points;
}
var gdA = a.goalsFor - a.goalsAgainst;
var gdB = b.goalsFor - b.goalsAgainst;
if (gdB !== gdA) {
return gdB - gdA;
}
return b.goalsFor - a.goalsFor;
});
var userFinalPos = 1;
for (var i = 0; i < sortedLeague.length; i++) {
if (sortedLeague[i].name === "You") {
userFinalPos = i + 1;
break;
}
}
// Prize money by position
var prize = 5;
if (userFinalPos === 1) {
prize = 50;
} else if (userFinalPos === 2) {
prize = 30;
} else if (userFinalPos === 3) {
prize = 20;
} else if (userFinalPos === 4) {
prize = 10;
}
// Award prize
budget += prize;
showInfo("Season finished! You placed #" + userFinalPos + ". Prize: $" + prize + "M. Table resets for new season.");
updateBudgetText();
// Decrement seasonsRemaining for transfer market players, remove those at 0
for (var i = allPlayers.length - 1; i >= 0; i--) {
var p = allPlayers[i];
if (typeof p.seasonsRemaining === "number" && p.seasonsRemaining !== null) {
p.seasonsRemaining--;
if (p.seasonsRemaining <= 0) {
allPlayers.splice(i, 1);
showInfo("Player " + p.name + " has retired/left after 3 seasons.");
}
}
}
updateSquadAndBench();
// Reset league and start new season
initLeague();
// Reset user budget, players, etc.
// (Do not reset budget here, keep prize money)
initPlayers();
initTransferList();
// Set first opponent
var oppIdx = getCurrentOpponentIdx();
if (oppIdx !== null) {
// Generate new opponent team for this club
opponentTeam = makeOpponentTeam();
opponentTeam.name = leagueTeams[oppIdx].name;
}
clearMatchText();
nextBtn.destroy();
nextBtn = null;
refreshUI();
return;
}
// Next opponent in league
var oppIdx = getCurrentOpponentIdx();
if (oppIdx !== null) {
opponentTeam = makeOpponentTeam();
opponentTeam.name = leagueTeams[oppIdx].name;
}
clearMatchText();
nextBtn.destroy();
nextBtn = null;
refreshUI();
};
game.addChild(nextBtn);
};
game.addChild(playBtn);
}
// --- INIT UI ---
function initUI() {
guiY = 0;
// Title
var title = new Text2("Mini Football Manager", {
size: 90,
fill: 0x00CEC9
});
title.x = 80;
title.y = guiY + 40;
game.addChild(title);
// Budget
budgetText = new Text2("Budget: $" + budget + "M", {
size: 60,
fill: "#fff"
});
budgetText.x = 80;
budgetText.y = guiY + 120;
game.addChild(budgetText);
// Info
infoText = new Text2("", {
size: 54,
fill: 0xFDCB6E
});
infoText.x = 600;
infoText.y = guiY + 120;
game.addChild(infoText);
refreshUI();
}
// --- GAME START ---
function newGame() {
budget = INITIAL_BUDGET;
initLeague();
initPlayers();
initTransferList();
// Set first opponent in league
var oppIdx = getCurrentOpponentIdx();
if (oppIdx !== null) {
opponentTeam = makeOpponentTeam();
opponentTeam.name = leagueTeams[oppIdx].name;
} else {
opponentTeam = makeOpponentTeam();
}
matchInProgress = false;
matchLog = [];
matchResult = null;
selectedPlayerIdx = null;
selectedBenchIdx = null;
initUI();
}
newGame();
// --- END --- ===================================================================
--- original.js
+++ change.js
@@ -70,9 +70,9 @@
function randomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function randomName() {
- var first = ["Ahmet", "Mehmet", "Mustafa", "Ali", "Hüseyin", "Hasan", "İbrahim", "Osman", "Yusuf", "Murat", "Emre", "Burak", "Fatih", "Serkan", "Onur", "Barış", "Cem", "Eren", "Kaan", "Deniz"];
+ var first = ["Ahmet", "Mehmet", "Mustafa", "Ali", "Hüseyin", "Hasan", "Cesur", "Osman", "Yusuf", "Murat", "Emre", "Burak", "Fatih", "Serkan", "Onur", "Barış", "Cem", "Eren", "Kaan", "Deniz"];
var last = ["Yılmaz", "Kaya", "Demir", "Şahin", "Çelik", "Yıldız", "Yıldırım", "Aydın", "Öztürk", "Arslan", "Doğan", "Kılıç", "Aslan", "Polat", "Koç", "Kurt", "Özdemir", "Aksoy", "Güneş", "Bozkurt"];
return first[randomInt(0, first.length - 1)] + " " + last[randomInt(0, last.length - 1)];
}
function makeRandomPlayer() {
@@ -161,9 +161,11 @@
// --- UI HELPERS ---
function clearArray(arr) {
while (arr.length > 0) {
var el = arr.pop();
- if (el && el.destroy) el.destroy();
+ if (el && el.destroy) {
+ el.destroy();
+ }
}
}
function makeLabel(txt, x, y, size, color) {
var t = new Text2(txt, {
@@ -245,9 +247,11 @@
var benchX = 1550; // moved further right for more space from squad
var rowSpacing = 48; // reduced for almost zero vertical space between bench texts
for (var i = 0; i < BENCH_SIZE; i++) {
var p = bench[i];
- if (!p) continue;
+ if (!p) {
+ continue;
+ }
var seasonsTxt = typeof p.seasonsRemaining === "number" && p.seasonsRemaining !== null ? " (" + p.seasonsRemaining + "s)" : "";
var t = makeLabel("B" + (i + 1) + ". " + p.name + " [A:" + p.attack + " D:" + p.defense + " S:" + p.stamina + "]" + seasonsTxt, benchX, startY + i * rowSpacing, 48, "#b2bec3");
game.addChild(t);
benchLabels.push(t);
@@ -262,10 +266,14 @@
var temp = squad[sIdx];
squad[sIdx] = bench[bIdx];
bench[bIdx] = temp;
// Update allPlayers order
- for (var j = 0; j < SQUAD_SIZE; j++) allPlayers[j] = squad[j];
- for (var j = 0; j < BENCH_SIZE; j++) allPlayers[SQUAD_SIZE + j] = bench[j];
+ for (var j = 0; j < SQUAD_SIZE; j++) {
+ allPlayers[j] = squad[j];
+ }
+ for (var j = 0; j < BENCH_SIZE; j++) {
+ allPlayers[SQUAD_SIZE + j] = bench[j];
+ }
selectedPlayerIdx = null;
showInfo("Swapped players.");
refreshUI();
}
@@ -280,13 +288,19 @@
var sectionX = 80; // Align with opponent section (left margin)
var sectionHeight = (transferList.length + 1) * 140 + 120; // Height of transfer section, increased row height and extra margin
// Calculate opponent section Y
var oppStartY = 2048 - (SQUAD_SIZE + 2) * 120 - 200; // increased row height and more margin for opponent section
- if (oppStartY < guiY + 1800) oppStartY = guiY + 1800; // push down if needed for more space
+ if (oppStartY < guiY + 1800) {
+ oppStartY = guiY + 1800;
+ } // push down if needed for more space
// Place transfer section just above opponent section
var startY = oppStartY - sectionHeight - 120; // 120px gap above opponent section
- if (startY < guiY + 600) startY = guiY + 600; // avoid top overlap, more margin
- if (transferText) transferText.destroy();
+ if (startY < guiY + 600) {
+ startY = guiY + 600;
+ } // avoid top overlap, more margin
+ if (transferText) {
+ transferText.destroy();
+ }
transferText = makeLabel("Transfer Market", sectionX, startY - 90, 56, "#00b894");
game.addChild(transferText);
for (var i = 0; i < transferList.length; i++) {
var p = transferList[i];
@@ -332,9 +346,11 @@
function updateOpponentLabels() {
clearArray(opponentLabels);
// Position opponent section at bottom-left (for reference, but now only for opponent info)
var oppStartY = 2048 - (SQUAD_SIZE + 2) * 120 - 200; // increased row height and more margin for opponent section
- if (oppStartY < guiY + 1800) oppStartY = guiY + 1800; // push down if needed for more space
+ if (oppStartY < guiY + 1800) {
+ oppStartY = guiY + 1800;
+ } // push down if needed for more space
var t = makeLabel("Next Opponent: " + opponentTeam.name, 80, oppStartY, 56, "#fab1a0");
game.addChild(t);
opponentLabels.push(t);
for (var i = 0; i < SQUAD_SIZE; i++) {
@@ -351,12 +367,16 @@
game.addChild(leagueHeader);
opponentLabels.push(leagueHeader);
// Sort league by points, then goal difference, then goals for
var sortedLeague = leagueTeams.slice().sort(function (a, b) {
- if (b.points !== a.points) return b.points - a.points;
+ if (b.points !== a.points) {
+ return b.points - a.points;
+ }
var gdA = a.goalsFor - a.goalsAgainst;
var gdB = b.goalsFor - b.goalsAgainst;
- if (gdB !== gdA) return gdB - gdA;
+ if (gdB !== gdA) {
+ return gdB - gdA;
+ }
return b.goalsFor - a.goalsFor;
});
for (var i = 0; i < sortedLeague.length; i++) {
var team = sortedLeague[i];
@@ -396,14 +416,20 @@
clearArray(buyBtns);
clearArray(swapBtns);
clearArray(sellBtns);
clearArray(opponentLabels);
- if (transferText) transferText.destroy();
+ if (transferText) {
+ transferText.destroy();
+ }
transferText = null;
clearMatchText();
- if (playBtn) playBtn.destroy();
+ if (playBtn) {
+ playBtn.destroy();
+ }
playBtn = null;
- if (nextBtn) nextBtn.destroy();
+ if (nextBtn) {
+ nextBtn.destroy();
+ }
nextBtn = null;
}
// --- LEAGUE SYSTEM ---
// League teams: user + 10 Turkish clubs
@@ -540,9 +566,11 @@
fixture: f
});
teamsPlayed[f.homeIdx] = true;
teamsPlayed[f.awayIdx] = true;
- if (Object.keys(teamsPlayed).length >= nTeams) break;
+ if (Object.keys(teamsPlayed).length >= nTeams) {
+ break;
+ }
}
}
// Simulate all matches in this matchday
var userMatchIdx = -1;
@@ -698,9 +726,11 @@
var playBtnY = 2048 - 200; // 200px from bottom
playBtn = makeLabel("Play Match", playBtnX, playBtnY, 70, "#00cec9");
playBtn.interactive = true;
playBtn.down = function (x, y, obj) {
- if (matchInProgress) return;
+ if (matchInProgress) {
+ return;
+ }
simulateMatch();
playBtn.destroy();
playBtn = null;
// Next match button (bottom middle, below Play Match)
@@ -716,12 +746,16 @@
// Check if season is over
if (isSeasonOver()) {
// Calculate final league position for user
var sortedLeague = leagueTeams.slice().sort(function (a, b) {
- if (b.points !== a.points) return b.points - a.points;
+ if (b.points !== a.points) {
+ return b.points - a.points;
+ }
var gdA = a.goalsFor - a.goalsAgainst;
var gdB = b.goalsFor - b.goalsAgainst;
- if (gdB !== gdA) return gdB - gdA;
+ if (gdB !== gdA) {
+ return gdB - gdA;
+ }
return b.goalsFor - a.goalsFor;
});
var userFinalPos = 1;
for (var i = 0; i < sortedLeague.length; i++) {
@@ -731,9 +765,17 @@
}
}
// Prize money by position
var prize = 5;
- if (userFinalPos === 1) prize = 50;else if (userFinalPos === 2) prize = 30;else if (userFinalPos === 3) prize = 20;else if (userFinalPos === 4) prize = 10;
+ if (userFinalPos === 1) {
+ prize = 50;
+ } else if (userFinalPos === 2) {
+ prize = 30;
+ } else if (userFinalPos === 3) {
+ prize = 20;
+ } else if (userFinalPos === 4) {
+ prize = 10;
+ }
// Award prize
budget += prize;
showInfo("Season finished! You placed #" + userFinalPos + ". Prize: $" + prize + "M. Table resets for new season.");
updateBudgetText();