frontengine 1.0.15__tar.gz → 1.0.17__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 (136) hide show
  1. {frontengine-1.0.15 → frontengine-1.0.17}/PKG-INFO +1 -1
  2. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/pet/desktop_pet.py +100 -2
  3. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/user_setting/user_setting_file.py +3 -0
  4. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/multi_language/english.py +2 -0
  5. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/multi_language/traditional_chinese.py +2 -0
  6. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine.egg-info/PKG-INFO +1 -1
  7. {frontengine-1.0.15 → frontengine-1.0.17}/pyproject.toml +1 -1
  8. {frontengine-1.0.15 → frontengine-1.0.17}/LICENSE +0 -0
  9. {frontengine-1.0.15 → frontengine-1.0.17}/README.md +0 -0
  10. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/__init__.py +0 -0
  11. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/__main__.py +0 -0
  12. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/__init__.py +0 -0
  13. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/base_widget.py +0 -0
  14. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/gif/__init__.py +0 -0
  15. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/gif/paint_gif.py +0 -0
  16. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/image/__init__.py +0 -0
  17. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/image/paint_image.py +0 -0
  18. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/load/__init__.py +0 -0
  19. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/load/load_someone_make_ui.py +0 -0
  20. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/overlay_factory.py +0 -0
  21. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/particle/__init__.py +0 -0
  22. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/particle/particle_ui.py +0 -0
  23. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/pet/__init__.py +0 -0
  24. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/scene/__init__.py +0 -0
  25. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/scene/extend_graphic_scene.py +0 -0
  26. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/scene/extend_graphic_view.py +0 -0
  27. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/scene/scene.py +0 -0
  28. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/sound_player/__init__.py +0 -0
  29. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/sound_player/sound_effect.py +0 -0
  30. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/sound_player/sound_player.py +0 -0
  31. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/text/__init__.py +0 -0
  32. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/text/draw_text.py +0 -0
  33. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/video/__init__.py +0 -0
  34. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/video/video_player.py +0 -0
  35. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/web/__init__.py +0 -0
  36. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/web/webview.py +0 -0
  37. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/show/window_helpers.py +0 -0
  38. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/system_tray/__init__.py +0 -0
  39. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/system_tray/extend_system_tray.py +0 -0
  40. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/__init__.py +0 -0
  41. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/color/__init__.py +0 -0
  42. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/color/global_color.py +0 -0
  43. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/dialog/__init__.py +0 -0
  44. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
  45. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/dialog/hotkey_settings_dialog.py +0 -0
  46. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/dialog/save_file_dialog.py +0 -0
  47. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/main_ui.py +0 -0
  48. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/menu/__init__.py +0 -0
  49. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/menu/help_menu.py +0 -0
  50. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/menu/how_to_menu.py +0 -0
  51. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/menu/language_menu.py +0 -0
  52. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/menu/preset_menu.py +0 -0
  53. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/menu/settings_menu.py +0 -0
  54. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/__init__.py +0 -0
  55. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/control_center/__init__.py +0 -0
  56. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/control_center/control_center_ui.py +0 -0
  57. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/gif/__init__.py +0 -0
  58. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
  59. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/image/__init__.py +0 -0
  60. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/image/image_setting_ui.py +0 -0
  61. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/particle/__init__.py +0 -0
  62. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/particle/particle_setting_ui.py +0 -0
  63. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/pet/__init__.py +0 -0
  64. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/pet/pet_setting_ui.py +0 -0
  65. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/__init__.py +0 -0
  66. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
  67. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/scene_page/__init__.py +0 -0
  68. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/scene_page/base_scene_page.py +0 -0
  69. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
  70. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
  71. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/scene_page/registry.py +0 -0
  72. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
  73. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
  74. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
  75. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
  76. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
  77. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/sound_player/__init__.py +0 -0
  78. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
  79. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/text/__init__.py +0 -0
  80. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/text/text_setting_ui.py +0 -0
  81. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/utils.py +0 -0
  82. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/video/__init__.py +0 -0
  83. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/video/video_setting_ui.py +0 -0
  84. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/web/__init__.py +0 -0
  85. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/ui/page/web/web_setting_ui.py +0 -0
  86. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/user_setting/__init__.py +0 -0
  87. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/user_setting/preset_repository.py +0 -0
  88. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/user_setting/scene_setting.py +0 -0
  89. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/__init__.py +0 -0
  90. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/browser/__init__.py +0 -0
  91. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/browser/browser.py +0 -0
  92. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/critical_exit/__init__.py +0 -0
  93. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
  94. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/critical_exit/critical_exit.py +0 -0
  95. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/critical_exit/win32_vk.py +0 -0
  96. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/exception/__init__.py +0 -0
  97. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/exception/exception_tags.py +0 -0
  98. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/exception/exceptions.py +0 -0
  99. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/file/__init__.py +0 -0
  100. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/file/open/__init__.py +0 -0
  101. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/file/open/open_file.py +0 -0
  102. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/file/save/__init__.py +0 -0
  103. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/file/save/save_file.py +0 -0
  104. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/hotkey/__init__.py +0 -0
  105. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/hotkey/hotkey_service.py +0 -0
  106. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/json/__init__.py +0 -0
  107. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/json/json_file.py +0 -0
  108. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/json/json_repository.py +0 -0
  109. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/json_format/__init__.py +0 -0
  110. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/json_format/json_process.py +0 -0
  111. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/logging/__init__.py +0 -0
  112. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/logging/loggin_instance.py +0 -0
  113. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/multi_language/__init__.py +0 -0
  114. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/multi_language/france.py +0 -0
  115. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/multi_language/germany.py +0 -0
  116. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/multi_language/italy.py +0 -0
  117. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/multi_language/language_wrapper.py +0 -0
  118. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/multi_language/russian.py +0 -0
  119. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/multi_language/simplified_chinese.py +0 -0
  120. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/preset_schedule/__init__.py +0 -0
  121. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/preset_schedule/preset_schedule_service.py +0 -0
  122. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/redirect_manager/__init__.py +0 -0
  123. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
  124. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/smart_pause/__init__.py +0 -0
  125. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/smart_pause/smart_pause_service.py +0 -0
  126. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/theme_schedule/__init__.py +0 -0
  127. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/theme_schedule/theme_schedule_service.py +0 -0
  128. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/utils/web_url.py +0 -0
  129. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/worker/__init__.py +0 -0
  130. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine/worker/qthread_worker.py +0 -0
  131. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine.egg-info/SOURCES.txt +0 -0
  132. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine.egg-info/dependency_links.txt +0 -0
  133. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine.egg-info/entry_points.txt +0 -0
  134. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine.egg-info/requires.txt +0 -0
  135. {frontengine-1.0.15 → frontengine-1.0.17}/frontengine.egg-info/top_level.txt +0 -0
  136. {frontengine-1.0.15 → frontengine-1.0.17}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frontengine
