ゲーム部分のプログラムについての説明 dm_game_main.c // プログラム本体 dm_game_main.h // ヘッダーファイル 行番号は 説明用dm_gamee_main.c を基準にしています。 説明用dm_gamee_main.c のコメントも平行してみて下さい。 ifdef DM_DEBUG_FLG #endif で囲われている部分はデバック用なので、説明しません。 *前説 game_state型について evsworks.hに定義されています。大まかな説明はそちらを見て下さい。 game_state型 は、ゲーム中の個人(各プレイヤー)の状態を制御するためのものです。 game_condition と game_modeに付いて詳しく説明します。 game_condition[4] はプレイヤーの状態を保持します。 game_condition[dm_mode_now(配列の0)]には現在の状態が入ります。 WIN、LOSE などの表示の区別もこの中身で制御しています。 game_condition[dm_mode_old(配列の1)]にはポーズ時、ポーズ前の状態が入ります。 ポーズ解除の時に、この中身が game_condition[dm_mode_now(配列の0)] にはいります。 game_condition[dm_training_flg(配列の2)]には、練習中の場合、0以外の数値が入るようになっています。 game_condition[dm_static_cnd(配列の3)]には、絶対的な状態がはいります。 dm_cnd_wait(通常), dm_cnd_pause(ポーズ), dm_cnd_game_over(ゲームオーバー), dm_cnd_win(勝利), dm_cnd_lose(敗北)しか、入りません。 基本的に、判定用に利用されます。 game_mode[2] はプレイヤーの処理を保持します。 game_mode[dm_mode_now(配列の0)]には現在の状態が入ります。 WIN、LOSE などの処理の区別もこの中身で制御しています。 game_mode[dm_mode_old(配列の1)]にはポーズ時、ポーズ前の状態が入ります。 ポーズ解除の時に、この中身が game_mode[dm_mode_now(配列の0)] にはいります。 *ソース説明 ------------------------------------------------------------------------------------------------------------------------------------ void dm_score_make( game_state *state,u8 type ) 行番号 593 〜 618行 得点計算を行う関数 type が1の時はゲームレベルを、0の時はゲームスピードを基準に得点の計算をする。 state -> erase_virus_count には、消したウイルス数が入っている。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_level_score_make( game_state *state ) 行番号 620 〜 682行 レベルセレクトの得点表示の初期設定を行う関数 628行 まず座標用変数 lv_sv_pos[i] が使用中か調べる。 使用中で無い場合、各設定を行う。 629行 制御番号の設定。 630行 使用フラグの設定。 631行 実際に加算する得点のクリア。 633 〜 635行 下に落下する移動値の設定。 637 〜 644行 加算する得点の計算。 646 〜 677行 表示する数字番号の設定 lv_sv_pos[i].num_max 表示桁数 lv_sv_pos[i].num_g[?] 表示する数字(1桁) lv_sc_pos[i].score_pos[j][0] X座標 lv_sc_pos[i].num_alpha[j] 透明度 lv_sc_pos[i].num_alpha_flg[j] 透明処理のフラグ ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_level_score_main( game_state *state ) 行番号 687 〜 751行 レベルセレクトの得点表示中の処理を行う関数 692行 まず座標用変数 lv_sv_pos[i] が使用中か調べる。 693 〜 748行 使用中の場合、lv_sc_pos[i].mode の値に基ずき、各処理を行う。 lv_sc_pos[i].mode が 1 の場合、数字が浮かび上がる処理。表示分全て浮かび上がったら次の処理に移行する。 lv_sc_pos[i].mode が 2 の場合、数字が落下する処理。 722 〜 727行 ひとつ上の桁の移動値が4以下にならないと、落下しないようになっている。 714 〜 720行 1番上の桁なので判定はしていない。 734 〜 746行 全ての数字が落下し終わったら、実際に得点を加算する処理。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_attack_se( game_state *state ,u8 player_no ) 行番号 778 〜 803行 攻撃SEの設定を行う関数 785行 連鎖数が2以上のときに鳴らす。 786 〜 801行 ゲームモードによって鳴らす音を変える。 795 〜 799行 4Pモードは、攻撃相手によって音が替わる。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_warning_h_line( game_state *state,game_map *map ) 行番号 807 〜 832行 積み上げすぎの警告音を設定する関数 811 〜 821行 まず瓶の上3段を調べる。 823 〜 829行 何か有った場合、一度警告音を鳴らしているか調べ、鳴っていなかったら警告音を鳴らす。 830行 何も無かったら、連続鳴り防止用ビットを消す。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 set_down_flg( game_map *map ) 行番号 834 〜 936行 瓶の中身の落下情報を設定する関数 843 〜 845行 まず再下段以外の全ての落下フラグを立てる。 847 〜 922行 表示されていないもの、落下できないもの、ウイルスとうの落下フラグを消去する。 924 〜 935行 落下フラグの状況を調べ、返す。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void go_down( game_state *state,game_map *map ,u8 cout) 行番号 937 〜 1012行 粒落下関数 951 〜 965行 一定時間( 14イント )経過したら、カプセルを落下させる。 落下フラグが立っている物の内容を1段下にコピーして、コピー元のデータを削除する。 967 〜 969行 1つでも、落下するものが有った場合、SEを鳴らす。 971 〜 990行 リタイア状態(トレーニング中)の場合、カプセル等を暗くする。 993行 落下フラグを再設定する。 955 〜 1010行 落下終了の場合。 956行 消滅判定を行う。(判定をするだけで消滅の設定行わない) 957 〜 1002行 消滅が有った場合の設定を行う。 state -> game_mode[dm_mode_now] に 消滅判定と消滅設定を行うように設定する。 1003 〜 1008行 消滅が無かった場合の設定を行う。 state -> game_mode[dm_mode_now] に 新しいカプセル設定を行うように設定する。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void erase_anime( game_map *map ) 行番号 1014 〜 1037行 消滅アニメーション進行関数 1021 〜 1036行 瓶の中を調べ、表示中で消滅フラグの立っているもののグラフィック番号を進める。 ある一定コマ進んだ場合、瓶の情報を削除する。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void translate_capsel( game_map *map,game_state *state,s8 move_vec,u8 joy_no) 行番号 1039 〜 1121行 操作カプセルの左右移動関数 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void rotate_capsel( game_map *map,game_cap *cap,s8 move_vec ) 行番号 1122 〜 1191行 操作カプセルの左右回転関数 カプセルを回転させる関数。カプセルが横の場合左側、縦の場合下が回転の軸となる。 回転は、グラフィック番号の入れ替えと、座標変換行っている。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_make_magazine( void ) 行番号 1193 〜 1209行 落下カプセルの配列作成関数 どのゲームモードでも、この配列から操作カプセルを作る。 上位4ビットの値を3で割ったあまりが、左カプセルの色になる。 下位4ビットの値を3で割ったあまりが、右カプセルの色になる。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_init_capsel( game_cap *cap,u8 left_cap_col,u8 right_cap_col ) 行番号 1210 〜 1224行 操作カプセルの初期設定を行う関数 落下フラグを立てない。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_init_capsel_go( game_cap *cap,s8 left_cap_col,s8 right_cap_col ) 行番号 1225 〜 1232行 操作カプセルの初期設定を行う関数 内部で dm_init_capsel を呼び出し初期設定を行い、落下フラグを立てる。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_set_capsel( game_state *state ) 行番号 1234 〜 1247行 マガジンから操作カプセルとNEXTカプセルを作成する関数 1240行 新しい操作カプセルを設定する。 1241 〜 1244行 NEXTカプセルのマガジン位置を設定する。 1246行 NEXTカプセルを設定する。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_capsel_speed_up( game_state *state ) 行番号 1248 〜 1262行 カプセルの落下速度を上昇させる関数 カプセルの落下数をカウントし、10個落下させるたびに速度を上げていく。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_capsel_down( game_state *state,game_map *map ) 行番号 1264 〜 1375行 操作カプセルの落下処理を行う関数 1276 〜 1292行 state -> cap_speed_max に落下させるためのカウンタ値を計算している。この値を越えたときに、1段下がる。 1294行 カウンタにstate -> cap_speed_vec を加算する。state -> cap_speed_vec は通常1だが、キーが 下に入っていると、数値が増加し、早く落下するようになる。 1295 〜 1363行 操作カプセルの落下処理をしている。 1300 〜 1320行 操作カプセルの下に、何か有った場合、落下フラグを削除する。ただし、落下開始時(瓶の外)の場合は、 無視される。 1322 〜 1328行 操作カプセルが再下段に来たので、落下フラグを削除する。 1331 〜 1348行 操作カプセルの落下処理を行う。 1338 〜 1347行 操作カプセルが落ちた場所に何か有った場合(最上段でしかおきない)ゲームオーバーの設定を行う。 1349 〜 1360行 着地した場合の処理を行う。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_check_game_over( game_state *state,game_map *map ) 行番号 1365 〜 1375行 ゲームオーバーになっているか判定する関数 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_set_virus( game_state *state,game_map *map,virus_map *v_map,u8 *order ) 行番号 1377 〜 1430行 ウイルスを配置する関数(1イントにつき、1匹) 1386行 初期化状態か判定する。 1388 〜 1395行 設定するウイルス数を割り出す。 1397 〜 1405行 転送するウイルス配列番号を割り出す。転送した場合、0xffが入る。 1418行 瓶にウイルス情報を設定する。 1422 〜 1429行 ウイルス出現完了の判定。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_virus_anime( game_state *state,game_map *map ) 行番号 1431 〜 1464行 ウイルスアニメーション関数 一定間隔を取ってウイルスのアニメーションを進める。 state -> virus_anime_spead の値は、ゲームオーバー(積みあがり)の時に小さくなり、アニメーションが早くなる。 state -> virus_anime_vec はアニメーションの進行方向を指していて、state -> virus_anime_max より大きくなると反転する。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_capsel_erase_anime( game_state *state,game_map *map ) 行番号 1465 〜 1484行 ウイルス(カプセル)消滅関数 一定時間経つごとに消滅アニメーションを進行させる。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_make_erase_h_line( game_state *state,game_map *map,u8 start,u8 chain,u8 pos_x ) 行番号 1487 〜 1508行 縦消し化処理関数 縦消し判定の関数から呼び出される。start の位置から chain の個数分、縦方向に消滅フラグを立て、 グラフィックを消滅の1段階目に設定する。その際に、消滅したウイルス数も加算している。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_h_erase_chack( game_map *map ) 行番号 1509 〜 1561行 縦消し判定関数 縦消しの判定を行う関数。判定しか行わず、1列でも消えた場合、すぐ終了する。 消滅列が有った場合、1を返す。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_h_erase_chack_set( game_state *state,game_map *map ) 行番号 1562 〜 1635行 縦消し判定と消滅設定関数 縦消しの判定を行い消滅列が有れば、消滅設定も行う関数。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_make_erase_w_line( game_state *state,game_map *map,u8 start,u8 chain,u8 pos_y ) 行番号 1636 〜 1658行 横消し化処理関数 横消し判定の関数から呼び出される。start の位置から chain の個数分、横方向に消滅フラグを立て、 グラフィックを消滅の1段階目に設定する。その際に、消滅したウイルス数も加算している。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_w_erase_chack( game_map *map ) 行番号 1659 〜 1712行 横消し判定関数 横消しの判定を行う関数。判定しか行わず、1列でも消えた場合、すぐ終了する。 消滅列が有った場合、1を返す。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_w_erase_chack_set( game_state *state,game_map *map ) 行番号 1714 〜 1787行 横消し判定と消滅設定関数 横消しの判定を行い消滅列が有れば、消滅設定も行う関数。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_h_ball_chack( game_map *map ) 行番号 1788 〜 1821行 縦粒化判定処理関数 縦方向にカプセルを調べ、半分になっているカプセルをボールに設定する関数 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_w_ball_chack( game_map *map ) 行番号 1826 〜 1849行 横粒化判定処理関数 横方向にカプセルを調べ、半分になっているカプセルをボールに設定する関数 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_black_up( game_state *state,game_map *map ) 行番号 1850 〜 1879行 ゲームオーバーの時の暗くなる処理関数 1857行 リタイア( 積みあがり )状態になっていて、暗くなる処理を行っていない場合か判定する。 1864 〜 1870行 state -> work_flg(Y座標)で表示されているものを暗くする。 作業中 なら 0 処理終了なら 1を返す。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_broken_set( game_state *state ,game_map *map ) 行番号 1880 〜 1959行 やられ設定関数 1893行 state -> cap_attack_work[0][0] が 0x0000 以外の場合、攻撃をうけたことになる。 1896 〜 1898行 攻撃を受けたため、それまでの消滅ウイルス数などがクリアされる。 1904 〜 1910行 攻撃カプセルを粒カプセルとして設定する。 cap_attack_work[0][0] の 2ビットが色情報と攻撃位置をあらわす。 16 ビット 0 ビット ↓ ↓ 00 00 00 00 00 00 00 00 0 1 2 3 4 5 6 7 <- 落下X座標 1913 〜 1924行 やられ情報のシフトを行い、やられていた場合 1を返す。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ u8 dm_make_attack_pattern( u8 max ) 行番号 1960 〜 1996行 攻撃X座標を計算する関数 max(攻撃カプセル数(最大 4 ))をもとに、攻撃カプセルのX座標を計算し、ビットを立てて返す関数。 カプセルが隣にならば無いようにしている。 8 ビット 0 ビット ↓ ↓ 0 0 0 0 0 0 0 0 01234567 <- 落下X座標 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_attack_set_2p( game_state *state ,u8 player_no ) 行番号 1998 〜 2051行 攻撃設定関数( 2P用 ) 2020行 2列以上消していた場合設定する。 2022 〜 2024行 攻撃カプセル数の判定。(4個以上は落とせない) 2026行 攻撃X座標の計算。 2028 〜 2047行 攻撃の設定を行う。(但し、すでに2回攻撃が設定されている場合は攻撃しない) 2030行 攻撃したプレイヤー番号( 0 か 1)を設定する。(バブルの色になる) 2032 〜 2043行 攻撃X座標をもとに、消した色を設定する。 攻撃した場合 1を、しないばあい 0 を返す。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_attack_set_4p( game_state *state ,u8 player_no ,s8 *c_r,s8 *c_y, s8 *c_b ) 行番号 2053 〜 2200行 攻撃設定関数( 4P用 ) 2080行 2列以上消していた場合設定する。 2083 〜 2086行 攻撃カプセル数の判定(4個以上は落とせない)と攻撃X座標の計算。 2088 〜 2151行 攻撃設定部分 2089行 攻撃相手を決める部分 state -> chain_color[3] の 下位3ビットには、最初に消した色のビットが立つようになっている。 ちなみに 0x01 が青 0x02 が黄 0x04 が赤。 2091行 消した色をもとに、攻撃相手のステータス情報の持ってくる。( ポインタで指す ) 2092行 同じチームか判定していて同じチームならば攻撃しない。チーム対抗戦の場合、player_state[PS_TEAM_FLG] に 0か 1が入る。 チーム対抗戦で無い場合、0 〜 3 の値が入っていて、必ず攻撃する。 2093 〜 2101行 リタイアしていなかったら設定。リタイアしていても、練習中で(enemy_state -> game_condition[dm_training_flg] が 1)、 攻撃有りの場合( enemy_state -> retire_flg[dm_training_flg] が 1)設定。 2102行 前判定の部分で攻撃するになっていた場合 flg = 1。 2104 〜 2121行 攻撃座標の再設定を行う。チーム対抗戦以外でも通るが、ストックに補充されないので無意味。 攻撃カプセル数が4個の時は、とくになにもしない。 3個以下の時、自分のチームのストックカプセルを調べて、攻撃カプセルに加算する。 story_4p_stock_cap[A(4)][B(4)]にストックカプセルが入っている。Aは人数分とってあるが 攻撃として使うのは、0 か 1のみ。Bには、ストックカプセルの色の数値( 0 〜 2 )が入っている。 何も入っていない場合は -1。 ごちゃごちゃして分かりずらいが、消した色の数を追加している。 state -> chain_color[ story_4p_stock_cap[story_4p_name_flg[ state -> player_state[PS_TEAM_FLG]]][j] ]++; ↑ ↑ ↑ ↑ ↑ 消した色の数 ストックカプセル 現在意味が無い チーム番号 ストック部分 ( 配列番号がそのまま入っている) 2125 〜 2146行 実際に攻撃を設定している部分。(設定部分覇は2Pと同じ) 2Pの時と違い、最大 DAMAGE_MAX(現在は16)連続攻撃を設定できる。 2127 〜 2129行 攻撃した相手に、エクスクラメーションマーク表示の初期化を行う。 2152 〜 2163行 ストックカプセルのシフト。(並び換えとクリア) 2165 〜 2190行 ストックカプセルの作成。攻撃相手が自分の味方(同じチーム)の場合、 攻撃カプセルが、ストックにまわされる。(判定は、攻撃と同じ) 返り値は、c_r,c_y,c_bに(赤、黄、青)のそれぞれの色に対応した相手を攻撃した場合、1を入れる。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_game_main_cnt_1P( game_state *state,game_map *map,u8 player_no ,u8 flg ) 行番号 2201 〜 2642行 1PLAY(レベルセレクト)用個人制御関数 2227 〜 2235行 ポーズ受付処理を行っている。 state -> game_condition[dm_static_cnd]( 絶対的状態 )が dm_cnd_wait( 通常状態 )か dm_cnd_pause( ポーズ状態 )で state -> game_condition[dm_mode_now]( 現在の状態 )が dm_cnd_init( ウイルス配置中 )でない場合、dm_ret_pause( ポーズ要求を返す ) 2239 〜 2252行 コインのアニメーション制御を行っています。 dm_retry_coin_pos[i].flg が0の時は、普通の処理をします。 アニメーションは4パターンで、4コマ目まで行くと1コマにもどります。 2255 〜 2299行 通常状態の時に行う処理。 2257行 得点のアニメーションの処理。 2259 〜 2264行 時間計算をしている。story_time_flgは、ウイルス配置終了後に1になる。 2266 〜 2281行 巨大ウイルスのアニメーションが消滅アニメーションだった場合の処理をしている。 また、3匹のうち1匹でも通常アニメーションでない場合、フラグを立てるようになっている。 ただし、非表示(消滅した場合)の時は、無視される。 2282 〜 2297行 上記の処理で、フラグが立っていなかった場合、円を描く処理を行う。 2302 〜 2640行 内部処理部分。game_mode[dm_mode_now] の値によって処理を行う。 2304行 ウイルス配置。配置が終了すると dm_set_virus 関数内で game_mode[dm_mode_now] が dm_mode_wait に設定される。 2309 〜 2316行 カプセルが放物線を描く処理のカウントを進めている。瓶内に入ったら操作カプセルに切りかえる処理を行い game_mode[dm_mode_now] を dm_mode_down に切りかえる。なお、dm_mode_downの処理は別の部分で行っている。 2318 〜 2334行 dm_mode_down の処理が終了後、この処理になる。2319行で積みあがりゲームオーバーのチェックを行い、 ゲームオーバーだったら、巨大ウイルスのアニメを変更し、dm_ret_game_over を返す。 ゲームオーバーでない場合は、消滅判定を行い、消滅が有った場合は、game_mode[dm_mode_now] を dm_mode_erase_chack(消滅設定) にする。無かった場合、dm_mode_cap_set( 新カプセル設定 )にする。 2335 〜 2416行 消滅の設定をおこなっている。クリアでない限り、次は dm_mode_erase_anime (消滅アニメーション処理)になる。 2342 〜 2345行 消滅の設定とそれに伴う粒化の処理をしている。 2349 〜 2366行 残りウイルス数の取得と巨大ウイルスのアニメションの設定を行っている。 2370 〜 2395行 残りのウイルス数によって、0の場合クリアの設定、3以下の場合、リーチ音を鳴らす設定と BGMの速度アップの設定を行っている。 2397 〜 2414行 消滅列数によってSEを変える処理と得点計算をしている。 2418行 消滅アニメーションの進行制御を行っている。 消滅アニメーションが終了すると、game_mode[dm_mode_now] が dm_mode_ball_down に設定される。 2420行 カプセル( 粒 )落下処理。go_down 関数内部で、落下が終了したときに、消滅判定をしている。 その結果によって 再度、消滅設定処理か、dm_mode_cap_set (新カプセル設定)処理を行うことになる。 2423 〜 2449行 新カプセルの設定などをしている。この時点で、消滅に関する変数のクリアや 積みあがり警告音の判定、攻撃SE(1PLAYなのでマリオの声)を鳴らす処理、 アニメーションの設定(仮)を行っている。 2432 〜 2434行 CPU(デモ用)の場合は、思考開始フラグを立てる処理を行っている。 2450 〜 2484行 コイン獲得のデモの計算と、ステージクリアデモの処理を行っている。 コイン獲得のみの処理はないので、区切りが無い。 コイン獲得の処理は、dm_retry_coin_pos[dm_retry_coin - 1].move_vec[0] の値が Y方向の移動値になっていて 最初は -1 (上に上がる) が入っているが、途中で 1 (下がる) に替わる。 ステージクリア演出は try_next_stage_main()の中で座表計算が行われている。 返り値が0以上の時に、キー受付を開始する。 2485 〜 2523行 ゲームオーバーの演出計算とリトライの処理をしている。 dm_retry_flg は、ゲームオーバーになったときに、判定され、リトライ可能であれば 1 、できなければ0が入る。リトライをした場合、コイン使用の条件ならば、コイン使用の デモに行くようになっている。 リトライが出来なかった場合は、dm_ret_end( ゲーム終了 )を返す。 また、リトライの場合 dm_ret_retry( リトライ ) を返す。 2524 〜 2543行 コイン使用のデモ コインのY座標を減少させていき、一定値移動させたら消して dm_ret_retry( リトライ ) を返す。 2546 〜 2640行 ポーズに関する処理を行っている。基本的には、ポーズ演出の計算がメイン。 その他に、リトライのキー受付もしている。 返り値は、処理が無い場合 0 それ以外は何かしらの値( クリア、ゲームーオーバー )等の値が返る。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_game_main_cnt( game_state *state,game_map *map,u8 player_no ,u8 flg ) 行番号 2644 〜 3176行 2PLAY & 4PLAY (多人数用)個人制御関数 dm_game_main_cnt_1P と処理が重なる(同じようなことをしている)ものがあるので、 説明を簡略しているものがあります。 2665 〜 2672行 キー情報を取得している。 flg が1の時は、2PLAY(VSCOM,VSMAN)の場合で、コントローラーの刺さっている 物のキー情報を取得する。 (例えば、ポート2と4にコントローラーがある場合、ポート2のコントローラーがメイン(1P)、ポート4のコントローラーが2Pとして扱われる) flg が 2の時は、4PLAY の場合で、コントローラの刺さっている場所の情報を取得する。 例 2PLAYの場合 4PALYの場合 ポート1 ポート1 1P ポート2 ---- C 1P ポート2 ---- C 2P ポート3 ポート3 ---- C 3P ポート4 ---- C 2P ポート4 ---- C 4P 2677 〜 2696行 ポーズ要求の処理。 2709 〜 2711行 積みあがったときに下から黒くなっていく処理。 2713 〜 2718行 通常時に行う演出の計算。バブルの処理、くらい演出の処理(4PLAY)、ハミング演出の処理(4PLAY)をやっている。 2737 〜 3197行 内部処理部分。game_mode[dm_mode_now] の値によって処理を行う。大部分が dm_game_main_cnt_1P とやっていることが似ているので 別のことをしているところの説明をします。 2745 〜 2762行 積みあがりゲームオーバーの判定をしている。1Pの時と違うのは、消滅判定後の処理で、リタイアしていて練習中の場合があること。 練習中はそれに応じた処理を行うようにしている。 2800 〜 2840行 ゲームモードによってSE(カプセル消滅音)の設定している。4PLAYの時は、ハミング処理の初期設定を行っている。 2854 〜 2888行 各モード別に設定をしている。 2858・2877行 各モード別の攻撃設定を行っている。2PLAYの場合、関数の返り値( i )が攻撃したか判別になっている。2PLAYの場合 攻撃した場合、攻撃アニメーションを設定している。 4PLAY の場合 attack_col[] に攻撃したのか判別する値が入る。1だったら攻撃した、0だったら攻撃しなかった。 2862・2878行 バブル演出の初期設定を行っている。 2863 〜 2873行 やられ判定を行っている。攻撃を受けていた場合、処理を粒落下に変更する。2PLAY の時は、アニメーションを強制的にダメージに設定する。 ai.aiState は AI処理用のフラグで、攻撃を一回受けた時には AIF_DAMAGE、2回目の時にはAIF_DAMAGE2 を立てるようになっている。 2912 〜 2980行 WIN・LOSE・DRAW とリトライの演出計算とキー受付をしている。 2980 〜 2987行 練習受付処理を行っている部分。 2987 〜 3032行 練習前の設定を行っている。各変数のクリアと設定、瓶の情報のクリア等を行う。 3033 〜 3051行 練習中の消滅設定を行っている。 3052 〜 3083行 練習中の新カプセルの設定を行っている。練習選択で攻撃有りを選んだ場合、retire_flg[dm_training_flg] が1になっていて、 ここで、攻撃設定とやられ判定を行っている。攻撃無しを選んだ場合、自分の被爆カプセルをクリアしている。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_game_main_1p(void) 行番号 3179 〜 3303行 ゲーム処理関数 1PLAY(レベルセレクト用) 3188行 dm_game_main_cnt_1Pを呼び出し、その返り値によって処理・判定を行う。 3189 〜 3192行 マリオ・巨大ウイルスのアニメーションの進行を行う。 3194 〜 3203行 ゲームクリア・ゲームオーバー時に、一定時間立つとアニメーションを再スタートさせている。 3205 〜 3214行 ウイルス配置が終了していって一定時間のウェイトをを取っている。ウイルス数による 落下開始時間のばらつきをなくすため。 3214 〜 3237行 ポーズ要求に対する処理を行う。通常時からポーズに移行する場合、リトライ可能か判断し、フラグの設定を行う。 3238 〜 3271行 クリアに対する処理を行う。コイン獲得の判定を行い、獲得した場合、コイン獲得デモに行くように設定する。 マリオのアニメーションを勝利アニメーションに変更する。 3271 〜 3292行 ゲームオーバーに対する処理を行う。リトライ可能か判断し、フラグの設定を行う。 3292 〜 3298行 ゲーム終了や次のステージ等の場合は、そのまま返り値となる。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_game_main_2p(void) 行番号 3304 〜 3731行 ゲーム処理関数 2PLAY用(VSCOM,VSMAN(STORY)) 3317 〜 3324行 dm_game_main_cnt を呼び出し、その返り値によって処理・判定を行う。アニメーションの進行も行っている。 3325 〜 3336行 勝敗決定後、一定時間立つとアニメーションを再スタートさせている。 3339 〜 3348行 ストーリーモードの時に時間のカウントを行う。story_time_flg は、ウイルスの配置が完了し、落下が開始した 時に1になる。 3350 〜 3373行 ウイルス配置が終了していって一定時間のウェイトをを取っている。ウイルス数による 落下開始時間のばらつきをなくすため。又、CPUの場合は、思考を開始するフラグを立てている。 3373 〜 3386行 ふたり同時に積みあがった場合の設定をしている(DRAW)。game_condition[dm_mode_now] の値は、表示関係で、 CPU の場合は dm_cnd_draw (DRAW のみ) ,人の場合は、dm_cnd_draw_any_key( DRAW と PUSH_ANY_KEY )の表示になる。 3388 〜 3448行 2回ループをまわし、各個人の dm_game_main_cnt の返り値に対する処理を行う。 その後、WIN,LOSE,のフラグが立っていた場合、判定の処理を行う。 3389 〜 3393行 絶対的状態を勝利に設定し、各設定を行う。 3393 〜 3402行 絶対的状態を敗北に設定し、各設定を行う。また、連鎖表示を強制的に終了させている。 3402 〜 3441行 ポーズの設定をしている。ポーズの場合、両方とも設定されるので、2回ループの途中でも抜ける。 ストーリーモードの得点表示を行うモードにする。evs_one_game_flg は、ストーリーモードの面セレクトの 場合に1になる。 3442 〜 3449行 ゲーム終了や次のステージ等の場合は、そのまま返り値となる。 3451 〜 3596行 クリアがあった場合の処理(判定を行っている)。 3453 〜 3457行 クリア人数を調べている。もしかすると、2人同時クリアの場合があるので判定をしている。 3459 〜 3494行 勝敗時の音楽の設定をしている。勝者の win_count を追加。 音楽の割り振りは次のようになる。 ストーリーモードの場合、プレイヤーが勝つと SEQ_Win,プレイヤーが負けると SEQ_Lose。 VSCOM の場合、プレイヤーが勝つと SEQ_Win,プレイヤーが負けると SEQ_Lose。どちらかが3本取ったら SEQ_VSEnd。 VSMAN の場合、どちらが勝っても、 SEQ_Win,どちらかが3本取ったら SEQ_VSEnd。 3495 〜 3719行 勝敗による設定。(ソースのコメントを見てもらったほうが早い。) ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_game_main_4p(void) 行番号 3728 〜 4148行 ゲーム処理関数 4PLAY用 3741 〜 3745行 dm_game_main_cnt を呼び出し、その返り値によって処理・判定を行う。 3747 〜 3759行 ストーリーモードの時に時間のカウントを行う。 3763 〜 3778行 ウイルス配置が終了していって一定時間のウェイトをを取っている。ウイルス数による 落下開始時間のばらつきをなくすため。又、CPUの場合は、思考を開始するフラグを立てている。 3789 〜 3865行 4回ループをまわし、各個人の dm_game_main_cnt の返り値に対する処理を行う。 その後、WIN,LOSE,のフラグが立っていた場合、判定の処理を行う。 3794 〜 3815行 ゲームーオーバー時の設定をしている。2PLAY と違う点は、プレイヤーの場合、練習確認に行くようにしているところ。 3854 〜 3864行 練習に関する設定を行っている。違いは、retire_flg[dm_training_flg] が違うところ。 練習のみの場合0、攻撃もする(攻撃される)場合は1になる。 game_condition[dm_training_flg] は、練習してます等の看板を表示させるため。 3868 〜 4144行 WIN、LOSE等のフラグの状態によって勝敗判別を行う。(ソースのコメントを見てもらったほうが早い。) ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_game_demo_1p(void) 行番号 4151 〜 4192行 ゲームデモ処理関数(1P用) 1PLAY時のデモに関する処理。基本的に一人用の処理と一緒。 プレイヤーの替わりにCPUにして一定時間経過するか、キー入力があった場合終了する。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_game_demo_2p(void) 行番号 4194 〜 4241行 ゲームデモ処理関数(2P用) 2PLAY時のデモに関する処理。基本的に2人用の処理と一緒。 プレイヤーの替わりにCPUにして一定時間経過するか、キー入力があった場合終了する。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ s8 dm_game_demo_4p(void) 行番号 4242 〜 4286行 ゲームデモ処理関数(4P用) 4PLAY時のデモに関する処理。基本的に4人用の処理と一緒。 プレイヤーの替わりにCPUにして一定時間経過するか、キー入力があった場合終了する。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_map_draw(game_map *map,u8 col_no,s16 x_p,s16 y_p,s8 size) 行番号 4287 〜 4305行 ゲームマップ描画関数 瓶の中身を描画する関数。表示フラグが立っていって、アイテムの色が同じだった場合描画する。 ウイルス等のテクスチャデータは、予め、ロードされている。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_star_draw(s16 x_pos ,s16 y_pos, u8 win ,s8 flg) 行番号 4306 〜 4325行 勝利数(☆)描画関数 flg が 0の時横に並び、1の時縦に並ぶ。 win_anime_count[0] がアニメーションの番号。 この関数を呼ぶ前に、テクスチャデータとパレットデータを読み込んでおく。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void throw_rotate_capsel( game_cap *cap ) 行番号 4328 〜 4357行 投げ状態カプセル左回転関数 レベルセレクトの時に、カプセルが放物線を描く時にカプセルを回転させる関数。 ゲーム中の物は、瓶情報との判定があるため、使用できない。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_disp_virus_number( game_state *state,s16 x_pos, s16 y_pos,s8 player_no ) 行番号 4362 〜 4405行 ウイルス数描画関数 現在のウイルス数を描画する関数。内部で中央寄せを行っている。 なお、3個以下になると、赤パレットを読み込み、拡大縮小を行うようになっている。 この関数を呼ぶ前に、テクスチャデータを読み込んでおく。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_disp_number( s16 num,s16 x_pos, s16 y_pos ,u16 *pal) 行番号 4406 〜 4425行 数字描画関数 この関数を呼ぶ前に、テクスチャデータを読み込んでおく。 (ウイルス数と同じグラフィック) ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_disp_score( u32 score,s16 x_pos, s16 y_pos ) 行番号 4427 〜 4452行 得点描画関数 (得点と同じグラフィック) ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_disp_score_plus( game_state *state ) 行番号 4453 〜 4481行 SCORE 文字付き得点描画関数 ストーリーモード時にポーズを押したとき、得点を表示するときに使用。(得点と同じグラフィック) ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_disp_point( s16 point,s16 x_pos, s16 y_pos ) 行番号 4482 〜 4501行 ポイント描画関数( VSCPU ,VSMAN ) この関数を呼ぶ前に、テクスチャデータとパレットデータを読み込んでおく。(得点と同じグラフィック) ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_disp_add_score( void ) 行番号 4502 〜 4527行 加算得点描画関数 レベルセレクトの時、加算される得点の表示関数。(落下していく数字) この関数を呼ぶ前に、テクスチャデータとパレットデータを読み込んでおく。(得点と同じグラフィック) ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_disp_time( u32 time,s16 x_pos, s16 y_pos ) 行番号 4530 〜 4563行 時間描画関数 この関数を呼ぶ前に、テクスチャデータを読み込んでおく。(ウイルス数と同じグラフィック) ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_disp_time_4p( u32 time,u8 level ) 行番号 4565 〜 4610行 ストーリー4P時用 時間・レベル・ステージ 描画関数 ストーリーモードの4PLAY時(テレサステージ)で画面の上部に時間・レベル・ステージ等を一括して描画する関数。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_4p_game_face_draw( game_state *state,s16 x_pos,s16 y_pos ) 行番号 4613 〜 4625行 4PLAY 用顔描画関数 小さい顔を描画する関数。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_speed_draw( game_state *state,s16 x_pos,s16 y_pos ) 行番号 4627 〜 4637行 1PLAY 用速度描画関数 ゲーム速度を描画する関数 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_game_graphic_p( game_state *state, game_map *map ) 行番号 4639 〜 4708行 各プレイヤーの瓶情報描画関数 4649行 ポーズ中か判断し、ポーズ中の場合、描画しないようにしている。 4650 〜 4652行 アイテム( カプセル等 )の大きさの識別。グラフィックロードに使用する。 4661 〜 4665行 アイテムの描画。パレットを読み込み、そのパレットと同じ色の物を描画する。 4669 〜 4690行 操作カプセルの描画。ただし、ここで描画されるのは、勝敗が決まったときのみで、ゲーム中の カプセル描画は、違うところで行っている。 4692 〜 4706行 NEXTカプセルを描画する。ただし、操作カプセルがNEXTの位置にあったばあい( 消滅処理中など) 描画しない。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_game_graphic_1p( game_state *state, game_map *map ) 行番号 4710 〜 4762行 各プレイヤーの瓶情報描画関数( 1PLAY用 ) 各プレイヤーの瓶情報描画関数とやっていることはほぼ同じ。 違うところは、アイテムの描画のループ回数( 1PLAY の時は、ゲームオーバーでも暗くならないため )と 操作カプセル描画の部分。操作カプセル描画は、一投めのネクストカプセルの位置にあるときのみ 描画するようになっている。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void retry_draw( game_state *state ,s8 palyer_no ) 行番号 4763 〜 4799行 リトライ選択描画関数 リトライを選択するため台を描画する。dm_retry_flg の値によってパレットを読み替えて表示するようになっている。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void demo_story_4p_main(void) 行番号 4800 〜 4799行 4PLAY時のチーム分け表示の処理関数 story_4p_demo_flg[1]で制御している。チーム対抗戦の時に使用される関数。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void demo_story_4p_draw(void) 行番号 4837 〜 4895行 4PLAY時のチーム分け表示の描画関数 story_4p_demo_flg[1]で制御している。demo_story_4p_main 関数で計算した数値を基に顔の描画等を行。 チーム対抗戦の時に使用される関数。ストーリーモードの時は青でMARIO・ENEMYと表示される。 それ以外のモードは黄色でTEAM A・TEAM Bと表示される。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void draw_target( game_state *state,u8 player_no ) 行番号 4896 〜 4940行 攻撃相手描画関数 4Pプレイ時にスタートボタンを押したときに表示される攻撃相手の描画。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_game_graphic_effect( game_state *state,u8 player_no,u8 type ) 行番号 4941 〜 5066行 演出描画関数 game_condition[dm_mode_now] の値を基に、WIN、LOSE等の描画をする関数。 なお、通常時は、バブルやハミングなどを描画するようになっている。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_draw_capsel( game_state *state ,u8 player_no ) 行番号 5068 〜 5181行 操作カプセル描画関数 ドクマリのゲーム画面での操作カプセルを描画する関数。操作カプセルのみ特殊で、 グラフィックタスクの処理が終了した後、キー情報を読みに行き、そのキー情報を基に 操作し、その結果を反映してカプセルを描く。その時、カプセルの座標を基に、直接フレームバッファにドットを 打ち込みに行っている。 5087 〜 5134行 レベルセレクトの時にカプセルを瓶に投げ入れる時の、弧を描く座表計算をしている。 詳しいことはわからない。( 静岡のプログラムを自分用に一部変更しただけ) 5136 〜 5146行 通常時( 普通に落下しているときの処理 ) 5147 〜 5177行 フレームバッファへの書き込みを行っている。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void key_cntrol_init( void ) 行番号 5185 〜 5199行 ゲーム用キー情報作成初期設定関数 キーリピート等の初期設定を行っている。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_make_key(void) 行番号 5201 〜 5242行 ゲーム用キー情報作成関数 ゲーム用のキー情報を作成する。CPUの場合、思考のほうで作られる。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void key_control_main( game_state *state,game_map *map, u8 player_no ,u8 joy_no ) 行番号 5243 〜 5316行 カプセルの操作関数 グラフィックタスク終了後にこの関数が呼ばれ、操作・カプセルの書き込みを行う。 5251 〜 5262行 もし投げ中だった場合、キーリピートを直前の物に設定している。 5262 〜 5310行 操作カプセル落下時の操作の処理。 5308行 カプセル描画。 5309行 カプセルの落下処理をしている。 5310 〜 5314行 キーが利かない状態の時、プレイヤーが人の場合、キーリピートを直前のデータにする。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void make_ai_main(void) 行番号 5317 〜 5354行 思考呼び出し関数 この関数は、アイドルスレッドの中で随時呼び出されている。なお dm_think_flg が真の時で、プレイヤーがCOMで通常状態の 時のみ、作用するようになっている。 メインゲーム開始されたとき dm_think_flg が真になる。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_effect_make(void) 行番号 5355 〜 5406行 共通演出計算関数 共通の演出の計算処理を行っている。(矢印の点滅処理や、スターのアニメーションのカウント処理等) ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_game_eep_write(u32 err_add) 行番号 5407 〜 5423行 ゲーム用 EEP 書き込み関数 小林作成のEEPか書き込み関数を真似て作った物。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_game_init(void) 行番号 5407 〜 5671行 ゲーム初期化関数 ゲームの初期化(1ゲームごと)を行う関数。 5631 〜 5667行 各瓶のウイルス情報を作成している。1PLAY 時以外、同じレベルだった場合、瓶のウイルス情報をコピーしている。 5670行 思考の初期化。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ int dm_game_main(NNSched* sched) 行番号 5673 〜 6310行 ゲーム処理のメイン関数 5700 〜 5719行 各変数の初期。dm_game_init() で初期化されてはまずい変数の初期化をここで行っている。 5721 〜 5940行 各ゲームモード別に、背景の読込み、アニメーションデータの読込み、各種設定を行っている。 5724 〜 5749行 1PLAY に関する設定を行っている。 5729 〜 5730行 アニメーションデータをロムか読み出している。 5732行 アニメーションをロードした先のメモリアドレスの取得。 5733行 アニメーションデータをセットしている。 ( 5732行で取得したアドレスを基に、アニメーションデータのアドレスを設定している。(アニメーションデータは number で定義されているため)) 5734行 実際にどのアニメーションをさせるのか設定している。 5735 〜 5737行 表示用変数にアニメーションの設定をコピーしている。(実際のところ意味が無い) 5738 〜 5743行 上と同じように巨大ウイルスのアニメーションの設定をしている。 game_state_dataの中にアニメーションをコントロールする変数があるが、巨大ウイルス専用にbig_virus_animeという 変数を用意している。 5746行 背景データの読込みをしている。BGBufferは Gfx 型のデータ配列でコード領域に取られている。 5747行 S2DEXの描画用変数に背景の設定をしている。&BGBuffer[66] がグラフィックの先頭位置になる。 (BmpCut でグラフィックを変換した場合、パレットアライン 8バイト、背景パレット256 * 2バイト(512 バイト), グラフィックアライン 8バイト で計 528バイトとなり、BGBuffer が Gfx 型なので 528/8 = 66で BGBuffer[66]となる) 5750 〜 5821行 2PLAY に関する設定を行っている。 5743 〜 5773行 1PLAYの時と同様、アニメーションデータの設定を行っている。 5775 〜 5781行 ストーリーモードの場合の設定をしている。 11面の場合( evs_story_no == 11 ) dm_peach_stage_flg を立てる。この面だけ背景の仕様が異なり、一枚絵(320 * 240)になっている。 それ以外の場合は、( 320 * 160 )で上下にタイルが付く。 5781 〜 5803行 ストーリーモードの以外の設定をしている。 ストーリーモード以外では、画面中央にポイント(勝数(3勝で1ポイント))を表示するため、そのポイントを予めセットしている。 5805 〜 5809行 背景番号の設定をしている。ストーリーモード以外では、(evs_stage_no - 1)が背景番号になる。 evs_stage_no が0の場合、ピーチステージの背景となる。 5811 〜 5820行 実際に背景グラフィックをロードして、S2DEXの描画用変数に背景の設定をしている。 5822 〜 5939行 4PLAY に関する設定を行っている。 5826 〜 5827行 背景グラフィックをロードして、S2DEXの描画用変数に背景の設定をしている。 5829 〜 5835行 各チームの人数を割り出している(判定用)。チーム戦でない場合、story_4p_name_num[0 〜 3] がそれぞれ1になる。 チーム戦の場合、story_4p_name_num[0] と story_4p_name_num[1] に各チームの人数が入る。 5837 〜 5880行 ストーリーモードの場合の設定をしている。 5839行 dm_game_4p_team_flg を 1に設定している。dm_game_4p_team_flg が真の場合、チーム戦と内部で判断される。 5840 〜 5879行 デモ( チーム分け表示 )の設定をしています。 5841行 story_4p_demo_flg[0]を 1に設定してい。story_4p_demo_flg[0]が真の場合、チーム分け表示を行うようになる。 5853 〜 5879行 顔表示の座表設定とチーム判別の設定を行っている。 story_4p_demo_face_pos[0 〜 3] には、顔表示のX座標が入るようになっている。 dm_game_4p_team_bit は、最新版では廃止されています。 dm_game_4p_team_bits[0 〜 1]は、各チームの判別を行うための物で、下位4ビットがチームの識別をしています。 0 0 0 0 | | | | | | | +--- 1P | | +----- 2P | +------- 3P +--------- 4P 5880 〜 5937行 ストーリーモード以外の場合の設定をしている。(でも、チーム戦の場合は似ている) 5881 〜 5887行 最初に調べた各チームの人数割り出しの結果、各チームが1人だった場合、バトルロイヤルになる。 5887 〜 5937行 チーム戦だった場合の設定を行っている。 5896 〜 5906行 判定用のビットを設定している。(ストーリーと同じ) 5911 〜 5937行 チーム分け表示のための設定を行っている。 6002 〜 6005行 音楽をテンポを早くする処理。 6008行 演出の共通計算。 6010 〜 6141行 各ゲームモード別の処理を行っている。 6013行 1PLAY(レベルセレクト)用の処理を行っている。 6014 〜 6026行 クリア or リトライの処理をしています。loop_flg を0にしてメインループからでないようにしています。 ゲームの初期化、アニメーションの再設定、クリアの場合、1レベル上昇させています。 6032 〜 6097行 2PLAY用の処理を行っている。 6037 〜 6046行 完全終了(リトライで終わるを選んだ)の場合の処理。 6047 〜 6063行 1試合終了した場合の処理。 6064 〜 6093行 リトライを選択した場合の処理。 6098 〜 6130行 4PLAY用の処理を行っている。 6099 〜 6103行 チーム分け表示の処理を行っているところ。処理が終了すると story_4p_demo_flg[0] が 偽 になり、ゲームの 処理に移行する。 6104 〜 6130行 各返り値に対しての処理を行っている。 6131 〜 6139行 各デモプレイを行っている。 6157行 dm_think_flg を0に設定して、アイドルスレッドでの思考を停止している。(アイドルスレッドで呼ばれ続けるが、 内部ではじくようになる) 6176 〜 6289行 次の処理に対しての設定。ret に入る値で次の処理が決まる。 ret = MAIN_60 <- レベル設定 MAIN_50 <- ストーリーモード MAIN_STAFF <- スタッフロール MAIN_TITLE <- タイトル画面 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------ void dm_game_graphic(void) 行番号 6312 〜 6779行 ゲーム描画メイン関数 6353 〜 6449行 各ゲーム別に背景描画を行っている。 6355 〜 6358行 1PLAYと4PLAYの背景を描画している。ちなみに、1PLAYと4PLAYとも( 320 * 240 )の1枚絵になっている。 6370 〜 6447行 2PLAYの背景を描画している。 6373 〜 6375行 とりあえず背景の描画。 6387 〜 6429行 dm_peach_stage_flg が偽の時(これが真の時は、ピーチステージ(320 * 240)の背景になる。)、瓶や上下のタイルの 描画を行う。 6430 〜 6447行 画面中央部のアイテム(勝利数の枠や時間表示用の台)の描画を行う。 6457 〜 6497行 1PLAY関係の描画を行っている。 6464行 ウイルス(瓶の中身)のアニメーションの処理。 6466 〜 6468行 得点関係の描画。なお、dm_disp_add_score()は dm_disp_scoreでロードされているグラフィックデータとパレットデータ をそのまま使用している。 6469 〜 6472行 ウイルスレベル等を描画している。ここでは、グラフィックデータが同じ物を使用している。 6473行 HIGH/MID/LOW の描画。 6474行 マリオの描画。 6477 〜 6481行 リトライコインの描画。 6482 〜 6486行 巨大ウイルスの描画。(ポーズ中は描画しない) 6487行 瓶の中身描画 6488行 連鎖演出や STAGE CLEAR などの描画 6497 〜 6572行 2PLAY関係の描画を行っている。 6500行 アニメーションの1P側の描画X座標の設定。 6501 〜 6505行 勝利数(スター)の描画X座標。 6512 〜 6535行 ステージ番号、ウイルス数などの描画。 6537 〜 6549行 勝利数の描画。 6551 〜 6557行 瓶の情報、演出、アニメーションの描画。 6559 〜 6564行 ストーリーモードでピーチ姫が使えない状態の時、ピーチ姫に勝つと、この表示(GET PEACH)をする。 6573 〜 6749行 4PLAY関係の描画を行っている。 6579 〜 6732行 4PLAYの STORY・チーム戦・バトルロイヤル別の表示物の描画を行っている。 6579 〜 6642行 STORYモードの場合の描画を行っている。 6581 〜 6586行 画面下の Virus(小さい) の描画を行っている。 6588 〜 6600行 画面下の TEAN A or TEAM Bの描画 6589 〜 6605行 画面上部の MARIO と ENEMYの描画。( story_4p_name_flg は最新版では排除 ) 6607 〜 6610行 攻撃カプセルのストック用の枠の描画 6612 〜 6616行 画面上部の3個の四角(TIME,STAGE,LEVEL)と勝ち星用枠の描画。 6620行 時間描画。 6622 〜 6627行 勝利数(スター)の描画。 6630 〜 6641行 ストックカプセルの描画。 6643 〜 6708行 チーム戦の場合の描画を行っている。 6645 〜 6650行 画面下の Virus(小さい) の描画を行っている。 6652 〜 6664行 画面下の TEAN A or TEAM Bの描画。 6667 〜 6674行 画面上の TEAN A or TEAM Bと描かれた台の描画。(パレットの読み替えで TEAM A と TEAM B が出るようになっている) 6675 〜 6679行 勝ち星用枠の描画。 6680 〜 6684行 攻撃カプセルのストック用の枠の描画。 6687 〜 6699行 ストックカプセルの描画。 6701 〜 6707行 勝利数(スター)の描画。 6708 〜 6732行 バトルロイヤルの場合の描画を行っている。 6709 〜 6715行 画面下の Virus(大きい) の描画を行っている。 6717 〜 6723行 勝ち星用枠の描画。 6724 〜 6730行 勝利数(スター)の描画。 6735行 チーム分けの描画を行っている。 6737 〜 6748行 各プレイヤーに関する物を描画している。 6758 〜 6768行 デモ表示の場合、PUSH ANY KEY を描画している。 ------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------