Gönderen Konu: Lale Savaşçıları'nı yeniden yazalım  (Okunma sayısı 1211 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı dashersw

  • Retromanik
  • *****
  • İleti: 22
Ynt: Lale Savaşçıları'nı yeniden yazalım
« Yanıtla #30 : 12 Nisan 2025, 16:00:32 »
Ufak bir update: senaryo dosyalarında event'ler de length byte'la birlikte sadece sıralı olarak tutuluyorlar.

Senaryo dosyalari AmBk formatında demiştik, 20 byte header'ı var. Sonrasında 12 byte metadata var, asıl data 33. byte'tan başlıyor. Metadatanın ilk word'ü (2 byte'ı) senaryodaki event sayısını gösteriyor (haritadaki metadata olan odalarla örtüşüyor). Sonraki word'ü ilk event'in uzunluğunu gösteriyor (ama garip bir şekilde uzunluklar ikişer kere kaydedilmiş.). Neyse, arada birkaç ne idüğü belirsiz byte var, sonra ilk event'in uzunluğu 32. byte'ta. Dediğim gibi, 33. byte'tan itibaren bu uzunluk kadarını okuyunca ilk event'in bütün trigger ve metinlerine ulaşıyoruz. Sonra bir word atlıyoruz (bu duplike—ama 2 fazla—length byte'ı). Bir sonraki word yine uzunluk, sonra sıradaki event var.

Böyle böyle bütün event'leri düzgün parse edip görebiliyorum. Conditional event'lerin state machine'ini hala çözemedim, fakat 0x05'in soru, 0x08'in savaş olduğunu söylemiştim. Inventory'yi unutmuşum, 0x0409 da inventory'yi açıyor.

Örneğin üzerini aradığımız adamın üzerinden kısa zopa çıkıyor. Byte sekansı şöyle: 04 09 05 00 01 00 03 00 00 00 00. Biz bu ekranda 5 dolar, 1 kıvrık, bir de kısa zopa buluyoruz. Demek ki 3. byte dolar sayısı, 5. byte (belki word'dür) kıvrık sayısı, 03 de item olsa gerek. Memory'de kısa zopa 3. item'a denk geliyor, dolayısıyla hesap tutuyor gibi.

Bu arada 0xac de aslında caesar cipher'la encode edilmiş, aslında 0xb6, yani paragraf karakteri :))

Bunun için bir visualizer yazdım, elini yüzünü toplayıp atacağım. Fakat branching logic'i çözememek beni deli ediyor :)

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2996
  • Advanced User Simulator
    • ae unutmadan
Ynt: Lale Savaşçıları'nı yeniden yazalım
« Yanıtla #31 : 12 Nisan 2025, 17:14:09 »
belki şöyle random bir bilgi belki faydalı olur. Yanlış hatırlamıyorsam Amiganın veri yolu 16bit, adres yolu24bit. 68k registerlerı 32 bit ama veri yolu 16 olduğundan tek fetch'de 16'sı doluyor. Diğer taraftan adres yolu ise 24 bit, Bir adres depolanması gerektiğinde zaten 2 fetch gerekeceği için %95 ihtimalle adresi ya da offseti 32bit olarak saklıyorlar, fazladan görünen 00'lar ya da random byte'lar oradan gelebiliyor.

68K big endian olduğu için genelde sıfırlar başta oluyor, yani hex 00 00 00 0A görürsen büyük olasılıkla indeks 0A 'nın olduğu adreste değil de, ondan üç ya da 1 önceki adrestedir. en baştaki xx 00 00 0A xx olanda da çok nadiren random data bulunabilir çünkü eğer bu değer bir adres ise ilk byte çöpe gidiyor. registerin önceki değerinden kalma bir artifact olabilir.


Çevrimdışı dashersw

  • Retromanik
  • *****
  • İleti: 22
Ynt: Lale Savaşçıları'nı yeniden yazalım
« Yanıtla #32 : 12 Nisan 2025, 22:03:18 »
Biraz daha dig ettim. 04 bir şey gösterme demiştik, 0403 resimli bir şey gösterme. bundan sonra gelen 0d resim ID’si. İlk senaryoda 0403 iki kere geçiyor, birinde köpek, birinde baygın adam resmi var.

Daha sonra dedim ki bunları manipüle etmenin daha kolay bir yolu olmalı, böyle dosyayı değiştir diskete yaz yeniden başla falan çok uzun iş…

Neden daha önce denemedim bilmiyorum ama, Mac'te vAmiga kullanıyordum FS-UAE ile birlikte... vAmiga çok kullanışlı geldi... ama memory visualizer'ı biraz sıkıntılıydı. Konsolu da vardı ama pek önem vermemiştim. Bugün biraz daha baktım, konsolda direkt memory'ye erişip değiştirebiliyoruz... Önce daha önce bahsettiğim "inventory ekranı açma" sekansıyla oynadım, o dolarla kıvrık arasındaki byte mark'mış :))) 5 dolar, 10 mark, 30 kıvrık falan verilebiliyor. 03 de item gerçekten, başka bir item'la değiştirilebiliyor. Yanındaki word’e yeni bir item da eklenebiliyor. vAmiga makinenin anlık snapshot'ını alıp yüklemeyi de sağladığı için memory'deki byte'ları değiştirerek ne olduklarını görmek çok daha kolay hale geldi. Bu şekilde bu resim gösterme opcode’unu test ettim, gerçekten de tahminim doğruymuş, başka başka değerler vererek başka resimler göstertebiliyoruz :)

