MX 2 лет назад
Родитель
Сommit
565b2f09a8
63 измененных файлов с 1911 добавлено и 955 удалено
  1. 1 1
      ReadMe.md
  2. BIN
      non_catalog_apps/gb-pokemon-trading/.flipcorg/banner.png
  3. BIN
      non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/1.png
  4. BIN
      non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/2.png
  5. BIN
      non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/3.png
  6. BIN
      non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/4.png
  7. BIN
      non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/5.png
  8. BIN
      non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/6.png
  9. 95 20
      non_catalog_apps/gb-pokemon-trading/README.md
  10. 2 2
      non_catalog_apps/gb-pokemon-trading/application.fam
  11. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/EXT-Link.png
  12. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/GPIO-GBPIN-v2.png
  13. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/GPIO-GBPIN_light-v2.png
  14. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/back.png
  15. 0 9
      non_catalog_apps/gb-pokemon-trading/docs/images/back.svg
  16. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/cut-cable-v3.png
  17. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/dmg_link_port_pinout.png
  18. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-1.png
  19. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-2.png
  20. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-3.png
  21. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-4.png
  22. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-5.png
  23. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-6.png
  24. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-7.png
  25. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat.png
  26. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat.psd
  27. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-pcb.png
  28. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_pokemon_center.png
  29. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_save.png
  30. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_save_trade.png
  31. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_trade_list.png
  32. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_trade_list_select_trade.png
  33. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_trade_list_select_trade_confirm.png
  34. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_trade_room.png
  35. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_trade_room_2.png
  36. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/gb_spi.png
  37. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/gblpof.gif
  38. 0 7
      non_catalog_apps/gb-pokemon-trading/docs/images/implemented.svg
  39. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/left.png
  40. 0 6
      non_catalog_apps/gb-pokemon-trading/docs/images/left.svg
  41. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/pcb.png
  42. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/qFlipper.png
  43. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/reboot.png
  44. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/wgbl-0.png
  45. 0 744
      non_catalog_apps/gb-pokemon-trading/docs/images/white_flat.svg
  46. BIN
      non_catalog_apps/gb-pokemon-trading/docs/images/youtube.png
  47. 250 151
      non_catalog_apps/gb-pokemon-trading/pokemon_app.cpp
  48. 46 0
      non_catalog_apps/gb-pokemon-trading/pokemon_app.h
  49. 13 14
      non_catalog_apps/gb-pokemon-trading/pokemon_data.h
  50. 170 0
      non_catalog_apps/gb-pokemon-trading/views/select_level.cpp
  51. 25 0
      non_catalog_apps/gb-pokemon-trading/views/select_level.hpp
  52. 172 0
      non_catalog_apps/gb-pokemon-trading/views/select_move1.cpp
  53. 25 0
      non_catalog_apps/gb-pokemon-trading/views/select_move1.hpp
  54. 173 0
      non_catalog_apps/gb-pokemon-trading/views/select_move2.cpp
  55. 25 0
      non_catalog_apps/gb-pokemon-trading/views/select_move2.hpp
  56. 174 0
      non_catalog_apps/gb-pokemon-trading/views/select_move3.cpp
  57. 25 0
      non_catalog_apps/gb-pokemon-trading/views/select_move3.hpp
  58. 174 0
      non_catalog_apps/gb-pokemon-trading/views/select_move4.cpp
  59. 25 0
      non_catalog_apps/gb-pokemon-trading/views/select_move4.hpp
  60. 2 1
      non_catalog_apps/gb-pokemon-trading/views/select_pokemon.cpp
  61. 195 0
      non_catalog_apps/gb-pokemon-trading/views/select_stats.cpp
  62. 25 0
      non_catalog_apps/gb-pokemon-trading/views/select_stats.hpp
  63. 294 0
      non_catalog_apps/gb-pokemon-trading/views/trade.cpp

+ 1 - 1
ReadMe.md

