「裏企画_プログラマ向け仕様書」の編集履歴(バックアップ)一覧に戻る

裏企画_プログラマ向け仕様書 - (2008/09/16 (火) 04:22:58) のソース

*作業中

ここではオタピッタンのプログラマ向け仕様書を提案する。
主に盤面や選ぶ君でのデータ的な処理を行い、画像関係には一切手を触れず、データの操作のみに関わる処理である。
画面周りはここで作成したオブジェクトを元に作成することになる。
非常に多くのギミックを実装することになるので、一通り下記のギミック一覧を参照すること。


ギミック一覧
[[http://www14.atwiki.jp/c21coterie/pages/74.html]]


仕様書についてはイラスト入りで丁寧に解説を行っているので順番に読み、何度か読み返せば確実に分かるように作ったつもりである。
抜けがあるかもしれないので説明の分かりにくい部分、記述の不十分な部分などを見つけた場合積極的に質問して欲しい。
連絡先
sin-horie@mvd.biglobe.ne.jp


非常に細かく説明を作ったが、これには以下の理由がある。
- プログラマが何らかの理由で交代する時、引継ぎの手間を軽減する。
- 将来ステージ製作者が参加したとき、必ず新しい視点からの新しい要求やギミックが提案される、その時整然と追加機能をつけられるよう、最初のうちから丁寧に記述する必要がある。
- 別チームがこの企画に興味を持ち派生版を作成したくなった時、楽に引き継げるようにする
- &bold(){このゲームの開発記録を元に初心者向けゲーム製作本「オタピッタンで覚えるゲーム製作」等を作成し小金をもうける予定である。このとき流用しやすいように作る必要がある。もちろん作成するのはプログラムに詳しくない初心者向けの本であり、本にする時にはより丁寧できちんとした順番で説明を行う}
等の理由から丁寧につづっている。
まだ説明は作りかけであり、各ギミックの細かい仕様については後日記述する。


*以下仕様書本文。
*序文
**用語の定義
始めにオブジェクトの一覧を表す。
Stageオブジェクト stageを現す
Stage.map 文字を置いていく盤面を現す n行m列の配列でMasuオブジェクトへの参照を持つ
Masu オブジェクト 一つのマスを現し多種類のギミックを持ち多様な種類がある。
mozi オブジェクト 盤面においていく文字、最初は選ぶ君に入っていてこれも多種類あり、実装する必要がある。
stage.erabukun 選ぶ君をあらわす。

図で説明する。
&ref(zyobun1.JPG)
例えば上記盤面ではstage.mapは5行11列の配列で
それぞれのマスにマスオブジェクトが参照されている。
この盤面で赤丸部分に文字を入れたとすると、"あいこう"や"眼光"など色々な単語が出来て得点が入るが、この処理を"文字列探索・得点処理"と命名する。

&ref(zyobun2.JPG)

マスオブジェクトは非常に豊富なギミックを持つためたくさんのプロパティを持ち
Mapオブジェクトはマスオブジェの操作を行うためのメソッドを持つ。
詳細については別ページに用意した。
[[裏企画_オブジェクトのプロパティメソッド一覧]]要印刷
[[裏企画_プログラム定数一覧表]]要印刷
両方とも現在準備中。

文字を置いた時のフロー。
&ref(zyobun3.jpg)
まず文字の種類(巨大文字やギミック文字)とマスの種類から、そのマスに文字を置けるかを決定する。
置けたら、適切な順番でギミック毎に処理を行う。
"文字列探索・得点処理"を行うかどうかはギミックの種類次第となる。
ちなみに右に書いてあるのはギミックが効果を表すタイミングである。
最後の処理は、毎ターン自動実行されるギミックである。


**文字の探索方法とギミックの種類
ここでは文字の探索方法を説明する。
&ref(P_stage0.JPG)
上記のような盤面で赤丸に文字を置いた時どう処理すればよいかを説明する。
図A
&ref(P_stage1-2.JPG)

上記のように全経路探索を行うことになる。
赤丸から出発して全ての全経路探索をし、最後に左側、真ん中、右側の文字列を組み合わせることになる。
全経路探索には亀のたとえ話を使う。
亀は、左向きLと右向きRの2種類。
亀は、マスにはいるたびに文字と、通ったマスオブジェクトを覚えながら(バッファに溜め込みながら)ヒトマスずつすすむ。
2*2マスなどの分岐のできるマスにたどり着くと、そこで片方の道を選び進む。
先が進めない行き止まりになるか、覚えた文字が8文字になると、そこで進んだマスのリストと文字を記録してから、引き返して手前の分岐点まで戻り、また文字を覚えながら分かれ道を進む。

亀はこれを繰り返しながら、再帰による全経路探索を行うことになる。
次の行き先が提示されたら、次のマスが進入可能か調べ、進入可能なら進み、不可なら戻るだけである。
全ての経路を通るまでこれを繰り返し、全ての経路を調べたら2匹の亀の集めた文字列
と、真ん中の文字列を組み合わせを調べ、単語になっているかのチェックを行い得点を計算する。


文字列の組み合わせ方法。
下図にあるように全ての組み合わせを求めることになる。
&ref(P_stage1-3.JPG)



亀には左向きと右向きいる。
左向きはユーターンマスを通れないが、右向きは通れるという違いがある。
例では左右の場合のみを提示したが上下でも同じである。


亀が巨大マスに入った場合について説明する。
&ref(P_stage1-4.JPG)
上図では亀が右向きで巨大ますに入ってきた場合rightCol+1列目(ここでは7列目)の4,5,6行目が亀の次に進む道になる。

注 rightCol="マスオブジェのプロパティでマスの右端列を現す整数型"

ここで5行目は先がないので亀は進まない。
また巨大マス例2のように、先行きが同じ場合もあるので、亀の行き先を提示する前に重複した行き先を削除すること。
右向きの場合について説明したが,上図で亀が左向きならleftCol-1列目(3列目)の4,5,6行目となるし、上下でも基本的な処理は同じである。

注 leftCol="マスオブジェのプロパティでマスの右端列を現す整数型"

----
Uターンマスの実装についても同じのりとなっている。
Uターンマスの特徴は右向きに入ったら下向きに出るなどの単純な対応が存在することであり、その対応表を力技で作成することで作成することが出来る。
ユータンマス参考図
&ref(U-turn2.JPG)
上図Aでは左や下や右からマスにはいろうとしても入れないが、上からなら入れる。
よって亀が次のマスに進めるか判断する時には上から以外拒否し、上からなら次に右のマスを示せばよい。
Bでは複雑な形のユータンマスの作り方を示している。
ユータンマスには色々なパターンがあるが、分岐のあるマスも存在する。
その場合は巨大マスと同じ分かれ道として扱う。
参考画像準備中

ユータンマスの詳細なリストについてはこちらを参考にして欲しい。
[[ユータンマス種類一覧]]準備中

ユーターンマスを導入すると亀が同じ場所をループする場合がある。
それを防ぐために、亀に条件判断を付け加える。
亀は同じ順番で同じ場所を通ったら探索をやめて引き返す。
一定マス以上進んだら引き返す。
等の条件判断を付け加えることでこれを回避する。
概論について説明が終わったので次は詳細なギミックについて解説する。




----
----
*ギミック一覧
ここから先は各ギミックについて詳細に解説する。
種類ごとに分けて紹介しているので実装においてはそんなに困らないはずである。

----
**文字系ギミック
*** 得点処理が起こらない文字ギミック
ここで紹介するのはえらぶ君から選んで盤面に使用することで、効果を発揮するギミック群である。
- 消しゴム文字 回収文字 ギミック文字 ギミック回収文字
の4種類となる。
得点処理が行われないので、シンプルに記述できるものばかり、肩慣らしと思って良い。
&ref(mutokutenGimkku)

----
0 消しゴム文字。
適用する升目のマスオブジェクトの文字を空白文字にして、あとは処理終了だけの単純な文字である。
消しゴム処理後は"自動実行ギミック"まで処理を飛ばす。
消しゴム文字はプロパティをType=0 mogi=""として普通の文字同様に扱い、マスに文字があるならその文字を""にして終了する。
文字が無いマス、文字を置けないマス(マスオブジェのmoziOKフラグがFalse)に対しては適用できない。
具体的な処理は、マスに文字を置く"文字置き時イベント"に、消しゴム文字専用の分岐処理をつけて行う。
フローチャート
&ref(kesigomu.JPG)
適用がコピー枡の場合、白紙へのコピーは起こらないとし、適用したマスの文字だけが消える。

----


1 回収文字
文字オブジェクトのプロパティをtype=1 mogi=""として扱う。
適用マスに文字があるなら、その文字を盤面から回収して白紙マスにもどし、文字をえらぶくんにもどす。
基本的な処理は消しゴムと同じ、回収した文字をえらぶ君に追加するAddMoziメソッドが増えているだけである。
Copyマスに回収を適用した場合、関係するCopyマスを白紙にする必要はない。
CopyマスのCopyが発動するのは文字が置かれた時のみとなる。
&ref(mozikaisyuu1.JPG)

----
2 ギミック文字
盤面にギミックを置き、上書きできる。
&ref(gimikkumozi.JPG)
具体的な処理について。
文字オブジェクトのプロパティをtype=2 mogi=""として扱う。
基本の文字オブジェクトに、マスオブジェクトを保持するためのmasuプロパティを追加する。
マスに適用するときは、升目の参照している升オブジェクトへの参照を削除し、文字オブジェクトのマスオブジェクトを参照させる処理を行う。
6行8列目のマスを変更する例。
mm=mozi.masu
smm=stage.map(6)(8).masu
mm.itiCopy(smm)//先頭行や最下端行などの位置情報やマスオブジェを参照している升目をコピーする。
stage.setMasu(mm)'置き換える
メソッドの詳細については[[裏企画_オブジェクトのプロパティメソッド一覧]]要印刷で紹介する。

置き換え後は"文字列探索・得点処理"を行わず、"毎ターン自動実行ギミック"まで処理を飛ばすのは消しゴム文字と同様である。
ギミック文字に使用できるギミックの種類と、巨大マスへの適用時の詳細は後日記述する。
ギミックマス適用時の詳細な定義づけはリンク先で行う。
[[裏企画_ギミック文字適用時詳細]]準備中

----
3 ギミック回収文字
回収文字が文字を回収するように、盤面からギミックを回収する事が可能。
回収したギミックはギミック文字とし、addMoziメソッドを使用してえらぶ君に追加する。
改修先のマスは白紙マスに戻す。

- 巨大マスに適用する場合。
追加時の注意としては回収先のマスが巨大マスの場合、大きさは無視し、1*1マスのギミック文字としてえらぶ君に追加する。
回収先のマスは単なる白紙の巨大マスとする。
回収できるギミックについてはギミック文字で使用できるものと同様とする。
具体的にはマス種類を現すType(実数)に基づいて回収可能かどうかを判断する。
処理終了後は、"毎ターン自動実行ギミック"まで処理を飛ばす。


----


** 文字系ギミック2 得点処理が起こる文字ギミック
-上書き文字 引っ張り文字 繋がり文字 巨大文字
フローを示す。
&ref(tokutenGimkku.jpg)
ここまでのギミックとの違いは得点処理がつく点である。
----
上書き文字
mozi.type=4
文字を上書きする。
そのマスに空文字もしくは文字が存在し、マスオブジェのmoziOKフラグがTrue
の時に限り文字を上書きし、その後は普通に文字を置いた時と同じ処理とする。
参考画像。
&ref(uwagakimozi1.JPG)
----

引っ張り文字
上下左右にある文字を引っ張り集めるギミック。

図で説明する。
A点に引っ張り文字が置かれた時のイメージ。
青線が引っ張り先。
巨大マスを通る場合同じ行同じ列が優先される。
&ref(hipparimozi1.JPG)

引っ張り後。
&ref(hipparimozi2.JPG)

文字が引っ張られていることを確認して欲しい。

注目すべきは2つ、巨大マスに入った時の引っ張りは同じ行列優先となっている事。
もう一つはユーターンマスを超えて文字が移動できないので止まってる文字と、ユータンマスを順当に移動できるのでAマスの隣まで引っ張られる文字がある。
"あ"はユータンマスを逆走できずに止まっている。
"い"は引っ張りの手前まで、"う"は引っ張られたがユータンマスの上が文字置き禁止なので手前で止まっている。


""

また、文字置き不可のマスには文字を置けないので手前で止まっている文字があることを確認して欲しい。

引っ張り処理を亀で説明する。
亀が上図で説明された効果を起こすために、一つずつ文字をひっぱて全部の文字を引っ張てくる。
亀はルールに従い、経路探索を行い、文字を引っ張る順番を決めて文字を引っ張る。
1 巨大マスには行った時同じ行列を通る。
2 ユータンマスでは文字を持って帰るとき、ユータンマスを超えれず、そのマスに文字を置いて、文字を置いた枡を出発点にまた文字を詰めていく

&ref(hipparimozi3.JPG)
亀がA点でひっぱている場合の処理。
&ref(hipparimozi4.JPG)
亀は自分の通ったマスのリストを覚える。
そして右側の文字から順に右端に詰めていくわけである。


より詳細な使用
引っ張り文字の効果によってCopyマスの効果が発動する時は、最後に亀が置いた文字となる。
ユータンマスによって複雑な引張りが起こり、複数の方向からの引っ張りが生まれた場合、引っ張り文字からの升目数が少ない方を優先する。
同じ場合、先にひっぱた方を優先する。
ユータンマスの出口が一つしかない場合、そちらの方向を引っ張る。
ユータンマスの出口が2つ以上あるときは、まっすぐを優先する。
T字路の場合、止まる。
巨大マスのユータンがある場合、近い方を優先する。
(ただし巨大マス+ユータンマス+引っ張り文字の組み合わせは非推奨とする)


----

繋がり文字。
"文字の探索方法とギミックの種類"で紹介した亀を必要な数だけ用意し7文字か8文字探索させることで整合性を取る。
参考図。
&ref(tunagarimozi.jpg)
上手の場合青方向に7文字まで調べる亀を2匹で1セット、赤と緑方向に8文字まで調べる亀を1セットずつの計3セットで順番に探索を行う。
もちろん2文字のどちらかが文字を置けないマスにかかる場合当然のことながら繋がり文字は置けない。
巨大マスに置く時は、マスのmoziプロパティを変更するだけでよい。

長方形の巨大マスが乱雑に入り組んだステージではユーザーインターフェイスの作成が困難となるが(どのマスに埋め込むかの操作を簡単にすることが困難)、ここではそこまで踏み込まない。

----
巨大文字
2*2や1*3などいろいろな形があり意外と厄介な問題を控えている。
解決策は3種類ある。
どれがいいか決定するために、プログラマはぜひとも3種類作って欲しい。
タイプ1
文字より大きなマスの中にしか置けない。
2*2マス文字なら3*3や2*2や2*3等には置けても、1*3や1*1などには置けない。


タイプ2
下にあるマスのフラグがmoziOK=trueかつ、2*2マスなどを半端にさえぎってない限りは文字を置ける。
参考画像準備中。


タイプ3
問答無用で下にあるマスを無視して置き換える。
巨大マスを切っておいた場合、切られたマスは白紙の1*1マスとして処理する。
参考画像準備中


----
*** 升目ギミック1 文字の探索に関わるギミック
- ユーターンマス 壁 ラウンドマップ お邪魔ブロック
フロー画像準備中

----
ユーターン枡
最初の"文字の探索方法とギミックの種類"で説明したので飛ばす。


----
壁
ユーターンマスと同じように対応表を用意すればよい。
壁の場合、一工夫して壁の立っている向きをデータで持たせて、亀(文字の探索方法とギミックの種類で説明した比喩キャラ)が壁の立っているほうからマスを出ようとしたり入ろうとしたら、その進行は不可だと亀に伝えることで処理をする。
壁の立っている向き
UP,Down,Right,Leftを
u,d,r,lとする.
データ例。
masu.kabe="u,r" マスの上と右に壁が立っている。
masu.kabe="d" マスの下に壁が立っている
このkabeプロパティのデータに従い、壁のあるマスへの進入可不可をより分け亀に伝える。


----
ラウンドマップ
ユーターンマスと同じように、次のマス座標を指し示すだけでよい。
亀がワープするだけである。
参考画像準備中
ただし、ワープ先は、亀が通るたびに逐次探索し、同じ行の一番左にあるマスへワープさせること。
これは、ただ単に升目の激しい移動が行われるステージに対応するためだけである。


----
お邪魔ブロック
升目の上を閉路巡回し、下のマスを隠す邪魔なブロック。
閉路巡回については、巡回先の座標をリストとして持つ。
&ref(ozyama1.JPG)

お邪魔ブロックはstage.ozyama[]の配列に、ozyamaオブジェクトとして格納する。
ozymaのプロパティは以下のとおりである。
one=stage.ozyama[0]//複数いるお邪魔ブロックの一つを取り出す
one.root 道順を現す。絶対座標で複数のリストを持つ。
one.masu マスオブジェクト、このマスオブジェクトで下にあるマスを置き換える。
ブロック同士が同じマスにブッキングした場合 配列の添え字の大きい方が上にかぶさるとするが、基本的にはルートが被らないのが望ましい。
ブロックの移動は、毎ターン自動実行ギミックの時に行う。


裏設定であるがお邪魔ブロックの正体は、盤面を歩き回る虫で背中にマスを背負っている。
色々と種類があり、豊富な要素を持つとする。
またこの設定に基づいた、追加ギミックも考えている。

----

*** 升目ギミック2 升目に変化を与えるギミック
- A群 くぼ地マス 爆弾マス
- B群 めんこマス
----
くぼ地マス
名前のとおり普通より深いマスで深さ分だけ文字を置ける。
白紙マスを元に、文字を置ける回数をカウントする変数を追加しただけで,
文字が置かれるたびに、この変数を減らすだけである。
基本的な処理は白紙マスと同じである。

----
爆弾マス
イメージはそのままボンバ○マン。
時限爆弾タイプで、"毎ターン自動実行ギミック"処理のたびにカウントされ、爆発すると爆発先の文字が吹っ飛ぶ。
爆発の形はボンバーマンそのままとする。
爆弾の破壊力も設定され、数字が大きいほど被害を受ける範囲が広くなる。
ステージ開始時に爆発の範囲を表示する必要があるので、爆発の影響範囲のリストにいつでもアクセスできるようにしておくこと。

爆発範囲に巨大マスがある時は、同じ行同じ列を保って爆発を直進させることとする。
また、ユータンマスでは爆発の方向を曲げることが可能とする。
参考画像。
爆弾の影響範囲は4マスまでの場合を示す。
赤いラインが爆弾の影響範囲であり、このラインが通ったマスの文字が消える。
&ref(bakudan1.JPG)
&ref(bakudan2.JPG)
&ref(bakudan3.JPG)
爆発範囲を求めるには引っ張り文字で説明された、引っ張り亀と同じ探索を行う。

----
めんこマス
白紙マスに裏面のマスを現すMassオブジェクトと、今表か裏かを保持する変数を追加するだけでよい。
メンコマスは文字置き時に、マスの表裏がひっくり返るので、文字を置くたびにチェックが要る。
文字置き時、周囲のマスに面子マスがないかを確認し、あればメンコをひっくり返せばよい。
コードが汚くなるギミックなので、チェックとひっくり返し処理はメソッドとすること。
魅力度低のギミックなので最後に実装してよい。

----

*** 升目ギミック3 マス移動に関わるギミック
- 平行移動 回転移動
巨大マスとやたらと相性が悪いギミックである。
元祖"もじぴったん"でも巨大マスへの回転や平行移動の処理は基本的に行われていない。
下図イラストに代表されるように定義困難な状況が多数発生するので、巨大マスへの回転・平行移動適用はステージ製作者の自己責任とする。
しかし巨大マスへの回転・平行移動も可能な場合があるので一応定義しておくとする。

基本的な考え方。
平行移動については、頻繁に行われるわけでないことから実装はシンプルに行う。
基本的な考え方はシンプルである。
移動しないマス一覧=盤面のマスの存在する部分のリスト-平行移動するマスのリスト
移動後位置=移動するマスの座標を平行移動させる
移動しないマス一覧 と 移動後位置に重なりがなければ移動可能とする。
でなければ移動させないとする。
参考画像準備中


回転についても、基本は同様である。
元祖もじぴったんでは60度120度60度120度で一周するなどの変わった回転が存在するが、これについては後述する。
回転については2種類の方法を用意する。
1 基本回転
指定地点を中心とした90度の回転行列とする。
回転行列だけでよいのでバグも特に出ず実装が容易となる。
2 リスト形式
回転するマスのリストを保持する。
この場合リストをマスオブジェクトへの参照とするもよし、絶対座標とするもよしである。
両方をサポートしたメソッドとプロパティを用意して欲しい。

回転後定義不可能状態になる場合、回転を行わない。
これは元祖"もじぴったん"において、移動先が詰まってた場合平行移動が行われないのと同じである。


----


次のギミックに移る。
* 盤面に文字が置かれるたびに無条件に効果が発動するギミック
毎ターン自動実行ギミック。
盤面に文字が置かれるたびに、無条件に自動実行されるギミック。
風化マス、コンベアマス、幽霊マス
----

風化マス
マスに置いた文字がターンが立つごとにだんだん風化して一定ターン過ぎると文字が完全に消える。
文字が消えるまでの時間は任意で設定可能とする。
風化マスに文字が置かれているなら、カウントして変数が0になったら文字を消すだけの簡単な処理とする。

----
コンベアマス
文字が置かれるたびに、コンベアが動き上に置かれた文字を運ぶ。
現実のコンベアと同じように移動先がつまってたら文字は移動しない。


参考図。

コンベアマスは一連の繋がった升目のリスト形式で保持される。
コンベアマスの上に置かれた文字は、毎ターン移動し、リストの順番どおりに移動させる。
stage.conbea[]の配列から参照される。
参考画像準備中。
コンベアマスには端っこが切れたタイプと周回するタイプの2種類ある。
端切れタイプはコンベアの先端から文字を動かすことで、コンベア詰りを正確に表現する。
周回タイプは文字が周回するだけである。
画像準備中
コンベアについてはコンベア管理専用の小さなオブジェクトを作ることで解決する。


注意点。
コンベアマスには絶対に平行移動や回転などを適用してはいけない。
定義困難な状況が生まれるからである。
その為にmoveOkフラグをマスオブジェクトに用意してあり、これにFalseと設定してあるならそのマスを動かしてはいけないとすることで実現する。

----
幽霊マス
メンコマスの裏面をNullマスとして設定する。
メンコとの違いは盤面のどこに文字がおかれようが自動実行させること。
メンコマスと同じく魅力が低いので最後でよい。

----

* 2行3列や4行2列などの巨大マスがもたらす問題。
ここでは、巨大マスのもたらす問題について説明する。
巨大マスはありとあらゆる種類のギミックと相性が悪い。
1*1マスのみでやっている限り問題ないのに巨大マスを導入すると、恣意的な処理が無数に発生する。
それは足し算引き算だけの世界に割り算が導入されて0除算エラーが生まれるが如しである。

参考画像
&ref(22masuMondai.JPG)

詳細については後日記述する。