diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..53aa1cb --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +octops.py \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..9c79da2 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a971a2c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..4b7d973 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/octops.iml b/.idea/octops.iml new file mode 100644 index 0000000..909438d --- /dev/null +++ b/.idea/octops.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/assets/img/a-long.png b/assets/img/a-long.png new file mode 100644 index 0000000..18033ab Binary files /dev/null and b/assets/img/a-long.png differ diff --git a/assets/img/alongcomplete.png b/assets/img/alongcomplete.png new file mode 100644 index 0000000..7d6f864 Binary files /dev/null and b/assets/img/alongcomplete.png differ diff --git a/assets/img/alongicon.png b/assets/img/alongicon.png new file mode 100644 index 0000000..f095efd Binary files /dev/null and b/assets/img/alongicon.png differ diff --git a/assets/img/symbols/hidden.png b/assets/img/symbols/hidden.png new file mode 100644 index 0000000..85fd7cd Binary files /dev/null and b/assets/img/symbols/hidden.png differ diff --git a/assets/img/symbols/long_bomb_tile.png b/assets/img/symbols/long_bomb_tile.png new file mode 100644 index 0000000..ee28c09 Binary files /dev/null and b/assets/img/symbols/long_bomb_tile.png differ diff --git a/assets/img/symbols/reveal.png b/assets/img/symbols/reveal.png new file mode 100644 index 0000000..ef900fb Binary files /dev/null and b/assets/img/symbols/reveal.png differ diff --git a/octops.py b/octops.py index 16dd0f6..0e05ad8 100644 --- a/octops.py +++ b/octops.py @@ -28,6 +28,7 @@ from screens.doors import DoorsScreen from screens.spawn import SpawnScreen from screens.map import MapScreen +from screens.long import LongScreen #--------------------------App--------------------------# @@ -46,6 +47,8 @@ def build(self): sm.add_widget(DoorsScreen(name='doors')) sm.add_widget(SpawnScreen(name='spawn')) + sm.add_widget(LongScreen(name='long')) + return sm def open_settings(self, *largs): diff --git a/screenLayout/long.kv b/screenLayout/long.kv new file mode 100644 index 0000000..9c221a4 --- /dev/null +++ b/screenLayout/long.kv @@ -0,0 +1,190 @@ +: + FloatLayout: + # Initialize background splash image + BoxLayout: + id: splash_bg + opacity: 1 + AsyncImage: + source: 'assets/img/a-long.png' + allow_stretch: True + keep_ratio: False + size_hint: 1, 1 + + # Initialize a matrix of 3x3 buttons each with unique id, text and position + Button: + id: 1 + size_hint: None,None + size: dp(80), dp(80) + pos: dp(148), dp(347) + color: 157,128,99 + disabled: True if splash_bg_after.opacity == 1 else False # Ensure buttons stay enabled until puzzle is solved + on_press: + root.change_img(self, 1) # Call function to reveal button if bomb or not + root.check_product(self, 1) #call function to check if the cklicked button has bomb or not + + Image: + id: 1 + source: 'assets/img/symbols/hidden.png' # Initialize each button with a grey (hidden) image + center_x: self.parent.center_x + center_y: self.parent.center_y + + Button: + id: 2 + size_hint: None,None + size: dp(80), dp(80) + pos: dp(261), dp(347) + color: 157,128,99 + disabled: True if splash_bg_after.opacity == 1 else False # Ensure buttons stay enabled until puzzle is solved + on_press: + root.change_img(self, 2) + root.check_product(self, 2) + + Image: + id: 2 + source: 'assets/img/symbols/hidden.png' # Initialize each button with a grey (off) image + center_x: self.parent.center_x + center_y: self.parent.center_y + + + Button: + id: 3 + size_hint: None,None + size: dp(80), dp(80) + pos: dp(375), dp(347) + color: 157,128,99 + disabled: True if splash_bg_after.opacity == 1 else False + on_press: + root.change_img(self, 3) + root.check_product(self, 3) + + Image: + id: 3 + source: 'assets/img/symbols/hidden.png' + center_x: self.parent.center_x + center_y: self.parent.center_y + + Button: + id: 4 + size_hint: None,None + size: dp(80), dp(80) + pos: dp(148), dp(242) + color: 157,128,99 + disabled: True if splash_bg_after.opacity == 1 else False + on_press: + root.change_img(self, 4) + root.check_product(self, 4) + + Image: + id: 4 + source: 'assets/img/symbols/hidden.png' + center_x: self.parent.center_x + center_y: self.parent.center_y + + Button: + id: 5 + size_hint: None,None + size: dp(80), dp(80) + pos: dp(261), dp(242) + color: 157,128,99 + disabled: True if splash_bg_after.opacity == 1 else False + on_press: + root.change_img(self,5) # Use the correct button ID (5) + root.check_product(self,5) # Use the correct button ID (5) + + Image: + id: 5 + source: 'assets/img/symbols/hidden.png' + center_x: self.parent.center_x + center_y: self.parent.center_y + + Button: + id: 6 + size_hint: None,None + size: dp(80), dp(80) + pos: dp(375), dp(242) + color: 157,128,99 + disabled: True if splash_bg_after.opacity == 1 else False + on_press: + root.change_img(self, 6) + root.check_product(self, 6) + + Image: + id: 6 + source: 'assets/img/symbols/hidden.png' + center_x: self.parent.center_x + center_y: self.parent.center_y + + Button: + id: 7 + size_hint: None,None + size: dp(80), dp(80) + pos: dp(148), dp(137) + color: 157,128,99 + disabled: True if splash_bg_after.opacity == 1 else False + on_press: + root.change_img(self, 7) + root.check_product(self, 7) + + Image: + id: 7 + source: 'assets/img/symbols/hidden.png' + center_x: self.parent.center_x + center_y: self.parent.center_y + + Button: + id: 8 + size_hint: None,None + size: dp(80), dp(80) + pos: dp(261), dp(137) + color: 157,128,99 + disabled: True if splash_bg_after.opacity == 1 else False + on_press: + root.change_img(self, 8) + root.check_product(self, 8) + + Image: + id: 8 + source: 'assets/img/symbols/hidden.png' + center_x: self.parent.center_x + center_y: self.parent.center_y + + Button: + id: 9 + size_hint: None,None + size: dp(80), dp(80) + pos: dp(375), dp(137) + color: 157,128,99 + disabled: True if splash_bg_after.opacity == 1 else False + on_press: + root.change_img(self, 9) + root.check_product(self, 9) + + Image: + id: 9 + source: 'assets/img/symbols/hidden.png' + center_x: self.parent.center_x + center_y: self.parent.center_y + + # Initialize background image to be switched to on correct combination + BoxLayout: + id: splash_bg_after + orientation: 'vertical' + opacity: 0 + AsyncImage: + source: 'assets/img/alongcomplete.png' #add a file named "a_long_splash" that will be the ending screen + allow_stretch: True + keep_ratio: False + size_hint: 1, 1 + + # Initialize return button to map window + Button: + size_hint: None,None + size: dp(60), dp(60) + pos: dp(12), dp(523) + background_color: 0,0,0,0 + on_press: root.manager.current = 'map' + + Image: + source: 'assets/img/button_return.png' + center_x: self.parent.center_x + center_y: self.parent.center_y diff --git a/screenLayout/map_screen.kv b/screenLayout/map_screen.kv index 0f78f08..115bac1 100644 --- a/screenLayout/map_screen.kv +++ b/screenLayout/map_screen.kv @@ -52,7 +52,7 @@ Button: size_hint: None,None size: dp(135), dp(135) - pos: dp(297), dp(147) + pos: dp(247), dp(147) background_color: 0,0,0,0 on_press: root.manager.current = 'doors' @@ -77,3 +77,18 @@ size: dp(135), dp(135) center_x: self.parent.center_x center_y: self.parent.center_y + + #long + Button: + size_hint: None,None + size: dp(135), dp(135) + pos: dp(450), dp(200) + background_color: 0,0,0,0 + on_press: root.manager.current = 'long' + + Image: + source: 'assets/img/alongicon.png' + size_hint: (1, 1) + size: dp(300), dp(140) + center_x: self.parent.center_x + center_y: self.parent.center_y \ No newline at end of file diff --git a/screenLayout/sitea_screen.kv b/screenLayout/sitea_screen.kv index 188812c..aa14d1e 100644 --- a/screenLayout/sitea_screen.kv +++ b/screenLayout/sitea_screen.kv @@ -44,7 +44,10 @@ size_hint: None,None size: dp(80), dp(80) pos: dp(261), dp(347) - disabled: True + disabled: True if splash_bg_after.opacity == 1 else False + on_press: + root.change_img(self, 2) + root.check_product(self, 2) @@ -112,8 +115,8 @@ pos: dp(261), dp(242) disabled: True if splash_bg_after.opacity == 1 else False on_press: - root.change_img(self, 4) - root.check_product(self, 4) + root.change_img(self, 5) + root.check_product(self, 5) Image: id: 5 diff --git a/screens/doors.py b/screens/doors.py index f75985c..5936f00 100644 --- a/screens/doors.py +++ b/screens/doors.py @@ -6,23 +6,30 @@ Builder.load_file('screenLayout/doors_screen.kv') sound = SoundLoader.load('assets/audio/doors_roger.wav') +#defining a class for doorscreen class DoorsScreen(Screen): - verified = False - + verified = False#initially setting it to false to later check if it turns true or not + + #increasing the value of the label counter in the game as needed. adding 1 at a time + #resetting it to 0 once it reaches 9 def increment_value(self, label_index): - if(int(label_index.text) == 5): + if(int(label_index.text) == 9): label_index.text = "0" else: label_index.text = f"{int(label_index.text) + 1}" DoorsScreen.verify(self) + #decreasing the value of the label counter in the game as needed. decreasing 1 at a time + #resetting it to 9 once it reaches 0 def decrement_value(self, label_index): if(int(label_index.text) == 0): - label_index.text = "5" + label_index.text = "9" else: label_index.text = f"{int(label_index.text) - 1}" DoorsScreen.verify(self) + #checking if the entered label is equal to the passcode saved in screen_check.py is same or not + #if same, then changing bool verified to true, and playinf the exit sounds and making the background screen opaque def verify(self): code = passcode == int(self.ids.label_1.text + self.ids.label_2.text + self.ids.label_3.text + self.ids.label_4.text) if not DoorsScreen.verified and code: diff --git a/screens/long.py b/screens/long.py new file mode 100644 index 0000000..2b0c8dd --- /dev/null +++ b/screens/long.py @@ -0,0 +1,53 @@ +from kivy.lang import Builder +from kivy.uix.screenmanager import Screen +from kivy.core.audio import SoundLoader + +from .screen_check import set_long +import random + +# Import and load .kv file containing widget and layout info along with audio files to be played in the window +Builder.load_file('screenLayout/long.kv') +sound = SoundLoader.load('assets/audio/sitea_planted.wav') +class LongScreen(Screen): + pressed_buttons = [] + flag = "" + correct = random.randint(1,10) + + def show_overlay(self): # Updating the window state after correct combination + self.ids.splash_bg.opacity = 0 + self.ids.splash_bg_after.opacity = 1 + self.pressed_buttons = [] + + def change_img(self, button, idOG): # Toggle the button states to on(green)/off(grey) on press + idOG_dynamic = f"{idOG}" + widget = getattr(self.ids, idOG_dynamic, None) + if widget.source == "assets/img/symbols/hidden.png" and idOG == self.correct: + widget.source = "assets/img/symbols/long_bomb_tile.png" + self.flag = "Valid" + self.change() + elif widget.source == "assets/img/symbols/hidden.png": + widget.source = "assets/img/symbols/reveal.png" + else: + widget.source = "assets/img/symbols/reveal.png" # add images hidden and reveal, reveal will have an image + + def check_product(self, instance, id): # Check for correct code combination + button_id = id + self.pressed_buttons.append(id) + if len(self.pressed_buttons) == 3: # Check every 1 button press + self.flag = "Invalid" + self.change() + # Update global sitea flag variable + + + + def change(self): + if self.flag == "Valid": + sound.play() + self.show_overlay() + set_long() + + elif self.flag == "Invalid": # Toggle all on(green) button states to off(grey) and clear all previous entries + for button in self.pressed_buttons: + widget = getattr(self.ids, f"{button}", None) + widget.source = "assets/img/symbols/hidden.png" + self.pressed_buttons = [] diff --git a/screens/screen_check.py b/screens/screen_check.py index a449f24..a3f4219 100644 --- a/screens/screen_check.py +++ b/screens/screen_check.py @@ -3,6 +3,7 @@ sitea = devMode doors = devMode spawn = devMode +long = devMode passcode = 1275 #linked to bomb hints png slider = [25, 55, 100] #linked to the marks on tracks time = 0 @@ -33,4 +34,11 @@ def set_time(val): time = val def get_time(): - return time \ No newline at end of file + return time + +def set_long(): + global long + long = not long + +def get_long(): + return long \ No newline at end of file diff --git a/screens/siteA.py b/screens/siteA.py index b310bca..72383dd 100644 --- a/screens/siteA.py +++ b/screens/siteA.py @@ -18,7 +18,7 @@ def show_overlay(self): # Updating the window state after correct combination def change_img(self, button, idOG): # Toggle the button states to on(green)/off(grey) on press idOG_dynamic = f"{idOG}" widget = getattr(self.ids, idOG_dynamic, None) - widget.source = "assets/img/symbols/off.png" if widget.source == "assets/img/symbols/off.png" else "assets/img/symbols/off.png" + widget.source = "assets/img/symbols/on.png" if widget.source == "assets/img/symbols/off.png" else "assets/img/symbols/off.png" def check_product(self, instance, id): # Check for correct code combination button_id = id diff --git a/screens/siteB.py b/screens/siteB.py index 3704ba4..379e81f 100644 --- a/screens/siteB.py +++ b/screens/siteB.py @@ -5,7 +5,7 @@ from kivy.uix.screenmanager import Screen from kivy.core.audio import SoundLoader -from .screen_check import passcode, get_spawn, get_doors, get_sitea, get_time +from .screen_check import passcode, get_spawn, get_doors, get_sitea, get_time, get_long from .map import MapScreen Builder.load_file('screenLayout/siteb_screen.kv') @@ -20,18 +20,18 @@ def Delay(delay): return Animation(duration=delay) def on_enter(self): - if not SiteBScreen.visited and not (get_spawn() and get_sitea() and get_doors()): + if not SiteBScreen.visited and not (get_spawn() and get_sitea() and get_doors() and get_long()): SiteBScreen.visited = True octocat_icon = self.Delay(0.5) + Animation(color=(1,1,1,1), pos= (dp(0), dp(0)), duration=0.2, t='out_quad') + self.Delay(3.5) + Animation(color=(1,1,1,0), duration=0.2, t='out_quad') octocat_icon.start(self.ids.octocat_icon) text_bubble = self.Delay(1) + Animation(color=(1,1,1,1), pos = (dp(233), dp(155)), duration=0.2, t='out_quad') + self.Delay(3.5) + Animation(color=(1,1,1,0), pos = (dp(233), dp(155)), duration=0.2, t='out_quad') text_bubble.start(self.ids.octocat_hint) - if get_spawn() and get_sitea() and get_doors() and not SiteBScreen.defused: + if get_spawn() and get_sitea() and get_doors() and get_long() and not SiteBScreen.defused: self.ids.defuse_img.color = (1,1,1,1) def defuse_btn_press(self): - if get_sitea() and get_doors() and get_spawn() and not SiteBScreen.defused: + if get_sitea() and get_doors() and get_spawn() and get_long() and not SiteBScreen.defused: SiteBScreen.defused = True MapScreen.stop_timer(self) Animation(color= (1,1,1,0.5), duration=0.5).start(self.ids.defuse_img) diff --git a/screens/spawn.py b/screens/spawn.py index f770ff0..5762717 100644 --- a/screens/spawn.py +++ b/screens/spawn.py @@ -10,7 +10,7 @@ class SpawnScreen(Screen): verified = False def slider_val_change(self): - if not SpawnScreen.verified and ((self.ids.slide1.value < slider[0]+5) and (self.ids.slide1.value > slider[0]-5 )) and ((self.ids.slide2.value < slider[2]+5)and ( self.ids.slide2.value > slider[2]-5 )) and ((self.ids.slide3.value < slider[2]+5) and (self.ids.slide3.value > slider[2]-5 )): + if not SpawnScreen.verified and ((self.ids.slide1.value < slider[0]+5) and (self.ids.slide1.value > slider[0]-5 )) and ((self.ids.slide2.value < slider[1]+5)and ( self.ids.slide2.value > slider[1]-5 )) and ((self.ids.slide3.value < slider[2]+5) and (self.ids.slide3.value > slider[2]-5 )): SpawnScreen.verified = True self.ids.splash_bg.opacity = 0 self.ids.splash_bg_after.opacity = 1