@@ -173,7 +173,7 @@ The Flipper and its community wouldn't be as rich as it is without your contribu
 | MH-Z19 - CO2 sensor | ![GPIO Badge] | [by meshchaninov](https://github.com/meshchaninov/flipper-zero-mh-z19) |  | [![Author Badge]](https://lab.flipper.net/apps/mh_z19) |
 | MH-Z19 - CO2 sensor | ![GPIO Badge] | [by meshchaninov](https://github.com/meshchaninov/flipper-zero-mh-z19) |  | [![Author Badge]](https://lab.flipper.net/apps/mh_z19) |
 | NRF24 Batch Read/Send (WIP) | ![GPIO Badge] | [by vad7](https://github.com/vad7/nRF24-Batch) |  | ![None Badge] |
 | NRF24 Batch Read/Send (WIP) | ![GPIO Badge] | [by vad7](https://github.com/vad7/nRF24-Batch) |  | ![None Badge] |
 | NRF24 Scanner | ![GPIO Badge] | [by vad7](https://github.com/vad7/nrf24scan) |  | ![None Badge] |
 | NRF24 Scanner | ![GPIO Badge] | [by vad7](https://github.com/vad7/nrf24scan) |  | ![None Badge] |
-| Pokemon Trading (for GameBoy) | ![GPIO Badge] | [by EstebanFuentealba](https://github.com/EstebanFuentealba/Flipper-Zero-Game-Boy-Trading-Pokemons) |  | [![Author Badge]](https://lab.flipper.net/apps/pokemon) |
+| Pokemon Trading (for GameBoy) | ![GPIO Badge] | [by EstebanFuentealba](https://github.com/EstebanFuentealba/Flipper-Zero-Game-Boy-Trading-Pokemons) | Updates [by R4g3D](https://github.com/R4g3D/Flipper-Zero-Game-Boy-Pokemon-Trading) | [![Author Badge]](https://lab.flipper.net/apps/pokemon) |
 | Radiation Sensor | ![GPIO Badge] | [by sionyx](https://github.com/sionyx/flipper_radsens) | works with RadSens module | ![None Badge] |
 | Radiation Sensor | ![GPIO Badge] | [by sionyx](https://github.com/sionyx/flipper_radsens) | works with RadSens module | ![None Badge] |
 | RCWL-516 Motion Sensor | ![GPIO Badge] | [by ahmedafe1](https://github.com/ahmedafe1/rcwl_0516-Flipperzero) |  | ![None Badge] |
 | RCWL-516 Motion Sensor | ![GPIO Badge] | [by ahmedafe1](https://github.com/ahmedafe1/rcwl_0516-Flipperzero) |  | ![None Badge] |
 | ServoTester | ![GPIO Badge] | [by spin7ion](https://github.com/spin7ion/flipper-servotester) |  | [![UFW Badge]](https://lab.flipper.net/apps/servotester) |
 | ServoTester | ![GPIO Badge] | [by spin7ion](https://github.com/spin7ion/flipper-servotester) |  | [![UFW Badge]](https://lab.flipper.net/apps/servotester) |

BIN
non_catalog_apps/gb-pokemon-trading/.flipcorg/banner.png


BIN
non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/1.png


BIN
non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/2.png


BIN
non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/3.png


BIN
non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/4.png


BIN
non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/5.png


BIN
non_catalog_apps/gb-pokemon-trading/.flipcorg/gallery/6.png


+ 95 - 20
non_catalog_apps/gb-pokemon-trading/README.md

@@ -16,9 +16,9 @@
 
 
 ## Introduction
 ## Introduction
 
 
-This is a Pokemon exchange application from Flipper Zero to Game Boy [(Generacn I)](https://bulbapedia.bulbagarden.net/wiki/Generation_I). Flipper Zero emulates a "Slave" Game Boy connected to a Game Link Cable to be able to exchange any Pokemon from the First Generation (Red, Blue, Yellow) to a real Game Boy.
+This is a Pokemon exchange application from Flipper Zero to Game Boy [(Generaction I)](https://bulbapedia.bulbagarden.net/wiki/Generation_I). Flipper Zero emulates a "Slave" Game Boy connected to a Game Link Cable to be able to exchange any Pokemon from the First Generation (Red, Blue, Yellow) to a real Game Boy.
 
 
-It is a Proof of Concept (POC) for using views, GPIO, and FURI (Flipper Universal Registry Implementation).
+It currently trades a Pokemon based on your choice of Pokemon, Level, Stats and 4 Moves.
 
 
 ## Installation Directions
 ## Installation Directions
 
 
@@ -49,7 +49,7 @@ And use [**qFlipper**](https://flipperzero.one/update) to copy the generated **p
 These instructions assume that you are starting at the Flipper Zero desktop. Otherwise, press the Back button until you are at the desktop.
 These instructions assume that you are starting at the Flipper Zero desktop. Otherwise, press the Back button until you are at the desktop.
 
 
 - Press the `OK` button on the Flipper to open the main menu.
 - Press the `OK` button on the Flipper to open the main menu.
-- Choose `Aplicaciones` from the menu.
+- Choose `Applications` from the menu.
 - Choose `Game Boy` from the submenu.
 - Choose `Game Boy` from the submenu.
 - Choose `Pokemon Trading`
 - Choose `Pokemon Trading`
 - The Flipper Zero should show the selection of Pokemon that you want to trade, and by default, it appears as bulbasaur.
 - The Flipper Zero should show the selection of Pokemon that you want to trade, and by default, it appears as bulbasaur.
@@ -63,69 +63,145 @@ These instructions assume that you are starting at the Flipper Zero desktop. Oth
 - Press the `LEFT`/`RIGHT` buttons to paginate the selection of Pokemon by 1.
 - Press the `LEFT`/`RIGHT` buttons to paginate the selection of Pokemon by 1.
 - Press the `UP`/`DOWN` buttons to paginate the selection of Pokemon by 10.
 - Press the `UP`/`DOWN` buttons to paginate the selection of Pokemon by 10.
 - Press the `OK` button to select the Pokemon to trade.
 - Press the `OK` button to select the Pokemon to trade.
+
     <p align='center'>
     <p align='center'>
          <br />
          <br />
         <img src="./docs/images/flipper-zero-flat-2.png" width="400" /><br />
         <img src="./docs/images/flipper-zero-flat-2.png" width="400" /><br />
     </p>
     </p>
+
+- The Flipper Zero should show the selection of the Pokemon's level that you want to trade, and by default, it appears as level 1.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-3.png" width="400" />
+        <br />
+    </p>
+
+- Press the `LEFT`/`RIGHT` buttons to paginate the selection of the Pokemon's level by 1.
+- Press the `UP`/`DOWN` buttons to paginate the selection of the Pokemon's level by 10.
+- Press the `OK` button to select the Pokemon's level to trade.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-4.png" width="400" />
+        <br />
+    </p>
+
+- The Flipper Zero should show the selection for the Pokemon's moves that you want to trade, this will happen 4 times with default bing no move.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-5.png" width="400" />
+        <br />
+    </p>
+
+- Press the `LEFT`/`RIGHT` buttons to paginate the selection of the Pokemon's current move selection by 1.
+- Press the `UP`/`DOWN` buttons to paginate the selection of the Pokemon's current move selection by 10.
+- Press the `OK` button to select the Pokemon's current move selection to trade.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-6.png" width="400" />
+        <br />
+    </p>
+
+- The Flipper Zero should show the selection for the Pokemon's stats that you want to trade, and by default, it appears as random IV and zero EV.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-7.png" width="400" />
+        <br />
+    </p>
+
+- Press the `RIGHT`/`UP` buttons to paginate the selection of the Pokemon's stats selection by 1 positively.
+- Press the `LEFT`/`DOWN` buttons to paginate the selection of the Pokemon's stats selection by 1 negatively.
+- Press the `OK` button to select the Pokemon's current move selection to trade.
+
+    <p align='center'>
+        <br />
+        <img src="./docs/images/flipper-zero-flat-8.png" width="400" />
+        <br />
+    </p>
+
 - The Flipper Zero will display the view to connect the Game Boy.
 - The Flipper Zero will display the view to connect the Game Boy.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
-        <img src="./docs/images/flipper-zero-flat-3.png" width="400" /><br />
+        <img src="./docs/images/flipper-zero-flat-9.png" width="400" /><br />
     </p>
     </p>
+
 - On your Game Boy, you should connect the  **Game Link Cable** to the Game Boy and in the game, go to the nearest  **Pokemon Center**.
 - On your Game Boy, you should connect the  **Game Link Cable** to the Game Boy and in the game, go to the nearest  **Pokemon Center**.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_pokemon_center.png" width="400" /><br />
         <img src="./docs/images/game_boy_pokemon_center.png" width="400" /><br />
     </p>
     </p>
+
 - Talk to the girl at the counter on the right. The girl will tell us that we have to save the game before playing, we will answer **YES** by pressing the **A** button.
 - Talk to the girl at the counter on the right. The girl will tell us that we have to save the game before playing, we will answer **YES** by pressing the **A** button.
 
 
-.
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_save.png" width="400" /><br />
         <img src="./docs/images/game_boy_save.png" width="400" /><br />
     </p>
     </p>
+
 - The Flipper Zero will show that we are connected.
 - The Flipper Zero will show that we are connected.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
-        <img src="./docs/images/flipper-zero-flat-4.png" width="400" /><br />
+        <img src="./docs/images/flipper-zero-flat-10.png" width="400" /><br />
     </p>
     </p>
+
 - On the Game Boy, we will be asked which option we want, and we select **TRADE CENTER**.
 - On the Game Boy, we will be asked which option we want, and we select **TRADE CENTER**.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_save_trade.png" width="400" /><br />
         <img src="./docs/images/game_boy_save_trade.png" width="400" /><br />
     </p>
     </p>
+
 - You will enter the Trade Center where you must press the A button on the Game Boy on your side of the table.
 - You will enter the Trade Center where you must press the A button on the Game Boy on your side of the table.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_trade_room_2.png" width="400" /><br />
         <img src="./docs/images/game_boy_trade_room_2.png" width="400" /><br />
     </p>
     </p>
+
 - Flipper Zero will remain on a waiting screen with the Pokemon you selected.
 - Flipper Zero will remain on a waiting screen with the Pokemon you selected.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
-        <img src="./docs/images/flipper-zero-flat-5.png" width="400" /><br />
+        <img src="./docs/images/flipper-zero-flat-10.png" width="400" /><br />
     </p>
     </p>
+
 - You will see your Pokemon and the Pokemon you selected on the Flipper Zero, in this case, `Mew`. You must select the Pokemon you want to trade and press **TRADE**.
 - You will see your Pokemon and the Pokemon you selected on the Flipper Zero, in this case, `Mew`. You must select the Pokemon you want to trade and press **TRADE**.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_trade_list_select_trade.png" width="400" /><br />
         <img src="./docs/images/game_boy_trade_list_select_trade.png" width="400" /><br />
     </p>
     </p>
+
 - You must confirm the selected trade by selecting **TRADE**.
 - You must confirm the selected trade by selecting **TRADE**.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/game_boy_trade_list_select_trade_confirm.png" width="400" /><br />
         <img src="./docs/images/game_boy_trade_list_select_trade_confirm.png" width="400" /><br />
     </p>
     </p>
+
 - Flipper Zero will remain on a waiting screen with the Pokemon you selected.
 - Flipper Zero will remain on a waiting screen with the Pokemon you selected.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
-        <img src="./docs/images/flipper-zero-flat-6.png" width="400" /><br />
+        <img src="./docs/images/flipper-zero-flat-11.png" width="400" /><br />
     </p>
     </p>
+
 - Finally, the Pokemon exchange will start from **Flipper Zero** to the **Game Boy**.
 - Finally, the Pokemon exchange will start from **Flipper Zero** to the **Game Boy**.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
-        <img src="./docs/images/flipper-zero-flat-7.png" width="400" /><br />
+        <img src="./docs/images/flipper-zero-flat-12.png" width="400" /><br />
     </p>
     </p>
 
 
     If the Flipper Zero gets stuck at the end of the exchange, you must reboot it by pressing the <img src="./docs/images/left.png" /> LEFT + <img src="./docs/images/back.png" /> BACK key combination.
     If the Flipper Zero gets stuck at the end of the exchange, you must reboot it by pressing the <img src="./docs/images/left.png" /> LEFT + <img src="./docs/images/back.png" /> BACK key combination.
+
     <p align='center'>
     <p align='center'>
         <br />
         <br />
         <img src="./docs/images/reboot.png" width="400" /><br />
         <img src="./docs/images/reboot.png" width="400" /><br />
@@ -226,13 +302,18 @@ For each image, the color `#aaa` was transformed to `#fff` so that Flipper Zero
 - Game Boy Advance (GBA)
 - Game Boy Advance (GBA)
 
 
 ## Implemented by
 ## Implemented by
-<a href="https://github.com/EstebanFuentealba/Flipper-Zero-Game-Boy-Pokemon-Trading/issues?q=is%3Aissue+label%3AImplemented+is%3Aclosed+is%3Aopen+" target="_blank"><img src="./docs/images/implemented.svg" /></a>
+<a href="https://github.com/EstebanFuentealba/Flipper-Zero-Game-Boy-Pokemon-Trading/">EstebanFuentealba</a><br />
+<a href="https://github.com/R4g3D/Flipper-Zero-Game-Boy-Pokemon-Trading/">R4g3D</a>
 
 
 ## TODO
 ## TODO
-- [ ] Refactor the code
-- [x] The OK button stops working when exiting the app, so it needs to be restarted 🤔
-- [ ] Set each Pokemon's characteristics, attacks, and default levels
-- [ ] Improve animations
+- [x] Change the default traded Pokemon's naming to be no nickname
+- [x] Add view to allow the traded Pokemon's level to be chosen between 3 and 100
+- [x] Add view to allow the traded Pokemon's hidden stats to be chosen (IV and EV) from some options
+- [x] Add view to allow the traded Pokemon's moveset to be chosen (all 4 moves) allowing no move as an option
+- [ ] Debug traded Pokemon level issue where after a battle the Pokemon's level drops (doesn't affect all traded Pokemon)
+- [x] Add images for the level selection screen, stats selection screen, and move selection screens as per the original README
+- [ ] Optimise the level selection screen to be a number slider input instead of the current slideshow style selector
+- [ ] Add a view to allow for a custom Pokemon nickname (11 chars, 10 chars max used, fill and terminate with TERM_)
 
 
 ## Links
 ## Links
 
 
@@ -244,9 +325,3 @@ For each image, the color `#aaa` was transformed to `#fff` so that Flipper Zero
 - [Disassembly of Pokemon Yellow](https://github.com/pret/pokeyellow)
 - [Disassembly of Pokemon Yellow](https://github.com/pret/pokeyellow)
 - [Arduino-Spoofing-Gameboy-Pokemon-Trades](https://github.com/EstebanFuentealba/Arduino-Spoofing-Gameboy-Pokemon-Trades)
 - [Arduino-Spoofing-Gameboy-Pokemon-Trades](https://github.com/EstebanFuentealba/Arduino-Spoofing-Gameboy-Pokemon-Trades)
 - [🎮 Gameboy link cable breakout PCB](https://github.com/Palmr/gb-link-cable)
 - [🎮 Gameboy link cable breakout PCB](https://github.com/Palmr/gb-link-cable)
-
-<p align='center'>
-<br />
-<br />
-From Talcahuano 🇨🇱 with ❤ 
-</p>

+ 2 - 2
non_catalog_apps/gb-pokemon-trading/application.fam

@@ -5,10 +5,10 @@ App(
     entry_point="pokemon_app",
     entry_point="pokemon_app",
     requires=["gui"],
     requires=["gui"],
     stack_size=2 * 1024,
     stack_size=2 * 1024,
-    fap_version=[1, 2],
+    fap_version=[1,2],
     fap_category="GPIO",
     fap_category="GPIO",
     fap_icon="pokemon_10px.png",
     fap_icon="pokemon_10px.png",
     fap_icon_assets="assets",
     fap_icon_assets="assets",
     fap_author="Esteban Fuentealba",
     fap_author="Esteban Fuentealba",
-    fap_weburl="https://github.com/EstebanFuentealba",
+    fap_weburl="https://github.com/EstebanFuentealba"
 )
 )

BIN
non_catalog_apps/gb-pokemon-trading/docs/images/EXT-Link.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/GPIO-GBPIN-v2.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/GPIO-GBPIN_light-v2.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/back.png


+ 0 - 9
non_catalog_apps/gb-pokemon-trading/docs/images/back.svg

@@ -1,9 +0,0 @@
-<svg style="display:inline;fill:currentColor;stroke:currentColor;stroke-width:0.55px;"
-    xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
-    width="24" height="24" viewBox="0 0 24 24">
-    <path
-        d="M22,12C22,6.514 17.486,2 12,2C6.514,2 2,6.514 2,12C2,17.486 6.514,22 12,22C17.486,22 22,17.486 22,12M20,12C20,16.389 16.389,20 12,20C7.611,20 4,16.389 4,12C4,7.611 7.611,4 12,4C16.389,4 20,7.611 20,12"></path>
-    <path
-        d="M7.154,9.781L9.62,8L9.62,9.096L14.004,9.096C15.874,9.096 17.154,10.969 17.154,12.52C17.154,14.333 15.959,15.945 14.278,15.945L9.757,15.945L9.757,14.712L14.141,14.712C15.224,14.712 15.785,13.409 15.785,12.657C15.785,11.906 15.425,10.466 14.141,10.466L9.62,10.466L9.62,11.425L7.154,9.781Z"
-        style="stroke-width:0.55px;"></path>
-</svg>

BIN
non_catalog_apps/gb-pokemon-trading/docs/images/cut-cable-v3.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/dmg_link_port_pinout.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-1.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-2.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-3.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-4.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-5.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-6.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat-7.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-flat.psd


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/flipper-zero-pcb.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_pokemon_center.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_save.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_save_trade.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_trade_list.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_trade_list_select_trade.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_trade_list_select_trade_confirm.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_trade_room.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/game_boy_trade_room_2.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/gb_spi.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/gblpof.gif


Разница между файлами не показана из-за своего большого размера
+ 0 - 7
non_catalog_apps/gb-pokemon-trading/docs/images/implemented.svg


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/left.png


+ 0 - 6
non_catalog_apps/gb-pokemon-trading/docs/images/left.svg

@@ -1,6 +0,0 @@
-<svg style="display:inline;fill:currentColor;stroke:currentColor;stroke-width:0.55px;"
-    xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
-    width="24" height="24" viewBox="0 0 24 24">
-    <path
-        d="M22,12A10,10 0 0,0 12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12M20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12M14,7L9,12L14,17V7Z"></path>
-</svg>

BIN
non_catalog_apps/gb-pokemon-trading/docs/images/pcb.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/qFlipper.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/reboot.png


BIN
non_catalog_apps/gb-pokemon-trading/docs/images/wgbl-0.png


+ 0 - 744
non_catalog_apps/gb-pokemon-trading/docs/images/white_flat.svg

@@ -1,744 +0,0 @@
-<svg version="1.1" id="Flipper_1" xmlns="http://www.w3.org/2000/svg"
-    xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-    viewBox="0 0 202.5 85.4" style="enable-background:new 0 0 202.5 85.4;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill:#FFFFFF;}
-	.st1{fill:#231F20;}
-	.st2{fill:#fe8a2c;}
-	.st3{display:none;}
-	.st4{display:inline;fill:#FF8200;}
-	.st5{fill:#808080;}
-</style>
-<g id="white">
-	<g>
-		<g>
-			<path class="st0" d="M40.9,0.6h126.7c3.9,0.1,7.9,1,11.1,4.7C181.9,9,195.6,26,197,27.8s2.9,4.1,3.3,7.9
-				c0.4,3.8,1.5,29.3,1.5,32.8c0,3.7-1.1,5.2-1.9,6.9c-0.8,1.5-2,4-2.8,5.5s-3.5,3.8-7.8,3.9H32.2c-4.6,0-8.4-1.7-10.9-5.1
-				C18.8,76.4,5.1,57.5,4.5,56.5c-1-1.6-1.8-4.1-3.2-6.9c-0.9-1.8-1.3-4.6,1-7.8c2.4-3.2,25.8-33.6,27.9-36
-				C32.3,3.3,35.9,0.5,40.9,0.6z"/>
-			<path class="st1" d="M32.1,85.4c-4.7,0-8.6-1.8-11.2-5.3C18.6,77,4.6,57.9,4,56.8c-0.6-1-1.1-2.2-1.7-3.6c-0.4-1-0.9-2.2-1.5-3.4
-				s-1.7-4.4,1.1-8.3c2.5-3.4,26-33.8,27.9-36.1c1.7-2,5.5-5.4,11-5.4h0.1h126.7c3.2,0.1,7.9,0.7,11.6,4.9c1.9,2.3,8.1,9.9,17.9,22
-				l0.4,0.5c1.5,1.9,3,4.2,3.4,8.2c0.5,4,1.5,29.5,1.5,32.9c0,3.4-0.9,5.1-1.7,6.6c-0.1,0.2-0.2,0.4-0.3,0.6c-0.8,1.5-2,4-2.8,5.5
-				c-0.8,1.6-3.7,4.1-8.3,4.2H32.2C32.2,85.4,32.1,85.4,32.1,85.4z M40.8,1.1c-5.1,0-8.6,3.1-10.2,5c-1.9,2.3-25.4,32.6-27.8,36
-				c-2.5,3.4-1.6,6.1-1,7.2c0.6,1.2,1.1,2.4,1.6,3.5C4,54.2,4.5,55.3,5,56.2C5.5,57.1,19.3,76,21.8,79.4c2.4,3.2,6,4.9,10.4,4.9
-				h157.3c4.1-0.1,6.6-2.2,7.3-3.6c0.8-1.6,2-4,2.8-5.5c0.1-0.2,0.2-0.4,0.3-0.6c0.8-1.4,1.5-2.9,1.6-6.1c0-3.9-1.1-29.1-1.5-32.8
-				s-1.8-5.9-3.2-7.6l-0.4-0.5c-12.3-15.3-16.5-20.4-17.9-22c-2.6-3-6-4.4-10.7-4.5H41.1C40.9,1.1,40.8,1.1,40.8,1.1z"/>
-		</g>
-		<g>
-			<path class="st1" d="M27.3,78.5c-4.6,0-7-1.8-12.6-9.5c-5.4-7.3-12.9-17.8-13-17.9l0.5-0.3c0.1,0.1,7.5,10.6,12.9,17.9
-				c5.5,7.5,7.8,9.2,12.2,9.2h165.4c3.3-0.2,6.7-1.8,7.6-3.6l0.5,0.3c-1,2-4.6,3.8-8.1,3.9H27.3z"/>
-		</g>
-		<g>
-			<path class="st0" d="M164.8,2.9c4,0,6.6,0.5,9.2,3.6s18,22.2,19.3,23.8c1.3,1.6,2.4,4,2.4,6.6s0.6,14.8,0.4,18
-				c-0.2,3.3-2.9,5.7-6.4,5.8H42c-4.7-0.1-6.7-1.3-8.9-3.6c-2.2-2.4-7.9-8.5-9.6-10.7c-1.9-2.4-1-4.2,0.1-5.9
-				C24.9,38.9,43.4,11,45.2,8.1c1.7-2.8,4.9-5.2,8.8-5.2L164.8,2.9z"/>
-			<path class="st1" d="M42.1,61.1c-4.8-0.1-6.8-1.3-9.1-3.7s-7.9-8.6-9.6-10.8c-2-2.5-1.1-4.5,0.1-6.2C24.8,38.6,43.3,10.7,44.9,8
-				c2.1-3.3,5.4-5.3,9-5.3l0,0h110.8c4.2,0,6.8,0.6,9.4,3.7c2.6,3.1,18.2,22.4,19.3,23.8c1.5,2,2.4,4.5,2.4,6.8
-				c0,0.9,0.1,2.9,0.2,5.2c0.2,4.8,0.4,10.7,0.3,12.8c-0.2,3.4-3,6-6.6,6.1H42.1z M54,3.2c-3.4,0-6.6,1.9-8.5,5.1
-				C43.8,11,25.2,38.9,24,40.7c-1,1.5-2,3.2-0.1,5.5c1.7,2.2,7.3,8.3,9.6,10.7c2.2,2.3,4.1,3.5,8.7,3.5h147.7
-				c3.3-0.1,5.9-2.5,6.1-5.6c0.1-2.1-0.1-8.3-0.3-12.8c-0.1-2.3-0.2-4.3-0.2-5.2c0-3.2-1.6-5.6-2.3-6.4C192,29,176.5,9.7,173.8,6.7
-				c-2.5-2.9-5-3.4-9-3.5L54,3.2L54,3.2z"/>
-		</g>
-		<g>
-			<path class="st0" d="M191.3,39.6c2.5,3.2,0.8,11-4.7,11.9h-32.8c-11.3-0.1-22.8-9.4-22.7-22.7S142.7,7,154.1,7
-				c10.4,0.1,16.8,7.3,17.4,8.2C173.4,17.7,189.1,36.8,191.3,39.6z"/>
-			<path class="st1" d="M153.8,51.8c-5.7,0-11.5-2.4-15.8-6.5c-4.7-4.4-7.2-10.3-7.2-16.6C130.9,15,142.9,6.6,154,6.6h0.1
-				c11.1,0.1,17.6,8.2,17.6,8.3c0.9,1.2,5,6.1,9.2,11.4c4.6,5.7,9.4,11.6,10.6,13.1l0,0c1.4,1.7,1.6,4.9,0.5,7.6
-				c-1,2.6-3,4.3-5.4,4.7L153.8,51.8z M154,7.2c-10.8,0-22.5,8.2-22.6,21.5c0,6.1,2.5,11.9,7,16.1c4.3,4,9.9,6.3,15.4,6.3h32.8
-				c2.1-0.4,3.9-1.9,4.9-4.4s0.8-5.4-0.4-7l0,0c-1.2-1.5-5.9-7.4-10.6-13.1c-4.3-5.2-8.3-10.2-9.2-11.4
-				C171.2,15.1,164.9,7.2,154,7.2L154,7.2z"/>
-		</g>
-		<g>
-			<path class="st0" d="M147.8,80.3h23.9c0.9,0,1.8,1.1,0.1,1.2h-24.3C146.8,81.5,146.2,80.6,147.8,80.3z"/>
-			<path class="st1" d="M147.5,81.8c-0.5,0-0.9-0.4-0.9-0.8c0-0.3,0.1-0.8,1.2-1l0,0h23.9c0.7,0,1.3,0.5,1.3,1
-				c0,0.3-0.2,0.7-1.2,0.8H147.5z M147.8,80.6c-0.6,0.1-0.7,0.3-0.7,0.4s0.2,0.3,0.4,0.3h24.3c0.5,0,0.7-0.2,0.7-0.2
-				c0-0.1-0.3-0.4-0.8-0.4L147.8,80.6z"/>
-		</g>
-		<g>
-			<path class="st0" d="M195.4,80.4c0.3,0.1,0.3,1.7-2.4,2.3c-4.1,1-6,0.3-5.4-0.7s1.3-0.4,4.2-0.9S194.7,80,195.4,80.4z"/>
-			<path class="st1" d="M189.6,83.5c-1.1,0-1.9-0.2-2.2-0.6c-0.2-0.3-0.2-0.6,0-0.9c0.4-0.7,1-0.8,1.9-0.8c0.6,0,1.4-0.1,2.5-0.2
-				c1.4-0.2,2.1-0.5,2.5-0.7c0.5-0.2,0.8-0.3,1.2,0c0.2,0.1,0.3,0.3,0.3,0.6c0,0.3-0.2,1.7-2.7,2.2
-				C191.8,83.3,190.5,83.5,189.6,83.5z M195,80.6c-0.1,0-0.2,0-0.5,0.1c-0.5,0.2-1.2,0.5-2.6,0.7c-1.1,0.2-1.9,0.2-2.5,0.3
-				c-1,0-1.2,0.1-1.5,0.5c-0.1,0.2,0,0.3,0,0.3c0.3,0.4,1.9,0.7,5.2-0.1c1.5-0.3,2-0.9,2.2-1.3c0.1-0.2,0.1-0.4,0.1-0.5
-				C195.2,80.6,195.1,80.6,195,80.6z"/>
-		</g>
-		<g>
-			<path class="st2" d="M154,8.6c12.2,0.2,21.3,10.3,21.3,20.4c-0.1,10.6-8.5,20.6-20.7,20.6c-12.2-0.1-22-9.2-21.9-21.1
-				C132.8,17.1,142.7,8.4,154,8.6z"/>
-			<path class="st1" d="M154.8,49.9h-0.1c-12.6-0.1-22.4-9.5-22.3-21.5c0-5.3,2.2-10.3,6-14.1c4.1-4,9.8-6.2,15.7-6.2l0,0
-				c12.9,0.2,21.8,11.1,21.7,20.8C175.7,39.1,167.7,49.9,154.8,49.9z M153.6,9c-5.5,0-10.8,2.1-14.7,5.9c-3.7,3.6-5.8,8.4-5.8,13.5
-				c-0.1,11.5,9.4,20.6,21.5,20.7h0.1c12.4,0,20.1-10.4,20.1-20.1c0-9.2-8.5-19.7-20.9-19.9C153.9,9,153.8,9,153.6,9z"/>
-		</g>
-		<g>
-			<path class="st2" d="M183.4,36.5c4.3,0,6.9,3.5,6.9,6.7c0,3.1-2.2,6.4-6.6,6.4c-4.2-0.1-6.9-3.5-6.9-6.7
-				C176.9,39.7,179.6,36.6,183.4,36.5z"/>
-			<path class="st1" d="M183.8,50.1h-0.1c-2,0-3.9-0.8-5.3-2.2c-1.3-1.4-2-3.2-2-4.9c0.1-3.2,2.8-6.7,7.1-6.8l0,0
-				c2.1,0,4,0.8,5.4,2.3c1.2,1.3,1.9,3.1,1.9,4.9c0,1.8-0.7,3.6-2,4.9C187.5,49.4,185.8,50.1,183.8,50.1z M183.5,37L183.5,37
-				c-3.8,0-6.2,3.1-6.3,5.9c0,1.6,0.6,3.1,1.8,4.3c1.2,1.3,2.9,2,4.7,2s3.4-0.5,4.5-1.7c1.1-1.1,1.7-2.7,1.7-4.3s-0.6-3.1-1.7-4.3
-				C187.4,38.1,185.9,37,183.5,37z"/>
-		</g>
-		<g>
-			<path class="st1" d="M154.5,46c-0.3,0-0.5-0.1-0.7-0.4c-0.2-0.2-1.3-2-2.3-3.7L151,41c-0.2-0.4-0.3-0.8-0.1-1
-				c0.1-0.1,0.3-0.3,0.7-0.3s1.8,0,3.1,0c1.1,0,2.2,0,2.5,0c0.5,0,0.7,0.3,0.8,0.4c0.1,0.2,0.1,0.6-0.1,0.8
-				c-0.1,0.1-0.3,0.6-0.7,1.2c-0.9,1.6-1.8,3.2-2,3.5S154.7,46,154.5,46L154.5,46z M151.5,40.2c-0.1,0-0.1,0-0.1,0.1s0,0.3,0.1,0.5
-				l0.5,0.8c0.7,1.2,2.1,3.5,2.3,3.7c0.1,0.1,0.2,0.2,0.3,0.2l0,0c0.1,0,0.2-0.1,0.2-0.2c0.2-0.3,1.3-2.2,2-3.4
-				c0.3-0.6,0.6-1,0.7-1.2c0.1-0.1,0.1-0.2,0-0.3c0-0.1-0.2-0.1-0.3-0.1c-0.3,0-1.3,0-2.5,0C153.3,40.2,152,40.2,151.5,40.2
-				L151.5,40.2L151.5,40.2z"/>
-		</g>
-		<g>
-			<path class="st1" d="M142,32c-0.2,0-0.3,0-0.6-0.1s-2.5-1.3-4.5-2.5l-0.5-0.3c-0.4-0.2-0.5-0.5-0.5-0.7c0-0.3,0.2-0.6,0.6-0.8
-				c0.3-0.2,2.2-1.2,3.4-1.9l1.1-0.6c0.3-0.2,0.8-0.4,1.1-0.2c0.4,0.2,0.3,0.7,0.3,0.8c0,0.6,0,3.8,0.1,5v0.4c0,0.3-0.1,0.6-0.3,0.7
-				C142.3,32,142.1,32,142,32z M141.9,25.5c-0.1,0-0.2,0-0.5,0.2l-1.1,0.6c-1.3,0.7-3.1,1.7-3.4,1.9c-0.2,0.1-0.3,0.2-0.3,0.3
-				c0,0.1,0.1,0.1,0.2,0.2l0.5,0.3c1.1,0.6,4.1,2.3,4.4,2.5c0.3,0.1,0.4,0.1,0.4,0.1s0-0.1,0-0.2V31c0-1.2-0.1-4.4-0.1-5h0.3H142
-				C142,25.6,142,25.5,141.9,25.5L141.9,25.5z"/>
-		</g>
-		<g>
-			<path class="st1" d="M166.6,32c-0.1,0-0.3,0-0.4-0.1c-0.2-0.1-0.4-0.3-0.4-0.8c0-0.3,0-1,0-1.8c0-1.3-0.1-2.9,0-3.4l0,0
-				c0-0.4,0.1-0.7,0.4-0.9c0.3-0.2,0.7-0.1,1.3,0.2c0.5,0.3,3.4,2,4.2,2.5l0.2,0.1c0.3,0.2,0.5,0.4,0.5,0.7c0,0.2-0.1,0.5-0.6,0.8
-				c-0.6,0.4-4.1,2.4-4.5,2.6C167,32,166.8,32,166.6,32z M166.3,25.9c0,0.6,0,2.1,0,3.4c0,0.8,0,1.5,0,1.8c0,0.1,0,0.3,0.1,0.3
-				c0.1,0.1,0.2,0,0.4-0.1c0.4-0.2,3.9-2.2,4.5-2.6c0.2-0.1,0.3-0.3,0.3-0.3c0-0.1-0.1-0.1-0.2-0.2l-0.2-0.1
-				c-0.8-0.5-3.7-2.1-4.2-2.4c-0.4-0.2-0.7-0.3-0.7-0.2C166.3,25.5,166.3,25.7,166.3,25.9L166.3,25.9z"/>
-		</g>
-		<g>
-			<path class="st1" d="M156.8,17.5L156.8,17.5c-0.3,0-4,0-5.2,0h-0.5c-0.4,0-0.7-0.1-0.8-0.4c-0.1-0.1-0.2-0.4,0-0.9
-				c0.1-0.3,0.7-1.2,1.3-2.2c0.6-0.9,1.1-1.8,1.3-2.2c0.3-0.4,0.5-0.7,0.8-0.7s0.5,0.1,0.7,0.5c0.1,0.2,0.7,1.1,1.3,2.1
-				c0.7,1.1,1.4,2.3,1.6,2.5c0.2,0.3,0.2,0.6,0.1,0.9C157.4,17.3,157.1,17.5,156.8,17.5z M151.1,16.9h0.5c2.3,0,5,0,5.2,0
-				c0.1,0,0.2,0,0.2-0.1c0.1-0.1,0-0.2-0.1-0.3c-0.2-0.3-0.9-1.4-1.6-2.6c-0.6-1-1.2-1.9-1.3-2.1c-0.1-0.2-0.2-0.2-0.2-0.2l0,0
-				c0,0-0.2,0.1-0.4,0.4c-0.2,0.4-0.8,1.3-1.3,2.2c-0.6,1-1.2,1.9-1.3,2.2c-0.1,0.1-0.1,0.2-0.1,0.3C150.9,16.9,151,16.9,151.1,16.9
-				L151.1,16.9z"/>
-		</g>
-		<g>
-			<path class="st1" d="M185.4,46.2L185.4,46.2h-3.8v-1.5h3.6l0,0c0.6,0,1-0.8,1-1.3c0-0.2-0.1-0.6-0.2-0.9
-				c-0.2-0.3-0.4-0.5-0.7-0.5h-3.2v1l-2.7-1.8l2.7-1.9v1.1h3.1c0.7,0,1.4,0.4,2,1c0.5,0.6,0.7,1.3,0.7,1.9c0,0.8-0.2,1.5-0.7,2
-				C186.7,45.9,186.1,46.2,185.4,46.2z M182.2,45.6h3.2l0,0c0.5,0,1-0.2,1.4-0.7c0.4-0.4,0.6-1,0.6-1.7c0-0.5-0.2-1.1-0.6-1.6
-				c-0.4-0.5-0.9-0.8-1.5-0.8h-3.6v-0.6l-1.1,0.8l1.1,0.7v-0.5h3.7c0.5,0,1,0.3,1.2,0.8c0.3,0.5,0.3,1,0.3,1.2
-				c0,0.8-0.6,1.8-1.5,1.8l0,0h-3.1L182.2,45.6z"/>
-		</g>
-		<g>
-			<path class="st0" d="M133.3,47.9c0.7,0,1.3,0.7,1.3,1.3c0,0.5-0.4,1.2-1.2,1.1s-1.4-0.5-1.4-1.2C132,48.5,132.5,47.9,133.3,47.9z
-				"/>
-			<path class="st1" d="M133.4,50.6L133.4,50.6c-0.9,0-1.7-0.6-1.6-1.4c0-0.8,0.7-1.5,1.5-1.5l0,0l0,0c0.9,0,1.5,0.8,1.5,1.6
-				C134.8,49.9,134.3,50.6,133.4,50.6z M133.3,48.2c-0.5,0-1,0.4-1,1c0,0.5,0.5,0.9,1.1,0.9l0,0c0.6,0,0.9-0.5,0.9-0.9
-				C134.2,48.8,133.8,48.2,133.3,48.2L133.3,48.2z"/>
-		</g>
-		<g>
-			<path class="st1" d="M154.4,35.9L154.4,35.9c-2.2,0-4.3-0.9-5.7-2.3c-1.3-1.3-2-3.1-1.9-5.1c0.1-4.8,4.4-7,7.4-7l0,0l0,0
-				c1.9,0,3.7,0.8,5.1,2.2c1.4,1.4,2.2,3.2,2.1,5.1c0,1.9-0.7,3.7-2,5C158.2,35.1,156.4,35.9,154.4,35.9z M154.2,22.3L154.2,22.3
-				c-2.7,0-6.5,1.9-6.5,6.2c0,1.7,0.6,3.3,1.7,4.4c1.3,1.3,3.2,2.1,5.1,2.1l0,0c1.7,0,3.3-0.6,4.4-1.8c1.1-1.2,1.8-2.7,1.8-4.4
-				c0-1.7-0.7-3.3-1.9-4.5C157.5,23,155.8,22.4,154.2,22.3z"/>
-		</g>
-		<g>
-			<path class="st0" d="M121.6,51.5H54.1c-2.7,0-5-2.2-5-5V11.7c0-2.7,2.2-5,5-5h67.5c2.7,0,5,2.2,5,5v34.8
-				C126.6,49.3,124.4,51.5,121.6,51.5z"/>
-			<path class="st1" d="M121.6,52H54.1c-3,0-5.5-2.4-5.5-5.5V11.7c0-3,2.4-5.5,5.5-5.5h67.5c3,0,5.5,2.5,5.5,5.5v34.8
-				C127.1,49.6,124.6,52,121.6,52z M54.1,7.3c-2.5,0-4.5,2-4.5,4.5v34.8c0,2.5,2,4.5,4.5,4.5h67.5c2.5,0,4.5-2,4.5-4.5V11.7
-				c0-2.5-2-4.5-4.5-4.5H54.1V7.3z"/>
-		</g>
-		<g>
-			<path class="st2" d="M121.4,49.1H54.5c-1.6,0-2.9-1.3-2.9-2.9V11.9c0-1.6,1.3-2.9,2.9-2.9h66.8c1.6,0,2.9,1.3,2.9,2.9v34.3
-				C124.3,47.8,123,49.1,121.4,49.1z"/>
-			<path class="st1" d="M121.4,49.4H54.5c-1.8,0-3.2-1.4-3.2-3.2V11.9c0-1.8,1.4-3.2,3.2-3.2h66.8c1.8,0,3.2,1.4,3.2,3.2v34.3
-				C124.5,48,123.1,49.4,121.4,49.4z M54.5,9.3c-1.4,0-2.6,1.2-2.6,2.6v34.3c0,1.4,1.2,2.6,2.6,2.6h66.8c1.4,0,2.6-1.2,2.6-2.6V11.9
-				c0-1.4-1.2-2.6-2.6-2.6C121.3,9.3,54.5,9.3,54.5,9.3z"/>
-		</g>
-	</g>
-	<g id="dolphin_1_">
-		<g>
-			<polygon points="86.7,35.8 86.1,35.8 85.6,35.8 85,35.8 85,36.4 85.6,36.4 86.1,36.4 86.7,36.4 87.2,36.4 87.8,36.4 87.8,35.8 
-				87.2,35.8 			"/>
-		</g>
-		<g>
-			<polygon points="70,35.8 69.5,35.8 69.5,36.3 70,36.3 70.6,36.3 70.6,35.8 			"/>
-		</g>
-		<g>
-			<rect x="58.97" y="35.47" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.1959 94.8637)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.79" y="35.63" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.8589 93.8361)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.7" y="35.69" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.7184 92.8058)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="88.9,35.3 88.3,35.3 88.3,34.7 87.8,34.7 87.2,34.7 87.2,35.3 87.8,35.3 87.8,35.8 88.3,35.8 88.9,35.9 
-				89.5,35.9 90,35.9 90,35.3 89.5,35.3 			"/>
-		</g>
-		<g>
-			<rect x="68.93" y="35.25" transform="matrix(5.134305e-03 -1 1 5.134305e-03 33.3228 104.5986)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="59.44" y="35.05" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.0809 94.909)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="58.35" y="35.01" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0409 93.7807)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.27" y="35.07" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.9013 92.7517)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.18" y="34.93" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.9613 91.5241)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="90.6,34.8 90,34.7 90,35.3 90.6,35.3 91.1,35.3 91.7,35.3 91.7,34.8 91.1,34.8 			"/>
-		</g>
-		<g>
-			<rect x="60" y="34.43" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2657 94.8522)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="58.92" y="34.39" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2264 93.7232)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.93" y="34.45" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.1847 92.7943)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.74" y="34.5" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.9479 91.6674)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.66" y="34.46" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.9082 90.5384)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="91.7,34.2 91.7,34.8 92.2,34.8 92.8,34.8 92.8,34.2 92.2,34.2 			"/>
-		</g>
-		<g>
-			<polygon points="86.7,34.7 87.2,34.7 87.2,34.2 86.7,34.2 86.1,34.2 86.1,34.7 			"/>
-		</g>
-		<g>
-			<rect x="59.48" y="33.96" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2096 93.8691)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="58.49" y="33.92" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2686 92.8401)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.31" y="33.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0293 91.7103)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.12" y="33.94" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.8907 90.4827)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.03" y="33.9" transform="matrix(5.134305e-03 -1 1 5.134305e-03 20.8514 89.3535)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="59.06" y="33.4" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.3532 92.8826)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.97" y="33.36" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.3134 91.753)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.88" y="33.42" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.1746 90.7263)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.7" y="33.47" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.9363 89.5974)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="93.9,33.1 93.3,33.1 92.8,33.1 92.2,33.1 91.7,33.1 91.1,33.1 90.6,33.1 90,33.1 89.5,33.1 88.9,33.1 88.4,33.1 
-				87.8,33.1 87.2,33.1 86.7,33.1 86.1,33.1 85.6,33.1 85,33.1 84.5,33.1 84.5,32.5 85,32.5 85,31.9 85.6,32 85.6,31.4 86.1,31.4 
-				86.2,30.8 86.7,30.8 86.7,30.3 87.3,30.3 87.3,29.7 87.8,29.7 87.8,29.2 88.4,29.2 88.4,28.6 88.9,28.6 88.9,28.1 89.5,28.1 
-				89.5,27.5 90.1,27.5 90.1,27 90.6,27 90.6,26.4 91.2,26.4 91.2,25.9 91.7,25.9 91.7,25.3 92.3,25.3 92.3,24.8 92.8,24.8 
-				92.8,24.2 93.4,24.2 93.4,23.7 93.4,23.1 93.4,22.6 93.4,22 92.9,22 92.9,21.5 92.3,21.5 91.7,21.4 91.2,21.4 91.2,20.9 
-				90.6,20.9 90.1,20.9 89.5,20.9 89,20.9 88.4,20.9 87.9,20.9 87.3,20.9 86.8,20.9 86.2,20.9 86.2,21.4 85.6,21.4 85.1,21.4 
-				85.1,22 84.5,22 84,22 84,22.5 83.4,22.5 82.9,22.5 82.9,22 82.3,22 82.3,21.4 82.3,20.8 81.8,20.8 81.8,20.3 81.8,19.7 
-				81.2,19.7 81.2,19.2 80.7,19.2 80.7,18.6 80.1,18.6 80.1,18.1 79.6,18.1 79.6,17.5 79,17.5 78.5,17.5 78.5,16.9 77.9,16.9 
-				77.4,16.9 77.4,16.4 76.8,16.4 76.2,16.4 75.7,16.4 75.7,15.8 75.1,15.8 74.6,15.8 74,15.8 73.5,15.8 72.9,15.8 72.9,15.3 
-				72.4,15.2 71.8,15.2 71.3,15.2 70.7,15.2 70.2,15.2 69.6,15.2 69,15.2 68.5,15.2 67.9,15.2 67.4,15.2 66.8,15.2 66.3,15.2 
-				65.7,15.2 65.2,15.2 64.6,15.2 64.6,15.8 64,15.8 63.5,15.8 62.9,15.8 62.4,15.8 62.4,16.3 61.8,16.3 61.3,16.3 60.7,16.3 
-				60.7,16.9 60.2,16.9 60.2,17.4 59.6,17.4 59.1,17.4 59,18 58.5,18 57.9,17.9 57.9,18.5 57.4,18.5 57.4,19.1 56.8,19.1 56.8,19.6 
-				56.3,19.6 56.3,20.2 55.7,20.2 55.7,20.7 55.2,20.7 55.1,21.3 55.1,21.8 54.6,21.8 54.6,22.4 54.6,22.9 54,22.9 54,23.5 54,24 
-				53.5,24 53.5,24.6 53.5,25.1 53.5,25.7 54,25.7 54,25.1 54,24.6 54.6,24.6 54.6,24 54.6,23.5 55.1,23.5 55.1,22.9 55.1,22.4 
-				55.7,22.4 55.7,21.8 55.7,21.3 56.3,21.3 56.3,20.7 56.8,20.7 56.8,20.2 57.4,20.2 57.4,19.6 57.9,19.6 57.9,19.1 58.5,19.1 
-				58.5,18.5 59,18.5 59.6,18.5 59.6,18 60.2,18 60.7,18 60.7,17.4 61.3,17.4 61.8,17.4 62.4,17.4 62.9,17.4 63.5,17.4 64,17.4 
-				64.6,17.4 65.1,17.4 65.7,17.4 66.3,17.4 66.8,17.4 67.4,17.4 67.4,16.9 66.8,16.9 66.3,16.9 65.7,16.9 65.2,16.9 64.6,16.9 
-				64,16.9 63.5,16.9 62.9,16.9 62.9,16.3 63.5,16.3 64,16.3 64.6,16.3 65.2,16.3 65.2,15.8 65.7,15.8 66.3,15.8 66.8,15.8 
-				67.4,15.8 67.9,15.8 68.5,15.8 69,15.8 69.6,15.8 70.1,15.8 70.7,15.8 71.3,15.8 71.8,15.8 72.4,15.8 72.4,16.4 72.9,16.4 
-				72.9,16.9 73.5,16.9 73.5,16.4 74,16.4 74,16.9 74.6,16.9 75.1,16.9 75.7,16.9 76.2,16.9 76.8,16.9 76.8,17.5 76.8,18 77.3,18 
-				77.9,18.1 78.5,18.1 79,18.1 79,18.6 79.6,18.6 79.6,19.2 80.1,19.2 80.1,19.7 80.7,19.7 80.7,20.3 81.2,20.3 81.2,20.8 
-				81.2,21.4 81.2,21.9 80.7,21.9 80.6,22.5 81.2,22.5 81.8,22.5 82.3,22.5 82.3,23.1 82.3,23.6 82.9,23.6 83.4,23.6 83.4,23.1 
-				84,23.1 84.5,23.1 84.5,22.5 85.1,22.5 85.6,22.5 85.6,22 86.2,22 86.8,22 86.8,21.4 87.3,21.4 87.9,21.4 88.4,21.4 89,21.4 
-				89.5,21.4 90.1,21.4 90.6,21.4 90.6,22 91.2,22 91.7,22 92.3,22 92.3,22.6 92.8,22.6 92.8,23.1 92.3,23.1 91.7,23.1 91.2,23.1 
-				90.6,23.1 90.6,23.7 90.1,23.7 89.5,23.7 89,23.7 89,24.2 88.4,24.2 87.8,24.2 87.8,24.8 87.3,24.8 86.7,24.7 86.7,25.3 
-				86.2,25.3 86.2,25.9 85.6,25.9 85.6,26.4 85.1,26.4 85.1,27 84.5,27 84.5,27.5 84,27.5 83.9,28.1 83.4,28.1 83.4,28.6 82.8,28.6 
-				82.8,29.2 82.3,29.2 82.3,29.7 81.7,29.7 81.7,30.3 81.2,30.3 81.2,30.8 80.6,30.8 80.6,31.4 80,31.4 80,31.9 79.5,31.9 
-				79.5,32.5 78.9,32.5 78.9,33 78.4,33 78.4,33.6 77.8,33.6 77.8,34.1 77.3,34.1 77.3,34.7 76.7,34.7 76.2,34.7 76.1,35.2 
-				75.6,35.2 75,35.2 75,35.8 74.5,35.8 73.9,35.8 73.4,35.8 73.4,36.3 72.8,36.3 72.3,36.3 71.7,36.3 71.2,36.3 70.6,36.3 
-				70.6,36.9 71.1,36.9 71.7,36.9 72.3,36.9 72.8,36.9 73.4,36.9 73.9,36.9 74.5,36.9 75,36.9 75.6,36.9 76.1,36.9 76.7,36.9 
-				77.2,36.9 77.8,36.9 78.4,36.9 78.9,36.9 79.5,36.9 80,36.9 80.6,36.9 81.1,36.9 81.7,36.9 82.2,36.9 82.8,36.9 83.3,36.9 
-				83.9,36.9 84.5,36.9 85,36.9 85,36.4 84.5,36.4 83.9,36.4 83.4,36.4 82.8,36.4 82.2,36.4 81.7,36.4 81.1,36.4 80.6,36.4 80,36.4 
-				79.5,36.4 78.9,36.4 78.4,36.4 78.4,35.8 78.4,35.2 78.9,35.2 78.9,34.7 79.5,34.7 79.5,34.1 80,34.1 80,33.6 80.6,33.6 
-				81.1,33.6 81.7,33.6 82.3,33.6 82.8,33.6 83.4,33.6 83.9,33.6 83.9,34.2 84.5,34.2 85,34.2 85.6,34.2 86.1,34.2 86.1,33.6 
-				86.7,33.6 87.2,33.6 87.8,33.6 88.4,33.6 88.9,33.6 89.5,33.6 90,33.6 90.6,33.6 91.1,33.6 91.7,33.6 92.2,33.6 92.8,33.7 
-				92.8,34.2 93.3,34.2 93.9,34.2 93.9,34.8 93.9,35.3 93.9,35.9 93.3,35.9 93.3,36.4 92.8,36.4 92.8,37 92.2,37 92.2,37.5 
-				91.7,37.5 91.7,38.1 91.1,38.1 90.6,38.1 90.5,38.6 90,38.6 89.4,38.6 88.9,38.6 88.9,39.2 88.3,39.2 87.8,39.2 87.2,39.2 
-				87.2,39.7 86.7,39.7 86.1,39.7 85.6,39.7 85.5,40.3 85,40.3 84.4,40.3 83.9,40.3 83.3,40.3 83.3,40.8 82.8,40.8 82.2,40.8 
-				81.7,40.8 81.1,40.8 81.1,41.4 80.6,41.4 80,41.4 79.4,41.3 79.4,41.9 78.9,41.9 78.9,42.5 79.4,42.5 80,42.5 80.5,42.5 
-				81.1,42.5 81.7,42.5 82.2,42.5 82.8,42.5 82.8,41.9 83.3,41.9 83.9,41.9 83.9,41.4 83.9,40.8 84.4,40.8 85,40.8 85.5,40.8 
-				86.1,40.8 86.1,40.3 86.7,40.3 87.2,40.3 87.8,40.3 87.8,39.7 88.3,39.7 88.9,39.7 89.4,39.7 89.4,39.2 90,39.2 90.5,39.2 
-				91.1,39.2 91.1,38.6 91.7,38.6 92.2,38.6 92.2,38.1 92.8,38.1 92.8,37.5 93.3,37.5 93.3,37 93.9,37 93.9,36.4 94.4,36.4 
-				94.4,35.9 94.4,35.3 94.4,34.8 94.5,34.2 94.5,33.7 93.9,33.7 			"/>
-		</g>
-		<g>
-			<rect x="58.43" y="32.94" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.1982 91.7988)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.35" y="32.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.1586 90.6696)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.16" y="32.85" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.02 89.442)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.07" y="32.91" transform="matrix(5.134305e-03 -1 1 5.134305e-03 21.8786 88.4149)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.91" y="32.37" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2429 90.7118)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.92" y="32.23" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.4021 89.5849)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.74" y="32.39" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0652 88.5576)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="60.55" y="31.83" transform="matrix(5.134305e-03 -1 1 5.134305e-03 28.4088 92.8184)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="58.4,31.8 58.4,32.4 59,32.4 59,32.9 59.5,32.9 59.5,33.5 60.1,33.5 60.1,34 60.6,34 60.6,34.6 61.2,34.6 
-				61.2,35.2 61.7,35.2 61.7,34.6 61.7,34 61.7,33.5 62.3,33.5 62.3,32.9 62.3,32.4 61.7,32.4 61.2,32.4 61.2,32.9 61.2,33.5 
-				60.6,33.5 60.6,32.9 60.1,32.9 60.1,32.4 59.5,32.4 59.5,31.8 59.5,31.3 59,31.3 59,31.8 			"/>
-		</g>
-		<g>
-			<rect x="57.39" y="31.81" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.2872 89.6305)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.3" y="31.76" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2473 88.5013)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.02" y="31.72" transform="matrix(5.134305e-03 -1 1 5.134305e-03 23.0083 87.1761)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="57.95" y="31.28" transform="matrix(5.134305e-03 -1 1 5.134305e-03 26.3722 89.6722)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.87" y="31.14" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.4326 88.4445)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="55.68" y="31.1" transform="matrix(5.134305e-03 -1 1 5.134305e-03 24.2895 87.218)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="60.6,30.7 60.1,30.7 60.1,31.3 60.1,31.8 60.6,31.8 60.6,31.3 			"/>
-		</g>
-		<g>
-			<rect x="57.33" y="30.72" transform="matrix(5.134305e-03 -1 1 5.134305e-03 26.3174 88.4904)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="56.24" y="30.58" transform="matrix(5.134305e-03 -1 1 5.134305e-03 25.3767 87.2628)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<path d="M68.4,30.2v-0.6V29v-0.6v-0.6v-0.6h-0.6v-0.6V26h-0.6v-0.6h-0.6H66v-0.6h-0.6h-0.6h-0.6h-0.6H63v0.6h-0.6h-0.6V26h-0.6
-				v0.6v0.6h-0.6v0.6v0.6V29v0.6v0.6h0.6v0.6v0.6h0.6V32v0.6h0.6V32H63h0.6v-0.6h0.6h0.6h0.6v-0.6H66h0.6h0.6h0.6h0.6H69v-0.6
-				L68.4,30.2z M63.4,28v-0.6H64h0.6V28v0.6H64h-0.6V28z"/>
-		</g>
-		<g>
-			<rect x="56.71" y="30.06" transform="matrix(5.134305e-03 -1 1 5.134305e-03 26.3595 87.2071)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="71.2,29.7 71.2,29.1 71.2,28.6 71.2,28 71.2,27.4 71.2,26.9 71.2,26.3 70.6,26.3 70.6,26.9 70.6,27.4 70.6,28 
-				70.6,28.5 70.6,29.1 70.6,29.7 70.6,30.2 71.2,30.2 71.7,30.2 72.3,30.2 72.3,29.7 71.7,29.7 			"/>
-		</g>
-		<g>
-			<polygon points="60.1,29.6 60.1,29 60.1,28.5 60.1,27.9 60.1,27.4 60.1,26.8 59.6,26.8 59.6,27.4 59.6,27.9 59.5,28.5 59.5,29 
-				59.5,29.6 59.5,30.2 59.5,30.7 60.1,30.7 60.1,30.2 			"/>
-		</g>
-		<g>
-			<polygon points="72.3,29.1 72.3,29.7 72.8,29.7 73.4,29.7 73.4,29.1 72.9,29.1 			"/>
-		</g>
-		<g>
-			<polygon points="73.4,28.6 73.4,29.1 74,29.1 74.5,29.1 74.5,28.6 74,28.6 			"/>
-		</g>
-		<g>
-			<polygon points="74.5,28 74.5,28.6 75.1,28.6 75.6,28.6 75.6,28 75.1,28 			"/>
-		</g>
-		<g>
-			<polygon points="75.6,27.5 75.6,28 76.2,28 76.7,28 76.7,27.5 76.2,27.5 			"/>
-		</g>
-		<g>
-			<polygon points="69.5,28 69.5,28.5 69.5,29.1 69.5,29.7 69.5,30.2 69.5,30.8 69,30.8 69,31.3 69.5,31.3 70.1,31.3 70.1,30.8 
-				70.1,30.2 70.1,29.7 70.1,29.1 70.1,28.5 70.1,28 70.1,27.4 70.1,26.9 69.5,26.9 69.5,27.4 			"/>
-		</g>
-		<g>
-			<rect x="76.7" y="26.94" transform="matrix(5.134305e-03 -1 1 5.134305e-03 49.3644 104.0994)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="77.3,26.4 77.3,26.9 77.9,26.9 78.4,26.9 78.4,26.4 77.9,26.4 			"/>
-		</g>
-		<g>
-			<polygon points="69,26.9 69.5,26.9 69.5,26.3 69.5,25.8 69,25.8 69,26.3 			"/>
-		</g>
-		<g>
-			<polygon points="60.7,26.3 60.7,25.7 60.1,25.7 60.1,26.3 60.1,26.8 60.7,26.8 			"/>
-		</g>
-		<g>
-			<polygon points="58.4,26.8 58.4,27.4 58.4,27.9 58.4,28.5 58.4,29 58.4,29.6 58.4,30.1 57.9,30.1 57.9,30.7 58.4,30.7 58.4,31.3 
-				59,31.3 59,30.7 59,30.2 59,29.6 59,29 59,28.5 59,27.9 59,27.4 59,26.8 59,26.3 58.5,26.3 			"/>
-		</g>
-		<g>
-			<rect x="78.42" y="25.87" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.1503 104.7495)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="79,25.3 79,25.8 79.5,25.8 80.1,25.8 80.1,25.3 79.5,25.3 			"/>
-		</g>
-		<g>
-			<polygon points="75.1,25.2 74.5,25.2 74,25.2 74,25.8 74.5,25.8 75.1,25.8 75.6,25.8 76.2,25.8 76.2,25.3 75.6,25.2 			"/>
-		</g>
-		<g>
-			<polygon points="70.7,25.2 70.1,25.2 70.1,25.8 70.1,26.3 70.6,26.3 70.7,25.8 			"/>
-		</g>
-		<g>
-			<rect x="68.31" y="25.2" transform="matrix(5.134305e-03 -1 1 5.134305e-03 42.7596 93.9763)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="60.7" y="25.11" transform="matrix(5.134305e-03 -1 1 5.134305e-03 35.2776 86.2758)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="59,25.7 59,26.3 59.6,26.3 59.6,25.7 59.6,25.2 59,25.2 			"/>
-		</g>
-		<g>
-			<rect x="80.04" y="24.59" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.0393 105.1025)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="76.2,24.7 76.2,25.3 76.8,25.3 77.3,25.3 77.3,24.7 76.8,24.7 			"/>
-		</g>
-		<g>
-			<rect x="73.52" y="24.64" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.5014 98.6335)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="69.57" y="24.65" transform="matrix(5.134305e-03 -1 1 5.134305e-03 44.5623 94.6831)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="67.99" y="24.63" transform="matrix(5.134305e-03 -1 1 5.134305e-03 43.0018 93.0898)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="61.16" y="24.59" transform="matrix(5.134305e-03 -1 1 5.134305e-03 36.2632 86.2221)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="59.48" y="24.57" transform="matrix(5.134305e-03 -1 1 5.134305e-03 34.6008 84.5275)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="80.6,24.2 80.6,24.7 81.2,24.7 81.7,24.7 81.8,24.2 81.2,24.2 			"/>
-		</g>
-		<g>
-			<polygon points="77.3,24.1 77.3,24.7 77.9,24.7 78.4,24.7 78.4,24.2 77.9,24.1 			"/>
-		</g>
-		<g>
-			<rect x="72.9" y="23.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.5423 97.3489)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="69.04" y="24.08" transform="matrix(5.134305e-03 -1 1 5.134305e-03 44.6043 93.5989)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="67.3,24.7 67.9,24.7 67.9,24.1 67.3,24.1 66.8,24.1 66.8,24.6 			"/>
-		</g>
-		<g>
-			<polygon points="62.9,24.6 62.9,24.1 62.3,24.1 61.8,24.1 61.8,24.6 62.3,24.6 			"/>
-		</g>
-		<g>
-			<rect x="60.15" y="24.05" transform="matrix(5.134305e-03 -1 1 5.134305e-03 35.7867 84.6725)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="81.76" y="23.52" transform="matrix(5.134305e-03 -1 1 5.134305e-03 57.8264 105.7553)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="78.4" y="23.69" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.3101 102.5693)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="64,24.1 64.6,24.1 65.1,24.1 65.7,24.1 66.2,24.1 66.8,24.1 66.8,23.5 66.2,23.5 65.7,23.5 65.1,23.5 64.6,23.5 
-				64,23.5 63.5,23.5 62.9,23.5 62.9,24.1 63.5,24.1 			"/>
-		</g>
-		<g>
-			<rect x="60.61" y="23.43" transform="matrix(5.134305e-03 -1 1 5.134305e-03 36.8701 84.518)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="79,23 79,23.6 79.5,23.6 80.1,23.6 80.1,23.1 79.5,23 			"/>
-		</g>
-		<g>
-			<rect x="76.3" y="22.92" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.9897 99.6957)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="72.9,23 72.9,22.5 72.3,22.5 72.3,23 72.3,23.6 72.3,24.1 72.9,24.1 72.9,23.6 			"/>
-		</g>
-		<g>
-			<polygon points="69.6,23.6 69.6,23 69.6,22.4 69,22.4 69,23 68.4,23 68.5,22.4 67.9,22.4 67.9,21.9 67.3,21.9 67.3,22.4 
-				66.8,22.4 66.2,22.4 65.7,22.4 65.1,22.4 64.6,22.4 64,22.4 63.5,22.4 62.9,22.4 62.4,22.4 62.3,23 62.9,23 63.5,23 64,23 
-				64.6,23 65.1,23 65.7,23 66.2,23 66.8,23 67.3,23 67.3,23.5 67.9,23.5 68.4,23.5 68.4,24.1 69,24.1 69,23.5 			"/>
-		</g>
-		<g>
-			<polygon points="61.2,23 61.2,23.5 61.8,23.5 62.3,23.5 62.3,23 61.8,23 			"/>
-		</g>
-		<g>
-			<rect x="80.03" y="22.52" transform="matrix(5.134305e-03 -1 1 5.134305e-03 57.0965 103.0237)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="75.78" y="22.35" transform="matrix(5.134305e-03 -1 1 5.134305e-03 53.0348 98.6083)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="77.92" y="21.84" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.6797 100.2473)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="75.15" y="21.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.8798 97.5249)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="73.4,21.9 73.4,21.4 72.9,21.4 72.9,21.9 72.9,22.5 73.4,22.5 			"/>
-		</g>
-		<g>
-			<rect x="68.53" y="21.74" transform="matrix(5.134305e-03 -1 1 5.134305e-03 46.4396 90.7545)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="77.4" y="21.28" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.7244 99.1622)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="67.91" y="21.27" transform="matrix(5.134305e-03 -1 1 5.134305e-03 46.2849 89.6707)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="79.45" y="20.87" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.1702 100.8023)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="76.68" y="20.71" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.5681 97.8796)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="73.42" y="20.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 52.1523 94.7938)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="68.57" y="20.65" transform="matrix(5.134305e-03 -1 1 5.134305e-03 47.5681 89.7142)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="78.92" y="20.2" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.3146 99.6165)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="76.15" y="20.25" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.5148 96.894)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="73.98" y="20.17" transform="matrix(5.134305e-03 -1 1 5.134305e-03 53.4324 94.6384)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="70.1,20.8 69.6,20.8 69.6,21.3 69,21.3 69,21.9 69.6,21.9 69.6,22.4 70.1,22.4 70.1,21.9 70.1,21.3 70.7,21.3 
-				70.7,20.8 70.7,20.2 70.1,20.2 			"/>
-		</g>
-		<g>
-			<rect x="69.04" y="20.23" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.4527 89.7598)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="67.95" y="20.19" transform="matrix(5.134305e-03 -1 1 5.134305e-03 47.413 88.6307)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="78.4" y="19.74" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.2585 98.6329)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="74.54" y="19.54" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.6153 94.5821)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="70.69" y="19.55" transform="matrix(5.134305e-03 -1 1 5.134305e-03 50.7784 90.7335)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="69.6" y="19.61" transform="matrix(5.134305e-03 -1 1 5.134305e-03 49.6376 89.7032)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="68.51" y="19.66" transform="matrix(5.134305e-03 -1 1 5.134305e-03 48.4975 88.6725)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="77.88" y="19.17" transform="matrix(5.134305e-03 -1 1 5.134305e-03 58.3033 97.5454)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="75.01" y="19.02" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.6008 94.5286)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="70.07" y="19.08" transform="matrix(5.134305e-03 -1 1 5.134305e-03 50.6235 89.6503)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="68.98" y="19.14" transform="matrix(5.134305e-03 -1 1 5.134305e-03 49.4831 88.6196)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="75.67" y="18.5" transform="matrix(5.134305e-03 -1 1 5.134305e-03 56.7848 94.6709)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="70.1,18.6 70.7,18.6 70.7,18 70.1,18 69.6,18 69,18 69,18.6 69.6,18.6 69.6,19.1 70.1,19.1 			"/>
-		</g>
-		<g>
-			<rect x="76.14" y="17.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 57.77 94.6179)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="72.38" y="17.98" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.0291 90.8649)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="71.8,18 71.2,18 71.2,18.6 70.7,18.6 70.7,19.1 71.2,19.1 71.2,19.7 71.8,19.7 71.8,19.1 72.3,19.1 72.4,18.6 
-				71.8,18.6 			"/>
-		</g>
-		<g>
-			<rect x="72.95" y="17.45" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.1161 90.9096)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="71.86" y="17.41" transform="matrix(5.134305e-03 -1 1 5.134305e-03 54.0754 89.7809)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="68.5,17.4 67.9,17.4 67.4,17.4 67.4,18 67.9,18 68.5,18 69,18 69,17.5 			"/>
-		</g>
-		<g>
-			<rect x="73.41" y="16.93" transform="matrix(5.134305e-03 -1 1 5.134305e-03 56.0985 90.8536)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="72.32" y="16.89" transform="matrix(5.134305e-03 -1 1 5.134305e-03 55.0591 89.7247)" width="0.6" height="0.6"/>
-		</g>
-	</g>
-	<g id="furippa_1_">
-		<g>
-			<polygon points="107.3,30.9 107.3,31.5 107.8,31.5 108.4,31.5 108.4,30.9 107.8,30.9 			"/>
-		</g>
-		<g>
-			<rect x="108.43" y="30.34" transform="matrix(5.134305e-03 -1 1 5.134305e-03 77.5309 139.205)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="116.8,29.3 116.8,28.7 116.3,28.7 116.3,28.2 116.3,27.6 115.7,27.6 115.7,27 115.7,26.5 115.2,26.5 114.6,26.5 
-				114.6,27 114.6,27.6 114.6,28.2 115.1,28.2 115.1,28.7 115.1,29.3 115.7,29.3 115.7,29.9 115.7,30.4 116.3,30.4 116.3,31 
-				116.3,31.5 116.8,31.5 117.4,31.5 117.4,31 117.4,30.4 117.4,29.9 116.8,29.9 			"/>
-		</g>
-		<g>
-			<polygon points="108.4,29.3 108.4,28.7 107.8,28.7 107.8,29.3 107.8,29.8 108.4,29.8 			"/>
-		</g>
-		<g>
-			<polygon points="107.3,29.3 107.3,28.7 106.7,28.7 106.7,29.2 106.7,29.8 107.3,29.8 			"/>
-		</g>
-		<g>
-			<polygon points="109,29.3 109,29.8 109,30.4 109.5,30.4 109.5,29.8 109.5,29.3 109.5,28.7 109,28.7 			"/>
-		</g>
-		<g>
-			<polygon points="121.9,28.2 121.3,28.2 120.8,28.2 120.2,28.2 119.6,28.2 119.1,28.2 119.1,28.7 119.1,29.3 119.6,29.3 
-				120.2,29.3 120.8,29.3 121.3,29.3 121.9,29.3 122.4,29.3 122.4,28.8 122.4,28.2 			"/>
-		</g>
-		<g>
-			<polygon points="103.4,28.7 103.4,28.1 103.4,27.5 103.4,27 103.4,26.4 102.8,26.4 102.2,26.4 102.2,27 102.2,27.5 102.2,28.1 
-				102.2,28.7 102.8,28.7 			"/>
-		</g>
-		<g>
-			<polygon points="112.4,26.5 112.3,27 112.3,27.6 111.8,27.6 111.8,28.2 111.8,28.7 111.2,28.7 111.2,29.3 111.2,29.8 110.7,29.8 
-				110.6,30.4 110.6,31 110.6,31.5 111.2,31.5 111.8,31.5 111.8,31 111.8,30.4 112.3,30.4 112.3,29.8 112.3,29.3 112.9,29.3 
-				112.9,28.7 112.9,28.2 113.5,28.2 113.5,27.6 113.5,27 113.5,26.5 112.9,26.5 			"/>
-		</g>
-		<g>
-			<polygon points="104.5,26.4 104.5,27 104.5,27.6 104.5,28.1 104.5,28.7 104.5,29.2 103.9,29.2 103.9,29.8 103.4,29.8 103.3,30.4 
-				102.8,30.4 102.2,30.3 102.2,30.9 102.2,31.5 102.8,31.5 103.3,31.5 103.9,31.5 103.9,30.9 104.5,30.9 104.5,30.4 105,30.4 
-				105,29.8 105.6,29.8 105.6,29.2 105.6,28.7 105.6,28.1 105.6,27.6 105.6,27 105.6,26.4 105.1,26.4 			"/>
-		</g>
-		<g>
-			<polygon points="100,26.4 99.4,26.4 98.9,26.4 98.3,26.4 97.8,26.4 97.2,26.4 96.6,26.4 96.1,26.4 95.5,26.4 95.5,26.9 
-				95.5,27.5 96.1,27.5 96.6,27.5 97.2,27.5 97.8,27.5 98.3,27.5 98.9,27.5 99.4,27.5 100,27.5 100,28.1 100,28.7 99.4,28.6 
-				99.4,29.2 98.9,29.2 98.9,29.8 98.3,29.8 97.7,29.8 97.7,30.3 97.2,30.3 96.6,30.3 96.1,30.3 95.5,30.3 95.5,30.9 95.5,31.4 
-				96,31.4 96.6,31.4 97.2,31.4 97.7,31.4 98.3,31.5 98.3,30.9 98.9,30.9 99.4,30.9 99.4,30.3 100,30.3 100,29.8 100.5,29.8 
-				100.5,29.2 101.1,29.2 101.1,28.7 101.1,28.1 101.1,27.5 101.1,27 101.1,26.4 100.6,26.4 			"/>
-		</g>
-		<g>
-			<path d="M117.4,25.9h-0.6v0.6v0.6v0.6h0.6h0.6h0.6v-0.6v-0.6v-0.6H118H117.4z M118,27.1h-0.6v-0.6h0.6V27.1z"/>
-		</g>
-	</g>
-	<g id="waves_1_">
-		<g>
-			<polygon points="96.2,19.7 96.2,20.3 96.8,20.3 96.8,19.7 96.8,19.1 96.2,19.1 			"/>
-		</g>
-		<g>
-			<polygon points="94,19.7 94,20.3 94.5,20.3 94.5,19.7 94.5,19.1 94,19.1 			"/>
-		</g>
-		<g>
-			<polygon points="98.5,18 98.5,18.6 98.5,19.2 98.5,19.7 98.5,20.3 99,20.3 99,19.7 99,19.2 99,18.6 99,18 			"/>
-		</g>
-		<g>
-			<polygon points="96.2,18 95.7,18 95.7,18.6 95.7,19.1 96.2,19.1 96.2,18.6 			"/>
-		</g>
-		<g>
-			<rect x="93.43" y="18.64" transform="matrix(5.134305e-03 -1 1 5.134305e-03 74.3037 112.5742)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="92.9,18 92.3,18 92.3,18.6 92.9,18.6 93.4,18.6 93.4,18 			"/>
-		</g>
-		<g>
-			<polygon points="98.5,16.9 97.9,16.9 97.9,17.5 97.9,18 98.5,18 98.5,17.5 			"/>
-		</g>
-		<g>
-			<rect x="95.21" y="17.44" transform="matrix(5.134305e-03 -1 1 5.134305e-03 77.2823 113.1613)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<rect x="94.49" y="16.83" transform="matrix(5.134305e-03 -1 1 5.134305e-03 77.1711 111.8337)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="97.9,15.8 97.4,15.8 97.4,16.3 97.4,16.9 97.9,16.9 97.9,16.3 			"/>
-		</g>
-		<g>
-			<polygon points="94,16.3 93.4,16.3 93.4,16.9 94,16.9 94.5,16.9 94.5,16.3 			"/>
-		</g>
-		<g>
-			<polygon points="92.9,15.8 92.3,15.8 92.3,16.3 92.9,16.3 93.4,16.3 93.4,15.8 			"/>
-		</g>
-		<g>
-			<rect x="96.88" y="15.11" transform="matrix(5.134305e-03 -1 1 5.134305e-03 81.2768 112.5089)" width="0.6" height="0.6"/>
-		</g>
-		<g>
-			<polygon points="96.2,14.7 95.7,14.6 95.7,15.2 96.2,15.2 96.8,15.2 96.8,14.7 			"/>
-		</g>
-		<g>
-			<polygon points="95.1,14.1 94.6,14.1 94.6,14.6 95.1,14.6 95.7,14.6 95.7,14.1 			"/>
-		</g>
-		<g>
-			<polygon points="94,13.5 93.4,13.5 92.9,13.5 92.3,13.5 92.3,14.1 92.9,14.1 93.4,14.1 94,14.1 94.6,14.1 94.6,13.5 			"/>
-		</g>
-	</g>
-	<g class="st3">
-		<path class="st4" d="M93.5,71.9c-2.2,0-4.5,0-6.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.7,0-1.8,0-2.5
-			c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7c3.3,0,6.7,0,10.1,0v-0.8h0.8v-0.8C94.7,71.9,93.9,71.9,93.5,71.9z"/>
-		<path class="st4" d="M101,68.6v-0.8h0.8c0-0.7,0-1.8,0-2.5c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8
-			c0-0.4,0-1.3,0-1.7h0.8V68.6z"/>
-		<path class="st4" d="M127.8,67.7h0.8v-0.8h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
-			h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
-			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8C127.8,68.8,127.8,67.7,127.8,67.7z M126.1,67.7h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8v-0.8
-			c2.2,0,4.5,0,6.7,0V67.7z"/>
-		<path class="st4" d="M114.4,67.7h0.8v-0.8h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
-			h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H101c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
-			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8L114.4,67.7L114.4,67.7z M112.7,67.7h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8v-0.8
-			c2.2,0,4.5,0,6.7,0V67.7z"/>
-		<path class="st4" d="M142.1,66.9v-0.8h0.8v-0.8c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H128c0,0.4,0,1.3,0,1.7c3.6,0,7.3,0,10.9,0V73h0.8v-0.8c-3.1,0-6.2,0-9.2,0v-0.8h0.8
-			v-0.8c2.5,0,5.1,0,7.5,0v-0.8h0.8V69c-2.5,0-5.1,0-7.5,0v-0.8h0.8v-0.8C135.9,66.9,139,66.9,142.1,66.9z"/>
-		<path class="st4" d="M85.1,66.9v-0.8h0.8v-0.8c-4.2,0-8.4,0-12.6,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H70c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8
-			c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c2.5,0,5.1,0,7.5,0v-0.8h0.8v-0.8c-2.5,0-5.1,0-7.5,0v-0.8H75v-0.8
-			C78.3,66.9,81.7,66.9,85.1,66.9z"/>
-		<path class="st4" d="M156.3,65.2c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H143c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c1.9,0,3.9,0,5.9,0v0.8h0.8V72
-			h0.8v0.8h0.8v0.8h0.8v0.8h0.8v0.8c0.4,0,1.3,0,1.7,0c0-0.4,0-1.3,0-1.7h-0.8v-0.8h-0.8v-0.8h-0.8v-0.8H153c0-0.4,0-1.3,0-1.7h0.8
-			v-0.8h0.8v-0.8h0.8V67h0.8v-0.8h0.8v-0.8h-0.7L156.3,65.2L156.3,65.2z M153,67.7h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8v-0.8
-			c2.2,0,4.5,0,6.7,0V67.7z"/>
-	</g>
-	<g>
-		<path class="st5" d="M93.2,72c-2.2,0-4.5,0-6.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8c0-0.7,0-1.8,0-2.5
-			c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H84
-			c0,0.4,0,1.3,0,1.7c3.3,0,6.7,0,10,0V73h0.8v-1C94.5,72,93.7,72,93.2,72z"/>
-		<path class="st5" d="M100.8,68.7v-0.8h0.8c0-0.7,0-1.8,0-2.5c-0.4,0-1.3,0-1.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8c0-0.4,0-1.3,0-1.7h0.8
-			c0-0.4,0-1.3,0-1.7h0.8V68.7z"/>
-		<path class="st5" d="M127.6,67.8h0.8V67h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
-			h-0.8c0,0.4,0,1.3,0,1.7H115c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
-			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8v-1.1H127.6z M125.9,67.8h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8V67c2.2,0,4.5,0,6.7,0V67.8z"
-			/>
-		<path class="st5" d="M114.2,67.8h0.8V67h0.8c0-0.4,0-1.3,0-1.7c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7
-			h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
-			c2.8,0,5.6,0,8.4,0v-0.8h0.8v-0.8h0.8C114.2,68.9,114.2,67.8,114.2,67.8z M112.5,67.8h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8V67
-			c2.2,0,4.5,0,6.7,0V67.8z"/>
-		<path class="st5" d="M141.8,67v-0.8h0.8v-0.8c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7c3.6,0,7.3,0,10.9,0v-0.8h0.8V72c-3,0-6.2,0-9.2,0v-0.8h0.8
-			v-0.8c2.5,0,5,0,7.5,0v-0.8h0.8v-0.8c-2.5,0-5,0-7.5,0V68h0.8v-1C135.7,67,138.8,67,141.8,67z"/>
-		<path class="st5" d="M84.9,67v-0.8h0.8v-0.8c-4.2,0-8.4,0-12.6,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8
-			c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H69c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0v-0.8h0.8
-			c0-0.4,0-1.3,0-1.7h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c2.5,0,5,0,7.5,0v-0.8h0.8V69c-2.5,0-5,0-7.5,0v-0.8h0.8V67
-			C78.2,67,81.6,67,84.9,67z"/>
-		<path class="st5" d="M156.1,65.3c-3.9,0-7.8,0-11.7,0c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7h-0.8c0,0.4,0,1.3,0,1.7H142
-			c0,0.4,0,1.3,0,1.7h-1c0,0.4,0,1.3,0,1.7c0.4,0,1.3,0,1.7,0V73h0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8c1.9,0,3.9,0,5.9,0v0.8h0.8V72h0.8
-			v0.8h0.8v0.8h0.8v0.8h0.8v0.8c0.4,0,1.3,0,1.7,0c0-0.4,0-1.3,0-1.7h-0.8v-0.8h-0.8V72h-0.8v-0.8h-0.8c0-0.4,0-1.3,0-1.7h0.8v-0.8
-			h0.8v-0.8h0.8V67h0.8v-0.8h0.8v-0.8h-0.6V65.3z M152.7,67.8h-0.8v0.8c-2.2,0-4.5,0-6.7,0v-0.8h0.8V67c2.2,0,4.5,0,6.7,0V67.8z"/>
-	</g>
-</g>
-</svg>

