Oyuna Genel Bakış
Tower and Defense nedir, nasıl oynanır, hangi modlar var: oyuna genel bakış ve başlangıç rehberi.
Tower and Defense 🏰
Patreon VIP kurulumu
Tek seferlik 5 USD → kalıcı VIP + bir kez 10 Life Token için kurulum adımları ve Patreon'a kopyalanabilir İngilizce metinler: PATREON_KURULUM.md. Oyuncu Patreon Shop siparişini bildirir; yönetici Patreon satışını ve alıcıyı kontrol edip onayladığında VIP ve token birlikte kalıcı kaydedilir. Aynı sipariş veya hesap tekrar ödül alamaz. Ayar şablonu server/patreon.env.example; yalnız PATREON_PRODUCT_URL gerekir. Ürün bağlantısı ayarlanmadan satın alma etkinleşmez. Aylık abonelik, OAuth veya ödeme API anahtarı kullanılmaz.
Güçlendirme kitapları (2026-09-12)
- Seçili kulenin panelindeki Kitaplar satırı üç kalıcı güçlendirme satar: Güç (kırmızı, saldırı hasarı +%12/kitap), Çeviklik (yeşil, saldırı hızı +%10/kitap), Zekâ (mavi, yetenek bekleme sayaçları %15 daha hızlı/kitap; yalnız mevcut kademesinde nova/tuzak/ifrit/Focus/Kutsal Darbe/Kutsal Siper/bataklık kökü gibi bekleme süreli yeteneği olan kulelerde; diriltme yoklaması bekleme değildir). Her kitap 1000 altın, tür başına en çok 3; aynı tür toplamsal yığılır, çarpan aura ve pasiflerle çarpılır. Bedel yatırıma eklenir (satışta %70 iade, taşıma bedeli büyür), Savaş Raporu'nda "Kitaplar" satırı; kayıt/devam ve co-op anlık görüntüsü sayıları taşır, kitaplı kulenin üstünde renkli pipler görünür. Kahraman ve çağrılanlar alamaz; co-op'ta yalnız kendi kulene, kendi kasandan. Sayılar
js/data/tomes.js(TOMES), doğrulamanode tools/hero_tests.jsbölüm 27 ve denge bantları bölüm 28 (playtest ölçümü KARAKTER_REHBERI 2.2.1: artık altın tamamen erir, Zor'da zafer 3/36 -> 10/36, Kâbus'ta dalga +2-5%, tam zafere dönüşmez; Güç %13'ün üstünde K4 geliştirmesinden iyi anlaşma olurdu).
Yetenek etki görselleri (2026-09-08)
Yükseltme kutuları ve kahraman yetenek düğümleri artık 240 ayrı yetenek sahnesi gösterir: meteor yağmuru, termal şok, ok salvosu, şifa, pençe, hipnoz, çağrı ve diğer gerçek etkiler. Built-in Imagegen ile üretilen 20 PNG atlas assets/skills/ içindedir. Her atlasın satırları üç uzmanlık yolunu, sütunları dört kademeyi izler. Kutulardaki 44 px ikonlar açıklama panellerinde 84 px görünür; son kademe tamamlanınca da görsel kalır. Dünya sprite'ları ve karakter başlık portreleri mevcut görünüm sistemini kullanır. Kaynaklar, katalog, galeri ve doğrulama: assets/SKILL_ART.md.
Life Token (2026-09-08)
Giriş yapmış oyuncuların sunucuda kalıcı Life Token bakiyesi vardır. Yenilgide isteğe bağlı 1 token → 10 can ve +3000 altın ile aynı dalga, düşmanlar, mermiler ve bekleyen doğumlarla devam edilir. Rahibin oyun başına canlandırması ayrı kalır. Bakiyesi olmayan oyuncuya kullanım kapalıdır; normal yeniden deneme ve menü seçenekleri korunur.
Hesap bölümündeki üç sefer görevi, hesap başına birer kez +1 token verir: Kâbus'ta 100 dalgalık zafer; aynı zaferi hiç can kaybetmeden kazanma; Zor/Kâbus sonsuz modunda toplam 150. dalgayı temizleme. Token kullanılmış koşular ödül alamaz. Yönetici panelindeki kullanıcı satırından ayrıca 1–100 token atanabilir. Atama ve harcama, tekrar gönderildiğinde ikinci kez uygulanmayan makbuzlarla kaydedilir; görev ödülleri tekrarlanmaz.
Canlanma kararı ve başarılı canlanma tam oyun kaydı tutar. Ağ yanıtı kaybolursa aynı istekle tekrar denenir; sonuç netleşmeden maç kapatılmaz. Ortak maçta kurucu kendi hesabından token harcar; takımın ortak canı yenilenir ve her oyuncunun kendi kasasına 3000 altın eklenir. Tarayıcı yenilenerek kurtarılan ortak kayıt yerel olarak devam eder; eski ağ odasına yeniden bağlanılmaz. Normal sefer kaydı sonraki temizlenen dalgada standart kayıt akışına döner.
Bakiyeler, ödüller ve makbuzlar server/data/db.json içinde birlikte saklanır. Görev sonuçları mevcut oyun/puan altyapısındaki gibi istemciden bildirilir; sunucu oturumu, veri aralıklarını, tek ödül kuralını ve aynı koşunun harcama geçmişini denetler. Bu sistem oyun simülasyonunu sunucuda doğrulayan bir hile önleme sistemi değildir.
Doğrulama: node tools/life_token_server_tests.js, node tools/life_token_client_tests.js, node tools/life_token_game_tests.js. Görsel test: node tools/life_token_preview_server.js ve http://127.0.0.1:8136/ (sahte hesap/cüzdan, gerçek verilere erişmez).
Her güçlendirmede görsel gelişim (2026-09-08)
14 sınıfın 168 yükseltmesi ve 6 kahramanın 72 yeteneği, özgün sprite üzerinden gelişen kıyafet, zırh ve aksesuar görünümüne sahiptir. Karma seçimlerin detayları birlikte görünür; dünya çizimi ve karakter portreleri aynı görünümü seçer. Satın alma kutuları yukarıdaki yetenek etki görsellerini kullanır. Oyun kayıtları değişmeden mevcut kademe ve yeteneklerden görünüm türetilir. Üretim, kaynaklar, geliştirme galerisi ve testler: assets/UPGRADE_ART.md.
10 haritalı çevrimdışı sefer (2026-09-08)
Online arenalar dışında 10 harita vardır. Önceden 6 harita bulunduğu için 4 yeni harita (Yosunlu Avlu, Kırık Köprüler, Fırtına Surları, Son Mühür) eklendi; Karanlık Mahzen baştan tasarlandı. Böylece 5 yeni rota düzeni sunulur. Seçim ekranı kolaydan ustalığa sıralanır; her kart haritanın özelliğini ve taktik önerisini gösterir. Online arenalar ayrı bölümde kalır.
Her haritanın kendine ait 30 yazılmış dalgası vardır. Seçilen oyun zorluğuna göre 30/45/60/100 dalga ve sonsuz mod devam eder. Eski harita erişimi ve skorları korunur; yeniden tasarlanan Mahzen'de geçersiz konumda kalan kulelerin yatırımı iade edilir. Harita sırası, oynanış farkları ve doğrulamalar: SEFER_HARITALARI.md.
Druid formları ve Ozan arpı (2026-09-08)
Druid'in Yaban yolunda K2 kurt, K3 ayı, K4 kadim ayı görünür. Korucu aynı kurt sprite'ını yoldaş olarak kullanır. Ozan tüm yollarında arp taşır ve saldırırken telleri çalar. Hayvanların bekleme, yürüme ve saldırı kareleri bulunur; seçili portre ve taşıma önizlemesi de güncel formu gösterir.
Hayvanlar, Genç Ejderha'daki yöntemle mevcut atlas modellerinden türetilir: kurt Chort, ayılar Ogre karelerini kullanır; gövde ve animasyon pozları korunarak palet değişimi ve küçük ayrıntılar uygulanır. Arpın mevcut piksel haritası değişmedi. Kaynaklar tools/pixel_animals.js ve tools/pixel_harp.js; yeniden üretim node tools/build_forest_atlas.js, doğrulama node tools/forest_art_tests.js. Ayrıntılar: assets/FOREST_ART.md.
Karakterlerin oynanış yenilemesi (2026-09-08)
14 kule sınıfı ve 6 kahramanın rolleri yeniden düzenlendi. 42 kule yolu ve 18 kahraman dalının güncel açıklamaları, güçlü/zayıf yönleri, fiyatları ve takım örnekleri OYNANIS_REHBERI.md belgesindedir. Aşağıdaki V3 kayıtları değişiklik geçmişidir; güncel yetenekler için bu rehberi kullan.
Korucu gerçek bir çizgide delici atış veya mesafe bonusu, Savaşçı farklı dost sınıflarından kişisel güç, Artificer doldurmalı salvo, Warlock aynı hedefte biriken odak, Hırsız zehri tüketen bitirici kullanır. Büyücünün ateşi önceden yavaşlatılmış hedeflerle etkileşir; Druid arazi kontrolüne, Keşiş ritmik vuruşlara odaklanır. Kahraman dalları hareket, hedef seçimi ve yetenek zamanlamasında farklı tercihler sunar.
Takım önizlemesi ve maç içi paneller güçlü/zayıf yönleri ve yolun nasıl oynandığını gösterir. Odak, şarjör, zehir bitirici ve karma birlik sayaçları maç sırasında izlenebilir. Önceki 3 kule sınırı, üç ekonomi sınıfı, K3 Ruh Gözü ve geç dalga baskısı korunur. Doğrulama kapsamı: KIMLIK_YENILEME_NOTLARI.md.
Güncel denge yaması (2026-09-07)
Bu bölüm, aşağıdaki V3 geçmişindeki ekonomi ve sınıf sınırı bilgilerini günceller. Ayrıntılar ve ölçüm sınırları: DENGE_NOTLARI.md.
- Her oyuncu aynı sınıftan aynı anda en fazla 3 kule kurabilir. Satmak yer açar; kahramanlar ve çağrılan birimler sayılmaz. Kartlar
0/3sayacı gösterir. Eski kayıtlardaki ilk üç kule korunur, fazlasının yatırımı tamamen iade edilir. - Altın üreten sınıflar yalnız Ozan, Hırsız ve Artificer. Gelirler azaltıldı, Hırsız ve Artificer'in kazançlarına ilk ekonomi kademesinden itibaren dalga tavanı getirildi.
- Ölü Çağıran'ın eski Ceset Simyası yolu Mezar Gözcüsü oldu. K3 Ruh Gözü (975 altın) 150 px içindeki kamuflajı tüm savunma için açar; K4 alanı 185 px'e çıkarır. Susturma görüşü kapatır, alan dışındaki düşman yeniden gizlenir. Karanlık harita alanı küçültür. Uçanlara yakın dövüş ve faz hâli kuralları korunur.
- 31+ düşman canı dalga başına %3.5 büyür. 21+ boss canına kademeli, en fazla %30 ek baskı uygulanır. Dalga sonu temel ödülü 30. dalgada durur; geç oyun öldürme ödülleri büyümek yerine azalır.
- Testler:
node tools/hero_tests.js,node tools/stats_tests.js,node tools/balance_tests.js.
Fantastik sınıflarla oynanan, Bloons TD tarzı 2D kule savunma oyunu. Tarayıcıda çalışır — kurulum gerekmez. Türkçe ve İngilizce dil desteği vardır (eski adı: Zindan Savunması). (Not: yayın adı ve arayüz metinlerinde "D&D" kullanılmaz — Wizards of the Coast markasıdır.)
Nasıl çalıştırılır
index.html dosyasına çift tıkla. Hepsi bu — internet bağlantısı, sunucu ya da kurulum gerekmez.
(İsteğe bağlı: geliştirme için node tools/serve.js ile http://localhost:8123 üzerinden de açılabilir.)
Oyun
📖 Tüm sınıfların, kahramanların, yolların ve yetenek ağaçlarının kademe kademe dökümü (V3 denge sürümü): KARAKTER_REHBERI.md
- V3 denge sürümü (2026-09-05, uygulandı) —
js/game/effects.jsbaşlığındaki 10 sistem kuralı: Resolve (aynı düşmana art arda sert kontrol — sersemletme/köklenme/dondurma ayrı sayaç — 1. tam, 2. yarım, 3. uygulanmaz + 2,5 sn bağışık), Sarsılma (boss/mini-boss'tastunImmunekalktı: sert kontrol süresi x100 çubuk yükler — Ogre 150 · Genç Ejderha 170 · Dev Zombi 220 · Dev Şeytan 260; dolunca 1,5 sn durur ve +%25 hasar alır, eşik x1,3, 6 sn giriş yoksa saniyede %10 boşalır; boss barının altında çubuk), Exposure (mark+vulnAuratek kategori: çarpılmaz, en güçlüsü; tavan +%60 / boss +%40), yavaşlatma tavanı (normal %60 · elite/mini-boss %40 · boss %25;slowResistyalnız Buz Zombisi'nde), geri itme/çekme iç beklemesi (aynı kaynak-hedef 0,75 sn), hedef limiti (Savaşçı 5 — girdap dahil, Ayı 3,maxTargets), yüzdesel can hasarı boss tavanı (hpBurn.bossCap: Warlock 30/45, Entropi 35 /sn), sızıntı kalkanı toplamı dalga başına 5 can (yalnız Paladin: Koruma 2 / Siper 3 / Aegis 4; kahraman kalkan/diriliş/can düğümleri kaldırıldı), kahraman auraları çarpımsal (kule aurasıyla Math.max'a girmez), UÇAN düşman ekseni (flags.flying: yolu izlemez, girişten çıkışa düz uçar —enemy.flyPathOf; melee kule/kahraman/yoldaş hedefleyemez, tuzak ve beden engeli işlemez; Harpi @14/18/24/29, Kanatlı İfrit @19/27 (kamuflaj), Genç Ejderha mini-boss @23 (nefes), sonsuz havuz + "Hava Akını" şablonu, rotasyon boss listesi; sprite'lar: Harpi/Kanatlı İfrit atlastan tint'li angel/imp; Genç Ejderha projeye özgüyoungdragonsprite'ı — bkz. ek atlas notu). Zehir artık BÜYÜ tipli (Kara Ölüm saf). 14 sınıf: yeni Sorcerer (Büyü Yükü: 5 saldırıda bir EMPOWERED x1,5, boşta geçen her saniye +1 yük; Ejder Kanı patlama / Metabüyü ikiz-delme / Vahşi Büyü sıralı GÜÇ→BUZ→KAOS taşkını) ve Ölü Çağıran (menzilde ölen düşman CESET bırakır → Kemik Lordu iskelet diriltir — Kemik Zırhı ile yolu fiziksel olarak TIKAR (def.block, düşman engeli döver), Kemik Golemi 3 ceset; Solgun Lanet anti-şifa/Kefen bulutu/Ruh yığını; Ceset Simyası altın + ceset hasar aurası). Yeniden tasarlanan yollar: Korucu Canavar Ustası (yola ağ tuzağıtrap+ kurt yoldaşsummon), Paladin Son Işık (pathBonus: yol ilerlemesine göre +hasar), Warlock Hiçlik Paktı (ritmikeveryNth.pullçekme +singularityzemini), Warlock pasif Hex, Keşiş Focus (ICD 2,5 sn, boss'ta düz hasar + Sarsılma) ve ritmik Açık El (stunNth/kbNth/chillNth), Barbar öfke sönmesi (4 sn) + Balta Atıcı yalnız ana vuruşta her 4. sersemletme, Druid Shock yığını (3 → sersemletme) ve Kurt/Ayı sıçrama (menzil 160/150 melee — kule ölmez), Artificer ölümde zehir yayılımıdeathSpread+ Midas altın zincirigoldChain, OzanheroCdMul(kahraman bekleme desteği; hasar aurası kalktı — tek hasar aurası Rahip) + Altın Çağ geçiş bonusupassIncome, Paladin Kutsal SipersilenceWard+ AegisshieldFury, Hırsız kritik işareticritMark+poisonAntiHeal+lootCap. Kahramanlar: Şövalye Öncü dalı (Nara yavaşlatır/köklendirir), Doktor Karantina dalı (suppress), Okçu Av Hükmü (quarry: en güçlüyü işaretler, +%50 hasar + %50 delme, ölünce atlar) ve sabır yarılanması, Kronomant Geri Sarım kademeleri (boss 30/60 Sarsılma) + Yankıecho+ Kronometre tavanı, Fırtına Kâhini hareket bazlı Yük (chargePx) + Shock dalı + ivme, Kızıl Şef Savaş Öfkesi (ragedmg+rate) + aura Cenk Davulu dalında. Zeminlerg.zones(tekillik/tuzak alanı/nekrotik bulut), çoklu yoldaşminionsOf(companion + raised), gecikmeli işlerg.delayed. Erişim: üye 9 sınıf (Ölü Çağıran dahil), VIP 14. Doğrulama:node tools/hero_tests.jsbölüm 22 (1063 assert),node tools/stats_tests.js.
- 14 D&D sınıfı kule, her biri Bloons TD 6 tarzı 3 uzmanlaşma yolu x 4 kademe ile. Kural: en çok 2 yolda kademe alınır ve yalnızca biri 1. kademeyi aşabilir (derin yol K4'e kadar, çapraz yol 1). "Dönüşüm" kademeleri (saldırı biçimini değiştirenler) başka bir yol derinleşmişken alınamaz. İnşa kuralları (
G.RULES, js/game/tower.js): aynı sınıftan her ek kule +%25 pahalı (en çok 2 kat; kart ve tooltip güncel fiyatı gösterir), 3. kademe her sınıfın her yolunda haritada tek (panelde "Haritada tek" kilidi; sahibi satılınca açılır; eski kayıtlarda fazla K3'ler K2'ye iner, bedeli iade edilir) ve K3 fiyatı veri dosyasındakinin 1,5 katı. Ölçüm araçları (tools/bench.js) kalibrasyon için bu kuralları kapatır. 4. kademe "Efsanevi": 42 YOLUN TAMAMINDA (yoluntiers[3]'ü, K3'ün devamı; K3 tekliği sayesinde haritada tek; panelde ✦ yıldızı, kor rengi kalın halka, daha iri sprite; 1.400-1.900 ⛃,tierCostham okur). Örnekler: Savaşçı Efsanevi Kasırga / Savaş Sancağı / Yıkılmaz Kale · Büyücü Cehennem Alevi / Mutlak Sıfır / Yıldız Salvosu · Korucu Efsanevi Ok / Ok Fırtınası / Kadim Kökler · Rahip Göksel Koro / Kıyamet Işığı / Hayat Pınarı · Hırsız Gölgelerin Efendisi / Lonca Ustası / Veba Hançeri · Ozan Kadim Ezgi / Ölümsüz Destan / Altın Çağ · Simyacı Kadim Vebalar / Kıyamet Bombası / Midas Dokunuşu · Barbar Sonsuz Öfke / Fırtına Çekici / Tanrı Katili · Paladin Göksel İnfazcı / Aegis / Kıyamet Yemini · Warlock Kadim Lanet / Cehennem Kapısı (1.800 ⛃) —mods.summonile çağrılan birim sistemi: iri/yavaş bir İblis (big_demon) Warlock'un menzili x1,15 tasma içinde devriye gezer, en yakın düşmana yürür, 85 px alan darbesi (55 büyü, 2 sn %40 yavaşlatma, 3 sn yanma, kamuflaj görür). İblis kule değildir: occ'ye girmez, satılamaz/geliştirilemez, tıklanınca sahibi seçilir, kayda girmez (devamda yeniden çağrılır), Warlock satılınca gider; auralardan yararlanır. Diğer sınıfların K4'leri aynı altyapıyla (summonya da sıradan mods) eklenir. Her yolun bir oynanış tarzı etiketi var — her oyuncu tipine en az iki sınıfta seçenek:
💥 Yıkıcı · 🎯 Keskin (tek hedef/boss) · ❄ Kontrolcü · 💰 Ekonomist · ✨ Destekçi · 🎲 Kumarbaz · ☠ Zehirci · 😈 Çağırıcı · ⚡ Seri Atış · 🛡 Sürdürücü · 🥊 Dönüşen
- Savaşçı — cleave · ⚔ Silah Ustası (Yıkıcı: her 5. vuruş çift) / 🚩 Komutan (Destekçi: zırh kırma + hedef gösterme) / 🛡 Kale Muhafızı (Kontrolcü: geri itme, zemin darbesi)
- Büyücü — alan hasarlı ateş topu · 🔥 Ateş (Yıkıcı: meteor + en güçlü yanma) / ❄ Buz (Kontrolcü: %50 yavaşlatma + dondurma) / 🔮 Arkana (Seri Atış: 4 hedefe direnç delen füze)
- Korucu — uzun menzil · 🎯 Keskin Nişancı (Keskin: kamuflaj, kritik, nişan) / 🏹 Delici Oklar (Seri Atış: fiziksel direnç delme, 2 hedef) / 🌲 Orman Bekçisi (Kontrolcü: ağ, kanca, kök oku)
- Rahip — hasar aurası, hortlak avcısı · ✨ Kutsayıcı (Destekçi: +%30 aura + kutsal patlama) / ☀ Engizisyon (Keskin: hortlak kovma + infaz) / 🕊 Merhamet (Sürdürücü: can yenileme, kutsal zemin, bir kezlik diriliş)
- Hırsız — kritik, kamuflaj görür · 🗡 Suikastçı (Keskin: sinsi + pusu vuruşu x3) / 🌑 Yankesici (Ekonomist: düşman başına altın, 3 hedef, yağma) / ☠ Zehirci (Zehirci: çevreye sıçrayan 5 katlı zehir)
- Ozan — yavaşlatma aurası · 🎵 Büyüleyici (Kontrolcü: kamuflajı da uyutan aura + herkesi uyutma) / 🎺 İlham (Destekçi: +%30 hız aurası) / 🎭 Saray Ozanı (Ekonomist: dalga geliri + erken çağırma bonusu x2.5; haritadaki gelir kuleleri azalan verimle sayılır — en yüksek tam, 2. yarım, 3. çeyrek... — spam sınırsız altın üretmez)
- Simyacı — iksir fırlatır · 🧪 İksirci (Zehirci: zehir, asit, felç gazı) / 💣 Bombacı (Yıkıcı: FİZİKSEL bombalar, geri itme) / 🪙 Altın Simyası (Ekonomist: altın damgası — kim öldürürse öldürsün ek altın; isabet altını kule başına dalga tavanlı: K2 40 / K3 80)
- Barbar — vurdukça öfkelenip hızlanır · 🪓 Berserker (Yıkıcı: 10 kat öfke + kritik) / 🪃 Balta Atıcı (Seri Atış: seken balta, sersemleten çekiç) / 🦴 Dev Katili (Keskin: boss'lara x3)
- Paladin — kutsal yakın dövüş · ⚜ Zafer Yemini (Keskin: en güçlü hedefe Kutsal Darbe) / 🛡 Adanmışlık Yemini (Sürdürücü: dalga başına sızıntı kalkanı) / 🩸 İntikam Yemini (Kumarbaz: can kaybıyla güçlenir, son direniş x2)
- Warlock — karanlık ışın · 🧿 Lanetler (Keskin: nazar, çürüme, can-yüzdesi yakan ruh emici) / 😈 Zincir Paktı (Çağırıcı: kendi hedefini seçen ifrit) / 🌀 Hiçlik Paktı (Kumarbaz: rastgele hasar, hedefi yolun başına fırlatma)
- Druid — diken fırlatır · 🌿 Bataklık (Zehirci: alan zehiri + bataklık aurası) / ⚡ Fırtına (Seri Atış: 5 hedefe zincir yıldırım) / 🐻 Vahşi Şekil (Dönüşen: vahşi duyular → kurt → ayı)
- Keşiş — çok hızlı yumruklar, kamuflaj görür · 👊 Yumruk Yağmuru (Seri Atış: 10 vuruşta Titreyen Avuç) / 🖐 Açık El (Kontrolcü: sersemletme + geri itme) / ☀ Güneş Ruhu (Yıkıcı: büyü hasarlı ışık okları)
- Takım seçimi (loadout): haritaya girmeden 12 sınıftan 6'sını seç; zorluk (Kolay / Normal / Zor / Kâbus) can, altın, düşman canı ve elit dalga şansını belirler.
- Kahraman (6): her oyunda bir tane, oyun başında haritanın
heroStartkaresinde hazır başlar (yerleştirme adımı ve yan panelde ayrı kart yok;0tuşu ya da üstüne tıklamak paneli açar, satılamaz). Bir kule değil, karakter:WASD/ ok tuşlarıyla haritada yürür (yol üzerinde bile; duvar, çukur, dekor ve kule dolu kareye giremez), dokunmatikte panelden Yürü ile hedef kare seçilir. Her kahramanın her zaman açık bir pasifi veR(varsayılan; Ayarlar > Tuşlar) ile kullanılan aktif yeteneği var — kahraman auraları kule auralarıyla ÇARPILIR: - Şövalye Komutan — yakın dövüş (uçana vuramaz) · Pasif Liderlik: 140 px içindeki kuleler +%10 saldırı hızı · Savaş Narası: yakın kulelere 8 sn +%40 hasar (Öncü dalıyla düşmanı yavaşlatır/köklendirir)
- Veba Doktoru — iksir fırlatır, zehirler · Pasif Salgın: menzilinde ölen zehirli düşmanın zehri 55 px içindekilere bulaşır (zehir ölümleri XP yazar) · Veba Bulutu: alan zehiri + yavaşlatma (Karantina dalıyla şifa/çağırma/öfke bastırma)
- Gölge Okçu — uzun menzil, kritik, kamuflaj görür · Pasif Avcının Sabrı: yerinde durdukça saniyede +%6 hasar (tavan +%30), yürüyünce YARIYA iner · Av Hükmü: 260 px'teki en güçlü düşmanı 8 sn işaretler (+%50 hasar, %50 delme; ölürse bir kez atlar)
- Kronomant — yavaşlatan zaman ışını · Pasif Zaman Cebi: menzilindeki yavaş/donmuş düşmanlar Exposure +%15 · Geri Sarım: normal düşmanlar 2,5 sn donar ve 1 karo geri sarılır, elite/mini-boss yarım karo + %40 yavaş, boss %25 yavaş + 30 Sarsılma (Durağan Alan 60)
- Fırtına Kâhini — büyü, anlık · Pasif Statik Yük: her 35 px hareket +1 Yük (en çok 5), saldırı 1 Yük harcayıp ikinci hedefe %70 zincir · Zincir Fırtına: en yakın 6 düşmana yıldırım, her Yük +1 hedef ve +%10 hasar
- Kızıl Savaş Şefi — yakın dövüş (uçana vuramaz) · Pasif Savaş Öfkesi: aralıksız saldırdıkça kat başına +%6 hasar / +%4 hız (5 kat, 4 sn boşta söner); hasar aurası Cenk Davulu dalında · Hiddet Kasırgası: çevreye x2,5 fiziksel, küçükler savrulur ve sersemler, boss Sarsılır
- Seviye ve Özellik Ağacı: XP kaynakları kahramanın kendi öldürmeleri (bounty x1,2; kendi zehri/Entropisiyle ölenler dahil), menzilinde başkasının öldürdüğü düşmanlar (asist, x0,4) ve dalga sonu (12 + 1,5 x dalga). Eğri kasıtlı olarak dik (
HERO_XP: 80 x 1,30^(L-1), kahraman başınaxpMul) — botta seviye 10 yaklaşık 23.-25. dalga, dört kahramanda da (eskiden 11-18). Her seviye 1 Seviye Puanı verir;T(varsayılan) ile açılan kahramana özel ağaçta (3 dal x 4 düğüm, düğümler 1/1/2/3 puan, dal içinde sırayla) harcanır. 9 puanla en çok bir dal tamamlanır + iki küçük düğüm — oynanış tarzı seçimi: Şövalye Savaş Ustası / Komutan / Öncü · Doktor Zehirci / Aşındırıcı Simya / Karantina · Okçu Keskin Nişancı / Seri Atış / Gölge · Kronomant Zaman Büyücüsü / Arkana / Kronograf · Fırtına Kâhini Gök Gürültüsü / Statik Alan / Rüzgârın Sesi · Kızıl Şef Kan Baltası / Cenk Davulu / Durdurulamaz (js/data/hero_talents.js). - Elit dalgalar: 6. dalgadan itibaren rastgele mutasyonlar — Hızlı, Zırhlı, Kamuflajlı, Rejenere, Sürü.
- Zorluğa bağlı kampanya uzunluğu (2026-08-24): zafer hedefi Kolay 30 · Normal 45 · Zor 60 · Kâbus 100 dalga (
DIFFICULTIES[key].waves→g.waveGoal). 31+ dalgalar sonsuz üreticisinden gelir (Normal+ kampanyada bataklık/sümüklü/buz zombisi türleri de görünür); 30 sonrası HP üsteli yumuşar (1,035 → 1,025/dalga) ve bounty +%3/dalga büyür (HP-üstel/gelir-doğrusal makası kapanır; XP taban bounty'de kalır). Final dalgası garantili: hedef dalgada rotasyon yerine Dev Şeytan (60+: Dev Zombi eskortu, Kâbus 100: 3 Dev Şeytan). 31+ dalga şablonları: üretilen dalgalar rastgele çorba yerine duyurulan kompozisyonlarla gelir — ⚔ Sürü (kalabalık + sık aralık) · ⚔ Zırhlı Konvoy (tanklar + şaman eskortu) · ⚔ Akıncılar (yalnız hızlı türler, çok sık) · ⚔ Kara Ritüel (nekromant/şaman/iskelet) · Karışık. Elit mutatörler 30 sonrası 2'ye kadar yığılır (üst barda "Elit: 🛡 Zırhlı + 💨 Hızlı") ve elit dalgalar mutatör başına +%20 bounty öder — bedava zorluk değil, risk-ödül. - Sonsuz mod: hedef dalga zaferinden sonra "Sonsuz Moda Devam" — üretilen dalgalar, her 5'te bir boss; ilerleme HEDEFE GÖRE ölçülür (
best.endless= hedefin ötesindeki dalga sayısı, kartta "∞ +N"; "Sonsuz Yolcu" başarımı hedefin 10 ötesi; eski v1 kayıtlar otomatik göçer). - 6 harita: Eski Zindan → Lanetli Kripta → Şeytan Salonu → İkiz Geçit (iki giriş) → Portal Mağarası (ışınlayıcı) → Karanlık Mahzen (menziller %20 kısa, kuleler meşale gibi ışık saçar). Zafer sıradaki haritayı açar; madalya (🥉🥈🥇) can kaybına göre.
- Boss'lar: üstte can barı, giriş afişi + sarsıntı; Dev Şeytan ateş nefesiyle kuleleri susturur, Ogre yer sarsıntısıyla tuzakları kırar, Dev Zombi yürürken mini zombi doğurur, Ork Reisi Savaş Narası'yla yakın sürüyü hızlandırır, Nekromant ölünce iskeletleri öfkelendirir.
- Açıklama biçimi (2026-09-05): sınıf
descartık kısa rol metni (1-2 cümle) +tagsçipleri (rol/hasar tipi/özel not); yol listesi arayüzde veriden türetilir (kart ipucuclassTipHtml, önizleme paneli). K4 açıklamalarındaki "EFSANEVİ —" ön eki kaldırıldı; Efsanevi kademe önizlemede turuncu✦ Efsanevirozeti, kule panelinde mevcutEfsanevietiketiyle gösterilir. Kahramandesckısa rol metni; pasif/yetenek ayrıntıları kendi alanlarında. Oyuncuya görünen metinlerde uzun çizgi (—) kullanılmaz (kullanıcı kuralı; veri ve arayüz metinleri tarandı). - Takım ekranı yan önizleme paneli (2026-09-05): harita seçim ekranında sınıf/kahraman slotunun üzerine gelince (dokunmatikte tıklayınca) ayrıntılar artık küçük title ipucu yerine sağdaki
#pickPreviewpanelinde: büyük animasyonlu portre, ad, maliyet/tuş/hasar tipi, durum rozeti (Takımda / eklemek için tıkla / takım dolu / kilit nedeni), açıklama, temel değerler, 3 uzmanlaşma yolu x 4 kademe (ad, gerçek fiyat — K3 x1,5 — ve açıklama; K4 Efsanevi turuncu); kahramanda pasif + yetenek + özellik ağacı dalları.screens.jsrenderPreview/setPick, önizlenen slot.peekvurgusu; ≤900 px'te panel seçicilerin altına iner, ≤640 px'te yollar tek sütun. - Genç Ejderha sprite'ı (2026-09-05): yeşile boyanmış
big_demonyerinebig_demonüzerine geliştirilmişyoungdragon(32x36, idle 4 / run 4): zümrüt pullar, altın gözler, çatal boynuz yerine kalın geriye yatık kemik boynuzlar, gövdenin arkasından yükselen yarasa kanatları, sol bacağın arkasından çıkan kuyruk, karın ağzı yerine açık yeşil karın plakaları —tools/gen_extra_sprites.jsdragonize(baş tepesi / diş sıraları / ayak hizası kareye göre bulunur, damgalar yalnız saydam piksellere basılır). - Sorcerer, Warlock, Paladin ve Ozan sprite'ları (2026-09-05): Büyücü ile aynı
wizzard_m+ yarı saydam kızıl katman yerine gerçek palet değişimi —wizzard_mkarelerinin mavi cüppe/şapka pikselleri kırmızıya boyanmış ve sakalı kısaltılmışsorcerer,wizzard_fkarelerinin pembe-mora boyanmış, teni bir ton açılmışwarlock,knight_fkarelerinin mavimsi zırhı altın sarısına boyanmışpaladin,dwarf_fkarelerinin saç ve kıyafet renkleri takas edilmiş (pembe saç, sarı kıyafet)bardsprite'ı — Barbar ise Ozan'ın eskidwarf_mtasarımını aldı;assets/atlas_extra.png(karakter başına bir satır, 16x28, idle 4 / run 4 / hit 1), tanımlarjs/data/sprites_extra.js(src: "extra"→assets.jsek atlastan çizer), üreticitools/gen_extra_sprites.js(+tools/png.jssaf-node PNG kodlayıcı/çözücü;CHARSrenk eşlemeleri, önizleme PNG üretir). - Dalga playtesti (2026-09-05) —
tools/playtest.js(5 bot arşetipi x 6 harita x 3 zorluk x tohumlar; dalga başına can kaybı + boss öldürme oranı/süresi;--wavesetile A/B): eski tek dalga listesinde 15. dalganın Dev Zombi'si (2200 can, %60 kabuk, 10 can) hiçbir arşetipe ölmüyor, ilk kamuflaj sürüsü (8 tazı) ortalama 7 can alıyor, uçanlar dolambaçlı haritalarda giriş→çıkış düz hattan 4 sn'de geçiyordu. Değişenler: harita başına dalga seti (js/data/waves.jsWAVE_SETS: classic/crypt/demon/twin/portal/dark — tema birimleri, ≤9. dalgada 2 kamuflajlı öncü, farklı boss sırası), Ork Reisi (15. dalganın mini-boss'u;warcry), 4 tema düşmanı (Zırhlı Ork, Kemik Şövalyesi, Şeytan Çağırıcı, Hayalet), Dev Zombi 1800 can / kabuk tavanı %40 / 8 can (20. dalgaya; Kripta'da 15'te tek başına), Dev Şeytan 2600 can / nefes 120 px 2,5 sn / 15 can, uçan rota köşe keser (enemy.flyPathOf: her ikinci köşe atlanır, yer yolunun ~%75'i;map.flyWaypoints/flyPathsile elle rota; arena halkasında düz hat 0 uzunluktu), harita HP çarpanları 1,15/1,3/1,0/1,0/1,2, sağ panelde sıradaki dalga uyarıları (kamuflaj / uçan / boss). Bot sonucu: Kolay 90/90 zafer, Normal 87/90 (yalnız melee ağırlıklı bot kaybediyor), Zor arşetipe göre 2-16/18 yenilgi. - Düşman yetenekleri (2026-08-23): sıradan canavarlar da yetenek kullanır — İfrit/Küçük Şeytan 💨 Atılım (yolda ileri sıçrar), Ork Şamanı 🌫 Gölgelere Karışma (kısa süre kamuflaj — gören kule yoksa vurulamaz), Nekromant 👣 Gölge Yürüyüşü (yoldan çıkar: 1,6 sn hedeflenemez/vurulamaz, hızlı ilerler). Boss'lar canı azalınca 🔥 ÖFKELENİR (Ogre %50 → +%35 hız; Dev Zombi %50 → +%30; Dev Şeytan %40 → +%25 ve nefes sıklaşır). Dev Zombi'nin 🛡 Sertleşen Kabuğu her DİREKT isabette +%5 hasar direnci yığar (tavan %60, 1 sn vurulmayınca dökülür; DoT tıkı yığmaz, SAF hasar deler) — hızlı/zayıf vuranlar (Okçu, Keşiş) onu besler, tek seferde büyük vuran Büyücü/Barbar keser. Yetenek temposu zorluğa bağlı:
abilityCdMulKolay 1,3 · Normal 1,0 · Zor 0,8 · Kâbus 0,65. Sersem/donmuş düşman yetenek kullanamaz. Panelde düşman bayrakları arasında görünür. - Meta ilerleme: 15 başarım, Kahramanlık Puanı (zafer/sonsuz/başarım) ile Bilgi Ağacı (kalıcı hasar/hız/maliyet/altın/can/iade/sandık bonusları).
- Kayıt/devam: oyun her dalga sonunda ve her inşada kaydedilir; menüden "Devam Et".
- Ayarlar: ses/müzik seviyesi, hasar sayıları, ekran sarsıntısı, 4x hız. Kule taşıma (yatırımın %20'si).
- 6 harita x 30 elle tasarlanmış dalga (her haritanın kendi dalga seti ve boss sırası —
WAVE_SETS; + zorluğa bağlı hedef ve sonsuz üretici), 28 düşman türü: fiziksel dirençli iskeletler, büyü dirençli şeytanlar, kamuflajlı cehennem tazıları, iskelet doğuran nekromantlar, yavaşlatmaya bağışık buz zombileri, sümüklülere bölünen bataklık canavarları, tank sümüklüler, UÇAN harpi/kanatlı ifrit sürüleri ve Genç Ejderha, bölünen dev zombi ve final boss Dev Şeytan. - Hasar tipleri (fiziksel/büyü) ve dirençler D&D usulü: karışık savunma kurmak zorundasın.
- Boss sandıkları ve güçler (Bloons TD "Powers" tarzı): her boss/mini-boss ölünce bir sandık düşer. Kahraman üzerinden geçince otomatik açılır; sandığa tıklamak kahramanı oraya yürütür. Ulaşılamayan düşüşler en yakın yürünebilir zemine taşınır. İçinden tek kullanımlık bir güç çıkar ve canvas'ın sol altındaki çantada birikir:
Altın Yağmuru (anında altın) · Zaman Durdurma (5 sn herkes donar; boss 2,5 sn donar ve Sarsılma çubuğu dolar) · Kahramanlık Çağrısı (10 sn +%50 saldırı hızı) · Şifa İksiri (+5 can) · Diken Tuzağı (yola koy, 12 geçişe 40 hasar) · Yapışkan Tuzak (yola koy, 15 geçişe %50 yavaşlatma) · Göktaşı (seçtiğin noktaya 300 hasar).
Kontroller
| Girdi | İşlev |
|---|---|
1–6 | Takımdaki kule sınıfını seç (kart tıklamak da olur) · 0 kahramanı seç · R kahraman yeteneği · T kahraman özellik ağacı (varsayılanlar; Ayarlar > Tuşlar'dan değişir) |
W A S D / oklar | Kahramanı yürüt (basılı tut; çapraz da olur) |
| Sol tık | Yerleştir / seç · Shift ile zincirleme inşa |
Boş zeminden sürükle / Shift+tık | Çoklu seçim: yol başına toplu geliştirme · Toplu Taşı (grup hayaleti düzeni koruyarak imleci izler, tek tıkla atomik taşınır, bedel toplamı) · Toplu Sat (basılı tut ya da 1,5 sn içinde iki kez X) |
Sağ tık / ESC | İptal / seçim bırak / duraklat |
U / İ / O | Yol 1 / 2 / 3'ü geliştir |
X (veya Delete) / H | Sat: seçili kule ya da çoklu seçimdeki tüm grup (onay için 1,5 sn içinde tekrar X) / Hedef modu |
Boşluk | Sonraki dalga · dalga sırasında duraklat |
F2 | Hata ayıklama katmanı (ızgara, yol, FPS) |
| Üst bar | ikon + değer (game-icons.net SVG'leri, emoji yok): altın · can · dalga (yazı etiketi yok, ipucu hover'da) · başlat = sonraki dalga (+erken bonus) · döngü = otomatik dalga (açıkken altın sürüm + parıltı) · 1x/2x/3x hız · dişli = Ayarlar (oyunu durdurur; içinde "Menüye Dön") — ayrı Duraklat/Menü butonu yok, Escape/Boşluk duraklatır |
| Dokunmatik | Karta dokun → kareye dokun (önizleme) → aynı kareye tekrar dokun (yerleştir) · "Sat" ve "Toplu Sat" için basılı tut · Toplu Taşı: kareye dokun (önizleme) → aynı kareye tekrar dokun (taşı) · kahraman panelinde "Yürü" → kareye dokun |
Teknik
Vanilla JS + HTML5 Canvas, build adımı yok, file:// üzerinden çalışır (ES modülü/fetch yok, tüm veri .js globalleri). Sabit zaman adımlı simülasyon (60 tick/sn) — 1x/2x/3x hız simülasyonu değiştirmez. Ses efektleri assets/audio/*.ogg örnekleridir (Kenney CC0; manifest js/data/audio_bank.js, çalma js/engine/audio.js HTMLAudioElement ile, file:// uyumlu); örnek eksikse js/engine/sfx.js WebAudio sentezine düşer, müzik js/engine/music.js ile WebAudio'da üretilir. Konsolda DBG yardımcıları vardır (DBG.giveGold(1000), DBG.startWave(15) …).
Denge kıyaslaması: tools/bench.js (geliştirme; oyun yüklemez) sabit politikalı bir koşumdur: zayıf bir çekirdek savunma + ölçülen sınıfın 3 kulesi (derin yol K3 + çapraz K1), her dalga başında can sabitlenir ve 30 dalgadaki toplam kaçak ölçülür. Konsoldan BENCH.sweep(["wizard"], [1,2,3]) ile bir sınıfın 3 yolu tohumlu olarak kıyaslanır; yol değeri ne kadar düşükse o kadar güçlü. Yeni yol tasarlarken yolların aynı sınıf içinde ve sınıflar arasında ~15-50 bandında kalması hedeflenir (ekonomi yolları ayrıca econ toplam altınla okunur).
Headless testler (node, geliştirme): tools/headless.js oyun modüllerini DOM stub'larıyla yükler; node tools/hero_tests.js kahraman hareketi / pasifler / özellik ağacı / kayıt-devam için ~1060 doğrulama koşar (ikon dosyası varlık denetimi, otomatik kahraman başlangıcı, ekonomi frenleri, inşa kuralları, K4 + çağrı sistemi, 42 yolluk K4 duman testi ve bölüm 22'de V3 sistem kuralları + Sorcerer/Ölü Çağıran/uçan düşman/yeniden tasarlanan yollar dahil); node tools/hero_xp_bench.js [tohumlar] kahraman başına seviye 10'a ulaşılan dalgayı ölçer (hedef bant 22-26, 2026-08-23 ayarı 23-25; HERO_XP ya da xpMul değişince yeniden ölç). Özellik ağacı dengesi için ölçütler: yalnız kahraman skalası (L10 + dal, can ≤10 olunca durulan dalga) ve 25. dalga boss'una verilen hasar oranı — en iyi dallarla bigdemon: Şövalye %44, Doktor %49, Okçu %69, Kronomant %71.
Oyun sonu Savaş Raporu: her koşu js/game/stats.js (G.statsSys, veri g.stats'ta — koşu kaydına otomatik girer) ile detaylı istatistik toplar: sınıf/kahraman başına ETKİLİ hasar (overkill kırpılır; tek kapı effects.applyDamage'ın opts.src'si, DoT'lar efekt nesnesinde src taşır) + öldürme, altın kazanç/harcama kırılımı (ödül/dalga/gelir/erken/yetenek/güç/satış — kur/geliştir/taşı) ve can kayıpları (dalga/düşman türü/arena kapısı). Zafer/yenilgi modalı (hud.showEnd) bu raporu çizer. Co-op'ta sayaçlar yalnız kurucuda birikir (kuleler t.side damgalı); oyun sonunda /api/room/end istatistikleri konuklara aktarır (g.netEnd) ve modal oyuncu karşılaştırma tablosu (hasar/öldürme/kule/harcama/yetenek + kahraman seviyesi, MVP ★) gösterir. Doğrulama: node tools/stats_tests.js (atıf, overkill, ekonomi kimlik denklemi başlangıç + kazanılan − harcanan = kasa, sızıntı kırılımı, kayıt-devam).
Dil desteği (TR/EN): js/i18n.js dili seçer (?lang=en → localStorage dndtd.lang → lang çerezi → tarayıcı dili; Türkçe olmayan tarayıcı İngilizce açar) ve aktif sözlüğü TR olarak kurar: taban LANG_TR (js/data/lang_tr.js), üzerine LANG_EN (js/data/lang_en.js). Arayüz kodu her zaman TR.KEY okur; G.i18n.t(key, {n: 3}) yer tutucu doldurur. Oyun verisindeki adlar/açıklamalar (TOWERS, HEROES, HERO_TALENTS, ENEMIES, MAPS, DIFFICULTIES, MUTATORS, POWERS, ACHIEVEMENTS, PERKS) İngilizcede js/data/lang_en_data.js’teki DATA_EN katmanıyla yerinde değiştirilir (veri dosyalarından sonra yüklenir; kod def.name okumaya devam eder). Statik HTML metinleri data-i18n / data-i18n-html / data-i18n-title|placeholder|content öznitelikleriyle işaretlidir (G.i18n.applyDom). Dil değişimi (menüdeki düğme, Ayarlar > Genel, site çubuğundaki TR/EN) tercihi kaydeder ve sayfayı yeniden yükler; sunucu mesajları lang çerezine göre iki dilde döner (server/messages.js). Headless testler GAME_LANG=en node tools/hero_tests.js ile İngilizce modda da koşar; Bölüm 24 iki sözlüğün anahtar/yer tutucu eşliğini, DATA_EN kapsamasını ve HTML anahtarlarını denetler.
Responsive düzen: arayüz 1366x768 dizüstünden telefona kadar ölçeklenir. Menü ve harita seçimi akışkan ölçülerle (clamp()/min()) küçülür, sığmazsa kaydırılır; oyun canvas'ı js/ui/layout.js ile mevcut alana sığdırılır (en fazla 2x büyütme). Dikey ekranlarda (tablet/telefon) yan panel canvas'ın altına iner ve seçilen kulenin paneli görünür alana kaydırılır; kısa ekranlarda (≤800 px) yan panel kompakt moda geçer. Dokunmatikte "Sat" basılı tutma da çalışır.
Çevrimiçi site ve üyelik kademeleri
Arena lobisi ve senkronizasyon (2026-09-08): 2–4 oyuncu geniş lobide kahramanını ve altı farklı sınıfını seçip kadrosunu kaydeder. Hazır onayı sunucuda tutulur; seçim değişikliği oyuncunun, zorluk değişikliği herkesin onayını kaldırır. En az iki bağlı oyuncu ve tüm onaylar olmadan maç açılamaz. İlk dalga dahil her dalga öncesinde ayrıca herkes Hazırım der; dalga bittiğinde onaylar sıfırlanır. Çevrimiçi otomatik dalga ve erken çağrı bu adımı atlayamaz.
2 kişilik arena (merkez çıkışlı, 2026-09-12): her oyuncunun 10x16 karelik adası vardır; canavarlar kendi kapısından (batı/doğu) girer, adayı üst ve alt şeritten sarar ve ortadaki 2x2 çıkışa iner (tam tur yok; arenaPathSides, arenaExit, flyPaths; hpMul 0,5). Doğuşlar kenarlar arasında dönüşümlüdür (tek sayılı gruplar boss'ları tek kenara yığmaz), kahraman adasında kalır (şerit, köprü ve çıkış hücreleri kapalı). 3-4 kişilik arenalar halka düzeninde kalır. Altın kişiseldir: js/game/economy.js (G.econ) çevrimiçi co-op'ta kenar başına kasa tutar (g.goldBy, anlık görüntüde gb, oyun sonu goldBy); öldürme ödülü öldürenin, yağma/satış/taşıma kulenin sahibinin, inşa/geliştirme (kopya bedeli dahil) eyleyenin kenarına işler, dalga ödülü her kenara tam verilir; Savaş Raporu ekonomi bloğu yerel oyuncunun kendi kasasını gösterir. Can ortaktır. Can jetonuyla kurtarılan ortak kayıt tek yerel kasaya (kurucunun kasası) iner. Tek kişilik/sefer tek kasa olarak değişmez.
Kurucu oyun simülasyonunu yürütür. Katılımcılar sıralı görüntü paketlerinden kahramanları, kuleleri, çağrılan birimleri, atışları, durum etkilerini ve alan becerilerini çizer; hasar ve ödüller yerelde tekrar hesaplanmaz. Tek görüntü isteği uçuşta tutulur, başarısız gönderimde aynı sıra numarasıyla yeniden denenir, efektler onaydan önce kuyruktan silinmez. Görsel parçacık ve ağ kuyrukları sınırlıdır. SSE yeniden bağlandığında son sahne alınır; kısa kurucu bağlantı kopmasında oda 15 saniye korunur. Kopan katılımcının koltuğu 60 saniye saklanır; dönmezse çıkarılır ve kalan oyuncuların onaylarıyla devam edilir. Kapanmış oda sonsuz yeniden bağlantı yerine açık bir bitiş mesajı gösterir. Kurucu gerçekten ayrılırsa maç kapanır; kurucu aktarımı yoktur.
İzole kontroller: node tools/coop_server_tests.js, node tools/coop_ready_tests.js, node tools/coop_sync_tests.js, node tools/coop_lobby_tests.js, node tools/coop_chest_tests.js. Tarayıcı testi için node tools/coop_e2e_server.js yalnız geçici hesap/veri ve bellek kaydı kullanır: kurucu 8141, katılımcı 8142, karşılaştırma 8143. Gerçek sunucu verilerine dokunmaz. Sunucu kodu değiştiğinde Node işlemi, istemci kodu değiştiğinde tüm oyuncuların sayfası yenilenmelidir.
node server/server.js (port 8124) oyunu site kabuğuyla sunar: navbar, skor tabloları (haftalık + tüm zamanlar), forum, avatar, co-op Arena ve reklam rayları. js/net/online.js yalnız http(s)'te devreye girer; file:// oyunu etkilenmez.
Yetki katmanı (js/game/access.js, G.access): içerik erişimi üç kademedir — sıralama towers.js/heroes.js tanım sırası:
| Kademe | Sınıf | Kahraman | Reklam | Ek |
|---|---|---|---|---|
| Misafir (giriş yok) | ilk 6 | ilk 2 | var | skor/forum kapalı |
| Üye (ücretsiz, kayıt: kullanıcı adı + şifre) | ilk 9 | ilk 4 | var | skor tabloları, forum, avatar, Arena, VIP talebi |
Master (iç kimlik vip; yönetici talep üzerine verir, admin.html) | 14 (tamamı) | 6 | yok | isim yanında mor MASTER rozeti (tablo/forum/lobi) |
King (iç kimlik ultra; yönetici talep üzerine verir) | 14 (tamamı) | 7 (tamamı, Midas dahil) | yok | altın taçlı KING rozeti, forumda altın çerçeveli mesaj, Midas avatarı |
King (iç kimlik Ultra VIP, 2026-09-15; oyuncuya görünen adlar: VIP = Master, Ultra VIP = King, rozetler BADGE_MASTER mor mücevherli / BADGE_KING altın taçlı): VIP'in üstünde kademe. Sunucuda users[key].ultra + ultraSince; Ultra VIP her zaman VIP'tir (Ultra verilince VIP de verilir, VIP kaldırılınca Ultra da kalkar, Ultra kaldırılınca VIP kalır). Ayrıcalıklar: Ultra'ya özel kahraman Midas (HEROES.hero_midas.tier = "ultra"; istemci G.access.isUltraHero/allowedHeroes/heroReason, sunucu ULTRA_HEROES_SRV + heroAllowedSrv, co-op kurucu heroAllowedFor({vip, ultra})), forumda altın çerçeveli mesaj + ULTRA rozeti (.forumMsg.ultra, .ultraBadge; skor tablosu, navbar, lobi kartı), Ultra'ya özel Midas avatarı (ULTRA_AVATARS; /api/avatar 403 AVATAR_ULTRA_ONLY, kayıtta 400, okuma anında avatarShown Ultra değilse gizler; seçim ızgarasında kilitli hücre). Talep: POST /api/vip/request { note, tier: "vip"|"ultra" } (kullanıcı başına tek bekleyen talep, 409 ALREADY_ULTRA, 400 TIER_INVALID, eski satırlar vip sayılır); site Üyelik tablosunda dördüncü sütun + "Ultra VIP Talep Et", hesap penceresinde Ultra VIP düğmesi (showUltra). Yönetici: POST /api/admin/ultra { username, ultra }, panelde ayrı Ultra VIP sütunu (kaldırma satır içi onaylı), talep listesinde kademe çipi, özet kartı. Testler: node tools/admin_role_tests.js, node tools/admin_role_ui_tests.js.
Midas kahramanı (Ultra VIP, 2026-09-15): altın zırhlı, büyük altın kılıçlı kral; yürürken arkasında para izi bırakır. Pasif Altın Dokunuş vurduğu düşmanı yaldızlar, yaldızlı düşman kim öldürürse öldürsün ödülünün %25'i Midas'ın kasasına eklenir (dalga tavanı 55). Aktif Altın Lanet alandakileri altın heykele çevirir (boss'a Sarsılma), yaldızı ×1,5 yapar. Dallar: Hazinedar (yaldız süresi, zincir, haraç, Hazine Faizi; tavan 135 + faiz 15), Altın Kılıç (ağır düello), Heykeltıraş (yavaşlatma, Exposure, geniş heykel bahçesi). Motor: tower.js gildApply/gildGain/gildPayout (+ onHitCommon, useHeroAbility goldenCurse, heroOnWaveClear faiz, onWaveStart sayaç), enemy.js gildT/gildSrc/gildMul/statueT ve kill ödemesi (Artificer damgasıyla güçlü kaynak kuralı), fx.js goldBurst/goldLink/coinTrail, renderer.js büyük kılıç (weaponScale), para izi, altın ton/heykel; co-op anlık görüntüsü yaldız, heykel ve waveGild taşır. Görseller: tools/gen_extra_sprites.js (midas + weapon_midas_sword), geliştirme görünümleri tools/upgrade_hero_art.js, yetenek sahneleri tools/gen_midas_skill_art.js. Portre dosyası yok: önizleme sprite'a düşer. Ayrıntı ve bot ölçümü: KARAKTER_REHBERI 5.8. Test: node tools/hero_tests.js bölüm 30.
Kayıt ve üyelik (şimdilik e-posta doğrulaması YOK): kayıt yalnız kullanıcı adı + şifre (+ isteğe bağlı avatar) ister: POST /api/register { username, password, avatar? } → { user } (hatalar NAME_INVALID/PW_SHORT/NAME_TAKEN); doğrulama kodu, e-posta gönderimi ve /api/verify* uçları kaldırıldı. Giriş yapmış her hesap üyedir: skor, forum ve oda uçları yalnız oturum ister (eski hesaplarda kalmış email/emailVerified alanları yok sayılır, hesaplar olduğu gibi çalışır). userInfo = { name, avatar, vip, admin }; girişte users[key].lastLogin güncellenir. Üyelik sayfası karşılaştırma tablosudur (#tierTable); sınıf/kahraman ikonlarını showcase.js buildTierIcons doldurur (kademede kapalı olanlar soluk + ipucu).
Çok ajanlı inceleme düzeltmeleri (2026-08-29): (1) /api/me yanıtlanana dek yetki BELİRSİZDİR: G.online.ready() false iken G.access.tier() "offline" döner (kilit uygulanmaz — yoksa yarış penceresinde açılan harita seçimi üyenin kayıtlı kadrosunu misafir filtresiyle kalıcı bozuyordu); yanıt gelince refreshAccessUI() açık ekranı tazeler; 404 = API yok, 5xx/ağ hatası 3 kez yeniden denenir (geçici hata tüm kilitleri açmasın). (2) Resume kilit filtresinden MUAF: koşu kaydedildiği yetkiyle sürer (yarım filtre hem kadroyu eziyor hem kilitli kuleleri yine kuruyordu); togglePlacing canlı kilit yerine yalnız loadout üyeliğine bakar (oyun ortasında çıkış aktif kartları öldürmesin). (3) Arena/co-op sonuçları /api/score'a gitmez (sunucu 0-5 harita kabul eder; co-op /api/room/end taşır). (4) Kademe sınırlarının sunucu kopyası (CLASS_ORDER/HERO_ORDER_SRV/MEMBER_LIMITS) /api/room/config'i doğrular + kurucu applyCmd/onStart lobby vip bayrağıyla savunur (istemci kilidi konsoldan atlatılamaz).
Çevrimdışı (file:// ya da API'siz sunucu) TAM erişimlidir — kilitler yalnız çevrimiçi sitede uygulanır (tools/ ölçüm araçları ve headless testler etkilenmez). UI kilitleri screens.js (loadout/kahraman slotları), gerçek doğrulama state.startMap (UI atlatılsa bile filtreler); co-op tarafı coop.js myLoadout/myHeroId/renderHeroPick. VIP durumu sunucuda users[key].vip alanıdır; userInfo → /api/me|login|register ile istemciye gelir, skor tablosu/forum/lobi girişlerinde okuma anında u-anahtarından çözülür.
VIP (satış yok: talep + yönetici onayı): üye VIP talebi bırakır, yönetici panelden verir ya da reddeder. POST /api/vip/request { note? } (not ≤ 300 karakter, kontrol karakterleri ayıklanır) → { ok, request: { id, t, note, state: "pending" } }; kullanıcı başına tek bekleyen talep (409 REQUEST_PENDING), VIP zaten ise 409 ALREADY_VIP; GET /api/vip/request → { request } (kullanıcının son talebi ya da null). Talepler db.vipRequests dizisindedir: { id, u, name, note, t, state: pending|granted|dismissed, resolvedAt } (bekleyenler hep saklanır, çözülmüşlerden en yeni 200). /api/vip/redeem stub'ı kaldırıldı.
Yönetici hesabı ve uçları: ADMIN_USER + ADMIN_PASS ortam değişkenleriyle, bunlar yoksa server/admin.json ({ "user": "osi", "pass": "..." }; statik sunumdan gizli klasörde) ile açılan hesap kurucu yöneticidir. Şifresi her açılışta yapılandırmayla eşitlenir; bu hesabın yönetici rolü panelden kaldırılamaz (roleProtected). Yönetici erişimi (admin) ve VIP üyeliği (vip) bağımsızdır: birini vermek veya kaldırmak diğerini değiştirmez. Açılışta otomatik VIP verilmez; mevcut VIP ve sonradan verilen yönetici rolleri korunur. Panelde ayrı Yönetici ve VIP sütunları, ver/kaldır düğmeleri bulunur. Kurucu dışındaki yönetici kendi rolünü kaldırabilir; paneli hemen kapanır. /api/admin/* uçları oturum kullanıcısı admin ise YA DA (eski yol) ADMIN_KEY env tanımlı ve x-admin-key başlığı eşleşiyorsa açılır; aksi halde 403 FORBIDDEN (oturumsuz + başlıksız istek 401 LOGIN_REQUIRED):
GET /api/admin/summary→{ users, vips, admins, scores, forum, pendingRequests, week }GET /api/admin/weeks→{ weeks: [{ week, scores, players }] }skoru olan ISO haftalar (+ bu hafta, boş olsa da), en yeni önceGET /api/admin/leaderboard?week=2026-W36|all&limit=100→{ week, entries }o haftanın / tüm zamanların tablosu (kullanıcı başına en iyi giriş;board(week|null, limit)ortak,/api/leaderboardaynı kalır)GET /api/admin/users?q=&page=0&limit=50→{ total, page, limit, users: [{ name, created, lastLogin, vip, vipSince, admin, roleProtected, avatar, lifeTokens, scores, best, forum }] }kayıt tarihi desc,qad alt dizesi (büyük/küçük duyarsız), limit en çok 200POST /api/admin/role { username, admin: true|false }→{ ok, user: { name, vip, admin, roleProtected } }; kurucu rolünü kaldırmaya 409ADMIN_ROLE_PROTECTED. VIP değişmez.POST /api/admin/vip { username, vip: true|false }→{ ok, user: { name, vip, admin, roleProtected } }(404USER_NOT_FOUND; eski{ grant, revoke }gövdesi de çalışır; VIP verilince kullanıcının bekleyen talebi "granted" kapanır). Yönetici rolü değişmez. Rol ve VIP değişiklikleri yanıt dönmeden kalıcı kaydedilir; kayıt hatasında 503ADMIN_SAVE_FAILEDve geri alma uygulanır.GET /api/admin/vip-requests→ bekleyenler (eski önce) + son 50 çözülmüş;POST /api/admin/vip-requests/resolve { id, action: grant|dismiss }→{ ok }(404REQUEST_NOT_FOUND, çözülmüşe 409REQUEST_RESOLVED)
node server/server.js # kurucu yönetici yapılandırmadan okunur; VIP ayrı; panel: /admin.html
ADMIN_USER=Admin ADMIN_PASS=gizliSifre node server/server.js # ortam değişkeni verilirse admin.json yerine o kullanılır
DATA_DIR=/tmp/td-test node server/server.js # veri klasörünü değiştir (testler server/data/db.json'a dokunmaz)
curl -X POST -H "x-admin-key: gizli" -d '{"username":"ad","vip":true}' http://localhost:8124/api/admin/vip # eski anahtar yolu (ADMIN_KEY env)
Lobi davetleri: oda başlığındaki Davet bağlantısını kopyala ve Paylaş düğmeleri ?lang=tr|en&room=KOD bağlantısı oluşturur. Paylaş, desteklenen tarayıcıda cihazın paylaşım menüsünü açar; diğerlerinde kopyalar. Pano erişimi başarısızsa seçili bağlantı alanı açılır. Bağlantıyı açan oyuncuya oda kodu dolu katılım ekranı gelir; oturumu yoksa davet giriş/kayıt sonrasında korunur. Katılım ve hazır onayı oyuncunun kendi eylemidir. Üyelere açık POST /api/room/invite { code, lang, origin } → { url, scope, code } yalnız davet adresi döndürür. Yerel geliştirmede localhost yerine mevcut LAN IPv4 adresi seçilir; bu bağlantı aynı ağdaki oyuncular içindir. İnternette erişilen sitede site adresi kullanılır; Host başlığını değiştiren bir reverse proxy veya alt dizinden yayın kullanılıyorsa PUBLIC_URL=https://oyun.example/ (gerekirse alt dizin yolu dahil) ayarlanmalıdır. Bu seçenek sunucuyu kendiliğinden internete açmaz.
Site tanıtımı (2026-09-14): ana menüdeki canlı diyorama (renderer.js drawShowcase) korunur. Site sayfasındaki "Oyunu Keşfet" bölümü ve üç animasyonlu sahne kullanıcı isteğiyle KALDIRILDI (js/ui/showcase.js artık yalnız üyelik tablosunun karakter ikonlarını kurar; rAF döngüsü sahne olmadan da sürer). Alt bilgide developed by turkdeep satırı (.footerDev) ve lisans gereği "Katkılar ve lisanslar" ayrıntısı bulunur.
Reklam alanları (2026-09-14): site modunda üç yer tutucu: navbarın altında akış içinde üst şerit #adTop .adBanner (728×90; 767 px ve altında 320×50; yüksekliği --ad-top-h değişkeniyle oyun ekranından düşülür) ve 1340 px'ten geniş ekranlarda sabit sol/sağ raylar #adLeft/#adRight .adBox (160×600, şeridin altından başlar). VIP hesapta (html.site.vip) hepsi gizlenir ve oyun alanı tam genişliğe döner; file:// oyununda hiç görünmez. Gerçek reklam kodu .adBanner / .adBox kutularının içine konur (metinler HTML_AD_STRIP / HTML_AD_BOX anahtarları).
Görseller ve sesler
Hepsi CC0 (kamu malı; ikonlar hariç — CC BY 3.0):
- 0x72 DungeonTileset II v1.7 — sprite'lar, haritalar, karakterler
- Kenney Fantasy UI Borders — süslü panel/modal çerçeveleri (altın/bronz tonlu)
- Kenney UI Pack: RPG Expansion — parşömen butonlar, kılıç/eldiven imleçleri
- game-icons.net (CC BY 3.0 — Lorc, Delapouite, guard13007) — UI ikonlarının neredeyse tümü
assets/ui/icons/*.svg(~70 dosya; istisna:book.svg,tome_red/green/blue.svg,account.svg,help.svg,sound_on/off.svgprojeye ait 32x32 el çizimi ikonlardır, kitap ikonlarıbook.svg'nin renk kopyalarıdır: üst bar, 36 kule yolu, 12 kahraman dalı, mutatörler, düşman yetenek rozetleri, madalya/kilit/kupa/zar, canvas duyuru ikonları; indirme: raw.githubusercontent.com/game-icons/icons, arka plan karesi silinipfillrengi gömülür). HTML'deG.icon(ad)yardımcısı, canvas'taG.fx.floatText(..., icon)/G.assets.uiIcon(ad)kullanılır — UI'da emoji KULLANILMAZ (★☆✦⛃♥∞ gibi tek renkli tipografik glifler serbest) - Kenney RPG Audio, Impact Sounds, Interface Sounds, Music Jingles —
assets/audio/*.oggses efektleri
Asset'leri yeniden indirmek için: tools/download_assets.ps1 → tools/gen_sprites.ps1 → tools/download_ui_assets.ps1 → tools/prepare_ui_assets.ps1; sesler için tools/download_audio.ps1 → tools/prepare_audio.ps1.