pipboy-os 1.0.0__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 (97) hide show
  1. pipboy_os-1.0.0/PKG-INFO +14 -0
  2. pipboy_os-1.0.0/pip_boy_os/images/stats/body/legs1/head_positions.ini +1 -0
  3. pipboy_os-1.0.0/pip_boy_os/images/stats/special/charisma/frameorder.ini +1 -0
  4. pipboy_os-1.0.0/pip_boy_os/images/stats/special/intelligence/frameorder.ini +1 -0
  5. pipboy_os-1.0.0/pip_boy_os/images/stats/special/perception/frameorder.ini +1 -0
  6. pipboy_os-1.0.0/pip_boy_os/images/stats/special/strength/frameorder.ini +1 -0
  7. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs1/positions.ini +1 -0
  8. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs10/positions.ini +1 -0
  9. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs11/positions.ini +1 -0
  10. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs12/positions.ini +1 -0
  11. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs13/positions.ini +1 -0
  12. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs14/positions.ini +1 -0
  13. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs15/positions.ini +1 -0
  14. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs16/positions.ini +1 -0
  15. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs2/positions.ini +1 -0
  16. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs3/positions.ini +1 -0
  17. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs4/positions.ini +1 -0
  18. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs5/positions.ini +1 -0
  19. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs6/positions.ini +1 -0
  20. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs7/positions.ini +1 -0
  21. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs8/positions.ini +1 -0
  22. pipboy_os-1.0.0/pip_boy_os/images/svgs/vaultboy_body/legs9/positions.ini +1 -0
  23. pipboy_os-1.0.0/pip_boy_os/modules/boot.py +371 -0
  24. pipboy_os-1.0.0/pip_boy_os/modules/data_models.py +63 -0
  25. pipboy_os-1.0.0/pip_boy_os/modules/hardware_input.py +150 -0
  26. pipboy_os-1.0.0/pip_boy_os/modules/input_manager.py +157 -0
  27. pipboy_os-1.0.0/pip_boy_os/modules/items.ini +568 -0
  28. pipboy_os-1.0.0/pip_boy_os/modules/items.py +159 -0
  29. pipboy_os-1.0.0/pip_boy_os/modules/main.py +82 -0
  30. pipboy_os-1.0.0/pip_boy_os/modules/overlays.py +50 -0
  31. pipboy_os-1.0.0/pip_boy_os/modules/paths.py +166 -0
  32. pipboy_os-1.0.0/pip_boy_os/modules/pipboy.py +94 -0
  33. pipboy_os-1.0.0/pip_boy_os/modules/settings.py +340 -0
  34. pipboy_os-1.0.0/pip_boy_os/modules/settings_secrets.py +4 -0
  35. pipboy_os-1.0.0/pip_boy_os/modules/tab.py +160 -0
  36. pipboy_os-1.0.0/pip_boy_os/modules/tab_manager.py +609 -0
  37. pipboy_os-1.0.0/pip_boy_os/modules/tabs/clock_tab/clock_tab.py +209 -0
  38. pipboy_os-1.0.0/pip_boy_os/modules/tabs/data_tab/data_tab.py +138 -0
  39. pipboy_os-1.0.0/pip_boy_os/modules/tabs/data_tab/notes_tab.py +479 -0
  40. pipboy_os-1.0.0/pip_boy_os/modules/tabs/data_tab/quest_tab.py +774 -0
  41. pipboy_os-1.0.0/pip_boy_os/modules/tabs/data_tab/settings_tab.py +606 -0
  42. pipboy_os-1.0.0/pip_boy_os/modules/tabs/data_tab/stats_tab.py +148 -0
  43. pipboy_os-1.0.0/pip_boy_os/modules/tabs/data_tab/workshops_tab.py +289 -0
  44. pipboy_os-1.0.0/pip_boy_os/modules/tabs/inv_tab/aid_tab.py +90 -0
  45. pipboy_os-1.0.0/pip_boy_os/modules/tabs/inv_tab/ammo_tab.py +58 -0
  46. pipboy_os-1.0.0/pip_boy_os/modules/tabs/inv_tab/apparel_tab.py +165 -0
  47. pipboy_os-1.0.0/pip_boy_os/modules/tabs/inv_tab/inv_base.py +990 -0
  48. pipboy_os-1.0.0/pip_boy_os/modules/tabs/inv_tab/inv_tab.py +100 -0
  49. pipboy_os-1.0.0/pip_boy_os/modules/tabs/inv_tab/junk_tab.py +59 -0
  50. pipboy_os-1.0.0/pip_boy_os/modules/tabs/inv_tab/misc_tab.py +76 -0
  51. pipboy_os-1.0.0/pip_boy_os/modules/tabs/inv_tab/weapons_tab.py +199 -0
  52. pipboy_os-1.0.0/pip_boy_os/modules/tabs/map_tab/map_tab.py +159 -0
  53. pipboy_os-1.0.0/pip_boy_os/modules/tabs/map_tab/world_tab.py +362 -0
  54. pipboy_os-1.0.0/pip_boy_os/modules/tabs/radio_tab/__init__.py +0 -0
  55. pipboy_os-1.0.0/pip_boy_os/modules/tabs/radio_tab/playlist_manager.py +93 -0
  56. pipboy_os-1.0.0/pip_boy_os/modules/tabs/radio_tab/radio_station_loader.py +98 -0
  57. pipboy_os-1.0.0/pip_boy_os/modules/tabs/radio_tab/radio_tab.py +409 -0
  58. pipboy_os-1.0.0/pip_boy_os/modules/tabs/radio_tab/visualizer.py +152 -0
  59. pipboy_os-1.0.0/pip_boy_os/modules/tabs/stat_tab/__init__.py +0 -0
  60. pipboy_os-1.0.0/pip_boy_os/modules/tabs/stat_tab/eff_tab.py +73 -0
  61. pipboy_os-1.0.0/pip_boy_os/modules/tabs/stat_tab/general_tab.py +374 -0
  62. pipboy_os-1.0.0/pip_boy_os/modules/tabs/stat_tab/perks_tab.py +431 -0
  63. pipboy_os-1.0.0/pip_boy_os/modules/tabs/stat_tab/rad_tab.py +348 -0
  64. pipboy_os-1.0.0/pip_boy_os/modules/tabs/stat_tab/skills_tab.py +241 -0
  65. pipboy_os-1.0.0/pip_boy_os/modules/tabs/stat_tab/special_tab.py +254 -0
  66. pipboy_os-1.0.0/pip_boy_os/modules/tabs/stat_tab/stat_tab.py +184 -0
  67. pipboy_os-1.0.0/pip_boy_os/modules/tabs/stat_tab/status_tab.py +334 -0
  68. pipboy_os-1.0.0/pip_boy_os/modules/ui.py +884 -0
  69. pipboy_os-1.0.0/pip_boy_os/modules/user_config.py +2 -0
  70. pipboy_os-1.0.0/pip_boy_os/modules/util_functs.py +291 -0
  71. pipboy_os-1.0.0/pip_boy_os/objs/normalizeobj.py +43 -0
  72. pipboy_os-1.0.0/pip_boy_os/pipboy_os.egg-info/PKG-INFO +14 -0
  73. pipboy_os-1.0.0/pip_boy_os/pipboy_os.egg-info/SOURCES.txt +95 -0
  74. pipboy_os-1.0.0/pip_boy_os/pipboy_os.egg-info/dependency_links.txt +1 -0
  75. pipboy_os-1.0.0/pip_boy_os/pipboy_os.egg-info/entry_points.txt +2 -0
  76. pipboy_os-1.0.0/pip_boy_os/pipboy_os.egg-info/requires.txt +9 -0
  77. pipboy_os-1.0.0/pip_boy_os/pipboy_os.egg-info/top_level.txt +6 -0
  78. pipboy_os-1.0.0/pip_boy_os/sounds/Radio NV/Black_Mountain_Radio/IntermissionsBMR/desktop.ini +11 -0
  79. pipboy_os-1.0.0/pip_boy_os/sounds/Radio NV/Black_Mountain_Radio/desktop.ini +15 -0
  80. pipboy_os-1.0.0/pip_boy_os/sounds/Radio NV/Mojave_Music_Radio/desktop.ini +12 -0
  81. pipboy_os-1.0.0/pip_boy_os/sounds/pipboy/Holotape/desktop.ini +4 -0
  82. pipboy_os-1.0.0/pip_boy_os/sounds/radio/03_DCR/desktop.ini +4 -0
  83. pipboy_os-1.0.0/pip_boy_os/sounds/radio/03_DCR/station.ini +3 -0
  84. pipboy_os-1.0.0/pip_boy_os/sounds/radio/04_Classical/station.ini +3 -0
  85. pipboy_os-1.0.0/pip_boy_os/sounds/radio/05_Institute/station.ini +3 -0
  86. pipboy_os-1.0.0/pip_boy_os/sounds/radio/06_Minutemen/station.ini +3 -0
  87. pipboy_os-1.0.0/pip_boy_os/sounds/radio/07_Magnolia/station.ini +3 -0
  88. pipboy_os-1.0.0/pip_boy_os/sounds/radio/08_CadillacJack/station.ini +3 -0
  89. pipboy_os-1.0.0/pip_boy_os/sounds/radio/09_HCB/station.ini +3 -0
  90. pipboy_os-1.0.0/pip_boy_os/sounds/radio/10_RCR/station.ini +3 -0
  91. pipboy_os-1.0.0/pip_boy_os/sounds/radio/11_RedEye/station.ini +5 -0
  92. pipboy_os-1.0.0/pip_boy_os/sounds/radio/12_RRF/station.ini +4 -0
  93. pipboy_os-1.0.0/pip_boy_os/sounds/radio/13_TCL/station.ini +3 -0
  94. pipboy_os-1.0.0/pip_boy_os/sounds/radio/14_TCM/station.ini +5 -0
  95. pipboy_os-1.0.0/pip_boy_os/sounds/radio/16_WYN/station.ini +4 -0
  96. pipboy_os-1.0.0/pyproject.toml +29 -0
  97. pipboy_os-1.0.0/setup.cfg +4 -0
