JsonExpression.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908
  1. #include "JsonExpression.h"
  2. #include "Dimension.h"
  3. #include "DimensionGenerator.h"
  4. #include "Game.h"
  5. JExpressionMemory::JExpressionMemory()
  6. : ReferenceCounter(),
  7. currentChunk(0)
  8. {}
  9. JExpressionMemory::~JExpressionMemory()
  10. {
  11. if (currentChunk) currentChunk->release();
  12. }
  13. void JExpressionMemory::lock()
  14. {
  15. cs.lock();
  16. }
  17. void JExpressionMemory::unlock()
  18. {
  19. cs.unlock();
  20. }
  21. float JExpressionMemory::getNoise(
  22. Framework::Text name, float x, float y, float z) const
  23. {
  24. Noise* currentNoise = noises.z(name, name.getLength());
  25. if (currentNoise)
  26. return (float)currentNoise->getNoise((double)x, (double)y, (double)z);
  27. return 0.f;
  28. }
  29. void JExpressionMemory::setNoise(Framework::Text name, Noise* noise)
  30. {
  31. noises.set(name, name.getLength(), noise);
  32. }
  33. void JExpressionMemory::setCurrentChunk(Chunk* chunk)
  34. {
  35. if (currentChunk) currentChunk->release();
  36. currentChunk = chunk;
  37. }
  38. float JExpressionMemory::getFloatVariable(const Framework::Text& name) const
  39. {
  40. return floatVariables.get(name, name.getLength());
  41. }
  42. void JExpressionMemory::setFloatVariable(
  43. const Framework::Text& name, float value)
  44. {
  45. floatVariables.set(name, name.getLength(), value);
  46. }
  47. bool JExpressionMemory::getBoolVariable(const Framework::Text& name) const
  48. {
  49. return boolVariables.get(name, name.getLength());
  50. }
  51. void JExpressionMemory::setBoolVariable(const Framework::Text& name, bool value)
  52. {
  53. return boolVariables.set(name, name.getLength(), value);
  54. }
  55. Chunk* JExpressionMemory::zCurrentChunk()
  56. {
  57. return currentChunk;
  58. }
  59. JFloatExpression::JFloatExpression()
  60. : ReferenceCounter()
  61. {}
  62. JBoolExpression::JBoolExpression()
  63. : ReferenceCounter()
  64. {}
  65. JVariableFloatExpression::JVariableFloatExpression()
  66. : JFloatExpression()
  67. {}
  68. float JVariableFloatExpression::getValue(JExpressionMemory* zMemory)
  69. {
  70. return zMemory->getFloatVariable(name);
  71. }
  72. void JVariableFloatExpression::setName(Framework::Text name)
  73. {
  74. this->name = name;
  75. }
  76. Framework::Text JVariableFloatExpression::getName() const
  77. {
  78. return name;
  79. }
  80. JVariableFloatExpressionFactory::JVariableFloatExpressionFactory()
  81. : SubTypeFactory()
  82. {}
  83. JVariableFloatExpression* JVariableFloatExpressionFactory::fromJson(
  84. Framework::JSON::JSONObject* zJson) const
  85. {
  86. JVariableFloatExpression* result = new JVariableFloatExpression();
  87. result->setName(zJson->zValue("name")->asString()->getString());
  88. return result;
  89. }
  90. Framework::JSON::JSONObject* JVariableFloatExpressionFactory::toJsonObject(
  91. JVariableFloatExpression* zObject) const
  92. {
  93. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  94. result->addValue(
  95. "name", new Framework::JSON::JSONString(zObject->getName()));
  96. return result;
  97. }
  98. JSONObjectValidationBuilder* JVariableFloatExpressionFactory::addToValidator(
  99. JSONObjectValidationBuilder* builder) const
  100. {
  101. return builder->withRequiredString("name")->finishString();
  102. }
  103. const char* JVariableFloatExpressionFactory::getTypeToken() const
  104. {
  105. return "variable";
  106. }
  107. JVariableBoolExpression::JVariableBoolExpression()
  108. : JBoolExpression()
  109. {}
  110. bool JVariableBoolExpression::getValue(JExpressionMemory* zMemory)
  111. {
  112. return zMemory->getBoolVariable(name);
  113. }
  114. void JVariableBoolExpression::setName(Framework::Text name)
  115. {
  116. this->name = name;
  117. }
  118. Framework::Text JVariableBoolExpression::getName() const
  119. {
  120. return name;
  121. }
  122. JVariableBoolExpressionFactory::JVariableBoolExpressionFactory()
  123. : SubTypeFactory()
  124. {}
  125. JVariableBoolExpression* JVariableBoolExpressionFactory::fromJson(
  126. Framework::JSON::JSONObject* zJson) const
  127. {
  128. JVariableBoolExpression* result = new JVariableBoolExpression();
  129. result->setName(zJson->zValue("name")->asString()->getString());
  130. return result;
  131. }
  132. Framework::JSON::JSONObject* JVariableBoolExpressionFactory::toJsonObject(
  133. JVariableBoolExpression* zObject) const
  134. {
  135. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  136. result->addValue(
  137. "name", new Framework::JSON::JSONString(zObject->getName()));
  138. return result;
  139. }
  140. JSONObjectValidationBuilder* JVariableBoolExpressionFactory::addToValidator(
  141. JSONObjectValidationBuilder* builder) const
  142. {
  143. return builder->withRequiredString("name")->finishString();
  144. }
  145. const char* JVariableBoolExpressionFactory::getTypeToken() const
  146. {
  147. return "variable";
  148. }
  149. JConstantFloatExpression::JConstantFloatExpression()
  150. : JFloatExpression(),
  151. value(0)
  152. {}
  153. float JConstantFloatExpression::getValue(JExpressionMemory* zMemory)
  154. {
  155. return value;
  156. }
  157. void JConstantFloatExpression::setValue(float value)
  158. {
  159. this->value = value;
  160. }
  161. float JConstantFloatExpression::getValue() const
  162. {
  163. return value;
  164. }
  165. JConstantFloatExpressionFactory::JConstantFloatExpressionFactory()
  166. : SubTypeFactory()
  167. {}
  168. JConstantFloatExpression* JConstantFloatExpressionFactory::fromJson(
  169. Framework::JSON::JSONObject* zJson) const
  170. {
  171. JConstantFloatExpression* result = new JConstantFloatExpression();
  172. result->setValue((float)zJson->zValue("value")->asNumber()->getNumber());
  173. return result;
  174. }
  175. Framework::JSON::JSONObject* JConstantFloatExpressionFactory::toJsonObject(
  176. JConstantFloatExpression* zObject) const
  177. {
  178. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  179. result->addValue(
  180. "value", new Framework::JSON::JSONNumber(zObject->getValue()));
  181. return result;
  182. }
  183. JSONObjectValidationBuilder* JConstantFloatExpressionFactory::addToValidator(
  184. JSONObjectValidationBuilder* builder) const
  185. {
  186. return builder->withRequiredNumber("value")->finishNumber();
  187. }
  188. const char* JConstantFloatExpressionFactory::getTypeToken() const
  189. {
  190. return "constant";
  191. }
  192. JConstantBoolExpression::JConstantBoolExpression()
  193. : JBoolExpression()
  194. {}
  195. bool JConstantBoolExpression::getValue(JExpressionMemory* zMemory)
  196. {
  197. return value;
  198. }
  199. void JConstantBoolExpression::setValue(bool value)
  200. {
  201. this->value = value;
  202. }
  203. bool JConstantBoolExpression::getValue() const
  204. {
  205. return value;
  206. }
  207. JConstantBoolExpressionFactory::JConstantBoolExpressionFactory()
  208. : SubTypeFactory()
  209. {}
  210. JConstantBoolExpression* JConstantBoolExpressionFactory::fromJson(
  211. Framework::JSON::JSONObject* zJson) const
  212. {
  213. JConstantBoolExpression* result = new JConstantBoolExpression();
  214. result->setValue(zJson->zValue("value")->asBool()->getBool());
  215. return result;
  216. }
  217. Framework::JSON::JSONObject* JConstantBoolExpressionFactory::toJsonObject(
  218. JConstantBoolExpression* zObject) const
  219. {
  220. Framework::JSON::JSONObject* zResult = new Framework::JSON::JSONObject();
  221. zResult->addValue(
  222. "value", new Framework::JSON::JSONBool(zObject->getValue()));
  223. return zResult;
  224. }
  225. JSONObjectValidationBuilder* JConstantBoolExpressionFactory::addToValidator(
  226. JSONObjectValidationBuilder* builder) const
  227. {
  228. return builder->withRequiredBool("value")->finishBool();
  229. }
  230. const char* JConstantBoolExpressionFactory::getTypeToken() const
  231. {
  232. return "constant";
  233. }
  234. JNoiseFloatExpression::JNoiseFloatExpression()
  235. : JFloatExpression(),
  236. x(0),
  237. y(0),
  238. z(0)
  239. {}
  240. JNoiseFloatExpression::~JNoiseFloatExpression()
  241. {
  242. if (x) x->release();
  243. if (y) y->release();
  244. if (z) z->release();
  245. }
  246. float JNoiseFloatExpression::getValue(JExpressionMemory* zMemory)
  247. {
  248. return zMemory->getNoise(
  249. name, x->getValue(zMemory), y->getValue(zMemory), z->getValue(zMemory));
  250. }
  251. void JNoiseFloatExpression::setName(Framework::Text name)
  252. {
  253. this->name = name;
  254. }
  255. Framework::Text JNoiseFloatExpression::getName() const
  256. {
  257. return name;
  258. }
  259. void JNoiseFloatExpression::setX(JFloatExpression* x)
  260. {
  261. if (this->x) this->x->release();
  262. this->x = x;
  263. }
  264. JFloatExpression* JNoiseFloatExpression::zX() const
  265. {
  266. return x;
  267. }
  268. void JNoiseFloatExpression::setY(JFloatExpression* y)
  269. {
  270. if (this->y) this->y->release();
  271. this->y = y;
  272. }
  273. JFloatExpression* JNoiseFloatExpression::zY() const
  274. {
  275. return y;
  276. }
  277. void JNoiseFloatExpression::setZ(JFloatExpression* z)
  278. {
  279. if (this->z) this->z->release();
  280. this->z = z;
  281. }
  282. JFloatExpression* JNoiseFloatExpression::zZ() const
  283. {
  284. return z;
  285. }
  286. JNoiseFloatExpressionFactory::JNoiseFloatExpressionFactory()
  287. : SubTypeFactory()
  288. {}
  289. JNoiseFloatExpression* JNoiseFloatExpressionFactory::fromJson(
  290. Framework::JSON::JSONObject* zJson) const
  291. {
  292. JNoiseFloatExpression* result = new JNoiseFloatExpression();
  293. result->setName(zJson->zValue("name")->asString()->getString());
  294. result->setX(Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  295. zJson->zValue("x")));
  296. result->setY(Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  297. zJson->zValue("y")));
  298. result->setZ(Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  299. zJson->zValue("z")));
  300. return result;
  301. }
  302. Framework::JSON::JSONObject* JNoiseFloatExpressionFactory::toJsonObject(
  303. JNoiseFloatExpression* zObject) const
  304. {
  305. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  306. result->addValue(
  307. "name", new Framework::JSON::JSONString(zObject->getName()));
  308. result->addValue(
  309. "x", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zX()));
  310. result->addValue(
  311. "y", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zY()));
  312. result->addValue(
  313. "z", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zZ()));
  314. return result;
  315. }
  316. JSONObjectValidationBuilder* JNoiseFloatExpressionFactory::addToValidator(
  317. JSONObjectValidationBuilder* builder) const
  318. {
  319. return builder->withRequiredString("name")
  320. ->finishString()
  321. ->withRequiredAttribute("x",
  322. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>())
  323. ->withRequiredAttribute("y",
  324. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>())
  325. ->withRequiredAttribute("z",
  326. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>());
  327. }
  328. const char* JNoiseFloatExpressionFactory::getTypeToken() const
  329. {
  330. return "noise";
  331. }
  332. JOperatorFloatExpression::JOperatorFloatExpression()
  333. : JFloatExpression(),
  334. accumulator([](float a, float b) { return 0.f; })
  335. {}
  336. float JOperatorFloatExpression::getValue(JExpressionMemory* zMemory)
  337. {
  338. bool first = 1;
  339. float val = 0.f;
  340. for (JFloatExpression* expression : values)
  341. {
  342. if (first)
  343. {
  344. first = 0;
  345. val = expression->getValue(zMemory);
  346. }
  347. else
  348. {
  349. val = accumulator(val, expression->getValue(zMemory));
  350. }
  351. }
  352. return val;
  353. }
  354. void JOperatorFloatExpression::setOperator(
  355. Framework::Text op, std::function<float(float a, float b)> accumulator)
  356. {
  357. this->op = op;
  358. this->accumulator = accumulator;
  359. }
  360. Framework::Text JOperatorFloatExpression::getOperator()
  361. {
  362. return op;
  363. }
  364. void JOperatorFloatExpression::addValue(JFloatExpression* value)
  365. {
  366. values.add(value);
  367. }
  368. const Framework::RCArray<JFloatExpression>&
  369. JOperatorFloatExpression::getValues() const
  370. {
  371. return values;
  372. }
  373. JOperatorFloatExpressionFactory::JOperatorFloatExpressionFactory()
  374. : SubTypeFactory()
  375. {}
  376. JOperatorFloatExpression* JOperatorFloatExpressionFactory::fromJson(
  377. Framework::JSON::JSONObject* zJson) const
  378. {
  379. JOperatorFloatExpression* result = new JOperatorFloatExpression();
  380. Framework::Text op = zJson->zValue("operator")->asString()->getString();
  381. if (op.istGleich("+"))
  382. {
  383. result->setOperator("+", [](float a, float b) { return a + b; });
  384. }
  385. else if (op.istGleich("-"))
  386. {
  387. result->setOperator("-", [](float a, float b) { return a - b; });
  388. }
  389. else if (op.istGleich("*"))
  390. {
  391. result->setOperator("*", [](float a, float b) { return a * b; });
  392. }
  393. else if (op.istGleich("/"))
  394. {
  395. result->setOperator("/", [](float a, float b) { return a / b; });
  396. }
  397. for (Framework::JSON::JSONValue* value :
  398. *zJson->zValue("values")->asArray())
  399. {
  400. result->addValue(
  401. Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(value));
  402. }
  403. return result;
  404. }
  405. Framework::JSON::JSONObject* JOperatorFloatExpressionFactory::toJsonObject(
  406. JOperatorFloatExpression* zObject) const
  407. {
  408. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  409. result->addValue(
  410. "operator", new Framework::JSON::JSONString(zObject->getOperator()));
  411. Framework::JSON::JSONArray* values = new Framework::JSON::JSONArray();
  412. for (JFloatExpression* expression : zObject->getValues())
  413. {
  414. values->addValue(
  415. Game::INSTANCE->zTypeRegistry()->toJson<JFloatExpression>(
  416. expression));
  417. }
  418. result->addValue("values", values);
  419. return result;
  420. }
  421. JSONObjectValidationBuilder* JOperatorFloatExpressionFactory::addToValidator(
  422. JSONObjectValidationBuilder* builder) const
  423. {
  424. return builder->withRequiredString("operator")
  425. ->whichIsOneOf({"+", "-", "*", "/"})
  426. ->finishString()
  427. ->withRequiredArray("values")
  428. ->addAcceptedTypeInArray(
  429. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>())
  430. ->finishArray();
  431. }
  432. const char* JOperatorFloatExpressionFactory::getTypeToken() const
  433. {
  434. return "operator";
  435. }
  436. JBoolOperatorBoolExpression::JBoolOperatorBoolExpression()
  437. : JBoolExpression()
  438. {}
  439. bool JBoolOperatorBoolExpression::getValue(JExpressionMemory* zMemory)
  440. {
  441. bool first = 1;
  442. bool val = 0;
  443. for (JBoolExpression* expression : values)
  444. {
  445. if (first)
  446. {
  447. first = 0;
  448. val = expression->getValue(zMemory);
  449. }
  450. else
  451. {
  452. val = accumulator(val, expression->getValue(zMemory));
  453. }
  454. }
  455. return val;
  456. }
  457. void JBoolOperatorBoolExpression::setOperator(
  458. Framework::Text op, std::function<float(float a, float b)> accumulator)
  459. {
  460. this->op = op;
  461. this->accumulator = accumulator;
  462. }
  463. Framework::Text JBoolOperatorBoolExpression::getOperator()
  464. {
  465. return op;
  466. }
  467. void JBoolOperatorBoolExpression::addValue(JBoolExpression* value)
  468. {
  469. values.add(value);
  470. }
  471. const Framework::RCArray<JBoolExpression>&
  472. JBoolOperatorBoolExpression::getValues() const
  473. {
  474. return values;
  475. }
  476. JBoolOperatorBoolExpressionFactory::JBoolOperatorBoolExpressionFactory()
  477. : SubTypeFactory()
  478. {}
  479. JBoolOperatorBoolExpression* JBoolOperatorBoolExpressionFactory::fromJson(
  480. Framework::JSON::JSONObject* zJson) const
  481. {
  482. JBoolOperatorBoolExpression* result = new JBoolOperatorBoolExpression();
  483. for (Framework::JSON::JSONValue* value :
  484. *zJson->zValue("values")->asArray())
  485. {
  486. result->addValue(
  487. Game::INSTANCE->zTypeRegistry()->fromJson<JBoolExpression>(value));
  488. }
  489. Framework::Text op = zJson->zValue("operator")->asString()->getString();
  490. if (op.istGleich("&&"))
  491. {
  492. result->setOperator("&&", [](bool a, bool b) { return a && b; });
  493. }
  494. else if (op.istGleich("||"))
  495. {
  496. result->setOperator("||", [](bool a, bool b) { return a || b; });
  497. }
  498. return result;
  499. }
  500. Framework::JSON::JSONObject* JBoolOperatorBoolExpressionFactory::toJsonObject(
  501. JBoolOperatorBoolExpression* zObject) const
  502. {
  503. Framework::JSON::JSONObject* zResult = new Framework::JSON::JSONObject();
  504. Framework::JSON::JSONArray* values = new Framework::JSON::JSONArray();
  505. for (JBoolExpression* expression : zObject->getValues())
  506. {
  507. values->addValue(
  508. Game::INSTANCE->zTypeRegistry()->toJson<JBoolExpression>(
  509. expression));
  510. }
  511. zResult->addValue("values", values);
  512. zResult->addValue(
  513. "operator", new Framework::JSON::JSONString(zObject->getOperator()));
  514. return zResult;
  515. }
  516. JSONObjectValidationBuilder* JBoolOperatorBoolExpressionFactory::addToValidator(
  517. JSONObjectValidationBuilder* builder) const
  518. {
  519. return builder->withRequiredString("operator")
  520. ->whichIsOneOf({"&&", "||"})
  521. ->finishString()
  522. ->withRequiredArray("values")
  523. ->addAcceptedTypeInArray(
  524. Game::INSTANCE->zTypeRegistry()->getValidator<JBoolExpression>())
  525. ->finishArray();
  526. }
  527. const char* JBoolOperatorBoolExpressionFactory::getTypeToken() const
  528. {
  529. return "operator";
  530. }
  531. JFloatOperatorBoolExpression::JFloatOperatorBoolExpression()
  532. : JBoolExpression()
  533. {}
  534. bool JFloatOperatorBoolExpression::getValue(JExpressionMemory* zMemory)
  535. {
  536. bool first = 1;
  537. bool val = 1;
  538. float last = 0.f;
  539. for (JFloatExpression* expression : values)
  540. {
  541. float current = expression->getValue(zMemory);
  542. if (!first) val &= accumulator(last, current);
  543. first = 0;
  544. last = current;
  545. if (!val) break;
  546. }
  547. return val;
  548. }
  549. void JFloatOperatorBoolExpression::setOperator(
  550. Framework::Text op, std::function<bool(float a, float b)> accumulator)
  551. {
  552. this->op = op;
  553. this->accumulator = accumulator;
  554. }
  555. Framework::Text JFloatOperatorBoolExpression::getOperator()
  556. {
  557. return op;
  558. }
  559. void JFloatOperatorBoolExpression::addValue(JFloatExpression* value)
  560. {
  561. values.add(value);
  562. }
  563. const Framework::RCArray<JFloatExpression>&
  564. JFloatOperatorBoolExpression::getValues() const
  565. {
  566. return values;
  567. }
  568. JFloatOperatorBoolExpressionFactory::JFloatOperatorBoolExpressionFactory()
  569. : SubTypeFactory()
  570. {}
  571. JFloatOperatorBoolExpression* JFloatOperatorBoolExpressionFactory::fromJson(
  572. Framework::JSON::JSONObject* zJson) const
  573. {
  574. JFloatOperatorBoolExpression* result = new JFloatOperatorBoolExpression();
  575. Framework::Text op = zJson->zValue("operator")->asString()->getString();
  576. if (op.istGleich(">"))
  577. {
  578. result->setOperator(">", [](float a, float b) { return a > b; });
  579. }
  580. else if (op.istGleich("<"))
  581. {
  582. result->setOperator("<", [](float a, float b) { return a < b; });
  583. }
  584. else if (op.istGleich(">="))
  585. {
  586. result->setOperator(">=", [](float a, float b) { return a >= b; });
  587. }
  588. else if (op.istGleich("<="))
  589. {
  590. result->setOperator("<=", [](float a, float b) { return a <= b; });
  591. }
  592. else if (op.istGleich("=="))
  593. {
  594. result->setOperator("==", [](float a, float b) { return a == b; });
  595. }
  596. else if (op.istGleich("!="))
  597. {
  598. result->setOperator("!=", [](float a, float b) { return a != b; });
  599. }
  600. else if (op.istGleich(">i"))
  601. {
  602. result->setOperator(
  603. ">i", [](float a, float b) { return (int)a > (int)b; });
  604. }
  605. else if (op.istGleich("<i"))
  606. {
  607. result->setOperator(
  608. "<i", [](float a, float b) { return (int)a < (int)b; });
  609. }
  610. else if (op.istGleich(">=i"))
  611. {
  612. result->setOperator(
  613. ">=i", [](float a, float b) { return (int)a >= (int)b; });
  614. }
  615. else if (op.istGleich("<=i"))
  616. {
  617. result->setOperator(
  618. "<=i", [](float a, float b) { return (int)a <= (int)b; });
  619. }
  620. else if (op.istGleich("==i"))
  621. {
  622. result->setOperator(
  623. "==i", [](float a, float b) { return (int)a == (int)b; });
  624. }
  625. else if (op.istGleich("!=i"))
  626. {
  627. result->setOperator(
  628. "!=i", [](float a, float b) { return (int)a != (int)b; });
  629. }
  630. for (Framework::JSON::JSONValue* value :
  631. *zJson->zValue("values")->asArray())
  632. {
  633. result->addValue(
  634. Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(value));
  635. }
  636. return result;
  637. }
  638. Framework::JSON::JSONObject* JFloatOperatorBoolExpressionFactory::toJsonObject(
  639. JFloatOperatorBoolExpression* zObject) const
  640. {
  641. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  642. result->addValue(
  643. "operator", new Framework::JSON::JSONString(zObject->getOperator()));
  644. Framework::JSON::JSONArray* values = new Framework::JSON::JSONArray();
  645. for (JFloatExpression* expression : zObject->getValues())
  646. {
  647. values->addValue(
  648. Game::INSTANCE->zTypeRegistry()->toJson<JFloatExpression>(
  649. expression));
  650. }
  651. result->addValue("values", values);
  652. return result;
  653. }
  654. JSONObjectValidationBuilder*
  655. JFloatOperatorBoolExpressionFactory::addToValidator(
  656. JSONObjectValidationBuilder* builder) const
  657. {
  658. return builder->withRequiredString("operator")
  659. ->whichIsOneOf({">",
  660. "<",
  661. ">=",
  662. "<=",
  663. "==",
  664. "!=",
  665. "<i",
  666. ">i",
  667. ">=i",
  668. "<=i",
  669. "==i",
  670. "!=i"})
  671. ->finishString()
  672. ->withRequiredArray("values")
  673. ->addAcceptedTypeInArray(
  674. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>())
  675. ->finishArray();
  676. }
  677. const char* JFloatOperatorBoolExpressionFactory::getTypeToken() const
  678. {
  679. return "comparsion";
  680. }
  681. JBlockTypeBoolExpression::JBlockTypeBoolExpression()
  682. : JBoolExpression(),
  683. typeId(0),
  684. x(0),
  685. y(0),
  686. z(0)
  687. {}
  688. JBlockTypeBoolExpression ::~JBlockTypeBoolExpression()
  689. {
  690. if (x) x->release();
  691. if (y) y->release();
  692. if (z) z->release();
  693. }
  694. bool JBlockTypeBoolExpression::getValue(JExpressionMemory* zMemory)
  695. {
  696. int x = (int)(round(this->x->getValue(zMemory)));
  697. int y = (int)(round(this->y->getValue(zMemory)));
  698. int z = (int)(round(this->z->getValue(zMemory)));
  699. if (z < 0 || z >= WORLD_HEIGHT || !zMemory->zCurrentChunk()
  700. || Game::getChunkCenter(x, y) != zMemory->zCurrentChunk()->getCenter())
  701. {
  702. return 0;
  703. }
  704. return zMemory->zCurrentChunk()->getBlockTypeAt(
  705. Dimension::chunkCoordinates({x, y, z}))
  706. == typeId;
  707. }
  708. void JBlockTypeBoolExpression::setTypeId(int typeId)
  709. {
  710. this->typeId = typeId;
  711. }
  712. int JBlockTypeBoolExpression::getTypeId() const
  713. {
  714. return typeId;
  715. }
  716. void JBlockTypeBoolExpression::setX(JFloatExpression* x)
  717. {
  718. if (this->x) this->x->release();
  719. this->x = x;
  720. }
  721. JFloatExpression* JBlockTypeBoolExpression::zX() const
  722. {
  723. return x;
  724. }
  725. void JBlockTypeBoolExpression::setY(JFloatExpression* y)
  726. {
  727. if (this->y) this->y->release();
  728. this->y = y;
  729. }
  730. JFloatExpression* JBlockTypeBoolExpression::zY() const
  731. {
  732. return y;
  733. }
  734. void JBlockTypeBoolExpression::setZ(JFloatExpression* z)
  735. {
  736. if (this->z) this->z->release();
  737. this->z = z;
  738. }
  739. JFloatExpression* JBlockTypeBoolExpression::zZ() const
  740. {
  741. return z;
  742. }
  743. JBlockTypeBoolExpressionFactory::JBlockTypeBoolExpressionFactory()
  744. : SubTypeFactory()
  745. {}
  746. JBlockTypeBoolExpression* JBlockTypeBoolExpressionFactory::fromJson(
  747. Framework::JSON::JSONObject* zJson) const
  748. {
  749. JBlockTypeBoolExpression* result = new JBlockTypeBoolExpression();
  750. result->setTypeId(Game::INSTANCE->getBlockTypeId(
  751. zJson->zValue("blockType")->asString()->getString()));
  752. result->setX(Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  753. zJson->zValue("x")));
  754. result->setY(Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  755. zJson->zValue("y")));
  756. result->setZ(Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  757. zJson->zValue("z")));
  758. return result;
  759. }
  760. Framework::JSON::JSONObject* JBlockTypeBoolExpressionFactory::toJsonObject(
  761. JBlockTypeBoolExpression* zObject) const
  762. {
  763. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  764. result->addValue("blockType",
  765. new Framework::JSON::JSONString(
  766. Game::INSTANCE->zBlockType(zObject->getTypeId())->getName()));
  767. result->addValue(
  768. "x", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zX()));
  769. result->addValue(
  770. "y", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zY()));
  771. result->addValue(
  772. "z", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zZ()));
  773. return result;
  774. }
  775. JSONObjectValidationBuilder* JBlockTypeBoolExpressionFactory::addToValidator(
  776. JSONObjectValidationBuilder* builder) const
  777. {
  778. return builder
  779. ->withRequiredAttribute("blockType",
  780. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  781. BlockTypeNameFactory::TYPE_ID))
  782. ->withRequiredAttribute("x",
  783. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>())
  784. ->withRequiredAttribute("y",
  785. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>())
  786. ->withRequiredAttribute("z",
  787. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>());
  788. }
  789. const char* JBlockTypeBoolExpressionFactory::getTypeToken() const
  790. {
  791. return "blockType";
  792. }