tuipet 0.2.413__tar.gz → 0.2.415__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. {tuipet-0.2.413/src/tuipet.egg-info → tuipet-0.2.415}/PKG-INFO +1 -1
  2. {tuipet-0.2.413 → tuipet-0.2.415}/pyproject.toml +1 -1
  3. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/app.py +4 -3
  4. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/battle_overlays.json +1 -1
  5. tuipet-0.2.415/src/tuipet/data/effects.json.gz +0 -0
  6. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/training.py +26 -22
  7. {tuipet-0.2.413 → tuipet-0.2.415/src/tuipet.egg-info}/PKG-INFO +1 -1
  8. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_training_facing.py +70 -9
  9. tuipet-0.2.413/src/tuipet/data/effects.json.gz +0 -0
  10. {tuipet-0.2.413 → tuipet-0.2.415}/LICENSE +0 -0
  11. {tuipet-0.2.413 → tuipet-0.2.415}/README.md +0 -0
  12. {tuipet-0.2.413 → tuipet-0.2.415}/setup.cfg +0 -0
  13. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/__init__.py +0 -0
  14. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/adventure.py +0 -0
  15. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/adventurescreen.py +0 -0
  16. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/anim.py +0 -0
  17. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/arena.py +0 -0
  18. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/assistscreen.py +0 -0
  19. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/battle.py +0 -0
  20. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/battlefx.py +0 -0
  21. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/battlescreen.py +0 -0
  22. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/bugscreen.py +0 -0
  23. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/cloudsync.py +0 -0
  24. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/attr_icons.json +0 -0
  25. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/backgrounds.json.gz +0 -0
  26. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/careEffect.csv +0 -0
  27. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/digicoreMenuConfig.csv +0 -0
  28. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/digimon.csv +0 -0
  29. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/dropRate.csv +0 -0
  30. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/eggUnlock.csv +0 -0
  31. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/eggs.json.gz +0 -0
  32. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/elementAffinity.csv +0 -0
  33. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/enemies.csv +0 -0
  34. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/evolutions.csv +0 -0
  35. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/fieldAffinity.csv +0 -0
  36. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/foods.csv +0 -0
  37. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/habitats.csv +0 -0
  38. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/hp_dummies.json +0 -0
  39. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/icons.json.gz +0 -0
  40. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/items.csv +0 -0
  41. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/lines.csv +0 -0
  42. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/lootTable.csv +0 -0
  43. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/maps.csv +0 -0
  44. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/orbs.json.gz +0 -0
  45. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/shopConsumable.csv +0 -0
  46. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/alarm.wav +0 -0
  47. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/angry.wav +0 -0
  48. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/attack.wav +0 -0
  49. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/attackHit.wav +0 -0
  50. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/battle.wav +0 -0
  51. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/cancel.wav +0 -0
  52. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/champion.wav +0 -0
  53. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/click.wav +0 -0
  54. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/compatible.wav +0 -0
  55. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/confirm.wav +0 -0
  56. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/death.wav +0 -0
  57. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/eat.wav +0 -0
  58. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/error.wav +0 -0
  59. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/evolve.wav +0 -0
  60. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/happy.wav +0 -0
  61. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/hatch.wav +0 -0
  62. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/jogress.wav +0 -0
  63. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/largePoop.wav +0 -0
  64. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/lastBite.wav +0 -0
  65. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/lose.wav +0 -0
  66. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/menu.wav +0 -0
  67. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/mischief.wav +0 -0
  68. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/poop.wav +0 -0
  69. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/refuse.wav +0 -0
  70. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/reward.wav +0 -0
  71. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/scroll.wav +0 -0
  72. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/select.wav +0 -0
  73. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/smallPoop.wav +0 -0
  74. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/startBattle.wav +0 -0
  75. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/strongAttack.wav +0 -0
  76. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/strongHit.wav +0 -0
  77. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/trainhit.wav +0 -0
  78. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/wash.wav +0 -0
  79. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/win.wav +0 -0
  80. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sounds/wind.wav +0 -0
  81. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/sprites.json.gz +0 -0
  82. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/tournies.csv +0 -0
  83. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/towns.csv +0 -0
  84. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data/zones.csv +0 -0
  85. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/data.py +0 -0
  86. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/deathscreen.py +0 -0
  87. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/digicorescreen.py +0 -0
  88. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/dnascreen.py +0 -0
  89. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/egg.py +0 -0
  90. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/eggselectscreen.py +0 -0
  91. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/evolution.py +0 -0
  92. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/feedscreen.py +0 -0
  93. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/grid.py +0 -0
  94. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/habitatscreen.py +0 -0
  95. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/helpscreen.py +0 -0
  96. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/itemfx.py +0 -0
  97. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/jogress.py +0 -0
  98. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/jogressscreen.py +0 -0
  99. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/lines.py +0 -0
  100. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/lobbyscreen.py +0 -0
  101. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/loot.py +0 -0
  102. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/menu.py +0 -0
  103. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/net.py +0 -0
  104. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/optionsscreen.py +0 -0
  105. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/persistence.py +0 -0
  106. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/pet.py +0 -0
  107. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/placeholder.py +0 -0
  108. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/render.py +0 -0
  109. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/shop.py +0 -0
  110. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/shopscreen.py +0 -0
  111. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/sound.py +0 -0
  112. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/strikefx.py +0 -0
  113. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/theme.py +0 -0
  114. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/themescreen.py +0 -0
  115. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/titlescreen.py +0 -0
  116. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/tournament.py +0 -0
  117. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/tournamentscreen.py +0 -0
  118. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/townscreen.py +0 -0
  119. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/transportscreen.py +0 -0
  120. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/update.py +0 -0
  121. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/weather.py +0 -0
  122. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet/world.py +0 -0
  123. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet.egg-info/SOURCES.txt +0 -0
  124. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet.egg-info/dependency_links.txt +0 -0
  125. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet.egg-info/entry_points.txt +0 -0
  126. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet.egg-info/requires.txt +0 -0
  127. {tuipet-0.2.413 → tuipet-0.2.415}/src/tuipet.egg-info/top_level.txt +0 -0
  128. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_adventure.py +0 -0
  129. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_adventure_math.py +0 -0
  130. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_adventure_scenery.py +0 -0
  131. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_album_dex.py +0 -0
  132. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_anim_canon.py +0 -0
  133. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_anim_timing.py +0 -0
  134. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_announce.py +0 -0
  135. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_audit_fixes.py +0 -0
  136. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_auto_care.py +0 -0
  137. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_battle.py +0 -0
  138. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_battle_math.py +0 -0
  139. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_bedtime.py +0 -0
  140. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_birthday.py +0 -0
  141. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_body_math.py +0 -0
  142. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_bugreport.py +0 -0
  143. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_care_asleep.py +0 -0
  144. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_care_bonus.py +0 -0
  145. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_completeness_sweep.py +0 -0
  146. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_data.py +0 -0
  147. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_dead_gate.py +0 -0
  148. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_death.py +0 -0
  149. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_device_lines.py +0 -0
  150. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_digicore.py +0 -0
  151. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_digimemory.py +0 -0
  152. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_discipline.py +0 -0
  153. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_divergence.py +0 -0
  154. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_dna_charge.py +0 -0
  155. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_effects_integrity.py +0 -0
  156. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_egg_economy.py +0 -0
  157. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_egg_unlock.py +0 -0
  158. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_egg_unlock_math.py +0 -0
  159. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_energy_system.py +0 -0
  160. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_evolution.py +0 -0
  161. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_evolution_math.py +0 -0
  162. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_evolution_system.py +0 -0
  163. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_feed.py +0 -0
  164. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_feeding_math.py +0 -0
  165. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_filth_system.py +0 -0
  166. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_fx.py +0 -0
  167. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_gift_birthday_math.py +0 -0
  168. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_habitat.py +0 -0
  169. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_habitat_math.py +0 -0
  170. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_help.py +0 -0
  171. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_hint_strips.py +0 -0
  172. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_hud.py +0 -0
  173. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_humulos_eggs.py +0 -0
  174. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_hunger.py +0 -0
  175. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_item_effects.py +0 -0
  176. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_item_heal.py +0 -0
  177. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_itemfx.py +0 -0
  178. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_jogress.py +0 -0
  179. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_jogress_math.py +0 -0
  180. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_line_curation.py +0 -0
  181. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_lines.py +0 -0
  182. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_lobby.py +0 -0
  183. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_lobby_admin.py +0 -0
  184. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_lobby_screens.py +0 -0
  185. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_medicine.py +0 -0
  186. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_menu_bounds.py +0 -0
  187. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_messages.py +0 -0
  188. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_mood_system.py +0 -0
  189. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_mortality_math.py +0 -0
  190. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_msg_strip.py +0 -0
  191. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_nav_quit.py +0 -0
  192. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_night_palette.py +0 -0
  193. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_obedience_system.py +0 -0
  194. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_options.py +0 -0
  195. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_panel_smoke.py +0 -0
  196. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_performance.py +0 -0
  197. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_persistence.py +0 -0
  198. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_persistence_audit.py +0 -0
  199. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_pet_effect.py +0 -0
  200. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_poop_model.py +0 -0
  201. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_poop_placement.py +0 -0
  202. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_protocol_math.py +0 -0
  203. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_rank_system.py +0 -0
  204. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_refusal.py +0 -0
  205. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_refusal_math.py +0 -0
  206. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_robustness.py +0 -0
  207. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_save_integrity.py +0 -0
  208. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_scene_actors.py +0 -0
  209. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_screen_sweep.py +0 -0
  210. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_sfx_scroll.py +0 -0
  211. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_shop.py +0 -0
  212. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_shop_economy.py +0 -0
  213. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_shop_math.py +0 -0
  214. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_sickness_system.py +0 -0
  215. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_sleep.py +0 -0
  216. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_sleep_system.py +0 -0
  217. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_sleep_weather_math.py +0 -0
  218. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_sound.py +0 -0
  219. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_special_idles.py +0 -0
  220. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_stage_arrival.py +0 -0
  221. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_status_box.py +0 -0
  222. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_status_icons.py +0 -0
  223. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_sync.py +0 -0
  224. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_theme.py +0 -0
  225. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_toilet.py +0 -0
  226. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_tournament.py +0 -0
  227. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_town.py +0 -0
  228. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_town_eggs.py +0 -0
  229. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_training.py +0 -0
  230. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_training_hp.py +0 -0
  231. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_training_math.py +0 -0
  232. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_training_strike.py +0 -0
  233. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_training_system.py +0 -0
  234. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_ui_stats.py +0 -0
  235. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_update.py +0 -0
  236. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_verx.py +0 -0
  237. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_weight_system.py +0 -0
  238. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_whats_new.py +0 -0
  239. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_win_eggs.py +0 -0
  240. {tuipet-0.2.413 → tuipet-0.2.415}/tests/test_world.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tuipet