BIN
non_catalog_apps/gb-pokemon-trading/docs/images/youtube.png


+ 250 - 151
non_catalog_apps/gb-pokemon-trading/pokemon_app.cpp

@@ -1,160 +1,205 @@
 #include "pokemon_app.h"
 #include "pokemon_app.h"
 
 
 struct pokemon_lut pokemon_table[] = {
 struct pokemon_lut pokemon_table[] = {
-    {"Bulbasaur", &I_bulbasaur, 0x99},
-    {"Ivysaur", &I_ivysaur, 0x09},
-    {"Venusaur", &I_venusaur, 0x9A},
-    {"Charmander", &I_charmander, 0xB0},
-    {"Charmeleon", &I_charmeleon, 0xB2},
-    {"Charizard", &I_charizard, 0xB4},
-    {"Squirtle", &I_squirtle, 0xB1},
-    {"Wartortle", &I_wartortle, 0xB3},
-    {"Blastoise", &I_blastoise, 0x1C},
-    {"Caterpie", &I_caterpie, 0x7B},
-    {"Metapod", &I_metapod, 0x7C},
-    {"Butterfree", &I_butterfree, 0x7D},
-    {"Weedle", &I_weedle, 0x70},
-    {"Kakuna", &I_kakuna, 0x71},
-    {"Beedrill", &I_beedrill, 0x72},
-    {"Pidgey", &I_pidgey, 0x24},
-    {"Pidgeotto", &I_pidgeotto, 0x96},
-    {"Pidgeot", &I_pidgeot, 0x97},
-    {"Rattata", &I_rattata, 0xA5},
-    {"Raticate", &I_raticate, 0xA6},
-    {"Spearow", &I_spearow, 0x05},
-    {"Fearow", &I_fearow, 0x23},
-    {"Ekans", &I_ekans, 0x6C},
-    {"Arbok", &I_arbok, 0x2D},
-    {"Pikachu", &I_pikachu, 0x54},
-    {"Raichu", &I_raichu, 0x55},
-    {"Sandshrew", &I_sandshrew, 0x60},
-    {"Sandslash", &I_sandslash, 0x61},
-    {"Nidoran ♀", &I_nidoranf, 0x0F},
-    {"Nidorina", &I_nidorina, 0xA8},
-    {"Nidoqueen", &I_nidoqueen, 0x10},
-    {"Nidoran ♂", &I_nidoranm, 0x03},
-    {"Nidorino", &I_nidorino, 0xA7},
-    {"Nidoking", &I_nidoking, 0x07},
-    {"Clefairy", &I_clefairy, 0x04},
-    {"Clefable", &I_clefable, 0x8E},
-    {"Vulpix", &I_vulpix, 0x52},
-    {"Ninetales", &I_ninetales, 0x53},
-    {"Jigglypuff", &I_jigglypuff, 0x64},
-    {"Wigglytuff", &I_wigglytuff, 0x65},
-    {"Zubat", &I_zubat, 0x6B},
-    {"Golbat", &I_golbat, 0x82},
-    {"Oddish", &I_oddish, 0xB9},
-    {"Gloom", &I_gloom, 0xBA},
-    {"Vileplume", &I_vileplume, 0xBB},
-    {"Paras", &I_paras, 0x6D},
-    {"Parasect", &I_parasect, 0x2E},
-    {"Venonat", &I_venonat, 0x41},
-    {"Venomoth", &I_venomoth, 0x77},
-    {"Diglett", &I_diglett, 0x3B},
-    {"Dugtrio", &I_dugtrio, 0x76},
-    {"Meowth", &I_meowth, 0x4D},
-    {"Persian", &I_persian, 0x90},
-    {"Psyduck", &I_psyduck, 0x2F},
-    {"Golduck", &I_golduck, 0x80},
-    {"Mankey", &I_mankey, 0x39},
-    {"Primeape", &I_primeape, 0x75},
-    {"Growlithe", &I_growlithe, 0x21},
-    {"Arcanine", &I_arcanine, 0x14},
-    {"Poliwag", &I_poliwag, 0x47},
-    {"Poliwhirl", &I_poliwhirl, 0x6E},
-    {"Poliwrath", &I_poliwrath, 0x6F},
-    {"Abra", &I_abra, 0x94},
-    {"Kadabra", &I_kadabra, 0x26},
-    {"Alakazam", &I_alakazam, 0x95},
-    {"Machop", &I_machop, 0x6A},
-    {"Machoke", &I_machoke, 0x29},
-    {"Machamp", &I_machamp, 0x7E},
-    {"Bellsprout", &I_bellsprout, 0xBC},
-    {"Weepinbell", &I_weepinbell, 0xBD},
-    {"Victreebel", &I_victreebel, 0xBE},
-    {"Tentacool", &I_tentacool, 0x18},
-    {"Tentacruel", &I_tentacruel, 0x9B},
-    {"Geodude", &I_geodude, 0xA9},
-    {"Graveler", &I_graveler, 0x27},
-    {"Golem", &I_golem, 0x31},
-    {"Ponyta", &I_ponyta, 0xA3},
-    {"Rapidash", &I_rapidash, 0xA4},
-    {"Slowpoke", &I_slowpoke, 0x25},
-    {"Slowbro", &I_slowbro, 0x08},
-    {"Magnemite", &I_magnemite, 0xAD},
-    {"Magneton", &I_magneton, 0x36},
-    {"Farfetch'd", &I_farfetchd, 0x40},
-    {"Doduo", &I_doduo, 0x46},
-    {"Dodrio", &I_dodrio, 0x74},
-    {"Seel", &I_seel, 0x3A},
-    {"Dewgong", &I_dewgong, 0x78},
-    {"Grimer", &I_grimer, 0x0D},
-    {"Muk", &I_muk, 0x88},
-    {"Shellder", &I_shellder, 0x17},
-    {"Cloyster", &I_cloyster, 0x8B},
-    {"Gastly", &I_gastly, 0x19},
-    {"Haunter", &I_haunter, 0x93},
-    {"Gengar", &I_gengar, 0x0E},
-    {"Onix", &I_onix, 0x22},
-    {"Drowzee", &I_drowzee, 0x30},
-    {"Hypno", &I_hypno, 0x81},
-    {"Krabby", &I_krabby, 0x4E},
-    {"Kingler", &I_kingler, 0x8A},
-    {"Voltorb", &I_voltorb, 0x06},
-    {"Electrode", &I_electrode, 0x8D},
-    {"Exeggcute", &I_exeggcute, 0x0C},
-    {"Exeggutor", &I_exeggutor, 0x0A},
-    {"Cubone", &I_cubone, 0x11},
-    {"Marowak", &I_marowak, 0x91},
-    {"Hitmonlee", &I_hitmonlee, 0x2B},
-    {"Hitmonchan", &I_hitmonchan, 0x2C},
-    {"Lickitung", &I_lickitung, 0x0B},
-    {"Koffing", &I_koffing, 0x37},
-    {"Weezing", &I_weezing, 0x8F},
-    {"Rhyhorn", &I_rhyhorn, 0x12},
-    {"Rhydon", &I_rhydon, 0x01},
-    {"Chansey", &I_chansey, 0x28},
-    {"Tangela", &I_tangela, 0x1E},
-    {"Kangaskhan", &I_kangaskhan, 0x02},
-    {"Horsea", &I_horsea, 0x5C},
-    {"Seadra", &I_seadra, 0x5D},
-    {"Goldeen", &I_goldeen, 0x9D},
-    {"Seaking", &I_seaking, 0x9E},
-    {"Staryu", &I_staryu, 0x1B},
-    {"Starmie", &I_starmie, 0x98},
-    {"Mr. Mime", &I_mr_mime, 0x2A},
-    {"Scyther", &I_scyther, 0x1A},
-    {"Jynx", &I_jynx, 0x48},
-    {"Electabuzz", &I_electabuzz, 0x35},
-    {"Magmar", &I_magmar, 0x33},
-    {"Pinsir", &I_pinsir, 0x1D},
-    {"Tauros", &I_tauros, 0x3C},
-    {"Magikarp", &I_magikarp, 0x85},
-    {"Gyarados", &I_gyarados, 0x16},
-    {"Lapras", &I_lapras, 0x13},
-    {"Ditto", &I_ditto, 0x4C},
-    {"Eevee", &I_eevee, 0x66},
-    {"Vaporeon", &I_vaporeon, 0x69},
-    {"Jolteon", &I_jolteon, 0x68},
-    {"Flareon", &I_flareon, 0x67},
-    {"Porygon", &I_porygon, 0xAA},
-    {"Omanyte", &I_omanyte, 0x62},
-    {"Omastar", &I_omastar, 0x63},
-    {"Kabuto", &I_kabuto, 0x5A},
-    {"Kabutops", &I_kabutops, 0x5B},
-    {"Aerodactyl", &I_aerodactyl, 0xAB},
-    {"Snorlax", &I_snorlax, 0x84},
-    {"Articuno", &I_articuno, 0x4A},
-    {"Zapdos", &I_zapdos, 0x4B},
-    {"Moltres", &I_moltres, 0x49},
-    {"Dratini", &I_dratini, 0x58},
-    {"Dragonair", &I_dragonair, 0x59},
-    {"Dragonite", &I_dragonite, 0x42},
-    {"Mewtwo", &I_mewtwo, 0x83},
-    {"Mew", &I_mew, 0x15},
+    {"Bulbasaur", &I_bulbasaur, 0x99, 0x16, 0x03, 1, 45, 49, 49, 45, 65},
+    {"Ivysaur", &I_ivysaur, 0x09, 0x16, 0x03, 1, 60, 62, 63, 60, 80},
+    {"Venusaur", &I_venusaur, 0x9A, 0x16, 0x03, 1, 80, 82, 83, 80, 100},
+    {"Charmander", &I_charmander, 0xB0, 0x14, 0xFF, 1, 39, 52, 43, 65, 50},
+    {"Charmeleon", &I_charmeleon, 0xB2, 0x14, 0xFF, 1, 58, 64, 58, 80, 65},
+    {"Charizard", &I_charizard, 0xB4, 0x14, 0x02, 1, 78, 84, 78, 100, 85},
+    {"Squirtle", &I_squirtle, 0xB1, 0x15, 0xFF, 1, 44, 48, 65, 43, 50},
+    {"Wartortle", &I_wartortle, 0xB3, 0x15, 0xFF, 1, 59, 63, 80, 58, 65},
+    {"Blastoise", &I_blastoise, 0x1C, 0x15, 0xFF, 1, 79, 83, 100, 78, 85},
+    {"Caterpie", &I_caterpie, 0x7B, 0x07, 0xFF, 2, 45, 30, 35, 45, 20},
+    {"Metapod", &I_metapod, 0x7C, 0x07, 0xFF, 2, 50, 20, 55, 30, 25},
+    {"Butterfree", &I_butterfree, 0x7D, 0x07, 0x02, 2, 60, 45, 50, 70, 80},
+    {"Weedle", &I_weedle, 0x70, 0x07, 0x03, 2, 40, 35, 30, 50, 20},
+    {"Kakuna", &I_kakuna, 0x71, 0x07, 0x03, 2, 45, 25, 50, 35, 25},
+    {"Beedrill", &I_beedrill, 0x72, 0x07, 0x03, 2, 65, 80, 40, 75, 45},
+    {"Pidgey", &I_pidgey, 0x24, 0x00, 0x02, 1, 40, 45, 40, 56, 35},
+    {"Pidgeotto", &I_pidgeotto, 0x96, 0x00, 0x02, 1, 63, 60, 55, 71, 50},
+    {"Pidgeot", &I_pidgeot, 0x97, 0x00, 0x02, 1, 83, 80, 75, 91, 70},
+    {"Rattata", &I_rattata, 0xA5, 0x00, 0xFF, 2, 30, 56, 35, 72, 25},
+    {"Raticate", &I_raticate, 0xA6, 0x00, 0xFF, 2, 55, 81, 60, 97, 50},
+    {"Spearow", &I_spearow, 0x05, 0x00, 0x02, 2, 40, 60, 30, 70, 31},
+    {"Fearow", &I_fearow, 0x23, 0x00, 0x02, 2, 65, 90, 65, 100, 61},
+    {"Ekans", &I_ekans, 0x6C, 0x03, 0xFF, 2, 35, 60, 44, 55, 40},
+    {"Arbok", &I_arbok, 0x2D, 0x03, 0xFF, 2, 60, 85, 69, 80, 65},
+    {"Pikachu", &I_pikachu, 0x54, 0x17, 0xFF, 2, 35, 55, 30, 90, 50},
+    {"Raichu", &I_raichu, 0x55, 0x17, 0xFF, 2, 60, 90, 55, 100, 90},
+    {"Sandshrew", &I_sandshrew, 0x60, 0x04, 0xFF, 2, 50, 75, 85, 40, 30},
+    {"Sandslash", &I_sandslash, 0x61, 0x04, 0xFF, 2, 75, 100, 110, 65, 55},
+    {"Nidoran@", &I_nidoranf, 0x0F, 0x03, 0xFF, 1, 55, 47, 52, 41, 40},
+    {"Nidorina", &I_nidorina, 0xA8, 0x03, 0xFF, 1, 70, 62, 67, 56, 55},
+    {"Nidoqueen", &I_nidoqueen, 0x10, 0x03, 0x04, 1, 90, 82, 87, 76, 75},
+    {"Nidoran!", &I_nidoranm, 0x03, 0x03, 0xFF, 1, 46, 57, 40, 50, 40},
+    {"Nidorino", &I_nidorino, 0xA7, 0x03, 0xFF, 1, 61, 72, 57, 65, 55},
+    {"Nidoking", &I_nidoking, 0x07, 0x03, 0x04, 1, 81, 92, 77, 85, 75},
+    {"Clefairy", &I_clefairy, 0x04, 0x00, 0xFF, 3, 70, 45, 48, 35, 60},
+    {"Clefable", &I_clefable, 0x8E, 0x00, 0xFF, 3, 95, 70, 73, 60, 85},
+    {"Vulpix", &I_vulpix, 0x52, 0x14, 0xFF, 2, 38, 41, 40, 65, 65},
+    {"Ninetales", &I_ninetales, 0x53, 0x14, 0xFF, 2, 73, 76, 75, 100, 100},
+    {"Jigglypuff", &I_jigglypuff, 0x64, 0x00, 0xFF, 3, 115, 45, 20, 20, 25},
+    {"Wigglytuff", &I_wigglytuff, 0x65, 0x00, 0xFF, 3, 140, 70, 45, 45, 50},
+    {"Zubat", &I_zubat, 0x6B, 0x03, 0x02, 2, 40, 45, 35, 55, 40},
+    {"Golbat", &I_golbat, 0x82, 0x03, 0x02, 2, 75, 80, 70, 90, 75},
+    {"Oddish", &I_oddish, 0xB9, 0x16, 0x03, 1, 45, 50, 55, 30, 75},
+    {"Gloom", &I_gloom, 0xBA, 0x16, 0x03, 1, 60, 65, 70, 40, 85},
+    {"Vileplume", &I_vileplume, 0xBB, 0x16, 0x03, 1, 75, 80, 85, 50, 100},
+    {"Paras", &I_paras, 0x6D, 0x07, 0x16, 2, 35, 70, 55, 25, 55},
+    {"Parasect", &I_parasect, 0x2E, 0x07, 0x16, 2, 60, 95, 80, 30, 80},
+    {"Venonat", &I_venonat, 0x41, 0x07, 0x03, 2, 60, 55, 50, 45, 40},
+    {"Venomoth", &I_venomoth, 0x77, 0x07, 0x03, 2, 70, 65, 60, 90, 90},
+    {"Diglett", &I_diglett, 0x3B, 0x04, 0xFF, 2, 10, 55, 25, 95, 45},
+    {"Dugtrio", &I_dugtrio, 0x76, 0x04, 0xFF, 2, 35, 80, 50, 120, 70},
+    {"Meowth", &I_meowth, 0x4D, 0x00, 0xFF, 2, 40, 45, 35, 90, 40},
+    {"Persian", &I_persian, 0x90, 0x00, 0xFF, 2, 65, 70, 60, 115, 65},
+    {"Psyduck", &I_psyduck, 0x2F, 0x15, 0xFF, 2, 50, 52, 48, 55, 50},
+    {"Golduck", &I_golduck, 0x80, 0x15, 0xFF, 2, 80, 82, 78, 85, 80},
+    {"Mankey", &I_mankey, 0x39, 0x01, 0xFF, 2, 40, 80, 35, 70, 35},
+    {"Primeape", &I_primeape, 0x75, 0x01, 0xFF, 2, 65, 105, 60, 95, 60},
+    {"Growlithe", &I_growlithe, 0x21, 0x14, 0xFF, 0, 55, 70, 45, 60, 50},
+    {"Arcanine", &I_arcanine, 0x14, 0x14, 0xFF, 0, 90, 110, 80, 95, 80},
+    {"Poliwag", &I_poliwag, 0x47, 0x15, 0xFF, 1, 40, 50, 40, 90, 40},
+    {"Poliwhirl", &I_poliwhirl, 0x6E, 0x15, 0xFF, 1, 65, 65, 65, 90, 50},
+    {"Poliwrath", &I_poliwrath, 0x6F, 0x15, 0x01, 1, 90, 85, 95, 70, 70},
+    {"Abra", &I_abra, 0x94, 0x18, 0xFF, 1, 25, 20, 15, 90, 105},
+    {"Kadabra", &I_kadabra, 0x26, 0x18, 0xFF, 1, 40, 35, 30, 105, 120},
+    {"Alakazam", &I_alakazam, 0x95, 0x18, 0xFF, 1, 55, 50, 45, 120, 135},
+    {"Machop", &I_machop, 0x6A, 0x01, 0xFF, 1, 70, 80, 50, 35, 35},
+    {"Machoke", &I_machoke, 0x29, 0x01, 0xFF, 1, 80, 100, 70, 45, 50},
+    {"Machamp", &I_machamp, 0x7E, 0x01, 0xFF, 1, 90, 130, 80, 55, 65},
+    {"Bellsprout", &I_bellsprout, 0xBC, 0x16, 0x03, 1, 50, 75, 35, 40, 70},
+    {"Weepinbell", &I_weepinbell, 0xBD, 0x16, 0x03, 1, 65, 90, 50, 55, 85},
+    {"Victreebel", &I_victreebel, 0xBE, 0x16, 0x03, 1, 80, 105, 65, 70, 100},
+    {"Tentacool", &I_tentacool, 0x18, 0x15, 0x03, 0, 40, 40, 35, 70, 100},
+    {"Tentacruel", &I_tentacruel, 0x9B, 0x15, 0x03, 0, 80, 70, 65, 100, 120},
+    {"Geodude", &I_geodude, 0xA9, 0x05, 0x04, 1, 40, 80, 100, 20, 30},
+    {"Graveler", &I_graveler, 0x27, 0x05, 0x04, 1, 55, 95, 115, 35, 45},
+    {"Golem", &I_golem, 0x31, 0x05, 0x04, 1, 80, 110, 130, 45, 55},
+    {"Ponyta", &I_ponyta, 0xA3, 0x14, 0xFF, 2, 50, 85, 55, 90, 65},
+    {"Rapidash", &I_rapidash, 0xA4, 0x14, 0xFF, 2, 65, 100, 70, 105, 80},
+    {"Slowpoke", &I_slowpoke, 0x25, 0x15, 0x18, 2, 90, 65, 65, 15, 40},
+    {"Slowbro", &I_slowbro, 0x08, 0x15, 0x18, 2, 95, 75, 110, 30, 80},
+    {"Magnemite", &I_magnemite, 0xAD, 0x17, 0xFF, 2, 25, 35, 70, 45, 95},
+    {"Magneton", &I_magneton, 0x36, 0x17, 0xFF, 2, 50, 60, 95, 70, 120},
+    {"Farfetch'd", &I_farfetchd, 0x40, 0x00, 0x02, 2, 52, 65, 55, 60, 58},
+    {"Doduo", &I_doduo, 0x46, 0x00, 0x02, 2, 35, 85, 45, 75, 35},
+    {"Dodrio", &I_dodrio, 0x74, 0x00, 0x02, 2, 60, 110, 70, 100, 60},
+    {"Seel", &I_seel, 0x3A, 0x15, 0xFF, 2, 65, 45, 55, 45, 70},
+    {"Dewgong", &I_dewgong, 0x78, 0x15, 0x19, 2, 90, 70, 80, 70, 95},
+    {"Grimer", &I_grimer, 0x0D, 0x03, 0xFF, 2, 80, 80, 50, 25, 40},
+    {"Muk", &I_muk, 0x88, 0x03, 0xFF, 2, 105, 105, 75, 50, 65},
+    {"Shellder", &I_shellder, 0x17, 0x15, 0xFF, 0, 30, 65, 100, 40, 45},
+    {"Cloyster", &I_cloyster, 0x8B, 0x15, 0x19, 0, 50, 95, 180, 70, 85},
+    {"Gastly", &I_gastly, 0x19, 0x08, 0x03, 1, 30, 35, 30, 80, 100},
+    {"Haunter", &I_haunter, 0x93, 0x08, 0x03, 1, 45, 50, 45, 95, 115},
+    {"Gengar", &I_gengar, 0x0E, 0x08, 0x03, 1, 60, 65, 60, 110, 130},
+    {"Onix", &I_onix, 0x22, 0x05, 0x04, 2, 35, 45, 160, 70, 30},
+    {"Drowzee", &I_drowzee, 0x30, 0x18, 0xFF, 2, 60, 48, 45, 42, 90},
+    {"Hypno", &I_hypno, 0x81, 0x18, 0xFF, 2, 85, 73, 70, 67, 115},
+    {"Krabby", &I_krabby, 0x4E, 0x15, 0xFF, 2, 30, 105, 90, 50, 25},
+    {"Kingler", &I_kingler, 0x8A, 0x15, 0xFF, 2, 55, 130, 115, 75, 50},
+    {"Voltorb", &I_voltorb, 0x06, 0x17, 0xFF, 2, 40, 30, 50, 100, 55},
+    {"Electrode", &I_electrode, 0x8D, 0x17, 0xFF, 2, 60, 50, 70, 140, 80},
+    {"Exeggcute", &I_exeggcute, 0x0C, 0x16, 0x18, 0, 60, 40, 80, 40, 60},
+    {"Exeggutor", &I_exeggutor, 0x0A, 0x16, 0x18, 0, 95, 95, 85, 55, 125},
+    {"Cubone", &I_cubone, 0x11, 0x04, 0xFF, 2, 50, 50, 95, 35, 40},
+    {"Marowak", &I_marowak, 0x91, 0x04, 0xFF, 2, 60, 80, 110, 45, 50},
+    {"Hitmonlee", &I_hitmonlee, 0x2B, 0x01, 0xFF, 2, 50, 120, 53, 87, 35},
+    {"Hitmonchan", &I_hitmonchan, 0x2C, 0x01, 0xFF, 2, 50, 105, 79, 76, 35},
+    {"Lickitung", &I_lickitung, 0x0B, 0x00, 0xFF, 2, 90, 55, 75, 30, 60},
+    {"Koffing", &I_koffing, 0x37, 0x03, 0xFF, 2, 40, 65, 95, 35, 60},
+    {"Weezing", &I_weezing, 0x8F, 0x03, 0xFF, 2, 65, 90, 120, 60, 85},
+    {"Rhyhorn", &I_rhyhorn, 0x12, 0x04, 0x05, 0, 80, 85, 95, 25, 30},
+    {"Rhydon", &I_rhydon, 0x01, 0x04, 0x05, 0, 105, 130, 120, 40, 45},
+    {"Chansey", &I_chansey, 0x28, 0x00, 0xFF, 3, 250, 5, 5, 50, 105},
+    {"Tangela", &I_tangela, 0x1E, 0x16, 0xFF, 2, 65, 55, 115, 60, 100},
+    {"Kangaskhan", &I_kangaskhan, 0x02, 0x00, 0xFF, 2, 105, 95, 80, 90, 40},
+    {"Horsea", &I_horsea, 0x5C, 0x15, 0xFF, 2, 30, 40, 70, 60, 70},
+    {"Seadra", &I_seadra, 0x5D, 0x15, 0xFF, 2, 55, 65, 95, 85, 95},
+    {"Goldeen", &I_goldeen, 0x9D, 0x15, 0xFF, 2, 45, 67, 60, 63, 50},
+    {"Seaking", &I_seaking, 0x9E, 0x15, 0xFF, 2, 80, 92, 65, 68, 80},
+    {"Staryu", &I_staryu, 0x1B, 0x15, 0xFF, 0, 30, 45, 55, 85, 70},
+    {"Starmie", &I_starmie, 0x98, 0x15, 0x18, 0, 60, 75, 85, 115, 100},
+    {"Mr. Mime", &I_mr_mime, 0x2A, 0x18, 0xFF, 2, 40, 45, 65, 90, 100},
+    {"Scyther", &I_scyther, 0x1A, 0x07, 0x02, 2, 70, 110, 80, 105, 55},
+    {"Jynx", &I_jynx, 0x48, 0x19, 0x18, 2, 65, 50, 35, 95, 95},
+    {"Electabuzz", &I_electabuzz, 0x35, 0x17, 0xFF, 2, 65, 83, 57, 105, 85},
+    {"Magmar", &I_magmar, 0x33, 0x14, 0xFF, 2, 65, 95, 57, 93, 85},
+    {"Pinsir", &I_pinsir, 0x1D, 0x07, 0xFF, 0, 65, 125, 100, 85, 55},
+    {"Tauros", &I_tauros, 0x3C, 0x00, 0xFF, 0, 75, 100, 95, 110, 70},
+    {"Magikarp", &I_magikarp, 0x85, 0x15, 0xFF, 0, 20, 10, 55, 80, 20},
+    {"Gyarados", &I_gyarados, 0x16, 0x15, 0x02, 0, 95, 125, 79, 81, 100},
+    {"Lapras", &I_lapras, 0x13, 0x15, 0x19, 0, 130, 85, 80, 60, 95},
+    {"Ditto", &I_ditto, 0x4C, 0x00, 0xFF, 2, 48, 48, 48, 48, 48},
+    {"Eevee", &I_eevee, 0x66, 0x00, 0xFF, 2, 55, 55, 50, 55, 65},
+    {"Vaporeon", &I_vaporeon, 0x69, 0x15, 0xFF, 2, 130, 65, 60, 65, 110},
+    {"Jolteon", &I_jolteon, 0x68, 0x17, 0xFF, 2, 65, 65, 60, 130, 110},
+    {"Flareon", &I_flareon, 0x67, 0x14, 0xFF, 2, 65, 130, 60, 65, 110},
+    {"Porygon", &I_porygon, 0xAA, 0x00, 0xFF, 2, 65, 60, 70, 40, 75},
+    {"Omanyte", &I_omanyte, 0x62, 0x05, 0x15, 2, 35, 40, 100, 35, 90},
+    {"Omastar", &I_omastar, 0x63, 0x05, 0x15, 2, 70, 60, 125, 55, 115},
+    {"Kabuto", &I_kabuto, 0x5A, 0x05, 0x15, 2, 30, 80, 90, 55, 45},
+    {"Kabutops", &I_kabutops, 0x5B, 0x05, 0x15, 2, 60, 115, 105, 80, 70},
+    {"Aerodactyl", &I_aerodactyl, 0xAB, 0x05, 0x02, 0, 80, 105, 65, 130, 60},
+    {"Snorlax", &I_snorlax, 0x84, 0x00, 0xFF, 0, 160, 110, 65, 30, 65},
+    {"Articuno", &I_articuno, 0x4A, 0x19, 0x02, 0, 90, 85, 100, 85, 125},
+    {"Zapdos", &I_zapdos, 0x4B, 0x17, 0x02, 0, 90, 90, 85, 100, 125},
+    {"Moltres", &I_moltres, 0x49, 0x14, 0x02, 0, 90, 100, 90, 90, 125},
+    {"Dratini", &I_dratini, 0x58, 0x1A, 0xFF, 0, 41, 64, 45, 50, 50},
+    {"Dragonair", &I_dragonair, 0x59, 0x1A, 0xFF, 0, 61, 84, 65, 70, 70},
+    {"Dragonite", &I_dragonite, 0x42, 0x1A, 0x02, 0, 91, 134, 95, 80, 100},
+    {"Mewtwo", &I_mewtwo, 0x83, 0x18, 0xFF, 0, 106, 110, 90, 130, 154},
+    {"Mew", &I_mew, 0x15, 0x18, 0xFF, 1, 100, 100, 100, 100, 100},
     {},
     {},
 };
 };
 
 
