Elin Decompiled Documentation EA 23.102 Nightly
Loading...
Searching...
No Matches
ActThrow.cs
Go to the documentation of this file.
1using UnityEngine;
2
3public class ActThrow : ActBaseAttack
4{
5 public Thing target;
6
7 public Chara pcTarget;
8
9 public override bool CanPressRepeat => true;
10
12
13 public override int PerformDistance => 99;
14
15 public override string GetText(string str = "")
16 {
17 string text = "";
18 if (target != null && pcTarget != null && target.trait is TraitMonsterBall && pcTarget.LV > target.LV)
19 {
20 text = " " + "mb_invalidLV".lang();
21 }
22 return base.GetText(str) + text;
23 }
24
25 public override bool CanPerform()
26 {
27 if (pcTarget != null && pcTarget.ExistsOnMap)
28 {
30 }
31 if (!Act.TP.IsHidden)
32 {
33 return Act.CC.CanSeeLos(Act.TP);
34 }
35 return false;
36 }
37
38 public override bool Perform()
39 {
40 if (target == null)
41 {
42 target = Act.TC as Thing;
43 }
44 if (target == null || target.isDestroyed || target.GetRootCard() != Act.CC)
45 {
46 return false;
47 }
48 if (pcTarget != null)
49 {
51 {
52 return false;
53 }
55 }
57 return true;
58 }
59
60 public static bool CanThrow(Chara c, Thing t, Card target, Point p = null)
61 {
62 if (t == null)
63 {
64 return false;
65 }
66 if (t.c_isImportant && !t.HasElement(410))
67 {
68 return false;
69 }
70 if (p == null && target != null && target.ExistsOnMap)
71 {
72 p = target.pos;
73 }
74 if (p == null)
75 {
76 return false;
77 }
78 if ((p.HasBlock && !p.cell.hasDoor && p.sourceBlock.tileType.IsBlockPass) || p.Equals(EClass.pc.pos) || t.trait.CanExtendBuild || t.trait.CanOnlyCarry)
79 {
80 return false;
81 }
83 {
84 Card card = target ?? p.FindAttackTarget();
85 if (card != null && card.IsPCFactionOrMinion)
86 {
87 return false;
88 }
89 }
90 return true;
91 }
92
93 public static EffectIRenderer Throw(Card c, Point p, Thing t, ThrowMethod method = ThrowMethod.Default, float failChance = 0f)
94 {
95 if (failChance > EClass.rndf(1f))
96 {
97 Point randomPoint = p.GetRandomPoint(1);
98 if (randomPoint != null && !randomPoint.Equals(c.pos))
99 {
100 p = randomPoint;
101 }
102 }
103 return Throw(c, p, p.FindAttackTarget(), t, method);
104 }
105
106 public static EffectIRenderer Throw(Card c, Point p, Card target, Thing t, ThrowMethod method = ThrowMethod.Default)
107 {
108 if (t.parent != EClass._zone && !t.HasElement(410))
109 {
111 }
112 Act.TP.Set(p);
113 Act.TC = target;
114 if (t.trait.ThrowType == ThrowType.Snow)
115 {
116 t.dir = EClass.rnd(2);
117 c.Talk("snow_throw");
118 if (EClass.rnd(2) == 0)
119 {
120 Act.TC = null;
121 }
122 }
123 c.Say("throw", c, t.GetName(NameStyle.Full, 1));
124 c.LookAt(p);
126 c.PlaySound("throw");
127 EffectIRenderer result = null;
128 if (c.isSynced || p.IsSync)
129 {
130 result = Effect.Get<EffectIRenderer>((t.trait is TraitBall) ? "throw_ball" : "throw").Play((c.isChara && c.Chara.host != null) ? c.Chara.host : c, t, c.pos, p, 0.2f);
131 t.renderer.SetFirst(first: false, c.renderer.position);
132 }
133 if (!t.HasElement(410))
134 {
135 t._Move(p);
136 }
137 if (!t.trait.CanBeDestroyed)
138 {
139 c.PlaySound("miss");
140 return result;
141 }
142 ThrowType throwType = t.trait.ThrowType;
143 if ((uint)(throwType - 1) <= 1u)
144 {
145 Msg.Say("shatter");
146 }
147 bool flag = method == ThrowMethod.Reward;
148 bool flag2 = method == ThrowMethod.Default;
149 switch (t.trait.ThrowType)
150 {
151 case ThrowType.Explosive:
152 flag = true;
153 t.c_uidRefCard = c.uid;
154 t.Die(null, c, AttackSource.Throw);
155 break;
156 case ThrowType.Vase:
157 t.Die(null, null, AttackSource.Throw);
158 break;
159 case ThrowType.Potion:
160 flag = true;
161 if (Act.TC != null)
162 {
163 Act.TC.Say("throw_hit", t, Act.TC);
164 }
165 Act.TP.ModFire(-50, extinguish: true);
166 if (Act.TC != null && Act.TC.isChara)
167 {
168 if (t.trait.CanDrink(Act.TC.Chara))
169 {
171 }
172 flag2 = t.IsNegativeGift;
174 }
175 else
176 {
178 }
179 t.Die(null, null, AttackSource.Throw);
180 c.ModExp(108, 50);
181 break;
182 case ThrowType.Snow:
183 flag = true;
184 flag2 = false;
185 if (Act.TC != null && Act.TC.isChara)
186 {
187 Act.TC.Say("throw_hit", t, Act.TC);
188 if (EClass.rnd(2) == 0)
189 {
190 c.Talk("snow_hit");
191 }
193 t.Die(null, null, AttackSource.Throw);
194 c.ModExp(108, 50);
195 }
196 break;
197 case ThrowType.Ball:
198 flag = true;
199 flag2 = false;
200 if (Act.TC != null && Act.TC.isChara)
201 {
202 Act.TC.Say("throw_hit", t, Act.TC);
203 if (EClass.rnd(2) == 0)
204 {
205 c.Talk("snow_hit");
206 }
207 Act.TC.Say("ball_hit");
208 Act.TC.Chara?.Pick(t);
209 c.ModExp(108, 50);
210 }
211 break;
212 case ThrowType.Flyer:
213 flag = true;
214 flag2 = false;
215 if (Act.TC != null && Act.TC.isChara && c.isChara)
216 {
217 Act.TC.Say("throw_hit", t, Act.TC);
218 c.Chara.GiveGift(Act.TC.Chara, t);
219 c.ModExp(108, 50);
220 }
221 break;
222 case ThrowType.MonsterBall:
223 {
224 flag = true;
225 flag2 = false;
226 TraitMonsterBall traitMonsterBall = t.trait as TraitMonsterBall;
227 if (traitMonsterBall.chara != null)
228 {
229 if (traitMonsterBall.IsLittleBall && !(EClass._zone is Zone_LittleGarden))
230 {
231 break;
232 }
233 Chara _c = EClass._zone.AddCard(traitMonsterBall.chara, p).Chara;
234 _c.PlayEffect("identify");
235 t.Die();
236 if (traitMonsterBall.IsLittleBall && _c.id == "littleOne")
237 {
238 _c.orgPos = c.pos.Copy();
239 Chara chara = _c;
240 Hostility c_originalHostility = (_c.hostility = Hostility.Neutral);
241 chara.c_originalHostility = c_originalHostility;
243 _c.PlaySound("chime_angel");
244 EClass.core.actionsNextFrame.Add(delegate
245 {
246 _c.Talk("little_saved");
247 });
248 EClass.player.flags.little_saved = true;
250 }
251 else
252 {
253 _c.MakeAlly();
254 }
255 }
256 else
257 {
258 if (Act.TC == null || !Act.TC.isChara)
259 {
260 break;
261 }
262 Act.TC.Say("throw_hit", t, Act.TC);
263 Chara chara2 = Act.TC.Chara;
264 if (traitMonsterBall.IsLittleBall)
265 {
266 if (chara2.id != "littleOne" || EClass._zone is Zone_LittleGarden || EClass._zone.IsUserZone)
267 {
268 Msg.Say("monsterball_invalid");
269 break;
270 }
271 }
272 else
273 {
274 if (!chara2.trait.CanBeTamed || EClass._zone.IsUserZone)
275 {
276 Msg.Say("monsterball_invalid");
277 break;
278 }
279 if (chara2.LV > traitMonsterBall.owner.LV)
280 {
281 Msg.Say("monsterball_lv");
282 break;
283 }
284 if (!EClass.debug.enable && chara2.hp > chara2.MaxHP / 10)
285 {
286 Msg.Say("monsterball_hp");
287 break;
288 }
289 }
290 Msg.Say("monsterball_capture", c, chara2);
291 chara2.PlaySound("identify");
292 chara2.PlayEffect("identify");
293 t.ChangeMaterial("copper");
294 if (chara2.IsLocalChara)
295 {
296 Debug.Log("Creating Replacement NPC for:" + chara2);
298 }
299 traitMonsterBall.chara = chara2;
300 EClass._zone.RemoveCard(chara2);
301 chara2.homeZone = null;
302 c.ModExp(108, 100);
303 }
304 break;
305 }
306 }
307 if (t.trait is TraitDye)
308 {
310 }
311 if (!flag && Act.TC != null)
312 {
313 AttackProcess.Current.Prepare(c.Chara, t, Act.TC, Act.TP, 0, _isThrow: true);
314 if (AttackProcess.Current.Perform(0, hasHit: false))
315 {
317 {
319 }
320 if (!t.isDestroyed && t.trait.CanBeDestroyed && !t.IsFurniture && !t.category.IsChildOf("instrument") && !t.IsUnique && !t.HasElement(410))
321 {
322 t.Destroy();
323 }
324 }
325 else
326 {
327 c.PlaySound("miss");
328 }
329 }
330 if (EClass.rnd(2) == 0)
331 {
332 c.Chara.RemoveCondition<ConInvisibility>();
333 }
334 if (Act.TC != null)
335 {
336 if (flag2)
337 {
339 }
341 {
342 c.Chara.stamina.Mod(-1);
343 }
344 }
345 if (t.HasElement(410) && Act.TC != null && Act.CC == EClass.pc && !(Act.CC.ai is AI_PracticeDummy) && (Act.TC.trait is TraitTrainingDummy || Act.TC.IsRestrainedResident) && Act.CC.stamina.value > 0)
346 {
348 {
349 target = Act.TC,
350 throwItem = t
351 });
352 }
353 return result;
354 }
355}
AttackSource
Definition: AttackSource.cs:2
Hostility
Definition: Hostility.cs:2
NameStyle
Definition: NameStyle.cs:2
ThrowMethod
Definition: ThrowMethod.cs:2
ThrowType
Definition: ThrowType.cs:2
Chara pcTarget
Definition: ActThrow.cs:7
static EffectIRenderer Throw(Card c, Point p, Thing t, ThrowMethod method=ThrowMethod.Default, float failChance=0f)
Definition: ActThrow.cs:93
Thing target
Definition: ActThrow.cs:5
override bool CanPerform()
Definition: ActThrow.cs:25
override bool Perform()
Definition: ActThrow.cs:38
override int PerformDistance
Definition: ActThrow.cs:13
override string GetText(string str="")
Definition: ActThrow.cs:15
static bool CanThrow(Chara c, Thing t, Card target, Point p=null)
Definition: ActThrow.cs:60
static EffectIRenderer Throw(Card c, Point p, Card target, Thing t, ThrowMethod method=ThrowMethod.Default)
Definition: ActThrow.cs:106
override bool CanPressRepeat
Definition: ActThrow.cs:9
Definition: ACT.cs:62
static Card TC
Definition: ACT.cs:79
static Point TP
Definition: ACT.cs:81
static Chara CC
Definition: ACT.cs:77
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
Definition: AttackProcess.cs:8
List< Action > actionsNextFrame
Definition: BaseCore.cs:31
Vector3 position
Definition: CardRenderer.cs:21
virtual void NextFrame()
Definition: Card.cs:11
bool IsNegativeGift
Definition: Card.cs:2256
bool isDestroyed
Definition: Card.cs:71
virtual MoveResult _Move(Point p, MoveType type=MoveType.Walk)
Definition: Card.cs:5117
virtual Chara Chara
Definition: Card.cs:1946
Thing Split(int a)
Definition: Card.cs:3231
string id
Definition: Card.cs:31
bool IsRestrainedResident
Definition: Card.cs:2118
bool HasElement(int ele, int req=1)
Definition: Card.cs:5214
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:5404
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
Definition: Card.cs:2838
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
Definition: Card.cs:5949
int hp
Definition: Card.cs:226
ICardParent parent
Definition: Card.cs:51
bool ExistsOnMap
Definition: Card.cs:1961
virtual void Die(Element e=null, Card origin=null, AttackSource attackSource=AttackSource.None)
Definition: Card.cs:4471
bool IsFurniture
Definition: Card.cs:2111
Point pos
Definition: Card.cs:55
virtual void LookAt(Card c)
Definition: Card.cs:5471
int uid
Definition: Card.cs:118
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:5438
Trait trait
Definition: Card.cs:49
virtual bool IsAliveInCurrentZone
Definition: Card.cs:2003
void Destroy()
Definition: Card.cs:4538
bool c_isImportant
Definition: Card.cs:984
virtual bool isChara
Definition: Card.cs:1959
Card GetRootCard()
Definition: Card.cs:3173
void ModExp(string alias, int a)
Definition: Card.cs:2508
string c_idRefName
Definition: Card.cs:1541
SourceCategory.Row category
Definition: Card.cs:1925
CardRenderer renderer
Definition: Card.cs:57
void KillAnime()
Definition: Card.cs:5418
int LV
Definition: Card.cs:370
virtual bool isSynced
Definition: Card.cs:1963
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:6046
Definition: Chara.cs:10
new TraitChara trait
Definition: Chara.cs:488
Chara CreateReplacement()
Definition: Chara.cs:7233
Condition AddCondition(string id, int p=100, bool force=false)
Definition: Chara.cs:8415
override bool IsPC
Definition: Chara.cs:597
Chara host
Definition: Chara.cs:33
bool CanSeeLos(Card c, int dist=-1)
Definition: Chara.cs:1059
AIAct SetAI(AIAct g)
Definition: Chara.cs:8045
override int MaxHP
Definition: Chara.cs:693
void MakeAlly(bool msg=true)
Definition: Chara.cs:2004
Stats stamina
Definition: Chara.cs:955
bool IsLocalChara
Definition: Chara.cs:794
void GiveGift(Chara c, Thing t)
Definition: Chara.cs:7480
void DoHostileAction(Card _tg, bool immediate=false)
Definition: Chara.cs:5707
Thing Pick(Thing t, bool msg=true, bool tryStack=true)
Definition: Chara.cs:3920
void OnGiveErohon(Thing t)
Definition: Chara.cs:7602
Definition: ConWet.cs:2
bool shiftToUseNegativeAbilityOnSelf
Definition: CoreConfig.cs:193
new GameConfig game
Definition: CoreConfig.cs:596
bool enable
Definition: CoreDebug.cs:285
CoreConfig config
Definition: Core.cs:70
Definition: EClass.cs:5
static int rnd(int a)
Definition: EClass.cs:50
static Core core
Definition: EClass.cs:6
static Zone _zone
Definition: EClass.cs:20
static Map _map
Definition: EClass.cs:18
static float rndf(float a)
Definition: EClass.cs:79
static Player player
Definition: EClass.cs:12
static Chara pc
Definition: EClass.cs:14
static CoreDebug debug
Definition: EClass.cs:48
Definition: EInput.cs:8
static bool isShiftDown
Definition: EInput.cs:261
EffectIRenderer Play(Card _card, Card _origin, Vector3 _to)
Definition: Effect.cs:7
static Effect Get(Effect original)
Definition: Effect.cs:85
List< Chara > deadCharas
Definition: Map.cs:46
Definition: Msg.cs:5
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Definition: Msg.cs:58
int little_saved
Definition: Player.cs:736
Definition: Point.cs:9
Point Copy()
Definition: Point.cs:467
Point Set(int _x, int _z)
Definition: Point.cs:479
void ModFire(int value, bool extinguish=false)
Definition: Point.cs:897
bool IsSync
Definition: Point.cs:320
bool Equals(int _x, int _z)
Definition: Point.cs:924
Card FindAttackTarget()
Definition: Point.cs:1062
bool IsHidden
Definition: Point.cs:323
Point GetRandomPoint(int radius, bool requireLos=true, bool allowChara=true, bool allowBlocked=false, int tries=100)
Definition: Point.cs:741
virtual void Mod(int a)
Definition: Stats.cs:135
static TargetTypeGround Ground
Definition: TargetType.cs:15
Definition: Thing.cs:8
override string GetName(NameStyle style, int _num=-1)
Definition: Thing.cs:494
virtual bool CanBeTamed
Definition: TraitChara.cs:104
virtual bool IsLittleBall
virtual bool CanExtendBuild
Definition: Trait.cs:161
virtual bool CanBeAttacked
Definition: Trait.cs:159
virtual void OnThrowGround(Chara c, Point p)
Definition: Trait.cs:946
virtual bool CanBeDestroyed
Definition: Trait.cs:285
Card owner
Definition: Trait.cs:26
virtual void OnDrink(Chara c)
Definition: Trait.cs:942
virtual bool CanDrink(Chara c)
Definition: Trait.cs:937
virtual ThrowType ThrowType
Definition: Trait.cs:241
virtual bool CanOnlyCarry
Definition: Trait.cs:283
virtual bool IsUserZone
Definition: Zone.cs:264
void RemoveCard(Card t)
Definition: Zone.cs:1933
void ModInfluence(int a)
Definition: Zone.cs:3301
Card AddCard(Card t, Point point)
Definition: Zone.cs:1893