Fantastik gelişmeler gerçekten. State machine’i çözmeye çok az kaldı, bu haftasonu bunu bitirmek istiyorum. Tabii bu daha ilk bölüm. Event’leri uzunluklarına göre bölme işi her bölümde çalışıyor ama ilk bölümün haritasındaki 1111 1112 şeklinde giden metadatalar ileriki bölümlerde daha farklı. Orada belki başka opcode’lar da olacaktır.

orijinal baygın adam:

silikonbaba: 


--------

Bu arada resimleri küçük göstermenin bir yolu yok mu ya? Bulamadım forumda :(

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2996
  • Advanced User Simulator
    • ae unutmadan
Ynt: Lale Savaşçıları'nı yeniden yazalım
« Yanıtla #33 : 13 Nisan 2025, 01:34:24 »
Mükemmel!

bittiğinde bize de tam bir dökümantasyon sağlayabilirsen sevinirim.

Resim konusunda, forum yazılımımız biraz eski, işletim sistemimiz de epey eski ondan güncelleyemiyoruz. işte muhabbet biraz yavaş gitse yeni sunucuya taşınacağım, ama henüz mümkün olmadı. Yani sonuç olarak telefon ekranlarında bit kadar görünmesin diye bir responsive tema kullanıyoruz. O tema resimleri böyle büyütüyor bazen, bilen birinin uğraşması lazım ama sıkıcı işler olduğundan ben bakmadım :D

Yeni versionda bu sorunların olmadığını umarak katlanıyrouz. Yani aslında imaj büyüklüğünü ayarlamak mümkün ama çok çetrefilli, önce normal şekilde imajları yükleyip gönderiyi yazıp gönderiyorsun, sonra edit diyorsun, üretilen imaj url'lerini copy ediyorsun bir yere sonra attachment olarak değil de IMG olarak geri ekliyorsun falan IMG tag'inde width propertisi var istediğin büyüklüğe getiriyorsun ama uğraşmaya değer mi bence değmez :D

Bir alternatif de göndermeden önce resimleri küçültmek.

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 187
Ynt: Lale Savaşçıları'nı yeniden yazalım
« Yanıtla #34 : 13 Nisan 2025, 06:44:16 »
Sizlere bir sürpriz yapayım dedim ama beceremedim. :) İstanbul Efsaneleri'nin 1995 yılında çıkan mavi kutu kapağı/posterini yapan kişi arkadaşımdır. Kendisinden duruyorsa orijinal çalışmasını isteyecektim ki daha İstanbul Efsa... demeye kalmadan epey bir tepki aldım. :) Detaylara girmeyeceğim ama anlaşılan geliştiren ekiple iyi ayrılmamışlar. Paylaşmak istemedi. Preservation konusundan Unesco'ya varıncaya kadar bahsettim, "gidin yeni oyun yapın, uğraşmayın böyle şeylerle" gibi laflar etti, ben de daha çok üzerine gitmedim. :D

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2996
  • Advanced User Simulator
    • ae unutmadan
Ynt: Lale Savaşçıları'nı yeniden yazalım
« Yanıtla #35 : 13 Nisan 2025, 19:59:51 »
Sizlere bir sürpriz yapayım dedim ama beceremedim. :) İstanbul Efsaneleri'nin 1995 yılında çıkan mavi kutu kapağı/posterini yapan kişi arkadaşımdır. Kendisinden duruyorsa orijinal çalışmasını isteyecektim ki daha İstanbul Efsa... demeye kalmadan epey bir tepki aldım. :) Detaylara girmeyeceğim ama anlaşılan geliştiren ekiple iyi ayrılmamışlar. Paylaşmak istemedi. Preservation konusundan Unesco'ya varıncaya kadar bahsettim, "gidin yeni oyun yapın, uğraşmayın böyle şeylerle" gibi laflar etti, ben de daha çok üzerine gitmedim. :D

