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"],
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 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);
}
// 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
// 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;
// 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;
}
// 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
@@ -1,6 +1,599 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ unlockedFilters: ["normal", "grayscale"],
+ 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: 0x000000
-});
\ No newline at end of file
+ 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 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);
+}
+// 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
+ // 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;
+ // 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;
+ }
+ // 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);
\ No newline at end of file