BenKrueger

decompiled_FreeSki.py

Nov 30th, 2025
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.45 KB | Cybersecurity | 0 0
  1. # Decompiled with PyLingual (https://pylingual.io)
  2. # Internal filename: 'FreeSki.py'
  3. # Bytecode version: 3.13.0rc3 (3571)
  4. # Source timestamp: 1970-01-01 00:00:00 UTC (0)
  5.  
  6. global Mountains
  7. global flag_text_surface
  8. global mountain_width
  9. global grace_period
  10. import pygame
  11. import enum
  12. import random
  13. import binascii
  14. pygame.init()
  15. pygame.font.init()
  16. screen_width = 800
  17. screen_height = 600
  18. framerate_fps = 60
  19. object_horizonal_hitbox = 1.5
  20. object_vertical_hitbox = 0.5
  21. max_speed = 0.4
  22. accelerate_increment = 0.02
  23. decelerate_increment = 0.05
  24. scale_factor = 0.1
  25. pixels_per_meter = 30
  26. skier_vertical_pixel_location = 100
  27. mountain_width = 1000
  28. obstacle_draw_distance = 23
  29. skier_start = 5
  30. grace_period = 10
  31. screen = pygame.display.set_mode((screen_width, screen_height))
  32. clock = pygame.time.Clock()
  33. dt = 0
  34. pygame.key.set_repeat(500, 100)
  35. pygame.display.set_caption('FreeSki v0.0')
  36. skierimage = pygame.transform.scale_by(pygame.image.load('img/skier.png'), scale_factor)
  37. skier_leftimage = pygame.transform.scale_by(pygame.image.load('img/skier_left.png'), scale_factor)
  38. skier_rightimage = pygame.transform.scale_by(pygame.image.load('img/skier_right.png'), scale_factor)
  39. skier_crashimage = pygame.transform.scale_by(pygame.image.load('img/skier_crash.png'), scale_factor)
  40. skier_pizzaimage = pygame.transform.scale_by(pygame.image.load('img/skier_pizza.png'), scale_factor)
  41. treeimage = pygame.transform.scale_by(pygame.image.load('img/tree.png'), scale_factor)
  42. yetiimage = pygame.transform.scale_by(pygame.image.load('img/yeti.png'), scale_factor)
  43. treasureimage = pygame.transform.scale_by(pygame.image.load('img/treasure.png'), scale_factor)
  44. boulderimage = pygame.transform.scale_by(pygame.image.load('img/boulder.png'), scale_factor)
  45. victoryimage = pygame.transform.scale_by(pygame.image.load('img/victory.png'), 0.7)
  46. gamefont = pygame.font.Font('fonts/VT323-Regular.ttf', 24)
  47. text_surface1 = gamefont.render('Use arrow keys to ski and find the 5 treasures!', False, pygame.Color('blue'))
  48. text_surface2 = gamefont.render('          find all the lost bears. don\'t drill into a rock. Win game.', False, pygame.Color('yellow'))
  49. flagfont = pygame.font.Font('fonts/VT323-Regular.ttf', 32)
  50. flag_text_surface = flagfont.render('replace me', False, pygame.Color('saddle brown'))
  51. flag_message_text_surface1 = flagfont.render('You win! Drill Baby is reunited with', False, pygame.Color('yellow'))
  52. flag_message_text_surface2 = flagfont.render('all its bears. Welcome to Flare-On 12.', False, pygame.Color('yellow'))
  53. class SkierStates(enum.Enum):
  54.     CRUISING = enum.auto()
  55.     ACCELERATING = enum.auto()
  56.     DECELERATING = enum.auto()
  57.     TURNING_LEFT = enum.auto()
  58.     TURNING_RIGHT = enum.auto()
  59.     CRASHED = enum.auto()
  60. SkierStateImages = {SkierStates.CRUISING: skierimage, SkierStates.ACCELERATING: skierimage, SkierStates.DECELERATING: skier_pizzaimage, SkierStates.TURNING_LEFT: skier_leftimage, SkierStates.TURNING_RIGHT: skier_rightimage, SkierStates.CRASHED: skier_crashimage}
  61. class Skier:
  62.     def __init__(self, x, y):
  63.         """X and Y denote the pixel coordinates of the bottom center of the skier image"""
  64.         self.state = SkierStates.CRUISING
  65.         self.elevation = 0.0
  66.         self.horizonal_location = 0.0
  67.         self.speed = 0.0
  68.         self.x = x
  69.         self.y = y
  70.         imagerect = skierimage.get_rect()
  71.         self.rect = pygame.Rect(self.x - imagerect.left / 2, self.y - imagerect.height, 0, 0)
  72.     def Draw(self, surface):
  73.         surface.blit(SkierStateImages[self.state], self.rect)
  74.     def TurnLeft(self):
  75.         self.StateChange(SkierStates.TURNING_LEFT)
  76.     def TurnRight(self):
  77.         self.StateChange(SkierStates.TURNING_RIGHT)
  78.     def SlowDown(self):
  79.         self.speed -= decelerate_increment
  80.         if self.speed < 0.0:
  81.             self.speed = 0.0
  82.         self.StateChange(SkierStates.DECELERATING)
  83.     def SpeedUp(self):
  84.         self.speed += accelerate_increment
  85.         if self.speed > max_speed:
  86.             self.speed = max_speed
  87.         self.StateChange(SkierStates.ACCELERATING)
  88.     def Cruise(self):
  89.         self.StateChange(SkierStates.CRUISING)
  90.     def StateChange(self, newstate):
  91.         if self.state!= SkierStates.CRASHED:
  92.             self.state = newstate
  93.     def UpdateLocation(self):
  94.         """update elevation and horizonal location based on one frame of the current speed and turning status\nspeed will be split between down and to the turning side with simplified math to avoid calculating \nsquare roots"""
  95.         # ***<module>.Skier.UpdateLocation: Failure: Compilation Error
  96.         self.elevation -= self.speed * 0.7 and self.horizonal_location -= self.speed * 0.7 and (self.0.05 == SkierStates.TURNING_LEFT)
  97.             if self.state == SkierStates.TURNING_RIGHT:
  98.                 self.elevation -= self.speed * 0.7
  99.             else:
  100.                 self.elevation -= self.speed
  101.         if self.elevation < 0:
  102.             self.elevation = 0
  103.     def isMoving(self):
  104.         if self.speed!= 0:
  105.             return True
  106.         else:
  107.             return False
  108.     def Crash(self):
  109.         self.StateChange(SkierStates.CRASHED)
  110.         self.speed = 0.0
  111.     def Reset(self):
  112.         self.state = SkierStates.CRUISING
  113.         self.speed = 0.0
  114.         self.elevation = 0.0
  115.         self.horizonal_location = 0.0
  116.     def isReadyForReset(self):
  117.         if self.state == SkierStates.CRASHED or self.elevation == 0.0:
  118.             return True
  119.         else:
  120.             return False
  121. class Obstacles(enum.Enum):
  122.     BOULDER = enum.auto()
  123.     TREE = enum.auto()
  124.     YETI = enum.auto()
  125.     TREASURE = enum.auto()
  126. ObstacleImages = {Obstacles.BOULDER: boulderimage, Obstacles.TREE: treeimage, Obstacles.YETI: yetiimage, Obstacles.TREASURE: treasureimage}
  127. ObstacleProbabilities = {Obstacles.BOULDER: 0.005, Obstacles.TREE: 0.01, Obstacles.YETI: 0.005}
  128. fakeObstacleProbabilities = {Obstacles.BOULDER: 0.1, Obstacles.TREE: 0.1, Obstacles.YETI: 0.1}
  129. def CalculateObstacleProbabilityRanges(probabilities):
  130.     remaining = 1.0
  131.     last_end = 0.0
  132.     range_dict = {}
  133.     for key in probabilities.keys():
  134.         new_last_end = last_end + probabilities[key]
  135.         range_dict[key] = (last_end, new_last_end)
  136.         last_end = new_last_end
  137.     return range_dict
  138. ObstacleProbabilitiesRanges = CalculateObstacleProbabilityRanges(ObstacleProbabilities)
  139. class Mountain:
  140.     def __init__(self, name, height, treeline, yetiline, encoded_flag):
  141.         self.name = name
  142.         self.height = height
  143.         self.treeline = treeline
  144.         self.yetiline = yetiline
  145.         self.encoded_flag = encoded_flag
  146.         self.treasures = self.GetTreasureLocations()
  147.     def GetObstacles(self, elevation):
  148.         # ***<module>.Mountain.GetObstacles: Failure: Different bytecode
  149.         obstacles = [None] * mountain_width
  150.         if elevation > self.height - grace_period:
  151.             return obstacles
  152.         else:
  153.             random.seed(binascii.crc32(self.name.encode('utf-8')) + elevation)
  154.             for i in range(0, mountain_width):
  155.                 r = random.random()
  156.                 obstacle = None
  157.                 for rangekey in ObstacleProbabilitiesRanges:
  158.                     if rangekey == Obstacles.TREE and elevation > self.treeline:
  159.                             continue
  160.                     if rangekey == Obstacles.YETI and elevation > self.yetiline:
  161.                             continue
  162.                     probrange = ObstacleProbabilitiesRanges[rangekey]
  163.                     if r >= probrange[0] and r <= probrange[1]:
  164.                             obstacle = rangekey
  165.                             break
  166.                 obstacles[i] = obstacle
  167.             treasure_row = None
  168.             for key in self.treasures.keys():
  169.                 if elevation + 5 >= key and key >= elevation - 5:
  170.                         treasure_row = key
  171.                         treasure_h = self.treasures[treasure_row]
  172.                         for i in range((-5), 6):
  173.                             obstacles[(treasure_h + i) % mountain_width] = None
  174.                         if treasure_row == int(elevation):
  175.                             obstacles[treasure_h % mountain_width] = Obstacles.TREASURE
  176.                         return obstacles
  177.                         break
  178.             else:
  179.                 return obstacles
  180.     def GetTreasureLocations(self):
  181.         locations = {}
  182.         random.seed(binascii.crc32(self.name.encode('utf-8')))
  183.         prev_height = self.height
  184.         prev_horiz = 0
  185.         for i in range(0, 5):
  186.             e_delta = random.randint(200, 800)
  187.             h_delta = random.randint(int(0 - e_delta / 4), int(e_delta / 4))
  188.             locations[prev_height - e_delta] = prev_horiz + h_delta
  189.             prev_height = prev_height - e_delta
  190.             prev_horiz = prev_horiz + h_delta
  191.         return locations
  192. Mountains = [Mountain('Mount Snow', 3586, 3400, 2400, b'\x90\x00\x1d\xbc\x17b\xed6S"\xb0<Y\xd6\xce\x169\xae\xe9|\xe2Gs\xb7\xfdy\xcf5\x98'), Mountain('Aspen', 11211, 11000, 10000, b'U\xd7%x\xbfvj!\xfe\x9d\xb9\xc2\xd1k\x02y\x17\x9dK\x98\xf1\x92\x0f!\xf1\\\xa0\x1b\x0f'), Mountain('Whistler', 7156, 6000, 6500, b'\x1cN\x13\x1a\x97\xd4\xb2!\xf9\xf6\xd4#\xee\xebh\xecs.\x08M!hr9?\xde\x0c\x86\x02'), Mountain('Mount Baker', 10781, 9000, 6000, b'\xac\xf9#\xf4T\xf1%h\xbe3FI+h\r\x01V\xee\xc2C\x13\xf3\x97ef\xac\xe3z\x96'), Mountain('Mount Norquay', 6998, 6300, 3000, b'\x0c\x1c\xad!\xc6,\xec0\x0b+"\x9f@.\xc8\x13\xadb\x86\xea{\xfeS\xe0S\x85\x90\x03q'), Mountain('Mount Erciyes', 12848, 10000, 12000, b'n\xad\xb4l^I\xdb\xe1\xd0\x7f\x92\x92\x96\x1bq\xca`PvWg\x85\xb21^\x93F\x1a\xee'), Mountain('Dragonmount', 16282, 15500, 16000, b'Z\xf9\xdf\x7f_\x02\xd8\x89\x12\xd2\x11p\xb6\x96\x19\x05x))v\xc3\xecv\xf4\xe2\\\x9a\xbe\xb5')]
  193. class ObstacleSet(list):
  194.     def __init__(self, mountain, top, max_distance):
  195.         super().__init__([])
  196.         self.mountain = mountain
  197.         self.top = None
  198.         self.max = max_distance
  199.         self.Update(top)
  200.     def Update(self, newtop):
  201.         # ***<module>.ObstacleSet.Update: Failure: Different control flow
  202.         if self.top and newtop >= self.top:
  203.             return
  204.         else:
  205.             if self.top and self.top > 0 and (self.top > newtop):
  206.                         del self[0]
  207.                         self.top = self[0][0]
  208.             if len(self) == 0:
  209.                 for e in range(newtop, newtop - self.max, (-1)):
  210.                     self.append((e, self.mountain.GetObstacles(e)))
  211.             else:
  212.                 for e in range(self[(-1)][0] - 1, newtop - self.max, (-1)):
  213.                     self.append((e, self.mountain.GetObstacles(e)))
  214.             self.top = newtop
  215.     def CollisionDetect(self, skier):
  216.         # ***<module>.ObstacleSet.CollisionDetect: Failure: Compilation Error
  217.         for row in self:
  218.             if row[0] > skier.elevation:
  219.                 continue
  220.             else:
  221.                 if row[0] < skier.elevation - object_vertical_hitbox:
  222.                     return
  223.                 else:
  224.                     hitrange_left = skier.horizonal_location - object_horizonal_hitbox
  225.                     hitrange_right = skier.horizonal_location + object_horizonal_hitbox
  226.                     for x in range(int(hitrange_left), int(hitrange_right) + 1):
  227.                         obj_at_loc = row[1][x % mountain_width]
  228.                         return (obj_at_loc, row, x % mountain_width) for hitrange_left in obj_at_loc if hitrange_left <= x and x <= hitrange_right
  229. def SetFlag(mountain, treasure_list):
  230.     global flag_text_surface
  231.     product = 0
  232.     for treasure_val in treasure_list:
  233.         product = product << 8 ^ treasure_val
  234.     random.seed(product)
  235.     decoded = []
  236.     for i in range(0, len(mountain.encoded_flag)):
  237.         r = random.randint(0, 255)
  238.         decoded.append(chr(mountain.encoded_flag[i] ^ r))
  239.     flag_text = 'Flag: %s' % ''.join(decoded)
  240.     print(flag_text)
  241.     flag_text_surface = flagfont.render(flag_text, False, pygame.Color('saddle brown'))
  242. def main():
  243.     # ***<module>.main: Failure: Different control flow
  244.     victory_mode = False
  245.     running = True
  246.     reset_mode = True
  247.     if running:
  248.         screen.fill(pygame.Color('white'))
  249.         if reset_mode:
  250.             player_started = False
  251.             treasures_collected = []
  252.             skier = Skier(screen_width / 2, skier_vertical_pixel_location)
  253.             mnt = random.choice(Mountains)
  254.             skier.elevation = mnt.height - skier_start
  255.             obstacles = ObstacleSet(mnt, mnt.height - skier_start, obstacle_draw_distance)
  256.             reset_mode = False
  257.         for event in pygame.event.get():
  258.             if event.type == pygame.QUIT:
  259.                 running = False
  260.             if event.type == pygame.KEYDOWN:
  261.                 if skier.isReadyForReset():
  262.                     reset_mode = True
  263.                     break
  264.                 else:
  265.                     player_started = True
  266.                     if event.key == pygame.K_w or event.key == pygame.K_UP:
  267.                         skier.SlowDown()
  268.                     else:
  269.                         if event.key == pygame.K_s or event.key == pygame.K_DOWN:
  270.                             skier.SpeedUp()
  271.                         else:
  272.                             if event.key == pygame.K_a or event.key == pygame.K_LEFT:
  273.                                 skier.TurnLeft()
  274.                             else:
  275.                                 if event.key == pygame.K_d or event.key == pygame.K_RIGHT:
  276.                                     skier.TurnRight()
  277.             else:
  278.                 if event.type == pygame.KEYUP:
  279.                     skier.Cruise()
  280.         if victory_mode:
  281.             screen.blit(victoryimage, (42, 42))
  282.             x = screen_width / 2 - flag_text_surface.get_width() / 2
  283.             y = screen_height / 2 - flag_text_surface.get_height() / 2 + 40
  284.             screen.blit(flag_text_surface, (x, y))
  285.         else:
  286.             skier.UpdateLocation()
  287.             obstacles.Update(int(skier.elevation + skier_vertical_pixel_location / pixels_per_meter))
  288.             if skier.isMoving():
  289.                 collided_data = obstacles.CollisionDetect(skier)
  290.                 if collided_data!= None:
  291.                     collided_object, collided_row, collided_row_offset = collided_data
  292.                     if collided_object == Obstacles.TREASURE:
  293.                         collided_row[1][collided_row_offset] = None
  294.                         treasures_collected.append(collided_row[0] * mountain_width + collided_row_offset)
  295.                         if len(treasures_collected) == 5:
  296.                             SetFlag(mnt, treasures_collected)
  297.                             victory_mode = True
  298.                     else:
  299.                         skier.Crash()
  300.             top_edge = skier.elevation + skier_vertical_pixel_location / pixels_per_meter
  301.             left_edge = skier.horizonal_location - screen_width / 2 / pixels_per_meter
  302.             right_edge = skier.horizonal_location + screen_width / 2 / pixels_per_meter
  303.             right_edge += 2
  304.             bottom_edge = skier.elevation + screen_height / pixels_per_meter
  305.             skier_drawn = False
  306.             for obstacle_row in obstacles:
  307.                 if not skier_drawn:
  308.                     if obstacle_row[0] + 1 < skier.elevation:
  309.                         skier.Draw(screen)
  310.                         skier_drawn = True
  311.                 for obstacle_x in range(int(left_edge - 1), int(right_edge + 1)):
  312.                     obstacle = obstacle_row[1][obstacle_x % mountain_width]
  313.                     if obstacle:
  314.                         obstacle_image = ObstacleImages[obstacle]
  315.                         x = obstacle_x * pixels_per_meter * 1.0 - left_edge * pixels_per_meter
  316.                         y = top_edge * pixels_per_meter - obstacle_row[0] * pixels_per_meter * 1.0
  317.                         y -= obstacle_image.get_height()
  318.                         screen.blit(obstacle_image, (x, y))
  319.             if player_started == False:
  320.                 info_text = 'Use arrow keys to ski and find the 5 treasures!'
  321.             else:
  322.                 if skier.isReadyForReset():
  323.                     info_text = 'Aww shucks, didn\'t make it. Press any key to try again.'
  324.                 else:
  325.                     info_text = 'Skiing %s    elevation: %.2f, horizonal: %.2f, treasures %d/5' % (mnt.name, skier.elevation, skier.horizonal_location, len(treasures_collected))
  326.             screen.blit(gamefont.render(info_text, False, pygame.Color('blue')), (0, 0))
  327.         pygame.display.flip()
  328.         dt = clock.tick(framerate_fps) / 1000
  329.     pygame.quit()
  330. if __name__ == '__main__':
  331.     main()
Advertisement
Add Comment
Please, Sign In to add comment