aah bu büyük şanssızlık, normalde gençler birlikte iş yapınca para konusu ikinci planda kalır diye düşünür insan. biraz gençlik aç gözlülüğü biraz da baştan anlaşmayı ciddi şekilde yapmayınca yani sonuçta bir "business" bu, fakat kabul etmek lazım, oyun yapıyorken pek ilerisini düşünmüyor insan. belli ki arkadaşın hakkı yenmiş, ama sözleşme (muhemelen sadece bir el sıkışmadan ibarettir) ileride yürünecek yolu kapsamadığından yapacak birşey de yok, kırık kalp ya da söylenmiş kötü sözlerle bitmiştir.

Olur öyle şeyler diyoruz (shit happens baabında) ne diyelim.

Çevrimdışı dashersw

  • Retromanik
  • *****
  • İleti: 22
Ynt: Lale Savaşçıları'nı yeniden yazalım
« Yanıtla #36 : Dün, 11:17:13 »
Bakın ne buldum :))

https://gitlab.com/amigasourcecodepreservation/ultimate-amos/-/raw/master/pdf/ultimate-amos-1994-holborn.pdf

 
 
 


Bizimkiler bu kitaptan etkilenmişler midir acaba? :)) sadece iki sayfa ayırmış kitap ama...

Çevrimdışı dashersw

  • Retromanik
  • *****
  • İleti: 22
Ynt: Lale Savaşçıları'nı yeniden yazalım
« Yanıtla #37 : Dün, 11:26:44 »
Evet... haftasonumun çoğunu buna verdim ama sonunda sanıyorum bütün opcode'ları çıkardım, state machine'in nasıl çalıştığını çözdüm...

Detaylı analizi daha sonra paylaşacağım yazdığım tool'larla beraber. Bir sürü şey (doğal olarak) sandığım gibi değilmiş.

Şimdilik sizinle ilk bölümün ilk event'i olan köpek dövüşünün senaryosunu paylaşıyorum:

Kod: [Seç]
[
  {
    instruction: 'triggerBeforeEnter', // 0x01
    condition: {
      variable: 0x01,
      equals: 0x01,
      jumpOverIfTrue: 0x01
    }
  },
  { instruction: 'enter' }, // 0x04
  { instruction: 'displayText', text: 'disaridan garip hiriltilar geliyor... gercekten disari cikacak miyiz?' }, // 0x02
  {
    instruction: 'askQuestion', // 0x05
    question: ['Evet', 'Hayır']
  },
  {
    instruction: 'conditionalJump', // 0x01
    condition: {
      variable: 0x02,
      equals: 0x01,
      jumpOverIfTrue: 0x01
    }
  },
  { instruction: 'break' }, // no condition 0x10
  { instruction: 'enter' }, // yes condition (with jump) 0x04
  { instruction: 'finalState' }, // 0x0e00
  {
    instruction: 'conditionalJump', // 0x01
    condition: {
      variable: 0x01,
      equals: 0x01,
      jumpOverIfTrue: 0x02
    }
  },
  { instruction: 'displayText', text: 'burada olu bir kopek yatiyor...' }, // false condition 0x02
  { instruction: 'enter' }, // 0x04
  { instruction: 'displayImage', image: 0x0d }, // 0x03
  { instruction: 'displayText', text: 'hiriltilar bundan geliyormus !!!' }, // 0x02
  { instruction: 'startFight', enemies: [{ id: 0x0d, count: 1 }] }, // 0x08
  { instruction: 'displayTextWithFace', face: null, text: 'ne dellenmis ki bu hayvan yahu?' }, // 0x11
  { instruction: 'setVariable', variable: 0x01, value: 4 } // 0x07
]

Bununla senaryoların büyük bir çoğunluğu çözülebiliyor. vAmiga ile memory'deki her byte'ı anlık olarak değiştirip ne yaptığını inceledim, jump komutlarıyla senaryoların rastgele yerlerine gitmek çok keyifliydi :) Daha sonra 2. 3. bölüm senaryolarıyla çakıştırdım.

Şimdilik bu işimizi görüyor gibi. Engine tarafında her şey deterministik. Sadece içime sinmeyen tek heuristic, o da aslında doğal, bir event'te tek bir 0x04 yani "tile'a girildi" opcode'unun işlenmesi. Bir de eğer tile'a girme trigger'ı yoksa, girildi opcode'unu bulana kadar devam ediyor.

