User prompt
Make sure videos are watched according to the number of subscribers. When the number of subscribers is low, videos will be watched less, but if the player chooses a trending category, the views will be 50% more.
User prompt
When you press the record video button in the record video panel, the x button in the top right will also disappear from the screen.
User prompt
Let's earn money in the game between $3-5 for every 1000 views.
User prompt
Can you make it so that when the numbers in the counters such as views, subscribers and money exceed 1000, they are arranged as 1k, and when they exceed 1,000,000 million, they are arranged as 1m? did this for me for my code
User prompt
For viewers counter use viewersicon assets.
User prompt
Please fix the bug: 'Uncaught ReferenceError: cancelBtn is not defined' in or related to this line: 'cancelBtn.destroy();' Line Number: 482
User prompt
Make sure that the videos you shoot are watched in realistic numbers and update the viewer counter accordingly, and also let the number of subscribers be based on the number of views, so that 1 subscriber comes for every 200-300 views.
User prompt
You need to move the viewer counter up a bit, it should be at the same height as the subscriber counter and money.
User prompt
Place the viewer counter next to the subscriber counter, exactly in the middle of the money and subscriber counter.
User prompt
Add a view count counter next to your subscriber count.
User prompt
Remove the cancel button from the record video panel and add an x to the top right of the panel so that the panel can be closed when that text is clicked.
User prompt
Change the background of the enter video title text in the record video panel by creating a new inputfield background.
User prompt
remove the giant numbers next to the subscriber counter.
User prompt
For an empty loading bar design in the game, use the loadingbarempty assets. For a full loading bar design in the game, use the loadingbarfull assets.
User prompt
Please fix the bug: 'Timeout.tick error: videoCategories is not defined' in or related to this line: 'if (videoCategories && videoCategories.length > 1) {' Line Number: 123
User prompt
Please fix the bug: 'Uncaught ReferenceError: panelText is not defined' in or related to this line: 'titleInputBg.y = panelText.y + 200; // more space below title' Line Number: 322
User prompt
Remove the record new video text in the record video panel.
User prompt
Place the text that says the day and time in the game and the pause/resume button a little lower.
User prompt
One of the categories should be marked as a "Trending" category. This trending category should change once every 7 in-game days.
User prompt
Make the random video titles in the record video panel randomly write to the selected category.
User prompt
Make sure that a record video panel cannot be opened while another record video panel is open.
User prompt
Expand the record video panel a little more and arrange the category buttons so that they do not overflow the record video panel. For example, if the first row does not fit, continue listing them on the row below.
User prompt
Please fix the bug: 'Uncaught ReferenceError: categoryBg is not defined' in or related to this line: 'confirmBtn.y = categoryBg.y + 200; // more space below category' Line Number: 380
User prompt
Instead of making the categories in the record video panel as a list, list them as separate buttons.
User prompt
Prevent the progress bar from appearing full when it first appears and then decreasing and filling up again. Prevent the progress bar from starting at 0 and continuing to fill up as shown. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Energy bar class var EnergyBar = Container.expand(function () { var self = Container.call(this); self.bg = self.attachAsset('energyBarBg', { anchorX: 0, anchorY: 0.5 }); self.fill = self.attachAsset('energyBarFill', { anchorX: 0, anchorY: 0.5 }); self.fill.x = 0; self.bg.x = 0; self.bg.y = 0; self.fill.y = 0; self.maxWidth = self.fill.width; self.set = function (ratio) { if (ratio < 0) ratio = 0; if (ratio > 1) ratio = 1; self.fill.width = self.maxWidth * ratio; }; return self; }); // Button class for all clickable actions var GameButton = Container.expand(function () { var self = Container.call(this); self.bg = null; self.label = null; self.action = null; self.enabled = true; self.setButton = function (assetId, labelText, color, width, height) { self.bg = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.bg.width = width; self.bg.height = height; // Modern look: more pronounced rounded corners and soft drop shadow self.bg.cornerRadius = Math.min(width, height) * 0.28; self.bg.shadow = { color: 0x111111, blur: 36, offsetX: 0, offsetY: 16, alpha: 0.32 }; self.label = new Text2(labelText, { size: 80, fill: color, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma", dropShadow: true, dropShadowColor: "#222", dropShadowBlur: 12, dropShadowDistance: 2 }); self.label.anchor.set(0.5, 0.5); self.addChild(self.label); }; self.setEnabled = function (val) { self.enabled = val; if (self.bg) { self.bg.alpha = val ? 1 : 0.4; } }; self.down = function (x, y, obj) { if (!self.enabled) return; if (typeof self.action === 'function') { self.action(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // --- Trending Category State --- // --- Video Categories (must be defined before use in updateTrendingCategory) --- var videoCategories = ["Vlog", "Challenge", "Reaction", "Tutorial", "Unboxing", "Gaming", "Music", "Comedy", "Q&A", "Other"]; var selectedCategoryIdx = 0; // Studio background (simple box for now) // --- Game State Variables --- var trendingCategoryIdx = 0; var trendingCategoryDay = 1; // The day this trending category started function updateTrendingCategory() { // Pick a new trending category index, different from the current one if possible var oldIdx = trendingCategoryIdx; if (videoCategories && videoCategories.length > 1) { var newIdx; do { newIdx = Math.floor(Math.random() * videoCategories.length); } while (newIdx === oldIdx); trendingCategoryIdx = newIdx; } else { trendingCategoryIdx = 0; } trendingCategoryDay = gameDay; } // Video button // Edit button // Promote button // Upgrade button // Energy bar background // Energy bar fill // Subscriber icon // Money icon // Sound for making a video var subscribers = 0; var viewCount = 0; var money = 0; var videoQuality = 1; // upgrades increase this var editSkill = 1; // upgrades increase this var promoteSkill = 1; // upgrades increase this var videoCount = 0; var upgradeCost = 20; var upgradeLevel = 1; // --- Time Mechanics --- var gameHour = 8; // Start at 8:00 var gameDay = 1; var isTimePaused = false; var timeTimer = null; var timeProcess = null; // {type: 'record'|'edit'|'promote', hoursLeft: int, onFinish: fn} // --- UI Elements --- var studioBg = LK.getAsset('studioBg', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(studioBg); // --- Time Display --- var timeTxt = new Text2('Day 1, 08:00', { size: 80, fill: 0xFFFFFF }); timeTxt.anchor.set(0.5, 0.5); timeTxt.x = 2048 / 2; timeTxt.y = 300; game.addChild(timeTxt); // --- Pause/Resume Button --- var pauseBtn = new GameButton(); pauseBtn.setButton('editBtn', 'Pause', "#fff", 320, 120); pauseBtn.x = 2048 / 2 + 520; pauseBtn.y = 300; pauseBtn.action = function () { isTimePaused = !isTimePaused; pauseBtn.label.setText(isTimePaused ? "Resume" : "Pause"); }; game.addChild(pauseBtn); // Subscribers display var subIcon = LK.getAsset('subIcon', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2 - 520, y: 140 }); game.addChild(subIcon); var subTxt = new Text2('0', { size: 64, fill: 0xFFFFFF }); subTxt.anchor.set(0, 0.5); subTxt.x = subIcon.x + 70; subTxt.y = subIcon.y; game.addChild(subTxt); // Money display var moneyIcon = LK.getAsset('moneyIcon', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2 + 320, y: 140 }); game.addChild(moneyIcon); var moneyTxt = new Text2('$0', { size: 64, fill: 0xFFE066 }); moneyTxt.anchor.set(0, 0.5); moneyTxt.x = moneyIcon.x + 70; moneyTxt.y = moneyIcon.y; game.addChild(moneyTxt); // View count display (use viewersicon asset for the viewers counter icon) // Place view counter exactly in the middle between subIcon and moneyIcon var viewAreaCenterX = (subIcon.x + moneyIcon.x) / 2; var viewIcon = LK.getAsset('viewersicon', { anchorX: 0.5, anchorY: 0.5, x: viewAreaCenterX - 40, y: 110 }); game.addChild(viewIcon); var viewTxt = new Text2('0', { size: 64, fill: 0x00e0ff }); viewTxt.anchor.set(0, 0.5); viewTxt.x = viewIcon.x + 70; viewTxt.y = viewIcon.y; game.addChild(viewTxt); // --- Action Buttons --- // Button layout: stack vertically, bigger, with spacing var btnW = 540; var btnH = 220; var btnSpacingY = 60; var btnStartY = 900; // Make Video Button var makeVideoBtn = new GameButton(); makeVideoBtn.setButton('videoBtn', 'Record Video', "#fff", btnW, btnH); makeVideoBtn.x = 2048 / 2; makeVideoBtn.y = btnStartY; // Edit Button var editBtn = new GameButton(); editBtn.setButton('editBtn', 'Edit Video', "#fff", btnW, btnH); editBtn.x = 2048 / 2; editBtn.y = makeVideoBtn.y + btnH + btnSpacingY; // Promote Button var promoteBtn = new GameButton(); promoteBtn.setButton('promoteBtn', 'Promote Video', "#fff", btnW, btnH); promoteBtn.x = 2048 / 2; promoteBtn.y = editBtn.y + btnH + btnSpacingY; // --- Loading Bar for Process --- var processBarBg = LK.getAsset('loadingbarempty', { anchorX: 0.5, anchorY: 0.5 }); processBarBg.width = 600; processBarBg.height = 60; processBarBg.x = 2048 / 2; processBarBg.y = 600; processBarBg.visible = false; game.addChild(processBarBg); // AnchorX 0 for left-to-right fill var processBarFill = LK.getAsset('loadingbarfull', { anchorX: 0, anchorY: 0.5 }); processBarFill.width = 600; processBarFill.height = 60; // Position left edge of fill to match left edge of bg processBarFill.x = processBarBg.x - processBarBg.width / 2; processBarFill.y = 600; processBarFill.visible = false; game.addChild(processBarFill); function showProcessBar(ratio) { processBarBg.visible = true; processBarFill.visible = true; if (ratio < 0) ratio = 0; if (ratio > 1) ratio = 1; // Prevent bar from appearing full and then decreasing: if bar is hidden, always start at 0 width if (!processBarBg._wasVisible) { processBarFill.width = 0; } processBarBg._wasVisible = true; // Smoothly tween the width to the new ratio tween.stop(processBarFill, { width: true }); tween(processBarFill, { width: 600 * ratio }, { duration: 350, easing: tween.cubicOut }); } function hideProcessBar() { processBarBg.visible = false; processBarFill.visible = false; processBarBg._wasVisible = false; } // --- Action Button Logic (time-based) --- // Track if record video panel is open var isRecordPanelOpen = false; makeVideoBtn.action = function () { if (timeProcess) return; // Only one process at a time if (isRecordPanelOpen) return; // Prevent multiple panels isRecordPanelOpen = true; // Show a panel before starting the process var panelBg = LK.getAsset('energyBarBg', { anchorX: 0.5, anchorY: 0.5 }); // Expand the panel to allow for more rows of category buttons panelBg.width = 1500; panelBg.height = 1300; panelBg.x = 2048 / 2; panelBg.y = 2732 / 2; panelBg.alpha = 0.98; // --- Panel Title --- var panelText = new Text2("Select Category & Title", { size: 90, fill: "#fff", font: "'GillSans-Bold',Impact,'Arial Black',Tahoma", dropShadow: true, dropShadowColor: "#222", dropShadowBlur: 8, dropShadowDistance: 2 }); panelText.anchor.set(0.5, 0.5); panelText.x = panelBg.x; panelText.y = panelBg.y - panelBg.height / 2 + 120; // near top of panel // --- Video Title Input --- var titleInputBg = LK.getAsset('loadingbarempty', { anchorX: 0.5, anchorY: 0.5 }); titleInputBg.width = 1000; titleInputBg.height = 130; titleInputBg.x = panelBg.x - 180; // shift left to make space for random button titleInputBg.y = panelText.y + 200; // more space below title titleInputBg.alpha = 0.92; var videoTitle = ""; var titleInputTxt = new Text2("Enter video title...", { size: 72, fill: "#fff", font: "'GillSans-Bold',Impact,'Arial Black',Tahoma", dropShadow: true, dropShadowColor: "#222", dropShadowBlur: 8, dropShadowDistance: 2 }); titleInputTxt.anchor.set(0.5, 0.5); titleInputTxt.x = titleInputBg.x; titleInputTxt.y = titleInputBg.y; // Simulate input: tap to edit, prompt for text titleInputBg.down = function (x, y, obj) { var prompt = LK.prompt ? LK.prompt : window.prompt; // fallback for dev var val = prompt ? prompt("Enter video title:", videoTitle) : ""; if (typeof val === "string" && val.length > 0) { videoTitle = val; titleInputTxt.setText(videoTitle); } }; // --- Random Title Button --- var randomBtn = new GameButton(); randomBtn.setButton('promoteBtn', 'Random', "#fff", 340, 120); randomBtn.x = titleInputBg.x + titleInputBg.width / 2 + 200; // right of input with space randomBtn.y = titleInputBg.y; randomBtn.action = function () { // Titles per category var categoryTitles = { "Vlog": ["My Daily Vlog", "Life Update", "A Day in My Life", "Morning Routine", "Evening Recap"], "Challenge": ["Epic Challenge!", "24 Hour Challenge", "Impossible Task!", "Last To Leave", "Extreme Challenge"], "Reaction": ["Reacting to Comments", "Reacting to Viral Videos", "First Time Watching", "Fan Reactions", "Surprising Reactions"], "Tutorial": ["How To Edit Videos", "Beginner's Guide", "Pro Tips & Tricks", "Step by Step Tutorial", "Easy DIY"], "Unboxing": ["Unboxing Surprise", "Mystery Box Unboxing", "Tech Unboxing", "Unboxing Haul", "First Impressions"], "Gaming": ["Let's Play!", "Epic Gaming Moments", "Game Review", "Speedrun Attempt", "Funny Gaming Fails"], "Music": ["My New Song", "Music Cover", "Behind the Music", "Songwriting Session", "Live Performance"], "Comedy": ["Funny Moments", "Comedy Skit", "Prank Video", "Try Not To Laugh", "Bloopers & Outtakes"], "Q&A": ["Q&A Special", "Answering Your Questions", "Ask Me Anything", "Subscriber Q&A", "Get To Know Me"], "Other": ["Behind the Scenes", "Special Announcement", "Random Thoughts", "Channel Update", "What Happened Today"] }; var cat = videoCategories[selectedCategoryIdx]; var titles = categoryTitles[cat] || ["My Daily Vlog", "Epic Challenge!", "Reacting to Comments", "24 Hours in My Studio", "Behind the Scenes", "Q&A Special", "Trying Viral Trends", "Unboxing Surprise", "Life Update", "Funny Moments"]; var idx = Math.floor(Math.random() * titles.length); videoTitle = titles[idx]; titleInputTxt.setText(videoTitle); }; // --- Video Category Buttons --- var categoryBtnW = 340; var categoryBtnH = 120; var categoryBtnSpacingX = 40; var categoryBtnSpacingY = 40; var categoryBtns = []; // Layout: fit as many as possible per row, then wrap var maxRowWidth = panelBg.width - 120; // leave some margin var maxPerRow = Math.floor((maxRowWidth + categoryBtnSpacingX) / (categoryBtnW + categoryBtnSpacingX)); if (maxPerRow < 1) maxPerRow = 1; var startX = panelBg.x - (Math.min(maxPerRow, videoCategories.length) * (categoryBtnW + categoryBtnSpacingX) - categoryBtnSpacingX) / 2 + categoryBtnW / 2; var startY = titleInputBg.y + 220; // more space below input+random for (var i = 0; i < videoCategories.length; i++) { (function (idx) { var btn = new GameButton(); btn.setButton('editBtn', videoCategories[idx], "#fff", categoryBtnW, categoryBtnH); var row = Math.floor(idx / maxPerRow); var col = idx % maxPerRow; btn.x = startX + col * (categoryBtnW + categoryBtnSpacingX); btn.y = startY + row * (categoryBtnH + categoryBtnSpacingY); btn.action = function () { // Deselect all for (var j = 0; j < categoryBtns.length; j++) { // If trending, keep its highlight if (j === trendingCategoryIdx) { categoryBtns[j].bg.alpha = 0.95; } else { categoryBtns[j].bg.alpha = 0.7; } } btn.bg.alpha = 1; selectedCategoryIdx = idx; }; // Highlight the first by default if (i === 0) btn.bg.alpha = 1;else btn.bg.alpha = 0.7; // Mark trending category visually if (i === trendingCategoryIdx) { btn.bg.alpha = 0.95; // Add a "Trending" label above the button var trendingTxt = new Text2("🔥 Trending", { size: 48, fill: "#ff0", font: "'GillSans-Bold',Impact,'Arial Black',Tahoma", dropShadow: true, dropShadowColor: "#222", dropShadowBlur: 8, dropShadowDistance: 2 }); trendingTxt.anchor.set(0.5, 1); trendingTxt.x = btn.x; trendingTxt.y = btn.y - categoryBtnH / 2 - 10; btn.trendingTxt = trendingTxt; } categoryBtns.push(btn); })(i); } // --- Confirm/Record Button --- var confirmBtn = new GameButton(); confirmBtn.setButton('videoBtn', 'Start Recording', "#fff", 600, 180); confirmBtn.x = panelBg.x; // Find the bottom Y of the last category button for spacing var lastCategoryBtn = categoryBtns[categoryBtns.length - 1]; var categoryBtnsBottomY = lastCategoryBtn ? lastCategoryBtn.y + categoryBtnH / 2 : startY + categoryBtnH / 2; confirmBtn.y = categoryBtnsBottomY + 200; // more space below category confirmBtn.action = function () { // Remove panel panelBg.destroy(); panelText.destroy(); confirmBtn.destroy(); titleInputBg.destroy(); titleInputTxt.destroy(); randomBtn.destroy(); closeBtn.destroy(); // Also destroy the close (X) button // Destroy all category buttons for (var i = 0; i < categoryBtns.length; i++) { // Destroy trending label if exists if (categoryBtns[i].trendingTxt) { categoryBtns[i].trendingTxt.destroy(); } categoryBtns[i].destroy(); } isRecordPanelOpen = false; // Start the process timeProcess = { type: 'record', hoursLeft: 3, total: 3, category: videoCategories[selectedCategoryIdx], title: videoTitle, onFinish: function onFinish() { LK.getSound('makeVideo').play(); // Views depend on subscribers and trending category // Base: 10-30% of subscribers will watch, plus a small random boost for new channels var minViewPercent = 0.10; var maxViewPercent = 0.30; var percent = minViewPercent + Math.random() * (maxViewPercent - minViewPercent); var baseViews = Math.floor(subscribers * percent); // For very low subs, guarantee at least 100-500 views for new players if (subscribers < 100) { baseViews = 100 + Math.floor(Math.random() * 400); } // Trending bonus: 1.5x views if trending if (videoCategories[selectedCategoryIdx] === videoCategories[trendingCategoryIdx]) { baseViews = Math.floor(baseViews * 1.5); } // Calculate money: $3-5 per 1000 views var moneyPerThousand = 3 + Math.random() * 2; // $3-5 var baseMoney = Math.floor(baseViews / 1000 * moneyPerThousand); // Subscribers: 1 per 200-300 views, randomize ratio for realism var subRatio = 200 + Math.floor(Math.random() * 101); // 200-300 var baseSubs = Math.floor(baseViews / subRatio); subscribers += baseSubs; money += baseMoney; viewCount += baseViews; videoCount += 1; updateStats(); // Animate button tween(makeVideoBtn, { scaleX: 1.1, scaleY: 1.1 }, { duration: 80, onFinish: function onFinish() { tween(makeVideoBtn, { scaleX: 1, scaleY: 1 }, { duration: 80 }); } }); if (subscribers >= 1000) { LK.showYouWin(); } } }; showProcessBar(0); }; // --- Close (X) Button --- var closeBtn = new Text2("×", { size: 120, fill: "#fff", font: "'GillSans-Bold',Impact,'Arial Black',Tahoma", dropShadow: true, dropShadowColor: "#222", dropShadowBlur: 8, dropShadowDistance: 2 }); closeBtn.anchor.set(0.5, 0.5); // Place at top right of panel, with margin closeBtn.x = panelBg.x + panelBg.width / 2 - 80; closeBtn.y = panelBg.y - panelBg.height / 2 + 80; closeBtn.interactive = true; closeBtn.buttonMode = true; closeBtn.down = function () { panelBg.destroy(); panelText.destroy(); confirmBtn.destroy(); closeBtn.destroy(); titleInputBg.destroy(); titleInputTxt.destroy(); randomBtn.destroy(); // Destroy all category buttons for (var i = 0; i < categoryBtns.length; i++) { // Destroy trending label if exists if (categoryBtns[i].trendingTxt) { categoryBtns[i].trendingTxt.destroy(); } categoryBtns[i].destroy(); } isRecordPanelOpen = false; }; // Add all panel elements to game game.addChild(panelBg); game.addChild(panelText); game.addChild(titleInputBg); game.addChild(titleInputTxt); game.addChild(randomBtn); game.addChild(closeBtn); // Add all category buttons for (var i = 0; i < categoryBtns.length; i++) { game.addChild(categoryBtns[i]); // If trending label exists, add it to game if (categoryBtns[i].trendingTxt) { game.addChild(categoryBtns[i].trendingTxt); } } game.addChild(confirmBtn); }; editBtn.action = function () { if (timeProcess) return; if (videoCount < 1) return; timeProcess = { type: 'edit', hoursLeft: 5, total: 5, onFinish: function onFinish() { LK.getSound('editVideo').play(); var editBonus = 5 + Math.floor(Math.random() * 5) * editSkill; subscribers += editBonus; money += 2 * editSkill; updateStats(); // Animate button tween(editBtn, { scaleX: 1.1, scaleY: 1.1 }, { duration: 80, onFinish: function onFinish() { tween(editBtn, { scaleX: 1, scaleY: 1 }, { duration: 80 }); } }); if (subscribers >= 1000) { LK.showYouWin(); } } }; showProcessBar(0); }; promoteBtn.action = function () { if (timeProcess) return; if (money < 5) return; money -= 5; updateStats(); timeProcess = { type: 'promote', hoursLeft: 2, total: 2, onFinish: function onFinish() { LK.getSound('promoteVideo').play(); var promoSubs = 15 + Math.floor(Math.random() * 10) * promoteSkill; subscribers += promoSubs; updateStats(); // Animate button tween(promoteBtn, { scaleX: 1.1, scaleY: 1.1 }, { duration: 80, onFinish: function onFinish() { tween(promoteBtn, { scaleX: 1, scaleY: 1 }, { duration: 80 }); } }); if (subscribers >= 1000) { LK.showYouWin(); } } }; showProcessBar(0); }; // Upgrade Button (slightly wider, shorter, and spaced further) var upgradeBtn = new GameButton(); upgradeBtn.setButton('upgradeBtn', 'Upgrade Studio', "#222", btnW, 140); upgradeBtn.x = 2048 / 2; upgradeBtn.y = promoteBtn.y + btnH + btnSpacingY + 40; upgradeBtn.action = function () { if (money < upgradeCost) return; money -= upgradeCost; upgradeLevel += 1; videoQuality += 1; editSkill += 1; promoteSkill += 1; LK.getSound('upgrade').play(); upgradeCost = Math.floor(upgradeCost * 1.7); updateStats(); // Animate button tween(upgradeBtn, { scaleX: 1.1, scaleY: 1.1 }, { duration: 80, onFinish: function onFinish() { tween(upgradeBtn, { scaleX: 1, scaleY: 1 }, { duration: 80 }); } }); }; // Add buttons to game game.addChild(makeVideoBtn); game.addChild(editBtn); game.addChild(promoteBtn); game.addChild(upgradeBtn); // Add extra vertical space between money/sub displays and buttons subIcon.y = 110; subTxt.y = subIcon.y; moneyIcon.y = 110; moneyTxt.y = moneyIcon.y; // Removed undefined energyBar and energyTxt // --- GUI: Timer/Score (use subscribers as score) --- // Removed giant numbers next to the subscriber counter // --- Helper Functions --- function formatNumber(num) { if (num < 1000) return "" + num; if (num < 1000000) { var k = num / 1000; if (k % 1 === 0) return k + "k"; return k.toFixed(1).replace(/\.0$/, "") + "k"; } var m = num / 1000000; if (m % 1 === 0) return m + "m"; return m.toFixed(1).replace(/\.0$/, "") + "m"; } function updateStats() { subTxt.setText(formatNumber(subscribers)); viewTxt.setText(formatNumber(viewCount)); moneyTxt.setText('$' + formatNumber(money)); upgradeBtn.label.setText('Upgrade Studio\n($' + formatNumber(upgradeCost) + ')'); // Enable/disable buttons based on process and resources makeVideoBtn.setEnabled(!timeProcess); editBtn.setEnabled(!timeProcess && videoCount > 0); promoteBtn.setEnabled(!timeProcess && money >= 5); upgradeBtn.setEnabled(money >= upgradeCost); // --- Achievements --- if (!updateStats.milestones) updateStats.milestones = {}; var milestones = [100, 250, 500, 750, 1000]; for (var i = 0; i < milestones.length; i++) { var m = milestones[i]; if (subscribers >= m && !updateStats.milestones[m]) { updateStats.milestones[m] = true; var ach = new Text2("Milestone: " + m + " Subs!", { size: 110, fill: "#ff0", stroke: "#000", strokeThickness: 12, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma", dropShadow: true, dropShadowColor: "#222", dropShadowBlur: 12, dropShadowDistance: 4 }); ach.anchor.set(0.5, 0.5); ach.x = 2048 / 2; ach.y = 400 + i * 80; game.addChild(ach); tween(ach, { alpha: 0, y: ach.y - 100 }, { duration: 1800, onFinish: function onFinish() { ach.destroy(); } }); } } } // --- Time Update --- function updateTimeDisplay() { var h = gameHour; var hStr = (h < 10 ? "0" : "") + h + ":00"; timeTxt.setText("Day " + gameDay + ", " + hStr); } // --- Process Update --- function updateProcessBar() { if (timeProcess) { var ratio = 1 - timeProcess.hoursLeft / timeProcess.total; showProcessBar(ratio); } else { hideProcessBar(); } } // --- Time Timer --- if (timeTimer) LK.clearInterval(timeTimer); timeTimer = LK.setInterval(function () { if (isTimePaused) return; // Advance time gameHour += 1; if (gameHour >= 24) { gameHour = 0; gameDay += 1; // Check if it's time to change trending category if (gameDay - trendingCategoryDay >= 7) { updateTrendingCategory(); } } updateTimeDisplay(); // Process logic if (timeProcess) { timeProcess.hoursLeft -= 1; updateProcessBar(); if (timeProcess.hoursLeft <= 0) { var finish = timeProcess.onFinish; timeProcess = null; updateProcessBar(); updateStats(); if (typeof finish === "function") finish(); } } updateStats(); }, 1000); // --- Random Event Timer --- var eventTimer = LK.setInterval(function () { // Pick a random event: 0 = trend, 1 = sponsorship, 2 = copyright strike, 3 = viral short (rare) var eventType; // 10% chance for viral short, else normal events if (Math.random() < 0.1) { eventType = 3; } else { eventType = Math.floor(Math.random() * 3); } var eventMsg = ""; if (eventType === 0) { // Trend: bonus subs and money var trendSubs = 50 + Math.floor(Math.random() * 50); var trendMoney = 20 + Math.floor(Math.random() * 20); subscribers += trendSubs; money += trendMoney; updateStats(); eventMsg = "Trending Topic! +" + trendSubs + " subs, +$" + trendMoney; } else if (eventType === 1) { // Sponsorship: big money var sponsorMoney = 60 + Math.floor(Math.random() * 40); money += sponsorMoney; updateStats(); eventMsg = "Sponsorship! +$" + sponsorMoney; } else if (eventType === 2) { // Copyright strike: lose subs, lose money var strikeSubs = 30 + Math.floor(Math.random() * 30); var strikeMoney = 10 + Math.floor(Math.random() * 10); subscribers = Math.max(0, subscribers - strikeSubs); money = Math.max(0, money - strikeMoney); updateStats(); eventMsg = "Copyright Strike! -" + strikeSubs + " subs, -$" + strikeMoney; } else if (eventType === 3) { // Viral Short: huge sub and money boost var viralSubs = 200 + Math.floor(Math.random() * 200); var viralMoney = 100 + Math.floor(Math.random() * 100); subscribers += viralSubs; money += viralMoney; updateStats(); eventMsg = "Viral Short! +" + viralSubs + " subs, +$" + viralMoney; } // Show popup in the center of the screen var popup = new Text2(eventMsg, { size: 100, fill: "#fff", stroke: "#000", strokeThickness: 12, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma", dropShadow: true, dropShadowColor: "#222", dropShadowBlur: 12, dropShadowDistance: 4 }); popup.anchor.set(0.5, 0.5); popup.x = 2048 / 2; popup.y = 2732 / 2; game.addChild(popup); tween(popup, { alpha: 0, y: popup.y - 120 }, { duration: 1800, onFinish: function onFinish() { popup.destroy(); } }); }, 20000); // --- Game Update Loop --- game.update = function () { // Nothing needed for now, all logic is event/click based }; // --- Touch/Drag Handling (no drag needed, but block top left 100x100) --- game.down = function (x, y, obj) { // Prevent accidental clicks in top left if (x < 100 && y < 100) return; }; game.move = function (x, y, obj) {}; game.up = function (x, y, obj) {}; // --- Initialize UI --- updateStats(); // --- Daily Bonus at game start --- (function showDailyBonus() { var bonusType = Math.floor(Math.random() * 2); var bonusMsg = ""; if (bonusType === 0) { // Bonus subs var bonusSubs = 50 + Math.floor(Math.random() * 50); subscribers += bonusSubs; updateStats(); bonusMsg = "Daily Bonus: +" + bonusSubs + " subs!"; } else { // Bonus money var bonusMoney = 30 + Math.floor(Math.random() * 30); money += bonusMoney; updateStats(); bonusMsg = "Daily Bonus: +$" + bonusMoney + "!"; } var popup = new Text2(bonusMsg, { size: 110, fill: "#0ff", stroke: "#000", strokeThickness: 12, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma", dropShadow: true, dropShadowColor: "#222", dropShadowBlur: 12, dropShadowDistance: 4 }); popup.anchor.set(0.5, 0.5); popup.x = 2048 / 2; popup.y = 2732 / 2 - 200; game.addChild(popup); tween(popup, { alpha: 0, y: popup.y - 120 }, { duration: 2000, onFinish: function onFinish() { popup.destroy(); } }); })(); ;
===================================================================
--- original.js
+++ change.js
@@ -460,20 +460,25 @@
category: videoCategories[selectedCategoryIdx],
title: videoTitle,
onFinish: function onFinish() {
LK.getSound('makeVideo').play();
- // Generate realistic view count: base 500-5000, scale with videoQuality, trending, and some randomness
- var minViews = 500 * videoQuality;
- var maxViews = 5000 * videoQuality;
- var baseViews = minViews + Math.floor(Math.random() * (maxViews - minViews + 1));
- // Calculate money: $3-5 per 1000 views
- var moneyPerThousand = 3 + Math.random() * 2; // $3-5
- var baseMoney = Math.floor(baseViews / 1000 * moneyPerThousand);
- // Trending bonus: 1.5x views, 1.5x money
+ // Views depend on subscribers and trending category
+ // Base: 10-30% of subscribers will watch, plus a small random boost for new channels
+ var minViewPercent = 0.10;
+ var maxViewPercent = 0.30;
+ var percent = minViewPercent + Math.random() * (maxViewPercent - minViewPercent);
+ var baseViews = Math.floor(subscribers * percent);
+ // For very low subs, guarantee at least 100-500 views for new players
+ if (subscribers < 100) {
+ baseViews = 100 + Math.floor(Math.random() * 400);
+ }
+ // Trending bonus: 1.5x views if trending
if (videoCategories[selectedCategoryIdx] === videoCategories[trendingCategoryIdx]) {
baseViews = Math.floor(baseViews * 1.5);
- baseMoney = Math.floor(baseMoney * 1.5);
}
+ // Calculate money: $3-5 per 1000 views
+ var moneyPerThousand = 3 + Math.random() * 2; // $3-5
+ var baseMoney = Math.floor(baseViews / 1000 * moneyPerThousand);
// Subscribers: 1 per 200-300 views, randomize ratio for realism
var subRatio = 200 + Math.floor(Math.random() * 101); // 200-300
var baseSubs = Math.floor(baseViews / subRatio);
subscribers += baseSubs;
subscriber icon 2d. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
money icon 2d. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
solid grey colour background for panel. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
viewers icon for a mobile game. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
make bigger this monitor
please to this white color
white play button solid white color. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
double speed icon for mobile games. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat. no text. only white color.
2d phone for mobile games. modern phone. looks good but phone is one color, phone's screen one color. Let it be completely 2-dimensional and not look like 3-dimensional. There should be a mute button and small volume up and down and hang up buttons on the sides of the phone.. In-Game asset. 2d. High contrast. No shadows - Fill the entire screen with a light gray color. - The outer cover color of the phone should be dark gray.
youtube button logo. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
white background rounded corners. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat white color. all white color no border.
playstore logo. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
editing application logo. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
çöp kutusu logosu fakat kırmızı arka planlı (çöp kutusu logosu beyaz renkte olacak). In-Game asset. 2d. High contrast. No shadows
kırmızıya boya
beyaza boya
maviye boya
istatistik logosu. In-Game asset. 2d. High contrast. No shadows
reklam logosu herhangi bir yazı olmasın. In-Game asset. 2d. High contrast. No shadows
record video logo with not text. In-Game asset. 2d. High contrast. No shadows
finans logosu. In-Game asset. 2d. High contrast. No shadows
youtube studio logo with no text only logo. In-Game asset. 2d. High contrast. No shadows
create youtube channel avatar cartoon 2d. In-Game asset. 2d. High contrast. No shadows
youtube channel logo. In-Game asset. 2d. High contrast. No shadows
"rastgele" ikonu, beyaz renginde olacak.. In-Game asset. 2d. High contrast. No shadows
youtube thumbnail for vlog. 2d. High contrast. No shadows
kilit ikonu beyaz. In-Game asset. 2d. High contrast. No shadows