User prompt
"Anlık Tepki Sistemi" Ekleyin Seçim yapıldığında, sahne değişmeden önce karakterin yüzüne veya repliğine bağlı olarak küçük bir "popup tepkisi" (örneğin Mike'ın yüz ifadesi değişir ya da iç sesi belirir) göster. Bu, oyuncuya kararının hemen bir etkisi olduğunu hissettirir.
User prompt
"Bilinmeyen Seçim" Sistemi Kur Bazı seçimlerin içeriği başlangıçta “???” olarak gizlensin. Ancak oyuncunun "honest" veya "betray" barı belirli bir seviyeye ulaştığında bu seçenek görünür hale gelsin. Bu sayede barların sadece sonuç değil, bilgi erişimi üstünde de etkisi olur.
User prompt
O aki soru kiminle alakalı ise Yukarıda Mike'ın assetinin yanına o karakteri de koy
User prompt
Bar Kırılımına Göre Animasyonlu Game Over Ekranı Yap: Örneğin, betray barı 100 olursa Mike gözaltına alınıyor, lust barı 0 olursa Lisa uzaklaşıyor gibi. Bunları sadece metinle değil, portre değişimi ve kısa animasyonlarla (fade-out, çarpı işareti vb.) sun.
User prompt
Peter ve Alex için de yap aynısını
User prompt
Duygu Durumu Göstergeleri Yerleştir: Her sahnede portreyle birlikte Lisa, Rebecca ya da Mike’ın yüz ifadesini göstermek için "mood": "angry" gibi bir alan tanımla. Bu alan, portre resmini veya arka plan rengini belirlesin. Böylece görsel duygu aktarımı sağlanır.
User prompt
‘İlişki Çaprazlama’ Mekanizması Ekle: Örneğin, Lisa’yla samimiyet kurdukça Rebecca kıskanıp ilişki barını düşürsün. Bu gibi çapraz etkileşimleri applyCrossEffects() fonksiyonunda tanımlayarak barların dinamik bir yapıya kavuşmasını sağla.
User prompt
Zamana Bağlı Tetikleyiciler Tanımla: Oyunun toplam süresini ya da kaç seçim yapıldığını sayan turnCount gibi bir sayaç ekle. Örneğin if (turnCount > 15 && bars.lust.value > 60) özel bir rüya sahnesi başlasın. Bu, oyuncuyu zamana karşı strateji kurmaya zorlar.
User prompt
“Memory” Mekaniği Getir: state.pastChoices gibi bir array’e önemli kararları (örneğin Lisa’yı öpmek, Rebecca’ya yalan söylemek) ekle. Gelecek sahnelerde bu kararlar okunarak farklı metinler sunulsun. Bu sistem, oyuncuya seçimlerinin hatırlandığını ve yankılandığını hissettirecek.
User prompt
Seçeneklere ‘yalan/doğru’ gibi gizli etiketler ekle: Seçeneklere örneğin meta: { type: "lie" } ekle. Bu bilgilerle oyuncunun sürekli yalan söylemesi durumunda honest barı kademeli düşsün. Seçeneklerdeki metinle bar etkisi arasında dolaylı ilişki kurarak oyuna derinlik kat.
User prompt
Bar Bazlı “Flag” Sistemi Kur: Bazı bar eşiklerine ulaşıldığında flags objesine bayrak ekle. Örneğin if (bars.betray.value >= 80) flags["betrayalUnlocked"] = true;. Bunlar ileride özel sahneleri veya sonları tetiklemek için kullanılabilir.
User prompt
Please fix the bug: 'characterLabels is not defined' in or related to this line: 'for (var i = 0; i < characterLabels.length; i++) {' Line Number: 883
User prompt
Bardaki Değer Artışına Göre Sahne Çoğalt: Tek bir StoryNode yerine, aynı durumun 3 versiyonunu yaz (örneğin: düşük, orta, yüksek ilişki durumlarında Lisa'nın tepkisi farklı). getNextNode() fonksiyonu bu versiyonlardan hangisinin gösterileceğini bardaki değere göre belirlesin. (e.g. if (bars.lisa.value > 80) return node.idHappyLisa;)
User prompt
Bar Bazlı Diyalog Kilitleme Sistemi Kur: Her StoryNode’a opsiyonel olarak bir requirements alanı ekle. Örneğin, requirements: { honest: 30, lisa: 50 } gibi. Eğer bu koşullar sağlanmıyorsa seçenek gizlensin ya da disabled: true olarak işaretlenip gri tonla gösterilsin. Oyuncu seçim yaparken barlarının doğrudan sonuç doğurduğunu görmeli.
User prompt
Please fix the bug: 'rel_lisa is not defined' in or related to this line: 'var chars = [{' Line Number: 726
User prompt
Bar Sistemini Karakter Bazında Ayır: Her barı belirli bir karaktere (Lisa, Rebecca, Alex vs.) bağla. Bu karakterlerin ilişkisel barlarını ayrı ayrı RelationshipBar nesneleri olarak tanımla ve effects: { lisa: 10 } gibi tanımlarda hangi barın artacağını veya azalacağını kesin biçimde kontrol et. Gerekirse bars["lisa"].setValue(...) gibi bir sistem kur.
User prompt
Sorular random ilerlesin. Aynı şeyi sorup duruyor. Çok çeşitli olsun sorular ve hep iki şık olsun. Ona göre ilerlesin hikaye
User prompt
Barlar 50 ile başlasın. yüzde 1 insin ya da çıksın sadece. Oyun hemen bitmesin. Random sorulara devam etsin. Barların yanında ne barı oldukları yazsın. Ayrıca dört karakteri assetleri ile beraber en altta göster ve ilişki derecelerini yaz.
Code edit (1 edits merged)
Please save this source code
User prompt
Mike’ın Yolu — Hikâye Tabanlı 2D Karar Oyunu
Initial prompt
Mike'ın Yolu — Hikâye Tabanlı 2D Karar Oyunu "Mike’ın Yolu", oyuncuyu bir adamın içsel çatışmaları, sosyal ilişkileri ve ahlaki seçimleri arasında geçen karmaşık bir yaşam yolculuğuna davet eden 2D hikâye tabanlı bir oyun. Bu oyun; evliliğin kırılganlığı, dostlukların dayanıklılığı, iş hayatının baskısı ve bireysel dürtüler gibi insana dair tüm yönleri sorgulamanı sağlayan bir yapıya sahip. Oyuncu, karakterimiz Mike’ın yerine geçerek her gün gelen sorulara iki seçenekten birini seçer. Bu seçimler Mike’ın yalnızca çevresiyle olan ilişkilerini değil, kendi iç dünyasını da etkiler. Oyunun temelini, değişen ilişki ve kişisel değer barları oluşturur. Bu barlar üzerinden oyuncu hem insanlarla olan bağlarını sürdürmeye hem de ruhsal dengesini korumaya çalışır. Ana Karakter: Mike Mike, büyük şehirde sıradan bir yaşam süren bir ofis çalışanıdır. Yüzeyde her şey yolunda gibi görünse de içten içe çelişkilerle doludur. Günlük yaşamın rutinine sıkışmış, ilişkileri sınanmaya açık bir noktadadır. Evli, çalışıyor, sosyal çevresi var gibi görünüyor ama bir sabah kalktığında bazı seçimlerin ertelenemeyecek kadar yaklaştığını fark eder. Oyuncunun kontrol ettiği Mike, artık hayatına yön veren seçimleri yapmaya başlamak zorundadır. Karakterler ve İlişki Sistemleri Mike’ın hayatındaki dört önemli karakterle olan ilişkisi, oyun boyunca vereceği kararlarla şekillenir. Her bir karakterin Mike ile bir ilişki barı bulunur. Bu barlar 0 ile 100 arasında değişir ve başlangıç noktası olarak her biri 50’den başlar. Bar %0’a düştüğünde, o kişi Mike’ın hayatından çıkar; bu da hikâyenin dramatik kırılma anlarına sebep olur. İlk karakter Lisa’dır. Lisa, Mike’ın eşi. Onunla olan ilişki duygusal bağlılık, sadakat ve empati üzerinden yürür. Mike, Lisa’yla ilgilendiği, onu önemsediği ve dürüst davrandığı sürece ilişki barı yükselir. İhmal, yalan ya da aldatma ise bu ilişkiyi zedeler. İkinci karakter Rebecca’dır. Rebecca, Mike’ın iş yerinden yakın bir arkadaşıdır. Aralarındaki ilişki hem dostça hem de kimi zaman flört etmeye açık sınırda bir gerilim taşır. Rebecca ile olan seçimler Mike’ın sadakati ile arzuları arasında gidip gelmesine sebep olur. Peter, Mike’ın çocukluk arkadaşıdır. Onlarla geçirilen eski günler, nostaljik anılar ve bugünkü bağların ne kadar sağlam kaldığı Peter ile olan ilişkiyi şekillendirir. Samimiyet, sadakat ve geçmişe olan bağlılık bu bağı ayakta tutar. Onu ihmal etmek veya yalan söylemek, yılların dostluğunu bir anda bitirebilir. Son olarak Alex, Mike’ın patronudur. Bu ilişki daha çok disiplin, iş etiği ve kariyerle ilgilidir. İşini iyi yapar, sorumluluklarını yerine getirirse Alex ile olan ilişkisi güçlenir. Ancak işe karşı ilgisizlik veya dürüst olmayan davranışlar Mike’ın işten atılmasına bile sebep olabilir. Kişisel Barlar: İçsel Dengenin Ölçüsü Mike’ın yalnızca sosyal ilişkileri değil, iç dünyası da sürekli bir değişim halindedir. Oyunda dört adet kişisel bar vardır: Mutluluk, Dürüstlük, Şehvet ve İhanet. Her biri 0 ile 100 arasında değişir ve başlangıçta 50 seviyesindedir. Oyuncunun verdiği her karar, bu barlardan bir ya da birkaçını etkiler. Mutluluk barı, Mike’ın yaşam doyumu ve psikolojik dayanıklılığını gösterir. Lisa’yla iyi zamanlar geçirmek, dostlarıyla görüşmek ya da hayırsever davranışlarda bulunmak bu barı yükseltir. İş stresi, tartışmalar ya da ilgisizlik ise mutluluğunu azaltır. Bar sıfırlandığında Mike hayatın anlamını sorgular hale gelir ve “şehir seni mutlu edemedi” diyerek her şeyi bırakıp kendini inzivaya çeker. Dürüstlük barı, Mike’ın doğruluk ve içsel bütünlük derecesini ölçer. Yalan söylemek, gerçekleri gizlemek, manipülasyon bu barı düşürür. Açık sözlü olmak, hataları kabul etmek ve dürüst kalmak ise bu barı yükseltir. Bar sıfıra indiğinde Mike artık aynada kendisini bile tanıyamaz hale gelir ve herkes ondan uzaklaşır. Şehvet barı, Mike’ın tutkularını ve yaşam enerjisini simgeler. Flört, romantizm, fiziksel temas gibi olaylar bu barı yükseltir. Monotonluk, ilgisizlik ya da bastırılmış duygular ise bu barı düşürür. Şehvet barı sıfıra ulaştığında Mike, hayattan zevk alamayan biri olur. İhanet barı, Mike’ın güvensizlik ve sadakatsizlik oranını yansıtır. Aldatma, gizli işler ve ikili oyunlar bu barı artırır. Bar %100’e ulaştığında, Mike’ın çevresindeki herkes onu terk eder. Tüm köprüler yanar ve oyun, dramatik bir yalnızlık sahnesiyle sonlanır. Seçimler ve Etkileri: Her Soru Bir Yol Ayrımı Oyunun kalbinde, her gün Mike’a yöneltilen bir olay ya da soru yer alır. Oyuncuya iki seçenek sunulur. Bu seçenekler hem ilişkileri hem de kişisel barları etkiler. Seçimlerin etkisi bazen hemen görülür, bazen uzun vadede belirginleşir. Örneğin Lisa’nın hazırladığı yemeğe iltifat etmek küçük ama olumlu bir etki yaratırken, Rebecca ile ofiste samimi bir an yaşamak daha karmaşık etkiler doğurabilir. Her karar zincirleme sonuçlara yol açar. Oyunda toplamda en az 50 farklı soru ve olay bulunur. Bunlar Lisa ile tartışmalar, Rebecca ile flört sınırındaki anlar, Peter’la eski defterlerin açılması, Alex’in baskıcı istekleri ya da sokakta karşılaşılan bir evsize verilen tepki gibi geniş bir yelpazeye sahiptir. Sorular yalnızca insanlar üzerinden değil, bazen Mike’ın kişisel iç sesinden de gelir: "Bugün gerçeği söylemeli miyim?", "Bunu hak edecek biri miyim?" gibi. Böylece oyun yalnızca dış dünyaya karşı değil, Mike’ın kendi iç dünyasına karşı da bir mücadele haline gelir. Barlar Sıfırlandığında Ne Olur? Oyun boyunca barların dengeli kalması çok önemlidir. Herhangi bir barın sıfır seviyeye düşmesi, oyunun orada sonlanmasına sebep olur. Ama bu sıradan bir “game over” ekranı değildir. Her barın sıfırlanmasına özel hazırlanmış farklı sonlar vardır. Örneğin mutluluk barı sıfırlandığında, Mike artık bu şehir hayatında anlam bulamaz ve eşyalarını toplayıp hiçbir şey söylemeden uzaklara gider. Dürüstlük barı sıfırlandığında, çevresinde kimse kalmaz, her ilişkisi dağılmıştır ve Mike aynadaki yansımasına bile güvenemez. Şehvet sıfırlandığında hayatı renksizleşir; İhanet %100 olduğunda ise Lisa, Peter ve Rebecca’dan aynı anda veda mesajları alır ve yapayalnız kalır. Çoklu Sonlar: Hangi Mike Olacaksın? Oyun yalnızca tek bir sonla bitmez. Mike’ın ilişkileri ve barlarının birleşimiyle birçok farklı son oluşur. Eğer Lisa ile ilişkisi güçlü, dürüstlük barı yüksek ve ihanet oranı düşükse oyun mutlu bir aile sonuyla biter. Rebecca ile yüksek bir ilişki, şehvet ve ihanetin tavan yaptığı bir durum ise Mike’ın evliliğini bitirip yeni bir aşka yelken açmasına sebep olur. Peter ile yüksek bir dostluk ise geçmişe dönük duygusal bir bağ kurar. Tüm barların ve ilişkilerin düşük olduğu karanlık son ise tam bir yalnızlık ve içsel çöküştür. Oynanış Döngüsü ve Teknik Yapı Oyun portre modunda 2D bir görsel roman tarzında tasarlanır. Günde üç aşamadan oluşur: sabah sahnesi (iç ses veya partnerle), öğlen sahnesi (iş veya sosyal karakterlerle), akşam sahnesi (kararların içselleştirilmesi). Oynanış sırasında hem karakterlerin konuşmaları hem de Mike’ın iç sesi ekranda görünür. Oyuncu seçim yaptıkça barlar güncellenir ve ekranın kenarındaki bar göstergeleri değişir. Oyunun veri yapısı, barları ve karakter ilişkilerini JSON dosyalarında saklar. Manuel ve otomatik kayıt sistemiyle oyuncu istediği yerden devam edebilir. Mike’ın Yolu — Detaylı Oyun Tasarımı ve Hikâye Anlatımı Oyun Dünyası ve Teması “Mike’ın Yolu”, büyük şehirde yaşayan sıradan bir adamın, Mike’ın hayatındaki kararlarla şekillenen bir yolculuğudur. Oyun, oyuncuya Mike’ın iç dünyasındaki çatışmaları ve çevresiyle olan ilişkilerini çok katmanlı bir şekilde deneyimletir. Hikaye, sıradan hayatın içinde sıkışan bir adamın seçimleri üzerinden ilerler; bu seçimler bazen çok küçük, bazen hayatı tamamen değiştirecek kadar büyük olur. Oyuncunun her seçimi, Mike’ın ilişki barlarını ve kişisel değerlerini değiştirir, farklı sonuçlar doğurur. Karakterler ve Kişilikleri Mike: Ana karakterimiz, 30’larında, sıradan bir ofis çalışanı. Evli, sosyal ama zaman zaman hayattan bezmiş biri. İçsel çatışmaları ve bastırdığı duyguları var. Lisa: Mike’ın eşi. Evine ve Mike’a bağlı, ama aynı zamanda onun davranışlarına karşı hassas. Dürüstlük ve sadakat onun için çok önemli. Rebecca: İş yerinden yakın bir arkadaş. Samimi, zeki ama flörtöz. Mike’ın hayatına çekici ama riskli bir unsur olarak giriyor. Peter: Çocukluk arkadaşı. Sadık, espri yeteneği yüksek ve geçmişten gelen bağları çok kuvvetli. Alex: Mike’ın patronu. Sert, disiplinli ve iş odaklı. Mike’ın kariyerini yakından takip ediyor. Barlar ve Etkileri Lisa İlişki Barı (Başlangıç: 50) Rebecca İlişki Barı (Başlangıç: 50) Peter İlişki Barı (Başlangıç: 50) Alex İlişki Barı (Başlangıç: 50) Mutluluk Barı (Başlangıç: 50) Dürüstlük Barı (Başlangıç: 50) Şehvet Barı (Başlangıç: 50) İhanet Barı (Başlangıç: 50) Oyun Mekaniği Oyuncuya gün içinde farklı zamanlarda toplam 50 karar sorulur. Her karar için iki seçenek vardır. Seçilen seçenekler hem belirli karakterlerin ilişki barlarını hem de kişisel barları etkiler. Bazı seçenekler birden fazla barı değiştirir. Örneğin Lisa ile yapılan bir konuşmada dürüstlük barı artarken, şehvet barı düşebilir. Ya da Rebecca ile samimi bir an, ihanet barını yükseltebilir. Her bar sıfıra indiğinde oyun o anda özel olarak yazılmış bir sonla biter. 50 Örnek Karar ve Seçenekler 1. Sabah Lisa kahvaltı hazırlamış, Mike ona ne der? A) “Çok güzel olmuş, teşekkür ederim.” Lisa barı +5, Mutluluk +3 B) “Yine mi aynı şey, biraz değişiklik yap.” Lisa barı -7, Mutluluk -2 2. İşe giderken Rebecca mesaj attı, ne yanıt verirsin? A) “Günaydın, öğle arasında buluşalım mı?” Rebecca barı +5, Şehvet +4, İhanet +3 B) “Şu an yoğunum, sonra konuşuruz.” Rebecca barı -3, Dürüstlük +2 3. Patron Alex, seni sert bir şekilde eleştirdi. Nasıl tepki verirsin? A) “Haklısınız, daha dikkatli olacağım.” Alex barı +5, Dürüstlük +4, Mutluluk -2 B) “Bana fazla yükleniyorsunuz, adil değil.” Alex barı -7, Mutluluk -3 4. Peter’la eski günlerden bahsederken o zor durumda olduğunu söylüyor. Ne yaparsın? A) “Yanındayım, neye ihtiyacın varsa söyle.” Peter barı +6, Mutluluk +3 B) “Kendi işimle meşgulüm, üzgünüm.” Peter barı -5, Mutluluk -2 5. Lisa seninle dürüstçe konuşmak istiyor, ne yaparsın? A) “Tabii, ne söylemek istiyorsan dinliyorum.” Lisa barı +7, Dürüstlük +6 B) “Bunları konuşmak istemiyorum.” Lisa barı -8, Dürüstlük -5 6. İş çıkışı Rebecca ile bir kafede buluşuyorsun, yanında Lisa varken mesaj atıyor, ne yaparsın? A) “Lisa burada, sonra konuşalım.” Rebecca barı -3, Dürüstlük +3 B) “Hemen sana geliyorum.” Rebecca barı +6, Lisa barı -10, İhanet +7 7. Yorgunluktan evde erken yatmak istiyorsun, Lisa ısrarla dışarı çıkmayı teklif ediyor. A) “Bugün yorgunum, evde kalalım.” Lisa barı -4, Mutluluk -3 B) “Tamam, seninle dışarı çıkalım.” Lisa barı +5, Mutluluk +4 8. Alex önemli bir projeyi sana teslim etti, zamanında yetiştiremeyebilirsin. A) “Gerçekçi zaman verirsek başarı şansı artar.” Alex barı +4, Dürüstlük +5 B) “Mümkün olduğunca hızlı yapacağım, sorun yok.” Alex barı -2, Mutluluk +1 9. Peter, geçmişte yaptığın bir hatayı hatırlatıyor. A) “Haklısın, özür dilerim.” Peter barı +4, Dürüstlük +6 B) “O günler geçti, unutalım.” Peter barı -5 10. Lisa, bir sır sakladığını düşünüyor. A) “Sana her şeyi anlatacağım.” Lisa barı +8, Dürüstlük +7 B) “Beni yanlış anlıyorsun.” Lisa barı -10, Dürüstlük -8 ...Ve bu şekilde 50 soruya kadar devam eder. Her biri farklı barları etkiler. Bazı örnekler arasında Mike’ın kişisel iç sesinden gelen sorular, iş ortamındaki zorluklar, çocukluk anıları, romantik ve ahlaki ikilemler yer alır. Örnek Diyaloglardan Kesitler Lisa: “Mike, seninle daha fazla zaman geçiremediğimiz için çok üzgünüm. Bana gerçekten ihtiyacın var mı?” Mike: “Biliyorum, Lisa. İş çok yoğun ama seni seviyorum. Sadece biraz nefes almaya ihtiyacım var.” Rebecca: “Biliyorum Mike, aramızda başka bir şey olabilir. Ama bu tehlikeli... Ne düşünüyorsun?” Mike: “Rebecca, bu işi kendi haline bırakmalıyız. Lisa’ya ihanet etmek istemiyorum.” Peter: “Yıllar geçti ama sen hala aynı adamsın. Dürüstlüğünle dostluğumuz ayakta kaldı, onu kaybetmek istemem.” Alex: “Mike, bu işten beklentim yüksek. Seni seçtim çünkü yeteneklisin. Ama sınırlarını zorlaman gerekiyor.” Barların Sıfırlanması ve Sonlar Barlar 0’a düştüğünde, oyun aşağıdaki özel sonlardan biriyle biter: Mutluluk Barı 0: “Şehir hayatı seni mutlu edemedi. Her şeyi bıraktın, uzaklarda sessiz bir hayat sürüyorsun.” (Mike yalnızlık ve inziva yolunu seçer.) Dürüstlük Barı 0: “Kendi yalanların seni yuttu. Artık kendine bile güvenemiyorsun, çevrendekiler senden uzaklaştı.” Şehvet Barı 0: “Tutkularını yitirdin, hayatın renksizleşti. Artık hiçbir şey sana zevk vermiyor.” İhanet Barı 100: “Tüm hayatını yalanlar üzerine kurdun. Lisa, Peter ve Rebecca seni terk etti, yalnız kaldın.” Lisa Barı 0: “Evliliğin sona erdi. Lisa hayatından çıktı, ev yalnızlaştı.” Rebecca Barı 0: “Rebecca ile bağın koptu. İş yerindeki o gizemli dostluğun bitti.” Peter Barı 0: “Çocukluk dostun seni hayatından çıkardı. Geçmişe dair ne varsa yitirildi.” Alex Barı 0: “Patronun sabrını kaybetti. İşini kaybettin, belirsiz bir geleceğe doğru...” Oyun Atmosferi ve Görsel Tasarım Oyun, sade ama duygusal bir 2D görsel roman tarzında tasarlanacak. Karakter portreleri duygularını yansıtacak şekilde animasyonlu olacak. Arka planlar gündelik şehir yaşamını, ev ortamını ve ofis ortamını gerçekçi bir şekilde yansıtacak. Atmosferin ruhuna uygun hafif bir caz ve elektronik müzik alt yapısı oyuncunun deneyimini derinleştirecek. Ekranın kenarlarında barlar canlı renklerle gösterilecek, bu da oyuncuya sürekli geri bildirim verecek. Özet “Mike’ın Yolu”, basit görünen ama çok katmanlı ve duygu yüklü bir oyun. Oyuncuyu karakterlerle bağ kurmaya, seçimlerin sonuçlarını içselleştirmeye ve hayattaki ahlaki ikilemleri derinlemesine deneyimlemeye çağırıyor. Mike’ın seçimleri, sadece ilişkilerini değil, kendi ruh sağlığını ve yaşam yolunu belirliyor. Her seçim, yeni bir olasılığa kapı açıyor, ama her yanlış adım da bir sonuca götürüyor. Bu yüzden oyuncunun stratejik ve duygusal zekasını kullanması gerekiyor.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // OptionButton: For displaying a choice var OptionButton = Container.expand(function () { var self = Container.call(this); self.bg = self.attachAsset('option_btn', { anchorX: 0.5, anchorY: 0.5 }); self.text = null; self.callback = null; self.setText = function (str) { if (self.text) self.removeChild(self.text); self.text = new Text2(str, { size: 54, fill: '#222222' }); self.text.anchor.set(0.5, 0.5); self.text.x = 0; self.text.y = 0; self.addChild(self.text); }; self.setCallback = function (cb) { self.callback = cb; }; self.down = function (x, y, obj) { if (self.callback) self.callback(); }; return self; }); // RelationshipBar: For displaying and updating a bar (happiness, honesty, lust, betrayal) var RelationshipBar = Container.expand(function () { var self = Container.call(this); self.bg = self.attachAsset('bar_bg', { anchorX: 0, anchorY: 0 }); self.fill = null; self.label = null; self.value = 100; // 0-100 self.maxWidth = 400; self.type = 'happy'; // 'happy', 'honest', 'lust', 'betray' self.setType = function (type) { self.type = type; var fillId = 'bar_fill_happy'; if (type === 'honest') fillId = 'bar_fill_honest'; if (type === 'lust') fillId = 'bar_fill_lust'; if (type === 'betray') fillId = 'bar_fill_betray'; if (self.fill) self.removeChild(self.fill); self.fill = self.attachAsset(fillId, { anchorX: 0, anchorY: 0 }); self.fill.x = 0; self.fill.y = 0; self.fill.width = self.maxWidth; self.fill.height = 40; self.fill.zIndex = 1; self.bg.zIndex = 0; self.setValue(self.value); }; self.setValue = function (val) { self.value = Math.max(0, Math.min(100, val)); if (self.fill) { self.fill.width = self.maxWidth * (self.value / 100); } if (self.label) { self.label.setText(self.value + '%'); } }; self.setLabel = function (text) { if (self.label) self.removeChild(self.label); self.label = new Text2(text, { size: 36, fill: '#ffffff' }); self.label.anchor.set(1, 0.5); self.label.x = self.maxWidth + 20; self.label.y = 20; self.addChild(self.label); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x181818 }); /**** * Game Code ****/ // Çok çeşitli, rastgele ilerleyen sorular havuzu // Each story node: { text, options: [ {text, effects, next} ], portrait, speaker } // --- Story Data --- // Character portraits (simple colored boxes for now) // Bar backgrounds and fills // Option buttons var story = [ // Lisa kahvaltı - düşük ilişki { id: "lisa_breakfast_low", text: "Lisa sabah kahvaltı hazırlamış ama aranız biraz soğuk. Mike ne der?", portrait: 'lisa', speaker: 'Lisa', mood: "sad", barCheck: { key: "lisa", max: 40 }, options: [{ text: "Yine mi aynı şey, biraz değişiklik yap.", effects: { lisa: -10, happy: -5 }, meta: { type: "truth" }, next: null }, { text: "Teşekkür etmeden geçiştir.", effects: { lisa: -5 }, meta: { type: "lie" }, next: null }] }, // Lisa kahvaltı - orta ilişki { id: "lisa_breakfast_mid", text: "Lisa sabah kahvaltı hazırlamış. Mike ne der?", portrait: 'lisa', speaker: 'Lisa', mood: "neutral", barCheck: { key: "lisa", min: 41, max: 80 }, options: [{ text: "Çok güzel olmuş, teşekkür ederim.", effects: { lisa: 10, happy: 5 }, next: null }, { text: "Yine mi aynı şey, biraz değişiklik yap.", effects: { lisa: -10, happy: -5 }, next: null }] }, // Lisa kahvaltı - yüksek ilişki { id: "lisa_breakfast_high", text: "Lisa sabah kahvaltı hazırlamış, aranız çok iyi. Mike ne der?", portrait: 'lisa', speaker: 'Lisa', mood: "happy", barCheck: { key: "lisa", min: 81 }, options: [{ text: "Sana her gün teşekkür etsem az, harikasın.", effects: { lisa: 10, happy: 10 }, next: null }, { text: "Bugün de seninle kahvaltı yapmak çok güzel.", effects: { lisa: 5, happy: 5 }, next: null }] }, // Rebecca sabah mesaj - düşük ilişki { id: "rebecca_morning_low", text: "Rebecca sabah mesaj atıyor ama aranız biraz soğuk: 'Günaydın, öğle arasında buluşalım mı?'", portrait: 'rebecca', speaker: 'Rebecca', mood: "sad", barCheck: { key: "rebecca", max: 40 }, options: [{ text: "Şu an yoğunum, sonra konuşuruz.", effects: { rebecca: -5, honest: 5 }, meta: { type: "truth" }, next: null }, { text: "Kısa cevap ver.", effects: { rebecca: -5 }, meta: { type: "lie" }, next: null }] }, // Rebecca sabah mesaj - orta ilişki { id: "rebecca_morning_mid", text: "Rebecca sabah mesaj atıyor: 'Günaydın, öğle arasında buluşalım mı?'", portrait: 'rebecca', speaker: 'Rebecca', mood: "neutral", barCheck: { key: "rebecca", min: 41, max: 80 }, options: [{ text: "Tabii, öğle arasında buluşalım.", effects: { rebecca: 10, lust: 5, betray: 5 }, next: null }, { text: "Şu an yoğunum, sonra konuşuruz.", effects: { rebecca: -5, honest: 5 }, next: null }] }, // Rebecca sabah mesaj - yüksek ilişki { id: "rebecca_morning_high", text: "Rebecca sabah mesaj atıyor, aranız çok iyi: 'Günaydın yakışıklı, öğle arasında buluşalım mı?'", portrait: 'rebecca', speaker: 'Rebecca', mood: "happy", barCheck: { key: "rebecca", min: 81 }, options: [{ text: "Seni görmek için sabırsızlanıyorum.", effects: { rebecca: 10, lust: 10, betray: 10 }, next: null }, { text: "Bugün işim var ama akşam konuşalım.", effects: { rebecca: 5, honest: 5 }, next: null }] }, // ... (diğer orijinal story node'lar buraya eklenebilir, örnek olarak ilk iki olay çoğaltıldı) // 3 { text: "Patronun Alex seni sert bir şekilde eleştiriyor. Ne yaparsın?", portrait: 'alex', speaker: 'Alex', options: [{ text: "Haklısınız, daha dikkatli olacağım.", effects: { alex: 10, honest: 5, happy: -5 }, next: null }, { text: "Bana fazla yükleniyorsunuz, adil değil.", effects: { alex: -10, happy: -5 }, next: null }] }, // 3 { text: "Patronun Alex seni sert bir şekilde eleştiriyor. Ne yaparsın?", portrait: 'alex', speaker: 'Alex', options: [{ text: "Haklısınız, daha dikkatli olacağım.", effects: { alex: 10, honest: 5, happy: -5 }, next: null }, { text: "Bana fazla yükleniyorsunuz, adil değil.", effects: { alex: -10, happy: -5 }, next: null }] }, // 4 { text: "Peter zor durumda olduğunu söylüyor. Ne yaparsın?", portrait: 'peter', speaker: 'Peter', options: [{ text: "Yanındayım, neye ihtiyacın varsa söyle.", effects: { peter: 10, happy: 5 }, next: null }, { text: "Kendi işimle meşgulüm, üzgünüm.", effects: { peter: -10, happy: -5 }, next: null }] }, // 5 { text: "Lisa seninle dürüstçe konuşmak istiyor. Ne yaparsın?", portrait: 'lisa', speaker: 'Lisa', options: [{ text: "Tabii, ne söylemek istiyorsan dinliyorum.", effects: { lisa: 10, honest: 10 }, next: null }, { text: "Bunları konuşmak istemiyorum.", effects: { lisa: -10, honest: -10 }, next: null }] }, // 6 { text: "Rebecca ile ofiste samimi bir an yaşıyorsun. Lisa yanında.", portrait: 'rebecca', speaker: 'Rebecca', options: [{ text: "Lisa burada, sonra konuşalım.", effects: { rebecca: -5, honest: 5 }, next: null }, { text: "Hemen sana geliyorum.", effects: { rebecca: 10, lisa: -10, betray: 10 }, next: null }] }, // 7 { text: "Yorgunsun, Lisa dışarı çıkmak istiyor.", portrait: 'lisa', speaker: 'Lisa', options: [{ text: "Bugün yorgunum, evde kalalım.", effects: { lisa: -5, happy: -5 }, next: null }, { text: "Tamam, seninle dışarı çıkalım.", effects: { lisa: 10, happy: 5 }, next: null }] }, // 8 { text: "Alex önemli bir projeyi sana teslim etti.", portrait: 'alex', speaker: 'Alex', options: [{ text: "Gerçekçi zaman verirsek başarı şansı artar.", effects: { alex: 10, honest: 10 }, next: null }, { text: "Mümkün olduğunca hızlı yapacağım, sorun yok.", effects: { alex: -5, happy: 5 }, next: null }] }, // 9 { text: "Peter geçmişte yaptığın bir hatayı hatırlatıyor.", portrait: 'peter', speaker: 'Peter', options: [{ text: "Haklısın, özür dilerim.", effects: { peter: 10, honest: 10 }, next: null }, { text: "O günler geçti, unutalım.", effects: { peter: -10 }, next: null }] }, // 10 { text: "Lisa bir sır sakladığını düşünüyor.", portrait: 'lisa', speaker: 'Lisa', options: [{ text: "Sana her şeyi anlatacağım.", effects: { lisa: 10, honest: 10 }, next: null }, { text: "Beni yanlış anlıyorsun.", effects: { lisa: -10, honest: -10 }, next: null }] }, // 11 { text: "Rebecca ile iş çıkışı kafede buluşuyorsun.", portrait: 'rebecca', speaker: 'Rebecca', options: [{ text: "Rebecca ile samimi bir sohbet et.", effects: { rebecca: 10, lust: 10, betray: 5 }, next: null }, { text: "Kısa kesip eve git.", effects: { rebecca: -5, lisa: 5, honest: 5 }, next: null }] }, // 12 { text: "Alex seni fazla mesaiye bırakmak istiyor.", portrait: 'alex', speaker: 'Alex', options: [{ text: "Kabul et, işini bitir.", effects: { alex: 10, happy: -5 }, next: null }, { text: "Reddet, eve git.", effects: { alex: -10, lisa: 5, happy: 5 }, next: null }] }, // 13 { text: "Peter ile eski günlerden konuşuyorsun.", portrait: 'peter', speaker: 'Peter', options: [{ text: "Duygusal bir anı paylaş.", effects: { peter: 10, happy: 5 }, next: null }, { text: "Geçmişi geçiştir.", effects: { peter: -5 }, next: null }] }, // 14 { text: "Lisa ile romantik bir akşam yemeği.", portrait: 'lisa', speaker: 'Lisa', options: [{ text: "Lisa'ya iltifat et.", effects: { lisa: 10, happy: 10, lust: 5 }, next: null }, { text: "Yemekle ilgilenme, telefona bak.", effects: { lisa: -10, happy: -5, lust: -5 }, next: null }] }, // 15 { text: "Rebecca işte sana yardım ediyor.", portrait: 'rebecca', speaker: 'Rebecca', options: [{ text: "Teşekkür et, birlikte çalış.", effects: { rebecca: 10, honest: 5 }, next: null }, { text: "Yardımı reddet.", effects: { rebecca: -5 }, next: null }] }, // 16 { text: "Alex işte bir hata buldu.", portrait: 'alex', speaker: 'Alex', options: [{ text: "Hatanı kabul et.", effects: { alex: 5, honest: 10 }, next: null }, { text: "Suçu başkasına at.", effects: { alex: -10, honest: -10, betray: 10 }, next: null }] }, // 17 { text: "Peter ile tartıştın.", portrait: 'peter', speaker: 'Peter', options: [{ text: "Barışmak için adım at.", effects: { peter: 10, honest: 5 }, next: null }, { text: "Görmezden gel.", effects: { peter: -10, happy: -5 }, next: null }] }, // 18 { text: "Lisa ile hafta sonu planı yapıyorsun.", portrait: 'lisa', speaker: 'Lisa', options: [{ text: "Birlikte sinemaya git.", effects: { lisa: 10, happy: 5 }, next: null }, { text: "Evde kalmayı teklif et.", effects: { lisa: -5, happy: 5 }, next: null }] }, // 19 { text: "Rebecca ile iş gezisine çıkıyorsun.", portrait: 'rebecca', speaker: 'Rebecca', options: [{ text: "Samimi davran.", effects: { rebecca: 10, lust: 10, betray: 5 }, next: null }, { text: "Mesafeni koru.", effects: { rebecca: -5, honest: 5 }, next: null }] }, // 20 { text: "Alex yeni bir görev veriyor.", portrait: 'alex', speaker: 'Alex', options: [{ text: "Görevi kabul et.", effects: { alex: 10, happy: 5 }, next: null }, { text: "Görevi reddet.", effects: { alex: -10, happy: -5 }, next: null }] }]; // --- State --- // Relationship values (0-100) var rel_lisa = 50; var rel_rebecca = 50; var rel_peter = 50; var rel_alex = 50; // Bars (0-100) var bar_happy = 50; var bar_honest = 50; var bar_lust = 50; var bar_betray = 50; // Bar-based flags (for special scenes/endings) var flags = {}; // Track important past choices for memory mechanic var pastChoices = []; // Turn counter for time-based triggers var turnCount = 0; // Current story node var currentNode = 0; // --- UI Elements --- // Portrait var portraitNode = null; // Speaker name var speakerText = null; // Story text var storyText = null; // Option buttons var optionButtons = []; // Relationship bars var barNodes = {}; // Karakter portreleri ve ilişki dereceleri için UI var characterPortraits = []; var characterLabels = []; // --- Functions --- // getNextNode: uygun story node'unu bar değerine göre seç function getNextNode() { // Tüm story node'larını karıştır var indices = []; for (var i = 0; i < story.length; i++) { indices.push(i); } // Fisher-Yates shuffle for (var i = indices.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = indices[i]; indices[i] = indices[j]; indices[j] = temp; } // Her bir node'u sırayla kontrol et, barCheck varsa uygun olanı döndür for (var k = 0; k < indices.length; k++) { var idx = indices[k]; var node = story[idx]; if (!node.options || node.options.length === 0) continue; if (node.barCheck) { var key = node.barCheck.key; var min = typeof node.barCheck.min === "number" ? node.barCheck.min : -Infinity; var max = typeof node.barCheck.max === "number" ? node.barCheck.max : Infinity; var val = 0; if (key === "lisa") val = rel_lisa;else if (key === "rebecca") val = rel_rebecca;else if (key === "peter") val = rel_peter;else if (key === "alex") val = rel_alex;else if (key === "happy") val = bar_happy;else if (key === "honest") val = bar_honest;else if (key === "lust") val = bar_lust;else if (key === "betray") val = bar_betray; if (val >= min && val <= max) { return idx; } } else { // barCheck yoksa, her zaman seçilebilir return idx; } } // Hiçbiri uygun değilse ilk node'u döndür return 0; } function resetGameState() { rel_lisa = 50; rel_rebecca = 50; rel_peter = 50; rel_alex = 50; bar_happy = 50; bar_honest = 50; bar_lust = 50; bar_betray = 50; flags = {}; pastChoices = []; turnCount = 0; currentNode = 0; } function createUI() { // Portrait if (portraitNode) game.removeChild(portraitNode); portraitNode = LK.getAsset('mike', { anchorX: 0.5, anchorY: 0.5 }); portraitNode.x = 2048 / 2; portraitNode.y = 400; game.addChild(portraitNode); // Speaker if (speakerText) game.removeChild(speakerText); speakerText = new Text2('', { size: 64, fill: '#ffffff' }); speakerText.anchor.set(0.5, 0.5); speakerText.x = 2048 / 2; speakerText.y = 700; game.addChild(speakerText); // Story text if (storyText) game.removeChild(storyText); storyText = new Text2('', { size: 54, fill: '#ffffff', wordWrap: true, wordWrapWidth: 1800 }); storyText.anchor.set(0.5, 0); storyText.x = 2048 / 2; storyText.y = 800; game.addChild(storyText); // Relationship bars var barNames = [{ key: 'happy', label: 'Mutluluk', y: 1100, val: bar_happy }, { key: 'honest', label: 'Dürüstlük', y: 1180, val: bar_honest }, { key: 'lust', label: 'Şehvet', y: 1260, val: bar_lust }, { key: 'betray', label: 'İhanet', y: 1340, val: bar_betray }]; for (var i = 0; i < barNames.length; i++) { var b = barNames[i]; if (barNodes[b.key]) game.removeChild(barNodes[b.key]); var bar = new RelationshipBar(); bar.setType(b.key); bar.setValue(b.val); // Bar ismi ve yüzdeyi birlikte göster if (bar.label) bar.removeChild(bar.label); bar.label = new Text2(b.label + ' (' + b.val + '%)', { size: 36, fill: '#ffffff' }); bar.label.anchor.set(1, 0.5); bar.label.x = bar.maxWidth + 20; bar.label.y = 20; bar.addChild(bar.label); bar.x = 2048 / 2 - 200; bar.y = b.y; game.addChild(bar); barNodes[b.key] = bar; } // Karakter portreleri ve ilişki dereceleri (en altta) for (var i = 0; i < characterPortraits.length; i++) { game.removeChild(characterPortraits[i]); } for (var i = 0; i < characterLabels.length; i++) { game.removeChild(characterLabels[i]); } characterPortraits = []; characterLabels = []; var chars = [{ key: 'lisa', label: 'Lisa', rel: rel_lisa }, { key: 'rebecca', label: 'Rebecca', rel: rel_rebecca }, { key: 'peter', label: 'Peter', rel: rel_peter }, { key: 'alex', label: 'Alex', rel: rel_alex }]; var startX = 2048 / 2 - 400 - 60; var y = 2600; for (var i = 0; i < chars.length; i++) { var c = chars[i]; var portrait = LK.getAsset(c.key, { anchorX: 0.5, anchorY: 1 }); portrait.x = startX + i * 270; portrait.y = y; game.addChild(portrait); characterPortraits.push(portrait); var label = new Text2(c.label + ': ' + c.rel + '%', { size: 44, fill: '#ffffff' }); label.anchor.set(0.5, 0); label.x = portrait.x; label.y = y + 10; game.addChild(label); characterLabels.push(label); } } function updateBars() { barNodes['happy'].setValue(bar_happy); barNodes['honest'].setValue(bar_honest); barNodes['lust'].setValue(bar_lust); barNodes['betray'].setValue(bar_betray); // Bar isimleri ve yüzdeleri birlikte güncellensin barNodes['happy'].label.setText('Mutluluk (' + bar_happy + '%)'); barNodes['honest'].label.setText('Dürüstlük (' + bar_honest + '%)'); barNodes['lust'].label.setText('Şehvet (' + bar_lust + '%)'); barNodes['betray'].label.setText('İhanet (' + bar_betray + '%)'); // Karakter ilişki dereceleri güncellensin var rels = [rel_lisa, rel_rebecca, rel_peter, rel_alex]; for (var i = 0; i < characterLabels.length; i++) { var names = ['Lisa', 'Rebecca', 'Peter', 'Alex']; characterLabels[i].setText(names[i] + ': ' + rels[i] + '%'); } } function showStoryNode(idx) { // Remove old option buttons for (var i = 0; i < optionButtons.length; i++) { game.removeChild(optionButtons[i]); } optionButtons = []; var node = story[idx]; // Portrait if (portraitNode) { if (node.portrait && LK.getAsset(node.portrait, {})) { portraitNode.texture = LK.getAsset(node.portrait, {}).texture; } // Mood-based tint or background for Lisa, Rebecca, Mike if (node.mood && (node.portrait === "lisa" || node.portrait === "rebecca" || node.portrait === "mike")) { // Mood to tint mapping var moodTints = { happy: 0x7ed321, sad: 0x4a90e2, angry: 0xd0021b, neutral: 0xffffff }; var tint = moodTints[node.mood] !== undefined ? moodTints[node.mood] : 0xffffff; portraitNode.tint = tint; } else { portraitNode.tint = 0xffffff; } } // Speaker if (speakerText) { speakerText.setText(node.speaker ? node.speaker : ''); } // Story text if (storyText) { // Example: If player previously lied, show a different text for demonstration if (node.id === "lisa_breakfast_mid" && pastChoices.indexOf("lied") !== -1) { storyText.setText("Lisa sana biraz mesafeli bakıyor. Geçmişteki yalanların etkisi sürüyor."); } else { storyText.setText(node.text); } } // Option buttons if (node.options && node.options.length > 0) { for (var i = 0; i < node.options.length; i++) { var opt = node.options[i]; // --- Requirements check --- var meetsReq = true; if (opt.requirements) { for (var key in opt.requirements) { var val = opt.requirements[key]; // Check current bar/relationship value var current = 0; if (key === 'lisa') current = rel_lisa;else if (key === 'rebecca') current = rel_rebecca;else if (key === 'peter') current = rel_peter;else if (key === 'alex') current = rel_alex;else if (key === 'happy') current = bar_happy;else if (key === 'honest') current = bar_honest;else if (key === 'lust') current = bar_lust;else if (key === 'betray') current = bar_betray; if (current < val) { meetsReq = false; break; } } } var btn = new OptionButton(); btn.setText(opt.text); // If requirements not met, disable and gray out if (!meetsReq) { btn.bg.tint = 0x888888; btn.text.style.fill = '#bbbbbb'; btn.setCallback(function () {}); // No-op } else { btn.setCallback(function (opt) { return function () { applyEffects(opt.effects, opt.meta); // Her zaman random bir sonraki soru seç, ama bar değerine göre uygun versiyonu seç var available = []; for (var j = 0; j < story.length; j++) { if (story[j].options && story[j].options.length > 0) available.push(j); } if (available.length > 0) { // getNextNode fonksiyonu ile uygun node'u seç var nextIdx = getNextNode(); currentNode = nextIdx; showStoryNode(currentNode); } else { // Oyun bitti, son ekranı göster showEnding(); } }; }(opt)); } btn.x = 2048 / 2; btn.y = 1700 + i * 180; game.addChild(btn); optionButtons.push(btn); } } } function applyEffects(effects, meta) { if (!effects) return; // --- Memory mechanic: record important choices --- // Example: If the player kisses Lisa, lies to Rebecca, etc. // We'll record meta.memoryLabel if present, otherwise try to infer from meta/type if (meta && meta.memoryLabel) { pastChoices.push(meta.memoryLabel); } else if (meta && meta.type === "lie") { pastChoices.push("lied"); } else if (meta && meta.type === "truth") { pastChoices.push("told_truth"); } // Sadece yüzde 1 artıp azalsın if (typeof effects.lisa === 'number') rel_lisa = Math.max(0, Math.min(100, rel_lisa + (effects.lisa > 0 ? 1 : effects.lisa < 0 ? -1 : 0))); if (typeof effects.rebecca === 'number') rel_rebecca = Math.max(0, Math.min(100, rel_rebecca + (effects.rebecca > 0 ? 1 : effects.rebecca < 0 ? -1 : 0))); if (typeof effects.peter === 'number') rel_peter = Math.max(0, Math.min(100, rel_peter + (effects.peter > 0 ? 1 : effects.peter < 0 ? -1 : 0))); if (typeof effects.alex === 'number') rel_alex = Math.max(0, Math.min(100, rel_alex + (effects.alex > 0 ? 1 : effects.alex < 0 ? -1 : 0))); if (typeof effects.happy === 'number') bar_happy = Math.max(0, Math.min(100, bar_happy + (effects.happy > 0 ? 1 : effects.happy < 0 ? -1 : 0))); if (typeof effects.honest === 'number') bar_honest = Math.max(0, Math.min(100, bar_honest + (effects.honest > 0 ? 1 : effects.honest < 0 ? -1 : 0))); if (typeof effects.lust === 'number') bar_lust = Math.max(0, Math.min(100, bar_lust + (effects.lust > 0 ? 1 : effects.lust < 0 ? -1 : 0))); if (typeof effects.betray === 'number') bar_betray = Math.max(0, Math.min(100, bar_betray + (effects.betray > 0 ? 1 : effects.betray < 0 ? -1 : 0))); // --- Honest bar penalty for repeated lies --- if (meta && meta.type === "lie") { // Lying reduces honest bar by 2 (or 1 if already low) bar_honest = Math.max(0, bar_honest - (bar_honest > 10 ? 2 : 1)); } // --- Relationship Cross Effects --- applyCrossEffects(effects, meta); updateBars(); // --- Turn-based trigger system --- // Increase turn count on every choice turnCount++; // Zamana bağlı özel rüya sahnesi tetikleyici örneği if (turnCount > 15 && bar_lust > 60 && !flags["specialDreamTriggered"]) { flags["specialDreamTriggered"] = true; showEnding("Mike, arzularının peşinden sürüklendiği özel bir rüya görüyor. (Zamana bağlı özel sahne)"); return; } // --- Bar-based flag system --- // Example: if betrayal bar reaches 80 or more, set betrayalUnlocked flag if (bar_betray >= 80) { flags["betrayalUnlocked"] = true; } if (bar_honest >= 90) { flags["honestyMaster"] = true; } if (bar_lust >= 90) { flags["lustHigh"] = true; } if (bar_happy >= 90) { flags["happinessPeak"] = true; } if (rel_lisa >= 90) { flags["lisaBond"] = true; } if (rel_rebecca >= 90) { flags["rebeccaBond"] = true; } if (rel_peter >= 90) { flags["peterBond"] = true; } if (rel_alex >= 90) { flags["alexBond"] = true; } // Check for fail/win conditions if (bar_happy <= 0) { showEnding('Mutluluk sıfırlandı. Mike depresyona girdi.'); return; } if (bar_honest <= 0) { showEnding('Dürüstlük sıfırlandı. Mike yalanlarla dolu bir hayata saplandı.'); return; } if (bar_lust <= 0) { showEnding('Şehvet sıfırlandı. Mike hayattan keyif alamıyor.'); return; } if (bar_betray >= 100) { showEnding('İhanet %100 oldu. Mike ilişkilerini kaybetti.'); return; } } // İlişki çaprazlama mekanizması: Lisa ile yakınlık artınca Rebecca kıskanır, Rebecca ile yakınlık artınca Lisa üzülür, vs. function applyCrossEffects(effects, meta) { // Lisa ile yakınlık artarsa Rebecca'nın ilişkisi biraz azalır (kıskançlık) if (typeof effects.lisa === 'number' && effects.lisa > 0) { // Lisa ile +1 yakınlık, Rebecca -1 rel_rebecca = Math.max(0, rel_rebecca - 1); } // Rebecca ile yakınlık artarsa Lisa'nın ilişkisi biraz azalır (kıskançlık) if (typeof effects.rebecca === 'number' && effects.rebecca > 0) { rel_lisa = Math.max(0, rel_lisa - 1); } // Lisa ile yakınlık azalırsa Rebecca biraz mutlu olur (rekabet) if (typeof effects.lisa === 'number' && effects.lisa < 0) { rel_rebecca = Math.min(100, rel_rebecca + 1); } // Rebecca ile yakınlık azalırsa Lisa biraz mutlu olur (rekabet) if (typeof effects.rebecca === 'number' && effects.rebecca < 0) { rel_lisa = Math.min(100, rel_lisa + 1); } // Betray (ihanet) barı artarsa Lisa ve Rebecca'nın ilişkisi biraz azalır if (typeof effects.betray === 'number' && effects.betray > 0) { rel_lisa = Math.max(0, rel_lisa - 1); rel_rebecca = Math.max(0, rel_rebecca - 1); } // Lust barı çok artarsa (ör: Rebecca ile), Lisa'nın ilişkisi biraz azalır if (typeof effects.lust === 'number' && effects.lust > 0) { rel_lisa = Math.max(0, rel_lisa - 1); } // Happy barı çok azalırsa, tüm ilişkiler biraz azalır if (typeof effects.happy === 'number' && effects.happy < 0) { rel_lisa = Math.max(0, rel_lisa - 1); rel_rebecca = Math.max(0, rel_rebecca - 1); rel_peter = Math.max(0, rel_peter - 1); rel_alex = Math.max(0, rel_alex - 1); } } function showEnding(msg) { // Remove option buttons for (var i = 0; i < optionButtons.length; i++) { game.removeChild(optionButtons[i]); } optionButtons = []; // Show ending text if (storyText) { if (msg) { storyText.setText('SON: ' + msg + '\n\nYeniden başlamak için ekrana dokunun.'); } else { storyText.setText('SON: Mike’ın hikayesi burada bitiyor.\n\nYeniden başlamak için ekrana dokunun.'); } } // Remove speaker if (speakerText) speakerText.setText(''); // Add restart handler game.down = function (x, y, obj) { game.down = null; restartGame(); }; } function restartGame() { resetGameState(); updateBars(); showStoryNode(currentNode); // Remove restart handler game.down = null; } // --- Start Game --- resetGameState(); createUI(); updateBars(); showStoryNode(currentNode); // --- No dragging or move events needed for this game --- // --- Game update (not used, but required for LK) --- game.update = function () { // No per-frame logic needed };
===================================================================
--- original.js
+++ change.js
@@ -110,8 +110,9 @@
id: "lisa_breakfast_low",
text: "Lisa sabah kahvaltı hazırlamış ama aranız biraz soğuk. Mike ne der?",
portrait: 'lisa',
speaker: 'Lisa',
+ mood: "sad",
barCheck: {
key: "lisa",
max: 40
},
@@ -141,8 +142,9 @@
id: "lisa_breakfast_mid",
text: "Lisa sabah kahvaltı hazırlamış. Mike ne der?",
portrait: 'lisa',
speaker: 'Lisa',
+ mood: "neutral",
barCheck: {
key: "lisa",
min: 41,
max: 80
@@ -168,8 +170,9 @@
id: "lisa_breakfast_high",
text: "Lisa sabah kahvaltı hazırlamış, aranız çok iyi. Mike ne der?",
portrait: 'lisa',
speaker: 'Lisa',
+ mood: "happy",
barCheck: {
key: "lisa",
min: 81
},
@@ -194,8 +197,9 @@
id: "rebecca_morning_low",
text: "Rebecca sabah mesaj atıyor ama aranız biraz soğuk: 'Günaydın, öğle arasında buluşalım mı?'",
portrait: 'rebecca',
speaker: 'Rebecca',
+ mood: "sad",
barCheck: {
key: "rebecca",
max: 40
},
@@ -225,8 +229,9 @@
id: "rebecca_morning_mid",
text: "Rebecca sabah mesaj atıyor: 'Günaydın, öğle arasında buluşalım mı?'",
portrait: 'rebecca',
speaker: 'Rebecca',
+ mood: "neutral",
barCheck: {
key: "rebecca",
min: 41,
max: 80
@@ -253,8 +258,9 @@
id: "rebecca_morning_high",
text: "Rebecca sabah mesaj atıyor, aranız çok iyi: 'Günaydın yakışıklı, öğle arasında buluşalım mı?'",
portrait: 'rebecca',
speaker: 'Rebecca',
+ mood: "happy",
barCheck: {
key: "rebecca",
min: 81
},
@@ -918,8 +924,22 @@
if (portraitNode) {
if (node.portrait && LK.getAsset(node.portrait, {})) {
portraitNode.texture = LK.getAsset(node.portrait, {}).texture;
}
+ // Mood-based tint or background for Lisa, Rebecca, Mike
+ if (node.mood && (node.portrait === "lisa" || node.portrait === "rebecca" || node.portrait === "mike")) {
+ // Mood to tint mapping
+ var moodTints = {
+ happy: 0x7ed321,
+ sad: 0x4a90e2,
+ angry: 0xd0021b,
+ neutral: 0xffffff
+ };
+ var tint = moodTints[node.mood] !== undefined ? moodTints[node.mood] : 0xffffff;
+ portraitNode.tint = tint;
+ } else {
+ portraitNode.tint = 0xffffff;
+ }
}
// Speaker
if (speakerText) {
speakerText.setText(node.speaker ? node.speaker : '');
Boss Man head. In-Game asset. 2d. High contrast. No shadows
Housewife Head. In-Game asset. 2d. High contrast. No shadows
Blonde Handsome Man. In-Game asset. 2d. High contrast. No shadows
handsome, black hair, goat beard man head. In-Game asset. 2d. High contrast. No shadows
sexy ginger woman head In-Game asset. 2d. High contrast. No shadows
briefcase. In-Game asset. 2d. High contrast. No shadows
soccer ball. In-Game asset. 2d. High contrast. No shadows
flame heart. In-Game asset. 2d. High contrast. No shadows
motorcycle. In-Game asset. 2d. High contrast. No shadows
limuzin. In-Game asset. 2d. High contrast. No shadows
Black popart background. Only dark colors. Lots of pop art reference In-Game asset. 2d. High contrast. No shadows
Sexy beautiful French Woman face In-Game asset. 2d. High contrast. No shadows
German Shepard face. realistic In-Game asset. 2d. High contrast. No shadows
realistic villa. In-Game asset. 2d. High contrast. No shadows