Elin Decompiled Documentation EA 23.315 Nightly
Loading...
Searching...
No Matches
CustomDramaExpansion.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Linq;
5using System.Reflection;
6using System.Runtime.CompilerServices;
7using System.Text.RegularExpressions;
8using UnityEngine;
9
11{
12 private static readonly Dictionary<string, DramaActionParser> _actionParsers = new Dictionary<string, DramaActionParser>(StringComparer.OrdinalIgnoreCase);
13
14 private static readonly Dictionary<string, DramaInvokeDetail> _invokes = new Dictionary<string, DramaInvokeDetail>(StringComparer.OrdinalIgnoreCase);
15
16 internal static readonly Regex _expressionRegex = new Regex("^\\s*(?<f>\\w+)\\s*(?:\\(\\s*(?<p>.*)\\s*\\))?\\s*$", RegexOptions.Compiled);
18 public static bool ParseAction(string action, DramaManager dm, Dictionary<string, string> line)
19 {
20 if (_actionParsers.TryGetValue(action, out var value))
21 {
22 return value(dm, line);
23 }
24 return false;
25 }
26
27 public static void AddDramaActionParser(string action, DramaActionParser parser)
28 {
29 _actionParsers[action] = SafeInvoke;
30 Debug.Log("#drama added new action parser '" + action + "' from '" + parser.Method.TryToString() + "'");
31 bool SafeInvoke(DramaManager dm, Dictionary<string, string> line)
32 {
33 try
34 {
35 return parser(dm, line);
36 }
37 catch (Exception ex)
38 {
39 ModUtil.LogModError("exception while parsing drama action '" + action + "'\n" + ex.Message, parser.Method.DeclaringType);
40 Debug.LogException(ex);
41 }
42 return false;
43 }
44 }
45
46 public static void AddDramaInvokeMethod(string name, MethodInfo method, string contract = null)
47 {
48 _invokes[name] = new DramaInvokeDetail(method, contract);
49 }
50
51 public static void AddDramaInvokeMethod(string name, DramaInvokeFunc func, string contract = null)
52 {
53 AddDramaInvokeMethod(name, func.Method, contract);
54 }
55
56 internal static (DramaInvokeDetail invoke, string[] parameters) BuildInvokeExpression(string expression)
57 {
58 (string, string[]) tuple = ParseInvokeExpression(expression);
59 if (!tuple.Item1.IsEmpty() && _invokes.TryGetValue(tuple.Item1, out var value))
60 {
61 return (invoke: value, parameters: tuple.Item2);
62 }
63 if (expression.Length <= 1)
64 {
65 return (invoke: new DramaInvokeDetail(null), parameters: Array.Empty<string>());
66 }
67 return expression[0] switch
68 {
69 '!' => BuildInvokeExpression("not(" + expression[1..] + ")"),
70 '&' => BuildInvokeExpression("and(" + expression[1..] + ")"),
71 '?' => BuildInvokeExpression("or(" + expression[1..] + ")"),
72 _ => (invoke: new DramaInvokeDetail(null), parameters: Array.Empty<string>()),
73 };
74 }
75
76 internal static (string funcName, string[] parameters) ParseInvokeExpression(string expression)
77 {
78 if (expression.IsEmpty())
79 {
80 return (funcName: "", parameters: Array.Empty<string>());
81 }
82 Match match = _expressionRegex.Match(expression);
83 return (funcName: match.Groups["f"].Value, parameters: SplitParams(match.Groups["p"].Value));
84 static string[] SplitParams(string args)
85 {
86 if (args.IsEmpty())
87 {
88 return Array.Empty<string>();
89 }
90 List<string> list = new List<string>();
91 int num = 0;
92 int num2 = 0;
93 char c = '\0';
94 for (int i = 0; i < args.Length; i++)
95 {
96 char c2 = args[i];
97 if (c != 0)
98 {
99 if (c2 == c)
100 {
101 c = '\0';
102 }
103 }
104 else
105 {
106 switch (c2)
107 {
108 case '"':
109 case '\'':
110 c = c2;
111 break;
112 case '(':
113 num++;
114 break;
115 case ')':
116 num--;
117 break;
118 case ',':
119 if (num == 0)
120 {
121 string s2 = args[num2..i].Trim();
122 s2 = Unquote(s2);
123 list.Add(s2);
124 num2 = i + 1;
125 }
126 break;
127 }
128 }
129 }
130 if (num2 < args.Length)
131 {
132 string text = args[num2..].Trim();
133 if (text.Length > 0)
134 {
135 list.Add(Unquote(text));
136 }
137 }
138 return list.ToArray();
139 }
140 static string Unquote(string s)
141 {
142 if (s.Length >= 2 && ((s[0] == '"' && s[^1] == '"') || (s[0] == '\'' && s[^1] == '\'')))
143 {
144 return s[1..^1];
145 }
146 return s;
147 }
148 }
149
150 [ElinDramaActionParser("i*")]
151 [ElinDramaActionParser("invoke*")]
152 internal static bool DefaultDramaInvokeExtActionParser(DramaManager dm, Dictionary<string, string> line)
153 {
154 string text = line["param"].Trim().RemoveNewline();
155 if (text.StartsWith("//"))
156 {
157 return true;
158 }
159 var (invoke, parameters) = BuildInvokeExpression(text);
160 if (invoke.Method == null)
161 {
162 ModUtil.LogModError("invalid drama invoke* expression '" + text + "'", new FileInfo(dm.path));
163 return true;
164 }
165 string jump = line["jump"];
166 if (!jump.IsEmpty())
167 {
168 dm.AddEvent(new DramaEventMethod(null)
169 {
170 jumpFunc = () => (!invoke.SafeInvoke(dm, line, parameters)) ? "" : jump
171 });
172 return true;
173 }
174 dm.AddEvent(new DramaEventMethod(delegate
175 {
176 invoke.SafeInvoke(dm, line, parameters);
177 }));
178 return true;
179 }
180
181 [ElinDramaActionParser("eval")]
182 internal static bool DefaultDramaEvalActionParser(DramaManager dm, Dictionary<string, string> line)
183 {
184 string expr = line["param"];
185 if (expr.IsEmpty())
186 {
187 return true;
188 }
189 EScriptSubmission submission = EScriptSubmission.Create(dm.setup.book);
191 {
192 dm = dm,
193 line = line
194 };
195 string jump = line["jump"];
196 bool flag = !jump.IsEmpty();
197 bool flag2 = !line["id"].IsEmpty();
198 if (!flag && flag2)
199 {
200 Dictionary<string, string> item = new Dictionary<string, string>(line)
201 {
202 ["action"] = "",
203 ["param"] = ""
204 };
205 dm.ParseLine(item);
206 dm.lastTalk.activeCondition = delegate
207 {
208 object obj2 = DeferredCompileAndRun();
209 return obj2 is bool && (bool)obj2;
210 };
211 return true;
212 }
213 if (flag)
214 {
215 dm.AddEvent(new DramaEventMethod(null)
216 {
217 jumpFunc = delegate
219 object obj = DeferredCompileAndRun();
220 if (obj is string result)
221 {
222 return result;
223 }
224 return (obj is bool && !(bool)obj) ? "" : jump;
225 }
226 });
227 return true;
228 }
230 {
231 DeferredCompileAndRun();
232 }));
233 return true;
234 object DeferredCompileAndRun()
235 {
236 if (expr.StartsWith("<<<"))
237 {
238 string text = expr[3..].Trim();
239 string path = Path.Combine(Path.GetDirectoryName(dm.path), text);
240 if (!File.Exists(path))
241 {
242 throw new FileNotFoundException(text);
243 }
244 expr = File.ReadAllText(path);
245 }
246 return submission.Compile<EDramaScriptState>(expr)?.Invoke(state);
247 }
248 }
249
250 [MethodImpl(MethodImplOptions.AggressiveInlining)]
251 [ElinDramaActionInvoke("nodiscard,passthrough")]
252 public static bool eval(DramaManager dm, Dictionary<string, string> line, params string[] parameters)
253 {
254 string text = string.Join(',', parameters);
255 if (text.IsEmpty())
256 {
257 return false;
259 EScriptSubmission eScriptSubmission = EScriptSubmission.Create(dm.setup.book);
261 {
262 dm = dm,
263 line = line
264 };
265 if (text.StartsWith("<<<"))
266 {
267 string text2 = text[3..].Trim();
268 string path = Path.Combine(Path.GetDirectoryName(dm.path), text2);
269 if (!File.Exists(path))
270 {
271 throw new FileNotFoundException(text2);
272 }
273 text = File.ReadAllText(path);
274 }
275 object obj = eScriptSubmission.Compile<EDramaScriptState>(text)?.Invoke(arg);
276 if (obj is bool)
277 {
278 return (bool)obj;
279 }
280 return false;
281 }
283 [MethodImpl(MethodImplOptions.AggressiveInlining)]
284 [ElinDramaActionInvoke("nodiscard")]
285 public static bool and(DramaManager dm, Dictionary<string, string> line, params string[] parameters)
286 {
287 return parameters.All(delegate(string expr)
288 {
289 var (dramaInvokeDetail, parameters2) = BuildInvokeExpression(expr);
290 return dramaInvokeDetail.SafeInvoke(dm, line, parameters2);
291 });
292 }
293
294 [MethodImpl(MethodImplOptions.AggressiveInlining)]
295 [ElinDramaActionInvoke("nodiscard")]
296 public static bool or(DramaManager dm, Dictionary<string, string> line, params string[] parameters)
297 {
298 return parameters.Any(delegate(string expr)
299 {
300 var (dramaInvokeDetail, parameters2) = BuildInvokeExpression(expr);
301 return dramaInvokeDetail.SafeInvoke(dm, line, parameters2);
302 });
303 }
304
305 [MethodImpl(MethodImplOptions.AggressiveInlining)]
306 [ElinDramaActionInvoke("nodiscard")]
307 public static bool not(DramaManager dm, Dictionary<string, string> line, params string[] parameters)
308 {
309 return parameters.All(delegate(string expr)
310 {
311 var (dramaInvokeDetail, parameters2) = BuildInvokeExpression(expr);
312 return !dramaInvokeDetail.SafeInvoke(dm, line, parameters2);
313 });
315
316 [MethodImpl(MethodImplOptions.AggressiveInlining)]
317 [ElinDramaActionInvoke(null)]
318 public static bool console_cmd(DramaManager dm, Dictionary<string, string> line, params string[] parameters)
319 {
320 string.Join(' ', parameters).EvaluateAsCommand();
321 return true;
322 }
323
324 [ElinDramaActionInvoke(null)]
325 public static bool add_item(DramaManager dm, Dictionary<string, string> line, string itemId, string materialAlias = "wood", int lv = -1, int count = 1)
326 {
327 Chara chara = dm.GetChara(line["actor"]);
328 SourceMaterial.Row row = EClass.sources.materials.alias.TryGetValue(materialAlias, "wood");
329 Thing t = ThingGen.Create(itemId, row.id, lv).SetNum(count);
330 chara.Pick(t);
331 return true;
332 }
333
334 [ElinDramaActionInvoke(null)]
335 public static bool apply_condition(DramaManager dm, Dictionary<string, string> line, string conditionAlias, int power = 100)
336 {
337 dm.GetChara(line["actor"]).AddCondition(conditionAlias, power, force: true);
338 return true;
339 }
340
341 [ElinDramaActionInvoke(null)]
342 public static bool equip_item(DramaManager dm, Dictionary<string, string> line, string itemId)
343 {
344 dm.GetChara(line["actor"]).body.Equip(ThingGen.Create(itemId));
345 return true;
346 }
347
348 [ElinDramaActionInvoke(null)]
349 public static bool destroy_item(DramaManager dm, Dictionary<string, string> line, string itemId, int count = -1)
350 {
351 List<Thing> list = dm.GetChara(line["actor"]).things.List((Thing t) => t.id == itemId);
352 if (count < 0)
353 {
354 foreach (Thing item in list)
355 {
356 item.Destroy();
357 }
359 else
360 {
361 count = Math.Max(count, 0);
362 foreach (Thing item2 in list)
363 {
364 if (count == 0)
365 {
366 break;
367 }
368 if (item2.Num >= count)
369 {
370 item2.ModNum(-count);
371 continue;
372 }
373 count -= item2.Num;
374 item2.Destroy();
376 }
377 return true;
378 }
379
380 [ElinDramaActionInvoke(null)]
381 public static bool remove_condition(DramaManager dm, Dictionary<string, string> line, string conditionAlias)
383 foreach (Condition item in dm.GetChara(line["actor"]).conditions.ToList())
384 {
385 if (item.source.alias == conditionAlias)
386 {
387 item.Kill();
388 }
389 }
390 return true;
391 }
392
393 [ElinDramaActionInvoke(null)]
394 public static bool join_faith(DramaManager dm, Dictionary<string, string> line, string religionId = "")
395 {
396 Chara chara = dm.GetChara(line["actor"]);
397 if (religionId.IsEmpty())
398 {
400 }
401 else
402 {
403 EClass.game.religions.Find(religionId)?.JoinFaith(chara);
404 }
405 return true;
406 }
407
408 [ElinDramaActionInvoke(null)]
409 public static bool join_party(DramaManager dm, Dictionary<string, string> line)
410 {
411 Chara chara = dm.GetChara(line["actor"]);
412 EClass.Sound.Play("good");
413 chara.MakeAlly();
414 return true;
415 }
416
417 [ElinDramaActionInvoke("nodiscard")]
418 public static bool if_affinity(DramaManager dm, Dictionary<string, string> line, DramaValueExpression expr)
419 {
420 Chara chara = dm.GetChara(line["actor"]);
421 return expr.Compare(chara._affinity);
422 }
423
424 [ElinDramaActionInvoke("nodiscard")]
425 public static bool if_condition(DramaManager dm, Dictionary<string, string> line, string conditionAlias, DramaValueExpression expr = null)
426 {
427 if (expr == null)
428 {
429 expr = ">=1";
430 }
431 foreach (Condition condition in dm.GetChara(line["actor"]).conditions)
432 {
433 if (condition.source.alias == conditionAlias)
434 {
435 return expr.Compare(condition.value);
437 }
438 return false;
439 }
440
441 [ElinDramaActionInvoke("nodiscard")]
442 public static bool if_currency(DramaManager dm, Dictionary<string, string> line, string currencyId, DramaValueExpression expr)
443 {
444 Chara chara = dm.GetChara(line["actor"]);
445 return expr.Compare(chara.GetCurrency(currencyId));
446 }
447
448 [ElinDramaActionInvoke("nodiscard")]
449 public static bool if_element(DramaManager dm, Dictionary<string, string> line, string elementAlias, DramaValueExpression expr)
450 {
451 Chara chara = dm.GetChara(line["actor"]);
452 if (chara.HasElement(elementAlias))
453 {
454 return expr.Compare(chara.Evalue(elementAlias));
455 }
456 return false;
457 }
458
459 [ElinDramaActionInvoke("nodiscard")]
460 public static bool if_faith(DramaManager dm, Dictionary<string, string> line, string religionId, DramaValueExpression expr = null)
461 {
462 if (expr == null)
463 {
464 expr = ">=0";
465 }
466 Religion faith = dm.GetChara(line["actor"]).faith;
467 if (faith.id == religionId)
469 return expr.Compare(faith.giftRank);
470 }
471 return false;
472 }
473
474 [ElinDramaActionInvoke("nodiscard")]
475 public static bool if_fame(DramaManager dm, Dictionary<string, string> line, DramaValueExpression expr)
476 {
477 return expr.Compare(EClass.player.fame);
478 }
479
480 [ElinDramaActionInvoke("nodiscard")]
481 public static bool if_flag(DramaManager dm, Dictionary<string, string> line, string flagKey, DramaValueExpression expr = null)
482 {
483 if (expr == null)
484 {
485 expr = ">=1";
486 }
487 Chara chara = dm.GetChara(line["actor"]);
488 return expr.Compare(chara.GetInt(flagKey));
489 }
490
491 [ElinDramaActionInvoke("nodiscard")]
492 public static bool if_has_item(DramaManager dm, Dictionary<string, string> line, string itemId, DramaValueExpression expr = null)
493 {
494 if (expr == null)
495 {
496 expr = ">=1";
497 }
498 Chara chara = dm.GetChara(line["actor"]);
499 return expr.Compare(chara.things.List((Thing t) => t.id == itemId).Count);
500 }
501
502 [ElinDramaActionInvoke("nodiscard")]
503 public static bool if_hostility(DramaManager dm, Dictionary<string, string> line, string expression)
504 {
505 Chara chara = dm.GetChara(line["actor"]);
506 Match match = Regex.Match(expression, "^(?<op>>=|<=|>|<|=|!=|==)?(?<h>.+)$");
507 if (!match.Success)
508 {
509 throw new ArgumentException("invalid expression " + expression);
510 }
511 string value = match.Groups["op"].Value;
512 if (!Enum.TryParse<Hostility>(match.Groups["h"].Value, ignoreCase: true, out var result))
513 {
514 throw new ArgumentException("invalid hostility " + match.Groups["h"].Value);
515 }
516 return new DramaValueExpression($"{value}{result:D}").Compare(chara._cints[4]);
517 }
518
519 [ElinDramaActionInvoke("nodiscard")]
520 public static bool if_in_party(DramaManager dm, Dictionary<string, string> line, bool isInParty = true)
521 {
522 return dm.GetChara(line["actor"]).IsPCParty == isInParty;
523 }
524
525 [ElinDramaActionInvoke("nodiscard")]
526 public static bool if_keyitem(DramaManager dm, Dictionary<string, string> line, string keyitemId, DramaValueExpression expr = null)
527 {
528 if (expr == null)
529 {
530 expr = ">0";
532 if (EClass.sources.keyItems.alias.TryGetValue(keyitemId, out var value) && EClass.player.keyItems.TryGetValue(value.id, out var value2))
533 {
534 return expr.Compare(value2);
535 }
536 return false;
537 }
538
539 [ElinDramaActionInvoke("nodiscard")]
540 public static bool if_lv(DramaManager dm, Dictionary<string, string> line, DramaValueExpression expr)
541 {
542 Chara chara = dm.GetChara(line["actor"]);
543 return expr.Compare(chara.LV);
544 }
545
546 [ElinDramaActionInvoke("nodiscard")]
547 public static bool if_race(DramaManager dm, Dictionary<string, string> line, string raceId)
548 {
549 return dm.GetChara(line["actor"]).race.id == raceId;
551
552 [ElinDramaActionInvoke("nodiscard")]
553 public static bool if_tag(DramaManager dm, Dictionary<string, string> line, string tag)
554 {
555 return dm.GetChara(line["actor"]).source.tag.Contains(tag);
556 }
557
558 [ElinDramaActionInvoke("nodiscard")]
559 public static bool if_zone(DramaManager dm, Dictionary<string, string> line, string zoneId, int zoneLv = 99999)
560 {
561 Zone currentZone = dm.GetChara(line["actor"]).currentZone;
562 if (currentZone == null)
564 return false;
565 }
566 if (currentZone.id == zoneId)
567 {
568 if (zoneLv != 99999)
569 {
570 return currentZone.lv == zoneLv;
571 }
572 return true;
573 }
574 return false;
575 }
576
577 [ElinDramaActionInvoke("nodiscard")]
578 public static bool if_zone_2(DramaManager dm, Dictionary<string, string> line, string zoneFullName)
579 {
580 Zone currentZone = dm.GetChara(line["actor"]).currentZone;
581 Zone zone = ModUtil.FindZoneByFullName(zoneFullName);
582 return currentZone == zone;
583 }
584
585 [ElinDramaActionInvoke(null)]
586 public static bool mod_affinity(DramaManager dm, Dictionary<string, string> line, DramaValueExpression expr)
587 {
588 Chara chara = dm.GetChara(line["actor"]);
589 chara.ModAffinity(EClass.pc, expr.Diff(chara._affinity));
590 return true;
591 }
592
593 [ElinDramaActionInvoke(null)]
594 public static bool mod_currency(DramaManager dm, Dictionary<string, string> line, string currencyId, DramaValueExpression expr)
595 {
596 Chara chara = dm.GetChara(line["actor"]);
597 int currency = chara.GetCurrency(currencyId);
598 chara.ModCurrency(expr.Diff(currency), currencyId);
599 return true;
600 }
601
602 [ElinDramaActionInvoke(null)]
603 public static bool mod_element(DramaManager dm, Dictionary<string, string> line, string elementAlias, int value = 1, int potential = 100)
604 {
605 Chara chara = dm.GetChara(line["actor"]);
606 Element orCreateElement = chara.elements.GetOrCreateElement(elementAlias);
607 if (orCreateElement != null)
608 {
609 if (orCreateElement is Feat)
610 {
611 chara.SetFeat(orCreateElement.id, value, msg: true);
612 }
613 else
614 {
615 chara.elements.SetBase(orCreateElement.id, value, potential);
616 }
617 }
618 return true;
619 }
620
621 [ElinDramaActionInvoke(null)]
622 public static bool mod_element_exp(DramaManager dm, Dictionary<string, string> line, string elementAlias, DramaValueExpression expr)
623 {
624 Chara chara = dm.GetChara(line["actor"]);
625 Element orCreateElement = chara.elements.GetOrCreateElement(elementAlias);
626 if (orCreateElement == null)
627 {
628 return true;
629 }
630 chara.ModExp(orCreateElement.id, expr.Diff(orCreateElement.vExp));
631 return true;
632 }
633
634 [ElinDramaActionInvoke(null)]
635 public static bool mod_fame(DramaManager dm, Dictionary<string, string> line, DramaValueExpression expr)
636 {
638 return true;
639 }
640
641 [ElinDramaActionInvoke(null)]
642 public static bool mod_flag(DramaManager dm, Dictionary<string, string> line, string flagKey, DramaValueExpression expr = null)
644 if (expr == null)
645 {
646 expr = "=1";
647 }
648 Chara chara = dm.GetChara(line["actor"]);
649 chara.SetInt(flagKey, expr.ModOrSet(chara.GetInt(flagKey)));
650 return true;
651 }
652
653 [ElinDramaActionInvoke("nodiscard")]
654 public static bool mod_keyitem(DramaManager dm, Dictionary<string, string> line, string keyitemId, DramaValueExpression expr = null)
655 {
656 if (!EClass.sources.keyItems.alias.TryGetValue(keyitemId, out var value))
657 {
658 return false;
659 }
660 if (expr == null)
661 {
662 expr = "=1";
664 Dictionary<int, int> keyItems = EClass.player.keyItems;
665 keyItems.TryAdd(value.id, 0);
666 int num = keyItems[value.id];
667 int num2 = expr.ModOrSet(keyItems[value.id]);
668 if (num < num2)
669 {
670 SE.Play("keyitem");
671 Msg.Say("get_keyItem", value.GetName());
672 }
673 else if (num > num2)
674 {
675 SE.Play("keyitem_lose");
676 Msg.Say("lose_keyItem", value.GetName());
677 }
678 keyItems[value.id] = num2;
679 return true;
680 }
681
682 [ElinDramaActionInvoke(null)]
683 public static bool move_next_to(DramaManager dm, Dictionary<string, string> line, string charaId)
684 {
685 Chara chara = dm.GetChara(line["actor"]);
686 Chara chara2 = dm.GetChara(charaId);
687 if (chara2 == null)
688 {
689 return false;
690 }
691 Point nearestPoint = chara2.pos.GetNearestPoint(allowBlock: false, allowChara: false, allowInstalled: true, ignoreCenter: true);
692 chara.TryMove(nearestPoint, allowDestroyPath: false);
693 return true;
694 }
695
696 [ElinDramaActionInvoke(null)]
697 public static bool move_tile(DramaManager dm, Dictionary<string, string> line, int xOffset, int yOffset)
698 {
699 Chara chara = dm.GetChara(line["actor"]);
700 Point newPoint = chara.pos + new Point(xOffset, yOffset);
701 chara.TryMove(newPoint, allowDestroyPath: false);
702 return true;
703 }
704
705 [ElinDramaActionInvoke(null)]
706 public static bool move_to(DramaManager dm, Dictionary<string, string> line, int x, int y)
708 Chara chara = dm.GetChara(line["actor"]);
709 Point newPoint = new Point(x, y);
710 chara.TryMove(newPoint, allowDestroyPath: false);
711 return true;
712 }
713
714 [ElinDramaActionInvoke("nodiscard")]
715 public static bool move_zone(DramaManager dm, Dictionary<string, string> line, string zoneId, int zoneLv = 99999)
716 {
717 Chara chara = dm.GetChara(line["actor"]);
718 if (zoneLv == 99999)
719 {
720 zoneLv = 0;
722 Zone zone = ModUtil.FindZoneByFullName($"{zoneId}@{zoneLv}");
723 if (zone == null)
724 {
725 return false;
726 }
727 chara.MoveZone(zone, new ZoneTransition
728 {
729 state = ZoneTransition.EnterState.RandomVisit
730 });
731 return true;
732 }
733
734 [ElinDramaActionInvoke("nodiscard")]
735 public static bool move_zone_2(DramaManager dm, Dictionary<string, string> line, string zoneFullName)
736 {
737 Chara chara = dm.GetChara(line["actor"]);
738 Zone zone = ModUtil.FindZoneByFullName(zoneFullName);
739 if (zone == null)
740 {
741 return false;
742 }
743 chara.MoveZone(zone, new ZoneTransition
744 {
745 state = ZoneTransition.EnterState.RandomVisit
746 });
747 return true;
748 }
749
750 [ElinDramaActionInvoke(null)]
751 public static bool play_anime(DramaManager dm, Dictionary<string, string> line, AnimeID animeId)
752 {
753 dm.GetChara(line["actor"]).PlayAnime(animeId, force: true);
754 return true;
755 }
756
757 [ElinDramaActionInvoke(null)]
758 public static bool play_effect(DramaManager dm, Dictionary<string, string> line, string effectId)
759 {
760 dm.GetChara(line["actor"]).PlayEffect(effectId);
761 return true;
762 }
763
764 [ElinDramaActionInvoke(null)]
765 public static bool play_effect_at(DramaManager dm, Dictionary<string, string> line, string effectId, int x, int y)
766 {
767 Effect.Get(effectId)?.Play(new Point(x, y));
768 return true;
769 }
770
771 [ElinDramaActionInvoke(null)]
772 public static bool play_emote(DramaManager dm, Dictionary<string, string> line, Emo emote, float duration = 1f)
773 {
774 dm.GetChara(line["actor"]).ShowEmo(emote, duration, skipSame: false);
775 return true;
776 }
777
778 [ElinDramaActionInvoke(null)]
779 public static bool play_screen_effect(DramaManager dm, Dictionary<string, string> line, string effectId)
780 {
781 ScreenEffect.Play(effectId);
782 return true;
783 }
784
785 [ElinDramaActionInvoke(null)]
786 public static bool pop_text(DramaManager dm, Dictionary<string, string> line, string langText)
787 {
788 dm.GetChara(line["actor"]).HostRenderer.Say(langText.lang());
789 return true;
790 }
791
792 [ElinDramaActionInvoke(null)]
793 public static bool set_portrait(DramaManager dm, Dictionary<string, string> line, string portraitId = null)
794 {
795 Person person = dm.GetPerson(line["actor"]);
796 if (person == null)
797 {
798 return false;
799 }
800 string text = person.chara?.GetIdPortrait();
801 if (!portraitId.IsEmpty())
802 {
803 string text2 = person.id.IsEmpty(person.chara?.id);
804 HashSet<string> hashSet = new HashSet<string>(StringComparer.Ordinal);
805 hashSet.Add("UN_" + text2 + "_" + text + ".png");
806 hashSet.Add(text + ".png");
807 hashSet.Add(text2 + "_" + text + ".png");
808 string text3 = hashSet.FirstOrDefault(Portrait.allIds.Contains);
809 if (text3 != null)
810 {
811 text = text3[..^4];
812 }
813 }
814 person.idPortrait = text;
815 return true;
816 }
817
818 [ElinDramaActionInvoke(null)]
819 public static bool set_portrait_override(DramaManager dm, Dictionary<string, string> line, string portraitId = null)
820 {
821 dm.GetChara(line["actor"]).SetPortraitOverride(portraitId);
822 return true;
823 }
824
825 [ElinDramaActionInvoke(null)]
826 public static bool set_sprite(DramaManager dm, Dictionary<string, string> line, string spriteId = null)
827 {
828 dm.GetChara(line["actor"]).SetSpriteOverride(spriteId);
829 return true;
830 }
831
832 [ElinDramaActionInvoke("nodiscard")]
833 public static bool show_book(DramaManager dm, Dictionary<string, string> line, string bookEntry)
834 {
835 if (BookList.dict == null)
836 {
837 BookList.Init();
838 }
839 string[] array = bookEntry.Split('/');
840 string text = array[0];
841 string text2 = array[1];
842 if (text2.EndsWith(".txt"))
843 {
844 text2 = text2[..^4];
845 }
846 if (!BookList.dict.TryGetValue(text, out var value) || !value.TryGetValue(text2, out var value2))
847 {
848 return false;
849 }
850 bool flag = text == "Scroll";
851 EClass.ui.AddLayer<LayerHelp>(flag ? "LayerParchment" : "LayerBook").book.Show((flag ? "Scroll/" : "Book/") + value2.id, null, value2.title, value2);
852 return true;
853 }
854}
AnimeID
Definition: AnimeID.cs:2
@ currency
static bool equip_item(DramaManager dm, Dictionary< string, string > line, string itemId)
static bool mod_affinity(DramaManager dm, Dictionary< string, string > line, DramaValueExpression expr)
static bool show_book(DramaManager dm, Dictionary< string, string > line, string bookEntry)
static bool join_faith(DramaManager dm, Dictionary< string, string > line, string religionId="")
static bool if_currency(DramaManager dm, Dictionary< string, string > line, string currencyId, DramaValueExpression expr)
static bool eval(DramaManager dm, Dictionary< string, string > line, params string[] parameters)
static bool mod_flag(DramaManager dm, Dictionary< string, string > line, string flagKey, DramaValueExpression expr=null)
static bool and(DramaManager dm, Dictionary< string, string > line, params string[] parameters)
static bool mod_fame(DramaManager dm, Dictionary< string, string > line, DramaValueExpression expr)
static bool play_emote(DramaManager dm, Dictionary< string, string > line, Emo emote, float duration=1f)
static bool if_condition(DramaManager dm, Dictionary< string, string > line, string conditionAlias, DramaValueExpression expr=null)
static bool console_cmd(DramaManager dm, Dictionary< string, string > line, params string[] parameters)
static bool set_portrait_override(DramaManager dm, Dictionary< string, string > line, string portraitId=null)
static bool mod_currency(DramaManager dm, Dictionary< string, string > line, string currencyId, DramaValueExpression expr)
static bool remove_condition(DramaManager dm, Dictionary< string, string > line, string conditionAlias)
static bool set_sprite(DramaManager dm, Dictionary< string, string > line, string spriteId=null)
static bool if_element(DramaManager dm, Dictionary< string, string > line, string elementAlias, DramaValueExpression expr)
static bool if_in_party(DramaManager dm, Dictionary< string, string > line, bool isInParty=true)
static bool mod_element(DramaManager dm, Dictionary< string, string > line, string elementAlias, int value=1, int potential=100)
static bool add_item(DramaManager dm, Dictionary< string, string > line, string itemId, string materialAlias="wood", int lv=-1, int count=1)
static bool play_effect(DramaManager dm, Dictionary< string, string > line, string effectId)
static bool if_has_item(DramaManager dm, Dictionary< string, string > line, string itemId, DramaValueExpression expr=null)
static bool destroy_item(DramaManager dm, Dictionary< string, string > line, string itemId, int count=-1)
static bool DefaultDramaInvokeExtActionParser(DramaManager dm, Dictionary< string, string > line)
static bool if_tag(DramaManager dm, Dictionary< string, string > line, string tag)
static bool move_zone_2(DramaManager dm, Dictionary< string, string > line, string zoneFullName)
static bool if_lv(DramaManager dm, Dictionary< string, string > line, DramaValueExpression expr)
static bool if_race(DramaManager dm, Dictionary< string, string > line, string raceId)
static bool if_flag(DramaManager dm, Dictionary< string, string > line, string flagKey, DramaValueExpression expr=null)
static bool mod_keyitem(DramaManager dm, Dictionary< string, string > line, string keyitemId, DramaValueExpression expr=null)
static bool move_zone(DramaManager dm, Dictionary< string, string > line, string zoneId, int zoneLv=99999)
static bool set_portrait(DramaManager dm, Dictionary< string, string > line, string portraitId=null)
static bool apply_condition(DramaManager dm, Dictionary< string, string > line, string conditionAlias, int power=100)
static bool if_keyitem(DramaManager dm, Dictionary< string, string > line, string keyitemId, DramaValueExpression expr=null)
static bool if_fame(DramaManager dm, Dictionary< string, string > line, DramaValueExpression expr)
static bool DefaultDramaEvalActionParser(DramaManager dm, Dictionary< string, string > line)
static bool if_zone_2(DramaManager dm, Dictionary< string, string > line, string zoneFullName)
static bool not(DramaManager dm, Dictionary< string, string > line, params string[] parameters)
static bool play_effect_at(DramaManager dm, Dictionary< string, string > line, string effectId, int x, int y)
static bool pop_text(DramaManager dm, Dictionary< string, string > line, string langText)
static bool move_next_to(DramaManager dm, Dictionary< string, string > line, string charaId)
static bool if_zone(DramaManager dm, Dictionary< string, string > line, string zoneId, int zoneLv=99999)
static bool move_to(DramaManager dm, Dictionary< string, string > line, int x, int y)
static bool play_screen_effect(DramaManager dm, Dictionary< string, string > line, string effectId)
static bool move_tile(DramaManager dm, Dictionary< string, string > line, int xOffset, int yOffset)
static bool mod_element_exp(DramaManager dm, Dictionary< string, string > line, string elementAlias, DramaValueExpression expr)
static bool or(DramaManager dm, Dictionary< string, string > line, params string[] parameters)
static bool play_anime(DramaManager dm, Dictionary< string, string > line, AnimeID animeId)
static bool join_party(DramaManager dm, Dictionary< string, string > line)
static bool if_affinity(DramaManager dm, Dictionary< string, string > line, DramaValueExpression expr)
static bool if_hostility(DramaManager dm, Dictionary< string, string > line, string expression)
static bool if_faith(DramaManager dm, Dictionary< string, string > line, string religionId, DramaValueExpression expr=null)
delegate bool DramaActionParser(DramaManager dm, Dictionary< string, string > line)
delegate bool DramaInvokeFunc(DramaManager dm, Dictionary< string, string > line, params string[] parameters)
Emo
Definition: Emo.cs:2
Hostility
Definition: Hostility.cs:2
SourceStat.Row source
Definition: BaseStats.cs:16
static void Init()
Definition: BookList.cs:32
static Dictionary< string, Dictionary< string, Item > > dict
Definition: BookList.cs:30
void Say(string text, Color c=default(Color), float duration=0f)
ElementContainerCard elements
Definition: Card.cs:42
string id
Definition: Card.cs:36
CardRenderer HostRenderer
Definition: Card.cs:2496
void SetInt(string id, int value=0)
Definition: Card.cs:2570
Thing SetNum(int a)
Definition: Card.cs:3653
int GetCurrency(string id="money")
Definition: Card.cs:4133
Point pos
Definition: Card.cs:60
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:6577
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
Definition: Card.cs:6511
void ModCurrency(int a, string id="money")
Definition: Card.cs:4119
void Destroy()
Definition: Card.cs:5268
ThingContainer things
Definition: Card.cs:39
int Evalue(int ele)
Definition: Card.cs:2688
void ModExp(string alias, int a)
Definition: Card.cs:2765
int Num
Definition: Card.cs:161
void PlayAnime(AnimeID id, bool force=false)
Definition: Card.cs:6562
void ModNum(int a, bool notify=true)
Definition: Card.cs:3673
int GetInt(string id, int? defaultInt=null)
Definition: Card.cs:2551
bool HasElement(int ele, bool includeNagative=false)
Definition: Card.cs:6285
int LV
Definition: Card.cs:389
bool Equip(Thing thing, BodySlot slot=null, bool msg=true)
Definition: CharaBody.cs:194
Definition: Chara.cs:10
int _affinity
Definition: Chara.cs:307
CharaBody body
Definition: Chara.cs:94
int[] _cints
Definition: Chara.cs:82
Condition AddCondition(string id, int p=100, bool force=false)
Definition: Chara.cs:9642
void ModAffinity(Chara c, int a, bool show=true, bool showOnlyEmo=false)
Definition: Chara.cs:8236
void SetFeat(int id, int value=1, bool msg=false)
Definition: Chara.cs:10281
override bool IsPCParty
Definition: Chara.cs:633
override MoveResult TryMove(Point newPoint, bool allowDestroyPath=true)
Definition: Chara.cs:2814
List< Condition > conditions
Definition: Chara.cs:215
Zone currentZone
Definition: Chara.cs:259
void MakeAlly(bool msg=true)
Definition: Chara.cs:2396
SourceChara.Row source
Definition: Chara.cs:162
Religion faith
Definition: Chara.cs:443
string GetIdPortrait()
Definition: Chara.cs:8477
Thing Pick(Thing t, bool msg=true, bool tryStack=true)
Definition: Chara.cs:4460
void MoveZone(string alias)
Definition: Chara.cs:3451
SourceRace.Row race
Definition: Chara.cs:468
static string[] SplitParams(string args)
static readonly Regex _expressionRegex
static readonly Dictionary< string, DramaInvokeDetail > _invokes
static readonly Dictionary< string, DramaActionParser > _actionParsers
static string Unquote(string s)
bool SafeInvoke(DramaManager dm, Dictionary< string, string > line, params string[] parameters)
Chara GetChara(string id)
Person GetPerson(string id)
void ParseLine(Dictionary< string, string > item)
DramaEvent AddEvent(DramaEvent e)
DramaSetup setup
Definition: DramaManager.cs:34
string book
Definition: DramaSetup.cs:9
Definition: EClass.cs:6
static Game game
Definition: EClass.cs:9
static SourceManager sources
Definition: EClass.cs:43
static Player player
Definition: EClass.cs:13
static Chara pc
Definition: EClass.cs:15
static SoundManager Sound
Definition: EClass.cs:47
static UI ui
Definition: EClass.cs:17
Definition: Effect.cs:7
static Effect Get(Effect original)
Definition: Effect.cs:80
void Play(float delay, Point from, float fixY=0f, Point to=null, Sprite sprite=null)
Definition: Effect.cs:100
Element SetBase(string alias, int v, int potential=0)
Element GetOrCreateElement(Element ele)
int id
Definition: ELEMENT.cs:255
int vExp
Definition: ELEMENT.cs:259
Definition: FEAT.cs:333
ReligionManager religions
Definition: Game.cs:159
Definition: Msg.cs:5
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Definition: Msg.cs:58
Definition: Person.cs:6
string id
Definition: Person.cs:14
Chara chara
Definition: Person.cs:36
void ModFame(int a)
Definition: Player.cs:2166
int fame
Definition: Player.cs:948
Dictionary< int, int > keyItems
Definition: Player.cs:1185
Definition: Point.cs:9
Point GetNearestPoint(bool allowBlock=false, bool allowChara=true, bool allowInstalled=true, bool ignoreCenter=false, int minRadius=0)
Definition: Point.cs:624
static HashSet< string > allIds
Definition: Portrait.cs:20
Religion Find(string id)
ReligionEyth Eyth
virtual void JoinFaith(Chara c, ConvertType type=ConvertType.Default)
Definition: Religion.cs:330
ConvertType
Definition: Religion.cs:8
virtual void LeaveFaith(Chara c, Religion newFaith, ConvertType type)
Definition: Religion.cs:397
static void Play(string id)
Definition: ScreenEffect.cs:17
SourceMaterial materials
SourceKeyItem keyItems
string id
Definition: Spatial.cs:13
List< Thing > List(Func< Thing, bool > func, bool onlyAccessible=false)
static Thing Create(string id, int idMat=-1, int lv=-1)
Definition: ThingGen.cs:53
Definition: Thing.cs:8
Definition: Zone.cs:12