スポンサーリンク
スポンサーリンク

phina.jsで将棋盤ゲームのプログラミングした話 [JavaScript]

ニッチな話題プログラミング

先日、スマホで操作できる将棋盤プログラムを作りました。

デザイン将棋盤

↑ こちらから動かせます。

プログラミング言語は JavaScriptで、phina.jsというライブラリを利用しました。

参考リンク

せっかくなので、駒を自分でkeynoteでデザインしました。

Keynoteで駒をデザインした
Keynoteで駒をデザインした

けっこう、図形の結合なんかを組み合わせるだけで、それっぽくできるんだね。

スポンサーリンク

JavaScriptとphina.jsでプログラミングした感想

言語にJavaScriptを選んだのは、スマホで動作させたかったからです。ウェブアプリなら、パソコンでもスマホでも同じように動作できます。

「JavaScript ゲーム開発」で検索した中から、シンプルなゲームライブラリとして、phina.js を選びました。

C++やJava、Ruby、Pythonをメインに使っていましたが、最近は JavaScript に興味があります。

実際に、phina.jsでプログラムを組んでみると、すぐに画面や画像が表示できました。

良かった点
  • スクリプト言語なので、エディタでコードを編集するだけで、PCでもスマホでも動かすことができる。
  • サーバにアップロードすれば、他の人にも公開できる。
  • index.htmlとmain.jsの2つのファイルだけでプログラムができる。

ただ、phina.jsは、すでに開発が停滞している点が落とし穴でした(最新版:v0.2.3 / 2018年1月23日)。バージョン1になる前に終了しているので、機能のドキュメントが整備されていなかったり、未実装の機能(例えば、スプライトのz座標)があったりして、困る点もありました。

戸惑った点
  • エラーメッセージは、ブラウザの「検証」機能でコンソールを表示して見る。
  • あとから phina.jsの開発が  v0.2.3 / 2018年1月23日 で停滞していることに気づいた。
  • 画像表示処理がスプライトオブジェクトを生成する形式だったので、画像を追加・削除が多い処理は重そうな印象(個人的にはフレーム毎にキャンバスに描画する方がわかりやすい)。
  • ローカルでは音声ファイルを読み込みできなかったり、サーバ上との動作に違いがあった。
  • クラスやメソッド、プロパティの記述方法がいろいろあった。

ライブラリには、旬があるんだよね。

ブラウザの更新で、古い機能がうまく動作しなかったりします。

phina.jsでのプログラム流れ

phina.jsプログラムの基本的な流れは、
(1)枠組みとなるシーンを表示する。
(2)スプライトを生成して、親オブジェクトに追加する。
(3)イベント時の動作を記述する(更新やタッチなど)。
の3段階です。

スプライトは、オブジェクト・モデルをそのまま動作させるのには簡単ですが、描画とモデルを分離しようと思うと、ちょっと手間がかかる気もしました。

個人で遊ぶ程度なら、さっと形になる点はメリットでもあるよね。

ファイル構成

通常のHTMLと同じで、画像とスクリプトがあれば、プログラムが実行できます。

phina.jsプログラムで必要なファイル
phina.jsプログラムで必要なファイル

「main.jp」を見てみると、1152行になっていました。

完成したmain.jsのサイズ
完成したmain.jsのサイズ

これだけ分量が多くなると、ファイルを分割したり、クラスごとにメソッドを管理しないと、わけがわからなくなるね。

例えば、SFEN形式の盤面情報を読み込むコード。

SFEN形式データを読み込む関数
SFEN形式データを読み込む関数

なるべく全体像を把握できるように、Atomエディタを使って、JavaScript用のパッケージを追加しました。

// phina.js をグローバル領域に展開
phina.globalize();

let ASSETS = {
    image:{
  		k1:"img/gyoku.png",
  		r1:"img/hi.png",
  		b1:"img/kaku.png",
  		g1:"img/kin.png",
  		s1:"img/gin.png",
  		n1:"img/kei.png",
  		l1:"img/kyo.png",
  		p1:"img/fu.png",
  		r1a:"img/ryu.png",
  		b1a:"img/uma.png",
  		s1a:"img/ngin.png",
  		n1a:"img/nkei.png",
  		l1a:"img/nkyo.png",
  		p1a:"img/to.png",
  		k2:"img/gyoku2.png",
  		r2:"img/hi2.png",
  		b2:"img/kaku2.png",
  		g2:"img/kin2.png",
  		s2:"img/gin2.png",
  		n2:"img/kei2.png",
  		l2:"img/kyo2.png",
  		p2:"img/fu2.png",
  		r2a:"img/ryu2.png",
  		b2a:"img/uma2.png",
  		s2a:"img/ngin2.png",
  		n2a:"img/nkei2.png",
  		l2a:"img/nkyo2.png",
  		p2a:"img/to2.png"
    },
};


var SCREEN_WIDTH    = 640; //640
var SCREEN_HEIGHT   = 960; //960

var BOARD_PADDING   = 10;
var BOARD_SIZE      = SCREEN_WIDTH - BOARD_PADDING*2;
var SQUARE_SIZE = BOARD_SIZE / 9;
var BOARD_OFFSET_X  = BOARD_PADDING;
var BOARD_OFFSET_Y  = (SCREEN_HEIGHT-BOARD_SIZE) / 2;

var MAX_PER_LINE = 9;
var TOTAL_LINE = MAX_PER_LINE + 2;
var BLOCK_NUM = MAX_PER_LINE*MAX_PER_LINE;

