User prompt
pause the game during upgardes, dont go to game over
User prompt
Please fix the bug: 'TypeError: LK.pauseGame is not a function' in or related to this line: 'LK.pauseGame(); // Pause the game when the upgrade selector is shown' Line Number: 343
User prompt
pause the game while displaying upgrades, so no other action can be made before selecting one of the two upgrades
User prompt
In the Upgrade_Selector.down function, accurately determine which option was clicked based on relative coordinates. Retrieve the correct upgrade string from option1Text.text or option2Text.text. Pass the retrieved upgrade string to applyUpgrade.
User prompt
Refine the Upgrade Application Logic Action: Update the applyUpgrade function to iterate through each cell in wheel.cells. Use the damageType property to identify which tiles to upgrade. Directly access and update the damageText via the stored reference (e.g., cell.damageText.setText(cell.damage.toString());).
User prompt
Problem: The current initialization may not be correctly setting up the fixed labels. Solution: Assign damageType Separately: Ensure that each cell has a fixed damageType label that doesn't change during upgrades. Set Up Fixed Labels Correctly: During the SpinningWheel.init method, when creating each cell, add the damageType label first and then add the damageText on top of it.
User prompt
do not display the cell's type on the cell, just the damage value
User prompt
Problem: Damage type labels are being altered or are linked to damage values, causing them to change when upgrades are applied. Solution: Use Separate Text Fields for Labels and Damage Values: During tile initialization, create two distinct text objects: Damage Type Label: Fixed text indicating the type (e.g., "Minor Damage"). Damage Value Display: Dynamic text showing the current damage value, which updates based on upgrades. Ensure Labels Remain Unchanged: In the applyUpgrade function, only update the damageText and leave the damageType label untouched. Position Labels Appropriately: Arrange the labels and damage values consistently within each tile for clarity.
User prompt
Problem: Even after selecting an upgrade, the damage values of the targeted tiles are not incrementing. Solution: Iterate Through Each Cell and Apply Increments: In the applyUpgrade function, loop through all wheel.cells and check their damageType. For each tile that matches the upgrade criteria, increment its damage value by the specified amount. Refresh the Displayed Damage Value: After incrementing the damage value, update the corresponding damageText to reflect the new value. Ensure Upgrades Persist: Confirm that the incremented damage values are stored correctly and persist throughout the game's lifecycle. This ensures that future spins and attacks use the updated values.
User prompt
Problem: The applyUpgrade function attempts to find the damageText by matching the text to the current damage value, which fails after the damage has been incremented. Solution: Maintain Direct References to damageText: During the initialization of each cell in the SpinningWheel class, store a direct reference to the damageText object. This can be done by attaching it as a property of the cell. Example: cell.damageText = damageText; Update applyUpgrade to Use Direct References: Instead of searching for damageText based on its text, directly access the damageText property of each cell to update its text. Avoid Searching by Text Content: Remove the logic that searches for damageText by matching the text content. This approach is unreliable post-upgrade.
User prompt
Add Console Logs in Upgrade_Selector.down: Before calling applyUpgrade, log the values of self.option1Text.text and self.option2Text.text to ensure they hold the correct upgrade strings. Check if self.visible is True: Ensure that the down event only triggers applyUpgrade when the Upgrade_Selector is visible and actively presenting options. Handle Edge Cases: Ensure that no unintended areas of the screen trigger the down event, causing applyUpgrade to be called with undefined.
User prompt
make the enemy starting hp 10
User prompt
Verify Upgrade Options Are Set Correctly: Ensure that when upgradeSelector.show(option1, option2) is called, both option1Text and option2Text are properly set with non-empty strings. Confirm Text Fields Are Accessible: Check that self.option1Text and self.option2Text are correctly referencing the text objects within the Upgrade_Selector class. Ensure Proper Event Handling: In the Upgrade_Selector.down function, make sure that the coordinates (x and y) used to determine which option was clicked correctly correspond to the positions of option1Text and option2Text. Tip: Instead of using absolute coordinates like x < 2048 / 2, consider using relative positions based on the Upgrade_Selector's own dimensions or positions to accurately detect which option is clicked.
User prompt
Objective: Identify and rectify any underlying issues preventing upgrades from functioning correctly. Action Steps: Add Console Logs: Insert console logs within the applyUpgrade function to confirm that it is being called and to display which upgrades are being applied. Verify Tile Identification: Ensure that tiles are correctly identified based on their damageType before applying upgrades.
User prompt
Objective: Ensure that the upgrade selection interface correctly captures user input and triggers the applyUpgrade function without errors. Action Steps: Review Upgrade Selector Classes: Ensure that only one upgrade selector class (Upgrade_Selector) is being used consistently. Remove or consolidate redundant classes like UpgradeModal to prevent conflicts. Confirm Event Binding: Verify that the down event in the Upgrade_Selector class correctly detects user input and calls the applyUpgrade function with the selected upgrade option. Handle Edge Cases: Implement checks to prevent applying upgrades if the selection is invalid or if the upgrade criteria aren't met. Expected Outcome: When a player selects an upgrade option, the corresponding applyUpgrade function is reliably triggered, ensuring that upgrades are applied as intended.
User prompt
Objective: Ensure that each tile's damage type label (e.g., "Minor Damage") remains constant, regardless of any upgrades applied to the tile's damage value. Action Steps: Separate Label from Damage Value: Use two distinct text elements for each tile: Damage Type Label: Displays the category (e.g., "Minor Damage") and remains unchanged. Damage Value Display: Shows the current damage value and updates based on upgrades. Ensure Labels Are Immutable: During the upgrade process, only modify the damage value display. Do not alter the damageType label, ensuring it remains fixed.
User prompt
Objective: Ensure that each tile's damageText is a child of its respective cell container. This allows the applyUpgrade function to access and update the damageText directly within each cell. Action Steps: Modify the Tile Initialization: In the SpinningWheel class's init method, adjust the code so that damageText is attached to the cell instead of the wheel. Ensure Proper Nesting: After creating the damageText, add it as a child to the cell. This maintains a clear parent-child relationship, facilitating easier access during upgrades. Remove Redundant Additions: Avoid adding damageText directly to the wheel. This prevents cluttering the wheel container and ensures that each damageText is associated only with its respective cell. Expected Outcome: Each cell now contains its own damageText, allowing the applyUpgrade function to locate and update it correctly.
User prompt
Purpose: Accurately enhance the damage values of targeted tiles based on the player's choice. Action Steps: Capture Player's Choice: Detect which upgrade option the player selects from the presented choices. Identify Target Tiles Based on damageType: Use the damageType property to identify which tiles should be affected by the chosen upgrade. Mapping Upgrades to damageType: +5 Damage to All Cells: Target all tiles with damageType "Minor", "Major", and "Critical". +10 Damage to Minor Damage Tiles: Target tiles with damageType "Minor". +25 Damage to Major Damage Tiles: Target tiles with damageType "Major". +100 Damage to Critical Damage Tiles: Target tiles with damageType "Critical". Increment Damage Values Appropriately: For each targeted tile, increase its damage value by the specified amount based on the selected upgrade.
User prompt
Purpose: Relying solely on the damage value to determine a tile's category can lead to inconsistencies, especially after upgrades modify these values. Introducing a separate property ensures reliable identification regardless of damage changes. Action Steps: Define a damageType Property: Assign each tile a damageType property during initialization (e.g., "Minor", "Major", "Critical", "Heal"). Consistently Use damageType for Categorization: Use this property to identify and target tiles during upgrades instead of relying on the damage value.
User prompt
Please fix the bug: 'Uncaught Error: getChildAt: Supplied index 0 does not exist in the child list, or the supplied DisplayObject must be a child of the caller' in or related to this line: 'var damageText = cell.getChildAt(0);' Line Number: 479
User prompt
Please fix the bug: 'Uncaught TypeError: damageText.setText is not a function' in or related to this line: 'damageText.setText(wheel.cells[i].damage.toString());' Line Number: 480
User prompt
upgrades dont improve the cells damage. "25 Damage to Major Damage Tiles" for example should increment the damage of all 2 existing cells labeld with major damage, to increment them with another 25 damage. the same goes for the other upgrades, they should increment the current value of their respective ccells
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'x')' in or related to this line: 'self.option2Text.x = 0;' Line Number: 398
User prompt
anchor the upgrades text to the center of the screen so the firt skill is exactly in the centr of the screen and the second is 200 pixels below. also remove the tile asset when showing the upgrades
User prompt
add the upgrade text in the GUI
/**** * Classes ****/ // BackgroundContainer class var BackgroundContainer = Container.expand(function () { var self = Container.call(this); }); //<Assets used in the game will automatically appear here> //<Write imports for supported plugins here> // SpinningWheel class to represent the spinning wheel mechanic var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.init = function () { self.x = 2048 / 2; self.y = 2732 / 2 - 500; // Initialize the enemy's HP if (typeof this.constructor.hp === 'undefined') { this.constructor.hp = 10; } else { this.constructor.hp += enemyHpIncrement; } self.hp = this.constructor.hp; // Add a text to display the enemy's HP self.hpText = new Text2("", { size: 200, fill: 0xFFFFFF }); self.hpText.anchor.set(0.5, 0.5); self.hpText.y = -700; // Move the text higher self.addChild(self.hpText); // Update the enemy's HP text self.hpText.setText("HP: " + self.hp); }; }); var Enemy2 = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy_2', { anchorX: 0.5, anchorY: 0.5 }); self.init = function () { self.x = 2048 / 2; self.y = 2732 / 2 - 500; if (typeof this.constructor.hp === 'undefined') { this.constructor.hp = 10; } else { this.constructor.hp += enemyHpIncrement * 0.5; } self.hp = this.constructor.hp; self.hpText = new Text2("", { size: 200, fill: 0xFFFFFF }); self.hpText.anchor.set(0.5, 0.5); self.hpText.y = -700; self.addChild(self.hpText); self.hpText.setText("HP: " + self.hp); }; }); var Enemy3 = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy_3', { anchorX: 0.5, anchorY: 0.5 }); self.init = function () { self.x = 2048 / 2; self.y = 2732 / 2 - 500; if (typeof this.constructor.hp === 'undefined') { this.constructor.hp = 10; } else { this.constructor.hp += enemyHpIncrement * 1.5; } self.hp = this.constructor.hp; self.hpText = new Text2("", { size: 200, fill: 0xFFFFFF }); self.hpText.anchor.set(0.5, 0.5); self.hpText.y = -700; self.addChild(self.hpText); self.hpText.setText("HP: " + self.hp); }; }); // ForegroundContainer class var ForegroundContainer = Container.expand(function () { var self = Container.call(this); }); // MidgroundContainer class var MidgroundContainer = Container.expand(function () { var self = Container.call(this); }); // Current interval for the spin // Peon class to represent the player's element var Peon = Container.expand(function () { var self = Container.call(this); // Attach the 'peon' asset to the Peon var peonGraphics = self.attachAsset('peon', { anchorX: 0.5, anchorY: 0.5 }); // Initialize the Peon's position on the wheel self.init = function (wheel) { self.x = wheel.x; self.y = wheel.y; self.currentPosition = Math.floor(Math.random() * 8); // Peon's current position on the wheel self.x += self.currentPosition * 250; // Position Peon on the random cell }; // Spin the Peon around the wheel self.spin = function (wheel) { // Generate a random integer between 10 and 15 var steps = Math.floor(Math.random() * 6) + 11; var _spinStep = function spinStep() { self.currentPosition = (self.currentPosition + 1) % 8; // Update Peon's current position self.x = wheel.x + self.currentPosition * 250; // Move Peon one cell to the right if (self.currentPosition == 0) { // If Peon reaches Cell 8, loop back to Cell 1 self.x = wheel.x; } steps--; currentInterval *= multiplier; // Increase the interval by the multiplier if (steps <= 0) { // Peon lands on the final cell self.x = wheel.x + self.currentPosition * 250; // Extract the damage value from the landed cell var damage = wheel.cells[self.currentPosition].damage; if (wheel.cells[self.currentPosition].actionType === 'heal') { console.log("Landed on a healing cell. No damage inflicted."); damage = 0; } else { console.log("Damage for next attack: " + damage); } // Create a new projectile and shoot it towards the enemy var projectile = new Projectile(); projectile.init(self.x, self.y, enemy.x, enemy.y, 10, damage); game.addChild(projectile); wheel.isSpinning = false; // Set isSpinning to false after the spin is complete currentInterval = startingInterval; // Reset the interval to the starting interval } else { LK.setTimeout(_spinStep, currentInterval); // Schedule the next step } }; _spinStep(); // Start the spin }; }); // Projectile class to represent the projectiles shot by the cells var Projectile = Container.expand(function () { var self = Container.call(this); // Attach the 'projectile' asset to the Projectile var projectileGraphics = self.attachAsset('projectile', { anchorX: 0.5, anchorY: 0.5 }); // Initialize the Projectile's position and target self.init = function (startX, startY, targetX, targetY, speed, damage) { self.x = startX; self.y = startY; self.targetX = targetX; self.targetY = targetY; self.speed = speed * 3; // Increase the bullet speed self.damage = damage; }; // Move the Projectile towards its target self.update = function () { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < self.speed) { self.x = self.targetX; self.y = self.targetY; } else { self.x += dx * self.speed / dist; self.y += dy * self.speed / dist; // Check if the projectile has intersected with the enemy if (self.intersects(enemy)) { // Deal damage to the enemy enemy.hp -= self.damage; // Update the enemy's HP text enemy.hpText.setText("HP: " + enemy.hp); // Destroy the projectile self.destroy(); // Add shake animation to the enemy var shake = 20; var shakeSpeed = 15; var originalEnemyX = enemy.x; // Save the original position of the enemy var shakeInterval = LK.setInterval(function () { shake *= -1; enemy.x += shake; shakeSpeed--; if (shakeSpeed <= 0) { LK.clearInterval(shakeInterval); enemy.x = originalEnemyX; // Reset the enemy's position after the shake animation ends } }, shakeSpeed); // If enemy's HP reaches 0, destroy the enemy and start next round if (enemy.hp <= 0) { enemy.destroy(); // Randomly select two upgrade options var upgrades = ["+5 Damage to All Cells", "+50 Damage to a Random Cell", "+10 Damage to Minor Damage Tiles", "+25 Damage to Major Damage Tiles", "+100 Damage to Critical Damage Tiles"]; var selectedUpgrades = []; while (selectedUpgrades.length < 2) { var randomUpgrade = upgrades[Math.floor(Math.random() * upgrades.length)]; if (!selectedUpgrades.includes(randomUpgrade)) { selectedUpgrades.push(randomUpgrade); } } // Show the upgrade selector with the selected options upgradeSelector.show(selectedUpgrades[0], selectedUpgrades[1]); } } } }; }); var SpinningWheel = Container.expand(function () { var self = Container.call(this); self.cells = []; self.isSpinning = false; // Initialize the wheel with cells self.init = function () { self.cells = [{ damage: 10, actionType: 'damage', damageType: 'Minor' }, { damage: 25, actionType: 'damage', damageType: 'Major' }, { damage: 10, actionType: 'damage', damageType: 'Minor' }, { damage: 100, actionType: 'damage', damageType: 'Critical' }, { damage: 10, actionType: 'damage', damageType: 'Minor' }, { damage: 25, actionType: 'damage', damageType: 'Major' }, { damage: 10, actionType: 'damage', damageType: 'Minor' }, { damage: 0, actionType: 'heal', damageType: 'Heal' }]; for (var i = 0; i < self.cells.length; i++) { var cell = self.attachAsset('tile', { anchorX: 0.5, anchorY: 0.5, x: i * 250 // Increase space between cells }); self.addChild(cell); // Add fixed damageType label to each cell var damageTypeLabel = new Text2(self.cells[i].damageType, { size: 50, fill: 0xAAAAAA }); damageTypeLabel.anchor.set(0.5, 0.5); damageTypeLabel.y = -50; // Position label above damage value cell.addChild(damageTypeLabel); // Add text to each cell to display the damage value var damageText = new Text2(self.cells[i].damage.toString(), { size: 75, fill: 0xFFFFFF }); cell.damageText = damageText; // Store direct reference to damageText damageText.anchor.set(0.5, 0.5); damageText.x = 0; damageText.y = 0; cell.addChild(damageText); } }; // Spin the Peon around the wheel self.spin = function (peon) { if (!self.isSpinning) { self.isSpinning = true; peon.spin(self); } }; }); // Upgrade_Selector class to present upgrade options in a grid var Upgrade_Selector = Container.expand(function () { var self = Container.call(this); self.visible = false; // Initially hidden // Create background for the selector var background = self.attachAsset('tile', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, scaleX: 4, scaleY: 4 }); background.alpha = 0.8; // Create text for the upgrade options self.option1Text = new Text2("", { size: 100, fill: 0xFFFFFF }); self.option1Text.anchor.set(0.5, 0.5); self.option1Text.x = -200; // Adjusted for relative positioning self.option1Text.y = 0; self.option2Text = new Text2("", { size: 100, fill: 0xFFFFFF }); self.option2Text.anchor.set(0.5, 0.5); self.option2Text.x = 200; // Adjusted for relative positioning self.option2Text.y = 0; self.addChild(self.option1Text); self.addChild(self.option2Text); // Function to show the selector with two options self.show = function (option1, option2) { if (option1 && option2) { self.option1Text.setText(option1); self.option2Text.setText(option2); } else { console.error("Upgrade options must be non-empty strings."); } background.visible = false; self.visible = true; game.pause(); // Pause the game when the upgrade selector is shown }; // Function to hide the selector self.hide = function () { self.visible = false; }; // Handle selection of an option self.down = function (x, y, obj) { if (self.visible) { // Ensure the selector is visible before processing input console.log("Option 1 Text:", self.option1Text.text); // Log option 1 text console.log("Option 2 Text:", self.option2Text.text); // Log option 2 text // Ensure the selector is visible before processing input var option1Bounds = self.option1Text.getBounds(); var option2Bounds = self.option2Text.getBounds(); var localPosition = self.toLocal(obj.global); if (localPosition.x >= option1Bounds.x && localPosition.x <= option1Bounds.x + option1Bounds.width && localPosition.y >= option1Bounds.y && localPosition.y <= option1Bounds.y + option1Bounds.height) { applyUpgrade(self.option1Text.text); } else if (localPosition.x >= option2Bounds.x && localPosition.x <= option2Bounds.x + option2Bounds.width && localPosition.y >= option2Bounds.y && localPosition.y <= option2Bounds.y + option2Bounds.height) { applyUpgrade(self.option2Text.text); } else { console.log("Clicked outside of upgrade options."); // Log when clicking outside options } self.hide(); createNewEnemy(); // Create a new enemy after selection LK.resumeGame(); // Resume the game after an upgrade is selected } }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 //Init game with black background }); /**** * Game Code ****/ // Function to apply the selected upgrade function applyUpgrade(upgrade) { console.log("applyUpgrade called with upgrade:", upgrade); // Log when applyUpgrade is called if (!upgrade || !["+", "Damage", "to", "All", "Cells", "Minor", "Major", "Critical"].some(function (word) { return upgrade.includes(word); })) { console.log("Invalid upgrade selected."); return; } switch (upgrade) { case "+5 Damage to All Cells": for (var i = 0; i < wheel.cells.length; i++) { if (["Minor", "Major", "Critical"].includes(wheel.cells[i].damageType)) { console.log("Applying +5 Damage to cell with damageType:", wheel.cells[i].damageType); // Log identified tiles wheel.cells[i].damage += 5; } } break; case "+10 Damage to Minor Damage Tiles": for (var i = 0; i < wheel.cells.length; i++) { if (wheel.cells[i].damageType === 'Minor') { console.log("Applying +10 Damage to Minor Damage Tile"); // Log identified tiles wheel.cells[i].damage += 10; } } break; case "+25 Damage to Major Damage Tiles": for (var i = 0; i < wheel.cells.length; i++) { if (wheel.cells[i].damageType === 'Major') { console.log("Applying +25 Damage to Major Damage Tile"); // Log identified tiles wheel.cells[i].damage += 25; } } break; case "+100 Damage to Critical Damage Tiles": for (var i = 0; i < wheel.cells.length; i++) { if (wheel.cells[i].damageType === 'Critical') { console.log("Applying +100 Damage to Critical Damage Tile"); // Log identified tiles wheel.cells[i].damage += 100; } } break; default: console.log("Invalid upgrade selected."); } // Update damage text for all cells for (var i = 0; i < wheel.cells.length; i++) { var cell = wheel.cells[i]; if (cell.damageText instanceof Text2) { cell.damageText.setText(cell.damage.toString()); } } } // Global timing variables // Initialize spinning wheel var startingInterval = 15; // Starting interval for the spin var multiplier = 1.2; // Multiplier for the interval increase var currentInterval = startingInterval; var startingMovingTiles = 7; // Starting moving tiles var maxTiles = 25; // Maximum number of tiles var backgroundContainer = new BackgroundContainer(); game.addChild(backgroundContainer); var midgroundContainer = new MidgroundContainer(); game.addChild(midgroundContainer); var foregroundContainer = new ForegroundContainer(); game.addChild(foregroundContainer); var wheel = new SpinningWheel(); midgroundContainer.addChild(wheel); wheel.init(); wheel.x = 150; // Initial x position wheel.y = 2500; // Space cells horizontally game.addChild(wheel); // Initialize the Peon and add it to the game var peon = new Peon(); peon.init(wheel); game.addChild(peon); var enemyHpIncrement = 50; var enemyClasses = [Enemy, Enemy2, Enemy3]; var enemy; function createNewEnemy() { randomIndex = Math.floor(Math.random() * enemyClasses.length); enemy = new enemyClasses[randomIndex](); enemy.init(); game.addChild(enemy); } createNewEnemy(); // Initialize and add Upgrade_Selector to the game var upgradeSelector = new Upgrade_Selector(); LK.gui.center.addChild(upgradeSelector); // Add a down event to the game to spin the Peon when the screen is tapped game.down = function (x, y, obj) { if (!wheel.isSpinning) { wheel.spin(peon); } };
===================================================================
--- original.js
+++ change.js
@@ -329,9 +329,9 @@
console.error("Upgrade options must be non-empty strings.");
}
background.visible = false;
self.visible = true;
- LK.showGameOver(); // Pause the game when the upgrade selector is shown
+ game.pause(); // Pause the game when the upgrade selector is shown
};
// Function to hide the selector
self.hide = function () {
self.visible = false;
8-bit pixelated triangle pick. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Design a panel for a hyper-casual 2D video game, styled as a clean, white speech bubble. The panel has softly rounded corners and a slight cloud-like shape, with a small, rounded tail pointing downward or to the side. The design is pure and minimal, with no shadows or unnecessary details, ensuring a crisp, modern look. The edges are outlined with a subtle, light-gray stroke to enhance contrast while maintaining a soft and approachable aesthetic. Perfect for displaying text or damage stats in a playful yet functional manner.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Design a 2D UI element for a cute and lively text graphic that says 'GO.' The text should be bold and bubbly, with a soft, rounded font in a bright, cheerful green to indicate life and healing. The background features a large, semi-transparent green plus sign, subtly glowing and radiating a gentle, rejuvenating energy. The 'GO' text is prominently centered, with a slight 3D effect and playful highlights to make it pop, exuding a sense of positivity and vitality. The overall design is clean, minimal, and adorable, perfect for a hyper-casual mobile game.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
video game cute banana Pokémon with Matrix-like black glasses and a trench coat, oversized head occupying most of its body, standing on two tiny chubby feet at the bottom, tiny adorable creature with a cute angry expression, looking straight ahead, facing the camera directly. 2D flat vector illustration. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
video game cute divine grape bunch Pokémon with an angelic halo above its head and a harp beside it, oversized head occupying most of its body, standing on two tiny chubby feet at the bottom, tiny adorable creature with a cute angry expression, looking straight ahead, facing the camera directly. 2D flat vector illustration. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.