First NES game (Mineshaft)

This is an archive of a topic from NESdev BBS, taken in mid-October 2019 before a server upgrade.
View original topic
First NES game (Mineshaft)
by on (#89375)
Hi all

A couple of weeks ago I started reading up on making NES games. I don't know why, but I grew up with NES and I stumbled upon the PowerPak online and thought "I need to try this". I have previously done flash games and other small projects. I have never done much assembly, so when I found Shiru's guide on NES programming in C I was very excited. I had previously read the Nerdy Nights tutorial, and in combination there is all the info that one needs to make a small game really quickly.

I would like to share my first try at NES programming. I did all the graphics and music in NES Screen Tool and FamiTracker. The game was programmed mostly in C using Shiru's library, plus a little bit of assembly (to get the parallax scrolling to work).

It's a very simple game. It goes on until you die, and then you are presented with your score. Basic NROM 128. (Of which most is unused :)) The sound effects are a little buggy (don't know why), but they do the job. Controls are left and right only. You lose life if you step on the red platforms, regain it by stepping on blue ones. Don't get crushed by the ceiling, and don't fall off the bottom.

Please try it out. Maybe it will fit on the "Action 53" :D

Thanx to nesdev and nintendoage for all the great threads I've read! And a special thanks to Shiru, whose font I stole and for his great C library!

Link here:
http://www.fileden.com/files/2009/12/8/ ... eShaft.nes

PS. Can I enter the 2012 compo whit this?

by on (#89379)
Fabolous game! :D
I find it very entertaining.So era of NES Games written in C is about to start? 8)
As far as I know, anyone can enter with any(playable) game\program for NES.Besides, Your game is much better than my last compo entry, so they have to let you in :twisted:

