Dagaz: A Persistence Story

Setiap teknologi yang cukup maju tidak dapat dibedakan dari sihir.
Arthur Clark
 
- Saya tidak ingin menjadi pembanding lagi ... Jadikan saya metafora.
China Mieville


Bekerja pada proyek besarmirip dengan penyelaman metro . Memecahkan masalah tertentu, kami membuka peluang baru. Seiring waktu, peluang ini tumbuh lebih kuat, terhubung dengan peluang lain dan ini memungkinkan kami untuk menyelesaikan masalah lama, jauh lebih penting dan kompleks dengan cara baru yang sama sekali tidak terduga. Saya punya contoh yang bagus tentang hal ini. Dan saya ingin berbicara tentang dia.

Modul pengaturan umum dikandung sebagai alat debugging sederhana. Seringkali, sangat berguna untuk dapat kembali ke posisi tertentu untuk melokalisasi masalah. Tetapi pengaturan angka ini muncul dalam permainan dengan cepat, dan pemulihannya layak dilakukan. Saya membutuhkan alat untuk mengotomatiskan proses ini, dan saya melakukannya. Bahkan, saya dapat dengan mudah menyandikan posisi apa pun dengan menjelaskan lokasi bagian di papan tulis:

? setup = 0c3; 0a2; 0c2; 0d2; 1a1; 4b1; 5c1; 1d1; -1a4; 4b4; 5c4; 1d4; 0a3; 0d3; 0b2 ;; & turn = 0

Lalu, saya bisa menambahkan parameter ini ke url untuk mereproduksi posisi. Inilah yang dilakukan oleh pengaturan umum. Modul ini menyimpan deskripsi dari semua posisi perantara dalam log dan memungkinkannya untuk mereproduksi mereka. Ini bukan mekanisme yang sangat sempurna. Misalnya, deskripsi seperti itu tidak memberi kita apa-apa jika kita tidak tahu game miliknya mana. Ada kekurangan lainnya, yang akan saya bahas nanti. Sekarang, saatnya untuk bertemu peserta berikutnya dalam cerita kita.


Opsi tingkat progresif datang dari Zillions of Games dan untuk waktu yang lama saya tidak mengerti mengapa itu diperlukan. Cobalah untuk mematikan semua bola lampu (sederhana) dan Anda akan mengerti apa yang saya bicarakan. Setelah pemain menang, level progresif melihat url saat ini, dan jika ia menemukan nomor di dalamnya, tambahkan satu per satu. Sebenarnya, ini adalah cara yang bagus untuk melibatkan pemain, tetapi kemampuannya tidak terbatas pada ini. Ada game yang terdiri dari beberapa putaran. Setelah selesai, pemain, sesuai aturan tertentu, mendistribusikan kembali potongan dan mulai bermain lagi.


Pendekatan ini sering dilakukan dalam mankali Afrika . Di Ovalhu , misalnya, gim tidak hanya dimulai lagi. Pemain menggunakan butiran yang ditangkap di babak sebelumnya untuk mengisi lubang mereka pada awalnya. Lubang yang gagal diisi dianggap keluar dari game, mereka tidak dapat digunakan. Bahkan, di setiap babak permainan baru dimainkan, di papan baru. Hanya ketika kalah di babak berikutnya, pemain tidak bisa mengisi setidaknya satu lubang, kekalahan terakhirnya diakui.

Peluang ini bisa dipahami jauh lebih luas.

, . common-setup . , , , . , .


, . «» , . , "Magyar Dama" ( , «»), Hive, , . , , , , , .


( , roguelike-). «», seed, . , ( ). (, ), .


, , . . "", , , , .

Langkah selanjutnya diambil hampir secara tidak sengaja. Ada suara di gim saya. Saya sangat suka dia, tetapi mungkin ada orang di dunia yang dia jengkel. Bagi mereka itu adalah mungkin untuk mematikannya. Tampaknya ini bekerja dengan baik, tetapi pengaturan tidak disimpan di mana pun dan setelah setiap halaman menyegarkan suara harus dimatikan lagi (dan ini bahkan lebih mengganggu). Saya diminta untuk memperbaiki masalah ini dan solusi pertama yang muncul di benak saya adalah cookie (solusi pertama tidak selalu berhasil).

Begini tampilannya
Dagaz.Controller.sound = function() {
    if (Dagaz.Controller.soundOff) {
        sound.innerHTML = "no Sound";
        Dagaz.Controller.soundOff = false;
        document.cookie = "dagaz.sound=on";
    } else {
        sound.innerHTML = "Sound";
        Dagaz.Controller.soundOff = true;
        document.cookie = "dagaz.sound=off";
    }
}

Saya tidak ingin membuang sampah sembarangan, jadi cookie itu berumur pendek sampai jendela browser ditutup. Dan kemudian saya berpikir: "mengapa tidak mengajarkan pengaturan umum untuk disimpan dalam cookie juga?" Saya harus mengatur parameter usia maks , tapi itu sepadan. Pertama, kondisi permainan sekarang disimpan ketika jendela ditutup secara tidak sengaja. Sebagai bonus, mengganti mode game dengan AI / no AI bot juga tidak mengatur ulang game. Tadi sangat menyenangkan!

