JsonExpression.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  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. }
  546. return val;
  547. }
  548. void JFloatOperatorBoolExpression::setOperator(
  549. Framework::Text op, std::function<bool(float a, float b)> accumulator)
  550. {
  551. this->op = op;
  552. this->accumulator = accumulator;
  553. }
  554. Framework::Text JFloatOperatorBoolExpression::getOperator()
  555. {
  556. return op;
  557. }
  558. void JFloatOperatorBoolExpression::addValue(JFloatExpression* value)
  559. {
  560. values.add(value);
  561. }
  562. const Framework::RCArray<JFloatExpression>&
  563. JFloatOperatorBoolExpression::getValues() const
  564. {
  565. return values;
  566. }
  567. JFloatOperatorBoolExpressionFactory::JFloatOperatorBoolExpressionFactory()
  568. : SubTypeFactory()
  569. {}
  570. JFloatOperatorBoolExpression* JFloatOperatorBoolExpressionFactory::fromJson(
  571. Framework::JSON::JSONObject* zJson) const
  572. {
  573. JFloatOperatorBoolExpression* result = new JFloatOperatorBoolExpression();
  574. Framework::Text op = zJson->zValue("operator")->asString()->getString();
  575. if (op.istGleich(">"))
  576. {
  577. result->setOperator(">", [](float a, float b) { return a > b; });
  578. }
  579. else if (op.istGleich("<"))
  580. {
  581. result->setOperator("<", [](float a, float b) { return a < b; });
  582. }
  583. else if (op.istGleich(">="))
  584. {
  585. result->setOperator(">=", [](float a, float b) { return a >= b; });
  586. }
  587. else if (op.istGleich("<="))
  588. {
  589. result->setOperator("<=", [](float a, float b) { return a <= b; });
  590. }
  591. else if (op.istGleich("=="))
  592. {
  593. result->setOperator("==", [](float a, float b) { return a == b; });
  594. }
  595. else if (op.istGleich("!="))
  596. {
  597. result->setOperator("!=", [](float a, float b) { return a != b; });
  598. }
  599. else if (op.istGleich(">i"))
  600. {
  601. result->setOperator(
  602. ">i", [](float a, float b) { return (int)a > (int)b; });
  603. }
  604. else if (op.istGleich("<i"))
  605. {
  606. result->setOperator(
  607. "<i", [](float a, float b) { return (int)a < (int)b; });
  608. }
  609. else if (op.istGleich(">=i"))
  610. {
  611. result->setOperator(
  612. ">=i", [](float a, float b) { return (int)a >= (int)b; });
  613. }
  614. else if (op.istGleich("<=i"))
  615. {
  616. result->setOperator(
  617. "<=i", [](float a, float b) { return (int)a <= (int)b; });
  618. }
  619. else if (op.istGleich("==i"))
  620. {
  621. result->setOperator(
  622. "==i", [](float a, float b) { return (int)a == (int)b; });
  623. }
  624. else if (op.istGleich("!=i"))
  625. {
  626. result->setOperator(
  627. "!=i", [](float a, float b) { return (int)a != (int)b; });
  628. }
  629. for (Framework::JSON::JSONValue* value :
  630. *zJson->zValue("values")->asArray())
  631. {
  632. result->addValue(
  633. Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(value));
  634. }
  635. return result;
  636. }
  637. Framework::JSON::JSONObject* JFloatOperatorBoolExpressionFactory::toJsonObject(
  638. JFloatOperatorBoolExpression* zObject) const
  639. {
  640. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  641. result->addValue(
  642. "operator", new Framework::JSON::JSONString(zObject->getOperator()));
  643. Framework::JSON::JSONArray* values = new Framework::JSON::JSONArray();
  644. for (JFloatExpression* expression : zObject->getValues())
  645. {
  646. values->addValue(
  647. Game::INSTANCE->zTypeRegistry()->toJson<JFloatExpression>(
  648. expression));
  649. }
  650. result->addValue("values", values);
  651. return result;
  652. }
  653. JSONObjectValidationBuilder*
  654. JFloatOperatorBoolExpressionFactory::addToValidator(
  655. JSONObjectValidationBuilder* builder) const
  656. {
  657. return builder->withRequiredString("operator")
  658. ->whichIsOneOf({">",
  659. "<",
  660. ">=",
  661. "<=",
  662. "==",
  663. "!=",
  664. "<i",
  665. ">i",
  666. ">=i",
  667. "<=i",
  668. "==i",
  669. "!=i"})
  670. ->finishString()
  671. ->withRequiredArray("values")
  672. ->addAcceptedTypeInArray(
  673. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>())
  674. ->finishArray();
  675. }
  676. const char* JFloatOperatorBoolExpressionFactory::getTypeToken() const
  677. {
  678. return "comparsion";
  679. }
  680. JBlockTypeBoolExpression::JBlockTypeBoolExpression()
  681. : JBoolExpression(),
  682. typeId(0),
  683. x(0),
  684. y(0),
  685. z(0)
  686. {}
  687. JBlockTypeBoolExpression ::~JBlockTypeBoolExpression()
  688. {
  689. if (x) x->release();
  690. if (y) y->release();
  691. if (z) z->release();
  692. }
  693. bool JBlockTypeBoolExpression::getValue(JExpressionMemory* zMemory)
  694. {
  695. int x = (int)(round(this->x->getValue(zMemory)));
  696. int y = (int)(round(this->y->getValue(zMemory)));
  697. int z = (int)(round(this->z->getValue(zMemory)));
  698. if (z < 0 || z >= WORLD_HEIGHT || !zMemory->zCurrentChunk()
  699. || Game::getChunkCenter(x, y) != zMemory->zCurrentChunk()->getCenter())
  700. {
  701. return 0;
  702. }
  703. return zMemory->zCurrentChunk()->getBlockTypeAt(
  704. Dimension::chunkCoordinates({x, y, z}))
  705. == typeId;
  706. }
  707. void JBlockTypeBoolExpression::setTypeId(int typeId)
  708. {
  709. this->typeId = typeId;
  710. }
  711. int JBlockTypeBoolExpression::getTypeId() const
  712. {
  713. return typeId;
  714. }
  715. void JBlockTypeBoolExpression::setX(JFloatExpression* x)
  716. {
  717. if (this->x) this->x->release();
  718. this->x = x;
  719. }
  720. JFloatExpression* JBlockTypeBoolExpression::zX() const
  721. {
  722. return x;
  723. }
  724. void JBlockTypeBoolExpression::setY(JFloatExpression* y)
  725. {
  726. if (this->y) this->y->release();
  727. this->y = y;
  728. }
  729. JFloatExpression* JBlockTypeBoolExpression::zY() const
  730. {
  731. return y;
  732. }
  733. void JBlockTypeBoolExpression::setZ(JFloatExpression* z)
  734. {
  735. if (this->z) this->z->release();
  736. this->z = z;
  737. }
  738. JFloatExpression* JBlockTypeBoolExpression::zZ() const
  739. {
  740. return z;
  741. }
  742. JBlockTypeBoolExpressionFactory::JBlockTypeBoolExpressionFactory()
  743. : SubTypeFactory()
  744. {}
  745. JBlockTypeBoolExpression* JBlockTypeBoolExpressionFactory::fromJson(
  746. Framework::JSON::JSONObject* zJson) const
  747. {
  748. JBlockTypeBoolExpression* result = new JBlockTypeBoolExpression();
  749. result->setTypeId(Game::INSTANCE->getBlockTypeId(
  750. zJson->zValue("blockType")->asString()->getString()));
  751. result->setX(Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  752. zJson->zValue("x")));
  753. result->setY(Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  754. zJson->zValue("y")));
  755. result->setZ(Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  756. zJson->zValue("z")));
  757. return result;
  758. }
  759. Framework::JSON::JSONObject* JBlockTypeBoolExpressionFactory::toJsonObject(
  760. JBlockTypeBoolExpression* zObject) const
  761. {
  762. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  763. result->addValue("blockType",
  764. new Framework::JSON::JSONString(
  765. Game::INSTANCE->zBlockType(zObject->getTypeId())->getName()));
  766. result->addValue(
  767. "x", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zX()));
  768. result->addValue(
  769. "y", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zY()));
  770. result->addValue(
  771. "z", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zZ()));
  772. return result;
  773. }
  774. JSONObjectValidationBuilder* JBlockTypeBoolExpressionFactory::addToValidator(
  775. JSONObjectValidationBuilder* builder) const
  776. {
  777. return builder
  778. ->withRequiredAttribute("blockType",
  779. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  780. BlockTypeNameFactory::TYPE_ID))
  781. ->withRequiredAttribute("x",
  782. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>())
  783. ->withRequiredAttribute("y",
  784. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>())
  785. ->withRequiredAttribute("z",
  786. Game::INSTANCE->zTypeRegistry()->getValidator<JFloatExpression>());
  787. }
  788. const char* JBlockTypeBoolExpressionFactory::getTypeToken() const
  789. {
  790. return "blockType";
  791. }