forked from ISNABE/scape-me
-
Notifications
You must be signed in to change notification settings - Fork 1
/
LevelManager.py
169 lines (131 loc) · 4.39 KB
/
LevelManager.py
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
from kivy.uix.widget import Widget
from kivy.logger import Logger
from kivy.uix.button import Button
from Level import Level
from LevelService import LevelService
from EventDispatchers import LevelEventDispatcher, propagate_event
from PopUpProvider import open_pop_up
class LevelManager(Widget):
popup = None
grid_layout = None
def __init__(self, event_dispatcher, **kwargs):
"""
Instantiate the LevelManager with event listener.
:param event_dispatcher: dispatcher
:param kwargs:
"""
super(LevelManager, self).__init__(**kwargs)
self.event_dispatcher = event_dispatcher
self.level_service = LevelService()
self.level_event_dispatcher = LevelEventDispatcher()
self.level_event_dispatcher.bind(on_level_completed=self.do_level_up)
def add_widget(self, widget, index=0):
"""
Add widget only after removing any widget previously present.
:param widget:
:param index:
:rtype: void
"""
super(LevelManager, self).add_widget(widget, index)
#####
# Save and Level Up
#####
def do_level_up(self, instance, completion_details, *args):
"""
Save level up in the completed pool and open popup.
:param instance:
:param completion_details:
:param args:
:rtype: void
"""
self.level_service.save_completion(completion_details)
set_id_to_load = completion_details['set_id']
level_id_in_set_to_load = completion_details['level_id_in_set'] + 1
if level_id_in_set_to_load >= 5:
set_id_to_load = completion_details['set_id'] + 1
level_id_in_set_to_load = 1
open_pop_up(self, 'end_level', set_id_to_load, level_id_in_set_to_load, completion_details)
#####
# Set loading
####
def can_load_set(self, set_id=None):
"""
Test is player can play this set.
:param set_id:
:rtype: Boolean
"""
if not self.level_service.does_set_exist(set_id):
raise Exception("Set does not exist.")
if not self.level_service.is_set_unlocked(set_id):
Logger.info("Level is not unlocked yet.")
return False
return True
def load_level_in_set(self, set_id=None, level_id_in_set=1):
"""
Load given level in given set with checking.
:param set_id:
:param level_id_in_set:
:rtype: void
"""
if not set_id or not self.level_service.does_set_exist(set_id):
set_id = self.level_service.get_last_set_unlocked()
self.clear_widgets()
# add map
self.add_widget(Level(self.level_event_dispatcher, set_id, level_id_in_set))
# add menu level
self.update_menu_level_label(set_id, level_id_in_set)
# display popup if level need popup
open_pop_up(self, 'open_level', set_id, level_id_in_set)
#####
# Pop up
#####
def pop_up_next(self, instance):
"""
When player click on next button in pop up.
:param instance:
:rtype: void
"""
self.popup.dismiss()
level_list = instance.cls
self.load_level_in_set(level_list[0], level_list[1])
def pop_up_replay(self, instance):
"""
When player click on replay button in pop up.
:param instance:
:rtype: void
"""
self.popup.dismiss()
level_list = instance.cls
if level_list[1] == 1:
level_list[0] -= 1
level_list[1] = 5
else:
level_list[1] -= 1
self.load_level_in_set(level_list[0], level_list[1])
def pop_up_menu(self, instance):
"""
When player click on menu button in pop up.
:param instance:
:rtype: void
"""
self.popup.dismiss()
self.switch_to_menu_screen()
#####
# Menu relatives
#####
def update_menu_level_label(self, set_id, level_id):
"""
Update the menu label of the level.
:param set_id:
:param level_id:
:rtype: void
"""
self.add_widget(
Button(text="Menu", background_color=(0, 0, 0, 1), on_press=self.switch_to_menu_screen)
)
def switch_to_menu_screen(self, *args):
"""
Required method.
"""
Logger.info("Propagate Menu")
propagate_event('Menu', self)