Jump to content

Ninja Wall Jump game - WIP


Recommended Posts

An Ice section sounds cool, I'll try to add that! I'm continuing to find bytes here and there to save, so attract mode + VOX saving are looking promising!


In the meantime, here is the instruction sheet I'm planning, any feedback?






post-40857-0-89818200-1420424461_thumb.jpg post-40857-0-43975700-1420424465_thumb.jpg





  • Like 5
Link to comment
Share on other sites

I like it. Simple and to the point. I'm the type of person who doesn't like to read a lot of instructions. I really liked how you laid out the 'hold' and 'tap' in the illustration. My eye caught that right away. I find it pleasing to pick out the information like that rather then read a few sentences. I like the Ninja on the back cover too.



All in all excellent job. The action is really well suited for the 2600, and one of the funniest games I've played in a while. Even though I like programming and collecting for the 2600 I rarely play the games much. So, great job. :)

Link to comment
Share on other sites

For clarity under: How to win.

If you have an AtariVox, AtariVox+ or Savekey, your...


All three have the chip to save, no batteries required.

Thanks, I'll adjust that text.


OK so here's RC5, this is the result of a TON of continued optimization and work on the game, hopefully I didn't break anything.

New in this version:

  1. Attract mode! wait ~15 seconds on the title screen and the game will go into attract mode with a white ninja (and walls), who plays the game on his own. he won't overwrite your high score tho ;)
  2. Background colors change every 30 rooms! I might adjust this number for the final release, but the logic is in and working.
  3. Tons of code optimization in order to include the VOX save routines (not actually being called yet), and the above features.


Please let me know if you find any crazy bugs, on my to-do list to finish the game is:

  1. adjust movement tables for PAL50 version to match NTSC speed
  2. add VOX save/load logic and test it
  3. finish the instruction manual
  4. make a cartridge :)


:arrow: All-in-1 ZIP wall_jump_ninja_20150104_RC5.zip

:arrow: NTSC: wall_jump_ninja_20150104_RC5_NTSC.bin

:arrow: PAL60: wall_jump_ninja_20150104_RC5_PAL60.bin

:arrow: PAL50: wall_jump_ninja_20150104_RC5_PAL.bin



Some kinda interesting stats on the latest build:

RAM Free: 26 bytes

Code size: 3,519 bytes(PAL), 3,514(NTSC)

Data size: 545 bytes

ROM Free: 28 bytes (PAL), 33 bytes (NTSC)

Edited by walaber
Link to comment
Share on other sites

yikes! Looping vertically on the screen is intended when LAVA is turned off (which is the default unless you flip a difficulty switch to Advanced), in previous builds LAVA was defaulting to ON.


OK, the pulsating and audio issues should be fixed in this build:

:arrow: All-in-1 ZIP: wall_jump_ninja_20150105_RC6.zip

:arrow: NTSC: wall_jump_ninja_20150105_RC6_NTSC.bin

:arrow: PAL60: wall_jump_ninja_20150105_RC6_PAL60.bin

:arrow: PAL: wall_jump_ninja_20150105_RC6_PAL.bin



  • Like 1
Link to comment
Share on other sites

For reference, the root of my "pulsating" bug came from my misunderstanding of how the CMP operator works...

Compare Instruction Results
Compare Result       N  Z  C
A, X, or Y < Memory  *  0  0
A, X, or Y = Memory  0  1  1
A, X, or Y > Memory  *  0  1
* The N flag will be bit 7 of A, X, or Y - Memory

Basically I didn't know about the "*" there, and I was using BMI to branch based on the comparison, which works for some numbers but not others. This makes me realize I probably have some other fragile areas in my code that are relying on the N flag when they really shouldn't be.

in other news I implemented updated movement tables for PAL, so it plays at a comparable speed to NTSC now. It's a bit choppier, but pretty much plays the same.

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

I squeezed in code to animate closed the wall openings after you pass through them, which I think is a nice little bit of polish that was well worth it. I may also have squeaked in a tiny easter egg as well, but that shall remain a secret :)


:arrow: Progress video



Today I also put in the actual code to call the VOX routines, and of course I ran out of ROM space and had to optimize yet again. So I bit the bullet and optimized my movement tables to use much less data. I was worried that the additional code I'd need to unpack the data would offset the savings, but it was actually a new gain both on the data side and also on the code side.


For those curious, I basically have a little counter variable that counts up and repeats every 4 frames (0,1,2,3,0,1,2,3,0,1,2,3,etc). I use this variable as a lookup into data tables to decide how much to move each frame for anything that animates, etc. Every few times the variable loops I increment another offset that moves me deeper into the table.


Anyway, this means that I had movement tables that looked something like this:

        .byte #1, #0, #0, #0
        .byte #1, #0, #1, #0
	.byte #2, #1, #1, #1
	.byte #2, #1, #1, #1
	.byte #3, #1, #2, #1

