警告!
この下にあるソースコードはVC++で動くんですが、「ポインタ」だの「オブジェクト指向」だのという言葉をよく理解してC++を使いこなしている人はきっと悶絶必至なのだろうと言う事なのでご注意ください。
…まー、工場で工作機械とか測定器制御のプログラムを作るくらいならこれくらいのスキルで何とかなっちゃうわけですよ。
測定器を販売する側も、「制御プログラムを最小化するとタスクバーを右クリックして『元のサイズに戻す』をクリックしないと戻せない」とか「VB6製のプログラムでできてる(ランタイムエラーが出て気づいた)」とか「測定結果のグラフを取り込むボタンが実は十中八九PrintScreenボタンを押すAPIを呼び出してるだけの漢(おとこ)仕様(説明書には『画像ソフトに貼り付けて切り取って使ってね』とか書いてある)」とか、そんな状態ですからぜんぜん大丈夫なんです、何も怖いものなど無いのです、貴方の見ている全てが世界の全てだと思わないで!!!
むしろ測定子や工具をぶつけちゃいけないところにぶつけないようにする事に最大限の注意を払うべきなんですよ。
大量生産しない品物だから、手のひらサイズの部品が簡単に何十万って値段になりますからね。
そんな与太話はどうでもいいんですよ。
ともかくこんなんでもとりあえず動くってことで、自身をヘタレプログラマだと思っている人も自身を持って同人ゲームを頑張ってね!!!
・はじめての売り物なので枯れた技術を多用(例えばDirectXを使用しない)
・ポインタなんて知りません。アスタリスクが出る部分が関係しているらしいんですけど、その辺り、例えばファイル操作は見よう見まね。
・ファイル操作はシーケンシャルアクセスしか知りません。ランダムアクセスは生まれてこのかた使ったことがありません。
・たまにコード内に出る「Wait」は「Weight(重量)」のスペルミスです。気づいた時には大量のデータファイルを作っちゃったので手遅れでした。
・他に文章が間違っている可能性もあります。何年も前に作ったプロトタイプの改造品ですからね…。
・このコードはご自由に利用して構いません。ただし一切の責任は負いかねます。
・ちなみに以下のコードは全て「astudata」フォルダ内のデータを操作しています。基本的に.datファイルは全てテキストファイルなので、「革命の続き」をご購入された方は実際にメモ帳で開いてみると面白いかと。
・『革命の続き』をご購入された方は、astudataフォルダ内の拡張子が「.dat」の全ファイルと、「playor.bmp」および「enemy.bmp」のファイルはご自由に改変して、以下のコードを利用して作ったプログラムと共に自分のソフトとして売っても構いませんが、何が起こっても私は責任取りません。
・それ以外のastudataフォルダ内のファイル(Hシーンとか音声ファイルとか)は、購入した素材集から作ったものが多いので、間違っても二次使用はしないでください。
#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <math.h>
#include <mmsystem.h>
#include "resource.h"
FILE *ERR;//デバッグログを出すストリーム
HWND DeskTophWnd=GetDesktopWindow();//デスクトップのハンドル取得
HDC DeskTopHDC=GetDC(DeskTophWnd);
long DeskTopWidth=GetDeviceCaps(DeskTopHDC, HORZRES);
long DeskTopHeight=GetDeviceCaps(DeskTopHDC, VERTRES);
//効果音の有無(0以外で停止)
int SoundSkip=0;
//音楽の有無(0以外で停止)
int MusicSkip=0;
const FullPathMax=256;//ファイルのフルパスを入れる変数の文字サイズ
struct MouseDownFlag{//マウス制御
int X;
int Y;
int LButton;
int RButton;
int LRKey;
int UDKey;
};
MouseDownFlag MDF;
//戦闘////////////////////////////////////////////////////////////////////////////
const float m_cstG=1.0f; //重力加速度
const float m_cstE=0.3f;//跳ね返り係数
int Nanido=1;//難易度
//画面のサイズ
const WindowWidth=640;
const WindowHeight=480;
int WindowMode=1;//画面モード(1=フルスクリーン、0=通常画面)
//ビットマップ描画領域
const SurfaceMax=32;
HBITMAP Surface[SurfaceMax];
BITMAP SurfaceData[SurfaceMax];
HDC SurfaceHDC[SurfaceMax];
//const m_cstSurfPrim=0;//プライマリサーフェス
const m_cstSurfBack=1;//バックバッファ
const m_cstSurfElase=2;//消去用
const m_cstSurfPlayor=3;//プレイヤーグラフィック
const m_cstSurfPlayorm=4;//プレイヤーグラフィックマスク
const m_cstSurfEnemy=5;//敵グラフィック
const m_cstSurfEnemym=6;//敵グラフィックマスク
const m_cstSurfHaikei=7;//アドベンチャー背景
const m_cstSurfTatie=8;//立ち絵
const m_cstSurfTatiem=9;//立ち絵マスク
const m_cstSurfMoziban=10;//文字ウインドウ
const m_cstSurfMozibanm=11;//文字ウインドウマスク
const m_cstSurfMoziSyori=12;//文字処理部分
const m_cstSurfWhiteElase=13;//文字処理部分
const m_cstSurfFreeGraphic=14;//自由画像処理部分
const m_cstSurfFreeGraphicm=15;//自由画像処理部分マスク
const m_cstSurfButtonWord=20;//ボタン文字
//戦闘パートでの背景を管理する変数の構造体
struct BackSetting{
int X;//現在表示しているX座標
int Y;//現在表示しているY座標
int XVector;//横方向スクロール速度
int YVector;//縦方向スクロール速度
int Width;//幅
int height;//高さ
HBITMAP Surface;//背景画像
HDC hdc;//デバイスコンテキスト
HBITMAP Surfacem;//背景画像マスク
HDC hdcm;//デバイスコンテキストマスク
int Enabled;//稼動フラグ
};
const BSMax=8;//変数BSを宣言する数
BackSetting BS[BSMax];//戦闘パートでの背景を管理する変数
const WeaponMax=4;//武器をもてる最大数
const UnitString=16;//ユニット内でも文字列変数の長さ
const ScriptMax=1024;//ユニットの動作制御スクリプトの行数
const ZyumyouMax=32767;//敵ユニットの最大寿命(消去されずに残ってしまう問題が発生した時に泥縄式に何とかするためのもの)
struct UnitData{
int Enabled;//使用中フラグ
//現在位置
float X;
float Y;
float Z;
//各方向への速度
float XVector;
float YVector;
float ZVector;
int Wait;//重量
//耐久力と攻撃力と防御力と速度
int HP;
int BP;
int DP;
int SP;
int Type;//ユニットの種類
//HPの最大値
int HPMAX;
//武器情報
int WeaponEnabled[WeaponMax];
char WeaponName[WeaponMax][UnitString];
int WeaponShotNum[WeaponMax];
int WeaponShotBlanc[WeaponMax];
int WeaponSoutenCounter[WeaponMax];
char DeathChange[UnitString];//死亡後に変化するユニット
int BmpNumber;//ビットマップの番号
int BmpNumberm;//マスク用ビットマップの番号
//ビットマップを切り取ってくる座標
int BmpX;
int BmpY;
int BmpWidth;
int BmpHeight;
//貼り付け時の位置補正
int BmpOfsetX;
int BmpOfsetY;
//移動目標
int GotoX;
int GotoY;
int GotoZ;
//攻撃目標
int AtackX;
int AtackY;
int AtackZ;
int ID;//敵味方識別
int Fire;//攻撃
int Size;//大きさ
//スクリプト
char SMethod[ScriptMax][UnitString];
int SData1[ScriptMax];
int SData2[ScriptMax];
int ScriptPointer;
//ボスフラグ(0=通常、1=ボス、2=中ボス)
int Boss;
//敵を発見した時、敵との間に取る間合い
int Maai;
//タイマー用
int TimerCounter;
//寿命(消去されずに残ってしまう問題が発生した時に泥縄式に何とかするためのもの)
int Zyumyou;
int CatchUnit;//繋がっている番号
int BeforeID;//繋がる前の敵味方識別
};
const UnitMax=1024;//ユニットを一度に扱える上限
const MeNumber=0;//自機の番号
const BossNumber=UnitMax-1;//ボスの番号
//ユニットの種別の定数
const m_cstTypeCar=0;//車両
const m_cstTypeExp=8;//爆発
const m_cstTypeObject=9;//飾り
const m_cstTypeGun=10;//鉄砲
const m_cstTypeCanon=11;//大砲
const m_cstTypeCrow=12;//格闘戦触手
const m_cstTypePlane=13;//飛行物体
const m_cstTypeChageHP=14;//HP補充
const m_cstTypeSet1000mm=15;//1000mm弾装備
const m_cstTypeSetLaser=16;//レーザー装備
const m_cstTypeSetCrow=17;//触手装備
const m_cstTypeShip=18;//艦船
//上へ進める範囲
int UpMax=0;
//下へ進める範囲
int DownMax=WindowHeight;
const SmokeBetween=10;//煙を出す間隔
int SmokeCounter=0;//煙を出す間隔を管理するカウンター
//戦闘パートでのビットマップ描画
int Kun2DrawFlag=0;
int Kun2DrawX=0;
int Kun2DrawY=0;
int Kun2SrcX=0;
int Kun2SrcY=0;
int Kun2SrcWidth=640;
int Kun2SrcHeight=480;
UnitData Unit[UnitMax];
//移動目標設定時の移動可能な範囲を設定
const CanGotoXMax=720;
const CanGotoYMax=480;
const CanGotoZMax=640;
const CanGotoXMin=0;
const CanGotoYMin=0;
const CanGotoZMin=0;
//アドベンチャーモードの情報
const ADVGetLineNum=2048;//行番号の最大値
const ADVGetWordIndexNum=16;//仕分けして入れられる単語の数
const ADVGetWordcharNum=64;//仕分けして入れた時の単語を収められる文字数
char ADVGetWord[ADVGetLineNum][ADVGetWordIndexNum][ADVGetWordcharNum];//単語が入る
int ADVPointer;//マップの現在の行番号を記録
const SubLootinMax=16;//サブルーチンとして保持できる最大数
const SubLootinFileNameStringMax=FullPathMax;//サブルーチンのファイル名として使用可能な文字数の最大数
char SubLootinName[SubLootinMax][SubLootinFileNameStringMax];//サブルーチンを呼び出したとき、呼び出したファイルの名前を入れる文字列変数
int SubLootinCallLine[SubLootinMax];//サブルーチンを呼び出したとき、呼び出したファイルの行番号を記録
int SubLootinActivePointer=0;//使用中のサブルーチンを指す
//マップの情報
const MapGetLineNum=2048;//行番号の最大値
const MapGetWordIndexNum=8;//仕分けして入れられる単語の数
const MapGetWordcharNum=32;//仕分けして入れた時の単語を収められる文字数
char MapGetWord[MapGetLineNum][MapGetWordIndexNum][MapGetWordcharNum];//単語が入る
int MapPointer;//マップの現在の行番号を記録
const UnitNameMax=32;//ユニットの名前の最大文字数
const FleetMax=4;//一つのマップの従属艦最大数
//int PlayorHPMax;//プレイヤーのHPの最大値
char FleetUnitName[FleetMax][UnitNameMax];//使用する従属艦の名前
char FleetUnitNameJ[FleetMax][UnitNameMax];//使用する従属艦の名前
const HaveMax=16;//ユニットを保有できる最大数
char HaveUnitName[HaveMax][UnitNameMax];//保有できる従属艦の名前
char HaveUnitNameJ[HaveMax][UnitNameMax];//保有できる従属艦の名前(画面表示用)
char HaveUnitStatus[HaveMax];//保有している従属艦の状況
char FileValue[128];//makefile命令などで読み込んだファイルの内容を格納
//効果音の設定
const WaveFileMax=8;//一度に使用できる効果音用ファイルの数
char WaveFile[WaveFileMax][FullPathMax];//効果音ファイルの名前が入る
char WaveFileAlias[WaveFileMax][FullPathMax];//効果音ファイルの別名(これが無いと同名のファイルを一度にうまく再生できない)
int WaveFileCounter;//効果音ファイルのインデックス
void Kun2BInit(char *MapName){//戦闘モード初期化(背景画像の設定→マップ内容の初期化→ユニット全消去)
char FullPath[FullPathMax];//ファイルパスが入る
char TmpW[4];//汎用文字列変数
//戦闘パートで使用する効果音用変数の初期化
for(WaveFileCounter=0;WaveFileCounter<WaveFileMax;WaveFileCounter++){
//ファイル名を空にする
strcpy(WaveFile[WaveFileCounter],"");
//管理用の別名を入れる
itoa(WaveFileCounter,TmpW,10);
strcpy(WaveFileAlias[WaveFileCounter],"Wave_");
strcat(WaveFileAlias[WaveFileCounter],TmpW);
}
WaveFileCounter=0;
int intG;
for(intG=0;intG<BSMax;intG++){//背景設定の初期化
BS[intG].Enabled=1;//稼動フラグを片っ端からリセット
}
strcpy(FullPath,"./astudata/");
strcat(FullPath,MapName);
strcat(FullPath,".dat");
char MapGetLine[MapGetLineNum];//ファイルから取得した行を入れる
int intA;//汎用変数
int intB=0;//汎用変数
int intC=0;//汎用変数
int intF=0;//汎用変数
FILE *Map;
Map=fopen(FullPath,"r");//マップファイルを開く
while(fgets(MapGetLine,MapGetLineNum,Map)!=NULL){//終端に達するまで繰り返し
for(intA=0;intA<MapGetLineNum;intA++){//MapGetLineの単語をMapGetWordに仕分け
if(MapGetLine[0]=='/'){break;}//コメントだった場合はforループを抜ける
if(MapGetLine[0]=='\n'){break;}//何も文字が入っていなかった行の場合もforループを抜ける
switch(MapGetLine[intA]){
case '\n'://文字列終端に到達
MapGetWord[intF][intC][intB]='\0';//文字列終端を付ける
intB=0;//文字列ポインタを戻す
intC=0;//配列ポインタを戻す
intF++;//次の配列へ
intA=MapGetLineNum;
break;
//単語の区切りへ到達
case '=':
case ',':
MapGetWord[intF][intC][intB]='\0';//文字列終端を付ける
intB=0;//文字列ポインタを戻す
intC++;//次の配列へ
break;
default:
MapGetWord[intF][intC][intB]=MapGetLine[intA];//文字列をつなぐ
intB++;//文字列ポインタを加算
break;
}
}
}
fclose(Map);
int intD;
int intE;
BITMAP SurfaceData;
char ImagePath[96];//イメージのパス
char ImagePathm[96];//イメージマスクのパス
for(intD=0;intD<MapGetLineNum;intD++){//ファイルの内容を元にマップの設定をする
if(false){//インデント用ダミー
}else if(strcmp(MapGetWord[intD][0],"back")==0){//背景設定
intE=atoi(MapGetWord[intD][1]);//番号を数字に変換
//イメージ用パス作成
strcpy(ImagePath,"./astudata/");
strcat(ImagePath,MapGetWord[intD][2]);
strcat(ImagePath,".bmp");
//イメージマスク用パス作成
strcpy(ImagePathm,"./astudata/");
strcat(ImagePathm,MapGetWord[intD][2]);
strcat(ImagePathm,"m.bmp");
BS[intE].Surface=(HBITMAP) LoadImage(NULL,ImagePath,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
BS[intE].Surfacem=(HBITMAP) LoadImage(NULL,ImagePathm,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
BS[intE].X=0;//X初期化
BS[intE].Y=0;//Y初期化
BS[intE].XVector=atoi(MapGetWord[intD][3]);//X方向のスクロールを設定
BS[intE].YVector=atoi(MapGetWord[intD][4]);//Y方向のスクロールを設定
GetObject( BS[intE].Surface, sizeof(BITMAP), &SurfaceData );//幅と高さを取得する作業
BS[intE].Width=SurfaceData.bmWidth;
BS[intE].height=SurfaceData.bmHeight;
BS[intE].Enabled=1;
}else if(strcmp(MapGetWord[intD][0],"upmax")==0){//上へ進める範囲
UpMax=atoi(MapGetWord[intD][1]);
}else if(strcmp(MapGetWord[intD][0],"downmax")==0){//下へ進める範囲
DownMax=atoi(MapGetWord[intD][1]);
}else if(strcmp(MapGetWord[intD][0],"start")==0){//ゲームスタート(初期設定命令を入れた上でこれを行う)
MapPointer=intD;//マップの行番号を取得
break;
}
}
//ユニットのEnabledをすべて0にする
int intH;//汎用変数
for(intH=0;intH<UnitMax;intH++){
Unit[intH].Enabled=0;//配置していない命令
}
}
//使用されていないユニットを探す
int FindNullNumber(){
int intA;//汎用変数
for(intA=0;intA<BossNumber;intA++){//ボス用以外の番号を探す
if(Unit[intA].Enabled!=1){//使用されていないものを発見した時
return intA;
}
}
return UnitMax-2;//見つからない時は、とりあえず最後尾(ボスの番号のひとつ前)を返す
}
void MeMove(){//自機の移動などの制御
if(Unit[MeNumber].Enabled==1){//稼動中であること
//右クリック時
if(MDF.RButton==1){//移動先指定
//キーボードリセット
MDF.LRKey=0;
MDF.UDKey=0;
Unit[MeNumber].GotoX=MDF.X;
Unit[MeNumber].GotoY=MDF.Y;
//進める上限以上になったら上限値まで移動
if(Unit[MeNumber].GotoY<UpMax){Unit[MeNumber].GotoY=UpMax;}
//進める下限以上になったら下限値まで移動
if(Unit[MeNumber].GotoY>DownMax){Unit[MeNumber].GotoY=DownMax;}
}
//キーボードで動かす場合
if(MDF.LRKey){
Unit[MeNumber].GotoX=int(Unit[MeNumber].X)+MDF.LRKey;
}
if(MDF.UDKey){
Unit[MeNumber].GotoY=int(Unit[MeNumber].Y)+MDF.UDKey;
//進める上限以上になったら上限値まで移動
if(Unit[MeNumber].GotoY<UpMax){Unit[MeNumber].GotoY=UpMax;}
//進める下限以上になったら下限値まで移動
if(Unit[MeNumber].GotoY>DownMax){Unit[MeNumber].GotoY=DownMax;}
}
//画面外へ行き過ぎないようにする
if(Unit[MeNumber].GotoX<CanGotoXMin){Unit[MeNumber].GotoX=CanGotoXMin;}
if(Unit[MeNumber].GotoY<CanGotoYMin){Unit[MeNumber].GotoY=CanGotoYMin;}
if(Unit[MeNumber].GotoZ<CanGotoZMin){Unit[MeNumber].GotoZ=CanGotoZMin;}
if(Unit[MeNumber].GotoX>CanGotoXMax){Unit[MeNumber].GotoX=CanGotoXMax;}
if(Unit[MeNumber].GotoY>CanGotoYMax){Unit[MeNumber].GotoY=CanGotoYMax;}
if(Unit[MeNumber].GotoZ>CanGotoZMax){Unit[MeNumber].GotoZ=CanGotoZMax;}
//左ボタンを押した時
if(MDF.LButton==1){//攻撃先指定・攻撃
Unit[MeNumber].AtackX=MDF.X;
Unit[MeNumber].AtackY=MDF.Y;
//進める上限以上になったら上限値まで移動
if(Unit[MeNumber].AtackY<UpMax){Unit[MeNumber].AtackY=UpMax;}
//進める下限以上になったら下限値まで移動
if(Unit[MeNumber].AtackY>DownMax){Unit[MeNumber].AtackY=DownMax;}
Unit[MeNumber].Fire=1;//攻撃
}
//左ボタンが上昇した時
if(MDF.LButton==0){//攻撃先指定・攻撃
Unit[MeNumber].Fire=0;//攻撃停止
}
}
}
//ユニット作成(構造体用の戻り値が帰る)
UnitData LoadUnitStatus(char *UnitName){
char SoundFile[FullPathMax];//音のファイルパスを入れる
UnitData RetUnit;//戻り値用変数
//戻り値ユニットのEnabledとその装備のEnabledをすべて0にする
int intI;
RetUnit.Enabled=0;
RetUnit.ScriptPointer=0;
RetUnit.TimerCounter=32767;
RetUnit.CatchUnit=32767;
RetUnit.Boss=0;//ボスフラグも消す
RetUnit.Maai=0;
strcpy(RetUnit.DeathChange,"");//死亡した時の変化もデフォルト(消える)にする
for(intI=0;intI<WeaponMax;intI++){//装備の初期化
RetUnit.WeaponEnabled[intI]=0;
}
//攻撃座標リセット
RetUnit.AtackX=0;
RetUnit.AtackY=0;
RetUnit.AtackZ=0;
//移動先座標リセット
RetUnit.X=0;
RetUnit.Y=0;
RetUnit.Z=0;
RetUnit.GotoX=0;
RetUnit.GotoY=0;
RetUnit.GotoZ=0;
//ユニットそのものの初期値を設定
RetUnit.HP=0;
RetUnit.BP=0;
RetUnit.DP=0;
RetUnit.SP=0;
//IDも中立値を入れる
RetUnit.ID=32767;
RetUnit.BeforeID=32767;
//フルパス作成
//char DebugFilePath[FullPathMax];//選別用なので使い終わったら止める
//FILE *DebugUNIT;//選別用なので使い終わったら止める
char FilePath[FullPathMax];
strcpy(FilePath,"./astudata/");
strcat(FilePath,UnitName);
strcat(FilePath,".dat");
const GetLineNum=128;//一行を取得できる数
const GetWordIndexNum=8;//仕分けして入れられる単語の数
const GetWordcharNum=32;//仕分けして入れた時の単語を収められる文字数
char GetLine[GetLineNum];//ファイルから取得した行を入れる
char GetWord[GetLineNum][GetWordIndexNum][GetWordcharNum];//単語が入る
int intA;//汎用変数
int intB=0;//汎用変数
int intC=0;//汎用変数
int intF=0;//汎用変数
FILE *UNIT;
UNIT=fopen(FilePath,"r");//ファイルを開く
//ファイルを開くのに失敗した時はログを作ってから死ぬ
if(UNIT==0x0){
ERR=fopen("./ErrorLog.log","a");
fprintf(ERR,"FileNotFound in LoadUnitStatus:");
fprintf(ERR,FilePath);
fprintf(ERR,"\n");
fclose(ERR);
}
while(fgets(GetLine,GetLineNum,UNIT)!=NULL){//終端に達するまで繰り返し
for(intA=0;intA<GetLineNum;intA++){//GetLineの単語をGetWordに仕分け
if(GetLine[0]=='/'){break;}//コメントだった場合はforループを抜ける
if(GetLine[0]=='\n'){break;}//何も文字が入っていなかった行の場合もforループを抜ける
switch(GetLine[intA]){
case '\n'://文字列終端に到達
GetWord[intF][intC][intB]='\0';//文字列終端を付ける
intB=0;//文字列ポインタを戻す
intC=0;//配列ポインタを戻す
intF++;//次の配列へ
intA=GetLineNum;
break;
//単語の区切りへ到達
case '=':
case ',':
GetWord[intF][intC][intB]='\0';//文字列終端を付ける
intB=0;//文字列ポインタを戻す
intC++;//次の配列へ
break;
default:
GetWord[intF][intC][intB]=GetLine[intA];//文字列をつなぐ
intB++;//文字列ポインタを加算
break;
}
}
}
fclose(UNIT);
int intD;
int intE;
int intG=0;
for(intD=0;intD<GetLineNum;intD++){//ファイルの内容を元にステータスやスクリプトの設定をする
if(false){//インデント用ダミー
}else if(strcmp(GetWord[intD][0],"position")==0){//現在位置(と移動先も同じ位置にする)
RetUnit.X=float(atof(GetWord[intD][1]));
RetUnit.Y=float(atof(GetWord[intD][2]));
RetUnit.Z=float(atof(GetWord[intD][3]));
RetUnit.GotoX=atoi(GetWord[intD][1]);
RetUnit.GotoY=atoi(GetWord[intD][2]);
RetUnit.GotoZ=atoi(GetWord[intD][3]);
}else if(strcmp(GetWord[intD][0],"sound")==0){//音
if(!SoundSkip){
if(WaveFileCounter<WaveFileMax){//一回のループで再生する音はWaveFileMaxの数までにする
if(strcmp(WaveFile[WaveFileCounter],"")!=0){
//上書きする番号のファイルを閉じる
strcpy(SoundFile,"close ");
strcat(SoundFile,WaveFileAlias[WaveFileCounter]);
mciSendString(SoundFile, NULL, 0, 0);//音楽を閉じる
}
//読み込むファイル名を登録する
strcpy(WaveFile[WaveFileCounter],GetWord[intD][1]);
//ファイルを開く
strcpy(SoundFile,"open \"./astudata/");
strcat(SoundFile,GetWord[intD][1]);
strcat(SoundFile,".wav\" Alias ");
strcat(SoundFile,WaveFileAlias[WaveFileCounter]);
mciSendString(SoundFile, NULL, 0, 0);
strcpy(SoundFile,"play ");
strcat(SoundFile,WaveFileAlias[WaveFileCounter]);
strcat(SoundFile," notify");
mciSendString(SoundFile, NULL, 0, 0);
//インデックスを加算
WaveFileCounter++;
if(WaveFileCounter==WaveFileMax){WaveFileCounter=0;}
}
}
}else if(strcmp(GetWord[intD][0],"music")==0){//音楽
mciSendString("close MUSICFILE", NULL, 0, 0);//音楽を閉じる
//パス作成
strcpy(SoundFile,"open \"./astudata/");
strcat(SoundFile,GetWord[intD][1]);
strcat(SoundFile,"\" alias MUSICFILE");
mciSendString(SoundFile, NULL, 0, 0);
if(!MusicSkip){
mciSendString("play MUSICFILE notify", NULL, 0, 0);
}
}else if(strcmp(GetWord[intD][0],"vector")==0){//方向
RetUnit.XVector=float(atof(GetWord[intD][1]));
RetUnit.YVector=float(atof(GetWord[intD][2]));
RetUnit.ZVector=float(atof(GetWord[intD][3]));
}else if(strcmp(GetWord[intD][0],"wait")==0){//重量
RetUnit.Wait=atol(GetWord[intD][1]);
}else if(strcmp(GetWord[intD][0],"hp")==0){//耐久力と最大HP
RetUnit.HP=atoi(GetWord[intD][1]);
RetUnit.HPMAX=atoi(GetWord[intD][1]);
}else if(strcmp(GetWord[intD][0],"bp")==0){//攻撃力
RetUnit.BP=atoi(GetWord[intD][1]);
}else if(strcmp(GetWord[intD][0],"dp")==0){//防御力
RetUnit.DP=atoi(GetWord[intD][1]);
}else if(strcmp(GetWord[intD][0],"sp")==0){//動きの早さ
RetUnit.SP=atoi(GetWord[intD][1]);
}else if(strcmp(GetWord[intD][0],"type")==0){//ユニットの種類
RetUnit.Type=atoi(GetWord[intD][1]);
}else if(strcmp(GetWord[intD][0],"maai")==0){//間合い
RetUnit.Maai=atoi(GetWord[intD][1]);
}else if(strcmp(GetWord[intD][0],"weapon")==0){//武器
intE=atoi(GetWord[intD][1]);//武器番号を格納
strcpy(RetUnit.WeaponName[intE],GetWord[intD][2]);
RetUnit.WeaponShotNum[intE]=atoi(GetWord[intD][3]);
RetUnit.WeaponShotBlanc[intE]=atoi(GetWord[intD][4]);
RetUnit.WeaponEnabled[intE]=1;
RetUnit.WeaponSoutenCounter[intE]=0;
}else if(strcmp(GetWord[intD][0],"deathchange")==0){//死亡後に変化するもの
strcpy(RetUnit.DeathChange,GetWord[intD][1]);
}else if(strcmp(GetWord[intD][0],"bmpnumber")==0){//使用ビットマップの番号
RetUnit.BmpNumber=atoi(GetWord[intD][1]);
}else if(strcmp(GetWord[intD][0],"bmpnumberm")==0){//使用ビットマップマスクの番号
RetUnit.BmpNumberm=atoi(GetWord[intD][1]);
}else if(strcmp(GetWord[intD][0],"bmprect")==0){//使用ビットマップの範囲
RetUnit.BmpX=atoi(GetWord[intD][1]);
RetUnit.BmpY=atoi(GetWord[intD][2]);
RetUnit.BmpWidth=atoi(GetWord[intD][3]);
RetUnit.BmpHeight=atoi(GetWord[intD][4]);
}else if(strcmp(GetWord[intD][0],"bmpofset")==0){//使用ビットマップの貼り付け位置補正
RetUnit.BmpOfsetX=atoi(GetWord[intD][1]);
RetUnit.BmpOfsetY=atoi(GetWord[intD][2]);
}else if(strcmp(GetWord[intD][0],"size")==0){//大きさ
RetUnit.Size=atoi(GetWord[intD][1]);
}else if(strcmp(GetWord[intD][0],"s_gotox")==0){//移動先指定X
strcpy(RetUnit.SMethod[intG],"s_gotox");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_gotoy")==0){//移動先指定Y
strcpy(RetUnit.SMethod[intG],"s_gotoy");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_gotoz")==0){//移動先指定Z
strcpy(RetUnit.SMethod[intG],"s_gotoz");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_gotou")==0){//移動先指定U
strcpy(RetUnit.SMethod[intG],"s_gotou");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_gotov")==0){//移動先指定V
strcpy(RetUnit.SMethod[intG],"s_gotov");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_gotow")==0){//移動先指定W
strcpy(RetUnit.SMethod[intG],"s_gotow");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_atackx")==0){//攻撃目標指定X
strcpy(RetUnit.SMethod[intG],"s_atackx");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_atacky")==0){//攻撃目標指定Y
strcpy(RetUnit.SMethod[intG],"s_atacky");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_atackz")==0){//攻撃目標指定Z
strcpy(RetUnit.SMethod[intG],"s_atackz");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_atacku")==0){//攻撃目標指定U
strcpy(RetUnit.SMethod[intG],"s_atacku");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_atackv")==0){//攻撃目標指定V
strcpy(RetUnit.SMethod[intG],"s_atackv");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_atackw")==0){//攻撃目標指定W
strcpy(RetUnit.SMethod[intG],"s_atackw");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_find")==0){//攻撃目標検索
strcpy(RetUnit.SMethod[intG],"s_find");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_atack")==0){//攻撃開始
strcpy(RetUnit.SMethod[intG],"s_atack");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_atackstop")==0){//攻撃停止
strcpy(RetUnit.SMethod[intG],"s_atackstop");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_wait")==0){//待機
strcpy(RetUnit.SMethod[intG],"s_wait");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_goto")==0){//指定行へジャンプ
strcpy(RetUnit.SMethod[intG],"s_goto");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_bmpshiftx")==0){//描画領域移動
strcpy(RetUnit.SMethod[intG],"s_bmpshiftx");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_bmpshifty")==0){//描画領域移動
strcpy(RetUnit.SMethod[intG],"s_bmpshifty");//命令を入れる
RetUnit.SData1[intG]=atoi(GetWord[intD][1]);//引数を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_end")==0){//停止
strcpy(RetUnit.SMethod[intG],"s_end");//命令を入れる
intG++;//行を進める
}else if(strcmp(GetWord[intD][0],"s_kill")==0){//自滅
strcpy(RetUnit.SMethod[intG],"s_kill");//命令を入れる
intG++;//行を進める
}
}
strcpy(RetUnit.SMethod[intG],"s_end");//念のため、スクリプトの最後の命令を必ず一番最後の行に入れておく
RetUnit.Fire=0;//攻撃停止指示を明記
RetUnit.Zyumyou=0;//寿命リセット
RetUnit.Enabled=1;//使用中フラグを入れる
return RetUnit;//設定内容を戻り値として返す
}
//当たり判定
void HitCheck(int Number){
int intA;
int intB=0;
int intC;//ダメージエフェクトとアイテム判定で使う
//衝突した時の火花表示に使う
int intD;
float fltDX;
float fltDY;
float fltDZ;
int CLength;//距離を算出する時に使う
//衝突判定時に、移動量の交換のときに使う
float XVectorTmp;
float YVectorTmp;
float ZVectorTmp;
//衝突判定時に、跳ね返る量を調整する
const float HanekaeriRatio=0.1f;
const float BJRate=100.0f;//爆風で飛び上がる量の調整
const float BJMRate=5.0f;//爆風で飛び上がる量の調整
if((Unit[Number].Enabled==1)&//稼動中であること
(Unit[Number].Type!=m_cstTypeGun)&//銃弾ではないこと
(Unit[Number].Type!=m_cstTypeCanon)&//砲弾ではないこと
(Unit[Number].Type!=m_cstTypeCrow)&//格闘戦触手ではないこと
(Unit[Number].ID!=32767)//中立値ではない
){
for(intA=0;intA<UnitMax;intA++){//対象のユニットを検索
if(
(Number!=intA)&//番号が違う
(Unit[intA].Enabled==1)&//相手も稼動中
(Unit[intA].Type==m_cstTypeExp)//爆風である
){
//距離を算出
CLength=int(sqrtf(powf(float(Unit[Number].X-Unit[intA].X),2)+powf(float(Unit[Number].Y-Unit[intA].Y),2)+powf(float(Unit[Number].Z-Unit[intA].Z),2)));
if(CLength<(Unit[Number].Size+Unit[intA].Size)/2){
if(false){//インデント用ダミー
}else if(Unit[intA].Type==m_cstTypeExp){//爆風に乗って飛ぶ(爆風のサイズに比例し、重さの二条に反比例する)
Unit[Number].ZVector+=(float(Unit[intA].Size)*BJRate)/(float(Unit[Number].Wait*Unit[Number].Wait)*BJMRate);
}
}
}else if(
(Number!=intA)&//番号が違う
(Unit[Number].ID!=Unit[intA].ID)&//IDが違う
(Unit[intA].ID!=32767)&//中立値ではない
(Unit[intA].Enabled==1)//相手も稼動中
){
//距離を算出
CLength=int(sqrtf(powf(float(Unit[Number].X-Unit[intA].X),2)+powf(float(Unit[Number].Y-Unit[intA].Y),2)+powf(float(Unit[Number].Z-Unit[intA].Z),2)));
if(CLength<(Unit[Number].Size+Unit[intA].Size)/2){
if(false){//インデント用ダミー
}else if(Unit[intA].Type==m_cstTypeCrow){//格闘戦触手に引っかかった時
switch(Unit[Number].Type){
case m_cstTypePlane://航空機の場合は自動車扱いにして続きの処理を行う
Unit[Number].Type=m_cstTypeCar;
case m_cstTypeCar:
case m_cstTypeShip:
//格闘戦触手が掴んでいる対象の番号が32767ではなく、なおかつ重量が発射した物体より以下の重さの場合は引っ掛けられる
if((Unit[intA].CatchUnit!=32767)&(Unit[Number].Wait<=Unit[Unit[intA].CatchUnit].Wait)){
Unit[Number].ScriptPointer=0;//スクリプトをリセット
strcpy(Unit[Number].SMethod[0],"s_end");//動きを止める
Unit[Unit[intA].CatchUnit].WeaponSoutenCounter[0]/=10;//兵装番号0のチャージ時間を十分の一にする(できるなら触手のチャージ時間を減らしてすぐ投げられるようにしたい)
Unit[Number].CatchUnit=Unit[intA].CatchUnit;//どのユニットを引っ掛けているかを対象に設定
Unit[Unit[Number].CatchUnit].CatchUnit=Number;//引っ掛けているユニットに対象のユニット番号を設定
Unit[intA].Enabled=0;//触手は消す
Unit[Number].ID=Unit[intA].ID;//敵にぶつけて倒せるようにする
//スクリプトをコピー
while(strcmp(Unit[intA].SMethod[intB],"s_kill")!=0){
strcpy(Unit[Number].SMethod[intB],Unit[intA].SMethod[intB]);
Unit[Number].SData1[intB]=Unit[intA].SData1[intB];
Unit[Number].SData2[intB]=Unit[intA].SData2[intB];
intB++;
}
//最後はそのまま飛んでいく設定
strcpy(Unit[Number].SMethod[intB+0],"s_gotou");
Unit[Number].SData1[intB+0]=0;
strcpy(Unit[Number].SMethod[intB+1],"s_gotov");
Unit[Number].SData1[intB+1]=0;
strcpy(Unit[Number].SMethod[intB+2],"s_gotow");
Unit[Number].SData1[intB+2]=0;
//
strcpy(Unit[Number].SMethod[intB+3],"s_goto");
Unit[Number].SData1[intB+3]=intB;
//スクリプトのポインタも同じように設定
Unit[Number].ScriptPointer=Unit[intA].ScriptPointer;
if(Unit[Number].SP<Unit[intA].SP){Unit[Number].SP=Unit[intA].SP;}
}else{//引っ掛けられない場合はダメージを与える
Unit[Number].HP-=Unit[intA].BP;//ダメージ
intD=FindNullNumber();
Unit[intD]=LoadUnitStatus("smoke");
Unit[intD].X=Unit[Number].X;
Unit[intD].Y=Unit[Number].Y;
Unit[intD].Z=Unit[Number].Z;
}
break;
}
}else if(Unit[intA].Type==m_cstTypeChageHP){//HP補充
}else if(Unit[intA].Type==m_cstTypeSet1000mm){//1000mm装備
}else if(Unit[intA].Type==m_cstTypeSetLaser){//レーザー装備
}else if(Unit[intA].Type==m_cstTypeSetCrow){//格闘戦触手装備
}else{//通常
//煙を出し、衝突した事が分かるようにする
fltDX=Unit[intA].X-Unit[Number].X;
fltDY=Unit[intA].Y-Unit[Number].Y;
fltDZ=Unit[intA].Z-Unit[Number].Z;
fltDX/=(Unit[intA].Size+Unit[Number].Size)*Unit[Number].Size;
fltDY/=(Unit[intA].Size+Unit[Number].Size)*Unit[Number].Size;
fltDZ/=(Unit[intA].Size+Unit[Number].Size)*Unit[Number].Size;
intD=FindNullNumber();
Unit[intD]=LoadUnitStatus("ssmoke");
Unit[intD].X=Unit[Number].X+fltDX;
Unit[intD].Y=Unit[Number].Y+fltDY;
Unit[intD].Z=Unit[Number].Z+fltDZ;
//書き換えてしまう前に移動方向を記録
XVectorTmp=Unit[Number].XVector;
YVectorTmp=Unit[Number].YVector;
ZVectorTmp=Unit[Number].ZVector;
Unit[Number].HP-=int(float((Unit[intA].BP))*(float(100-Unit[Number].DP)/100.0f));
Unit[Number].XVector+=((Unit[intA].XVector*Unit[intA].Wait)/Unit[Number].Wait)*HanekaeriRatio;
Unit[Number].YVector+=((Unit[intA].YVector*Unit[intA].Wait)/Unit[Number].Wait)*HanekaeriRatio;
Unit[Number].ZVector+=((Unit[intA].ZVector*Unit[intA].Wait)/Unit[Number].Wait)*HanekaeriRatio;
Unit[intA].HP-=int(float((Unit[Number].BP))*(float(100-Unit[intA].DP)/100.0f));
Unit[intA].XVector+=((XVectorTmp*Unit[Number].Wait)/Unit[intA].Wait)*HanekaeriRatio;
Unit[intA].YVector+=((YVectorTmp*Unit[Number].Wait)/Unit[intA].Wait)*HanekaeriRatio;
Unit[intA].ZVector+=((ZVectorTmp*Unit[Number].Wait)/Unit[intA].Wait)*HanekaeriRatio;
//鉄砲玉がぶつかった場合は大砲と同じく落下するようにする
if(Unit[intA].Type==m_cstTypeGun){Unit[intA].Type=m_cstTypeCanon;}
//ダメージを与えたものが鉄砲もしくは火砲で、なおかつ死亡判定になる場合、エフェクトを変える
if(((Unit[intA].Type==m_cstTypeGun)|(Unit[intA].Type==m_cstTypeCanon))&(Unit[intA].HP<=0)){
//破壊力によって爆発エフェクトを変える
if(Unit[intA].BP<10){
//何も表示しない
strcpy(Unit[intA].DeathChange,"");
}else if((100<=Unit[intA].BP)&(Unit[intA].BP<100)){//破壊力100〜1000
//ごく小さい爆発にする
strcpy(Unit[intA].DeathChange,"ssexp");
}else if((1000<=Unit[intA].BP)&(Unit[intA].BP<500)){//破壊力1000〜5000
//小さい爆発にする
strcpy(Unit[intA].DeathChange,"sexp");
}else if((5000<=Unit[intA].BP)&(Unit[intA].BP<1000)){//破壊力5000〜10000
//中規模の爆発にする
strcpy(Unit[intA].DeathChange,"exp");
}else if(1000<=Unit[intA].BP){//破壊力10000以上
//大爆発にする
strcpy(Unit[intA].DeathChange,"lexp");
}
}
}
}
}
}
}
//アイテム判定
if((Number==MeNumber)&(Unit[MeNumber].Enabled==1)){//自機が稼動中
for(intC=0;intC<UnitMax;intC++){
if((Number!=intC)&(Unit[intC].Enabled==1)){//相手も稼動中
CLength=int(sqrtf(powf(float(Unit[Number].X-Unit[intC].X),2)+powf(float(Unit[Number].Y-Unit[intC].Y),2)+powf(float(Unit[Number].Z-Unit[intC].Z),2)));
if(CLength<(Unit[Number].Size+Unit[intC].Size)/2){
if(false){
}else if(Unit[intC].Type==m_cstTypeChageHP){//HP補充
if(Number==MeNumber){//自機にぶつかったとき
if(!SoundSkip){PlaySound("./astudata/pw.wav",NULL,SND_ASYNC);}
Unit[MeNumber].HP+=3000;
if(Unit[MeNumber].HP>Unit[MeNumber].HPMAX){Unit[MeNumber].HP=Unit[MeNumber].HPMAX;}
Unit[intC].Enabled=0;
}
}
}
}
}
}
}
//マップを実行
void RunMap(){
BITMAP SurfaceData;
char ImagePath[96];//イメージのパス
char ImagePathm[96];//イメージマスクのパス
int NewNumber;
//汎用変数:繰り返し用
int intA;
int intB;
if(false){//インデント用ダミー
}else if(strcmp(MapGetWord[MapPointer][0],"back")==0){//背景設定
intA=atoi(MapGetWord[MapPointer][1]);//番号を数字に変換
//イメージ用パス作成
strcpy(ImagePath,"./astudata/");
strcat(ImagePath,MapGetWord[MapPointer][2]);
strcat(ImagePath,".bmp");
//イメージマスク用パス作成
strcpy(ImagePathm,"./astudata/");
strcat(ImagePathm,MapGetWord[MapPointer][2]);
strcat(ImagePathm,"m.bmp");
BS[intA].Surface=(HBITMAP) LoadImage(NULL,ImagePath,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
BS[intA].Surfacem=(HBITMAP) LoadImage(NULL,ImagePathm,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
BS[intA].X=0;//X初期化
BS[intA].Y=0;//Y初期化
BS[intA].XVector=atoi(MapGetWord[MapPointer][3]);//X方向のスクロールを設定
BS[intA].YVector=atoi(MapGetWord[MapPointer][4]);//Y方向のスクロールを設定
GetObject( BS[intA].Surface, sizeof(BITMAP), &SurfaceData );//幅と高さを取得する作業
BS[intA].Width=SurfaceData.bmWidth;
BS[intA].height=SurfaceData.bmHeight;
BS[intA].Enabled=1;
MapPointer++;//行番号を進める
}else if(strcmp(MapGetWord[MapPointer][0],"word")==0){//文章表示
RECT rt;
rt.left=atoi(MapGetWord[MapPointer][1]);
rt.top=atoi(MapGetWord[MapPointer][2]);
rt.right=::SurfaceData[m_cstSurfMoziSyori].bmWidth;
rt.bottom=::SurfaceData[m_cstSurfMoziSyori].bmHeight;
DrawText(SurfaceHDC[m_cstSurfMoziSyori],MapGetWord[MapPointer][3],strlen(MapGetWord[MapPointer][3]),&rt,DT_LEFT);
MapPointer++;//行番号を進める
}else if(strcmp(MapGetWord[MapPointer][0],"wordelase")==0){//文章消去
BitBlt(SurfaceHDC[m_cstSurfMoziSyori],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfWhiteElase],0,0,SRCCOPY);
MapPointer++;//行番号を進める
}else if(strcmp(MapGetWord[MapPointer][0],"drawbmp")==0){//追加描画
Kun2DrawFlag=1;
Kun2DrawX=atoi(MapGetWord[MapPointer][1]);
Kun2DrawY=atoi(MapGetWord[MapPointer][2]);
Kun2SrcX=atoi(MapGetWord[MapPointer][3]);
Kun2SrcY=atoi(MapGetWord[MapPointer][4]);
Kun2SrcWidth=atoi(MapGetWord[MapPointer][5])-Kun2SrcX;
Kun2SrcHeight=atoi(MapGetWord[MapPointer][6])-Kun2SrcY;
//まずマスク板に描画
BitBlt(SurfaceHDC[m_cstSurfFreeGraphicm],Kun2DrawX,Kun2DrawY,Kun2SrcWidth,Kun2SrcHeight,SurfaceHDC[m_cstSurfPlayorm],Kun2SrcX,Kun2SrcY,SRCAND);
//次にマスクではないほうの板にスプライト描画
BitBlt(SurfaceHDC[m_cstSurfFreeGraphic],Kun2DrawX,Kun2DrawY,Kun2SrcWidth,Kun2SrcHeight,SurfaceHDC[m_cstSurfPlayorm],Kun2SrcX,Kun2SrcY,SRCAND);
BitBlt(SurfaceHDC[m_cstSurfFreeGraphic],Kun2DrawX,Kun2DrawY,Kun2SrcWidth,Kun2SrcHeight,SurfaceHDC[m_cstSurfPlayor],Kun2SrcX,Kun2SrcY,SRCPAINT);
MapPointer++;//行番号を進める
}else if(strcmp(MapGetWord[MapPointer][0],"nodrawbmp")==0){//追加描画停止
//画像消去
BitBlt(SurfaceHDC[m_cstSurfFreeGraphicm],0,0,640,480,SurfaceHDC[m_cstSurfWhiteElase],0,0,SRCCOPY);
BitBlt(SurfaceHDC[m_cstSurfFreeGraphic],0,0,640,480,SurfaceHDC[m_cstSurfElase],0,0,SRCCOPY);
Kun2DrawFlag=0;
MapPointer++;//行番号を進める
}else if(strcmp(MapGetWord[MapPointer][0],"upmax")==0){//上へ進める範囲
UpMax=atoi(MapGetWord[MapPointer][1]);
MapPointer++;//行番号を進める
}else if(strcmp(MapGetWord[MapPointer][0],"downmax")==0){//下へ進める範囲
DownMax=atoi(MapGetWord[MapPointer][1]);
MapPointer++;//行番号を進める
}else if(strcmp(MapGetWord[MapPointer][0],"wait")==0){//待つ
intA=atoi(MapGetWord[MapPointer][1])-1;//値を1減らす
itoa(intA,MapGetWord[MapPointer][1],10);//再び値を格納
if(intA<0){//引数の数字が0になった時
MapPointer++;//行番号を進める
}
}else if(strcmp(MapGetWord[MapPointer][0],"alldeath")==0){//敵全滅まで待つ
intB=0;
for(intA=0;intA<UnitMax;intA++){
if((Unit[intA].Enabled==1)&(Unit[intA].ID!=0)&(Unit[intA].ID!=32767)){//自機・中立と同じではないIDで稼働中のユニットがいる場合はintBを加算
intB++;
}
}
if(intB==0){//intBが0ならば
MapPointer++;//行番号を進める
}
}else if(strcmp(MapGetWord[MapPointer][0],"enemy")==0){//敵
NewNumber=FindNullNumber();//空きのある番号を探す
Unit[NewNumber]=LoadUnitStatus(MapGetWord[MapPointer][1]);//敵読み込み
//位置設定
Unit[NewNumber].ID=atoi(MapGetWord[MapPointer][2]);
Unit[NewNumber].BeforeID=atoi(MapGetWord[MapPointer][2]);
Unit[NewNumber].X=float(atof(MapGetWord[MapPointer][3]));
Unit[NewNumber].Y=float(atof(MapGetWord[MapPointer][4]));
Unit[NewNumber].Z=float(atof(MapGetWord[MapPointer][5]));
if(Unit[NewNumber].ID!=Unit[MeNumber].ID){
switch(Nanido){//難易度で性能を調整
case 0://Beginner
Unit[NewNumber].WeaponShotBlanc[0]=int(float(Unit[NewNumber].WeaponShotBlanc[0])*4.0f);
Unit[NewNumber].WeaponShotBlanc[1]=int(float(Unit[NewNumber].WeaponShotBlanc[1])*4.0f);
Unit[NewNumber].WeaponShotBlanc[2]=int(float(Unit[NewNumber].WeaponShotBlanc[2])*4.0f);
Unit[NewNumber].WeaponShotBlanc[3]=int(float(Unit[NewNumber].WeaponShotBlanc[3])*4.0f);
Unit[NewNumber].HP=int(float(Unit[NewNumber].HP)/2.0f);
Unit[NewNumber].BP=int(float(Unit[NewNumber].BP)/2.0f);
Unit[NewNumber].SP=int(float(Unit[NewNumber].SP)/2.0f);
break;
case 1://Easy
Unit[NewNumber].WeaponShotBlanc[0]=int(float(Unit[NewNumber].WeaponShotBlanc[0])*3.0f);
Unit[NewNumber].WeaponShotBlanc[1]=int(float(Unit[NewNumber].WeaponShotBlanc[1])*3.0f);
Unit[NewNumber].WeaponShotBlanc[2]=int(float(Unit[NewNumber].WeaponShotBlanc[2])*3.0f);
Unit[NewNumber].WeaponShotBlanc[3]=int(float(Unit[NewNumber].WeaponShotBlanc[3])*3.0f);
Unit[NewNumber].HP=int(float(Unit[NewNumber].HP)/1.5f);
Unit[NewNumber].BP=int(float(Unit[NewNumber].BP)/1.5f);
Unit[NewNumber].SP=int(float(Unit[NewNumber].SP)/1.5f);
break;
case 2://Normal
Unit[NewNumber].WeaponShotBlanc[0]=int(float(Unit[NewNumber].WeaponShotBlanc[0])*2.0f);
Unit[NewNumber].WeaponShotBlanc[1]=int(float(Unit[NewNumber].WeaponShotBlanc[1])*2.0f);
Unit[NewNumber].WeaponShotBlanc[2]=int(float(Unit[NewNumber].WeaponShotBlanc[2])*2.0f);
Unit[NewNumber].WeaponShotBlanc[3]=int(float(Unit[NewNumber].WeaponShotBlanc[3])*2.0f);
break;
case 3://Hard
//何もしない
break;
case 4://SuperHard
Unit[NewNumber].WeaponShotBlanc[0]=int(float(Unit[NewNumber].WeaponShotBlanc[0])*0.5f);
Unit[NewNumber].WeaponShotBlanc[1]=int(float(Unit[NewNumber].WeaponShotBlanc[1])*0.5f);
Unit[NewNumber].WeaponShotBlanc[2]=int(float(Unit[NewNumber].WeaponShotBlanc[2])*0.5f);
Unit[NewNumber].WeaponShotBlanc[3]=int(float(Unit[NewNumber].WeaponShotBlanc[3])*0.5f);
Unit[NewNumber].HP=int(float(Unit[NewNumber].HP)/0.5f);
Unit[NewNumber].BP=int(float(Unit[NewNumber].BP)/0.5f);
break;
}
}
MapPointer++;//行番号を進める
}else if(strcmp(MapGetWord[MapPointer][0],"boss")==0){//ボス
Unit[BossNumber]=LoadUnitStatus(MapGetWord[MapPointer][1]);//敵読み込み
//位置設定
Unit[BossNumber].ID=atoi(MapGetWord[MapPointer][2]);
Unit[BossNumber].BeforeID=atoi(MapGetWord[MapPointer][2]);
Unit[BossNumber].X=float(atof(MapGetWord[MapPointer][3]));
Unit[BossNumber].Y=float(atof(MapGetWord[MapPointer][4]));
Unit[BossNumber].Z=float(atof(MapGetWord[MapPointer][5]));
Unit[BossNumber].Boss=1;//ボスの設定
switch(Nanido){//難易度で性能を調整
case 0://Beginner
Unit[BossNumber].WeaponShotBlanc[0]=int(float(Unit[BossNumber].WeaponShotBlanc[0])*4.0f);
Unit[BossNumber].WeaponShotBlanc[1]=int(float(Unit[BossNumber].WeaponShotBlanc[1])*4.0f);
Unit[BossNumber].WeaponShotBlanc[2]=int(float(Unit[BossNumber].WeaponShotBlanc[2])*4.0f);
Unit[BossNumber].WeaponShotBlanc[3]=int(float(Unit[BossNumber].WeaponShotBlanc[3])*4.0f);
Unit[BossNumber].HP=int(float(Unit[BossNumber].HP)/2.0f);
Unit[BossNumber].BP=int(float(Unit[BossNumber].BP)/2.0f);
Unit[BossNumber].SP=int(float(Unit[BossNumber].SP)/2.0f);
break;
case 1://Easy
Unit[BossNumber].WeaponShotBlanc[0]=int(float(Unit[BossNumber].WeaponShotBlanc[0])*3.0f);
Unit[BossNumber].WeaponShotBlanc[1]=int(float(Unit[BossNumber].WeaponShotBlanc[1])*3.0f);
Unit[BossNumber].WeaponShotBlanc[2]=int(float(Unit[BossNumber].WeaponShotBlanc[2])*3.0f);
Unit[BossNumber].WeaponShotBlanc[3]=int(float(Unit[BossNumber].WeaponShotBlanc[3])*3.0f);
Unit[BossNumber].HP=int(float(Unit[BossNumber].HP)/1.5f);
Unit[BossNumber].BP=int(float(Unit[BossNumber].BP)/1.5f);
Unit[BossNumber].SP=int(float(Unit[BossNumber].SP)/1.5f);
break;
case 2://Normal
Unit[BossNumber].WeaponShotBlanc[0]=int(float(Unit[BossNumber].WeaponShotBlanc[0])*2.0f);
Unit[BossNumber].WeaponShotBlanc[1]=int(float(Unit[BossNumber].WeaponShotBlanc[1])*2.0f);
Unit[BossNumber].WeaponShotBlanc[2]=int(float(Unit[BossNumber].WeaponShotBlanc[2])*2.0f);
Unit[BossNumber].WeaponShotBlanc[3]=int(float(Unit[BossNumber].WeaponShotBlanc[3])*2.0f);
break;
case 3://Hard
//何もしない
break;
case 4://SuperHard
Unit[BossNumber].WeaponShotBlanc[0]=int(float(Unit[BossNumber].WeaponShotBlanc[0])*0.5f);
Unit[BossNumber].WeaponShotBlanc[1]=int(float(Unit[BossNumber].WeaponShotBlanc[1])*0.5f);
Unit[BossNumber].WeaponShotBlanc[2]=int(float(Unit[BossNumber].WeaponShotBlanc[2])*0.5f);
Unit[BossNumber].WeaponShotBlanc[3]=int(float(Unit[BossNumber].WeaponShotBlanc[3])*0.5f);
Unit[BossNumber].HP=int(float(Unit[BossNumber].HP)/0.5f);
Unit[BossNumber].BP=int(float(Unit[BossNumber].BP)/0.5f);
break;
}
MapPointer++;//行番号を進める
}else if(strcmp(MapGetWord[MapPointer][0],"middleboss")==0){//中ボス
Unit[BossNumber]=LoadUnitStatus(MapGetWord[MapPointer][1]);//敵読み込み
//位置設定
Unit[BossNumber].ID=atoi(MapGetWord[MapPointer][2]);
Unit[BossNumber].BeforeID=atoi(MapGetWord[MapPointer][2]);
Unit[BossNumber].X=float(atof(MapGetWord[MapPointer][3]));
Unit[BossNumber].Y=float(atof(MapGetWord[MapPointer][4]));
Unit[BossNumber].Z=float(atof(MapGetWord[MapPointer][5]));
Unit[BossNumber].Boss=2;//中ボスの設定
switch(Nanido){//難易度で性能を調整
case 0://Beginner
Unit[BossNumber].WeaponShotBlanc[0]=int(float(Unit[BossNumber].WeaponShotBlanc[0])*4.0f);
Unit[BossNumber].WeaponShotBlanc[1]=int(float(Unit[BossNumber].WeaponShotBlanc[1])*4.0f);
Unit[BossNumber].WeaponShotBlanc[2]=int(float(Unit[BossNumber].WeaponShotBlanc[2])*4.0f);
Unit[BossNumber].WeaponShotBlanc[3]=int(float(Unit[BossNumber].WeaponShotBlanc[3])*4.0f);
Unit[BossNumber].HP=int(float(Unit[BossNumber].HP)/2.0f);
Unit[BossNumber].BP=int(float(Unit[BossNumber].BP)/2.0f);
Unit[BossNumber].SP=int(float(Unit[BossNumber].SP)/2.0f);
break;
case 1://Easy
Unit[BossNumber].WeaponShotBlanc[0]=int(float(Unit[BossNumber].WeaponShotBlanc[0])*3.0f);
Unit[BossNumber].WeaponShotBlanc[1]=int(float(Unit[BossNumber].WeaponShotBlanc[1])*3.0f);
Unit[BossNumber].WeaponShotBlanc[2]=int(float(Unit[BossNumber].WeaponShotBlanc[2])*3.0f);
Unit[BossNumber].WeaponShotBlanc[3]=int(float(Unit[BossNumber].WeaponShotBlanc[3])*3.0f);
Unit[BossNumber].HP=int(float(Unit[BossNumber].HP)/1.5f);
Unit[BossNumber].BP=int(float(Unit[BossNumber].BP)/1.5f);
Unit[BossNumber].SP=int(float(Unit[BossNumber].SP)/1.5f);
break;
case 2://Normal
Unit[BossNumber].WeaponShotBlanc[0]=int(float(Unit[BossNumber].WeaponShotBlanc[0])*2.0f);
Unit[BossNumber].WeaponShotBlanc[1]=int(float(Unit[BossNumber].WeaponShotBlanc[1])*2.0f);
Unit[BossNumber].WeaponShotBlanc[2]=int(float(Unit[BossNumber].WeaponShotBlanc[2])*2.0f);
Unit[BossNumber].WeaponShotBlanc[3]=int(float(Unit[BossNumber].WeaponShotBlanc[3])*2.0f);
break;
case 3://Hard
//何もしない
break;
case 4://SuperHard
Unit[BossNumber].WeaponShotBlanc[0]=int(float(Unit[BossNumber].WeaponShotBlanc[0])*0.5f);
Unit[BossNumber].WeaponShotBlanc[1]=int(float(Unit[BossNumber].WeaponShotBlanc[1])*0.5f);
Unit[BossNumber].WeaponShotBlanc[2]=int(float(Unit[BossNumber].WeaponShotBlanc[2])*0.5f);
Unit[BossNumber].WeaponShotBlanc[3]=int(float(Unit[BossNumber].WeaponShotBlanc[3])*0.5f);
Unit[BossNumber].HP=int(float(Unit[BossNumber].HP)/0.5f);
Unit[BossNumber].BP=int(float(Unit[BossNumber].BP)/0.5f);
break;
}
MapPointer++;//行番号を進める
}else if(strcmp(MapGetWord[MapPointer][0],"end")==0){//ゲーム終端到達
//ボスが倒れるまで何もしない
}else{//読み込むべき文字がないとき
MapPointer++;//行番号を進める
}
}
//最寄の攻撃目標検索
int FindTarget(int Number){
int intA;
int L=0;
int ML=32767;
int MN=Number;
for(intA=0;intA<UnitMax;intA++){
//目標となりうるユニットである事・敵判定である事・間合いを画面内で取れる事・目標が稼働中であること
if(
((Unit[intA].Type==m_cstTypeCar)|(Unit[intA].Type==m_cstTypeShip)|(Unit[intA].Type==m_cstTypePlane))&
(Unit[Number].ID!=Unit[intA].ID)&
(Unit[Number].Maai<Unit[intA].X)&
(Unit[intA].Enabled==1))
{
L=int(sqrt(pow(Unit[Number].X-Unit[intA].X,2)+pow(Unit[Number].Y-Unit[intA].Y,2)+pow(Unit[Number].Z-Unit[intA].Z,2)));
if(L<ML){
ML=L;
MN=intA;
}
}
}
return MN;
}
//ユニット移動
void UnitMove(int Number){
//抵抗値の設定
const float RedistanceRaito=0.90f;
int intB;
if(Unit[Number].Enabled==1){//稼動していること
static intA=32767;
//スクリプト実行
if(false){//インデント用ダミー
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_gotox")==0){
//行き先X
Unit[Number].GotoX=Unit[Number].SData1[Unit[Number].ScriptPointer];
if(Unit[Number].GotoX==0){//0が指定されていたら自機へ
Unit[Number].GotoX=int(Unit[MeNumber].X);
}else if(Unit[Number].GotoX==32767){//32767が指定されていたら攻撃目標へ
Unit[Number].GotoX=int(Unit[MeNumber].AtackX);
}
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_gotoy")==0){
//行き先Y
Unit[Number].GotoY=Unit[Number].SData1[Unit[Number].ScriptPointer];
if(Unit[Number].GotoY==0){//0が指定されていたら自機へ
Unit[Number].GotoY=int(Unit[MeNumber].Y);
}else if(Unit[Number].GotoY==32767){//32767が指定されていたら攻撃目標へ
Unit[Number].GotoY=int(Unit[MeNumber].AtackY);
}
if(Unit[Number].Type!=m_cstTypePlane){//特定の物体を除いて、
//進める上限以上になったら上限値まで移動
if(Unit[Number].GotoY<UpMax){Unit[Number].GotoY=UpMax;}
//進める下限以下になったら下限値まで移動
if(Unit[Number].GotoY>DownMax){Unit[Number].GotoY=DownMax;}
}
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_gotoz")==0){
//行き先Z
Unit[Number].GotoZ=Unit[Number].SData1[Unit[Number].ScriptPointer];
if(Unit[Number].GotoZ==0){//0が指定されていたら自機へ
Unit[Number].GotoZ=int(Unit[MeNumber].Z);
}else if(Unit[Number].GotoZ==32767){//32767が指定されていたら攻撃目標へ
Unit[Number].GotoZ=int(Unit[MeNumber].AtackZ);
}
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_gotou")==0){
//行き先U
if(Unit[Number].SData1[Unit[Number].ScriptPointer]!=0){
Unit[Number].GotoX+=Unit[Number].SData1[Unit[Number].ScriptPointer];
}else{//0が指定されていたら進行方向を変えずに移動
Unit[Number].GotoX+=int(Unit[Number].XVector*Unit[Number].SP);
}
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_gotov")==0){
//行き先V
if(Unit[Number].SData1[Unit[Number].ScriptPointer]!=0){
Unit[Number].GotoY+=Unit[Number].SData1[Unit[Number].ScriptPointer];
}else{//0が指定されていたら進行方向を変えずに移動
Unit[Number].GotoY+=int(Unit[Number].YVector*Unit[Number].SP);
}
if(Unit[Number].Type!=m_cstTypePlane){//特定の物体を除いて、
//進める上限以上になったら上限値まで移動
if(Unit[Number].GotoY<UpMax){Unit[Number].GotoY=UpMax;}
//進める下限以下になったら下限値まで移動
if(Unit[Number].GotoY>DownMax){Unit[Number].GotoY=DownMax;}
}
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_gotow")==0){
//行き先W
if(Unit[Number].SData1[Unit[Number].ScriptPointer]!=0){
Unit[Number].GotoZ+=Unit[Number].SData1[Unit[Number].ScriptPointer];
}else{//0が指定されていたら進行方向を変えずに移動
Unit[Number].GotoZ+=int(Unit[Number].ZVector*Unit[Number].SP);
}
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_atackx")==0){
//攻撃目標X
Unit[Number].AtackX=Unit[Number].SData1[Unit[Number].ScriptPointer];
//0が指定されていたら自機へ
if(Unit[Number].AtackX==0){Unit[Number].AtackX=int(Unit[MeNumber].X);}
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_atacky")==0){
//攻撃目標Y
Unit[Number].AtackY=Unit[Number].SData1[Unit[Number].ScriptPointer];
Unit[Number].ScriptPointer++;
//0が指定されていたら自機へ
if(Unit[Number].AtackY==0){Unit[Number].AtackY=int(Unit[MeNumber].Y);}
//進める上限以上になったら上限値まで移動
if(Unit[Number].AtackY<UpMax){Unit[Number].AtackY=UpMax;}
//進める下限以下になったら下限値まで移動
if(Unit[Number].AtackY>DownMax){Unit[Number].AtackY=DownMax;}
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_atackz")==0){
//攻撃目標Z
Unit[Number].AtackZ=Unit[Number].SData1[Unit[Number].ScriptPointer];
//0が指定されていたら自機へ
if(Unit[Number].AtackZ==0){Unit[Number].AtackZ=int(Unit[MeNumber].Z);}
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_atacku")==0){
//攻撃目標U
Unit[Number].AtackX+=Unit[Number].SData1[Unit[Number].ScriptPointer];
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_atackv")==0){
//攻撃目標V
Unit[Number].AtackY+=Unit[Number].SData1[Unit[Number].ScriptPointer];
Unit[Number].ScriptPointer++;
//進める上限以上になったら上限値まで移動
if(Unit[Number].AtackY<UpMax){Unit[Number].AtackY=UpMax;}
//進める下限以下になったら下限値まで移動
if(Unit[Number].AtackY>DownMax){Unit[Number].AtackY=DownMax;}
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_atackw")==0){
//攻撃目標W
Unit[Number].AtackZ+=Unit[Number].SData1[Unit[Number].ScriptPointer];
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_find")==0){
//攻撃目標を検索して、そこへ向かって攻撃目標を定めつつその場所へ移動する
intB=FindTarget(Number);
if(intB!=Number){//目標発見
//間合いを取りつつ、目標へ移動
Unit[Number].GotoX=int(Unit[intB].X+Unit[Number].Maai );
Unit[Number].GotoY=int(Unit[intB].Y);
Unit[Number].GotoZ=int(Unit[intB].Z);
//画面外へ行き過ぎないようにする
if(Unit[Number].GotoX<CanGotoXMin){Unit[Number].GotoX=CanGotoXMin;}
if(Unit[Number].GotoY<CanGotoYMin){Unit[Number].GotoY=CanGotoYMin;}
if(Unit[Number].GotoZ<CanGotoZMin){Unit[Number].GotoZ=CanGotoZMin;}
if(Unit[Number].GotoX>CanGotoXMax){Unit[Number].GotoX=CanGotoXMax;}
if(Unit[Number].GotoY>CanGotoYMax){Unit[Number].GotoY=CanGotoYMax;}
if(Unit[Number].GotoZ>CanGotoZMax){Unit[Number].GotoZ=CanGotoZMax;}
Unit[Number].AtackX=int(Unit[intB].X);
Unit[Number].AtackY=int(Unit[intB].Y);
Unit[Number].AtackZ=int(Unit[intB].Z);
Unit[Number].Fire=1;
}else{//目標がなければ攻撃停止
Unit[Number].Fire=0;
}
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_wait")==0){
//一定時間行読み込みを待つ
//Unit[Number].TimerCounterの値が初期状態ならば待機時間を代入
if(Unit[Number].TimerCounter==32767){
Unit[Number].TimerCounter=Unit[Number].SData1[Unit[Number].ScriptPointer];
}
Unit[Number].TimerCounter--;//残り待機時間を減らす
if(Unit[Number].TimerCounter<0){
Unit[Number].TimerCounter=32767;
Unit[Number].ScriptPointer++;
}//待機時間が切れたらintAの値を初期状態に戻す
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_atack")==0){
//攻撃
Unit[Number].Fire=1;
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_atackstop")==0){
//攻撃停止
Unit[Number].Fire=0;
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_goto")==0){
//指定行へ
Unit[Number].ScriptPointer=Unit[Number].SData1[Unit[Number].ScriptPointer];
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_bmpshiftx")==0){
//描画領域移動X
Unit[Number].BmpX+=Unit[Number].SData1[Unit[Number].ScriptPointer];
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_bmpshifty")==0){
//描画領域移動X
Unit[Number].BmpY+=Unit[Number].SData1[Unit[Number].ScriptPointer];
Unit[Number].ScriptPointer++;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_kill")==0){
//自滅
Unit[Number].HP=-1;
}else if(strcmp(Unit[Number].SMethod[Unit[Number].ScriptPointer],"s_end")==0){
//処理停止
}
//中ボスとボスが画面外に出てしまうと面白くないので、画面の左側に寄ったら右へ加速する
//中ボスとボスが強制的に加速をする位置
const BossBoostX=480;//加速開始位置
const BossBoostY=320;//加速開始位置
//画面のサイズを設定(これを基準に補正する)
if((Unit[Number].Boss>0)&
((Unit[Number].Type==m_cstTypeShip)|(Unit[Number].Type==m_cstTypeCar)|(Unit[Number].Type==m_cstTypePlane))){
//画面からはみ出そうな時
/////
//左に行き過ぎの時
if((Unit[Number].X<Unit[Number].Size)){
if(Unit[Number].XVector<0){
Unit[Number].XVector=0;//強制停止
Unit[Number].GotoX=WindowWidth;//移動目標を右端へ
}
}
//強制停止しないまでも左に行き過ぎの時
if((Unit[Number].X<BossBoostX)){
Unit[Number].GotoX=WindowWidth;
}
/////
//右に行き過ぎの時
if(WindowWidth-Unit[Number].Size<Unit[Number].X){
if(0<Unit[Number].XVector){
Unit[Number].XVector=0;//強制停止
Unit[Number].GotoX=0;//移動目標を左端へ
}
Unit[Number].GotoX=0;
}
/////
//下に行き過ぎの時
if((WindowHeight-Unit[Number].Size<Unit[Number].Y)){
if(0<Unit[Number].YVector){
Unit[Number].YVector=0;//強制停止
Unit[Number].GotoY=0;//移動目標を上端へ
}
}
//強制停止しないまでも下に行き過ぎの時
if((BossBoostY<Unit[Number].Y)){
Unit[Number].GotoY=0;
}
/////
//上に行き過ぎの時
if((Unit[Number].Y<UpMax)){
if(Unit[Number].YVector<0){
Unit[Number].YVector=0;//強制停止
Unit[Number].GotoY=WindowHeight;//移動目標を下端へ
}
}
}
const float PushModeLengthX=0.0f;//繋がっている敵がこれ以上近づかないという距離
const float PushModeLengthY=0.0f;//繋がっている敵がこれ以上近づかないという距離
//動作
switch(Unit[Number].Type){//特定のタイプの場合
case m_cstTypeCar://車両
case m_cstTypeShip://艦船
//ダメージ増加により煙を発生
if(SmokeCounter==SmokeBetween){
if(Unit[Number].HP<int(float(Unit[Number].HPMAX)*0.3f)){
intB=FindNullNumber();
Unit[intB]=LoadUnitStatus("lsmoke");
Unit[intB].X=Unit[Number].X;
Unit[intB].Y=Unit[Number].Y;
Unit[intB].Z=Unit[Number].Z;
}else if(Unit[Number].HP<int(float(Unit[Number].HPMAX)*0.7f)){
intB=FindNullNumber();
Unit[intB]=LoadUnitStatus("smoke");
Unit[intB].X=Unit[Number].X;
Unit[intB].Y=Unit[Number].Y;
Unit[intB].Z=Unit[Number].Z;
}
SmokeCounter=0;
}else{
SmokeCounter++;
}
//引っかかっている時は、相手も引っかかっている設定があるかチェック
if(Unit[Number].CatchUnit!=32767){
//相手が引っ掛けていない時は触手の腕を外す
if(Number!=Unit[Unit[Number].CatchUnit].CatchUnit){
Unit[Number].CatchUnit=32767;
}
}
//引っかけられている時
if(Unit[Number].CatchUnit!=32767){
if(Unit[Number].Wait<Unit[Unit[Number].CatchUnit].Wait){
Unit[Number].GotoX=Unit[Unit[Number].CatchUnit].GotoX;
Unit[Number].GotoY=Unit[Unit[Number].CatchUnit].GotoY;
}
}
//出力制御
if(Unit[Number].GotoX<Unit[Number].X){
Unit[Number].XVector-=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
if(Unit[Number].X<Unit[Number].GotoX){
Unit[Number].XVector+=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
if(Unit[Number].GotoY<Unit[Number].Y){
Unit[Number].YVector-=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
if(Unit[Number].Y<Unit[Number].GotoY){
Unit[Number].YVector+=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
//抵抗
Unit[Number].XVector=Unit[Number].XVector*RedistanceRaito;
Unit[Number].YVector=Unit[Number].YVector*RedistanceRaito;
Unit[Number].ZVector=Unit[Number].ZVector*RedistanceRaito;
//落下
if(Unit[Number].Z>0){
Unit[Number].ZVector-=m_cstG;
}else if((Unit[Number].Z<0)&(Unit[Number].ZVector<0)){
Unit[Number].ZVector=0;
Unit[Number].Z=0;
}
//スクロールによる後退
if(BS[0].Enabled==1){
Unit[Number].X-=BS[0].XVector;
}
break;
case m_cstTypeCrow://格闘戦触手
//出力制御
if(Unit[Number].GotoX<Unit[Number].X){
Unit[Number].XVector-=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
if(Unit[Number].X<Unit[Number].GotoX){
Unit[Number].XVector+=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
if(Unit[Number].GotoY<Unit[Number].Y){
Unit[Number].YVector-=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
if(Unit[Number].Y<Unit[Number].GotoY){
Unit[Number].YVector+=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
//抵抗
Unit[Number].XVector=Unit[Number].XVector*RedistanceRaito;
Unit[Number].YVector=Unit[Number].YVector*RedistanceRaito;
//スクロールによる後退
if(BS[0].Enabled==1){
Unit[Number].X-=BS[0].XVector;
}
break;
case m_cstTypePlane://飛行物体
//出力制御
if(Unit[Number].GotoX<Unit[Number].X){
Unit[Number].XVector-=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
if(Unit[Number].X<Unit[Number].GotoX){
Unit[Number].XVector+=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
if(Unit[Number].GotoY<Unit[Number].Y){
Unit[Number].YVector-=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
if(Unit[Number].Y<Unit[Number].GotoY){
Unit[Number].YVector+=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
if(Unit[Number].GotoZ<Unit[Number].Z){
Unit[Number].Z-=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
if(Unit[Number].Z<Unit[Number].GotoZ){
Unit[Number].Z+=float(Unit[Number].SP)/float(Unit[Number].Wait);
}
//抵抗
Unit[Number].XVector=Unit[Number].XVector*RedistanceRaito;
Unit[Number].YVector=Unit[Number].YVector*RedistanceRaito;
//スクロールによる後退
if(BS[0].Enabled==1){
Unit[Number].X-=BS[0].XVector;
}
break;
case m_cstTypeExp://爆発
case m_cstTypeObject://飾り
//落下
if(Unit[Number].Z>0){
Unit[Number].ZVector-=m_cstG;
}else if((Unit[Number].Z<0)&(Unit[Number].ZVector<0)){
Unit[Number].ZVector=0;
Unit[Number].Z=0;
}
//スクロールによる後退
if(BS[0].Enabled==1){
Unit[Number].X-=BS[0].XVector;
}
break;
case m_cstTypeChageHP://HP補充
case m_cstTypeSet1000mm://1000mm弾装備
case m_cstTypeSetLaser://レーザー装備
case m_cstTypeSetCrow://触手装備
//落下
if(Unit[Number].Z>0){
Unit[Number].ZVector-=m_cstG;
}else if((Unit[Number].Z<0)&(Unit[Number].ZVector<0)){
Unit[Number].ZVector=0;
Unit[Number].Z=0;
}
//スクロールによる後退
if(BS[0].Enabled==1){
Unit[Number].X-=BS[0].XVector/2;
}
break;
case m_cstTypeGun://鉄砲玉
break;
case m_cstTypeCanon://砲弾
//落下
Unit[Number].ZVector-=m_cstG;
break;
}
//移動指示
Unit[Number].X+=Unit[Number].XVector;
Unit[Number].Y+=Unit[Number].YVector;
Unit[Number].Z+=Unit[Number].ZVector;
//年齢加算
//当該ユニットが敵ユニットまたは既に寿命が加算されている(=格闘戦触手に引っかかった敵)
//と言う条件と、当該ユニットがボスではないと言う条件が揃った時は寿命を加算
if(((Unit[Number].ID!=0)|(Unit[Number].Zyumyou>0))&(Unit[Number].Boss==0)){
//寿命になったら登録抹消
if(Unit[Number].Zyumyou==ZyumyouMax){
Unit[Number].Enabled=0;
}else{
//まだ寿命でない時は寿命加算
Unit[Number].Zyumyou++;
}
}
}
}
//死亡確認(及び着水エフェクト)
int DeathCheck(int Number){
static ItemCounter=0;//アイテムを出すときのカウンター
int ItemNumber;//アイテムに与える番号
int returnValue=0;
//Z座標の位置
const ZUtol=1500;
const ZLTol=-10;
if(Unit[Number].Enabled==1){//稼動中
//画面外に大幅に出て行ったとき
if(
(
(WindowWidth+(WindowWidth*0.5)<Unit[Number].X)|
(Unit[Number].X<(-WindowWidth*0.5))|
(WindowHeight+(WindowHeight*0.5)<Unit[Number].Y)|
(Unit[Number].Y<(-WindowHeight*0.5))|
(ZUtol<Unit[Number].Z)
)
){
//変化せずに消す
if(Unit[Number].Boss==1){//ボスで、なおかつ死んでいない時
returnValue=1;//勝利
}
if(Number==MeNumber){//自機
returnValue=2;//敗北
}
//触手の腕で繋がっている場合は解除
if(Unit[Number].CatchUnit!=32767){
//無敵状態にならないよう、敵味方識別値を元に戻す
Unit[Unit[Number].CatchUnit].ID=Unit[Unit[Number].CatchUnit].BeforeID;
Unit[Number].ID=Unit[Number].BeforeID;
Unit[Unit[Number].CatchUnit].CatchUnit=32767;
Unit[Number].CatchUnit=32767;
}
Unit[Number].Enabled=0;
}
//耐久力がなくなったとき
if(Unit[Number].HP<=0){
if(strcmp(Unit[Number].DeathChange,"")!=0){//変化する指示があったとき
//アイテム出現
if((Unit[Number].Type==0)&(Unit[Number].ID!=Unit[MeNumber].ID)&(Unit[Number].ID!=32767)){
ItemCounter++;
switch(ItemCounter){
case 10:
ItemNumber=FindNullNumber();
Unit[ItemNumber]=LoadUnitStatus("item1");
Unit[ItemNumber].X=Unit[Number].X;
Unit[ItemNumber].Y=Unit[Number].Y;
Unit[ItemNumber].Z=Unit[Number].Z;
Unit[ItemNumber].ID=Unit[MeNumber].ID;
Unit[ItemNumber].BeforeID=Unit[MeNumber].ID;
//DbgH=1;
//strcpy(Unit[ItemNumber].SMethod[0],"s_end");
ItemCounter=0;//今回はHPアイテムだけ出す、他を出すときはこの行を無効にする
break;
}
}
//一部のデータは引き継ぐ
float fltX=Unit[Number].X;
float fltY=Unit[Number].Y;
float fltZ=Unit[Number].Z;
int intBF=Unit[Number].Boss;
int intBefID=Unit[Number].ID;
int intBefBefID=Unit[Number].BeforeID;
Unit[Number]=LoadUnitStatus(Unit[Number].DeathChange);
Unit[Number].X=fltX;
Unit[Number].Y=fltY;
Unit[Number].Z=fltZ;
Unit[Number].Boss=intBF;
if(Unit[Number].Type==m_cstTypeExp){//爆発した時はIDを中立値に
Unit[Number].ID=32767;
}else if(Unit[Number].Type==m_cstTypeObject){//飾りになった時はIDを中立値に
Unit[Number].ID=32767;
}else{
Unit[Number].ID=intBefID;//変身の時はIDを引き継ぐ
Unit[Number].BeforeID=intBefBefID;//変身の時はIDを引き継ぐ
}
//繋がっている場合は解除
if(Unit[Number].CatchUnit!=32767){
//無敵状態にならないよう、敵味方識別値を元に戻す
Unit[Unit[Number].CatchUnit].ID=Unit[Unit[Number].CatchUnit].BeforeID;
Unit[Number].ID=Unit[Number].BeforeID;
Unit[Unit[Number].CatchUnit].CatchUnit=32767;
Unit[Number].CatchUnit=32767;
}
if(Unit[Number].Z<0){Unit[Number].Z=0;}
}else{
//変化せずに消す
Unit[Number].Enabled=0;
//繋がっている場合は解除
if(Unit[Number].CatchUnit!=32767){
Unit[Unit[Number].CatchUnit].CatchUnit=32767;
Unit[Number].CatchUnit=32767;
}
}
return returnValue;
}
int intA;//汎用変数
//地面に激突
if(Unit[Number].Z<ZLTol){
switch(Unit[Number].Type){
case m_cstTypeGun:
case m_cstTypeCanon:
if(Unit[Number].ZVector<0){Unit[Number].HP-=(Unit[Number].Wait*int(pow(Unit[Number].Z,2)))/2;}
case m_cstTypeCar:
Unit[Number].ZVector=fabsf(float(Unit[Number].ZVector)*m_cstE);
break;
}
}
//水面に激突
if((Unit[Number].Z<0)&(Unit[Number].ZVector<-0.1)){
switch(Unit[Number].Type){
//このゲームでは水上戦なので、弾が着水した場合は爆発はせず、水柱のみ出す処理にする
case m_cstTypeGun:
case m_cstTypeCanon:
strcpy(Unit[Number].DeathChange,"");//死亡後の変身を解除
Unit[Number].HP=0;//死亡扱い
//ここにはbreak文を入れずそのまま、艦船と同じように着水の水柱を出す
case m_cstTypeShip://艦船の着水時は水柱を出す
intA=FindNullNumber();//使用していないユニットを探す
//着水したユニットの破壊力に応じ水柱を生成
if(Unit[Number].BP>2500){
Unit[intA]=LoadUnitStatus("llwater");//着水用水柱作成
}else if(Unit[Number].BP>250){
Unit[intA]=LoadUnitStatus("lwater");//着水用水柱作成
}else if(Unit[Number].BP>25){
Unit[intA]=LoadUnitStatus("mwater");//着水用水柱作成
}else{
Unit[intA]=LoadUnitStatus("swater");//着水用水柱作成
}
//着水ユニットと同じ位置に水柱を移動
Unit[intA].X=Unit[Number].X;
Unit[intA].Y=Unit[Number].Y;
Unit[intA].Z=Unit[Number].Z;
//大量に水柱が出るのを止めるため、強制的に上下方向の位置と速度を0にする
Unit[Number].Z=0;
Unit[Number].ZVector=0;
break;
}
}
}
return returnValue;
}
//攻撃
void Atack(int Number){
if(Unit[Number].Enabled==1){
int intA;
int NewUnitNumber;
for(intA=0;intA<WeaponMax;intA++){
if(Unit[Number].WeaponEnabled[intA]==1){//使用可能な武器を検索
if(Unit[Number].WeaponSoutenCounter[intA]==0){//装填完了しているかどうか
if(Unit[Number].Fire==1){//攻撃指示が入っているか
Unit[Number].WeaponSoutenCounter[intA]=Unit[Number].WeaponShotBlanc[intA];//装填時間を代入
NewUnitNumber=FindNullNumber();//ユニットを入れる変数の空きを探す
Unit[NewUnitNumber]=LoadUnitStatus(Unit[Number].WeaponName[intA]);//ユニット作成
//位置設定
Unit[NewUnitNumber].X=Unit[Number].X;
Unit[NewUnitNumber].Y=Unit[Number].Y;
Unit[NewUnitNumber].Z=Unit[Number].Z;
//発射位置が水面下になってしまう場合は補正
if(Unit[NewUnitNumber].Z<=0){
Unit[NewUnitNumber].Z=1;
}
Unit[NewUnitNumber].ID=Unit[Number].ID;//「Unit[Number]」が発射したことを記録
Unit[NewUnitNumber].BeforeID=Unit[Number].BeforeID;//「Unit[Number]」が発射したことを記録
//攻撃目標設定
Unit[NewUnitNumber].AtackX=Unit[Number].AtackX;
Unit[NewUnitNumber].AtackY=Unit[Number].AtackY;
Unit[NewUnitNumber].AtackZ=Unit[Number].AtackZ;
float ShootLength;//攻撃する目標までの距離
float fltB;
int intC;
float DropSpeed;//着地時の速度
switch(Unit[NewUnitNumber].Type){
case m_cstTypeGun://鉄砲玉
//目標の距離を入れる
ShootLength=sqrtf(powf(float(Unit[NewUnitNumber].AtackX-Unit[NewUnitNumber].X),2)+powf(float(Unit[NewUnitNumber].AtackY-Unit[NewUnitNumber].Y),2)+powf(float(Unit[NewUnitNumber].AtackZ-Unit[NewUnitNumber].Z),2));
//着弾までの所要時間を算出
fltB=ShootLength/float(Unit[NewUnitNumber].SP/Unit[NewUnitNumber].Wait);
if(fltB==0.0f){fltB=1.0f;}
//所要時間で割って、各方向の速度を算出
Unit[NewUnitNumber].XVector+=int(float(Unit[NewUnitNumber].AtackX-Unit[NewUnitNumber].X)/fltB);
Unit[NewUnitNumber].YVector+=int(float(Unit[NewUnitNumber].AtackY-Unit[NewUnitNumber].Y)/fltB);
Unit[NewUnitNumber].ZVector+=int(float(Unit[NewUnitNumber].AtackZ-Unit[NewUnitNumber].Z)/fltB);
break;
case m_cstTypeCanon://砲弾
//目標の距離を入れる
ShootLength=sqrtf(powf(float(Unit[NewUnitNumber].AtackX-Unit[NewUnitNumber].X),2)+powf(float(Unit[NewUnitNumber].AtackY-Unit[NewUnitNumber].Y),2)+powf(float(Unit[NewUnitNumber].AtackZ-Unit[NewUnitNumber].Z),2));
//着弾までの所要時間を算出
fltB=ShootLength/float(Unit[NewUnitNumber].SP/Unit[NewUnitNumber].Wait);
DropSpeed=0;
for(intC=0;intC<fltB/2;intC++){
DropSpeed+=m_cstG;//落下速度が上がる
}
if(fltB==0){fltB=1;}
//所要時間で割って、各方向の速度を算出
Unit[NewUnitNumber].XVector+=int(float(Unit[NewUnitNumber].AtackX-Unit[NewUnitNumber].X)/fltB);
Unit[NewUnitNumber].YVector+=int(float(Unit[NewUnitNumber].AtackY-Unit[NewUnitNumber].Y)/fltB);
Unit[NewUnitNumber].ZVector+=int(float(Unit[NewUnitNumber].AtackZ-Unit[NewUnitNumber].Z)/fltB);
Unit[NewUnitNumber].ZVector+=int(DropSpeed);//さらに落下速度に対する値を加える
break;
case m_cstTypeCrow://格闘戦触手
if(Unit[Number].CatchUnit!=32767){//何かをすでに引っ掛けている時
//そのまま飛んでいくスクリプト設定
strcpy(Unit[Unit[Number].CatchUnit].SMethod[0],"s_gotou");
Unit[Unit[Number].CatchUnit].SData1[0]=0;
strcpy(Unit[Unit[Number].CatchUnit].SMethod[1],"s_gotov");
Unit[Unit[Number].CatchUnit].SData1[1]=0;
strcpy(Unit[Unit[Number].CatchUnit].SMethod[2],"s_gotow");
Unit[Unit[Number].CatchUnit].SData1[2]=0;
//
strcpy(Unit[Unit[Number].CatchUnit].SMethod[3],"s_goto");
Unit[Unit[Number].CatchUnit].SData1[3]=0;
//スクリプトのポインタも同じように設定
Unit[Unit[Number].CatchUnit].ScriptPointer=0;
Unit[Unit[Number].CatchUnit].CatchUnit=32767;//ロープを外す
}
//移動撃目標設定
Unit[NewUnitNumber].GotoX=Unit[NewUnitNumber].AtackX;
Unit[NewUnitNumber].GotoY=Unit[NewUnitNumber].AtackY;
Unit[NewUnitNumber].GotoZ=Unit[NewUnitNumber].AtackZ;
//目標の距離を入れる
ShootLength=sqrtf(powf(float(Unit[NewUnitNumber].AtackX-Unit[NewUnitNumber].X),2)+powf(float(Unit[NewUnitNumber].AtackY-Unit[NewUnitNumber].Y),2)+powf(float(Unit[NewUnitNumber].AtackZ-Unit[NewUnitNumber].Z),2));
//着弾までの所要時間を算出
fltB=ShootLength/float(Unit[NewUnitNumber].SP/Unit[NewUnitNumber].Wait);
if(fltB==0.0f){fltB=1.0f;}
//所要時間で割って、各方向の速度を算出
Unit[NewUnitNumber].XVector+=int(float(Unit[NewUnitNumber].AtackX-Unit[NewUnitNumber].X)/fltB);
Unit[NewUnitNumber].YVector+=int(float(Unit[NewUnitNumber].AtackY-Unit[NewUnitNumber].Y)/fltB);
Unit[NewUnitNumber].ZVector+=int(float(Unit[NewUnitNumber].AtackZ-Unit[NewUnitNumber].Z)/fltB);
Unit[NewUnitNumber].CatchUnit=Number;//ロープで結ぶ
Unit[Number].CatchUnit=NewUnitNumber;//ロープで結ぶ
break;
default:
//移動目標設定
Unit[NewUnitNumber].GotoX=Unit[Number].AtackX;
Unit[NewUnitNumber].GotoY=Unit[Number].AtackY;
Unit[NewUnitNumber].GotoZ=Unit[Number].AtackZ;
break;
}
}
}else{
Unit[Number].WeaponSoutenCounter[intA]--;//装填
}
}
}
}
}
//影ビットマップの切り取る位置
const ShadowLeft=64;
const ShadowTop=64;
const ShadowWidth=64;
const ShadowHeight=64;
//影ビットマップの貼り付け時の補正
const ShadowWidthRatio=3;
const ShadowHeightRatio=3;
const ShadowOfsetX=-32;
const ShadowOfsetY=0;
//波ビットマップの切り取る位置
const WaveLeft=0;
const WaveTop=64;
const WaveWidth=63;
const WaveHeight=63;
//波ビットマップの貼り付け時の補正
int WPC;//波描画時のカウンター
static WaveCounter=0;//波のインデックス
const WaveNum=25;//波を表示する数
const WaveTimeMax=5;//波の寿命
const WaveXOfsetX=-8;//波の座標補正
const WaveXOfsetY=-32;//波の座標補正
int WaveTime[WaveNum];//波の現在寿命
int WaveSize[WaveNum];//波の大きさ
int WaveX[WaveNum];//波の座標
int WaveY[WaveNum];//波の座標
const WaveRatio=1;//波の大きさの比率(Y)
void WaveReset(){//波リセット(戦闘パート実行前に行ってください)
for(WPC=0;WPC<WaveNum;WPC++){
WaveTime[WPC]=25;
}
}
int Kun2BRun(HDC WindowHDC){//戦闘パート実行
int returnValue=0;//戻り値
//バッファ消去
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfElase],0,0,SRCCOPY);
int intA;
int intX;
for(intA=BSMax-1;intA>=0;intA--){//背景の描画
if(BS[intA].Enabled==1){//背景が使用予定であること
BS[intA].hdc=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
BS[intA].hdcm=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SelectObject(BS[intA].hdc,BS[intA].Surface);//デバイスコンテキストとサーフェスを結合
SelectObject(BS[intA].hdcm,BS[intA].Surfacem);//デバイスコンテキストとサーフェスを結合
BS[intA].X+=BS[intA].XVector ;//スクロール
if(BS[intA].Width-WindowWidth<BS[intA].X){
//背景の端が見えてきた時
intX=(BS[intA].X+WindowWidth)-BS[intA].Width;//はみ出る量を算出
//まず普通に描画
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,BS[intA].hdcm,BS[intA].X,BS[intA].Y,SRCAND);//描画
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,BS[intA].hdc,BS[intA].X,BS[intA].Y,SRCPAINT);//描画
//はみ出た分を改めて描画
BitBlt(SurfaceHDC[m_cstSurfBack],WindowWidth-intX,0,intX,WindowHeight,BS[intA].hdcm,0,BS[intA].Y,SRCAND);//描画
BitBlt(SurfaceHDC[m_cstSurfBack],WindowWidth-intX,0,intX,WindowHeight,BS[intA].hdc,0,BS[intA].Y,SRCPAINT);//描画
}else{
//通常の描画
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,BS[intA].hdcm,BS[intA].X,BS[intA].Y,SRCAND);//描画
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,BS[intA].hdc,BS[intA].X,BS[intA].Y,SRCPAINT);//描画
}
if(BS[intA].X>BS[intA].Width){BS[intA].X=0;}//画面の端まで行ったとき
DeleteDC(BS[intA].hdc);//デバイスコンテキストを開放
DeleteDC(BS[intA].hdcm);//デバイスコンテキストを開放
}
}
RunMap();//マップのデータを読み込み動かしてゆく
MeMove();//自機の設定
int intC;
int intD;
const ChaneNum=50;//触手の腕の部品の数
//触手の腕の画像の位置
const int CX=608;
const int CY=32;
const int CW=16;
const int CH=16;
for(intC=0;intC<UnitMax;intC++){
if((Unit[intC].Enabled==1)&(Unit[intC].CatchUnit!=32767)&(Unit[intC].CatchUnit<intC)){//糸で結ばれている時、なおかつ二回描画しないようにするためにintCより小さい番号のみ適用する
if(Unit[Unit[intC].CatchUnit].Enabled==1){//引っ掛けている対象も稼動している時
int ChaneX=int((Unit[Unit[intC].CatchUnit].X-Unit[intC].X)/ChaneNum);
int ChaneY=int((Unit[Unit[intC].CatchUnit].Y-Unit[intC].Y)/ChaneNum);
int ChaneZ=int((Unit[Unit[intC].CatchUnit].Z-Unit[intC].Z)/ChaneNum);
for(intD=0;intD<ChaneNum;intD++){
BitBlt(SurfaceHDC[m_cstSurfBack],int(Unit[intC].X+ChaneX*intD),int((Unit[intC].Y-Unit[intC].Z)+(ChaneY-ChaneZ)*intD),CW,CH,SurfaceHDC[m_cstSurfPlayorm],CX,CY,SRCAND);//描画
BitBlt(SurfaceHDC[m_cstSurfBack],int(Unit[intC].X+ChaneX*intD),int((Unit[intC].Y-Unit[intC].Z)+(ChaneY-ChaneZ)*intD),CW,CH,SurfaceHDC[m_cstSurfPlayor],CX,CY,SRCPAINT);//描画
}
}else{
Unit[intC].CatchUnit=32767;//糸をはずす
}
}
}
//波描画
for(WPC=0;WPC<WaveNum;WPC++){
if(WaveTime[WPC]<WaveTimeMax){//波が表示されるべき時
StretchBlt(SurfaceHDC[m_cstSurfBack],WaveX[WPC],WaveY[WPC],WaveSize[WPC],WaveHeight*WaveRatio,SurfaceHDC[m_cstSurfPlayorm],WaveLeft,WaveTop,WaveWidth,WaveHeight,SRCAND);//描画
StretchBlt(SurfaceHDC[m_cstSurfBack],WaveX[WPC],WaveY[WPC],WaveSize[WPC],WaveHeight*WaveRatio,SurfaceHDC[m_cstSurfPlayor],WaveLeft,WaveTop,WaveWidth,WaveHeight,SRCPAINT);//描画
WaveX[WPC]-=BS[0].XVector ;//左へ移動
WaveTime[WPC]++;//寿命加算
}
}
//ユニット描画と動作
int intB;
//int FNN;
for(intB=0;intB<UnitMax;intB++){
if(Unit[intB].Enabled!=0){//稼動中
//影及び波の描画
switch(Unit[intB].Type){
case m_cstTypeGun://直射砲
case m_cstTypeCanon://曲射砲
case m_cstTypeCrow://格闘戦触手
case m_cstTypePlane://航空機
case m_cstTypeChageHP://HP補充
case m_cstTypeSet1000mm://1000mm弾装備
case m_cstTypeSetCrow://触手装備
//影描画
StretchBlt(SurfaceHDC[m_cstSurfBack],int(Unit[intB].X)+Unit[intB].BmpOfsetX+(Unit[intB].BmpWidth/ShadowWidthRatio),int(Unit[intB].Y)+Unit[intB].BmpOfsetY+(Unit[intB].BmpHeight-(Unit[intB].BmpHeight/ShadowHeightRatio))+ShadowOfsetY,Unit[intB].BmpWidth-(Unit[intB].BmpWidth/ShadowWidthRatio),Unit[intB].BmpHeight/ShadowHeightRatio,SurfaceHDC[m_cstSurfPlayorm],ShadowLeft,ShadowTop,ShadowWidth,ShadowHeight,SRCAND);//描画
StretchBlt(SurfaceHDC[m_cstSurfBack],int(Unit[intB].X)+Unit[intB].BmpOfsetX+(Unit[intB].BmpWidth/ShadowWidthRatio),int(Unit[intB].Y)+Unit[intB].BmpOfsetY+(Unit[intB].BmpHeight-(Unit[intB].BmpHeight/ShadowHeightRatio))+ShadowOfsetY,Unit[intB].BmpWidth-(Unit[intB].BmpWidth/ShadowWidthRatio),Unit[intB].BmpHeight/ShadowHeightRatio,SurfaceHDC[m_cstSurfPlayor],ShadowLeft,ShadowTop,ShadowWidth,ShadowHeight,SRCPAINT);//描画
break;
case m_cstTypeShip://艦船
if(Unit[intB].Z>1){//空中に放り投げられている時
//影描画
StretchBlt(SurfaceHDC[m_cstSurfBack],int(Unit[intB].X)+Unit[intB].BmpOfsetX+(Unit[intB].BmpWidth/ShadowWidthRatio),int(Unit[intB].Y)+Unit[intB].BmpOfsetY+(Unit[intB].BmpHeight-(Unit[intB].BmpHeight/ShadowHeightRatio))+ShadowOfsetY,Unit[intB].BmpWidth-(Unit[intB].BmpWidth/ShadowWidthRatio),Unit[intB].BmpHeight/ShadowHeightRatio,SurfaceHDC[m_cstSurfPlayorm],ShadowLeft,ShadowTop,ShadowWidth,ShadowHeight,SRCAND);//描画
StretchBlt(SurfaceHDC[m_cstSurfBack],int(Unit[intB].X)+Unit[intB].BmpOfsetX+(Unit[intB].BmpWidth/ShadowWidthRatio),int(Unit[intB].Y)+Unit[intB].BmpOfsetY+(Unit[intB].BmpHeight-(Unit[intB].BmpHeight/ShadowHeightRatio))+ShadowOfsetY,Unit[intB].BmpWidth-(Unit[intB].BmpWidth/ShadowWidthRatio),Unit[intB].BmpHeight/ShadowHeightRatio,SurfaceHDC[m_cstSurfPlayor],ShadowLeft,ShadowTop,ShadowWidth,ShadowHeight,SRCPAINT);//描画
}else{
//波セット
WaveTime[WaveCounter]=0;
WaveX[WaveCounter]=int(Unit[intB].X)+Unit[intB].BmpOfsetX+WaveXOfsetX;
WaveY[WaveCounter]=int(Unit[intB].Y)+WaveXOfsetY;
WaveSize[WaveCounter]=Unit[intB].BmpWidth;
WaveCounter++;
if(WaveCounter==WaveNum){WaveCounter=0;}
}
break;
}
//描画
BitBlt(SurfaceHDC[m_cstSurfBack],int(Unit[intB].X)+Unit[intB].BmpOfsetX,int(Unit[intB].Y-Unit[intB].Z)+Unit[intB].BmpOfsetY,Unit[intB].BmpWidth,Unit[intB].BmpHeight,SurfaceHDC[Unit[intB].BmpNumberm],Unit[intB].BmpX,Unit[intB].BmpY,SRCAND);//描画
BitBlt(SurfaceHDC[m_cstSurfBack],int(Unit[intB].X)+Unit[intB].BmpOfsetX,int(Unit[intB].Y-Unit[intB].Z)+Unit[intB].BmpOfsetY,Unit[intB].BmpWidth,Unit[intB].BmpHeight,SurfaceHDC[Unit[intB].BmpNumber],Unit[intB].BmpX,Unit[intB].BmpY,SRCPAINT);//描画
UnitMove(intB);//移動
Atack(intB);//攻撃
HitCheck(intB);//当たり判定確認
returnValue+=DeathCheck(intB);//死亡確認
}
}
//HPゲージ描画
//描画位置
const HPGX=0;
const HPGY=440;
//画像切り取り位置
const HPSX=500;
const HPSY=320;
//ゲージの大きさと、値表示部分の最大幅
const HPGLength=96;
const HPGWidth=140;
const HPGHeight=32;
if(Unit[MeNumber].Type!=8){//自機が爆発していない時だけ描画
//引く量
int WDLength=HPGLength-int(float(HPGLength)*(float(Unit[MeNumber].HP)/float(Unit[MeNumber].HPMAX)));
if(WDLength>HPGLength){WDLength=HPGLength;}
if(WDLength<0){WDLength=0;}
BitBlt(SurfaceHDC[m_cstSurfBack],HPGX,HPGY,HPGWidth-WDLength,HPGHeight,SurfaceHDC[m_cstSurfPlayorm],HPSX,HPSY,SRCAND);//描画
BitBlt(SurfaceHDC[m_cstSurfBack],HPGX,HPGY,HPGWidth-WDLength,HPGHeight,SurfaceHDC[m_cstSurfPlayor],HPSX,HPSY,SRCPAINT);//描画
if(Kun2DrawFlag==1){//追加描画
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,640,480,SurfaceHDC[m_cstSurfFreeGraphicm],0,0,SRCAND);
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,640,480,SurfaceHDC[m_cstSurfFreeGraphic],0,0,SRCPAINT);
}
}
//文字書き込み
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfMoziSyori],0,0,SRCAND);
//画面に描画
if(WindowMode==1){//全画面表示
StretchBlt(WindowHDC,0,0,DeskTopWidth,DeskTopHeight,SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,SRCCOPY);
}else{//通常表示
BitBlt(WindowHDC,0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfBack],0,0,SRCCOPY);
}
Sleep(50);
return returnValue;
}
void Kun2BRelease(){//戦闘モード終了
//追加画像消去
BitBlt(SurfaceHDC[m_cstSurfFreeGraphicm],0,0,640,480,SurfaceHDC[m_cstSurfWhiteElase],0,0,SRCCOPY);
BitBlt(SurfaceHDC[m_cstSurfFreeGraphic],0,0,640,480,SurfaceHDC[m_cstSurfElase],0,0,SRCCOPY);
Kun2DrawFlag=0;
//文字領域消去
BitBlt(SurfaceHDC[m_cstSurfMoziSyori],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfWhiteElase],0,0,SRCCOPY);
int intA;
if(!SoundSkip){mciSendString("close all", NULL, 0, 0);}//音楽を閉じる
//出撃艦船リストを初期化
for(intA=0;intA<HaveMax;intA++){
HaveUnitStatus[intA]=0;
}
for(intA=0;intA<BSMax;intA++){//背景設定の初期化
if(BS[intA].Enabled==1){
DeleteObject(BS[intA].Surface);// インターフェイスビットマップをクリア
DeleteObject(BS[intA].Surfacem);// インターフェイスビットマップをクリア
BS[intA].Enabled=0;//使用フラグをfalseに
}
}
}
//#pragma optimize("", on)
//アドベンチャーモード////////////////////////////////////////////////////////////////////////////
//アドベンチャーモードのデータを読み込む(読み込むだけで処理しない)
void LoadADVScript(char *ADVFile){
char ADVGetLine[ADVGetLineNum];//ファイルから取得した行を入れる
int intA;//汎用変数
int intB;//汎用変数
int intC;//汎用変数
int intF;//汎用変数
//アドベンチャースクリプト記憶領域初期化
for(intA=0;intA<ADVGetLineNum;intA++){
for(intB=0;intB<ADVGetWordIndexNum;intB++){
strcpy(ADVGetWord[intA][intB],"");
}
}
intB=0;
intC=0;
intF=0;
FILE *ADV;
ADV=fopen(ADVFile,"r");//マップファイルを開く
if(ADV==0x0){
//ファイルを開くのに失敗した時はログを作る
ERR=fopen("./ErrorLog.log","a");
fprintf(ERR,"FileNotFound in LoadADVScript:");
fprintf(ERR,ADVFile);
fprintf(ERR,"\n");
fclose(ERR);
ADVPointer++;//ポインターを進める
}
while(fgets(ADVGetLine,ADVGetLineNum,ADV)!=NULL){//終端に達するまで繰り返し
for(intA=0;intA<ADVGetLineNum;intA++){//ADVGetLineの単語をADVGetWordに仕分け
if(ADVGetLine[0]=='/'){break;}//コメントだった場合はforループを抜ける
if(ADVGetLine[0]=='\n'){break;}//何も文字が入っていなかった行の場合もforループを抜ける
switch(ADVGetLine[intA]){
case '\n'://文字列終端に到達
ADVGetWord[intF][intC][intB]='\0';//文字列終端を付ける
intB=0;//文字列ポインタを戻す
intC=0;//配列ポインタを戻す
intF++;//次の配列へ
intA=ADVGetLineNum;
break;
//単語の区切りへ到達
case '=':
case ',':
ADVGetWord[intF][intC][intB]='\0';//文字列終端を付ける
intB=0;//文字列ポインタを戻す
intC++;//次の配列へ
break;
default:
ADVGetWord[intF][intC][intB]=ADVGetLine[intA];//文字列をつなぐ
intB++;//文字列ポインタを加算
break;
}
}
}
fclose(ADV);
ADVPointer=0;//マップの行番号を初期化
}
int WordButton(int X,int Y,char *Value){//文字ボタン(押されたら1を返す)
//文字サイズをここに記しておく
const WWidth=8;
const WHeight=20;
RECT rt;
rt.left=X;
rt.top=Y;
rt.right=X+strlen(Value)*WWidth;
rt.bottom=Y+WHeight;
int RetValue=0;
static WTiming=0;//点滅タイミング
//WTimingの切り替え
if(WTiming<10){WTiming++;}else if(WTiming==10){WTiming=0;}
//マウスが乗っかっている時
if((rt.left<MDF.X)&(MDF.X<rt.right)&
(rt.top<MDF.Y)&(MDF.Y<rt.bottom)){
if(WTiming<5){//点滅タイミングにより描画
DrawText(SurfaceHDC[m_cstSurfButtonWord],Value,strlen(Value),&rt,DT_LEFT);
if(MDF.LButton==1){RetValue=1;}//マウスが押された時
}
}else{
DrawText(SurfaceHDC[m_cstSurfButtonWord],Value,strlen(Value),&rt,DT_LEFT);
}
return RetValue;
}
//アドベンチャーパートを動かす(描画処理開始→スクリプト処理→描画処理終了)
void RunADV(HWND WindowhWnd,HDC WindowHDC){
//ファイル処理時に使うストリーム
FILE *FF;
char SoundFile[FullPathMax];//音楽のファイルパス
//文字を書き込む位置
static int CursorX=0;
static int CursorY=0;
const int CursorStepY=20;//一行書き終えた後に移動する量
//選択肢と艦隊編成で使う変数
int WX;//選択肢の位置
int WY;//選択肢の位置
int WSY;
int SR;
const WSBW=20;//文字を配置する間隔
const WSS=32;//選択肢表示時に文字を配置する間隔
RECT rt;//文字列描画時に描画範囲を指定する時に使う構造体
char FullPath[FullPathMax];//呼び出すファイルパスを入れる
static bool blnA=false;//wait命令時の、クリックの有無に関するフラグ
static bool blnB=false;//戦闘パートのフラグ
int intA;//汎用変数
int intB;//汎用変数
char strC[UnitNameMax+8];//汎用変数
HFONT WFont;//描画時のフォント
//描画領域を使えるようにする
SurfaceHDC[m_cstSurfBack]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfElase]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfHaikei]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfTatie]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfTatiem]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfMoziban]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfMozibanm]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfMoziSyori]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfWhiteElase]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfFreeGraphic]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfFreeGraphicm]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfPlayor]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfPlayorm]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfEnemy]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfEnemym]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SurfaceHDC[m_cstSurfButtonWord]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
WFont=CreateFont(16,0,0,0,100,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH,NULL);
SelectObject(SurfaceHDC[m_cstSurfMoziSyori],WFont);
SelectObject(SurfaceHDC[m_cstSurfButtonWord],WFont);
SelectObject(SurfaceHDC[m_cstSurfBack],Surface[m_cstSurfBack]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfElase],Surface[m_cstSurfElase]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfHaikei],Surface[m_cstSurfHaikei]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfTatie],Surface[m_cstSurfTatie]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfTatiem],Surface[m_cstSurfTatiem]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfMoziban],Surface[m_cstSurfMoziban]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfMozibanm],Surface[m_cstSurfMozibanm]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfMoziSyori],Surface[m_cstSurfMoziSyori]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfWhiteElase],Surface[m_cstSurfWhiteElase]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfFreeGraphic],Surface[m_cstSurfFreeGraphic]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfFreeGraphicm],Surface[m_cstSurfFreeGraphicm]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfPlayor],Surface[m_cstSurfPlayor]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfPlayorm],Surface[m_cstSurfPlayorm]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfEnemy],Surface[m_cstSurfEnemy]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfEnemym],Surface[m_cstSurfEnemym]);//デバイスコンテキストとサーフェスを結合
SelectObject(SurfaceHDC[m_cstSurfButtonWord],Surface[m_cstSurfButtonWord]);//デバイスコンテキストとサーフェスを結合
static int RollMode=0;//0以上の値が入ると、その更新間隔で自動送り
static int RollCounter=0;//自動送りの更新までの時間の管理
if(false){//インデント用ダミー
//まずこのゲーム固有の機能
}else if(strcmp(ADVGetWord[ADVPointer][0],"kun2image")==0){//敵キャラの画像をここで取得する(ビットマップについては、敵キャラの画像のみならず描画時のマスクもここに入れている模様)
intA=atoi(ADVGetWord[ADVPointer][1]);
Surface[intA]=(HBITMAP) LoadImage(NULL,ADVGetWord[ADVPointer][2],IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"nanido")==0){//難易度設定
Nanido=atoi(ADVGetWord[ADVPointer][1]);
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"haveshipload")==0){//保有艦艇読み込み
//保有リストリセット
for(intA=0;intA<HaveMax;intA++){
strcpy(HaveUnitName[intA],"");
strcpy(HaveUnitNameJ[intA],"");
}
//艦隊のリストをロードにする
FF=fopen("./astudata/shiplist.dat","r");
for(intA=0;intA<HaveMax;intA++){
fgets(strC,UnitNameMax,FF);//とりあえず一行strCへ格納
if(feof(FF)){break;}//fgets命令を入れた上で終端を検出したらforループを抜ける
strcpy(HaveUnitName[intA],strC);
HaveUnitName[intA][strlen(HaveUnitName[intA])-1]='\0';
fgets(HaveUnitNameJ[intA],UnitNameMax,FF);
HaveUnitNameJ[intA][strlen(HaveUnitNameJ[intA])-1]='\0';
}
fclose(FF);
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"freetreset")==0){//出撃艦艇のリセット
//出撃艦船リストを初期化
for(intA=0;intA<HaveMax;intA++){
HaveUnitStatus[intA]=0;
}
for(intA=0;intA<FleetMax;intA++){
strcpy(FleetUnitName[intA],"");
}
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"fleet")==0){//旗艦の指定、強制的に艦隊を編成する時に使う(0番以外も直接指定できるが、現状ではできるだけ旗艦を指定するだけに使いたい)
strcpy(FleetUnitName[atoi(ADVGetWord[ADVPointer][1])],ADVGetWord[ADVPointer][2]);
strcpy(FleetUnitNameJ[atoi(ADVGetWord[ADVPointer][1])],ADVGetWord[ADVPointer][3]);
//strcpy(HaveUnitName[atoi(ADVGetWord[ADVPointer][1])],ADVGetWord[ADVPointer][2]);
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"addship")==0){//保有ユニット追加(艦隊へは組み込まない)
//HaveUnitNameの配列を調べ、文字が空になっているところを見つけたらそこへユニット名を書き込み
for(intA=0;intA<HaveMax;intA++){
if(strcmp(HaveUnitName[intA],ADVGetWord[ADVPointer][1])==0){//既に同じユニットがある場合は登録しない
intA=intA;
break;
}else if(strcmp(HaveUnitName[intA],"")==0){//空の場所を見つけたら登録
strcpy(HaveUnitName[intA],ADVGetWord[ADVPointer][1]);//名前登録
strcpy(HaveUnitNameJ[intA],ADVGetWord[ADVPointer][2]);//表示名登録
HaveUnitStatus[intA]=0;
break;
}
}
//船のリストを記録
FF=fopen("./astudata/shiplist.dat","w");
for(intA=0;intA<HaveMax;intA++){
fprintf(FF,HaveUnitName[intA]);
fprintf(FF,"\n");
fprintf(FF,HaveUnitNameJ[intA]);
fprintf(FF,"\n");
}
fclose(FF);
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"haveship")==0){//保有艦船表示
//GetClientRect( WindowhWnd, &rt );//画面サイズ取得
//艦船リストを検索し、空でなければ描画
for(intA=0;intA<HaveMax;intA++){
if(strcmp(HaveUnitName[intA],"")!=0){
rt.left=CursorX;//文字開始X座標
rt.top=CursorY;//文字開始Y座標
rt.right=SurfaceData[m_cstSurfMoziSyori].bmWidth;
rt.bottom=SurfaceData[m_cstSurfMoziSyori].bmHeight;
//HaveUnitStatus[intA]=0;
DrawText( SurfaceHDC[m_cstSurfMoziSyori], HaveUnitNameJ[intA], strlen(HaveUnitNameJ[intA]), &rt, DT_LEFT );
CursorY+=CursorStepY;//文字表示位置移動
}
}
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"makefleet")==0){//艦隊編成
//出撃が決定している艦船の勘定
intA=0;
for(WSY=0;WSY<HaveMax;WSY++){
intA+=HaveUnitStatus[WSY];
}
//出撃することにしたユニット名をずらす量はADVGetWord[ADVPointer][1]に格納
WX=atoi(ADVGetWord[ADVPointer][2]);//選択肢の位置
WY=atoi(ADVGetWord[ADVPointer][3]);//選択肢の位置
//ユニットの数だけ繰り返し
for(WSY=0;WSY<HaveMax;WSY++){
if(strcmp(HaveUnitName[WSY],FleetUnitName[0])==0){//旗艦は出撃の中止が不可(文字表示のみ)
//旗艦の名前が分かるようにする
strcpy(strC,"旗艦:");
strcat(strC,FleetUnitNameJ[0]);
rt.left=WX+atoi(ADVGetWord[ADVPointer][1]);//文字開始X座標
rt.top=WY+WSY*WSS;//文字開始Y座標
rt.right=SurfaceData[m_cstSurfMoziSyori].bmWidth;
rt.bottom=SurfaceData[m_cstSurfMoziSyori].bmHeight;
DrawText( SurfaceHDC[m_cstSurfMoziSyori], strC, strlen(strC), &rt, DT_LEFT );
}else if(strcmp(HaveUnitName[WSY],"")!=0){//ユニット名が空でなければ以下の行を実行
if(WordButton(WX+HaveUnitStatus[WSY]*atoi(ADVGetWord[ADVPointer][1]),WY+WSY*WSS,HaveUnitNameJ[WSY])==1){
//出撃設定切り替え
if(HaveUnitStatus[WSY]==0){//まだ出撃決定しておらず、
if(intA<FleetMax){//出撃可能な時
if(!SoundSkip){PlaySound("./astudata/1.wav",NULL,SND_ASYNC);}//音
HaveUnitStatus[WSY]=1;
}else{//出撃不可の時
//エラー音
if(!SoundSkip){PlaySound("./astudata/74.wav",NULL,SND_ASYNC);}
}
}else if(HaveUnitStatus[WSY]==1){//出撃取りやめ
if(!SoundSkip){PlaySound("./astudata/2.wav",NULL,SND_ASYNC);}//音
HaveUnitStatus[WSY]=0;
}
}
}else{//ユニット名が空
break;//forループを抜ける
}
}
if(intA>0){//出撃する艦船が選ばれているとき
WX=atoi(ADVGetWord[ADVPointer][4]);//選択肢の位置
WY=atoi(ADVGetWord[ADVPointer][5]);//選択肢の位置
if(WordButton(WX,WY,"編成完了")==1){
if(!SoundSkip){PlaySound("./astudata/8.wav",NULL,SND_ASYNC);}//音
//出撃ユニットを初期化(旗艦は初期化しない)
for(intA=1;intA<FleetMax;intA++){
strcpy(FleetUnitName[intA],"");
}
//出撃を決定したユニットを入れる
intA=1;//(旗艦はすでに入っているので触らない)
for(intB=0;intB<HaveMax;intB++){
//保有艦船のリストが空でない事、保有艦船が出撃する設定である事、保有艦船が旗艦名ではないこと、の三条件が揃った時にリストへ登録する
if((strcmp(HaveUnitName[intB],"")!=0)&(HaveUnitStatus[intB]!=0)&(strcmp(HaveUnitName[intB],FleetUnitName[0])!=0)){
strcpy(FleetUnitName[intA],HaveUnitName[intB]);
strcpy(FleetUnitNameJ[intA],HaveUnitNameJ[intB]);
intA++;
}
}
ADVPointer++;//ポインターを進める
}
}
}else if(strcmp(ADVGetWord[ADVPointer][0],"selectflag")==0){//旗艦選択
//出撃が決定している艦船の勘定
intA=0;
for(WSY=0;WSY<HaveMax;WSY++){
intA+=HaveUnitStatus[WSY];
}
//出撃することにしたユニット名をずらす量はADVGetWord[ADVPointer][1]に格納
WX=atoi(ADVGetWord[ADVPointer][2]);//選択肢の位置
WY=atoi(ADVGetWord[ADVPointer][3]);//選択肢の位置
//ユニットの数だけ繰り返し
for(WSY=0;WSY<HaveMax;WSY++){
if(strcmp(HaveUnitName[WSY],"")!=0){//ユニット名が空でなければ以下の行を実行
if(WordButton(WX+HaveUnitStatus[WSY]*atoi(ADVGetWord[ADVPointer][1]),WY+WSY*WSS,HaveUnitNameJ[WSY])==1){
//出撃設定切り替え
if(HaveUnitStatus[WSY]==0){//まだ出撃決定しておらず、
if(intA<1){//出撃可能な時(一隻しか出撃はできない)
if(!SoundSkip){PlaySound("./astudata/1.wav",NULL,SND_ASYNC);}//音
HaveUnitStatus[WSY]=1;
}else{//出撃不可の時
//エラー音
if(!SoundSkip){PlaySound("./astudata/74.wav",NULL,SND_ASYNC);}
}
}else if(HaveUnitStatus[WSY]==1){//出撃取りやめ
if(!SoundSkip){PlaySound("./astudata/2.wav",NULL,SND_ASYNC);}//音
HaveUnitStatus[WSY]=0;
}
}
}else{//ユニット名が空
break;//forループを抜ける
}
}
if(intA>0){//出撃する艦船が選ばれているとき
WX=atoi(ADVGetWord[ADVPointer][4]);//選択肢の位置
WY=atoi(ADVGetWord[ADVPointer][5]);//選択肢の位置
if(WordButton(WX,WY,"旗艦選択完了")==1){
if(!SoundSkip){PlaySound("./astudata/8.wav",NULL,SND_ASYNC);}//音
//出撃ユニットを初期化
for(intA=0;intA<FleetMax;intA++){
strcpy(FleetUnitName[intA],"");
}
//出撃を決定したユニットを入れる
for(intB=0;intB<HaveMax;intB++){
if((strcmp(HaveUnitName[intB],"")!=0)&(HaveUnitStatus[intB]!=0)){
strcpy(FleetUnitName[0],HaveUnitName[intB]);
strcpy(FleetUnitNameJ[0],HaveUnitNameJ[intB]);
}
}
ADVPointer++;//ポインターを進める
}
}
}else if(strcmp(ADVGetWord[ADVPointer][0],"makefile")==0){//ファイルを作る(既にある場合は上書き)
FF=fopen(ADVGetWord[ADVPointer][1],"w");//ファイルを開く
strcpy(FileValue,ADVGetWord[ADVPointer][2]);
fputs(FileValue,FF);
fclose(FF);
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"addfile")==0){//ファイルを作る(既にある場合は次の行へ追加)
FF=fopen(ADVGetWord[ADVPointer][1],"a");//ファイルを開く
strcpy(FileValue,ADVGetWord[ADVPointer][2]);
fputs("\n",FF);
fputs(FileValue,FF);
fclose(FF);
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"writefile")==0){//ファイル内容を表示する
FF=fopen(ADVGetWord[ADVPointer][1],"r");//ファイルを開く
if(FF!=NULL){//ファイル発見
while(feof(FF)==0){
fgets(FileValue,128,FF);//内容を取り込む
rt.left=CursorX;//文字開始X座標
rt.top=CursorY;//文字開始Y座標
rt.right=SurfaceData[m_cstSurfMoziSyori].bmWidth;
rt.bottom=SurfaceData[m_cstSurfMoziSyori].bmHeight;
//HaveUnitStatus[intA]=0;
DrawText( SurfaceHDC[m_cstSurfMoziSyori], FileValue, strlen(FileValue), &rt, DT_LEFT );
CursorY+=CursorStepY;//文字表示位置移動
}
}
fclose(FF);
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"searchfile")==0){//ファイルの有無および内容の確認
FF=fopen(ADVGetWord[ADVPointer][1],"r");//ファイルを開く
if(FF!=NULL){//ファイル発見
fgets(FileValue,128,FF);//内容を取り込む
fclose(FF);
if(strcmp(FileValue,ADVGetWord[ADVPointer][2])==0){//内容が等しかったら指定ラベルへ
//ラベル検索
for(intB=0;intB<ADVGetLineNum;intB++){
if((strcmp(ADVGetWord[intB][0],"label")==0)&(strcmp(ADVGetWord[intB][1],ADVGetWord[ADVPointer][3])==0)){
ADVPointer=intB;//ジャンプ
break;
}
}
}else{
ADVPointer++;//ポインターを進める
}
}else{//ファイル発見できず
//ファイルを開くのに失敗した時はログを作る
ERR=fopen("./ErrorLog.log","a");
fprintf(ERR,"FileNotFound in RunADV:");
fprintf(ERR,ADVGetWord[ADVPointer][1]);
fprintf(ERR,"\n");
fclose(ERR);
ADVPointer++;//ポインターを進める
}
//以下、標準装備
}else if(strcmp(ADVGetWord[ADVPointer][0],"soundskip")==0){//効果音設定
SoundSkip=atoi(ADVGetWord[ADVPointer][1]);
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"musicskip")==0){//効果音設定
MusicSkip=atoi(ADVGetWord[ADVPointer][1]);
if(!MusicSkip){
mciSendString("play MUSICFILE notify", NULL, 0, 0);
}else{
mciSendString("stop MUSICFILE", NULL, 0, 0);//音楽を閉じる
}
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"windowmode")==0){//画面設定
WindowMode=atoi(ADVGetWord[ADVPointer][1]);
switch(WindowMode){
case 0://通常画面にする
ShowWindow(WindowhWnd,SW_SHOWNORMAL);
break;
case 1://フルスクリーンにする
ShowWindow(WindowhWnd,SW_MAXIMIZE);
break;
}
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"rollon")==0){//自動送りオン
if(atoi(ADVGetWord[ADVPointer][1])>0){
RollMode=atoi(ADVGetWord[ADVPointer][1]);
RollCounter=RollMode;//カウンターに更新までの時間をセット
}
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"rolloff")==0){//自動送りオフ
RollMode=0;
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"locate")==0){//文字列表記位置変更
CursorX=atoi(ADVGetWord[ADVPointer][1]);
CursorY=atoi(ADVGetWord[ADVPointer][2]);
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"wait")==0){//クリックされるまで待機
if(RollMode==0){//自動送りがオフ
if(blnA==false){//まだマウスがクリックされていない時
if(MDF.LButton==1){
blnA=true;
}
}else{//クリックされた時
if(MDF.LButton==0){//マウスのボタンが上がったら、
//まず文字を消去して
BitBlt(SurfaceHDC[m_cstSurfMoziSyori],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfWhiteElase],0,0,SRCCOPY);
ADVPointer++;//ポインターを進める
blnA=false;
}
}
}else{//自動送りがオン
if(MDF.LButton==1){//ボタンが押された時
}else{
if(RollCounter==0){
RollCounter=RollMode;//改めて時間セット
//まず文字を消去して
BitBlt(SurfaceHDC[m_cstSurfMoziSyori],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfWhiteElase],0,0,SRCCOPY);
ADVPointer++;//ポインターを進める
}else{
RollCounter--;//時間減算
}
}
}
}else if(strcmp(ADVGetWord[ADVPointer][0],"goto")==0){//指令ラベルへ飛ぶ
//ラベル検索
for(intB=0;intB<ADVGetLineNum;intB++){
if((strcmp(ADVGetWord[intB][0],"label")==0)&(strcmp(ADVGetWord[intB][1],ADVGetWord[ADVPointer][1])==0)){
ADVPointer=intB;//ジャンプ
break;
}
}
}else if(strcmp(ADVGetWord[ADVPointer][0],"label")==0){//ラベル
//以下、このラベルへ飛んできた時にボタンを押しっぱなしだと処理がバグる問題を回避するための停止処理
if(MDF.LButton==0){//ボタンが押されていなければ、
ADVPointer++;//ポインターを進める
}
}else if(strcmp(ADVGetWord[ADVPointer][0],"back")==0){//背景変更
DeleteObject(SurfaceHDC[m_cstSurfHaikei]);//一度破棄
DeleteObject(Surface[m_cstSurfHaikei]);//一度クリア
strcpy(FullPath,"./astudata/");
strcat(FullPath,ADVGetWord[ADVPointer][1]);
strcat(FullPath,".bmp");
//再読み込み
Surface[m_cstSurfHaikei]=(HBITMAP) LoadImage(NULL,FullPath,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
SurfaceHDC[m_cstSurfHaikei]=CreateCompatibleDC(WindowHDC);//ウインドウのHDCと互換のHDCを作成
SelectObject(SurfaceHDC[m_cstSurfHaikei],Surface[m_cstSurfHaikei]);//デバイスコンテキストとサーフェスを結合
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"word")==0){//文字列表示
//GetClientRect( WindowhWnd, &rt );//画面サイズ取得
rt.left=CursorX;//文字開始X座標
rt.top=CursorY;//文字開始Y座標
rt.right=SurfaceData[m_cstSurfMoziSyori].bmWidth;
rt.bottom=SurfaceData[m_cstSurfMoziSyori].bmHeight;
DrawText( SurfaceHDC[m_cstSurfMoziSyori], ADVGetWord[ADVPointer][1], strlen(ADVGetWord[ADVPointer][1]), &rt, DT_LEFT );
CursorY+=CursorStepY;//文字表示位置移動
ADVPointer++;//ポインターを進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"drawbmp")==0){//追加描画
Kun2DrawFlag=1;
Kun2DrawX=atoi(ADVGetWord[ADVPointer][1]);
Kun2DrawY=atoi(ADVGetWord[ADVPointer][2]);
Kun2SrcX=atoi(ADVGetWord[ADVPointer][3]);
Kun2SrcY=atoi(ADVGetWord[ADVPointer][4]);
Kun2SrcWidth=atoi(ADVGetWord[ADVPointer][5])-Kun2SrcX;
Kun2SrcHeight=atoi(ADVGetWord[ADVPointer][6])-Kun2SrcY;
//まずマスク板に描画
BitBlt(SurfaceHDC[m_cstSurfFreeGraphicm],Kun2DrawX,Kun2DrawY,Kun2SrcWidth,Kun2SrcHeight,SurfaceHDC[m_cstSurfPlayorm],Kun2SrcX,Kun2SrcY,SRCAND);
//次にマスクではないほうの板にスプライト描画
BitBlt(SurfaceHDC[m_cstSurfFreeGraphic],Kun2DrawX,Kun2DrawY,Kun2SrcWidth,Kun2SrcHeight,SurfaceHDC[m_cstSurfPlayorm],Kun2SrcX,Kun2SrcY,SRCAND);
BitBlt(SurfaceHDC[m_cstSurfFreeGraphic],Kun2DrawX,Kun2DrawY,Kun2SrcWidth,Kun2SrcHeight,SurfaceHDC[m_cstSurfPlayor],Kun2SrcX,Kun2SrcY,SRCPAINT);
ADVPointer++;//行番号を進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"nodrawbmp")==0){//追加描画停止
//画像消去
BitBlt(SurfaceHDC[m_cstSurfFreeGraphicm],0,0,640,480,SurfaceHDC[m_cstSurfWhiteElase],0,0,SRCCOPY);
BitBlt(SurfaceHDC[m_cstSurfFreeGraphic],0,0,640,480,SurfaceHDC[m_cstSurfElase],0,0,SRCCOPY);
Kun2DrawFlag=0;
ADVPointer++;//行番号を進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"sound")==0){//音楽
if(!SoundSkip){PlaySound(ADVGetWord[ADVPointer][1],NULL,SND_ASYNC);}//音
ADVPointer++;//行番号を進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"music")==0){//音楽
mciSendString("close MUSICFILE", NULL, 0, 0);//音楽を閉じる
//パス作成
strcpy(SoundFile,"open \"./astudata/");
strcat(SoundFile,ADVGetWord[ADVPointer][1]);
strcat(SoundFile,"\" alias MUSICFILE");
mciSendString(SoundFile, NULL, 0, 0);
if(!MusicSkip){
mciSendString("play MUSICFILE notify", NULL, 0, 0);
}
ADVPointer++;//行番号を進める
}else if(strcmp(ADVGetWord[ADVPointer][0],"runkun2")==0){//戦闘
if(blnB==false){//まだゲームが初期化されていない時
Kun2BInit(ADVGetWord[ADVPointer][1]);//初期化とマップ読み込みとユニット消去
//自機と従属艦ロード
for(intA=0;intA<FleetMax;intA++){
if(strcmp(FleetUnitName[intA],"")!=0){
Unit[MeNumber+intA]=LoadUnitStatus(FleetUnitName[intA]);
Unit[MeNumber+intA].ID=0;//自機と従属艦のIDは0とする
Unit[MeNumber+intA].BeforeID=0;//自機と従属艦のIDは0とする
}
}
strcpy(Unit[MeNumber].SMethod[0],"s_end");//自機については設定したスクリプトの最初の行に終了命令を上書きし、スクリプトを動かさないようにする
//PlayorHPMax=Unit[MeNumber].HP;//最大HPを設定
WaveReset();//波リセット
//キーボードリセット
MDF.LRKey=0;
MDF.UDKey=0;
blnB=true;//初期化完了
}else{//初期化された時
intA=Kun2BRun(WindowHDC);//ゲーム進行・情報読み込み
WaveFileCounter=0;//効果音のインデックスをリセットする
if(intA==1){//勝利した時
Kun2BRelease();//戦闘終了処理
//ラベル検索
for(intB=0;intB<ADVGetLineNum;intB++){
if((strcmp(ADVGetWord[intB][0],"label")==0)&(strcmp(ADVGetWord[intB][1],ADVGetWord[ADVPointer][2])==0)){
ADVPointer=intB;//ジャンプ
break;
}
}
blnB=false;
}else if(intA==2){//敗北した時
Kun2BRelease();//戦闘終了処理
//ラベル検索
for(intB=0;intB<ADVGetLineNum;intB++){
if((strcmp(ADVGetWord[intB][0],"label")==0)&(strcmp(ADVGetWord[intB][1],ADVGetWord[ADVPointer][3])==0)){
ADVPointer=intB;//ジャンプ
break;
}
}
blnB=false;
}
}
}else if(strcmp(ADVGetWord[ADVPointer][0],"select")==0){//選択
WX=atoi(ADVGetWord[ADVPointer][2]);//選択肢の位置
WY=atoi(ADVGetWord[ADVPointer][3]);//選択肢の位置
//選択肢の数だけ繰り返し
for(WSY=0;WSY<atoi(ADVGetWord[ADVPointer][1]);WSY++){
if(WordButton(WX,WY+WSY*WSS,ADVGetWord[ADVPointer][4+WSY])==1){
if(!SoundSkip){PlaySound("./astudata/9.wav",NULL,SND_ASYNC);}//音
//ラベル検索
for(SR=0;SR<ADVGetLineNum;SR++){
if((strcmp(ADVGetWord[SR][0],"label")==0)&(strcmp(ADVGetWord[SR][1],ADVGetWord[ADVPointer][4+WSY])==0)){
ADVPointer=SR;//ジャンプ
break;
}
}
}
}
}else if(strcmp(ADVGetWord[ADVPointer][0],"call")==0){//サブルーチン呼び出し
SubLootinCallLine[SubLootinActivePointer]=ADVPointer;//呼び出し時の行番号を記録
SubLootinActivePointer+=1;//サブルーチン管理インデックスを一つ加算
strcpy(SubLootinName[SubLootinActivePointer],ADVGetWord[ADVPointer][1]);//呼び出すサブルーチンを記録
LoadADVScript(SubLootinName[SubLootinActivePointer]);//呼び出す
}else if(strcmp(ADVGetWord[ADVPointer][0],"end")==0){//終了(サブルーチンの場合は呼び出し元に戻る)
if(SubLootinActivePointer==0){//一番上のルーチンだった時
LoadADVScript("./astudata/format.dat");//初期状態に戻す
}else{
SubLootinActivePointer-=1;//管理番号を一つマイナスにする
LoadADVScript(SubLootinName[SubLootinActivePointer]);//呼び出し元のルーチンファイルを読み込む
ADVPointer=SubLootinCallLine[SubLootinActivePointer]+1;//呼び出し時の行番号+1にする(+1にしないと、再びサブルーチンが呼び出されてしまう)
}
}
if(blnB==false){//戦闘モードではない時
//全消去
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfElase],0,0,SRCCOPY);
//まず背景描画
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfHaikei],0,0,SRCCOPY);
if(Kun2DrawFlag==1){//追加描画
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,640,480,SurfaceHDC[m_cstSurfFreeGraphicm],0,0,SRCAND);
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,640,480,SurfaceHDC[m_cstSurfFreeGraphic],0,0,SRCPAINT);
}
//文字盤マスク
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfMozibanm],0,0,SRCAND);
//文字盤
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfMoziban],0,0,SRCPAINT);
//文字書き込み位置オフセット定数
const WShadowX1=-1;
const WShadowX2=+2;
const WShadowY1=-1;
const WShadowY2=+2;
//文字書き込み影
BitBlt(SurfaceHDC[m_cstSurfBack],WShadowX1,0,WindowWidth-WShadowX1,WindowHeight,SurfaceHDC[m_cstSurfMoziSyori],0,0,SRCAND);
BitBlt(SurfaceHDC[m_cstSurfBack],WShadowX2,0,WindowWidth-WShadowX2,WindowHeight,SurfaceHDC[m_cstSurfMoziSyori],0,0,SRCAND);
BitBlt(SurfaceHDC[m_cstSurfBack],0,WShadowY1,WindowWidth,WindowHeight-WShadowY1,SurfaceHDC[m_cstSurfMoziSyori],0,0,SRCAND);
BitBlt(SurfaceHDC[m_cstSurfBack],0,WShadowY2,WindowWidth,WindowHeight-WShadowY2,SurfaceHDC[m_cstSurfMoziSyori],0,0,SRCAND);
const WFrontX1=-0;
const WFrontX2=+1;
const WFrontY1=-0;
const WFrontY2=+1;
//文字書き込み
BitBlt(SurfaceHDC[m_cstSurfBack],WFrontX1,0,WindowWidth-WFrontX1,WindowHeight,SurfaceHDC[m_cstSurfMoziSyori],0,0,MERGEPAINT);
BitBlt(SurfaceHDC[m_cstSurfBack],WFrontX2,0,WindowWidth-WFrontX2,WindowHeight,SurfaceHDC[m_cstSurfMoziSyori],0,0,MERGEPAINT);
BitBlt(SurfaceHDC[m_cstSurfBack],0,WFrontY1,WindowWidth,WindowHeight-WFrontY1,SurfaceHDC[m_cstSurfMoziSyori],0,0,MERGEPAINT);
BitBlt(SurfaceHDC[m_cstSurfBack],0,WFrontY2,WindowWidth,WindowHeight-WFrontY2,SurfaceHDC[m_cstSurfMoziSyori],0,0,MERGEPAINT);
//文字ボタン影
BitBlt(SurfaceHDC[m_cstSurfBack],2,2,WindowWidth-2,WindowHeight-2,SurfaceHDC[m_cstSurfButtonWord],0,0,SRCAND);
//文字ボタン
BitBlt(SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfButtonWord],0,0,MERGEPAINT);
//文字ボタン領域消去
BitBlt(SurfaceHDC[m_cstSurfButtonWord],0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfWhiteElase],0,0,SRCCOPY);
if(WindowMode==1){//全画面表示
StretchBlt(WindowHDC,0,0,DeskTopWidth,DeskTopHeight,SurfaceHDC[m_cstSurfBack],0,0,WindowWidth,WindowHeight,SRCCOPY);
}else{//通常表示
BitBlt(WindowHDC,0,0,WindowWidth,WindowHeight,SurfaceHDC[m_cstSurfBack],0,0,SRCCOPY);
}
//ウインドウに描画
}
DeleteDC(SurfaceHDC[m_cstSurfPlayor]);//描画終了
DeleteDC(SurfaceHDC[m_cstSurfPlayorm]);//描画終了
DeleteDC(SurfaceHDC[m_cstSurfEnemy]);//描画終了
DeleteDC(SurfaceHDC[m_cstSurfEnemym]);//描画終了
DeleteObject(SurfaceHDC[m_cstSurfBack]);//描画終了
DeleteObject(SurfaceHDC[m_cstSurfElase]);//描画終了
DeleteObject(SurfaceHDC[m_cstSurfHaikei]);//描画終了
DeleteObject(SurfaceHDC[m_cstSurfTatie]);//描画終了
DeleteObject(SurfaceHDC[m_cstSurfTatiem]);//描画終了
DeleteObject(SurfaceHDC[m_cstSurfMoziban]);//描画終了
DeleteObject(SurfaceHDC[m_cstSurfMozibanm]);//描画終了
DeleteObject(SurfaceHDC[m_cstSurfMoziSyori]);//描画終了
DeleteObject(SurfaceHDC[m_cstSurfWhiteElase]);//描画終了
DeleteObject(SurfaceHDC[m_cstSurfFreeGraphic]);//描画終了
DeleteObject(SurfaceHDC[m_cstSurfFreeGraphicm]);//描画終了
DeleteDC(SurfaceHDC[m_cstSurfButtonWord]);//描画終了
DeleteObject(WFont);
}
void Kun2NInit(char *Map){//初期化処理
Surface[m_cstSurfBack]=(HBITMAP) LoadImage(NULL,"./astudata/format.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfBack], sizeof(BITMAP), &SurfaceData[m_cstSurfBack] );//幅と高さを取得する作業
Surface[m_cstSurfElase]=(HBITMAP) LoadImage(NULL,"./astudata/format.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfElase], sizeof(BITMAP), &SurfaceData[m_cstSurfElase] );//幅と高さを取得する作業
Surface[m_cstSurfPlayor]=(HBITMAP) LoadImage(NULL,"./astudata/playor.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfPlayor], sizeof(BITMAP), &SurfaceData[m_cstSurfPlayor] );//幅と高さを取得する作業
Surface[m_cstSurfPlayorm]=(HBITMAP) LoadImage(NULL,"./astudata/playorm.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfPlayorm], sizeof(BITMAP), &SurfaceData[m_cstSurfPlayorm] );//幅と高さを取得する作業
Surface[m_cstSurfEnemy]=(HBITMAP) LoadImage(NULL,"./astudata/enemy.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfEnemy], sizeof(BITMAP), &SurfaceData[m_cstSurfEnemy] );//幅と高さを取得する作業
Surface[m_cstSurfEnemym]=(HBITMAP) LoadImage(NULL,"./astudata/enemym.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfEnemym], sizeof(BITMAP), &SurfaceData[m_cstSurfEnemym] );//幅と高さを取得する作業
Surface[m_cstSurfHaikei]=(HBITMAP) LoadImage(NULL,"./astudata/format.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfHaikei], sizeof(BITMAP), &SurfaceData[m_cstSurfHaikei] );//幅と高さを取得する作業
Surface[m_cstSurfTatie]=(HBITMAP) LoadImage(NULL,"./astudata/format.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfTatie], sizeof(BITMAP), &SurfaceData[m_cstSurfTatie] );//幅と高さを取得する作業
Surface[m_cstSurfTatiem]=(HBITMAP) LoadImage(NULL,"./astudata/format.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfTatiem], sizeof(BITMAP), &SurfaceData[m_cstSurfTatiem] );//幅と高さを取得する作業
Surface[m_cstSurfMoziban]=(HBITMAP) LoadImage(NULL,"./astudata/moziban.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfMoziban], sizeof(BITMAP), &SurfaceData[m_cstSurfMoziban] );//幅と高さを取得する作業
Surface[m_cstSurfMozibanm]=(HBITMAP) LoadImage(NULL,"./astudata/mozibanm.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfMozibanm], sizeof(BITMAP), &SurfaceData[m_cstSurfMozibanm] );//幅と高さを取得する作業
Surface[m_cstSurfMoziSyori]=(HBITMAP) LoadImage(NULL,"./astudata/mozisyori.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfMoziSyori], sizeof(BITMAP), &SurfaceData[m_cstSurfMoziSyori] );//幅と高さを取得する作業
Surface[m_cstSurfWhiteElase]=(HBITMAP) LoadImage(NULL,"./astudata/mozisyori.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfWhiteElase], sizeof(BITMAP), &SurfaceData[m_cstSurfWhiteElase] );//幅と高さを取得する作業
Surface[m_cstSurfFreeGraphic]=(HBITMAP) LoadImage(NULL,"./astudata/format.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfFreeGraphic], sizeof(BITMAP), &SurfaceData[m_cstSurfFreeGraphic] );//幅と高さを取得する作業
Surface[m_cstSurfFreeGraphicm]=(HBITMAP) LoadImage(NULL,"./astudata/mozisyori.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfFreeGraphicm], sizeof(BITMAP), &SurfaceData[m_cstSurfFreeGraphicm] );//幅と高さを取得する作業
Surface[m_cstSurfButtonWord]=(HBITMAP) LoadImage(NULL,"./astudata/mozisyori.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);// インターフェイスビットマップをロード
GetObject( Surface[m_cstSurfButtonWord], sizeof(BITMAP), &SurfaceData[m_cstSurfButtonWord] );//幅と高さを取得する作業
strcpy(SubLootinName[0],"./astudata/format.dat");//サブルーチンを呼び出すときの記録情報を入れる
LoadADVScript("./astudata/format.dat");//アドベンチャーパートのスクリプトをロード
}
void Kun2NRelease(){//終了処理
DeleteObject(Surface[m_cstSurfBack]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfElase]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfPlayor]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfPlayorm]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfEnemy]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfEnemym]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfHaikei]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfTatie]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfTatiem]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfMoziban]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfMozibanm]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfMoziSyori]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfWhiteElase]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfFreeGraphic]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfFreeGraphicm]);// インターフェイスビットマップをクリア
DeleteObject(Surface[m_cstSurfButtonWord]);// インターフェイスビットマップをクリア
}
//ウインドウ////////////////////////////////////////////////////////////////////////////
HDC hdc;
PAINTSTRUCT ps;
// ウインドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
int WCmd;//ウインドウ調整の情報を確認するために使う変数
// メッセージの種類に応じて処理を分岐します。
switch (message)
{
case WM_SYSCOMMAND:
WCmd= static_cast<int>(wParam & 0xfff0);//wParamから受け取る情報の種類を取得
//もしフルスクリーンモードで、なおかつウインドウの調整の命令だったら何もせずにクラスを離脱
if(WindowMode==1){
if ((WCmd == SC_MOVE) | (WCmd == SC_RESTORE) | (WCmd == SC_TASKLIST)){
return 0;
}
}
//それ以外の命令ならばデフォルトの処理を行う
return DefWindowProc(hWnd, message, wParam, lParam);
case WM_MOUSEMOVE:
if(WindowMode==1){//全画面表示
MDF.X=int(float(LOWORD(lParam))*(float(WindowWidth)/float(DeskTopWidth)));
MDF.Y=int(float(HIWORD(lParam))*(float(WindowHeight)/float(DeskTopHeight)));
}else{
MDF.X=LOWORD(lParam);
MDF.Y=HIWORD(lParam);
}
return 0;
case WM_LBUTTONDOWN:
MDF.LButton=1;
return 0;
case WM_LBUTTONUP:
MDF.LButton=0;
return 0;
case WM_RBUTTONDOWN:
MDF.RButton=1;
return 0;
case WM_RBUTTONUP:
MDF.RButton=0;
return 0;
case WM_KEYDOWN:
switch(wParam){
case 37://左
MDF.LRKey=-32;
break;
case 38://上
MDF.UDKey=-32;
break;
case 39://右
MDF.LRKey=+32;
break;
case 40://下
MDF.UDKey=+32;
break;
}
return 0;
case WM_KEYUP:
switch(wParam){
case 37://左
MDF.LRKey=0;
break;
case 38://上
MDF.UDKey=0;
break;
case 39://右
MDF.LRKey=0;
break;
case 40://下
MDF.UDKey=0;
break;
}
return 0;
case WM_PAINT:
return 0;
case WM_DESTROY:
// ウインドウが破棄されたときの処理
PostQuitMessage(0);
return 0;
default:
// デフォルトの処理
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
// エントリポイント
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
//sleep(100);
WNDCLASSEX wcex; // ウインドウクラス構造体
HWND hWnd; // ウインドウハンドル
MSG msg; // メッセージ構造体
// ウィンドウクラス構造体を設定します。
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon=LoadIcon(NULL,(LPCTSTR)ICON_KUN2);
wcex.hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(CURSOR_KUN2));
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "ModelApp";
wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
//wcex.hIconSm = LoadIcon(NULL, (LPCTSTR)ICON_KUNS);
// ウインドウクラスを登録します。
RegisterClassEx(&wcex);
// ウインドウを作成します。
hWnd = CreateWindow(wcex.lpszClassName, // ウインドウクラス名
"", // キャプション文字列
WS_CAPTION|WS_SYSMENU, // ウインドウのスタイル
//0, // 水平位置
//0, // 垂直位置
//WindowWidth, // 幅
//WindowHeight, // 高さ
CW_USEDEFAULT, // 水平位置
CW_USEDEFAULT, // 垂直位置
640, // 幅
500, // 高さ
NULL, // 親ウインドウ
NULL, // ウインドウメニュー
hInstance, // インスタンスハンドル
NULL); // WM_CREATE情報
// ウインドウを表示します。
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
Kun2NInit("");//ゲームそのものの初期化処理(具体的に、ビットマップの読み込みと、アドベンチャーパートのスクリプトの最初に読み込むデータを取り出す)
hdc = BeginPaint (hWnd, &ps);//「絵画のために指定されたウィンドウを準備し、PAINTSTRUCT構造を絵画に関する情報で満たします。」
//常に手前に表示する設定デバッグ時は止めた方が良い
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
// メッセージループ
while( msg.message!=WM_QUIT )
{
//「スレッドのメッセージキューにメッセージがあるかどうかをチェックし、もしあれば、指定された構造体にそのメッセージを格納します。」
//とヘルプにある処理を行い、もし0が帰ってきたら下の行から、それ以外はelse文から下を処理する
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ){
RunADV(hWnd,hdc);//アドベンチャーパートを動かす
TranslateMessage( &msg );//「仮想キーメッセージを文字メッセージに変換します。」
DispatchMessage( &msg );//「ウィンドウプロシージャにメッセージをディスパッチ (送出) します。」
}else{
RunADV(hWnd,hdc);//アドベンチャーパートを動かす
}
if(!MusicSkip){//音楽再生をONにしている場合
//音楽の再生状況確認
char CharGS[31];//MCIの受信メッセージを入れる文字列変数
mciSendString("status MUSICFILE mode",CharGS,31,0);//メッセージを送って再生状況を受け取る
if(strcmp(CharGS,"stopped")==0){//停止中だった場合
mciSendString("play MUSICFILE from 0", NULL, 0, 0);//音楽を再生する命令
}
}
}
EndPaint( hWnd, &ps );//「指定されたウィンドウで描く終了を示します。」
Kun2NRelease();//終了処理(具体的にKun2NInitで初期化したSurface変数の情報を削除する)
// 戻り値を返します。
return msg.wParam;
}