FF I に加えることが出来るルーチン修正のまとめ (情報提供: 屋根バヌ 氏)  ※※ 「※」による記載は基本的にHiBlankによる追記部 【ご利用の前に】 「申し訳ありませんが、このデータテキストに関する質問は受け付けておりません」 (屋根バヌ 氏 談) ◆機能追加と導入の前に◆ 魔法ルーチンは多くのムダがあります。 例えばルーチンナンバー0B($BA00)は16バイトもの未使用領域です。ヘイスト・デスペルなどの無駄な記述を圧縮することもできます。他にもまだまだあります。  しかし、魔法ルーチンを圧縮する時には個人の趣味が入ってくるんですよね…。それに何を導入するかということも。  たとえばフィアーなんて単純に半減する形で良いんじゃないか、それならここは圧縮できる…というふうに。  たとえば魔法ダメージに知性を反映したいので、ダメージ魔法の命中判定は削ってしまおう…というふうに。 そういった要・不要の判断は情報提供側が判断できないことです。バグを潰すとか本来の機能に戻す以外の、新たな機能の導入も同じです。 わたしとしては圧縮できそうなポイントや、導入できそうな機能は別途提出させていただき、それ以上の判断はお任せしてしまおうと考えています。 (※容量には限りがあるため、新しい機能を導入したい場合には他を潰すなどして空き容量を確保する必要があります。  ここではそうしたデータ削減とデータ削減後に追加可能な機能の案をまとめています。) ◆圧縮その1 ◆ダメージ以外のマイナス変化を与える魔法について、共通となる成功判定をサブルーチン化◆  (変化系 間接魔法の“判定パート”を共有化) □圧縮について  ある場所を圧縮したら、他の場所に影響が出ることがあります。その場合考えうる状況を書き出しています。  *他の圧縮が前提となる場合があります。その場合は冒頭に併記してあります。  *何を導入するかは任意であります。お好みでどうぞ! □魔法のルーチンについて  魔法の種類というのは、完全にルーチンに依存しているものですから、同じルーチンを使う魔法は同じ処理をする魔法です。  例えば、ストライとセーバーのルーチンナンバーはともに0Dになっています。  (※オリジナルの設定ではストライとセーバーは全く同じ動作をする魔法ということ) ===== □02ルーチン(ディア系)の圧縮 33915~33938: AD 86 68 29 08 F0 03 4C 99 B8 60 EA×25  オリジナルではアンデッドにしか効かないダメージ魔法です。上記ルーチンでは、種族チェックだけにして圧縮しています。アンデッド以外は「効果がなかった」と表示されます。  オリジナルではダメージ魔法のルーチンを途中から共用していました。この圧縮により途中からの共用部分が消され、ダメージ魔法を自由に改変することができるようになります。  上記ルーチンの一部を書き換えることで、ディア系の性能を変えることができます。  対応種族を変えるには 29 08 の 08 を望む種族に変更します。  種族が違っていても成功メッセージだけ表示したいなら、末尾の60を 4C 85 B8 にしてください。   4C 99 B8 の部分に違う魔法ルーチンのヘッダを入れ、望む効果にすることができます。魔法の設定も同時に見直さなければいけませんが、ディア系の効果を「種族限定で状態異常」にしたり「種族限定でスロウ」にしたりできます。その場合は命中判定を行いますので、失敗することもありますけれども。 □ダメージ以外のマイナス変化を与える魔法について、共通となる成功判定をサブルーチン化する +共通サブルーチン $B929 について +03ルーチン(状態変化魔法)の改変   $B929(33939~3393E)は6バイトほどの短いサブルーチンですが、4箇所で使われています。成功判定に関わるルーチンです。使用箇所はオリジナルアドレスで3393F、3396E、33989、33A56です(コードにして20 29 B9)。これらは全て、相手にダメージ以外のマイナス変化を与える魔法です。  状態異常魔法に限らず、フィアー・スロウ・シェイプなど相手のステータスに影響を与える魔法は、全て同じような構造の成功判定を行います。これらの共通部分を1つにまとめてしまえば圧縮できます。  さしあたり、$B929を共有サブルーチンの開始点として使用します。  この圧縮にともない、すぐ後に続く03ルーチン(状態変化魔法)の改変とヘッダ変更を行います。また、他3箇所のジャンプ先変更も合わせて行ってください。 33939~3394D(共有): 20 51 B8 20 2D B8 AD 5A 68 C9 C8 F0 05 20 7E B8 B0 02 68 68 60   *それぞれの魔法ルーチン本体では、上記へのジャンプと成功時の結果だけを記述すれば良いようになっています。 3381D~1E(03ルーチン=状態異常魔法のヘッダ): 3E B9に変更   *ちなみに33817~3383Cが魔法ルーチンヘッダです。 3394E~3396D(03ルーチン=状態異常魔法): 20 29 B9 AD 6D 68 2D 74 68 4D 74 68 D0 01 60 AD 74 68 0D 6D 68 8D 6D 68 4C 85 B8 EA×5 3396E~33988(04ルーチン=スロウ): 20 29 B9 20 85 B8 CE 7D 68 10 03 EE 7D 68 60 EA×12   *判定部分を書き換えた以外はオリジナルのままです。 33989~339A8(05ルーチン=フィアー): 20 29 B9 AD 7E 68 38 ED 74 68 B0 02 A9 00 8D 7E 68 4C 85 B8 EA×12   *判定部分を書き換えた以外はオリジナルのままです。 (※判定動作を共有サブルーチンに移行するだけで、魔法自体の効果内容はオリジナルと同じ) 33A56~33A77(0Eルーチン=シェイプ系): 20 29 B9 AD 85 68 38 ED 74 68 B0 02 A9 00 8D 85 68 20 85 B8 60 EA×13   *判定部分を書き換えた以外はオリジナルのままです。   *オリジナルにおけるシェイプのバグは判定部分にあり、この圧縮では判定部分の記述自体がなくなります。 33B02~33B04(12=HP参照魔法の一部): 4C 41 B9   *状態変化ルーチンの一部を利用しているため変更が必要になります。 339AC~339B2(おまけ): EA×6   *07=回復魔法ルーチン内にある記述です。対象が死亡していないか確認する記述ですが、レイズ・ストナの部分で書いたとおり、このルーチンに来る前に死亡チェックは済んでいます。無意味な記述といえます。記述内でスロウルーチンの一部を利用するように書いてあるため、いちおうついでに潰しておきます。 ◆圧縮その2 ◆ダメージ以外のマイナス変化を与える魔法について、動作内容を変更◆  (変化系 間接魔法の“動作を変更”してフリースペースを稼ぐ) □圧縮について  ある場所を圧縮したら、他の場所に影響が出ることがあります。その場合考えうる状況を書き出しています。  他の圧縮が前提となる場合があります。その場合は冒頭に併記してあります。  何を導入するかは任意であります。お好みでどうぞ! □05ルーチン(フィアー)の圧縮(動作変更版) (32 → 20 → 9 バイト)  *「◆圧縮その1-□ダメージ以外のマイナス変化を与える魔法について、共通となる成功判定をサブルーチン化」を導入してください。こちらではそのうえでさらに圧縮を行います。  フィアーは敵の「逃げにくさ」を下げる魔法です。  味方に同様のデータがなく、敵が使うことは想定されていません。オリジナルで既に対象が全体化されており、単体魔法(要するに敵一体にだけ効くフィアー)を作る意味もないので、1種類しか作られないでしょう。だったら長いルーチンを書くのがもったいない。そんなときにお勧めの圧縮です。 33989~339A8(05ルーチン=フィアー): 20 29 B9 4E 7E 68 4C 85 B8 EA ×23  オリジナルでは魔法威力の値だけ逃げにくさを下げます。これを半減する形にします。魔法威力の設定は使われなくなります。ちなみにオリジナルも変更後も、味方にかけて命中しても成功メッセージが出るだけです。そのままブラフで使えます(笑) □0Bルーチンの謎 (16 → 0バイト) 33A10~33A1F: EA×16  ルーチン0Bは未使用ルーチンです。空き容量として利用できます。ちなみに何が書いてあるかというと、「攻撃力の計算用メモリに魔法威力を加算して保存しなおす。上限255」と書いてあるのです。オリジナルストライの一部とまったく同じ内容。どういうことなの…。  ※推測-「これ(0B)が本来のストライ」で「あれ(0D)が本来はセーバー専用」  ※※仮にこのまま残しておいても「残念ながらロードルーチンとリターンルーチンがgdgdなため、ひとつとしてまともに機能しません。」「計算用メモリへのロード・リターンと、ルーチン自体の構造の全てに問題があります」(屋根バヌ 氏 談)という内容のため、実質的に使い物になりません  ※※※「オリジナルの仕様を忠実に再現するにも、ロードルーチンとリターンルーチンをまともに組み込めないのが問題(そのスペースがない)」(屋根バヌ 氏 談)という仕様のため、実際の効果発動に向けては“「各種の圧縮案」をそれぞれ任意で適用した上で、さらなるルーチン変更が必要”となります □0Cルーチン(ヘイスト)の圧縮 (24 → 14バイト) 33A20-33A37: A9 02 CD 7D 68 F0 06 EE 7D 68 4C 85 B8 60 EA×10  攻撃回数の倍増・減少は、敵味方ともフラグのように管理されます。それぞれの戦闘構造体にはフラグを保存する領域があり、普段は01です。ヘイスト状態が 02、スロウ状態は00です。ヘイスト・スロウをかけるたびに1段階ずつ上下します。上記ルーチンは無駄な部分を書き換えて圧縮しています。 ケアルガから状態異状回復効果をなくす □0Fルーチン(ケアルガ)の圧縮 (11 → 6バイト)  HP完全回復処理はサブルーチン化されており、場所を移動させなければ339D6($B9C6)から始まります。これに成功フラグを書き込む処理を加えれば、状態異常回復効果のないケアルガの出来上がり! です。 33A78: 20 C6 B9 4C 85 B8 EA EA EA EA EA  ※※20 C6 B9 / 4C 85 B8 … 回復処理サブルーチンと成功判定へのジャンプアドレス ◆圧縮その3 □圧縮について  ある場所を圧縮したら、他の場所に影響が出ることがあります。その場合考えうる状況を書き出しています。  他の圧縮が前提となる場合があります。その場合は冒頭に併記してあります。  何を導入するかは任意であります。お好みでどうぞ! □デスペルルーチンなんて嫌いです(11ルーチンの圧縮)  *「□ダメージ以外のマイナス変化を与える魔法について、共通となる成功判定をサブルーチン化」を導入してください。そのうえでさらに圧縮を行います。  *ちなみに、デスペルルーチンそのものについて触れておきますと、オリジナルのままでも問題はありません。    その内容は、      相手の魔法耐性・弱点によって成功率が変わる      成功すると耐性を00で上書きする    というものです。   胡散臭い命中判定のおかげで、あまり成功しません。   また、元々相手の耐性が00であった場合を考慮しておらず、耐性を00にしたかどうかに関わらず成功メッセージが出ます。  デスペルで結果的にやることは A9 00 8D 77 68 …耐性の計算用メモリを00にする、これだけです。そのくせ胡散臭いチェックを延々やっています。デスペルなんてそんなに容量いらないんじゃない?という趣旨の圧縮です。  ここでは状態異常魔法と同じ判定にしました。耐性が元々00なら成功フラグを書き込まないようにしています。 33AA4~33AE5: AD 77 68 C9 00 F0 0B 20 29 B9 A9 00 8D 77 68 4C 85 B8 60 EA×47  ちなみに…オリジナルの判定方法では、デスペルの魔法属性が弱点を突くと命中率がアップします。デスペルの属性は00なので、弱点を突ける=相手の耐性は 00です。デスペルの属性と耐性が合致すると命中率がダウンします。同様の理由で無意味です。どういうことなの……?orz  (※オリジナルの判定方法で“デスペルの魔法属性(無属性)が弱点を突く”=“もともとデスペルの効果が全く必要ない相手”ということ) □12ルーチン(HP参照魔法)の削除もしくは改変  いわゆるHPを参照する魔法です。耐性があると絶対に失敗するようになっています。それからHPをチェック、条件を満たせば必ず成功、条件を満たさなければこれも必ず失敗します。  普通の状態異常魔法は耐性があっても成功する確率が残るので、HP条件の厳しいオリジナルではスリプル以下と言わざるを得ません。オリジナルでは存在価値がないルーチンです。まるごと削ってしまっても良いと思います。結構な容量を空けることができます。 33AE7~33B07: EA×33  それじゃあ寂しいという場合は以下のような改変でどうでしょう。  まず耐性で100%失敗する部分を削ります。さらにHPチェックで失敗しても普通の状態異常ルーチンに移行するようにします。ルーチン本体はHPチェックだけにして、後は状態異常ルーチンを利用すればムダもありません。 33AE7~33B07:  EA EA EA EA EA EA EA EA     …余白(耐性チェック) A9 xx 8D 5A 68 A9 xx 8D 5B 68  …HP条件 [xx] 代入、最初が下桁、次が上桁 A0 02 A2 12 20 EA AD      …HPによる命中判定 90 03              …失敗分岐 4C aa aa            …状態異常魔法の成功処理に合流 4C bb bb            …失敗時、状態異常ルーチン冒頭に合流   *4C -- -- は導入状況によってアドレスを変えます。まず成功処理、次が失敗処理です。 (A)オリジナル、もしくは前回の変更を適用している場合 33B02~33B07: 4C 3E B9 / 4C 2F B9 (B)ダメージ以外のマイナス変化を与える魔法について、共通となる成功判定をサブルーチン化している(共有化圧縮を適用している)場合 33B02~33B07: 4C 41 B9 / 4C 3E B9  ※※圧縮後にルーチン移動を行っている場合は、それに合わせて代入アドレスを適宜変更のこと □属性チェックルーチン改変(HP参照スキップ)  耐性チェックを削りたくない場合は、耐性があるとHP参照をスキップするようにすれば良いでしょう。状態異常ルーチン内での耐性チェックはそのまま残っていますから、耐性があれば命中しにくくなります。冒頭に残したEAを、以下のように変更します。ぴったり元の必中ルーチンと同じサイズになります。 耐性があるとHP参照をスキップ(冒頭追加) 33AE7~: AD 78 68 2D 77 68 D0 16 (以降同じ)  ※HP参照をスキップするので、HPチェックの部分は処理として適用されない  ※“状態異常ルーチン内での耐性チェックはそのまま”なので“魔法クリティカルの発動可能性は残る”ことになる  ※「属性耐性チェック」の動作変更については↓の各種変更案参照のこと □12ルーチン(HP参照魔法)の改変について その2 HP残量判定(必中)  33AE7~ AD 81 68 AA A9 [FE]       …減算前の命中値254 E0 00 F0 0C 38 E9 [46]      …上桁が1あるごとにマイナス[$46(=#70)]します B0 04 A9 00 F0 03 CA D0 F4 8D 70 68 A9 [94] 8D 72 68  …魔法回避率を148にする 4C yy-zz      …状態異常ルーチン(ルーチン03)の冒頭にジャンプ  現在HPの上桁によって成功確率が下がっていくようにしています。  現在HPの上桁が00のとき、命中基本値は[FE]です。変更してもかまいません。命中判定は状態異常のものを流用します。  現在HPをメインの判定要素とするために、魔法回避率の影響を除外しています。具体的には、相手の魔法回避率を[$94]=148に固定し、命中側の基礎ボーナス+148を相殺しています。基礎ボーナスは、命中判定のとき、耐性や弱点の影響を受ける前に一律で加算される値です。  耐性除外(「属性耐性チェック」)は含めていません。お好みで追加してください。  計算後の値を200で割るとおおよその成功率を出せます。HP参照後の命中値が200($C8)までは、ほぼ必中です。100($64)の辺りでおおよそ5割の成功率となります。  以下はマイナス70時の目安です。765より高いHPへの成功率を意識してマイナス70としていますが、Revisedよりやや弱体化しているとも言えます。望む成功率になるように調整していただければと思います。 上桁 現在HP   計算後   おおよその成功率 0     ~ 255  FE(#254)  ほぼ必中 1  256~ 510  B8(#184)   92% 2  511~ 765  72(#114)   57% 3  766~1020   2C(#44)   22%  改変後の動きは、 (1)命中値をいったんFE(=254)にする (2)HPの上桁が高いほど、FEから命中値を減らしていく (3)相手の魔法回避を固定し、命中側のボーナスを相殺 (4)計算後の命中値をもって状態異常魔法に移動 (5)以降は状態異常魔法のルーチンに従う  …という流れです。  つまりHP参照魔法のルーチンでは、HPを見て命中値を決定すること以外はしていません。 改変後は、オリジナルとはまったく動きが異なります。再判定もありません。  (2)における「HPの上桁が高いほど命中値を減らしていく」処理そのものが、必中になるか、そこそこ成功するか、まるで成功しないか、を判定する処理となっています。(2)はループ処理になっており、HPの上桁が00になるまで命中値から減算を繰り返すのです。  「HPが条件以上なら状態異常ルーチンの成功部分に合流する」処理は削除しています。ルーチン内で「必中(ファンブル以外)」を実現できるため、組み込みませんでした。計算後の命中値が200以上なら「必中(ファンブル以外)」です。  オリジナルでは完全2択でしたが、改変後は、現在HPによってのみ成功確率が変わる魔法ルーチンになります(耐性・弱点は除く)。命中判定は1度だけです。魔法設定の命中追加値は使われません。…ほんとは使いたかったんですが、ルーチンの構成上うまくいきませんでした。全体にかけるときに不具合が出てしまうので…。  繰り返しになりますが、耐性があると絶対に失敗するようにしたいなら、冒頭に耐性除外を組み込んでください。状態異常の命中判定に従い、魔法クリティカルは残ったままになっています。 □属性チェックサブルーチン(限定チェック) ○「死属性があると効かない」ルーチン 通常の耐性チェックとは別にして、最初に死属性かどうかチェックし、死属性だったら絶対に効きません。 魔法クリティカルとか関係なく、死属性の敵には絶対にかからなくなります。  サブルーチンとして書くなら、 $yy-zz: AD 77 68 29 08 C9 08 D0 02 68 68 60  として、該当ルーチン(効果を適用させたい魔法ルーチン)の冒頭に20 zz yy を仕込みます。  (※サブルーチン化しておくと複数のルーチンでも 20 zz yy の冒頭追加で使用できるようになる)  冒頭に書くだけなら、      AD 77 68 29 08 C9 08 D0 01 60  で良いでしょう。(効果を適用させたいルーチンの冒頭に直接つなぐ)  (※一種類のルーチンでしかこの効果を使わないならこちらの方が容量の節約になる)  *この内容では死の属性チェック限定です。  ちょっと詳しく書くと、29 [08] C9 [08] の「08」が対象属性です。  29 [08] C9 [08]の両方を対象属性として利用していまして、両方とも同じ属性を入れて対象とします。  仮にここを両方10とかにすると火属性が絶対に効かなくなるという具合です。  さらに発展させ、サブルーチン化した死属性チェックルーチンを、状態異常・HP参照・シェイプ・スロウ・フィアーあたりの全てに仕込んでみると、魔法クリティカルとか関係なく死属性の敵には絶対にかからなくなります。スロウとシェイプは外した方が良いかな。アンデッドが面倒くさそうですが、まあ許容範囲でしょう。いざとなったらディア系でなんとかすれば、白魔道師の地位も上がって、……上がらないですか?(笑) ※利用方法(敵設定側などを合わせた作りこみ次第)によっては「対ボスクラスキャラ専用フラグ」の代用などにもできる □属性チェックサブルーチン(耐性除外) ○「魔法属性と耐性がひっかかったら絶対に効かない」ルーチン  「魔法設定の側の属性」と「敵設定の側の属性耐性」が合致していたら効かなくなります。  魔法クリティカル関係なく、使用する魔法設定の側の属性に対して耐性を持っている敵には絶対にかからなくなります。  サブルーチンver $yy-zz: AD 78 68 2D 77 68 F0 02 68 68 60  *該当ルーチン(効果を適用させたい魔法ルーチン)の冒頭に20 zz yy を仕込みます。  あるいは冒頭追加verですと      AD 78 68 2D 77 68 F0 01 60 ※※属性チェック(サブルーチン)について 「通常の状態変化ルーチン」の冒頭につけて、ヘッダ側の読み込み位置を変えると二種類のルーチンにしたりすることもできる 例えば 「通常の状態変化ルーチン」(ヘッダは普通の状態変化魔法の読み込み開始位置のまま) 「魔法属性と耐性チェック」→「通常の状態変化ルーチン」(読み込み開始位置をちょっと前にして耐性チェック付加) こんな形で“同じ位置のルーチンを二種類に利用”ということもできる ◆圧縮その4  ◆確保したフリースペースを統合する-1◆  スペースの統合に関わることを2つにわけてまとめさせていただきました。 ===== □前後のルーチンを利用している部分を潰す  計算命令のあとなどに値をチェックして、条件分岐を仕掛けることはよくあります。このとき、条件を満たすと、指定したバイト数だけコードをスキップします。  いくつかの魔法ルーチンでは、分岐によって別のルーチンを再利用しています。容量の圧縮になるからです。しかし、整理するときにこれらが残っていると、誤動作が生じます。  下記の例を見てください。[◆圧縮その1]で命中判定を共有したとき潰してしまったので、導入していれば問題ない部分です。 === (予備知識)  ※以下、オリジナル版のルーチンのままの場合での表記解説 ○オリジナル・スロウ04の一部+フィアー05(33988+33989~339A9) 60 20 29 B9 AD 5A 68 C9 C8 F0 [F5] 20 7E B8 90 5B AD 7E 68 38 ED 74 68 B0 02 A9 00 8D 7E 68 4C 85 B8  [--]内が分岐条件を満たしたときに分岐する先を示しています。分岐先は、戻る場合は「FF-戻るバイト数」、進む場合は「スキップするバイト数」を記述します。  オリジナルのフィアーでは、条件によっては、分岐[F5]によって0Aバイト戻り、直前のオリジナル・スロウルーチンの60(rts)を使って処理を終了します。  つまり、オリジナルのフィアーのままで、スロウを全てEAで潰すと…特定の条件下でフリーズしてしまうのです。  こういう例は他にもあります。そこで、全ての魔法ルーチンが分岐によって別のルーチンを利用しないように修正しておきたいと思います。 === ○現在の圧縮内容を確認しておきます。(「◆圧縮その1」「◆圧縮その2」の適用状況を確認のこと) ・ディア02を圧縮 ・状態異常判定をサブルーチン化+状態異常魔法03を圧縮 ・スロウ04(命中判定を共有化のみ) ・フィアー05(命中判定を共有化のみ) ・回復魔法07の無駄な部分を削除 ・0Bルーチン部を削除 ・ヘイスト0Cを圧縮 ・シェイプ0E(命中判定を共有化のみ) ・デスペル11を圧縮   これらは意識して潰してあるので問題ありません。   以上を除外した残りの魔法ルーチン(01,07,08,09,0A,10,12)内で、分岐スキップによって他の魔法ルーチンを利用している部分を(以下の変更により)潰していきます。 ===== □分岐スキップによるルーチン共有の解除 ○ダメージ魔法01 …「条件分岐スキップ」利用なし ○回復魔法07(339A9~339D5):   *削除した無駄な部分を末尾にもっていき、1バイトほど60(rts)に書き換えます。そのあと[分岐先]を調整します。他は変えていません。 20 85 B8 AD 74 68 AA A9 00 20 5D AE 18 6D 74 68 90 02 A9 FF AA A9 12 20 DD AE A2 15 A0 12 20 EA AD 90[03]4C C6 B9 60 EA EA EA EA EA EA ○状態異常回復魔法08 …「条件分岐スキップ」利用なし ○防御力アップ09 …「条件分岐スキップ」利用なし ○属性防御付加0A …「条件分岐スキップ」利用なし ○回避力アップ10 …「条件分岐スキップ」利用なし ○HP参照ルーチン12(33AE6~33B07) …  直前のデスペルルーチンは、実は 33AE6 までだったのですが、ここに60が残っているのはHP参照ルーチン内で利用しているからです。この際、HP参照ルーチンそのものを 33AE6~33B07 として1バイト拡張し、60を末尾に付けておきます。  (導入したい機能によっては)また改変する可能性も高いですが、いちおう念のため。 60+AD 78 68 2D 77 68 D0[F7]A9 2C 8D 5A 68 A9 01 8D 5B 68 A0 02 A2 12 20 EA AD 90[E4]20 4A B9 4C 85 B8 → AD 78 68 2D 77 68 D0[19]A9 2C 8D 5A 68 A9 01 8D 5B 68 A0 02 A2 12 20 EA AD 90[06]20 4A B9 4C 85 B8 60   *HP参照ルーチンのヘッダ(3383B-C:D7 BA)を1バイト前(D6 BA)にしてください。  変えている部分はほとんどないので、準コピペ(カット&ペースト移動&スキップ数の調整)で大丈夫です。   ※※最後のジャンプ部分の記載について 20 4A B9 / 4C 85 B8 / 60 処理終了追加  という形になっているが 「◆圧縮その1」での「状態変化ルーチンの一部を利用」での共有化を導入している場合には 4C 41 B9 / 4C 85 B8 / 60  この形になる。 ◆圧縮その5  ◆確保したフリースペースを統合する-2◆  ※魔法ルーチン圧縮後のフリースペースを統合するための知識 □共用しているサブルーチンについて  固有の魔法ルーチンとして使っているのは、338A9~33B07の607バイトです。それ以外の部分は、特に理由がなければ書き換えないほうが無難です。  607バイトの範囲内に共用する部分がいくつかあります。下記の条件のもとで書き出してみました。 === (条件) ・ディア02を圧縮 ・状態異常判定をサブルーチン化+状態異常魔法03を圧縮 ・スロウ04(「命中判定を共有化」のみ導入) ・フィアー05(「命中判定を共有化」のみ導入) ・回復魔法07から無駄な部分を削除(「無駄な部分を削除」の導入) ・0Bルーチン部を削除(もともと機能しないルーチン) ・ヘイスト0Cを圧縮(「無駄な部分を書き換え」の導入) ・シェイプ0E(「命中判定を共有化」のみ導入) ・デスペル11を圧縮(「無駄な判定条件を削除」の導入)  (※以下、これらを導入している場合についての解説) ===== (共有サブルーチン) ○20 F9 B8 範囲:33909~33914 内容:AD 74 68 8D 58 68 A9 00 8D 59 68 60 機能:魔法威力を計算用メモリにコピー 備考:ディア系を圧縮したため、ダメージ魔法ルーチンのみで使われています。よってまとめてしまってもかまいません。HP回復ルーチンの2バイト対応をにらむなら、共用した方がのちのち楽になります。 ○20 29 B9 範囲:33939~3393E(オリジナル) 内容:20 51 B8 4C 2D B8(オリジナル)    20 51 B8 20 2D B8 AD 5A 68 C9 C8 F0 05 20 7E B8 B0 02 68 68 60(圧縮) 機能:状態異常系魔法の命中判定 備考:状態異常系魔法の圧縮の中で、同じ機能として同じジャンプ先を使っています。同時に機能を拡大し、(状態異常系魔法の)命中判定を一括で行うサブルーチンになっています。  状態異常03、スロウ04、フィアー05、シェイプ0E+デスペル11の中で使っています。場所を移動させると全てのジャンプ先を変えなくてはいけません。デスペル11を追加したことで、圧縮後に1つ増えていることをご注意ください。 ○20 C6 B9(ケアルガ)・4C C6 B9(回復魔法) 範囲:339D6~339DC 内容:A2 15 A0 12 4C 4D AF 機能:現在HPを最大HPの値にする 備考:回復魔法07で 4C C6 B9、ケアルガ0Fで20 C6 B9 が使われています。 ○20 83 BA 範囲:33A93~33A9A 内容:A9 00 A2 C8 20 5D AE 60 機能:0~200の乱数を取り出す ジャンプ元のある場所:338A9~338AB 備考:メインで書き換える607バイトではない場所にジャンプ元があります。圧縮前のデスペルでも使われていましたが、圧縮時に削除しています。 ○4C 8B BA 範囲:33A9B~33AA3 内容:8D 5A 68 A9 00 8D 5B 68 60 機能:ルーチンジャンプ前に取り出した値を685Aに、00を685Bに保存する ジャンプ元のある場所:3385E~33860 備考:メインで書き換える607バイトではない場所にジャンプ元があります。圧縮前のデスペルでも20 8D BAが使われていましたが、圧縮時に削除しています。 ○状態異常ルーチンの成功部分  HP参照魔法で、成功時に使うジャンプ先です。詳しくは「HP参照魔法」をご覧ください。  ※※フリースペースの統合のために各魔法ルーチンを移動する場合は、上記それぞれのジャンプ先アドレスの調整を怠らないように注意 ◆◆ダメージ魔法のダメージ幅安定 先行予備知識◆◆ 「魔法クリティカル」(のイメージ) 全体変化魔法とかでかかると耐性無視して効果発動してしまうとか、攻撃魔法だと猛烈に大ダメージになる 「ダメージの振れ幅」(のイメージ) 最大ダメージを100%とした場合 30%~100%(魔法クリティカルで100%越え)くらいの幅でダメージ差が出てしまう "魔法クリティカルの仕様"について  わたしが原因ではないかと思っている部分ですが…。  FF1では乱数を取るとき閾値に必ず+1しますが、コレじゃないかなと。  耐性があるとき命中値は00で判定します。が、+1して判定するため、おおよそ256分の1の確率で成功してしまいます。  全体変化魔法だと、回数をこなすことで乱数が少しずつ移動するため、ひっかかりやすいと思います。  単体変化魔法でひっかかる確率は前述の通り1/255ですが、全体変化魔法だと9体いれば9/255でおおよそ1/28に跳ね上がります。それも底引き漁のような感じでごっそりと。  つまり魔法クリティカルの効果ですが、実は「命中している」だけです。魔法クリティカルによってダメージが上がったり、効果が上昇したり、耐性を無視しているわけではないんです。  ではなんであんなダメージにバラツキがあるかというと… "ダメージ魔法の仕様"      常に1回ヒット。      耐性により、魔法威力が半減。      弱点を突くと、魔法威力が1.5倍。      耐性・弱点を計算した後の魔法威力を最大乱数範囲として、魔法威力に乱数を加算。   (!)いちばん最後に命中判定があり、成功すると最終的なダメージが2倍になる。     *以上により、通常時の最大ダメージは1倍~4倍、弱点を突くと1.5倍~6倍となります。  大問題なのは(!)の部分です。オリジナルのダメージ魔法は命中判定の比重がとても大きいんですよ。事実上、乱数が本体の3倍の幅を持っているわけです。 ではどうするか  90~100%を目指すなら、(1)乱数を制限し、(2)命中判定をなくし、(3)その代わりに魔法威力を補強する、といった感じになるでしょう。  乱数の仕様変更は16バイトで、サブルーチンの形を取ります。本体の命中判定をなくすので空き領域も多少確保できます。あとは機能の導入とバランスの問題です。 ◆乱数の制御◆   FF1に足りない機能といえば、乱数ですね。FF1の乱数は、桁上がりを考慮していません。256を超える値に対して、正常に乱数が働かないのです。ブリザガに180くらい威力を突っ込んだら氷に弱いはずなのに与えるダメージが下がった、なんてのはこれが原因です。 □乱数の桁上がりを考慮する (追加部最低14バイト) 3384D-33851: A9 00 AE 58 68 →20 aa-aa A9 00 $aa-aa: AE 58 68 F0 01 CA AD 59 68 F0 02 A2 FE 60  オリジナルでは魔法威力が255を上回ると、乱数が00開始でループしていました。このルーチンでは、魔法威力が255を上回ると乱数幅を0~255に固定します(最大乱数は直後に+1されるので、FE→FFとして扱います)。  これは基本形で、桁上がりにだけ対応した形です。最低限の機能がこのルーチンなのだとお考えください。  乱数に制限を加えるなら、さらに手を入れていきますが、容量が足らないようなら上記の最低限の機能だけ組み込み、他の部分でダメージ魔法の制御をすると良いのではないでしょうか。 □乱数幅を制限する (追加部 最長24~20~最短18バイト)  桁上がりを考慮しつつ乱数制限を組み込んだのが以下のルーチンになります。上記$aa-aaの部分を変更します。お好みのパターンをお使いください。 (1)最低限の乱数幅を確保する AE 58 68 E0 [xx] B0 02 A2 [xx] CA AD 59 68 F0 02 A2 FE 60 (2)乱数の最大幅を制限する AE 58 68 F0 07 E0 [yy] 90 02 A2 [yy] CA AD 59 68 F0 02 A2 [yy] 60 (3)乱数の最低幅を確保し、最大幅を制限する AE 58 68 E0 [xx] B0 02 A2 [xx] E0 [yy] 90 02 A2 [yy] CA AD 59 68 F0 02 A2 [yy] 60  …いずれも[xx]が乱数幅の最低値です。最低でも0~10の乱数を確保したいなら、使用したルーチン内全ての[xx]に[0A]と入れます。  [yy]が乱数幅の最大値です。例えば最大でも0~200の乱数に留めたければ、使用したルーチン内全ての[yy]に[C8]と入れます。 ※“乱数幅を制限する”について・・・制限すれば制限するほどダメージ幅は安定する  なお、これらをいっさい適用せず、ダメージ魔法のルーチン内で乱数制御を行う方法もあります。 ◆ダメージ魔法の命中判定削除◆ □ダメージ魔法の命中判定をなくす (オリジナルで143バイト→最低112バイト+フリースペース31バイト)  ランダム性を薄くするために、まず命中判定に関係する部分を取り除きます。あとでどこを調整・差し替えればよいかわかるように、各部分の役割も付記しておきました。 338A9~33938: ○成功フラグ 20 85 B8 ○魔法威力を計算用メモリにコピー*下記注  (※「○魔法威力を計算用メモリにコピー」の開始位置:この位置から「○ダメージを適用・処理終了」までの間に各種強化ルーチンを挟み込むことができる) 20 F9 B8 ○耐性チェック AD 78 68 2D 77 68 F0 06  …チェック 4E 59 68 6E 58 68     …魔法威力半減 ○弱点チェック(1.5倍) AD 78 68 2D 76 68 F0 16   …チェック A2 01 A0 02 20 4D AF     …1.5倍の準備a 4E 59 68 6E 58 68      …1.5倍の準備b A9 01 A2 02 A0 01 20 7B AE  …魔法威力を1.5倍する ○乱数の取得と加算 20 2D B8 ○ダメージを適用・処理終了 A9 12 A2 12 A0 01 20 AC AE 4C CD B0 ○余り EA ×31 ○直後に33909($B8F9): 魔法威力を計算用メモリにコピー* AD 74 68 8D 58 68 A9 00 8D 59 68 60   *(注)ディア系と共有していましたが、ディア系を圧縮すれば、ダメージ魔法でしか使われなくなります。  なお弱点補正は2倍にするとさらに圧縮ができます。 ○弱点チェック(2倍) AD 78 68 2D 76 68 F0 06   …チェック 0E 58 68 2E 59 68      …魔法威力2倍 ※「○弱点チェック(1.5倍)」の部分と まるまるすげ変えればよい  (1.5倍用だと30バイト→2倍なら15バイトで済む)  注意点がひとつあります。この圧縮だけでは、魔法ダメージの期待値が2分の1になります。魔法設定を強化すれば使えないことはありませんが、できれば魔法威力補正などと合わせてご利用ください。  ※魔法威力補正については↓↓の該当部参照 ◆ダメージ魔法に知性の影響を追加する◆ □ダメージ魔法に知性の影響を追加する下準備 (12バイト)  オリジナルで無意味なことに定評のある知性ですが、これをダメージなどに反映させるには、ダメージ決定ルーチンで使用者の知性をロードできなければいけません。魔法ルーチン実行時の使用者アドレスは戦闘構造体を指定しており、知性は戦闘構造体にロードされないため、そのままではアクセスできません。そこで、魔法データをロードするときに必要なデータを空きメモリに保存しておきます。  割り込みは「魔法パレットを更新しないバグ」を修正するときに使ったところと同じ部分を使います。jsrしてすぐまたjsrする形です。  空きメモリは00A0-A1を利用します。魔法ルーチン内では使用しない領域です。保存したのは使用者の素体データへのアドレスです。 333C1($B3B1): 20 39 A3(修正後)⇒20 -- -- (※アドレスは適宜代入のこと) $-- --: 20 39 A3 A5 92 85 A0 A5 93 85 A1 60 ◆魔法威力の底上げについて◆ □魔法威力強化  命中判定を削除するだけでは魔法威力が不足してしまうはずです(特に味方側ですね)。しかし、どのように強化するかは意外と難しい問題です。いくつか追加できそうな機能を書き出してみました。  強化するタイミングは、[□ダメージ魔法の命中判定をなくす]に記載の「○魔法威力を計算用メモリにコピー」した後、「○ダメージを適用・処理終了」する前までです。差し替えるというより追加する、つまり[□ダメージ魔法の命中判定をなくす]での記載の○と○の間に「○魔法威力補正」を挟むようなイメージです。割り込むタイミングによって、乱数の度合いが変わったり、耐性・弱点への影響が変わったりします。  使いやすいのは微調整が効くタイプです。複数を組み合わせても良いでしょう。乱数取得を望むタイミングで加えることで、さらに調整ができます。  以下は全てサブルーチンの形で記述しています。他で流用しないなら、[20 zz-yy]を直接[yyzz]の内容に置き換えてください。回復魔法で流用するつもりならサブルーチンの形が良いと思います。弱点チェックでも流用するとわずかに圧縮できるかもしれません。 === ○シフト増加 (15バイト)  「乱数制御」を適用し、さらに強化を行います。 ジャンプ元: A2 [xx] 20 aa-aa $aa-aa: 0E 58 68 2E 59 68 CA D0 F7 60  [xx]回だけ魔法威力を倍々に強化します。xx=01で2倍、02で4倍、03で8倍、04で16倍…といった具合です。xx=00は設定しないでください。計算結果が65535あたりまで増えるとダメージが0になります。  容量が少なくすむ反面、微調整できないのが欠点です。  ※回復魔法の強化で使う場合にも、「ジャンプ元の設定分」の容量が必要(追加バイト数に注意のこと) === ○単純増加 (28バイト)  「乱数制御」を適用し、さらに強化を行います。 ジャンプ元: A2 01 A0 02 20 4D AF A9 [xx] 20 bb-bb ([○擬似・魔法攻撃回数]での利用の場合はこの+12バイトのみで導入可) $bb-bb: 85 A2 A9 01 A2 02 A0 01 20 7B AE C6 A2 D0 F3 60  魔法威力を[xx+1]倍します。xx=01で2倍、02で3倍、03で4倍…といった具合です。xx=00は設定しないでください。  等倍で増えていくので、シフト増加よりやや細かく調整できます。使う機会があるとすれば3倍でしょうか。  ※回復魔法の強化で使う場合にも、「ジャンプ元の設定分」の容量が必要(追加バイト数に注意のこと) === ○知性加算 (30~26バイト)  「ダメージ魔法に知性の影響を追加する下準備」  「乱数制御」   を適用し、さらに強化を行います。 ジャンプ元: 20 cc-cc  cc-cc: A5 A1 C9 61 D0 [??(0F~)]    *??は、調整部のバイト数を0Fに足してください A0 12 B1 A0 EA EA EA EA EA    *調整部。必要なだけ確保してください。ただし調整部での計算結果が255を超えると0になりますので、それほど大きくはできません。2倍が限界でしょう。    *0A×n で使用者の知性を2倍、4倍…     4A×n で使用者の知性を2分の1、4分の1、8分の1… 6D 58 68 90 03 EE 59 68 8D 58 68 60  知性を魔法威力に加算します。味方の場合のみ加算し、敵では加算しません。反映度は調整部の 0A か 4A の数で調整します。  これに限らず、知性を活用したルーチンでは、味方と敵で魔法威力に差を付けられるメリットがあります。 (拡張)下記はアイテムを知性加算の対象外にする場合です。 (43~39バイト)    *??は、調整部のバイト数をカッコ内の値に足してください cc-cc: 20 cc-cc  *A5 A1 C9 61 D0 [??(1C~)] *AD A9 6A 0A 0A AA BD 8F 68 C9 10 F0 [??(0F~)]  A0 12 B1 A0  EA EA EA EA EA  …調整部  6D 58 68 90 03 EE 59 68 8D 58 68 60 === ○擬似・魔法攻撃回数 (60~56バイト)  「ダメージ魔法に知性の影響を追加する下準備」  「乱数制御」   を適用し、さらに追加を行います。 ジャンプ元: 20 dd-dd dd-dd: A2 [xx] 4E 59 68 6E 58 68 CA D0 F7   *[xx]回、2分の1しています。xx=01で2分の1、02で4分の1、03で8分の1…    00は設定しないでください A2 01 A0 02 20 4D AF A5 A1 C9 61 F0 04 A9 [yy] D0 [??(04~)]    *[yy]が敵側の魔法攻撃回数です。00は設定しないでください    *??は、調整部のバイト数をカッコ内の値に足してください A0 12 B1 A0 EA EA EA EA EA    *調整部。必要なだけ確保してください。32分の1なら4A×5になります    *0A×n で知性を2倍、4倍、8倍…     4A×n で知性を2分の1、4分の1、8分の1… D0 02 A9 01 85 A2 A9 01 A2 02 A0 01 20 7B AE C6 A2 D0 F3 60    *最後の1行は○単純増加のサブルーチンと同じ構造です。○単純増加と合わせて使うときは途中から流用できます。  知性を魔法攻撃回数として利用します。100%命中する擬似的な攻撃回数です。知性を回数にする調整は、調整部の 0A か 4A の数で調整します。最低回数は1回です。  実際のダメージですが、まず元の魔法威力をn分の1して1回ヒットあたりのダメージとします。それから1ヒットダメージ×魔法攻撃回数で魔法威力を算出し直します。  敵側の魔法攻撃回数は固定で設定します。  ヒット回数などは表示しません。  ダメージ上限は設定していません。1回ごとに命中判定を仕込んだり、乱数をその都度加算したりといった拡張が考えられますが、長くなるので、さしあたりこの形で提示させていただきました。 (拡張)下記はアイテムを魔法攻撃回数の対象外にする場合です。 (75~71バイト) アイテムを使うと魔法威力が1回ヒットに固定されます。    *??は、調整部のバイト数をカッコ内の値に足してください dd-dd: 20 dd-dd  A2 [xx] 4E 59 68 6E 58 68 CA D0 F7  A2 01 A0 02 20 4D AF *A5 A1 C9 61 D0 0F AD A9 6A 0A 0A AA BD 8F 68 C9 10 F0 [??(1D~)] D0 04  A9 [yy] D0 [??(04~)]  A0 12 B1 A0  EA EA EA EA EA  …調整部  D0 02 A9 01  85 A2 A9 01 A2 02 A0 01 20 7B AE C6 A2 D0 F3 60 ※アイテム使用時の効果が激減するので、導入する場合はその点も検討のこと □知性加算を拡張する (拡張2)知性加算は敵味方の分岐を含んでいますから、○単純増加 と合わせると「敵と味方の単純増加の調整数を別にする」ことができます。敵側の分岐を単純増加用に書き換えれば大丈夫です。 ※○単純増加 はこちらの設定とは別に設定しておく必要がある ジャンプ元: 20 cc-cc  cc-cc: A5 A1 C9 61 D0 ??(10~)    *ジャンプ先が1バイト後ろにずれています。10+調整用スペースでお願いします。  A0 12 B1 A0  EA EA EA EA EA  …調整用スペース  6D 58 68 90 03 EE 59 68 8D 58 68 60 [☆new!] …直後に付け足してください。敵側の強化ルーチンです。  A2 01 A0 02 20 4D AF A9 [xx] 4C bb-bb (※bb-bbは「○単純増加」ルーチンへのジャンプ先アドレスを代入)  *単純増加の際には、その時点での魔法威力を記憶していますから、仮にこの導入内容で「味方の単純増加=+1回(2倍)」、「敵側増加=+2回(3倍)」とやると、2倍をもとにして3倍=敵は6倍になります。 === (拡張3)アイテムを知性加算の対象外にし、○単純増加 と合わせて「敵と味方の単純増加の調整数を別にする」。    *??は、調整部のバイト数をカッコ内の値に足してください cc-cc: 20 cc-cc  *A5 A1 C9 61 D0 [??(1D~)] *AD A9 6A 0A 0A AA BD 8F 68 C9 10 F0 [??(10~)]    *ジャンプ先がそれぞれ1バイト後ろにずれています。  A0 12 B1 A0  EA EA EA EA EA  …調整部  6D 58 68 90 03 EE 59 68 8D 58 68 60 [☆new!] …直後に付け足してください。敵側の強化ルーチンです。  A2 01 A0 02 20 4D AF A9 [xx] 4C bb-bb (※bb-bbは「○単純増加」ルーチンへジャンプ先のアドレスを代入)  *単純増加の際には、その時点での魔法威力を記憶していますから、仮にこの導入内容で「味方の単純増加=+1回(2倍)」、「敵側増加=+2回(3倍)」とやると、2倍をもとにして3倍=敵は6倍になります。 ======== (拡張4)単純増加と知性加算をまとめ(味方側を「単純増加→知性加算」、敵側を「単純増加」) *従来の単純加算への設定とジャンプを消して、適用させます。 ジャンプ元: 20 cc-cc  cc-cc: A5 A1 C9 61 D0 ??(1C~)    *ジャンプ先がさらにずれています。1C+調整用スペースでお願いします。 ☆[new!]A2 01 A0 02 20 4D AF        A9 [xx] 20 bb-bb →同じく単純加算へのジャンプ  A0 12 B1 A0  EA EA EA EA EA  …調整用スペース  6D 58 68 90 03 EE 59 68 8D 58 68 60 [new] …敵側の強化ルーチンです。  A2 01 A0 02 20 4D AF A9 [yy] 4C bb-bb  とします。従来の単純加算設定+ジャンプ部分を丸ごと移動させるだけですので、特に容量は増えません。  念のため書いておきますと、上記の場合では1番目[xx]が味方用、2番目[yy]が敵用の単純加算となります。  *基本版に準拠し、アイテム除外を含めていません。  ※ダメージ魔法・回復魔法の両方で「○単純増加」のルーチンを使っている場合は、   こちらのタイプを利用すると読み込み側の容量を節約できる ======== (拡張5)単純増加と知性加算をまとめ、さらにアイテムを対象外にする場合です。  ※ルーチンの記述順によりアイテムをどの処理から対象外にするかの変更が効く  ※ダメージ魔法・回復魔法の両方で「○単純増加」のルーチンを使っている場合は、   これらのタイプを利用すると読み込み側の容量を節約できる === □魔法威力増加、敵味方分岐・アイテム除外あり(verA)   味方魔法     →魔法威力任意倍(味方用)+知性加算   味方アイテム  →魔法威力任意倍(味方用)したあと、知性加算なし   敵         →魔法威力任意倍(敵用)    *??は、調整部のバイト数をカッコ内の値に足してください ジャンプ元: 20 yy-zz  $yy-zz:   xx、??などは以前のものと同じ扱いです。 ○分岐部  A5 A1 C9 61 D0 ??(29~)    *ジャンプ先がさらにずれています。 ○単純加算(味方用)  A2 01 A0 02 20 4D AF  A9 [xx] 20 bb-bb →単純加算ルーチンへのジャンプ ○アイテム除外処理(※分岐部&処理終了60と合わせて使用する) *AD A9 6A 0A 0A AA BD 8F 68 C9 10 F0 [??(0F~)] ○知性加算  A0 12 B1 A0  EA EA EA EA EA  …調知性調整部  6D 58 68 90 03 EE 59 68 8D 58 68 ○処理終了  60 ○敵用単純加算  A2 01 A0 02 20 4D AF A9 [yy] 4C bb-bb === □魔法威力増加、敵味方分岐・アイテム除外あり(verB)   味方魔法     →魔法威力任意倍(味方用)+知性加算   味方アイテム  →いっさい加算なし   敵         →魔法威力任意倍(敵用) ジャンプ元: 20 yy-zz  $yy-zz:   xx、??などは以前のものと同じ扱いです。 ○分岐部  A5 A1 C9 61 D0 ??(29~)  AD A9 6A 0A 0A AA BD 8F 68 C9 10 F0 ??(1B~)  ※アイテム除外処理 ○単純加算(味方用)  A2 01 A0 02 20 4D AF  A9 [xx] 20 bb-bb ○知性加算  A0 12 B1 A0  EA EA EA EA EA    …知性調整部  6D 58 68 90 03 EE 59 68 8D 58 68 ○処理終了  60 ○敵用単純加算  A2 01 A0 02 20 4D AF A9 [xx] 4C bb-bb    *知性加算と単純加算(味方用)の順番を入れ替えると、知性も含めて任意倍されます。 === □魔法威力増加、敵味方分岐・アイテム除外あり(verC)   味方魔法    →知性加算+知性を含めて魔法威力任意倍(味方用)   味方アイテム  →知性だけ加算、魔法威力任意倍はしない   敵         →魔法威力任意倍(敵用) ジャンプ元: 20 yy-zz  $yy-zz:   xx、??などは以前のものと同じ扱いです。  A5 A1 C9 61 D0 ??(29~)  A0 12 B1 A0  EA EA EA EA EA        …知性調整部  6D 58 68 90 03 EE 59 68 8D 58 68  AD A9 6A 0A 0A AA BD 8F 68 C9 10 F0 ??(0C~)  A2 01 A0 02 20 4D AF A9 [xx] 20 bb-bb 60  …味方用  A2 01 A0 02 20 4D AF A9 [xx] 4C bb-bb    …敵用  いずれも順番を入れ替えてアイテム除外を組み込んだだけです。 ◆戦闘時の回復魔法を強化 □戦闘中の回復魔法を2バイト化する  「乱数制御」を適用し、さらに改変を行います。  オリジナルでは完全回復するケアルガ以外の回復魔法(ポーションも含みます)は255が最大の回復量でしたが、他の魔法でも戦闘中に255以上の回復ができるようになります。  さらに任意で、ダメージ魔法で使う魔法威力増加用サブルーチンを使えば、回復魔法の威力を同様に高めることができます。 □07ルーチン(回復魔法)の改変 339A9~339D5 (オリジナルで48バイト→33バイト+フリースペース15バイト) 20 85 B8 20 F9 B8 20 zz-yy 20 3D B8 A9 12 AA A0 01 20 7B AE A2 15 A0 12 20 EA AD 90 03 4C C6 B9 60 EA EA EA EA EA EA EA EA EA   *詳細は内訳をご覧ください。   ※「○魔法威力を強化」部分の記載によってデータの長さは変動するため適宜対応のこと (内訳) ○成功フラグ 20 85 B8 ○魔法威力を計算用メモリにコピー *導入状況により変動 20 F9 B8 (=AD 74 68 8D 58 68 A9 00 8D 59 68 ※ジャンプ先のルーチンの内容)   *ダメージ魔法でも使っている、魔法威力を計算用メモリにコピーするサブルーチンです。場所を移動しているなら、そのアドレスでお願いします ○魔法威力を強化 [--](※サブルーチン化していなければ強化ルーチンをここに直列で挟む)    *ダメージ魔法用のものを流用できます。使うサブルーチンに形式を合わせて記述してください。   サブルーチン化している場合はこの位置に [20 -- --]で+3バイトですね。(強化ルーチンの読み込みアドレスを適宜代入)   *単に2倍するだけなら、0E 58 68 2E 59 68 でも良いでしょう。 ○乱数加算 20 3D B8 ○現在HPに最終的な魔法威力を加算 A9 12 AA A0 01 20 7B AE     ○最大HPと比較 A2 15 A0 12 20 EA AD ○最大HP処理 90 03 [4C C6 B9] 60    *カッコ内は、最大HP処理のサブルーチンです。場所を移動しているなら、そのアドレスでお願いします。 ○余り EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA ◆その他導入可能機能◆  ※フリースペース化した部分に自由に導入可能な機能についてまとめて記載 ======= デスペルについて  デスペルは敵が使うと機能しますが、味方が使うと機能しないのは割りと知られているんじゃないでしょうか。まったく、これほど腹の立つ魔法もありませんねw なんといっても敵用戦闘構造体の中に、耐性を保存するメモリがないのだから話になりません。  デスペルを機能させる場合、まず敵用戦闘構造体の中に、耐性用のメモリを確保する必要があります。  ちなみに、デスペルルーチンそのものについても触れておきますと、オリジナルのままでも問題はありません。  その内容は、    相手の魔法耐性・弱点によって成功率が変わる    成功すると耐性を00で上書きする  というものです。  ただし、胡散臭い命中判定のおかげで、あまり成功しません。また、元々相手の耐性が00であった場合を考慮しておらず、耐性を00にしたかどうかに関わらず成功メッセージが出ます。 == □デスペルを有効にする  新たな発見がありました。敵側の戦闘構造体に、使われていないメモリがあるようなのです。敵構造体のY=12・13が示すメモリがそれです。  そこで、Y=13に耐性を充ててみました。敵耐性の設定データ自体もY=13でロードされるので一石二鳥です。耐性用のロード・リターンルーチンは容量が確保されており、新たに空き容量を探す必要はありません。 32FF9($AFE9)~33003: A0 13 B1 9C 91 9A EA EA EA EA EA   *戦闘開始時に、素設定データの耐性を、敵戦闘構造体内Y=13に保存します。ついでに重複部分を潰します。 32544($A534)~32547: A0 13 B1 84   *物理攻撃時に、敵構造体のY=13を計算用メモリにロードします。物理攻撃の終了時に耐性リターンは不要です。 3371A($B70A)~: B1 92 8D 77 68   →B1 90 8D 77 68  *魔法をかけたとき、敵構造体のY=13を計算用メモリにロードします。Y値が同じなのでこれだけの変更で済みます。  魔法終了時の敵用リターンルーチンはタイトにできており、どうあがいても1バイト足りません。337A0を空けるために、連続して記述されている味方用リターンルーチンの一部を潰しています。潰したところは魔法回避率ですが、オリジナルでは魔法回避率を上下する魔法がないので不要です(FF1ではよくあることです)。 337AD($B79D)~337B3: いったんEA×7で潰します。 337A0($B790)~337AC: 中身を変えずに1バイト後ろ倒し。337A1($B791)~337ADとします。337A0が空きます。 33799($B789)~337A0: AD 77 68 A0 13 91 90 60  耐性を敵構造体Y=13に戻します。   *元は攻撃力のリターン部分です。このデスペルを適用すると、注意してください。 335C3($B5B3): 4C 91 B7  *味方用リターンルーチンへのジャンプ先です。ジャンプ先が1バイトだけ後ろ倒しされています。 ※※この「□デスペルを有効にする」の関連でオリジナルでのさらなる設定ミスが発覚しています。  (※「敵の眠り状態」の解除設定バグ→このデスペル有効化を導入する場合は追加対応必須)  詳しくは「◆戦闘予備知識7◆」を参照のこと □ストライ&セーバー(ルーチン 0D) を有効にする  このルーチンは、計算用メモリへのロード・リターンと、ルーチン自体の構造の全てに問題がありますが、以下のような方法で解決できると考えています。  なお、以下の全てのアドレスは、ROMヘッダありを想定しています。 33A38(BA28)~33A55 :A5 91 C9 68 F0 05 A0 0B 18 90 03 A0 09 18 B1 90 6D 74 68 90 02 A9 FF 91 90 4C 85 B8 EA EA  …戦闘用構造体・攻撃力に直接、魔法の威力を加算します。対象者アドレスをロードし、敵味方で分岐し、適切なアドレスを導きます。重ねがけ仕様で、上限255です 33799(B789)~3379E :6バイトEA  …計算用メモリから戦闘用構造体へのリターンを潰しています プロテス、インビジなどの仕様をみると、オリジナルでも重ねがけがデフォルトのようですので、このような形にしてみました。 ただ、オリジナルのストライの威力は+14と大きいので、ぶっちゃけかなり強力です。+5程度が妥当な範囲でしょうか…? セーバーはいいんです。黒魔道師にもロマンがあっていいと思うんです。最終黒魔兵器w なお、ルーチン内(A0)0B=敵 および (A0)09=味方、のY値を変えることで、ロードルーチンに頼らず、さまざまなものを書き換えることができます。減算にするのも難しくありません。ただし、計算用メモリからのリターンがある場合は、それも潰す必要があるでしょう。 = ↑に挙げた仕様は「攻撃力を加算する」内容となっています。わたし自身が、本来のストライが攻撃力を加算する魔法だと考えていたためです。実際、オリジナルのルーチンには攻撃力用計算メモリが見られるのです。が…   確認のために何気なく元のルーチンを眺めていたところ、衝撃の事実が発覚!   よくよく見直してみると、ストライは実は「命中値と攻撃力を両方を加算する魔法」だったのです! ナ、ナンダッテー!?   実に迂闊な話ですが、攻撃力用計算メモリばかり注目して、前半を注視していませんでした。   よく見直してみますと、元のルーチンは「ストライの命中値」を「命中値用計算メモリ」に加算し、その後、「ストライの威力」を「攻撃力用計算メモリ」に加算する魔法だったのです(上限はいずれも255)。   しかし…残念ながらロードルーチンとリターンルーチンがgdgdなため、ひとつとしてまともに機能しないのは書いたとおりです。アチャー。   オリジナルの仕様を忠実に再現するには、どうもロードルーチンとリターンルーチンの方を操作した方が効率が良さそうな気がしてきました(そのスペースがないためこのような形を考案したのですが…)。しかし、うまくいけば、1つのルーチンで3パターンの魔法を実現できるかもしれない。やってみる価値はありそうですね。 = □ストライ&セーバー(ルーチン 0D)を攻撃命中率のみにかける  命中値がモンスターの戦闘構造体に保存されないのをすっかり忘れていました。デスペルと同じということです。やはりオリジナルのルーチン通りに実現するのは難しいようです。無念…。  それでもやはり命中率がええんじゃい! ということであれば、味方のみ使える魔法ということで、  33A38-33A55: A5 91 C9 68 D0 15 A0 05 B1 90 C9 FF F0 0D 18 6D 74 68 90 02 A9 FF 91 90 4C 85 B8 60 EA EA    *計算用メモリから戦闘用構造体へのリターン潰しは不要  こんな感じになります。味方が使うと魔法の威力を命中値に加算、敵が使うと「効果がなかった」と表示されます。上限は255です。ついでに、それ以上アップしない場合も「効果がなかった」と表示されるようにしてみました。  敵に対して効果があるようにしても、敵の同じ領域はヘイストフラグになっており、リターンルーチンで上書きされるので無意味です。 本当はオリジナルのストライの仕様にしたかったんですが、敵はリターンルーチンで上書きされるので、成功メッセージが出ても無意味です。    ○オリジナルストライ仕様(命中+命中値、威力+攻撃力)       A0 05 B1 90 18 6D 70 68 90 02 A9 FF 91 90 A0 09 B1 90 18 6D 74 68 90 02 A9 FF 91 90 4C 85 B8    *計算用メモリから戦闘用構造体へのリターンの潰しが必要。命中値はリターンがないので問題なし。 味方限定仕様ですので、条件迂回などをしていません。必ず成功メッセージが表示されます。 最大の欠点は、敵に効果がないことなんですよ。まさに不完全というわけで…。 「敵はリターンルーチンで上書きされるので、成功メッセージが出ても無意味です」という部分…つまり半分冗談みたいなものでして、味方だけなら命中+攻撃でも30バイトでいけるんですけど、というお話だったのです。 ======= □真0Dルーチン(100バイト版) おそらく使用しないであろう「属性」の項目を重ねがけフラグの後付け判定に使用 たとえば属性に01フラグが立っていると重ねがけできるが、そうでなければ重ねがけできない、というような形です まとめますと、       魔法の命中追加値+対象の命中値を返す       魔法の威力+対象の攻撃力を返す       敵側で使用する、その場合は攻撃力のみ       属性を重ねがけフラグとして使用       重ねがけ可能・不可能は命中値・攻撃力双方に適用される       失敗時でも成功フラグを書き込む   以上で組んでみることにします。 なお、攻撃力がどれだけ上がるか、などは魔法の設定値側の問題です。ルーチンは動作を管理するだけです。  組んでみましたら、100バイト近い大容量となりました(笑)  重ねがけフラグは、属性が01で重ねがけ可能、それ以外は不可能となっています(可能な場合のみ構造体にアクセスします)。  (ロード・リターンルーチンに頼らないため、↑での改変で使われている“攻撃力に関するリターン潰し”はいっさい不要になります。)  結局のところ、ロードルーチンとリターンルーチンをまともに組み込めないのが問題なのです。オリジナルからこの辺りがグダグダだったので、ロード・リターンルーチンに頼らず何とかできないか、というのが、わたしの考えたストライの改善方向なんですよね。  しかし、ストライが攻撃力専用で、もともとのストライの容量でも問題なかったところが、これに命中値を追加し、重ねがけの可・不可まで追加しますと、わたし自身思っていた以上に容量が増えてしまったという。 選択式にしたのが原因だったようです。ヘッダアドレスとの距離が全部違っているので…  SFCならまだしもFCですから、仕方ないところもあります。割り切ってしまえば、目処がつきやすいですから、一長一短ですけれども。  割り切らないとやっていけない容量というか(笑) さすがにFC、一筋縄ではいきませんorz (本体  71byte)  *$aa-aa~$ee-ee は、いずれも該当場所のアドレスヘッダを記述してください。 33831~32: zz yy(0Dルーチンのアドレスヘッダ) $yy-zz: A2 04 A5 91 C9 68 F0 14 20 dd-dd F0 0A A0 0C 20 bb-bb A0 0B 4C cc-cc A0 0B 4C ee-ee 20 dd-dd F0 15 A0 20 20 bb-bb A0 09 91 90 A2 00 A0 21 20 bb-bb A0 05 4C cc-cc A0 09 20 aa-aa 91 90 A2 00 A0 05 $ee-ee: 20 aa-aa 4C cc-cc   *$ee-ee は本体に連続して記述してください (サブルーチン部 計 27 byte) $aa-aa: B1 90 18 90 03 $bb-bb: B1 92 18 7D 70 68 90 02 A9 FF 60   加算部   *$aa-aa と$bb-bb はこの順番で連続して記述してください。 $cc-cc: 91 90 4C 85 B8  終了時共通 $dd-dd: AD 78 68 C9 01 60   重ねがけ判定部  圧縮のため共有できる部分はできるだけサブルーチン化しています。敵+重ねがけできる、敵+重ねがけできない、味方+重ねがけできる、味方+重ねがけできない、の4ルートがあります。  全てをまとめて記述しなくても良く、連続して記述しなくても良いサブルーチンは分散しても大丈夫です。アドレス間違いには注意しなければいけませんが…。  補足です。重ねがけできない魔法をかけると、素のデータ+魔法の効果が結果として保存されます。そのため重ねがけできる魔法を複数回かけた後で、重ねがけできない魔法をかけると、かえって攻撃力・命中率が下がります。注意してください。  ちなみに…  逆に利用して、相手の攻撃力・命中値を初期値に戻す魔法を作ることもできます(敵にかけると攻撃力のみ初期化します)。命中追加値=00、魔法威力=00、属性=00、効果範囲=01or02(相手側)、ルーチン=0Dとします。命中判定を仕込んでおらず100%成功するので、相手によっては非常に強力です。  命中判定を仕込むことはできますが、さすがにこれ以上長いとロマンが過ぎる気が(笑) ※※魔法設定側で  属性が01になっていると、敵も味方も攻撃力・命中率ともに重ねがけ可能、      00などになっていると敵も味方も攻撃力・命中率ともに重ねがけ不可能、   の二択という形になっている(&敵は構造体の仕様上攻撃力のみが対象)  現状では、同じ魔法設定(この場合は属性での設定が同じという意味です)に対して別々の働きをすることはできないですね…。(味方は攻撃力には重ねがけできないけど敵はできる、など) 重ねがけできる場合は敵味方ともできますし、できない場合も同様です。  このルーチンは「(重ねがけ判定の)全てのパターンが実行できる」ようになっているわけですが、同じ魔法設定を使って味方と敵の動きをわけようとするなら、魔法ルーチン自体の機能を絞った方が良いでしょう。  書き換えずにやるなら、やはり2つ魔法設定が要ります。特殊能力のほうで「ストライ」を作り、外見上はまったく同じにして、属性だけ変えるという手もありますね。それか、敵はセーバーを使うとか。 ======= □真0Dルーチン(簡易版) 魔法設定の「属性」項目による重ねがけ可否判定をはずした場合 ・重ねがけ判定なし(敵:攻撃力+・味:攻撃力+命中値+) → 55バイト ・重ねがけ判定なし+命中率アップ除外(敵・味:攻撃力+) → 42バイト □重ねがけなし(敵:攻撃力+・味:攻撃力+命中値+)  魔法設定の「命中追加値」が命中値に足されます。 (本体) A2 04 A5 91 C9 68 F0 0A        …敵味方を判別します。 A0 0C 20 [bb-bb] A0 0B 4C [cc-cc]   …敵攻撃力増加、素体版 A0 20 20 [bb-bb] A0 09 91 90     …味方攻撃力増加、素体版 A2 00                …命中値用に切り替えています A0 21 20 [bb-bb] A0 05 4C [cc-cc]   …味方命中値増加、素体版 (加算ルーチン) $bb-bb: B1 92 18 7D 70 68 90 02 A9 FF 60   …全てのパターンに対応します (終了ルーチン) $cc-cc: 91 90 4C 85 B8    …保存と成功フラグを兼ねています = □重ねがけなし、命中値加算なし(敵・味:攻撃力+)   中身はそれほど変わりません。 (本体) A5 91 C9 68 F0 0A A0 0C 20 [bb-bb] A0 0B 4C [cc-cc] A0 20 20 [bb-bb] A0 09 4C [cc-cc] (加算ルーチン) $bb-bb: B1 92 18 6D 74 68 90 02 A9 FF 60 (終了ルーチン) $cc-cc: 91 90 4C 85 B8 □敵魔法のランダム使用と順序使用を選択式にする (36バイト)  敵が使う魔法について、魔法パターンの設定によって、魔法を順序どおりに使うか、ランダムで使うか選択できるようにします。 332E7($B2D7)~332F6   C9 [80] 20 aa-aa D0 06 20 bb-bb 4C C9 B2 4C D5 B4 ☆サブルーチン $aa-aa: F0 03 C9 FF 60 A9 00 A2 FE 20 5D AE 29 07 C9 00 D0 03 18 69 01 18 69 02 A8 B1 9E $bb-bb: 48 A9 00 A0 07 91 9A 68 60   *$bb-bbは連続で記述してください  ランダム使用のフラグとして、魔法パターンの1番目を利用します。ここが[80]になっていると、残る7つの中から魔法をランダムで使用します。乱数取得の都合上、一番左の魔法が若干出やすくなっています(2/8)。ランダムにする場合は、全ての魔法パターンを魔法で埋めてください。 (サンプル) ○ランダム使用:64 00 80 04 04 04 14 14 14 24 FF FF FF FF FF FF  ⇒(確率64で魔法を使用)使用時はファイア、ファイラ、ファイガをランダムで選びます。上記の場合、選ばれる確率はファイア(4/8)>ファイラ(3/8)>ファイガ(1/8)になります。1番目に80を置いて他魔法欄にFFを入れるとフリーズの可能性があります。 ○通常使用  :64 00 04 04 04 04 14 14 14 24 FF FF FF FF FF FF  ⇒(確率64で魔法を使用)使用時はファイア×4→ファイラ×3→ファイガ×1、の順で使っていき、ファイガを使うとファイアに戻ります。24→FFとすると、3回目のファイラ後にファイアに戻ります。 □攻撃対象がいなければ自動で対象をズラす(オートターゲット) (30バイト)  味方の物理攻撃、および単体魔法で、対象がいなくなっていれば次の攻撃対象を探すルーチンです。物理攻撃・魔法攻撃の2ヵ所に、存在判定を仕込みます。 32376: BE 91 68 →20 zz-yy 323C0: BE 91 68 →20 zz-yy ☆共通サブルーチン $yy-zz: BE 91 68 E0 09 B0 09 48 BD B7 6B C9 FF F0 02 68 60 A2 00 $aa-aa: BD B7 6B C9 FF D0 F5 E8 4C aa-aa    *$aa-aaは連続して記述してください。  存在判定を見るタイミングは対象IDを最初にロードするときです。それ以降では弊害が発生します。敵はこのルーチンを通りません。  攻撃アイテムはもともと敵単体に使うことを考慮されていません。使用者IDが対象IDになります。攻撃アイテムを単体用にすると、使用者ごとに同じ対象IDを狙い続けます。味方単体にかける魔法をアイテムに設定すると、必ず自分に使います。  アイテムにおける対象選択は長くなるのでやっていません。  これを使うと通常攻撃がとんでもなく強化されます。ただでさえ打撃優位の世界ですから、オリジナルだと強すぎて完全に連打ゲーになりますw 従って、魔法の強化とどう両立するかが課題となってきます。容量をどうやりくりするかが悩みどころですね…。 ◆はるかなすきま  3FE00あたりの空き領域を文字コード追加で使ったのですが、あそこの3FE04~0Fであと12バイトほど残っています。  (アドレス指定は)あの辺ですと、単純に$30010を減算すれば良いですよ。たぶんこう書くのが一番わかりやすいんじゃないでしょうか。  FCのアドレス指定は、バンクが絡んでくるのはご存知だと思うんですけども、どのバンクにあっても変わらないバンクがありまして、それがあの領域なんですよね。  FF1の場合、あの辺りが変わらないバンクにあたります。ですので共有もできるというわけで、あの辺りに余裕があると色々と楽なんですよ。FF2はたくさん空いてて嬉しいったらありません。 ◆MP2桁化について◆ □MP2桁化について(概要)  2桁化の肝となるのは変換ルーチンです。  ステータス側では3つ調整位置があります。(1)個人ステータス画面、(2)魔法画面、(3)4人ステータス画面です。  このうち(1)・(2)は文字変換のジャンプ先を変えるだけで表示してくれます。(3)は例によって表示設定を自分で打ち込まなくてはいけません。  戦闘側では、HPを4桁化可能にしたときと同じルーチン「$AA21(20 21 AA)」を使います。  3桁仕様でも4桁仕様でも(HP4桁化ルーチンを導入してさえいれば)かまいません。  「$AA21」後は、MP2桁目は文字コード化して685Aに入っています。MP1桁目はこれも文字コード化して、所持したままに終了しています。これらを描画位置に収めれば表示してくれます。  もちろん、ただ表示するだけでは画面がぐちゃぐちゃになります。画面調整が必要なのですが、ステータス側の(3)や戦闘側は変換ルーチンと画面調整が密接に関わるため、どうしても面倒です。  そこで情報提供というよりは例示という形にさせていただきました。割りと不要なところまで適当にいじくっています。  以下のコードは調整を含みますので、ベストの画面調整ではありません。  肝になる部分は☆印をつけてあります。☆の部分を変えるときは注意が必要ですが、それ以外は参考程度にどうぞ。 ===== (0)戦闘画面側の調整 □戦闘画面のMPを2桁化する  「◆HPを4桁化◆」できるようにして、さらに改変を行います。3桁用でも4桁用でも大丈夫です。  ☆印は(魔法回数)の部分全てです。そこで空き領域が必要になります。 (魔法枠) 3FA1A~: 00 01 19 0A  …左方向に拡大しています。 (カーソル位置) 31FCF~3AFE6: 範囲内の以下の値を全て変更しました。  18→ 10  48→ 40  78→ 70   *横位置を移動させています。 ☆(魔法回数)  ここが肝になります。HP4桁でも使ったサブルーチン[20 21 AA]を利用し、2桁化しています。導入に必要な容量は24バイトです。 3F7BC~3F7CF:  8A 85 A4           …x の値を空きメモリ(00A4)に保存しています。  A9 20 18 6D B5 68      …MPロード用の位置情報を計算しています。  A8 B1 88 [20 zz-yy]    …MPをロードし、サブルーチンに移動します。  A9 00 9D 08 6B       …区切りである00を書き込み用メモリに入れています。2桁化したので位置を1つずらしています(6B07→6B08)。  魔法回数は5~8レベルが別扱いになっています。以下は5~8レベル用の追加変更です。 3F814~3F827:  8A 85 A4  A9 [24] 18 6D B5 68  A8 B1 88 20 [zz-yy]  A9 00 9D 08 6B [24]以外は3F7BC~3F7CFと同じ内容です。サブルーチンへのジャンプアドレスも同じものを使ってください。追加の容量は不要です。 $yy-zz: (※ルーチン圧縮によってフリースペース化した部分に適宜記述のこと:24バイト必要)  AA A9 00 [20 21 AA]    …4桁化するサブルーチンを利用します。  A6 A4              …x の値を空きメモリ(00A4)から取り出しています。  9D 07 6B            …1桁目を書き込み用メモリに保存します。  AD 5A 68           …2桁目を685Aから取り出します。  C9 80 D0 02 A9 FF     …0(文字コード80)だったらスペースに置き換えます。  9D 06 6B 60         …2桁目を書き込み用メモリに保存します。 (アイテム表示枠)   *魔法枠と連動して大きさが変わるので、設定を分けています。   *アイテム表示位置の調整は困難ですが、枠調整と同時に文字位置も調整されるので、アイテム枠の大きさ設定さえ独立させてしまえば問題ありません。   *5バイトほど設定用に使います。ただしアドレスは書き込む場所より1バイト前を指定してください(3FFC9→B8 FF)。ルーチンの仕様上、そうする必要があります。 3F8A8~: B9 08 FA→ B9 B8 FF   …アイテム枠用のロード先です。 3FFC9~CD(00になっているのを確認してください): 00 02 01 16 0A   *内容は従来の魔法枠と一緒で良いですが、少し変えてみました。 (アイテム枠カーソル位置) 31FE7~: 10 A6 10 B6 10 C6 10 D6 60 A6 60 B6 60 C6 60 D6   *少し変えたついでで横位置を微調整しました。 ===== (1)個人ステータス画面の調整 □ステータス画面のMPを2桁化する  大きく3つ変更する画面があります。  肝になる部分には☆印をつけてあります。残りは画面調整です。 ○「個人ステータス」画面  ここの☆印さえやっておけば、個人ステータスと魔法画面は2桁化されます。 ☆(2桁化) 38DBB~: 4C 5C 8E→ 4C 66 8E (文字位置調整) 389DF~: 10 2C 7A 10 2D 7A 10 2E 7A 10 2F 7A 10 30 7A 10 31 7A 10 32 7A 10 33 00 (+余りがいくつか出ます)   *MP間のFFを消去します。339DEのFFを潰すとレベル8の横にスペースを確保できます。 ===== (2)メインメニュー側 魔法選択画面の調整 ○「魔法」画面  せっかくなのでいろいろやってみました。魔法枠が下のメッセージ枠に被らないようにしないと、使えない魔法を選択したあとに魔法枠が消えてしまいますね。メッセージ枠を狭めるとそれはそれで格好悪いという…。 (枠の大きさ) 3BAE1~: 0B 01 0A 04  …名前を表示する枠の位置を変えています。 3BAE9~: 01 02 1E 14  …魔法枠の位置調整と拡大をします。 (表示設定) 38A7F~38B2E: C6 C3 FF FF FF 46 C9 01     …最上段にL、MPの文字を表示しました。 81 FF 10 2C 7A 10 34 FF FF 10 14 FF FF 10 15 FF FF 10 16 01   …Lを削除、MPと魔法の間のFFを1つ削除。以降同じです 82 FF 10 2D 7A 10 35 FF FF 10 17 FF FF 10 18 FF FF 10 19 01 83 FF 10 2E 7A 10 36 FF FF 10 1A FF FF 10 1B FF FF 10 1C 01 84 FF 10 2F 7A 10 37 FF FF 10 1D FF FF 10 1E FF FF 10 1F 01 85 FF 10 30 7A 10 38 FF FF 10 20 FF FF 10 21 FF FF 10 22 01 86 FF 10 31 7A 10 39 FF FF 10 23 FF FF 10 24 FF FF 10 25 01 87 FF 10 32 7A 10 3A FF FF 10 26 FF FF 10 27 FF FF 10 28 01 88 FF 10 33 7A 10 3B FF FF 10 29 FF FF 10 2A FF FF 10 2B 00 00 00 00 00 00 00 00 00 00 (カーソル位置) 3B857(変更なし): 30(縦方向カーソル位置) 3B846(変更なし): 48 80 B8(横方向カーソル位置) ===== (3)4人ステータス画面の調整 ○4人ステータス画面  ☆印は、MP書き込みのところにある4行ほどです。  20 66 8E を使って変換するまでは同じですが、そのあとの処理もやらなければいけません。  なお、下記のコードでは、戦士系と魔法系でMPスキップ時の開始位置がずれないように工夫してあります。  それにしても、色々と手狭な感じが否めません。MPの文字が無いほうが良かったかもしれないですね。 (MP書き込み) 3B9C5~3BA24:  4C 15 BA          …ジャンプ先を変更します。 ☆A0 00 ☆8A 48 BD 20 63 85 10 20 66 8E   …変換処理の本体です。 ☆A5 5E 99 03 03 C8 A5 5F 99 03 03 C8 A9 7A 99 03 03 C8   *0300~0302にMPの文字を入れたため、☆内では0300→0303から書き込んでいます。   *変換処理のあとは、005Eに10の位、005Fに1の位が入っています。    戻ってきた時点で文字コード化されています。    それぞれロードしつつ、[/]とともに所定の位置にいれていきます。 ☆68 AA E8 C0 18 90 DD    …MPを全てロードするまでループしています。 A9 46 8D 00 03 A9 C9 8D 01 03 A9 FF 8D 02 03   …「MP」の文字をこのタイミングで入れてしまいました。 A9 09 85 3A A9 00 8D 1A 03 A9 0F 85 3E A9 03 85 3F   …下の行を書くために必要な位置などを書き込んでいます。   *20 66 8E を通すと003F($03)が上書きされますので、新たに入れなおしています。 E6 3B           …縦位置+1。戦士系がスキップしたときに開始位置がずれないようにしました。 20 57 B9         …描画ルーチン A9 06 85 3A A9 00 8D 0F 03 85 3E   …上の行を書くために必要な位置などを書き込んでいます。 C6 3B           …縦位置-1。戦士系がスキップしたときに開始位置がずれないようにしました。 20 B6 DE         …描画ルーチン EA EA EA        …余り (その他の部分補足) 3BA25~: A9 0B 85 3A C6 3B    …HP書き込み位置   *以降68 0A 2A 2A…で同じになります。やや左に寄せています。 3BA5B~: A9 06 85 3A        …その他書き込み位置   *MPに合わせて左に寄せています。 (キャラカーソル位置) 3B7FC~: 08 28 08 58 08 88 08 B8   …左に寄せています。 (描画開始位置) 3B869~: A9 07 3B873~: A9 0D 3B87D~: A9 13 3B896~: A9 19   *1つ上にずらし、戦士系がスキップしたときに開始位置がずれないようにしました。 (スプライト位置) 3B658~3B670:  さすがに窮屈です。 1人目  1B(3B659:0040)、24(3B65D:0041) 2人目  54(3B666:0041) 3人目  84(3B66F:0041) 4人目  B4(3B678:0041) ◆魔法使用回数最大値 2DCA6 魔道士系 0A (最大 9) ※設定から-1した数が最大値 ↓ 33 (最大 50) 2DCAA ナイト・ニンジャ 05 (最大 4) ※設定から-1した数が最大値 ↓ 10 (最大 15) ↓ 11 (最大 16) ※※大元の表示そのものを2ケタ化しなければ    回数10 が 「あ」 などになってしまうので    ここだけ変えても意味がない    魔法使用回数2桁化には↑のルーチン変更と処理追加が必要になる ◆戦闘予備知識1◆ Q:ストライとセーバーのオリジナル版の効果は本当はどういったものなんでしょうか? A:元々のルーチンの仕組みから結論すると、何の効果もありません。   ストライもセーバーも実際には一切効果なしです。 ◆戦闘予備知識2◆ Q:攻撃命中率だけにかかる魔法ではないと知って、セーバーとストライの違いが段々わからなくなってきました。  魔法命中値0でも必中効果を発動するということは、重ねがけ判定と設定値さえ別々になっていれば、セーバーとストライって内部処理上は全く同じ魔法みたいなものなんですか? A:その通りであります! ついでにセーバーも同様です。   内部的には、セーバーとストライはまったく同じものなんですね。魔法の種類というのは、完全にルーチンに依存しているものですから、同じルーチンを使う魔法は同じ処理をする魔法なんです。ストライとセーバーのルーチンナンバーはともに0Dになっています。   FF1では、ほとんどの魔法に重ねがけ判定がありません。必要な魔法において上限だけ指定します。重ねがけできないのは、ヘイスト・スロウと敵が自分たちにかけるプロテス系くらいでしょうか。(※敵の場合はプロテス系を重ねがけできないということ)   内部的には、前者はそれ自体がフラグという形を取っています。後者は敵にかけるときのみ、ロード時に構造体ではなく素の設定データからロードしています。   魔法命中値0でも必中効果発動について。(魔法命中値:例えばRevisedのファイアで設定されている命中追加値40のことですね。ストライの設定値内などでも、攻撃魔法の追加命中値と同じ順番に保存されている数値のことです。)   FF1では、味方にかける魔法に命中判定がありません。味方にかける魔法は全て必中になっています。味方にかける魔法では、命中追加値は基本的に使われません。  なお、攻撃命中値はモンスターの戦闘構造体に保存されません。デスペルと同じということです。やはりオリジナルの仕様通りのルーチンとして実現するのは難しいようです。   ですので、ルーチン0Dの仕様的には、やはり攻撃力を増やす形がベストなんじゃないでしょうか? 内部的な問題がひとつと、敵味方で兼用できる方が良いだろうということと、戦闘中に命中値を増やしてもあまり効果が期待できないこと、あたりを考えてみまするに…。 ==== 附録:魔法データの持ち方の例 例:ストナ 30330~: ?? 02 ?? 10 08 xx xx 00    *順に………     命中追加値:(味方用魔法では使われません)     魔法威力 :02(石化)     属性   :(回復魔法などでは使われません)     対象   :味方1人=10(もしくは味方全体=08)     ルーチンナンバー:08(状態異常回復)     魔法アニメ:(任意です)     アニメ色 :(任意です)     区切り :00(読み込み終了サイン) ◆戦闘予備知識3◆ Q:FF1って、戦闘中の命中率増加でも+32の区切りでちゃんとヒット回数伸びるんですか?  極端な話、攻撃命中率32程度のときに魔法命中値32のストライを使ったら攻撃ヒット回数+1という動作になるんでしょうか?  それと、それが可能だった場合のヘイストはどうなるのか、という点も。  ストライなんかそれによって完全に使い勝手が変わってきそうですし・・・ A:伸びないです。 攻撃回数は戦闘開始時に計算されていましたから…  ヘイスト・スロウはフラグで管理されます。  ではまず命中率について。  攻撃命中値は、命中判定に使います。回避率を無視して命中値をnとすると、おおよそ255分のnという確率で成功します。ただし数値がそのままnにはなりません。(下記の)回避率のところをごらんください。  攻撃回数は、味方側は戦闘開始時に計算されます。最低値は1で、攻撃命中値を32で割った値ずつ増えていきます。Revisedですと32D71~75に計算部分があります。1バイトEAで潰すごとに、16→8→4→2→そのまま、の順で反映度数が増えていきます。0A×5とか記述するともはや動きが想像できません。開始時に255回ヒットとかたたき出すんじゃないでしょうか。  味方の攻撃回数は戦闘構造体の中に記録されており、逆にいえば、記録されているからこそ、戦闘中で攻撃命中値が増減しても反映されないのですね。  敵の攻撃回数は、常に素の設定データからロードされます。ヘイスト・スロウは敵味方ともフラグで管理され、それぞれ保存領域があります。ヘイスト・スロウが敵味方とも影響があるのはそのためです。  なお、パレット関連の未使用メモリを使う場合、ロードルーチンやリターンルーチンの仕様自体を操作する必要があり、戦闘構造体としての利用は不向きです。できないことはありませんが、余計な容量を使うことになるでしょう。  次は回避率についてです。  敵味方ともに、物理回避値は、攻撃命中値を相殺するものです。  ただし単純に相殺するのではなく、攻撃命中値には基本加算値があり、命中側が有利になっています。戦闘中に攻撃命中値を上げてもあまり意味がないのはこれが原因です。終盤では攻撃命中値が120を超えることも珍しくないので、基本加算値を足すとすぐカンストしてしまうのです。  上限が255であるがゆえに、敵側の回避率が鬼上がりすると、物理命中の確率は絶望的な数値になるでしょう。  くらやみ状態はステータス異常として敵味方ともに保存されます。物理攻撃側がくらやみ状態の場合はマイナス40(326BC)の攻撃命中値修正、物理防御側がくらやみ状態の場合はプラス40(326CC)の攻撃命中値修正がかかります。    次はクリティカル率について。  これはあまり調べたことがありませんが…味方のクリティカル率は、もともと武器側の設定データです。オリジナルでは間違ったアドレスをロードしており、武器IDがクリティカル率になると言われています。海外のツール(FF Hackster Plus)では、正確に武器の該当データをロードするように修正され、戦闘中も物理攻撃時にその値を利用する動きが見られます。  武器設定データの3番目がクリティカル率です。正確な効果はよくわかりません。必中効果ではないかと推測していますが…。よく考えたら物理防御無視効果がありそうですね。  ざっとこんなところでしょうか。あと、ついでに、敵側の設定できるデータの中で、敵側の戦闘構造体に「保存されないもの」を列挙しておきましょう。保存されないものは戦闘中に値を変更することができません(ヘイスト・スロウによる影響は除きます)。  「攻撃回数・攻撃命中値・クリティカル率・物理攻撃属性・追加効果・種族・魔法回避・弱点・属性」 === 物理命中の「基本加算値」について ※「味方の命中値(ステータス+武器での)」と、「敵の素の命中値」に加算される、“計算上の隠しステータス”とでもいうべき扱いの加算値 19$A68F(3269F):A9 A8 8D 56 68  つまり#$A8=168です。 ◆戦闘予備知識4◆ Q:防具の属性で、火と氷についてだけお互いの弱点属性を背負ってしまうという動作をなくすことはできますか? A:FC版のFF1だと、そういう仕様はないので安心してください。  わたしも調べるまでは普通に信じてました…。風説おそるべし。 Q:アイスアーマーとか炎の盾ってオリジナル版では「大ダメージを受ける装備」として恐れられていたように思うんですけど、これも実は乱数のせいなんですか? A:FF1では主人公側に弱点の概念がないんですよ。  防具IDもダメージ適用までに読まれる形跡がありません。ちなみにRevised(ルーチン未変更版)ですとブリザラの基本威力30ですから、×4=120までのダメージは乱数によるダメージです。  事実上、乱数が本体の3倍の幅を持っているわけです。  (※魔法ダメージの算出が常に1回ヒット扱いということを踏まえ)最終的に物理は1回あたり100程度のダメージを出すから、4倍でちょうどいいやくらいの感覚だったのではないでしょうか。 ◆戦闘予備知識5◆ Q:FF1の「こんらん」状態の時って、実際はどんな行動をするようになってるんでしょうか? A:敵がやっているのは、100%魔法攻撃でした。  使っている魔法は「ファイア」、正確には魔法ID=04 です。ランダム性はなく、必ず設定された魔法を使います。      3322D~: A9 [04] …これが魔法IDです。  ターゲットですが、生きている敵内でランダム選択となっています。内部的には00~08 の乱数を取り、対象IDにしています。これは全て敵の対象IDですので、 必ず敵が選ばれることになります。存在判定をして、いなければ新たに乱数を取り直しています。  存在判定が絡むので、味方をターゲットに加えるのは難しいでしょう。  存在判定を無くすと、あさっての方向に攻撃して姿のないゴブリンにとどめをさす、というバグった光景が見られます。  魔法IDが全体用であっても、単体にしかかかりません。  (※乱数制御などを導入している場合には、ファイアより上位ランクの全体魔法などからも任意の攻撃力のものを設定できる)  対象以外の動作は(代入する魔法IDの)魔法ルーチンに従います。どんな魔法でも敵側に使います。成功メッセージなどもそのまま出ます。  味方に混乱がかかっても、状態異常として記録はされますが、何の影響もないようです。異常表示もありません。味方にかけることは想定されていないということですね。  (※敵攻撃の追加効果などに含めることはできても、シリーズ作での「混乱状態」のような動作をさせるのは不可能ということ。)  オリジナルでは「なかまわれをはじめた」という未使用メッセージがあり、混乱専用の魔法を作ろうとしていたことが伺えます。けっきょく実装しなかったようですが。いや、複雑怪奇ですね~w  ∴ FF1の「こんらん」=全行動がファイアになる (ダメージのバラつきは単に“あの乱数の仕様”) A:「混乱は消毒だー!」(※某部隊) ◆戦闘予備知識6◆ Q:バトル中のバグらしき動作について 1・くすり(ポーション)の使用を選択 2・戦闘進行時にくすりを選択したキャラが「マヒ」をくらう(ポーションを使用しないことになる) 3・次ターンのコマンド選択時にはポーションの数が減っている  (戦闘時はずっとこのまま。一応、戦闘終了すれば数は元に戻る)  という現象が発生するようです。  カウント処理の方の問題のようなんですが、これは修正が効きそうな内容なんでしょうか? A:ちょっと調べてみましょう。 □表示用メモリがターン開始時に更新されないバグを修正  戦闘中のアイテム数は、もともとの所持数と、もうひとつ「アイテム表示用メモリ」によって管理されています。  表示に現れる所持数は後者です。このメモリはアイテム選択時とコマンドキャンセル時にそれぞれ増減しますが、実際の所持数と照合されるのは戦闘開始時だけです。ターン終了時に実際の所持数との照合がされていません。そのため、行動不能で使用がキャンセルされると、そのたびに数がずれていきます。  これを簡易的に修正します。 ○各戦闘ターン開始時のルーチンの一部を改変 3143E~31442(5バイト):  A9 00 8D 8C 6C  ↓  20 [-- --(空き領域へ)]  EA EA ○魔法ルーチンなどの空き領域に修正ルーチンを記述(18バイト)   AD 39 60  8D AF 6B  AD 3A 60  8D B0 6B  A9 00  8D 8C 6C  60 ○戦闘開始時のジャンプ先などを改変し、重複を削除 31337~: 4C AE 93→ 4C BA 93 313BE~313C9: 00~(未使用になります。空き領域12バイトです) ◆戦闘予備知識7◆ Q1:「マヒ」と「眠り」状態の差(最低変化ターンとか?)がイマイチよくわからないので教えていただいてもよろしいでしょうか? A1:ちょっと調べてみましょうb 推測ですと、物理攻撃による解除判定があるかないか、じゃないでしょうか。 被弾時の解除ルーチンは確認できません。殴られても起きないのかな。まとめますと、 ・眠りとマヒは、自分の行動が回ってきたときに解除判定がある。行動後に状態異常になると、そのターン中は解除判定がない=次のターンに持ち越される。 ・眠り解除条件は、味方と敵で同じ。00h~50hまでの乱数を取り、最大HPから減算。結果が00でなければ回復する。  つまり、最大HPが81以上あれば、必ず自分の行動で解除される(少なくとも確認できたルーチン上はそうなっています)。 ・味方のマヒ解除条件は、FFhまでの乱数を取り、and03で00になれば解除成功。大雑把に考えて25%。 ・敵のマヒ解除条件は、同じ乱数を取り、結果が19h未満。だいたい10%弱。  だいたいこのような感じになっているようです。……すごく大雑把じゃないですかコレ……?  最低解除ターンなどの記録もないようですし、完全に乱数依存です。眠りは条件がアレなのですぐ解除されますが、マヒは運が悪いと延々と解除されません。  いちおう、条件部分を付記しておきます。条件を変更することで、解除条件を変えることが可能です。眠りは書き直さないと小細工効きませんけれどもね…orz 味方眠り解除条件: 32456: A2 50 味方マヒ解除条件: 3249C: 29 03 F0 05 敵眠り解除条件 : 331F5: A2 50 敵マヒ解除条件 : 331D3: C9 19 B0 09 === ◆眠り・マヒ解除条件の改善 Q2:おおっわぁ、ここでも乱数でしたか。乱数のおかげでやられてる感はこれまでも多数でしたが、どんだけやられてるんだか。 しかし、オリジナルだと敵が速攻で目が覚めて意味不明だったのはこういうところにありましたか。 (リバイズドだとなかなか敵が目が覚めなくなって麻痺が回復しやすくなったような気がするのはプラシーボなんだかなんなんだか。) A2:やっぱり眠りですね、オリジナルの役に立たなさっぷりは異常ですからね。スリプラ(笑)  ただ、代替案に導入できそうなものがないんですよね。打撃時に解除判定を仕込むのも面倒ですし、メモリ管理上、ターン経過で目覚めるというのも厄介です。…力技でエイヤッとぶちこんでしまっても良いのですが、やればやるほど長くなるという。  最大HP依存というのは流石に首を傾げたところなので、行動順が回ってきたときの解除条件に手を入れるくらいでしょうか。現在HPを見て判断するとか、2バイト管理にするとか。 □眠り解除の追加報告  眠りの解除確率が下がったいうご報告を受けて、敵側の解除ルーチンをさらに詳しく見ていましたら、バグが出ているようなので報告と修正をいたします。ちょっとややこしい話になりますが、お付き合いください。 ○敵側の眠り解除判定の詳細  デスペルを有効化したとき、未使用と判断した2バイトを覚えていらっしゃいますか? 最大HPの下位と、必ず00が入れられる2バイトでした。あれはどうやら、敵側の眠り解除判定で「使いたかった?」らしいのです(眠りは盲点でした…orz)。  ただし「使いたかった?」と疑問形になっているのがミソです。  敵側の眠り解除判定は以下のようになっています。   (1)未使用と判断した例の2バイトをロードし、計算用メモリに入れる。オリジナルでは最大HPの下位+00。   (2)00~50hまでの乱数を取る。   (3)1で入れた計算用メモリより「2つズレた」位置の計算用メモリから、乱数を減算する。ロードした値は使われない。   (4)「計算結果を無視して」、1で00を入れた計算用メモリをロードし、値が80未満なら解除に成功する。  …一読してもわけが分からないかもしれません。わたしもそうでした。計算は関係ないメモリで行われ、最終的に過程をぶん投げたうえ、敵側は「解除に失敗しない」ことになっているのです(味方側は正常に計算して分岐します)。どういうことなの…??? ○デスペルの有効化にともなうバグの発生と修正  現在、この解除成功分岐において必ず00であったメモリは、デスペルの有効化によって耐性を入れています。その結果、敵側の耐性80hが設定されているとき、眠りが解除されなくなってしまっています。  この問題は、敵側の眠り解除ルーチンそのものを整理することで対応します。さしあたり応急処置としてバグだけ取っておきたいので、固定確率で解除される形にしておきます。 331E4~33202(31バイト): (オリジナル)A0 12 B1 9A 8D 56 68 C8 B1 9A 8D 57 68 A9 00 A2 50 20 5D AE AA A9 01 20 0A AF AD 57 68 30 09  ↓ (変更後) EA ×20バイト  位置合わせ、未使用化 A9 00 A2 [63]   00~[指定]範囲で乱数取得 20 5D AE C9 [32] B0 09   [指定]値以上なら解除失敗 Q3;ゲ、ゲェーッ! こんなとこでまたも不毛な未使用化が発見されましたか。 おおーわー、なんか、0B・0Dルーチンやらデスペルルーチンを彷彿とさせる なにそれ展開になってますね。 >敵側は「解除に失敗しない」ことになっている こういう事になっていましたかー! いやはや、これがオリジナルのスリプラ役に立たない伝説の真相でありましたとは。 しかし、今度はどうも味方の方が速攻で目覚めてしまいます。どうしたもんやら。 (とはいえ、敵・味方とも条件統一できれば[指定値]の微調整でいけそうな気もしています。) A3:一見もっともらしいことをやっているので、すっかりだまされてしまいました… >味方の方が速攻で目覚めてしまいます。どうしたもんやら ちょっと育つと確定覚醒ってのはどうなのかと思いますよね、やはり。 敵と味方で仕様を統一する(固定確率にする)というのは、アリかと思います。調整も簡単そうです。 □味方側の眠り解除設定を固定乱数にする 32447~32476(48バイト): EA×37         位置合わせ A9 00 A2 [63]     00~[指定]範囲で乱数取得 20 5D AE C9 [32] 90 05     [指定]値以上なら解除失敗   *分岐部分が変わっているように見えますが、敵側とは解除と失敗のルーチン配置が逆になっているためです。敵側と味方側で同じになるよう合わせてあります。 ※※「○デスペルの有効化にともなうバグの発生と修正」と「□味方側の眠り解除設定を固定乱数にする」の両方を使用すると敵・味方とも眠り解除設定の条件を統一できる。 ◆戦闘予備知識8◆ Q:毒のダメージもやっぱり単純な乱数なんでしょうか? A:固定ダメージです。   322F6: 02  戦闘中は、これが毎ターン減算されています。つまり2点です。 ◆その他ありがちな質問への提言まとめ◆ Q:ジョブチェンジ制にしたいです! A:FF1のクラスチェンジの仕様は非常にシンプルですよ。バハムートの部屋でジョブID+6するだけ。消すのも簡単、クラスチェンジしなくなります。  ジョブIDが変わると、グラフィックから成長パターンから全部変わります。個人データはそのままだったはず。MPのあたりがちょっと不明ですかね。魔法使い→戦士とかやったらMP消えるんかな?   そんなわけで、実は地味にできそうだったりするんですよね、ジョブチェンジ制(笑) どっかでジョブIDを加減算するコードを組み込めればですよ。あまり夢を持たせるようなこと言っても仕方ないんだけどw  どのみちFF1の場合、6パターンしか成長パターンを設定していない(戦士とナイトは共通、黒魔術士と黒魔道士で共通という感じ)ので、成長パターンの仕組みを変えないと、FF3のようにはいきませんね。バリエーションが乏しいです。固有コマンドとか仕込む隙間なさそうだし。せいぜい白黒魔法を3つずつにして、固有コマンド(のための動作)に置き換えるくらいでしょうか。 === Q:パーティ前後列制にできないんですか? A:これは厳しいですね。ざっと考えただけでもかなりの仕様追加が要ると思います。前後列のダメージ減算、配置換え用設定画面、物理攻撃のスキップなどなど…。 === Q:魔法をアイテム化できますか? A:FF3仕様ですか? FF1ってアイテム管理が独特なので、どうでしょうかねー。  IDが武器・防具・魔法・道具の全てで00開始扱いなので、専用の魔法アイテム用ページとか魔法数用メモリとかが要るようになってきそうですね。難しいかも。 ◆移動中関連◆ □移動中のアイテム・魔法効果(オリジナルの仕様) まずアイテムから。ポーションはご存知ですね。 3B2B0: 寝袋の回復量(固定) 3B2CD: テントの回復量(固定) 3B2EA: コテージの回復量(固定)  次は魔法ですが、移動中の魔法は、戦闘中の魔法とはまったくの別ものです。たとえば戦闘中のポイゾナとケアルを入れ替えたとしても、移動中の設定を変えないと、移動中ではポイゾナはポイゾナ・ケアルはケアルのままです。  移動中の魔法IDは、戦闘中の魔法IDとは違うものが使われます。具体的には魔法ID+B0hが移動中の魔法IDとなります。          対応ID 3AF1D: ケアル  B0 3AF24: ケアルア C0 3AF2B: ケアルダ D0 3AF32: ケアルガ E0 3AF39: ヒール  C3 3AF40: ラヒーラ E3 *下記注 3AF47: ヒーラ  D3 *誤植ではなくもともと順番が入れ替わっています。 3AF4E: ポイゾナ C8 3AF55: レイズ  D1 3AF5C: アレイズ E8 3AF63: テレポ  D6 3AF6A: ストナ  D8 3AF71: ダテレポ D9  直後のジャンプアドレスが対応ルーチンとなります。注意しなければならないのは、移動中のアイテム・魔法はほぼ全て、それぞれに独自のルーチンが組まれていることです。画面表示・ボタン入力待ちなどもルーチンに含まれます。たとえばポイゾナを全体化したい場合、ポイゾナのルーチンそのものを書き換えなければならず、その分、他のルーチンを削ったりしなくてはいけません(それはそれでやりようはありますけども)。  移動中の回復魔法も独自のルーチンを持っています。戦闘中の回復量がはぁ~さっぱりさっぱり反映されないのは、独自に回復量を指定しているからです。  下記表にある変化幅の枠内で回復量は増減し、これに最低値が加算されて最終的なHP回復量となります。魔法名は上記の表に対応しています。   3AF82: ケアル変化幅 3AF84: ケアル最低値 3AF8A: ケアルア変化幅 3AF8C: ケアルア最低値 3AF92: ケアルダ変化幅 3AF94: ケアルダ最低値 3B002: ヒール変化幅 3B005: ヒール最低値 3B00B: ヒーラ変化幅 3B00E: ヒーラ最低値 3B014: ラヒーラ変化幅 3B017: ラヒーラ最低値 3B049: レイズで治療される状態異常(01=死亡) 3B052: レイズのHP回復量 3B078: アレイズで治療される状態異常(01=死亡) 3B0AE: ポイゾナで治療される状態異常(03=毒) 3B0D8: ストナで治療される状態異常(02=石化)  治療される状態異常は全て単一目標です。石化+毒を治す場合、何かを圧縮して書き換えないといけません。たとえば魔法の回復量を一部固定にしたり、アイテムを削ったりというような。 ◆移動中関連を再編成する◆ □移動中のアイテム・魔法仕様の改変について(概要)  長くなるので、先に仕様確認をしておきたいと思います。  想定している仕様変更は以下の通りです。  ・ポイゾナルーチンの仕様を全体化  ・死亡以外を解除する処理を追加(ストナ→エスナで使用)  ・回復量算出ルーチンを大幅に変更、2バイト回復に対応  ・治療時効果音を追加(おまけ)  ポイントはむしろ副産物である回復量でしょうか。思いついちゃったんだから仕方ない(何)  あらかじめ全ルーチンで使う回復基本値を固定し、アイテム・魔法ごとに基本値をn倍して回復量にします。  例えばこのような感じです。以下の設定値はおおよそRevisedに合わせています。 基本値19[$13]+乱数 0~3[$03] =1回あたり回復量19~22      倍率[$n]  実際の回復量 ポーション   07  133~ 154ポイント 寝袋       03   57~  66 テント      09  171~ 198 コテージ    FA 4750~5500 ケアル      04   76~  88 ケアルア    08  152~ 176 ケアルダ    10  304~ 352 ヒール      03   57~  66 ヒーラ      06  114~ 132 ラヒーラ     0A  190~ 220  設定時には、3つの[-]内の値を自由に変えて調整できます。 ===== □移動時アイテム&魔法ルーチンの改変  概要は上記のとおりです。  回復倍数指定用に0064、回復量用に006D-6Eの未使用メモリを使用しています。 *移動中ルーチンがかなりの長さになるので、何度かにわけていきたいと思います。  回復用のサブルーチンが分散しているので、全て適用してから動作確認をしてください。 ◎回復量を設定するアドレスや、ジャンプ先の変更設定などは、別項にまとめておきますのでそちらをご覧ください。 ===== □3B562~3B5CE  …回復量の算出を別の場所に移動させ、加算部分を2バイト化しています。 ☆役割  回復ルーチン   効果音を兼ねる        回復量用メモリ初期化 ☆範囲内にあるサブルーチンアドレス  全体回復: (変わらず)20 52 B5  単体回復: (変わらず)20 74 B5  効果音:        20 A7 B5 3B579~3B583 ○全体用の状態異常除外: 4人用です。単体用は回復前に判定しています。3B579~3B583では、下記カッコ内のジャンプ先だけが変わっています。3B562~3B578は変更しません。  BC 01 61 C0 01 F0 [4E] C0 02 F0 [4A] 3B584~ …ここから大幅に変更します。 ○回復量算出ルーチン: 移動中魔法内のサブルーチンに飛ばします。  20 C5 B0 ○加算ルーチン   :  現在HPに回復量を加算します。  18 7D 0A 61 90 05  FE 0B 61 90 21  9D 0A 61  BD 0B 61  18 65 6E 90 02 A9 FF 9D 0B 61 ○最大HP比較   :  3B5A2~  DD 0D 61 90 0D D0 08  BD 0A 61 DD 0C 61 90 03  20 8E B3 ○回復量用メモリ初期化: 誤作動防止です。  20 87 B3 ○効果音・処理終了  : 治療や回復で使いまわせるようになっています。  A9 57 85 4B  A9 30 8D 04 40  A9 7F 8D 05 40  A9 00 8D 06 40  8D 07 40 EA 60     ~3B5CE □3AF7F~3B0F3 ☆役割    移動中魔法用ルーチン          エスナ系処理(死亡以外を解除)          回復量算出 ☆範囲内にあるサブルーチンアドレス  死亡以外を解除  : 20 AB B0  回復量算出:      20 C5 B0  …移動中にかける魔法の大部分です。全て連続して記述してください。 3AF7F~3AFD4 ◎ケアル系  ○回復量指定:    順にケアル、ケアルア、ケアルダ、ケアルガです。ケアル系では、FFを指定するとHPが完全回復します。HPが全快でもかかります。  A9 04 D0 0A  A9 08 D0 06  A9 10 D0 02  A9 FF 85 64 ○画面表示~入力待ち  20 13 B4  A9 2B 20 3E B9 20 B3 B3 B0 27 ○状態異常除外  A5 62 6A 6A 6A 29 C0 AA BD 01 61  C9 01 F0 1B C9 02 F0 17 ○HP回復~終了  A5 64 C9 FF F0 17 20 74 B5 20 13 B4  A6 65 DE 00 63 20 26 B6 4C AA AE ○ブザーキャンセル  20 1A DB 4C 87 AF ○HP完全回復処理~終了  20 8E B3 20 A7 B5 4C A8 AF 3AFD5~3B001 ◎ヒール系  ○回復量指定:    順にヒール、ヒーラ、ラヒーラです。FFに特殊効果はありません。HPが全快でもかかります。  A9 03 D0 06  A9 06 D0 02  A9 0A 85 64 ○画面表示をポイゾナ他に合わせる(3AFE1~):   メッセージの一部を削除したほうが良いでしょう。 (※スクリーンの切り替え=HP表示を魔法使用前にすることができる)  20 13 B4 A9 2C 20 3E B9 20 38 B6 A5 20 29 80 F0 0D     *オリジナルの方がよろしければ、1行目を下記に差し替えてください。メッセージ変更が要りません。      …A9 2C 20 3E B9 20 3C C4 20 38 B6 ○回復  A5 64 20 52 B5 ○MP消費~終了  A6 65 DE 00 63 20 26 B6 4C AA AE 3B002~3B045 ◎レイズ系  ○回復量指定:    レイズ系の回復HPは固定値か全快の2択です。  A9 01 D0 02  A9 FF 85 64 ○画面表示~入力待ち  20 13 B4 A9 2E 20 3E B9 20 B3 B3 B0 20 ○死亡回復  A9 01 85 10 20 9B B3 B0 20 ○回復処理・レイズ  A5 64 C9 FF F0 14 9D 0A 61 ○MP消費~終了  A6 65 DE 00 63  20 A7 B5 20 13 B4 20 26 B6 4C AA AE ○回復処理・アレイズ  20 8E B3 4C 19 B0 ○ブザーキャンセル  20 1A DB 4C 02 B0 3B046~3B091 ◎ポイゾナ  ○画面表示~入力待ち  20 13 B4 A9 2D 20 3E B9 20 38 B6 ○誰も毒でなければかからない  A5 20 29 80 F0 38  A9 00 AA BD 01 61 C9 03 F0 0E  8A 18 69 40 C9 00 D0 F0  20 1A DB 4C 3E B0 ○全員の毒を治療  A9 03 85 10 A9 00 48 20 A2 B3 68  18 69 40 C9 00 D0 F4 ○MP消費  A6 65 DE 00 63 ○終了  20 13 B4 20 A7 B5 20 26 B6 4C AA AE 3B092~3B0D4 ◎ストナ(→エスナ)  ○画面表示~入力待ち  20 13 B4 A9 30 20 3E B9  20 B3 B3 B0 13 ○死亡以外を治療しに行く  20 AB B0 B0 11 ○MP消費~終了  A6 65 DE 00 63 20 A7 B5  20 13 B4 20 26 B6 4C AA AE ○ブザーキャンセル  20 1A DB 4C 8A B0 ○死亡以外を解除する:    対象が死亡でなければ状態を00にします。状態異常がない、もしくは死亡ならかからず、フラグをセットして戻ります。  A5 62 6A 6A 6A 29 C0 AA BD 01 61  F0 0B C9 01 F0 07 A9 00 9D 01 61 18 60 38 60 3B0D5~3B0F3 ◎回復量算出ルーチン:   HP回復処理全般で使うサブルーチンです。 ○回復用メモリ初期化  20 87 B3 ○乱数取得  A5 64 48 A5 F0 29 03 ○基礎回復値加算~保存  18 69 13 65 6D 90 02 E6 6E 85 6D  C6 64 D0 ED 68 85 64  A5 6D 60 ===== □3B2A7~3B31D ☆役割    セーブアイテム系ルーチン  …寝袋、テント、コテージのルーチンです。共有部分を作り、圧縮しています。他の部分で使うサブルーチンはありません。全て連続して記述します。  ポーション・毒消し・金の針の領域が連続して続きます。 3B2A7~3B2C0 ○場所チェックルーチン:    場所がフィールドでないと使用不可にするルーチンです。3つで共有しています。成功時にアイテム数を減らすのもここにまとめています。  48 A5 2D 4A B0 05  68 DE 36 60 60  68 20 3E B9 68 68 4C 5B B1 ○終了時共通  20 ED B2 4C 30 B1   3B2C1~3B2D3 ◎寝袋  ○場所チェック:  A2 00 A9 1B 20 97 B2 ○回復量指定~回復:   A9 [xx] 85 64の形です。[xx]が回復倍数です。  A9 03 85 64 20 52 B5 ○寝袋終了処理  A9 1A 4C AB B2 3B2D4~3B2E6 ◎テント:        寝袋と構造は同じです。  A2 01 A9 1D 20 97 B2  A9 09 85 64 20 52 B5  A9 1C 4C AB B2 3B2E7~3B2FC ◎コテージ:       MP回復があるのでやや長いです。  A2 02 A9 1F 20 97 B2  A9 FA 85 64 20 52 B5 ○MP回復  20 06 AC ○コテージ終了処理  A9 1E 4C AB B2 3B2FD~3B31D ◎セーブ処理:      セーブ処理の入力待ちなどを行う部分です。  20 3E B9 20 3C C4  20 38 B6 A5 20 29 80 D0 05  20 8C B7 18 60  A9 3F 20 3E B9 20 7C AB  20 26 B6 38 60 □3B31E~3B3AA ☆役割    ポーション+毒消し+金の針のルーチン          回復量用メモリ初期化          最大HP代入処理 ☆範囲内にあるサブルーチンアドレス   回復量用メモリ初期化: 20 87 B3   最大HP代入処理:    20 8E B3  …単体を選ぶアイテムの処理を一部共有化し、まとめて圧縮しています。全て連続して記述します。  アイテムルーチンの開始アドレスは、○ブザーキャンセルの後、○選択画面移動[A9 xx 20 0E B3]のあるアドレスです。 3B13E~3B338 ○対象選択画面:    HPやステータスの表示や、入力待ちの部分です。  48 20 13 B4 68  20 3E B9 20 B3 B3 B0 01 60  68 68 D0 06 ○終了時共通  20 13 B4 20 26 B6 4C 30 B1 3B339~3B360 ◎ポーション:     HPが全快でもかかります。 ○ブザーキャンセル  20 1A DB ○選択画面移動  A9 20 20 0E B3 ○状態異常除外  A5 62 6A 6A 6A 29 C0 AA BD 01 61  C9 01 F0 E9 C9 02 F0 E5 ○回復量指定~回復  A9 07 85 64 20 74 B5 ○アイテム減算と終了  CE 39 60 4C 20 B3 3B361~3B37A ◎毒消し ○ブザーキャンセル  20 1A DB ○選択画面移動  A9 21 20 0E B3 ○治療する状態異常指定~治療  A9 03 85 10 20 9B B3 B0 EF ○効果音・アイテム減算・終了  20 A7 B5 CE 3A 60 4C 20 B3 3B37B~3B394 ◎金の針 ○ブザーキャンセル  20 1A DB ○選択画面移動  A9 22 20 0E B3 ○治療する状態異常指定~治療  A9 02 85 10 20 9B B3 B0 EF ○効果音・アイテム減算・終了  20 A7 B5 CE 3B 60 4C 20 B3 3B395~3B3AA ○余り  EA EA ○回復量用メモリ初期化:    006D-6Eを初期化するルーチンです。  A9 00 85 6D 85 6E 60 ○最大HP代入処理:       完全回復処理と同義です。  BD 0C 61 9D 0A 61 BD 0D 61 9D 0B 61 60 ========== 設定アドレスについて □移動中アイテム・魔法の改変におけるアドレス・回復量の場所について ◎アドレスヘッダ (アイテム6種)3B1C6~3B1D1:  B1 B2 C4 B2 D7 B2 2C B3 54 B3 6E B3   …設定する場所は変わっていません。 (魔法)   …各移動中魔法のID設定場所のすぐ後ろにあります。 3AF21-22 ケアル  (4C) 6F AF→変わらず  …4Cは3AF20のコードです。以降全て4C zz-yyの形になっています。 3AF28-29 ケアルア 77 AF→ 73 AF 3AF2F-30 ケアルダ 7F AF→ 77 AF 3AF36-37 ケアルガ C0 AF→ 7B AF 3AF3D-3E ヒール   EF AF→ C5 AF 3AF44-45 ラヒーラ  01 B0→ CD AF 3AF4B-4C ヒーラ   F8 AF→ C9 AF 3AF52-53 ポイゾナ  90 B0→ 36 B0 3AF59-5A レイズ   2B B0→ F2 AF 3AF60-61 アレイズ  5A B0→ F6 AF 3AF67-68 テレポ   (変化なし) 3AF6E-6F ストナ   BA B0→ 82 B0  …→エスナ 3AF75-76 ダテレポ (変化なし) ◎回復量の指定  [ 固定回復量+乱数値(00~設定値) ] ×回復倍数n=実際の回復量です。  固定回復量+乱数の最大値が255未満になるようにしてください。  以下のカッコ内は投稿内容での設定値です。自由に変えることができます。 ○固定回復量: 3B0E1(13) ○乱数値  : 3B0DE(03)     *最大乱数を指定します。   *固定回復量との合計値がFFを超えないようにしてください。   *乱数は計算開始時の1回だけ取得され、残りは固定されます。   *ビット同士のand演算で絞るので、理想どおりの乱数が出ない場合もあります。例えば06を指定すると、奇数が出なくなります(下記注)。 (注)$06=2進数では「0110」です。一方、奇数は必ず「xxx1」となります。   and演算では、ビット同士を見て両方とも「1」であれば「1」を返します。それ以外は「0」を返します。   $06と奇数では、絶対に「1」を返さないので、奇数は答えにならない=乱数として選ばれないというわけです。  ○回復倍数n: アイテム・魔法ごとに指定します。A9 [xx]になっています。レイズだけは例外で固定回復です。 3AF80  ケアル (04) 3AF84  ケアルア(08) 3AF88  ケアルダ(10) 3AF8C  ケアルガ(FF)☆  …ケアル系とレイズ系ルーチンでは、設定値FFに独自の処理を持たせてあり、HPが完全回復します。                      FF以外を設定すると通常の回復量で計算します。 3AFD6  ヒール (03) 3AFDA  ヒーラ (06) 3AFDE  ラヒーラ(0A) 3B003  レイズ (01)☆  …レイズのみ固定値です。 3B007  アレイズ(FF)☆  …FFで完全回復します。それ以外では通常回復になります。 3B355  ポーション(07) 3B2C9  寝袋   (03) 3B2DC  テント  (09) 3B2EF  コテージ (FA) ◎治療する状態異常 ○ポイゾナ 3B05E、3B070 (03)  …両方を02にすると、全体の石化を解除します。 ○ストナ→エスナ  全体を書き直しましたので、エスナ以外の使い方はできません。  ストナに戻したい場合、下記のように書き換えてください。  オリジナルとほぼ同じです。 3B092~3B0D4  20 13 B4 A9 30 20 3E B9 20 B3 B3 B0 15  A9 02 85 10 20 9B B3 B0 0E  A6 65 DE 00 63  20 13 B4 20 A7 B5 20 26 B6 4C AA AE  20 1A DB 4C 8A B0  EA ×19 ○死亡以外を解除するルーチンについて(20 AB B0)  サブルーチンの形になっていますので、その気になればアイテムなどで流用することもできます。容量はありませんけれども(笑) ○毒消し 3B36A (03)  …毒です。 ○金の針 3B384 (02)  …石化です。 ~~~  あらためて見ると凄い長さになってしまっていますね…。  細かくわけているので、多少は見直しやすくなっているかと思いますが、それでもかなり大変でしょう。くれぐれも記述ミスに気をつけてください。  動作確認は十分に行っているつもりですが、予期せぬミスがあるかもしれません。もしバグなどありましたら、ご報告くださいませ。 ===  なお補足として……  戦闘中でのエスナは魔法威力(33031)[FE]で死亡以外を解除します。毒+石化だけなら[06]ですね。 ========== □回復時の連続操作でBGMが消えるバグについて ※↑の移動時魔法威力の変更を適用している場合の解決策  音楽データ更新のタイミング上、効果音(でろれらでろれら♪という感じの回復音)のルーチンだけでは、効果音中にキャンプ画面を抜けたとき、完全な更新にならないようです。 直接的な原因は、(Revisedで)キャンプの音楽を未使用にしているせいだったはずです。 …まあそのー、使用した効果音ルーチンへのジャンプを潰せば効果音は消えます。 あるいは、ぴろっ♪とかいう効果音(オリジナルの状態異常回復など)にする&戻せば、短いのでそういった問題は起こりにくくなりますよね。 毒消しなどの流用部分はジャンプを潰せば消えますが、HP回復時は消えません。なので、 3B5B7~BA: A9 57 85 4B→ 20 97 AD 60  とすると、「でろれらでろれら♪」→「ぴろっ♪」という効果音に変更されます(オリジナルの状態回復と同じです)。  なお、この変更により、3B5BB~3B5CD(19バイト)が未使用になります。 ※附録 魔法の設定個所 301F0-303EF くすりの設定個所 303F0-F 敵の特殊攻撃の設定個所 30400-304CF (設定の仕組みは魔法側と一緒) ==== 魔法データの持ち方の例 例:ストナ 30330~: ?? 02 ?? 10 08 xx xx 00    *順に………     命中追加値:(味方用魔法では使われません)     魔法威力 :02(石化)     属性   :(回復魔法などでは使われません)     対象   :味方1人=10(もしくは味方全体=08)     ルーチンナンバー:08(状態異常回復)     魔法アニメ:(任意です)     アニメ色 :(カラー変化適用の開始色:任意です)     区切り :00(読み込み終了サイン) 以下、さらなる高等拡張についてのまとめ ◆バンクの変わらない領域でさらに空きを確保◆ ◆バンク切り替えを利用して空き領域を活用◆  ↓ ◆作成した空き領域で武器・防具の所持数を拡張する◆ ◆作成した空き領域で移動時の処理を拡張する◆ ◆バンクの変わらない領域でさらに空きを確保する ※Revised限定   (戦闘用表示枠の削減&バトルウインドウカラー化が必須なため) □空き領域の追加について(共有部分)  戦闘用の枠についても調べてみました。もう消してある部分は要らないので、そこそこ空き領域を作れます。  以下はキャラグラフィック枠最下段の描画部です。    3F635: 60    3F636~3F64E: 空き領域(25バイト)    3F64F: 60(念のために残しておきましたが不要かも) (※これまでのところ、3F64FをEAにしての動作チェックでも大きな問題はなし)  同様に、最下段以外の敵味方の枠描画部分も削除できます。  味方用全体枠に必要な3F2F8~3F305を前に移動させ、さらに戦闘枠着色で潰した部分もあわせ、中抜きします。 3F2EC~:  まず、元3F2F8~3F305を切り取り、3F2EC~に貼り付けます。直後に4C 16 F3を記述。  A9 19 8D 38 00 A9 07 A2 07 A0 16 20 DA F3  4C 16 F3    …としてから、 3F378~3F381(EA×10)を切り取り、3F31C~(A2 23 A9 C0…)に直接貼り付けます。3F326~が A2 23 A9 C0…になれば成功です。3F2FD~3F325(41バイト)が空き領域になります。 完成図(3F2EC~3F381) A9 19 8D 38 00 A9 07 A2 07 A0 16 20 DA F3 4C 16 F3 EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA EA A2 23 A9 C0 20 B7 F3 A2 00 BD F8 F3 8D 07 20 E8 E0 40 D0 F5 A2 00 BD C0 03 9D 34 6D E8 E0 20 D0 F5 A9 0C 20 03 FE AD 8E 6D A0 04 20 69 F4 AD 8F 6D A0 08 20 69 F4 A9 20 A0 00 20 7D F3 A9 40 A0 04 20 7D F3 A9 60 A0 08 20 7D F3 A9 80 A0 0C 20 7D F3 20 00 FE A2 0F A9 F0 20 B7 F3  25+41バイト作れました。  使用時のアドレス指定は、例によって$30010を引いてください。この辺りは全てバンクの変わらない領域ですので、どのような用途でも使えます。  そうです、魔法ルーチンでもOKですb ◆バンク切り替えを利用して空き領域を活用◆ ◆『謎度MAXなデータ』について 1A5E2-1C00F の部分、使ってるのかどうかもわからない空き領域が・・・ 戦闘枠のデータ削減の話でついぞ思い出したのもあって、OPクレジット・地図表示・フィールド各地方での草原での戦闘・カオス撃破~EDクレジットあたりを(1A5E2-1C00F全てを00にして)一通りみてみましたが、どうもこれまでのところ問題はなさそうです。 で、もしここが使えるとなると約6700バイトという途方もない数字を稼ぎだすことが出来ます。 この部分なんですが、冷静にオリジナル版と比較してみたら、ここは“もともと未使用領域”のようです。というか、“オリジナル版でのマップ用の予備領域”だったというのが正解のようでした。(データ内容00が標準) 関連して念のためにご報告しておくと、1B000領域の近辺にあるデータ(10010以降~草原用のバトルBG直前:1C00Fまで)はどうもマップ用の領域です。 なので、1B000領域は完全に使って大丈夫な領域のようです。 == とりあえず$A5E2~$C00Fの範囲から1A5E2-1C00Fへ移動して戻ることはできそうです。元の位置がこの範囲にあれば、6700を丸ごと使うことができるでしょう! ◆6700ある空き領域を使うために  とりあえず汎用切り替えコードを作ってみました。[◆バンクの変わらない領域でさらに空きを確保する]で作った共通で使える空き領域を一部使用しています。どこからでも 1A5E2~1C00F へジャンプし、戻ってこれるようにしています。  まず、下準備をしておきます。 □切り替え下準備 ○共通領域・ジャンプルーチン 3F636($F626): とりあえずここに記述。このルーチン自体を移動させることはできますが、共通で使える領域にしてください。  A9 [AF] 48  A9 [FF] 48  A9 06 4C 03 FE   …上記のジャンプ先は1B010($B000)を指定しています。[AF][FF]の部分です。  このルーチンで1A5E2~1C00F内で個別にジャンプ先を指定します。入れる値は対象アドレス-1。入れる順番はアドレス上位→下位です。 ○1A5E2~1C00F内・指定ジャンプルーチン 1B010($B000):   8A 0A AA  BD [10 B0] 85 A6  BD [11 B0] 85 A7  6C A6 00   …個別のジャンプ先に分岐するためのルーチンです。  上記では1B020($B010)~にヘッダアドレスを記述し、ヘッダアドレスの場所へジャンプします。  [10 B0][11 B0]は、ヘッダアドレスを置く場所を示しています。最初のカッコはアドレスそのまま。次のカッコにはアドレス+1を書きます。  それぞれのルーチンで個別にヘッダアドレスの位置を指定し、このルーチンに来ます。 □1A5E2~1C00Fを使う … 以下の手順でルーチンを移設してください。 (1) 個別コード内で、移設したいルーチンの場所に以下のコードを記述。5バイトほど必要です。  A2 [xx]     …ヘッダアドレスの位置を指定します。  20 [26 F6]   …○共通領域・ジャンプルーチンのある場所にジャンプします。    …戻ってくるときは、[26 F6]の直後に復帰します。以降、元のルーチンを実行します。 (2)移設するルーチンを1A5E2~1C00F内に記述。   ☆移設するルーチンの末尾に以下を書き加えてください。  A9 [yy] 4C 03 FE   …[yy]で元のルーチンがあったバンクを指定し、復帰します。 (3)記述した1A5E2~1C00F内アドレスをヘッダアドレスとして、ヘッダアドレスの位置[xx]を決める。  ヘッダアドレスの位置[xx]は、00開始とし、移設ルーチンが増えるに従って01、02、03、04…のように増やしていけばOKです。  これだけでは何のことやらわからないかもしれません。実際に、ストライのルーチンを移設してみます。 ※※以降はRevisedのテスト版での魔法ルーチン変更に対しての記述 □ストライ移設 下準備 (1)個別コード内の記述 33999: ※通常魔法ルーチン側  A2 00      …ヘッダアドレス位置の指定。00を指定しています。   20 26 F6    …共通部切り替えルーチンへ移動。   4C 85 B8   …終了時処理、復帰時に実行します。   00 ~ 00(339A1~339CF)  …空き領域になります。 (2)移設するルーチンを1A5E2~1C00F内に記述。 ※拡張バンク側  元々あった33999~339CC(終了時4C 85 B8を除く)を、1B999~1B9CCへコピペし、末尾にA9 [0C] 4C 03 FEを加えます。  今回は、コピペしてもルーチン内のアドレスがずれないように、アドレスが同じになる場所に移しています。もちろん別の場所にして、ルーチン内のアドレスを書き換えても問題ありません。  末尾部[0C]は30010~3400Fを8000~BFFFにコールする指定値です。4C 03 FE後の60(rts) により、33999~内の4C 85 B8に復帰します。 (3)ヘッダアドレスを記述する。 ※拡張バンク側  ヘッダ位置00とし、○1A5E2~1C00F内・指定ジャンプルーチンの[10 B0]で指定してある1B020~に、1B999($B989)をアドレス指定します。 1B020-21: 89 B9 ※ヘッダNo:00 (拡張バンク領域側での増設ルーチン読み込み開始位置指定)   *位置指定が01なら1B022-23、以下同じ間隔です。  成功すれば、ストライのルーチンを好きなだけ拡張することができます。  ストライに限らず、$A5D2~$C00Fと範囲が異なるルーチンを移植したり、新規のルーチンを追加したりできます。もともとの範囲が異なる場合、ルーチン内アドレスを全て書き換える必要はありますが。 □切り替えの注意点  移設するルーチン内で、サブルーチンの指定があった場合、指定されたサブルーチンも同じように移設しなくてはいけません。  特殊なサブルーチンを使わない、味方にかける系統の魔法は、移植して構わないです。  ついでにルーチンNo.の直後のルーチンを後の方に移動できれば、魔法ルーチン自体を増やせそうですね。 (※ヘッダアドレス指定部の最後のあたりに空きを作れば、魔法ルーチン用のヘッダそのものを増やすことが可能、という事) ================ ※※実際の導入例 1B020-21: ヘッダNo:00 (※拡張バンク領域側での読み込み開始位置指定)  90 BF (1BFA0 □真0Dルーチン100バイト版の位置) == □真0Dルーチン ※拡張バンク側 (本体  71byte) 33831~32: zz yy(0Dルーチンのヘッダ) ※通常魔法ルーチン側 $yy-zz: A2 04 A5 91 C9 68 F0 14 以下 拡張バンク側に設置(1BFA0-1C003)  1B020-21:ヘッダNo:00 に対応 20 dd-dd F0 0A dd-dd:EE BF  A0 0C 20 bb-bb A0 0B 4C cc-cc bb-bb:DC BF cc-cc:E7 BF A0 0B 4C ee-ee ee-ee:D1 BF 20 dd-dd F0 15 dd-dd:EE BF  A0 20 20 bb-bb A0 09 91 90 A2 00 bb-bb:DC BF  A0 21 20 bb-bb A0 05 4C cc-cc bb-bb:DC BF cc-cc:E7 BF A0 09 20 aa-aa 91 90 A2 00 aa-aa:D7 BF  A0 05 $ee-ee: 20 aa-aa 4C cc-cc aa-aa:D7 BF cc-cc:E7 BF   *$ee-ee は本体に連続して記述 (サブルーチン部 計 27 byte) $aa-aa: B1 90 18 90 03 $bb-bb: B1 92 18 7D 70 68 90 02 A9 FF 60   加算部   *$aa-aa と$bb-bb はこの順番で連続して記述 $cc-cc: 91 90 4C 85 B8  終了時共通 ※4C 85 B8 → A9 [0C] 4C 03 FE 元のルーチンがあったバンクを指定し復帰 $dd-dd: AD 78 68 C9 01 60   重ねがけ判定部 == □1B000領域への単純移設だと敵のセーバーの効きがおかしくなる  ストライは他にまたがるサブルーチンは利用しておらず、てっきり1B000領域に移設できると考えていましたが、「重ねがけできない」設定下では敵味方それぞれの素体データをロードするように作ったのでした(すっかり忘れていました)。モンスターの素体データは戦闘用バンクに置いてあるため、1B000 領域からアクセスできていないというオチが…orz  移設後のテストでうまくいったと思っていたのは、どうやら偶然の産物だったようです。たまたまそれらしい値のあるアドレスをロードしてたっぽいですね。  不具合があるのは敵が使う場合+重ねがけできない設定にした場合のみ、であり、他の場合には問題はないわけですが…。  戦闘用バンクに戻すのは容量的に厳しいでしょうから、データ保存ルーチンと迂回ルーチンを作っておきます。 (1)まず戦闘用バンクで、ストライ系の魔法ルーチンテーブルジャンプ先を、このルーチンのあるアドレスにして、このルーチンから(ストライ用バンクジャンプの開始位置に)飛び直してください。  新規:   A0 0C B1 92 85 AF   4C [-- --] ※ストライ用バンクジャンプの開始位置を指定 (2)1B000領域に移設されたサブルーチンのジャンプ先と直前を変更し、ジャンプ先を変更してください。   A0 0C 20 [-- --]→ A5 AF 20 [-- --] ※ジャンプ先アドレス側は2バイト後ろに変更のこと([E8 BF]なら[EA BF]のようにする)  1B000領域のままでいく場合、これが最善のような気配ですね。 ================ 魔法ルーチンでのバンク切り替え予備知識 Q:ダメージ魔法(01)+乱数拡張と回復魔法ルーチン(07)・ケアルガ(0F)の方を6700側に持っていって、真0Dルーチンの方を元の魔法ルーチン側に置いてやるようなことはできるのでしょうか? A:残念ですが不可能です。ダメージ魔法ルーチンや回復魔法ルーチンで使うサブルーチンの一部、および乱数制御などは、魔法ルーチン以外でも使用しており、また非常に多くのサブルーチンを経由しますが、その全てを丸ごとコピー(移設では他のルーチンで不具合が生じますので)するのは現実的ではなく、また、容量の面でも動作の面でも効率が悪いからです。  ちなみに、問題なく移設できるルーチンは、ストライ(0D)のように、他のサブルーチンを使わないルーチンです。例えばプロテス系やインビジ系のようなものですね。 ================ □魔法ルーチンの移設について  魔法ルーチンの移設についてですが、一部の移設可能なルーチンを1ヶ所にまとめて処理するとジャンプ元が1つで済むので楽ではないかと考えました。移設に適したルーチンは、サブルーチンをともなわないものとなりますが、分岐ルーチンが冒頭に置いてあるものであれば、後半だけを送り込むこともできます。  移設するルーチンは以下の通りです。   フィアー   プロテス系   属性防御付与系   ストライ系(ジャンプ元を削除)   シェイプ系   インビジ系  なお目下のところ支障がないため、さしあたり歯抜けの状態としておきます。空き領域を統合されるのも良いでしょう。統合の際は、統合のために移動したルーチンのジャンプ元について、ジャンプ先アドレスを全て変更してください。  以下は実際の手順になります。 ○移設部分を削除する  以下を全て00にし、利用可能な領域とします。 ※※下記アドレスはリバイズドの発展途上版でのルーチンアドレス=魔法ルーチンの書き換え状況に応じ適宜対応のこと 339C8~CF: ストライ系 A2 10 20 26 F6 4C 85 B8(8バイト) 33A31~40: プロテス系 AD 7F 68 6D 74 68 90 02 A9 FF 8D 7F 68 4C 85 B8(16バイト) 33A41~4C: 属性防御系 AD 74 68 0D 77 68 8D 77 68 4C 85 B8(12バイト・連続) 33A5B~6F: シェイプ系 20 FD B9 AD 85 68 38 ED 74 68 B0 02 A9 00 8D 85 68 20 85 B8 60(21バイト) 33A83~92: インビジ系 AD 85 68 6D 74 68 90 02 A9 FF 8D 85 68 4C 85 B8(16バイト) ○ジャンプ元を統合する  ジャンプ先を変更し、ジャンプ元ルーチンを全て統合します。  耐性除外、状態異常一時判定、ストレートにジャンプ、の3パターンがあります。 ※※下記アドレスはリバイズドの発展途上版でのルーチンアドレス=魔法ルーチンの書き換え状況に応じ適宜対応のこと 33821-22  フィアー   :65 B9=そのまま(耐性除外) 33829-2A  プロテス系 :6B B9(ジャンプ) 3382B-2C 属性防御系:6B B9(ジャンプ) 33831-32  ストライ系 :6B B9(ジャンプ) 33833-34  シェイプ系 :68 B9(一次判定) 33837-38  インビジ系 :6B B9(ジャンプ) ○フィアーを共通ジャンプ元として書き換える  各ルーチンのジャンプ先をここへ統合します。  もともと耐性除外、および状態異常一時判定は、失敗するとそのまま魔法ルーチン自体を終了するように作っています。そのため、失敗時の分岐部は不要です。 ※※下記アドレスはリバイズドの発展途上版でのルーチンアドレス=魔法ルーチンの書き換え状況に応じ適宜対応のこと 33975~3398B: ($B965)20 AB BA …耐性除外 ($B968)20 FD B9 …状態異常一次判定 ($B96B)A2 [任意] 20 26 F6 4C 85 B8 …ジャンプと終了  00 00 00 00 00 00 00 00 00   …ここも再利用可能です(9バイト)。 ○1B000領域に分岐ルーチンを作成   いちおう後々の拡張性を考えた形にしてあります。   ストライのジャンプ元を潰しますので、1B000領域の大元分岐にはストライのジャンプ用バイト(任意=例:10)を使うと良いでしょう。  AD 6E 68  C9 05 D0 03 4C [AA-AA]  …フィアー  C9 09 D0 03 4C [BB-BB]  …プロテス系  C9 0A D0 03 4C [CC-CC]  …属性防御系  C9 0D D0 03 4C [DD-DD]  …ストライ系(本体は書き換え不要です。直接ジャンプしてください)  C9 0E D0 03 4C [EE-EE]  …シェイプ系  C9 10 D0 03 4C [FF-FF]   …インビジ系 (終了部)  A9 0C 4C 03 FE ○1B000領域に各ルーチンの本体を記述   各ルーチンの成功時の記述を行います。ストライ系はそのままストライ系を記述した部分へジャンプさせます。ストライ系以外の各末尾に分岐ルーチン終了部へのジャンプを忘れずに仕込みます。 [AA-AA]:フィアー  AD 7E 68 38 ED 74 68 B0 02 A9 00 8D 7E 68  4C [nn-nn] …上記終了部へのジャンプです。以降同じです。 [BB-BB]:プロテス系  AD 7F 68 6D 74 68 90 02 A9 FF 8D 7F 68  4C [nn-nn] [CC-CC]:属性防御系  AD 74 68 0D 77 68 8D 77 68  4C [nn-nn] [DD-DD]:ストライ系 →書き換え不要です。 [EE-EE]:シェイプ系  AD 85 68 38 ED 74 68 B0 02 A9 00 8D 85 68  4C [nn-nn] [FF-FF]:インビジ系  AD 85 68 6D 74 68 90 02 A9 FF 8D 85 68  4C [nn-nn]  1B000領域では、分岐と本体(ストライを除く)で新たに128バイトほど使うはずです。  作成できる空き領域は合計で82バイトほどあります。仕様はほぼ確定していますので、微修正程度なら十分ではないでしょうか? ◆武器と防具の所持数を拡張する(ストッカーを作る)◆ ●予備知識  実はFF1のメモリには、予想以上に未使用領域があるようです。武器と防具に関しては、荷物という形でストッカーを作ることができます。ID関係の問題で、武器と防具で同じストッカーは作れないのですが、あちこち差し障りのない範囲でだいたい10~12個ずつまで。  表示側では、装備の入れ替えや、武器・防具の画面表示を個人化することはできます。  スプライトの表示は可能。ただ最初に画面を描画するときだけ表示コードをアイテムなどと共有しており、わずかに遅れるのを改善できていません。その代わり、数値反映を1人化したため、数値反映のもたつきはクリアされています。  ストックはこの画面でしか操作できないようになっています。 ===== ◆ストッカーの導入(1) 装備動作の改変(1)  例によって長いです。バックアップを取りつつ、たびたび休みを入れながら、じっくりやっていってください。 □ストッカーの導入について ○notice!  1A5E2-1C00Fの空き領域を度々利用しています(文中では便宜上「1B000領域」と呼称します)。1B000領域は[任意a]のような形で記述しております。自由に記述していってください。その他のアドレスやヘッダについても、お好みで値を変更したり、アドレスを移動して良いものは[ ]でくくってあります。  この後、  (1)装備動作の改変  (2)装備画面構成の改変  (3)宝箱の保存先を変更  (4)ショップの機能をストッカーを含めた形で改善  の4段階にわけて改変していきます。今回、文章量の削減のために詳細な説明を書いていない部分がありますが、動作内容は見出しでわかるようにしてあります。ご了承ください。部分ごとの記述にかかるバイト数を付記しておりますので、そちらもご活用ください。  各種改変において一部メモリを他の改変と共用していますが、いずれも問題はありません。 ">装備動作の改変" ○動作一覧 「武器(防具)コマンド」→キャラクター選択に移行します。キャラクターを選ぶと個人用の装備画面が展開されます。 「コマンド選択」→Aボタンで各コマンドに分岐します。Bボタンで4人ステータス表示・4人用コマンド選択に戻ります。 「装備コマンド」→装備・交換・捨てるを一手に行うコマンドです。  装備 …上4つのアイテムで2度Aボタンを押すと、そのアイテムを装備/装備解除します。それ以外ではブザーを鳴らしてアイテム選択に戻ります。  交換 …アイテムの場所を変更します。装備していると解除されます。  捨てる…最下行を選んだカーソルがあると、もう片方のアイテムを消去します。 「次コマンド」→表示キャラクターを並び順の次のキャラクターに送ります。 「武器or防具コマンド」→武器なら防具表示、防具なら武器表示に切り替えます。 「前コマンド」→表示キャラクターを並び順の前のキャラクターに送ります。 □最初の初期化、最後のデータ反映を潰す 3BB03: →EA EA EA(潰し済み) 3BB37: →4C 4F EE(変更) 3BEBE~3BEC6: EA×9(未使用になります) □0300~030Fへのロードを調整 ○3BDC0($BDB0)~3BDEA: A2 [任意a] 20 26 F6 60  EA×37(後々使います) ○1B000領域ヘッダアドレス: [任意a] ○ロードルーチン本体 1B000領域a(52バイト)  20 [AA-AA]        …対象者IDを個人データIDに変換するサブルーチンへジャンプ  A9 61 85 A1  A0 00 B1 A0 99 00 03 C8 C0 04 D0 F6  A5 66 C9 18 D0 04 A9 AC D0 02 A9 BC 85 A0 85 A5  C6 A1 B1 A0 99 00 03 C8 C0 10 D0 F6  A9 0E 4C 03 FE ◎対象者IDを個人データIDに変換(サブルーチン) $AA-AA・1B000領域(17バイト)  A5 A4 6A 6A 6A 29 C0 85 A3  18 65 66 85 A2 85 A0 60     ☆「◎対象者IDを個人データIDに変換」するサブルーチンは、ショップの改変でも使います。このルーチンのあるアドレス(上記$AA-AA)を控えておいてください。 □0300~030Fからのリターンを調整 ○リターンルーチンへのジャンプ先変更 3BB31: 20 DB BD →20 [B6] BD ○リターンルーチン本体へジャンプ 3BDC6($BDB6)~3BDCB: A2 [任意b] 20 26 F6 60 ○1B000領域ヘッダアドレス: [任意b] ○リターンルーチン本体 1B000領域b(39バイト)  A5 A2 85 A0  E6 A1  A0 00 B9 00 03 91 A0 C8 C0 04 D0 F6  A5 A5 85 A0  C6 A1  B9 00 03 91 A0 C8 C0 10 D0 F6  A9 0E 4C 03 FE ○追加される空き領域 3BDEB~3BE15: EA×43(後々使います) □4人画面で装備者選択を追加する(22バイト)  3BDCC($BDBC)~3BDE2:  85 A4 20 84 AE  90 05 68 68 4C 79 AE  A5 A4 A6 62 86 A4 20 DD BA 60 3AE6C~3AE6E: 20 DD BA →20 [BC BD] 3AE78~3AE7A: 20 DD BA →20 [BC BD] □装備値初期化を個人用にする  いったん、 3EE36~3EE3F: A6 A2 A5 A3 85 17 EA EA EA EA 3EE63~3EE71: EA×9+ A9 0E 4C 03 FE  …とし、2ヶ所合計13バイトのEAを切り取り、上記4C 03 FEの後ろにまとめておきます。→EA をバンク共通の空き領域として使えます。  ☆まとめた後、A9 0E 4C 03 FEが3EE5F($EE4F)~3EE63にあることを確認してください。 (変更後完成図…3EE36~3EE71)            A6 A2 A5 A3 85 17 BD 00 61 10   03 20 61 EE BD 01 61 10 03 20 61 EE BD 02 61 10   03 20 61 EE BD 03 61 10 03 20 61 EE 20 46 EF A9   0E 4C 03 FE 00 00 00 00 00 00 00 00 00 00 00 00   00  さらに、以下を変更します。 3EE9C-9D: A6 61→ A6 A2 3EEB7-B8: A6 61→ A6 A2 □装備値反映を個人用にする 3EEBF~3EEC8: A6 A2 A5 A3 85 17 EA EA EA EA 3EEEC~3EEF9: EA×9+ A9 0E 4C 03 FE     *このあと、2ヶ所合計13バイトのEAを切り取り、上記4C 03 FEの後ろにまとめておくと、EAをバンク共通の空き容量として使うことができます。  さらに以下を変更します。 3EF25-26: A6 61→ A6 A2 3EF53-54: A6 61→ A6 A2  □装備ID反映~装備反映~ステータス値描画~共通描画部の調整 3B524($B514)~3B532: 20 21 BB 20 AA EE 20 [3D BE☆] 20 69 ED 60 EA EA   ☆注意!…3B52Bの[3D BE☆]は攻撃力・防御力の数値を画面に表示するルーチンです。確認用に上記のアドレスを指定していますが、装備画面の調整後には記述を変えますので、覚えておいてください。(20 [F0 BD]になります) ===== ◆ストッカーの導入(2) 装備動作の改変(2) □「コマンド」実行ルーチンの改変  仕様をがらりと変えるべく 3BB3D~3BC2Cの240バイトをほぼ一新します。3BB3D~3BC2Cの範囲を 00 などで埋めておくと改変しやすいかと思います。 ○コマンド分岐部(30バイト) 3BB3D~3BB5A:  A9 00 85 62 85 63  A5 64 D0 03 4C 4B BB  C9 01 D0 03 4C F3 BB  C9 02 D0 03 4C 08 BC  4C DE BB ○装備・一次カーソル(24バイト) 3BB5B($BB4B)~3BB72:  20 [3C C4☆] 20 C8 BE 20 0C BD   注意!…3BB5Cの[3C C4☆]はスプライト制御ルーチンです。装備画面の調整後に記述を変えますので覚えておいてください。(20 [E0 BD]になります)  A5 24 D0 0B  A5 25 D0 06  20 81 BD 4C 4B BB 60  ○装備・二次カーソル(27バイト) 3BB73~3BB8D:  A5 62 85 63 20 [3C C4☆]   注意!…3BB5Cの[3C C4☆]はスプライト制御ルーチンです。装備画面の調整後に記述を変えますので覚えておいてください。(20 [E0 BD]になります)  20 B7 BE 20 0C BD  A5 24 D0 0A  A5 25 D0 D3  20 81 BD 4C 67 BB ○装備コマンド・分岐と装備(46バイト) 3BB8E~3BBBB:  20 21 EE  A6 62 E4 63 D0 25  BD 00 03 F0 17  30 05 20 1D BC B0 10  A6 62 BD 00 03 49 80 9D 00 03  20 14 B5 4C 4B BB  20 1A DB 20 AA EE 4C 4B BB ○装備コマンド・分岐と交換(36バイト) 3BBBC~3BBDF:  A4 63 C0 0E B0 1E E0 0E B0 1A  BD 00 03 85 10  B9 00 03 29 7F 9D 00 03  A5 10 29 7F 99 00 03  20 14 B5 4C 4B BB ○装備コマンド・捨てる(14バイト) 3BBE0~3BBED:  A9 00 9D 00 03 99 00 03  20 14 B5 4C 4B BB ○「まえ」コマンド(21バイト) 3BBEE~3BC02:  C6 A4 A5 A4 C9 FF D0 02 A9 03 85 62 85 A4  68 68 A5 66 4C DD BA ○「つぎ」コマンド(21バイト) 3BC03($BBF3)~3BC17:  E6 A4 A5 A4 C9 04 D0 02 A9 00 85 62 85 A4  68 68 A5 66 4C DD BA ○「武器or防具」切り替えコマンド(19+余り2バイト) 3BC18~3BC2C:  68 68 A5 66 C9 18 F0 04 A9 18  D0 02 A9 1C 85 66 4C DD BA  EA EA(余りです) □コマンドの着色部を潰す  オリジナルで、選択したコマンドを赤く着色していたルーチンです。Revisedでは無意味なので、潰してサブルーチンを記述します。 3BD24~3BD26: 20 0A BF→ EA EA EA 3BF17~3BF50: ひとまずEA×58 □コマンドカーソルを拡大する+カーソル位置の調整 3BD7C~7D: C9 03→ C9 04      …カーソル最大範囲です。 3BD8C~7D: A9 02→ A9 03      …カーソル位置の最大値です。 3BF0B~3BE0D: BD 07 BF(変更なし)  …カーソル位置ロード部です。 3BF17($BF07)~3BF1A: [50 78 98 C0]  …カーソル横位置の設定値です。 □装備欄以外のアイテムを装備不可にする 3BC35~3BC3A: 20 [0B BF] A5 A3 EA 3BF1B($BF0B)~3BF21 : C9 04 90 02 68 68 60 ">ここまで装備動作の改変"  動作確認をしておかれると良いと思います。画面変更していなければ、1人目の持ち物が選択キャラクターの所持品で、2人目~4人目の1行目までがストッカー、4人目の2行目が「捨てる」になっています。2人目~4人目のアイテムは装備できないはずです。上部コマンド位置はカーソル左から「装備・次・切り替え・前」となります。  買い物はショップにストッカーの導入をしてから行ってください。 □(おまけ)カーソルを一次選択の位置に戻す  テストプレイ中にふと思いついた付け足しです。上記ではカーソルが二次選択の位置に戻るようになりますが、一次選択の位置に戻ったほうが使いやすいかもしれないと思ったので。  なお、付け足しだけに、泥縄式の記述になっています。全て片付いたあと、まだ空いているところに記述してください。 (適当な空き領域) 3BB8E~: 20 21 EE→ 20 [zz-yy↓下記] $yy-zz=適当な空き領域:(13バイト)  A5 62 48 A5 63 85 62 68 85 63 4C 21 EE (あるいは1B000領域を利用) 3BB8E~: 20 21 EE→ 20 [zz-yy↓下記] $yy-zz=適当な空き領域:(8バイト)  A2 [任意z] 20 26 F6 4C 21 EE 1B000領域z:(15バイト)  A5 62 48 A5 63 85 62 68 85 63 A9 0E 4C 03 FE ===== ◆ストッカーの導入(3) 装備画面構成の改変(1) ">装備画面構成の改変"  動作改変に合わせ、装備画面も一新します。主な変更点は、個人用にする・キャラクタースプライトの表示・上部コマンドの追加・表示ステータスの拡大です。位置設定などはサンプルです。基本的に自由にしていただいて構いません。サンプルでは管理人様に提示していただいた画像をほぼ踏襲しています。ありがとうございました。 □表示文字の改変(サンプル)   38510~でヘッダ登録をします。26、34以降は続き番号です。 ○内訳  ID26:アドレス3855C~  ストッカー用「すてる」の文字またはマーク  ID27:  (27:ゴミバコマーク用予備)  ID28: ステータス用「こうげき…(01)めいちゅう…」の文字  ID34:アドレス38578~  見出し・コマンド用「ぶき」の文字  ID35: コマンド用「そうび つぎ (空き) 前」の文字  ID36: 名前1  ID37: 名前2  ID38: 名前3  ID39: 名前4  ID3A: ステータス値用1と「ぼうぎょ…(01)かいひ …」の文字  ID3B: 同上2  ID3C: 同上3  ID3D: 同上4  ID3E: 見出し・コマンド用「ぼうぐ」の文字 ○文字設定の変更をする  さしあたりヘッダとコードを以下のように記述して試してみてください。     ヘッダ サンプルで記述したアドレス先     ↓   ↓      ↓文字設定コード ID26: 1E BF 3BF2E  96 9C B2 00 ID27: (予備) ID28: A8 8C 38CB8  93 8C 4B 90 FF C3 01 AB 8B 9A 7E 8C C3 00 (以下34~3E) ID34: 66 8C 38C76  FF 59 90 00 ID35: 6A 8C 38C7A  FF FF 98 8C 58 FF FF 9B 49 FF FF FF FF FF FF FF A8 8D 00 ID36: BD 8C 38CCD  FF 10 00 00 ID37: 12 BF 3BF22  FF 11 00 00 ID38: 16 BF 3BF26  FF 12 00 00 ID39: 1A BF 3BF2A  FF 13 00 00 ID3A: B8 84 384C8  10 3C FF FF 5B 8C 49 7F C3 10 3E 01 10 3D FF FF 8F 8B A4 FF C3 10 3F 00 ID3B: D0 84 384E0  11 3C FF FF 5B 8C 49 7F C3 11 3E 01 11 3D FF FF 8F 8B A4 FF C3 11 3F 00 ID3C: E8 84 384F8  12 3C FF FF 5B 8C 49 7F C3 12 3E 01 12 3D FF FF 8F 8B A4 FF C3 12 3F 00 ID3D: 90 8C 38CA0  13 3C FF FF 5B 8C 49 7F C3 13 3E 01 13 3D FF FF 8F 8B A4 FF C3 13 3F 00 ID3E: 7E 8C 38C8E  FF 5B 8C 4A 00 □下準備  この時点で、装備画面描画ルーチン(3BE16~3BEBD)の前に空き領域が52バイト作られています。さらに装備動作の改変により、後方 3BEAC~3BEC6の27バイトも未使用になります。ここに来るためのジャンプ先アドレスを変えれば、それだけ広く装備画面描画に使うことができます。余れば文字設定に回せます。  改変前に、3BDE2~3BEC6の229バイトを 00などで埋めておくと改変しやすいと思います。 ○記述の順番について  サンプルではキリの良いところからこの容量を使い、改変がしやすいようにしています。合わせて 3BDE2~3BDEFには後で少しサブルーチンを入れています。 (1)3BDF0($BDE0)~3BDFF: キャラクタースプライト用サブルーチン (2)3BE00($F0BD)~3BE10: ステータス値の描画用サブルーチン (3)3BE11($BE01)~3BE42: 枠描画用サブルーチン+設定値 (4)3BE43($BE33)~   : 本体 (5)+余り        : 各種設定用余白  これを受けて、 ○サブルーチン先変更 (1)ジャンプ元(ここに来るためのジャンプ先アドレスを変更します) 3BAFD~: 20 06 BE→ 20 [33 BE] (2)キャラクタースプライト用サブルーチン 3BB14~: 20 [3C C4]→ 20 [E0 BD] 3BB5B~: 20 [3C C4☆]→ 20 [E0 BD] 3BB77~: 20 [3C C4☆]→ 20 [E0 BD]  ☆印は装備動作の改変で触れていた部分です。装備画面の調整の後、3BB5C・3BB78にあるスプライト制御を変更してください。 (3)ステータス値描画用サブルーチン(3B524~3B530内ジャンプ先指定) 3B52A~: 20 [3D BE☆]→ 20 [F0 BD]  ☆印は装備動作の改変で触れていた部分です。装備画面の調整の後、3B52Bにあるジャンプ先を変更してください。 ○未使用メッセージの確保のために 3B4FA~3B508: EA×15   ☆個人ステータス描画の一部です。Revisedでは事実上使われていませんが、放置すると色化けを起こします。 □枠と文字位置の指定 ○キャラクタースプライト用サブルーチン(16バイト) 3BDF0($BDE0)~3BDFF:  20 3C C4  A9 [24] 85 40    …キャラクターの横の位置です。  A9 [34] 85 41     …縦の位置です。  A5 A3 4C 8C EC ○ステータス値描画用サブルーチン(17バイト)    3BE00($BDF0)~3BE10:  A9 [0F] 85 3A     …ステータス値の横の位置です。  A9 [06] 85 3B     …縦の位置です。  A9 [3A] 18 65 A4 20 4B B9 60    …[メッセージID]+対象者IDが最終的な使用IDになります。 ○枠描画用サブルーチン(30バイト) 3BE11($BE01)~3BE2E:  0A 0A AA BD 1F BE 85 38  BD 20 BE 85 39  BD 21 BE 85 3C  BD 22 BE 85 3D  A9 0E 85 57 4C F2 E0 ○枠用設定値(20バイト) 3BE2F~3BE42:  01 0D 1E 10      …ストッカー  01 04 1E 0B      …装備・ステータス欄  09 01 16 04      …コマンド枠  01 01 09 04      …名前枠  EA EA EA EA      …予備を1個分作っています。    ☆下に描かれる枠が先に来ています。 ※○未使用メッセージの確保 3B4FA~3B508: EA×15 の個所について  EAではなく 00(00×15) にするとステータス画面の表示時にフリーズします。  確か通常ステータス画面か何かの描画の一部でして、ぶっちゃけ面倒臭かったので(笑)整理せずに、EAで潰すだけに留めておいたのです。00にするとブレークがかかるのでフリーズします。  自由に使えるスペースではないということですね。 ===== ◆ストッカーの導入(4) 装備画面構成の改変(2) □本体  基本的に改変自由ですが、IDや位置設定は[ ]を付けて強調しています。 3BE43($BE33)~3BEC6: ○準備(3バイト)  20 02 9C ○ストッカー、装備・ステータス欄(10バイト)  A9 00 20 01 BE  A9 01 20 01 BE ○「攻撃…(01)命中…」の文字表記(13バイト)  A9 [09] 85 3A     …「こうげき」などの横の位置です。  A9 [06] 85 3B     …縦の位置です。  A9 [28] 20 4B B9   …メッセージIDです。 ○コマンド枠(10バイト)  A9 02 20 01 BE  A9 [35] 20 4B B9   …メッセージIDです。 ○名前枠(13バイト)  A9 03 20 01 BE  A9 [36] 18 65 A4   …[メッセージID]+対象者IDが最終的な使用IDになります。選んだキャラクターの名前を表示するためです。  20 4B B9 ○「捨てる」の文字(13バイト)  A9 [15] 85 3A      …「すてる」の横の位置です。  A9 [1B] 85 3B      …縦の位置です。  A9 [26] 20 4B B9    …メッセージIDです。 ○「捨てる」拡大用余白(7バイト)  EA EA EA EA EA EA EA …ゴミバコマーク記述に使ってください。 (C6 3B A9 [27] 20 4B B9  …マーク記述時のコード)    ☆ゴミバコ下半分がID26、上半分がID27で、これらを接合します。 ○「武器」or「防具」の文字・見出し側(21バイト)  A9 [02] 85 3A     …見出し側「ぶき」の横の位置です。  A9 [0B] 85 3B     …縦の位置です。  A9 [34] A6 66 E0 18 F0 02 A9 [3E]   …メッセージIDです。  20 4B B9 ○「武器」or「防具」の文字・コマンド側(21バイト)  ☆選択コマンド側です。  A9 [14] 85 3A     …横の位置です。  A9 [03] 85 3B     …縦の位置です。  A9 [34] A6 66 E0 18 D0 02 A9 [3E]   …メッセージIDです。  20 4B B9    ☆見出し側とコマンド側で、表示が逆になるようにしています。 ○終了部(3バイト)  4C [F0 BD] EA×18(~3BEC6)     …ステータス値描画用サブルーチンへジャンプします。 □カーソル位置の調整   「捨てる」は最下部2つを割り当てていますので、カーソル位置を同じにしています。 3BEE9~3BF08: 40 58 90 58 40 68 90 68 20 80 88 80 20 90 88 90 20 A0 88 A0 20 B0 88 B0 20 C0 88 C0 98 D8 98 D8 □武器・防具名の位置調整   「捨てる」の文字にかぶらないように、最下部2つは左下隅に寄せています。 3EE11~3EE30:  0A 0B 14 0B 0A 0D 14 0D 04 10 11 10 04 12 11 12 04 14 11 14 04 16 11 16 04 18 11 18 04 1B 04 1B ">ここまで画面構成の改変"  仕上がりを確認してみてください。 □(おまけ1)「武器」or「防具」の文字・見出し側の着色  左にぽつんと離れた「武器or防具」の文字を着色します。パレットセット01の4番目を変えるとその色になります。3ADA2=2AにしておくとFF3のHPな色に。 ○着色部: 本体の○終了部の直前にでも記述してください。例えば以下のようになります。 3BEB2~3BEC0(~3BEC3):(15バイト(~+終了部3バイト))  A9 [D0] 20 41 BF  …サンプルにおける「武器」の文字位置。属性テーブルを23C0→23D0に変えています。  A9 7F 8D 07 20  A9 DF 8D 07 20  (4C F0 BD)    …終了部です。 □(おまけ2)選択コマンドの着色  オリジナルと同じように、現在選択している上部コマンドだけを着色します。上部コマンドが詰まっているので、見づらいと思ったら試してみてください。多分問題ないとは思いますが…。同じくパレットセット01の4番目を変えるとその色になります。 3BD24~3BD26: 20 [22 BF]   …装備動作改変の□コマンドの着色部で潰したところです。 3BF32~3BF41:(16バイト)  A5 64 0A 0A AA A9 [C3] 20 41 BF  A2 [任意c] 20 26 F6 60 1B000領域c: $yy-zz(1B000付近):(43バイト)  A5 64 0A 0A AA  BD [(bb+00)]-aa 8D 07 20  …カッコ内はaa-bbのアドレスに00~03を足してください。  BD [(bb+01)]-aa 8D 07 20  BD [(bb+02)]-aa 8D 07 20  BD [(bb+03)]-aa 8D 07 20  A9 00 8D 06 20 8D 06 20  A9 0E 4C 03 FE $aa-bb(1B000付近):(16バイト)  5F FF FF FF     …属性テーブル設定値です。  FF 5F FF FF  FF FF 5F FF  FF FF FF 5F ===== ◆ストッカーの導入(5) 宝箱入手先の変更について ">宝箱のアイテム保存先を変更する"  ストッカーに保存できるようにします。 □ver.A「ストッカーへ保存」  宝箱をストッカーへ保存するようにします。ストッカーがいっぱいなら拾得できません。11個以上だとアイテムを持たせる操作が発生しますが、一方で拾得先がバラけることがないので分かりやすく、容量を追加せずに済む点でも優れています。ver.Bと比べて一長一短といったところですね。 3DE43: 61→ 60 3DDC2: 61→ 60 3DDC7: 10→ 0A 3DDD4: 61→ 60 3DDD9: 10→ 0A 3DDDF~3DDFE: ロードアドレス(32バイト・ただし10個用なので00の12バイトは使われません)  B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 00 00 00 00 00 00  C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 00 00 00 00 00 00 □ver.B「ストッカーとキャラクター所持品へ保存」  「ストッカー」→「並び順に応じたキャラクターの所持品」の順で対応する全ての空きを検索します。ストッカー側がいっぱいのとき拾得者を探すのが面倒かもしれません。  1B000領域を130バイト程度使います。引き換えに、全共有できる空き容量を68バイトほど確保してあります。ver.A の改変内容は全て潰れるか上書きされます。 3DDBB~3DDFE: EA×68バイト(未使用になります) 3DE31~3DE70:(64バイト)  C9 6C 90 09 20 48 ED 20 61 DE 4C 4C DE  85 10 AA A9 00 85 A2  8A C9 44 90 02 E6 A2  A2 [任意d] 20 26 F6  A5 A2 4A F0 17 A0 00 A5 10 91 A0  A6 45 BD 00 62 09 04 9D 00 62 E6 7D E6 7D  A9 F0 60  A9 F1 60 EA×1   以降、$AA-AA~$EE-EE はそれぞれのアドレスに対応します。 1B000領域ヘッダ:[任意d($AA-AA)] 1B000領域d(合計131バイト): $AA-AA: 基幹部(8バイト)  …本体をサブルーチン化し、戻りをまとめておきます。  20 [DD-DD] A9 0E 4C 03 FE $BB-BB: 所持品ID化用減算値(2バイト)   1B 43 $CC-CC: ロードアドレス(キャラクター用・32バイト)  18 19 1A 1B 58 59 5A 5B 98 99 9A 9B D8 D9 DA DB  1C 1D 1E 1F 5C 5D 5E 5F 9C 9D 9E 9F DC DD DE DF $DD-DD: 本体(82バイト)  A5 10 A4 A2 38 F9 [BB-BB] 85 10  A9 B0 85 A0 A9 60 85 A1  A5 A2 F0 04 A9 C0 85 A0  A0 00 B1 A0 F0 2C C8 C0 0A 90 F7  A0 00 98 85 A0 A5 A2 F0 02 A0 10  BE [CC-CC] BD 00 61 F0 0A E6 A0 C8 A5 A0 C9 10 90 EF 60 8A 85 A0 A9 61 85 A1 4C [EE-EE] 98 18 65 A0 85 A0 $EE-EE: 空きがあるときの終了部(7バイト・$DD-DDに連続して記述してください) A5 A2 09 02 85 A2 60  ここまで宝箱の保存先の変更です。  手近な宝箱で動作を確認してみてください。 ===== ◆ストッカーの導入(6) ショップの機能を強化する(1) ">ショップの機能を強化する"  あと一息です。  ショップの機能をストッカーを加えて改変し、幾つかの動作を改善します。この機能はRevisedでのアイテム陳列表示に示唆を受けてまとめたものです。厚くお礼申し上げます。  具体的な動作は以下の通りです。  (1)購入時・売却時ともに、キャラクター4人とストッカーから対象を選ぶことができます。  (2)購入関連の動作の後、購入物の選択に戻るようにしました。ショップリストの更新頻度を減らしています。  (3)購入時、もちものがいっぱいだったときにキャラクターやストッカーを再度選択できるようにしました。  (4)売却した後、売却物を除いてリストを更新し、売却物の選択に戻るようにしました。  (5)ストッカーの売却に備え、ショップリストの取り扱い数を最大10個まで拡大しました。  なお[ショップリストの改変の下準備](※別紙側テキストを参照) を前提としています。さらに1品あたりの表示を1列にまとめておかないと、ストッカーの販売用(10個)に対応できません。 □ショップの最大陳列数の変更 ○武器・防具屋の陳列数   ☆10個用に拡大します。  3A802: A0 04  → A0 09  3A80E: 8D 05 03→ 8D 0A 03  3A8B0: C9 05  → C9 0A ○枠の大きさの調整 (左側・ショップリストの枠)  3AC6A: 07      …縦の開始点です。  3AC74: 16      …縦の長さです。開始点と含めここで10行分確保してください。 (右側・小選択肢の枠)  3AC6B: 11      …縦の開始点です。  3AC75: 0C      …縦の長さです。開始点と含めここで5行分確保してください。    ☆その他、必要な配置調整があれば行ってください。 ○魔法屋もついでに拡大(基本的には不要ですが)  3A9EE: C9 05  → C9 0A  魔法屋を拡大したら、[ショップリストの改変の下準備](※別紙側テキストを参照)における、FFで埋めるスペースも[4F]→[60]に拡大します。 □メッセージ関連の調整 ○ヘッダの確保   ☆確保ID26。[E0 82]の部分が使えれば調整は自由です。 3805C~38062: FF 59 90 AD FF FF 00→ [E0 82] FF 59 90 AD 00 38010-11: 4E 80 ○キャラクター選択肢変更と選択肢数の拡大  販売時選択肢に「にもつ」を追加しています。もちろん文字設定などは自由です。 382F0~:(17バイト)  10 00 01 11 00 01 12 00 01 13 00 01 9F AC 9B 00 3A90C~:  (元)A9 [12] 20 39 AA A9 [04] 85 63   → A9 [26] 20 39 AA A9 [05] 85 63 に変更    ☆前半のカッコがメッセージID、後半のカッコが選択肢数の拡大になります。 ○魔法屋の選択肢を別扱いにする  魔法だけは元のID12を使いたいので、個別に設けます。 3A388: 20 F7 A8→ 20 [A6 B6] 3B6B6($B6A6)~3B6C6:(17バイト)  A9 03 20 4E AA A9 [12] 20 39 AA A9 [04] 85 63 4C 1A A9 ○ショップのカーソル位置を増設  ロード先を一部変更して、大幅に拡大しています。ちなみに選択肢側のロードアドレスは3A92A付近にあります。 選択肢側…3A99A~3A9AB:(18バイト)   90 98 90 A8 90 B8 90 C8 90 D8 EA EA EA EA EA EA EA EA(EA×8バイトは未使用) リスト側…384B0($84A0)~384C3:(20バイト)  08 48 08 58 08 68 08 78 08 88 08 98 08 A8 08 B8 08 C8 08 D8  3A935~: A9 [A0] 85 3E A9 [84] 85 3F □購入実行ルーチンにストッカーを含める   武器や防具を買うときのルーチンです。これも一新します。3A640~3A6AB の108バイトを 00で埋めておくと改変しやすいでしょう。 ○本体(37バイト) 3A640~3A664:  20 [55 A6]            …基礎アドレス指定用サブルーチンへジャンプ。  B1 A0 F0 11 C8 C0 04 90 F7 A5 62 C9 04 D0 04 C0 0A D0 ED 38 60 AD 0C 03 A6 66 38 FD [83 A6]   …所持品用ID化する処理です。減算に使う値は3A693-94に記述しています。 91 A0 18 60 ○基礎アドレス指定用サブルーチン(26バイト) 3A665($A655)~3A67E:   A0 00 A5 62 0A AA  A5 66 F0 05 8A 18 69 0A AA  BD [6F A6] 85 A0          …基礎アドレス設定値は直後に記述しています。  BD [70 A6] 85 A1 60 ○基礎アドレス設定値(20バイト) 3A67F($A66F)~3A692:  18 61 58 61 98 61 D8 61 B0 60  1C 61 5C 61 9C 61 DC 61 C0 60 ○所持品用ID化に使う減算値(2バイト) 3A693($A683)-3A694: 1B 43 ○空き(23バイト) 3A695~3A6AB: さしあたりEA×23。 □売却選択処理ルーチンの改変   売るものを決めるときのルーチンです。ストッカーの選択や整理を含めて構成しなおしています。3A829~3A879を 00で埋めておくと改変しやすいでしょう。この容量に加えて1B000領域を使用します。 ○本体 3A829~3A867:(63バイト)  A5 62 85 A4  20 [55 A6]                …基礎アドレス指定用サブルーチンへジャンプ。  A5 62 C9 04 D0 05  A2 [任意e] 20 26 F6            …○ストッカーの整理にジャンプします。  A0 00 A6 66 B1 A0 F0 18 29 7F 18 7D [83 A6]            …所持品用ID化を解除しています。減算に使う値は3A693-94に記述しています。  99 00 03 C8 C0 04 90 EE  A5 62 C9 04 D0 04 C0 0A D0 E4  C0 00 D0 02 38 60  A9 00 99 00 03 18 60 ○空き   3A868~3A879:  さしあたりEA×18 ○ストッカーの整理   ☆1B000領域に記述します。   …□売却選択処理ルーチンの一部です。ストッカーの売却時にストッカーを整理します。 ヘッダ:[任意e] 1B000領域e: (55バイト)  A0 00 B1 A0 99 00 03 C8 C0 0A D0 F6  A2 00 A0 00 BD 00 03 F0 03 91 A0 C8  E8 E0 0A D0 F3  A9 00 91 A0 C8 C0 0A 90 F9  A2 00 A9 00 9D 00 03 E8 E0 0A D0 F8  A9 0E 4C 03 FE ※店で処理キャンセルしたときの「それはざんねん。ほかには?だれか??」的な台詞について  ルーチン実行の順番、および容量との兼ね合いで、未使用にしています。 ===== ◆ストッカーの導入(7) ショップの機能を強化する(2)  ラストです! □売却処理の改変   売却に関するメモリ操作などを含む部分です。 ○本体 3A460~3A47C:(29バイト)  A5 66 48 0A 0A 09 18 85 66  20 [58 A8]           …次項目「○初期化用サブルーチン」へジャンプ。  A5 A4 C9 04 F0 06 20 8B F0 20 AA EE  68 85 66 EA EA ○初期化用サブルーチン    3A868~3A879:(18バイト(内余り2バイト))   売却時に装備が外れることがあるので、ステータスを初期化しています。  A5 A4 C9 04 F0 03 20 [D2 BD]   …次々項目「○店売り時の装備値反映に使用する値を装備動作ルーチンに合わせる」へジャンプ。  A9 00 A4 A5 91 A0 60  EA EA(余り) ○売却先の保存 3AAD7($AAC7)~3AAE3:(13バイト)  A5 62 85 A5 AA BD 00 03 EA EA EA EA EA ○店売り時の装備値反映に使用する値を装備動作ルーチンに合わせる   ☆[◆ストッカーの導入(1) 装備動作の改変(1)]内「□0300~030Fへのロードを調整」で使った、「◎対象者IDを個人データIDに変換(サブルーチン)」を利用します。 ○0300~030Fへのロードを調整するサブルーチンへ移動 3BDE2($BDD2)~3BDE9:(8バイト)  A2 [任意f] 20 26 F6 4C 21 EE 1B000領域ヘッダアドレス: [任意f] ○1B000領域f:(8バイト)  20 [AA-AA] A9 0E 4C 03 FE    …[AA-AA]は装備動作の改変で使う「◎対象者IDを個人データIDに変換」するサブルーチンを指定してください。 □売却後処理の改変  売った時にショップリストが更新されない仕様を改変します。 ○終了時ループ先サブルーチンの変更 3A486~3A488: 4C CC A3→ 4C [85 A6] 3A695($A685)~3A69B:(7バイト)  A5 A4 85 62 4C 32 A4 ○売却物がない時の処理を変更 3A447~3A44B: 20 [8C A6] EA EA     …次項目○空白リスト枠の更新へジャンプ。 ○空白リスト枠の更新 3A69C($A68C)~3A6AB:(16バイト(内余り2バイト))  A2 [任意g] 20 26 F6         …○空白リスト枠のサイズ設定へジャンプ。 20 F2 E0  A9 1E 20 6E AA 60  EA EA(余り) ○空白リスト枠のサイズ設定 1B000領域ヘッダ:[任意g] 1B000領域g:(21バイト) A9 [02] 85 38 A9 [07] 85 39 A9 [11] 85 3C A9 [16] 85 3D A9 0E 4C 03 FE ○売却キャンセル時の戻り先を指定 3A45B: D9 →2A(売却物リストへ戻ります)、もしくはDC(売却したいキャラクター選択へ戻ります) 3A45F: D5 →26(売却物リストへ戻ります)、もしくはD8(売却したいキャラクター選択へ戻ります) □購入関連の動作の改善   オリジナルではキャンセル動作のたびに初期選択に戻り、選択の都度、無意味にリストを更新しています。これを改善し、戻り先を変更します。3A3FD~3A431の53バイトを 00で埋めておくと改変しやすいでしょう。 ○本体 3A3FD~3A431:(53バイト)  90 03 4C [94 A9] A5 62 D0 F9         …○中継サブルーチンの最初へ。  20 9F AA 90 05 A9 10 4C [96 A9]       …○中継サブルーチンの途中へ。  A9 11 20 6E AA  20 F7 A8 B0 E5  20 30 A6 90 08 A9 0C 20 6E AA 4C [05 A4]  …ここの[]内は1行上の20 F7 A8へジャンプしています。  20 06 A5 A9 13 20 6E AA 4C [32 BF]     …○戻り先指定ルーチンへ。 ○中継サブルーチン 3A9A4($A994)~($A996)~3A9AB:(8バイト)  A9 0D 20 6E AA 4C [32 BF]         …○戻り先指定ルーチンへ。 ○戻り先指定ルーチン 3BF42($BF32)~3BF50:(15バイト)  A5 AA 85 63 20 25 A9  B0 03 4C E7 A3 4C CC A3 ○戻り指定用にリスト総数を保存する 3A8A5~3A8B3:(15バイト)  98 18 69 07 A8 E6 63 A5 63 85 AA C9 0A 90 CF ===== ◆ストッカーの導入(8) バグを修正 □エクスカリバー入手に関するバグを修正  これはストッカー導入で発生する不具合の修正になります。  ストッカー導入のために所持品検索を改変しましたが、オリジナルでは元の所持品検察をエクスカリバー入手時に再利用していることがわかりました。このままではエクスカリバーを入手できません。問題になる場所を書き換えます。 ○本体 3938E~39397:  A2 [任意] 20 26 F6  A5 A2 4A F0 0D ○1B000領域: 任意・27バイト  A9 42 85 10  A9 00 85 A2  20 [DD-DD]        ☆備考を参照  A5 A2 4A F0 06  A0 00 A5 10 91 A0  A9 0E 4C 03 FE   ☆備考:このアドレスは(ストッカーの導入(5) 宝箱入手先の変更について)の、□ver.B「ストッカーとキャラクター所持品へ保存」で作成した「$DD-DD: 本体(82バイト)」を指定してください。  武器もしくは防具を入手するイベントは、ここ以外にないはずですので、これ以外で所持品検索をすることはないと思われます。 ◆移動時BGの処理を拡張する◆ ●予備知識 Q1:折角バンクの変わらない領域で空きを作れたのなら、出来るかどうかだけでも見ていただければ、というのがあるんですが・・・  下を通れる壁や森(草むら)でのスプライトをBGでマスクする処理なんですが、これはやりようによっては実現できそうなものなんでしょうか?  もしくは、ダンジョンの滝とか海の水面のラスター、というか疑似多重スクロールができればというのがあるんですが・・・  (II・IIIの動きを見ると、海では特に波がちらちら揺れ動いていくからこの方式っぽいですよね。) A1-a:FF1では床面にフラグを仕込んでいますよね。飛行石しかり、船着場しかり。大地の杖やリュートなどもそうですが。  その設定に余裕があれば、スプライトを背面化することはできるんじゃないでしょうか。  ラスタースクロールというと、スキャンラインで部分的にずらしてスクロールする、というやつですよね。  定期的にパレットを入れ替えることで動きを表現する手もありそうですよ。パターンテーブルに頼らないので、グラフィックの微調整とパレット更新ルーチンを組み込めばなんとかなるのではないでしょうか? A1-b:床面フラグ とりあえず、フィールド上での設定については、10-10Fがマップパーツの扱い(床面フラグなどの設定・2バイトずつ)になっています。 1Eが森の処理(下半身が消える/0Eだと普通の歩行可能場所扱い)になっています。 フィールドでは全身をマスクするような場面はないので、フィールド側はこの1Eの処理だけを上手くごまかせるといいんですが・・・ 次に、ダンジョン扱いの方の床面フラグについてです。 改めて設定を見直していて思ったのですが、「扉開く(部屋内のキャラ表示)」「扉閉める(部屋外のキャラ表示)」「封印された扉」の次に、「クラウンがないとダメ(0E)」という床面フラグ設定があるんですよ。 その次に「ワープキューブがないとダメ(10)」「4つのクリスタルが輝いていないとダメ(13)」という設定が続くわけなんですが、この中で実際に使われているのは「クラウンがないとダメ(0E)」「ワープキューブがないとダメ(10)」だけです。 おまけに、「クラウンがないとダメ(0E)」が使われているのは試練の城の玉座部分x2だけなんですが、実のところ、これには“そもそもシナリオ進行上、クラウンを持っていないとアルディ海から外に出られないはず”という設定ダウト的な経絡秘孔があります。 そして、「4つのクリスタルが輝いていないとダメ(13)」は“ハナっからどこにも使われていません”(未使用フラグ)。というか、これが使われるべきところはカオスの神殿中央のワープポイントだったんでしょうが、こちらでも“そもそもシナリオ進行上、4つのクリスタルが輝いていないと黒水晶を消せない” (ついでに言っておくと、黒水晶のスプライトを消すのは会話側の設定です)のでこの床面フラグが存在する理由すらありません。 (試練の城の玉座も「クラウンがないとダメ(0E)」の床面フラグを外してテストしましたが、普通なら間違いなくクラウンを持っているので、やはり存在自体が無意味です。) というわけで、床面フラグのうち「クラウンがないとダメ(0E)」「4つのクリスタルが輝いていないとダメ(13)」という処理は削っても影響がない感じの雰囲気です。 「ワープキューブがないとダメ(10)」についてだけはミラージュの塔のイベントの都合上絶対に残しておく必要があるんですが、都合、「クラウンがないとダメ(0E)」「4つのクリスタルが輝いていないとダメ(13)」の処理を「全身をBGでマスク」「下半身をBGでマスク」という二つのNoに回せる可能性は出来ました。 Q2:ダンジョンごとのIDとかってありましたっけ…? A2-a:一応あります。 というか、侵入したマップのチップパーツを構成するバンクを指定する働きのやつが一番近いと思うので、そいつを。 2CD0以降の部分が、ダンジョンや町・城での「読み込むバンクの絵」の指定になっています。 00=町の絵 01=城の絵 02=普通の洞窟の絵 03=マトーヤの洞窟タイプの絵 04=蜃気楼の塔タイプの絵 ・・・ みたいな感じになっています。(YY-CHRなんかでC010以降の絵を目視した通りの入り方ですね。) リバイズドで滝があるのはこのうち 04=蜃気楼の塔タイプの絵 で、滝の裏の洞窟自体の絵の指定は2CE2の部分になっています。 関連ありそうな情報としてはこんな感じですが、どんなもんでしょうか。 ===== ◆滝を動かしているように見せる(パレットチェンジ) □滝(仮)  パレットを定期的に入れ替え、画面に動的な印象を与えるようにしてみました。パターン側は調整していませんので、床が明滅したりとおかしな部分もあります(ちょっと綺麗に思ったのは内緒w)。  ダンジョン内のスプライト更新ルーチンに、パレット更新を新規で追加しています。BGパレットテーブル2番目が青系統(0C系統)の時に限り、パレットコードの2番目と3番目を30フレームごとに交互に入れ替えています。  [◆バンク切り替えを利用して空き領域を活用◆]の切り替えを使用しています。ヘッダアドレス位置は[01]です。 ○共通ジャンプルーチン 3C8CB~: A2 [01] 20 26 F6 ○ヘッダアドレス 1B022-23: A0 B0 ○割り込み処理の本体 1B0B0($B0A0):  A9 02 8D 14 40                          …もともとあった処理です。 ☆A5 48 C9 [12] D0 41                     …0048が滝の裏の洞窟の値=[12]でなければスキップします。     ☆情報を受け修正させていただきました!  A5 A8 C9 [1F] D0 39                          …フレーム用データです。値が[1F]になっていると入れ替えを実行します。未使用メモリ00A8を使っています。  A9 00 85 A8 AD C6 03 48 AD C5 03 8D C6 03 68 8D C5 03     …パレットデータを預けているメモリ上でパレットを入れ替え。    A9 3F 8D 06 20 A9 05 8D 06 20                  …入れ替えるパレットテーブルを指定します。  A2 05 BD C0 03 8D 07 20 E8 E0 07 D0 F5           …2箇所ほど、預けメモリからパレットを更新します。  A9 3F 8D 06 20 A9 00 8D 06 20 8D 06 20 8D 06 20         …他のところでもやっている事後処理をコピペ。  E6 A8                                  …フレーム用データを加算しています。  A9 0E 4C 03 FE                          …処理を終了して合流します。  町はほぼダンジョン扱いなので、同じ場所を通ります。町ではおおむねテーブル3番目に青系統を置いていますが、看板などでも同パレットが使われているような気配です。ネオン煌めく街角になるかも。  例えば火山などで同じような処理を適用するなら、コード全体を汎用化するほうが良さそうですね。 ===== A2-b:2CE2($ACD2)をロードするとき、その位置として0048に保存される値が、ダンジョンや街ごとにほぼ異なっていることがわかりました。(直接「h12なら滝の裏の洞窟」みたいに認識する)  そこで、0048を識別フラグとして上記ルーチンを修正しておきました。おそらく滝の裏の洞窟以外では入れ替えなくなります。汎用化する場合にも、これを識別フラグとして使えそうですb  ちなみに、旧コード(色識別)ですと、氷の洞窟や浮遊城の一部、一部のダンジョンの出入り口などで明滅するようです。実はなかなか綺麗です。残しておきますので、試してみてください(笑) ○旧スキップ部 AD C7 03 29 0F C9 [0C] D0 41       …BGパレットテーブル2番目内、パレットコード4番目が[0C]系統でなければスキップします。 Q3:こういうことができるんなら、範囲指定でBGの絵の部分を(数フレームで)変更していく、という方法もできるんでしょうか? 読み込みバイト数と開始場所の指定や、ダンジョンIDの複数指定(滝の裏の洞窟と沼の洞窟・もしくは指定設定を簡略化するため指定の絵(例えばダンジョン04タイプ)がある場合には全部同じ動作とか)で、フレーム数(アニメスピード)の別指定みたいなことがやれたら、と思うんですが・・・ こっちがもし汎用設定みたいに作れたら、海底神殿や火山・洞窟・城の水面やマグマも動かせるんですけれど・・・ A3:パレット更新と違い、必要な処理がかなり増えるのが問題となりそうです。収まるなら不可能ではないと思います。  ちなみに、FC版IIIの水表現では、パターンテーブルのごく一部ずつをフレームごとに書き変えて循環させているようです。ラスタースクロールではなさそう。1フレームあたりでは数バイトずつしか書き変えないようなので負担が少なくできています。  書き込むときにロードするデータは、別のタイミングにおいてメモリ上で書き変えています。なんという天才。 ======  ちなみに水表現はIIも同じかと思ったら、もう少しシンプルなルーチンになっていました。1に搭載しても動かせるようです。シンプルすぎていじりようがないので、搭載を迷うところではありますが、眺めたくなる効果は高いです。 ◆海を動かす □海(IIのフィールド水表現ルーチン)  滝はもともと横の動きと縦の動きとで違いがありますから、海の動かし方では動かせません。動きの速さに気を使わないなら、むしろ滝の方が簡単だったりします。ただ 1 ではフィールドと内部で滝のパターンアドレスが違うので、2種類用意しないといけないという。  いちおう海側(フィールド限定)だけ置いておきましょうか。動かせるかどうか確認したときに使ったものです。グラフィックはそのままです。 ○3C0EA~3C0EE: A9 02 8D 14 40→ A2 [任意] 20 26 F6 ○ヘッダアドレス: 00 AE(もちろん任意です) ○更新箇所指定  1ADF0~1AE0F:  B0 C0 B1 C1 B2 C2 B3 C3 B4 C4 B5 C5 B6 C6 B7 C7  D0 E0 D1 E1 D2 E2 D3 E3 D4 E4 D5 E5 D6 E6 D7 E7 ○本体     カッコ内は、○更新箇所指定のあるアドレスです。 1AE10~1AE74:  A9 02 8D 14 40 A5 A9 18 69 03 85 A9  29 0F 0A AA AD 02 20 A9 03 8D 06 20 BD [E0 AD] 8D 06 20  AD 07 20 AD 07 20 85 AA A9 03 8D 06 20 BD [E1 AD] 8D 06 20  AD 07 20 AD 07 20 85 AB A5 AA 0A 26 AB 26 AA  A9 03 8D 06 20 BD [E0 AD] 8D 06 20 A5 AA 8D 07 20  A9 03 8D 06 20 BD [E1 AD] 8D 06 20 A5 AB 8D 07 20  A9 0E 4C 03 FE       ☆00A9、AA、ABのメモリを使っています。  そうそう、グラフィックの調整についてはちょっとだけ注意点があります。2では、海のグラフィックに2色しか使っていません。パレットの3番目と4番目です。そして、コード上でもその2色の移動にしか対応していないのです。  例えば溶岩の流れを作ったとして、3番目と4番目だけで調整ができるのなら問題はないのですが、そうでなければ、コード自体を全色が移動する仕様にしないといけないわけです。そのような状況が発生するようでしたら、コードを手直しいたします。 ====== Q3-b:これって“絵を1ドットずつ移動している”んじゃなくて“色を移動している”設定なんですか?! A3-b:ちょっとだけ解説を…。  仮に「あ」の文字を yy-chrで覗き、上一列(ドット×8個分・1列)を黒色(パレット1番目)で塗りつぶすと、stirlingでは248B0と248B8だけが00になります。  すなわち、この一列=横8ドットはこの2バイトで管理されています。  yy-chrのパレット設定は変えないものとします。左上だけをパレット2番目・3番目・4番目と変えてみると、以下のように変化します。    1: 248B0=00、248B8=00    2: 248B0=80、248B8=00    3: 248B0=00、248B8=80    4: 248B0=80、248B8=80  すなわち、左上の1ドットは、2バイトの bit7 だけで管理されていることが分かります。  いったん黒1列に戻して、左から2番目の1ドットを同じようにしてみると、今度は40が立つか立たないかで変化します。    1: 248B0=00、248B8=00    2: 248B0=40、248B8=00    3: 248B0=00、248B8=40    4: 248B0=40、248B8=40  次に左上+左から2番目を同じように変更すると、16進数で 40+80 が立つか立たないかの組み合わせで変化する…というわけです。これはドット=色の設定だと言い換えることができます。  つまり、1ドットを移動させるということは、色設定を移動させることと同じ意味を持つのです。  付け加えますと、FCでは、着色は属性テーブルとパレットの組み合わせで行われます。ドット(パターン)自体は色を持っておらず、ただパレット1~4のどこを使うかを設定してあるだけなのですね。 "海が2色、の意味"  これを受けて海の部分を stirling で覗いてみますと、後半8バイトが見事にFFで埋められていることに気がつくでしょう。上記の例を参照すれば、2バイト目のFFが立っている=パレットの3番目と4番目しか使われていません。すなわち2色です。  この設定方法を利用して、前半8バイトの設定だけを循環させているのが、海を移動させているコードの秘密です。  注意として申し上げましたのは、4色を使うなら前半+後半の16バイトを循環させなくてはいけませんが、ということなのです。 Q4:ダンジョンID(ダンジョンの登録順)をちゃんと認識できるんだったら、IIIみたいに町とか階層の名前を出せそうでしょうか?   [ コーネリアじょう ] とか [ ちか2かい ]みたいなの。 A4-a:このように描画を追加する場合、既にある表示部はそうそう潰せませんので、V-blankに収まらずに画面が乱れるケースが懸念されます。海グラも、ベタにパターンを入れ替えるだけでは画面乱れが出てしまいました。そういう不具合がなければ不可能ではない気もします。ただし、枠を消したあとにBGを描画するルーチンも新規で書くことになるでしょう。そのやり方が、さっぱり思いつかないわけですがw A4-b:階層の名前 >V-blankに収まらずに画面が乱れるケースが懸念されます。 そうかぁー。そっちの容量も考えないとなんですよねぇ。 >枠を消したあとにBGを描画するルーチンも新規で書くことになる 何もないところを調べたときの「そこには なにも ありません。」の処理を潰してそっちに回せたり出来たらよかったんですが、何もないところでも何かあるところでも処理は同じっぽいですし・・・ (いるときといらないときとかの条件分岐やそもそも移動中の狭いウインドウの表示が難しいかもしれないのでやっぱり無理は言えません) 普通の会話ウインドウの表示を使うのであればまだ・・・というか、それでは空白文字を山ほど仕込むことになってしまうので、結局限りある容量の事を考えるとやらない方がよさそうな雰囲気ですね。残念。 Q5:複数のダンジョンでも、水面や滝の(パターンビューの)チップパーツの位置を合わせれば動かせそうなんでしょうか? (「沼」と「普通の水面」・「マグマ」と「普通の水面」という組み合わせもマップによってはあるので、どのみち複数を仕込まないといけないかもしれませんが・・・) A5-a:…( ゚Д゚)  マジッすか!?  やってしまうのでしたら、同じルーチンでフィールド+ダンジョンで水面の動きを実現できそうですよ。3はまさに同じ感じで、使われるパターンアドレスを一致させて、使うルーチンを内外で統一しています。  ダンジョンによって動かすマップと動かさないマップが混在すると、識別に手間がかかりますので、できれば全てのダンジョンで似たような動きをさせられると、容量の圧縮になります。できないわけではないのですが。  仮に水面がないダンジョンマップがあるとして、やはり同じパターンアドレスに似た動きをさせたいパターンを登録すると、やはり同じ動きができるでしょう。 A5-b:フィールド限定の話であれば、フィールドだけは判別ルーチンが要らないので、滝+海を動かせる「可能性があります」。というのはバイナリ上で動作ルーチンを置く場所によって画面が乱れたり乱れなかったりするからです。これは原因が良くわかりません。ジャンプに要する間隔が原因かもしれません。どうやら2種類+移動込みで限界ギリギリのようです。 1種類の動きなら移動による乱れはまずありませんが、3種類の動きを搭載して動かせていても、移動によって画面が乱れることがあります。  ダンジョンは判別ルーチンがないと使い物にならないでしょう。  動かす内容は左方向・右方向・下方向の3種類が実装できるようになりました(☆下方向は共有できる空き領域の容量次第で内容に制限がかかります)。  加えて、動かす内容はダンジョンのマップごとに指定できます。同じパターンテーブルを使っていても、階層ごとに左方向と右方向を使い分けたり、動かしたり動かさなかったりできるということです(☆海底神殿など別の場所に見えても内部的に同じマップを使用している=マップIDが同じ場合は例外です)。  容量見込みですが、いずれも概算で、各動作に200~250バイト程度×3、判別ルーチンで150バイト程度、下方向の仕込みに30バイト程度~それ以上かかる見込みです。合計で850バイト前後になる計算です。  右方向を32×8と16×8で分ける場合、さらに200バイト程度追加されます。フィールドを独立させてフィールドのみ2種類の動きを成立させると、さらに500バイト程度追加されます。フィールドを2種類動かすなら、画面乱れ防止のために独立は必須です。  圧縮の方向性としては、各動作で明らかに2色しか使わない動作ルーチンは2色用にしてしまうと各100バイト程度少なくなります。  下方向の仕込みについて説明しておきます。下方向はビットシフトをせずに済むので理論的には簡単なのですが、最初に書き込む1バイトをどこかで保存しておかなくてはいけません。また使用する変数を同時に初期化する必要がでてきます。  このルーチンは、下方向へ動かすグラフィックが滝固定であるとして、最低30バイト程度かかる見込みです。下方向へ動かすグラフィックをマップの種類によって変えたいなら、それ以上の空き容量がかなりかかります。そして、この空き容量は「共有領域でないといけない」ため、共有できる空き容量が十分ないと下方向へ動かすグラフィックは滝固定となります。 ======  フィールドは別扱いとして考え、2色だけで問題ない処理は2色にしてしまいます ◆海+滝を動かす □海&滝(水表現ルーチンの処理拡張) □下方向についての補足  共有領域が問題です。(最大容量を確保しても)容量が足りそうにありません。下方向の導入は最低限度に留めておきたいのです。  つきましては、グラフィックについて制限を設けます。ご理解いただきますようお願いいたします。 □下方向のグラフィックについて  フィールドの滝は086A0~086BFにグラフィックがありますが、下方向に動かすグラフィックは、フィールドとダンジョンともに086A0・086B0と同じ位置にある値を合わせてください。Revisedだと[2A][AC]になっています。その上で… □下方向に動かすための仕込みルーチンについて  ダンジョン内でも流用します。初期化する値は、後で増えるかもしれません。  ○下方向仕込みを記述する場所は、必ず共有領域(3C010~3FFFF)にしてください。  下方向用のグラフィックを書き換えたら、○下方向仕込みの該当部分も変えてください。 ○割り込み 3E9F9~: AC 02 20→ 20 [zz-yy] ○下方向仕込み  $yy-zz: (24バイト)  48  A9 [2A] 8D 40 60    …086A0の1バイトです。カッコ内は現Revisedの値となっています。  A9 [AC] 8D 50 60    …086B0の1バイトです。カッコ内は現Revisedの値となっています。  A9 FD 85 A8 A9 FF 85 A9  68  AC 02 20 60 □フィールド用動作ルーチン本体  下方向の仕込みをした上で、本体を記述します。  前バージョンより使用メモリを少し変えています。フィールドで独立させましたのでフィールド用のパターンを入れ替えるのは不要になりました。  なんとなくですが、動作ルーチン部分+設定値を、1B310~1B3FFのようにキリのよいところに収めると安定しやすいような気がします(気のせいである可能性も大)。 ○割り込み 3C0EA~3C0EE: A2 [任意] 20 26 F6 ○本体   1B000領域~: ○元々あった部分  A9 02 8D 14 40   ○海を動かす=左方向の動作・2色(91バイト)  A5 A8 18 69 03 85 A8 29 0F 0A AA  AD 02 20 A9 03 8D 06 20  BD [a0-aa]               …○海用設定値のアドレスを記述してください。  8D 06 20 AD 07 20 AD 07 20 85 AA  A9 03 8D 06 20  BD [a1-aa]                …○海用設定値のアドレス+1を記述してください。  8D 06 20 AD 07 20 AD 07 20 85 AB  A5 AA 0A 26 AB 26 AA  A9 03 8D 06 20  BD [a0-aa]               …○海用設定値のアドレスを記述してください。  8D 06 20 A5 AA 8D 07 20  A9 03 8D 06 20  BD [a1-aa]                …○海用設定値のアドレス+1を記述してください。  8D 06 20 A5 AB 8D 07 20 ○滝を動かす =下方向の動作・2色(86バイト)  E6 A9 A5 A9 29 07 0A AA  A9 06 8D 06 20  BD [b0-bb]               …○滝用設定値のアドレスを記述してください。     8D 06 20 AD 40 60 48 AD 07 20 AD 07 20 8D 40 60  A9 06 8D 06 20  BD [b0-bb]               …○滝用設定値のアドレスを記述してください。    8D 06 20 68 8D 07 20 A9 06 8D 06 20  BD [b1-bb]               …○滝用設定値のアドレス+1を記述してください。  8D 06 20 AD 50 60 48 AD 07 20 AD 07 20 8D 50 60  A9 06 8D 06 20  BD [b1-bb]               …○滝用設定値のアドレス+1を記述してください。  8D 06 20 68 8D 07 20 ○終了  A9 0E 4C 03 FE ○海用設定値(32バイト)  B0 C0 B1 C1 B2 C2 B3 C3 B4 C4 B5 C5 B6 C6 B7 C7  D0 E0 D1 E1 D2 E2 D3 E3 D4 E4 D5 E5 D6 E6 D7 E7 ○滝用設定値(16バイト)  91 A1 92 A2 93 A3 94 A4 95 A5 96 A6 97 A7 90 A0  これでフィールド上で海と滝が動くようになります。もし画面が定期的にバグるようなら、1B000領域内で別の場所に移してみてください。 ====== ◆ダンジョンのグラフィックを動かす  まず、ダンジョンで「同時に」2つや3つの動きを実現するのは当面諦めてください。そうしないと話が先に進まないのです。  ダンジョン用ルーチンの構造は「マップIDによって動作ルーチンを指定(判別ルーチン)→動かす動作ルーチンを1つだけ実行」というものです。構造上やみくもに動作の種類を絞る意味は薄いので、とりあえず希望された3方向は全て動かせるようにしておきます。  フラグは複数の動作を同時に管理できるようにしているので(未練ですw)、全て導入したあと試しに動かしてみたら問題なく動いたぜひゃっほい! みたいな…展開があるといいんですが(笑) □動作方向の指定について  動作させるパターンアドレスですが、 左方向:04A0-D0(32×8)  …もしくは 04A0-B0+05A0-B0(16×16) 右方向:05A0-D0(32×8)  …もしくは 04C0-D0+05C0-D0(16×16) 下方向(16×8):06A0-B0 右方向(16×8):06C0-D0(保留)  を予定しています。  方向とパターンアドレスの指定は、あくまで予定です。上記では4つのパターンアドレスを指定しましたが、左方向の指定を2種類用意すれば、4A-4D以外にもう1つアドレスを指定することができます。  実行ルーチンを必要以上に増やさないために、動作方向ごとに2色用は2色専用、4色用は4色専用、アドレスが別ならアドレス専用の動作ルーチンをそれぞれ組みます。  ただし、動作ルーチンを増やすごとに判別ルーチン=共有部分が徐々に増加していくので、増やしすぎるのは問題があります。フラグ的に8つまで動作ルーチンを作れますが、最大数作るのはNGです。上の内容より1つ2つの増加や入れ替えなら問題ないと思われます。…多分。(ぉ) □"フィールド側と動作共用できるか"について  左方向の共用は描画限界の関係でできませんでした。  下方向でもルーチン自体は共用できません。しかし、グラフィックの一部を共用せざるを得ないのは既に述べたとおりです。 □共有部(バンクの変わらない領域)のアクセスについて オリジナルのままではどうあがいても動作容量が足りません。 「◆バンクの変わらない領域でさらに空きを確保◆」でバンクの変わらない領域の容量を確保することはもとより 「◆ストッカーを導入→宝箱ルーチンはBタイプ」の導入でさらなる共有領域の確保が必須となります。 ===== □ダンジョンのグラフィックを動かす  判別ルーチンと動作ルーチン×n個で構成しています。  フィールド用「海と滝を動かす」ルーチンで使った「○下方向への仕込み」をこちらも使います。 □ダンジョン用判別ルーチン  ダンジョンのマップIDごとにフラグを設定します。新たにフラグと動作ルーチンを追加できる構造になっています。どうしてもピンポイントで欲しい動作がある場合には追加対応できます。 ○割り込み 3C8CB~: A2 [任意] 20 26 F6 1B000領域: 本体(51バイト) ○もともとあった部分  A9 02 8D 14 40 ○変数指定~フラグ取得  A5 A8 18 69 03 85 A8  A6 48 BD [aa-aa]           …○フラグ設定部分のあるアドレスを指定してください。  85 A2 ○右方向動作判別部分  A9 01 24 A2 F0 03 4C [BB-BB]     …□右方向を動かすルーチンがあるアドレスを指定してください。 ○左方向動作判別部分  A9 02 24 A2 F0 03 4C [DD-DD]     …□左方向を動かすルーチンがあるアドレスを指定してください。 ○下方向動作判別部分  A9 04 24 A2 F0 03 4C [FF-FF]     …□下方向を動かすルーチンがあるアドレスを指定してください。 ○終了部  A9 0E 4C 03 FE ○フラグ設定部分: $aa-aa  [各任意]…計64バイト   ☆フラグの種類は、   00=何も動かさない   01=右方向を動かす(4C-4F) *4色   02=左方向を動かす(5C-5F) *4色   04=下方向を動かす(6E-6F) *2色(パレット3~4番目)  となっています。  ☆フラグの記述は順番にマップIDの00~3Fに対応します。実は3C(巨人の洞窟)までしか無いようなのですが、一応念のため64バイトとしました。マップIDは00から開始し、FFHackster の Standard map editor エディット表示順に等しくなっています。  ☆フラグはビット管理しています。  複数のフラグを同時に持てるので、05や07などとすると同時に動きます。試してみてください。多くの場合、移動すると処理が限界を超えて画面がガタピシとバグります。下手をすると移動前に盛大に乱れてしまいます。  1つでさえ画面が不安定なマップは、動作自体をやめるか、2色用の左右動作ルーチンを追加導入して試してみるなどの対応を取ることになります。  2つの動作がうまく動くマップ(例:町系のマップで05など)があっても、この後にスプライトBG化の追加がありますので、当面は2つ以上本格導入しないようにお願いします。  最終的にうまく動くといいなと希望しつつ…。 === □右方向を動かす  4C-4Fを右方向へ動かします。4色に対応します。 $BB-BB: 右動作ルーチン(166バイト)  A5 A8 29 0F 0A AA AD 02 20  A9 04 8D 06 20  BD [b0-bb]       …○左右設定(1)のあるアドレスを指定してください。  8D 06 20 AD 07 20 AD 07 20 85 AA  A9 04 8D 06 20  BD [b1-bb]       …○左右設定(1)のあるアドレス+1を指定してください。  8D 06 20 AD 07 20 AD 07 20 85 AB  A5 AA 4A 66 AB 66 AA  A9 04 8D 06 20  BD [b0-bb]       …○左右設定(1)のあるアドレスを指定してください。  8D 06 20 A5 AA 8D 07 20  A9 04 8D 06 20  BD [b1-bb]       …○左右設定(1)のあるアドレス+1を指定してください。  8D 06 20 A5 AB 8D 07 20 ※2色のみの動作でよければここから直接最後の 4C [xx-xx]へ繋ぐ  A9 04 8D 06 20  BD [c0-cc]       …○左右設定(2)のあるアドレスを指定してください。  8D 06 20 AD 07 20 AD 07 20 85 AA  A9 04 8D 06 20  BD [c1-cc]       …○左右設定(2)のあるアドレス+1を指定してください。  8D 06 20 AD 07 20 AD 07 20 85 AB  A5 AA 4A 66 AB 66 AA  A9 04 8D 06 20  BD [c0-cc]       …○左右設定(2)のあるアドレスを指定してください。  8D 06 20 A5 AA 8D 07 20  A9 04 8D 06 20  BD [c1-cc]       …○左右設定(2)のあるアドレス+1を指定してください。  8D 06 20 A5 AB 8D 07 20  4C [xx-xx]       …判別ルーチン内○左方向動作判別部分のあるアドレスを指定してください。 ○左右設定(1) $b0-bb: (32バイト)  C0 D0 C1 D1 C2 D2 C3 D3 C4 D4 C5 D5 C6 D6 C7 D7  E0 F0 E1 F1 E2 F2 E3 F3 E4 F4 E5 F5 E6 F6 E7 F7 ○左右設定(2) $c0-cc: (32バイト)  C8 D8 C9 D9 CA DA CB DB CC DC CD DD CE DE CF DF  E8 F8 E9 F9 EA FA EB FB EC FC ED FD EE FE EF FF === □左方向を動かす  5C-5Fを左方向へ動かします。4色に対応します。  左右設定(3)(4)は分けてありますが、32×8としたため、実は(1)(2)と同じ内容です。流用しても構わないと思われます。…多分。流用するときの対応は、(1)=(3)、(2)=(4)となります。 $DD-DD: 左動作ルーチン(166バイト)  A5 A8 29 0F 0A AA AD 02 20  A9 05 8D 06 20  BD [d0-dd]       …○左右設定(3)のあるアドレスを指定してください。   8D 06 20 AD 07 20 AD 07 20 85 AA  A9 05 8D 06 20  BD [d1-dd]       …○左右設定(3)のあるアドレス+1を指定してください。   8D 06 20 AD 07 20 AD 07 20 85 AB  A5 AA 0A 26 AB 26 AA  A9 05 8D 06 20  BD [d0-dd]       …○左右設定(3)のあるアドレスを指定してください。   8D 06 20 A5 AA 8D 07 20  A9 05 8D 06 20  BD [d1-dd]       …○左右設定(3)のあるアドレス+1を指定してください。   8D 06 20 A5 AB 8D 07 20 ※2色のみの動作でよければここから直接最後の 4C [yy-yy]へ繋ぐ  A9 05 8D 06 20  BD [e0-ee]       …○左右設定(4)のあるアドレスを指定してください。   8D 06 20 AD 07 20 AD 07 20 85 AA  A9 05 8D 06 20  BD [e1-ee]       …○左右設定(4)のあるアドレス+1を指定してください。   8D 06 20 AD 07 20 AD 07 20 85 AB  A5 AA 0A 26 AB 26 AA  A9 05 8D 06 20  BD [e0-ee]       …○左右設定(4)のあるアドレス+1を指定してください。   8D 06 20 A5 AA 8D 07 20  A9 05 8D 06 20  BD [e1-ee]       …○左右設定(4)のあるアドレス+1を指定してください。   8D 06 20 A5 AB 8D 07 20  4C [yy-yy]       …判別ルーチン内○下方向動作判別部分のあるアドレスを指定してください。 ○左右設定(3) $d0-dd: (32バイト)  C0 D0 C1 D1 C2 D2 C3 D3 C4 D4 C5 D5 C6 D6 C7 D7  E0 F0 E1 F1 E2 F2 E3 F3 E4 F4 E5 F5 E6 F6 E7 F7 ○左右設定(4) $e0-ee: (32バイト)  C8 D8 C9 D9 CA DA CB DB CC DC CD DD CE DE CF DF  E8 F8 E9 F9 EA FA EB FB EC FC ED FD EE FE EF FF === □下方向を動かす  6E-6Fを下方向へ動かします。2色に対応します。下方向に動かすグラフィックの制限については[302]をご覧ください。 $FF-FF: 下動作ルーチン(89バイト)  E6 A9 A5 A9 29 07 0A AA  A9 06 8D 06 20  BD [f0-ff]        …○下設定のあるアドレスを指定してください。   8D 06 20 AD 40 60 48 AD 07 20  AD 07 20 8D 40 60 A9 06 8D 06 20  BD [f0-ff]        …○下設定のあるアドレスを指定してください。   8D 06 20 68 8D 07 20 A9 06 8D 06 20  BD [f1-ff]        …○下設定のあるアドレス+1を指定してください。   8D 06 20 AD 50 60 48 AD 07 20  AD 07 20 8D 50 60 A9 06 8D 06 20  BD [f1-ff]        …○下設定のあるアドレス+1を指定してください。   8D 06 20 68 8D 07 20  4C [zz-zz]        …判別ルーチン内○終了部のあるアドレスを指定してください。 ○下設定 $f0-ff: (16バイト)  E1 F1 E2 F2 E3 F3 E4 F4 E5 F5 E6 F6 E7 F7 E0 F0 === □8×8サイズを単体で動かす×2セット  負担は海ほど重くないはずなので、他が動くなら、動作に支障はないのではないかと思います。  1つめ~4つめまで全て記述しますと、4Eおよび4Fを、それぞれ単体で左方向に動かします。4色対応です。動かしたい内容に合わせて、1つめ~4つめのいずれかを選択してください。  たとえば4色用で4Eだけ動かすなら、1つめ+3つめを記述。4Eと4Fの両方を2色用で動かすなら、1つめ~2つめまで使えばOK、といった具合です。  文中A9 [04]を05などにすると、5E-5Fを動かせたりします。  ※文中[0A 26]を[4A 66]にすると、動作方向が→に  ちなみに、2色目と3色目などのような位置ずらし処理は不可能です  (ドット描画側の仕組み上「3色目と4色目」か「1色目と2色目」ならば可 意味がわからなければとりあえず「4色全部」が無難) ○実行部 (1つめ …4E・2色用) A5 A8 29 07 AA AD 02 20 A9 [04] 8D 06 20 BD [aa-aa]   …設定値のアドレスです。 A8 8D 06 20 AD 07 20 AD 07 20 85 AA [0A 26] AA   …[0A 26]で←動作 [4A 66]で→動作 A9 [04] 8D 06 20 98 8D 06 20 A5 AA 8D 07 20 (2つめ…4F・2色用) A9 [04] 8D 06 20 BD [cc-cc]   …設定値のアドレスです。 A8 8D 06 20 AD 07 20 AD 07 20 85 AA [0A 26] AA   …[0A 26]で←動作 [4A 66]で→動作 A9 [04] 8D 06 20 98 8D 06 20 A5 AA 8D 07 20 (3つめ…4E・1つめと合わせて4色用に) A9 [04] 8D 06 20 BD [bb-bb]   …設定値のアドレスです。 A8 8D 06 20 AD 07 20 AD 07 20 85 AA [0A 26] AA   …[0A 26]で←動作 [4A 66]で→動作 A9 [04] 8D 06 20 98 8D 06 20 A5 AA 8D 07 20 (4つめ…4F・2つめと合わせて4色用に) A9 [04] 8D 06 20 BD [dd-dd]   …設定値のアドレスです。 A8 8D 06 20 AD 07 20 AD 07 20 85 AA [0A 26] AA   …[0A 26]で←動作 [4A 66]で→動作 A9 [04] 8D 06 20 98 8D 06 20 A5 AA 8D 07 20 (戻り) 4C [zz-yy]          …合流点へのジャンプです。   ☆判別ルーチンの続きに合流するか、バンクを戻す部分へ合流してください。 ○設定値 aa-aa: E0 E1 E2 E3 E4 E5 E6 E7 bb-bb: E8 E9 EA EB EC ED EE EF cc-cc: F0 F1 F2 F3 F4 F5 F6 F7 dd-dd: F8 F9 FA FB FC FD FE FF ※上記ルーチンのA9 [04]を05などにすると、5*番台のチップ列を動かせ   「○設定値」の頭(*0などの*部分)設定によって指定チップの動作と出来る   例えば・・・   A9 [04]にして E0~E7 といった設定値を用意すれば、4Eの部分を   A9 [05]にして 10~17 といった設定値を用意すれば、51の部分を   A9 [03]にして C0~C7 といった設定値を用意すれば、3Cの部分を   それぞれ動作させられるということ  実行部に分岐するルーチンですが、1B000領域□ダンジョン用判別ルーチン 本体・○終了部直前に、判定部分を1つ付け加えます。 ○判定部分追加  A9 08 24 A2 F0 03 4C [ZZ-YY]  …8x8実行部を記述したアドレスを指定してください。  上記の場合、8x8での使用フラグは08にしています。 ==== Q6:フィールド側に関しては処理落ちしたりせず何の問題もなさそうにちゃんと動いている感じですが、 ダンジョン側でもルーチンを2色専用に削ったりすると少しは処理が軽くなるんでしょうか? A6:軽くなると思います。1つ動作ルーチンを追加するごとに7バイトほど判別ルーチンが増加しますが、そこだけ見ればおつりが来ます。軽いか重いかは、経由したバイト数にほぼ比例しているはずですから。 ただし、(2色専用ルーチンを別途追加導入していくと)4色用の導入が、ごく僅かずつですが厳しくなるかも…。 Q7:ルーチンは組み込めたとはいえ下手なビット立てができない状態になってしまいましたか。 ダッシュするとガタついたりすることもありで、こんなにきゅうきゅうな処理になっていたんですか。これは慎重にならざるを得ませんね・・・ どうもBGマスクの処理が先に当たった上でいけるかどうか判断しなければいけなさそうなあやしい雲行きに・・・ A7-a:だいたい動作を1種類に絞れば、移動しても問題ないとは思いますが…かなりマップに左右されますよね。  動くか動かないかというのが、広さによるのか、配置されたチップの種類や総数によるのか、簡単には判断できません…。マップ改変とかほとんどやったことが無いもので(汗)  町なんかはNPCやイベントの数が多いわりに動作が軽かったりするんですよね。やはりランダムエンカウントがあると違うのかも? ==== ◆移動時スプライトをBGでマスクさせる処理を追加する◆ □壁下スプライトのマスク処理(ダンジョン内・主人公のみ) (1)0EによりBGマスクフラグをon   設定[0E]に進むとフラグをonにし、主人公をマスク化します。   0Eを設定した部分は移動可能な領域となります。敵は出現しません。    一度onにすると、offにするまでマスク化されます。 (2)13によりBGマスクフラグをoff   設定[13]に進むとフラグをoffにし、主人公のマスク化が解除されます。   13に設定した部分は移動可能な領域となります。敵は出現しません。 (3)扉を開ける処理にフラグのoffを追加   マスク化する場所の入り口には扉があることがほとんどですので、扉を開けたときにもフラグをoffする機能を付けています。  (4)テレポ・デジョンにフラグのoffを追加    マスク化したい領域から魔法で脱出した時にもフラグをoffにします。  共有空き領域のうち、3F2FD~3F325、およびストッカーBパターンによる3DDBB~3DDFE(マスク化本体の記述)を使うことを想定しています。 ○クラウン(設定[0E])のフラグ化 3CDF8~3CDFE:AD 22 60 F0 02 D0 1B→ A9 01 85 E0 18 60 EA ○クリスタル×4(設定[13])のフラグ化 3CDC5-C6: FC CD→ [aa-AA] $AA-aa(共有領域限定): (6バイト)  A9 00 85 E0 18 60 ○通常移動チップのジャンプ先変更 3CDB3-B4: 53 CE→ 51 CE ○扉を開けたときのフラグ解放 3CDB5-B8: 55 CE 55 CE→ 53 CE 53 CE 3CE63~65: 18 60 4A→ 20 [BB-BB] $BB-BB(共有領域限定): (8バイト)  48 A9 00 85 E0 68 4A 60 ○テレポ・デジョンでのフラグ全解除  デジョン…3B0F6-F8: 20 3E B9→ 20 [CC-CC]  テレポ …3B117-19: 20 3E B9→ 20 [CC-CC] $CC-CC(*このサブルーチンは38000-3B000領域に準じて書くことができます): (11バイト)  48 A9 00 85 E0 85 E1 68 4C 3E B9 ○マスク化本体 3E3CF~: B1 10 C8→ 20 [DD-DD]   ☆3E3DE~、3E3ED~も同じく変更してください。計3ヵ所あります。 $DD-DD(共有領域限定): (3バイト)  B1 10 C8 $EE-EE(連続して記述してください):(59バイト) 48 A5 11 C9 E4 D0 1A  A5 E0 D0 18  A5 E1 F0 12  A9 08          …マスク切り替えフレーム指定  C5 35 F0 08 C5 36 F0 04  68 09 20 60  A9 00 85 E1 68 60  A5 E1 D0 F2  A9 08          …マスク切り替えフレーム指定  C5 35 F0 06 C5 36 F0 02  68 60  A9 01 85 E1 68 09 20 60 ○スプライトルーチン末尾用ルーチン 3E3FC~3E408: (13バイト変更)  20 [FF-FF]  A5 26 18 69 10  85 26 60 EA EA $FF-FF(共有領域限定): (9バイト)  B1 10 20 [EE-EE]     …○マスク化本体の$EE-EEがあるアドレスを指定してください。 9D 0E 02 60 ☆メッセージボックス表示にともなうマスク化の維持  2C247-48: 29 DF→ EA EA  動作的な部分を補足します。  唐突に出たり消えたりしないように、移動時のフレームカウントを利用して半分くらいの辺りで切り替えるようにしています。マスク本体の、フレーム切り替え指定がそれです。フレームは00~0Fの値を取りますが、上下・左右で開始値が違うので中ほどの08としました。  このフレーム管理は、ムダといえばムダな機能なのですが、あまりにも気になったので追加しています。全身を一度に処理せざるを得ないので 3 のようにスムーズにはいきませんでしたが、多少はマシになっている…はず…。  NPCは、0E・13(フラグ)のある領域に入れないようです。これらの領域で囲むと動きが止まるので、多分だいじょうぶ…? NPCのマスク処理の方法がまったく思い浮かばなかったので、これ幸いといった感じです。海底神殿あたりで人魚がビチビチしそうな気もしますが、そこは気合いで乗り切ってください(笑)  イベントによる強制脱出時にマスク処理がかかっている場面は思いつかなかったので想定しませんでした。 ☆メッセージボックス表示にともなうマスク化の維持について マスク化に関連して、ついでに補足しておきます。 メッセージボックスを開いたときにもマスク化が解除されます。 2C247-48: 29 DF→ EA EA  とすることでマスク化を維持できます。 A7-b:こうしてひとつひとつ追ってみると、後年の作品には、ちょっと見ただけでは気づかないようなアイデアが詰め込まれていたという事が改めてわかって興味深いですね。 マスク処理を導入してからの意外な副作用として、メッセージウインドウを消す時、下から町の人が見えるようになる切り替わりの動きがIIIとかでの“あの動き(スプライトに一瞬変なマスクがかかる)”になっててちょっと感動しました。 ☆下半身のみマスクについて 森の処理を調べてみたんですが、下半身の位置だけ画面に出てこない領域に飛ばすというぶっちゃけた処理をしてありましてw、容量もあまり取っておりません。 A7-c:うへぇ。さしもの氏でもそんなやっつけ方をしていましたか。参りました。 (フィールド側の森と同じく接触判定というかoff判定なしでいければ良かったんですが・・・) 内部的な処理限界を考えると下半身だけマスクという処理はどうやらあきらめざるを得ませんか。 共有領域もこれでほぼ使いきりのようですし、草むらや森での下半身処理はもう目をつぶるしかないですね。 しかし、on/off判定を1から仕込むとなるということは、全マップを作り直さない事にはどうにも立ちいかないですね・・・ ※FF Hacksterで直接マップエディットするのは危険が伴います  ある程度理屈がわかっていない限りは全くお奨めできません A7-d:ははあ、確認しました。マップチップIDあたりと並べる数を使って圧縮してあるんですか。  チップの書き換えの方も、グラフィック変更や既存の処理変更だけならできるけど、既存にない処理+textなどのナンバーを含めて変える場合はstirling頼みとは…。これはいちいち面倒だわあ。 ※FF Hacksterはある意味ツールとしては非常に高度な機能を持っており  オリジナル仕様と照らして想定外となる数字を突っ込んだりするとエラーとして認識し、自動修正します ※※バンク切り替えによって処理追記している1B000領域は“マップ用の空き領域”なので    マップを拡張する場合は使用可能な容量を減らすことに繋がることに注意 ※※バンク切り替えによって1B000領域に処理追記している場合はなおのこと    ある程度の理屈がわかっていない限りFF Hacksterを使用するべきではありません ====== ◆マスク処理をさらに拡張する-1 Q8:“固定敵が出現する床”に対するマスク解除を仕込むのは難度としてはどのくらいでしょうか? A8:それだけで良いなら、とても簡単です。  ランダムエンカウンターと固定敵は同じフラグで管理されますが、固定敵であった場合は以下の場所に移動します。 3CDEE~3CDF5: 85 6A A9 20 85 44 18 60  ここに適当に割り込みをかけ、A9 00 85 E0(フラグ解除)を書き込みます。たとえば以下のように、 3CDEE~3CDF5: 85 6A A9 20 20 aa-aa 60 $aa-aa: 85 44 A9 00 85 E0 18 60  とすれば、ジャンプ先でフラグを解除して戻ってきます。 ====== ◆マスク処理をさらに拡張する-2 Q9:「扉閉める」の動作がマスク解除フラグの配置(床チップ)の都合で離れた個所にある場合(イレギュラーな配置になっている扉がある時)、「扉閉める」を踏んだ瞬間ガクッとなって画面内の描画が崩れる時があります。 扉の前に「扉閉める」の動作を直置きしてある場合は大丈夫なようなんですが、間に別のフラグ床を挟んで置くとなるような・・・? とにかく、「扉閉める」の床が曲者なんですよねぇ・・・ ちょっとでも壁から遠くなると踏みガツッがくるので・・・ 出来るかどうかは別として(共有領域的に)ですが、「扉閉める+マスク解除」という動作が仕込めるのなら、もしかしたら問題解消できるかもしれません。 A9:いちおう簡単に「扉閉める」+「フラグ解除」を行う追記をすると以下のようになります。 3CE5E~3CE60:   20 20 CF→ 20 39 F6 3F649~3F64F:   A9 00 85 E0 4C 20 CF      ☆他の場所の7バイトを使っても構いません。 ====== ◆マスク処理をさらに拡張する-3 □「扉を閉じる」+マスク解除追記  ↑の「扉を閉じる」のマスク解除フラグについての追記です。扉が閉じた状態ではマスク解除されない、というものです。 3CE56~3CE62:  A9 00 85 E0 A5 0D 10 03 20 39 F6 18 60 3F649~3F64F(サブルーチン):  49 84 85 0D 4C 20 CF  構成を若干変更し、扉が閉じていてもマスク解除するようにしました。なお、この変更にともなう追加のマップ改変は必要ありません。  念のため補足しておきます。この変更では「扉を開ける」を踏むと必ずマスク解除されるようになっています。 ◆他の空き領域について◆ Q10: 3AB68-3AB75 の部分なんですが、ここって使用しても大丈夫な空き領域ですか? A10: 大丈夫…だったはず。  前後を見る限り問題ないでしょう。 ◆バトルシステム面を強化する◆ ◆属性効果について◆ ●予備知識 Q1-a:属性効果についてですが、「属性ダメージ0」とか「属性吸収(回復)」、あるいは「追加攻撃に対する属性防御」あたりで、実現可能性がありそうなものってあるのでしょうか? (例えば、リボンでは追加攻撃を防げないけどバリア系魔法をかけると防げる、みたいな・・・2バイト設定になってしまう気がするので無理っぽいんですが) というか、そもそもこのへん自体がメモリ的にもルーチン的にもだいぶ無茶な気はするんですけれども・・・ A1-a:属性があったらダメージ0にする、だけなら簡単です。耐性でダメージが半減する部分で00を入れて、処理終了に飛ばせばOKですb 両立し始めると途端に長くなりますが(笑)  属性吸収は、同じように、耐性があったら吸収、だけなら実現できるでしょう。HP加算ルーチンなどを組むことになりますので、若干面倒ですが、十分可能です。  しかしいずれの場合も、異なる処理を両立させる場合はそれに対応する設定フラグが不可欠です。モンスター側の設定を拡大するか、魔法ごとに設定するか、いずれにせよ拡大が必要でしょう。あるいは一部の設定をビット単位で削減して、そのビットを設定に充てる手もなくはないです。  もうひとつ根本的な改変として、ダメージ魔法ルーチンを複数用意するという荒業もあります。通常の半減タイプ・ダメージ0タイプ・吸収タイプと3種類ほど作り、属性チェック以降で合流してしまいます。魔法ルーチンIDさえ増設できれば実現可能です。モンスター側でなく魔法側に依存するので、理想の動きとはいえないかもしれませんね。  追加攻撃に対する属性防御というのは、おそらく属性があったら追加攻撃が効かない、というふうにしたいのではないかと推察します。その場合、追加攻撃実行ルーチンに属性チェックを含められるかどうかです。うまく空きに飛ばしてチェック~スキップの流れが組めればできそうです。 >リボンでは追加攻撃を防げないけどバリア系魔法をかけると防げる 2バイト設定になってしまう気がする  ですねー。バリア系魔法に独自の追加攻撃防御フラグ加算を追加し、そこをチェックするようにすればあるいは…? いや、どうかなあ。完全に新規で組む形になりそうですね。 Q1-b:やはり、設定側での実装のさせ方に問題があり、なんですね。 一応ですが、後年の作品のような厳密な仕組みを組み込むのではなく、 ・「属性ダメージ0」と「属性吸収(回復)」の動作は敵専用とする ・ダメージ魔法ルーチンに「敵ID(もしくは敵名称用ヘッダ)」を動作対象に使う条件分岐を設定  (特定の敵で通常の耐性ルーチンを無視する扱い) ・耐性属性の設定は「敵の素の設定」を利用 ・「敵ID(もしくは敵名称用ヘッダ)」(と敵の素の耐性属性)によって「専用処理(拡張増設)」を反映  …特定の敵IDでは耐性属性の項目が「属性ダメージ0」の動作になる  …特定の敵IDでは耐性属性の項目が「属性吸収(回復)」の動作になる  (それ以外の場合は通常のダメージ半減処理が適用される)  (敵IDはそれぞれ8つ程度でも設定できればいいものかと・・・いけそうなら防具IDも適用対象に?) こういう感じになると、既存のルーチンにあまり左右されずにそれっぽい動作にできる可能性もあるでしょうか? A1-b:ふむふむ、ちょっと試してみます。 ====== ◆属性効果を拡張する(簡易版) □魔法属性ダメージを0にするルーチンについて  とりあえず敵専用に作ってみました。  さしあたり[◆ダメージ魔法の命中判定削除◆]ー「○ダメージ魔法の命中判定削除」を基本構造として説明いたします。実際には構造が違っていますが、支障はないと思いますので…。  [◆ダメージ魔法の命中判定削除◆]ー「○ダメージ魔法の命中判定削除」の「○耐性チェック」のところで、「チェック」と「魔法威力半減」の間に割り込みをかけます。  このとき、直前のスキップ数を変えておきます。 F0 06 → F0 09 (実際のスキップ数は、導入されているルーチンによって変化します) ○割り込み  20 [AA-AA]  ↓ $AA-AA(17バイト) ○分岐部  A0 11 B1 84 A2 00 DD [BB-BB] F0 06    …[BB-BB]は敵ID指定のあるアドレスを指定します。  E8 E0 [08] D0 F6 60                …[08]は敵ID指定の最大数です。 ○耐性ダメージ0(特殊処理1:13バイト)  A9 00 8D 58 68 8D 59 68 68 68 4C [zz-yy]  …「○ダメージを適用・処理終了」のあるアドレスを指定します。 $BB-BB:○敵ID指定(任意の数)   ☆ダメージを0にしたい敵を指定します。何体指定するかによって、上記敵ID指定の最大数が変わります。(上記では8バイト=8体を設定)  味方の防具を対象とする場合、サブルーチンの冒頭に対象者IDのチェックを入れ、味方ならさらに別の場所に飛ばす形になります。  素の耐性を使用するというのはおそらくデスペル対策だと思われますが、それならデスペルが効かなければよいので、デスペルの魔法に属性を仕込んで耐性除外してしまったらどうでしょう。処理が単純になり圧縮につながる他、順番に魔法を使うタイプの敵で時限式の属性完全防御といったギミックを作れるようになります。 ◆属性効果を拡張する(完全版)  では、耐性関連の拡張に移りましょう!  そこそこ長いですが、じっくりやっていってくださいな。  ※実際に動かす場合はStep1~4の全てを導入すること ■ダメージ0・吸収の導入(Step1)■ □ダメージ0・吸収の導入  以前予定していたやり方で不具合が出ましたので、色々と予定とは異なる仕組みになっています。個人的には当初の予定より良くなった感があります。   ・耐性や弱点チェックはそのまま残し、最終的にダメージ適用をする直前にまとめて処理する形にしました。   ・ダメージの修正を各ルーチン内で行うようにしました。   ・魔法IDや魔法ルーチンIDはいじらず、魔法成功フラグとダメージ0or吸収フラグを操作することでメッセージ調整をしています。  実際の動作としては、   ダメージ0 :「0 ダメージ」→「まほうをふせいだ!」    *メッセージ内容は例によってサンプルです。   味方が吸収:「n かいふく」→「きゅうしゅうした!」   敵が吸収  :「n かいふく」→「すいとられた!?」   回復魔法  :「n かいふく」→「(成功メッセージ)」  という表示順になります。  サンプルでは一緒にしていますが、敵と味方でダメージ0時のメッセージを分けられるようになっています。  ケアルガは成功メッセージしか出しません。  ダメージ0と吸収時には、魔法成功フラグを特殊な状態にします。魔法成功フラグon/offに絡むメッセージは出現しません。ルーチンを実行する順番の関係で、「まほうをふせいだ!」→「じわれがてきにおそいかかった(成功フラグon)」or「こうかがなかった(成功フラグoff)」のような不自然な表示になるためです。 ○使用フラグまとめ  00A8をダメージ0or吸収フラグとし、魔法成功フラグ685Cを操作して各効果を適用します。00A8はこれまでの改変にも使われていますが、混用に問題はありません。   (00A8の対応) 00 特殊処理なし。ダメージ0・吸収なし。処理前後に値を初期化します 01 回復魔法 02 味方がダメージ0のとき 03 敵がダメージ0のとき 04 味方が吸収したとき 05 敵に吸収されたとき 50 敵がダメージ0のとき・味方がダメージ0のときのメッセージID 51 味方が吸収したときのメッセージID 52 敵が吸収したときのメッセージID   (魔法成功フラグ) 00 「こうかがなかった(魔法成功フラグoff)」 01 成功(フラグon) 02 ダメージ0・吸収用特殊フラグ。表示しません  以下は実際の改変内容になります。  「◆魔法ルーチンの移設について」の適用を前提としています。  魔法ルーチン内の改変では、まず「全体の構成」を示し、次に「簡易改変」を提示する形となっています。  簡易改変は各サブルーチンのアドレスがズレないので手間が少なくて済むようになっています。全体の構成を適用すると、記述バイト数が少なくなる代わりに、全体のアドレスを全てチェックしなおす必要があります。お好みで適用してください。  いずれの場合も、魔法ルーチンの移設などによるアドレス変更の可能性を考慮し、現リバイスドの魔法ルーチン内におけるアドレスは記述していません。それ以外の確定している場所については記述しています。 □回復魔法に「ダメージ→かいふく」表示フラグを追加   吸収処理でも再利用します。   フラグは、回復魔法:00A8=01とします。   末尾の終了部分を、魔法ダメージ数値表示ルーチンに合流させ、回復値を明示します。これにより、吸収処理で合流したあとで吸収した値を表示できるようになります。 ○全体の構成  20 85 B8 ☆A9 01 85 A8           回復魔法フラグをセット  20 CD B8  20 E9 B8    20 3D B8  A9 12 AA A0 01 20 7B AE  HP回復処理。アドレス[ZZ-ZZ]。☆ここに吸収が合流します☆  A2 15 A0 12  20 EA AD             最大HP超過チェック ☆90 03 [20 30 B4]        最大HPに修正しますが、カッコ内のジャンプ仕様を変更していますので注意してください ☆4C CD B0 数値表示ルーチンへ移動しています    *全体を改変すると一部のサブルーチンはアドレスがズレる可能性があります。 ●簡易改変案   使われていなかった4バイトを再利用し、最大HP超過チェック以降を別の空き領域に移動させています。 ○回復魔法フラグを記述する   回復魔法のヘッダを4バイト前にする  →回復魔法の直前にあるEA×4を20 85 B8の後ろにずらす  →A9 01 85 A8を記述 ○末尾を近くの空き領域に飛ばす  A9 12 AA A0 01 20 7B AE   HP回復処理。アドレス[ZZ-ZZ]。☆ここに吸収が合流します☆  A2 15 A0 12  20 EA AD         超過チェック ☆4C [-- --(空き領域へ)]    空き領域へジャンプさせる  00 00 00  未使用 ○サブルーチン(8バイト)  90 03 20 30 B4   最大回復に修正  4C CD B0      数値表示ルーチンへ移動 ====== ■ダメージ0・吸収の導入(Step2)■ □ダメージ魔法ルーチンの改変   ダメージ適用の直前で1B000領域にジャンプし、新規処理を適用します。   吸収時の処理合流先は、[344]回復魔法の改変部分を参照してください。 ○全体の構成  20 85 B8    …成功フラグ  20 CD B8   …魔法威力を計算用メモリにコピー  20 E9 B8    …使用者の知性を威力に加算  AD 78 68 2D 77 68 F0 06 4E 59 68 6E 58 68  …耐性チェック  AD 78 68 2D 76 68 F0 06 0E 58 68 2E 59 68  …弱点チェック(21:10:吸収なはずはありません。修正しました)  20 2D B8  …乱数を加算 ☆A2 [任意] 20 26 F6   …☆1B000領域へジャンプ ☆A5 A8 C9 04 B0 0C   …フラグが吸収(04以上)ならスキップ  A9 12 A2 12 A0 01 20 AC AE 4C CD B0  …ダメージを適用、処理終了 ☆4C [ZZ-ZZ]   …吸収だったら回復魔法のHP回復処理へ合流    *全体を改変すると一部のサブルーチンはアドレスがズレる可能性があります。 ●簡易改変案 ○「乱数を加算」部を近くの空き領域に飛ばす  20 2D B8→ 20 [-- --(空き領域へ)] ○サブルーチン(20バイト)  20 2D B8        乱数を加算  A2 [任意] 20 26 F6  ☆1B000領域へジャンプ  A5 A8 C9 04 B0 01  フラグが吸収(04以上)なら1バイトスキップ  60             復帰  68 68 4C [ZZ-ZZ]   吸収だったら回復魔法のHP回復処理へ合流する □ダメージ0・吸収チェックルーチン   ダメージ魔法ルーチンからジャンプしてくる、今回の改変の本体その1です。1B000領域に記述します。   耐性チェックを改めて行い、失敗したら丸ごとスキップします。フラグ00A8は主にここで記述し、以降の処理は00A8に従います。このルーチンでは文字表示制御自体は行いません。   優先順位についてですが、吸収が優先されるようにしています。 (各補足) ・防具のIDについて…   防具のIDには、アイテムID、所持品ID、装備IDの3種類があります。ここでは装備IDを指定してください。所持品IDは01から開始され、キャラクターの持ち物になったときにアイテムIDから変換されます。装備IDは所持品IDを+80hした値です。   例を挙げますと、「ふく」ならアイテムID=44、所持品ID=01、装備ID=81、のようになります。 ・防具ID=00について…   何も持っていないときのメモリ状態が00です。防具IDの設定を00にして耐性を指定すると、何も持っていない場合に吸収やダメージ0になるバグが発生します。使わないところは防具IDをFFにするか、耐性を00にしておいてください。 ・防具の耐性について…   防具データはこのバンクからアクセスできないので、防具のIDと一緒に耐性属性も記述しておく必要があります。これにより防具の属性を2~3段階に設定できる副次的なメリットが生まれます。たとえばリボンなど複数の耐性を持つ防具は、(あくまで例えですが)炎を吸収・冷気と稲妻をダメージ0・それ以外の属性ダメージは半減、というふうに分けて設定できるわけです。 ・敵のIDについて…   敵ID部の00はIDとして認識されるので、使わないところはFFにしてください。   敵側はIDのみで判定するようにしましたので、耐性属性が増えると、該当の敵は吸収あるいはダメージ0を発生させるようになります。耐性を増やす手段は魔法しかありませんから、設定と合わせて上手く使えばギミックになるでしょう。 ・味方の耐性付与魔法について(バサンダなど)…   防具の耐性を個別に設定していますので、味方では敵側のような耐性強化は起こりません。 ●本体  A9 00 85 A8  EA EA EA       仕様を拡張できるように3バイトほど確保しています(後述)  AD 78 68 2D 77 68  耐性チェック  D0 05 ○全共通終了部  A9 0C 4C 03 FE   耐性がなければ終了します。全ての終了部はここに合流します ○敵味方識別      A5 A1 C9 61  D0 03  4C [KK-KK]      使用者が味方なら「敵ID識別部」へジャンプします ●味方用識別部 ○吸収  A0 1C B1 92 A2 00  DD [AA-AA]    吸収する防具IDと、装備防具を比較しています  D0 0F   BD [aa-aa]    防具IDが一致したら、その防具の吸収耐性をロードします   2D 78 68     魔法属性と比較します   F0 07    A9 04 85 A8  吸収耐性と一致したら味方用吸収フラグを記述します    4C [XX-XX]  吸収処理へジャンプします(敵味方共通)  E8 E0 [08] D0 E7  カッコ内は設定した吸収防具の数です       *サンプルでは全て、各8個指定しています。  C8 C0 20  D0 DE    防具枠の数=4回繰り返します。 ○ダメージ0  A0 1C B1 92 A2 00 DD [BB-BB]     ダメージ0にする防具ID  D0 0F   BD [bb-bb]     一致したら、その防具のダメージ0耐性をロード   2D 78 68   F0 07   A9 02 85 A8    味方用ダメージ0フラグを記述    4C [YY-YY]   ダメージ0処理へジャンプ(敵味方共通)  E8 E0 [08] D0 E7  ダメージ0防具の数  C8 C0 20  D0 DE ○味方終了  4C [nn-nn]     味方用チェック終了、共通終了部へジャンプ ●敵ID識別部 [KK-KK] ○敵IDロード  A0 11 B1 90 A2 00 ○吸収  DD [CC-CC]   吸収する敵IDと比較しています  D0 07  A9 05 85 A8   敵用吸収フラグを記述します  4C [XX-XX]   吸収処理へジャンプします(敵味方共通)  E8 E0 [08]    吸収する敵の数  D0 EF ○ダメージ0  A0 11 B1 90 A2 00  DD [DD-DD]   ダメージ0にする敵IDと比較  D0 07  A9 03 85 A8   敵用ダメージ0フラグを記述  4C [YY-YY]   ダメージ0処理へジャンプ(敵味方共通)  E8 E0 [08]    ダメージ0にする敵の数  D0 EF ○敵終了  4C [nn-nn]    敵用チェック終了、終了部へジャンプ ●吸収ルーチン   ダメージ量ですが、既に耐性チェックで基本値が半減しています。サンプルでは、さらに最終ダメージ量を半減しています。  半減したくない場合はダメージ修正をカットしてください。2倍したい場合は 4E 59 68 6E 58 68→0E 58 68 2E 59 68としてください。倍率は変更できるようにしています。 [XX-XX]: ○ダメージ修正  A2 [01]     倍率設定です。01で2分の1(2倍)、02で4分の1(4倍)、03で8分の1(8倍)…になります。00は設定しないでください。  4E 59 68 6E 58 68   →ダメージ修正を2倍にしたい場合は 0E 58 68 2E 59 68 に  CA D0 F7 ○その他処理  A9 02 8D 5C 68  成功フラグを専用のものに書き換えています  4C [nn-nn]     終了 ●ダメージ0ルーチン [YY-YY]:  A9 00 8D 58 68 8D 59 68 ダメージ0  A9 02 8D 5C 68       成功フラグを専用化  4C [nn-nn]           終了 ○防具用識別ID・吸収 [AA-AA]: サンプル8バイト ○防具用識別ID・吸収属性  ※本来の防具属性と別にここで設定できる [aa-aa]: サンプル8バイト ○防具用識別ID・ダメージ0 [BB-BB]: サンプル8バイト ○防具用識別ID・ダメージ0  ※本来の防具属性と別にここで設定できる [bb-bb]: サンプル8バイト ○敵用識別ID・吸収 [CC-CC]: サンプル8バイト ○敵用識別ID・ダメージ0 [DD-DD]: サンプル8バイト   1B000領域では、本体+各ルーチンで188バイト使い、IDに48バイトを想定しています。IDは任意で拡大・縮小できます。拡大縮小したら、各取り扱い数を変更してください。特に敵IDはもっと多くて良いような気がします。耐性が合わないと発動しませんので。 ====== ■ダメージ0・吸収の導入(Step3)■ □ダメージ数値表示の改変  ダメージ数値表示ルーチン部分を1B000領域に飛ばして、他の用途にも使えるように拡張します。今回の本体その2です。主にすることは2つです。   ・~ダメージと~回復の分岐   ・最下段に表示するメッセージの分岐  いずれも1B000領域で分岐フラグを操作して、旧本体で分岐をかけています。ダメージ0と吸収の場合、最下段に専用メッセージを表示します。 ●旧本体を改変 330DD~33101:  48 8A 48 98 48  A2 [任意] 20 26 F6   1B000領域へジャンプします  A2 1C A0 6D  A9 03 [20 18 F2]    ダメージ・かいふく値を表示します  A5 A8  48 A9 00 85 A8 68    C9 [50] B0 03      00A8フラグが一定以上なら3バイトスキップ  4C 3C B0        通常終了  4C 6E B1        最下段に専用メッセージを表示します ●1B000領域本体    ☆1B000領域の大元分岐でのジャンプ先は○本体を指定します。 ○ダメージ・回復値枠設定値 [HH-HH]:   0C 58 68 0F 2E 00    枠に関する設定値です(6バイト)。ちなみに[2E]が「ダメージ」示す文字コードです ○本体(オリジナルと同じ処理)    ☆ここから開始します。  A2 06 A0 00  B9 [HH-HH]      上記設定値のアドレスです  99 1C 6D  C8 CA D0 F6  EE 8B 6C ○本体(分岐部)  A5 A8  C9 01 F0 19      回復魔法用分岐  C9 02 F0 1B     味方がダメージ0のとき  C9 03 F0 1D     敵がダメージ0のとき  C9 04 F0 1F     味方が吸収したとき  C9 05 F0 21     敵に吸収されたとき  A9 00 85 A8        ○終了部  A9 0C 4C 03 FE ●各専用ルーチン   本体に連続して記述してください。 ○回復魔法  A9 00 85 A8  F0 16        「ダメージ」→「かいふく」切り替えに合流 ○味方がダメージ0のとき  A9 [50] 85 A8   00A8を専用メッセージIDで上書きします    ☆メッセージIDの追加については次項目を参照してください。  D0 EF         終了 ○敵がダメージ0のとき  A9 [50] 85 A8   00A8に専用メッセージID  D0 E9         終了    ☆サンプルではダメージ0で敵味方とも同じメッセージIDを使用しています。いちおう違うメッセージを使用できるように分離していますが、分岐時に同じ場所に飛ばして6バイト圧縮しても良いでしょう。その場合、以降のジャンプ先バイト数も変化するので注意してください。 ○味方が吸収したとき  A9 [51] 85 A8   00A8に専用メッセージID  D0 04        「ダメージ」→「かいふく」切り替えに合流 ○敵に吸収されたとき  A9 [52] 85 A8      00A8に専用メッセージID  A9 4F 8D 20 6D    「ダメージ」→「かいふく」切り替え  D0 D8           終了   本体と各ルーチンおよび冒頭の設定値で89バイト使っています。 ●追加メッセージの作成について  「かいふく」の文字や最下段に表示する特殊メッセージの設定です。   ヘッダを追加し、新規メッセージを確保しました。   以下はサンプルです。メッセージ設定では最後の00を忘れずに記述してください。 ○ヘッダ追加   ちなみにあと3つまで戦闘用メッセージのヘッダを追加できます。 2CFFC~2D003:   4F: FA 8F  50: 33 8F  51: 3D 8F  52: 47 8F ○内容 2D00A~2D00F   4F・ FFかいふく00 (6バイト)   = FF 8F 8B A5 91 00 2CF43~2CF4C:   50・ まほうをふせいだ!00 (10バイト)   = A8 A7 8C 7B A5 97 8B 52 C4 00 2CF4D~2CF56:   51・ きゅうしゅうした!00 (10バイト)   = 90 7E 8C 95 7E 8C 95 99 C4 00 2CF57~2CF5F:   52・ すいとられた!?00 (9バイト)   = 96 8B 9D B0 B3 99 C4 C5 00 ○その他の使えそうな空き領域 2C3F8~2C40F(24バイト)もメッセージ設定用として使えそうです。 ●吸収・ダメージ0のときだけ「こうかがなかった」を表示しない   魔法成功フラグを使った分岐部分を書き換え、専用のフラグを使って「こうかがなかった」表示をスキップできるようにします。   魔法ルーチンの空き領域にジャンプして、新たな分岐を作成します。 33152~33159:  AD 5C 68   C9 01 F0 04         成功フラグがあったら移動をスキップ  4C [-- --(空き領域)]  サブルーチンへ移動   00               未使用1バイト ○サブルーチン(13バイト)  C9 02 F0 06        専用フラグを識別  20 94 B8   4C 8D B1  4C 3C B0         専用フラグがあったら終了    これで一通りの改変は終了です。ここまででダメージ0と吸収を実装できているはずです。  なお、これらの処理を適用できるのは、当然ながら数値的な処理が発生するものに限られます。つまりダメージ魔法と回復魔法です。それ以外の魔法ルーチンはこの処理を通りませんので注意してください。 □拡張について補足  冒頭で確保した3バイトは、耐性チェックの前に別の場所へジャンプできるようにしたものです。もし特定の武器や防具、あるいは敵に特殊な効果を付けたいと考えた場合、全体を書き換えることなく拡張できるようにしています。  何か思いつかれましたら、対応できるようなものなら対応いたしますよb □実際の回復量を反映する  これはオプションです。  これまでの改変では、回復や吸収のときに表示される値は、魔法威力の値でした。  回復魔法のルーチンをさらに若干追加すると、回復や吸収のときに実際に回復した値を表示することができます。  ただし、ややはったりが効きづらくなるような気がします。してやられた感が薄くなるというか…。それに、強制的に全体の組み換えが必要になると思われます。お好みでどうぞ。 ○全体の構成(回復魔法)  20 85 B8  A9 01 85 A8            回復魔法フラグをセット  20 CD B8  20 E9 B8    20 3D B8  A9 12 AA A0 01 20 7B AE   HP回復処理。アドレス[ZZ-ZZ]。☆ここに吸収が合流します☆  A2 15 A0 12  20 EA AD             最大HP超過チェック ☆90 15               ここから先が追加部分です ☆A9 12 A2 12 A0 01 ☆20 AC AE ☆A9 01 A2 15 A0 12 ☆20 AC AE            ここまでで実際の回復量を算出します  20 30 B4  4C CD B0 ====== Q-2:よくよく考えたらバリア系魔法を使う敵ってほとんど“弱点に対してバリア系魔法をかける”から効果としては“結局普通のダメージ量”になってしまうんですよね。 敵がバリア系使ってきたらダメージ1/4みたいな調整ってきかせられるものなんでしょうか? A-2:そういう要望もあろうかと、割り込めるように3バイト用意しておきました。  汎用的なフラグの新設となると難しくなりますが、弱点を耐性魔法で補うような敵はそうたくさんは作られないでしょう。であれば、特定の敵に対して、一定の条件下でダメージをさらに修正するような処理を組み込むのは十分に可能です。  識別ルーチンをダメージ適用部分の最後(正確にはHP減算の直前)に配置しましたので、他にもさまざまな効果を実現できると思います。 ■ダメージ0・吸収の導入(Step4)■ ダメージ0・吸収の導入(Step2)の「●本体」に置いておいた、あの3バイトを使います。ジャンプを4Cで行い、割り込みをかけやすくしています。追加ルーチンですので、泥縄式=重複する判定が若干ありますが、仕様ということでお願いします(笑)  以下、このルーチンで設定できる耐性を特殊耐性と呼称します。  特殊耐性は、「耐性と特殊耐性が一致した場合にのみ」効果を発揮します。  この耐性は魔法による付与と通常耐性を区別しません。 特殊耐性の効果自体はダメージを半減するだけですが、耐性がないと発動しないため、結果的にダメージは4分の1に軽減されます。これに弱点補正が加わると、通常耐性と同じ2分の1ダメージとなるわけです。 例を挙げておきます。(下記の例の耐性は説明用です。Revisedのものとは異なります。) (例1)  敵ゴースト(弱点・炎、耐性・冷気)に対し、サンダーが100ダメージ、ファイアが200ダメージ、ブリザドが50ダメージ。  敵ゴーストがバファイを使用。  敵ゴーストに特殊耐性・炎を設定しておくと、サンダーが100ダメージ、ファイアが50ダメージ、ブリザドが50ダメージに変化。 (例2)  敵クラーケン(弱点・雷、耐性・炎、特殊耐性・炎)。  サンダーは200ダメージ、ファイアが25ダメージ、ブリザドが100ダメージ。 (例3)  敵ゴブリンガード(弱点なし、耐性なし、特殊耐性・炎)。  サンダーは100ダメージ、ファイアも100ダメージ、ブリザドが100ダメージ。  敵ゴブリンガードがバファイ、バサンダを使用。  サンダーは50ダメージ、ファイアが25ダメージ、ブリザドが100ダメージに変化。  通常の耐性と同じく、特殊耐性も複数の耐性を合わせ持つことができます。  なお、重複を好まれない場合は、弱点+魔法による耐性追加+特殊耐性のみでも運用できますので、それでお願いいたします。 ●本体の3バイト EA EA EA→ 4C [AA-AA] ●特殊ルーチン ○敵味方判別 [AA-AA]:  A5 A1 C9 61  F0 03  4C [nn-nn]      例の3バイトの直後を指定し、復帰。 ○敵ID識別  A0 11 B1 90 A2 00  DD [B0-BB]     特殊耐性を設定した敵IDと比較。特殊耐性を置いたアドレスを指定します。  D0 03  4C [XX-XX]      一致したら次の判定へ移動  E8 E8 E0 [10]    [-]のカッコ内は、特殊耐性を設定した敵の数×2(16進数)を記述します。サンプルでは8体になっています。  D0 F2  4C [nn-nn]      例の3バイトの直後を指定し、復帰します。 ○特殊耐性による耐性判定 [XX-XX]:  BD [B1-BB]       該当の敵の特殊耐性をロード。特殊耐性を置いたアドレス「+1」を指定します。  2D 77 68        耐性とand  2D 78 68         魔法属性とand  F0 [06]          [06]は処理のバイトスキップ数(※ルーチン拡張などの仕様変更をしない限り変更しなくて良い=敵の設定数では変更なし)  4E 59 68  6E 58 68        特殊耐性があったら魔法威力半減     ☆通常耐性、もしくは魔法付与の耐性と一致しなければ発動しません。弱点があった場合に、通常の耐性があったときのダメージと同じになります。弱点がない場合はダメージが4分の1に軽減されます。  4C [nn-nn]    例の3バイトの直後を指定し、復帰。 ●特殊耐性設定部   設定しやすいように、敵ID→特殊耐性を繰り返す形で記述できるようにしました。設定部は、特殊耐性を設定する敵の数×2バイトかかることになります。 [BB-BB]:  敵ID、特殊耐性、敵ID、特殊耐性…(繰り返し) ◆バトルシステム面を拡張する◆ ●予備知識 Q:ジョブごとの特徴をもうちょいハッキリさせるアプローチがあってもいいかもしれないですね。  “「にげる」を選択したターンの間だけ”一時的に回避率アップ、とかいうことができたらどんな感じになるんでしょうね?  [(知性+幸運)÷2+素早さ-現在レベル]みたいな値でやれればと思いましたが、現実的にはジョブごとに別のアップ数にするとか・・・?  FF Iは「ぼうぎょ」がないから逃げられない敵の時なんかで一定の効果があるかもどうかも。 A:コマンド種別を保存するメモリを識別に使えば作れそうです。物理攻撃時の回避率は、値を返さなかった気がします。地味ですが防御の代わりとしてあっても良いかも。  オリジナルからシーフって地味すぎますから、なんとか使われやすくしてあげたいなぁと…w  でもそれだけじゃ表にメリットが出てこない…哀れシーフ…。 ====== ◆「ぼうぎょ」の代替となりそうな効果を増設する □「逃げる」コマンドに回避率アップ効果を付与する  といっても、この改変は表に出てこないので、見た目はまったく変わりません。数値を極端にして確認してみてください。  クラスごとに加算値を設定できるようにしています。  シーフ・ニンジャに高い値を設定するかもしれませんので、上限値は255にしています。上限に不都合がありましたら手直しいたします。  敵に攻撃されたときの回避率は、リターンルーチンで値を戻しませんので、ここでの設定が「逃げる」以外に反映されることはありません。 ○割り込み 32604~3260A:  A2 [任意] 20 26 F6  EA EA ○本体 1B000領域:  A0 07 B1 80  8D 78 68  AD 85 68 0A 0A AA  BD 8F 68  C9 20 D0 13    …コマンドが「逃げる」でなければ加算しません。  A0 01 B1 80 AA  AD 78 68  18 7D [AA-AA]   …AA-AAにある各クラスごとの回避率増加値を加算します。  90 02 A9 FF  8D 78 68  A9 0C 4C 03 FE ○設定値 AA-AA: 任意の設定値×12バイト    ☆ここで加算値を設定します。クラス数に合わせて12バイトほど使います。      戦士、シーフ、モンク、赤魔術士、白魔術士、黒魔術士、      ナイト、ニンジャ、Sモンク、赤魔導師、白魔道師、黒魔導師(クラス表記はオリジナル準拠)     …の順番で設定してください。 ◆「眠り・マヒの解除ルーチン」を拡張する◆ ※予備知識として↑の  ◆戦闘予備知識7◆-「マヒ」と「眠り」状態について の個所を参照のこと ====== ◆味方側 眠り・マヒの解除ルーチンの拡張  敵側は前後の流れが違うような気配なので、とりあえず味方側だけざっくり作ってみました。眠りが「3~4割」マヒが「1割~2割」くらいの解除率として、200分率に能力÷4をかませてあります。例によって例の1B000領域を使っております。 □味方側行動時解除判定根幹部 323CD~323E7(27バイト):  A0 01 B1 82 29 30 D0 01 60  85 E1 A5 88 48 20 92 A0 68  20 45 A1 4C 2F A4  EA EA EA □味方側行動時眠り・マヒ解除ルーチン 3243F~3246C(46バイト):  20 83 BA 85 E0  A2 [任意] 20 26 F6     1B000領域を利用  A5 E0 F0 10  A0 02 B1 80 25 E0 91 80  A0 01 B1 82 25 E0 91 82  A5 E1 48 A2 05 A9 00 95 E0 CA 10 FB 68  4C 07 AA ○未使用化  3246D~324B9(77バイト):00×77 ■1B000領域  A9 20 24 E1 F0 03  4C [AA-AA]         眠り解除ルーチン  4C [BB-BB]         マヒ解除ルーチン ●眠り解除ルーチン[AA-AA]  A9 [--3C(任意)] 85 E1    基礎確率を指定    ★乱数幅は00~200の間にしています。基礎確率3C=60/200、約3割です。この値に能力値による修正とHP条件による修正を加えます  A0 12             知性を指示  20 [CC-CC]         ◎能力ロード用サブルーチン  20 [DD-DD]         ◎最大HPロード用サブルーチン  EA EA EA EA        開始条件調整用の空白、不要なら削除してください  A2 00  46 E3 66 E2  20 [EE-EE]         ◎HP比較用サブルーチン  B0 0C  A5 E1 18 69 [--02(任意)]  HP条件による修正値加算 (「解除確率値」に[(任意)]内の数値を+)  85 E1  E8 E0 [--03(任意)] D0 EB  チェックを繰り返す回数   ★繰り返す回数が03だと、HPが2分の1以下、4分の1以下、8分の1以下の3回を指定。条件を満たすたびに解除条件を修正値だけ加算。条件を外れるか最大回数チェックすると判定に移行します。   ★HP条件の開始位置を4分の1以下からにするなら、EA EA EA EAに46 E3 66 E2を入れてください。  A5 E1 C5 E0 90 0A  (成功)  A9 DF 85 E0      DFで眠りを解除  A9 [27] 85 E1     眠り解除用メッセージID  D0 08  (失敗)  A9 00 85 E0      解除失敗フラグ  A9 [28] 85 E1     眠り解除失敗用メッセージID  A9 0C 4C 03 FE    終了、復帰   ★他のA9 0C 4C 03 FEを流用してもOKです ◎能力ロード用サブルーチン[CC-CC]  B1 82 18 A0 14 71 82 90 02 A9 FF  4A 4A        能力の合計を4分の1  18 65 E1 90 02 A9 FF  85 E1 60   ★仮に能力値合計が40とすると、4分の1で+10(10/200)。5%成功確率がアップします ◎最大HPロード用サブルーチン[DD-DD]  A0 0D B1 82 85 E3  88 B1 82 29 FE 85 E2 60 ◎HP比較用サブルーチン[EE-EE]  A0 0B B1 82 C5 E3 F0 01 60  88 B1 82 29 FE C5 E2 60 ●マヒ解除ルーチン[BB-BB]  A9 [--14(任意)] 85 E1   基礎確率を指定   ★乱数幅は00~200の間にしています。基礎確率14=20/200、約1割アップします。  A0 13    体力を指示  20 [CC-CC]         ◎能力ロード用サブルーチン  20 [DD-DD]         ◎最大HPロード用サブルーチン  A2 00  46 E3 66 E2  E8 E0 [--02(任意)] D0 F7   ★HP条件を増やしていく幅を指定。01で2分の1、02で4分の1、03で8分の1ずつ増やします。  A5 E2 85 E4  A5 E3 85 E5  20 [DD-DD]         ◎最大HPロード用サブルーチン  A2 00  46 E3 66 E2  E8 E0 [--01] D0 F7   ★HP条件の開始位置を指定。01で最大HPの2分の1、02で4分の1、03で8分の1からチェックを始めます。  (ループ基点)  20 [EE-EE]         ◎HP比較用サブルーチン  90 [--17]  A5 E1 18 69 [--02(任意)]  HP条件による修正値加算 (「解除確率値」に[(任意)]内の数値を+)  85 E1  A5 E4 18 65 E2 85 E2  A5 E5 65 E3 85 E3  4C [-- --]         マヒ解除ルーチン内の[ループ基点]に戻る   ★HP条件の開始位置からチェックを始め、チェックのたびにHP条件を増やしていきます。条件を外れるか最大回数チェックすると判定に移行。  A5 E1 C5 E0 90 0A  (成功) A9 [EF] 85 E0     EFでマヒ解除  A9 [29] 85 E1    マヒ解除時のメッセージID  D0 08  (失敗)  A9 00 85 E0      解除失敗フラグ  A9 [2A] 85 E1     マヒ解除失敗時のメッセージID  A9 0C 4C 03 FE    終了、復帰   ★他のA9 0C 4C 03 FEを流用してもOKです  解説を加えます。  どちらも、00~200の間で乱数を取り、条件を各種修正した後、乱数と条件を比較します。乱数が条件未満なら解除成功となります。  解除ルーチン内で設定できる値は以下の通りです。 ○基礎確率  ベースとなる確率です。200分率で指定します。サンプルでは解除確率3割(60/200)=3C、1割(20/200)=14を指定しています。 ○能力値の修正  サンプルでは、◎能力ロード用サブルーチン[CC-CC]内で4A 4Aとしています。これで能力値の合計を4分の1にしています。4Aの数を増減すれば影響度を調節できます。この値は解除条件の基礎確率に加算されます。 ○眠りのHPチェック条件  眠りの解除では、HPチェック条件を半減していき、HPチェック条件以上の現在HPだったときにチェックを終了します。  眠りのHPチェック条件開始位置は最大HPの2分の1にしています。開始位置は4分の1に減らせます。文中を参照してください。  HPチェック条件開始位置より現在HPが低い場合、眠り解除条件を上方修正したあと、HPチェック条件をさらに半減してチェックを繰り返します。ルーチン内でチェックを繰り返す回数を指定できるようになっています。 ○マヒのHP条件  マヒの解除では、現在HPがHPチェック条件未満のときにチェックを終了します。HPチェック条件の開始位置と、チェックを繰り返すときのHPチェック条件加算値をそれぞれ設定できるようにしています。  現在HPがHPチェック条件以上のときは、マヒ解除条件を上方修正した後、HPチェック条件に設定したHPチェック条件加算値を加え、チェックを繰り返します。最大HPというチェック限界があるので、繰り返す回数の指定は省いています。 ○HP条件による修正値  眠り、マヒともに、HP条件のチェックを満たした場合、解除条件の値を増やして解除条件をゆるくしていきます。修正値は個別に設定できます。 === ◆敵側の解除ルーチン  構造はほぼ同じです。ロードアドレスなどが異なるので細かい部分が違ってきます。…味方と合わせてもっと圧縮できる部分を発見したりもしていますが、やりすぎるとストライのときのように混乱しますし、個別に設定する必要もあることですので、そのままとします。 □敵側行動時解除判定根幹部 331C1~331FF(63バイト):  A0 06 B1 9A 29 30 F0 48 85 E1  20 5E B0  20 83 BA 85 E0  A0 05 B1 9C 85 E3 85 E5  88 B1 9C 29 FE 85 E2 85 E4  A2 [任意] 20 26 F6       1B000領域を利用  A5 E0 F0 03 20 90 B1 A5 E1  48 A2 05 A9 00 95 E0 CA 10 FB 68  4C 8E B2 ○未使用化  331FE~33210(19バイト):00×19 ■1B000領域:  A9 20 24 E1 F0 03  4C [FF-FF]             敵側眠り解除ルーチン  4C [GG-GG]             敵側マヒ解除ルーチン ●敵側眠り解除ルーチン[FF-FF]  A9 [--3C(任意)] 85 E1      基礎確率を指定    ★味方と同じ仕様です。この値に能力値による修正とHP条件による修正を加えます  20 [HH-HH]           ◎敵能力ロード用サブルーチン  EA EA EA EA           開始条件調整用の空白、不要なら削除してください  A2 00  46 E3 66 E2  20 [II-II]              ◎敵HP比較用サブルーチン  B0 0C  A5 E1 18 69 [--02(任意)]    HP条件による修正値加算  85 E1  E8 E0 [--03(任意)] D0 EB    チェックを繰り返す回数  A5 E1 C5 E0 90 0A  (成功)  A9 DF 85 E0            DFで眠りを解除  A9 [0F] 85 E1           眠り解除用メッセージID     ★敵用のメッセージIDは、異常や回復用の追加メッセージIDが使われています  D0 08  (失敗)  A9 00 85 E0           解除失敗フラグ  A9 [02] 85 E1          眠り解除失敗用メッセージID  A9 0C 4C 03 FE        終了、復帰    ★他のA9 0C 4C 03 FEを流用してもOKです ◎敵能力ロード用サブルーチン[HH-HH]  A0 09 B1 9A 逃げやすさをロード  4A 4A 4A         8分の1  18 65 E1  90 02 A9 FF 85 E1 60 ◎HP比較用サブルーチン[II-II]  A0 03 B1 9A C5 E3 F0 01 60  88 B1 9A 29 FE C5 E2 60 ●敵マヒ解除ルーチン[GG-GG]  A9 [--14(任意)] 85 E1   基礎確率を指定   ★味方と同じ仕様です  20 [HH-HH]         ◎敵能力ロード用サブルーチン (HP条件増加量)  A2 00  46 E5 66 E4  E8 E0 [--02(任意)] D0 F7   ★味方と同じ仕様です。HPチェック条件を増やしていく幅を指定します。01で2分の1、02で4分の1、03で8分の1ずつ。 (※※↓の「◆敵側のマヒ解除ルーチンに微細な修正を加える」を追記する場合はこの位置に付け足す) (HP条件開始値)  A2 00  46 E3 66 E2  E8 E0 [--01] D0 F7   ★味方と同じ仕様です。HPチェック条件の開始位置を指定します。01で最大HPの2分の1、02で4分の1、03で8分の1から。  (ループ基点)  20 [II-II]                  ◎HP比較用サブルーチン  90 [--17]  A5 E1 18 69 [--02(任意)]       HP条件による修正値加算  85 E1  A5 E4 18 65 E2 85 E2  A5 E5 65 E3 85 E3  4C [-- --]                ループ基点に戻る  A5 E1 C5 E0 90 0A  (成功) A9 [EF] 85 E0             EFでマヒ解除  A9 [10] 85 E1            マヒ解除時のメッセージID  D0 08  (失敗)  A9 00 85 E0             解除失敗フラグ  A9 [01] 85 E1            マヒ解除失敗時のメッセージID  A9 0C 4C 03 FE           終了、復帰   ★他のA9 0C 4C 03 FEを流用してもOKです == ※この状態のままでは混乱からの復帰時にフリーズが発生する (報告:それをすてるなんてとんでもない! 氏) 原因なのですが、  33226~:A9 0D D0 [E4]  *注:以下全てヘッダ込み …という部分がありますよね。 ※※「◆敵側の解除ルーチン-□敵側行動時解除判定根幹部」の331C1~331FFの直後 このジャンプ先アドレスは1Bバイト戻って3320Eになるんですが、ここには元々、解除処理終了時の合流アドレスが記述されています。オリジナルは4C 8E B2です。 このジャンプ先アドレスを、改変後の同じコード=331FD:4C 8E B2にあわせればOKのはず。つまり、2Cバイト戻ればいいわけです。ですので、  33226~:A9 0D D0 [E4→D3] …で対応できると思います。 === ◆敵側のマヒ解除ルーチンに微細な修正を加える (※実質的にはほとんど必要ない修正)  試行を繰り返してみた過程で、こちらで確認できたフリーズ要因としましては、マヒのときのHP条件増加量が0になった場合がありました。  具体的には、最大HPが極端に低い場合に起こります。例えば、(敵のマヒ解除ルーチン内で)最大HPを8分の1して増加量としてある場合、敵の最大HPを7以下に設定するとループを抜け出せません。  ただし、この要因は最序盤でもなければ設定しない設定値ですので、そのままにしておいてもよいでしょう。もし、最大HP1の敵を設定したい! というような状況があるようでしたら、増加量が0のときに最低値を保障しておきます。 「●敵マヒ解除ルーチン[GG-GG]」内、(HP条件増加量)の部分の末尾に以下を付け加えてください。   A5 E4 D0 08 A5 E5 D0 04 A9 01 85 E4  ちょっと気になったので付け加えてみました。  設定値次第で放置でも問題ないところです。 ◆オリジナルにあるバグの修正◆ ●モンク系(素手時)がレベルアップ時に防御力の数値がおかしくなる  モンク系は装備がないときに特殊な処理が加わります。    武器がない=攻撃力をレベル×2の値に補正する    防具がない=防御力をレベルの値に補正する  通常、これらの処理はそれぞれ独立しているのですが、レベルアップのときだけは「武器がない」状態で処理を全てやってしまいます。防具をつけていても防御力がレベルの値に補正されるわけです。つまり条件設定ミスなんですね。オリジナルにあるバグのひとつです。  これを利用すると、リボン一丁装備した防御力の高いモンクなんて亜種が作れます。バランスブレイカーというほどでもなく、普通に便利なので直す気にならなくてw  条件を書き加えるだけなので、修正自体はそう難しくないと思います。 □モンクのレベルアップバグを修正  レベルアップ時のモンク専用ルーチンを1B000領域に移設し、レベルアップ時の条件を追加、整理しています。修正値そのものはオリジナルと同じです。 ○モンク特殊ルーチン開始 2D983~2D9A8(38バイト):  8A 48  A2 [--;任意] 20 26 F6  68 AA 60  00×28バイト(未使用になります) ●1B000領域 ○特殊処理本体  A0 18  20 [AA-AA]      武器防具IDロードへ移動          ★後述するサブルーチンのアドレスを記述してください。  90 0C  A0 26 B1 86      元のレベルをロード  18 69 01        +1  0A           2倍  A0 20 91 86      攻撃力に保存  A0 1C  20 [AA-AA]      武器防具IDロードへ移動  90 0B  A0 26 B1 86      元のレベルをロード  18 69 01        +1  A0 22 91 86      防御力に保存  A9 0B 4C 03 FE ○[AA-AA]:武器防具IDロード(サブルーチン)  A2 00 B1 86 30 08  C8 E8 E0 04 D0 F6  38 60  18 60 ======= ●モンク系がレベルアップ時に攻撃力の数値がおかしくなる  通常レベルアップではちからが偶数に達すると攻撃力が+1されます。モンクも武器を装備していれば同じ処理をしてそのまま反映されますが、装備の着脱による特殊処理のあと再び武器を装備すると、レベルアップのときと攻撃力が1だけ食い違ってしまいます。ちからを2分の1して加算するときにキャリークリアをしておらず、奇数分の+1が発生するようです(そのルーチンを通るのはモンク系のみ)。  元を断つのが一番よさそうです。 3EF92~3EF9C:  BD 10 61 4A 7D 20 61 9D 20 61 60  ↓  BD 10 61 4A [18] 7D 20 61 4C [-- --] ★後述の4バイトを記述したアドレスを入れてください  …とし、適当な隙間に、  9D 20 61 60(4バイト)  …と記述してください。