-
Notifications
You must be signed in to change notification settings - Fork 0
/
PokemonClasses.py
206 lines (168 loc) · 8.26 KB
/
PokemonClasses.py
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#not used atm don't play yaself
class HeldItem:
def __init__(self, nm):
self.name = nm
class Move:
def __init__(self, nm, tp, cat, pow, acc):
self.name = nm
self.type = tp
self.cat = cat
self.power = pow
self.accuracy = acc
#effects = [] #list of tuples of effect/chance pairs
#print(self)
def __str__(self):
return "{}, {}, {}, {}, {}".format(self.name, self.type, self.cat, self.power, self.accuracy)
def printFullInfo(self):
print(self.name)
print(self.type)
print(self.power)
print(self.accuracy)
print(self.cat)
#prolly wanna change params to just 1 pokemon rather than typename and 2 ptypes
def effectiveness(self, movetype, ptype1, ptype2):
typeIndices = ["normal", "fire", "water", "electric", "grass", "ice", "fighting", "poison", "ground", "flying",
"psychic", "bug", "rock", "ghost", "dragon", "dark", "steel", "fairy"]
typeMatchups = [[1,1,1,1,1,1,1,1,1,1,1,1,.5,0,1,1,.5,1],
[1,.5,.5,1,2,2,1,1,1,1,1,2,.5,1,.5,1,2,1],
[1,2,.5,1,.5,1,1,1,2,1,1,1,2,1,.5,1,1,1],
[1,1,2,.5,.5,1,1,1,0,2,1,1,1,1,.5,1,1,1],
[1,.5,2,1,.5,1,1,.5,2,.5,1,.5,2,1,.5,1,.5,1],
[1,.5,.5,1,2,.5,1,1,2,2,1,1,1,1,2,1,.5,1],
[2,1,1,1,1,2,1,.5,1,.5,.5,.5,2,0,1,2,2,.5],
[1,1,1,1,2,1,1,.5,.5,1,1,1,.5,.5,1,1,0,2],
[1,2,1,2,.5,1,1,2,1,0,1,.5,2,1,1,1,2,1],
[1,1,1,.5,2,1,2,1,1,1,1,2,.5,1,1,1,.5,1],
[1,1,1,1,1,1,2,2,1,1,.5,1,1,1,1,0,.5,1],
[1,.5,1,1,2,1,.5,.5,1,.5,2,1,1,.5,1,2,.5,.5],
[1,2,1,1,1,2,.5,1,.5,2,1,2,1,1,1,1,.5,1],
[0,1,1,1,1,1,1,1,1,1,2,1,1,2,1,.5,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,.5,0],
[1,1,1,1,1,1,.5,1,1,1,2,1,1,2,1,.5,1,.5],
[1,.5,.5,.5,1,2,1,1,1,1,1,1,2,1,1,1,.5,2],
[1,.5,1,1,1,1,2,.5,1,1,1,1,1,1,2,2,.5,1]]
if ptype2 == None:
return typeMatchups[typeIndices.index(movetype.lower())][typeIndices.index(ptype1.lower())]
else:
return typeMatchups[typeIndices.index(movetype.lower())][typeIndices.index(ptype1.lower())]*typeMatchups[typeIndices.index(movetype.lower())][typeIndices.index(ptype2.lower())]
class Pokemon:
#for own mons
def __init__(self, pname, pnname, pitem, pability, pmoves, ptype1, ptype2, plevel, pstats):
self.name = pname
self.nickname = pnname
self.item = pitem
self.ability = pability
self.moves = pmoves
self.type1 = ptype1
self.type2 = ptype2
self.level = plevel
self.stats = pstats
self.pctHP = 100
self.statBoosts = []
self.active = False
self.lastUsedMove = None
if self.nickname is None:
self.nickname = self.name
def __str__(self):
return "{}, {}, {}, {}, {}, {}, {}, {}".format(self.name, self.nickname, self.item, self.ability, self.type1, self.type2, self.level, self.stats)
def setLevel(self, level):
self.level = level
def setActive(self, value):
self.active = value
def useMove(self, move):
self.lastUsedMove = move
def getEffectivePower(self, move):
if move.type == self.type1 or move.type == self.type2:
print(move.power)
return float(move.power) * 1.5
else:
return float(move.power)
#returns two values, the first is how effective you are against the opponent, the second is how effective it is against you
#picks the max offensive types
def monMatchup(self, opponent):
typeIndices = ["normal", "fire", "water", "electric", "grass", "ice", "fighting", "poison", "ground", "flying",
"psychic", "bug", "rock", "ghost", "dragon", "dark", "steel", "fairy"]
typeMatchups = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .5, 0, 1, 1, .5, 1],
[1, .5, .5, 1, 2, 2, 1, 1, 1, 1, 1, 2, .5, 1, .5, 1, 2, 1],
[1, 2, .5, 1, .5, 1, 1, 1, 2, 1, 1, 1, 2, 1, .5, 1, 1, 1],
[1, 1, 2, .5, .5, 1, 1, 1, 0, 2, 1, 1, 1, 1, .5, 1, 1, 1],
[1, .5, 2, 1, .5, 1, 1, .5, 2, .5, 1, .5, 2, 1, .5, 1, .5, 1],
[1, .5, .5, 1, 2, .5, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, .5, 1],
[2, 1, 1, 1, 1, 2, 1, .5, 1, .5, .5, .5, 2, 0, 1, 2, 2, .5],
[1, 1, 1, 1, 2, 1, 1, .5, .5, 1, 1, 1, .5, .5, 1, 1, 0, 2],
[1, 2, 1, 2, .5, 1, 1, 2, 1, 0, 1, .5, 2, 1, 1, 1, 2, 1],
[1, 1, 1, .5, 2, 1, 2, 1, 1, 1, 1, 2, .5, 1, 1, 1, .5, 1],
[1, 1, 1, 1, 1, 1, 2, 2, 1, 1, .5, 1, 1, 1, 1, 0, .5, 1],
[1, .5, 1, 1, 2, 1, .5, .5, 1, .5, 2, 1, 1, .5, 1, 2, .5, .5],
[1, 2, 1, 1, 1, 2, .5, 1, .5, 2, 1, 2, 1, 1, 1, 1, .5, 1],
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, .5, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, .5, 0],
[1, 1, 1, 1, 1, 1, .5, 1, 1, 1, 2, 1, 1, 2, 1, .5, 1, .5],
[1, .5, .5, .5, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, .5, 2],
[1, .5, 1, 1, 1, 1, 2, .5, 1, 1, 1, 1, 1, 1, 2, 2, .5, 1]]
#maxEffectiveness = 0
#maxOppEffectiveness = 0
#check first type matchup against opponents types
maxEffectiveness = typeMatchups[typeIndices.index(self.type1.lower())][typeIndices.index(opponent.type1.lower())]
if opponent.type2 is not None:
maxEffectiveness *= typeMatchups[typeIndices.index(self.type1.lower())][typeIndices.index(opponent.type2.lower())]
if self.type2 is not None:
curEffectiveness = typeMatchups[typeIndices.index(self.type1.lower())][typeIndices.index(opponent.type1.lower())]
if opponent.type2 is not None:
curEffectiveness *= typeMatchups[typeIndices.index(self.type1.lower())][typeIndices.index(opponent.type2.lower())]
if curEffectiveness > maxEffectiveness:
maxEffectiveness = curEffectiveness
maxOppEffectiveness = typeMatchups[typeIndices.index(opponent.type1.lower())][typeIndices.index(self.type1.lower())]
if self.type2 is not None:
maxOppEffectiveness *= typeMatchups[typeIndices.index(opponent.type1.lower())][typeIndices.index(self.type2.lower())]
if opponent.type2 is not None:
curEffectiveness = typeMatchups[typeIndices.index(opponent.type1.lower())][typeIndices.index(self.type1.lower())]
if self.type2 is not None:
curEffectiveness *= typeMatchups[typeIndices.index(opponent.type1.lower())][typeIndices.index(self.type2.lower())]
if curEffectiveness > maxOppEffectiveness:
maxOppEffectiveness = curEffectiveness
return maxEffectiveness, maxOppEffectiveness
class FieldSide:
hazards = []
tailwind = None
reflect = None
lightScreen = None
auroraVeil = None
class Field:
weather = None
weatherTurns = None
terrain = None
terrainTurns= None
trickRoom = None
class Trainer:
def __init__(self):
self.maxMons = 6
self.monsLeft = 6
self.knownMons = []
self.deadMons = []
def addKnownMon(self, mon):
self.knownMons.append(mon)
#first mon sent out starts active
if len(self.knownMons) == 1:
mon.setActive(True)
print(mon)
def getActive(self):
for x in self.knownMons:
if x.active:
return x
return None
def switch(self, mon):
self.getActive().setActive(False)
mon.setActive(True)
def remainingPokemon(self):
rem = []
print("Remaining:")
for x in self.knownMons:
if x not in self.deadMons:
rem.append(x)
print(x)
return rem
def faintActive(self):
self.deadMons.append(self.getActive())
self.getActive().pctHP = 0
print("{} fainted".format(self.getActive()))