非公開found探索ウィンドウが抱えている発見物(Windows.md 5.1節)。まだどの枠にも居たことがない。
非公開 読み取り専用source非公開window子ウィンドウが今出している1枚(Windows.md 1.1節)。借りているという事実はこれだけ ——ウィンドウがその札を出しているなら、元の枠には出ていない。運んでいる途中かどうかは 画面の側の話で、ここには持ち込まない。
束から借りたならその束も持つ。ポートレイト(キャラクタ自身の札)のように束でない札もあり、 そちらは映すだけでボタンの相手にはならない。subjectは束の有無によらず在るので、 窓を畳むかの判定(reborrowedWindow)は札を借りない窓にも同じ形で効く。
抱えている発見物。渡すのは並びの実体で、写しではない。ただし顔ぶれが変わるのは丸ごとの 差し替えだけ——抱え直すか手放すかのどちらかで、抱えている間に1枚ずつ出入りすることは無い ——なので、読んだ配列は差し替えの前の顔ぶれを持ち続ける。 探索を跨いで読む側は、自分で 写し取るのではなくこの口を読み直す。
子ウィンドウが今出している1枚(出していなければundefined)。
子ウィンドウが今映している束(束でない札を出しているウィンドウではundefined)。
掴んだ札を重ねれば何かが起きる枠(場所ごとに、その場所の並びの中の位置)。理由を告げて 断るだけの相手は入らない(CardInteraction.md 2.1節)。
1枚ずつ問わせずにまとめて答える。 枠を1つ問われるたびにその場所の札を丸ごと作り直す (stacksAt)ので、並んでいる枠の数だけ問われれば枚数の2乗で伸びる。ここは場所ごとに並びを 1度だけ作るので、答えを出す値段は枚数に比例する。
見るのは1枚を運んだとき。まとめて運べる枚数(multiDropLimit)は見ない——ふちの光が示すのは 「持っていけば何かが起きる」だけで、何枚ついてくるかは重ねてから数えるため (CardDragController.trackCarry)。
非公開aloft今その枠に居ないインスタンスと、その枠が帰りを待つか。awaitedは貸した札(帰ってくる場所として
枠と識別子が残る)、unplacedは発見物(帰る場所を空けておく理由が無く、並びにも入らない)。
その1枚を、子ウィンドウが出す札として借りる。この時点から、それは元の枠ではなくウィンドウの枠に 出ている——枠から枠への運びは、並びの差し替えがそのまま見せる(cardMotionPlan)。
subjectは窓が映している1個(ObjectWindowView.object)。stackを渡さないウィンドウでも要る ——場所やキャラクタの窓も、映しているものが見えなくなれば畳むため(reborrowedWindow)。
札を出さないウィンドウでは束を渡さない(装備・怪我)。渡すと、元の枠から消えたままどこにも 出ない札ができてしまう。
その並び(stacksAt)の束に、その上で何ができるかを付けた札(空き枠はundefined、並びは そのまま)。
場所ではなく並びを受け取る。 枠を組む側(slotCells)は束と札を添字で突き合わせるので、 場所から2度引くと、2つの並びが一致するという規約が呼び出し側に残る。
移せない札にも掴む操作は付く。 他の札へ重ねるcombinationの元にはなれるため。押したときに 何が開くか・端の移動をいつ実行するかは画面が決める(CardSource.onOpenCard・onEdgeMove)。
そのドロップが札へ重ねたときの組み合わせ(返すものが無ければundefined)。成立するとは限らない ——理由を告げて断るものもenabledがfalseで返る(CardInteraction.md 2.1節)。実行されるものだけが 要るならdropCombinationを使う。
受け取るのはドロップ1つで、掴んだ場所・重ねた先・枚数をばらして渡させない。ばらすと、噛み 合わない組(別のドロップの掴み元と重ね先)を渡しても型は通り、起きていない組み合わせを答える。
非公開combinationその2枚を重ねたときの組み合わせ(返すものが無ければundefined)。成立するとは限らないのは combinationAtと同じ。
個体を1つも出していない札(帰りを待つ印)は、掴む相手にも重ねる相手にもならない。
非公開combineカードへ重ねたときに言うことと、それが実行される組み合わせなのか。順は成立する組み合わせ → 入れ物としての受け入れ → 断る組み合わせ(CardInteraction.md 2.1節)で、最後のものが返ったときは 何も起きない(combinationはundefined)。
順を書くのはここだけ。 起きることを問う側(dropEffect)と、何が起きたと記録する側 (dropCombination)が別々に順を持つと、入れ物へ入れたのに「重ねた」と記録する、といった食い違いが 生まれる。
そのドロップが実行する組み合わせ(そうでなければundefined)。入れ物としての受け入れに譲ったものも、 理由を告げて断るものも含まない——「重ねた」と記録してよいかを見分けるのはここ(PlayScene.dropLabel)。
そのドロップについて言うこと(何も言うことが無ければundefined)。カードに重ねたらcombination、 相手が入れ物ならその中へ入れる、隙間・空き枠へ落としたら位置を変える。同じ場所の中ならスタックごとの 並び替え、場所をまたぐならカード1枚の移動。起きることとは限らない——下のとおり、離しても何も 起きない断る組み合わせもこの形で返る(enabledがfalse)。
どれも同じ1つの形(CardDropEffect)で返る。 画面は「重ねた」と「入れた」を区別せず、名前と時間を 吹き出しに出して実行するだけ(CardInteraction.md 2節)。
理由を告げて断る組み合わせ(enabledがfalse)は、入れ物としての受け入れに譲る(順はcombineEffect)。 実際に起きることのほうが、起きない理由より先に見せるものだから。
非公開edge端を押したときの移動(その向きへ移せないならundefined)。行き先は「空いている場所」なので位置は指定しない。
非公開edgesその札が出す端の操作。そこへ移せる札だけが矢印を出すので、置ける設置物(設置もできるかご)を 足せば、画面を直さずに設置物レーンとアイテムレーンの間を行き来できるようになる。
その向きの行き先の候補を、近い順に。フィールドの並びの上下関係(設置物→アイテム→手持ち) そのままで、子ウィンドウのカードの下は手持ち。
手持ちの上は、子ウィンドウを開いている間だけそちらを先に見る——カードをやり取りする相手が 画面に出ているなら、端を押す操作もその相手を指すのが自然なため。受け取れない相手(怪我)なら 元どおりアイテムへ落ちる。開いているだけで手持ちの端が使えなくなるのは不便なため。
候補の並びを公開しているのは、順と長さがここからしか見えないため。 edgeMoveActionが返すのは 落とせた1つを実行する閉包だけなので、どれも落とせない向きに候補が何番目まで在るかは出ない。
非公開faces見つかった個体を、レーンでの束ごとに1枚の札へ畳む(見た目と、見つかった個体の識別子だけ)。
既に在った分は混ぜない——石の束へ石を見つけたら、枠に出るのは見つかった分だけで、元から 在った分はレーンに残る(Windows.md 5.1節)。
その束のうち、子ウィンドウが映すことになる先頭の1個ぶんの札(まだ借りていない)。束を押しても、 ウィンドウへ移るのは先頭の1枚だけ——ボタンの操作が効くのもその1個なので、残りは元の枠に 居たまま掴める。
そこで絞り込みが隠している札の枚数(隠していなければ0)。数えるのはここ——絞り込みを掛ける 前の並びを持っているのはここだけで、レーンの側で引き直すと同じ引き算が2箇所に分かれる。
数えるのは並ぶ単位(札)で、束の中の個体数ではない。貸し出し中の枠に残る印も1枚——「すべて」を 押せば戻る枠が、そのぶんだけ在る。
そのドロップでまとめて動かせる最大枚数(1ならついてこない)。約束できるのは、受け取る側が
何枚まで受け取れるかを実行前に答えられるときだけ——枠は空きから、combinationはallow_multiple
(GameElementDefinition.md 12.4節)を宣言していればacceptedCountIncludingSelfから答える。
宣言が無いcombinationが1に留まるのは、条件が世界のどこでも見られ、1回実行するたびに世界が
変わるので、2回目が成立するかはやってみるまで分からないため。
非公開overlayその2枚を重ねたときに言うことと、それが実行される組み合わせなのか(combineEffectの中身。 ドロップではなく札2枚で受けるのは、並びをまとめて引いた側からも同じ順を通すため)。
非公開presentそこに並ぶ束を、絞り込みを掛ける前(present)と後(shown)で一度に。hiddenAtが引き算に要る 2つを1度に返すので、前と後で別々に引いて突き合わせることがない。
絞り込みが効くのは設置物レーンとアイテムレーンだけ(ScreenLayout.md 8.1.6節)——手持ちは左へ 詰まっていて隠しても短くならず、子ウィンドウの中は今開けている入れ物そのものの中身なので、 絞ると開けた意味が消える。
出ている個体が1つも当たらない札は隠れる。 貸し出し中の枠に残る印(objectsが空)も同じで、 帰ってくる先はその札が当たるようになったときに現れる。
非公開presentそこに並ぶ束から、持ち出されているぶんだけを引いた並び(絞り込みはまだ掛けていない)。
非公開reborrowed貸している1枚を今のワールドで引き直す(引き直せなければundefined)。束ではなくその1個 ——ウィンドウが映しているのも、ボタンの操作が効くのもその1個だけ。引き直せたら、映す束も 返すときの姿もその新しい札になる。
子ウィンドウが映しているものを今のワールドで借り直し、まだ映せるかを答える(映せなければ ウィンドウを閉じる合図)。
映せなくなるのは、映している1個が現在地から見えなくなったとき——食べた・打ち割った物も、 別の土地へ移って置いてきた物も、同じ1つの基準で落ちる(CardSource.visible)。世界に在るかどうかは 見ない。道は移った先から見えないだけで世界には在り続けるため。
借りている束は今のワールドで引き直す。差し替えの前後で束は別物になっているので、そのまま使うと 次のアクションが古いインスタンスに対して組まれる。
そのドロップで手から放したもの(MotionContext.released。矩形を添えるのは呼び出し側)。 どの個体が動くのかは、起きることの側が答える(CardDropEffect.movedIds)——ワールドが動かすものと 画面が飛ばすものを食い違わせないため。
入り直すときに全部を手放す。前のプレイの世界の札を持ち越さない。
子ウィンドウが借りていたものを全部手放す(映している1枚と、抱えている発見物)。窓が消えれば どちらも出る場所を失うので、片方だけ返すことはない——分けて持つと、閉じる道筋が増えたときに 片方を呼び忘れる(実際に発見物がレーンへ帰らなくなっていた)。
返ってくるのは手放したもの。次の差し替えから元の枠に並ぶので、呼び出し側は出どころ (それぞれが今居る枠)を渡すだけでよい(MotionContext.origins)。
発見物だけを手放す(次の探索を始めるとき、Windows.md 5.1節)。窓が消えるときはこちらではなく returnBorrowedを呼ぶ——借りているものを1つずつ数える必要が無いように。
その札から、子ウィンドウが借りているぶんを引いた姿(束を持たない札——ポートレイト——のためのもの。 束の並びはstacksAtが同じ引き算をする)。1個も残らなければ、帰りを待つ印になる。
非公開shownその束のうち画面に出ているぶん(1件)。全部が持ち出されていれば、帰りを待つ枠には印だけが残り (薄い印、CardInteraction.md 6.2節)、待たない枠には何も残らない(0件)。
出ている個体だけを名乗る(identity)。よそに出ているぶんはawaitedとして枠が待つので、 同じ個体の札が画面に2枚出ることはなく、掴める札・重ねられる札もここに在るものだけになる。
そこに並ぶ束。持ち出されている札と絞り込みで隠れる札を差し引いた、画面に出ている姿そのもの。
非公開stacksそのドロップが指している、掴んだ札と重ねた相手(居なければundefined。重ねたのでなければ相手は 無い)。
その場所の並びは1度しか作らない。 stacksAtは呼ぶたびにその場所の札を丸ごと作り直すので、 同じドロップについて何度も引くと、引いた回数だけ同じものを作ることになる。掴み元と落とし先が 同じ場所なら同じ並びから採るのは、同じ束へ重ねたことを参照の一致で見分けるため (combinationOf)。
探索で見つかったものを、探索ウィンドウが抱える(foundObjects)。抱えている間、その札はどの枠にも 並ばない。
何が発見物かを決めるのはここ。 呼び出し側は探索で起きた世界の変化を渡すだけで、探索の前後で 並びを見比べる手順を覚えておかなくてよい。
画面に出ている札の並びと、その上の操作の意味。
表示も操作もここが答える並びだけを見る。 見えている札と、タップ・ドラッグが動かすインスタンスを 別々に数えると、画面に出ていない札を掴んだことにできてしまう(子ウィンドウへ貸した1枚を、手元に 残っている札のつもりで打ち割る)。
枠の外に出ている札もここが持つ——子ウィンドウが映している1枚(borrow)と、探索で見つかって 子ウィンドウの発見物の枠に居るもの(takeFound)。どちらも借りているのは子ウィンドウなので、 窓が消えるときは1回で全部返る(returnBorrowed)。どこに出ているかの記録と並びの引き算を 別の持ち主に分けると、片方だけ更新して食い違わせることができてしまう。
Phaserを知らない——レーンでも矩形でもなく「場所(CardSpot)とその中の位置」で答えるので、 描画の無いところで確かめられる。矩形(どこへ飛ぶか)と実行の時機は呼び出し側の仕事。