Aşağıya 1. senaryonun raw hex halini paylaşıyorum, yukarıdaki tanımlarla takip edebilirsiniz diye umuyorum. Dosyada 32 byte header var.

Kod: [Seç]
41 6d 42 6b 00 64 00 01 80 00 02 eb 44 61 74 61
20 20 20 20 00 05 00 e8 00 13 00 6a 00 e4 00 e6
0d 00 01 01 01 01 04 02 47 5a 3f 49 57 68 3f 5a
57 64 16 5d 57 68 5f 66 16 5e 3f 68 3f 62 6a 3f
62 57 68 16 5d 5b 62 5f 6f 65 68 24 24 24 ac 5d
5b 68 39 5b 61 6a 5b 64 16 5a 3f 49 57 68 3f 16
39 3f 61 57 59 57 61 16 43 3f 4f 3f 50 16 35 ac
05 04 05 5b 6c 5b 6a 5e 57 6f 3f 68 01 02 01 01
10 04 0e 00 01 01 01 02 02 1e 58 6b 68 57 5a 57
16 45 62 4b 16 58 5f 68 16 61 45 66 5b 61 16 4f
57 6a 3f 6f 65 68 24 ac 04 03 0d 02 21 5e 3f 68
3f 62 6a 3f 62 57 68 16 38 6b 64 5a 57 64 16 5d
5b 62 5f 6f 65 68 63 6b 49 16 17 17 17 ac 08 00
0d 01 00 00 00 00 11 00 20 64 5b 16 5a 5b 62 62
5b 64 63 5f 49 16 61 5f 16 58 6b 16 5e 57 6f 6c
57 64 16 6f 57 5e 6b 35 ac 07 01 04 0f 00 04 00
00 b9 00 13 00 0b 00 b5 00 b7 0d 00 04 0e 00 01
01 02 03 03 20 11 00 1d 38 6b 16 5e 5b 68 5f 5c
16 5e 57 62 57 16 57 6f 3f 62 63 57 63 3f 49 16
63 3f 16 35 ac 04 03 20 02 36 58 6b 68 57 5a 57
16 58 57 6f 5d 3f 64 16 58 5f 68 16 57 5a 57 63
16 6f 57 6a 3f 6f 65 68 24 24 24 ac 4b 69 6a 4b
64 4b 16 57 68 57 6f 57 62 3f 63 16 63 3f 35 ac
05 04 05 5b 6c 5b 6a 5e 57 6f 3f 68 01 02 01 01
04 09 05 00 01 00 03 00 00 00 00 01 01 02 01 04
11 00 21 38 3b 6f 62 5b 68 16 58 6b 68 57 5a 57
16 58 5f 68 16 57 64 57 5e 6a 57 68 16 58 6b 62
5a 6b 63 ac 07 02 04 0f 00 04 00 00 84 00 0d 00
7c 00 7f 00 82 0d 00 01 01 02 05 02 29 65 6a 65
66 57 68 61 6a 57 64 16 39 3f 61 63 57 61 16 5f
69 6a 5b 5a 5f 3d 5f 64 5b ac 5b 63 5f 64 16 63
5f 69 5f 64 35 ac 05 04 05 5b 6c 5b 6a 5e 57 6f
3f 68 01 02 01 01 10 0b 02 02 98 03 11 01 29 58
6b 16 41 57 66 3f 16 41 5f 62 5f 6a 62 5f 24 ac
57 64 57 5e 6a 57 68 16 5d 45 68 5b 64 16 65 62
5a 6b 16 63 6b 16 35 ac 10 0e 00 04 0f 00 04 04
00 00 32 00 06 00 0b 00 2e 00 30 0d 00 04 0e 00
11 03 1d 58 6b 68 57 69 3f 16 57 63 63 57 16 66
5f 69 16 61 65 61 6b 6f 65 16 58 5b 5b 16 17 ac
04 0f 00 04 00 00 80 00 10 00 5a 00 7c 00 7e 0d
00 01 01 51 01 04 02 21 39 3f 61 63 57 61 16 5f
69 6a 5b 5a 5f 3d 5f 64 5a 5b 64 16 5b 63 5f 64
16 63 5f 69 5f 64 16 35 ac 05 06 07 5b 63 5f 64
5f 63 5a 5b 3d 5f 62 5f 63 01 02 01 01 10 02 10
5f 6f 5f 16 45 6f 62 5b 16 65 62 69 6b 64 24 ac
04 0e 00 01 01 51 01 04 02 16 39 3f 61 6a 3f 61
16 5f 49 6a 5b 16 64 1d 65 62 59 5b 61 16 35 ac
07 51 04 0f 00 04 00