+struct pokemon_mv move_table[] = {
+    {"No Move", 0x00},      {"Absorb", 0x47},       {"Acid Armor", 0x97},   {"Acid", 0x33},
+    {"Agility", 0x61},      {"Amnesia", 0x85},      {"Aurora Beam", 0x3E},  {"Barrage", 0x8C},
+    {"Barrier", 0x70},      {"Bide", 0x75},         {"Bind", 0x14},         {"Bite", 0x2C},
+    {"Blizzard", 0x3B},     {"Body Slam", 0x22},    {"Bone Club", 0x7D},    {"Boomerang", 0x9B},
+    {"Bubblebeam", 0x3D},   {"Bubble", 0x91},       {"Clamp", 0x80},        {"Comet Punch", 0x04},
+    {"Confuse Ray", 0x6D},  {"Confusion", 0x5D},    {"Constrict", 0x84},    {"Conversion", 0xA0},
+    {"Counter", 0x44},      {"Crabhammer", 0x98},   {"Cut", 0x0F},          {"Defense Curl", 0x6F},
+    {"Dig", 0x5B},          {"Disable", 0x32},      {"Dizzy Punch", 0x92},  {"Doubleslap", 0x03},
+    {"Double Kick", 0x18},  {"Double Team", 0x68},  {"Double-Edge", 0x26},  {"Dragon Rage", 0x52},
+    {"Dream Eater", 0x8A},  {"Drill Peck", 0x41},   {"Earthquake", 0x59},   {"Egg Bomb", 0x79},
+    {"Ember", 0x34},        {"Explosion", 0x99},    {"Fire Blast", 0x7E},   {"Fire Punch", 0x07},
+    {"Fire Spin", 0x53},    {"Fissure", 0x5A},      {"Flamethrower", 0x35}, {"Flash", 0x94},
+    {"Fly", 0x13},          {"Focus Energy", 0x74}, {"Fury Attack", 0x1F},  {"Fury Swipes", 0x9A},
+    {"Glare", 0x89},        {"Growl", 0x2D},        {"Growth", 0x4A},       {"Guillotine", 0x0C},
+    {"Gust", 0x10},         {"Harden", 0x6A},       {"Haze", 0x72},         {"Headbutt", 0x1D},
+    {"Hi Jump Kick", 0x88}, {"Horn Attack", 0x1E},  {"Horn Drill", 0x20},   {"Hydro Pump", 0x38},
+    {"Hyper Beam", 0x3F},   {"Hyper Fang", 0x9E},   {"Hypnosis", 0x5F},     {"Ice Beam", 0x3A},
+    {"Ice Punch", 0x08},    {"Jump Kick", 0x1A},    {"Karate Chop", 0x02},  {"Kinesis", 0x86},
+    {"Leech Life", 0x8D},   {"Leech Seed", 0x49},   {"Leer", 0x2B},         {"Lick", 0x7A},
+    {"Light Screen", 0x71}, {"Lovely Kiss", 0x8E},  {"Low Kick", 0x43},     {"Meditate", 0x60},
+    {"Mega Drain", 0x48},   {"Mega Kick", 0x19},    {"Mega Punch", 0x05},   {"Metronome", 0x76},
+    {"Mimic", 0x66},        {"Minimize", 0x6B},     {"Mirror Move", 0x77},  {"Mist", 0x36},
+    {"Night Shade", 0x65},  {"Pay Day", 0x06},      {"Peck", 0x40},         {"Petal Dance", 0x50},
+    {"Pin Missile", 0x2A},  {"Poisonpowder", 0x4D}, {"Poison Gas", 0x8B},   {"Poison Sting", 0x28},
+    {"Pound", 0x01},        {"Psybeam", 0x3C},      {"Psychic", 0x5E},      {"Psywave", 0x95},
+    {"Quick Attack", 0x62}, {"Rage", 0x63},         {"Razor Leaf", 0x4B},   {"Razor Wind", 0x0D},
+    {"Recover", 0x69},      {"Reflect", 0x73},      {"Rest", 0x9C},         {"Roar", 0x2E},
+    {"Rock Slide", 0x9D},   {"Rock Throw", 0x58},   {"Rolling Kick", 0x1B}, {"Sand Attack", 0x1C},
+    {"Scratch", 0x0A},      {"Screech", 0x67},      {"Seismic Toss", 0x45}, {"Selfdestruct", 0x78},
+    {"Sharpen", 0x9F},      {"Sing", 0x2F},         {"Skull Bash", 0x82},   {"Sky Attack", 0x8F},
+    {"Slam", 0x15},         {"Slash", 0xA3},        {"Sleep Powder", 0x4F}, {"Sludge", 0x7C},
+    {"Smog", 0x7B},         {"Smokescreen", 0x6C},  {"Softboiled", 0x87},   {"Solar Beam", 0x4C},
+    {"Sonicboom", 0x31},    {"Spike Cannon", 0x83}, {"Splash", 0x96},       {"Spore", 0x93},
+    {"Stomp", 0x17},        {"Strength", 0x46},     {"String Shot", 0x51},  {"Struggle", 0xA5},
+    {"Stun Spore", 0x4E},   {"Submission", 0x42},   {"Substitute", 0xA4},   {"Supersonic", 0x30},
+    {"Super Fang", 0xA2},   {"Surf", 0x39},         {"Swift", 0x81},        {"Swords Dance", 0x0E},
+    {"Tackle", 0x21},       {"Tail Whip", 0x27},    {"Take Down", 0x24},    {"Teleport", 0x64},
+    {"Thrash", 0x25},       {"Thunderbolt", 0x55},  {"Thunderpunch", 0x09}, {"Thundershock", 0x54},
+    {"Thunder Wave", 0x56}, {"Thunder", 0x57},      {"Toxic", 0x5C},        {"Transform", 0x90},
+    {"Tri Attack", 0xA1},   {"Twineedle", 0x29},    {"Vicegrip", 0x0B},     {"Vine Whip", 0x16},
+    {"Waterfall", 0x7F},    {"Water Gun", 0x37},    {"Whirlwind", 0x12},    {"Wing Attack", 0x11},
+    {"Withdraw", 0x6E},     {"Wrap", 0x23},
+};
+
 uint32_t pokemon_exit_confirm_view(void* context) {
 uint32_t pokemon_exit_confirm_view(void* context) {
     UNUSED(context);
     UNUSED(context);
     return AppViewExitConfirm;
     return AppViewExitConfirm;
@@ -179,6 +224,48 @@ App* pokemon_alloc() {
     view_dispatcher_add_view(
     view_dispatcher_add_view(
         app->view_dispatcher, AppViewSelectPokemon, select_pokemon_get_view(app));
         app->view_dispatcher, AppViewSelectPokemon, select_pokemon_get_view(app));
 
 
+    //  Start Index first level
+    app->current_level = 3;
+    // Select Level View
+    app->select_level = select_level_alloc(app);
+    view_set_previous_callback(select_level_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectLevel, select_level_get_view(app));
+
+    //  Start Index first stat
+    app->current_stats = 0;
+    // Select Level View
+    app->select_stats = select_stats_alloc(app);
+    view_set_previous_callback(select_stats_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectStats, select_stats_get_view(app));
+
+    //  Start Index first move
+    app->current_move = 0;
+    // Select Move View
+    app->select_move1 = select_move1_alloc(app);
+    view_set_previous_callback(select_move1_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectMove1, select_move1_get_view(app));
+
+    //  Start Index first move
+    app->current_move = 0;
+    // Select Move View
+    app->select_move2 = select_move2_alloc(app);
+    view_set_previous_callback(select_move1_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectMove2, select_move2_get_view(app));
+
+    //  Start Index first move
+    app->current_move = 0;
+    // Select Move View
+    app->select_move3 = select_move3_alloc(app);
+    view_set_previous_callback(select_move3_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectMove3, select_move3_get_view(app));
+
+    //  Start Index first move
+    app->current_move = 0;
+    // Select Move View
+    app->select_move4 = select_move4_alloc(app);
+    view_set_previous_callback(select_move4_get_view(app), pokemon_exit_confirm_view);
+    view_dispatcher_add_view(app->view_dispatcher, AppViewSelectMove4, select_move4_get_view(app));
+
     // Trade View
     // Trade View
     app->trade = trade_alloc(app);
     app->trade = trade_alloc(app);
     view_set_previous_callback(trade_get_view(app), pokemon_exit_confirm_view);
     view_set_previous_callback(trade_get_view(app), pokemon_exit_confirm_view);
@@ -195,6 +282,18 @@ void free_app(App* app) {
     // Free views
     // Free views
     view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectPokemon);
     view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectPokemon);
     select_pokemon_free(app);
     select_pokemon_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectLevel);
+    select_level_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectStats);
+    select_stats_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectMove1);
+    select_move1_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectMove2);
+    select_move2_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectMove3);
+    select_move3_free(app);
+    view_dispatcher_remove_view(app->view_dispatcher, AppViewSelectMove4);
+    select_move4_free(app);
     view_dispatcher_remove_view(app->view_dispatcher, AppViewTrade);
     view_dispatcher_remove_view(app->view_dispatcher, AppViewTrade);
     trade_free(app);
     trade_free(app);
     // Close records
     // Close records