As you can see I arranged it in 4-byte sections in order to understand visually how things will move. But looking at the data I realized I never move something more than 3 pixels in a given frame. This means I could combine all 4 values for a single row into just 1 byte, by using 2 bits per value:

        .byte #%01000000 	;#1, #0, #0, #0
	.byte #%01000100	;#1, #0, #1, #0
	.byte #%10010101	;#2, #1, #1, #1
	.byte #%10010101	;#2, #1, #1, #1
	.byte #%11011001	;#3, #1, #2, #1

In the above example this saves 15 bytes! Also the code to unpack this is actually pretty simple. In several places I have code that looks like this:

        LDY PlayerVelSection
	LDA (PlayerVelPtr),Y
	JSR GetMaskedMovementValue

The first two lines load the specific byte from my table, and then I call my "GetMaskedMovementValue" subroutine, which will take the value in A, and based on the current frame counter, mask off the unnecessary data and shift it down into a regular integer that you can use in a math operation:

; INPUTS: A = unmasked movement value.
; OUTPUTS: A + TempVar = properly unmasked value.
GetMaskedMovementValue	SUBROUTINE

	LDX PlayerVelFrame
	AND FrameMask,X

	BMI CalcDone
	JMP CalcLoop
	STA TempVar


"PlayerVelFrame" is the 0-3 looping counter, and "FrameMask" is a sequence of 4 bytes:

	.byte #%00000011, #%00001100, #%00110000, #%11000000

That loop at the end shifts the masked bits down to the right so they can be interpreted as a regular old number. Anyway I thought people might find that interesting. In total this saved me ~50 bytes, which was enough for the above improvements + VOX save/load code.


Currently I have 2 bytes of ROM free, and 24 bytes of RAM free :)

  • Like 1
Link to comment
Share on other sites

Nice game!

Still lacks some kind of a proper end sequence (perhaps fade to red and return to menu screen?), but other thank that it's a very solid effort.

One thing that bugs me tho, is that the titular Ninja looks too much like a plain stickfigure.


You've set up some pretty harsh limitations with 8x8 monochrome, but here's 2 of my attempts to remake the 3 sprite frames ( top row - jump, middle row - freefall, bottom row - clinging to the wall).





If you like these, then by all means, feel free to use them.

The one on the left would look particularily good if you could have the topmost pixels' row in red, to simulate a bandana!

  • Like 1
Link to comment
Share on other sites

Mef- thanks for the feedback and the time to draw some nice looking sprites! I'm not sure I want to change the sprites, although I do agree that yours look less "stick-figure-like". I've made a final build tonight, and already made the instruction manual as well, so I think I'll stick with my own art.


Here is what I hope is the final release candidate: RC7.

New Stuff:

* AtariVox+ / SaveKey save and load is working! Hold FIRE on left controller when launching the game to reset the high scores (actually it just skips loading them).

* A little bit of background music for the title screen. Please excuse this, but I think it sounds better than nothing. Since I have no ROM space left, I re-interpreted my background color table as music frequencies, and did a little fiddling with adjusting pace and volume, and it didn't seem too terrible so I put it in!



* sound no longer plays in attract mode

* fixed a few scanline count errors



:arrow: All-in-1 ZIP: wall_jump_ninja_20150111_RC7.zip

:arrow: NTSC: wall_jump_ninja_20150111_RC7_NTSC.bin

:arrow: PAL60: wall_jump_ninja_20150111_RC7_PAL60.bin

:arrow: PAL50: wall_jump_ninja_20150111_RC7_PAL.bin


  • Like 4
Link to comment
Share on other sites

I wonder, is it possible to make the PAL background colours more closely match the NTSC colours? I know the PAL palette is more limited so I'm not sure if you can. Just thought I'd ask. :)


PS: Fun game. :)

I've matched them according to the conventions others have come up with... But maybe a little hand-adjusting wouldn't hurt. Also after playing on a TV I think I need to brighten up some of the backgrounds anyway, it's hard to see the ninja and the walls in front of some of the darker hues on the bottom of the screen.

Link to comment
Share on other sites

Alright, I think I'm happy to call this version 1.0 of Wall Jump Ninja! Please let me know if you find any bugs, otherwise consider this game complete.


Here's a video of the final version:



And a few screenshots for good measure (I adjusted the BG colors a bit in this final version, and improved the PAL color conversions in several places)

post-40857-0-89809000-1421387738_thumb.png post-40857-0-64775400-1421387717_thumb.png post-40857-0-47548400-1421387725_thumb.png post-40857-0-52050200-1421387733_thumb.png

post-40857-0-22842800-1421388013_thumb.jpg post-40857-0-31629100-1421387997_thumb.jpg post-40857-0-77755800-1421388005_thumb.jpg


...and of course, the binaries:

:arrow: All-in-1 ZIP: wall_jump_ninja_20150115_v1_0.zip

:arrow: NTSC: wall_jump_ninja_20150115_v1_0_NTSC.bin

:arrow: PAL60: wall_jump_ninja_20150115_v1_0_PAL60.bin

:arrow: PAL: wall_jump_ninja_20150115_v1_0_PAL.bin


If all goes according to plan, the game will be available on cartridge in the AA store in the near-ish future :)

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

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.


  • Recently Browsing   0 members

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