Jump to content
IGNORED

Ghostbusters - Development Diary


TheMole

Recommended Posts

16 hours ago, TheMole said:

So if anyone wants to come up with some nice ghost designs, please do let me know (a ghost needs to fit in a 2-color/layer 16x16 sprite).

Outside my ability right now.  I do think in the spirit of Thanksgiving, a ghost of turkeys past would be funny :)

 

Took a few minutes to play.  I ran into one strange and one show-stopper.  The strange was there are instances when vacuuming ghosts conflicts with the periodic noise in the BGM, the periodic noise channel stays on and does not shut off until the song restarts.  The shop-stopper happened after I missed a ghost, it slimed me but I just laid there on the ground and the game hung.  It did not freeze, as the BGM kept running and I can call up my stats with SPACE.

 

Oh, interesting... after several minutes the ghost re-appeared at the top of the screen, fled, Venkman lamented, and the game continued.

 

Marshmallow man is a bastard.  After I lost the game, the karaoke restarted with the first line of "ABCDEFGHIJKLMNOPQRSTUVWXYZ!" something or other.  The ball does not bounce on the words, sneaky ;)

 

Gotta go to bed, now.  My first class is tomorrow at 7am.

Link to comment
Share on other sites

1 hour ago, RickyDean said:

Works on the both the 32 bit and 64 bit version for me? Also on JS99er, though the words were garbled a bit it seemed.

You mean the speech sample? Yeah, it doesn't play as nicely in js99er as it does in Mame for me either. Assuming that's due to the slightly more limited resources available in the browser.

Link to comment
Share on other sites

52 minutes ago, OLD CS1 said:

The strange was there are instances when vacuuming ghosts conflicts with the periodic noise in the BGM, the periodic noise channel stays on and does not shut off until the song restarts. 

 

The shop-stopper happened after I missed a ghost, it slimed me but I just laid there on the ground and the game hung.  It did not freeze, as the BGM kept running and I can call up my stats with SPACE.

Oh, interesting... after several minutes the ghost re-appeared at the top of the screen, fled, Venkman lamented, and the game continued.

 

Marshmallow man is a bastard.

 

After I lost the game, the karaoke restarted with the first line of "ABCDEFGHIJKLMNOPQRSTUVWXYZ!" something or other.  The ball does not bounce on the words, sneaky ;)

 

Ah, crap, I thought I had fixed the sfx keeps playing over the music when changing screens thing... back to the drawing board on that one.

 

I'll look at why the show-stopper you mentioned occured, haven't seen that myself but I have an idea.

 

Which marshmallow man? The one on the map, or the big one at the end? :)

 

I'll look at the karaoke restart thing as well, seems some variables aren't properly reset when restarting the game... Yeah, I litterly spent all of Sunday trying to get the ball to align somewhat with the words and this is the best I could get. I'll tweak it some more before I start thinking about burning roms, but in my defence, the SMS version does the same: it just bounces the ball quickly over the lyric roughly approximating how many syllables there are in that line :).

 

Link to comment
Share on other sites

I should probably add something about the controls for those that don't know the original:

  • On the map, press up/down on the joystick and 'FIRE' to go to a building
  • When the marshmallow warning appears, quickly press 'B' to drop some bait to lure the the marshmallow man to your position and keep it from destroying a building
  • Press 'SPACE' to show your stats (battery, traps and men left)
  • On the 'catching' screen: after positioning your men, when firing the beams, your men can only come closer to each other. Keep that in mind when positioning them
  • In the store:
    • press up/down to move your little forklift to the item you want to buy
    • press 'FIRE' to pick it up/put it down
    • press right/left to move to/from the car.

Control schemes of these old games were a bit weird... I remember struggling quite a bit with some of this when I was a kid, not having a manual and all...

 

  • Like 4
Link to comment
Share on other sites

7 hours ago, TheMole said:

here are the roms:

It may be more consistent with other distributions, if both the single .bin and .bin file within the .rpk was an "8.bin".

 

I was using it on a real NTSC console, seems ok.  I'm not sure what happened in the shop at the start - I was pressing 1, 2 & 3 to view things to buy and the game started by itself, maybe I pressed the wrong key?  I had a car but no traps and it kept telling me to return to HQ when trying to get to the ghosts/buildings, and it was a long drive each time, though I don't think I ever got to leave HQ, since I had no traps.

  • Like 1
