combat.bas

来自「vb6的一个RPG源码」· BAS 代码 · 共 407 行 · 第 1/2 页

BAS
407
字号
Attribute VB_Name = "Combat"

Public Sub Attack()
Dim TempHP As Integer
Dim TempAttack As Integer
Dim TempRnd As Integer
Dim TempRndA As Integer
Dim TempRndB As Integer
If NPCz(DudeCoord.X, DudeCoord.Y).SpeedCounter <> 0 Then NPCz(DudeCoord.X, DudeCoord.Y).SpeedCounter = NPCz(DudeCoord.X, DudeCoord.Y).SpeedCounter - 1
If NPCz(DudeCoord.X, DudeCoord.Y).SpeedCounter <> 0 Then GoTo SkipIt:
Randomize
If UserWear.WeapIndex = -1 Then Exit Sub
Select Case Facing
Case North:
If mbytMap(DudeCoord.X, DudeCoord.Y - 1).NPC = False Then Exit Sub
If NPCz(DudeCoord.X, DudeCoord.Y - 1).Duty <> 2 Then Exit Sub
If NPCz(DudeCoord.X, DudeCoord.Y - 1).Walking <> 0 Then Exit Sub
NPCz(DudeCoord.X, DudeCoord.Y).State = Attacking
NPCz(DudeCoord.X, DudeCoord.Y - 1).State = Attacking
NPCz(DudeCoord.X, DudeCoord.Y - 1).LastStep = 0
NPCz(DudeCoord.X, DudeCoord.Y - 1).Facing = South
If UserAtts.ASkill < NPCz(DudeCoord.X, DudeCoord.Y - 1).Atts.DSkill Then
    TempRnd = NPCz(DudeCoord.X, DudeCoord.Y - 1).Atts.DSkill - UserAtts.ASkill
    TempRndA = Int(((TempRnd + 1) * Rnd) + 0)
    Else
    TempRnd = TempRndA
End If
If TempRnd = TempRndA Then
TempRndB = Int(((UserAtts.ASkill + 1) * Rnd) + 0)
If TempRndB = UserAtts.ASkill Then Exit Sub
TempAttack = (Int(((UserAtts.Strength + 1) * Rnd) + 0) + DaItems(UserWear.WeapIndex).Modifier) - NPCz(DudeCoord.X, DudeCoord.Y - 1).Atts.Armor
If TempAttack < 1 Then Exit Sub
TempHP = NPCz(DudeCoord.X, DudeCoord.Y - 1).Atts.HP - TempAttack
    If TempHP > 1 Then
    NPCz(DudeCoord.X, DudeCoord.Y - 1).Atts.HP = TempHP
    NPCz(DudeCoord.X, DudeCoord.Y - 1).Bubbz.Yaxis = 0
    NPCz(DudeCoord.X, DudeCoord.Y - 1).Bubbz.Xaxis = 0
    NPCz(DudeCoord.X, DudeCoord.Y - 1).Bubbz.Sway = 0
    NPCz(DudeCoord.X, DudeCoord.Y - 1).Bubbz.Damage = TempAttack
    Else:
        NPCz(DudeCoord.X, DudeCoord.Y - 1).Atts.HP = 0
        NPCz(DudeCoord.X, DudeCoord.Y - 1).Mobile = False
        NPCz(DudeCoord.X, DudeCoord.Y - 1).Step = 0
        NPCz(DudeCoord.X, DudeCoord.Y - 1).Bubbz.Yaxis = 0
        NPCz(DudeCoord.X, DudeCoord.Y - 1).Bubbz.Xaxis = 0
        NPCz(DudeCoord.X, DudeCoord.Y - 1).Bubbz.Sway = 0
        NPCz(DudeCoord.X, DudeCoord.Y - 1).Bubbz.Damage = TempAttack
        mbytMap(DudeCoord.X, DudeCoord.Y - 1).NPC = False
        mbytMap(DudeCoord.X, DudeCoord.Y - 1).Walkable = True
        NPCDeath DudeCoord.X, DudeCoord.Y - 1
        End If
End If
Case South:
If NPCz(DudeCoord.X, DudeCoord.Y + 1).Walking <> 0 Then Exit Sub
If mbytMap(DudeCoord.X, DudeCoord.Y + 1).NPC = False Then Exit Sub
If NPCz(DudeCoord.X, DudeCoord.Y + 1).Duty <> 2 Then Exit Sub
NPCz(DudeCoord.X, DudeCoord.Y + 1).State = Attacking
NPCz(DudeCoord.X, DudeCoord.Y + 1).LastStep = 3
NPCz(DudeCoord.X, DudeCoord.Y + 1).Facing = North
NPCz(DudeCoord.X, DudeCoord.Y).State = Attacking
If UserAtts.ASkill < NPCz(DudeCoord.X, DudeCoord.Y + 1).Atts.DSkill Then
    TempRnd = NPCz(DudeCoord.X, DudeCoord.Y + 1).Atts.DSkill - UserAtts.ASkill
    TempRndA = Int(((TempRnd + 1) * Rnd) + 0)
    Else
    TempRnd = TempRndA
