User prompt
Can you make it so you start out with zero coins and when it’s a new selfie, if your coins are 10 or higher, 10 coins get spent. If you have less than 10 coins, it’s the same as before.
User prompt
Can you make it so it shows your coins
User prompt
Can you make it so you get coins after you get your rating and you can you can use those coins to get a higher chance of getting a four or five even if you did a bad job
User prompt
Can you make each button that changes how you look actually change how you look ↪💡 Consider importing and using the following plugins: @upit/facekit.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Selfie Superstar
Initial prompt
Make a game where your camera and microphone is on and you can change yourself to look different and you take pictures and AI bots rate it out of 5
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { unlockedFilters: ["normal", "grayscale"], coins: 0, highestRating: 0 }); var facekit = LK.import("@upit/facekit.v1"); /**** * Classes ****/ var Button = Container.expand(function (text, width, height) { var self = Container.call(this); var background = self.attachAsset('button', { width: width || 300, height: height || 100, anchorX: 0.5, anchorY: 0.5 }); var label = new Text2(text, { size: 50, fill: 0xFFFFFF }); label.anchor.set(0.5, 0.5); self.addChild(label); self.setEnabled = function (enabled) { self.interactive = enabled; background.alpha = enabled ? 1.0 : 0.5; }; self.down = function (x, y, obj) { tween(background, { scaleX: 0.95, scaleY: 0.95 }, { duration: 100 }); }; self.up = function (x, y, obj) { tween(background, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100 }); }; self.setText = function (newText) { label.setText(newText); }; return self; }); var EffectIndicator = Container.expand(function () { var self = Container.call(this); var circle = self.attachAsset('effectIndicator', { anchorX: 0.5, anchorY: 0.5 }); var label = new Text2("🎵", { size: 50, fill: 0xFFFFFF }); label.anchor.set(0.5, 0.5); self.addChild(label); self.pulse = function (strength) { var targetScale = 0.8 + strength * 0.5; tween(self, { scaleX: targetScale, scaleY: targetScale }, { duration: 100, onFinish: function onFinish() { tween(self, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200 }); } }); }; return self; }); var FilterPreview = Container.expand(function (filterId, filterName) { var self = Container.call(this); self.filterId = filterId; var background = self.attachAsset('filterPreview', { anchorX: 0.5, anchorY: 0.5 }); var label = new Text2(filterName, { size: 30, fill: 0xFFFFFF }); label.anchor.set(0.5, 0.5); label.y = 90; self.addChild(label); self.setSelected = function (selected) { background.tint = selected ? 0x3498db : 0xcccccc; }; self.setLocked = function (locked) { self.interactive = !locked; self.alpha = locked ? 0.5 : 1.0; if (locked) { var lockIcon = new Text2("🔒", { size: 60, fill: 0xFFFFFF }); lockIcon.anchor.set(0.5, 0.5); self.addChild(lockIcon); } else { // Remove lock icon if it exists for (var i = self.children.length - 1; i >= 0; i--) { if (self.children[i] instanceof Text2 && self.children[i].text === "🔒") { self.removeChild(self.children[i]); break; } } } }; self.down = function (x, y, obj) { tween(background, { scaleX: 0.95, scaleY: 0.95 }, { duration: 100 }); }; self.up = function (x, y, obj) { tween(background, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100 }); }; return self; }); var Judge = Container.expand(function (judgeName) { var self = Container.call(this); var background = self.attachAsset('judgeBackground', { anchorX: 0.5, anchorY: 0.5 }); var nameLabel = new Text2(judgeName, { size: 40, fill: 0xFFFFFF }); nameLabel.anchor.set(0.5, 0); nameLabel.y = -120; self.addChild(nameLabel); var commentLabel = new Text2("", { size: 35, fill: 0xFFFFFF }); commentLabel.anchor.set(0.5, 0); commentLabel.y = -60; self.addChild(commentLabel); // Create stars self.stars = []; for (var i = 0; i < 5; i++) { var star = new RatingStar(); star.x = (i - 2) * 90; star.y = 60; self.addChild(star); self.stars.push(star); } self.setRating = function (rating) { for (var i = 0; i < 5; i++) { self.stars[i].setFilled(i < rating); if (i < rating) { // Delay the animation for each star (function (index) { LK.setTimeout(function () { self.stars[index].animateStar(); }, 200 * index); })(i); } } }; self.setComment = function (comment) { commentLabel.setText(comment); }; self.animateEntrance = function (delay) { self.alpha = 0; self.y = 100; LK.setTimeout(function () { tween(self, { alpha: 1, y: 0 }, { duration: 500, easing: tween.easeOut }); }, delay); }; return self; }); var RatingStar = Container.expand(function () { var self = Container.call(this); var emptyStarGraphic = self.attachAsset('ratingStarEmpty', { anchorX: 0.5, anchorY: 0.5 }); var filledStarGraphic = self.attachAsset('ratingStarFilled', { anchorX: 0.5, anchorY: 0.5 }); filledStarGraphic.alpha = 0; self.setFilled = function (filled) { emptyStarGraphic.alpha = filled ? 0 : 1; filledStarGraphic.alpha = filled ? 1 : 0; }; self.animateStar = function () { tween(self, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, onFinish: function onFinish() { tween(self, { scaleX: 1.0, scaleY: 1.0 }, { duration: 200 }); } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a1a }); /**** * Game Code ****/ // Game states var STATE_CAMERA = "camera"; var STATE_REVIEW = "review"; var currentState = STATE_CAMERA; // Current filter settings var currentFilter = "normal"; var availableFilters = [{ id: "normal", name: "Normal", unlockRating: 0 }, { id: "grayscale", name: "Grayscale", unlockRating: 0 }, { id: "sepia", name: "Sepia", unlockRating: 2 }, { id: "vibrant", name: "Vibrant", unlockRating: 3 }, { id: "blur", name: "Blur", unlockRating: 3.5 }, { id: "pixelate", name: "Pixelate", unlockRating: 4 }, { id: "rainbow", name: "Rainbow", unlockRating: 4.5 }]; // Judge configurations var judges = [{ name: "Alex", comments: { 1: "Not feeling it...", 2: "Has potential.", 3: "Pretty good!", 4: "Very creative!", 5: "Absolute perfection!" } }, { name: "Taylor", comments: { 1: "Needs work...", 2: "Getting better!", 3: "Nice effort!", 4: "Love the style!", 5: "Outstanding!" } }, { name: "Jordan", comments: { 1: "Try again...", 2: "Almost there.", 3: "Good composition!", 4: "Excellent work!", 5: "Masterpiece!" } }]; // Last detected voice volume for effects var lastVoiceVolume = 0; var voiceEffectThreshold = 0.3; var voiceEffectActive = false; // Create coin display var coinText = new Text2("Coins: " + storage.coins, { size: 60, fill: 0xFFFFFF }); coinText.anchor.set(0.5, 0.5); coinText.x = 2048 - 150; coinText.y = 100; game.addChild(coinText); // Create UI elements var cameraFrame = game.addChild(LK.getAsset('cameraFrame', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, alpha: 0.2 })); // Create filter selector container var filterContainer = new Container(); filterContainer.y = 2732 - 200; game.addChild(filterContainer); // Create filter previews var filterPreviews = {}; var filterPreviewWidth = 170; var totalFiltersWidth = availableFilters.length * filterPreviewWidth; var startX = (2048 - totalFiltersWidth) / 2 + filterPreviewWidth / 2; availableFilters.forEach(function (filter, index) { var preview = new FilterPreview(filter.id, filter.name); preview.x = startX + index * filterPreviewWidth; preview.y = 0; var isUnlocked = storage.unlockedFilters.indexOf(filter.id) !== -1; preview.setLocked(!isUnlocked); preview.setSelected(filter.id === currentFilter); filterContainer.addChild(preview); filterPreviews[filter.id] = preview; }); // Create capture button var captureButton = new Button("Take Selfie", 400, 100); captureButton.x = 2048 / 2; captureButton.y = 2732 - 400; game.addChild(captureButton); // Create effect indicator var effectIndicator = new EffectIndicator(); effectIndicator.x = 2048 - 150; effectIndicator.y = 150; effectIndicator.alpha = 0.7; game.addChild(effectIndicator); // Create judge container for ratings var judgeContainer = new Container(); judgeContainer.x = 2048 / 2; judgeContainer.y = 2732 / 2; judgeContainer.visible = false; game.addChild(judgeContainer); // Create judges var judgeObjects = []; judges.forEach(function (judgeData, index) { var judge = new Judge(judgeData.name); judge.y = index * 350 - 350; judgeContainer.addChild(judge); judgeObjects.push(judge); }); // Create return button for after ratings var returnButton = new Button("New Selfie", 400, 100); returnButton.x = 2048 / 2; returnButton.y = 2732 - 200; returnButton.visible = false; game.addChild(returnButton); // Current ratings info var currentRatings = []; var averageRatingText = new Text2("", { size: 80, fill: 0xFFFFFF }); averageRatingText.anchor.set(0.5, 0.5); averageRatingText.x = 2048 / 2; averageRatingText.y = 200; averageRatingText.visible = false; game.addChild(averageRatingText); // Function to switch between camera and review states function switchToState(newState) { currentState = newState; if (newState === STATE_CAMERA) { cameraFrame.visible = true; filterContainer.visible = true; captureButton.visible = true; judgeContainer.visible = false; returnButton.visible = false; averageRatingText.visible = false; // Reset any effects voiceEffectActive = false; // Start background music LK.playMusic('bgMusic', { fade: { start: 0, end: 0.3, duration: 1000 } }); } else if (newState === STATE_REVIEW) { cameraFrame.visible = false; filterContainer.visible = false; captureButton.visible = false; judgeContainer.visible = true; returnButton.visible = true; averageRatingText.visible = true; // Generate random ratings from judges generateRatings(); // Stop background music LK.stopMusic(); // Play applause sound LK.getSound('applause').play(); } } // Function to handle filter selection function selectFilter(filterId) { if (currentFilter === filterId) { return; } // Deselect current filter filterPreviews[currentFilter].setSelected(false); // Set and select new filter currentFilter = filterId; filterPreviews[currentFilter].setSelected(true); // Apply the selected filter using facekit switch (filterId) { case "normal": facekit.applyFilter("normal"); break; case "grayscale": facekit.applyFilter("grayscale"); break; case "sepia": facekit.applyFilter("sepia"); break; case "vibrant": facekit.applyFilter("vibrant"); break; case "blur": facekit.applyFilter("blur"); break; case "pixelate": facekit.applyFilter("pixelate"); break; case "rainbow": facekit.applyFilter("rainbow"); break; } } // Generate ratings from judges function generateRatings() { currentRatings = []; var totalRating = 0; // Reset judges and prepare for animation judgeObjects.forEach(function (judge) { judge.setRating(0); judge.setComment(""); }); // Generate a rating for each judge judges.forEach(function (judgeData, index) { // Base rating is random but weighted toward the middle var baseRating = Math.floor(Math.random() * 3) + 2; // 2-4 // Use coins to increase the chance of getting a higher rating if (storage.coins >= 10) { var chanceBoost = Math.random(); if (chanceBoost > 0.5) { baseRating += 1; // Increase base rating by 1 storage.coins -= 10; // Deduct 10 coins for the boost console.log("Used 10 coins for a rating boost. Remaining coins: " + storage.coins); } } // Adjust based on current filter (bonus for using advanced filters) var filterIndex = availableFilters.findIndex(function (f) { return f.id === currentFilter; }); var filterBonus = filterIndex / 10; // Small bonus for advanced filters // Calculate final rating (1-5) var finalRating = Math.min(5, Math.max(1, Math.round(baseRating + filterBonus))); currentRatings.push(finalRating); totalRating += finalRating; // Set rating and comment with delay (function (judgeObj, rating, comments) { var delay = 1000 + index * 1000; // Stagger judges' responses LK.setTimeout(function () { judgeObj.animateEntrance(0); judgeObj.setRating(rating); judgeObj.setComment(comments[rating]); LK.getSound('judgeComment').play(); }, delay); })(judgeObjects[index], finalRating, judgeData.comments); }); // Calculate and display average rating var averageRating = totalRating / judges.length; // Award coins based on average rating var coinsEarned = Math.round(averageRating * 10); // Earn 10 coins per star storage.coins = (storage.coins || 0) + coinsEarned; console.log("Coins earned: " + coinsEarned + ", Total coins: " + storage.coins); coinText.setText("Coins: " + storage.coins); // Update coin display // Update the highest rating if this is better if (averageRating > storage.highestRating) { storage.highestRating = averageRating; // Unlock new filters based on rating availableFilters.forEach(function (filter) { if (filter.unlockRating <= averageRating && storage.unlockedFilters.indexOf(filter.id) === -1) { storage.unlockedFilters.push(filter.id); } }); } // Display average rating LK.setTimeout(function () { averageRatingText.setText("Rating: " + averageRating.toFixed(1) + " / 5.0"); averageRatingText.alpha = 0; averageRatingText.visible = true; tween(averageRatingText, { alpha: 1 }, { duration: 500 }); }, 4000); } // Handle touch events for game elements game.down = function (x, y, obj) { // Handle filter selection if (currentState === STATE_CAMERA) { for (var filterId in filterPreviews) { var preview = filterPreviews[filterId]; if (preview.interactive && preview.getBounds().contains(x, y)) { selectFilter(filterId); return; } } } }; // Capture button event handler captureButton.down = function (x, y, obj) { if (currentState !== STATE_CAMERA) { return; } // Play camera click sound LK.getSound('cameraClick').play(); // Flash screen effect LK.effects.flashScreen(0xffffff, 500); // Switch to review mode after a short delay LK.setTimeout(function () { switchToState(STATE_REVIEW); }, 600); }; // Return button event handler returnButton.down = function (x, y, obj) { if (currentState !== STATE_REVIEW) { return; } // Deduct 10 coins if player has 10 or more coins if (storage.coins >= 10) { storage.coins -= 10; console.log("Spent 10 coins for a new selfie. Remaining coins: " + storage.coins); coinText.setText("Coins: " + storage.coins); // Update coin display } // Update filter previews to show newly unlocked filters availableFilters.forEach(function (filter) { var preview = filterPreviews[filter.id]; var isUnlocked = storage.unlockedFilters.indexOf(filter.id) !== -1; preview.setLocked(!isUnlocked); }); // Switch back to camera mode switchToState(STATE_CAMERA); }; // Game update function game.update = function () { // Handle voice-activated effects in camera mode if (currentState === STATE_CAMERA) { // Detect voice volume changes var volume = facekit.volume; // Update effect indicator based on current volume if (volume > lastVoiceVolume && volume > voiceEffectThreshold) { effectIndicator.pulse(volume); // Activate voice effect if over threshold if (volume > voiceEffectThreshold && !voiceEffectActive) { voiceEffectActive = true; // Apply random effect when voice detected var effect = Math.floor(Math.random() * 3); // Effects could include: // 1. Temporary color flash // 2. Scale animation // 3. Rotation effect switch (effect) { case 0: // Temporary color tint var randomColor = Math.random() * 0xFFFFFF; cameraFrame.tint = randomColor; LK.setTimeout(function () { tween(cameraFrame, { tint: 0xFFFFFF }, { duration: 500 }); }, 500); break; case 1: // Scale animation tween(cameraFrame, { scaleX: 1.1, scaleY: 1.1 }, { duration: 300, onFinish: function onFinish() { tween(cameraFrame, { scaleX: 1.0, scaleY: 1.0 }, { duration: 400 }); } }); break; case 2: // Rotation effect var startRotation = cameraFrame.rotation; var targetRotation = startRotation + Math.PI * 0.1; tween(cameraFrame, { rotation: targetRotation }, { duration: 300, onFinish: function onFinish() { tween(cameraFrame, { rotation: startRotation }, { duration: 400 }); } }); break; } } } else if (volume < voiceEffectThreshold && voiceEffectActive) { // Reset voice effect flag when volume drops voiceEffectActive = false; } lastVoiceVolume = volume; } }; // Start with camera state switchToState(STATE_CAMERA);
===================================================================
--- original.js
+++ change.js
@@ -559,8 +559,14 @@
returnButton.down = function (x, y, obj) {
if (currentState !== STATE_REVIEW) {
return;
}
+ // Deduct 10 coins if player has 10 or more coins
+ if (storage.coins >= 10) {
+ storage.coins -= 10;
+ console.log("Spent 10 coins for a new selfie. Remaining coins: " + storage.coins);
+ coinText.setText("Coins: " + storage.coins); // Update coin display
+ }
// Update filter previews to show newly unlocked filters
availableFilters.forEach(function (filter) {
var preview = filterPreviews[filter.id];
var isUnlocked = storage.unlockedFilters.indexOf(filter.id) !== -1;