'---------------------------------------------------------- '概 要:マップ処理 '---------------------------------------------------------- Option Explicit '/// オブジェクト設定 /// Private mObjForm As Form Private mObjMap As PictureBox Private mObjTile As PictureBox Private mObjChar As PictureBox '/// 操作値 /// Private mblnKeyAct As Boolean 'キー操作が動作可能か Private mblnMapRefresh As Boolean 'マップ描画が必要か '/// 戦闘用変数 /// Public gintEnemyNo As Integer '戦闘に入る敵番号 '/// マップ情報 /// Private Const MSTR_MAP_FILE As String = "A_MAP_FILE" 'マップ情報ファイル名 Private Const MSTR_TILE_FILE As String = "A_TILE_FILE.txt" 'タイルファイル名 Private Const MINT_MAP_X As Integer = 20 'マップXサイズ Private Const MINT_MAP_Y As Integer = 15 'マップYサイズ Private Const MINT_TILESIZE_W As Integer = 32 'タイルの幅 Private Const MINT_TILESIZE_H As Integer = 32 'タイルの高さ Private mstrMapName As String 'マップ名 Private mintMapMid As Integer 'マップ音楽 Private mintMapNo As Integer 'マップ番号 Private mstrMapTileDataLoad() As String 'ファイルから読み込んだ各タイル情報 [固定] Private mstrMapTile(1 To MINT_MAP_X, 1 To MINT_MAP_Y) As String 'マップデータ '/// キャラクター情報 /// Private Const MINT_CHAR_NUM As Integer = 20 '最大キャラ数 Type T_Map_Char Kind As Integer 'キャラクター種類 X As Integer 'X Y As Integer 'Y W As Integer '移動位置 D As Integer '向き 上下左右 Speed As Integer 'スピード NowSpeed As Integer 'スピードカウンター Moveing As Integer '移動頻度 MovePt As Integer '移動パターン Visible As Boolean '表示されるか EnemyNo As Integer '敵戦闘の番号 End Type Private Mti_CharMap_INFO(MINT_CHAR_NUM) As T_Map_Char '/// マップイベント情報 /// Type T_MapEvent_Data MapType As String 'マップタイプ E:調べる F:初期判定 J:ジャンプ M:方向を変える D:落とし穴 C:マップ変更・・・ EveDec As Integer 'イベント判定 0:なし 1:イベントtrue 2:イベントフラグを立てる EveFlag As Long 'イベント番号 0000:常に実施 それ以外:イベント番号 TimeDec As Integer 'タイム判定 0:なし 1:未満実施 2:以降実施 TimeSec As Long 'タイム判定 X As Integer 'X Y As Integer 'Y SD1 As String 'その他使用 SD2 As String 'その他使用 SD3 As String 'その他使用 SD4 As String 'その他使用 SD5 As String 'その他使用 End Type Private Mti_MapEvent_Data(40) As T_MapEvent_Data Private Mti_MapEvent_Data_Zero As T_MapEvent_Data '初期化用 Private mintMaxMapData As Integer 'Redimができないためイベント情報の最大配列 '******************************************************************************************************************** ' 初期化・終了処理 '******************************************************************************************************************** '---------------------------------------------------------- '機 能:マップ初期起動設定 '---------------------------------------------------------- Public Sub Init_Map() 'オブジェクト設定 Set mObjForm = frmMain Set mObjMap = frmFile.PicMap Set mObjTile = frmFile.PicMAPTILE Set mObjChar = frmFile.PicChar 'タイル情報読み込み mstrMapTileDataLoad = Read_EveTXT_MG(MSTR_TILE_FILE) '自キャラ移動処理 Mti_CharMap_INFO(0).Kind = 0 Mti_CharMap_INFO(0).Visible = True End Sub '******************************************************************************************************************** ' 呼び出し関数 '******************************************************************************************************************** '---------------------------------------------------------- '機 能:Map画面 '---------------------------------------------------------- Public Sub Map_Event_Map(ByVal In_Act As Integer, _ Optional ByVal In_X As Single, Optional ByVal In_Y As Single) Dim i As Integer '/// アクションパターン /// Select Case In_Act '何もなし Case 0, -1 mblnKeyAct = False gintEnemyNo = 0 Call Play_Event(PLAY_CLS) If In_Act = -1 Then 'マップ名を設定 mstrMapName = GT_All.tEvent.MapName Mti_CharMap_INFO(0).Speed = GT_All.tEvent.MoveSpeed Call Change_Map_Map Else 'マップ再描画 Call ReCall_Map(False) End If mblnKeyAct = True 'Mapメインループ開始 Call Main_Map '/// キー処理 /// '[上] Case vbKeyUp If Mti_CharMap_INFO(0).W = 0 And mblnKeyAct = True Then Call Move_Char_Map(0, 1) End If '[下] Case vbKeyDown If Mti_CharMap_INFO(0).W = 0 And mblnKeyAct = True Then Call Move_Char_Map(0, 2) End If '[左] Case vbKeyLeft If Mti_CharMap_INFO(0).W = 0 And mblnKeyAct = True Then Call Move_Char_Map(0, 3) End If '[右] Case vbKeyRight If Mti_CharMap_INFO(0).W = 0 And mblnKeyAct = True Then Call Move_Char_Map(0, 4) End If '[ENTER] Case vbKeyReturn '前方を調べる If Mti_CharMap_INFO(0).W = 0 And mblnKeyAct = True Then mblnKeyAct = False Call Act_Event_Map(Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y, True) 'マップ前方のイベント判定 End If '[SPACE] Case vbKeySpace 'ステータス表示 If Mti_CharMap_INFO(0).W = 0 And mblnKeyAct = True Then mblnKeyAct = False glngOldCaseEvent = GENU_EV_CASE.MapMain_No glngCaseEvent = GENU_EV_CASE.Status_No 'ステータスイベントへ移行 Call modEvent.EvAct_Event(0) End If End Select End Sub '---------------------------------------------------------- '機 能:メイン処理(Do処理注意) '---------------------------------------------------------- Private Sub Main_Map() On Error GoTo Err_Flag '/// メインループ /// Do DoEvents '処理独占禁止 Call COM_Wait_System(glngActTime / 3) 'メインマップをストップする If glngCaseEvent <> GENU_EV_CASE.MapMain_No Then Exit Do End If '敵キャラを移動させる Call Teki_Move_Map 'キャラ移動途中 Call MoveHalf_Map 'マップのリフレッシュの必要がある場合、再描画 If mblnMapRefresh = True Then Call Refresh_Tile_Map Call Drow_AllChar_Map mObjForm.Refresh End If '敵と接触した gintEnemyNo = Teki_Attack_Map(Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y) '敵が出現時ループを抜ける If gintEnemyNo <> 0 Then glngOldCaseEvent = GENU_EV_CASE.MapMain_No glngCaseEvent = GENU_EV_CASE.BtKick_No Call EvAct_Event(0) Exit Do End If '/// ループシステム操作 /// 'キー操作を可能に mblnKeyAct = True 'ゲームパット操作を可能に If gblnPadUsed = True Then Call frmMain.KeyPad_CaseMap_Main '音楽の連続再生 Call C_modSound.COM_LoopCheck_Sound(True) Loop Exit Sub Err_Flag: MsgBox Err.Description End Sub '---------------------------------------------------------- '機 能:キャラ移動判定 '---------------------------------------------------------- Private Function Move_Char_Map(In_No As Integer, In_Muki As Integer) As Boolean Dim X As Integer Dim Y As Integer Dim iRet As Integer Move_Char_Map = True '向きを変更 Mti_CharMap_INFO(In_No).D = In_Muki '移動する方向を調査 Select Case In_Muki Case 1: X = Mti_CharMap_INFO(In_No).X: Y = Mti_CharMap_INFO(In_No).Y - 1 Case 2: X = Mti_CharMap_INFO(In_No).X: Y = Mti_CharMap_INFO(In_No).Y + 1 Case 3: X = Mti_CharMap_INFO(In_No).X - 1: Y = Mti_CharMap_INFO(In_No).Y Case 4: X = Mti_CharMap_INFO(In_No).X + 1: Y = Mti_CharMap_INFO(In_No).Y End Select '限界座標は一歩戻す If X <= 0 Then X = 1: Mti_CharMap_INFO(In_No).X = 2 If Y <= 0 Then Y = 1: Mti_CharMap_INFO(In_No).Y = 2 If X >= MINT_MAP_X + 1 Then X = MINT_MAP_X: Mti_CharMap_INFO(In_No).X = MINT_MAP_X - 1 If Y >= MINT_MAP_Y + 1 Then Y = MINT_MAP_Y: Mti_CharMap_INFO(In_No).Y = MINT_MAP_Y - 1 '移動可能なとき歩き出す iRet = Ret_TileInfo_Map(mstrMapTile(X, Y), 3) If iRet <> In_Muki And iRet <> 5 Then Mti_CharMap_INFO(In_No).W = 1 mblnMapRefresh = True 'マップのリフレッシュが必要 Else Move_Char_Map = False End If End Function '---------------------------------------------------------- '機 能:キャラ移動途中判定 '---------------------------------------------------------- Private Sub MoveHalf_Map() Dim i As Integer Dim ii As Integer For i = 0 To MINT_CHAR_NUM '移動中キャラクターをインクリメントする If Mti_CharMap_INFO(i).W > 0 And Mti_CharMap_INFO(i).W <= 4 Then Mti_CharMap_INFO(i).NowSpeed = Mti_CharMap_INFO(i).NowSpeed + 1 If Mti_CharMap_INFO(i).NowSpeed >= Mti_CharMap_INFO(i).Speed Then Mti_CharMap_INFO(i).NowSpeed = 0 Mti_CharMap_INFO(i).W = Mti_CharMap_INFO(i).W + 1 mblnMapRefresh = True 'マップのリフレッシュが必要 End If End If If Mti_CharMap_INFO(i).W >= 4 Then Mti_CharMap_INFO(i).W = 0 Select Case Mti_CharMap_INFO(i).D Case 1 Mti_CharMap_INFO(i).Y = Mti_CharMap_INFO(i).Y - 1 Case 2 Mti_CharMap_INFO(i).Y = Mti_CharMap_INFO(i).Y + 1 Case 3 Mti_CharMap_INFO(i).X = Mti_CharMap_INFO(i).X - 1 Case 4 Mti_CharMap_INFO(i).X = Mti_CharMap_INFO(i).X + 1 End Select '主人公移動後にイベントがあるか判定 If i = 0 Then Call Act_Event_Map(Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y, False) End If End If Next End Sub '******************************************************************************************************************* ' ■敵 処理 '******************************************************************************************************************* '---------------------------------------------------------- '機 能:敵キャラ移動キーの処理 '---------------------------------------------------------- Private Sub Teki_Move_Map() Dim irnd As Integer Dim bMove As Boolean Dim i As Integer For i = 1 To MINT_CHAR_NUM If Mti_CharMap_INFO(i).Visible = True And Mti_CharMap_INFO(i).W = 0 Then '■■■■■ 敵の動きのパターン ■■■■■ Select Case Mti_CharMap_INFO(i).MovePt Case 1 'ランダム移動 irnd = Int((Mti_CharMap_INFO(i).Moveing - 0 + 1) * Rnd - 0) '1〜4までなら移動 If irnd >= 1 And irnd <= 4 Then Call Move_Char_Map(i, irnd) '移動する End If Case 2 '接近移動 irnd = Int((Mti_CharMap_INFO(i).Moveing - 0 + 1) * Rnd - 0) '1〜2までなら移動 If irnd = 1 Then If Mti_CharMap_INFO(0).Y > Mti_CharMap_INFO(i).Y Then Call Move_Char_Map(i, 2) '移動する Else Call Move_Char_Map(i, 1) '移動する End If ElseIf irnd = 2 Then If Mti_CharMap_INFO(0).X > Mti_CharMap_INFO(i).X Then Call Move_Char_Map(i, 4) '移動する Else Call Move_Char_Map(i, 3) '移動する End If End If Case 3 '逃避移動 irnd = Int((Mti_CharMap_INFO(i).Moveing - 0 + 1) * Rnd - 0) '1〜2までなら移動 If irnd = 1 Then If Mti_CharMap_INFO(0).Y > Mti_CharMap_INFO(i).Y Then Call Move_Char_Map(i, 1) '移動する Else Call Move_Char_Map(i, 2) '移動する End If ElseIf irnd = 2 Then If Mti_CharMap_INFO(0).X > Mti_CharMap_INFO(i).X Then Call Move_Char_Map(i, 3) '移動する Else Call Move_Char_Map(i, 4) '移動する End If End If Case 4 '微妙に接近移動 irnd = Int((Mti_CharMap_INFO(i).Moveing - 0 + 1) * Rnd - 0) '1〜6までなら移動 If irnd = 1 Then If Mti_CharMap_INFO(0).Y > Mti_CharMap_INFO(i).Y Then Call Move_Char_Map(i, 2) '移動する Else Call Move_Char_Map(i, 1) '移動する End If ElseIf irnd = 2 Then If Mti_CharMap_INFO(0).X > Mti_CharMap_INFO(i).X Then Call Move_Char_Map(i, 4) '移動する Else Call Move_Char_Map(i, 3) '移動する End If ElseIf irnd >= 3 And irnd <= 6 Then Call Move_Char_Map(i, irnd - 2) '移動する End If Case 5 '微妙に逃避移動 irnd = Int((Mti_CharMap_INFO(i).Moveing - 0 + 1) * Rnd - 0) '1〜6までなら移動 If irnd = 1 Then If Mti_CharMap_INFO(0).Y > Mti_CharMap_INFO(i).Y Then Call Move_Char_Map(i, 1) '移動する Else Call Move_Char_Map(i, 2) '移動する End If ElseIf irnd = 2 Then If Mti_CharMap_INFO(0).X > Mti_CharMap_INFO(i).X Then Call Move_Char_Map(i, 3) '移動する Else Call Move_Char_Map(i, 4) '移動する End If ElseIf irnd >= 3 And irnd <= 6 Then Call Move_Char_Map(i, irnd - 2) '移動する End If Case 6 '左右型移動 irnd = Int((Mti_CharMap_INFO(i).Moveing - 0 + 1) * Rnd - 0) '1までなら移動 If irnd = 1 Then If Mti_CharMap_INFO(i).D = 3 Then If Move_Char_Map(i, 3) = False Then Call Move_Char_Map(i, 4) Else If Move_Char_Map(i, 4) = False Then Call Move_Char_Map(i, 3) End If End If Case 7 '上下型移動 irnd = Int((Mti_CharMap_INFO(i).Moveing - 0 + 1) * Rnd - 0) '1までなら移動 If irnd = 1 Then If Mti_CharMap_INFO(i).D = 1 Then If Move_Char_Map(i, 1) = False Then Call Move_Char_Map(i, 2) Else If Move_Char_Map(i, 2) = False Then Call Move_Char_Map(i, 1) End If End If Case 8 '時計回転型移動 irnd = Int((Mti_CharMap_INFO(i).Moveing - 0 + 1) * Rnd - 0) '1までなら移動 If irnd = 1 Then If Mti_CharMap_INFO(i).D = 1 Then If Move_Char_Map(i, 1) = False Then Call Move_Char_Map(i, 4) ElseIf Mti_CharMap_INFO(i).D = 4 Then If Move_Char_Map(i, 4) = False Then Call Move_Char_Map(i, 2) ElseIf Mti_CharMap_INFO(i).D = 2 Then If Move_Char_Map(i, 2) = False Then Call Move_Char_Map(i, 3) Else If Move_Char_Map(i, 3) = False Then Call Move_Char_Map(i, 1) End If End If Case 9 '逆時計回転型移動 irnd = Int((Mti_CharMap_INFO(i).Moveing - 0 + 1) * Rnd - 0) '1までなら移動 If irnd = 1 Then If Mti_CharMap_INFO(i).D = 1 Then If Move_Char_Map(i, 1) = False Then Call Move_Char_Map(i, 3) ElseIf Mti_CharMap_INFO(i).D = 3 Then If Move_Char_Map(i, 3) = False Then Call Move_Char_Map(i, 2) ElseIf Mti_CharMap_INFO(i).D = 2 Then If Move_Char_Map(i, 2) = False Then Call Move_Char_Map(i, 4) Else If Move_Char_Map(i, 4) = False Then Call Move_Char_Map(i, 1) End If End If Case 10 '逆時計ぐるぐる移動 irnd = Int((Mti_CharMap_INFO(i).Moveing - 0 + 1) * Rnd - 0) '1までなら移動 If irnd = 1 Then If Mti_CharMap_INFO(i).D = 1 Then If Move_Char_Map(i, 3) = False Then Call Move_Char_Map(i, 1) ElseIf Mti_CharMap_INFO(i).D = 3 Then If Move_Char_Map(i, 2) = False Then Call Move_Char_Map(i, 3) ElseIf Mti_CharMap_INFO(i).D = 2 Then If Move_Char_Map(i, 4) = False Then Call Move_Char_Map(i, 2) Else If Move_Char_Map(i, 1) = False Then Call Move_Char_Map(i, 4) End If End If Case 11 '時計ぐるぐる移動 irnd = Int((Mti_CharMap_INFO(i).Moveing - 0 + 1) * Rnd - 0) '1までなら移動 If irnd = 1 Then If Mti_CharMap_INFO(i).D = 1 Then If Move_Char_Map(i, 4) = False Then Call Move_Char_Map(i, 1) ElseIf Mti_CharMap_INFO(i).D = 3 Then If Move_Char_Map(i, 1) = False Then Call Move_Char_Map(i, 3) ElseIf Mti_CharMap_INFO(i).D = 2 Then If Move_Char_Map(i, 3) = False Then Call Move_Char_Map(i, 2) Else If Move_Char_Map(i, 2) = False Then Call Move_Char_Map(i, 4) End If End If End Select End If Next End Sub '---------------------------------------------------------- '機 能:敵との接触の処理 '---------------------------------------------------------- Private Function Teki_Attack_Map(In_X As Integer, In_Y As Integer) As Integer Dim i As Integer Teki_Attack_Map = 0 '/// 敵と接触したか判定 /// For i = 1 To MINT_CHAR_NUM If In_X = Mti_CharMap_INFO(i).X And In_Y = Mti_CharMap_INFO(i).Y And Mti_CharMap_INFO(i).Visible = True Then Debug.Print "<<<敵と接触>>> 敵の番号[" & i & "]" Call Effect_Map(2) '戦闘突入 Mti_CharMap_INFO(i).Visible = False '敵を消す '戦闘突入する敵の番号 Teki_Attack_Map = i Exit For End If Next End Function '******************************************************************************************************************* ' ■マップ・タイル 関連 '******************************************************************************************************************* '---------------------------------------------------------- '機 能:別マップへ切替え '---------------------------------------------------------- Private Sub Change_Map_Map() 'マップのロード・設定(ファイルから読み込み) mintMapMid = Int(Read_EveINI_MG(MSTR_MAP_FILE, mstrMapName, "MUSIC")) mintMapNo = Val(Read_EveINI_MG(MSTR_MAP_FILE, mstrMapName, "MAPNO")) Mti_CharMap_INFO(0).X = Val(Read_EveINI_MG(MSTR_MAP_FILE, mstrMapName, "X")) Mti_CharMap_INFO(0).Y = Val(Read_EveINI_MG(MSTR_MAP_FILE, mstrMapName, "Y")) 'フロア切り替え(ロード時はフロア表示しない) Call Change_Floor_Map(True) End Sub '---------------------------------------------------------- '機 能:別フロアへ切替え '---------------------------------------------------------- Private Sub Change_Floor_Map(ByVal In_BgmFlag As Boolean) '切り替え時に移動中になるのをガード Mti_CharMap_INFO(0).W = 0 Mti_CharMap_INFO(0).NowSpeed = 0 'フロア−のロード・設定 Call LoadFloor_Map(mintMapNo) '敵のロード・設定 Call LoadTeki_Map(mintMapNo) 'イベントロード・設定 Call LoadEvent_Map(mintMapNo) 'マップ呼出・描画 Call ReCall_Map(In_BgmFlag) End Sub '---------------------------------------------------------- '機 能:フロアデータ 呼出・設定 '---------------------------------------------------------- Private Sub LoadFloor_Map(In_FileNo As Integer) Dim i As Integer Dim ii As Integer Dim sMapTemp() As String 'マップ読み込み sMapTemp = Read_EveTXT_MG("MAP_" & mstrMapName & "_" & In_FileNo & ".txt") 'マップ情報を各タイルに設定する For i = 0 To MINT_MAP_X - 1 'Yの設定 For ii = 0 To MINT_MAP_Y - 1 'Xの設定 mstrMapTile(i + 1, ii + 1) = CStr(Mid(sMapTemp(ii), i + 1, 1)) Next Next End Sub '---------------------------------------------------------- '機 能:マップの再描画 '---------------------------------------------------------- Private Sub ReCall_Map(ByVal In_BgmFlag As Boolean) 'マップリフレッシュ処理 Call Drow_AllTile_Map 'マップ表示 Call Drow_AllChar_Map 'キャラクター描画 mObjForm.Refresh 'リフレッシュ If In_BgmFlag = True Then Call Play_Event(PLAY_MID, mintMapMid) '音楽再生 End Sub '---------------------------------------------------------- '機 能:マップを描画 '---------------------------------------------------------- Private Sub Refresh_Tile_Map() Call BitBlt(mObjForm.hdc, 0, 0, 640, 480, mObjMap.hdc, 0, 0, &HCC0020) End Sub '---------------------------------------------------------- '機 能:タイル全体を描画 '---------------------------------------------------------- Private Sub Drow_AllTile_Map() Dim i As Integer Dim ii As Integer 'PicMapに描画 For i = 1 To MINT_MAP_X 'Xの設定 For ii = 1 To MINT_MAP_Y 'Yの設定 Call Drow_Tile_Map(i, ii) Next Next 'Formにも描画 Call BitBlt(mObjForm.hdc, 0, 0, 640, 480, mObjMap.hdc, 0, 0, &HCC0020) End Sub '---------------------------------------------------------- '機 能:タイル単体を描画 '---------------------------------------------------------- Private Sub Drow_Tile_Map(In_X As Integer, In_Y As Integer) Call BitBlt(mObjMap.hdc, _ (In_X - 1) * MINT_TILESIZE_W, (In_Y - 1) * MINT_TILESIZE_H, MINT_TILESIZE_W, MINT_TILESIZE_H, _ mObjTile.hdc, _ Ret_TileInfo_Map(mstrMapTile(In_X, In_Y), 1) * MINT_TILESIZE_W, Ret_TileInfo_Map(mstrMapTile(In_X, In_Y), 2) * MINT_TILESIZE_H, _ &HCC0020) End Sub '---------------------------------------------------------- '機 能:タイルの種類によって描画する座標や情報を返す '---------------------------------------------------------- Private Function Ret_TileInfo_Map(In_TileKind As String, In_Type As Integer) As Integer Dim strMapData As String '■■■■■ マップパラメータ読み取り ■■■■■ strMapData = COM_GetParam_Index_StrEdit(In_TileKind, mstrMapTileDataLoad) Select Case In_Type Case 1 'X軸を返す Ret_TileInfo_Map = COM_GetCutIndexStr_StrEdit(strMapData, 1) Case 2 'Y軸を返す Ret_TileInfo_Map = COM_GetCutIndexStr_StrEdit(strMapData, 2) Case 3 '移動可能を返す Ret_TileInfo_Map = COM_GetCutIndexStr_StrEdit(strMapData, 3) End Select End Function '---------------------------------------------------------- '機 能:マップ単体タイルを置換 '---------------------------------------------------------- Private Sub Replace_tile_Map(In_TileKind As String, In_X As Integer, In_Y As Integer) mstrMapTile(In_X, In_Y) = In_TileKind End Sub '******************************************************************************************************************* ' ■キャラクター 関連 '******************************************************************************************************************* '---------------------------------------------------------- '機 能:敵データをファイルから設定する処理 '---------------------------------------------------------- Private Sub LoadTeki_Map(In_FileNo As Integer) Dim i As Integer Dim sDict() As String 'マップ読み込み sDict = Read_EveTXT_MG("TEKI_" & mstrMapName & "_" & In_FileNo & ".txt") '敵の設定・初期化 For i = 1 To MINT_CHAR_NUM Mti_CharMap_INFO(i).Visible = False Mti_CharMap_INFO(i).W = 0 Mti_CharMap_INFO(i).NowSpeed = 0 Next For i = LBound(sDict) To UBound(sDict) '種類〜動きまで設定 Mti_CharMap_INFO(i + 1).Kind = Val(COM_GetCutIndexStr_StrEdit(sDict(i), 1)) Mti_CharMap_INFO(i + 1).X = Val(COM_GetCutIndexStr_StrEdit(sDict(i), 2)) Mti_CharMap_INFO(i + 1).Y = Val(COM_GetCutIndexStr_StrEdit(sDict(i), 3)) Mti_CharMap_INFO(i + 1).D = Val(COM_GetCutIndexStr_StrEdit(sDict(i), 4)) Mti_CharMap_INFO(i + 1).Speed = Val(COM_GetCutIndexStr_StrEdit(sDict(i), 5)) Mti_CharMap_INFO(i + 1).Moveing = Val(COM_GetCutIndexStr_StrEdit(sDict(i), 6)) Mti_CharMap_INFO(i + 1).MovePt = Val(COM_GetCutIndexStr_StrEdit(sDict(i), 7)) Mti_CharMap_INFO(i + 1).EnemyNo = Val(COM_GetCutIndexStr_StrEdit(sDict(i), 8)) '敵の種類=0のとき表示されない If Mti_CharMap_INFO(i + 1).Kind <> 0 Then Mti_CharMap_INFO(i + 1).Visible = True Next End Sub '---------------------------------------------------------- '機 能:全キャラクター描画の処理 '---------------------------------------------------------- Private Sub Drow_AllChar_Map() Dim i As Integer For i = MINT_CHAR_NUM To 0 Step -1 If Mti_CharMap_INFO(i).Visible = True Then Call Drow_Char_Map(Mti_CharMap_INFO(i).Kind, Mti_CharMap_INFO(i).D, Mti_CharMap_INFO(i).X, Mti_CharMap_INFO(i).Y, Mti_CharMap_INFO(i).W) End If Next End Sub '---------------------------------------------------------- '機 能:単体キャラクター描画の処理 '---------------------------------------------------------- Private Sub Drow_Char_Map(In_Kind As Integer, In_D As Integer, In_X As Integer, In_Y As Integer, In_W As Integer) Dim sinX As Single Dim sinY As Single sinX = In_X sinY = In_Y If In_D = 0 Then In_D = 1 '上下左右 Select Case In_D Case 1 sinY = In_Y - In_W / 4 Case 2 sinY = In_Y + In_W / 4 Case 3 sinX = In_X - In_W / 4 Case 4 sinX = In_X + In_W / 4 End Select '途中状態を含むキャラ描画 Call C_modBlt.COM_Trans_Blt(mObjForm.hdc, _ (sinX - 1) * MINT_TILESIZE_W, (sinY - 1) * MINT_TILESIZE_H, MINT_TILESIZE_W, MINT_TILESIZE_H, _ mObjChar.Picture, _ (In_D - 1) * 2 * MINT_TILESIZE_W + (In_W Mod 2) * MINT_TILESIZE_W, In_Kind * MINT_TILESIZE_H, _ vbWhite) End Sub '******************************************************************************************************************* ' ■イベント 関連 '******************************************************************************************************************* '---------------------------------------------------------- '機 能:イベントファイルを読み込み '---------------------------------------------------------- Private Sub LoadEvent_Map(In_FileNo As Integer) Dim i As Integer Dim str() As String 'マップイベント読み込み 'イベント読み込み str = Read_EveTXT_MG("EVENT_" & mstrMapName & "_" & In_FileNo & ".txt") 'イベント情報格納 mintMaxMapData = UBound(str) '初期化 For i = 0 To UBound(Mti_MapEvent_Data) Mti_MapEvent_Data(i) = Mti_MapEvent_Data_Zero Next For i = 0 To mintMaxMapData Mti_MapEvent_Data(i).MapType = COM_GetCutIndexStr_StrEdit(str(i), 1) Mti_MapEvent_Data(i).EveDec = Val(COM_GetCutIndexStr_StrEdit(str(i), 2)) Mti_MapEvent_Data(i).EveFlag = Val(COM_GetCutIndexStr_StrEdit(str(i), 3)) Mti_MapEvent_Data(i).TimeDec = Val(COM_GetCutIndexStr_StrEdit(str(i), 4)) Mti_MapEvent_Data(i).TimeSec = Val(COM_GetCutIndexStr_StrEdit(str(i), 5)) Mti_MapEvent_Data(i).X = Val(COM_GetCutIndexStr_StrEdit(str(i), 6)) Mti_MapEvent_Data(i).Y = Val(COM_GetCutIndexStr_StrEdit(str(i), 7)) Mti_MapEvent_Data(i).SD1 = COM_GetCutIndexStr_StrEdit(str(i), 8) Mti_MapEvent_Data(i).SD2 = COM_GetCutIndexStr_StrEdit(str(i), 9) Mti_MapEvent_Data(i).SD3 = COM_GetCutIndexStr_StrEdit(str(i), 10) Mti_MapEvent_Data(i).SD4 = COM_GetCutIndexStr_StrEdit(str(i), 11) Mti_MapEvent_Data(i).SD5 = COM_GetCutIndexStr_StrEdit(str(i), 12) Next 'イベント読み込み後マップに即反映 Call KickEvent_Reptile_Map End Sub '---------------------------------------------------------- '機 能:イベント読み込み後マップに即反映 '---------------------------------------------------------- Private Sub KickEvent_Reptile_Map() Dim i As Integer For i = 0 To mintMaxMapData 'イベントが"F"で初期起動 ※1:条件一致タイル 2:条件不一致タイル ※時間外は無視 If "F" = Mti_MapEvent_Data(i).MapType Then '時間が一致 If Mti_MapEvent_Data(i).TimeDec = 0 Or _ (Mti_MapEvent_Data(i).TimeDec = 1 And Mti_MapEvent_Data(i).TimeSec > GT_All.tEvent.TIMES) Or _ (Mti_MapEvent_Data(i).TimeDec = 2 And Mti_MapEvent_Data(i).TimeSec <= GT_All.tEvent.TIMES) Then '[フラグが一致] 条件一致タイル If (GT_All.tEvent.EveFlag(Mti_MapEvent_Data(i).EveFlag) = False And Mti_MapEvent_Data(i).EveDec = 0) Or _ (GT_All.tEvent.EveFlag(Mti_MapEvent_Data(i).EveFlag) = True And Mti_MapEvent_Data(i).EveDec = 1) Or _ (GT_All.tEvent.EveFlag(Mti_MapEvent_Data(i).EveFlag) = False And Mti_MapEvent_Data(i).EveDec = 2) Then Call Replace_tile_Map(Mti_MapEvent_Data(i).SD1, Mti_MapEvent_Data(i).X, Mti_MapEvent_Data(i).Y) '[フラグが不一致] 条件不一致タイル Else Call Replace_tile_Map(Mti_MapEvent_Data(i).SD2, Mti_MapEvent_Data(i).X, Mti_MapEvent_Data(i).Y) End If End If End If Next End Sub '---------------------------------------------------------- '機 能:イベントを判定する '---------------------------------------------------------- Private Sub Act_Event_Map(ByVal In_X As Integer, ByVal In_Y As Integer, ByVal In_Enter As Boolean) Dim i As Integer For i = 0 To UBound(Mti_MapEvent_Data) 'イベントが"E"で座標が一致 If In_X = Mti_MapEvent_Data(i).X And In_Y = Mti_MapEvent_Data(i).Y Then 'エンターキーか移動によってイベントが発生 If ("E" = Mti_MapEvent_Data(i).MapType And In_Enter = True) Or _ ("F" <> Mti_MapEvent_Data(i).MapType And "E" <> Mti_MapEvent_Data(i).MapType And In_Enter = False) Then '時間が一致 If Mti_MapEvent_Data(i).TimeDec = 0 Or _ (Mti_MapEvent_Data(i).TimeDec = 1 And Mti_MapEvent_Data(i).TimeSec > GT_All.tEvent.TIMES) Or _ (Mti_MapEvent_Data(i).TimeDec = 2 And Mti_MapEvent_Data(i).TimeSec <= GT_All.tEvent.TIMES) Then 'フラグが一致 If (GT_All.tEvent.EveFlag(Mti_MapEvent_Data(i).EveFlag) = False And Mti_MapEvent_Data(i).EveDec = 0) Or _ (GT_All.tEvent.EveFlag(Mti_MapEvent_Data(i).EveFlag) = True And Mti_MapEvent_Data(i).EveDec = 1) Or _ (GT_All.tEvent.EveFlag(Mti_MapEvent_Data(i).EveFlag) = False And Mti_MapEvent_Data(i).EveDec = 2) Then 'イベント種類、情報を渡し、どのようなイベントか判定を行う If True = Happen_Event_Map(Mti_MapEvent_Data(i).MapType, _ Mti_MapEvent_Data(i).EveDec, _ Mti_MapEvent_Data(i).EveFlag, _ Mti_MapEvent_Data(i).SD1, _ Mti_MapEvent_Data(i).SD2, _ Mti_MapEvent_Data(i).SD3, _ Mti_MapEvent_Data(i).SD4, _ Mti_MapEvent_Data(i).SD5, _ In_Enter) Then Exit For End If End If End If End If End If Next End Sub '---------------------------------------------------------- '機 能:イベント種類を設定 '返却値:イベント実施した '---------------------------------------------------------- Private Function Happen_Event_Map(ByVal In_Type As String, ByVal In_EveDec As Integer, ByVal In_EVENo As Long, _ ByVal In_Str1 As String, ByVal In_Str2 As String, ByVal In_Str3 As String, ByVal In_Str4 As String, ByVal In_Str5 As String, _ Optional In_Enter As Boolean = False) Dim strTileT As String Dim blnChenge As Boolean Dim l As Long Happen_Event_Map = False '■■■■■イベント種類■■■■■■ Select Case In_Type '[Fは予約済み] Case "F" '[瞬間ジャンプ][落とし穴][マップ変更] '※ 1:X2 2:Y2 3:次のマップ (4:マップ名) Case "J", "D", "C" 'エフェクト If In_Type = "D" Then Call Effect_Map(1) 'おとしあなエフェクト Call COM_Wait_System(glngActTime * 2) '時間加算 GT_All.tEvent.TTIMS = GT_All.tEvent.TTIMS + 1 GT_All.tEvent.TIMES = GT_All.tEvent.TIMES + GT_All.tEvent.TTIMS GT_All.tEvent.TTIMS = 0 '日付変更 GT_All.tEvent.ToDay = Int(GT_All.tEvent.TIMES / 100) + 1 'ワープ設定 Mti_CharMap_INFO(0).X = Val(In_Str1) Mti_CharMap_INFO(0).Y = Val(In_Str2) mintMapNo = Val(In_Str3) 'ワープ If In_Type = "D" Or In_Type = "J" Then Call Change_Floor_Map(False) ElseIf In_Type = "C" Then Call Effect_Map(7) mstrMapName = In_Str4 Call Change_Map_Map End If 'イベント処理を中断させる Happen_Event_Map = True '[向き変更(M)] '※ 1:方向変更 Case "M" Mti_CharMap_INFO(0).D = Val(In_Str1) '[罠 地雷] '※ 1:変更前タイル 2:変更後タイル 3:ダメージ Case "B" If In_Str1 = mstrMapTile(Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y) Then 'エフェクト Call Effect_Map(6) 'ダメージ加算 l = Val(In_Str3) - GT_All.tChar(0).TAV If l <= 0 Then l = 1 GT_All.tChar(0).HP = GT_All.tChar(0).HP - l If GT_All.tChar(0).HP <= 0 Then GT_All.tChar(0).HP = 1 'タイル変更 Call Replace_tile_Map(In_Str2, Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y) Call Drow_AllTile_Map 'マップ表示 Call Drow_AllChar_Map 'キャラクター描画 mObjForm.Refresh End If '[ENTER判定(E)] '※ 1:向きが一致するか 2:どのような処理を行うか Case "E" If In_Enter = True And Mti_CharMap_INFO(0).D = Val(In_Str1) Then Select Case In_Str2 '[戦闘に入る(B)] '※3:敵の番号 Case "B" Call Effect_Map(2) '戦闘突入エフェクト gintEnemyNo = Val(In_Str3) '敵番号 Happen_Event_Map = True 'イベント処理を中断させる '[武器入手(W)] '※ 3:入手武器 4:音 ※C or G イベントと併用がBEST Case "W" '[もちものが入手可能] If We_Get_Set(Val(In_Str3)) = True Then Call Play_Event(PLAY_SOU, Val(In_Str4)) Call Talk_Event("IT_GET", Gti_WE_Info(Val(In_Str3)).Name) '[もちものがいっぱい] Else Call Talk_Event("MG_NOTGET") Happen_Event_Map = True 'イベント処理を中断させる In_EveDec = 0 'イベント番号を変更させない処理 End If '[服入手(H)] '※ 3:入手服 4:音 ※C or G イベントと併用がBEST Case "H" '[もちものが入手可能] If Hk_Get_Set(Val(In_Str3)) = True Then Call Play_Event(PLAY_SOU, Val(In_Str4)) Call Talk_Event("IT_GET", Gti_HK_Info(Val(In_Str3)).Name) '[もちものがいっぱい] Else Call Talk_Event("MG_NOTGET") Happen_Event_Map = True 'イベント処理を中断させる In_EveDec = 0 'イベント番号を変更させない処理 End If '[アイテム入手(I)] '※ 3:入手アイテム 4:音 ※C or G イベントと併用がBEST Case "I" '[もちものが入手可能] If It_Get_Set(Val(In_Str3)) = True Then Call Play_Event(PLAY_SOU, Val(In_Str4)) Call Talk_Event("IT_GET", Gti_MG_Info(Val(In_Str3)).Name) '[もちものがいっぱい] Else Call Talk_Event("MG_NOTGET") Happen_Event_Map = True 'イベント処理を中断させる In_EveDec = 0 'イベント番号を変更させない処理 End If '[AC入手(A)] '※ 3:入手アイテム 4:音 ※C or G イベントと併用がBEST Case "A" '[もちものが入手可能] If Ac_Get_Set(Val(In_Str3)) = True Then Call Play_Event(PLAY_SOU, Val(In_Str4)) Call Talk_Event("IT_GET", Gti_AC_Info(Val(In_Str3)).Name) '[もちものがいっぱい] Else Call Talk_Event("MG_NOTGET") Happen_Event_Map = True 'イベント処理を中断させる In_EveDec = 0 'イベント番号を変更させない処理 End If '[POM入手(P)] '※ 3:入手アイテム 4:音 ※C or G イベントと併用がBEST Case "P" Call Play_Event(PLAY_SOU, Val(In_Str4)) Call Talk_Event("POM_GET", Val(In_Str3)) GT_All.tEvent.Pom = GT_All.tEvent.Pom + Val(In_Str3) '[トラップ(T)] '※ 3:トラップダメージ ※C or G イベントと併用がBEST Case "T" 'エフェクト Call Effect_Map(6) GT_All.tChar(0).HP = GT_All.tChar(0).HP - Val(In_Str3) If GT_All.tChar(0).HP <= 0 Then GT_All.tChar(0).HP = 1 '[タイル変更(C)][タイル変更振動付き(G)] '※ 3:変更前タイル 4:変更タイルU 5:変更タイルV Case "C", "G" '樽 If In_Str2 = "G" Then '樽が壊せない場合 If Ac_Ret_Set(11) = 0 Then Call Talk_Event("TARE_NOT") Exit Function '@[Exit SUB] End If End If 'タイル判定 Select Case Mti_CharMap_INFO(0).D Case 1: strTileT = mstrMapTile(Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y - 1) If strTileT = In_Str3 Then Call Replace_tile_Map(In_Str4, Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y - 1): blnChenge = True If strTileT = In_Str4 And In_Str5 <> "" Then Call Replace_tile_Map(In_Str5, Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y - 1): blnChenge = True Case 2: strTileT = mstrMapTile(Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y + 1) If strTileT = In_Str3 Then Call Replace_tile_Map(In_Str4, Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y + 1): blnChenge = True If strTileT = In_Str4 And In_Str5 <> "" Then Call Replace_tile_Map(In_Str5, Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y + 1): blnChenge = True Case 3: strTileT = mstrMapTile(Mti_CharMap_INFO(0).X - 1, Mti_CharMap_INFO(0).Y) If strTileT = In_Str3 Then Call Replace_tile_Map(In_Str4, Mti_CharMap_INFO(0).X - 1, Mti_CharMap_INFO(0).Y): blnChenge = True If strTileT = In_Str4 And In_Str5 <> "" Then Call Replace_tile_Map(In_Str5, Mti_CharMap_INFO(0).X - 1, Mti_CharMap_INFO(0).Y): blnChenge = True Case 4: strTileT = mstrMapTile(Mti_CharMap_INFO(0).X + 1, Mti_CharMap_INFO(0).Y) If strTileT = In_Str3 Then Call Replace_tile_Map(In_Str4, Mti_CharMap_INFO(0).X + 1, Mti_CharMap_INFO(0).Y): blnChenge = True If strTileT = In_Str4 And In_Str5 <> "" Then Call Replace_tile_Map(In_Str5, Mti_CharMap_INFO(0).X + 1, Mti_CharMap_INFO(0).Y): blnChenge = True End Select 'タイル変更 If blnChenge = True Then If In_Str2 = "G" Then Call Effect_Map(5) '振動を起こす Call COM_Wait_System(glngActTime * 30) End If Call Drow_AllTile_Map 'マップ表示 Call Drow_AllChar_Map 'キャラクター描画 mObjForm.Refresh End If '[タイル変更(Q)] '※ 3:変更前タイル 4:変更タイルU 5:エフェクト番号 Case "Q" 'タイル判定 Select Case Mti_CharMap_INFO(0).D Case 1: strTileT = mstrMapTile(Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y - 1) If strTileT = In_Str3 Then Call Replace_tile_Map(In_Str4, Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y - 1): blnChenge = True Case 2: strTileT = mstrMapTile(Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y + 1) If strTileT = In_Str3 Then Call Replace_tile_Map(In_Str4, Mti_CharMap_INFO(0).X, Mti_CharMap_INFO(0).Y + 1): blnChenge = True Case 3: strTileT = mstrMapTile(Mti_CharMap_INFO(0).X - 1, Mti_CharMap_INFO(0).Y) If strTileT = In_Str3 Then Call Replace_tile_Map(In_Str4, Mti_CharMap_INFO(0).X - 1, Mti_CharMap_INFO(0).Y): blnChenge = True Case 4: strTileT = mstrMapTile(Mti_CharMap_INFO(0).X + 1, Mti_CharMap_INFO(0).Y) If strTileT = In_Str3 Then Call Replace_tile_Map(In_Str4, Mti_CharMap_INFO(0).X + 1, Mti_CharMap_INFO(0).Y): blnChenge = True End Select 'タイル変更 If blnChenge = True Then Call Effect_Map(Val(In_Str5)) 'エフェクトを起こす Call Drow_AllTile_Map 'マップ表示 Call Drow_AllChar_Map 'キャラクター描画 mObjForm.Refresh End If '[メッセージ表示] '※ 3:メッセージID 4:必要探索能力 Case "M" '[探索能力が高い場合] 指定メッセージ表示 If GT_All.tChar(0).TAV >= Val(In_Str4) Then Call Talk_Event(In_Str3) '[探索能力が低い場合] ダメメッセージ表示 Else Call Talk_Event("READ_NOT", Val(In_Str4)) End If '[フラグを立てる] Case "E" GT_All.tEvent.EveFlag(Val(In_Str3)) = True '[ゲームエンディングへ] Case "Z" glngCaseEvent = GENU_EV_CASE.EndTrue_No Call EvAct_Event(0) In_EveDec = 0 End Select '[イベント番号がある]イベントフラグを立てる If In_EVENo <> 0 And In_EveDec = 2 Then GT_All.tEvent.EveFlag(In_EVENo) = True Call KickEvent_Reptile_Map Call Drow_AllTile_Map 'マップ表示 Call Drow_AllChar_Map 'キャラクター描画 mObjForm.Refresh End If End If End Select End Function '---------------------------------------------------------- '機 能:エフェクト処理 '---------------------------------------------------------- Private Function Effect_Map(In_Case As Integer) As Long Dim i As Integer '■■■■■エフェクト処理■■■■■ Select Case In_Case '[落とし穴] Case 1 Call Play_Event(PLAY_SOU, 50) '落ちる音 Call Play_Event(PLAY_EFF, 11) 'グラフィックエフェクト(ちいさくなる) '[戦闘突入] Case 2 Call Play_Event(PLAY_SOU, 20) '戦闘突入音 Call Play_Event(PLAY_EFF, 9) 'グラフィックエフェクト(色反転) Call COM_Wait_System(glngActTime * 2) Call Play_Event(PLAY_EFF, 15) 'グラフィックエフェクト(円ワイプ) '[振動を起こす] Case 3 Call Play_Event(PLAY_EFF, 13) '振動を起こす Call Play_Event(PLAY_SOU, 51) '振動を起こす音 '[スイッチ] Case 4 Call Play_Event(PLAY_SOU, 53) '[樽] Case 5 Call Play_Event(PLAY_SOU, 54) '[地雷] Case 6 Call Play_Event(PLAY_SOU, 55) '爆弾 Call Play_Event(PLAY_EFF, 13) '振動を起こす Call Play_Event(PLAY_EFF, 18) 'ピカチュウフラッシュ(赤) '[マップ移動] Case 7 Call Play_Event(PLAY_EFF, 7) End Select End Function