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