End If
If TempRnd = TempRndA Then
TempRndB = Int(((UserAtts.ASkill + 1) * Rnd) + 0)
If TempRndB = UserAtts.ASkill Then Exit Sub
TempAttack = (Int(((UserAtts.Strength + 1) * Rnd) + 0) + DaItems(UserWear.WeapIndex).Modifier) - NPCz(DudeCoord.X, DudeCoord.Y + 1).Atts.Armor
If TempAttack < 1 Then Exit Sub
TempHP = NPCz(DudeCoord.X, DudeCoord.Y + 1).Atts.HP - TempAttack
    If TempHP > 1 Then
    NPCz(DudeCoord.X, DudeCoord.Y + 1).Atts.HP = TempHP
    NPCz(DudeCoord.X, DudeCoord.Y + 1).Bubbz.Yaxis = 0
    NPCz(DudeCoord.X, DudeCoord.Y + 1).Bubbz.Xaxis = 0
    NPCz(DudeCoord.X, DudeCoord.Y + 1).Bubbz.Sway = 0
    NPCz(DudeCoord.X, DudeCoord.Y + 1).Bubbz.Damage = TempAttack
    Else:
        NPCz(DudeCoord.X, DudeCoord.Y + 1).Atts.HP = 0
        NPCz(DudeCoord.X, DudeCoord.Y + 1).Mobile = False
        NPCz(DudeCoord.X, DudeCoord.Y + 1).Step = 0
        NPCz(DudeCoord.X, DudeCoord.Y + 1).Bubbz.Yaxis = 0
        NPCz(DudeCoord.X, DudeCoord.Y + 1).Bubbz.Xaxis = 0
        NPCz(DudeCoord.X, DudeCoord.Y + 1).Bubbz.Sway = 0
        NPCz(DudeCoord.X, DudeCoord.Y + 1).Bubbz.Damage = TempAttack
        mbytMap(DudeCoord.X, DudeCoord.Y + 1).NPC = False
        mbytMap(DudeCoord.X, DudeCoord.Y + 1).Walkable = True
        NPCDeath DudeCoord.X, DudeCoord.Y + 1
    End If
End If
Case West:
If NPCz(DudeCoord.X - 1, DudeCoord.Y).Walking <> 0 Then Exit Sub
If mbytMap(DudeCoord.X - 1, DudeCoord.Y).NPC = False Then Exit Sub
If NPCz(DudeCoord.X - 1, DudeCoord.Y).Duty <> 2 Then Exit Sub
NPCz(DudeCoord.X - 1, DudeCoord.Y).State = Attacking
NPCz(DudeCoord.X - 1, DudeCoord.Y).LastStep = 9
NPCz(DudeCoord.X - 1, DudeCoord.Y).Facing = East
NPCz(DudeCoord.X, DudeCoord.Y).State = Attacking
If UserAtts.ASkill < NPCz(DudeCoord.X - 1, DudeCoord.Y).Atts.DSkill Then
    TempRnd = NPCz(DudeCoord.X - 1, DudeCoord.Y).Atts.DSkill - UserAtts.ASkill
    TempRndA = Int(((TempRnd + 1) * Rnd) + 0)
    Else
    TempRnd = TempRndA
End If
If TempRnd = TempRndA Then
TempRndB = Int(((UserAtts.ASkill + 1) * Rnd) + 0)
If TempRndB = UserAtts.ASkill Then Exit Sub
TempAttack = (Int(((UserAtts.Strength + 1) * Rnd) + 0) + DaItems(UserWear.WeapIndex).Modifier) - NPCz(DudeCoord.X - 1, DudeCoord.Y).Atts.Armor
If TempAttack < 1 Then Exit Sub
TempHP = NPCz(DudeCoord.X - 1, DudeCoord.Y).Atts.HP - TempAttack
    If TempHP > 1 Then
    NPCz(DudeCoord.X - 1, DudeCoord.Y).Atts.HP = TempHP
    NPCz(DudeCoord.X - 1, DudeCoord.Y).Bubbz.Yaxis = 0
    NPCz(DudeCoord.X - 1, DudeCoord.Y).Bubbz.Xaxis = 0
    NPCz(DudeCoord.X - 1, DudeCoord.Y).Bubbz.Sway = 0
    NPCz(DudeCoord.X - 1, DudeCoord.Y).Bubbz.Damage = TempAttack
    Else:
        NPCz(DudeCoord.X - 1, DudeCoord.Y).Atts.HP = 0
        NPCz(DudeCoord.X - 1, DudeCoord.Y).Mobile = False
        NPCz(DudeCoord.X - 1, DudeCoord.Y).Step = 0
        NPCz(DudeCoord.X - 1, DudeCoord.Y).Bubbz.Yaxis = 0
        NPCz(DudeCoord.X - 1, DudeCoord.Y).Bubbz.Xaxis = 0
        NPCz(DudeCoord.X - 1, DudeCoord.Y).Bubbz.Sway = 0
        NPCz(DudeCoord.X - 1, DudeCoord.Y).Bubbz.Damage = TempAttack
        mbytMap(DudeCoord.X - 1, DudeCoord.Y).NPC = False
        mbytMap(DudeCoord.X - 1, DudeCoord.Y).Walkable = True
        NPCDeath DudeCoord.X - 1, DudeCoord.Y
    End If