Tentu saja, saya harus menyediakan sesuatu yang lain
, , , , cookie ( ). «New game», . . , common-setup , ? cookie ( , ).

-
var getName = function() {
  var str = window.location.pathname.toString();
  var result = str.match(/\/([^.\/]+)\./);
  if (result) {
      return result[1].replace("-board", "").replace("-ai", "");
  } else {
      return str;
  }
}

var badName = function(str) {
  var result = str.match(/[?&]game=([^&*]*)/);
  if (result) {
      return result[1] != getName();
  } else {
      return true;
  }
}

var getCookie = function() {
  var str = document.cookie;
  var result = str.match(/dagaz\.(setup=[^*]*)/);
  if (result) {
      var r = decodeURIComponent(result[1]);
      if (badName(r)) return "";
      return "?" + r;
  } else {
      return "";
  }
}

var getSetup = function() {
  var str = window.location.search.toString();
  var result = str.match(/[?&]setup=([^&]*)/);
  if (result) {
      return result[1];
  } else {
      str = getCookie();
      result = str.match(/[?&]setup=([^&]*)/);
      if (result) {
          return result[1];
      } else {
          return "";
      }
  }
}

Dagaz.Model.getSetup = function(design, board) {
  var str = "";
  ...
  str = str + ";&turn=" + board.turn;
  if (Dagaz.Controller.persistense == "setup") {
      var s = str + "&game=" + getName() + "*";
      var maxage = getMaxage();
      if (maxage) {
        document.cookie = "dagaz.setup=" + encodeURIComponent(s) + "; max-age=" + maxage;
      } else {
        document.cookie = "dagaz.setup=" + encodeURIComponent(s);
      }
  }
  return "?setup=" + str;
}

, . , ( Pasang Chaturanji) , , , (Morris, Bolotoudou) common-setup , . , !


. ( , ). , Stratego Luzhanqi, ( ). (common-setup, , ), …


, , , common-setup , . ( Mana, , ), , .

, , . , random, c seed , , , - . , seed cookie, , , , .

Sayangnya, ada permainan yang metode penyelamatannya oleh modul pengaturan umum tidak cocok. Dalam Kamisado yang disebutkan di atas , kemampuan untuk menyelesaikan gerakan (untuk semua gerakan kecuali yang pertama) tergantung pada bidang mana langkah sebelumnya diselesaikan. Ada permainan dengan mekanisme yang lebih kompleks:


Di Mill , selain dari gerakan biasa, ada bonus - jika seorang pemain telah mengatur tiga bagiannya secara berurutan, ia memiliki hak untuk menghapus satu bagian lawan dari papan. Selain itu, aturan melarang membangun triplet yang sama dua kali berturut-turut. Semua ini berarti bahwa agar gim bekerja dengan benar, Anda harus menyimpan riwayat gerakan sebelumnya. Untungnya, ada peluang seperti itu.

Modul manajer sesi menyimpan sejarah gim, memungkinkan pemain untuk mundur satu gerakan atau lebih, mungkin melakukan gerakan lain. Juga, opsi penasihat dikaitkan dengan mekanisme ini, yang memberi tahu pemain kemungkinan bergerak saat bermain dengan bot. Dalam retrospeksi, ide untuk menyelamatkan sejarah gim dalam cookie tampak jelas, tetapi saya tidak langsung membahasnya.

Game korespondensi pertama kali muncul
Dagaz . - , "Zillions of Games", 1998 . 2003 Zillions , , . Ed van Zon . "MindSports", .


MindSports Dagaz . Ed , Java-, , , . , Ed Dagaz, .

, , , , . , Dagaz, , - backend-, JavaScript- . Ed session-manager, . , , , , , , ( , ), , .

SGF , , session-manager , SGF . , , , , SGF ( , ). , MindSports, , 80 Dagaz .

Langkah selanjutnya cukup jelas - saya mulai menyimpan deskripsi SGF dari pihak dalam cookie, dan kemudian mereka mengatakan kepada saya bahwa itu tidak terlalu modern dan saya memindahkan semuanya ke localStorage (ini menyederhanakan kode dan menyelesaikan beberapa masalah debugging di Google Chrome). Pada titik ini, pembaca mungkin memiliki pertanyaan. Saya memiliki dua mekanisme untuk tujuan yang sama, dan salah satunya lebih sempurna daripada yang lain. Mengapa tidak mengalihkan semua game ke ketekunan sesi? Sayangnya, ini tidak sesederhana itu.

Ada seluruh keluarga permainan yang sesi tabungannya tidak berlaku:

  1. (Shatranj, Sittuyin, Janggi, Stratego, Luzhanqi, Banqi )
  2. , session-manager (Ur, Puluc, Shen, Backgammon, Chaturaji )
  3. (Kamisado, Washington, Ohvalhu)
  4. Akhirnya, ada permainan di mana kegigihan sesi-manajer tidak dapat digunakan, untuk alasan kinerja (cukup aneh, di Fanorona , untuk semua kesederhanaan yang tampak, di awal permainan, ada sejumlah besar kemungkinan debut yang berkaitan dengan spesifik pengambilan dalam permainan ini)

Secara umum, saya memiliki dua mekanisme yang dirancang, secara umum, untuk hal yang sama. Dan ini luar biasa, karena saya dapat memilih mana yang akan diterapkan.

All Articles