• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


Commit MetaInfo

Revision267 (tree)
Zeit2021-03-03 03:29:33
Autorxops-mikan

Log Message

exeのコマンド引数で直接.mifを指定して起動できるように、コンソールのmifコマンドの表示を修正。

Ändern Zusammenfassung

Diff

--- trunk/datafile.cpp (revision 266)
+++ trunk/datafile.cpp (revision 267)
@@ -736,6 +736,23 @@
736736 }
737737 }
738738
739+#ifdef ENABLE_AUTOLOADMIF
740+ //ドライブレターから指定されている(=フルパス)ならば
741+ if( fname[1] == ':' ){
742+ char path[MAX_PATH];
743+
744+ //mifのディレクトリ取得
745+ GetFileDirectory(fname, path);
746+
747+ //各ファイルパスをフルパスに書き換える
748+ ChangeExePathToFullPath(path, blockfile_path);
749+ ChangeExePathToFullPath(path, pointfile_path);
750+ ChangeExePathToFullPath(path, picturefileA_path);
751+ ChangeExePathToFullPath(path, picturefileB_path);
752+ ChangeExePathToFullPath(path, addsmallobject_path);
753+ }
754+#endif
755+
739756 #ifdef ENABLE_DEBUGLOG
740757 //ログに出力
741758 OutputLog.WriteLog(LOG_COMPLETE, "", "");
@@ -763,6 +780,23 @@
763780 }
764781 #endif
765782
783+#ifdef ENABLE_AUTOLOADMIF
784+ //ドライブレターから指定されている(=フルパス)ならば
785+ if( fname[1] == ':' ){
786+ char path[MAX_PATH];
787+
788+ //mifのディレクトリ取得
789+ GetFileDirectory(fname, path);
790+
791+ //各ファイルパスをフルパスに書き換える
792+ for(int i=0; i<MAX_ADDSMALLOBJECT; i++){
793+ ChangeExePathToFullPath(path, AddSmallObjectData[i].modelpath);
794+ ChangeExePathToFullPath(path, AddSmallObjectData[i].texturepath);
795+ ChangeExePathToFullPath(path, AddSmallObjectData[i].soundpath);
796+ }
797+ }
798+#endif
799+
766800 return 0;
767801 }
768802
@@ -1010,6 +1044,49 @@
10101044 return 1;
10111045 }
10121046
1047+//! @brief addonフォルダを参照する相対パスを.exe基準→.mif基準へ変更
1048+//! @param dir .mifファイルまでのフルパス
1049+//! @param fname 処理対象のファイルパス
1050+//! @return 変換済み:true 未変換:false
1051+//! @attention fnameのポインタを直接書き換えます。
1052+bool MIFInterface::ChangeExePathToFullPath(char *dir, char *fname)
1053+{
1054+ char str[MAX_PATH];
1055+ int index = 0;
1056+
1057+ //無効なファイルパスならば処理しない
1058+ if( strcmp(fname, "") == 0 ){ return false; }
1059+ if( strcmp(fname, "!") == 0 ){ return false; }
1060+
1061+ //addonフォルダ内を参照しているか判定
1062+ strcpy(str, "addon");
1063+ if( memcmp(fname, str, strlen(str)) == 0 ){ index = strlen(str); }
1064+ strcpy(str, "\\addon");
1065+ if( memcmp(fname, str, strlen(str)) == 0 ){ index = strlen(str); }
1066+ strcpy(str, "/addon");
1067+ if( memcmp(fname, str, strlen(str)) == 0 ){ index = strlen(str); }
1068+ strcpy(str, ".\\addon");
1069+ if( memcmp(fname, str, strlen(str)) == 0 ){ index = strlen(str); }
1070+ strcpy(str, "./addon");
1071+ if( memcmp(fname, str, strlen(str)) == 0 ){ index = strlen(str); }
1072+
1073+ //addonフォルダ内を参照しているならば
1074+ if( index != 0 ){
1075+ //合成後の文字数がMAX_PATHを超えるようなら処理中断
1076+ if( strlen(dir)+strlen(fname)-index+1 >= MAX_PATH -1 ){ return false; }
1077+
1078+ //addonの文字を除去
1079+ strcpy(str, fname);
1080+ for(int i=0; i<(int)strlen(str)-index+1; i++){ str[i] = str[i+index]; }
1081+
1082+ //.mifまでのパス+処理対象のファイルパス
1083+ strcpy(fname, dir);
1084+ strcat(fname, str);
1085+ return true;
1086+ }
1087+ return false;
1088+}
1089+
10131090 //! @brief 読み込んだデータファイルの形式を取得
10141091 //! @return 標準形式:false MIF形式:true
10151092 //! @attention ファイルを正常に読み込んだ後に実行してください。
--- trunk/datafile.h (revision 266)
+++ trunk/datafile.h (revision 267)
@@ -177,6 +177,7 @@
177177 int LoadDefaultTextFiledata(char *fname);
178178 int LoadMissionInfoFiledata(char *fname);
179179 int LoadAddSmallObjectFiledata(char *fname);
180+ bool ChangeExePathToFullPath(char *dir, char *fname);
180181
181182 public:
182183 MIFInterface();
--- trunk/gamemain.cpp (revision 266)
+++ trunk/gamemain.cpp (revision 267)
@@ -58,7 +58,7 @@
5858
5959
6060 //! @brief 基本的な初期化処理
61-int InitGame(WindowControl *WindowCtrl)
61+int InitGame(WindowControl *WindowCtrl, int mode, char *MIFpath)
6262 {
6363 //D3DGraphicsクラス初期化
6464 if( d3dg.InitD3D(WindowCtrl, "data\\char.dds", GameConfig.GetFullscreenFlag()) ){
@@ -114,7 +114,23 @@
114114 //addonリスト作成
115115 GameAddon.LoadFiledata("addon\\");
116116
117- GameInfoData.selectaddon = false;
117+ if( (mode != 0)&&(MIFpath != NULL) ){
118+ //起動するミッション設定
119+ GameInfoData.selectmission_id = -1;
120+ strcpy(GameInfoData.mifpath, MIFpath);
121+ GameState.SetStateMode(mode);
122+ if( mode == 2 ){
123+ //mifファイルを読み込み
124+ if( MIFdata.LoadFiledata(MIFpath) != 0 ){
125+ WindowCtrl->ErrorInfo("briefing data open failed");
126+ return 1;
127+ }
128+ }
129+ }
130+ else{
131+ GameInfoData.selectmission_id = 0;
132+ strcpy(GameInfoData.mifpath, "");
133+ }
118134
119135 return 0;
120136 }
@@ -592,7 +608,7 @@
592608 //スクロールバーを処理し情報取得
593609 int scrollitems;
594610 int totalmission;
595- if( GameInfoData.selectaddon == false ){
611+ if( GameInfoData.selectmission_id >= 0 ){
596612 scrollbar_official.Input(mainmenu_mouseX, mainmenu_mouseY, inputCtrl->CheckMouseButtonNowL(), mainmenu_mouseY - mainmenu_mouseY_old);
597613 scrollitems = scrollbar_official.GetScrollItem();
598614 totalmission = TOTAL_OFFICIALMISSION;
@@ -608,16 +624,24 @@
608624 for(int i=0; i<TOTAL_MENUITEMS; i++){
609625 char name[32];
610626 strcpy(name, "");
611- if( GameInfoData.selectaddon == false ){
627+ if( GameInfoData.selectmission_id >= 0 ){
612628 GameParamInfo.GetOfficialMission(scrollitems + i, name, NULL, NULL, NULL, NULL, NULL);
629+
630+ if( (MAINMENU_X < mainmenu_mouseX)&&(mainmenu_mouseX < (MAINMENU_X+(signed)strlen(name)*20))&&(MAINMENU_Y+30 + i*30 < mainmenu_mouseY)&&(mainmenu_mouseY < MAINMENU_Y+30 + i*30 + 26) ){
631+ GameInfoData.selectmission_id = scrollitems + i;
632+ strcpy(GameInfoData.mifpath, "");
633+ GameState->PushMouseButton();
634+ }
613635 }
614636 else{
615637 strcpy(name, GameAddon.GetMissionName(scrollitems + i));
616- }
617638
618- if( (MAINMENU_X < mainmenu_mouseX)&&(mainmenu_mouseX < (MAINMENU_X+(signed)strlen(name)*20))&&(MAINMENU_Y+30 + i*30 < mainmenu_mouseY)&&(mainmenu_mouseY < MAINMENU_Y+30 + i*30 + 26) ){
619- GameInfoData.selectmission_id = scrollitems + i;
620- GameState->PushMouseButton();
639+ if( (MAINMENU_X < mainmenu_mouseX)&&(mainmenu_mouseX < (MAINMENU_X+(signed)strlen(name)*20))&&(MAINMENU_Y+30 + i*30 < mainmenu_mouseY)&&(mainmenu_mouseY < MAINMENU_Y+30 + i*30 + 26) ){
640+ GameInfoData.selectmission_id = -1;
641+ strcpy(GameInfoData.mifpath, "addon\\");
642+ strcat(GameInfoData.mifpath, GameAddon.GetFileName(scrollitems + i));
643+ GameState->PushMouseButton();
644+ }
621645 }
622646 }
623647 }
@@ -625,7 +649,7 @@
625649 if( inputCtrl->CheckMouseButtonUpL() ){
626650 // UP
627651 if( (MAINMENU_X < mainmenu_mouseX)&&(mainmenu_mouseX < (MAINMENU_X+340))&&(MAINMENU_Y < mainmenu_mouseY)&&(mainmenu_mouseY < MAINMENU_Y+30) ){
628- if( GameInfoData.selectaddon == false ){
652+ if( GameInfoData.selectmission_id >= 0 ){
629653 scrollbar_official.ScrollUP();
630654 }
631655 else{
@@ -635,7 +659,7 @@
635659
636660 // DOWN
637661 if( (MAINMENU_X < mainmenu_mouseX)&&(mainmenu_mouseX < (MAINMENU_X+340))&&((MAINMENU_Y+MAINMENU_H-55) < mainmenu_mouseY)&&(mainmenu_mouseY < (MAINMENU_Y+MAINMENU_H-55+30)) ){
638- if( GameInfoData.selectaddon == false ){
662+ if( GameInfoData.selectmission_id >= 0 ){
639663 scrollbar_official.ScrollDOWN();
640664 }
641665 else{
@@ -647,13 +671,13 @@
647671 //標準ミッションとアドオンリストの切り替え
648672 if( inputCtrl->CheckMouseButtonUpL() ){
649673 if( (MAINMENU_X < mainmenu_mouseX)&&(mainmenu_mouseX < (MAINMENU_X+340))&&((MAINMENU_Y+MAINMENU_H-25) < mainmenu_mouseY)&&(mainmenu_mouseY < (MAINMENU_Y+MAINMENU_H-2)) ){
650- if( GameInfoData.selectaddon == false ){
674+ if( GameInfoData.selectmission_id >= 0 ){
651675 if( GameAddon.GetTotaldatas() > 0 ){
652- GameInfoData.selectaddon = true;
676+ GameInfoData.selectmission_id = -1;
653677 }
654678 }
655679 else{
656- GameInfoData.selectaddon = false;
680+ GameInfoData.selectmission_id = 0;
657681 }
658682 }
659683 }
@@ -739,7 +763,7 @@
739763 //スクロールバーの情報を取得
740764 int scrollitems;
741765 int totalmission;
742- if( GameInfoData.selectaddon == false ){
766+ if( GameInfoData.selectmission_id >= 0 ){
743767 scrollitems = scrollbar_official.GetScrollItem();
744768 totalmission = TOTAL_OFFICIALMISSION;
745769 }
@@ -757,7 +781,7 @@
757781 }
758782
759783 //スクロールバー描画
760- if( GameInfoData.selectaddon == false ){
784+ if( GameInfoData.selectmission_id >= 0 ){
761785 scrollbar_official.Draw(d3dg);
762786 }
763787 else{
@@ -803,7 +827,7 @@
803827 }
804828
805829 //標準ミッションとaddon切り替え
806- if( GameInfoData.selectaddon == false ){
830+ if( GameInfoData.selectmission_id >= 0 ){
807831 //addonがあれば
808832 if( GameAddon.GetTotaldatas() > 0 ){
809833 //文字の色を設定
@@ -842,7 +866,7 @@
842866 strcpy(name, "");
843867
844868 //ミッション名を取得
845- if( GameInfoData.selectaddon == false ){
869+ if( GameInfoData.selectmission_id >= 0 ){
846870 GameParamInfo.GetOfficialMission(scrollitems + i, name, NULL, NULL, NULL, NULL, NULL);
847871 }
848872 else{
@@ -1533,14 +1557,13 @@
15331557 gametitle = d3dg->LoadTexture("data\\title.dds", false, false);
15341558
15351559 //mifファイルのファイルパス取得
1536- if( GameInfoData.selectaddon == false ){
1560+ if( GameInfoData.selectmission_id >= 0 ){
15371561 GameParamInfo.GetOfficialMission(GameInfoData.selectmission_id, NULL, NULL, path, pdata, NULL, NULL);
15381562 strcat(path, pdata);
15391563 strcat(path, ".txt");
15401564 }
15411565 else{
1542- strcpy(path, "addon\\");
1543- strcat(path, GameAddon.GetFileName(GameInfoData.selectmission_id));
1566+ strcpy(path, GameInfoData.mifpath);
15441567 }
15451568
15461569 //mifファイルを読み込み
@@ -1672,6 +1695,12 @@
16721695 maingame::~maingame()
16731696 {}
16741697
1698+//! @brief 座標などを表示するデバックモードのフラグ設定
1699+void maingame::SetShowInfoFlag(bool flag)
1700+{
1701+ ShowInfo_Debugmode = flag;
1702+}
1703+
16751704 //! @brief ゲームの実行速度を取得
16761705 int maingame::GetGameSpeed()
16771706 {
@@ -1680,7 +1709,7 @@
16801709
16811710 int maingame::Create()
16821711 {
1683- MainGameInfo = GameInfoData;
1712+ memcpy(&MainGameInfo, &GameInfoData, sizeof(GameInfo));
16841713 char path[MAX_PATH];
16851714 char bdata[MAX_PATH];
16861715 char pdata[MAX_PATH];
@@ -2558,7 +2587,7 @@
25582587 }
25592588 if( end_framecnt == 1 ){ //ミッション終了直後ならば
25602589 MainGameInfo.framecnt = framecnt;
2561- GameInfoData = MainGameInfo; //全てコピー
2590+ memcpy(&GameInfoData, &MainGameInfo, sizeof(GameInfo)); //全てコピー
25622591 end_framecnt += 1;
25632592 }
25642593 else if( end_framecnt > 0 ){ //ミッション終了中ならば
@@ -3634,17 +3663,27 @@
36343663
36353664 //MIFの情報表示
36363665 if( strcmp(NewCommand, "mif") == 0 ){
3637- bool AddonFlag = GameInfoData.selectaddon;
3666+ bool AddonFlag;
36383667 int MissionID = GameInfoData.selectmission_id;
36393668 char str2[MAX_PATH];
36403669 char str3[MAX_PATH];
36413670 bool collisionflag, screenflag;
36423671
3672+ if( GameInfoData.selectmission_id >= 0 ){ AddonFlag = false; }
3673+ else{ AddonFlag = true; }
3674+
36433675 //ヘッダー
36443676 if( AddonFlag == true ){ sprintf(str, "[Addon Mission] (MissionID:%d)", MissionID); }
36453677 else{ sprintf(str, "[Standard Mission] (MissionID:%d)", MissionID); }
36463678 AddInfoConsole(d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), str);
36473679
3680+ //MIFファイルパス
3681+ strcpy(str, "MIFpath : ");
3682+ strcpy(str2, GameInfoData.mifpath);
3683+ str2[(MAX_CONSOLELEN - strlen(str) - 1)] = '\0';
3684+ strcat(str, str2);
3685+ AddInfoConsole(d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), str);
3686+
36483687 //ミッション識別名
36493688 strcpy(str, "Name : ");
36503689 if( AddonFlag == true ){ strcpy(str2, MIFdata.GetMissionName()); }
@@ -3713,7 +3752,7 @@
37133752
37143753 //ブロックデータの情報
37153754 if( strcmp(NewCommand, "bd1") == 0 ){
3716- bool AddonFlag = GameInfoData.selectaddon;
3755+ bool AddonFlag;
37173756 int MissionID = GameInfoData.selectmission_id;
37183757 char str2[MAX_PATH];
37193758 char str3[MAX_PATH];
@@ -3722,6 +3761,9 @@
37223761 char flagstr1[4];
37233762 char flagstr2[4];
37243763
3764+ if( GameInfoData.selectmission_id >= 0 ){ AddonFlag = false; }
3765+ else{ AddonFlag = true; }
3766+
37253767 //ファイル名表示
37263768 strcpy(str, "Filename : ");
37273769 if( AddonFlag == true ){
@@ -3762,7 +3804,7 @@
37623804
37633805 //ポイントデータの情報
37643806 if( strcmp(NewCommand, "pd1") == 0 ){
3765- bool AddonFlag = GameInfoData.selectaddon;
3807+ bool AddonFlag;
37663808 int MissionID = GameInfoData.selectmission_id;
37673809 char str2[MAX_PATH];
37683810 char str3[MAX_PATH];
@@ -3775,6 +3817,9 @@
37753817 int PathPoints = 0;
37763818 int EventPoints = 0;
37773819
3820+ if( GameInfoData.selectmission_id >= 0 ){ AddonFlag = false; }
3821+ else{ AddonFlag = true; }
3822+
37783823 //ファイル名表示
37793824 strcpy(str, "Filename : ");
37803825 if( AddonFlag == true ){
--- trunk/gamemain.h (revision 266)
+++ trunk/gamemain.h (revision 267)
@@ -97,13 +97,13 @@
9797 #define CONSOLE_PROMPT ">" //!< デバック用コンソールのプロンプト
9898 #endif
9999
100-int InitGame(WindowControl *WindowCtrl);
100+int InitGame(WindowControl *WindowCtrl, int mode, char *MIFpath);
101101 void CleanupGame();
102102
103103 //! ゲームの状態を受け渡しする構造体
104104 struct GameInfo{
105- bool selectaddon; //!< addonを選択
106105 int selectmission_id; //!< 選択されたミッション
106+ char mifpath[MAX_PATH]; //!< MIFファイルのパス
107107 bool missioncomplete; //!< ミッション完了
108108 unsigned int framecnt; //!< フレーム数
109109 int fire; //!< 射撃回数
@@ -290,6 +290,7 @@
290290 public:
291291 maingame();
292292 ~maingame();
293+ void SetShowInfoFlag(bool flag);
293294 int GetGameSpeed();
294295 int Create();
295296 int Recovery();
--- trunk/main.cpp (revision 266)
+++ trunk/main.cpp (revision 267)
@@ -60,6 +60,14 @@
6060 UNREFERENCED_PARAMETER(hInstance);
6161 UNREFERENCED_PARAMETER(lpCmdLine);
6262
63+ char path[MAX_PATH];
64+
65+#ifdef ENABLE_AUTOLOADMIF
66+ bool NoBriefingFlag = false;
67+ int gamemode = 0;
68+ strcpy(path, "");
69+#endif
70+
6371 //乱数初期化
6472 InitRand();
6573
@@ -68,34 +76,65 @@
6876 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
6977
7078 //実行ファイルのある場所を、カレントディレクトリにする。
71- char path[MAX_PATH];
7279 GetModuleFileName(NULL, path, MAX_PATH);
7380 PathRemoveFileSpec(path);
7481 SetCurrentDirectory(path);
7582
76- //char str[24];
77- //GameConfig.GetPlayerName(str);
78- //MessageBox(NULL, str, "プレイヤー名", MB_OK);
7983 char str[255];
8084 strcpy(str, "[Information]\nThe compiler is the Debug mode.\nIf release the software, Switch compiler to Release mode.");
8185 MessageBox(NULL, str, GAMENAME, MB_OK);
8286 #endif
8387
88+ //引数処理
89+ //メモ:Windows環境なら、lpCmdLine引数とかGetCommandLine()関数でも取れますけどね・・。
90+ strcpy(path, "");
91+ if( __argc > 1 ){
92+ for(int param=1; param<__argc; param++){
8493 #ifdef ENABLE_DEBUGLOG
85- //メモ:Windows環境なら、lpCmdLine引数とかGetCommandLine()関数でも取れますけどね・・。
94+ //"Log"が与えられていたら、ログ出力を有効化
95+ if( (strcmp(__argv[param], "-Log") == 0)||(strcmp(__argv[param], "/Log") == 0)||
96+ (strcmp(__argv[param], "-log") == 0)||(strcmp(__argv[param], "/log") == 0)
97+ ){
98+ //ファイル作成
99+ OutputLog.MakeLog();
86100
87- //引数を分解
88- for(int i=0; i<__argc; i++){
101+ MainWindow.ErrorInfo("Enable Debug Log...");
102+ continue;
103+ }
104+#endif
89105
90- //"log"が与えられていたら、ログ出力を有効化
91- if( strcmp(__argv[i], "log") == 0 ){
92- //ファイル作成
93- OutputLog.MakeLog();
106+#ifdef ENABLE_AUTOLOADMIF
107+ //"NoBriefing"が与えられていたら、(.mif指定時は)ブリーフィングを省略する
108+ if( (strcmp(__argv[param], "-NoBriefing") == 0)||(strcmp(__argv[param], "/NoBriefing") == 0)||
109+ (strcmp(__argv[param], "-nobriefing") == 0)||(strcmp(__argv[param], "/bobriefing") == 0)
110+ ){
111+ NoBriefingFlag = true;
112+ continue;
113+ }
94114
95- MainWindow.ErrorInfo("Enable Debug Log...");
115+ //それ以外の引数ならば拡張子を取り出してみる
116+ for(int i=strlen(__argv[param])-1; i>0; i--){
117+ if( __argv[param][i] == '.' ){
118+ if( strcmp(&(__argv[param][i]), ".mif") == 0 ){
119+ //.mifであればファイルパスとして記憶
120+ strcpy(path, __argv[param]);
121+ }
122+ break;
123+ }
124+ }
125+#endif
96126 }
127+
128+#ifdef ENABLE_AUTOLOADMIF
129+ //何かしらの.mifが指定されているならば、ブリーフィングフラグ反映
130+ if( path[0] != '\0' ){
131+ if( NoBriefingFlag == false ){ gamemode = 1; }
132+ else{ gamemode = 2; }
133+ }
134+#endif
97135 }
98136
137+#ifdef ENABLE_DEBUGLOG
99138 //ユーザー環境を出力
100139 GetOperatingEnvironment();
101140
@@ -152,7 +191,11 @@
152191 MainWindow.InitWindow(GAMENAME, SCREEN_WIDTH, SCREEN_HEIGHT, GameConfig.GetFullscreenFlag());
153192
154193 //基本的な初期化処理
155- if( InitGame(&MainWindow) ){
194+#ifdef ENABLE_AUTOLOADMIF
195+ if( InitGame(&MainWindow, gamemode, path) ){
196+#else
197+ if( InitGame(&MainWindow, 0, "") ){
198+#endif
156199 return 1;
157200 }
158201
@@ -163,7 +206,12 @@
163206 result Result;
164207 InitScreen(&MainWindow, &Opening, &MainMenu, &Briefing, &MainGame, &Result);
165208
209+#ifdef ENABLE_AUTOLOADMIF
210+ //メインゲームのみ表示するモードならば、標準でデバック表示を有効にする。
211+ if( gamemode == 2 ){ MainGame.SetShowInfoFlag(true); }
212+#endif
166213
214+
167215 #ifdef ENABLE_DEBUGLOG
168216 //ログに出力
169217 OutputLog.WriteLog(LOG_CHECK, "起動", "メインループ突入");
--- trunk/main.h (revision 266)
+++ trunk/main.h (revision 267)
@@ -73,6 +73,7 @@
7373 #define ENABLE_MENUOPTIONS //!< メニューにオプション画面追加(コメント化で機能無効)
7474 //#define ENABLE_AUTOCREATECONFIG //!< config.datが見つからない場合、同ファイルを自動生成する。
7575 //#define ENABLE_PATH_DELIMITER_SLASH //!< パス区切り文字を、'\'から‘/’へ変換する。
76+#define ENABLE_AUTOLOADMIF //!< .mifが引数に指定された場合、自動的にロードする(コメント化で機能無効)
7677
7778 //windows.hを使用しないならば
7879 #ifndef _MAX_PATH
--- trunk/statemachine.cpp (revision 266)
+++ trunk/statemachine.cpp (revision 267)
@@ -34,6 +34,7 @@
3434 //! @brief コンストラクタ
3535 StateMachine::StateMachine()
3636 {
37+ StateMode = 0;
3738 NowState = STATE_CREATE_OPENING;
3839 back = false;
3940 f12 = false;
@@ -43,95 +44,206 @@
4344 StateMachine::~StateMachine()
4445 {}
4546
47+//! @brief 状態遷移モードを設定
48+//! @param mode 通常:0、ブリーフィング/メイン画面/結果表示のみ:1、メイン画面のみ:2
49+//! @warning プログラムメインループ実行前に設定してください。
50+//! @warning メインループ中に実行すると、状態遷移が正しく動作せずクラッシュする場合があります。
51+void StateMachine::SetStateMode(int mode)
52+{
53+ if( mode == 1 ){
54+ StateMode = mode;
55+ NowState = STATE_CREATE_BRIEFING;
56+ }
57+ else if( mode == 2 ){
58+ StateMode = mode;
59+ NowState = STATE_CREATE_MAINGAME;
60+ }
61+ else{
62+ StateMode = 0;
63+ NowState = STATE_CREATE_OPENING;
64+ }
65+}
66+
4667 //! @brief 次の状態へ移行
4768 void StateMachine::NextState()
4869 {
49- switch(NowState){
50- case STATE_CREATE_OPENING:
51- NowState = STATE_NOW_OPENING;
52- break;
53- case STATE_NOW_OPENING:
54- NowState = STATE_DESTROY_OPENING;
55- break;
56- case STATE_DESTROY_OPENING:
57- if( f12 == true ){
58- NowState = STATE_CREATE_OPENING;
59- }
60- else{
61- NowState = STATE_CREATE_MENU;
62- }
63- break;
64- case STATE_CREATE_MENU:
65- NowState = STATE_NOW_MENU;
66- break;
67- case STATE_NOW_MENU:
68- NowState = STATE_DESTROY_MENU;
69- break;
70- case STATE_DESTROY_MENU:
71- if( f12 == true ){
72- NowState = STATE_CREATE_MENU;
73- }
74- else if( back == false ){
75- NowState = STATE_CREATE_BRIEFING;
76- }
77- else{
70+ if( StateMode == 0 ){
71+ //通常
72+ switch(NowState){
73+ case STATE_CREATE_OPENING:
74+ NowState = STATE_NOW_OPENING;
75+ break;
76+ case STATE_NOW_OPENING:
77+ NowState = STATE_DESTROY_OPENING;
78+ break;
79+ case STATE_DESTROY_OPENING:
80+ if( f12 == true ){
81+ NowState = STATE_CREATE_OPENING;
82+ }
83+ else{
84+ NowState = STATE_CREATE_MENU;
85+ }
86+ break;
87+ case STATE_CREATE_MENU:
88+ NowState = STATE_NOW_MENU;
89+ break;
90+ case STATE_NOW_MENU:
91+ NowState = STATE_DESTROY_MENU;
92+ break;
93+ case STATE_DESTROY_MENU:
94+ if( f12 == true ){
95+ NowState = STATE_CREATE_MENU;
96+ }
97+ else if( back == false ){
98+ NowState = STATE_CREATE_BRIEFING;
99+ }
100+ else{
101+ NowState = STATE_EXIT;
102+ }
103+ break;
104+ case STATE_CREATE_BRIEFING:
105+ NowState = STATE_NOW_BRIEFING;
106+ break;
107+ case STATE_NOW_BRIEFING:
108+ NowState = STATE_DESTROY_BRIEFING;
109+ break;
110+ case STATE_DESTROY_BRIEFING:
111+ if( f12 == true ){
112+ NowState = STATE_CREATE_BRIEFING;
113+ }
114+ else if( back == false ){
115+ NowState = STATE_CREATE_MAINGAME;
116+ }
117+ else{
118+ NowState = STATE_CREATE_MENU;
119+ }
120+ break;
121+ case STATE_CREATE_MAINGAME:
122+ NowState = STATE_NOW_MAINGAME;
123+ break;
124+ case STATE_NOW_MAINGAME:
125+ NowState = STATE_DESTROY_MAINGAME;
126+ break;
127+ case STATE_DESTROY_MAINGAME:
128+ if( f12 == true ){
129+ NowState = STATE_CREATE_MAINGAME;
130+ }
131+ else if( back == false ){
132+ NowState = STATE_CREATE_RESULT;
133+ }
134+ else{
135+ NowState = STATE_CREATE_MENU;
136+ }
137+ break;
138+ case STATE_CREATE_RESULT:
139+ NowState = STATE_NOW_RESULT;
140+ break;
141+ case STATE_NOW_RESULT:
142+ NowState = STATE_DESTROY_RESULT;
143+ break;
144+ case STATE_DESTROY_RESULT:
145+ if( f12 == true ){
146+ NowState = STATE_CREATE_RESULT;
147+ }
148+ else{
149+ NowState = STATE_CREATE_MENU;
150+ }
151+ break;
152+ case STATE_EXIT:
78153 NowState = STATE_EXIT;
79- }
80- break;
81- case STATE_CREATE_BRIEFING:
82- NowState = STATE_NOW_BRIEFING;
83- break;
84- case STATE_NOW_BRIEFING:
85- NowState = STATE_DESTROY_BRIEFING;
86- break;
87- case STATE_DESTROY_BRIEFING:
88- if( f12 == true ){
89- NowState = STATE_CREATE_BRIEFING;
90- }
91- else if( back == false ){
92- NowState = STATE_CREATE_MAINGAME;
93- }
94- else{
95- NowState = STATE_CREATE_MENU;
96- }
97- break;
98- case STATE_CREATE_MAINGAME:
99- NowState = STATE_NOW_MAINGAME;
100- break;
101- case STATE_NOW_MAINGAME:
102- NowState = STATE_DESTROY_MAINGAME;
103- break;
104- case STATE_DESTROY_MAINGAME:
105- if( f12 == true ){
106- NowState = STATE_CREATE_MAINGAME;
107- }
108- else if( back == false ){
109- NowState = STATE_CREATE_RESULT;
110- }
111- else{
112- NowState = STATE_CREATE_MENU;
113- }
114- break;
115- case STATE_CREATE_RESULT:
116- NowState = STATE_NOW_RESULT;
117- break;
118- case STATE_NOW_RESULT:
119- NowState = STATE_DESTROY_RESULT;
120- break;
121- case STATE_DESTROY_RESULT:
122- if( f12 == true ){
123- NowState = STATE_CREATE_RESULT;
124- }
125- else{
126- NowState = STATE_CREATE_MENU;
127- }
128- break;
129- case STATE_EXIT:
130- NowState = STATE_EXIT;
131- break;
132- default:
133- NowState = STATE_NULL;
154+ break;
155+ default:
156+ NowState = STATE_NULL;
157+ }
134158 }
159+ else if( StateMode == 1 ){
160+ //ブリーフィング/メイン画面/結果表示のみ
161+ switch(NowState){
162+ case STATE_CREATE_BRIEFING:
163+ NowState = STATE_NOW_BRIEFING;
164+ break;
165+ case STATE_NOW_BRIEFING:
166+ NowState = STATE_DESTROY_BRIEFING;
167+ break;
168+ case STATE_DESTROY_BRIEFING:
169+ if( f12 == true ){
170+ NowState = STATE_CREATE_BRIEFING;
171+ }
172+ else if( back == false ){
173+ NowState = STATE_CREATE_MAINGAME;
174+ }
175+ else{
176+ NowState = STATE_EXIT;
177+ }
178+ break;
179+ case STATE_CREATE_MAINGAME:
180+ NowState = STATE_NOW_MAINGAME;
181+ break;
182+ case STATE_NOW_MAINGAME:
183+ NowState = STATE_DESTROY_MAINGAME;
184+ break;
185+ case STATE_DESTROY_MAINGAME:
186+ if( f12 == true ){
187+ NowState = STATE_CREATE_MAINGAME;
188+ }
189+ else if( back == false ){
190+ NowState = STATE_CREATE_RESULT;
191+ }
192+ else{
193+ NowState = STATE_CREATE_BRIEFING;
194+ }
195+ break;
196+ case STATE_CREATE_RESULT:
197+ NowState = STATE_NOW_RESULT;
198+ break;
199+ case STATE_NOW_RESULT:
200+ NowState = STATE_DESTROY_RESULT;
201+ break;
202+ case STATE_DESTROY_RESULT:
203+ if( f12 == true ){
204+ NowState = STATE_CREATE_RESULT;
205+ }
206+ else{
207+ NowState = STATE_CREATE_BRIEFING;
208+ }
209+ break;
210+ case STATE_EXIT:
211+ NowState = STATE_EXIT;
212+ break;
213+ default:
214+ NowState = STATE_NULL;
215+ }
216+ }
217+ else if( StateMode == 2 ){
218+ //メイン画面のみ
219+ switch(NowState){
220+ case STATE_CREATE_MAINGAME:
221+ NowState = STATE_NOW_MAINGAME;
222+ break;
223+ case STATE_NOW_MAINGAME:
224+ NowState = STATE_DESTROY_MAINGAME;
225+ break;
226+ case STATE_DESTROY_MAINGAME:
227+ if( f12 == true ){
228+ NowState = STATE_CREATE_MAINGAME;
229+ }
230+ else if( back == false ){
231+ NowState = STATE_CREATE_MAINGAME;
232+ }
233+ else{
234+ NowState = STATE_EXIT;
235+ }
236+ break;
237+ case STATE_EXIT:
238+ NowState = STATE_EXIT;
239+ break;
240+ default:
241+ NowState = STATE_NULL;
242+ }
243+ }
244+ else{
245+ NowState = STATE_NULL;
246+ }
135247
136248 #ifdef ENABLE_DEBUGLOG
137249 //ログに出力
--- trunk/statemachine.h (revision 266)
+++ trunk/statemachine.h (revision 267)
@@ -62,6 +62,7 @@
6262 //! @details ゲーム全体の画面遷移に関わる管理を行います。
6363 class StateMachine
6464 {
65+ int StateMode; //!< 状態遷移モード
6566 int NowState; //!< 現在のステート
6667 bool back; //!< ESCキーが押された
6768 bool f12; //!< F12キーが押された
@@ -69,6 +70,7 @@
6970 public:
7071 StateMachine();
7172 ~StateMachine();
73+ void SetStateMode(int mode);
7274 void NextState();
7375 void PushMouseButton();
7476 void PushBackSpaceKey();