3
- Version: 1.0.15
3
+ Version: 1.0.17
4
4
  Summary: FrontEngine is use-define frontview or only use like screen saver
5
5
  Author-email: JE-Chen <jechenmailman@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/FrontEngine
@@ -144,6 +144,30 @@ def windows_platforms(exclude_hwnds=()) -> list:
144
144
  return []
145
145
 
146
146
 
147
+ def idle_seconds():
148
+ """
149
+ 回傳使用者未操作的秒數;無法取得時回傳 None。僅 Windows 實作。
150
+ Seconds since the last user input, or None when unavailable (Windows only).
151
+ """
152
+ if sys.platform != "win32":
153
+ return None
154
+ try:
155
+ import ctypes
156
+
157
+ class _LASTINPUTINFO(ctypes.Structure):
158
+ _fields_ = [("cbSize", ctypes.c_uint), ("dwTime", ctypes.c_uint)]
159
+
160
+ info = _LASTINPUTINFO()
161
+ info.cbSize = ctypes.sizeof(info)
162
+ if not ctypes.windll.user32.GetLastInputInfo(ctypes.byref(info)):
163
+ return None
164
+ elapsed_ms = ctypes.windll.kernel32.GetTickCount() - info.dwTime
165
+ return max(0.0, elapsed_ms / 1000.0)
166
+ except Exception as error: # pragma: no cover - Win32 boundary
167
+ front_engine_logger.warning(f"[idle_seconds] error: {error!r}")
168
+ return None
169
+
170
+
147
171
  def pop_due_reminders(now, reminders):
148
172
  """
149
173
  依 now 分出已到期與未到期的提醒。reminders 為 (due_datetime, text) 清單。
@@ -266,6 +290,34 @@ class PetMood:
266
290
  return self.CONTENT
267
291
 
268
292
 
293
+ class PetGrowth:
294
+ """
295
+ 親密度累積與等級:互動會累加親密度,跨過門檻即升級。
296
+ Affection points accrue from interactions; crossing a threshold levels up.
297
+ """
298
+
299
+ THRESHOLDS = (0, 100, 250, 500, 1000, 2000)
300
+
301
+ def __init__(self, affection: int = 0) -> None:
302
+ self.affection = self._clamp(affection)
303
+
304
+ @staticmethod
305
+ def _clamp(value) -> int:
306
+ try:
307
+ return max(0, int(value))
308
+ except (TypeError, ValueError):
309
+ return 0
310
+
311
+ def level(self) -> int:
312
+ return max(1, sum(1 for threshold in self.THRESHOLDS if self.affection >= threshold))
313
+
314
+ def add(self, amount: int) -> bool:
315
+ """累加親密度;若因此升級回傳 True。"""
316
+ before = self.level()
317
+ self.affection = self._clamp(self.affection + int(amount))
318
+ return self.level() > before
319
+
320
+
269
321
  class PetHunger:
270
322
  """
