Jump to content
IGNORED

Goat game


freewheel

Recommended Posts

The consensus was a big WTF for the Game Over screen, so here's a new one. And it's animated, so the screenshot doesn't completely do it justice. I'm not 100% sold on the "press any button" - is that sort of text even needed? Is it obvious to people to just press something to continue? And if so - buttons, disc, or both? I could just center the goat at the bottom.

 

Also, there will be some sort of sad song played when the screen comes up. Haven't written that yet.

 

 

 

Looks awesome! I like it a lot. :)

 

I'd say, center the goat at the bottom and don't bother with the "press any key" message. :)

 

-dZ.

Link to comment
Share on other sites

I finally noticed the reason why the middle seasons seem to speed up and slow down. It seems that the speed is not timer-based but score-(or nom)-based. So, after I eat the single item that brings the meter up to the threshold, the items on the screen immediately accelerate, wherever they are; and if I miss one more item at that precise moment and the meter goes down, the items decelerate immediately.

 

This behaviour seems a bit odd, especially since it happens in "real time" and affects all items currently on the screen (including the goat itself!) as opposed to waiting for the next set of items to be thrown at the new velocity.

 

There should be a better way that is less weird, I'll try to think of some ideas.

 

-dZ.

Link to comment
Share on other sites

I finally noticed the reason why the middle seasons seem to speed up and slow down. It seems that the speed is not timer-based but score-(or nom)-based. So, after I eat the single item that brings the meter up to the threshold, the items on the screen immediately accelerate, wherever they are; and if I miss one more item at that precise moment and the meter goes down, the items decelerate immediately.

 

This behaviour seems a bit odd, especially since it happens in "real time" and affects all items currently on the screen (including the goat itself!) as opposed to waiting for the next set of items to be thrown at the new velocity.

 

There should be a better way that is less weird, I'll try to think of some ideas.

 

