KernelFile.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909
  1. /*
  2. * Copyright (C) 2022 The V-Gears Team
  3. *
  4. * This file is part of V-Gears
  5. *
  6. * V-Gears is free software: you can redistribute it and/or modify it under
  7. * terms of the GNU General Public License as published by the Free Software
  8. * Foundation, version 3.0 (GPLv3) of the License.
  9. *
  10. * V-Gears is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. */
  15. #pragma once
  16. #include <tinyxml.h>
  17. #include "common/BinGZipFile.h"
  18. #include "common/TypeDefine.h"
  19. #include "Characters.h"
  20. class KernelFile{
  21. public:
  22. enum KERNEL_SECTIONS{
  23. /**
  24. * Command data section in KERNEL.BIN.
  25. */
  26. KERNEL_COMMAND_DATA = 0,
  27. /**
  28. * Attack data section in KERNEL.BIN.
  29. */
  30. KERNEL_ATTACK_DATA,
  31. /**
  32. * Battle and growth data section in KERNEL.BIN.
  33. */
  34. KERNEL_BATTLE_AND_GROWTH_DATA,
  35. /**
  36. * Initialization data section in KERNEL.BIN.
  37. */
  38. KERNEL_INITIALIZATION_DATA,
  39. /**
  40. * Item data section in KERNEL.BIN.
  41. */
  42. KERNEL_ITEM_DATA,
  43. /**
  44. * Weapon data section in KERNEL.BIN.
  45. */
  46. KERNEL_WEAPON_DATA,
  47. /**
  48. * Armor data section in KERNEL.BIN.
  49. */
  50. KERNEL_ARMOR_DATA,
  51. /**
  52. * Accessory data section in KERNEL.BIN.
  53. */
  54. KERNEL_ACCESSORY_DATA,
  55. /**
  56. * Materia data section in KERNEL.BIN.
  57. */
  58. KERNEL_MATERIA_DATA,
  59. /**
  60. * Command descriptions section in KERNEL.BIN.
  61. */
  62. KERNEL_COMMAND_DESCRIPTIONS,
  63. /**
  64. * Magic descriptions section in KERNEL.BIN.
  65. */
  66. KERNEL_MAGIC_DESCRIPTIONS,
  67. /**
  68. * Item descriptions section in KERNEL.BIN.
  69. */
  70. KERNEL_ITEM_DESCRIPTIONS,
  71. /**
  72. * Weapon descriptions section in KERNEL.BIN.
  73. */
  74. KERNEL_WEAPON_DESCRIPTIONS,
  75. /**
  76. * Armor descriptions section in KERNEL.BIN.
  77. */
  78. KERNEL_ARMOR_DESCRIPTIONS,
  79. /**
  80. * Accessory descriptions section in KERNEL.BIN.
  81. */
  82. KERNEL_ACCESSORY_DESCRIPTIONS,
  83. /**
  84. * Materia descriptions section in KERNEL.BIN.
  85. */
  86. KERNEL_MATERIA_DESCRIPTIONS,
  87. /**
  88. * Key Item descriptions section in KERNEL.BIN.
  89. */
  90. KERNEL_KEY_ITEM_DESCRIPTIONS,
  91. /**
  92. * Command Names section in KERNEL.BIN.
  93. */
  94. KERNEL_COMMAND_NAMES,
  95. /**
  96. * Magic Names section in KERNEL.BIN.
  97. */
  98. KERNEL_MAGIC_NAMES,
  99. /**
  100. * Item Names section in KERNEL.BIN.
  101. */
  102. KERNEL_ITEM_NAMES,
  103. /**
  104. * Weapon Names section in KERNEL.BIN.
  105. */
  106. KERNEL_WEAPON_NAMES,
  107. /**
  108. * Armor Names section in KERNEL.BIN.
  109. */
  110. KERNEL_ARMOR_NAMES,
  111. /**
  112. * Accessory Names section in KERNEL.BIN.
  113. */
  114. KERNEL_ACCESSORY_NAMES,
  115. /**
  116. * Materia Names section in KERNEL.BIN.
  117. */
  118. KERNEL_MATERIA_NAMES,
  119. /**
  120. * Key Item Names section in KERNEL.BIN.
  121. */
  122. KERNEL_KEY_ITEM_NAMES,
  123. /**
  124. * Battle and Battle-Screen Text section in KERNEL.BIN.
  125. */
  126. KERNEL_BATTLE_AND_BATTLE_SCREEN_TEXT,
  127. /**
  128. * Summon Attack Names section in KERNEL.BIN.
  129. */
  130. KERNEL_SUMMON_ATTACK_NAMES
  131. };
  132. enum ELEMENT{
  133. /**
  134. * Fire element.
  135. */
  136. FIRE = 0,
  137. /**
  138. * Ice element.
  139. */
  140. ICE,
  141. /**
  142. * Bolt element.
  143. */
  144. BOLT,
  145. /**
  146. * Earth element.
  147. */
  148. EARTH,
  149. /**
  150. * Poison element.
  151. */
  152. POISON,
  153. /**
  154. * Gravity element.
  155. */
  156. GRAVITY,
  157. /**
  158. * Water element.
  159. */
  160. WATER,
  161. /**
  162. * Wind element.
  163. */
  164. WIND,
  165. /**
  166. * Holy element.
  167. */
  168. HOLY,
  169. /**
  170. * Restorative element.
  171. */
  172. RESTORATIVE,
  173. /**
  174. * Cut element.
  175. */
  176. CUT,
  177. /**
  178. * Hit element.
  179. */
  180. HIT,
  181. /**
  182. * Punch element.
  183. */
  184. PUNCH,
  185. /**
  186. * Shoot element.
  187. */
  188. SHOOT,
  189. /**
  190. * Shout element.
  191. */
  192. SHOUT,
  193. /**
  194. * Hidden element.
  195. */
  196. HIDDEN,
  197. };
  198. /**
  199. * List of target selection options.
  200. */
  201. struct Target{
  202. /**
  203. * The target can be selected.
  204. *
  205. * If the target of the attack is selectable, at least between some subset of possible
  206. * targets, this must be true.
  207. */
  208. bool selection_enabled;
  209. /**
  210. * The default target is an enemy.
  211. *
  212. * When true, the cursor starts in an enemy row. When false, it starts in the ally row.
  213. * It may or may not be possible to change it.
  214. */
  215. bool default_enemy;
  216. /**
  217. * The default target is a group.
  218. *
  219. * When true, the cursor starts will all the members of a row selected. When false, it
  220. * starts with only one target selected. It may or may not be possible to change it.
  221. */
  222. bool default_multiple;
  223. /**
  224. * The target group can be changed.
  225. *
  226. * When true, the target cannot be changed between enemies and allies. In this case
  227. * {@see default_enemy} will determine the group that can be targeted.
  228. */
  229. bool fixed_row;
  230. /**
  231. * The command is short ranged.
  232. *
  233. * When true, if the target or the caster is not in the front of their row, the target
  234. * will take half damage. Also, when true, an enemy covered by another enemy can't be
  235. * targeted.
  236. */
  237. bool short_range;
  238. /**
  239. * Targets all, enemies and allies.
  240. *
  241. * When true, all allies and enemies are targets, and the selection can't be changed.
  242. */
  243. bool all_rows;
  244. /**
  245. * The target is random.
  246. *
  247. * When multiple targets are selected, one will be selected at random to be the
  248. * receiving target. Cursor will cycle among all viable targets.
  249. */
  250. bool random;
  251. };
  252. /**
  253. * Determines what an item affects on when used from the menu.
  254. */
  255. struct TargetCondition{
  256. /**
  257. * The item affects a party member or group HP.
  258. */
  259. bool party_hp;
  260. /**
  261. * The item affects a party member or group MP.
  262. */
  263. bool party_mp;
  264. /**
  265. * The item affects a party member or group status.
  266. */
  267. bool party_status;
  268. };
  269. /**
  270. * List of altered status.
  271. */
  272. enum STATUS{
  273. /**
  274. * The character is dead.
  275. */
  276. DEATH = 0,
  277. /**
  278. * The character has critical HP.
  279. */
  280. NEAR_DEATH,
  281. /**
  282. * The character is asleep.
  283. */
  284. SLEEP,
  285. /**
  286. * The character is poisoned.
  287. */
  288. POISONED,
  289. /**
  290. * The character is sad.
  291. */
  292. SADNESS,
  293. /**
  294. * The character is furious.
  295. */
  296. FURY,
  297. /**
  298. * The character is confused.
  299. */
  300. CONFU,
  301. /**
  302. * The character is silenced.
  303. */
  304. SILENCE,
  305. /**
  306. * The character is slow.
  307. */
  308. HASTE,
  309. /**
  310. * The character is
  311. */
  312. SLOW,
  313. /**
  314. * The character is stopped.
  315. */
  316. STOP,
  317. /**
  318. * The character is a frog.
  319. */
  320. FROG,
  321. /**
  322. * The character is small.
  323. */
  324. SMALL,
  325. /**
  326. * The character is going to be petrified.
  327. */
  328. SLOW_NUMB,
  329. /**
  330. * The character is petrified.
  331. */
  332. PETRIFY,
  333. /**
  334. * The character is regenerating health.
  335. */
  336. REGEN,
  337. /**
  338. * The character has a physical barrier.
  339. */
  340. BARRIER,
  341. /**
  342. * The character has a magical barrier
  343. */
  344. M_BARRIER,
  345. /**
  346. * The character reflects magical attacks.
  347. */
  348. REFLECT,
  349. /**
  350. * The character has dual status.
  351. *
  352. * @todo What does it do.
  353. */
  354. DUAL,
  355. /**
  356. * The character has a shield.
  357. */
  358. SHIELD,
  359. /**
  360. * The character has a death sentence.
  361. */
  362. D_SENTENCE,
  363. /**
  364. * The character is being manipulated.
  365. */
  366. MANIPULATE,
  367. /**
  368. * The character is berserk.
  369. */
  370. BERSERK,
  371. /**
  372. * The character is invincible.
  373. */
  374. PEERLESS,
  375. /**
  376. * The character is paralyzed.
  377. */
  378. PARALYSIS,
  379. /**
  380. * The character is blinded.
  381. */
  382. DARKNESS,
  383. /**
  384. * The character has dual drain.
  385. */
  386. DUAL_DRAIN,
  387. /**
  388. * The character has deathforce.
  389. */
  390. DEATHFORCE,
  391. /**
  392. * The character has resist.
  393. */
  394. RESIST,
  395. /**
  396. * Cait' Sith lucky girl mode.
  397. */
  398. LUCKY_GIRL,
  399. /**
  400. * The character is imprisioned.
  401. */
  402. IMPRISONED
  403. };
  404. /**
  405. * How a status effect modifier attack or item can act.
  406. */
  407. enum STATUS_EFFECT{
  408. /**
  409. * Inflicts status changes.
  410. */
  411. INFLICT = 0,
  412. /**
  413. * Cures status changes.
  414. */
  415. CURE = 1,
  416. /**
  417. * Toggles status changes.
  418. *
  419. * If the target doesn't have the status change, inflict it. If the target already has
  420. * the status change, cure it.
  421. */
  422. TOGGLE = 2
  423. };
  424. struct StatusEffect{
  425. /**
  426. * The list of status to inflict or cure.
  427. */
  428. std::vector<int> status;
  429. /**
  430. * The chance of landing a status effect (out of 63).
  431. */
  432. u16 chance;
  433. /**
  434. * The status change mode.
  435. */
  436. STATUS_EFFECT mode;
  437. };
  438. /**
  439. * Data for each items
  440. *
  441. * As found in KERNEL.BIN, file 4, in order, up to special. Members after special are not
  442. * found literally in KERNEL.BIN, but are derived from other members or found in other
  443. * files of the kernel (text files).
  444. */
  445. struct ItemData{
  446. /**
  447. * Unknown data (Always 0XFFFF). 4 bytes.
  448. */
  449. u32 unknown_0;
  450. /**
  451. * Unknown data (Always 0XFFFF). 4 bytes.
  452. */
  453. u32 unknown_1;
  454. /**
  455. * Camera movement ID. 2 bytes.
  456. *
  457. * Used for items useable in battle, determines the camera movement.
  458. */
  459. u16 camera;
  460. /**
  461. * Item restrictions. 2 bytes.
  462. *
  463. * Contains bits indicating if the item is {@see selleable}, {@see useable_battle} and
  464. * {@see useable_menu}.
  465. */
  466. u16 restrict_raw;
  467. /**
  468. * Targeting mode. 1 byte.
  469. *
  470. * See {@see target} and {@TargetModes} for more information.
  471. */
  472. u8 target_raw;
  473. /**
  474. * Item effect ID. 1 byte.
  475. *
  476. * Used for animation in battle.
  477. */
  478. u8 effect;
  479. /**
  480. * Damage formula. 1 byte.
  481. *
  482. * This byte is divided into two nybbles (four bits). Upper nybble determines what
  483. * considerations are made in calculating damage such as physical/magical, allowing
  484. * criticals, how to calculate accuracy, etc. There are also three sets of known
  485. * formulae that are paired with the upper nybble values. These are selected in the
  486. * Lower Nybble and determine how to calculate pre-defense damage
  487. */
  488. u8 damage_raw;
  489. /**
  490. * The item power. 1 byte.
  491. *
  492. * Used for damage/healing calculation.
  493. */
  494. u8 power;
  495. /**
  496. * Item affected condition when used in menu. 1 byte.
  497. *
  498. * See {@condition} and {@ItemCondition} for more information.
  499. */
  500. u8 condition_raw;
  501. /**
  502. * Information about status change mode and chance. 1 bytes.
  503. */
  504. u8 status_change_raw;
  505. /**
  506. * Special flags. 1 byte.
  507. *
  508. * @tod Document and retrieve with info from
  509. * https://wiki.ffrtt.ru/index.php?title=FF7/Battle/Attack_Special_Effects
  510. */
  511. u8 additional_effects_raw;
  512. /**
  513. * Special flags. 1 byte.
  514. *
  515. * @todop Document and retrieve with info from
  516. * https://wiki.ffrtt.ru/index.php?title=FF7/Item_data
  517. */
  518. u8 additional_effects_mod_raw;
  519. /**
  520. * Information about what status can be inflicted or cured. 4 bytes.
  521. */
  522. u32 status_raw;
  523. /**
  524. * Information about the item elements. 2 bytes.
  525. */
  526. u16 element_raw;
  527. /**
  528. * Special flags. 2 bytes.
  529. *
  530. * @todo document and parse with info from
  531. * https://wiki.ffrtt.ru/index.php?title=FF7/Battle/Special_Attack_Flags
  532. */
  533. u16 special_raw;
  534. /**
  535. * Item ID.
  536. *
  537. * Not actually in the item file data, it's the order at which it appears.
  538. */
  539. int id;
  540. /**
  541. * Item name.
  542. *
  543. * Not found in the same file as the rest of the data, but on file 19.
  544. */
  545. std::string name;
  546. /**
  547. * Item description.
  548. *
  549. * Not found in the same file as the rest of the data, but on file 11.
  550. */
  551. std::string description;
  552. /**
  553. * Indicates if the item can be sold.
  554. *
  555. * True if the bit 0 in {@see restrict_raw} is 0.
  556. */
  557. bool sellable;
  558. /**
  559. * Indicates if the item can be used in battle.
  560. *
  561. * True if the bit 2 in {@see restrict_raw} is 0.
  562. */
  563. bool useable_battle;
  564. /**
  565. * Indicates if the item can be used in the menu.
  566. *
  567. * True if the bit 4 in {@see restrict_raw} is 0.
  568. */
  569. bool useable_menu;
  570. /**
  571. * Target selection mode.
  572. *
  573. * Derived from {@see target_raw}.
  574. */
  575. Target target;
  576. /**
  577. * The damage formula.
  578. *
  579. * It's the upper nybble in {@see damage_raw}.
  580. */
  581. u8 damage_formula;
  582. /**
  583. * The damage modifier.
  584. *
  585. * It's the lower nybble in {@see damage_raw}.
  586. */
  587. u8 damage_modifier;
  588. /**
  589. * What the item affects when.
  590. *
  591. * Derived from {@see condition_raw}.
  592. */
  593. TargetCondition condition;
  594. /**
  595. * Status effects.
  596. *
  597. * Derived from {@see status_change_raw} and {@see status_raw}.
  598. */
  599. StatusEffect status;
  600. /**
  601. * Elements of the item.
  602. *
  603. * Derived from {@see element_raw}.
  604. */
  605. std::vector<int> elements;
  606. };
  607. KernelFile(std::string path): kernel_(path){}
  608. ~KernelFile(){}
  609. int ReadItems(){
  610. // Empty the item list
  611. items_.clear();
  612. //kernel_ = BinGZipFile(folder_path + "/KERNEL.BIN");
  613. //BinGZipFile kernel_ = BinGZipFile(folder_path + "/KERNEL.BIN");
  614. //std::cout << "KERNEL FILES " << kernel_.GetNumberOfFiles() << "\n";
  615. File items_file = kernel_.ExtractGZip(KERNEL_ITEM_DATA);
  616. File items_name_file = kernel_.ExtractGZip(KERNEL_ITEM_NAMES);
  617. File items_desc_file = kernel_.ExtractGZip(KERNEL_ITEM_DESCRIPTIONS);
  618. int name_offset = 0;
  619. int desc_offset = 0;
  620. int item_count = 0;
  621. std::cout <<
  622. "| ID | cam | sel | bat | men | tar | eff | dmg | pow | con | sch | eff | efm | sta | elm | spe |\n";
  623. for (int i = 0; i < 128; i ++){
  624. ItemData data;
  625. // From the current name file offset, read 16 bytes.
  626. // This is the pointer to the offset for the item name.
  627. // Start reading there until 0xFF is found.
  628. data.name = "";
  629. u8 ch = 1;
  630. name_offset = items_name_file.readU16LE();
  631. while (ch != 0xFF){
  632. ch = items_name_file.GetU8(name_offset);
  633. if (ch != 0xFF) data.name += ENGLISH_CHARS[ch];
  634. name_offset ++;
  635. }
  636. // For descriptions, do the same as for names.
  637. data.description = "";
  638. ch = 1;
  639. desc_offset = items_desc_file.readU16LE();
  640. while (ch != 0xFF){
  641. ch = items_desc_file.GetU8(desc_offset);
  642. if (ch != 0xFF){
  643. // Warning: If the char is 0xF9, special function!
  644. // the next byte (in bits, aaoooooo) means to read aa data at offset oooooo.
  645. // This is to compress information in the kernel.
  646. if (ch == 0xF9){
  647. // Get how much to read, two upper bits of the next byte.
  648. // Multiply by 2 and add 4. That's just how it is.
  649. u8 comp_size = (items_desc_file.GetU8(desc_offset + 1) >> 6) * 2 + 4;
  650. // Get new offset, lower six bits of the next byte.
  651. // The offset goes backwards from the position of the 0xF9 byte.
  652. u8 comp_offset = items_desc_file.GetU8(desc_offset + 1) & 63;
  653. for (int i = 0; i < comp_size; i ++){
  654. data.description += ENGLISH_CHARS[
  655. items_desc_file.GetU8(desc_offset - 1 - comp_offset + i)
  656. ];
  657. }
  658. desc_offset ++;
  659. }
  660. else{
  661. data.description += ENGLISH_CHARS[ch];
  662. }
  663. }
  664. desc_offset ++;
  665. }
  666. // If the item doesn't have a name, it means all items have been read.
  667. // break the loop.
  668. if ("" == data.name) break;
  669. // Read data from the item data section.
  670. data.unknown_0 = items_file.readU32LE();
  671. //std::cout << "1st read " << data.unknown_0 << "\n";
  672. data.unknown_1 = items_file.readU32LE();
  673. data.camera = items_file.readU16LE();
  674. data.restrict_raw = items_file.readU16LE();
  675. data.target_raw = items_file.readU8();
  676. data.effect = items_file.readU8();
  677. data.damage_raw = items_file.readU8();
  678. data.power = items_file.readU8();
  679. data.condition_raw = items_file.readU8();
  680. data.status_change_raw = items_file.readU8();
  681. data.additional_effects_raw = items_file.readU8();
  682. data.additional_effects_mod_raw = items_file.readU8();
  683. data.status_raw = items_file.readU32LE();
  684. data.element_raw = items_file.readU16LE();
  685. data.special_raw = items_file.readU16LE();
  686. // Derive data from the read data.
  687. data.id = i;
  688. data.sellable = !(data.restrict_raw & (1 << 0));
  689. data.useable_battle = !(data.restrict_raw & (2 << 0));
  690. data.useable_menu = !(data.restrict_raw & (4 << 0));
  691. // Add to the list of items.
  692. items_.push_back(data);
  693. item_count ++;
  694. printf(
  695. "| %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %3d | %5d | ",
  696. i, data.camera,
  697. data.sellable, data.useable_battle, data.useable_menu, data.target_raw,
  698. data.effect, data.damage_raw, data.power, data.condition_raw, data.status_change_raw,
  699. data.additional_effects_raw, data.additional_effects_mod_raw, data.status, data.element_raw, data.special_raw
  700. );
  701. std::cout << data.name << ": " << data.description << std::endl;
  702. }
  703. std::cout << "READ ITEMS END" << std::endl;
  704. return item_count;
  705. }
  706. void WriteItems(std::string file){
  707. std::cout << "WRITE ITEMS START" << std::endl;
  708. TiXmlDocument xml;
  709. std::unique_ptr<TiXmlElement> container(new TiXmlElement("items"));
  710. for (ItemData item : items_){
  711. std::unique_ptr<TiXmlElement> xml_item(new TiXmlElement("item"));
  712. xml_item->SetAttribute("id", item.id);
  713. xml_item->SetAttribute("name", item.name);
  714. xml_item->SetAttribute("description", item.description);
  715. xml_item->SetAttribute("sell", item.sellable);
  716. xml_item->SetAttribute("battle", item.useable_battle);
  717. xml_item->SetAttribute("menu", item.useable_menu);
  718. xml_item->SetAttribute("effect", item.effect);
  719. xml_item->SetAttribute("dmg_formula", item.damage_formula);
  720. xml_item->SetAttribute("dmg_modifier", item.damage_modifier);
  721. xml_item->SetAttribute("power", item.power);
  722. container->LinkEndChild(xml_item.release());
  723. }
  724. xml.LinkEndChild(container.release());
  725. xml.SaveFile(file);
  726. std::cout << "WRITE ITEMS END" << std::endl;
  727. }
  728. private:
  729. std::vector<ItemData> items_;
  730. BinGZipFile kernel_;
  731. //BinGZipFile kernel_2_;*/
  732. };