Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Simple Challenge: Link vs Goombas

Name: Anonymous 2010-06-07 17:22

Program a game in which the 'player' controls the likeness of Link(Zelda). The objective of the game is to defeat as many 'Goombas'(Mario Bros.) as they can before dieing. The rest is up to you.

Only one factor of your program will be judged: fun-ness.

Get to work!

Name: Anonymous 2010-06-08 19:51

Well, this certainly turned out uglier than I anticipated. I may do another one tomorrow.

You'll also need this: http://cairnarvon.rotahall.org/goombarum/sprites.pcx

(Screenshot: http://cairnarvon.rotahall.org/goombarum/screenshot.png )

/* gcc goomba.c `allegro-config --libs` */

#include <stdio.h>
#include <allegro.h>

typedef struct { int x, y; } POS;

int main(void)
{
    BITMAP *sprites, *link, *goomba1, *goomba2, *boom, *cloud, *buffa;
    PALETTE pal;
    extern FONT *font;
    POS link_pos, missiles[5], booms[5], cloud_pos,
        goombas[36];
    int i, flip_alter = 10, clouder = 200,
        going_right = 1, speed = 3,
        booming[5], b_ind = 0,
        score = 0, loser = 1;

    allegro_init();
    install_keyboard();
    install_timer();

    set_color_depth(32);
    if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0) != 0) {
        fprintf(stderr, "Couldn't initialise Allegro!\n");
        return 1;
    }
    set_window_title("Goombarum goombis goombis");

    sprites = load_pcx("sprites.pcx", pal);
    if (!sprites) {
        fprintf(stderr, "Couldn't load sprites!\n");
        return 2;
    }


    /* Load sprites */

    link = create_bitmap(22, 32);
    blit(sprites, link, 0, 0, 0, 0, 22, 32);
    goomba1 = create_bitmap(16, 16);
    blit(sprites, goomba1, 22, 0, 0, 0, 16, 16);
    goomba2 = create_bitmap(16, 16);
    blit(sprites, goomba2, 22, 16, 0, 0, 16, 16);
    boom = create_bitmap(32, 32);
    blit(sprites, boom, 38, 0, 0, 0, 32, 32);
    cloud = create_bitmap(16, 32);
    blit(sprites, cloud, 70, 0, 0, 0, 16, 32);

    destroy_bitmap(sprites);
    buffa = create_bitmap(SCREEN_W, SCREEN_H);


    /* Position everything */

    link_pos.x = SCREEN_W / 2;
    link_pos.y = SCREEN_H - 41;

    for (i = 0; i < 5; ++i) {
        missiles[i].x = missiles[i].y = -1;
        booms[i] = missiles[i];
        booming[i] = 0;
    }

    for (i = 0; i < 12; ++i) {
        goombas[i].x = goombas[i + 24].x = 32 + 32 * i;
        goombas[i + 12].x = 16 + 32 * i;
        goombas[i].y = 68;
        goombas[i + 12].y = 100;
        goombas[i + 24].y = 132;
    }

    cloud_pos.x = -10;
    cloud_pos.y = 0;


    /* Main loop */

    for (;;) {
        int alter = flip_alter > 5, live = 0, max_left = 640, max_right = 0;
       
        /* Paint current game state */

        clear_to_color(buffa, makecol(0, 200, 0));

        for (i = 0; i < 5; ++i) {
            if (missiles[i].x >= 0)
                circlefill(buffa,
                           missiles[i].x, missiles[i].y, 2,
                           makecol(255, 0, 0));
            if (booming[i] > 0)
                draw_sprite(buffa, boom, booms[i].x - 16, booms[i].y - 16);
        }

        draw_sprite(buffa, link, link_pos.x - 11, link_pos.y);

        for (i = 0; i < 12; ++i) {
            if (goombas[i].x >= 0)
                draw_sprite(buffa,
                            alter ? goomba1 : goomba2,
                            goombas[i].x - 8,
                            goombas[i].y - 8);
            if (goombas[i + 24].x >= 0)
                draw_sprite(buffa,
                            alter ? goomba1 : goomba2,
                            goombas[i + 24].x - 8,
                            goombas[i + 24].y - 8);
            alter = !alter;
            if (goombas[i + 12].x >= 0)
                draw_sprite(buffa,
                            alter ? goomba1 : goomba2,
                            goombas[i + 12].x - 8,
                            goombas[i + 12].y - 8);
        }

        textprintf_ex(buffa, font, 0, 0,
                      makecol(255, 255, 255), makecol(0, 0, 0),
                      "Score: %d", score);

        if (cloud_pos.x >= -8)
            draw_sprite(buffa, cloud, cloud_pos.x - 8, 0);

        blit(buffa, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);


        /* Update game state */

        if (--flip_alter == 0) flip_alter = 10;

        if (keypressed()) {
            int k = readkey();

            if ((k & 0xff) == 'q')
                break;

            switch (k >> 8) {
            case KEY_SPACE:
                for (i = 0; i < 5; ++i) {
                    if (missiles[i].x < 0) {
                        missiles[i] = link_pos;
                        break;
                    }
                }
                break;
            case KEY_LEFT:
                if (link_pos.x > 27)
                    link_pos.x -= 5;
                break;
            case KEY_RIGHT:
                if (link_pos.x < SCREEN_W - 27)
                    link_pos.x += 5;
            }
            clear_keybuf();
        }

        for (i = 0; i < 36; ++i) {
            if (goombas[i].x >= 0) {
                int killed = 0, j;

                for (j = 0; j < 5; ++j) {
                    int xd = goombas[i].x - missiles[j].x,
                        yd = goombas[i].y - missiles[j].y;

                    if (xd >= -16 && xd <= 16 && yd >= -16 && yd <= 16) {
                        booms[b_ind] = goombas[i];
                        booming[b_ind] = 16;
                        ++b_ind;
                        b_ind %= 5;

                        goombas[i].x = goombas[i].y = -1;
                        missiles[j] = goombas[i];

                        ++killed;
                        ++speed;

                        score += 100 * speed;

                        fprintf(stderr, "Killed Goomba #%d!\n", i);

                        break;
                    }
                }

                if (!killed) {
                    goombas[i].x += going_right ? speed / 3 : -speed / 3;
                    if (goombas[i].x < max_left)  max_left  = goombas[i].x;
                    if (goombas[i].x > max_right) max_right = goombas[i].x;
                    ++live;
                }
            }
        }

        if (live == 0) {
            loser = 0;
            break;
        }

        if ((going_right && max_right > SCREEN_W - 32) ||
            (!going_right && max_left < 32)) {
            int max_down = 0;

            going_right = !going_right;

            for (i = 0; i < 36; ++i) {
                goombas[i].y += 16;
                if (goombas[i].y > max_down) max_down = goombas[i].y;
            }

            if (max_down > SCREEN_H - 50)
                break;
        }

        for (i = 0; i < 5; ++i) {
            if (missiles[i].x >= 0) {
                if (cloud_pos.x >= -8 && missiles[i].y < 32) {
                    int dx = missiles[i].x - cloud_pos.x;

                    if (dx >= -8 && dx <= 8) {
                        booms[b_ind].x = cloud_pos.x;
                        booms[b_ind].y = 16;
                        booming[b_ind] = 30;
                        ++b_ind;
                        b_ind %= 5;

                        missiles[i].y = 0;
                        cloud_pos.x = -10;
                        clouder = 400;

                        score += 5000;
                    }
                }

                missiles[i].y -= 5;
                if (missiles[i].y < 0) missiles[i].x = -1;
            }
            --booming[i];
        }

        if (cloud_pos.x >= -8) {
            cloud_pos.x += 6;
            if (cloud_pos.x > SCREEN_W + 8) {
                cloud_pos.x = -10;
                clouder = 200;
            }
        }

        --clouder;
        if (clouder == 0)
            cloud_pos.x = -8;

        rest(25);
    }

    textout_centre_ex(screen, font, loser ? "YOUR JAMES OVER" : "WINRAR",
                      SCREEN_W / 2, SCREEN_H / 2,
                      makecol(255, 255, 255), -1);

    clear_keybuf();
    while (!keypressed());

    return 0;
}

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List