diff -ruN a/pacewar.py b/pacewar.py --- a/pacewar.py +++ b/pacewar.py @@ -19,6 +19,8 @@ __version__ = "1.6.7" +import pygame +import asyncio import json import math import os @@ -76,7 +78,7 @@ MENU_KEYS_PLAYER2 = 3 MENU_JS_PLAYER1 = 4 MENU_JS_PLAYER2 = 5 -MENU_ITEMS = {MENU_MAIN: ["1-player", "2-player", "Controls", "Quit"], +MENU_ITEMS = {MENU_MAIN: ["1-player", "2-player", "Controls"], MENU_START: ["1 point", "2 points", "3 points", "4 points", "5 points", "6 points", "7 points", "8 points", "Back"], @@ -90,7 +92,11 @@ MENU_BORDER = 32 MENU_SPACING = 16 -CONFIG_DIR = os.path.join(os.path.expanduser("~"), ".pacewar") +# On the web the page keeps /saves in the browser (IndexedDB). +if os.path.isdir("/saves"): + CONFIG_DIR = "/saves/pacewar" +else: + CONFIG_DIR = os.path.join(os.path.expanduser("~"), ".pacewar") colorblind = True points_to_win = 3 @@ -129,23 +135,9 @@ if key == "f7": colorblind = not colorblind self.current_room.update_meter() - elif key == "f8": - fname = "screenshot-{}.png".format(round(time.time(), 3)) - sge.gfx.Sprite.from_screenshot().save(fname) - elif key == "f11": - if self.fullscreen: - self.scale = SCALE - self.fullscreen = False - self.scale = None - else: - self.fullscreen = True - - def event_mouse_button_press(self, button): - if button == "middle": - self.event_close() def event_close(self): - self.end() + pass def event_paused_step(self, time_passed, delta_mult): self.event_step(time_passed, delta_mult) @@ -164,6 +156,7 @@ self.multiplayer = False self.menu = MENU_MAIN self.menu_selection = 0 + self.waiting = None self.menu_sprite = None self.menu_axes = {} self.round_end() @@ -171,7 +164,17 @@ self.update_meter() def event_step(self, time_passed, delta_mult): - if not self.started: + if self.waiting is not None: + if self.waiting[0] == "key": + text = "Press the key you wish to use for this function, or Escape to cancel." + else: + text = "Press the joystick button, axis, or hat direction you wish to use for this function, or Escape to cancel." + sge.game.project_text(menu_font, text, sge.game.width / 2, + sge.game.height / 2, width=sge.game.width, + height=sge.game.height, + color=sge.gfx.Color("white"), + halign="center", valign="middle") + elif not self.started: sge.game.project_sprite(logo_sprite, 0, sge.game.width / 2, 96) if self.menu == MENU_KEYS_PLAYER1: @@ -302,7 +305,10 @@ global player2_js_shoot global points_to_win - if self.finished: + if self.waiting is not None: + if self.waiting[0] == "key" or key == "escape": + self.finish_wait(None if key == "escape" else key) + elif self.finished: if key == "enter": create_room().start() elif not self.started: @@ -326,8 +332,6 @@ elif self.menu_selection == 2: self.menu = MENU_CONTROLS self.menu_selection = 0 - elif self.menu_selection == 3: - sge.game.end() elif self.menu == MENU_START: if self.menu_selection < 8: points_to_win = self.menu_selection + 1 @@ -343,88 +347,54 @@ self.menu_selection = 0 elif self.menu == MENU_KEYS_PLAYER1: if self.menu_selection == 0: - k = self.wait_key() - if k is not None: - player1_key_thrust = k + self.waiting = ("key", "player1_key_thrust") elif self.menu_selection == 1: - k = self.wait_key() - if k is not None: - player1_key_left = k + self.waiting = ("key", "player1_key_left") elif self.menu_selection == 2: - k = self.wait_key() - if k is not None: - player1_key_right = k + self.waiting = ("key", "player1_key_right") elif self.menu_selection == 3: - k = self.wait_key() - if k is not None: - player1_key_shoot = k + self.waiting = ("key", "player1_key_shoot") elif self.menu_selection == 4: self.menu = MENU_CONTROLS self.menu_selection = 0 elif self.menu == MENU_KEYS_PLAYER2: if self.menu_selection == 0: - k = self.wait_key() - if k is not None: - player2_key_thrust = k + self.waiting = ("key", "player2_key_thrust") elif self.menu_selection == 1: - k = self.wait_key() - if k is not None: - player2_key_left = k + self.waiting = ("key", "player2_key_left") elif self.menu_selection == 2: - k = self.wait_key() - if k is not None: - player2_key_right = k + self.waiting = ("key", "player2_key_right") elif self.menu_selection == 3: - k = self.wait_key() - if k is not None: - player2_key_shoot = k + self.waiting = ("key", "player2_key_shoot") elif self.menu_selection == 4: self.menu = MENU_CONTROLS self.menu_selection = 2 elif self.menu == MENU_JS_PLAYER1: if self.menu_selection == 0: - js = self.wait_js() - if js is not None: - player1_js_thrust = js + self.waiting = ("js", "player1_js_thrust") elif self.menu_selection == 1: - js = self.wait_js() - if js is not None: - player1_js_left = js + self.waiting = ("js", "player1_js_left") elif self.menu_selection == 2: - js = self.wait_js() - if js is not None: - player1_js_right = js + self.waiting = ("js", "player1_js_right") elif self.menu_selection == 3: - js = self.wait_js() - if js is not None: - player1_js_shoot = js + self.waiting = ("js", "player1_js_shoot") elif self.menu_selection == 4: self.menu = MENU_CONTROLS self.menu_selection = 1 elif self.menu == MENU_JS_PLAYER2: if self.menu_selection == 0: - js = self.wait_js() - if js is not None: - player2_js_thrust = js + self.waiting = ("js", "player2_js_thrust") elif self.menu_selection == 1: - js = self.wait_js() - if js is not None: - player2_js_left = js + self.waiting = ("js", "player2_js_left") elif self.menu_selection == 2: - js = self.wait_js() - if js is not None: - player2_js_right = js + self.waiting = ("js", "player2_js_right") elif self.menu_selection == 3: - js = self.wait_js() - if js is not None: - player2_js_shoot = js + self.waiting = ("js", "player2_js_shoot") elif self.menu_selection == 4: self.menu = MENU_CONTROLS self.menu_selection = 3 elif key == "escape": - if self.menu == MENU_MAIN: - sge.game.event_close() - elif self.menu == MENU_START: + if self.menu == MENU_START: self.menu = MENU_MAIN self.menu_selection = 1 if self.multiplayer else 0 elif self.menu == MENU_CONTROLS: @@ -452,7 +422,13 @@ sge.game.pause(pause_sprite) def event_joystick_axis_move(self, js_name, js_id, axis, value): - if not self.started: + if self.waiting is not None: + if self.waiting[0] == "js": + js = self.wait_js_event(sge.input.JoystickAxisMove( + js_name, js_id, axis, value)) + if js is not None: + self.finish_wait(js) + elif not self.started: if axis == 1: prev = self.menu_axes.get((js_id, axis), 0) self.menu_axes[(js_id, axis)] = value @@ -464,7 +440,13 @@ self.event_key_press("up", "") def event_joystick_hat_move(self, js_name, js_id, hat, x, y): - if not self.started: + if self.waiting is not None: + if self.waiting[0] == "js": + js = self.wait_js_event(sge.input.JoystickHatMove( + js_name, js_id, hat, x, y)) + if js is not None: + self.finish_wait(js) + elif not self.started: if x == 0: if y == 1: self.event_key_press("down", "") @@ -472,7 +454,13 @@ self.event_key_press("up", "") def event_joystick_button_press(self, js_name, js_id, button): - if not self.started: + if self.waiting is not None: + if self.waiting[0] == "js": + js = self.wait_js_event(sge.input.JoystickButtonPress( + js_name, js_id, button)) + if js is not None: + self.finish_wait(js) + elif not self.started: self.event_key_press("enter", "\n") def event_paused_key_press(self, key, char): @@ -640,88 +628,32 @@ self.alarms["check_win"] = 5 - def wait_key(self): - # Wait for a key press and return it. - key = None - while key is None: - # Input events - sge.game.pump_input() - while sge.game.input_events: - event = sge.game.input_events.pop(0) - if isinstance(event, sge.input.KeyPress): - sge.game.pump_input() - sge.game.input_events = [] - if event.key == "escape": - return None - else: - return event.key - - # Regulate speed - sge.game.regulate_speed(fps=10) - - # Project text - text = "Press the key you wish to use for this function, or Escape to cancel." - sge.game.project_text(menu_font, text, sge.game.width / 2, - sge.game.height / 2, width=sge.game.width, - height=sge.game.height, - color=sge.gfx.Color("white"), - halign="center", valign="middle") - - # Refresh - sge.game.refresh() - - sge.game.pump_input() - sge.game.input_events = [] - return key - - def wait_js(self): - # Wait for a joystick press and return it. - while True: - # Input events - sge.game.pump_input() - while sge.game.input_events: - event = sge.game.input_events.pop(0) - if isinstance(event, sge.input.KeyPress): - if event.key == "escape": - sge.game.pump_input() - sge.game.input_events = [] - return None - elif isinstance(event, sge.input.JoystickAxisMove): - if event.value > JOYSTICK_THRESHOLD: - sge.game.pump_input() - sge.game.input_events = [] - return (event.js_id, "axis+", event.axis) - elif event.value < -JOYSTICK_THRESHOLD: - sge.game.pump_input() - sge.game.input_events = [] - return (event.js_id, "axis-", event.axis) - elif isinstance(event, sge.input.JoystickHatMove): - sge.game.pump_input() - sge.game.input_events = [] - t = ("hatx+" if event.x > 0 else - "hatx-" if event.x < 0 else - "haty+" if event.y > 0 else - "haty-" if event.y < 0 else - "hatx0") - return (event.js_id, t, event.hat) - elif isinstance(event, sge.input.JoystickButtonPress): - sge.game.pump_input() - sge.game.input_events = [] - return (event.js_id, "button", event.button) - - # Regulate speed - sge.game.regulate_speed(fps=10) - - # Project text - text = "Press the joystick button, axis, or hat direction you wish to use for this function, or Escape to cancel." - sge.game.project_text(menu_font, text, sge.game.width / 2, - sge.game.height / 2, width=sge.game.width, - height=sge.game.height, - color=sge.gfx.Color("white"), - halign="center", valign="middle") - - # Refresh - sge.game.refresh() + def finish_wait(self, value): + # Store the key or joystick input picked for a control and go back + # to the menu. (The waiting used to be a loop of its own.) + name = self.waiting[1] + self.waiting = None + if value is not None: + globals()[name] = value + save_config() + + def wait_js_event(self, event): + # Turn a joystick event into a control, or None to keep waiting. + if isinstance(event, sge.input.JoystickAxisMove): + if event.value > JOYSTICK_THRESHOLD: + return (event.js_id, "axis+", event.axis) + elif event.value < -JOYSTICK_THRESHOLD: + return (event.js_id, "axis-", event.axis) + elif isinstance(event, sge.input.JoystickHatMove): + t = ("hatx+" if event.x > 0 else + "hatx-" if event.x < 0 else + "haty+" if event.y > 0 else + "haty-" if event.y < 0 else + "hatx0") + return (event.js_id, t, event.hat) + elif isinstance(event, sge.input.JoystickButtonPress): + return (event.js_id, "button", event.button) + return None class Ship(sge.dsp.Object): @@ -1502,29 +1434,33 @@ player2_js_shoot = tuple(js_cfg.get("player2_shoot", player2_js_shoot)) -if __name__ == '__main__': - try: - sge.game.start() - finally: - keys_cfg = {"player1_thrust": player1_key_thrust, - "player1_left": player1_key_left, - "player1_right": player1_key_right, - "player1_shoot": player1_key_shoot, - "player2_thrust": player2_key_thrust, - "player2_left": player2_key_left, - "player2_right": player2_key_right, - "player2_shoot": player2_key_shoot} - js_cfg = {"player1_thrust": player1_js_thrust, - "player1_left": player1_js_left, - "player1_right": player1_js_right, - "player1_shoot": player1_js_shoot, - "player2_thrust": player2_js_thrust, - "player2_left": player2_js_left, - "player2_right": player2_js_right, - "player2_shoot": player2_js_shoot} +def save_config(): + keys_cfg = {"player1_thrust": player1_key_thrust, + "player1_left": player1_key_left, + "player1_right": player1_key_right, + "player1_shoot": player1_key_shoot, + "player2_thrust": player2_key_thrust, + "player2_left": player2_key_left, + "player2_right": player2_key_right, + "player2_shoot": player2_key_shoot} + js_cfg = {"player1_thrust": player1_js_thrust, + "player1_left": player1_js_left, + "player1_right": player1_js_right, + "player1_shoot": player1_js_shoot, + "player2_thrust": player2_js_thrust, + "player2_left": player2_js_left, + "player2_right": player2_js_right, + "player2_shoot": player2_js_shoot} + + with open(os.path.join(CONFIG_DIR, "keys.json"), 'w') as f: + json.dump(keys_cfg, f) + + with open(os.path.join(CONFIG_DIR, "joystick.json"), 'w') as f: + json.dump(js_cfg, f) + + +async def main(): + await sge.game.start() - with open(os.path.join(CONFIG_DIR, "keys.json"), 'w') as f: - json.dump(keys_cfg, f) - with open(os.path.join(CONFIG_DIR, "joystick.json"), 'w') as f: - json.dump(js_cfg, f) +asyncio.run(main())