forked from pokemoncentral/wiki-lua-modules
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEffTipi-6.lua
202 lines (161 loc) · 8.16 KB
/
EffTipi-6.lua
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
202
-- Calcolo efficacia tipi, ad uso esclusivamente interno
local et = {}
local tab = require('Wikilib-tables')
--[[
Tabella contenente i valori di efficacia. Il livello esterno
è il tipo attaccante, il livello interno il difensore.
Ad esempio, normale.fuoco è l'efficacia di un attacco di
tipo normale che colpisce un tipo fuoco puro
--]]
local eff = {}
eff.normale = {normale = 1, fuoco = 1, acqua = 1, elettro = 1, erba = 1, ghiaccio = 1, lotta = 1, veleno = 1, terra = 1,
volante = 1, psico = 1, coleottero = 1, roccia = 0.5, spettro = 0, drago = 1, buio = 1, acciaio = 0.5, folletto = 1}
eff.fuoco = {normale = 1, fuoco = 0.5, acqua = 0.5, elettro = 1, erba = 2, ghiaccio = 2, lotta = 1, veleno = 1, terra = 1,
volante = 1, psico = 1, coleottero = 2, roccia = 0.5, spettro = 1, drago = 0.5, buio = 1, acciaio = 2, folletto = 1}
eff.acqua = {normale = 1, fuoco = 2, acqua = 0.5, elettro = 1, erba = 0.5, ghiaccio = 1, lotta = 1, veleno = 1, terra = 2,
volante = 1, psico = 1, coleottero = 1, roccia = 2, spettro = 1, drago = 0.5, buio = 1, acciaio = 1, folletto = 1}
eff.elettro = {normale = 1, fuoco = 1, acqua = 2, elettro = 0.5, erba = 0.5, ghiaccio = 1, lotta = 1, veleno = 1, terra = 0,
volante = 2, psico = 1, coleottero = 1, roccia = 1, spettro = 1, drago = 0.5, buio = 1, acciaio = 1, folletto = 1}
eff.erba = {normale = 1, fuoco = 0.5, acqua = 2, elettro = 1, erba = 0.5, ghiaccio = 1, lotta = 1, veleno = 0.5, terra = 2,
volante = 0.5, psico = 1, coleottero = 0.5, roccia = 2, spettro = 1, drago = 0.5, buio = 1, acciaio = 0.5, folletto = 1}
eff.ghiaccio = {normale = 1, fuoco = 0.5, acqua = 0.5, elettro = 1, erba = 2, ghiaccio = 0.5, lotta = 1, veleno = 1, terra = 2,
volante = 2, psico = 1, coleottero = 1, roccia = 1, spettro = 1, drago = 2, buio = 1, acciaio = 0.5, folletto = 1}
eff.lotta = {normale = 2, fuoco = 1, acqua = 1, elettro = 1, erba = 1, ghiaccio = 2, lotta = 1, veleno = 0.5, terra = 1,
volante = 0.5, psico = 0.5, coleottero = 0.5, roccia = 2, spettro = 0, drago = 1, buio = 2, acciaio = 2, folletto = 0.5}
eff.veleno = {normale = 1, fuoco = 1, acqua = 1, elettro = 1, erba = 2, ghiaccio = 1, lotta = 1, veleno = 0.5, terra = 0.5,
volante = 1, psico = 1, coleottero = 1, roccia = 0.5, spettro = 0.5, drago = 1, buio = 1, acciaio = 0, folletto = 2}
eff.terra = {normale = 1, fuoco = 2, acqua = 1, elettro = 2, erba = 0.5, ghiaccio = 1, lotta = 1, veleno = 2, terra = 1,
volante = 0, psico = 1, coleottero = 0.5, roccia = 2, spettro = 1, drago = 1, buio = 1, acciaio = 2, folletto = 1}
eff.volante = {normale = 1, fuoco = 1, acqua = 1, elettro = 0.5, erba = 2, ghiaccio = 1, lotta = 2, veleno = 1, terra = 1,
volante = 1, psico = 1, coleottero = 2, roccia = 0.5, spettro = 1, drago = 1, buio = 1, acciaio = 0.5, folletto = 1}
eff.psico = {normale = 1, fuoco = 1, acqua = 1, elettro = 1, erba = 1, ghiaccio = 1, lotta = 2, veleno = 2, terra = 1,
volante = 1, psico = 0.5, coleottero = 1, roccia = 1, spettro = 1, drago = 1, buio = 0, acciaio = 0.5, folletto = 1}
eff.coleottero = {normale = 1, fuoco = 0.5, acqua = 1, elettro = 1, erba = 2, ghiaccio = 1, lotta = 0.5, veleno = 0.5, terra = 1,
volante = 0.5, psico = 2, coleottero = 1, roccia = 1, spettro = 0.5, drago = 1, buio = 2, acciaio = 0.5, folletto = 0.5}
eff.roccia = {normale = 1, fuoco = 2, acqua = 1, elettro = 1, erba = 1, ghiaccio = 2, lotta = 0.5, veleno = 1, terra = 0.5,
volante = 2, psico = 1, coleottero = 2, roccia = 1, spettro = 1, drago = 1, buio = 1, acciaio = 0.5, folletto = 1}
eff.spettro = {normale = 0, fuoco = 1, acqua = 1, elettro = 1, erba = 1, ghiaccio = 1, lotta = 1, veleno = 1, terra = 1,
volante = 1, psico = 2, coleottero = 1, roccia = 1, spettro = 2, drago = 1, buio = 0.5, acciaio = 1, folletto = 1}
eff.drago = {normale = 1, fuoco = 1, acqua = 1, elettro = 1, erba = 1, ghiaccio = 1, lotta = 1, veleno = 1, terra = 1,
volante = 1, psico = 1, coleottero = 1, roccia = 1, spettro = 1, drago = 2, buio = 1, acciaio = 0.5, folletto = 0}
eff.buio = {normale = 1, fuoco = 1, acqua = 1, elettro = 1, erba = 1, ghiaccio = 1, lotta = 0.5, veleno = 1, terra = 1,
volante = 1, psico = 2, coleottero = 1, roccia = 1, spettro = 2, drago = 1, buio = 0.5, acciaio = 1, folletto = 0.5}
eff.acciaio = {normale = 1, fuoco = 0.5, acqua = 0.5, elettro = 0.5, erba = 1, ghiaccio = 2, lotta = 1, veleno = 1, terra = 1,
volante = 1, psico = 1, coleottero = 1, roccia = 2, spettro = 1, drago = 1, buio = 1, acciaio = 0.5, folletto = 2}
eff.folletto = {normale = 1, fuoco = 0.5, acqua = 1, elettro = 1, erba = 1, ghiaccio = 1, lotta = 2, veleno = 0.5, terra = 1,
volante = 1, psico = 1, coleottero = 1, roccia = 1, spettro = 1, drago = 2, buio = 2, acciaio = 0.5, folletto = 1}
eff.coleot = eff.coleottero
for a in pairs(eff) do
eff[a].coleot = eff[a].coleottero
end
--[[
Le abilità che alterano l'efficacia dei tipi:
il primo indice è il nome dell'abilità, il
secondo il tipo alterato e il valore associato
sarà moltiplicato all'efficacia calcolata solo
con i tipi.
Per esempio, all'indice grassospess corrispondono
i due tipi fuoco e ghiaccio, entrambi con valore
0.5, perché l'abilità dimezza l'efficacia di
questi due tipi.
Filtro, Solidroccia e Magidifesa sono trattate a parte.
--]]
local ability = {}
ability.levitazione = {terra = 0}
ability.grassospesso = {fuoco = 0.5, ghiaccio = 0.5}
ability.antifuoco = {fuoco = 0.5}
ability.fuocardore = {fuoco = 0}
ability.pellearsa = {fuoco = 1.25, acqua = 0}
ability.acquascolo = {acqua = 0}
ability.assorbacqua = ability.acquascolo
ability.parafulmine = {elettro = 0}
ability.elettrorapid = ability.parafulmine
ability.assorbivolt = ability.parafulmine
ability.mangiaerba = {erba = 0}
ability['mare primordiale'] = ability.fuocardore
ability['terra estrema'] = ability.acquascolo
ability['flusso delta'] = {elettro = 0.5, ghiaccio = 0.5, roccia = 0.5}
--[[
Creazione dinamica di una table contenente tutte le
abilità che influenzano l'efficacia tipi, ad oguna
delle quali è associata una table con i tipi da essa
influenzati. Le abilità sono gli indici e i tipi
influenzati gli elementi associati, es: all'indice
pellearsa corrisponde una table contenente i tipi
fuoco e acqua.
Fanno eccezione Magidifesa, Filtro e Solidroccia,
che non hanno tipi associati fissi
--]]
et.modTypesAbil = {magidifesa = {}, filtro = {}, solidroccia = {}}
for abil, types in pairs(ability) do
et.modTypesAbil[abil] = {}
for Type, eff in pairs(types) do
table.insert(et.modTypesAbil[abil], Type)
end
end
--[[
Creazione dinamica di una table con i tipi che hanno
immunità, con associati i tipi a cui sono immuni. I
primi sono gli indici, i secondi gli elementi di una
table ad essi associata, es: all'indice spettro
è associata una table contenente i tipi lotta e normale
--]]
et.typesHaveImm = {}
for atk, defs in pairs(eff) do
for def, eff in pairs(defs) do
if eff == 0 then
if type(et.typesHaveImm[def]) ~= 'table' then
et.typesHaveImm[def] = {}
end
table.insert(et.typesHaveImm[def], atk)
end
end
end
--[[
Calcola l'efficacia di un attacco; si aspetta i
nomi dei tipi e dell'abilità, tutti in minuscolo
--]]
et.efficacia = function(atk, def1, def2, abil)
-- Efficacia base con due tipi
local e = eff[atk][def1]
if def2 ~= def1 then
e = e * eff[atk][def2]
end
-- Abilità standard
if ability[abil] and ability[abil][atk] then
return e * ability[abil][atk]
-- Filtro e solidroccia
elseif e >= 2 and (abil == 'filtro' or abil == 'solidroccia') then
return e * 0.75
-- Magidifesa
elseif e < 2 and abil == 'magidifesa' then
return 0
end
return e
end
--[[
Cerca tutti i tipi che soddisfano una condizione data.
Il parametro test è una funzione che si aspetta un solo
argomento (vedere gli esempi dopo per chiarimenti).
--]]
local cerca_tipi = function(test)
local t = {}
for k in pairs(eff) do
if k ~= 'coleottero' and test(k) then
table.insert(t, k)
end
end
return t
end
--[[
Trova tutti i tipi che attaccando tipo1 e tipo2, con
abilità abil, hanno efficacia eff
--]]
et.difesa = function(eff, tipo1, tipo2, abil)
return cerca_tipi(function (x) return et.efficacia(x, tipo1, tipo2, abil) == eff end)
end
-- Trova tutti i tipi su cui tipo ha efficacia eff
et.attacco = function(eff, tipo)
return cerca_tipi(function (x) return et.efficacia(tipo, x, x, 'Tanfo') == eff end)
end
return et