From 187baf6f3e6c51d1a0ce8b5ad4b8b670928f0484 Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Fri, 12 May 2023 23:45:35 -0400 Subject: [PATCH 01/12] removed old dev menu files --- pocket_friends/development/button_test.py | 50 ------- pocket_friends/development/dev_menu.py | 152 ---------------------- pocket_friends/development/menus.py | 120 ----------------- 3 files changed, 322 deletions(-) delete mode 100644 pocket_friends/development/button_test.py delete mode 100644 pocket_friends/development/dev_menu.py delete mode 100644 pocket_friends/development/menus.py diff --git a/pocket_friends/development/button_test.py b/pocket_friends/development/button_test.py deleted file mode 100644 index df5353c..0000000 --- a/pocket_friends/development/button_test.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -Module to test the GPIO input on the Raspberry Pi. -""" -from collections import deque -from pocket_friends.game_files.io.gpio_handler import Constants, GPIOHandler - - -def button_test(): - """ - GPIO button test. Checks for a GPIO input and prints it out, simple as that. - """ - running = True - - # Exit code used to quit the button test. - exit_code = deque() - for button in ['j_d', 'j_d', 'j_u', 'j_u', 'j_d', 'j_d', 'j_u', 'j_u', 'a', 'a', 'b']: - exit_code.append(button) - - # Input log to check for quitting out of the button test. - input_log = deque() - - GPIOHandler.setup() - - def log(pressed_button): - """ - Logs the pressed button into the input log. - :param pressed_button: - """ - input_log.append(pressed_button) - if len(input_log) > len(exit_code): # Don't let the input log exceed the length of the exit code. - input_log.popleft() - - def check_exit(): - """ - Check if the input log and the exit code are the same. If they are, quit the button test. - """ - nonlocal running - - if exit_code == input_log: - running = False - - while running: - for button in Constants.buttons: - code = Constants.buttons.get(button) - if GPIOHandler.get_press(code): # If a button is pressed, print it out and do a quit check. - print('event: {0}'.format(button)) - log(button) - check_exit() - - GPIOHandler.teardown() diff --git a/pocket_friends/development/dev_menu.py b/pocket_friends/development/dev_menu.py deleted file mode 100644 index 9dead9b..0000000 --- a/pocket_friends/development/dev_menu.py +++ /dev/null @@ -1,152 +0,0 @@ -""" -Development menu for the hardware on Raspberry Pi. NOTE: THIS DOES NOTHING ON A COMPUTER! -""" -import pocket_friends.game_files.game -import importlib.util -import os -import pygame -import time -from .button_test import button_test -from .menus import Menu -from pocket_friends.game_files.io.gpio_handler import GPIOHandler, Constants - -try: - importlib.util.find_spec('RPi.GPIO') - import RPi.GPIO as GPIO -except ImportError: - import pocket_friends.game_files.io.fake_gpio as GPIO - -# Global variable to keep track of the current menu. -menu = 'main' - - -def run_button_test(): - """ - Runs the GPIO button test. - """ - GPIOHandler.teardown() - button_test() - GPIOHandler.setup() - - -def clear_screen(): - """ - Clears the screen. - """ - print("\n" * 20) - - -def start_game(): - """ - Cleans the GPIO and starts the hardware. - """ - GPIOHandler.teardown() - pocket_friends.game_files.game.main() - pygame.quit() - GPIOHandler.setup() - - -def quit_menu(): - """ - Quits the menu. - """ - exit(0) - - -def quit_with_error(): - """ - Quits the menu with error code 3. - """ - exit(3) - - -def change_menu(new_menu): - """ - Changes the global menu variable for the dev menu - :param new_menu: the menu to change to - """ - global menu - menu = new_menu - clear_screen() - print('...') - time.sleep(0.75) - - -def shutdown(): - """ - Shuts down the linux system. - """ - os.system('sudo shutdown now') - - -def restart(): - """ - Restarts the linux system. - """ - os.system('sudo reboot') - - -def main(): - """ - Starts the dev menu. - """ - - # The following defines all of the options in the various different menus. - - main_menu = Menu('Pocket Friends Dev Menu') - main_menu.add_option(Menu.Option('Start Game', start_game)) - main_menu.add_option(Menu.Option('Button Test', run_button_test)) - main_menu.add_option(Menu.Option('Restart Dev Menu', quit_with_error)) - main_menu.add_option(Menu.Option('Shutdown Pi', change_menu, 'shutdown')) - main_menu.add_option(Menu.Option('Restart Pi', change_menu, 'restart')) - main_menu.add_option(Menu.Option('Quit Dev Menu', change_menu, 'quit')) - - shutdown_confirm = Menu('Are you sure you want to shutdown?') - shutdown_confirm.add_option(Menu.Option('No', change_menu, 'main')) - shutdown_confirm.add_option(Menu.Option('Yes', shutdown)) - - restart_confirm = Menu('Are you sure you want to restart?') - restart_confirm.add_option(Menu.Option('No', change_menu, 'main')) - restart_confirm.add_option(Menu.Option('Yes', restart)) - - quit_confirm = Menu('Are you sure you want to exit?') - quit_confirm.add_option(Menu.Option('No', change_menu, 'main')) - quit_confirm.add_option(Menu.Option('Yes', quit_menu)) - - GPIOHandler.setup() - - def menu_handler(current_menu): - """ - Draws the menu and handles the GPIO inputs - :param current_menu: the current menu being drawn on the screen - """ - current_menu.draw_menu() - - while True: # Main GPIO input loop - - # Limits how often the program checks for a GPIO input. Eases CPU usage. - time.sleep(0.125) - - if GPIOHandler.get_press(Constants.buttons.get('j_d')): - current_menu.select_next() - break - if GPIOHandler.get_press(Constants.buttons.get('j_u')): - current_menu.select_prev() - break - if GPIOHandler.get_press(Constants.buttons.get('a')): - current_menu.run_selection() - break - - while True: # Loop for drawing the menus. - - while menu == 'main': - menu_handler(main_menu) - - while menu == 'shutdown': - menu_handler(shutdown_confirm) - - while menu == 'restart': - menu_handler(restart_confirm) - - while menu == 'quit': - menu_handler(quit_confirm) diff --git a/pocket_friends/development/menus.py b/pocket_friends/development/menus.py deleted file mode 100644 index 6e8d62d..0000000 --- a/pocket_friends/development/menus.py +++ /dev/null @@ -1,120 +0,0 @@ -""" -Menu class to help with drawing menus on screen -""" - - -class Menu: - """ - Menu class. Creates a menu with text to display and options - """ - - def __init__(self, menu_text=''): - self._menu_text = menu_text - self._options = [] - self._selection = 0 - - def add_option(self, option): - """ - Adds an option to the menu. Only allows instances of Menu.Option - :param option: - """ - if not isinstance(option, Menu.Option): - raise TypeError('option must be an instance of Menu.Option') - else: - self._options.append(option) - - def get_option(self, index): - """ - Gets an option object given the index of the option. Raises IndexError if given - index is out of bounds. - :param index: the index of the option - :return: the option object - """ - try: - return self._options[index] - except IndexError as ex: - raise IndexError('option index out of range') from ex - - def select_next(self): - """ - Selects the next option in the list. Wraps around to the first option if - the last option is currently selected. - """ - self._selection += 1 - if self._selection >= len(self._options): - self._selection = 0 - - def select_prev(self): - """ - Selects the previous option in the list. Wraps around to the last option if - the first option is currently selected. - """ - self._selection -= 1 - if self._selection < 0: - if len(self._options) > 0: - self._selection = len(self._options) - 1 - else: - self._selection = 0 - - def run_selection(self, *args, **kwargs): - """ - Runs the function that the currently selected option object points to. - :param args: arguments to be passed to the function - :param kwargs: keyword arguments to be passed to the function - """ - try: - return self._options[self._selection].preprocess(*args, **kwargs) - except IndexError as ex: - raise Exception('menu has no options, cannot run a non-existent option') from ex - - def draw_menu(self): - """ - Draws the menu on screen with a leading 20 blank lines. - """ - print('\n' * 20) - - print(self._menu_text + '\n') - - for option in self._options: - selection_char = '>' - - if self._options.index(option) != self._selection: - selection_char = ' ' - - print('{0} {1}'.format(selection_char, option.get_text())) - - class Option: - """ - Class that defines options for the Menu class. - """ - - def __init__(self, option_text='', function=None, *args, **kwargs): - self._option_text = option_text - self._function = function - self._default_args = args - self._default_kwargs = kwargs - - def get_text(self): - """ - Returns the text to be displayed by the option - :return: the option text - """ - return self._option_text - - def run(self, *args, **kwargs): - """ - Runs the function that the option object points to. Returns None if - there is no function or the given function is not valid. - :param args: arguments to be passed to the function - :param kwargs: keyword arguments to be passed to the function - :return: the return value of the function (if any) - """ - if len(args) == 0: - args = self._default_args - if len(kwargs) == 0: - kwargs = self._default_kwargs - - try: - return self._function(*args, **kwargs) - except TypeError: - return None From 4249a7c3f1346bad51db5a0b2bd390180e92f18c Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Sun, 14 May 2023 17:47:56 -0400 Subject: [PATCH 02/12] added preliminary dev menu --- pocket_friends/development/dev_menu.py | 26 +++++++++++++++++++++ pocket_friends/elements/surface.py | 5 ++-- pocket_friends/game.py | 4 ++-- pocket_friends/resources/images/dev_bg.png | Bin 0 -> 2127 bytes 4 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 pocket_friends/development/dev_menu.py create mode 100644 pocket_friends/resources/images/dev_bg.png diff --git a/pocket_friends/development/dev_menu.py b/pocket_friends/development/dev_menu.py new file mode 100644 index 0000000..2c10f0c --- /dev/null +++ b/pocket_friends/development/dev_menu.py @@ -0,0 +1,26 @@ +import pygame +from pocket_friends.elements import surface + + +class Surface(surface.GameSurface): + def __init__(self, game_res, resources_dir, game_fps, **kwargs): + super().__init__(game_res, resources_dir, game_fps) + self.frames = 1 + self.game_fps = game_fps + self.delay = 1 + self.font = pygame.font.Font(resources_dir + '/fonts/5Pts5.ttf', 10) + self.bg = pygame.image.load(self.resource_dir + '/images/dev_bg.png').convert_alpha() + + def update(self): + self.preprocess() + + text = self.font.render('f: {0}'.format(self.frames), False, (128, 128, 128)) + self.blit(text, (3, 68)) + + self.frames += 1 + self.frames %= self.game_fps + + for event in pygame.event.get(): + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_b: + self.running = False diff --git a/pocket_friends/elements/surface.py b/pocket_friends/elements/surface.py index 663f499..8749834 100644 --- a/pocket_friends/elements/surface.py +++ b/pocket_friends/elements/surface.py @@ -12,6 +12,7 @@ class GameSurface(pygame.Surface): resource_dir (:obj:`str`): The path of the game's main resource directory. game_fps (int): How many frames per second the game will run at. additional_args (dict): Additional arguments to send to the next surface after halting. + bg (:obj:`pygame.Surface`): The background of the surface. """ def __init__(self, game_res, resources_dir, game_fps): """ @@ -30,7 +31,7 @@ class GameSurface(pygame.Surface): self._input_handler = InputHandler(self._clock) self.additional_args = {} - self._bg = pygame.image.load(self.resource_dir + '/images/bg.png').convert_alpha() + self.bg = pygame.image.load(self.resource_dir + '/images/bg.png').convert_alpha() self.sprites = pygame.sprite.Group() def preprocess(self): @@ -39,7 +40,7 @@ class GameSurface(pygame.Surface): """ self._clock.tick(self.game_fps) - self.blit(self._bg, (0, 0)) + self.blit(self.bg, (0, 0)) self.sprites.update() self.sprites.draw(self) diff --git a/pocket_friends/game.py b/pocket_friends/game.py index f4019ca..d0a6041 100644 --- a/pocket_friends/game.py +++ b/pocket_friends/game.py @@ -12,7 +12,7 @@ valid_surfaces = [ ] # Add all the surface modules to a dictionary for easy switching -surface_modules = {} +surface_modules = {'dev_menu': importlib.import_module('pocket_friends.development.{0}'.format('dev_menu'))} for module in valid_surfaces: surface_modules[module] = importlib.import_module('pocket_friends.surfaces.{0}'.format(module)) starting_surface = 'title' @@ -66,7 +66,7 @@ def start_game(resolution=240): next_surface = surface.next_surface additional_args = surface.additional_args if next_surface not in valid_surfaces: - next_surface = 'error_screen' + next_surface = 'dev_menu' surface = surface_modules.get(next_surface).Surface((game_res, game_res), resources_dir, game_fps, **additional_args) pygame.display.flip() diff --git a/pocket_friends/resources/images/dev_bg.png b/pocket_friends/resources/images/dev_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..eb80ae137c21eb0998bab9266f823043ab46d100 GIT binary patch literal 2127 zcmV-V2(b5wP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00*~8L_t(|+U;9emzz2a#@J@f z#QFdKazYX?i@6UvRds}M3}L3z-uR(snh>l{o3%Mf-s`>osU_I|wbp5xCQ0I)8;0TE z1FYEp%d*@AIG#auUBe&u`~4{DKR!OBlu43I)6_K09>73-k|aWinBQkvrj$yOWE@8? zU}Ma0brJ%o?EBtY`#NBx7XR1`7}q?{ky`?c<(6exW?6=e!xu^^^E^kud7c+V0Xh;X zrI&cL_C??KQ9j@o9;Oj_o@=e?hm?c#b9hV$5ig}L0URUYJkOCz_Iyzk6u>;s!!S7K z5OAL7TeXobu-;dl*6uA443ptBO=z*sxw0%#u<+qiXHiuZdZx$Y!BoS$`&R)5cLf5Z zz84*Gk|fkDt+ho_tl9h;aw#PMmQo5Ka3j=_O@PzDc@zF+UDs>+%+x+?DU??BFpxp@ z2w9xxIdzBeM_syRx=aFjo*QF~G3WCcD4=KqCop5&(#cU30C&ywnf<)3YbhmtZM=9x z5@vwmfB|2sl*;oQ8Sk8H+m=2|`ORF5*XpKe!f(&#Gd;bQdajhJstQHzoa?&oV5fy{ z1Lc4uQgWH50IlGV!Cg`6Dd47Qj4^22bzR@@_p&U#epm=WKeyIy3W3!cp#ZGwIwZyG zpXYg|o|EFiXV5dRX#sEzg{HN>TrP|%Ywc3t&bdwcoFoZn;W&=yIi!?KEXZSa>UiT8 z46~O!UB;o)G)XDF&yVBSG|fEE&N&F|gb?#QL;SoIu<%B|-V*|7Vhry4K43!LSM`1G zRSNI(!!R6}Y$3YeDWP}7`q*X#Ab zT_KgH6)bOx_O&XlwXUkln+d0BYK&Rat4%35LQZ%gK65^w;hka6v{rQzLKtIciDJ(=EQHWn=Xs7DlQ1=FUK$)e ztTl(U)_i2;m%z6`?H&m;HG>x!W1v>JFYrKHP)dc%*8wL-nMHLNOSzl+k1D)3t9oxb z5~peMo~z8^g~_G6kK>r8>G^!7b>gj5{oah3f%h%m8s(aoj!6}1ljW(sD5bzlFU#>e z0W+<`7tQkwM}@aU9JAk=Cl9v{pGq%4RaB(aG|lOB0^)=aecuB?;S-M$y(!D1D&y5{ zXu&WAcFsZjVn@A!?{T}`kg1T(E+x+vMYv{=YZ9h!hV7PiVXbBJAwmdi?Y`=YT4O4_ zx+n^Y2eocZjE4jvOU&~;(?Ae9j8skHrR@<26|xZGa=92|0BZ4Ttyvl~xfuT$^9-fNEy|L-Q^pALNg zYk=_(iYzStbt{dm*ZiA+X+-*Z5chXTcwZUeZ?$2n&wnL5=4;oe}{? zPys5XSkg94({7)tV$2C+FRxf&mIH@KV`_+Lnr2ysfN>Tax9GYKJ2gTGWXCj3ky~sA z3|t2!)U;Thon;wq4oE4DF>4hzdaDI6Xsr<#UC>O&&J#U5UYsVDjC$M~! z*zEue(Y#GvC=a6C;I0O{{6v3r(>H-SRX|ZQD{!PSX^NnAB}z;U28+d_FJxdbG+-f9pM0S<#mX{7V4C zOgd0W2?gF$ez$G=csy89-dkH=CSh=ggE`*1u9t^UQ52h+quT(pdYxCus09F(m0G<5 zVVwlng>gY^P4D?pUbCxPhuLrvyiv<|k3N}6$r~rEwey+##Ao1E3v-;uOBil-1OQXj zioA-awLYCr3@wZ;tXVJKD}35#Jj`jWMGlcs9_`B%MM0IEHgt?Jlr=P{f937i6CU6J|A<)CoMj5pcYW!LwvprGRlP@)(tVdW90VUtanPj3H!MMukRiqdp#wVHl{~5Gu6SSoD6s z-|^vn`GZ=98G*qmoI!yY5H2b%bpd8GF%o92DLS?ZF*A-GAgTbxFLt&#;BXIaNs4n0 z4n`^*uzyGukazH}wsSB) literal 0 HcmV?d00001 From b6432e233ad7cf1d0237c82741f0f6594a1a988e Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Sun, 14 May 2023 17:55:37 -0400 Subject: [PATCH 03/12] changed dev menu to white --- pocket_friends/resources/images/dev_bg.png | Bin 2127 -> 2122 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pocket_friends/resources/images/dev_bg.png b/pocket_friends/resources/images/dev_bg.png index eb80ae137c21eb0998bab9266f823043ab46d100..838cde6563f6fa7ec8c7423ab2fce5e7526b0a6f 100644 GIT binary patch delta 2023 zcmVP+1_B_Nulr>DDln3KsEsIN9^bA)p)`$58S7=~$@vMiHQ7De&>0k>_t z3UE4u>biyxr_p>+VT>7ufqqFjNWX{2oO9_?dJEtb2^(XOO7?u$brgUQq9_U}B?30atkp)gz`It0Bo&w&f!6*BdY+*$bA$4WnI@HeP(JOw-ib%dl<-|dW0-C#!z>de$~m4 z=`slzW3<*<>)Y)H6i~F08<;U}?&PQnfV*b;%zj?iwY8RRn=am%gc)FexM0ASj^k*I zLB>ld4~GMNnDU#s7O&Oid5-^jyWQyRHP`cT9Gj*=QA;WJ`~8cZ7P<|T1CmI|WtsxC zfmMFH|!_K*37>qI4F^N+X^3ve&VTBx0sQJjsFOh!* zYPU$3sTpjfwU$!G8+;LVpe>B!7%yK(oE&8q)nP2HQiPyi>N@}KIUIuOG&nYkdO~Bu2{q~l=`}*+{@rwiB-wiNc zLf_Sy$;5ii_XJEM(&vM?f6Pn2yxRN~ZJ6rw-wmfw*I4ZVJ3&e*Hp06-AN~pp=J5a+ zR&eUN#_GrB4x9Q+k9EJ_;fTf3Ip(3mFu*i_G333^-yNSSVT1t_)OgR+DG^`<72r6I zENRR0e6vqgDdvQ+mscz>%VDjByfmeTI89UE_Xrqg!SRUwevh3R=Nz&l&-271Rs+WQ zWLgUE`<~_5ec#jOfVEa@9jdU=w^{(hFboKcE@-A>=ZW4OPfimD@1DA@=R^2V_@}*p z9M%e90+|EGIu5+9!O${S#A4g$(Q?4_?hQ2xr)k0>9%dSI?RY#MevMKJQL!f5e7JtT z`SVi(%h5%i=ZC|AYVtHqSj41m6ASksWTp!!WN&-Ld#^H0!8xcm0v1A4RRvU1LV@>` z--pBDcs#PAytlSKPr~3G4(51ql%B4CuIpAcN7n&n^*XPRQ40VnE46wB!a50X3gf~s z4D>xe%4_!O*2`=-i@s6Ic#l4rNy!^0gxdMc`QtN6Davd5X6h>?EQE*ztE}&y_$uBo z43Ecyp@p%9koDqwg^PX0_tv!LP1?|+eVMN7sFKr$j@Fv8h6Yve;c~ekW*DP?nzQLC zz>CvS6mW#)=-9N@kxR%qhaQeL%BYP{;}11`)XG>zGdhk%xD z2qPubO+u_n0pnQYYgBsi6-qpQ{?cD$459CPDm3~w>hX9iih{}wp+b9&MenE62_N2; zKd5<_5gDAq85EcZR7%nR27o?RcDYy5pod6xSX){kqZ{Rh|LbJ4T-N3;L{002ovPDHLk FV1foo@B{z= delta 2028 zcmVz&y{xFgWKBaGvK|wUI5b z-dCO0?ky1vli@T?XtB<@vMf=5u<+qiXHiuZdZx$Y!BoS$`&R)5cLf5Zz84*Gk|fkD zt+ho_tl9h;aw#PMmQo5Ka3j=_O@PzDc@zF+UDs>+%+x+?DU??BFpxp@2w9xxIdzBe zM_syRx=aFjo*QF~G3WCcD4=KqCop5&(#cU30C&ywnf<)3YbhmtZM=AYLlS0y;eY{O zs+7v}92xJNYulDSO!>`Ri`VL=X~J*M=QBOMmU^y~s;UY_?VRhn?qH{dZUg0jBvNvj zrU0$rkilJ1>M7u+X^b&w+jU*v@AtASy?$5-K|ipCRG>!0U&rk<1H z!DrAjuW12r4TYw)zFaPUj4EsGQsB3YeDWP}7`q*X#AbT_KgH z6)bOx_O&XlwXUkln+d0BYK&Rat4%35K-MYIufU8 z@}8^A;f2Y6rMr*gn5OCZe5Q5ctyKNqjG2M=E#4aCnwO4A6={>@sl6zrz)LU7@jC%C zt-}}1^9)CYw?rJX-2w0(gb;n-13}>vj}g5o%cCme)op0O zFa>tbLHlAyy@Bs>yWNnfkj*Y7&lW|vW{_(Vrf-IS?Ur_7t!48eLI`W^zUqovV=BD5 zC<=-PwQfy}hXf%@%=0|cKoB~NR88Wg?GXqSvJm2Oxfo*rYVm8WSsF9B82=gb4B%N) zH0W2qQ~>z={G^sCgec4Ma=EbcfGWlOYcWFM!$1oPe;a-fNEy|L-Q^pALNg zYk=_(iYzStbt{dm*ZiA+X+-*Z5chXTcwZUeZ?$2n&wnJMtW+XYX30File|;;qfRODRvMlXpL; za-nguP71@beEI8B0?*y@G)-;WQcX_N6pNVDZDQdbtnPe1FZ+75%1wXkJy%)LmkIn! z0K-f=P)P{|-cx?JZTomUSW(_vTVE!BVQ`0oIo`UimxoYM6q}l(+W@nAoma@H1pt+m zTD<~codnp0aY1WM@A*+)v#VQ&*>DoPQOkIbKAB0$8z-!_^O^g^XW&)~bDYOZ7;be0 z08`b9yo#r_KAlbsEsQO!SufrzeA;I`%xSGf4v|qF?aLHJL6w{~bc`{SH8iMyf937i6CU6J|A<)CoMj5pcYW!LwvprGRlP@)(tVdW90VUtanPj3H!MMukRiqdp#wVHl{~5Gu6S zSoD6s-|^vn`GZ=98G*qmoI!zG7!WQhE_DHBGcgiottmRT2{AK{9U!Uz#V>ZYIN)#( zZb^!B4h}{t9I$^#6_9uEueT?9yWRGApgk$-*S&g~<-XS+SpNYQg+cG!t7$0!0000< KMNUMnLSTZHHQWjS From 8a34ed7c01567577db8946783b787c03725ac97b Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Sun, 14 May 2023 19:06:50 -0400 Subject: [PATCH 04/12] created dev menu selector and test functions --- pocket_friends/development/dev.py | 9 +++++ pocket_friends/development/dev_menu.py | 27 +++++++++++++- pocket_friends/development/sprites.py | 34 ++++++++++++++++++ pocket_friends/game.py | 3 +- .../images/{ => dev_menu}/dev_bg.png | Bin .../resources/images/dev_menu/selector.png | Bin 0 -> 839 bytes 6 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 pocket_friends/development/dev.py create mode 100644 pocket_friends/development/sprites.py rename pocket_friends/resources/images/{ => dev_menu}/dev_bg.png (100%) create mode 100644 pocket_friends/resources/images/dev_menu/selector.png diff --git a/pocket_friends/development/dev.py b/pocket_friends/development/dev.py new file mode 100644 index 0000000..5f25714 --- /dev/null +++ b/pocket_friends/development/dev.py @@ -0,0 +1,9 @@ +import os + + +def reboot_system(): + os.system('echo TEST REBOOT') + + +def shutdown_system(): + os.system('echo TEST SHUTDOWN') diff --git a/pocket_friends/development/dev_menu.py b/pocket_friends/development/dev_menu.py index 2c10f0c..9b5424e 100644 --- a/pocket_friends/development/dev_menu.py +++ b/pocket_friends/development/dev_menu.py @@ -1,5 +1,12 @@ import pygame from pocket_friends.elements import surface +from pocket_friends.development.sprites import FunctionSelector +import pocket_friends.development.dev as dev + +dev_functions = { + 'Restart': 'reboot_system', + 'Shutdown': 'shutdown_system' +} class Surface(surface.GameSurface): @@ -9,18 +16,36 @@ class Surface(surface.GameSurface): self.game_fps = game_fps self.delay = 1 self.font = pygame.font.Font(resources_dir + '/fonts/5Pts5.ttf', 10) - self.bg = pygame.image.load(self.resource_dir + '/images/dev_bg.png').convert_alpha() + self.bg = pygame.image.load(self.resource_dir + '/images/dev_menu/dev_bg.png').convert_alpha() + + functions = [] + for key in dev_functions.keys(): + functions.append(key) + + self.function_selector = FunctionSelector(resources_dir, game_res, functions) + + def execute(self): + + executing_function = getattr(dev, dev_functions.get(self.function_selector.get_function())) + executing_function() def update(self): self.preprocess() text = self.font.render('f: {0}'.format(self.frames), False, (128, 128, 128)) self.blit(text, (3, 68)) + self.function_selector.draw(self) self.frames += 1 self.frames %= self.game_fps for event in pygame.event.get(): if event.type == pygame.KEYDOWN: + if event.key == pygame.K_UP: + self.function_selector.scroll_up() + if event.key == pygame.K_DOWN: + self.function_selector.scroll_down() + if event.key == pygame.K_a: + self.execute() if event.key == pygame.K_b: self.running = False diff --git a/pocket_friends/development/sprites.py b/pocket_friends/development/sprites.py new file mode 100644 index 0000000..f172a57 --- /dev/null +++ b/pocket_friends/development/sprites.py @@ -0,0 +1,34 @@ +import pygame + + +class FunctionSelector: + + def __init__(self, resources_dir, game_res, functions): + self.font = pygame.font.Font(resources_dir + '/fonts/5Pts5.ttf', 10) + self.functions = functions + self.max_lines = 6 # Max number of lines to be shown on screen at a time. + self.offset = 0 + self.game_res = game_res + + self.selected = 0 + self.max_index = len(self.functions) - 1 + self.selector = pygame.image.load(resources_dir + '/images/dev_menu/selector.png').convert_alpha() + + def draw(self, surface): + for i in range(self.max_index + 1): + text = self.font.render(self.functions[i], False, (0, 0, 0)) + surface.blit(text, (8, (-3 + (i * 6)))) + surface.blit(self.selector, (0, (self.selected * 6))) + + def scroll_down(self): + self.selected += 1 + if self.selected > self.max_index: + self.selected = self.max_index + + def scroll_up(self): + self.selected -= 1 + if self.selected < 0: + self.selected = 0 + + def get_function(self): + return self.functions[self.selected] diff --git a/pocket_friends/game.py b/pocket_friends/game.py index d0a6041..5ba9ba1 100644 --- a/pocket_friends/game.py +++ b/pocket_friends/game.py @@ -3,7 +3,6 @@ import os import pocket_friends import importlib - valid_surfaces = [ 'title', 'egg_select', @@ -66,7 +65,7 @@ def start_game(resolution=240): next_surface = surface.next_surface additional_args = surface.additional_args if next_surface not in valid_surfaces: - next_surface = 'dev_menu' + next_surface = 'error_screen' surface = surface_modules.get(next_surface).Surface((game_res, game_res), resources_dir, game_fps, **additional_args) pygame.display.flip() diff --git a/pocket_friends/resources/images/dev_bg.png b/pocket_friends/resources/images/dev_menu/dev_bg.png similarity index 100% rename from pocket_friends/resources/images/dev_bg.png rename to pocket_friends/resources/images/dev_menu/dev_bg.png diff --git a/pocket_friends/resources/images/dev_menu/selector.png b/pocket_friends/resources/images/dev_menu/selector.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f7a629684e977bc7b6d45246c854f7537f29e2 GIT binary patch literal 839 zcmV-N1GxN&P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KHvfCgGhTmC5mw;|aEC+*`=?=R5{y4Fdo|A{3 zwlAFt8V5$v1@sALlJ+0pXZnUgrD#&~D7BP~p;aq4EFwR~exGa3bFCE*-F0+XQF{Jj zY?lH3;&84QvtX8+^2#SGkUTk*Yo=FvvJZN>((o@kiZc*Hp7c|)<>wKPXU-85XHLsn zn-CYuCdreO1~r{4Y&2utT(1X{lKLPy?ur0Wz&JP4Ld2uAQYB%O=Dm6w6$ z?5jkC)6=~zurKC?fmRh|eZmSrXr6s!M}bfIH~@6RkF7>amH8i1vPnZoF#2DSSc zg4XNA7BdiIB@p*T01eHHSq@U=MJ_F7xiW5rF?MMS&Y(pM1a&92Nf)~Zxlh~@?){%~ z<7aYdq5Bu)(n9xw+-GhtsEzf0@9Q3Byx7(?Tt&@->j#598V4-+YjgUl!#mJB&^ypO z&^ypO(0>tV;+GTufYMLqDI26l&shlo000JJOGiWi{{a60|De66lK=n!32;bRa{vG? zBLDy{BLR4&KXw2B00(qQO+^Ri1r8Q48r3Cfk^lez8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b031m~K~xCWV_+Z>{D(1^a7i+vtHfv2f4p|!1OVSX1^z9A RbM62D002ovPDHLkV1l-uZ*c$s literal 0 HcmV?d00001 From 1c467371a8dc2e91bbc204c8965646f824da530c Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Sun, 14 May 2023 19:26:09 -0400 Subject: [PATCH 05/12] integrated dev menu into game with secret code --- pocket_friends/elements/surface.py | 5 +++++ pocket_friends/game.py | 10 ++++++++-- pocket_friends/io/input_handler.py | 13 ++++++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/pocket_friends/elements/surface.py b/pocket_friends/elements/surface.py index 8749834..cc3a3e0 100644 --- a/pocket_friends/elements/surface.py +++ b/pocket_friends/elements/surface.py @@ -30,6 +30,7 @@ class GameSurface(pygame.Surface): self.game_fps = game_fps self._input_handler = InputHandler(self._clock) self.additional_args = {} + self.dev_override = False self.bg = pygame.image.load(self.resource_dir + '/images/bg.png').convert_alpha() self.sprites = pygame.sprite.Group() @@ -45,3 +46,7 @@ class GameSurface(pygame.Surface): self.sprites.draw(self) self._input_handler.update() + if self._input_handler.dev_found: + self.next_surface = 'dev_menu' + self.dev_override = True + self.running = False diff --git a/pocket_friends/game.py b/pocket_friends/game.py index 5ba9ba1..5b1cd15 100644 --- a/pocket_friends/game.py +++ b/pocket_friends/game.py @@ -4,6 +4,7 @@ import pocket_friends import importlib valid_surfaces = [ + 'dev_menu', 'title', 'egg_select', 'selection_info', @@ -13,7 +14,8 @@ valid_surfaces = [ # Add all the surface modules to a dictionary for easy switching surface_modules = {'dev_menu': importlib.import_module('pocket_friends.development.{0}'.format('dev_menu'))} for module in valid_surfaces: - surface_modules[module] = importlib.import_module('pocket_friends.surfaces.{0}'.format(module)) + if module != 'dev_menu': + surface_modules[module] = importlib.import_module('pocket_friends.surfaces.{0}'.format(module)) starting_surface = 'title' # FPS for the game to run at. @@ -62,9 +64,13 @@ def start_game(resolution=240): window.blit(frame, frame.get_rect()) if not surface.running: - next_surface = surface.next_surface + if surface.dev_override: + next_surface = 'dev_menu' + else: + next_surface = surface.next_surface additional_args = surface.additional_args if next_surface not in valid_surfaces: + print(next) next_surface = 'error_screen' surface = surface_modules.get(next_surface).Surface((game_res, game_res), resources_dir, game_fps, **additional_args) diff --git a/pocket_friends/io/input_handler.py b/pocket_friends/io/input_handler.py index e04f7f0..6d13e8c 100644 --- a/pocket_friends/io/input_handler.py +++ b/pocket_friends/io/input_handler.py @@ -1,5 +1,5 @@ import pygame - +from collections import deque class InputHandler: """ @@ -24,6 +24,12 @@ class InputHandler: self.clock = pygame_clock self.tick_check = tick_check self.last_input_tick = 0 + self.dev_check = deque() + self.dev_code = deque() + for button in [pygame.K_DOWN, pygame.K_DOWN, pygame.K_UP, pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, + pygame.K_RIGHT, pygame.K_LEFT, pygame.K_a]: + self.dev_code.append(button) + self.dev_found = False def create_event(self, pressed_button): """ @@ -37,6 +43,9 @@ class InputHandler: if pygame.time.get_ticks() - self.last_input_tick > self.clock.get_time() * 2: pygame.event.post(pygame.event.Event(pygame.KEYDOWN, {'key': pressed_button})) pygame.event.post(pygame.event.Event(pygame.KEYUP, {'key': pressed_button})) + self.dev_check.append(pressed_button) + if len(self.dev_check) > len(self.dev_code): + self.dev_check.popleft() else: pygame.event.post(pygame.event.Event(pygame.KEYDOWN, {'key': pressed_button})) pygame.event.post(pygame.event.Event(pygame.KEYUP, {'key': pressed_button})) @@ -70,3 +79,5 @@ class InputHandler: def update(self): """Run either the GPIO handler or the keyboard handler to check for input and create events.""" self.handle_keyboard() + if self.dev_code == self.dev_check: + self.dev_found = True From 7c4942435064a6cd5f5c378e8ed955749849f23e Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Sun, 14 May 2023 19:26:38 -0400 Subject: [PATCH 06/12] made dev commands actually do something --- pocket_friends/development/dev.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pocket_friends/development/dev.py b/pocket_friends/development/dev.py index 5f25714..9cb10a1 100644 --- a/pocket_friends/development/dev.py +++ b/pocket_friends/development/dev.py @@ -2,8 +2,8 @@ import os def reboot_system(): - os.system('echo TEST REBOOT') + os.system('sudo reboot') def shutdown_system(): - os.system('echo TEST SHUTDOWN') + os.system('sudo shutdown') From d4ff6d0786cb26557ba9f593d9302249c6faa052 Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Sun, 14 May 2023 19:32:12 -0400 Subject: [PATCH 07/12] fixed shutdown dev command --- pocket_friends/development/dev.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pocket_friends/development/dev.py b/pocket_friends/development/dev.py index 9cb10a1..9e8ca83 100644 --- a/pocket_friends/development/dev.py +++ b/pocket_friends/development/dev.py @@ -6,4 +6,4 @@ def reboot_system(): def shutdown_system(): - os.system('sudo shutdown') + os.system('sudo shutdown now') From 2def4f846a875e7a948b8ebad3ed369e710a9403 Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Sun, 14 May 2023 19:41:44 -0400 Subject: [PATCH 08/12] added update command --- pocket_friends/development/dev.py | 8 ++++++++ pocket_friends/development/dev_menu.py | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pocket_friends/development/dev.py b/pocket_friends/development/dev.py index 9e8ca83..422c85c 100644 --- a/pocket_friends/development/dev.py +++ b/pocket_friends/development/dev.py @@ -1,4 +1,7 @@ import os +import sys + +import pygame def reboot_system(): @@ -7,3 +10,8 @@ def reboot_system(): def shutdown_system(): os.system('sudo shutdown now') + +def update(): + os.system('bash "cd ~/pocket_friends && git pull"') + os.system('bash "cd ~/pocket_friends && git checkout ."') + sys.exit(1) \ No newline at end of file diff --git a/pocket_friends/development/dev_menu.py b/pocket_friends/development/dev_menu.py index 9b5424e..60d3c5b 100644 --- a/pocket_friends/development/dev_menu.py +++ b/pocket_friends/development/dev_menu.py @@ -5,7 +5,8 @@ import pocket_friends.development.dev as dev dev_functions = { 'Restart': 'reboot_system', - 'Shutdown': 'shutdown_system' + 'Shutdown': 'shutdown_system', + 'Update': 'update' } From ad977256343864d3da4e989974d0e1cc447a8abd Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Sun, 14 May 2023 19:44:08 -0400 Subject: [PATCH 09/12] added bin to commands --- pocket_friends/development/dev.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pocket_friends/development/dev.py b/pocket_friends/development/dev.py index 422c85c..e3523f7 100644 --- a/pocket_friends/development/dev.py +++ b/pocket_friends/development/dev.py @@ -12,6 +12,8 @@ def shutdown_system(): os.system('sudo shutdown now') def update(): - os.system('bash "cd ~/pocket_friends && git pull"') - os.system('bash "cd ~/pocket_friends && git checkout ."') + os.system('bash "export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin && cd ~/pocket_friends && git ' + 'pull"') + os.system('bash "export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin && cd ~/pocket_friends && git ' + 'checkout ."') sys.exit(1) \ No newline at end of file From d7a01340b74efff3e86a5a92c29ef1e7ec2c0bde Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Sun, 14 May 2023 19:45:34 -0400 Subject: [PATCH 10/12] fixed update commands --- pocket_friends/development/dev.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pocket_friends/development/dev.py b/pocket_friends/development/dev.py index e3523f7..eda892e 100644 --- a/pocket_friends/development/dev.py +++ b/pocket_friends/development/dev.py @@ -12,8 +12,9 @@ def shutdown_system(): os.system('sudo shutdown now') def update(): - os.system('bash "export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin && cd ~/pocket_friends && git ' - 'pull"') - os.system('bash "export PATH=/usr/local/sbin:/usr/local/bin:/usr/bin && cd ~/pocket_friends && git ' - 'checkout ."') + os.system('bash "cd ~/pocket_friends & git pull"') + os.system('bash "cd ~/pocket_friends & git checkout ."') + sys.exit(1) + +def restart_app(): sys.exit(1) \ No newline at end of file From e5c17b60e7cb6b949303de808cee4d6f9c790fc9 Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Sun, 14 May 2023 19:46:59 -0400 Subject: [PATCH 11/12] fixed it for the last goddamn time --- pocket_friends/development/dev.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pocket_friends/development/dev.py b/pocket_friends/development/dev.py index eda892e..1fc799b 100644 --- a/pocket_friends/development/dev.py +++ b/pocket_friends/development/dev.py @@ -12,8 +12,7 @@ def shutdown_system(): os.system('sudo shutdown now') def update(): - os.system('bash "cd ~/pocket_friends & git pull"') - os.system('bash "cd ~/pocket_friends & git checkout ."') + os.system('bash ~/update.sh') sys.exit(1) def restart_app(): From 4ba12d507846f03a1b27d927e5326d2e86e448cd Mon Sep 17 00:00:00 2001 From: Nicholas Dyer Date: Sun, 14 May 2023 19:48:29 -0400 Subject: [PATCH 12/12] added app restart to dev screen --- pocket_friends/development/dev_menu.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pocket_friends/development/dev_menu.py b/pocket_friends/development/dev_menu.py index 60d3c5b..1653954 100644 --- a/pocket_friends/development/dev_menu.py +++ b/pocket_friends/development/dev_menu.py @@ -6,7 +6,8 @@ import pocket_friends.development.dev as dev dev_functions = { 'Restart': 'reboot_system', 'Shutdown': 'shutdown_system', - 'Update': 'update' + 'Update': 'update', + 'Re-open App': 'restart_app' }