This commit is contained in:
Frank DeMarco 2018-09-23 01:01:36 -04:00
parent 090a41549d
commit 51bc4e97ab
5 changed files with 198 additions and 25 deletions

150
NS.py
View File

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

BIN
resource/DancePadClear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

@ -26,3 +26,11 @@
254185 254185
209634 209634
150791 150791
200320
148060
159544
193185
246109
171802
150366
248085

View File

@ -0,0 +1,65 @@
// constants won't change:
const long interval = 25; // 25 ms * 6 tests * 2 = 200 ms means 5 loops per second
int pushButton1 = 2;
int pushButton2 = 4;
int pushButton3 = 6;
int pushButton4 = 11;
int buttons[4] = {
pushButton1,
pushButton2,
pushButton3,
pushButton4
};
void setup() {
// set the digital pin as output:
Serial.begin(9600);
pinMode(pushButton1, OUTPUT);
digitalWrite(pushButton1, LOW);
pinMode(pushButton2, INPUT_PULLUP);
pinMode(pushButton3, INPUT_PULLUP);
pinMode(pushButton4, INPUT_PULLUP);
}
bool testConnection2(int A, int B) {
for (int i = 0; i < 4; i++) {
if (i == A) {
pinMode(buttons[i], OUTPUT);
digitalWrite(buttons[i], LOW);
} else {
pinMode(buttons[i], INPUT_PULLUP);
}
}
delay(interval);
if (!digitalRead(buttons[B])) {
return true;
} else {
return false;
}
}
bool testConnection(int A, int B) {
return testConnection2(A, B) && testConnection2(B, A);
}
void loop() {
if (testConnection(0, 1)) {
Serial.println("0011");
} else if (testConnection(0, 2)) {
Serial.println("0101");
} else if (testConnection(0, 3)) {
Serial.println("1001");
} else if (testConnection(1, 2)) {
Serial.println("0110");
} else if (testConnection(1, 3)) {
Serial.println("1010");
} else if (testConnection(2, 3)) {
Serial.println("1100");
}
}