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);
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 {
318 int ele2 = 123;
321 {
323 {
325 {
328 }
329 }
330 }
331 num6 = num6 * 100 / (int)Mathf.Clamp((float)AttackProcess.Current.weaponSkill.Value / (float)num7 * 100f, 50f, 150f);
333 {
337 parried = true;
338 return;
339 }
340 }
341 }
342 int num8 = 1;
343 if (chaser > 0)
344 {
345 for (int j = 0; j < 10; j++)
346 {
347 if (chaser >
EClass.
rnd(4 + (
int)Mathf.Pow(4f, j + 2)))
348 {
349 num8++;
350 }
351 }
352 }
353 bool flag = false;
354 for (int k = 0; k < num8; k++)
355 {
357 {
358 break;
359 }
361 {
362 break;
363 }
364 if (k > 0)
365 {
367 }
369 if (!flag && frustration > 0 && !
Act.
TC.
HasElement(439) && 10f + 2f * Mathf.Sqrt(frustration) > (float)
EClass.
rnd(100))
370 {
371 AttackProcess.Current.critFury = true;
373 AttackProcess.Current.critFury = false;
374 }
376 {
377 break;
378 }
379 }
380 if (flag)
381 {
382 hasHit = true;
383 }
384 else
385 {
386 hasMissed = true;
387 }
388 Act.TC = _tc;
389 Act.TP = _tp;
391 {
392 bool flag2 = true;
395 {
396 flag2 = false;
398 {
402 {
403 usedTalisman = true;
404 flag2 = true;
405 if (mod_talisman > 0 && Mathf.Min(10f + Mathf.Sqrt(mod_talisman) * 5f, 90f) > (
float)
EClass.
rnd(100))
406 {
407 flag2 = false;
408 }
411 }
412 Act.powerMod = 100;
413 }
414 }
415 if (flag2)
416 {
419 {
420 w.ammoData.Num = w.
c_ammo;
421 }
423 {
424 w.c_ammo = 0;
425 w.ammoData = null;
426 }
428 }
429 }
430 Act.TC = _tc;
432 {
434 if (feint > 0 && 10f + 4f * Mathf.Sqrt(feint) > (float)
EClass.
rnd(100))
435 {
437 }
438 }
439 if (splash > 0)
440 {
442 {
444 {
445 return;
446 }
448 {
451 }
453 {
455 {
459 }
460 }
461 });
462 }
464 {
466 bool flag3 = Act.CC.id == "tsunami";
468 {
471 if (flag3)
472 {
475 }
476 }
477 else if (flag3)
478 {
483 {
487 }
489 }
490 }
491 }
492 void AttackWithFlurry(
Card _tc,
Point _tp,
float mtp,
bool subAttack)
493 {
494 int num10 = 1;
495 if (flurry > 0)
496 {
497 for (
int l = 0; l < 10 && flurry >
EClass.
rnd(25 + (
int)Mathf.Pow(5f, l + 2)); l++)
498 {
499 num10++;
500 }
501 }
502 for (int m = 0; m < num10; m++)
503 {
505 {
506 break;
507 }
509 {
510 break;
511 }
512 if (m > 0)
513 {
515 }
516 Attack(_tc, _tp, mtp, subAttack);
517 if (parried)
518 {
519 break;
520 }
521 }
522 }
523 int GetWeaponEnc(int ele, bool addSelfEnc)
524 {
526 }
527 }
528 }
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
long 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
bool HasElement(int ele, int req=1)
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
virtual long ApplyProtection(long dmg, int mod=100)
virtual bool IsAliveInCurrentZone
void DamageHP(long dmg, AttackSource attackSource=AttackSource.None, Card origin=null)
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