const SOUND_ENCODE = {
  put:"data:audio/mpeg;base64,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",

  move: "data:audio/mpeg;base64,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SqgBQw6aehDQBwTgrGve3FwjP2J8Atg02UJ0mZtMrBEGHmyZRbVWKQtNp6Y/FinAlhwWBcbSaVKoAqpR1f1DimhVFANK+0eV9ncXFbYcXcRV5R8sgrt33CC7V391t66Lrs9dP9P4I002/f/6MsA+FqyAB9B/H4xgySDzDyNxhI0gCaYfuqZUQAGeX+AkOjvkiAAjlZcHdM8Rud/hSs4xhjE1VU12of/Io9EktugJxtNtMoAAi0w5YCqXj9mcN4w3UBU7h5iA6fev/YPSQfZHfl0CSSOR1AAFZ+IkmiUQNNJGXjLHPpRNSsi31VtmSzPbDN////////////////////////4f3/P/+jDAGG6xgAc8eRuMMKkA1Aqj8YeY4CAAAXlZzBrmNYchohAZarmFBM154SASCv/pYAAFd9TqeLZ7MMrs7dfMn2fzDAGS6///////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLAG7C8gAbgPRuHvSbA4xdjcYSJaP/////8COONwBAAAZZoFCJQe6fMgD/1pQAI5JGEAAH0ixcOFBwoFAmn/oI///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywAb5x4AFQE8bJhinAI8GI/AjGJz////////+A2xI2wgABl0WgY2Ilq0O/x0AAAEAfKw+4zR////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MMCQ9uOABlxjIYMYSSBnhiPkUYyc////////////////////////////Yu9a/ZSLp//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDXjf+ADlhhHyEIqShMAGRwEAAE////////////////////////////9dVA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLAv8P/gA6cAyOAgAAgRAAkcAAABP/////////////////////////////////71/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywCvy/4AQRAMWgAAAIA4AYsAAAAT///////////////////////////////76P//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MMClmf+AEDgBFgAAACALgGLAAAAE///////////////////////////////+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA4r3/gBC8AxYAAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywJlF/4AQuAEUAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MMAipf+AEKABLgAAACAAACXAAAAE///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MMAipf+AEKABLgAAACAAACXAAAAE///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MMAipf+AEKABLgAAACAAACXAAAAE///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////owwCKl/4AQoAEuAAAAIAAAJcAAAAT///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////owwCKl/4AQoAEuAAAAIAAAJcAAAAT///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////owwCKl/4AQoAEuAAAAIAAAJcAAAAT///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6MsDqNv+AEMABLgAAACAAACXAAAAE////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+jLA6jb/gBDAAS4AAAAgAAAlwAAABP////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////owwCKl/4AQoAEuAAAAIAAAJcAAAAT///////////////////+wBLH/////cv////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oywOo2/4AQwAEuAAAAIAAAJcAAAAT///////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/6MsDqNv+AEMABLgAAACAAACXAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+jDAPef/gA+gAS4AAAAgAAAlwAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+jLA6jb/gBDAAS4AAAAgAAAlwAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",

  hit: "data:audio/mpeg;base64,SUQzAwAAAAAfdlBSSVYAAAAOAABQZWFrVmFsdWUAIQAAAFBSSVYAAAARAABBdmVyYWdlTGV2ZWwAewQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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Me8lj6zVwRR36W3VfBTN6rnPRXOcnG3Y2LAR+BFv//syxJODRzybGCCZjtDkj+JAECRgUqWr3LW/rWToaYkv3Snxkh0oPI6oUXs5vMj6XhFDpJGs699aCoKXhuyVSwYrrWs/eigotCcZQ0OrspP6tczhyT1JyeNHHrP9eZm3OREpIgkJEhkZS6Xj5m7NDmJDf/f+16yjuRpmZmZlpae+D5+AAA6OfEppSFxTfT2gsIhW1W9mB+KChS+KB//7MsSeA0ekhQ4gjSsA65AhBBMmUQHgfi4jj6CMklBLZtoidDxr5UsVcbVfp+PIiZMZf9Y+Ijm37u+RtzU68NfP//8xX//3lQDo6/wxocC/Bh6B1U9A1dxAsJBlaa6tSBMDQlH1jxKOy8pFgiodZ1GKVgauMZSMIxciQPRGCxQrcv5XFI4myGiNpDFEjZIJRqUv+sKdJAhFGcJhslH/+zLEpgAHfIkIFBMACbijHsMYwACZWNiIaFVxVqUr/C8zf///5tUVf///3FV5AAwm/Y0HQG/IGBMCv8iABhN+YogBULGv+woQMAqFjQC//qChhAKAsfAULN//9hAKGEAoAURNgFIl///2BQKGBQKGACkS4BSI6AX///igUOFBJgoJMRFQCrFQCyEIBf///+GCTP///5CEEf////////swxJUACaEvBjgUAAG0Jd3DDJAA//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxHuADWEY3hiUgAAAADSDgAAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1X///////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsSKA8AAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLEzgPEoAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxP+D0OABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxP+D0QABpAAAAAAAADSAAAAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1X///////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxP+D0OABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPVf///////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zDE/4PQ4AGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0f/+zLE/4PRAAGkAAAAAAAANIAAAABPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPVf///////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zDE/4PQ4AGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0f/+zLE/4PRAAGkAAAAAAAANIAAAABPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPVf///////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zDE/4PQ4AGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0f/+zLE/4PRAAGkAAAAAAAANIAAAABPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPVf///////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zDE/4PQ4AGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09V////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MMT/g9DgAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR//7MsT/g9EAAaQAAAAAAAA0gAAAAE9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09V////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MMT/g9DgAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR//7MsT/g9EAAaQAAAAAAAA0gAAAAE9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09V////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MMT/g9DgAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR//7MsT/g9EAAaQAAAAAAAA0gAAAAE9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09V////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MMT/g9DgAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR//7MsT/g9EAAaQAAAAAAAA0gAAAAE9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09V////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//syxP+D0QABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MMT/g9DgAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1X///////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxP+D0OABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxP+D0QABpAAAAAAAADSAAAAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1X///////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP////////////////////////////////////////////////////////////////////////////////////////////////R09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT////////////////////////////////////////////////////////////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxP+D0OABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0////////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxP+D0QABpAAAAAAAADSAAAAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1X///////////////////////////////////////////////////////////////////////////////////////////////9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT//7MsT/g9EAAaQAAAAAAAA0gAAAAEdPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR0//+zLE/4PRAAGkAAAAAAAANIAAAABHT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxP+D0OABpAAAAAAAADSAAAAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxP+D0QABpAAAAAAAADSAAAAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPVVRBRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAM",

  get: "data:audio/mpeg;base64,//swxAAAB4j1Y9gjgADvEa6jjGAADACgCACABwCAAAAAAA3uTvD9wN94AYO++4jg/+2TEQHBD/0NJjQHn/5BXMPP//3Y+Pk3///2JygY/+A/5QAAAwOtfiMtK9x8tOpIl4cnsZAHORnZ9hZOiD/P2a3mK+RTTPf637MU2sntkWkrTwk2OMgRQ0qleaaetZAAAAODZCTnHKyd4opj//syxAeBh4DDeWSMScjoGG5Agw4YNx1QKYJzUiQtjyiBbDFGau9ujd3/vNZut1ffuUyKr5RPXO+3WP3FBl3/Dzl/hO5TtejTJY7DOaagVRtMf62005IOBL3oU/LYBBhGvuo0072aUy0/4rpDTKwyvPFMKpIZxLmDSAUx6mgjEwAAAEJJwAdYmy4boJBNoiOV3rQa/NEQI8Jzt//0q//7MsQQgQesDX/nsGAI7pBugGQaAKOIM/8+Kt7axQy08qUfziQ4du1zpV/YNpg+zRTkxQIyeb4msnlSnVEBKF7g6OB05l0AxFKsnZpe4XTTRWz9lKMds1z0KkYjcLzYVGCgDCh+feyqUORm12g4VGMAAAFasEY1BaEN8d+rFHJ18nDSY7nHUzMZlnPK7qdtZd+7PY5vZX7NrjtcUKD/+zLEGAEHuE9/xgRoiO0TryTDDAhHP3mp+40vywWBnXnf3+WAEIA+FQCg640khZurO4MgxqzB8YEePs5ZblTpmpQT5mqVfPvqd+EHojJOeQ60DcXQdsrSs2pZB4uYBsAABCiAYHPbLc+kSw5EqiYVnm0bmngOVvoGUzM1gxXxDybrITdvw7KeFthp4Lp5Fo1w1mh6k4HRjyHlaZkA//swxB+AB2yZdwQkckEKku+0lAz5AIptwBAWH2dfGuETh0m0qN4RGCQeVTuJmuyL7aawoWT9yfYnO/Ymf410HXpIw/L2AhBqEkbnzQ63J7lM3vxYAmAABAoCQIqMjmU6mS1PdOlrPvCzLCoqEbMX3C3Xti9lBi5NIqLNuaIYo8+l4GHG8q2ocl8UHKfXHvT8iZpRDEACTkvAZGAL//syxCQAB3hpdQQkckEFCHA8kZh5sX0OKESRq0T5D6VlDd1xr33fpVqnusw+4uV3YSNaMFlsjJtXcFctePwTUx7UM6M5kZVOxTpDxAAAXAGpQTfKtvURpNeo62cQoF/FnqIxqavmk98pws+WHTgxZbGU6nNVSFFOoUUz3SafSwoHClX1/QAAFsCEiELkGNRzx/vyPEeW4nTxKtNhaP/7MsQpgAcwdXckMHCA7g4u5JMI+E66SMv/UkE7iQAWxLyYwgMZH0a0h0jDYVcgiKr1xguUixAAOkAAAAuEKBmUhlEER8hHu7ysBqMCMwxFCQzlupC2tMlKNOECABs+QdtpJ6z1HIagIOKlfeXPknnZn+WPt0ABo23gHwGBmDpahTk+WzngsHEooPGJP8H4r7tbYd6o7/ES7rylKWv/+zLEMwAHaG91gqRwgPMHcDSRjJk6wnt1fW6nfwbVM6+8h1Cg6ibTX6MgBty3gCgoC9jVtMmqOOrTz7l9OVQRXJsiI4Zr30VTZEUFal21XlYtddL1atKMzIk23O69ePLKehIi6MqyykIAGlLuAIA0CCkt4J71Jp/antIYmnOX99LI2lbbRcldldCPlq7F/nktNV0aEmc7kZTenst2//swxDsAB6zxg6QMS8DumXB8kYi5gqfDstclAAhTlwCM8GnnYIfVsBqwbRwTMEYt4FfNhFwXJ3/e82UHO/zLWjebW1kbqSv9P7bahnXdI4w/zqkU14CCQDAlKfrv2qh1KmlONNkBIIhoQFCQ4/p0MRGTlmmEiV6jHASCieLFZpQZLA0xyyTtP1bvC9ePGAAhoEgkvAkgRuFpbEjF//syxEIAB6RNfaYEZwjfj63EpI1qRQiYGChAWErZOCYDHjs7q9nOH3+dpzbhq0IM0kkcICwoUQyKKCOb/jvJ/0f43WxAACDJOAAMCIDJpUgUNS+jH0dJHBc4LLOcNWbU1eTn5f7HjFsBqxHIZ86OCBKTMROXMizJDuhFk72kX9PO0u8ysZsKUNMNEMF2Gt1097Kd/9yGUx1UwKwCkP/7MsRLgAdwfXCmDSNBIiBvdHMOEb2QAo0fajzm4kFb5LCcQY9dRKDIBgiKEQ6sLvQ1nS+0m9qEyfXFvwUFAgCZGjktGZJlsCoiGH/M0mHy8jHIJVNeOx+VlPrZ/ZY7LvYuNHXiFK6rl1MLS3i+nmkrMxc0ZAAAXAIgowbBPd6UV1WbVTNoxSdjJCoWDLg0qnbP+RcUlJoRq6EIIBL/+zLETYGHQINuBSRrQNwPLjCQpKghoAnpFIoRArX+kGi6iIDF67aMgPPjZC5roiAAgVLwAkQhAcSWxTkE92epTSPsQM0QdxKyB47Fa67zriTWxPai9qxpIZPk0ihuiGG0zaHgANISIlNMyUAEA7eAgZDvs8zupv7tvqISTRxm3BoiAG1L+ziE3FP4t+bxmdsWUKpaFcePoHMs3bmt//swxFkACCx5cSUkbsDuiG90lAwYs9p7tXPO7glWZHzumXd7Oh/Y59a6ZasLrKIpgeYgSiV3l+tzWz2Rzc6W42i0ZWXmFJ/LMYuJXhcwl87ixdDGs03di1YLOaeSrkpswzAi48dV3FaMqScDiE7v0Y996rs/kO7k/8z19VwFnAMlMjkWllF7V5/6G/7Ndhurfv8KdsA7BqAtNlyM//syxF4AB3iLeaQEcwjxEO1A9hj4uK9aclF1Q3BC9QHASNLKkKOqWflXpJH0pMQLxmDCM8fTAvm30feJkuPp6va1CggAAAQjCOEdWmRyRG2xMT48lQJMUgAQCIigIB7qpyPD2/V6dzUQde7nCZzRIyRGhcWFbFS91e0z/mvo/kLgAYJAS3ndJeu95VBUtSZhBsmBlEJw81H6nCzjU//7MsRmAYdAe2oHiYOI4A8uJISOEEhIjmHQGVii7iQ0I3pOIZjZx73qGxxNLf0PsckIAAMiTKfKo1723C40pJrEJQZCMEwDhSKYohiarpp1f8pZ8q1LgoahnJAuA0A6QAbRNcfQ611z2EJ/Wuv7MkzQACKd3AMFBW6jHeU7p5ztFx0BA7ZC7o/syrs6WdaUCMcW3v+zHP08snxV3F7/+zLEcQGHfH1tBgUDAOiP7diEjhB0JILDB+krPPlxZZnoTjhIAAABSoAWJ0KEGrPEy7DpwtapsUHYkB6Sa3/rn+206jZqpnhRyzvKFD9byjNEYtNTn3K4EXHgFhjiTKgABzAIggWHQIhbozoJwrQMxG9HmJqw4JiV7kLahBwY48HhM4VrqbuU+LiibRQcKBasW4dFANYyBQCAAAAB//swxHoAB5R5aqeNI0DxkC80YYi5MADA+HUMqt+rn7kq4vAiQJiJFJGHhUZb8HK/u/KY4IsQrNcHHGn2tvG5HqSx7P6IWW5kPv8B1pgABASTgWeF8dcS1cQ1VKxzVOGUcGiMkHyMbYqNf7t71G6JW2JhkVwKH4NTBswOmBYKsHd/ULpFjhI2ONEAEgKXgUQCJti2bOH6y370ait2//syxIEAh2x7c6SNA8DqiG50YJjgxbPQNdu5aOb7KgVZ59966KXMR/GB8dTBlyViFIQNQK/sBAQGAvdkKAAAAAqBEEhIpC8917+3s6qrj8CukcipraNUvWR/hQ32L70IOenU4PJWwmKN0fXuSVssmMgMWlBtbgfA0CItR+t+hjltqsFGWmUTYDzDJMKyUVITa5lU5jR7usKeJOLZ8//7MsSKAAdAfW9DpE7A8BEudIMKUJAs1Q4v9nd8zWz6fY2YexuhOsOfHUbqMwD3VCOlao6yGy8tlUclTFwQkwMiygNw0p0M/efaS763Xq/bUPGuTazgHNBuHgw1BZGy6xUURgfczzMCuK2+d+WteyT0lbGU/BmdKoUeEcYNTN8FZVlNGwkl6nbsAgg0oawuogPh+ARouLNPmDb+xcX/+zDEkwAHjKdxpIxHwOqPLWiRmsgp8Eg0Dj8snmG4g1SinZRY01oAwMkZAFWy2iR6qOFEfLsZdj+5SnUAtIMRjCYMOA8NCpAOiWizmTXkv+tdEiVVH+c7rb+mMR7RqSwG6zisZXJdB3H4vDQLClG5kNuqlsUQ+eWeYA3ODCAghlMqQUggGxz2imzuxdP6SvBl5mzX41n1t7Uvhgv/+zLEmwPHYJlkBCTNAOQP7IDxsGDJHU2VLFb2Ui1Q2G4eO4r3KMCo2nmuvKM1kusCXVp8GCAMvERba/urxdwGCAAAQEIGMhMkjVaq7xf35CyarFWcVwcWoDoz9+Bv+PlEi7Q2dkZnBMGFGSTzyIgTkHRZHc3To//X+rJGgAAQFJwAiKpOZbuu8hm/354b+pYg2oIByQqmdRP1Oyed//syxKUBh5B/YgeZFEDqEGxUhKIQLDmPc7qU5z3GHNwulgND40z0tyYHIqeOHkH8XkzrzX65kiye56uKsF6mXARjQmxzUVhsxk7ltxbS80xhlTANVYkNYD6YceQaF23mbYy7U6/T+TshGByUdeMDxC6XHWTxQCxXXUCaxgrSK1LhTbnKxVvEuyst2872wc1fLvVp+RUg7+n99wPmjv/7MsStgceUhWIHpNQA5ZAsVPCawCwoznVLaaUAAAAAKoARgPMVjdLZj7n3xu7DzZ5AKQDB6JkwXJlr58tpz1PB1nQG9jmPam+hX9TJN/4lYNe44W/C0LgA/BaRnX/SvY26W1HEraLIGDJGdERGURw6W7/e3LY/b9bKNeyuQbPE07GnWfcja0Btb7ddQogA4gAAAAAmgGMhBN9ekPT/+zDEtoAHNJdixrBtAO2ObbTDDLiKWibeoRSPWTiQ2ECYCTcY3vu/vu/829v0ZuEGcGCGhDu6y+rSYv3fVFi1PyBwGQAxO1bkdUiJmRkIBUob5SgXJBc6iDw+nP5KpS/nWylmbTMO+Za1g9MLjaEFr/yrhcfv+vXvM6GZAAQCk4DROGsKkB5rDAiZMxIcwwIGFjAjyEsz7b/SRFf/+zLEv4PHNHleBr2QAO2S60CRMGAYBxzUPMi61Y8wdO35ZA11dfEDDSCroQlnRkAAABOcAGwJJZx1hSobPmY2fXZpMHwcFkghOPtHSt5drd0E7BU/yj30IKzzbbheUiNyUM8c16xZKhAAAEBXpxk3BpfGpP/Nq8ka1YTUw7QwxoqlKtiU9RYzb7w5rkHvWtT9teJz2TKtiEjr7zPA//syxMkBh2h5Y6YYZ8DjD6vowKSYEHwgMSSOH3MVzful/7Wq8NVUABO8BVEYKWeDusLhG+ZS6ruzGDyRoHDBGQCcTLttZuSWW0+YEyXAdg8mfeZEz086YoLHlCuNXlBhk5BqGAn1WSAEA5uAEgWHIxSYnt5P3lT2sl5zLMxs8ZEk0WJ+kQlVTO6IDE2Y55Fnnw/vtCTR12ly7D0KRv/7MsTTAYdge2GnhScA4A9rWMGkcLKqqZIlLIiy54ebRCvblPKEAAEBu8AMzJRzt0Tv7CcxxVpHDBKdicwFgrgaT1T+xvt1LtEQqKKcPwX518olK802K/RrjlzX9T/r9KV8quIrCgpZQgAAAnOAWyWLUeubVKb24pV9fJHiGeAiWFjgrMPblvc5b1excBCODCs7V1Lm3R5t31J1rpX/+zDE3YAHVHdjpISlgO2RbDSTFPgplEwoJSPYksTMnAaaa+QAAAwFIKUDwU6LO6qd7TYnMZ4ybWZ3pdGYyzoPcV+utPbWmaU4tUuKooSMMsMnmpKRTmYaNBUBCtn72qT/0ZcB6JEAAgKXgJtrLSmIiSTLqbk8mznj2GFbACi4yAw2oxJqfO5bc84/AY1WZFnnlDO5lm5z+Ivw5nn/+zLE5gEIkINUx72JQP4Pa7T0CPh1aNO5c/Kf27KRM9WHiiEAAAYBvQZDBVUmzOte6sF7tqhXhYis1E6XU/Xwo18gsq7ibQrPu+NmCsZ98DqRAwfeUccYpYlOQ50VWbns/XuqG6AAAAuYApyBqmELEMrEckzsc0BeS5hcqNg2CiwolT1Ybe163POt+yq2u+JJqX0zemwZP5j6Ck2X//syxOgACOT5XaSEdkkLkSt0xA0pf6YjkWzEX//r7JXfZ+XwZAyAA7wAJgIhHqSMnh15aXWbe5sF2E9AmxKoQzS737Dk3MsiyNxBpCRM5kVIHY28HaylrnQmQUlL1dC6zB4sHws0AAALnABkD4/Uo4J+LDVDWG5VHdGiIIARgmkGS0P0quvbEz3bnXP2xRKSrzhn6W236Yiu8SJfpv/7MsTnAAiszVmmIEfA/pFp2NeiEDMkGJm/v7/+UN7FK78wAADgHTg1o41nU0N6GhGi3vuDM1zpxKopwHHFUiIIa8ncb+Cp++/uaz45iRmhNIkgOTAhQ0QFiow0vdrigwjsd9i36RpSRsMU+sed1jl+edunzl9SVY2JLS9kEvYIs+cGkuku6chudszxLAoEu4ULB2KkrZsYPn1YdfP/+zDE6IAI8Q9Xp6xlwQIO6ZkHmaBuHlBQUAiUv7kNqhFKfwORI9YxW8t9b1mt6xcR4r/KGKtSRcKkomIOtUJVYo+gGdX2cyHUJh7FGqeSuDUUPYju7wR0qVYNhadqXn2tRxF9mQKjGAAAAneAEY9iXUCQtozFFfclK1dLBcRJioaFToPfq+f+p//b+3n2Ly01UESp25wqAWKE2TH/+zLE6ACI8H1RR40jiQIR6nSEjhD54IjTAW49A8PLlXgfgAOBJgwARW/NnOt0tme79ju5XkkhMKcQLp6KlciVhi9StGKouI8JJadxXeUoDM4oGTMxmp1PK2Ai31vOs2aPqRbpAUTQAAQDu4BrKIr72izZ2dblp1mRr7JJZVYPDgqEdg3vYiDCOa53v/+xqPLPzvGVivlmW6UiOTqW//syxOgACMB7T0YNY8kQDykZF5mgPbyWB1FhQwfNUdi3IQI+BapCACTBsRwa3rJpDWnYR75ysIZpDAJk4FHRza5TtqrFP8Qwgjd/9jY6XY1rtDEb9YV3wYT7XFufy/f/veXXBmMIAARD24ASAUBqkkTr6i38PnjmWndp6CmFwsVlJ+nQnT16pmN9ZJgZhgycMSQ5Dh/nLckalhHoMf/7MMTnA8igk0QMDTZBCBCoQPMyyQbUPiAjHt/3/44E4V1rh6lkgAEh38AdgsHWFyNulR3rOz92MtoqcCYhBPAaH0Xo9Is6Xzr3N4VF/O5GvscNDyLKdU0nsv3pwKgMdx4IveDwj7OOT+lRAAJL24AdPD0bFhPRp19dc8Rz1SlImYf2ly58z7puHimfpHIYdIXNZDJri3qQRdrpYP/7MsTnAAiEeU2mDSPBB5FoSPGawKorhSys7zv//9wv3fbfx/lWiAElf8BImeB06lFacnmainlx23My0wLgEURBoAOZkaze/5J2IOCN0dHS9XIqPeppjbuRCqirEnUsEjpJYeqs6B3HgAACA7wARYLp+kHm9UHra8zDfazYxUGEC4KAETgC2iQrJeHyeuhU+ODT5/pvZtL8aDB+mRP/+zLE6ABI/NFNp6RnwPyIqbCxpOlLNyfIE4wl1UhYOA2vJiXKhgAEGbgAG3AcXLEs/UOrnROsndqae8onC7yi5+alMWduRlwlE8l/yU24tKpMNK8hPdoTeYnvHtSi4Bip3CAABYC9gshQnkBrKaFTP307D8aWjxFPxzSCSC4sGkZxULcvO268ebXZ2ezcLl3ze/0c3shvL1sgOxuE//syxOiACQS/S6WEeEkTmml0xAz4y4MavMtlQPnSyTYEZhAABAdwAPI9g3O5xbQKZxS+a/dvA1qlH3lU5XH8dLeuKZtCQG3YpFfTMxGqSf2OT+gI1h8EtUXVtEc3uaV9zyFUcbwdDjgAAAygAm8EJms8XWc5pFrrV813TMkaOxUiSoYxknYBUKlDsyL0/SluqhRqnueMLWL66EXQlf/7MMTmAAhIeU2lhHZJCxhp9YQUuGtfFnt5LohUe9hZYs3eFyAQpwAM4ygsdz+SmZn/S8X153Zv9G2TodTkOC8G7jH1Xzz9lY1i6mpwEfJ69LnntkWSXO+ydy28BMxEtIXGSIyWHQHgwAACArQALWxjM25v4ELeKW/rCvT/cutMeNqUu7YOlPqdxr9B+6+csj6ZOQ6wK5PukLzsYf/7MsTnAAic10enoGfA/Jto9LCOyWBPLdAcQFdH0EZbbMN/v4V6ABES4AM4S0ycR42PT+3N7bX2tJeundqRBbARk8NLvc4iUq2VGGURDsQsUCjJ7bRF6lJQrI6US6M6WcZoxhwpxKUGNlIAAEO0AIMWVCPO/pR6s7ptRrodEU5ZZEQhMmRHgPWNh6JS/OpnDlY5BYIIX56DTX7cya7/+zLE6QAIvIc4zA2DCRibKDTwjshdKAmMlnhDzl36uKWjY7+H8AABEURtYzGj0ri+/jdbX1803SJEtKkzrijNU5l3m9Q0pz7J+bUWsjHna+8Mv4x1cw7o5X0r2wT7vI1qiIA3nBvwABAVoAW+MpZrW7Xq4SyX/9JcZxW2KvlduIkUDCHGn2Ryx9CTLPfdYpH7gmc9sc6no/r61jJs//syxOcBCJzPP0egVMkMmufo9gz5WXtTiw+wIKGnAObPp0QoAA0BC4he21m3buYbt6/Uam2SA5yyR5VAai4LYc6nDCVapUckO9fmZk20bO4VTphWDLeQbhUXTePf5sbTZhnX//3aJAAOgDjVopdbuN9/MtM4rCy/jwK1y/T6AscgsCECsOUyGljjwT5psz+neLrvgsWibGw1sLXNRv/7MMTnAAikeT2njNZJC5mn6PYU+bZFo/jqo8Dz7+Z1/94gMCXHeGUzvdUjQs+nv6Qq61KvteGN2/J6X5CA/1pFJeNAawQIeS1yc0dzMWiJlwTTXFcGf0x9uNQKLfSI55l+236H1QcoAAHAFnF7ShdXGzuvX2zWs7B6Xg61h6qHNsaB6zpGMixgRokWjN7nNt8vzjUbqBciRKctSv/7MsTmgEik1zunrGfBA5rnJPCOwRkE3cwZ6n/oyRIO/gwABoBMZ5iKc3S9qXcrn8z+r2dz5rdSvcgjOccZn00NEdyQyi1U+Oo9YkoilabaUoiBmjrvrjK0qQg9INso8owwQSt7v30KJAAAHAACxEHApRXtb4r9cmOm+ptVhqcTRJBDDF8hrAAjBpV4ty4VrmDeGRGCA0FhRLx2kN3/+zLE54EIuME5TDxnwQ0O5iWHmPlwV2UlxcBCR2M3gPM4SAAABAConAIt3uW7Rt59tZhQoGYNMWfMrIsQEJH2xBFLnA4VkwtFf7Dyu9uOXKKMfewXGlVsltwa1Cf9Pzbmu/70kwsAAAGAE+yrROK3UlKbjazvd/FtNLmsSu3xsrKsJgcqHhBAW4IyWW8aM1TVO1V1AqwwaoELoGZC//syxOcBCHx3MMeZNkkQkWWU8bLJEb1XiK0mM38tWqf//vgGBAFgAtY7BWvK/d94vinbJo1d1vD1ARy2vIcXU/B82M95quSCVFtcGKtPZ8CSiGDxs0zc7UMQ7SYOdw9eB9kt6wIwAAJAE1gAZCPKpJv6xLucDZRtlpEcABz0n4iSoBrGaBTVsKPEtuzy+8+k/vnO69re2c16025/Bv/7MMTnAIg8ezEsPMfJGJFlpYGiyZNeu5K1tmSNQ/8Xr/lvjB0LjS7Vj13mucUZZ3Uy6pJI/Ti2jFleL4A0hICuKTEyPjhBfmrk6zXpmOtcdOaMLBqBNyLf/taUHXiICuUb2x37P+4WEAAQFqAAyFwIrpzm1nefJS1cZhRZKqVmVOkOQk6AVJdSrY9RpFFsdN3PkzNgQYjkgQdZzv/7MsTmgAhUoS9HsGfJDZFlJYekuYWYHjxRIAzDLmNNeEygAC+YAkrRyAmYXFxcxTQBXFZy+cgfBorSGkiR2YNzp8ca9mm1d73mG9Za3zt2vXlHMKCDbc1s0A0jTTxMhRm/ooupAgAC1yHgdjPOr25Ek+q6es7BmM5WykHSydWzIDkciCaBBmVuLaowft3FltiS0tg2kXc2WBpt267/+zLE54EItHspLD0FyQWTJXDxmskGT41gsJEs+6zfR/0fDAFS5AoTbN47/CWNqD6RJHs8WO3Ns0rknFOH0EHOMDRLqGoTb5X4kaOOOm7sa1KW0DBgNHMQFlnv58kO2bLBIG0U6CABAiUmIPk7lf7jq7hj3lNKsu5yyU1ZJblrq3XDXs3IOOegxEp4nLjiN/pvjHbJkvUuHMNTARQH//swxOgBCLSdKSwZ48EVkSRBl7C4E4LggOeKixIOq1/6vpJhBh7NUpW4nP+QJB5PL3gUZsI2xvRPQzRczCOwWZHTS7hav712/pCzebNI2FY03uvmg0Ml5RggD5MRmAzL0b6te7/uBIAAAGbg1I82ntWrVkgfNpMQorjNiVuZ6rS2pScDuIaBRGIGnK2idav+U23bn1+rHrlbKsvw//syxOYAiBR/JQeM1kERj+Rhg2BwxQWRYYlg4tHirfZT5IdYCiB8UDy0PM9tazued5qfUC7xqQhOLyFl5DUDrVwymh5FkmgXxTG5oFb11jNu3wYcNJyMsTOa58RgeHCxym/oFX+YMLViBhlyUcBLGjUOUkii3wXTR2H8sh2kMFsHQZF4NvAxzEFlYxRhBiMorICAwMKZVNBlRxDnJv/7MsTngEiggyCsPSfBDBJkFYeg+CtUjIvDYMRzRTAgAlhEiwyJrpGRPDeHPKq0DUeyAnjBieSWjzN2TPmCKK0HNWbpc8kmg61LZ0qTWT/9S3/7mHr/IAAEiAdgDoMJpOUuKpkrV6rVbFwxK6I6MjI+e05MbnJi60ZXHECJ8yYresuXPFgaKhpQdqBoBA1DX+o8Iv//////////////+zLE54FInHserDDUARCQI4GDPHD//////////////////////////////////////////0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dP//swxOcByEx/Hww9hcESkSPWnvAAR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09H//syxOcADv0ZEhmqAAD0i1nLnsAAT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR//7MsTQg8VAAaQAAAAAAAA0gAAAAE9HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT0dPR09HT1U=",
};

