User prompt
"Close" butonu yine çalışmıyor kamera açılıyor ama geri kapanmıyor
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'value')' in or related to this line: 'head.visible = aggroSliders[i].value > 0;' Line Number: 249
User prompt
eğer karakterin değeri "0" ise karakteri gösterme
User prompt
yine kapanmadı kamera close butonuna basınca
User prompt
kamerayı açtıktan sınra close butonuna basınca kamera kapanmıyor
User prompt
karakterlerin seviyelerini ayarlayıp "Start Night" butonuna basınca oyunu oynatmıyor direkt kazandınız yazıyor
User prompt
hâlâ aynı hata oluyor oyun başlayınca hemen kazandınız diyor
User prompt
start night butonuna basınca hemen kazandınız çıkıyor ve oyun bitiyor bu hatayı düzelt
User prompt
kaydırmalı olan ayarı sil sadece butonlar kalsın
User prompt
karakterlerin seviyesnini ayarlamak için yukarı ve aşağı butonu yap yukarı basınca karakterin seviyesi artsın alt butonuna basınca azalsın
Code edit (1 edits merged)
Please save this source code
User prompt
Custom Night: Freddy's Shift
Initial prompt
five night at freddy oyununun custom night bölümünü yap şimdilik 4 karakter olsun. karakterlerin 0 ve 10 arasında değerler verelim bu değerler gelme sıklıkları olsun 0 hiç gelmemem 10 sürekli gelme gibi seviyelerini belirleyip start butonuna basınca oyun başlasın... Oyun bildiğimiz five night at freddy oyununun mekaniklerine sahip olsun
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // AggroSlider class removed (no longer needed) // Animatronic class var Animatronic = Container.expand(function () { var self = Container.call(this); // Properties self.name = ''; self.aggression = 0; // 0-10 self.position = 0; // 0: stage, 1: hall, 2: door self.active = false; self.lastMoveTick = 0; self.moveInterval = 0; // How often to try to move (in ticks) self.headAsset = null; self.hasMovedFirstTime = false; // Track if animatronic has moved for the first time self.waitingAtDoor = false; // Track if waiting at closed door self.doorWaitStartTick = 0; // When started waiting at door self.returningToStart = false; // Track if returning to start position self.returnedToStartTick = 0; // When returned to start position self.musicPlaying = false; // Track if music is currently playing // Set animatronic type self.setType = function (type) { self.name = type; if (type === 'Freddy') { self.headAsset = self.attachAsset('freddy_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Bonnie') { self.headAsset = self.attachAsset('bonnie_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Chica') { self.headAsset = self.attachAsset('chica_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Foxy') { self.headAsset = self.attachAsset('foxy_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Mangle') { self.headAsset = self.attachAsset('mangle_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Puppet') { self.headAsset = self.attachAsset('puppet_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Balloon Boy') { self.headAsset = self.attachAsset('balloon_boy_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Golden Freddy') { self.headAsset = self.attachAsset('golden_freddy_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Baldi') { self.headAsset = self.attachAsset('baldi_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Herobrine') { self.headAsset = self.attachAsset('herobrine_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'McDonalds Clown') { self.headAsset = self.attachAsset('mcdonalds_clown_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Chuck E Cheese') { self.headAsset = self.attachAsset('chuck_e_cheese_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Freddy Krueger') { self.headAsset = self.attachAsset('freddy_krueger_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Testo Taylan') { self.headAsset = self.attachAsset('testo_taylan_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Jeff The Killer') { self.headAsset = self.attachAsset('jeff_the_killer_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Smile Dog') { self.headAsset = self.attachAsset('smile_dog_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Pennywise') { self.headAsset = self.attachAsset('pennywise_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Chucky') { self.headAsset = self.attachAsset('chucky_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Momo') { self.headAsset = self.attachAsset('momo_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'KY kız') { self.headAsset = self.attachAsset('ky_kiz_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Among Us Red') { self.headAsset = self.attachAsset('among_us_red_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Stickman') { self.headAsset = self.attachAsset('stickman_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Cartoon Cat') { self.headAsset = self.attachAsset('cartoon_cat_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Baby Doll') { self.headAsset = self.attachAsset('baby_doll_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Phone Guy') { self.headAsset = self.attachAsset('phone_guy_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Purple Guy') { self.headAsset = self.attachAsset('purple_guy_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Testere') { self.headAsset = self.attachAsset('testere_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Çığlık') { self.headAsset = self.attachAsset('ciglik_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'SCP 173') { self.headAsset = self.attachAsset('scp_173_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'Siren Head') { self.headAsset = self.attachAsset('siren_head_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'SCP 096') { self.headAsset = self.attachAsset('scp_096_head', { anchorX: 0.5, anchorY: 0.5 }); } else if (type === 'SpongeBob') { self.headAsset = self.attachAsset('spongebob_head', { anchorX: 0.5, anchorY: 0.5 }); } }; // Set aggression (0-10) self.setAggression = function (level) { self.aggression = level; // Lower interval = more aggressive self.moveInterval = 180 - level * 15; // 180 ticks (3s) at 0, 30 ticks (0.5s) at 10 if (self.moveInterval < 30) { self.moveInterval = 30; } }; // Reset animatronic to start self.reset = function () { self.position = 0; self.active = self.aggression > 0; self.lastMoveTick = LK.ticks; self.hasMovedFirstTime = false; self.waitingAtDoor = false; self.doorWaitStartTick = 0; self.returningToStart = false; self.returnedToStartTick = 0; self.musicPlaying = false; }; // Try to move forward self.tryMove = function () { if (!self.active) { return; } // Special case for Phone Guy: never moves, only makes calls if (self.name === 'Phone Guy') { return; } // Special case for Puppet: only move when music box is at 0 if (self.name === 'Puppet' && musicBoxLevel > 0) { return; } if (LK.ticks - self.lastMoveTick < self.moveInterval) { return; } // Check if returning to start if (self.returningToStart) { // Wait 6-7 seconds after returning before moving again var waitAfterReturn = 360 + Math.random() * 60; // 6-7 seconds in ticks if (LK.ticks - self.returnedToStartTick >= waitAfterReturn) { self.returningToStart = false; self.lastMoveTick = LK.ticks; } return; } // Check if waiting at door if (self.waitingAtDoor) { // Wait 3-4 seconds then return to start var doorWaitTime = 180 + Math.random() * 60; // 3-4 seconds in ticks if (LK.ticks - self.doorWaitStartTick >= doorWaitTime) { // Return to start position self.position = 0; self.waitingAtDoor = false; self.returningToStart = true; self.returnedToStartTick = LK.ticks; // Stop Testo Taylan music when returning to start if (self.name === 'Testo Taylan' && self.musicPlaying) { LK.getSound('testo_taylan_music').stop(); self.musicPlaying = false; } } return; } // Check if at door and door is closed if (self.position === 2) { var doorClosed = false; // Check which side this animatronic belongs to if (self.name === 'Bonnie' || self.name === 'Foxy' || self.name === 'Mangle' || self.name === 'Puppet' || self.name === 'Baldi' || self.name === 'Herobrine' || self.name === 'Jeff The Killer' || self.name === 'Chucky' || self.name === 'KY kız' || self.name === 'Among Us Red' || self.name === 'Stickman' || self.name === 'Phone Guy' || self.name === 'Testere' || self.name === 'SCP 173' || self.name === 'Siren Head') { doorClosed = leftDoorClosed; } else { doorClosed = rightDoorClosed; } if (doorClosed) { if (!self.waitingAtDoor) { // Start waiting at door self.waitingAtDoor = true; self.doorWaitStartTick = LK.ticks; } return; } } // Normal movement logic var chance = self.aggression / 10; if (Math.random() < chance) { // Play sound for Foxy's first movement if (self.name === 'Foxy' && !self.hasMovedFirstTime) { LK.getSound('foxy_move').play(); self.hasMovedFirstTime = true; } // Start playing music for Testo Taylan when starting to move if (self.name === 'Testo Taylan' && !self.musicPlaying && self.position === 0) { LK.getSound('testo_taylan_music').play(); self.musicPlaying = true; } // Add footstep sounds for certain characters if ((self.name === 'Bonnie' || self.name === 'Chica' || self.name === 'Freddy') && Math.random() < 0.3) { LK.setTimeout(function () { LK.getSound('footstep').play(); }, Math.random() * 1000); } self.position++; if (self.position > 2) { self.position = 2; } } self.lastMoveTick = LK.ticks; }; // For camera view: get current room name self.getRoom = function () { if (self.position === 0) { return 'Stage'; } if (self.position === 1) { return self.name === 'Bonnie' || self.name === 'Foxy' || self.name === 'Mangle' || self.name === 'Puppet' || self.name === 'Baldi' || self.name === 'Herobrine' || self.name === 'Jeff The Killer' || self.name === 'Chucky' || self.name === 'KY kız' || self.name === 'Among Us Red' || self.name === 'Stickman' || self.name === 'Phone Guy' || self.name === 'Testere' || self.name === 'SCP 173' || self.name === 'Siren Head' ? 'Left Hall' : 'Right Hall'; } if (self.position === 2) { return self.name === 'Bonnie' || self.name === 'Foxy' || self.name === 'Mangle' || self.name === 'Puppet' || self.name === 'Baldi' || self.name === 'Herobrine' || self.name === 'Jeff The Killer' || self.name === 'Chucky' || self.name === 'KY kız' || self.name === 'Among Us Red' || self.name === 'Stickman' || self.name === 'Phone Guy' || self.name === 'Testere' || self.name === 'SCP 173' || self.name === 'Siren Head' ? 'Left Door' : 'Right Door'; } return ''; }; // For office jumpscare self.isAtDoor = function () { return self.position === 2; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x111111 }); /**** * Game Code ****/ // Start button // Aggression slider bar // Camera view background // Office background // Camera button // Door panels // Door buttons // Animatronic heads (simple colored ellipses for each animatronic) // --- GLOBALS --- var animatronics = []; var aggroSliders = []; var aggroLabels = []; var aggroValueTexts = []; var startBtn = null; var nightStarted = false; var nightStartTick = 0; var timeTxt = null; var hour = 12; var minute = 0; var leftDoorClosed = false; var rightDoorClosed = false; var leftLightOn = false; var rightLightOn = false; var camOpen = false; var camBtn = null; var leftDoorBtn = null; var rightDoorBtn = null; var leftLightBtn = null; var rightLightBtn = null; var officeBg = null; var camBg = null; var camAnimatronicHeads = []; var jumpscareActive = false; var jumpscareAnim = null; var jumpscareAnimatronic = null; var jumpscareTick = 0; var jumpscareText = null; var officeAnimatronicHeads = []; var leftDoorPanel = null; var rightDoorPanel = null; var camRoomTxt = null; var camCloseBtn = null; var camCloseTxt = null; var camAnimatronicRoomTxts = []; var camAnimatronicRoomHeads = []; var camAnimatronicRoomNames = []; var camAnimatronicRoomHeadObjs = []; var camAnimatronicRoomTxtObjs = []; var camAnimatronicRoomY = 300; var camAnimatronicRoomSpacing = 300; var camAnimatronicRoomStartX = 400; var camAnimatronicRoomStartY = 300; var camAnimatronicRoomHeadSize = 120; var camAnimatronicRoomTxtSize = 60; var camAnimatronicRoomTxtColor = "#ffffff"; var camAnimatronicRoomHeadAnchor = 0.5; var camAnimatronicRoomTxtAnchor = 0.5; var camAnimatronicRoomTxtYOffset = 100; var camAnimatronicRoomHeadYOffset = 0; var pennywiseBalloon = null; var balloonSpawnTick = 0; var balloonClickDeadline = 0; var balloonClicked = false; var mapBg = null; var musicBox = null; var musicBoxHandle = null; var musicBoxLevel = 100; var musicBoxDecayRate = 0.3; var musicBoxLevelText = null; var musicBoxHeld = false; var musicBoxWindingRate = 2.0; var phoneGuyCallActive = false; var phoneGuyLastCallTick = 0; var phoneGuyCallInterval = 3600; // Default 1 minute (60 seconds * 60 ticks) var phoneGuySkipBtn = null; var phoneGuySkipTxt = null; var powerLevel = 100; var powerUsageRate = 0.008; // Further reduced for much longer gameplay var powerTxt = null; var usageTxt = null; var gameOverReason = ''; var lastPowerSound = 0; var ambientSoundPlaying = false; var mapRooms = []; var mapAnimatronicHeads = []; var mapRoomLabels = []; var roomPositions = { 'Stage': { x: 900, y: 300 }, 'Left Hall': { x: 600, y: 450 }, 'Right Hall': { x: 1200, y: 450 }, 'Left Door': { x: 400, y: 600 }, 'Right Door': { x: 1400, y: 600 }, 'Office': { x: 900, y: 750 } }; // --- SETUP: Custom Night Menu --- function setupCustomNightMenu() { // Clear game children while (game.children.length > 0) { game.children[0].destroy(); } nightStarted = false; jumpscareActive = false; jumpscareText = null; // Clean up Pennywise balloon if (pennywiseBalloon) { pennywiseBalloon.destroy(); pennywiseBalloon = null; } balloonClicked = false; phoneGuyCallActive = false; phoneGuyLastCallTick = 0; powerLevel = 100; gameOverReason = ''; // Reset power meter references game.powerMeterFill = null; game.powerMeterBg = null; game.topPowerTxt = null; game.topPowerBarFill = null; game.topPowerBarBg = null; // Reset music box slider references game.musicBoxSliderFill = null; game.musicBoxSliderBg = null; animatronics = []; aggroSliders = []; aggroLabels = []; aggroValueTexts = []; officeAnimatronicHeads = []; // Title var titleTxt = new Text2('Custom Night', { size: 140, fill: "#fff" }); titleTxt.anchor.set(0.5, 0); titleTxt.x = 2048 / 2; titleTxt.y = 120; game.addChild(titleTxt); // Animatronic names var names = ['Freddy', 'Bonnie', 'Chica', 'Foxy', 'Mangle', 'Puppet', 'Balloon Boy', 'Golden Freddy', 'Baldi', 'Herobrine', 'McDonalds Clown', 'Chuck E Cheese', 'Freddy Krueger', 'Testo Taylan', 'Jeff The Killer', 'Smile Dog', 'Pennywise', 'Chucky', 'Momo', 'KY kız', 'Among Us Red', 'Stickman', 'Cartoon Cat', 'Baby Doll', 'Phone Guy', 'Purple Guy', 'Testere', 'Çığlık', 'SCP 173', 'Siren Head', 'SCP 096', 'SpongeBob']; var colors = [0x8B5C2A, 0x4B5B9E, 0xE6D13A, 0xB13A2A, 0xFF69B4, 0x800080, 0x32CD32, 0xFFD700, 0x8B7355, 0x2F4F2F, 0xFF0000, 0x800080, 0x8B0000, 0x4169E1, 0x000000, 0x654321]; // Store heads array to set visibility after sliders are created var heads = []; for (var i = 0; i < 32; i++) { // Calculate position for 8 rows of 4 characters each var row = Math.floor(i / 4); var col = i % 4; var xPos = 400 + col * 400; var yPos = 350 + row * 280; // Head icon var headId = names[i].toLowerCase().replace(' ', '_') + '_head'; // Special case for Chuck E Cheese if (names[i] === 'Chuck E Cheese') { headId = 'chuck_e_cheese_head'; } else if (names[i] === 'Freddy Krueger') { headId = 'freddy_krueger_head'; } else if (names[i] === 'Testo Taylan') { headId = 'testo_taylan_head'; } else if (names[i] === 'Jeff The Killer') { headId = 'jeff_the_killer_head'; } else if (names[i] === 'Smile Dog') { headId = 'smile_dog_head'; } else if (names[i] === 'Pennywise') { headId = 'pennywise_head'; } else if (names[i] === 'Chucky') { headId = 'chucky_head'; } else if (names[i] === 'Momo') { headId = 'momo_head'; } else if (names[i] === 'KY kız') { headId = 'ky_kiz_head'; } else if (names[i] === 'Among Us Red') { headId = 'among_us_red_head'; } else if (names[i] === 'Stickman') { headId = 'stickman_head'; } else if (names[i] === 'Cartoon Cat') { headId = 'cartoon_cat_head'; } else if (names[i] === 'Baby Doll') { headId = 'baby_doll_head'; } else if (names[i] === 'Phone Guy') { headId = 'phone_guy_head'; } else if (names[i] === 'Purple Guy') { headId = 'purple_guy_head'; } else if (names[i] === 'Testere') { headId = 'testere_head'; } else if (names[i] === 'Çığlık') { headId = 'ciglik_head'; } else if (names[i] === 'SCP 173') { headId = 'scp_173_head'; } else if (names[i] === 'Siren Head') { headId = 'siren_head_head'; } else if (names[i] === 'SCP 096') { headId = 'scp_096_head'; } else if (names[i] === 'SpongeBob') { headId = 'spongebob_head'; } var head = LK.getAsset(headId, { anchorX: 0.5, anchorY: 0.5, x: xPos, y: yPos }); game.addChild(head); heads.push(head); // Name label var label = new Text2(names[i], { size: 50, fill: "#fff" }); label.anchor.set(0.5, 0); label.x = xPos; label.y = yPos + 90; game.addChild(label); aggroLabels.push(label); // Aggression value (no slider, just value) var slider = { value: 0, setValue: function setValue(val) { if (val < 0) { val = 0; } if (val > 10) { val = 10; } this.value = val; } }; aggroSliders.push(slider); // Up button (smaller, positioned to the right of character) var upBtn = LK.getAsset('cam_btn', { anchorX: 0.5, anchorY: 0.5, x: xPos + 150, y: yPos - 30, scaleX: 0.6, scaleY: 0.6 }); game.addChild(upBtn); var upTxt = new Text2('▲', { size: 30, fill: "#fff" }); upTxt.anchor.set(0.5, 0.5); upTxt.x = xPos + 150; upTxt.y = yPos - 30; game.addChild(upTxt); // Down button (smaller, positioned to the right of character) var downBtn = LK.getAsset('cam_btn', { anchorX: 0.5, anchorY: 0.5, x: xPos + 150, y: yPos + 30, scaleX: 0.6, scaleY: 0.6 }); game.addChild(downBtn); var downTxt = new Text2('▼', { size: 30, fill: "#fff" }); downTxt.anchor.set(0.5, 0.5); downTxt.x = xPos + 150; downTxt.y = yPos + 30; game.addChild(downTxt); // Value text (smaller, positioned to the right of character) var valueTxt = new Text2('0', { size: 40, fill: "#fff" }); valueTxt.anchor.set(0.5, 0.5); valueTxt.x = xPos + 150; valueTxt.y = yPos; game.addChild(valueTxt); aggroValueTexts.push(valueTxt); // Slider change event (function (idx, sliderRef, valueTxtRef, headRef) { sliderRef.onChange = function (val) { valueTxtRef.setText(val); headRef.visible = val > 0; }; upBtn.down = function (x, y, obj) { sliderRef.setValue(sliderRef.value + 1); if (sliderRef.onChange) { sliderRef.onChange(sliderRef.value); } }; upTxt.down = upBtn.down; downBtn.down = function (x, y, obj) { sliderRef.setValue(sliderRef.value - 1); if (sliderRef.onChange) { sliderRef.onChange(sliderRef.value); } }; downTxt.down = downBtn.down; })(i, slider, valueTxt, heads[i]); } // Set initial head visibility now that sliders exist for (var i = 0; i < heads.length; i++) { heads[i].visible = aggroSliders[i].value > 0; } // Start button startBtn = LK.getAsset('start_btn', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2 + 400, y: 190 }); game.addChild(startBtn); var startTxt = new Text2('Start Night', { size: 70, fill: "#fff" }); startTxt.anchor.set(0.5, 0.5); startTxt.x = 2048 / 2 + 400; startTxt.y = 190; game.addChild(startTxt); // Start button event startBtn.down = function (x, y, obj) { // Check if specific aggression values are set for Golden Freddy jumpscare if (aggroSliders[0].value === 1 && aggroSliders[1].value === 9 && aggroSliders[2].value === 8 && aggroSliders[3].value === 7) { // Trigger Golden Freddy jumpscare jumpscareActive = true; jumpscareAnimatronic = 7; // Golden Freddy index jumpscareTick = LK.ticks; gameOverReason = 'Golden Freddy appeared!'; // Play jumpscare sound LK.getSound('golden_freddy_jumpscare').play(); // Show Golden Freddy head in center, scale up jumpscareAnim = LK.getAsset('golden_freddy_head', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 900 / 2 + 300, scaleX: 1, scaleY: 1 }); game.addChild(jumpscareAnim); tween(jumpscareAnim, { scaleX: 3, scaleY: 3 }, { duration: 800, easing: tween.cubicOut }); // Flash screen red LK.effects.flashScreen(0xff0000, 800); // After 1s, show game over LK.setTimeout(function () { if (jumpscareAnim) { jumpscareAnim.destroy(); } LK.showGameOver(); }, 1000); } else { // Start normal night startNight(); } }; startTxt.down = function (x, y, obj) { // Check if specific aggression values are set for Golden Freddy jumpscare if (aggroSliders[0].value === 1 && aggroSliders[1].value === 9 && aggroSliders[2].value === 8 && aggroSliders[3].value === 7) { // Trigger Golden Freddy jumpscare jumpscareActive = true; jumpscareAnimatronic = 7; // Golden Freddy index jumpscareTick = LK.ticks; gameOverReason = 'Golden Freddy appeared!'; // Play jumpscare sound LK.getSound('golden_freddy_jumpscare').play(); // Show Golden Freddy head in center, scale up jumpscareAnim = LK.getAsset('golden_freddy_head', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 900 / 2 + 300, scaleX: 1, scaleY: 1 }); game.addChild(jumpscareAnim); tween(jumpscareAnim, { scaleX: 3, scaleY: 3 }, { duration: 800, easing: tween.cubicOut }); // Flash screen red LK.effects.flashScreen(0xff0000, 800); // After 1s, show game over LK.setTimeout(function () { if (jumpscareAnim) { jumpscareAnim.destroy(); } LK.showGameOver(); }, 1000); } else { // Start normal night startNight(); } }; } // --- START NIGHT --- function startNight() { // Remove menu elements while (game.children.length > 0) { game.children[0].destroy(); } nightStarted = true; jumpscareActive = false; hour = 12; minute = 0; nightStartTick = LK.ticks + 1; // Prevent instant win by offsetting start tick leftDoorClosed = false; rightDoorClosed = false; leftLightOn = false; rightLightOn = false; camOpen = false; officeAnimatronicHeads = []; camAnimatronicHeads = []; camAnimatronicRoomTxtObjs = []; camAnimatronicRoomHeadObjs = []; camAnimatronicRoomNames = []; camAnimatronicRoomHeads = []; camAnimatronicRoomTxts = []; // Reset Pennywise balloon state if (pennywiseBalloon) { pennywiseBalloon.destroy(); pennywiseBalloon = null; } balloonClicked = false; phoneGuyCallActive = false; phoneGuyLastCallTick = LK.ticks; // Calculate Phone Guy call interval based on aggression var phoneGuyIndex = -1; for (var i = 0; i < animatronics.length; i++) { if (animatronics[i].name === 'Phone Guy') { phoneGuyIndex = i; break; } } if (phoneGuyIndex !== -1) { var aggression = animatronics[phoneGuyIndex].aggression; phoneGuyCallInterval = Math.max(600, 3600 - aggression * 300); // 1 minute at 0, 10 seconds at 10 } // Create animatronics var names = ['Freddy', 'Bonnie', 'Chica', 'Foxy', 'Mangle', 'Puppet', 'Balloon Boy', 'Golden Freddy', 'Baldi', 'Herobrine', 'McDonalds Clown', 'Chuck E Cheese', 'Freddy Krueger', 'Testo Taylan', 'Jeff The Killer', 'Smile Dog', 'Pennywise', 'Chucky', 'Momo', 'KY kız', 'Among Us Red', 'Stickman', 'Cartoon Cat', 'Baby Doll', 'Phone Guy', 'Purple Guy', 'Testere', 'Çığlık', 'SCP 173', 'Siren Head', 'SCP 096', 'SpongeBob']; animatronics = []; for (var i = 0; i < 32; i++) { var a = new Animatronic(); a.setType(names[i]); a.setAggression(aggroSliders[i].value); a.reset(); animatronics.push(a); } // Office background officeBg = LK.getAsset('office_bg', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(officeBg); // Visible button for Freddy nose sound effect on "My Fun Day" poster var freddyNoseBtn = LK.getAsset('cam_btn', { anchorX: 0.5, anchorY: 0.5, x: 1550, // Position above the My Fun Day poster y: 300, // Position above the My Fun Day poster scaleX: 0.3, scaleY: 0.3 }); game.addChild(freddyNoseBtn); // Add nose button text var freddyNoseText = new Text2('♪', { size: 30, fill: "#fff" }); freddyNoseText.anchor.set(0.5, 0.5); freddyNoseText.x = 50; freddyNoseText.y = 50; game.addChild(freddyNoseText); // Add click handler for nose button freddyNoseBtn.down = function (x, y, obj) { LK.getSound('freddy_nose_honk').play(); }; // Add click handler for nose text as well freddyNoseText.down = function (x, y, obj) { LK.getSound('freddy_nose_honk').play(); }; // Check if Puppet has aggression set before creating music box var puppetIndex = -1; for (var i = 0; i < animatronics.length; i++) { if (animatronics[i].name === 'Puppet') { puppetIndex = i; break; } } // Only create music box if Puppet has aggression > 0 if (puppetIndex !== -1 && animatronics[puppetIndex].aggression > 0) { // Create music box for Puppet musicBox = LK.getAsset('music_box_bg', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 400 }); game.addChild(musicBox); musicBoxHandle = LK.getAsset('music_box_handle', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 380 }); game.addChild(musicBoxHandle); musicBoxLevelText = new Text2('100', { size: 30, fill: "#fff" }); musicBoxLevelText.anchor.set(0.5, 0.5); musicBoxLevelText.x = 2048 / 2; musicBoxLevelText.y = 350; game.addChild(musicBoxLevelText); // Add vertical slider bar to the left of music box var musicBoxSliderBg = LK.getAsset('slider_bar', { anchorX: 0.5, anchorY: 0, x: 2048 / 2 - 150, y: 280, scaleX: 0.4, scaleY: 2.0, rotation: Math.PI / 2 }); game.addChild(musicBoxSliderBg); var musicBoxSliderFill = LK.getAsset('slider_bar', { anchorX: 0.5, anchorY: 0, x: 2048 / 2 - 150, y: 280, scaleX: 0.4, scaleY: 2.0, rotation: Math.PI / 2, tint: 0x00FF00 }); game.addChild(musicBoxSliderFill); // Store references for updates game.musicBoxSliderFill = musicBoxSliderFill; game.musicBoxSliderBg = musicBoxSliderBg; } else { // Puppet not active, set music box objects to null musicBox = null; musicBoxHandle = null; musicBoxLevelText = null; game.musicBoxSliderFill = null; game.musicBoxSliderBg = null; } // Only add music box event handlers if Puppet is active if (musicBox && musicBoxHandle && musicBoxLevelText) { // Music box click handler - start holding musicBox.down = function (x, y, obj) { musicBoxHeld = true; if (musicBoxLevel < 100) { LK.getSound('music_box').play(); } }; musicBoxHandle.down = function (x, y, obj) { musicBoxHeld = true; if (musicBoxLevel < 100) { LK.getSound('music_box').play(); } }; musicBoxLevelText.down = function (x, y, obj) { musicBoxHeld = true; if (musicBoxLevel < 100) { LK.getSound('music_box').play(); } }; // Music box release handlers - stop holding musicBox.up = function (x, y, obj) { musicBoxHeld = false; }; musicBoxHandle.up = function (x, y, obj) { musicBoxHeld = false; }; musicBoxLevelText.up = function (x, y, obj) { musicBoxHeld = false; }; } // Reset music box level and held state musicBoxLevel = 100; musicBoxHeld = false; // Door panels leftDoorPanel = LK.getAsset('left_door', { anchorX: 0, anchorY: 0, x: 0, y: 200, scaleX: 2.5, scaleY: 2.2 }); rightDoorPanel = LK.getAsset('right_door', { anchorX: 1, anchorY: 0, x: 2048, y: 200, scaleX: 2.5, scaleY: 2.2 }); leftDoorPanel.visible = false; rightDoorPanel.visible = false; game.addChild(leftDoorPanel); game.addChild(rightDoorPanel); // Door buttons leftDoorBtn = LK.getAsset('door_btn', { anchorX: 0, anchorY: 0, x: 40, y: 1300 }); rightDoorBtn = LK.getAsset('door_btn', { anchorX: 0, anchorY: 0, x: 2048 - 220, y: 1300 }); game.addChild(leftDoorBtn); game.addChild(rightDoorBtn); var leftDoorTxt = new Text2('Left Door', { size: 40, fill: "#fff" }); leftDoorTxt.anchor.set(0.5, 0.5); leftDoorTxt.x = 40 + 90; leftDoorTxt.y = 1300 + 45; game.addChild(leftDoorTxt); var rightDoorTxt = new Text2('Right Door', { size: 40, fill: "#fff" }); rightDoorTxt.anchor.set(0.5, 0.5); rightDoorTxt.x = 2048 - 220 + 90; rightDoorTxt.y = 1300 + 45; game.addChild(rightDoorTxt); // Light buttons leftLightBtn = LK.getAsset('light_btn', { anchorX: 0, anchorY: 0, x: 40, y: 1420 }); rightLightBtn = LK.getAsset('light_btn', { anchorX: 0, anchorY: 0, x: 2048 - 220, y: 1420 }); game.addChild(leftLightBtn); game.addChild(rightLightBtn); var leftLightTxt = new Text2('Left Light', { size: 40, fill: "#222" }); leftLightTxt.anchor.set(0.5, 0.5); leftLightTxt.x = 40 + 90; leftLightTxt.y = 1420 + 45; game.addChild(leftLightTxt); var rightLightTxt = new Text2('Right Light', { size: 40, fill: "#222" }); rightLightTxt.anchor.set(0.5, 0.5); rightLightTxt.x = 2048 - 220 + 90; rightLightTxt.y = 1420 + 45; game.addChild(rightLightTxt); // Camera button camBtn = LK.getAsset('cam_btn', { anchorX: 0.5, anchorY: 0, x: 2048 / 2, y: 1300 }); game.addChild(camBtn); var camBtnTxt = new Text2('CAM', { size: 50, fill: "#fff" }); camBtnTxt.anchor.set(0.5, 0.5); camBtnTxt.x = 2048 / 2; camBtnTxt.y = 1300 + 45; game.addChild(camBtnTxt); // Time text - positioned in top left corner timeTxt = new Text2('12:00 A.M', { size: 90, fill: "#fff" }); timeTxt.anchor.set(0, 0); timeTxt.x = 150; // Avoid the top left 100x100 menu area timeTxt.y = 30; LK.gui.top.addChild(timeTxt); // Power meter in top left area var topPowerLabel = new Text2('POWER', { size: 60, fill: 0xFFFFFF }); topPowerLabel.anchor.set(0, 0); topPowerLabel.x = 150; topPowerLabel.y = 150; LK.gui.top.addChild(topPowerLabel); // Power percentage text in top left var topPowerTxt = new Text2('100%', { size: 80, fill: 0x00FF00 }); topPowerTxt.anchor.set(0, 0); topPowerTxt.x = 150; topPowerTxt.y = 220; LK.gui.top.addChild(topPowerTxt); // Power bar background in top left var topPowerBarBg = LK.getAsset('slider_bar', { anchorX: 0, anchorY: 0, x: 150, y: 320, scaleX: 1.2, scaleY: 1.0 }); LK.gui.top.addChild(topPowerBarBg); // Power bar fill in top left var topPowerBarFill = LK.getAsset('slider_bar', { anchorX: 0, anchorY: 0, x: 150, y: 320, scaleX: 1.2, scaleY: 1.0, tint: 0x00FF00 }); LK.gui.top.addChild(topPowerBarFill); // Store references for updates game.topPowerTxt = topPowerTxt; game.topPowerBarFill = topPowerBarFill; game.topPowerBarBg = topPowerBarBg; // Power system UI with visual indicator powerTxt = new Text2('Power: 100%', { size: 60, fill: 0x00FF00 }); powerTxt.anchor.set(0, 1); powerTxt.x = 150; powerTxt.y = 2732 - 30; LK.gui.bottom.addChild(powerTxt); // Power meter background bar var powerMeterBg = LK.getAsset('slider_bar', { anchorX: 0, anchorY: 1, x: 150, y: 2732 - 120, scaleX: 0.8, scaleY: 0.8 }); LK.gui.bottom.addChild(powerMeterBg); // Power meter fill bar (green indicator) var powerMeterFill = LK.getAsset('slider_bar', { anchorX: 0, anchorY: 1, x: 150, y: 2732 - 120, scaleX: 0.8, scaleY: 0.8, tint: 0x00FF00 }); LK.gui.bottom.addChild(powerMeterFill); // Power meter label var powerMeterLabel = new Text2('POWER', { size: 40, fill: 0xFFFFFF }); powerMeterLabel.anchor.set(0, 1); powerMeterLabel.x = 150; powerMeterLabel.y = 2732 - 150; LK.gui.bottom.addChild(powerMeterLabel); usageTxt = new Text2('Usage: Low', { size: 50, fill: 0xFFFFFF }); usageTxt.anchor.set(0, 1); usageTxt.x = 150; usageTxt.y = 2732 - 180; LK.gui.bottom.addChild(usageTxt); // Store power meter references for updates game.powerMeterFill = powerMeterFill; game.powerMeterBg = powerMeterBg; // Start ambient music LK.playMusic('night_ambience'); powerLevel = 100; // Office animatronic heads (hidden unless at door) for (var i = 0; i < 32; i++) { var headId = animatronics[i].name.toLowerCase().replace(/ /g, '_') + '_head'; // Special case for Chuck E Cheese if (animatronics[i].name === 'Chuck E Cheese') { headId = 'chuck_e_cheese_head'; } else if (animatronics[i].name === 'Freddy Krueger') { headId = 'freddy_krueger_head'; } else if (animatronics[i].name === 'Testo Taylan') { headId = 'testo_taylan_head'; } else if (animatronics[i].name === 'Jeff The Killer') { headId = 'jeff_the_killer_head'; } else if (animatronics[i].name === 'Smile Dog') { headId = 'smile_dog_head'; } else if (animatronics[i].name === 'Pennywise') { headId = 'pennywise_head'; } else if (animatronics[i].name === 'Chucky') { headId = 'chucky_head'; } else if (animatronics[i].name === 'Momo') { headId = 'momo_head'; } else if (animatronics[i].name === 'KY kız') { headId = 'ky_kiz_head'; } else if (animatronics[i].name === 'Among Us Red') { headId = 'among_us_red_head'; } else if (animatronics[i].name === 'Stickman') { headId = 'stickman_head'; } else if (animatronics[i].name === 'Cartoon Cat') { headId = 'cartoon_cat_head'; } else if (animatronics[i].name === 'Baby Doll') { headId = 'baby_doll_head'; } else if (animatronics[i].name === 'Phone Guy') { headId = 'phone_guy_head'; } else if (animatronics[i].name === 'Purple Guy') { headId = 'purple_guy_head'; } else if (animatronics[i].name === 'Testere') { headId = 'testere_head'; } else if (animatronics[i].name === 'Çığlık') { headId = 'ciglik_head'; } else if (animatronics[i].name === 'SCP 173') { headId = 'scp_173_head'; } else if (animatronics[i].name === 'Siren Head') { headId = 'siren_head_head'; } else if (animatronics[i].name === 'SCP 096') { headId = 'scp_096_head'; } else if (animatronics[i].name === 'SpongeBob') { headId = 'spongebob_head'; } var head = LK.getAsset(headId, { anchorX: 0.5, anchorY: 0.5, x: 0, y: 0 }); head.visible = false; officeAnimatronicHeads.push(head); game.addChild(head); } // Button events leftDoorBtn.down = function (x, y, obj) { if (powerLevel <= 0) return; // Can't use doors without power var wasOpen = !leftDoorClosed; leftDoorClosed = !leftDoorClosed; // Only play sound when door goes from open to closed if (wasOpen && leftDoorClosed) { LK.getSound('door_sound').play(); // Add slight screen shake for impact tween(officeBg, { x: -10 }, { duration: 100, onFinish: function onFinish() { tween(officeBg, { x: 0 }, { duration: 100 }); } }); } leftDoorPanel.visible = leftDoorClosed; // Change button color based on door state if (leftDoorClosed) { tween(leftDoorBtn, { tint: 0xff0000 }, { duration: 200 }); } else { tween(leftDoorBtn, { tint: 0xffffff }, { duration: 200 }); } }; rightDoorBtn.down = function (x, y, obj) { if (powerLevel <= 0) return; // Can't use doors without power var wasOpen = !rightDoorClosed; rightDoorClosed = !rightDoorClosed; // Only play sound when door goes from open to closed if (wasOpen && rightDoorClosed) { LK.getSound('door_sound').play(); // Add slight screen shake for impact tween(officeBg, { x: 10 }, { duration: 100, onFinish: function onFinish() { tween(officeBg, { x: 0 }, { duration: 100 }); } }); } rightDoorPanel.visible = rightDoorClosed; // Change button color based on door state if (rightDoorClosed) { tween(rightDoorBtn, { tint: 0xff0000 }, { duration: 200 }); } else { tween(rightDoorBtn, { tint: 0xffffff }, { duration: 200 }); } }; leftLightBtn.down = function (x, y, obj) { if (powerLevel <= 0) return; // Can't use lights without power var wasOff = !leftLightOn; leftLightOn = !leftLightOn; // Check if any left-side animatronic is at door var leftSideAtDoor = false; for (var i = 0; i < animatronics.length; i++) { var a = animatronics[i]; if ((a.name === 'Bonnie' || a.name === 'Foxy' || a.name === 'Mangle' || a.name === 'Puppet' || a.name === 'Baldi' || a.name === 'Herobrine' || a.name === 'Jeff The Killer' || a.name === 'Chucky' || a.name === 'KY kız' || a.name === 'Among Us Red' || a.name === 'Stickman' || a.name === 'Phone Guy' || a.name === 'Testere' || a.name === 'SCP 173' || a.name === 'Siren Head') && a.isAtDoor()) { leftSideAtDoor = true; break; } } // Only play sound when light goes from off to on if (wasOff && leftLightOn) { if (leftSideAtDoor) { LK.getSound('light_character_sound').play(); // Add breathing sound for tension LK.getSound('breathing').play(); } else { LK.getSound('light_sound').play(); } } // Set button color based on whether someone is at door if (leftLightOn) { if (leftSideAtDoor) { tween(leftLightBtn, { tint: 0xff0000 }, { duration: 200 }); // Flash office for dramatic effect when character detected LK.effects.flashScreen(0x440000, 300); } else { tween(leftLightBtn, { tint: 0x00ff00 }, { duration: 200 }); } } else { tween(leftLightBtn, { tint: 0xffffff }, { duration: 200 }); } }; rightLightBtn.down = function (x, y, obj) { if (powerLevel <= 0) return; // Can't use lights without power var wasOff = !rightLightOn; rightLightOn = !rightLightOn; // Check if any right-side animatronic is at door var rightSideAtDoor = false; for (var i = 0; i < animatronics.length; i++) { var a = animatronics[i]; if ((a.name === 'Freddy' || a.name === 'Chica' || a.name === 'Balloon Boy' || a.name === 'Golden Freddy' || a.name === 'McDonalds Clown' || a.name === 'Chuck E Cheese' || a.name === 'Freddy Krueger' || a.name === 'Testo Taylan' || a.name === 'Smile Dog' || a.name === 'Pennywise' || a.name === 'Momo' || a.name === 'Cartoon Cat' || a.name === 'Baby Doll' || a.name === 'Purple Guy' || a.name === 'Çığlık' || a.name === 'SCP 096' || a.name === 'SpongeBob') && a.isAtDoor()) { rightSideAtDoor = true; break; } } // Only play sound when light goes from off to on if (wasOff && rightLightOn) { if (rightSideAtDoor) { LK.getSound('light_character_sound').play(); // Add breathing sound for tension LK.getSound('breathing').play(); } else { LK.getSound('light_sound').play(); } } // Set button color based on whether someone is at door if (rightLightOn) { if (rightSideAtDoor) { tween(rightLightBtn, { tint: 0xff0000 }, { duration: 200 }); // Flash office for dramatic effect when character detected LK.effects.flashScreen(0x440000, 300); } else { tween(rightLightBtn, { tint: 0x00ff00 }, { duration: 200 }); } } else { tween(rightLightBtn, { tint: 0xffffff }, { duration: 200 }); } }; camBtn.down = function (x, y, obj) { openCamera(); }; } // --- CAMERA VIEW --- function openCamera() { camOpen = true; // Play camera sound when opening LK.getSound('camera_sound').play(); // Hide Phone Guy skip button if active if (phoneGuySkipBtn) { phoneGuySkipBtn.visible = false; } if (phoneGuySkipTxt) { phoneGuySkipTxt.visible = false; } // Hide CAM button camBtn.visible = false; // Create map background mapBg = LK.getAsset('map_bg', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 900 / 2 }); game.addChild(mapBg); // Create room representations mapRooms = []; mapRoomLabels = []; mapAnimatronicHeads = []; // Stage room var stageRoom = LK.getAsset('room_stage', { anchorX: 0.5, anchorY: 0.5, x: roomPositions['Stage'].x, y: roomPositions['Stage'].y }); game.addChild(stageRoom); mapRooms.push(stageRoom); var stageLabel = new Text2('STAGE', { size: 30, fill: 0xFFFFFF }); stageLabel.anchor.set(0.5, 0.5); stageLabel.x = roomPositions['Stage'].x; stageLabel.y = roomPositions['Stage'].y - 90; game.addChild(stageLabel); mapRoomLabels.push(stageLabel); // Left Hall room var leftHallRoom = LK.getAsset('room_left_hall', { anchorX: 0.5, anchorY: 0.5, x: roomPositions['Left Hall'].x, y: roomPositions['Left Hall'].y }); game.addChild(leftHallRoom); mapRooms.push(leftHallRoom); var leftHallLabel = new Text2('LEFT HALL', { size: 25, fill: 0xFFFFFF }); leftHallLabel.anchor.set(0.5, 0.5); leftHallLabel.x = roomPositions['Left Hall'].x; leftHallLabel.y = roomPositions['Left Hall'].y - 70; game.addChild(leftHallLabel); mapRoomLabels.push(leftHallLabel); // Right Hall room var rightHallRoom = LK.getAsset('room_right_hall', { anchorX: 0.5, anchorY: 0.5, x: roomPositions['Right Hall'].x, y: roomPositions['Right Hall'].y }); game.addChild(rightHallRoom); mapRooms.push(rightHallRoom); var rightHallLabel = new Text2('RIGHT HALL', { size: 25, fill: 0xFFFFFF }); rightHallLabel.anchor.set(0.5, 0.5); rightHallLabel.x = roomPositions['Right Hall'].x; rightHallLabel.y = roomPositions['Right Hall'].y - 70; game.addChild(rightHallLabel); mapRoomLabels.push(rightHallLabel); // Left Door room var leftDoorRoom = LK.getAsset('room_left_door', { anchorX: 0.5, anchorY: 0.5, x: roomPositions['Left Door'].x, y: roomPositions['Left Door'].y }); game.addChild(leftDoorRoom); mapRooms.push(leftDoorRoom); var leftDoorLabel = new Text2('LEFT DOOR', { size: 20, fill: 0xFFFFFF }); leftDoorLabel.anchor.set(0.5, 0.5); leftDoorLabel.x = roomPositions['Left Door'].x; leftDoorLabel.y = roomPositions['Left Door'].y - 60; game.addChild(leftDoorLabel); mapRoomLabels.push(leftDoorLabel); // Right Door room var rightDoorRoom = LK.getAsset('room_right_door', { anchorX: 0.5, anchorY: 0.5, x: roomPositions['Right Door'].x, y: roomPositions['Right Door'].y }); game.addChild(rightDoorRoom); mapRooms.push(rightDoorRoom); var rightDoorLabel = new Text2('RIGHT DOOR', { size: 20, fill: 0xFFFFFF }); rightDoorLabel.anchor.set(0.5, 0.5); rightDoorLabel.x = roomPositions['Right Door'].x; rightDoorLabel.y = roomPositions['Right Door'].y - 60; game.addChild(rightDoorLabel); mapRoomLabels.push(rightDoorLabel); // Office room (player location) var officeRoom = LK.getAsset('office_room', { anchorX: 0.5, anchorY: 0.5, x: roomPositions['Office'].x, y: roomPositions['Office'].y }); game.addChild(officeRoom); mapRooms.push(officeRoom); var officeLabel = new Text2('OFFICE (YOU)', { size: 25, fill: 0x00FF00 }); officeLabel.anchor.set(0.5, 0.5); officeLabel.x = roomPositions['Office'].x; officeLabel.y = roomPositions['Office'].y - 75; game.addChild(officeLabel); mapRoomLabels.push(officeLabel); // Position animatronics on map for (var i = 0; i < 32; i++) { var a = animatronics[i]; if (a.aggression > 0 && a.name !== 'Phone Guy') { var room = a.getRoom(); var roomPos = roomPositions[room]; if (roomPos) { var headId = a.name.toLowerCase().replace(/ /g, '_') + '_head'; // Special case for Chuck E Cheese if (a.name === 'Chuck E Cheese') { headId = 'chuck_e_cheese_head'; } else if (a.name === 'Freddy Krueger') { headId = 'freddy_krueger_head'; } else if (a.name === 'Testo Taylan') { headId = 'testo_taylan_head'; } else if (a.name === 'Jeff The Killer') { headId = 'jeff_the_killer_head'; } else if (a.name === 'Smile Dog') { headId = 'smile_dog_head'; } else if (a.name === 'Pennywise') { headId = 'pennywise_head'; } else if (a.name === 'Chucky') { headId = 'chucky_head'; } else if (a.name === 'Momo') { headId = 'momo_head'; } else if (a.name === 'KY kız') { headId = 'ky_kiz_head'; } else if (a.name === 'Among Us Red') { headId = 'among_us_red_head'; } else if (a.name === 'Stickman') { headId = 'stickman_head'; } else if (a.name === 'Cartoon Cat') { headId = 'cartoon_cat_head'; } else if (a.name === 'Baby Doll') { headId = 'baby_doll_head'; } else if (a.name === 'Purple Guy') { headId = 'purple_guy_head'; } else if (a.name === 'Testere') { headId = 'testere_head'; } else if (a.name === 'Çığlık') { headId = 'ciglik_head'; } else if (a.name === 'SCP 173') { headId = 'scp_173_head'; } else if (a.name === 'Siren Head') { headId = 'siren_head_head'; } else if (a.name === 'SCP 096') { headId = 'scp_096_head'; } else if (a.name === 'SpongeBob') { headId = 'spongebob_head'; } // Count how many animatronics are in this room to position them properly var animatronicsInRoom = []; for (var j = 0; j < 32; j++) { if (animatronics[j].aggression > 0 && animatronics[j].name !== 'Phone Guy' && animatronics[j].getRoom() === room) { animatronicsInRoom.push(j); } } var indexInRoom = animatronicsInRoom.indexOf(i); var offsetX = (indexInRoom - (animatronicsInRoom.length - 1) / 2) * 80; var head = LK.getAsset(headId, { anchorX: 0.5, anchorY: 0.5, x: roomPos.x + offsetX, y: roomPos.y + 20, scaleX: 0.4, scaleY: 0.4 }); game.addChild(head); mapAnimatronicHeads.push({ head: head, animatronic: a, index: i }); // Add animatronic name below head var nameLabel = new Text2(a.name, { size: 18, fill: 0xFFFF00 }); nameLabel.anchor.set(0.5, 0.5); nameLabel.x = roomPos.x + offsetX; nameLabel.y = roomPos.y + 50; game.addChild(nameLabel); mapRoomLabels.push(nameLabel); } } } // Close camera button camCloseBtn = LK.getAsset('cam_btn', { anchorX: 0.5, anchorY: 0, x: 2048 / 2, y: 1500 }); game.addChild(camCloseBtn); camCloseTxt = new Text2('CLOSE MAP', { size: 50, fill: "#fff" }); camCloseTxt.anchor.set(0.5, 0.5); camCloseTxt.x = 2048 / 2; camCloseTxt.y = 1500 + 45; game.addChild(camCloseTxt); camCloseBtn.down = function (x, y, obj) { closeCamera(); }; camCloseTxt.down = function (x, y, obj) { closeCamera(); }; } function closeCamera() { camOpen = false; // Play camera sound when closing LK.getSound('camera_sound').play(); // Show Phone Guy skip button if active if (phoneGuySkipBtn) { phoneGuySkipBtn.visible = true; } if (phoneGuySkipTxt) { phoneGuySkipTxt.visible = true; } // Show CAM button camBtn.visible = true; // Clean up map background if (mapBg) { mapBg.destroy(); mapBg = null; } // Clean up room elements for (var i = 0; i < mapRooms.length; i++) { if (mapRooms[i]) { mapRooms[i].destroy(); } } mapRooms = []; // Clean up room labels and animatronic names for (var i = 0; i < mapRoomLabels.length; i++) { if (mapRoomLabels[i]) { mapRoomLabels[i].destroy(); } } mapRoomLabels = []; // Clean up animatronic heads on map for (var i = 0; i < mapAnimatronicHeads.length; i++) { if (mapAnimatronicHeads[i] && mapAnimatronicHeads[i].head) { mapAnimatronicHeads[i].head.destroy(); } } mapAnimatronicHeads = []; // Clean up close button if (camCloseBtn) { camCloseBtn.down = null; camCloseBtn.destroy(); camCloseBtn = null; } if (camCloseTxt) { camCloseTxt.down = null; camCloseTxt.destroy(); camCloseTxt = null; } } // --- JUMPSCARE --- function triggerJumpscare(animatronicIdx) { jumpscareActive = true; jumpscareAnimatronic = animatronicIdx; jumpscareTick = LK.ticks; gameOverReason = animatronics[animatronicIdx] ? animatronics[animatronicIdx].name + ' got you!' : 'Power ran out!'; // Stop Testo Taylan music if playing if (animatronics[animatronicIdx].name === 'Testo Taylan' && animatronics[animatronicIdx].musicPlaying) { LK.getSound('testo_taylan_music').stop(); animatronics[animatronicIdx].musicPlaying = false; } // Play jumpscare sound if (animatronics[animatronicIdx].name === 'Golden Freddy') { LK.getSound('golden_freddy_jumpscare').play(); } else { LK.getSound('jumpscare').play(); } // Show animatronic head in center, scale up var headId = animatronics[animatronicIdx].name.toLowerCase().replace(/ /g, '_') + '_head'; // Special case for Chuck E Cheese if (animatronics[animatronicIdx].name === 'Chuck E Cheese') { headId = 'chuck_e_cheese_head'; } else if (animatronics[animatronicIdx].name === 'Freddy Krueger') { headId = 'freddy_krueger_head'; } else if (animatronics[animatronicIdx].name === 'Testo Taylan') { headId = 'testo_taylan_head'; } else if (animatronics[animatronicIdx].name === 'Jeff The Killer') { headId = 'jeff_the_killer_head'; } else if (animatronics[animatronicIdx].name === 'Smile Dog') { headId = 'smile_dog_head'; } else if (animatronics[animatronicIdx].name === 'Pennywise') { headId = 'pennywise_head'; } else if (animatronics[animatronicIdx].name === 'Chucky') { headId = 'chucky_head'; } else if (animatronics[animatronicIdx].name === 'Momo') { headId = 'momo_head'; } else if (animatronics[animatronicIdx].name === 'KY kız') { headId = 'ky_kiz_head'; } else if (animatronics[animatronicIdx].name === 'Among Us Red') { headId = 'among_us_red_head'; } else if (animatronics[animatronicIdx].name === 'Stickman') { headId = 'stickman_head'; } else if (animatronics[animatronicIdx].name === 'Cartoon Cat') { headId = 'cartoon_cat_head'; } else if (animatronics[animatronicIdx].name === 'Baby Doll') { headId = 'baby_doll_head'; } else if (animatronics[animatronicIdx].name === 'Phone Guy') { headId = 'phone_guy_head'; } else if (animatronics[animatronicIdx].name === 'Purple Guy') { headId = 'purple_guy_head'; } else if (animatronics[animatronicIdx].name === 'Testere') { headId = 'testere_head'; } else if (animatronics[animatronicIdx].name === 'Çığlık') { headId = 'ciglik_head'; } else if (animatronics[animatronicIdx].name === 'SCP 173') { headId = 'scp_173_head'; } else if (animatronics[animatronicIdx].name === 'Siren Head') { headId = 'siren_head_head'; } else if (animatronics[animatronicIdx].name === 'SCP 096') { headId = 'scp_096_head'; } else if (animatronics[animatronicIdx].name === 'SpongeBob') { headId = 'spongebob_head'; } jumpscareAnim = LK.getAsset(headId, { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 900 / 2 + 300, scaleX: 1, scaleY: 1 }); game.addChild(jumpscareAnim); tween(jumpscareAnim, { scaleX: 3, scaleY: 3 }, { duration: 800, easing: tween.cubicOut }); // Flash screen red LK.effects.flashScreen(0xff0000, 800); // Show jumpscare text for Testo Taylan if (animatronics[animatronicIdx].name === 'Testo Taylan') { jumpscareText = new Text2('EV ZİYARETLENDİN!!', { size: 120, fill: 0xFFFFFF }); jumpscareText.anchor.set(0.5, 1); jumpscareText.x = 2048 / 2; jumpscareText.y = 2732 - 100; // Position at bottom of screen game.addChild(jumpscareText); } // After 1s, show game over LK.setTimeout(function () { if (jumpscareAnim) { jumpscareAnim.destroy(); } // Don't destroy jumpscareText here - keep it visible on Game Over screen LK.showGameOver(); }, 1000); } // --- UPDATE LOOP --- game.update = function () { if (!nightStarted) { return; } // Time progression: Each hour = 1 minute = 60 seconds = 3600 ticks (60 seconds * 60 ticks per second) var ticksSinceStart = LK.ticks - nightStartTick; var gameHours = Math.floor(ticksSinceStart / 3600); // 1 real minute = 1 game hour var newHour = 12 + gameHours; var newMinute = 0; // Always show :00 minutes for each hour // Handle hour progression properly (12 AM -> 1 AM -> 2 AM -> ... -> 6 AM) if (newHour > 12) { newHour = newHour - 12; // Convert to AM format (13 -> 1, 14 -> 2, etc.) } if (newHour === 0) { newHour = 12; } // Ensure 12 AM shows as 12, not 0 // Cap at 6 AM if (gameHours >= 6) { newHour = 6; newMinute = 0; } if (newHour !== hour || newMinute !== minute) { hour = newHour; minute = newMinute; var ampm = 'A.M'; var hourStr = hour.toString(); var minStr = '00'; // Always show :00 timeTxt.setText(hourStr + ':' + minStr + ' ' + ampm); } // Strategic power consumption system var powerUsagePercent = 0; // Base usage: 0% when nothing is active // Count active systems var doorsActive = 0; var lightsActive = 0; if (leftDoorClosed) doorsActive++; if (rightDoorClosed) doorsActive++; if (leftLightOn) lightsActive++; if (rightLightOn) lightsActive++; // Store previous power usage to detect changes if (typeof game.previousPowerUsage === 'undefined') { game.previousPowerUsage = 0; } // Calculate power usage based on active systems if (doorsActive === 0 && lightsActive === 0 && !camOpen) { powerUsagePercent = 0; // Nothing active: 0% } else if (doorsActive === 1 && lightsActive === 0 && !camOpen) { powerUsagePercent = 25; // One door: 25% } else if (doorsActive === 0 && lightsActive === 1 && !camOpen) { powerUsagePercent = 25; // One light: 25% } else if (doorsActive === 2 && lightsActive === 0 && !camOpen) { powerUsagePercent = 50; // Two doors: 50% } else if (doorsActive === 0 && lightsActive === 2 && !camOpen) { powerUsagePercent = 50; // Two lights: 50% } else if (doorsActive === 1 && lightsActive === 1 && !camOpen) { powerUsagePercent = 50; // One door + one light: 50% } else if (doorsActive === 2 && camOpen && lightsActive === 0) { powerUsagePercent = 55; // Two doors + camera: 55% } else if (doorsActive === 2 && camOpen && lightsActive === 2) { powerUsagePercent = 100; // Two doors + camera + two lights: 100% } else { // Handle other combinations proportionally var baseUsage = doorsActive * 25 + lightsActive * 25; if (camOpen) baseUsage += 5; powerUsagePercent = Math.min(100, baseUsage); } // Play sound when power usage changes (degree setting sound effect) if (powerUsagePercent !== game.previousPowerUsage) { LK.getSound('ambient_hum').play(); game.previousPowerUsage = powerUsagePercent; } // Apply power drain based on usage percentage var actualUsageRate = powerUsageRate * (powerUsagePercent / 100); powerLevel -= actualUsageRate; if (powerLevel < 0) powerLevel = 0; // Update power UI var powerPercent = Math.floor(powerLevel); powerTxt.setText('Power: ' + powerPercent + '%'); // Update power meter visual indicator if (game.powerMeterFill) { var fillWidth = powerLevel / 100 * 0.8; // Scale width based on power level game.powerMeterFill.scaleX = fillWidth; // Change color based on power level var fillColor = 0x00FF00; // Green if (powerLevel <= 50) fillColor = 0xFFFF00; // Yellow if (powerLevel <= 25) fillColor = 0xFF6600; // Orange if (powerLevel <= 10) fillColor = 0xFF0000; // Red tween(game.powerMeterFill, { tint: fillColor }, { duration: 300 }); } // Update top left power meter if (game.topPowerTxt) { var powerPercent = Math.floor(powerLevel); game.topPowerTxt.setText(powerPercent + '%'); // Change color based on power level var textColor = 0x00FF00; // Green if (powerLevel <= 50) textColor = 0xFFFF00; // Yellow if (powerLevel <= 25) textColor = 0xFF6600; // Orange if (powerLevel <= 10) textColor = 0xFF0000; // Red tween(game.topPowerTxt, { tint: textColor }, { duration: 300 }); } // Update top left power bar if (game.topPowerBarFill) { var fillWidth = powerLevel / 100 * 1.2; // Scale width based on power level game.topPowerBarFill.scaleX = fillWidth; // Change color based on power level var barColor = 0x00FF00; // Green if (powerLevel <= 50) barColor = 0xFFFF00; // Yellow if (powerLevel <= 25) barColor = 0xFF6600; // Orange if (powerLevel <= 10) barColor = 0xFF0000; // Red tween(game.topPowerBarFill, { tint: barColor }, { duration: 300 }); } // Update usage display with actual percentage var usageText = 'Usage: ' + powerUsagePercent + '%'; usageTxt.setText(usageText); // Update usage text color based on consumption level var usageColor = 0xFFFFFF; // White if (powerUsagePercent >= 75) usageColor = 0xFF0000; // Red for high usage else if (powerUsagePercent >= 50) usageColor = 0xFF6600; // Orange for medium-high usage else if (powerUsagePercent >= 25) usageColor = 0xFFFF00; // Yellow for medium usage else if (powerUsagePercent > 0) usageColor = 0x00FF00; // Green for low usage tween(usageTxt, { tint: usageColor }, { duration: 300 }); // Change power text color based on level if (powerLevel > 50) { tween(powerTxt, { tint: 0x00ff00 }, { duration: 200 }); } else if (powerLevel > 25) { tween(powerTxt, { tint: 0xffff00 }, { duration: 200 }); } else if (powerLevel > 10) { tween(powerTxt, { tint: 0xFF6600 }, { duration: 200 }); } else { tween(powerTxt, { tint: 0xff0000 }, { duration: 200 }); } // Power warnings if (powerLevel <= 20 && powerLevel > 10 && LK.ticks - lastPowerSound > 300) { LK.getSound('ambient_hum').play(); lastPowerSound = LK.ticks; } // Power outage if (powerLevel <= 0 && !jumpscareActive) { // Close all doors and turn off lights leftDoorClosed = false; rightDoorClosed = false; leftLightOn = false; rightLightOn = false; camOpen = false; leftDoorPanel.visible = false; rightDoorPanel.visible = false; // Reset button colors tween(leftDoorBtn, { tint: 0x444444 }, { duration: 500 }); tween(rightDoorBtn, { tint: 0x444444 }, { duration: 500 }); tween(leftLightBtn, { tint: 0x444444 }, { duration: 500 }); tween(rightLightBtn, { tint: 0x444444 }, { duration: 500 }); tween(camBtn, { tint: 0x444444 }, { duration: 500 }); // Power down sound and dark screen LK.getSound('power_down').play(); LK.effects.flashScreen(0x000000, 3000); // Freddy's special power outage sequence LK.setTimeout(function () { // Play Freddy's song before jumpscare LK.getSound('testo_taylan_music').play(); LK.setTimeout(function () { gameOverReason = 'Power ran out!'; triggerJumpscare(0); // Trigger Freddy jumpscare }, 5000); }, 2000); return; } // Win condition: 6 AM (requires 6 game hours * 1 real minute = 6 real minutes total) // Prevent instant win by requiring proper game duration if (gameHours >= 6 && !jumpscareActive) { LK.showYouWin(); return; } // Music box decay and Puppet mechanics var puppetIndex = -1; for (var i = 0; i < animatronics.length; i++) { if (animatronics[i].name === 'Puppet') { puppetIndex = i; break; } } if (puppetIndex !== -1 && animatronics[puppetIndex].aggression > 0 && musicBox && musicBoxHandle && musicBoxLevelText) { // Handle music box winding when held if (musicBoxHeld && musicBoxLevel < 100) { musicBoxLevel += musicBoxWindingRate; if (musicBoxLevel > 100) { musicBoxLevel = 100; } // Animate handle rotation while winding if (LK.ticks % 10 === 0) { // Every 10 ticks for smooth animation tween(musicBoxHandle, { rotation: musicBoxHandle.rotation + Math.PI / 4 }, { duration: 200, easing: tween.easeOut }); } } // Calculate dynamic decay rate based on music box level (1-10 scale) - slowed down var levelScale = Math.max(1, Math.min(10, Math.floor(musicBoxLevel / 10) + 1)); var dynamicDecayRate = 0.2 - (levelScale - 1) * 0.015; // Much slower: 0.2 at level 1, 0.065 at level 10 // Decay music box level if (!musicBoxHeld) { musicBoxLevel -= dynamicDecayRate; } if (musicBoxLevel < 0) { musicBoxLevel = 0; } musicBoxLevelText.setText(Math.floor(musicBoxLevel).toString()); // Update music box slider visual indicator if (game.musicBoxSliderFill) { var fillHeight = musicBoxLevel / 100; // Height percentage based on music box level var yOffset = (1 - fillHeight) * (400 * 2.0); // Offset from top for proper top-to-bottom decay game.musicBoxSliderFill.scaleY = fillHeight * 2.0; // Scale height based on level game.musicBoxSliderFill.y = 280 + yOffset; // Position so it decays from top // Change color based on music box level var sliderColor = 0x00FF00; // Green if (musicBoxLevel <= 50) sliderColor = 0xFFFF00; // Yellow if (musicBoxLevel <= 25) sliderColor = 0xFF6600; // Orange if (musicBoxLevel <= 10) sliderColor = 0xFF0000; // Red tween(game.musicBoxSliderFill, { tint: sliderColor }, { duration: 300 }); } // Trigger Puppet jumpscare when music box reaches 0 if (musicBoxLevel <= 0 && !jumpscareActive) { triggerJumpscare(puppetIndex); return; } } // Difficulty scaling - animatronics get more aggressive as night progresses (faster with 1-minute hours) var difficultyMultiplier = 1 + gameHours * 0.3; // Animatronic AI for (var i = 0; i < animatronics.length; i++) { var a = animatronics[i]; // Apply difficulty scaling if (a.aggression > 0) { var originalInterval = a.moveInterval; a.moveInterval = Math.max(20, originalInterval / difficultyMultiplier); } a.tryMove(); // Restore original interval if (a.aggression > 0) { a.moveInterval = originalInterval; } } // Ambient sound management if (!ambientSoundPlaying && !camOpen && Math.random() < 0.001) { LK.getSound('ambient_hum').play(); ambientSoundPlaying = true; LK.setTimeout(function () { ambientSoundPlaying = false; }, 3000); } // Pennywise special balloon mechanic var pennywiseIndex = -1; for (var i = 0; i < animatronics.length; i++) { if (animatronics[i].name === 'Pennywise') { pennywiseIndex = i; break; } } if (pennywiseIndex !== -1 && animatronics[pennywiseIndex].aggression > 0) { // Check if Pennywise is at door and no balloon is active if (animatronics[pennywiseIndex].isAtDoor() && !pennywiseBalloon && !jumpscareActive) { // Spawn red balloon in office pennywiseBalloon = LK.getAsset('red_balloon', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 1000 }); game.addChild(pennywiseBalloon); balloonSpawnTick = LK.ticks; balloonClickDeadline = LK.ticks + 600; // 10 seconds at 60 FPS balloonClicked = false; // Animate balloon floating slightly tween(pennywiseBalloon, { y: 950 }, { duration: 2000, easing: tween.easeInOut }); // Add click handler to balloon pennywiseBalloon.down = function (x, y, obj) { if (pennywiseBalloon) { balloonClicked = true; // Animate balloon popping/shrinking tween(pennywiseBalloon, { scaleX: 0, scaleY: 0, alpha: 0 }, { duration: 300, onFinish: function onFinish() { if (pennywiseBalloon) { pennywiseBalloon.destroy(); pennywiseBalloon = null; } } }); // Reset Pennywise to start position animatronics[pennywiseIndex].position = 0; animatronics[pennywiseIndex].waitingAtDoor = false; animatronics[pennywiseIndex].returningToStart = true; animatronics[pennywiseIndex].returnedToStartTick = LK.ticks; } }; } // Check if balloon deadline passed without clicking if (pennywiseBalloon && LK.ticks >= balloonClickDeadline && !balloonClicked) { // Trigger Pennywise jumpscare if (pennywiseBalloon) { pennywiseBalloon.destroy(); pennywiseBalloon = null; } triggerJumpscare(pennywiseIndex); return; } } // Office animatronic heads (show if at door and light/door open) for (var i = 0; i < 32; i++) { var a = animatronics[i]; var head = officeAnimatronicHeads[i]; if (!head) { continue; } if (a.isAtDoor()) { if ((a.name === 'Bonnie' || a.name === 'Foxy' || a.name === 'Mangle' || a.name === 'Puppet' || a.name === 'Baldi' || a.name === 'Herobrine' || a.name === 'Jeff The Killer' || a.name === 'Chucky' || a.name === 'KY kız' || a.name === 'Among Us Red' || a.name === 'Stickman' || a.name === 'Phone Guy' || a.name === 'Testere' || a.name === 'SCP 173' || a.name === 'Siren Head') && leftLightOn && !leftDoorClosed) { // Left side characters (including new ones) head.x = 180; head.y = 900; head.visible = true; } else if ((a.name === 'Freddy' || a.name === 'Chica' || a.name === 'Balloon Boy' || a.name === 'Golden Freddy' || a.name === 'McDonalds Clown' || a.name === 'Chuck E Cheese' || a.name === 'Freddy Krueger' || a.name === 'Testo Taylan' || a.name === 'Smile Dog' || a.name === 'Pennywise' || a.name === 'Momo' || a.name === 'Cartoon Cat' || a.name === 'Baby Doll' || a.name === 'Purple Guy' || a.name === 'Çığlık' || a.name === 'SCP 096' || a.name === 'SpongeBob') && rightLightOn && !rightDoorClosed) { // Right side characters (including new ones) head.x = 2048 - 180; head.y = 900; head.visible = true; } else { head.visible = false; } } else { head.visible = false; } } // Tension building - subtle screen effects when animatronics are nearby var nearbyThreat = false; for (var i = 0; i < animatronics.length; i++) { var a = animatronics[i]; if (a.aggression > 0 && a.position >= 1) { nearbyThreat = true; break; } } // Apply subtle visual effects based on threat level if (nearbyThreat && !camOpen && Math.random() < 0.002) { // Slight office shake for tension var shakeAmount = Math.random() * 5 - 2.5; tween(officeBg, { x: shakeAmount }, { duration: 100, onFinish: function onFinish() { tween(officeBg, { x: 0 }, { duration: 100 }); } }); } // Jumpscare check if (!jumpscareActive) { for (var i = 0; i < animatronics.length; i++) { var a = animatronics[i]; // Skip Pennywise from immediate jumpscare (he uses balloon mechanic) if (a.name === 'Pennywise') { continue; } // Skip Phone Guy from immediate jumpscare (he only calls to distract) if (a.name === 'Phone Guy') { continue; } if (a.isAtDoor() && !a.waitingAtDoor) { // Pre-jumpscare warning sound if (Math.random() < 0.1) { LK.getSound('breathing').play(); } if ((a.name === 'Bonnie' || a.name === 'Foxy' || a.name === 'Mangle' || a.name === 'Puppet' || a.name === 'Baldi' || a.name === 'Herobrine' || a.name === 'Jeff The Killer' || a.name === 'Chucky' || a.name === 'KY kız' || a.name === 'Among Us Red' || a.name === 'Stickman' || a.name === 'Phone Guy' || a.name === 'Testere' || a.name === 'SCP 173' || a.name === 'Siren Head') && !leftDoorClosed) { // Left side characters (including new ones) triggerJumpscare(i); return; } else if ((a.name === 'Freddy' || a.name === 'Chica' || a.name === 'Balloon Boy' || a.name === 'Golden Freddy' || a.name === 'McDonalds Clown' || a.name === 'Chuck E Cheese' || a.name === 'Freddy Krueger' || a.name === 'Testo Taylan' || a.name === 'Smile Dog' || a.name === 'Pennywise' || a.name === 'Momo' || a.name === 'Cartoon Cat' || a.name === 'Baby Doll' || a.name === 'Purple Guy' || a.name === 'Çığlık' || a.name === 'SCP 096' || a.name === 'SpongeBob') && !rightDoorClosed) { // Right side characters (including new ones) triggerJumpscare(i); return; } } } } // Phone Guy call mechanics var phoneGuyIndex = -1; for (var i = 0; i < animatronics.length; i++) { if (animatronics[i].name === 'Phone Guy') { phoneGuyIndex = i; break; } } if (phoneGuyIndex !== -1 && animatronics[phoneGuyIndex].aggression > 0) { // Check if it's time for Phone Guy to call and no call is currently active if (!phoneGuyCallActive && LK.ticks - phoneGuyLastCallTick >= phoneGuyCallInterval && !LK.getSound('phone_sound').playing) { phoneGuyCallActive = true; phoneGuyLastCallTick = LK.ticks; // Play phone sound LK.getSound('phone_sound').play(); // Create skip button only if camera is not open if (!camOpen) { phoneGuySkipBtn = LK.getAsset('skip_btn', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 200 }); game.addChild(phoneGuySkipBtn); // Add pulsing animation to skip button if (phoneGuySkipBtn) { tween(phoneGuySkipBtn, { scaleX: 1.1, scaleY: 1.1 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { if (phoneGuySkipBtn) { tween(phoneGuySkipBtn, { scaleX: 1, scaleY: 1 }, { duration: 500, easing: tween.easeInOut }); } } }); } phoneGuySkipTxt = new Text2('SKIP CALL', { size: 40, fill: "#fff" }); phoneGuySkipTxt.anchor.set(0.5, 0.5); phoneGuySkipTxt.x = 2048 / 2; phoneGuySkipTxt.y = 200; game.addChild(phoneGuySkipTxt); // Add click handlers for skip button phoneGuySkipBtn.down = function (x, y, obj) { if (phoneGuyCallActive) { // Stop the phone sound LK.getSound('phone_sound').stop(); phoneGuyCallActive = false; // Calculate next call interval based on aggression (shorter after skip) var aggression = animatronics[phoneGuyIndex].aggression; phoneGuyCallInterval = Math.max(300, 1800 - aggression * 150); // 30 seconds at 0, 5 seconds at 10 phoneGuyLastCallTick = LK.ticks; // Remove skip button if (phoneGuySkipBtn) { phoneGuySkipBtn.destroy(); phoneGuySkipBtn = null; } if (phoneGuySkipTxt) { phoneGuySkipTxt.destroy(); phoneGuySkipTxt = null; } } }; phoneGuySkipTxt.down = phoneGuySkipBtn.down; } } // Check if phone sound finished naturally if (phoneGuyCallActive && !LK.getSound('phone_sound').playing) { phoneGuyCallActive = false; // Calculate next call interval based on aggression var aggression = animatronics[phoneGuyIndex].aggression; phoneGuyCallInterval = Math.max(600, 3600 - aggression * 300); // 1 minute at 0, 10 seconds at 10 phoneGuyLastCallTick = LK.ticks; // Remove skip button if still exists if (phoneGuySkipBtn) { phoneGuySkipBtn.destroy(); phoneGuySkipBtn = null; } if (phoneGuySkipTxt) { phoneGuySkipTxt.destroy(); phoneGuySkipTxt = null; } } } // Camera view update - animate animatronic movement on map if (camOpen) { for (var i = 0; i < mapAnimatronicHeads.length; i++) { var mapEntry = mapAnimatronicHeads[i]; if (mapEntry && mapEntry.animatronic && mapEntry.animatronic.name !== 'Phone Guy') { var currentRoom = mapEntry.animatronic.getRoom(); var roomPos = roomPositions[currentRoom]; if (roomPos) { // Count animatronics in current room for positioning var animatronicsInRoom = []; for (var j = 0; j < 32; j++) { if (animatronics[j].aggression > 0 && animatronics[j].name !== 'Phone Guy' && animatronics[j].getRoom() === currentRoom) { animatronicsInRoom.push(j); } } var indexInRoom = animatronicsInRoom.indexOf(mapEntry.index); var offsetX = (indexInRoom - (animatronicsInRoom.length - 1) / 2) * 80; var targetX = roomPos.x + offsetX; var targetY = roomPos.y + 20; // Animate movement to new position if different if (Math.abs(mapEntry.head.x - targetX) > 5 || Math.abs(mapEntry.head.y - targetY) > 5) { tween(mapEntry.head, { x: targetX, y: targetY }, { duration: 500, easing: tween.easeOut }); } } } } } }; // --- TOUCH HANDLING --- game.move = function (x, y, obj) { // No slider move handling needed }; game.down = function (x, y, obj) { // No slider down handling needed }; game.up = function (x, y, obj) { // No slider up handling needed }; // --- INIT --- setupCustomNightMenu();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// AggroSlider class removed (no longer needed)
// Animatronic class
var Animatronic = Container.expand(function () {
var self = Container.call(this);
// Properties
self.name = '';
self.aggression = 0; // 0-10
self.position = 0; // 0: stage, 1: hall, 2: door
self.active = false;
self.lastMoveTick = 0;
self.moveInterval = 0; // How often to try to move (in ticks)
self.headAsset = null;
self.hasMovedFirstTime = false; // Track if animatronic has moved for the first time
self.waitingAtDoor = false; // Track if waiting at closed door
self.doorWaitStartTick = 0; // When started waiting at door
self.returningToStart = false; // Track if returning to start position
self.returnedToStartTick = 0; // When returned to start position
self.musicPlaying = false; // Track if music is currently playing
// Set animatronic type
self.setType = function (type) {
self.name = type;
if (type === 'Freddy') {
self.headAsset = self.attachAsset('freddy_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Bonnie') {
self.headAsset = self.attachAsset('bonnie_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Chica') {
self.headAsset = self.attachAsset('chica_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Foxy') {
self.headAsset = self.attachAsset('foxy_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Mangle') {
self.headAsset = self.attachAsset('mangle_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Puppet') {
self.headAsset = self.attachAsset('puppet_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Balloon Boy') {
self.headAsset = self.attachAsset('balloon_boy_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Golden Freddy') {
self.headAsset = self.attachAsset('golden_freddy_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Baldi') {
self.headAsset = self.attachAsset('baldi_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Herobrine') {
self.headAsset = self.attachAsset('herobrine_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'McDonalds Clown') {
self.headAsset = self.attachAsset('mcdonalds_clown_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Chuck E Cheese') {
self.headAsset = self.attachAsset('chuck_e_cheese_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Freddy Krueger') {
self.headAsset = self.attachAsset('freddy_krueger_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Testo Taylan') {
self.headAsset = self.attachAsset('testo_taylan_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Jeff The Killer') {
self.headAsset = self.attachAsset('jeff_the_killer_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Smile Dog') {
self.headAsset = self.attachAsset('smile_dog_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Pennywise') {
self.headAsset = self.attachAsset('pennywise_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Chucky') {
self.headAsset = self.attachAsset('chucky_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Momo') {
self.headAsset = self.attachAsset('momo_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'KY kız') {
self.headAsset = self.attachAsset('ky_kiz_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Among Us Red') {
self.headAsset = self.attachAsset('among_us_red_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Stickman') {
self.headAsset = self.attachAsset('stickman_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Cartoon Cat') {
self.headAsset = self.attachAsset('cartoon_cat_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Baby Doll') {
self.headAsset = self.attachAsset('baby_doll_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Phone Guy') {
self.headAsset = self.attachAsset('phone_guy_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Purple Guy') {
self.headAsset = self.attachAsset('purple_guy_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Testere') {
self.headAsset = self.attachAsset('testere_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Çığlık') {
self.headAsset = self.attachAsset('ciglik_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'SCP 173') {
self.headAsset = self.attachAsset('scp_173_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'Siren Head') {
self.headAsset = self.attachAsset('siren_head_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'SCP 096') {
self.headAsset = self.attachAsset('scp_096_head', {
anchorX: 0.5,
anchorY: 0.5
});
} else if (type === 'SpongeBob') {
self.headAsset = self.attachAsset('spongebob_head', {
anchorX: 0.5,
anchorY: 0.5
});
}
};
// Set aggression (0-10)
self.setAggression = function (level) {
self.aggression = level;
// Lower interval = more aggressive
self.moveInterval = 180 - level * 15; // 180 ticks (3s) at 0, 30 ticks (0.5s) at 10
if (self.moveInterval < 30) {
self.moveInterval = 30;
}
};
// Reset animatronic to start
self.reset = function () {
self.position = 0;
self.active = self.aggression > 0;
self.lastMoveTick = LK.ticks;
self.hasMovedFirstTime = false;
self.waitingAtDoor = false;
self.doorWaitStartTick = 0;
self.returningToStart = false;
self.returnedToStartTick = 0;
self.musicPlaying = false;
};
// Try to move forward
self.tryMove = function () {
if (!self.active) {
return;
}
// Special case for Phone Guy: never moves, only makes calls
if (self.name === 'Phone Guy') {
return;
}
// Special case for Puppet: only move when music box is at 0
if (self.name === 'Puppet' && musicBoxLevel > 0) {
return;
}
if (LK.ticks - self.lastMoveTick < self.moveInterval) {
return;
}
// Check if returning to start
if (self.returningToStart) {
// Wait 6-7 seconds after returning before moving again
var waitAfterReturn = 360 + Math.random() * 60; // 6-7 seconds in ticks
if (LK.ticks - self.returnedToStartTick >= waitAfterReturn) {
self.returningToStart = false;
self.lastMoveTick = LK.ticks;
}
return;
}
// Check if waiting at door
if (self.waitingAtDoor) {
// Wait 3-4 seconds then return to start
var doorWaitTime = 180 + Math.random() * 60; // 3-4 seconds in ticks
if (LK.ticks - self.doorWaitStartTick >= doorWaitTime) {
// Return to start position
self.position = 0;
self.waitingAtDoor = false;
self.returningToStart = true;
self.returnedToStartTick = LK.ticks;
// Stop Testo Taylan music when returning to start
if (self.name === 'Testo Taylan' && self.musicPlaying) {
LK.getSound('testo_taylan_music').stop();
self.musicPlaying = false;
}
}
return;
}
// Check if at door and door is closed
if (self.position === 2) {
var doorClosed = false;
// Check which side this animatronic belongs to
if (self.name === 'Bonnie' || self.name === 'Foxy' || self.name === 'Mangle' || self.name === 'Puppet' || self.name === 'Baldi' || self.name === 'Herobrine' || self.name === 'Jeff The Killer' || self.name === 'Chucky' || self.name === 'KY kız' || self.name === 'Among Us Red' || self.name === 'Stickman' || self.name === 'Phone Guy' || self.name === 'Testere' || self.name === 'SCP 173' || self.name === 'Siren Head') {
doorClosed = leftDoorClosed;
} else {
doorClosed = rightDoorClosed;
}
if (doorClosed) {
if (!self.waitingAtDoor) {
// Start waiting at door
self.waitingAtDoor = true;
self.doorWaitStartTick = LK.ticks;
}
return;
}
}
// Normal movement logic
var chance = self.aggression / 10;
if (Math.random() < chance) {
// Play sound for Foxy's first movement
if (self.name === 'Foxy' && !self.hasMovedFirstTime) {
LK.getSound('foxy_move').play();
self.hasMovedFirstTime = true;
}
// Start playing music for Testo Taylan when starting to move
if (self.name === 'Testo Taylan' && !self.musicPlaying && self.position === 0) {
LK.getSound('testo_taylan_music').play();
self.musicPlaying = true;
}
// Add footstep sounds for certain characters
if ((self.name === 'Bonnie' || self.name === 'Chica' || self.name === 'Freddy') && Math.random() < 0.3) {
LK.setTimeout(function () {
LK.getSound('footstep').play();
}, Math.random() * 1000);
}
self.position++;
if (self.position > 2) {
self.position = 2;
}
}
self.lastMoveTick = LK.ticks;
};
// For camera view: get current room name
self.getRoom = function () {
if (self.position === 0) {
return 'Stage';
}
if (self.position === 1) {
return self.name === 'Bonnie' || self.name === 'Foxy' || self.name === 'Mangle' || self.name === 'Puppet' || self.name === 'Baldi' || self.name === 'Herobrine' || self.name === 'Jeff The Killer' || self.name === 'Chucky' || self.name === 'KY kız' || self.name === 'Among Us Red' || self.name === 'Stickman' || self.name === 'Phone Guy' || self.name === 'Testere' || self.name === 'SCP 173' || self.name === 'Siren Head' ? 'Left Hall' : 'Right Hall';
}
if (self.position === 2) {
return self.name === 'Bonnie' || self.name === 'Foxy' || self.name === 'Mangle' || self.name === 'Puppet' || self.name === 'Baldi' || self.name === 'Herobrine' || self.name === 'Jeff The Killer' || self.name === 'Chucky' || self.name === 'KY kız' || self.name === 'Among Us Red' || self.name === 'Stickman' || self.name === 'Phone Guy' || self.name === 'Testere' || self.name === 'SCP 173' || self.name === 'Siren Head' ? 'Left Door' : 'Right Door';
}
return '';
};
// For office jumpscare
self.isAtDoor = function () {
return self.position === 2;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x111111
});
/****
* Game Code
****/
// Start button
// Aggression slider bar
// Camera view background
// Office background
// Camera button
// Door panels
// Door buttons
// Animatronic heads (simple colored ellipses for each animatronic)
// --- GLOBALS ---
var animatronics = [];
var aggroSliders = [];
var aggroLabels = [];
var aggroValueTexts = [];
var startBtn = null;
var nightStarted = false;
var nightStartTick = 0;
var timeTxt = null;
var hour = 12;
var minute = 0;
var leftDoorClosed = false;
var rightDoorClosed = false;
var leftLightOn = false;
var rightLightOn = false;
var camOpen = false;
var camBtn = null;
var leftDoorBtn = null;
var rightDoorBtn = null;
var leftLightBtn = null;
var rightLightBtn = null;
var officeBg = null;
var camBg = null;
var camAnimatronicHeads = [];
var jumpscareActive = false;
var jumpscareAnim = null;
var jumpscareAnimatronic = null;
var jumpscareTick = 0;
var jumpscareText = null;
var officeAnimatronicHeads = [];
var leftDoorPanel = null;
var rightDoorPanel = null;
var camRoomTxt = null;
var camCloseBtn = null;
var camCloseTxt = null;
var camAnimatronicRoomTxts = [];
var camAnimatronicRoomHeads = [];
var camAnimatronicRoomNames = [];
var camAnimatronicRoomHeadObjs = [];
var camAnimatronicRoomTxtObjs = [];
var camAnimatronicRoomY = 300;
var camAnimatronicRoomSpacing = 300;
var camAnimatronicRoomStartX = 400;
var camAnimatronicRoomStartY = 300;
var camAnimatronicRoomHeadSize = 120;
var camAnimatronicRoomTxtSize = 60;
var camAnimatronicRoomTxtColor = "#ffffff";
var camAnimatronicRoomHeadAnchor = 0.5;
var camAnimatronicRoomTxtAnchor = 0.5;
var camAnimatronicRoomTxtYOffset = 100;
var camAnimatronicRoomHeadYOffset = 0;
var pennywiseBalloon = null;
var balloonSpawnTick = 0;
var balloonClickDeadline = 0;
var balloonClicked = false;
var mapBg = null;
var musicBox = null;
var musicBoxHandle = null;
var musicBoxLevel = 100;
var musicBoxDecayRate = 0.3;
var musicBoxLevelText = null;
var musicBoxHeld = false;
var musicBoxWindingRate = 2.0;
var phoneGuyCallActive = false;
var phoneGuyLastCallTick = 0;
var phoneGuyCallInterval = 3600; // Default 1 minute (60 seconds * 60 ticks)
var phoneGuySkipBtn = null;
var phoneGuySkipTxt = null;
var powerLevel = 100;
var powerUsageRate = 0.008; // Further reduced for much longer gameplay
var powerTxt = null;
var usageTxt = null;
var gameOverReason = '';
var lastPowerSound = 0;
var ambientSoundPlaying = false;
var mapRooms = [];
var mapAnimatronicHeads = [];
var mapRoomLabels = [];
var roomPositions = {
'Stage': {
x: 900,
y: 300
},
'Left Hall': {
x: 600,
y: 450
},
'Right Hall': {
x: 1200,
y: 450
},
'Left Door': {
x: 400,
y: 600
},
'Right Door': {
x: 1400,
y: 600
},
'Office': {
x: 900,
y: 750
}
};
// --- SETUP: Custom Night Menu ---
function setupCustomNightMenu() {
// Clear game children
while (game.children.length > 0) {
game.children[0].destroy();
}
nightStarted = false;
jumpscareActive = false;
jumpscareText = null;
// Clean up Pennywise balloon
if (pennywiseBalloon) {
pennywiseBalloon.destroy();
pennywiseBalloon = null;
}
balloonClicked = false;
phoneGuyCallActive = false;
phoneGuyLastCallTick = 0;
powerLevel = 100;
gameOverReason = '';
// Reset power meter references
game.powerMeterFill = null;
game.powerMeterBg = null;
game.topPowerTxt = null;
game.topPowerBarFill = null;
game.topPowerBarBg = null;
// Reset music box slider references
game.musicBoxSliderFill = null;
game.musicBoxSliderBg = null;
animatronics = [];
aggroSliders = [];
aggroLabels = [];
aggroValueTexts = [];
officeAnimatronicHeads = [];
// Title
var titleTxt = new Text2('Custom Night', {
size: 140,
fill: "#fff"
});
titleTxt.anchor.set(0.5, 0);
titleTxt.x = 2048 / 2;
titleTxt.y = 120;
game.addChild(titleTxt);
// Animatronic names
var names = ['Freddy', 'Bonnie', 'Chica', 'Foxy', 'Mangle', 'Puppet', 'Balloon Boy', 'Golden Freddy', 'Baldi', 'Herobrine', 'McDonalds Clown', 'Chuck E Cheese', 'Freddy Krueger', 'Testo Taylan', 'Jeff The Killer', 'Smile Dog', 'Pennywise', 'Chucky', 'Momo', 'KY kız', 'Among Us Red', 'Stickman', 'Cartoon Cat', 'Baby Doll', 'Phone Guy', 'Purple Guy', 'Testere', 'Çığlık', 'SCP 173', 'Siren Head', 'SCP 096', 'SpongeBob'];
var colors = [0x8B5C2A, 0x4B5B9E, 0xE6D13A, 0xB13A2A, 0xFF69B4, 0x800080, 0x32CD32, 0xFFD700, 0x8B7355, 0x2F4F2F, 0xFF0000, 0x800080, 0x8B0000, 0x4169E1, 0x000000, 0x654321];
// Store heads array to set visibility after sliders are created
var heads = [];
for (var i = 0; i < 32; i++) {
// Calculate position for 8 rows of 4 characters each
var row = Math.floor(i / 4);
var col = i % 4;
var xPos = 400 + col * 400;
var yPos = 350 + row * 280;
// Head icon
var headId = names[i].toLowerCase().replace(' ', '_') + '_head';
// Special case for Chuck E Cheese
if (names[i] === 'Chuck E Cheese') {
headId = 'chuck_e_cheese_head';
} else if (names[i] === 'Freddy Krueger') {
headId = 'freddy_krueger_head';
} else if (names[i] === 'Testo Taylan') {
headId = 'testo_taylan_head';
} else if (names[i] === 'Jeff The Killer') {
headId = 'jeff_the_killer_head';
} else if (names[i] === 'Smile Dog') {
headId = 'smile_dog_head';
} else if (names[i] === 'Pennywise') {
headId = 'pennywise_head';
} else if (names[i] === 'Chucky') {
headId = 'chucky_head';
} else if (names[i] === 'Momo') {
headId = 'momo_head';
} else if (names[i] === 'KY kız') {
headId = 'ky_kiz_head';
} else if (names[i] === 'Among Us Red') {
headId = 'among_us_red_head';
} else if (names[i] === 'Stickman') {
headId = 'stickman_head';
} else if (names[i] === 'Cartoon Cat') {
headId = 'cartoon_cat_head';
} else if (names[i] === 'Baby Doll') {
headId = 'baby_doll_head';
} else if (names[i] === 'Phone Guy') {
headId = 'phone_guy_head';
} else if (names[i] === 'Purple Guy') {
headId = 'purple_guy_head';
} else if (names[i] === 'Testere') {
headId = 'testere_head';
} else if (names[i] === 'Çığlık') {
headId = 'ciglik_head';
} else if (names[i] === 'SCP 173') {
headId = 'scp_173_head';
} else if (names[i] === 'Siren Head') {
headId = 'siren_head_head';
} else if (names[i] === 'SCP 096') {
headId = 'scp_096_head';
} else if (names[i] === 'SpongeBob') {
headId = 'spongebob_head';
}
var head = LK.getAsset(headId, {
anchorX: 0.5,
anchorY: 0.5,
x: xPos,
y: yPos
});
game.addChild(head);
heads.push(head);
// Name label
var label = new Text2(names[i], {
size: 50,
fill: "#fff"
});
label.anchor.set(0.5, 0);
label.x = xPos;
label.y = yPos + 90;
game.addChild(label);
aggroLabels.push(label);
// Aggression value (no slider, just value)
var slider = {
value: 0,
setValue: function setValue(val) {
if (val < 0) {
val = 0;
}
if (val > 10) {
val = 10;
}
this.value = val;
}
};
aggroSliders.push(slider);
// Up button (smaller, positioned to the right of character)
var upBtn = LK.getAsset('cam_btn', {
anchorX: 0.5,
anchorY: 0.5,
x: xPos + 150,
y: yPos - 30,
scaleX: 0.6,
scaleY: 0.6
});
game.addChild(upBtn);
var upTxt = new Text2('▲', {
size: 30,
fill: "#fff"
});
upTxt.anchor.set(0.5, 0.5);
upTxt.x = xPos + 150;
upTxt.y = yPos - 30;
game.addChild(upTxt);
// Down button (smaller, positioned to the right of character)
var downBtn = LK.getAsset('cam_btn', {
anchorX: 0.5,
anchorY: 0.5,
x: xPos + 150,
y: yPos + 30,
scaleX: 0.6,
scaleY: 0.6
});
game.addChild(downBtn);
var downTxt = new Text2('▼', {
size: 30,
fill: "#fff"
});
downTxt.anchor.set(0.5, 0.5);
downTxt.x = xPos + 150;
downTxt.y = yPos + 30;
game.addChild(downTxt);
// Value text (smaller, positioned to the right of character)
var valueTxt = new Text2('0', {
size: 40,
fill: "#fff"
});
valueTxt.anchor.set(0.5, 0.5);
valueTxt.x = xPos + 150;
valueTxt.y = yPos;
game.addChild(valueTxt);
aggroValueTexts.push(valueTxt);
// Slider change event
(function (idx, sliderRef, valueTxtRef, headRef) {
sliderRef.onChange = function (val) {
valueTxtRef.setText(val);
headRef.visible = val > 0;
};
upBtn.down = function (x, y, obj) {
sliderRef.setValue(sliderRef.value + 1);
if (sliderRef.onChange) {
sliderRef.onChange(sliderRef.value);
}
};
upTxt.down = upBtn.down;
downBtn.down = function (x, y, obj) {
sliderRef.setValue(sliderRef.value - 1);
if (sliderRef.onChange) {
sliderRef.onChange(sliderRef.value);
}
};
downTxt.down = downBtn.down;
})(i, slider, valueTxt, heads[i]);
}
// Set initial head visibility now that sliders exist
for (var i = 0; i < heads.length; i++) {
heads[i].visible = aggroSliders[i].value > 0;
}
// Start button
startBtn = LK.getAsset('start_btn', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2 + 400,
y: 190
});
game.addChild(startBtn);
var startTxt = new Text2('Start Night', {
size: 70,
fill: "#fff"
});
startTxt.anchor.set(0.5, 0.5);
startTxt.x = 2048 / 2 + 400;
startTxt.y = 190;
game.addChild(startTxt);
// Start button event
startBtn.down = function (x, y, obj) {
// Check if specific aggression values are set for Golden Freddy jumpscare
if (aggroSliders[0].value === 1 && aggroSliders[1].value === 9 && aggroSliders[2].value === 8 && aggroSliders[3].value === 7) {
// Trigger Golden Freddy jumpscare
jumpscareActive = true;
jumpscareAnimatronic = 7; // Golden Freddy index
jumpscareTick = LK.ticks;
gameOverReason = 'Golden Freddy appeared!';
// Play jumpscare sound
LK.getSound('golden_freddy_jumpscare').play();
// Show Golden Freddy head in center, scale up
jumpscareAnim = LK.getAsset('golden_freddy_head', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 900 / 2 + 300,
scaleX: 1,
scaleY: 1
});
game.addChild(jumpscareAnim);
tween(jumpscareAnim, {
scaleX: 3,
scaleY: 3
}, {
duration: 800,
easing: tween.cubicOut
});
// Flash screen red
LK.effects.flashScreen(0xff0000, 800);
// After 1s, show game over
LK.setTimeout(function () {
if (jumpscareAnim) {
jumpscareAnim.destroy();
}
LK.showGameOver();
}, 1000);
} else {
// Start normal night
startNight();
}
};
startTxt.down = function (x, y, obj) {
// Check if specific aggression values are set for Golden Freddy jumpscare
if (aggroSliders[0].value === 1 && aggroSliders[1].value === 9 && aggroSliders[2].value === 8 && aggroSliders[3].value === 7) {
// Trigger Golden Freddy jumpscare
jumpscareActive = true;
jumpscareAnimatronic = 7; // Golden Freddy index
jumpscareTick = LK.ticks;
gameOverReason = 'Golden Freddy appeared!';
// Play jumpscare sound
LK.getSound('golden_freddy_jumpscare').play();
// Show Golden Freddy head in center, scale up
jumpscareAnim = LK.getAsset('golden_freddy_head', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 900 / 2 + 300,
scaleX: 1,
scaleY: 1
});
game.addChild(jumpscareAnim);
tween(jumpscareAnim, {
scaleX: 3,
scaleY: 3
}, {
duration: 800,
easing: tween.cubicOut
});
// Flash screen red
LK.effects.flashScreen(0xff0000, 800);
// After 1s, show game over
LK.setTimeout(function () {
if (jumpscareAnim) {
jumpscareAnim.destroy();
}
LK.showGameOver();
}, 1000);
} else {
// Start normal night
startNight();
}
};
}
// --- START NIGHT ---
function startNight() {
// Remove menu elements
while (game.children.length > 0) {
game.children[0].destroy();
}
nightStarted = true;
jumpscareActive = false;
hour = 12;
minute = 0;
nightStartTick = LK.ticks + 1; // Prevent instant win by offsetting start tick
leftDoorClosed = false;
rightDoorClosed = false;
leftLightOn = false;
rightLightOn = false;
camOpen = false;
officeAnimatronicHeads = [];
camAnimatronicHeads = [];
camAnimatronicRoomTxtObjs = [];
camAnimatronicRoomHeadObjs = [];
camAnimatronicRoomNames = [];
camAnimatronicRoomHeads = [];
camAnimatronicRoomTxts = [];
// Reset Pennywise balloon state
if (pennywiseBalloon) {
pennywiseBalloon.destroy();
pennywiseBalloon = null;
}
balloonClicked = false;
phoneGuyCallActive = false;
phoneGuyLastCallTick = LK.ticks;
// Calculate Phone Guy call interval based on aggression
var phoneGuyIndex = -1;
for (var i = 0; i < animatronics.length; i++) {
if (animatronics[i].name === 'Phone Guy') {
phoneGuyIndex = i;
break;
}
}
if (phoneGuyIndex !== -1) {
var aggression = animatronics[phoneGuyIndex].aggression;
phoneGuyCallInterval = Math.max(600, 3600 - aggression * 300); // 1 minute at 0, 10 seconds at 10
}
// Create animatronics
var names = ['Freddy', 'Bonnie', 'Chica', 'Foxy', 'Mangle', 'Puppet', 'Balloon Boy', 'Golden Freddy', 'Baldi', 'Herobrine', 'McDonalds Clown', 'Chuck E Cheese', 'Freddy Krueger', 'Testo Taylan', 'Jeff The Killer', 'Smile Dog', 'Pennywise', 'Chucky', 'Momo', 'KY kız', 'Among Us Red', 'Stickman', 'Cartoon Cat', 'Baby Doll', 'Phone Guy', 'Purple Guy', 'Testere', 'Çığlık', 'SCP 173', 'Siren Head', 'SCP 096', 'SpongeBob'];
animatronics = [];
for (var i = 0; i < 32; i++) {
var a = new Animatronic();
a.setType(names[i]);
a.setAggression(aggroSliders[i].value);
a.reset();
animatronics.push(a);
}
// Office background
officeBg = LK.getAsset('office_bg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(officeBg);
// Visible button for Freddy nose sound effect on "My Fun Day" poster
var freddyNoseBtn = LK.getAsset('cam_btn', {
anchorX: 0.5,
anchorY: 0.5,
x: 1550,
// Position above the My Fun Day poster
y: 300,
// Position above the My Fun Day poster
scaleX: 0.3,
scaleY: 0.3
});
game.addChild(freddyNoseBtn);
// Add nose button text
var freddyNoseText = new Text2('♪', {
size: 30,
fill: "#fff"
});
freddyNoseText.anchor.set(0.5, 0.5);
freddyNoseText.x = 50;
freddyNoseText.y = 50;
game.addChild(freddyNoseText);
// Add click handler for nose button
freddyNoseBtn.down = function (x, y, obj) {
LK.getSound('freddy_nose_honk').play();
};
// Add click handler for nose text as well
freddyNoseText.down = function (x, y, obj) {
LK.getSound('freddy_nose_honk').play();
};
// Check if Puppet has aggression set before creating music box
var puppetIndex = -1;
for (var i = 0; i < animatronics.length; i++) {
if (animatronics[i].name === 'Puppet') {
puppetIndex = i;
break;
}
}
// Only create music box if Puppet has aggression > 0
if (puppetIndex !== -1 && animatronics[puppetIndex].aggression > 0) {
// Create music box for Puppet
musicBox = LK.getAsset('music_box_bg', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 400
});
game.addChild(musicBox);
musicBoxHandle = LK.getAsset('music_box_handle', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 380
});
game.addChild(musicBoxHandle);
musicBoxLevelText = new Text2('100', {
size: 30,
fill: "#fff"
});
musicBoxLevelText.anchor.set(0.5, 0.5);
musicBoxLevelText.x = 2048 / 2;
musicBoxLevelText.y = 350;
game.addChild(musicBoxLevelText);
// Add vertical slider bar to the left of music box
var musicBoxSliderBg = LK.getAsset('slider_bar', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2 - 150,
y: 280,
scaleX: 0.4,
scaleY: 2.0,
rotation: Math.PI / 2
});
game.addChild(musicBoxSliderBg);
var musicBoxSliderFill = LK.getAsset('slider_bar', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2 - 150,
y: 280,
scaleX: 0.4,
scaleY: 2.0,
rotation: Math.PI / 2,
tint: 0x00FF00
});
game.addChild(musicBoxSliderFill);
// Store references for updates
game.musicBoxSliderFill = musicBoxSliderFill;
game.musicBoxSliderBg = musicBoxSliderBg;
} else {
// Puppet not active, set music box objects to null
musicBox = null;
musicBoxHandle = null;
musicBoxLevelText = null;
game.musicBoxSliderFill = null;
game.musicBoxSliderBg = null;
}
// Only add music box event handlers if Puppet is active
if (musicBox && musicBoxHandle && musicBoxLevelText) {
// Music box click handler - start holding
musicBox.down = function (x, y, obj) {
musicBoxHeld = true;
if (musicBoxLevel < 100) {
LK.getSound('music_box').play();
}
};
musicBoxHandle.down = function (x, y, obj) {
musicBoxHeld = true;
if (musicBoxLevel < 100) {
LK.getSound('music_box').play();
}
};
musicBoxLevelText.down = function (x, y, obj) {
musicBoxHeld = true;
if (musicBoxLevel < 100) {
LK.getSound('music_box').play();
}
};
// Music box release handlers - stop holding
musicBox.up = function (x, y, obj) {
musicBoxHeld = false;
};
musicBoxHandle.up = function (x, y, obj) {
musicBoxHeld = false;
};
musicBoxLevelText.up = function (x, y, obj) {
musicBoxHeld = false;
};
}
// Reset music box level and held state
musicBoxLevel = 100;
musicBoxHeld = false;
// Door panels
leftDoorPanel = LK.getAsset('left_door', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 200,
scaleX: 2.5,
scaleY: 2.2
});
rightDoorPanel = LK.getAsset('right_door', {
anchorX: 1,
anchorY: 0,
x: 2048,
y: 200,
scaleX: 2.5,
scaleY: 2.2
});
leftDoorPanel.visible = false;
rightDoorPanel.visible = false;
game.addChild(leftDoorPanel);
game.addChild(rightDoorPanel);
// Door buttons
leftDoorBtn = LK.getAsset('door_btn', {
anchorX: 0,
anchorY: 0,
x: 40,
y: 1300
});
rightDoorBtn = LK.getAsset('door_btn', {
anchorX: 0,
anchorY: 0,
x: 2048 - 220,
y: 1300
});
game.addChild(leftDoorBtn);
game.addChild(rightDoorBtn);
var leftDoorTxt = new Text2('Left Door', {
size: 40,
fill: "#fff"
});
leftDoorTxt.anchor.set(0.5, 0.5);
leftDoorTxt.x = 40 + 90;
leftDoorTxt.y = 1300 + 45;
game.addChild(leftDoorTxt);
var rightDoorTxt = new Text2('Right Door', {
size: 40,
fill: "#fff"
});
rightDoorTxt.anchor.set(0.5, 0.5);
rightDoorTxt.x = 2048 - 220 + 90;
rightDoorTxt.y = 1300 + 45;
game.addChild(rightDoorTxt);
// Light buttons
leftLightBtn = LK.getAsset('light_btn', {
anchorX: 0,
anchorY: 0,
x: 40,
y: 1420
});
rightLightBtn = LK.getAsset('light_btn', {
anchorX: 0,
anchorY: 0,
x: 2048 - 220,
y: 1420
});
game.addChild(leftLightBtn);
game.addChild(rightLightBtn);
var leftLightTxt = new Text2('Left Light', {
size: 40,
fill: "#222"
});
leftLightTxt.anchor.set(0.5, 0.5);
leftLightTxt.x = 40 + 90;
leftLightTxt.y = 1420 + 45;
game.addChild(leftLightTxt);
var rightLightTxt = new Text2('Right Light', {
size: 40,
fill: "#222"
});
rightLightTxt.anchor.set(0.5, 0.5);
rightLightTxt.x = 2048 - 220 + 90;
rightLightTxt.y = 1420 + 45;
game.addChild(rightLightTxt);
// Camera button
camBtn = LK.getAsset('cam_btn', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2,
y: 1300
});
game.addChild(camBtn);
var camBtnTxt = new Text2('CAM', {
size: 50,
fill: "#fff"
});
camBtnTxt.anchor.set(0.5, 0.5);
camBtnTxt.x = 2048 / 2;
camBtnTxt.y = 1300 + 45;
game.addChild(camBtnTxt);
// Time text - positioned in top left corner
timeTxt = new Text2('12:00 A.M', {
size: 90,
fill: "#fff"
});
timeTxt.anchor.set(0, 0);
timeTxt.x = 150; // Avoid the top left 100x100 menu area
timeTxt.y = 30;
LK.gui.top.addChild(timeTxt);
// Power meter in top left area
var topPowerLabel = new Text2('POWER', {
size: 60,
fill: 0xFFFFFF
});
topPowerLabel.anchor.set(0, 0);
topPowerLabel.x = 150;
topPowerLabel.y = 150;
LK.gui.top.addChild(topPowerLabel);
// Power percentage text in top left
var topPowerTxt = new Text2('100%', {
size: 80,
fill: 0x00FF00
});
topPowerTxt.anchor.set(0, 0);
topPowerTxt.x = 150;
topPowerTxt.y = 220;
LK.gui.top.addChild(topPowerTxt);
// Power bar background in top left
var topPowerBarBg = LK.getAsset('slider_bar', {
anchorX: 0,
anchorY: 0,
x: 150,
y: 320,
scaleX: 1.2,
scaleY: 1.0
});
LK.gui.top.addChild(topPowerBarBg);
// Power bar fill in top left
var topPowerBarFill = LK.getAsset('slider_bar', {
anchorX: 0,
anchorY: 0,
x: 150,
y: 320,
scaleX: 1.2,
scaleY: 1.0,
tint: 0x00FF00
});
LK.gui.top.addChild(topPowerBarFill);
// Store references for updates
game.topPowerTxt = topPowerTxt;
game.topPowerBarFill = topPowerBarFill;
game.topPowerBarBg = topPowerBarBg;
// Power system UI with visual indicator
powerTxt = new Text2('Power: 100%', {
size: 60,
fill: 0x00FF00
});
powerTxt.anchor.set(0, 1);
powerTxt.x = 150;
powerTxt.y = 2732 - 30;
LK.gui.bottom.addChild(powerTxt);
// Power meter background bar
var powerMeterBg = LK.getAsset('slider_bar', {
anchorX: 0,
anchorY: 1,
x: 150,
y: 2732 - 120,
scaleX: 0.8,
scaleY: 0.8
});
LK.gui.bottom.addChild(powerMeterBg);
// Power meter fill bar (green indicator)
var powerMeterFill = LK.getAsset('slider_bar', {
anchorX: 0,
anchorY: 1,
x: 150,
y: 2732 - 120,
scaleX: 0.8,
scaleY: 0.8,
tint: 0x00FF00
});
LK.gui.bottom.addChild(powerMeterFill);
// Power meter label
var powerMeterLabel = new Text2('POWER', {
size: 40,
fill: 0xFFFFFF
});
powerMeterLabel.anchor.set(0, 1);
powerMeterLabel.x = 150;
powerMeterLabel.y = 2732 - 150;
LK.gui.bottom.addChild(powerMeterLabel);
usageTxt = new Text2('Usage: Low', {
size: 50,
fill: 0xFFFFFF
});
usageTxt.anchor.set(0, 1);
usageTxt.x = 150;
usageTxt.y = 2732 - 180;
LK.gui.bottom.addChild(usageTxt);
// Store power meter references for updates
game.powerMeterFill = powerMeterFill;
game.powerMeterBg = powerMeterBg;
// Start ambient music
LK.playMusic('night_ambience');
powerLevel = 100;
// Office animatronic heads (hidden unless at door)
for (var i = 0; i < 32; i++) {
var headId = animatronics[i].name.toLowerCase().replace(/ /g, '_') + '_head';
// Special case for Chuck E Cheese
if (animatronics[i].name === 'Chuck E Cheese') {
headId = 'chuck_e_cheese_head';
} else if (animatronics[i].name === 'Freddy Krueger') {
headId = 'freddy_krueger_head';
} else if (animatronics[i].name === 'Testo Taylan') {
headId = 'testo_taylan_head';
} else if (animatronics[i].name === 'Jeff The Killer') {
headId = 'jeff_the_killer_head';
} else if (animatronics[i].name === 'Smile Dog') {
headId = 'smile_dog_head';
} else if (animatronics[i].name === 'Pennywise') {
headId = 'pennywise_head';
} else if (animatronics[i].name === 'Chucky') {
headId = 'chucky_head';
} else if (animatronics[i].name === 'Momo') {
headId = 'momo_head';
} else if (animatronics[i].name === 'KY kız') {
headId = 'ky_kiz_head';
} else if (animatronics[i].name === 'Among Us Red') {
headId = 'among_us_red_head';
} else if (animatronics[i].name === 'Stickman') {
headId = 'stickman_head';
} else if (animatronics[i].name === 'Cartoon Cat') {
headId = 'cartoon_cat_head';
} else if (animatronics[i].name === 'Baby Doll') {
headId = 'baby_doll_head';
} else if (animatronics[i].name === 'Phone Guy') {
headId = 'phone_guy_head';
} else if (animatronics[i].name === 'Purple Guy') {
headId = 'purple_guy_head';
} else if (animatronics[i].name === 'Testere') {
headId = 'testere_head';
} else if (animatronics[i].name === 'Çığlık') {
headId = 'ciglik_head';
} else if (animatronics[i].name === 'SCP 173') {
headId = 'scp_173_head';
} else if (animatronics[i].name === 'Siren Head') {
headId = 'siren_head_head';
} else if (animatronics[i].name === 'SCP 096') {
headId = 'scp_096_head';
} else if (animatronics[i].name === 'SpongeBob') {
headId = 'spongebob_head';
}
var head = LK.getAsset(headId, {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0
});
head.visible = false;
officeAnimatronicHeads.push(head);
game.addChild(head);
}
// Button events
leftDoorBtn.down = function (x, y, obj) {
if (powerLevel <= 0) return; // Can't use doors without power
var wasOpen = !leftDoorClosed;
leftDoorClosed = !leftDoorClosed;
// Only play sound when door goes from open to closed
if (wasOpen && leftDoorClosed) {
LK.getSound('door_sound').play();
// Add slight screen shake for impact
tween(officeBg, {
x: -10
}, {
duration: 100,
onFinish: function onFinish() {
tween(officeBg, {
x: 0
}, {
duration: 100
});
}
});
}
leftDoorPanel.visible = leftDoorClosed;
// Change button color based on door state
if (leftDoorClosed) {
tween(leftDoorBtn, {
tint: 0xff0000
}, {
duration: 200
});
} else {
tween(leftDoorBtn, {
tint: 0xffffff
}, {
duration: 200
});
}
};
rightDoorBtn.down = function (x, y, obj) {
if (powerLevel <= 0) return; // Can't use doors without power
var wasOpen = !rightDoorClosed;
rightDoorClosed = !rightDoorClosed;
// Only play sound when door goes from open to closed
if (wasOpen && rightDoorClosed) {
LK.getSound('door_sound').play();
// Add slight screen shake for impact
tween(officeBg, {
x: 10
}, {
duration: 100,
onFinish: function onFinish() {
tween(officeBg, {
x: 0
}, {
duration: 100
});
}
});
}
rightDoorPanel.visible = rightDoorClosed;
// Change button color based on door state
if (rightDoorClosed) {
tween(rightDoorBtn, {
tint: 0xff0000
}, {
duration: 200
});
} else {
tween(rightDoorBtn, {
tint: 0xffffff
}, {
duration: 200
});
}
};
leftLightBtn.down = function (x, y, obj) {
if (powerLevel <= 0) return; // Can't use lights without power
var wasOff = !leftLightOn;
leftLightOn = !leftLightOn;
// Check if any left-side animatronic is at door
var leftSideAtDoor = false;
for (var i = 0; i < animatronics.length; i++) {
var a = animatronics[i];
if ((a.name === 'Bonnie' || a.name === 'Foxy' || a.name === 'Mangle' || a.name === 'Puppet' || a.name === 'Baldi' || a.name === 'Herobrine' || a.name === 'Jeff The Killer' || a.name === 'Chucky' || a.name === 'KY kız' || a.name === 'Among Us Red' || a.name === 'Stickman' || a.name === 'Phone Guy' || a.name === 'Testere' || a.name === 'SCP 173' || a.name === 'Siren Head') && a.isAtDoor()) {
leftSideAtDoor = true;
break;
}
}
// Only play sound when light goes from off to on
if (wasOff && leftLightOn) {
if (leftSideAtDoor) {
LK.getSound('light_character_sound').play();
// Add breathing sound for tension
LK.getSound('breathing').play();
} else {
LK.getSound('light_sound').play();
}
}
// Set button color based on whether someone is at door
if (leftLightOn) {
if (leftSideAtDoor) {
tween(leftLightBtn, {
tint: 0xff0000
}, {
duration: 200
});
// Flash office for dramatic effect when character detected
LK.effects.flashScreen(0x440000, 300);
} else {
tween(leftLightBtn, {
tint: 0x00ff00
}, {
duration: 200
});
}
} else {
tween(leftLightBtn, {
tint: 0xffffff
}, {
duration: 200
});
}
};
rightLightBtn.down = function (x, y, obj) {
if (powerLevel <= 0) return; // Can't use lights without power
var wasOff = !rightLightOn;
rightLightOn = !rightLightOn;
// Check if any right-side animatronic is at door
var rightSideAtDoor = false;
for (var i = 0; i < animatronics.length; i++) {
var a = animatronics[i];
if ((a.name === 'Freddy' || a.name === 'Chica' || a.name === 'Balloon Boy' || a.name === 'Golden Freddy' || a.name === 'McDonalds Clown' || a.name === 'Chuck E Cheese' || a.name === 'Freddy Krueger' || a.name === 'Testo Taylan' || a.name === 'Smile Dog' || a.name === 'Pennywise' || a.name === 'Momo' || a.name === 'Cartoon Cat' || a.name === 'Baby Doll' || a.name === 'Purple Guy' || a.name === 'Çığlık' || a.name === 'SCP 096' || a.name === 'SpongeBob') && a.isAtDoor()) {
rightSideAtDoor = true;
break;
}
}
// Only play sound when light goes from off to on
if (wasOff && rightLightOn) {
if (rightSideAtDoor) {
LK.getSound('light_character_sound').play();
// Add breathing sound for tension
LK.getSound('breathing').play();
} else {
LK.getSound('light_sound').play();
}
}
// Set button color based on whether someone is at door
if (rightLightOn) {
if (rightSideAtDoor) {
tween(rightLightBtn, {
tint: 0xff0000
}, {
duration: 200
});
// Flash office for dramatic effect when character detected
LK.effects.flashScreen(0x440000, 300);
} else {
tween(rightLightBtn, {
tint: 0x00ff00
}, {
duration: 200
});
}
} else {
tween(rightLightBtn, {
tint: 0xffffff
}, {
duration: 200
});
}
};
camBtn.down = function (x, y, obj) {
openCamera();
};
}
// --- CAMERA VIEW ---
function openCamera() {
camOpen = true;
// Play camera sound when opening
LK.getSound('camera_sound').play();
// Hide Phone Guy skip button if active
if (phoneGuySkipBtn) {
phoneGuySkipBtn.visible = false;
}
if (phoneGuySkipTxt) {
phoneGuySkipTxt.visible = false;
}
// Hide CAM button
camBtn.visible = false;
// Create map background
mapBg = LK.getAsset('map_bg', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 900 / 2
});
game.addChild(mapBg);
// Create room representations
mapRooms = [];
mapRoomLabels = [];
mapAnimatronicHeads = [];
// Stage room
var stageRoom = LK.getAsset('room_stage', {
anchorX: 0.5,
anchorY: 0.5,
x: roomPositions['Stage'].x,
y: roomPositions['Stage'].y
});
game.addChild(stageRoom);
mapRooms.push(stageRoom);
var stageLabel = new Text2('STAGE', {
size: 30,
fill: 0xFFFFFF
});
stageLabel.anchor.set(0.5, 0.5);
stageLabel.x = roomPositions['Stage'].x;
stageLabel.y = roomPositions['Stage'].y - 90;
game.addChild(stageLabel);
mapRoomLabels.push(stageLabel);
// Left Hall room
var leftHallRoom = LK.getAsset('room_left_hall', {
anchorX: 0.5,
anchorY: 0.5,
x: roomPositions['Left Hall'].x,
y: roomPositions['Left Hall'].y
});
game.addChild(leftHallRoom);
mapRooms.push(leftHallRoom);
var leftHallLabel = new Text2('LEFT HALL', {
size: 25,
fill: 0xFFFFFF
});
leftHallLabel.anchor.set(0.5, 0.5);
leftHallLabel.x = roomPositions['Left Hall'].x;
leftHallLabel.y = roomPositions['Left Hall'].y - 70;
game.addChild(leftHallLabel);
mapRoomLabels.push(leftHallLabel);
// Right Hall room
var rightHallRoom = LK.getAsset('room_right_hall', {
anchorX: 0.5,
anchorY: 0.5,
x: roomPositions['Right Hall'].x,
y: roomPositions['Right Hall'].y
});
game.addChild(rightHallRoom);
mapRooms.push(rightHallRoom);
var rightHallLabel = new Text2('RIGHT HALL', {
size: 25,
fill: 0xFFFFFF
});
rightHallLabel.anchor.set(0.5, 0.5);
rightHallLabel.x = roomPositions['Right Hall'].x;
rightHallLabel.y = roomPositions['Right Hall'].y - 70;
game.addChild(rightHallLabel);
mapRoomLabels.push(rightHallLabel);
// Left Door room
var leftDoorRoom = LK.getAsset('room_left_door', {
anchorX: 0.5,
anchorY: 0.5,
x: roomPositions['Left Door'].x,
y: roomPositions['Left Door'].y
});
game.addChild(leftDoorRoom);
mapRooms.push(leftDoorRoom);
var leftDoorLabel = new Text2('LEFT DOOR', {
size: 20,
fill: 0xFFFFFF
});
leftDoorLabel.anchor.set(0.5, 0.5);
leftDoorLabel.x = roomPositions['Left Door'].x;
leftDoorLabel.y = roomPositions['Left Door'].y - 60;
game.addChild(leftDoorLabel);
mapRoomLabels.push(leftDoorLabel);
// Right Door room
var rightDoorRoom = LK.getAsset('room_right_door', {
anchorX: 0.5,
anchorY: 0.5,
x: roomPositions['Right Door'].x,
y: roomPositions['Right Door'].y
});
game.addChild(rightDoorRoom);
mapRooms.push(rightDoorRoom);
var rightDoorLabel = new Text2('RIGHT DOOR', {
size: 20,
fill: 0xFFFFFF
});
rightDoorLabel.anchor.set(0.5, 0.5);
rightDoorLabel.x = roomPositions['Right Door'].x;
rightDoorLabel.y = roomPositions['Right Door'].y - 60;
game.addChild(rightDoorLabel);
mapRoomLabels.push(rightDoorLabel);
// Office room (player location)
var officeRoom = LK.getAsset('office_room', {
anchorX: 0.5,
anchorY: 0.5,
x: roomPositions['Office'].x,
y: roomPositions['Office'].y
});
game.addChild(officeRoom);
mapRooms.push(officeRoom);
var officeLabel = new Text2('OFFICE (YOU)', {
size: 25,
fill: 0x00FF00
});
officeLabel.anchor.set(0.5, 0.5);
officeLabel.x = roomPositions['Office'].x;
officeLabel.y = roomPositions['Office'].y - 75;
game.addChild(officeLabel);
mapRoomLabels.push(officeLabel);
// Position animatronics on map
for (var i = 0; i < 32; i++) {
var a = animatronics[i];
if (a.aggression > 0 && a.name !== 'Phone Guy') {
var room = a.getRoom();
var roomPos = roomPositions[room];
if (roomPos) {
var headId = a.name.toLowerCase().replace(/ /g, '_') + '_head';
// Special case for Chuck E Cheese
if (a.name === 'Chuck E Cheese') {
headId = 'chuck_e_cheese_head';
} else if (a.name === 'Freddy Krueger') {
headId = 'freddy_krueger_head';
} else if (a.name === 'Testo Taylan') {
headId = 'testo_taylan_head';
} else if (a.name === 'Jeff The Killer') {
headId = 'jeff_the_killer_head';
} else if (a.name === 'Smile Dog') {
headId = 'smile_dog_head';
} else if (a.name === 'Pennywise') {
headId = 'pennywise_head';
} else if (a.name === 'Chucky') {
headId = 'chucky_head';
} else if (a.name === 'Momo') {
headId = 'momo_head';
} else if (a.name === 'KY kız') {
headId = 'ky_kiz_head';
} else if (a.name === 'Among Us Red') {
headId = 'among_us_red_head';
} else if (a.name === 'Stickman') {
headId = 'stickman_head';
} else if (a.name === 'Cartoon Cat') {
headId = 'cartoon_cat_head';
} else if (a.name === 'Baby Doll') {
headId = 'baby_doll_head';
} else if (a.name === 'Purple Guy') {
headId = 'purple_guy_head';
} else if (a.name === 'Testere') {
headId = 'testere_head';
} else if (a.name === 'Çığlık') {
headId = 'ciglik_head';
} else if (a.name === 'SCP 173') {
headId = 'scp_173_head';
} else if (a.name === 'Siren Head') {
headId = 'siren_head_head';
} else if (a.name === 'SCP 096') {
headId = 'scp_096_head';
} else if (a.name === 'SpongeBob') {
headId = 'spongebob_head';
}
// Count how many animatronics are in this room to position them properly
var animatronicsInRoom = [];
for (var j = 0; j < 32; j++) {
if (animatronics[j].aggression > 0 && animatronics[j].name !== 'Phone Guy' && animatronics[j].getRoom() === room) {
animatronicsInRoom.push(j);
}
}
var indexInRoom = animatronicsInRoom.indexOf(i);
var offsetX = (indexInRoom - (animatronicsInRoom.length - 1) / 2) * 80;
var head = LK.getAsset(headId, {
anchorX: 0.5,
anchorY: 0.5,
x: roomPos.x + offsetX,
y: roomPos.y + 20,
scaleX: 0.4,
scaleY: 0.4
});
game.addChild(head);
mapAnimatronicHeads.push({
head: head,
animatronic: a,
index: i
});
// Add animatronic name below head
var nameLabel = new Text2(a.name, {
size: 18,
fill: 0xFFFF00
});
nameLabel.anchor.set(0.5, 0.5);
nameLabel.x = roomPos.x + offsetX;
nameLabel.y = roomPos.y + 50;
game.addChild(nameLabel);
mapRoomLabels.push(nameLabel);
}
}
}
// Close camera button
camCloseBtn = LK.getAsset('cam_btn', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2,
y: 1500
});
game.addChild(camCloseBtn);
camCloseTxt = new Text2('CLOSE MAP', {
size: 50,
fill: "#fff"
});
camCloseTxt.anchor.set(0.5, 0.5);
camCloseTxt.x = 2048 / 2;
camCloseTxt.y = 1500 + 45;
game.addChild(camCloseTxt);
camCloseBtn.down = function (x, y, obj) {
closeCamera();
};
camCloseTxt.down = function (x, y, obj) {
closeCamera();
};
}
function closeCamera() {
camOpen = false;
// Play camera sound when closing
LK.getSound('camera_sound').play();
// Show Phone Guy skip button if active
if (phoneGuySkipBtn) {
phoneGuySkipBtn.visible = true;
}
if (phoneGuySkipTxt) {
phoneGuySkipTxt.visible = true;
}
// Show CAM button
camBtn.visible = true;
// Clean up map background
if (mapBg) {
mapBg.destroy();
mapBg = null;
}
// Clean up room elements
for (var i = 0; i < mapRooms.length; i++) {
if (mapRooms[i]) {
mapRooms[i].destroy();
}
}
mapRooms = [];
// Clean up room labels and animatronic names
for (var i = 0; i < mapRoomLabels.length; i++) {
if (mapRoomLabels[i]) {
mapRoomLabels[i].destroy();
}
}
mapRoomLabels = [];
// Clean up animatronic heads on map
for (var i = 0; i < mapAnimatronicHeads.length; i++) {
if (mapAnimatronicHeads[i] && mapAnimatronicHeads[i].head) {
mapAnimatronicHeads[i].head.destroy();
}
}
mapAnimatronicHeads = [];
// Clean up close button
if (camCloseBtn) {
camCloseBtn.down = null;
camCloseBtn.destroy();
camCloseBtn = null;
}
if (camCloseTxt) {
camCloseTxt.down = null;
camCloseTxt.destroy();
camCloseTxt = null;
}
}
// --- JUMPSCARE ---
function triggerJumpscare(animatronicIdx) {
jumpscareActive = true;
jumpscareAnimatronic = animatronicIdx;
jumpscareTick = LK.ticks;
gameOverReason = animatronics[animatronicIdx] ? animatronics[animatronicIdx].name + ' got you!' : 'Power ran out!';
// Stop Testo Taylan music if playing
if (animatronics[animatronicIdx].name === 'Testo Taylan' && animatronics[animatronicIdx].musicPlaying) {
LK.getSound('testo_taylan_music').stop();
animatronics[animatronicIdx].musicPlaying = false;
}
// Play jumpscare sound
if (animatronics[animatronicIdx].name === 'Golden Freddy') {
LK.getSound('golden_freddy_jumpscare').play();
} else {
LK.getSound('jumpscare').play();
}
// Show animatronic head in center, scale up
var headId = animatronics[animatronicIdx].name.toLowerCase().replace(/ /g, '_') + '_head';
// Special case for Chuck E Cheese
if (animatronics[animatronicIdx].name === 'Chuck E Cheese') {
headId = 'chuck_e_cheese_head';
} else if (animatronics[animatronicIdx].name === 'Freddy Krueger') {
headId = 'freddy_krueger_head';
} else if (animatronics[animatronicIdx].name === 'Testo Taylan') {
headId = 'testo_taylan_head';
} else if (animatronics[animatronicIdx].name === 'Jeff The Killer') {
headId = 'jeff_the_killer_head';
} else if (animatronics[animatronicIdx].name === 'Smile Dog') {
headId = 'smile_dog_head';
} else if (animatronics[animatronicIdx].name === 'Pennywise') {
headId = 'pennywise_head';
} else if (animatronics[animatronicIdx].name === 'Chucky') {
headId = 'chucky_head';
} else if (animatronics[animatronicIdx].name === 'Momo') {
headId = 'momo_head';
} else if (animatronics[animatronicIdx].name === 'KY kız') {
headId = 'ky_kiz_head';
} else if (animatronics[animatronicIdx].name === 'Among Us Red') {
headId = 'among_us_red_head';
} else if (animatronics[animatronicIdx].name === 'Stickman') {
headId = 'stickman_head';
} else if (animatronics[animatronicIdx].name === 'Cartoon Cat') {
headId = 'cartoon_cat_head';
} else if (animatronics[animatronicIdx].name === 'Baby Doll') {
headId = 'baby_doll_head';
} else if (animatronics[animatronicIdx].name === 'Phone Guy') {
headId = 'phone_guy_head';
} else if (animatronics[animatronicIdx].name === 'Purple Guy') {
headId = 'purple_guy_head';
} else if (animatronics[animatronicIdx].name === 'Testere') {
headId = 'testere_head';
} else if (animatronics[animatronicIdx].name === 'Çığlık') {
headId = 'ciglik_head';
} else if (animatronics[animatronicIdx].name === 'SCP 173') {
headId = 'scp_173_head';
} else if (animatronics[animatronicIdx].name === 'Siren Head') {
headId = 'siren_head_head';
} else if (animatronics[animatronicIdx].name === 'SCP 096') {
headId = 'scp_096_head';
} else if (animatronics[animatronicIdx].name === 'SpongeBob') {
headId = 'spongebob_head';
}
jumpscareAnim = LK.getAsset(headId, {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 900 / 2 + 300,
scaleX: 1,
scaleY: 1
});
game.addChild(jumpscareAnim);
tween(jumpscareAnim, {
scaleX: 3,
scaleY: 3
}, {
duration: 800,
easing: tween.cubicOut
});
// Flash screen red
LK.effects.flashScreen(0xff0000, 800);
// Show jumpscare text for Testo Taylan
if (animatronics[animatronicIdx].name === 'Testo Taylan') {
jumpscareText = new Text2('EV ZİYARETLENDİN!!', {
size: 120,
fill: 0xFFFFFF
});
jumpscareText.anchor.set(0.5, 1);
jumpscareText.x = 2048 / 2;
jumpscareText.y = 2732 - 100; // Position at bottom of screen
game.addChild(jumpscareText);
}
// After 1s, show game over
LK.setTimeout(function () {
if (jumpscareAnim) {
jumpscareAnim.destroy();
}
// Don't destroy jumpscareText here - keep it visible on Game Over screen
LK.showGameOver();
}, 1000);
}
// --- UPDATE LOOP ---
game.update = function () {
if (!nightStarted) {
return;
}
// Time progression: Each hour = 1 minute = 60 seconds = 3600 ticks (60 seconds * 60 ticks per second)
var ticksSinceStart = LK.ticks - nightStartTick;
var gameHours = Math.floor(ticksSinceStart / 3600); // 1 real minute = 1 game hour
var newHour = 12 + gameHours;
var newMinute = 0; // Always show :00 minutes for each hour
// Handle hour progression properly (12 AM -> 1 AM -> 2 AM -> ... -> 6 AM)
if (newHour > 12) {
newHour = newHour - 12; // Convert to AM format (13 -> 1, 14 -> 2, etc.)
}
if (newHour === 0) {
newHour = 12;
} // Ensure 12 AM shows as 12, not 0
// Cap at 6 AM
if (gameHours >= 6) {
newHour = 6;
newMinute = 0;
}
if (newHour !== hour || newMinute !== minute) {
hour = newHour;
minute = newMinute;
var ampm = 'A.M';
var hourStr = hour.toString();
var minStr = '00'; // Always show :00
timeTxt.setText(hourStr + ':' + minStr + ' ' + ampm);
}
// Strategic power consumption system
var powerUsagePercent = 0; // Base usage: 0% when nothing is active
// Count active systems
var doorsActive = 0;
var lightsActive = 0;
if (leftDoorClosed) doorsActive++;
if (rightDoorClosed) doorsActive++;
if (leftLightOn) lightsActive++;
if (rightLightOn) lightsActive++;
// Store previous power usage to detect changes
if (typeof game.previousPowerUsage === 'undefined') {
game.previousPowerUsage = 0;
}
// Calculate power usage based on active systems
if (doorsActive === 0 && lightsActive === 0 && !camOpen) {
powerUsagePercent = 0; // Nothing active: 0%
} else if (doorsActive === 1 && lightsActive === 0 && !camOpen) {
powerUsagePercent = 25; // One door: 25%
} else if (doorsActive === 0 && lightsActive === 1 && !camOpen) {
powerUsagePercent = 25; // One light: 25%
} else if (doorsActive === 2 && lightsActive === 0 && !camOpen) {
powerUsagePercent = 50; // Two doors: 50%
} else if (doorsActive === 0 && lightsActive === 2 && !camOpen) {
powerUsagePercent = 50; // Two lights: 50%
} else if (doorsActive === 1 && lightsActive === 1 && !camOpen) {
powerUsagePercent = 50; // One door + one light: 50%
} else if (doorsActive === 2 && camOpen && lightsActive === 0) {
powerUsagePercent = 55; // Two doors + camera: 55%
} else if (doorsActive === 2 && camOpen && lightsActive === 2) {
powerUsagePercent = 100; // Two doors + camera + two lights: 100%
} else {
// Handle other combinations proportionally
var baseUsage = doorsActive * 25 + lightsActive * 25;
if (camOpen) baseUsage += 5;
powerUsagePercent = Math.min(100, baseUsage);
}
// Play sound when power usage changes (degree setting sound effect)
if (powerUsagePercent !== game.previousPowerUsage) {
LK.getSound('ambient_hum').play();
game.previousPowerUsage = powerUsagePercent;
}
// Apply power drain based on usage percentage
var actualUsageRate = powerUsageRate * (powerUsagePercent / 100);
powerLevel -= actualUsageRate;
if (powerLevel < 0) powerLevel = 0;
// Update power UI
var powerPercent = Math.floor(powerLevel);
powerTxt.setText('Power: ' + powerPercent + '%');
// Update power meter visual indicator
if (game.powerMeterFill) {
var fillWidth = powerLevel / 100 * 0.8; // Scale width based on power level
game.powerMeterFill.scaleX = fillWidth;
// Change color based on power level
var fillColor = 0x00FF00; // Green
if (powerLevel <= 50) fillColor = 0xFFFF00; // Yellow
if (powerLevel <= 25) fillColor = 0xFF6600; // Orange
if (powerLevel <= 10) fillColor = 0xFF0000; // Red
tween(game.powerMeterFill, {
tint: fillColor
}, {
duration: 300
});
}
// Update top left power meter
if (game.topPowerTxt) {
var powerPercent = Math.floor(powerLevel);
game.topPowerTxt.setText(powerPercent + '%');
// Change color based on power level
var textColor = 0x00FF00; // Green
if (powerLevel <= 50) textColor = 0xFFFF00; // Yellow
if (powerLevel <= 25) textColor = 0xFF6600; // Orange
if (powerLevel <= 10) textColor = 0xFF0000; // Red
tween(game.topPowerTxt, {
tint: textColor
}, {
duration: 300
});
}
// Update top left power bar
if (game.topPowerBarFill) {
var fillWidth = powerLevel / 100 * 1.2; // Scale width based on power level
game.topPowerBarFill.scaleX = fillWidth;
// Change color based on power level
var barColor = 0x00FF00; // Green
if (powerLevel <= 50) barColor = 0xFFFF00; // Yellow
if (powerLevel <= 25) barColor = 0xFF6600; // Orange
if (powerLevel <= 10) barColor = 0xFF0000; // Red
tween(game.topPowerBarFill, {
tint: barColor
}, {
duration: 300
});
}
// Update usage display with actual percentage
var usageText = 'Usage: ' + powerUsagePercent + '%';
usageTxt.setText(usageText);
// Update usage text color based on consumption level
var usageColor = 0xFFFFFF; // White
if (powerUsagePercent >= 75) usageColor = 0xFF0000; // Red for high usage
else if (powerUsagePercent >= 50) usageColor = 0xFF6600; // Orange for medium-high usage
else if (powerUsagePercent >= 25) usageColor = 0xFFFF00; // Yellow for medium usage
else if (powerUsagePercent > 0) usageColor = 0x00FF00; // Green for low usage
tween(usageTxt, {
tint: usageColor
}, {
duration: 300
});
// Change power text color based on level
if (powerLevel > 50) {
tween(powerTxt, {
tint: 0x00ff00
}, {
duration: 200
});
} else if (powerLevel > 25) {
tween(powerTxt, {
tint: 0xffff00
}, {
duration: 200
});
} else if (powerLevel > 10) {
tween(powerTxt, {
tint: 0xFF6600
}, {
duration: 200
});
} else {
tween(powerTxt, {
tint: 0xff0000
}, {
duration: 200
});
}
// Power warnings
if (powerLevel <= 20 && powerLevel > 10 && LK.ticks - lastPowerSound > 300) {
LK.getSound('ambient_hum').play();
lastPowerSound = LK.ticks;
}
// Power outage
if (powerLevel <= 0 && !jumpscareActive) {
// Close all doors and turn off lights
leftDoorClosed = false;
rightDoorClosed = false;
leftLightOn = false;
rightLightOn = false;
camOpen = false;
leftDoorPanel.visible = false;
rightDoorPanel.visible = false;
// Reset button colors
tween(leftDoorBtn, {
tint: 0x444444
}, {
duration: 500
});
tween(rightDoorBtn, {
tint: 0x444444
}, {
duration: 500
});
tween(leftLightBtn, {
tint: 0x444444
}, {
duration: 500
});
tween(rightLightBtn, {
tint: 0x444444
}, {
duration: 500
});
tween(camBtn, {
tint: 0x444444
}, {
duration: 500
});
// Power down sound and dark screen
LK.getSound('power_down').play();
LK.effects.flashScreen(0x000000, 3000);
// Freddy's special power outage sequence
LK.setTimeout(function () {
// Play Freddy's song before jumpscare
LK.getSound('testo_taylan_music').play();
LK.setTimeout(function () {
gameOverReason = 'Power ran out!';
triggerJumpscare(0); // Trigger Freddy jumpscare
}, 5000);
}, 2000);
return;
}
// Win condition: 6 AM (requires 6 game hours * 1 real minute = 6 real minutes total)
// Prevent instant win by requiring proper game duration
if (gameHours >= 6 && !jumpscareActive) {
LK.showYouWin();
return;
}
// Music box decay and Puppet mechanics
var puppetIndex = -1;
for (var i = 0; i < animatronics.length; i++) {
if (animatronics[i].name === 'Puppet') {
puppetIndex = i;
break;
}
}
if (puppetIndex !== -1 && animatronics[puppetIndex].aggression > 0 && musicBox && musicBoxHandle && musicBoxLevelText) {
// Handle music box winding when held
if (musicBoxHeld && musicBoxLevel < 100) {
musicBoxLevel += musicBoxWindingRate;
if (musicBoxLevel > 100) {
musicBoxLevel = 100;
}
// Animate handle rotation while winding
if (LK.ticks % 10 === 0) {
// Every 10 ticks for smooth animation
tween(musicBoxHandle, {
rotation: musicBoxHandle.rotation + Math.PI / 4
}, {
duration: 200,
easing: tween.easeOut
});
}
}
// Calculate dynamic decay rate based on music box level (1-10 scale) - slowed down
var levelScale = Math.max(1, Math.min(10, Math.floor(musicBoxLevel / 10) + 1));
var dynamicDecayRate = 0.2 - (levelScale - 1) * 0.015; // Much slower: 0.2 at level 1, 0.065 at level 10
// Decay music box level
if (!musicBoxHeld) {
musicBoxLevel -= dynamicDecayRate;
}
if (musicBoxLevel < 0) {
musicBoxLevel = 0;
}
musicBoxLevelText.setText(Math.floor(musicBoxLevel).toString());
// Update music box slider visual indicator
if (game.musicBoxSliderFill) {
var fillHeight = musicBoxLevel / 100; // Height percentage based on music box level
var yOffset = (1 - fillHeight) * (400 * 2.0); // Offset from top for proper top-to-bottom decay
game.musicBoxSliderFill.scaleY = fillHeight * 2.0; // Scale height based on level
game.musicBoxSliderFill.y = 280 + yOffset; // Position so it decays from top
// Change color based on music box level
var sliderColor = 0x00FF00; // Green
if (musicBoxLevel <= 50) sliderColor = 0xFFFF00; // Yellow
if (musicBoxLevel <= 25) sliderColor = 0xFF6600; // Orange
if (musicBoxLevel <= 10) sliderColor = 0xFF0000; // Red
tween(game.musicBoxSliderFill, {
tint: sliderColor
}, {
duration: 300
});
}
// Trigger Puppet jumpscare when music box reaches 0
if (musicBoxLevel <= 0 && !jumpscareActive) {
triggerJumpscare(puppetIndex);
return;
}
}
// Difficulty scaling - animatronics get more aggressive as night progresses (faster with 1-minute hours)
var difficultyMultiplier = 1 + gameHours * 0.3;
// Animatronic AI
for (var i = 0; i < animatronics.length; i++) {
var a = animatronics[i];
// Apply difficulty scaling
if (a.aggression > 0) {
var originalInterval = a.moveInterval;
a.moveInterval = Math.max(20, originalInterval / difficultyMultiplier);
}
a.tryMove();
// Restore original interval
if (a.aggression > 0) {
a.moveInterval = originalInterval;
}
}
// Ambient sound management
if (!ambientSoundPlaying && !camOpen && Math.random() < 0.001) {
LK.getSound('ambient_hum').play();
ambientSoundPlaying = true;
LK.setTimeout(function () {
ambientSoundPlaying = false;
}, 3000);
}
// Pennywise special balloon mechanic
var pennywiseIndex = -1;
for (var i = 0; i < animatronics.length; i++) {
if (animatronics[i].name === 'Pennywise') {
pennywiseIndex = i;
break;
}
}
if (pennywiseIndex !== -1 && animatronics[pennywiseIndex].aggression > 0) {
// Check if Pennywise is at door and no balloon is active
if (animatronics[pennywiseIndex].isAtDoor() && !pennywiseBalloon && !jumpscareActive) {
// Spawn red balloon in office
pennywiseBalloon = LK.getAsset('red_balloon', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1000
});
game.addChild(pennywiseBalloon);
balloonSpawnTick = LK.ticks;
balloonClickDeadline = LK.ticks + 600; // 10 seconds at 60 FPS
balloonClicked = false;
// Animate balloon floating slightly
tween(pennywiseBalloon, {
y: 950
}, {
duration: 2000,
easing: tween.easeInOut
});
// Add click handler to balloon
pennywiseBalloon.down = function (x, y, obj) {
if (pennywiseBalloon) {
balloonClicked = true;
// Animate balloon popping/shrinking
tween(pennywiseBalloon, {
scaleX: 0,
scaleY: 0,
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
if (pennywiseBalloon) {
pennywiseBalloon.destroy();
pennywiseBalloon = null;
}
}
});
// Reset Pennywise to start position
animatronics[pennywiseIndex].position = 0;
animatronics[pennywiseIndex].waitingAtDoor = false;
animatronics[pennywiseIndex].returningToStart = true;
animatronics[pennywiseIndex].returnedToStartTick = LK.ticks;
}
};
}
// Check if balloon deadline passed without clicking
if (pennywiseBalloon && LK.ticks >= balloonClickDeadline && !balloonClicked) {
// Trigger Pennywise jumpscare
if (pennywiseBalloon) {
pennywiseBalloon.destroy();
pennywiseBalloon = null;
}
triggerJumpscare(pennywiseIndex);
return;
}
}
// Office animatronic heads (show if at door and light/door open)
for (var i = 0; i < 32; i++) {
var a = animatronics[i];
var head = officeAnimatronicHeads[i];
if (!head) {
continue;
}
if (a.isAtDoor()) {
if ((a.name === 'Bonnie' || a.name === 'Foxy' || a.name === 'Mangle' || a.name === 'Puppet' || a.name === 'Baldi' || a.name === 'Herobrine' || a.name === 'Jeff The Killer' || a.name === 'Chucky' || a.name === 'KY kız' || a.name === 'Among Us Red' || a.name === 'Stickman' || a.name === 'Phone Guy' || a.name === 'Testere' || a.name === 'SCP 173' || a.name === 'Siren Head') && leftLightOn && !leftDoorClosed) {
// Left side characters (including new ones)
head.x = 180;
head.y = 900;
head.visible = true;
} else if ((a.name === 'Freddy' || a.name === 'Chica' || a.name === 'Balloon Boy' || a.name === 'Golden Freddy' || a.name === 'McDonalds Clown' || a.name === 'Chuck E Cheese' || a.name === 'Freddy Krueger' || a.name === 'Testo Taylan' || a.name === 'Smile Dog' || a.name === 'Pennywise' || a.name === 'Momo' || a.name === 'Cartoon Cat' || a.name === 'Baby Doll' || a.name === 'Purple Guy' || a.name === 'Çığlık' || a.name === 'SCP 096' || a.name === 'SpongeBob') && rightLightOn && !rightDoorClosed) {
// Right side characters (including new ones)
head.x = 2048 - 180;
head.y = 900;
head.visible = true;
} else {
head.visible = false;
}
} else {
head.visible = false;
}
}
// Tension building - subtle screen effects when animatronics are nearby
var nearbyThreat = false;
for (var i = 0; i < animatronics.length; i++) {
var a = animatronics[i];
if (a.aggression > 0 && a.position >= 1) {
nearbyThreat = true;
break;
}
}
// Apply subtle visual effects based on threat level
if (nearbyThreat && !camOpen && Math.random() < 0.002) {
// Slight office shake for tension
var shakeAmount = Math.random() * 5 - 2.5;
tween(officeBg, {
x: shakeAmount
}, {
duration: 100,
onFinish: function onFinish() {
tween(officeBg, {
x: 0
}, {
duration: 100
});
}
});
}
// Jumpscare check
if (!jumpscareActive) {
for (var i = 0; i < animatronics.length; i++) {
var a = animatronics[i];
// Skip Pennywise from immediate jumpscare (he uses balloon mechanic)
if (a.name === 'Pennywise') {
continue;
}
// Skip Phone Guy from immediate jumpscare (he only calls to distract)
if (a.name === 'Phone Guy') {
continue;
}
if (a.isAtDoor() && !a.waitingAtDoor) {
// Pre-jumpscare warning sound
if (Math.random() < 0.1) {
LK.getSound('breathing').play();
}
if ((a.name === 'Bonnie' || a.name === 'Foxy' || a.name === 'Mangle' || a.name === 'Puppet' || a.name === 'Baldi' || a.name === 'Herobrine' || a.name === 'Jeff The Killer' || a.name === 'Chucky' || a.name === 'KY kız' || a.name === 'Among Us Red' || a.name === 'Stickman' || a.name === 'Phone Guy' || a.name === 'Testere' || a.name === 'SCP 173' || a.name === 'Siren Head') && !leftDoorClosed) {
// Left side characters (including new ones)
triggerJumpscare(i);
return;
} else if ((a.name === 'Freddy' || a.name === 'Chica' || a.name === 'Balloon Boy' || a.name === 'Golden Freddy' || a.name === 'McDonalds Clown' || a.name === 'Chuck E Cheese' || a.name === 'Freddy Krueger' || a.name === 'Testo Taylan' || a.name === 'Smile Dog' || a.name === 'Pennywise' || a.name === 'Momo' || a.name === 'Cartoon Cat' || a.name === 'Baby Doll' || a.name === 'Purple Guy' || a.name === 'Çığlık' || a.name === 'SCP 096' || a.name === 'SpongeBob') && !rightDoorClosed) {
// Right side characters (including new ones)
triggerJumpscare(i);
return;
}
}
}
}
// Phone Guy call mechanics
var phoneGuyIndex = -1;
for (var i = 0; i < animatronics.length; i++) {
if (animatronics[i].name === 'Phone Guy') {
phoneGuyIndex = i;
break;
}
}
if (phoneGuyIndex !== -1 && animatronics[phoneGuyIndex].aggression > 0) {
// Check if it's time for Phone Guy to call and no call is currently active
if (!phoneGuyCallActive && LK.ticks - phoneGuyLastCallTick >= phoneGuyCallInterval && !LK.getSound('phone_sound').playing) {
phoneGuyCallActive = true;
phoneGuyLastCallTick = LK.ticks;
// Play phone sound
LK.getSound('phone_sound').play();
// Create skip button only if camera is not open
if (!camOpen) {
phoneGuySkipBtn = LK.getAsset('skip_btn', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 200
});
game.addChild(phoneGuySkipBtn);
// Add pulsing animation to skip button
if (phoneGuySkipBtn) {
tween(phoneGuySkipBtn, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (phoneGuySkipBtn) {
tween(phoneGuySkipBtn, {
scaleX: 1,
scaleY: 1
}, {
duration: 500,
easing: tween.easeInOut
});
}
}
});
}
phoneGuySkipTxt = new Text2('SKIP CALL', {
size: 40,
fill: "#fff"
});
phoneGuySkipTxt.anchor.set(0.5, 0.5);
phoneGuySkipTxt.x = 2048 / 2;
phoneGuySkipTxt.y = 200;
game.addChild(phoneGuySkipTxt);
// Add click handlers for skip button
phoneGuySkipBtn.down = function (x, y, obj) {
if (phoneGuyCallActive) {
// Stop the phone sound
LK.getSound('phone_sound').stop();
phoneGuyCallActive = false;
// Calculate next call interval based on aggression (shorter after skip)
var aggression = animatronics[phoneGuyIndex].aggression;
phoneGuyCallInterval = Math.max(300, 1800 - aggression * 150); // 30 seconds at 0, 5 seconds at 10
phoneGuyLastCallTick = LK.ticks;
// Remove skip button
if (phoneGuySkipBtn) {
phoneGuySkipBtn.destroy();
phoneGuySkipBtn = null;
}
if (phoneGuySkipTxt) {
phoneGuySkipTxt.destroy();
phoneGuySkipTxt = null;
}
}
};
phoneGuySkipTxt.down = phoneGuySkipBtn.down;
}
}
// Check if phone sound finished naturally
if (phoneGuyCallActive && !LK.getSound('phone_sound').playing) {
phoneGuyCallActive = false;
// Calculate next call interval based on aggression
var aggression = animatronics[phoneGuyIndex].aggression;
phoneGuyCallInterval = Math.max(600, 3600 - aggression * 300); // 1 minute at 0, 10 seconds at 10
phoneGuyLastCallTick = LK.ticks;
// Remove skip button if still exists
if (phoneGuySkipBtn) {
phoneGuySkipBtn.destroy();
phoneGuySkipBtn = null;
}
if (phoneGuySkipTxt) {
phoneGuySkipTxt.destroy();
phoneGuySkipTxt = null;
}
}
}
// Camera view update - animate animatronic movement on map
if (camOpen) {
for (var i = 0; i < mapAnimatronicHeads.length; i++) {
var mapEntry = mapAnimatronicHeads[i];
if (mapEntry && mapEntry.animatronic && mapEntry.animatronic.name !== 'Phone Guy') {
var currentRoom = mapEntry.animatronic.getRoom();
var roomPos = roomPositions[currentRoom];
if (roomPos) {
// Count animatronics in current room for positioning
var animatronicsInRoom = [];
for (var j = 0; j < 32; j++) {
if (animatronics[j].aggression > 0 && animatronics[j].name !== 'Phone Guy' && animatronics[j].getRoom() === currentRoom) {
animatronicsInRoom.push(j);
}
}
var indexInRoom = animatronicsInRoom.indexOf(mapEntry.index);
var offsetX = (indexInRoom - (animatronicsInRoom.length - 1) / 2) * 80;
var targetX = roomPos.x + offsetX;
var targetY = roomPos.y + 20;
// Animate movement to new position if different
if (Math.abs(mapEntry.head.x - targetX) > 5 || Math.abs(mapEntry.head.y - targetY) > 5) {
tween(mapEntry.head, {
x: targetX,
y: targetY
}, {
duration: 500,
easing: tween.easeOut
});
}
}
}
}
}
};
// --- TOUCH HANDLING ---
game.move = function (x, y, obj) {
// No slider move handling needed
};
game.down = function (x, y, obj) {
// No slider down handling needed
};
game.up = function (x, y, obj) {
// No slider up handling needed
};
// --- INIT ---
setupCustomNightMenu();
Bonnie head. In-Game asset. 2d. High contrast. No shadows
scary chica head. In-Game asset. 2d. High contrast. No shadows
foxy head. In-Game asset. 2d. High contrast. No shadows
freddy head. In-Game asset. 2d. High contrast. No shadows
balloon boy head. In-Game asset. 2d. High contrast. No shadows
golden freddy head. In-Game asset. 2d. High contrast. No shadows
mangle head. In-Game asset. 2d. High contrast. No shadows
puppet FNAF head. In-Game asset. 2d. High contrast. No shadows
chuck e cheese head. In-Game asset. 2d. High contrast. No shadows
herobrine_head. In-Game asset. 2d. High contrast. No shadows
scary baldi face. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
mcdonalds clown scary head. In-Game asset. 2d. High contrast. No shadows
freddy krueger scary head. In-Game asset. 2d. High contrast. No shadows
jeff the killer scary head. In-Game asset. 2d. High contrast. No shadows
The image displays a highly disturbing and unsettling close-up of what appears to be a dog's head, heavily distorted and manipulated to create a horrific effect. The most striking feature is the dog's mouth, stretched into an impossibly wide and menacing grin that reveals numerous sharp, human-like teeth. Its eyes are wide open, round, and blank white or glowing, contributing to an overall vacant and soulless stare. The fur around its face and head is colored in aggressive shades of red and dark brown, giving it a bloodied or demonic appearance. The overall impression is that of a creature from a horror story, designed to evoke fear and discomfort. The background is completely black, isolating the terrifying subject and intensifying its impact.. In-Game asset. 2d. High contrast. No shadows
The image depicts a strange, humanoid creature with an unusual and unsettling appearance. It has a small, elongated head with a pointed nose and large, dark eyes that seem to bulge slightly. The creature has sparse, dark hair on its head, which appears messy and uneven. Its body is thin and frail, covered with patchy, coarse hair across its back and sides. The creature is crouched on all fours, with long, thin arms and legs that bend awkwardly. Its skin looks pale and wrinkled, and it has a hunched posture, as if it is crawling or moving slowly.. In-Game asset. 2d. High contrast. No shadows
momo head. In-Game asset. 2d. High contrast. No shadows
chucky head. In-Game asset. 2d. High contrast. No shadows
pennywise head. In-Game asset. 2d. High contrast. No shadows
Red Balloon. In-Game asset. 2d. High contrast. No shadows
It has a purple ribbon and ribbons on a blue gift box. In-Game asset. 2d. High contrast. No shadows
The red color in the game Among us creates the character in an extremely scary way, the glass of the astronaut suit is broken, his eyes are white, his mouth is so long that it touches his ears when he smiles, and he has a bloody knife in his hand.. In-Game asset. 2d. High contrast. No shadows
one scary porcelain doll. It is clear from the whiteness of his skin that he has been standing there for years, one eye is completely closed and one eye is open but he has no eyes (jet black). She has suffered blows for years, fractures and burns on her head, and her beautiful dress is covered with cobwebs.. In-Game asset. 2d. High contrast. No shadows
the scary cartoon cat. In-Game asset. 2d. High contrast. No shadows
scary stickman. In-Game asset. 2d. High contrast. No shadows
scream (horror movie) face. In-Game asset. 2d. High contrast. No shadows
old phone. In-Game asset. 2d. High contrast. No shadows
a madman wearing a purple security suit. He looks frightening, you can tell he's crazy by the glazed look in his eyes. he's just smiling with a knife in his hand, but in the glazed look in his eyes there's a little cry for help. In-Game asset. 2d. High contrast. No shadows
saw( movie charakter). In-Game asset. 2d. High contrast. No shadows
scp 096 head. In-Game asset. 2d. High contrast. No shadows
scp 173 head. In-Game asset. 2d. High contrast. No shadows
siren head. In-Game asset. 2d. High contrast. No shadows
scary sponge bob. In-Game asset. 2d. High contrast. No shadows
jumpscare
Sound effect
foxy_move
Sound effect
testo_taylan_music
Sound effect
freddy_nose_honk
Sound effect
music_box
Sound effect
door_sound
Sound effect
light_sound
Sound effect
light_character_sound
Sound effect
camera_sound
Sound effect
phone_sound
Sound effect
ambient_hum
Sound effect
power_down
Sound effect
footstep
Sound effect
night_ambience
Music
breathing
Sound effect
golden_freddy_jumpscare
Sound effect