Jump to content
IGNORED

"Harpy's Curse" - A MetroidVania for the 7800 (Beta version now available!)


Recommended Posts

On 12/1/2022 at 3:15 PM, Revontuli said:

I finally tested the game on my DragonFly - it seems to play well - although hearts dropped by enemies show up as black - I might update my firmware and see if that works.  Oddly, I've had more trouble running my *other* games on the DragonFly, but I haven't really run that SD Cart through the battery of tests that I should.  I know it's probably fine, but I'm always a little wary of subjecting my old 7800 (which buzzes if a stray piece of dust lands on it :P ) to the pass-through power the DragonFly needs.  If/when I go full POKEY, the DragonFly will be my go-to, of course.

You do know, you don't have to use the passthrough cable on the DF cart right? You can plug a PSU into the DF to power it, and then plus your 7800 separately. Just don't power on the 7800 until the DF cart says to do so. This was how a few owners of the DF had to run theirs until I replaced out the VRs I had originally installed since the DF wasn't providing enough voltage through the passthrough for that particular regulator I had used to work properly.

 

And if you haven't updated your DF's core yet, you really should just be sure you can rule it out as being the cause of any issues you experience. 

 

That said, I've never had any issues running anything on my DF on any of the consoles I've serviced so it might be a specific DF to DF thing when I hear about folks having issues with theirs. Conversely to that, I have far more issues with my Concerto in that there are several games that just won't load up on it on most of the 7800s I've used it with. The 7800 hardware is just a hostile place...

 

 

  • Like 2

 

On 12/5/2022 at 6:38 AM, -^CrossBow^- said:

And if you haven't updated your DF's core yet, you really should just be sure you can rule it out as being the cause of any issues you experience. 

 

This project is giving me a good reason to learn and properly use the Dragonfly - I got it specifically for development purposes.  That said, it's a more sophisticated (and complicated) device than the Concerto, which has been my usual go-to.  As for the power source, it took a awhile before I found a proper DC plug for the DF (long and very boring story), and I just have the skittish philosophy that the fewer plugs coming from the direction of my aging 7800 the better.  This was also a time when I was testing my other games for eventual use on a cartridge (and I had such a testing system working with the Concerto), so the last thing I needed was some new piece of hardware breaking *something* in that fragile pipeline.  It was a little paranoid, but programmers can be a cautious lot.

 

Harpy's Curse is still a "normal" ROM size that the Concerto can handle, and still uses the TIA, but the features I want to implement next will require the Dragonfly to properly test.

 

On 12/5/2022 at 6:38 AM, -^CrossBow^- said:

The 7800 hardware is just a hostile place...

Indeed - even at PRGE I got different behaviors from the same game cart of different systems. 

 

The DragonFly is an awesome piece of tech - I feel bad it's been this long before I've really dove into using it!

 

Anyway...One final post teasing a release - I've a "candidate" build I want to rest on and make sure there's nothing left that needs a quick fix.  The level design will always need tweaking, but I want to see how folks play with what's currently there.  Same with graphics and any number of little things.  I also might post it a little later in the week so folks have it in mind as the weekend approaches...

 

What this version will have:

-Several items to find

-4 special power ups among those items

-500+ screens to explore

-5 Bosses

-Password system for saving progress

-Ending sequence

 

Basically a full game.  I'm holding back some features that I still need to finish (and give folks reason for coming back here :) )

 

What this beta won't have:  

2nd Quest

POKEY music

SaveKey support (although it's in there, but it needs more testing and a few emulators don't like it)

A few other secrets...

 

image.png.715d0371700241dd4dbaeb338fe0f143.png

 

Hopefully the next post I make will be a build for folks to play!

Edited by Revontuli
  • Like 7

I edited the original post, but the game is in public beta now, which means y'all can try it out!  I'll post the builds here as well:

 

HarpysCurse_12_6_2022.bas.a78

HarpysCurse_12_6_2022.bas.bin

 

Any feedback, found bugs, etc. appreciated!  

Edited by Revontuli
  • Like 8
  • Thanks 3

ZeroPage Homebrew is playing Harpy's Curse on tomorrow's ZPH stream LIVE on Twitch, hope you can join us!

 

Games:

After Dark:

  • Orbital War (Retail | 2600) by Leandro Camara @HSW3ET (Programming, Design and Soundtrack) / Heitor Maciel (Programming Consulting) / Viviane Peçaibes (Design and Text Consulting)

1984551876_20221209-LetsPlay.thumb.jpg.ee3a72bb7f21eee909697f0040d72a34.jpg

 

  • Like 4
  • Thanks 2