class Sound {
  constructor(key) {
    this.audio = [];
    this.index = 0;
    this.data_uri = SOUND_ENCODE[key];
      for(let i=0;i<8;i++){
          this.audio.push(new Audio(this.data_uri));
      }
  }
  play() {
    this.audio[this.index%this.audio.length].play();
    this.audio[this.index%this.audio.length] = new Audio(this.data_uri);
    this.index += 1;
  }
}

const SE = {
  dataObj: {
    put: new Sound("put"),
    move: new Sound("move"),
    hit: new Sound("hit"),
    get: new Sound("get"),
  },
  move: function() {
    this.dataObj.put.play();
  }
};



var myScenes = [
  {
    lable: 'title',
    className: 'TitleScene',
    nextLabel:'',
  },
  {
    lable: 'main',
    className: 'MainScene',
    nextLabel:'',
  }
];

/*
 * シーン01
 */
var INIT_SFEN = "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1";
var sfens = [
  ["hirate",
    "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1"],
  ["up2",
    "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B+5R+1/LNSGKGSNL w - 1"],
  ["up3",
    "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPP+PPPP/1B+5R+1/LNSGKGSNL w - 1"],
  ["up5",
    "lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PP+PPP+PPP+P/1B+5R+1/LNSGKGSNL w - 1"],
  ["handicap-2",
    "lnsgkgsnl/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1"],
  ["handicap-4",
    "1nsgkgsn1/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1"],
  ["handicap-6",
    "2sgkgs2/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w - 1"],
];