271
323
  寵物飽足值 0~100:餵食上升、隨時間下降;level() 回傳 full/ok/hungry。
@@ -646,6 +698,12 @@ class PetMotion:
646
698
  self._idle_count = 0
647
699
  self._new_state(force_walk=True)
648
700
 
701
+ def sleep(self) -> None:
702
+ """讓寵物進入睡眠(使用者閒置時呼叫)/ Put the pet to sleep."""
703
+ self.state = STATE_SLEEP
704
+ self._state_ticks = self._rng.randint(300, 600)
705
+ self.follow_target_x = None
706
+
649
707
  # --- free wander ---
650
708
  def _step_wander(self, left, top, right, bottom) -> Tuple[int, int]:
651
709
  if abs(self.vy) < 1e-9:
@@ -738,6 +796,7 @@ class DesktopPetWidget(BaseWidget):
738
796
  self._mood = PetMood(user_setting_dict.get("pet_mood", 60))
739
797
  self._hunger = PetHunger(user_setting_dict.get("pet_hunger", 70))
740
798
  self._hunger_warned = False
799
+ self._growth = PetGrowth(user_setting_dict.get("pet_affection", 0))
741
800
  self._messages = self._load_messages()
742
801
  self._sound: Optional[QSoundEffect] = None
743
802
  self._init_sound(sound_path)
@@ -750,6 +809,9 @@ class DesktopPetWidget(BaseWidget):
750
809
  # 電量提醒 / Low-battery reaction
751
810
  self._battery_provider = read_battery
752
811
  self._battery_warned = False
812
+ # 閒置反應 / Idle reaction
813
+ self._idle_provider = idle_seconds
814
+ self._idle_reacted = False
753
815
  # 提醒事項 / Reminders
754
816
  self._now_provider = datetime.now
755
817
  self._reminders: list = []
@@ -816,6 +878,7 @@ class DesktopPetWidget(BaseWidget):
816
878
  self.motion.clear_follow()
817
879
  if self._talk and not self._peer_greeted:
818
880
  self._peer_greeted = True
881
+ self._gain_affection(3)
819
882
  self.motion.vx = abs(self.motion.vx) if peer[0] >= my_center[0] else -abs(self.motion.vx)
820
883
  pool = self._messages.get("meet") or []
821
884
  if pool:
@@ -907,9 +970,20 @@ class DesktopPetWidget(BaseWidget):
907
970
  "battery": lines("pet_chatter_battery", "Battery's low - plug me in?|Low power!|Find a charger?"),
908
971
  "hungry": lines("pet_chatter_hungry", "I'm hungry...|Got a snack?|Feed me?"),
909
972
  "fed": lines("pet_chatter_fed", "Yum!|Thank you!|Delicious!"),
973
+ "away": lines("pet_chatter_away", "Still there?|I'll nap till you're back~|Zzz..."),
974
+ "levelup": lines("pet_chatter_levelup", "Level up!|I'm growing!|We're getting closer!"),
910
975
  "any": lines("pet_chatter_any", "Hi there!|(^_^)|Keep going!"),
911
976
  }
912
977
 
978
+ def _gain_affection(self, amount: int) -> None:
979
+ """互動累加親密度;升級時慶祝一下並保存。"""
980
+ leveled = self._growth.add(amount)
981
+ user_setting_dict["pet_affection"] = self._growth.affection
982
+ if leveled and self._talk:
983
+ pool = self._messages.get("levelup") or []
984
+ if pool:
985
+ self.say(pool[self._chatter_rng.randrange(len(pool))])
986
+
913
987
  def _persist_mood(self) -> None:
914
988
  user_setting_dict["pet_mood"] = self._mood.value
915
989
 
@@ -973,11 +1047,33 @@ class DesktopPetWidget(BaseWidget):
973
1047
  self._mood.decay() # a little neglect over time
974
1048
  self._hunger.decay()
975
1049
  self._persist_mood()
976
- # priority: low battery, then hunger, otherwise normal chatter
977
- if not self._warn_battery() and not self._warn_hungry():
1050
+ # priority: user idle (nap), low battery, hunger, otherwise normal chatter
1051
+ if not self._check_idle() and not self._warn_battery() and not self._warn_hungry():
978
1052
  self.say()
