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