phina.define("TitleScene", {
  // 継承
  superClass: 'DisplayScene',
  // 初期化
  init: function() {
    // 親クラス初期化
    this.superInit();
    // 背景色
    this.backgroundColor = 'white';
    var scene = this;
    this.setting = {};
    this.setting.sfenIdx = 0;
    this.setting.sfen = sfens[0][1];
    this.setting.freeMode = false;

    //var gridX = Grid(BOARD_SIZE, MAX_PER_LINE);
    var items = [
      "menu",
      //"status",
      "start",
      "change",
      "mode",
    ];
    var ys = Grid(BOARD_SIZE, items.length+4);
    var idx = 2;
    var labels = {};

    items.forEach(item => {
      var lab = Label({
        text: item,
        fontSize: 48,
        fill: 'black',
      }).addChildTo(this)
        .setPosition(this.gridX.center(), ys.span(idx));
        labels[item] = lab;
        idx++;
    });

    labels["start"].setInteractive(true);
    labels["start"].on("pointstart", function() {
      scene.exit(scene.setting);
    });

    labels["change"].setInteractive(true);
    labels["change"].on("pointstart", function() {
      scene.setting.sfenIdx = (scene.setting.sfenIdx + 1) % sfens.length;
      scene.setting.sfen = sfens[scene.setting.sfenIdx][1];
    });
    labels["change"].update = function() {
      this.text = (scene.setting.sfenIdx + 1)+ ": " + sfens[scene.setting.sfenIdx][0];
    };

    labels["mode"].setInteractive(true);
    labels["mode"].on("pointstart", function() {
      scene.setting.freeMode = ! scene.setting.freeMode;
    });

    labels["mode"].update = function() {
      this.text = "[ "+(scene.setting.freeMode ? "free" : "normal")+" ]";
    };

  },
});


