User prompt
Move the Galata Tower sprite down by 80 pixels on the Y-axis.
User prompt
Move the Galata Tower sprite down by 40 pixels on the Y-axis.
User prompt
Move the Galata Tower sprite down by 40 pixels on the Y-axis.
User prompt
Move the Galata Tower sprite slightly lower on the screen and update its opacity to 100%. It should appear fully visible and centered near the bottom portion of the scene. Ensure it blends naturally with the environment and maintains its haunted atmosphere.
User prompt
Play the "background" sound effect at low volume during gameplay
User prompt
Play the "background" sound effect automatically during gameplay every 5 to 10 seconds at random intervals. The sound should be subtle and blend with the ambient environment. Make sure it doesn't interrupt other sounds and loops throughout the level.
User prompt
Create a low-volume background horror track for a 2D horror game. Use distant ambient drones, reversed sounds, eerie strings, and subtle whispers. The music should be unsettling, slow, and loop seamlessly. It should not overpower sound effects but constantly build tension.
User prompt
make background more darker
User prompt
Add a horrifying jumpscare sequence when the player dies or gets caught by an enemy. The jumpscare should include: A sudden loud sound (e.g., distorted scream, deep bass growl, or high-pitched violin screech) A full-screen pixel-art jumpscare image of the enemy (e.g., close-up of the Karabasan or ghost Cin with glowing eyes and distorted face) Rapid screen shake or glitch effect lasting 1–2 seconds After the jumpscare, transition to a dark “You Died” screen with faint ambient noise in the background. Give the player options: Retry from last chapter Return to main menu Keep the horror tone consistent and make the jumpscare unpredictable and terrifying. Make sure the visual and audio hit simultaneously for maximum effect. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'storage.get is not a function' in or related to this line: 'var nightfall_runCount = parseInt(storage.get("nightfall_runCount") || "0", 10);' Line Number: 163 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'storage.getItem is not a function' in or related to this line: 'var nightfall_runCount = parseInt(storage.getItem("nightfall_runCount") || "0", 10);' Line Number: 163
User prompt
Please fix the bug: 'storage.get is not a function' in or related to this line: 'var nightfall_runCount = storage.get("nightfall_runCount") || 0;' Line Number: 163
User prompt
Add a progressive difficulty system that increases the game's challenge each time the player restarts or replays it. For example: On the first playthrough, fewer enemies spawn and they move slower. On the second attempt, enemies appear more frequently and move faster. On the third and beyond, add more environmental hazards (e.g., louder jumpscares, less visibility, faster stamina drain, or limited flashlight battery). This dynamic scaling should stack slightly with each run, making the game feel more intense and punishing the more the player tries again. Display a subtle visual effect or on-screen message indicating the game is becoming harder, such as: “They are watching closer this time...” Keep the pixel-art horror style and atmospheric tension consistent.
User prompt
make game harder.
User prompt
still doesnt work. i cant click start game button so i cant enter the game. when i open the game, the timer has already started, timer have to start when i click start game button
User prompt
start game, chapters, setting and quit buttons doesnt work.
User prompt
Redesign the main menu of the game with a fresh and immersive layout. The menu should include a haunted environment background (e.g., foggy night streets, glowing windows, faint screams), animated fog overlay, and eerie background music. Replace "Tap to Begin" with a structured menu interface: Start Game (begins from the latest unlocked chapter) Chapters (shows a list of chapters with locked ones grayed out) Settings (sound, controls) Quit Each chapter unlocks sequentially: after the player completes Chapter 1, Chapter 2 becomes available, and so on. Locked chapters should appear with a lock icon and grayed-out label (e.g., “Chapter 2 – Locked”). After completing a chapter, show a short fade-out animation and an interstitial screen that says: “Chapter Complete – New Chapter Unlocked!” Maintain a pixel-art retro horror vibe throughout all menus and transitions.
User prompt
Ensure that the "Tap to Begin" button properly transitions from the menu screen to the first playable level. The button should trigger the loading of Chapter 1, including all game assets, UI elements, and background music. After tapping, hide the main menu and fully initialize the gameplay loop: player movement, fog effects, enemy spawns, and item interactions.
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'intersects')' in or related to this line: 'if (talismans.length === 0 && letters.length === 0 && survivor.intersects(galata)) {' Line Number: 563
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'update')' in or related to this line: 'fog.update();' Line Number: 454
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'update')' in or related to this line: 'survivor.update();' Line Number: 450
User prompt
Create a 2D pixel-art horror survival game with a structured level system. The game should begin with an eerie main menu screen featuring a haunted background (e.g., foggy Beyoğlu street with distant howling sounds). The player controls a scared blonde woman trying to escape supernatural threats. The game is divided into multiple chapters (e.g., Chapter 1: Abandoned Apartment, Chapter 2: Forgotten Alley, Chapter 3: Cemetery Path, Chapter 4: Galata Tower Interior). Each chapter increases in difficulty: More enemies (ghosts, cins, Karabasan) Limited visibility Faster jumpscares Puzzle elements In order to complete a chapter, the player must collect all hidden letters and talismans scattered throughout the map. Once collected, a portal or door unlocks to progress to the next level. Add eerie sound effects (whispers, footsteps, distant screams), atmospheric music, and pixel-art environments. The tone should feel claustrophobic and intense. Keep all assets retro-styled with smooth transitions between levels.
User prompt
galata kulesini biraz aşağıya al
Code edit (1 edits merged)
Please save this source code
User prompt
Nightfall: Escape to Galata
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // Fog overlay var Fog = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('fog', { anchorX: 0, anchorY: 0, alpha: 0.18 }); self.update = function () { // Animate fog alpha for effect self.asset.alpha = DIFFICULTY.fogAlpha + Math.sin(LK.ticks / 60) * 0.04; }; return self; }); // Galata Tower (goal) var Galata = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('galata', { anchorX: 0.5, anchorY: 1 }); return self; }); // Ghost base class var Ghost = Container.expand(function () { var self = Container.call(this); self.type = 'cin'; self.speed = 2; self.target = null; self.state = 'idle'; // idle, chasing, jumpscare self.lastIntersecting = false; self.jumpscarePlayed = false; self.asset = null; self.init = function (type) { self.type = type; var assetId = 'ghost_' + type; self.asset = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); }; self.update = function () { if (!self.target) return; // Only chase if in flashlight cone var dx = self.target.x - self.x; var dy = self.target.y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 800) { self.state = 'chasing'; var angle = Math.atan2(dy, dx); self.x += Math.cos(angle) * self.speed; self.y += Math.sin(angle) * self.speed; } else { self.state = 'idle'; } }; return self; }); // Letter collectible var Letter = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('letter', { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; return self; }); // Survivor (player) class var Survivor = Container.expand(function () { var self = Container.call(this); var body = self.attachAsset('survivor', { anchorX: 0.5, anchorY: 0.5 }); // Flashlight beam var flashlight = self.attachAsset('flashlight', { anchorX: 0.1, anchorY: 0.5, x: 60, y: 0, alpha: 0.45 }); flashlight.zIndex = 1; self.flashlight = flashlight; self.facing = 1; // 1: right, -1: left // Flicker flashlight self.flickerTimer = 0; self.update = function () { self.flickerTimer++; if (self.flickerTimer % DIFFICULTY.flashlightFlicker === 0) { // Reduce visibility and increase flicker flashlight.alpha = 0.28 + Math.random() * (0.18 + 0.04 * (DIFFICULTY.run - 1)); flashlight.scaleX = 0.85 + Math.random() * (0.12 - 0.01 * (DIFFICULTY.run - 1)); flashlight.scaleY = 0.85 + Math.random() * (0.12 - 0.01 * (DIFFICULTY.run - 1)); } // Keep flashlight facing flashlight.scaleX = Math.abs(flashlight.scaleX) * self.facing; }; return self; }); // Talisman collectible var Talisman = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('talisman', { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x07070a }); /**** * Game Code ****/ // Persistent run counter for progressive difficulty // Play music // Main character: "Survivor" // Flashlight beam (ellipse, semi-transparent yellow) // Ghosts (cin, karabasan, gulyabani) - different colors // Talisman (collectible) // Letter (collectible) // Galata Tower (goal) // Fog overlay (large, semi-transparent) // Sound effects // Music var nightfall_runCount = parseInt(storage.nightfall_runCount || "0", 10); nightfall_runCount++; storage.nightfall_runCount = nightfall_runCount; // Difficulty scaling factors var DIFFICULTY = { run: nightfall_runCount, ghostSpeedMult: 1 + 0.15 * (nightfall_runCount - 1), ghostCountAdd: Math.min(nightfall_runCount - 1, 3), talismanCount: Math.max(1, 3 - Math.floor((nightfall_runCount - 1) / 2)), letterCount: Math.max(1, 2 - Math.floor((nightfall_runCount - 1) / 3)), fogAlpha: 0.18 + 0.04 * Math.min(nightfall_runCount - 1, 4), flashlightFlicker: Math.max(6, 8 - (nightfall_runCount - 1)), jumpscareVolume: Math.min(1, 0.7 + 0.1 * (nightfall_runCount - 1)), message: nightfall_runCount > 1 ? "They are watching closer this time..." : "" }; LK.playMusic('nightfall_bgm', { loop: true, fade: { start: 0, end: 0.22, duration: 2000 } }); // Survivor/player var survivor = new Survivor(); game.addChild(survivor); survivor.x = 400; survivor.y = 2000; // Galata Tower (goal) var galata = new Galata(); game.addChild(galata); galata.x = 2048 / 2; galata.y = 600; // Fog overlay var fog = new Fog(); game.addChild(fog); // Score: talismans collected var talismanScore = 0; var talismanTxt = new Text2('Talismans: 0', { size: 80, fill: 0xFFE066 }); talismanTxt.anchor.set(0.5, 0); LK.gui.top.addChild(talismanTxt); // Letters collected var letterScore = 0; var letterTxt = new Text2('Letters: 0', { size: 60, fill: 0xFFFFFF }); letterTxt.anchor.set(0.5, 0); LK.gui.top.addChild(letterTxt); letterTxt.y = 90; // Timer (sunrise in 60 seconds) var timeLeft = 60; var timerTxt = new Text2('01:00', { size: 80, fill: 0xFFB347 }); timerTxt.anchor.set(0.5, 0); LK.gui.top.addChild(timerTxt); timerTxt.y = 180; // Subtle difficulty message var diffMsg = null; if (DIFFICULTY.message) { diffMsg = new Text2(DIFFICULTY.message, { size: 48, fill: 0xFF6666, font: "monospace", alpha: 0.7 }); diffMsg.anchor.set(0.5, 0); diffMsg.x = LK.gui.top.width / 2; diffMsg.y = 260; LK.gui.top.addChild(diffMsg); // Fade out after a few seconds tween(diffMsg, { alpha: 0 }, { duration: 4000, onFinish: function onFinish() { diffMsg.destroy(); } }); } // Place collectibles var talismans = []; var letters = []; for (var i = 0; i < DIFFICULTY.talismanCount; i++) { var t = new Talisman(); t.x = 400 + Math.random() * 1200; t.y = 600 + Math.random() * 1600; talismans.push(t); game.addChild(t); } for (var i = 0; i < DIFFICULTY.letterCount; i++) { var l = new Letter(); l.x = 300 + Math.random() * 1400; l.y = 700 + Math.random() * 1500; letters.push(l); game.addChild(l); } // Place ghosts var ghosts = []; function spawnGhost(type, x, y, speed) { var g = new Ghost(); g.init(type); g.x = x; g.y = y; g.speed = speed; g.target = survivor; ghosts.push(g); game.addChild(g); } // Base ghosts spawnGhost('cin', 1800, 2200, 2.7 * DIFFICULTY.ghostSpeedMult); spawnGhost('karabasan', 200, 800, 2.2 * DIFFICULTY.ghostSpeedMult); spawnGhost('gulyabani', 1800, 600, 1.8 * DIFFICULTY.ghostSpeedMult); // Add more ghosts for extra challenge spawnGhost('cin', 400, 1200, 2.5 * DIFFICULTY.ghostSpeedMult); spawnGhost('karabasan', 1600, 1800, 2.0 * DIFFICULTY.ghostSpeedMult); spawnGhost('gulyabani', 600, 400, 1.7 * DIFFICULTY.ghostSpeedMult); // Progressive extra ghosts for (var i = 0; i < DIFFICULTY.ghostCountAdd; i++) { var types = ['cin', 'karabasan', 'gulyabani']; var type = types[i % types.length]; var x = 200 + Math.random() * 1600; var y = 600 + Math.random() * 1800; var baseSpeed = type === 'cin' ? 2.7 : type === 'karabasan' ? 2.2 : 1.8; spawnGhost(type, x, y, baseSpeed * (1.1 + 0.08 * i) * DIFFICULTY.ghostSpeedMult); } // Dragging logic var dragNode = null; function handleMove(x, y, obj) { if (dragNode) { // Clamp to game area var nx = Math.max(60, Math.min(2048 - 60, x)); var ny = Math.max(200, Math.min(2732 - 60, y)); dragNode.x = nx; dragNode.y = ny; // Face direction if (nx > survivor.x) survivor.facing = 1;else if (nx < survivor.x) survivor.facing = -1; } } game.move = handleMove; game.down = function (x, y, obj) { // Only allow dragging survivor if (x > 100 || y > 100) { // avoid top left menu dragNode = survivor; handleMove(x, y, obj); } }; game.up = function (x, y, obj) { dragNode = null; }; // Jumpscare state var jumpscareActive = false; var jumpscareTimer = 0; // Game update game.update = function () { // Update survivor survivor.update(); // Update fog fog.update(); // Update ghosts for (var i = 0; i < ghosts.length; i++) { var g = ghosts[i]; g.update(); // Check if ghost is in flashlight cone var dx = g.x - survivor.x; var dy = g.y - survivor.y; var angle = Math.atan2(dy, dx); var facing = survivor.facing; var inCone = false; if (facing === 1 && dx > 0 && Math.abs(angle) < Math.PI / 4) inCone = true; if (facing === -1 && dx < 0 && Math.abs(angle - Math.PI) < Math.PI / 4) inCone = true; // If in cone, slow ghost if (inCone) g.speed = 1.1;else g.speed = g.type === 'cin' ? 2.2 : g.type === 'karabasan' ? 1.7 : 1.3; // Jumpscare: if ghost intersects survivor var intersecting = g.intersects(survivor); if (!g.lastIntersecting && intersecting && !jumpscareActive) { jumpscareActive = true; jumpscareTimer = 0; LK.effects.flashScreen(0xffffff, 400 + 100 * (DIFFICULTY.run - 1)); var jumpscareSound = LK.getSound('jumpscare'); if (jumpscareSound) jumpscareSound.setVolume ? jumpscareSound.setVolume(DIFFICULTY.jumpscareVolume) : null; LK.getSound('jumpscare').play(); tween(g.asset, { alpha: 1 }, { duration: 200, onFinish: function onFinish() {} }); // Extra visual effect for high difficulty if (DIFFICULTY.run > 2) { LK.effects.flashScreen(0xff0000, 200); } } g.lastIntersecting = intersecting; } // Jumpscare effect if (jumpscareActive) { jumpscareTimer++; // On first frame of jumpscare, show full-screen jumpscare image and start effects if (jumpscareTimer === 1) { // Freeze player input dragNode = null; // Add full-screen jumpscare image (random ghost close-up) var jumpscareGhosts = ['ghost_karabasan', 'ghost_cin', 'ghost_gulyabani']; var jumpscareId = jumpscareGhosts[Math.floor(Math.random() * jumpscareGhosts.length)]; var jumpscareImg = LK.getAsset(jumpscareId, { anchorX: 0.5, anchorY: 0.5, scaleX: 4.5, scaleY: 4.5, x: 2048 / 2, y: 2732 / 2, alpha: 0.98 }); jumpscareImg.zIndex = 9999; game.addChild(jumpscareImg); // Add glowing eyes effect (simple white ellipse overlay) var eyes = []; for (var e = 0; e < 2; e++) { var eye = LK.getAsset('flashlight', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.18, scaleY: 0.09, x: 2048 / 2 + (e === 0 ? -120 : 120), y: 2732 / 2 - 60, alpha: 0.85, tint: 0xffffff }); eye.zIndex = 10000; game.addChild(eye); eyes.push(eye); } // Screen shake/glitch effect var shakeTimer = 0; var shakeInterval = LK.setInterval(function () { shakeTimer++; var shakeAmount = 32 - Math.floor(shakeTimer / 2); if (shakeAmount < 2) shakeAmount = 2; game.x = (Math.random() - 0.5) * shakeAmount; game.y = (Math.random() - 0.5) * shakeAmount; // Glitch: randomize alpha and scale jumpscareImg.alpha = 0.93 + Math.random() * 0.07; jumpscareImg.scaleX = 4.3 + Math.random() * 0.4; jumpscareImg.scaleY = 4.3 + Math.random() * 0.4; for (var e = 0; e < eyes.length; e++) { eyes[e].alpha = 0.7 + Math.random() * 0.3; } if (shakeTimer > 30) { // ~0.5s LK.clearInterval(shakeInterval); game.x = 0; game.y = 0; // Fade out jumpscare image and eyes tween(jumpscareImg, { alpha: 0 }, { duration: 400, onFinish: function onFinish() { jumpscareImg.destroy(); for (var e = 0; e < eyes.length; e++) eyes[e].destroy(); } }); } }, 16); // After jumpscare, show dark "You Died" overlay and options LK.setTimeout(function () { // Overlay var overlay = new Container(); var bg = LK.getAsset('fog', { anchorX: 0, anchorY: 0, x: 0, y: 0, scaleX: 1, scaleY: 1, alpha: 0.92, tint: 0x000000 }); overlay.addChild(bg); // "You Died" text var diedTxt = new Text2('YOU DIED', { size: 220, fill: 0xFF2222, font: "monospace", alpha: 0.93 }); diedTxt.anchor.set(0.5, 0.5); diedTxt.x = 2048 / 2; diedTxt.y = 1100; overlay.addChild(diedTxt); // Subtle ambient message var msgTxt = new Text2('The night is endless...', { size: 70, fill: 0xcccccc, font: "monospace", alpha: 0.7 }); msgTxt.anchor.set(0.5, 0.5); msgTxt.x = 2048 / 2; msgTxt.y = 1400; overlay.addChild(msgTxt); // Retry button var retryBtn = new Text2('Retry from last chapter', { size: 90, fill: 0xFFB347, font: "monospace", alpha: 0.95 }); retryBtn.anchor.set(0.5, 0.5); retryBtn.x = 2048 / 2; retryBtn.y = 1700; overlay.addChild(retryBtn); // Main menu button var menuBtn = new Text2('Return to main menu', { size: 80, fill: 0xcccccc, font: "monospace", alpha: 0.85 }); menuBtn.anchor.set(0.5, 0.5); menuBtn.x = 2048 / 2; menuBtn.y = 1850; overlay.addChild(menuBtn); // Add overlay to game overlay.zIndex = 10001; game.addChild(overlay); // Faint ambient noise (reuse jumpscare sound at low volume) var jumpscareSound = LK.getSound('jumpscare'); if (jumpscareSound && jumpscareSound.setVolume) { jumpscareSound.setVolume(0.12); jumpscareSound.play(); } // Button logic retryBtn.interactive = true; retryBtn.down = function () { // Remove overlay and restart game overlay.destroy(); LK.showGameOver(); // Triggers game reset }; menuBtn.interactive = true; menuBtn.down = function () { overlay.destroy(); LK.showGameOver(); // Let LK engine handle main menu }; }, 900); } return; } // Collect talismans for (var i = talismans.length - 1; i >= 0; i--) { var t = talismans[i]; if (!t.collected && survivor.intersects(t)) { t.collected = true; LK.getSound('talisman').play(); talismanScore++; talismanTxt.setText('Talismans: ' + talismanScore); tween(t, { alpha: 0 }, { duration: 300, onFinish: function onFinish() { t.destroy(); } }); talismans.splice(i, 1); } } // Collect letters for (var i = letters.length - 1; i >= 0; i--) { var l = letters[i]; if (!l.collected && survivor.intersects(l)) { l.collected = true; LK.getSound('collect').play(); letterScore++; letterTxt.setText('Letters: ' + letterScore); tween(l, { alpha: 0 }, { duration: 300, onFinish: function onFinish() { l.destroy(); } }); letters.splice(i, 1); } } // Win condition: reach Galata Tower if (survivor.intersects(galata)) { LK.effects.flashScreen(0x00ffcc, 800); LK.showYouWin(); } // --- Play subtle background sound effect at random intervals (5-10s) --- var backgroundSoundTimer = null; function playBackgroundSoundLoop() { // Play the background sound effect at low volume var bgSound = LK.getSound('background'); if (bgSound && bgSound.setVolume) { bgSound.setVolume(0.18); // subtle, blends with ambient } if (bgSound) { bgSound.play(); } // Schedule next play at a random interval between 5-10 seconds var nextDelay = 5000 + Math.floor(Math.random() * 5000); // ms backgroundSoundTimer = LK.setTimeout(playBackgroundSoundLoop, nextDelay); } // Start the background sound loop playBackgroundSoundLoop(); // Timer if (LK.ticks % 60 === 0 && timeLeft > 0 && !jumpscareActive) { timeLeft--; var min = Math.floor(timeLeft / 60); var sec = timeLeft % 60; timerTxt.setText((min < 10 ? '0' : '') + min + ':' + (sec < 10 ? '0' : '') + sec); if (timeLeft === 0) { // Time up: game over LK.effects.flashScreen(0x000000, 1200); LK.setTimeout(function () { LK.showGameOver(); }, 1200); } } }; // Center GUI elements talismanTxt.x = LK.gui.top.width / 2; letterTxt.x = LK.gui.top.width / 2; timerTxt.x = LK.gui.top.width / 2;
===================================================================
--- original.js
+++ change.js
@@ -538,8 +538,25 @@
if (survivor.intersects(galata)) {
LK.effects.flashScreen(0x00ffcc, 800);
LK.showYouWin();
}
+ // --- Play subtle background sound effect at random intervals (5-10s) ---
+ var backgroundSoundTimer = null;
+ function playBackgroundSoundLoop() {
+ // Play the background sound effect at low volume
+ var bgSound = LK.getSound('background');
+ if (bgSound && bgSound.setVolume) {
+ bgSound.setVolume(0.18); // subtle, blends with ambient
+ }
+ if (bgSound) {
+ bgSound.play();
+ }
+ // Schedule next play at a random interval between 5-10 seconds
+ var nextDelay = 5000 + Math.floor(Math.random() * 5000); // ms
+ backgroundSoundTimer = LK.setTimeout(playBackgroundSoundLoop, nextDelay);
+ }
+ // Start the background sound loop
+ playBackgroundSoundLoop();
// Timer
if (LK.ticks % 60 === 0 && timeLeft > 0 && !jumpscareActive) {
timeLeft--;
var min = Math.floor(timeLeft / 60);
Create a pixel-art monster character inspired by Turkish folklore, specifically "Gulyabani" – a tall, lanky, ghostly creature with pale, bluish-gray skin, long tangled hair covering parts of its face, and glowing red eyes. It should wear torn Ottoman-style rags, with long sharp fingers and a hunched back. Its movement should look floaty and eerie. Style should match 2D retro horror games. Transparent background PNG, facing left side, idle stance.. In-Game asset. 2d. High contrast. No shadows
Create a pixel-art character sprite of "Karabasan" – a dark, shadowy figure from Turkish folklore known to sit on people’s chests during sleep. The character should be faceless or have a barely visible distorted face with empty glowing white eyes. Its body should appear as a mass of smoky darkness, loosely humanoid, with long arms, claw-like hands, and ragged shadowy edges. It should look like it’s floating slightly above ground. Retro horror 2D game style. PNG format with transparent background, idle position facing forward.. In-Game asset. 2d. High contrast. No shadows
Create a pixel-art environment asset of the Galata Tower at night, in a dark and eerie style suitable for a 2D horror survival game. The tower should be tall and imposing with its recognizable cylindrical stone structure and conical roof. Add cracks, overgrown vines, and dim glowing windows to give it a haunted, ancient look. A full moon and cloudy night sky in the background. Mist or fog at the base. The overall atmosphere should feel ominous and mysterious. PNG format with transparent background.. In-Game asset. 2d. High contrast. No shadows
Create a pixel-art ghostly character based on the Turkish folklore concept of a "cin" (djinn). The character should have a semi-transparent, smoky body with ethereal, shifting edges. Its face should be menacing, with glowing green or blue eyes and a faint, wicked smile. Add small, broken chains or mystical symbols faintly visible on its body to suggest it was once sealed. It should be levitating, with ghost-like movement and a cursed aura. The color palette should include shades of dark blue, purple, and gray. 2D horror game style, PNG with transparent background, idle or float animation frame.. In-Game asset. 2d. High contrast. No shadows
Create a pixel-art item asset of an ancient talisman inspired by Turkish folklore. It should appear as a folded parchment wrapped in an old red thread, with faint Ottoman-style calligraphy or mystical symbols visible. The talisman should have a glowing aura or faint sparkles to imply magical power. Optional details: slightly burned edges, aged paper texture, and traces of dried wax seal. The style should be mysterious, enchanted, and suitable for a 2D horror game. PNG format with transparent background, top-down or item-inventory view.. In-Game asset. 2d. High contrast. No shadows
Create a pixel-art item of an old, mysterious letter for a horror-themed 2D game. The letter should be a yellowed, slightly torn piece of parchment with faded ink handwriting on it. Include smudges, old blood stains, or water damage for a haunting effect. The handwriting should look rushed or distressed. Fold marks or a wax seal (partially broken) can be added as details. It should look like something found in an abandoned house or crypt. PNG format with transparent background, suitable for inventory or collectible items.. In-Game asset. 2d. High contrast. No shadows
Create a pixel-art main character sprite of a scared blonde woman for a 2D horror survival game. She should have light blonde hair (shoulder length or tied in a ponytail), wide anxious eyes, and a pale complexion. Her outfit should be casual: a light-colored shirt or hoodie, jeans, and sneakers. The character should appear visibly nervous or frightened – slightly hunched posture, hands close to body, maybe holding a flashlight. Include subtle animation or idle pose showing fear. Style should match retro horror games. PNG with transparent background, front-facing idle stance.. In-Game asset. 2d. High contrast. No shadows