TDME2  1.9.200
LogicMiniScript.cpp
Go to the documentation of this file.
2 
3 #include <memory>
4 #include <span>
5 #include <string>
6 #include <utility>
7 #include <vector>
8 
9 #include <tdme/tdme.h>
10 #include <tdme/audio/Audio.h>
15 #include <tdme/engine/Color4.h>
19 #include <tdme/engine/Camera.h>
20 #include <tdme/engine/Engine.h>
22 #include <tdme/engine/Object.h>
25 #include <tdme/engine/Timing.h>
28 #include <tdme/math/Matrix4x4.h>
29 #include <tdme/math/Vector2.h>
30 #include <tdme/math/Vector3.h>
31 #include <tdme/math/Vector4.h>
38 #include <tdme/utilities/Console.h>
42 
43 using std::move;
44 using std::span;
45 using std::string;
46 using std::to_string;
47 using std::unique_ptr;
48 using std::vector;
49 
51 
52 using tdme::audio::Audio;
84 
85 const vector<string> LogicMiniScript::CONTEXTFUNCTIONS_ENGINE = { "initializeEngine", "updateEngine" };
86 const vector<string> LogicMiniScript::CONTEXTFUNCTIONS_LOGIC = { "initializeLogic", "updateLogic", "onLogicAdded", "onLogicsProcessed" };
87 const vector<string> LogicMiniScript::CONTEXTFUNCTIONS_ENGINELOGIC = {
88  // engine
89  "initializeEngine", "updateEngine",
90  // logic
91  "initializeLogic", "updateLogic", "onLogicAdded", "onLogicsProcessed"
92 };
93 
94 LogicMiniScript::LogicMiniScript(): EngineMiniScript(), prototypesToAddMutex("prototypetoadd-mutex") {
95 }
96 
98 }
99 
101  return "tdme::engine::logics::LogicMiniScript";
102 }
103 
105  auto transpilationUnits = EngineMiniScript::getTranspilationUnits();
106  transpilationUnits.push_back("src/tdme/engine/logics/LogicMiniScript.cpp");
107  return transpilationUnits;
108 }
109 
110 inline Entity* LogicMiniScript::getEntity(const string& entityId, const string& childEntityId) {
111  auto entity = context->getEngine()->getEntity(entityId);
112  if (entity == nullptr) return entity;
113  if (childEntityId.empty() == false) {
114  if (entity->getEntityType() == Entity::ENTITYTYPE_ENTITYHIERARCHY) {
115  auto entityHierarchy = static_cast<EntityHierarchy*>(entity);
116  return entityHierarchy->getEntity(childEntityId);
117  } else {
118  Console::println("LogicMiniScript::getEntity(): no entity hierarchy: can not resolve child entity by given id: " + childEntityId);
119  return nullptr;
120  }
121  } else {
122  return entity;
123  }
124 }
125 
127  EngineMiniScript::registerStateMachineStates();
128 }
129 
131  EngineMiniScript::registerMethods();
132  {
133  //
134  class ScriptMethodApplicationRunsInEditor: public ScriptMethod {
135  private:
136  LogicMiniScript* miniScript { nullptr };
137  public:
138  ScriptMethodApplicationRunsInEditor(LogicMiniScript* miniScript):
139  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
140  miniScript(miniScript) {}
141  const string getMethodName() override {
142  return "application.runsInEditor";
143  }
144  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
145  miniScript->setValue(returnValue, miniScript->logic->isRunningInEditor());
146  }
147  const vector<string>& getContextFunctions() {
148  return CONTEXTFUNCTIONS_ALL;
149  }
150  };
151  registerMethod(new ScriptMethodApplicationRunsInEditor(this));
152  }
153  {
154  //
155  class ScriptMethodApplicationIsFullScreen: public ScriptMethod {
156  private:
157  LogicMiniScript* miniScript { nullptr };
158  public:
159  ScriptMethodApplicationIsFullScreen(LogicMiniScript* miniScript):
160  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
161  miniScript(miniScript) {}
162  const string getMethodName() override {
163  return "application.isFullScreen";
164  }
165  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
166  miniScript->setValue(returnValue, Editor::getInstance() != nullptr?Editor::getInstance()->isFullScreen():false);
167  }
168  const vector<string>& getContextFunctions() {
169  return CONTEXTFUNCTIONS_ALL;
170  }
171  };
172  registerMethod(new ScriptMethodApplicationIsFullScreen(this));
173  }
174  {
175  //
176  class ScriptMethodLogicGetId: public ScriptMethod {
177  private:
178  LogicMiniScript* miniScript { nullptr };
179  public:
180  ScriptMethodLogicGetId(LogicMiniScript* miniScript):
181  ScriptMethod({}, ScriptVariableType::TYPE_STRING),
182  miniScript(miniScript) {}
183  const string getMethodName() override {
184  return "logic.getId";
185  }
186  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
187  miniScript->setValue(returnValue, miniScript->logic->getId());
188  }
189  const vector<string>& getContextFunctions() {
191  }
192  };
193  registerMethod(new ScriptMethodLogicGetId(this));
194  }
195  {
196  //
197  class ScriptMethodLogicGetHierarchyId: public ScriptMethod {
198  private:
199  LogicMiniScript* miniScript { nullptr };
200  public:
201  ScriptMethodLogicGetHierarchyId(LogicMiniScript* miniScript):
202  ScriptMethod({}, ScriptVariableType::TYPE_STRING),
203  miniScript(miniScript) {}
204  const string getMethodName() override {
205  return "logic.getHierarchyId";
206  }
207  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
208  miniScript->setValue(returnValue, miniScript->logic->getHierarchyId());
209  }
210  const vector<string>& getContextFunctions() {
212  }
213  };
214  registerMethod(new ScriptMethodLogicGetHierarchyId(this));
215  }
216  {
217  //
218  class ScriptMethodLogicGetHierarchyParentId: public ScriptMethod {
219  private:
220  LogicMiniScript* miniScript { nullptr };
221  public:
222  ScriptMethodLogicGetHierarchyParentId(LogicMiniScript* miniScript):
223  ScriptMethod({}, ScriptVariableType::TYPE_STRING),
224  miniScript(miniScript) {}
225  const string getMethodName() override {
226  return "logic.getHierarchyParentId";
227  }
228  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
229  miniScript->setValue(returnValue, miniScript->logic->getHierarchyParentId());
230  }
231  const vector<string>& getContextFunctions() {
233  }
234  };
235  registerMethod(new ScriptMethodLogicGetHierarchyParentId(this));
236  }
237  {
238  //
239  class ScriptMethodLogicGetLogicIds: public ScriptMethod {
240  private:
241  LogicMiniScript* miniScript { nullptr };
242  public:
243  ScriptMethodLogicGetLogicIds(LogicMiniScript* miniScript):
244  ScriptMethod({}, ScriptVariableType::TYPE_ARRAY),
245  miniScript(miniScript) {}
246  const string getMethodName() override {
247  return "logic.getLogicIds";
248  }
249  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
250  const auto& contextLogics = miniScript->logic->getContext()->getLogics();
251  returnValue.setType(EngineMiniScript::TYPE_ARRAY);
252  for (auto contextLogic: contextLogics) {
253  returnValue.pushArrayEntry(EngineMiniScript::ScriptVariable(contextLogic->getId()));
254  }
255  }
256  const vector<string>& getContextFunctions() {
257  return CONTEXTFUNCTIONS_LOGIC;
258  }
259  };
260  registerMethod(new ScriptMethodLogicGetLogicIds(this));
261  }
262  {
263  //
264  class ScriptMethodAudioGetListenerPosition: public ScriptMethod {
265  private:
266  LogicMiniScript* miniScript { nullptr };
267  public:
268  ScriptMethodAudioGetListenerPosition(LogicMiniScript* miniScript):
269  ScriptMethod(
270  {},
272  ),
273  miniScript(miniScript) {}
274  const string getMethodName() override {
275  return "audio.getListenerPosition";
276  }
277  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
278  miniScript->setValue(returnValue, miniScript->logic->getContext()->getAudio()->getListenerPosition());
279  }
280  const vector<string>& getContextFunctions() {
282  }
283  };
284  registerMethod(new ScriptMethodAudioGetListenerPosition(this));
285  }
286  {
287  //
288  class ScriptMethodAudioSetListenerPosition: public ScriptMethod {
289  private:
290  LogicMiniScript* miniScript { nullptr };
291  public:
292  ScriptMethodAudioSetListenerPosition(LogicMiniScript* miniScript):
293  ScriptMethod(
294  {
295  { .type = TYPE_VECTOR3, .name = "position", .optional = false, .reference = false, .nullable = false }
296  },
297  ScriptVariableType::TYPE_NULL
298  ),
299  miniScript(miniScript) {}
300  const string getMethodName() override {
301  return "audio.setListenerPosition";
302  }
303  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
304  Vector3 position;
305  if (miniScript->getVector3Value(argumentValues, 0, position) == true) {
306  miniScript->logic->getContext()->getAudio()->setListenerPosition(position);
307  } else {
308  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
309  miniScript->startErrorScript();
310  }
311  }
312  const vector<string>& getContextFunctions() {
314  }
315  };
316  registerMethod(new ScriptMethodAudioSetListenerPosition(this));
317  }
318  {
319  //
320  class ScriptMethodAudioGetListenerOrientationUp: public ScriptMethod {
321  private:
322  LogicMiniScript* miniScript { nullptr };
323  public:
324  ScriptMethodAudioGetListenerOrientationUp(LogicMiniScript* miniScript):
325  ScriptMethod(
326  {},
328  ),
329  miniScript(miniScript) {}
330  const string getMethodName() override {
331  return "audio.getListenerOrientationUp";
332  }
333  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
334  miniScript->setValue(returnValue, miniScript->logic->getContext()->getAudio()->getListenerOrientationUp());
335  }
336  const vector<string>& getContextFunctions() {
338  }
339  };
340  registerMethod(new ScriptMethodAudioGetListenerOrientationUp(this));
341  }
342  {
343  //
344  class ScriptMethodAudioSetListenerOrientationUp: public ScriptMethod {
345  private:
346  LogicMiniScript* miniScript { nullptr };
347  public:
348  ScriptMethodAudioSetListenerOrientationUp(LogicMiniScript* miniScript):
349  ScriptMethod(
350  {
351  { .type = TYPE_VECTOR3, .name = "orientation", .optional = false, .reference = false, .nullable = false }
352  },
353  ScriptVariableType::TYPE_NULL
354  ),
355  miniScript(miniScript) {}
356  const string getMethodName() override {
357  return "audio.setListenerOrientationUp";
358  }
359  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
360  Vector3 orientation;
361  if (miniScript->getVector3Value(argumentValues, 0, orientation) == true) {
362  miniScript->logic->getContext()->getAudio()->setListenerOrientationUp(orientation);
363  } else {
364  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
365  miniScript->startErrorScript();
366  }
367  }
368  const vector<string>& getContextFunctions() {
370  }
371  };
372  registerMethod(new ScriptMethodAudioSetListenerOrientationUp(this));
373  }
374  {
375  //
376  class ScriptMethodAudioGetListenerOrientationAt: public ScriptMethod {
377  private:
378  LogicMiniScript* miniScript { nullptr };
379  public:
380  ScriptMethodAudioGetListenerOrientationAt(LogicMiniScript* miniScript):
381  ScriptMethod(
382  {},
384  ),
385  miniScript(miniScript) {}
386  const string getMethodName() override {
387  return "audio.getListenerOrientationAt";
388  }
389  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
390  miniScript->setValue(returnValue, miniScript->logic->getContext()->getAudio()->getListenerOrientationAt());
391  }
392  const vector<string>& getContextFunctions() {
394  }
395  };
396  registerMethod(new ScriptMethodAudioGetListenerOrientationAt(this));
397  }
398  {
399  //
400  class ScriptMethodAudioSetListenerOrientationAt: public ScriptMethod {
401  private:
402  LogicMiniScript* miniScript { nullptr };
403  public:
404  ScriptMethodAudioSetListenerOrientationAt(LogicMiniScript* miniScript):
405  ScriptMethod(
406  {
407  { .type = TYPE_VECTOR3, .name = "orientation", .optional = false, .reference = false, .nullable = false }
408  },
409  ScriptVariableType::TYPE_NULL
410  ),
411  miniScript(miniScript) {}
412  const string getMethodName() override {
413  return "audio.setListenerOrientationAt";
414  }
415  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
416  Vector3 orientation;
417  if (miniScript->getVector3Value(argumentValues, 0, orientation) == true) {
418  miniScript->logic->getContext()->getAudio()->setListenerOrientationAt(orientation);
419  } else {
420  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
421  miniScript->startErrorScript();
422  }
423  }
424  const vector<string>& getContextFunctions() {
426  }
427  };
428  registerMethod(new ScriptMethodAudioSetListenerOrientationAt(this));
429  }
430  {
431  //
432  class ScriptMethodAudioPlaySound: public ScriptMethod {
433  private:
434  LogicMiniScript* miniScript { nullptr };
435  public:
436  ScriptMethodAudioPlaySound(LogicMiniScript* miniScript):
437  ScriptMethod(
438  {
439  { .type = ScriptVariableType::TYPE_STRING, .name = "id", .optional = false, .reference = false, .nullable = false },
440  { .type = ScriptVariableType::TYPE_INTEGER, .name = "delay", .optional = true, .reference = false, .nullable = false },
441  { .type = ScriptVariableType::TYPE_INTEGER, .name = "gain", .optional = true, .reference = false, .nullable = false },
442  { .type = ScriptVariableType::TYPE_INTEGER, .name = "pitch", .optional = true, .reference = false, .nullable = false },
443  { .type = ScriptVariableType::TYPE_INTEGER, .name = "ignoreIfPlaying", .optional = true, .reference = false, .nullable = false }
444  },
445  ScriptVariableType::TYPE_NULL
446  ),
447  miniScript(miniScript) {}
448  const string getMethodName() override {
449  return "audio.play";
450  }
451  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
452  string id;
453  int64_t delay = 0;
454  auto gain = 1.0f;
455  auto pitch = 1.0f;
456  auto ignoreIfPlaying = false;
457  if (miniScript->getStringValue(argumentValues, 0, id) == true &&
458  miniScript->getIntegerValue(argumentValues, 1, delay, true) == true &&
459  miniScript->getFloatValue(argumentValues, 2, gain, true) == true &&
460  miniScript->getFloatValue(argumentValues, 3, pitch, true) == true &&
461  miniScript->getBooleanValue(argumentValues, 4, ignoreIfPlaying, true) == true) {
462  miniScript->logic->playSound(miniScript->logic->getId() + "." + id, delay, gain, pitch, ignoreIfPlaying);
463  } else {
464  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
465  miniScript->startErrorScript();
466  }
467  }
468  const vector<string>& getContextFunctions() {
470  }
471  };
472  registerMethod(new ScriptMethodAudioPlaySound(this));
473  }
474  {
475  //
476  class ScriptMethodAudioPlaySoundAtPosition: public ScriptMethod {
477  private:
478  LogicMiniScript* miniScript { nullptr };
479  public:
480  ScriptMethodAudioPlaySoundAtPosition(LogicMiniScript* miniScript):
481  ScriptMethod(
482  {
483  { .type = ScriptVariableType::TYPE_STRING, .name = "id", .optional = false, .reference = false, .nullable = false },
484  { .type = TYPE_VECTOR3, .name = "position", .optional = false, .reference = false, .nullable = false },
485  { .type = ScriptVariableType::TYPE_INTEGER, .name = "delay", .optional = true, .reference = false, .nullable = false },
486  { .type = ScriptVariableType::TYPE_INTEGER, .name = "gain", .optional = true, .reference = false, .nullable = false },
487  { .type = ScriptVariableType::TYPE_INTEGER, .name = "pitch", .optional = true, .reference = false, .nullable = false },
488  { .type = ScriptVariableType::TYPE_INTEGER, .name = "ignoreIfPlaying", .optional = true, .reference = false, .nullable = false }
489  },
490  ScriptVariableType::TYPE_NULL
491  ),
492  miniScript(miniScript) {}
493  const string getMethodName() override {
494  return "audio.playAtPosition";
495  }
496  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
497  string id;
498  Vector3 position;
499  int64_t delay = 0;
500  auto gain = 1.0f;
501  auto pitch = 1.0f;
502  auto ignoreIfPlaying = false;
503  if (miniScript->getStringValue(argumentValues, 0, id) == true &&
504  miniScript->getVector3Value(argumentValues, 1, position) == true &&
505  miniScript->getIntegerValue(argumentValues, 2, delay, true) == true &&
506  miniScript->getFloatValue(argumentValues, 3, gain, true) == true &&
507  miniScript->getFloatValue(argumentValues, 4, pitch, true) == true &&
508  miniScript->getBooleanValue(argumentValues, 5, ignoreIfPlaying, true) == true) {
509  miniScript->logic->playSound(miniScript->logic->getId() + "." + id, position, delay, gain, pitch, ignoreIfPlaying);
510  } else {
511  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
512  miniScript->startErrorScript();
513  }
514  }
515  const vector<string>& getContextFunctions() {
517  }
518  };
519  registerMethod(new ScriptMethodAudioPlaySoundAtPosition(this));
520  }
521  {
522  //
523  class ScriptMethodLogicSignalSend: public ScriptMethod {
524  private:
525  LogicMiniScript* miniScript { nullptr };
526  public:
527  ScriptMethodLogicSignalSend(LogicMiniScript* miniScript):
528  ScriptMethod({
529  { .type = ScriptVariableType::TYPE_STRING, .name = "logicId", .optional = false, .reference = false, .nullable = false },
530  { .type = ScriptVariableType::TYPE_STRING, .name = "signal", .optional = false, .reference = false, .nullable = false }
531  }),
532  miniScript(miniScript) {}
533  const string getMethodName() override {
534  return "logic.signal.send";
535  }
536  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
537  string logicId;
538  string signal;
539  if (miniScript->getStringValue(argumentValues, 0, logicId) == true &&
540  miniScript->getStringValue(argumentValues, 1, signal) == true) {
541  auto logic = static_cast<Logic*>(miniScript->context->getLogic(logicId));
542  if (logic == nullptr) {
543  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no logic with given id: " + logicId);
544  miniScript->startErrorScript();
545  } else {
546  vector<ScriptVariable> arguments(argumentValues.size() - 2);
547  for (auto i = 2; i < argumentValues.size(); i++) arguments.push_back(argumentValues[i]);
548  logic->addSignal(signal, arguments);
549  }
550  } else {
551  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
552  miniScript->startErrorScript();
553  }
554  }
555  bool isVariadic() const override {
556  return true;
557  }
558  const vector<string>& getContextFunctions() {
559  return CONTEXTFUNCTIONS_LOGIC;
560  }
561  };
562  registerMethod(new ScriptMethodLogicSignalSend(this));
563  }
564  {
565  //
566  class ScriptMethodLogicHas: public ScriptMethod {
567  private:
568  LogicMiniScript* miniScript { nullptr };
569  public:
570  ScriptMethodLogicHas(LogicMiniScript* miniScript):
571  ScriptMethod(
572  {
573  { .type = ScriptVariableType::TYPE_STRING, .name = "logicId", .optional = false, .reference = false, .nullable = false },
574  { .type = ScriptVariableType::TYPE_STRING, .name = "callable", .optional = false, .reference = false, .nullable = false }
575  },
576  ScriptVariableType::TYPE_BOOLEAN
577  ),
578  miniScript(miniScript) {}
579  const string getMethodName() override {
580  return "logic.has";
581  }
582  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
583  string logicId;
584  string callable;
585  if (EngineMiniScript::getStringValue(argumentValues, 0, logicId) == false ||
586  EngineMiniScript::getStringValue(argumentValues, 1, callable) == false) {
587  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
588  miniScript->startErrorScript();
589  } else {
590  auto logic = dynamic_cast<MiniScriptLogic*>(miniScript->context->getLogic(logicId));
591  if (logic == nullptr || logic->getMiniScript() == nullptr) {
592  miniScript->setValue(returnValue, false);
593  } else {
594  auto logicMiniScript = logic->getMiniScript();
595  auto scriptIdx = logicMiniScript->getFunctionScriptIdx(callable);
596  if (scriptIdx == SCRIPTIDX_NONE || logicMiniScript->getScripts()[scriptIdx].callable == false) {
597  miniScript->setValue(returnValue, false);
598  } else {
599  miniScript->setValue(returnValue, true);
600  }
601  }
602  }
603  }
604  };
605  registerMethod(new ScriptMethodLogicHas(this));
606  }
607  {
608  //
609  class ScriptMethodLogicCall: public ScriptMethod {
610  private:
611  LogicMiniScript* miniScript { nullptr };
612  public:
613  ScriptMethodLogicCall(LogicMiniScript* miniScript):
614  ScriptMethod(
615  {
616  { .type = ScriptVariableType::TYPE_STRING, .name = "logicId", .optional = false, .reference = false, .nullable = false },
617  { .type = ScriptVariableType::TYPE_STRING, .name = "callable", .optional = false, .reference = false, .nullable = false }
618  },
619  ScriptVariableType::TYPE_PSEUDO_MIXED
620  ),
621  miniScript(miniScript) {}
622  const string getMethodName() override {
623  return "logic.call";
624  }
625  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
626  string logicId;
627  string callable;
628  if (EngineMiniScript::getStringValue(argumentValues, 0, logicId) == false ||
629  EngineMiniScript::getStringValue(argumentValues, 1, callable) == false) {
630  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
631  miniScript->startErrorScript();
632  } else {
633  auto logic = dynamic_cast<MiniScriptLogic*>(miniScript->context->getLogic(logicId));
634  if (logic == nullptr || logic->getMiniScript() == nullptr) {
635  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": no mini script logic with given id: " + logicId);
636  miniScript->startErrorScript();
637  } else {
638  auto logicMiniScript = logic->getMiniScript();
639  auto scriptIdx = logicMiniScript->getFunctionScriptIdx(callable);
640  if (scriptIdx == SCRIPTIDX_NONE || logicMiniScript->getScripts()[scriptIdx].callable == false) {
641  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": callable not found: " + callable);
642  miniScript->startErrorScript();
643  } else {
644  #if defined (__APPLE__)
645  // MACOSX currently does not support initializing span using begin and end iterators,
646  vector<ScriptVariable> callArgumentValues(argumentValues.size() - 2);
647  for (auto i = 2; i < argumentValues.size(); i++) callArgumentValues[i - 2] = move(argumentValues[i]);
648  // call
649  span callArgumentValuesSpan(callArgumentValues);
650  logicMiniScript->call(scriptIdx, callArgumentValuesSpan, returnValue);
651  // move back arguments
652  for (auto i = 2; i < argumentValues.size(); i++) argumentValues[i] = move(callArgumentValues[i - 2]);
653  #else
654  span callArgumentValuesSpan(argumentValues.begin() + 2, argumentValues.end());
655  logicMiniScript->call(scriptIdx, callArgumentValuesSpan, returnValue);
656  #endif
657  }
658  }
659  }
660  }
661  bool isVariadic() const override {
662  return true;
663  }
664  };
665  registerMethod(new ScriptMethodLogicCall(this));
666  }
667  {
668  //
669  class ScriptMethodLogicSignalHas: public ScriptMethod {
670  private:
671  LogicMiniScript* miniScript { nullptr };
672  public:
673  ScriptMethodLogicSignalHas(LogicMiniScript* miniScript):
674  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
675  miniScript(miniScript) {}
676  const string getMethodName() override {
677  return "logic.signal.has";
678  }
679  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
680  miniScript->setValue(returnValue, miniScript->logic->hasSignal());
681  }
682  const vector<string>& getContextFunctions() {
683  return CONTEXTFUNCTIONS_ALL;
684  }
685  };
686  registerMethod(new ScriptMethodLogicSignalHas(this));
687  }
688  {
689  //
690  class ScriptMethodLogicSignalGetName: public ScriptMethod {
691  private:
692  LogicMiniScript* miniScript { nullptr };
693  public:
694  ScriptMethodLogicSignalGetName(LogicMiniScript* miniScript):
695  ScriptMethod({}, ScriptVariableType::TYPE_STRING),
696  miniScript(miniScript) {}
697  const string getMethodName() override {
698  return "logic.signal.getName";
699  }
700  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
701  miniScript->setValue(returnValue, miniScript->logic->getSignalName());
702  }
703  const vector<string>& getContextFunctions() {
704  return CONTEXTFUNCTIONS_ALL;
705  }
706  };
707  registerMethod(new ScriptMethodLogicSignalGetName(this));
708  }
709  {
710  //
711  class ScriptMethodLogicSignalGetArgument: public ScriptMethod {
712  private:
713  LogicMiniScript* miniScript { nullptr };
714  public:
715  ScriptMethodLogicSignalGetArgument(LogicMiniScript* miniScript):
716  ScriptMethod(
717  {
718  { .type = ScriptVariableType::TYPE_INTEGER, .name = "argumentIndex", .optional = false, .reference = false, .nullable = false }
719  },
720  ScriptVariableType::TYPE_PSEUDO_MIXED
721  ),
722  miniScript(miniScript) {}
723  const string getMethodName() override {
724  return "logic.signal.getArgument";
725  }
726  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
727  int64_t argumentIndex;
728  if (miniScript->getIntegerValue(argumentValues, 0, argumentIndex) == true) {
729  returnValue = miniScript->logic->getSignalArgument(argumentIndex);
730  } else {
731  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
732  miniScript->startErrorScript();
733  }
734  }
735  const vector<string>& getContextFunctions() {
736  return CONTEXTFUNCTIONS_ALL;
737  }
738  };
739  registerMethod(new ScriptMethodLogicSignalGetArgument(this));
740  }
741  {
742  //
743  class ScriptMethodLogicSignalNext: public ScriptMethod {
744  private:
745  LogicMiniScript* miniScript { nullptr };
746  public:
747  ScriptMethodLogicSignalNext(LogicMiniScript* miniScript):
748  ScriptMethod(),
749  miniScript(miniScript) {}
750  const string getMethodName() override {
751  return "logic.signal.next";
752  }
753  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
754  miniScript->logic->removeSignal();
755  }
756  const vector<string>& getContextFunctions() {
757  return CONTEXTFUNCTIONS_ALL;
758  }
759  };
760  registerMethod(new ScriptMethodLogicSignalNext(this));
761  }
762  // keyboard input
763  {
764  //
765  class ScriptMethodInputKeyboardKEYCODE_LEFT: public ScriptMethod {
766  private:
767  LogicMiniScript* miniScript { nullptr };
768  public:
769  ScriptMethodInputKeyboardKEYCODE_LEFT(LogicMiniScript* miniScript):
770  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
771  miniScript(miniScript) {}
772  const string getMethodName() override {
773  return "input.keyboard.KEYCODE_LEFT";
774  }
775  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
776  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_LEFT);
777  }
778  const vector<string>& getContextFunctions() {
779  return CONTEXTFUNCTIONS_ALL;
780  }
781  };
782  registerMethod(new ScriptMethodInputKeyboardKEYCODE_LEFT(this));
783  }
784  {
785  //
786  class ScriptMethodInputKeyboardKEYCODE_RIGHT: public ScriptMethod {
787  private:
788  LogicMiniScript* miniScript { nullptr };
789  public:
790  ScriptMethodInputKeyboardKEYCODE_RIGHT(LogicMiniScript* miniScript):
791  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
792  miniScript(miniScript) {}
793  const string getMethodName() override {
794  return "input.keyboard.KEYCODE_RIGHT";
795  }
796  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
797  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_RIGHT);
798  }
799  const vector<string>& getContextFunctions() {
800  return CONTEXTFUNCTIONS_ALL;
801  }
802  };
803  registerMethod(new ScriptMethodInputKeyboardKEYCODE_RIGHT(this));
804  }
805  {
806  //
807  class ScriptMethodInputKeyboardKEYCODE_UP: public ScriptMethod {
808  private:
809  LogicMiniScript* miniScript { nullptr };
810  public:
811  ScriptMethodInputKeyboardKEYCODE_UP(LogicMiniScript* miniScript):
812  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
813  miniScript(miniScript) {}
814  const string getMethodName() override {
815  return "input.keyboard.KEYCODE_UP";
816  }
817  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
818  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_UP);
819  }
820  const vector<string>& getContextFunctions() {
821  return CONTEXTFUNCTIONS_ALL;
822  }
823  };
824  registerMethod(new ScriptMethodInputKeyboardKEYCODE_UP(this));
825  }
826  {
827  //
828  class ScriptMethodInputKeyboardKEYCODE_DOWN: public ScriptMethod {
829  private:
830  LogicMiniScript* miniScript { nullptr };
831  public:
832  ScriptMethodInputKeyboardKEYCODE_DOWN(LogicMiniScript* miniScript):
833  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
834  miniScript(miniScript) {}
835  const string getMethodName() override {
836  return "input.keyboard.KEYCODE_DOWN";
837  }
838  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
839  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_DOWN);
840  }
841  const vector<string>& getContextFunctions() {
842  return CONTEXTFUNCTIONS_ALL;
843  }
844  };
845  registerMethod(new ScriptMethodInputKeyboardKEYCODE_DOWN(this));
846  }
847  {
848  //
849  class ScriptMethodInputKeyboardKEYCODE_POS1: public ScriptMethod {
850  private:
851  LogicMiniScript* miniScript { nullptr };
852  public:
853  ScriptMethodInputKeyboardKEYCODE_POS1(LogicMiniScript* miniScript):
854  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
855  miniScript(miniScript) {}
856  const string getMethodName() override {
857  return "input.keyboard.KEYCODE_POS1";
858  }
859  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
860  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_POS1);
861  }
862  const vector<string>& getContextFunctions() {
863  return CONTEXTFUNCTIONS_ALL;
864  }
865  };
866  registerMethod(new ScriptMethodInputKeyboardKEYCODE_POS1(this));
867  }
868  {
869  //
870  class ScriptMethodInputKeyboardKEYCODE_END: public ScriptMethod {
871  private:
872  LogicMiniScript* miniScript { nullptr };
873  public:
874  ScriptMethodInputKeyboardKEYCODE_END(LogicMiniScript* miniScript):
875  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
876  miniScript(miniScript) {}
877  const string getMethodName() override {
878  return "input.keyboard.KEYCODE_END";
879  }
880  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
881  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_END);
882  }
883  const vector<string>& getContextFunctions() {
884  return CONTEXTFUNCTIONS_ALL;
885  }
886  };
887  registerMethod(new ScriptMethodInputKeyboardKEYCODE_END(this));
888  }
889  {
890  //
891  class ScriptMethodInputKeyboardKEYCODE_PAGEUP: public ScriptMethod {
892  private:
893  LogicMiniScript* miniScript { nullptr };
894  public:
895  ScriptMethodInputKeyboardKEYCODE_PAGEUP(LogicMiniScript* miniScript):
896  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
897  miniScript(miniScript) {}
898  const string getMethodName() override {
899  return "input.keyboard.KEYCODE_PAGEUP";
900  }
901  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
902  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_PAGE_UP);
903  }
904  const vector<string>& getContextFunctions() {
905  return CONTEXTFUNCTIONS_ALL;
906  }
907  };
908  registerMethod(new ScriptMethodInputKeyboardKEYCODE_PAGEUP(this));
909  }
910  {
911  //
912  class ScriptMethodInputKeyboardKEYCODE_PAGEDOWN: public ScriptMethod {
913  private:
914  LogicMiniScript* miniScript { nullptr };
915  public:
916  ScriptMethodInputKeyboardKEYCODE_PAGEDOWN(LogicMiniScript* miniScript):
917  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
918  miniScript(miniScript) {}
919  const string getMethodName() override {
920  return "input.keyboard.KEYCODE_PAGEDOWN";
921  }
922  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
923  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_PAGE_DOWN);
924  }
925  const vector<string>& getContextFunctions() {
926  return CONTEXTFUNCTIONS_ALL;
927  }
928  };
929  registerMethod(new ScriptMethodInputKeyboardKEYCODE_PAGEDOWN(this));
930  }
931  {
932  //
933  class ScriptMethodInputKeyboardKEYCODE_BACKSPACE: public ScriptMethod {
934  private:
935  LogicMiniScript* miniScript { nullptr };
936  public:
937  ScriptMethodInputKeyboardKEYCODE_BACKSPACE(LogicMiniScript* miniScript):
938  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
939  miniScript(miniScript) {}
940  const string getMethodName() override {
941  return "input.keyboard.KEYCODE_BACKSPACE";
942  }
943  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
944  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_BACKSPACE);
945  }
946  const vector<string>& getContextFunctions() {
947  return CONTEXTFUNCTIONS_ALL;
948  }
949  };
950  registerMethod(new ScriptMethodInputKeyboardKEYCODE_BACKSPACE(this));
951  }
952  {
953  //
954  class ScriptMethodInputKeyboardKEYCODE_DELETE: public ScriptMethod {
955  private:
956  LogicMiniScript* miniScript { nullptr };
957  public:
958  ScriptMethodInputKeyboardKEYCODE_DELETE(LogicMiniScript* miniScript):
959  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
960  miniScript(miniScript) {}
961  const string getMethodName() override {
962  return "input.keyboard.KEYCODE_DELETE";
963  }
964  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
965  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_DELETE);
966  }
967  const vector<string>& getContextFunctions() {
968  return CONTEXTFUNCTIONS_ALL;
969  }
970  };
971  registerMethod(new ScriptMethodInputKeyboardKEYCODE_DELETE(this));
972  }
973  {
974  //
975  class ScriptMethodInputKeyboardKEYCODE_SPACE: public ScriptMethod {
976  private:
977  LogicMiniScript* miniScript { nullptr };
978  public:
979  ScriptMethodInputKeyboardKEYCODE_SPACE(LogicMiniScript* miniScript):
980  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
981  miniScript(miniScript) {}
982  const string getMethodName() override {
983  return "input.keyboard.KEYCODE_SPACE";
984  }
985  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
986  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_SPACE);
987  }
988  const vector<string>& getContextFunctions() {
989  return CONTEXTFUNCTIONS_ALL;
990  }
991  };
992  registerMethod(new ScriptMethodInputKeyboardKEYCODE_SPACE(this));
993  }
994  {
995  //
996  class ScriptMethodInputKeyboardKEYCODE_RETURN: public ScriptMethod {
997  private:
998  LogicMiniScript* miniScript { nullptr };
999  public:
1000  ScriptMethodInputKeyboardKEYCODE_RETURN(LogicMiniScript* miniScript):
1001  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1002  miniScript(miniScript) {}
1003  const string getMethodName() override {
1004  return "input.keyboard.KEYCODE_RETURN";
1005  }
1006  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1007  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_RETURN);
1008  }
1009  const vector<string>& getContextFunctions() {
1010  return CONTEXTFUNCTIONS_ALL;
1011  }
1012  };
1013  registerMethod(new ScriptMethodInputKeyboardKEYCODE_RETURN(this));
1014  }
1015  {
1016  //
1017  class ScriptMethodInputKeyboardKEYCODE_ESCAPE: public ScriptMethod {
1018  private:
1019  LogicMiniScript* miniScript { nullptr };
1020  public:
1021  ScriptMethodInputKeyboardKEYCODE_ESCAPE(LogicMiniScript* miniScript):
1022  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1023  miniScript(miniScript) {}
1024  const string getMethodName() override {
1025  return "input.keyboard.KEYCODE_ESCAPE";
1026  }
1027  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1028  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_ESCAPE);
1029  }
1030  const vector<string>& getContextFunctions() {
1031  return CONTEXTFUNCTIONS_ALL;
1032  }
1033  };
1034  registerMethod(new ScriptMethodInputKeyboardKEYCODE_ESCAPE(this));
1035  }
1036  {
1037  //
1038  class ScriptMethodInputKeyboardKEYCODE_F1: public ScriptMethod {
1039  private:
1040  LogicMiniScript* miniScript { nullptr };
1041  public:
1042  ScriptMethodInputKeyboardKEYCODE_F1(LogicMiniScript* miniScript):
1043  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1044  miniScript(miniScript) {}
1045  const string getMethodName() override {
1046  return "input.keyboard.KEYCODE_F1";
1047  }
1048  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1049  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F1);
1050  }
1051  const vector<string>& getContextFunctions() {
1052  return CONTEXTFUNCTIONS_ALL;
1053  }
1054  };
1055  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F1(this));
1056  }
1057  {
1058  //
1059  class ScriptMethodInputKeyboardKEYCODE_F2: public ScriptMethod {
1060  private:
1061  LogicMiniScript* miniScript { nullptr };
1062  public:
1063  ScriptMethodInputKeyboardKEYCODE_F2(LogicMiniScript* miniScript):
1064  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1065  miniScript(miniScript) {}
1066  const string getMethodName() override {
1067  return "input.keyboard.KEYCODE_F2";
1068  }
1069  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1070  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F2);
1071  }
1072  const vector<string>& getContextFunctions() {
1073  return CONTEXTFUNCTIONS_ALL;
1074  }
1075  };
1076  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F2(this));
1077  }
1078  {
1079  //
1080  class ScriptMethodInputKeyboardKEYCODE_F3: public ScriptMethod {
1081  private:
1082  LogicMiniScript* miniScript { nullptr };
1083  public:
1084  ScriptMethodInputKeyboardKEYCODE_F3(LogicMiniScript* miniScript):
1085  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1086  miniScript(miniScript) {}
1087  const string getMethodName() override {
1088  return "input.keyboard.KEYCODE_F3";
1089  }
1090  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1091  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F3);
1092  }
1093  const vector<string>& getContextFunctions() {
1094  return CONTEXTFUNCTIONS_ALL;
1095  }
1096  };
1097  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F3(this));
1098  }
1099  {
1100  //
1101  class ScriptMethodInputKeyboardKEYCODE_F4: public ScriptMethod {
1102  private:
1103  LogicMiniScript* miniScript { nullptr };
1104  public:
1105  ScriptMethodInputKeyboardKEYCODE_F4(LogicMiniScript* miniScript):
1106  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1107  miniScript(miniScript) {}
1108  const string getMethodName() override {
1109  return "input.keyboard.KEYCODE_F4";
1110  }
1111  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1112  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F4);
1113  }
1114  const vector<string>& getContextFunctions() {
1115  return CONTEXTFUNCTIONS_ALL;
1116  }
1117  };
1118  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F4(this));
1119  }
1120  {
1121  //
1122  class ScriptMethodInputKeyboardKEYCODE_F5: public ScriptMethod {
1123  private:
1124  LogicMiniScript* miniScript { nullptr };
1125  public:
1126  ScriptMethodInputKeyboardKEYCODE_F5(LogicMiniScript* miniScript):
1127  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1128  miniScript(miniScript) {}
1129  const string getMethodName() override {
1130  return "input.keyboard.KEYCODE_F5";
1131  }
1132  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1133  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F5);
1134  }
1135  const vector<string>& getContextFunctions() {
1136  return CONTEXTFUNCTIONS_ALL;
1137  }
1138  };
1139  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F5(this));
1140  }
1141  {
1142  //
1143  class ScriptMethodInputKeyboardKEYCODE_F6: public ScriptMethod {
1144  private:
1145  LogicMiniScript* miniScript { nullptr };
1146  public:
1147  ScriptMethodInputKeyboardKEYCODE_F6(LogicMiniScript* miniScript):
1148  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1149  miniScript(miniScript) {}
1150  const string getMethodName() override {
1151  return "input.keyboard.KEYCODE_F6";
1152  }
1153  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1154  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F6);
1155  }
1156  const vector<string>& getContextFunctions() {
1157  return CONTEXTFUNCTIONS_ALL;
1158  }
1159  };
1160  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F6(this));
1161  }
1162  {
1163  //
1164  class ScriptMethodInputKeyboardKEYCODE_F7: public ScriptMethod {
1165  private:
1166  LogicMiniScript* miniScript { nullptr };
1167  public:
1168  ScriptMethodInputKeyboardKEYCODE_F7(LogicMiniScript* miniScript):
1169  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1170  miniScript(miniScript) {}
1171  const string getMethodName() override {
1172  return "input.keyboard.KEYCODE_F7";
1173  }
1174  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1175  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F7);
1176  }
1177  const vector<string>& getContextFunctions() {
1178  return CONTEXTFUNCTIONS_ALL;
1179  }
1180  };
1181  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F7(this));
1182  }
1183  {
1184  //
1185  class ScriptMethodInputKeyboardKEYCODE_F8: public ScriptMethod {
1186  private:
1187  LogicMiniScript* miniScript { nullptr };
1188  public:
1189  ScriptMethodInputKeyboardKEYCODE_F8(LogicMiniScript* miniScript):
1190  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1191  miniScript(miniScript) {}
1192  const string getMethodName() override {
1193  return "input.keyboard.KEYCODE_F8";
1194  }
1195  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1196  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F8);
1197  }
1198  const vector<string>& getContextFunctions() {
1199  return CONTEXTFUNCTIONS_ALL;
1200  }
1201  };
1202  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F8(this));
1203  }
1204  {
1205  //
1206  class ScriptMethodInputKeyboardKEYCODE_F9: public ScriptMethod {
1207  private:
1208  LogicMiniScript* miniScript { nullptr };
1209  public:
1210  ScriptMethodInputKeyboardKEYCODE_F9(LogicMiniScript* miniScript):
1211  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1212  miniScript(miniScript) {}
1213  const string getMethodName() override {
1214  return "input.keyboard.KEYCODE_F9";
1215  }
1216  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1217  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F9);
1218  }
1219  const vector<string>& getContextFunctions() {
1220  return CONTEXTFUNCTIONS_ALL;
1221  }
1222  };
1223  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F9(this));
1224  }
1225  {
1226  //
1227  class ScriptMethodInputKeyboardKEYCODE_F10: public ScriptMethod {
1228  private:
1229  LogicMiniScript* miniScript { nullptr };
1230  public:
1231  ScriptMethodInputKeyboardKEYCODE_F10(LogicMiniScript* miniScript):
1232  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1233  miniScript(miniScript) {}
1234  const string getMethodName() override {
1235  return "input.keyboard.KEYCODE_F10";
1236  }
1237  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1238  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F10);
1239  }
1240  const vector<string>& getContextFunctions() {
1241  return CONTEXTFUNCTIONS_ALL;
1242  }
1243  };
1244  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F10(this));
1245  }
1246  {
1247  //
1248  class ScriptMethodInputKeyboardKEYCODE_F11: public ScriptMethod {
1249  private:
1250  LogicMiniScript* miniScript { nullptr };
1251  public:
1252  ScriptMethodInputKeyboardKEYCODE_F11(LogicMiniScript* miniScript):
1253  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1254  miniScript(miniScript) {}
1255  const string getMethodName() override {
1256  return "input.keyboard.KEYCODE_F11";
1257  }
1258  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1259  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F11);
1260  }
1261  const vector<string>& getContextFunctions() {
1262  return CONTEXTFUNCTIONS_ALL;
1263  }
1264  };
1265  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F11(this));
1266  }
1267  {
1268  //
1269  class ScriptMethodInputKeyboardKEYCODE_F12: public ScriptMethod {
1270  private:
1271  LogicMiniScript* miniScript { nullptr };
1272  public:
1273  ScriptMethodInputKeyboardKEYCODE_F12(LogicMiniScript* miniScript):
1274  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1275  miniScript(miniScript) {}
1276  const string getMethodName() override {
1277  return "input.keyboard.KEYCODE_F12";
1278  }
1279  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1280  returnValue = static_cast<int64_t>(GUIKeyboardEvent::KEYCODE_F12);
1281  }
1282  const vector<string>& getContextFunctions() {
1283  return CONTEXTFUNCTIONS_ALL;
1284  }
1285  };
1286  registerMethod(new ScriptMethodInputKeyboardKEYCODE_F12(this));
1287  }
1288  {
1289  //
1290  class ScriptMethodInputKeyboardIsKeyDown: public ScriptMethod {
1291  private:
1292  LogicMiniScript* miniScript { nullptr };
1293  public:
1294  ScriptMethodInputKeyboardIsKeyDown(LogicMiniScript* miniScript):
1295  ScriptMethod(
1296  {
1297  { .type = ScriptVariableType::TYPE_INTEGER, .name = "keyCode", .optional = false, .reference = false, .nullable = false }
1298  },
1299  ScriptVariableType::TYPE_BOOLEAN
1300  ),
1301  miniScript(miniScript) {}
1302  const string getMethodName() override {
1303  return "input.keyboard.isKeyDown";
1304  }
1305  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1306  int64_t keyCode;
1307  if (miniScript->getIntegerValue(argumentValues, 0, keyCode) == true) {
1308  returnValue = miniScript->keyboardKeys.find(keyCode) != miniScript->keyboardKeys.end();
1309  } else {
1310  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1311  miniScript->startErrorScript();
1312  }
1313  }
1314  const vector<string>& getContextFunctions() {
1315  return CONTEXTFUNCTIONS_ALL;
1316  }
1317  };
1318  registerMethod(new ScriptMethodInputKeyboardIsKeyDown(this));
1319  }
1320  {
1321  //
1322  class ScriptMethodInputKeyboardIsCharDown: public ScriptMethod {
1323  private:
1324  LogicMiniScript* miniScript { nullptr };
1325  public:
1326  ScriptMethodInputKeyboardIsCharDown(LogicMiniScript* miniScript):
1327  ScriptMethod(
1328  {
1329  { .type = ScriptVariableType::TYPE_STRING, .name = "charAsString", .optional = false, .reference = false, .nullable = false }
1330  },
1331  ScriptVariableType::TYPE_BOOLEAN
1332  ),
1333  miniScript(miniScript) {}
1334  const string getMethodName() override {
1335  return "input.keyboard.isCharDown";
1336  }
1337  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1338  string charAsString;
1339  if (miniScript->getStringValue(argumentValues, 0, charAsString) == true) {
1340  UTF8CharacterIterator u8It(charAsString);
1341  auto keyChar = u8It.hasNext() == true?u8It.next():-1;
1342  returnValue = miniScript->keyboardChars.find(keyChar) != miniScript->keyboardChars.end();
1343  } else {
1344  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1345  miniScript->startErrorScript();
1346  }
1347  }
1348  const vector<string>& getContextFunctions() {
1349  return CONTEXTFUNCTIONS_ALL;
1350  }
1351  };
1352  registerMethod(new ScriptMethodInputKeyboardIsCharDown(this));
1353  }
1354  {
1355  //
1356  class ScriptMethodInputKeyboardGetTypedString: public ScriptMethod {
1357  private:
1358  LogicMiniScript* miniScript { nullptr };
1359  public:
1360  ScriptMethodInputKeyboardGetTypedString(LogicMiniScript* miniScript):
1361  ScriptMethod({}, ScriptVariableType::TYPE_STRING),
1362  miniScript(miniScript) {}
1363  const string getMethodName() override {
1364  return "input.keyboard.getTypedString";
1365  }
1366  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1367  returnValue = miniScript->keyboardTypedChars;
1368  }
1369  const vector<string>& getContextFunctions() {
1370  return CONTEXTFUNCTIONS_ALL;
1371  }
1372  };
1373  registerMethod(new ScriptMethodInputKeyboardGetTypedString(this));
1374  }
1375  {
1376  //
1377  class ScriptMethodInputKeyboardIsControlDown: public ScriptMethod {
1378  private:
1379  LogicMiniScript* miniScript { nullptr };
1380  public:
1381  ScriptMethodInputKeyboardIsControlDown(LogicMiniScript* miniScript):
1382  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
1383  miniScript(miniScript) {}
1384  const string getMethodName() override {
1385  return "input.keyboard.isControlDown";
1386  }
1387  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1388  returnValue = miniScript->keyboardControlDown == true;
1389  }
1390  const vector<string>& getContextFunctions() {
1391  return CONTEXTFUNCTIONS_ALL;
1392  }
1393  };
1394  registerMethod(new ScriptMethodInputKeyboardIsControlDown(this));
1395  }
1396  {
1397  //
1398  class ScriptMethodInputKeyboardIsMetaDown: public ScriptMethod {
1399  private:
1400  LogicMiniScript* miniScript { nullptr };
1401  public:
1402  ScriptMethodInputKeyboardIsMetaDown(LogicMiniScript* miniScript):
1403  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
1404  miniScript(miniScript) {}
1405  const string getMethodName() override {
1406  return "input.keyboard.isMetaDown";
1407  }
1408  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1409  returnValue = miniScript->keyboardControlDown == true;
1410  }
1411  const vector<string>& getContextFunctions() {
1412  return CONTEXTFUNCTIONS_ALL;
1413  }
1414  };
1415  registerMethod(new ScriptMethodInputKeyboardIsMetaDown(this));
1416  }
1417  {
1418  //
1419  class ScriptMethodInputKeyboardIsAltDown: public ScriptMethod {
1420  private:
1421  LogicMiniScript* miniScript { nullptr };
1422  public:
1423  ScriptMethodInputKeyboardIsAltDown(LogicMiniScript* miniScript):
1424  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
1425  miniScript(miniScript) {}
1426  const string getMethodName() override {
1427  return "input.keyboard.isAltDown";
1428  }
1429  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1430  returnValue = miniScript->keyboardAltDown == true;
1431  }
1432  const vector<string>& getContextFunctions() {
1433  return CONTEXTFUNCTIONS_ALL;
1434  }
1435  };
1436  registerMethod(new ScriptMethodInputKeyboardIsAltDown(this));
1437  }
1438  {
1439  //
1440  class ScriptMethodInputKeyboardIsShiftDown: public ScriptMethod {
1441  private:
1442  LogicMiniScript* miniScript { nullptr };
1443  public:
1444  ScriptMethodInputKeyboardIsShiftDown(LogicMiniScript* miniScript):
1445  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
1446  miniScript(miniScript) {}
1447  const string getMethodName() override {
1448  return "input.keyboard.isShiftDown";
1449  }
1450  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1451  returnValue = miniScript->keyboardShiftDown == true;
1452  }
1453  const vector<string>& getContextFunctions() {
1454  return CONTEXTFUNCTIONS_ALL;
1455  }
1456  };
1457  registerMethod(new ScriptMethodInputKeyboardIsShiftDown(this));
1458  }
1459  // mouse input
1460  {
1461  //
1462  class ScriptMethodInputMouseBUTTON_LEFT: public ScriptMethod {
1463  private:
1464  LogicMiniScript* miniScript { nullptr };
1465  public:
1466  ScriptMethodInputMouseBUTTON_LEFT(LogicMiniScript* miniScript):
1467  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1468  miniScript(miniScript) {}
1469  const string getMethodName() override {
1470  return "input.mouse.BUTTON_LEFT";
1471  }
1472  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1473  returnValue = static_cast<int64_t>(GUIMouseEvent::MOUSEEVENT_BUTTON_LEFT - 1);
1474  }
1475  const vector<string>& getContextFunctions() {
1476  return CONTEXTFUNCTIONS_ALL;
1477  }
1478  };
1479  registerMethod(new ScriptMethodInputMouseBUTTON_LEFT(this));
1480  }
1481  {
1482  //
1483  class ScriptMethodInputMouseBUTTON_MIDDLE: public ScriptMethod {
1484  private:
1485  LogicMiniScript* miniScript { nullptr };
1486  public:
1487  ScriptMethodInputMouseBUTTON_MIDDLE(LogicMiniScript* miniScript):
1488  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1489  miniScript(miniScript) {}
1490  const string getMethodName() override {
1491  return "input.mouse.BUTTON_MIDDLE";
1492  }
1493  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1494  returnValue = static_cast<int64_t>(GUIMouseEvent::MOUSEEVENT_BUTTON_MIDDLE - 1);
1495  }
1496  const vector<string>& getContextFunctions() {
1497  return CONTEXTFUNCTIONS_ALL;
1498  }
1499  };
1500  registerMethod(new ScriptMethodInputMouseBUTTON_MIDDLE(this));
1501  }
1502  {
1503  //
1504  class ScriptMethodInputMouseBUTTON_RIGHT: public ScriptMethod {
1505  private:
1506  LogicMiniScript* miniScript { nullptr };
1507  public:
1508  ScriptMethodInputMouseBUTTON_RIGHT(LogicMiniScript* miniScript):
1509  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1510  miniScript(miniScript) {}
1511  const string getMethodName() override {
1512  return "input.mouse.BUTTON_RIGHT";
1513  }
1514  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1515  returnValue = static_cast<int64_t>(GUIMouseEvent::MOUSEEVENT_BUTTON_RIGHT - 1);
1516  }
1517  const vector<string>& getContextFunctions() {
1518  return CONTEXTFUNCTIONS_ALL;
1519  }
1520  };
1521  registerMethod(new ScriptMethodInputMouseBUTTON_RIGHT(this));
1522  }
1523  {
1524  //
1525  class ScriptMethodInputMouseIsButtonDown: public ScriptMethod {
1526  private:
1527  LogicMiniScript* miniScript { nullptr };
1528  public:
1529  ScriptMethodInputMouseIsButtonDown(LogicMiniScript* miniScript):
1530  ScriptMethod(
1531  {
1532  { .type = ScriptVariableType::TYPE_INTEGER, .name = "button", .optional = false, .reference = false, .nullable = false }
1533  },
1534  ScriptVariableType::TYPE_BOOLEAN),
1535  miniScript(miniScript) {}
1536  const string getMethodName() override {
1537  return "input.mouse.isButtonDown";
1538  }
1539  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1540  int64_t button;
1541  if (miniScript->getIntegerValue(argumentValues, 0, button) == true) {
1542  returnValue = button >= 0 && button <= 3?miniScript->mouseDown[button]:false;
1543  } else {
1544  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1545  miniScript->startErrorScript();
1546  }
1547  }
1548  const vector<string>& getContextFunctions() {
1549  return CONTEXTFUNCTIONS_ALL;
1550  }
1551  };
1552  registerMethod(new ScriptMethodInputMouseIsButtonDown(this));
1553  }
1554  {
1555  //
1556  class ScriptMethodInputMouseIsButtonUp: public ScriptMethod {
1557  private:
1558  LogicMiniScript* miniScript { nullptr };
1559  public:
1560  ScriptMethodInputMouseIsButtonUp(LogicMiniScript* miniScript):
1561  ScriptMethod(
1562  {
1563  { .type = ScriptVariableType::TYPE_INTEGER, .name = "button", .optional = false, .reference = false, .nullable = false }
1564  },
1565  ScriptVariableType::TYPE_BOOLEAN),
1566  miniScript(miniScript) {}
1567  const string getMethodName() override {
1568  return "input.mouse.isButtonUp";
1569  }
1570  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1571  int64_t button;
1572  if (miniScript->getIntegerValue(argumentValues, 0, button) == true) {
1573  returnValue = button >= 0 && button <= 3?miniScript->mouseUp[button]:false;
1574  } else {
1575  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1576  miniScript->startErrorScript();
1577  }
1578  }
1579  const vector<string>& getContextFunctions() {
1580  return CONTEXTFUNCTIONS_ALL;
1581  }
1582  };
1583  registerMethod(new ScriptMethodInputMouseIsButtonUp(this));
1584  }
1585  {
1586  //
1587  class ScriptMethodInputMouseIsDragging: public ScriptMethod {
1588  private:
1589  LogicMiniScript* miniScript { nullptr };
1590  public:
1591  ScriptMethodInputMouseIsDragging(LogicMiniScript* miniScript):
1592  ScriptMethod(
1593  {
1594  { .type = ScriptVariableType::TYPE_INTEGER, .name = "button", .optional = false, .reference = false, .nullable = false }
1595  },
1596  ScriptVariableType::TYPE_BOOLEAN),
1597  miniScript(miniScript) {}
1598  const string getMethodName() override {
1599  return "input.mouse.isDragging";
1600  }
1601  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1602  int64_t button;
1603  if (miniScript->getIntegerValue(argumentValues, 0, button) == true) {
1604  returnValue = button >= 0 && button <= 3?miniScript->mouseDragging[button]:false;
1605  } else {
1606  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1607  miniScript->startErrorScript();
1608  }
1609  }
1610  const vector<string>& getContextFunctions() {
1611  return CONTEXTFUNCTIONS_ALL;
1612  }
1613  };
1614  registerMethod(new ScriptMethodInputMouseIsDragging(this));
1615  }
1616  {
1617  //
1618  class ScriptMethodInputMouseHasMoved: public ScriptMethod {
1619  private:
1620  LogicMiniScript* miniScript { nullptr };
1621  public:
1622  ScriptMethodInputMouseHasMoved(LogicMiniScript* miniScript):
1623  ScriptMethod({}, ScriptVariableType::TYPE_BOOLEAN),
1624  miniScript(miniScript) {}
1625  const string getMethodName() override {
1626  return "input.mouse.hasMoved";
1627  }
1628  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1629  returnValue = miniScript->mouseMoved;
1630  }
1631  const vector<string>& getContextFunctions() {
1632  return CONTEXTFUNCTIONS_ALL;
1633  }
1634  };
1635  registerMethod(new ScriptMethodInputMouseHasMoved(this));
1636  }
1637  {
1638  //
1639  class ScriptMethodInputMouseGetX: public ScriptMethod {
1640  private:
1641  LogicMiniScript* miniScript { nullptr };
1642  public:
1643  ScriptMethodInputMouseGetX(LogicMiniScript* miniScript):
1644  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1645  miniScript(miniScript) {}
1646  const string getMethodName() override {
1647  return "input.mouse.getX";
1648  }
1649  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1650  returnValue = static_cast<int64_t>(miniScript->mouseX);
1651  }
1652  const vector<string>& getContextFunctions() {
1653  return CONTEXTFUNCTIONS_ALL;
1654  }
1655  };
1656  registerMethod(new ScriptMethodInputMouseGetX(this));
1657  }
1658  {
1659  //
1660  class ScriptMethodInputMouseGetXUnscaled: public ScriptMethod {
1661  private:
1662  LogicMiniScript* miniScript { nullptr };
1663  public:
1664  ScriptMethodInputMouseGetXUnscaled(LogicMiniScript* miniScript):
1665  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1666  miniScript(miniScript) {}
1667  const string getMethodName() override {
1668  return "input.mouse.getXUnscaled";
1669  }
1670  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1671  returnValue = static_cast<int64_t>(miniScript->mouseXUnscaled);
1672  }
1673  const vector<string>& getContextFunctions() {
1674  return CONTEXTFUNCTIONS_ALL;
1675  }
1676  };
1677  registerMethod(new ScriptMethodInputMouseGetXUnscaled(this));
1678  }
1679  {
1680  //
1681  class ScriptMethodInputMouseGetY: public ScriptMethod {
1682  private:
1683  LogicMiniScript* miniScript { nullptr };
1684  public:
1685  ScriptMethodInputMouseGetY(LogicMiniScript* miniScript):
1686  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1687  miniScript(miniScript) {}
1688  const string getMethodName() override {
1689  return "input.mouse.getY";
1690  }
1691  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1692  returnValue = static_cast<int64_t>(miniScript->mouseY);
1693  }
1694  const vector<string>& getContextFunctions() {
1695  return CONTEXTFUNCTIONS_ALL;
1696  }
1697  };
1698  registerMethod(new ScriptMethodInputMouseGetY(this));
1699  }
1700  {
1701  //
1702  class ScriptMethodInputMouseGetYUnscaled: public ScriptMethod {
1703  private:
1704  LogicMiniScript* miniScript { nullptr };
1705  public:
1706  ScriptMethodInputMouseGetYUnscaled(LogicMiniScript* miniScript):
1707  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
1708  miniScript(miniScript) {}
1709  const string getMethodName() override {
1710  return "input.mouse.getYUnscaled";
1711  }
1712  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1713  returnValue = static_cast<int64_t>(miniScript->mouseYUnscaled);
1714  }
1715  const vector<string>& getContextFunctions() {
1716  return CONTEXTFUNCTIONS_ALL;
1717  }
1718  };
1719  registerMethod(new ScriptMethodInputMouseGetYUnscaled(this));
1720  }
1721  {
1722  //
1723  class ScriptMethodInputMouseGetWheelX: public ScriptMethod {
1724  private:
1725  LogicMiniScript* miniScript { nullptr };
1726  public:
1727  ScriptMethodInputMouseGetWheelX(LogicMiniScript* miniScript):
1728  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
1729  miniScript(miniScript) {}
1730  const string getMethodName() override {
1731  return "input.mouse.getWheelX";
1732  }
1733  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1734  returnValue = miniScript->mouseWheelX;
1735  }
1736  const vector<string>& getContextFunctions() {
1737  return CONTEXTFUNCTIONS_ALL;
1738  }
1739  };
1740  registerMethod(new ScriptMethodInputMouseGetWheelX(this));
1741  }
1742  {
1743  //
1744  class ScriptMethodInputMouseGetWheelY: public ScriptMethod {
1745  private:
1746  LogicMiniScript* miniScript { nullptr };
1747  public:
1748  ScriptMethodInputMouseGetWheelY(LogicMiniScript* miniScript):
1749  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
1750  miniScript(miniScript) {}
1751  const string getMethodName() override {
1752  return "input.mouse.getWheelY";
1753  }
1754  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1755  returnValue = miniScript->mouseWheelY;
1756  }
1757  const vector<string>& getContextFunctions() {
1758  return CONTEXTFUNCTIONS_ALL;
1759  }
1760  };
1761  registerMethod(new ScriptMethodInputMouseGetWheelY(this));
1762  }
1763  {
1764  //
1765  class ScriptMethodInputMouseGetWheelZ: public ScriptMethod {
1766  private:
1767  LogicMiniScript* miniScript { nullptr };
1768  public:
1769  ScriptMethodInputMouseGetWheelZ(LogicMiniScript* miniScript):
1770  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
1771  miniScript(miniScript) {}
1772  const string getMethodName() override {
1773  return "input.mouse.getWheelZ";
1774  }
1775  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1776  returnValue = miniScript->mouseWheelZ;
1777  }
1778  const vector<string>& getContextFunctions() {
1779  return CONTEXTFUNCTIONS_ALL;
1780  }
1781  };
1782  registerMethod(new ScriptMethodInputMouseGetWheelZ(this));
1783  }
1784  // camera
1785  {
1786  //
1787  class ScriptMethodCameraGetLookFrom: public ScriptMethod {
1788  private:
1789  LogicMiniScript* miniScript { nullptr };
1790  public:
1791  ScriptMethodCameraGetLookFrom(LogicMiniScript* miniScript):
1792  ScriptMethod({}, TYPE_VECTOR3),
1793  miniScript(miniScript) {}
1794  const string getMethodName() override {
1795  return "engine.camera.getLookFrom";
1796  }
1797  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1798  miniScript->setValue(returnValue, miniScript->context->getEngine()->getCamera()->getLookFrom());
1799  }
1800  const vector<string>& getContextFunctions() {
1801  return CONTEXTFUNCTIONS_ENGINE;
1802  }
1803  };
1804  registerMethod(new ScriptMethodCameraGetLookFrom(this));
1805  }
1806  {
1807  //
1808  class ScriptMethodCameraSetLookFrom: public ScriptMethod {
1809  private:
1810  LogicMiniScript* miniScript { nullptr };
1811  public:
1812  ScriptMethodCameraSetLookFrom(LogicMiniScript* miniScript):
1813  ScriptMethod(
1814  {
1815  { .type = TYPE_VECTOR3, .name = "lookFrom", .optional = false, .reference = false, .nullable = false }
1816  },
1817  ScriptVariableType::TYPE_NULL
1818  ),
1819  miniScript(miniScript) {}
1820  const string getMethodName() override {
1821  return "engine.camera.setLookFrom";
1822  }
1823  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1824  Vector3 lookFrom;
1825  if (miniScript->getVector3Value(argumentValues, 0, lookFrom) == true) {
1826  miniScript->context->getEngine()->getCamera()->setLookFrom(lookFrom);
1827  } else {
1828  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1829  miniScript->startErrorScript();
1830  }
1831  }
1832  const vector<string>& getContextFunctions() {
1833  return CONTEXTFUNCTIONS_ENGINE;
1834  }
1835  };
1836  registerMethod(new ScriptMethodCameraSetLookFrom(this));
1837  }
1838  {
1839  //
1840  class ScriptMethodCameraGetLookAt: public ScriptMethod {
1841  private:
1842  LogicMiniScript* miniScript { nullptr };
1843  public:
1844  ScriptMethodCameraGetLookAt(LogicMiniScript* miniScript):
1845  ScriptMethod({}, TYPE_VECTOR3),
1846  miniScript(miniScript) {}
1847  const string getMethodName() override {
1848  return "engine.camera.getLookAt";
1849  }
1850  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1851  miniScript->setValue(returnValue, miniScript->context->getEngine()->getCamera()->getLookAt());
1852  }
1853  const vector<string>& getContextFunctions() {
1854  return CONTEXTFUNCTIONS_ENGINE;
1855  }
1856  };
1857  registerMethod(new ScriptMethodCameraGetLookAt(this));
1858  }
1859  {
1860  //
1861  class ScriptMethodCameraSetLookAt: public ScriptMethod {
1862  private:
1863  LogicMiniScript* miniScript { nullptr };
1864  public:
1865  ScriptMethodCameraSetLookAt(LogicMiniScript* miniScript):
1866  ScriptMethod(
1867  {
1868  { .type = TYPE_VECTOR3, .name = "lookAt", .optional = false, .reference = false, .nullable = false }
1869  },
1870  ScriptVariableType::TYPE_NULL
1871  ),
1872  miniScript(miniScript) {}
1873  const string getMethodName() override {
1874  return "engine.camera.setLookAt";
1875  }
1876  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1877  Vector3 lookAt;
1878  if (miniScript->getVector3Value(argumentValues, 0, lookAt) == true) {
1879  miniScript->context->getEngine()->getCamera()->setLookAt(lookAt);
1880  } else {
1881  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1882  miniScript->startErrorScript();
1883  }
1884  }
1885  const vector<string>& getContextFunctions() {
1886  return CONTEXTFUNCTIONS_ENGINE;
1887  }
1888  };
1889  registerMethod(new ScriptMethodCameraSetLookAt(this));
1890  }
1891  {
1892  //
1893  class ScriptMethodCameraGetUpVector: public ScriptMethod {
1894  private:
1895  LogicMiniScript* miniScript { nullptr };
1896  public:
1897  ScriptMethodCameraGetUpVector(LogicMiniScript* miniScript):
1898  ScriptMethod({}, TYPE_VECTOR3),
1899  miniScript(miniScript) {}
1900  const string getMethodName() override {
1901  return "engine.camera.getUpVector";
1902  }
1903  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1904  miniScript->setValue(returnValue, miniScript->context->getEngine()->getCamera()->getUpVector());
1905  }
1906  const vector<string>& getContextFunctions() {
1907  return CONTEXTFUNCTIONS_ENGINE;
1908  }
1909  };
1910  registerMethod(new ScriptMethodCameraGetUpVector(this));
1911  }
1912  {
1913  //
1914  class ScriptMethodCameraSetUpVector: public ScriptMethod {
1915  private:
1916  LogicMiniScript* miniScript { nullptr };
1917  public:
1918  ScriptMethodCameraSetUpVector(LogicMiniScript* miniScript):
1919  ScriptMethod(
1920  {
1921  { .type = TYPE_VECTOR3, .name = "upVector", .optional = false, .reference = false, .nullable = false }
1922  },
1923  ScriptVariableType::TYPE_NULL
1924  ),
1925  miniScript(miniScript) {}
1926  const string getMethodName() override {
1927  return "engine.camera.setUpVector";
1928  }
1929  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1930  Vector3 upVector;
1931  if (miniScript->getVector3Value(argumentValues, 0, upVector) == true) {
1932  miniScript->context->getEngine()->getCamera()->setUpVector(upVector);
1933  } else {
1934  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1935  miniScript->startErrorScript();
1936  }
1937  }
1938  const vector<string>& getContextFunctions() {
1939  return CONTEXTFUNCTIONS_ENGINE;
1940  }
1941  };
1942  registerMethod(new ScriptMethodCameraSetUpVector(this));
1943  }
1944  {
1945  //
1946  class ScriptMethodCameraComputeUpVector: public ScriptMethod {
1947  private:
1948  LogicMiniScript* miniScript { nullptr };
1949  public:
1950  ScriptMethodCameraComputeUpVector(LogicMiniScript* miniScript):
1951  ScriptMethod(
1952  {
1953  { .type = TYPE_VECTOR3, .name = "lookFrom", .optional = false, .reference = false, .nullable = false },
1954  { .type = TYPE_VECTOR3, .name = "lookAt", .optional = false, .reference = false, .nullable = false }
1955  },
1956  TYPE_VECTOR3
1957  ),
1958  miniScript(miniScript) {}
1959  const string getMethodName() override {
1960  return "engine.camera.computeUpVector";
1961  }
1962  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1963  Vector3 lookFrom;
1964  Vector3 lookAt;
1965  if (miniScript->getVector3Value(argumentValues, 0, lookFrom) == true &&
1966  miniScript->getVector3Value(argumentValues, 1, lookAt) == true) {
1967  miniScript->setValue(returnValue, Camera::computeUpVector(lookFrom, lookAt));
1968  } else {
1969  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
1970  miniScript->startErrorScript();
1971  }
1972  }
1973  const vector<string>& getContextFunctions() {
1974  return CONTEXTFUNCTIONS_ENGINE;
1975  }
1976  };
1977  registerMethod(new ScriptMethodCameraComputeUpVector(this));
1978  }
1979  {
1980  //
1981  class ScriptMethodCameraGetFovX: public ScriptMethod {
1982  private:
1983  LogicMiniScript* miniScript { nullptr };
1984  public:
1985  ScriptMethodCameraGetFovX(LogicMiniScript* miniScript):
1986  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
1987  miniScript(miniScript) {}
1988  const string getMethodName() override {
1989  return "engine.camera.getFovX";
1990  }
1991  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
1992  returnValue = miniScript->context->getEngine()->getCamera()->getFovX();
1993  }
1994  const vector<string>& getContextFunctions() {
1995  return CONTEXTFUNCTIONS_ENGINE;
1996  }
1997  };
1998  registerMethod(new ScriptMethodCameraGetFovX(this));
1999  }
2000  {
2001  //
2002  class ScriptMethodCameraSetFovX: public ScriptMethod {
2003  private:
2004  LogicMiniScript* miniScript { nullptr };
2005  public:
2006  ScriptMethodCameraSetFovX(LogicMiniScript* miniScript):
2007  ScriptMethod(
2008  {
2009  { .type = ScriptVariableType::TYPE_FLOAT, .name = "fovX", .optional = false, .reference = false, .nullable = false }
2010  },
2011  ScriptVariableType::TYPE_NULL
2012  ),
2013  miniScript(miniScript) {}
2014  const string getMethodName() override {
2015  return "engine.camera.setFovX";
2016  }
2017  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2018  float fovX;
2019  if (miniScript->getFloatValue(argumentValues, 0, fovX) == true) {
2020  miniScript->context->getEngine()->getCamera()->setFovX(fovX);
2021  } else {
2022  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2023  miniScript->startErrorScript();
2024  }
2025  }
2026  const vector<string>& getContextFunctions() {
2027  return CONTEXTFUNCTIONS_ENGINE;
2028  }
2029  };
2030  registerMethod(new ScriptMethodCameraSetFovX(this));
2031  }
2032  // timing
2033  {
2034  //
2035  class ScriptMethodTimingGetDeltaTime: public ScriptMethod {
2036  private:
2037  LogicMiniScript* miniScript { nullptr };
2038  public:
2039  ScriptMethodTimingGetDeltaTime(LogicMiniScript* miniScript):
2040  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
2041  miniScript(miniScript) {}
2042  const string getMethodName() override {
2043  return "engine.timing.getDeltaTime";
2044  }
2045  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2046  returnValue = miniScript->context->getEngine()->getTiming()->getDeltaTime();
2047  }
2048  const vector<string>& getContextFunctions() {
2049  return CONTEXTFUNCTIONS_ENGINE;
2050  }
2051  };
2052  registerMethod(new ScriptMethodTimingGetDeltaTime(this));
2053  }
2054  {
2055  //
2056  class ScriptMethodTimingGetDeltaTimeSeconds: public ScriptMethod {
2057  private:
2058  LogicMiniScript* miniScript { nullptr };
2059  public:
2060  ScriptMethodTimingGetDeltaTimeSeconds(LogicMiniScript* miniScript):
2061  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
2062  miniScript(miniScript) {}
2063  const string getMethodName() override {
2064  return "engine.timing.getDeltaTimeSeconds";
2065  }
2066  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2067  returnValue = miniScript->context->getEngine()->getTiming()->getDeltaTimeSeconds();
2068  }
2069  const vector<string>& getContextFunctions() {
2070  return CONTEXTFUNCTIONS_ENGINE;
2071  }
2072  };
2073  registerMethod(new ScriptMethodTimingGetDeltaTimeSeconds(this));
2074  }
2075  {
2076  //
2077  class ScriptMethodTimingGetAvarageFPS: public ScriptMethod {
2078  private:
2079  LogicMiniScript* miniScript { nullptr };
2080  public:
2081  ScriptMethodTimingGetAvarageFPS(LogicMiniScript* miniScript):
2082  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
2083  miniScript(miniScript) {}
2084  const string getMethodName() override {
2085  return "engine.timing.getAvarageFPS";
2086  }
2087  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2088  returnValue = miniScript->context->getEngine()->getTiming()->getAvarageFPS();
2089  }
2090  const vector<string>& getContextFunctions() {
2091  return CONTEXTFUNCTIONS_ENGINE;
2092  }
2093  };
2094  registerMethod(new ScriptMethodTimingGetAvarageFPS(this));
2095  }
2096  // engine
2097  {
2098  //
2099  class ScriptMethodEngineGetAnimationComputationReduction1Distance: public ScriptMethod {
2100  private:
2101  LogicMiniScript* miniScript { nullptr };
2102  public:
2103  ScriptMethodEngineGetAnimationComputationReduction1Distance(LogicMiniScript* miniScript):
2104  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
2105  miniScript(miniScript) {}
2106  const string getMethodName() override {
2107  return "engine.getAnimationComputationReduction1Distance";
2108  }
2109  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2110  miniScript->setValue(returnValue, Engine::getAnimationComputationReduction1Distance());
2111  }
2112  const vector<string>& getContextFunctions() {
2113  return CONTEXTFUNCTIONS_ENGINE;
2114  }
2115  };
2116  registerMethod(new ScriptMethodEngineGetAnimationComputationReduction1Distance(this));
2117  }
2118  {
2119  //
2120  class ScriptMethodEngineSetAnimationComputationReduction1Distance: public ScriptMethod {
2121  private:
2122  LogicMiniScript* miniScript { nullptr };
2123  public:
2124  ScriptMethodEngineSetAnimationComputationReduction1Distance(LogicMiniScript* miniScript):
2125  ScriptMethod(
2126  {
2127  { .type = ScriptVariableType::TYPE_FLOAT, .name = "animationComputationReduction1Distance", .optional = false, .reference = false, .nullable = false }
2128  },
2129  ScriptVariableType::TYPE_NULL
2130  ),
2131  miniScript(miniScript) {}
2132  const string getMethodName() override {
2133  return "engine.setAnimationComputationReduction1Distance";
2134  }
2135  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2136  float animationComputationReduction1Distance;
2137  if (miniScript->getFloatValue(argumentValues, 0, animationComputationReduction1Distance) == true) {
2138  Engine::setAnimationComputationReduction1Distance(animationComputationReduction1Distance);
2139  } else {
2140  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2141  miniScript->startErrorScript();
2142  }
2143 
2144  }
2145  const vector<string>& getContextFunctions() {
2146  return CONTEXTFUNCTIONS_ENGINE;
2147  }
2148  };
2149  registerMethod(new ScriptMethodEngineSetAnimationComputationReduction1Distance(this));
2150  }
2151  {
2152  //
2153  class ScriptMethodEngineGetAnimationComputationReduction2Distance: public ScriptMethod {
2154  private:
2155  LogicMiniScript* miniScript { nullptr };
2156  public:
2157  ScriptMethodEngineGetAnimationComputationReduction2Distance(LogicMiniScript* miniScript):
2158  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
2159  miniScript(miniScript) {}
2160  const string getMethodName() override {
2161  return "engine.getAnimationComputationReduction2Distance";
2162  }
2163  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2164  miniScript->setValue(returnValue, Engine::getAnimationComputationReduction2Distance());
2165  }
2166  const vector<string>& getContextFunctions() {
2167  return CONTEXTFUNCTIONS_ENGINE;
2168  }
2169  };
2170  registerMethod(new ScriptMethodEngineGetAnimationComputationReduction2Distance(this));
2171  }
2172  {
2173  //
2174  class ScriptMethodEngineSetAnimationComputationReduction2Distance: public ScriptMethod {
2175  private:
2176  LogicMiniScript* miniScript { nullptr };
2177  public:
2178  ScriptMethodEngineSetAnimationComputationReduction2Distance(LogicMiniScript* miniScript):
2179  ScriptMethod(
2180  {
2181  { .type = ScriptVariableType::TYPE_FLOAT, .name = "animationComputationReduction2Distance", .optional = false, .reference = false, .nullable = false }
2182  },
2183  ScriptVariableType::TYPE_NULL
2184  ),
2185  miniScript(miniScript) {}
2186  const string getMethodName() override {
2187  return "engine.setAnimationComputationReduction2Distance";
2188  }
2189  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2190  float animationComputationReduction2Distance;
2191  if (miniScript->getFloatValue(argumentValues, 0, animationComputationReduction2Distance) == true) {
2192  Engine::setAnimationComputationReduction2Distance(animationComputationReduction2Distance);
2193  } else {
2194  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2195  miniScript->startErrorScript();
2196  }
2197 
2198  }
2199  const vector<string>& getContextFunctions() {
2200  return CONTEXTFUNCTIONS_ENGINE;
2201  }
2202  };
2203  registerMethod(new ScriptMethodEngineSetAnimationComputationReduction2Distance(this));
2204  }
2205  {
2206  //
2207  class ScriptMethodEngineGetWidth: public ScriptMethod {
2208  private:
2209  LogicMiniScript* miniScript { nullptr };
2210  public:
2211  ScriptMethodEngineGetWidth(LogicMiniScript* miniScript):
2212  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
2213  miniScript(miniScript) {}
2214  const string getMethodName() override {
2215  return "engine.getWidth";
2216  }
2217  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2218  returnValue = static_cast<int64_t>(miniScript->context->getEngine()->getWidth());
2219  }
2220  const vector<string>& getContextFunctions() {
2221  return CONTEXTFUNCTIONS_ENGINE;
2222  }
2223  };
2224  registerMethod(new ScriptMethodEngineGetWidth(this));
2225  }
2226  {
2227  //
2228  class ScriptMethodEngineGetHeight: public ScriptMethod {
2229  private:
2230  LogicMiniScript* miniScript { nullptr };
2231  public:
2232  ScriptMethodEngineGetHeight(LogicMiniScript* miniScript):
2233  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
2234  miniScript(miniScript) {}
2235  const string getMethodName() override {
2236  return "engine.getHeight";
2237  }
2238  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2239  returnValue = static_cast<int64_t>(miniScript->context->getEngine()->getHeight());
2240  }
2241  const vector<string>& getContextFunctions() {
2242  return CONTEXTFUNCTIONS_ENGINE;
2243  }
2244  };
2245  registerMethod(new ScriptMethodEngineGetHeight(this));
2246  }
2247  {
2248  //
2249  class ScriptMethodEngineDumpEntities: public ScriptMethod {
2250  private:
2251  LogicMiniScript* miniScript { nullptr };
2252  public:
2253  ScriptMethodEngineDumpEntities(LogicMiniScript* miniScript):
2254  ScriptMethod({}, ScriptVariableType::TYPE_NULL),
2255  miniScript(miniScript) {}
2256  const string getMethodName() override {
2257  return "engine.dumpEntities";
2258  }
2259  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2260  miniScript->context->getEngine()->dumpEntities();
2261  }
2262  const vector<string>& getContextFunctions() {
2263  return CONTEXTFUNCTIONS_ENGINE;
2264  }
2265  };
2266  registerMethod(new ScriptMethodEngineDumpEntities(this));
2267  }
2268  {
2269  //
2270  class ScriptMethodEngineDumpShaders: public ScriptMethod {
2271  private:
2272  LogicMiniScript* miniScript { nullptr };
2273  public:
2274  ScriptMethodEngineDumpShaders(LogicMiniScript* miniScript):
2275  ScriptMethod({}, ScriptVariableType::TYPE_NULL),
2276  miniScript(miniScript) {}
2277  const string getMethodName() override {
2278  return "engine.dumpShaders";
2279  }
2280  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2281  miniScript->context->getEngine()->dumpShaders();
2282  }
2283  const vector<string>& getContextFunctions() {
2284  return CONTEXTFUNCTIONS_ENGINE;
2285  }
2286  };
2287  registerMethod(new ScriptMethodEngineDumpShaders(this));
2288  }
2289  {
2290  //
2291  class ScriptMethodEngineGetEntityIdByMousePosition: public ScriptMethod {
2292  private:
2293  LogicMiniScript* miniScript { nullptr };
2294  public:
2295  ScriptMethodEngineGetEntityIdByMousePosition(LogicMiniScript* miniScript):
2296  ScriptMethod(
2297  {
2298  { .type = ScriptVariableType::TYPE_INTEGER, .name = "mouseX", .optional = false, .reference = false, .nullable = false },
2299  { .type = ScriptVariableType::TYPE_INTEGER, .name = "mouseY", .optional = false, .reference = false, .nullable = false }
2300  },
2301  ScriptVariableType::TYPE_STRING
2302  ),
2303  miniScript(miniScript) {}
2304  const string getMethodName() override {
2305  return "engine.getEntityIdByMousePosition";
2306  }
2307  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2308  int64_t mouseX;
2309  int64_t mouseY;
2310  if (miniScript->getIntegerValue(argumentValues, 0, mouseX) == true &&
2311  miniScript->getIntegerValue(argumentValues, 1, mouseY) == true) {
2312  auto entity = miniScript->context->getEngine()->getEntityByMousePosition(mouseX, mouseY);
2313  if (entity != nullptr) returnValue = entity->getId();
2314  } else {
2315  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2316  miniScript->startErrorScript();
2317  }
2318  }
2319  const vector<string>& getContextFunctions() {
2320  return CONTEXTFUNCTIONS_ENGINE;
2321  }
2322  };
2323  registerMethod(new ScriptMethodEngineGetEntityIdByMousePosition(this));
2324  }
2325  {
2326  //
2327  class ScriptMethodEngineComputeWorldCoordinateByMousePosition: public ScriptMethod {
2328  private:
2329  LogicMiniScript* miniScript { nullptr };
2330  public:
2331  ScriptMethodEngineComputeWorldCoordinateByMousePosition(LogicMiniScript* miniScript):
2332  ScriptMethod(
2333  {
2334  { .type = ScriptVariableType::TYPE_INTEGER, .name = "mouseX", .optional = false, .reference = false, .nullable = false },
2335  { .type = ScriptVariableType::TYPE_INTEGER, .name = "mouseY", .optional = false, .reference = false, .nullable = false }
2336  },
2337  TYPE_VECTOR3
2338  ),
2339  miniScript(miniScript) {}
2340  const string getMethodName() override {
2341  return "engine.computeWorldCoordinateByMousePosition";
2342  }
2343  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2344  int64_t mouseX;
2345  int64_t mouseY;
2346  if (miniScript->getIntegerValue(argumentValues, 0, mouseX) == true &&
2347  miniScript->getIntegerValue(argumentValues, 1, mouseY) == true) {
2348  miniScript->setValue(returnValue, miniScript->context->getEngine()->computeWorldCoordinateByMousePosition(mouseX, mouseY));
2349  } else {
2350  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2351  miniScript->startErrorScript();
2352  }
2353  }
2354  const vector<string>& getContextFunctions() {
2355  return CONTEXTFUNCTIONS_ENGINE;
2356  }
2357  };
2358  registerMethod(new ScriptMethodEngineComputeWorldCoordinateByMousePosition(this));
2359  }
2360  {
2361  //
2362  class ScriptMethodEngineComputeScreenCoordinateByWorldCoordinate: public ScriptMethod {
2363  private:
2364  LogicMiniScript* miniScript { nullptr };
2365  public:
2366  ScriptMethodEngineComputeScreenCoordinateByWorldCoordinate(LogicMiniScript* miniScript):
2367  ScriptMethod(
2368  {
2369  { .type = TYPE_VECTOR3, .name = "worldCoodinate", .optional = false, .reference = false, .nullable = false },
2370  { .type = TYPE_VECTOR2, .name = "screenCoordinate", .optional = false, .reference = true, .nullable = false }
2371  },
2372  ScriptVariableType::TYPE_BOOLEAN
2373  ),
2374  miniScript(miniScript) {}
2375  const string getMethodName() override {
2376  return "engine.computeScreenCoordinateByWorldCoordinate";
2377  }
2378  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2379  Vector3 worldCoodinate;
2380  if (argumentValues.size() == 2 &&
2381  miniScript->getVector3Value(argumentValues, 0, worldCoodinate) == true) {
2382  Vector2 screenCoordinate;
2383  if (miniScript->context->getEngine()->computeScreenCoordinateByWorldCoordinate(worldCoodinate, screenCoordinate) == true) {
2384  miniScript->setValue(argumentValues[1], screenCoordinate);
2385  returnValue = true;
2386  } else {
2387  returnValue = false;
2388  }
2389  } else {
2390  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2391  miniScript->startErrorScript();
2392  }
2393  }
2394  const vector<string>& getContextFunctions() {
2395  return CONTEXTFUNCTIONS_ENGINE;
2396  }
2397  };
2398  registerMethod(new ScriptMethodEngineComputeScreenCoordinateByWorldCoordinate(this));
2399  }
2400  {
2401  //
2402  class ScriptMethodEntityGetTransform: public ScriptMethod {
2403  private:
2404  LogicMiniScript* miniScript { nullptr };
2405  public:
2406  ScriptMethodEntityGetTransform(LogicMiniScript* miniScript):
2407  ScriptMethod(
2408  {
2409  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2410  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false }
2411  },
2413  ),
2414  miniScript(miniScript) {}
2415  const string getMethodName() override {
2416  return "engine.entity.getTransform";
2417  }
2418  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2419  string entityId;
2420  string childEntityId;
2421  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2422  miniScript->getStringValue(argumentValues, 1, childEntityId, true) == true) {
2423  auto entity = miniScript->getEntity(entityId, childEntityId);
2424  if (entity != nullptr) {
2425  miniScript->setValue(returnValue, entity->getTransform());
2426  } else {
2427  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2428  }
2429  } else {
2430  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2431  miniScript->startErrorScript();
2432  }
2433  }
2434  const vector<string>& getContextFunctions() {
2435  return CONTEXTFUNCTIONS_ENGINE;
2436  }
2437  };
2438  registerMethod(new ScriptMethodEntityGetTransform(this));
2439  }
2440  {
2441  //
2442  class ScriptMethodEntitySetTransform: public ScriptMethod {
2443  private:
2444  LogicMiniScript* miniScript { nullptr };
2445  public:
2446  ScriptMethodEntitySetTransform(LogicMiniScript* miniScript):
2447  ScriptMethod(
2448  {
2449  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2450  { .type = TYPE_TRANSFORM, .name = "transform", .optional = false, .reference = false, .nullable = false },
2451  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false }
2452  },
2453  ScriptVariableType::TYPE_NULL
2454  ),
2455  miniScript(miniScript) {}
2456  const string getMethodName() override {
2457  return "engine.entity.setTransform";
2458  }
2459  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2460  string entityId;
2461  Transform transform;
2462  string childEntityId;
2463  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2464  miniScript->getTransformValue(argumentValues, 1, transform) == true &&
2465  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
2466  auto entity = miniScript->getEntity(entityId, childEntityId);
2467  if (entity != nullptr) {
2468  entity->setTransform(transform);
2469  } else {
2470  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2471  }
2472  } else {
2473  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2474  miniScript->startErrorScript();
2475  }
2476  }
2477  const vector<string>& getContextFunctions() {
2478  return CONTEXTFUNCTIONS_ENGINE;
2479  }
2480  };
2481  registerMethod(new ScriptMethodEntitySetTransform(this));
2482  }
2483  {
2484  //
2485  class ScriptMethodEntityIsEnabled: public ScriptMethod {
2486  private:
2487  LogicMiniScript* miniScript { nullptr };
2488  public:
2489  ScriptMethodEntityIsEnabled(LogicMiniScript* miniScript):
2490  ScriptMethod(
2491  {
2492  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2493  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false }
2494  },
2495  ScriptVariableType::TYPE_BOOLEAN
2496  ),
2497  miniScript(miniScript) {}
2498  const string getMethodName() override {
2499  return "engine.entity.isEnabled";
2500  }
2501  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2502  string entityId;
2503  string childEntityId;
2504  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2505  miniScript->getStringValue(argumentValues, 1, childEntityId, true) == true) {
2506  auto entity = miniScript->getEntity(entityId, childEntityId);
2507  if (entity != nullptr) {
2508  returnValue = entity->isEnabled();
2509  } else {
2510  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2511  }
2512  } else {
2513  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2514  miniScript->startErrorScript();
2515  }
2516  }
2517  const vector<string>& getContextFunctions() {
2518  return CONTEXTFUNCTIONS_ENGINE;
2519  }
2520  };
2521  registerMethod(new ScriptMethodEntityIsEnabled(this));
2522  }
2523  {
2524  //
2525  class ScriptMethodEntitySetEnabled: public ScriptMethod {
2526  private:
2527  LogicMiniScript* miniScript { nullptr };
2528  public:
2529  ScriptMethodEntitySetEnabled(LogicMiniScript* miniScript):
2530  ScriptMethod(
2531  {
2532  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2533  { .type = ScriptVariableType::TYPE_BOOLEAN, .name = "enabled", .optional = false, .reference = false, .nullable = false },
2534  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false }
2535  },
2536  ScriptVariableType::TYPE_NULL
2537  ),
2538  miniScript(miniScript) {}
2539  const string getMethodName() override {
2540  return "engine.entity.setEnabled";
2541  }
2542  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2543  string entityId;
2544  bool enabled;
2545  string childEntityId;
2546  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2547  miniScript->getBooleanValue(argumentValues, 1, enabled) == true &&
2548  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
2549  auto entity = miniScript->getEntity(entityId, childEntityId);
2550  if (entity != nullptr) {
2551  entity->setEnabled(enabled);
2552  } else {
2553  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2554  }
2555  } else {
2556  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2557  miniScript->startErrorScript();
2558  }
2559  }
2560  const vector<string>& getContextFunctions() {
2561  return CONTEXTFUNCTIONS_ENGINE;
2562  }
2563  };
2564  registerMethod(new ScriptMethodEntitySetEnabled(this));
2565  }
2566  {
2567  //
2568  class ScriptMethodEntityIsPickable: public ScriptMethod {
2569  private:
2570  LogicMiniScript* miniScript { nullptr };
2571  public:
2572  ScriptMethodEntityIsPickable(LogicMiniScript* miniScript):
2573  ScriptMethod(
2574  {
2575  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2576  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false }
2577  },
2578  ScriptVariableType::TYPE_BOOLEAN
2579  ),
2580  miniScript(miniScript) {}
2581  const string getMethodName() override {
2582  return "engine.entity.isPickable";
2583  }
2584  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2585  string entityId;
2586  string childEntityId;
2587  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2588  miniScript->getStringValue(argumentValues, 1, childEntityId, true) == true) {
2589  auto entity = miniScript->getEntity(entityId, childEntityId);
2590  if (entity != nullptr) {
2591  returnValue = entity->isPickable();
2592  } else {
2593  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2594  }
2595  } else {
2596  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2597  miniScript->startErrorScript();
2598  }
2599  }
2600  const vector<string>& getContextFunctions() {
2601  return CONTEXTFUNCTIONS_ENGINE;
2602  }
2603  };
2604  registerMethod(new ScriptMethodEntityIsPickable(this));
2605  }
2606  {
2607  //
2608  class ScriptMethodEntitySetPickable: public ScriptMethod {
2609  private:
2610  LogicMiniScript* miniScript { nullptr };
2611  public:
2612  ScriptMethodEntitySetPickable(LogicMiniScript* miniScript):
2613  ScriptMethod(
2614  {
2615  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2616  { .type = ScriptVariableType::TYPE_BOOLEAN, .name = "pickable", .optional = false, .reference = false, .nullable = false },
2617  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false }
2618  },
2619  ScriptVariableType::TYPE_NULL
2620  ),
2621  miniScript(miniScript) {}
2622  const string getMethodName() override {
2623  return "engine.entity.setPickable";
2624  }
2625  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2626  string entityId;
2627  bool pickable;
2628  string childEntityId;
2629  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2630  miniScript->getBooleanValue(argumentValues, 1, pickable) == true &&
2631  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
2632  auto entity = miniScript->getEntity(entityId, childEntityId);
2633  if (entity != nullptr) {
2634  entity->setPickable(pickable);
2635  } else {
2636  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2637  }
2638  } else {
2639  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2640  miniScript->startErrorScript();
2641  }
2642  }
2643  const vector<string>& getContextFunctions() {
2644  return CONTEXTFUNCTIONS_ENGINE;
2645  }
2646  };
2647  registerMethod(new ScriptMethodEntitySetPickable(this));
2648  }
2649  {
2650  //
2651  class ScriptMethodEntityGetEffectColorMul: public ScriptMethod {
2652  private:
2653  LogicMiniScript* miniScript { nullptr };
2654  public:
2655  ScriptMethodEntityGetEffectColorMul(LogicMiniScript* miniScript):
2656  ScriptMethod(
2657  {
2658  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2659  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false }
2660  },
2661  TYPE_VECTOR4
2662  ),
2663  miniScript(miniScript) {}
2664  const string getMethodName() override {
2665  return "engine.entity.getEffectColorMul";
2666  }
2667  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2668  string entityId;
2669  string childEntityId;
2670  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2671  miniScript->getStringValue(argumentValues, 1, childEntityId, true) == true) {
2672  auto entity = miniScript->getEntity(entityId, childEntityId);
2673  if (entity != nullptr) {
2674  auto effectColorMul = entity->getEffectColorMul();
2675  miniScript->setValue(returnValue, Vector4(effectColorMul.getRed(), effectColorMul.getGreen(), effectColorMul.getBlue(), effectColorMul.getAlpha()));
2676  } else {
2677  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2678  }
2679  } else {
2680  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2681  miniScript->startErrorScript();
2682  }
2683  }
2684  const vector<string>& getContextFunctions() {
2685  return CONTEXTFUNCTIONS_ENGINE;
2686  }
2687  };
2688  registerMethod(new ScriptMethodEntityGetEffectColorMul(this));
2689  }
2690  {
2691  //
2692  class ScriptMethodEntitySetEffectColorMul: public ScriptMethod {
2693  private:
2694  LogicMiniScript* miniScript { nullptr };
2695  public:
2696  ScriptMethodEntitySetEffectColorMul(LogicMiniScript* miniScript):
2697  ScriptMethod(
2698  {
2699  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2700  { .type = TYPE_VECTOR4, .name = "effectColorMul", .optional = false, .reference = false, .nullable = false },
2701  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false }
2702  },
2703  ScriptVariableType::TYPE_NULL
2704  ),
2705  miniScript(miniScript) {}
2706  const string getMethodName() override {
2707  return "engine.entity.setEffectColorMul";
2708  }
2709  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2710  string entityId;
2711  Vector4 effectColorMul;
2712  string childEntityId;
2713  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2714  miniScript->getVector4Value(argumentValues, 1, effectColorMul) == true &&
2715  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
2716  auto entity = miniScript->getEntity(entityId, childEntityId);
2717  if (entity != nullptr) {
2718  entity->setEffectColorMul(Color4(effectColorMul.getX(), effectColorMul.getY(), effectColorMul.getZ(), effectColorMul.getW()));
2719  } else {
2720  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2721  }
2722  } else {
2723  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2724  miniScript->startErrorScript();
2725  }
2726  }
2727  const vector<string>& getContextFunctions() {
2728  return CONTEXTFUNCTIONS_ENGINE;
2729  }
2730  };
2731  registerMethod(new ScriptMethodEntitySetEffectColorMul(this));
2732  }
2733  {
2734  //
2735  class ScriptMethodEntityGetEffectColorAdd: public ScriptMethod {
2736  private:
2737  LogicMiniScript* miniScript { nullptr };
2738  public:
2739  ScriptMethodEntityGetEffectColorAdd(LogicMiniScript* miniScript):
2740  ScriptMethod(
2741  {
2742  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2743  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false }
2744  },
2745  TYPE_VECTOR4
2746  ),
2747  miniScript(miniScript) {}
2748  const string getMethodName() override {
2749  return "engine.entity.getEffectColorAdd";
2750  }
2751  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2752  string entityId;
2753  string childEntityId;
2754  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2755  miniScript->getStringValue(argumentValues, 1, childEntityId, true) == true) {
2756  auto entity = miniScript->getEntity(entityId, childEntityId);
2757  if (entity != nullptr) {
2758  auto effectColorAdd = entity->getEffectColorAdd();
2759  miniScript->setValue(returnValue, Vector4(effectColorAdd.getRed(), effectColorAdd.getGreen(), effectColorAdd.getBlue(), effectColorAdd.getAlpha()));
2760  } else {
2761  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2762  }
2763  } else {
2764  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2765  miniScript->startErrorScript();
2766  }
2767  }
2768  const vector<string>& getContextFunctions() {
2769  return CONTEXTFUNCTIONS_ENGINE;
2770  }
2771  };
2772  registerMethod(new ScriptMethodEntityGetEffectColorAdd(this));
2773  }
2774  {
2775  //
2776  class ScriptMethodEntitySetEffectColorAdd: public ScriptMethod {
2777  private:
2778  LogicMiniScript* miniScript { nullptr };
2779  public:
2780  ScriptMethodEntitySetEffectColorAdd(LogicMiniScript* miniScript):
2781  ScriptMethod(
2782  {
2783  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2784  { .type = TYPE_VECTOR4, .name = "effectColorAdd", .optional = false, .reference = false, .nullable = false },
2785  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false }
2786  },
2787  ScriptVariableType::TYPE_NULL
2788  ),
2789  miniScript(miniScript) {}
2790  const string getMethodName() override {
2791  return "engine.entity.setEffectColorAdd";
2792  }
2793  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2794  string entityId;
2795  Vector4 effectColorAdd;
2796  string childEntityId;
2797  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2798  miniScript->getVector4Value(argumentValues, 1, effectColorAdd) == true &&
2799  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
2800  auto entity = miniScript->getEntity(entityId, childEntityId);
2801  if (entity != nullptr) {
2802  entity->setEffectColorAdd(Color4(effectColorAdd.getX(), effectColorAdd.getY(), effectColorAdd.getZ(), effectColorAdd.getW()));
2803  } else {
2804  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2805  }
2806  } else {
2807  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2808  miniScript->startErrorScript();
2809  }
2810  }
2811  const vector<string>& getContextFunctions() {
2812  return CONTEXTFUNCTIONS_ENGINE;
2813  }
2814  };
2815  registerMethod(new ScriptMethodEntitySetEffectColorAdd(this));
2816  }
2817  {
2818  //
2819  class ScriptMethodEntityGetAnimation: public ScriptMethod {
2820  private:
2821  LogicMiniScript* miniScript { nullptr };
2822  public:
2823  ScriptMethodEntityGetAnimation(LogicMiniScript* miniScript):
2824  ScriptMethod(
2825  {
2826  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2827  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false }
2828  },
2829  ScriptVariableType::TYPE_STRING
2830  ),
2831  miniScript(miniScript) {}
2832  const string getMethodName() override {
2833  return "engine.entity.getAnimation";
2834  }
2835  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2836  string entityId;
2837  string childEntityId;
2838  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2839  miniScript->getStringValue(argumentValues, 1, childEntityId, true) == true) {
2840  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
2841  if (object != nullptr) {
2842  miniScript->setValue(returnValue, object->getAnimation());
2843  } else {
2844  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2845  }
2846  } else {
2847  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2848  miniScript->startErrorScript();
2849  }
2850  }
2851  const vector<string>& getContextFunctions() {
2852  return CONTEXTFUNCTIONS_ENGINE;
2853  }
2854  };
2855  registerMethod(new ScriptMethodEntityGetAnimation(this));
2856  }
2857  {
2858  //
2859  class ScriptMethodEntitySetAnimation: public ScriptMethod {
2860  private:
2861  LogicMiniScript* miniScript { nullptr };
2862  public:
2863  ScriptMethodEntitySetAnimation(LogicMiniScript* miniScript):
2864  ScriptMethod(
2865  {
2866  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2867  { .type = ScriptVariableType::TYPE_STRING, .name = "animation", .optional = false, .reference = false, .nullable = false },
2868  { .type = ScriptVariableType::TYPE_FLOAT, .name = "speed", .optional = true, .reference = false, .nullable = false },
2869  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
2870  },
2871  ScriptVariableType::TYPE_NULL
2872  ),
2873  miniScript(miniScript) {}
2874  const string getMethodName() override {
2875  return "engine.entity.setAnimation";
2876  }
2877  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2878  string entityId;
2879  string animation;
2880  float speed = 1.0f;
2881  string childEntityId;
2882  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2883  miniScript->getStringValue(argumentValues, 1, animation) == true &&
2884  miniScript->getFloatValue(argumentValues, 2, speed, true) == true &&
2885  miniScript->getStringValue(argumentValues, 3, childEntityId, true) == true) {
2886  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
2887  if (object != nullptr) {
2888  object->setAnimation(animation, speed);
2889  } else {
2890  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2891  }
2892  } else {
2893  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2894  miniScript->startErrorScript();
2895  }
2896  }
2897  const vector<string>& getContextFunctions() {
2898  return CONTEXTFUNCTIONS_ENGINE;
2899  }
2900  };
2901  registerMethod(new ScriptMethodEntitySetAnimation(this));
2902  }
2903  {
2904  //
2905  class ScriptMethodEntitySetAnimationSpeed: public ScriptMethod {
2906  private:
2907  LogicMiniScript* miniScript { nullptr };
2908  public:
2909  ScriptMethodEntitySetAnimationSpeed(LogicMiniScript* miniScript):
2910  ScriptMethod(
2911  {
2912  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2913  { .type = ScriptVariableType::TYPE_FLOAT, .name = "speed", .optional = false, .reference = false, .nullable = false },
2914  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
2915  },
2916  ScriptVariableType::TYPE_NULL
2917  ),
2918  miniScript(miniScript) {}
2919  const string getMethodName() override {
2920  return "engine.entity.setAnimationSpeed";
2921  }
2922  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2923  string entityId;
2924  float speed;
2925  string childEntityId;
2926  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2927  miniScript->getFloatValue(argumentValues, 1, speed) == true &&
2928  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
2929  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
2930  if (object != nullptr) {
2931  object->setAnimationSpeed(speed);
2932  } else {
2933  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2934  }
2935  } else {
2936  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2937  miniScript->startErrorScript();
2938  }
2939  }
2940  const vector<string>& getContextFunctions() {
2941  return CONTEXTFUNCTIONS_ENGINE;
2942  }
2943  };
2944  registerMethod(new ScriptMethodEntitySetAnimationSpeed(this));
2945  }
2946  {
2947  //
2948  class ScriptMethodEntityGetAnimationTime: public ScriptMethod {
2949  private:
2950  LogicMiniScript* miniScript { nullptr };
2951  public:
2952  ScriptMethodEntityGetAnimationTime(LogicMiniScript* miniScript):
2953  ScriptMethod(
2954  {
2955  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2956  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
2957  },
2958  ScriptVariableType::TYPE_FLOAT
2959  ),
2960  miniScript(miniScript) {}
2961  const string getMethodName() override {
2962  return "engine.entity.getAnimationTime";
2963  }
2964  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
2965  string entityId;
2966  string childEntityId;
2967  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
2968  miniScript->getStringValue(argumentValues, 1, childEntityId, true) == true) {
2969  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
2970  if (object != nullptr) {
2971  miniScript->setValue(returnValue, object->getAnimationTime());
2972  } else {
2973  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
2974  }
2975  } else {
2976  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
2977  miniScript->startErrorScript();
2978  }
2979  }
2980  const vector<string>& getContextFunctions() {
2981  return CONTEXTFUNCTIONS_ENGINE;
2982  }
2983  };
2984  registerMethod(new ScriptMethodEntityGetAnimationTime(this));
2985  }
2986  {
2987  //
2988  class ScriptMethodEntityHasOverlayAnimation: public ScriptMethod {
2989  private:
2990  LogicMiniScript* miniScript { nullptr };
2991  public:
2992  ScriptMethodEntityHasOverlayAnimation(LogicMiniScript* miniScript):
2993  ScriptMethod(
2994  {
2995  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
2996  { .type = ScriptVariableType::TYPE_STRING, .name = "animation", .optional = false, .reference = false, .nullable = false },
2997  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
2998  },
2999  ScriptVariableType::TYPE_BOOLEAN
3000  ),
3001  miniScript(miniScript) {}
3002  const string getMethodName() override {
3003  return "engine.entity.hasOverlayAnimation";
3004  }
3005  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3006  string entityId;
3007  string animation;
3008  string childEntityId;
3009  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3010  miniScript->getStringValue(argumentValues, 1, animation) == true &&
3011  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
3012  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3013  if (object != nullptr) {
3014  returnValue = object->hasOverlayAnimation(animation);
3015  } else {
3016  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3017  }
3018  } else {
3019  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3020  miniScript->startErrorScript();
3021  }
3022  }
3023  const vector<string>& getContextFunctions() {
3024  return CONTEXTFUNCTIONS_ENGINE;
3025  }
3026  };
3027  registerMethod(new ScriptMethodEntityHasOverlayAnimation(this));
3028  }
3029  {
3030  //
3031  class ScriptMethodEntityAddOverlayAnimation: public ScriptMethod {
3032  private:
3033  LogicMiniScript* miniScript { nullptr };
3034  public:
3035  ScriptMethodEntityAddOverlayAnimation(LogicMiniScript* miniScript):
3036  ScriptMethod(
3037  {
3038  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3039  { .type = ScriptVariableType::TYPE_STRING, .name = "animation", .optional = false, .reference = false, .nullable = false },
3040  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3041  },
3042  ScriptVariableType::TYPE_NULL
3043  ),
3044  miniScript(miniScript) {}
3045  const string getMethodName() override {
3046  return "engine.entity.addOverlayAnimation";
3047  }
3048  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3049  string entityId;
3050  string animation;
3051  string childEntityId;
3052  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3053  miniScript->getStringValue(argumentValues, 1, animation) == true &&
3054  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
3055  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3056  if (object != nullptr) {
3057  object->addOverlayAnimation(animation);
3058  } else {
3059  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3060  }
3061  } else {
3062  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3063  miniScript->startErrorScript();
3064  }
3065  }
3066  const vector<string>& getContextFunctions() {
3067  return CONTEXTFUNCTIONS_ENGINE;
3068  }
3069  };
3070  registerMethod(new ScriptMethodEntityAddOverlayAnimation(this));
3071  }
3072  {
3073  //
3074  class ScriptMethodEntityRemoveOverlayAnimation: public ScriptMethod {
3075  private:
3076  LogicMiniScript* miniScript { nullptr };
3077  public:
3078  ScriptMethodEntityRemoveOverlayAnimation(LogicMiniScript* miniScript):
3079  ScriptMethod(
3080  {
3081  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3082  { .type = ScriptVariableType::TYPE_STRING, .name = "animation", .optional = false, .reference = false, .nullable = false },
3083  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3084  },
3085  ScriptVariableType::TYPE_NULL
3086  ),
3087  miniScript(miniScript) {}
3088  const string getMethodName() override {
3089  return "engine.entity.removeOverlayAnimation";
3090  }
3091  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3092  string entityId;
3093  string animation;
3094  string childEntityId;
3095  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3096  miniScript->getStringValue(argumentValues, 1, animation) == true &&
3097  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
3098  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3099  if (object != nullptr) {
3100  object->removeOverlayAnimation(animation);
3101  } else {
3102  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3103  }
3104  } else {
3105  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3106  miniScript->startErrorScript();
3107  }
3108  }
3109  const vector<string>& getContextFunctions() {
3110  return CONTEXTFUNCTIONS_ENGINE;
3111  }
3112  };
3113  registerMethod(new ScriptMethodEntityRemoveOverlayAnimation(this));
3114  }
3115  {
3116  //
3117  class ScriptMethodEntityRemoveFinishedOverlayAnimations: public ScriptMethod {
3118  private:
3119  LogicMiniScript* miniScript { nullptr };
3120  public:
3121  ScriptMethodEntityRemoveFinishedOverlayAnimations(LogicMiniScript* miniScript):
3122  ScriptMethod(
3123  {
3124  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3125  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3126  },
3127  ScriptVariableType::TYPE_NULL
3128  ),
3129  miniScript(miniScript) {}
3130  const string getMethodName() override {
3131  return "engine.entity.removeFinishedOverlayAnimations";
3132  }
3133  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3134  string entityId;
3135  string childEntityId;
3136  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3137  miniScript->getStringValue(argumentValues, 1, childEntityId, true) == true) {
3138  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3139  if (object != nullptr) {
3141  } else {
3142  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3143  }
3144  } else {
3145  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3146  miniScript->startErrorScript();
3147  }
3148  }
3149  const vector<string>& getContextFunctions() {
3150  return CONTEXTFUNCTIONS_ENGINE;
3151  }
3152  };
3153  registerMethod(new ScriptMethodEntityRemoveFinishedOverlayAnimations(this));
3154  }
3155  {
3156  //
3157  class ScriptMethodEntityRemoveOverlayAnimations: public ScriptMethod {
3158  private:
3159  LogicMiniScript* miniScript { nullptr };
3160  public:
3161  ScriptMethodEntityRemoveOverlayAnimations(LogicMiniScript* miniScript):
3162  ScriptMethod(
3163  {
3164  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3165  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3166  },
3167  ScriptVariableType::TYPE_NULL
3168  ),
3169  miniScript(miniScript) {}
3170  const string getMethodName() override {
3171  return "engine.entity.removeOverlayAnimations";
3172  }
3173  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3174  string entityId;
3175  string childEntityId;
3176  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3177  miniScript->getStringValue(argumentValues, 1, childEntityId, true) == true) {
3178  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3179  if (object != nullptr) {
3180  object->removeOverlayAnimations();
3181  } else {
3182  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3183  }
3184  } else {
3185  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3186  miniScript->startErrorScript();
3187  }
3188  }
3189  const vector<string>& getContextFunctions() {
3190  return CONTEXTFUNCTIONS_ENGINE;
3191  }
3192  };
3193  registerMethod(new ScriptMethodEntityRemoveOverlayAnimations(this));
3194  }
3195  {
3196  //
3197  class ScriptMethodEntityGetOverlayAnimationTime: public ScriptMethod {
3198  private:
3199  LogicMiniScript* miniScript { nullptr };
3200  public:
3201  ScriptMethodEntityGetOverlayAnimationTime(LogicMiniScript* miniScript):
3202  ScriptMethod(
3203  {
3204  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3205  { .type = ScriptVariableType::TYPE_STRING, .name = "animation", .optional = false, .reference = false, .nullable = false },
3206  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3207  },
3208  ScriptVariableType::TYPE_FLOAT
3209  ),
3210  miniScript(miniScript) {}
3211  const string getMethodName() override {
3212  return "engine.entity.getOverlayAnimationTime";
3213  }
3214  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3215  string entityId;
3216  string animation;
3217  string childEntityId;
3218  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3219  miniScript->getStringValue(argumentValues, 1, animation) == true &&
3220  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
3221  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3222  if (object != nullptr) {
3223  miniScript->setValue(returnValue, object->getOverlayAnimationTime(animation));
3224  } else {
3225  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3226  }
3227  } else {
3228  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3229  miniScript->startErrorScript();
3230  }
3231  }
3232  const vector<string>& getContextFunctions() {
3233  return CONTEXTFUNCTIONS_ENGINE;
3234  }
3235  };
3236  registerMethod(new ScriptMethodEntityGetOverlayAnimationTime(this));
3237  }
3238  {
3239  //
3240  class ScriptMethodEntityGetNodeTransformMatrix: public ScriptMethod {
3241  private:
3242  LogicMiniScript* miniScript { nullptr };
3243  public:
3244  ScriptMethodEntityGetNodeTransformMatrix(LogicMiniScript* miniScript):
3245  ScriptMethod(
3246  {
3247  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3248  { .type = ScriptVariableType::TYPE_STRING, .name = "nodeId", .optional = false, .reference = false, .nullable = false },
3249  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3250  },
3252  ),
3253  miniScript(miniScript) {}
3254  const string getMethodName() override {
3255  return "engine.entity.getNodeTransformMatrix";
3256  }
3257  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3258  string entityId;
3259  string nodeId;
3260  string childEntityId;
3261  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3262  miniScript->getStringValue(argumentValues, 1, nodeId) == true &&
3263  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
3264  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3265  if (object != nullptr) {
3266  miniScript->setValue(returnValue, object->getNodeTransformMatrix(nodeId));
3267  } else {
3268  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3269  }
3270  } else {
3271  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3272  miniScript->startErrorScript();
3273  }
3274  }
3275  const vector<string>& getContextFunctions() {
3276  return CONTEXTFUNCTIONS_ENGINE;
3277  }
3278  };
3279  registerMethod(new ScriptMethodEntityGetNodeTransformMatrix(this));
3280  }
3281  {
3282  //
3283  class ScriptMethodEntityGetNodeTransform: public ScriptMethod {
3284  private:
3285  LogicMiniScript* miniScript { nullptr };
3286  public:
3287  ScriptMethodEntityGetNodeTransform(LogicMiniScript* miniScript):
3288  ScriptMethod(
3289  {
3290  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3291  { .type = ScriptVariableType::TYPE_STRING, .name = "nodeId", .optional = false, .reference = false, .nullable = false },
3292  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3293  },
3295  ),
3296  miniScript(miniScript) {}
3297  const string getMethodName() override {
3298  return "engine.entity.getNodeTransform";
3299  }
3300  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3301  string entityId;
3302  string nodeId;
3303  string childEntityId;
3304  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3305  miniScript->getStringValue(argumentValues, 1, nodeId) == true &&
3306  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
3307  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3308  if (object != nullptr) {
3309  Transform transform;
3310  transform.fromMatrix(object->getNodeTransformMatrix(nodeId), RotationOrder::ZYX);
3311  miniScript->setValue(returnValue, transform);
3312  } else {
3313  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3314  }
3315  } else {
3316  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3317  miniScript->startErrorScript();
3318  }
3319  }
3320  const vector<string>& getContextFunctions() {
3321  return CONTEXTFUNCTIONS_ENGINE;
3322  }
3323  };
3324  registerMethod(new ScriptMethodEntityGetNodeTransform(this));
3325  }
3326  {
3327  //
3328  class ScriptMethodEntitySetNodeTransformMatrix: public ScriptMethod {
3329  private:
3330  LogicMiniScript* miniScript { nullptr };
3331  public:
3332  ScriptMethodEntitySetNodeTransformMatrix(LogicMiniScript* miniScript):
3333  ScriptMethod(
3334  {
3335  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3336  { .type = ScriptVariableType::TYPE_STRING, .name = "nodeId", .optional = false, .reference = false, .nullable = false },
3337  { .type = TYPE_MATRIX4x4, .name = "matrix", .optional = false, .reference = false, .nullable = false },
3338  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3339  },
3340  ScriptVariableType::TYPE_NULL
3341  ),
3342  miniScript(miniScript) {}
3343  const string getMethodName() override {
3344  return "engine.entity.setNodeTransformMatrix";
3345  }
3346  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3347  string entityId;
3348  string nodeId;
3349  Matrix4x4 matrix;
3350  string childEntityId;
3351  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3352  miniScript->getStringValue(argumentValues, 1, nodeId) == true &&
3353  miniScript->getMatrix4x4Value(argumentValues, 2, matrix) == true &&
3354  miniScript->getStringValue(argumentValues, 3, childEntityId, true) == true) {
3355  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3356  if (object != nullptr) {
3357  object->setNodeTransformMatrix(nodeId, matrix);
3358  } else {
3359  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3360  }
3361  } else {
3362  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3363  miniScript->startErrorScript();
3364  }
3365  }
3366  const vector<string>& getContextFunctions() {
3367  return CONTEXTFUNCTIONS_ENGINE;
3368  }
3369  };
3370  registerMethod(new ScriptMethodEntitySetNodeTransformMatrix(this));
3371  }
3372  {
3373  //
3374  class ScriptMethodEntitySetNodeTransform: public ScriptMethod {
3375  private:
3376  LogicMiniScript* miniScript { nullptr };
3377  public:
3378  ScriptMethodEntitySetNodeTransform(LogicMiniScript* miniScript):
3379  ScriptMethod(
3380  {
3381  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3382  { .type = ScriptVariableType::TYPE_STRING, .name = "nodeId", .optional = false, .reference = false, .nullable = false },
3383  { .type = TYPE_TRANSFORM, .name = "transform", .optional = false, .reference = false, .nullable = false },
3384  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3385  },
3386  ScriptVariableType::TYPE_NULL
3387  ),
3388  miniScript(miniScript) {}
3389  const string getMethodName() override {
3390  return "engine.entity.setNodeTransform";
3391  }
3392  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3393  string entityId;
3394  string nodeId;
3395  Transform transform;
3396  string childEntityId;
3397  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3398  miniScript->getStringValue(argumentValues, 1, nodeId) == true &&
3399  miniScript->getTransformValue(argumentValues, 2, transform) == true &&
3400  miniScript->getStringValue(argumentValues, 3, childEntityId, true) == true) {
3401  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3402  if (object != nullptr) {
3403  object->setNodeTransformMatrix(nodeId, transform.getTransformMatrix());
3404  } else {
3405  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3406  }
3407  } else {
3408  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3409  miniScript->startErrorScript();
3410  }
3411  }
3412  const vector<string>& getContextFunctions() {
3413  return CONTEXTFUNCTIONS_ENGINE;
3414  }
3415  };
3416  registerMethod(new ScriptMethodEntitySetNodeTransform(this));
3417  }
3418  {
3419  //
3420  class ScriptMethodEntityUnsetNodeTransformMatrix: public ScriptMethod {
3421  private:
3422  LogicMiniScript* miniScript { nullptr };
3423  public:
3424  ScriptMethodEntityUnsetNodeTransformMatrix(LogicMiniScript* miniScript):
3425  ScriptMethod(
3426  {
3427  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3428  { .type = ScriptVariableType::TYPE_STRING, .name = "nodeId", .optional = false, .reference = false, .nullable = false },
3429  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3430  },
3431  ScriptVariableType::TYPE_NULL
3432  ),
3433  miniScript(miniScript) {}
3434  const string getMethodName() override {
3435  return "engine.entity.unsetNodeTransformMatrix";
3436  }
3437  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3438  string entityId;
3439  string nodeId;
3440  string childEntityId;
3441  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3442  miniScript->getStringValue(argumentValues, 1, nodeId) == true &&
3443  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
3444  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3445  if (object != nullptr) {
3446  object->unsetNodeTransformMatrix(nodeId);
3447  } else {
3448  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3449  }
3450  } else {
3451  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3452  miniScript->startErrorScript();
3453  }
3454  }
3455  const vector<string>& getContextFunctions() {
3456  return CONTEXTFUNCTIONS_ENGINE;
3457  }
3458  };
3459  registerMethod(new ScriptMethodEntityUnsetNodeTransformMatrix(this));
3460  }
3461  {
3462  //
3463  class ScriptMethodEntityUnsetNodeTransform: public ScriptMethod {
3464  private:
3465  LogicMiniScript* miniScript { nullptr };
3466  public:
3467  ScriptMethodEntityUnsetNodeTransform(LogicMiniScript* miniScript):
3468  ScriptMethod(
3469  {
3470  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3471  { .type = ScriptVariableType::TYPE_STRING, .name = "nodeId", .optional = false, .reference = false, .nullable = false },
3472  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3473  },
3474  ScriptVariableType::TYPE_NULL
3475  ),
3476  miniScript(miniScript) {}
3477  const string getMethodName() override {
3478  return "engine.entity.unsetNodeTransform";
3479  }
3480  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3481  string entityId;
3482  string nodeId;
3483  string childEntityId;
3484  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3485  miniScript->getStringValue(argumentValues, 1, nodeId) == true &&
3486  miniScript->getStringValue(argumentValues, 2, childEntityId, true) == true) {
3487  auto object = dynamic_cast<Object*>(miniScript->getEntity(entityId, childEntityId));
3488  if (object != nullptr) {
3489  object->unsetNodeTransformMatrix(nodeId);
3490  } else {
3491  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": object entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3492  }
3493  } else {
3494  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3495  miniScript->startErrorScript();
3496  }
3497  }
3498  const vector<string>& getContextFunctions() {
3499  return CONTEXTFUNCTIONS_ENGINE;
3500  }
3501  };
3502  registerMethod(new ScriptMethodEntityUnsetNodeTransform(this));
3503  }
3504  {
3505  //
3506  class ScriptMethodEntityEmitParticles: public ScriptMethod {
3507  private:
3508  LogicMiniScript* miniScript { nullptr };
3509  public:
3510  ScriptMethodEntityEmitParticles(LogicMiniScript* miniScript):
3511  ScriptMethod(
3512  {
3513  { .type = ScriptVariableType::TYPE_STRING, .name = "entityId", .optional = false, .reference = false, .nullable = false },
3514  { .type = ScriptVariableType::TYPE_STRING, .name = "childEntityId", .optional = true, .reference = false, .nullable = false },
3515  },
3516  ScriptVariableType::TYPE_INTEGER
3517  ),
3518  miniScript(miniScript) {}
3519  const string getMethodName() override {
3520  return "engine.entity.emitParticles";
3521  }
3522  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3523  string entityId;
3524  string childEntityId;
3525  if (miniScript->getStringValue(argumentValues, 0, entityId) == true &&
3526  miniScript->getStringValue(argumentValues, 1, childEntityId, true) == true) {
3527  auto entity = dynamic_cast<ParticleSystem*>(miniScript->getEntity(entityId, childEntityId));
3528  if (entity != nullptr) {
3529  returnValue = static_cast<int64_t>(entity->emitParticles());
3530  } else {
3531  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": particle system entity not found: " + (childEntityId.empty() == true?entityId:childEntityId + "@" + entityId));
3532  }
3533  } else {
3534  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
3535  miniScript->startErrorScript();
3536  }
3537  }
3538  const vector<string>& getContextFunctions() {
3539  return CONTEXTFUNCTIONS_ENGINE;
3540  }
3541  };
3542  registerMethod(new ScriptMethodEntityEmitParticles(this));
3543  }
3544  // physics
3545  {
3546  //
3547  class ScriptMethodBodyTYPE_STATIC: public ScriptMethod {
3548  private:
3549  LogicMiniScript* miniScript { nullptr };
3550  public:
3551  ScriptMethodBodyTYPE_STATIC(LogicMiniScript* miniScript):
3552  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3553  miniScript(miniScript) {}
3554  const string getMethodName() override {
3555  return "world.body.TYPE_STATIC";
3556  }
3557  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3558  returnValue = static_cast<int64_t>(Body::BODYTYPE_STATIC);
3559  }
3560  const vector<string>& getContextFunctions() {
3561  return CONTEXTFUNCTIONS_LOGIC;
3562  }
3563  };
3564  registerMethod(new ScriptMethodBodyTYPE_STATIC(this));
3565  }
3566  {
3567  //
3568  class ScriptMethodBodyTYPE_DYNAMIC: public ScriptMethod {
3569  private:
3570  LogicMiniScript* miniScript { nullptr };
3571  public:
3572  ScriptMethodBodyTYPE_DYNAMIC(LogicMiniScript* miniScript):
3573  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3574  miniScript(miniScript) {}
3575  const string getMethodName() override {
3576  return "world.body.TYPE_DYNAMIC";
3577  }
3578  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3579  returnValue = static_cast<int64_t>(Body::BODYTYPE_DYNAMIC);
3580  }
3581  const vector<string>& getContextFunctions() {
3582  return CONTEXTFUNCTIONS_LOGIC;
3583  }
3584  };
3585  registerMethod(new ScriptMethodBodyTYPE_DYNAMIC(this));
3586  }
3587  {
3588  //
3589  class ScriptMethodBodyTYPE_COLLISIONSTATIC: public ScriptMethod {
3590  private:
3591  LogicMiniScript* miniScript { nullptr };
3592  public:
3593  ScriptMethodBodyTYPE_COLLISIONSTATIC(LogicMiniScript* miniScript):
3594  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3595  miniScript(miniScript) {}
3596  const string getMethodName() override {
3597  return "world.body.TYPE_COLLISION_STATIC";
3598  }
3599  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3600  returnValue = static_cast<int64_t>(Body::BODYTYPE_COLLISION_STATIC);
3601  }
3602  const vector<string>& getContextFunctions() {
3603  return CONTEXTFUNCTIONS_LOGIC;
3604  }
3605  };
3606  registerMethod(new ScriptMethodBodyTYPE_COLLISIONSTATIC(this));
3607  }
3608  {
3609  //
3610  class ScriptMethodBodyTYPE_COLLISIONDYNAMIC: public ScriptMethod {
3611  private:
3612  LogicMiniScript* miniScript { nullptr };
3613  public:
3614  ScriptMethodBodyTYPE_COLLISIONDYNAMIC(LogicMiniScript* miniScript):
3615  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3616  miniScript(miniScript) {}
3617  const string getMethodName() override {
3618  return "world.body.TYPE_COLLISION_DYNAMIC";
3619  }
3620  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3621  returnValue = static_cast<int64_t>(Body::BODYTYPE_COLLISION_DYNAMIC);
3622  }
3623  const vector<string>& getContextFunctions() {
3624  return CONTEXTFUNCTIONS_LOGIC;
3625  }
3626  };
3627  registerMethod(new ScriptMethodBodyTYPE_COLLISIONDYNAMIC(this));
3628  }
3629  {
3630  //
3631  class ScriptMethodBodyCOLLISION_TYPEID_STATIC: public ScriptMethod {
3632  private:
3633  LogicMiniScript* miniScript { nullptr };
3634  public:
3635  ScriptMethodBodyCOLLISION_TYPEID_STATIC(LogicMiniScript* miniScript):
3636  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3637  miniScript(miniScript) {}
3638  const string getMethodName() override {
3639  return "world.body.COLLISION_TYPEID_STATIC";
3640  }
3641  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3642  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_STATIC);
3643  }
3644  const vector<string>& getContextFunctions() {
3645  return CONTEXTFUNCTIONS_LOGIC;
3646  }
3647  };
3648  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_STATIC(this));
3649  }
3650  {
3651  //
3652  class ScriptMethodBodyCOLLISION_TYPEID_DYNAMIC: public ScriptMethod {
3653  private:
3654  LogicMiniScript* miniScript { nullptr };
3655  public:
3656  ScriptMethodBodyCOLLISION_TYPEID_DYNAMIC(LogicMiniScript* miniScript):
3657  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3658  miniScript(miniScript) {}
3659  const string getMethodName() override {
3660  return "world.body.COLLISION_TYPEID_DYNAMIC";
3661  }
3662  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3663  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_DYNAMIC);
3664  }
3665  const vector<string>& getContextFunctions() {
3666  return CONTEXTFUNCTIONS_LOGIC;
3667  }
3668  };
3669  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_DYNAMIC(this));
3670  }
3671  {
3672  //
3673  class ScriptMethodBodyCOLLISION_TYPEID_3: public ScriptMethod {
3674  private:
3675  LogicMiniScript* miniScript { nullptr };
3676  public:
3677  ScriptMethodBodyCOLLISION_TYPEID_3(LogicMiniScript* miniScript):
3678  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3679  miniScript(miniScript) {}
3680  const string getMethodName() override {
3681  return "world.body.COLLISION_TYPEID_3";
3682  }
3683  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3684  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_3);
3685  }
3686  const vector<string>& getContextFunctions() {
3687  return CONTEXTFUNCTIONS_LOGIC;
3688  }
3689  };
3690  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_3(this));
3691  }
3692  {
3693  //
3694  class ScriptMethodBodyCOLLISION_TYPEID_4: public ScriptMethod {
3695  private:
3696  LogicMiniScript* miniScript { nullptr };
3697  public:
3698  ScriptMethodBodyCOLLISION_TYPEID_4(LogicMiniScript* miniScript):
3699  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3700  miniScript(miniScript) {}
3701  const string getMethodName() override {
3702  return "world.body.COLLISION_TYPEID_4";
3703  }
3704  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3705  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_4);
3706  }
3707  const vector<string>& getContextFunctions() {
3708  return CONTEXTFUNCTIONS_LOGIC;
3709  }
3710  };
3711  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_4(this));
3712  }
3713  {
3714  //
3715  class ScriptMethodBodyCOLLISION_TYPEID_5: public ScriptMethod {
3716  private:
3717  LogicMiniScript* miniScript { nullptr };
3718  public:
3719  ScriptMethodBodyCOLLISION_TYPEID_5(LogicMiniScript* miniScript):
3720  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3721  miniScript(miniScript) {}
3722  const string getMethodName() override {
3723  return "world.body.COLLISION_TYPEID_5";
3724  }
3725  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3726  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_5);
3727  }
3728  const vector<string>& getContextFunctions() {
3729  return CONTEXTFUNCTIONS_LOGIC;
3730  }
3731  };
3732  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_5(this));
3733  }
3734  {
3735  //
3736  class ScriptMethodBodyCOLLISION_TYPEID_6: public ScriptMethod {
3737  private:
3738  LogicMiniScript* miniScript { nullptr };
3739  public:
3740  ScriptMethodBodyCOLLISION_TYPEID_6(LogicMiniScript* miniScript):
3741  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3742  miniScript(miniScript) {}
3743  const string getMethodName() override {
3744  return "world.body.COLLISION_TYPEID_6";
3745  }
3746  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3747  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_6);
3748  }
3749  const vector<string>& getContextFunctions() {
3750  return CONTEXTFUNCTIONS_LOGIC;
3751  }
3752  };
3753  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_6(this));
3754  }
3755  {
3756  //
3757  class ScriptMethodBodyCOLLISION_TYPEID_7: public ScriptMethod {
3758  private:
3759  LogicMiniScript* miniScript { nullptr };
3760  public:
3761  ScriptMethodBodyCOLLISION_TYPEID_7(LogicMiniScript* miniScript):
3762  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3763  miniScript(miniScript) {}
3764  const string getMethodName() override {
3765  return "world.body.COLLISION_TYPEID_7";
3766  }
3767  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3768  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_7);
3769  }
3770  const vector<string>& getContextFunctions() {
3771  return CONTEXTFUNCTIONS_LOGIC;
3772  }
3773  };
3774  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_7(this));
3775  }
3776  {
3777  //
3778  class ScriptMethodBodyCOLLISION_TYPEID_8: public ScriptMethod {
3779  private:
3780  LogicMiniScript* miniScript { nullptr };
3781  public:
3782  ScriptMethodBodyCOLLISION_TYPEID_8(LogicMiniScript* miniScript):
3783  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3784  miniScript(miniScript) {}
3785  const string getMethodName() override {
3786  return "world.body.COLLISION_TYPEID_8";
3787  }
3788  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3789  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_8);
3790  }
3791  const vector<string>& getContextFunctions() {
3792  return CONTEXTFUNCTIONS_LOGIC;
3793  }
3794  };
3795  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_8(this));
3796  }
3797  {
3798  //
3799  class ScriptMethodBodyCOLLISION_TYPEID_9: public ScriptMethod {
3800  private:
3801  LogicMiniScript* miniScript { nullptr };
3802  public:
3803  ScriptMethodBodyCOLLISION_TYPEID_9(LogicMiniScript* miniScript):
3804  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3805  miniScript(miniScript) {}
3806  const string getMethodName() override {
3807  return "world.body.COLLISION_TYPEID_9";
3808  }
3809  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3810  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_9);
3811  }
3812  const vector<string>& getContextFunctions() {
3813  return CONTEXTFUNCTIONS_LOGIC;
3814  }
3815  };
3816  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_9(this));
3817  }
3818  {
3819  //
3820  class ScriptMethodBodyCOLLISION_TYPEID_10: public ScriptMethod {
3821  private:
3822  LogicMiniScript* miniScript { nullptr };
3823  public:
3824  ScriptMethodBodyCOLLISION_TYPEID_10(LogicMiniScript* miniScript):
3825  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3826  miniScript(miniScript) {}
3827  const string getMethodName() override {
3828  return "world.body.COLLISION_TYPEID_10";
3829  }
3830  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3831  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_10);
3832  }
3833  const vector<string>& getContextFunctions() {
3834  return CONTEXTFUNCTIONS_LOGIC;
3835  }
3836  };
3837  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_10(this));
3838  }
3839  {
3840  //
3841  class ScriptMethodBodyCOLLISION_TYPEID_11: public ScriptMethod {
3842  private:
3843  LogicMiniScript* miniScript { nullptr };
3844  public:
3845  ScriptMethodBodyCOLLISION_TYPEID_11(LogicMiniScript* miniScript):
3846  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3847  miniScript(miniScript) {}
3848  const string getMethodName() override {
3849  return "world.body.COLLISION_TYPEID_11";
3850  }
3851  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3852  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_11);
3853  }
3854  const vector<string>& getContextFunctions() {
3855  return CONTEXTFUNCTIONS_LOGIC;
3856  }
3857  };
3858  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_11(this));
3859  }
3860  {
3861  //
3862  class ScriptMethodBodyCOLLISION_TYPEID_12: public ScriptMethod {
3863  private:
3864  LogicMiniScript* miniScript { nullptr };
3865  public:
3866  ScriptMethodBodyCOLLISION_TYPEID_12(LogicMiniScript* miniScript):
3867  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3868  miniScript(miniScript) {}
3869  const string getMethodName() override {
3870  return "world.body.COLLISION_TYPEID_12";
3871  }
3872  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3873  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_12);
3874  }
3875  const vector<string>& getContextFunctions() {
3876  return CONTEXTFUNCTIONS_LOGIC;
3877  }
3878  };
3879  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_12(this));
3880  }
3881  {
3882  //
3883  class ScriptMethodBodyCOLLISION_TYPEID_13: public ScriptMethod {
3884  private:
3885  LogicMiniScript* miniScript { nullptr };
3886  public:
3887  ScriptMethodBodyCOLLISION_TYPEID_13(LogicMiniScript* miniScript):
3888  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3889  miniScript(miniScript) {}
3890  const string getMethodName() override {
3891  return "world.body.COLLISION_TYPEID_13";
3892  }
3893  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3894  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_13);
3895  }
3896  const vector<string>& getContextFunctions() {
3897  return CONTEXTFUNCTIONS_LOGIC;
3898  }
3899  };
3900  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_13(this));
3901  }
3902  {
3903  //
3904  class ScriptMethodBodyCOLLISION_TYPEID_14: public ScriptMethod {
3905  private:
3906  LogicMiniScript* miniScript { nullptr };
3907  public:
3908  ScriptMethodBodyCOLLISION_TYPEID_14(LogicMiniScript* miniScript):
3909  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3910  miniScript(miniScript) {}
3911  const string getMethodName() override {
3912  return "world.body.COLLISION_TYPEID_14";
3913  }
3914  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3915  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_14);
3916  }
3917  const vector<string>& getContextFunctions() {
3918  return CONTEXTFUNCTIONS_LOGIC;
3919  }
3920  };
3921  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_14(this));
3922  }
3923  {
3924  //
3925  class ScriptMethodBodyCOLLISION_TYPEID_15: public ScriptMethod {
3926  private:
3927  LogicMiniScript* miniScript { nullptr };
3928  public:
3929  ScriptMethodBodyCOLLISION_TYPEID_15(LogicMiniScript* miniScript):
3930  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3931  miniScript(miniScript) {}
3932  const string getMethodName() override {
3933  return "world.body.COLLISION_TYPEID_15";
3934  }
3935  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3936  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_15);
3937  }
3938  const vector<string>& getContextFunctions() {
3939  return CONTEXTFUNCTIONS_LOGIC;
3940  }
3941  };
3942  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_15(this));
3943  }
3944  {
3945  //
3946  class ScriptMethodBodyCOLLISION_TYPEID_16: public ScriptMethod {
3947  private:
3948  LogicMiniScript* miniScript { nullptr };
3949  public:
3950  ScriptMethodBodyCOLLISION_TYPEID_16(LogicMiniScript* miniScript):
3951  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3952  miniScript(miniScript) {}
3953  const string getMethodName() override {
3954  return "world.body.COLLISION_TYPEID_16";
3955  }
3956  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3957  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_16);
3958  }
3959  const vector<string>& getContextFunctions() {
3960  return CONTEXTFUNCTIONS_LOGIC;
3961  }
3962  };
3963  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_16(this));
3964  }
3965  {
3966  //
3967  class ScriptMethodBodyCOLLISION_TYPEID_ALL: public ScriptMethod {
3968  private:
3969  LogicMiniScript* miniScript { nullptr };
3970  public:
3971  ScriptMethodBodyCOLLISION_TYPEID_ALL(LogicMiniScript* miniScript):
3972  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
3973  miniScript(miniScript) {}
3974  const string getMethodName() override {
3975  return "world.body.COLLISION_TYPEID_ALL";
3976  }
3977  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
3978  returnValue = static_cast<int64_t>(Body::COLLISION_TYPEID_ALL);
3979  }
3980  const vector<string>& getContextFunctions() {
3981  return CONTEXTFUNCTIONS_LOGIC;
3982  }
3983  };
3984  registerMethod(new ScriptMethodBodyCOLLISION_TYPEID_ALL(this));
3985  }
3986  {
3987  //
3988  class ScriptMethodBodyIsEnabled: public ScriptMethod {
3989  private:
3990  LogicMiniScript* miniScript { nullptr };
3991  public:
3992  ScriptMethodBodyIsEnabled(LogicMiniScript* miniScript):
3993  ScriptMethod(
3994  {
3995  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false }
3996  },
3997  ScriptVariableType::TYPE_BOOLEAN
3998  ),
3999  miniScript(miniScript) {}
4000  const string getMethodName() override {
4001  return "world.body.isEnabled";
4002  }
4003  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4004  string bodyId;
4005  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true) {
4006  auto body = miniScript->context->getWorld()->getBody(bodyId);
4007  if (body != nullptr) {
4008  returnValue = body->isEnabled();
4009  } else {
4010  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4011  }
4012  } else {
4013  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4014  miniScript->startErrorScript();
4015  }
4016  }
4017  const vector<string>& getContextFunctions() {
4018  return CONTEXTFUNCTIONS_LOGIC;
4019  }
4020  };
4021  registerMethod(new ScriptMethodBodyIsEnabled(this));
4022  }
4023  {
4024  //
4025  class ScriptMethodBodySetEnabled: public ScriptMethod {
4026  private:
4027  LogicMiniScript* miniScript { nullptr };
4028  public:
4029  ScriptMethodBodySetEnabled(LogicMiniScript* miniScript):
4030  ScriptMethod(
4031  {
4032  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false },
4033  { .type = ScriptVariableType::TYPE_BOOLEAN, .name = "enabled", .optional = false, .reference = false, .nullable = false }
4034  },
4035  ScriptVariableType::TYPE_NULL
4036  ),
4037  miniScript(miniScript) {}
4038  const string getMethodName() override {
4039  return "world.body.setEnabled";
4040  }
4041  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4042  string bodyId;
4043  bool enabled;
4044  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true &&
4045  miniScript->getBooleanValue(argumentValues, 1, enabled) == true) {
4046  auto body = miniScript->context->getWorld()->getBody(bodyId);
4047  if (body != nullptr) {
4048  body->setEnabled(enabled);
4049  } else {
4050  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4051  }
4052  } else {
4053  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4054  miniScript->startErrorScript();
4055  }
4056  }
4057  const vector<string>& getContextFunctions() {
4058  return CONTEXTFUNCTIONS_LOGIC;
4059  }
4060  };
4061  registerMethod(new ScriptMethodBodySetEnabled(this));
4062  }
4063  {
4064  //
4065  class ScriptMethodBodyGetType: public ScriptMethod {
4066  private:
4067  LogicMiniScript* miniScript { nullptr };
4068  public:
4069  ScriptMethodBodyGetType(LogicMiniScript* miniScript):
4070  ScriptMethod(
4071  {
4072  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false }
4073  },
4074  ScriptVariableType::TYPE_INTEGER
4075  ),
4076  miniScript(miniScript) {}
4077  const string getMethodName() override {
4078  return "world.body.getType";
4079  }
4080  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4081  string bodyId;
4082  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true) {
4083  auto body = miniScript->context->getWorld()->getBody(bodyId);
4084  if (body != nullptr) {
4085  returnValue = static_cast<int64_t>(body->getType());
4086  } else {
4087  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4088  }
4089  } else {
4090  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4091  miniScript->startErrorScript();
4092  }
4093  }
4094  const vector<string>& getContextFunctions() {
4095  return CONTEXTFUNCTIONS_LOGIC;
4096  }
4097  };
4098  registerMethod(new ScriptMethodBodyGetType(this));
4099  }
4100  {
4101  //
4102  class ScriptMethodBodyGetCollisionTypeId: public ScriptMethod {
4103  private:
4104  LogicMiniScript* miniScript { nullptr };
4105  public:
4106  ScriptMethodBodyGetCollisionTypeId(LogicMiniScript* miniScript):
4107  ScriptMethod(
4108  {
4109  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false }
4110  },
4111  ScriptVariableType::TYPE_INTEGER
4112  ),
4113  miniScript(miniScript) {}
4114  const string getMethodName() override {
4115  return "world.body.getCollisionTypeId";
4116  }
4117  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4118  string bodyId;
4119  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true) {
4120  auto body = miniScript->context->getWorld()->getBody(bodyId);
4121  if (body != nullptr) {
4122  returnValue = static_cast<int64_t>(body->getCollisionTypeId());
4123  } else {
4124  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4125  }
4126  } else {
4127  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4128  miniScript->startErrorScript();
4129  }
4130  }
4131  const vector<string>& getContextFunctions() {
4132  return CONTEXTFUNCTIONS_LOGIC;
4133  }
4134  };
4135  registerMethod(new ScriptMethodBodyGetCollisionTypeId(this));
4136  }
4137  {
4138  //
4139  class ScriptMethodBodySetCollisionTypeId: public ScriptMethod {
4140  private:
4141  LogicMiniScript* miniScript { nullptr };
4142  public:
4143  ScriptMethodBodySetCollisionTypeId(LogicMiniScript* miniScript):
4144  ScriptMethod(
4145  {
4146  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false },
4147  { .type = ScriptVariableType::TYPE_INTEGER, .name = "collisionTypeId", .optional = false, .reference = false, .nullable = false }
4148  },
4149  ScriptVariableType::TYPE_NULL
4150  ),
4151  miniScript(miniScript) {}
4152  const string getMethodName() override {
4153  return "world.body.setCollisionTypeId";
4154  }
4155  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4156  string bodyId;
4157  int64_t collisionTypeId;
4158  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true &&
4159  miniScript->getIntegerValue(argumentValues, 1, collisionTypeId) == true) {
4160  auto body = miniScript->context->getWorld()->getBody(bodyId);
4161  if (body != nullptr) {
4162  body->setCollisionTypeId(collisionTypeId);
4163  } else {
4164  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4165  }
4166  } else {
4167  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4168  miniScript->startErrorScript();
4169  }
4170  }
4171  const vector<string>& getContextFunctions() {
4172  return CONTEXTFUNCTIONS_LOGIC;
4173  }
4174  };
4175  registerMethod(new ScriptMethodBodySetCollisionTypeId(this));
4176  }
4177  {
4178  //
4179  class ScriptMethodBodyGetCollisionTypeIds: public ScriptMethod {
4180  private:
4181  LogicMiniScript* miniScript { nullptr };
4182  public:
4183  ScriptMethodBodyGetCollisionTypeIds(LogicMiniScript* miniScript):
4184  ScriptMethod(
4185  {
4186  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false }
4187  },
4188  ScriptVariableType::TYPE_INTEGER
4189  ),
4190  miniScript(miniScript) {}
4191  const string getMethodName() override {
4192  return "world.body.getCollisionTypeIds";
4193  }
4194  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4195  string bodyId;
4196  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true) {
4197  auto body = miniScript->context->getWorld()->getBody(bodyId);
4198  if (body != nullptr) {
4199  returnValue = static_cast<int64_t>(body->getCollisionTypeIds());
4200  } else {
4201  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4202  }
4203  } else {
4204  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4205  miniScript->startErrorScript();
4206  }
4207  }
4208  const vector<string>& getContextFunctions() {
4209  return CONTEXTFUNCTIONS_LOGIC;
4210  }
4211  };
4212  registerMethod(new ScriptMethodBodyGetCollisionTypeIds(this));
4213  }
4214  {
4215  //
4216  class ScriptMethodBodySetCollisionTypeIds: public ScriptMethod {
4217  private:
4218  LogicMiniScript* miniScript { nullptr };
4219  public:
4220  ScriptMethodBodySetCollisionTypeIds(LogicMiniScript* miniScript):
4221  ScriptMethod(
4222  {
4223  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false },
4224  { .type = ScriptVariableType::TYPE_INTEGER, .name = "collisionTypeIds", .optional = false, .reference = false, .nullable = false }
4225  },
4226  ScriptVariableType::TYPE_NULL
4227  ),
4228  miniScript(miniScript) {}
4229  const string getMethodName() override {
4230  return "world.body.setCollisionTypeIds";
4231  }
4232  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4233  string bodyId;
4234  int64_t collisionTypeIds;
4235  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true &&
4236  miniScript->getIntegerValue(argumentValues, 1, collisionTypeIds) == true) {
4237  auto body = miniScript->context->getWorld()->getBody(bodyId);
4238  if (body != nullptr) {
4239  body->setCollisionTypeIds(collisionTypeIds);
4240  } else {
4241  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4242  }
4243  } else {
4244  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4245  miniScript->startErrorScript();
4246  }
4247  }
4248  const vector<string>& getContextFunctions() {
4249  return CONTEXTFUNCTIONS_LOGIC;
4250  }
4251  };
4252  registerMethod(new ScriptMethodBodySetCollisionTypeIds(this));
4253  }
4254  {
4255  //
4256  class ScriptMethodBodyGetLinearDamping: public ScriptMethod {
4257  private:
4258  LogicMiniScript* miniScript { nullptr };
4259  public:
4260  ScriptMethodBodyGetLinearDamping(LogicMiniScript* miniScript):
4261  ScriptMethod(
4262  {
4263  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false }
4264  },
4265  ScriptVariableType::TYPE_FLOAT
4266  ),
4267  miniScript(miniScript) {}
4268  const string getMethodName() override {
4269  return "world.body.getLinearDamping";
4270  }
4271  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4272  string bodyId;
4273  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true) {
4274  auto body = miniScript->context->getWorld()->getBody(bodyId);
4275  if (body != nullptr) {
4276  returnValue = body->getLinearDamping();
4277  } else {
4278  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4279  }
4280  } else {
4281  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4282  miniScript->startErrorScript();
4283  }
4284  }
4285  const vector<string>& getContextFunctions() {
4286  return CONTEXTFUNCTIONS_LOGIC;
4287  }
4288  };
4289  registerMethod(new ScriptMethodBodyGetLinearDamping(this));
4290  }
4291  {
4292  //
4293  class ScriptMethodBodySetLinearDamping: public ScriptMethod {
4294  private:
4295  LogicMiniScript* miniScript { nullptr };
4296  public:
4297  ScriptMethodBodySetLinearDamping(LogicMiniScript* miniScript):
4298  ScriptMethod(
4299  {
4300  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false },
4301  { .type = ScriptVariableType::TYPE_FLOAT, .name = "linearDamping", .optional = false, .reference = false, .nullable = false }
4302  },
4303  ScriptVariableType::TYPE_NULL
4304  ),
4305  miniScript(miniScript) {}
4306  const string getMethodName() override {
4307  return "world.body.setLinearDamping";
4308  }
4309  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4310  string bodyId;
4311  float linearDamping;
4312  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true &&
4313  miniScript->getFloatValue(argumentValues, 1, linearDamping) == true) {
4314  auto body = miniScript->context->getWorld()->getBody(bodyId);
4315  if (body != nullptr) {
4316  body->setLinearDamping(linearDamping);
4317  } else {
4318  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4319  }
4320  } else {
4321  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4322  miniScript->startErrorScript();
4323  }
4324  }
4325  const vector<string>& getContextFunctions() {
4326  return CONTEXTFUNCTIONS_LOGIC;
4327  }
4328  };
4329  registerMethod(new ScriptMethodBodySetLinearDamping(this));
4330  }
4331  {
4332  //
4333  class ScriptMethodBodyGetAngularDamping: public ScriptMethod {
4334  private:
4335  LogicMiniScript* miniScript { nullptr };
4336  public:
4337  ScriptMethodBodyGetAngularDamping(LogicMiniScript* miniScript):
4338  ScriptMethod(
4339  {
4340  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false }
4341  },
4342  ScriptVariableType::TYPE_FLOAT
4343  ),
4344  miniScript(miniScript) {}
4345  const string getMethodName() override {
4346  return "world.body.getAngularDamping";
4347  }
4348  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4349  string bodyId;
4350  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true) {
4351  auto body = miniScript->context->getWorld()->getBody(bodyId);
4352  if (body != nullptr) {
4353  returnValue = body->getAngularDamping();
4354  } else {
4355  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4356  }
4357  } else {
4358  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4359  miniScript->startErrorScript();
4360  }
4361  }
4362  const vector<string>& getContextFunctions() {
4363  return CONTEXTFUNCTIONS_LOGIC;
4364  }
4365  };
4366  registerMethod(new ScriptMethodBodyGetAngularDamping(this));
4367  }
4368  {
4369  //
4370  class ScriptMethodBodySetAngularDamping: public ScriptMethod {
4371  private:
4372  LogicMiniScript* miniScript { nullptr };
4373  public:
4374  ScriptMethodBodySetAngularDamping(LogicMiniScript* miniScript):
4375  ScriptMethod(
4376  {
4377  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false },
4378  { .type = ScriptVariableType::TYPE_FLOAT, .name = "angularDamping", .optional = false, .reference = false, .nullable = false }
4379  },
4380  ScriptVariableType::TYPE_NULL
4381  ),
4382  miniScript(miniScript) {}
4383  const string getMethodName() override {
4384  return "world.body.setAngularDamping";
4385  }
4386  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4387  string bodyId;
4388  float angularDamping;
4389  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true &&
4390  miniScript->getFloatValue(argumentValues, 1, angularDamping) == true) {
4391  auto body = miniScript->context->getWorld()->getBody(bodyId);
4392  if (body != nullptr) {
4393  body->setAngularDamping(angularDamping);
4394  } else {
4395  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4396  }
4397  } else {
4398  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4399  miniScript->startErrorScript();
4400  }
4401  }
4402  const vector<string>& getContextFunctions() {
4403  return CONTEXTFUNCTIONS_LOGIC;
4404  }
4405  };
4406  registerMethod(new ScriptMethodBodySetAngularDamping(this));
4407  }
4408  {
4409  //
4410  class ScriptMethodBodyGetLinearVelocity: public ScriptMethod {
4411  private:
4412  LogicMiniScript* miniScript { nullptr };
4413  public:
4414  ScriptMethodBodyGetLinearVelocity(LogicMiniScript* miniScript):
4415  ScriptMethod(
4416  {
4417  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false }
4418  },
4419  TYPE_VECTOR3
4420  ),
4421  miniScript(miniScript) {}
4422  const string getMethodName() override {
4423  return "world.body.getLinearVelocity";
4424  }
4425  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4426  string bodyId;
4427  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true) {
4428  auto body = miniScript->context->getWorld()->getBody(bodyId);
4429  if (body != nullptr) {
4430  miniScript->setValue(returnValue, body->getLinearVelocity());
4431  } else {
4432  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4433  }
4434  } else {
4435  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4436  miniScript->startErrorScript();
4437  }
4438  }
4439  const vector<string>& getContextFunctions() {
4440  return CONTEXTFUNCTIONS_LOGIC;
4441  }
4442  };
4443  registerMethod(new ScriptMethodBodyGetLinearVelocity(this));
4444  }
4445  {
4446  //
4447  class ScriptMethodBodySetLinearVelocity: public ScriptMethod {
4448  private:
4449  LogicMiniScript* miniScript { nullptr };
4450  public:
4451  ScriptMethodBodySetLinearVelocity(LogicMiniScript* miniScript):
4452  ScriptMethod(
4453  {
4454  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false },
4455  { .type = TYPE_VECTOR3, .name = "linearVelocity", .optional = false, .reference = false, .nullable = false }
4456  },
4457  ScriptVariableType::TYPE_NULL
4458  ),
4459  miniScript(miniScript) {}
4460  const string getMethodName() override {
4461  return "world.body.setLinearVelocity";
4462  }
4463  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4464  string bodyId;
4465  Vector3 linearVelocity;
4466  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true &&
4467  miniScript->getVector3Value(argumentValues, 1, linearVelocity) == true) {
4468  auto body = miniScript->context->getWorld()->getBody(bodyId);
4469  if (body != nullptr) {
4470  body->setLinearVelocity(linearVelocity);
4471  } else {
4472  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4473  }
4474  } else {
4475  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4476  miniScript->startErrorScript();
4477  }
4478  }
4479  const vector<string>& getContextFunctions() {
4480  return CONTEXTFUNCTIONS_LOGIC;
4481  }
4482  };
4483  registerMethod(new ScriptMethodBodySetLinearVelocity(this));
4484  }
4485  {
4486  //
4487  class ScriptMethodBodyGetAngularVelocity: public ScriptMethod {
4488  private:
4489  LogicMiniScript* miniScript { nullptr };
4490  public:
4491  ScriptMethodBodyGetAngularVelocity(LogicMiniScript* miniScript):
4492  ScriptMethod(
4493  {
4494  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false }
4495  },
4496  TYPE_VECTOR3
4497  ),
4498  miniScript(miniScript) {}
4499  const string getMethodName() override {
4500  return "world.body.getAngularVelocity";
4501  }
4502  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4503  string bodyId;
4504  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true) {
4505  auto body = miniScript->context->getWorld()->getBody(bodyId);
4506  if (body != nullptr) {
4507  miniScript->setValue(returnValue, body->getAngularVelocity());
4508  } else {
4509  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4510  }
4511  } else {
4512  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4513  miniScript->startErrorScript();
4514  }
4515  }
4516  const vector<string>& getContextFunctions() {
4517  return CONTEXTFUNCTIONS_LOGIC;
4518  }
4519  };
4520  registerMethod(new ScriptMethodBodyGetAngularVelocity(this));
4521  }
4522  {
4523  //
4524  class ScriptMethodBodySetAngularVelocity: public ScriptMethod {
4525  private:
4526  LogicMiniScript* miniScript { nullptr };
4527  public:
4528  ScriptMethodBodySetAngularVelocity(LogicMiniScript* miniScript):
4529  ScriptMethod(
4530  {
4531  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false },
4532  { .type = TYPE_VECTOR3, .name = "angularVelocity", .optional = false, .reference = false, .nullable = false }
4533  },
4534  ScriptVariableType::TYPE_NULL
4535  ),
4536  miniScript(miniScript) {}
4537  const string getMethodName() override {
4538  return "world.body.setAngularVelocity";
4539  }
4540  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4541  string bodyId;
4542  Vector3 angularVelocity;
4543  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true &&
4544  miniScript->getVector3Value(argumentValues, 1, angularVelocity) == true) {
4545  auto body = miniScript->context->getWorld()->getBody(bodyId);
4546  if (body != nullptr) {
4547  body->setAngularVelocity(angularVelocity);
4548  } else {
4549  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4550  }
4551  } else {
4552  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4553  miniScript->startErrorScript();
4554  }
4555  }
4556  const vector<string>& getContextFunctions() {
4557  return CONTEXTFUNCTIONS_LOGIC;
4558  }
4559  };
4560  registerMethod(new ScriptMethodBodySetAngularVelocity(this));
4561  }
4562  {
4563  //
4564  class ScriptMethodBodyAddForce: public ScriptMethod {
4565  private:
4566  LogicMiniScript* miniScript { nullptr };
4567  public:
4568  ScriptMethodBodyAddForce(LogicMiniScript* miniScript):
4569  ScriptMethod(
4570  {
4571  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false },
4572  { .type = TYPE_VECTOR3, .name = "force", .optional = false, .reference = false, .nullable = false },
4573  { .type = TYPE_VECTOR3, .name = "origin", .optional = true, .reference = false, .nullable = false }
4574  },
4575  ScriptVariableType::TYPE_NULL
4576  ),
4577  miniScript(miniScript) {}
4578  const string getMethodName() override {
4579  return "world.body.addForce";
4580  }
4581  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4582  string bodyId;
4583  Vector3 force;
4584  Vector3 forceOrigin;
4585  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true &&
4586  miniScript->getVector3Value(argumentValues, 1, force) == true &&
4587  miniScript->getVector3Value(argumentValues, 2, forceOrigin, true) == true) {
4588  auto body = miniScript->context->getWorld()->getBody(bodyId);
4589  if (body != nullptr) {
4590  if (argumentValues.size() == 2) {
4591  body->addForce(force);
4592  } else
4593  if (argumentValues.size() == 3) {
4594  body->addForce(forceOrigin, force);
4595  } else {
4596  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4597  miniScript->startErrorScript();
4598  }
4599  } else {
4600  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4601  }
4602  } else {
4603  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4604  miniScript->startErrorScript();
4605  }
4606  }
4607  const vector<string>& getContextFunctions() {
4608  return CONTEXTFUNCTIONS_LOGIC;
4609  }
4610  };
4611  registerMethod(new ScriptMethodBodyAddForce(this));
4612  }
4613  {
4614  //
4615  class ScriptMethodBodyAddTorque: public ScriptMethod {
4616  private:
4617  LogicMiniScript* miniScript { nullptr };
4618  public:
4619  ScriptMethodBodyAddTorque(LogicMiniScript* miniScript):
4620  ScriptMethod(
4621  {
4622  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false },
4623  { .type = TYPE_VECTOR3, .name = "torque", .optional = false, .reference = false, .nullable = false }
4624  },
4625  ScriptVariableType::TYPE_NULL
4626  ),
4627  miniScript(miniScript) {}
4628  const string getMethodName() override {
4629  return "world.body.addTorque";
4630  }
4631  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4632  string bodyId;
4633  Vector3 torque;
4634  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true &&
4635  miniScript->getVector3Value(argumentValues, 1, torque) == true) {
4636  auto body = miniScript->context->getWorld()->getBody(bodyId);
4637  if (body != nullptr) {
4638  body->addTorque(torque);
4639  } else {
4640  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4641  }
4642  } else {
4643  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4644  miniScript->startErrorScript();
4645  }
4646  }
4647  const vector<string>& getContextFunctions() {
4648  return CONTEXTFUNCTIONS_LOGIC;
4649  }
4650  };
4651  registerMethod(new ScriptMethodBodyAddTorque(this));
4652  }
4653  {
4654  //
4655  class ScriptMethodBodyGetTransform: public ScriptMethod {
4656  private:
4657  LogicMiniScript* miniScript { nullptr };
4658  public:
4659  ScriptMethodBodyGetTransform(LogicMiniScript* miniScript):
4660  ScriptMethod(
4661  {
4662  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false }
4663  },
4665  ),
4666  miniScript(miniScript) {}
4667  const string getMethodName() override {
4668  return "world.body.getTransform";
4669  }
4670  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4671  string bodyId;
4672  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true) {
4673  auto body = miniScript->context->getWorld()->getBody(bodyId);
4674  if (body != nullptr) {
4675  // get transform and make sure its a euler transform
4676  auto transform = body->getTransform();
4677  auto euler = transform.getTransformMatrix().computeEulerAngles();
4678  while (transform.getRotationCount() > 3) transform.removeRotation(transform.getRotationCount() - 1);
4679  while (transform.getRotationCount() < 3) transform.addRotation(Vector3(), 0.0f);
4680  transform.setRotationAxis(0, Vector3(0.0f, 0.0f, 1.0f));
4681  transform.setRotationAxis(1, Vector3(0.0f, 1.0f, 0.0f));
4682  transform.setRotationAxis(2, Vector3(1.0f, 0.0f, 0.0f));
4683  transform.setRotationAngle(0, euler.getZ());
4684  transform.setRotationAngle(1, euler.getY());
4685  transform.setRotationAngle(2, euler.getX());
4686  transform.update();
4687  miniScript->setValue(returnValue, transform);
4688  } else {
4689  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4690  }
4691  } else {
4692  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4693  miniScript->startErrorScript();
4694  }
4695  }
4696  const vector<string>& getContextFunctions() {
4697  return CONTEXTFUNCTIONS_LOGIC;
4698  }
4699  };
4700  registerMethod(new ScriptMethodBodyGetTransform(this));
4701  }
4702  {
4703  //
4704  class ScriptMethodBodySetTransform: public ScriptMethod {
4705  private:
4706  LogicMiniScript* miniScript { nullptr };
4707  public:
4708  ScriptMethodBodySetTransform(LogicMiniScript* miniScript):
4709  ScriptMethod(
4710  {
4711  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false },
4712  { .type = TYPE_TRANSFORM, .name = "transform", .optional = false, .reference = false, .nullable = false }
4713  },
4714  ScriptVariableType::TYPE_NULL
4715  ),
4716  miniScript(miniScript) {}
4717  const string getMethodName() override {
4718  return "world.body.setTransform";
4719  }
4720  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4721  string bodyId;
4722  Transform transform;
4723  if (miniScript->getStringValue(argumentValues, 0, bodyId) == true &&
4724  miniScript->getTransformValue(argumentValues, 1, transform) == true) {
4725  auto body = miniScript->context->getWorld()->getBody(bodyId);
4726  if (body != nullptr) {
4727  body->setTransform(transform);
4728  } else {
4729  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4730  }
4731  } else {
4732  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4733  miniScript->startErrorScript();
4734  }
4735  }
4736  const vector<string>& getContextFunctions() {
4737  return CONTEXTFUNCTIONS_LOGIC;
4738  }
4739  };
4740  registerMethod(new ScriptMethodBodySetTransform(this));
4741  }
4742  {
4743  //
4744  class ScriptMethodWorldDetermineHeight: public ScriptMethod {
4745  private:
4746  LogicMiniScript* miniScript { nullptr };
4747  public:
4748  ScriptMethodWorldDetermineHeight(LogicMiniScript* miniScript):
4749  ScriptMethod(
4750  {
4751  { .type = ScriptVariableType::TYPE_INTEGER, .name = "collisionTypeIds", .optional = false, .reference = false, .nullable = false },
4752  { .type = ScriptVariableType::TYPE_FLOAT, .name = "stepUpMax", .optional = false, .reference = false, .nullable = false },
4753  { .type = TYPE_VECTOR3, .name = "point", .optional = false, .reference = false, .nullable = false },
4754  { .type = TYPE_VECTOR3, .name = "heightPoint", .optional = false, .reference = true, .nullable = false },
4755  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = true, .reference = true, .nullable = false },
4756  { .type = ScriptVariableType::TYPE_FLOAT, .name = "minHeight", .optional = true, .reference = false, .nullable = false },
4757  { .type = ScriptVariableType::TYPE_FLOAT, .name = "maxHeight", .optional = true, .reference = false, .nullable = false }
4758  },
4759  ScriptVariableType::TYPE_BOOLEAN
4760  ),
4761  miniScript(miniScript) {}
4762  const string getMethodName() override {
4763  return "world.determineHeight";
4764  }
4765  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4766  int64_t collisionTypeIds;
4767  float stepUpMax;
4768  Vector3 point;
4769  Vector3 heightPoint;
4770  float minHeight = -10000.0f;
4771  float maxHeight = 10000.0f;
4772  if (miniScript->getIntegerValue(argumentValues, 0, collisionTypeIds) == true &&
4773  miniScript->getFloatValue(argumentValues, 1, stepUpMax) == true &&
4774  miniScript->getVector3Value(argumentValues, 2, point) == true &&
4775  miniScript->getVector3Value(argumentValues, 3, heightPoint) == true &&
4776  miniScript->getFloatValue(argumentValues, 5, minHeight, true) == true &&
4777  miniScript->getFloatValue(argumentValues, 6, maxHeight, true) == true) {
4778  auto body = miniScript->context->getWorld()->determineHeight(collisionTypeIds, stepUpMax, point, heightPoint, minHeight, maxHeight);
4779  if (body != nullptr) {
4780  miniScript->setValue(argumentValues[3], heightPoint);
4781  if (argumentValues.size() >= 5) argumentValues[4].setValue(body->getId());
4782  returnValue = true;
4783  } else {
4784  returnValue = false;
4785  }
4786  } else {
4787  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4788  miniScript->startErrorScript();
4789  }
4790  }
4791  const vector<string>& getContextFunctions() {
4792  return CONTEXTFUNCTIONS_LOGIC;
4793  }
4794  };
4795  registerMethod(new ScriptMethodWorldDetermineHeight(this));
4796  }
4797  {
4798  //
4799  class ScriptMethodWorldDoRayCasting: public ScriptMethod {
4800  private:
4801  LogicMiniScript* miniScript { nullptr };
4802  public:
4803  ScriptMethodWorldDoRayCasting(LogicMiniScript* miniScript):
4804  ScriptMethod(
4805  {
4806  { .type = ScriptVariableType::TYPE_INTEGER, .name = "collisionTypeIds", .optional = false, .reference = false, .nullable = false },
4807  { .type = TYPE_VECTOR3, .name = "start", .optional = false, .reference = false, .nullable = false },
4808  { .type = TYPE_VECTOR3, .name = "end", .optional = false, .reference = false, .nullable = false },
4809  { .type = TYPE_VECTOR3, .name = "hitPoint", .optional = false, .reference = true, .nullable = false },
4810  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = true, .reference = true, .nullable = false },
4811  { .type = ScriptVariableType::TYPE_STRING, .name = "actorId", .optional = true, .reference = false, .nullable = false },
4812  },
4813  ScriptVariableType::TYPE_BOOLEAN
4814  ),
4815  miniScript(miniScript) {}
4816  const string getMethodName() override {
4817  return "world.doRayCasting";
4818  }
4819  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4820  int64_t collisionTypeIds;
4821  Vector3 start;
4822  Vector3 end;
4823  Vector3 hitPoint;
4824  string actorId;
4825  if (miniScript->getIntegerValue(argumentValues, 0, collisionTypeIds) == true &&
4826  miniScript->getVector3Value(argumentValues, 1, start) == true &&
4827  miniScript->getVector3Value(argumentValues, 2, end) == true &&
4828  miniScript->getStringValue(argumentValues, 5, actorId, true) == true) {
4829  auto body = miniScript->context->getWorld()->doRayCasting(collisionTypeIds, start, end, hitPoint, actorId);
4830  if (body != nullptr) {
4831  miniScript->setValue(argumentValues[3], hitPoint);
4832  if (argumentValues.size() >= 5) argumentValues[4].setValue(body->getId());
4833  miniScript->setValue(returnValue, true);
4834  } else {
4835  miniScript->setValue(returnValue, false);
4836  }
4837  } else {
4838  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4839  miniScript->startErrorScript();
4840  }
4841  }
4842  const vector<string>& getContextFunctions() {
4843  return CONTEXTFUNCTIONS_LOGIC;
4844  }
4845  };
4846  registerMethod(new ScriptMethodWorldDoRayCasting(this));
4847  }
4848  {
4849  //
4850  class ScriptMethodWorldDoCollide: public ScriptMethod {
4851  private:
4852  LogicMiniScript* miniScript { nullptr };
4853  public:
4854  ScriptMethodWorldDoCollide(LogicMiniScript* miniScript):
4855  ScriptMethod(
4856  {
4857  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId1", .optional = false, .reference = false, .nullable = false },
4858  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId2", .optional = false, .reference = false, .nullable = false }
4859  },
4860  ScriptVariableType::TYPE_BOOLEAN
4861  ),
4862  miniScript(miniScript) {}
4863  const string getMethodName() override {
4864  return "world.doCollide";
4865  }
4866  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4867  string bodyId1;
4868  string bodyId2;
4869  if (miniScript->getStringValue(argumentValues, 0, bodyId1) == true &&
4870  miniScript->getStringValue(argumentValues, 1, bodyId2) == true) {
4871  auto body1 = miniScript->context->getWorld()->getBody(bodyId1);
4872  auto body2 = miniScript->context->getWorld()->getBody(bodyId2);
4873  if (body1 == nullptr) {
4874  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body1 not found: " + bodyId1);
4875  } else
4876  if (body2 == nullptr) {
4877  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body2 not found: " + bodyId2);
4878  } else {
4879  returnValue = miniScript->context->getWorld()->doCollide(body1, body2);
4880  }
4881  } else {
4882  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4883  miniScript->startErrorScript();
4884  }
4885  }
4886  const vector<string>& getContextFunctions() {
4887  return CONTEXTFUNCTIONS_LOGIC;
4888  }
4889  };
4890  registerMethod(new ScriptMethodWorldDoCollide(this));
4891  }
4892  {
4893  //
4894  class ScriptMethodWorldDoesCollideWith: public ScriptMethod {
4895  private:
4896  LogicMiniScript* miniScript { nullptr };
4897  public:
4898  ScriptMethodWorldDoesCollideWith(LogicMiniScript* miniScript):
4899  ScriptMethod(
4900  {
4901  { .type = ScriptVariableType::TYPE_INTEGER, .name = "collisionTypeIds", .optional = false, .reference = false, .nullable = false },
4902  { .type = ScriptVariableType::TYPE_STRING, .name = "bodyId", .optional = false, .reference = false, .nullable = false }
4903  },
4904  ScriptVariableType::TYPE_ARRAY
4905  ),
4906  miniScript(miniScript) {}
4907  const string getMethodName() override {
4908  return "world.doesCollideWith";
4909  }
4910  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4911  int64_t collisionTypeIds;
4912  string bodyId;
4913  if (miniScript->getIntegerValue(argumentValues, 0, collisionTypeIds) == true &&
4914  miniScript->getStringValue(argumentValues, 1, bodyId) == true) {
4915  auto body = miniScript->context->getWorld()->getBody(bodyId);
4916  if (body == nullptr) {
4917  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": body not found: " + bodyId);
4918  } else {
4919  vector<Body*> collisionBodies;
4920  miniScript->context->getWorld()->doesCollideWith(collisionTypeIds, body, collisionBodies);
4921  returnValue.setType(EngineMiniScript::TYPE_ARRAY);
4922  for (auto collisionBody: collisionBodies) {
4923  returnValue.pushArrayEntry(collisionBody->getId());
4924  }
4925  }
4926  } else {
4927  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
4928  miniScript->startErrorScript();
4929  }
4930  }
4931  const vector<string>& getContextFunctions() {
4932  return CONTEXTFUNCTIONS_LOGIC;
4933  }
4934  };
4935  registerMethod(new ScriptMethodWorldDoesCollideWith(this));
4936  }
4937  // path finding
4938  {
4939  //
4940  class ScriptMethodPathFindingSTATE_IDLE: public ScriptMethod {
4941  private:
4942  LogicMiniScript* miniScript { nullptr };
4943  public:
4944  ScriptMethodPathFindingSTATE_IDLE(LogicMiniScript* miniScript):
4945  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
4946  miniScript(miniScript) {}
4947  const string getMethodName() override {
4948  return "pathfinding.STATE_IDLE";
4949  }
4950  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4951  returnValue = static_cast<int64_t>(Context::PathFindingThread::STATE_IDLE);
4952  }
4953  const vector<string>& getContextFunctions() {
4954  return CONTEXTFUNCTIONS_LOGIC;
4955  }
4956  };
4957  registerMethod(new ScriptMethodPathFindingSTATE_IDLE(this));
4958  }
4959  {
4960  //
4961  class ScriptMethodPathFindingSTATE_TRYLOCK_FAILED: public ScriptMethod {
4962  private:
4963  LogicMiniScript* miniScript { nullptr };
4964  public:
4965  ScriptMethodPathFindingSTATE_TRYLOCK_FAILED(LogicMiniScript* miniScript):
4966  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
4967  miniScript(miniScript) {}
4968  const string getMethodName() override {
4969  return "pathfinding.STATE_TRYLOCK_FAILED";
4970  }
4971  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4972  returnValue = static_cast<int64_t>(Context::PathFindingThread::STATE_TRYLOCK_FAILED);
4973  }
4974  const vector<string>& getContextFunctions() {
4975  return CONTEXTFUNCTIONS_LOGIC;
4976  }
4977  };
4978  registerMethod(new ScriptMethodPathFindingSTATE_TRYLOCK_FAILED(this));
4979  }
4980  {
4981  //
4982  class ScriptMethodPathFindingSTATE_PATHFINDING_OTHER: public ScriptMethod {
4983  private:
4984  LogicMiniScript* miniScript { nullptr };
4985  public:
4986  ScriptMethodPathFindingSTATE_PATHFINDING_OTHER(LogicMiniScript* miniScript):
4987  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
4988  miniScript(miniScript) {}
4989  const string getMethodName() override {
4990  return "pathfinding.STATE_PATHFINDING_OTHER";
4991  }
4992  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
4993  returnValue = static_cast<int64_t>(Context::PathFindingThread::STATE_PATHFINDING_OTHER);
4994  }
4995  const vector<string>& getContextFunctions() {
4996  return CONTEXTFUNCTIONS_LOGIC;
4997  }
4998  };
4999  registerMethod(new ScriptMethodPathFindingSTATE_PATHFINDING_OTHER(this));
5000  }
5001  {
5002  //
5003  class ScriptMethodPathFindingSTATE_PATHFINDING: public ScriptMethod {
5004  private:
5005  LogicMiniScript* miniScript { nullptr };
5006  public:
5007  ScriptMethodPathFindingSTATE_PATHFINDING(LogicMiniScript* miniScript):
5008  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
5009  miniScript(miniScript) {}
5010  const string getMethodName() override {
5011  return "pathfinding.STATE_PATHFINDING";
5012  }
5013  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
5014  returnValue = static_cast<int64_t>(Context::PathFindingThread::STATE_PATHFINDING);
5015  }
5016  const vector<string>& getContextFunctions() {
5017  return CONTEXTFUNCTIONS_LOGIC;
5018  }
5019  };
5020  registerMethod(new ScriptMethodPathFindingSTATE_PATHFINDING(this));
5021  }
5022  {
5023  //
5024  class ScriptMethodPathFindingSTATE_PATHFINDING_FAILED: public ScriptMethod {
5025  private:
5026  LogicMiniScript* miniScript { nullptr };
5027  public:
5028  ScriptMethodPathFindingSTATE_PATHFINDING_FAILED(LogicMiniScript* miniScript):
5029  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
5030  miniScript(miniScript) {}
5031  const string getMethodName() override {
5032  return "pathfinding.STATE_PATHFINDING_FAILED";
5033  }
5034  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
5035  returnValue = static_cast<int64_t>(Context::PathFindingThread::STATE_PATHFINDING_FAILED);
5036  }
5037  const vector<string>& getContextFunctions() {
5038  return CONTEXTFUNCTIONS_LOGIC;
5039  }
5040  };
5041  registerMethod(new ScriptMethodPathFindingSTATE_PATHFINDING_FAILED(this));
5042  }
5043  {
5044  //
5045  class ScriptMethodPathFindingSTATE_PATHFINDING_SUCCESS: public ScriptMethod {
5046  private:
5047  LogicMiniScript* miniScript { nullptr };
5048  public:
5049  ScriptMethodPathFindingSTATE_PATHFINDING_SUCCESS(LogicMiniScript* miniScript):
5050  ScriptMethod({}, ScriptVariableType::TYPE_INTEGER),
5051  miniScript(miniScript) {}
5052  const string getMethodName() override {
5053  return "pathfinding.STATE_PATHFINDING_SUCCESS";
5054  }
5055  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
5056  returnValue = static_cast<int64_t>(Context::PathFindingThread::STATE_PATHFINDING_SUCCESS);
5057  }
5058  const vector<string>& getContextFunctions() {
5059  return CONTEXTFUNCTIONS_LOGIC;
5060  }
5061  };
5062  registerMethod(new ScriptMethodPathFindingSTATE_PATHFINDING_SUCCESS(this));
5063  }
5064  {
5065  //
5066  class ScriptMethodPathFindingFindPath: public ScriptMethod {
5067  private:
5068  LogicMiniScript* miniScript { nullptr };
5069  public:
5070  ScriptMethodPathFindingFindPath(LogicMiniScript* miniScript):
5071  ScriptMethod(
5072  {
5073  { .type = ScriptVariableType::TYPE_STRING, .name = "logicId", .optional = false, .reference = false, .nullable = false },
5074  { .type = TYPE_VECTOR3, .name = "startPosition", .optional = false, .reference = false, .nullable = false },
5075  { .type = TYPE_VECTOR3, .name = "endPosition", .optional = false, .reference = false, .nullable = false },
5076  { .type = ScriptVariableType::TYPE_ARRAY, .name = "path", .optional = false, .reference = true, .nullable = false },
5077  },
5078  ScriptVariableType::TYPE_INTEGER
5079  ),
5080  miniScript(miniScript) {}
5081  const string getMethodName() override {
5082  return "pathfinding.findPath";
5083  }
5084  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
5085  string logicId;
5086  Vector3 startPosition;
5087  Vector3 endPosition;
5088  if (argumentValues.size() == 4 &&
5089  miniScript->getStringValue(argumentValues, 0, logicId) == true &&
5090  miniScript->getVector3Value(argumentValues, 1, startPosition) == true &&
5091  miniScript->getVector3Value(argumentValues, 2, endPosition) == true) {
5092  argumentValues[3].setType(EngineMiniScript::TYPE_ARRAY);
5093  vector<Vector3> path;
5094  auto pathFindingState = miniScript->context->getPathFinding()->findPath(logicId, logicId, startPosition, endPosition, path);
5095  returnValue = static_cast<int64_t>(pathFindingState);
5096  for (const auto& position: path) {
5097  MiniScript::ScriptVariable positionVariable;
5098  miniScript->setValue(positionVariable, position);
5099  argumentValues[3].pushArrayEntry(positionVariable);
5100  };
5101  } else {
5102  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
5103  miniScript->startErrorScript();
5104  }
5105  }
5106  const vector<string>& getContextFunctions() {
5107  return CONTEXTFUNCTIONS_LOGIC;
5108  }
5109  };
5110  registerMethod(new ScriptMethodPathFindingFindPath(this));
5111  }
5112  // scene
5113  {
5114  //
5115  class ScriptMethodSceneGetWidth: public ScriptMethod {
5116  private:
5117  LogicMiniScript* miniScript { nullptr };
5118  public:
5119  ScriptMethodSceneGetWidth(LogicMiniScript* miniScript):
5120  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
5121  miniScript(miniScript) {}
5122  const string getMethodName() override {
5123  return "scene.getWidth";
5124  }
5125  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
5126  miniScript->setValue(returnValue, miniScript->context->getScene()->getBoundingBox()->getDimensions().getX());
5127  }
5128  const vector<string>& getContextFunctions() {
5129  return CONTEXTFUNCTIONS_ALL;
5130  }
5131  };
5132  registerMethod(new ScriptMethodSceneGetWidth(this));
5133  }
5134  {
5135  //
5136  class ScriptMethodSceneGetHeight: public ScriptMethod {
5137  private:
5138  LogicMiniScript* miniScript { nullptr };
5139  public:
5140  ScriptMethodSceneGetHeight(LogicMiniScript* miniScript):
5141  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
5142  miniScript(miniScript) {}
5143  const string getMethodName() override {
5144  return "scene.getHeight";
5145  }
5146  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
5147  returnValue = miniScript->context->getScene()->getBoundingBox()->getDimensions().getY();
5148  }
5149  const vector<string>& getContextFunctions() {
5150  return CONTEXTFUNCTIONS_ALL;
5151  }
5152  };
5153  registerMethod(new ScriptMethodSceneGetHeight(this));
5154  }
5155  {
5156  //
5157  class ScriptMethodSceneGetDepth: public ScriptMethod {
5158  private:
5159  LogicMiniScript* miniScript { nullptr };
5160  public:
5161  ScriptMethodSceneGetDepth(LogicMiniScript* miniScript):
5162  ScriptMethod({}, ScriptVariableType::TYPE_FLOAT),
5163  miniScript(miniScript) {}
5164  const string getMethodName() override {
5165  return "scene.getDepth";
5166  }
5167  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
5168  returnValue = miniScript->context->getScene()->getBoundingBox()->getDimensions().getZ();
5169  }
5170  const vector<string>& getContextFunctions() {
5171  return CONTEXTFUNCTIONS_ALL;
5172  }
5173  };
5174  registerMethod(new ScriptMethodSceneGetDepth(this));
5175  }
5176  // sceneconnector
5177  {
5178  //
5179  class ScriptMethodSceneConnectorSpawnPrototype: public ScriptMethod {
5180  private:
5181  LogicMiniScript* miniScript { nullptr };
5182  public:
5183  ScriptMethodSceneConnectorSpawnPrototype(LogicMiniScript* miniScript):
5184  ScriptMethod(
5185  {
5186  { .type = ScriptVariableType::TYPE_STRING, .name = "pathName", .optional = false, .reference = false, .nullable = false },
5187  { .type = ScriptVariableType::TYPE_STRING, .name = "fileName", .optional = false, .reference = false, .nullable = false },
5188  { .type = ScriptVariableType::TYPE_STRING, .name = "id", .optional = false, .reference = false, .nullable = false },
5189  { .type = TYPE_TRANSFORM, .name = "transform", .optional = false, .reference = false, .nullable = false },
5190  { .type = ScriptVariableType::TYPE_STRING, .name = "hierarchyId", .optional = true, .reference = false, .nullable = false },
5191  { .type = ScriptVariableType::TYPE_STRING, .name = "hierarchyParentId", .optional = true, .reference = false, .nullable = false },
5192  },
5193  ScriptVariableType::TYPE_NULL
5194  ),
5195  miniScript(miniScript) {}
5196  const string getMethodName() override {
5197  return "sceneconnector.spawnPrototype";
5198  }
5199  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
5200  string pathName;
5201  string fileName;
5202  string id;
5203  Transform transform;
5204  string hierarchyId;
5205  string hierarchyParentId;
5206  if (miniScript->getStringValue(argumentValues, 0, pathName) == true &&
5207  miniScript->getStringValue(argumentValues, 1, fileName) == true &&
5208  miniScript->getStringValue(argumentValues, 2, id) == true &&
5209  miniScript->getTransformValue(argumentValues, 3, transform) == true &&
5210  miniScript->getStringValue(argumentValues, 4, hierarchyId, true) == true &&
5211  miniScript->getStringValue(argumentValues, 5, hierarchyParentId, true) == true) {
5212  miniScript->prototypesToAddMutex.lock();
5213  try {
5214  auto _pathName = pathName;
5215  if (miniScript->context->getApplicationRootPathName().empty() == false) {
5216  _pathName = FileSystem::getInstance()->getCanonicalURI(miniScript->context->getApplicationRootPathName(), pathName);
5217  }
5218  Prototype* prototype = nullptr;
5219  auto canonicalPath = FileSystem::getInstance()->getCanonicalURI(_pathName, fileName);
5220  auto prototypeIt = miniScript->prototypes.find(canonicalPath);
5221  if (prototypeIt != miniScript->prototypes.end()) {
5222  prototypeIt->second.counter++;
5223  prototype = prototypeIt->second.prototype.get();
5224  } else {
5225  prototype = PrototypeReader::read(_pathName, fileName);
5226  miniScript->prototypes[canonicalPath] = {
5227  .counter = 1,
5228  .prototype = unique_ptr<Prototype>(prototype)
5229  };
5230  }
5231  miniScript->enginePrototypesToAdd.emplace_back(
5233  prototype,
5234  id,
5235  string(),
5236  transform,
5237  hierarchyId,
5238  hierarchyParentId
5239  );
5240  miniScript->physicsPrototypesToAdd.emplace_back(
5242  prototype,
5243  id,
5244  string(),
5245  transform,
5246  hierarchyId,
5247  hierarchyParentId
5248  );
5249  } catch (Exception& exception) {
5250  miniScript->prototypesToAddMutex.unlock();
5251  Console::println("ScriptMethodSceneConnectorSpawnPrototype::executeMethod(): An error occurred: " + string(exception.what()));
5252  miniScript->startErrorScript();
5253  }
5254  miniScript->prototypesToAddMutex.unlock();
5255  } else {
5256  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
5257  miniScript->startErrorScript();
5258  }
5259  }
5260  const vector<string>& getContextFunctions() {
5261  return CONTEXTFUNCTIONS_LOGIC;
5262  }
5263  };
5264  registerMethod(new ScriptMethodSceneConnectorSpawnPrototype(this));
5265  }
5266  {
5267  //
5268  class ScriptMethodSceneConnectorAttachPrototype: public ScriptMethod {
5269  private:
5270  LogicMiniScript* miniScript { nullptr };
5271  public:
5272  ScriptMethodSceneConnectorAttachPrototype(LogicMiniScript* miniScript):
5273  ScriptMethod(
5274  {
5275  { .type = ScriptVariableType::TYPE_STRING, .name = "pathName", .optional = false, .reference = false, .nullable = false },
5276  { .type = ScriptVariableType::TYPE_STRING, .name = "fileName", .optional = false, .reference = false, .nullable = false },
5277  { .type = ScriptVariableType::TYPE_STRING, .name = "id", .optional = false, .reference = false, .nullable = false },
5278  { .type = ScriptVariableType::TYPE_STRING, .name = "attachNodeId", .optional = false, .reference = false, .nullable = false },
5279  { .type = TYPE_TRANSFORM, .name = "transform", .optional = false, .reference = false, .nullable = false },
5280  { .type = ScriptVariableType::TYPE_STRING, .name = "parentId", .optional = true, .reference = false, .nullable = false },
5281  },
5282  ScriptVariableType::TYPE_NULL
5283  ),
5284  miniScript(miniScript) {}
5285  const string getMethodName() override {
5286  return "sceneconnector.attachPrototype";
5287  }
5288  void executeMethod(span<ScriptVariable>& argumentValues, ScriptVariable& returnValue, const ScriptStatement& statement) override {
5289  string pathName;
5290  string fileName;
5291  string id;
5292  string attachNodeId;
5293  Transform transform;
5294  string hierarchyParentId;
5295  if (miniScript->getStringValue(argumentValues, 0, pathName) == true &&
5296  miniScript->getStringValue(argumentValues, 1, fileName) == true &&
5297  miniScript->getStringValue(argumentValues, 2, id) == true &&
5298  miniScript->getStringValue(argumentValues, 3, attachNodeId) == true &&
5299  miniScript->getTransformValue(argumentValues, 4, transform) == true &&
5300  miniScript->getStringValue(argumentValues, 5, hierarchyParentId, true) == true) {
5301  miniScript->prototypesToAddMutex.lock();
5302  try {
5303  auto _pathName = pathName;
5304  if (miniScript->context->getApplicationRootPathName().empty() == false) {
5305  _pathName = FileSystem::getInstance()->getCanonicalURI(miniScript->context->getApplicationRootPathName(), pathName);
5306  }
5307  Prototype* prototype = nullptr;
5308  auto canonicalPath = FileSystem::getInstance()->getCanonicalURI(_pathName, fileName);
5309  auto prototypeIt = miniScript->prototypes.find(canonicalPath);
5310  if (prototypeIt != miniScript->prototypes.end()) {
5311  prototypeIt->second.counter++;
5312  prototype = prototypeIt->second.prototype.get();
5313  } else {
5314  prototype = PrototypeReader::read(_pathName, fileName);
5315  miniScript->prototypes[canonicalPath] = {
5316  .counter = 1,
5317  .prototype = unique_ptr<Prototype>(prototype)
5318  };
5319  }
5320  miniScript->enginePrototypesToAdd.emplace_back(
5322  prototype,
5323  id,
5324  attachNodeId,
5325  transform,
5326  miniScript->logic->getId(),
5327  hierarchyParentId
5328  );
5329  miniScript->physicsPrototypesToAdd.emplace_back(
5331  prototype,
5332  id,
5333  attachNodeId,
5334  transform,
5335  miniScript->logic->getId(),
5336  hierarchyParentId
5337  );
5338  } catch (Exception& exception) {
5339  miniScript->prototypesToAddMutex.unlock();
5340  Console::println("ScriptMethodSceneConnectorAttachPrototype::executeMethod(): An error occurred: " + string(exception.what()));
5341  miniScript->startErrorScript();
5342  }
5343  miniScript->prototypesToAddMutex.unlock();
5344  } else {
5345  Console::println(getMethodName() + "(): " + miniScript->getStatementInformation(statement) + ": argument mismatch: expected arguments: " + miniScript->getArgumentInformation(getMethodName()));
5346  miniScript->startErrorScript();
5347  }
5348  }
5349  const vector<string>& getContextFunctions() {
5350  return CONTEXTFUNCTIONS_LOGIC;
5351  }
5352  };
5353  registerMethod(new ScriptMethodSceneConnectorAttachPrototype(this));
5354  }
5355 }
5356 
5358 }
5359 
5360 void LogicMiniScript::collectHIDEvents(vector<GUIMouseEvent>& mouseEvents, vector<GUIKeyboardEvent>& keyEvents) {
5361  // keyboard events
5362  keyboardTypedChars.clear();
5363  keyboardControlDown = false;
5364  keyboardMetaDown = false;
5365  keyboardAltDown = false;
5366  keyboardShiftDown = false;
5367  for (const auto& event: keyEvents) {
5368  // processed already?
5369  if (event.isProcessed() == true) continue;
5370  // key pressed
5371  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
5372  keyboardChars.insert(event.getKeyChar());
5373  keyboardKeys.insert(event.getKeyCode());
5374  } else
5375  // key released
5376  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_RELEASED) {
5377  keyboardChars.erase(event.getKeyChar());
5378  keyboardKeys.erase(event.getKeyCode());
5379  } else
5380  // key typed
5381  if (event.getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_TYPED) {
5382  Character::appendToString(keyboardTypedChars, event.getKeyChar());
5383  }
5384  // extra keys
5385  if (event.isControlDown() == true) keyboardControlDown = true;
5386  if (event.isMetaDown() == true) keyboardMetaDown = true;
5387  if (event.isAltDown() == true) keyboardAltDown = true;
5388  if (event.isShiftDown() == true) keyboardShiftDown = true;
5389  }
5390 
5391  // mouse
5392  mouseDown.fill(false);
5393  mouseUp.fill(false);
5394  mouseDragging.fill(false);
5395  mouseMoved = false;
5396  mouseWheelX = 0.0f;
5397  mouseWheelY = 0.0f;
5398  mouseWheelZ = 0.0f;
5399  for (const auto& event: mouseEvents) {
5400  // mouse move
5401  if (event.isProcessed() == false && event.getType() == GUIMouseEvent::MOUSEEVENT_MOVED) {
5402  mouseMoved = true;
5403  } else
5404  // on press and drag
5405  // store button and mouse dragging properties
5406  if (event.isProcessed() == false && event.getType() == GUIMouseEvent::MOUSEEVENT_PRESSED) {
5407  if (event.getButton() != GUIMouseEvent::MOUSEEVENT_BUTTON_NONE) {
5408  mouseDown[event.getButton() - 1] = true;
5409  }
5410  } else
5411  if (event.isProcessed() == false && event.getType() == GUIMouseEvent::MOUSEEVENT_DRAGGED) {
5412  if (event.getButton() != GUIMouseEvent::MOUSEEVENT_BUTTON_NONE) {
5413  mouseDragging[event.getButton() - 1] = true;
5414  }
5415  } else
5416  // on release
5417  // store release
5418  if (event.getType() == GUIMouseEvent::MOUSEEVENT_RELEASED) {
5419  if (event.getButton() != GUIMouseEvent::MOUSEEVENT_BUTTON_NONE) {
5420  mouseUp[event.getButton() - 1] = true;
5421  }
5422  } else
5423  // wheel
5424  if (event.isProcessed() == false && event.getType() == GUIMouseEvent::MOUSEEVENT_WHEEL_MOVED) {
5425  mouseWheelX+= event.getWheelX();
5426  mouseWheelY+= event.getWheelY();
5427  mouseWheelZ+= event.getWheelZ();
5428  }
5429  // always store mouse position
5430  mouseX = event.getX();
5431  mouseXUnscaled = event.getXUnscaled();
5432  mouseY = event.getY();
5433  mouseYUnscaled = event.getYUnscaled();
5434  // extra keys
5435  if (event.isControlDown() == true) keyboardControlDown = true;
5436  if (event.isMetaDown() == true) keyboardMetaDown = true;
5437  if (event.isAltDown() == true) keyboardAltDown = true;
5438  if (event.isShiftDown() == true) keyboardShiftDown = true;
5439  }
5440 }
Interface to audio module.
Definition: Audio.h:29
void setListenerOrientationAt(const Vector3 &listenerOrientationAt)
Set listener orientation at.
Definition: Audio.h:121
void setListenerOrientationUp(const Vector3 &listenerOrientationUp)
Set listener orientation up.
Definition: Audio.h:136
const Vector3 & getListenerOrientationAt() const
Definition: Audio.h:113
const Vector3 & getListenerPosition() const
Definition: Audio.h:83
const Vector3 & getListenerOrientationUp() const
Definition: Audio.h:128
void setListenerPosition(const Vector3 &listenerPosition)
Set listener position.
Definition: Audio.h:91
const Vector3 & getLookAt() const
Definition: Camera.h:234
void setFovX(float fovX)
Set field of view X.
Definition: Camera.h:137
void setUpVector(const Vector3 &upVector)
Set up vector.
Definition: Camera.h:182
void setLookFrom(const Vector3 &lookFrom)
Set look from.
Definition: Camera.h:227
float getFovX() const
Definition: Camera.h:129
static Vector3 computeUpVector(const Vector3 &lookFrom, const Vector3 &lookAt)
Computes the up vector for given look from and look at vectors.
Definition: Camera.cpp:48
const Vector3 & getLookFrom() const
Definition: Camera.h:219
void setLookAt(const Vector3 &lookAt)
Set look at.
Definition: Camera.h:242
const Vector3 & getUpVector() const
Definition: Camera.h:174
Color 4 definition class.
Definition: Color4.h:18
Engine main class.
Definition: Engine.h:131
void dumpShaders()
Print registered shaders and it default parameters to console.
Definition: Engine.cpp:2644
static void setAnimationComputationReduction1Distance(float animationComputationReduction1Distance)
Set distance of animated object including skinned objects from camera which animation computation wil...
Definition: Engine.h:801
static float getAnimationComputationReduction2Distance()
Definition: Engine.h:808
Camera * getCamera()
Definition: Engine.h:1071
int32_t getWidth()
Definition: Engine.h:1029
Vector3 computeWorldCoordinateByMousePosition(int32_t mouseX, int32_t mouseY, float z)
Compute world coordinate from mouse position and z value.
Definition: Engine.h:1253
int32_t getHeight()
Definition: Engine.h:1036
void dumpEntities()
Dump entities.
Definition: Engine.cpp:2904
static void setAnimationComputationReduction2Distance(float animationComputationReduction2Distance)
Set distance of animated object including skinned objects from camera which animation computation wil...
Definition: Engine.h:816
bool computeScreenCoordinateByWorldCoordinate(const Vector3 &worldCoordinate, Vector2 &screenCoordinate, int width=-1, int height=-1)
Convert screen coordinate by world coordinate.
Definition: Engine.cpp:2058
static float getAnimationComputationReduction1Distance()
Definition: Engine.h:793
Entity * getEntity(const string &id)
Returns a entity by given id.
Definition: Engine.h:1175
Entity * getEntityByMousePosition(int32_t mouseX, int32_t mouseY, EntityPickingFilter *filter=nullptr, Node **objectNode=nullptr, ParticleSystem **particleSystemEntity=nullptr)
Retrieves entity by mouse position.
Definition: Engine.h:1275
Timing * getTiming()
Definition: Engine.h:1064
Entity hierarchy to be used with engine class.
Entity * getEntity(const string &id)
Engine entity.
Definition: Entity.h:30
virtual bool isEnabled()=0
virtual const string & getId()=0
virtual const Color4 & getEffectColorAdd() const =0
The effect color will be added to fragment color.
virtual void setEffectColorMul(const Color4 &effectColorMul)=0
Set effect color that will be multiplied with fragment color.
virtual void setTransform(const Transform &transform)=0
Set transform.
virtual const Color4 & getEffectColorMul() const =0
The effect color will be multiplied with fragment color.
@ ENTITYTYPE_ENTITYHIERARCHY
Definition: Entity.h:89
virtual void setPickable(bool pickable)=0
Set this entity pickable.
virtual bool isPickable()=0
virtual void setEffectColorAdd(const Color4 &effectColorAdd)=0
Set effect color that will be added to fragment color.
virtual void setEnabled(bool enabled)=0
Enable/disable rendering.
Object to be used with engine class.
Definition: Object.h:60
Scene engine/physics connector.
Timing class.
Definition: Timing.h:16
int64_t getDeltaTime()
Gets the time passed between last and current frame.
Definition: Timing.h:85
float getAvarageFPS()
Definition: Timing.h:110
float getDeltaTimeSeconds()
Gets the time passed between last and current frame in seconds.
Definition: Timing.h:96
Transform which contain scale, rotations and translation.
Definition: Transform.h:29
virtual void fromMatrix(const Matrix4x4 &matrix, RotationOrder *rotationOrder)
Set up this transform from given matrix and rotation order.
Definition: Transform.cpp:22
const Matrix4x4 & getTransformMatrix() const
Definition: Transform.h:169
PathFindingThread::State findPath(const string &logicId, const string &actorId, const Vector3 &startPosition, const Vector3 &endPosition, vector< Vector3 > &path, int alternativeEndSteps=0, PathFindingCustomTest *customTest=nullptr, bool createFlowMap=false, const vector< Vector3 > flowMapEndPositions=vector< Vector3 >(), const float flowMapWidth=0.0, const float flowMapDepth=0.0, FlowMap **flowMap=nullptr)
Find path.
Definition: Context.cpp:430
PathFinding * getPathFinding()
Get path finding thread.
Definition: Context.h:658
const vector< Logic * > & getLogics()
Definition: Context.h:584
const string & getApplicationRootPathName()
Definition: Context.h:393
Logic * getLogic(const string &id)
Get logic.
Definition: Context.h:560
Entity * getEntity(const string &entityId, const string &childEntityId)
Get entity by given entity id and given child entity id, the latter expects a entity hierarchy to res...
static STATIC_DLL_IMPEXT const vector< string > CONTEXTFUNCTIONS_ENGINE
vector< PrototypeToAdd > enginePrototypesToAdd
void collectHIDEvents(vector< GUIMouseEvent > &mouseEvents, vector< GUIKeyboardEvent > &keyEvents)
Collect HID events.
static STATIC_DLL_IMPEXT const vector< string > CONTEXTFUNCTIONS_LOGIC
unordered_set< int32_t > keyboardKeys
vector< PrototypeToAdd > physicsPrototypesToAdd
unordered_map< string, PrototypeCounter > prototypes
const vector< string > getTranspilationUnits()
unordered_set< int32_t > keyboardChars
static STATIC_DLL_IMPEXT const vector< string > CONTEXTFUNCTIONS_ENGINELOGIC
void playSound(const string &id, int delay=0, float gain=1.0, float pitch=1.0, bool ignoreIfPlaying=false)
TODO: updated sounds that are already playing Play sound.
Definition: Logic.h:143
const string getSignalName()
Get signal name from first signal in signal queue.
Definition: Logic.h:225
bool hasSignal()
Returns if a signal is in signal queue.
Definition: Logic.h:205
Context * getContext()
Definition: Logic.h:89
void addSignal(const string &signal, const vector< EngineMiniScript::ScriptVariable > &arguments)
Add signal.
Definition: Logic.h:214
void removeSignal()
Remove first signal from signal queue.
Definition: Logic.h:252
EngineMiniScript::ScriptVariable getSignalArgument(int idx)
Get signal argument.
Definition: Logic.h:243
const string & getId()
Definition: Logic.h:96
Rigid body class.
Definition: Body.h:41
void setTransform(const Transform &transform)
Set transform.
Definition: Body.h:383
void addTorque(const Vector3 &torque)
Add torque.
Definition: Body.h:438
void setAngularVelocity(const Vector3 &angularVelocity)
Set angular velocity.
Definition: Body.h:338
void setEnabled(bool enabled)
Set up if rigid body is enabled.
Definition: Body.h:215
void setLinearVelocity(const Vector3 &linearVelocity)
Set linear velocity.
Definition: Body.h:319
void setCollisionTypeId(uint16_t typeId)
Set collision type id.
Definition: Body.cpp:112
void addForce(const Vector3 &forceOrigin, const Vector3 &force)
Add force.
Definition: Body.h:417
void setLinearDamping(float linearDamping)
Set linear damping.
Definition: Body.h:353
const Transform & getTransform()
Definition: Body.h:375
void setAngularDamping(float angularDamping)
Set angular damping.
Definition: Body.h:368
void setCollisionTypeIds(uint16_t collisionTypeIds)
Set up collision type ids.
Definition: Body.cpp:120
Body * doRayCasting(uint16_t collisionTypeIds, const Vector3 &start, const Vector3 &end, Vector3 &hitPoint, const string &actorId=string())
Do a ray cast from given start to given end point, if there is any body with given collision type in ...
Definition: World.cpp:449
bool doesCollideWith(uint16_t collisionTypeIds, Body *body, vector< Body * > &collisionBodies)
Check if world collides with given body.
Definition: World.cpp:489
bool doCollide(Body *body1, Body *body2)
Check if body 1 collides with body 2.
Definition: World.cpp:526
Body * getBody(const string &id)
Returns body identified by id.
Definition: World.h:151
Body * determineHeight(uint16_t collisionTypeIds, float stepUpMax, const Vector3 &point, Vector3 &heightPoint, float minHeight=-10000.0f, float maxHeight=10000.0f)
Determine height on x,y,u while respecting step up max.
Definition: World.cpp:405
Axis aligned bounding box used for frustum, this is not directly connectable with physics engine.
Definition: BoundingBox.h:26
const Vector3 & getDimensions() const
Definition: BoundingBox.h:128
Prototype definition.
Definition: Prototype.h:55
Scene definition.
Definition: Scene.h:50
BoundingBox * getBoundingBox()
Definition: Scene.h:199
void setAnimation(const string &id, float speed=1.0f)
Sets up a base animation to play.
Definition: ObjectBase.h:189
void addOverlayAnimation(const string &id)
Overlays a animation above the base animation.
Definition: ObjectBase.h:205
void removeOverlayAnimation(const string &id)
Removes a overlay animation.
Definition: ObjectBase.h:213
bool hasOverlayAnimation(const string &id)
Returns if there is currently running a overlay animation with given id.
Definition: ObjectBase.h:251
void setAnimationSpeed(float speed)
Set up animation speed.
Definition: ObjectBase.h:197
void removeOverlayAnimations()
Removes all overlay animations.
Definition: ObjectBase.h:227
void removeFinishedOverlayAnimations()
Removes all finished overlay animations.
Definition: ObjectBase.h:220
void setNodeTransformMatrix(const string &id, const Matrix4x4 &matrix)
Set node transform matrix.
void unsetNodeTransformMatrix(const string &id)
Unset node transform matrix.
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Definition: Matrix4x4.h:23
Vector3 computeEulerAngles() const
Compute Euler angles (rotation around x, y, z axes)
Definition: Matrix4x4.h:531
Vector2 class representing vector2 mathematical structure and operations with x, y components.
Definition: Vector2.h:20
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
float getY() const
Definition: Vector3.h:117
float getX() const
Definition: Vector3.h:100
float getZ() const
Definition: Vector3.h:134
Vector4 class representing vector4 mathematical structure and operations with x, y,...
Definition: Vector4.h:22
float getY() const
Definition: Vector4.h:159
float getX() const
Definition: Vector4.h:142
float getZ() const
Definition: Vector4.h:176
float getW() const
Definition: Vector4.h:193
File system singleton class.
Definition: FileSystem.h:17
Mutex implementation.
Definition: Mutex.h:19
void unlock()
Unlocks this mutex.
Definition: Mutex.h:54
void lock()
Locks the mutex, additionally mutex locks will block until other locks have been unlocked.
Definition: Mutex.h:47
Character class.
Definition: Character.h:17
Console class.
Definition: Console.h:29
static constexpr ScriptVariableType TYPE_MATRIX4x4
static constexpr ScriptVariableType TYPE_TRANSFORM
static constexpr ScriptVariableType TYPE_VECTOR3
static bool getTransformValue(const span< ScriptVariable > &arguments, int idx, Transform &value, bool optional=false)
Get transform value from given variable.
static constexpr ScriptVariableType TYPE_VECTOR2
bool getVector4Value(const span< ScriptVariable > &arguments, int idx, Vector4 &value, bool optional=false)
Get vector4 value from given variable.
bool getVector3Value(const span< ScriptVariable > &arguments, int idx, Vector3 &value, bool optional=false)
Get vector3 value from given variable.
void setValue(ScriptVariable &variable, bool value)
Set boolean value from given value into variable.
static bool getMatrix4x4Value(const span< ScriptVariable > &arguments, int idx, Matrix4x4 &value, bool optional=false)
Get matrix4x4 value from given variable.
static constexpr ScriptVariableType TYPE_VECTOR4
UTF8 string character iterator.
std::exception Exception
Exception base class.
Definition: Exception.h:18
Particle system entity interface.