var SENTE = 1;
var GOTE = 2;
var BLANK = -1;
var WALL = 0;

var PIECE_DIRECTIONS = {
		k1:"12346789",
		r1:"",
		b1:"",
		g1:"123468",
		s1:"12379",
		n1:"",
		l1:"",
		p1:"2",
		r1a:"1379",
		b1a:"2468",
		s1a:"123468",
		n1a:"123468",
		l1a:"123468",
		p1a:"123468",
		k2:"12346789",
		r2:"",
		b2:"",
		g2:"246789",
		s2:"13789",
		n2:"",
		l2:"",
		p2:"8",
		r2a:"1379",
		b2a:"2468",
		s2a:"246789",
		n2a:"246789",
		l2a:"246789",
		p2a:"246789"
};
var PIECE_STRAIGHT_DIRECTIONS = {
		k1:"",
		r1:"2468",
		b1:"1379",
		g1:"",
		s1:"",
		n1:"",
		l1:"2",
		p1:"",
		r1a:"2468",
		b1a:"1379",
		s1a:"",
		n1a:"",
		l1a:"",
		p1a:"",
		k2:"",
		r2:"2468",
		b2:"1379",
		g2:"",
		s2:"",
		n2:"",
		l2:"8",
		p2:"",
		r2a:"2468",
		b2a:"1379",
		s2a:"",
		n2a:"",
		l2a:"",
		p2a:""
};

const PIECE_RANK = {
  k:0, r:7, b:6, g:5, s:4, n:3, l:2, p:1, length:8,
};
const PIECE_BY_RANK = "kplnsgbr";

const PHASE = {
  erabu:1,
  sasu:2,
  utsu:3,
  naru:4,
};