Link to comment
Share on other sites

Spent some time looking at the bug reports today. Thanks all for testing!

Here's what I have so far:

 

On 11/6/2023 at 1:18 PM, OLD CS1 said:

The strange was there are instances when vacuuming ghosts conflicts with the periodic noise in the BGM, the periodic noise channel stays on and does not shut off until the song restarts. 

 

The shop-stopper happened after I missed a ghost, it slimed me but I just laid there on the ground and the game hung.  It did not freeze, as the BGM kept running and I can call up my stats with SPACE. Oh, interesting... after several minutes the ghost re-appeared at the top of the screen, fled, Venkman lamented, and the game continued.

 

After I lost the game, the karaoke restarted with the first line of "ABCDEFGHIJKLMNOPQRSTUVWXYZ!" something or other.

 

I think I've managed to fix the issue with the hanging sound effects and the karaoke restart issue. The first was probably a misunderstanding of how Tursi's player works, the second a variable that wasn't properly reset.

 

I did not manage to reproduce the bigger bug though, I spent a few games intentionally missing all ghosts in all sorts of ways and didn't run into the problem you described once. Are there more details you can share to help me reproduce this, eg:

  • I assume you were playing on Classic99?
  • Did it happen just once, or multiple times? Did you miss any other ghosts during that game?
  • What was your equipment list (car, number of traps, etc...) and status (batteries, men, traps...)?
  • ...

 

20 hours ago, JasonACT said:

I'm not sure what happened in the shop at the start - I was pressing 1, 2 & 3 to view things to buy and the game started by itself, maybe I pressed the wrong key?  I had a car but no traps and it kept telling me to return to HQ when trying to get to the ghosts/buildings, and it was a long drive each time, though I don't think I ever got to leave HQ, since I had no traps.

I tried it in mame, js99er and Bulwip (don't have real hardware or a way to run windows apps here), and I couldn't reproduce this one either. In fact, you're not supposed to be able to leave the shop without at least one trap, so even if you accidentally pressed enter (or my keyscan code isn't working as expected) this still shouldn't be possible. If you manage to get into the game without traps, the symptoms you describe all make sense though. With zero empty traps, it won't let you go into any buildings except for GHQ. When going to GHQ it will "empty" all your traps, but in this case that would still leave you with zero empty traps (because you have zero traps to begin with, nothing to empty...). Did you manage to buy anything at all, except for the car in the shop? How long were you 'browsing' when it happened? Was it quite quick, or did you manage to see some the items? Did it happen just the one time, or is it consistent? Sorry for the barage of questions, but since you are the only one that I can confirm tested on real iron, I'm really eager to learn more about this one.

 

Anyway, here's a video of me trying to reproduce this bug in mame. Note the message near the bottom of the screen when I try to leave the shop without having purchased a trap:

 

9 hours ago, OX. said:

The music momentarily gets faster between screens, using MAME 252.

 

It's excellent btw and becoming the best version out there imho.

Thanks, that's very high praise! :)

Yes, the music speeding up is tricky... the game is copying data from ROM to VRAM when the screen is black, and I'm basically guessing how many bytes I can transfer before needing to tend to the music playback, which depends on how the data is laid out across the banks. I tweaked the byte counter a bit, maybe the next build is a bit more accurate...

 

I should probably try to use the ISR hook instead though, or at least enable wait for VBLANK when copying stuff over and things go faster than expected (I tried to avoid this to minimize the amount of time the screen blanks in between segments of the game). Porting this over to the Geneve is going to be a nightmare otherwise...

 

New versions with the few fixes mentioned above are attached below for those that want to give it another spin.

ghostbusters.rpk ghostbusters8.bin

Edited by TheMole
  • Like 7
  • Thanks 1
Link to comment
Share on other sites

1 hour ago, TheMole said:

or my keyscan code isn't working as expected

Ah, I don't think it is working quite right.  I was in the shop for ages the first time too, like a really long time, because I only ever played this game once at a mate's grandparents place who had it on the C64 there.  They wouldn't give me a copy.  So I was really taking my time, switching between screens thinking what to buy.  I've also been using my latest Pi Pico board, but I've gone back to my prototype for the moment, because I'm seeing other issues with the new board (very sad, I have to say).  And I can't reproduce this on the prototype board....

 

