HOMEBREW SUBMISSION/VOTING THREAD

Which is your favourite?


  • Total voters
    49

richiz

Member
Joined
Jan 4, 2011
Messages
338
Please submit your revised finished games here. For easy to follow clarity I will update the first post in this thread (this one) with a list below so you won't have to read the entire thread to see the games, they'll be in this first post


Homebrew Games



BZars submission - Wars Commando


Double tap right or left to run ;)


http://repo.openpandora.org/?page=detail&app=bzar-wars-commando-package-00001

https://www.youtube.com/embed/WXePVHkp7Ck?feature=oembed
tbOgT.jpg


QuantenMagier submission - Unready


lol I loaded this and its essentially a terminal game. This doesnt really fit into the contest in the strictest sense....However Ill leave it in as Im confident in wont get many votes in comparison to the other games.


http://homepages.uni-paderborn.de/neuron/pandora/unready_fs.pnd

uoueL.png


Foxblocks Submission - Greyout


http://foxblock.pirategames.co.uk/games/greyout/Greyout.pnd

AbyxA.png


RichiZ's submission - Robo Hell


PND OF ROBO HELL IS NOW WORKING!!!


http://repo.openpandora.org/?page=detail&app=robo-hell

http://www.youtube.com/watch?v=d0V4aPSj8L4


Baically it's laggy as hell(on the pandora), the graphics are shite, I didn't take the time to resize it correctly, the camera is shocking but hey at least I did something :)


Esc - exit game


F - Full Screen


1,2,3 - Takes you to that level


Space - Jump


D-pad - move


(Y) -


(A) ( B ) -


}


(X) - Jump


NOTE:Press F to go full screen, numbers 1-5 take you to each level (try not to use too much!) and ESC is quit.


Competition


I decided to create this competition to fire up some guys on here to see what could be produced. Never hosted a competition before so there were a few stumbling blocks at the beginning. I never even intended to enter the competition but I did have a very primitive knowledge of Pygame. I stuck my head in the books and got to grips with a lot of the functions in PyGame. The dry run for my second game was Robo Hell. I had intended to write a second game and Robo Hell had been planned as a test run.


However, sadly, the framerate return on Robo Hell was appalling. Looking into it it was to do with the programming language I was using (PyGame). I meant to switch to C++ and SDL however I soon realised with C++ I would not have anything ready for the deadline. :(


I hope you enjoyed the competition anyway, and hope you like Robo Hell despite it's many flaws.


Thank you very much to all those that participated, I will try and PND up my Robo Hell game tonight but I unfortunately was getting 4fps due to PyGame not being optimised. Maybe once/if PyGame ever gets optimised it'll be a game worth playing :)


Either way I don't expect too many votes :p


Voting rules


Just done a public poll so they can be coutned up automatically
 
Last edited by a moderator:
I dl'd it off the archive the other day and I couldn't get past the title screen. The one he was hosting worked however. As I don't want to link a file that BZar may consider isn't his final submission I'll wait for him to provide a link :p
 
Yes, I'll post a link to the final version tomorrow. Today I'm still going through some details ;)


EDIT: richiz, that was a window focus bug, which is now fixed in the current development version. Tap the screen to give the window focus.
 
Last edited by a moderator:
Can you give me a summary of the three threads you have running, which one(s) you want to keep using etc. I'd like to get it down to one thread if possible, close any redundant ones with your permission, and pin this one. :)
 
The other thread is for donating (stickied one) Please lock that so no one else tries to donate.


The other one is just a discussion thread. This one is just for devs to submit their games and users to vote for games.
 
Wars: Commando


Description


A platformer/shooter inspired by Contra, Metal Slug and in part Mega Man. Jump into the boots of a lone infantry soldier and blast your way through enemy lines to save your comrades from a looming defeat. Jump, run and fire your way through eight levels and five terrains, encounter a barrage of bullets, rockets, grenades, tank shells, automatic turrents and the eternal favorite of all platformer games: spikes! Take your enemies' weapons and turn them against them to defeat even the largest of tanks, the terror of the ground: the Heavy Tank. Be the hero your country needs! Be the Commando.


Other info


There will be builds for other platforms (linux 32/64, windows, maemo) as well as full source code release. as soon as I find a good place to host them. I really rather wouldn't host 20MiB files on my home ADSL 10/2Mbps connection. Anyone willing to share their bandwidth and host these files, give me a PM. I'm setting up a Google Code project where the source and builds will be hosted. My internet connection can't take the heat.


Update:


The Windows build runs at about half speed. I have no idea why, maybe Qt graphicsview is just slow on windows. I'll try to get it faster, but I'd rather not release a badly working version.


The Maemo build will be delayed a bit, because it requires some mucking around with debian packaging stuff.


Update 2:


More info on the discussion thread


Update 3:


Google Code project hosts builds for Linux (32 and 64 bit) and Windows. Source also available.
 
Last edited by a moderator:
If this thread's for voting, why couldn't it be done as a poll? You can change, add, and remove options. You can also allow people to change their vote.
 
If this thread's for voting, why couldn't it be done as a poll? You can change, add, and remove options. You can also allow people to change their vote.

This post and Blue Protoman's post should be moved to the discussion thread. Let's not litter this one.


A poll doesn't make it possible to rank submissions, only select 0-1/0-n. Also there's a possibility the number of submissions is bigger than the allowed poll size.
 
I am not able to say so much about my competition entry like B-ZaR.


Most of you read about my game different times in another thread.


I will release versions for the gp2x, WIZ, Caanoo, Dingoo and x86 Linux this night or tomorrow.


In #openpandora (freenode) one person tells about a bug, that crashes the game.


If the game crashes on your pandora, it would be nice, if you could send my a PN with the pndrun-output, thank you.


Dont use this thread for bugreports!


My game: http://ziz.delphigl.com/data/snowman.pnd


greetings, Ziz
 
For voting, I can recommend http://modernballots.com/


It doesn't just let you pick your favourite, but lets you rank them, so even if your favourite is not the clear winner, your second and third favourites might get a boost and come out ahead. The website explains it pretty well.


It also ends with a ranking chart, including comparisons between different entries (60% of people preferred A over B, but only 30% preferred A over C, etc...)
 
This would've been my submission. Robo hell.