// MainScene クラスを定義
phina.define('MainScene', {
  superClass: 'DisplayScene',

		init: function(args) {
    this.superInit();
    var sfen = args.sfen;
    this.freeMode = args.freeMode;
    this.teban = SENTE; // 1:sen, 2:go

    this.initTebanBackGround();

    // 背景色を指定
		this.backgroundColor = '#000';

    // ラベルを生成
    this.teban_label = Label('Design Shogi!').addChildTo(this);
    this.teban_label.x = this.gridX.center(); // x 座標
			this.teban_label.y = 100; // y 座標
			this.teban_label.fill = '#000'; // 塗りつぶし色


    // グループ
      this.initBoardSquares();
      this.phase = PHASE.erabu;

      this.senteHand = new Array(PIECE_RANK.length);
      this.senteHand.fill(0);
      this.goteHand = new Array(PIECE_RANK.length);
      this.goteHand.fill(0);
			this.loadSFEN(sfen);


			this.pieces = [];
			this.displayPieces = DisplayElement().addChildTo(this);
			this.refresh();
		},


    initBoardSquares: function() {
      var self = this;

      this.boardBG = RectangleShape().addChildTo(this);
			this.boardBG.fill = '#FFF';
			this.boardBG.width = SCREEN_WIDTH;
			this.boardBG.height = BOARD_SIZE;
			this.boardBG.x = this.gridX.center();
			this.boardBG.y = this.gridY.center();;
			this.boardBG.alpha = 1;
			this.stroke = null;


      this.displayBoard = DisplayElement().addChildTo(this);
			this.squares = [];
			//配列を2重ループで初期化する場合
			this.board = new Array((MAX_PER_LINE+2)*(MAX_PER_LINE+2));

      this.lastIndex = [];
			this.selectedSquare=null;
			this.selectedPiece=null;

    (BLOCK_NUM).times(function(i) {
      // グリッド上でのインデックス
      var xIndex = i%MAX_PER_LINE;
      var yIndex = Math.floor(i/MAX_PER_LINE);
					var square = Square(xIndex, yIndex).addChildTo(this.displayBoard);
					this.squares.push(square);

					square.setInteractive(true);
					square.on('pointstart', function() {
							var piece = self.getPiece(xIndex,yIndex);
              var square = this

              var selectSquare = function() {
                self.clearSelect();

                self.lastIndex.push(square);
                self.selectedSquare = square;

                square.selecting(true, true);
                var spr = self.getPieceSpriteByPosition(square.xIndex, square.yIndex);
                spr.selecting(true,true);
                self.lastIndex.push(spr);



                var movs = self.getMovements(xIndex, yIndex, true);
                //alert(movs);
                movs.forEach(pos => {
                      var target = self.getSquare(pos[0], pos[1]);
                      target.selecting(true, false);
                      self.lastIndex.push(target);
                });
              };
              if (self.phase == PHASE.erabu) {
                if (piece !== ""  && self.movablePiece(piece)) {
                  selectSquare();
                  self.phase = PHASE.sasu;
                }
              } else if (self.phase == PHASE.sasu) {
                if (self.selectedSquare == this) {
									self.clearSelect();
                  self.phase = PHASE.erabu;
								} else	if (self.lastIndex.includes(this)) {
                  if (self.canUpgradeByPosition(self.selectedSquare.xIndex, self.selectedSquare.yIndex, xIndex, yIndex)) {
                    self.showUpgradeWindow(self.selectedSquare.xIndex, self.selectedSquare.yIndex, xIndex, yIndex);
                    self.phase = PHASE.naru;
                  } else {
                    self.moveFromTo(self.selectedSquare.xIndex, self.selectedSquare.yIndex, xIndex, yIndex);
                    self.changeTurn();
  									self.clearSelect();
                    self.refresh();
                    self.phase = PHASE.erabu;
                  }
								} else if (piece !== ""  && self.movablePiece(piece)) {
                  self.clearSelect();
                  selectSquare();
                  self.phase = PHASE.sasu;
                } else {
									self.clearSelect();
                  self.phase = PHASE.erabu;
								}
								//getEffectiveArea(xIndex, yIndex);
              } else if (self.phase == PHASE.utsu) {
								if (self.lastIndex.includes(this)) {
                    self.setPiece(xIndex, yIndex, self.selectedSquare.name);
                    self.loseHand(self.selectedSquare.name);
                    SE.move();
                    self.changeTurn();
  									self.clearSelect();
                    self.phase = PHASE.erabu;
                    self.refresh();
								} else if (piece !== ""  && self.movablePiece(piece)) {
                  self.clearSelect();
                  selectSquare();
                  self.phase = PHASE.sasu;
                } else {
									self.clearSelect();
                  self.phase = PHASE.erabu;
								}
              }
					});

			}, this);

    },
    loseHand: function(piece) {
      var rank = PIECE_RANK[piece[0]];
      if (this.sideByPiece(piece) == SENTE) {
        this.senteHand[rank] -= 1;
      } else {
        this.goteHand[rank] -= 1;
      }
    },
    canUpgradeByPosition: function(x1,y1,x2,y2) {
      var p1 = this.getPiece(x1, y1);
      return this.canUpgrade(y2,p1) || this.canUpgrade(y1,p1);
    },
    showUpgradeWindow: function(x1,y1,x2,y2) {
      var p1 = this.getPiece(x1, y1);
      var p2 = this.getPiece(x2, y2);
      var self = this;

      var upgradeBackGround = Square(x2,y2);
      upgradeBackGround.width = upgradeBackGround.width * 2.2;
      upgradeBackGround.height = upgradeBackGround.height * 1.2;
      upgradeBackGround.selecting(true,true);
      upgradeBackGround.addChildTo(this.displayPieces);
      this.pieces.push(upgradeBackGround);

      this.selectedSquare.selecting(true,false)


      var upgradeSprite = Piece(p1+"a",x2-0.5,y2);
      upgradeSprite.addChildTo(this.displayPieces);
      this.pieces.push(upgradeSprite);
      upgradeSprite.setInteractive(true);
      upgradeSprite.on('pointstart', function() {
        self.moveFromTo(x1, y1, x2, y2);
        self.setPiece(x2, y2, p1+"a");
        self.changeTurn();
        self.clearSelect();
        self.refresh();
        self.phase = PHASE.erabu;
      });



      var originalSprite = Piece(p1,x2+0.5,y2);
      originalSprite.addChildTo(this.displayPieces);
      this.pieces.push(originalSprite);
      originalSprite.setInteractive(true);
      originalSprite.on('pointstart', function() {
        self.moveFromTo(x1, y1, x2, y2);
        self.changeTurn();
        self.clearSelect();
        self.refresh();
        self.phase = PHASE.erabu;
      });
    },
    moveFromTo: function(x1,y1,x2,y2) {
      var p1 = this.getPiece(x1, y1);
      var p2 = this.getPiece(x2, y2);

      if (p2 !== "") {
        var rank = PIECE_RANK[p2[0]];
        if (this.sideByPiece(p1) == SENTE) {
          this.senteHand[rank] += 1;
        } else {
          this.goteHand[rank] += 1;
        }
        SE.move();
      } else {
        SE.move();
      }
      this.setPiece(x2, y2, p1);
      this.setPiece(x1, y1, "");

    },
    canUpgrade: function(y,p){
      if (p[2] === "a") {
        return false;
      }
      switch (p[0]) {
        case "k":
        case "g":
        return false;
      }
      var side = this.sideByPiece(p);
      if (side == SENTE) {
        return y <= 2;
      } else {
        return y >= 6;
      }
    },

		refresh: function() {
			while(this.pieces.length > 0) {
				var p = this.pieces.pop();
				p.hide();
			  p.remove();
			}

			for (var index =0 ; index < BLOCK_NUM; index++) {
        var xIndex = index%MAX_PER_LINE;
				var yIndex = Math.floor(index/MAX_PER_LINE);
				var piece_name = this.getPiece(xIndex,yIndex);
				if (piece_name !== "") {
					var p = Piece(piece_name, xIndex, yIndex);
					p.addChildTo(this.displayPieces);
					this.pieces.push(p);
				}
			}

      var i = 0;
      var self = this;
      this.senteHand.forEach((h,idx) => {
        if (h>0) {
          var p = Piece(PIECE_BY_RANK[idx]+"1", i, MAX_PER_LINE+0.2);
          p.addChildTo(this.displayPieces);
          this.pieces.push(p);

          p.setInteractive(true);
          p.on('pointstart', function() {
            if (self.movableSide(SENTE)) {
              var lastSelected = self.selectedSquare;

              if (self.phase == PHASE.utsu) {
                self.clearSelect();
                self.phase = PHASE.erabu;
              } else if (self.phase == PHASE.sasu) {
                self.clearSelect();
                self.phase = PHASE.erabu;
              }
              if (self.phase == PHASE.erabu) {
                if (lastSelected != this) {
                  self.selectedSquare = this;
                  this.selecting(true);
                  self.phase = PHASE.utsu;
                  var movs = self.getUchigomaArea(p.name);
                  movs.forEach(pos => {
                      var target = self.getSquare(pos[0], pos[1]);
                      target.selecting(true, false);
                      self.lastIndex.push(target);
                  });
                }
              }
            }
          });

          if (h>=2) {
            var num = NumberLabel(h, i+0.3, MAX_PER_LINE+0.2-0.3);
            num.addChildTo(this.displayPieces);
            this.pieces.push(num);
          }
          i = i+1;
        }
      });
      var i = MAX_PER_LINE -1;
      this.goteHand.forEach((h,idx) => {
        if (h>0) {
          var p = Piece(PIECE_BY_RANK[idx]+"2", i, -1.2);
          p.addChildTo(this.displayPieces);
          this.pieces.push(p);

          p.setInteractive(true);
          p.on('pointstart', function() {
            if (self.movableSide(GOTE)) {
              var lastSelected = self.selectedSquare;
              if (self.phase == PHASE.utsu) {
                self.clearSelect();
                self.phase = PHASE.erabu;
              } else if (self.phase == PHASE.sasu) {
                self.clearSelect();
                self.phase = PHASE.erabu;
              }
              if (self.phase == PHASE.erabu) {
                if (lastSelected != this) {
                  self.selectedSquare = this;
                  self.phase = PHASE.utsu;
                  var movs = self.getUchigomaArea(p.name);
                  movs.forEach(pos => {
                      var target = self.getSquare(pos[0], pos[1]);
                      target.selecting(true, false);
                      self.lastIndex.push(target);
                  });
                }
              }
            }
          });


          if (h>=2) {
            var num = NumberLabel(h, i+0.3, -1.2-0.3);
            num.addChildTo(this.displayPieces);
            this.pieces.push(num);
          }
          i = i-1;

        }
      });
      this.refreshKikiArea();

		},
    refreshKikiArea:function() {
      var senteKiki = new Array((MAX_PER_LINE)*(MAX_PER_LINE));
      var goteKiki = new Array((MAX_PER_LINE)*(MAX_PER_LINE));
      var x;
      var y;
      //initialize
      for (x=0; x<MAX_PER_LINE; x++) {
        for (y=0; y<MAX_PER_LINE; y++) {
          var idx = x + y*MAX_PER_LINE;
          senteKiki[idx] = 0;
          goteKiki[idx] = 0;
        }
      }
      for (x=0; x<MAX_PER_LINE; x++) {
        for (y=0; y<MAX_PER_LINE; y++) {
          var piece = this.getPiece(x,y);
          var movs = this.getMovements(x,y,false);
          var side = this.sideByPiece(piece);

          movs.forEach(p => {
            var idx = p[0] + p[1]*MAX_PER_LINE;
            if (side === SENTE) {
              senteKiki[idx] += 1;

            } else {
              goteKiki[idx] += 1;

            }

          });
        }
      }
      for (x=0; x<MAX_PER_LINE; x++) {
        for (y=0; y<MAX_PER_LINE; y++) {
          var idx = x + y*MAX_PER_LINE;
          var s = senteKiki[idx];
          var g = goteKiki[idx];
          var square = this.getSquare(x,y);
          if (s == 0 && g == 0) {
            square.setColor("#999");
          } else if (s>0 && g == 0) {
            if (s>=3) {
              square.setColor("#fdd");
            } else if (s == 2) {
              square.setColor("#fbb");
            } else {
              square.setColor("#d99");
            }
          } else if (g>0 && s == 0) {
            if (g>=3) {
              square.setColor("#aef");
            } else if (g == 2) {
              square.setColor("#8cf");
            } else {
              square.setColor("#69c");
            }
          } else if (s==g) {
            square.setColor("#94b");
          } else if (s>g) {
            square.setColor("#E55");
          } else {
            square.setColor("#37E");
          }
        }
      }

    },

    getFuLines: function(piece) {
      var ret = [];
      for (var x=0; x<MAX_PER_LINE; x++){
        for (var y=0; y<MAX_PER_LINE; y++) {
          if(this.getPiece(x,y) === piece) {
            ret.push(x);
          }
        }
      }
      return ret;
    },
    getUchigomaArea: function(piece) {
      var ret = [];
      var fuLines = this.getFuLines(piece);

      for (var x=0; x<MAX_PER_LINE; x++){
        for (var y=0; y<MAX_PER_LINE; y++) {
          if(this.getPiece(x,y) === "") {
            //todo: Piece
            if (piece === "p1") {
              if(fuLines.includes(x) === false && y != 0) {
                ret.push([x,y]);
              }
            } else if (piece === "p2") {
              if(fuLines.includes(x) === false && y != MAX_PER_LINE -1) {
                ret.push([x,y]);
              }
            } else {
              ret.push([x,y]);
            }
          }
        }
      }
      return ret;
    },

		clearSelect: function() {
			if (this.selectedSquare) {
				this.selectedSquare.selecting(false);
				this.selectedSquare = null;
      }
			while (this.lastIndex.length > 0) {
				var s = this.lastIndex.pop();
				  s.selecting(false);
			}

		},
		update: function() {
			this.teban_label .text = "teban is " + this.teban;

			if (this.movableSide(SENTE)) {
  			this.tebanBG.alpha = 1;
  			this.gotebanBG.alpha = 0.5;
			this.teban_label .y = SCREEN_HEIGHT - 100;

			} else {
  			this.tebanBG.alpha = 0.5;
  			this.gotebanBG.alpha = 1;
			this.teban_label .y = 100;
			}

      if (this.senteHand[0] >= 1) {
        this.teban_label.text = "Winner is SENTE";
        this.teban_label .y = SCREEN_HEIGHT - 100;
        this.teban = 0;
      } else if (this.goteHand[0] >= 1) {
        this.teban_label.text = "Winner is GOTE";
        this.teban_label .y = 100;
        this.teban = 0;
      }
		},
		getPieceSpriteByPosition: function(x,y) {
			var ret = this.pieces.find(p => p.xIndex == x && p.yIndex == y);
			return ret;
		},
		getMovements:function(xIndex, yIndex, real_move) {
			var ret = [];
			var piece = this.getPiece(xIndex,yIndex);
      if (piece === "") {
        return ret;
      }

			var s = PIECE_DIRECTIONS[piece];
			for (i = 0; i<s.length; i++) {
        ret.push(this.getPositionByDirection(xIndex,yIndex, parseInt(s[i])));
			}
			if (piece === "n1" && yIndex - 2 >= 0) {
			ret.push([xIndex-1, yIndex-2]);
				ret.push([xIndex+1, yIndex-2]);
			}
			if (piece === "n2" && yIndex + 2 < MAX_PER_LINE) {
				ret.push([xIndex-1, yIndex+2]);
				ret.push([xIndex+1, yIndex+2]);
			}

      var side = this.sideByPiece(piece);
      var sdir = PIECE_STRAIGHT_DIRECTIONS[piece];
			for (i = 0; i<sdir.length; i++) {
        ret = ret.concat(this.getStraightMovements(xIndex,yIndex, parseInt(sdir[i]), real_move, side));
			}


			if (real_move) {
				var self = this;
				var isMovable = function(pos) {
  				var enemy = self.enemySide(piece);
					var side = self.sideByPiece(self.getPiece(pos[0], pos[1])) ;
					return side === BLANK || side === enemy;
				};

				ret = ret.filter(isMovable);
			}
      var self = this;
      var isInnner = function(pos) {
        return self.outRange(pos[0],pos[1]) === false;
      };

      ret = ret.filter(isInnner);
			return ret;
		},
    getPositionByDirection: function(xIndex,yIndex,dirInt){
      switch(dirInt) {
        case 1: return [xIndex-1, yIndex-1];
        case 2: return [xIndex  , yIndex-1];
        case 3: return [xIndex+1, yIndex-1];
        case 4: return [xIndex-1, yIndex  ];
        case 6: return [xIndex+1, yIndex  ];
        case 7: return [xIndex-1, yIndex+1];
        case 8: return [xIndex  , yIndex+1];
        case 9: return [xIndex+1, yIndex+1];
        default: return undefined;
      }
    },
    getStraightMovements: function(x,y,dirInt, real_move, side){
      var ret = [];
      var pos = this.getPositionByDirection(x,y,dirInt);
      ret.push(pos);

      var target = this.getPiece(pos[0], pos[1]);
      if (target === "") {
        return ret.concat(this.getStraightMovements(pos[0],pos[1],dirInt, real_move, side));
      } else {
        if (real_move) {
          return ret;
        } else if (this.sideByPiece(target) == side) {
          var dirStr = dirInt.toFixed();
          if (PIECE_STRAIGHT_DIRECTIONS[target].includes(dirStr)) {
            return ret.concat(this.getStraightMovements(pos[0],pos[1],dirInt, real_move, side));
          } else if  (PIECE_DIRECTIONS[target].includes(dirStr)) {
            ret.push(this.getPositionByDirection(pos[0],pos[1],dirInt));
            //return ret;
          }
          return ret;
        } else {
          return ret;
        }
      }
    },


		loadSFEN: function(str){

			for(var i = 0; i < (MAX_PER_LINE+2)*(MAX_PER_LINE+2); i++) {
				if (this.outRangeByIdx(i)) {
					this.board[i] = "w0";
				} else {
					this.board[i] = "";
				}
			}

			var index = 0;
			for (var i = 0; i < str.length; i++) {
				var pierce_name = "";
        var ch = str[i];
				if (index < 81) {
          switch (ch) {
  					case 'k':	pierce_name="k2";	break;
  					case 'r':	pierce_name="r2";	break;
  					case 'b':	pierce_name="b2";	break;
  					case 'g':	pierce_name="g2";	break;
  					case 's':	pierce_name="s2";	break;
  					case 'n':	pierce_name="n2";	break;
  					case 'l':	pierce_name="l2";	break;
  					case 'p':	pierce_name="p2";	break;
  					case 'K':	pierce_name="k1";	break;
  					case 'R':	pierce_name="r1";	break;
  					case 'B':	pierce_name="b1";	break;
  					case 'G':	pierce_name="g1";	break;
  					case 'S':	pierce_name="s1";	break;
  					case 'N':	pierce_name="n1";	break;
  					case 'L':	pierce_name="l1";	break;
  					case 'P':	pierce_name="p1";	break;
  					case '1':	case '2':	case '3':
  					case '4':	case '5':	case '6':
  					case '7':	case '8':	case '9':
  					  index+=parseInt(ch);
  					break;
  					case '/':

  					break;
  					default:
  					break;
  				}
          if (pierce_name !== "") {
            if (str[i+1] == "+") {
              i++;
              pierce_name += "a";
            }
            var xIndex = index%MAX_PER_LINE;
  					var yIndex = Math.floor(index/MAX_PER_LINE);
  					this.setPiece(xIndex, yIndex, pierce_name);
            index+=1;
          }
				} else {
          if (ch == "b") {
            this.teban = SENTE;
          }
          if (ch == "w") {
            this.teban = GOTE;
          }
        }
			}
		},
		getSquare: function(x,y) {
			return this.squares[x+y*MAX_PER_LINE];
		},
		pos2Idx: function(x,y) {
			return (x+1) + (y+1) * (TOTAL_LINE);
		},
		idx2Pos: function(index) {
          var xIndex = index%(TOTAL_LINE) - 1;
					var yIndex = Math.floor(index/(TOTAL_LINE)) -1;
			return [xIndex, yIndex];
		},
		outRange:function(x,y) {
			if (x < 0) {
				return true;
			} else if (x >= MAX_PER_LINE) {
				return true;
			} else if (y < 0) {
				return true;
			} else if (y >= MAX_PER_LINE) {
				return true;
			}
			return false;
		},
		outRangeByIdx: function(index) {
			var ar = this.idx2Pos(index);
			return this.outRange(ar[0],ar[1]);
		},



		getPiece: function(x,y) {
			return this.board[this.pos2Idx(x,y)];
		},
		setPiece: function(x,y,piece) {
			this.board[this.pos2Idx(x,y)] = piece;
	},
		sideByPiece: function(str){
			if (str === "") {
				return -1;
			} else {
   		return parseInt(str[1]);
			}
	},
		enemySide: function(str){
			return this.opposite( this.sideByPiece(str));
		},
		opposite: function(v) {
			if (v == SENTE) {
				return GOTE;
			} else {
				return SENTE;
			}
		},
    changeTurn:function(){
      if (this.freeMode == true) {
        return;
      } else {
        this.teban = this.opposite(this.teban);
      }
    },
    movablePiece: function(piece) {
      return this.movableSide(this.sideByPiece(piece));
    },
    movableSide: function(value) {
      if (this.freeMode == true) {
        return true;
      } else {
        return value == this.teban;
      }
    },
    initTebanBackGround: function() {
      this.tebanBG = RectangleShape().addChildTo(this);
  		this.tebanBG.fill = "#ccc";//'#F88';
  		this.tebanBG.width = SCREEN_WIDTH;
  		this.tebanBG.height = BOARD_OFFSET_Y;
  		this.tebanBG.x = this.gridX.center();
  		this.tebanBG.y = SCREEN_HEIGHT - this.tebanBG.height / 2;
  		this.tebanBG.alpha = 0.7;
  		this.stroke = null;

  		this.gotebanBG = RectangleShape().addChildTo(this);
  		this.gotebanBG.fill = "#ccc";//'#8CF';
  		this.gotebanBG.width = SCREEN_WIDTH;
  		this.gotebanBG.height = BOARD_OFFSET_Y;
  		this.gotebanBG.x = this.gridX.center();
  		this.gotebanBG.y = this.gotebanBG.height / 2;
  		this.gotebanBG.alpha = 0.7;
  		this.stroke = null;
    },
});

