using binascii

Reply

Join Date: Oct 2006
Posts: 76
Reputation: mruane is an unknown quantity at this point 
Solved Threads: 1
mruane mruane is offline Offline
Junior Poster in Training

using binascii

 
0
  #1
Feb 3rd, 2009
I am trying to use binascii to convert this:

  1. town1 = """
  2. ++++++++++++++++++++++++++++++++++++
  3. +-------------------------------------------------------------+
  4. +----------H-----------H----------H---------H--------------+
  5. +----------&---------------&---------------------------------+
  6. +------------------------------------------------------------>+
  7. +----------------@-------------------------------------------+
  8. ++++++++++++++++++++++++++++++++++++
  9. """

into the type of graphics used in PyMike's PixelMan 3, found at pygame.org. I looked at the document on python.org telling about binascii and a little bit about how to use it, but since it wasn't presented in a matter that was directed towards gaming, I found it hard to understand. If anyone could, give me a break down of how I would convert town1 as well as the text-mode representations of H (for a house), @ for the player, and & for an NPC into pixel based graphics using binascii. I have the source code for PixelMan 3, and am working with that, but do not understand much of PyMike's code, and it is not very documented (no comments.) here is the PixelMan 3 code, if somebody could insert comments telling me what each section does I would greatly appreciate it.

  1. #! /usr/bin/env python
  2.  
  3. # Pixelman 3 - PyMike's Entry for Ludum Dare 11
  4. # Copyright (C) 2007 PyMike
  5. #
  6. # This library is free software; you can redistribute it and/or
  7. # modify it under the terms of the GNU Lesser General Public
  8. # License as published by the Free Software Foundation; either
  9. # version 2.1 of the License, or (at your option) any later version.
  10. #
  11. # This library is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. # Lesser General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU Lesser General Public
  17. # License along with this library; if not, write to the Free Software
  18. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19.  
  20. # -------------------------------------
  21. # Controls:
  22. # -------------------------------------
  23. # Move - Arrow Keys
  24. # Jump - Space, Up, Z
  25. # Back out - Escape
  26. # Choose option - Enter/Return
  27. # Scroll options - Up and Down Arrows
  28. # Warp to level - 1-5
  29. # -------------------------------------
  30.  
  31. import pygame, sys, os
  32. from pygame.locals import *
  33.  
  34. import binascii
  35. from cStringIO import StringIO
  36.  
  37. level1 = """
  38. ++++++++++++++++++++++++++++++++++++++++
  39. ++++++++++++++++++++++++++++++++++++++++
  40. ++++++++++++++++++++++++++++++++++++++++
  41. +---++++++----+++++++-----++++++++++++++
  42. ------------------------------++++++++++
  43. ----------------------------------------
  44. ----------------------------------------
  45. ------oo--------------------------------
  46. ------oo-------------------------oo-----
  47. -------------oooo----------------oo-----
  48. ------++-----oooo-----------------------
  49. P---++++-------G-----------------++----+
  50. ++++++++--++++++++++--+------+--++++-+++
  51. ++++++++--++++++++++--+--oo--+++++++-+++
  52. ++++++++SS++++++++++SS+SS++SS+++++++S+++
  53. """
  54.  
  55. level2 = """
  56. ++++++++++++++++++++++++++++++++++++++++++++++++
  57. ++++++++++++++++++++++++++++++++++++++++++++++++
  58. ++++++++++++++++++++++---+++++++++++++++----++++
  59. +++++++++++++++----------+++++++++++-----------+
  60. -----++++---------------------+++++-------------
  61. --------------------------------++--------------
  62. ------------------------------------------------
  63. ------------------------------------------------
  64. ------------------------------------------------
  65. P-----------------------------------------------
  66. +-------oo------------o-----G-----o--oo---------
  67. +-------oo---------+--+-----------+--oo---------
  68. ++++--------++---+++--+o--------oo+--------++---
  69. ++++++SS++--++-+++++--++oooo--+++++--++++++++---
  70. ++++++++++SS++S+++++SS++++++SS+++++SS+++++++++++
  71. """
  72.  
  73. level3 = """
  74. ++++++++++++++++++++++++++++++++++++++++++++++++
  75. +++-++++++++++++++++++++++++++++++++++++++++++++
  76. ++---++++++++++++++++++++++++++++++----+++++++++
  77. +------++++------+++++++++++++++----------++++++
  78. +-------------------+++++++++------------------+
  79. +-----------------------------------G----------+
  80. +----------------oooo--------------------------+
  81. ++P---oooo-------++++-------+++----------------+
  82. ++++++++++SSS++++++++++SSS++++++++ooo+SS++-----+
  83. ++++++++++++++++++++++++++++++++++++++++++----++
  84. -----------------ooo--------------------------++
  85. -----------------ooo--------------------------++
  86. -----------------+++-----ooo---ooo------------++
  87. -------------++++++++++SS+++SS++++--------ooo+++
  88. -------++++SS++++++++++++++++++++++++SSS++++++++
  89. ---+++++++++++++++++++++++++++++++++++++++++++++
  90. +o-++++++---------------------------------------
  91. +o-++++-----------o-----------------------------
  92. +o----------------+o--------G------------------o
  93. +o----------------++o---------------++--------o+
  94. +o-----ooo--oooo+++++o-----o---o----+++oooo--o++
  95. ++-----+++SS++++++++++++SSS+SSS+SSS++++++++SS+++
  96. +++SS+++++++++++++++++++++++++++++++++++++++++++
  97. ++++++++++++++++++++++++++++++++++++++++++++++++
  98. ++++++++++++++++++++++++++++++++++++++++++++++++
  99. """
  100.  
  101. level4 = """
  102. ----------------------------------------------------------------------------------------------------
  103. ----------------------------------------------------------------------------------------------------
  104. ----------------------------------------------------------------------------------------------------
  105. ----------------------------------------------------------------------------------------------------
  106. -P--------------------------------------------------------------------------------------------------
  107. -+--------------------------------------------------------------------------------------------------
  108. -+++----+o--------------------------------------------------oo--------------------------------------
  109. ---+++--+o--------------------------------------------------oo--------------------------------------
  110. --------+ooo-----------o+-------------------------ooo-----------------------------------------------
  111. --------++++--+--+--+--o+-------------G-----------ooo-------++-----------------------G--------------
  112. ----------------------oo+------------------+--------------+-----------------------------------------
  113. ----------------------+++--+------+---------------+++-----+---------------+--ooo--------------------
  114. ---------------------------++++---------+----+ooo------++++---------------+--+++--+--+--+--+oooooooo
  115. ------------------------------+------+-------++++----------------ooo---++++----------------+++++++++
  116. -----------------------------------------------------------------+++--------------------------------
  117. """
  118.  
  119. level5 = """
  120. -----------------------------------------------------------------------------------------------
  121. -----------------------------------------------------------------------------------------------
  122. -----------------------------------------------------------------------------------------------
  123. --------------------------------------------------oooo++---------------------------------------
  124. -----------------------------------------o--------oooo++---------------------------------------
  125. -----------------------------------------o--------oooo++---------------------------------------
  126. ---------G----oo-----------------------o-o-o------ooo+++---------------------------------------
  127. P-------------oo---oo-------------------ooo-------oo++++---------------------------------------
  128. ++-----------------oo--------------------o-------++++++----------------------------------------
  129. ++oooo--------++------------------------------++++++++-----------------------------------------
  130. ++++++--+--+--+++--++-------G------ooo++---+++++++++-------------------------------------------
  131. --++++--------++++++++-----------oo++++--------------------------------------------------------
  132. --------------------++-----------o++++---------------------------------------------------------
  133. ---------------------++----------++------------------------------------------------------------
  134. ----------------------+++--+--+--+--------------------------------------o---------------G------
  135. -----------------------------------------------------------------------o+----------------------
  136. -----------------------------------------------------------o---------oo++--------oo------oooooo
  137. -----------------------------------------o-----o-----o--o--+--o-----o++++SS++----oo--++--++++++
  138. -----------------------------------------+--o--+--o--+--+-----+-----+++++++++++-----+++SS++++++
  139. --------------------------------------------+-----+--------------o--------+++++++SS++++++++++++
  140. -----------------------------------------------------------------+-------------++++++--++++----
  141. """
  142.  
  143. player_anim0 = """
  144. ------+++++-----
  145. ----+++++++++---
  146. ---+++++++++++--
  147. --+++++++++++++-
  148. --++++--+++--++-
  149. -+++++--+++--++-
  150. +++++++++++++++-
  151. ++++++++++++++++
  152. ++++++++++++++++
  153. ++++++-+++++-+++
  154. +++++++-----++++
  155. +-++++++++++++++
  156. --++++++++++++-+
  157. ---++++++++++---
  158. ---++-----++----
  159. --+++++--+++++--
  160. """
  161. player_anim1 = """
  162. ------+++++-----
  163. ----+++++++++---
  164. ---+++++++++++--
  165. --+++++++++++++-
  166. --++++--+++--++-
  167. -+++++--+++--++-
  168. +++++++++++++++-
  169. ++++++++++++++++
  170. ++++++++++++++++
  171. ++++++-+++++-+++
  172. +++++++-----++++
  173. +-++++++++++++++
  174. --++++++++++++-+
  175. ---++++++++++---
  176. --+++++---++----
  177. ---------+++++--
  178. """
  179. player_anim2 = """
  180. ------+++++-----
  181. ----+++++++++---
  182. ---+++++++++++--
  183. --+++++++++++++-
  184. --++++--+++--++-
  185. -+++++--+++--++-
  186. +++++++++++++++-
  187. ++++++++++++++++
  188. ++++++++++++++++
  189. ++++++-+++++-+++
  190. +++++++-----++++
  191. +-++++++++++++++
  192. --++++++++++++-+
  193. ---++++++++++---
  194. ---++----+++++--
  195. --+++++---------
  196. """
  197. spikes_img = """
  198. --+---+---+---+-
  199. --+---+---+---+-
  200. --+---+---+---+-
  201. --+---+---+---+-
  202. -+++-+++-+++-+++
  203. -+++-+++-+++-+++
  204. -+++-+++-+++-+++
  205. -+++-+++-+++-+++
  206. -+++-+++-+++-+++
  207. -+++-+++-+++-+++
  208. -+++-+++-+++-+++
  209. -+++-+++-+++-+++
  210. ++++++++++++++++
  211. ++++++++++++++++
  212. ++++++++++++++++
  213. ++++++++++++++++
  214. """
  215.  
  216. ghostie_img = """
  217. ------+++++-----
  218. ----+++++++++---
  219. ---+++++++++++--
  220. --+++++++++++++-
  221. -+++++--+++--++-
  222. +++++++--+--++++
  223. ++++++++-+-+++++
  224. ++++++++++++++++
  225. -++++-+++++++-++
  226. --++++--+++--++-
  227. ---+++++---++++-
  228. ----++++++++++--
  229. -----++++++++---
  230. -------++++-----
  231. """
  232.  
  233. jump_sound = 'T2dnUwACAAAAAAAAAAAyJQAAAAAAAISM3SsBHgF2b3JiaXMAAAAAAUSsAAAAAAAAAHcBAAAAAAC4AU9nZ1MAAAAAAAAAAAAAMiUAAAEAAABGnEibEC3//////////////////8kDdm9yYmlzHQAAAFhpcGguT3JnIGxpYlZvcmJpcyBJIDIwMDQwNjI5AAAAAAEFdm9yYmlzKUJDVgEACAAAADFMIMWA0JBVAAAQAABgJCkOk2ZJKaWUoSh5mJRISSmllMUwiZiUicUYY4wxxhhjjDHGGGOMIDRkFQAABACAKAmOo+ZJas45ZxgnjnKgOWlOOKcgB4pR4DkJwvUmY26mtKZrbs4pJQgNWQUAAAIAQEghhRRSSCGFFGKIIYYYYoghhxxyyCGnnHIKKqigggoyyCCDTDLppJNOOumoo4466ii00EILLbTSSkwx1VZjrr0GXXxzzjnnnHPOOeecc84JQkNWAQAgAAAEQgYZZBBCCCGFFFKIKaaYcgoyyIDQkFUAACAAgAAAAABHkRRJsRTLsRzN0SRP8ixREzXRM0VTVE1VVVVVdV1XdmXXdnXXdn1ZmIVbuH1ZuIVb2IVd94VhGIZhGIZhGIZh+H3f933f930gNGQVACABAKAjOZbjKaIiGqLiOaIDhIasAgBkAAAEACAJkiIpkqNJpmZqrmmbtmirtm3LsizLsgyEhqwCAAABAAQAAAAAAKBpmqZpmqZpmqZpmqZpmqZpmqZpmmZZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZQGjIKgBAAgBAx3Ecx3EkRVIkx3IsBwgNWQUAyAAACABAUizFcjRHczTHczzHczxHdETJlEzN9EwPCA1ZBQAAAgAIAAAAAABAMRzFcRzJ0SRPUi3TcjVXcz3Xc03XdV1XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVYHQkFUAAAQAACGdZpZqgAgzkGEgNGQVAIAAAAAYoQhDDAgNWQUAAAQAAIih5CCa0JrzzTkOmuWgqRSb08GJVJsnuamYm3POOeecbM4Z45xzzinKmcWgmdCac85JDJqloJnQmnPOeRKbB62p0ppzzhnnnA7GGWGcc85p0poHqdlYm3POWdCa5qi5FJtzzomUmye1uVSbc84555xzzjnnnHPOqV6czsE54Zxzzonam2u5CV2cc875ZJzuzQnhnHPOOeecc84555xzzglCQ1YBAEAAAARh2BjGnYIgfY4GYhQhpiGTHnSPDpOgMcgppB6NjkZKqYNQUhknpXSC0JBVAAAgAACEEFJIIYUUUkghhRRSSCGGGGKIIaeccgoqqKSSiirKKLPMMssss8wyy6zDzjrrsMMQQwwxtNJKLDXVVmONteaec645SGultdZaK6WUUkoppSA0ZBUAAAIAQCBkkEEGGYUUUkghhphyyimnoIIKCA1ZBQAAAgAIAAAA8CTPER3RER3RER3RER3RER3P8RxREiVREiXRMi1TMz1VVFVXdm1Zl3Xbt4Vd2HXf133f141fF4ZlWZZlWZZlWZZlWZZlWZZlCUJDVgEAIAAAAEIIIYQUUkghhZRijDHHnINOQgmB0JBVAAAgAIAAAAAAR3EUx5EcyZEkS7IkTdIszfI0T/M00RNFUTRNUxVd0RV10xZlUzZd0zVl01Vl1XZl2bZlW7d9WbZ93/d93/d93/d93/d939d1IDRkFQAgAQCgIzmSIimSIjmO40iSBISGrAIAZAAABACgKI7iOI4jSZIkWZImeZZniZqpmZ7pqaIKhIasAgAAAQAEAAAAAACgaIqnmIqniIrniI4oiZZpiZqquaJsyq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7rukBoyCoAQAIAQEdyJEdyJEVSJEVyJAcIDVkFAMgAAAgAwDEcQ1Ikx7IsTfM0T/M00RM90TM9VXRFFwgNWQUAAAIACAAAAAAAwJAMS7EczdEkUVIt1VI11VItVVQ9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV1TRN0zSB0JCVAAAZAAAjQQYZhBCKcpBCbj1YCDHmJAWhOQahxBiEpxAzDDkNInSQQSc9uJI5wwzz4FIoFURMg40lN44gDcKmXEnlOAhCQ1YEAFEAAIAxyDHEGHLOScmgRM4xCZ2UyDknpZPSSSktlhgzKSWmEmPjnKPSScmklBhLip2kEmOJrQAAgAAHAIAAC6HQkBUBQBQAAGIMUgophZRSzinmkFLKMeUcUko5p5xTzjkIHYTKMQadgxAppRxTzinHHITMQeWcg9BBKAAAIMABACDAQig0ZEUAECcA4HAkz5M0SxQlSxNFzxRl1xNN15U0zTQ1UVRVyxNV1VRV2xZNVbYlTRNNTfRUVRNFVRVV05ZNVbVtzzRl2VRV3RZV1bZl2xZ+V5Z13zNNWRZV1dZNVbV115Z9X9ZtXZg0zTQ1UVRVTRRV1VRV2zZV17Y1UXRVUVVlWVRVWXZlWfdVV9Z9SxRV1VNN2RVVVbZV2fVtVZZ94XRVXVdl2fdVWRZ+W9eF4fZ94RhV1dZN19V1VZZ9YdZlYbd13yhpmmlqoqiqmiiqqqmqtm2qrq1bouiqoqrKsmeqrqzKsq+rrmzrmiiqrqiqsiyqqiyrsqz7qizrtqiquq3KsrCbrqvrtu8LwyzrunCqrq6rsuz7qizruq3rxnHrujB8pinLpqvquqm6um7runHMtm0co6rqvirLwrDKsu/rui+0dSFRVXXdlF3jV2VZ921fd55b94WybTu/rfvKceu60vg5z28cubZtHLNuG7+t+8bzKz9hOI6lZ5q2baqqrZuqq+uybivDrOtCUVV9XZVl3zddWRdu3zeOW9eNoqrquirLvrDKsjHcxm8cuzAcXds2jlvXnbKtC31jyPcJz2vbxnH7OuP2daOvDAnHjwAAgAEHAIAAE8pAoSErAoA4AQAGIecUUxAqxSB0EFLqIKRUMQYhc05KxRyUUEpqIZTUKsYgVI5JyJyTEkpoKZTSUgehpVBKa6GU1lJrsabUYu0gpBZKaS2U0lpqqcbUWowRYxAy56RkzkkJpbQWSmktc05K56CkDkJKpaQUS0otVsxJyaCj0kFIqaQSU0mptVBKa6WkFktKMbYUW24x1hxKaS2kEltJKcYUU20txpojxiBkzknJnJMSSmktlNJa5ZiUDkJKmYOSSkqtlZJSzJyT0kFIqYOOSkkptpJKTKGU1kpKsYVSWmwx1pxSbDWU0lpJKcaSSmwtxlpbTLV1EFoLpbQWSmmttVZraq3GUEprJaUYS0qxtRZrbjHmGkppraQSW0mpxRZbji3GmlNrNabWam4x5hpbbT3WmnNKrdbUUo0txppjbb3VmnvvIKQWSmktlNJiai3G1mKtoZTWSiqxlZJabDHm2lqMOZTSYkmpxZJSjC3GmltsuaaWamwx5ppSi7Xm2nNsNfbUWqwtxppTS7XWWnOPufVWAADAgAMAQIAJZaDQkJUAQBQAAEGIUs5JaRByzDkqCULMOSepckxCKSlVzEEIJbXOOSkpxdY5CCWlFksqLcVWaykptRZrLQAAoMABACDABk2JxQEKDVkJAEQBACDGIMQYhAYZpRiD0BikFGMQIqUYc05KpRRjzknJGHMOQioZY85BKCmEUEoqKYUQSkklpQIAAAocAAACbNCUWByg0JAVAUAUAABgDGIMMYYgdFQyKhGETEonqYEQWgutddZSa6XFzFpqrbTYQAithdYySyXG1FpmrcSYWisAAOzAAQDswEIoNGQlAJAHAEAYoxRjzjlnEGLMOegcNAgx5hyEDirGnIMOQggVY85BCCGEzDkIIYQQQuYchBBCCKGDEEIIpZTSQQghhFJK6SCEEEIppXQQQgihlFIKAAAqcAAACLBRZHOCkaBCQ1YCAHkAAIAxSjkHoZRGKcYglJJSoxRjEEpJqXIMQikpxVY5B6GUlFrsIJTSWmw1dhBKaS3GWkNKrcVYa64hpdZirDXX1FqMteaaa0otxlprzbkAANwFBwCwAxtFNicYCSo0ZCUAkAcAgCCkFGOMMYYUYoox55xDCCnFmHPOKaYYc84555RijDnnnHOMMeecc845xphzzjnnHHPOOeecc44555xzzjnnnHPOOeecc84555xzzgkAACpwAAAIsFFkc4KRoEJDVgIAqQAAABFWYowxxhgbCDHGGGOMMUYSYowxxhhjbDHGGGOMMcaYYowxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGFtrrbXWWmuttdZaa6211lprrQBAvwoHAP8HG1ZHOCkaCyw0ZCUAEA4AABjDmHOOOQYdhIYp6KSEDkIIoUNKOSglhFBKKSlzTkpKpaSUWkqZc1JSKiWlllLqIKTUWkottdZaByWl1lJqrbXWOgiltNRaa6212EFIKaXWWostxlBKSq212GKMNYZSUmqtxdhirDGk0lJsLcYYY6yhlNZaazHGGGstKbXWYoy1xlprSam11mKLNdZaCwDgbnAAgEiwcYaVpLPC0eBCQ1YCACEBAARCjDnnnHMQQgghUoox56CDEEIIIURKMeYcdBBCCCGEjDHnoIMQQgghhJAx5hx0EEIIIYQQOucchBBCCKGEUkrnHHQQQgghlFBC6SCEEEIIoYRSSikdhBBCKKGEUkopJYQQQgmllFJKKaWEEEIIoYQSSimllBBCCKWUUkoppZQSQgghlFJKKaWUUkIIoZRQSimllFJKCCGEUkoppZRSSgkhhFBKKaWUUkopIYQSSimllFJKKaUAAIADBwCAACPoJKPKImw04cIDUGjISgCADAAAcdhq6ynWyCDFnISWS4SQchBiLhFSijlHsWVIGcUY1ZQxpRRTUmvonGKMUU+dY0oxw6yUVkookYLScqy1dswBAAAgCAAwECEzgUABFBjIAIADhAQpAKCwwNAxXAQE5BIyCgwKx4Rz0mkDABCEyAyRiFgMEhOqgaJiOgBYXGDIB4AMjY20iwvoMsAFXdx1IIQgBCGIxQEUkICDE2544g1PuMEJOkWlDgIAAAAAAAEAHgAAkg0gIiKaOY4Ojw+QEJERkhKTE5QAAAAAAOABgA8AgCQFiIiIZo6jw+MDJERkhKTE5AQlAAAAAAAAAAAACAgIAAAAAAAEAAAACAhPZ2dTAARkFgAAAAAAADIlAAACAAAAe1vXyAwtM/8F+/8C/wT/BeG8UqlmBKAw7Huk8+LFrN/ry+Vh/VvrJq0P5mvhlNHz+lXre1Dx/yat0jmnfAKUUgVraxZ0sHcPEIMS7jOLSE1G/ery5vyUsN2L4MUqL+iz0YoxJglW6FJ2M4nN+EfL0QB6qFWzbM0EtbT4IKl/Fb7Wvgk5DMMwDMMw3KpOIsB2OHaDYBgwA+hVhaIWWmuFi/u/iwY4V9XI5zjq6+zKpUubGnH61SvrpbXWWmurFw9efTgBALX6M+jCUBQAn3x5EQDqj13+B1JCgLuFBgAA88pLuQiA/T57yVOjBWuaV/ZwgQZCFmYprjMTYXn/OR3XDstgybEFN0xDGA8oZFgfWSp66wOV7+hCAhZtoLaF6u1Iuf/eG6ZFo9DrEvv7dACv3D+6SWf/A4wytY/0tbfOZvL6defoYbdujSNtKH71OFZ7MHVWHkzYhW9iKyfX3Js4BdFW71kNV6A4z0tyNSZmr2xNMYrSPH6YxQEp9b2EfhQP9EteLvj/AKACYF+GwAN4yQBss8DSd1BVvtBaa62QAJh//LVJABAAEOy0bDIUAIAqKNud4ZICAM4e+Px7lgBAcdD61d2HBycAqLZara43vjkgpJBbFptet8bZHJ8aA4DND+Xj+dv0A4Bjq6CNoPhsRyhlTWCK/YW2SI0nC0yl96TEF0txsCBp1xLy2YIkVPBgf+alb601OF2y6LTa5AWSlqmVFezsp/nI6Lee9R/AenZPvCeu/d90AOv5OZ9Ho6NZvadN3OZ0J97DNmmv9a5KMNqeaBlb9ynIzBeDMY5R0aWUVZLVOCGEZXGOnbNPqEwAHnhVAZPwZNC/Zdscev0SQZL/HwAgAPBS1x6A+c35JlAqbNyGbWsyVoxRa621QgLA+pu6qQcAqSSqE//wGgAAAIxj5xdy50AAgIP/v/y/aQCgsr8v6CG2rTuwWilaZVdtmaBUCfpjr46/ExJukRGvjzoA7n6vjPamhSYAWX+t/gymEGH6+zWrYN374EuOfePKECBYHE1sCTrvhuuN6y0zHvtbWtPQ+NHsADv6ontZtIMMdNN1KCTRJTaqACWMpx6+o99c/jMArGf3xJsf7WmPi0MgwJ20NM1bD9SOpB7L7nnytpktznl5WtlbPLtq3RqHqKw7PEaN5EEwncyiWsX860y+Nx3uowDU5u/fb82X4/ujDzsDaf8AAO8mAPZrX8CtPrDe9pUlwBJgLC200FozEgD0f9/FAAAAgE5t3QuOCwC4yt9M/h8TBQC02ylHj22kIQBArBev7W09kOgK0Jrrrwz7I8vm/XFWV30qO6vdaJW+aq/qvTUBAICKL8r+49QxgCyqDxERJ9YEwNyXD1s0FCcGQMmzH7cgGaKfFqMWuiA6NTRJXYoqI+4r3CNNKp243fPDyazNTp/HmZq39O//12NZAijr+XnkiW80263/DbFdP+I97NY3HQAGHqZeyegmmq2c3Ij1/Kz5vcdxGJW1gipVuDU596rWzwq3KOzz6Is5y/IA/tYcviQBMN3/z8h4OLlXUiTmD+G/X6pAFQDgFgb41dgeuEvgNmxbgTsAQFWMoai0VthYi7EKF7wlNh/YfMf499sDALB9ZVYAAIDVA4/T6R+2KgDQxn+/unioOgDAKvz7z/DmUDIIAEySJX8HZVxWAGCcTh78Ov9A/qkEANDa7rdyAAAA5Xl/1VOLAWDxRGuV7rMEKJY4WJC0wXJOKe8X04Ui9ta4jjjrOEROyS1NmrWe/xrDl+zoC5LD53wHOdpUycdselI0svRYH87XNhlqNZFeCwDhfn52T3mPJ3bmINwcZ2p3/x5pmn8mcLmDH5jsLY/j19F+FkS4XxfPAwbPVKvfJQCeVbSNlmgcfqwziuqH3x0K7cGI3TbWgB2Avt0dA2BnvQDAvryZARxqgNUlJklMSCEIASGgwJONyt7dO5rfkhTNu3BlLyV1fuyiLZbA6s9/VySC4gBKGqPZmEigAAAAaLttqwe6AABYcfMmKijIGCwAAEDsf77e5hEAAD3LfDl/5CzTAQCA97PxK7nHBgCAdn3ZrXwRGwBAVJ37OmeA9ud5fygAANTf/Y3VJwBWmZrCAADy0589qcUA3FwXHHv7X55QBABwummT3S0AAD6fwsTvAbn8/PzsTgB2T6amZA9Ox0k=\n'
  234. coin_sound = 'T2dnUwACAAAAAAAAAACbKgAAAAAAAEgVfO8BHgF2b3JiaXMAAAAAAUSsAAAAAAAAAHcBAAAAAAC4AU9nZ1MAAAAAAAAAAAAAmyoAAAEAAABASoNPEC3//////////////////8kDdm9yYmlzHQAAAFhpcGguT3JnIGxpYlZvcmJpcyBJIDIwMDQwNjI5AAAAAAEFdm9yYmlzKUJDVgEACAAAADFMIMWA0JBVAAAQAABgJCkOk2ZJKaWUoSh5mJRISSmllMUwiZiUicUYY4wxxhhjjDHGGGOMIDRkFQAABACAKAmOo+ZJas45ZxgnjnKgOWlOOKcgB4pR4DkJwvUmY26mtKZrbs4pJQgNWQUAAAIAQEghhRRSSCGFFGKIIYYYYoghhxxyyCGnnHIKKqigggoyyCCDTDLppJNOOumoo4466ii00EILLbTSSkwx1VZjrr0GXXxzzjnnnHPOOeecc84JQkNWAQAgAAAEQgYZZBBCCCGFFFKIKaaYcgoyyIDQkFUAACAAgAAAAABHkRRJsRTLsRzN0SRP8ixREzXRM0VTVE1VVVVVdV1XdmXXdnXXdn1ZmIVbuH1ZuIVb2IVd94VhGIZhGIZhGIZh+H3f933f930gNGQVACABAKAjOZbjKaIiGqLiOaIDhIasAgBkAAAEACAJkiIpkqNJpmZqrmmbtmirtm3LsizLsgyEhqwCAAABAAQAAAAAAKBpmqZpmqZpmqZpmqZpmqZpmqZpmmZZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZQGjIKgBAAgBAx3Ecx3EkRVIkx3IsBwgNWQUAyAAACABAUizFcjRHczTHczzHczxHdETJlEzN9EwPCA1ZBQAAAgAIAAAAAABAMRzFcRzJ0SRPUi3TcjVXcz3Xc03XdV1XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVYHQkFUAAAQAACGdZpZqgAgzkGEgNGQVAIAAAAAYoQhDDAgNWQUAAAQAAIih5CCa0JrzzTkOmuWgqRSb08GJVJsnuamYm3POOeecbM4Z45xzzinKmcWgmdCac85JDJqloJnQmnPOeRKbB62p0ppzzhnnnA7GGWGcc85p0poHqdlYm3POWdCa5qi5FJtzzomUmye1uVSbc84555xzzjnnnHPOqV6czsE54Zxzzonam2u5CV2cc875ZJzuzQnhnHPOOeecc84555xzzglCQ1YBAEAAAARh2BjGnYIgfY4GYhQhpiGTHnSPDpOgMcgppB6NjkZKqYNQUhknpXSC0JBVAAAgAACEEFJIIYUUUkghhRRSSCGGGGKIIaeccgoqqKSSiirKKLPMMssss8wyy6zDzjrrsMMQQwwxtNJKLDXVVmONteaec645SGultdZaK6WUUkoppSA0ZBUAAAIAQCBkkEEGGYUUUkghhphyyimnoIIKCA1ZBQAAAgAIAAAA8CTPER3RER3RER3RER3RER3P8RxREiVREiXRMi1TMz1VVFVXdm1Zl3Xbt4Vd2HXf133f141fF4ZlWZZlWZZlWZZlWZZlWZZlCUJDVgEAIAAAAEIIIYQUUkghhZRijDHHnINOQgmB0JBVAAAgAIAAAAAAR3EUx5EcyZEkS7IkTdIszfI0T/M00RNFUTRNUxVd0RV10xZlUzZd0zVl01Vl1XZl2bZlW7d9WbZ93/d93/d93/d93/d939d1IDRkFQAgAQCgIzmSIimSIjmO40iSBISGrAIAZAAABACgKI7iOI4jSZIkWZImeZZniZqpmZ7pqaIKhIasAgAAAQAEAAAAAACgaIqnmIqniIrniI4oiZZpiZqquaJsyq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7rukBoyCoAQAIAQEdyJEdyJEVSJEVyJAcIDVkFAMgAAAgAwDEcQ1Ikx7IsTfM0T/M00RM90TM9VXRFFwgNWQUAAAIACAAAAAAAwJAMS7EczdEkUVIt1VI11VItVVQ9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV1TRN0zSB0JCVAAAZAAAjQQYZhBCKcpBCbj1YCDHmJAWhOQahxBiEpxAzDDkNInSQQSc9uJI5wwzz4FIoFURMg40lN44gDcKmXEnlOAhCQ1YEAFEAAIAxyDHEGHLOScmgRM4xCZ2UyDknpZPSSSktlhgzKSWmEmPjnKPSScmklBhLip2kEmOJrQAAgAAHAIAAC6HQkBUBQBQAAGIMUgophZRSzinmkFLKMeUcUko5p5xTzjkIHYTKMQadgxAppRxTzinHHITMQeWcg9BBKAAAIMABACDAQig0ZEUAECcA4HAkz5M0SxQlSxNFzxRl1xNN15U0zTQ1UVRVyxNV1VRV2xZNVbYlTRNNTfRUVRNFVRVV05ZNVbVtzzRl2VRV3RZV1bZl2xZ+V5Z13zNNWRZV1dZNVbV115Z9X9ZtXZg0zTQ1UVRVTRRV1VRV2zZV17Y1UXRVUVVlWVRVWXZlWfdVV9Z9SxRV1VNN2RVVVbZV2fVtVZZ94XRVXVdl2fdVWRZ+W9eF4fZ94RhV1dZN19V1VZZ9YdZlYbd13yhpmmlqoqiqmiiqqqmqtm2qrq1bouiqoqrKsmeqrqzKsq+rrmzrmiiqrqiqsiyqqiyrsqz7qizrtqiquq3KsrCbrqvrtu8LwyzrunCqrq6rsuz7qizruq3rxnHrujB8pinLpqvquqm6um7runHMtm0co6rqvirLwrDKsu/rui+0dSFRVXXdlF3jV2VZ921fd55b94WybTu/rfvKceu60vg5z28cubZtHLNuG7+t+8bzKz9hOI6lZ5q2baqqrZuqq+uybivDrOtCUVV9XZVl3zddWRdu3zeOW9eNoqrquirLvrDKsjHcxm8cuzAcXds2jlvXnbKtC31jyPcJz2vbxnH7OuP2daOvDAnHjwAAgAEHAIAAE8pAoSErAoA4AQAGIecUUxAqxSB0EFLqIKRUMQYhc05KxRyUUEpqIZTUKsYgVI5JyJyTEkpoKZTSUgehpVBKa6GU1lJrsabUYu0gpBZKaS2U0lpqqcbUWowRYxAy56RkzkkJpbQWSmktc05K56CkDkJKpaQUS0otVsxJyaCj0kFIqaQSU0mptVBKa6WkFktKMbYUW24x1hxKaS2kEltJKcYUU20txpojxiBkzknJnJMSSmktlNJa5ZiUDkJKmYOSSkqtlZJSzJyT0kFIqYOOSkkptpJKTKGU1kpKsYVSWmwx1pxSbDWU0lpJKcaSSmwtxlpbTLV1EFoLpbQWSmmttVZraq3GUEprJaUYS0qxtRZrbjHmGkppraQSW0mpxRZbji3GmlNrNabWam4x5hpbbT3WmnNKrdbUUo0txppjbb3VmnvvIKQWSmktlNJiai3G1mKtoZTWSiqxlZJabDHm2lqMOZTSYkmpxZJSjC3GmltsuaaWamwx5ppSi7Xm2nNsNfbUWqwtxppTS7XWWnOPufVWAADAgAMAQIAJZaDQkJUAQBQAAEGIUs5JaRByzDkqCULMOSepckxCKSlVzEEIJbXOOSkpxdY5CCWlFksqLcVWaykptRZrLQAAoMABACDABk2JxQEKDVkJAEQBACDGIMQYhAYZpRiD0BikFGMQIqUYc05KpRRjzknJGHMOQioZY85BKCmEUEoqKYUQSkklpQIAAAocAAACbNCUWByg0JAVAUAUAABgDGIMMYYgdFQyKhGETEonqYEQWgutddZSa6XFzFpqrbTYQAithdYySyXG1FpmrcSYWisAAOzAAQDswEIoNGQlAJAHAEAYoxRjzjlnEGLMOegcNAgx5hyEDirGnIMOQggVY85BCCGEzDkIIYQQQuYchBBCCKGDEEIIpZTSQQghhFJK6SCEEEIppXQQQgihlFIKAAAqcAAACLBRZHOCkaBCQ1YCAHkAAIAxSjkHoZRGKcYglJJSoxRjEEpJqXIMQikpxVY5B6GUlFrsIJTSWmw1dhBKaS3GWkNKrcVYa64hpdZirDXX1FqMteaaa0otxlprzbkAANwFBwCwAxtFNicYCSo0ZCUAkAcAgCCkFGOMMYYUYoox55xDCCnFmHPOKaYYc84555RijDnnnHOMMeecc845xphzzjnnHHPOOeecc44555xzzjnnnHPOOeecc84555xzzgkAACpwAAAIsFFkc4KRoEJDVgIAqQAAABFWYowxxhgbCDHGGGOMMUYSYowxxhhjbDHGGGOMMcaYYowxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGFtrrbXWWmuttdZaa6211lprrQBAvwoHAP8HG1ZHOCkaCyw0ZCUAEA4AABjDmHOOOQYdhIYp6KSEDkIIoUNKOSglhFBKKSlzTkpKpaSUWkqZc1JSKiWlllLqIKTUWkottdZaByWl1lJqrbXWOgiltNRaa6212EFIKaXWWostxlBKSq212GKMNYZSUmqtxdhirDGk0lJsLcYYY6yhlNZaazHGGGstKbXWYoy1xlprSam11mKLNdZaCwDgbnAAgEiwcYaVpLPC0eBCQ1YCACEBAARCjDnnnHMQQgghUoox56CDEEIIIURKMeYcdBBCCCGEjDHnoIMQQgghhJAx5hx0EEIIIYQQOucchBBCCKGEUkrnHHQQQgghlFBC6SCEEEIIoYRSSikdhBBCKKGEUkopJYQQQgmllFJKKaWEEEIIoYQSSimllBBCCKWUUkoppZQSQgghlFJKKaWUUkIIoZRQSimllFJKCCGEUkoppZRSSgkhhFBKKaWUUkopIYQSSimllFJKKaUAAIADBwCAACPoJKPKImw04cIDUGjISgCADAAAcdhq6ynWyCDFnISWS4SQchBiLhFSijlHsWVIGcUY1ZQxpRRTUmvonGKMUU+dY0oxw6yUVkookYLScqy1dswBAAAgCAAwECEzgUABFBjIAIADhAQpAKCwwNAxXAQE5BIyCgwKx4Rz0mkDABCEyAyRiFgMEhOqgaJiOgBYXGDIB4AMjY20iwvoMsAFXdx1IIQgBCGIxQEUkICDE2544g1PuMEJOkWlDgIAAAAAAAEAHgAAkg0gIiKaOY4Ojw+QEJERkhKTE5QAAAAAAOABgA8AgCQFiIiIZo6jw+MDJERkhKTE5AQlAAAAAAAAAAAACAgIAAAAAAAEAAAACAhPZ2dTAATpGgAAAAAAAJsqAAACAAAAzPigxhBJRP8JOj09PEBC89HOwKqC3IEL0WrXTamu7IMiWtAEJW6eJjWgT8TNYK4OcIoboADENcGV4txpW8cxF/jVLaprQiEsEAFYQrtJTgnAj02NaD2A8QprACxoAdSBS0il6y7b8eyDvlokpRUaVrVAP7BBC1dDXBO/Hpw/evwU+5Jf/dZ9R0u1jG3vLSaqxANUAoQf72XMOcp5GhYBmoYBkviFH4z3cj2VfrhHkWNV9M8J8YGtrAXAQk+w4aB/AH29WRygAxDCAgB4hAYg7g8kNUDg9ccCAEjwQQfgCchsa9kmBCP778epT/nnsc5NOzs5CYbFYjEMwxDJnJ1iVVXVmEwmIyCtXUhzNEYiQERRjHc6K1fl/nVjXFVxaz5DvABANWcIAGOBHhdBPCtNABBCCGEYxoh/M1v31r7PFGgAQBlMhjfHpQUAAAAAAB0MuAIgTVr2lQfmJqMCAAAA1DsF/DwLAfArQgCAdOmlVzABAGZmY4xpuj6YeB9pNTcuTg7blhIA9pdjAPAMBA9dezCBKNUCQAKZmdft/S9OgeJ4fEAAYD99CQAArG13wpJ/ONqM9PFzJ8oE4oYAqGQBJUw1QYnXUwY97BoUxyKyAoggDoaSAgj7L69TCoIHiPcnbcW2BKRtd4Oy1//t7poASxZQLcUNAwBGtPgKliOlRHBhY8zLeK2HHDhAwx/QFnHuFEgBt+0H6wIA9pQCe8nfnROcZXcIlf5wG6+aAHvFnHTbGjYTe3EDVwMUwZRtwsbuWFC6RTm4X74sFD+OAgAEJFYEAN9vjQGw6G0FmgUAnG13gjJXj3RyAixZCyqB1oAeOAsoYTukFAhkZtpau4q5GMKPFIeOqETjNnUAnqZsSAkAXfDhiWMGPhcAtGmvM+2IaUf1wNQNW6ckAQvsCGYLl4ir4+cjYuC46ZCpYdj7U51mMsRe/8Nxqb7+wr1R6M9/WIxCIb+ICXwbA5Rp/8Mxz8Q+RSgjdMh66FpAg5SXAgTX8+Hz8Vptt07fvN7aaj4xiRp9sNUb1YWWigDj5H5NwXIZjvuHIVj+8LGwBDrY3cjvt/D96kb+X2Df+DSSEpoB7AkAPpAE9nT9HgCAJBQIPHi/BABAEsAA+HcDAAB4waCnfgLgY/r0dKxfF15cupS9ojGm2Ww2qyulFJDM6FIBiDFODs++km0CsIYBHGI8P2uAC8BV5qftwaxSSikAAD4ZaAAAaFoDQAFcAQAAqLYKr726UqAAAACI/zYBAAAAAGhtfvbcmRjVAQCI77c04trX64qrqv6NyeaSkpJnL8UEDgKKZwB/NoAvAoAA4IkDAACAcnT0VG2ysx12rbUaIP8dANJhQhM02QA/AAAAnXWWABcAABBBCuDVSoMJqgHwAh6YHfi5C/jX3PH+2bjefmM28kAYJij2AAD3rUBoAChgA9gL8NwPQBIKBB78GwAAggECeycDAHKEBoArMQcU1G0UOLMFOO4AeAAAAKxz+QQAIAGgds0HQBLgRgC+BQAAgG3Z0AIAKMBPeQAlAOCKGQAAAAAAiHYAAMA/CpQDuNINAAAAAAAAAAAAkg9FAQAAgO8GAQAAexsAAKhaEB4MQBQAAAAAfAKAdAINts4G+DAAALChCmTIQoZbAAAAABH8bQYAAAAuAADISAg3jgJjAAIevlcd/H4I+Lc6uH8OvOfTmI38QhiApt8BABAaAEpo9gJcfzQQjDF4GwNBsAIMgHsnAABAkyUALugnUGCZrcDQHuB3FgBgvQYCABIAsgYeAAAAgAbVAgBAAT9lKrAAgH+wCAAA8NsBDABXAAoAAC4bAAAAAACAXxcAAAAAAACARDcGAAAA8N1BAADkLwCwAQDY/9SMAACSgPQrAH8FABEhoOXVEgAAAL8BgAa/AU22AFQLAAAQAQAAUAEG4AFAABkJXQAALB620OAZAAC8AwA+lxz4uQr4Z3Xs3yPXS7XDZPQLensAwH75kiTQafYC9CSBYIzB2wtPACAJIBjwey8AAEsCxxxQEAAEAABA9v0BAoAAq/9yAAAAkC/vxgAABPDvoIAoAChpjQAAAAC+BXAFcAUAAAC4+dQBAAAAAAAAAD9uBwAAAPy0hQaQAPwF8GcBAN8iAPBzJQAAeAGeBnATwCeA41UBAADwZQCgwStgCWyA3wAAABEAAKBQEBQZFu48BgAAQA2+eJ4FGACQoAHeBdzYr6uAX+6ElvBSvUvCzsPZEF+vfwBwK0kCq8PbYHlCKADeA14CAAJJgF/UAFQSEPoJjFGIsBSAhxT7n3bQAJoAP/NSFQAAP6QDAADA7eMKRAUA+7zQAQAAAAAAAOrdpgEAAAAAAICQ9yoAAAD45UNKA4wwfLX1LH/+hyFy1aVGmx+lZEAN8AU4Ay8QFJNFAACAfVUAqoCdALYlABOwQasFAAAP1IAbAN5lBO8/4heW45m4Jwd/O6vRJyGExlJzsAMBpI+AkHIgAAC8svv90P5GZlQAjGXx07vfdk1LrjLHeop8XHyv2TKfle7PLKuLtWbZfmnJsjgFqEx+cLV/5PMWv3vyWEkAeoHR8BUYd/HfXs1YADifDQAAANPtifjyy6ECAABUA4B9zQQ=\n'
  235. blip_sound = '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\n'
  236.  
  237.  
  238. def load_sound(string):
  239. sound_string = binascii.a2b_base64(string)
  240. f = StringIO(sound_string)
  241. sound = pygame.mixer.Sound(f)
  242. sound.set_volume(0.5)
  243. return sound
  244.  
  245. LEVELS = [level1, level2, level3, level4, level5]
  246. ONFULLSCREEN = 0
  247.  
  248. def imagetostring(filename):
  249. img = pygame.image.load(filename)
  250. new = ""
  251. for y in range(img.get_height()):
  252. for x in range(img.get_width()):
  253. pixel = img.get_at((x, y))
  254. if pixel == (0, 0, 0, 255):
  255. new += "+"
  256. elif pixel == (255, 255, 0, 255):
  257. new += "o"
  258. elif pixel == (255, 0, 0, 255):
  259. new += "P"
  260. elif pixel == (0, 0, 255, 255):
  261. new += "S"
  262. elif pixel == (0, 255, 0, 255):
  263. new += "G"
  264. else:
  265. new += "-"
  266. new += "\n"
  267. return new
  268.  
  269. def image(color, shape="block", pixelstring=None):
  270. img = pygame.Surface((16, 16))
  271. if shape == "block":
  272. img.fill(Color(color))
  273. if shape == "circle":
  274. pygame.draw.ellipse(img, Color(color), (1, 1, 14, 14))
  275. img.set_colorkey((0, 0, 0), RLEACCEL)
  276. if pixelstring:
  277. img.set_colorkey((0, 0, 0), RLEACCEL)
  278. x=0
  279. y=-1
  280. for line in pixelstring.split("\n"):
  281. for char in line:
  282. if char == "+":
  283. img.fill(Color(color), (x, y, 1, 1))
  284. x += 1
  285. y += 1
  286. x = 0
  287. return img
  288.  
  289. def speed_to_side(dx,dy):
  290. if abs(dx) > abs(dy): dy = 0
  291. else: dx = 0
  292. if dy < 0: return 0
  293. elif dx > 0: return 1
  294. elif dy > 0: return 2
  295. elif dx < 0: return 3
  296. else: return 0, 0
  297.  
  298. class Sprite(pygame.sprite.Sprite):
  299.  
  300. def __init__(self, img, pos):
  301. pygame.sprite.Sprite.__init__(self, self.containers)
  302. self.image = img
  303. self.rect = self.image.get_rect(topleft = pos)
  304. self.r = Rect(self.rect[0]*100, self.rect[1]*100, self.rect[2]*100, self.rect[3]*100)
  305. self.collision_groups = []
  306.  
  307. def set_pos(self, x, y):
  308. self.r.left = x*100
  309. self.r.top = y*100
  310.  
  311. def update_rect(self):
  312. self.rect.top = self.r.top/100
  313. self.rect.left = self.r.left/100
  314.  
  315. def add_collision_group(self, group):
  316. self.collision_groups.append(group)
  317.  
  318. def move(self, dx, dy, collide=True):
  319. if collide:
  320. if dx!=0:
  321. dx, dummy = self.__move(dx*100, 0)
  322. if dy!=0:
  323. dummy, dy = self.__move(0, dy*100)
  324. else:
  325. self.r.move_ip(dx*100, dy*100)
  326. return dx, dy
  327.  
  328. def __move(self, dx, dy):
  329. oldr = self.r
  330. self.r.move_ip(dx, dy)
  331. side = speed_to_side(dx, dy)
  332.  
  333. for group in self.collision_groups:
  334. for spr in group:
  335. if spr.r.colliderect(self.r):
  336. if side == 0:
  337. self.r.top = spr.r.bottom
  338. if side == 1:
  339. self.r.right = spr.r.left
  340. if side == 2:
  341. self.jumping = False
  342. self.jump_speed = 0
  343. self.r.bottom = spr.r.top
  344. if side == 3:
  345. self.r.left = spr.r.right
  346. return self.r.left-oldr.left,self.r.top-oldr.top
  347.  
  348.  
  349. class Player(Sprite):
  350.  
  351. def __init__(self, pos):
  352.  
  353. Sprite.__init__(self, image("#010101", pixelstring=player_anim0, shape=None), pos)
  354. self.images = [image("#010101", pixelstring=player_anim2, shape=None),
  355. image("#010101", pixelstring=player_anim1, shape=None),
  356. image("#010101", pixelstring=player_anim0, shape=None)]
  357. self.rightimgs = self.images
  358. self.leftimgs = []
  359. for i in self.images:
  360. self.leftimgs.append(pygame.transform.flip(i, 1, 0))
  361. self.jump_speed = 0
  362. self.fall_speed = 0.4
  363. self.jumping = False
  364.  
  365. self.speed = 0
  366. self.accel_speed = 0.25
  367. self.max_speed = 3.5
  368. self.facing = 1
  369. self.frame = 0
  370. self.keys = [K_SPACE, K_UP, K_z]
  371. self.jump_sound = load_sound(jump_sound)
  372.  
  373. def jump(self):
  374. if not self.jumping:
  375. self.jump_sound.play()
  376. self.jumping = True
  377. self.jump_speed = -6
  378.  
  379. def update(self):
  380. if self.jump_speed > 1:
  381. self.jumping = True
  382. moving = 0
  383. key = pygame.key.get_pressed()
  384. if self.rect.left < 0:
  385. self.set_pos(0, self.rect.top)
  386. if key[K_LEFT]:
  387. self.facing = -1
  388. moving = -1
  389. if self.speed > -self.max_speed:
  390. self.speed -= self.accel_speed
  391. elif key[K_RIGHT]:
  392. self.facing = 1
  393. moving = 1
  394. if self.speed < self.max_speed:
  395. self.speed += self.accel_speed
  396. else:
  397. if self.speed > 0:
  398. self.speed -= self.accel_speed
  399. if self.speed < 0:
  400. self.speed += self.accel_speed
  401. if self.jump_speed < 5:
  402. if key[self.keys[0]] or key[self.keys[1]] or key[self.keys[2]]:
  403. self.jump_speed += self.fall_speed
  404. else:
  405. self.jump_speed += self.fall_speed+0.3
  406. self.move(self.speed, self.jump_speed)
  407.  
  408. self.frame += 1
  409. if self.facing > 0:
  410. self.image = self.rightimgs[2]
  411. if self.facing < 0:
  412. self.image = self.leftimgs[2]
  413. if moving > 0:
  414. self.image = self.rightimgs[self.frame/4%2]
  415. if moving < 0:
  416. self.image = self.leftimgs[self.frame/4%2]
  417.  
  418. class Ghostie(Sprite):
  419.  
  420. def __init__(self, pos):
  421.  
  422. Sprite.__init__(self, image("#010101", shape=None, pixelstring=ghostie_img), pos)
  423.  
  424. self.leftimg = pygame.transform.flip(image("#010101", shape=None, pixelstring=ghostie_img), 1, 0)
  425. self.rightimg = image("#010101", shape=None, pixelstring=ghostie_img)
  426.  
  427. self.frame = 0
  428. self.speed = 1
  429. self.orgcenter = self.rect.centerx
  430. self.y = self.rect.centery
  431.  
  432. def update(self):
  433.  
  434. if self.speed > 0:
  435. self.image = self.rightimg
  436. if self.speed < 0:
  437. self.image = self.leftimg
  438.  
  439. self.move(self.speed, 0)
  440. self.frame += 1
  441.  
  442. if self.frame <= 12:
  443. self.move(0, 0.25)
  444. else:
  445. self.move(0, -0.25)
  446. self.rect.centery = self.y
  447. if self.frame >= 24:
  448. self.frame = 0
  449. if self.rect.right >= self.orgcenter + 50:
  450. self.speed = -1
  451. if self.rect.left <= self.orgcenter - 50:
  452. self.speed = 1
  453.  
  454. class Block(Sprite):
  455.  
  456. def __init__(self, pos):
  457. Sprite.__init__(self, image("#890000"), pos)
  458.  
  459. class Spikes(Sprite):
  460.  
  461. def __init__(self, pos):
  462. Sprite.__init__(self, image("#010101", shape=None, pixelstring=spikes_img), pos)
  463.  
  464. class Coin(Sprite):
  465.  
  466. def __init__(self, pos):
  467. Sprite.__init__(self, image("#ffff00", "circle"), pos)
  468. self.images = [image("#ffff00", "circle"),
  469. image("#f4f400", "circle"),
  470. image("#e9e900", "circle"),
  471. image("#f4f400", "circle")]
  472. self.frame = 0
  473. self.alpha = 255
  474. self.dead = False
  475. self.coin_sound = load_sound(coin_sound)
  476. def kill(self):
  477. self.dead = True
  478. def update(self):
  479. self.frame += 1
  480. self.image = self.images[self.frame/4%4]
  481. if self.dead:
  482. self.alpha -= 75
  483. if self.alpha <= 0:
  484. self.coin_sound.play()
  485. pygame.sprite.Sprite.kill(self)
  486. self.image.set_alpha(self.alpha)
  487.  
  488. class Camera(object):
  489.  
  490. def __init__(self, screen, sprite_to_center_on, world_size):
  491. self.sprite = sprite_to_center_on
  492. self.rect = screen.get_rect()
  493. self.world_rect = Rect(0, 0, world_size[0], world_size[1])
  494.  
  495. def update(self):
  496. if self.sprite.rect.centerx > self.rect.centerx + 25:
  497. self.rect.centerx = self.sprite.rect.centerx - 25
  498. if self.sprite.rect.centerx < self.rect.centerx - 25:
  499. self.rect.centerx = self.sprite.rect.centerx + 25
  500. if self.sprite.rect.centery > self.rect.centery + 25:
  501. self.rect.centery = self.sprite.rect.centery - 25
  502. if self.sprite.rect.centery < self.rect.centery - 25:
  503. self.rect.centery = self.sprite.rect.centery + 25
  504. self.rect.clamp_ip(self.world_rect)
  505.  
  506. def draw_group(self, surface, group):
  507. for sprite in group.sprites():
  508. if sprite.rect.left <= self.rect.right and sprite.rect.right >= self.rect.left:
  509. if sprite.rect.top <= self.rect.bottom and sprite.rect.bottom >= self.rect.top:
  510. surface.blit(sprite.image, self.sprite_rect(sprite))
  511.  
  512. def update_group(self, group):
  513. for sprite in group.sprites():
  514. if sprite.rect.left <= self.rect.right and sprite.rect.right >= self.rect.left:
  515. if sprite.rect.top <= self.rect.bottom and sprite.rect.bottom >= self.rect.top:
  516. sprite.update()
  517. sprite.update_rect()
  518.  
  519. def sprite_rect(self, actor):
  520. return pygame.Rect(actor.rect.x - self.rect.x, actor.rect.y - self.rect.y, actor.rect.w, actor.rect.h)
  521.  
  522. class Level:
  523.  
  524. def __init__(self, level=level1):
  525. self.level = level
  526. self.x = 0
  527. self.y = -16
  528. for line in self.level.split("\n"):
  529. for char in line:
  530. if char == "+":
  531. Block((self.x, self.y))
  532. if char == "P":
  533. self.player = Player((self.x, self.y))
  534. if char == "o":
  535. Coin((self.x, self.y))
  536. if char == "S":
  537. Spikes((self.x, self.y))
  538. if char == "G":
  539. Ghostie((self.x, self.y))
  540. self.x += 16
  541. self.y += 16
  542. self.x = 0
  543.  
  544. def get_size(self):
  545. lines = self.level.split("\n")
  546. line = lines[1]
  547. width = (len(line))*16
  548. height = (len(lines)-2)*16
  549. return [width, height]
  550.  
  551. def next_level(levelnum):
  552. try:
  553. levelnum += 1
  554. lvl = LEVELS[levelnum-1]
  555. except:
  556. return None
  557. level = Level(lvl)
  558. return level, levelnum
  559.  
  560.  
  561. def Menu(screen):
  562.  
  563. screen = screen
  564. font = pygame.font.SysFont("courier", 32, bold=True)
  565. font2 = pygame.font.SysFont("courier", 20, bold=True)
  566. font3 = pygame.font.SysFont("courier", 12, bold=True)
  567.  
  568. player = image("#010101", shape=None, pixelstring=player_anim0)
  569. player = pygame.transform.scale(player, [player.get_width()*6, player.get_height()*6])
  570. cursor = image("#010101", shape="circle")
  571. cursorpos = 150
  572. option = 1
  573. sound = load_sound(blip_sound)
  574. clock = pygame.time.Clock()
  575. global ONFULLSCREEN
  576.  
  577. while 1:
  578.  
  579. clock.tick(30)
  580. for e in pygame.event.get():
  581. if e.type == QUIT:
  582. pygame.quit()
  583. sys.exit()
  584. if e.type == KEYDOWN:
  585. if e.key == K_ESCAPE:
  586. pygame.quit()
  587. sys.exit()
  588. if e.key == K_DOWN:
  589. sound.play()
  590. option = 2
  591. if e.key == K_UP:
  592. sound.play()
  593. option = 1
  594. if e.key == K_RETURN:
  595. sound.play()
  596. if option == 1:
  597. Intro(screen)
  598. game = Game(screen)
  599. game.main_loop()
  600. if option == 2:
  601. pygame.quit()
  602. return
  603. if e.key == K_f:
  604. ONFULLSCREEN ^= 1
  605. if ONFULLSCREEN:
  606. pygame.display.set_mode((320, 240), FULLSCREEN)
  607. else:
  608. pygame.display.set_mode((320, 240))
  609.  
  610. if option == 1:
  611. cursorpos = 150
  612. else:
  613. cursorpos = 170
  614.  
  615. screen.fill(Color("#c1c1c1"))
  616. pygame.draw.rect(screen, Color("#890000"), (55, 25, 210, 45), 5)
  617. pygame.draw.rect(screen, Color("#890000"), (0, 227, 320, 32))
  618. ren = font.render("Pixelman 3", 1, Color("#000000"))
  619. screen.blit(ren, (161-ren.get_width()/2, 31))
  620. ren = font.render("Pixelman 3", 1, Color("#ffffff"))
  621. screen.blit(ren, (160-ren.get_width()/2, 30))
  622.  
  623. ren = font3.render("Copyright (C) 2008", 1, Color("#000000"))
  624. screen.blit(ren, (160-ren.get_width()/2, 85))
  625. ren = font3.render("Created by PyMike for LD XI", 1, Color("#000000"))
  626. screen.blit(ren, (160-ren.get_width()/2, 100))
  627.  
  628. ren = font2.render("New Game", 1, Color("#000000"))
  629. screen.blit(ren, (140, 145))
  630. ren = font2.render("Quit Game", 1, Color("#000000"))
  631. screen.blit(ren, (140, 165))
  632. screen.blit(player, (10, 132))
  633. screen.blit(cursor, (120, cursorpos))
  634. pygame.display.flip()
  635.  
  636.  
  637. def Intro(screen):
  638.  
  639. screen = screen
  640. font = pygame.font.SysFont("courier", 32, bold=True)
  641. font2 = pygame.font.SysFont("courier", 16, bold=True)
  642. font3 = pygame.font.SysFont("courier", 12, bold=True)
  643.  
  644. player = image("#010101", shape=None, pixelstring=player_anim0)
  645. player = pygame.transform.scale(player, [player.get_width()*6, player.get_height()*6])
  646. cursor = image("#010101", shape="circle")
  647. option = 1
  648. sound = load_sound(blip_sound)
  649. clock = pygame.time.Clock()
  650. ypos = 240
  651. global ONFULLSCREEN
  652. text = ["Oh noes! Pixelman is not",
  653. "drawing pixels fast enough!",
  654. "Help Pixelman speed through",
  655. "the levels before his owner",
  656. "discards the computer monitor",
  657. "for being a minimalist!"]
  658.  
  659. while 1:
  660.  
  661. clock.tick(60)
  662. for e in pygame.event.get():
  663. if e.type == QUIT:
  664. pygame.quit()
  665. sys.exit()
  666. if e.type == KEYDOWN:
  667. if e.key == K_ESCAPE:
  668. return
  669. if e.key == K_RETURN:
  670. sound.play()
  671. return
  672. if e.key == K_f:
  673. ONFULLSCREEN ^= 1
  674. if ONFULLSCREEN:
  675. pygame.display.set_mode((320, 240), FULLSCREEN)
  676. else:
  677. pygame.display.set_mode((320, 240))
  678.  
  679. screen.fill(Color("#c1c1c1"))
  680. ren = font.render("Prologue", 1, Color("#000000"))
  681. screen.blit(ren, (160-ren.get_width()/2, 20))
  682. ypos = 75
  683. for line in text:
  684. ren = font2.render(line, 1, (0, 0, 0))
  685. screen.blit(ren, (160-ren.get_width()/2, ypos))
  686. ypos += font2.get_height()
  687. ren = font3.render("Press Enter To Start", 1, Color("#000000"))
  688. screen.blit(ren, (160-ren.get_width()/2, 210))
  689. pygame.display.flip()
  690.  
  691. def Outro(screen, final_score=0):
  692.  
  693. screen = screen
  694. font = pygame.font.SysFont("courier", 32, bold=True)
  695. font2 = pygame.font.SysFont("courier", 16, bold=True)
  696. font3 = pygame.font.SysFont("courier", 12, bold=True)
  697.  
  698. player = image("#010101", shape=None, pixelstring=player_anim0)
  699. player = pygame.transform.scale(player, [player.get_width()*6, player.get_height()*6])
  700. cursor = image("#010101", shape="circle")
  701. option = 1
  702. sound = load_sound(blip_sound)
  703. clock = pygame.time.Clock()
  704. ypos = 240
  705. global ONFULLSCREEN
  706. text = ["Hurray! You saved Pixelman",
  707. "from being scrapped!",
  708. "Nice work!",
  709. "",
  710. "Final Score:",
  711. "%09d" % final_score]
  712.  
  713. while 1:
  714.  
  715. clock.tick(60)
  716. for e in pygame.event.get():
  717. if e.type == QUIT:
  718. pygame.quit()
  719. sys.exit()
  720. if e.type == KEYDOWN:
  721. if e.key == K_ESCAPE:
  722. return
  723. if e.key == K_RETURN:
  724. sound.play()
  725. return
  726. if e.key == K_f:
  727. ONFULLSCREEN ^= 1
  728. if ONFULLSCREEN:
  729. pygame.display.set_mode((320, 240), FULLSCREEN)
  730. else:
  731. pygame.display.set_mode((320, 240))
  732.  
  733. screen.fill(Color("#c1c1c1"))
  734. ren = font.render("You won!", 1, Color("#000000"))
  735. screen.blit(ren, (160-ren.get_width()/2, 20))
  736. ypos = 75
  737. for line in text:
  738. ren = font2.render(line, 1, (0, 0, 0))
  739. screen.blit(ren, (160-ren.get_width()/2, ypos))
  740. ypos += font2.get_height()
  741. ren = font3.render("Press Enter to Exit to Title Screen", 1, Color("#000000"))
  742. screen.blit(ren, (160-ren.get_width()/2, 210))
  743. pygame.display.flip()
  744.  
  745.  
  746. class Game:
  747.  
  748. def __init__(self, screen):
  749.  
  750. self.screen = screen
  751. self.all = pygame.sprite.RenderUpdates()
  752. self.blocks = pygame.sprite.Group()
  753. self.coins = pygame.sprite.Group()
  754. self.spikes = pygame.sprite.Group()
  755. self.ghosties = pygame.sprite.Group()
  756.  
  757. Player.containers = self.all
  758. Block.containers = self.all, self.blocks
  759. Coin.containers = self.all, self.coins
  760. Spikes.containers = self.all, self.spikes
  761. Ghostie.containers = self.all, self.ghosties
  762.  
  763. self.clock = pygame.time.Clock()
  764. self.level = Level()
  765. self.player = self.level.player
  766. self.player.add_collision_group(self.blocks)
  767. self.camera = Camera(self.screen, self.player, self.level.get_size())
  768. self.lvl = 1
  769. self.font = pygame.font.SysFont("courier", 12, bold=True)
  770. self.font2 = pygame.font.SysFont("courier", 32, bold=True)
  771. self.score = 0
  772. self.lives = 5
  773. self.done = False
  774. self.coin_sound = load_sound(coin_sound)
  775. self.highscore = 0
  776. self.paused = False
  777. self.time = 0
  778. self.final_score = 0
  779.  
  780. def draw(self):
  781. self.screen.fill(Color("#c1c1c1"))
  782. self.camera.draw_group(self.screen, self.all)
  783. ren1 = self.font.render("FPS: %d/60" % self.clock.get_fps(), 1, Color("#000000"))
  784. ren2 = self.font.render("FPS: %d/60" % self.clock.get_fps(), 1, Color("#ffffff"))
  785. self.screen.blit(ren1, (6, 221))
  786. self.screen.blit(ren2, (5, 220))
  787. ren1 = self.font.render("Score: %d" % self.score, 1, Color("#000000"))
  788. ren2 = self.font.render("Score: %d" % self.score, 1, Color("#ffffff"))
  789. self.screen.blit(ren1, (11, 6))
  790. self.screen.blit(ren2, (10, 5))
  791. ren1 = self.font.render("Level: %d" % self.lvl, 1, Color("#000000"))
  792. ren2 = self.font.render("Level: %d" % self.lvl, 1, Color("#ffffff"))
  793. self.screen.blit(ren1, (246, 6))
  794. self.screen.blit(ren2, (245, 5))
  795. ren1 = self.font.render("Lives x%d" % self.lives, 1, Color("#000000"))
  796. ren2 = self.font.render("Lives x%d" % self.lives, 1, Color("#ffffff"))
  797. self.screen.blit(ren1, (131, 6))
  798. self.screen.blit(ren2, (130, 5))
  799. ren1 = self.font.render("Time: %d" % self.time, 1, Color("#000000"))
  800. ren2 = self.font.render("Time: %d" % self.time, 1, Color("#ffffff"))
  801. self.screen.blit(ren1, (11, 21))
  802. self.screen.blit(ren2, (10, 20))
  803. self.final_score = (self.score - int(self.time))*self.lives
  804. if self.lives <= 0 and not self.player.alive() and not self.done:
  805. ren1 = self.font2.render("Game Over!", 1, Color("#000000"))
  806. ren2 = self.font2.render("Game Over!", 1, Color("#ffffff"))
  807. self.screen.blit(ren1, (160-ren1.get_width()/2 + 2, 120-ren1.get_height()/2 + 2))
  808. self.screen.blit(ren2, (160-ren2.get_width()/2, 120-ren2.get_height()/2))
  809.  
  810. def hit_screen(self):
  811. self.draw()
  812. ren1 = self.font2.render("You Crashed!", 1, Color("#000000"))
  813. ren2 = self.font2.render("You Crashed!", 1, Color("#ffffff"))
  814. self.screen.blit(ren1, (160-ren1.get_width()/2 + 2, 120-ren1.get_height()/2 + 2))
  815. self.screen.blit(ren2, (160-ren2.get_width()/2, 120-ren2.get_height()/2))
  816. pygame.display.flip()
  817. pygame.time.wait(1000)
  818.  
  819. def main_loop(self):
  820.  
  821. global ONFULLSCREEN
  822. while 1:
  823.  
  824. self.clock.tick(60)
  825. if self.player.alive():
  826. self.time += 0.015
  827. for e in pygame.event.get():
  828. if e.type == QUIT:
  829. pygame.quit()
  830. sys.exit()
  831. if e.type == KEYDOWN:
  832. if e.key == K_ESCAPE:
  833. return
  834. if e.key in self.player.keys:
  835. self.player.jump()
  836. if e.key == K_1:
  837. self.lvl = 0
  838. self.next_level()
  839. if e.key == K_2:
  840. self.lvl = 1
  841. self.next_level()
  842. if e.key == K_3:
  843. self.lvl = 2
  844. self.next_level()
  845. if e.key == K_4:
  846. self.lvl = 3
  847. self.next_level()
  848. if e.key == K_5:
  849. self.lvl = 4
  850. self.next_level()
  851. if e.key == K_p:
  852. self.paused ^= 1
  853. if e.key == K_f:
  854. ONFULLSCREEN ^= 1
  855. if ONFULLSCREEN:
  856. pygame.display.set_mode((320, 240), FULLSCREEN)
  857. else:
  858. pygame.display.set_mode((320, 240))
  859. pygame.time.wait(1500)
  860. while self.paused:
  861. self.clock.tick(20)
  862. for e in pygame.event.get():
  863. if e.type == QUIT:
  864. pygame.quit()
  865. return
  866. if e.type == KEYDOWN:
  867. if e.key == K_ESCAPE:
  868. return
  869. if e.key == K_p:
  870. self.paused ^= 1
  871.  
  872. for sprite in self.all.sprites():
  873. if isinstance(sprite, Coin):
  874. sprite.update()
  875. if sprite.rect.left <= self.camera.rect.right and sprite.rect.right >= self.camera.rect.left:
  876. if sprite.rect.top <= self.camera.rect.bottom and sprite.rect.bottom >= self.camera.rect.top:
  877. if not isinstance(sprite, Coin):
  878. sprite.update()
  879. sprite.update_rect()
  880. if isinstance(sprite, Coin):
  881. if self.player.rect.colliderect(sprite.rect) and not sprite.dead:
  882. sprite.kill()
  883. self.score += 25
  884. if isinstance(sprite, Spikes):
  885. if self.player.rect.colliderect(sprite.rect):
  886. self.player.kill()
  887. if isinstance(sprite, Ghostie):
  888. if self.player.rect.colliderect(sprite.rect):
  889. self.player.kill()
  890.  
  891. if self.score > self.highscore:
  892. self.highscore = self.score
  893. if not self.player.alive() and self.lives > 0 and not self.done:
  894. self.hit_screen()
  895. self.score = 0
  896. self.lvl -= 1
  897. self.lives -= 1
  898. self.next_level()
  899. if self.player.rect.right >= self.level.get_size()[0] and not self.done:
  900. self.player.kill()
  901. self.next_level()
  902. if self.player.rect.top >= self.level.get_size()[1]:
  903. self.player.kill()
  904. if self.done:
  905. Outro(self.screen, self.final_score)
  906. return
  907. self.camera.update()
  908. self.draw()
  909. pygame.display.flip()
  910.  
  911. def next_level(self):
  912. lvl = next_level(self.lvl)
  913. if lvl == None:
  914. self.done = True
  915. else:
  916. self.clear_sprites()
  917. self.level, self.lvl = next_level(self.lvl)
  918. self.player = self.level.player
  919. self.player.add_collision_group(self.blocks)
  920. self.camera = Camera(self.screen, self.player, self.level.get_size())
  921.  
  922. def clear_sprites(self):
  923. for sprite in self.all.sprites():
  924. pygame.sprite.Sprite.kill(sprite)
  925.  
  926. def main():
  927. if sys.platform in ("win32", "win64"):
  928. os.environ["SDL_VIDEO_CENTERED"] = "1"
  929. pygame.init()
  930. pygame.display.set_caption("Pixelman 3 - PyMike LD48")
  931. pygame.mouse.set_visible(0)
  932. screen = pygame.display.set_mode((320, 240))
  933. Menu(screen)
  934.  
  935. if __name__ == "__main__":
  936. main()

thanks ahead of time.
Reply With Quote Quick reply to this message  
Reply

This thread is more than three months old.
Perhaps start a new thread instead?
Message:



Similar Threads
Other Threads in the Python Forum


Views: 302 | Replies: 0
Thread Tools Search this Thread



Tag cloud for Python
About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2010 DaniWeb® LLC