User prompt
Platform Seç butonu altına, oyun adı seç butonu ve sayfasını oluştur.
User prompt
Yeni proje yaparken her sayfadan 1 tane seçim hakkımız olsun.
User prompt
Platform Seç butonunu en alt da bulunan butonun altına taşı.
User prompt
Bunu düzelt. Sadece yeni oyun çıkarınca değişsin.
User prompt
New Project sayfasına girip çıkınca yukarıda ki kırmızı trend yazısı değişiyor ve üst üste gelmiş oluyor. Onu düzelt. Yeni oyun yapıp bitene kadar trend değişmesin.
User prompt
New Project sayfasına girip çıkınca bazı butonlar kayboluyor. Onu düzelt. Kaybolmasın.
User prompt
Bu yazıyı, Start Project içinde bulunan, platform Seç sayfasının içine yapıştır.
User prompt
Bu yazıyı, platform Seç sayfasının içine taşı.
User prompt
Start Project içinde bulunan paneller sayfasının altına, "Platform kullanmak için ana menüde bulunan platform sayfasından satın alınız." yazısı ekle.
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'PC')' in or related to this line: 'var platState = gameState.platforms[plat.name];' Line Number: 2694
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'PC')' in or related to this line: 'var platState = gameState.platforms[plat.name];' Line Number: 2674
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'PC')' in or related to this line: 'var platState = gameState.platforms[plat.name];' Line Number: 2671
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'PC')' in or related to this line: 'var platState = gameState.platforms[plat.name];' Line Number: 2661
User prompt
Platform Seç açılır pencere değil de, butona tıklayınca sayfaya girsin. Orada görünsün satın alınmış platformlar.
User prompt
Satın alınan, kullanılabilir platformlar sayfada görünmüyor.
User prompt
Platform Seç açılır pencere değil de, butona tıklayınca sayfaya girsin. Orada görünsün satın alınmış platformlar.
User prompt
Start Project içinde ki butonları 2 satır aşağı indir ve yeniden hizala.
User prompt
4000 ve katları olsun fiyatlar.
User prompt
Baştan başla bütün fiyatları. 2000-3000-4000 şeklinde arttır.
User prompt
Satın al fiyatları 2000 ve üzeri olsun.
User prompt
Platform fiyatları 2000 ve katları olsun.
User prompt
Aynı boyutta, 4lü sıra halinde yeniden yerleştir.
User prompt
Platform sayfasını, platform çıkış yılına göre sırala. Her platform %2 daha fazla satış oranı sağlasın. Ayrıca 17 tane yeni platform ekle. Platform sistemine uyumlu olsun.
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'PlayStation')' in or related to this line: 'if (gameState.platforms[plat.name] && gameState.platforms[plat.name].owned) {' Line Number: 2586
User prompt
Please fix the bug: 'Uncaught ReferenceError: platforms is not defined' in or related to this line: 'for (var i = 0; i < platforms.length; i++) {' Line Number: 2484
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Button = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('button', { anchorX: 0.5, anchorY: 0.5 }); var label = new Text2('Button', { size: 40, fill: 0xFFFFFF }); label.anchor.set(0.5, 0.5); self.addChild(label); self.setLabel = function (text) { label.setText(text); }; self.down = function () { tween(bg, { scaleX: 0.95, scaleY: 0.95 }, { duration: 100 }); LK.getSound('select').play(); }; self.up = function () { tween(bg, { scaleX: 1, scaleY: 1 }, { duration: 100 }); if (self.onClick) { self.onClick(); } }; return self; }); var DeveloperCard = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('card', { anchorX: 0.5, anchorY: 0.5 }); var icon = self.attachAsset('developerIcon', { anchorX: 0.5, anchorY: 0.5, y: -100 }); var nameText = new Text2('Developer', { size: 30, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0.5); nameText.y = -20; self.addChild(nameText); var specialtyText = new Text2('Graphics', { size: 25, fill: 0xFFC107 }); specialtyText.anchor.set(0.5, 0.5); specialtyText.y = 20; self.addChild(specialtyText); var costText = new Text2('Cost: $100', { size: 25, fill: 0x4CAF50 }); costText.anchor.set(0.5, 0.5); costText.y = 60; self.addChild(costText); var skillText = new Text2('Skill: 5', { size: 25, fill: 0x2196F3 }); skillText.anchor.set(0.5, 0.5); skillText.y = 100; self.addChild(skillText); self.developerData = null; self.setDeveloper = function (data) { self.developerData = data; nameText.setText(data.name); specialtyText.setText(data.specialty); costText.setText('Cost: $' + data.cost); skillText.setText('Skill: ' + data.skill); var specialtyColors = { 'Graphics': 0xff5722, 'Sound': 0x9c27b0, 'Gameplay': 0x2196f3 }; icon.tint = specialtyColors[data.specialty] || 0xffc107; }; self.down = function () { if (self.onClick) { self.onClick(self.developerData); } }; return self; }); var FeatureCard = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('card', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8 }); var icon = self.attachAsset('featureIcon', { anchorX: 0.5, anchorY: 0.5, y: -80 }); var nameText = new Text2('Feature', { size: 25, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0.5); nameText.y = -20; self.addChild(nameText); var typeText = new Text2('Type', { size: 20, fill: 0x2196F3 }); typeText.anchor.set(0.5, 0.5); typeText.y = 10; self.addChild(typeText); var pointsText = new Text2('Points: 0', { size: 20, fill: 0x4CAF50 }); pointsText.anchor.set(0.5, 0.5); pointsText.y = 40; self.addChild(pointsText); self.featureData = null; self.selected = false; self.setFeature = function (data) { self.featureData = data; nameText.setText(data.name); typeText.setText(data.type); pointsText.setText('Points: ' + data.basePoints + ' | Cost: $' + data.cost); var typeColors = { 'Graphics': 0xff5722, 'Sound': 0x9c27b0, 'Gameplay': 0x2196f3 }; icon.tint = typeColors[data.type] || 0xffc107; }; self.setSelected = function (selected) { self.selected = selected; bg.tint = selected ? 0xe94560 : 0xffffff; }; self.down = function () { if (self.onClick) { self.onClick(self); } }; return self; }); var GameHistoryCard = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('card', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 0.6 }); var nameText = new Text2('Game Name', { size: 30, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0.5); nameText.y = -30; self.addChild(nameText); var salesText = new Text2('Sales: 0', { size: 25, fill: 0x4CAF50 }); salesText.anchor.set(0.5, 0.5); salesText.y = 10; self.addChild(salesText); self.gameData = null; self.setGameData = function (data) { self.gameData = data; nameText.setText(data.name); var salesInfo = data.currentDailySales > 0 ? 'Sales: ' + data.totalSales + ' (Active)' : 'Sales: ' + data.totalSales + ' (Ended)'; salesText.setText(salesInfo); bg.tint = data.currentDailySales > 0 ? 0x0f3460 : 0x16213e; }; self.down = function () { if (self.onClick) { self.onClick(self.gameData); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a2e }); /**** * Game Code ****/ // Game state function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var gameState = { money: 10000, developers: [], currentProject: null, completedGames: 0, marketTrends: [], currentDay: 1, releasedGames: [], maxHireableDevelopers: 1, studioLevel: 1, studioUpgradeCost: 5000, mainCharacter: { name: "You", level: 1, upgradeCost: 2000, skill: 2, specialty: "All", featurePoints: { Graphics: 1, Sound: 1, Gameplay: 1 } }, gameHistory: [], researchedFeatures: { Graphics: [], Sound: [], Gameplay: [], GameGenres: [] }, currentResearch: null, // --- Game Engine system --- ownedGameEngines: [], selectedGameEngine: null }; // --- Game Engines Data --- var gameEngines = [{ name: "Unity", quality: 0.10, researchCost: 0, price: 4000, researched: true, owned: false }, { name: "Unreal Engine", quality: 0.15, researchCost: 4000, price: 8000, researched: false, owned: false }, { name: "Godot", quality: 0.08, researchCost: 0, price: 4000, researched: true, owned: false }, { name: "GameMaker", quality: 0.06, researchCost: 0, price: 4000, researched: true, owned: false }, { name: "RPG Maker", quality: 0.05, researchCost: 0, price: 4000, researched: true, owned: false }, { name: "CryEngine", quality: 0.13, researchCost: 4000, price: 4000, researched: false, owned: false }, { name: "Defold", quality: 0.07, researchCost: 0, price: 4000, researched: true, owned: false }, { name: "Phaser", quality: 0.04, researchCost: 0, price: 4000, researched: true, owned: false }, { name: "Cocos2d-x", quality: 0.09, researchCost: 0, price: 4000, researched: true, owned: false }, { name: "Custom Engine", quality: 0.20, researchCost: 8000, price: 16000, researched: false, owned: false }, { name: "PICO-8", quality: 0.03, researchCost: 0, price: 4000, researched: true, owned: false }, { name: "Construct", quality: 0.05, researchCost: 0, price: 4000, researched: true, owned: false }, { name: "LibGDX", quality: 0.06, researchCost: 0, price: 4000, researched: true, owned: false }, { name: "MonoGame", quality: 0.07, researchCost: 0, price: 4000, researched: true, owned: false }]; // Current game name being created var currentGameName = ''; // Game name display at top var gameNameDisplay = new Text2('', { size: 45, fill: 0xFFFFFF }); gameNameDisplay.anchor.set(0.5, 0); gameNameDisplay.y = 10; LK.gui.top.addChild(gameNameDisplay); // Available developers pool var developerPool = [{ name: 'Alex', specialty: 'Graphics', skill: 3, cost: 4000 }, { name: 'Sam', specialty: 'Sound', skill: 4, cost: 4000 }, { name: 'Jordan', specialty: 'Gameplay', skill: 5, cost: 4000 }, { name: 'Morgan', specialty: 'Graphics', skill: 6, cost: 8000 }, { name: 'Casey', specialty: 'Sound', skill: 7, cost: 8000 }, { name: 'Drew', specialty: 'Gameplay', skill: 8, cost: 8000 }, { name: 'Taylor', specialty: 'Graphics', skill: 9, cost: 12000 }, { name: 'Jamie', specialty: 'Sound', skill: 10, cost: 12000 }, { name: 'Robin', specialty: 'Gameplay', skill: 11, cost: 12000 }]; // Available features - expanded with research requirements var featurePool = [{ name: 'Pixel Art', type: 'Graphics', basePoints: 3, cost: 4000, requiresResearch: false }, { name: '3D Models', type: 'Graphics', basePoints: 5, cost: 4000, requiresResearch: false }, { name: 'Particle Effects', type: 'Graphics', basePoints: 4, cost: 4000, requiresResearch: false }, { name: 'Soundtrack', type: 'Sound', basePoints: 3, cost: 4000, requiresResearch: false }, { name: 'Voice Acting', type: 'Sound', basePoints: 6, cost: 4000, requiresResearch: false }, { name: 'Sound Effects', type: 'Sound', basePoints: 4, cost: 4000, requiresResearch: false }, { name: 'RPG Elements', type: 'Gameplay', basePoints: 5, cost: 4000, requiresResearch: false }, { name: 'Multiplayer', type: 'Gameplay', basePoints: 7, cost: 4000, requiresResearch: false }, { name: 'Puzzles', type: 'Gameplay', basePoints: 4, cost: 4000, requiresResearch: false }, { name: 'Open World', type: 'Gameplay', basePoints: 8, cost: 4000, requiresResearch: false }, { name: 'Shaders', type: 'Graphics', basePoints: 6, cost: 8000, requiresResearch: true }, { name: 'Ray Tracing', type: 'Graphics', basePoints: 10, cost: 12000, requiresResearch: true }, { name: 'Motion Capture', type: 'Graphics', basePoints: 8, cost: 8000, requiresResearch: true }, { name: 'Procedural Generation', type: 'Graphics', basePoints: 7, cost: 8000, requiresResearch: true }, { name: 'Dynamic Lighting', type: 'Graphics', basePoints: 6, cost: 8000, requiresResearch: true }, { name: 'Orchestral Score', type: 'Sound', basePoints: 8, cost: 8000, requiresResearch: true }, { name: '3D Audio', type: 'Sound', basePoints: 7, cost: 8000, requiresResearch: true }, { name: 'Dynamic Music', type: 'Sound', basePoints: 6, cost: 8000, requiresResearch: true }, { name: 'Environmental Audio', type: 'Sound', basePoints: 5, cost: 8000, requiresResearch: true }, { name: 'Foley Effects', type: 'Sound', basePoints: 6, cost: 8000, requiresResearch: true }, { name: 'Physics Engine', type: 'Gameplay', basePoints: 9, cost: 12000, requiresResearch: true }, { name: 'AI Systems', type: 'Gameplay', basePoints: 10, cost: 12000, requiresResearch: true }, { name: 'Skill Trees', type: 'Gameplay', basePoints: 6, cost: 8000, requiresResearch: true }, { name: 'Crafting System', type: 'Gameplay', basePoints: 7, cost: 8000, requiresResearch: true }, { name: 'Dialogue System', type: 'Gameplay', basePoints: 5, cost: 8000, requiresResearch: true }]; // Game genres that can be researched var gameGenres = [{ name: 'Action', baseMultiplier: 1.2, trendChance: 0.3, researchCost: 4000, requiresResearch: false }, { name: 'Adventure', baseMultiplier: 1.1, trendChance: 0.25, researchCost: 4000, requiresResearch: false }, { name: 'Puzzle', baseMultiplier: 1.0, trendChance: 0.2, researchCost: 4000, requiresResearch: false }, { name: 'Racing', baseMultiplier: 1.3, trendChance: 0.35, researchCost: 8000, requiresResearch: true }, { name: 'Strategy', baseMultiplier: 1.4, trendChance: 0.3, researchCost: 8000, requiresResearch: true }, { name: 'Simulation', baseMultiplier: 1.2, trendChance: 0.25, researchCost: 8000, requiresResearch: true }, { name: 'RPG', baseMultiplier: 1.5, trendChance: 0.4, researchCost: 12000, requiresResearch: true }, { name: 'FPS', baseMultiplier: 1.4, trendChance: 0.35, researchCost: 12000, requiresResearch: true }, { name: 'Horror', baseMultiplier: 1.3, trendChance: 0.25, researchCost: 12000, requiresResearch: true }, { name: 'Sports', baseMultiplier: 1.2, trendChance: 0.3, researchCost: 12000, requiresResearch: true }]; // UI Elements var moneyText = new Text2('Money: $10000', { size: 50, fill: 0x4CAF50 }); moneyText.anchor.set(1, 0); LK.gui.topRight.addChild(moneyText); var developersText = new Text2('Developers: 0', { size: 40, fill: 0xFFFFFF }); developersText.anchor.set(1, 0); developersText.y = 60; LK.gui.topRight.addChild(developersText); var gamesText = new Text2('Games Released: 0', { size: 40, fill: 0xFFC107 }); gamesText.anchor.set(1, 0); gamesText.y = 110; LK.gui.topRight.addChild(gamesText); var dayText = new Text2('Day: 1', { size: 40, fill: 0x2196F3 }); dayText.anchor.set(1, 0); dayText.y = 160; LK.gui.topRight.addChild(dayText); // --- Sales & Revenue Log UI --- var salesLogContainer = new Container(); salesLogContainer.x = 2048 - 40; // right align salesLogContainer.y = 220; // just below dayText LK.gui.topRight.addChild(salesLogContainer); var salesLogEntries = []; // keep references to Text2 objects for updating/removal function updateSalesLog() { // Remove old entries for (var i = 0; i < salesLogEntries.length; i++) { salesLogEntries[i].destroy(); } salesLogEntries = []; // Show up to 5 most recent games (active and ended) var allGames = gameState.releasedGames.concat(gameState.gameHistory); var recentGames = allGames.slice(-5).reverse(); var y = 0; for (var i = 0; i < recentGames.length; i++) { var g = recentGames[i]; var isActive = g.currentDailySales > 0; var pricePerCopy = typeof g.price === "number" ? g.price : 1; var revenue = Math.floor((g.currentDailySales || 0) * pricePerCopy); var txt = new Text2(g.name + ': +' + (g.currentDailySales || 0) + ' | $' + revenue, { size: 28, fill: isActive ? 0x4CAF50 : 0x888888 }); txt.anchor.set(1, 0); txt.x = 0; txt.y = y; salesLogContainer.addChild(txt); salesLogEntries.push(txt); y += 36; } } // Main menu container var mainMenu = new Container(); game.addChild(mainMenu); var titleText = new Text2('Game Dev Studio', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 300; mainMenu.addChild(titleText); var nameGameBtn = new Button(); nameGameBtn.setLabel('Name Your Game'); nameGameBtn.x = 1024; nameGameBtn.y = 600; nameGameBtn.onClick = showNameGameMenu; mainMenu.addChild(nameGameBtn); var hireDeveloperBtn = new Button(); hireDeveloperBtn.setLabel('Hire Developer'); hireDeveloperBtn.x = 1024; hireDeveloperBtn.y = 750; hireDeveloperBtn.onClick = showHireMenu; mainMenu.addChild(hireDeveloperBtn); var startProjectBtn = new Button(); startProjectBtn.setLabel('Start Project'); startProjectBtn.x = 1024; startProjectBtn.y = 900; startProjectBtn.onClick = showProjectMenu; mainMenu.addChild(startProjectBtn); var allGamesBtn = new Button(); allGamesBtn.setLabel('All Released Games'); allGamesBtn.x = 1024; allGamesBtn.y = 1050; allGamesBtn.onClick = showAllGamesMenu; mainMenu.addChild(allGamesBtn); var researchBtn = new Button(); researchBtn.setLabel('Research'); researchBtn.x = 1024; researchBtn.y = 1200; researchBtn.onClick = showResearchMenu; mainMenu.addChild(researchBtn); // --- Game Engine Button --- var gameEngineBtn = new Button(); gameEngineBtn.setLabel('Game Engine'); gameEngineBtn.x = 1024; gameEngineBtn.y = 1500; gameEngineBtn.onClick = showGameEngineMenu; mainMenu.addChild(gameEngineBtn); // --- Platform Button --- var platformBtn = new Button(); platformBtn.setLabel('Platform'); platformBtn.x = 1024; platformBtn.y = 1650; platformBtn.onClick = showPlatformMenu; mainMenu.addChild(platformBtn); // --- Platform Menu UI --- var platformMenu = new Container(); platformMenu.visible = false; game.addChild(platformMenu); var platformTitle = new Text2('Platformlar', { size: 60, fill: 0xFFFFFF }); platformTitle.anchor.set(0.5, 0.5); platformTitle.x = 1024; platformTitle.y = 200; platformMenu.addChild(platformTitle); var platformBackBtn = new Button(); platformBackBtn.setLabel('Geri'); platformBackBtn.x = 1024; platformBackBtn.y = 2400; platformBackBtn.onClick = function () { platformMenu.visible = false; mainMenu.visible = true; }; platformMenu.addChild(platformBackBtn); // --- Drag-to-scroll for platformMenu --- var platformMenuDrag = { dragging: false, lastY: 0, startY: 0, startMenuY: 0, minY: 0, maxY: 0 }; // Calculate scroll bounds after platforms are rendered function updatePlatformMenuScrollBounds() { // Find min/max y for scrolling (platformMenu children) var minY = 0, maxY = 0; for (var i = 0; i < platformMenu.children.length; i++) { var child = platformMenu.children[i]; if (child !== platformTitle && child !== platformBackBtn) { if (minY === 0 || child.y < minY) minY = child.y; if (child.y > maxY) maxY = child.y; } } // Allow scrolling so that last row is visible, but not too far up platformMenuDrag.minY = Math.min(0, 800 - maxY); platformMenuDrag.maxY = 0; } platformMenu.interactive = true; platformMenu.down = function (x, y, obj) { platformMenuDrag.dragging = true; platformMenuDrag.lastY = y; platformMenuDrag.startY = y; platformMenuDrag.startMenuY = platformMenu.y || 0; updatePlatformMenuScrollBounds(); }; platformMenu.move = function (x, y, obj) { if (!platformMenuDrag.dragging) return; var dy = y - platformMenuDrag.lastY; var newY = (platformMenu.y || 0) + dy; // Clamp scroll if (newY < platformMenuDrag.minY) newY = platformMenuDrag.minY; if (newY > platformMenuDrag.maxY) newY = platformMenuDrag.maxY; platformMenu.y = newY; platformMenuDrag.lastY = y; }; platformMenu.up = function (x, y, obj) { platformMenuDrag.dragging = false; }; // --- Platform data (moved up to fix ReferenceError) --- // Each platform gets a salesBonus: 0.02 * (index+1) for 2% more per platform var platforms = [{ name: "PC", year: 1981, researched: true, owned: true, researchCost: 0, price: 0 }, { name: "Commodore 64", year: 1982, researched: false, owned: false, researchCost: 4000, price: 4000 }, { name: "NES", year: 1983, researched: false, owned: false, researchCost: 4000, price: 4000 }, { name: "Sega Master System", year: 1985, researched: false, owned: false, researchCost: 4000, price: 4000 }, { name: "Game Boy", year: 1989, researched: false, owned: false, researchCost: 4000, price: 4000 }, { name: "Super Nintendo", year: 1990, researched: false, owned: false, researchCost: 4000, price: 4000 }, { name: "Sega Genesis", year: 1990, researched: false, owned: false, researchCost: 4000, price: 4000 }, { name: "PlayStation", year: 1994, researched: true, owned: true, researchCost: 0, price: 0 }, { name: "Sega Saturn", year: 1994, researched: false, owned: false, researchCost: 4000, price: 4000 }, { name: "Nintendo 64", year: 1996, researched: false, owned: false, researchCost: 4000, price: 4000 }, { name: "Dreamcast", year: 1998, researched: false, owned: false, researchCost: 4000, price: 4000 }, { name: "PlayStation 2", year: 2000, researched: false, owned: false, researchCost: 4000, price: 8000 }, { name: "GameCube", year: 2001, researched: false, owned: false, researchCost: 8000, price: 8000 }, { name: "Xbox", year: 2001, researched: false, owned: false, researchCost: 8000, price: 8000 }, { name: "Game Boy Advance", year: 2001, researched: false, owned: false, researchCost: 8000, price: 8000 }, { name: "PlayStation Portable", year: 2004, researched: false, owned: false, researchCost: 8000, price: 8000 }, { name: "Nintendo DS", year: 2004, researched: false, owned: false, researchCost: 8000, price: 8000 }, { name: "Xbox 360", year: 2005, researched: false, owned: false, researchCost: 8000, price: 8000 }, { name: "Wii", year: 2006, researched: false, owned: false, researchCost: 8000, price: 8000 }, { name: "PlayStation 3", year: 2006, researched: false, owned: false, researchCost: 8000, price: 8000 }, { name: "PlayStation Vita", year: 2011, researched: false, owned: false, researchCost: 12000, price: 12000 }, { name: "Nintendo 3DS", year: 2011, researched: false, owned: false, researchCost: 12000, price: 12000 }, { name: "Wii U", year: 2012, researched: false, owned: false, researchCost: 12000, price: 12000 }, { name: "PlayStation 4", year: 2013, researched: false, owned: false, researchCost: 12000, price: 12000 }, { name: "Xbox One", year: 2013, researched: false, owned: false, researchCost: 12000, price: 12000 }, { name: "Nintendo Switch", year: 2017, researched: false, owned: false, researchCost: 16000, price: 16000 }, { name: "PlayStation 5", year: 2020, researched: false, owned: false, researchCost: 16000, price: 16000 }, { name: "Xbox Series X", year: 2020, researched: false, owned: false, researchCost: 16000, price: 16000 }, { name: "Steam Deck", year: 2022, researched: false, owned: false, researchCost: 16000, price: 16000 }, { name: "Mobile", year: 2007, researched: false, owned: false, researchCost: 8000, price: 8000 }, { name: "Ouya", year: 2013, researched: false, owned: false, researchCost: 4000, price: 4000 }]; // Add salesBonus to each platform (2% per platform, starting from 2%) for (var i = 0; i < platforms.length; i++) { platforms[i].salesBonus = 0.02 * (i + 1); } // Sort platforms by year ascending platforms.sort(function (a, b) { return a.year - b.year; }); // Helper for showing the platform menu function showPlatformMenu() { mainMenu.visible = false; platformMenu.visible = true; platformMenu.y = 0; // Reset scroll position on open // Remove old platform cards/buttons for (var i = platformMenu.children.length - 1; i >= 0; i--) { var child = platformMenu.children[i]; if (child !== platformTitle && child !== platformBackBtn) { child.destroy(); } } // Platform data // Use the global, sorted platforms array // Store platform state in gameState if not already if (!gameState.platforms) { gameState.platforms = {}; for (var i = 0; i < platforms.length; i++) { var plat = platforms[i]; gameState.platforms[plat.name] = { researched: plat.researched, owned: plat.owned }; } gameState.selectedPlatform = "PC"; } // Show all platforms in a grid: 4 columns per row, all same size, fit all on screen var yStart = 500; var xStart = 320; // leftmost card center (for 4 columns) var xSpacing = 350; // horizontal distance between columns var ySpacing = 220; // vertical spacing var cols = 4; for (var i = 0; i < platforms.length; i++) { var plat = platforms[i]; var container = new Container(); var col = i % cols; var row = Math.floor(i / cols); container.x = xStart + col * xSpacing; container.y = yStart + row * ySpacing; // Card background var bg = LK.getAsset('card', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.0, scaleY: 0.35 }); container.addChild(bg); // Platform name var nameText = new Text2(plat.name, { size: 35, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0.5); nameText.y = -30; container.addChild(nameText); // Year var yearText = new Text2('Çıkış: ' + plat.year, { size: 28, fill: 0x4CAF50 }); yearText.anchor.set(0.5, 0.5); yearText.y = 10; container.addChild(yearText); // Sales bonus var bonusText = new Text2('Satış Bonus: +' + Math.round(plat.salesBonus * 100) + '%', { size: 24, fill: 0x2196F3 }); bonusText.anchor.set(0.5, 0.5); bonusText.y = 40; container.addChild(bonusText); // Research or Buy button var platState = gameState.platforms[plat.name]; if (!platState.owned) { var buyBtn = new Button(); buyBtn.setLabel('Satın Al ($' + plat.price + ')'); buyBtn.x = 0; buyBtn.y = 100; buyBtn.onClick = function (plat, platState) { return function () { if (gameState.money >= plat.price) { gameState.money -= plat.price; // Find the correct platState again (by name) to avoid closure bug if (gameState.platforms && gameState.platforms[plat.name]) { gameState.platforms[plat.name].owned = true; gameState.platforms[plat.name].researched = true; // Mark as researched on purchase } updateUI(); LK.getSound('success').play(); showPlatformMenu(); } }; }(plat, platState); container.addChild(buyBtn); } else { var ownedText = new Text2('Kullanılabilir', { size: 28, fill: 0xFFC107 }); ownedText.anchor.set(0.5, 0.5); ownedText.y = 100; container.addChild(ownedText); // No select button for owned platforms } platformMenu.addChild(container); } // Update scroll bounds after all cards are added updatePlatformMenuScrollBounds && updatePlatformMenuScrollBounds(); } // --- Game Engine Menu UI --- var gameEngineMenu = new Container(); gameEngineMenu.visible = false; game.addChild(gameEngineMenu); var gameEngineTitle = new Text2('Game Engines', { size: 60, fill: 0xFFFFFF }); gameEngineTitle.anchor.set(0.5, 0.5); gameEngineTitle.x = 1024; gameEngineTitle.y = 200; gameEngineMenu.addChild(gameEngineTitle); var gameEngineBackBtn = new Button(); gameEngineBackBtn.setLabel('Back'); gameEngineBackBtn.x = 1024; gameEngineBackBtn.y = 2400; gameEngineBackBtn.onClick = function () { gameEngineMenu.visible = false; mainMenu.visible = true; }; gameEngineMenu.addChild(gameEngineBackBtn); // Helper for showing the menu function showGameEngineMenu() { mainMenu.visible = false; gameEngineMenu.visible = true; // Remove old engine cards/buttons for (var i = gameEngineMenu.children.length - 1; i >= 0; i--) { var child = gameEngineMenu.children[i]; if (child !== gameEngineTitle && child !== gameEngineBackBtn) { child.destroy(); } } // Show all engines in a grid: 2 columns, 5 rows var yStart = 640 + 120 - 136; // moved 1 row (120px) down, then 5% (136px) up var xStart = 624; // left column center (1024 - 400) var xSpacing = 800; // distance between columns var ySpacing = 220; // distance between rows var cols = 2; for (var i = 0; i < gameEngines.length; i++) { var engine = gameEngines[i]; var container = new Container(); var col = i % cols; var row = Math.floor(i / cols); container.x = xStart + col * xSpacing; container.y = yStart + row * ySpacing; // Card background var bg = LK.getAsset('card', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 0.5 }); container.addChild(bg); // Engine name (remove label under button, keep only on card) var nameText = new Text2(engine.name, { size: 35, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0.5); nameText.y = -30; container.addChild(nameText); // Quality var qualityText = new Text2('Quality: +' + Math.round(engine.quality * 100) + '%', { size: 28, fill: 0x4CAF50 }); qualityText.anchor.set(0.5, 0.5); qualityText.y = 10; container.addChild(qualityText); // Research or Buy button (move button to next row, no label under button) if (!engine.researched) { var researchBtn = new Button(); researchBtn.setLabel('Research ($' + engine.researchCost + ')'); researchBtn.x = 0; researchBtn.y = 100; // moved to next row, no label under researchBtn.onClick = function (eng) { return function () { if (gameState.money >= eng.researchCost && !gameState.currentResearch) { gameState.money -= eng.researchCost; gameState.currentResearch = { name: eng.name, category: 'GameEngines', timeRemaining: 180 }; updateUI(); LK.getSound('select').play(); showGameEngineMenu(); } }; }(engine); container.addChild(researchBtn); } else if (!engine.owned) { var buyBtn = new Button(); buyBtn.setLabel('Buy ($' + engine.price + ')'); buyBtn.x = 0; buyBtn.y = 100; // moved to next row, no label under buyBtn.onClick = function (eng) { return function () { if (gameState.money >= eng.price) { gameState.money -= eng.price; eng.owned = true; gameState.ownedGameEngines.push(eng.name); updateUI(); LK.getSound('success').play(); showGameEngineMenu(); } }; }(engine); container.addChild(buyBtn); } else { var ownedText = new Text2('Owned', { size: 28, fill: 0xFFC107 }); ownedText.anchor.set(0.5, 0.5); ownedText.y = 100; // moved to next row, no label under container.addChild(ownedText); // Select button var selectBtn = new Button(); selectBtn.setLabel(gameState.selectedGameEngine === engine.name ? 'Selected' : 'Select'); selectBtn.x = 300; selectBtn.y = 100; // moved to next row, no label under if (gameState.selectedGameEngine === engine.name) { selectBtn.children[0].tint = 0xe94560; } selectBtn.onClick = function (eng) { return function () { gameState.selectedGameEngine = eng.name; LK.getSound('select').play(); // Also update projectMenu and developmentScreen engine text if open if (projectMenu && projectMenu.visible) { if (projectMenu.engineText) projectMenu.engineText.destroy(); var engineTextLabel = 'Game Engine: ' + eng.name; if (eng.quality) engineTextLabel += ' (+' + Math.round(eng.quality * 100) + '% quality)'; var engineText = new Text2(engineTextLabel, { size: 35, fill: 0x4CAF50 }); engineText.anchor.set(0.5, 0.5); engineText.x = 1024; engineText.y = 700; projectMenu.addChild(engineText); projectMenu.engineText = engineText; } if (developmentScreen && developmentScreen.visible) { if (developmentScreen.engineText) developmentScreen.engineText.destroy(); var engineTextLabel2 = 'Game Engine: ' + eng.name; if (eng.quality) engineTextLabel2 += ' (+' + Math.round(eng.quality * 100) + '% quality)'; var engineText2 = new Text2(engineTextLabel2, { size: 35, fill: 0x4CAF50 }); engineText2.anchor.set(0.5, 0.5); engineText2.x = 1024; engineText2.y = 300; developmentScreen.addChild(engineText2); developmentScreen.engineText = engineText2; } showGameEngineMenu(); }; }(engine); container.addChild(selectBtn); } gameEngineMenu.addChild(container); } } // --- Upgrade Button and Menu --- var upgradeBtn = new Button(); upgradeBtn.setLabel('Yükselt'); upgradeBtn.x = 1024; upgradeBtn.y = 1350; upgradeBtn.onClick = showUpgradeMenu; mainMenu.addChild(upgradeBtn); var upgradeMenu = new Container(); upgradeMenu.visible = false; game.addChild(upgradeMenu); var upgradeTitle = new Text2('Stüdyo Yükseltmeleri', { size: 60, fill: 0xFFFFFF }); upgradeTitle.anchor.set(0.5, 0.5); upgradeTitle.x = 1024; upgradeTitle.y = 200; upgradeMenu.addChild(upgradeTitle); var studioLevelText = new Text2('', { size: 40, fill: 0xFFC107 }); studioLevelText.anchor.set(0.5, 0.5); studioLevelText.x = 1024; studioLevelText.y = 350; upgradeMenu.addChild(studioLevelText); var studioUpgradeCostText = new Text2('', { size: 35, fill: 0x4CAF50 }); studioUpgradeCostText.anchor.set(0.5, 0.5); studioUpgradeCostText.x = 1024; studioUpgradeCostText.y = 420; upgradeMenu.addChild(studioUpgradeCostText); var studioUpgradeBtn = new Button(); studioUpgradeBtn.setLabel('Stüdyo Seviyesini Yükselt'); studioUpgradeBtn.x = 1024; studioUpgradeBtn.y = 500; studioUpgradeBtn.onClick = function () { if (gameState.money >= gameState.studioUpgradeCost) { gameState.money -= gameState.studioUpgradeCost; gameState.studioLevel += 1; gameState.maxHireableDevelopers += 1; gameState.studioUpgradeCost = Math.floor(gameState.studioUpgradeCost * 1.7); updateUI(); showUpgradeMenu(); LK.getSound('success').play(); } }; upgradeMenu.addChild(studioUpgradeBtn); // --- Main Character Section --- var mainCharTitle = new Text2('Ana Karakterin', { size: 40, fill: 0xFFFFFF }); mainCharTitle.anchor.set(0.5, 0.5); mainCharTitle.x = 1024; mainCharTitle.y = 700; upgradeMenu.addChild(mainCharTitle); var mainCharLevelText = new Text2('', { size: 35, fill: 0xFFC107 }); mainCharLevelText.anchor.set(0.5, 0.5); mainCharLevelText.x = 1024; mainCharLevelText.y = 770; upgradeMenu.addChild(mainCharLevelText); var mainCharSkillText = new Text2('', { size: 30, fill: 0x2196F3 }); mainCharSkillText.anchor.set(0.5, 0.5); mainCharSkillText.x = 1024; mainCharSkillText.y = 820; upgradeMenu.addChild(mainCharSkillText); var mainCharUpgradeCostText = new Text2('', { size: 30, fill: 0x4CAF50 }); mainCharUpgradeCostText.anchor.set(0.5, 0.5); mainCharUpgradeCostText.x = 1024; mainCharUpgradeCostText.y = 870; upgradeMenu.addChild(mainCharUpgradeCostText); var mainCharUpgradeBtn = new Button(); mainCharUpgradeBtn.setLabel('Ana Karakteri Yükselt'); mainCharUpgradeBtn.x = 1024; mainCharUpgradeBtn.y = 950; mainCharUpgradeBtn.onClick = function () { if (gameState.money >= gameState.mainCharacter.upgradeCost) { gameState.money -= gameState.mainCharacter.upgradeCost; gameState.mainCharacter.level += 1; gameState.mainCharacter.skill += 1; // Each level, increase all feature points by 1 gameState.mainCharacter.featurePoints.Graphics += 1; gameState.mainCharacter.featurePoints.Sound += 1; gameState.mainCharacter.featurePoints.Gameplay += 1; gameState.mainCharacter.upgradeCost = Math.floor(gameState.mainCharacter.upgradeCost * 1.8); updateUI(); showUpgradeMenu(); LK.getSound('success').play(); } }; upgradeMenu.addChild(mainCharUpgradeBtn); var backFromUpgradeBtn = new Button(); backFromUpgradeBtn.setLabel('Geri'); backFromUpgradeBtn.x = 1024; backFromUpgradeBtn.y = 2400; backFromUpgradeBtn.onClick = function () { upgradeMenu.visible = false; mainMenu.visible = true; }; upgradeMenu.addChild(backFromUpgradeBtn); function showUpgradeMenu() { mainMenu.visible = false; upgradeMenu.visible = true; studioLevelText.setText('Stüdyo Seviyesi: ' + gameState.studioLevel); studioUpgradeCostText.setText('Yükseltme Maliyeti: $' + gameState.studioUpgradeCost); mainCharLevelText.setText('Ana Karakter Seviye: ' + gameState.mainCharacter.level); mainCharSkillText.setText('Her Özellik Puanı: ' + 'Grafik: ' + gameState.mainCharacter.featurePoints.Graphics + ', Ses: ' + gameState.mainCharacter.featurePoints.Sound + ', Oynanış: ' + gameState.mainCharacter.featurePoints.Gameplay); mainCharUpgradeCostText.setText('Yükseltme Maliyeti: $' + gameState.mainCharacter.upgradeCost); } // Research menu container var researchMenu = new Container(); researchMenu.visible = false; game.addChild(researchMenu); var researchTitle = new Text2('Research Lab', { size: 60, fill: 0xFFFFFF }); researchTitle.anchor.set(0.5, 0.5); researchTitle.x = 1024; researchTitle.y = 200; researchMenu.addChild(researchTitle); var researchBackBtn = new Button(); researchBackBtn.setLabel('Back'); researchBackBtn.x = 1024; researchBackBtn.y = 2400; researchBackBtn.onClick = function () { researchMenu.visible = false; mainMenu.visible = true; }; researchMenu.addChild(researchBackBtn); // Research category menu var researchCategoryMenu = new Container(); researchCategoryMenu.visible = false; game.addChild(researchCategoryMenu); var categoryTitle = new Text2('', { size: 60, fill: 0xFFFFFF }); categoryTitle.anchor.set(0.5, 0.5); categoryTitle.x = 1024; categoryTitle.y = 200; researchCategoryMenu.addChild(categoryTitle); var categoryBackBtn = new Button(); categoryBackBtn.setLabel('Back'); categoryBackBtn.x = 1024; categoryBackBtn.y = 2400; categoryBackBtn.onClick = function () { researchCategoryMenu.visible = false; researchMenu.visible = true; }; researchCategoryMenu.addChild(categoryBackBtn); // Name game menu container var nameGameMenu = new Container(); nameGameMenu.visible = false; game.addChild(nameGameMenu); var nameGameTitle = new Text2('Name Your Game', { size: 60, fill: 0xFFFFFF }); nameGameTitle.anchor.set(0.5, 0.5); nameGameTitle.x = 1024; nameGameTitle.y = 200; nameGameMenu.addChild(nameGameTitle); var gameNameInput = new Text2('', { size: 50, fill: 0x4CAF50 }); gameNameInput.anchor.set(0.5, 0.5); gameNameInput.x = 1024; gameNameInput.y = 400; nameGameMenu.addChild(gameNameInput); var inputPrompt = new Text2('Tap to enter game name', { size: 30, fill: 0xFFFFFF }); inputPrompt.anchor.set(0.5, 0.5); inputPrompt.x = 1024; inputPrompt.y = 500; nameGameMenu.addChild(inputPrompt); var randomNameBtn = new Button(); randomNameBtn.setLabel('Random Name'); randomNameBtn.x = 1024; randomNameBtn.y = 700; randomNameBtn.onClick = generateRandomName; nameGameMenu.addChild(randomNameBtn); var confirmNameBtn = new Button(); confirmNameBtn.setLabel('Confirm Name'); confirmNameBtn.x = 1024; confirmNameBtn.y = 850; confirmNameBtn.onClick = confirmGameName; nameGameMenu.addChild(confirmNameBtn); var backFromNameBtn = new Button(); backFromNameBtn.setLabel('Back'); backFromNameBtn.x = 1024; backFromNameBtn.y = 1000; backFromNameBtn.onClick = function () { nameGameMenu.visible = false; mainMenu.visible = true; gameNameInput.setText(''); currentGameName = ''; }; nameGameMenu.addChild(backFromNameBtn); // Simple tap-to-edit name input var nameInputBg = LK.getAsset('button', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 1 }); nameInputBg.x = 1024; nameInputBg.y = 400; nameInputBg.alpha = 0.3; nameGameMenu.addChild(nameInputBg); nameInputBg.interactive = true; nameInputBg.down = function () { // Simulate simple text input with preset options var names = ['Game Studio Pro', 'Developer Tycoon', 'Code Master', 'Pixel Dreams', 'Game Maker Plus']; var randomIndex = Math.floor(Math.random() * names.length); currentGameName = names[randomIndex]; gameNameInput.setText(currentGameName); LK.getSound('select').play(); }; // Move gameNameInput to be on top nameGameMenu.removeChild(gameNameInput); nameGameMenu.addChild(gameNameInput); // All games menu container var allGamesMenu = new Container(); allGamesMenu.visible = false; game.addChild(allGamesMenu); var allGamesTitle = new Text2('All Released Games', { size: 60, fill: 0xFFFFFF }); allGamesTitle.anchor.set(0.5, 0.5); allGamesTitle.x = 1024; allGamesTitle.y = 200; allGamesMenu.addChild(allGamesTitle); var noGamesText = new Text2('No games released yet', { size: 40, fill: 0xFFFFFF }); noGamesText.anchor.set(0.5, 0.5); noGamesText.x = 1024; noGamesText.y = 600; noGamesText.visible = false; allGamesMenu.addChild(noGamesText); var backFromAllGamesBtn = new Button(); backFromAllGamesBtn.setLabel('Back'); backFromAllGamesBtn.x = 1024; backFromAllGamesBtn.y = 2400; backFromAllGamesBtn.onClick = function () { allGamesMenu.visible = false; mainMenu.visible = true; }; allGamesMenu.addChild(backFromAllGamesBtn); // Game detail view container var gameDetailView = new Container(); gameDetailView.visible = false; game.addChild(gameDetailView); var detailBackBtn = new Button(); detailBackBtn.setLabel('Back to Games List'); detailBackBtn.x = 1024; detailBackBtn.y = 2400; detailBackBtn.onClick = function () { gameDetailView.visible = false; allGamesMenu.visible = true; }; gameDetailView.addChild(detailBackBtn); // Hire menu container var hireMenu = new Container(); hireMenu.visible = false; game.addChild(hireMenu); var hireTitle = new Text2('Hire Developer', { size: 60, fill: 0xFFFFFF }); hireTitle.anchor.set(0.5, 0.5); hireTitle.x = 1024; hireTitle.y = 200; hireMenu.addChild(hireTitle); var backFromHireBtn = new Button(); backFromHireBtn.setLabel('Back'); backFromHireBtn.x = 1024; backFromHireBtn.y = 2400; backFromHireBtn.onClick = function () { hireMenu.visible = false; mainMenu.visible = true; }; hireMenu.addChild(backFromHireBtn); // Project menu container var projectMenu = new Container(); projectMenu.visible = false; game.addChild(projectMenu); var projectTitle = new Text2('New Project', { size: 60, fill: 0xFFFFFF }); projectTitle.anchor.set(0.5, 0.5); projectTitle.x = 1024; projectTitle.y = 200; projectMenu.addChild(projectTitle); var selectFeaturesText = new Text2('Select 5 Features:', { size: 40, fill: 0xFFFFFF }); selectFeaturesText.anchor.set(0.5, 0.5); selectFeaturesText.x = 1024; selectFeaturesText.y = 300; projectMenu.addChild(selectFeaturesText); var startDevelopmentBtn = new Button(); startDevelopmentBtn.setLabel('Start Development'); startDevelopmentBtn.x = 1024; startDevelopmentBtn.y = 2200; startDevelopmentBtn.onClick = startDevelopment; projectMenu.addChild(startDevelopmentBtn); // Add Back button to New Project page var backFromProjectBtn = new Button(); backFromProjectBtn.setLabel('Back'); backFromProjectBtn.x = 1024; backFromProjectBtn.y = 2350; backFromProjectBtn.onClick = function () { projectMenu.visible = false; mainMenu.visible = true; selectedFeatures = []; featureCards.forEach(function (card) { card.setSelected(false); }); projectMenu.selectedGenre = null; }; projectMenu.addChild(backFromProjectBtn); // Feature category menu var featureCategoryMenu = new Container(); featureCategoryMenu.visible = false; game.addChild(featureCategoryMenu); var categoryMenuTitle = new Text2('', { size: 60, fill: 0xFFFFFF }); categoryMenuTitle.anchor.set(0.5, 0.5); categoryMenuTitle.x = 1024; categoryMenuTitle.y = 200; featureCategoryMenu.addChild(categoryMenuTitle); var selectedFeaturesText = new Text2('Selected: 0/5', { size: 40, fill: 0xFFFFFF }); selectedFeaturesText.anchor.set(0.5, 0.5); selectedFeaturesText.x = 1024; selectedFeaturesText.y = 300; featureCategoryMenu.addChild(selectedFeaturesText); var categoryBackBtn = new Button(); categoryBackBtn.setLabel('Back to Categories'); categoryBackBtn.x = 1024; categoryBackBtn.y = 2350; categoryBackBtn.onClick = function () { featureCategoryMenu.visible = false; projectMenu.visible = true; // Update total cost in project menu var totalCost = 0; selectedFeatures.forEach(function (f) { totalCost += f.cost; }); if (projectMenu.totalCostText) { projectMenu.totalCostText.setText('Total Cost: $' + totalCost); } }; featureCategoryMenu.addChild(categoryBackBtn); // --- Game Genres Research menu for projectMenu --- var projectGenresResearchMenu = new Container(); projectGenresResearchMenu.visible = false; game.addChild(projectGenresResearchMenu); var projectGenresResearchTitle = new Text2('Game Genres Research', { size: 60, fill: 0xFFFFFF }); projectGenresResearchTitle.anchor.set(0.5, 0.5); projectGenresResearchTitle.x = 1024; projectGenresResearchTitle.y = 200; projectGenresResearchMenu.addChild(projectGenresResearchTitle); var projectGenresResearchBackBtn = new Button(); projectGenresResearchBackBtn.setLabel('Back'); projectGenresResearchBackBtn.x = 1024; projectGenresResearchBackBtn.y = 2400; projectGenresResearchBackBtn.onClick = function () { projectGenresResearchMenu.visible = false; projectMenu.visible = true; }; projectGenresResearchMenu.addChild(projectGenresResearchBackBtn); function showProjectGenresResearchMenu() { projectMenu.visible = false; projectGenresResearchMenu.visible = true; // Remove old genre buttons for (var i = projectGenresResearchMenu.children.length - 1; i >= 0; i--) { var child = projectGenresResearchMenu.children[i]; if (child !== projectGenresResearchTitle && child !== projectGenresResearchBackBtn) { child.destroy(); } } // Show researched genres as selectable, and unresearched as buttons var yStart = 400; var researched = gameState.researchedFeatures.GameGenres; gameGenres.forEach(function (genre, idx) { if (!genre.requiresResearch || researched.indexOf(genre.name) !== -1) { // Make researched genres selectable (only one can be selected) var isSelected = projectMenu.selectedGenre && projectMenu.selectedGenre.name === genre.name; var genreBtn = new Button(); genreBtn.setLabel(genre.name + (isSelected ? ' (Selected)' : ' (Researched)')); genreBtn.x = 1024; genreBtn.y = yStart + idx * 120; if (isSelected) { // Highlight selected genre genreBtn.children[0].tint = 0xe94560; } genreBtn.onClick = function (g) { return function () { projectMenu.selectedGenre = g; // Sync selected genre to gameState for persistence gameState.selectedGenre = g; LK.getSound('select').play(); if (projectMenu.genreText) { projectMenu.genreText.setText('Selected Genre: ' + (projectMenu.selectedGenre ? projectMenu.selectedGenre.name : 'None')); } showProjectGenresResearchMenu(); }; }(genre); projectGenresResearchMenu.addChild(genreBtn); } else { var btn = new Button(); btn.setLabel(genre.name + ' ($' + genre.researchCost + ')'); btn.x = 1024; btn.y = yStart + idx * 120; btn.onClick = function (g) { return function () { if (gameState.money >= g.researchCost && !gameState.currentResearch) { gameState.money -= g.researchCost; gameState.currentResearch = { name: g.name, category: 'GameGenres', timeRemaining: 180 }; updateUI(); LK.getSound('select').play(); showProjectGenresResearchMenu(); } }; }(genre); projectGenresResearchMenu.addChild(btn); } }); } // Development screen var developmentScreen = new Container(); developmentScreen.visible = false; game.addChild(developmentScreen); var devTitle = new Text2('Developing Game', { size: 60, fill: 0xFFFFFF }); devTitle.anchor.set(0.5, 0.5); devTitle.x = 1024; devTitle.y = 200; developmentScreen.addChild(devTitle); var targetScoreText = new Text2('Target Score: 100', { size: 40, fill: 0xFFFFFF }); targetScoreText.anchor.set(0.5, 0.5); targetScoreText.x = 1024; targetScoreText.y = 400; developmentScreen.addChild(targetScoreText); var currentScoreText = new Text2('Current Score: 0', { size: 40, fill: 0x4CAF50 }); currentScoreText.anchor.set(0.5, 0.5); currentScoreText.x = 1024; currentScoreText.y = 500; developmentScreen.addChild(currentScoreText); var progressBarBg = LK.getAsset('progressBar', { anchorX: 0.5, anchorY: 0.5 }); progressBarBg.x = 1024; progressBarBg.y = 700; developmentScreen.addChild(progressBarBg); var progressBarFill = LK.getAsset('progressFill', { anchorX: 0, anchorY: 0.5 }); progressBarFill.x = 624; progressBarFill.y = 700; progressBarFill.scaleX = 0; developmentScreen.addChild(progressBarFill); var releaseBtn = new Button(); releaseBtn.setLabel('Release Game!'); releaseBtn.x = 1024; releaseBtn.y = 900; releaseBtn.visible = false; releaseBtn.onClick = releaseGame; developmentScreen.addChild(releaseBtn); // Market trends display var trendsContainer = new Container(); trendsContainer.x = 1024; trendsContainer.y = 1200; developmentScreen.addChild(trendsContainer); var trendsTitle = new Text2('Market Trends:', { size: 35, fill: 0xFF5722 }); trendsTitle.anchor.set(0.5, 0.5); trendsContainer.addChild(trendsTitle); // Arrays for UI elements var developerCards = []; var featureCards = []; var selectedFeatures = []; // Functions function updateUI() { moneyText.setText('Money: $' + gameState.money); developersText.setText('Developers: ' + gameState.developers.length); gamesText.setText('Games Released: ' + gameState.completedGames); dayText.setText('Day: ' + gameState.currentDay); } function showResearchMenu() { mainMenu.visible = false; researchMenu.visible = true; // Clear existing buttons for (var i = researchMenu.children.length - 1; i >= 0; i--) { if (researchMenu.children[i] instanceof Button && researchMenu.children[i] !== researchBackBtn) { researchMenu.children[i].destroy(); } } // Create category buttons var categories = ['Graphics', 'Sound', 'Gameplay', 'GameGenres']; categories.forEach(function (category, index) { var btn = new Button(); var displayName = category === 'GameGenres' ? 'Game Genres' : category; btn.setLabel(displayName + ' Research'); btn.x = 1024; btn.y = 400 + index * 150; btn.onClick = function () { showResearchCategory(category); }; researchMenu.addChild(btn); }); } function showResearchCategory(category) { researchMenu.visible = false; researchCategoryMenu.visible = true; var displayName = category === 'GameGenres' ? 'Game Genres' : category; categoryTitle.setText(displayName + ' Research'); // Clear existing items for (var i = researchCategoryMenu.children.length - 1; i >= 0; i--) { var child = researchCategoryMenu.children[i]; if (child !== categoryTitle && child !== categoryBackBtn) { child.destroy(); } } // Get researchable items for this category var items = []; if (category === 'GameGenres') { items = gameGenres.filter(function (genre) { return genre.requiresResearch && gameState.researchedFeatures.GameGenres.indexOf(genre.name) === -1; }); } else { items = featurePool.filter(function (feature) { return feature.type === category && feature.requiresResearch && gameState.researchedFeatures[category].indexOf(feature.name) === -1; }); } // Display research items items.forEach(function (item, index) { var container = new Container(); container.x = 1024; container.y = 400 + index * 120; var bg = LK.getAsset('card', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 0.4 }); container.addChild(bg); var nameText = new Text2(item.name, { size: 30, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0.5); nameText.y = -20; container.addChild(nameText); var cost = category === 'GameGenres' ? item.researchCost : item.cost * 3; var costText = new Text2('Research Cost: $' + cost, { size: 25, fill: 0x4CAF50 }); costText.anchor.set(0.5, 0.5); costText.y = 20; container.addChild(costText); container.interactive = true; container.down = function () { if (gameState.money >= cost && !gameState.currentResearch) { gameState.money -= cost; gameState.currentResearch = { name: item.name, category: category, timeRemaining: 180 // 3 seconds }; updateUI(); LK.getSound('select').play(); showResearchCategory(category); } }; researchCategoryMenu.addChild(container); }); // Add a Back button specifically for Game Genres, Gameplay, Graphics, and Sound Research page if (category === 'GameGenres' || category === 'Gameplay' || category === 'Graphics' || category === 'Sound') { // Remove previous genre/gameplay/graphics/sound back button if any if (researchCategoryMenu.genreBackBtn) { researchCategoryMenu.removeChild(researchCategoryMenu.genreBackBtn); researchCategoryMenu.genreBackBtn.destroy(); researchCategoryMenu.genreBackBtn = null; } var genreBackBtn = new Button(); genreBackBtn.setLabel('Back'); genreBackBtn.x = 1024; genreBackBtn.y = 2400; genreBackBtn.onClick = function () { researchCategoryMenu.visible = false; researchMenu.visible = true; updateGlobalBackBtn && updateGlobalBackBtn(); }; researchCategoryMenu.addChild(genreBackBtn); researchCategoryMenu.genreBackBtn = genreBackBtn; } // Show current research if any if (gameState.currentResearch) { var researchInfo = new Text2('Currently researching: ' + gameState.currentResearch.name, { size: 35, fill: 0xFFC107 }); researchInfo.anchor.set(0.5, 0.5); researchInfo.x = 1024; researchInfo.y = 300; researchCategoryMenu.addChild(researchInfo); } } function showNameGameMenu() { mainMenu.visible = false; nameGameMenu.visible = true; currentGameName = ''; gameNameInput.setText(''); } function generateRandomName() { var prefixes = ['Super', 'Mega', 'Ultra', 'Epic', 'Legendary', 'Amazing', 'Incredible', 'Fantastic']; var genres = ['Adventure', 'Quest', 'Battle', 'World', 'Kingdom', 'Legend', 'Saga', 'Chronicles']; var suffixes = ['2000', 'X', 'Plus', 'HD', 'Remastered', 'Ultimate', 'Deluxe', 'Pro']; var name = prefixes[Math.floor(Math.random() * prefixes.length)] + ' ' + genres[Math.floor(Math.random() * genres.length)] + ' ' + suffixes[Math.floor(Math.random() * suffixes.length)]; currentGameName = name; gameNameInput.setText(name); LK.getSound('select').play(); } function confirmGameName() { if (currentGameName && currentGameName.length > 0) { // Store the game name for later use nameGameMenu.visible = false; mainMenu.visible = true; LK.getSound('success').play(); // Update game name display gameNameDisplay.setText('Next Game: ' + currentGameName); // Show confirmation message var confirmText = new Text2('Next game will be: ' + currentGameName, { size: 30, fill: 0x4CAF50 }); confirmText.anchor.set(0.5, 0.5); confirmText.x = 1024; confirmText.y = 1050; confirmText.alpha = 0; mainMenu.addChild(confirmText); tween(confirmText, { alpha: 1 }, { duration: 500, onFinish: function onFinish() { LK.setTimeout(function () { tween(confirmText, { alpha: 0 }, { duration: 500, onFinish: function onFinish() { confirmText.destroy(); } }); }, 2000); } }); } } function showAllGamesMenu() { mainMenu.visible = false; allGamesMenu.visible = true; // Clear existing game cards var cardsToRemove = []; allGamesMenu.children.forEach(function (child) { if (child instanceof GameHistoryCard) { cardsToRemove.push(child); } }); cardsToRemove.forEach(function (card) { card.destroy(); }); // Show all games (both active and completed) var allGames = gameState.releasedGames.concat(gameState.gameHistory); if (allGames.length === 0) { noGamesText.visible = true; } else { noGamesText.visible = false; allGames.forEach(function (game, index) { var card = new GameHistoryCard(); card.setGameData(game); card.x = 1024; card.y = 400 + index * 150; card.onClick = showGameDetail; allGamesMenu.addChild(card); }); } } function showGameDetail(gameData) { allGamesMenu.visible = false; gameDetailView.visible = true; // Clear previous content for (var i = gameDetailView.children.length - 1; i >= 0; i--) { if (gameDetailView.children[i] !== detailBackBtn) { gameDetailView.children[i].destroy(); } } // Game title var titleText = new Text2(gameData.name, { size: 60, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 200; gameDetailView.addChild(titleText); // Release info var releaseText = new Text2('Released on Day ' + gameData.releaseDay, { size: 35, fill: 0x2196F3 }); releaseText.anchor.set(0.5, 0.5); releaseText.x = 1024; releaseText.y = 300; gameDetailView.addChild(releaseText); // Sales info var salesStatus = gameData.currentDailySales > 0 ? 'Active' : 'Ended'; var salesText = new Text2('Total Sales: ' + gameData.totalSales + ' copies (' + salesStatus + ')', { size: 35, fill: 0x4CAF50 }); salesText.anchor.set(0.5, 0.5); salesText.x = 1024; salesText.y = 380; gameDetailView.addChild(salesText); // Show total earned money (use actual price and revenue formula) var pricePerCopy = typeof gameData.price === "number" ? gameData.price : 1; var totalMoneyEarned = Math.floor((gameData.totalSales || 0) * pricePerCopy); var moneyText = new Text2('Total Money Earned: $' + totalMoneyEarned, { size: 32, fill: 0xFFC107 }); moneyText.anchor.set(0.5, 0.5); moneyText.x = 1024; moneyText.y = 420; gameDetailView.addChild(moneyText); // Score info var scoreText = new Text2('Score: ' + Math.floor(gameData.score) + ' / ' + gameData.targetScore, { size: 35, fill: 0xFFC107 }); scoreText.anchor.set(0.5, 0.5); scoreText.x = 1024; scoreText.y = 460; gameDetailView.addChild(scoreText); // Show price per copy if (typeof gameData.price === "number") { var priceText = new Text2('Oyun Fiyatı: $' + gameData.price, { size: 32, fill: 0xFFC107 }); priceText.anchor.set(0.5, 0.5); priceText.x = 1024; priceText.y = 500; gameDetailView.addChild(priceText); } // Genre info if (gameData.genre) { var genreText = new Text2('Genre: ' + gameData.genre.name, { size: 35, fill: 0x9C27B0 }); genreText.anchor.set(0.5, 0.5); genreText.x = 1024; genreText.y = 540; gameDetailView.addChild(genreText); } // Features title var featuresTitle = new Text2('Features Used:', { size: 40, fill: 0xFFFFFF }); featuresTitle.anchor.set(0.5, 0.5); featuresTitle.x = 1024; featuresTitle.y = 600; gameDetailView.addChild(featuresTitle); // Display features gameData.features.forEach(function (feature, index) { var featureText = new Text2('• ' + feature.name + ' (' + feature.type + ')', { size: 30, fill: 0x2196F3 }); featureText.anchor.set(0.5, 0.5); featureText.x = 1024; featureText.y = 680 + index * 40; gameDetailView.addChild(featureText); }); // Developers title var devsTitle = new Text2('Developed by:', { size: 40, fill: 0xFFFFFF }); devsTitle.anchor.set(0.5, 0.5); devsTitle.x = 1024; devsTitle.y = 1000; gameDetailView.addChild(devsTitle); // Display developers if stored if (gameData.developers) { gameData.developers.forEach(function (dev, index) { var devText = new Text2('• ' + dev.name + ' (' + dev.specialty + ', Skill: ' + dev.skill + ')', { size: 30, fill: 0xFFC107 }); devText.anchor.set(0.5, 0.5); devText.x = 1024; devText.y = 1080 + index * 40; gameDetailView.addChild(devText); }); } // Show reviews if present if (gameData.reviews && gameData.reviews.length > 0) { var reviewsTitle = new Text2('Reviews:', { size: 40, fill: 0xFFFFFF }); reviewsTitle.anchor.set(0.5, 0.5); reviewsTitle.x = 1024; reviewsTitle.y = 1400; gameDetailView.addChild(reviewsTitle); // Show average review score var avgScore = 0; for (var i = 0; i < gameData.reviews.length; i++) { avgScore += gameData.reviews[i].score; } avgScore = Math.round(avgScore / gameData.reviews.length); var avgScoreText = new Text2('Average Score: ' + avgScore + '/100', { size: 35, fill: avgScore >= 80 ? 0x4CAF50 : avgScore >= 60 ? 0xFFC107 : 0xE94560 }); avgScoreText.anchor.set(0.5, 0.5); avgScoreText.x = 1024; avgScoreText.y = 1460; gameDetailView.addChild(avgScoreText); // Show up to 10 reviews gameData.reviews.forEach(function (review, idx) { var reviewText = new Text2(review.company + ": " + review.score + "/100 - " + review.text, { size: 28, fill: 0xFFFFFF }); reviewText.anchor.set(0.5, 0.5); reviewText.x = 1024; reviewText.y = 1540 + idx * 60; gameDetailView.addChild(reviewText); }); } } function showHireMenu() { mainMenu.visible = false; hireMenu.visible = true; // Clear existing cards developerCards.forEach(function (card) { card.destroy(); }); developerCards = []; // Show available developers info var infoText = new Text2('Available Developers: ' + gameState.maxHireableDevelopers, { size: 35, fill: 0xFFC107 }); infoText.anchor.set(0.5, 0.5); infoText.x = 1024; infoText.y = 350; hireMenu.addChild(infoText); // Show main character as always hired var mainCharCard = new DeveloperCard(); mainCharCard.setDeveloper({ name: gameState.mainCharacter.name, specialty: "All", skill: gameState.mainCharacter.skill, cost: 0 }); mainCharCard.x = 1024; mainCharCard.y = 600; mainCharCard.developerData = { name: gameState.mainCharacter.name, specialty: "All", skill: gameState.mainCharacter.skill, cost: 0 }; mainCharCard.down = function () {}; hireMenu.addChild(mainCharCard); developerCards.push(mainCharCard); // Create developer cards as a grid, restrict hiring to studio level var availableDevelopers = developerPool.filter(function (dev) { return !gameState.developers.some(function (hired) { return hired.name === dev.name; }); }); // Only allow hiring up to maxHireableDevelopers (studioLevel+1, including main character) var canHireCount = gameState.maxHireableDevelopers - gameState.developers.length; if (canHireCount < 0) canHireCount = 0; // Arrange developer cards in a grid (3 per row) var cardsPerRow = 3; var cardSpacingX = 400; var cardSpacingY = 500; var startX = 1024 - cardSpacingX; var startY = 1000; availableDevelopers.forEach(function (dev, index) { var card = new DeveloperCard(); card.setDeveloper(dev); var col = index % cardsPerRow; var row = Math.floor(index / cardsPerRow); card.x = startX + col * cardSpacingX; card.y = startY + row * cardSpacingY; // If we can't hire more, gray out the card and disable click if (index >= canHireCount) { card.alpha = 0.4; card.down = function () { // Optionally show a message or play a sound LK.getSound('select').play(); }; // Show a message overlay var lockText = new Text2('Stüdyo seviyesini yükseltmelisin', { size: 28, fill: 0xE94560 }); lockText.anchor.set(0.5, 0.5); lockText.y = 160; card.addChild(lockText); } else { card.onClick = function (developer) { if (gameState.money >= developer.cost) { gameState.money -= developer.cost; gameState.developers.push({ name: developer.name, specialty: developer.specialty, skill: developer.skill, cost: developer.cost, assignedFeature: null // Only 1 feature can be assigned }); updateUI(); LK.getSound('hire').play(); showHireMenu(); // Refresh menu } }; } hireMenu.addChild(card); developerCards.push(card); }); } function showFeatureCategory(category) { projectMenu.visible = false; featureCategoryMenu.visible = true; categoryMenuTitle.setText(category + ' Features'); selectedFeaturesText.setText('Selected: ' + selectedFeatures.length + '/5'); // Clear existing feature cards for (var i = featureCategoryMenu.children.length - 1; i >= 0; i--) { var child = featureCategoryMenu.children[i]; if (child instanceof FeatureCard) { child.destroy(); } } // Get available features for this category var availableFeatures = featurePool.filter(function (feature) { return feature.type === category && (!feature.requiresResearch || gameState.researchedFeatures[feature.type].indexOf(feature.name) !== -1); }); // Create feature cards availableFeatures.forEach(function (feature, index) { var card = new FeatureCard(); card.setFeature(feature); card.x = 400 + index % 4 * 250; card.y = 500 + Math.floor(index / 4) * 350; // Set selected state if already selected var isSelected = selectedFeatures.some(function (f) { return f.name === feature.name; }); card.setSelected(isSelected); // Highlight trending features if (gameState.marketTrends.indexOf(feature.type) !== -1) { var trendIcon = LK.getAsset('trendIcon', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3 }); trendIcon.x = 100; trendIcon.y = -100; card.addChild(trendIcon); } card.onClick = function (clickedCard) { if (clickedCard.selected) { clickedCard.setSelected(false); selectedFeatures = selectedFeatures.filter(function (f) { return f !== clickedCard.featureData; }); } else if (selectedFeatures.length < 5) { clickedCard.setSelected(true); selectedFeatures.push(clickedCard.featureData); LK.getSound('select').play(); } // Update selected count selectedFeaturesText.setText('Selected: ' + selectedFeatures.length + '/5'); }; featureCategoryMenu.addChild(card); }); } function showProjectMenu() { // Allow project creation if there is at least one developer OR the main character (always present) if (gameState.developers.length === 0 && !gameState.mainCharacter) { return; } mainMenu.visible = false; projectMenu.visible = true; selectedFeatures = []; // Clear existing cards featureCards.forEach(function (card) { card.destroy(); }); featureCards = []; // Clear any existing category buttons for (var i = projectMenu.children.length - 1; i >= 0; i--) { var child = projectMenu.children[i]; if (child instanceof Button && child !== startDevelopmentBtn && child !== backFromProjectBtn) { child.destroy(); } } // Restore selected genre from gameState if available if (gameState.selectedGenre) { projectMenu.selectedGenre = gameState.selectedGenre; } else { projectMenu.selectedGenre = null; gameState.selectedGenre = null; } // Update selected genre text if (projectMenu.genreText) { projectMenu.genreText.setText('Selected Genre: ' + (projectMenu.selectedGenre ? projectMenu.selectedGenre.name : 'None')); } gameState.marketTrends = []; var trendTypes = ['Graphics', 'Sound', 'Gameplay']; var availableGenres = gameGenres.filter(function (genre) { return !genre.requiresResearch || gameState.researchedFeatures.GameGenres.indexOf(genre.name) !== -1; }); // Only allow market trends from researched genres var researchedGenres = gameGenres.filter(function (genre) { return !genre.requiresResearch || gameState.researchedFeatures.GameGenres.indexOf(genre.name) !== -1; }); var trend = trendTypes[Math.floor(Math.random() * trendTypes.length)]; gameState.marketTrends.push(trend); // Only pick genre trends from researched genres if (researchedGenres.length > 0) { var genreTrend = researchedGenres[Math.floor(Math.random() * researchedGenres.length)]; gameState.marketTrends.push(genreTrend.name + ' games'); } // Display trends at top var trendsText = new Text2('Market Trends: ' + gameState.marketTrends.join(' & ') + ' are hot!', { size: 35, fill: 0xFF5722 }); trendsText.anchor.set(0.5, 0.5); trendsText.x = 1024; trendsText.y = 400; projectMenu.addChild(trendsText); // --- Genre selection UI removed: genre can only be selected from Game Genres Research page --- // Show selected genre (if any) if (!projectMenu.selectedGenre) { projectMenu.selectedGenre = null; gameState.selectedGenre = null; } var genreText = new Text2('Selected Genre: ' + (projectMenu.selectedGenre ? projectMenu.selectedGenre.name : 'None'), { size: 35, fill: 0x9C27B0 }); genreText.anchor.set(0.5, 0.5); genreText.x = 1024; genreText.y = 480; projectMenu.addChild(genreText); projectMenu.genreText = genreText; // Total cost display var totalCostText = new Text2('Total Cost: $0', { size: 35, fill: 0x4CAF50 }); totalCostText.anchor.set(0.5, 0.5); totalCostText.x = 1024; totalCostText.y = 530; projectMenu.addChild(totalCostText); // Store totalCostText reference for later updates projectMenu.totalCostText = totalCostText; // --- Oyun Fiyatı (Game Price) UI --- if (!projectMenu.priceText) { // Default price per copy if (typeof projectMenu.selectedPrice !== "number") { projectMenu.selectedPrice = 1; // $1 per copy default } var priceText = new Text2('Oyun Fiyatı: $' + projectMenu.selectedPrice, { size: 35, fill: 0xFFC107 }); priceText.anchor.set(0.5, 0.5); priceText.x = 1024; priceText.y = 580; projectMenu.addChild(priceText); projectMenu.priceText = priceText; // Price select button var priceBtn = new Button(); priceBtn.setLabel('Oyun Fiyatı Seç'); priceBtn.x = 1024; priceBtn.y = 630; priceBtn.onClick = function () { // Show a simple price selection popup if (projectMenu.pricePopup) { projectMenu.pricePopup.destroy(); projectMenu.pricePopup = null; } var popup = new Container(); popup.x = 1024; popup.y = 900; var bg = LK.getAsset('card', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 1 }); bg.tint = 0x16213e; popup.addChild(bg); var title = new Text2('Oyun Fiyatı Seçin', { size: 40, fill: 0xFFC107 }); title.anchor.set(0.5, 0.5); title.y = -120; popup.addChild(title); // Price options var prices = [0.5, 1, 2, 3, 5, 10]; prices.forEach(function (p, idx) { var btn = new Button(); btn.setLabel('$' + p); btn.x = 0; btn.y = -40 + idx * 70; btn.onClick = function () { projectMenu.selectedPrice = p; projectMenu.priceText.setText('Oyun Fiyatı: $' + p); if (projectMenu.pricePopup) { projectMenu.pricePopup.destroy(); projectMenu.pricePopup = null; } LK.getSound('select').play(); }; popup.addChild(btn); }); // Close button var closeBtn = new Button(); closeBtn.setLabel('Kapat'); closeBtn.x = 0; closeBtn.y = 400; closeBtn.onClick = function () { if (projectMenu.pricePopup) { projectMenu.pricePopup.destroy(); projectMenu.pricePopup = null; } }; popup.addChild(closeBtn); projectMenu.pricePopup = popup; game.addChild(popup); }; projectMenu.addChild(priceBtn); projectMenu.priceBtn = priceBtn; } // --- Show selected Game Engine --- if (projectMenu.engineText) { projectMenu.engineText.destroy(); } var selectedEngineName = gameState.selectedGameEngine || "None"; var selectedEngineObj = null; for (var i = 0; i < gameEngines.length; i++) { if (gameEngines[i].name === selectedEngineName) { selectedEngineObj = gameEngines[i]; break; } } var engineTextLabel = 'Game Engine: ' + selectedEngineName; if (selectedEngineObj && selectedEngineObj.quality) { engineTextLabel += ' (+' + Math.round(selectedEngineObj.quality * 100) + '% quality)'; } var engineText = new Text2(engineTextLabel, { size: 35, fill: 0x4CAF50 }); engineText.anchor.set(0.5, 0.5); engineText.x = 1024; engineText.y = 700; projectMenu.addChild(engineText); projectMenu.engineText = engineText; // --- Platform Selection Button and Text --- if (projectMenu.platformText) { projectMenu.platformText.destroy(); } var selectedPlatformName = gameState.selectedPlatform || "PC"; var platformText = new Text2('Platform: ' + selectedPlatformName, { size: 35, fill: 0xFFC107 }); platformText.anchor.set(0.5, 0.5); platformText.x = 1024; platformText.y = 750; projectMenu.addChild(platformText); projectMenu.platformText = platformText; if (!projectMenu.platformBtn) { var platformBtn = new Button(); platformBtn.setLabel('Platform Seç'); platformBtn.x = 1024; platformBtn.y = 800; platformBtn.onClick = function () { // Show a simple popup to select from owned platforms if (projectMenu.platformPopup) { projectMenu.platformPopup.destroy(); projectMenu.platformPopup = null; } var popup = new Container(); popup.x = 1024; popup.y = 1100; var bg = LK.getAsset('card', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 1.2 }); bg.tint = 0x16213e; popup.addChild(bg); var title = new Text2('Platform Seçin', { size: 40, fill: 0xFFC107 }); title.anchor.set(0.5, 0.5); title.y = -180; popup.addChild(title); // List owned platforms var ownedPlatforms = []; for (var i = 0; i < platforms.length; i++) { var plat = platforms[i]; if (gameState.platforms && _typeof(gameState.platforms[plat.name]) === "object" && gameState.platforms[plat.name] !== null && gameState.platforms[plat.name].owned) { ownedPlatforms.push(plat.name); } } ownedPlatforms.forEach(function (platName, idx) { var btn = new Button(); btn.setLabel(platName + (gameState.selectedPlatform === platName ? ' (Seçili)' : '')); btn.x = 0; btn.y = -60 + idx * 90; if (gameState.selectedPlatform === platName) { btn.children[0].tint = 0xe94560; } btn.onClick = function () { gameState.selectedPlatform = platName; if (projectMenu.platformText) { projectMenu.platformText.setText('Platform: ' + platName); } if (projectMenu.platformPopup) { projectMenu.platformPopup.destroy(); projectMenu.platformPopup = null; } LK.getSound('select').play(); }; popup.addChild(btn); }); // Close button var closeBtn = new Button(); closeBtn.setLabel('Kapat'); closeBtn.x = 0; closeBtn.y = 300; closeBtn.onClick = function () { if (projectMenu.platformPopup) { projectMenu.platformPopup.destroy(); projectMenu.platformPopup = null; } }; popup.addChild(closeBtn); projectMenu.platformPopup = popup; game.addChild(popup); }; projectMenu.addChild(platformBtn); projectMenu.platformBtn = platformBtn; } else { projectMenu.platformBtn.y = 800; } // Move all project menu buttons 2 rows (240px) further down and re-align in a single vertical column var buttonY = 650 + 240 + 240; // 2 rows further down (total 480px down) var buttonSpacing = 120; // Feature category buttons var categories = ['Graphics', 'Sound', 'Gameplay']; categories.forEach(function (category, index) { var categoryBtn = new Button(); categoryBtn.setLabel(category + ' Features'); categoryBtn.x = 1024; categoryBtn.y = buttonY; categoryBtn.onClick = function () { showFeatureCategory(category); }; projectMenu.addChild(categoryBtn); buttonY += buttonSpacing; }); // Oyun Fiyatı button (move to next row) if (projectMenu.priceBtn) { projectMenu.priceBtn.y = buttonY; buttonY += buttonSpacing; } // Game Genres Research button (move to next row) if (!projectMenu.gameGenresResearchBtn) { var gameGenresResearchBtn = new Button(); gameGenresResearchBtn.setLabel('Game Genres Research'); gameGenresResearchBtn.x = 1024; gameGenresResearchBtn.y = buttonY; gameGenresResearchBtn.onClick = function () { showProjectGenresResearchMenu(); }; projectMenu.addChild(gameGenresResearchBtn); projectMenu.gameGenresResearchBtn = gameGenresResearchBtn; } else { projectMenu.gameGenresResearchBtn.y = buttonY; } } function startDevelopment() { if (selectedFeatures.length !== 5) { return; } // --- Require a researched genre to be selected before starting development --- var researchedGenres = gameState.researchedFeatures.GameGenres; // Fix: Check if selectedGenre is not null and its name is in researchedGenres or does not require research if (!projectMenu.selectedGenre || // Find the genre object in gameGenres function () { var genreObj = null; for (var i = 0; i < gameGenres.length; i++) { if (gameGenres[i].name === projectMenu.selectedGenre.name) { genreObj = gameGenres[i]; break; } } // If genreObj is not found, treat as not researched if (!genreObj) return true; // If genre does not require research, allow if (!genreObj.requiresResearch) return false; // If genre requires research, check if it's in researchedGenres return researchedGenres.indexOf(genreObj.name) === -1; }()) { // Show a notification or feedback var notification = new Container(); game.addChild(notification); var bg = LK.getAsset('card', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 0.6 }); bg.tint = 0xE94560; notification.addChild(bg); var text = new Text2('Please select a researched genre before starting!', { size: 35, fill: 0xFFFFFF }); text.anchor.set(0.5, 0.5); notification.addChild(text); notification.x = 1024; notification.y = 600; notification.alpha = 0; tween(notification, { alpha: 1 }, { duration: 500, onFinish: function onFinish() { LK.setTimeout(function () { tween(notification, { alpha: 0 }, { duration: 500, onFinish: function onFinish() { notification.destroy(); } }); }, 2000); } }); return; } // Calculate total cost var totalCost = 0; selectedFeatures.forEach(function (feature) { totalCost += feature.cost; }); // Check if player can afford if (gameState.money < totalCost) { return; } // Deduct costs gameState.money -= totalCost; updateUI(); projectMenu.visible = false; developmentScreen.visible = true; // Show selected engine in development screen if (developmentScreen.engineText) { developmentScreen.engineText.destroy(); } var selectedEngineName = gameState.selectedGameEngine || "None"; var selectedEngineObj = null; for (var i = 0; i < gameEngines.length; i++) { if (gameEngines[i].name === selectedEngineName) { selectedEngineObj = gameEngines[i]; break; } } var engineTextLabel = 'Game Engine: ' + selectedEngineName; if (selectedEngineObj && selectedEngineObj.quality) { engineTextLabel += ' (+' + Math.round(selectedEngineObj.quality * 100) + '% quality)'; } var engineText = new Text2(engineTextLabel, { size: 35, fill: 0x4CAF50 }); engineText.anchor.set(0.5, 0.5); engineText.x = 1024; engineText.y = 300; developmentScreen.addChild(engineText); developmentScreen.engineText = engineText; // Display trends for (var i = trendsContainer.children.length - 1; i > 0; i--) { trendsContainer.children[i].destroy(); } gameState.marketTrends.forEach(function (trend, index) { var trendText = new Text2(trend + ' is trending!', { size: 30, fill: 0xFF5722 }); trendText.anchor.set(0.5, 0.5); trendText.y = 40 + index * 35; trendsContainer.addChild(trendText); }); // Calculate target score var baseTarget = 100; targetScoreText.setText('Target Score: ' + baseTarget); // Use selected genre from projectMenu var selectedGenre = projectMenu.selectedGenre || null; // Start project gameState.currentProject = { features: selectedFeatures, targetScore: baseTarget, currentScore: 0, developmentSpeed: 0, genre: selectedGenre, price: typeof projectMenu.selectedPrice === "number" ? projectMenu.selectedPrice : 1 }; // Assign features to developers (main character is always included and can contribute to all features) var assignedDevelopers = []; var assignedFeatures = []; // Always include main character as a developer var allDevs = [{ name: gameState.mainCharacter.name, specialty: "All", skill: gameState.mainCharacter.skill, featurePoints: Object.assign({}, gameState.mainCharacter.featurePoints) }].concat(gameState.developers.map(function (dev) { return { name: dev.name, specialty: dev.specialty, skill: dev.skill, assignedFeature: null }; })); // Assign features: each feature is assigned to a developer, but main character always contributes to all var devAssignments = []; selectedFeatures.forEach(function (feature, idx) { // Assign to next available developer (skip main character for assignment, but main character always contributes) var devIdx = (idx + 1) % allDevs.length; if (devIdx === 0 && allDevs.length > 1) devIdx = 1; // avoid assigning all to main character devAssignments.push({ dev: allDevs[devIdx], feature: feature }); allDevs[devIdx].assignedFeature = feature.name; }); // Calculate development speed var totalSpeed = 0; // Main character always contributes to all features selectedFeatures.forEach(function (feature) { var fp = gameState.mainCharacter.featurePoints[feature.type] || 1; totalSpeed += (gameState.mainCharacter.skill + fp) * 0.5; }); // Other developers contribute to their assigned feature devAssignments.forEach(function (assignment) { if (assignment.dev.name !== gameState.mainCharacter.name) { totalSpeed += assignment.dev.skill * 0.5; } }); gameState.currentProject.developmentSpeed = totalSpeed; gameState.currentProject.devAssignments = devAssignments; LK.getSound('develop').play(); releaseBtn.visible = false; progressBarFill.scaleX = 0; } function releaseGame() { var project = gameState.currentProject; // Calculate final score with bonuses var finalScore = project.currentScore; // --- Game Engine quality bonus --- // Each 0.05 quality = +5% quality bonus, max 20% (0.20) var engineBonus = 0; if (gameState.selectedGameEngine) { for (var i = 0; i < gameEngines.length; i++) { if (gameEngines[i].name === gameState.selectedGameEngine) { // Clamp to max 0.20 (20%) engineBonus = Math.min(gameEngines[i].quality || 0, 0.20); break; } } } if (engineBonus > 0) { // Each 0.05 = 5% bonus finalScore *= 1 + Math.floor(engineBonus * 20) * 0.05; } // Trend bonus var trendMultiplier = 1; project.features.forEach(function (feature) { if (gameState.marketTrends.indexOf(feature.type) !== -1) { finalScore *= 1.5; trendMultiplier += 0.3; } }); // Genre bonus if (project.genre) { finalScore *= project.genre.baseMultiplier; if (gameState.marketTrends.some(function (trend) { return trend.indexOf(project.genre.name) !== -1; })) { finalScore *= 1.3; trendMultiplier += 0.4; } } // Calculate initial sales potential var baseSalesMultiplier = 20; if (finalScore >= project.targetScore) { baseSalesMultiplier = 40; } // Price effect on sales: higher price = lower sales, lower price = higher sales var priceSalesMultiplier = 1; if (project.price) { if (project.price > 1) { priceSalesMultiplier = 1 / (0.7 + (project.price - 1) * 0.5); // $2 = ~0.67x, $5 = ~0.29x if (priceSalesMultiplier < 0.15) priceSalesMultiplier = 0.15; } else if (project.price < 1) { priceSalesMultiplier = 1 + (1 - project.price) * 0.7; // $0.5 = 1.35x } } // --- Ava: Reduce sales multiplier if features and review score are low and price is high --- var featureQuality = 0; for (var i = 0; i < project.features.length; i++) { featureQuality += project.features[i].basePoints || 0; } var avgFeatureQuality = featureQuality / project.features.length; var reviewScoreForPenalty = 0; var scoreRatio = finalScore / project.targetScore; if (scoreRatio >= 1.5) reviewScoreForPenalty = 95;else if (scoreRatio >= 1.2) reviewScoreForPenalty = 85;else if (scoreRatio >= 1.0) reviewScoreForPenalty = 75;else if (scoreRatio >= 0.8) reviewScoreForPenalty = 60;else reviewScoreForPenalty = 40; // If price is high, but features and review are low, apply a penalty to sales var pricePenaltyMultiplier = 1; if (project.price > 2) { // If both feature quality and review are low, penalize more if (avgFeatureQuality < 5 && reviewScoreForPenalty < 70) { pricePenaltyMultiplier = 0.5 - Math.min((project.price - 2) * 0.1, 0.3); // up to -30% more penalty } else if (avgFeatureQuality < 6 || reviewScoreForPenalty < 75) { pricePenaltyMultiplier = 0.7 - Math.min((project.price - 2) * 0.05, 0.2); // up to -20% more penalty } // Never less than 0.2x if (pricePenaltyMultiplier < 0.2) pricePenaltyMultiplier = 0.2; } // Find selected platform and apply its salesBonus var selectedPlatform = null; for (var i = 0; i < platforms.length; i++) { if (platforms[i].name === gameState.selectedPlatform) { selectedPlatform = platforms[i]; break; } } var platformSalesBonus = selectedPlatform && selectedPlatform.salesBonus ? 1 + selectedPlatform.salesBonus : 1; var initialDailySales = Math.floor(finalScore / project.targetScore * baseSalesMultiplier * trendMultiplier * priceSalesMultiplier * pricePenaltyMultiplier * platformSalesBonus); var gameName = currentGameName && currentGameName.length > 0 ? currentGameName : 'Game #' + (gameState.completedGames + 1); // --- Review and score system --- var reviewCompanies = ["IGN", "GameSpot", "Polygon", "Eurogamer", "Kotaku", "PC Gamer", "Game Informer", "Destructoid", "Edge", "Metacritic"]; var reviews = []; var reviewScore = 0; var genreTrend = gameState.marketTrends.find(function (trend) { return project.genre && trend.indexOf(project.genre.name) !== -1; }); var featureTrend = gameState.marketTrends.indexOf(project.features[0].type) !== -1 || gameState.marketTrends.indexOf(project.features[1].type) !== -1 || gameState.marketTrends.indexOf(project.features[2].type) !== -1 || gameState.marketTrends.indexOf(project.features[3].type) !== -1 || gameState.marketTrends.indexOf(project.features[4].type) !== -1; // Calculate review score (0-100) var scoreRatio = finalScore / project.targetScore; if (scoreRatio >= 1.5) reviewScore = 95 + Math.floor(Math.random() * 6);else if (scoreRatio >= 1.2) reviewScore = 85 + Math.floor(Math.random() * 10);else if (scoreRatio >= 1.0) reviewScore = 75 + Math.floor(Math.random() * 10);else if (scoreRatio >= 0.8) reviewScore = 60 + Math.floor(Math.random() * 10);else reviewScore = 40 + Math.floor(Math.random() * 20); // If genre matches trend, boost score if (genreTrend) reviewScore += 5; if (featureTrend) reviewScore += 5; // --- Price effect on review score --- if (project.price) { // $1 is neutral, higher price reduces review, lower price increases if (project.price > 1) { reviewScore -= Math.floor((project.price - 1) * 4); // -4 puan/extra dollar } else if (project.price < 1) { reviewScore += Math.floor((1 - project.price) * 6); // +6 puan/discounted dollar } } if (reviewScore > 100) reviewScore = 100; if (reviewScore < 0) reviewScore = 0; // Generate reviews for (var i = 0; i < reviewCompanies.length; i++) { var company = reviewCompanies[i]; var text = ""; var score = reviewScore + Math.floor(Math.random() * 7 - 3); if (score > 100) score = 100; if (score < 0) score = 0; // Pick a feature to highlight or criticize var highlightFeature = project.features[Math.floor(Math.random() * project.features.length)]; var highlightDev = gameState.developers.length > 0 ? gameState.developers[Math.floor(Math.random() * gameState.developers.length)] : null; // Compose unique review text based on score and game details if (score >= 90) { var phrases = ["A masterpiece! " + gameName + " sets a new standard for " + (project.genre ? project.genre.name : "games") + ".", "Unmissable! " + gameName + " excels in " + highlightFeature.name + " and delivers a flawless experience.", "Stunning achievement. " + gameName + " is a triumph in " + highlightFeature.type + "."]; text = phrases[i % phrases.length]; } else if (score >= 80) { var phrases = ["Excellent! " + gameName + " is a must-play for fans of " + (project.genre ? project.genre.name : "the genre") + ".", gameName + " impresses with its " + highlightFeature.name + " and strong " + highlightFeature.type + ".", "A great effort, especially in " + highlightFeature.type + "."]; text = phrases[i % phrases.length]; } else if (score >= 70) { var phrases = [gameName + " is a solid experience with some great moments.", "Enjoyable overall, but " + highlightFeature.name + " could be even better.", "Good fun, though " + (highlightDev ? highlightDev.name + "'s work on " + highlightFeature.name : "some features") + " stands out."]; text = phrases[i % phrases.length]; } else if (score >= 60) { var phrases = [gameName + " is decent, but could use more polish.", "Average experience. " + highlightFeature.name + " is a bit underwhelming.", "Not bad, but " + (highlightDev ? highlightDev.name + "'s " + highlightFeature.type : "the team") + " could improve."]; text = phrases[i % phrases.length]; } else if (score >= 50) { var phrases = [gameName + " struggles to impress, but has a few redeeming qualities.", "Mediocre. " + highlightFeature.name + " doesn't quite hit the mark.", "Some fun to be had, but " + highlightFeature.type + " needs work."]; text = phrases[i % phrases.length]; } else { var phrases = ["Disappointing. " + gameName + " fails to deliver.", "A letdown. " + highlightFeature.name + " is poorly implemented.", "Not recommended. " + (highlightDev ? highlightDev.name + "'s " + highlightFeature.type : "the team") + " missed the mark."]; text = phrases[i % phrases.length]; } // If genre/feature matches trend, make review more positive if ((genreTrend || featureTrend) && score >= 70) { var trendPhrases = [" Riding the latest trends paid off!", " Trendy and timely, a smart move.", " The market will love this!"]; text += trendPhrases[i % trendPhrases.length]; } if (!genreTrend && !featureTrend && score < 70) { var missPhrases = [" Missed the mark on current trends.", " Feels outdated compared to what's hot.", " Lacks the innovation players want."]; text += missPhrases[i % missPhrases.length]; } // Add a tip or suggestion for low scores if (score < 60) { var tipPhrases = [" Consider focusing more on " + highlightFeature.type + " next time.", " A stronger " + highlightFeature.type + " could help future games.", " More polish in " + highlightFeature.name + " is needed."]; text += " " + tipPhrases[i % tipPhrases.length]; } reviews.push({ company: company, score: score, text: text }); } var releasedGame = { name: gameName, releaseDay: gameState.currentDay, score: finalScore, targetScore: project.targetScore, initialDailySales: initialDailySales, currentDailySales: initialDailySales, totalSales: 0, features: project.features, trendBonus: trendMultiplier, price: project.price || 1, // Add main character as a developer in the released game developers: [{ name: gameState.mainCharacter.name, specialty: "All", skill: gameState.mainCharacter.skill }].concat(gameState.developers.slice()), genre: project.genre, reviews: reviews, reviewScore: reviewScore }; // Reset game name after use currentGameName = ''; gameNameDisplay.setText(''); gameState.releasedGames.push(releasedGame); // Success check if (finalScore >= project.targetScore) { gameState.money += Math.floor(finalScore * 0.00025); // 95% less gameState.completedGames++; LK.getSound('success').play(); LK.setScore(gameState.completedGames); if (gameState.completedGames >= 10) { LK.showYouWin(); } } else { gameState.money += Math.floor(finalScore * 0.0000625); // 95% less } LK.getSound('release').play(); // Reset gameState.currentProject = null; developmentScreen.visible = false; mainMenu.visible = true; updateUI(); updateSalesLog(); } // Game update var dayTimer = 0; game.update = function () { // Handle research progress if (gameState.currentResearch) { gameState.currentResearch.timeRemaining--; if (gameState.currentResearch.timeRemaining <= 0) { // Research complete var research = gameState.currentResearch; if (research.category === 'GameEngines') { // Find engine and mark as researched for (var i = 0; i < gameEngines.length; i++) { if (gameEngines[i].name === research.name) { gameEngines[i].researched = true; break; } } } else if (research.category === 'Platforms') { // Mark platform as researched if (gameState.platforms && gameState.platforms[research.name]) { gameState.platforms[research.name].researched = true; } } else { gameState.researchedFeatures[research.category].push(research.name); } gameState.currentResearch = null; LK.getSound('success').play(); // Show notification var notification = new Container(); game.addChild(notification); var bg = LK.getAsset('card', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 0.8 }); bg.tint = 0x4CAF50; notification.addChild(bg); var text = new Text2('Research Complete: ' + research.name, { size: 35, fill: 0xFFFFFF }); text.anchor.set(0.5, 0.5); notification.addChild(text); notification.x = 1024; notification.y = 600; notification.alpha = 0; tween(notification, { alpha: 1 }, { duration: 500, onFinish: function onFinish() { LK.setTimeout(function () { tween(notification, { alpha: 0 }, { duration: 500, onFinish: function onFinish() { notification.destroy(); } }); }, 2000); } }); } } // Day progression (every 3 seconds = 1 day) dayTimer++; if (dayTimer >= 180) { // 60 fps * 3 seconds dayTimer = 0; gameState.currentDay++; updateUI(); // Process game sales for (var i = gameState.releasedGames.length - 1; i >= 0; i--) { var releasedGame = gameState.releasedGames[i]; var daysSinceRelease = gameState.currentDay - releasedGame.releaseDay; // Calculate sales decline var declineRate = 0.75; // Base 25% daily decline // Better games decline slower if (releasedGame.score >= releasedGame.targetScore * 1.5) { declineRate = 0.85; } else if (releasedGame.score >= releasedGame.targetScore) { declineRate = 0.80; } // Apply trend bonus to decline rate declineRate += (releasedGame.trendBonus - 1) * 0.03; declineRate = Math.min(declineRate, 0.90); // Calculate review score multiplier (0.3x for <60, 1x for 60-74, 1.7x for 75-89, 2.5x for 90+) // Ava: Review scores now have a much stronger effect on sales! var reviewMultiplier = 1; if (releasedGame.reviewScore !== undefined) { if (releasedGame.reviewScore >= 90) reviewMultiplier = 2.5;else if (releasedGame.reviewScore >= 75) reviewMultiplier = 1.7;else if (releasedGame.reviewScore >= 60) reviewMultiplier = 1;else reviewMultiplier = 0.3; } // Calculate current day sales releasedGame.currentDailySales = Math.floor(releasedGame.initialDailySales * Math.pow(declineRate, daysSinceRelease) * reviewMultiplier); // Add to total sales and money if (releasedGame.currentDailySales > 0) { releasedGame.totalSales += releasedGame.currentDailySales; var pricePerCopy = releasedGame.price || 1; var revenue = Math.floor(releasedGame.currentDailySales * pricePerCopy); // 100% of price per copy to player gameState.money += revenue; } else { // Game no longer selling - remove from market var removedGame = gameState.releasedGames.splice(i, 1)[0]; gameState.gameHistory.push(removedGame); // Show notification var notification = new Container(); game.addChild(notification); var bg = LK.getAsset('card', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 1.2 }); bg.tint = 0x0f3460; notification.addChild(bg); var titleText = new Text2(removedGame.name + ' removed from market', { size: 35, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.y = -30; notification.addChild(titleText); var salesText = new Text2('Total copies sold: ' + removedGame.totalSales, { size: 30, fill: 0x4CAF50 }); salesText.anchor.set(0.5, 0.5); salesText.y = 20; notification.addChild(salesText); notification.x = 1024; notification.y = 1366; notification.alpha = 0; // Animate notification tween(notification, { alpha: 1, y: 1000 }, { duration: 500, onFinish: function onFinish() { LK.setTimeout(function () { tween(notification, { alpha: 0 }, { duration: 500, onFinish: function onFinish() { notification.destroy(); } }); }, 2000); } }); } } updateUI(); updateSalesLog(); } if (gameState.currentProject && developmentScreen.visible) { var project = gameState.currentProject; // Development progress if (project.currentScore < project.targetScore) { // --- Ava: Make score gain speed depend on studio level and total developer skill --- // Calculate base points per tick var pointsPerTick = project.developmentSpeed / 30; // Calculate total skill of all developers (including main character) var totalDevSkill = gameState.mainCharacter.skill; for (var i = 0; i < gameState.developers.length; i++) { totalDevSkill += gameState.developers[i].skill; } // Studio level bonus: higher level = faster progress var studioLevelBonus = 1 + (gameState.studioLevel - 1) * 0.15; // +15% per studio level above 1 // Skill bonus: more total skill = faster progress, but with diminishing returns var skillBonus = 0.5 + Math.log(1 + totalDevSkill) * 0.5; // log curve, min 0.5x // Feature synergy bonus (as before) var synergy = 1; if (gameState.mainCharacter.featurePoints) { project.features.forEach(function (feature) { if (gameState.mainCharacter.featurePoints[feature.type] && gameState.mainCharacter.featurePoints[feature.type] > 0) { synergy += 0.1; } }); } project.features.forEach(function (feature) { gameState.developers.forEach(function (dev) { if (dev.specialty === feature.type) { synergy += 0.1; } }); }); // Final points per tick: base * studioLevelBonus * skillBonus * synergy var finalPointsPerTick = pointsPerTick * studioLevelBonus * skillBonus * synergy; // Clamp minimum progress to avoid being stuck at 0 if (finalPointsPerTick < 0.01) finalPointsPerTick = 0.01; project.currentScore += finalPointsPerTick; // Update UI currentScoreText.setText('Current Score: ' + Math.floor(project.currentScore)); var progress = Math.min(project.currentScore / project.targetScore, 1); progressBarFill.scaleX = progress; // Show release button when ready if (progress >= 1 && !releaseBtn.visible) { releaseBtn.visible = true; tween(releaseBtn, { scaleX: 1.1, scaleY: 1.1 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { tween(releaseBtn, { scaleX: 1, scaleY: 1 }, { duration: 500 }); } }); } } } // Check game over if (gameState.money < 100 && gameState.developers.length === 0 && !gameState.currentProject) { LK.showGameOver(); } }; // Global Back Button (bottom) var globalBackBtn = new Button(); globalBackBtn.setLabel('Geri'); // Place at bottom center, matching other menu button size (400x100) globalBackBtn.x = 1024; globalBackBtn.y = 2600; globalBackBtn.visible = false; LK.gui.bottom.addChild(globalBackBtn); // Global Back Button (top) var globalBackBtnTop = new Button(); globalBackBtnTop.setLabel('Geri'); globalBackBtnTop.x = 1024; globalBackBtnTop.y = 100; globalBackBtnTop.visible = false; LK.gui.top.addChild(globalBackBtnTop); // Helper to check if any menu except mainMenu is visible function isAnyMenuOpen() { return upgradeMenu.visible || researchMenu.visible || researchCategoryMenu.visible || nameGameMenu.visible || allGamesMenu.visible || gameDetailView.visible || hireMenu.visible || projectMenu.visible || featureCategoryMenu.visible || developmentScreen.visible; } // Helper to close the topmost open menu and return to mainMenu function closeCurrentMenu() { if (upgradeMenu.visible) { upgradeMenu.visible = false; mainMenu.visible = true; } else if (researchCategoryMenu.visible) { researchCategoryMenu.visible = false; researchMenu.visible = true; } else if (researchMenu.visible) { researchMenu.visible = false; mainMenu.visible = true; } else if (nameGameMenu.visible) { nameGameMenu.visible = false; mainMenu.visible = true; gameNameInput.setText(''); currentGameName = ''; } else if (allGamesMenu.visible) { allGamesMenu.visible = false; mainMenu.visible = true; } else if (gameDetailView.visible) { gameDetailView.visible = false; allGamesMenu.visible = true; } else if (hireMenu.visible) { hireMenu.visible = false; mainMenu.visible = true; } else if (featureCategoryMenu.visible) { featureCategoryMenu.visible = false; projectMenu.visible = true; // Update total cost in project menu var totalCost = 0; selectedFeatures.forEach(function (f) { totalCost += f.cost; }); if (projectMenu.totalCostText) { projectMenu.totalCostText.setText('Total Cost: $' + totalCost); } } else if (projectMenu.visible) { projectMenu.visible = false; mainMenu.visible = true; selectedFeatures = []; featureCards.forEach(function (card) { card.setSelected(false); }); } else if (developmentScreen.visible) { developmentScreen.visible = false; mainMenu.visible = true; } } // Attach handler to global back button globalBackBtn.onClick = function () { closeCurrentMenu(); }; globalBackBtnTop.onClick = function () { closeCurrentMenu(); }; // Show/hide global back button depending on menu state function updateGlobalBackBtn() { // Show if any menu except mainMenu is visible var show = isAnyMenuOpen() && !mainMenu.visible; globalBackBtn.visible = show; globalBackBtnTop.visible = show; } // Patch all menu show functions to update global back button var _showUpgradeMenu = showUpgradeMenu; showUpgradeMenu = function showUpgradeMenu() { _showUpgradeMenu(); updateGlobalBackBtn(); }; var _showPlatformMenu = showPlatformMenu; showPlatformMenu = function showPlatformMenu() { _showPlatformMenu(); updateGlobalBackBtn(); }; var _showResearchMenu = showResearchMenu; showResearchMenu = function showResearchMenu() { _showResearchMenu(); updateGlobalBackBtn(); }; var _showAllGamesMenu = showAllGamesMenu; showAllGamesMenu = function showAllGamesMenu() { _showAllGamesMenu(); updateGlobalBackBtn(); }; var _showHireMenu = showHireMenu; showHireMenu = function showHireMenu() { _showHireMenu(); updateGlobalBackBtn(); }; var _showProjectMenu = showProjectMenu; showProjectMenu = function showProjectMenu() { _showProjectMenu(); updateGlobalBackBtn(); }; var _showFeatureCategory = showFeatureCategory; showFeatureCategory = function showFeatureCategory(category) { _showFeatureCategory(category); updateGlobalBackBtn(); }; var _showResearchCategory = showResearchCategory; showResearchCategory = function showResearchCategory(category) { _showResearchCategory(category); updateGlobalBackBtn(); }; var _showNameGameMenu = showNameGameMenu; showNameGameMenu = function showNameGameMenu() { _showNameGameMenu(); updateGlobalBackBtn(); }; var _showGameDetail = showGameDetail; showGameDetail = function showGameDetail(gameData) { _showGameDetail(gameData); updateGlobalBackBtn(); }; // Patch all menu back/close buttons to update global back button function patchBackBtn(btn, closeFn) { var old = btn.onClick; btn.onClick = function () { if (old) old(); updateGlobalBackBtn(); }; } patchBackBtn(backFromUpgradeBtn); patchBackBtn(researchBackBtn); patchBackBtn(categoryBackBtn); patchBackBtn(backFromNameBtn); patchBackBtn(backFromAllGamesBtn); patchBackBtn(detailBackBtn); patchBackBtn(backFromHireBtn); patchBackBtn(backFromProjectBtn); patchBackBtn(categoryBackBtn); patchBackBtn(researchBackBtn); patchBackBtn(categoryBackBtn); // Also update on developmentScreen close (release) var _releaseGame = releaseGame; releaseGame = function releaseGame() { _releaseGame(); updateGlobalBackBtn(); }; // Also update on game update (in case of state changes) var _updateUI = updateUI; updateUI = function updateUI() { _updateUI(); updateGlobalBackBtn(); }; // Initialize updateUI(); updateGlobalBackBtn();
===================================================================
--- original.js
+++ change.js
@@ -2634,10 +2634,10 @@
projectMenu.platformBtn = platformBtn;
} else {
projectMenu.platformBtn.y = 800;
}
- // Create all project menu buttons in a single vertical column, one per row
- var buttonY = 650 + 240; // Move all buttons 2 rows (240px) down
+ // Move all project menu buttons 2 rows (240px) further down and re-align in a single vertical column
+ var buttonY = 650 + 240 + 240; // 2 rows further down (total 480px down)
var buttonSpacing = 120;
// Feature category buttons
var categories = ['Graphics', 'Sound', 'Gameplay'];
categories.forEach(function (category, index) {