/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Button class for Heaven/Hell var ChoiceButton = Container.expand(function () { var self = Container.call(this); self.bg = null; self.txt = null; self.setType = function (type) { if (self.bg) self.removeChild(self.bg); var assetId = type === 'heaven' ? 'heaven_btn' : 'hell_btn'; self.bg = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); }; self.setText = function (str) { if (self.txt) self.removeChild(self.txt); self.txt = new Text2(str, { size: 80, fill: "#fff" }); self.txt.anchor.set(0.5, 0.5); self.addChild(self.txt); }; // Feedback animation self.flash = function (color) { tween(self.bg, { tint: color }, { duration: 120, easing: tween.linear, onFinish: function onFinish() { tween(self.bg, { tint: 0xffffff }, { duration: 180 }); } }); }; return self; }); // Character display class var StoryCharacter = Container.expand(function () { var self = Container.call(this); // Will be set by .setType self.asset = null; self.setType = function (type) { if (self.asset) { self.removeChild(self.asset); } var assetId = type === 'good' ? 'char_good' : 'char_evil'; self.asset = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Tween for button feedback // Heaven and hell buttons // Character shapes (good and evil) // --- Story Data --- var stories = [ // Level 1-3: Obvious { type: 'good', text: "Yaşlı bir kadına markette yardım ettim." }, { type: 'evil', text: "Arkadaşımın oyuncağını gizlice kırdım." }, { type: 'good', text: "Bir sokak köpeğine su verdim." }, // Level 4-6: Slightly ambiguous { type: 'evil', text: "Sınavda kopya çektim." }, { type: 'good', text: "Kardeşime ödevinde yardım ettim." }, { type: 'evil', text: "Bir arkadaşımı haksız yere suçladım." }, // Level 7-9: More nuanced { type: 'good', text: "Bir arkadaşımın sırrını kimseye söylemedim." }, { type: 'evil', text: "Birine yalan söyledim ama kimse zarar görmedi." }, { type: 'good', text: "Bir gün boyunca hiç kimseye kötü davranmadım." }, // Level 10+: Harder { type: 'evil', text: "Birine yardım etmem gerekirdi ama etmedim." }, { type: 'good', text: "Bir arkadaşımın moralini düzeltmek için ona hediye aldım." }, { type: 'evil', text: "Birini kıskandım ve onun hakkında kötü konuştum." }]; // Shuffle stories for replayability function shuffleStories(arr) { for (var i = arr.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } shuffleStories(stories); // --- Game State --- var currentLevel = 0; var score = 0; var maxLevel = stories.length; var canChoose = true; // --- UI Elements --- var charNode = new StoryCharacter(); charNode.x = 2048 / 2; charNode.y = 900; game.addChild(charNode); var storyText = new Text2('', { size: 80, fill: "#fff", align: "center", wordWrap: true, wordWrapWidth: 1400 }); storyText.anchor.set(0.5, 0); storyText.x = 2048 / 2; storyText.y = 1300; game.addChild(storyText); // Score display var scoreTxt = new Text2('Puan: 0', { size: 100, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Level display var levelTxt = new Text2('Seviye: 1', { size: 60, fill: "#fff" }); levelTxt.anchor.set(0.5, 0); LK.gui.top.addChild(levelTxt); levelTxt.y = 120; // Heaven/Hell buttons are not needed for drag-to-choose, so we do not add them to the game scene. // (If you want to keep them as visual hints, you can set their visible=false or skip adding them.) // --- Drag-to-Choose Handling --- var dragChar = false; var dragOffsetX = 0; var dragOffsetY = 0; var charStartX = charNode.x; var charStartY = charNode.y; var heavenZoneX = 350; // px from right for heaven var hellZoneX = 350; // px from left for hell game.down = function (x, y, obj) { if (!canChoose) return; // Check if touch is on character var dx = x - charNode.x; var dy = y - charNode.y; var r = charNode.asset && charNode.asset.width ? charNode.asset.width / 2 : 160; if (dx * dx + dy * dy <= r * r) { dragChar = true; dragOffsetX = charNode.x - x; dragOffsetY = charNode.y - y; } }; game.move = function (x, y, obj) { if (!canChoose) return; if (dragChar) { // Move character with finger charNode.x = x + dragOffsetX; charNode.y = y + dragOffsetY; // Clamp Y to screen if (charNode.y < charNode.asset.height / 2) charNode.y = charNode.asset.height / 2; if (charNode.y > 2732 - charNode.asset.height / 2) charNode.y = 2732 - charNode.asset.height / 2; // Optional: feedback for zones if (charNode.x > 2048 - heavenZoneX) { // right side = heaven LK.effects.flashObject(charNode, 0x7ed6df, 100); } else if (charNode.x < hellZoneX) { // left side = hell LK.effects.flashObject(charNode, 0xe17055, 100); } } }; game.up = function (x, y, obj) { if (!canChoose) return; if (dragChar) { // Heaven zone: right 350px if (charNode.x > 2048 - heavenZoneX) { makeChoice('heaven'); } // Hell zone: left 350px else if (charNode.x < hellZoneX) { makeChoice('hell'); } // Otherwise, snap back to start else { tween(charNode, { x: charStartX, y: charStartY }, { duration: 200, easing: tween.easeOut }); } dragChar = false; } }; // --- Game Logic --- function showLevel(idx) { canChoose = true; var story = stories[idx]; charNode.setType(story.type); storyText.setText(story.text); scoreTxt.setText('Puan: ' + score); levelTxt.setText('Seviye: ' + (idx + 1)); // Reset character position charNode.x = charStartX; charNode.y = charStartY; } function makeChoice(choice) { canChoose = false; var story = stories[currentLevel]; var correct = false; if (choice === 'heaven' && story.type === 'good') correct = true; if (choice === 'hell' && story.type === 'evil') correct = true; // Feedback // (No button feedback, as buttons are not used in drag-to-choose) // Score if (correct) { score += 1; LK.effects.flashObject(charNode, 0x7ed957, 400); } else { score = Math.max(0, score - 1); LK.effects.flashObject(charNode, 0xe74c3c, 400); } scoreTxt.setText('Puan: ' + score); // Next level or end LK.setTimeout(function () { currentLevel += 1; if (currentLevel >= maxLevel) { // Win if score is at least half, else game over if (score >= Math.ceil(maxLevel / 2)) { LK.showYouWin(); } else { LK.showGameOver(); } } else { showLevel(currentLevel); } }, 700); } // --- Start Game --- showLevel(currentLevel); // --- Game update (not used for logic here, but required for completeness) --- game.update = function () { // No per-frame logic needed for MVP }; // --- Heaven/Hell Labels --- // Left: Cehennem var hellLabel = new Text2('Cehennem', { size: 100, fill: 0xE74C3C, fontWeight: "bold" }); hellLabel.anchor.set(0, 0.5); hellLabel.x = 40; hellLabel.y = 2048 / 2 > 1366 ? 1366 : 2048 / 2; // Center vertically, but never off screen game.addChild(hellLabel); // Right: Cennet var heavenLabel = new Text2('Cennet', { size: 100, fill: 0x7ED957, fontWeight: "bold" }); heavenLabel.anchor.set(1, 0.5); heavenLabel.x = 2048 - 40; heavenLabel.y = 2048 / 2 > 1366 ? 1366 : 2048 / 2; // Center vertically, but never off screen game.addChild(heavenLabel); ;
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Button class for Heaven/Hell
var ChoiceButton = Container.expand(function () {
var self = Container.call(this);
self.bg = null;
self.txt = null;
self.setType = function (type) {
if (self.bg) self.removeChild(self.bg);
var assetId = type === 'heaven' ? 'heaven_btn' : 'hell_btn';
self.bg = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
};
self.setText = function (str) {
if (self.txt) self.removeChild(self.txt);
self.txt = new Text2(str, {
size: 80,
fill: "#fff"
});
self.txt.anchor.set(0.5, 0.5);
self.addChild(self.txt);
};
// Feedback animation
self.flash = function (color) {
tween(self.bg, {
tint: color
}, {
duration: 120,
easing: tween.linear,
onFinish: function onFinish() {
tween(self.bg, {
tint: 0xffffff
}, {
duration: 180
});
}
});
};
return self;
});
// Character display class
var StoryCharacter = Container.expand(function () {
var self = Container.call(this);
// Will be set by .setType
self.asset = null;
self.setType = function (type) {
if (self.asset) {
self.removeChild(self.asset);
}
var assetId = type === 'good' ? 'char_good' : 'char_evil';
self.asset = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Tween for button feedback
// Heaven and hell buttons
// Character shapes (good and evil)
// --- Story Data ---
var stories = [
// Level 1-3: Obvious
{
type: 'good',
text: "Yaşlı bir kadına markette yardım ettim."
}, {
type: 'evil',
text: "Arkadaşımın oyuncağını gizlice kırdım."
}, {
type: 'good',
text: "Bir sokak köpeğine su verdim."
},
// Level 4-6: Slightly ambiguous
{
type: 'evil',
text: "Sınavda kopya çektim."
}, {
type: 'good',
text: "Kardeşime ödevinde yardım ettim."
}, {
type: 'evil',
text: "Bir arkadaşımı haksız yere suçladım."
},
// Level 7-9: More nuanced
{
type: 'good',
text: "Bir arkadaşımın sırrını kimseye söylemedim."
}, {
type: 'evil',
text: "Birine yalan söyledim ama kimse zarar görmedi."
}, {
type: 'good',
text: "Bir gün boyunca hiç kimseye kötü davranmadım."
},
// Level 10+: Harder
{
type: 'evil',
text: "Birine yardım etmem gerekirdi ama etmedim."
}, {
type: 'good',
text: "Bir arkadaşımın moralini düzeltmek için ona hediye aldım."
}, {
type: 'evil',
text: "Birini kıskandım ve onun hakkında kötü konuştum."
}];
// Shuffle stories for replayability
function shuffleStories(arr) {
for (var i = arr.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
shuffleStories(stories);
// --- Game State ---
var currentLevel = 0;
var score = 0;
var maxLevel = stories.length;
var canChoose = true;
// --- UI Elements ---
var charNode = new StoryCharacter();
charNode.x = 2048 / 2;
charNode.y = 900;
game.addChild(charNode);
var storyText = new Text2('', {
size: 80,
fill: "#fff",
align: "center",
wordWrap: true,
wordWrapWidth: 1400
});
storyText.anchor.set(0.5, 0);
storyText.x = 2048 / 2;
storyText.y = 1300;
game.addChild(storyText);
// Score display
var scoreTxt = new Text2('Puan: 0', {
size: 100,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Level display
var levelTxt = new Text2('Seviye: 1', {
size: 60,
fill: "#fff"
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
levelTxt.y = 120;
// Heaven/Hell buttons are not needed for drag-to-choose, so we do not add them to the game scene.
// (If you want to keep them as visual hints, you can set their visible=false or skip adding them.)
// --- Drag-to-Choose Handling ---
var dragChar = false;
var dragOffsetX = 0;
var dragOffsetY = 0;
var charStartX = charNode.x;
var charStartY = charNode.y;
var heavenZoneX = 350; // px from right for heaven
var hellZoneX = 350; // px from left for hell
game.down = function (x, y, obj) {
if (!canChoose) return;
// Check if touch is on character
var dx = x - charNode.x;
var dy = y - charNode.y;
var r = charNode.asset && charNode.asset.width ? charNode.asset.width / 2 : 160;
if (dx * dx + dy * dy <= r * r) {
dragChar = true;
dragOffsetX = charNode.x - x;
dragOffsetY = charNode.y - y;
}
};
game.move = function (x, y, obj) {
if (!canChoose) return;
if (dragChar) {
// Move character with finger
charNode.x = x + dragOffsetX;
charNode.y = y + dragOffsetY;
// Clamp Y to screen
if (charNode.y < charNode.asset.height / 2) charNode.y = charNode.asset.height / 2;
if (charNode.y > 2732 - charNode.asset.height / 2) charNode.y = 2732 - charNode.asset.height / 2;
// Optional: feedback for zones
if (charNode.x > 2048 - heavenZoneX) {
// right side = heaven
LK.effects.flashObject(charNode, 0x7ed6df, 100);
} else if (charNode.x < hellZoneX) {
// left side = hell
LK.effects.flashObject(charNode, 0xe17055, 100);
}
}
};
game.up = function (x, y, obj) {
if (!canChoose) return;
if (dragChar) {
// Heaven zone: right 350px
if (charNode.x > 2048 - heavenZoneX) {
makeChoice('heaven');
}
// Hell zone: left 350px
else if (charNode.x < hellZoneX) {
makeChoice('hell');
}
// Otherwise, snap back to start
else {
tween(charNode, {
x: charStartX,
y: charStartY
}, {
duration: 200,
easing: tween.easeOut
});
}
dragChar = false;
}
};
// --- Game Logic ---
function showLevel(idx) {
canChoose = true;
var story = stories[idx];
charNode.setType(story.type);
storyText.setText(story.text);
scoreTxt.setText('Puan: ' + score);
levelTxt.setText('Seviye: ' + (idx + 1));
// Reset character position
charNode.x = charStartX;
charNode.y = charStartY;
}
function makeChoice(choice) {
canChoose = false;
var story = stories[currentLevel];
var correct = false;
if (choice === 'heaven' && story.type === 'good') correct = true;
if (choice === 'hell' && story.type === 'evil') correct = true;
// Feedback
// (No button feedback, as buttons are not used in drag-to-choose)
// Score
if (correct) {
score += 1;
LK.effects.flashObject(charNode, 0x7ed957, 400);
} else {
score = Math.max(0, score - 1);
LK.effects.flashObject(charNode, 0xe74c3c, 400);
}
scoreTxt.setText('Puan: ' + score);
// Next level or end
LK.setTimeout(function () {
currentLevel += 1;
if (currentLevel >= maxLevel) {
// Win if score is at least half, else game over
if (score >= Math.ceil(maxLevel / 2)) {
LK.showYouWin();
} else {
LK.showGameOver();
}
} else {
showLevel(currentLevel);
}
}, 700);
}
// --- Start Game ---
showLevel(currentLevel);
// --- Game update (not used for logic here, but required for completeness) ---
game.update = function () {
// No per-frame logic needed for MVP
};
// --- Heaven/Hell Labels ---
// Left: Cehennem
var hellLabel = new Text2('Cehennem', {
size: 100,
fill: 0xE74C3C,
fontWeight: "bold"
});
hellLabel.anchor.set(0, 0.5);
hellLabel.x = 40;
hellLabel.y = 2048 / 2 > 1366 ? 1366 : 2048 / 2; // Center vertically, but never off screen
game.addChild(hellLabel);
// Right: Cennet
var heavenLabel = new Text2('Cennet', {
size: 100,
fill: 0x7ED957,
fontWeight: "bold"
});
heavenLabel.anchor.set(1, 0.5);
heavenLabel.x = 2048 - 40;
heavenLabel.y = 2048 / 2 > 1366 ? 1366 : 2048 / 2; // Center vertically, but never off screen
game.addChild(heavenLabel);
;