elemPropertyData.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. #include "datahpp/elemPropertyData.h"
  2. #include "plisthpp/redream.h"
  3. #include "datahpp/dataManager.h"
  4. #include <QJsonArray>
  5. ElemPropertyData::ElemPropertyData()
  6. {
  7. iconPath = ":/icon/icon/菜狗.png";
  8. labelName = "0";
  9. maxLayer = "1";
  10. score = "50";
  11. dropConfig = DROPOPT::BYSTATE;
  12. canBeLinked = false;
  13. canMoveAway = false;
  14. }
  15. int ElemPropertyData::getKeyIndex(int poolIndex, QString key)
  16. {
  17. for(int i = 0;i<container[poolIndex].table.size();i++){
  18. if(key == container[poolIndex].table[i].key){
  19. return i;
  20. }
  21. }
  22. return -1;
  23. }
  24. int ElemPropertyData::getChildElemIndex(QString childElemName)
  25. {
  26. for(int i=0;i<childElem.size();i++){
  27. if(childElemName == childElem[i].name){
  28. return i;
  29. }
  30. }
  31. return -1;
  32. }
  33. int ElemPropertyData::getAnimIndex(QString animName)
  34. {
  35. for(int i=0;i<statusEffect.size();i++){
  36. if(statusEffect[i].name == animName){
  37. return i;
  38. }
  39. }
  40. return -1;
  41. }
  42. int ElemPropertyData::getCollAnimIndex(QString name)
  43. {
  44. for(int i=0;i<collAnim.size();i++){
  45. if(collAnim[i].name == name){
  46. return i;
  47. }
  48. }
  49. return -1;
  50. }
  51. int ElemPropertyData::getStatusValIndex(QString statusVal)
  52. {
  53. for(int i=0;i<statusConfig.size();i++){
  54. if(statusConfig[i].statusValue == statusVal){
  55. return i;
  56. }
  57. }
  58. return -1;
  59. }
  60. int ElemPropertyData::getPoolIndex(QString poolName)
  61. {
  62. for(int i=0;i<container.size();i++){
  63. if(container[i].poolName == poolName){
  64. return i;
  65. }
  66. }
  67. return -1;
  68. }
  69. QList<QString> ElemPropertyData::getTimelineList(QString filePath)
  70. {
  71. if(timelineListMap.find(filePath) == timelineListMap.end()){
  72. QList<QString> list = Redream::getInstance()->getTimelineFromRedream(filePath.toStdString());
  73. timelineListMap[filePath] = list;
  74. return list;
  75. }
  76. return timelineListMap[filePath];
  77. }
  78. void ElemPropertyData::readData(const QJsonObject &json)
  79. {
  80. if(json.contains("labelName") && json["labelName"].isString()){
  81. labelName = json["labelName"].toString();
  82. }
  83. if(json.contains("pos") && json["pos"].isString()){
  84. pos = json["pos"].toString();
  85. }
  86. if(json.contains("maxLayer") && json["maxLayer"].isString()){
  87. maxLayer = json["maxLayer"].toString();
  88. }
  89. if(json.contains("score") && json["score"].isString()){
  90. score = json["score"].toString();
  91. }
  92. if(json.contains("dropConfig") && json["maxLayer"].isString()){
  93. dropConfig = static_cast<DROPOPT>(json["dropConfig"].toInt());
  94. }
  95. if(json.contains("iconPath") && json["iconPath"].isString()){
  96. iconPath = json["iconPath"].toString();
  97. }
  98. if(json.contains("canBeLinked") && json["canBeLinked"].isBool()){
  99. canBeLinked = json["canBeLinked"].toBool();
  100. }
  101. if(json.contains("canMoveAway") && json["canMoveAway"].isBool()){
  102. canMoveAway = json["canMoveAway"].toBool();
  103. }
  104. if(json.contains("isContainer") && json["isContainer"].isBool()){
  105. isContainer = json["isContainer"].toBool();
  106. }
  107. if(json.contains("beatByOrder") && json["isContainer"].isBool()){
  108. beatByOrder = json["beatByOrder"].toBool();
  109. }
  110. //状态与效果动画
  111. if(json.contains("anims") && json["anims"].isArray()){
  112. readStatusEffect(json["anims"].toArray());
  113. }
  114. //收集动画
  115. if(json.contains("collAnim") && json["collAnim"].isArray()){
  116. readCollAnim(json["collAnim"].toArray());
  117. }
  118. //状态配置
  119. if(json.contains("statusConfig") && json["statusConfig"].isArray()){
  120. readStatusConfigData(json["statusConfig"].toArray());
  121. }
  122. //容器配置
  123. if(json.contains("container") && json["container"].isArray()){
  124. readContainerConfig(json["container"].toArray());
  125. }
  126. //子元素配置
  127. if(json.contains("childElem") && json["childElem"].isArray()){
  128. readChildElem(json["childElem"].toArray());
  129. }
  130. }
  131. void ElemPropertyData::writeData(QJsonObject &json) const
  132. {
  133. //基础属性
  134. json["labelName"] = labelName;
  135. json["pos"] = pos;
  136. json["maxLayer"] = maxLayer;
  137. json["score"] = score;
  138. json["dropConfig"] = static_cast<int>(dropConfig);
  139. json["iconPath"] = iconPath;
  140. json["canBeLinked"] = canBeLinked;
  141. json["canMoveAway"] = canMoveAway;
  142. json["isContainer"] = isContainer;
  143. json["beatByOrder"] = beatByOrder;
  144. json.insert("anims",writeStatusEffect());
  145. json.insert("collAnim",writeCollAnim());
  146. json.insert("statusConfig",writeStatusConfigData());
  147. json.insert("container",writeContainerConfig());
  148. json.insert("childElem",writeChildElem());
  149. }
  150. ///读入状态与效果动画数据
  151. void ElemPropertyData::readStatusEffect(const QJsonArray &arr)
  152. {
  153. statusEffect.clear();
  154. statusEffect.reserve(arr.size());
  155. for(int i = 0;i < arr.size();i++){
  156. QJsonObject animObj = arr[i].toObject();
  157. StatusEffect anim(animObj["name"].toString());
  158. anim.res = animObj["res"].toString();
  159. anim.timeline = animObj["timeline"].toString();
  160. anim.zOrder = animObj["zOrder"].toString();
  161. statusEffect.append(anim);
  162. }
  163. }
  164. ///写入状态与效果动画数据
  165. QJsonArray ElemPropertyData::writeStatusEffect() const
  166. {
  167. QJsonArray animArray;
  168. for(const StatusEffect &anim:statusEffect)
  169. {
  170. QJsonObject animObj;
  171. animObj["name"] = anim.name;
  172. animObj["res"] = anim.res;
  173. animObj["timeline"] = anim.timeline;
  174. animObj["zOrder"] = anim.zOrder;
  175. animArray.append(animObj);
  176. }
  177. return animArray;
  178. }
  179. ///读入收集动画数据
  180. void ElemPropertyData::readCollAnim(const QJsonArray &arr)
  181. {
  182. collAnim.clear();
  183. collAnim.reserve(arr.size());
  184. for(int i=0;i<arr.size();i++){
  185. QJsonObject collAnimObj = arr[i].toObject();
  186. CollAnim coll(collAnimObj["name"].toString());
  187. coll.type = collAnimObj["type"].toString();
  188. coll.dataMap = readStrStrMap(collAnimObj["dataMap"].toObject());
  189. collAnim.append(coll);
  190. }
  191. }
  192. ///读一个string-string map数据
  193. QMap<QString,QString> ElemPropertyData::readStrStrMap(const QJsonObject &obj)
  194. {
  195. QMap<QString,QString> data;
  196. QStringList keys = obj.keys();
  197. for(int i=0;i<keys.size();i++)
  198. {
  199. QString key = keys[i];
  200. data[key] = obj[key].toString();
  201. }
  202. return data;
  203. }
  204. ///写收集动画数据
  205. QJsonArray ElemPropertyData::writeCollAnim() const
  206. {
  207. QJsonArray collAnimArray;
  208. for(const CollAnim &coll:collAnim){
  209. QJsonObject collAnimObj;
  210. collAnimObj["name"] = coll.name;
  211. collAnimObj["type"] = coll.type;
  212. collAnimObj["dataMap"] = writeStrStrMap(coll.dataMap);
  213. collAnimArray.append(collAnimObj);
  214. }
  215. return collAnimArray;
  216. }
  217. ///写string-string map数据
  218. QJsonObject ElemPropertyData::writeStrStrMap(const QMap<QString,QString> &data) const
  219. {
  220. QStringList keys = data.keys();
  221. QJsonObject dataObj;
  222. for(int i=0;i<keys.size();i++)
  223. {
  224. QString key = keys[i];
  225. dataObj.insert(key,data[key]);
  226. }
  227. return dataObj;
  228. }
  229. ///读状态配置数据
  230. void ElemPropertyData::readStatusConfigData(const QJsonArray &arr)
  231. {
  232. statusConfig.clear();
  233. statusConfig.reserve(arr.size());
  234. for(int i=0;i<arr.size();i++){
  235. QJsonObject statusConfigObj = arr[i].toObject();
  236. StatusConfig configData(statusConfigObj["statusValue"].toString());
  237. configData.initAnim = statusConfigObj["initAnim"].toString();
  238. configData.clickAnim = statusConfigObj["clickAnim"].toString();
  239. configData.multiHit = statusConfigObj["multiHit"].toBool();
  240. configData.beatSubItem = statusConfigObj["beatSubItem"].toBool();
  241. configData.dropable = statusConfigObj["dropable"].toBool();
  242. configData.needCollect = statusConfigObj["needCollect"].toBool();
  243. configData.collTargetType = statusConfigObj["collTargetType"].toString();
  244. configData.collAnim = statusConfigObj["collAnim"].toString();
  245. readAction(statusConfigObj["action"].toObject(), configData);
  246. configData.eventConfig = readEventConfig(statusConfigObj["eventConfig"].toArray());
  247. statusConfig.append(configData);
  248. }
  249. }
  250. ///读事件配置表格数据
  251. QVector<ElemPropertyData::EventConfig> ElemPropertyData::readEventConfig(const QJsonArray &arr)
  252. {
  253. QVector<ElemPropertyData::EventConfig> eventTable;
  254. eventTable.reserve(arr.size());
  255. for(int i=0;i<arr.size();i++){
  256. QJsonObject eventObj = arr[i].toObject();
  257. EventConfig event;
  258. event.name = eventObj["name"].toString();
  259. event.consisColor = eventObj["consisColor"].toBool();
  260. event.changeMagnitude = eventObj["changeMagnitude"].toInt();
  261. event.specialEffect = eventObj["specialEffect"].toString();
  262. event.elimATLattices = eventObj["elimATLattices"].toBool();
  263. eventTable.append(event);
  264. }
  265. return eventTable;
  266. }
  267. void ElemPropertyData::readAction(const QJsonObject &arr, StatusConfig& status)
  268. {
  269. if (arr.isEmpty()) {
  270. return;
  271. }
  272. for (const QString& k : arr.keys()) {
  273. status.action = k;
  274. status.actionConfig = readStrStrMap(arr[k].toObject());
  275. }
  276. }
  277. ///写状态配置数据
  278. QJsonArray ElemPropertyData::writeStatusConfigData() const
  279. {
  280. QJsonArray statusConfigArray;
  281. for(const StatusConfig &status:statusConfig){
  282. QJsonObject statusObj;
  283. statusObj["statusValue"] = status.statusValue;
  284. statusObj["initAnim"] = status.initAnim;
  285. statusObj["clickAnim"] = status.clickAnim;
  286. statusObj["multiHit"] = status.multiHit;
  287. statusObj["beatSubItem"] = status.beatSubItem;
  288. statusObj["dropable"] = status.dropable;
  289. statusObj["needCollect"] = status.needCollect;
  290. statusObj["collTargetType"] = status.collTargetType;
  291. statusObj["collAnim"] = status.collAnim;
  292. statusObj["action"] = writeAction(status);
  293. statusObj.insert("eventConfig",writeEventConfig(status.eventConfig));
  294. statusConfigArray.append(statusObj);
  295. }
  296. return statusConfigArray;
  297. }
  298. QJsonObject ElemPropertyData::writeAction(const StatusConfig &status) const
  299. {
  300. QJsonObject actionObj;
  301. if (status.action != "尚未选择") {
  302. actionObj[status.action] = writeStrStrMap(status.actionConfig);
  303. }
  304. return actionObj;
  305. }
  306. ///写事件配置表格数据
  307. QJsonArray ElemPropertyData::writeEventConfig(const QVector<EventConfig> &eventConfig) const
  308. {
  309. QJsonArray eventArray;
  310. for(const EventConfig &event:eventConfig){
  311. QJsonObject eventObj;
  312. eventObj["name"] = event.name;
  313. eventObj["consisColor"] = event.consisColor;
  314. eventObj["changeMagnitude"] = event.changeMagnitude;
  315. eventObj["specialEffect"] = event.specialEffect;
  316. eventObj["elimATLattices"] = event.elimATLattices;
  317. eventArray.append(eventObj);
  318. }
  319. return eventArray;
  320. }
  321. ///读容器池数据
  322. void ElemPropertyData::readContainerConfig(const QJsonArray &arr)
  323. {
  324. container.clear();
  325. container.reserve(arr.size());
  326. for(int i=0;i<arr.size();i++){
  327. QJsonObject poolObj = arr[i].toObject();
  328. ContainerConfig pool(poolObj["poolName"].toString());
  329. pool.type = poolObj["type"].toString();
  330. pool.table = readContainerTable(poolObj["table"].toArray());
  331. container.append(pool);
  332. }
  333. }
  334. ///读容器池表格数据
  335. QVector<ElemPropertyData::ContainTable> ElemPropertyData::readContainerTable(const QJsonArray &arr)
  336. {
  337. QVector<ContainTable> table;
  338. for(int i=0;i<arr.size();i++){
  339. QJsonObject containObj = arr[i].toObject();
  340. ContainTable contain(containObj["key"].toString());
  341. contain.res = containObj["res"].toString();
  342. contain.initTimeline = containObj["initTimeline"].toString();
  343. contain.clickTimeline = containObj["clickTimeline"].toString();
  344. contain.effectTimeline = containObj["effectTimeline"].toString();
  345. contain.vanishTimeline = containObj["vanishTimeline"].toString();
  346. contain.zOrder = containObj["zOrder"].toString();
  347. table.append(contain);
  348. }
  349. return table;
  350. }
  351. ///写容器池数据
  352. QJsonArray ElemPropertyData::writeContainerConfig() const
  353. {
  354. QJsonArray containConfigArray;
  355. for(const ContainerConfig &contain:container){
  356. QJsonObject containObj;
  357. containObj["poolName"] = contain.poolName;
  358. containObj["type"] = contain.type;
  359. containObj["table"] = writeContainerTable(contain.table);
  360. containConfigArray.append(containObj);
  361. }
  362. return containConfigArray;
  363. }
  364. ///写容器池表格数据
  365. QJsonArray ElemPropertyData::writeContainerTable(const QVector<ContainTable> &containTable) const
  366. {
  367. QJsonArray tableArray;
  368. for(const ContainTable &table:containTable){
  369. QJsonObject tableObj;
  370. tableObj["key"] = table.key;
  371. tableObj["res"] = table.res;
  372. tableObj["initTimeline"] = table.initTimeline;
  373. tableObj["clickTimeline"] = table.clickTimeline;
  374. tableObj["effectTimeline"] = table.effectTimeline;
  375. tableObj["vanishTimeline"] = table.vanishTimeline;
  376. tableObj["zOrder"] = table.zOrder;
  377. tableArray.append(tableObj);
  378. }
  379. return tableArray;
  380. }
  381. ///读子元素数据
  382. void ElemPropertyData::readChildElem(const QJsonArray &arr)
  383. {
  384. childElem.clear();
  385. childElem.reserve(arr.size());
  386. for(int i=0;i<arr.size();i++)
  387. {
  388. QJsonObject childElemObj = arr[i].toObject();
  389. ChildElem elem(childElemObj["name"].toString());
  390. elem.container = childElemObj["container"].toString();
  391. childElem.append(elem);
  392. }
  393. }
  394. ///写子元素数据
  395. QJsonArray ElemPropertyData::writeChildElem() const
  396. {
  397. QJsonArray elemArray;
  398. for(const ChildElem &elem:childElem){
  399. QJsonObject childElemObj;
  400. childElemObj["name"] = elem.name;
  401. childElemObj["container"] = elem.container;
  402. elemArray.append(childElemObj);
  403. }
  404. return elemArray;
  405. }
  406. //导出数据
  407. void ElemPropertyData::exportData(QJsonObject &json) const
  408. {
  409. //基础元素
  410. json["maxNum"] = maxLayer.toInt();
  411. json["canBeLinked"] = canBeLinked;
  412. json["isContainer"] = isContainer;
  413. json["beatByOrder"] = beatByOrder;
  414. json["beatScore"] = score.toInt();
  415. json["gridPos"] = exportGridPos();
  416. json["animation"] = exportAnim();
  417. json["states"] = exportStates();
  418. //容器池
  419. json["subitem_pools"] = exportPools();
  420. //子元素
  421. json["subitems"] = exportChildElems();
  422. //收集动画
  423. json["collectConfig"] = exportCollAnim();
  424. }
  425. ///导出位置
  426. QJsonArray ElemPropertyData::exportGridPos() const
  427. {
  428. QJsonArray posArray;
  429. QVector<QVector<int>> posVec = DataManager::getGridPos(pos);
  430. for(int i=0;i<posVec.size();i++)
  431. {
  432. QJsonArray posPair;
  433. posPair.append(posVec[i][0]);
  434. posPair.append(posVec[i][1]);
  435. posArray.append(posPair);
  436. }
  437. return posArray;
  438. }
  439. ///导出状态与效果动画
  440. QJsonObject ElemPropertyData::exportAnim() const
  441. {
  442. QJsonObject json;
  443. for(int i=0;i<statusEffect.size();i++)
  444. {
  445. QJsonObject animObj;
  446. animObj["showCcbi"] = DataManager::getFileName(statusEffect[i].res);
  447. animObj["showAnim"] = statusEffect[i].timeline;
  448. animObj["localZOrder"] = statusEffect[i].zOrder.toInt();
  449. json.insert(statusEffect[i].name,animObj);
  450. }
  451. return json;
  452. }
  453. ///导出状态配置
  454. QJsonObject ElemPropertyData::exportStates() const
  455. {
  456. QJsonObject json;
  457. for(int i=0;i<statusConfig.size();i++)
  458. {
  459. QJsonObject statusObj;
  460. statusObj["playAnim"] = statusConfig[i].initAnim;
  461. statusObj["tapAnim"] = statusConfig[i].clickAnim;
  462. statusObj["supportMutliBeats"] = statusConfig[i].multiHit;
  463. statusObj["canDrop"] = statusConfig[i].dropable;
  464. statusObj["beatSubItem"] = statusConfig[i].beatSubItem;
  465. //收集
  466. if(statusConfig[i].needCollect){
  467. QJsonObject collObj;
  468. collObj["goalType"] = statusConfig[i].collTargetType.toInt();
  469. if(statusConfig[i].collAnim != "尚未选择"){
  470. collObj["collConf"] = statusConfig[i].collAnim;
  471. }
  472. statusObj["collect"] = collObj;
  473. }
  474. //动作
  475. if (statusConfig[i].action != "尚未选择") {
  476. QJsonObject actionObj;
  477. QJsonObject cfgObj;
  478. QMap<QString,QString> data = statusConfig[i].actionConfig;
  479. QStringList dataKeys = data.keys();
  480. for(int j=0;j<dataKeys.size();j++)
  481. {
  482. QString dataKey = dataKeys[j];
  483. QString objKey = DataManager::getInstance()->getTempFieldId("actionTemp", statusConfig[i].action, dataKey);
  484. cfgObj[objKey] = data[dataKey];
  485. }
  486. auto id = DataManager::getInstance()->getTempId("actionTemp", statusConfig[i].action);
  487. actionObj[id] = cfgObj;
  488. statusObj["action"] = actionObj;
  489. } else {
  490. QJsonObject actionObj;
  491. statusObj["action"] = actionObj;
  492. }
  493. //事件
  494. QJsonObject eventObj;
  495. QVector<EventConfig> eventVec = statusConfig[i].eventConfig;
  496. for(int j=0;j<eventVec.size();j++)
  497. {
  498. QJsonObject obj;
  499. obj["needColor"] = eventVec[j].consisColor;
  500. obj["dataDec"] = eventVec[j].changeMagnitude;
  501. obj["efx"] = eventVec[j].specialEffect;
  502. obj["isByGridCnt"] = eventVec[j].elimATLattices;
  503. eventObj.insert(DataManager::getInstance()->getTempId("eventTemp",eventVec[j].name),obj);
  504. }
  505. statusObj["eventHandlers"] = eventObj;
  506. json.insert(statusConfig[i].statusValue,statusObj);
  507. }
  508. return json;
  509. }
  510. ///导出容器池
  511. QJsonObject ElemPropertyData::exportPools() const
  512. {
  513. QJsonObject obj;
  514. for(int i=0;i<container.size();i++)
  515. {
  516. QJsonObject poolObj;
  517. poolObj["method"] = DataManager::getInstance()->getTempId("poolTemp",container[i].type);
  518. QJsonObject tableObj;
  519. QVector<ContainTable> table = container[i].table;
  520. for(int j=0;j<table.size();j++)
  521. {
  522. QJsonObject keyObj;
  523. keyObj["res"] = DataManager::getFileName(table[j].res);
  524. keyObj["init"] = table[j].initTimeline;
  525. keyObj["tap"] = table[j].clickTimeline;
  526. keyObj["affect"] = table[j].effectTimeline;
  527. keyObj["beat"] = table[j].vanishTimeline;
  528. keyObj["localZOrder"] = table[j].zOrder.toInt();
  529. tableObj[table[j].key] = keyObj;
  530. }
  531. poolObj["candidates"] = tableObj;
  532. obj.insert(container[i].poolName,poolObj);
  533. }
  534. return obj;
  535. }
  536. ///导出子元素
  537. QJsonArray ElemPropertyData::exportChildElems() const
  538. {
  539. QJsonArray childElemArray;
  540. for(int i=0;i<childElem.size();i++)
  541. {
  542. QJsonObject childElemObj;
  543. childElemObj[childElem[i].name] = childElem[i].container;
  544. childElemArray.append(childElemObj);
  545. }
  546. return childElemArray;
  547. }
  548. ///导出收集动画
  549. QJsonObject ElemPropertyData::exportCollAnim() const
  550. {
  551. QJsonObject obj;
  552. for(int i=0;i<collAnim.size();i++)
  553. {
  554. QJsonObject collAnimObj;
  555. collAnimObj["template"] = DataManager::getInstance()->getTempId("collAnimTemp",collAnim[i].type);
  556. QMap<QString,QString> data = collAnim[i].dataMap;
  557. QStringList dataKeys = data.keys();
  558. for(int j=0;j<dataKeys.size();j++)
  559. {
  560. QString dataKey = dataKeys[j];
  561. QString objKey = DataManager::getInstance()->getTempFieldId("collAnimTemp",collAnim[i].type,dataKey);
  562. collAnimObj[objKey] = data[dataKey];
  563. }
  564. obj[collAnim[i].name] = collAnimObj;
  565. }
  566. return obj;
  567. }