X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
Revision | 267 (tree) |
---|---|
Zeit | 2021-03-03 03:29:33 |
Autor | xops-mikan |
exeのコマンド引数で直接.mifを指定して起動できるように、コンソールのmifコマンドの表示を修正。
@@ -736,6 +736,23 @@ | ||
736 | 736 | } |
737 | 737 | } |
738 | 738 | |
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 | + | |
739 | 756 | #ifdef ENABLE_DEBUGLOG |
740 | 757 | //ログに出力 |
741 | 758 | OutputLog.WriteLog(LOG_COMPLETE, "", ""); |
@@ -763,6 +780,23 @@ | ||
763 | 780 | } |
764 | 781 | #endif |
765 | 782 | |
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 | + | |
766 | 800 | return 0; |
767 | 801 | } |
768 | 802 |
@@ -1010,6 +1044,49 @@ | ||
1010 | 1044 | return 1; |
1011 | 1045 | } |
1012 | 1046 | |
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 | + | |
1013 | 1090 | //! @brief 読み込んだデータファイルの形式を取得 |
1014 | 1091 | //! @return 標準形式:false MIF形式:true |
1015 | 1092 | //! @attention ファイルを正常に読み込んだ後に実行してください。 |
@@ -177,6 +177,7 @@ | ||
177 | 177 | int LoadDefaultTextFiledata(char *fname); |
178 | 178 | int LoadMissionInfoFiledata(char *fname); |
179 | 179 | int LoadAddSmallObjectFiledata(char *fname); |
180 | + bool ChangeExePathToFullPath(char *dir, char *fname); | |
180 | 181 | |
181 | 182 | public: |
182 | 183 | MIFInterface(); |
@@ -58,7 +58,7 @@ | ||
58 | 58 | |
59 | 59 | |
60 | 60 | //! @brief 基本的な初期化処理 |
61 | -int InitGame(WindowControl *WindowCtrl) | |
61 | +int InitGame(WindowControl *WindowCtrl, int mode, char *MIFpath) | |
62 | 62 | { |
63 | 63 | //D3DGraphicsクラス初期化 |
64 | 64 | if( d3dg.InitD3D(WindowCtrl, "data\\char.dds", GameConfig.GetFullscreenFlag()) ){ |
@@ -114,7 +114,23 @@ | ||
114 | 114 | //addonリスト作成 |
115 | 115 | GameAddon.LoadFiledata("addon\\"); |
116 | 116 | |
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 | + } | |
118 | 134 | |
119 | 135 | return 0; |
120 | 136 | } |
@@ -592,7 +608,7 @@ | ||
592 | 608 | //スクロールバーを処理し情報取得 |
593 | 609 | int scrollitems; |
594 | 610 | int totalmission; |
595 | - if( GameInfoData.selectaddon == false ){ | |
611 | + if( GameInfoData.selectmission_id >= 0 ){ | |
596 | 612 | scrollbar_official.Input(mainmenu_mouseX, mainmenu_mouseY, inputCtrl->CheckMouseButtonNowL(), mainmenu_mouseY - mainmenu_mouseY_old); |
597 | 613 | scrollitems = scrollbar_official.GetScrollItem(); |
598 | 614 | totalmission = TOTAL_OFFICIALMISSION; |
@@ -608,16 +624,24 @@ | ||
608 | 624 | for(int i=0; i<TOTAL_MENUITEMS; i++){ |
609 | 625 | char name[32]; |
610 | 626 | strcpy(name, ""); |
611 | - if( GameInfoData.selectaddon == false ){ | |
627 | + if( GameInfoData.selectmission_id >= 0 ){ | |
612 | 628 | 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 | + } | |
613 | 635 | } |
614 | 636 | else{ |
615 | 637 | strcpy(name, GameAddon.GetMissionName(scrollitems + i)); |
616 | - } | |
617 | 638 | |
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 | + } | |
621 | 645 | } |
622 | 646 | } |
623 | 647 | } |
@@ -625,7 +649,7 @@ | ||
625 | 649 | if( inputCtrl->CheckMouseButtonUpL() ){ |
626 | 650 | // UP |
627 | 651 | 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 ){ | |
629 | 653 | scrollbar_official.ScrollUP(); |
630 | 654 | } |
631 | 655 | else{ |
@@ -635,7 +659,7 @@ | ||
635 | 659 | |
636 | 660 | // DOWN |
637 | 661 | 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 ){ | |
639 | 663 | scrollbar_official.ScrollDOWN(); |
640 | 664 | } |
641 | 665 | else{ |
@@ -647,13 +671,13 @@ | ||
647 | 671 | //標準ミッションとアドオンリストの切り替え |
648 | 672 | if( inputCtrl->CheckMouseButtonUpL() ){ |
649 | 673 | 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 ){ | |
651 | 675 | if( GameAddon.GetTotaldatas() > 0 ){ |
652 | - GameInfoData.selectaddon = true; | |
676 | + GameInfoData.selectmission_id = -1; | |
653 | 677 | } |
654 | 678 | } |
655 | 679 | else{ |
656 | - GameInfoData.selectaddon = false; | |
680 | + GameInfoData.selectmission_id = 0; | |
657 | 681 | } |
658 | 682 | } |
659 | 683 | } |
@@ -739,7 +763,7 @@ | ||
739 | 763 | //スクロールバーの情報を取得 |
740 | 764 | int scrollitems; |
741 | 765 | int totalmission; |
742 | - if( GameInfoData.selectaddon == false ){ | |
766 | + if( GameInfoData.selectmission_id >= 0 ){ | |
743 | 767 | scrollitems = scrollbar_official.GetScrollItem(); |
744 | 768 | totalmission = TOTAL_OFFICIALMISSION; |
745 | 769 | } |
@@ -757,7 +781,7 @@ | ||
757 | 781 | } |
758 | 782 | |
759 | 783 | //スクロールバー描画 |
760 | - if( GameInfoData.selectaddon == false ){ | |
784 | + if( GameInfoData.selectmission_id >= 0 ){ | |
761 | 785 | scrollbar_official.Draw(d3dg); |
762 | 786 | } |
763 | 787 | else{ |
@@ -803,7 +827,7 @@ | ||
803 | 827 | } |
804 | 828 | |
805 | 829 | //標準ミッションとaddon切り替え |
806 | - if( GameInfoData.selectaddon == false ){ | |
830 | + if( GameInfoData.selectmission_id >= 0 ){ | |
807 | 831 | //addonがあれば |
808 | 832 | if( GameAddon.GetTotaldatas() > 0 ){ |
809 | 833 | //文字の色を設定 |
@@ -842,7 +866,7 @@ | ||
842 | 866 | strcpy(name, ""); |
843 | 867 | |
844 | 868 | //ミッション名を取得 |
845 | - if( GameInfoData.selectaddon == false ){ | |
869 | + if( GameInfoData.selectmission_id >= 0 ){ | |
846 | 870 | GameParamInfo.GetOfficialMission(scrollitems + i, name, NULL, NULL, NULL, NULL, NULL); |
847 | 871 | } |
848 | 872 | else{ |
@@ -1533,14 +1557,13 @@ | ||
1533 | 1557 | gametitle = d3dg->LoadTexture("data\\title.dds", false, false); |
1534 | 1558 | |
1535 | 1559 | //mifファイルのファイルパス取得 |
1536 | - if( GameInfoData.selectaddon == false ){ | |
1560 | + if( GameInfoData.selectmission_id >= 0 ){ | |
1537 | 1561 | GameParamInfo.GetOfficialMission(GameInfoData.selectmission_id, NULL, NULL, path, pdata, NULL, NULL); |
1538 | 1562 | strcat(path, pdata); |
1539 | 1563 | strcat(path, ".txt"); |
1540 | 1564 | } |
1541 | 1565 | else{ |
1542 | - strcpy(path, "addon\\"); | |
1543 | - strcat(path, GameAddon.GetFileName(GameInfoData.selectmission_id)); | |
1566 | + strcpy(path, GameInfoData.mifpath); | |
1544 | 1567 | } |
1545 | 1568 | |
1546 | 1569 | //mifファイルを読み込み |
@@ -1672,6 +1695,12 @@ | ||
1672 | 1695 | maingame::~maingame() |
1673 | 1696 | {} |
1674 | 1697 | |
1698 | +//! @brief 座標などを表示するデバックモードのフラグ設定 | |
1699 | +void maingame::SetShowInfoFlag(bool flag) | |
1700 | +{ | |
1701 | + ShowInfo_Debugmode = flag; | |
1702 | +} | |
1703 | + | |
1675 | 1704 | //! @brief ゲームの実行速度を取得 |
1676 | 1705 | int maingame::GetGameSpeed() |
1677 | 1706 | { |
@@ -1680,7 +1709,7 @@ | ||
1680 | 1709 | |
1681 | 1710 | int maingame::Create() |
1682 | 1711 | { |
1683 | - MainGameInfo = GameInfoData; | |
1712 | + memcpy(&MainGameInfo, &GameInfoData, sizeof(GameInfo)); | |
1684 | 1713 | char path[MAX_PATH]; |
1685 | 1714 | char bdata[MAX_PATH]; |
1686 | 1715 | char pdata[MAX_PATH]; |
@@ -2558,7 +2587,7 @@ | ||
2558 | 2587 | } |
2559 | 2588 | if( end_framecnt == 1 ){ //ミッション終了直後ならば |
2560 | 2589 | MainGameInfo.framecnt = framecnt; |
2561 | - GameInfoData = MainGameInfo; //全てコピー | |
2590 | + memcpy(&GameInfoData, &MainGameInfo, sizeof(GameInfo)); //全てコピー | |
2562 | 2591 | end_framecnt += 1; |
2563 | 2592 | } |
2564 | 2593 | else if( end_framecnt > 0 ){ //ミッション終了中ならば |
@@ -3634,17 +3663,27 @@ | ||
3634 | 3663 | |
3635 | 3664 | //MIFの情報表示 |
3636 | 3665 | if( strcmp(NewCommand, "mif") == 0 ){ |
3637 | - bool AddonFlag = GameInfoData.selectaddon; | |
3666 | + bool AddonFlag; | |
3638 | 3667 | int MissionID = GameInfoData.selectmission_id; |
3639 | 3668 | char str2[MAX_PATH]; |
3640 | 3669 | char str3[MAX_PATH]; |
3641 | 3670 | bool collisionflag, screenflag; |
3642 | 3671 | |
3672 | + if( GameInfoData.selectmission_id >= 0 ){ AddonFlag = false; } | |
3673 | + else{ AddonFlag = true; } | |
3674 | + | |
3643 | 3675 | //ヘッダー |
3644 | 3676 | if( AddonFlag == true ){ sprintf(str, "[Addon Mission] (MissionID:%d)", MissionID); } |
3645 | 3677 | else{ sprintf(str, "[Standard Mission] (MissionID:%d)", MissionID); } |
3646 | 3678 | AddInfoConsole(d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), str); |
3647 | 3679 | |
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 | + | |
3648 | 3687 | //ミッション識別名 |
3649 | 3688 | strcpy(str, "Name : "); |
3650 | 3689 | if( AddonFlag == true ){ strcpy(str2, MIFdata.GetMissionName()); } |
@@ -3713,7 +3752,7 @@ | ||
3713 | 3752 | |
3714 | 3753 | //ブロックデータの情報 |
3715 | 3754 | if( strcmp(NewCommand, "bd1") == 0 ){ |
3716 | - bool AddonFlag = GameInfoData.selectaddon; | |
3755 | + bool AddonFlag; | |
3717 | 3756 | int MissionID = GameInfoData.selectmission_id; |
3718 | 3757 | char str2[MAX_PATH]; |
3719 | 3758 | char str3[MAX_PATH]; |
@@ -3722,6 +3761,9 @@ | ||
3722 | 3761 | char flagstr1[4]; |
3723 | 3762 | char flagstr2[4]; |
3724 | 3763 | |
3764 | + if( GameInfoData.selectmission_id >= 0 ){ AddonFlag = false; } | |
3765 | + else{ AddonFlag = true; } | |
3766 | + | |
3725 | 3767 | //ファイル名表示 |
3726 | 3768 | strcpy(str, "Filename : "); |
3727 | 3769 | if( AddonFlag == true ){ |
@@ -3762,7 +3804,7 @@ | ||
3762 | 3804 | |
3763 | 3805 | //ポイントデータの情報 |
3764 | 3806 | if( strcmp(NewCommand, "pd1") == 0 ){ |
3765 | - bool AddonFlag = GameInfoData.selectaddon; | |
3807 | + bool AddonFlag; | |
3766 | 3808 | int MissionID = GameInfoData.selectmission_id; |
3767 | 3809 | char str2[MAX_PATH]; |
3768 | 3810 | char str3[MAX_PATH]; |
@@ -3775,6 +3817,9 @@ | ||
3775 | 3817 | int PathPoints = 0; |
3776 | 3818 | int EventPoints = 0; |
3777 | 3819 | |
3820 | + if( GameInfoData.selectmission_id >= 0 ){ AddonFlag = false; } | |
3821 | + else{ AddonFlag = true; } | |
3822 | + | |
3778 | 3823 | //ファイル名表示 |
3779 | 3824 | strcpy(str, "Filename : "); |
3780 | 3825 | if( AddonFlag == true ){ |
@@ -97,13 +97,13 @@ | ||
97 | 97 | #define CONSOLE_PROMPT ">" //!< デバック用コンソールのプロンプト |
98 | 98 | #endif |
99 | 99 | |
100 | -int InitGame(WindowControl *WindowCtrl); | |
100 | +int InitGame(WindowControl *WindowCtrl, int mode, char *MIFpath); | |
101 | 101 | void CleanupGame(); |
102 | 102 | |
103 | 103 | //! ゲームの状態を受け渡しする構造体 |
104 | 104 | struct GameInfo{ |
105 | - bool selectaddon; //!< addonを選択 | |
106 | 105 | int selectmission_id; //!< 選択されたミッション |
106 | + char mifpath[MAX_PATH]; //!< MIFファイルのパス | |
107 | 107 | bool missioncomplete; //!< ミッション完了 |
108 | 108 | unsigned int framecnt; //!< フレーム数 |
109 | 109 | int fire; //!< 射撃回数 |
@@ -290,6 +290,7 @@ | ||
290 | 290 | public: |
291 | 291 | maingame(); |
292 | 292 | ~maingame(); |
293 | + void SetShowInfoFlag(bool flag); | |
293 | 294 | int GetGameSpeed(); |
294 | 295 | int Create(); |
295 | 296 | int Recovery(); |
@@ -60,6 +60,14 @@ | ||
60 | 60 | UNREFERENCED_PARAMETER(hInstance); |
61 | 61 | UNREFERENCED_PARAMETER(lpCmdLine); |
62 | 62 | |
63 | + char path[MAX_PATH]; | |
64 | + | |
65 | +#ifdef ENABLE_AUTOLOADMIF | |
66 | + bool NoBriefingFlag = false; | |
67 | + int gamemode = 0; | |
68 | + strcpy(path, ""); | |
69 | +#endif | |
70 | + | |
63 | 71 | //乱数初期化 |
64 | 72 | InitRand(); |
65 | 73 |
@@ -68,34 +76,65 @@ | ||
68 | 76 | _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); |
69 | 77 | |
70 | 78 | //実行ファイルのある場所を、カレントディレクトリにする。 |
71 | - char path[MAX_PATH]; | |
72 | 79 | GetModuleFileName(NULL, path, MAX_PATH); |
73 | 80 | PathRemoveFileSpec(path); |
74 | 81 | SetCurrentDirectory(path); |
75 | 82 | |
76 | - //char str[24]; | |
77 | - //GameConfig.GetPlayerName(str); | |
78 | - //MessageBox(NULL, str, "プレイヤー名", MB_OK); | |
79 | 83 | char str[255]; |
80 | 84 | strcpy(str, "[Information]\nThe compiler is the Debug mode.\nIf release the software, Switch compiler to Release mode."); |
81 | 85 | MessageBox(NULL, str, GAMENAME, MB_OK); |
82 | 86 | #endif |
83 | 87 | |
88 | + //引数処理 | |
89 | + //メモ:Windows環境なら、lpCmdLine引数とかGetCommandLine()関数でも取れますけどね・・。 | |
90 | + strcpy(path, ""); | |
91 | + if( __argc > 1 ){ | |
92 | + for(int param=1; param<__argc; param++){ | |
84 | 93 | #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(); | |
86 | 100 | |
87 | - //引数を分解 | |
88 | - for(int i=0; i<__argc; i++){ | |
101 | + MainWindow.ErrorInfo("Enable Debug Log..."); | |
102 | + continue; | |
103 | + } | |
104 | +#endif | |
89 | 105 | |
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 | + } | |
94 | 114 | |
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 | |
96 | 126 | } |
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 | |
97 | 135 | } |
98 | 136 | |
137 | +#ifdef ENABLE_DEBUGLOG | |
99 | 138 | //ユーザー環境を出力 |
100 | 139 | GetOperatingEnvironment(); |
101 | 140 |
@@ -152,7 +191,11 @@ | ||
152 | 191 | MainWindow.InitWindow(GAMENAME, SCREEN_WIDTH, SCREEN_HEIGHT, GameConfig.GetFullscreenFlag()); |
153 | 192 | |
154 | 193 | //基本的な初期化処理 |
155 | - if( InitGame(&MainWindow) ){ | |
194 | +#ifdef ENABLE_AUTOLOADMIF | |
195 | + if( InitGame(&MainWindow, gamemode, path) ){ | |
196 | +#else | |
197 | + if( InitGame(&MainWindow, 0, "") ){ | |
198 | +#endif | |
156 | 199 | return 1; |
157 | 200 | } |
158 | 201 |
@@ -163,7 +206,12 @@ | ||
163 | 206 | result Result; |
164 | 207 | InitScreen(&MainWindow, &Opening, &MainMenu, &Briefing, &MainGame, &Result); |
165 | 208 | |
209 | +#ifdef ENABLE_AUTOLOADMIF | |
210 | + //メインゲームのみ表示するモードならば、標準でデバック表示を有効にする。 | |
211 | + if( gamemode == 2 ){ MainGame.SetShowInfoFlag(true); } | |
212 | +#endif | |
166 | 213 | |
214 | + | |
167 | 215 | #ifdef ENABLE_DEBUGLOG |
168 | 216 | //ログに出力 |
169 | 217 | OutputLog.WriteLog(LOG_CHECK, "起動", "メインループ突入"); |
@@ -73,6 +73,7 @@ | ||
73 | 73 | #define ENABLE_MENUOPTIONS //!< メニューにオプション画面追加(コメント化で機能無効) |
74 | 74 | //#define ENABLE_AUTOCREATECONFIG //!< config.datが見つからない場合、同ファイルを自動生成する。 |
75 | 75 | //#define ENABLE_PATH_DELIMITER_SLASH //!< パス区切り文字を、'\'から‘/’へ変換する。 |
76 | +#define ENABLE_AUTOLOADMIF //!< .mifが引数に指定された場合、自動的にロードする(コメント化で機能無効) | |
76 | 77 | |
77 | 78 | //windows.hを使用しないならば |
78 | 79 | #ifndef _MAX_PATH |
@@ -34,6 +34,7 @@ | ||
34 | 34 | //! @brief コンストラクタ |
35 | 35 | StateMachine::StateMachine() |
36 | 36 | { |
37 | + StateMode = 0; | |
37 | 38 | NowState = STATE_CREATE_OPENING; |
38 | 39 | back = false; |
39 | 40 | f12 = false; |
@@ -43,95 +44,206 @@ | ||
43 | 44 | StateMachine::~StateMachine() |
44 | 45 | {} |
45 | 46 | |
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 | + | |
46 | 67 | //! @brief 次の状態へ移行 |
47 | 68 | void StateMachine::NextState() |
48 | 69 | { |
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: | |
78 | 153 | 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 | + } | |
134 | 158 | } |
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 | + } | |
135 | 247 | |
136 | 248 | #ifdef ENABLE_DEBUGLOG |
137 | 249 | //ログに出力 |
@@ -62,6 +62,7 @@ | ||
62 | 62 | //! @details ゲーム全体の画面遷移に関わる管理を行います。 |
63 | 63 | class StateMachine |
64 | 64 | { |
65 | + int StateMode; //!< 状態遷移モード | |
65 | 66 | int NowState; //!< 現在のステート |
66 | 67 | bool back; //!< ESCキーが押された |
67 | 68 | bool f12; //!< F12キーが押された |
@@ -69,6 +70,7 @@ | ||
69 | 70 | public: |
70 | 71 | StateMachine(); |
71 | 72 | ~StateMachine(); |
73 | + void SetStateMode(int mode); | |
72 | 74 | void NextState(); |
73 | 75 | void PushMouseButton(); |
74 | 76 | void PushBackSpaceKey(); |