Quantcast
Channel: Programming Forums
Viewing all articles
Browse latest Browse all 51036

Overflow Error in Battle Simulator

$
0
0
I Have spent the past few hours getting a battle simulator finished and I am having a problem with it throwing an overflow error. The battle lasts way to many rounds and every time a type of troop dies, it gets replaced some how. This makes the attack a never-ending loop. If anyone can find the problem I would be grateful.

Below is the Battle Module.
Option Explicit
Public Target As Integer
Public Round As Integer
Public DistToTarget
Public Pos(1 To 2, 1 To 10) As Integer
Dim Sent(1 To 10) As Integer
Dim Defenders(1 To 10) As Integer
Public Sub Send(ID, N)
Sent(ID) = N
End Sub
Public Sub Set_Defender(ID, N)
Defenders(ID) = N
End Sub
Public Sub Battle_Start()
Round = 1
Dim X
For X = 1 To 10
Pos(1, X) = 0 - TroopHandler.Get_Range(X)
Next X
For X = 1 To 10
Pos(2, X) = TroopHandler.Get_Range(X) + 50
Next X

PlayerAttack
End Sub

Public Sub PlayerAttack()
Dim T, R, C, S
For T = 1 To 10
If Sent(T) > 0 Then
'Troops found with ID T
'Get range
R = TroopHandler.Get_Range(T)
'get closest enemy
C = Get_ClosestEnemy
Debug.Print "Closest Enemy: " & C
'Check if closest is in range
If R <= Pos(2, C) Then
        'Get stats
        Dim PAtt, ELife, DefEff As Integer
        Dim PCount, ECount As Integer
        PAtt = TroopHandler.Get_Att(T)
        ELife = TroopHandler.Get_Life(C)
        PCount = Sent(T)
        ECount = Defenders(C)
        'Calculate
        Dim AttEff
        AttEff = PAtt * PCount
        DefEff = (0.5 * ELife) * ECount
        Debug.Print "Round: " & Round & " AttEff: " & AttEff
        Debug.Print "DefEff: " & DefEff
        Debug.Print "Att-DEf: " & AttEff - DefEff
        Debug.Print "Def-Att: " & DefEff - AttEff
        'ATTACK!
        Debug.Print "Defenders: " & Defenders(C)
        Debug.Print "Defense: " & (1 / 2 * ELife)
        Debug.Print "Life: " & ELife
        Debug.Print "Total Defense: " & (ECount * (1 / 2 * ELife))
        Debug.Print "Killed: " & ((ECount * (1 / 2 * ELife) - AttEff))
        'Defenders(C) = Defenders(C) - ((ECount * (1 / 2 * ELife) - AttEff))
        Defenders(C) = (DefEff - AttEff)
        Debug.Print "Lived:" & Defenders(C)
End If
End If
Next T

'Move forward
For T = 1 To 10
If Pos(1, T) < 0 Then
S = TroopHandler.Get_Speed(T)
    If Abs(Pos(1, T)) < S Then
        Pos(1, T) = 0
    Else
        Pos(1, T) = Pos(1, T) + S
    End If
End If
Next T

Dim O
O = Check_Outcome
If O = 0 Then
Round = Round + 1
PCAttack
Else
    MsgBox "Player Won."
    Dim L
    'Give reward
    For L = 1 To 6
        Call ResHandler.Set_Res(L, Map.Get_Reward(L))
    Next L
End If
End Sub

Public Sub PCAttack()
Debug.Print "ENEMY ATTACK"
Dim T, R, C, S
For T = 1 To 10
If Defenders(T) > 0 Then
'Troops found with ID T
'Get range
R = TroopHandler.Get_Range(T)
Debug.Print "Range found"
'get closest enemy
C = Get_ClosestPlayer
Debug.Print "Closest: " & C
'Check if closest is in range
Debug.Print "Range: " & R
Debug.Print "Pos: " & Pos(1, C)
If R <= Abs(Pos(1, C)) Then
        'Get stats
        Dim EAtt, PLife, DefEff As Integer
        Dim PCount, ECount As Integer
        EAtt = TroopHandler.Get_Att(T)
        PLife = TroopHandler.Get_Life(C)
        PCount = Sent(T)
        ECount = Defenders(C)
        Debug.Print "EAtt: " & EAtt
        Debug.Print "PCount: " & PCount
        'Calculate
        Dim AttEff
        AttEff = EAtt * ECount
        DefEff = (0.5 * PLife) * PCount
        Debug.Print "AttEff: " & AttEff
        Debug.Print "DefEff: " & DefEff
        'ATTACK!
        If Sent(C) <= 0 Then GoTo 1
        Sent(C) = DefEff - AttEff
        Debug.Print "Player's Troops: " & Sent(C)
        'Sent(C) = ((PCount * (1 / 2 * PLife) - AttEff))
End If
End If
1:
Next T

'Move forward
For T = 1 To 10
If Pos(1, T) > 0 Then
S = TroopHandler.Get_Speed(T)
    If Pos(1, T) < S Then
        Pos(1, T) = 0
    Else
        Pos(1, T) = Pos(1, T) - S
    End If
End If
Next T

Dim O
O = Check_Outcome
If O = 0 Then
Round = Round + 1
PlayerAttack
Else
    MsgBox "Enemy Won."
End If
End Sub
Public Function Check_Etroops()

End Function
Public Function Check_Outcome()
Dim X
'Check Enemy
For X = 1 To 10
If Defenders(X) > 0 Then
GoTo CheckP
End If
Next X
Check_Outcome = 1 'Player won
Debug.Print "OUTCOME...PLAYER WON!"
Exit Function
CheckP:
For X = 1 To 10
If Sent(X) > 0 Then
Check_Outcome = 0 'None
Exit Function
End If
Next X

Check_Outcome = 2 'Enemy won
Debug.Print "OUTCOME...ENEMY WON!"
End Function
Public Function Get_ClosestEnemy()
Dim X
Dim Closest
Closest = 200
Dim C(1 To 10)
For X = 1 To 10
C(X) = Pos(2, X)
Next X
For X = 1 To 10
If C(X) < Closest Then
    Closest = X
End If
Next X
Get_ClosestEnemy = Closest
End Function

Public Function Get_ClosestPlayer()
Dim X
Dim Closest
Closest = 200
Dim C(1 To 10)
For X = 1 To 10
C(X) = Pos(1, X)
Next X
For X = 1 To 10
If C(X) < Closest Then
    Closest = X
End If
Next X
Get_ClosestPlayer = Closest
End Function


Viewing all articles
Browse latest Browse all 51036

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>