続・融合

周辺プログラムも書いて大分進んできた。
ちょこちょこ問題が出るので、メモ。

文明値について

現状は段階分けの完全ランダムにしてる。
こういうの。

var levels = [
	{max:0,   min:0, per:500},
	{max:3000,min:0, per:100},
	{max:2000,min:0, per:500},
	{max:1000,min:0, per:4000},
	{max:500, min:0},
];

function level_random(vals) {
	var level_random = Math.floor(Math.random() * 10000);
	var total_per = 0;
	for (var i=0; i<vals.length-1; i++) {
		total_per += vals[i].per;
		if (level_random < total_per) {
			return Math.floor(Math.random() * (vals[i].max - vals[i].min + 1)) + vals[i].min
		}
	}
	i = vals.length - 1;
	return Math.floor(Math.random() * (vals[i].max - vals[i].min + 1)) + vals[i].min
}

5段階あって、5%の確率で完全0、1%の確率で0〜3000、5%の確率で0〜2000、40%の確率で0〜1000、それ以外(49%)で0〜500って形。
前乱数についてちょっと書いた時にこのパターンも書いたかもだけど、限界値3000だけど一般的には1000あれば十分すごい系の値設定に使ってるパターン。


上記は上記でいいとして、属性とかがせっかくあるんだからそっちも使った方がいいのか、むしろ使わない方がいいのかで悩み中。
例えば木文明だとしたら、風属性が高く、自然よりで、かつ森林の多いところに住む種族の方が木文明は発展しやすいだろう。砂漠に住んで道具ばっかり使ってる土属性の種族の木文明のが高いとかおかしいだろう。


と思いつつ、数値設定は適当にしといて、分布図作成の時変な数値のやつは自然淘汰させる方がいいんじゃないのという気もする。
別に砂漠に住んでるけど木文明高いのがいてもいいじゃないかと。
妥当性と意外性の狭間で頭痛い。

JSON保存の問題

生成ロジックとか全部JavaScriptにやらせるから、PHPJavaScriptが送るJSONをおとなしく保存しとけばいいんだよーって話にして、プログラミング作業をほぼJavaScriptに統一させたわけだけど、一点問題が。
クエリ長すぎるんですけど問題。


現在想定しているマップサイズは300x300で、この300x300の情報をJSONで保存しようと思うと、そりゃもうすごい。
ざっと5MBだ。テキスト容量だけでこれだ。
いくらなんでもでかすぎる。
まあ、画像データ格納すること考えたらそんなでもないんだけどね。


解としては、こんなのが候補にあげられる。

  1. 軽くする
  2. MySQLにがんばってもらう
  3. 圧縮しちゃう
  4. JSONやめる

軽くするのは、JSONのネックって結局プロパティの表現なんで、いまだと温度をあらわすだけで300x300 = 9万個の"temperature":10みたいな文字列があるんだけど、これを"t":10にすると90万バイトの節約になる。
こういう作業を繰り返せば、おそらく2MBくらいまでは節約可能。まだまだでかいけどね。


MySQLにがんばってもらうのは、クエリ長すぎったって所詮10MBくらいだからそのくらい許してよーって駄々こねるというか、max_allowed_packetをいじる。
ただこれはあんまりやりたくないなぁ。所詮ロリポ生活の貧ちゃんだからな。あんまりサーバさんをいじめるのはやめたいなと。ヤドカリなら1クエリ1MBくらいに抑えるべきだろう。


他、ZIPにしちゃう。同じ文字列が多いから、5MB程度なら700KBくらいまでは落とせることが計算可能。


最後、JSONやめる。
マップデータなんてRDBであらわしやすいんだから、まあこうしちゃうのも手ではある。


ZIPでいいかなって気もするけど。zlib.deflateを使おうかなと。

他のJSON保存の問題

ちょくちょくソース直すんだけど、時々DBデータとプログラムが合わない。
よくあるのがプロパティの移動。
前はx.body.weightだったのを、x.life.weightに移すとか。
DBではこのオブジェクトがそのまんま入ってるから、DBではx.body.weightになってて、プログラムではx.life.weightがあると。


今やってるのはjavascriptのデータクラスがJSONとは別にあって、このクラスにJSONのデータを入れ込むって事をしてる。
ということでデータクラスのデータはJSONによって上書きされるけど、JSONが持ってないデータをデータクラスが持っている場合は削除はされない。ということで二重管理になる。


二重管理になっても特に不具合なく動くんだけど、二重管理になってもエラーになんないからなかなか気づけない。
まあJSON突っ込む以上、こりゃしゃあない。構造変えた時にちゃんと整合性とるようにするか、プロパティチェックしてエラー吐くようにするしかない。

などなど

諸々問題起こりつつも大分出来てきた。
今日は陸海空の3竦みを片付ければ、寿命や成人可能年齢、それに外見部分以外はほぼ出来上がる。


外見部分は悩みどころだけど、どうしても画像合成に近い感じでやりたいんだよなぁ。
蛇と人を合成した時に、"体長5mの人"が出来るんじゃなくて、蛇の胴体を持った人が出来るべきで、蛇の胴体だからこそ5mになるべきだと思うんだけど、画像が無いとやっぱりしっくりこない。
でもこれにとりかかると大分重くなるから、どうしようかなと。


まあ、これは明日だな。