+ 46 - 0
non_catalog_apps/gb-pokemon-trading/pokemon_app.h

@@ -11,6 +11,12 @@
 #include <pokemon_icons.h>
 #include <pokemon_icons.h>
 
 
 #include "views/select_pokemon.hpp"
 #include "views/select_pokemon.hpp"
+#include "views/select_level.hpp"
+#include "views/select_stats.hpp"
+#include "views/select_move1.hpp"
+#include "views/select_move2.hpp"
+#include "views/select_move3.hpp"
+#include "views/select_move4.hpp"
 #include "views/trade.hpp"
 #include "views/trade.hpp"
 
 
 #define TAG "Pokemon"
 #define TAG "Pokemon"
@@ -19,6 +25,19 @@ struct pokemon_lut {
     const char* name;
     const char* name;
     const Icon* icon;
     const Icon* icon;
     const uint8_t hex;
     const uint8_t hex;
+    const uint8_t type1;
+    const uint8_t type2;
+    const int xp_group;
+    const int base_hp;
+    const int base_atk;
+    const int base_def;
+    const int base_spd;
+    const int base_special;
+};
+
+struct pokemon_mv {
+    const char* name;
+    const uint8_t hex;
 };
 };
 
 
 typedef struct App App;
 typedef struct App App;
@@ -36,15 +55,34 @@ struct App {
     Gui* gui;
     Gui* gui;
     ViewDispatcher* view_dispatcher;
     ViewDispatcher* view_dispatcher;
     SelectPokemon* select_pokemon;
     SelectPokemon* select_pokemon;
+    SelectLevel* select_level;
+    SelectStats* select_stats;
+    SelectMove1* select_move1;
+    SelectMove2* select_move2;
+    SelectMove3* select_move3;
+    SelectMove4* select_move4;
     Trade* trade;
     Trade* trade;
     uint32_t view_id;
     uint32_t view_id;
 
 
     int current_pokemon = 0;
     int current_pokemon = 0;
+    int current_level = 3;
+    int current_stats = 0;
+    int current_move = 0;
     char pokemon_hex_code = ' ';
     char pokemon_hex_code = ' ';
+    char move1_hex_code = ' ';
+    char move2_hex_code = ' ';
+    char move3_hex_code = ' ';
+    char move4_hex_code = ' ';
 };
 };
 
 
 typedef enum {
 typedef enum {
     AppViewSelectPokemon,
     AppViewSelectPokemon,
+    AppViewSelectLevel,
+    AppViewSelectStats,
+    AppViewSelectMove1,
+    AppViewSelectMove2,
+    AppViewSelectMove3,
+    AppViewSelectMove4,
     AppViewTrade,
     AppViewTrade,
     AppViewExitConfirm,
     AppViewExitConfirm,
 } AppView;
 } AppView;
