/**** * 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