HOMEBREW SUBMISSION/VOTING THREAD

Discussion in 'General Discussions' started by richiz, Mar 30, 2011.

?

Which is your favourite?

  1. Wars Commando

    51.0%
  2. Snowman

    12.2%
  3. Rescue

    4.1%
  4. Raedr

    2.0%
  5. Greyout

    30.6%
  6. Unready

    0 vote(s)
    0.0%
  7. Robo Hell

    0 vote(s)
    0.0%
  1. richiz

    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



    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

    [​IMG]


    Foxblocks Submission - Greyout


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

    [​IMG]


    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: Apr 5, 2011
    Tags:
  2. Blue Protoman

    Blue Protoman Well-Known Member

    Joined:
    Mar 6, 2010
    Messages:
    4,119
    B-ZaR's game is already on the Archive.
     
  3. richiz

    richiz Member

    Joined:
    Jan 4, 2011
    Messages:
    338
    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
     
  4. bzar

    bzar A Commando

    Joined:
    Sep 22, 2008
    Messages:
    4,436
    Location:
    Finland
    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: Mar 30, 2011
  5. richiz

    richiz Member

    Joined:
    Jan 4, 2011
    Messages:
    338
    Can someone sticky please?
     
  6. gruso

    gruso thunderbox

    Joined:
    Feb 28, 2008
    Messages:
    7,461
    Location:
    Sydney, Australia
    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. :)
     
  7. richiz

    richiz Member

    Joined:
    Jan 4, 2011
    Messages:
    338
    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.
     
  8. gruso

    gruso thunderbox

    Joined:
    Feb 28, 2008
    Messages:
    7,461
    Location:
    Sydney, Australia
    Sorted. :) Maybe link to the other two threads in your OP.
     
  9. bzar

    bzar A Commando

    Joined:
    Sep 22, 2008
    Messages:
    4,436
    Location:
    Finland
    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: Apr 1, 2011
  10. Blue Protoman

    Blue Protoman Well-Known Member

    Joined:
    Mar 6, 2010
    Messages:
    4,119
    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.
     
  11. bzar

    bzar A Commando

    Joined:
    Sep 22, 2008
    Messages:
    4,436
    Location:
    Finland
    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.
     
  12. Ziz

    Ziz Advanced Member

    Joined:
    Sep 10, 2006
    Messages:
    1,584
    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
     
  13. WizardStan

    WizardStan Mega GP Mania

    Joined:
    May 24, 2008
    Messages:
    16,596
    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...)
     
  14. richiz

    richiz Member

    Joined:
    Jan 4, 2011
    Messages:
    338
    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 = '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\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: Apr 1, 2011
  15. bzar

    bzar A Commando

    Joined:
    Sep 22, 2008
    Messages:
    4,436
    Location:
    Finland
    ^ Spoiler tag!
     
  16. sswam

    sswam Advanced Member

    Joined:
    Dec 16, 2009
    Messages:
    1,392
    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

    [​IMG] [​IMG]


    [​IMG] [​IMG]
     
    Last edited by a moderator: Aug 26, 2012
  17. mrz

    mrz Still Fresh

    Joined:
    Mar 31, 2011
    Messages:
    20
    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: Mar 31, 2011
  18. may88

    may88 Well-Known Member

    Joined:
    Dec 17, 2007
    Messages:
    1,179
    Location:
    Bury St. Edmunds, UK
    Right I've finally decided on the game details.


    I'm about to start coding. When's the deadline? :p
     
  19. richiz

    richiz Member

    Joined:
    Jan 4, 2011
    Messages:
    338
    PND up soon please, some of our users will be confused as to how to run from terminal :)
     
  20. Ziz

    Ziz Advanced Member

    Joined:
    Sep 10, 2006
    Messages:
    1,584
    On at least one pandora my game seems to crash, when it is in a pnd-file, but not, if it is started in the Terminal or things like that. So, if snowman crashs at your panodra, please try this version: http://ziz.delphigl.com/data/snowman_pandora.zip .


    greetings, Ziz
     

Share This Page

Loading...