@@ -52,7 +90,14 @@ typedef enum {
 typedef void (*SelectPokemonCallback)(void* context, uint32_t index);
 typedef void (*SelectPokemonCallback)(void* context, uint32_t index);
 typedef struct SelectPokemonModel {
 typedef struct SelectPokemonModel {
     int current_pokemon = 0;
     int current_pokemon = 0;
+    int current_level = 3;
+    int current_stats = 0;
+    int current_move = 0;
     char pokemon_hex_code = ' ';
     char pokemon_hex_code = ' ';
+    char move1_hex_code = ' ';
+    char move2_hex_code = ' ';
+    char move3_hex_code = ' ';
+    char move4_hex_code = ' ';
     bool trading = false;
     bool trading = false;
     bool connected = false;
     bool connected = false;
     render_gameboy_state_t gameboy_status = GAMEBOY_INITIAL;
     render_gameboy_state_t gameboy_status = GAMEBOY_INITIAL;
@@ -61,5 +106,6 @@ typedef struct SelectPokemonModel {
 } SelectPokemonModel;
 } SelectPokemonModel;
 
 
 extern struct pokemon_lut pokemon_table[];
 extern struct pokemon_lut pokemon_table[];
+extern struct pokemon_mv move_table[];
 
 
 #endif /* POKEMON_APP_H */
 #endif /* POKEMON_APP_H */

+ 13 - 14
non_catalog_apps/gb-pokemon-trading/pokemon_data.h

@@ -143,7 +143,7 @@ struct __attribute__((__packed__)) trade_data_block {
 };
 };
 
 
 struct trade_data_block DATA_BLOCK2 =
 struct trade_data_block DATA_BLOCK2 =
-    {.trainer_name = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00, 0x00},
+    {.trainer_name = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_},
      .party_cnt = 1,
      .party_cnt = 1,
      .party_members = {0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
      .party_members = {0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
      .party =
      .party =
@@ -281,23 +281,22 @@ struct trade_data_block DATA_BLOCK2 =
               .spd = 0x9800,
               .spd = 0x9800,
               .special = 0x9900},
               .special = 0x9900},
          },
          },
