tuipet 0.2.330__tar.gz → 0.2.332__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 (218) hide show
  1. {tuipet-0.2.330/src/tuipet.egg-info → tuipet-0.2.332}/PKG-INFO +1 -1
  2. {tuipet-0.2.330 → tuipet-0.2.332}/pyproject.toml +1 -1
  3. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data.py +27 -0
  4. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/egg.py +5 -1
  5. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/persistence.py +20 -7
  6. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/pet.py +44 -0
  7. {tuipet-0.2.330 → tuipet-0.2.332/src/tuipet.egg-info}/PKG-INFO +1 -1
  8. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet.egg-info/SOURCES.txt +2 -0
  9. tuipet-0.2.332/tests/test_album_dex.py +52 -0
  10. tuipet-0.2.332/tests/test_stage_arrival.py +59 -0
  11. {tuipet-0.2.330 → tuipet-0.2.332}/LICENSE +0 -0
  12. {tuipet-0.2.330 → tuipet-0.2.332}/README.md +0 -0
  13. {tuipet-0.2.330 → tuipet-0.2.332}/setup.cfg +0 -0
  14. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/__init__.py +0 -0
  15. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/adventure.py +0 -0
  16. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/adventurescreen.py +0 -0
  17. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/anim.py +0 -0
  18. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/app.py +0 -0
  19. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/assistscreen.py +0 -0
  20. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/battle.py +0 -0
  21. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/battlefx.py +0 -0
  22. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/battlescreen.py +0 -0
  23. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/cloudsync.py +0 -0
  24. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/attr_icons.json +0 -0
  25. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/backgrounds.json.gz +0 -0
  26. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/battle_overlays.json +0 -0
  27. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/careEffect.csv +0 -0
  28. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/digicoreMenuConfig.csv +0 -0
  29. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/digimon.csv +0 -0
  30. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/dropRate.csv +0 -0
  31. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/effects.json.gz +0 -0
  32. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/eggUnlock.csv +0 -0
  33. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/eggs.json.gz +0 -0
  34. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/elementAffinity.csv +0 -0
  35. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/enemies.csv +0 -0
  36. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/evolutions.csv +0 -0
  37. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/fieldAffinity.csv +0 -0
  38. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/foods.csv +0 -0
  39. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/habitats.csv +0 -0
  40. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/hp_dummies.json +0 -0
  41. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/icons.json.gz +0 -0
  42. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/items.csv +0 -0
  43. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/lines.csv +0 -0
  44. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/lootTable.csv +0 -0
  45. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/maps.csv +0 -0
  46. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/orbs.json.gz +0 -0
  47. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/shopConsumable.csv +0 -0
  48. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/alarm.wav +0 -0
  49. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/angry.wav +0 -0
  50. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/attack.wav +0 -0
  51. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/attackHit.wav +0 -0
  52. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/battle.wav +0 -0
  53. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/cancel.wav +0 -0
  54. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/champion.wav +0 -0
  55. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/click.wav +0 -0
  56. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/compatible.wav +0 -0
  57. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/confirm.wav +0 -0
  58. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/death.wav +0 -0
  59. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/eat.wav +0 -0
  60. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/error.wav +0 -0
  61. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/evolve.wav +0 -0
  62. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/happy.wav +0 -0
  63. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/hatch.wav +0 -0
  64. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/jogress.wav +0 -0
  65. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/largePoop.wav +0 -0
  66. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/lastBite.wav +0 -0
  67. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/lose.wav +0 -0
  68. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/menu.wav +0 -0
  69. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/mischief.wav +0 -0
  70. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/poop.wav +0 -0
  71. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/refuse.wav +0 -0
  72. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/reward.wav +0 -0
  73. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/scroll.wav +0 -0
  74. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/select.wav +0 -0
  75. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/smallPoop.wav +0 -0
  76. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/startBattle.wav +0 -0
  77. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/strongAttack.wav +0 -0
  78. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/strongHit.wav +0 -0
  79. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/trainhit.wav +0 -0
  80. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/wash.wav +0 -0
  81. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/win.wav +0 -0
  82. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sounds/wind.wav +0 -0
  83. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/sprites.json.gz +0 -0
  84. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/tournies.csv +0 -0
  85. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/towns.csv +0 -0
  86. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/data/zones.csv +0 -0
  87. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/deathscreen.py +0 -0
  88. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/digicorescreen.py +0 -0
  89. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/dnascreen.py +0 -0
  90. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/eggselectscreen.py +0 -0
  91. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/evolution.py +0 -0
  92. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/feedscreen.py +0 -0
  93. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/grid.py +0 -0
  94. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/habitatscreen.py +0 -0
  95. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/jogress.py +0 -0
  96. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/jogressscreen.py +0 -0
  97. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/lines.py +0 -0
  98. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/lobbyscreen.py +0 -0
  99. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/loot.py +0 -0
  100. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/menu.py +0 -0
  101. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/net.py +0 -0
  102. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/optionsscreen.py +0 -0
  103. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/placeholder.py +0 -0
  104. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/render.py +0 -0
  105. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/shop.py +0 -0
  106. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/shopscreen.py +0 -0
  107. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/sound.py +0 -0
  108. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/strikefx.py +0 -0
  109. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/theme.py +0 -0
  110. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/themescreen.py +0 -0
  111. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/titlescreen.py +0 -0
  112. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/tournament.py +0 -0
  113. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/tournamentscreen.py +0 -0
  114. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/townscreen.py +0 -0
  115. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/training.py +0 -0
  116. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/transportscreen.py +0 -0
  117. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/update.py +0 -0
  118. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet/weather.py +0 -0
  119. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet.egg-info/dependency_links.txt +0 -0
  120. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet.egg-info/entry_points.txt +0 -0
  121. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet.egg-info/requires.txt +0 -0
  122. {tuipet-0.2.330 → tuipet-0.2.332}/src/tuipet.egg-info/top_level.txt +0 -0
  123. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_adventure.py +0 -0
  124. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_adventure_math.py +0 -0
  125. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_adventure_scenery.py +0 -0
  126. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_anim_canon.py +0 -0
  127. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_anim_timing.py +0 -0
  128. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_announce.py +0 -0
  129. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_audit_fixes.py +0 -0
  130. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_auto_care.py +0 -0
  131. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_battle.py +0 -0
  132. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_battle_math.py +0 -0
  133. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_bedtime.py +0 -0
  134. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_birthday.py +0 -0
  135. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_body_math.py +0 -0
  136. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_care_asleep.py +0 -0
  137. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_care_bonus.py +0 -0
  138. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_data.py +0 -0
  139. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_dead_gate.py +0 -0
  140. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_death.py +0 -0
  141. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_digicore.py +0 -0
  142. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_digimemory.py +0 -0
  143. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_discipline.py +0 -0
  144. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_effects_integrity.py +0 -0
  145. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_egg_economy.py +0 -0
  146. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_egg_unlock.py +0 -0
  147. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_egg_unlock_math.py +0 -0
  148. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_energy_system.py +0 -0
  149. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_evolution.py +0 -0
  150. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_evolution_math.py +0 -0
  151. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_evolution_system.py +0 -0
  152. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_feed.py +0 -0
  153. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_feeding_math.py +0 -0
  154. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_filth_system.py +0 -0
  155. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_fx.py +0 -0
  156. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_gift_birthday_math.py +0 -0
  157. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_habitat.py +0 -0
  158. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_habitat_math.py +0 -0
  159. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_hud.py +0 -0
  160. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_hunger.py +0 -0
  161. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_item_effects.py +0 -0
  162. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_item_heal.py +0 -0
  163. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_jogress.py +0 -0
  164. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_jogress_math.py +0 -0
  165. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_line_curation.py +0 -0
  166. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_lines.py +0 -0
  167. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_lobby.py +0 -0
  168. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_lobby_screens.py +0 -0
  169. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_medicine.py +0 -0
  170. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_messages.py +0 -0
  171. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_mood_system.py +0 -0
  172. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_mortality_math.py +0 -0
  173. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_msg_strip.py +0 -0
  174. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_nav_quit.py +0 -0
  175. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_night_palette.py +0 -0
  176. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_obedience_system.py +0 -0
  177. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_options.py +0 -0
  178. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_panel_smoke.py +0 -0
  179. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_performance.py +0 -0
  180. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_persistence.py +0 -0
  181. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_persistence_audit.py +0 -0
  182. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_pet_effect.py +0 -0
  183. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_poop_model.py +0 -0
  184. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_poop_placement.py +0 -0
  185. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_protocol_math.py +0 -0
  186. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_rank_system.py +0 -0
  187. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_refusal.py +0 -0
  188. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_refusal_math.py +0 -0
  189. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_robustness.py +0 -0
  190. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_save_integrity.py +0 -0
  191. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_screen_sweep.py +0 -0
  192. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sfx_scroll.py +0 -0
  193. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_shop.py +0 -0
  194. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_shop_economy.py +0 -0
  195. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_shop_math.py +0 -0
  196. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sickness_system.py +0 -0
  197. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sleep.py +0 -0
  198. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sleep_system.py +0 -0
  199. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sleep_weather_math.py +0 -0
  200. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sound.py +0 -0
  201. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_status_box.py +0 -0
  202. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_status_icons.py +0 -0
  203. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_sync.py +0 -0
  204. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_theme.py +0 -0
  205. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_toilet.py +0 -0
  206. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_tournament.py +0 -0
  207. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_town.py +0 -0
  208. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training.py +0 -0
  209. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training_facing.py +0 -0
  210. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training_hp.py +0 -0
  211. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training_math.py +0 -0
  212. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training_strike.py +0 -0
  213. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_training_system.py +0 -0
  214. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_ui_stats.py +0 -0
  215. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_update.py +0 -0
  216. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_verx.py +0 -0
  217. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_weight_system.py +0 -0
  218. {tuipet-0.2.330 → tuipet-0.2.332}/tests/test_win_eggs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tuipet
