User prompt
correct match add 1 to countdown
User prompt
hide move count
User prompt
Show 8 remaining as countdown.
User prompt
Give 8 rights for each level
User prompt
Add confetti effect around the correctly matched card. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Different cards match. This is an error.
User prompt
fix matching errors
User prompt
Theme music not working fix.
User prompt
Add 10 music assets for theme music
User prompt
add game theme music play 10 random
User prompt
Complete the number of dress to 10
User prompt
enlarge the puzzle in 4 directions asnet the gaps.
User prompt
enlarge the puzzle in 4 directions asnet the gaps.
User prompt
Open the puzzle in 4 directions
User prompt
Complete the number of scarf to 10
User prompt
Complete the number of coat to 10
User prompt
Complete the number of beret to 10
User prompt
Complete the number of accessories to 10
Code edit (1 edits merged)
Please save this source code
User prompt
Fashion Memory Match
User prompt
Game Elements: The Game Board: A grid of face-down cards. The size of the grid will vary depending on the level (e.g., 4x4 for easy, 6x6 for medium, 8x8 for hard). Each card has a uniform back design. Fashion Item Cards: Quantity: 30 Coats, 30 Dresses, 30 Scarves, 30 Berets, 30 Accessories. (Total 150 unique images for the library). Visuals: High-quality 2D images of each item. Each item will also have detailed metadata (see "Dress Library" section below). Uniqueness: While there are 30 of each type, the specific image for each item should be unique (e.g., 30 different coats, not 30 identical coat pictures). This is crucial for AI learning and human engagement. Matching Rule Display: Clearly visible at the top of the screen. This defines how players need to match cards in the current round. Examples: "Match by Type," "Match by Color (Red)," "Match by Style (Vintage)," "Match an Outerwear & Headwear Pair." Turns & Time Limit (Optional): Turn Counter: Tracks how many pairs the player attempts. Lower turns for a perfect score. Timer: For challenge modes, a countdown timer to clear the board. Score & Star Rating: Score: Based on pairs matched, speed, and accuracy (fewer incorrect flips). Star Rating: Earn 1 to 3 stars per level based on performance. "Stylist's Intuition" (Hint System): A limited-use hint that can either: Briefly reveal all cards. Highlight two potential matching cards based on the current rule. Show the category/color/style of a single flipped card for a few seconds. How to Play: Full Instructions A. Game Modes: "Wardrobe Wisdom" (Main Mode - Progressive Difficulty): Objective: Clear the board by finding all matching pairs according to the current rule. Progression: Levels start simple and gradually introduce more complex matching rules, larger grids, and a wider variety of items. "Runway Recall" (Challenge Mode - Timed): Objective: Clear the board as quickly as possible, aiming for a high score on the leaderboards. Gameplay: Focus on speed and memory under pressure. "Curated Collection" (Custom Mode): Objective: Allows players to set their own rules and select specific item categories for a tailored challenge. Gameplay: Ideal for practicing specific matching types or just having fun. B. Basic Controls: Flipping Cards: Click/Tap: Simply click or tap on any face-down card to reveal its fashion item. Two Cards at a Time: You can only have two cards flipped face-up at any given moment. Clicking a third card will automatically flip the first one back down (unless it's part of a successful match). C. Gameplay Flow (Wardrobe Wisdom Example): Level Start: The game board (e.g., 4x4 grid of 16 face-down cards) appears. The Matching Rule is clearly displayed: e.g., "Match by Item Type." (This means you need to find two cards that are both dresses, or both scarves, etc.). A selection of cards, say 8 pairs chosen randomly from your total library, are distributed across the grid. First Turn: Click Card 1: You click on a card, and it flips to reveal a "Blue Trench Coat." Click Card 2: You then click a second card, which reveals a "Red Beret." Matching Attempt & Feedback: Compare: Based on the rule "Match by Item Type," a "Blue Trench Coat" and a "Red Beret" are not a match (they are different item types). Incorrect Match: Both cards flip back face-down after a brief moment (e.g., 2-3 seconds). You lose a small amount of points, and your "Fashion Sense" meter might slightly decrease in challenge modes. Correct Match: If you had clicked another "Coat" (e.g., "Brown Wool Coat"), the rule "Match by Item Type" would be satisfied. Both "Blue Trench Coat" and "Brown Wool Coat" cards would remain face-up and then disappear from the board, indicating a successful match. You gain points, and your "Fashion Sense" meter might slightly increase. Repeat: Continue flipping cards and trying to find matching pairs until the entire board is clear. Level Completion: Once all cards are matched, the level ends. Your score, number of turns, and star rating are displayed. You unlock the next level, which will introduce a new or more complex matching rule, a larger grid, or a wider variety of item combinations. Improving the Game & Explaining it to Artificial Intelligence (AI Development Focus): This game is an excellent testbed for AI because it forces it to perform fine-grained image classification and attribute recognition. I. The Enhanced "Fashion Item Library" (Crucial for AI): This is the backbone of the AI's learning. Each of your 150 unique images (30 per category) must be meticulously labeled with rich metadata. A. Data Fields for Each Image (Beyond Basic Category): image_id (Primary Key): Unique identifier (e.g., coat_001.jpg, dress_party_005.jpg). file_path: Relative path to the image. item_type (Categorical String): "Coat," "Dress," "Scarf," "Beret," "Accessory." (This is your primary classification for matching by type). main_color (Categorical String): Dominant color (e.g., "Red," "Blue," "Black," "White," "Green," "Yellow," "Purple," "Brown," "Gray," "Multi-color"). Crucial for color matching. sub_colors (List of Strings - Optional): For multi-colored items (e.g., ["Red", "Blue"] for a plaid scarf). style (Categorical String): A more abstract classification. Examples: "Casual," "Formal," "Vintage," "Modern," "Bohemian," "Sporty," "Classic," "Avant-Garde," "Minimalist." material (Categorical String - Optional): "Wool," "Cotton," "Silk," "Leather," "Denim," "Sequined," "Velvet." pattern (Categorical String - Optional): "Solid," "Striped," "Polka Dot," "Floral," "Plaid," "Animal Print," "Geometric." sub_type (Categorical String - More specific): For Coats: "Trench Coat," "Puffer Jacket," "Blazer," "Parka." For Dresses: "A-line," "Sheath," "Maxi," "Cocktail," "Ball Gown." For Scarves: "Pashmina," "Bandana," "Infinity," "Silk Scarf." For Berets: "French Beret," "Knitted Beret." For Accessories: "Handbag," "Jewelry," "Sunglasses," "Belt," "Gloves." associated_era (String - Optional, for potential future integration with Chrono-Couture): "1920s," "1950s," "Modern." B. Data Collection & Augmentation (for AI Training): High-Quality Images: Each item photographed consistently (e.g., against a plain white background, similar lighting, centered). Dataset Size: While you specified 150 unique images, for robust AI training, each of these 150 images would ideally have several augmented versions (rotated, scaled, brightness adjusted, slight distortions) to increase the dataset size artificially. Human Labeling: This initial comprehensive labeling of all 150 images is essential. II. AI Model Explanation (How the AI Plays the Game): The AI's goal is to learn to perform image classification and attribute extraction to make the correct matches. Visual Perception (Input): The AI receives the image data of the face-down cards. When a card is "flipped," the AI is given the pixel data of that fashion item. Feature Learning (Convolutional Neural Network - CNN): The core of the AI is a Convolutional Neural Network (CNN), trained on your labeled "Fashion Item Library." Early Layers: These layers learn to detect basic visual features like edges, corners, and textures within the image. Mid Layers: These combine basic features to recognize more complex shapes, like the outline of a sleeve, the shape of a buckle, or the weave of a fabric. Late Layers: These higher-level features are then used to classify the entire item and its attributes. Multi-Task Learning (Crucial for diverse matching rules): Instead of just telling the AI "this is a dress," you train it to recognize multiple characteristics simultaneously. The CNN will have multiple output "heads": Head 1 (Item Type Classifier): Predicts "Coat," "Dress," "Scarf," "Beret," "Accessory." Head 2 (Color Classifier): Predicts "Red," "Blue," "Black," etc. Head 3 (Style Classifier): Predicts "Vintage," "Modern," "Bohemian," etc. Head 4 (Sub-type Classifier - Optional, for finer matching): Predicts "Trench Coat," "A-Line Dress," etc. Each "head" of the CNN is trained using the corresponding labels from your metadata. This makes the AI much more versatile. Memory (State Management for the Game): When the AI "flips" a card, it stores the identified item_type, main_color, and style (and other attributes) of that card in its "short-term memory." It also remembers the location of that card on the grid. Decision Making (Matching Logic): When 1 Card is Flipped: The AI analyzes the attributes of the first flipped card. It then systematically "predicts" what attributes it needs to find for the second card based on the current "Matching Rule." When 2 Cards are Flipped: The AI compares the attributes of the two flipped cards against the current level's matching rule. Example Rule: "Match by Color (Red)": The AI checks if card1.main_color == "Red" AND card2.main_color == "Red". Example Rule: "Match by Style (Vintage)": The AI checks if card1.style == "Vintage" AND card2.style == "Vintage". Example Rule: "Match a Coat & Beret Pair": The AI checks if (card1.item_type == "Coat" AND card2.item_type == "Beret") OR (card1.item_type == "Beret" AND card2.item_type == "Coat"). (This introduces a relational matching aspect). Success/Failure: The game engine provides immediate feedback (correct/incorrect). Learning & Optimization (Reinforcement Learning / Fine-tuning): Error Backpropagation: When the AI makes an incorrect guess, the CNN's internal parameters are slightly adjusted to reduce the chance of that mistake happening again for similar visual inputs. Reward System: Correct matches are positive rewards, encouraging the AI to reinforce the learned patterns. Incorrect matches are negative, causing it to "unlearn" those faulty connections. Exploration vs. Exploitation: The AI can be programmed to sometimes "explore" (flip random cards to gather more information about unseen items) versus "exploit" (try to match based on current knowledge). III. Game Progression & AI Challenge: The "30 coats, 30 dresses, 30 scarves, 30 berets, 30 accessories" gives immense flexibility for varied matching rules: Level 1 (Easy): Match by Item Type. (AI needs strong item_type classification). Level 5 (Medium): Match by Main Color. (AI needs strong main_color classification). Level 10 (Hard): Match by Style. (AI needs strong style classification – more abstract and challenging). Level 15 (Advanced): Match a "Thematic Pair" (e.g., "Match a Formal Dress with a Formal Accessory"). (AI needs to combine item_type and style classifications). Level 20 (Expert): Match by sub_type (e.g., "Match two Trench Coats"). (AI needs highly granular classification). Level 25 (Ultimate): Find a "Full Outfit" (e.g., a "Vintage Coat" with a "Vintage Beret" and a "Vintage Scarf"). This would be a 3-card match, introducing a new mechanic and complex relational AI reasoning.
User prompt
"Fashion Finesse" presents a grid of face-down cards. Each card, when flipped, reveals an image of a fashion item (a coat, dress, scarf, beret, or accessory). The player's task is to find matching pairs according to the current round's rule. The quantity of items (30 of each type) allows for multiple variations of matching sets within a game session.
Initial prompt
Genre: 2D Picture Matching, Fashion Recognition, Puzzle, Memory Core Concept: Players match pairs of fashion items based on specific criteria (type, color, style) from a grid of face-down cards. The goal is to clear the board efficiently, demonstrating a keen "Stylist's Eye." This game is designed to be easily adaptable for AI training.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Card = Container.expand(function (itemId, itemType, itemColor) { var self = Container.call(this); self.itemId = itemId; self.itemType = itemType; self.itemColor = itemColor; self.isFlipped = false; self.isMatched = false; // Create card back var cardBack = self.attachAsset('cardBack', { anchorX: 0.5, anchorY: 0.5 }); // Create card front (hidden initially) var cardFront = self.attachAsset('cardFront', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); // Create fashion item var fashionItem = self.attachAsset(itemId, { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.flip = function () { if (self.isFlipped || self.isMatched) return; self.isFlipped = true; LK.getSound('cardFlip').play(); // Animate flip tween(cardBack, { alpha: 0 }, { duration: 150 }); tween(cardFront, { alpha: 1 }, { duration: 150 }); tween(fashionItem, { alpha: 1 }, { duration: 150 }); }; self.flipBack = function () { if (!self.isFlipped || self.isMatched) return; self.isFlipped = false; // Animate flip back tween(cardBack, { alpha: 1 }, { duration: 150 }); tween(cardFront, { alpha: 0 }, { duration: 150 }); tween(fashionItem, { alpha: 0 }, { duration: 150 }); }; self.setMatched = function () { self.isMatched = true; self.isFlipped = true; // Flash effect for matched card LK.effects.flashObject(self, 0x00FF00, 500); }; self.down = function (x, y, obj) { if (!self.isMatched && !self.isFlipped && flippedCards.length < 2) { flippedCards.push(self); self.flip(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C3E50 }); /**** * Game Code ****/ var cards = []; var flippedCards = []; var currentLevel = 1; var score = 0; var moves = 0; var lives = 8; // 8 lives per level var gridSize = 4; // Start with 4x4 grid var matchingRule = 'type'; // Current matching rule // Fashion items data var fashionItems = [ // Coats { id: 'coat1', type: 'coat', color: 'red' }, { id: 'coat2', type: 'coat', color: 'teal' }, { id: 'coat3', type: 'coat', color: 'blue' }, { id: 'coat4', type: 'coat', color: 'green' }, { id: 'coat5', type: 'coat', color: 'brown' }, { id: 'coat6', type: 'coat', color: 'indigo' }, { id: 'coat7', type: 'coat', color: 'darkgreen' }, { id: 'coat8', type: 'coat', color: 'crimson' }, { id: 'coat9', type: 'coat', color: 'dodgerblue' }, { id: 'coat10', type: 'coat', color: 'gold' }, // Dresses { id: 'dress1', type: 'dress', color: 'yellow' }, { id: 'dress2', type: 'dress', color: 'orange' }, { id: 'dress3', type: 'dress', color: 'pink' }, { id: 'dress4', type: 'dress', color: 'purple' }, { id: 'dress5', type: 'dress', color: 'brown' }, { id: 'dress6', type: 'dress', color: 'indigo' }, { id: 'dress7', type: 'dress', color: 'darkgreen' }, { id: 'dress8', type: 'dress', color: 'crimson' }, { id: 'dress9', type: 'dress', color: 'dodgerblue' }, { id: 'dress10', type: 'dress', color: 'gold' }, // Scarves { id: 'scarf1', type: 'scarf', color: 'purple' }, { id: 'scarf2', type: 'scarf', color: 'orange' }, { id: 'scarf3', type: 'scarf', color: 'red' }, { id: 'scarf4', type: 'scarf', color: 'green' }, { id: 'scarf5', type: 'scarf', color: 'brown' }, { id: 'scarf6', type: 'scarf', color: 'indigo' }, { id: 'scarf7', type: 'scarf', color: 'darkgreen' }, { id: 'scarf8', type: 'scarf', color: 'crimson' }, { id: 'scarf9', type: 'scarf', color: 'dodgerblue' }, { id: 'scarf10', type: 'scarf', color: 'gold' }, // Berets { id: 'beret1', type: 'beret', color: 'gray' }, { id: 'beret2', type: 'beret', color: 'orange' }, { id: 'beret3', type: 'beret', color: 'purple' }, { id: 'beret4', type: 'beret', color: 'teal' }, { id: 'beret5', type: 'beret', color: 'brown' }, { id: 'beret6', type: 'beret', color: 'indigo' }, { id: 'beret7', type: 'beret', color: 'darkgreen' }, { id: 'beret8', type: 'beret', color: 'crimson' }, { id: 'beret9', type: 'beret', color: 'dodgerblue' }, { id: 'beret10', type: 'beret', color: 'gold' }, // Accessories { id: 'accessory1', type: 'accessory', color: 'yellow' }, { id: 'accessory2', type: 'accessory', color: 'purple' }, { id: 'accessory3', type: 'accessory', color: 'green' }, { id: 'accessory4', type: 'accessory', color: 'red' }, { id: 'accessory5', type: 'accessory', color: 'blue' }, { id: 'accessory6', type: 'accessory', color: 'orange' }, { id: 'accessory7', type: 'accessory', color: 'pink' }, { id: 'accessory8', type: 'accessory', color: 'teal' }, { id: 'accessory9', type: 'accessory', color: 'gray' }, { id: 'accessory10', type: 'accessory', color: 'black' }]; // UI Elements var scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var levelTxt = new Text2('Level 1 - Match by Type', { size: 60, fill: 0xFFD700 }); levelTxt.anchor.set(0.5, 0); levelTxt.y = 100; LK.gui.top.addChild(levelTxt); var livesTxt = new Text2('8 remaining', { size: 60, fill: 0xFF4444 }); livesTxt.anchor.set(0, 0); LK.gui.topLeft.addChild(livesTxt); livesTxt.x = 120; // Offset from left to avoid menu icon function shuffleArray(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; } function createGameBoard() { // Clear existing cards for (var i = 0; i < cards.length; i++) { cards[i].destroy(); } cards = []; flippedCards = []; var totalCards = gridSize * gridSize; var pairsNeeded = totalCards / 2; // Select random items for this level var selectedItems = shuffleArray(fashionItems.slice()).slice(0, pairsNeeded); var gameItems = []; // Create pairs for (var i = 0; i < selectedItems.length; i++) { gameItems.push(selectedItems[i]); gameItems.push(selectedItems[i]); // Add duplicate for pair } // Shuffle the pairs gameItems = shuffleArray(gameItems); // Calculate grid positioning var cardSpacing = 360; var startX = (2048 - gridSize * cardSpacing) / 2 + cardSpacing / 2; var startY = (2732 - gridSize * cardSpacing) / 2 + cardSpacing / 2; // Create cards for (var i = 0; i < totalCards; i++) { var row = Math.floor(i / gridSize); var col = i % gridSize; var item = gameItems[i]; var card = new Card(item.id, item.type, item.color); card.x = startX + col * cardSpacing; card.y = startY + row * cardSpacing; cards.push(card); game.addChild(card); } } function checkMatch(card1, card2) { // Ensure we're not comparing the same card instance if (card1 === card2) return false; switch (matchingRule) { case 'type': return card1.itemType === card2.itemType && card1.itemId === card2.itemId; case 'color': return card1.itemColor === card2.itemColor && card1.itemId === card2.itemId; case 'exact': return card1.itemId === card2.itemId; default: return card1.itemType === card2.itemType && card1.itemId === card2.itemId; } } function showConfetti(centerX, centerY) { // Create confetti particles around the matched cards for (var i = 0; i < 12; i++) { var confetti = LK.getAsset('cardFront', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3, x: centerX, y: centerY }); // Random colors for confetti var colors = [0xFF6B6B, 0x4ECDC4, 0x45B7D1, 0xFFA07A, 0x98D8C8, 0xF7DC6F]; confetti.tint = colors[Math.floor(Math.random() * colors.length)]; game.addChild(confetti); // Random direction and distance var angle = Math.PI * 2 * i / 12 + (Math.random() - 0.5) * 0.5; var distance = 100 + Math.random() * 100; var targetX = centerX + Math.cos(angle) * distance; var targetY = centerY + Math.sin(angle) * distance; // Animate confetti explosion tween(confetti, { x: targetX, y: targetY, scaleX: 0.1, scaleY: 0.1, alpha: 0, rotation: Math.random() * Math.PI * 4 }, { duration: 800 + Math.random() * 400, easing: tween.easeOut, onFinish: function onFinish() { confetti.destroy(); } }); } } function processFlippedCards() { if (flippedCards.length !== 2) return; var card1 = flippedCards[0]; var card2 = flippedCards[1]; // Clear flipped cards array immediately to prevent reprocessing var cardsToProcess = flippedCards.slice(); flippedCards = []; if (checkMatch(card1, card2)) { // Match found score += 10; scoreTxt.setText('Score: ' + score); lives++; livesTxt.setText(lives + ' remaining'); card1.setMatched(); card2.setMatched(); LK.getSound('match').play(); // Show confetti around the matched cards var centerX = (card1.x + card2.x) / 2; var centerY = (card1.y + card2.y) / 2; showConfetti(centerX, centerY); // Check if level complete var allMatched = true; for (var i = 0; i < cards.length; i++) { if (!cards[i].isMatched) { allMatched = false; break; } } if (allMatched) { // Level complete LK.setTimeout(function () { nextLevel(); }, 1000); } } else { // No match score = Math.max(0, score - 2); scoreTxt.setText('Score: ' + score); lives--; livesTxt.setText(lives + ' remaining'); LK.getSound('wrong').play(); // Check if game over if (lives <= 0) { LK.setTimeout(function () { LK.showGameOver(); }, 1000); } else { // Flip cards back after delay LK.setTimeout(function () { card1.flipBack(); card2.flipBack(); }, 1000); } } } function nextLevel() { currentLevel++; // Update matching rule based on level if (currentLevel <= 3) { matchingRule = 'type'; levelTxt.setText('Level ' + currentLevel + ' - Match by Type'); } else if (currentLevel <= 6) { matchingRule = 'color'; levelTxt.setText('Level ' + currentLevel + ' - Match by Color'); } else { matchingRule = 'exact'; levelTxt.setText('Level ' + currentLevel + ' - Match Identical Items'); } // Increase grid size every 3 levels if (currentLevel % 3 === 1 && currentLevel > 1) { gridSize = Math.min(6, gridSize + 1); } lives = 8; // Reset lives for new level livesTxt.setText(lives + ' remaining'); createGameBoard(); } // Handle third card flip game.update = function () { if (flippedCards.length > 2) { // More than 2 cards flipped, flip the first one back var firstCard = flippedCards.shift(); firstCard.flipBack(); } if (flippedCards.length === 2) { // Process the two flipped cards immediately processFlippedCards(); } }; // Start playing random background music var musicTracks = ['music1', 'music2', 'music3', 'music4', 'music5', 'music6', 'music7', 'music8', 'music9', 'music10']; var randomMusicIndex = Math.floor(Math.random() * musicTracks.length); var selectedMusic = musicTracks[randomMusicIndex]; LK.playMusic(selectedMusic); // Initialize first level createGameBoard();
===================================================================
--- original.js
+++ change.js
@@ -442,8 +442,10 @@
if (checkMatch(card1, card2)) {
// Match found
score += 10;
scoreTxt.setText('Score: ' + score);
+ lives++;
+ livesTxt.setText(lives + ' remaining');
card1.setMatched();
card2.setMatched();
LK.getSound('match').play();
// Show confetti around the matched cards
cute design beret top view.. In-Game asset. 2d. High contrast. No shadows
cute designer jacket top view.. In-Game asset. 2d. High contrast. No shadows
cute designer jacket top view.. In-Game asset. 2d. High contrast. No shadows
cute designer dress top view.. In-Game asset. 2d. High contrast. No shadows
cute designer dress top view.. In-Game asset. 2d. High contrast. No shadows
cute design scarf top view.. In-Game asset. 2d. High contrast. No shadows
cute design scarf top view.. In-Game asset. 2d. High contrast. No shadows
cute design scarf top view.. In-Game asset. 2d. High contrast. No shadows
cute design fashion logo card pattern top view.. In-Game asset. 2d. High contrast. No shadows
change your colors
cute design scarf top view.. In-Game asset. 2d. High contrast. No shadows
cute design scarf top view.. In-Game asset. 2d. High contrast. No shadows
cute design scarf top view.. In-Game asset. 2d. High contrast. No shadows
cute design accessory top view.. In-Game asset. 2d. High contrast. No shadows
cute design accessory top view.. In-Game asset. 2d. High contrast. No shadows
cute design accessory top view.. In-Game asset. 2d. High contrast. No shadows
cute design accessory top view.. In-Game asset. 2d. High contrast. No shadows
cute design beret top view.. In-Game asset. 2d. High contrast. No shadows
cute candy design beanie top view.. In-Game asset. 2d. High contrast. No shadows
cute candy cat design beanie top view.. In-Game asset. 2d. High contrast. No shadows
cute candy cat design jacket top view.. In-Game asset. 2d. High contrast. No shadows
cute candy design jacket top view.. In-Game asset. 2d. High contrast. No shadows
cute heart chocolate design jacket top view.. In-Game asset. 2d. High contrast. No shadows
cute pink heart chocolate design dress top view.. In-Game asset. 2d. High contrast. No shadows
cute pink heart chocolate design dress top view.. In-Game asset. 2d. High contrast. No shadows
cute pink heart design dress top view.. In-Game asset. 2d. High contrast. No shadows
cute purple heart candy design dress top view.. In-Game asset. 2d. High contrast. No shadows
cute purple candy design dress top view.. In-Game asset. 2d. High contrast. No shadows