-     /* NOTE: I think this shouldn't exceed 7 chars */
      .ot_name =
      .ot_name =
          {
          {
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+             {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
          },
          },
      .nickname = {
      .nickname = {
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
-         {.str = {F_, l_, o_, p_, p_, e_, r_, TERM_, 0x00, 0x00}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
+         {.str = {F_, l_, i_, p_, p_, e_, r_, TERM_, TERM_, TERM_, TERM_}},
      }};
      }};
 
 
 unsigned char INPUT_BLOCK[405];
 unsigned char INPUT_BLOCK[405];

+ 170 - 0
non_catalog_apps/gb-pokemon-trading/views/select_level.cpp

@@ -0,0 +1,170 @@
+#include "../pokemon_app.h"
+#include "select_level.hpp"
+
+static void select_level_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_level;
+
+    char level_num[5];
+
+    snprintf(level_num, sizeof(level_num), "#%03d", current_index);
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(
+        canvas, 55, 54 / 2, AlignLeft, AlignTop, "Level:");
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, level_num);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Level");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_level_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectLevel* select_level = (SelectLevel*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_level->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_level->app->current_level = model->current_level;
+            },
+            false);
+        
+        view_dispatcher_switch_to_view(select_level->app->view_dispatcher, AppViewSelectStats);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_level->app->view_dispatcher, AppViewSelectPokemon);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_level->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_level == 3) {
+                    model->current_level = 100;
+                } else {
+                    model->current_level--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_level->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_level >= 10) {
+                    model->current_level -= 10;
+                } else {
+                    model->current_level = 100;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_level->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_level == 100) {
+                    model->current_level = 3;
+                } else {
+                    model->current_level++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_level->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_level <= 90) {
+                    model->current_level += 10;
+                } else {
+                    model->current_level = 3;
+                    ;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_level_enter_callback(void* context) {
+    furi_assert(context);
+    SelectLevel* select_level = (SelectLevel*)context;
+    with_view_model_cpp(
+        select_level->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_level->app->current_pokemon;
+            model->pokemon_hex_code = select_level->app->pokemon_hex_code;
+            model->current_level = select_level->app->current_level;
+        },
+        true);
+}
+
+bool select_level_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectLevel* select_level = (SelectLevel*)context;
+    view_dispatcher_send_custom_event(select_level->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_level_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectLevel* select_level_alloc(App* app) {
+    SelectLevel* select_level = (SelectLevel*)malloc(sizeof(SelectLevel));
+    select_level->app = app;
+    select_level->view = view_alloc();
+    view_set_context(select_level->view, select_level);
+    view_allocate_model(select_level->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_level->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_level = app->current_level;
+        },
+        true);
+
+    view_set_draw_callback(select_level->view, select_level_render_callback);
+    view_set_input_callback(select_level->view, select_level_input_callback);
+    view_set_enter_callback(select_level->view, select_level_enter_callback);
+    view_set_custom_callback(select_level->view, select_level_custom_callback);
+
+    view_set_exit_callback(select_level->view, select_level_exit_callback);
+    return select_level;
+}
+
+void select_level_free(App* app) {
+    furi_assert(app->select_level);
+    view_free(app->select_level->view);
+    free(app->select_level);
+}
+
+View* select_level_get_view(App* app) {
+    furi_assert(app->select_level);
+    return app->select_level->view;
+}

+ 25 - 0
non_catalog_apps/gb-pokemon-trading/views/select_level.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_LEVEL_HPP
+#define SELECCT_LEVEL_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectLevel;
+
+SelectLevel* select_level_alloc(App* app);
+
+void select_level_free(App* app);
+
+View* select_level_get_view(App* app);
+
+#endif /* SELECCT_LEVEL_HPP */

+ 172 - 0
non_catalog_apps/gb-pokemon-trading/views/select_move1.cpp

@@ -0,0 +1,172 @@
+#include "../pokemon_app.h"
+#include "select_move1.hpp"
+
+static void select_move1_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_move;
+    char move_num[5];
+
+    snprintf(move_num, sizeof(move_num), "#%03d", current_index + 1);
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(
+        canvas, 55, 54 / 2, AlignLeft, AlignTop, move_table[current_index].name);
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, move_num);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Move #1");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_move1_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectMove1* select_move1 = (SelectMove1*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_move1->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_move1->app->current_move = model->current_move;
+                select_move1->app->move1_hex_code = move_table[model->current_move].hex;
+            },
+            false);
+        view_dispatcher_switch_to_view(select_move1->app->view_dispatcher, AppViewSelectMove2);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_move1->app->view_dispatcher, AppViewSelectStats);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_move1->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 0) {
+                    model->current_move = 165;
+                } else {
+                    model->current_move--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_move1->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move >= 10) {
+                    model->current_move -= 10;
+                } else {
+                    model->current_move = 165;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_move1->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 165) {
+                    model->current_move = 0;
+                } else {
+                    model->current_move++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_move1->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move <= 155) {
+                    model->current_move += 10;
+                } else {
+                    model->current_move = 0;
+                    ;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_move1_enter_callback(void* context) {
+    furi_assert(context);
+    SelectMove1* select_move1 = (SelectMove1*)context;
+    with_view_model_cpp(
+        select_move1->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_move1->app->current_pokemon;
+            model->pokemon_hex_code = select_move1->app->pokemon_hex_code;
+            model->current_level = select_move1->app->current_level;
+            model->current_stats = select_move1->app->current_stats;
+            model->move1_hex_code = select_move1->app->move1_hex_code;
+        },
+        true);
+}
+
+bool select_move1_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectMove1* select_move1 = (SelectMove1*)context;
+    view_dispatcher_send_custom_event(select_move1->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_move1_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectMove1* select_move1_alloc(App* app) {
+    SelectMove1* select_move1 = (SelectMove1*)malloc(sizeof(SelectMove1));
+    select_move1->app = app;
+    select_move1->view = view_alloc();
+    view_set_context(select_move1->view, select_move1);
+    view_allocate_model(select_move1->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_move1->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_move = app->current_move;
+            model->move1_hex_code = app->move1_hex_code;
+        },
+        true);
+
+    view_set_draw_callback(select_move1->view, select_move1_render_callback);
+    view_set_input_callback(select_move1->view, select_move1_input_callback);
+    view_set_enter_callback(select_move1->view, select_move1_enter_callback);
+    view_set_custom_callback(select_move1->view, select_move1_custom_callback);
+
+    view_set_exit_callback(select_move1->view, select_move1_exit_callback);
+    return select_move1;
+}
+
+void select_move1_free(App* app) {
+    furi_assert(app->select_move1);
+    view_free(app->select_move1->view);
+    free(app->select_move1);
+}
+
+View* select_move1_get_view(App* app) {
+    furi_assert(app->select_move1);
+    return app->select_move1->view;
+}

+ 25 - 0
non_catalog_apps/gb-pokemon-trading/views/select_move1.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_MOVE1_HPP
+#define SELECCT_MOVE1_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectMove1;
+
+SelectMove1* select_move1_alloc(App* app);
+
+void select_move1_free(App* app);
+
+View* select_move1_get_view(App* app);
+
+#endif /* SELECCT_MOVE1_HPP */

+ 173 - 0
non_catalog_apps/gb-pokemon-trading/views/select_move2.cpp

@@ -0,0 +1,173 @@
+#include "../pokemon_app.h"
+#include "select_move2.hpp"
+
+static void select_move2_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_move;
+    char move_num[5];
+
+    snprintf(move_num, sizeof(move_num), "#%03d", current_index + 1);
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(
+        canvas, 55, 54 / 2, AlignLeft, AlignTop, move_table[current_index].name);
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, move_num);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Move #2");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_move2_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectMove2* select_move2 = (SelectMove2*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_move2->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_move2->app->current_move = model->current_move;
+                select_move2->app->move2_hex_code = move_table[model->current_move].hex;
+            },
+            false);
+        view_dispatcher_switch_to_view(select_move2->app->view_dispatcher, AppViewSelectMove3);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_move2->app->view_dispatcher, AppViewSelectMove1);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_move2->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 0) {
+                    model->current_move = 165;
+                } else {
+                    model->current_move--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_move2->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move >= 10) {
+                    model->current_move -= 10;
+                } else {
+                    model->current_move = 165;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_move2->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 165) {
+                    model->current_move = 0;
+                } else {
+                    model->current_move++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_move2->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move <= 155) {
+                    model->current_move += 10;
+                } else {
+                    model->current_move = 0;
+                    ;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_move2_enter_callback(void* context) {
+    furi_assert(context);
+    SelectMove2* select_move2 = (SelectMove2*)context;
+    with_view_model_cpp(
+        select_move2->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_move2->app->current_pokemon;
+            model->pokemon_hex_code = select_move2->app->pokemon_hex_code;
+            model->current_level = select_move2->app->current_level;
+            model->current_stats = select_move2->app->current_stats;
+            model->move1_hex_code = select_move2->app->move1_hex_code;
+            model->move2_hex_code = select_move2->app->move2_hex_code;
+        },
+        true);
+}
+
+bool select_move2_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectMove2* select_move2 = (SelectMove2*)context;
+    view_dispatcher_send_custom_event(select_move2->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_move2_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectMove2* select_move2_alloc(App* app) {
+    SelectMove2* select_move2 = (SelectMove2*)malloc(sizeof(SelectMove2));
+    select_move2->app = app;
+    select_move2->view = view_alloc();
+    view_set_context(select_move2->view, select_move2);
+    view_allocate_model(select_move2->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_move2->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_move = app->current_move;
+            model->move2_hex_code = app->move2_hex_code;
+        },
+        true);
+
+    view_set_draw_callback(select_move2->view, select_move2_render_callback);
+    view_set_input_callback(select_move2->view, select_move2_input_callback);
+    view_set_enter_callback(select_move2->view, select_move2_enter_callback);
+    view_set_custom_callback(select_move2->view, select_move2_custom_callback);
+
+    view_set_exit_callback(select_move2->view, select_move2_exit_callback);
+    return select_move2;
+}
+
+void select_move2_free(App* app) {
+    furi_assert(app->select_move2);
+    view_free(app->select_move2->view);
+    free(app->select_move2);
+}
+
+View* select_move2_get_view(App* app) {
+    furi_assert(app->select_move2);
+    return app->select_move2->view;
+}

+ 25 - 0
non_catalog_apps/gb-pokemon-trading/views/select_move2.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_MOVE2_HPP
+#define SELECCT_MOVE2_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectMove2;
+
+SelectMove2* select_move2_alloc(App* app);
+
+void select_move2_free(App* app);
+
+View* select_move2_get_view(App* app);
+
+#endif /* SELECCT_MOVE2_HPP */

+ 174 - 0
non_catalog_apps/gb-pokemon-trading/views/select_move3.cpp

@@ -0,0 +1,174 @@
+#include "../pokemon_app.h"
+#include "select_move3.hpp"
+
+static void select_move3_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_move;
+    char move_num[5];
+
+    snprintf(move_num, sizeof(move_num), "#%03d", current_index + 1);
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(
+        canvas, 55, 54 / 2, AlignLeft, AlignTop, move_table[current_index].name);
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, move_num);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Move #3");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_move3_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectMove3* select_move3 = (SelectMove3*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_move3->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_move3->app->current_move = model->current_move;
+                select_move3->app->move3_hex_code = move_table[model->current_move].hex;
+            },
+            false);
+        view_dispatcher_switch_to_view(select_move3->app->view_dispatcher, AppViewSelectMove4);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_move3->app->view_dispatcher, AppViewSelectMove2);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_move3->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 0) {
+                    model->current_move = 165;
+                } else {
+                    model->current_move--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_move3->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move >= 10) {
+                    model->current_move -= 10;
+                } else {
+                    model->current_move = 165;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_move3->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 165) {
+                    model->current_move = 0;
+                } else {
+                    model->current_move++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_move3->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move <= 155) {
+                    model->current_move += 10;
+                } else {
+                    model->current_move = 0;
+                    ;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_move3_enter_callback(void* context) {
+    furi_assert(context);
+    SelectMove3* select_move3 = (SelectMove3*)context;
+    with_view_model_cpp(
+        select_move3->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_move3->app->current_pokemon;
+            model->pokemon_hex_code = select_move3->app->pokemon_hex_code;
+            model->current_level = select_move3->app->current_level;
+            model->current_stats = select_move3->app->current_stats;
+            model->move1_hex_code = select_move3->app->move1_hex_code;
+            model->move2_hex_code = select_move3->app->move2_hex_code;
+            model->move3_hex_code = select_move3->app->move3_hex_code;
+        },
+        true);
+}
+
+bool select_move3_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectMove3* select_move3 = (SelectMove3*)context;
+    view_dispatcher_send_custom_event(select_move3->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_move3_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectMove3* select_move3_alloc(App* app) {
+    SelectMove3* select_move3 = (SelectMove3*)malloc(sizeof(SelectMove3));
+    select_move3->app = app;
+    select_move3->view = view_alloc();
+    view_set_context(select_move3->view, select_move3);
+    view_allocate_model(select_move3->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_move3->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_move = app->current_move;
+            model->move3_hex_code = app->move3_hex_code;
+        },
+        true);
+
+    view_set_draw_callback(select_move3->view, select_move3_render_callback);
+    view_set_input_callback(select_move3->view, select_move3_input_callback);
+    view_set_enter_callback(select_move3->view, select_move3_enter_callback);
+    view_set_custom_callback(select_move3->view, select_move3_custom_callback);
+
+    view_set_exit_callback(select_move3->view, select_move3_exit_callback);
+    return select_move3;
+}
+
+void select_move3_free(App* app) {
+    furi_assert(app->select_move3);
+    view_free(app->select_move3->view);
+    free(app->select_move3);
+}
+
+View* select_move3_get_view(App* app) {
+    furi_assert(app->select_move3);
+    return app->select_move3->view;
+}

+ 25 - 0
non_catalog_apps/gb-pokemon-trading/views/select_move3.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_MOVE3_HPP
+#define SELECCT_MOVE3_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectMove3;
+
+SelectMove3* select_move3_alloc(App* app);
+
+void select_move3_free(App* app);
+
+View* select_move3_get_view(App* app);
+
+#endif /* SELECCT_MOVE3_HPP */

+ 174 - 0
non_catalog_apps/gb-pokemon-trading/views/select_move4.cpp

@@ -0,0 +1,174 @@
+#include "../pokemon_app.h"
+#include "select_move4.hpp"
+
+static void select_move4_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_move;
+    char move_num[5];
+
+    snprintf(move_num, sizeof(move_num), "#%03d", current_index + 1);
+    canvas_set_font(canvas, FontPrimary);
+    canvas_draw_str_aligned(
+        canvas, 55, 54 / 2, AlignLeft, AlignTop, move_table[current_index].name);
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str_aligned(canvas, 55, 38, AlignLeft, AlignTop, move_num);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Move #4");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_move4_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectMove4* select_move4 = (SelectMove4*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_move4->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_move4->app->current_move = model->current_move;
+                select_move4->app->move4_hex_code = move_table[model->current_move].hex;
+            },
+            false);
+        view_dispatcher_switch_to_view(select_move4->app->view_dispatcher, AppViewTrade);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_move4->app->view_dispatcher, AppViewSelectMove3);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_move4->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 0) {
+                    model->current_move = 165;
+                } else {
+                    model->current_move--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_move4->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move >= 10) {
+                    model->current_move -= 10;
+                } else {
+                    model->current_move = 165;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_move4->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move == 165) {
+                    model->current_move = 0;
+                } else {
+                    model->current_move++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_move4->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_move <= 155) {
+                    model->current_move += 10;
+                } else {
+                    model->current_move = 0;
+                    ;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_move4_enter_callback(void* context) {
+    furi_assert(context);
+    SelectMove4* select_move4 = (SelectMove4*)context;
+    with_view_model_cpp(
+        select_move4->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_move4->app->current_pokemon;
+            model->pokemon_hex_code = select_move4->app->pokemon_hex_code;
+            model->current_level = select_move4->app->current_level;
+            model->current_stats = select_move4->app->current_stats;
+            model->move1_hex_code = select_move4->app->move1_hex_code;
+            model->move2_hex_code = select_move4->app->move2_hex_code;
+            model->move3_hex_code = select_move4->app->move3_hex_code;
+        },
+        true);
+}
+
+bool select_move4_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectMove4* select_move4 = (SelectMove4*)context;
+    view_dispatcher_send_custom_event(select_move4->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_move4_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectMove4* select_move4_alloc(App* app) {
+    SelectMove4* select_move4 = (SelectMove4*)malloc(sizeof(SelectMove4));
+    select_move4->app = app;
+    select_move4->view = view_alloc();
+    view_set_context(select_move4->view, select_move4);
+    view_allocate_model(select_move4->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_move4->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_move = app->current_move;
+            model->move4_hex_code = app->move4_hex_code;
+        },
+        true);
+
+    view_set_draw_callback(select_move4->view, select_move4_render_callback);
+    view_set_input_callback(select_move4->view, select_move4_input_callback);
+    view_set_enter_callback(select_move4->view, select_move4_enter_callback);
+    view_set_custom_callback(select_move4->view, select_move4_custom_callback);
+
+    view_set_exit_callback(select_move4->view, select_move4_exit_callback);
+    return select_move4;
+}
+
+void select_move4_free(App* app) {
+    furi_assert(app->select_move4);
+    view_free(app->select_move4->view);
+    free(app->select_move4);
+}
+
+View* select_move4_get_view(App* app) {
+    furi_assert(app->select_move4);
+    return app->select_move4->view;
+}

+ 25 - 0
non_catalog_apps/gb-pokemon-trading/views/select_move4.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_MOVE4_HPP
+#define SELECCT_MOVE4_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectMove4;
+
+SelectMove4* select_move4_alloc(App* app);
+
+void select_move4_free(App* app);
+
+View* select_move4_get_view(App* app);
+
+#endif /* SELECCT_MOVE4_HPP */

+ 2 - 1
non_catalog_apps/gb-pokemon-trading/views/select_pokemon.cpp

@@ -38,7 +38,8 @@ static bool select_pokemon_input_callback(InputEvent* event, void* context) {
                 select_pokemon->app->pokemon_hex_code = pokemon_table[model->current_pokemon].hex;
                 select_pokemon->app->pokemon_hex_code = pokemon_table[model->current_pokemon].hex;
             },
             },
             false);
             false);
