106 {
107 Act.CC.combatCount = 10;
111 {
114 {
116 }
117 return true;
118 }
121 {
122 Act.TC = c;
123 })).GetValueOrDefault();
126 if (effect !=
null && effect.
id == 6 &&
EClass.
rnd(2) == 0)
127 {
130 return true;
131 }
132 bool hasHit = false;
133 bool hasMissed = false;
134 bool usedWeapon = false;
135 bool usedTalisman = false;
137 int count = 0;
143 bool parried = false;
145 {
146 _Attack(slot);
147 if (parried)
148 {
149 break;
150 }
151 }
152 if (!usedWeapon)
153 {
154 _Attack(null);
155 }
157 {
159 }
161 {
163 }
165 {
166 if (parried)
167 {
169 }
171 {
174 }
175 }
176 Act.TC = orgTC;
177 Act.CC = cC;
178 if (!hasHit)
179 {
181 }
182 return true;
184 {
185 Act.TC = orgTC;
186 Act.TP = orgPos;
188 int splash;
189 int chaser;
190 int flurry;
191 int frustration;
192 int feint;
193 int knockback;
194 int mod_talisman;
196 {
197 w = null;
198 if (slot != null)
199 {
201 {
202 return;
203 }
205 }
207 if (!
UseWeaponDist || dist <= 1 || dist <= num || intercepted)
208 {
209 int num2 = GetWeaponEnc(606, addSelfEnc: false);
210 int scatter = GetWeaponEnc(607, addSelfEnc: false);
211 splash = GetWeaponEnc(608, addSelfEnc: true);
212 chaser = GetWeaponEnc(620, addSelfEnc: true);
213 flurry = GetWeaponEnc(621, addSelfEnc: true);
214 frustration = GetWeaponEnc(624, addSelfEnc: true);
215 int num3 = GetWeaponEnc(622, addSelfEnc: true);
216 feint = GetWeaponEnc(623, addSelfEnc: true);
217 knockback = GetWeaponEnc(603, addSelfEnc: true);
218 mod_talisman = GetWeaponEnc(609, addSelfEnc: true);
220 if (w != null)
221 {
223 {
225 {
226 return;
227 }
228 num2 = (scatter = (splash = (num3 = 0)));
229 }
230 usedWeapon = true;
232 {
234 }
235 }
236 AttackWithFlurry(
Act.
TC,
Act.
TP, 1f, subAttack:
false);
237 if (!parried)
238 {
239 if (num2 > 0)
240 {
242 {
243 if (!
item.Equals(orgPos))
244 {
247 {
248 AttackWithFlurry(firstChara,
item, 1f, subAttack:
false);
249 }
250 }
251 }
252 }
253 else if (scatter > 0)
254 {
256 {
258 {
259 Chara firstChara2 = p.FirstChara;
260 if (firstChara2 != null && firstChara2.IsHostile(Act.CC))
261 {
262 AttackWithFlurry(firstChara2, p, Mathf.Min(0.5f + 0.05f * Mathf.Sqrt(scatter), 1f + 0.01f * Mathf.Sqrt(scatter)), subAttack: true);
263 }
264 }
265 });
266 }
267 else if (num3 > 0)
268 {
269 List<Point> list = new List<Point>();
271 {
273 {
274 list.Add(p.Copy());
275 }
276 });
277 list.Shuffle();
278 int num4 = 0;
279 for (
int i = 0; i < 9 && num3 >
EClass.
rnd(10 + (
int)Mathf.Pow(3f, i + 2)); i++)
280 {
281 num4++;
282 }
283 foreach (
Point item2
in list)
284 {
286 {
288 {
289 break;
290 }
292 {
293 AttackWithFlurry(item3, item2, 1f, subAttack: true);
294 if (parried)
295 {
296 break;
297 }
298 num4--;
299 }
300 }
301 }
302 }
303 }
304 count++;
305 }
306 }
308 {
309 Act.TC = _tc;
310 Act.TP = _tp;
313 {
316 {
320 {
322 {
324 {
326 }
327 }
328 }
329 num6 = num6 * 100 / (int)Mathf.Clamp((float)AttackProcess.Current.weaponSkill.Value / (float)num7 * 100f, 50f, 150f);
331 {
334 parried = true;
335 return;
336 }
337 }
338 }
339 int num8 = 1;
340 if (chaser > 0)
341 {
342 for (int j = 0; j < 10; j++)
343 {
344 if (chaser >
EClass.
rnd(4 + (
int)Mathf.Pow(4f, j + 2)))
345 {
346 num8++;
347 }
348 }
349 }
350 bool flag = false;
351 for (int k = 0; k < num8; k++)
352 {
354 {
355 break;
356 }
358 {
359 break;
360 }
361 if (k > 0)
362 {
364 }
366 if (!flag && frustration > 0 && !
Act.
TC.
HasElement(439) && 10f + 2f * Mathf.Sqrt(frustration) > (float)
EClass.
rnd(100))
367 {
368 AttackProcess.Current.critFury = true;
370 AttackProcess.Current.critFury = false;
371 }
373 {
374 break;
375 }
376 }
377 if (flag)
378 {
379 hasHit = true;
380 }
381 else
382 {
383 hasMissed = true;
384 }
385 Act.TC = _tc;
386 Act.TP = _tp;
388 {
389 bool flag2 = true;
392 {
393 flag2 = false;
395 {
399 {
400 usedTalisman = true;
401 flag2 = true;
402 if (mod_talisman > 0 && Mathf.Min(10f + Mathf.Sqrt(mod_talisman) * 5f, 90f) > (
float)
EClass.
rnd(100))
403 {
404 flag2 = false;
405 }
408 }
409 Act.powerMod = 100;
410 }
411 }
412 if (flag2)
413 {
416 {
417 w.ammoData.Num = w.
c_ammo;
418 }
420 {
421 w.c_ammo = 0;
422 w.ammoData = null;
423 }
425 }
426 }
427 Act.TC = _tc;
429 {
431 if (feint > 0 && 10f + 4f * Mathf.Sqrt(feint) > (float)
EClass.
rnd(100))
432 {
434 }
435 }
436 if (splash > 0)
437 {
439 {
441 {
442 return;
443 }
445 {
448 }
450 {
452 {
456 }
457 }
458 });
459 }
461 {
463 bool flag3 = Act.CC.id == "tsunami";
465 {
468 if (flag3)
469 {
472 }
473 }
474 else if (flag3)
475 {
480 {
484 }
486 }
487 }
488 }
489 void AttackWithFlurry(
Card _tc,
Point _tp,
float mtp,
bool subAttack)
490 {
491 int num10 = 1;
492 if (flurry > 0)
493 {
494 for (
int l = 0; l < 10 && flurry >
EClass.
rnd(25 + (
int)Mathf.Pow(5f, l + 2)); l++)
495 {
496 num10++;
497 }
498 }
499 for (int m = 0; m < num10; m++)
500 {
502 {
503 break;
504 }
506 {
507 break;
508 }
509 if (m > 0)
510 {
512 }
513 Attack(_tc, _tp, mtp, subAttack);
514 if (parried)
515 {
516 break;
517 }
518 }
519 }
520 int GetWeaponEnc(int ele, bool addSelfEnc)
521 {
523 }
524 }
525 }
static Act Create(int id)
virtual bool ShouldRollMax
override bool CanPerform()
virtual bool AllowCounter
virtual bool UseWeaponDist
static bool TryReload(Thing weapon, Thing ammo=null)
void Prepare(Chara _CC, Thing _weapon, Card _TC=null, Point _TP=null, int _attackIndex=0, bool _isThrow=false)
bool Perform(int count, bool hasHit, float dmgMulti=1f, bool maxRoll=false, bool subAttack=false)
static AttackProcess Current
int GetRawDamage(float dmgMulti, bool crit, bool maxRoll)
static int GetWeaponEnc(Chara CC, Thing w, int ele, bool addSelfEnc=false)
void PlayAnime(AnimeID id, bool force)
virtual void SetFirst(bool first, Vector3 pos)
ElementContainerCard elements
bool IsRestrainedResident
void DamageHP(int dmg, AttackSource attackSource=AttackSource.None, Card origin=null)
bool HasElement(int ele, int req=1)
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
virtual int ApplyProtection(int dmg, int mod=100)
virtual bool IsAliveInCurrentZone
void ModExp(string alias, int a)
SourceCategory.Row category
void Say(string lang, string ref1=null, string ref2=null)
override bool IsAliveInCurrentZone
MoveResult TryMoveFrom(Point p)
Condition AddCondition(string id, int p=100, bool force=false)
bool RequestProtection(Chara attacker, Action< Chara > action)
bool HasCondition(string alias)
override void Die(Element e=null, Card origin=null, AttackSource attackSource=AttackSource.None, Chara originalTarget=null)
void DoHostileAction(Card _tg, bool immediate=false)
override void LookAt(Card c)
static int curve(int a, int start, int step, int rate=75)
static void Wait(float a, Card c)
int GetSpellExp(Chara c, Element e, int costMod=100)
Element GetElement(string alias)
static void SetDirty(Thing t)
List< Point > ListPointsInLine(Point center, Point to, int radius)
List< Card > ListCards(bool includeMasked=false)
Point Set(int _x, int _z)
void ForeachNeighbor(Action< Point > action, bool diagonal=true)
bool Equals(int _x, int _z)
Effect PlayEffect(string id)
void Animate(AnimeID id, bool animeBlock=false)
virtual bool CanBeAttacked