Astrosmash does almost the same thing. However, the objects currently on the screen at the time of the change keep their current momentum and only new objects take on the new speed (whether it's faster or slower).

Link to comment
Share on other sites

Astrosmash does almost the same thing. However, the objects currently on the screen at the time of the change keep their current momentum and only new objects take on the new speed (whether it's faster or slower).

That's fine. The weird thing is when the objects already on the screen speed up and then slow down within a few frames--even the goat in mid-stride.

Link to comment
Share on other sites

 

Astrosmash does almost the same thing. However, the objects currently on the screen at the time of the change keep their current momentum and only new objects take on the new speed (whether it's faster or slower).

 

Then this is another example where I'm coding too much and not playing enough. I would have sworn that Astrosmash objects speed up mid-flight.

 

I think timer-based is more and more likely at this point. I still like the idea of losing points (NOM) for missing things, a la Astrosmash, but there won't be slowdowns. Remember, this mechanism was in place from the get-go, because the game was going to be one long stage like this. Now that it's split up, I think it's time to really re-think how it all works.

 

So - you guys toss suggestions around. Also the farmer changes color based on the speed (and goes through like 6 or 7 "levels"). Does anyone find that helpful? Annoying? Pointless? Amazing?

 

Oh and DZ: your bee idea is in the works, but not in the way you're thinking. I wanna play around with the look first; it's great "on paper" (PSP) but I wanna see what it's like animated.

Link to comment
Share on other sites

I think timer-based is more and more likely at this point. I still like the idea of losing points (NOM) for missing things, a la Astrosmash, but there won't be slowdowns. Remember, this mechanism was in place from the get-go, because the game was going to be one long stage like this. Now that it's split up, I think it's time to really re-think how it all works.

 

I don't think you need to go timer-based, just set a flag when the points cross the threshold and have the next set of objects start with the adjusted velocity.

 

 

So - you guys toss suggestions around. Also the farmer changes color based on the speed (and goes through like 6 or 7 "levels"). Does anyone find that helpful? Annoying? Pointless? Amazing?

 

Didn't notice. I guess that tells you something... :P

 

 

Oh and DZ: your bee idea is in the works, but not in the way you're thinking. I wanna play around with the look first; it's great "on paper" (PSP) but I wanna see what it's like animated.

Coolio!

 

-dZ.

Link to comment
Share on other sites

  • 5 weeks later...

It's baaaaaaaaaaaaaaaack!

 

Real life got in the way of a lot of things lately. And this game is far enough along that it's tricky to implement quick and easy things, so I needed some uninterrupted time to even open the code again. Anyway, some changes:

 

1. Cleaned up "game over" screen. Still need music for this.

 

2. A shit-ton of code cleanup to take advantage of IntyBASIC 1.0 additions. Mostly involving printing large numbers, which you guys won't even see in this ROM yet. That little treat is actually why there was no update for a couple of weeks - I'm working on a completely new addition here. I'm still not satisfied with the mechanics but it's coming closer. Oh, and I removed over a thousand lines of commented code (old code, for the most part). Freed a nice bit of ROM space and variables, too. Hopefully I haven't broken anything in the process. This was a large re-write of some important sections.

 

3. The issue with objects speeding up and slowing down mid-flight - I think I have it solved. Now, the game will still speed up as you fill the NOM meter (and slow down if you miss enough things to reduce the meter). However objects will maintain their velocity from the time they're thrown until they go away. I know this was a real stickler for DZ, and I have to agree with you. It was definitely "programmer logic" in the sense that it seemed OK while writing it, but it's confusing as a game mechanic. It should now behave much like Astrosmash.

 

4. Some hokey Intellivoice additions. Some will be obvious, some less so. Curious on general feedback for those you discover. One is definitely staying; I spent countless hours trying to do this with the PSG and am SOOO happy that the Intellivoice gives me a reasonable facsimile of what I was aiming for.

 

I think that's it - the big change is really the speedup/slowdown logic. I'm interested if it seems to make more sense now, or if I've introduced bugs. I've play-tested a fair bit but like everything, you guys really find the edge cases.

 

Oh, and the general game mechanics have not changed. Winter is still difficult to the point of tedium. I'll work on game balancing .. eventually. Still have a lot of stuff I want to do for the new secret addition. It involves bees.

 

 

goat.rom

  • Like 5
Link to comment
Share on other sites

OK, feedback time. Just on some screenshots. Tarzilla did a fantastic job making a very different title screen, and I spent the morning tweaking it some. I forgot that the damn goat is only 3 MOBs but actually uses 5 cards. So I need to steal from Peter to pay Paul and all of that... anyway - what do you guys think?

 

The old screen has the darker sky, the new one is more "natural" for daylight. I think tarzilla did a frigging bang-up job on the mountains. It's pretty tricky to make this kind of art with the 2 color card limitation but I'm pretty impressed. You have to look a bit to even see the boundaries. Unfortunately I am absolutely maxed on MOBs and GRAM. I might be able to squeeze one more GRAM card, possibly 2 if I sacrifice something, but there's no point unless it's to fix a really horrible blockiness.

post-39446-0-04264500-1418498880_thumb.png

post-39446-0-83221100-1418498880_thumb.png

Edited by freeweed
  • Like 3
Link to comment
Share on other sites

OK, feedback time. Just on some screenshots. Tarzilla did a fantastic job making a very different title screen, and I spent the morning tweaking it some. I forgot that the damn goat is only 3 MOBs but actually uses 5 cards. So I need to steal from Peter to pay Paul and all of that... anyway - what do you guys think?

 

The old screen has the darker sky, the new one is more "natural" for daylight. I think tarzilla did a frigging bang-up job on the mountains. It's pretty tricky to make this kind of art with the 2 color card limitation but I'm pretty impressed. You have to look a bit to even see the boundaries.

 

friggin sweet looking
Link to comment
Share on other sites

OK, feedback time. Just on some screenshots. Tarzilla did a fantastic job making a very different title screen, and I spent the morning tweaking it some. I forgot that the damn goat is only 3 MOBs but actually uses 5 cards. So I need to steal from Peter to pay Paul and all of that... anyway - what do you guys think?

 

The old screen has the darker sky, the new one is more "natural" for daylight. I think tarzilla did a frigging bang-up job on the mountains. It's pretty tricky to make this kind of art with the 2 color card limitation but I'm pretty impressed. You have to look a bit to even see the boundaries. Unfortunately I am absolutely maxed on MOBs and GRAM. I might be able to squeeze one more GRAM card, possibly 2 if I sacrifice something, but there's no point unless it's to fix a really horrible blockiness.

Except you probably don't need 5 simultaneous cards for the goat. I'm assuming 3 for the standing goat, then you need two more cards for change to the legs. Instead of wasting a total of 5 cards for the two frames of animation, you can redefine the leg cards on the fly as the frames don't need to be part of the inital 64 gram definition....

 

If the legs are cards 62 and 63, just define them each frame as required.

 

Define 62,2,Goat_Legs1

then next frame

Define 62,2,Goat_Legs2

 

 

Where

Goat_Legs1:

Bitmap "01000010" etc

rem rest of the definition for the two cards for the legs...

 

Goat_legs2:

Bitmap "0001100" etc

rem rest of the definition for the two cards for the legs...

Link to comment
Share on other sites

OK, feedback time. Just on some screenshots. Tarzilla did a fantastic job making a very different title screen, and I spent the morning tweaking it some. I forgot that the damn goat is only 3 MOBs but actually uses 5 cards. So I need to steal from Peter to pay Paul and all of that... anyway - what do you guys think?

 

The old screen has the darker sky, the new one is more "natural" for daylight. I think tarzilla did a frigging bang-up job on the mountains. It's pretty tricky to make this kind of art with the 2 color card limitation but I'm pretty impressed. You have to look a bit to even see the boundaries. Unfortunately I am absolutely maxed on MOBs and GRAM. I might be able to squeeze one more GRAM card, possibly 2 if I sacrifice something, but there's no point unless it's to fix a really horrible blockiness.

 

 

Looks awesome. I only have one suggestion (of course!): On the left-most mountain peak, you should remove the bottom two white pixels. They form a nice snow pattern, but they also delineate the boundary of the tiles, which is made more obvious by the horizontal black line on its right side. Removing those two pixels should smooth it out a bit and blur the tile boundary. See below.

 

post-27318-0-37783800-1418501275_thumb.png <- Before

post-27318-0-49293200-1418501280_thumb.png <- After

  • Like 1
Link to comment
Share on other sites

 

 

Looks awesome. I only have one suggestion (of course!): On the left-most mountain peak, you should remove the bottom two white pixels. They form a nice snow pattern, but they also delineate the boundary of the tiles, which is made more obvious by the horizontal black line on its right side. Removing those two pixels should smooth it out a bit and blur the tile boundary. See below.

 

attachicon.gifgoatnom-before.png <- Before

attachicon.gifgoatnom-after.png <- After

 

Easy to fix. Can't decide which I like better - the before has an obvious horizontal line. But the after makes the next tile more obviously blocky. It kinda draws attention to it - no?

  • Like 1
Link to comment
Share on other sites

Oh and random observation - jzintv does not display the rightmost column of pixels for me. It actually sorta hides a bit of the card re-use but took me a while to figure out what I was doing wrong (I was counting pixels from the right at one point).

 

That's not jzIntv: the STIC does not display the right-most column of pixels on each frame; jzIntv is just simulating this accurately.

Link to comment
Share on other sites

 

That's not jzIntv: the STIC does not display the right-most column of pixels on each frame; jzIntv is just simulating this accurately.

 

Well I'll be dipped. I'm sure to forget this in the near future, but thanks! This explains some rather terse mentions I've seen of 159x96 resolution. I thought someone made a highly-specific typo.

  • Like 2
Link to comment
Share on other sites

 

Well I'll be dipped. I'm sure to forget this in the near future, but thanks! This explains some rather terse mentions I've seen of 159x96 resolution. I thought someone made a highly-specific typo.

 

Yep. It's a rather interesting and obscure quirk of the STIC. But not one I imagined. I actually had to add code to the STIC emulation to mask out that column. It also factors into border collisions between MOBs and the border.

 

Here's the actual code, including an #if 0'd bit from when I was figuring out the exact dynamics of the 160th column....

.

/* ======================================================================== */
/*  STIC_FIX_BORD -- Trim the display list and MOB image to 159 columns.    */
/* ======================================================================== */
LOCAL void stic_fix_bord(stic_t *stic)
{
    int i, j;
    uint_32 *const RESTRICT mpl_vsb = stic->mpl_vsb;
    uint_32 b_msk;
    int h_dly = stic->raw[0x30] & 7;
 
#if 0
    /* -------------------------------------------------------------------- */
    /*  Make sure column 159 holds nothing interesting, and has no bg bits  */
    /*  beyond column 160 to cause false collisions.                        */
    /* -------------------------------------------------------------------- */
    n_msk = 0xFFFFFFF0 << (h_dly * 4);
    b_msk = 0xFFFFFFFE << (h_dly);
    bord  = stic_color_mask[bord] & ~n_msk;

    for (i = 0; i < 12; i++)
    {
        for (j = 0; j < 8; j++)
        {
            uint_8  new_bmp =  bt_bmp[19*8 + 20*8*i + j] & b_msk;
            bt_bmp[19*8 + 20*8*i + j] = new_bmp;
        }
    }
#endif

    /* -------------------------------------------------------------------- */
    /*  We do the same for the MOBs, but we do this to column 167, because  */
    /*  the MOB bitmap starts 8 pixels to the left of the backtab bitmap.   */
    /* -------------------------------------------------------------------- */
    b_msk = 0xFE000000 << (h_dly);
    for (i = 0; i < 224; i++)
    {
        uint_32 new_vsb =  mpl_vsb[i*6  +  5] & b_msk;
        mpl_vsb[i*6  +  5] = new_vsb;
    }

    /* -------------------------------------------------------------------- */
    /*  Trim the MOB collision bitmaps for left, right edges.               */
    /* -------------------------------------------------------------------- */
    for (i = 0; i < 8; i++)
    {
        uint_32 le_msk, re_msk, msk;
        uint_32 x = (stic->raw[i + 0x00] & 0xFF) + h_dly;

        le_msk = x < 8   ? 0xFFFFFE00 <<  x        : 0;
        re_msk = x > 150 ? 0x00007FFF >> (167 - x) : 0;
        msk    = ~(le_msk | re_msk);

        for (j = 0; j < 16; j++)
            stic->mob_bmp[i][j] &= msk;
    }
}

.

There's another bit further down in the file where I explicitly merge in the border color in column 160. Clipping the display to 159 columns was no accident.

.

/* ======================================================================== */
/*  STIC_MERGE_PLANES -- Merge MOB and BACKTAB planes.                      */
/* ======================================================================== */
LOCAL void stic_merge_planes(stic_t *stic)
{
    uint_32 *const RESTRICT image   = stic->image;
    /*uint_32 *const RESTRICT bt_img  = stic->bt_img;*/
    uint_8  *const RESTRICT bt_bmp  = stic->bt_bmp;
    uint_32 *const RESTRICT xbt_img = stic->xbt_img;
    uint_32 *const RESTRICT xbt_bmp = stic->xbt_bmp;
    uint_32 *const RESTRICT mpl_img = stic->mpl_img;
    uint_32 *const RESTRICT mpl_vsb = stic->mpl_vsb;
    uint_32 *const RESTRICT mpl_pri = stic->mpl_pri;
    int bt, ri, bti_idx, btb_idx, img_idx, bmp_idx, r, c, y, cc;
    int img_ofs;
    int v_dly, h_dly, top, lft;
    uint_32 bord = stic_color_mask[stic->raw[0x2C] & 0xF];

// ... a bunch of stuff snipped ...

    /* -------------------------------------------------------------------- */
    /*  Apply top and bottom borders.                                       */
    /* -------------------------------------------------------------------- */
    top = (stic->raw[0x32] & 2 ? 32 : 16);  /* 32 or 16 rows. */
    memset(image,          bord, top * 192 / 2);
    memset(image + 208*24, bord,  16 * 192 / 2);

    /* -------------------------------------------------------------------- */
    /*  Apply left and right borders.                                       */
    /* -------------------------------------------------------------------- */
    lft = stic->raw[0x32] & 1;
    for (r = 16, ri = 16*24; r < 208; r++, ri += 24)
    {
        image[ri     ] = bord;
        image[ri + 21] = bord;
        if (lft) image[ri + 1] = bord;
    }

    /* -------------------------------------------------------------------- */
    /*  Fill in colors in column 159.                                       */
    /* -------------------------------------------------------------------- */
    for (r = 16 + v_dly, ri = r*24 + 20; r < 208; r++, ri += 24)
        image[ri] = (0xFFFFFFF0 & image[ri]) | (0xF & bord);
}

.

Edited by intvnut
  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...