X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 267 (tree) |
|---|---|
| Time | 2021-03-03 03:29:33 |
| Author | |
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(); |