3
- Version: 0.2.413
3
+ Version: 0.2.415
4
4
  Summary: A terminal virtual pet (Digimon V-Pet style) rendered with halfblock sprites, built on data extracted from DVPet.
5
5
  Author-email: Joel Taylor <joeltaylor734@gmail.com>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tuipet"
3
- version = "0.2.413"
3
+ version = "0.2.415"
4
4
  description = "A terminal virtual pet (Digimon V-Pet style) rendered with halfblock sprites, built on data extracted from DVPet."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -250,9 +250,10 @@ class TuiPetApp(App):
250
250
  """
251
251
  # the release-news line (title-screen msg box, first launch per build) --
252
252
  # UPDATE THIS WITH EVERY RELEASE that ships something player-visible
253
- WHATS_NEW = ("The mood bubbles (sun, rain drip, dying) pop whole at head "
254
- "height again -- they were getting cut at the top of the play "
255
- "window.")
253
+ WHATS_NEW = ("Training impacts hit BIG again: the orb-strike explosion is "
254
+ "back to its full 32x16 flash, and the punch drill's Hit!! "
255
+ "banner now takes over the whole window like the battle "
256
+ "banner.")
256
257
 
257
258
  BINDINGS = [
258
259
  # battle + jogress are LOBBY-ONLY (Joel 2026-07-07: "battles and
@@ -1 +1 @@
1
- {"battle_banner": [["01111101111101111101111101111101", "00111000111000111000111000111000", "00010000010000010000010000010000", "00000000000000000000000000000000", "01111001100011110111101100011110", "00000101110001100011001100011000", "01100101101001100011001100011000", "01111001100101100011001100011110", "01100101111101100011001100011000", "01100101100101100011001100011000", "01100101100101100011001100011000", "01111001100101100011000111011110", "00000000000000000000000000000000", "00001000001000001000001000001000", "00011100011100011100011100011100", "10111110111110111110111110111110"], ["10000010000010000010000010000010", "11000111000111000111000111000111", "11101111101111101111101111101111", "11111111111111111111111111111111", "10000110011100001000010011100001", "11111010001110011100110011100111", "10011010010110011100110011100111", "10000110011010011100110011100001", "10011010000010011100110011100111", "10011010011010011100110011100111", "10011010011010011100110011100111", "10000110011010011100111000100001", "11111111111111111111111111111111", "11110111110111110111110111110111", "11100011100011100011100011100011", "01000001000001000001000001000001"]], "battle_vs": [["11111100000000000000000000000000", "11111011111111111111111111111111", "11110111111111111111111111111111", "11101110000000000000000000000000", "11011100000000000000000000000000", "00111000111110011001100110000000", "11110001100110011011000110000000", "11100001100110011110000110000000", "00000001100110011110000110000111", "00000001100110011011000000001111", "00000001111100011001100110011100", "00000000000000000000000000111011", "00000000000000000000000001110111", "11111111111111111111111111101111", "11111111111111111111111111011111", "00000000000000000000000000111111"]], "hit_explosion": [["000000010000010000010000000000", "011000111011011000110110011010", "011111111111111111111111111110", "001111111111111111111111111110", "000111111111111111111111111100", "011111111111111111111111111110", "001111111111001100111111111110", "001111111111100001111111111100", "011111111111001100111111111100", "111111111111000000111111111100", "001111111111101101111111111111", "011111111111111111111111111110", "011111111111111111111111111100", "011111111111111111111111111100", "000111111111111111111111111110", "001111111111111111111111111110", "011111011011101101110111011100", "000000010000000000000000000100"], ["0000001000000010000000", "0000001100000110000000", "0000001111111110000000", "0000000111111100000000", "0000001100100110000000", "0000001001110010000000", "0000001111111110000000", "0000000110001100000000", "0000000100000100000000", "0000000010001000000000", "0000000001110000000000", "0000000000000000000000"]]}
1
+ {"battle_banner": [["01111101111101111101111101111101", "00111000111000111000111000111000", "00010000010000010000010000010000", "00000000000000000000000000000000", "01111001100011110111101100011110", "00000101110001100011001100011000", "01100101101001100011001100011000", "01111001100101100011001100011110", "01100101111101100011001100011000", "01100101100101100011001100011000", "01100101100101100011001100011000", "01111001100101100011000111011110", "00000000000000000000000000000000", "00001000001000001000001000001000", "00011100011100011100011100011100", "10111110111110111110111110111110"], ["10000010000010000010000010000010", "11000111000111000111000111000111", "11101111101111101111101111101111", "11111111111111111111111111111111", "10000110011100001000010011100001", "11111010001110011100110011100111", "10011010010110011100110011100111", "10000110011010011100110011100001", "10011010000010011100110011100111", "10011010011010011100110011100111", "10011010011010011100110011100111", "10000110011010011100111000100001", "11111111111111111111111111111111", "11110111110111110111110111110111", "11100011100011100011100011100011", "01000001000001000001000001000001"]], "battle_vs": [["11111100000000000000000000000000", "11111011111111111111111111111111", "11110111111111111111111111111111", "11101110000000000000000000000000", "11011100000000000000000000000000", "00111000111110011001100110000000", "11110001100110011011000110000000", "11100001100110011110000110000000", "00000001100110011110000110000111", "00000001100110011011000000001111", "00000001111100011001100110011100", "00000000000000000000000000111011", "00000000000000000000000001110111", "11111111111111111111111111101111", "11111111111111111111111111011111", "00000000000000000000000000111111"]], "hit_explosion": [["01111101111100000000111110111110", "00011000111001111100011100011000", "10000000010010000010001000000001", "10000000000011101110001000000001", "11000000000010000010000000000011", "10000000000011010110000000000001", "00000000000001111100000000000000", "10000000000001010100000000000001", "11000000001100000001100000000011", "11100000001110000011100000000111", "11000000000011101110000000000011", "10000000000000111000000000000001", "00000000000011101110000000000000", "10000000001110000011100000000001", "10001001001100010001100100010001", "00011011100000111000001110011000"], ["00000010000011111111000001000001", "11100111000110000011100011100111", "01111111101101111101110111111110", "01111111111100010001111111111110", "00111111111101111101111111111100", "01111111111100101001111111111110", "11111111111110000011111111111111", "01111111111110101011111111111110", "00111111110011111110011111111100", "00011111110001111100011111111000", "00111111111100010001111111111100", "01111111111111000111111111111110", "11111111111100010001111111111111", "01111111110001111100011111111110", "01110110110011101110011011101110", "11100100011111000111110001100111"]]}
@@ -524,27 +524,30 @@ class TrainingPanel:
524
524
  # right edge (Devimon spanned x26..41 on the 40px LCD) and the
525
525
  # HIT!! label sat at y0 flush on the top border
526
526
  punching = self._strike_t > 0
527
- bag = _fit_cell(E.get("punching_bag", [None])[0] or [])
528
- bag_x = GRID_X0 + 1 - (1 if punching else 0) # rocks toward (never OUT of) the window
529
- if bag:
530
- placements.append((bag, bag_x, False))
531
- # the pet throws the punches from the window's right edge (LAW
532
- # 2026-07-11: every canon sprite lives inside the 32x16)
533
- pose = self._pose_now(1 if (self.frame_i // 2) % 2 else 0) # idle bob between taps
534
- pf = _crop(self._frame(rec, pose))
535
- pw_ = max(len(r) for r in pf)
536
- px = GRID_X0 + GRID_W - pw_ - (2 if punching else 0) # LUNGE 2px into the punch
537
- overlay.extend(_blit(pf, px, BASE_Y - len(pf))) # grounded; faces left natively
538
- if punching:
539
- # the Hit!! banner (canon hitLabel) POPS OVER the scene for the
540
- # strike beat -- a momentary label, the same class as the
541
- # battle strobe, centred in the window near its top (Joel
542
- # 2026-07-12: dropping it read as a broken render)
543
- hit = E.get("train_hit", [None])[0]
544
- if hit:
545
- hw = max(len(r) for r in hit)
546
- overlay.extend(_blit(hit, GRID_X0 + (GRID_W - hw) // 2,
547
- BAND_TOP + 1))
527
+ hit = E.get("train_hit", [None])[0]
528
+ if punching and hit:
529
+ # the Hit!! banner is a FULL-WINDOW 32x16 banner, staged
530
+ # exactly like the battle start banner (Joel 2026-07-12):
531
+ # the scene YIELDS -- bag and pet step offstage for the
532
+ # strike beat and the banner owns the window. The native
533
+ # 13x5 hitLabel decode at a 2x integer upscale (mechanical,
534
+ # dot-crisp) centred in the band.
535
+ big = ["".join(c * 2 for c in row) for row in hit
536
+ for _ in range(2)]
537
+ bw, bh = max(len(r) for r in big), len(big)
538
+ overlay = _blit(big, GRID_X0 + (GRID_W - bw) // 2,
539
+ BAND_TOP + (BASE_Y - BAND_TOP - bh) // 2)
540
+ else:
541
+ bag = _fit_cell(E.get("punching_bag", [None])[0] or [])
542
+ if bag:
543
+ placements.append((bag, GRID_X0 + 1, False))
544
+ # the pet throws the punches from the window's right edge (LAW
545
+ # 2026-07-11: every canon sprite lives inside the 32x16)
546
+ pose = self._pose_now(1 if (self.frame_i // 2) % 2 else 0) # idle bob between taps
547
+ pf = _crop(self._frame(rec, pose))
548
+ pw_ = max(len(r) for r in pf)
549
+ px = GRID_X0 + GRID_W - pw_
550
+ overlay.extend(_blit(pf, px, BASE_Y - len(pf))) # grounded; faces left natively
548
551
  elif gk == "virus": # DVPet drawVirusPre: pet AND bag HIDDEN
549
552
  # The real DVPet trainBar sprite is a 32-wide TRACK box (cols 0..31) + a separate
550
553
  # goal compartment (cols 32..37) == 38 wide. Crop to the 32-wide track box so it
@@ -782,7 +785,8 @@ class TrainingPanel:
782
785
  overlay, placements, note = [], [], ""
783
786
  if m == "hit": # fullscreen impact strobe, nothing else
784
787
  ex = _EXPLODE[fr["f"]]
785
- ox, oy = max(0, (COLS - len(ex[0])) // 2), max(0, (ph - len(ex)) // 2)
788
+ ox = GRID_X0 + max(0, (GRID_W - len(ex[0])) // 2) # the 32x16 flash fills
789
+ oy = BAND_TOP + max(0, (BASE_Y - BAND_TOP - len(ex)) // 2) # the window exactly
786
790
  overlay = _blit(ex, ox, oy)
787
791
  note = "HIT!"
788
792
  elif m in ("windup", "fire_out", "miss"): # the PET is on screen (right, faces left)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tuipet
3
- Version: 0.2.413
3
+ Version: 0.2.415
4
4
  Summary: A terminal virtual pet (Digimon V-Pet style) rendered with halfblock sprites, built on data extracted from DVPet.
5
5
  Author-email: Joel Taylor <joeltaylor734@gmail.com>
6
6
  License-Expression: MIT
@@ -214,10 +214,11 @@ def test_data_block_flashes_success_pose():
214
214
  assert pan.text().markup != win, "the block tell must differ from plain IDLE"
215
215
 
216
216
 
217
- def test_punch_hit_banner_pops_inside_the_window(monkeypatch):
218
- """The Hit!! banner is BACK (Joel 2026-07-12: dropping it read as a broken
219
- render): on the strike beat it pops over the scene, centred in the window
220
- near its top -- its banner-only columns (the bag/mon gap) light up."""
217
+ def test_punch_hit_banner_takes_over_the_window(monkeypatch):
218
+ """Joel 2026-07-12: the Hit!! banner is a FULL-WINDOW 32x16 banner,
219
+ staged like the battle start banner -- on the strike beat the scene
220
+ YIELDS (no bag, no pet) and the 2x-upscaled banner owns the window;
221
+ between taps the bag/pet scene is back and the banner is gone."""
221
222
  from tuipet import training, grid
222
223
  from tuipet.training import TrainingPanel, GAMES
223
224
  from tuipet.pet import Pet
@@ -225,6 +226,7 @@ def test_punch_hit_banner_pops_inside_the_window(monkeypatch):
225
226
  real = training.render_scene
226
227
 
227
228
  def spy(placements, *a, **kw):
229
+ seen["placements"] = list(placements)
228
230
  seen["overlay"] = list(kw.get("overlay") or [])
229
231
  return real(placements, *a, **kw)
230
232
 
@@ -236,12 +238,71 @@ def test_punch_hit_banner_pops_inside_the_window(monkeypatch):
236
238
  pan._start_game()
237
239
  pan._strike_t = 0
238
240
  pan.text()
239
- gap = [pt for pt in seen["overlay"] if 11 <= pt[0] <= 17 and 7 <= pt[1] <= 12]
240
- assert not gap # idle: the gap is empty
241
+ assert seen["placements"], "between taps: the bag is on stage"
242
+ idle_ov = set(seen["overlay"])
241
243
  pan._strike_t = 3
242
244
  pan._strike_pose = 6
243
245
  pan.text()
244
- gap = [pt for pt in seen["overlay"] if 11 <= pt[0] <= 17 and 7 <= pt[1] <= 12]
245
- assert gap, "the Hit!! banner must pop on the strike beat"
246
+ assert not seen["placements"], "strike beat: the scene yields"
247
+ ov = seen["overlay"]
248
+ assert ov and set(ov) != idle_ov
246
249
  assert all(grid.X0 <= x < grid.X1 and grid.TOP <= y < grid.FLOOR
247
- for x, y in seen["overlay"] if True)
250
+ for x, y in ov)
251
+ w = max(x for x, _ in ov) - min(x for x, _ in ov) + 1
252
+ h = max(y for _, y in ov) - min(y for _, y in ov) + 1
253
+ assert (w, h) == (26, 10), (w, h) # the 2x banner fills the band
254
+ def test_hit_banner_is_the_native_4x_decode():
255
+ """trainHit.png is the ONE training asset authored at 4x -- the blanket
256
+ 3x extraction mushed it to 17x6 (Joel 2026-07-12: 'out of resolution').
257
+ The vendored sprite is the exact 13x5 native decode; a blanket
258
+ re-extraction at F=3 would regress it."""
259
+ from tuipet import data
260
+ hit = data.load_effects()["train_hit"][0]
261
+ assert (max(len(r) for r in hit), len(hit)) == (13, 5)
262
+ assert sum(r.count("1") for r in hit) == 30
263
+ def test_hit_explosion_is_the_sourced_32x16_full_window_flash(monkeypatch):
264
+ """Joel 2026-07-12: the orb-impact explosion is a 32x16 banner-class
265
+ flash, like the battle start banner. It was: commit 852e663 sourced
266
+ hit_explosion from DMU at 32x16 -- the invented-art revert (3d7a6af)
267
+ put back WRONG 30x18/22x12 frames for this one key, undersized AND
268
+ clipped (18 > the 16px band). Pin the sourced frames and that both
269
+ collision paths strobe them alone, filling the window exactly."""
270
+ from tuipet import training, grid
271
+ from tuipet.training import TrainingPanel, GAMES, EXPLODE_FRAMES, _EXPLODE
272
+ from tuipet.pet import Pet
273
+ assert [(max(len(r) for r in f), len(f)) for f in _EXPLODE] \
274
+ == [(32, 16), (32, 16)]
275
+ seen = {}
276
+ real = training.render_scene
277
+
278
+ def spy(placements, *a, **kw):
279
+ seen["placements"] = list(placements)
280
+ seen["overlay"] = list(kw.get("overlay") or [])
281
+ return real(placements, *a, **kw)
282
+
283
+ monkeypatch.setattr(training, "render_scene", spy)
284
+ p = Pet(num=100, stage="Champion", attribute="Vaccine", obedience=500)
285
+ p.compliance = True
286
+
287
+ def full_window():
288
+ xs = [x for x, _ in seen["overlay"]]
289
+ ys = [y for _, y in seen["overlay"]]
290
+ return (min(xs), max(xs), min(ys), max(ys)) \
291
+ == (grid.X0, grid.X1 - 1, grid.TOP, grid.FLOOR - 1)
292
+
293
+ pan = TrainingPanel(p) # data drill collision
294
+ pan.gi = next(i for i, g in enumerate(GAMES) if g[0] == "data")
295
+ pan._start_game()
296
+ pan.strobe_t = EXPLODE_FRAMES
297
+ pan.text()
298
+ assert full_window()
299
+ pan2 = TrainingPanel(p) # strike volley 'hit' beat
300
+ pan2.gi = next(i for i, g in enumerate(GAMES) if g[0] == "hp")
301
+ pan2._start_game()
302
+ pan2.success = True
303
+ pan2._build_strike()
304
+ pan2.phase = "strike"
305
+ pan2.si = next(i for i, fr in enumerate(pan2.strike_tl)
306
+ if fr.get("m") == "hit")
307
+ pan2.text()
308
+ assert not seen["placements"] and full_window()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes