21 public override CursorInfo CursorIcon
25 return CursorSystem.IconRange;
31 public override int PerformDistance
41 public override string Name
49 return "ActReload".lang();
54 public override string GetText(
string str =
"")
58 return base.GetText(str);
64 public override bool CanPerform()
66 if (
Act.CC.isRestrained)
76 return Act.CC.CanSeeLos(
Act.TP, -1);
78 return Act.TC.IsAliveInCurrentZone &&
Act.CC.CanSeeLos(
Act.TC.pos, -1);
82 public override bool Perform()
84 ActRanged.<>c__DisplayClass10_0 CS$<>8__locals1 =
new ActRanged.<>c__DisplayClass10_0();
85 CS$<>8__locals1.<>4__this =
this;
88 Act.TC =
Act.TP.FindAttackTarget();
103 Act.CC.renderer.NextFrame();
106 Act.CC.TryEquipRanged();
108 CS$<>8__locals1.weapon =
Act.CC.ranged;
109 if (CS$<>8__locals1.weapon ==
null || !CS$<>8__locals1.weapon.CanAutoFire(
Act.CC,
Act.TC,
false))
113 if (
Act.CC.body.IsTooHeavyToEquip(CS$<>8__locals1.weapon))
117 Msg.Say(
"tooHeavyToEquip", CS$<>8__locals1.weapon,
null,
null,
null);
124 if ((effectData =
EClass.setting.effect.guns.TryGetValue(CS$<>8__locals1.weapon.id,
null)) ==
null)
126 effectData =
EClass.setting.effect.guns[flag2 ?
"cane" : (flag ?
"gun" :
"bow")];
129 CS$<>8__locals1.hasHit =
false;
130 CS$<>8__locals1.numFire = effectData2.num;
131 CS$<>8__locals1.numFireWithoutDamageLoss = CS$<>8__locals1.numFire;
132 int num = CS$<>8__locals1.weapon.Evalue(602);
135 CS$<>8__locals1.numFire += num / 10 + ((num % 10 >
EClass.rnd(10)) ? 1 : 0);
137 CS$<>8__locals1.numFire +=
Act.CC.Evalue(1652);
138 int num2 = CS$<>8__locals1.numFire;
139 int num3 = 1 + CS$<>8__locals1.weapon.material.hardness / 30 +
EClass.rnd(3);
140 CS$<>8__locals1.drill = CS$<>8__locals1.weapon.Evalue(606);
141 CS$<>8__locals1.scatter = CS$<>8__locals1.weapon.Evalue(607);
142 int num4 = CS$<>8__locals1.weapon.Evalue(604);
145 for (
int i = 0; i < CS$<>8__locals1.numFire; i++)
147 if (Mathf.Sqrt((
float)num4) * 5f + 10f > (
float)
EClass.rnd(100))
152 num3 = Mathf.Max(1, num3 * 100 / (100 + num4 * 5));
154 CS$<>8__locals1.missSound = ((CS$<>8__locals1.weapon.trait is
TraitToolRangeGun) ?
"miss_bullet" :
"miss_arrow");
157 foreach (
Element element
in from e
in CS$<>8__locals1.weapon.elements.dict.Values
158 where e.source.categorySub ==
"eleAttack"
161 num3 += element.source.LV / 15;
165 if (
Act.CC.mana.value < num3)
167 if (!
Act.CC.ai.IsNoGoal)
173 ActPlan.warning =
true;
174 Dialog.TryWarnMana(delegate
176 if (CS$<>8__locals1.<>4__this.Perform())
178 EClass.player.EndTurn(
true);
191 return ActRanged.TryReload(CS$<>8__locals1.weapon,
null);
193 if (CS$<>8__locals1.weapon.c_ammo <= 0)
195 if (!
ActRanged.TryReload(CS$<>8__locals1.weapon,
null))
199 EInput.Consume(
false, 1);
210 Act.CC.Say(
"fear",
Act.CC,
Act.TC,
null,
null);
213 EInput.Consume(
true, 1);
219 CS$<>8__locals1.index = 0;
220 CS$<>8__locals1.orgTP =
Act.TP.Copy();
221 CS$<>8__locals1.points =
new List<Point>();
222 if (CS$<>8__locals1.drill > 0)
224 CS$<>8__locals1.points =
EClass._map.ListPointsInLine(
Act.CC.pos,
Act.TP, CS$<>8__locals1.drill / 10 + ((CS$<>8__locals1.drill % 10 >
EClass.rnd(10)) ? 1 : 0) + 1);
226 else if (CS$<>8__locals1.scatter > 0)
228 Act.TP.ForeachNeighbor(delegate(
Point _p)
230 CS$<>8__locals1.points.Add(_p.Copy());
233 if (
EClass.core.config.game.waitOnRange)
237 CS$<>8__locals1.<Perform>g__Shoot|1(
Act.TC,
Act.TP);
238 if (CS$<>8__locals1.points.Count > 0)
241 foreach (
Point point
in CS$<>8__locals1.points)
243 if (!point.Equals(obj))
245 Chara firstChara = point.FirstChara;
246 if ((firstChara ==
null || firstChara.IsHostile(
Act.CC)) && (firstChara !=
null || CS$<>8__locals1.scatter != 0))
248 CS$<>8__locals1.<Perform>g__Shoot|1(point.FirstChara, point);
255 CS$<>8__locals1.weapon.c_ammo -= num2;
256 if (CS$<>8__locals1.weapon.ammoData !=
null)
258 CS$<>8__locals1.weapon.ammoData.Num = CS$<>8__locals1.weapon.c_ammo;
260 if (CS$<>8__locals1.weapon.c_ammo <= 0)
262 CS$<>8__locals1.weapon.c_ammo = 0;
263 CS$<>8__locals1.weapon.ammoData =
null;
270 if (
Act.TC !=
null && !CS$<>8__locals1.hasHit)
272 Act.CC.PlaySound(CS$<>8__locals1.missSound, 1f,
true);
282 Act.CC.mana.Mod(-num3 * CS$<>8__locals1.numFire);
289 public static bool TryReload(
Thing weapon,
Thing ammo =
null)
296 if (weapon.ammoData !=
null)
298 if (weapon.ammoData.Num > 0)
300 Act.CC.Pick(weapon.ammoData,
true,
true);
302 weapon.ammoData =
null;
309 ammo =
EClass.player.FindAmmo(weapon);
313 if (!weapon.IsMeleeWithAmmo)
315 Msg.Say(
"noAmmo", weapon,
null,
null,
null);
319 num = Mathf.Min(ammo.Num, traitToolRange.MaxAmmo);
320 Thing thing = ammo.Split(num);
321 Act.CC.Say(
"takeAmmo", thing,
null,
null);
322 if (thing.GetRootCard() ==
Act.CC)
324 thing.parent.RemoveCard(thing);
326 weapon.ammoData = thing;
330 num = traitToolRange.MaxAmmo;
333 int num2 = traitToolRange.ReloadTurn;
334 num2 = num2 * 100 / (100 +
Act.CC.Evalue(1652) * 100);
335 if (traitToolRange.NeedReload && num2 > 0)