Arkista's Ring (NES) Level Editing -- Active Notes

Started by th60ftatomicman, July 27, 2021, 11:01:31 AM

Previous topic - Next topic


Hello again, let's talk about Arkista's Ring.
How a tile is defined:

  • Each tile in the map is composed of a group of 4 sprites.
  • Color is stored independently in PRG.
  • We seem to load 4 tiles at a time from PRG to CPU starting from highest address in the group of 4 and iterates backwards.
  • example: we load 0743,0742,0741,0740
  • We always load tile data into CPU Memory 0740 before loading into PPU for each level.
  • 2000 -- where in the PPU we write objects to
  • 9240 or 919E -- Set breakpoint here to begin loading colors into CPU memory
  • to modify objects in ROM see 006800

See what each tile makes below. at bottom of post. Haven't decoded them all but pattern seems to repeat.

How tile color is defined:

  • We define a vertical/horizontal 2x2 square for our colors
  • The first digit in a hex controls vertical (modify 1 or 2)
  • We seem to load 5 tiles at a time from PRG to CPU starting from highest address in the group of 4 and iterates backwards.
  • We also seem to load 2nd digits for all 5 first, than first digit.
  • 23c0 -- where in the PPU we write color to
  • 0640 -- where in the CPU we write color to before loading into PPU
  • 9200 -- Set breakpoint here to begin loading colors into CPU memory (it should be a statement like ORA $B#)

See the color mapping I was able to black box determine below

Map of objects
00 == metal roof full (same as 20)
01 == metal roof on top half (same as 21)
02 == prison window (same as 22)
03 == door (same as 23)
04 == windowsill
05 == Awning?
06 == chimney
07 == wall
08 == hold on bottom half
09 == side of tall mountain
10 == cross
11 == square structure
12 == another half wall with shadow
13 == some random ground (road!) -- do not know how to get it brown
14 == grass again
15 == half wall
16 == stairs
17 == thick wall (2 tiles !)
18 == tree
19 == mountain
--> repeat until 40

Map of Colors
0 = 2
1 = rightmost
2 = both, (left does not equal right)
3 = both, (left does not equal right)
4 = leftmost
5 = leftmost
6 = leftmost
7 = leftmost
8 = both, (left does not equal right)
9 = rightmost
A = both, same
B = both, (left does not equal right)
C = both, (left does not equal right)
D = rightmost
E = both, (left does not equal right)
F = both, same

What I want to figure out

  • I have the subroutine where we begin to define our colors, I just don't get it since im not great in particular at reading
    the 6052 instructions. How does it assign the colors since it's not a direct translation like the tile
  • How are enemies defined and stored in memory
  • How do we define our start position


I hacked Arkista's Ring a long time ago, you can check out the video here. Hopefully with your notes a level editor can be made in the future. If I remember right you gotta beat the game three times in a row to see the ending. I'm sure there's a way to bypass that.

Thanks for sharing your notes with us.  ;) :cookie: 


That hack looks awesome! Gives me some incentive to move forward. At some point in time I am going to have to learn to debug 6502 instruction code if I keep doing this. It's game 3 for me lol, and I got lucky on the last 2 that they had notes or it was a game that was incredibly easy to just switch and replace full memory codes.


I wish you the best of luck, hopefully some of the fellas on here can give you a hand in case you get stuck, I'd love to see an all out editor for this game.  ;) :cookie:


Oh, I like this game. It's quite simple, yet kind of relaxing to play. I found very limited stuff on that game a long time ago, but never came back to it. I still have the docs. The only thing I knew is that the levels were made of groups of 4 tiles. It's one way to save some space for any group that repeats itself. I don't think I had found anything related to enemies.

What you describe, th60ftatomicman, seems to be related to bit fields. A value of 00 having the same effect than 20, and then 40, is a telltale sign that some of the bits of the byte you're modifying are used for something else. Maybe the palette code is in there.

The ROM is relatively simple, 2 PRG banks and 4 CHR banks. It should be easy to find the information needed to reliably modify the maps.


Sorry I disappeared! Thought it'd be easy (it still should be) but not easy enough that other projects have taken over.
I'll eventually get back to this however life has jumped in the way with other projects!


 Some notes on enemies, at least for level 1.
Look at memory location 640C in RAM.
640C defines the first enemy you see the in the game.
640B defines it's YX coordinates (Y being left digit, X being right digit.)

Types of enemies
00 = orc
10 = globy guy
20 = fast orc
30 = moves you
40 = crashes game
01 = nothing
02 = orc
12 = super orc
16 and 17 = cosign harpy
18 = flying wizard
0A = scorpion
1A = flame dude
2A = flame dude
3A+ = crashes game


I tried to make a prototype for a map viewer, and I managed to properly display the first 4 levels, using an arbitrary palette from the table at 5C80. There is 0x100 bytes of palettes at 5C80, and some others are at 132A.