3
- Version: 0.2.330
3
+ Version: 0.2.332
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.330"
3
+ version = "0.2.332"
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"
@@ -389,6 +389,33 @@ def assist_pool():
389
389
  return sorted(n for n, r in load_requirements().items() if r.get("can_assist"))
390
390
 
391
391
 
392
+ @lru_cache(maxsize=1)
393
+ def _name_canonical_map():
394
+ """num -> the CANONICAL (lowest) num among same-name roster rows. DVPet
395
+ stores duplicate species rows (the 1410+ egg-hatch block mirrors the
396
+ chart's canonical rows) and its dex sync is BY NAME: checkNaturalUnlocked
397
+ propagates `unlocked` across every same-name row, so a form raised under
398
+ either num reveals both (album/dex audit 2026-07-06). Empty names stay
399
+ themselves -- never lump the unnamed rows into one group."""
400
+ _, by_num = load_sprites()
401
+ groups = {}
402
+ for n, rec in by_num.items():
403
+ nm = (rec.get("name") or "").upper()
404
+ if nm:
405
+ groups.setdefault(nm, []).append(n)
406
+ out = {}
407
+ for ns in groups.values():
408
+ c = min(ns)
409
+ for n in ns:
410
+ out[n] = c
411
+ return out
412
+
413
+
414
+ def canonical_num(num):
415
+ """The name-canonical roster num (checkNaturalUnlocked's identity)."""
416
+ return _name_canonical_map().get(num, num)
417
+
418
+
392
419
  @lru_cache(maxsize=1)
