From b9a3dabdb4e13cce76aeed4b8c0fd258d68fa339 Mon Sep 17 00:00:00 2001 From: Peter Gerwinski Date: Wed, 16 May 2018 20:39:12 +0200 Subject: [PATCH] adopted eternal-flag mode and AI by balthasar_s --- README | 6 +- assets/lucky.xcf.gz | Bin 0 -> 8396 bytes molpyup.py | 264 ++++++++++++++++++++++++++++++++++++++------ 3 files changed, 233 insertions(+), 37 deletions(-) create mode 100644 assets/lucky.xcf.gz diff --git a/README b/README index c4c6600..4c4faa4 100644 --- a/README +++ b/README @@ -40,12 +40,14 @@ In the game, the following keys can be used: Some additional key bindings for debugging and/or cheating: - Use with <+> or <-> to crank up/down the score. - - Use with to enable "eternal" mode. No more falling down. ;-) + - Use with to enable / disable "eternal" mode. No more falling down. ;-) + - Use with for flag-eternal mode. Lose a flag instead of falling down. - Use with to get / get rid of a flag. - Use with to get / get rid of a beanie. + - Use with enable / disable artificial intelligence playing for you. Thanks to NoMouse and taixzo for the installation instructions! -Thanks to balthasar_s for testing and debugging! +Thanks to balthasar_s for testing, debugging, and improving the game! Thanks to everyone who reported mustard and kept me up with the Present! Enjoy! diff --git a/assets/lucky.xcf.gz b/assets/lucky.xcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..4568546315170d9d877ba34bde365bd9c69cd37a GIT binary patch literal 8396 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 iA-F-0Wj5roxQ0F, # OTTified in about 120 minutes. # -# edited to add arrow - balthasar_s +# edited to add arrow, AI, and a flag save mode - balthasar_s # # This program is Free Software: you can redistribute it and/or modify it # under the terms of the GNU General Public License (GNU GPL), version 3, @@ -40,6 +40,7 @@ from pygame.locals import * import sys import datetime import random +import math class MolpyUp: @@ -78,6 +79,7 @@ class MolpyUp: scoreEpilogue = 3094 def __init__(self): + self.relativeX=0 self.sx = 553 self.sy = 395 self.extrax = self.sx // 16 @@ -87,6 +89,9 @@ class MolpyUp: self.clock = pygame.time.Clock() self.xmovementmax = 10 self.eternal = False + self.eternalFlag = False + self.ai = False + self.aiDebag = False self.imgPlatformSand = [ pygame.image.load("assets/platformSand1.png").convert_alpha(), pygame.image.load("assets/platformSand2.png").convert_alpha(), pygame.image.load("assets/platformSand3.png").convert_alpha(), @@ -171,9 +176,11 @@ class MolpyUp: self.hadLucky = False self.hadTheEnd = False self.raftcastleHasFlag = False - self.platforms = [[self.playerx, self.playery + self.sy // 6, self.platformTypeSand, 0, 0]] + self.platforms = [[self.playerx, self.playery + self.sy // 6, self.platformTypeSand, 0, 0, -1, False, self.imgPlatformSand[0].get_width()]] self.generateInitialPlatforms() self.items = [] + self.aiNextPlatformOk = False + self.aiNextPlatform=[self.playerx,self.playery] if self.filename: self.restoreGame (self.filename) @@ -202,6 +209,7 @@ class MolpyUp: file.write("hadTheEnd: " + str(self.hadTheEnd) + "\n") file.write("raftcastleHasFlag: " + str(self.raftcastleHasFlag) + "\n") file.write("eternal: " + str(self.eternal) + "\n") + file.write("eternalFlag: " + str(self.eternalFlag) + "\n") file.write("platforms: " + str(self.platforms) + "\n") file.write("items: " + str(self.items) + "\n") @@ -241,8 +249,112 @@ class MolpyUp: return True except FileNotFoundError: return False - + + def findNextPlatform(self): + # bestDistance=float("Inf") + # for p in self.platforms: + # if not self.jump: + # distance = abs(p[0]-self.playerx) * 0.5 - p[1] + # else: + # distance = abs(p[0]-self.playerx) * 0.5 + abs(p[1]-self.playery) + # if p[1]>self.playery: + # distance += 900 + # if p[2] > self.platformTypeNormal and p[2] <= self.platformTypeFloating: + # distance += 290 + # if p[2] == self.platformTypeBreaking: + # distance = float("Inf") + # p[6]=distance + # if distance 0: + maxY = actualY - (self.jump * (self.jump+1) // 2) + framesUp = self.jump + else: + maxY = actualY + framesUp = 0 + + for p in self.platforms: + platformX = p[0] + p[7] //2 + platformY = p[1] + platformScore = 0 + + if (platformY < maxY) or (p[2] == self.platformTypeBreaking): + platformScore = float("-Inf") + p[6]=platformScore + continue + + distY = actualY - platformY + distDown = platformY - maxY + distX = abs(platformX-actualX) + + if self.gravity > 0: + framesDown = int(math.floor(math.sqrt(self.gravity * self.gravity + 2 * distDown) - self.gravity)) + else: + framesDown = int(math.floor(math.sqrt(2*distDown))) + + speedX=9; + + if p[2] > self.platformTypeNormal and p[2] <= self.platformTypeFloating: + if (p[4] and platformX>actualX) or (not p[4] and platformX2*self.xmovementmax and self.xmovement < 0: + platformScore -= (self.xmovementmax-self.xmovement)*(self.xmovementmax-self.xmovement)//4 + elif actualX-platformX>2*self.xmovementmax and self.xmovement > 0: + platformScore -= (-self.xmovementmax-self.xmovement)*(-self.xmovementmax-self.xmovement)//4 + + if platformScore < 0: + platformScore = float("-Inf") + platformScore *=4 + + if distY>16: + platformScore += distY + distX//2 + else: + platformScore += 2*distY - 200 + distX + + if p[2] > self.platformTypeNormal and p[2] <= self.platformTypeFloating: + platformScore -= 50 #100 + elif p[2] == self.platformTypeLucky: + platformScore -= 150 + + if p[5] == self.itemTypeSnake: + platformScore -= 150 + elif p[5] == self.itemTypeFlag and not self.playerCarriesFlag: + platformScore += 70 + elif p[5] == self.itemTypeSandcastle and self.playerCarriesFlag: + platformScore += 70 + elif p[5] == self.itemTypeBeanie and not self.playerWearsBeanie: + platformScore += 50 + + p[6] = platformScore + + if platformScore > bestPlatformScore: + bestPlatformScore = platformScore + self.aiNextPlatform = p + self.aiNextPlatformOk = True + + + + + def updatePlayer(self): + if ((not self.jump) and (self.playery > self.aiNextPlatform[1])) or (self.aiNextPlatform[1] - self.cameray > self.sy): + self.aiNextPlatformOk = False + + if not self.aiNextPlatformOk and self.ai: + self.findNextPlatform() + if not self.jump: self.playery += self.gravity self.gravity += 1 @@ -250,6 +362,7 @@ class MolpyUp: self.playery -= self.jump self.jump -= 1 key = pygame.key.get_pressed() + if key[K_RIGHT]: if self.xmovement < self.xmovementmax: self.xmovement += 1 @@ -271,14 +384,42 @@ class MolpyUp: self.speed -= 1 self.screen.blit(self.font.render("Speed: " + str(self.speed), -1, (0, 0, 0)), (self.sx // 32, self.sy - self.sy // 12)) else: - if self.xmovement > 0: - self.xmovement -= 1 - elif self.xmovement < 0: - self.xmovement += 1 + if self.ai: + actualX=self.playerx+self.imgPlayerRightUp.get_width()//2 + platformX = self.aiNextPlatform[0] + self.aiNextPlatform[7] //2 + if self.aiNextPlatform[2] > self.platformTypeNormal and self.aiNextPlatform[2] <= self.platformTypeFloating: + if self.aiNextPlatform[4] == True: + self.relativeX = self.xmovement - self.extrax // 10 + else: + self.relativeX = self.xmovement + self.extrax // 10 + else: + self.relativeX = self.xmovement + + if actualXplatformX -2.5*self.relativeX: + if self.xmovement > -self.xmovementmax: + self.xmovement -= 1 + self.direction = 1 + else: + if self.xmovement > 0: + self.xmovement -= 1 + elif self.xmovement < 0: + self.xmovement += 1 + else: + if self.xmovement > 0: + self.xmovement -= 1 + elif self.xmovement < 0: + self.xmovement += 1 + if self.playerx > self.sx + self.extrax: self.playerx = -self.extrax + self.aiNextPlatformOk = False elif self.playerx < -self.extrax: self.playerx = self.sx + self.extrax + self.aiNextPlatformOk = False self.playerx += self.xmovement if self.playery - self.cameray <= self.sy // 3: self.cameray -= self.sy // 60 @@ -317,6 +458,8 @@ class MolpyUp: self.screen.blit(self.imgPlayerLeftUp, (self.playerx, self.playery - self.cameray)) if self.playerCarriesFlag: self.screen.blit(self.imgFlagRightDown, (self.playerx + 11, self.playery - 10 - self.cameray)) + + def choosePlatformType(self): if self.score >= self.scoreTheEnd: @@ -348,31 +491,35 @@ class MolpyUp: return self.platformTypeBreaking def generateNewPlatform(self): + platform = False + platform2 = False platformType = self.choosePlatformType() if platformType == self.platformTypeTheEnd: if not self.hadTheEnd: - self.platforms.append([self.sx // 2 - self.imgPlatformTheEnd.get_width() // 2, self.platforms[-1][1] - self.sy // 4, self.platformTypeTheEnd, False, False]) - self.platforms.append([self.sx // 2 - self.imgPlatformWonTheGame.get_width() // 2, self.platforms[-1][1] - self.sy * 2 // 3, self.platformTypeWonTheGame, False, False]) + platform2=[self.sx // 2 - self.imgPlatformTheEnd.get_width() // 2, self.platforms[-1][1] - self.sy // 4, self.platformTypeTheEnd, False, False, -1, False, self.imgPlatformTheEnd.get_width()] + platform=[self.sx // 2 - self.imgPlatformWonTheGame.get_width() // 2, platform2[1] - self.sy * 2 // 3, self.platformTypeWonTheGame, False, False, -1, False, self.imgPlatformWonTheGame.get_width()] self.hadTheEnd = True elif platformType == self.platformTypeWater or platformType == self.platformTypeRaftcastle: - self.platforms.append([random.randint(0, self.sx * 7 // 8), self.platforms[-1][1] - self.sy // 8, platformType, False, False]) + platform=[random.randint(0, self.sx * 7 // 8), self.platforms[-1][1] - self.sy // 8, platformType, False, False, -1, False, self.imgPlatformSand[0].get_width()] elif platformType == self.platformTypeLucky: - self.platforms.append([0, self.platforms[-1][1] - self.sy // 12, platformType, False, False]) + platform=[0, self.platforms[-1][1] - self.sy // 12, platformType, False, False, -1, False, self.imgPlatformSand[0].get_width()] else: - self.platforms.append([random.randint(0, self.sx * 7 // 8), self.platforms[-1][1] - self.sy // 12, platformType, False, False]) + platform=[random.randint(0, self.sx * 7 // 8), self.platforms[-1][1] - self.sy // 12, platformType, False, False, -1, False, self.imgPlatformSand[0].get_width()] if platformType <= self.platformTypeNormal: if platformType == self.platformTypeSand: - self.platforms[-1][-1] = random.randint(0, len(self.imgPlatformSand) - 1) + platform[4] = random.randint(0, len(self.imgPlatformSand) - 1) elif platformType == self.platformTypeGrass: - self.platforms[-1][-1] = random.randint(0, len(self.imgPlatformGrass) - 1) + platform[4] = random.randint(0, len(self.imgPlatformGrass) - 1) else: - self.platforms[-1][-1] = random.randint(0, len(self.imgPlatformWater) - 1) - x = self.platforms[-1][0] - y = self.platforms[-1][1] + platform[4] = random.randint(0, len(self.imgPlatformWater) - 1) + x = platform[0] + y = platform[1] if platformType == self.platformTypeGrass and self.score > self.scoreSnake and not self.hadSnake: + platform[5]=self.itemTypeSnake self.items.append([x - 10, y + 9, self.itemTypeSnake, False]) self.hadSnake = True elif platformType == self.platformTypeGrass and self.score > self.scorePrickly and not self.hadPrickly: + platform[5]=self.itemTypePrickly self.items.append([x + self.imgPlatformSand[0].get_width() // 3, y + 8, self.itemTypePrickly, False]) self.hadPrickly = True elif self.score > 0: @@ -381,23 +528,36 @@ class MolpyUp: xx = x + random.randint(0, self.imgPlatformSand[0].get_width() - 40) itemType = random.randint(0,999) if itemType < 50: + platform[5]=self.itemTypeBeanie self.items.append([xx, y + 7, self.itemTypeBeanie, False]) elif itemType < 150 and platformType == self.platformTypeSand: + platform[5]=self.itemTypeSandcastle self.items.append([xx, y + 7, self.itemTypeSandcastle, False]) elif itemType < 350 and platformType == self.platformTypeSand: + platform[5]=self.itemTypeFlag self.items.append([xx, y + 7, self.itemTypeFlag, False]) elif itemType < 950 and platformType == self.platformTypeSand: + platform[5]=self.itemTypePlantSand self.items.append([xx, y + 8, self.itemTypePlantSand, itemType % len(self.imgPlantSand)]) elif itemType < 100 and platformType == self.platformTypeGrass: + platform[5]=self.itemTypeFlag self.items.append([xx, y + 6, self.itemTypeFlag, False]) elif itemType < 700 and platformType == self.platformTypeGrass: + platform[5]=self.itemTypePlantGrass self.items.append([xx, y + 10, self.itemTypePlantGrass, itemType % len(self.imgPlantGrass)]) elif itemType < 850 and platformType == self.platformTypeGrass and self.score > self.scorePrickly: + platform[5]=self.itemTypePrickly self.items.append([xx, y + 8, self.itemTypePrickly, False]) elif itemType < 950 and platformType == self.platformTypeGrass and self.score > self.scoreSnake: + platform[5]=self.itemTypeSnake self.items.append([x - 10, y + 9, self.itemTypeSnake, False]) else: + platform[5]=self.itemTypeAccelerator self.items.append([xx - 5, y + 10, self.itemTypeAccelerator, False]) + if platform2 != False: + self.platforms.append(platform2) + if platform != False: + self.platforms.append(platform) def updatePlatforms(self): while self.platforms[0][1] - self.cameray > self.sy + self.sy // 12: @@ -421,25 +581,27 @@ class MolpyUp: player = pygame.Rect(self.playerx + 15, self.playery, self.imgPlayerRightUp.get_width() - 30, self.imgPlayerRightUp.get_height()) if rect.colliderect(player) and self.gravity and self.playery < (p[1] - self.cameray): if p[2] == self.platformTypeBreaking: - p[-1] = True + p[4] = True else: self.jump = self.sy // 20 + self.aiNextPlatformOk = False self.gravity = 0 - if p[2] == self.platformTypeLucky and not (self.playerWearsBeanie and self.playerCarriesFlag) and p[-2] <= 0: + if p[2] == self.platformTypeLucky and not (self.playerWearsBeanie and self.playerCarriesFlag) and p[3] <= 0: + self.aiNextPlatformOk = False self.xmovement = self.sx // 20 self.direction = 0 self.cameray -= self.sy // 12 - p[-2] = -1 - elif (p[2] == self.platformTypeAfterLucky or p[2] == self.platformTypeCastle or p[2] == self.platformTypeLucky) and self.playerCarriesFlag and not p[-2]: + p[3] = -1 + elif (p[2] == self.platformTypeAfterLucky or p[2] == self.platformTypeCastle or p[2] == self.platformTypeLucky) and self.playerCarriesFlag and not p[3]: self.playerCarriesFlag = False - p[-2] = True + p[3] = True self.sandcastles += 1 elif p[2] == self.platformTypeRaftcastle and self.playerCarriesFlag and not self.raftcastleHasFlag: self.playerCarriesFlag = False self.raftcastleHasFlag = True self.sandcastles += 1 if p[2] > self.platformTypeNormal and p[2] <= self.platformTypeFloating: - if p[-1]: + if p[4]: if p[2] == self.platformTypeAfterLucky: img = self.imgPlatformAfterLucky elif p[2] == self.platformTypeCastle: @@ -447,35 +609,38 @@ class MolpyUp: else: img = self.imgPlatformGrapevine p[0] += self.extrax // 10 - if p[0] + img.get_width() > self.sx + self.extrax: - p[-1] = False + if p[0] + img.get_width() > self.sx:# + self.extrax: + p[4] = False else: p[0] -= self.extrax // 10 if p[0] <= 0: - p[-1] = True + p[4] = True + + + def drawPlatforms(self): for p in self.platforms: if p[2] == self.platformTypeSand: - self.screen.blit(self.imgPlatformSand[p[-1]], (p[0], p[1] - self.cameray)) + self.screen.blit(self.imgPlatformSand[p[4]], (p[0], p[1] - self.cameray)) elif p[2] == self.platformTypeGrass: - self.screen.blit(self.imgPlatformGrass[p[-1]], (p[0], p[1] - self.cameray)) + self.screen.blit(self.imgPlatformGrass[p[4]], (p[0], p[1] - self.cameray)) elif p[2] == self.platformTypeWater: - self.screen.blit(self.imgPlatformWater[p[-1]], (p[0], p[1] - self.cameray)) + self.screen.blit(self.imgPlatformWater[p[4]], (p[0], p[1] - self.cameray)) elif p[2] == self.platformTypeGrapevine: self.screen.blit(self.imgPlatformGrapevine, (p[0], p[1] - self.cameray)) elif p[2] == self.platformTypeAfterLucky: - if p[-2]: + if p[3]: self.screen.blit(self.imgFlagRight, (p[0] + 47, p[1] - 12 - self.cameray)) self.screen.blit(self.imgPlatformAfterLucky, (p[0], p[1] - self.cameray)) elif p[2] == self.platformTypeCastle: - if p[-2]: + if p[3]: self.screen.blit(self.imgFlagRight, (p[0] + self.imgPlatformCastle.get_width() - 16, p[1] - 4 - self.cameray)) self.screen.blit(self.imgPlatformCastle, (p[0], p[1] - self.cameray)) elif p[2] == self.platformTypeLucky: - if p[-2]: + if p[3]: self.screen.blit(self.imgPlatformLuckyAttacking, (p[0], p[1] - self.imgPlatformLuckyAttacking.get_height() + self.imgPlatformLuckySleeping.get_height() - self.cameray)) - if p[-2] > 0: + if p[3] > 0: self.screen.blit(self.imgFlagRight, (p[0] + self.imgPlatformLuckyAttacking.get_width() - 8, p[1] - 11 - self.cameray)) else: self.screen.blit(self.imgPlatformLuckySleeping, (p[0], p[1] - self.cameray)) @@ -484,7 +649,7 @@ class MolpyUp: self.screen.blit(self.imgFlagRight, (p[0] + 50, p[1] - 13 - self.cameray)) self.screen.blit(self.imgPlatformRaftcastle, (p[0], p[1] - self.cameray)) elif p[2] == self.platformTypeBreaking: - if not p[-1]: + if not p[4]: self.screen.blit(self.imgPlatformBreaking, (p[0], p[1] - self.cameray)) else: self.screen.blit(self.imgPlatformBroken, (p[0], p[1] - self.cameray)) @@ -492,6 +657,13 @@ class MolpyUp: self.screen.blit(self.imgPlatformTheEnd, (p[0], p[1] - self.cameray)) elif p[2] == self.platformTypeWonTheGame: self.screen.blit(self.imgPlatformWonTheGame, (p[0], p[1] - self.cameray)) + # print (str(p)) + if self.aiDebag: + self.screen.blit(self.font.render(str(p[2])+" "+str(p[5])+" "+str(p[6]), -1, (0, 0x57, 0xaf)), (p[0], p[1] - self.cameray + 16)) + if self.aiDebag: + self.screen.blit(self.imgMolpArrow, (self.aiNextPlatform[0] + (self.imgPlatformSand[0].get_width()-self.imgMolpArrow.get_width())//2, self.aiNextPlatform[1] - self.cameray + 16)) + + def drawAndUpdateItems(self): while self.items and self.items[0][1] - self.cameray > self.sy + self.sy // 12: @@ -537,6 +709,7 @@ class MolpyUp: if not item[-1]: if pygame.Rect(item[0], item[1] - imgItem.get_height(), imgItem.get_width(), imgItem.get_height()).colliderect(pygame.Rect(self.playerx, self.playery, self.imgPlayerRightUp.get_width(), self.imgPlayerRightUp.get_height())): if item[2] == self.itemTypeAccelerator: + self.aiNextPlatformOk = False self.jump = self.sy // 12 self.cameray -= self.sy // 12 item[-1] = True @@ -544,6 +717,7 @@ class MolpyUp: self.playerWearsBeanie = True item[-1] = True elif item[2] == self.itemTypeSnake: + self.aiNextPlatformOk = False if self.playerx + self.imgPlayerRightUp.get_width() // 2 < item[0] + self.imgPlatformGrass[0].get_width() // 2: self.xmovement = -self.sx // 30 self.direction = 0 @@ -616,9 +790,21 @@ class MolpyUp: key = pygame.key.get_pressed() if key[K_ESCAPE]: sys.exit() + elif key[K_i]: + if pygame.key.get_mods() & KMOD_CTRL: + self.ai = not self.ai + self.aiNextPlatformOk = False + elif key[K_d]: + if pygame.key.get_mods() & KMOD_CTRL: + self.aiDebag = not self.aiDebag elif key[K_e]: if pygame.key.get_mods() & KMOD_CTRL: self.eternal = not self.eternal + self.eternalFlag = False + elif key[K_f]: + if pygame.key.get_mods() & KMOD_CTRL: + self.eternalFlag = not self.eternalFlag + self.eternal = False elif key[K_f]: if pygame.key.get_mods() & KMOD_CTRL: self.playerCarriesFlag = not self.playerCarriesFlag @@ -640,13 +826,21 @@ class MolpyUp: self.screen.blit(self.font.render(str(self.score), -1, (0, 0, 0)), (self.sx // 32, self.sy // 24)) for i in range(0, self.sandcastles): self.screen.blit(self.imgFlagRight, (self.sx // 32 + 10 * i, self.sy // 8)) + + if self.playery - self.cameray > self.sy * 7 // 6: if self.eternal: self.jump = self.gravity self.gravity = 0 + self.aiNextPlatformOk = False + elif self.eternalFlag and self.sandcastles > 0: + self.sandcastles -= 1 + self.jump = self.gravity + self.gravity = 0 + self.aiNextPlatformOk = False else: self.showScore() self.reset() pygame.display.flip() -MolpyUp().run() +MolpyUp().run() \ No newline at end of file -- 2.30.2