Results 1 to 6 of 6

Thread: PattView Tech Info

  1. #1
    Chris (Administrator) Vash's Avatar
    Join Date
    Sep 2007
    Location
    Teh Interwebz
    Posts
    1,992
    Blog Entries
    27

    Default PattView Tech Info

    Since the development of PattView has come to a close, I believe the next logical step is to explain how it works so others can duplicate and expand upon my work. Before I get started here, I'd like to thank DsPet and Virus for all of their help in the development of this tool. We all know it would've never happened without them.

    Let's dissect the RVFOREST.DAT save file and locate the pattern information. Here is the offset information used in PattView. Each offset will take you to the start of the pattern information for that slot.

    Code:
    1-1
    
    offset=$1160
    player=1
    
    1-2
    
    offset=$19E0 
    player=1
    
    1-3
    
    offset=$2260 
    player=1
    
    1-4
    
    offset=$2AE0 
    player=1
    
    1-5
    
    offset=$3360  
    player=1
    
    1-6
    
    offset=$3BE0 
    player=1
    
    1-7
    
    offset=$4460 
    player=1
    
    1-8
    
    offset=$4CE0 
    player=1
    
    2-1
    
    offset=$9820
    player=2
    
    2-2
    
    offset=$A0A0  
    player=2
    
    2-3
    
    offset=$A920
    player=2
    
    2-4
    
    offset=$B1A0
    player=2
    
    2-5
    
    offset=$BA20
    player=2
    
    2-6
    
    offset=$C2A0  
    player=2
    
    2-7
    
    offset= $CB20  
    player=2
    
    2-8
    
    offset=$D3A0 
    player=2
    
    3-1
    
    offset=$11EE0
    player=3
    
    3-2
    
    offset=$12760
    player=3
    
    3-3
    
    offset=$12FE0  
    player=3
    
    3-4
    
    offset=$13860 
    player=3
    
    3-5
    
    offset=$140E0    
    player=3
    
    3-6
    
    offset=$14960  
    player=3
    
    3-7
    
    offset=$151E0    
    player=3
    
    3-8
    
    offset=$15A60  
    player=3
    
    4-1
    
    offset=$1A5A0
    player=4
    
    4-2
    
    offset=$1AE20  
    player=4
    
    4-3
    
    offset=$1B6A0 
    player=4
    
    4-4
    
    offset=$1BF20
    player=4
    
    4-5
    
    offset=$1C7A0 
    player=4
    
    4-6
    
    offset=$1D020 
    player=4
    
    4-7
    
    offset=$1D8A0
    player=4
    
    4-8
    
    offset=$1E120
    player=4 
    
    NPC1
    
    offset=$234E0
    
    NPC2
    
    offset=$26520
    
    NPC3
    
    offset=$29560
    
    NPC4
    
    offset=$2C5A0
    
    NPC5
    
    offset=$2F5E0
    
    NPC6
    
    offset=$32620
    
    NPC7
    
    offset=$35660
    
    NPC8
    
    offset=$386A0
    
    NPC9
    
    offset=$3B6E0
    
    NPC10
    
    offset=$3E720
    
    NPC11
    
    offset=$41980
    
    NPC12
    
    offset=$449C0
    
    NPC13
    
    offset=$47A00
    
    NPC14
    
    offset=$4AA40
    
    NPC15
    
    offset=$4DA80
    
    NPC16
    
    offset=$50AC0
    
    NPC17
    
    offset=$53B00
    
    NPC18
    
    offset=$56B40
    
    NPC19
    
    offset=$59B80
    
    NPC20
    
    offset=$5CBC0
    
    G1
    
    offset=$5EC80
    
    G2
    
    offset=$5F500
    
    G3
    
    offset=$5FD80
    
    G4
    
    offset=$60600
    
    G5
    
    offset=$60E80
    
    G6
    
    offset=$61700
    
    G7
    
    offset=$61F80
    
    G8
    
    offset=$62800
    Each pattern is 880h bytes in length. The actual image data starts right at the first byte. The length of the image data is 200h bytes per section. There are 4 image data sections, all 1 after the other (as shown in Figure 1). The pattern is rendered in 16 separate pieces, as demonstrated in Figure 1.


    Fig. 1 - One Full Pro-Design Pattern

    Each of the 16 sections in one pattern are 32 bytes (20h) long and are rendered in the order shown in Figure 1. Each row in one of the 16 sections is 4 bytes long, but 8 cells. Bytes are split to accommodate the color of two cells (ex. 1F, first cell would be color 1 and the second cell would be color F). So one section is 8 cells wide, and 4 bytes.

    Byte 86Fh of the pattern data is the palette number. The palette colors in PattView are estimates based on the palettes in-game. There are 15 colors in each palette. The code I used was 0 based (0..14). Here are the color values I used (forgive some windows defaults used).

    Code:
    Palette 1
    
    0 color=clred
    1 color=clgreen
    2 color=clblue
    3 color=$00004080
    4 color=clblack
    5 color=$000080FF
    6 color=$0000FF80
    7 color=$00EAEA00
    8 color=clpurple
    9 color=clgray
    10 color=$00E4CAFF
    11 color=clyellow
    12 color=$00FDCCAC
    13 color=$00B366FF
    14 color=clwhite
    
    Palette 2
    
    0 color=$001E56FD
    1 color=$0000C400
    2 color=$00FB8239
    3 color=$000268AC
    4 color=clblack
    5 color=$004AA5FF
    6 color=$0040FF9F
    7 color=$00FFA851
    8 color=$00FC70EE
    9 color=clgray
    10 color=$0093C9FF
    11 color=$0080FFFF
    12 color=$00FFE0C1
    13 color=$00E1C4FF
    14 color=clwhite
    
    Palette 3
    
    0 color=$00404080
    1 color=$00336600
    2 color=$00A94B4B
    3 color=$00212F4B
    4 color=clblack
    5 color=$000268AC
    6 color=$0054A800
    7 color=$00F77B31
    8 color=$00863E5F
    9 color=$00969696
    10 color=$00ACB9DF
    11 color=$0000A4A4
    12 color=$00CFBA9C
    13 color=$00B06FB0
    14 color=clwhite
    
    Palette 4
    
    0 color=$000229B0
    1 color=$004F9FA2
    2 color=$00828200
    3 color=$00682B02
    4 color=clblack
    5 color=$000374FA
    6 color=$0047C9E6
    7 color=$007DC604
    8 color=$00CD5A5A
    9 color=clgray
    10 color=$00AFD7FE
    11 color=$00A8FFFF
    12 color=$00C2EBC4
    13 color=$00FEB494
    14 color=clwhite
    
    Palette 5
    
    0 color=$009C5BD0
    1 color=$0002B6EA
    2 color=$00FF9122
    3 color=$00FF0080
    4 color=clblack
    5 color=$00CF9FFF
    6 color=$0000F4F4
    7 color=$00FEC87E
    8 color=$00C776B3
    9 color=clgray
    10 color=$00CCCCEE
    11 color=$00B0FFFF
    12 color=$00F3F4C1
    13 color=$00EFCFE7
    14 color=clwhite
    
    Palette 6
    
    0 color=$00400040
    1 color=$00054542
    2 color=$00626200
    3 color=$0059002D
    4 color=clblack
    5 color=$005F1F98
    6 color=$004D6B9D
    7 color=$00957D37
    8 color=$00BC4371
    9 color=clgray
    10 color=$00C595EC
    11 color=$008AC6CE
    12 color=$00CAAE80
    13 color=$00FF6AB5
    14 color=clwhite
    
    Palette 7
    
    0 color=$00710071
    1 color=$00000095
    2 color=$00078543
    3 color=$00845900
    4 color=clblack
    5 color=$006C00D9
    6 color=$000080FF
    7 color=$0000CC66
    8 color=$00889704
    9 color=clgray
    10 color=$00FF93FF
    11 color=$0002BAF7
    12 color=$0038D8DC
    13 color=clAqua
    14 color=clwhite
    
    Palette 8
    
    0 color=$00366D6D
    1 color=$00A4A4A4
    2 color=$00001C37
    3 color=$00002D00
    4 color=clblack
    5 color=$000183AD
    6 color=$00B4B4B4
    7 color=$00233F5C
    8 color=$003A6723
    9 color=clgray
    10 color=$005BCCD2
    11 color=$00E1E1E1
    12 color=$006483B0
    13 color=$008A9366
    14 color=clwhite
    
    Palette 9
    
    0 color=$00404080
    1 color=$00666666
    2 color=$00373700
    3 color=$005C7483
    4 color=clblack
    5 color=$007E75B3
    6 color=$00C3C3C3
    7 color=$00413623
    8 color=$00659EA3
    9 color=clgray
    10 color=$00A8A8D7
    11 color=$00B9CDD0
    12 color=$006D5F5F
    13 color=$0098BEC9
    14 color=clwhite
    
    Palette 10
    
    0 color=$003654AB
    1 color=$000A143D
    2 color=$008F3F6B
    3 color=$00313479
    4 color=clblack
    5 color=$006997D6
    6 color=$000D396A
    7 color=$00AF5050
    8 color=$003F42D1
    9 color=clgray
    10 color=$00BEBEFA
    11 color=$0069ABCB
    12 color=$00496228
    13 color=$00178BFF
    14 color=clwhite
    
    Palette 11
    
    0 color=clPurple
    1 color=$00400080
    2 color=$000059B3
    3 color=$00008C8C
    4 color=clblack
    5 color=$00DF00DF
    6 color=$003A01E4
    7 color=$000080FF
    8 color=clYellow
    9 color=clgray
    10 color=$00FF8CFF
    11 color=$008585D6
    12 color=$0078CFFE
    13 color=$0080FFFF
    14 color=clwhite
    
    Palette 12
    
    0 color=$009B004E
    1 color=$00A00000
    2 color=$00B58B53
    3 color=$00408000
    4 color=clblack
    5 color=$00FF0080
    6 color=$00FD225F
    7 color=$00FCCF58
    8 color=$005B9D02
    9 color=$006F8484
    10 color=$00FC96D8
    11 color=$00FF9595
    12 color=$00FFFF93
    13 color=$00A5FE43
    14 color=clwhite
    
    Palette 13
    
    0 color=$00498B9E
    1 color=$00A7968B
    2 color=$008687B7
    3 color=$00212143
    4 color=clblack
    5 color=$003E7EBF
    6 color=$00BCB0AF
    7 color=$00BFC9DD
    8 color=$00452956
    9 color=$005B5B5B
    10 color=$005BA8BB
    11 color=$00D1C1B1
    12 color=$00A9CFE0
    13 color=$0053538A
    14 color=clwhite
    
    Palette 14
    
    0 color=$00353500
    1 color=$004B9700
    2 color=$00767748
    3 color=$00F5F5F5
    4 color=$0000468C
    5 color=$003C7700
    6 color=$008EB702
    7 color=$00BFB595
    8 color=$00F2F1EA
    9 color=$002576CF
    10 color=$008DB002
    11 color=$0003AB64
    12 color=$00E1E1E1
    13 color=clwhite
    14 color=$0059ADE6
    
    Palette 15
    
    0 color=$00BCABA5
    1 color=$00282800
    2 color=$00BEA0CB
    3 color=$00372839
    4 color=clblack
    5 color=$00D2C8BD
    6 color=$006A5244
    7 color=$00CFB0DB
    8 color=$00493359
    9 color=clgray
    10 color=$00DDDDC6
    11 color=$00937D68
    12 color=$00C7C7E9
    13 color=$0076638D
    14 color=clwhite
    
    Palette 16
    
    0 color=$008AA9BD
    1 color=$00002222
    2 color=$00BCBCBC
    3 color=$00322323
    4 color=clblack
    5 color=$00BDD6E6
    6 color=$002E5C5C
    7 color=$00DBD7D2
    8 color=$00554D42
    9 color=clgray
    10 color=$00E7E7EF
    11 color=$00567C7B
    12 color=$00EDEAE9
    13 color=$006B6B6B
    14 color=clwhite
    Of course, all of this is great, but you can't do much without a drawing routine. Some way to pinpoint the offset of the cell in your pattern data (0..1FFh). The following code is to pinpoint the offset in a 32x32 grid. I'll explain it after.

    Code:
    Finding the block value
    
    if (acol < 8) and (arow < 8) then block=0 else
    if (acol < 16) and (arow < 8) then block=1 else
    if (acol < 24) and (arow < 8) then block=2 else
    if (acol < 32) and (arow < 8) then block=3 else
    if (acol < 8) and (arow < 16) then block=4 else
    if (acol < 16) and (arow < 16) then block=5 else
    if (acol < 24) and (arow < 16) then block=6 else
    if (acol < 32) and (arow < 16) then block=7 else
    if (acol < 8) and (arow < 24) then block=8 else
    if (acol < 16) and (arow < 24) then block=9 else
    if (acol < 24) and (arow < 24) then block=10 else
    if (acol < 32) and (arow < 24) then block=11 else
    if (acol < 8) and (arow < 32) then block=12 else
    if (acol < 16) and (arow < 32) then block=13 else
    if (acol < 24) and (arow < 32) then block=14 else
    if (acol < 32) and (arow < 32) then block=15
    
    Finding an offset
    
    value = (32*block)+((arow mod 8)*4)+((acol mod 8) div 2)
    There are some hints of delphi code in there, but I did my best to pseudo it up. ACol and ARow are the selected cell's column and row values, respectively. Anyway, the block value pinpoints which section you are in; 1 to 16 as shown in Figure 1 (except they must be 0 based for the algorithm). Then, that is applied to the rest of the general algorithm to give you an offset (0..1FFh). This is the byte where the value (color) for that cell is located in your pattern data.

    More on the second post...
    Animal Crossing: City Folk
    ACToolkit - NPC_Tool - PattView

  2. The Following 6 Users Say Thank You to Vash For This Useful Post:


  3. #2
    Chris (Administrator) Vash's Avatar
    Join Date
    Sep 2007
    Location
    Teh Interwebz
    Posts
    1,992
    Blog Entries
    27

    Default

    As I said earlier, however, the bytes are split to accommodate for 2 cells. This would cause problems with our formula as we still wouldn't know which "half" of the byte goes for the cell. Simple solution to fix this is to write a small function to decide whether your column number is odd or even. If it's even, you would take the first "half" of the byte. If it's odd, the second "half". This, of course, depends on your grid and if the column and row values are 0 based or not. You'll have to mess with the odd and even bit to get the correct value for each cell. This can be quite fun to see some of the results when you mess up your algorithm. You get some strange looking images.

    Now that you have the offsets, the palette information, and a drawing function, you might be asking yourself what's next? Well, we need to name these bad boys. The pattern name information starts at 822h with the town name. The player name starts at 838h, and lastly, the pattern name starts at 84Ch.

    So we have the offset, the palette, the drawing, the name, and now we'll have the pro vs. simple design. This one byte is at 870h in the pattern data. 00 is simple and 01 is pro. A very simple concept.

    Here's a little nugget of information courtesy of DsPet. This feature isn't in the current public version of PattView (and I don't intend to add it). It's the stored patterns at the pattern shop. The algorithm used to get to these patterns is as follows:

    Code:
    $74060 + $22020 * iPlayer (iPlayer = 0, 1, 2, 3)
    The patterns are in the standard format (880h bytes), and follow all of the same rules as the above patterns. So thank you, DsPet. Nice little bit of information there.

    PattView Delphi source code, fully commmented, available in the Game-Hackers VIP section!

    Also available exclusively in Game-Hackers VIP:



    PattViewX
    -Completely rewritten PattView release
    -User-friendly, compact style
    -Now supports 316 patterns, with Able's storage patterns (as opposed to 60 in PattView v2.1)
    -New, more accurate pattern rendering
    Animal Crossing: City Folk
    ACToolkit - NPC_Tool - PattView

  4. The Following User Says Thank You to Vash For This Useful Post:


  5. #3

    Default

    Not to interupt the flow of technical explanation...

    but I just wondering whether you also know where the pattern storage offset/address/location for each resident/character (that you could get by asking Mabel in Able shop to show you the storage). This would be helpful if we could access them so we could easily store the patterns directly.

    Thanks.

  6. #4
    Chris (Administrator) Vash's Avatar
    Join Date
    Sep 2007
    Location
    Teh Interwebz
    Posts
    1,992
    Blog Entries
    27

    Default

    Added the stored patterns (thanks to DsPet). Stickied. Full Delphi source code, commented, coming soon!
    Animal Crossing: City Folk
    ACToolkit - NPC_Tool - PattView

  7. #5

    Default

    Thanks again to you and DSPet for posting the pattern storage addresses and providing the algorithm to find them.

    Cheers.

  8. #6
    Chris (Administrator) Vash's Avatar
    Join Date
    Sep 2007
    Location
    Teh Interwebz
    Posts
    1,992
    Blog Entries
    27

    Default

    Added the PattView Source, fully commented, to the VIP section. Enjoy VIP members!
    Animal Crossing: City Folk
    ACToolkit - NPC_Tool - PattView

  9. The Following 2 Users Say Thank You to Vash For This Useful Post:


Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •