|
|
|
@ -6,8 +6,9 @@ from copy import copy
|
|
|
|
|
from glob import iglob
|
|
|
|
|
from os.path import basename, join
|
|
|
|
|
from threading import Thread
|
|
|
|
|
from serial import Serial
|
|
|
|
|
from serial import Serial, SerialException
|
|
|
|
|
from serial.tools import list_ports
|
|
|
|
|
from time import sleep
|
|
|
|
|
|
|
|
|
|
from pygame import Surface, Color
|
|
|
|
|
from pygame.event import clear
|
|
|
|
@ -75,7 +76,9 @@ class NS(Game, Animation):
|
|
|
|
|
if self.serial_enabled():
|
|
|
|
|
self.serial_kill = False
|
|
|
|
|
self.serial_data = 0
|
|
|
|
|
self.serial_reader = Serial(self.get_configuration("input", "arduino-port"), timeout=.1)
|
|
|
|
|
self.serial_reader = Serial(self.get_configuration("input", "arduino-port"),
|
|
|
|
|
timeout=.3)
|
|
|
|
|
self.reset_arduino()
|
|
|
|
|
# for port in list_ports.comports():
|
|
|
|
|
# print port.device
|
|
|
|
|
# print "---"
|
|
|
|
@ -102,18 +105,38 @@ class NS(Game, Animation):
|
|
|
|
|
def read_serial(self):
|
|
|
|
|
while not self.serial_kill:
|
|
|
|
|
name = self.get_configuration("input", "arduino-port")
|
|
|
|
|
if name not in (port.device for port in list_ports.comports()):
|
|
|
|
|
print "%s disconnected" % name
|
|
|
|
|
output = self.serial_reader.readline().strip()
|
|
|
|
|
if output:
|
|
|
|
|
self.serial_data = int(output, 2)
|
|
|
|
|
try:
|
|
|
|
|
transmission = self.serial_reader.readline().strip()
|
|
|
|
|
except SerialException:
|
|
|
|
|
print "Serial not ready... passing..."
|
|
|
|
|
transmission = ""
|
|
|
|
|
if len(transmission) == 4:
|
|
|
|
|
try:
|
|
|
|
|
self.serial_data = int(transmission, 2)
|
|
|
|
|
except ValueError:
|
|
|
|
|
self.handle_garbage(transmission)
|
|
|
|
|
self.reset_arduino()
|
|
|
|
|
self.idle_elapsed = 0
|
|
|
|
|
elif len(transmission) > 0:
|
|
|
|
|
try:
|
|
|
|
|
int(transmission, 2)
|
|
|
|
|
except ValueError:
|
|
|
|
|
self.handle_garbage(transmission)
|
|
|
|
|
else:
|
|
|
|
|
self.serial_data = 0
|
|
|
|
|
|
|
|
|
|
def handle_garbage(self, transmission):
|
|
|
|
|
self.serial_data = 0
|
|
|
|
|
print "Garbage detected: %s" % transmission
|
|
|
|
|
self.serial_reader.reset_input_buffer()
|
|
|
|
|
|
|
|
|
|
def reset_arduino(self):
|
|
|
|
|
self.serial_reader.dtr = False
|
|
|
|
|
self.serial_reader.reset_input_buffer()
|
|
|
|
|
self.serial_reader.dtr = True
|
|
|
|
|
|
|
|
|
|
def end(self, evt):
|
|
|
|
|
if evt.type == QUIT or self.delegate.compare(evt, "quit"):
|
|
|
|
|
print "kill serial"
|
|
|
|
|
self.serial_kill = True
|
|
|
|
|
Game.end(self, evt)
|
|
|
|
|
|
|
|
|
@ -164,6 +187,8 @@ class NS(Game, Animation):
|
|
|
|
|
lights[NS.LSW].pressed = pressed
|
|
|
|
|
elif event.key == K_z:
|
|
|
|
|
self.reset()
|
|
|
|
|
elif event.key == K_a:
|
|
|
|
|
self.reset_arduino()
|
|
|
|
|
self.last_press = get_ticks()
|
|
|
|
|
else:
|
|
|
|
|
if self.get_delegate().compare(event, "reset-game"):
|
|
|
|
@ -387,11 +412,11 @@ class Title(GameChild):
|
|
|
|
|
self.get_game().sfx["confirm"].play()
|
|
|
|
|
elif self.first_pressed:
|
|
|
|
|
self.first_pressed_elapsed += self.get_game().time_filter.get_last_frame_duration()
|
|
|
|
|
if self.first_pressed_elapsed > 4000:
|
|
|
|
|
self.first_pressed = False
|
|
|
|
|
self.first_pressed_elapsed = 0
|
|
|
|
|
self.buttons[0].unhide()
|
|
|
|
|
self.border.update()
|
|
|
|
|
# if self.first_pressed_elapsed > 4000:
|
|
|
|
|
# self.first_pressed = False
|
|
|
|
|
# self.first_pressed_elapsed = 0
|
|
|
|
|
# self.buttons[0].unhide()
|
|
|
|
|
self.border.update()
|
|
|
|
|
self.text.update()
|
|
|
|
|
self.draw_scores()
|
|
|
|
|
for button in self.buttons:
|
|
|
|
@ -498,14 +523,17 @@ class Dialogue(Animation):
|
|
|
|
|
|
|
|
|
|
class Introduction(Animation):
|
|
|
|
|
|
|
|
|
|
TEXT = "Hey, you lizard slime bag. It's me Giant Tony. " + \
|
|
|
|
|
"Do you think you\ncan skate like me? Prove it!", \
|
|
|
|
|
"I'll even give you my board for this adventure. And ink my name\n" + \
|
|
|
|
|
"on it. Now the power of Giant Tony pulses through you.", \
|
|
|
|
|
"Before you go, show me you can scrape! Use your board to touch\n" + \
|
|
|
|
|
"the glowing pads on the platform!", \
|
|
|
|
|
"Good job, lizard scum! Maybe now you're ready to take on Kool\n" + \
|
|
|
|
|
"Man and his friends. Don't let me down!"
|
|
|
|
|
TEXT = (
|
|
|
|
|
"Hey, you lizard slime bag. It's me Giant Tony. " + \
|
|
|
|
|
"Do you think you\ncan skate like me? Prove it!",
|
|
|
|
|
"I'll even give you my board for this adventure. And ink my name\n" + \
|
|
|
|
|
"on it. Now the power of Giant Tony pulses through you.",
|
|
|
|
|
# "Before you go, show me you can scrape! Use your board to touch\n" + \
|
|
|
|
|
"Before you play, show me you can scrape! Use your board to touch\n" + \
|
|
|
|
|
"the glowing pads on the platform!", \
|
|
|
|
|
# "Good job, lizard scum! Maybe now you're ready to take on Kool\n" + \
|
|
|
|
|
"Good job, slime bag! Maybe now you're ready to take on Kool\n" + \
|
|
|
|
|
"Man and his friends. Don't let me down!")
|
|
|
|
|
SKATEBOARD_START = -30, -20
|
|
|
|
|
TUTORIAL_MOVES = NS.S, NS.NE, NS.N, NS.E
|
|
|
|
|
|
|
|
|
@ -550,8 +578,20 @@ class Introduction(Animation):
|
|
|
|
|
dialogue.activate()
|
|
|
|
|
dialogue.set_avatar(self.tony_avatar)
|
|
|
|
|
dialogue.set_name("???")
|
|
|
|
|
dialogue.show_text(self.TEXT[0])
|
|
|
|
|
# dialogue.show_text(self.TEXT[0])
|
|
|
|
|
dialogue.show_text(self.TEXT[2])
|
|
|
|
|
self.text_index = 0
|
|
|
|
|
# temporary dialogue skip
|
|
|
|
|
dialogue.set_name("Tony")
|
|
|
|
|
self.slime_bag.hide()
|
|
|
|
|
self.halt(self.move_board)
|
|
|
|
|
self.take_board()
|
|
|
|
|
platform = self.get_game().platform
|
|
|
|
|
platform.activate()
|
|
|
|
|
platform.set_glowing(platform.get_buttons_from_edges(
|
|
|
|
|
[self.TUTORIAL_MOVES[self.tutorial_index]]))
|
|
|
|
|
self.get_game().chemtrails.activate()
|
|
|
|
|
self.text_index = 2
|
|
|
|
|
|
|
|
|
|
def give_board(self):
|
|
|
|
|
self.skateboard.location.center = self.SKATEBOARD_START
|
|
|
|
@ -745,8 +785,8 @@ class AdvancePrompt(GameChild):
|
|
|
|
|
def update(self):
|
|
|
|
|
if self.first_pressed:
|
|
|
|
|
self.first_pressed_elapsed += self.get_game().time_filter.get_last_frame_duration()
|
|
|
|
|
if self.first_pressed_elapsed > 4000:
|
|
|
|
|
self.cancel_first_press()
|
|
|
|
|
# if self.first_pressed_elapsed > 4000:
|
|
|
|
|
# self.cancel_first_press()
|
|
|
|
|
for button in self.buttons:
|
|
|
|
|
button.update()
|
|
|
|
|
self.plus.update()
|
|
|
|
@ -1239,6 +1279,7 @@ class Boss(Animation):
|
|
|
|
|
self.backgrounds[0].load_from_path(self.get_resource("bg/bg001.png"))
|
|
|
|
|
self.backgrounds[1].load_from_path(self.get_resource("bg/bg002.png"))
|
|
|
|
|
self.backgrounds[2].load_from_path(self.get_resource("bg/bg003.png"))
|
|
|
|
|
self.countdown = Countdown(self)
|
|
|
|
|
|
|
|
|
|
def cancel_flash(self):
|
|
|
|
|
if self.level_index == 0:
|
|
|
|
@ -1304,6 +1345,7 @@ class Boss(Animation):
|
|
|
|
|
self.advance_prompt.reset()
|
|
|
|
|
self.queue = None
|
|
|
|
|
self.brandish_complete = True
|
|
|
|
|
self.countdown.reset()
|
|
|
|
|
|
|
|
|
|
def deactivate(self):
|
|
|
|
|
self.active = False
|
|
|
|
@ -1313,6 +1355,7 @@ class Boss(Animation):
|
|
|
|
|
|
|
|
|
|
def combo(self):
|
|
|
|
|
self.queue = None
|
|
|
|
|
self.get_game().reset_arduino()
|
|
|
|
|
self.play(self.brandish, delay=2500, play_once=True)
|
|
|
|
|
|
|
|
|
|
def brandish(self):
|
|
|
|
@ -1529,6 +1572,8 @@ class Boss(Animation):
|
|
|
|
|
else:
|
|
|
|
|
dialogue.show_text("H-how? But you're only a lizard! How could you" +
|
|
|
|
|
" manage to defeat\nall of us?")
|
|
|
|
|
if self.player_defeated:
|
|
|
|
|
self.countdown.activate()
|
|
|
|
|
|
|
|
|
|
def transition_to_battle(self):
|
|
|
|
|
index = self.level_index + (not self.player_defeated)
|
|
|
|
@ -1558,10 +1603,11 @@ class Boss(Animation):
|
|
|
|
|
if self.active:
|
|
|
|
|
self.backgrounds[self.level_index].update()
|
|
|
|
|
dialogue = self.get_game().dialogue
|
|
|
|
|
if dialogue.active:
|
|
|
|
|
if dialogue.active and self.get_game().chemtrails.boys.amount > 0:
|
|
|
|
|
if self.advance_prompt.check_first_press():
|
|
|
|
|
self.advance_prompt.press_first()
|
|
|
|
|
elif self.advance_prompt.check_second_press():
|
|
|
|
|
self.countdown.deactivate()
|
|
|
|
|
if dialogue.is_playing():
|
|
|
|
|
dialogue.show_all()
|
|
|
|
|
else:
|
|
|
|
@ -1582,6 +1628,7 @@ class Boss(Animation):
|
|
|
|
|
self.spoopy.update()
|
|
|
|
|
self.sword.update()
|
|
|
|
|
self.health.update()
|
|
|
|
|
self.countdown.update()
|
|
|
|
|
|
|
|
|
|
def update_dialogue(self):
|
|
|
|
|
if self.active:
|
|
|
|
@ -1591,6 +1638,59 @@ class Boss(Animation):
|
|
|
|
|
self.advance_prompt.update()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Countdown(GameChild):
|
|
|
|
|
|
|
|
|
|
def __init__(self, parent):
|
|
|
|
|
GameChild.__init__(self, parent)
|
|
|
|
|
dsr = self.get_display_surface().get_rect()
|
|
|
|
|
font = Font(self.get_resource(Dialogue.FONT_PATH), 76)
|
|
|
|
|
self.heading = Sprite(self)
|
|
|
|
|
self.heading.add_frame(font.render("CONTINUE?", True, (0, 0, 0), (255, 255, 255)))
|
|
|
|
|
self.heading.location.midtop = dsr.centerx, 50
|
|
|
|
|
self.game_over = Sprite(self)
|
|
|
|
|
self.game_over.add_frame(font.render("GAME OVER", True, (0, 0, 0), (255, 255, 255)))
|
|
|
|
|
self.game_over.location.center = dsr.centerx, dsr.centery - 40
|
|
|
|
|
self.glyphs = []
|
|
|
|
|
for ii in xrange(10):
|
|
|
|
|
glyph = Sprite(self)
|
|
|
|
|
frame = Surface((140, 140))
|
|
|
|
|
frame.fill((255, 255, 255))
|
|
|
|
|
digits = font.render("%i" % ii, True, (0, 0, 0), (255, 255, 255))
|
|
|
|
|
rect = digits.get_rect()
|
|
|
|
|
rect.center = frame.get_rect().center
|
|
|
|
|
frame.blit(digits, rect)
|
|
|
|
|
glyph.add_frame(frame)
|
|
|
|
|
glyph.location.center = dsr.centerx, dsr.centery - 30
|
|
|
|
|
self.glyphs.append(glyph)
|
|
|
|
|
|
|
|
|
|
def reset(self):
|
|
|
|
|
self.deactivate()
|
|
|
|
|
|
|
|
|
|
def deactivate(self):
|
|
|
|
|
self.active = False
|
|
|
|
|
|
|
|
|
|
def activate(self):
|
|
|
|
|
self.remaining = 9999
|
|
|
|
|
self.active = True
|
|
|
|
|
|
|
|
|
|
def end_game(self):
|
|
|
|
|
self.get_game().reset(True)
|
|
|
|
|
|
|
|
|
|
def update(self):
|
|
|
|
|
if self.active:
|
|
|
|
|
if self.get_game().chemtrails.boys.amount > 0:
|
|
|
|
|
self.heading.update()
|
|
|
|
|
self.glyphs[int(self.remaining / 1000)].update()
|
|
|
|
|
else:
|
|
|
|
|
self.game_over.update()
|
|
|
|
|
if not self.get_game().wipe.is_playing():
|
|
|
|
|
if self.remaining <= 0:
|
|
|
|
|
self.get_game().wipe.start(self.end_game)
|
|
|
|
|
self.remaining = 0
|
|
|
|
|
else:
|
|
|
|
|
self.remaining -= self.get_game().time_filter.get_last_frame_duration()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Sword(Animation):
|
|
|
|
|
|
|
|
|
|
SHIFT = 15
|
|
|
|
|