Tower and Defense

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)

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.

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

💥 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

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–6Takı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 / oklarKahramanı yürüt (basılı tut; çapraz da olur)
Sol tıkYerleş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 / İ / OYol 1 / 2 / 3'ü geliştir
X (veya Delete) / HSat: seçili kule ya da çoklu seçimdeki tüm grup (onay için 1,5 sn içinde tekrar X) / Hedef modu
BoşlukSonraki dalga · dalga sırasında duraklat
F2Hata ayıklama katmanı (ızgara, yol, FPS)
Üst barikon + 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
DokunmatikKarta 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ı:

KademeSınıfKahramanReklamEk
Misafir (giriş yok)ilk 6ilk 2varskor/forum kapalı
Üye (ücretsiz, kayıt: kullanıcı adı + şifre)ilk 9ilk 4varskor tabloları, forum, avatar, Arena, VIP talebi
Master (iç kimlik vip; yönetici talep üzerine verir, admin.html)14 (tamamı)6yokisim yanında mor MASTER rozeti (tablo/forum/lobi)
King (iç kimlik ultra; yönetici talep üzerine verir)14 (tamamı)7 (tamamı, Midas dahil)yokaltı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):

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):

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.