On 12/7/2022 at 7:27 PM, Revontuli said:

Any feedback, found bugs, etc. appreciated!  

What a fantastically glorious game!  The dragon trilogy is a wonderful set of games, this though, is next level.  

 

The opening is a nice appetizer to start things off.  I would be less than honest to deny I was dreaming of attacks more in line with Descent (though at a much slower pace), from the trilogy; however, what is present here, does provide somewhat of a unique experience, which requires a significant adjustment/break-in period for better or worse.  

 

An item that may benefit from a significant change is the sound effect of jumping/flying.  Currently, it is a hop-chirp like effect that is a bit pitchy.  It can be nerve touching/annoying when heard continuously.  It does not seem to work well for a very large portion of the protagonist's movement, that is performed very often on a regular basis.

 

Leaning on the elevator pitch of "Joust meets Metroid", perhaps the effect can be more of a 'wings flapping' sound akin to the one heard in Joust, which denotes a majestic sweeping motion.  If somewhat divided on which effect works better, perhaps have the jump/flying effect as a menu select option as either "chirp" or "flap".

 

On the other hand, the higher shrill sound for attacks works well.  It sounds beautifully nailed, conveying the appropriate tone and mood for attacking the enemy.

 

During the weekend, I should have a significant amount of additional quality time with the game.  Really looking forward to diving even deeper with this title.  There is a lot of area to traverse.

  • Like 4
  • Thanks 1

This is fantastic piece of work Todd, really nice job. I had a bit of time this evening and thought I'd give it a quick 5 minutes test out. 30 minutes later .... :D 

 

Plays fine on the Dragonfly. 

 

Look forward to how this develops, the feature set is already rich.

 

 

 

 

  • Like 3
  • Thanks 1

Really enjoying the game so far. It takes a little while to get into the flow of the game as the flight and combat is kind of tricky at first which is fine. I am pretty far in the game I think, have 4 feather power-ups, beat 2 bosses, have 2 keys, 8 max health, and the reincarnation item.

 

The up attack from off of the ground is perfect. The basic dive attack is good too, it sucks if you miss with it and dive into another screen level by accident but I feel that overall that prevents you from trying to use it from really far away to cheese things. Only attack I have had an issue with is the side attack. Once you have double damage, or if you get that feather first, it works great and kind of is your bread and butter then, but, if you still need 2 hits to kill basic enemies I have found that because of the slow speed of the attack and the relatively short range I often would hit an enemy and not fully end up clear of the enemy when the attack I frames ran out so I would immediately take a hit for my troubles.

 

Visuals look good and I like the color schemes of the different areas. Core mechanics all seem fine. Audio-wise I really like the cute flapping sound and the metallic "tink!" sound when you land. Collision sounds are fine but nothing spectacular. The soundtrack I understand is subject to potential changes in the future. If the existing melodies where converted to Pokey tracks and fleshed out slightly I think the basic tunes and tempos are fine as they are. If the soundtrack stays TIA, I think the songs' melodies are fine but other than the boss music I would up the tempo of everything some. The tracks can kind of drag and blend together.

 

Great job with this game! Looking forward to getting this on cartridge when it is finalized.

 

EDIT-I just finished the game.Didn't notice any glitches. Also found a secret lol. I won't tell where it is 😛 

E27A5F8F-9C5A-467D-A3FD-CBAF295169F4.heic F93FC47E-64CA-4EFC-9AE5-7BD24859A26E.heic

Edited by Lord_of_Sipan
  • Like 2
  • Thanks 1

 

18 hours ago, Trebor said:

An item that may benefit from a significant change is the sound effect of jumping/flying.  Currently, it is a hop-chirp like effect that is a bit pitchy.  It can be nerve touching/annoying when heard continuously.

This is an ongoing concern, and I was wondering if/when someone would mention something.  I've tried the game with *no* flapping sound and it doesn't really work well - *some* audio feedback is nice and augments the button input.  You do hear the sound quite a bit though, so I'm continuing to play with it - trending towards lower volumes and frequencies, but even those can get annoying.  Random pitch adjustment is another thing, but the resolution of the TIA only goes so far.  We'll see (or rather hear...)

 

5 hours ago, Lord_of_Sipan said:

If the existing melodies where converted to Pokey tracks and fleshed out slightly I think the basic tunes and tempos are fine as they are. If the soundtrack stays TIA, I think the songs' melodies are fine but other than the boss music I would up the tempo of everything some. The tracks can kind of drag and blend together.