393
420
  def _canonical_habitat_by_name():
394
421
  """DVPet stores duplicate species rows: the egg-hatch duplicates carry
@@ -121,7 +121,11 @@ def _conditions_met(rule, prog):
121
121
  return False
122
122
  if rule["map"] is not None and rule["map"] not in prog["maps"]:
123
123
  return False
124
- if rule["history"] and not all(n in prog["album"] for n in rule["history"]):
124
+ if rule["history"] and not all(data.canonical_num(n) in prog["album"]
125
+ for n in rule["history"]):
126
+ # name-canonical both sides (album/dex audit 2026-07-06): raising
127
+ # ChibiKiwimon as its 1432 hatch-twin satisfies a 944 history gate,
128
+ # exactly like canon's checkNaturalUnlocked name sync
125
129
  return False
126
130
  if rule["prev_field"] is not None and prog["last_field"] != rule["prev_field"]:
127
131
  return False
@@ -51,8 +51,14 @@ def save_settings(d, path=None):
51
51
 
52
52
 
53
53
  def get_album():
54
- """Set of distinct Digimon species nums ever raised (the DM20-style zukan)."""
55
- return set(load_settings().get("progress", {}).get("album", []))
54
+ """Set of distinct Digimon species ever raised, NAME-CANONICAL (the
55
+ DM20-style zukan). DVPet's dex sync is by name (checkNaturalUnlocked):
56
+ the 1410+ egg-hatch duplicate rows and their chart twins reveal together
57
+ -- old saves may hold either num, so entries canonicalize on read
58
+ (album/dex audit 2026-07-06)."""
59
+ from . import data
60
+ return {data.canonical_num(n)
61
+ for n in load_settings().get("progress", {}).get("album", [])}
56
62
 
57
63
 
58
64
  def get_wins():
@@ -65,15 +71,22 @@ _ALBUM_SEEN = set() # in-memory mirror: the 10s autosave was re-reading
65
71
 
66
72
 
67
73
  def album_seen(num):
68
- """Has ANY generation been this form? (canon Evolution.setUnlocked --
69
- the dex reveal state the hidden-evolution mask keys on)."""
74
+ """Has ANY generation been this form -- under EITHER of its name-twin nums?
75
+ (canon Evolution.setUnlocked + checkNaturalUnlocked: the dex reveal state
76
+ the hidden-evolution mask keys on, synced across same-name rows)."""
77
+ from . import data
78
+ num = data.canonical_num(num)
70
79
  if num in _ALBUM_SEEN:
71
80
  return True
72
- return num in set(load_settings().get("progress", {}).get("album", []))
81
+ return num in get_album()
73
82
 
74
83
 
75
84
  def album_add(num):
76
- if num is None or num < 0 or num in _ALBUM_SEEN:
85
+ if num is None or num < 0:
86
+ return
87
+ from . import data
88
+ num = data.canonical_num(num) # store the name-canonical identity
89
+ if num in _ALBUM_SEEN:
77
90
  return
78
91
  _ALBUM_SEEN.add(num)
79
92
  d = load_settings()
@@ -277,7 +290,7 @@ def get_progress():
277
290
  prog = _prog()
278
291
  last = prog.get("last_gen", {}) or {}
279
292
  return {
280
- "album": set(prog.get("album", [])),
293
+ "album": get_album(), # name-canonical (the egg gates match on it)
281
294
  "wins": int(prog.get("wins", 0)),
282
295
  "mega_kills": int(prog.get("mega_kills", 0)),
283
296
  "max_gen": int(prog.get("max_gen", 1)),
@@ -155,6 +155,16 @@ ITEM_INTEREST_HIGH_TIMER = 80 # ItemInterestHighTimer (disposition -1)
155
155
  PERSONALITY_MOOD_MATCH = 10 # ConsumablePersonalityMatchMoodChange
156
156
  PERSONALITY_MOOD_UNMATCH = -10 # ConsumablePersonalityUnmatchMoodChange
157
157
  EGG_MOOD = 100 # EggMood: a new egg starts warm (Evolution.egg)
158
+ # Evolution.java per-stage ARRIVAL setters (egg/hatch audit 2026-07-06; the
159
+ # shipped ranges are all min==max -> deterministic)
160
+ FRESH_MOOD = -10 # FreshMood: born grumpy (it's a newborn)
161
+ FRESH_OBEDIENCE = 75 # FreshObedienceMin/Max: born TRUSTING
162
+ START_NUTRITION = 6 # StartProtein/StartMineral/StartVitamin
163
+ IN_TRAINING_OBEDIENCE = 50 # InTrainingObedienceMin/Max: toddler rebellion cap
164
+ IN_TRAINING_SLEEP_LAPSE = 360 # InTrainingSleepLapse: wakes with real bedtime pressure
165
+ ROOKIE_OBED_GOOD = 50 # RookieGoodObedience (Happy daily majority)
166
+ ROOKIE_OBED_DEFAULT = 25 # RookieDefaultObedience (Neutral majority)
167
+ ROOKIE_OBED_BAD = 0 # RookieBadObedience (anything else, ties included)
158
168
  # the missed-day / birthday system (setTimeToAge): each game day of AGE the pet
159
169
  # has a birthday judged by the day's MAJOR mood and its missed-day tally
160
170
  MOOD_RECORD_MIN = 5 # MoodRecordMin: sample the mood tier every 5 game-min
@@ -2411,6 +2421,40 @@ class Pet:
2411
2421
  def evolve_to(self, num):
2412
2422
  was_young = self.stage in ("Egg", "Fresh", "InTraining", "Rookie")
2413
2423
  _req = self._become(num)
2424
+ # Evolution.java's per-stage ARRIVAL setters (egg/hatch audit
2425
+ # 2026-07-06 -- none of these were ported; the missing fresh()
2426
+ # obedience 75 was the deepest root of the misbehaving-babies era):
2427
+ if self.stage == "Fresh":
2428
+ # fresh(): born TRUSTING (obedience 75) but grumpy (-10 mood),
2429
+ # hungry, full of energy, with a starter nutrition base 6/6/6
2430
+ lo, hi = self.ideal_temp
2431
+ self.temp = (lo + hi) // 2
2432
+ self._set_mood(FRESH_MOOD)
2433
+ self._set_obedience(FRESH_OBEDIENCE)
2434
+ self.strength = 0
2435
+ self.hunger = 0
2436
+ self.energy = self.max_energy
2437
+ self.nutr_protein = self.nutr_mineral = self.nutr_vitamin = START_NUTRITION
2438
+ elif self.stage == "InTraining":
2439
+ # inTraining(): toddler rebellion -- obedience above 50 KNOCKS
2440
+ # BACK to 50; it wakes with the lights on and real bedtime
2441
+ # pressure (sleepLapse 360)
2442
+ if self.obedience > IN_TRAINING_OBEDIENCE:
2443
+ self._set_obedience(IN_TRAINING_OBEDIENCE)
2444
+ self.asleep, self.nap = False, False
2445
+ self.lights = True
2446
+ self.sleep_lapse = IN_TRAINING_SLEEP_LAPSE
2447
+ elif self.stage == "Rookie":
2448
+ # rookie(): the childhood report card SETS obedience -- a Happy
2449
+ # daily-mood majority earns 50, Neutral 25, anything else 0
2450
+ # (a TIE is Mood.None -> the switch default -> bad, canon exact)
2451
+ counts = self.daily_mood
2452
+ best = max(counts.values()) if counts else 0
2453
+ tops = [k for k, v in counts.items() if v == best and best > 0]
2454
+ major = tops[0] if len(tops) == 1 else None
2455
+ self._set_obedience(ROOKIE_OBED_GOOD if major == "Happy"
2456
+ else ROOKIE_OBED_DEFAULT if major == "Neutral"
2457
+ else ROOKIE_OBED_BAD)
2414
2458
  if was_young and self.stage == "Champion":
2415
2459
  # randOnChampion (taste/rank audit 2026-07-06): the childhood-care
2416
2460
  # tally becomes the adult temperament
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tuipet
3
- Version: 0.2.330
3
+ Version: 0.2.332
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
@@ -119,6 +119,7 @@ src/tuipet/data/sounds/wind.wav
119
119
  tests/test_adventure.py
120
120
  tests/test_adventure_math.py
121
121
  tests/test_adventure_scenery.py
122
+ tests/test_album_dex.py
122
123
  tests/test_anim_canon.py
123
124
  tests/test_anim_timing.py
124
125
  tests/test_announce.py
@@ -194,6 +195,7 @@ tests/test_sleep.py
194
195
  tests/test_sleep_system.py
195
196
  tests/test_sleep_weather_math.py
196
197
  tests/test_sound.py
198
+ tests/test_stage_arrival.py
197
199
  tests/test_status_box.py
198
200
  tests/test_status_icons.py
199
201
  tests/test_sync.py
@@ -0,0 +1,52 @@
1
+ """Album/dex — canon Evolution.setUnlocked at digivolve + checkNaturalUnlocked's
2
+ NAME sync across duplicate roster rows (the 1410+ egg-hatch block mirrors the
3
+ chart's canonical rows), persisted device-lifetime (saves/Shared/tree.txt ->
4
+ tuipet's settings progress channel). Audit 2026-07-06."""
5
+ from tuipet import data, persistence
6
+ from tuipet.egg import _conditions_met
7
+
8
+
9
+ def test_name_twins_share_one_canonical_num():
10
+ assert data.canonical_num(1432) == data.canonical_num(944) == 944 # ChibiKiwimon
11
+ assert data.canonical_num(1410) == 1 # Yukimibotamon
12
+ assert data.canonical_num(100) == data.canonical_num(100) # stable
13
+ assert data.canonical_num(999999) == 999999 # unknown: identity
14
+
15
+
16
+ def test_the_album_records_and_reveals_by_name():
17
+ """Raising a form under its hatch-twin num reveals BOTH (canon
18
+ checkNaturalUnlocked): the album stores the canonical identity and
19
+ album_seen answers for either alias."""
20
+ persistence.album_add(1432) # lived as the hatch twin
21
+ assert persistence.album_seen(944) # ...the chart row is revealed
22
+ assert persistence.album_seen(1432)
23
+ assert 944 in persistence.get_album() and 1432 not in persistence.get_album()
24
+
25
+
26
+ def test_old_raw_entries_canonicalize_on_read():
27
+ """Existing saves may hold duplicate-block nums from before the sync --
28
+ get_album() canonicalizes on read, no migration needed."""
29
+ d = persistence.load_settings()
30
+ d.setdefault("progress", {})["album"] = [1410, 102] # an old-save shape
31
+ persistence.save_settings(d)
32
+ persistence._ALBUM_SEEN.clear()
33
+ assert persistence.get_album() == {1, 102}
34
+ assert persistence.album_seen(1) # the chart twin answers
35
+
36
+
37
+ def test_the_chibikiwimon_gate_accepts_either_twin():
38
+ """Egg 22's unlock history demands num 944 -- raising ChibiKiwimon from
39
+ its own egg (which hatches 1432) must satisfy it, like canon's name sync
40
+ (the exact stranding this audit found)."""
41
+ rule = data.load_egg_unlock()[22]
42
+ assert rule["history"] == [944]
43
+ prog = {"album": {944}, "wins": 10**9, "mega_kills": 10**9, "max_gen": 99,
44
+ "max_stage": 99, "xanti_ever": True, "maps": set(range(99)),
45
+ "tourneys": set(range(999)), "last_field": rule.get("prev_field"),
46
+ "last_xanti": True, "last_attribute": rule.get("prev_attribute"),
47
+ "last_element": rule.get("prev_element")}
48
+ # the album arrives canonicalized (get_album) -- 1432 stored old-style
49
+ # resolves to 944; simulate both shapes through the gate:
50
+ assert _conditions_met(rule, dict(prog, album={data.canonical_num(1432)}))
51
+ assert _conditions_met(rule, dict(prog, album={944}))
52
+ assert not _conditions_met(rule, dict(prog, album={1}))
@@ -0,0 +1,59 @@
1
+ """Evolution.java's per-stage ARRIVAL setters (egg/hatch audit 2026-07-06):
2
+ fresh()/inTraining()/rookie() SET the newcomer's state on top of digivolve --
3
+ the missing fresh() obedience 75 was the deepest root of the misbehaving-
4
+ babies era (canon babies are born TRUSTING; the 0 was pre-hatch defaultData)."""
5
+ from tuipet.pet import (Pet, FRESH_MOOD, FRESH_OBEDIENCE, START_NUTRITION,
6
+ IN_TRAINING_OBEDIENCE, IN_TRAINING_SLEEP_LAPSE,
7
+ ROOKIE_OBED_GOOD, ROOKIE_OBED_DEFAULT, ROOKIE_OBED_BAD)
8
+
9
+
10
+ def _egg():
11
+ p = Pet.new_egg(egg_type=0)
12
+ p.world_seconds = 10 * 60.0
13
+ return p
14
+
15
+
16
+ def test_a_hatchling_is_born_trusting_grumpy_and_hungry():
17
+ p = _egg()
18
+ p.hatching = True
19
+ p._hatch_t = 0.0
20
+ assert p.advance_hatch(0.1) # the egg hatches
21
+ assert p.stage == "Fresh"
22
+ assert p.obedience == FRESH_OBEDIENCE == 75 # born trusting
23
+ assert p.mood == FRESH_MOOD == -10 # ...and grumpy
24
+ assert p.hunger == 0 and p.strength == 0 # born hungry, no effort yet
25
+ assert p.energy == p.max_energy # full of beans
26
+ assert (p.nutr_protein, p.nutr_mineral, p.nutr_vitamin) == (6, 6, 6)
27
+ lo, hi = p.ideal_temp
28
+ assert p.temp == (lo + hi) // 2
29
+
30
+
31
+ def test_intraining_arrival_is_the_toddler_rebellion():
32
+ p = Pet(num=2, stage="Fresh", attribute="Vaccine")
33
+ p.world_seconds = 10 * 60.0
34
+ p.obedience = 75
35
+ p.asleep, p.lights = True, False
36
+ p.evolve_to(12) # any InTraining form
37
+ assert p.stage == "InTraining"
38
+ assert p.obedience == IN_TRAINING_OBEDIENCE == 50 # knocked back down
39
+ assert not p.asleep and p.lights # wakes, lights on
40
+ assert p.sleep_lapse == IN_TRAINING_SLEEP_LAPSE == 360
41
+ q = Pet(num=2, stage="Fresh", attribute="Vaccine")
42
+ q.world_seconds = 10 * 60.0
43
+ q.obedience = 10
44
+ q.evolve_to(12)
45
+ assert q.obedience == 10 # only re-set when ABOVE the cap
46
+
47
+
48
+ def test_rookie_arrival_grades_the_childhood():
49
+ for moods, want in ((dict(Happy=5, Neutral=1), ROOKIE_OBED_GOOD),
50
+ (dict(Neutral=5, Happy=1), ROOKIE_OBED_DEFAULT),
51
+ (dict(Unhappy=5), ROOKIE_OBED_BAD),
52
+ (dict(Happy=3, Neutral=3), ROOKIE_OBED_BAD)): # a TIE is Mood.None -> bad
53
+ p = Pet(num=12, stage="InTraining", attribute="Vaccine")
54
+ p.world_seconds = 10 * 60.0
55
+ p.obedience = 99
56
+ for k, v in moods.items():
57
+ p.daily_mood[k] = v
58
+ p.evolve_to(25) # any Rookie form
59
+ assert p.obedience == want, (moods, p.obedience)
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
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