979
1053
  self._schedule_chatter()
980
1054
 
1055
+ IDLE_THRESHOLD = 120.0
1056
+
1057
+ def _check_idle(self) -> bool:
1058
+ """使用者閒置久了打盹並說一句;回來後醒。回傳是否有反應(抑制一般閒聊)。"""
1059
+ seconds = self._idle_provider()
1060
+ if seconds is None:
1061
+ return False
1062
+ if seconds >= self.IDLE_THRESHOLD:
1063
+ if not self._idle_reacted:
1064
+ self._idle_reacted = True
1065
+ self.motion.sleep()
1066
+ if self._talk:
1067
+ pool = self._messages.get("away") or []
1068
+ if pool:
1069
+ self.say(pool[self._chatter_rng.randrange(len(pool))])
1070
+ return True
1071
+ return False
1072
+ if seconds < 5.0 and self._idle_reacted:
1073
+ self._idle_reacted = False
1074
+ self.motion.wake()
1075
+ return False
1076
+
981
1077
  def _persist_hunger(self) -> None:
982
1078
  user_setting_dict["pet_hunger"] = self._hunger.value
983
1079
 
@@ -987,6 +1083,7 @@ class DesktopPetWidget(BaseWidget):
987
1083
  self._mood.pet()
988
1084
  self._persist_hunger()
989
1085
  self._persist_mood()
1086
+ self._gain_affection(5)
990
1087
  pool = self._messages.get("fed") or []
991
1088
  if pool:
992
1089
  self.say(pool[self._chatter_rng.randrange(len(pool))])
@@ -1072,6 +1169,7 @@ class DesktopPetWidget(BaseWidget):
1072
1169
  self.motion.clear_follow()
1073
1170
  self._mood.pet() # petting cheers it up
1074
1171
  self._persist_mood()
1172
+ self._gain_affection(2)
1075
1173
  self._play_sound()
1076
1174
  self._set_active_sprite(STATE_DRAG)
1077
1175
  super().mousePressEvent(event)
@@ -39,6 +39,9 @@ user_setting_dict: Dict[str, Any] = {
39
39
  # 桌面寵物飽足值(0~100)
40
40
  # Desktop pet fullness (0..100)
41
41
  "pet_hunger": 70,
42
+ # 桌面寵物親密度(累積互動)
43
+ # Desktop pet affection (accumulated interactions)
44
+ "pet_affection": 0,
42
45
  }
43
46
 
44
47
 
@@ -228,6 +228,8 @@ english_word_dict = {
228
228
  "pet_feed": "Feed",
229
229
  "pet_chatter_hungry": "I'm hungry...|Got a snack?|Feed me, please?|My tummy's rumbling~",
230
230
  "pet_chatter_fed": "Yum!|Thank you!|Delicious!|Nom nom (^o^)",
231
+ "pet_chatter_away": "Still there?|I'll nap till you're back~|Zzz...|Take your time!",
232
+ "pet_chatter_levelup": "Level up!|I'm growing!|We're getting closer!|Yay, thank you!",
231
233
  "pet_set_reminder": "Set reminder...",
232
234
  "pet_reminder_prompt": "Remind me to:",
233
235
  "pet_reminder_minutes": "In how many minutes?",
@@ -229,6 +229,8 @@ traditional_chinese_word_dict = {
229
229
  "pet_feed": "餵食",
230
230
  "pet_chatter_hungry": "我餓了…|有點心嗎?|餵餵我好嗎?|肚子咕咕叫~",
231
231
  "pet_chatter_fed": "好吃!|謝謝你!|真美味!|嗯嗯 (^o^)",
232
+ "pet_chatter_away": "還在嗎?|我先打個盹等你回來~|Zzz…|慢慢來沒關係!",
233
+ "pet_chatter_levelup": "升級了!|我長大了!|我們更親近了!|耶,謝謝你!",
232
234
  "pet_set_reminder": "設定提醒...",
233
235
  "pet_reminder_prompt": "提醒我:",
234
236
  "pet_reminder_minutes": "幾分鐘後?",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frontengine
3
- Version: 1.0.15
3
+ Version: 1.0.17
4
4
  Summary: FrontEngine is use-define frontview or only use like screen saver
5
5
  Author-email: JE-Chen <jechenmailman@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/FrontEngine
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "frontengine"
9
- version = "1.0.15"
9
+ version = "1.0.17"
10
10
  authors = [
11
11
  { name = "JE-Chen", email = "jechenmailman@gmail.com" },
12
12
  ]
File without changes
File without changes
File without changes