by on (#89382)
Great job with the game Nioreh. I remember getting addicted to a game like this on an old probably NOAC-based handheld system I used to have.

But come A53 release, I'd like to have the source code for this so that I can combine it with other minigames in the same 32 KiB PRG bank. (They can use separate CHR banks of a CNROM if needed.) The biggest bottleneck is number of PRG ROM banks.

Denine: If it becomes nearly as easy to make an NES game as it was to make a GBA game, and people become aware of this, expect more NES games.


EDIT: This one also needs 803C:F0 to work in a multicart.

by on (#89389)
Wow this is a pretty good game. Is there an end to it or does it just keep going?

My first couple times through I thought I might have some criticisms, but as I played a few more times I got an appreciation for how you set everything up.

I will say though that the parallax effect is pretty cool, but it kinda messed with my vision a bit after playing for 10 mins or so. My computer screen keep seeming like it was scrolling down even though it wasn't for about a minute. :) Its possible this would have happened even without the parallax effect, but I'm not sure.

Looks like a great early entry to the compo IMO. And since you were able to whip it out so quickly looks like you've got time for more entries!

by on (#89391)
Cool! A nice little game. It is similar to TI 83's Fall Down that was implemented for NES at MiniGame Compo once (4K or something), but with more features and stuff, and better gameplay.

I'm glad that my code and article were useful.

by on (#89392)
Ah, good old falldown, we spend hours playing this during courses at college.

by on (#89394)
Excellent game ! I'm now a fan !

How come I never ever played the original game this is based on ? :o

by on (#89398)
Thanks for the great comments. The game is based on NS Shaft for the Mac, which I used to play a lot in the 90-s.

by on (#89402)
Good job! Worthy entry. Got a score of 55 on my first try.

Small suggestion: You could add pickups to increase score.

by on (#89406)
Pretty nifty.

I did notice a little bug. If you walk off a platform and immediately steer back toward it, you will land on it again. If you do it repeatedly, you can refill your life on a single blue platform (although I died a couple of times trying to do it).

Still, fun little game, and pretty good for your first game. I feel a little more encouraged about the idea of trying to make my own homebrew game some day.

by on (#89474)
It's not a bug, it's a feature!

PROTIP: stepping on and off the blue platforms can refill your healthbar! ;)

Great little game this - would love to see an improved version with perhaps a selection of different backgrounds and improved graphics (titlescreen in particular).

Might even get a cart of this made for my famicom :)

by on (#89497)
I came here expecting to see something Minecraft related. It's official, Mojang has corrupted my mind...

Congrats, you have gotten a lot farther than people who have been doing this for years.

by on (#89500)
WhatULive4 wrote:
I came here expecting to see something Minecraft related. It's official, Mojang has corrupted my mind...

In a parallel universe, on another board, discussing a Mojang game:
WhatUAspire2 wrote:
I came here expecting to see something Elder Scrolls related. It's official, Bethesda has corrupted my mind...

by on (#89555)
What an awesome little game, thanks a lot :-)

by on (#89721)
really well done game;)

by on (#89747)
Thank you all. Yeah, I know I should have put more effort into the title screen. :oops: In a perfect world I would also add a battery backed highscore and lots of powerups etc. This was mainly a proof of concept for myself to see what I could do. This is usually the game I start with when I want to try something new like this, so I've done it like 5 times already. Here is a flash version that I did a couple of years ago that has some extra features (like an additional block type, high scores):

http://www.newgrounds.com/portal/view/520622

Next game will probably be more polished. :lol:

by on (#89748)
Nioreh wrote:
In a perfect world I would also add a battery backed highscore

There's a reason high scores generally weren't battery backed in the NES era, apart from a few cases like Tetris 2+Bombliss and Wario's Woods: it would have taken two extra chips (a 6264 SRAM and a 74LS20 to decode $6000-$7FFF), plus the battery and a few diodes.

Quote:
This was mainly a proof of concept for myself to see what I could do.

There's always a chance for version 2 if you want to polish it later. There are still 42 more homebrew minigames I have to find before my project is "ready".

by on (#89828)
tepples wrote:
There's a reason high scores generally weren't battery backed in the NES era, apart from a few cases like Tetris 2+Bombliss and Wario's Woods: it would have taken two extra chips (a 6264 SRAM and a 74LS20 to decode $6000-$7FFF), plus the battery and a few diodes.


I was thinking about this. My little game uses very little CHR ROM space. What if I moved that data into PRG ROM and used CHR RAM. Could't one use a battery to keep the CHR RAM saved and store the highscore data in the otherwise empty parts of CHR RAM?

I don't know very much about electronics engineering, but it seems doable in my mind. I don't know all the board names, but this would be an NROM with CHR RAM instead of ROM, plus a battery to keep the CHR RAM saved.

by on (#89829)
Nioreh wrote:
I was thinking about this. My little game uses very little CHR ROM space. What if I moved that data into PRG ROM and used CHR RAM. Could't one use a battery to keep the CHR RAM saved and store the highscore data in the otherwise empty parts of CHR RAM?

Kevtris discovered one unlicensed NES game that does this, called RacerMate.

by on (#89833)
Cool :D Then I guess I'm not completely nuts for thinking it would be possible. I guess no emu supports this though?

by on (#89836)
Nioreh wrote:
Cool :D Then I guess I'm not completely nuts for thinking it would be possible. I guess no emu supports this though?


If the emulator supports save state slots, presumably part of the saved state is the state of CHR-RAM...

But then again those emulators might also "do you a favor" and clear the CHR-RAM on reset because...why would there be anything useful there?

by on (#89837)
I'd suggest making two versions. An EMU version that uses normal SRAM and a cart version that saves to CHR-RAM. It would only take one #define.

by on (#89838)
Nioreh wrote:
Next game will probably be more polished. :lol:


Please consider giving this ace little game a bit more work before moving on though ;)

by on (#89842)
cpow wrote:
But then again those emulators might also "do you a favor" and clear the CHR-RAM on reset because...why would there be anything useful there?

Programs running in emulators that support NES 2.0 can use battery-backed CHR RAM. The NES 2.0 spec refers to RacerMate by name.

by on (#89844)
Just saw this and played it. Cool as hell! Very addictive just like everyone else says.

by on (#89847)
I really liked the game! It's very addicting, and pretty well done too!

by on (#89857)
This is pretty good! I had fun.

by on (#89871)
Even though I'm very busy these days I had the chance to try it a little bit and it was good. Good work!

by on (#90217)
Nice job man! Very fun game.

by on (#90858)
This is a neat game, I like the parallax scrolling. It's a nice take on the ultra-simple-retro-platformer genre, with a twist such as "can't jump, just fall." Good job! Nice music too.
Re: First NES game (Mineshaft)
by on (#102459)
Found this throu a swedish NES forum... And love this game, so I have been playing it on an emulator...

My eprom-programmer were delivered today, my plan is that this will be the first NES game I will use it for.

Hower, when I use "NES Mapper Reader/ROM fixer/ROM spliter 1.0" to split the .nes file I get the error "The rom did not split correctly (incorrect CHR Bytes?)"

So how do I do to split this file so I can use it? Will it work anyways just to ignore the error messages?


(Sorry for my bad english and my noob-question)
Re: First NES game (Mineshaft)
by on (#102463)
I have a program below that is a ROM splitter. ReadNES3. Just drag and drop the file on the program and it will split the file. It will tell you all the details you need to make a cart, also. If you need any more help, just ask. There should be a read me explaining how the command line version of it works, with character repetition and program repetition and the like. Good luck.

http://www.racketboy.com/forum/viewtopi ... 25&t=28549
Re: First NES game (Mineshaft)
by on (#102472)
Thanks alot! Was no problem splitting the file with that program, will give it a try and burn the eproms and see if i can get it to work
Re: First NES game (Mineshaft)
by on (#102547)
Got it to work now :D Thanks for the tip 3gengames!

First try dident work, then i read on the net that you have to copy the files so they fill the eproms, and now it works great
Re: First NES game (Mineshaft)
by on (#102559)
Great lindholm, you managed to do this.

I have to make a cart out of this one too. Mineshaft is really cool.
Re: First NES game (Mineshaft)
by on (#102561)
Very cool game. Great work!
Re: First NES game (Mineshaft)
by on (#102593)
nice. I tested out on my ones emulator on my kindle but I'll put it on the powerpak later. high quality game.
Re: First NES game (Mineshaft)
by on (#104493)
I know I'm rather late to the party, but I'd like to add one small critique/request. It could just be my vision, but I find it hard to tell in which direction the moving platforms go. Let's say they're made up of "striped arrows." I think this problem I find would be remedied by thicker stripes, simply. That is the entirety of my negative feedback, though. I really like the game. Thank you for the download. Cheers!
Re: First NES game (Mineshaft)
by on (#104999)
Fileden appears dead. I have reuploaded.

"The extension .nes is not allowed"?
Re: First NES game (Mineshaft)
by on (#105004)
tepples wrote:
"The extension .nes is not allowed"?

Fixed. I also added .bin, .rom, .fds, .sfc, .smc, and .swc as well.
Re: First NES game (Mineshaft)
by on (#105005)
Tangenting: Would we want to put some kind of automatic explicit compression on those? Or is relying on "most web browsers transparently support gziping the stream" good enough / it's just a daft idea anyway?
Re: First NES game (Mineshaft)
by on (#105006)
Auto-gzip, and the fact that the files we trade are so small anyway. From Kasumi's rant against having to install multi-megabyte runtimes: "One of the really cool things about NESdev is downloading for less than a second, and getting a totally cool program."
Re: First NES game (Mineshaft)
by on (#105008)
lidnariq wrote:
Tangenting: Would we want to put some kind of automatic explicit compression on those? Or is relying on "most web browsers transparently support gziping the stream" good enough / it's just a daft idea anyway?

It's not as transparent as you might think. The HTTP server has to be configured to permit it/honour it (and it's done by MIME type or file extension -- you can't just say "do it for .php" -- that doesn't work how you think it would), and it gets even more annoying/complex when you have CGIs or something like PHP that can include its own HTTP headers. The current server is not configured to utilise HTTP client/server-level compression from what I can tell, but even if it was, it wouldn't matter due to what I said previously. :-)

For example, attachments here on the forum kick you back a URL like this:

download/file.php?id=238

Note it's not an explicit file/URL of the .zip file itself (i.e. not files/snakes.zip) -- instead it's a .php script, so the PHP code itself has to be written to honour on-the-fly compression. That URL does not result in an HTTP redirect or anything -- the PHP script quite literally feeds you back HTTP headers and raw binary data. Case in point:

Code:
$ curl -v -s -S -i 'http://forums.nesdev.com/download/file.php?id=238'
* About to connect() to forums.nesdev.com port 80 (#0)
*   Trying 69.20.131.235...
* connected
* Connected to forums.nesdev.com (69.20.131.235) port 80 (#0)
> GET /download/file.php?id=238 HTTP/1.1
> User-Agent: curl/7.24.0 (amd64-portbld-freebsd9.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.7
> Host: forums.nesdev.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sat, 22 Dec 2012 04:00:00 GMT
< Server: Apache
< X-Powered-By: PHP/5.3.15-pl0-gentoo
< Set-Cookie: phpbb3_6cazq_u=1; expires=Sun, 22-Dec-2013 04:00:00 GMT; path=/; domain=forums.nesdev.com; HttpOnly
< Set-Cookie: phpbb3_6cazq_k=; expires=Sun, 22-Dec-2013 04:00:00 GMT; path=/; domain=forums.nesdev.com; HttpOnly
< Set-Cookie: phpbb3_6cazq_sid=b1fe675b07c6b70edbe9c3754ec77ce1; expires=Sun, 22-Dec-2013 04:00:00 GMT; path=/; domain=forums.nesdev.com; HttpOnly
< Pragma: public
< Content-Disposition: attachment; filename*=UTF-8''MineShaft.nes.zip
< Content-Length: 5728
< Last-Modified: Fri, 21 Dec 2012 23:18:37 GMT
< Vary: Accept-Encoding,User-Agent
< Content-Type: application/octet-stream
<
{...snipping raw binary...}


Thus: no compression.

If one was downloading something like http://nesdev.com/i_like_tepples_hat.txt, then sure, Apache could be configured to use mod_deflate + map .txt files to utilise compression. It Just Works(tm). But with CGIs/PHP/webserver-embedded Python/whatever it's a totally different mess.