phina.define('Square', {
  superClass: 'RectangleShape',

		init: function(xIndex, yIndex) {

    this.superInit({
      width: SQUARE_SIZE,
      height: SQUARE_SIZE,
      fill: "#aaa",
      stroke: "#000",
					cornerRadius: 8,
					strokeWidth: 2,
			});
			this._xIndex = xIndex;
			this._yIndex = yIndex;
			this.color = "#aaa";
      this.r = 255;
      this.g = 255;
      this.b = 0;
      this.tweening = false;
			this.setPosition(xIndex, yIndex);

			this.getter('xIndex', function() {return this._xIndex;});
			this.getter('yIndex', function() {return this._yIndex;});
		},
		setColor: function(col) {
			this.color = col;
			this.fill = col;
		},
		setPosition: function(xIndex, yIndex) {
			this._xIndex = xIndex;
			this._yIndex = yIndex;
			var gridX = Grid(BOARD_SIZE, MAX_PER_LINE);
			var gridY = Grid(BOARD_SIZE, MAX_PER_LINE);
      this.x = gridX.span(xIndex) + BOARD_OFFSET_X  + SQUARE_SIZE / 2;
			this.y = gridY.span(yIndex)+BOARD_OFFSET_Y  + SQUARE_SIZE / 2;
		},
		selecting: function(on_off, center) {
			if (on_off) {
				//this.alpha = 0.4;
				if (center) {
          this.tweener.to({r:0.8* 255, g:0.8* 255, b:0},600)
             .to({r:1* 255, g:1* 255, b:0},400).setLoop(true).play();
          this.tweening = true;
					this.strokeWidth = 2;
				} else {
          this.tweening = false;
          this.alpha = 0.4;
					//this.stroke = "#888";
					//this.strokeWidth = 2;
				}
			} else {
        this.tweening = false;
				this.alpha = 1;
				//this.tweener.to({alpha:1},50).setLoop(false).play();
				this.fill = this.color;
					this.stroke = "#000";
					this.strokeWidth = 2;
			}
		},
    update:function() {
      if (this.tweening) {
        this.fill = 'rgb({0}, {1}, {2})'.format(this.r, this.g, this.b);
      }
    }

});
phina.define('Piece', {
  superClass: 'Sprite',

		init: function(piece_name, xIndex, yIndex) {
			var piece_size = SQUARE_SIZE* 0.88;
			switch (piece_name) {
				case "k1":
				case "r1":
				case "b1":
				case "r1a":
				case "b1a":
				case "k2":
				case "r2":
				case "b2":
				case "r2a":
				case "b2a":
				piece_size = SQUARE_SIZE* 0.98;
				break;
				case "p1":
				case "p1a":
				case "p2":
				case "p2a":
				piece_size = SQUARE_SIZE* 0.75;
				break;
				default:
			}

			this.superInit(piece_name, piece_size, piece_size);
			this._name = piece_name;
			this.setPosition(xIndex, yIndex);

			this.getter('xIndex', function() {return this._xIndex;});
			this.getter('yIndex', function() {return this._yIndex;});
			this.getter('name', function() {return this._name;});
		},
		setPosition: function(xIndex, yIndex) {
			this._xIndex = xIndex;
			this._yIndex = yIndex;
			var gridX = Grid(BOARD_SIZE, MAX_PER_LINE);
			var gridY = Grid(BOARD_SIZE, MAX_PER_LINE);
      this.x = gridX.span(xIndex) + BOARD_OFFSET_X  + SQUARE_SIZE / 2;
			this.y = gridY.span(yIndex)+BOARD_OFFSET_Y  + SQUARE_SIZE / 2;
		},
    selecting: function(on_off, center) {
      var gridY = Grid(BOARD_SIZE, MAX_PER_LINE);
			if (on_off) {
				this.y =  -10 + gridY.span(this.yIndex)+BOARD_OFFSET_Y  + SQUARE_SIZE / 2;;
			} else {
        this.y = gridY.span(this.yIndex)+BOARD_OFFSET_Y  + SQUARE_SIZE / 2;;
			}
		}
});
phina.define('NumberLabel', {
  superClass: 'Label',

		init: function(num, xIndex, yIndex) {
			this.superInit();
      this.text = num;
      this.fontWeight= "bold";
      this.height = SQUARE_SIZE / 5;
      this.stroke = "#fff";
      this.strokeWidth = 5;
			this.setPosition(xIndex, yIndex);

			this.getter('xIndex', function() {return this._xIndex;});
			this.getter('yIndex', function() {return this._yIndex;});
		},
		setPosition: function(xIndex, yIndex) {
			this._xIndex = xIndex;
			this._yIndex = yIndex;
			var gridX = Grid(BOARD_SIZE, MAX_PER_LINE);
			var gridY = Grid(BOARD_SIZE, MAX_PER_LINE);
      this.x = gridX.span(xIndex) + BOARD_OFFSET_X  + SQUARE_SIZE / 2;
			this.y = gridY.span(yIndex)+BOARD_OFFSET_Y  + SQUARE_SIZE / 2;
		},
});

// メイン処理
phina.main(function() {
  // アプリケーション生成
  var app = GameApp({
			startLabel: 'title', // メインシーンから開始する
      scens: myScenes,
      width: SCREEN_WIDTH,
      height: SCREEN_HEIGHT,
			assets: ASSETS,
  });
  // アプリケーション実行
  app.run();
});
QRコードを読み込むと、関連記事を確認できます。
phina.jsで将棋盤ゲームのプログラミングした話 [JavaScript]
タイトルとURLをコピーしました