End If
Case East:
If NPCz(DudeCoord.X + 1, DudeCoord.Y).Walking <> 0 Then Exit Sub
If mbytMap(DudeCoord.X + 1, DudeCoord.Y).NPC = False Then Exit Sub
If NPCz(DudeCoord.X + 1, DudeCoord.Y).Duty <> 2 Then Exit Sub
NPCz(DudeCoord.X + 1, DudeCoord.Y).State = Attacking
NPCz(DudeCoord.X + 1, DudeCoord.Y).LastStep = 6
NPCz(DudeCoord.X + 1, DudeCoord.Y).Facing = West
NPCz(DudeCoord.X, DudeCoord.Y).State = Attacking
If UserAtts.ASkill < NPCz(DudeCoord.X + 1, DudeCoord.Y).Atts.DSkill Then
    TempRnd = NPCz(DudeCoord.X + 1, DudeCoord.Y).Atts.DSkill - UserAtts.ASkill
    TempRndA = Int(((TempRnd + 1) * Rnd) + 0)
    Else
    TempRnd = TempRndA
End If
If TempRnd = TempRndA Then
TempRndB = Int(((UserAtts.ASkill + 1) * Rnd) + 0)
If TempRndB = UserAtts.ASkill Then Exit Sub
TempAttack = (Int(((UserAtts.Strength + 1) * Rnd) + 0) + DaItems(UserWear.WeapIndex).Modifier) - NPCz(DudeCoord.X + 1, DudeCoord.Y).Atts.Armor
If TempAttack < 1 Then Exit Sub
TempHP = NPCz(DudeCoord.X + 1, DudeCoord.Y).Atts.HP - TempAttack
    If TempHP > 1 Then
    NPCz(DudeCoord.X + 1, DudeCoord.Y).Atts.HP = TempHP
    NPCz(DudeCoord.X + 1, DudeCoord.Y).Bubbz.Yaxis = 0
    NPCz(DudeCoord.X + 1, DudeCoord.Y).Bubbz.Xaxis = 0
    NPCz(DudeCoord.X + 1, DudeCoord.Y).Bubbz.Sway = 0
    NPCz(DudeCoord.X + 1, DudeCoord.Y).Bubbz.Damage = TempAttack
    Else:
        NPCz(DudeCoord.X + 1, DudeCoord.Y).Atts.HP = 0
        NPCz(DudeCoord.X + 1, DudeCoord.Y).Mobile = False
        NPCz(DudeCoord.X + 1, DudeCoord.Y).Step = 0
        NPCz(DudeCoord.X + 1, DudeCoord.Y).Atts.HP = TempHP
        NPCz(DudeCoord.X + 1, DudeCoord.Y).Bubbz.Yaxis = 0
        NPCz(DudeCoord.X + 1, DudeCoord.Y).Bubbz.Xaxis = 0
        NPCz(DudeCoord.X + 1, DudeCoord.Y).Bubbz.Sway = 0
        NPCz(DudeCoord.X + 1, DudeCoord.Y).Bubbz.Damage = TempAttack
        mbytMap(DudeCoord.X + 1, DudeCoord.Y).NPC = False
        mbytMap(DudeCoord.X + 1, DudeCoord.Y).Walkable = True
        NPCDeath DudeCoord.X + 1, DudeCoord.Y
    End If
End If
End Select
NPCz(DudeCoord.X, DudeCoord.Y).SpeedCounter = UserAtts.Speed
SkipIt:
End Sub

Public Sub NPCManager()
Dim X As Integer
Dim Y As Integer
For X = 0 To 50
    For Y = 0 To 50
    If mbytMap(X, Y).NPC Then
    Select Case NPCz(X, Y).State
    Case Wandering:
        MoveNPC X, Y
    Case Attacking:
        AIAttack X, Y
    Case Patrolling:
        If Combat.GetDist(X, Y, DudeCoord.X, DudeCoord.Y) > NPCz(X, Y).Atts.Sight Then
            NPC.MoveNPC X, Y
            Else
                If NPCz(X, Y).Walking = 0 Then
                    AISeek X, Y
                Else
                    NPC.MoveNPC X, Y
                End If
        End If
    End Select
    End If
    Next
Next
End Sub

Private Sub AIAttack(X As Integer, Y As Integer)
Dim TempHP As Integer

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?