The tunes were taken from works of Erik Satie, although they gain their own sound when filtered through the TIA.  I'll likely still mess with the tempos, but I'm aiming for ambience (it's more forgiving than trying to hold a catchy upbeat tune in this case 😅)  It's a tightrope with that sound chip whenever one attempts music, and I'll the count the fact that you apparently didn't turn the music off a minor victory :P  I'll see about space, but I might keep the TIA soundtrack as a fallback for folks without access to POKEY for the moment.  Once I go POKEY, a lot of emulation and SD Cart options get more complicated.

 

5 hours ago, Lord_of_Sipan said:

Only attack I have had an issue with is the side attack...because of the slow speed of the attack and the relatively short range I often would hit an enemy and not fully end up clear of the enemy when the attack I frames ran out so I would immediately take a hit for my troubles.

The side attack is handy, but its major feature is that it's the only way to attack when underwater, and, like the basic attack, timing is everything.  The "kick back" you get from both is in part to have you rebound a safe distance, and there's a knack and rhythm to "leaning into" that, while doing a quick follow-up attack.  Mastering that tempo can be very helpful when going against bosses.  I'm still messing with some of the timing of the dash attacks as well, so this is on my radar! 

 

5 hours ago, Lord_of_Sipan said:

I just finished the game.Didn't notice any glitches. Also found a secret lol. I won't tell where it is 😛 

Awesome, thank you, and congratulations!!!  I think you're the first on the forums to complete the game!  Also, remember that secret, it might figure into a later build...

  • Like 3

Like I said, I like the flap sound personally; I think it has an “authentic” sounding 8-bit cuteness that a lot of folks avoid these days on retro projects because it doesn’t come across as serious. I just think it’s fun and I like that it stands out from other sound effects and the lower pitched music. Having beaten the game after I wrote my initial comments on the side attack, I agree with you that it actually works fine as is. It’s mainly a utility attack for underwater with some uses in halls and that is fine. I think I didn’t realize how good the basic attack is with double damage until I used it a ton on the final boss.

 

The password system is awesome and the overall size of the game map feels right. It seems to me to be pretty close to nes Metroid in overall map size or at least feels like it is.

  • Thanks 1

I'm sure there will be even more, but right now I have two words for you all:

 

Gorgon Feather

 

Additionally, I have to stop myself 'wasting' time admiring the scrolling, seamless and immediate screen transitions. 

 

Whether scrolling left or right, or changing of complete screen background patterns, colors and designs, while moving vertically, it is highly admirable...buttery smooth!

  • Like 2
  • Thanks 1
51 minutes ago, Trebor said:

Striking downward at an angle from the screen above - attacking, I wound up breaking through to/landing on, the other side:

 

image.png.eb76a517a771684ed1fbed37e935d127.png

I did it too. It was strange like I got sucked through the wall or something

  • Thanks 1
1 hour ago, Trebor said:

Striking downward at an angle from the screen above - attacking, I wound up breaking through to/landing on, the other side:

 

image.png.eb76a517a771684ed1fbed37e935d127.png

Ah, I think I know what's going there - There are some tile setups that have a possibility of "shunting" the player if they hit the spot *just* right.  I think it's the 1-tile wide gap areas - like the one on the other side of the pillar from the player in the screen shot.  I'm doing a sweep of such places to clean them up, although I'm tempted to keep a few in for speedrunners if the glitch is not *too* reproducible.  If I can get to the point where *is* easily reproducible I might be able to patch over it, although, again, it seems to be in particular (and rare) places.

Edited by Revontuli
  • Like 1

I've finally gotten the chance to play through this since your first demo. This is absolutely a great presentation! Great job all around. I love the intro screen and artwork.

 

One thing I had an issue with was debouncing when hitting the password scroll. I'm already flapping so when I hit it the fire button selects the exit option before I even got the chance to see the password code. I was able to go back and do it again more carefully, but something to consider.

 

You could either add a debounce to that before showing the screen or add a wider platform so that the users can simply walk over to it without issue.

 

I can't wait to play more!

Edited by saxmeister
  • Thanks 1
29 minutes ago, saxmeister said:

One thing I had an issue with was debouncing when hitting the password scroll

I knew I forgot to debounce one of the menus 😆

 

1 hour ago, Trebor said:

That moment when you think you have a better name for the developer to replace "Gorgon Feather"

My (admittedly roundabout) reasoning for that was stone->ground->ground-based updash.  A bit of a stretch, but folks seem to like that particular power up, and you'll notice some theme naming here and there :)

 

Thank y'all for the feedback so far.  I'm working away at some future features, we'll see how things go.

 

On that note - 

@RevEng - a quick question: I know "playsfx" works with Pokey (you just need to set the sample to 32 bits instead of 16, correct?)  - The pitch shift parameter doesn't seem to work (but works fine with a TIA sample).  Looking through the code, it looks like it's supported, but am I missing something?  I'm using 7800Basic version 0.19 (I'm reluctant to update this late in the development cycle on a game, but will, of course, if this is something addressed in .20 version). Would making a music tracker with something like "playsfx pokeyInsturment pokeyNote" as the base be a feasible route to go?  

  • Like 1