Bu arada en sevdiğim şey "display face with text" oldu. Konuşma sekanslarını gruptan birine yaptırmak için karakter parametresi alıyor, null verilirse random bir karaktere söyletiyor :))

Çevrimdışı dashersw

  • Retromanik
  • *****
  • İleti: 22
Ynt: Lale Savaşçıları'nı yeniden yazalım
« Yanıtla #38 : Dün, 12:19:17 »
Tabii sürekli "bu adamlar bu formatı kendileri mi icat ettiler" diye düşünüp durdum. Bir iki mesaj önce gönderdiğim kitaba da öyle denk geldim, yani belki bir tool vardır filan common sense kullanılan diye. Bir ara yanılmıyorsam @Ref bunlar AMOS Pro ile okunur gibi bir şey demişti... Şöyle bir kaynak var: https://amospromanual.dev/14-appendix-e-memory-bank-structures.html#05-work-banks-and-data-banks-stored-on-disc, belki biliyorsunuzdur.

Belki bu kısımda @Ref yardımcı olmak ister :) ben AMOS Pro 2.0 diskini açtım ama bir DIM yazıp save ettirip dosya neye benziyor diye bakana kadar akla karayı seçtim ;D

Neyse, çok keyifli bir serüvendi... şimdi artık iş ciddiye binebilir. Elimizde teoride bütün haritalar ve bütün senaryolar programlanabilir bir şekilde var. Ben arkada kart oyunu için bir combat engine zaten yazdım, aparılabilir. Inventory management, art work, biraz güzel savaş mekaniği... karakter yaratma vs... elimizdeki işler bunlar :)

2. level'ı da yapıp Özgür'ün kapısında dayanalım diyorum :)

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2996
  • Advanced User Simulator
    • ae unutmadan
Ynt: Lale Savaşçıları'nı yeniden yazalım
« Yanıtla #39 : Dün, 15:57:15 »
Bakın ne buldum :))

https://gitlab.com/amigasourcecodepreservation/ultimate-amos/-/raw/master/pdf/ultimate-amos-1994-holborn.pdf

Bizimkiler bu kitaptan etkilenmişler midir acaba? :)) sadece iki sayfa ayırmış kitap ama...
AAa süpermiş :D
Bu hiç zor birşey değil, çocukların buna ihtiyacı olduğunu sanmıyorum. Ben ortaokuldayken yapmıştım bunu kendim çocuk aklımla.
konumuzla alakalı değil ama bundan ben de yapayım diyen varsa, şu videodaki adamı izledim geçen, bence bu sistemi en güzel anlatan bu arkadaş. Hem de bu videoda biraz daha akıllı bir sistemi geliştiriyor, görünmeyen blokları basmaya gerek kalmıyor, çizim hızlanıyor tabi. https://youtu.be/7L3hlafPcAU?t=327

Alıntı
Evet... haftasonumun çoğunu buna verdim ama sonunda sanıyorum bütün opcode'ları çıkardım, state machine'in nasıl çalıştığını çözdüm...

Detaylı analizi daha sonra paylaşacağım yazdığım tool'larla beraber. Bir sürü şey (doğal olarak) sandığım gibi değilmiş.

Armağan hocam, bakın bu türk retro aleminde nadir görülen anlardan biri. Şu forumun kurucularından biriysem tek sebebi bu andır :D 10 senedir forumun açık kalmasının sebebi bu küçük anlar. Tamam o da gerekli ama sadece onu aldım bunu sattımın domine ettiği bir retro kültürü beni çok darlıyor.  Bu gibi projelerin meyve vermesi nefes aldırıyor işte.

Alıntı
Tabii sürekli "bu adamlar bu formatı kendileri mi icat ettiler" diye düşünüp durdum.
yok hayır, zaten exe dosyadaki gömülü bankar data bank olarak kullanılmış. Fakat databank kesintisiz bir bellek alanı aslında. 1D bir array'den farkı yok. Veri formatı kendi icatları büyük ihtimal, yani zaten kompleks structlar değil bunlar, kağıt üzerinde hardcoded şekilde de halledilebiliyorlar. Yani oyun haritasını iff imajda saklamayı tercih eden adamlar neler yapmaz :D Benim tahminim oyun anında array'e yüklüyorlardır, ham şekilleri databankta duruyordur. Bu sebeple databanktaki dizilim array'i yansıtıyordur. Bu bir tahmin. Bu arada aslında Amos'da @doMiNO benden daha iyidir, şu ara aklı başka yerde, uzaktan izliyor :)

neyse sonuç olarak akşam databanklı, farklı dim'lere sahip compile edilmiş bir amos denemesi yapar koyarım buraya.