From 3fc06185914a864cb79a59100a700f855d5378ed Mon Sep 17 00:00:00 2001 From: lauren32bit Date: Sat, 5 Oct 2024 04:09:31 -0700 Subject: [PATCH] Initial commit --- MULE/MULE.py | 379 ++++++++++++++++++++++++++++++++++++ MULE/arcade_description.txt | 16 ++ MULE/mule_video.webm | Bin 0 -> 57542 bytes 3 files changed, 395 insertions(+) create mode 100644 MULE/MULE.py create mode 100644 MULE/arcade_description.txt create mode 100644 MULE/mule_video.webm diff --git a/MULE/MULE.py b/MULE/MULE.py new file mode 100644 index 0000000..0e9189e --- /dev/null +++ b/MULE/MULE.py @@ -0,0 +1,379 @@ +# MULE.PY +# (c) Lauren32 2024 +# Once upon a time, a guy made a game like this for personal computers. +# Now, he is one of the 10 richest people in the world. +# Could this work for me? Only time will tell + +import thumby +import time +import random +import gc + +LANE1_Y = const(4) # Lane 2 X pos +LANE2_Y = const(19) # Lane 2 Y pos +LINE_Y = const(15) # Center line Y pos + +# Draw a centered text box +def textbox(text,y,large=False): + if large == True: + font_w = 5 + font_h = 7 + thumby.display.setFont("/lib/font5x7.bin",font_w,font_h,1) + else: + font_w = 3 + font_h = 5 + thumby.display.setFont("/lib/font3x5.bin",font_w,font_h,1) + w = len(text)*(font_w+1)+(font_w+1) + x = round(36-(len(text)/2)*(font_w+1))-2 + thumby.display.drawFilledRectangle(x,y,w,font_h+4,0) + thumby.display.drawRectangle(x,y,w,font_h+4,1) + thumby.display.drawText(text,x+3,y+2,1) + +class Car(): + WIDTH = 12 + def __init__(self): + self.x = 5 + self.lane = 1 # lane 1 = high, 0 = low + + def reset(self): + self.__init__() + +class Mule(): + def __init__(self,x=72): + self.x = x + self.lane = random.randint(0,1) # lane 1 = high, 0 = low + self.active = False + + def move(self): + if self.active: + self.x -= 1 + + def reset(self): + self.x = 72 + self.lane = random.randint(0,1) + +class Game: + # BITMAP: width: 12, height: 8 + bmp_car = bytearray([0,24,189,255,189,60,60,189,231,189,24,0]) + + # BITMAP: width: 12, height: 8 + bmp_mule = bytearray([32,16,248,24,248,56,56,249,30,255,12,0]) + # BITMAP: width: 6, height: 4 + bmp_mule_ul = bytearray([0,0,8,8,8,8]) + bmp_mule_ul_mask = bytearray([15,15,7,7,7,7]) + bmp_mule_ur = bytearray([8,9,14,15,12,0]) + bmp_mule_ur_mask = bytearray([7,6,1,0,3,15]) + bmp_mule_ll = bytearray([2,1,15,1,15,3]) + bmp_mule_ll_mask = bytearray([13,14,0,14,0,12]) + bmp_mule_lr = bytearray([3,3,15,1,15,0]) + bmp_mule_lr_mask = bytearray([12,12,0,14,0,15]) + + def __init__(self): + self.score = 0 + self.hiscore = 0 + self.mules = [Mule()] + self.mules[0].active = True + self.car = Car() + self.g_line_x = 5 + + def reset(self): + self.score = 0 + self.car.reset() + self.mules = [Mule()] # Delete and recreate mules + self.mules[0].active = True + + def game_over(self): + thumby.display.fill(0) + textbox("Game Over",5,True) + thumby.display.drawText(f"Score: {self.score}",5,22,1) + thumby.display.drawText(f"High: {self.hiscore}",5,31,1) + thumby.display.update() + self.score = 0 + while not thumby.inputJustPressed(): + pass + + # Detect a collision from the front. + # Returns -1 if no collision or mule number + def collision_detect_front(self): + for i in range(len(self.mules)): + if self.mules[i].lane == 1: + y = LANE1_Y + 4 + else: + y = LANE2_Y + 4 + + if thumby.display.getPixel(self.mules[i].x,y): + return i + + return -1 + + # Detect a collision when switching lanes. + # Returns -1 if no collision or mule number + def collision_detect_side(self): + for i in range(len(self.mules)): + if self.mules[i].lane == 1: + y = LANE2_Y + 4 + else: + y = LANE1_Y + 4 + + if thumby.display.getPixel(self.mules[i].x,y) or thumby.display.getPixel(self.mules[i].x+10,y): + return i + + return -1 + + def mule_explode(self, mule_num): + if self.mules[mule_num].lane == 1: + y1 = LANE1_Y + else: + y1 = LANE2_Y + y2 = y1 + 4 + x1 = self.mules[mule_num].x + x2 = self.mules[mule_num].x + 6 + + for i in range(9): + if i>0: + thumby.display.blit(Game.bmp_mule_ul,x1-i,y1-i,6,4,0,0,0) + thumby.display.blit(Game.bmp_mule_ur,x2+i,y1-i,6,4,0,0,0) + thumby.display.blit(Game.bmp_mule_ll,x1-i,y2+i,6,4,0,0,0) + thumby.display.blit(Game.bmp_mule_lr,x2+i,y2+i,6,4,0,0,0) + thumby.display.update() + + thumby.audio.playBlocking(random.randint(500,1000),200) + + thumby.display.blit(Game.bmp_mule_ul_mask,x1-i,y1-i,6,4,1,0,0) + thumby.display.blit(Game.bmp_mule_ur_mask,x2+i,y1-i,6,4,1,0,0) + thumby.display.blit(Game.bmp_mule_ll_mask,x1-i,y2+i,6,4,1,0,0) + thumby.display.blit(Game.bmp_mule_lr_mask,x2+i,y2+i,6,4,1,0,0) + + thumby.display.drawLine(0,LANE1_Y-2,72,LANE1_Y-2,1) + thumby.display.drawLine(0,LANE2_Y+9,72,LANE2_Y+9,1) + self.draw_score() + thumby.display.update() + textbox("BANG!",13) + thumby.display.update() + + def draw_road(self): + thumby.display.drawLine(0,LANE1_Y-2,72,LANE1_Y-2,1) + thumby.display.drawLine(0,LANE2_Y+9,72,LANE2_Y+9,1) + + for x in range(self.g_line_x,70,10): + thumby.display.drawLine(x,LINE_Y,x+4,LINE_Y,1) + self.g_line_x -= 1 + if self.g_line_x < -5: + self.g_line_x = 5 + + def draw_actors(self): + if self.car.lane == 1: + car_y = LANE1_Y + else: + car_y = LANE2_Y + thumby.display.blit(Game.bmp_car,self.car.x,car_y,12,8,0,0,0) + + for mule in self.mules: + if mule.lane == 1: + mule_y = LANE1_Y + else: + mule_y = LANE2_Y + + thumby.display.blit(Game.bmp_mule,mule.x,mule_y,12,8,0,0,0) + + # This micropython doesn't have abc, but this is intended to be overriden + def draw_score(self): + pass + + def draw(self): + thumby.display.fill(0) + self.draw_road() + self.draw_actors() + self.draw_score() + +# Classic game mode +class GameA(Game): + def __init__(self): + super().__init__() + self.mule_score = 0 + + def draw_score(self): + thumby.display.drawText(f"Driver:{self.score} Mule:{self.mule_score}",3,32,1) + + # Main game loop + def start(self): + thumby.display.setFont("/lib/font3x5.bin",3,5,1) + while True: + self.draw() + thumby.display.update() + if thumby.buttonL.justPressed(): + break + elif thumby.actionJustPressed(): + collision = self.collision_detect_side() + self.car.lane = int(not self.car.lane) + self.draw() + thumby.display.update() + thumby.audio.play(1000,200) + else: + self.mules[0].move() + if self.mules[0].x == 5: + self.car.x += 3 + self.mules[0].reset() + self.mules[0].lane = random.randint(0,1) + continue + elif self.car.x > 40: + self.score += 1 + self.car.x = 5 + textbox("Mule loses!",13) + thumby.display.update() + time.sleep(1) + continue + else: + collision = self.collision_detect_front() + + if collision != -1: + self.mule_explode(0) + self.mule_score += 1 + self.mules[0].reset() + self.car.reset() + time.sleep(1) + + try: + s = round(self.score/self.mule_score) # score is a ratio + except ZeroDivisionError: + s = self.score + self.score = s + self.mule_score = 0 + self.game_over() + self.reset() + return + +# New game mode +class GameB(Game): + def __init__(self): + super().__init__() + self.delay = 0.020 # game speed for difficulty + + def draw_score(self): + thumby.display.drawText(f"Score: {self.score}",5,34,1) + + # Return true if there are no mules on the road + def road_empty(self): + empty = True + for mule in self.mules: + if mule.x > 0 and mule.x < 70: + empty = False + return empty + + # Line mules back up at regular intervals + def reset_mules(self): + x = 72 + for i in range(len(self.mules)): + self.mules[i].lane = random.randint(0,1) + self.mules[i].active = True + self.mules[i].x = x + x += 36 + + # Main game loop + def start(self): + thumby.display.setFont("/lib/font3x5.bin", 3, 5, 1) + add_mules = True + while True: + thumby.display.update() + if thumby.actionJustPressed(): + collide = self.collision_detect_side() + self.car.lane = int(not self.car.lane) + self.draw() + thumby.display.update() + thumby.audio.play(1000,200) + elif thumby.buttonL.pressed(): + break + else: + for mule in self.mules: + mule.move() + if mule.x == -11: + print(f"mule count: {len(self.mules)}") + self.score += 1 + # Update difficulty on certain levels + if (self.score % 10 == 0) and self.delay > 0.001: + self.delay -= 0.005 + if self.car.x < 30 and (self.score % 3 == 0): + self.car.x += 1 + if self.score % 5 == 0: + if len(self.mules) < 4: + self.mules.append(Mule()) + # At 4 mules, stop adding more and start looping + if add_mules == False: + mule.x = self.mules[-1].x + 36 + mule.lane = random.randint(0,1) + self.mules.append(self.mules[0]) + self.mules = self.mules[1:] + elif self.road_empty(): + self.reset_mules() + if len(self.mules) == 4: + add_mules = False + collide = self.collision_detect_front() + + if collide != -1: + self.mule_explode(collide) + time.sleep(1) + break + + self.draw() + time.sleep(self.delay) + + if self.score > self.hiscore: + self.hiscore = self.score + self.game_over() + self.reset() + return + +# Display title screen +def title_screen(index): + thumby.display.setFont("/lib/font5x7.bin",5,7,1) + thumby.display.fill(0) + thumby.display.drawText("MULE.PY",18,2,1) + thumby.display.drawText("Game A",18,13,1) + thumby.display.drawText("Game B",18,22,1) + thumby.display.drawText("Quit",18,31,1) + bullet_y = 0 + if index == 0: + bullet_y = 13 + elif index == 1: + bullet_y = 22 + else: + bullet_y = 31 + thumby.display.drawText("*",3,bullet_y,1) + thumby.display.update() + +# Dsiplay about screen +def about_screen(): + thumby.display.setFont("/lib/font5x7.bin",5,7,1) + thumby.display.fill(0) + thumby.display.drawText("MULE.PY 1.0",2,2,1) + thumby.display.drawText("Lauren32",2,13,1) + thumby.display.drawText("2024",2,22,1) + thumby.display.drawText("CC BY-SA3.0",2,31,1) + thumby.display.update() + +game_a = GameA() +game_b = GameB() +menu_index = 0 +thumby.display.setFPS(60) +gc.enable() # enable garbage collection + +while True: + title_screen(menu_index) + if thumby.buttonU.justPressed() and menu_index > 0: + menu_index -= 1 + elif thumby.buttonD.justPressed() and menu_index < 2: + menu_index += 1 + elif thumby.buttonL.justPressed(): + about_screen() + while not thumby.inputJustPressed(): + pass + elif thumby.actionJustPressed(): + if menu_index == 0: + game_a.start() + elif menu_index == 1: + game_b.start() + elif menu_index == 2: + thumby.reset() + + + diff --git a/MULE/arcade_description.txt b/MULE/arcade_description.txt new file mode 100644 index 0000000..c85e5fd --- /dev/null +++ b/MULE/arcade_description.txt @@ -0,0 +1,16 @@ +MULE.PY 1.0 +2024 lauren32bit +https://github.com/lauren32bit/MULE.PY + +Once upon a time, a guy made a game like this for personal computers. +Now, he is one of the 10 richest people in the world. +Could this work for me? Only time will tell ... + +From the main menu, select a game mode or press left for info. +Press either action button to change lanes and avoid the mules in the road. + +In game mode A, the game is played in rounds; making it to the right of the screen will award a point, and getting hit will award a point to the mule. This continues until you quit by pressing the left button. + +In Game B, you will endlessly dodge mules until you hit one. You can also press left here to quit. + +That's pretty much it! diff --git a/MULE/mule_video.webm b/MULE/mule_video.webm new file mode 100644 index 0000000000000000000000000000000000000000..6e4eb9ae2a1d3bf46edd02712f92d20a729756c5 GIT binary patch literal 57542 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 literal 0 HcmV?d00001