8 hours ago, Revontuli said:

@RevEng - a quick question: I know "playsfx" works with Pokey (you just need to set the sample to 32 bits instead of 16, correct?)  - The pitch shift parameter doesn't seem to work (but works fine with a TIA sample).  Looking through the code, it looks like it's supported, but am I missing something?  I'm using 7800Basic version 0.19 (I'm reluctant to update this late in the development cycle on a game, but will, of course, if this is something addressed in .20 version). Would making a music tracker with something like "playsfx pokeyInsturment pokeyNote" as the base be a feasible route to go?  

The pokey support into playsfx was a bit beta, so the lack of pitch shift is probably a bug on my side. it's not like there's much required from the game in terms of pitch shift. I'll take a look.

 

Originally the idea with the 7800basic MML tracker was that pokey would be integrated right into it, with you just needing to select a pokey instrument for a track instead of a tia one. I kind of stopped working along those lines when it was apparent XM wasn't going to happen. It also seemed like most of the 7800basic coder base wanted to sub out to the music to musicians, and the built-in MML tracker isn't well suited for that since it's more of a programmer-musician tool. I could be wrong, but I think it's just you and me that have used the MML tracker for full songs at this point.

 

I'll look at taking on the MML pokey integration at some point, but it's not trivial, so I wouldn't count on it for this game. I've been busy working on already promised stuff, like banksets and pokey RMT tracker support, and even when those I done there's other stuff queued up ahead of MML pokey.

  • Like 5
  • Thanks 1

 

The update seems to work - thank you!

5 hours ago, RevEng said:

I'll look at taking on the MML pokey integration at some point, but it's not trivial, so I wouldn't count on it for this game. I've been busy working on already promised stuff, like banksets and pokey RMT tracker support, and even when those I done there's other stuff queued up ahead of MML pokey.

Totally understandable.  I've gotten a lot of good use out of the MML, and it works wonderfully for TIA, but I see that it would take a lot of non-trivial work to get something comparable for POKEY.    Honestly I think something like RMT tracker support makes more sense for POKEY music in the long run.  The pitch shift is handy, though, not only for notes but to vary repetitive sfx.  It was only on re-reading the documentation that I realized that I could try making a simple tracker relatively easily given the existing sfx commands.  I already have/made a few scripts that convert MIDI->Text->7800Basic Data arrays, so we'll see where this goes!

 

  • Like 2

Got a MIDI->POKEY pipeline working (duct tape, spaghetti code and all :))  

 

Here's a taste test of the beginning of one of the tracks (Erik Satie's Gymnopedie #1) arranged for the TIA vs. the track in POKEY:

 

   

 

Part of me still likes the character of the TIA version, but that track is also the result of a lot more attention and tinkering to fit it into one and a half poorly tuned octaves.  The POKEY is more-or-less a straight MIDI conversion with no extra attention.  The POKEY has more resolution (and potential) obviously, but I'll want to experiment and try to get more out of it before I can really justify its inclusion on Harpy's Curse. 

 

I would like some advice on loading an array of more than 256 bytes into RAM.  I'm currently using a pointer and incrementing it to grab the data I want in the array.  That approach seems to work great, but:

 

-I wanted to make sure storing more than 256 bytes of data in the 7800Basic syntax is OK (it seems to be OK - I got the tune below working)

-This is how I'm incrementing the point in code (yeah, it's a little dangerous, but pointers often are:)

   ;notes are loaded 2 bytes at a time, defining a delay and a pitch
   pokeyIndexDelayCounter = pokeySongpointer[[0]] 
   pokeySongpointer = pokeySongpointer + 1
   if pokeySongpointer = 0 then pokeySongpointerhi = pokeySongpointerhi + 1
   pokeyNote = pokeySongpointer[[0]] 
  (etc...)