-        view_dispatcher_switch_to_view(select_pokemon->app->view_dispatcher, AppViewTrade);
+
+        view_dispatcher_switch_to_view(select_pokemon->app->view_dispatcher, AppViewSelectLevel);
         consumed = true;
         consumed = true;
     } else if(event->type == InputTypePress && event->key == InputKeyBack) {
     } else if(event->type == InputTypePress && event->key == InputKeyBack) {
         view_dispatcher_switch_to_view(select_pokemon->app->view_dispatcher, VIEW_NONE);
         view_dispatcher_switch_to_view(select_pokemon->app->view_dispatcher, VIEW_NONE);

+ 195 - 0
non_catalog_apps/gb-pokemon-trading/views/select_stats.cpp

@@ -0,0 +1,195 @@
+#include "../pokemon_app.h"
+#include "select_stats.hpp"
+
+static void select_stats_render_callback(Canvas* canvas, void* context) {
+    canvas_clear(canvas);
+
+    SelectPokemonModel* model = (SelectPokemonModel*)context;
+    const uint8_t current_index = model->current_stats;
+
+    canvas_set_font(canvas, FontPrimary);
+    if(current_index == 0) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Zero EV");
+    } else if(current_index == 1) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Max EV / Lvl");
+    } else if(current_index == 2) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Random IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Max EV");
+    } else if(current_index == 3) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Zero EV");
+    } else if(current_index == 4) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Max EV / Lvl");
+    } else if(current_index == 5) {
+        canvas_draw_str_aligned(
+            canvas, 55, 54 / 2, AlignLeft, AlignTop, "Max IV");
+        canvas_draw_str_aligned(
+            canvas, 55, 38, AlignLeft, AlignTop, "Max EV");
+    }
+
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_icon(canvas, 0, 0, pokemon_table[model->current_pokemon].icon);
+    canvas_draw_icon(canvas, 128 - 80, 0, &I_Space_80x18);
+    canvas_draw_str_aligned(canvas, (128 - 40), 5, AlignCenter, AlignTop, "Select Stats");
+
+    canvas_set_font(canvas, FontPrimary);
+    elements_button_center(canvas, "OK");
+}
+
+static bool select_stats_input_callback(InputEvent* event, void* context) {
+    furi_assert(context);
+    SelectStats* select_stats = (SelectStats*)context;
+    bool consumed = false;
+
+    if(event->type == InputTypePress && event->key == InputKeyOk) {
+        with_view_model_cpp(
+            select_stats->view,
+            SelectPokemonModel*,
+            model,
+            {
+                select_stats->app->current_stats = model->current_stats;
+            },
+            false);
+        
+        view_dispatcher_switch_to_view(select_stats->app->view_dispatcher, AppViewSelectMove1);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyBack) {
+        view_dispatcher_switch_to_view(select_stats->app->view_dispatcher, AppViewSelectLevel);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyLeft) {
+        with_view_model_cpp(
+            select_stats->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_stats == 0) {
+                    model->current_stats = 5;
+                } else {
+                    model->current_stats--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyDown) {
+        with_view_model_cpp(
+            select_stats->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_stats == 0) {
+                    model->current_stats = 5;
+                } else {
+                    model->current_stats--;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyRight) {
+        with_view_model_cpp(
+            select_stats->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_stats == 5) {
+                    model->current_stats = 0;
+                } else {
+                    model->current_stats++;
+                }
+            },
+            true);
+        consumed = true;
+    } else if(event->type == InputTypePress && event->key == InputKeyUp) {
+        with_view_model_cpp(
+            select_stats->view,
+            SelectPokemonModel*,
+            model,
+            {
+                if(model->current_stats == 5) {
+                    model->current_stats = 0;
+                } else {
+                    model->current_stats++;
+                }
+            },
+            true);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void select_stats_enter_callback(void* context) {
+    furi_assert(context);
+    SelectStats* select_stats = (SelectStats*)context;
+    with_view_model_cpp(
+        select_stats->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_pokemon = select_stats->app->current_pokemon;
+            model->pokemon_hex_code = select_stats->app->pokemon_hex_code;
+            model->current_level = select_stats->app->current_level;
+            model->current_stats = select_stats->app->current_stats;
+        },
+        true);
+}
+
+bool select_stats_custom_callback(uint32_t event, void* context) {
+    UNUSED(event);
+    furi_assert(context);
+    SelectStats* select_stats = (SelectStats*)context;
+    view_dispatcher_send_custom_event(select_stats->app->view_dispatcher, 0);
+    return true;
+}
+
+void select_stats_exit_callback(void* context) {
+    furi_assert(context);
+    UNUSED(context);
+}
+
+SelectStats* select_stats_alloc(App* app) {
+    SelectStats* select_stats = (SelectStats*)malloc(sizeof(SelectStats));
+    select_stats->app = app;
+    select_stats->view = view_alloc();
+    view_set_context(select_stats->view, select_stats);
+    view_allocate_model(select_stats->view, ViewModelTypeLockFree, sizeof(SelectPokemonModel));
+    with_view_model_cpp(
+        select_stats->view,
+        SelectPokemonModel*,
+        model,
+        {
+            model->current_stats = app->current_stats;
+        },
+        true);
+
+    view_set_draw_callback(select_stats->view, select_stats_render_callback);
+    view_set_input_callback(select_stats->view, select_stats_input_callback);
+    view_set_enter_callback(select_stats->view, select_stats_enter_callback);
+    view_set_custom_callback(select_stats->view, select_stats_custom_callback);
+
+    view_set_exit_callback(select_stats->view, select_stats_exit_callback);
+    return select_stats;
+}
+
+void select_stats_free(App* app) {
+    furi_assert(app->select_stats);
+    view_free(app->select_stats->view);
+    free(app->select_stats);
+}
+
+View* select_stats_get_view(App* app) {
+    furi_assert(app->select_stats);
+    return app->select_stats->view;
+}

+ 25 - 0
non_catalog_apps/gb-pokemon-trading/views/select_stats.hpp

@@ -0,0 +1,25 @@
+#ifndef SELECCT_STATS_HPP
+#define SELECCT_LEVEL_HPP
+
+#pragma once
+#include <furi.h>
+#include <gui/view.h>
+#include <gui/view_dispatcher.h>
+
+#include <gui/elements.h>
+#include <string>
+
+typedef struct App App;
+
+typedef struct {
+    View* view;
+    App* app;
+} SelectStats;
+
+SelectStats* select_stats_alloc(App* app);
+
+void select_stats_free(App* app);
+
+View* select_stats_get_view(App* app);
+
+#endif /* SELECCT_STATS_HPP */

+ 294 - 0
non_catalog_apps/gb-pokemon-trading/views/trade.cpp

@@ -34,6 +34,7 @@ int time_in_seconds = 0;
 static void trade_draw_callback(Canvas* canvas, void* context) {
 static void trade_draw_callback(Canvas* canvas, void* context) {
     canvas_clear(canvas);
     canvas_clear(canvas);
     SelectPokemonModel* model = (SelectPokemonModel*)context;
     SelectPokemonModel* model = (SelectPokemonModel*)context;
+
     if(!model->trading) {
     if(!model->trading) {
         if(!model->connected) {
         if(!model->connected) {
             furi_hal_light_set(LightGreen, 0x00);
             furi_hal_light_set(LightGreen, 0x00);
@@ -298,6 +299,126 @@ void input_clk_gameboy(void* context) {
     transferBit(context);
     transferBit(context);
     time = micros();
     time = micros();
 }
 }
+unsigned char convertCharToTagHex(char c) {
+    switch(c) {
+    case 'A':
+        return A_;
+    case 'B':
+        return B_;
+    case 'C':
+        return C_;
+    case 'D':
+        return D_;
+    case 'E':
+        return E_;
+    case 'F':
+        return F_;
+    case 'G':
+        return G_;
+    case 'H':
+        return H_;
+    case 'I':
+        return I_;
+    case 'J':
+        return J_;
+    case 'K':
+        return K_;
+    case 'L':
+        return L_;
+    case 'M':
+        return M_;
+    case 'N':
+        return N_;
+    case 'O':
+        return O_;
+    case 'P':
+        return P_;
+    case 'Q':
+        return Q_;
+    case 'R':
+        return R_;
+    case 'S':
+        return S_;
+    case 'T':
+        return T_;
+    case 'U':
+        return U_;
+    case 'V':
+        return V_;
+    case 'W':
+        return W_;
+    case 'X':
+        return X_;
+    case 'Y':
+        return Y_;
+    case 'Z':
+        return Z_;
+    case 'a':
+        return A_;
+    case 'b':
+        return B_;
+    case 'c':
+        return C_;
+    case 'd':
+        return D_;
+    case 'e':
+        return E_;
+    case 'f':
+        return F_;
+    case 'g':
+        return G_;
+    case 'h':
+        return H_;
+    case 'i':
+        return I_;
+    case 'j':
+        return J_;
+    case 'k':
+        return K_;
+    case 'l':
+        return L_;
+    case 'm':
+        return M_;
+    case 'n':
+        return N_;
+    case 'o':
+        return O_;
+    case 'p':
+        return P_;
+    case 'q':
+        return Q_;
+    case 'r':
+        return R_;
+    case 's':
+        return S_;
+    case 't':
+        return T_;
+    case 'u':
+        return U_;
+    case 'v':
+        return V_;
+    case 'w':
+        return W_;
+    case 'x':
+        return X_;
+    case 'y':
+        return Y_;
+    case 'z':
+        return Z_;
+    case ' ':
+        return SPACE_;
+    case '.':
+        return PERIOD_;
+    case '\'':
+        return S_QUOTE_;
+    case '!':
+        return MALE_;
+    case '@':
+        return FEMALE_;
+    default:
+        return 0x00;
+    }
+}
 void trade_enter_callback(void* context) {
 void trade_enter_callback(void* context) {
     furi_assert(context);
     furi_assert(context);
     Trade* trade = (Trade*)context;
     Trade* trade = (Trade*)context;
@@ -308,13 +429,186 @@ void trade_enter_callback(void* context) {
         {
         {
             model->current_pokemon = trade->app->current_pokemon;
             model->current_pokemon = trade->app->current_pokemon;
             model->pokemon_hex_code = trade->app->pokemon_hex_code;
             model->pokemon_hex_code = trade->app->pokemon_hex_code;
+            model->current_level = trade->app->current_level;
+            model->current_stats = trade->app->current_stats;
+            model->current_move = trade->app->current_move;
+            model->move1_hex_code = trade->app->move1_hex_code;
+            model->move2_hex_code = trade->app->move2_hex_code;
+            model->move3_hex_code = trade->app->move3_hex_code;
+            model->move4_hex_code = trade->app->move4_hex_code;
             model->trading = false;
             model->trading = false;
             model->connected = false;
             model->connected = false;
             model->gameboy_status = GAMEBOY_INITIAL;
             model->gameboy_status = GAMEBOY_INITIAL;
         },
         },
         true);
         true);
 
 
+    FURI_LOG_D(TAG, "[Trade] Current Pokemon: %d", trade->app->current_pokemon);
+
+    // Set the Pokemon name
+
+    unsigned char nickname[11];
+    for(size_t i = 0; i < 11; ++i) {
+        nickname[i] = 0x50;
+    }
+    for(size_t i = 0; i < strlen(pokemon_table[trade->app->current_pokemon].name); ++i) {
+        nickname[i] = convertCharToTagHex(pokemon_table[trade->app->current_pokemon].name[i]);
+    }
+
+    memcpy(DATA_BLOCK2.nickname[0].str, nickname, sizeof(nickname));
+
+    FURI_LOG_D(TAG, "[Trade] Pokemon Name: %s", pokemon_table[trade->app->current_pokemon].name);
+
+    // Set the Pokemon hex code
+
     DATA_BLOCK[12] = trade->app->pokemon_hex_code;
     DATA_BLOCK[12] = trade->app->pokemon_hex_code;
+
+    FURI_LOG_D(TAG, "[Trade] Pokemon Hex Code: %x", trade->app->pokemon_hex_code);
+
+    // Set the Pokemon level
+
+    FURI_LOG_D(TAG, "[Trade] Current Level: %d", trade->app->current_level);
+
+    uint8_t level = trade->app->current_level;
+    DATA_BLOCK2.party[0].level = level & 0xFF;
+    DATA_BLOCK2.party[0].level_again = level & 0xFF;
+
+    FURI_LOG_D(TAG, "[Trade] Level Hex Code: %x", DATA_BLOCK2.party[0].level);
+
+    // Set the Pokemon experience
+
+    int32_t exp = 0;
+    if(pokemon_table[trade->app->current_pokemon].xp_group == 0) {
+        exp = 1.25 * level * level * level;
+    } else if(pokemon_table[trade->app->current_pokemon].xp_group == 1) {
+        exp = (1.2 * level * level * level) - (15 * level * level) + (100 * level) - 140;
+    } else if(pokemon_table[trade->app->current_pokemon].xp_group == 2) {
+        exp = level * level * level;
+    } else if(pokemon_table[trade->app->current_pokemon].xp_group == 3) {
+        exp = 0.8 * level * level * level;
+    }
+
+    DATA_BLOCK2.party[0].exp[0] = (exp >> 16) & 0xFF;
+    DATA_BLOCK2.party[0].exp[1] = (exp >> 8) & 0xFF;
+    DATA_BLOCK2.party[0].exp[2] = exp & 0xFF;
+
+    FURI_LOG_D(TAG, "[Trade] XP 1: %x", DATA_BLOCK2.party[0].exp[0]);
+    FURI_LOG_D(TAG, "[Trade] XP 2: %x", DATA_BLOCK2.party[0].exp[1]);
+    FURI_LOG_D(TAG, "[Trade] XP 3: %x", DATA_BLOCK2.party[0].exp[2]);
+
+    // Set the Pokemon stat experience
+
+    uint16_t statexp = 0x0000;
+    if(trade->app->current_stats == 1 || trade->app->current_stats == 4) {
+        statexp = (65535 / 100) * level;
+    } else if(trade->app->current_stats == 2 || trade->app->current_stats == 5) {
+        statexp = 65535;
+    }
+
+    DATA_BLOCK2.party[0].hp_ev = ((statexp >> 8) & 0x00FF) | ((statexp << 8) & 0xFF00);
+    DATA_BLOCK2.party[0].atk_ev = ((statexp >> 8) & 0x00FF) | ((statexp << 8) & 0xFF00);
+    DATA_BLOCK2.party[0].def_ev = ((statexp >> 8) & 0x00FF) | ((statexp << 8) & 0xFF00);
+    DATA_BLOCK2.party[0].spd_ev = ((statexp >> 8) & 0x00FF) | ((statexp << 8) & 0xFF00);
+    DATA_BLOCK2.party[0].special_ev = ((statexp >> 8) & 0x00FF) | ((statexp << 8) & 0xFF00);
+
+    FURI_LOG_D(TAG, "[Trade] Pokemon Stat EXP: %d", statexp);
+    FURI_LOG_D(TAG, "[Trade] Pokemon HP EV: %x", DATA_BLOCK2.party[0].hp_ev);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Attack EV: %x", DATA_BLOCK2.party[0].atk_ev);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Defence EV: %x", DATA_BLOCK2.party[0].def_ev);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Speed EV: %x", DATA_BLOCK2.party[0].spd_ev);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Special EV: %x", DATA_BLOCK2.party[0].special_ev);
+
+    // Set the Pokemon stats
+
+    uint8_t atk_iv = 15;
+    uint8_t def_iv = 15;
+    uint8_t spd_iv = 15;
+    uint8_t special_iv = 15;
+    uint8_t hp_iv = 15;
+    if(trade->app->current_stats <= 2) {
+        atk_iv = rand() % 15;
+        def_iv = rand() % 15;
+        spd_iv = rand() % 15;
+        special_iv = rand() % 15;
+        DATA_BLOCK2.party[0].iv = ((atk_iv & 0b00001111) << 12) | ((def_iv & 0b00001111) << 8) |
+                                  ((spd_iv & 0b00001111) << 4) | ((special_iv & 0b00001111));
+        hp_iv = (DATA_BLOCK2.party[0].iv & 0xAA) >> 4;
+    }
+
+    FURI_LOG_D(TAG, "[Trade] Pokemon IV: %x", DATA_BLOCK2.party[0].iv);
+    FURI_LOG_D(TAG, "[Trade] Pokemon HP IV: %x", hp_iv);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Attack IV: %x", atk_iv);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Defence IV: %x", def_iv);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Speed IV: %x", spd_iv);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Special IV: %x", special_iv);
+
+    uint16_t max_hp = floor(
+                          (((2 * (pokemon_table[trade->app->current_pokemon].base_hp + hp_iv)) +
+                            floor(sqrt(statexp) / 4)) *
+                           level) /
+                          100) +
+                      (level + 10);
+    DATA_BLOCK2.party[0].max_hp = ((max_hp >> 8) & 0x00FF) | ((max_hp << 8) & 0xFF00);
+    DATA_BLOCK2.party[0].hp = ((max_hp >> 8) & 0x00FF) | ((max_hp << 8) & 0xFF00);
+    uint16_t attack = floor(
+                          (((2 * (pokemon_table[trade->app->current_pokemon].base_atk + atk_iv)) +
+                            floor(sqrt(statexp) / 4)) *
+                           level) /
+                          100) +
+                      5;
+    DATA_BLOCK2.party[0].atk = ((attack >> 8) & 0x00FF) | ((attack << 8) & 0xFF00);
+    uint16_t defence = floor(
+                           (((2 * (pokemon_table[trade->app->current_pokemon].base_def + def_iv)) +
+                             floor(sqrt(statexp) / 4)) *
+                            level) /
+                           100) +
+                       5;
+    DATA_BLOCK2.party[0].def = ((defence >> 8) & 0x00FF) | ((defence << 8) & 0xFF00);
+    uint16_t speed = floor(
+                         (((2 * (pokemon_table[trade->app->current_pokemon].base_spd + spd_iv)) +
+                           floor(sqrt(statexp) / 4)) *
+                          level) /
+                         100) +
+                     5;
+    DATA_BLOCK2.party[0].spd = ((speed >> 8) & 0x00FF) | ((speed << 8) & 0xFF00);
+    uint16_t special =
+        floor(
+            (((2 * (pokemon_table[trade->app->current_pokemon].base_special + special_iv)) +
+              floor(sqrt(statexp) / 4)) *
+             level) /
+            100) +
+        5;
+    DATA_BLOCK2.party[0].special = ((special >> 8) & 0x00FF) | ((special << 8) & 0xFF00);
+
+    FURI_LOG_D(TAG, "[Trade] Pokemon Max HP: %x", DATA_BLOCK2.party[0].max_hp);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Attack: %x", DATA_BLOCK2.party[0].atk);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Defence: %x", DATA_BLOCK2.party[0].def);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Speed: %x", DATA_BLOCK2.party[0].spd);
+    FURI_LOG_D(TAG, "[Trade] Pokemon Special: %x", DATA_BLOCK2.party[0].special);
+
+    // Set the Pokemon types
+
+    DATA_BLOCK2.party[0].type[0] = pokemon_table[trade->app->current_pokemon].type1;
+    if(pokemon_table[trade->app->current_pokemon].type2 == 0xFF) {
+        DATA_BLOCK2.party[0].type[1] = pokemon_table[trade->app->current_pokemon].type1;
+    } else {
+        DATA_BLOCK2.party[0].type[1] = pokemon_table[trade->app->current_pokemon].type2;
+    }
+
+    FURI_LOG_D(TAG, "[Trade] Type 1: %x", DATA_BLOCK2.party[0].type[0]);
+    FURI_LOG_D(TAG, "[Trade] Type 2: %x", DATA_BLOCK2.party[0].type[1]);
+
+    // Set the Pokemon moves
+
+    DATA_BLOCK2.party[0].move[0] = trade->app->move1_hex_code;
+    DATA_BLOCK2.party[0].move[1] = trade->app->move2_hex_code;
+    DATA_BLOCK2.party[0].move[2] = trade->app->move3_hex_code;
+    DATA_BLOCK2.party[0].move[3] = trade->app->move4_hex_code;
+
+    FURI_LOG_D(TAG, "[Trade] Move 1 Hex Code: %x", trade->app->move1_hex_code);
+    FURI_LOG_D(TAG, "[Trade] Move 2 Hex Code: %x", trade->app->move2_hex_code);
+    FURI_LOG_D(TAG, "[Trade] Move 3 Hex Code: %x", trade->app->move3_hex_code);
+    FURI_LOG_D(TAG, "[Trade] Move 4 Hex Code: %x", trade->app->move4_hex_code);
+
     // B3 (Pin6) / SO (2)
     // B3 (Pin6) / SO (2)
     furi_hal_gpio_write(&GAME_BOY_SO, false);
     furi_hal_gpio_write(&GAME_BOY_SO, false);
     furi_hal_gpio_init(&GAME_BOY_SO, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);
     furi_hal_gpio_init(&GAME_BOY_SO, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh);

Некоторые файлы не были показаны из-за большого количества измененных файлов