#include#include #include #include #include #include #include // タイトル #define NAME "KamiKaze95" #define TITLE "神風 for Windows95" // BMPファイルのID #define BGNAME "bg" #define SPRITENAME "sp" #define BMPNAME "bmp" #define TITLENAME "title" #define STAFFNAME "staff" // WAVEファイルのID #define MYTICK "mytick" #define MYBOMB "mybomb" #define BSBOMB "bsbomb" // 各種サイズ #define SURFACEWIDTH 640 #define SURFACEHIGH 480 #define MAPWIDTH 68 #define MAPHIGH 15 #define BGSIZE 32 #define MAXMISSILE 100 #define MAXENEMY 18 #define SOUND_MAX 3 // キー入力用 #define Right 0x0001 #define Left 0x0002 #define Up 0x0004 #define Down 0x0008 #define AKEY 0x0010 #define BKEY 0x0020 #define CKEY 0x0040 #define DKEY 0x0080 #define ESCKEY 0x0100 #define RETKEY 0x0200 #define SPCKEY 0x0400 // ジョイスティックの最大接続数 #define MAXSTICK 1 // スプライトのアニメーション管理用 #define ANM_LOOP 0X0001 #define ANM_ONCE 0X0000 // キーボード用 #define GAME_KEY_C 67 #define GAME_KEY_X 88 #define GAME_KEY_Z 90 // // 構造体 // typedef struct { // スクロール構造体 short LR ; // スクロール方向 short MapPointX ; // マップ位置X short MapPointY ; // マップ位置Y short ScrCountX ; // スクロールカウンタX short ScrCountY ; // スクロールカウンタY short ScrSpX ; // スクロール速度X short ScrSpY ; // スクロール速度Y // ここに、マップデータのサイズと、 // それへのポインタを入れる予定 } SCROLL ; typedef struct { // BMP描画構造体 short LR ; // スクロール方向 short w ; // 転送幅1 short sx ; // 転送幅2 short sc ; // スクロール量 short ww ; // スクロール用 } BMPSCR ; typedef struct { // TAG_BG構造体 short Xpos ; // BGSURFACEの位置X short Ypos ; // BGSURFACEの位置Y short AnmBG ; // アニメーション番号 short CharCtr ; // パーツカウンタ short SyncCtr ; // シンクカウンタ } TAGBG ; typedef struct { // BGアニメーションパーツ構造体 short Xpos ; // BGSURFACEの位置X short Ypos ; // BGSURFACEの位置Y short Sync ; // Sync数 } BGPARTS ; typedef struct { // BGアニメーション構造体 short AnmSize ; // アニメーションパターン数 BGPARTS* bganm ; // BGPARTSへのポインタ } BGANM ; typedef struct { // スプライトデータ構造体 short Xpos ; // SPSURFACEの位置X short Ypos ; // SPSURFACEの位置Y short size_w ; // Spriteの幅 short size_h ; // Spriteの高さ short XOff ; // 相対X座標 short YOff ; // 相対Y座標 } FORM ; typedef struct { // SPアニメーションパーツ構造体 short Sync ; // Sync数 short FormSize ; // アニメーションフォーム数 FORM* form ; // フォーム構造体へのポインタ } SPPARTS ; typedef struct { // SPアニメーション構造体 short AnmSize ; // アニメーションパターン数 short Flag ; // フラグ SPPARTS* spanm ; // SPPARTSへのポインタ } SPANM ; typedef struct { // TAG_SPRITE構造体 short Xpos ; // X座標 short Ypos ; // Y座標 short CharCtr ; // パーツカウンタ short SyncCtr ; // シンクカウンタ short AnmSP ; // アニメーション番号 short Flag ; // フラグ short disp ; // SPRITEの表示/非表示 short tmp0 ; // 予備 short tmp1 ; short tmp2 ; short tmp3 ; short tmp4 ; short tmp5 ; short tmp6 ; short tmp7 ; } TAGSP ; SCROLL scr[3] ; BMPSCR bmpscr[1] ; short BgMaxSize ; // BGの数 short BgAnmSize ; // アニメーションの数 TAGBG bg[] = { // BGTAGセット -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 96, 0, -1, 0, 0, 128, 0, -1, 0, 0, 160, 0, -1, 0, 0, 192, 0, -1, 0, 0, 0, 64, 1, 0, 0, 32, 32, -1, 0, 0, 64, 32, -1, 0, 0, 96, 32, -1, 0, 0, 32, 64, -1, 0, 0, 64, 64, -1, 0, 0, 96, 64, -1, 0, 0, 128, 64, -1, 0, 0, 160, 64, -1, 0, 0, 0, 96, -1, 0, 0, 32, 96, -1, 0, 0, 64, 96, -1, 0, 0, 96, 96, -1, 0, 0, 128, 96, -1, 0, 0, 160, 96, -1, 0, 0, 192, 96, -1, 0, 0, 224, 96, -1, 0, 0, 256, 96, -1, 0, 0, 288, 96, -1, 0, 0, 0, 128, -1, 0, 0, 160, 128, -1, 0, 0, 192, 128, -1, 0, 0, 224, 128, -1, 0, 0, 256, 128, -1, 0, 0, 288, 128, -1, 0, 0, 320, 128, -1, 0, 0, 352, 128, -1, 0, 0, 384, 128, -1, 0, 0, 416, 128, -1, 0, 0, 448, 128, -1, 0, 0, 480, 128, -1, 0, 0, 512, 128, -1, 0, 0, 0, 160, -1, 0, 0, 288, 160, -1, 0, 0, 320, 160, -1, 0, 0, 352, 160, -1, 0, 0, 384, 160, -1, 0, 0, 448, 160, -1, 0, 0, 480, 160, -1, 0, 0, } ; BGANM* bganm ; short SpMaxSize ; // SPの数 short SpAnmSize ; // アニメーションの数 TAGSP* sp ; SPANM* spanm ; // // DirectSound用変数 // long ListVolume[SOUND_MAX] ; DWORD ListPitch[SOUND_MAX] ; DWORD ListPitchDef[SOUND_MAX] ; long ListPan[SOUND_MAX] ; BOOL PlayMusic ; BOOL LoopMusic ; // // グローバル変数 // BOOL bActive ; // ウィンドウの状態 int StickNum = -1 ; // 接続されているジョイスティックの数 WORD Scene = 5 ; // シーン用 // 0 :タイトル // 1 :ゲームメイン // 2 :エンディング // 他:タイトルエフェクト WORD KEY ; // キー入力用 WORD BACKKEY ; // 前回入力キー DWORD joyCX[MAXSTICK][2] ; // ジョイスティックの中心位置X DWORD joyCY[MAXSTICK][2] ; // ジョイスティックの中心位置Y short missile_no ; // 弾のタグナンバー short missile_pt ; // 画面上の弾の数 short missile_on[MAXMISSILE] ; // 弾の種類 short enemy_off ; // 敵の出現情報 short enemy_no ; // 敵のタグナンバー short enemy_pt ; // 画面上の敵の数 short enemy_on[MAXENEMY] ; // 敵の種類 short speed ; // 自棄のスピード short defence ; // 防御力 short flag_0 ; // 特殊捜査中 short flag_1 ; // ゲームオーバー判定用 short esc_flag ; // ポーズ用 WORD com[17] ; // コマンド入力用 WORD com_w = 0 ; // コマンド判定用 BOOL com_flag_01 ; // コマンドフラグ BOOL com_flag_02 ; // 使用されてません WORD SCRcnt ; // スクロールカウンタ WORD scf ; short dest ; // 距離 short sc_flag ; // スクロール用 short sb ; // エンディングスクロール用 short mov[][2] = { // 入力キーの方向 // 斜めは、きちんとした値ではない 0, 0, // 0 押してない 8, 0, // 1 右 -8, 0, // 2 左 0, 0, // 3 左右 0, -8, // 4 上 6, -6, // 5 上右 -6, -6, // 6 上左 0, -8, // 7 上左右 0, 8, // 8 下 6, 6, // 9 下右 -6, 6, // a 下左 0, 8, // b 下左右 0, 0, // c 下上 8, 0, // d 下上右 -8, 0, // e 下上左 0, 0, // f 下上右左 } ; WORD str_01[10] ={Up, Up, Down, Down, Left, Right, Left, Right, BKEY, AKEY} ; // 無敵コマンド short muki[9][2] = { // 方向検索テーブル // これを4倍して32方向にする 8 << 0, 0 << 0, 8 << 0, 1 << 0, 8 << 0, 2 << 0, 8 << 0, 3 << 0, 8 << 0, 4 << 0, 8 << 0, 5 << 0, 8 << 0, 6 << 0, 8 << 0, 7 << 0, 8 << 0, 8 << 0, } ; short enemy_in[77][7] = { // 敵機の情報 // 出現位置 種類 位置(X, Y) 動き(X_OFF, Y_OFF, 向き) 0x05fa, 1, -70 << 3, 40 << 3, 1 << 3, 3 << 3, 0, 0x05ea, 1, -70 << 3, 100 << 3, 1 << 3, 3 << 3, 0, 0x05da, 1, -70 << 3, 180 << 3, 1 << 3, 3 << 3, 0, 0x05ca, 1, -70 << 3, 240 << 3, 1 << 3, 3 << 3, 0, 0x05ba, 1, -70 << 3, 300 << 3, 1 << 3, 3 << 3, 0, 0x05aa, 1, -70 << 3, 360 << 3, 1 << 3, 3 << 3, 0, 0x059a, 1, -70 << 3, 400 << 3, 1 << 3, 3 << 3, 0, 0x056a, 2, -70 << 3, 40 << 3, 1 << 3, 3 << 3, 1, 0x055a, 2, -70 << 3, 100 << 3, 1 << 3, 3 << 3, 1, 0x054a, 2, -70 << 3, 180 << 3, 1 << 3, 3 << 3, 1, 0x053a, 2, -70 << 3, 240 << 3, 1 << 3, 3 << 3, 1, 0x052a, 2, -70 << 3, 300 << 3, 1 << 3, 3 << 3, 1, 0x051a, 2, -70 << 3, 360 << 3, 1 << 3, 3 << 3, 1, 0x050a, 2, -70 << 3, 400 << 3, 1 << 3, 3 << 3, 1, 0x049a, 1, -70 << 3, 40 << 3, 1 << 3, 0 << 3, 0, 0x049a, 1, -70 << 3, 360 << 3, 1 << 3, 0 << 3, 0, 0x048a, 1, -70 << 3, 100 << 3, 1 << 3, 0 << 3, 0, 0x048a, 1, -70 << 3, 300 << 3, 1 << 3, 0 << 3, 0, 0x047a, 1, -70 << 3, 160 << 3, 1 << 3, 0 << 3, 0, 0x047a, 1, -70 << 3, 240 << 3, 1 << 3, 0 << 3, 0, 0x046a, 1, -70 << 3, 200 << 3, 1 << 3, 0 << 3, 0, 0x03fa, 2, -70 << 3, 40 << 3, 1 << 3, 2 << 3, 1, 0x03fa, 2, -70 << 3, 360 << 3, 1 << 3, 2 << 3, -1, 0x03ea, 2, -70 << 3, 100 << 3, 1 << 3, 2 << 3, 1, 0x03ea, 2, -70 << 3, 300 << 3, 1 << 3, 2 << 3, -1, 0x03da, 2, -70 << 3, 160 << 3, 1 << 3, 2 << 3, 1, 0x03da, 2, -70 << 3, 240 << 3, 1 << 3, 2 << 3, -1, 0x03ca, 2, -70 << 3, 200 << 3, 1 << 3, 2 << 3, 1, 0x035a, 3, -70 << 3, 40 << 3, 0 << 3, 0 << 3, 0, 0x034a, 3, -70 << 3, 360 << 3, 0 << 3, 0 << 3, 0, 0x033a, 3, -70 << 3, 100 << 3, 0 << 3, 0 << 3, 0, 0x032a, 3, -70 << 3, 300 << 3, 0 << 3, 0 << 3, 0, 0x031a, 3, -70 << 3, 160 << 3, 0 << 3, 0 << 3, 0, 0x030a, 3, -70 << 3, 240 << 3, 0 << 3, 0 << 3, 0, 0x02fa, 3, -70 << 3, 200 << 3, 0 << 3, 0 << 3, 0, 0x02da, 2, -70 << 3, 40 << 3, 1 << 3, 4 << 3, 1, 0x02ca, 2, -70 << 3, 100 << 3, 1 << 3, 4 << 3, 1, 0x02ba, 2, -70 << 3, 180 << 3, 1 << 3, 4 << 3, 1, 0x02aa, 2, -70 << 3, 240 << 3, 1 << 3, 4 << 3, 1, 0x029a, 2, -70 << 3, 300 << 3, 1 << 3, 4 << 3, 1, 0x028a, 2, -70 << 3, 360 << 3, 1 << 3, 4 << 3, 1, 0x027a, 2, -70 << 3, 400 << 3, 1 << 3, 4 << 3, 1, 0x024a, 2, -70 << 3, 40 << 3, 1 << 3, 2 << 3, 1, 0x024a, 2, -70 << 3, 360 << 3, 1 << 3, 2 << 3, -1, 0x023a, 2, -70 << 3, 100 << 3, 1 << 3, 2 << 3, 1, 0x023a, 2, -70 << 3, 300 << 3, 1 << 3, 2 << 3, -1, 0x022a, 2, -70 << 3, 160 << 3, 1 << 3, 2 << 3, 1, 0x022a, 2, -70 << 3, 240 << 3, 1 << 3, 2 << 3, -1, 0x021a, 2, -70 << 3, 200 << 3, 1 << 3, 2 << 3, 1, 0x01da, 1, -70 << 3, 200 << 3, 2 << 3, 3 << 3, 0, 0x01ca, 1, -70 << 3, 160 << 3, 2 << 3, 3 << 3, 0, 0x01ca, 1, -70 << 3, 240 << 3, 2 << 3, 3 << 3, 0, 0x01ba, 1, -70 << 3, 100 << 3, 2 << 3, 3 << 3, 0, 0x01ba, 1, -70 << 3, 300 << 3, 2 << 3, 3 << 3, 0, 0x01aa, 1, -70 << 3, 360 << 3, 2 << 3, 3 << 3, 0, 0x01aa, 1, -70 << 3, 40 << 3, 2 << 3, 3 << 3, 0, 0x019a, 3, -70 << 3, 40 << 3, 0 << 3, 0 << 3, 0, 0x019a, 3, -70 << 3, 360 << 3, 0 << 3, 0 << 3, 0, 0x017a, 3, -70 << 3, 40 << 3, 0 << 3, 0 << 3, 0, 0x017a, 3, -70 << 3, 360 << 3, 0 << 3, 0 << 3, 0, 0x015a, 3, -70 << 3, 160 << 3, 0 << 3, 0 << 3, 0, 0x015a, 3, -70 << 3, 300 << 3, 0 << 3, 0 << 3, 0, 0x013a, 3, -70 << 3, 200 << 3, 0 << 3, 0 << 3, 0, 0x010a, 1, -70 << 3, 40 << 3, 2 << 3, 0 << 3, 0, 0x00fa, 1, -70 << 3, 100 << 3, 1 << 3, 0 << 3, 0, 0x00ea, 1, -70 << 3, 180 << 3, 2 << 3, 0 << 3, 0, 0x00da, 1, -70 << 3, 240 << 3, 1 << 3, 0 << 3, 0, 0x00ca, 1, -70 << 3, 300 << 3, 2 << 3, 0 << 3, 0, 0x00ba, 1, -70 << 3, 360 << 3, 1 << 3, 0 << 3, 0, 0x00aa, 1, -70 << 3, 400 << 3, 2 << 3, 0 << 3, 0, 0x007a, 2, -70 << 3, 200 << 3, 1 << 3, 2 << 3, 1, 0x006a, 2, -70 << 3, 200 << 3, 1 << 3, 2 << 3, -1, 0x005a, 2, -70 << 3, 200 << 3, 1 << 3, 2 << 3, 1, 0x004a, 2, -70 << 3, 200 << 3, 1 << 3, 2 << 3, -1, 0x003a, 2, -70 << 3, 200 << 3, 1 << 3, 2 << 3, 1, 0x002a, 2, -70 << 3, 200 << 3, 1 << 3, 2 << 3, -1, 0x001a, 2, -70 << 3, 200 << 3, 1 << 3, 2 << 3, 1, } ; short map[3][MAPHIGH][MAPWIDTH] = { // マップ情報 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 , 1 , 1 , 1 , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 40, 41, 42, 43, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } ; // // DirectDrawオブジェクトへのポインタ // LPDIRECTDRAW lpDD ; // DirectDrawObject LPDIRECTDRAWSURFACE lpDDSPrimary ; // PrimarySurfaceObject LPDIRECTDRAWSURFACE lpDDSBack ; // BackSurfaceObject LPDIRECTDRAWSURFACE lpDDSBackground ; // BGSurfaceObject LPDIRECTDRAWSURFACE lpDDSSprite ; // SPRITESurfaceObject LPDIRECTDRAWSURFACE lpDDSBmp ; // BMPSurfaceObject LPDIRECTDRAWSURFACE lpDDSTitle ; // TITLESurfaceObject LPDIRECTDRAWSURFACE lpDDSStaff ; // STAFFSurfaceObject LPDIRECTDRAWPALETTE lpDDPal ; // PaletteObject LPDIRECTSOUND lpDS ; // DirectSoundObject LPDIRECTSOUNDBUFFER lpDSBuffer_1 ; // DirectSoundBufferObject LPDIRECTSOUNDBUFFER lpDSBuffer[SOUND_MAX] ; // DirectSoundBufferObject // // プロトタイプの宣言 // LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ; static BOOL SetupDD(HWND hwnd) ; BOOL CreateFail(HWND hwnd) ; static void CleanupDD(void) ; static void CleanupDS(void) ; void CleanMem(void) ; HRESULT restoreSurface(HWND hwnd) ; BOOL loadBitmap(HWND hwnd, LPDIRECTDRAWSURFACE lpDDSurface, LPSTR szBitmapName) ; void ScrBMP(HWND hwnd, LPDIRECTDRAWSURFACE lpDDSChar, short n) ; void ScrBG(HWND hwnd, short n, short* Map, short x1, short x2, short y1, short y2) ; void BgAnm(void) ; void SpriteHigh(HWND hwnd, short SPNum) ; void VsyncFlip(HWND hwnd) ; void BltBack(HWND hwnd, short rX, short rY, RECT Rect, LPDIRECTDRAWSURFACE lpDDSChar, DWORD dwTrans) ; int InitJoykey(void) ; WORD GetJoykey(int n) ; BOOL SetupDS(HWND hwnd) ; BOOL loadWave(HWND hwmd, LPSTR szWaveName, short i) ; void PlayMIDI(HWND hwnd, char* FileName) ; void ReplayMIDI(HWND hwnd) ; void StopMIDI(HWND hwnd) ; // ゲーム用関数 typedef void (*Enemy)(short my, short n) ; typedef void (*missile)(short n) ; void FirstStep(HWND hwnd) ; WORD trigger(void) ; void SetTitle(HWND hwnd) ; void Title(HWND hwnd) ; void FirstSet(void) ; void Main(HWND hwnd) ; short Ending(HWND hwnd, short sb) ; void Clear(HWND hwnd, short n) ; void Over(short n) ; void totu(short n) ; BOOL atari_sp(short no_1, short no_2) ; BOOL atari_bg(short n, short mp) ; BOOL command_01(void) ; BOOL comcmp_01(void) ; void Dest(HWND hwnd) ; void Enemy_put(short x, short y, short x1, short y1, short t6, short kind) ; void Enemy_t(short my, short n) ; void Enemy_0(short my, short n) ; void Enemy_1(short my, short n) ; void Enemy_2(short my, short n) ; void Enemy_3(short my, short n) ; void Enemy_4(short my, short n) ; void Enemy_5(short my, short n) ; void search(short no_1, short no_2, short no) ; void missile_0(short my, short n) ; void missile_1(short my, short n) ; void missile_2(short my, short n) ; void missile_3(short my, short n) ; void missile_4(short my, short n) ; void missile_5(short my, short n) ; void missile_m0(short n) ; void missile_m1(short n) ; void missile_m2(short n) ; void missile_m3(short n) ; void missile_m4(short n) ; void missile_m5(short n) ; Enemy enemytbl[] = { Enemy_0, Enemy_1, Enemy_2, Enemy_3, Enemy_4, Enemy_5, } ; missile missiletbl[] = { missile_m0, missile_m1, missile_m2, missile_m3, missile_m4, missile_m5, } ; // // メインウインドウの構築 // int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nWinMode) { HWND hwnd ; // Windowのハンドル MSG msg ; WNDCLASS wc ; // WindowClassの設定 wc.hInstance = hInstance ; wc.lpszClassName = NAME ; wc.lpfnWndProc = (WNDPROC)WndProc ; wc.style = 0 ; wc.hIcon = LoadIcon((HINSTANCE)NULL, IDI_APPLICATION) ; wc.hCursor = LoadCursor((HINSTANCE)NULL, IDC_ARROW) ; wc.lpszMenuName = 0 ; wc.cbClsExtra = 0 ; wc.cbWndExtra = 0 ; wc.hbrBackground = GetStockObject(BLACK_BRUSH) ; if (!RegisterClass(&wc)) return FALSE ; hwnd = CreateWindowEx( // ウィンドウの生成 WS_EX_TOPMOST, NAME, TITLE, WS_POPUP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL) ; if (!hwnd) return FALSE ; ShowWindow(hwnd, nWinMode) ; // ウィンドウの表示 UpdateWindow(hwnd) ; // ウィンドウの更新 ShowCursor(FALSE) ; // カーソルを消す if (!SetupDD(hwnd)) return FALSE ; // DirectDrawの初期化 if (!SetupDS(hwnd)) return FALSE ; // DirectSoundの初期化 InitJoykey() ; // ジョイスティックの初期化 PlayMusic = FALSE ; // MIDIの初期化 LoopMusic = FALSE ; // MIDIの初期化 ListVolume[0] = -1000L ; // 弾が当たったときの音のボリュームセット lpDSBuffer[0]->SetVolume(ListVolume[0]) ; // ゲームループ FirstStep(hwnd) ; // スプライト/BGの初期化 while (1) { // メインループ if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { if (!GetMessage(&msg, NULL, 0, 0)) break ; TranslateMessage(&msg) ; DispatchMessage(&msg) ; } else if (bActive) { switch (Scene) { case 0 : Title(hwnd) ; break ; case 1 : Main(hwnd) ; break ; case 2 : sb = Ending(hwnd, sb) ; break ; default : SetTitle(hwnd) ; } } } return msg.wParam ; } // // メッセージの処理 // LRESULT APIENTRY WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_ACTIVATEAPP : bActive = wParam ; break ; case WM_CREATE : break ; case MM_MCINOTIFY : if (wParam == MCI_NOTIFY_SUCCESSFUL) { ReplayMIDI(hwnd) ; } break ; case WM_KEYDOWN : // キー押下 if (bActive) { switch (wParam) { case VK_F12 : // F12で終了 PostMessage(hwnd, WM_CLOSE, 0, 0) ; break ; default : break ; } } break ; case WM_DESTROY : // Windowの破棄 CleanupDD() ; CleanupDS() ; CleanMem() ; StopMIDI(hwnd) ; ShowCursor(TRUE) ; PostQuitMessage(0) ; break ; } return DefWindowProc(hwnd, message, wParam, lParam) ; } // // DirectDrawオブジェクトの生成 // static BOOL SetupDD(HWND hwnd) { HRESULT ddrval ; DDSURFACEDESC ddsd ; DDSCAPS ddscaps ; // DirectDrawオブジェクトの生成 ddrval = DirectDrawCreate(NULL, &lpDD, NULL) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // DirectDrawの協調 ddrval = lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE| DDSCL_FULLSCREEN) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // ディスプレイモードの設定 ddrval = lpDD->SetDisplayMode(640, 480, 8) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // サーフェイス記述子の設定 ddsd.dwSize = sizeof(ddsd) ; ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT ; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX ; ddsd.dwBackBufferCount = 1 ; // サーフェイスの生成 ddrval = lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // バックバッファの生成 ddscaps.dwCaps = DDSCAPS_BACKBUFFER ; ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // TITLEサーフェイスの生成 ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ; ddsd.dwHeight = 480 ; ddsd.dwWidth = 640 ; ddrval = lpDD->CreateSurface(&ddsd, &lpDDSTitle, NULL) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // STAFFサーフェイスの生成 ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ; ddsd.dwHeight = 2200 ; ddsd.dwWidth = 640 ; ddrval = lpDD->CreateSurface(&ddsd, &lpDDSStaff, NULL) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // SPサーフェイスの生成 ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ; ddsd.dwHeight = 480 ; ddsd.dwWidth = 640 ; ddrval = lpDD->CreateSurface(&ddsd, &lpDDSSprite, NULL) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // BGサーフェイスの生成 ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ; ddsd.dwHeight = 480 ; ddsd.dwWidth = 640 ; ddrval = lpDD->CreateSurface(&ddsd, &lpDDSBackground, NULL) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // BMPサーフェイスの生成 ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH ; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ; ddsd.dwHeight = 480 ; ddsd.dwWidth = 640 ; ddrval = lpDD->CreateSurface(&ddsd, &lpDDSBmp, NULL) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // カラーキーの設定 DDCOLORKEY ddck ; ddck.dwColorSpaceLowValue = 0 ; ddck.dwColorSpaceHighValue = 0; lpDDSBackground->SetColorKey(DDCKEY_SRCBLT, &ddck) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; lpDDSSprite->SetColorKey(DDCKEY_SRCBLT, &ddck) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // ビットマップの転送 if (!loadBitmap(hwnd, lpDDSTitle, TITLENAME )) CreateFail(hwnd) ; if (!loadBitmap(hwnd, lpDDSStaff, STAFFNAME )) CreateFail(hwnd) ; if (!loadBitmap(hwnd, lpDDSSprite, SPRITENAME)) CreateFail(hwnd) ; if (!loadBitmap(hwnd, lpDDSBackground, BGNAME )) CreateFail(hwnd) ; if (!loadBitmap(hwnd, lpDDSBmp, BMPNAME )) CreateFail(hwnd) ; return TRUE ; } // // DirectDrawオブジェクトの消滅 // static void CleanupDD(void) { if (lpDD != NULL) { if (lpDDPal != NULL) { lpDDPal->Release() ; lpDDPal = NULL ; } if (lpDDSTitle != NULL) { lpDDSTitle->Release() ; lpDDSTitle = NULL ; } if (lpDDSStaff != NULL) { lpDDSStaff->Release() ; lpDDSStaff = NULL ; } if (lpDDSSprite != NULL) { lpDDSSprite->Release() ; lpDDSSprite = NULL ; } if (lpDDSBackground != NULL) { lpDDSBackground->Release() ; lpDDSBackground = NULL ; } if (lpDDSBmp != NULL) { lpDDSBmp->Release() ; lpDDSBmp = NULL ; } if (lpDDSPrimary != NULL) { lpDDSPrimary->Release() ; lpDDSPrimary = NULL ; } lpDD->Release() ; lpDD = NULL ; } } // // サーフェイスの復元 // HRESULT restoreSurface(HWND hwnd) { HRESULT ddrval ; ddrval = lpDDSPrimary->Restore() ; if (ddrval == DD_OK) { ddrval = lpDDSTitle->Restore() ; if (ddrval == DD_OK) loadBitmap(hwnd, lpDDSTitle, TITLENAME) ; ddrval = lpDDSStaff->Restore() ; if (ddrval == DD_OK) loadBitmap(hwnd, lpDDSStaff, STAFFNAME) ; ddrval = lpDDSSprite->Restore() ; if (ddrval == DD_OK) loadBitmap(hwnd, lpDDSSprite, SPRITENAME) ; ddrval = lpDDSBackground->Restore() ; if (ddrval == DD_OK) loadBitmap(hwnd, lpDDSBackground, BGNAME) ; ddrval = lpDDSBmp->Restore() ; if (ddrval == DD_OK) loadBitmap(hwnd, lpDDSBmp, BMPNAME) ; } return ddrval ; } // // ビットマップファイルのローディング // BOOL loadBitmap(HWND hwnd, LPDIRECTDRAWSURFACE lpDDSurface, LPSTR szBitmapName) { HRESULT ddrval ; HRSRC h ; LPBITMAPINFOHEADER lpbi ; RGBQUAD* prgb ; PALETTEENTRY ape[256] ; int i, n ; // 指定された名前のビットマップファイルがリソース内にあるか h = FindResource(NULL, szBitmapName, RT_BITMAP) ; if (h == NULL) return CreateFail(hwnd) ; // ヘッダーへのポインタを取得する lpbi = (LPBITMAPINFOHEADER)LockResource(LoadResource(NULL, h)) ; if (lpbi == NULL) { MessageBox(hwnd, "BitMapリソースをロードできません", TITLE, MB_OK) ; return CreateFail(hwnd) ; } // パレットに汎用的な値をセットする for (i = 0; i < 256; i++) { ape[i].peRed = (BYTE)i ; ape[i].peGreen = (BYTE)i ; ape[i].peBlue = (BYTE)i ; ape[i].peFlags = (BYTE)0 ; } // パレットにBMPのパレットをセットする prgb = (RGBQUAD*)((BYTE*)lpbi + lpbi->biSize) ; if (lpbi->biSize != sizeof(BITMAPINFOHEADER)) return CreateFail(hwnd) ; if (lpbi->biBitCount > 8) return CreateFail(hwnd) ; if (lpbi->biClrUsed == 0) n = 1 << lpbi->biBitCount ; else n = lpbi->biClrUsed ; for (i = 0; i < n; i++) { ape[i].peRed = prgb[i].rgbRed ; ape[i].peGreen = prgb[i].rgbGreen ; ape[i].peBlue = prgb[i].rgbBlue ; ape[i].peFlags = 0 ; } // DirectDrawパレットを生成する ddrval = lpDD->CreatePalette(DDPCAPS_8BIT, ape, &lpDDPal, NULL) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; // パレットをサーフェイスへ接続する ddrval = lpDDSBack->SetPalette(lpDDPal) ; if (ddrval != DD_OK) return CreateFail(hwnd) ; HBITMAP hbm ; BITMAP bm ; DDSURFACEDESC ddsd ; HDC hdc ; HDC hdcimage ; // ビットマップのローディング hbm = LoadImage(GetModuleHandle(NULL), szBitmapName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION) ; if (hbm == NULL) { MessageBox(hwnd, "画像のローディングに失敗", TITLE, MB_OK) ; return FALSE ; } // メモリDCの生成 hdcimage = CreateCompatibleDC(NULL) ; SelectObject(hdcimage, hbm) ; GetObject(hbm, sizeof(bm), &bm) ; // オフスクリーン記述子のセット ddsd.dwSize = sizeof(ddsd) ; ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH ; lpDDSurface->GetSurfaceDesc(&ddsd) ; // オフスクリーンデバイスコンテキスト生成 ddrval = lpDDSurface->GetDC(&hdc) ; if (ddrval != DD_OK) { MessageBox(hwnd, "デバイスコンテキストの取得に失敗", TITLE, MB_OK) ; DeleteObject(hbm) ; return FALSE ; } // システムメモリからオフスクリーンへの転送 StretchBlt(hdc, 0, 0, lpbi->biWidth, lpbi->biHeight, hdcimage, 0, 0, lpbi->biWidth, lpbi->biHeight, SRCCOPY) ; // 削除 lpDDSurface->ReleaseDC(hdc) ; DeleteObject(hbm) ; return TRUE ; } // // DirectSoundオブジェクトの生成 // BOOL SetupDS(HWND hwnd) { short i ; HRESULT dsrval ; DSBUFFERDESC dsbd; // DirectSoundオブジェクトの作成 dsrval = DirectSoundCreate(NULL, &lpDS, NULL) ; if (dsrval != DS_OK) return CreateFail(hwnd) ; // 協調レベルの指定 dsrval = lpDS->SetCooperativeLevel(hwnd, DSSCL_EXCLUSIVE) ; if (dsrval != DS_OK) return CreateFail(hwnd) ; // セカンダリバッファの作成 ZeroMemory(&dsbd, sizeof(DSBUFFERDESC)) ; dsbd.dwSize = sizeof(dsbd) ; dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER ; dsrval = lpDS->CreateSoundBuffer(&dsbd, &lpDSBuffer_1, NULL) ; if (dsrval != DS_OK) return CreateFail(hwnd) ; // ボリューム・ピッチ・パンの初期化 for (i = 0; i < SOUND_MAX; i++) { lpDSBuffer[i] = NULL ; ListVolume[i] = 0L ; ListPitch[i] = 0UL ; ListPitchDef[i] = 0UL ; ListPan[i] = 0L ; } // Waveの転送 if (!loadWave(hwnd, MYTICK, 0)) CreateFail(hwnd) ; if (!loadWave(hwnd, MYBOMB, 1)) CreateFail(hwnd) ; if (!loadWave(hwnd, BSBOMB, 2)) CreateFail(hwnd) ; return TRUE ; } // // DirectSoundオブジェクトの消滅 // static void CleanupDS(void) { short i ; if (lpDS != NULL) { if (lpDSBuffer_1 != NULL) { lpDSBuffer_1->Release() ; lpDSBuffer_1 = NULL ; } for (i = 0; i < SOUND_MAX; i++) if (lpDSBuffer[i] != NULL) { lpDSBuffer[i]->Stop() ; lpDSBuffer[i]->Release() ; lpDSBuffer[i] = NULL ; } lpDS->Release() ; lpDS = NULL ; } } // // WAVEデータのローディング // BOOL loadWave(HWND hwnd, LPSTR szWaveName, short i) { HRSRC hrscr ; DSBUFFERDESC dsbd ; DWORD* lpdword ; LPVOID lpbuf1, lpbuf2 ; DWORD dwbuf1, dwbuf2 ; // リソースの検索 if ((hrscr = FindResource(NULL, szWaveName, "WAVE")) == NULL) { MessageBox(hwnd, "WAVEリソースが見つかりません", TITLE, MB_OK) ; return CreateFail(hwnd) ; } // リソースからの読み込み lpdword = (DWORD*)LockResource(LoadResource(NULL, hrscr)) ; // バッファ2の初期化 ZeroMemory(&dsbd, sizeof(DSBUFFERDESC)) ; dsbd.dwSize = sizeof(DSBUFFERDESC) ; dsbd.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLDEFAULT ; dsbd.dwBufferBytes = *(lpdword + 1) ; dsbd.lpwfxFormat = (LPWAVEFORMATEX)(lpdword + 5) ; if (lpDS->CreateSoundBuffer(&dsbd, &lpDSBuffer[i], NULL) != DS_OK) { MessageBox(hwnd, "サウンドバッファを生成できません", szWaveName, MB_OK) ; return CreateFail(hwnd) ; } // バッファ2のロック lpDSBuffer[i]->Lock(0, *(lpdword + 1), &lpbuf1, &dwbuf1, &lpbuf2, &dwbuf2, 0); // 音源データの設定 CopyMemory(lpbuf1, (BYTE*)(lpdword + 11), dwbuf1) ; if (dwbuf2 != 0) CopyMemory(lpbuf2, (BYTE*)(lpdword + 11) + dwbuf1, dwbuf2) ; // 二次バッファのロック解除 lpDSBuffer[i]->Unlock(lpbuf1, dwbuf1, lpbuf2, dwbuf2) ; // ピッチの取得 lpDSBuffer[i]->GetFrequency(&ListPitch[i]) ; ListPitchDef[i] = ListPitch[i] ; return TRUE ; } // // DirectXオブジェクトの生成に失敗 // BOOL CreateFail(HWND hwnd) { CleanupDD() ; CleanupDS() ; CleanMem() ; MessageBox(hwnd, "DirectXのセットアップに失敗", TITLE, MB_OK) ; DestroyWindow(hwnd) ; return FALSE ; } // // BGスクロール // void ScrBG(HWND hwnd, short n, short x1, short x2, short y1, short y2) { short i, j ; // 汎用 short rX, rY ; // 転送位置 short x, y ; // マップ座標 RECT bgRect ; // BGパーツ位置情報構造体 // 背景画像の転送 y = scr[n].MapPointY ; for (j = y1; j <= y2; j++) { x = scr[n].MapPointX ; // 転送開始位置セット for (i = x1; i <= x2; i++, x++) { if (x >= MAPWIDTH) x = 0 ; // ループ判定 if (map[n][y][x] == 0) continue ; // BGの0番は非表示 bgRect.left = bg[map[n][y][x]].Xpos ; // 転送元位置セット bgRect.top = bg[map[n][y][x]].Ypos ; bgRect.right = bgRect.left + BGSIZE ; bgRect.bottom = bgRect.top + BGSIZE ; rX = i * BGSIZE - scr[n].ScrCountX ; // 転送先位置セット rY = j * BGSIZE - scr[n].ScrCountY ; if (rX < 0) // スクロール画面左側のクリップ処理 { rX = 0 ; bgRect.left += scr[n].ScrCountX ; } if (rX > SURFACEWIDTH - BGSIZE) { // スクロール画面右側のクリップ処理 if (!scr[n].ScrCountX) continue ; bgRect.right = bgRect.left + scr[n].ScrCountX ; } if (rY < 0) // スクロール画面上側のクリップ処理 { rY = 0 ; bgRect.top += scr[n].ScrCountY ; } if (rY > SURFACEHIGH - BGSIZE) { // スクロール画面下側のクリップ処理 if (!scr[n].ScrCountY) continue ; bgRect.bottom = bgRect.top + scr[n].ScrCountY ; } BltBack(hwnd, rX, rY, bgRect, lpDDSBackground, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT) ; // バックバッファにBGをセット } if (++y >= MAPHIGH) y = 0 ; } // スクロール値セット if (scr[n].LR & Right) { if ((scr[n].ScrCountX -= scr[n].ScrSpX) < 0) { // 右スクロールカウント if (--scr[n].MapPointX < 0) scr[n].MapPointX = MAPWIDTH - 1 ; scr[n].ScrCountX = BGSIZE - 1; } } else if (scr[n].LR & Left) { if ((scr[n].ScrCountX += scr[n].ScrSpX) >= BGSIZE) { // 左スクロールカウント if (++scr[n].MapPointX >= MAPWIDTH) scr[n].MapPointX = 0 ; scr[n].ScrCountX = 0 ; } } if (scr[n].LR & Up) { if ((scr[n].ScrCountY += scr[n].ScrSpY) >= BGSIZE) { // 上スクロールカウント if (++scr[n].MapPointY >= MAPHIGH) scr[n].MapPointY = 0 ; scr[n].ScrCountY = 0 ; } } else if (scr[n].LR & Down) { if ((scr[n].ScrCountY -= scr[n].ScrSpY) < 0) { // 下スクロールカウント if (--scr[n].MapPointY < 0) scr[n].MapPointY = MAPHIGH - 1 ; scr[n].ScrCountY = BGSIZE - 1; } } return ; } // // BGアニメーション // void BgAnm(void) { short i ; for (i = 1; i < BgMaxSize; i++) // BGアニメーション if (bg[i].AnmBG >= 0) if (++bg[i].SyncCtr > bganm[bg[i].AnmBG].bganm[bg[i].CharCtr].Sync) { // パーツ切り替え bg[i].SyncCtr = 0 ; if (++bg[i].CharCtr >= bganm[bg[i].AnmBG].AnmSize) bg[i].CharCtr = 0 ; bg[i].Xpos = bganm[bg[i].AnmBG].bganm[bg[i].CharCtr].Xpos ; bg[i].Ypos = bganm[bg[i].AnmBG].bganm[bg[i].CharCtr].Ypos ; } return ; } // // BMP描画 // void ScrBMP(HWND hwnd, LPDIRECTDRAWSURFACE lpDDSChar, short n) { RECT bmpRect ; // 背景画像の転送 if (bmpscr[n].w) { bmpRect.left = bmpscr[n].sx ; bmpRect.top = 0 ; bmpRect.right = 640 ; bmpRect.bottom = 480 ; BltBack(hwnd, 0, 0, bmpRect, lpDDSChar, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT) ; } if (bmpscr[n].sx) { bmpRect.left = 0 ; bmpRect.top = 0 ; bmpRect.right = bmpscr[n].sx ; bmpRect.bottom = 480 ; BltBack(hwnd, bmpscr[n].w, 0, bmpRect, lpDDSChar, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT) ; } // BMP面のスクロール(横方向のみ) if (bmpscr[n].LR & Right) { bmpscr[n].ww += bmpscr[n].sc ; if ((bmpscr[n].ww >> 4) > 640) bmpscr[n].ww = 0 ; } else if (scr[n].LR & Left) { bmpscr[n].ww -= bmpscr[n].sc ; if ((bmpscr[n].ww >> 4) < 0) bmpscr[n].ww = 640 << 4 ; } bmpscr[n].w = bmpscr[n].ww >> 4 ; bmpscr[n].sx = SURFACEWIDTH - bmpscr[n].w ; } // // スプライト転送(高速) // void SpriteHigh(HWND hwnd, short SPNum) { short i, x, y, w, h ; RECT spriteRect ; for (i = 0; i < spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].FormSize; i++) { spriteRect.left = spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].form[i].Xpos ; // 転送元位置セット spriteRect.top = spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].form[i].Ypos ; spriteRect.right = spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].form[i].Xpos + spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].form[i].size_w ; spriteRect.bottom = spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].form[i].Ypos + spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].form[i].size_h ; x = (sp[SPNum].Xpos >> 3) + spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].form[i].XOff ; // 転送先位置セット y = (sp[SPNum].Ypos >> 3) + spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].form[i].YOff ; w = spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].form[i].size_w ; // 転送サイズ(横) if (x < 0) // 画面左側のクリッピング { if (x + w <= 1) continue ; spriteRect.left -= x ; x = 0 ; } else if (x >= 640 - w) // 画面右側のクリッピング { if (x >= 640) continue ; spriteRect.right -= w - (640 - x) ; } h = spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].form[i].size_h ; if (y < 0) // 画面上部のクリッピング { if (y + h <= 0) continue ; spriteRect.top -= y ; y = 0 ; } else if (y >= 480 - h) // 画面下部のクリッピング { if (y >= 480) continue ; spriteRect.bottom -= h - (480 - y) ; } BltBack(hwnd, x, y, spriteRect, lpDDSSprite, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT) ; } // キャラのアニメーション if (sp[SPNum].AnmSP < 0) return ; if (++sp[SPNum].SyncCtr > spanm[sp[SPNum].AnmSP].spanm[sp[SPNum].CharCtr].Sync) { sp[SPNum].SyncCtr = 0 ; if (++sp[SPNum].CharCtr >= spanm[sp[SPNum].AnmSP].AnmSize) { if (spanm[sp[SPNum].AnmSP].Flag == ANM_ONCE) sp[SPNum].Flag = 0 ; sp[SPNum].CharCtr = 0 ; } } } // // バックバッファにキャラクタをコピーする(高速版) // void BltBack(HWND hwnd, short rX, short rY, RECT Rect, LPDIRECTDRAWSURFACE lpDDSChar, DWORD dwTrans) { HRESULT ddrval ; while (1) { ddrval = lpDDSBack->BltFast(rX, rY, lpDDSChar, &Rect, dwTrans) ; if (ddrval == DD_OK) break ; if (ddrval == DDERR_SURFACELOST) { ddrval = restoreSurface(hwnd) ; if (ddrval == DD_OK) break ; } } } // // 画面のフリップ // void VsyncFlip(HWND hwnd) { HRESULT ddrval ; // V-Blank待ち // ddrval = lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, NULL) ; // if (ddrval != DD_OK) CreateFail(hwnd) ; // 画面のフリップ while (1) { ddrval = lpDDSPrimary->Flip(NULL, DDFLIP_WAIT) ; if (ddrval == DD_OK) break ; if (ddrval == DDERR_SURFACELOST) { ddrval = restoreSurface(hwnd) ; if (ddrval == DD_OK) break ; } } } // // ジョイスティックの初期化 // int InitJoykey(void) { JOYCAPS joycaps ; // ジョイスティックの情報 int i ; if (!(StickNum = joyGetNumDevs())) return StickNum ; if (StickNum > MAXSTICK) StickNum = MAXSTICK ; for (i = 0; i < StickNum; i++) { memset((void*)&joycaps, 0, sizeof(JOYCAPS)) ; joyGetDevCaps(i, &joycaps, sizeof(JOYCAPS)) ; joyCX[i][0] = (joycaps.wXmax - joycaps.wXmin) / 2 ; // センター値を計算 joyCY[i][0] = (joycaps.wYmax - joycaps.wYmin) / 2 ; joyCX[i][1] = joyCX[i][0] + joycaps.wXmin ; joyCY[i][1] = joyCY[i][0] + joycaps.wYmin ; } return StickNum ; } // // ジョイスティックを返す // WORD GetJoykey(int n) { JOYINFOEX joy ; // ジョイスティック返却値 WORD JOYKEY = 0x0000 ; DWORD c, w ; // キーボードのチェック if (GetAsyncKeyState(VK_ESCAPE ) & 0x8000 ) JOYKEY |= ESCKEY ; if (GetAsyncKeyState(VK_RETURN ) & 0x8000 ) JOYKEY |= RETKEY ; if (GetAsyncKeyState(VK_LEFT ) & 0x8000 ) JOYKEY |= Left ; if (GetAsyncKeyState(VK_RIGHT ) & 0x8000 ) JOYKEY |= Right ; if (GetAsyncKeyState(VK_UP ) & 0x8000 ) JOYKEY |= Up ; if (GetAsyncKeyState(VK_DOWN ) & 0x8000 ) JOYKEY |= Down ; if (GetAsyncKeyState(GAME_KEY_Z) & 0x8000 ) JOYKEY |= AKEY ; if (GetAsyncKeyState(GAME_KEY_X) & 0x8000 ) JOYKEY |= BKEY ; if (GetAsyncKeyState(GAME_KEY_C) & 0x8000 ) JOYKEY |= CKEY ; // ジョイスティックのチェック if (StickNum) { memset((void*)&joy, 0, sizeof(JOYINFOEX)) ; joy.dwSize = sizeof(JOYINFOEX) ; joy.dwFlags = JOY_RETURNALL ; if (joyGetPosEx(n, &joy) == JOYERR_NOERROR) { c = joyCX[n][1] ; w = joyCX[n][0] / 2 ; if (joy.dwXpos < c - w) JOYKEY |= Left ; if (joy.dwXpos > c + w) JOYKEY |= Right ; c = joyCY[n][1] ; w = joyCY[n][0] / 2 ; if (joy.dwYpos < c - w) JOYKEY |= Up ; if (joy.dwYpos > c + w) JOYKEY |= Down ; JOYKEY |= (WORD)(joy.dwButtons << 4) ; } } return JOYKEY ; } // // トリガ // WORD trigger(void) { WORD PAD ; PAD = BACKKEY ^ KEY ; PAD &= KEY ; return PAD ; } // // MIDI再生 // void PlayMIDI(HWND hwnd, char* FileName) { char buf[256] ; sprintf(buf,"open %s type sequencer alias midi", FileName); if (PlayMusic) StopMIDI(hwnd); mciSendString(buf, NULL, 0, NULL) ; mciSendString("seek midi to start", NULL,0, NULL); mciSendString("play midi notify", NULL, 0, hwnd); PlayMusic = TRUE ; LoopMusic = FALSE ; } // // MIDIループ // void ReplayMIDI(HWND hwnd) { mciSendString("seek midi to start", NULL, 0, NULL) ; mciSendString("play midi notify", NULL, 0, hwnd) ; LoopMusic = TRUE ; } // // MIDI停止 // void StopMIDI(HWND hwnd) { if (PlayMusic) { mciSendString("stop midi", NULL, 0, NULL) ; mciSendString("close midi", NULL, 0, NULL) ; PlayMusic = FALSE ; } } // // タイトル // void Title(HWND hwnd) { short etc, i ; if (flag_0) { etc = (short)(rand() % 108) ; if (etc == 1) { // スカイキッドモード sp[0].AnmSP = 3 ; sp[0].SyncCtr = 0 ; sp[0].CharCtr = 0 ; flag_0 = 0 ; } else if (etc == 3) { // 特効モード sp[0].AnmSP = 4 ; sp[0].SyncCtr = 0 ; sp[0].CharCtr = 0 ; flag_0 = 0 ; } else { // 通常飛行 sp[0].Xpos -= 0x0010 ; if (sp[0].Xpos < (-70 << 3)) { sp[0].Xpos = (640 << 3) ; sp[0].Ypos = (short)((rand() % 413) << 3) ; } } } if (!sp[0].Flag) { // 特殊飛行終了 sp[0].AnmSP = 0 ; sp[0].Flag = 1 ; sp[0].SyncCtr = 0 ; sp[0].CharCtr = 0 ; flag_0 = 1 ; } if (sp[0].AnmSP == 4) totu(0) ; // 突撃ぃ if (!enemy_pt) { // 敵機出現 enemy_no = 2 ; Enemy_put((-70 << 3), (short)((rand() % 413) << 3), 0x0010, 0, 1, 0) ; } Enemy_t(0, 2) ; // 敵機の移動 for (i = 0; i < MAXMISSILE; i++) // 弾がうごくぅ missiletbl[missile_on[i]](i) ; KEY = GetJoykey(0) ; if (trigger() & 0x00f0) { // キー入力待ち FirstSet() ; Scene = 1 ; // ゲームメインへ PlayMIDI(hwnd, "kaze95.mid") ; } ScrBMP(hwnd, lpDDSTitle, 0) ; for (i = 20; i < MAXMISSILE + 20; i++) // 弾表示 if (sp[i].disp == TRUE) SpriteHigh(hwnd, i) ; SpriteHigh(hwnd, 2) ; // 敵機表示 SpriteHigh(hwnd, 0) ; // 自棄表示 BACKKEY = KEY ; VsyncFlip(hwnd) ; } // // タイトルのエフェクト // void SetTitle(HWND hwnd) { RECT titleRect ; static short i = 20, j, k = 0, s = 0 ; KEY = GetJoykey(0) ; if (s) { // 背景画像の転送 1 titleRect.left = 0 ; titleRect.top = 0 ; titleRect.right = 640 ; titleRect.bottom = i ; // すでに転送してもうた部分 BltBack(hwnd, 0, 0, titleRect, lpDDSTitle, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT) ; // 背景画像の転送 2 titleRect.left = 0 ; titleRect.top = i ; titleRect.right = 640 ; titleRect.bottom = i + 1 ; for (j = i; j < 480; j++) // ひゅるるんって、転送するところ? BltBack(hwnd, 0, j, titleRect, lpDDSTitle, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT) ; VsyncFlip(hwnd) ; if (trigger() & 0x00f0) i = 320 ; // 何か押した? if (++i < 320) return ; // まだ、描き終わらんの? } else { i = k >> 3 ; for (j = 0; j < 24; j++) { titleRect.left = 0 ; titleRect.top = j * 20 ; titleRect.right = 640 ; titleRect.bottom = j * 20 + i + 1 ; // すでに転送してもうた部分 BltBack(hwnd, 0, j * 20, titleRect, lpDDSTitle, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT) ; titleRect.left = 0 ; titleRect.top = j * 20 + i ; titleRect.right = 640 ; titleRect.bottom = j * 20 + i + 1 ; // すすすって部分 BltBack(hwnd, 0, j * 20 + i, titleRect, lpDDSTitle, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT) ; } VsyncFlip(hwnd) ; if (trigger() & 0x00f0) k = 160 ; // 何か押した? if (++k < 160) return ; } bmpscr[0].LR = 0x0000 ; bmpscr[0].w = 640 ; // 転送幅1 bmpscr[0].sx = 0 ; // 転送幅2 bmpscr[0].sc = 0 ; // スクロール量 bmpscr[0].ww = 0x0000 ; // スクロール用 // すべてのスプライトを非表示にする for (i = 0; i < 255; i++) sp[i].disp = FALSE ; // 自棄のセット sp[0].AnmSP = 0 ; sp[0].Xpos = 640 << 3 ; sp[0].Ypos = 200 << 3 ; sp[0].disp = TRUE ; sp[0].Flag = 1 ; sp[0].CharCtr = 0 ; sp[0].SyncCtr = 0 ; flag_0 = 1 ; // その他の初期化 enemy_pt = 0 ; missile_pt = 0 ; missile_no = 20 ; Scene = 0 ; BACKKEY = KEY ; i = 20 ; k = 0 ; s = 1 - s ; } // // エンディング // short Ending(HWND hwnd, short sb) { RECT endRect ; // 背景画像の転送 endRect.left = 0 ; endRect.top = sb ; endRect.right = 640 ; endRect.bottom = sb + 480 ; BltBack(hwnd, 0, 0, endRect, lpDDSStaff, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT) ; VsyncFlip(hwnd) ; if (++sb >= 2200 - 480) { // 全部表示したらキー入力を待つ sb = 2200 - 480 - 1 ; KEY = GetJoykey(0) ; if (KEY & 0x00f0) { // 何か押した? Scene = 5 ; StopMIDI(hwnd) ; } BACKKEY = KEY ; } return sb ; } // // クリア // void Clear(HWND hwnd, short n) { static short l = 0 ; static short k = 0 ; short i, j ; // 汎用 short rX, rY ; // 転送位置 short x, y ; // マップ座標 RECT bgRect ; // BGパーツ位置情報構造体 // 背景画像の転送 y = scr[2].MapPointY ; for (j = 10; j <= 14; j++) { x = scr[2].MapPointX ; // 転送開始位置セット for (i = 0; i <= 15; i++, x++) { if (x >= MAPWIDTH) x = 0 ; // ループ判定 if (map[2][y][x] == 0) continue ; // BGの0番は非表示 bgRect.left = bg[map[2][y][x]].Xpos ; // 転送元位置セット bgRect.top = bg[map[2][y][x]].Ypos ; bgRect.right = bgRect.left + BGSIZE ; bgRect.bottom = bgRect.top + BGSIZE ; rX = i * BGSIZE - scr[2].ScrCountX ; // 転送先位置セット rY = j * BGSIZE - scr[2].ScrCountY ; if (rY > SURFACEHIGH - BGSIZE - BGSIZE) { // スクロール画面下側のクリップ処理 // これやらんと、海面下に抜ける・・・(笑) if (!scr[2].ScrCountY) continue ; bgRect.bottom = bgRect.top + scr[2].ScrCountY ; } BltBack(hwnd, rX, rY, bgRect, lpDDSBackground, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT) ; // バックバッファにBGをセット } if (++y >= MAPHIGH) y = 0 ; } if (scr[2].MapPointY != 4) { // スクロール値セット if ((scr[2].ScrCountY -= scr[2].ScrSpY) < 0) { // 下スクロールカウント if (--scr[2].MapPointY < 0) scr[2].MapPointY = MAPHIGH - 1 ; scr[2].ScrCountY = BGSIZE - 1; } } else { // 敵戦艦が沈んだ後の処理 scr[2].ScrSpY = 0 ; if (++k > (60 * 3)) { sp[n].Ypos -= 3 << 3 ; if (sp[n].Ypos <= -20 << 3) { sb = 0 ; Scene = 2 ; k = 0 ; PlayMIDI(hwnd, "Kaze95_End.mid") ; } } } } // // ゲームオーバー // void Over(short n) { sp[n].Ypos += 3 << 3 ; if (sp[n].Ypos >= 480 << 3) { Scene = 5 ; lpDSBuffer[0]->Stop() ; lpDSBuffer[1]->Stop() ; lpDSBuffer[2]->Stop() ; } } // // 無敵コマンド // BOOL command_01(void) { WORD pad ; if (pad = trigger()) { com[com_w++] = pad ; //if (com_w >= 16) com_w = 0 ; com_w &= 0x000f ; } BACKKEY = KEY ; return comcmp_01() ; } // // コマンド判定 // BOOL comcmp_01(void) { short i, no ; no = ((com_w + 6) & 0x000f) ; for (i = 0; i < 10; i++) { if (com[no++] != str_01[i]) return FALSE ; no &= 0x000f ; } return TRUE ; } // // メインルーチン // void Main(HWND hwnd) { short i ; // 汎用 KEY = GetJoykey(0) ; if (trigger() & ESCKEY) // ポーズon/off esc_flag = 1 - esc_flag ; if (esc_flag) { // ポーズ中 com_flag_01 = command_01() ; BACKKEY = KEY ; return ; } if (++scf > 3) { if (--dest < 0) dest = 0 ; // 距離の計算 if (--SCRcnt < 0x0001) // スクロールのカウント { SCRcnt = 0x0600 ; scr[2].LR = 0x0000 ; // 船のスクロールを止める bmpscr[0].LR = 0x0000 ; // 背景のスクロールを止める } if (SCRcnt == 0x0180 && sc_flag) { // 船のスクロール開始 scr[2].LR = Right ; sc_flag = 0; } scf = 0 ; } if (flag_0) { // キー入力 sp[0].AnmSP = 0 ; if (KEY & Up ) sp[0].AnmSP = 2 ; if (KEY & Down ) sp[0].AnmSP = 1 ; sp[0].Xpos += mov[KEY & 0x000f][0] * speed ; sp[0].Ypos += mov[KEY & 0x000f][1] * speed ; if (trigger() & AKEY) { // スカイキッドモード sp[0].AnmSP = 3 ; sp[0].SyncCtr = 0 ; sp[0].CharCtr = 0 ; flag_0 = 0 ; } if (trigger() & BKEY) { // 特効モード sp[0].AnmSP = 4 ; sp[0].SyncCtr = 0 ; sp[0].CharCtr = 0 ; flag_0 = 0 ; } if (trigger() & CKEY) // スピード変化 if (++speed > 4) speed = 1 ; if (!com_flag_01) // コマンド判定 for (i = 1; i < 256; i++) // SPRITEとあたった? if (sp[i].disp && atari_sp(0, i)) { lpDSBuffer[0]->Play(0,0,0) ; defence-- ; if (--sp[255].AnmSP < 12) sp[255].AnmSP = 12 ; if (i >= 20) sp[i].disp = FALSE ; } if (atari_bg(0, 2)) { // BGとあたった? lpDSBuffer[0]->Play(0,0,0) ; defence-- ; if (--sp[255].AnmSP < 12) sp[255].AnmSP = 12 ; } if (defence < 1) { // ゲームオーバー判定 sp[0].AnmSP = 6 ; sp[0].SyncCtr = 0 ; sp[0].CharCtr = 0 ; flag_0 = 0 ; flag_1 = 1 ; lpDSBuffer[0]->Stop() ; lpDSBuffer[1]->Play(0,0,0); StopMIDI(hwnd) ; } // 画面から出ちゃいやーん if (sp[0].Xpos < ( 0 << 3)) sp[0].Xpos = ( 0 << 3) ; if (sp[0].Xpos > (565 << 3)) sp[0].Xpos = (565 << 3) ; if (sp[0].Ypos < ( 0 << 3)) sp[0].Ypos = ( 0 << 3) ; if (sp[0].Ypos > (413 << 3)) sp[0].Ypos = (413 << 3) ; } if (sp[0].AnmSP == 4) { // 特効中! totu(0) ; if (atari_bg(0, 2) && scr[2].LR == 0x0000) { sp[0].AnmSP = 6 ; sp[0].SyncCtr = 0 ; sp[0].CharCtr = 0 ; flag_0 = 0 ; flag_1 = 3 ; lpDSBuffer[1]->Play(0,0,0); lpDSBuffer[2]->Play(0,0,0); } } if (!sp[0].Flag) { if (flag_1 == 1) { // ゲームオーバーセット sp[0].Xpos = 260 << 3 ; sp[0].Ypos = -20 << 3 ; sp[0].AnmSP = 8 ; sp[0].Flag = 1 ; sp[0].SyncCtr = 0 ; sp[0].CharCtr = 0 ; flag_1 = 2 ; } else if (flag_1 == 3) { // ゲームクリアセット sp[1].Xpos = sp[0].Xpos - (60 << 3) ; sp[1].Ypos = sp[0].Ypos - (60 << 3) ; sp[1].AnmSP = 10 ; sp[1].Flag = 1 ; sp[0].Xpos = 240 << 3 ; sp[0].Ypos = 480 << 3 ; sp[0].AnmSP = 9 ; sp[0].Flag = 1 ; sp[0].SyncCtr = 0 ; sp[0].CharCtr = 0 ; flag_1 = 4 ; scr[2].MapPointY = 10 ; StopMIDI(hwnd) ; } else { // 特殊捜査終了 sp[0].AnmSP = 0 ; sp[0].Flag = 1 ; sp[0].SyncCtr = 0 ; sp[0].CharCtr = 0 ; flag_0 = 1 ; } } if (flag_1 == 2) Over(0) ; // ゲームオーバー if (enemy_in[enemy_off][0] == SCRcnt) { // 敵機現る! Enemy_put(enemy_in[enemy_off][2], enemy_in[enemy_off][3], enemy_in[enemy_off][4], enemy_in[enemy_off][5], enemy_in[enemy_off][6], enemy_in[enemy_off][1]) ; if (++enemy_off >= 77) enemy_off = 0 ; } for(i = 2; i < 20; i++) // 敵機動く! if (enemy_on[i - 2]) enemytbl[enemy_on[i - 2]](0, i) ; for (i = 0; i < MAXMISSILE; i++) // 弾がうごくぅ if (missile_on[i]) missiletbl[missile_on[i]](i) ; // 奥から順に描画 ScrBMP(hwnd, lpDDSBmp, 0) ; // 背景表示 if (flag_1 != 4) ScrBG(hwnd, 2, 0, 20, 0, 15) ; else Clear(hwnd, 0) ; // ボス表示 ScrBG(hwnd, 0, 0, 20, 0, 15) ; // 遅い雲表示 for (i = 20; i < MAXMISSILE + 20; i++) // 弾表示 if (sp[i].disp == TRUE) SpriteHigh(hwnd, i) ; for (i = 2; i < 20; i++) // 敵表示 if (sp[i].disp == TRUE) SpriteHigh(hwnd, i) ; SpriteHigh(hwnd, 0) ; // 自棄表示 if (sp[1].Flag) SpriteHigh(hwnd, 1) ; // 爆発表示 SpriteHigh(hwnd, 254) ; SpriteHigh(hwnd, 255) ; // 自棄状態表示 SpriteHigh(hwnd, 252) ; SpriteHigh(hwnd, 253) ; Dest(hwnd) ; // 距離表示 ScrBG(hwnd, 1, 0, 20, 0, 15) ; // 速い雲表示 BgAnm() ; VsyncFlip(hwnd) ; BACKKEY = KEY ; return ; } // // 距離の計算及び表示 // void Dest(HWND hwnd) { short n1, n2, tmp ; RECT numRect ; numRect.top = 142 ; numRect.bottom = 167 ; tmp = dest / 100 ; n1 = tmp / 10 ; n2 = tmp - (n1 * 10) ; if (n1) { tmp = n1 * 29 ; numRect.left = 124 + tmp ; numRect.right = 153 + tmp ; BltBack(hwnd, 540, 446, numRect, lpDDSSprite, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT) ; } tmp = n2 * 29 ; numRect.left = 124 + tmp ; numRect.right = 153 + tmp ; BltBack(hwnd, 570, 446, numRect, lpDDSSprite, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT) ; } // // Sprite同士のあたり判定 // BOOL atari_sp(short no_1, short no_2) { short x1, x2 ; x1 = (sp[no_1].Xpos >> 3) - sp[no_1].tmp0 ; x2 = (sp[no_2].Xpos >> 3) + sp[no_2].tmp1; if (x1 - x2 >= 0) return FALSE ; x1 = (sp[no_1].Xpos >> 3) + sp[no_1].tmp1 ; x2 = (sp[no_2].Xpos >> 3) - sp[no_2].tmp0 ; if (x1 - x2 <= 0) return FALSE ; x1 = (sp[no_1].Ypos >> 3) - sp[no_1].tmp2 ; x2 = (sp[no_2].Ypos >> 3) + sp[no_2].tmp3 ; if (x1 - x2 >= 0) return FALSE ; x1 = (sp[no_1].Ypos >> 3) + sp[no_1].tmp3 ; x2 = (sp[no_2].Ypos >> 3) - sp[no_2].tmp2 ; if (x1 - x2 <= 0) return FALSE ; return TRUE ; } // // SPRITEとBGの当たり判定 // BOOL atari_bg(short n, short mp) { short x, y ; short i ; BOOL re = FALSE ; x = scr[mp].MapPointX + (((sp[n].Xpos >> 3) + scr[mp].ScrCountX) / BGSIZE) ; y = scr[mp].MapPointY + (((sp[n].Ypos >> 3) + scr[mp].ScrCountY) / BGSIZE) ; if (x >= MAPWIDTH) x -= MAPWIDTH ; if (y >= MAPHIGH ) y -= MAPHIGH ; i = map[mp][y][x] ; // 敵戦艦とあたったかどうか if (i >= 11 && i <= 12) re = TRUE ; if (i >= 15 && i <= 19) re = TRUE ; if (i >= 25 && i <= 36) re = TRUE ; if (i >= 38 && i <= 43) re = TRUE ; return re ; } // // 特効モード // void totu(short n) { sp[n].Xpos -= (12 << 3) ; if (sp[n].Xpos < 0) { sp[n].Flag = 0 ; sp[n].Xpos = 0 ; return ; } sp[n].Ypos += (12 << 3); if (sp[n].Ypos > (413 << 3)) { sp[n].Flag = 0 ; sp[n].Ypos = (413 << 3) ; } } // // 敵出現 // void Enemy_put(short x, short y, short x1, short y1, short t6, short kind) { sp[enemy_no].AnmSP = 7 ; sp[enemy_no].Xpos = x ; sp[enemy_no].Ypos = y ; sp[enemy_no].tmp4 = x1 ; sp[enemy_no].tmp5 = y1 ; sp[enemy_no].tmp6 = t6 ; sp[enemy_no].disp = TRUE ; sp[enemy_no].CharCtr = 0 ; sp[enemy_no].SyncCtr = 0; enemy_pt++ ; enemy_on[enemy_no - 2] = kind ; if (++enemy_no >= 20) enemy_no = 2 ; } // // 敵異動 // // title void Enemy_t(short my, short n) { sp[n].Xpos += sp[n].tmp4 ; if (sp[n].Xpos >= (640 << 3)) { enemy_pt-- ; enemy_on[n - 2] = 0 ; sp[n].disp = FALSE ; } if ((rand() % 20) < 2) missile_0(my, n) ; } // no_0 void Enemy_0(short my, short n) { return ; } // no_1 void Enemy_1(short my, short n) { sp[n].Xpos += sp[n].tmp4 ; if (sp[n].Xpos >= (640 << 3)) { enemy_pt-- ; enemy_on[n - 2] = 0 ; sp[n].disp = FALSE ; } if ((rand() % 100) < 1) missile_0(my, n) ; } // no_2 void Enemy_2(short my, short n) { sp[n].Xpos += sp[n].tmp4 ; sp[n].Ypos += sp[n].tmp5 * sp[n].tmp6 ; if (sp[n].Xpos >= (640 << 3)) { enemy_pt-- ; enemy_on[n - 2] = 0 ; sp[n].disp = FALSE ; } if (sp[n].Ypos >= (413 << 3)) sp[n].tmp6 = -1 ; if (sp[n].Ypos <= ( 0 << 3)) sp[n].tmp6 = 1 ; if ((rand() % 100) < 1) missile_0(my, n) ; } // no_3 void Enemy_3(short my, short n) { search(my, n, n) ; sp[n].Xpos += (3 << 3) ; sp[n].Ypos += sp[n].tmp5 ; if (sp[n].Xpos >= (640 << 3)) { enemy_pt-- ; enemy_on[n - 2] = 0 ; sp[n].disp = FALSE ; } if (sp[n].Ypos >= (413 << 3)) sp[n].Ypos = (413 << 3) ; if (sp[n].Ypos <= ( 0 << 3)) sp[n].Ypos = ( 0 << 3) ; if ((rand() % 100) < 1) missile_0(my, n) ; } // no_4 void Enemy_4(short my, short n) { ; } // no_5 void Enemy_5(short my, short n) { ; } // // 弾をうつ // // no_0 void missile_0(short my, short n) { missile_on[missile_no - 20] = 1 ; missile_pt++ ; sp[missile_no].AnmSP = 5 ; sp[missile_no].Xpos = sp[n].Xpos + (65 << 3) ; sp[missile_no].Ypos = sp[n].Ypos + (20 << 3) ; sp[missile_no].disp = TRUE ; sp[missile_no].CharCtr = 0 ; sp[missile_no].SyncCtr = 0; search(my, n, missile_no) ; if (++missile_no >= MAXMISSILE + 20) missile_no = 20 ; } // no_1 void missile_1(short my, short n) { return ; } // no_2 void missile_2(short my, short n) { ; } // no_3 void missile_3(short my, short n) { ; } // no_4 void missile_4(short my, short n) { ; } // no_5 void missile_5(short my, short n) { ; } // // 弾異動 // // no_0 void missile_m0(short n) { return ; } // no_1 void missile_m1(short n) { sp[n + 20].Xpos += sp[n + 20].tmp4 ; sp[n + 20].Ypos += sp[n + 20].tmp5 ; if (sp[n + 20].Xpos < (0 << 3) || sp[n + 20].Xpos >= (640 << 3)) { missile_on[n] = 0 ; missile_pt-- ; sp[n + 20].disp = FALSE ; } else if (sp[n + 20].Ypos < (0 << 3) || sp[n + 20].Ypos >= (480 << 3)) { missile_on[n] = 0 ; missile_pt-- ; sp[n + 20].disp = FALSE ; } } // no_2 void missile_m2(short n) { ; } // no_3 void missile_m3(short n) { ; } // no_4 void missile_m4(short n) { ; } // no_5 void missile_m5(short n) { ; } // // 方向検索 // void search(short no_1, short no_2, short no) { short i, y, chk, x1, y1, fx = 1, fy = 1, c = 0, swp ; short xoff, yoff ; // XYの差分をとる x1 = (sp[no_1].Xpos >> 3) - (sp[no_2].Xpos >> 3) ; y1 = (sp[no_1].Ypos >> 3) - (sp[no_2].Ypos >> 3) ; if (x1 < 0) { // 絶対値をとる x1 = -x1 ; fx = -1 ; } if (y1 < 0) { // 絶対値をとる y1 = -y1 ; fy = -1 ; } if (x1 < y1) { // XYの差分のどっちの方が大きいか swp = x1 ; x1 = y1 ; y1 = swp ; c = 1 ; } // 短い方を8倍 y = y1 << 3 ; chk = x1 ; for (i = 0; i < 8; i++) if (y >= chk) chk += x1 ; else break ; // 32方向にする xoff = muki[i][0] ; yoff = muki[i][1] ; if (c) { swp = xoff ; xoff = yoff ; yoff = swp ; } sp[no].tmp4 = xoff * fx ; sp[no].tmp5 = yoff * fy ; } // // 変数初期化 // void FirstSet(void) { short i ; missile_no = 20 ; // 弾のタグナンバー missile_pt = 0 ; // 画面上の弾の数 enemy_off = 0 ; // 敵の出現情報 enemy_no = 2 ; // 敵のタグナンバー enemy_pt = 0 ; // 画面上の敵の数 KEY = 0 ; // 入力用 speed = 1 ; // 自棄のスピード defence = 5 ; // 防御力 flag_0 = 1 ; // 特殊捜査中 flag_1 = 0 ; // ゲームオーバー判定用 SCRcnt = 0x0600 ; // スクロールカウンタ scf = 0 ; sc_flag = 1 ; // スクロール用 dest = 1536 ; // 距離 esc_flag = 0 ; // ポーズ用 com_flag_01 = FALSE ; // コマンドフラグ for (i = 0; i < 255; i++) { sp[i].disp = FALSE ; // 全SPRITEを非表示にする sp[i].Flag = 0 ; // 全SPRITEのFlagをおろす } for (i = 2; i < MAXENEMY + 2; i++) { // 敵のセット sp[i].CharCtr = 0 ; sp[i].SyncCtr = 0; enemy_on[i - 2] = 0 ; } for (i = 20; i < MAXMISSILE + 20; i++) { // 弾のセット sp[i].CharCtr = 0 ; sp[i].SyncCtr = 0; missile_on[i - 20] = 0 ; } // 自棄セット sp[0].Xpos = 320 << 3 ; sp[0].Ypos = 240 << 3 ; sp[0].disp = TRUE ; sp[255].AnmSP = 16 ; // 敵のセット for (i = 2; i < MAXENEMY + 2; i++) { sp[i].Flag = 1 ; sp[i].tmp0 = 0 ; sp[i].tmp1 = 62 ; sp[i].tmp2 = 0 ; sp[i].tmp3 = 20 ; enemy_on[i - 2] = 0 ; } // 弾のセット for (i = 20; i < MAXMISSILE + 20; i++) { sp[i].CharCtr = 0 ; sp[i].SyncCtr = 0; sp[i].Flag = 1 ; sp[i].tmp0 = 0 ; sp[i].tmp1 = 3 ; sp[i].tmp2 = 0 ; sp[i].tmp3 = 3 ; missile_on[i - 20] = 0 ; } // スクロールセット scr[0].LR = Right ; scr[0].MapPointX = 0 ; // マップ座標 scr[0].MapPointY = 0 ; scr[0].ScrCountX = 0 ; // スクロールカウンタ scr[0].ScrCountY = 0 ; scr[0].ScrSpX = 2 ; // スクロール速度 scr[0].ScrSpY = 0 ; scr[1].LR = Right ; scr[1].MapPointX = 0 ; // マップ座標 scr[1].MapPointY = 0 ; scr[1].ScrCountX = 0 ; // スクロールカウンタ scr[1].ScrCountY = 0 ; scr[1].ScrSpX = 8 ; // スクロール速度 scr[1].ScrSpY = 0 ; scr[2].LR = 0x0000 ; scr[2].MapPointX = MAPWIDTH - 20 ; // マップ座標 scr[2].MapPointY = 0 ; scr[2].ScrCountX = 0 ; // スクロールカウンタ scr[2].ScrCountY = 0 ; scr[2].ScrSpX = 1 ; // スクロール速度 scr[2].ScrSpY = 1 ; bmpscr[0].LR = Right ; // スクロール方向 bmpscr[0].w = 640 ; // 転送幅1 bmpscr[0].sx = 0 ; // 転送幅2 bmpscr[0].sc = 1 << 0 ; // スクロール量 bmpscr[0].ww = 0x1111 ; // スクロール用 } // // 初期設定 // void FirstStep(HWND hwnd) { short i, j, k ; HANDLE handle ; DWORD BytesRead ; // TAGセット SpMaxSize = 256 ; sp = (TAGSP*)GlobalAlloc(GPTR, sizeof(TAGSP) * SpMaxSize) ; if (sp == NULL) { MessageBox(hwnd, "Memory Allocation Error sp", TITLE, MB_OK) ; CreateFail(hwnd) ; } // 自棄 sp[0].CharCtr = 0 ; sp[0].SyncCtr = 0; sp[0].AnmSP = 0 ; sp[0].Flag = 1 ; sp[0].tmp0 = -10 ; sp[0].tmp1 = 62 ; sp[0].tmp2 = -10 ; sp[0].tmp3 = 20 ; // 情報 sp[254].Xpos = 10 << 3 ; sp[254].Ypos = 10 << 3 ; sp[254].disp = TRUE ; sp[254].AnmSP = 11 ; sp[254].Flag = 1 ; sp[255].Xpos = 180 << 3 ; sp[255].Ypos = 10 << 3 ; sp[255].disp = TRUE ; sp[255].Flag = 1 ; // 距離 sp[252].Xpos = 394 << 3 ; sp[252].Ypos = 420 << 3 ; sp[252].disp = TRUE ; sp[252].AnmSP = 17 ; sp[252].Flag = 1 ; sp[253].Xpos = 600 << 3 ; sp[253].Ypos = 446 << 3 ; sp[253].disp = TRUE ; sp[253].AnmSP = 18 ; sp[253].Flag = 1 ; // SPRITEセット handle = CreateFile("game.dat", GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ; if (handle == NULL) { MessageBox(hwnd, "File Open Error!", TITLE, MB_OK) ; CreateFail(hwnd) ; } if (ReadFile(handle, &SpAnmSize, sizeof(short), &BytesRead, NULL) == FALSE) { MessageBox(hwnd, "File Read Error SpAnmSize", TITLE, MB_OK) ; CreateFail(hwnd) ; } spanm = (SPANM*)GlobalAlloc(GPTR, sizeof(SPANM) * SpAnmSize) ; if (spanm == NULL) { MessageBox(hwnd, "Memory Allocation Error spanm", TITLE, MB_OK) ; CreateFail(hwnd) ; } for (i = 0; i < SpAnmSize; i++) { if (ReadFile(handle, &spanm[i].AnmSize, sizeof(short), &BytesRead, NULL) == FALSE) { MessageBox(hwnd, "File Read Error spanm.AnmSize", TITLE, MB_OK) ; CreateFail(hwnd) ; } if (ReadFile(handle, &spanm[i].Flag, sizeof(short), &BytesRead, NULL) == FALSE) { MessageBox(hwnd, "File Read Error spanm.Flag", TITLE, MB_OK) ; CreateFail(hwnd) ; } spanm[i].spanm = (SPPARTS*)GlobalAlloc(GPTR, sizeof(SPPARTS) * spanm[i].AnmSize) ; if (spanm[i].spanm == NULL) { MessageBox(hwnd, "Memory Allocation Error spanm[i].spanm", TITLE, MB_OK) ; CreateFail(hwnd) ; } for (j = 0; j < spanm[i].AnmSize; j++) { if (ReadFile(handle, &spanm[i].spanm[j].Sync, sizeof(short), &BytesRead, NULL) == FALSE) { MessageBox(hwnd, "File Read Error Sync", TITLE, MB_OK) ; CreateFail(hwnd) ; } if (ReadFile(handle, &spanm[i].spanm[j].FormSize, sizeof(short), &BytesRead, NULL) == FALSE) { MessageBox(hwnd, "File Read Error FormSize", TITLE, MB_OK) ; CreateFail(hwnd) ; } spanm[i].spanm[j].form = (FORM*)GlobalAlloc(GPTR, sizeof(FORM) * spanm[i].spanm[j].FormSize) ; if (spanm[i].spanm[j].form == NULL) { MessageBox(hwnd, "Memory Allocation Error form", TITLE, MB_OK) ; CreateFail(hwnd) ; } for (k = 0; k < spanm[i].spanm[j].FormSize; k++) if (ReadFile(handle, &spanm[i].spanm[j].form[k], sizeof(FORM), &BytesRead, NULL) == FALSE) { MessageBox(hwnd, "File Read Error form", TITLE, MB_OK) ; CreateFail(hwnd) ; } } } CloseHandle(handle) ; // BGセット BgMaxSize = 45 ; BgAnmSize = 2 ; bganm = (BGANM*)GlobalAlloc(GPTR, sizeof(BGANM) * BgMaxSize) ; if (bganm == NULL) { MessageBox(hwnd, "Memory Allocation Error bganm", TITLE, MB_OK) ; CreateFail(hwnd) ; } bganm[0].AnmSize = 4 ; bganm[0].bganm = (BGPARTS*)GlobalAlloc(GPTR, sizeof(BGPARTS) * bganm[0].AnmSize) ; if (bganm[0].bganm == NULL) { MessageBox(hwnd, "Memory Allocation Error bgparts", TITLE, MB_OK) ; CreateFail(hwnd) ; } bganm[0].bganm[0].Xpos = 0; bganm[0].bganm[0].Ypos = 0 ; bganm[0].bganm[0].Sync = 20 ; bganm[0].bganm[1].Xpos = 32 ; bganm[0].bganm[1].Ypos = 0 ; bganm[0].bganm[1].Sync = 5 ; bganm[0].bganm[2].Xpos = 64 ; bganm[0].bganm[2].Ypos = 0 ; bganm[0].bganm[2].Sync = 20 ; bganm[0].bganm[3].Xpos = 32 ; bganm[0].bganm[3].Ypos = 0 ; bganm[0].bganm[3].Sync = 5 ; bganm[1].AnmSize = 2 ; bganm[1].bganm = (BGPARTS*)GlobalAlloc(GPTR, sizeof(BGPARTS) * bganm[0].AnmSize) ; if (bganm[1].bganm == NULL) { MessageBox(hwnd, "Memory Allocation Error bgparts", TITLE, MB_OK) ; CreateFail(hwnd) ; } bganm[1].bganm[0].Xpos = 0; bganm[1].bganm[0].Ypos = 32 ; bganm[1].bganm[0].Sync = 10 ; bganm[1].bganm[1].Xpos = 0 ; bganm[1].bganm[1].Ypos = 64 ; bganm[1].bganm[1].Sync = 10 ; } // // メモリ解放 // void CleanMem(void) { short i, j ; if (bganm[1].bganm != NULL) GlobalFree(bganm[1].bganm) ; if (bganm[0].bganm != NULL) GlobalFree(bganm[0].bganm) ; if (bganm != NULL) GlobalFree(bganm) ; for (i < 0; i < SpAnmSize; i++) { for (j = 0; j < spanm[i].AnmSize; j++) if (spanm[i].spanm[j].form != NULL) GlobalFree(spanm[i].spanm[j].form) ; } for (i < 0; i < SpAnmSize; i++) if (spanm[i].spanm != NULL) GlobalFree(spanm[i].spanm) ; if (spanm != NULL) GlobalFree(spanm) ; if (sp != NULL) GlobalFree(sp) ; }