-How would you recommend loading a block of such code into RAM?  I have a largely unused 16K RAM bank (and another one of ROM) for just this purpose.  sdata seems like it could work, but looping through a few hundred bytes, one at a time, seems a little inefficient (although I generally don't need to load a whole song during gameplay).  I'm also looking at memcpy and hijacking an alphadata definition as a starting point - again, a little ill-advised, but I'll know how many bytes a given song with be.  Or am I totally barking up the wrong tree(s)?  (I also realized that the pointers I'm using assume you're looking at ROM, not RAM - any recommended apporaches to incrementing through RAM addresses, one, two, or three bytes at a time over ~1 kilobyte?)

 

Apologies if this was covered in another thread - I found a few that helped me get this far, and I think I could work out something on my own, but I'm doing enough questionable things that I would like a second opinion before taking the next step, in case I'm missing anything obvious (or obviously dangerous :P)

 

I also realize a lot of this would be relatively trivial with some strategic assembly, but that also could invite trouble if there's an alternate way to do it in 7800Basic.

 

@RevEng your help on this topic has already been much appreciated - the pitch shifting saved me a ton of time and effort, and I'd welcome any other advice and pointers (especially ones for memory)!  Of course, it goes without saying that I'm a fan of 7800Basic in general :)

  

Here's a more complete version of the tune so far:

Also gave the game a quick spin on the Dragonfly, and it seems to work with this inital POKEY stuff, but I have a feeling I'll be spending more and more time there making sure things run (and sound) ok...

 

 

 

Edited by Revontuli
  • Like 1
  • Thanks 1
53 minutes ago, Revontuli said:

Part of me still likes the character of the TIA version, but that track is also the result of a lot more attention and tinkering to fit it into one and a half poorly tuned octaves.  The POKEY is more-or-less a straight MIDI conversion with no extra attention.  The POKEY has more resolution (and potential) obviously, but I'll want to experiment and try to get more out of it before I can really justify its inclusion on Harpy's Curse. 

 

I love this attitude (use extra hardware if the results justify it, and not if they don't).

 

There's another message here, which is that making it easy to get good results is a form of power, one that sometimes gets ignored when people talk about how powerful some chip or console is.

 

With POKEY 8-bit channels, it's a lot easier to get good results than TIA, but you still have to be careful. For this Satie piece, that conversion doesn't sound bad at all, but there are a few different ways to do it, and I think with some experimentation you might find something you like better.

 

Let me know if you'd like me to take a more detailed look or provide more specific suggestions. Feel free to PM if you'd prefer.

  • Thanks 1

I personally love what you have done with the TIA, and I definitely don't think it would be a bad thing if you ended up deciding that adding POKEY wouldn't be justified for reasons of code size or cart cost.

 

I'll take a stab at some of your questions myself.

 

4 hours ago, Revontuli said:

I wanted to make sure storing more than 256 bytes of data in the 7800Basic syntax is OK

Yeah; it's just regular data, and going over 256 bytes won't cause any issues. The 256 byte limitation is only when accessing the data in the "normal" 7800basic manner.

 

4 hours ago, Revontuli said:

-This is how I'm incrementing the point in code (yeah, it's a little dangerous, but pointers often are:)

   ;notes are loaded 2 bytes at a time, defining a delay and a pitch
   pokeyIndexDelayCounter = pokeySongpointer[[0]] 
   pokeySongpointer = pokeySongpointer + 1
   if pokeySongpointer = 0 then pokeySongpointerhi = pokeySongpointerhi + 1
   pokeyNote = pokeySongpointer[[0]] 
  (etc...)

 

Nothing looks "dangerous" about your approach so long as you know when to stop/reset. You could use the CARRY flag instead of checking for 0, but it ends up having the same effect either way.

 

In terms of efficiency, it looks like you are using one table for the whole song instead of one table for each POKEY channel? If you did the latter, then it might be more efficient in that you don't have to update your pointer as often.

 

4 hours ago, Revontuli said:

How would you recommend loading a block of such code into RAM?  I have a largely unused 16K RAM bank (and another one of ROM) for just this purpose.  sdata seems like it could work, but looping through a few hundred bytes, one at a time, seems a little inefficient (although I generally don't need to load a whole song during gameplay).  I'm also looking at memcpy and hijacking an alphadata definition as a starting point - again, a little ill-advised, but I'll know how many bytes a given song with be.

If you know the number of bytes you are loading, then memcpy does seem like it would be the best choice. It's a routine specifically designed to copy large chunks of data like that.

 

  • Like 2
  • Thanks 1

I know I was @'ed for technical advice, but I'm mostly going to just co-sign comments by Karl and Pat.

 

I know firsthand that midi conversions can take up a fair bit of rom, since it's "performance" data and missing pattern structure. You might consider switching from memcpy to using lz4 (de)compression at some point, if rom is tight.

  • Like 1
  • Thanks 1

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...