-
Notifications
You must be signed in to change notification settings - Fork 46
/
0058_StealScript.cs
92 lines (82 loc) · 3.54 KB
/
0058_StealScript.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using Memoria.Data;
using System;
namespace Memoria.Scripts.Battle
{
/// <summary>
/// Steal, Mug
/// </summary>
[BattleScript(Id)]
public sealed class StealScript : IBattleScript
{
public const Int32 Id = 0058;
private readonly BattleCalculator _v;
public StealScript(BattleCalculator v)
{
_v = v;
}
public void Perform()
{
BattleEnemy enemy = BattleEnemy.Find(_v.Target);
if (!HasStealableItems(enemy))
{
UiState.SetBattleFollowFormatMessage(BattleMesages.DoesNotHaveAnything);
return;
}
if (!_v.Caster.HasSupportAbility(SupportAbility2.Bandit) && Configuration.Hacks.StealingAlwaysWorks < 2)
{
_v.Context.HitRate = (Int16)(_v.Caster.Level + _v.Caster.Will);
_v.Context.Evade = _v.Target.Level;
if (GameRandom.Next16() % _v.Context.HitRate < GameRandom.Next16() % _v.Context.Evade)
{
UiState.SetBattleFollowFormatMessage(BattleMesages.CouldNotStealAnything);
return;
}
}
if (Configuration.Hacks.StealingAlwaysWorks >= 1) // cheat
{
if (enemy.StealableItems[3] != RegularItem.NoItem)
_v.StealItem(enemy, 3);
else if (enemy.StealableItems[2] != RegularItem.NoItem)
_v.StealItem(enemy, 2);
else if (enemy.StealableItems[1] != RegularItem.NoItem)
_v.StealItem(enemy, 1);
else
_v.StealItem(enemy, 0);
return;
}
if (_v.Caster.HasSupportAbility(SupportAbility1.MasterThief))
{
if (enemy.StealableItems[3] != RegularItem.NoItem && GameRandom.Next8() < Math.Max(32, (Int32)enemy.StealableItemRates[3]))
_v.StealItem(enemy, 3);
else if (enemy.StealableItems[2] != RegularItem.NoItem && GameRandom.Next8() < Math.Max(32, (Int32)enemy.StealableItemRates[2]))
_v.StealItem(enemy, 2);
else if (enemy.StealableItems[1] != RegularItem.NoItem && GameRandom.Next8() < Math.Max(32, (Int32)enemy.StealableItemRates[1]))
_v.StealItem(enemy, 1);
else if (enemy.StealableItems[0] != RegularItem.NoItem && GameRandom.Next8() < Math.Max(32, (Int32)enemy.StealableItemRates[0]))
_v.StealItem(enemy, 0);
else
UiState.SetBattleFollowFormatMessage(BattleMesages.CouldNotStealAnything);
}
else
{
if (GameRandom.Next8() < enemy.StealableItemRates[3])
_v.StealItem(enemy, 3);
else if (GameRandom.Next8() < enemy.StealableItemRates[2])
_v.StealItem(enemy, 2);
else if (GameRandom.Next8() < enemy.StealableItemRates[1])
_v.StealItem(enemy, 1);
else if (GameRandom.Next8() < enemy.StealableItemRates[0])
_v.StealItem(enemy, 0);
else
UiState.SetBattleFollowFormatMessage(BattleMesages.CouldNotStealAnything);
}
}
private static Boolean HasStealableItems(BattleEnemy enemy)
{
for (Int16 slot = 0; slot < 4; ++slot)
if (enemy.StealableItems[slot] != RegularItem.NoItem)
return true;
return false;
}
}
}