User prompt
Let's make the background of the section where we click on people and get information white so that it is easy to read.
User prompt
Remove bg_night and bg_evening assets
User prompt
The reject button is still not visible, I think we should delete it and make another reject button.
User prompt
The reject button disappeared from the screen. Can you fix that error?
User prompt
add background changeable in assets
User prompt
Write the information in the passport in accordance with the passport photo I have placed or enlarge the passports in accordance with the text.
User prompt
Move the buttons a little below the table so that they are visible on the table
User prompt
When you click on this, the information that appears is written in the form of a question and answer containing part of a "conversation record" section next to the character.
User prompt
When we click on people, we get answers to questions that are not written in the passport (why did the person come, what does the person do, how long will the person stay)
User prompt
If one person passes (correct or incorrect) no one should come after him/her immediately. When you click the next button, the next person will come.
User prompt
remove text above buttons
User prompt
"NEXT" button add another texture and bring that texture to assets section
User prompt
add other names, there are always the same names, also add a new button so we can call the next person with this button
User prompt
Make 4 female characters. Also add gender section to your documents
User prompt
add a few more human models
User prompt
Please fix the bug: 'Uncaught TypeError: currentTraveler.containsPoint is not a function' in or related to this line: 'if (currentTraveler && currentTraveler.containsPoint({' Line Number: 484
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'feedbackTxt.style.fill = color;' Line Number: 284
User prompt
Please fix the bug: 'Uncaught TypeError: approveBtn.containsPoint is not a function' in or related to this line: 'if (approveBtn.containsPoint({' Line Number: 461
Code edit (1 edits merged)
Please save this source code
User prompt
Checkpoint: 1935
Initial prompt
Make a game like papers please. The game plays as a border guard in Germany in 1935 and our job gets harder every day.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0 }); /**** * Classes ****/ // Document class: represents a single document (passport, permit, etc.) var Document = Container.expand(function () { var self = Container.call(this); // docType: 'passport', 'permit', etc. self.docType = ''; self.fields = {}; // e.g. {name: '...', dob: '...', ...} self.isForged = false; // Visual self.bg = null; self.textFields = []; // Helper to set up document self.setup = function (docType, fields, isForged) { self.docType = docType; self.fields = fields; self.isForged = isForged; // Remove previous if (self.bg) self.bg.destroy(); for (var i = 0; i < self.textFields.length; i++) self.textFields[i].destroy(); self.textFields = []; // Background self.bg = self.attachAsset(docType, { anchorX: 0, anchorY: 0 }); // Title var title = new Text2(docType.toUpperCase(), { size: 60, fill: 0x333333 }); title.x = 40; title.y = 28; self.addChild(title); self.textFields.push(title); // Fields var y = 120; for (var key in fields) { var value = fields[key]; var txt = new Text2(key.charAt(0).toUpperCase() + key.slice(1) + ": " + value, { size: 52, fill: 0x222222 }); txt.x = 40; txt.y = y; self.addChild(txt); self.textFields.push(txt); y += 70; } // If forged, add a subtle red border if (isForged) { self.bg.tint = 0xffaaaa; } else { self.bg.tint = 0xffffff; } }; return self; }); // Traveler class: represents a person with documents var Traveler = Container.expand(function () { var self = Container.call(this); // Person visual var PERSON_ASSETS = [{ id: 'person', gender: 'male' }, { id: 'person2', gender: 'male' }, { id: 'person3', gender: 'male' }, { id: 'person4', gender: 'male' }, { id: 'person5', gender: 'male' }, { id: 'female1', gender: 'female' }, { id: 'female2', gender: 'female' }, { id: 'female3', gender: 'female' }, { id: 'female4', gender: 'female' }]; var personAssetObj = PERSON_ASSETS[Math.floor(Math.random() * PERSON_ASSETS.length)]; self.gender = personAssetObj.gender; var person = self.attachAsset(personAssetObj.id, { anchorX: 0.5, anchorY: 1 }); person.y = 0; // Documents (passport, permit, etc.) self.documents = []; // Will be filled by game // Name label self.nameTxt = new Text2('', { size: 60, fill: 0x222222 }); self.nameTxt.anchor.set(0.5, 0); self.nameTxt.x = 0; self.nameTxt.y = -person.height - 40; self.addChild(self.nameTxt); // Helper to show/hide documents self.showDocuments = function (show) { for (var i = 0; i < self.documents.length; i++) { self.documents[i].visible = !!show; } }; // Helper to destroy all docs self.destroyDocuments = function () { for (var i = 0; i < self.documents.length; i++) { self.documents[i].destroy(); } self.documents = []; // Remove extra info text if present if (self.extraInfoTxt) { self.extraInfoTxt.destroy(); self.extraInfoTxt = null; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xede5d0 }); /**** * Game Code ****/ // Female character assets // Document backgrounds // Game state variables // Add background images for changeable backgrounds var currentTraveler = null; var travelersProcessed = 0; var correctDecisions = 0; var day = 1; var rules = []; var travelerQueue = []; var isDecisionActive = false; var lastDecision = null; var lastFeedbackTimeout = null; var scoreTxt = null; var dayTxt = null; var ruleTxt = null; var table = null; var approveBtn = null; var denyBtn = null; var feedbackTxt = null; // Names and data for random generation var NAMES = ["Hans Müller", "Erika Schmidt", "Karl Weber", "Anna Fischer", "Otto Becker", "Liselotte Braun", "Friedrich Wagner", "Greta Hoffmann", "Johann Bauer", "Marta Klein", "Wilhelm Richter", "Sophie Keller", "Heinrich Vogel", "Paula Neumann", "Emil Schuster", "Clara Busch", "Maximilian König", "Helene Frank", "Bruno Schäfer", "Rosa Winkler", "Paul Zimmermann", "Maria Lorenz", "Ludwig Hartmann", "Ida Simon", "Franz Lehmann", "Emma Wolf", "Gustav Peters", "Charlotte Roth", "Walter Krause", "Luise Berger", "Rudolf Fuchs", "Elsa Brandt"]; var CITIES = ["Berlin", "Munich", "Hamburg", "Cologne", "Frankfurt", "Leipzig", "Dresden", "Stuttgart"]; var NATIONALITIES = ["German", "Austrian", "Polish", "Czech", "French", "Dutch"]; // Rules per day var RULES_BY_DAY = [ // Day 1 [{ desc: "Allow only travelers with a valid German passport.", check: function check(traveler) { var pass = getDoc(traveler, 'passport'); return pass && pass.fields.nationality === "German" && !pass.isForged; } }], // Day 2 [{ desc: "Allow only travelers with a valid German passport.", check: function check(traveler) { var pass = getDoc(traveler, 'passport'); return pass && pass.fields.nationality === "German" && !pass.isForged; } }, { desc: "Entry permit required for non-Germans.", check: function check(traveler) { var pass = getDoc(traveler, 'passport'); if (!pass) return false; if (pass.fields.nationality === "German") return true; var permit = getDoc(traveler, 'permit'); return permit && !permit.isForged; } }], // Day 3 [{ desc: "Allow only travelers with a valid German passport.", check: function check(traveler) { var pass = getDoc(traveler, 'passport'); return pass && pass.fields.nationality === "German" && !pass.isForged; } }, { desc: "Entry permit required for non-Germans.", check: function check(traveler) { var pass = getDoc(traveler, 'passport'); if (!pass) return false; if (pass.fields.nationality === "German") return true; var permit = getDoc(traveler, 'permit'); return permit && !permit.isForged; } }, { desc: "Deny travelers from Poland.", check: function check(traveler) { var pass = getDoc(traveler, 'passport'); return pass && pass.fields.nationality !== "Polish"; } }]]; // Helper: get document by type function getDoc(traveler, docType) { for (var i = 0; i < traveler.documents.length; i++) { if (traveler.documents[i].docType === docType) return traveler.documents[i]; } return null; } // Helper: generate a random traveler function generateTraveler(day) { var t = new Traveler(); // Name var name = NAMES[Math.floor(Math.random() * NAMES.length)]; t.nameTxt.setText(name); // Gender from asset var gender = t.gender || (Math.random() < 0.5 ? "male" : "female"); // Passport var nationality = NATIONALITIES[Math.floor(Math.random() * NATIONALITIES.length)]; var city = CITIES[Math.floor(Math.random() * CITIES.length)]; var dob = 1900 + Math.floor(Math.random() * 30) + "-" + (1 + Math.floor(Math.random() * 12)) + "-" + (1 + Math.floor(Math.random() * 28)); var passportFields = { name: name, nationality: nationality, city: city, dob: dob, gender: gender }; // 10% chance of forged passport from day 2+ var forgedPassport = day >= 2 && Math.random() < 0.1; var passport = new Document(); passport.setup('passport', passportFields, forgedPassport); passport.x = -350; passport.y = 100; t.addChild(passport); t.documents.push(passport); // Permit (for non-Germans, 50% chance from day 2+) var hasPermit = nationality !== "German" && day >= 2 && Math.random() < 0.5; if (hasPermit) { var permitFields = { name: name, nationality: nationality, valid: "Yes", gender: gender }; // 10% chance of forged permit from day 3+ var forgedPermit = day >= 3 && Math.random() < 0.1; var permit = new Document(); permit.setup('permit', permitFields, forgedPermit); permit.x = 200; permit.y = 100; t.addChild(permit); t.documents.push(permit); } // Hide docs initially t.showDocuments(false); return t; } // Helper: get today's rules function getRulesForDay(day) { if (day - 1 < RULES_BY_DAY.length) { return RULES_BY_DAY[day - 1]; } // After day 3, repeat day 3 rules return RULES_BY_DAY[RULES_BY_DAY.length - 1]; } // Helper: check if traveler should be allowed function isTravelerAllowed(traveler) { var rulesToday = getRulesForDay(day); for (var i = 0; i < rulesToday.length; i++) { if (!rulesToday[i].check(traveler)) return false; } return true; } // Helper: show feedback function showFeedback(text, color) { if (feedbackTxt) { feedbackTxt.setText(text); // Use setStyle to change fill color, supporting both hex and string if (typeof color === "string" || typeof color === "number") { feedbackTxt.setStyle({ fill: color }); } feedbackTxt.visible = true; if (lastFeedbackTimeout) LK.clearTimeout(lastFeedbackTimeout); lastFeedbackTimeout = LK.setTimeout(function () { feedbackTxt.visible = false; }, 1200); } } // Helper: next traveler function nextTraveler() { if (currentTraveler) { currentTraveler.destroyDocuments(); currentTraveler.destroy(); currentTraveler = null; } isDecisionActive = false; lastDecision = null; // End of day after 10 travelers if (travelersProcessed > 0 && travelersProcessed % 10 === 0) { day++; travelersProcessed = 0; correctDecisions = 0; showFeedback("Day " + day + " begins. New rules!", "#3333cc"); updateDayAndRules(); LK.setTimeout(function () { nextTraveler(); }, 1200); return; } // Generate new traveler currentTraveler = generateTraveler(day); currentTraveler.x = 2048 / 2; currentTraveler.y = 1200; game.addChild(currentTraveler); // Animate in currentTraveler.alpha = 0; tween(currentTraveler, { alpha: 1 }, { duration: 400, easing: tween.easeIn }); // Show docs after short delay LK.setTimeout(function () { if (currentTraveler) currentTraveler.showDocuments(true); isDecisionActive = true; }, 400); } // Helper: update day and rules display function updateDayAndRules() { if (dayTxt) dayTxt.setText("Day " + day); if (ruleTxt) { var rulesToday = getRulesForDay(day); var ruleStr = ""; for (var i = 0; i < rulesToday.length; i++) { ruleStr += i + 1 + ". " + rulesToday[i].desc + "\n"; } ruleTxt.setText(ruleStr); } // Change background image based on day if (typeof bgNode !== "undefined" && typeof bgImages !== "undefined") { // Only one background now: office var idx = 0; if (bgNode.assetId !== bgImages[idx]) { var newBg = LK.getAsset(bgImages[idx], { anchorX: 0, anchorY: 0, x: 0, y: 0 }); // Replace old background node if (bgNode.parent) bgNode.parent.removeChild(bgNode); bgNode = newBg; game.addChildAt(bgNode, 0); // Add at bottom } } } // Approve/deny button handlers function handleDecision(approved) { if (!isDecisionActive || !currentTraveler) return; isDecisionActive = false; travelersProcessed++; var allowed = isTravelerAllowed(currentTraveler); var correct = approved === allowed; if (correct) { correctDecisions++; showFeedback("Correct!", "#4caf50"); LK.setScore(LK.getScore() + 1); if (scoreTxt) scoreTxt.setText(LK.getScore()); } else { showFeedback("Mistake!", "#d32f2f"); // Flash screen red for mistake LK.effects.flashScreen(0xff0000, 500); } // Animate traveler out var targetX = approved ? 2048 + 400 : -400; tween(currentTraveler, { x: targetX, alpha: 0 }, { duration: 600, easing: tween.cubicOut, onFinish: function onFinish() { // Do not call nextTraveler automatically; wait for Next button // Traveler will be removed, but nextTraveler is only called by Next button } }); } // Add background image node (behind everything) var bgImages = ['bg_office']; var bgImageIdx = 0; var bgNode = LK.getAsset(bgImages[bgImageIdx], { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(bgNode); // Table table = LK.getAsset('table', { anchorX: 0.5, anchorY: 0, x: 2048 / 2, y: 1700 }); game.addChild(table); // Score display scoreTxt = new Text2("0", { size: 100, fill: 0x222222 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Day display dayTxt = new Text2("Day 1", { size: 70, fill: 0x333366 }); dayTxt.anchor.set(0.5, 0); dayTxt.y = 120; LK.gui.top.addChild(dayTxt); // Rules display ruleTxt = new Text2("", { size: 48, fill: 0x444444 }); ruleTxt.anchor.set(0, 0); ruleTxt.x = 120; ruleTxt.y = 250; LK.gui.top.addChild(ruleTxt); // Feedback text feedbackTxt = new Text2("", { size: 90, fill: 0x4CAF50 }); feedbackTxt.anchor.set(0.5, 0.5); feedbackTxt.x = 2048 / 2; feedbackTxt.y = 400; feedbackTxt.visible = false; LK.gui.top.addChild(feedbackTxt); // Approve button approveBtn = LK.getAsset('stamp_approve', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2 + 350, y: 2450 //{2G} // moved lower }); game.addChild(approveBtn); // Remove old denyBtn if it exists if (denyBtn && denyBtn.parent) { denyBtn.parent.removeChild(denyBtn); denyBtn = null; } // Create a new deny button and ensure it's visible denyBtn = LK.getAsset('stamp_deny', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2 - 350, y: 2450 }); denyBtn.visible = true; game.addChild(denyBtn); // Next Traveler button var nextBtn = LK.getAsset('stamp_next', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2600 // moved lower to match new button row }); game.addChild(nextBtn); // Button event handlers game.down = function (x, y, obj) { // Approve var approveLeft = approveBtn.x - approveBtn.width / 2; var approveRight = approveBtn.x + approveBtn.width / 2; var approveTop = approveBtn.y - approveBtn.height / 2; var approveBottom = approveBtn.y + approveBtn.height / 2; if (x >= approveLeft && x <= approveRight && y >= approveTop && y <= approveBottom) { handleDecision(true); return; } // Deny var denyLeft = denyBtn.x - denyBtn.width / 2; var denyRight = denyBtn.x + denyBtn.width / 2; var denyTop = denyBtn.y - denyBtn.height / 2; var denyBottom = denyBtn.y + denyBtn.height / 2; if (x >= denyLeft && x <= denyRight && y >= denyTop && y <= denyBottom) { handleDecision(false); return; } // Next button var nextLeft = 2048 / 2 - approveBtn.width / 2; var nextRight = 2048 / 2 + approveBtn.width / 2; var nextTop = 2600 - approveBtn.height / 2; var nextBottom = 2600 + approveBtn.height / 2; if (x >= nextLeft && x <= nextRight && y >= nextTop && y <= nextBottom) { // Only allow next if not in the middle of a decision animation if (!isDecisionActive) { nextTraveler(); } return; } // Show/hide docs and show extra info on traveler tap if (currentTraveler) { // Manual bounds check for the person asset (centered at currentTraveler.x, bottom at currentTraveler.y) var personAsset = currentTraveler.children[0]; // person asset is always first child if (personAsset) { var left = currentTraveler.x - personAsset.width / 2; var right = currentTraveler.x + personAsset.width / 2; var top = currentTraveler.y - personAsset.height; var bottom = currentTraveler.y; if (x >= left && x <= right && y >= top && y <= bottom) { // Show extra info popup (purpose, occupation, duration) as Q&A conversation record if (!currentTraveler.extraInfoTxt) { // Generate if not present var PURPOSES = ["I am here to visit family.", "I am traveling for work.", "I am just passing through.", "I am here for business.", "I am here for a holiday.", "I am here to see a doctor.", "I am here to study.", "I am here to help relatives.", "I am here for a funeral.", "I am here for a wedding."]; var OCCUPATIONS = ["I am a farmer.", "I am a teacher.", "I am a merchant.", "I am a soldier.", "I am a doctor.", "I am a student.", "I am a tailor.", "I am a baker.", "I am a carpenter.", "I am a musician."]; var DURATIONS = ["I will stay for 2 days.", "I am here for a week.", "Just one night.", "I will stay for 3 days.", "I am here for a month.", "Only a few hours.", "I will stay for 10 days.", "I am here for the season.", "I will leave tomorrow.", "I am not sure yet."]; var purpose = PURPOSES[Math.floor(Math.random() * PURPOSES.length)]; var occupation = OCCUPATIONS[Math.floor(Math.random() * OCCUPATIONS.length)]; var duration = DURATIONS[Math.floor(Math.random() * DURATIONS.length)]; // Format as Q&A conversation record var infoStr = "Conversation record:\n" + "Q: Why did you come?\nA: " + purpose + "\n\n" + "Q: What do you do?\nA: " + occupation + "\n\n" + "Q: How long will you stay?\nA: " + duration; // Add a white background box for the info popup var infoBg = new Container(); var bgWidth = 700; var bgHeight = 420; var bgRect = LK.getAsset('passport', { anchorX: 0, anchorY: 0 }); bgRect.width = bgWidth; bgRect.height = bgHeight; bgRect.tint = 0xffffff; infoBg.addChild(bgRect); var infoTxt = new Text2(infoStr, { size: 48, fill: 0x222222, align: "left" }); infoTxt.anchor.set(0, 0); infoTxt.x = 40; infoTxt.y = 30; infoBg.addChild(infoTxt); // Place to the right of the character, vertically aligned with the top of the person infoBg.x = currentTraveler.x + personAsset.width / 2 + 40; infoBg.y = currentTraveler.y - personAsset.height; infoBg.visible = true; currentTraveler.extraInfoTxt = infoBg; game.addChild(infoBg); } else { // Toggle visibility currentTraveler.extraInfoTxt.visible = !currentTraveler.extraInfoTxt.visible; } // Hide docs if showing info, show docs if hiding info var showingInfo = currentTraveler.extraInfoTxt && currentTraveler.extraInfoTxt.visible; currentTraveler.showDocuments(!showingInfo); } } } }; // Update function (not much needed for MVP) game.update = function () { // End game if too many mistakes in a day if (travelersProcessed > 0 && travelersProcessed - correctDecisions >= 3) { showFeedback("Too many mistakes!", "#d32f2f"); LK.setTimeout(function () { LK.showGameOver(); }, 1200); } // Win condition: survive 5 days if (day > 5) { showFeedback("You Win!", "#4caf50"); LK.setTimeout(function () { LK.showYouWin(); }, 1200); } }; // Start game LK.setScore(0); updateDayAndRules(); // Do not call nextTraveler automatically; require Next button to start
===================================================================
--- original.js
+++ change.js
@@ -543,20 +543,35 @@
var occupation = OCCUPATIONS[Math.floor(Math.random() * OCCUPATIONS.length)];
var duration = DURATIONS[Math.floor(Math.random() * DURATIONS.length)];
// Format as Q&A conversation record
var infoStr = "Conversation record:\n" + "Q: Why did you come?\nA: " + purpose + "\n\n" + "Q: What do you do?\nA: " + occupation + "\n\n" + "Q: How long will you stay?\nA: " + duration;
+ // Add a white background box for the info popup
+ var infoBg = new Container();
+ var bgWidth = 700;
+ var bgHeight = 420;
+ var bgRect = LK.getAsset('passport', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ bgRect.width = bgWidth;
+ bgRect.height = bgHeight;
+ bgRect.tint = 0xffffff;
+ infoBg.addChild(bgRect);
var infoTxt = new Text2(infoStr, {
size: 48,
fill: 0x222222,
align: "left"
});
infoTxt.anchor.set(0, 0);
+ infoTxt.x = 40;
+ infoTxt.y = 30;
+ infoBg.addChild(infoTxt);
// Place to the right of the character, vertically aligned with the top of the person
- infoTxt.x = currentTraveler.x + personAsset.width / 2 + 40;
- infoTxt.y = currentTraveler.y - personAsset.height;
- infoTxt.visible = true;
- currentTraveler.extraInfoTxt = infoTxt;
- game.addChild(infoTxt);
+ infoBg.x = currentTraveler.x + personAsset.width / 2 + 40;
+ infoBg.y = currentTraveler.y - personAsset.height;
+ infoBg.visible = true;
+ currentTraveler.extraInfoTxt = infoBg;
+ game.addChild(infoBg);
} else {
// Toggle visibility
currentTraveler.extraInfoTxt.visible = !currentTraveler.extraInfoTxt.visible;
}
male character facing the screen. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
male character facing the screen . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
male character facing the screen. In-Game asset. 2d. High contrast. No shadows
A handsome man, facing us. In-Game asset. 2d. High contrast. No shadows
The woman's face is turned towards us. In-Game asset. 2d. High contrast. No shadows
The woman's face is turned towards us. In-Game asset. 2d. High contrast. No shadows
The woman's face is turned towards us. In-Game asset. 2d. High contrast. No shadows
The woman's face is turned towards us. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
approval button. In-Game asset. 2d. High contrast. No shadows
NEXT button. In-Game asset. 2d. High contrast. No shadows
reject button. In-Game asset. 2d. High contrast. No shadows
2d top view of a long, rectangular table. On the table are papers, some documents and a radio . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
torn paper. In-Game asset. 2d. High contrast. No shadows
settings button. In-Game asset. 2d. High contrast. No shadows
OUTPUT BUTTON. In-Game asset. 2d. High contrast. No shadows
SORTIE BUTTON. In-Game asset. 2d. High contrast. No shadows
ВЫХОД BUTTON. In-Game asset. 2d. High contrast. No shadows
ÇIKIŞ BUTTON. In-Game asset. 2d. High contrast. No shadows
SPIELEN GREEN BUTTON. In-Game asset. 2d. High contrast. No shadows
JOUER GREEN BUTTON. In-Game asset. 2d. High contrast. No shadows
ИГРАТЬ GREEN BUTTON. In-Game asset. 2d. High contrast. No shadows
OYNAMAK GREEN BUTTON. In-Game asset. 2d. High contrast. No shadows
he is boy. my son. In-Game asset. 2d. High contrast. No shadows
teen girl. In-Game asset. 2d. High contrast. No shadows
old man. In-Game asset. 2d. High contrast. No shadows
old woman. In-Game asset. 2d. High contrast. No shadows
wife. In-Game asset. 2d. High contrast. No shadows
2d paper texture. In-Game asset. 2d. High contrast. No shadows
so cute woman. In-Game asset. 2d. High contrast. No shadows
red hair japan girl . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a rich woman. In-Game asset. 2d. High contrast. No shadows
a rich man. In-Game asset. 2d. High contrast. No shadows
handsome man. In-Game asset. 2d. High contrast. No shadows
black man. In-Game asset. 2d. High contrast. No shadows
PRODUZENT BUTTON. In-Game asset. 2d. High contrast. No shadows
PRODUCER BUTTON. In-Game asset. 2d. High contrast. No shadows
PRODUCTEUR BUTTON. In-Game asset. 2d. High contrast. No shadows
ПРОДЮСЕР BUTTON. In-Game asset. 2d. High contrast. No shadows
YAPIMCI BUTTON. In-Game asset. 2d. High contrast. No shadows