/********************************************************************************/ /* PROJECT A   SINCE ’01 3/11               */ /********************************************************************************/ /********************************************************************************/ /*プログラムTIPS                              */ /* ・リプレイ                                 */ /*   ELでは内部的にゲームループでSRANDを使っている。         */ /*   そのため、INIT時にSRANDしただけでは正常にリプレイされない。  */ /*   そこで、ELのゲームループが介入できない場所、即ち、          */ /*   RAND()%を使用する直前でSRANDする。             */ /*   この時、SRANDの引数は、CH[0].Xなどの              */ /*   同じ値の保障される変数を使用するとよい。                */ /********************************************************************************/ /********************************************************************************/ /* ヘッダファイル読み込み                           */ /********************************************************************************/ //#define REPORT #include "el.h" // elライブラリ #include "elDraw32.h" // MMX #include "key.h" // 仮想キーコードヘッダ #include "fps.h" // FPS固定ライブラリ /********************************************************************************/ /* 定義                                    */ /********************************************************************************/ #define EFECT_MAX 8 // エフェクトの個数 #define TEKI_MAX 500 // 敵の人数 #define TOBI_MAX 10 // 炎の飛び散り #define SHOT_MAX 50 // 弾 #define TSHOT_MAX 50 // 敵の弾 #define REPLAY_MAX 30*60*30*2 // ログの最大数(30FPS*(60*30)秒*2PLAYER) #define MAGIC_MAX 1000 // 魔法エフェクト粒子の最大数 #define ITEM_MAX 50 // アイテムの最大数 #define TEKIHP_MAX 6 // 一画面に表示する敵のHPの数 int REG=0; // レジストしたかどうか /********************************************************************************/ /* 画面宣言                                  */ /********************************************************************************/ #define MAIN_SCREEN 1 // ゲーム  画面 #define EFECT_SCREEN 2 // ロゴ   画面 #define MENU_SCREEN 3 // メニュー 画面 #define REPLAY_SCREEN 4 // リプレイ 画面 #define CONFIG_SCREEN 5 // コンフィグ画面 #define CHARSELECT_SCREEN 6 // キャラセレ画面 #define NAMEENTRY_SCREEN 7 // ネームエントリー画面 #define RANKING_SCREEN 8 // ランキング画面 #define SCOREATACK_SCREEN 9 // スコアアタック画面 #define REPLAYSEL_SCREEN 10 // リプレイセレクト画面 #define RESULT_SCREEN 11 // スコアアタックリザルト画面 #define REPLAY2_SCREEN 12 // リプレイ画面2(ランキングVER) #define CONTINUE_SCREEN 13 // コンテニュー画面 #define CLEAR_SCREEN 14 // ステージクリア画面 #define OP_SCREEN 15 // オープニング画面 #define DEMO_SCREEN 16 // デモ画面 #define TITLE_SCREEN 17 // タイトル画面 #define ENDING_SCREEN 18 // エンディング画面 #define RESULT2_SCREEN 19 // リザルト画面2 void MainScreen(void); // 実際にプログラムを定義する関数です。 void EfectScreen(void); // 実際にプログラムを定義する関数です。 void MenuScreen(void); // 実際にプログラムを定義する関数です。 void ReplayScreen(void); // 実際にプログラムを定義する関数です。 void ConfigScreen(void); // 実際にプログラムを定義する関数です。 void CharSelectScreen(void); void NameEntryScreen(void); void RankingScreen(void); void ScoreatackScreen(void); void ReplaySelScreen(void); void ResultScreen(void); void Replay2Screen(void); void ContinueScreen(void); void ClearScreen(void); void OpScreen(void); void DemoScreen(void); void TitleScreen(void); void EndingScreen(void); void Result2Screen(void); /********************************************************************************/ /* オプション初期値設定                            */ /********************************************************************************/ #define DB 0 // 1にすると、デバッグモード #define MIDI 1 // 0にするとMIDI OFF int windowmode=1; // ウインドウ? int FpsDraw=0; // FPS描く? int com=999; // これはコンピュータにするプレイヤー番号、メニュー画面では999をとる int REPLAY=1; // リプレイモード(0-ログを取らない 1-ログを取る 2-ログから再生) int AAFONT=0; // アンチエリアスフォント int ALFA=1; // アルファブレンディング? int demo=0; // デモ int comtype=2; // コンピューターのタイプ(0-何もしない 1-攻撃的 2-保守的) //キーコンフィグ(配列の0が1P 1が2P) int usejoypad[2]={0,0}; //ジョイパッドを使うときは、そのID 0だとキーボード int UpCKey[2] ={VK_UP,VK_T }; //キーコードが入る。ジョイパッド時は無効 int DownCKey[2] ={VK_DOWN,VK_G }; //キーコードが入る。ジョイパッド時は無効 int LeftCKey[2] ={VK_LEFT,VK_F }; //キーコードが入る。ジョイパッド時は無効 int RightCKey[2]={VK_RIGHT,VK_H }; //キーコードが入る。ジョイパッド時は無効 int ShotCKey[2] ={VK_Z,VK_SHIFT }; //キーコードが入る。ジョイパッド時はボタン番号 int ItemCKey[2] ={VK_X,VK_SPACE }; //キーコードが入る。ジョイパッド時はボタン番号 int JumpCKey[2] ={VK_C,VK_A }; //ジャンプはボタンか↑キーのどちらでも可 /********************************************************************************/ /* 変数初期化                                 */ /********************************************************************************/ //キャラクターデータ struct chardata{ int x; // X位置(全体のスクリーン座標) (BMP上の「キャラの中心」をこのXとする。) int y; // Y位置 int s; // 移動速度 int ax; // X加速度 float ay; // Y加速度 int hp; // HP int anime; // 剣を振るアニメ int jump; // ジャンプ用変数 int sizex; // キャラのXの大きさ int sizey; // キャラのYの大きさ int hantei; // 足にあるチップ int dashr,dashl,nowdash,dashho,dashtimer; //ダッシュ int zantimer; // 残像のタイマー int motion; // 走ったりする絵の指定用変数 int ho; // キャラの向いている方向 0-右 1-左 int mp; int center; // キャラの中央の位置(BMPの左からキャラの中心までのX距離) int waza; // 現在の切りパターン番号 int endanime; //モーションが終わるモーション番号 int wazatimer; //モーションが繋がるタイマー int wazano; //モーション状態 int dmtimer; //くらい中タイマー int type; //キャラは? 0:シーク 1:ミル int mhp; //最大HP int mmp; //MP int jumps; //ジャンプ力 int tyouhi; //超必タイマー }ch[2];//={{320,572,5,0,218,150,0,0,150,100,0,0,0,1,0,0,0,0,0,50,20,-1,0,0,0},{320,572,5,0,218,150,0,0,150,100,0,0,0,1,0,0,0,0,0,50,20,-1,0,0,0}}; int cn; // 選択しているキャラ番号 int combo;//=0; // コンボ int maxcombo; //最大コンボ int combotimer;//=0; // コンボタイマー int combox,comboy; // コンボ表示をする場所 int oldcombo; // 前回のコンボ int oldcombo_t; // 前回のコンボを表示しておく時間 //HP回復アイテム struct care_efect{ int a; //回復させるキャラNO int time; //回復時間 }care[10]; //カメラ int cx;//=160; int cy;//=480; int cx2;//=160; int cx3;//=160; //スコア int sc;//=0; //弾 struct shot{ int x; int y; int ax; int ay; int a; }sh[SHOT_MAX]; //敵の弾 struct tekishot{ int x; int y; int ax; int ay; int a; int at; int ho; int anime; }tsh[TSHOT_MAX]; //飛び散りエフェクト struct tobi{ int x; int y; int ax; int ay; int a; }tb[36*TOBI_MAX]; //残像 struct zanzou{ int x; int y; int a; int anime; int ho; }zan[10]; //キー情報 int LeftKey,RightKey,UpKey,DownKey,ShotKey,ItemKey,SpaceKey,PauseKey; int LK[3],RK[3],UK[3],DK[3],SK[3],IK[3]; //システム変数 int i,j,k,l,r,rr,rrr; //敵 struct teki{ int x; int y; int sizex; int sizey; int a; int hp; int mhp; int ax; int ay; int hairetux; //配列上のX座標 int hairetuy; //配列上のY座標 int type; int kurai; //仰け反り判定 int kougeki; //攻撃の周期用タイマー int dawntimer; //倒したときのエフェクト用のタイマー int dx; //前回のX位置 int dy; int cg; //グラフィックの判断番号 int motion; //モーション int ho; //方向 int at; //攻撃力 int upper; //剣で斬ったときに持ち上がる量 int now; //攻撃パターン管理用 }tk[TEKI_MAX]; int dmtekino[TEKIHP_MAX]; //今ダメージを与えている敵 int dmtekitimer[TEKIHP_MAX]; //表示しておく時間(↑を) int bhp; //表示しているボスのHP //アイテム struct item{ int x; //X座標 int y; //Y座標 int ax; //X方向加速度 int ay; //Y方向加速度 int sizex; //X方向サイズ int sizey; //Y方向サイズ int a; //アイテム番号 int timer; //タイマー }it[ITEM_MAX]; //魔法のエフェクト struct magic{ int x; int y; int ax; int ay; int motion; int a; }ma[MAGIC_MAX]; // エフェクト struct efect{ int x; int y; int a; }ef[EFECT_MAX]; int efecttimer=0; //ステージデータ FILE *fp; int stagedata[1000][31]; //1チップ32*24 //リプレイデータ struct replaydata_database{ int left; //データの終端にはここに9が入る int right; int up; int down; int shot; int item; }replay_data[REPLAY_MAX],*re_p; //ランキング struct rnking{ char name[4]; //名前 int sc; //スコア int hit; //マックスヒット }rk[5]; int rankingno; //ランクインした時の順位 //ファイル情報保存用変数 char replay_file_name[256][256]; //ファイル名保存用配列 int how_many_file=0; //見つかったファイルの数 //文字描画関数用状態保持関数 int moji_x,moji_y; //カレントポジション int rval,gval,bval; //色 //状態変数 int now_jump=0; //今ジャンプ中? int now_game=0; //今MAIN_SCREEN中? int pause=0; //ポーズ? int nowmes;//=1; //今メッセージ表示中? int nowbokasi=0; //今ぼかし中? int gameovert;//=0;//ゲームオーバータイマー int warning;//=0; //ワーニングタイマー float nijimi=0; //にじませる 0.1を指定します。 int boss;//=0; //ボス?(ボス戦はスクロール不可にする) int bcx,bcx2,bcx3; //スクロールロック int mes_no; //ステージ3用イベントスイッチ int nameentry=0; //ネームエントリー中? //READY描画タイマー int mlevel=60; //ブラインドタイマー int blind_timer=0; //0 ブラインド処理をしない 1 +ブラインド開始 20 -ブラインド開始 int blind_mode=1; //+か-かでブラインドモード変更 //ネームエントリー char name[4]; //前回の名前の保持 //無敵時間 int muteki; //時間 int now_time; //復活する時の場所 int dx,dy; //ステージ int stage; //ステージ番号 int stage_clear; //ステージクリアした? //歩道にのった? int hodou; //魔王戦のイベント int ivent=0; /********************************************************************************/ /* 関数宣言                                  */ /********************************************************************************/ void bmpload(void); //画像読み込み void keyinput(void); //キー入力 void inkey(void); //ゲーム中以外用キー入力 void inkey_menu(void); //メニュー用キー入力関数 void first_init(void); //初期設定 void game_init(void); //キャラの初期設定とか。 void next_stage(void); //ステージ移行の設定 void same_init(void); //共通の初期化処理 void stage_bmp_load(void); //ステージBMP読み込み //キャラクター操作処理 void char_dash(void); //ダッシュ処理 void char_do(void); //キャラクターの行動 void char_jump(void); //キャラクターのジャンプ void char_g(void); //重力処理 void char_zanzo(void); //残像処理 void char_remit(void); //キャラの画面端処理 void char_hantei(void); //キャラの足の当たり判定検出 void char_motion(void); //キャラのモーション判別処理 //方向制御関数 int ho(int data); //右方向のスカラーを左方向のスカラーに変換 //ゲームメイン処理 void main_camera(int); //カメラ操作 void main_atari(void); //当たり判定 void main_atari_kurai(int at,int ho); //食らったときのラッピング処理 void main_atari_chp(int no); //ダメージを与えている敵のHPを表示する void main_combo_cnt(void); //コンボカウント処理 void main_down(void); //ダウン処理 void main_muteki(void); //無敵時間処理 void main_gameover(void); //ゲームオーバー処理 void main_pause(void); //ポーズ処理 //マルチメディア関数 void play_bgm(int no); //BGM再生関数 void bgm_play_stage(); //ステージBGM再生関数 //描画関数 void draw_gamen(void); //画面描画 void draw_efect(void); //エフェクト描画 void draw_char(void); //キャラ描画 void draw_zanzo(void); //残像描画 void draw_magic(void); //魔法描画 void draw_stage(void); //ステージ1という描画 void draw_combo(void); //ヒット数描画 void draw_mes(void); //メッセージ描画 void draw_wide(void); //ワイド画面の黒い部分描画 void draw_wide2(int); //サイズ指定描画 void draw_wide3(int); //サイズ指定半透明描画 void draw_warning(void); //ワーニング描画 void draw_blind(void); //ブラインド描画関数 void draw_coin(void); //コイン描画 void draw_bokasi(void); //ぼかし描画 void draw_hp(void); //HP描画 void draw_blind_ranking(int b_t); //白ブラインド void draw_chp(void); //敵のHP描画 void draw_data(void); //スコアなどの描画 void draw_kage(void); //影描画 void draw_back(void); //背景描画 void draw_jimen(void); //地面描画 void draw_tama(void); //弾描画 void draw_back_center(void);//手前背景描画 void draw_care(void); //回復エフェクト void draw_ivent(void); //イベント //敵関数 void teki(void); //敵関数 void teki_walk(void); //敵が歩く void teki_remit(void); //敵が画面外に出たか、地面の判定 void teki_think(void); //敵の思考、行動 void teki_kage(void); //敵の影描画 void teki_draw(void); //敵描画 void teki_down(void); //敵を倒した? void teki_maoh(void); //魔王思考ルーチン関数 //ボス関数 void boss_make(void); //出現 void boss_think(void); //思考 void boss_remit(void); //ボススクロールロック処理 void boss_hp(void); //ボスのHP描画 void boss_bgm(void); //BGM //リプレイ関数 void replay_getlog(void); //このターンのログを取る void replay_putlog(void); //ログからデータを出力 void replay_fileout(char *name);//ログをファイルに書き出し void replay_filein(char *name); //ログをファイルから入力 void replay_init(void); //リプレイの初期設定 void replay_pack_data(char *p); //データ圧縮 void replay_open_data(char *p); //データ解凍 void replay_drawdata(char *); //ヘッダからスコア描画 //ラッピング関数 void pos(int x,int y); //カレントポジション変更 void color(int red,int green,int blue); //文字色設定 void print(char *str); //文字描画 void dech(int decha,char *dechdata); //数値、文字列変換関数 void swap(int *p,int *p2); //入れ替え関数 //ファイル検索関数 void seek_replay_file(char *cdir); //ステージデータ関数 void stagedataload(void); // ステージLOAD void maketeki(void); // 敵作成 //衝突関数 BOOL crect(int x1,int y1,int sizex1,int sizey1,int x2,int y2,int sizex2,int sizey2); //短形衝突判定関数 BOOL crect2(int p1,int p2,int p3,int p4); //攻撃当たり判定関数 //コンフィグ関数 void config_save(void); //コンフィグデータ書き込み void config_load(void); //コンフィグデータ読み込み //デバイスチェック関数 int check_device(int playerno); //playernoのデバイスをチェックし、返す void set_device(int playerno,int deviceno); //playernoのデバイスにdevicenoのデバイスを入れる //敵の当たり判定関数 int teki_hantei(void); //敵のいる位置のマップコードを返す。 //ランキング関数 void ranking_save(void); //ランキングデータをセーブします。 void ranking_load(void); //ランキングデータをロードします。 //レジストチャック関数 void CheckReg(void); //レジストチェック関数 void Next(void); //続きは製品版で♪ /********************************************************************************/ /* オブジェクト初期化                             */ /********************************************************************************/ DDOBJ ChBMP; //キャラクター DDOBJ ZanBMP; //残像 DDOBJ BackBMP; //背景 DDOBJ Back2BMP; //背景 DDOBJ Back3BMP; //背景 DDOBJ Back4BMP; //背景 DDOBJ EfBMP[13]; //エフェクト DDOBJ Ef2BMP[13]; //エフェクト DDOBJ TobiBMP; //飛び散り DDOBJ Tobi2BMP; //飛び散り2 DDOBJ JimenBMP; //歩ける地面 DDOBJ Hp2BMP; //HP DDOBJ Ch2BMP; //キャラ2P DDOBJ Zan2BMP; //残像2P DDOBJ WakuBMP; //HPの枠 DDOBJ SwordBMP; //剣の残像 DDOBJ MagicBMP; //魔法 DDOBJ KenBMP; //剣のエフェクト DDOBJ StageBMP; //ステージ1という表示 DDOBJ NoBMP; //数字フォント(14*18) DDOBJ TogeBMP; //トゲ DDOBJ WarningBMP; //ワーニング DDOBJ WabarBMP; //ワーニングのバー DDOBJ MiruBMP; //ミル DDOBJ SeekBMP; //シ−ク DDOBJ Mon1BMP; //モンスター DDOBJ Mon2BMP; //モンスター2 DDOBJ Mon22BMP; //モンスター2-2 DDOBJ Mon3BMP; //モンスター3 DDOBJ Mon4BMP; //モンスター4 DDOBJ Mon42BMP; //モンスター4-2 DDOBJ Mon5BMP; //モンスター5 DDOBJ Mon52BMP; //モンスター5-2 DDOBJ OnoBMP; //斧 DDOBJ IwaBMP; //ボス2の岩 DDOBJ BeemBMP; //ビーム DDOBJ Beem2BMP; //ボスの弾 DDOBJ Beem3BMP; //リッチ DDOBJ MonbufBMP; //モンスターバッファ DDOBJ BufBMP; //バッファ DDOBJ CoinBMP; //コイン DDOBJ Kabe2BMP; //壊せる壁 DDOBJ SbufBMP; //ゲーム画面を保持するバッファ DDOBJ BarBMP; //HPのフレーム DDOBJ HpbarBMP; //HP部分 DDOBJ MpbarBMP; //MP部分 DDOBJ ReplayBMP; //リプレイモード1 DDOBJ Replay2BMP; //リプレイモード2 DDOBJ DataBMP; //データ(スコアとか)用の枠(80*26) DDOBJ Cont1BMP; //コンテニュー?YES DDOBJ Cont2BMP; //コンテニュー?NO DDOBJ KageBMP; //影 DDOBJ ClearBMP; //ステージクリア DDOBJ JumpBMP; //ジャンプ台 DDOBJ HodouBMP; //動く歩道 DDOBJ OpBMP; //オープニング DDOBJ Magic2BMP; //魔法(青) DDOBJ MillatBMP; //ミルの攻撃エフェクト DDOBJ Ef3BMP[13]; //エフェクト3 DDOBJ BosshpBMP; //ボスのHPゲージ DDOBJ BossBMP; //ボス DDOBJ Boss2BMP; //ボス2 DDOBJ Title2BMP; //タイトル2 DDOBJ BlackBMP; //黒 DDOBJ Data2BMP; //ScやTimeの枠の背景 DDOBJ LoadBMP; //ロード画面 DDOBJ LifeBMP; //HP回復アイテム DDOBJ RazelBMP; //ラゼル DDOBJ BitBMP; //ビット DDOBJ Maoh3BMP; //魔王の弾 DSOBJ SlashWAV; // スラッシュWAV DSOBJ WinWAV; // 倒した  WAV DSOBJ HuruWAV; // 振る   WAV DSOBJ SutaWAV; // 着地   WAV DSOBJ FireWAV; // 炎    WAV DSOBJ SelectWAV; // 選択 DSOBJ OkWAV; // 決定   WAV DSOBJ CoinWAV; // コイン  WAV DSOBJ CanselWAV; // キャンセルWAV DSOBJ BeemWAV; // ビーム  WAV DSOBJ Hit2WAV; // ダメージを受けたときのWAV DSOBJ CareWAV; // 回復   WAV DSOBJ GogogoWAV; // ゴゴゴ  WAV DSOBJ MaohWAV; // 魔王が魔法を打つ DDOBJ LogoBMP; //PRO”A”ロゴ DDOBJ TitleBMP; //タイトル DDOBJ WhiteBMP; //白 DDOBJ LightBMP; //ライト /********************************************************************************/ /* 共通の初期化処理                              */ /********************************************************************************/ void same_init(void) { //敵を消去 for(i=0;i=10){str2[7+4]=i-10+'0';EfBMP[i-1]=elDraw::LoadObject(str2,LOAD_RAM);} // BMPを読み込みます。 str [2+4]='2'; str2[2+4]='2'; if(i<=9) { str[6+4]=i+'0' ;Ef2BMP[i-1]=elDraw::LoadObject(str,LOAD_RAM) ;} // BMPを読み込みます。 if(i>=10){str2[7+4]=i-10+'0';Ef2BMP[i-1]=elDraw::LoadObject(str2,LOAD_RAM);} // BMPを読み込みます。 str [2+4]='3'; str2[2+4]='3'; if(i<=9) { str[6+4]=i+'0' ;Ef3BMP[i-1]=elDraw::LoadObject(str,LOAD_RAM) ;} // BMPを読み込みます。 if(i>=10){str2[7+4]=i-10+'0';Ef3BMP[i-1]=elDraw::LoadObject(str2,LOAD_RAM);} // BMPを読み込みます。 } //雨初期化 for(i=0;i0) RK[cn]=PUSH_KEY; if(r<0) LK[cn]=PUSH_KEY; if(rr>0) DK[cn]=PUSH_KEY; if(rr<0) UK[cn]=PUSH_KEY; } else { if(r>0) RK[cn]=HOLD_KEY; if(r<0) LK[cn]=HOLD_KEY; if(rr>0) DK[cn]=HOLD_KEY; if(rr<0) UK[cn]=HOLD_KEY; } //今回の位置を保持 dr=r; drr=rr; //ボタン入力 for(i=0;i<4;i++) { //iをボタンIDに変換 switch(i) { case 0: r=BUTTON1; break; case 1: r=BUTTON2; break; case 2: r=BUTTON3; break; case 3: r=BUTTON4; break; } //ジョイパッドNOをIDに変換 if(usejoypad[cn]==1) rr=JOY1; else rr=JOY2; //ボタン入力 r=elJoystick::ButtonInfo(rr,r); //キーフラグに入力 if(ShotCKey[cn]==i) SK[cn]=r; if(ItemCKey[cn]==i) IK[cn]=r; if(JumpCKey[cn]==i) if(UK[cn]==FREE_KEY) UK[cn]=r; } } else { //キーボード elSystem::GetKey(LeftCKey[cn] ,&LK[cn]); elSystem::GetKey(RightCKey[cn],&RK[cn]); elSystem::GetKey(UpCKey[cn] ,&UK[cn]); elSystem::GetKey(DownCKey[cn] ,&DK[cn]); elSystem::GetKey(ShotCKey[cn] ,&SK[cn]); elSystem::GetKey(ItemCKey[cn] ,&IK[cn]); if(UK[cn]!=PUSH_KEY) elSystem::GetKey(JumpCKey[cn],&UK[cn]); } //コンピュータ //企画 //オプションでコンピューター思考ルーチンを変更できるように! // ・何もしない // ・攻撃! // ・魔法で援護! // ・主人公の動きをトレース! if((cn==com || com==2) && ch[cn].hp>0 && nowmes==0) { static int target=218; //初期化 LK[cn]=FREE_KEY; RK[cn]=FREE_KEY; UK[cn]=FREE_KEY; DK[cn]=FREE_KEY; SK[cn]=FREE_KEY; IK[cn]=FREE_KEY; r=0; //行動した?っていうフラグ rr=125; //1Pとこの距離だけ離れたら近づける if(target==218 || comtype!=1) rr=75; if(ch[cn].x>ch[1-cn].x+rr) { LK[cn]=HOLD_KEY; r=1; } if(ch[cn].xch[1-cn].y+50) { UK[cn]=PUSH_KEY; r=1; } //攻撃的なCOM //行動していなかったら、敵を検索して攻撃フェーズに以降 int koudou; //行動したか koudou=r; if(comtype==1) { j=218; //敵の検索フェーズ l=0; for(i=0;ir) j=i; l++; //敵の人数 } } } //超必殺 if(l>20 && ch[cn].mp>=ch[cn].mmp/2) { DK[cn]=PUSH_KEY; SK[cn]=PUSH_KEY; IK[cn]=PUSH_KEY; j=218; } //魔法 if(l>10 && ch[cn].mp>0) { IK[cn]=HOLD_KEY; j=218; } //攻撃フェーズ if(j!=218) { //対象への距離 r=(ch[cn].x-(tk[j].x+tk[j].sizex/2)); r=r*r; rr=((ch[cn].y+ch[cn].sizey/2)-(tk[j].y+tk[j].sizey/2)); rr=rr*rr; k=r+rr; //移動 //if(koudou==0) //{ r=ch[cn].x-(tk[j].x+tk[j].sizex/2); if(r<0) r*=-1; if((r>25 && ch[cn].hp>ch[cn].mhp/4) || (r>50 && ch[cn].hp tk[j].y+tk[j].sizey)///2) UK[cn]=PUSH_KEY; //攻撃 if(k<=2500 || ch[cn].waza==7) if(ch[cn].wazatimer<13) SK[cn]=PUSH_KEY; } //優先順位(1Pが左に行っているとき、右に敵がいてもキャンセルさせる) if(LK[1-cn]==HOLD_KEY && RK[cn]==HOLD_KEY) { RK[cn]=FREE_KEY; LK[cn]=HOLD_KEY; } if(RK[1-cn]==HOLD_KEY && LK[cn]==HOLD_KEY) { LK[cn]=FREE_KEY; RK[cn]=HOLD_KEY; } target=j; } //保守的なCOM if(comtype==2) { rr=0; for(j=0;j0) { dx=ch[1-cn].x; dy=ch[1-cn].y; } continue; } //二人とも生きている場合 if(ch[cn].hp>0 && ch[1-cn].hp>0) { dx=ch[cn].x; dy=ch[cn].y; } //キー入力 if(nowmes==0 && mes_no!=6) keyinput(); //リプレイ if(REPLAY==1) replay_getlog(); //出力 if(REPLAY==2) replay_putlog(); //入力 //行動 char_do(); //行動 char_dash(); //ダッシュ char_jump(); //ジャンプ char_remit(); //キャラの画面端処理 char_g(); //重力 char_zanzo(); //残像処理 //if(ch[cn].tyouhi==0) char_motion(); //モーション処理 if(ch[cn].y5)) && stage!=4) { if(stage!=3 && stage!=4) nowbokasi=1; //倒したエフェクト stage_clear=1; //デバッグ boss=0; } //ラゼルを倒したイベントタイマ if(boss==2 && tk[0].hp<1 && stage==3 && mes_no!=5) { nowbokasi=1; //倒したエフェクト for(i=0;i140) { if(stage!=3) elMusic::Stop(); now_game=0; elCallScreen(CLEAR_SCREEN); } } } } } main_pause(); //ポーズ処理 //デモからの復帰 if(demo==1 && nowmes==0) { inkey_menu(); if(ShotKey!=FREE_KEY) { play_bgm(22); elCallScreen(TITLE_SCREEN); } } } /********************************************************************************/ /* ボス関数                                */ /********************************************************************************/ //出現 void boss_make(void) { switch(stage) { case 1: tk[0].hp=250; tk[0].sizex=160; tk[0].sizey=200; tk[0].cg=10; //グラフィック番号 tk[0].at=2; tk[0].upper=10; //軽さ。これが大きいほど吹き飛ぶ break; case 2: tk[0].hp=350; tk[0].sizex=240; tk[0].sizey=240; tk[0].cg=11; //グラフィック番号 tk[0].at=4; tk[0].upper=2; //軽さ。これが大きいほど吹き飛ぶ break; case 3: //ラゼル tk[0].hp=250; tk[0].sizex=100; tk[0].sizey=100; tk[0].cg=12; //グラフィック番号 tk[0].at=3; tk[0].upper=12; //軽さ。これが大きいほど吹き飛ぶ break; case 4: tk[0].hp=400; tk[0].sizex=100; tk[0].sizey=100; tk[0].cg=13; //グラフィック番号 tk[0].at=1; tk[0].upper=3; //軽さ。これが大きいほど吹き飛ぶ ivent=0; //sc=999; break; } //敵の攻撃タイマー tk[0].kougeki=0; tk[0].mhp=tk[0].hp; //標準設定 tk[0].kurai=0; tk[0].motion=0; //モーション tk[0].ho=1; if(stage!=4) { tk[0].x=cx+(320-tk[0].sizex)/2; if(stage==3) tk[0].x=cx+220; tk[0].y=cy-tk[0].sizey; tk[0].ay=15; } if(stage==4) { tk[0].ay=0; tk[0].x=cx; tk[0].y=cy+100; } tk[0].dawntimer=0; tk[0].a=1; tk[0].now=0; //配列上の座標保持 tk[0].hairetux=0; tk[0].hairetuy=0; tk[0].type=0; //ボスの表示しているHP bhp=0; if(stage==3) mes_no=1; else boss_bgm(); } void boss_remit(void) { //魔王ミュンデス if(stage==4 && boss==0 && stage_clear==0 && nowmes==0) { bcx=cx; bcx2=cx2; bcx3=cx3; //ボス出現 boss=2; //ザコ消去 for(i=0;ibcx+320) cx=bcx+320; if(cx2bcx2+160) cx2=bcx2+160; if(cx3bcx3+640) cx3=bcx3+640; //キャラの限界値設定 for(cn=0;cn<2;cn++) { if(ch[cn].hp>0) { if(ch[cn].x-bcx<=25) ch[cn].x=bcx+25; if(ch[cn].x-(bcx+320)>=320-25) ch[cn].x=320+(bcx+320)-25; } } //ボスの限界値設定 r=tk[0].sizex/2; if(stage==3) r=0; if(tk[0].x-bcx+r<=24) tk[0].x=bcx-r+24; r=tk[0].sizex/2; if(stage==3) r*=2; if(tk[0].x+r-bcx>=640-24) tk[0].x=640+bcx-r-24; } } //描画 void boss_hp(void) { //HP elDraw::Layer(100,200,BosshpBMP,0,12,bhp,24); elDraw::Layer(100,200,BosshpBMP,0, 0,200,12); if(bhp200) bhp=200; } void boss_think(void) { } void boss_bgm(void) { switch(stage) { case 1: play_bgm(4); break; case 2: play_bgm(15); break; case 3: play_bgm(16); break; case 4: play_bgm(17); break; } } /********************************************************************************/ /* メインのサブ関数                         */ /********************************************************************************/ void main_down(void) { static int oldhp[2]; //前回のHP //みんなダウン if(ch[0].hp<=0 && ch[1].hp<=0 && gameovert==0) { //赤フラッシュ elDraw::Clear(); elDraw::Box(0,0,320,240,RGB(255,0,0),RGB(255,0,0),1); elDraw::Refresh(); play_bgm(3); gameovert=1; } else { //一人ダウン for(i=0;i<2;i++) if(oldhp[i]>0 && ch[i].hp<1 && REPLAY==0) { //赤フラッシュ elDraw::Clear(); elDraw::Box(0,0,320,240,RGB(255,0,0),RGB(255,0,0),1); elDraw::Refresh(); //COM時にプレイヤーがダウンしたらcomもダウン if(com==1 && ch[1].hp>0 && ch[0].hp<=0) ch[1].hp=0; } } //前回のHP更新 for(i=0;i<2;i++) oldhp[i]=ch[i].hp; } void main_muteki(void) { //無敵 if(muteki>0) muteki--; } void main_gameover(void) { //ゲームオーバーのタイマー if(gameovert!=0) { gameovert++; if(gameovert>=5*30) { now_game=0; //ゲーム画面じゃなくなるのでフラグOFF elMusic::Stop(); if(REPLAY==0) { //コンテニュー? elDraw::SpriteScreen(SbufBMP,0,0,320,240); elCallScreen(CONTINUE_SCREEN); } if(demo==1) { play_bgm(22); elCallScreen(TITLE_SCREEN); } if(demo==0) { play_bgm(1); if(REPLAY==1) elCallScreen(RESULT_SCREEN); if(REPLAY==2) elCallScreen(RESULT2_SCREEN); } } } } void main_pause(void) { //ポーズ処理 elSystem::GetKey(VK_P,&PauseKey); if(PauseKey==PUSH_KEY) { if(pause==0) { //ポーズ画面 float a=0.8; char buf[64]; elDraw32::BlendLayer(0,0,a,WhiteBMP,0,0,320,240); draw_wide(); pos(0,0); color(0,0,0); strcpy(buf,"PAUSE"); pos((320-strlen(buf)*6)/2,(240-12)/2); print(buf); elDraw::Refresh(); pause=1; } else pause=0; } } /********************************************************************************/ /* コンテニュー画面 */ /********************************************************************************/ void ContinueScreen() { //変数宣言 static int p=0; //カーソル float a=0.3; //FPS同期 if(CheckFrameRate() == true) { //背景 elDraw::Clear(); elDraw::Layer(0,0,SbufBMP,0,0,320,240); //メイン for(i=0;i<2;i++) { r=40+i*(120+40); rr=75; if(i==0) BufBMP=Cont1BMP; if(i==1) BufBMP=Cont2BMP; if(i!=p) elDraw32::BlendLayer(r,rr,a,BufBMP,0,0,100,100); else elDraw::Layer(r,rr,BufBMP,0,0,100,100); } //ワイド draw_wide(); color(255,255,255); pos(5,20); print("CONTINUE"); elDraw::Refresh(); //キー入力 inkey_menu(); if(LeftKey==PUSH_KEY) { elSound::Play(SelectWAV); p=0; } if(RightKey==PUSH_KEY) { elSound::Play(SelectWAV); p=1; } if(ShotKey==PUSH_KEY) { if(p==0) { elSound::Play(OkWAV); //コンテニュー p=0; muteki=60; //無敵時間設定 gameovert=0;//ゲームオーバータイマー for(cn=0;cn<2;cn++) { ch[cn].hp=ch[cn].mhp; //HP回復 ch[cn].mp=ch[cn].mmp; //MP回復 ch[cn].x=dx; ch[cn].y=dy; } elSound::Play(OkWAV); if(boss==0) bgm_play_stage(); //ステージBGM再生 else boss_bgm(); elCallScreen(MAIN_SCREEN); } else { elSound::Play(OkWAV); //ゲームオーバー p=0; elCallScreen(MENU_SCREEN); } } } } /********************************************************************************/ /* キャラの行動                           */ /********************************************************************************/ void char_do(void) { //ch[cn].mp=ch[cn].mmp; //tk[0].hp=999; //超必 if(ch[cn].tyouhi!=0) { //シーク if(ch[cn].type==0) { LeftKey=FREE_KEY; RightKey=FREE_KEY; DownKey=FREE_KEY; UpKey=FREE_KEY; ShotKey=FREE_KEY; ItemKey=FREE_KEY; //超必実行 ch[cn].tyouhi++; for(i=TEKI_MAX-1;i>=0;i--) { if(tk[i].a!=0 && tk[i].hp>0) { srand(ch[cn].tyouhi); ch[cn].x=tk[i].x+tk[i].sizex/2+rand()%100-50; ch[cn].y=tk[i].y+tk[i].sizey/2-ch[cn].sizey/2-24-rand()%100; //壁に埋もれていない? r=0; for(k=0;k<2;k++) { for(j=1;j<3;j++) { ch[cn].x+=12+k*-12; ch[cn].y-=12*j; char_hantei(); ch[cn].y+=12*j; ch[cn].x-=12+k*-12; if(ch[cn].hantei==5) //カベ? r=1; } } if(r==1) { ch[cn].x=tk[i].x+tk[i].sizex/2; ch[cn].y=tk[i].y+tk[i].sizey/2-ch[cn].sizey/2-24; } //↑--- char_remit(); if(boss==0 || (boss==2 && i!=0)) tk[i].hp=0; if(ch[cn].tyouhi%2==0) { r=rand()%7+1; ch[cn].anime =r*40+1; ch[cn].endanime=r*40+20; ch[cn].waza=1; } break; } } muteki=15; if(i==-1 || (boss==2 && i==0 && ch[cn].tyouhi>50)) { ch[cn].tyouhi=0; if(REPLAY==0) { ch[1-cn].x=ch[cn].x; ch[1-cn].y=ch[cn].y; } ch[cn].wazano=0; //END ch[cn].waza=0; ch[cn].anime=0; ch[cn].endanime=0; } } //ミル if(ch[cn].type==1) { DownKey=FREE_KEY; ShotKey=FREE_KEY; ItemKey=FREE_KEY; //超必実行 ch[cn].tyouhi++; r=30-ch[cn].ho*60; cx+=r; cx2+=r/2; cx3+=r*2; ch[cn].x+=r; if(boss==0) ch[1-cn].x+=r; if(ch[cn].tyouhi%2==0) { srand(ch[cn].tyouhi); r=rand()%7+1; ch[cn].anime =r*40+1-5; ch[cn].endanime=r*40+20; ch[cn].waza=1; } muteki=15; if(ch[cn].tyouhi>50) ch[cn].tyouhi=0; } } else if(ch[cn].mp>ch[cn].mmp/2 && (ShotKey!=FREE_KEY && ItemKey!=FREE_KEY && ShotKey!=PULL_KEY && ItemKey!=PULL_KEY && DownKey!=FREE_KEY)) { //超必発動 ch[cn].tyouhi=1; //muteki=15; //ch[cn].motion=0; //ch[cn].dmtimer=0; ShotKey=FREE_KEY; ItemKey=FREE_KEY; ch[cn].mp-=ch[cn].mmp/2+1; } //キー r=ch[cn].x; if(RightKey!=FREE_KEY) {ch[cn].x+=ch[cn].s*ch[cn].nowdash;if(ch[cn].ho==1) {ch[cn].ho=0;}}//ch[cn].x+=82;}} if(LeftKey !=FREE_KEY) {ch[cn].x-=ch[cn].s*ch[cn].nowdash;if(ch[cn].ho==0) {ch[cn].ho=1;}}//ch[cn].x-=82;}} //動ける?(X方向) for(j=1;j<3;j++) { ch[cn].x+=12+ch[cn].ho*-12; ch[cn].y-=12*j; char_hantei(); ch[cn].y+=12*j; ch[cn].x-=12+ch[cn].ho*-12; if(ch[cn].hantei==5) //カベ? ch[cn].x=r; } //動ける?(Y方向) for(j=-8;j<=8;j+=8) { for(i=2;i<4;i++) { ch[cn].y-=24*i; ch[cn].hantei=stagedata[(ch[cn].x+j)/32][(ch[cn].y+ch[cn].sizey)/24]; ch[cn].y+=24*i; if(ch[cn].hantei==5) //カベ? if(ch[cn].ay<0) ch[cn].ay*=-1; } } //埋まってる? r=stagedata[(ch[cn].x)/32][(ch[cn].y+ch[cn].sizey-12)/24]; //r=stagedata[(ch[cn].x)/32][(ch[cn].y+ch[cn].sizey)/24-1]; if(r==1 || r==2 || r==5) ch[cn].y-=24; //アニメ更新 if(ch[cn].anime!=0) { ch[cn].anime+=5; //if(ch[cn].type==1) // ch[cn].anime+=5; if(ch[cn].waza!=7) { if(ch[cn].anime>=ch[cn].endanime) { ch[cn].anime=0; //ch[cn].x+=20; } } else { //空中の最後のたたきおろしは永久 if(ch[cn].anime>=ch[cn].endanime) { ch[cn].anime=ch[cn].endanime-9; if(ch[cn].ay==218) { ch[cn].anime=0; ch[cn].wazano=0; ch[cn].waza=0; } } } } //斬る if(ch[cn].wazatimer>0) ch[cn].wazatimer--; if(ShotKey==PUSH_KEY && DownKey==FREE_KEY && ch[cn].wazano!=4) { //タイマー設定 if(ch[cn].wazatimer==0 && ch[cn].wazano!=4) { ch[cn].wazano=0; } ch[cn].wazatimer=15; //新規(地上) if(ch[cn].wazano==0 && ch[cn].ay==218) { //初期値設定 ch[cn].wazano=1; //状態を地上1に ch[cn].waza=0; //技を0番に } //新規(空中) if(ch[cn].wazano==0 && ch[cn].ay!=218) { //初期値設定 ch[cn].wazano=2; //状態を空中1に ch[cn].waza=3; //技を3番に } //地上1(1>2>3) if(ch[cn].wazano==1) { if(ch[cn].ay!=218) { //地上じゃなかったら空中に移行 ch[cn].waza=4; } ch[cn].waza++; //技を更新 if(ch[cn].waza>3) { ch[cn].wazano=2; //空中1に移行 ch[cn].waza=3; } } //空中1(4>5>6) if(ch[cn].wazano==2) { if(ch[cn].ay==218)// && ch[cn].waza!=3) { //空中じゃなかったらコンボ停止 ch[cn].wazano=4; } ch[cn].waza++; if(ch[cn].waza>6) { ch[cn].wazano=3; //空中2に移行 ch[cn].waza=3; } } //空中2(4>5>7) if(ch[cn].wazano==3) { if(ch[cn].ay==218 && ch[cn].jump!=2 && ch[cn].waza!=3) { //空中&&2段ジャンプじゃなかったらコンボ停止 ch[cn].wazano=4; } ch[cn].waza++; if(ch[cn].waza==6) ch[cn].waza=7; if(ch[cn].waza>7) { //END ch[cn].wazano=4; //END ch[cn].waza=0; } } if(ch[cn].wazano!=4 && ch[cn].wazano!=0) { ch[cn].anime=ch[cn].waza*40+1; ch[cn].endanime=ch[cn].waza*40+40; //ミルの場合 if(ch[cn].type==1) ch[cn].endanime-=10; elSound::Play(HuruWAV); } else ch[cn].anime=0; } //地面についたら、空中2>コンボ可能 に移行 if(ch[cn].wazano==4) { ch[cn].wazano=0; //char_hantei(); //if(ch[cn].hantei!=0) // ch[cn].anime=0; } //弾を撃つ if(ItemKey==HOLD_KEY && DownKey==FREE_KEY) { if(ch[cn].mp>0) { for(i=SHOT_MAX/2*cn;i41) // ch[cn].mp=41; //} //-------------------------------------------------- //進行方向にカベがあったら、そこで止まるようにしよう //-------------------------------------------------- if(UpKey ==PUSH_KEY && ch[cn].jump<2) { ch[cn].ay=ch[cn].jumps;//13; ch[cn].jump++; } //浮いてる地面から降りる if(DownKey==PUSH_KEY) { //キャラの足にあるチップGET char_hantei(); if(ch[cn].hantei==2) { //キャラの足にあるチップGET ch[cn].y+=48; char_hantei(); ch[cn].y-=48; //ch[cn].hantei=stagedata[(ch[cn].x+ch[cn].sizex/3)/32][(ch[cn].y+ch[cn].sizey)/24+2]; if(ch[cn].hantei==0) { ch[cn].y+=48; ch[cn].ay=5; } } } //回復アイテムGET i=ch[cn].x/32; j=(ch[cn].y+ch[cn].sizey-12)/24; if(stagedata[i][j]==12) { stagedata[i][j]=0; //回復の構造体にセット for(i=0;i<10;i++) if(care[i].a==218) { care[i].a=cn; care[i].time=ch[cn].mhp/4; break; } //効果音 elSound::Play(CareWAV); } //味方の位置へ移動 if(cn==1) elSystem::GetKey(VK_F5,&r); else elSystem::GetKey(VK_F6,&r); if(r==PUSH_KEY) { if(ch[1-cn].hp>0) { ch[cn].x=ch[1-cn].x; ch[cn].y=ch[1-cn].y; } } } /********************************************************************************/ /* キャラのダッシュ処理                       */ /********************************************************************************/ void char_dash(void) { //右ダッシュ if(ch[cn].dashtimer>0) ch[cn].dashtimer-=10; if(ch[cn].dashtimer<0) ch[cn].dashtimer=0; if(ch[cn].dashr>0) ch[cn].dashr-=50;//4; if(ch[cn].dashr<0) ch[cn].dashr=0; if(RightKey==HOLD_KEY && ch[cn].dashr==0 && ch[cn].nowdash==1) { ch[cn].dashr=300; } if(ch[cn].dashr>0 && ch[cn].dashr<=300) { if(RightKey==FREE_KEY) { ch[cn].dashr=1000; } } if(ch[cn].dashr>700 && ch[cn].dashr<=1000) { if(RightKey==HOLD_KEY) { ch[cn].dashr=99999999; ch[cn].nowdash=2; ch[cn].dashho=1; ch[cn].dashtimer=150; } } if(ch[cn].dashr>600 && ch[cn].dashr<=700) ch[cn].dashr=0; if(ch[cn].dashho==1) { //右ダッシュ解除 if((RightKey==FREE_KEY && ch[cn].nowdash==2 && ch[cn].dashtimer==0)||LeftKey==HOLD_KEY) { ch[cn].nowdash=1; ch[cn].dashr=0; ch[cn].dashl=0; ch[cn].dashho=0; } } //左ダッシュ if(ch[cn].dashl>0) ch[cn].dashl-=50;//4; if(ch[cn].dashl<0) ch[cn].dashl=0; if(LeftKey==HOLD_KEY && ch[cn].dashl==0 && ch[cn].nowdash==1) { ch[cn].dashl=300; } if(ch[cn].dashl>0 && ch[cn].dashl<=300) { if(LeftKey==FREE_KEY) { ch[cn].dashl=1000; } } if(ch[cn].dashl>700 && ch[cn].dashl<=1000) { if(LeftKey==HOLD_KEY) { ch[cn].dashl=99999999; ch[cn].nowdash=2; ch[cn].dashho=2; ch[cn].dashtimer=150; } } if(ch[cn].dashl>600 && ch[cn].dashl<=700) ch[cn].dashl=0; if(ch[cn].dashho==2) { //左ダッシュ解除 if((LeftKey==FREE_KEY && ch[cn].nowdash==2 && ch[cn].dashtimer==0)||RightKey==HOLD_KEY) { ch[cn].nowdash=1; ch[cn].dashr=0; ch[cn].dashl=0; ch[cn].dashho=0; } } } /********************************************************************************/ /* キャラのジャンプ処理                       */ /********************************************************************************/ void char_jump(void) { //キャラの足にあるチップGET char_hantei(); //ジャンプ if(ch[cn].ay!=218) { ch[cn].y+=ch[cn].ay; if(!(ch[0].ay!=218)&&(ch[1].ay!=218)&&(cn==1)) cy+=ch[cn].ay*2/3; ch[cn].ay+=1.5; //キャラの足にあるチップGET char_hantei(); if(ch[cn].hantei==1 || ch[cn].hantei==2 || ch[cn].hantei==5) { elSound::Play(SutaWAV); ch[cn].ay=218; ch[cn].y=(ch[cn].y+ch[cn].sizey)/24*24-ch[cn].sizey; ch[cn].jump=0; //地面に埋まってたら持ち上げる //if(stagedata[(ch[cn].x+ch[cn].sizex/3-16)/32][(ch[cn].y+ch[cn].sizey)/24-1]!=0) while(1) { r=ch[cn].hantei; ch[cn].y-=24; char_hantei(); ch[cn].y+=24; rr=ch[cn].hantei; ch[cn].hantei=r; if(rr==1 || rr==2 || rr==5) { ch[cn].y-=24; ch[cn].y=(ch[cn].y+ch[cn].sizey)/24*24-ch[cn].sizey; } else break; } } } } /********************************************************************************/ /* キャラの重力処理                         */ /********************************************************************************/ void char_g(void) { //重力 if(ch[cn].ay==218 && (ch[cn].hantei==0 || ch[cn].hantei==4)) ch[cn].ay=0; } /********************************************************************************/ /* キャラの残像処理                         */ /********************************************************************************/ void char_zanzo(void) { //残像 if(ch[cn].ay!=218 || ch[cn].nowdash==2)// || ch[cn].anime!=0) { ch[cn].zantimer++; if(ch[cn].zantimer>=2) { for(i=cn*4;i=450 && ch[cn].motion<=469) { ch[cn].motion+=5; if(ch[cn].motion>469) ch[cn].motion=450; } else ch[cn].motion=450; } else //ジャンプ if(ch[cn].ay!=218) { if(ch[cn].motion>=100 && ch[cn].motion<=119) { ch[cn].motion+=2; if(ch[cn].motion>119) ch[cn].motion=100; } else ch[cn].motion=100; } else { if(LeftKey==FREE_KEY && RightKey==FREE_KEY) { //立ち if(ch[cn].motion>=0 && ch[cn].motion<=19) { ch[cn].motion+=2; if(ch[cn].motion>19) ch[cn].motion=0; } else ch[cn].motion=0; } else { if(ch[cn].nowdash==2) { //ダッシュ if(ch[cn].motion>=60 && ch[cn].motion<=99) { ch[cn].motion+=2; if(ch[cn].motion>99) ch[cn].motion=60; } else ch[cn].motion=60; } else { //歩き if(ch[cn].motion>=20 && ch[cn].motion<=59) { ch[cn].motion+=2; if(ch[cn].motion>59) ch[cn].motion=20; } else ch[cn].motion=20; } } } //ガード if(DownKey==HOLD_KEY) ch[cn].motion=440; //くらい if(ch[cn].dmtimer>0) { ch[cn].dmtimer--; ch[cn].motion=470; } } /********************************************************************************/ /* キャラの画面端処理                        */ /********************************************************************************/ void char_remit(void) { if(ch[cn].x<200) ch[cn].x=200; if(ch[cn].y<0) { ch[cn].y=0; if(ch[cn].ay<0) ch[cn].ay*=-1; } if(ch[cn].y>572)//720-48-ch[cn].sizey) { ch[cn].ay=218; ch[cn].y=572;//720-48-ch[cn].sizey; } } /********************************************************************************/ /* キャラの足の判定                         */ /********************************************************************************/ void char_hantei(void) { int tyousei=8; //+-誤差 ch[cn].hantei=stagedata[(ch[cn].x)/32][(ch[cn].y+ch[cn].sizey)/24]; if(ch[cn].hantei==0 || ch[cn].hantei==4) { ch[cn].hantei=stagedata[(ch[cn].x-tyousei)/32][(ch[cn].y+ch[cn].sizey)/24]; if(ch[cn].hantei==0 || ch[cn].hantei==4) { ch[cn].hantei=stagedata[(ch[cn].x+tyousei)/32][(ch[cn].y+ch[cn].sizey)/24]; } } } /********************************************************************************/ /* 当たり判定                            */ /********************************************************************************/ void main_atari(void) { //コインGET? for(i=0;ich[cn].x+100-ch[cn].ho*82 && tk[i].y+tk[i].sizey>ch[cn].y+80) //if(tk[i].dawntimer==0 && tk[i].a!=0 && (tk[i].x+tk[i].sizex/2-(ch[cn].x+50-ch[cn].ho*50))*(tk[i].x+tk[i].sizex/2-(ch[cn].x+50-ch[cn].ho*50))+(tk[i].y+tk[i].sizey/2-(ch[cn].y+ch[cn].sizey/2))*(tk[i].y+tk[i].sizey/2-(ch[cn].y+ch[cn].sizey/2)) < 60*60+tk[i].sizex/2*tk[i].sizey/2) //if((ch[cn].ho==0 &&tk[i].dawntimer==0 && tk[i].a!=0 && crect(ch[cn].x+68,ch[cn].y+40,13,ch[cn].sizey-40,tk[i].x,tk[i].y,tk[i].sizex,tk[i].sizey)) // || (ch[cn].ho==1 &&tk[i].dawntimer==0 && tk[i].a!=0 && crect(ch[cn].x-13+20,ch[cn].y+40,13,ch[cn].sizey-40,tk[i].x,tk[i].y,tk[i].sizex,tk[i].sizey))) if(tk[i].dawntimer==0 && tk[i].a!=0 && crect2(11,13,64,95))//11,43,44,90//crect2(41,43,74,90)) { //MP UP if(ch[cn].tyouhi==0) ch[cn].mp++; if(ch[cn].mp>ch[cn].mmp) ch[cn].mp=ch[cn].mmp; //コンボ combo++; combotimer=8;//*2; combox=tk[i].x; comboy=tk[i].y+tk[i].sizey/2-50; elSound::Play(SlashWAV); //スコア加算 if(boss==0) sc+=combo/10+1; //壁じゃなかったら押す r=tk[i].upper-(ch[cn].ho*tk[i].upper*2); tk[i].x+=r; tk[i].y-=24; if(teki_hantei()==5 || tk[i].cg==10)//stagedata[(tk[i].x+tk[i].sizex/2+r-16)/32][(tk[i].y+tk[i].sizey-24)/24]!=5 && stagedata[(tk[i].x+tk[i].sizex/2+r+16)/32][(tk[i].y+tk[i].sizey-24)/24]!=5) tk[i].x-=r; tk[i].y+=24; //天井じゃなかったら上げる if(ch[cn].waza==3 || ch[cn].waza==6) { for(j=0;j<3;j++) { if(stagedata[(tk[i].x+tk[i].sizex/2)/32][(tk[i].y-10)/24]!=5) tk[i].y-=tk[i].upper; //tk[i].ay=-10; //tk[i].y--; } } //加速度補正 if(tk[i].ay>0) tk[i].ay-=5; if(tk[i].ay<0) tk[i].ay=0; //叩き落とす if(ch[cn].waza==7) { elSound::Play(FireWAV); //エフェクト j=0; for(l=0;l=36) break; } } tk[i].ay=24;//30; tk[i].ax=30; //攻撃力2倍 tk[i].hp--; } tk[i].hp--; //ミルの超必? if(ch[cn].tyouhi!=0 && ch[cn].type==1) if(boss==2 && i==0) tk[i].hp--; else tk[i].hp=0; //敵のHP表示 if(tk[i].hp>0) main_atari_chp(i); tk[i].kurai=10; //エフェクト //r=0; for(k=EFECT_MAX/2*cn;ktk[i].x && sh[j].y+5>tk[i].y && sh[j].x+100 && crect(sh[j].x-20,sh[j].y-25,40,60,tk[i].x,tk[i].y,tk[i].sizex,tk[i].sizey)) || (sh[j].ax<0 && crect(sh[j].x+20,sh[j].y-25,40,60,tk[i].x,tk[i].y,tk[i].sizex,tk[i].sizey)) ) { r=1; dmtekino[cn]=i; //今ダメージを与えている敵の番号 dmtekitimer[cn]=30; //↑を表示しておく時間 combo++; combox=tk[i].x; comboy=tk[i].y+tk[i].sizey/2-50; combotimer=8*2; elSound::Play(WinWAV); if(sh[j].ax>0) tk[i].x++; else tk[i].x--; //tk[i].y--; tk[i].hp--; //スコア加算 if(boss==0) sc+=combo/20+1; //エフェクト //r=0; for(k=EFECT_MAX/2*cn;k0) main_atari_chp(i); //ボスの時は貫通しない if(r==1 && boss==2 && i==0) sh[j].a=0; //倒したらボーナス if(tk[i].hp<=0 && boss==0) { sc+=combo; sc+=tk[i].mhp; } } } } //敵の攻撃の判定 for(i=0;i=40 && tk[i].motion<=79)||(tk[i].cg==13 &&tk[i].motion>=40)) && tk[i].a!=0 && muteki==0 && tk[i].cg!=3 && tk[i].hp>0) { //当たってる? if(tk[i].cg!=11) { //ステージ2のボス以外 if(crect(ch[cn].x-10,ch[cn].y+40,20,50,tk[i].x+20,tk[i].y+20,tk[i].sizex-40,tk[i].sizey-50)) { main_atari_kurai(tk[i].at,tk[i].ho); } } else { //ステージ2のボスの判定は狭い if(crect(ch[cn].x-10,ch[cn].y+40,20,50,tk[i].x+20,tk[i].y+20,tk[i].sizex-40,tk[i].sizey-50-75)) { main_atari_kurai(tk[i].at,tk[i].ho); } } } } //敵の弾の判定 r=10;//r=ch[cn].center-10; //rr=ch[cn].center*2+20; for(j=0;jch[cn].x-30 && tsh[j].x+50ch[cn].y+30 && tsh[j].y+500 ? 0:1; main_atari_kurai(tsh[j].at,rr); } //斧・リッチ・ボスETCの場合 if(tsh[j].a>=2 && tsh[j].x+50>ch[cn].x-30 && tsh[j].x+50ch[cn].y+30 && tsh[j].y+500 ? 0:1; main_atari_kurai(tsh[j].at,rr); } } } //トゲ ch[cn].y-=24; char_hantei(); ch[cn].y+=24; if(ch[cn].hantei==4 && muteki==0) { tsh[j].a=0; elSound::Play(SlashWAV); //エフェクト for(k=EFECT_MAX/2*cn;k320-60 && ch[cn].hp>0) { cx +=ch[cn].s*ch[cn].nowdash; cx2+=ch[cn].s*ch[cn].nowdash/2; cx3+=ch[cn].s*ch[cn].nowdash*2; //もう一人を引っ張る if(ch[1-cn].x-cx<60+82-75 && ch[1-cn].hp>0) ch[1-cn].x+=ch[cn].s*ch[cn].nowdash; } if(ch[cn].x-cx<60+82-75 && ch[cn].hp>0) { cx -=ch[cn].s*ch[cn].nowdash; cx2-=ch[cn].s*ch[cn].nowdash/2; cx3-=ch[cn].s*ch[cn].nowdash*2; //もう一人を引っ張る if(ch[1-cn].x-cx+150-75>320-60 && ch[1-cn].hp>0) ch[1-cn].x-=ch[cn].s*ch[cn].nowdash; } //画面外に出たらもう一人の位置に移動 if((ch[cn].y-ch[1-cn].y>200 || ch[cn].y-ch[1-cn].y<-200) && cn==com && comtype!=1) { ch[cn].x=ch[1-cn].x; ch[cn].y=ch[1-cn].y; ch[cn].ay=0; } //追尾 j=cn; cn=cn2; r=15; rr=5; if(ch[0].tyouhi!=0 || ch[1].tyouhi!=0) { r*=3; rr*=3; } if(ch[cn].y-cy<0+32) cy-=rr; if(ch[cn].y-cy>240-ch[cn].sizey-32) cy+=rr; if(ch[cn].hantei==2 || ch[cn].hantei==5) if(ch[cn].y-cy<60) cy-=r; if(ch[cn].hantei==1 || ch[cn].hantei==4 || ch[cn].hantei==5) if(ch[cn].y-cy<240-48-ch[cn].sizey+480) cy+=r; //特別追尾 if(ch[cn].y-cy<-ch[cn].sizey/2) cy-=rr*2; if(ch[cn].y-cy>240-ch[cn].sizey/2) cy+=rr*2; if(ch[cn].x>cx+320 && ch[cn].hp>0) { cx +=r; cx2+=r/2; cx3+=r*2; } if(ch[cn].x0) { cx -=r; cx2-=r/2; cx3-=r*2; } cn=j; //カメラリミットチェック if(cy<0) cy=0; } /********************************************************************************/ /* コンボ処理                            */ /********************************************************************************/ void main_combo_cnt(void) { //コンボ if(combotimer>0) { combotimer--; if(combotimer==0) { if(oldcombo_t==0 || oldcombo2) if(ALFA) elDraw32::BlendLayer(0,0,ClearBMP,0,0,320,240); else elDraw::Layer(0,0,ClearBMP,0,0,320,240); //ステージ4のボスの魔法予備動作 if(stage==4 && tk[0].now>0 && tk[0].now<=10) elDraw32::BlendLayer(0,0,(float)(10-tk[0].now)/10.0,WhiteBMP,0,0,320,240); draw_mes(); //メッセージボックス draw_blind(); //ブラインド draw_bokasi(); //ぼかし //デモ if(demo==1) { if(ALFA) elDraw32::BlendLayer(0,(240-20)/2,(float)0.5,WhiteBMP,0,0,320,20); else elDraw::Layer(0,(240-20)/2,WhiteBMP,0,0,320,20); pos((320-(28*7))/2,(240-20)/2+3); color(0,0,0); print("DEMONSTRATION -PUSH ANY KEY-"); } //超必中 for(i=0;i<2;i++) if(ch[i].tyouhi!=0 && stage_clear==0) { if(ch[i].type==0) BufBMP=SeekBMP; else BufBMP=MiruBMP; if(ALFA) elDraw32::BlendLayer(0,0,(float)0.5,BufBMP,0,0,160,240); else elDraw::Layer(0,0,BufBMP,0,0,160,240); } //デバッグ /* j=0; for(i=0;i=4) //elDraw::Box(0,0,320,240,RGB(255,0,0),RGB(255,0,0),1); if(FpsDraw) elDraw::ShowFPS(); //FPS描画 //画面更新 elDraw::Refresh(); // 実際にウィンドウに描画します。 //ライト //elDraw32::AddBlendLayer(0,0,LightBMP,0,0,320,240); } /********************************************************************************/ /* 画面描画サブルーチン                       */ /********************************************************************************/ void draw_back(void) { if(nijimi==0) { elDraw::Clear(); //初期化 //背景 if(cy>720-240) cy=720-240; if(ch[0].tyouhi==0 && ch[1].tyouhi==0) { //ステージ3の背景 if(stage==3) elDraw::Layer(0,0,Back4BMP,0,0,320,240); //ステージ4の特別背景 if(stage==4 && ALFA!=0) { for(i=0;i<3;i++) { r=rand()%320; elDraw32::BlendLayer(r,0,WhiteBMP,0,0,5,240); } } elDraw::Layer(0,0,BackBMP,cx2%320,cy,320,cy+240); elDraw::Layer(320-cx2%320,0,BackBMP,0,cy,320,cy+240); elDraw::Layer(0,0,Back2BMP,cx%320,cy,320,cy+240); elDraw::Layer(320-cx%320,0,Back2BMP,0,cy,320,cy+240); } } else { //にじみ elDraw::BlendLayer(0,0,nijimi,WhiteBMP,0,0,320,240); } } void draw_jimen(void) { //地面 int map; //配置するBMP for(i=0;i<11;i++) { for(j=10+1;j>=0;j--) { r=i+cx/32; rr=j+cy/24; //普通のカベ if(stagedata[r][rr]==2) { if(stagedata[r-1][rr]==2 && stagedata[r+1][rr]==2) { map=1; } if(stagedata[r-1][rr]!=2 && stagedata[r+1][rr]==2) { map=0; } if(stagedata[r-1][rr]==2 && stagedata[r+1][rr]!=2) { map=2; } if(stagedata[r-1][rr]!=2 && stagedata[r+1][rr]!=2) { map=3; } elDraw::Layer(i*32+cx/32*32-cx,j*24+cy/24*24-cy-13,JimenBMP,map*32,0,map*32+32,37); } //経過できないカベ if(stagedata[r][rr]==5) { if(stagedata[r-1][rr]==5 && stagedata[r+1][rr]==5) { map=1; } if(stagedata[r-1][rr]!=5 && stagedata[r+1][rr]==5) { map=0; } if(stagedata[r-1][rr]==5 && stagedata[r+1][rr]!=5) { map=2; } if(stagedata[r-1][rr]!=5 && stagedata[r+1][rr]!=5) { map=3; } elDraw::Layer(i*32+cx/32*32-cx,j*24+cy/24*24-cy-13,JimenBMP,map*32,0,map*32+32,37); } //トゲ if(stagedata[r][rr]==4) if(stagedata[r][rr-1]==0) elDraw::Layer(i*32+cx/32*32-cx,j*24+cy/24*24-cy-13+13,TogeBMP,0,0,32,24); else elDraw::Layer(i*32+cx/32*32-cx,j*24+cy/24*24-cy-13,TogeBMP,0,0,32,37); //ジャンプ台 if(stagedata[r][rr]==7) elDraw::Layer(i*32+cx/32*32-cx,j*24+cy/24*24-cy-13+13,JumpBMP,0,0,32,24); //動く歩道 if(stagedata[r][rr]==8) elDraw::Layer(i*32+cx/32*32-cx,j*24+cy/24*24-cy-13+13,HodouBMP,0,0,32,24); //ライフ if(stagedata[r][rr]==12) elDraw::Layer(i*32+cx/32*32-cx,j*24+cy/24*24-cy-13+13,LifeBMP,0,0,32,24); } } } void draw_tama(void) { //弾 for(i=0;i240 || sh[i].x+10-cx>320) sh[i].a=0; } } //敵の弾 for(i=0;i=20 && tsh[i].a==8) tsh[i].anime=0; if(tsh[i].anime>=30) tsh[i].anime=0; if(tsh[i].x+50-cx<-50 || tsh[i].y+50-cy<-50 || tsh[i].y-50-cy>240+50 || tsh[i].x-50-cx>320+50) tsh[i].a=0; } if(tsh[i].a==2 || tsh[i].a==4 || (tsh[i].a>=5 && tsh[i].a<=7)) { if(tsh[i].a==2) BufBMP=OnoBMP; if(tsh[i].a==4) BufBMP=Beem2BMP; if(tsh[i].a>=5 && tsh[i].a<=7) { BufBMP=IwaBMP; tsh[i].anime=(tsh[i].a-5)*10; } //放物線 elDraw::Layer(tsh[i].x-cx,tsh[i].y-cy,BufBMP,tsh[i].ho*100,tsh[i].anime/10*100,tsh[i].ho*100+100,tsh[i].anime/10*100+100); tsh[i].x+=tsh[i].ax; tsh[i].y+=tsh[i].ay; tsh[i].ay++; tsh[i].anime+=5; if(tsh[i].anime>=40) tsh[i].anime=0; if(tsh[i].x+50-cx<-50 || tsh[i].y+50-cy<-50 || tsh[i].y-50-cy>240+50 || tsh[i].x-50-cx>320+50) tsh[i].a=0; } } } } void draw_back_center(void) { if(ch[0].tyouhi==0 && ch[1].tyouhi==0 && ALFA!=0) { //背景(手前) elDraw::Layer(0,0,Back3BMP,cx3%320,cy,320,cy+240); elDraw::Layer(320-cx3%320,0,Back3BMP,0,cy,320,cy+240); } } /********************************************************************************/ /* 影描画                              */ /********************************************************************************/ void draw_kage(void) { float a=0.6; //描画X位置検出 r=-ch[cn].center-ch[cn].ho*(ch[cn].sizex-(ch[cn].center*2))+ch[cn].ho*50; if(ch[cn].anime==0) { if(ch[cn].nowdash==1) r=r-10+ch[cn].ho*20; else r=r+5-ch[cn].ho*10; } else r=r+3-ch[cn].ho*6; //ジャンプしていない場合 if(ch[cn].ay==218) { if(ALFA==1) elDraw32::BlendLayer(ch[cn].x-cx+r,ch[cn].y-cy+50,a,KageBMP,ch[cn].ho*50,50,ch[cn].ho*50+50,100); else elDraw::Layer(ch[cn].x-cx+r,ch[cn].y-cy+50,KageBMP,ch[cn].ho*50,50,ch[cn].ho*50+50,100); } else { //ジャンプしている場合 //描画Y位置検出 for(i=((ch[cn].y+ch[cn].sizey)/24);i<31;i++) { rr=stagedata[ch[cn].x/32][i]; if(rr==1 || rr==2 || rr==5) { //地面発見 break; } } //影の大きさ検出 rr=(i*24-(ch[cn].y+ch[cn].sizey))/24; if(rr<4) { a-=(float)rr/10.0; if(ALFA==1) elDraw32::BlendLayer(ch[cn].x-cx+r,i*24-100-cy+50,a,KageBMP,ch[cn].ho*50,rr*100+50,ch[cn].ho*50+50,rr*100+100); else elDraw::Layer(ch[cn].x-cx+r,i*24-100-cy+50,KageBMP,ch[cn].ho*50,rr*100+50,ch[cn].ho*50+50,rr*100+100); } } } /********************************************************************************/ /* スコアなどのデータ描画関数                    */ /********************************************************************************/ void draw_data(void) { //枠 if(ALFA) elDraw32::BlendLayer(120,4,Data2BMP,0,0,80,26); else elDraw::Layer(120,4,Data2BMP,0,0,80,26); elDraw::Layer(120,4,DataBMP,0,0,80,26); //スコア描画 static int ssc=0; if(ssc>=sc) ssc=sc; else { r=(sc-ssc)/2; if(r<1) r=1; ssc+=r; } char buf[20]; dech(ssc,buf); pos(120+(80-strlen(buf)*6)/2,11); color(0,0,0); print(buf); //枠 if(ALFA) elDraw32::BlendLayer(120,34,Data2BMP,0,0,80,26); else elDraw::Layer(120,34,Data2BMP,0,0,80,26); elDraw::Layer(120,34,DataBMP,0,0,80,26); //時間解析 r=now_time/30; //秒 rr=r/60; //分 r=r-rr*60; //秒 buf[0]=rr/10+'0'; buf[1]=rr%10+'0'; buf[2]=':'; buf[3]=r/10+'0'; buf[4]=r%10+'0'; buf[5]='\0'; //描画 pos(120+(80-strlen(buf)*6)/2+2,41); color(0,0,0); print(buf); //時間加算 now_time++; } /********************************************************************************/ /* HP描画関数                           */ /********************************************************************************/ void draw_hp(void) { static int kao=0; for(cn=0;cn<2;cn++) { if(ch[cn].hp<1) continue; //表示位置設定 r=0 ; rr=0+cn*30; //顔 if(ch[cn].type==0) elDraw::Layer(r,rr+6,ChBMP,0,35+6+kao/10*100,0+29,35+29+kao/10*100); else elDraw::Layer(r,rr+6,Ch2BMP,0,35+6+kao/10*100,0+29,35+29+kao/10*100); kao++; if(ch[1-cn].hp<=0) kao++; if(kao>=20) kao=0; //HP j=ch[cn].hp*75/ch[cn].mhp; k=ch[cn].mp*41/ch[cn].mmp; elDraw::Layer(r+36 ,rr,HpbarBMP,36,0,36+j,36);//36+28+32+15,36); elDraw::Layer(r+70-34,rr,MpbarBMP,70,0,70+k,36); elDraw::Layer(r ,rr,BarBMP ,0 ,0,120 ,36); /* elDraw::Layer(10,11+cn*15,HpBMP,0,0,ch[cn].hp-1,10); //HP描画 elDraw::Layer(10,10+cn*15,WakuBMP,0,0,149,12); elDraw::Layer(160+10,11+cn*15,HpBMP,0,0,ch[cn].mp-1,10); //MP描画 elDraw::Layer(160+10,10+cn*15,WakuBMP,0,0,25,12); elDraw::Layer(160+10+25,10+cn*15,WakuBMP,149-25,0,149,12); */ } } /********************************************************************************/ /* 敵のHP描画                           */ /********************************************************************************/ void draw_chp(void) { k=0; for(i=0;i41) j=41; if(j<0) j=0; elDraw::Layer(r+70 ,rr+2,MpbarBMP,70 ,19 ,70+j ,36); elDraw::Layer(r+70-5,rr+2,BarBMP ,65-34,19 ,70+45-34,36); k++; dmtekitimer[i]--; if(dmtekitimer[i]<=0 || j==0) dmtekino[i]=218; } } } /********************************************************************************/ /* ヒット数描画                           */ /********************************************************************************/ void draw_combo(void) { //描画する数字を分解したものをいれておくテーブル static char drawno[64]; if(combo>1 && gameovert==0) { //分解 dech(combo,drawno); j=0; while(drawno[j]!='\0') drawno[j++]-='0'; drawno[j]='E'; //画面左端の補正 if(combox-cx-j*25<=0) j=0; //変数初期化 i=0; //メイン while(drawno[i]!='E') { k=drawno[i]; //数字描画 if(ALFA) elDraw32::AddBlendLayer(combox-cx+i*25-j*25,comboy-cy,NoBMP,k*50,0,k*50+40,50); else elDraw::Layer(combox-cx+i*25-j*25,comboy-cy,NoBMP,k*50,0,k*50+40,50); i++; } //MAX if(maxcombo0) { dech(oldcombo,drawno); strcat(drawno,"COMBO!"); pos(5,65); r=oldcombo_t*5; color(155+r-150,255+r-150,155+r-150); print(drawno); print(buf); oldcombo_t--; } } /********************************************************************************/ /* 魔法描画                             */ /********************************************************************************/ void draw_magic(void) { if(sh[i].a==1) BufBMP=MagicBMP; else BufBMP=Magic2BMP; //魔法の粒の発生 r=0; rr=MAGIC_MAX; if(ALFA==2) rr/=3; if(ALFA==0) rr/=6; for(j=0;j2) break; } } //演算・描画 for(j=0;j0) r=60; //if(ALFA) elDraw32::AddBlendLayer(ma[j].x-cx-r,ma[j].y-cy,BufBMP,0,0,16,16); //else // elDraw::Layer(ma[j].x-cx-r,ma[j].y-cy,BufBMP,0,0,16,16); ma[j].x+=ma[j].ax; ma[j].y+=ma[j].ay; if(ma[j].y>sh[i].y) ma[j].ay--; else ma[j].ay++; ma[j].a--; } } } /********************************************************************************/ /* キャラ描画                            */ /********************************************************************************/ void draw_char(void) { //スコアアタック時は2Pを描画しない if(REPLAY!=0 && cn==1) return; //画像転送 if(ch[cn].type==0) BufBMP=ChBMP; else BufBMP=Ch2BMP; //キャラ描画 //+8 r=-ch[cn].center-ch[cn].ho*(ch[cn].sizex-(ch[cn].center*2)); if(ch[cn].motion>=450 && ch[cn].motion<=469 && ch[cn].ay==218) ch[cn].y-=7; //たおれ if(ch[cn].hp<=0) { ch[cn].anime=0; ch[cn].motion=480; } if(ch[cn].anime==0) { elDraw::Layer(ch[cn].x-cx+r,ch[cn].y-cy,BufBMP,ch[cn].ho*ch[cn].sizex,ch[cn].motion/10*ch[cn].sizey,ch[cn].ho*ch[cn].sizex+ch[cn].sizex,ch[cn].sizey+ch[cn].motion/10*ch[cn].sizey); } else { elDraw::Layer(ch[cn].x-cx+r,ch[cn].y-cy,BufBMP,ch[cn].ho*ch[cn].sizex,(ch[cn].anime/10+12)*ch[cn].sizey,ch[cn].ho*ch[cn].sizex+ch[cn].sizex,ch[cn].sizey+(ch[cn].anime/10+12)*ch[cn].sizey); //剣の残像 if(ch[cn].type==0) BufBMP=SwordBMP; else BufBMP=MillatBMP; rr=3-((ch[cn].endanime-ch[cn].anime)/10)-1; if(rr>=0) { //if(ALFA) elDraw32::AddBlendLayer(ch[cn].x-cx+r,ch[cn].y-cy,BufBMP,ch[cn].ho*100,rr*100+ch[cn].waza*300,ch[cn].ho*100+100,rr*100+100+ch[cn].waza*300); //else // elDraw::Layer(ch[cn].x-cx+r,ch[cn].y-cy,BufBMP,ch[cn].ho*100,rr*100+ch[cn].waza*300,ch[cn].ho*100+100,rr*100+100+ch[cn].waza*300); } } if(ch[cn].motion>=450 && ch[cn].motion<=469 && ch[cn].ay==218) ch[cn].y+=7; //アタリ判定 //elDraw32::BlendLayer(ch[cn].x-cx,0,WhiteBMP,0,0,1,240); } /********************************************************************************/ /* 残像描画                             */ /********************************************************************************/ void draw_zanzo(void) { if(!ALFA) return; //変数宣言 static float a; //残像 for(i=cn*4;i=4 && ch[0].type==1)) elDraw32::BlendLayer(zan[i].x-cx-ch[cn].center-zan[i].ho*r,zan[i].y-cy,a,ZanBMP,zan[i].ho*ch[cn].sizex,zan[i].anime/10*ch[cn].sizey,zan[i].ho*ch[cn].sizex+ch[cn].sizex,ch[cn].sizey+zan[i].anime/10*ch[cn].sizey); else elDraw32::BlendLayer(zan[i].x-cx-ch[cn].center-zan[i].ho*r,zan[i].y-cy,a,Zan2BMP,zan[i].ho*ch[cn].sizex,zan[i].anime/10*ch[cn].sizey,zan[i].ho*ch[cn].sizex+ch[cn].sizex,ch[cn].sizey+zan[i].anime/10*ch[cn].sizey); zan[i].a++; if(zan[i].a>=10) zan[i].a=0; } } } /********************************************************************************/ /* STAGE1という描画                       */ /********************************************************************************/ void draw_stage(void) { if(mlevel>-30 && nowmes==0) { if(mlevel>=0) { r=mlevel-30; if(r<1) r=1; mlevel--; } if(mlevel<0) { r=mlevel*-1; mlevel--; } elDraw::MosaicLayer(0,0,r,StageBMP,0,0,320,240); //elDraw32::ShadeLayer(0,0,r,StageBMP,0,0,320,240); } } /********************************************************************************/ /* 画面をぼかす                            */ /********************************************************************************/ void draw_bokasi(void) { if(nowbokasi==1) { float a=0.2; elDraw::Refresh(); elDraw::SpriteScreen(SbufBMP,0,0,320,240); r=15; if(ALFA==0) r=7; for(i=0;ich[r].mhp) ch[r].hp=ch[r].mhp; care[i].time-=2; if(care[i].time<=0) care[i].a=218; //エフェクト for(j=0;j<8;j++) { rr =ch[r].x-cx +rand()%50-25; rrr=ch[r].y-cy+ch[r].sizey; elDraw32::BlendLayer(rr-1,0,WhiteBMP,0,0,2,rrr); } } } } /********************************************************************************/ /* 敵の足の判定                           */ /********************************************************************************/ int teki_hantei(void) { int teki_h; teki_h=stagedata[(tk[i].x+tk[i].sizex/2)/32][(tk[i].y+tk[i].sizey)/24]; if(teki_h==0) { teki_h=stagedata[(tk[i].x+tk[i].sizex/3)/32][(tk[i].y+tk[i].sizey)/24]; if(teki_h==0) { teki_h=stagedata[(tk[i].x+tk[i].sizex/3*2)/32][(tk[i].y+tk[i].sizey)/24]; } } return teki_h; } /********************************************************************************/ /* 敵関数                              */ /********************************************************************************/ void teki(void) { //敵 for(i=0;i=70) tk[i].ho=0; if(tk[i].x+tk[i].sizex/2 > cx+160 && tk[i].motion>=70) tk[i].ho=1; } else { //ボス。HPの高い方を狙う if(ch[1].hp>ch[0].hp) r=1; else r=0; if(tk[i].x+tk[i].sizex/2 < ch[r].x && tk[i].motion>=70) tk[i].ho=0; if(tk[i].x+tk[i].sizex/2 > ch[r].x && tk[i].motion>=70) tk[i].ho=1; } //歩く if(tk[i].ax==0 && tk[i].ay==0) { tk[i].ax=tk[i].ho*-200+100; if(tk[i].cg==3) tk[i].ax=0; //クリスタルは歩かない if(tk[i].cg==4) tk[i].ax*=2; //ナイトは速い if(tk[i].cg==11) tk[i].ax*=1; } //攻撃中? if(tk[i].motion>=40 && tk[i].motion<=79+20) tk[i].ax=0; //移動前の座標 r =tk[i].x; rr=tk[i].y; //移動 tk[i].x+=tk[i].ax/100; tk[i].y+=tk[i].ay/100; //移動できる? tk[i].y-=24; if(teki_hantei()!=0) { //できない tk[i].x=r; } tk[i].y+=24; } //飛ぶキャラの場合 if(tk[i].cg==5) { //食らい判定 if(tk[i].kurai>0) tk[i].kurai--; //思考 tk[i].kougeki++; //攻撃の周期 if(tk[i].kougeki>=5 && tk[i].hp>0) { //攻撃対象をサーチ r=999999; //距離 rrr=0; //攻撃対象 for(j=0;j<2;j++) { if(ch[j].hp>0) { rr=(ch[j].x-(tk[i].x+tk[i].sizex/2)); if(rr<0) rr*=-1; k=((ch[j].y+ch[j].sizey/2)-(tk[i].y+tk[i].sizey/2)); if(k<0) k*=-1; rr+=k; //距離が前の対象より近かったら if(r>rr) { rrr=j; //対象を変更 r=rr; //距離を更新 } } } //対象を補足 if(ch[rrr].x>(tk[i].x+tk[i].sizex/2)) { tk[i].ho=0; tk[i].ax=5; } else { tk[i].ho=1; tk[i].ax=-5; } if(ch[rrr].y+ch[rrr].sizey/2>tk[i].y+tk[i].sizey/2) tk[i].ay=5; else tk[i].ay=-5; tk[i].kougeki=0; //攻撃 if(tk[i].motion<40)// && r<50) { tk[i].motion=40; //弾を打つ k=0; //弾のカウンタ for(j=0;j2) break; } } } } //移動 tk[i].x+=tk[i].ax; tk[i].y+=tk[i].ay; //収束 if(tk[i].ax>0) tk[i].ax--; else tk[i].ax++; if(tk[i].ay>0) tk[i].ay--; else tk[i].ay++; } //ラゼル if(stage==3 && tk[i].cg==12 && mes_no==3 && tk[i].kougeki%3==0) { //攻撃対象をサーチ r=999999; //距離 rrr=0; //攻撃対象 for(j=0;j<2;j++) { if(ch[j].hp>0) { rr=(ch[j].x-(tk[i].x+tk[i].sizex/2)); if(rr<0) rr*=-1; k=((ch[j].y+ch[j].sizey/2)-(tk[i].y+tk[i].sizey/2)); if(k<0) k*=-1; rr+=k; //距離が前の対象より近かったら if(r>rr) { rrr=j; //対象を変更 r=rr; //距離を更新 } } } //対象を補足 if(ch[rrr].x>(tk[i].x+tk[i].sizex/2)) { tk[i].ho=0; tk[i].ax=5; } else { tk[i].ho=1; tk[i].ax=-5; } if(ch[rrr].y+ch[rrr].sizey/2>tk[i].y+tk[i].sizey/2) tk[i].ay=5; else tk[i].ay=-5; //移動 tk[i].x+=tk[i].ax; tk[i].y+=tk[i].ay; //収束 if(tk[i].ax>0) tk[i].ax--; else tk[i].ax++; if(tk[i].ay>0) tk[i].ay--; else tk[i].ay++; } //重力 if(tk[i].cg!=2 && tk[i].cg!=5) { if(stagedata[(tk[i].x+tk[i].sizex/2-16)/32][(tk[i].y+tk[i].sizey)/24]==0 && stagedata[(tk[i].x+tk[i].sizex/2+16)/32][(tk[i].y+tk[i].sizey)/24]==0) tk[i].ay++; else { tk[i].ay=0; tk[i].ax=0; } tk[i].y+=tk[i].ay; } } void teki_remit(void) { //壁とかの判定 if(tk[i].dy!=tk[i].y || tk[i].dx!=tk[i].x) { tk[i].y-=20; r=teki_hantei();//stagedata[(tk[i].x+tk[i].sizex/2)/32][(tk[i].y-20)/24]; tk[i].y+=20; rr=teki_hantei();//stagedata[(tk[i].x+tk[i].sizex/2)/32][(tk[i].y+tk[i].sizey)/24]; if(r==5 && tk[i].ay<0) tk[i].ay*=-1; //持ち上げ if(rr==1 || rr==5) { r=0; while(rr!=0) { tk[i].y-=24; rr=teki_hantei();//stagedata[(tk[i].x+tk[i].sizex/2)/32][(tk[i].y+tk[i].sizey)/24]; r=1; } if(r==1) tk[i].y+=24; tk[i].y=tk[i].y/24*24; } tk[i].dx=tk[i].x; tk[i].dy=tk[i].y; } //画面外に出た if((!(boss==2 && i==0))&&(tk[i].x-cx<-320 || tk[i].x-cx>640)) { stagedata[tk[i].hairetux][tk[i].hairetuy]=tk[i].type; tk[i].a=0; } //画面下にオーバーしないように if(tk[i].y+tk[i].sizey > 740-48) tk[i].y=740-tk[i].sizey-48; } void teki_think(void) { //食らい判定 if(tk[i].kurai>0) tk[i].kurai--; //思考 if((tk[i].cg==10 || tk[i].cg==6 || tk[i].cg==11 || tk[i].cg==12 || tk[i].kurai==0) && tk[i].hp>0) { //攻撃 tk[i].kougeki++; //攻撃の周期 if(tk[i].kougeki==25) { //クリスタル君のジャンプ if(tk[i].cg==3 && tk[i].ay==0) { tk[i].y-=5; tk[i].ay-=10; } } if((tk[i].kougeki>50 && tk[i].cg!=11) || (tk[i].kougeki>100 && tk[i].cg==11)) { tk[i].kougeki=0; tk[i].motion=40; //ボス思考パターン1 if(tk[i].cg==10) { tk[i].now++; if(!(tk[i].now<=3 || (tk[i].now>=6 && tk[i].now<9))) { if(tk[i].now<6) { //敵を降らす tk[i].motion=80; tk[i].kougeki=40; j=i; r=0; srand(tk[i].hp+ch[0].x+ch[1].x); for(i=0;i3) break; } i=j; } else if(tk[i].now==9) { //ジャンプ tk[i].kougeki=0; tk[i].ay=-25; tk[i].y-=24; } else if(tk[i].now<13) { //弾を投げる tk[i].kougeki=40; tk[i].motion=80; r=0; for(j=0;j3) break; } } } else tk[i].now=0; } } //ボス思考パターン2 if(tk[i].cg==11) { tk[i].now++; if(!(tk[i].now<=2)) { tk[i].motion=80; tk[i].kougeki=99; if(tk[i].now>=30 && tk[i].now<100) { //岩を投げる tk[i].kougeki=99; tk[i].motion=80; r=0; srand(tk[i].hp+ch[0].x+ch[1].x+tk[i].now); for(j=0;j3) break; } } } else if(tk[i].now>=30) tk[i].now=0; } } //ラゼル if(tk[i].cg==12) { tk[i].motion=20; tk[i].now++; if(tk[i].now>=0 && tk[i].now<=10) { tk[i].kougeki=49; //弾を打つ k=0; //弾のカウンタ for(j=0;j2) break; } } if(tk[i].now==10) { tk[i].now=0; tk[i].kougeki=0; } } } //弾をうつ(クリスタル) if(tk[i].cg==3) { for(j=0;j=0 && tk[i].motion<=19) { tk[i].motion+=3; if(tk[i].motion>=20) tk[i].motion=0; } if(tk[i].motion>=20 && tk[i].motion<=29) { tk[i].motion+=3; if(tk[i].motion>=30) tk[i].motion=0; } r=tk[i].sizex*tk[i].ho; rr=tk[i].sizey*(tk[i].motion/10); } else if(tk[i].cg==13) { //魔王 for(j=0;j<6;j++) { if(tk[i].motion>=j*20 && tk[i].motion=j*20+20) tk[i].motion=20;//0; } } r=tk[i].sizex*tk[i].ho; rr=tk[i].sizey*(tk[i].motion/10); } else if(tk[i].cg==1 || tk[i].cg==3 || tk[i].cg==10 || tk[i].cg==4 || tk[i].cg==5 || tk[i].cg==6 || tk[i].cg==11) { //モーション計算(歩き) if(tk[i].motion>=0 && tk[i].motion<=39) { tk[i].motion+=3; if(tk[i].cg==11) tk[i].motion-=2; if(tk[i].motion>=40) tk[i].motion=0; } //モーション計算(攻撃) if(tk[i].motion>=40 && tk[i].motion<=79) { tk[i].motion+=3; if(tk[i].cg==11) tk[i].motion-=1; if(tk[i].motion>=80) tk[i].motion=0; } //モーション計算(特殊)(ボス) if(tk[i].motion>=80 && tk[i].motion<=99) { tk[i].motion+=3; if(tk[i].motion>=99) tk[i].motion=0; if(tk[i].cg==11 && tk[i].motion>=89) tk[i].motion=0; } //モーションなどからBMP上座標計算 r=tk[i].sizex*tk[i].ho; if(tk[i].cg==11) r=0; rr=tk[i].sizey*(tk[i].motion/10); } else { r=0; rr=0; } //敵がクリスタルの場合、残像 if(tk[i].cg==3 && rr>=400) elDraw32::BlendLayer(tk[i].x-cx,tk[i].y-cy,(float)0.5,Mon22BMP,r,rr-400,r+tk[i].sizex,rr+tk[i].sizey-400); //敵がリッチの場合、残像 if(tk[i].cg==5) elDraw32::BlendLayer(tk[i].x-cx,tk[i].y-cy,(float)0.3,Mon42BMP,r,rr,r+tk[i].sizex,rr+tk[i].sizey); //ラゼルのイベント絵表示の例外処理 if(mes_no==1 && stage==3 && tk[i].cg==12) rr+=300; //通常 elDraw::Layer(tk[i].x-cx,tk[i].y-cy,MonbufBMP,r,rr,r+tk[i].sizex,rr+tk[i].sizey); //ゴーレムの残像 if(tk[i].cg==6 && rr>=500) elDraw32::AddBlendLayer(tk[i].x-cx,tk[i].y-cy,Mon52BMP,r,rr-500,r+tk[i].sizex,rr+tk[i].sizey-500); //魔王の攻撃のエフェクト if(tk[i].cg==13 && rr>=400) elDraw32::AddBlendLayer(tk[i].x-cx,tk[i].y-cy,Boss2BMP,r,rr-400,r+tk[i].sizex,rr+tk[i].sizey-400); } else { //倒した後の消えるエフェクト r=(tk[i].sizex-tk[i].dawntimer)/2; rr=tk[i].dawntimer*tk[i].sizey/tk[i].sizex; rrr=(tk[i].sizey-rr)/2; elDraw::Layer(tk[i].x-cx+r,tk[i].y-cy+rrr,MonbufBMP,r,rrr,tk[i].dawntimer,rr); tk[i].dawntimer-=40; if(tk[i].dawntimer<=0) { tk[i].dawntimer=0; tk[i].a=0; } } } void teki_down(void) { //倒した? if( tk[i].a==1 && tk[i].dawntimer==0 && tk[i].hp<=0 )//&&(stagedata[(tk[i].x+tk[i].sizex/2)/32][(tk[i].y+tk[i].sizey)/24]==1 || stagedata[(tk[i].x+tk[i].sizex/2)/32][(tk[i].y+tk[i].sizey)/24]==2 || combotimer==0)) { //if(!(i==0 && boss==2 && mes_no<=5)) //{ tk[i].dawntimer=tk[i].sizex; //tk[i].a=0; elSound::Play(WinWAV); //エフェクト j=0; if(tk[i].cg!=2) { r=1; if(boss==2 && i==0) r=5; for(k=0;k=36) break; } } } } //elDraw::SpriteScreen(GamenBMP,0,0,320,240); //画面を揺らす /* for(l=0;l<2;l++) { elDraw::Clear(); elDraw::Layer(0+rand()%10-5,0+rand()%10-5,GamenBMP,0,0,320,240); elDraw::Refresh(); } */ } } void teki_maoh(void) { //魔王思考ルーチン int target; //ターゲット //通常 if(tk[i].now==0) tk[i].now=101; if(tk[i].now>100) { //ターゲットを検索 target=0; r=9999999; for(j=0;j<2;j++) { //ターゲットとの距離を計算 k=(ch[j].x)-(tk[i].x+tk[i].sizex/2); if(k<0) k*=-1; l=(ch[j].y+ch[j].sizey/2)-(tk[i].x+tk[i].sizey/2); if(l<0) l*=-1; k+=l; //現在のターゲットより近ければ、ターゲットを更新 if(r>k) { target=j; r=k; } } //ターゲットが倒れていた場合ターゲットを変更 if(ch[target].hp<1) target=1-target; //ターゲットへ向かう if(ch[target].xtk[i].x+tk[i].sizex/2) { tk[i].x+=7; tk[i].ho=0; } if(ch[target].y=20 && tk[i].motion<=39) || tk[i].motion>=40)) tk[i].motion=20; //攻撃 if(r<=400 && tk[i].motion<40) { srand(tk[i].x+ch[0].x+ch[1].x); tk[i].motion=rand()%4*20+40; } tk[i].now++; if(tk[i].now>300) tk[i].now=1; } //魔法 if(tk[i].now>=1 && tk[i].now<=100) { static int saver; //グラフィック tk[i].motion=0; //魔法の予備動作 if(tk[i].now<=10) { tk[i].now+=1;//2; } //魔法の実行 if(tk[i].now>10) { elSound::Play(BeemWAV); for(l=0;l<5;l++) { srand(ch[0].x+ch[1].x+tk[i].now+l); r=rand()%2; if(r==1) { //縦 r=rand()%320; if(ALFA) elDraw32::BlendLayer(r-3,0,WhiteBMP,0,0,6,240); else elDraw::Layer(r-3,0,WhiteBMP,0,0,6,240); //判定 for(cn=0;cn<2;cn++) { saver=r; if(ch[cn].x-25-cx0 && muteki==0) main_atari_kurai(1,1-ch[cn].ho); r=saver; } } else { //横 r=rand()%240; if(ALFA) elDraw32::BlendLayer(0,r-3,WhiteBMP,0,0,320,6); else elDraw::Layer(0,r-3,WhiteBMP,0,0,320,6); //判定 for(cn=0;cn<2;cn++) { saver=r; if(ch[cn].y+ch[cn].sizey/2-25-cy0 && muteki==0) main_atari_kurai(1,1-ch[cn].ho); r=saver; } } } tk[i].now++; } //魔法の終了 if(tk[i].now>50) { tk[i].now=0; } } } /********************************************************************************/ /* 爆発エフェクト                          */ /********************************************************************************/ void draw_efect(void) { //エフェクト for(i=0;i=100)//130) ef[i].a=0; } } //飛び散り //static float a; rr=TOBI_MAX; if(ALFA==2) rr/=3; if(ALFA==0) rr=0; for(i=0;i1) tb[i].a-=10; //if(tb[i].a==1) if(tb[i].a%10==1) if(ALFA) elDraw32::AddBlendLayer(tb[i].x-10-cx,tb[i].y-10-cy,TobiBMP ,0,0,20,20); else elDraw::Layer(tb[i].x-10-cx,tb[i].y-10-cy,TobiBMP ,0,0,20,20); if(tb[i].a%10==2) if(ALFA) elDraw32::AddBlendLayer(tb[i].x-10-cx,tb[i].y-10-cy,Tobi2BMP,0,0,20,20); else elDraw::Layer(tb[i].x-10-cx,tb[i].y-10-cy,Tobi2BMP,0,0,20,20); tb[i].x+=tb[i].ax; tb[i].y+=tb[i].ay; if(tb[i].x+10-cx<-50 || tb[i].y+10-cy<-50 || tb[i].y+10-cy>240+50 || tb[i].x+10-cx>320+50) tb[i].a=0; } } } /********************************************************************************/ /* ワイド画面描画                          */ /********************************************************************************/ void draw_wide(void) { draw_wide2(40); } void draw_wide2(int r) { elDraw::ClearArea(0,0,320,r); elDraw::ClearArea(0,240-r,320,240); } void draw_wide3(int r) { if(ALFA) { elDraw32::BlendLayer(0,0 ,BlackBMP,0, 0,320, r); elDraw32::BlendLayer(0,240-r,BlackBMP,0,240-r,320,240); } else { elDraw::ClearArea(0,0,320,r); elDraw::ClearArea(0,240-r,320,240); } } /********************************************************************************/ /* ワーニング描画                          */ /********************************************************************************/ void draw_warning(void) { static int warningpos=0; //上下のバーのスクロール用 if(warning!=0) { //開始 if(warning<=120) { if(ALFA) elDraw32::AddBlendLayer(0,(240-warning*2)/2,WarningBMP,0,120-warning,320,120+warning); else elDraw::Layer(0,(240-warning*2)/2,WarningBMP,0,120-warning,320,120+warning); warning+=2; if(warning>120) warning=240; } //消える if(warning>120 && warning<=240) { warning-=2; if(warning<=120) { //ボス出現 boss=2; warning=0; //ザコ消去 for(i=0;i=40 && warning<=120)||(warning>=160 && warning<=240)) { //固定 draw_wide3(40); r=40; } else { //アニメ if(warning<40) r=warning; else r=warning-120; draw_wide3(r); } //バーのWARNINGの文字 for(i=0;i<5;i++) { for(j=0;j<2;j++) { if(j==0) elDraw::Layer(i*80-(warningpos%80),j*200,WabarBMP,0,0,80,r); else elDraw::Layer(i*80-(warningpos%80),j*200,WabarBMP,0,40-r,80,40); } } //スクロール warningpos++; if(warningpos>=80) warningpos=0; } } /********************************************************************************/ /* メッセージ描画                          */ /********************************************************************************/ void draw_mes(void) { //変数宣言 static char buf[128]; static int first=1; static FILE *txt; //前処理 if(stage==3 && mes_no==1) { play_bgm(9); //VS ラゼル txt=fopen("txt\\s4.txt","r"); mes_no++; nowmes=1; first=2; } if(stage==3 && mes_no==4) { elMusic::Stop(); //VS ラゼル終了 txt=fopen("txt\\s5.txt","r"); mes_no++; nowmes=1; first=2; } if(stage==4 && mes_no==1) { //VS 魔王終了 txt=fopen("txt\\s7.txt","r"); mes_no++; nowmes=1; first=2; ivent=10; ShotKey=FREE_KEY; } if(stage==4 && mes_no==2) { //カメラを移動 if((ch[0].x-cx>75 || ch[0].hp<1) && (ch[1].x-cx>75 || ch[1].hp<1)) { cx+=10; cx2+=5; cx3+=20; bcx+=10; bcx2+=5; bcx3+=20; nowmes=1; } } if(nowmes!=0 && first==1) { switch(stage) { case 1: txt=fopen("txt\\s1.txt","r"); break; case 2: txt=fopen("txt\\s2.txt","r"); break; case 3: txt=fopen("txt\\s3.txt","r"); break; case 4: txt=fopen("txt\\s6.txt","r"); ivent=5; break; } first=2; } if(first==2) { //一行読み込み for(i=0;i<128;i++) { buf[i]=fgetc(txt); if(buf[i]=='\n' || buf[i]=='#' || buf[i]=='$' || buf[i]=='!' || buf[i]==')' || buf[i]=='&') break; } if(buf[i]=='#') { nowmes=-40; //下の方にも同じIFがあるので、そこも変更 if(mes_no==2 && stage==3) boss_bgm(); if(mes_no==0) bgm_play_stage(); else mes_no++; } first=0; if(buf[i]=='$' && stage==3) { //画面を揺らす elDraw::SpriteScreen(SbufBMP,0,0,320,240); for(i=0;i<20;i++) { elDraw::Clear(); elDraw::Layer(rand()%40-20,rand()%40-20,SbufBMP,0,0,320,240); elDraw::Refresh(); elSound::Play(SlashWAV); } elDraw::Clear(); elDraw::Layer(0,0,SbufBMP,0,0,320,240); elDraw::Refresh(); play_bgm(10); first=2; //ivent=1; } if(buf[i]=='&' && stage==3) { ivent=1; first=2; } if(buf[i]=='$' && stage==4 && mes_no==2) { ivent=11; first=2; } if(buf[i]=='$' && stage==4 && mes_no==0) { ivent=6; first=2; } if(buf[i]==')') { //ライト elSound::Play(MaohWAV); for(i=0;i<20;i++) { elDraw32::AddBlendLayer(0,0,LightBMP,0,0,320,240); elDraw::Refresh(); } play_bgm(19); first=2; ivent=17; } if(buf[i]=='!') { ivent=12; first=2; } buf[i]='\0'; } //魔王戦終了時は消えるエフェクト無し if(nowmes<0 && mes_no==4 && stage==4) { fclose(fp); nowmes=0; first=1; } //アニメーションでウインドウが出てくる if(nowmes<40 && nowmes>0) { draw_wide3(nowmes); nowmes+=5; } else //メッセージ描画 if(nowmes>=40) { draw_wide3(40); //strcpy(buf,"シーク「行くか…」"); //pos((320-strlen(buf)*6)/2,240-40+5); pos(0,240-40+5); color(255,255,255); if(!(ivent>=12 && ivent<=15)) print(buf); } else //アニメーションでウインドウが消える if(nowmes<0) { draw_wide3(nowmes*-1); nowmes+=5; if(nowmes==0) { fclose(fp); first=1; } } //キー入力 if((nowmes>=40 || (REPLAY!=0 && nowmes>0)) && !(ivent>=12 && ivent<=15) && !(ivent==6))//>0) { inkey(); if((ShotKey==PUSH_KEY && nowmes<=63 && nowmes>0)||(REPLAY!=0)) { elSound::Play(SelectWAV); first=2; } if(ItemKey==PUSH_KEY && nowmes<=63 && nowmes>0 && REPLAY==0) { if(mes_no==2) boss_bgm(); if(mes_no==0) bgm_play_stage(); else mes_no++; nowmes=-40; } } //キー初期化 LeftKey=FREE_KEY; RightKey=FREE_KEY; UpKey=FREE_KEY; DownKey=FREE_KEY; ShotKey=FREE_KEY; ItemKey=FREE_KEY; } /********************************************************************************/ /* イベント描画                           */ /********************************************************************************/ void draw_ivent(void) { static int motion=0,maohx,maohy,tx,ty,timer; static float mahou=0; //魔王登場 if(ivent==1) { //浮いてる r=200; maohx=r; maohy=0; timer=0; ch[0].ho=0; ch[1].ho=0; ivent++; elSound::Play(MaohWAV); } else if(ivent==2) { r=200; elDraw::Layer(r,0,BossBMP,100,0+motion/10*100,200,100+motion/10*100); if(timer<10) { for(i=0+timer*25;ir;i-=25) elDraw32::AddBlendLayer(i,0,BossBMP,100,0+motion/10*100,200,100+motion/10*100); for(i=240-timer*25;i>0;i-=25) elDraw32::AddBlendLayer(r,i,BossBMP,100,0+motion/10*100,200,100+motion/10*100); timer+=3; } } //魔王最初のイベント if(ivent==5) { //浮いてる r=200; elDraw::Layer(r,0,BossBMP,100,0+motion/10*100,200,100+motion/10*100); maohx=r; maohy=0; timer=0; } else if(ivent==6) { //突進 elDraw::Layer(maohx,maohy,BossBMP,100,200+motion/10*100,200,300+motion/10*100); maohx-=50; maohy+=25; timer++; if(timer>3) ivent++; elSound::Play(Hit2WAV); for(i=0;i<2;i++) { ch[i].dmtimer=10; //喰らいエフェクト elDraw32::BlendLayer(ch[i].x-50-cx,ch[i].y-cy,WhiteBMP,0,0,100,100); } } else if(ivent==7) { ch[0].ho=1; ch[1].ho=1; elDraw::Layer(maohx,maohy,BossBMP,0,0+motion/10*100,100,100+motion/10*100); } else //魔王最後のイベント if(ivent==10 || ivent==17) { //浮いてる r=ch[0].x; if(r>ch[1].x && ch[1].hp>0) r=ch[1].x; elDraw::Layer(r+320-200-cx,0,BossBMP,100,0+motion/10*100,200,100+motion/10*100); maohx=r; mahou=0; ch[0].ho=0; ch[1].ho=0; } else if(ivent==11) { //魔力をためる tx=maohx+320-200-cx; ty=0; elDraw::Layer(maohx+320-200-cx,0,BossBMP,100,1200+motion/10*100,200,1300+motion/10*100); if(mahou<0.5) elDraw32::BlendLayer(tx,ty,mahou,Maoh3BMP,0,motion/7*120,120,120+motion/7*120); else elDraw32::AddBlendLayer(tx,ty,Maoh3BMP,0,motion/7*120,120,120+motion/7*120); mahou+=0.1; if(mahou>=0.5) mahou=0.5; for(i=0;i<2;i++) ch[i].motion=440; elSound::Play(GogogoWAV); } else if(ivent>=12 && ivent<=14) { if(ivent==12) elSound::Play(MaohWAV); //if(ivent>12) // Sleep(500); //弾を撃つ r=(ivent-12)*100+1200+200; elDraw::Layer(maohx+320-200-cx,0,BossBMP,100,r,200,r+100); elDraw32::AddBlendLayer(tx,ty,Maoh3BMP,0,motion/7*120,120,120+motion/7*120); tx-=20; ty+=20; ivent++; for(i=0;i<2;i++) ch[i].motion=440; } else if(ivent==15) { //Sleep(500); //フラッシュ elDraw::SpriteScreen(SbufBMP,0,0,320,240); for(i=0;i<3;i++) { elDraw::Clear(); elDraw::Box(0,0,320,240,RGB(255,255,0),RGB(255,255,0),1); elDraw::Refresh(); elDraw::Clear(); elDraw::Layer(0,0,SbufBMP,0,0,320,240); elDraw::Refresh(); elSound::Play(Hit2WAV); elSound::Play(BeemWAV); } ivent++; } else if(ivent==16) { //ラゼルが止める elDraw::Layer(maohx+320-200-cx,0,BossBMP,100,1600+motion/10*100,200,1700+motion/10*100); elDraw32::AddBlendLayer(tx,ty,Maoh3BMP,0,motion/7*120,120,120+motion/7*120); elDraw::Layer(tx,ty,RazelBMP,0,motion/10*100,100,motion/10*100+100); elSound::Play(GogogoWAV); } motion+=3; if(motion>=20) motion=0; } /********************************************************************************/ /* ブラインド描画関数                       */ /********************************************************************************/ void draw_blind(void) { static int first=1,kirikae[20]; //テーブル初期設定 if(first) { //初期値設定 for(i=0;i<20;i++) { kirikae[i]=i; } //並び替え for(i=0;i<500;i++) { j=rand()%20; k=rand()%20; swap(&kirikae[j],&kirikae[k]); } first=0; } //ブラインド? if(blind_timer!=0) { for(i=0;i<12;i++) for(j=0;j20) blind_timer=20; } } /********************************************************************************/ /* コイン描画関数                         */