BasicTool.cpp 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879
  1. #include "BasicTool.h"
  2. #include "Block.h"
  3. #include "Dimension.h"
  4. #include "Entity.h"
  5. #include "Game.h"
  6. #undef max
  7. XPBasedLevelUpRule::XPBasedLevelUpRule()
  8. : ItemSkillLevelUpRule(),
  9. xpIncrease(0.0),
  10. xpMultiplier(2.0),
  11. levelIncrease(1.0),
  12. levelMultiplier(1.0),
  13. maxLevel(std::numeric_limits<float>::max())
  14. {}
  15. void XPBasedLevelUpRule::applyOn(ItemSkill* zSkill)
  16. {
  17. if (zSkill->getXp() >= zSkill->getMaxXp())
  18. {
  19. zSkill->setXp(zSkill->getXp() - zSkill->getMaxXp());
  20. zSkill->setLevel(MIN(
  21. (zSkill->getLevel() + levelIncrease) * levelMultiplier, maxLevel));
  22. zSkill->setMaxXp((zSkill->getMaxXp() + xpIncrease) * xpMultiplier);
  23. }
  24. }
  25. void XPBasedLevelUpRule::setXpIncrease(float xpIncrease)
  26. {
  27. this->xpIncrease = xpIncrease;
  28. }
  29. float XPBasedLevelUpRule::getXpIncrease() const
  30. {
  31. return xpIncrease;
  32. }
  33. void XPBasedLevelUpRule::setXpMultiplier(float xpMultiplier)
  34. {
  35. this->xpMultiplier = xpMultiplier;
  36. }
  37. float XPBasedLevelUpRule::getXpMultiplier() const
  38. {
  39. return xpMultiplier;
  40. }
  41. void XPBasedLevelUpRule::setLevelIncrease(float levelIncrease)
  42. {
  43. this->levelIncrease = levelIncrease;
  44. }
  45. float XPBasedLevelUpRule::getLevelIncrease() const
  46. {
  47. return levelIncrease;
  48. }
  49. void XPBasedLevelUpRule::setLevelMultiplier(float levelMultiplier)
  50. {
  51. this->levelMultiplier = levelMultiplier;
  52. }
  53. float XPBasedLevelUpRule::getLevelMultiplier() const
  54. {
  55. return levelMultiplier;
  56. }
  57. void XPBasedLevelUpRule::setMaxLevel(float maxLevel)
  58. {
  59. this->maxLevel = maxLevel;
  60. }
  61. float XPBasedLevelUpRule::getMaxLevel() const
  62. {
  63. return maxLevel;
  64. }
  65. XPBasedLevelUpRuleFactory::XPBasedLevelUpRuleFactory()
  66. : SubTypeFactory()
  67. {}
  68. XPBasedLevelUpRule* XPBasedLevelUpRuleFactory::fromJson(
  69. Framework::JSON::JSONObject* zJson) const
  70. {
  71. XPBasedLevelUpRule* result = new XPBasedLevelUpRule();
  72. if (zJson->hasValue("maxLevel"))
  73. {
  74. result->setMaxLevel(
  75. (float)zJson->zValue("maxLevel")->asNumber()->getNumber());
  76. }
  77. result->setXpIncrease(
  78. (float)zJson->zValue("xpIncrease")->asNumber()->getNumber());
  79. result->setXpMultiplier(
  80. (float)zJson->zValue("xpMultiplier")->asNumber()->getNumber());
  81. result->setLevelIncrease(
  82. (float)zJson->zValue("levelIncrease")->asNumber()->getNumber());
  83. result->setLevelMultiplier(
  84. (float)zJson->zValue("levelMultiplier")->asNumber()->getNumber());
  85. return result;
  86. }
  87. Framework::JSON::JSONObject* XPBasedLevelUpRuleFactory::toJsonObject(
  88. XPBasedLevelUpRule* zObject) const
  89. {
  90. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  91. result->addValue("xpIncrease",
  92. new Framework::JSON::JSONNumber(zObject->getXpIncrease()));
  93. result->addValue("xpMultiplier",
  94. new Framework::JSON::JSONNumber(zObject->getXpMultiplier()));
  95. result->addValue("levelIncrease",
  96. new Framework::JSON::JSONNumber(zObject->getLevelIncrease()));
  97. result->addValue("levelMultiplier",
  98. new Framework::JSON::JSONNumber(zObject->getLevelMultiplier()));
  99. result->addValue(
  100. "maxLevel", new Framework::JSON::JSONNumber(zObject->getMaxLevel()));
  101. return result;
  102. }
  103. JSONObjectValidationBuilder* XPBasedLevelUpRuleFactory::addToValidator(
  104. JSONObjectValidationBuilder* builder) const
  105. {
  106. return builder->withRequiredNumber("xpIncrease")
  107. ->whichIsGreaterOrEqual(0.0)
  108. ->withDefault(0.0)
  109. ->finishNumber()
  110. ->withRequiredNumber("xpMultiplier")
  111. ->whichIsGreaterThen(0.0)
  112. ->withDefault(2.0)
  113. ->finishNumber()
  114. ->withRequiredNumber("levelIncrease")
  115. ->whichIsGreaterOrEqual(0.0)
  116. ->withDefault(1.0)
  117. ->finishNumber()
  118. ->withRequiredNumber("levelMultiplier")
  119. ->whichIsGreaterThen(0.0)
  120. ->withDefault(1.0)
  121. ->finishNumber()
  122. ->withRequiredNumber("maxLevel")
  123. ->whichIsOptional()
  124. ->finishNumber();
  125. }
  126. const char* XPBasedLevelUpRuleFactory::getTypeToken() const
  127. {
  128. return "xpBased";
  129. }
  130. BasicToolItem::BasicToolItem(
  131. int itemTypeId, Framework::Text name, float maxHp, float maxDurability)
  132. : Item(itemTypeId, name),
  133. headMaterialHardness(0.0),
  134. rodMaterialHardness(0.0),
  135. handleMaterialHardness(0.0)
  136. {
  137. hp = maxHp;
  138. this->maxHp = maxHp;
  139. durability = maxDurability;
  140. this->maxDurability = maxDurability;
  141. eatable = 0;
  142. placeable = 0;
  143. equippable = 0;
  144. solid = 1;
  145. usable = 1;
  146. }
  147. void BasicToolItem::setHeadMaterialHardness(float hardness)
  148. {
  149. headMaterialHardness = hardness;
  150. }
  151. void BasicToolItem::setRodMaterialHardness(float hardness)
  152. {
  153. rodMaterialHardness = hardness;
  154. }
  155. void BasicToolItem::setHandleMaterialHardness(float hardness)
  156. {
  157. handleMaterialHardness = hardness;
  158. }
  159. float BasicToolItem::getHeadMaterialHardness() const
  160. {
  161. return headMaterialHardness;
  162. }
  163. float BasicToolItem::getRodMaterialHardness() const
  164. {
  165. return rodMaterialHardness;
  166. }
  167. float BasicToolItem::getHandleMaterialHardness() const
  168. {
  169. return handleMaterialHardness;
  170. }
  171. BasicToolItemType::BasicToolItemType()
  172. : ItemType(),
  173. headMaterialHardness(1.f),
  174. rodMaterialHardness(1.f),
  175. handleMaterialHardness(1.f),
  176. baseDurability(10.f),
  177. baseDurabilityMultiplier(1.f),
  178. headMaterialDurability(10.f),
  179. headMaterialDurabilityMultiplier(0.f),
  180. rodMaterialDurability(10.f),
  181. rodMaterialDurabilityMultiplier(0.f),
  182. handleMaterialDurability(10.f),
  183. handleMaterialDurabilityMultiplier(0.0),
  184. levelUpRule(0),
  185. brokenItemTypeName(),
  186. itemSkillConfigJson(0),
  187. brokenItemTypeId(-1)
  188. {}
  189. BasicToolItemType::~BasicToolItemType()
  190. {
  191. if (levelUpRule) levelUpRule->release();
  192. if (itemSkillConfigJson) itemSkillConfigJson->release();
  193. }
  194. void BasicToolItemType::loadSuperItem(
  195. Item* zItem, Framework::StreamReader* zReader) const
  196. {
  197. BasicToolItem* item = dynamic_cast<BasicToolItem*>(zItem);
  198. float data;
  199. zReader->lese((char*)&data, 4);
  200. item->setHeadMaterialHardness(data);
  201. zReader->lese((char*)&data, 4);
  202. item->setRodMaterialHardness(data);
  203. zReader->lese((char*)&data, 4);
  204. item->setHandleMaterialHardness(data);
  205. ItemType::loadSuperItem(item, zReader);
  206. }
  207. void BasicToolItemType::saveSuperItem(
  208. const Item* zItem, Framework::StreamWriter* zWriter) const
  209. {
  210. const BasicToolItem* item = dynamic_cast<const BasicToolItem*>(zItem);
  211. float data = item->getHeadMaterialHardness();
  212. zWriter->schreibe((char*)&data, 4);
  213. data = item->getRodMaterialHardness();
  214. zWriter->schreibe((char*)&data, 4);
  215. data = item->getHandleMaterialHardness();
  216. zWriter->schreibe((char*)&data, 4);
  217. ItemType::saveSuperItem(item, zWriter);
  218. }
  219. bool BasicToolItemType::initialize(Game* zGame)
  220. {
  221. brokenItemTypeId = zGame->getItemTypeId(brokenItemTypeName);
  222. return brokenItemTypeId >= 0 && ItemType::initialize(zGame);
  223. }
  224. const ItemType* BasicToolItemType::zBrokenItemType() const
  225. {
  226. return Game::INSTANCE->zItemType(brokenItemTypeId);
  227. }
  228. Item* BasicToolItemType::createItem() const
  229. {
  230. BasicToolItem* item = new BasicToolItem(getId(),
  231. getName(),
  232. 1.f,
  233. (baseDurability + headMaterialDurability * headMaterialHardness
  234. + rodMaterialDurability * rodMaterialHardness
  235. + handleMaterialDurability * handleMaterialHardness)
  236. * (baseDurabilityMultiplier
  237. + headMaterialDurabilityMultiplier * headMaterialHardness
  238. + rodMaterialDurabilityMultiplier * rodMaterialHardness
  239. + handleMaterialDurabilityMultiplier * handleMaterialHardness));
  240. item->setHandleMaterialHardness(headMaterialHardness);
  241. item->setRodMaterialHardness(rodMaterialHardness);
  242. item->setHandleMaterialHardness(handleMaterialHardness);
  243. return item;
  244. }
  245. void BasicToolItemType::levelUpItemSkill(ItemSkill* zSkill) const
  246. {
  247. levelUpRule->applyOn(zSkill);
  248. }
  249. void BasicToolItemType::setItemAttribute(
  250. Item* zItem, Framework::Text name, Framework::JSON::JSONValue* zValue) const
  251. {
  252. BasicToolItem* item = dynamic_cast<BasicToolItem*>(zItem);
  253. if (name.istGleich("headMaterialHardness")
  254. && zValue->getType() == Framework::AbstractType::NUMBER)
  255. {
  256. item->setHeadMaterialHardness((float)zValue->asNumber()->getNumber());
  257. }
  258. else if (name.istGleich("rodMaterialHardness")
  259. && zValue->getType() == Framework::AbstractType::NUMBER)
  260. {
  261. item->setRodMaterialHardness((float)zValue->asNumber()->getNumber());
  262. }
  263. else if (name.istGleich("handleMaterialHardness")
  264. && zValue->getType() == Framework::AbstractType::NUMBER)
  265. {
  266. item->setHandleMaterialHardness((float)zValue->asNumber()->getNumber());
  267. }
  268. else
  269. {
  270. ItemType::setItemAttribute(item, name, zValue);
  271. }
  272. item->setMaxDurability(
  273. (baseDurability
  274. + headMaterialDurability * item->getHandleMaterialHardness()
  275. + rodMaterialDurability * item->getRodMaterialHardness()
  276. + handleMaterialDurability * item->getHandleMaterialHardness())
  277. * (baseDurabilityMultiplier
  278. + headMaterialDurabilityMultiplier * item->getHeadMaterialHardness()
  279. + rodMaterialDurabilityMultiplier * item->getRodMaterialHardness()
  280. + handleMaterialDurabilityMultiplier
  281. * item->getHandleMaterialHardness()));
  282. }
  283. void BasicToolItemType::addItemAttributes(
  284. Item* zItem, Framework::JSON::JSONObject* zItemObjet) const
  285. {
  286. BasicToolItem* item = dynamic_cast<BasicToolItem*>(zItem);
  287. zItemObjet->addValue("headMaterialHardness",
  288. new Framework::JSON::JSONNumber(item->getHeadMaterialHardness()));
  289. zItemObjet->addValue("rodMaterialHardness",
  290. new Framework::JSON::JSONNumber(item->getRodMaterialHardness()));
  291. zItemObjet->addValue("handleMaterialHardness",
  292. new Framework::JSON::JSONNumber(item->getHandleMaterialHardness()));
  293. ItemType::addItemAttributes(item, zItemObjet);
  294. }
  295. ItemSkill* BasicToolItemType::createDefaultItemSkill() const
  296. {
  297. return Game::INSTANCE->zTypeRegistry()->fromJson<ItemSkill>(
  298. itemSkillConfigJson);
  299. }
  300. void BasicToolItemType::setBrokenItemTypeName(
  301. Framework::Text brokenItemTypeName)
  302. {
  303. this->brokenItemTypeName = brokenItemTypeName;
  304. }
  305. Framework::Text BasicToolItemType::getBrokenItemTypeName() const
  306. {
  307. return brokenItemTypeName;
  308. }
  309. void BasicToolItemType::setHeadMaterialHardness(float hardness)
  310. {
  311. headMaterialHardness = hardness;
  312. }
  313. float BasicToolItemType::getHeadMaterialHardness() const
  314. {
  315. return headMaterialHardness;
  316. }
  317. void BasicToolItemType::setRodMaterialHardness(float hardness)
  318. {
  319. rodMaterialHardness = hardness;
  320. }
  321. float BasicToolItemType::getRodMaterialHardness() const
  322. {
  323. return rodMaterialHardness;
  324. }
  325. void BasicToolItemType::setHandleMaterialHardness(float hardness)
  326. {
  327. handleMaterialHardness = hardness;
  328. }
  329. float BasicToolItemType::getHandleMaterialHardness() const
  330. {
  331. return handleMaterialHardness;
  332. }
  333. void BasicToolItemType::setBaseDurability(float durability)
  334. {
  335. baseDurability = durability;
  336. }
  337. float BasicToolItemType::getBaseDurablility() const
  338. {
  339. return baseDurability;
  340. }
  341. void BasicToolItemType::setBaseDurabilityMultiplier(float multiplier)
  342. {
  343. baseDurabilityMultiplier = multiplier;
  344. }
  345. float BasicToolItemType::getBaseDurabilityMultiplier() const
  346. {
  347. return baseDurabilityMultiplier;
  348. }
  349. void BasicToolItemType::setHeadMaterialDurability(float durability)
  350. {
  351. headMaterialDurability = durability;
  352. }
  353. float BasicToolItemType::getHeadMaterialDurability() const
  354. {
  355. return headMaterialDurability;
  356. }
  357. void BasicToolItemType::setHeadMaterialDurabilityMultiplier(float multiplier)
  358. {
  359. headMaterialDurabilityMultiplier = multiplier;
  360. }
  361. float BasicToolItemType::getHeadMaterialDurabilityMultiplier() const
  362. {
  363. return headMaterialDurabilityMultiplier;
  364. }
  365. void BasicToolItemType::setRodMaterialDurability(float durability)
  366. {
  367. rodMaterialDurability = durability;
  368. }
  369. float BasicToolItemType::getRodMaterialDurability() const
  370. {
  371. return rodMaterialDurability;
  372. }
  373. void BasicToolItemType::setRodMaterialDurabilityMultiplier(float multiplier)
  374. {
  375. rodMaterialDurabilityMultiplier = multiplier;
  376. }
  377. float BasicToolItemType::getRodMaterialDurabilityMultiplier() const
  378. {
  379. return rodMaterialDurabilityMultiplier;
  380. }
  381. void BasicToolItemType::setHandleMaterialDurability(float durability)
  382. {
  383. handleMaterialDurability = durability;
  384. }
  385. float BasicToolItemType::getHandleMaterialDurability() const
  386. {
  387. return handleMaterialDurability;
  388. }
  389. void BasicToolItemType::setHandleMaterialDurabilityMultiplier(float multiplier)
  390. {
  391. handleMaterialDurabilityMultiplier = multiplier;
  392. }
  393. float BasicToolItemType::getHandleMaterialDurabilityMultiplier() const
  394. {
  395. return handleMaterialDurabilityMultiplier;
  396. }
  397. void BasicToolItemType::setLevelUpRule(ItemSkillLevelUpRule* rule)
  398. {
  399. if (levelUpRule) levelUpRule->release();
  400. levelUpRule = rule;
  401. }
  402. ItemSkillLevelUpRule* BasicToolItemType::zLevelUpRule() const
  403. {
  404. return levelUpRule;
  405. }
  406. void BasicToolItemType::setItemSkillConfigJson(
  407. Framework::JSON::JSONObject* zJson)
  408. {
  409. if (itemSkillConfigJson) itemSkillConfigJson->release();
  410. itemSkillConfigJson = zJson;
  411. }
  412. Framework::JSON::JSONObject* BasicToolItemType::getItemSkillConfigJson() const
  413. {
  414. return dynamic_cast<Framework::JSON::JSONObject*>(
  415. itemSkillConfigJson->getThis());
  416. }
  417. BasicToolItemTypeFactory::BasicToolItemTypeFactory()
  418. : ItemTypeFactoryBase()
  419. {}
  420. BasicToolItemType* BasicToolItemTypeFactory::createValue(
  421. Framework::JSON::JSONObject* zJson) const
  422. {
  423. return new BasicToolItemType();
  424. }
  425. BasicToolItemType* BasicToolItemTypeFactory::fromJson(
  426. Framework::JSON::JSONObject* zJson) const
  427. {
  428. BasicToolItemType* result = ItemTypeFactoryBase::fromJson(zJson);
  429. result->setHandleMaterialHardness(
  430. (float)zJson->zValue("headMaterialHardness")->asNumber()->getNumber());
  431. result->setRodMaterialHardness(
  432. (float)zJson->zValue("rodMaterialHardness")->asNumber()->getNumber());
  433. result->setHandleMaterialHardness(
  434. (float)zJson->zValue("handleMaterialHardness")
  435. ->asNumber()
  436. ->getNumber());
  437. result->setBaseDurability(
  438. (float)zJson->zValue("baseDurability")->asNumber()->getNumber());
  439. result->setBaseDurabilityMultiplier(
  440. (float)zJson->zValue("baseDurabilityMultiplier")
  441. ->asNumber()
  442. ->getNumber());
  443. result->setHeadMaterialDurability(
  444. (float)zJson->zValue("headMaterialDurability")
  445. ->asNumber()
  446. ->getNumber());
  447. result->setHeadMaterialDurabilityMultiplier(
  448. (float)zJson->zValue("headMaterialDurabilityMultiplier")
  449. ->asNumber()
  450. ->getNumber());
  451. result->setRodMaterialDurability(
  452. (float)zJson->zValue("rodMaterialDurability")->asNumber()->getNumber());
  453. result->setRodMaterialDurabilityMultiplier(
  454. (float)zJson->zValue("rodMaterialDurabilityMultiplier")
  455. ->asNumber()
  456. ->getNumber());
  457. result->setHandleMaterialDurability(
  458. (float)zJson->zValue("handleMaterialDurability")
  459. ->asNumber()
  460. ->getNumber());
  461. result->setHandleMaterialDurabilityMultiplier(
  462. (float)zJson->zValue("handleMaterialDurabilityMultiplier")
  463. ->asNumber()
  464. ->getNumber());
  465. result->setLevelUpRule(
  466. Game::INSTANCE->zTypeRegistry()->fromJson<ItemSkillLevelUpRule>(
  467. zJson->zValue("levelUpRule")));
  468. result->setBrokenItemTypeName(
  469. zJson->zValue("brokenItemTypeName")->asString()->getString());
  470. result->setItemSkillConfigJson(zJson->getValue("itemSkill")->asObject());
  471. return result;
  472. }
  473. Framework::JSON::JSONObject* BasicToolItemTypeFactory::toJsonObject(
  474. BasicToolItemType* zObject) const
  475. {
  476. Framework::JSON::JSONObject* result
  477. = ItemTypeFactoryBase::toJsonObject(zObject);
  478. result->addValue("headMaterialHardness",
  479. new Framework::JSON::JSONNumber(zObject->getHeadMaterialHardness()));
  480. result->addValue("rodMaterialHardness",
  481. new Framework::JSON::JSONNumber(zObject->getRodMaterialHardness()));
  482. result->addValue("handleMaterialHardness",
  483. new Framework::JSON::JSONNumber(zObject->getHandleMaterialHardness()));
  484. result->addValue("baseDurability",
  485. new Framework::JSON::JSONNumber(zObject->getBaseDurablility()));
  486. result->addValue("baseDurabilityMultiplier",
  487. new Framework::JSON::JSONNumber(
  488. zObject->getBaseDurabilityMultiplier()));
  489. result->addValue("headMaterialDurability",
  490. new Framework::JSON::JSONNumber(zObject->getHeadMaterialDurability()));
  491. result->addValue("headMaterialDurabilityMultiplier",
  492. new Framework::JSON::JSONNumber(
  493. zObject->getHeadMaterialDurabilityMultiplier()));
  494. result->addValue("rodMaterialDurability",
  495. new Framework::JSON::JSONNumber(zObject->getRodMaterialDurability()));
  496. result->addValue("rodMaterialDurabilityMultiplier",
  497. new Framework::JSON::JSONNumber(
  498. zObject->getRodMaterialDurabilityMultiplier()));
  499. result->addValue("handleMaterialDurability",
  500. new Framework::JSON::JSONNumber(
  501. zObject->getHandleMaterialDurability()));
  502. result->addValue("handleMaterialDurabilityMultiplier",
  503. new Framework::JSON::JSONNumber(
  504. zObject->getHandleMaterialDurabilityMultiplier()));
  505. result->addValue("levelUpRule",
  506. Game::INSTANCE->zTypeRegistry()->toJson(zObject->zLevelUpRule()));
  507. result->addValue("brokenItemTypeName",
  508. new Framework::JSON::JSONString(zObject->zBrokenItemType()->getName()));
  509. result->addValue("itemSkill", zObject->getItemSkillConfigJson());
  510. return result;
  511. }
  512. JSONObjectValidationBuilder* BasicToolItemTypeFactory::addToValidator(
  513. JSONObjectValidationBuilder* builder) const
  514. {
  515. return ItemTypeFactoryBase::addToValidator(
  516. builder->withRequiredNumber("headMaterialHardness")
  517. ->withDefault(1.0)
  518. ->whichIsGreaterOrEqual(0.0)
  519. ->finishNumber()
  520. ->withRequiredNumber("rodMaterialHardness")
  521. ->withDefault(1.0)
  522. ->whichIsGreaterOrEqual(0.0)
  523. ->finishNumber()
  524. ->withRequiredNumber("handleMaterialHardness")
  525. ->withDefault(1.0)
  526. ->whichIsGreaterOrEqual(0.0)
  527. ->finishNumber()
  528. ->withRequiredNumber("baseDurability")
  529. ->withDefault(10.0)
  530. ->whichIsGreaterOrEqual(0.0)
  531. ->finishNumber()
  532. ->withRequiredNumber("baseDurabilityMultiplier")
  533. ->withDefault(1.0)
  534. ->whichIsGreaterOrEqual(0.0)
  535. ->finishNumber()
  536. ->withRequiredNumber("headMaterialDurability")
  537. ->withDefault(10.0)
  538. ->whichIsGreaterOrEqual(0.0)
  539. ->finishNumber()
  540. ->withRequiredNumber("headMaterialDurabilityMultiplier")
  541. ->withDefault(0.0)
  542. ->whichIsGreaterOrEqual(0.0)
  543. ->finishNumber()
  544. ->withRequiredNumber("rodMaterialDurability")
  545. ->withDefault(10.0)
  546. ->whichIsGreaterOrEqual(0.0)
  547. ->finishNumber()
  548. ->withRequiredNumber("rodMaterialDurabilityMultiplier")
  549. ->withDefault(0.0)
  550. ->whichIsGreaterOrEqual(0.0)
  551. ->finishNumber()
  552. ->withRequiredNumber("handleMaterialDurability")
  553. ->withDefault(10.0)
  554. ->whichIsGreaterOrEqual(0.0)
  555. ->finishNumber()
  556. ->withRequiredNumber("handleMaterialDurabilityMultiplier")
  557. ->withDefault(0.0)
  558. ->whichIsGreaterOrEqual(0.0)
  559. ->finishNumber()
  560. ->withRequiredAttribute("brokenItemTypeName",
  561. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  562. ItemTypeNameFactory::TYPE_ID))
  563. ->withRequiredAttribute("levelUpRule",
  564. Game::INSTANCE->zTypeRegistry()
  565. ->getValidator<ItemSkillLevelUpRule>())
  566. ->withRequiredAttribute("itemSkill",
  567. Game::INSTANCE->zTypeRegistry()->getValidator<ItemSkill>()));
  568. }
  569. const char* BasicToolItemTypeFactory::getTypeToken() const
  570. {
  571. return "tool";
  572. }
  573. BlockReplaceItemSkillConfig::BlockReplaceItemSkillConfig()
  574. : ReferenceCounter(),
  575. targetBlockFilter(0),
  576. replacementBlockTypeId(-1),
  577. cooldownTicks(20),
  578. staminaCost(0.5f),
  579. staminaCostDevider(0.8f),
  580. additionalStaminaCostDeviderPerLevel(0.2f),
  581. durabilityCost(0.5f),
  582. durabilityCostDevider(0.89f),
  583. additionalDurabilityCostDeviderPerLevel(0.02f),
  584. xpGain(0.5f)
  585. {}
  586. BlockReplaceItemSkillConfig::~BlockReplaceItemSkillConfig()
  587. {
  588. if (targetBlockFilter) targetBlockFilter->release();
  589. }
  590. void BlockReplaceItemSkillConfig::setTargetBlockFilter(
  591. BlockFilter* targetBlockFilter)
  592. {
  593. this->targetBlockFilter = targetBlockFilter;
  594. }
  595. BlockFilter* BlockReplaceItemSkillConfig::zTargetBlockFilter() const
  596. {
  597. return targetBlockFilter;
  598. }
  599. void BlockReplaceItemSkillConfig::setReplacementBlockTypeId(
  600. int replacementBlockTypeId)
  601. {
  602. this->replacementBlockTypeId = replacementBlockTypeId;
  603. }
  604. int BlockReplaceItemSkillConfig::getReplacementBlockTypeId() const
  605. {
  606. return replacementBlockTypeId;
  607. }
  608. void BlockReplaceItemSkillConfig::setCooldownTicks(int cooldownTicks)
  609. {
  610. this->cooldownTicks = cooldownTicks;
  611. }
  612. int BlockReplaceItemSkillConfig::getCooldownTicks() const
  613. {
  614. return cooldownTicks;
  615. }
  616. void BlockReplaceItemSkillConfig::setStaminaCost(float staminaCost)
  617. {
  618. this->staminaCost = staminaCost;
  619. }
  620. float BlockReplaceItemSkillConfig::getStaminaCost() const
  621. {
  622. return staminaCost;
  623. }
  624. void BlockReplaceItemSkillConfig::setStaminaCostDevider(
  625. float staminaCostDevider)
  626. {
  627. this->staminaCostDevider = staminaCostDevider;
  628. }
  629. float BlockReplaceItemSkillConfig::getStaminaCostDevider() const
  630. {
  631. return staminaCostDevider;
  632. }
  633. void BlockReplaceItemSkillConfig::setAdditionalStaminaCostDeviderPerLevel(
  634. float additionalStaminaCostDeviderPerLevel)
  635. {
  636. this->additionalStaminaCostDeviderPerLevel
  637. = additionalStaminaCostDeviderPerLevel;
  638. }
  639. float BlockReplaceItemSkillConfig::getAdditionalStaminaCostDeviderPerLevel()
  640. const
  641. {
  642. return additionalStaminaCostDeviderPerLevel;
  643. }
  644. void BlockReplaceItemSkillConfig::setDurabilityCost(float durabilityCost)
  645. {
  646. this->durabilityCost = durabilityCost;
  647. }
  648. float BlockReplaceItemSkillConfig::getDurabilityCost() const
  649. {
  650. return durabilityCost;
  651. }
  652. void BlockReplaceItemSkillConfig::setDurabilityCostDevider(
  653. float durabilityCostDevider)
  654. {
  655. this->durabilityCostDevider = durabilityCostDevider;
  656. }
  657. float BlockReplaceItemSkillConfig::getDurabilityCostDevider() const
  658. {
  659. return durabilityCostDevider;
  660. }
  661. void BlockReplaceItemSkillConfig::setAdditionalDurabilityCostDeviderPerLevel(
  662. float additionalDurabilityCostDeviderPerLevel)
  663. {
  664. this->additionalDurabilityCostDeviderPerLevel
  665. = additionalDurabilityCostDeviderPerLevel;
  666. }
  667. float BlockReplaceItemSkillConfig::getAdditionalDurabilityCostDeviderPerLevel()
  668. const
  669. {
  670. return additionalDurabilityCostDeviderPerLevel;
  671. }
  672. void BlockReplaceItemSkillConfig::setXpGain(float xpGain)
  673. {
  674. this->xpGain = xpGain;
  675. }
  676. float BlockReplaceItemSkillConfig::getXpGain() const
  677. {
  678. return xpGain;
  679. }
  680. BlockReplaceItemSkillConfigFactory::BlockReplaceItemSkillConfigFactory()
  681. : ObjectTypeFactory()
  682. {}
  683. BlockReplaceItemSkillConfig* BlockReplaceItemSkillConfigFactory::fromJson(
  684. Framework::JSON::JSONObject* zJson) const
  685. {
  686. BlockReplaceItemSkillConfig* result = new BlockReplaceItemSkillConfig();
  687. result->setTargetBlockFilter(
  688. Game::INSTANCE->zTypeRegistry()->fromJson<BlockFilter>(
  689. zJson->asObject()->zValue("targetFilter")));
  690. result->setCooldownTicks((int)zJson->asObject()
  691. ->zValue("cooldownTicks")
  692. ->asNumber()
  693. ->getNumber());
  694. result->setReplacementBlockTypeId(
  695. Game::INSTANCE->getBlockTypeId(zJson->asObject()
  696. ->zValue("replacementBlockType")
  697. ->asString()
  698. ->getString()));
  699. result->setCooldownTicks((int)zJson->asObject()
  700. ->zValue("cooldownTicks")
  701. ->asNumber()
  702. ->getNumber());
  703. result->setStaminaCost((float)zJson->asObject()
  704. ->zValue("staminaCost")
  705. ->asNumber()
  706. ->getNumber());
  707. result->setStaminaCostDevider((float)zJson->asObject()
  708. ->zValue("staminaCostDevider")
  709. ->asNumber()
  710. ->getNumber());
  711. result->setAdditionalStaminaCostDeviderPerLevel((float)zJson->asObject()
  712. ->zValue("additionalStaminaCostDeviderPerLevel")
  713. ->asNumber()
  714. ->getNumber());
  715. result->setDurabilityCost((float)zJson->asObject()
  716. ->zValue("durabilityCost")
  717. ->asNumber()
  718. ->getNumber());
  719. result->setDurabilityCostDevider((float)zJson->asObject()
  720. ->zValue("durabilityCostDevider")
  721. ->asNumber()
  722. ->getNumber());
  723. result->setAdditionalDurabilityCostDeviderPerLevel((float)zJson->asObject()
  724. ->zValue("additionalDurabilityCostDeviderPerLevel")
  725. ->asNumber()
  726. ->getNumber());
  727. result->setXpGain(
  728. (float)zJson->asObject()->zValue("xpGain")->asNumber()->getNumber());
  729. return result;
  730. }
  731. Framework::JSON::JSONObject* BlockReplaceItemSkillConfigFactory::toJsonObject(
  732. BlockReplaceItemSkillConfig* zObject) const
  733. {
  734. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  735. result->addValue("targetFilter",
  736. Game::INSTANCE->zTypeRegistry()->toJson(zObject->zTargetBlockFilter()));
  737. result->addValue("replacementBlockType",
  738. new Framework::JSON::JSONString(
  739. Game::INSTANCE->zBlockType(zObject->getReplacementBlockTypeId())
  740. ->getName()));
  741. result->addValue("cooldownTicks",
  742. new Framework::JSON::JSONNumber(zObject->getCooldownTicks()));
  743. result->addValue("staminaCost",
  744. new Framework::JSON::JSONNumber(zObject->getStaminaCost()));
  745. result->addValue("staminaCostDevider",
  746. new Framework::JSON::JSONNumber(zObject->getStaminaCostDevider()));
  747. result->addValue("additionalStaminaCostDeviderPerLevel",
  748. new Framework::JSON::JSONNumber(
  749. zObject->getAdditionalStaminaCostDeviderPerLevel()));
  750. result->addValue("durabilityCost",
  751. new Framework::JSON::JSONNumber(zObject->getDurabilityCost()));
  752. result->addValue("durabilityCostDevider",
  753. new Framework::JSON::JSONNumber(zObject->getDurabilityCostDevider()));
  754. result->addValue("additionalDurabilityCostDeviderPerLevel",
  755. new Framework::JSON::JSONNumber(
  756. zObject->getAdditionalDurabilityCostDeviderPerLevel()));
  757. result->addValue(
  758. "xpGain", new Framework::JSON::JSONNumber(zObject->getXpGain()));
  759. return result;
  760. }
  761. JSONObjectValidationBuilder* BlockReplaceItemSkillConfigFactory::addToValidator(
  762. JSONObjectValidationBuilder* builder) const
  763. {
  764. return builder
  765. ->withRequiredAttribute("targetFilter",
  766. Game::INSTANCE->zTypeRegistry()->getValidator<BlockFilter>())
  767. ->withRequiredAttribute("replacementBlockType",
  768. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  769. BlockTypeNameFactory::TYPE_ID))
  770. ->withRequiredNumber("cooldownTicks")
  771. ->whichIsGreaterOrEqual(0)
  772. ->withDefault(20)
  773. ->finishNumber()
  774. ->withRequiredNumber("staminaCost")
  775. ->whichIsGreaterOrEqual(0)
  776. ->withDefault(0.5)
  777. ->finishNumber()
  778. ->withRequiredNumber("staminaCostDevider")
  779. ->whichIsGreaterOrEqual(0)
  780. ->withDefault(0.8)
  781. ->finishNumber()
  782. ->withRequiredNumber("additionalStaminaCostDeviderPerLevel")
  783. ->whichIsGreaterOrEqual(0)
  784. ->withDefault(0.2)
  785. ->finishNumber()
  786. ->withRequiredNumber("durabilityCost")
  787. ->whichIsGreaterOrEqual(0)
  788. ->withDefault(0.5)
  789. ->finishNumber()
  790. ->withRequiredNumber("durabilityCostDevider")
  791. ->whichIsGreaterOrEqual(0)
  792. ->withDefault(0.98)
  793. ->finishNumber()
  794. ->withRequiredNumber("additionalDurabilityCostDeviderPerLevel")
  795. ->whichIsGreaterOrEqual(0)
  796. ->withDefault(0.02)
  797. ->finishNumber()
  798. ->withRequiredNumber("xpGain")
  799. ->whichIsGreaterOrEqual(0)
  800. ->withDefault(0.5)
  801. ->finishNumber();
  802. }
  803. BlockReplaceItemSkill::BlockReplaceItemSkill()
  804. : ItemSkill(),
  805. invalidUseConfig(0),
  806. configs(),
  807. cooldownTicks(20)
  808. {}
  809. BlockReplaceItemSkill::~BlockReplaceItemSkill()
  810. {
  811. if (invalidUseConfig) invalidUseConfig->release();
  812. }
  813. void BlockReplaceItemSkill::load(Framework::StreamReader* zReader)
  814. {
  815. zReader->lese((char*)&cooldownTicks, 4);
  816. ItemSkill::load(zReader);
  817. }
  818. void BlockReplaceItemSkill::save(Framework::StreamWriter* zWriter)
  819. {
  820. zWriter->schreibe((char*)&cooldownTicks, 4);
  821. ItemSkill::save(zWriter);
  822. }
  823. bool BlockReplaceItemSkill::use(Entity* zActor, Item* zUsedItem, Block* zTarget)
  824. {
  825. if (cooldownTicks > 0)
  826. {
  827. cooldownTicks--;
  828. return false;
  829. }
  830. BlockReplaceItemSkillConfig* usedConfig = 0;
  831. for (BlockReplaceItemSkillConfig* config : configs)
  832. {
  833. if (config->zTargetBlockFilter()->test(zTarget))
  834. {
  835. usedConfig = config;
  836. break;
  837. }
  838. }
  839. bool invalid = 0;
  840. if (usedConfig == 0)
  841. {
  842. usedConfig = invalidUseConfig;
  843. invalid = 1;
  844. }
  845. float staminaDevider
  846. = usedConfig->getStaminaCostDevider()
  847. + usedConfig->getAdditionalStaminaCostDeviderPerLevel() * getLevel();
  848. float staminaCost = usedConfig->getStaminaCost();
  849. if (staminaDevider != 0)
  850. {
  851. staminaCost /= staminaDevider;
  852. }
  853. if (zActor->getStamina() < staminaCost)
  854. {
  855. return false;
  856. }
  857. float durabilityDevider
  858. = usedConfig->getDurabilityCostDevider()
  859. + usedConfig->getAdditionalDurabilityCostDeviderPerLevel() * getLevel();
  860. float durabilityCost = usedConfig->getDurabilityCost();
  861. if (durabilityDevider != 0)
  862. {
  863. durabilityCost /= durabilityDevider;
  864. }
  865. zUsedItem->setDurability(zUsedItem->getDurability() - durabilityCost);
  866. zActor->setStamina(zActor->getStamina() - staminaCost);
  867. cooldownTicks = usedConfig->getCooldownTicks();
  868. setXp(getXp() + usedConfig->getXpGain());
  869. if (!invalid)
  870. {
  871. Framework::Vec3<int> pos = zTarget->getPos();
  872. int dimension = zTarget->getDimensionId();
  873. Game::INSTANCE->doLater([pos, dimension, usedConfig]() {
  874. Game::INSTANCE->zDimension(dimension)->placeBlock(
  875. pos, usedConfig->getReplacementBlockTypeId());
  876. });
  877. }
  878. return true;
  879. }
  880. bool BlockReplaceItemSkill::use(
  881. Entity* zActor, Item* zUsedItem, Entity* zTarget)
  882. {
  883. return false;
  884. }
  885. void BlockReplaceItemSkill::setInvalidUseConfig(
  886. BlockReplaceItemSkillConfig* config)
  887. {
  888. if (invalidUseConfig) invalidUseConfig->release();
  889. invalidUseConfig = config;
  890. }
  891. BlockReplaceItemSkillConfig* BlockReplaceItemSkill::zInvalidUseConfig() const
  892. {
  893. return invalidUseConfig;
  894. }
  895. void BlockReplaceItemSkill::addConfig(BlockReplaceItemSkillConfig* config)
  896. {
  897. configs.add(config);
  898. }
  899. const Framework::RCArray<BlockReplaceItemSkillConfig>&
  900. BlockReplaceItemSkill::getConfigs() const
  901. {
  902. return configs;
  903. }
  904. void BlockReplaceItemSkill::setCooldownTicks(int cooldownTicks)
  905. {
  906. this->cooldownTicks = cooldownTicks;
  907. }
  908. int BlockReplaceItemSkill::getCooldownTicks() const
  909. {
  910. return cooldownTicks;
  911. }
  912. BlockReplaceItemSkillFactory::BlockReplaceItemSkillFactory()
  913. : ItemSkillFactoryBase()
  914. {}
  915. BlockReplaceItemSkill* BlockReplaceItemSkillFactory::createValue(
  916. Framework::JSON::JSONObject* zJson) const
  917. {
  918. return new BlockReplaceItemSkill();
  919. }
  920. BlockReplaceItemSkill* BlockReplaceItemSkillFactory::fromJson(
  921. Framework::JSON::JSONObject* zJson) const
  922. {
  923. BlockReplaceItemSkill* result = ItemSkillFactoryBase::fromJson(zJson);
  924. BlockReplaceItemSkillConfig* invalidUseConfig
  925. = new BlockReplaceItemSkillConfig();
  926. invalidUseConfig->setStaminaCost(
  927. (float)zJson->zValue("invalidStaminaCost")->asNumber()->getNumber());
  928. invalidUseConfig->setStaminaCostDevider(
  929. (float)zJson->zValue("invalidStaminaCostDevider")
  930. ->asNumber()
  931. ->getNumber());
  932. invalidUseConfig->setAdditionalStaminaCostDeviderPerLevel(
  933. (float)zJson->zValue("invalidAdditionalStaminaCostDeviderPerLevel")
  934. ->asNumber()
  935. ->getNumber());
  936. invalidUseConfig->setDurabilityCost(
  937. (float)zJson->zValue("invalidDurabilityCost")->asNumber()->getNumber());
  938. invalidUseConfig->setDurabilityCostDevider(
  939. (float)zJson->zValue("invalidDurabilityCostDevider")
  940. ->asNumber()
  941. ->getNumber());
  942. invalidUseConfig->setAdditionalDurabilityCostDeviderPerLevel(
  943. (float)zJson->zValue("invalidAdditionalDurabilityCostDeviderPerLevel")
  944. ->asNumber()
  945. ->getNumber());
  946. invalidUseConfig->setCooldownTicks(
  947. (int)zJson->zValue("invalidCooldownTicks")->asNumber()->getNumber());
  948. invalidUseConfig->setXpGain(0.f);
  949. result->setInvalidUseConfig(invalidUseConfig);
  950. Framework::RCArray<BlockReplaceItemSkillConfig> configs;
  951. for (Framework::JSON::JSONValue* value :
  952. *zJson->zValue("configs")->asArray())
  953. {
  954. result->addConfig(Game::INSTANCE->zTypeRegistry()
  955. ->fromJson<BlockReplaceItemSkillConfig>(value));
  956. }
  957. return result;
  958. }
  959. Framework::JSON::JSONObject* BlockReplaceItemSkillFactory::toJsonObject(
  960. BlockReplaceItemSkill* zObject) const
  961. {
  962. Framework::JSON::JSONObject* result
  963. = ItemSkillFactoryBase::toJsonObject(zObject);
  964. result->addValue("invalidStaminaCost",
  965. new Framework::JSON::JSONNumber(
  966. zObject->zInvalidUseConfig()->getStaminaCost()));
  967. result->addValue("invalidStaminaCostDevider",
  968. new Framework::JSON::JSONNumber(
  969. zObject->zInvalidUseConfig()->getStaminaCostDevider()));
  970. result->addValue("invalidAdditionalStaminaCostDeviderPerLevel",
  971. new Framework::JSON::JSONNumber(zObject->zInvalidUseConfig()
  972. ->getAdditionalStaminaCostDeviderPerLevel()));
  973. result->addValue("invalidDurabilityCost",
  974. new Framework::JSON::JSONNumber(
  975. zObject->zInvalidUseConfig()->getDurabilityCost()));
  976. result->addValue("invalidDurabilityCostDevider",
  977. new Framework::JSON::JSONNumber(
  978. zObject->zInvalidUseConfig()->getDurabilityCostDevider()));
  979. result->addValue("invalidAdditionalDurabilityCostDeviderPerLevel",
  980. new Framework::JSON::JSONNumber(zObject->zInvalidUseConfig()
  981. ->getAdditionalDurabilityCostDeviderPerLevel()));
  982. result->addValue("invalidCooldownTicks",
  983. new Framework::JSON::JSONNumber(
  984. zObject->zInvalidUseConfig()->getCooldownTicks()));
  985. Framework::JSON::JSONArray* configs = new Framework::JSON::JSONArray();
  986. for (BlockReplaceItemSkillConfig* config : zObject->getConfigs())
  987. {
  988. configs->addValue(Game::INSTANCE->zTypeRegistry()->toJson(config));
  989. }
  990. result->addValue("configs", configs);
  991. return result;
  992. }
  993. JSONObjectValidationBuilder* BlockReplaceItemSkillFactory::addToValidator(
  994. JSONObjectValidationBuilder* builder) const
  995. {
  996. return ItemSkillFactoryBase::addToValidator(
  997. builder->withRequiredNumber("invalidStaminaCost")
  998. ->whichIsGreaterOrEqual(0.0)
  999. ->withDefault(0.5)
  1000. ->finishNumber()
  1001. ->withRequiredNumber("invalidStaminaCostDevider")
  1002. ->whichIsGreaterOrEqual(0.0)
  1003. ->withDefault(0.8)
  1004. ->finishNumber()
  1005. ->withRequiredNumber("invalidAdditionalStaminaCostDeviderPerLevel")
  1006. ->whichIsGreaterOrEqual(0.0)
  1007. ->withDefault(0.2)
  1008. ->finishNumber()
  1009. ->withRequiredNumber("invalidDurabilityCost")
  1010. ->whichIsGreaterOrEqual(0.0)
  1011. ->withDefault(0.5)
  1012. ->finishNumber()
  1013. ->withRequiredNumber("invalidDurabilityCostDevider")
  1014. ->whichIsGreaterOrEqual(0.0)
  1015. ->withDefault(0.98)
  1016. ->finishNumber()
  1017. ->withRequiredNumber(
  1018. "invalidAdditionalDurabilityCostDeviderPerLevel")
  1019. ->whichIsGreaterOrEqual(0.0)
  1020. ->withDefault(0.02)
  1021. ->finishNumber()
  1022. ->withRequiredNumber("invalidCooldownTicks")
  1023. ->withDefault(20)
  1024. ->finishNumber()
  1025. ->withRequiredArray("configs")
  1026. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  1027. ->getValidator<BlockReplaceItemSkillConfig>())
  1028. ->finishArray());
  1029. }
  1030. const char* BlockReplaceItemSkillFactory::getTypeToken() const
  1031. {
  1032. return "replaceBlock";
  1033. }
  1034. DamagingItemSkillConfig::DamagingItemSkillConfig()
  1035. : ReferenceCounter(),
  1036. targetBlockFilter(0),
  1037. damage(2.f),
  1038. damagePerHeadHardness(1.f),
  1039. baseDamageMultiplier(1.f),
  1040. damageMultiplierPerHeadHardness(0.f),
  1041. damagePerLevel(0.3f),
  1042. damageMultiplierPerLevel(0.0f),
  1043. damageDevider(1.0f),
  1044. damageDeviderPerHardness(1.0f),
  1045. staminaCost(0.00001f),
  1046. staminaCostPerDamage(0.00001f),
  1047. staminaCostPerHardness(0.001f),
  1048. staminaCostDevider(0.9f),
  1049. staminaCostDeviderPerLevel(0.1f),
  1050. durabilityCost(0.1f),
  1051. durabilityCostPerDamage(0.01f),
  1052. durabilityCostPerHardness(0.01f),
  1053. durabilityCostDevider(0.8f),
  1054. additionalDurabilityCostDeviderPerLevel(0.2f),
  1055. xpGainPerDamage(0.05f)
  1056. {}
  1057. DamagingItemSkillConfig::~DamagingItemSkillConfig()
  1058. {
  1059. if (targetBlockFilter) targetBlockFilter->release();
  1060. }
  1061. void DamagingItemSkillConfig::setTargetBlockFilter(
  1062. BlockFilter* targetBlockFilter)
  1063. {
  1064. if (this->targetBlockFilter) this->targetBlockFilter->release();
  1065. this->targetBlockFilter = targetBlockFilter;
  1066. }
  1067. BlockFilter* DamagingItemSkillConfig::zTargetBlockFilter() const
  1068. {
  1069. return targetBlockFilter;
  1070. }
  1071. void DamagingItemSkillConfig::setDamage(float damage)
  1072. {
  1073. this->damage = damage;
  1074. }
  1075. float DamagingItemSkillConfig::getDamage() const
  1076. {
  1077. return damage;
  1078. }
  1079. void DamagingItemSkillConfig::setDamagePerHeadHardness(
  1080. float damagePerHeadHardness)
  1081. {
  1082. this->damagePerHeadHardness = damagePerHeadHardness;
  1083. }
  1084. float DamagingItemSkillConfig::getDamagePerHeadHardness() const
  1085. {
  1086. return damageDeviderPerHardness;
  1087. }
  1088. void DamagingItemSkillConfig::setBaseDamageMultiplier(
  1089. float baseDamageMultiplier)
  1090. {
  1091. this->baseDamageMultiplier = baseDamageMultiplier;
  1092. }
  1093. float DamagingItemSkillConfig::getBaseDamageMultiplier() const
  1094. {
  1095. return baseDamageMultiplier;
  1096. }
  1097. void DamagingItemSkillConfig::setDamageMultiplierPerHeadHardness(
  1098. float damageMupliplierPerHeadHardness)
  1099. {
  1100. this->damageMultiplierPerHeadHardness = damageMupliplierPerHeadHardness;
  1101. }
  1102. float DamagingItemSkillConfig::getDamageMultiplierPerHeadHardness() const
  1103. {
  1104. return damageMultiplierPerHeadHardness;
  1105. }
  1106. void DamagingItemSkillConfig::setDamagePerLevel(float damagePerLevel)
  1107. {
  1108. this->damagePerLevel = damagePerLevel;
  1109. }
  1110. float DamagingItemSkillConfig::getDamagePerLevel() const
  1111. {
  1112. return damagePerLevel;
  1113. }
  1114. void DamagingItemSkillConfig::setDamageMultiplierPerLevel(
  1115. float damageMultiplierPerLevel)
  1116. {
  1117. this->damageMultiplierPerLevel = damageMultiplierPerLevel;
  1118. }
  1119. float DamagingItemSkillConfig::getDamageMultiplierPerLevel() const
  1120. {
  1121. return damageMultiplierPerLevel;
  1122. }
  1123. void DamagingItemSkillConfig::setDamageDevider(float damageDevider)
  1124. {
  1125. this->damageDevider = damageDevider;
  1126. }
  1127. float DamagingItemSkillConfig::getDamageDevider() const
  1128. {
  1129. return damageDevider;
  1130. }
  1131. void DamagingItemSkillConfig::setDamageDeviderPerHardness(
  1132. float damageDeviderPerHardness)
  1133. {
  1134. this->damageDeviderPerHardness = damageDeviderPerHardness;
  1135. }
  1136. float DamagingItemSkillConfig::getDamageDeviderPerHardness() const
  1137. {
  1138. return damageDeviderPerHardness;
  1139. }
  1140. void DamagingItemSkillConfig::setStaminaCost(float staminaCost)
  1141. {
  1142. this->staminaCost = staminaCost;
  1143. }
  1144. float DamagingItemSkillConfig::getStaminaCost() const
  1145. {
  1146. return staminaCost;
  1147. }
  1148. void DamagingItemSkillConfig::setStaminaCostPerDamage(
  1149. float staminaCostPerDamage)
  1150. {
  1151. this->staminaCostPerDamage = staminaCostPerDamage;
  1152. }
  1153. float DamagingItemSkillConfig::getStaminaCostPerDamage() const
  1154. {
  1155. return staminaCostPerDamage;
  1156. }
  1157. void DamagingItemSkillConfig::setStaminaCostPerHardness(
  1158. float staminaCostPerHardness)
  1159. {
  1160. this->staminaCostPerHardness = staminaCostPerHardness;
  1161. }
  1162. float DamagingItemSkillConfig::getStaminaCostPerHardness() const
  1163. {
  1164. return staminaCostPerHardness;
  1165. }
  1166. void DamagingItemSkillConfig::setStaminaCostDevider(float staminaCostDevider)
  1167. {
  1168. this->staminaCostDevider = staminaCostDevider;
  1169. }
  1170. float DamagingItemSkillConfig::getStaminaCostDevider() const
  1171. {
  1172. return staminaCostDevider;
  1173. }
  1174. void DamagingItemSkillConfig::setStaminaCostDeviderPerLevel(
  1175. float staminaCostDeviderPerLevel)
  1176. {
  1177. this->staminaCostDeviderPerLevel = staminaCostDeviderPerLevel;
  1178. }
  1179. float DamagingItemSkillConfig::getStaminaCostDeviderPerLevel() const
  1180. {
  1181. return staminaCostDeviderPerLevel;
  1182. }
  1183. void DamagingItemSkillConfig::setDurabilityCost(float durabilityCost)
  1184. {
  1185. this->durabilityCost = durabilityCost;
  1186. }
  1187. float DamagingItemSkillConfig::getDurabilityCost() const
  1188. {
  1189. return durabilityCost;
  1190. }
  1191. void DamagingItemSkillConfig::setDurabilityCostPerDamage(
  1192. float durabilityCostPerDamage)
  1193. {
  1194. this->durabilityCostPerDamage = durabilityCostPerDamage;
  1195. }
  1196. float DamagingItemSkillConfig::getDurabilityCostPerDamage() const
  1197. {
  1198. return durabilityCostPerDamage;
  1199. }
  1200. void DamagingItemSkillConfig::setDurabilityCostPerHardness(
  1201. float durabilityCostPerHardness)
  1202. {
  1203. this->durabilityCostPerHardness = durabilityCostPerHardness;
  1204. }
  1205. float DamagingItemSkillConfig::getDurabilityCostPerHardness() const
  1206. {
  1207. return durabilityCostPerHardness;
  1208. }
  1209. void DamagingItemSkillConfig::setDurabilityCostDevider(
  1210. float durabilityCostDevider)
  1211. {
  1212. this->durabilityCostDevider = durabilityCostDevider;
  1213. }
  1214. float DamagingItemSkillConfig::getDurabilityCostDevider() const
  1215. {
  1216. return durabilityCostDevider;
  1217. }
  1218. void DamagingItemSkillConfig::setAdditionalDurabilityCostDeviderPerLevel(
  1219. float additionalDurabilityCostDeviderPerLevel)
  1220. {
  1221. this->additionalDurabilityCostDeviderPerLevel
  1222. = additionalDurabilityCostDeviderPerLevel;
  1223. }
  1224. float DamagingItemSkillConfig::getAdditionalDurabilityCostDeviderPerLevel()
  1225. const
  1226. {
  1227. return additionalDurabilityCostDeviderPerLevel;
  1228. }
  1229. void DamagingItemSkillConfig::setXpGainPerDamage(float xpGainPerDamage)
  1230. {
  1231. this->xpGainPerDamage = xpGainPerDamage;
  1232. }
  1233. float DamagingItemSkillConfig::getXpGainPerDamage() const
  1234. {
  1235. return xpGainPerDamage;
  1236. }
  1237. DamagingItemSkillConfigFactory::DamagingItemSkillConfigFactory()
  1238. : ObjectTypeFactory()
  1239. {}
  1240. DamagingItemSkillConfig* DamagingItemSkillConfigFactory::fromJson(
  1241. Framework::JSON::JSONObject* zJson) const
  1242. {
  1243. DamagingItemSkillConfig* result = new DamagingItemSkillConfig();
  1244. result->setTargetBlockFilter(
  1245. Game::INSTANCE->zTypeRegistry()->fromJson<BlockFilter>(
  1246. zJson->zValue("targetFilter")));
  1247. result->setDamage(
  1248. (float)zJson->asObject()->zValue("damage")->asNumber()->getNumber());
  1249. result->setDamagePerHeadHardness((float)zJson->asObject()
  1250. ->zValue("damagePerHeadHardness")
  1251. ->asNumber()
  1252. ->getNumber());
  1253. result->setBaseDamageMultiplier((float)zJson->asObject()
  1254. ->zValue("baseDamageMultiplier")
  1255. ->asNumber()
  1256. ->getNumber());
  1257. result->setDamageMultiplierPerHeadHardness((float)zJson->asObject()
  1258. ->zValue("damageMultiplierPerHeadHardness")
  1259. ->asNumber()
  1260. ->getNumber());
  1261. result->setDamagePerLevel((float)zJson->asObject()
  1262. ->zValue("damagePerLevel")
  1263. ->asNumber()
  1264. ->getNumber());
  1265. result->setDamageMultiplierPerLevel((float)zJson->asObject()
  1266. ->zValue("damageMultiplierPerLevel")
  1267. ->asNumber()
  1268. ->getNumber());
  1269. result->setDamageDevider((float)zJson->asObject()
  1270. ->zValue("damageDevider")
  1271. ->asNumber()
  1272. ->getNumber());
  1273. result->setDamageDeviderPerHardness((float)zJson->asObject()
  1274. ->zValue("damageDeviderPerHardness")
  1275. ->asNumber()
  1276. ->getNumber());
  1277. result->setStaminaCost((float)zJson->asObject()
  1278. ->zValue("staminaCost")
  1279. ->asNumber()
  1280. ->getNumber());
  1281. result->setStaminaCostPerDamage((float)zJson->asObject()
  1282. ->zValue("staminaCostPerDamage")
  1283. ->asNumber()
  1284. ->getNumber());
  1285. result->setStaminaCostPerHardness((float)zJson->asObject()
  1286. ->zValue("staminaCostPerHardness")
  1287. ->asNumber()
  1288. ->getNumber());
  1289. result->setStaminaCostDevider((float)zJson->asObject()
  1290. ->zValue("staminaCostDevider")
  1291. ->asNumber()
  1292. ->getNumber());
  1293. result->setStaminaCostDeviderPerLevel((float)zJson->asObject()
  1294. ->zValue("staminaCostDeviderPerLevel")
  1295. ->asNumber()
  1296. ->getNumber());
  1297. result->setDurabilityCost((float)zJson->asObject()
  1298. ->zValue("durabilityCost")
  1299. ->asNumber()
  1300. ->getNumber());
  1301. result->setDurabilityCostPerDamage((float)zJson->asObject()
  1302. ->zValue("durabilityCostPerDamage")
  1303. ->asNumber()
  1304. ->getNumber());
  1305. result->setDurabilityCostPerHardness((float)zJson->asObject()
  1306. ->zValue("durabilityCostPerHardness")
  1307. ->asNumber()
  1308. ->getNumber());
  1309. result->setDurabilityCostDevider((float)zJson->asObject()
  1310. ->zValue("durabilityCostDevider")
  1311. ->asNumber()
  1312. ->getNumber());
  1313. result->setAdditionalDurabilityCostDeviderPerLevel((float)zJson->asObject()
  1314. ->zValue("additionalDurabilityCostDeviderPerLevel")
  1315. ->asNumber()
  1316. ->getNumber());
  1317. result->setXpGainPerDamage((float)zJson->asObject()
  1318. ->zValue("xpGainPerDamage")
  1319. ->asNumber()
  1320. ->getNumber());
  1321. return result;
  1322. }
  1323. Framework::JSON::JSONObject* DamagingItemSkillConfigFactory::toJsonObject(
  1324. DamagingItemSkillConfig* zObject) const
  1325. {
  1326. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  1327. result->addValue("targetFilter",
  1328. Game::INSTANCE->zTypeRegistry()->toJson(zObject->zTargetBlockFilter()));
  1329. result->addValue(
  1330. "damage", new Framework::JSON::JSONNumber(zObject->getDamage()));
  1331. result->addValue("damagePerHeadHardness",
  1332. new Framework::JSON::JSONNumber(zObject->getDamagePerHeadHardness()));
  1333. result->addValue("baseDamageMultiplier",
  1334. new Framework::JSON::JSONNumber(zObject->getBaseDamageMultiplier()));
  1335. result->addValue("damageMultiplierPerHeadHardness",
  1336. new Framework::JSON::JSONNumber(
  1337. zObject->getDamageMultiplierPerHeadHardness()));
  1338. result->addValue("damagePerLevel",
  1339. new Framework::JSON::JSONNumber(zObject->getDamagePerLevel()));
  1340. result->addValue("damageMultiplierPerLevel",
  1341. new Framework::JSON::JSONNumber(
  1342. zObject->getDamageMultiplierPerLevel()));
  1343. result->addValue("damageDevider",
  1344. new Framework::JSON::JSONNumber(zObject->getDamageDevider()));
  1345. result->addValue("damageDeviderPerHardness",
  1346. new Framework::JSON::JSONNumber(
  1347. zObject->getDamageDeviderPerHardness()));
  1348. result->addValue("staminaCost",
  1349. new Framework::JSON::JSONNumber(zObject->getStaminaCost()));
  1350. result->addValue("staminaCostPerDamage",
  1351. new Framework::JSON::JSONNumber(zObject->getStaminaCostPerDamage()));
  1352. result->addValue("staminaCostPerHardness",
  1353. new Framework::JSON::JSONNumber(zObject->getStaminaCostPerHardness()));
  1354. result->addValue("staminaCostDevider",
  1355. new Framework::JSON::JSONNumber(zObject->getStaminaCostDevider()));
  1356. result->addValue("staminaCostDeviderPerLevel",
  1357. new Framework::JSON::JSONNumber(
  1358. zObject->getStaminaCostDeviderPerLevel()));
  1359. result->addValue("durabilityCost",
  1360. new Framework::JSON::JSONNumber(zObject->getDurabilityCost()));
  1361. result->addValue("durabilityCostPerDamage",
  1362. new Framework::JSON::JSONNumber(zObject->getDurabilityCostPerDamage()));
  1363. result->addValue("durabilityCostPerHardness",
  1364. new Framework::JSON::JSONNumber(
  1365. zObject->getDurabilityCostPerHardness()));
  1366. result->addValue("durabilityCostDevider",
  1367. new Framework::JSON::JSONNumber(zObject->getDurabilityCostDevider()));
  1368. result->addValue("additionalDurabilityCostDeviderPerLevel",
  1369. new Framework::JSON::JSONNumber(
  1370. zObject->getAdditionalDurabilityCostDeviderPerLevel()));
  1371. result->addValue("xpGainPerDamage",
  1372. new Framework::JSON::JSONNumber(zObject->getXpGainPerDamage()));
  1373. return result;
  1374. }
  1375. JSONObjectValidationBuilder* DamagingItemSkillConfigFactory::addToValidator(
  1376. JSONObjectValidationBuilder* builder) const
  1377. {
  1378. return builder
  1379. ->withRequiredAttribute("targetFilter",
  1380. Game::INSTANCE->zTypeRegistry()->getValidator<BlockFilter>())
  1381. ->withRequiredNumber("damage")
  1382. ->whichIsGreaterOrEqual(0.0)
  1383. ->withDefault(2.0)
  1384. ->finishNumber()
  1385. ->withRequiredNumber("damagePerHeadHardness")
  1386. ->whichIsGreaterOrEqual(0.0)
  1387. ->withDefault(1.0)
  1388. ->finishNumber()
  1389. ->withRequiredNumber("baseDamageMultiplier")
  1390. ->whichIsGreaterOrEqual(0.0)
  1391. ->withDefault(1.0)
  1392. ->finishNumber()
  1393. ->withRequiredNumber("damageMultiplierPerHeadHardness")
  1394. ->whichIsGreaterOrEqual(0.0)
  1395. ->withDefault(0.0)
  1396. ->finishNumber()
  1397. ->withRequiredNumber("damagePerLevel")
  1398. ->whichIsGreaterOrEqual(0.0)
  1399. ->withDefault(0.3)
  1400. ->finishNumber()
  1401. ->withRequiredNumber("damageMultiplierPerLevel")
  1402. ->whichIsGreaterOrEqual(0.0)
  1403. ->withDefault(0.0)
  1404. ->finishNumber()
  1405. ->withRequiredNumber("damageDevider")
  1406. ->whichIsGreaterOrEqual(0.0)
  1407. ->withDefault(1.0)
  1408. ->finishNumber()
  1409. ->withRequiredNumber("damageDeviderPerHardness")
  1410. ->whichIsGreaterOrEqual(0.0)
  1411. ->withDefault(1.0)
  1412. ->finishNumber()
  1413. ->withRequiredNumber("staminaCost")
  1414. ->whichIsGreaterOrEqual(0.0)
  1415. ->withDefault(0.0001)
  1416. ->finishNumber()
  1417. ->withRequiredNumber("staminaCostPerDamage")
  1418. ->whichIsGreaterOrEqual(0.0)
  1419. ->withDefault(0.00001)
  1420. ->finishNumber()
  1421. ->withRequiredNumber("staminaCostPerHardness")
  1422. ->whichIsGreaterOrEqual(0.0)
  1423. ->withDefault(0.001)
  1424. ->finishNumber()
  1425. ->withRequiredNumber("staminaCostDevider")
  1426. ->whichIsGreaterOrEqual(0.0)
  1427. ->withDefault(0.9)
  1428. ->finishNumber()
  1429. ->withRequiredNumber("staminaCostDeviderPerLevel")
  1430. ->whichIsGreaterOrEqual(0.0)
  1431. ->withDefault(0.1)
  1432. ->finishNumber()
  1433. ->withRequiredNumber("durabilityCost")
  1434. ->whichIsGreaterOrEqual(0.0)
  1435. ->withDefault(0.1)
  1436. ->finishNumber()
  1437. ->withRequiredNumber("durabilityCostPerDamage")
  1438. ->whichIsGreaterOrEqual(0.0)
  1439. ->withDefault(0.01)
  1440. ->finishNumber()
  1441. ->withRequiredNumber("durabilityCostPerHardness")
  1442. ->whichIsGreaterOrEqual(0.0)
  1443. ->withDefault(0.01)
  1444. ->finishNumber()
  1445. ->withRequiredNumber("durabilityCostDevider")
  1446. ->whichIsGreaterOrEqual(0.0)
  1447. ->withDefault(0.8)
  1448. ->finishNumber()
  1449. ->withRequiredNumber("additionalDurabilityCostDeviderPerLevel")
  1450. ->whichIsGreaterOrEqual(0.0)
  1451. ->withDefault(0.2)
  1452. ->finishNumber()
  1453. ->withRequiredNumber("xpGainPerDamage")
  1454. ->whichIsGreaterOrEqual(0.0)
  1455. ->withDefault(0.05)
  1456. ->finishNumber();
  1457. }
  1458. DamagingItemSkill::DamagingItemSkill()
  1459. : ItemSkill(),
  1460. invalidUseConfig(0)
  1461. {}
  1462. DamagingItemSkill::~DamagingItemSkill()
  1463. {
  1464. if (invalidUseConfig) invalidUseConfig->release();
  1465. }
  1466. bool DamagingItemSkill::use(Entity* zActor, Item* zUsedItem, Block* zTarget)
  1467. {
  1468. BasicToolItem* tool = dynamic_cast<BasicToolItem*>(zUsedItem);
  1469. DamagingItemSkillConfig* usedConfig = 0;
  1470. for (DamagingItemSkillConfig* config : configs)
  1471. {
  1472. if (config->zTargetBlockFilter()->test(zTarget))
  1473. {
  1474. usedConfig = config;
  1475. break;
  1476. }
  1477. }
  1478. bool invalid = 0;
  1479. if (usedConfig == 0)
  1480. {
  1481. usedConfig = invalidUseConfig;
  1482. invalid = 1;
  1483. }
  1484. float damage = usedConfig->getDamage()
  1485. + usedConfig->getDamagePerHeadHardness()
  1486. * (tool ? tool->getHeadMaterialHardness() : 0)
  1487. + usedConfig->getDamagePerLevel() * getLevel();
  1488. float damageMultiplier
  1489. = usedConfig->getBaseDamageMultiplier()
  1490. + usedConfig->getDamageMultiplierPerLevel() * getLevel()
  1491. + usedConfig->getDamageMultiplierPerHeadHardness()
  1492. * (tool ? tool->getHeadMaterialHardness() : 0);
  1493. if (damageMultiplier != 0)
  1494. {
  1495. damage *= damageMultiplier;
  1496. }
  1497. float damageDevider
  1498. = usedConfig->getDamageDevider()
  1499. + usedConfig->getDamageDeviderPerHardness() * zTarget->getHardness();
  1500. if (damageDevider != 0)
  1501. {
  1502. damage /= damageDevider;
  1503. }
  1504. float staminaCost
  1505. = usedConfig->getStaminaCost()
  1506. + usedConfig->getStaminaCostPerDamage() * damage
  1507. + usedConfig->getStaminaCostPerHardness() * zTarget->getHardness();
  1508. float staminaDevider
  1509. = usedConfig->getStaminaCostDevider()
  1510. + usedConfig->getStaminaCostDeviderPerLevel() * getLevel();
  1511. if (staminaDevider != 0)
  1512. {
  1513. staminaCost /= staminaDevider;
  1514. }
  1515. if (zActor->getStamina() < staminaCost)
  1516. {
  1517. return false;
  1518. }
  1519. float durabilityCost
  1520. = usedConfig->getDurabilityCost()
  1521. + usedConfig->getDurabilityCostPerDamage() * damage
  1522. + usedConfig->getDurabilityCostPerHardness() * zTarget->getHardness();
  1523. float durabilityDevider
  1524. = usedConfig->getDurabilityCostDevider()
  1525. + usedConfig->getAdditionalDurabilityCostDeviderPerLevel() * getLevel();
  1526. if (durabilityDevider != 0)
  1527. {
  1528. durabilityCost /= durabilityDevider;
  1529. }
  1530. if (zUsedItem)
  1531. {
  1532. zUsedItem->setDurability(zUsedItem->getDurability() - durabilityCost);
  1533. }
  1534. zActor->setStamina(zActor->getStamina() - staminaCost);
  1535. setXp(getXp() + usedConfig->getXpGainPerDamage() * damage);
  1536. zTarget->setHP(zActor, zUsedItem, this, zTarget->getHP() - damage);
  1537. return true;
  1538. }
  1539. bool DamagingItemSkill::use(Entity* zActor, Item* zUsedItem, Entity* zTarget)
  1540. {
  1541. return false;
  1542. }
  1543. void DamagingItemSkill::setInvalidUseConfig(DamagingItemSkillConfig* config)
  1544. {
  1545. if (invalidUseConfig) invalidUseConfig->release();
  1546. invalidUseConfig = config;
  1547. }
  1548. DamagingItemSkillConfig* DamagingItemSkill::zInvalidUseConfig() const
  1549. {
  1550. return invalidUseConfig;
  1551. }
  1552. void DamagingItemSkill::addConfig(DamagingItemSkillConfig* config)
  1553. {
  1554. configs.add(config);
  1555. }
  1556. const Framework::RCArray<DamagingItemSkillConfig>&
  1557. DamagingItemSkill::getConfigs() const
  1558. {
  1559. return configs;
  1560. }
  1561. DamagingItemSkillFactory::DamagingItemSkillFactory()
  1562. : ItemSkillFactoryBase()
  1563. {}
  1564. DamagingItemSkill* DamagingItemSkillFactory::createValue(
  1565. Framework::JSON::JSONObject* zJson) const
  1566. {
  1567. return new DamagingItemSkill();
  1568. }
  1569. DamagingItemSkill* DamagingItemSkillFactory::fromJson(
  1570. Framework::JSON::JSONObject* zJson) const
  1571. {
  1572. DamagingItemSkill* result = ItemSkillFactoryBase::fromJson(zJson);
  1573. for (Framework::JSON::JSONValue* configValue :
  1574. *zJson->zValue("configs")->asArray())
  1575. {
  1576. result->addConfig(
  1577. Game::INSTANCE->zTypeRegistry()->fromJson<DamagingItemSkillConfig>(
  1578. configValue));
  1579. }
  1580. DamagingItemSkillConfig* invalidUseConfig = new DamagingItemSkillConfig();
  1581. invalidUseConfig->setDamage(0.f);
  1582. invalidUseConfig->setDamageDeviderPerHardness(0.f);
  1583. invalidUseConfig->setBaseDamageMultiplier(0.f);
  1584. invalidUseConfig->setDamageMultiplierPerHeadHardness(0.f);
  1585. invalidUseConfig->setDamagePerLevel(0.f);
  1586. invalidUseConfig->setDamageMultiplierPerLevel(0.f);
  1587. invalidUseConfig->setDamageDevider(1.f);
  1588. invalidUseConfig->setDamageDeviderPerHardness(0.f);
  1589. invalidUseConfig->setStaminaCost(
  1590. (float)zJson->zValue("invalidStaminaCost")->asNumber()->getNumber());
  1591. invalidUseConfig->setStaminaCostPerDamage(0.f);
  1592. invalidUseConfig->setStaminaCostPerHardness(
  1593. (float)zJson->zValue("invalidStaminaCostPerHardness")
  1594. ->asNumber()
  1595. ->getNumber());
  1596. invalidUseConfig->setStaminaCostDevider(
  1597. (float)zJson->zValue("invalidStaminaCostDevider")
  1598. ->asNumber()
  1599. ->getNumber());
  1600. invalidUseConfig->setStaminaCostDeviderPerLevel(
  1601. (float)zJson->zValue("invalidStaminaCostDeviderPerLevel")
  1602. ->asNumber()
  1603. ->getNumber());
  1604. invalidUseConfig->setDurabilityCost(
  1605. (float)zJson->zValue("invalidDurabilityCost")->asNumber()->getNumber());
  1606. invalidUseConfig->setDurabilityCostPerHardness(
  1607. (float)zJson->zValue("invalidDurabilityCostPerHardness")
  1608. ->asNumber()
  1609. ->getNumber());
  1610. invalidUseConfig->setDurabilityCostDevider(
  1611. (float)zJson->zValue("invalidDurabilityCostDevider")
  1612. ->asNumber()
  1613. ->getNumber());
  1614. invalidUseConfig->setAdditionalDurabilityCostDeviderPerLevel(
  1615. (float)zJson->zValue("invalidDurabilityCostDeviderPerLevel")
  1616. ->asNumber()
  1617. ->getNumber());
  1618. result->setInvalidUseConfig(invalidUseConfig);
  1619. return result;
  1620. }
  1621. Framework::JSON::JSONObject* DamagingItemSkillFactory::toJsonObject(
  1622. DamagingItemSkill* zObject) const
  1623. {
  1624. Framework::JSON::JSONObject* result
  1625. = ItemSkillFactoryBase::toJsonObject(zObject);
  1626. result->addValue(
  1627. "maxXp", new Framework::JSON::JSONNumber(zObject->getMaxXp()));
  1628. result->addValue("invalidStaminaCost",
  1629. new Framework::JSON::JSONNumber(
  1630. zObject->zInvalidUseConfig()->getStaminaCost()));
  1631. result->addValue("invalidStaminaCostPerHardness",
  1632. new Framework::JSON::JSONNumber(
  1633. zObject->zInvalidUseConfig()->getStaminaCostPerHardness()));
  1634. result->addValue("invalidStaminaCostDevider",
  1635. new Framework::JSON::JSONNumber(
  1636. zObject->zInvalidUseConfig()->getStaminaCostDevider()));
  1637. result->addValue("invalidStaminaCostDeviderPerLevel",
  1638. new Framework::JSON::JSONNumber(
  1639. zObject->zInvalidUseConfig()->getStaminaCostDeviderPerLevel()));
  1640. result->addValue("invalidDurabilityCost",
  1641. new Framework::JSON::JSONNumber(
  1642. zObject->zInvalidUseConfig()->getDurabilityCost()));
  1643. result->addValue("invalidDurabilityCostPerHardness",
  1644. new Framework::JSON::JSONNumber(
  1645. zObject->zInvalidUseConfig()->getDurabilityCostPerHardness()));
  1646. result->addValue("invalidDurabilityCostDevider",
  1647. new Framework::JSON::JSONNumber(
  1648. zObject->zInvalidUseConfig()->getDurabilityCostDevider()));
  1649. result->addValue("invalidDurabilityCostDeviderPerLevel",
  1650. new Framework::JSON::JSONNumber(zObject->zInvalidUseConfig()
  1651. ->getAdditionalDurabilityCostDeviderPerLevel()));
  1652. Framework::JSON::JSONArray* configs = new Framework::JSON::JSONArray();
  1653. for (DamagingItemSkillConfig* config : zObject->getConfigs())
  1654. {
  1655. configs->addValue(Game::INSTANCE->zTypeRegistry()->toJson(config));
  1656. }
  1657. result->addValue("configs", configs);
  1658. return result;
  1659. }
  1660. JSONObjectValidationBuilder* DamagingItemSkillFactory::addToValidator(
  1661. JSONObjectValidationBuilder* builder) const
  1662. {
  1663. return ItemSkillFactoryBase::addToValidator(
  1664. builder->withRequiredNumber("invalidStaminaCost")
  1665. ->whichIsGreaterOrEqual(0.0)
  1666. ->withDefault(0.5)
  1667. ->finishNumber()
  1668. ->withRequiredNumber("invalidStaminaCostPerHardness")
  1669. ->whichIsGreaterOrEqual(0.0)
  1670. ->withDefault(0.001)
  1671. ->finishNumber()
  1672. ->withRequiredNumber("invalidStaminaCostDevider")
  1673. ->whichIsGreaterOrEqual(0.0)
  1674. ->withDefault(0.8)
  1675. ->finishNumber()
  1676. ->withRequiredNumber("invalidStaminaCostDeviderPerLevel")
  1677. ->whichIsGreaterOrEqual(0.0)
  1678. ->withDefault(0.2)
  1679. ->finishNumber()
  1680. ->withRequiredNumber("invalidDurabilityCost")
  1681. ->whichIsGreaterOrEqual(0.0)
  1682. ->withDefault(0.5)
  1683. ->finishNumber()
  1684. ->withRequiredNumber("invalidDurabilityCostPerHardness")
  1685. ->whichIsGreaterOrEqual(0.0)
  1686. ->withDefault(0.01)
  1687. ->finishNumber()
  1688. ->withRequiredNumber("invalidDurabilityCostDevider")
  1689. ->whichIsGreaterOrEqual(0.0)
  1690. ->withDefault(0.98)
  1691. ->finishNumber()
  1692. ->withRequiredNumber("invalidDurabilityCostDeviderPerLevel")
  1693. ->whichIsGreaterOrEqual(0.0)
  1694. ->withDefault(0.02)
  1695. ->finishNumber()
  1696. ->withRequiredArray("configs")
  1697. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  1698. ->getValidator<DamagingItemSkillConfig>())
  1699. ->finishArray());
  1700. }
  1701. const char* DamagingItemSkillFactory::getTypeToken() const
  1702. {
  1703. return "damaging";
  1704. }