But, with your keyscan routine, in both my old board and Classic99, if you wait long enough in the shop, the screen goes blank (black) and pressing a key does not bring the screen back (you are stuck in screen-saver mode, I assume).  I guess if you're using scratchpad ram for various things, the screen saver counter bytes being changed might be doing something bad to the game?

 

Anyway, sorry for the bad report.  I'll make sure I do more testing next time.

  • Like 1
Link to comment
Share on other sites

26 minutes ago, JasonACT said:

But, with your keyscan routine, in both my old board and Classic99, if you wait long enough in the shop, the screen goes blank (black) and pressing a key does not bring the screen back (you are stuck in screen-saver mode, I assume).  I guess if you're using scratchpad ram for various things, the screen saver counter bytes being changed might be doing something bad to the game?

 

Anyway, sorry for the bad report.  I'll make sure I do more testing next time.

No, no worries, you're supposed to play the game, making sure it works right is my responsibility :)

 

But this update is great, I have a lead now! I'll look at the screensaver thing, I normally set the counter to an odd number, since the ISR increase it by 2 it should never hit zero and enable the screensaver... BUT, I think I'm doing it at the wrong place, I didn't have the shop early on and might be setting the counter much later in the game since those screens needed it early on.

  • Like 4
Link to comment
Share on other sites

2 hours ago, TheMole said:

I should probably try to use the ISR hook instead though, or at least enable wait for VBLANK when copying stuff over and things go faster than expected (I tried to avoid this to minimize the amount of time the screen blanks in between segments of the game). 

What I do is check the interrupt more often than I need to - leave interrupts off, and every so often you can just poll the VDP interrupt, and if it's pending, then play music and clear it, otherwise go back to work. The current version of libti99 doesn't make this easy, since it only has the wait function, but what you can do is run VDP_INT_POLL and then check the interrupt counter to see if it ran - if it did, play music too. You would need to track the previous interrupt counter to do that. Something like:

 

void handleMusicSync() {
  static unsigned char oldIntCounter = 0;

  VDP_INT_POLL;
  if (oldIntCounter != VDP_INT_COUNTER) {
    oldIntCounter = VDP_INT_COUNTER;
    playMusic();  // whatever function you are running music through
  }
}

 

Then you can just call handleMusicSync() in your work loop every so often, and if the music is due then it will play, and if it's not it won't. This /will/ let the console interrupt run, too, which means QUIT works... but if you don't want that, you can just check the CRU bit with a little inline assembly (check VDP_WAIT_VBLANK_CRU_STATUS - adapt it not to loop), or read VDPST directly (which has a very small chance of missing an interrupt). That way you don't need to guess, anyway.

 

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

42 minutes ago, JasonACT said:

But, with your keyscan routine, in both my old board and Classic99, if you wait long enough in the shop, the screen goes blank (black) and pressing a key does not bring the screen back (you are stuck in screen-saver mode, I assume).  I guess if you're using scratchpad ram for various things, the screen saver counter bytes being changed might be doing something bad to the game?

Ah, this one hits me all the time. It means you are using a custom KSCAN but still letting the VDP interrupt run. The custom KSCAN will never reset the screen blank counter or VDP R1, but the console interrupt will still blank.

 

If you want to allow the screen to blank, then you need to manually restore VDP R1 on keypress and reset the counter. If you don't care, then just set the counter to an odd number and it will never clear. That's a 16-bit word at >83D6 - set it to 1 or -1 and it'll loop forever without the screen blanking.

 

  • Like 4
Link to comment
Share on other sites

5 hours ago, TheMole said:
  • I assume you were playing on Classic99?
  • Did it happen just once, or multiple times? Did you miss any other ghosts during that game?
  • What was your equipment list (car, number of traps, etc...) and status (batteries, men, traps...)?
  • ...

Classic99, only happened once, I had missed other ghosts, using the hearse with spooky vision, bait, vacuum, three traps.  I had two men remaining, 94% charge, city PKE was between 3,000 and 4,000.  That is all I have.

 

The next time I play it will be on a real machine and it will be recorded.  Maybe I will run into issues which can be captured.

  • Like 4
Link to comment
Share on other sites

3 minutes ago, OLD CS1 said:

Classic99, only happened once, I had missed other ghosts, using the hearse with spooky vision, bait, vacuum, three traps.  I had two men remaining, 94% charge, city PKE was between 3,000 and 4,000.  That is all I have.

 

The next time I play it will be on a real machine and it will be recorded.  Maybe I will run into issues which can be captured.

Thanks, that is incredibly close to my typical equipment setup... Smells like a timing issue with the many counters that control the game's progression, this is going to be a nightmare to reproduce. I'll sanitize the logic a bit and we'll see how it goes.

 

Please do share the recording, would love to see how it looks running on the real thing!

Link to comment
Share on other sites

2 hours ago, Tursi said:

What I do is check the interrupt more often than I need to - leave interrupts off, and every so often you can just poll the VDP interrupt, and if it's pending, then play music and clear it, otherwise go back to work. The current version of libti99 doesn't make this easy, since it only has the wait function, but what you can do is run VDP_INT_POLL and then check the interrupt counter to see if it ran - if it did, play music too. You would need to track the previous interrupt counter to do that. Something like:

 

void handleMusicSync() {
  static unsigned char oldIntCounter = 0;

  VDP_INT_POLL;
  if (oldIntCounter != VDP_INT_COUNTER) {
    oldIntCounter = VDP_INT_COUNTER;
    playMusic();  // whatever function you are running music through
  }
}

 

Then you can just call handleMusicSync() in your work loop every so often, and if the music is due then it will play, and if it's not it won't. This /will/ let the console interrupt run, too, which means QUIT works... but if you don't want that, you can just check the CRU bit with a little inline assembly (check VDP_WAIT_VBLANK_CRU_STATUS - adapt it not to loop), or read VDPST directly (which has a very small chance of missing an interrupt). That way you don't need to guess, anyway.

 

Indeed, I ended up doing exactly this! I tried it in the past and it didn't work, I couldn't figure out why at he time... Turns out, when I blank the screen, I /only/ set the blanking bit in R1, ergo: the interrupt bit was /not/ set... no interrupts! D'oh!

 

Simple fix though :)

 

*edit* just to be clear, this is not in the latest build available in this thread... I made this change right after posting the previous update and before having to rush to the airport (priorities, right?). I'll upload a new version once I've had a chance to get over my jetlag... ;)

Edited by TheMole
  • Like 4
Link to comment
Share on other sites

2 hours ago, Tursi said:

Ah, this one hits me all the time. It means you are using a custom KSCAN but still letting the VDP interrupt run. The custom KSCAN will never reset the screen blank counter or VDP R1, but the console interrupt will still blank.

Setting the counter to an odd number should work though, right? I remember reading about that trick somewhere...

Link to comment
Share on other sites

7 hours ago, TheMole said:

Setting the counter to an odd number should work though, right? I remember reading about that trick somewhere...

 

Yes, as long as the console KSCAN is not used for getting a keystroke. KSCAN resets the counter to 0 upon detecting a keystroke.

 

The reason setting the counter to an odd number works is that the counter is incremented by 2, so never rolls over to 0.

 

...lee

  • Like 3
Link to comment
Share on other sites

20 hours ago, TheMole said:

Setting the counter to an odd number should work though, right? I remember reading about that trick somewhere...

Yeah, I've used it myself. BUT, if you call the console KSCAN, the console will reset that counter on every keypress.

 

Link to comment
Share on other sites

  • 4 weeks later...

I can't believe it's been almost a month since the last release!

Anyway, below is the latest (and hopefully final) release candidate of the game. I think I managed to fix all the bugs you all have found, except the two below, which I never managed to reproduce:

OLD_CS1: Ghostbusters didn't leave building after missing a ghost, stuck there until the next ghost showed up
JasonACT: Managed to leave shop without buying traps

 

I did make a bunch of other changes and cleaned up some code which has hopefully fixed these two bugs in the process. Fingers crossed.

 

There might still be some minor fluctuations in the speed of the music playback while switching screens, but it did get much better and is about the best it's going to get without a complete rewrite of some very tricky parts of the code.

 

If feedback on this version is good, I'll start looking at what it's going to take to turn this into a physical, boxed, release, if there's enough intrest in that. I also still want to finish the Geneve version...

If anyone plays it on real hardware and doesn't mind recording their session, please let me know. Dying to know what it looks and sounds like on real hardware!

 

ghostbusters8.bin ghostbusters.rpk

  • Like 10
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...