@@ -0,0 +1,14 @@
1
+ Metadata-Version: 2.4
2
+ Name: pipboy-os
3
+ Version: 1.0.0
4
+ Summary: Pip-Boy OS - The ultimate Fallout interface built with Python and Pygame.
5
+ Author: DanieleM
6
+ License: MIT
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: numpy>=2.0.0
9
+ Requires-Dist: Pillow>=11.0.0
10
+ Requires-Dist: pygame-ce>=2.5.5
11
+ Requires-Dist: Requests>=2.32.3
12
+ Requires-Dist: tinytag>=1.10.1
13
+ Requires-Dist: smbus2>=0.4.2; sys_platform != "win32"
14
+ Requires-Dist: gpiozero>=1.6.2; sys_platform != "win32"
@@ -0,0 +1 @@
1
+ (0.0, 0.0), (0.5, 1.8), (0.8, 3.0), (1.0, 1.8), (1.5, 0.1), (1.1, 1.3), (1.0, 3.0), (0.7, 2.3)
@@ -0,0 +1 @@
1
+ 0,0,0,1,2,2,3,3,4,4,5,5,6,6,6,6,6,6,6,1
@@ -0,0 +1 @@
1
+ 0,0,1,2,3,4,5,6,6,7,8,9,10,11,11
@@ -0,0 +1 @@
1
+ 0,1,2,3,3,3,4,4,4,3,3,3,4,4,4
@@ -0,0 +1 @@
1
+ 0.0,0.0;-0.008,-0.028;-0.012,-0.045333333;-0.014666667,-0.027333333;-0.023,-0.001333333;-0.017,-0.019666667;-0.014333333,-0.046666667;-0.010333333,-0.035333333
@@ -0,0 +1 @@
1
+ 0.0,0.0;0.008,0.004;0.007333333,0.017;0.007,0.008333333;-0.001333333,0.002666667
@@ -0,0 +1 @@
1
+ 0.0,0.0;0.024,0.007333333;0.013666667,-0.004;0.011,-0.002333333;0.011,-0.007
@@ -0,0 +1 @@
1
+ 0.0,0.0;-0.010666667,-0.009;-0.013,-0.013666667;-0.007,-0.010666667;0.000333333,0.001
@@ -0,0 +1 @@
1
+ 0.0,0.0;0.014,0.007333333;0.022,0.002666667;0.014,-0.002333333;0.015,-0.005;0.017,-0.005333333;0.02,-0.005
@@ -0,0 +1 @@
1
+ 0.0,0.0;0.008666667,0.002333333;0.022,0.0;0.013333333,-0.003;0.015666667,-0.009;0.014,-0.006666667;0.016666667,-0.006666667
@@ -0,0 +1 @@
1
+ 0.0,0.0;0.011,0.005333333;0.013,0.000666667;0.005,-0.002333333;0.005,-0.009;0.013,-0.005333333;0.013,-0.005
@@ -0,0 +1 @@
1
+ 0.0,0.0;0.003333333,-0.000333333;0.003333333,0.005666667;0.003333333,-0.009666667;-0.000666667,0.000333333
@@ -0,0 +1 @@
1
+ 0.0,0.0;-0.008,-0.028;-0.012,-0.045333333;-0.014666667,-0.027333333;-0.023,-0.001333333;-0.017,-0.019666667;-0.014333333,-0.046666667;-0.010333333,-0.035333333
@@ -0,0 +1 @@
1
+ 0.0,0.0;-0.008,-0.028;-0.012,-0.045333333;-0.014666667,-0.027333333;-0.023,-0.001333333;-0.017,-0.019666667;-0.014333333,-0.046666667;-0.010333333,-0.035333333
@@ -0,0 +1 @@
1
+ 0.0,0.0;-0.008,-0.028;-0.012,-0.045333333;-0.014666667,-0.027333333;-0.023,-0.001333333;-0.017,-0.019666667;-0.014333333,-0.046666667;-0.010333333,-0.035333333
@@ -0,0 +1 @@
1
+ 0.0,0.0;0.010666667,0.005666667;0.025666667,-0.009666667;0.020666667,-0.012333333;0.003333333,-0.028
@@ -0,0 +1 @@
1
+ 0.0,0.0;-0.001333333,0.004666667;-0.001333333,0.007333333;-0.001333333,0.004666667;0.0,0.0
@@ -0,0 +1 @@
1
+ 0.0,0.0;0.010666667,0.005;0.0,-0.005666667;0.009333333,-0.004666667;0.000333333,-0.014333333
@@ -0,0 +1 @@
1
+ 0.0,0.0;-0.012666667,-0.016;-0.01,-0.014666667;-0.008,-0.019666667;0.005333333,0.0
@@ -0,0 +1 @@
1
+ 0.0,0.0;0.012666667,0.001666667;0.037666667,0.012333333;0.018666667,-0.010333333;0.017333333,-0.002
@@ -0,0 +1,371 @@
1
+ import os
2
+ import pygame
3
+ import settings
4
+ from util_functs import Utils
5
+ from ui import AnimatedImage
6
+
7
+
8
+ class BootText():
9
+ def __init__(self, screen):
10
+ self.font = pygame.font.Font(settings.TECH_MONO_FONT_PATH, 8)
11
+ self.font_height = self.font.get_height()
12
+ self.boot_text_start = ("* 1 0 0x0000A4 0x00000000000000000 start memory discovery 0 0x0000A4 \n"
13
+ "0x00000000000000000 1 0 0x000014 0x00000000000000000 CPUO starting cell \n"
14
+ "relocation0 0x0000A4 0x00000000000000000 1 0 0x000009 \n"
15
+ "0x00000000000000000 CPUO launch EFI0 0x0000A4 0x00000000000000000 1 0 \n"
16
+ "0x000009 0x000000000000E003D CPUO starting EFI0 0x0000A4 \n"
17
+ "0x00000000000000000 1 0 0x0000A4 0x00000000000000000 start memory \n"
18
+ "discovery0 0x0000A4 0x00000000000000000 1 0 0x0000A4 0x00000000000000000 \n"
19
+ "start memory discovery 0 0x0000A4 0x00000000000000000 1 0 0x000014 \n"
20
+ "0x00000000000000000 CPUO starting cell relocation0 0x0000A4 \n"
21
+ "0x00000000000000000 1 0 0x000009 0x00000000000000000 CPUO launch EFI0 \n"
22
+ "0x0000A4 0x00000000000000000 1 0 0x000009 0x000000000000E003D CPUO \n"
23
+ "starting EFI0 0x0000A4 0x00000000000000000 1 0 0x0000A4 \n"
24
+ "0x00000000000000000 start memory discovery0 0x0000A4 0x00000000000000000 \n"
25
+ "1 0 0x0000A4 0x00000000000000000 start memory discovery 0 0x0000A4 \n"
26
+ "0x00000000000000000 1 0 0x000014 0x00000000000000000 CPUO starting cell \n"
27
+ "relocation0 0x0000A4 0x00000000000000000 1 0 0x000009 \n"
28
+ "0x00000000000000000 CPUO launch EFI0 0x0000A4 0x00000000000000000 1 0 \n"
29
+ "0x000009 0x000000000000E003D CPUO starting EFI0 0x0000A4 \n"
30
+ "0x00000000000000000 1 0 0x0000A4 0x00000000000000000 start memory \n"
31
+ "discovery0 0x0000A4 0x00000000000000000 1 0 0x0000A4 0x00000000000000000 \n"
32
+ "start memory discovery 0 0x0000A4 0x00000000000000000 1 0 0x000014 \n"
33
+ "0x00000000000000000 CPUO starting cell relocation0 0x0000A4 \n"
34
+ "0x00000000000000000 1 0 0x000009 0x00000000000000000 CPUO launch EFI0 \n"
35
+ "0x0000A4 0x00000000000000000 1 0 0x000009 0x000000000000E003D CPUO \n"
36
+ "starting EFI0 0x0000A4 0x00000000000000000 1 0 0x0000A4 \n"
37
+ "0x00000000000000000 start memory discovery0 0x0000A4 0x00000000000000000 \n"
38
+ "1 0 0x0000A4 0x00000000000000000 start memory discovery 0 0x0000A4 \n"
39
+ "0x00000000000000000 1 0 0x000014 0x00000000000000000 CPUO starting cell \n"
40
+ "relocation0 0x0000A4 0x00000000000000000 1 0 0x000009 \n"
41
+ "0x00000000000000000 CPUO launch EFI0 0x0000A4 0x00000000000000000 1 0 \n"
42
+ "0x000009 0x000000000000E003D CPUO starting EFI0 0x0000A4 \n"
43
+ "0x00000000000000000 1 0 0x0000A4 0x00000000000000000 start memory \n"
44
+ "discovery0 0x0000A4 0x00000000000000000 1 0 0x0000A4 0x00000000000000000 \n"
45
+ "start memory discovery 0 0x0000A4 0x00000000000000000 1 0 0x000014 \n"
46
+ "0x00000000000000000 CPUO starting cell relocation0 0x0000A4 \n"
47
+ "0x00000000000000000 1 0 0x000009 0x00000000000000000 CPUO launch EFI0 \n"
48
+ "0x0000A4 0x00000000000000000 1 0 0x000009 0x000000000000E003D CPUO \n"
49
+ "starting EFI0 0x0000A4 0x00000000000000000 1 0 0x0000A4 \n"
50
+ "0x00000000000000000 start memory discovery0 0x0000A4 0x00000000000000000 \n"
51
+ "1 0 0x0000A4 0x00000000000000000 start memory discovery 0 0x0000A4 \n"
52
+ "0x00000000000000000 1 0 0x000014 0x00000000000000000 CPUO starting cell \n"
53
+ "relocation0 0x0000A4 0x00000000000000000 1 0 0x000009 \n"
54
+ "0x00000000000000000 CPUO launch EFI0 0x0000A4 0x00000000000000000 1 0 \n"
55
+ "0x000009 0x000000000000E003D CPUO starting EFI0 0x0000A4 \n"
56
+ "0x00000000000000000 1 0 0x0000A4 0x00000000000000000 start memory \n"
57
+ "discovery0 0x0000A4 0x00000000000000000 1 0 0x0000A4 0x00000000000000000 \n"
58
+ "start memory discovery 0 0x0000A4 0x00000000000000000 1 0 0x000014 \n"
59
+ "0x00000000000000000 CPUO starting cell relocation0 0x0000A4 \n"
60
+ "0x00000000000000000 1 0 0x000009 0x00000000000000000 CPUO launch EFI0 \n"
61
+ "0x0000A4 0x00000000000000000 1 0 0x000009 0x000000000000E003D CPUO \n"
62
+ "starting EFI0 0x0000A4 0x00000000000000000 1 0 0x0000A4 \n"
63
+ "0x00000000000000000 start memory discovery0 0x0000A4 0x00000000000000000 \n"
64
+ "1 0 0x0000A4 0x00000000000000000 start memory discovery 0 0x0000A4 \n"
65
+ "0x00000000000000000 1 0 0x000014 0x00000000000000000 CPUO starting cell \n"
66
+ "relocation0 0x0000A4 0x00000000000000000 1 0 0x000009 \n"
67
+ "0x00000000000000000 CPUO launch EFI0 0x0000A4 0x00000000000000000 1 0 \n"
68
+ "0x000009 0x000000000000E003D CPUO starting EFI0 0x0000A4 \n"
69
+ "0x00000000000000000 1 0 0x0000A4 0x00000000000000000 start memory \n"
70
+ "discovery0 0x0000A4 0x00000000000000000 1 0 0x0000A4 0x00000000000000000 \n"
71
+ "start memory discovery 0 0x0000A4 0x00000000000000000 1 0 0x000014 \n"
72
+ "0x00000000000000000 CPUO starting cell relocation0 0x0000A4 \n"
73
+ "0x00000000000000000 1 0 0x000009 0x00000000000000000 CPUO launch EFI0 \n"
74
+ "0x0000A4 0x00000000000000000 1 0 0x000009 0x000000000000E003D CPUO \n"
75
+ "starting EFI0 0x0000A4 0x00000000000000000 1 0 0x0000A4 \n"
76
+ "0x00000000000000000 start memory discovery0 0x0000A4 0x00000000000000000 \n"
77
+ "1 0 0x0000A4 0x00000000000000000 start memory discovery 0 0x0000A4 \n"
78
+ "0x00000000000000000 1 0 0x000014 0x00000000000000000 CPUO starting cell \n"
79
+ "relocation0 0x0000A4 0x00000000000000000 1 0 0x000009 \n"
80
+ "0x00000000000000000 CPUO launch EFI0 0x0000A4 0x00000000000000000 1 0 \n"
81
+ "0x000009 0x000000000000E003D CPUO starting EFI0 0x0000A4 \n"
82
+ "0x00000000000000000 1 0 0x0000A4 0x00000000000000000 start memory \n"
83
+ "discovery0 0x0000A4 0x00000000000000000 1 0 0x0000A4 0x00000000000000000 \n"
84
+ "start memory discovery 0 0x0000A4 0x00000000000000000 1 0 0x000014 \n"
85
+ "0x00000000000000000 CPUO starting cell relocation0 0x0000A4 \n"
86
+ "0x00000000000000000 1 0 0x000009 0x00000000000000000 CPUO launch EFI0 \n"
87
+ "0x0000A4 0x00000000000000000 1 0 0x000009 0x000000000000E003D CPUO \n"
88
+ "starting EFI0 0x0000A4 0x00000000000000000 1 0 0x0000A4 \n"
89
+ "0x00000000000000000 start memory discovery0 0x0000A4 0x00000000000000000 \n"
90
+ "1 0 0x0000A4 0x00000000000000000 start memory discovery 0 0x0000A4 \n"
91
+ "0x00000000000000000 1 0 0x000014 0x00000000000000000 CPUO starting cell \n"
92
+ "relocation0 0x0000A4 0x00000000000000000 1 0 0x000009 \n"
93
+ "0x00000000000000000 CPUO launch EFI0 0x0000A4 0x00000000000000000 1 0 \n"
94
+ "0x000009 0x000000000000E003D CPUO starting EFI0 0x0000A4 \n"
95
+ "0x00000000000000000 1 0 0x0000A4 0x00000000000000000 start memory \n"
96
+ "discovery0 0x0000A4 0x00000000000000000 1 0 0x0000A4 0x00000000000000000 \n"
97
+ "start memory discovery 0 0x0000A4 0x00000000000000000 1 0 0x000014 \n"
98
+ "0x00000000000000000 CPUO starting cell relocation0 0x0000A4 \n"
99
+ "0x00000000000000000 1 0 0x000009 0x00000000000000000 CPUO launch EFI0 \n"
100
+ "0x0000A4 0x00000000000000000 1 0 0x000009 0x000000000000E003D CPUO \n"
101
+ "starting EFI0 0x0000A4 0x00000000000000000 1 0 0x0000A4 \n"
102
+ "0x00000000000000000 start memory discovery0 0x0000A4 0x00000000000000000 \n"
103
+ "1 0 0x0000A4 0x00000000000000000 start memory discovery 0 0x0000A4 \n"
104
+ "0x00000000000000000 1 0 0x000014 0x00000000000000000 CPUO starting cell \n"
105
+ "relocation0 0x0000A4 0x00000000000000000 1 0 0x000009 \n"
106
+ "0x00000000000000000 CPUO launch EFI0 0x0000A4 0x00000000000000000 1 0 \n"
107
+ "0x000009 0x000000000000E003D CPUO starting EFI0 0x0000A4 \n"
108
+ "0x00000000000000000 1 0 0x0000A4 0x00000000000000000 start memory \n"
109
+ "discovery0 0x0000A4 0x00000000000000000 1 0 0x0000A4 0x00000000000000000 \n"
110
+ "start memory discovery 0 0x0000A4 0x00000000000000000 1 0 0x000014 \n"
111
+ "0x00000000000000000 CPUO starting cell relocation0 0x0000A4 \n"
112
+ "0x00000000000000000 1 0 0x000009 0x00000000000000000 CPUO launch EFI0 \n"
113
+ "0x0000A4 0x00000000000000000 1 0 0x000009 0x000000000000E003D CPUO \n"
114
+ "starting EFI0 0x0000A4 0x00000000000000000 1 0 0x0000A4 \n"
115
+ "0x00000000000000000 start memory discovery0 0x0000A4 0x00000000000000000 END\n")
116
+ self.boot_text_lines = self.boot_text_start.split("\n")
117
+ self.visible_lines_count = settings.SCREEN_HEIGHT // self.font_height
118
+ self.first_iteration = True
119
+ self.screen = screen
120
+
121
+
122
+ self.start_y = settings.SCREEN_HEIGHT
123
+ self.y_offset = self.start_y
124
+
125
+ # Create a surface large enough to contain all the text
126
+ self.full_text_surface = pygame.Surface(((settings.SCREEN_WIDTH), len(self.boot_text_lines) * self.font_height))
127
+
128
+ # Render each line of text into the surface
129
+ for i, line in enumerate(self.boot_text_lines):
130
+ line_surface = self.font.render(line, True, settings.PIP_BOY_LIGHT)
131
+ self.full_text_surface.blit(line_surface, (0, i * self.font_height))
132
+
133
+
134
+
135
+ def display_text_sequence(self):
136
+ """Display text sequence with scrolling effect"""
137
+ if self.first_iteration:
138
+ Utils.play_sfx(settings.BOOT_SOUND_A)
139
+ self.first_iteration = False
140
+
141
+ pygame.time.wait(settings.SPEED * 30)
142
+ self.y_offset -= self.font_height # Scroll the text upward
143
+ if self.y_offset < -len(self.boot_text_lines) * self.font_height:
144
+ return True # Stop the sequence if the text has scrolled off the screen
145
+ return False
146
+
147
+ def render(self):
148
+ self.screen.blit(self.full_text_surface, (0, self.y_offset)) # Draw the text at the current y_offset
149
+
150
+
151
+ class BootCopyright():
152
+ def __init__(self, screen):
153
+ self.font = pygame.font.Font(settings.TECH_MONO_FONT_PATH, 12)
154
+ self.font_height = self.font.get_height()
155
+ self.copyright_text = ("*************** PIP-05 (R) V7 .1.0.8 ***************\n"
156
+ "\n"
157
+ "\n"
158
+ "\n"
159
+ " COPYRIGHT 2075 ROBCO(R)\n"
160
+ " LOADER VI.1\n"
161
+ " EXEC VERSION 41.10\n"
162
+ " 264k RAM SYSTEM\n"
163
+ " 38911 BYTES FREE\n"
164
+ " NO HOLOTAPE FOUND\n"
165
+ " LOAD ROM(1): DEITRIX 303").split('\n')
166
+ self.copyright_text_rendered = []
167
+ self.states = iter(["cursor_initial", "lines", "cursor_bottom", "scroll"])
168
+ self.current_state = next(self.states)
169
+ self.cursor_surface = self.font.render("▮", True, settings.PIP_BOY_LIGHT)
170
+ self.cursor_position = [0, 0]
171
+ self.cur_cursor_position = 0
172
+ self.current_line = 0
173
+ self.current_char = 0
174
+ self.text_surface = None
175
+ self.cursor_blink_count = 0 # Track blink cycles
176
+ self.cursor_blink_state = False
177
+ self.text_scroll_y = 0
178
+ self.cursor_pause = False
179
+ self.scroll_pause = False
180
+ self.screen = screen
181
+
182
+
183
+ def render(self):
184
+ for line in range(len(self.copyright_text_rendered)):
185
+ self.text_surface = self.font.render(self.copyright_text_rendered[line], True, settings.PIP_BOY_LIGHT)
186
+ self.screen.blit(self.text_surface, (0, (line * self.font_height) + self.text_scroll_y))
187
+ if self.cursor_blink_state and "cursor" in self.current_state:
188
+ self.screen.blit(self.cursor_surface, (self.cursor_position))
189
+ elif self.current_state == "lines":
190
+ self.screen.blit(self.cursor_surface, (self.cursor_position))
191
+
192
+ def blink_cursor(self):
193
+ pygame.time.wait(settings.SPEED * 150)
194
+ self.cursor_blink_state = not self.cursor_blink_state
195
+ self.cursor_blink_count += 1
196
+
197
+
198
+ def display_copyright_text(self):
199
+
200
+ match self.current_state:
201
+ case "cursor_initial":
202
+ if self.cursor_blink_count > 7:
203
+ Utils.play_sfx(settings.BOOT_SOUND_B)
204
+ self.current_state = next(self.states)
205
+ self.cursor_blink_count = 0
206
+ self.cur_cursor_position = 1
207
+ return False
208
+
209
+ self.blink_cursor()
210
+
211
+ case "lines":
212
+ pygame.time.wait(settings.SPEED * 17)
213
+ if self.current_line >= len(self.copyright_text):
214
+ self.current_state = next(self.states)
215
+ return False
216
+ line = self.copyright_text[self.current_line]
217
+
218
+ # Ensure the current line exists in the rendered list
219
+ while len(self.copyright_text_rendered) <= self.current_line:
220
+ self.copyright_text_rendered.append("")
221
+
222
+ if self.current_char < len(line):
223
+ self.copyright_text_rendered[self.current_line] += line[self.current_char]
224
+ self.current_char += 1
225
+
226
+ # Update cursor position after adding the character
227
+ self.cursor_position = (self.font.size(self.copyright_text_rendered[self.current_line])[0],
228
+ self.current_line * self.font_height)
229
+ else:
230
+ self.current_line += 1
231
+ self.current_char = 0
232
+
233
+ case "cursor_bottom":
234
+ if not self.cursor_pause:
235
+ pygame.time.wait(settings.SPEED * 50)
236
+ text_width = self.text_surface.get_width() if self.text_surface else 0
237
+ self.cursor_position = text_width, (self.current_line * self.font_height) - self.font_height
238
+ self.cursor_pause = True
239
+
240
+ if self.cursor_blink_count > 7:
241
+ self.current_state = next(self.states)
242
+ return False
243
+
244
+ self.blink_cursor()
245
+
246
+
247
+ case "scroll":
248
+
249
+ if not self.scroll_pause:
250
+ pygame.time.wait(settings.SPEED * 200)
251
+ self.scroll_pause = True
252
+
253
+ pygame.time.wait(settings.SPEED * 20)
254
+ self.text_scroll_y -= 5
255
+ if self.text_scroll_y < -len(self.copyright_text) * self.font_height:
256
+ return True
257
+
258
+
259
+ class BootThumbs():
260
+ def __init__(self, screen):
261
+ self.screen = screen
262
+ self.font = pygame.font.Font(settings.TECH_MONO_FONT_PATH, 10)
263
+
264
+ self.current_frame = 0
265
+ self.real_frame = 0
266
+ images = Utils.load_images(settings.BOOT_THUMBS)
267
+ self.images = [Utils.scale_image(image, 0.5) for image in images]
268
+ self.image_center = self.images[0].get_rect().center
269
+ self.init_surface = self.font.render("INITIATING...", True, settings.PIP_BOY_LIGHT)
270
+ self.init_surface_center = self.init_surface.get_rect().center
271
+ self.screen_center = self.screen.get_rect().center
272
+ self.blink = 255
273
+ self.blink_direction = 1
274
+ self.first_iteration = True
275
+
276
+ frameorder = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7,
277
+ 7,
278
+ 7, 7, 7, 7, 7, 7, 7, 7, 7]
279
+ image_position = (self.screen_center[0] - 59, self.screen_center[1] - 80)
280
+ self.animated_thumbs = AnimatedImage(self.screen, self.images, image_position, settings.SPEED * 116, frame_order=frameorder, loop=False)
281
+
282
+ def display_thumbs(self):
283
+ if self.first_iteration:
284
+ Utils.play_sfx(settings.BOOT_SOUND_C)
285
+ pygame.time.wait(settings.SPEED * 600)
286
+ self.animated_thumbs.start()
287
+ self.first_iteration = False
288
+
289
+ if self.animated_thumbs.current_frame_index >= len(self.animated_thumbs.frame_order) - 1:
290
+ self.animated_thumbs.stop()
291
+ return True
292
+
293
+ self.blink += self.blink_direction
294
+ if self.blink >= 255:
295
+ self.blink_direction = -6
296
+ elif self.blink <= 50:
297
+ self.blink_direction = 6
298
+ self.init_surface.set_alpha(self.blink)
299
+
300
+ pygame.time.wait(settings.SPEED * 20)
301
+
302
+
303
+ def render(self):
304
+
305
+ self.screen.blit(self.init_surface, (self.screen_center[0] - self.init_surface_center[0], self.screen_center[1] + (self.screen_center[1] // 2)))
306
+
307
+ self.animated_thumbs.render()
308
+
309
+
310
+
311
+ class Boot:
312
+ def __init__(self, screen):
313
+ self.screen = screen
314
+ self.states = iter(["text", "copyright", "thumbs", "done"])
315
+ self.current_sequence = next(self.states)
316
+ self.boot_text = BootText(self.screen)
317
+ self.copyright_text = BootCopyright(self.screen)
318
+ self.boot_thumbs = BootThumbs(self.screen)
319
+ self.copyright_pause = False
320
+ self.text_pause = False
321
+ self.thumbs_pause = False
322
+ self.running = False
323
+
324
+ def start(self):
325
+ self.running = True
326
+
327
+
328
+
329
+ def run(self):
330
+ clock = pygame.time.Clock()
331
+ while True:
332
+ for event in pygame.event.get():
333
+ if event.type == pygame.QUIT:
334
+ pygame.quit()
335
+ import sys
336
+ sys.exit()
337
+ match self.current_sequence:
338
+ case "text":
339
+ if not self.text_pause:
340
+ pygame.time.wait(settings.SPEED * 100)
341
+ self.text_pause = True
342
+ if self.boot_text.display_text_sequence():
343
+ self.current_sequence = next(self.states)
344
+ case "copyright":
345
+ if not self.copyright_pause:
346
+ pygame.time.wait(settings.SPEED * 100)
347
+ self.copyright_pause = True
348
+ if self.copyright_text.display_copyright_text():
349
+ self.current_sequence = next(self.states)
350
+ case "thumbs":
351
+ if not self.thumbs_pause:
352
+ pygame.time.wait(settings.SPEED * 500)
353
+ self.thumbs_pause = True
354
+ if self.boot_thumbs.display_thumbs():
355
+ self.current_sequence = next(self.states)
356
+ case "done":
357
+ pygame.time.wait(settings.SPEED * 10)
358
+ break
359
+ self.screen.fill((0, 0, 0))
360
+ self.render()
361
+ pygame.display.flip()
362
+ clock.tick(60)
363
+
364
+ def render(self):
365
+ match self.current_sequence:
366
+ case "text":
367
+ self.boot_text.render()
368
+ case "copyright":
369
+ self.copyright_text.render()
370
+ case "thumbs":
371
+ self.boot_thumbs.render()
@@ -0,0 +1,63 @@
1
+ # data_models.py
2
+ from dataclasses import dataclass
3
+ from typing import NamedTuple, Dict, Tuple
4
+
5
+
6
+ @dataclass
7
+ class LimbPosition:
8
+ x_offset: int
9
+ y_position: int
10
+ name: str
11
+
12
+ class IconConfig(NamedTuple):
13
+ path: str
14
+ value: int
15
+
16
+ class DamageType(NamedTuple):
17
+ type: str
18
+ value: int
19
+
20
+
21
+ @dataclass
22
+ class ItemBase:
23
+ name: str
24
+ weight: float
25
+ value: int
26
+ icons: str
27
+ description: str = ""
28
+ category: str = "Misc"
29
+
30
+ @dataclass
31
+ class WeaponItem(ItemBase):
32
+ damage: int = 0
33
+ fire_rate: int = 0
34
+ range: int = 0
35
+ accuracy: int = 0
36
+ ammo_type: str = ""
37
+ damage_types: Tuple[DamageType] = ()
38
+
39
+ @dataclass
40
+ class ApparelItem(ItemBase):
41
+ defense: int = 0
42
+ damage_resist: Tuple[DamageType] = ()
43
+ special_bonuses: Dict[str, int] = None
44
+
45
+ @dataclass
46
+ class AidItem(ItemBase):
47
+ health: int = 0
48
+ ap: int = 0
49
+ rads: int = 0
50
+ addiction_risk: str = "None"
51
+ special_bonuses: Dict[str, int] = None
52
+
53
+ @dataclass
54
+ class AmmoItem(ItemBase):
55
+ damage_type: str = ""
56
+
57
+ @dataclass
58
+ class JunkItem(ItemBase):
59
+ components: Dict[str, int] = None
60
+
61
+ @dataclass
62
+ class MiscItem(ItemBase):
63
+ type: str = "Misc"