Public Sub BattleNPCAI(ByVal BattleSlot As Long, ByVal NpcSlot As Byte)
Dim Target As Long
Dim Damage As Long
Dim X As Long
Dim NpcNum As Long
Dim Index As Long
Dim Name As String
Dim EXP As Long
Dim MapNum As Long
With Battle(BattleSlot)
If Not .Npc(NpcSlot).NpcNum > 0 Then
Exit Sub
End If
'let's find a target huh?
If PlayersInBattle(BattleSlot) = 3 Then
Target = Rand(1, 3)
ElseIf PlayersInBattle(BattleSlot) = 2 Then
'there are two players... find the combinations?
Target = Rand(1, 2)
If Target = 1 Then
If .Player(1).Index > 0 Then
Target = 1
ElseIf .Player(2).Index > 0 Then
Target = 2
End If
End If
If Target = 2 Then
If .Player(3).Index > 0 Then
Target = 3
ElseIf .Player(2).Index > 0 Then
Target = 2
End If
End If
ElseIf PlayersInBattle(BattleSlot) = 1 Then
If .Player(1).Index > 0 Then
Target = 1
ElseIf .Player(2).Index > 0 Then
Target = 2
ElseIf .Player(3).Index > 0 Then
Target = 3
End If
Else
Call Cle*****tle(BattleSlot)
End If
'let's start the attack...
'display that the npc is attackign someone...
Index = Battle(BattleSlot).Player(Target).Index
NpcNum = Battle(BattleSlot).Npc(NpcSlot).NpcNum
Name = Trim$(Npc(NpcNum).Name)
Damage = Npc(NpcNum).STR - GetPlayerProtection(Target)
If Not IsPlaying(Index) Then
Call LeaveBattle(Index)
Exit Sub
End If
Call SendDataToBattle(BattleSlot, "NPCBATTLEATTACKPLAYER" & SEP_CHAR & NpcSlot & END_CHAR)
If Damage <= 0 Then
Damage = 1
End If
If Damage >= GetPlayerHP(Index) Then
Call GlobalMsg(GetPlayerName(Index) & " was defeated by " & Name, BRIGHTRED)
Call LeaveBattle(Index)
If Map(GetPlayerMap(Index)).Moral <> MAP_MORAL_NO_PENALTY Then
If SCRIPTING = 1 Then
MyScript.ExecuteStatement "Scripts\main.ess", "DropItems " & Index
Else
If GetPlayerWeaponSlot(Index) > 0 Then
Call PlayerMapDropItem(Index, GetPlayerWeaponSlot(Index), 0)
End If
If GetPlayerArmorSlot(Index) > 0 Then
Call PlayerMapDropItem(Index, GetPlayerArmorSlot(Index), 0)
End If
If GetPlayerHelmetSlot(Index) > 0 Then
Call PlayerMapDropItem(Index, GetPlayerHelmetSlot(Index), 0)
End If
If GetPlayerShieldSlot(Index) > 0 Then
Call PlayerMapDropItem(Index, GetPlayerShieldSlot(Index), 0)
End If
If GetPlayerShieldSlot(Index) > 0 Then
Call PlayerMapDropItem(Index, GetPlayerShieldSlot(Index), 0)
End If
If GetPlayerLegsSlot(Index) > 0 Then
Call PlayerMapDropItem(Index, GetPlayerLegsSlot(Index), 0)
End If
If GetPlayerRingSlot(Index) > 0 Then
Call PlayerMapDropItem(Index, GetPlayerRingSlot(Index), 0)
End If
End If
' Calculate exp to give attacker
EXP = Int(GetPlayerExp(Index) / 3)
' Make sure we dont get less then 0
If EXP < 0 Then
EXP = 0
End If
End If
' Warp player away
If SCRIPTING = 1 Then
MyScript.ExecuteStatement "Scripts\main.ess", "OnDeath " & Index
Else
If Map(GetPlayerMap(Index)).BootMap > 0 Then
Call PlayerWarp(Index, Map(GetPlayerMap(Index)).BootMap, Map(GetPlayerMap(Index)).BootX, Map(GetPlayerMap(Index)).BootY)
Else
Call PlayerWarp(Index, START_MAP, START_X, START_Y)
End If
End If
' Restore vitals
Call SetPlayerHP(Index, GetPlayerMaxHP(Index))
Call SetPlayerMP(Index, GetPlayerMaxMP(Index))
Call SetPlayerSP(Index, GetPlayerMaxSP(Index))
Call SendHP(Index)
Call SendMP(Index)
Call SendSP(Index)
' If the player the attacker defeated was a pk then take it away
If GetPlayerPK(Index) = YES Then
Call SetPlayerPK(Index, NO)
Call SendPlayerData(Index)
End If
Else
Call SetPlayerHP(Index, GetPlayerHP(Index) - Damage)
Call SendHP(Index)
End If
Call SendBattleDamage(BattleSlot, Damage, Target, 0)
Call SendBattleData(BattleSlot)
Call SendDataToBattle(BattleSlot, "sound" & SEP_CHAR & "pain" & SEP_CHAR & Player(Index).Char(Player(Index).CharNum).Sex & END_CHAR)
End With
End Sub
Function GetPlayerProtection(ByVal Index As Long) As Long
Dim ArmorSlot As Long, HelmSlot As Long, ShieldSlot As Long, LegsSlot As Long
'GetPlayerProtection = 0
' Check for subscript out of range
If IsPlaying(Index) = False Or Index <= 0 Or Index > MAX_PLAYERS Then
Exit Function
End If
ArmorSlot = GetPlayerArmorSlot(Index)
HelmSlot = GetPlayerHelmetSlot(Index)
ShieldSlot = GetPlayerShieldSlot(Index)
LegsSlot = GetPlayerLegsSlot(Index)
GetPlayerProtection = GetPlayerDEF(Index) ' / 5
If ArmorSlot > 0 Then
GetPlayerProtection = GetPlayerProtection + Item(GetPlayerInvItemNum(Index, ArmorSlot)).Data2
If GetPlayerInvItemDur(Index, ArmorSlot) > -1 Then
Call SetPlayerInvItemDur(Index, ArmorSlot, GetPlayerInvItemDur(Index, ArmorSlot) - 1)
If GetPlayerInvItemDur(Index, ArmorSlot) = 0 Then
Call BattleMsg(Index, "Your " & Trim$(Item(GetPlayerInvItemNum(Index, ArmorSlot)).Name) & " has broken.", YELLOW, 0)
Call TakeItem(Index, GetPlayerInvItemNum(Index, ArmorSlot), 0)
Else
If GetPlayerInvItemDur(Index, ArmorSlot) <= 10 Then
Call BattleMsg(Index, "Your " & Trim$(Item(GetPlayerInvItemNum(Index, ArmorSlot)).Name) & " is about to break! Dur: " & GetPlayerInvItemDur(Index, ArmorSlot) & "/" & Trim$(Item(GetPlayerInvItemNum(Index, ArmorSlot)).Data1), YELLOW, 0)
End If
End If
End If
End If
If HelmSlot > 0 Then
GetPlayerProtection = GetPlayerProtection + Item(GetPlayerInvItemNum(Index, HelmSlot)).Data2
If GetPlayerInvItemDur(Index, HelmSlot) > -1 Then
Call SetPlayerInvItemDur(Index, HelmSlot, GetPlayerInvItemDur(Index, HelmSlot) - 1)
If GetPlayerInvItemDur(Index, HelmSlot) <= 0 Then
Call BattleMsg(Index, "Your " & Trim$(Item(GetPlayerInvItemNum(Index, HelmSlot)).Name) & " has broken.", YELLOW, 0)
Call TakeItem(Index, GetPlayerInvItemNum(Index, HelmSlot), 0)
Else
If GetPlayerInvItemDur(Index, HelmSlot) <= 10 Then
Call BattleMsg(Index, "Your " & Trim$(Item(GetPlayerInvItemNum(Index, HelmSlot)).Name) & " " & Trim$(Item(GetPlayerInvItemNum(Index, ArmorSlot)).Name) & " is about to break! Dur: " & GetPlayerInvItemDur(Index, HelmSlot) & "/" & Trim$(Item(GetPlayerInvItemNum(Index, HelmSlot)).Data1), YELLOW, 0)
End If
End If
End If
End If
If ShieldSlot > 0 Then
GetPlayerProtection = GetPlayerProtection + Item(GetPlayerInvItemNum(Index, ShieldSlot)).Data2
If GetPlayerInvItemDur(Index, ShieldSlot) > -1 Then
Call SetPlayerInvItemDur(Index, ShieldSlot, GetPlayerInvItemDur(Index, ShieldSlot) - 1)
If GetPlayerInvItemDur(Index, ShieldSlot) <= 0 Then
Call BattleMsg(Index, "Your " & Trim$(Item(GetPlayerInvItemNum(Index, ShieldSlot)).Name) & " has broken.", YELLOW, 0)
Call TakeItem(Index, GetPlayerInvItemNum(Index, ShieldSlot), 0)
Else
If GetPlayerInvItemDur(Index, ShieldSlot) <= 10 Then
Call BattleMsg(Index, "Your " & Trim$(Item(GetPlayerInvItemNum(Index, ShieldSlot)).Name) & " is about to break! Dur: " & GetPlayerInvItemDur(Index, ShieldSlot) & "/" & Trim$(Item(GetPlayerInvItemNum(Index, ShieldSlot)).Data1), YELLOW, 0)
End If
End If
End If
End If
If LegsSlot > 0 Then
GetPlayerProtection = GetPlayerProtection + Item(GetPlayerInvItemNum(Index, LegsSlot)).Data2
If GetPlayerInvItemDur(Index, LegsSlot) > -1 Then
Call SetPlayerInvItemDur(Index, LegsSlot, GetPlayerInvItemDur(Index, LegsSlot) - 1)
If GetPlayerInvItemDur(Index, LegsSlot) <= 0 Then
Call BattleMsg(Index, "Your " & Trim$(Item(GetPlayerInvItemNum(Index, LegsSlot)).Name) & " has broken.", YELLOW, 0)
Call TakeItem(Index, GetPlayerInvItemNum(Index, LegsSlot), 0)
Else
If GetPlayerInvItemDur(Index, LegsSlot) <= 10 Then
Call BattleMsg(Index, "Your " & Trim$(Item(GetPlayerInvItemNum(Index, LegsSlot)).Name) & " " & Trim$(Item(GetPlayerInvItemNum(Index, ArmorSlot)).Name) & " is about to break! Dur: " & GetPlayerInvItemDur(Index, LegsSlot) & "/" & Trim$(Item(GetPlayerInvItemNum(Index, LegsSlot)).Data1), YELLOW, 0)
End If
End If
End If
End If
End Function
Function GetPlayerDEF(ByVal Index As Long) As Long
Dim Add As Long
Add = 0
If GetPlayerWeaponSlot(Index) > 0 Then
Add = Item(GetPlayerInvItemNum(Index, GetPlayerWeaponSlot(Index))).AddDef
End If
If GetPlayerArmorSlot(Index) > 0 Then
Add = Add + Item(GetPlayerInvItemNum(Index, GetPlayerArmorSlot(Index))).AddDef
End If
If GetPlayerShieldSlot(Index) > 0 Then
Add = Add + Item(GetPlayerInvItemNum(Index, GetPlayerShieldSlot(Index))).AddDef
End If
If GetPlayerHelmetSlot(Index) > 0 Then
Add = Add + Item(GetPlayerInvItemNum(Index, GetPlayerHelmetSlot(Index))).AddDef
End If
If GetPlayerLegsSlot(Index) > 0 Then
Add = Add + Item(GetPlayerInvItemNum(Index, GetPlayerLegsSlot(Index))).AddDef
End If
If GetPlayerRingSlot(Index) > 0 Then
Add = Add + Item(GetPlayerInvItemNum(Index, GetPlayerRingSlot(Index))).AddDef
End If
If GetPlayerNecklaceSlot(Index) > 0 Then
Add = Add + Item(GetPlayerInvItemNum(Index, GetPlayerNecklaceSlot(Index))).AddDef
End If
GetPlayerDEF = Player(Index).Char(Player(Index).CharNum).DEF + Add
End Function