/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { legpot: 0, level: 1 }); /**** * Classes ****/ // Bouton de peine var PunishmentButton = Container.expand(function () { var self = Container.call(this); self.punishId = null; self.text = null; self.icon = null; self.callback = null; self.init = function (punishId, label, iconId, callback) { self.punishId = punishId; self.removeChildren(); self.icon = self.attachAsset(iconId, { anchorX: 0.5, anchorY: 0.5 }); self.icon.y = 0; self.text = new Text2(label, { size: 60, fill: "#222" }); self.text.anchor.set(0.5, 0); self.text.y = self.icon.height / 2 + 10; self.addChild(self.text); self.callback = callback; }; self.down = function (x, y, obj) { if (self.callback) self.callback(self.punishId); }; return self; }); // Légume à juger var Vegetable = Container.expand(function () { var self = Container.call(this); self.vegType = null; // 'carrot', 'broccoli', etc. self.setType = function (type) { self.vegType = type; self.removeChildren(); var vegAsset = self.attachAsset(type, { anchorX: 0.5, anchorY: 1 }); vegAsset.y = 0; // Ajoute une perruque de juge pour le fun var wig = self.attachAsset('judgeWig', { anchorX: 0.5, anchorY: 1 }); wig.y = -vegAsset.height + 60; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xf7f7e0 }); /**** * Game Code ****/ // Liste de légumes et de plaintes absurdes // --- Données du jeu --- // Légumes (formes simples pour MVP) // Peines (icônes simples) // Son (MVP: pas de son pour l’instant) var vegetables = [{ type: 'carrot', name: 'Carotte' }, { type: 'broccoli', name: 'Brocoli' }, { type: 'eggplant', name: 'Aubergine' }, { type: 'tomato', name: 'Tomate' }, { type: 'potato', name: 'Pomme de terre' }, { type: 'onion', name: 'Oignon' }, { type: 'zucchini', name: 'Courgette' }, { type: 'pepper', name: 'Poivron' }, { type: 'radish', name: 'Radis' }, { type: 'cucumber', name: 'Concombre' }, { type: 'leek', name: 'Poireau' }, { type: 'turnip', name: 'Navet' }, { type: 'pumpkin', name: 'Citrouille' }]; var complaints = [ // Format: {vegType, text, correctPunish} { vegType: 'carrot', text: "La carotte a tenté de se cacher dans le gâteau aux carottes.", correctPunish: 'peel' }, { vegType: 'broccoli', text: "Le brocoli a effrayé des enfants à la cantine.", correctPunish: 'fridge' }, { vegType: 'eggplant', text: "L’aubergine a usurpé l’identité d’une courgette.", correctPunish: 'compost' }, { vegType: 'tomato', text: "La tomate s’est prise pour un fruit et a semé la zizanie.", correctPunish: 'soup' }, { vegType: 'potato', text: "La pomme de terre a refusé d’être épluchée.", correctPunish: 'peel' }, { vegType: 'onion', text: "L’oignon a fait pleurer tout le tribunal.", correctPunish: 'fridge' }, { vegType: 'carrot', text: "La carotte a tenté de bronzer au soleil du frigo.", correctPunish: 'fridge' }, { vegType: 'broccoli', text: "Le brocoli a organisé une manifestation contre la cuisson à la vapeur.", correctPunish: 'compost' }, { vegType: 'eggplant', text: "L’aubergine a tenté de repeindre le tribunal en violet.", correctPunish: 'compost' }, { vegType: 'tomato', text: "La tomate a éclaboussé le juge lors de son entrée.", correctPunish: 'soup' }, { vegType: 'potato', text: "La pomme de terre a tenté de rouler hors du tribunal.", correctPunish: 'peel' }, { vegType: 'onion', text: "L’oignon a tenté de se déguiser en ail.", correctPunish: 'compost' }, { vegType: 'zucchini', text: "La courgette a tenté de se faire passer pour une aubergine.", correctPunish: 'fridge' }, { vegType: 'zucchini', text: "La courgette a refusé d’entrer dans la ratatouille.", correctPunish: 'compost' }, { vegType: 'pepper', text: "Le poivron a semé la pagaille dans la salade.", correctPunish: 'soup' }, { vegType: 'pepper', text: "Le poivron a tenté de se cacher parmi les tomates.", correctPunish: 'fridge' }, { vegType: 'radish', text: "Le radis a tenté de se faufiler dans la salade sans invitation.", correctPunish: 'fridge' }, { vegType: 'cucumber', text: "Le concombre a organisé une course de glissade dans le tribunal.", correctPunish: 'compost' }, { vegType: 'leek', text: "Le poireau a essayé de se faire passer pour une baguette magique.", correctPunish: 'soup' }, { vegType: 'turnip', text: "Le navet a refusé de jouer son rôle dans la soupe.", correctPunish: 'compost' }, { vegType: 'pumpkin', text: "La citrouille a tenté de transformer le tribunal en carrosse.", correctPunish: 'peel' }]; // Peines disponibles var punishments = [{ id: 'soup', label: 'Soupe', icon: 'punishSoup' }, { id: 'compost', label: 'Compost', icon: 'punishCompost' }, { id: 'peel', label: 'Épluchage', icon: 'punishPeel' }, { id: 'fridge', label: 'Frigo', icon: 'punishFridge' }]; // Progression var level = storage.level || 1; var legpot = storage.legpot || 0; var requiredLegpot = function requiredLegpot(lvl) { return Math.pow(2, lvl - 1) * 10; }; // 10, 20, 40, 80, ... // Éléments d’UI var vegNode = new Vegetable(); vegNode.x = 2048 / 2; vegNode.y = 1100; game.addChild(vegNode); var complaintText = new Text2('', { size: 80, fill: "#333", wordWrap: true, wordWrapWidth: 1800 }); complaintText.anchor.set(0.5, 0); complaintText.x = 2048 / 2; complaintText.y = 300; game.addChild(complaintText); // Affichage du niveau et Legpot (ligne principale) - déplacé en haut au centre de la zone de jeu var statusTxt = new Text2('', { size: 80, fill: 0x8B4513, fontWeight: "bold" }); statusTxt.anchor.set(0.5, 0); statusTxt.x = 2048 / 2; statusTxt.y = 20; game.addChild(statusTxt); // Affichage du nombre de Legpot restants avant le niveau suivant (juste en dessous) var restantTxt = new Text2('', { size: 60, fill: 0x8B4513, fontWeight: "bold" }); restantTxt.anchor.set(0.5, 0); restantTxt.x = 2048 / 2; restantTxt.y = statusTxt.y + statusTxt.height + 5; game.addChild(restantTxt); // Boutons de peines var punishButtons = []; var punishButtonY = 2000; var punishButtonSpacing = 450; for (var i = 0; i < punishments.length; i++) { var btn = new PunishmentButton(); btn.init(punishments[i].id, punishments[i].label, punishments[i].icon, onPunishSelected); btn.x = 2048 / 2 + (i - 1.5) * punishButtonSpacing; btn.y = punishButtonY; game.addChild(btn); punishButtons.push(btn); } // --- Logique du jeu --- var currentComplaint = null; var canJudge = true; // Sélectionne une plainte aléatoire pour le niveau courant function pickComplaint() { var idx = Math.floor(Math.random() * complaints.length); currentComplaint = complaints[idx]; vegNode.setType(currentComplaint.vegType); complaintText.setText(currentComplaint.text); canJudge = true; } // Met à jour l’affichage du score, du niveau et du nombre de Legpot restants avant le niveau suivant function updateUI() { var legpotRestant = requiredLegpot(level) - legpot; if (legpotRestant < 0) legpotRestant = 0; statusTxt.setText("Niveau : " + level + " / 67 | Legpot : " + legpot); statusTxt.x = 2048 / 2; statusTxt.y = 20; restantTxt.setText("Restant avant niveau suivant : " + legpotRestant); restantTxt.x = 2048 / 2; restantTxt.y = statusTxt.y + statusTxt.height + 5; } // Gère la sélection d’une peine function onPunishSelected(punishId) { if (!canJudge) return; canJudge = false; // Messages drôles pour bonnes/mauvaises réponses var funnyGood = ["Bravo ! Ce légume va s’en souvenir toute sa vie… de légume.", "Justice potagère rendue avec brio !", "Le tribunal applaudit votre jugement !", "Ce légume n’en revient pas de votre sévérité.", "Vous êtes le cauchemar des légumes délinquants !", "On va en faire une salade de ce dossier !", "Votre marteau de juge fait trembler les carottes !"]; var funnyBad = ["Oups ! Le légume a failli s’en tirer…", "Le public du tribunal est hilare !", "Ce n’était pas la bonne peine, mais c’était drôle !", "Le légume jubile, il s’en sort bien !", "Attention, le syndicat des légumes va protester !", "Le juge a glissé sur une peau de banane imaginaire.", "Même la courgette n’a pas compris votre choix !"]; var correct = punishId === currentComplaint.correctPunish; if (correct) { // Animation de félicitations LK.effects.flashObject(vegNode, 0x83de44, 600); legpot += 1; // Affiche un message drôle de réussite var msg = funnyGood[Math.floor(Math.random() * funnyGood.length)]; complaintText.setText(currentComplaint.text + "\n\n🥕 " + msg); // Passage de niveau si assez de Legpot if (legpot >= requiredLegpot(level)) { level++; legpot = 0; LK.effects.flashScreen(0x83de44, 800); LK.setTimeout(function () { LK.showYouWin(); }, 900); storage.level = level; storage.legpot = legpot; updateUI(); return; } } else { // Animation d’erreur LK.effects.flashObject(vegNode, 0xff0000, 600); legpot -= 1; // Affiche un message drôle d’échec var msg = funnyBad[Math.floor(Math.random() * funnyBad.length)]; complaintText.setText(currentComplaint.text + "\n\n🍆 " + msg); if (legpot < 0) { // Recul de niveau si possible if (level > 1) { level--; legpot = requiredLegpot(level) - 1; LK.effects.flashScreen(0xff0000, 800); } else { legpot = 0; } } } storage.level = level; storage.legpot = legpot; updateUI(); // Nouvelle plainte après délai LK.setTimeout(function () { pickComplaint(); }, 900); } // Initialisation updateUI(); pickComplaint(); // Musique de fond en boucle LK.playMusic('musicId'); // --- Game Over/Win automatique par LK --- game.update = function () { // Rien à faire ici pour ce jeu };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
legpot: 0,
level: 1
});
/****
* Classes
****/
// Bouton de peine
var PunishmentButton = Container.expand(function () {
var self = Container.call(this);
self.punishId = null;
self.text = null;
self.icon = null;
self.callback = null;
self.init = function (punishId, label, iconId, callback) {
self.punishId = punishId;
self.removeChildren();
self.icon = self.attachAsset(iconId, {
anchorX: 0.5,
anchorY: 0.5
});
self.icon.y = 0;
self.text = new Text2(label, {
size: 60,
fill: "#222"
});
self.text.anchor.set(0.5, 0);
self.text.y = self.icon.height / 2 + 10;
self.addChild(self.text);
self.callback = callback;
};
self.down = function (x, y, obj) {
if (self.callback) self.callback(self.punishId);
};
return self;
});
// Légume à juger
var Vegetable = Container.expand(function () {
var self = Container.call(this);
self.vegType = null; // 'carrot', 'broccoli', etc.
self.setType = function (type) {
self.vegType = type;
self.removeChildren();
var vegAsset = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 1
});
vegAsset.y = 0;
// Ajoute une perruque de juge pour le fun
var wig = self.attachAsset('judgeWig', {
anchorX: 0.5,
anchorY: 1
});
wig.y = -vegAsset.height + 60;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xf7f7e0
});
/****
* Game Code
****/
// Liste de légumes et de plaintes absurdes
// --- Données du jeu ---
// Légumes (formes simples pour MVP)
// Peines (icĂ´nes simples)
// Son (MVP: pas de son pour l’instant)
var vegetables = [{
type: 'carrot',
name: 'Carotte'
}, {
type: 'broccoli',
name: 'Brocoli'
}, {
type: 'eggplant',
name: 'Aubergine'
}, {
type: 'tomato',
name: 'Tomate'
}, {
type: 'potato',
name: 'Pomme de terre'
}, {
type: 'onion',
name: 'Oignon'
}, {
type: 'zucchini',
name: 'Courgette'
}, {
type: 'pepper',
name: 'Poivron'
}, {
type: 'radish',
name: 'Radis'
}, {
type: 'cucumber',
name: 'Concombre'
}, {
type: 'leek',
name: 'Poireau'
}, {
type: 'turnip',
name: 'Navet'
}, {
type: 'pumpkin',
name: 'Citrouille'
}];
var complaints = [
// Format: {vegType, text, correctPunish}
{
vegType: 'carrot',
text: "La carotte a tenté de se cacher dans le gâteau aux carottes.",
correctPunish: 'peel'
}, {
vegType: 'broccoli',
text: "Le brocoli a effrayé des enfants à la cantine.",
correctPunish: 'fridge'
}, {
vegType: 'eggplant',
text: "L’aubergine a usurpé l’identité d’une courgette.",
correctPunish: 'compost'
}, {
vegType: 'tomato',
text: "La tomate s’est prise pour un fruit et a semé la zizanie.",
correctPunish: 'soup'
}, {
vegType: 'potato',
text: "La pomme de terre a refusé d’être épluchée.",
correctPunish: 'peel'
}, {
vegType: 'onion',
text: "L’oignon a fait pleurer tout le tribunal.",
correctPunish: 'fridge'
}, {
vegType: 'carrot',
text: "La carotte a tenté de bronzer au soleil du frigo.",
correctPunish: 'fridge'
}, {
vegType: 'broccoli',
text: "Le brocoli a organisé une manifestation contre la cuisson à la vapeur.",
correctPunish: 'compost'
}, {
vegType: 'eggplant',
text: "L’aubergine a tenté de repeindre le tribunal en violet.",
correctPunish: 'compost'
}, {
vegType: 'tomato',
text: "La tomate a éclaboussé le juge lors de son entrée.",
correctPunish: 'soup'
}, {
vegType: 'potato',
text: "La pomme de terre a tenté de rouler hors du tribunal.",
correctPunish: 'peel'
}, {
vegType: 'onion',
text: "L’oignon a tenté de se déguiser en ail.",
correctPunish: 'compost'
}, {
vegType: 'zucchini',
text: "La courgette a tenté de se faire passer pour une aubergine.",
correctPunish: 'fridge'
}, {
vegType: 'zucchini',
text: "La courgette a refusé d’entrer dans la ratatouille.",
correctPunish: 'compost'
}, {
vegType: 'pepper',
text: "Le poivron a semé la pagaille dans la salade.",
correctPunish: 'soup'
}, {
vegType: 'pepper',
text: "Le poivron a tenté de se cacher parmi les tomates.",
correctPunish: 'fridge'
}, {
vegType: 'radish',
text: "Le radis a tenté de se faufiler dans la salade sans invitation.",
correctPunish: 'fridge'
}, {
vegType: 'cucumber',
text: "Le concombre a organisé une course de glissade dans le tribunal.",
correctPunish: 'compost'
}, {
vegType: 'leek',
text: "Le poireau a essayé de se faire passer pour une baguette magique.",
correctPunish: 'soup'
}, {
vegType: 'turnip',
text: "Le navet a refusé de jouer son rôle dans la soupe.",
correctPunish: 'compost'
}, {
vegType: 'pumpkin',
text: "La citrouille a tenté de transformer le tribunal en carrosse.",
correctPunish: 'peel'
}];
// Peines disponibles
var punishments = [{
id: 'soup',
label: 'Soupe',
icon: 'punishSoup'
}, {
id: 'compost',
label: 'Compost',
icon: 'punishCompost'
}, {
id: 'peel',
label: 'Épluchage',
icon: 'punishPeel'
}, {
id: 'fridge',
label: 'Frigo',
icon: 'punishFridge'
}];
// Progression
var level = storage.level || 1;
var legpot = storage.legpot || 0;
var requiredLegpot = function requiredLegpot(lvl) {
return Math.pow(2, lvl - 1) * 10;
}; // 10, 20, 40, 80, ...
// Éléments d’UI
var vegNode = new Vegetable();
vegNode.x = 2048 / 2;
vegNode.y = 1100;
game.addChild(vegNode);
var complaintText = new Text2('', {
size: 80,
fill: "#333",
wordWrap: true,
wordWrapWidth: 1800
});
complaintText.anchor.set(0.5, 0);
complaintText.x = 2048 / 2;
complaintText.y = 300;
game.addChild(complaintText);
// Affichage du niveau et Legpot (ligne principale) - déplacé en haut au centre de la zone de jeu
var statusTxt = new Text2('', {
size: 80,
fill: 0x8B4513,
fontWeight: "bold"
});
statusTxt.anchor.set(0.5, 0);
statusTxt.x = 2048 / 2;
statusTxt.y = 20;
game.addChild(statusTxt);
// Affichage du nombre de Legpot restants avant le niveau suivant (juste en dessous)
var restantTxt = new Text2('', {
size: 60,
fill: 0x8B4513,
fontWeight: "bold"
});
restantTxt.anchor.set(0.5, 0);
restantTxt.x = 2048 / 2;
restantTxt.y = statusTxt.y + statusTxt.height + 5;
game.addChild(restantTxt);
// Boutons de peines
var punishButtons = [];
var punishButtonY = 2000;
var punishButtonSpacing = 450;
for (var i = 0; i < punishments.length; i++) {
var btn = new PunishmentButton();
btn.init(punishments[i].id, punishments[i].label, punishments[i].icon, onPunishSelected);
btn.x = 2048 / 2 + (i - 1.5) * punishButtonSpacing;
btn.y = punishButtonY;
game.addChild(btn);
punishButtons.push(btn);
}
// --- Logique du jeu ---
var currentComplaint = null;
var canJudge = true;
// Sélectionne une plainte aléatoire pour le niveau courant
function pickComplaint() {
var idx = Math.floor(Math.random() * complaints.length);
currentComplaint = complaints[idx];
vegNode.setType(currentComplaint.vegType);
complaintText.setText(currentComplaint.text);
canJudge = true;
}
// Met à jour l’affichage du score, du niveau et du nombre de Legpot restants avant le niveau suivant
function updateUI() {
var legpotRestant = requiredLegpot(level) - legpot;
if (legpotRestant < 0) legpotRestant = 0;
statusTxt.setText("Niveau : " + level + " / 67 | Legpot : " + legpot);
statusTxt.x = 2048 / 2;
statusTxt.y = 20;
restantTxt.setText("Restant avant niveau suivant : " + legpotRestant);
restantTxt.x = 2048 / 2;
restantTxt.y = statusTxt.y + statusTxt.height + 5;
}
// Gère la sélection d’une peine
function onPunishSelected(punishId) {
if (!canJudge) return;
canJudge = false;
// Messages drôles pour bonnes/mauvaises réponses
var funnyGood = ["Bravo ! Ce légume va s’en souvenir toute sa vie… de légume.", "Justice potagère rendue avec brio !", "Le tribunal applaudit votre jugement !", "Ce légume n’en revient pas de votre sévérité.", "Vous êtes le cauchemar des légumes délinquants !", "On va en faire une salade de ce dossier !", "Votre marteau de juge fait trembler les carottes !"];
var funnyBad = ["Oups ! Le légume a failli s’en tirer…", "Le public du tribunal est hilare !", "Ce n’était pas la bonne peine, mais c’était drôle !", "Le légume jubile, il s’en sort bien !", "Attention, le syndicat des légumes va protester !", "Le juge a glissé sur une peau de banane imaginaire.", "Même la courgette n’a pas compris votre choix !"];
var correct = punishId === currentComplaint.correctPunish;
if (correct) {
// Animation de félicitations
LK.effects.flashObject(vegNode, 0x83de44, 600);
legpot += 1;
// Affiche un message drôle de réussite
var msg = funnyGood[Math.floor(Math.random() * funnyGood.length)];
complaintText.setText(currentComplaint.text + "\n\n🥕 " + msg);
// Passage de niveau si assez de Legpot
if (legpot >= requiredLegpot(level)) {
level++;
legpot = 0;
LK.effects.flashScreen(0x83de44, 800);
LK.setTimeout(function () {
LK.showYouWin();
}, 900);
storage.level = level;
storage.legpot = legpot;
updateUI();
return;
}
} else {
// Animation d’erreur
LK.effects.flashObject(vegNode, 0xff0000, 600);
legpot -= 1;
// Affiche un message drôle d’échec
var msg = funnyBad[Math.floor(Math.random() * funnyBad.length)];
complaintText.setText(currentComplaint.text + "\n\n🍆 " + msg);
if (legpot < 0) {
// Recul de niveau si possible
if (level > 1) {
level--;
legpot = requiredLegpot(level) - 1;
LK.effects.flashScreen(0xff0000, 800);
} else {
legpot = 0;
}
}
}
storage.level = level;
storage.legpot = legpot;
updateUI();
// Nouvelle plainte après délai
LK.setTimeout(function () {
pickComplaint();
}, 900);
}
// Initialisation
updateUI();
pickComplaint();
// Musique de fond en boucle
LK.playMusic('musicId');
// --- Game Over/Win automatique par LK ---
game.update = function () {
// Rien Ă faire ici pour ce jeu
};
Brocolis. In-Game asset. 2d. High contrast. No shadows
Carrotte. In-Game asset. 2d. High contrast. No shadows
Obergine. In-Game asset. 2d. High contrast. No shadows
Tomate. In-Game asset. 2d. High contrast. No shadows
Patate. In-Game asset. 2d. High contrast. No shadows
Onion. In-Game asset. 2d. High contrast. No shadows
Casquette a l'envers. In-Game asset. 2d. High contrast. No shadows
Soupe. In-Game asset. 2d. High contrast. No shadows
Compote. In-Game asset. 2d. High contrast. No shadows
Pelage de legumes. In-Game asset. 2d. High contrast. No shadows
Frigo. In-Game asset. 2d. High contrast. No shadows
Radis. In-Game asset. 2d. High contrast. No shadows
Courgettes. In-Game asset. 2d. High contrast. No shadows
Poivre. In-Game asset. 2d. High contrast. No shadows
Comcombre. In-Game asset. 2d. High contrast. No shadows
poireau. In-Game asset. 2d. High contrast. No shadows
Navet. In-Game asset. 2d. High contrast. No shadows
Citrouille. In-Game asset. 2d. High contrast. No shadows