However I got bogged down with work/planning move to toronto in June/*insert other excuses for being a work shy bastard*


Anyway it was a Pygame but on the bigger levels I was getting 4fps so it seemed pointless to PND it. However I'll put it here for educational purposes. To run it copy and paste into a text file and then rename it with a .py extension and should just click on it (provided you've got pygame installed)


I thought some people may find it interesting with what can be done with 53kbs of text :)


Copy the below code and paste into a .py extension


it's not really worth running on your pandora so run it on your pc

Code:
# shit pygame by RichiZ

#Open Pandora Competition 2011


import pygame, sys, os

from pygame.locals import *


import binascii

from cStringIO import StringIO


level1 = """

++++++++++++++++++++++++++++++++++++++++

+++++++---------------------------------

+++++-----------------------------------

--------------------------------------++

-----00---------G-----------------++++++

P----00-----------------------+-----++++

---------------G----------------------++

++---SS-------------------G-------+----+

+++--SS--------------------------oo----+

+++++SS--------------------------oo--+++

++++++++--------------------------+--+-+

++++++++-------G---------G---+--------++

+++++++++---+---------+------+-------+++

++++++++++------------+--oo--++++----+++

+++++++++++++++++++----------++++SSSS+++

"""


level2 = """

++++++++++++++++++++++++++++++++++++++++++++++++

--------------------------++++++++++++++++++++++

-------oo------------------+++++++++--+++++--+++

-------ooo------------------+++++-+++++++++++-++

----ooooooo-G------------------+++-----------+++

P------ooo-----------oo----------+++++++++++++++

+++----oo---------------------------------------

-------------------------+++--------------------

-----------------++-----------------------------

-----------------++--------------G---------+++++

------------++----------------------------------

--------++++++------------------------++++------

--------++++-----------------------++++++-------

------------------------------------------------

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

"""


level3 = """

++++++++++++++++++++++++++++++++++++++++++++++++

+++-++++++++++++++++++++++++++++++++++++++++++++

++---++++++++++++++++++++++++++++++----+++++++++

+--------++------+++++++++++++++----------++++++

--oooooo------+++++++++++++++------------------+

--++++++------++++++++-------------------------+

-------++--oooo-+++++---------------G----------+

+---G--+++--oo----------------G----------------+

---------+-----------+-------------------------+

++--------+------------G---------+++++++++----++

--------++-------ooo+-----------+-------------++

G-+-----+--------ooo--------+-------------G---++

G-+++----+---G---+++SSSSSoooSSSooo-----------++

--++++---o+++++++++++++++++++++--------++++++--

--G------+------------------------------+++---++

------o++oo----------+++-----------+++++-------+

+o---G--+oo--++++SSSSSSSSS+++++++++--------G----

+o--o+++-oo---oo-+++++++++----------------------

+o------------ooG--oooo---------G---------oooo

+o-++-SSSSSS+-----------G------------G----++----

+P---SSSSSSS+---------------------------+---++-

++--SSSSSSSS+----+---+-----------+---+--------+-

+++SSSSSSSSS++-------------G-------------------+

+++++++++++++++SSSSSSSSSS++++++SSSSSSSSSSSSSSSS+

++++++++++++++++++++++++++++++++++++++++++++++++

"""


level4 = """


"""


level5 = """


"""

player_anim0 = """

----------------

--------+++++---

------++++++++--

-----++++++-++--

------++++++++--

------+++++-----

----++++++++----

---++++++++-+---

--+--++++++-----

++--++++--+++---

-+--++++--++++--

----++++--++++--

----++++--++++--

---++++---+++---

---++-----++----

--+++++--+++++--

"""

player_anim1 = """

----------------

---------+++++--

--------+++++++-

-------+++++-++-

-------++++++++-

--------+++++---

-----+++++++----

--+++++++++-+---

+++--+++++++----

-----++++-++----

-----++++++++---

------+++-+++---

-----+++-++++---

-----++++-------

----+++---------

--++------------

"""

player_anim2 = """

----------------

---------++++++-

--------++++++++

-------++++++-++

-------+++++++++

--------++++++--

-----+++++++----

--+++++++++-+---

+++--+++++++----

-----++++-++----

-----++++++++---

------+++-+++---

----+++++++++---

---+++++++------

+++++-----------

----------------

"""

spikes_img = """

+-------+------+

-+------+-----+-

--+-----+----+--

---++--+++--++--

-----+++++++----

-----++++++-----

------+++++-----

------++++------

------++++------

------++++------

------++++------

----+++++++-----

---+++++++++----

-++++++++++++---

-++++++++++++++-

++++++++++++++++

"""


robo_img = """

--++++++++++++--

--++++++++++++--

--++++++++++++--

--+++++++++++--

--------+-------

--------+-------

++-----+-+------

++++---+++----++

++++++++++++++++

++++---+++------

+++----+++------

+------+++++++++

-------+++---+-+

-------+++------

"""


jump_sound = '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\n'

coin_sound = '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\n'

blip_sound = 'T2dnUwACAAAAAAAAAABDcAAAAAAAALks78QBHgF2b3JiaXMAAAAAAUSsAAAAAAAAAHcBAAAAAAC4AU9nZ1MAAAAAAAAAAAAAQ3AAAAEAAABHvszbEC3//////////////////8kDdm9yYmlzHQAAAFhpcGguT3JnIGxpYlZvcmJpcyBJIDIwMDQwNjI5AAAAAAEFdm9yYmlzKUJDVgEACAAAADFMIMWA0JBVAAAQAABgJCkOk2ZJKaWUoSh5mJRISSmllMUwiZiUicUYY4wxxhhjjDHGGGOMIDRkFQAABACAKAmOo+ZJas45ZxgnjnKgOWlOOKcgB4pR4DkJwvUmY26mtKZrbs4pJQgNWQUAAAIAQEghhRRSSCGFFGKIIYYYYoghhxxyyCGnnHIKKqigggoyyCCDTDLppJNOOumoo4466ii00EILLbTSSkwx1VZjrr0GXXxzzjnnnHPOOeecc84JQkNWAQAgAAAEQgYZZBBCCCGFFFKIKaaYcgoyyIDQkFUAACAAgAAAAABHkRRJsRTLsRzN0SRP8ixREzXRM0VTVE1VVVVVdV1XdmXXdnXXdn1ZmIVbuH1ZuIVb2IVd94VhGIZhGIZhGIZh+H3f933f930gNGQVACABAKAjOZbjKaIiGqLiOaIDhIasAgBkAAAEACAJkiIpkqNJpmZqrmmbtmirtm3LsizLsgyEhqwCAAABAAQAAAAAAKBpmqZpmqZpmqZpmqZpmqZpmqZpmmZZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZlmVZQGjIKgBAAgBAx3Ecx3EkRVIkx3IsBwgNWQUAyAAACABAUizFcjRHczTHczzHczxHdETJlEzN9EwPCA1ZBQAAAgAIAAAAAABAMRzFcRzJ0SRPUi3TcjVXcz3Xc03XdV1XVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVYHQkFUAAAQAACGdZpZqgAgzkGEgNGQVAIAAAAAYoQhDDAgNWQUAAAQAAIih5CCa0JrzzTkOmuWgqRSb08GJVJsnuamYm3POOeecbM4Z45xzzinKmcWgmdCac85JDJqloJnQmnPOeRKbB62p0ppzzhnnnA7GGWGcc85p0poHqdlYm3POWdCa5qi5FJtzzomUmye1uVSbc84555xzzjnnnHPOqV6czsE54Zxzzonam2u5CV2cc875ZJzuzQnhnHPOOeecc84555xzzglCQ1YBAEAAAARh2BjGnYIgfY4GYhQhpiGTHnSPDpOgMcgppB6NjkZKqYNQUhknpXSC0JBVAAAgAACEEFJIIYUUUkghhRRSSCGGGGKIIaeccgoqqKSSiirKKLPMMssss8wyy6zDzjrrsMMQQwwxtNJKLDXVVmONteaec645SGultdZaK6WUUkoppSA0ZBUAAAIAQCBkkEEGGYUUUkghhphyyimnoIIKCA1ZBQAAAgAIAAAA8CTPER3RER3RER3RER3RER3P8RxREiVREiXRMi1TMz1VVFVXdm1Zl3Xbt4Vd2HXf133f141fF4ZlWZZlWZZlWZZlWZZlWZZlCUJDVgEAIAAAAEIIIYQUUkghhZRijDHHnINOQgmB0JBVAAAgAIAAAAAAR3EUx5EcyZEkS7IkTdIszfI0T/M00RNFUTRNUxVd0RV10xZlUzZd0zVl01Vl1XZl2bZlW7d9WbZ93/d93/d93/d93/d939d1IDRkFQAgAQCgIzmSIimSIjmO40iSBISGrAIAZAAABACgKI7iOI4jSZIkWZImeZZniZqpmZ7pqaIKhIasAgAAAQAEAAAAAACgaIqnmIqniIrniI4oiZZpiZqquaJsyq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7rukBoyCoAQAIAQEdyJEdyJEVSJEVyJAcIDVkFAMgAAAgAwDEcQ1Ikx7IsTfM0T/M00RM90TM9VXRFFwgNWQUAAAIACAAAAAAAwJAMS7EczdEkUVIt1VI11VItVVQ9VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV1TRN0zSB0JCVAAAZAAAjQQYZhBCKcpBCbj1YCDHmJAWhOQahxBiEpxAzDDkNInSQQSc9uJI5wwzz4FIoFURMg40lN44gDcKmXEnlOAhCQ1YEAFEAAIAxyDHEGHLOScmgRM4xCZ2UyDknpZPSSSktlhgzKSWmEmPjnKPSScmklBhLip2kEmOJrQAAgAAHAIAAC6HQkBUBQBQAAGIMUgophZRSzinmkFLKMeUcUko5p5xTzjkIHYTKMQadgxAppRxTzinHHITMQeWcg9BBKAAAIMABACDAQig0ZEUAECcA4HAkz5M0SxQlSxNFzxRl1xNN15U0zTQ1UVRVyxNV1VRV2xZNVbYlTRNNTfRUVRNFVRVV05ZNVbVtzzRl2VRV3RZV1bZl2xZ+V5Z13zNNWRZV1dZNVbV115Z9X9ZtXZg0zTQ1UVRVTRRV1VRV2zZV17Y1UXRVUVVlWVRVWXZlWfdVV9Z9SxRV1VNN2RVVVbZV2fVtVZZ94XRVXVdl2fdVWRZ+W9eF4fZ94RhV1dZN19V1VZZ9YdZlYbd13yhpmmlqoqiqmiiqqqmqtm2qrq1bouiqoqrKsmeqrqzKsq+rrmzrmiiqrqiqsiyqqiyrsqz7qizrtqiquq3KsrCbrqvrtu8LwyzrunCqrq6rsuz7qizruq3rxnHrujB8pinLpqvquqm6um7runHMtm0co6rqvirLwrDKsu/rui+0dSFRVXXdlF3jV2VZ921fd55b94WybTu/rfvKceu60vg5z28cubZtHLNuG7+t+8bzKz9hOI6lZ5q2baqqrZuqq+uybivDrOtCUVV9XZVl3zddWRdu3zeOW9eNoqrquirLvrDKsjHcxm8cuzAcXds2jlvXnbKtC31jyPcJz2vbxnH7OuP2daOvDAnHjwAAgAEHAIAAE8pAoSErAoA4AQAGIecUUxAqxSB0EFLqIKRUMQYhc05KxRyUUEpqIZTUKsYgVI5JyJyTEkpoKZTSUgehpVBKa6GU1lJrsabUYu0gpBZKaS2U0lpqqcbUWowRYxAy56RkzkkJpbQWSmktc05K56CkDkJKpaQUS0otVsxJyaCj0kFIqaQSU0mptVBKa6WkFktKMbYUW24x1hxKaS2kEltJKcYUU20txpojxiBkzknJnJMSSmktlNJa5ZiUDkJKmYOSSkqtlZJSzJyT0kFIqYOOSkkptpJKTKGU1kpKsYVSWmwx1pxSbDWU0lpJKcaSSmwtxlpbTLV1EFoLpbQWSmmttVZraq3GUEprJaUYS0qxtRZrbjHmGkppraQSW0mpxRZbji3GmlNrNabWam4x5hpbbT3WmnNKrdbUUo0txppjbb3VmnvvIKQWSmktlNJiai3G1mKtoZTWSiqxlZJabDHm2lqMOZTSYkmpxZJSjC3GmltsuaaWamwx5ppSi7Xm2nNsNfbUWqwtxppTS7XWWnOPufVWAADAgAMAQIAJZaDQkJUAQBQAAEGIUs5JaRByzDkqCULMOSepckxCKSlVzEEIJbXOOSkpxdY5CCWlFksqLcVWaykptRZrLQAAoMABACDABk2JxQEKDVkJAEQBACDGIMQYhAYZpRiD0BikFGMQIqUYc05KpRRjzknJGHMOQioZY85BKCmEUEoqKYUQSkklpQIAAAocAAACbNCUWByg0JAVAUAUAABgDGIMMYYgdFQyKhGETEonqYEQWgutddZSa6XFzFpqrbTYQAithdYySyXG1FpmrcSYWisAAOzAAQDswEIoNGQlAJAHAEAYoxRjzjlnEGLMOegcNAgx5hyEDirGnIMOQggVY85BCCGEzDkIIYQQQuYchBBCCKGDEEIIpZTSQQghhFJK6SCEEEIppXQQQgihlFIKAAAqcAAACLBRZHOCkaBCQ1YCAHkAAIAxSjkHoZRGKcYglJJSoxRjEEpJqXIMQikpxVY5B6GUlFrsIJTSWmw1dhBKaS3GWkNKrcVYa64hpdZirDXX1FqMteaaa0otxlprzbkAANwFBwCwAxtFNicYCSo0ZCUAkAcAgCCkFGOMMYYUYoox55xDCCnFmHPOKaYYc84555RijDnnnHOMMeecc845xphzzjnnHHPOOeecc44555xzzjnnnHPOOeecc84555xzzgkAACpwAAAIsFFkc4KRoEJDVgIAqQAAABFWYowxxhgbCDHGGGOMMUYSYowxxhhjbDHGGGOMMcaYYowxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGFtrrbXWWmuttdZaa6211lprrQBAvwoHAP8HG1ZHOCkaCyw0ZCUAEA4AABjDmHOOOQYdhIYp6KSEDkIIoUNKOSglhFBKKSlzTkpKpaSUWkqZc1JSKiWlllLqIKTUWkottdZaByWl1lJqrbXWOgiltNRaa6212EFIKaXWWostxlBKSq212GKMNYZSUmqtxdhirDGk0lJsLcYYY6yhlNZaazHGGGstKbXWYoy1xlprSam11mKLNdZaCwDgbnAAgEiwcYaVpLPC0eBCQ1YCACEBAARCjDnnnHMQQgghUoox56CDEEIIIURKMeYcdBBCCCGEjDHnoIMQQgghhJAx5hx0EEIIIYQQOucchBBCCKGEUkrnHHQQQgghlFBC6SCEEEIIoYRSSikdhBBCKKGEUkopJYQQQgmllFJKKaWEEEIIoYQSSimllBBCCKWUUkoppZQSQgghlFJKKaWUUkIIoZRQSimllFJKCCGEUkoppZRSSgkhhFBKKaWUUkopIYQSSimllFJKKaUAAIADBwCAACPoJKPKImw04cIDUGjISgCADAAAcdhq6ynWyCDFnISWS4SQchBiLhFSijlHsWVIGcUY1ZQxpRRTUmvonGKMUU+dY0oxw6yUVkookYLScqy1dswBAAAgCAAwECEzgUABFBjIAIADhAQpAKCwwNAxXAQE5BIyCgwKx4Rz0mkDABCEyAyRiFgMEhOqgaJiOgBYXGDIB4AMjY20iwvoMsAFXdx1IIQgBCGIxQEUkICDE2544g1PuMEJOkWlDgIAAAAAAAEAHgAAkg0gIiKaOY4Ojw+QEJERkhKTE5QAAAAAAOABgA8AgCQFiIiIZo6jw+MDJERkhKTE5AQlAAAAAAAAAAAACAgIAAAAAAAEAAAACAhPZ2dTAAS7BgAAAAAAAENwAAACAAAAuYZvJQk6Qf9ONjhJPjUEVq9VnnaqykjvnENsneFACjqk+DOoB0dFc58cjjUZHJa8hJ+ud6+ujX5K69fZwbbz4Hq00orLhzsA3HmvDR6bE+HpXmfWBAqkoi0PaqbUigeCpoW8Rx1FU9PtM7i5h1U8OKswVOWIhZurMFROH6gPtoRBQiwK8m6aJQpy2BVvKPgOb7OTf5Nn9I+7UCiadla3wHDbGDIzATkOMrAchB4AQHqOf78GgAcAu3+/tALYA4AcVwn2AOxHA3vAVgDwuQUAAAB7TnoAKIDQABfAQAUMg4B+Aifnd1+f/3PvgYz2z+yD8aGb4wMDQwWmpsYGA58fkyPymGVZlqpl2U297fZ3ux3k1PIAmDWqHWx14vFESikBAABgSTkeH6yM6LC87cbRAQAAAAir6wZTzdNiMcYsK2tt+epXD7tpIiWsLSeGGy0hhBAAMIYzM4QQBwAAAABISmtdNe689gOEcCkoZQcbzY6QKQqA+mMCALCotnryJxkBFOD31tYAAAAA8FMB1C9Vfmrqncc02rt3qGcAXlSqqiftt7MQyRKoKBRCCABIv0T5EQAwAAwPDUDxGQs2d70CAAFsAAAgr/M3AAC9irRdKxACQAQAgAd8YX/UebZVKkjw02M1LwiNlngdgeXruZlTwlqpnolfg5/2+B0gP/wWxjfQA/Kh8s06UKADcgFsWX/A8Qw9Iomc2JbOCwyTrXcgLlB9WV6SxdUCvG7HZIA62VF/YRyADJPdIPgWaoZKsdDUD6SwF1wpf0jZ7Q9BJAjI4/RMGogbNr8xF1rr7VC0kg6hrQ9MDmfy+AqV74X0dULrjxBsG7e3wOuBOoJfssJWSu0QW6FEiU811QSUPgEcCX/IeL53XWiCf+LM8MIGssUaTdTzejspKy6HeCUSXzO53eGThZPZqn2wfUUB8CMCU7LnGA6QNB9un3hZA/wAd0+expDQhPB4H/O+wKQcu7PNPMsaty+I+Vz4/Gjoy9DbY520TMuP2mlFlVhFykVWg3oB\n'



def load_sound(string):

    sound_string = binascii.a2b_base64(string)

    f = StringIO(sound_string)

    sound = pygame.mixer.Sound(f)

    sound.set_volume(0.5)

    return sound


LEVELS = [level1, level2, level3, level4, level5]

ONFULLSCREEN = 0


def imagetostring(filename):

    img = pygame.image.load(filename)

    new = ""

    for y in range(img.get_height()):

        for x in range(img.get_width()):

            pixel = img.get_at((x, y))

            if pixel == (0, 0, 0, 255):

                new += "+"

            elif pixel == (255, 255, 0, 255):

                new += "o"

            elif pixel == (255, 0, 0, 255):

                new += "P"

            elif pixel == (0, 0, 255, 255):

                new += "S"

            elif pixel == (0, 255, 0, 255):

                new += "G"

            else:

                new += "-"

        new += "\n"

    return new


def image(color, shape="block", pixelstring=None):

    img = pygame.Surface((16, 16))

    if shape == "block":

        img.fill(Color(color))

    if shape == "circle":

        pygame.draw.ellipse(img, Color(color), (1, 1, 14, 14))

        img.set_colorkey((0, 0, 0), RLEACCEL)

    if pixelstring:

        img.set_colorkey((0, 0, 0), RLEACCEL)

        x=0

        y=-1

        for line in pixelstring.split("\n"):

            for char in line:

                if char == "+":

                    img.fill(Color(color), (x, y, 1, 1))

                x += 1

            y += 1

            x = 0

    return img


def speed_to_side(dx,dy):

    if abs(dx) > abs(dy): dy = 0

    else: dx = 0

    if dy < 0: return 0

    elif dx > 0: return 1

    elif dy > 0: return 2

    elif dx < 0: return 3

    else: return 0, 0


class Sprite(pygame.sprite.Sprite):


    def __init__(self, img, pos):

        pygame.sprite.Sprite.__init__(self, self.containers)

        self.image = img

        self.rect = self.image.get_rect(topleft = pos)

        self.r = Rect(self.rect[0]*100, self.rect[1]*100, self.rect[2]*100, self.rect[3]*100)

        self.collision_groups = []


    def set_pos(self, x, y):

        self.r.left = x*100

        self.r.top = y*100


    def update_rect(self):

        self.rect.top = self.r.top/100

        self.rect.left = self.r.left/100


    def add_collision_group(self, group):

        self.collision_groups.append(group)


    def move(self, dx, dy, collide=True):

        if collide:

            if dx!=0:

                dx, dummy = self.__move(dx*100, 0)

            if dy!=0:

                dummy, dy = self.__move(0, dy*100)

        else:

            self.r.move_ip(dx*100, dy*100)

        return dx, dy


    def __move(self, dx, dy):

        oldr = self.r

        self.r.move_ip(dx, dy)

        side = speed_to_side(dx, dy)


        for group in self.collision_groups:

            for spr in group:

                if spr.r.colliderect(self.r):

                    if side == 0:

                        self.r.top = spr.r.bottom

                    if side == 1:

                        self.r.right = spr.r.left

                    if side == 2:

                        self.jumping = False

                        self.jump_speed = 0

                        self.r.bottom = spr.r.top

                    if side == 3:

                        self.r.left = spr.r.right

        return self.r.left-oldr.left,self.r.top-oldr.top



class Player(Sprite):


    def __init__(self, pos):


        Sprite.__init__(self, image("#7F79D5", pixelstring=player_anim0, shape=None), pos)

        self.images = [image("#7F79D5", pixelstring=player_anim2, shape=None),

                       image("#7F79D5", pixelstring=player_anim1, shape=None),

                       image("#7F79D5", pixelstring=player_anim0, shape=None)]

        self.rightimgs = self.images

        self.leftimgs = []

        for i in self.images:

            self.leftimgs.append(pygame.transform.flip(i, 1, 0))

        self.jump_speed = 0

        self.fall_speed = 0.4

        self.jumping = False


        self.speed = 0

        self.accel_speed = 0.25

        self.max_speed = 3.5

        self.facing = 1

        self.frame = 0

        self.keys = [K_SPACE, K_UP, K_PAGEDOWN]

        self.jump_sound = load_sound(jump_sound)


    def jump(self):

        if not self.jumping:

            self.jump_sound.play()

            self.jumping = True

            self.jump_speed = -6


    def update(self):

        if self.jump_speed > 1:

            self.jumping = True

        moving = 0

        key = pygame.key.get_pressed()

        if self.rect.left < 0:

            self.set_pos(0, self.rect.top)

        if key[K_LEFT]:

            self.facing = -1

            moving = -1

            if self.speed > -self.max_speed:

                self.speed -= self.accel_speed

        elif key[K_RIGHT]:

            self.facing = 1

            moving = 1

            if self.speed < self.max_speed:

                self.speed += self.accel_speed

        else:

            if self.speed > 0:

                self.speed -= self.accel_speed

            if self.speed < 0:

                self.speed += self.accel_speed

        if self.jump_speed < 5:

            if key[self.keys[0]] or key[self.keys[1]] or key[self.keys[2]]:

                self.jump_speed += self.fall_speed

            else:

                self.jump_speed += self.fall_speed+0.3

        self.move(self.speed, self.jump_speed)


        self.frame += 1

        if self.facing > 0:

            self.image = self.rightimgs[2]

        if self.facing < 0:

            self.image = self.leftimgs[2]

        if moving > 0:

            self.image = self.rightimgs[self.frame/4%2]

        if moving < 0:

            self.image = self.leftimgs[self.frame/4%2]


class robo(Sprite):


    def __init__(self, pos):


        Sprite.__init__(self, image("#690498", shape=None, pixelstring=robo_img), pos)


        self.leftimg = pygame.transform.flip(image("#690498", shape=None, pixelstring=robo_img), 1, 0)

        self.rightimg = image("#690498", shape=None, pixelstring=robo_img)


        self.frame = 0

        self.speed = 1

        self.orgcenter = self.rect.centerx

        self.y = self.rect.centery


    def update(self):


        if self.speed > 0:

            self.image = self.rightimg

        if self.speed < 0:

            self.image = self.leftimg


        self.move(self.speed, 0)

        self.frame += 1


        if self.frame <= 12:

            self.move(0, 0.25)

        else:

            self.move(0, -0.25)

        self.rect.centery = self.y

        if self.frame >= 24:

            self.frame = 0

        if self.rect.right >= self.orgcenter + 50:

            self.speed = -1

        if self.rect.left <= self.orgcenter - 50:

            self.speed = 1


class Block(Sprite):


    def __init__(self, pos):

        Sprite.__init__(self, image("#11B019"), pos)


class Spikes(Sprite):


    def __init__(self, pos):

        Sprite.__init__(self, image("#545B55", shape=None, pixelstring=spikes_img), pos)


class Coin(Sprite):


    def __init__(self, pos):

        Sprite.__init__(self, image("#ffff00", "circle"), pos)

        self.images = [image("#ffff00", "circle"),

                       image("#f4f400", "circle"),

                       image("#e9e900", "circle"),

                       image("#f4f400", "circle")]

        self.frame = 0

        self.alpha = 255

        self.dead = False

        self.coin_sound = load_sound(coin_sound)

    def kill(self):

        self.dead = True

    def update(self):

        self.frame += 1

        self.image = self.images[self.frame/4%4]

        if self.dead:

            self.alpha -= 75

        if self.alpha <= 0:

            self.coin_sound.play()

            pygame.sprite.Sprite.kill(self)

        self.image.set_alpha(self.alpha)


class Camera(object):


    def __init__(self, screen, sprite_to_center_on, world_size):

        self.sprite = sprite_to_center_on

        self.rect = screen.get_rect()

        self.world_rect = Rect(0, 0, world_size[0], world_size[1])


    def update(self):

        if self.sprite.rect.centerx > self.rect.centerx + 25:

            self.rect.centerx = self.sprite.rect.centerx - 25

        if self.sprite.rect.centerx < self.rect.centerx - 25:

            self.rect.centerx = self.sprite.rect.centerx + 25

        if self.sprite.rect.centery > self.rect.centery + 25:

            self.rect.centery = self.sprite.rect.centery - 25

        if self.sprite.rect.centery < self.rect.centery - 25:

            self.rect.centery = self.sprite.rect.centery + 25

        self.rect.clamp_ip(self.world_rect)


    def draw_group(self, surface, group):

        for sprite in group.sprites():

            if sprite.rect.left <= self.rect.right and sprite.rect.right >= self.rect.left:

                if sprite.rect.top <= self.rect.bottom and sprite.rect.bottom >= self.rect.top:

                    surface.blit(sprite.image, self.sprite_rect(sprite))


    def update_group(self, group):

        for sprite in group.sprites():

            if sprite.rect.left <= self.rect.right and sprite.rect.right >= self.rect.left:

                if sprite.rect.top <= self.rect.bottom and sprite.rect.bottom >= self.rect.top:

                    sprite.update()

                    sprite.update_rect()


    def sprite_rect(self, actor):

        return pygame.Rect(actor.rect.x - self.rect.x, actor.rect.y - self.rect.y, actor.rect.w, actor.rect.h)


class Level:


    def __init__(self, level=level1):

        self.level = level

        self.x = 0

        self.y = -16

        for line in self.level.split("\n"):

            for char in line:

                if char == "+":

                    Block((self.x, self.y))

                if char == "P":

                    self.player = Player((self.x, self.y))

                if char == "o":

                    Coin((self.x, self.y))

                if char == "S":

                    Spikes((self.x, self.y))

                if char == "G":

                    robo((self.x, self.y))

                self.x += 16

            self.y += 16

            self.x = 0


    def get_size(self):

        lines = self.level.split("\n")

        line = lines[1]

        width = (len(line))*16

        height = (len(lines)-2)*16

        return [width, height]


def next_level(levelnum):

    try:

        levelnum += 1

        lvl = LEVELS[levelnum-1]

    except:

        return None

    level = Level(lvl)

    return level, levelnum



def Menu(screen):


    screen = screen

    font = pygame.font.SysFont("courier", 32, bold=True)

    font2 = pygame.font.SysFont("courier", 20, bold=True)

    font3 = pygame.font.SysFont("courier", 12, bold=True)


    player = image("#010101", shape=None, pixelstring=player_anim0)

    player = pygame.transform.scale(player, [player.get_width()*6, player.get_height()*6])

    cursor = image("#010101", shape="circle")

    cursorpos = 150

    option = 1

    sound = load_sound(blip_sound)

    clock = pygame.time.Clock()

    global ONFULLSCREEN


    while 1:


        clock.tick(30)

        for e in pygame.event.get():

            if e.type == QUIT:

                pygame.quit()

                sys.exit()

            if e.type == KEYDOWN:

                if e.key == K_ESCAPE:

                    pygame.quit()

                    sys.exit()

                if e.key == K_DOWN:

                    sound.play()

                    option = 2

                if e.key == K_UP:

                    sound.play()

                    option = 1

                if e.key == K_RETURN:

                    sound.play()

                    if option == 1:

                        Intro(screen)

                        game = Game(screen)

                        game.main_loop()

                    if option == 2:

                        pygame.quit()

                        return

                if e.key == K_f:

                    ONFULLSCREEN ^= 1

                    if ONFULLSCREEN:

                        pygame.display.set_mode((320, 240), FULLSCREEN)

                    else:

                        pygame.display.set_mode((320, 240))


        if option == 1:

            cursorpos = 150

        else:

            cursorpos = 170


        screen.fill(Color("#c1c1c1"))

        pygame.draw.rect(screen, Color("#00574E"), (55, 25, 210, 45), 5)

        pygame.draw.rect(screen, Color("#00574E"), (0, 227, 320, 32))

        ren = font.render("Robo Hell", 1, Color("#7E31A2"))

        screen.blit(ren, (161-ren.get_width()/2, 31))

        ren = font.render("Robo Hell", 1, Color("#ffffff"))

        screen.blit(ren, (160-ren.get_width()/2, 30))


        ren = font3.render("RichiZ", 1, Color("#000000"))

        screen.blit(ren, (160-ren.get_width()/2, 85))

        ren = font3.render("Open Pandora Competition", 1, Color("#000000"))

        screen.blit(ren, (160-ren.get_width()/2, 100))


        ren = font2.render("New Game", 1, Color("#000000"))

        screen.blit(ren, (140, 145))

        ren = font2.render("Quit Game", 1, Color("#000000"))

        screen.blit(ren, (140, 165))

        screen.blit(player, (10, 132))

        screen.blit(cursor, (120, cursorpos))

        pygame.display.flip()



def Intro(screen):


    screen = screen

    font = pygame.font.SysFont("Times New Roman", 32, bold=True)

    font2 = pygame.font.SysFont("Times New Roman", 16, bold=True)

    font3 = pygame.font.SysFont("Times New Roman", 12, bold=True)


    player = image("#010101", shape=None, pixelstring=player_anim0)

    player = pygame.transform.scale(player, [player.get_width()*6, player.get_height()*6])

    cursor = image("#010101", shape="circle")

    option = 1

    sound = load_sound(blip_sound)

    clock = pygame.time.Clock()

    ypos = 240

    global ONFULLSCREEN

    text = ["Get To The Chopper"]


    while 1:


        clock.tick(60)

        for e in pygame.event.get():

            if e.type == QUIT:

                pygame.quit()

                sys.exit()

            if e.type == KEYDOWN:

                if e.key == K_ESCAPE:

                    return

                if e.key == K_RETURN:

                    sound.play()

                    return

                if e.key == K_f:

                    ONFULLSCREEN ^= 1

                    if ONFULLSCREEN:

                        pygame.display.set_mode((320, 240), FULLSCREEN)

                    else:

                        pygame.display.set_mode((320, 240))


        screen.fill(Color("#c1c1c1"))

        ren = font.render("Prologue", 1, Color("#000000"))

        screen.blit(ren, (160-ren.get_width()/2, 20))

        ypos = 75

        for line in text:

            ren = font2.render(line, 1, (0, 0, 0))

            screen.blit(ren, (160-ren.get_width()/2, ypos))

            ypos += font2.get_height()

        ren = font3.render("Press Enter To Start", 1, Color("#000000"))

        screen.blit(ren, (160-ren.get_width()/2, 210))

        pygame.display.flip()


def Outro(screen, final_score=0):


    screen = screen

    font = pygame.font.SysFont("courier", 32, bold=True)

    font2 = pygame.font.SysFont("courier", 16, bold=True)

    font3 = pygame.font.SysFont("courier", 12, bold=True)


    player = image("#010101", shape=None, pixelstring=player_anim0)

    player = pygame.transform.scale(player, [player.get_width()*6, player.get_height()*6])

    cursor = image("#010101", shape="circle")

    option = 1

    sound = load_sound(blip_sound)

    clock = pygame.time.Clock()

    ypos = 240

    global ONFULLSCREEN

    text = ["You destroyed Robo Land!"

            "",

            "Final Score:",

            "%09d" % final_score]


    while 1:


        clock.tick(60)

        for e in pygame.event.get():

            if e.type == QUIT:

                pygame.quit()

                sys.exit()

            if e.type == KEYDOWN:

                if e.key == K_ESCAPE:

                    return

                if e.key == K_RETURN:

                    sound.play()

                    return

                if e.key == K_f:

                    ONFULLSCREEN ^= 1

                    if ONFULLSCREEN:

                        pygame.display.set_mode((320, 240), FULLSCREEN)

                    else:

                        pygame.display.set_mode((320, 240))


        screen.fill(Color("#c1c1c1"))

        ren = font.render("You won!", 1, Color("#000000"))

        screen.blit(ren, (160-ren.get_width()/2, 20))

        ypos = 75

        for line in text:

            ren = font2.render(line, 1, (0, 0, 0))

            screen.blit(ren, (160-ren.get_width()/2, ypos))

            ypos += font2.get_height()

        ren = font3.render("Press Enter to Exit to Title Screen", 1, Color("#000000"))

        screen.blit(ren, (160-ren.get_width()/2, 210))

        pygame.display.flip()



class Game:


    def __init__(self, screen):


        self.screen = screen

        self.all = pygame.sprite.RenderUpdates()

        self.blocks = pygame.sprite.Group()

        self.coins = pygame.sprite.Group()

        self.spikes = pygame.sprite.Group()

        self.robos = pygame.sprite.Group()


        Player.containers = self.all

        Block.containers = self.all, self.blocks

        Coin.containers = self.all, self.coins

        Spikes.containers = self.all, self.spikes

        robo.containers = self.all, self.robos


        self.clock = pygame.time.Clock()

        self.level = Level()

        self.player = self.level.player

        self.player.add_collision_group(self.blocks)

        self.camera = Camera(self.screen, self.player, self.level.get_size())

        self.lvl = 1

        self.font = pygame.font.SysFont("courier", 12, bold=True)

        self.font2 = pygame.font.SysFont("courier", 32, bold=True)

        self.score = 0

        self.lives = 5

        self.done = False

        self.coin_sound = load_sound(coin_sound)

        self.highscore = 0

        self.paused = False

        self.time = 0

        self.final_score = 0


    def draw(self):

        self.screen.fill(Color("#c1c1c1"))

        self.camera.draw_group(self.screen, self.all)

        ren1 = self.font.render("FPS: %d/60" % self.clock.get_fps(), 1, Color("#000000"))

        ren2 = self.font.render("FPS: %d/60" % self.clock.get_fps(), 1, Color("#ffffff"))

        self.screen.blit(ren1, (6, 221))

        self.screen.blit(ren2, (5, 220))

        ren1 = self.font.render("Score: %d" % self.score, 1, Color("#000000"))

        ren2 = self.font.render("Score: %d" % self.score, 1, Color("#ffffff"))

        self.screen.blit(ren1, (11, 6))

        self.screen.blit(ren2, (10, 5))

        ren1 = self.font.render("Level: %d" % self.lvl, 1, Color("#000000"))

        ren2 = self.font.render("Level: %d" % self.lvl, 1, Color("#ffffff"))

        self.screen.blit(ren1, (246, 6))

        self.screen.blit(ren2, (245, 5))

        ren1 = self.font.render("Lives x%d" % self.lives, 1, Color("#000000"))

        ren2 = self.font.render("Lives x%d" % self.lives, 1, Color("#ffffff"))

        self.screen.blit(ren1, (131, 6))

        self.screen.blit(ren2, (130, 5))

        ren1 = self.font.render("Time: %d" % self.time, 1, Color("#000000"))

        ren2 = self.font.render("Time: %d" % self.time, 1, Color("#ffffff"))

        self.screen.blit(ren1, (11, 21))

        self.screen.blit(ren2, (10, 20))

        self.final_score = (self.score - int(self.time))*self.lives

        if self.lives <= 0 and not self.player.alive() and not self.done:

            ren1 = self.font2.render("Game Over!", 1, Color("#000000"))

            ren2 = self.font2.render("Game Over!", 1, Color("#ffffff"))

            self.screen.blit(ren1, (160-ren1.get_width()/2 + 2, 120-ren1.get_height()/2 + 2))

            self.screen.blit(ren2, (160-ren2.get_width()/2, 120-ren2.get_height()/2))                


    def hit_screen(self):

        self.draw()

        ren1 = self.font2.render("Ouch!", 1, Color("#000000"))

        ren2 = self.font2.render("Ouch!", 1, Color("#ffffff"))

        self.screen.blit(ren1, (160-ren1.get_width()/2 + 2, 120-ren1.get_height()/2 + 2))

        self.screen.blit(ren2, (160-ren2.get_width()/2, 120-ren2.get_height()/2))                

        pygame.display.flip()

        pygame.time.wait(1000)


    def main_loop(self):


        global ONFULLSCREEN

        while 1:


            self.clock.tick(60)

            if self.player.alive():

                self.time += 0.015

            for e in pygame.event.get():

                if e.type == QUIT:

                    pygame.quit()

                    sys.exit()

                if e.type == KEYDOWN:

                    if e.key == K_ESCAPE:

                        return

                    if e.key in self.player.keys:

                        self.player.jump()

                    if e.key == K_1:

                        self.lvl = 0

                        self.next_level()

                    if e.key == K_2:

                        self.lvl = 1

                        self.next_level()

                    if e.key == K_3:

                        self.lvl = 2

                        self.next_level()

                    if e.key == K_4:

                        self.lvl = 3

                        self.next_level()

                    if e.key == K_5:

                        self.lvl = 4

                        self.next_level()

                    if e.key == K_p:

                        self.paused ^= 1

                    if e.key == K_f:

                        ONFULLSCREEN ^= 1

                        if ONFULLSCREEN:

                            pygame.display.set_mode((320, 240), FULLSCREEN)

                        else:

                            pygame.display.set_mode((320, 240))

                        pygame.time.wait(1500)

            while self.paused:

                self.clock.tick(20)

                for e in pygame.event.get():

                    if e.type == QUIT:

                        pygame.quit()

                        return

                    if e.type == KEYDOWN:

                        if e.key == K_ESCAPE:

                            return

                        if e.key == K_p:

                            self.paused ^= 1


            for sprite in self.all.sprites():

                if isinstance(sprite, Coin):

                    sprite.update()

                if sprite.rect.left <= self.camera.rect.right and sprite.rect.right >= self.camera.rect.left:

                    if sprite.rect.top <= self.camera.rect.bottom and sprite.rect.bottom >= self.camera.rect.top:

                        if not isinstance(sprite, Coin):

                            sprite.update()

                        sprite.update_rect()

                        if isinstance(sprite, Coin):

                            if self.player.rect.colliderect(sprite.rect) and not sprite.dead:

                                sprite.kill()

                                self.score += 25

                        if isinstance(sprite, Spikes):

                            if self.player.rect.colliderect(sprite.rect):

                                self.player.kill()

                        if isinstance(sprite, robo):

                            if self.player.rect.colliderect(sprite.rect):

                                self.player.kill()


            if self.score > self.highscore:

                self.highscore = self.score

            if not self.player.alive() and self.lives > 0 and not self.done:

                self.hit_screen()

                self.score = 0

                self.lvl -= 1

                self.lives -= 1

                self.next_level()

            if self.player.rect.right >= self.level.get_size()[0] and not self.done:

                self.player.kill()

                self.next_level()

            if self.player.rect.top >= self.level.get_size()[1]:

                self.player.kill()

            if self.done:

                Outro(self.screen, self.final_score)

                return

            self.camera.update()

            self.draw()

            pygame.display.flip()


    def next_level(self):

        lvl = next_level(self.lvl)

        if lvl == None:

            self.done = True

        else:

            self.clear_sprites()

            self.level, self.lvl = next_level(self.lvl)

            self.player = self.level.player

            self.player.add_collision_group(self.blocks)

            self.camera = Camera(self.screen, self.player, self.level.get_size())            


    def clear_sprites(self):

        for sprite in self.all.sprites():

            pygame.sprite.Sprite.kill(sprite)


def main():


    pygame.init()

    pygame.display.set_caption("Robo Hell - RichiZ")

    pygame.mouse.set_visible(0)

    screen = pygame.display.set_mode((320, 240))

    Menu(screen)


if __name__ == "__main__":

    main()
 
Last edited by a moderator:
One dark and fateful night, all the girls of your village were kidnapped... by the dreaded cave monsters.





You, lone hero, have agility and rope, but nothing else. You must enter the caves, face the monsters, and
Rescue the girls.





Try not to bump your head along the way.



Rescue for Open Pandora


Rescue for PC Linux (x86)


have a look at the Rescue webpage


I am attempting to buy votes by^W^W^W^W^W offering prizes to the players who first achieve certain things in my game!


Some screenshots and video:

https://www.youtube.com/embed/McGFxDHovhY?feature=oembed




 
Last edited by a moderator:
Here is my entry, Raedr: Download


No .pnd yet, will hand that in later. Just run the.bin from terminal.


You're a dragon running away from something unknown. The game is about jumping when the time is right, otherwise you will fall down or run against a wall. That's something dragons do not like B)


The sourcecode will be released under the GPL once I tidied it up a bit.
 
Last edited by a moderator:
Here is my entry, Raedr: Download


No .pnd yet, will hand that in later. Just run the.bin from terminal.


You're a dragon running away from something unknown. The game is about jumping when the time is right, otherwise you will fall down or run against a wall. That's something dragons do not like B)


The sourcecode will be released under the GPL once I tidied it up a bit.
PND up soon please, some of our users will be confused as to how to run from terminal :)
 
Back
Top