-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathgame_scene.py
More file actions
137 lines (116 loc) · 4.52 KB
/
game_scene.py
File metadata and controls
137 lines (116 loc) · 4.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import os
import pygame
from parser import ContentParser
from renderer import TextRenderer
from settings import SCREEN_WIDTH, SCREEN_HEIGHT, CHAPTERS_DIR
from save_manager import load_progress, save_progress
class GameScene:
"""
Displays each chapter section as a full page.
- ←/→/ENTER/ESC for navigation.
- ESC returns to menu at any time.
- Progress is saved in progress.pkl.
"""
def __init__(self, screen, chapter_filename):
self.screen = screen
self.chapter_filename = chapter_filename
self.full_path = os.path.join(CHAPTERS_DIR, chapter_filename)
# Parse chapter: get title and sections
parser = ContentParser(self.full_path)
self.title = parser.title
self.sections = parser.sections # { section_id: Section(...) }
self.section_ids = parser.section_ids # ordered list
self.total_pages = len(self.section_ids)
self.current_i = 0 # current page index
self.renderer = TextRenderer(screen, parser.settings)
# Load or initialize progress
self.progress = load_progress()
if chapter_filename not in self.progress:
self.progress[chapter_filename] = {"last_page": 0, "completed": False}
# Restart if already completed
if self.progress[chapter_filename].get("completed", False):
self.current_i = 0
self.progress[chapter_filename]["last_page"] = 0
self.progress[chapter_filename]["completed"] = False
save_progress(self.progress)
else:
last = self.progress[chapter_filename].get("last_page", 0)
if 0 <= last < self.total_pages:
self.current_i = last
else:
self.current_i = 0
def run(self):
clock = pygame.time.Clock()
while True:
# Render current section as a page
sec_id = self.section_ids[self.current_i]
section = self.sections[sec_id]
blocks = section.blocks
self.renderer.render_section(
blocks,
self.title,
current_page = self.current_i + 1,
total_pages = self.total_pages
)
pygame.event.clear()
pygame.event.pump()
# Wait for navigation input
choice = self._navigation_loop()
if choice == "voltar":
if self.current_i == 0:
# At first section, ← returns to menu
self._save_and_return_menu()
return
else:
self.current_i -= 1
elif choice == "proximo":
if self.current_i == self.total_pages - 1:
# At last section, → returns to menu
self._save_and_return_menu()
return
else:
self.current_i += 1
elif choice == "mesma":
# Redraw current section
pass
elif choice == "menu":
# ESC pressed: return to menu
self._save_and_return_menu()
return
# Save progress
self._update_progress()
clock.tick(60)
def _navigation_loop(self):
"""
Waits for ←, →, ENTER or ESC.
Returns: "voltar", "proximo", "mesma", or "menu".
"""
while True:
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
pygame.quit()
exit()
elif ev.type == pygame.KEYDOWN:
if ev.key == pygame.K_LEFT:
return "voltar"
elif ev.key == pygame.K_RIGHT:
return "proximo"
elif ev.key == pygame.K_RETURN:
return "mesma"
elif ev.key == pygame.K_ESCAPE:
return "menu"
pygame.time.delay(10)
def _update_progress(self):
"""
Updates last_page and completed status in progress.pkl.
"""
cap = self.chapter_filename
self.progress[cap]["last_page"] = self.current_i
self.progress[cap]["completed"] = (self.current_i == self.total_pages - 1)
save_progress(self.progress)
def _save_and_return_menu(self):
"""
Saves progress and returns to menu.
"""
save_progress(self.progress)
# main.py will call MenuScene after return