├── Makefile
├── README.md
├── docs
├── _config.yml
├── _includes
│ └── head-custom.html
├── img
│ ├── map00.png
│ ├── map01.png
│ ├── map02.png
│ ├── map03.png
│ ├── map04.png
│ ├── map05.png
│ ├── map06.png
│ ├── map07.png
│ ├── map08.png
│ ├── map09.png
│ ├── map0a.png
│ ├── map0b.png
│ ├── map0c.png
│ ├── map0d.png
│ ├── map0e.png
│ ├── map0f.png
│ ├── romgfxFFA.png
│ └── romgfxLADX.png
├── index.md
├── part0.md
├── part1.md
├── part2.md
└── part3.md
├── ffa.data.1
├── gfx
├── attack
│ ├── axe.png
│ ├── fire.png
│ ├── ice.png
│ ├── mattok.png
│ ├── morning_star.png
│ ├── sickle.png
│ └── sword.png
├── attacks1.png
├── attacks2.png
├── attacks3.png
├── attacks4.png
├── attacks5.png
├── attacks6.png
├── attacks7.png
├── attacks8.png
├── attacks9.png
├── boss
│ ├── chimera.png
│ ├── cyclops.png
│ ├── davias.png
│ ├── dragon.png
│ ├── dragon_zombie.png
│ ├── garuda.png
│ ├── golem.png
│ ├── hydra.png
│ ├── iflyte.png
│ ├── jackal.png
│ ├── julius2.png
│ ├── julius3.png
│ ├── kary.png
│ ├── kraken.png
│ ├── lich.png
│ ├── mantis_ant.png
│ ├── medusa.png
│ ├── megapede.png
│ ├── metak_crab.png
│ └── vampire.png
├── chest.png
├── chocobo.png
├── chocobo2.png
├── cloud.png
├── effect
│ └── snowman.png
├── enemy
│ ├── air_elemental.png
│ ├── ape.png
│ ├── barnaclejack.png
│ ├── basilisk.png
│ ├── beholder.png
│ ├── blood_own.png
│ ├── bulette.png
│ ├── chibidevil.png
│ ├── cobra.png
│ ├── dark_lord.png
│ ├── dark_stalker.png
│ ├── death_crab.png
│ ├── death_flower.png
│ ├── death_gauntlet.png
│ ├── death_scorpion.png
│ ├── demon.png
│ ├── denden.png
│ ├── doppel_mirror.png
│ ├── dragonfly.png
│ ├── duck_soldier.png
│ ├── earth_elemental.png
│ ├── evil_sword.png
│ ├── eye_spy.png
│ ├── fire_moth.png
│ ├── gal_fish.png
│ ├── garasha.png
│ ├── gargoyle.png
│ ├── gas_cloud.png
│ ├── gaurdian.png
│ ├── ghost.png
│ ├── goblin.png
│ ├── green_slime.png
│ ├── grell.png
│ ├── griffin_hand.png
│ ├── julius.png
│ ├── killer_bee.png
│ ├── land_leech.png
│ ├── lizardman.png
│ ├── magician.png
│ ├── mammoth.png
│ ├── mandrake.png
│ ├── manta_ray.png
│ ├── mega_xorn.png
│ ├── mimic.png
│ ├── minotaur.png
│ ├── molebear.png
│ ├── mudman.png
│ ├── mummy.png
│ ├── myconid.png
│ ├── ninja.png
│ ├── ogre.png
│ ├── orc.png
│ ├── pakkun_lizard.png
│ ├── phantasm.png
│ ├── porcupine.png
│ ├── poto.png
│ ├── pumpkin_bomb.png
│ ├── rabite.png
│ ├── red_wisp.png
│ ├── roper.png
│ ├── ruster.png
│ ├── sabercat.png
│ ├── sahagin.png
│ ├── saurus.png
│ ├── sea_dragon.png
│ ├── shadow_zero.png
│ ├── skeleton.png
│ ├── snowman.png
│ ├── tarantula.png
│ ├── tortoise_knight.png
│ ├── unknown1.png
│ ├── walrus.png
│ ├── wererat.png
│ ├── werewolf.png
│ ├── wizard.png
│ ├── wonder.png
│ └── zombie.png
├── font.png
├── hand_spark.png
├── minecart.png
├── moogle.png
├── npc
│ ├── amanda_dead.png
│ ├── amanda_ill.png
│ ├── bogard.png
│ ├── bowow.png
│ ├── cibba.png
│ ├── davias.png
│ ├── effect
│ │ └── music.png
│ ├── egg.png
│ ├── follower
│ │ ├── amanda.png
│ │ ├── chocobo.png
│ │ ├── chocobot.png
│ │ ├── girl.png
│ │ ├── lester.png
│ │ ├── marcie.png
│ │ ├── mysteryman.png
│ │ └── watts.png
│ ├── girl_window.png
│ ├── gladiator_friend.png
│ ├── last_guy.png
│ ├── lester_instrument.png
│ ├── magic_merchant.png
│ ├── minecart.png
│ ├── mother.png
│ ├── parrot.png
│ ├── pot.png
│ ├── prison_bars.png
│ └── willy.png
├── player.png
├── projectile
│ ├── arrow.png
│ ├── arrow2.png
│ ├── axe.png
│ ├── bat.png
│ ├── blacksworl.png
│ ├── chestbite.png
│ ├── claw.png
│ ├── explosion.png
│ ├── feather.png
│ ├── feather2.png
│ ├── fire.png
│ ├── fire2.png
│ ├── fireball.png
│ ├── ice.png
│ ├── knife.png
│ ├── laser.png
│ ├── laser2.png
│ ├── lightning.png
│ ├── mirrorimage.png
│ ├── nail.png
│ ├── needle.png
│ ├── needles.png
│ ├── ninjastar.png
│ ├── orb1.png
│ ├── orb2.png
│ ├── pitchfork.png
│ ├── ring.png
│ ├── rock.png
│ ├── skull.png
│ ├── snake.png
│ ├── splash.png
│ ├── star.png
│ ├── sun.png
│ ├── sword.png
│ ├── wave.png
│ └── wind.png
├── statusbar.png
├── tileset
│ ├── caves.png
│ ├── indoor.png
│ ├── outdoor.png
│ └── town_airship_mountain.png
├── title_end.png
└── trashbin.png
├── plugins
├── attack.py
├── boss.py
├── call_to_bank.py
├── item.py
├── mapdata.py
├── music.py
├── npc.py
└── script.py
├── rom.gb.md5
├── src
├── bank00.asm
├── bank01_player.asm
├── bank02_player_menus.asm
├── bank03_npc.asm
├── bank04_boss.asm
├── bank05_maps1.asm
├── bank06_maps2.asm
├── bank07_maps3.asm
├── bank08.asm
├── bank09_projectiles.asm
├── bank0A_npcgfx.asm
├── bank0B_titlegfx_bossgfx.asm
├── bank0C_tilesets.asm
├── bank0D_scripts1.asm
├── bank0E_scripts2.asm
├── bank0F_soundengine.asm
├── code
│ └── script
│ │ └── opcodetable.asm
├── data
│ ├── boss.asm
│ ├── items.asm
│ ├── map
│ │ ├── 00_rooms.asm
│ │ ├── 01_rooms.asm
│ │ ├── 02_rooms.asm
│ │ ├── 03_rooms.asm
│ │ ├── 04_rooms.asm
│ │ ├── 05_rooms.asm
│ │ ├── 06_rooms.asm
│ │ ├── 07_rooms.asm
│ │ ├── 08_rooms.asm
│ │ ├── 09_rooms.asm
│ │ ├── 0A_rooms.asm
│ │ ├── 0B_rooms.asm
│ │ ├── 0C_rooms.asm
│ │ ├── 0D_rooms.asm
│ │ ├── 0E_rooms.asm
│ │ ├── 0F_rooms.asm
│ │ └── headers.asm
│ ├── metatiles.asm
│ ├── npc
│ │ ├── main.asm
│ │ ├── metasprites.asm
│ │ ├── spawn.asm
│ │ └── stats.asm
│ ├── projectiles.asm
│ ├── scriptPointers.asm
│ └── xptable.asm
├── include
│ ├── charmaps.inc
│ ├── constants.inc
│ ├── hardware.inc
│ └── macros.inc
└── memory.asm
└── tools
├── mapExport.py
└── romAsText.py
/Makefile:
--------------------------------------------------------------------------------
1 | ROM = rom.gb
2 |
3 | SRCS = $(wildcard src/*.asm)
4 | GFXS = $(shell find gfx/ -type f -name '*.png')
5 |
6 | all: $(ROM)
7 |
8 | check: $(ROM)
9 | md5sum -c $(ROM).md5
10 |
11 | clean:
12 | -rm -rf .bin .obj .dep .gfx ${ROM}
13 |
14 | $(ROM): $(patsubst src/%.asm,.obj/%.o,$(SRCS))
15 | @mkdir -p $(@D)
16 | rgblink -w -m $(basename $@).map -n $(basename $@).sym -o $@ $^
17 | rgbfix --validate $(FIXFLAGS) $@
18 |
19 |
20 | .obj/%.o $(DEPDIR)/%.mk: src/%.asm $(patsubst gfx/%.png,.gfx/%.bin,$(GFXS))
21 | @mkdir -p $(dir .obj/$* .dep/$*)
22 | rgbasm --halt-without-nop --preserve-ld -Wall -Wextra --export-all -Isrc -I.gfx -M .dep/$*.mk -MP -MQ .obj/$*.o -MQ .dep/$*.mk -o .obj/$*.o $<
23 |
24 | .gfx/%.bin: gfx/%.png
25 | @mkdir -p $(dir .gfx/$*)
26 | rgbgfx -o .gfx/$*.bin $< -c '#ffffff,#c8c8c8,#646464,#000000'
27 |
28 | ifneq ($(MAKECMDGOALS),clean)
29 | -include $(patsubst src/%.asm,.dep/%.mk,$(SRCS))
30 | endif
31 |
32 | .PHONY: all clean
33 | .SECONDARY:
34 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # FFA-Disassembly
2 |
3 | Discord: https://discord.gg/CFdyrbWsWZ
4 |
--------------------------------------------------------------------------------
/docs/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-hacker
--------------------------------------------------------------------------------
/docs/_includes/head-custom.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {% include head-custom-theme-colors.html %}
5 |
6 |
7 | {% include head-custom-google-analytics.html %}
8 |
9 |
10 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/docs/img/map00.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map00.png
--------------------------------------------------------------------------------
/docs/img/map01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map01.png
--------------------------------------------------------------------------------
/docs/img/map02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map02.png
--------------------------------------------------------------------------------
/docs/img/map03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map03.png
--------------------------------------------------------------------------------
/docs/img/map04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map04.png
--------------------------------------------------------------------------------
/docs/img/map05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map05.png
--------------------------------------------------------------------------------
/docs/img/map06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map06.png
--------------------------------------------------------------------------------
/docs/img/map07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map07.png
--------------------------------------------------------------------------------
/docs/img/map08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map08.png
--------------------------------------------------------------------------------
/docs/img/map09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map09.png
--------------------------------------------------------------------------------
/docs/img/map0a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map0a.png
--------------------------------------------------------------------------------
/docs/img/map0b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map0b.png
--------------------------------------------------------------------------------
/docs/img/map0c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map0c.png
--------------------------------------------------------------------------------
/docs/img/map0d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map0d.png
--------------------------------------------------------------------------------
/docs/img/map0e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map0e.png
--------------------------------------------------------------------------------
/docs/img/map0f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/map0f.png
--------------------------------------------------------------------------------
/docs/img/romgfxFFA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/romgfxFFA.png
--------------------------------------------------------------------------------
/docs/img/romgfxLADX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/docs/img/romgfxLADX.png
--------------------------------------------------------------------------------
/docs/index.md:
--------------------------------------------------------------------------------
1 | ## Welcome to the Final Fantasy Adventure (GB) Disassembly.
2 |
3 | # Blog
4 |
5 | * [Part0 - Humble beginnings](part0)
6 | * [Part1 - Adventures of code](part1)
7 | * [Part2 - The quest for maps](part2)
8 | * [Part3 - Where are the string tables?... OMG...](part3)
9 |
--------------------------------------------------------------------------------
/docs/part0.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Part0 - Humble beginnings
3 | ---
4 |
5 | # Part0 - Humble beginnings
6 |
7 | Welcome! Here I hope to document a bit of my adventure of disassembling the GameBoy game [Final Fantasy Adventure](https://en.wikipedia.org/wiki/Final_Fantasy_Adventure), called FFA from now on, as I don't want to type that out all the time.
8 |
9 | FFA is also called "Mystic Quest" in europe. I used the US version to base this disassembly on.
10 |
11 | ### Why?
12 |
13 | Why FFA? It's a fun game. It isn't [Links awakening](https://github.com/zladx/LADX-Disassembly/) level of great. But it's still a good game. I've made [LADXR](https://daid.github.io/LADXR/) The links awakening randomizer, for which I could tell many stories. But that isn't this story.
14 |
15 | This story is about FFA. And let's get started...
16 |
17 | ## The start...
18 |
19 | Most disassemblies for the GameBoy start at [mgbdis](https://github.com/mattcurrie/mgbdis). Which turn a rom into assembly code. It does it's job, and it's a pretty simple script. However, I quickly found out that disassembling is an iterative process. You discover a bit more about how the ROM is working, and because of that, the disassembly will be wrong in areas...
20 |
21 | Now, I am lazy. The good kind of lazy. I didn't want to manually fix up some data into code after discovering that a specific block of data is actually code. Or the other way around...
22 |
23 | # Introducing... The disassembly process!
24 |
25 | Instead of going around and doing a lot of manual fixing up after disassembling. I decided that I wanted the following process:
26 | 1. Run the ROM in a specialized emulator, which marks parts of the ROM as code/data (more on this later)
27 | 2. Process the output of that run into the disassembler and produce a disassembly
28 | 3. Read the disassembly, finding parts that are not correct.
29 | 4. Add an special marker, called an annotation, in the disassembly to mark that that part is something specific
30 | 5. Re-run the disassembler with the previous generated disassembly and the annotations as input. To generate a new disassembly.
31 | 6. Repeat from 3 until profit...
32 |
33 | And that's how the [BadBoy](https://github.com/daid/BadBoy/) emulator and disassembler where born.
34 |
35 | ## The Emulator
36 |
37 | The BadBoy emulator, it's pretty bad as a GameBoy emulator goes. It's not very accurate, it can play most games, but not the tricky ones to emulate. Sound emulation is pretty bad as well. But, it does have a unique feature. It doesn't just track if parts of the ROM are used as data or code (other emulators can do this as well). It keep track of how parts of the rom are used. If a piece of ROM is copied to VRAM, it knows that that part of the ROM is graphics or tilemap. If data is used as a pointer, it is marked as a pointer. It makes more detailed information then just plain code vs data.
38 |
39 | ## The disassembler
40 |
41 | This is where the fun starts, it's also where a lot of complexities are hidden. But the basics are:
42 | * Ability to disassemble blocks of code.
43 | * From blocks of code, trace jumps to other blocks of code.
44 | * Support reading back in the disassembly to read annotations and labels.
45 | * Also read back in where to split files into include files.
46 | * Support custom annotations for custom data blocks.
47 | * Almost no assumptions, if it doesn't know, it doesn't assume there is code. It just exports data.
48 |
49 | If you read this disassembly, you'll encounter `;@` style comments, these are the annotations. They exists for the disassembler to re-generate the same disassembly again.
50 |
51 | During the project I actually completely rewrote the disassembler, that's how important it is for the project.
52 |
53 | ## The other emulator?...
54 |
55 | While BadBoy was great to get some initial good data, it's not great for anything else. While actually stepping trough the code and seeing what the code is doing live, I'm using [BGB](https://bgb.bircd.org/). One of the important features for me is that I can live edit the ROM. "What happens if I change this byte" can really assist in figuring out what things are doing.
56 |
57 | ## More tools?....
58 |
59 | One surprisingly useful small tool is a [simple script](https://github.com/daid/BadBoy/blob/master/tools/rom2png.py) that converts a whole rom into graphics. For FFA this image looks like:
60 | 
61 | Some things are really easy to identify in this image. Graphics are obviously in bank 08 to 0C. Less obvious things are blocks of data. Code generally looks like just noise. But some other banks, like the 2nd half of Bank01 and most of Bank03 have some clear structure to it. It also shows the rom is very tightly packed.
62 |
63 | Compare it with the [image of LADX](img/romgfxLADX.png), which clearly contains sections of nothing. And also data clearly in specific banks.
64 |
65 | Also, the following resources are pretty much required to have partially fixed in your mind:
66 | * [pandocs](https://gbdev.io/pandocs/) reference manual on anything gameboy hardware related. How rendering works, audio works, interrupts, anything.
67 | * [gbz80 instrution reference](https://rgbds.gbdev.io/docs/gbz80.7) details on all the possible assembly instructions
68 | * [rgbds manual](https://rgbds.gbdev.io/docs/rgbasm.5) details on the assembly language I use
69 | * [opcode table](https://gbdev.io/gb-opcodes/optables/) table of all possible opcodes and which byte value belongs to them
70 |
71 | # Closing word
72 |
73 | So, that's it for main tools. Next up, starting the work...
74 |
75 | * Next: [Part1 - Adventures of code](part1)
76 |
--------------------------------------------------------------------------------
/docs/part1.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Part1 - Adventures of code
3 | ---
4 |
5 | # Part1 - Adventures of code
6 |
7 | ## Finding the code.
8 |
9 | When starting this project, I thougth, my disassembler is following the code. That should mark most of the code directly...
10 |
11 | OH BOY, I was wrong. I quickly noticed only a small portion of the rom was disassembled as code. The first cause was quickly to spot. Jumptables. Example:
12 |
13 | ```asm
14 | ld HL, data_38ee
15 | ld B, $00
16 | ld C, A
17 | add HL, BC
18 | add HL, BC
19 | ld A, [HL+]
20 | ld H, [HL]
21 | ld L, A
22 | jp HL
23 |
24 | data_38ee:
25 | dw $34e7, $34f4, $3502, $351a, $357d, $3582
26 | ```
27 |
28 | Now, these are all over the place. Luckily, I was accounting for this. Marking the `data_38ee` label with an `;@jumptable` is usually enough.
29 | It will make all pointers after it as labels to code. And it will stop as soon as it encounters something that is marked as something already.
30 | As the first pointer is usually directly after the table, it will stop there.
31 |
32 | In some rare cases, it requires to specify the size of the table. Like: `;@jumptable amount=16`. This quickly expanded the amount of code,
33 | as from any jumptable pointer the disassembler traced any code called from it.
34 |
35 | ## The odd one... farcalling.
36 |
37 | After marking most of the jumptables, a pattern arose. At the start of any bank with code (except for bank0F), there is a jump table at the start of the bank.
38 | And digging a tiny bit more, it clicked. Some roms have a `farcall` function to allow to call a function in a different bank. But FFA does not have that, instead
39 | it has the option to call a function from that first jumptable. I'm not sure why they did it that way, it uses quite a bit of code. But it does preserve all
40 | registers while calling, which is something not often seen with farcalls.
41 |
42 | Example:
43 | ```asm
44 | callFunction02InBank01:
45 | push AF
46 | ld A, $02 ; Function index
47 | jp callFunctionInBank01
48 |
49 | callFunctionInBank01:
50 | ld [wScratchBankCallFunctionNumber], A
51 | pop AF
52 | ld [wScratchBankCallA], A
53 | ld A, H
54 | ld [wScratchBankCallH], A
55 | ld A, L
56 | ld [wScratchBankCallL], A
57 | ld HL, returnFromBankCall
58 | push HL ; push code that has to run after returning from the function, which will restore the bank
59 | ld A, $01
60 | call pushBankNrAndSwitch
61 | ld A, [wScratchBankCallFunctionNumber]
62 | add A, A
63 | ld L, A
64 | ld H, $40
65 | ld A, [HL+]
66 | ld H, [HL]
67 | ld L, A
68 | push HL ; push the function address on the stack, so the RET at the end will goto it
69 | ld A, [wScratchBankCallH]
70 | ld H, A
71 | ld A, [wScratchBankCallL]
72 | ld L, A
73 | ld A, [wScratchBankCallA]
74 | ret
75 |
76 | returnFromBankCall:
77 | push AF
78 | push HL
79 | call popBankNrAndSwitch
80 | pop HL
81 | pop AF
82 | ret
83 | ```
84 |
85 | The first short part exists once per function, and the second part exists once per bank.
86 |
87 | ## After that...
88 |
89 | After this, I'm confident all code that is actually used is disassembled. And there is a lot of it.
90 |
91 | I'm used to reading the code of LADX, and that's very different from FFA. While LADX has lots of very direct code,
92 | FFA on the other hand, it very indirect. It's very often writting something to a WRAM location to later use as trigger or data.
93 |
94 | And there are a few other things noticed after this. Bank0F deals with sound and music. It's obvious, because it's the only code that is touching
95 | the sound registers. Bank0D and Bank0E are "odd", they have patterns like code, but are not code. More on that later, as that's a lot to take in.
96 |
97 | Banks 05, 06 and 07 are just all data. With 08, 09, 0A, 0B and 0C all being mostly graphics, it gives a pretty overal picture.
98 | The big blocks of data are quite certainly part of map data. So let us look into that next.
99 |
100 | ## Bank encoded pointers
101 |
102 | While trying to find more pointers to data hiding in data. We find something that the disassembler cannot handle without customization. **Bank encoded pointers**, as a bank is only `$4000` bytes big, you only need 14 bits to store a pointer to it. And in some cases, the last 2 remaining bits are then used to encode which bank it is pointing at. The bank to start from depends on the pointer.
103 |
104 | Whenever I referrer to a bank encoded pointer, it's this style of pointer.
105 |
106 | * Previous: [Part0 - Humble beginnings](part0)
107 | * Next: [Part2 - The quest for maps](part2)
108 |
--------------------------------------------------------------------------------
/docs/part2.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Part2 - The quest for maps
3 | ---
4 |
5 | # Part2 - The quest for maps
6 |
7 | Ah, maps. Always a highly visible part of a game. It has to be somewhere, and there has to be a lot of it. I forgot how I discovered the first bit.
8 | So lets just explain how it all works. Or at least, how part of it works, as there is a part of it we will cover later.
9 |
10 | ## Humble beginnings
11 |
12 | Map data starts at bank $08, at the beginning of the bank. It's stored at [src/data/map/headers.asm](https://github.com/daid/FFA-Disassembly/blob/master/src/data/map/headers.asm) in the disassembly.
13 | There are a wopping total of 16 maps. That is a lot of maps. But not all maps are the same size, and not all maps are completely used.
14 | ```asm
15 | MAP_HEADER tilesetGfxOutdoor, $00, metatilesOutdoor, $80, mapRoomPointers_00, $d7, $3c
16 | ```
17 | Per map there is a header here. Which is just a few pointers to other data, as well as some junk data. I'm quite sure the junk data is never used.
18 |
19 | ## The main bit
20 |
21 | The main bit of maps is after the first pointer. The `mapRoomPointers` pointer, it's stored with a bank number, so this data can be in any bank.
22 |
23 | The data after the `mapRoomPointers` starts with a small header, and then a large list of pointers. The disassembly has this nicely split into files per map in `src/data/map/XX_rooms.asm`.
24 |
25 | ```asm
26 | mapRoomPointers_00:
27 | db $00, $03, $10, $10
28 | ;;Room data pointers
29 | dw map00_room00_00_script, map00_room00_00_tiles
30 | dw map00_room01_00_script, map00_room01_00_tiles
31 | ```
32 |
33 | The header bytes are as followed:
34 | 1. Encoding mode: $00 = RLE, $01 = Templated
35 | 2. RLE length (more on this in a bit)
36 | 3. Height of the map in rooms
37 | 4. Width of the map in rooms
38 |
39 | There are two types of map encoding, dictated by the first byte. We will cover RLE mode first, as templated mode builds on top of that.
40 |
41 | ### RLE Map encoding
42 |
43 | Each of the `mapXX_roomXX_XX_tiles` pointers points at a block of data. The encoding of this data is quite simple. Each byte is the tile number tile.
44 | $11 might be a water tile, $00 normal ground, and a lot more. There are up to 128 types available. As there is one more rule. If the upper bit is set,
45 | then the tile is repeated a number of times. How often? Well, that's that 2nd byte of the header, the RLE length. So all rooms in a map share a single RLE length.
46 |
47 | Example row:
48 | ```asm
49 | db $91, $02, $50, $e4, $64, $64
50 | ```
51 | First byte is `$91`, so that's tile `$11` repeated RLE length time. RLE length is 3 in this case. So after this byte the row on that map looks like:
52 | ```asm
53 | $11, $11, $11
54 | ```
55 | Two bytes after that do not have bit `$80` set, so:
56 | ```asm
57 | $11, $11, $11, $02, $50
58 | ```
59 | `$e4` follows after that, which has the highest bit set, resulting in tile `$64` repeated 3 times:
60 | ```asm
61 | $11, $11, $11, $02, $50, $64, $64, $64
62 | ```
63 | And finally two $64 bytes are added:
64 | ```asm
65 | $11, $11, $11, $02, $50, $64, $64, $64, $64, $64
66 | ```
67 | Making this the complete row.
68 |
69 | This is just repeated until the whole room is decoded and the screen is filled. *It's a relatively simple encoding scheme compared to some other games. And I do not think it is a very optimal solution. I am quite sure that an RLE length per room would have been more efficient.*
70 |
71 | ### Template encoding
72 |
73 | If byte 1 of the header is not $00, then the data is encoded differently. And the header is actually expanded:
74 | ```asm
75 | mapRoomPointers_02:
76 | db $01, $04, $08, $08
77 | dw map02_room_tile_template
78 | ;;Door tile info
79 | db $25, $35, $20, $30, $14, $03, $52, $53
80 | db $24, $34, $21, $31, $12, $13, $42, $43
81 | db $15, $45, $10, $40, $28, $04, $51, $54
82 | ;;Room data pointers
83 | dw map02_room00_00_script, map02_room00_00_tiles
84 | dw map02_room01_00_script, map02_room01_00_tiles
85 | ```
86 | The first 4 bytes mean exactly the same. But after that a pointer to a room template follows. The pointer points to data in the RLE format and is applied first to the room, before anything else. For the stock maps, this template is just an empty room with all walls nicely done.
87 |
88 | Next 24 bytes follow. These are tiles for the right/left/up/down opening/doors/walls. Just remember these as "door tiles" for now.
89 |
90 | After this, the actual list of pointers follows, just like in RLE mode. But, the actual mapXX_roomXX_XX_tiles data differs from RLE mode.
91 | ```asm
92 | map02_room03_00_tiles:
93 | db $02, $00, $02, $01
94 | db $41, $44
95 | db $41, $46
96 | db $41, $52
97 | db $ff, $ff
98 | ```
99 | The first 4 bytes are "doors", in the order of right/left/up/down this indicate how a wall on that direction should be. If it should be a door or not, and if the door is open.
100 |
101 | * Bits0-1: Indicate the type. 0=open, 1=closed, 2=wall
102 | * Bits2-7: If non-zero, then this doorway is an exit out of the map.
103 |
104 | The first 2 bits are used to select a row from the "door tiles", two tiles are used from this and placed on the wall. So in the example, if the up byte was $01, it would place tile `$12` and `$13` at the top row tiles to draw an closed door.
105 |
106 | After the 4 door bytes, you get a list of 2 bytes per item. It's a simple scheme, of `tile` followed by `position`, the position is encoded as YX in a single byte. The list is ended by an entry of `$FF $FF` (but only the first $FF is actually needed) These tiles are simply placed on top of the template.
107 |
108 | ## The map tiles
109 |
110 | Great, now we have a whole room of tiles. Well, we have a room of 16x16 pixel tiles. Or "metatiles" as you can call them. Each of these metatile numbers dictates how a single 16x16 pixel area will ook and behave.
111 |
112 | If we want to go from metatiles to actual 8x8 graphic tiles, we need the metatile information. Luckily, this isn't complex. Remember the first map header?
113 | ```asm
114 | MAP_HEADER tilesetGfxOutdoor, $00, metatilesOutdoor, $80, mapRoomPointers_00, $d7, $3c
115 | ```
116 | It has a pointer to the metatiles. In this example `metatilesOutdoor`. This has a large list of 6 bytes per metatile:
117 | ```asm
118 | metatilesOutdoor:
119 | db $2e, $2f, $2e, $2f, $30, $05
120 | db $2e, $2f, $9e, $9f, $00, $05
121 | db $16, $17, $0e, $18, $60, $07
122 | db $27, $10, $10, $10, $c0, $07
123 | ...124 more entries
124 | ```
125 |
126 | The first 4 bytes are a 8x8 tile index into the graphics. Which graphics? Well. The graphics pointed at by the pointer in the general header:
127 | ```asm
128 | MAP_HEADER tilesetGfxOutdoor, $00, metatilesOutdoor, $80, mapRoomPointers_00, $d7, $3c
129 | ```
130 | The `tilesetGfxOutdoor` pointer in this case, which is a bank-encoded pointer, starting from bank `$0B`. And this points to a 256 tile large graphics block. Any tile from that graphics block can be used for a metatile.
131 |
132 | Byte 4: not entirely sure, but collision related, should test with enemies to see if certain options are related to NPCs?
133 | * $00-$07: blocks player
134 | * $08: player can walk on it
135 | * $10: player can walk on bottom left and bottom right corners
136 | * $20: player can walk on top left and top right corners
137 | * $30: player can walk on it
138 | * $40: blocks player
139 | * $80: blocks player
140 | * $C0: blocks player
141 | * $F0: player can walk on it
142 |
143 | Byte 5: Still needs more investigation, general guess:
144 | * $04: Weapon interaction, byte4 lower nibble indicates which method (1=attach chain, 4=chop by axe, 6=destroy with sickle), but also sometimes is $00 for things like palmtrees and mountains?
145 | * $07: Water
146 | * $45 $55 $65 $75: Ice slide tiles or mine cart tiles
147 | * $0D: climbing tiles (player faces up always)
148 | * $21: Damage spikes
149 |
150 | # Wrapping up...
151 |
152 | So that's it for maps. Well, mostly. There is one pointer we skipped. The `mapXX_roomXX_XX_script` style pointers. Those are for another day.
153 |
154 | With all this, we can make a [script](https://github.com/daid/FFA-Disassembly/blob/master/tools/mapExport.py) that decodes the maps, and it produces nice results:
155 | 
156 |
157 | And then we discover that [map07](img/map07.png) isn't an actual playable map, but contains the title screen, ending screen and ingame map.
158 |
159 | Also, we can make this nice chart to illustate the structure:
160 |
161 |
162 | graph LR
163 | MapHeaders -->|pointer| TileGraphics
164 | MapHeaders -->|pointer| MetaTiles
165 | MapHeaders -->|pointer| RoomPointers
166 | RoomPointers --> PerMapHeader
167 | RoomPointers -->|pointer list| RoomTiles
168 | RoomPointers -->|pointer list| RoomScriptData
169 | RoomTiles -->|or| RLE[RLE Encoded]
170 | RoomTiles -->|or| Templated
171 | PerMapHeader --> RLESize[RLE Size]
172 | PerMapHeader --> MapSize[Map Size: height,width]
173 | PerMapHeader -->|optional| DoorTiles
174 | PerMapHeader -->|optional pointer| RoomTemplate
175 |
176 | RLE -->|List of| RLEEncoded[RLE Encoded rows]
177 | Templated -->|List of| Tiles[Tile X,Y]
178 |
179 |
180 | * Previous: [Part1 - Adventures of code](part1)
181 | * Next: [Part3 - Where are the string tables?... OMG...](part3)
182 |
--------------------------------------------------------------------------------
/docs/part3.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Part3 - Where are the string tables?... OMG...
3 | ---
4 |
5 | # Part3 - Where are the string tables?... OMG...
6 |
7 | Prepare for a wild ride!
8 |
9 | String tables. FFA contains a lot of text, many dialogs with NPCs, story related text. A lot of text. Coming from LADX, I expected a stringtable.
10 | After all [LADX has multiple stringtables](https://github.com/zladx/LADX-Disassembly/tree/main/src/text).
11 |
12 | But, looking at the rom with a hex editor, no [ascii](https://en.wikipedia.org/wiki/ASCII) to be found. Must be some custom encoding.
13 |
14 | ## Text encoding...
15 |
16 | 
17 |
18 | Looking at the BGB VRAM viewer (note: I love the BGB VRAM viewer. You should as well, it's great for understanding what games are doing under the hood)
19 | We can see that there is some font loaded, and that it doesn't follow ascii ordering. What would be the odds of those tile numbers directly being
20 | related to how the text is encoded....
21 |
22 | Well, the odds are bad. Decoding it with that encoding yields only random noise, nothing that resembles ingame text could be spotted.
23 |
24 | But, not horrible, debugging the code that draws a single character, we spot an `add $80` somewhere in the code before it's written out to VRAM.
25 | So, trying an `$80` offset to the tile numbering in VRAM gives us... something. But not a lot.
26 |
27 | We find a few bits and pieces in bank `$0D` and `$0E`, but it's pretty corrupt, best piece would be:
28 | ```asm
29 | db "<10><5b>AM<51>ARCIE.\n<5b>SEARCH RELICS.\nDR.BOWOW<51>AD<6d>ME.<12>"
30 | db "<1b><9d> LEFT<51><6d><9d>RE.\n<5b>WAITED 50 YEARS.\n<9d> FORGOT<51>E.<12>"
31 | db "<1b><5b>CAN<97>ELP YOU.\nTAK<6d>M<6d>WITH YOU.<12>"
32 | ```
33 |
34 | So we are missing a piece of the puzzle. Could it be some kind of compression? It took me forever to find out. I spend a whole evening with the debugger, tracing code,
35 | not understanding what was happening. Until...
36 |
37 | It read two bytes from a piece of data at `00:3f1d`. And that's when it clicked. Some bytes have a meaning of two characters, and this table shows which two characters.
38 |
39 | ### Dual character mapping...
40 |
41 | Life would have been good and easy. Except, it isn't. For some reason, the indexing into this table is split into two parts.
42 | * Bytes: $20-$70 map to the first part of the table
43 | * Bytes: $80-$A0 map to a second part of the table
44 | To this day, I still have no idea why this split exists.
45 |
46 | But, after this, we can write a [small script](https://github.com/daid/FFA-Disassembly/blob/master/tools/romAsText.py) that decodes the whole ROM as text.
47 |
48 | At this point, it also became obvious that `$14` and `$15` get replaced with the player and girl names, and various other symbols and icons.
49 |
50 | And the text becomes pretty obvious in bank $0D and $0E now:
51 | ```
52 | 0e:6120: <00><10>qo<00><00><00><00><08>gh<00><71><00>i.av<04><10> was a fighter\nof E
53 | 0e:6140: mpire Glaive.<00>.of<04><11><00>GD!<0f>Fo<00>C.eaj<04><10> and f
54 | 0e:6160: riends\nwere forced to\nfight everyday<12><1b>just for
55 | 0e:6180: the\nentertainment of\nDark Lord.<12><1b><00><02>e.nt<02>e.<00><04>
56 | 0e:61a0: Many fighters have\nfallen from their\nwounds.<12><11><00>D!
57 | 0e:61c0: <04>us<0a><0a><17> cyo<02>.omC.<1e><04><10>:__ Willy!\nWilly:
58 | 0e:61e0: _<00>.ea<04> Mana\n is in danger now_<12><1b><00><00><04> We must
59 | ```
60 |
61 | ### There is trouble in the lands...
62 |
63 | Great we got strings. But, it looks off. There isn't a pointer pointing to the start of a string, and the strings aren't nicely lined up with each other. There are some pointers in bank `$08` pointing near the strings, but the offsets aren't the same.
64 |
65 | There is also the pattern of each piece of text starting with `$04 $10` and ending with `$00` before we see junk data again.
66 |
67 | Could it be... in a game this old?
68 |
69 | ## Let there be light!
70 |
71 | And then an angel came down from the heavens and said "scripts". And it was glorious. It is the single most important discovery I made in the rom.
72 | There are scripts, and in these scripts there is text. And so, the long and complex task of decoding scripts began.
73 |
74 | Script opcode `$04` for example, is display message. And that's where all the text was comming from. Opcode '$00' was pretty clearly "end of script".
75 |
76 | Some opcodes where easy to find out what they did by just testing, like `$80` which makes the player step forwards. For every unknown opcode, I hacked it in the initial chase sequence script (using BGB's ability to edit the rom on the fly), and see how many opcodes after it are skipped. This gave me enough info to at least decode an unknown upcode with parameters.
77 |
78 | So I set out to write a [custom plugin](https://github.com/daid/FFA-Disassembly/blob/master/plugins/script.py) for the disassembler to decode these scripts.
79 | It evolved over time from something that decodes a few opcodes to a full decode, including IF statements and loops.
80 |
81 | Special thanks to marijnvdwerf, who noticed that all jumps in the code where always forward, and seemed to follow a strict IF/ELSE/ENDIF structure. Which is now what the actual disassembly contains, as it was a perfect fit.
82 |
83 | # Let there be scripts!
84 |
85 | Ok. So there are scripts. There are a lot of scripts, 1283 to be exact. Some of them are empty, but that's a lot of scripts.
86 |
87 | And there is a good reason for so many scripts. Let's just see, what's all controlled by scripts?
88 | * Talking to NPCs (including shops, story NPCs and random NPCs)
89 | * Spawning of monsters
90 | * Spawning of bosses
91 | * Handling of special events when all monsters/boss is killed.
92 | * Story related events
93 | * Transitions from maps (doors/entrances)
94 | * Spawning of random chests from monsters
95 | * Opening of chests and giving items
96 | * Talking to your follower ("ask" option in the menu)
97 | * Death of the player
98 | * Ending credits
99 |
100 | Now, the rules behind scripts are reasonably easy. Only one runs at the same time, and while one is running player input is blocked.
101 |
102 | ## Triggering a script.
103 |
104 | There are a few ways that a script can be triggered:
105 | * Entering a room
106 | * Exiting a room
107 | * Last enemy in a room is killed (not triggered if there are no enemies)
108 | * Walking on a specific tile in a room
109 | * Opening a chest
110 | * Talking to an NPC
111 | * Killing an enemy
112 | * Killing a boss
113 |
114 | Next, scripts aren't triggered directly by a pointer to the script. But by an index in the script function table.
115 | This table is located at `src/data/scriptPointers.asm` in the disassembly.
116 |
117 | Now, dealing with these index numbers directly in the assembly is annoying. So. I added a bunch of macro magic to the disassembly.
118 | It's a pretty simple trick. We add labels to each of the entries in the scriptpointers table:
119 | ```asm
120 | SCRIPT_POINTER: macro
121 | __script_pointer_\\1::\n dw ((\\1 - $4000) + ((BANK(\\1) - $0D) * $4000))
122 | endm
123 |
124 | scriptPointersTable:
125 | SCRIPT_POINTER script_0000
126 | SCRIPT_POINTER script_0001
127 | ```
128 | This will create a `__script_pointer_script_XXXX` label at the each of the entries in the table.
129 | And then the following macro can then insert an index to a script from a script label:
130 | ```asm
131 | SCRIPT_IDX: macro
132 | dw (__script_pointer_\1 - scriptPointersTable) / 2
133 | endm
134 | ```
135 |
136 | ## And all is well....
137 |
138 | Except. When it isn't. Remember the triggers? Two of them are special, the others have direct index numbers in the code. But these two:
139 | * Exiting a room
140 | * Last enemy in a room is killed (not triggered if there are no enemies)
141 | *
142 | These have no direct reference in the code, they are implicit. How implicit? Well, if the room enter script has script index `$01a6` then the exit script has index `$01a7` and the kill last monster script has index `$01a8`.
143 |
144 | So that is a bit annoying for clarity.
145 |
146 | # And so?
147 |
148 | There is a lot more to say about scripts. The scripts really tie a lot of things together. That's why we encounter them so early.
149 |
150 | * Previous: [Part2 - The quest for maps](part2)
151 |
--------------------------------------------------------------------------------
/ffa.data.1:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/ffa.data.1
--------------------------------------------------------------------------------
/gfx/attack/axe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attack/axe.png
--------------------------------------------------------------------------------
/gfx/attack/fire.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attack/fire.png
--------------------------------------------------------------------------------
/gfx/attack/ice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attack/ice.png
--------------------------------------------------------------------------------
/gfx/attack/mattok.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attack/mattok.png
--------------------------------------------------------------------------------
/gfx/attack/morning_star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attack/morning_star.png
--------------------------------------------------------------------------------
/gfx/attack/sickle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attack/sickle.png
--------------------------------------------------------------------------------
/gfx/attack/sword.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attack/sword.png
--------------------------------------------------------------------------------
/gfx/attacks1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attacks1.png
--------------------------------------------------------------------------------
/gfx/attacks2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attacks2.png
--------------------------------------------------------------------------------
/gfx/attacks3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attacks3.png
--------------------------------------------------------------------------------
/gfx/attacks4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attacks4.png
--------------------------------------------------------------------------------
/gfx/attacks5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attacks5.png
--------------------------------------------------------------------------------
/gfx/attacks6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attacks6.png
--------------------------------------------------------------------------------
/gfx/attacks7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attacks7.png
--------------------------------------------------------------------------------
/gfx/attacks8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attacks8.png
--------------------------------------------------------------------------------
/gfx/attacks9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/attacks9.png
--------------------------------------------------------------------------------
/gfx/boss/chimera.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/chimera.png
--------------------------------------------------------------------------------
/gfx/boss/cyclops.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/cyclops.png
--------------------------------------------------------------------------------
/gfx/boss/davias.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/davias.png
--------------------------------------------------------------------------------
/gfx/boss/dragon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/dragon.png
--------------------------------------------------------------------------------
/gfx/boss/dragon_zombie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/dragon_zombie.png
--------------------------------------------------------------------------------
/gfx/boss/garuda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/garuda.png
--------------------------------------------------------------------------------
/gfx/boss/golem.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/golem.png
--------------------------------------------------------------------------------
/gfx/boss/hydra.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/hydra.png
--------------------------------------------------------------------------------
/gfx/boss/iflyte.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/iflyte.png
--------------------------------------------------------------------------------
/gfx/boss/jackal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/jackal.png
--------------------------------------------------------------------------------
/gfx/boss/julius2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/julius2.png
--------------------------------------------------------------------------------
/gfx/boss/julius3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/julius3.png
--------------------------------------------------------------------------------
/gfx/boss/kary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/kary.png
--------------------------------------------------------------------------------
/gfx/boss/kraken.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/kraken.png
--------------------------------------------------------------------------------
/gfx/boss/lich.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/lich.png
--------------------------------------------------------------------------------
/gfx/boss/mantis_ant.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/mantis_ant.png
--------------------------------------------------------------------------------
/gfx/boss/medusa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/medusa.png
--------------------------------------------------------------------------------
/gfx/boss/megapede.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/megapede.png
--------------------------------------------------------------------------------
/gfx/boss/metak_crab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/metak_crab.png
--------------------------------------------------------------------------------
/gfx/boss/vampire.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/boss/vampire.png
--------------------------------------------------------------------------------
/gfx/chest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/chest.png
--------------------------------------------------------------------------------
/gfx/chocobo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/chocobo.png
--------------------------------------------------------------------------------
/gfx/chocobo2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/chocobo2.png
--------------------------------------------------------------------------------
/gfx/cloud.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/cloud.png
--------------------------------------------------------------------------------
/gfx/effect/snowman.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/effect/snowman.png
--------------------------------------------------------------------------------
/gfx/enemy/air_elemental.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/air_elemental.png
--------------------------------------------------------------------------------
/gfx/enemy/ape.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/ape.png
--------------------------------------------------------------------------------
/gfx/enemy/barnaclejack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/barnaclejack.png
--------------------------------------------------------------------------------
/gfx/enemy/basilisk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/basilisk.png
--------------------------------------------------------------------------------
/gfx/enemy/beholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/beholder.png
--------------------------------------------------------------------------------
/gfx/enemy/blood_own.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/blood_own.png
--------------------------------------------------------------------------------
/gfx/enemy/bulette.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/bulette.png
--------------------------------------------------------------------------------
/gfx/enemy/chibidevil.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/chibidevil.png
--------------------------------------------------------------------------------
/gfx/enemy/cobra.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/cobra.png
--------------------------------------------------------------------------------
/gfx/enemy/dark_lord.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/dark_lord.png
--------------------------------------------------------------------------------
/gfx/enemy/dark_stalker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/dark_stalker.png
--------------------------------------------------------------------------------
/gfx/enemy/death_crab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/death_crab.png
--------------------------------------------------------------------------------
/gfx/enemy/death_flower.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/death_flower.png
--------------------------------------------------------------------------------
/gfx/enemy/death_gauntlet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/death_gauntlet.png
--------------------------------------------------------------------------------
/gfx/enemy/death_scorpion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/death_scorpion.png
--------------------------------------------------------------------------------
/gfx/enemy/demon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/demon.png
--------------------------------------------------------------------------------
/gfx/enemy/denden.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/denden.png
--------------------------------------------------------------------------------
/gfx/enemy/doppel_mirror.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/doppel_mirror.png
--------------------------------------------------------------------------------
/gfx/enemy/dragonfly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/dragonfly.png
--------------------------------------------------------------------------------
/gfx/enemy/duck_soldier.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/duck_soldier.png
--------------------------------------------------------------------------------
/gfx/enemy/earth_elemental.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/earth_elemental.png
--------------------------------------------------------------------------------
/gfx/enemy/evil_sword.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/evil_sword.png
--------------------------------------------------------------------------------
/gfx/enemy/eye_spy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/eye_spy.png
--------------------------------------------------------------------------------
/gfx/enemy/fire_moth.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/fire_moth.png
--------------------------------------------------------------------------------
/gfx/enemy/gal_fish.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/gal_fish.png
--------------------------------------------------------------------------------
/gfx/enemy/garasha.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/garasha.png
--------------------------------------------------------------------------------
/gfx/enemy/gargoyle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/gargoyle.png
--------------------------------------------------------------------------------
/gfx/enemy/gas_cloud.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/gas_cloud.png
--------------------------------------------------------------------------------
/gfx/enemy/gaurdian.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/gaurdian.png
--------------------------------------------------------------------------------
/gfx/enemy/ghost.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/ghost.png
--------------------------------------------------------------------------------
/gfx/enemy/goblin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/goblin.png
--------------------------------------------------------------------------------
/gfx/enemy/green_slime.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/green_slime.png
--------------------------------------------------------------------------------
/gfx/enemy/grell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/grell.png
--------------------------------------------------------------------------------
/gfx/enemy/griffin_hand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/griffin_hand.png
--------------------------------------------------------------------------------
/gfx/enemy/julius.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/julius.png
--------------------------------------------------------------------------------
/gfx/enemy/killer_bee.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/killer_bee.png
--------------------------------------------------------------------------------
/gfx/enemy/land_leech.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/land_leech.png
--------------------------------------------------------------------------------
/gfx/enemy/lizardman.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/lizardman.png
--------------------------------------------------------------------------------
/gfx/enemy/magician.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/magician.png
--------------------------------------------------------------------------------
/gfx/enemy/mammoth.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/mammoth.png
--------------------------------------------------------------------------------
/gfx/enemy/mandrake.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/mandrake.png
--------------------------------------------------------------------------------
/gfx/enemy/manta_ray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/manta_ray.png
--------------------------------------------------------------------------------
/gfx/enemy/mega_xorn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/mega_xorn.png
--------------------------------------------------------------------------------
/gfx/enemy/mimic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/mimic.png
--------------------------------------------------------------------------------
/gfx/enemy/minotaur.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/minotaur.png
--------------------------------------------------------------------------------
/gfx/enemy/molebear.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/molebear.png
--------------------------------------------------------------------------------
/gfx/enemy/mudman.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/mudman.png
--------------------------------------------------------------------------------
/gfx/enemy/mummy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/mummy.png
--------------------------------------------------------------------------------
/gfx/enemy/myconid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/myconid.png
--------------------------------------------------------------------------------
/gfx/enemy/ninja.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/ninja.png
--------------------------------------------------------------------------------
/gfx/enemy/ogre.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/ogre.png
--------------------------------------------------------------------------------
/gfx/enemy/orc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/orc.png
--------------------------------------------------------------------------------
/gfx/enemy/pakkun_lizard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/pakkun_lizard.png
--------------------------------------------------------------------------------
/gfx/enemy/phantasm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/phantasm.png
--------------------------------------------------------------------------------
/gfx/enemy/porcupine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/porcupine.png
--------------------------------------------------------------------------------
/gfx/enemy/poto.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/poto.png
--------------------------------------------------------------------------------
/gfx/enemy/pumpkin_bomb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/pumpkin_bomb.png
--------------------------------------------------------------------------------
/gfx/enemy/rabite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/rabite.png
--------------------------------------------------------------------------------
/gfx/enemy/red_wisp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/red_wisp.png
--------------------------------------------------------------------------------
/gfx/enemy/roper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/roper.png
--------------------------------------------------------------------------------
/gfx/enemy/ruster.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/ruster.png
--------------------------------------------------------------------------------
/gfx/enemy/sabercat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/sabercat.png
--------------------------------------------------------------------------------
/gfx/enemy/sahagin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/sahagin.png
--------------------------------------------------------------------------------
/gfx/enemy/saurus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/saurus.png
--------------------------------------------------------------------------------
/gfx/enemy/sea_dragon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/sea_dragon.png
--------------------------------------------------------------------------------
/gfx/enemy/shadow_zero.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/shadow_zero.png
--------------------------------------------------------------------------------
/gfx/enemy/skeleton.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/skeleton.png
--------------------------------------------------------------------------------
/gfx/enemy/snowman.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/snowman.png
--------------------------------------------------------------------------------
/gfx/enemy/tarantula.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/tarantula.png
--------------------------------------------------------------------------------
/gfx/enemy/tortoise_knight.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/tortoise_knight.png
--------------------------------------------------------------------------------
/gfx/enemy/unknown1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/unknown1.png
--------------------------------------------------------------------------------
/gfx/enemy/walrus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/walrus.png
--------------------------------------------------------------------------------
/gfx/enemy/wererat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/wererat.png
--------------------------------------------------------------------------------
/gfx/enemy/werewolf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/werewolf.png
--------------------------------------------------------------------------------
/gfx/enemy/wizard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/wizard.png
--------------------------------------------------------------------------------
/gfx/enemy/wonder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/wonder.png
--------------------------------------------------------------------------------
/gfx/enemy/zombie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/enemy/zombie.png
--------------------------------------------------------------------------------
/gfx/font.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/font.png
--------------------------------------------------------------------------------
/gfx/hand_spark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/hand_spark.png
--------------------------------------------------------------------------------
/gfx/minecart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/minecart.png
--------------------------------------------------------------------------------
/gfx/moogle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/moogle.png
--------------------------------------------------------------------------------
/gfx/npc/amanda_dead.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/amanda_dead.png
--------------------------------------------------------------------------------
/gfx/npc/amanda_ill.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/amanda_ill.png
--------------------------------------------------------------------------------
/gfx/npc/bogard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/bogard.png
--------------------------------------------------------------------------------
/gfx/npc/bowow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/bowow.png
--------------------------------------------------------------------------------
/gfx/npc/cibba.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/cibba.png
--------------------------------------------------------------------------------
/gfx/npc/davias.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/davias.png
--------------------------------------------------------------------------------
/gfx/npc/effect/music.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/effect/music.png
--------------------------------------------------------------------------------
/gfx/npc/egg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/egg.png
--------------------------------------------------------------------------------
/gfx/npc/follower/amanda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/follower/amanda.png
--------------------------------------------------------------------------------
/gfx/npc/follower/chocobo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/follower/chocobo.png
--------------------------------------------------------------------------------
/gfx/npc/follower/chocobot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/follower/chocobot.png
--------------------------------------------------------------------------------
/gfx/npc/follower/girl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/follower/girl.png
--------------------------------------------------------------------------------
/gfx/npc/follower/lester.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/follower/lester.png
--------------------------------------------------------------------------------
/gfx/npc/follower/marcie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/follower/marcie.png
--------------------------------------------------------------------------------
/gfx/npc/follower/mysteryman.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/follower/mysteryman.png
--------------------------------------------------------------------------------
/gfx/npc/follower/watts.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/follower/watts.png
--------------------------------------------------------------------------------
/gfx/npc/girl_window.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/girl_window.png
--------------------------------------------------------------------------------
/gfx/npc/gladiator_friend.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/gladiator_friend.png
--------------------------------------------------------------------------------
/gfx/npc/last_guy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/last_guy.png
--------------------------------------------------------------------------------
/gfx/npc/lester_instrument.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/lester_instrument.png
--------------------------------------------------------------------------------
/gfx/npc/magic_merchant.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/magic_merchant.png
--------------------------------------------------------------------------------
/gfx/npc/minecart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/minecart.png
--------------------------------------------------------------------------------
/gfx/npc/mother.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/mother.png
--------------------------------------------------------------------------------
/gfx/npc/parrot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/parrot.png
--------------------------------------------------------------------------------
/gfx/npc/pot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/pot.png
--------------------------------------------------------------------------------
/gfx/npc/prison_bars.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/prison_bars.png
--------------------------------------------------------------------------------
/gfx/npc/willy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/npc/willy.png
--------------------------------------------------------------------------------
/gfx/player.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/player.png
--------------------------------------------------------------------------------
/gfx/projectile/arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/arrow.png
--------------------------------------------------------------------------------
/gfx/projectile/arrow2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/arrow2.png
--------------------------------------------------------------------------------
/gfx/projectile/axe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/axe.png
--------------------------------------------------------------------------------
/gfx/projectile/bat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/bat.png
--------------------------------------------------------------------------------
/gfx/projectile/blacksworl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/blacksworl.png
--------------------------------------------------------------------------------
/gfx/projectile/chestbite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/chestbite.png
--------------------------------------------------------------------------------
/gfx/projectile/claw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/claw.png
--------------------------------------------------------------------------------
/gfx/projectile/explosion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/explosion.png
--------------------------------------------------------------------------------
/gfx/projectile/feather.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/feather.png
--------------------------------------------------------------------------------
/gfx/projectile/feather2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/feather2.png
--------------------------------------------------------------------------------
/gfx/projectile/fire.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/fire.png
--------------------------------------------------------------------------------
/gfx/projectile/fire2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/fire2.png
--------------------------------------------------------------------------------
/gfx/projectile/fireball.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/fireball.png
--------------------------------------------------------------------------------
/gfx/projectile/ice.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/ice.png
--------------------------------------------------------------------------------
/gfx/projectile/knife.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/knife.png
--------------------------------------------------------------------------------
/gfx/projectile/laser.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/laser.png
--------------------------------------------------------------------------------
/gfx/projectile/laser2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/laser2.png
--------------------------------------------------------------------------------
/gfx/projectile/lightning.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/lightning.png
--------------------------------------------------------------------------------
/gfx/projectile/mirrorimage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/mirrorimage.png
--------------------------------------------------------------------------------
/gfx/projectile/nail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/nail.png
--------------------------------------------------------------------------------
/gfx/projectile/needle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/needle.png
--------------------------------------------------------------------------------
/gfx/projectile/needles.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/needles.png
--------------------------------------------------------------------------------
/gfx/projectile/ninjastar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/ninjastar.png
--------------------------------------------------------------------------------
/gfx/projectile/orb1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/orb1.png
--------------------------------------------------------------------------------
/gfx/projectile/orb2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/orb2.png
--------------------------------------------------------------------------------
/gfx/projectile/pitchfork.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/pitchfork.png
--------------------------------------------------------------------------------
/gfx/projectile/ring.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/ring.png
--------------------------------------------------------------------------------
/gfx/projectile/rock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/rock.png
--------------------------------------------------------------------------------
/gfx/projectile/skull.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/skull.png
--------------------------------------------------------------------------------
/gfx/projectile/snake.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/snake.png
--------------------------------------------------------------------------------
/gfx/projectile/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/splash.png
--------------------------------------------------------------------------------
/gfx/projectile/star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/star.png
--------------------------------------------------------------------------------
/gfx/projectile/sun.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/sun.png
--------------------------------------------------------------------------------
/gfx/projectile/sword.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/sword.png
--------------------------------------------------------------------------------
/gfx/projectile/wave.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/wave.png
--------------------------------------------------------------------------------
/gfx/projectile/wind.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/projectile/wind.png
--------------------------------------------------------------------------------
/gfx/statusbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/statusbar.png
--------------------------------------------------------------------------------
/gfx/tileset/caves.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/tileset/caves.png
--------------------------------------------------------------------------------
/gfx/tileset/indoor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/tileset/indoor.png
--------------------------------------------------------------------------------
/gfx/tileset/outdoor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/tileset/outdoor.png
--------------------------------------------------------------------------------
/gfx/tileset/town_airship_mountain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/tileset/town_airship_mountain.png
--------------------------------------------------------------------------------
/gfx/title_end.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/title_end.png
--------------------------------------------------------------------------------
/gfx/trashbin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daid/FFA-Disassembly/0798d848abc59b1b02f1f2f2b21979f660d687ea/gfx/trashbin.png
--------------------------------------------------------------------------------
/plugins/attack.py:
--------------------------------------------------------------------------------
1 | from annotation.annotation import annotation
2 | from annotation.simple import DataBlock, JumpTable
3 | from block.base import Block
4 | from block.gfx import GfxBlock
5 | from block.code import CodeBlock
6 | from romInfo import RomInfo
7 |
8 |
9 | @annotation
10 | def attack_info(memory, addr, *, amount):
11 | DataBlock(memory, addr, format="p", amount=int(amount))
12 | for n in range(int(amount)):
13 | ptr = memory.word(addr + n * 2)
14 | if ptr != 0 and not memory[ptr]:
15 | AttackInfo(memory, ptr)
16 |
17 |
18 | class AttackInfo(Block):
19 | def __init__(self, memory, addr):
20 | super().__init__(memory, addr, size=42)
21 |
22 | gfx_ptr = memory.word(addr + 6)
23 | RomInfo.romBank(0x08).addAutoLabel(gfx_ptr, None, "data")
24 |
25 | for n in range(17):
26 | memory.addAutoLabel(memory.word(addr + 8 + n * 2), None, "data")
27 |
28 | def export(self, file):
29 | # 0) animation delay
30 | # 6) pointer to graphics
31 | file.asmLine(6, "db",
32 | "$%02x" % self.memory.byte(file.addr+0), "$%02x" % self.memory.byte(file.addr+1),
33 | "$%02x" % self.memory.byte(file.addr+2), "$%02x" % self.memory.byte(file.addr+3),
34 | "$%02x" % self.memory.byte(file.addr+4), "$%02x" % self.memory.byte(file.addr+5), is_data=True)
35 | file.asmLine(4, "dw", str(RomInfo.romBank(0x08).getLabel(self.memory.word(file.addr))), str(self.memory.getLabel(self.memory.word(file.addr+2))), is_data=True)
36 | # List of pointers per type of attack
37 | # 0) attack while holding direction
38 | # 1) attack while standing
39 | # 2) attack while holding direction and full will bar
40 | # 3) attack while standing and full will bar
41 | for n in range(4):
42 | file.asmLine(8, "dw",
43 | str(self.memory.getLabel(self.memory.word(file.addr+0))), str(self.memory.getLabel(self.memory.word(file.addr+2))),
44 | str(self.memory.getLabel(self.memory.word(file.addr+4))), str(self.memory.getLabel(self.memory.word(file.addr+6))), is_data=True)
45 |
--------------------------------------------------------------------------------
/plugins/boss.py:
--------------------------------------------------------------------------------
1 | from annotation.annotation import annotation
2 | from annotation.simple import DataBlock, JumpTable
3 | from block.base import Block
4 | from block.gfx import GfxBlock
5 | from block.code import CodeBlock
6 | from romInfo import RomInfo
7 |
8 |
9 | @annotation
10 | def boss_data(memory, addr, *, amount):
11 | for n in range(int(amount)):
12 | BossDataBlock(memory, addr + n * 24)
13 |
14 |
15 | class BossDataBlock(Block):
16 | def __init__(self, memory, addr):
17 | super().__init__(memory, addr, size=24)
18 |
19 | script_index = memory.word(addr + 6)
20 | gfx_ptr = memory.word(addr + 10)
21 | tile_indices_ptr = memory.word(addr + 12)
22 | metatile_ptr = memory.word(addr + 14)
23 |
24 | damage_ptr = memory.word(addr + 16)
25 | attack_pattern_ptr = memory.word(addr + 18)
26 | initial_pattern_ptr = memory.word(addr + 20)
27 | death_animation_ptr = memory.word(addr + 22)
28 |
29 | memory.addAutoLabel(tile_indices_ptr, None, "data")
30 | memory.addAutoLabel(metatile_ptr, None, "data")
31 |
32 | memory.addAutoLabel(damage_ptr, None, "data")
33 | memory.addAutoLabel(attack_pattern_ptr, None, "data")
34 | memory.addAutoLabel(initial_pattern_ptr, None, "data")
35 | memory.addAutoLabel(death_animation_ptr, None, "data")
36 |
37 | self.gfx_bank = (gfx_ptr >> 14) + 0x08
38 | self.gfx_ptr = (gfx_ptr & 0x3FFF) | 0x4000
39 | RomInfo.romBank(self.gfx_bank).addAutoLabel(self.gfx_ptr, None, "data")
40 |
41 | if memory[attack_pattern_ptr] is None:
42 | BossPatternBlock(memory, attack_pattern_ptr)
43 | if memory[initial_pattern_ptr] is None:
44 | BossPatternBlock(memory, initial_pattern_ptr)
45 | if memory[death_animation_ptr] is None:
46 | BossDeathBlock(memory, death_animation_ptr)
47 |
48 | RomInfo.macros["BOSS_HEADER"] = r"""
49 | db \1, \2, \3, \4, \5, \6
50 | SCRIPT_IDX \7
51 | """
52 | RomInfo.macros["BOSS_HEADER_GFX"] = r"""
53 | db \1, \2
54 | dw (\3 & $3FFF) | ((BANK(\3) - $08) << 14), \4, \5
55 | """
56 |
57 | def export(self, file):
58 | script_index = self.memory.word(file.addr + 6)
59 | script_pointer = RomInfo.romBank(0x08).word(0x4f05 + script_index * 2)
60 | script_bank = RomInfo.romBank(0x0D + (script_pointer >> 14))
61 | script_label = script_bank.getLabel((script_pointer & 0x3FFF) | 0x4000)
62 |
63 | file.asmLine(8, "BOSS_HEADER",
64 | "$%02x" % (self.memory.byte(file.addr + 0)),
65 | "$%02x" % (self.memory.byte(file.addr + 1)),
66 | "$%02x" % (self.memory.byte(file.addr + 2)),
67 | "$%02x" % (self.memory.byte(file.addr + 3)),
68 | "$%02x" % (self.memory.byte(file.addr + 4)),
69 | "$%02x" % (self.memory.byte(file.addr + 5)),
70 | script_label,
71 | is_data=True
72 | )
73 | file.asmLine(8, " BOSS_HEADER_GFX",
74 | "$%02x" % (self.memory.byte(file.addr + 0)),
75 | "$%02x" % (self.memory.byte(file.addr + 1)),
76 | str(RomInfo.romBank(self.gfx_bank).getLabel(self.gfx_ptr)),
77 | str(self.memory.getLabel(self.memory.word(file.addr + 4))),
78 | str(self.memory.getLabel(self.memory.word(file.addr + 6))),
79 | is_data=True
80 | )
81 | file.asmLine(8, " dw",
82 | str(self.memory.getLabel(self.memory.word(file.addr + 0))),
83 | str(self.memory.getLabel(self.memory.word(file.addr + 2))),
84 | str(self.memory.getLabel(self.memory.word(file.addr + 4))),
85 | str(self.memory.getLabel(self.memory.word(file.addr + 6))),
86 | is_data=True
87 | )
88 |
89 |
90 | class BossPatternBlock(Block):
91 | def __init__(self, memory, addr):
92 | super().__init__(memory, addr, size=10)
93 |
94 | for n in range(4):
95 | a = memory.word(addr + n * 2)
96 | memory.addAutoLabel(a, None, "data")
97 | if memory[a] is None:
98 | BossPatternBlock2(memory, a)
99 |
100 | if memory.word(addr + 10) != 0xFFFF:
101 | BossPatternBlock(memory, addr + 10)
102 |
103 | def export(self, file):
104 | file.asmLine(8, "dw",
105 | str(self.memory.getLabel(self.memory.word(file.addr + 0))),
106 | str(self.memory.getLabel(self.memory.word(file.addr + 2))),
107 | str(self.memory.getLabel(self.memory.word(file.addr + 4))),
108 | str(self.memory.getLabel(self.memory.word(file.addr + 6))),
109 | is_data=True
110 | )
111 | file.asmLine(2, "db",
112 | "$%02x" % (self.memory.byte(file.addr + 0)),
113 | "$%02x" % (self.memory.byte(file.addr + 1)),
114 | is_data=True
115 | )
116 |
117 | class BossPatternBlock2(Block):
118 | def __init__(self, memory, addr):
119 | super().__init__(memory, addr, size=5)
120 |
121 | for n in range(2):
122 | memory.addAutoLabel(memory.word(addr + 1 + n * 2), None, "data")
123 |
124 | if memory.byte(addr + 5) != 0xFF:
125 | BossPatternBlock2(memory, addr + 5)
126 |
127 | def export(self, file):
128 | file.asmLine(1, "db",
129 | "$%02x" % (self.memory.byte(file.addr + 0)),
130 | is_data=True
131 | )
132 | file.asmLine(4, "dw",
133 | str(self.memory.getLabel(self.memory.word(file.addr + 0))),
134 | str(self.memory.getLabel(self.memory.word(file.addr + 2))),
135 | is_data=True
136 | )
137 |
138 | class BossDeathBlock(Block):
139 | def __init__(self, memory, addr):
140 | super().__init__(memory, addr, size=5)
141 |
142 | for n in range(2):
143 | memory.addAutoLabel(memory.word(addr + 1 + n * 2), None, "data")
144 |
145 | if memory.byte(addr + 5) != 0xFF:
146 | BossDeathBlock(memory, addr + 5)
147 |
148 | def export(self, file):
149 | file.asmLine(1, "db",
150 | "$%02x" % (self.memory.byte(file.addr + 0)),
151 | is_data=True
152 | )
153 | file.asmLine(4, "dw",
154 | str(self.memory.getLabel(self.memory.word(file.addr + 0))),
155 | str(self.memory.getLabel(self.memory.word(file.addr + 2))),
156 | is_data=True
157 | )
158 |
--------------------------------------------------------------------------------
/plugins/call_to_bank.py:
--------------------------------------------------------------------------------
1 | from annotation.annotation import annotation
2 | from annotation.simple import DataBlock, JumpTable
3 | from block.base import Block
4 | from block.gfx import GfxBlock
5 | from block.code import CodeBlock
6 | from romInfo import RomInfo
7 |
8 |
9 | class CallToBankCodeBlock(CodeBlock):
10 | def __init__(self, memory, addr, *, bank):
11 | super().__init__(memory, addr)
12 | self.target_bank = bank
13 |
14 | def onCall(self, from_memory, from_address, next_addr):
15 | print("call", from_memory, from_address, next_addr, self.target_bank)
16 |
17 | def onJump(self, from_memory, from_address, next_addr):
18 | assert from_memory.byte(from_address-3) == 0xf5 # PUSH AF
19 | assert from_memory.byte(from_address-2) == 0x3e # LD A, $xx
20 | index = from_memory.byte(from_address-1)
21 | block = from_memory[from_address]
22 | block.resize(len(block) - (next_addr - from_address) - 3, allow_shrink=True)
23 | JumpToBankBlock(from_memory, from_address - 3, target_bank=self.target_bank, function_index=index)
24 |
25 | class JumpToBankBlock(Block):
26 | def __init__(self, memory, addr, *, target_bank, function_index):
27 | super().__init__(memory, addr, size=6)
28 | self.target_bank = target_bank
29 | self.function_index = function_index
30 |
31 | def export(self, file):
32 | mem = RomInfo.romBank(self.target_bank)
33 | addr = mem.word(0x4000 + self.function_index * 2)
34 | label = mem.getLabel(addr)
35 | file.asmLine(6, "jp_to_bank %02x, %s" % (self.target_bank, label));
36 |
37 | @annotation(priority=0)
38 | def call_to_bank(memory, addr, *, bank):
39 | CallToBankCodeBlock(memory, addr, bank=int(bank, 16))
40 | if "jp_to_bank" not in RomInfo.macros:
41 | RomInfo.macros["jp_to_bank"] = """
42 | push af
43 | ld a, (_call_to_bank_target_\\2 - $4000) / 2
44 | jp callFunctionInBank\\1
45 | """
46 |
47 | class CallToBankJumpTable(JumpTable):
48 | def export(self, file):
49 | for n in range(len(self) // 2):
50 | label = self.memory.getLabel(self.memory.word(file.addr))
51 | if label:
52 | label = str(label)
53 | else:
54 | label = "$%04x" % self.memory.word(file.addr)
55 | file.asmLine(2, "call_to_bank_target", label, is_data=True)
56 |
57 | @annotation
58 | def call_to_bank_jumptable(memory, addr, *, amount=None, label=None):
59 | CallToBankJumpTable(memory, addr, amount=int(amount) if amount is not None else None)
60 | if "call_to_bank_target" not in RomInfo.macros:
61 | RomInfo.macros["call_to_bank_target"] = "_call_to_bank_target_\\1::\ndw \\1"
62 |
--------------------------------------------------------------------------------
/plugins/item.py:
--------------------------------------------------------------------------------
1 | from annotation.annotation import annotation
2 | from annotation.simple import DataBlock, JumpTable
3 | from block.base import Block
4 | from block.gfx import GfxBlock
5 | from block.code import CodeBlock
6 | from autoLabel import RelativeLabel
7 | from romInfo import RomInfo
8 |
9 |
10 | @annotation
11 | def item_data(memory, addr, *, amount):
12 | RomInfo.macros["ITEM_DATA"] = r"""
13 | db \1
14 | TXT \2
15 | db \3, \4, \5, \6, \7, \8, \9
16 | """
17 | for n in range(1, 16):
18 | RelativeLabel(memory, addr + n, addr)
19 | for n in range(int(amount)):
20 | ItemDataBlock(memory, addr + n * 16)
21 |
22 |
23 | class ItemDataBlock(Block):
24 | def __init__(self, memory, addr):
25 | super().__init__(memory, addr, size=16)
26 |
27 | def export(self, file):
28 | charmap = RomInfo.charmap["BASIC"]
29 | name = ""
30 | for n in range(8):
31 | name += charmap[self.memory.byte(file.addr + 1 + n)]
32 | name = "\"%s\"" % (name)
33 | name = "%-40s" % (name)
34 | file.asmLine(16, "ITEM_DATA",
35 | "$%02x" % (self.memory.byte(file.addr + 0)),
36 | name,
37 | "$%02x" % (self.memory.byte(file.addr + 9)),
38 | "$%02x" % (self.memory.byte(file.addr + 10)),
39 | "$%02x" % (self.memory.byte(file.addr + 11)),
40 | "$%02x" % (self.memory.byte(file.addr + 12)),
41 | "$%02x" % (self.memory.byte(file.addr + 13)),
42 | "$%02x" % (self.memory.byte(file.addr + 14)),
43 | "$%02x" % (self.memory.byte(file.addr + 15)),
44 | is_data=True
45 | )
46 |
--------------------------------------------------------------------------------
/plugins/mapdata.py:
--------------------------------------------------------------------------------
1 | from annotation.annotation import annotation
2 | from annotation.simple import DataBlock, JumpTable
3 | from block.base import Block
4 | from block.gfx import GfxBlock
5 | from block.code import CodeBlock
6 | from romInfo import RomInfo
7 |
8 |
9 | @annotation
10 | def map_headers(memory, addr, *, amount):
11 | for n in range(int(amount)):
12 | MapHeaderBlock(memory, addr + n * 11)
13 |
14 |
15 | class MapHeaderBlock(Block):
16 | def __init__(self, memory, addr):
17 | super().__init__(memory, addr, size=11)
18 |
19 | self.graphics_addr = memory.word(addr)
20 | self.graphics_bank = 0x0C
21 | if self.graphics_addr >= 0x4000:
22 | self.graphics_bank -= 1
23 | else:
24 | self.graphics_addr += 0x4000
25 | self.unused0 = memory.byte(addr + 2)
26 | self.metatiles_addr = memory.word(addr + 3)
27 | self.unused1 = memory.byte(addr + 5)
28 | self.room_data_bank = memory.byte(addr + 6)
29 | self.room_data_addr = memory.word(addr + 7)
30 | self.unused2 = memory.byte(addr + 9)
31 | self.unused3 = memory.byte(addr + 10)
32 |
33 | RomInfo.macros["MAP_HEADER"] = r"""
34 | assert BANK(\1) == $0B || BANK(\1) == $0C
35 | dw (\1) - ($4000 * (BANK(\1) - $0B))
36 | db \2
37 | assert BANK(\3) == BANK(@)
38 | dw \3
39 | db \4
40 | db BANK(\5)
41 | dw \5
42 | db \6
43 | db \7
44 | """
45 | RomInfo.macros["RLE"] = r"""
46 | REPT _NARG
47 | IF _NARG > 0
48 | REDEF N = \1
49 | REDEF DO_RLE = 1
50 | IF _NARG < RLE_SIZE
51 | REDEF DO_RLE = 0
52 | ELSE
53 | REPT RLE_SIZE - 1
54 | IF N != \2
55 | REDEF DO_RLE = 0
56 | ENDC
57 | SHIFT 1
58 | ENDR
59 | SHIFT 1-RLE_SIZE
60 | ENDC
61 | IF DO_RLE
62 | SHIFT RLE_SIZE
63 | db N | $80
64 | ELSE
65 | SHIFT 1
66 | db N
67 | ENDC
68 | ENDC
69 | ENDR
70 | """
71 |
72 | RomInfo.romBank(self.graphics_bank).addAutoLabel(self.graphics_addr, None, "data")
73 | memory.addAutoLabel(self.metatiles_addr, None, "data")
74 | MapRoomPrefixBlock(RomInfo.romBank(self.room_data_bank), self.room_data_addr).addAutoLabel(self.room_data_addr, None, "data")
75 |
76 | def export(self, file):
77 | file.asmLine(11, "MAP_HEADER",
78 | str(RomInfo.romBank(self.graphics_bank).getLabel(self.graphics_addr)),
79 | "$%02x" % (self.unused0),
80 | str(self.memory.getLabel(self.metatiles_addr)),
81 | "$%02x" % (self.unused1),
82 | str(RomInfo.romBank(self.room_data_bank).getLabel(self.room_data_addr)),
83 | "$%02x" % (self.unused2),
84 | "$%02x" % (self.unused3),
85 | is_data=True
86 | )
87 |
88 |
89 | class MapRoomPrefixBlock(Block):
90 | def __init__(self, memory, addr):
91 | super().__init__(memory, addr, size=4)
92 | self.indoor_flag = memory.byte(addr)
93 | self.rle = memory.byte(addr + 1)
94 | self.h = memory.byte(addr + 2)
95 | self.w = memory.byte(addr + 3)
96 |
97 | if self.indoor_flag:
98 | self.room_template_addr = memory.word(addr + 4)
99 | memory.addAutoLabel(self.room_template_addr, None, "data")
100 | RLERoomDataBlock(memory, self.room_template_addr, self.rle)
101 | self.resize(30)
102 |
103 | for y in range(self.h):
104 | for x in range(self.w):
105 | room_script_info_addr = memory.word(addr + len(self))
106 | room_tiles_addr = memory.word(addr + len(self) + 2)
107 |
108 | memory.addAutoLabel(room_script_info_addr, None, "data")
109 | memory.addAutoLabel(room_tiles_addr, None, "data")
110 | self.resize(len(self) + 4)
111 |
112 | ScriptInfoBlock(memory, room_script_info_addr)
113 | if self.indoor_flag:
114 | IndoorTileRoomDataBlock(memory, room_tiles_addr)
115 | else:
116 | RLERoomDataBlock(memory, room_tiles_addr, self.rle)
117 |
118 | def export(self, file):
119 | file.dataLine(4)
120 | file.asmLine(0, "DEF", "RLE_SIZE = %d" % (self.rle))
121 | if self.indoor_flag:
122 | file.asmLine(2, "dw", self.memory.getLabel(self.room_template_addr))
123 | file.comment("Door tile info")
124 | for n in range(3):
125 | file.dataLine(8)
126 | file.comment("Room data pointers")
127 | for y in range(self.h):
128 | for x in range(self.w):
129 | file.asmLine(4, "dw", self.memory.getLabel(self.memory.word(file.addr)), self.memory.getLabel(self.memory.word(file.addr + 2)))
130 |
131 | class ScriptInfoBlock(Block):
132 | def __init__(self, memory, addr):
133 | super().__init__(memory, addr, size=2)
134 | while memory.byte(addr + len(self)) != 0xFF:
135 | self.resize(len(self) + 3)
136 | self.resize(len(self) + 1)
137 |
138 | RomInfo.macros["SCRIPT_IDX"] = r"dw (__script_pointer_\1 - scriptPointersTable) / 2"
139 | RomInfo.macros["SCRIPT_AT_POS"] = r"""
140 | db ((\1) << 4) | (\2)
141 | SCRIPT_IDX \3
142 | """
143 |
144 | def getScriptLabel(self, index):
145 | pointer = RomInfo.romBank(0x08).word(0x4f05 + index * 2)
146 | bank = RomInfo.romBank(0x0D + (pointer >> 14))
147 | label = bank.getLabel((pointer & 0x3FFF) | 0x4000)
148 | return "%s" % (label)
149 |
150 | def export(self, file):
151 | index = self.memory.word(file.addr)
152 | if index == 0xFFFF:
153 | file.asmLine(2, "dw", "$%04x" % (index))
154 | else:
155 | # TODO: This is actually used for more then 1 thing.
156 | # The direct index is on entering the room
157 | # index + 1 is used when leaving the room (not when warping)
158 | # index + 2 is used when all monsters are defeated (only if there where monsters)
159 | file.asmLine(2, "SCRIPT_IDX", self.getScriptLabel(index))
160 | while self.memory.byte(file.addr) != 0xFF:
161 | xy = self.memory.byte(file.addr)
162 | index = self.memory.word(file.addr + 1)
163 | if index == 0xFFFF: # Todo, figure out what $FFFF means...
164 | file.dataLine(3)
165 | else:
166 | file.asmLine(3, "SCRIPT_AT_POS", str(xy >> 4), str(xy & 0x0F), self.getScriptLabel(index))
167 | file.asmLine(1, "db", "$ff")
168 |
169 | class RLERoomDataBlock(Block):
170 | def __init__(self, memory, addr, rle):
171 | super().__init__(memory, addr)
172 | self.rle = rle
173 |
174 | if memory.byte(addr) == 0xFF:
175 | return
176 |
177 | count = 0
178 | while count < 10 * 8:
179 | if memory.byte(addr + len(self)) & 0x80:
180 | count += rle
181 | else:
182 | count += 1
183 | self.resize(len(self) + 1)
184 |
185 | def export(self, file):
186 | for y in range(8):
187 | args = []
188 | offset = 0
189 | while len(args) < 10:
190 | data = self.memory.byte(file.addr + offset)
191 | offset += 1
192 | args.append("$%02x" % (data & 0x7F))
193 | if data & 0x80:
194 | for n in range(self.rle - 1):
195 | args.append(args[-1])
196 | file.asmLine(offset, "RLE", *args, is_data=True)
197 |
198 | class IndoorTileRoomDataBlock(Block):
199 | def __init__(self, memory, addr, size=4):
200 | super().__init__(memory, addr)
201 | while memory.byte(addr + len(self)) != 0xff:
202 | self.resize(len(self) + 2)
203 | self.resize(len(self) + 2)
204 |
205 | def export(self, file):
206 | file.dataLine(4)
207 | while self.memory.byte(file.addr) != 0xff:
208 | file.dataLine(2)
209 | file.dataLine(2)
210 |
--------------------------------------------------------------------------------
/plugins/music.py:
--------------------------------------------------------------------------------
1 | from annotation.annotation import annotation
2 | from annotation.simple import DataBlock, JumpTable
3 | from block.base import Block
4 | from block.gfx import GfxBlock
5 | from block.code import CodeBlock
6 | from romInfo import RomInfo
7 |
8 |
9 | @annotation
10 | def music_pointers(memory, addr, *, amount):
11 | MusicPointerBlock(memory, addr, amount=int(amount))
12 | for k, v in OPCODES.items():
13 | params = ""
14 | for idx, param in enumerate(v[1:]):
15 | if PARAM_SIZE[param] == 1:
16 | params += f"\ndb \{idx+1}"
17 | elif PARAM_SIZE[param] == 2:
18 | params += f"\ndw \{idx+1}"
19 | RomInfo.macros[v[0]] = f"db ${(k&0xFF):02x}" + params
20 | for n in range(13):
21 | for k, v in NOTES.items():
22 | RomInfo.macros[f"{v}_{n}"] = f"db ${(n << 4) | k:02x}"
23 |
24 |
25 | class MusicPointerBlock(Block):
26 | def __init__(self, memory, addr, *, amount):
27 | super().__init__(memory, addr, size=amount*6)
28 |
29 | for song_nr in range(amount):
30 | for channel_nr in range(3):
31 | pointer = memory.word(addr + song_nr * 6 + channel_nr * 2)
32 | if memory.getLabel(pointer) is None:
33 | memory.addLabel(pointer, f"song{song_nr:02x}_channel{[2,1,3][channel_nr]}")
34 | MusicBlock(memory, pointer, channel_nr=channel_nr)
35 |
36 | def export(self, file):
37 | for n in range(len(self) // 6):
38 | pointer2 = self.memory.word(file.addr)
39 | pointer1 = self.memory.word(file.addr + 2)
40 | pointer3 = self.memory.word(file.addr + 4)
41 |
42 | label2 = self.memory.getLabel(pointer2)
43 | label1 = self.memory.getLabel(pointer1)
44 | label3 = self.memory.getLabel(pointer3)
45 | file.asmLine(6, "dw", str(label2), str(label1), str(label3))
46 |
47 | OPCODES = {
48 | 0xD0: ("mOCTAVE_0", ),
49 | 0xD1: ("mOCTAVE_1", ),
50 | 0xD2: ("mOCTAVE_2", ),
51 | 0xD3: ("mOCTAVE_3", ),
52 | 0xD4: ("mOCTAVE_4", ),
53 | 0xD5: ("mOCTAVE_5", ),
54 | 0xD6: ("mOCTAVE_6", ),
55 | 0xD7: ("mOCTAVE_7", ),
56 | 0xD8: ("mOCTAVE_PLUS_1", ),
57 | 0xD9: ("mOCTAVE_PLUS_2", ),
58 | 0xDA: ("mOCTAVE_PLUS_3", ),
59 | 0xDB: ("mOCTAVE_PLUS_4", ),
60 | 0xDC: ("mOCTAVE_MINUS_1", ),
61 | 0xDD: ("mOCTAVE_MINUS_2", ),
62 | 0xDE: ("mOCTAVE_MINUS_3", ),
63 | 0xDF: ("mOCTAVE_MINUS_4", ),
64 | 0xE0: ("mVOLUME_ENVELOPE", "ptr"),
65 | 0x3E0: ("mVOLUME", "byte"), # Special exception for channel 3 E0
66 | 0xE1: ("mJUMP", "mptr"),
67 | 0xE2: ("mREPEAT", "mptr"),
68 | 0xE3: ("mCOUNTER", "byte"),
69 | 0xE4: ("mVIBRATO", "ptr"),
70 | 0xE5: ("mDUTYCYCLE", "byte"),
71 | 0xE6: ("mSTEREOPAN", "byte"),
72 | 0xE7: ("mTEMPO", "byte"),
73 | 0xE8: ("mWAVETABLE", "ptr"),
74 | 0xE9: ("mREPEAT_2", "mptr"),
75 | 0xEA: ("mCOUNTER_2", "byte"),
76 | 0xEB: ("mJUMPIF", "byte", "mptr"),
77 | 0xED: ("mUNK_ED", "byte"),
78 | 0xFF: ("mEND", )
79 | }
80 | PARAM_SIZE = {"byte": 1, "ptr": 2, "mptr": 2}
81 |
82 | NOTES = {
83 | 0x00: ("mC"),
84 | 0x01: ("mCis"),
85 | 0x02: ("mD"),
86 | 0x03: ("mDis"),
87 | 0x04: ("mE"),
88 | 0x05: ("mF"),
89 | 0x06: ("mFis"),
90 | 0x07: ("mG"),
91 | 0x08: ("mGis"),
92 | 0x09: ("mA"),
93 | 0x0A: ("mAis"),
94 | 0x0B: ("mB"),
95 | 0x0C: ("mCPlus"),
96 | 0x0D: ("mCisPlus"),
97 | 0x0E: ("mWait"),
98 | 0x0F: ("mRest"),
99 | }
100 |
101 | class MusicBlock(Block):
102 | def __init__(self, memory, addr, *, channel_nr):
103 | super().__init__(memory, addr)
104 | self.channel_nr = channel_nr
105 |
106 | while True:
107 | if memory[addr + len(self)] is not None:
108 | break
109 | size = 1
110 | instruction = memory.byte(addr + len(self))
111 |
112 | if instruction == 0xE0 and channel_nr == 2:
113 | instruction = 0x3E0
114 |
115 | if instruction >= 0xD0:
116 | opcode_data = OPCODES.get(instruction)
117 | else:
118 | opcode_data = ("none",)
119 | for param in opcode_data[1:]:
120 | if param == "mptr":
121 | target = memory.word(addr + len(self) + size)
122 | memory.addAutoLabel(target, addr + len(self), "data")
123 | MusicBlock(memory, target, channel_nr=channel_nr)
124 | if param == "ptr":
125 | target = memory.word(addr + len(self) + size)
126 | if 0x4000 <= target < 0x8000:
127 | memory.addAutoLabel(target, addr + len(self), "data")
128 | size += PARAM_SIZE[param]
129 | self.resize(len(self) + size)
130 |
131 | if instruction == 0xFF or instruction == 0xE1: # channels seem to loop on this jump.
132 | break
133 |
134 | def export(self, file):
135 | while file.addr < self.base_address + len(self):
136 | self.outputInstruction(file)
137 |
138 | def outputInstruction(self, file):
139 | instruction = self.memory.byte(file.addr)
140 |
141 | if instruction < 0xD0:
142 | note = self.memory.byte(file.addr)
143 | name = NOTES.get(note & 0x0F)
144 | file.asmLine(1, name + '_' + str((note & 0xF0) >> 4))
145 | return
146 |
147 | if instruction == 0xE0 and self.channel_nr == 2:
148 | instruction = 0x3E0
149 | opcode = OPCODES.get(instruction)
150 | if opcode is None:
151 | file.asmLine(1, "db", f"${self.memory.byte(file.addr):02X}", comment="unknown music opcode")
152 | return
153 | size = 1
154 | params = []
155 | for param in opcode[1:]:
156 | if param == "byte":
157 | params.append(f"${self.memory.byte(file.addr+size):02x}")
158 | elif param in {"ptr", "mptr"}:
159 | label = self.memory.getLabel(self.memory.word(file.addr+size))
160 | if label:
161 | params.append(str(label))
162 | else:
163 | params.append(f"${self.memory.word(file.addr+size):04x}")
164 | else:
165 | params.append("??")
166 | size += PARAM_SIZE[param]
167 | file.asmLine(size, opcode[0], *params)
168 |
--------------------------------------------------------------------------------
/plugins/npc.py:
--------------------------------------------------------------------------------
1 | from annotation.annotation import annotation
2 | from annotation.simple import DataBlock, JumpTable
3 | from block.base import Block
4 | from block.gfx import GfxBlock
5 | from block.code import CodeBlock
6 | from romInfo import RomInfo
7 |
8 |
9 | NPC_NAMES = {
10 | 0x00: "NPC_SNOWMAN_STILL",
11 | 0x01: "NPC_FUJI_FOLLOWING",
12 | 0x02: "NPC_MYSTERYMAN_FOLLOWING",
13 | 0x03: "NPC_WATTS_FOLLOWING",
14 | 0x04: "NPC_BOGARD_FOLLOWING",
15 | 0x05: "NPC_AMANDA_FOLLOWING",
16 | 0x06: "NPC_LESTER_FOLLOWING",
17 | 0x07: "NPC_MARCIE_FOLLOWING",
18 | 0x08: "NPC_CHOCOBOT_FOLLOWING",
19 | 0x09: "NPC_CHOCOBO_FOLLOWING",
20 | 0x0a: "NPC_WEREWOLF_1",
21 | 0x0b: "NPC_INV_CURE",
22 | 0x0c: "NPC_CHEST_1",
23 | 0x0d: "NPC_CHEST_2",
24 | 0x0e: "NPC_CHEST_3",
25 | 0x0f: "NPC_CHEST_4",
26 | 0x10: "NPC_CHIBIDEVIL",
27 | 0x11: "NPC_RABBITE",
28 | 0x12: "NPC_GOBLIN",
29 | 0x13: "NPC_MUSHROOM",
30 | 0x14: "NPC_JELLYFISH",
31 | 0x15: "NPC_SWAMPMAN",
32 | 0x16: "NPC_LIZARDMAN",
33 | 0x17: "NPC_FLOWER",
34 | 0x18: "NPC_FACEORB",
35 | 0x19: "NPC_SKELETON",
36 | 0x1a: "NPC_EVIL_PLANT",
37 | 0x1b: "NPC_FLYING_FISH",
38 | 0x1c: "NPC_ZOMBIE",
39 | 0x1d: "NPC_MOUSE",
40 | 0x1e: "NPC_PUMPKIN",
41 | 0x1f: "NPC_OWL",
42 | 0x20: "NPC_BEE",
43 | 0x21: "NPC_CLOUD",
44 | 0x22: "NPC_PIG",
45 | 0x23: "NPC_CRAB",
46 | 0x24: "NPC_SPIDER",
47 | 0x25: "NPC_INV_OPEN_NORTH",
48 | 0x26: "NPC_INV_OPEN_SOUTH",
49 | 0x27: "NPC_INV_OPEN_EAST",
50 | 0x28: "NPC_INV_OPEN_WEST",
51 | 0x29: "NPC_MIMIC_CHEST",
52 | 0x2a: "NPC_HOPPING_BUG",
53 | 0x2b: "NPC_PORCUPINE",
54 | 0x2c: "NPC_CARROT",
55 | 0x2d: "NPC_EYE_SPY",
56 | 0x2e: "NPC_WEREWOLF_2",
57 | 0x2f: "NPC_GHOST",
58 | 0x30: "NPC_BASILISK",
59 | 0x31: "NPC_SCORPION",
60 | 0x32: "NPC_SAURUS",
61 | 0x33: "NPC_MUMMY",
62 | 0x34: "NPC_PAKKUN_LIZARD",
63 | 0x35: "NPC_SNAKE",
64 | 0x36: "NPC_SHADOW",
65 | 0x37: "NPC_BLACK_WIZARD",
66 | 0x38: "NPC_FLAME",
67 | 0x39: "NPC_GARGOYLE",
68 | 0x3a: "NPC_MONKEY",
69 | 0x3b: "NPC_MOLEBEAR",
70 | 0x3c: "NPC_OGRE",
71 | 0x3d: "NPC_BARNACLEJACK",
72 | 0x3e: "NPC_PHANTASM",
73 | 0x3f: "NPC_MINOTAUR",
74 | 0x40: "NPC_GLAIVE_MAGE",
75 | 0x41: "NPC_GLAIVE_KNIGHT",
76 | 0x42: "NPC_DARK_LORD",
77 | 0x43: "NPC_MEGA_FLYTRAP",
78 | 0x44: "NPC_DRAGONFLY",
79 | 0x45: "NPC_ARMADILLO",
80 | 0x46: "NPC_SNOWMAN_MOVING",
81 | 0x47: "NPC_SABER_CAT",
82 | 0x48: "NPC_WALRUS",
83 | 0x49: "NPC_DUCK_SOLDIER",
84 | 0x4a: "NPC_POTO_RABBIT",
85 | 0x4b: "NPC_CYCLONE",
86 | 0x4c: "NPC_BEHOLDER_EYE",
87 | 0x4d: "NPC_MANTA_RAY",
88 | 0x4e: "NPC_JUMPING_HAND",
89 | 0x4f: "NPC_TORTOISE",
90 | 0x50: "NPC_FIRE_MOTH",
91 | 0x51: "NPC_EARTH_DIGGER",
92 | 0x52: "NPC_DENDEN_SNAIL",
93 | 0x53: "NPC_DOPPEL_MIRROR",
94 | 0x54: "NPC_GUARDIAN",
95 | 0x55: "NPC_EVIL_SWORD",
96 | 0x56: "NPC_GAUNTLET",
97 | 0x57: "NPC_GARASHA_DUCK",
98 | 0x58: "NPC_FUZZY_WONDER",
99 | 0x59: "NPC_ELEPHANT",
100 | 0x5a: "NPC_NINJA",
101 | 0x5b: "NPC_JULIUS",
102 | 0x5c: "NPC_DEMON_HEAD",
103 | 0x5d: "NPC_INV_DESSERT_CAVE_STONE",
104 | 0x5e: "NPC_WATER_DEMON",
105 | 0x5f: "NPC_SEA_DRAGON",
106 | 0x60: "NPC_GALL_FISH",
107 | 0x61: "NPC_WILLY",
108 | 0x62: "NPC_MYSTERYMAN_1",
109 | 0x63: "NPC_AMANDA_1",
110 | 0x64: "NPC_AMANDA_ILL",
111 | 0x65: "NPC_AMANDA_DEAD",
112 | 0x66: "NPC_FUJI_1",
113 | 0x67: "NPC_FUJI_WINDOW",
114 | 0x68: "NPC_MOTHER",
115 | 0x69: "NPC_BOGARD_1",
116 | 0x6a: "NPC_BOGARD_2",
117 | 0x6b: "NPC_KETTS_WEREWOLF",
118 | 0x6c: "NPC_INV_FUJI_COFFIN",
119 | 0x6d: "NPC_CIBBA",
120 | 0x6e: "NPC_GUY_WENDEL",
121 | 0x6f: "NPC_WATTS",
122 | 0x70: "NPC_MINECART",
123 | 0x71: "NPC_CHOCOBO_EGG",
124 | 0x72: "NPC_DAVIAS",
125 | 0x73: "NPC_LESTER_1",
126 | 0x74: "NPC_LESTER_PARROT",
127 | 0x75: "NPC_BOWOW",
128 | 0x76: "NPC_SARAH",
129 | 0x77: "NPC_MARCIE_1",
130 | 0x78: "NPC_KING_OF_LORIM",
131 | 0x79: "NPC_GLADIATOR_FRIEND",
132 | 0x7a: "NPC_INV_INN",
133 | 0x7b: "NPC_GIRL_TOPPLE",
134 | 0x7c: "NPC_GUY_TOPPLE",
135 | 0x7d: "NPC_GUY_TOPPLE_HOUSE",
136 | 0x7e: "NPC_GIRL_TOPPLE_HOUSE",
137 | 0x7f: "NPC_OLDMAN_TOPPLE",
138 | 0x80: "NPC_GUY_KETTS",
139 | 0x81: "NPC_GIRL_KETTS",
140 | 0x82: "NPC_GIRL_CIBBA",
141 | 0x83: "NPC_GUY_WENDEL2",
142 | 0x84: "NPC_GUY_WENDEL_HOUSE",
143 | 0x85: "NPC_WOMAN_CIBBA",
144 | 0x86: "NPC_OLDMAN_WENDEL",
145 | 0x87: "NPC_DWARF_1",
146 | 0x88: "NPC_DWARF_2",
147 | 0x89: "NPC_DWARF_3",
148 | 0x8a: "NPC_DWARF_4",
149 | 0x8b: "NPC_DWARF_5",
150 | 0x8c: "NPC_GUY_AIRSHIP_1",
151 | 0x8d: "NPC_GUY_AIRSHIP_2",
152 | 0x8e: "NPC_GUY_AIRSHIP_3",
153 | 0x8f: "NPC_GUY_AIRSHIP_4",
154 | 0x90: "NPC_OLDMAN_MENOS_1",
155 | 0x91: "NPC_GUY_MENOS",
156 | 0x92: "NPC_GIRL_MENOS_1",
157 | 0x93: "NPC_OLDMAN_MENOS_2",
158 | 0x94: "NPC_GIRL_MENOS",
159 | 0x95: "NPC_WOMAN_MENOS_2",
160 | 0x96: "NPC_GIRL_JADD_1",
161 | 0x97: "NPC_OLDMAN_JADD",
162 | 0x98: "NPC_GIRL_JADD_2",
163 | 0x99: "NPC_GUY_JADD",
164 | 0x9a: "NPC_DWARF_JADD",
165 | 0x9b: "NPC_SALESMAN_JADD",
166 | 0x9c: "NPC_GIRL_JADD_3",
167 | 0x9d: "NPC_BOY_JADD",
168 | 0x9e: "NPC_OLDMAN_ISH",
169 | 0x9f: "NPC_GUY_ISH_1",
170 | 0xa0: "NPC_GUY_ISH_2",
171 | 0xa1: "NPC_GIRL_ISH",
172 | 0xa2: "NPC_GUY_ISH_3",
173 | 0xa3: "NPC_GUY_ISH_4",
174 | 0xa4: "NPC_INV_STONE_1",
175 | 0xa5: "NPC_INV_STONE_2",
176 | 0xa6: "NPC_INV_STONE_3",
177 | 0xa7: "NPC_INV_STONE_4",
178 | 0xa8: "NPC_INV_STONE_5",
179 | 0xa9: "NPC_INV_STONE_6",
180 | 0xaa: "NPC_INV_STONE_7",
181 | 0xab: "NPC_INV_STONE_8",
182 | 0xac: "NPC_GUY_LORIM_FROZEN",
183 | 0xad: "NPC_GUY_LORIM_1",
184 | 0xae: "NPC_GUY_LORIM_2",
185 | 0xaf: "NPC_SALESMAN",
186 | 0xb0: "NPC_INV_SALESMAN_1",
187 | 0xb1: "NPC_FUJI_2",
188 | 0xb2: "NPC_INV_SALESMAN_2",
189 | 0xb3: "NPC_MYSTERYMAN_2",
190 | 0xb4: "NPC_BOGARD_3",
191 | 0xb5: "NPC_AMANDA_2",
192 | 0xb6: "NPC_LESTER_2",
193 | 0xb7: "NPC_MARCIE_2",
194 | 0xb8: "NPC_CHOCOBOT",
195 | 0xb9: "NPC_CHOCOBO_1",
196 | 0xba: "NPC_CHOCOBO_2",
197 | 0xbb: "NPC_PRISION_BARS",
198 | 0xbc: "NPC_MUSIC_NOTES",
199 | 0xbd: "NPC_MAGIC_SALESMAN",
200 | 0xbe: "NPC_LAST_GUY",
201 | }
202 |
203 |
204 | @annotation
205 | def npc_data(memory, addr, *, amount):
206 | for n in range(int(amount)):
207 | NpcDataBlock(memory, addr + n * 24, n)
208 |
209 | @annotation
210 | def npc_spawn_data(memory, addr, *, amount):
211 | RomInfo.constants["NPC_NAMES"] = {v: k for k, v in NPC_NAMES.items()}
212 | for n in range(int(amount)):
213 | NpcSpawnDataPointers(memory, addr + n * 6)
214 |
215 | class NpcDataBlock(Block):
216 | def __init__(self, memory, addr, index):
217 | super().__init__(memory, addr, size=24)
218 | self.index = index
219 |
220 | script_index = memory.word(addr + 20)
221 | gfx_ptr = memory.word(addr + 4)
222 |
223 | self.gfx_bank = (gfx_ptr >> 14) + 0x08
224 | self.gfx_ptr = (gfx_ptr & 0x3FFF) | 0x4000
225 | RomInfo.romBank(self.gfx_bank).addAutoLabel(self.gfx_ptr, None, "data")
226 |
227 | memory.addAutoLabel(memory.word(addr + 6), None, "data")
228 | a = memory.word(addr + 8)
229 | if a >= 0x4000:
230 | memory.addAutoLabel(memory.word(addr + 8), None, "data")
231 |
232 | RomInfo.macros["NPC_DATA"] = r"""
233 | db \1, \2, \3, \4
234 | dw (\5 & $3FFF) | ((BANK(\5) - $08) << 14), \6, \7
235 | db \8, \9
236 | SHIFT 9
237 | db \1, \2, \3, \4, \5, \6, \7, \8
238 | SCRIPT_IDX \9
239 | SHIFT 9
240 | IF ISCONST(\1)
241 | dw \1
242 | ELSE
243 | SCRIPT_IDX \1
244 | ENDC
245 | """
246 |
247 | def export(self, file):
248 | some_ptr = self.memory.word(file.addr + 8)
249 | some_label = str(self.memory.getLabel(some_ptr) if some_ptr >= 0x4000 else RomInfo.romBank(0).getLabel(some_ptr))
250 |
251 | script_index = self.memory.word(file.addr + 20) # script index
252 | script_pointer = RomInfo.romBank(0x08).word(0x4f05 + script_index * 2)
253 | script_bank = RomInfo.romBank(0x0D + (script_pointer >> 14))
254 | script_label = script_bank.getLabel((script_pointer & 0x3FFF) | 0x4000)
255 |
256 | chest_script_index = self.memory.word(file.addr + 22) # script index
257 | if chest_script_index == 0x0000:
258 | chest_script_label = "$0000"
259 | else:
260 | chest_script_pointer = RomInfo.romBank(0x08).word(0x4f05 + chest_script_index * 2)
261 | chest_script_bank = RomInfo.romBank(0x0D + (chest_script_pointer >> 14))
262 | chest_script_label = chest_script_bank.getLabel((chest_script_pointer & 0x3FFF) | 0x4000)
263 |
264 | # bbbbw p p bbbbbbbbbbwbb
265 | file.asmLine(24, "NPC_DATA",
266 | "$%02x" % (self.memory.byte(file.addr + 0)),
267 | "$%02x" % (self.memory.byte(file.addr + 1)),
268 | "$%02x" % (self.memory.byte(file.addr + 2)),
269 | "$%02x" % (self.memory.byte(file.addr + 3)),
270 | str(RomInfo.romBank(self.gfx_bank).getLabel(self.gfx_ptr)),
271 | str(self.memory.getLabel(self.memory.word(file.addr + 6))),
272 | some_label,
273 | "$%02x" % (self.memory.byte(file.addr + 10)),
274 | "$%02x" % (self.memory.byte(file.addr + 11)),
275 | "$%02x" % (self.memory.byte(file.addr + 12)),
276 | "$%02x" % (self.memory.byte(file.addr + 13)),
277 | "$%02x" % (self.memory.byte(file.addr + 14)),
278 | "$%02x" % (self.memory.byte(file.addr + 15)),
279 | "$%02x" % (self.memory.byte(file.addr + 16)),
280 | "$%02x" % (self.memory.byte(file.addr + 17)),
281 | "$%02x" % (self.memory.byte(file.addr + 18)),
282 | "$%02x" % (self.memory.byte(file.addr + 19)),
283 | script_label,
284 | chest_script_label,
285 | is_data=True,
286 | add_data_comment=False,
287 | comment=NPC_NAMES.get(self.index)
288 | )
289 |
290 | class NpcSpawnDataPointers(Block):
291 | def __init__(self, memory, addr):
292 | super().__init__(memory, addr, size=6)
293 | for n in range(3):
294 | ptr = memory.word(addr + n * 2)
295 | memory.addAutoLabel(ptr, None, "data")
296 | if memory[ptr] is None:
297 | NpcSpawnDataBlock(memory, ptr)
298 |
299 | def export(self, file):
300 | memory = self.memory
301 | file.asmLine(6, "dw",
302 | str(memory.getLabel(memory.word(file.addr))),
303 | str(memory.getLabel(memory.word(file.addr + 2))),
304 | str(memory.getLabel(memory.word(file.addr + 4))),
305 | is_data=True
306 | )
307 |
308 | class NpcSpawnDataBlock(Block):
309 | def __init__(self, memory, addr):
310 | super().__init__(memory, addr, size=6)
311 |
312 | def export(self, file):
313 | m = self.memory
314 | file.asmLine(6, "db",
315 | str(m.byte(file.addr)), str(m.byte(file.addr + 1)), # min, max
316 | NPC_NAMES.get(m.byte(file.addr + 2), "$%02x" % (m.byte(file.addr + 2))),
317 | NPC_NAMES.get(m.byte(file.addr + 3), "$%02x" % (m.byte(file.addr + 3))),
318 | NPC_NAMES.get(m.byte(file.addr + 4), "$%02x" % (m.byte(file.addr + 4))),
319 | NPC_NAMES.get(m.byte(file.addr + 5), "$%02x" % (m.byte(file.addr + 5))),
320 | is_data=True
321 | )
322 |
--------------------------------------------------------------------------------
/rom.gb.md5:
--------------------------------------------------------------------------------
1 | 24cd3bdf490ef2e1aa6a8af380eccd78 rom.gb
2 |
--------------------------------------------------------------------------------
/src/bank05_maps1.asm:
--------------------------------------------------------------------------------
1 | ;; Disassembled with BadBoy Disassembler: https://github.com/daid/BadBoy
2 |
3 | INCLUDE "include/hardware.inc"
4 | INCLUDE "include/macros.inc"
5 | INCLUDE "include/charmaps.inc"
6 | INCLUDE "include/constants.inc"
7 |
8 | SECTION "bank05", ROMX[$4000], BANK[$05]
9 |
10 | INCLUDE "data/map/00_rooms.asm"
11 |
12 | INCLUDE "data/map/09_rooms.asm"
13 |
--------------------------------------------------------------------------------
/src/bank06_maps2.asm:
--------------------------------------------------------------------------------
1 | ;; Disassembled with BadBoy Disassembler: https://github.com/daid/BadBoy
2 |
3 | INCLUDE "include/hardware.inc"
4 | INCLUDE "include/macros.inc"
5 | INCLUDE "include/charmaps.inc"
6 | INCLUDE "include/constants.inc"
7 |
8 | SECTION "bank06", ROMX[$4000], BANK[$06]
9 |
10 | INCLUDE "data/map/01_rooms.asm"
11 |
12 | INCLUDE "data/map/0F_rooms.asm"
13 |
14 | INCLUDE "data/map/0E_rooms.asm"
15 |
16 | INCLUDE "data/map/0A_rooms.asm"
17 |
18 | INCLUDE "data/map/08_rooms.asm"
19 |
--------------------------------------------------------------------------------
/src/bank07_maps3.asm:
--------------------------------------------------------------------------------
1 | ;; Disassembled with BadBoy Disassembler: https://github.com/daid/BadBoy
2 |
3 | INCLUDE "include/hardware.inc"
4 | INCLUDE "include/macros.inc"
5 | INCLUDE "include/charmaps.inc"
6 | INCLUDE "include/constants.inc"
7 |
8 | SECTION "bank07", ROMX[$4000], BANK[$07]
9 |
10 | INCLUDE "data/map/03_rooms.asm"
11 |
12 | INCLUDE "data/map/02_rooms.asm"
13 |
14 | INCLUDE "data/map/0D_rooms.asm"
15 |
16 | INCLUDE "data/map/04_rooms.asm"
17 |
18 | INCLUDE "data/map/05_rooms.asm"
19 |
20 | INCLUDE "data/map/0B_rooms.asm"
21 |
22 | INCLUDE "data/map/0C_rooms.asm"
23 |
24 | INCLUDE "data/map/06_rooms.asm"
25 |
26 | INCLUDE "data/map/07_rooms.asm"
27 |
--------------------------------------------------------------------------------
/src/bank08.asm:
--------------------------------------------------------------------------------
1 | ;; Disassembled with BadBoy Disassembler: https://github.com/daid/BadBoy
2 |
3 | INCLUDE "include/hardware.inc"
4 | INCLUDE "include/macros.inc"
5 | INCLUDE "include/charmaps.inc"
6 | INCLUDE "include/constants.inc"
7 |
8 | SECTION "bank08", ROMX[$4000], BANK[$08]
9 |
10 | INCLUDE "data/map/headers.asm"
11 |
12 | INCLUDE "data/metatiles.asm"
13 |
14 | INCLUDE "data/xptable.asm"
15 |
16 | INCLUDE "data/scriptPointers.asm"
17 | db $69, $2a, $18, $68, $ea, $17, $2a, $a3 ;; 08:5999 ????????
18 | db $4b, $a6, $0f, $4b, $66, $19, $4b, $26 ;; 08:59a1 ????????
19 | db $0f, $4a, $e6, $19, $4a, $a6, $0f, $6b ;; 08:59a9 ????????
20 | db $63, $4f, $1c, $25, $68, $46, $6c, $52 ;; 08:59b1 ????????
21 | db $1a, $29, $e8, $59, $ea, $52, $1a, $86 ;; 08:59b9 ????????
22 | db $92, $15, $b3, $00, $14, $f6, $00, $19 ;; 08:59c1 ????????
23 | db $a1, $00, $19, $e5, $00, $13, $a8, $00 ;; 08:59c9 ????????
24 | db $13, $e4, $06, $15, $64, $05, $19, $28 ;; 08:59d1 ????????
25 | db $04, $15, $30, $04, $2b, $ec, $4d, $75 ;; 08:59d9 ????????
26 | db $1e, $4c, $75, $14, $2c, $b3, $4d, $34 ;; 08:59e1 ????????
27 | db $0e, $6c, $b4, $4c, $0d, $2c, $b0, $4d ;; 08:59e9 ????????
28 | db $31, $0e, $6c, $b1, $4c, $0d, $2c, $ad ;; 08:59f1 ????????
29 | db $4d, $2e, $0e, $6c, $ae, $4c, $0d ;; 08:59f9 ???????
30 |
31 | gfxBlankTiles08:
32 | dw `00000000 ;; 08:5a00 $00 $00
33 | dw `00000000 ;; 08:5a02 $00 $00
34 | dw `00000000 ;; 08:5a04 $00 $00
35 | dw `00000000 ;; 08:5a06 $00 $00
36 | dw `00000000 ;; 08:5a08 $00 $00
37 | dw `00000000 ;; 08:5a0a $00 $00
38 | dw `00000000 ;; 08:5a0c $00 $00
39 | dw `00000000 ;; 08:5a0e $00 $00
40 |
41 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 08:5a10 ????????
42 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 08:5a18 ????????
43 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 08:5a20 ????????
44 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 08:5a28 ????????
45 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 08:5a30 ????????
46 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 08:5a38 ????????
47 |
48 | ;@gfximg name=player width=2 height=38
49 | gfxPlayer:
50 | INCBIN "player.bin" ;; 08:5a40
51 |
52 | ;@gfximg name=chest width=2 height=3
53 | gfxChest:
54 | INCBIN "chest.bin" ;; 08:5f00
55 |
56 | ;@gfximg name=hand_spark width=2 height=5
57 | gfxHand:
58 | INCBIN "hand_spark.bin" ;; 08:5f60
59 |
60 | ;@gfximg name=chocobo width=2 height=24
61 | gfxChocobo:
62 | INCBIN "chocobo.bin" ;; 08:6000
63 |
64 | ;@gfximg name=minecart width=2 height=6
65 | gfxMinecart:
66 | INCBIN "minecart.bin" ;; 08:6300
67 | ;@gfximg name=cloud width=2 height=2
68 | INCBIN "cloud.bin" ;; 08:63c0
69 |
70 | ;@gfximg name=moogle width=2 height=12
71 | gfxMoogle:
72 | INCBIN "moogle.bin" ;; 08:6400
73 | ;@gfximg name=chocobo2 width=2 height=12
74 | INCBIN "chocobo2.bin" ;; 08:6580
75 |
76 | ;@gfximg name=statusbar width=16 height=3
77 | gfxStatusBar:
78 | INCBIN "statusbar.bin" ;; 08:6700
79 | ;@gfximg name=font width=16 height=6
80 | INCBIN "font.bin" ;; 08:6a00
81 |
82 | ;@gfximg name=attack/sword width=2 height=6
83 | gfxAttackSword:
84 | INCBIN "attack/sword.bin" ;; 08:7000
85 |
86 | ;@gfximg name=attack/axe width=2 height=6
87 | gfxAttackAxe:
88 | INCBIN "attack/axe.bin" ;; 08:70c0
89 |
90 | ;@gfximg name=attack/morning_star width=2 height=6
91 | gfxAttackMorningStar:
92 | INCBIN "attack/morning_star.bin" ;; 08:7180
93 |
94 | ;@gfximg name=attack/sickle width=2 height=6
95 | gfxAttackSickle:
96 | INCBIN "attack/sickle.bin" ;; 08:7240
97 |
98 | ;@gfximg name=attacks1 width=6 height=1
99 | data_08_7300:
100 | INCBIN "attacks1.bin" ;; 08:7300
101 |
102 | ;@gfximg name=attacks2 width=14 height=1
103 | data_08_7360:
104 | INCBIN "attacks2.bin" ;; 08:7360
105 |
106 | ;@gfximg name=attack/mattok width=2 height=6
107 | gfxAttackMattok:
108 | INCBIN "attack/mattok.bin" ;; 08:7440
109 |
110 | ;@gfximg name=attacks3 width=2 height=4
111 | data_08_7500:
112 | INCBIN "attacks3.bin" ;; 08:7500
113 |
114 | data_08_7580:
115 | db $00, $00, $00, $00, $00, $00, $01, $01 ;; 08:7580 ????????
116 | db $06, $07, $05, $06, $0b, $0c, $0b, $0c ;; 08:7588 ????????
117 | db $00, $00, $00, $00, $00, $00, $80, $80 ;; 08:7590 ????????
118 | db $60, $e0, $a0, $60, $d0, $30, $d0, $30 ;; 08:7598 ????????
119 | db $0b, $0c, $05, $06, $06, $07, $01, $01 ;; 08:75a0 ????????
120 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 08:75a8 ????????
121 | db $d0, $30, $a0, $60, $60, $e0, $80, $80 ;; 08:75b0 ????????
122 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 08:75b8 ????????
123 | db $00, $00, $03, $03, $0c, $0f, $11, $1e ;; 08:75c0 ????????
124 | db $27, $38, $2f, $30, $4f, $70, $5f, $60 ;; 08:75c8 ????????
125 | db $00, $00, $c0, $c0, $30, $f0, $88, $78 ;; 08:75d0 ????????
126 | db $e4, $1c, $f4, $0c, $f2, $0e, $fa, $06 ;; 08:75d8 ????????
127 | db $5f, $60, $4f, $70, $2f, $30, $27, $38 ;; 08:75e0 ????????
128 | db $11, $1e, $0c, $0f, $03, $03, $00, $00 ;; 08:75e8 ????????
129 | db $fa, $06, $f2, $0e, $f4, $0c, $e4, $1c ;; 08:75f0 ????????
130 | db $88, $78, $30, $f0, $c0, $c0, $00, $00 ;; 08:75f8 ????????
131 |
132 | ;@gfximg name=effect/snowman width=2 height=2
133 | gfxSnowman:
134 | INCBIN "effect/snowman.bin" ;; 08:7600
135 |
136 | ;@gfximg name=attack/ice width=2 height=10
137 | gfxAttackIce:
138 | INCBIN "attack/ice.bin" ;; 08:7640
139 |
140 | ;@gfximg name=attack/fire width=2 height=6
141 | gfxAttackFire:
142 | INCBIN "attack/fire.bin" ;; 08:7780
143 |
144 | ;@gfximg name=attacks4 width=2 height=8
145 | data_08_7840:
146 | INCBIN "attacks4.bin" ;; 08:7840
147 |
148 | ;@gfximg name=attacks5 width=1 height=1
149 | data_08_7940:
150 | INCBIN "attacks5.bin" ;; 08:7940
151 |
152 | ;@gfximg name=attacks6 width=2 height=2
153 | data_08_7950:
154 | INCBIN "attacks6.bin" ;; 08:7950
155 |
156 | ;@gfximg name=attacks7 width=2 height=2
157 | data_08_7990:
158 | INCBIN "attacks7.bin" ;; 08:7990
159 |
160 | ;@gfximg name=attacks8 width=2 height=31
161 | data_08_79d0:
162 | INCBIN "attacks8.bin" ;; 08:79d0
163 |
164 | ;@gfximg name=attacks9 width=2 height=5
165 | data_08_7db0:
166 | INCBIN "attacks9.bin" ;; 08:7db0
167 |
--------------------------------------------------------------------------------
/src/bank0B_titlegfx_bossgfx.asm:
--------------------------------------------------------------------------------
1 | ;; Disassembled with BadBoy Disassembler: https://github.com/daid/BadBoy
2 |
3 | INCLUDE "include/hardware.inc"
4 | INCLUDE "include/macros.inc"
5 | INCLUDE "include/charmaps.inc"
6 | INCLUDE "include/constants.inc"
7 |
8 | SECTION "bank0b", ROMX[$4000], BANK[$0b]
9 |
10 | ;@gfximg name=title_end width=16 height=12
11 | tilesetGfxTitle:
12 | INCBIN "title_end.bin" ;; 0b:4000
13 |
14 | ;@gfximg name=trashbin width=2 height=8
15 | trashbinGfx:
16 | INCBIN "trashbin.bin" ;; 0b:4c00
17 |
18 | ;@gfximg name=boss/vampire width=2 height=12
19 | bossGfxVampire:
20 | INCBIN "boss/vampire.bin" ;; 0b:4d00
21 |
22 | ;@gfximg name=boss/davias width=2 height=14
23 | bossGfxDavias:
24 | INCBIN "boss/davias.bin" ;; 0b:4e80
25 |
26 | ;@gfximg name=boss/golem width=2 height=16
27 | bossGfxGolem:
28 | INCBIN "boss/golem.bin" ;; 0b:5040
29 |
30 | ;@gfximg name=boss/megapede width=2 height=16
31 | bossGfxMegapede:
32 | INCBIN "boss/megapede.bin" ;; 0b:5240
33 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5440 ????????
34 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5448 ????????
35 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5450 ????????
36 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5458 ????????
37 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5460 ????????
38 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5468 ????????
39 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5470 ????????
40 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5478 ????????
41 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5480 ????????
42 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5488 ????????
43 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5490 ????????
44 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5498 ????????
45 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54a0 ????????
46 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54a8 ????????
47 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54b0 ????????
48 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54b8 ????????
49 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54c0 ????????
50 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54c8 ????????
51 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54d0 ????????
52 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54d8 ????????
53 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54e0 ????????
54 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54e8 ????????
55 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54f0 ????????
56 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:54f8 ????????
57 |
58 | ;@gfximg name=boss/chimera width=2 height=24
59 | bossGfxChimera:
60 | INCBIN "boss/chimera.bin" ;; 0b:5500
61 |
62 | ;@gfximg name=boss/kary width=2 height=22
63 | bossGfxKary:
64 | INCBIN "boss/kary.bin" ;; 0b:5800
65 |
66 | ;@gfximg name=boss/cyclops width=2 height=27
67 | bossGfxCyclops:
68 | INCBIN "boss/cyclops.bin" ;; 0b:5ac0
69 | db $99, $99, $66, $66, $00, $00, $00, $00 ;; 0b:5e20 ????????
70 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:5e28 ????????
71 |
72 | ;@gfximg name=boss/iflyte width=2 height=22
73 | bossGfxIflyte:
74 | INCBIN "boss/iflyte.bin" ;; 0b:5e30
75 | db $e0, $f0, $80, $e0, $00, $80, $00, $38 ;; 0b:60f0 ????????
76 | db $00, $c0, $00, $80, $00, $00, $00, $00 ;; 0b:60f8 ????????
77 |
78 | ;@gfximg name=boss/medusa width=2 height=24
79 | bossGfxMedusa:
80 | INCBIN "boss/medusa.bin" ;; 0b:6100
81 |
82 | ;@gfximg name=boss/lich width=4 height=14
83 | bossGfxLich:
84 | INCBIN "boss/lich.bin" ;; 0b:6400
85 |
86 | ;@gfximg name=boss/dragon width=4 height=14
87 | bossGfxDragon:
88 | INCBIN "boss/dragon.bin" ;; 0b:6780
89 |
90 | ;@gfximg name=boss/dragon_zombie width=2 height=24
91 | bossGfxDragonZombie:
92 | INCBIN "boss/dragon_zombie.bin" ;; 0b:6b00
93 |
94 | ;@gfximg name=boss/kraken width=2 height=26
95 | bossGfxKraken:
96 | INCBIN "boss/kraken.bin" ;; 0b:6e00
97 |
98 | ;@gfximg name=boss/metak_crab width=2 height=14
99 | bossGfxMetalCrab:
100 | INCBIN "boss/metak_crab.bin" ;; 0b:7140
101 |
102 | ;@gfximg name=boss/julius3 width=4 height=8
103 | bossGfxJulius3:
104 | INCBIN "boss/julius3.bin" ;; 0b:7300
105 |
106 | ;@gfximg name=boss/mantis_ant width=2 height=24
107 | bossGfxMantisAnt:
108 | INCBIN "boss/mantis_ant.bin" ;; 0b:7500
109 | db $c0, $c0, $e0, $a0, $7a, $5a, $3f, $25 ;; 0b:7800 ????????
110 | db $1f, $14, $0f, $08, $1f, $10, $3f, $23 ;; 0b:7808 ????????
111 | db $00, $00, $f0, $f0, $d8, $b8, $dc, $b4 ;; 0b:7810 ????????
112 | db $f2, $6e, $f6, $1e, $fd, $0b, $1b, $ef ;; 0b:7818 ????????
113 | db $3f, $26, $3f, $26, $30, $2f, $73, $4f ;; 0b:7820 ????????
114 | db $f5, $8d, $f5, $8d, $f9, $f9, $03, $02 ;; 0b:7828 ????????
115 | db $0f, $f5, $25, $ff, $27, $ff, $c7, $fd ;; 0b:7830 ????????
116 | db $c5, $3f, $c7, $3f, $c7, $3d, $c5, $3f ;; 0b:7838 ????????
117 | db $03, $02, $0f, $0c, $1f, $10, $1e, $11 ;; 0b:7840 ????????
118 | db $3e, $21, $3e, $21, $3e, $21, $7f, $58 ;; 0b:7848 ????????
119 | db $8f, $7f, $8f, $79, $11, $ff, $1e, $fe ;; 0b:7850 ????????
120 | db $1e, $f2, $12, $fe, $0c, $fc, $1a, $fe ;; 0b:7858 ????????
121 | db $ff, $87, $7f, $40, $3f, $30, $3f, $2f ;; 0b:7860 ????????
122 | db $3f, $20, $1f, $1f, $0f, $08, $07, $07 ;; 0b:7868 ????????
123 | db $f9, $e7, $e2, $1e, $0c, $fc, $f4, $fc ;; 0b:7870 ????????
124 | db $04, $fc, $f8, $f8, $10, $f0, $e0, $e0 ;; 0b:7878 ????????
125 |
126 | ;@gfximg name=boss/garuda width=2 height=28
127 | bossGfxGaruda:
128 | INCBIN "boss/garuda.bin" ;; 0b:7880
129 | ; @gfximg name=? width=4 height=4
130 | db $00, $00, $00, $00, $00, $00, $c0, $c0 ;; 0b:7c00 ????????
131 | db $f3, $b3, $7f, $4c, $76, $59, $20, $3f ;; 0b:7c08 ????????
132 | db $0c, $0c, $1e, $16, $3f, $35, $7d, $67 ;; 0b:7c10 ????????
133 | db $fd, $a7, $d9, $bf, $81, $ff, $81, $ff ;; 0b:7c18 ????????
134 | db $00, $00, $c0, $c0, $70, $b0, $5c, $bc ;; 0b:7c20 ????????
135 | db $56, $ba, $17, $f9, $15, $fb, $11, $ff ;; 0b:7c28 ????????
136 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:7c30 ????????
137 | db $00, $00, $00, $00, $c0, $c0, $60, $a0 ;; 0b:7c38 ????????
138 | db $20, $3f, $2c, $3f, $3e, $3f, $7f, $5d ;; 0b:7c40 ????????
139 | db $7f, $59, $7e, $4f, $3f, $23, $1c, $1c ;; 0b:7c48 ????????
140 | db $82, $ff, $43, $ff, $3d, $ff, $21, $ff ;; 0b:7c50 ????????
141 | db $21, $ff, $3e, $ff, $ff, $c4, $fb, $fb ;; 0b:7c58 ????????
142 | db $11, $ff, $12, $ff, $12, $ff, $22, $ff ;; 0b:7c60 ????????
143 | db $24, $ff, $db, $ff, $fe, $92, $6c, $6c ;; 0b:7c68 ????????
144 | db $70, $90, $9b, $7b, $27, $fd, $22, $fe ;; 0b:7c70 ????????
145 | db $46, $fe, $ae, $ba, $1f, $1d, $02, $02 ;; 0b:7c78 ????????
146 | db $00, $00, $00, $00, $10, $10, $38, $28 ;; 0b:7c80 ????????
147 | db $39, $29, $3f, $26, $3e, $29, $30, $3f ;; 0b:7c88 ????????
148 | db $02, $02, $07, $05, $0f, $09, $3f, $33 ;; 0b:7c90 ????????
149 | db $fe, $d3, $6c, $df, $40, $ff, $40, $ff ;; 0b:7c98 ????????
150 | db $00, $00, $00, $00, $00, $00, $e0, $e0 ;; 0b:7ca0 ????????
151 | db $b0, $d0, $ae, $de, $ab, $dd, $8b, $fc ;; 0b:7ca8 ????????
152 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:7cb0 ????????
153 | db $12, $12, $3f, $2d, $3f, $2d, $f7, $ff ;; 0b:7cb8 ????????
154 | db $20, $3f, $2c, $3f, $3e, $33, $ff, $df ;; 0b:7cc0 ????????
155 | db $ff, $91, $fe, $8f, $7f, $43, $3c, $3c ;; 0b:7cc8 ????????
156 | db $41, $ff, $21, $ff, $1e, $ff, $10, $ff ;; 0b:7cd0 ????????
157 | db $21, $ff, $3e, $ff, $ff, $e2, $7d, $7d ;; 0b:7cd8 ????????
158 | db $0a, $fd, $88, $ff, $91, $ff, $91, $ff ;; 0b:7ce0 ????????
159 | db $36, $ff, $c9, $ff, $ff, $49, $b6, $b6 ;; 0b:7ce8 ????????
160 | db $b1, $df, $cd, $bf, $1e, $f2, $1e, $f2 ;; 0b:7cf0 ????????
161 | db $3c, $fc, $c0, $c0, $00, $00, $00, $00 ;; 0b:7cf8 ????????
162 | ; @gfximg name=? width=2 height=8
163 | db $00, $00, $19, $19, $1f, $16, $0e, $0b ;; 0b:7d00 ????????
164 | db $0f, $09, $06, $07, $03, $03, $04, $07 ;; 0b:7d08 ????????
165 | db $00, $00, $98, $98, $78, $e8, $70, $d0 ;; 0b:7d10 ????????
166 | db $f0, $90, $60, $e0, $c0, $c0, $20, $e0 ;; 0b:7d18 ????????
167 | db $0b, $0f, $14, $1f, $1b, $1c, $34, $3b ;; 0b:7d20 ????????
168 | db $23, $3f, $2c, $3f, $53, $7c, $64, $7b ;; 0b:7d28 ????????
169 | db $d0, $f0, $28, $f8, $d8, $38, $2c, $dc ;; 0b:7d30 ????????
170 | db $c4, $fc, $34, $fc, $ca, $3e, $26, $de ;; 0b:7d38 ????????
171 | db $43, $7f, $ec, $ff, $f0, $bf, $73, $5f ;; 0b:7d40 ????????
172 | db $6d, $7f, $53, $7e, $23, $3e, $21, $3f ;; 0b:7d48 ????????
173 | db $c2, $fe, $37, $ff, $0f, $fd, $ce, $fa ;; 0b:7d50 ????????
174 | db $b6, $fe, $ca, $7e, $c4, $7c, $84, $fc ;; 0b:7d58 ????????
175 | db $40, $7f, $58, $7f, $7e, $67, $7f, $4f ;; 0b:7d60 ????????
176 | db $3f, $2c, $1f, $1d, $07, $04, $03, $03 ;; 0b:7d68 ????????
177 | db $02, $fe, $1a, $fe, $7e, $e6, $fe, $f2 ;; 0b:7d70 ????????
178 | db $fc, $b4, $f8, $38, $e0, $a0, $c0, $c0 ;; 0b:7d78 ????????
179 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:7d80 ????????
180 | db $00, $00, $19, $19, $1f, $16, $0e, $0b ;; 0b:7d88 ????????
181 | db $00, $00, $00, $00, $00, $00, $00, $00 ;; 0b:7d90 ????????
182 | db $00, $00, $98, $98, $78, $e8, $70, $d0 ;; 0b:7d98 ????????
183 | db $0f, $09, $06, $07, $03, $03, $0c, $0f ;; 0b:7da0 ????????
184 | db $13, $1c, $23, $3f, $2f, $3c, $34, $3b ;; 0b:7da8 ????????
185 | db $f0, $90, $60, $e0, $c0, $c0, $30, $f0 ;; 0b:7db0 ????????
186 | db $88, $78, $c4, $fc, $f4, $3c, $2c, $dc ;; 0b:7db8 ????????
187 | db $63, $7f, $cc, $ff, $f0, $bf, $73, $5f ;; 0b:7dc0 ????????
188 | db $6d, $7f, $53, $7e, $23, $3e, $21, $3f ;; 0b:7dc8 ????????
189 | db $c6, $fe, $33, $ff, $0f, $fd, $ce, $fa ;; 0b:7dd0 ????????
190 | db $b6, $fe, $ca, $7e, $c4, $7c, $84, $fc ;; 0b:7dd8 ????????
191 | db $58, $7f, $7e, $67, $7f, $7f, $3f, $24 ;; 0b:7de0 ????????
192 | db $1f, $1d, $07, $04, $03, $03, $00, $00 ;; 0b:7de8 ????????
193 | db $1a, $fe, $7e, $e6, $fe, $fe, $fc, $a4 ;; 0b:7df0 ????????
194 | db $f8, $38, $e0, $a0, $c0, $c0, $00, $00 ;; 0b:7df8 ????????
195 |
196 | ;@gfximg name=boss/jackal width=2 height=16
197 | bossGfxJackal:
198 | INCBIN "boss/jackal.bin" ;; 0b:7e00
199 |
--------------------------------------------------------------------------------
/src/bank0C_tilesets.asm:
--------------------------------------------------------------------------------
1 | ;; Disassembled with BadBoy Disassembler: https://github.com/daid/BadBoy
2 |
3 | INCLUDE "include/hardware.inc"
4 | INCLUDE "include/macros.inc"
5 | INCLUDE "include/charmaps.inc"
6 | INCLUDE "include/constants.inc"
7 |
8 | SECTION "bank0c", ROMX[$4000], BANK[$0c]
9 |
10 | ;@gfximg name=tileset/outdoor width=16 height=16
11 | tilesetGfxOutdoor:
12 | INCBIN "tileset/outdoor.bin" ;; 0c:4000
13 |
14 | ;@gfximg name=tileset/town_airship_mountain width=16 height=16
15 | tilesetGfxTown:
16 | INCBIN "tileset/town_airship_mountain.bin" ;; 0c:5000
17 |
18 | ;@gfximg name=tileset/indoor width=16 height=16
19 | tilesetGfxIndoor:
20 | INCBIN "tileset/indoor.bin" ;; 0c:6000
21 |
22 | ;@gfximg name=tileset/caves width=16 height=16
23 | tilesetGfxCaves:
24 | INCBIN "tileset/caves.bin" ;; 0c:7000
25 |
--------------------------------------------------------------------------------
/src/data/items.asm:
--------------------------------------------------------------------------------
1 | ;; Disassembled with BadBoy Disassembler: https://github.com/daid/BadBoy
2 |
3 |
4 | ; offset 0: ID
5 | ; offset 1-8: Name
6 | ; offset 9:
7 | ; bit 0-4: mana cost, allowing costs up to 31 (though highest mana cost is 3)
8 | ; bit 5: unknown (probably unused)
9 | ; bit 6: cannot be sold or trashed
10 | ; bit 7: multiuse (shows in ITEMS with a number after it)
11 | ; offset a:
12 | ; bit 0: weapon (equipment only)
13 | ; bit 1: armor (equipment only)
14 | ; bit 2: helm (equipment only)
15 | ; bit 3: shield (equipment only)
16 | ; bit 4-6: unknown
17 | ; bit 7: useable (items and spells only)
18 | ; offset b: player attack elements (weapons, spells, and offensive items)
19 | ; bit 0: basic physical
20 | ; bit 1: mithril
21 | ; bit 2: mattok/star
22 | ; bit 3: fire
23 | ; bit 4: ice
24 | ; bit 5: electric
25 | ; bit 6: nuke
26 | ; bit 7: sleep/mute
27 | ; offset b: DP (helms and armor only)
28 | ; offset b: player shield elemental immunity
29 | ; bit 0: level 1 projectiles (weakest)
30 | ; bit 1: level 2 projectiles
31 | ; bit 2: level 3 projectiles
32 | ; bit 3: level 4 projectiles
33 | ; bit 4: ice
34 | ; bit 5: fire
35 | ; bit 6: level 5 projectiles
36 | ; bit 7: always set
37 | ; offset c: element resistances/bonuses
38 | ; offset d: power (AP weapons and spells, DP duplicate armor and helms)
39 | ; offset e-f: price to buy from a shop
40 | ;@item_data amount=8
41 | spellDataTable:
42 | ITEM_DATA $00, "Cure<00><00><00><00>" , $42, $10, $14, $00, $00, $00, $00 ;; 02:5dda ????????????????
43 | ITEM_DATA $01, "Heal<00><00><00><00>" , $41, $10, $00, $00, $00, $00, $00 ;; 02:5dea ????????????????
44 | ITEM_DATA $02, "Mute<00><00><00><00>" , $41, $10, $80, $00, $00, $00, $00 ;; 02:5dfa ????????????????
45 | ITEM_DATA $03, "Slep<00><00><00><00>" , $41, $10, $80, $00, $00, $00, $00 ;; 02:5e0a ????????????????
46 | ITEM_DATA $04, "Fire<00><00><00><00>" , $41, $10, $08, $81, $16, $00, $00 ;; 02:5e1a ????????????????
47 | ITEM_DATA $05, "Ice<00><00><00><00><00>" , $42, $10, $12, $40, $02, $00, $00 ;; 02:5e2a ????????????????
48 | ITEM_DATA $06, "Lit<00><00><00><00><00>" , $42, $10, $20, $20, $2c, $00, $00 ;; 02:5e3a ????????????????
49 | ITEM_DATA $07, "Nuke<00><00><00><00>" , $43, $10, $40, $00, $39, $00, $00 ;; 02:5e4a ????????????????
50 |
51 | ;@item_data amount=57
52 | itemDataTable:
53 | ITEM_DATA $00, "Cure<00><00><00>" , $80, $a0, $10, $00, $00, $28, $00 ;; 02:5e5a ?......??..???..
54 | ITEM_DATA $01, "X-Cure<00>" , $80, $a0, $20, $00, $00, $a0, $00 ;; 02:5e6a ????????????????
55 | ITEM_DATA $02, "Ether<00><00>" , $00, $90, $00, $08, $00, $40, $01 ;; 02:5e7a ????????????????
56 | ITEM_DATA $03, "X-Ether" , $00, $90, $00, $10, $00, $80, $02 ;; 02:5e8a ????????????????
57 | ITEM_DATA $04, "Elixir<00>" , $00, $90, $ff, $63, $00, $00, $05 ;; 02:5e9a ????????????????
58 | ITEM_DATA $05, "Pure<00><00><00>" , $80, $b0, $01, $00, $00, $1e, $00 ;; 02:5eaa ?......??..???..
59 | ITEM_DATA $06, "Eyedrp<00>" , $80, $b0, $02, $00, $00, $3c, $00 ;; 02:5eba ?..........???..
60 | ITEM_DATA $07, "Soft<00><00><00>" , $80, $b0, $04, $00, $00, $5a, $00 ;; 02:5eca ????????????????
61 | ITEM_DATA $08, "Moogle<00>" , $80, $b0, $08, $00, $00, $78, $00 ;; 02:5eda ????????????????
62 | ITEM_DATA $09, "Unicorn" , $00, $90, $0f, $00, $00, $2c, $01 ;; 02:5eea ????????????????
63 | ITEM_DATA $0a, "Silence" , $00, $90, $80, $00, $00, $64, $00 ;; 02:5efa ????????????????
64 | ITEM_DATA $0b, "Pillow<00>" , $00, $90, $80, $00, $00, $64, $00 ;; 02:5f0a ????????????????
65 | ITEM_DATA $0c, "rCE:-<65><00>" , $80, $a0, $cc, $00, $00, $90, $01 ;; 02:5f1a ????????????????
66 | ITEM_DATA $0d, "drC<63><5b>-<54><00>" , $80, $a0, $d8, $00, $00, $20, $03 ;; 02:5f2a ????????????????
67 | ITEM_DATA $0e, "Flame<00><00>" , $80, $a0, $08, $80, $24, $3c, $00 ;; 02:5f3a ????????????????
68 | ITEM_DATA $0f, "Blaze<00><00>" , $80, $a0, $08, $80, $32, $f0, $00 ;; 02:5f4a ????????????????
69 | ITEM_DATA $10, "Blizrd<00>" , $80, $a0, $12, $40, $07, $50, $00 ;; 02:5f5a ????????????????
70 | ITEM_DATA $11, "Frost<00><00>" , $80, $a0, $12, $40, $10, $40, $01 ;; 02:5f6a ????????????????
71 | ITEM_DATA $12, "Litblt<00>" , $80, $a0, $20, $20, $2d, $64, $00 ;; 02:5f7a ????????????????
72 | ITEM_DATA $13, "Thundr<00>" , $80, $a0, $20, $20, $46, $90, $01 ;; 02:5f8a ????????????????
73 | ITEM_DATA $14, "Candy<00><00>" , $00, $90, $08, $00, $00, $05, $00 ;; 02:5f9a ?.......?....???
74 | ITEM_DATA $15, "<8a><8c>n<64><82><00><00>" , $00, $90, $00, $00, $00, $00, $00 ;; 02:5faa ????????????????
75 | ITEM_DATA $16, "Key<00><00><00><00>" , $80, $40, $00, $00, $00, $0f, $00 ;; 02:5fba ?.....???..???..
76 | ITEM_DATA $17, "Bone<00><00><00>" , $00, $10, $00, $00, $00, $05, $00 ;; 02:5fca ????????????????
77 | ITEM_DATA $18, "Bronze<00>" , $00, $10, $00, $00, $00, $05, $00 ;; 02:5fda ????????????????
78 | ITEM_DATA $19, "<50>5<00><00><00>" , $40, $10, $00, $00, $00, $05, $00 ;; 02:5fea ????????????????
79 | ITEM_DATA $1a, "<94><50><9b><8b><99><8f><41><00>" , $00, $10, $00, $00, $00, $05, $00 ;; 02:5ffa ????????????????
80 | ITEM_DATA $1b, "<8a><8e><8b><99><00><00><00>" , $40, $10, $00, $00, $00, $00, $00 ;; 02:600a ????????????????
81 | ITEM_DATA $1c, "<8a><8f><8b><99><00><00><00>" , $40, $10, $00, $00, $00, $00, $00 ;; 02:601a ????????????????
82 | ITEM_DATA $1d, "gW<6a>v<5e>vV" , $40, $10, $00, $00, $00, $ff, $ff ;; 02:602a ????????????????
83 | ITEM_DATA $1e, " Mirror<00>" , $40, $10, $00, $00, $00, $ff, $ff ;; 02:603a ????????????????
84 | ITEM_DATA $1f, "hOpq<00><00><00><00>" , $40, $10, $00, $00, $00, $ff, $ff ;; 02:604a ????????????????
85 | ITEM_DATA $20, "OR-MdwDC" , $40, $10, $00, $00, $00, $ff, $ff ;; 02:605a ????????????????
86 | ITEM_DATA $21, "Amanda<00>" , $40, $10, $00, $00, $00, $ff, $ff ;; 02:606a ????????????????
87 | ITEM_DATA $22, "<63>ovM-<00><00><00>" , $40, $10, $00, $00, $00, $ff, $ff ;; 02:607a ????????????????
88 | ITEM_DATA $23, "i-vJpORq" , $00, $10, $00, $00, $00, $ff, $ff ;; 02:608a ????????????????
89 | ITEM_DATA $24, "Oil<00><00><00><00>" , $00, $10, $00, $00, $00, $f4, $01 ;; 02:609a ????????????????
90 | ITEM_DATA $25, "NWpGn<64><82><00>" , $40, $10, $00, $00, $00, $ff, $ff ;; 02:60aa ????????????????
91 | ITEM_DATA $26, "NWpGn<64><83><00>" , $40, $10, $00, $00, $00, $ff, $ff ;; 02:60ba ????????????????
92 | ITEM_DATA $27, "NWpGn<64><84><00>" , $40, $10, $00, $00, $00, $ff, $ff ;; 02:60ca ????????????????
93 | ITEM_DATA $28, "NWpGn<64><85><00>" , $40, $10, $00, $00, $00, $ff, $ff ;; 02:60da ????????????????
94 | ITEM_DATA $29, "Crystal" , $00, $90, $01, $00, $00, $e8, $03 ;; 02:60ea ????????????????
95 | ITEM_DATA $2a, "i-vJpORq" , $00, $90, $05, $00, $00, $f4, $01 ;; 02:60fa ????????????????
96 | ITEM_DATA $2b, "Nectar<00>" , $00, $90, $0f, $00, $00, $58, $00 ;; 02:610a ????????????????
97 | ITEM_DATA $2c, "Stamina" , $00, $90, $f0, $00, $00, $4e, $00 ;; 02:611a ????????????????
98 | ITEM_DATA $2d, "Wisdom<00>" , $00, $90, $00, $f0, $00, $22, $00 ;; 02:612a ????????????????
99 | ITEM_DATA $2e, "Will<00><00><00>" , $00, $90, $00, $0f, $00, $2e, $00 ;; 02:613a ????????????????
100 | ITEM_DATA $2f, "<99><8b><9b><00><00><00><00>" , $80, $c0, $00, $00, $00, $50, $00 ;; 02:614a ????????????????
101 | ITEM_DATA $30, "<62>t-dov<6e>" , $00, $90, $00, $00, $00, $c0, $0d ;; 02:615a ????????????????
102 | ITEM_DATA $31, "Gold<00><00><00>" , $00, $90, $00, $00, $00, $dc, $05 ;; 02:616a ????????????????
103 | ITEM_DATA $32, "Fang<00><00><00>" , $00, $00, $00, $00, $00, $1c, $00 ;; 02:617a ????????????????
104 | ITEM_DATA $33, "<4a><8b><9a><62>oi<00>" , $00, $90, $00, $00, $00, $b4, $00 ;; 02:618a ????????????????
105 | ITEM_DATA $34, "k-<56>p<8d><00>" , $00, $90, $00, $00, $00, $32, $00 ;; 02:619a ????????????????
106 | ITEM_DATA $35, "Mattok<00>" , $80, $f0, $04, $08, $07, $3c, $00 ;; 02:61aa ?...........??..
107 | ITEM_DATA $36, "Ruby<00><00><00>" , $00, $00, $00, $00, $00, $c8, $00 ;; 02:61ba ????????????????
108 | ITEM_DATA $37, "Opal<00><00><00>" , $00, $00, $00, $00, $00, $ac, $0d ;; 02:61ca ????????????????
109 | ITEM_DATA $38, "p<59>-<65><00><00><00><00>" , $00, $00, $00, $00, $00, $ff, $ff ;; 02:61da ????????????????
110 |
111 | ;@item_data amount=46
112 | equipmentDataTable:
113 | ITEM_DATA $00, "Broad<00><00>" , $00, $11, $01, $00, $04, $3c, $00 ;; 02:61ea ?.......?.......
114 | ITEM_DATA $01, "Battle<00>" , $40, $11, $01, $04, $08, $b4, $00 ;; 02:61fa ????????????????
115 | ITEM_DATA $02, "Sickle<00>" , $40, $11, $01, $00, $09, $f0, $00 ;; 02:620a ????????????????
116 | ITEM_DATA $03, "Chain<00><00>" , $40, $11, $01, $00, $0a, $40, $01 ;; 02:621a ????????????????
117 | ITEM_DATA $04, "Silver<00>" , $00, $11, $02, $08, $0e, $32, $02 ;; 02:622a ????????????????
118 | ITEM_DATA $05, "Wind<00><00><00>" , $00, $11, $01, $00, $10, $7e, $04 ;; 02:623a ????????????????
119 | ITEM_DATA $06, "Were<00><00><00>" , $00, $11, $01, $04, $14, $dc, $05 ;; 02:624a ????????????????
120 | ITEM_DATA $07, "Star<00><00><00>" , $40, $11, $04, $28, $1e, $e9, $07 ;; 02:625a ????????????????
121 | ITEM_DATA $08, "Blood<00><00>" , $00, $11, $01, $00, $1a, $53, $07 ;; 02:626a ????????????????
122 | ITEM_DATA $09, "Dragon<00>" , $00, $11, $01, $02, $38, $40, $1f ;; 02:627a ????????????????
123 | ITEM_DATA $0a, "Flame<00><00>" , $00, $11, $08, $80, $26, $9c, $18 ;; 02:628a ????????????????
124 | ITEM_DATA $0b, "Ice<00><00><00><00>" , $00, $11, $10, $40, $28, $4c, $1d ;; 02:629a ????????????????
125 | ITEM_DATA $0c, "Zeus<00><00><00>" , $00, $11, $01, $04, $30, $48, $26 ;; 02:62aa ????????????????
126 | ITEM_DATA $0d, "Rusty<00><00>" , $40, $11, $01, $00, $14, $b8, $88 ;; 02:62ba ????????????????
127 | ITEM_DATA $0e, "Thunder" , $00, $11, $20, $20, $2e, $f2, $2b ;; 02:62ca ????????????????
128 | ITEM_DATA $0f, "XCalibr" , $40, $11, $40, $01, $55, $e4, $57 ;; 02:62da ????????????????
129 | ITEM_DATA $10, "Bronze<00>" , $00, $12, $02, $00, $02, $6e, $00 ;; 02:62ea ?........???..??
130 | ITEM_DATA $11, "Iron<00><00><00>" , $00, $12, $07, $00, $07, $3b, $01 ;; 02:62fa ????????????????
131 | ITEM_DATA $12, "Silver<00>" , $00, $12, $0a, $70, $0a, $bc, $02 ;; 02:630a ????????????????
132 | ITEM_DATA $13, "Gold<00><00><00>" , $00, $12, $0f, $00, $0f, $14, $05 ;; 02:631a ????????????????
133 | ITEM_DATA $14, "Flame<00><00>" , $00, $12, $14, $10, $14, $f9, $15 ;; 02:632a ????????????????
134 | ITEM_DATA $15, "Ice<00><00><00><00>" , $00, $12, $1c, $20, $1c, $b6, $1c ;; 02:633a ????????????????
135 | ITEM_DATA $16, "Dragon<00>" , $00, $12, $22, $00, $22, $48, $26 ;; 02:634a ????????????????
136 | ITEM_DATA $17, "Samurai" , $00, $12, $2c, $00, $2c, $98, $3a ;; 02:635a ????????????????
137 | ITEM_DATA $18, "Opal<00><00><00>" , $00, $12, $12, $00, $12, $b8, $0b ;; 02:636a ????????????????
138 | ITEM_DATA $19, "nsDn<64><83><00><00>" , $00, $12, $0a, $00, $00, $ff, $ff ;; 02:637a ????????????????
139 | ITEM_DATA $1a, "nsDn<64><84><00><00>" , $00, $12, $0a, $00, $00, $ff, $ff ;; 02:638a ????????????????
140 | ITEM_DATA $1b, "Bronze<00>" , $00, $18, $81, $00, $00, $28, $00 ;; 02:639a ?........??.?.??
141 | ITEM_DATA $1c, "Iron<00><00><00>" , $00, $18, $83, $00, $00, $b9, $00 ;; 02:63aa ????????????????
142 | ITEM_DATA $1d, "Silver<00>" , $00, $18, $87, $00, $00, $f9, $01 ;; 02:63ba ????????????????
143 | ITEM_DATA $1e, "Gold<00><00><00>" , $00, $18, $97, $00, $00, $98, $03 ;; 02:63ca ????????????????
144 | ITEM_DATA $1f, "Flame<00><00>" , $00, $18, $af, $00, $00, $30, $11 ;; 02:63da ????????????????
145 | ITEM_DATA $20, "Dragon<00>" , $00, $18, $cf, $00, $00, $08, $20 ;; 02:63ea ????????????????
146 | ITEM_DATA $21, "Aegis<00><00>" , $00, $18, $ff, $00, $00, $f2, $2b ;; 02:63fa ????????????????
147 | ITEM_DATA $22, "Opal<00><00><00>" , $00, $18, $8f, $00, $00, $3c, $0f ;; 02:640a ????????????????
148 | ITEM_DATA $23, "Ice<00><00><00><00>" , $00, $18, $9f, $00, $00, $38, $18 ;; 02:641a ????????????????
149 | ITEM_DATA $24, "<99><9c>n<64><83><00><00><00>" , $00, $18, $00, $00, $00, $ff, $ff ;; 02:642a ????????????????
150 | ITEM_DATA $25, "<99><9c>n<64><84><00><00><00>" , $00, $18, $00, $00, $00, $ff, $ff ;; 02:643a ????????????????
151 | ITEM_DATA $26, "Bronze<00>" , $00, $14, $02, $00, $02, $40, $00 ;; 02:644a ?........????.??
152 | ITEM_DATA $27, "Iron<00><00><00>" , $00, $14, $03, $00, $03, $8c, $00 ;; 02:645a ?......??..???..
153 | ITEM_DATA $28, "Silver<00>" , $00, $14, $08, $70, $08, $f0, $00 ;; 02:646a ????????????????
154 | ITEM_DATA $29, "Gold<00><00><00>" , $00, $14, $0e, $00, $0e, $a8, $02 ;; 02:647a ????????????????
155 | ITEM_DATA $2a, "Opal<00><00><00>" , $00, $14, $13, $00, $13, $ac, $0d ;; 02:648a ????????????????
156 | ITEM_DATA $2b, "Samurai" , $00, $14, $19, $00, $19, $68, $10 ;; 02:649a ????????????????
157 | ITEM_DATA $2c, "<8f><51><9d>n<64><83><00><00>" , $00, $14, $03, $00, $00, $ff, $ff ;; 02:64aa ????????????????
158 | ITEM_DATA $2d, "<8f><51><9d>n<64><84><00><00>" , $00, $14, $03, $00, $00, $ff, $ff ;; 02:64ba ????????????????
159 |
160 | ; Psuedo items used for labels in the EQUIP screen
161 | ;@item_data amount=2
162 | itemAPDPLabelsDataTable:
163 | ITEM_DATA $00, "AP <00><00><00><00>" , $40, $00, $00, $00, $00, $00, $00 ;; 02:64ca ?.....???????.??
164 | ITEM_DATA $00, "DP <00><00><00><00>" , $40, $00, $00, $00, $00, $00, $00 ;; 02:64da ?.....???????.??
165 |
--------------------------------------------------------------------------------
/src/data/map/headers.asm:
--------------------------------------------------------------------------------
1 | ;; Disassembled with BadBoy Disassembler: https://github.com/daid/BadBoy
2 |
3 |
4 | ;@map_headers amount=16
5 | ; This bank seems to start with some kind of map information with 11 bytes per record
6 | ; Format:
7 | ; dw Graphics data (in bank 0B or 0C)
8 | ; db $00 ; ignored
9 | ; dw Pointer to Metatile info
10 | ; db $00 ; ignored
11 | ; db BankNr
12 | ; dw MapPointer
13 | ; db ?, ?
14 | mapHeader_00:
15 | MAP_HEADER tilesetGfxOutdoor, $00, metatilesOutdoor, $80, mapRoomPointers_00, $d7, $3c ;; 08:4000 ..?..?...??
16 |
17 | mapHeader_01:
18 | MAP_HEADER tilesetGfxOutdoor, $00, metatilesOutdoor, $80, mapRoomPointers_01, $0e, $11 ;; 08:400b ..?..?...??
19 |
20 | mapHeader_02:
21 | MAP_HEADER tilesetGfxIndoor, $00, metatilesIndoor, $6c, mapRoomPointers_02, $63, $08 ;; 08:4016 ..?..?...??
22 |
23 | mapHeader_03:
24 | MAP_HEADER tilesetGfxIndoor, $00, metatilesIndoor, $6c, mapRoomPointers_03, $71, $08 ;; 08:4021 ..?..?...??
25 |
26 | mapHeader_04:
27 | MAP_HEADER tilesetGfxIndoor, $00, metatilesIndoor, $6c, mapRoomPointers_04, $3e, $08 ;; 08:402c ..?..?...??
28 |
29 | mapHeader_05:
30 | MAP_HEADER tilesetGfxIndoor, $00, metatilesIndoor, $6c, mapRoomPointers_05, $6f, $07 ;; 08:4037 ???????????
31 |
32 | mapHeader_06:
33 | MAP_HEADER tilesetGfxIndoor, $00, metatilesIndoor, $6c, mapRoomPointers_06, $e1, $05 ;; 08:4042 ..?..?...??
34 |
35 | mapHeader_07:
36 | MAP_HEADER tilesetGfxTitle, $c0, metatilesTitle, $4a, mapRoomPointers_07, $09, $04 ;; 08:404d ..?..?...??
37 |
38 | mapHeader_08:
39 | MAP_HEADER tilesetGfxCaves, $00, metatilesCaves, $7b, mapRoomPointers_08, $59, $06 ;; 08:4058 ???????????
40 |
41 | mapHeader_09:
42 | MAP_HEADER tilesetGfxCaves, $00, metatilesCaves, $7b, mapRoomPointers_09, $86, $02 ;; 08:4063 ???????????
43 |
44 | mapHeader_0a:
45 | MAP_HEADER tilesetGfxCaves, $00, metatilesCaves, $7b, mapRoomPointers_0a, $37, $0a ;; 08:406e ???????????
46 |
47 | mapHeader_0b:
48 | MAP_HEADER tilesetGfxCaves, $00, metatilesCaves, $7b, mapRoomPointers_0b, $b8, $06 ;; 08:4079 ???????????
49 |
50 | mapHeader_0c:
51 | MAP_HEADER tilesetGfxCaves, $00, metatilesCaves, $7b, mapRoomPointers_0c, $39, $06 ;; 08:4084 ???????????
52 |
53 | mapHeader_0d:
54 | MAP_HEADER tilesetGfxCaves, $00, metatilesCaves, $7b, mapRoomPointers_0d, $5e, $08 ;; 08:408f ..?..?...??
55 |
56 | mapHeader_0e:
57 | MAP_HEADER tilesetGfxTown, $00, metatilesTown, $80, mapRoomPointers_0e, $69, $0e ;; 08:409a ..?..?...??
58 |
59 | mapHeader_0f:
60 | MAP_HEADER tilesetGfxTown, $00, metatilesTown, $80, mapRoomPointers_0f, $ee, $0f ;; 08:40a5 ..?..?...??
61 |
--------------------------------------------------------------------------------
/src/data/npc/stats.asm:
--------------------------------------------------------------------------------
1 | ;; Disassembled with BadBoy Disassembler: https://github.com/daid/BadBoy
2 |
3 |
4 | ;Monster stat table
5 | ;offset0: Speed
6 | ;offset1: HP
7 | ;offset3: Enemy weaknesses
8 | ; bit 0: mana
9 | ; bit 1: dragon
10 | ; bit 2: axe
11 | ; bit 3: mithril/star
12 | ; bit 4: magic
13 | ; bit 5: electric
14 | ; bit 6: ice
15 | ; bit 7: fire
16 | ;offset4: Element immunities
17 | ;offset5: Touch damage elements?
18 | ; bit 6: has shield
19 | ;offset6: Touch damage
20 | ;offset7: Defense
21 | ;offset9: Projectile type
22 | ;offset11: Touch Status Effect inflicted
23 | ;offset12: XP on kill
24 | ;offset13: Gold on kill
25 | ;@data format=bbbbbbbbbbbbbb amount=98
26 | npcStatsTable:
27 | db $10, $01, $01, $00, $10, $00, $00, $00, $00, $00, $00, $00, $00, $00 ;; 03:59fe ..?...?.?????? $00
28 | db $03, $ff, $01, $00, $ff, $00, $01, $ff, $00, $ff, $00, $00, $00, $00 ;; 03:5a0c ..???????.???? $01
29 | db $03, $ff, $01, $00, $ff, $00, $14, $ff, $00, $1d, $00, $00, $00, $00 ;; 03:5a1a ?????????????? $02
30 | db $04, $ff, $01, $00, $ff, $00, $1f, $ff, $00, $19, $00, $00, $00, $00 ;; 03:5a28 ?????????????? $03
31 | db $04, $ff, $01, $00, $ff, $00, $27, $ff, $00, $18, $00, $00, $00, $00 ;; 03:5a36 ?????????????? $04
32 | db $04, $ff, $01, $00, $ff, $00, $23, $ff, $00, $1a, $00, $00, $00, $00 ;; 03:5a44 ?????????????? $05
33 | db $04, $ff, $01, $00, $ff, $00, $2c, $ff, $00, $1b, $00, $00, $00, $00 ;; 03:5a52 ?????????????? $06
34 | db $04, $ff, $01, $00, $ff, $00, $63, $ff, $00, $1c, $00, $00, $00, $00 ;; 03:5a60 ?????????????? $07
35 | db $04, $ff, $01, $00, $ff, $00, $01, $ff, $ff, $ff, $00, $00, $00, $00 ;; 03:5a6e ?????????????? $08
36 | db $04, $ff, $01, $00, $ff, $00, $01, $ff, $ff, $ff, $00, $00, $00, $00 ;; 03:5a7c ?????????????? $09
37 | db $08, $01, $01, $00, $fb, $00, $00, $00, $ff, $ff, $00, $00, $00, $00 ;; 03:5a8a ?????????????? $0a
38 | db $05, $ff, $01, $00, $00, $00, $00, $05, $ff, $ff, $00, $00, $00, $00 ;; 03:5a98 ..???????.???? $0b
39 | db $01, $01, $01, $00, $ff, $00, $00, $ff, $00, $ff, $00, $00, $00, $00 ;; 03:5aa6 ..??..???.???? $0c
40 | db $01, $01, $01, $00, $ff, $00, $00, $ff, $00, $ff, $00, $00, $00, $00 ;; 03:5ab4 ?????????.???? $0d
41 | db $01, $01, $01, $00, $ff, $00, $00, $ff, $00, $ff, $00, $00, $00, $00 ;; 03:5ac2 ?????????????? $0e
42 | db $01, $01, $01, $00, $00, $00, $00, $00, $00, $ff, $00, $00, $00, $00 ;; 03:5ad0 ?????????????? $0f
43 | db $08, $03, $01, $01, $00, $80, $0d, $02, $03, $03, $00, $00, $02, $02 ;; 03:5ade ..?.....?.?... $10
44 | db $06, $01, $02, $04, $00, $80, $0a, $01, $ff, $00, $00, $00, $01, $02 ;; 03:5aec ..?.....?.?... $11
45 | db $08, $02, $02, $00, $00, $90, $08, $02, $02, $00, $00, $00, $01, $03 ;; 03:5afa ..?.....?.?... $12
46 | db $0a, $01, $01, $04, $00, $80, $08, $01, $02, $ff, $00, $00, $01, $01 ;; 03:5b08 ..?.....?.?... $13
47 | db $09, $05, $02, $20, $00, $90, $0e, $03, $01, $ff, $00, $01, $03, $04 ;; 03:5b16 ..?.....?.?... $14
48 | db $0a, $04, $03, $10, $05, $80, $14, $05, $02, $ff, $00, $00, $0a, $05 ;; 03:5b24 ..????.??.?.?? $15
49 | db $08, $06, $04, $20, $00, $80, $12, $02, $03, $10, $00, $00, $04, $05 ;; 03:5b32 ?????????.???? $16
50 | db $0a, $02, $04, $04, $00, $80, $0d, $04, $02, $ff, $00, $01, $03, $04 ;; 03:5b40 ..?.....?.?... $17
51 | db $08, $03, $04, $10, $05, $20, $0c, $03, $05, $ff, $00, $00, $05, $04 ;; 03:5b4e ?????????????? $18
52 | db $0a, $05, $04, $01, $90, $90, $14, $04, $03, $12, $00, $00, $06, $07 ;; 03:5b5c ?????????????? $19
53 | db $05, $04, $05, $04, $00, $80, $0e, $03, $03, $ff, $00, $01, $04, $05 ;; 03:5b6a ?????????????? $1a
54 | db $06, $04, $06, $20, $00, $90, $15, $05, $04, $ff, $00, $01, $0a, $0a ;; 03:5b78 ?????????????? $1b
55 | db $0c, $07, $08, $01, $91, $80, $15, $03, $01, $ff, $00, $00, $0f, $06 ;; 03:5b86 ?????????????? $1c
56 | db $04, $05, $09, $02, $00, $b0, $11, $04, $08, $11, $00, $01, $08, $0b ;; 03:5b94 ?????????????? $1d
57 | db $06, $05, $0a, $04, $80, $a0, $12, $04, $0c, $ff, $00, $00, $09, $0f ;; 03:5ba2 ?????????????? $1e
58 | db $06, $05, $0a, $04, $00, $90, $13, $02, $02, $ff, $00, $02, $09, $0c ;; 03:5bb0 ?????????????? $1f
59 | db $02, $08, $0a, $00, $00, $b0, $1d, $04, $0f, $ff, $00, $01, $14, $0f ;; 03:5bbe ?????????????? $20
60 | db $0c, $08, $0a, $10, $05, $00, $2d, $0c, $19, $0e, $00, $02, $1b, $12 ;; 03:5bcc ?????????????? $21
61 | db $08, $0a, $0b, $04, $00, $90, $1e, $08, $14, $03, $00, $00, $1e, $17 ;; 03:5bda ?????????????? $22
62 | db $07, $04, $0b, $20, $10, $a0, $1f, $07, $0a, $07, $00, $00, $14, $14 ;; 03:5be8 ?????????????? $23
63 | db $0a, $04, $0b, $00, $00, $90, $1b, $07, $10, $0f, $00, $01, $12, $1a ;; 03:5bf6 ?????????????? $24
64 | db $06, $0a, $13, $04, $00, $a0, $16, $0c, $12, $15, $00, $00, $12, $23 ;; 03:5c04 ?????????????? $25
65 | db $06, $06, $0f, $08, $00, $b0, $16, $08, $0a, $17, $00, $02, $02, $21 ;; 03:5c12 ?????????????? $26
66 | db $03, $08, $0f, $00, $00, $b0, $1e, $08, $08, $ff, $00, $00, $21, $14 ;; 03:5c20 ?????????????? $27
67 | db $08, $0a, $10, $04, $00, $90, $26, $0c, $0b, $02, $00, $02, $28, $23 ;; 03:5c2e ?????????????? $28
68 | db $0c, $0e, $11, $04, $00, $80, $2b, $08, $0a, $01, $00, $00, $24, $28 ;; 03:5c3c ?????????????? $29
69 | db $10, $0f, $12, $08, $05, $00, $2b, $0d, $0f, $08, $00, $04, $1e, $19 ;; 03:5c4a ?????????????? $2a
70 | db $06, $0f, $13, $04, $00, $a0, $28, $0f, $10, $15, $00, $00, $30, $28 ;; 03:5c58 ?????????????? $2b
71 | db $04, $11, $14, $01, $95, $20, $31, $1e, $07, $ff, $00, $02, $2d, $2d ;; 03:5c66 ?????????????? $2c
72 | db $08, $0a, $15, $04, $00, $80, $3a, $0d, $0f, $ff, $00, $04, $28, $2f ;; 03:5c74 ?????????????? $2d
73 | db $0a, $15, $16, $00, $08, $90, $3f, $11, $1e, $13, $00, $01, $32, $0a ;; 03:5c82 ?????????????? $2e
74 | db $06, $10, $16, $04, $08, $b0, $38, $0a, $23, $ff, $00, $00, $2f, $28 ;; 03:5c90 ?????????????? $2f
75 | db $06, $10, $17, $20, $08, $a0, $37, $0a, $20, $ff, $00, $00, $2a, $2f ;; 03:5c9e ?????????????? $30
76 | db $0a, $14, $15, $01, $91, $80, $3f, $14, $01, $ff, $00, $04, $20, $14 ;; 03:5cac ?????????????? $31
77 | db $0a, $12, $16, $20, $00, $90, $3c, $0a, $0f, $ff, $00, $01, $38, $28 ;; 03:5cba ?????????????? $32
78 | db $04, $19, $1a, $10, $84, $30, $46, $14, $14, $ff, $00, $02, $50, $50 ;; 03:5cc8 ?????????????? $33
79 | db $05, $1e, $1b, $00, $38, $90, $3c, $12, $1e, $0c, $00, $00, $3e, $37 ;; 03:5cd6 ?????????????? $34
80 | db $08, $19, $1c, $10, $85, $00, $39, $1e, $0a, $ff, $00, $02, $50, $3c ;; 03:5ce4 ?????????????? $35
81 | db $06, $1c, $1c, $08, $81, $d0, $34, $0a, $08, $ff, $00, $00, $78, $25 ;; 03:5cf2 ?????????????? $36
82 | db $0a, $10, $1d, $04, $00, $a0, $3c, $19, $0c, $ff, $00, $00, $58, $46 ;; 03:5d00 ?????????????? $37
83 | db $06, $10, $1e, $04, $00, $90, $39, $14, $14, $15, $00, $01, $47, $1f ;; 03:5d0e ?????????????? $38
84 | db $08, $19, $20, $00, $00, $80, $43, $14, $1a, $09, $00, $00, $53, $51 ;; 03:5d1c ?????????????? $39
85 | db $04, $12, $1e, $08, $78, $a0, $55, $0a, $13, $ff, $00, $08, $41, $1e ;; 03:5d2a ?????????????? $3a
86 | db $0c, $14, $20, $08, $01, $00, $4d, $0f, $21, $0b, $00, $08, $64, $50 ;; 03:5d38 ?????????????? $3b
87 | db $08, $17, $21, $04, $00, $80, $56, $12, $14, $06, $00, $01, $60, $2d ;; 03:5d46 ?????????????? $3c
88 | db $04, $14, $21, $00, $78, $80, $50, $19, $27, $0b, $00, $08, $6d, $46 ;; 03:5d54 ?????????????? $3d
89 | db $08, $19, $22, $00, $80, $d0, $58, $19, $10, $11, $00, $02, $82, $40 ;; 03:5d62 ?????????????? $3e
90 | db $03, $ff, $23, $00, $da, $f0, $63, $1f, $30, $11, $00, $00, $a0, $0a ;; 03:5d70 ..???????.???? $3f
91 | db $04, $17, $23, $08, $7c, $80, $5b, $28, $28, $0f, $00, $00, $5a, $5a ;; 03:5d7e ?????????????? $40
92 | db $08, $13, $24, $02, $08, $90, $55, $24, $28, $0c, $00, $00, $7a, $5f ;; 03:5d8c ?????????????? $41
93 | db $0c, $01, $24, $04, $3b, $b0, $72, $28, $2d, $ff, $00, $00, $3f, $3c ;; 03:5d9a ?????????????? $42
94 | db $09, $10, $24, $80, $91, $90, $62, $32, $1e, $ff, $00, $00, $5f, $64 ;; 03:5da8 ?????????????? $43
95 | db $06, $14, $25, $04, $00, $b0, $5f, $1e, $1e, $ff, $00, $01, $7c, $73 ;; 03:5db6 ?????????????? $44
96 | db $0c, $19, $26, $20, $10, $80, $66, $0f, $28, $0d, $00, $00, $69, $69 ;; 03:5dc4 ?????????????? $45
97 | db $06, $1e, $26, $04, $00, $90, $69, $31, $1e, $11, $00, $01, $7d, $78 ;; 03:5dd2 ?????????????? $46
98 | db $08, $12, $28, $00, $01, $90, $65, $19, $2a, $ff, $00, $08, $73, $78 ;; 03:5de0 ?????????????? $47
99 | db $06, $14, $28, $10, $05, $00, $4f, $28, $02, $ff, $00, $02, $a5, $96 ;; 03:5dee ?????????????? $48
100 | db $0c, $1b, $29, $00, $78, $90, $5f, $23, $32, $ff, $00, $04, $c7, $0a ;; 03:5dfc ?????????????? $49
101 | db $0a, $1d, $29, $20, $00, $90, $71, $1e, $2f, $ff, $00, $01, $88, $84 ;; 03:5e0a ?????????????? $4a
102 | db $04, $1e, $2a, $04, $80, $b0, $69, $1e, $12, $ff, $00, $08, $82, $8c ;; 03:5e18 ?????????????? $4b
103 | db $0a, $14, $2c, $20, $0b, $d0, $63, $3c, $14, $03, $00, $00, $78, $a5 ;; 03:5e26 ?????????????? $4c
104 | db $08, $28, $2c, $40, $08, $10, $77, $28, $0a, $0c, $00, $00, $e1, $82 ;; 03:5e34 ?????????????? $4d
105 | db $0c, $1b, $2d, $40, $09, $00, $82, $40, $1a, $09, $00, $02, $dc, $ae ;; 03:5e42 ?????????????? $4e
106 | db $0a, $21, $2d, $10, $38, $80, $79, $28, $21, $ff, $00, $02, $b9, $b4 ;; 03:5e50 ?????????????? $4f
107 | db $0a, $23, $2f, $08, $b8, $00, $78, $2d, $31, $04, $00, $00, $df, $c8 ;; 03:5e5e ?????????????? $50
108 | db $08, $19, $30, $20, $db, $d0, $6e, $43, $28, $05, $00, $00, $be, $af ;; 03:5e6c ?????????????? $51
109 | db $04, $05, $31, $08, $b8, $30, $64, $0a, $32, $ff, $00, $00, $c8, $ba ;; 03:5e7a ?????????????? $52
110 | db $08, $1e, $2e, $08, $b8, $10, $80, $1e, $23, $ff, $00, $04, $b2, $64 ;; 03:5e88 ?????????????? $53
111 | db $07, $20, $31, $08, $00, $90, $6a, $28, $14, $12, $00, $01, $96, $ca ;; 03:5e96 ?????????????? $54
112 | db $0c, $24, $32, $08, $38, $80, $64, $34, $28, $08, $00, $08, $f0, $e6 ;; 03:5ea4 ?????????????? $55
113 | db $0c, $28, $32, $04, $10, $c0, $7d, $32, $1e, $09, $00, $00, $f2, $78 ;; 03:5eb2 ?????????????? $56
114 | db $04, $1e, $32, $00, $88, $f0, $70, $28, $28, $0a, $00, $00, $e6, $0a ;; 03:5ec0 ?????????????? $57
115 | db $02, $50, $32, $00, $b8, $f0, $a0, $46, $50, $16, $00, $00, $c8, $ff ;; 03:5ece ..???????.???? $58
116 | db $06, $24, $32, $20, $3c, $10, $7b, $49, $1e, $ff, $00, $02, $a5, $c8 ;; 03:5edc ?????????????? $59
117 | db $08, $01, $01, $00, $bf, $00, $00, $00, $0a, $ff, $00, $00, $00, $02 ;; 03:5eea ?????????????? $5a
118 | db $08, $0e, $0a, $20, $00, $90, $0e, $0c, $09, $03, $00, $00, $02, $0b ;; 03:5ef8 ?????????.???? $5b
119 | db $0c, $19, $15, $20, $18, $00, $44, $19, $13, $0c, $00, $00, $0c, $47 ;; 03:5f06 ?????????????? $5c
120 | db $06, $19, $22, $20, $08, $10, $3c, $19, $0a, $ff, $00, $00, $32, $32 ;; 03:5f14 ?????????????? $5d
121 | db $05, $ff, $01, $00, $ff, $00, $00, $05, $ff, $ff, $00, $00, $00, $00 ;; 03:5f22 ..??..???.???? $5e
122 | db $0a, $ff, $01, $00, $ff, $00, $00, $05, $ff, $ff, $00, $00, $00, $00 ;; 03:5f30 ..???????.???? $5f
123 | db $08, $03, $01, $01, $90, $00, $0d, $03, $03, $03, $00, $00, $02, $02 ;; 03:5f3e ?????????????? $60
124 | db $0a, $ff, $01, $00, $00, $00, $00, $05, $ff, $ff, $00, $00, $00, $00 ;; 03:5f4c ..???????.???? $61
125 |
--------------------------------------------------------------------------------
/src/data/projectiles.asm:
--------------------------------------------------------------------------------
1 | ;; Disassembled with BadBoy Disassembler: https://github.com/daid/BadBoy
2 |
3 |
4 | ;@data format=bbbbbbbbpppp amount=40
5 | ; Projectile data.
6 | ; 0) Collision flags. Valid options:
7 | ; $38: friendly melee (Bogard)
8 | ; $3a: friendly ranged (four cardinal directions)
9 | ; $60: enemy melee
10 | ; $62: enemy ranged (four cardinal directions)
11 | ; $72: enemy ranged (any angle)
12 | ; 1) Speed, lower = faster.
13 | ; 2) Size (for collision calculations)
14 | ; 3) Element
15 | ; 4) Damage
16 | ; 5) Status Effect inflicted
17 | ; 6) Graphics Tile Load Index
18 | ; 7) Graphics Tile Load Count
19 | ; 8-9) Graphics pointer
20 | ; 10-11) Tile indexes
21 | ; 12-13) Metatiles
22 | ; 14-15) ?
23 | projectileDataTable:
24 | data_bbbbbbbbpppp $62, $08, $08, $01, $0a, $00, $30, $04, gfxProjectileKnife, data_09_46f9, data_09_4771, pattern_simple ;; 09:4479 ................ $00
25 | data_bbbbbbbbpppp $72, $08, $08, $04, $20, $00, $30, $04, gfxProjectileSun, data_09_46f9, data_09_47b9, pattern_simple ;; 09:4489 ???????????????? $01
26 | data_bbbbbbbbpppp $62, $08, $08, $04, $1e, $00, $38, $04, gfxProjectileNeedles, data_09_46f9, data_09_4789, pattern_simple ;; 09:4499 ???????????????? $02
27 | data_bbbbbbbbpppp $62, $08, $08, $04, $1e, $00, $30, $04, gfxProjectilePitchfork, data_09_46f9, data_09_4771, pattern_simple ;; 09:44a9 ..????.......... $03
28 | data_bbbbbbbbpppp $72, $08, $08, $40, $50, $00, $38, $04, gfxProjectileMirrorImage, data_09_46f9, data_09_47d1, pattern_simple ;; 09:44b9 ???????????????? $04
29 | data_bbbbbbbbpppp $62, $08, $08, $40, $64, $00, $68, $04, gfxProjectileLaser, data_09_46f9, data_09_47a1, pattern_simple ;; 09:44c9 ???????????????? $05
30 | data_bbbbbbbbpppp $72, $08, $08, $08, $46, $00, $38, $04, gfxProjectileAxe, data_09_46f9, data_09_4801, pattern_simple ;; 09:44d9 ???????????????? $06
31 | data_bbbbbbbbpppp $72, $0a, $08, $04, $1c, $00, $38, $04, gfxProjectileClaw, data_09_46f9, data_09_4801, pattern_simple ;; 09:44e9 ???????????????? $07
32 | data_bbbbbbbbpppp $72, $08, $08, $08, $32, $08, $30, $04, gfxProjectileRing, data_09_46f9, data_09_47b9, pattern_simple ;; 09:44f9 ???????????????? $08
33 | data_bbbbbbbbpppp $62, $08, $08, $08, $46, $00, $30, $04, gfxProjectileRock, data_09_46f9, data_09_47e9, pattern_simple ;; 09:4509 ???????????????? $09
34 | data_bbbbbbbbpppp $72, $08, $08, $40, $89, $00, $38, $04, gfxProjectileNinjaStar, data_09_46f9, data_09_4831, pattern_simple ;; 09:4519 ???????????????? $0a
35 | data_bbbbbbbbpppp $72, $08, $08, $40, $3e, $04, $30, $04, gfxProjectileOrb, data_09_46f9, data_09_4819, pattern_simple ;; 09:4529 ???????????????? $0b
36 | data_bbbbbbbbpppp $72, $08, $08, $10, $50, $00, $38, $04, gfxProjectileFire, data_09_46f9, data_09_4789, pattern_simple ;; 09:4539 ???????????????? $0c
37 | data_bbbbbbbbpppp $62, $08, $08, $20, $5f, $00, $30, $04, gfxProjectileIce, data_09_46f9, data_09_4771, pattern_simple ;; 09:4549 ???????????????? $0d
38 | data_bbbbbbbbpppp $62, $08, $08, $40, $30, $00, $38, $04, gfxProjectileLightning, data_09_46f9, data_09_4789, pattern_simple ;; 09:4559 ???????????????? $0e
39 | data_bbbbbbbbpppp $62, $08, $08, $04, $21, $01, $30, $04, gfxProjectileWind, data_09_46f9, data_09_4771, pattern_simple ;; 09:4569 ???????????????? $0f
40 | data_bbbbbbbbpppp $60, $08, $08, $01, $0f, $00, $30, $04, gfxProjectileArrow, data_09_46f9, data_09_4771, pattern_melee ;; 09:4579 ??????......???? $10
41 | data_bbbbbbbbpppp $60, $08, $08, $08, $46, $00, $38, $04, gfxProjectileSword, data_09_46f9, data_09_4789, pattern_melee ;; 09:4589 ??????......???? $11
42 | data_bbbbbbbbpppp $60, $0a, $08, $02, $14, $00, $38, $04, gfxProjectileNeedle, data_09_46f9, data_09_4789, pattern_melee ;; 09:4599 ???????????????? $12
43 | data_bbbbbbbbpppp $60, $0a, $08, $04, $2d, $01, $38, $04, gfxProjectileNail, data_09_46f9, data_09_4849, pattern_scorpion_tail ;; 09:45a9 ???????????????? $13
44 | data_bbbbbbbbpppp $72, $0a, $08, $40, $5f, $00, $30, $04, gfxProjectileFire2, data_09_46f9, data_09_47e9, pattern_simple ;; 09:45b9 ???????????????? $14
45 | data_bbbbbbbbpppp $60, $08, $08, $04, $26, $02, $38, $04, gfxProjectileWave, data_09_46f9, data_09_4861, pattern_melee ;; 09:45c9 ???????????????? $15
46 | data_bbbbbbbbpppp $72, $08, $08, $40, $63, $00, $38, $04, gfxProjectileExplosion, data_09_46f9, data_09_4831, pattern_simple ;; 09:45d9 ??????......???? $16
47 | data_bbbbbbbbpppp $60, $08, $08, $01, $1e, $00, $38, $04, gfxProjectileChestBite, data_09_46f9, data_09_4849, pattern_chest_bite ;; 09:45e9 ???????????????? $17
48 | data_bbbbbbbbpppp $38, $08, $0c, $01, $27, $00, $18, $04, gfxProjectileSword, data_09_46f9, data_09_4879, pattern_melee ;; 09:45f9 ???????????????? $18
49 | data_bbbbbbbbpppp $3a, $0a, $0c, $01, $19, $00, $18, $04, gfxProjectileAxe, data_09_46f9, data_09_4891, pattern_simple ;; 09:4609 ???????????????? $19
50 | data_bbbbbbbbpppp $3a, $08, $0c, $01, $2b, $00, $18, $04, gfxProjectileKnife, data_09_46f9, data_09_4879, pattern_simple ;; 09:4619 ???????????????? $1a
51 | data_bbbbbbbbpppp $3a, $08, $0c, $01, $2c, $00, $18, $04, gfxProjectileArrow, data_09_46f9, data_09_4879, pattern_simple ;; 09:4629 ???????????????? $1b
52 | data_bbbbbbbbpppp $3a, $08, $0c, $01, $5f, $00, $18, $04, gfxProjectileLaser, data_09_46f9, data_09_4879, pattern_simple ;; 09:4639 ???????????????? $1c
53 | data_bbbbbbbbpppp $3a, $06, $08, $08, $0d, $00, $18, $04, gfxProjectileFire, data_09_46f9, data_09_4879, pattern_simple ;; 09:4649 ???????????????? $1d
54 | data_bbbbbbbbpppp $72, $08, $08, $02, $1e, $00, $30, $08, gfxProjectileExplosion, data_09_4701, data_09_4819, pattern_simple ;; 09:4659 ???????????????? $1e
55 | data_bbbbbbbbpppp $62, $0c, $08, $80, $17, $00, $30, $08, gfxProjectileExplosion, data_09_4711, data_09_4771, pattern_simple ;; 09:4669 ???????????????? $1f
56 | data_bbbbbbbbpppp $72, $0a, $08, $04, $40, $04, $30, $08, gfxProjectileExplosion, data_09_4721, data_09_4819, pattern_simple ;; 09:4679 ???????????????? $20
57 | data_bbbbbbbbpppp $72, $0a, $08, $40, $a0, $00, $30, $02, gfxProjectileFeather2, data_09_46f9, data_09_47b9, pattern_simple ;; 09:4689 ???????????????? $21
58 | data_bbbbbbbbpppp $72, $0a, $08, $40, $a6, $00, $30, $02, gfxProjectileSkull, data_09_46f9, data_09_47b9, pattern_simple ;; 09:4699 ???????????????? $22
59 | data_bbbbbbbbpppp $62, $08, $08, $40, $50, $00, $30, $08, gfxProjectileExplosion, data_09_4731, data_09_4771, pattern_simple ;; 09:46a9 ???????????????? $23
60 | data_bbbbbbbbpppp $62, $08, $08, $40, $a8, $00, $30, $08, gfxProjectileLightning, data_09_4741, data_09_4771, pattern_simple ;; 09:46b9 ???????????????? $24
61 | data_bbbbbbbbpppp $72, $08, $0a, $40, $a3, $00, $30, $08, gfxProjectileExplosion, data_09_4751, data_09_4819, pattern_simple ;; 09:46c9 ???????????????? $25
62 | data_bbbbbbbbpppp $72, $0a, $08, $40, $4f, $00, $30, $08, gfxProjectileExplosion, data_09_4761, data_09_47b9, pattern_simple ;; 09:46d9 ???????????????? $26
63 | data_bbbbbbbbpppp $72, $0a, $08, $40, $88, $00, $30, $08, gfxProjectileExplosion, data_09_4761, data_09_47b9, pattern_simple ;; 09:46e9 ???????????????? $27
64 |
65 | data_09_46f9:
66 | db $00, $02, $01, $03, $04, $06, $05, $07 ;; 09:46f9 ........
67 |
68 | data_09_4701:
69 | db $08, $0a, $09, $0b, $0c, $0e, $0d, $0f ;; 09:4701 ????????
70 | db $00, $02, $01, $03, $04, $06, $05, $07 ;; 09:4709 ????????
71 |
72 | data_09_4711:
73 | db $48, $4a, $49, $4b, $4c, $4e, $4d, $4f ;; 09:4711 ????????
74 | db $00, $02, $01, $03, $04, $06, $05, $07 ;; 09:4719 ????????
75 |
76 | data_09_4721:
77 | db $10, $12, $11, $13, $14, $16, $15, $17 ;; 09:4721 ????????
78 | db $00, $02, $01, $03, $04, $06, $05, $07 ;; 09:4729 ????????
79 |
80 | data_09_4731:
81 | db $48, $4a, $49, $4b, $4c, $4e, $4d, $4f ;; 09:4731 ????????
82 | db $00, $02, $01, $03, $04, $06, $05, $07 ;; 09:4739 ????????
83 |
84 | data_09_4741:
85 | db $00, $02, $01, $03, $04, $06, $05, $07 ;; 09:4741 ????????
86 | db $38, $3a, $39, $3b, $3c, $3e, $3d, $3f ;; 09:4749 ????????
87 |
88 | data_09_4751:
89 | db $00, $02, $01, $03, $04, $06, $05, $07 ;; 09:4751 ????????
90 | db $60, $62, $61, $63, $64, $66, $65, $67 ;; 09:4759 ????????
91 |
92 | data_09_4761:
93 | db $34, $36, $35, $37, $38, $3a, $39, $3b ;; 09:4761 ????????
94 | db $00, $02, $01, $03, $04, $06, $05, $07 ;; 09:4769 ????????
95 |
96 | data_09_4771:
97 | db $20, $32, $30, $00, $30, $32, $00, $34 ;; 09:4771 ........
98 | db $36, $40, $34, $36, $20, $32, $30, $00 ;; 09:4779 ....????
99 | db $30, $32, $00, $34, $36, $40, $34, $36 ;; 09:4781 ????????
100 |
101 | data_09_4789:
102 | db $20, $3a, $38, $00, $38, $3a, $00, $3c ;; 09:4789 ????????
103 | db $3e, $40, $3c, $3e, $20, $3a, $38, $00 ;; 09:4791 ????????
104 | db $38, $3a, $00, $3c, $3e, $40, $3c, $3e ;; 09:4799 ????????
105 |
106 | data_09_47a1:
107 | db $20, $6a, $68, $00, $68, $6a, $00, $6c ;; 09:47a1 ????????
108 | db $6e, $40, $6c, $6e, $20, $6a, $68, $00 ;; 09:47a9 ????????
109 | db $68, $6a, $00, $6c, $6e, $40, $6c, $6e ;; 09:47b1 ????????
110 |
111 | data_09_47b9:
112 | db $00, $30, $32, $00, $30, $32, $00, $30 ;; 09:47b9 ????????
113 | db $32, $00, $30, $32, $00, $30, $32, $00 ;; 09:47c1 ????????
114 | db $30, $32, $00, $30, $32, $00, $30, $32 ;; 09:47c9 ????????
115 |
116 | data_09_47d1:
117 | db $00, $38, $3a, $00, $38, $3a, $00, $38 ;; 09:47d1 ????????
118 | db $3a, $00, $38, $3a, $00, $38, $3a, $00 ;; 09:47d9 ????????
119 | db $38, $3a, $00, $38, $3a, $00, $38, $3a ;; 09:47e1 ????????
120 |
121 | data_09_47e9:
122 | db $20, $32, $30, $40, $30, $32, $00, $30 ;; 09:47e9 ????????
123 | db $32, $60, $32, $30, $20, $32, $30, $40 ;; 09:47f1 ????????
124 | db $30, $32, $00, $30, $32, $60, $32, $30 ;; 09:47f9 ????????
125 |
126 | data_09_4801:
127 | db $20, $3a, $38, $40, $38, $3a, $00, $38 ;; 09:4801 ????????
128 | db $3a, $60, $3a, $38, $20, $3a, $38, $40 ;; 09:4809 ????????
129 | db $38, $3a, $00, $38, $3a, $60, $3a, $38 ;; 09:4811 ????????
130 |
131 | data_09_4819:
132 | db $00, $30, $32, $00, $30, $32, $00, $30 ;; 09:4819 ????????
133 | db $32, $00, $30, $32, $00, $34, $36, $00 ;; 09:4821 ????????
134 | db $34, $36, $00, $34, $36, $00, $34, $36 ;; 09:4829 ????????
135 |
136 | data_09_4831:
137 | db $00, $38, $3a, $00, $38, $3a, $00, $38 ;; 09:4831 ????????
138 | db $3a, $00, $38, $3a, $00, $3c, $3e, $00 ;; 09:4839 ????????
139 | db $3c, $3e, $00, $3c, $3e, $00, $3c, $3e ;; 09:4841 ????????
140 |
141 | data_09_4849:
142 | db $20, $3a, $38, $00, $38, $3a, $00, $38 ;; 09:4849 ????????
143 | db $3a, $00, $38, $3a, $20, $3a, $38, $00 ;; 09:4851 ????????
144 | db $38, $3a, $00, $38, $3a, $00, $38, $3a ;; 09:4859 ????????
145 |
146 | data_09_4861:
147 | db $20, $3a, $38, $00, $38, $3a, $20, $3a ;; 09:4861 ????????
148 | db $38, $40, $38, $3a, $20, $3a, $38, $00 ;; 09:4869 ????????
149 | db $38, $3a, $20, $3a, $38, $40, $38, $3a ;; 09:4871 ????????
150 |
151 | data_09_4879:
152 | db $20, $1a, $18, $00, $18, $1a, $00, $1c ;; 09:4879 ????????
153 | db $1e, $40, $1c, $1e, $20, $1a, $18, $00 ;; 09:4881 ????????
154 | db $18, $1a, $00, $1c, $1e, $40, $1c, $1e ;; 09:4889 ????????
155 |
156 | data_09_4891:
157 | db $20, $1a, $18, $40, $18, $1a, $00, $18 ;; 09:4891 ????????
158 | db $1a, $60, $1a, $18, $20, $1a, $18, $40 ;; 09:4899 ????????
159 | db $18, $1a, $00, $18, $1a, $60, $1a, $18 ;; 09:48a1 ????????
160 |
161 | ; A simple stab pattern.
162 | ; First byte is default direction flags.
163 | ; Second and third bytes are default vector.
164 | ; Fourth byte is unknown but always 4.
165 | ; Null terminated
166 | ;@data amount=3 format=bbbb
167 | pattern_melee:
168 | db $11, $08, $00, $04 ;; 09:48a9 ???? $00
169 | db $11, $10, $00, $04 ;; 09:48ad ???? $01
170 | db $11, $08, $00, $04 ;; 09:48b1 ???? $02
171 | db $00 ;; 09:48b5 ?
172 |
173 | ; Starts at maximum range and then draws closer.
174 | ; First byte is default direction flags.
175 | ; Second and third bytes are default vector.
176 | ; Fourth byte is unknown but always 4.
177 | ; Null terminated
178 | ;@data amount=3 format=bbbb
179 | pattern_scorpion_tail:
180 | db $11, $16, $00, $04 ;; 09:48b6 ???? $00
181 | db $11, $13, $00, $04 ;; 09:48ba ???? $01
182 | db $11, $10, $00, $04 ;; 09:48be ???? $02
183 | db $00 ;; 09:48c2 ?
184 |
185 | ; First byte is default direction flags.
186 | ; Second and third bytes are default vector. (Moves eight pixels each tick.)
187 | ; This is used by all npc projectiles and attacks except the melee types.
188 | ; Null terminated
189 | ;@data amount=1 format=bbb
190 | pattern_simple:
191 | db $11, $08, $00 ;; 09:48c3 ...
192 | db $00 ;; 09:48c6 .
193 |
194 | ; Used by the mimics.
195 | ; There's nothing obvious here to make the direction always north, so that is probably in the enemy logic.
196 | ; First byte is default direction flags.
197 | ; Second and third bytes are default vector.
198 | ; Fourth byte is unknown but always 4.
199 | ; Null terminated
200 | ;@data amount=2 format=bbbb
201 | pattern_chest_bite:
202 | db $11, $f0, $00, $04 ;; 09:48c7 ???? $00
203 | db $11, $f0, $00, $04 ;; 09:48cb ???? $01
204 | db $00, $17, $31, $50, $56, $14, $40, $90 ;; 09:48cf ????????
205 | db $12, $30, $50, $11, $32, $50, $10, $20 ;; 09:48d7 ????????
206 | db $8c, $60, $cc, $5c, $1d, $10, $ca, $15 ;; 09:48df ????????
207 | db $10, $ce, $15, $22, $0c, $62, $cc, $44 ;; 09:48e7 ????????
208 | db $05, $62, $4c, $53, $0f, $20, $18, $33 ;; 09:48ef ????????
209 | db $67, $12, $33, $27, $11, $42, $e7, $53 ;; 09:48f7 ????????
210 | db $14 ;; 09:48ff ?
211 |
--------------------------------------------------------------------------------
/src/data/xptable.asm:
--------------------------------------------------------------------------------
1 | ;; Disassembled with BadBoy Disassembler: https://github.com/daid/BadBoy
2 |
3 |
4 | ;@data format=bbb amount=100
5 | xpPerLevelTable:
6 | db $00, $00, $00 ;; 08:4dd6 ??? $00
7 | db $00, $00, $10 ;; 08:4dd9 ... $01
8 | db $00, $00, $2c ;; 08:4ddc ... $02
9 | db $00, $00, $5a ;; 08:4ddf ... $03
10 | db $00, $00, $a1 ;; 08:4de2 ??? $04
11 | db $00, $01, $07 ;; 08:4de5 ??? $05
12 | db $00, $01, $92 ;; 08:4de8 ??? $06
13 | db $00, $02, $48 ;; 08:4deb ??? $07
14 | db $00, $03, $2f ;; 08:4dee ??? $08
15 | db $00, $04, $4d ;; 08:4df1 ??? $09
16 | db $00, $05, $aa ;; 08:4df4 ??? $0a
17 | db $00, $07, $49 ;; 08:4df7 ??? $0b
18 | db $00, $09, $33 ;; 08:4dfa ??? $0c
19 | db $00, $0b, $6d ;; 08:4dfd ??? $0d
20 | db $00, $0d, $fe ;; 08:4e00 ??? $0e
21 | db $00, $10, $eb ;; 08:4e03 ??? $0f
22 | db $00, $14, $3a ;; 08:4e06 ??? $10
23 | db $00, $17, $f3 ;; 08:4e09 ??? $11
24 | db $00, $1c, $1a ;; 08:4e0c ??? $12
25 | db $00, $20, $b7 ;; 08:4e0f ??? $13
26 | db $00, $25, $d0 ;; 08:4e12 ??? $14
27 | db $00, $2b, $69 ;; 08:4e15 ??? $15
28 | db $00, $31, $8b ;; 08:4e18 ??? $16
29 | db $00, $38, $3b ;; 08:4e1b ??? $17
30 | db $00, $3f, $7e ;; 08:4e1e ??? $18
31 | db $00, $47, $5c ;; 08:4e21 ??? $19
32 | db $00, $4f, $db ;; 08:4e24 ??? $1a
33 | db $00, $59, $00 ;; 08:4e27 ??? $1b
34 | db $00, $62, $d2 ;; 08:4e2a ??? $1c
35 | db $00, $6d, $57 ;; 08:4e2d ??? $1d
36 | db $00, $78, $96 ;; 08:4e30 ??? $1e
37 | db $00, $84, $93 ;; 08:4e33 ??? $1f
38 | db $00, $91, $57 ;; 08:4e36 ??? $20
39 | db $00, $9e, $e6 ;; 08:4e39 ??? $21
40 | db $00, $ad, $47 ;; 08:4e3c ??? $22
41 | db $00, $bc, $80 ;; 08:4e3f ??? $23
42 | db $00, $cc, $97 ;; 08:4e42 ??? $24
43 | db $00, $dd, $93 ;; 08:4e45 ??? $25
44 | db $00, $ef, $7a ;; 08:4e48 ??? $26
45 | db $01, $02, $51 ;; 08:4e4b ??? $27
46 | db $01, $16, $20 ;; 08:4e4e ??? $28
47 | db $01, $2a, $eb ;; 08:4e51 ??? $29
48 | db $01, $40, $ba ;; 08:4e54 ??? $2a
49 | db $01, $57, $93 ;; 08:4e57 ??? $2b
50 | db $01, $6f, $7b ;; 08:4e5a ??? $2c
51 | db $01, $88, $79 ;; 08:4e5d ??? $2d
52 | db $01, $a2, $94 ;; 08:4e60 ??? $2e
53 | db $01, $bd, $d0 ;; 08:4e63 ??? $2f
54 | db $01, $da, $35 ;; 08:4e66 ??? $30
55 | db $01, $f7, $c9 ;; 08:4e69 ??? $31
56 | db $02, $16, $92 ;; 08:4e6c ??? $32
57 | db $02, $36, $95 ;; 08:4e6f ??? $33
58 | db $02, $57, $da ;; 08:4e72 ??? $34
59 | db $02, $7a, $66 ;; 08:4e75 ??? $35
60 | db $02, $9e, $3f ;; 08:4e78 ??? $36
61 | db $02, $c3, $6d ;; 08:4e7b ??? $37
62 | db $02, $e9, $f4 ;; 08:4e7e ??? $38
63 | db $03, $11, $db ;; 08:4e81 ??? $39
64 | db $03, $3b, $29 ;; 08:4e84 ??? $3a
65 | db $03, $65, $e3 ;; 08:4e87 ??? $3b
66 | db $03, $92, $10 ;; 08:4e8a ??? $3c
67 | db $03, $bf, $b5 ;; 08:4e8d ??? $3d
68 | db $03, $ee, $d9 ;; 08:4e90 ??? $3e
69 | db $04, $1f, $83 ;; 08:4e93 ??? $3f
70 | db $04, $51, $b8 ;; 08:4e96 ??? $40
71 | db $04, $85, $7e ;; 08:4e99 ??? $41
72 | db $04, $ba, $dc ;; 08:4e9c ??? $42
73 | db $04, $f1, $d8 ;; 08:4e9f ??? $43
74 | db $05, $2a, $78 ;; 08:4ea2 ??? $44
75 | db $05, $64, $c3 ;; 08:4ea5 ??? $45
76 | db $05, $a0, $be ;; 08:4ea8 ??? $46
77 | db $05, $de, $6f ;; 08:4eab ??? $47
78 | db $06, $1d, $dd ;; 08:4eae ??? $48
79 | db $06, $5f, $0e ;; 08:4eb1 ??? $49
80 | db $06, $a2, $08 ;; 08:4eb4 ??? $4a
81 | db $06, $e6, $d2 ;; 08:4eb7 ??? $4b
82 | db $07, $2d, $71 ;; 08:4eba ??? $4c
83 | db $07, $75, $eb ;; 08:4ebd ??? $4d
84 | db $07, $c0, $48 ;; 08:4ec0 ??? $4e
85 | db $08, $0c, $8d ;; 08:4ec3 ??? $4f
86 | db $08, $5a, $c0 ;; 08:4ec6 ??? $50
87 | db $08, $aa, $e7 ;; 08:4ec9 ??? $51
88 | db $08, $fd, $09 ;; 08:4ecc ??? $52
89 | db $09, $51, $2b ;; 08:4ecf ??? $53
90 | db $09, $a7, $55 ;; 08:4ed2 ??? $54
91 | db $09, $ff, $8b ;; 08:4ed5 ??? $55
92 | db $0a, $59, $d5 ;; 08:4ed8 ??? $56
93 | db $0a, $b6, $39 ;; 08:4edb ??? $57
94 | db $0b, $14, $bc ;; 08:4ede ??? $58
95 | db $0b, $75, $65 ;; 08:4ee1 ??? $59
96 | db $0b, $d8, $3a ;; 08:4ee4 ??? $5a
97 | db $0c, $3d, $41 ;; 08:4ee7 ??? $5b
98 | db $0c, $a4, $80 ;; 08:4eea ??? $5c
99 | db $0d, $0d, $fe ;; 08:4eed ??? $5d
100 | db $0d, $79, $c1 ;; 08:4ef0 ??? $5e
101 | db $0d, $e7, $cf ;; 08:4ef3 ??? $5f
102 | db $0e, $58, $2e ;; 08:4ef6 ??? $60
103 | db $0e, $ca, $e4 ;; 08:4ef9 ??? $61
104 | db $0f, $3f, $f7 ;; 08:4efc ??? $62
105 | db $0f, $b7, $6e ;; 08:4eff ??? $63
106 | db $0f, $ff, $ff ;; 08:4f02 ???
107 |
--------------------------------------------------------------------------------
/src/include/charmaps.inc:
--------------------------------------------------------------------------------
1 | PUSHC
2 | NEWCHARMAP BASIC
3 | CHARMAP "<00>", 0
4 | CHARMAP "<01>", 1
5 | CHARMAP "<02>", 2
6 | CHARMAP "<03>", 3
7 | CHARMAP "<04>", 4
8 | CHARMAP "<05>", 5
9 | CHARMAP "<06>", 6
10 | CHARMAP "<07>", 7
11 | CHARMAP "<08>", 8
12 | CHARMAP "<09>", 9
13 | CHARMAP "<0a>", 10
14 | CHARMAP "<0b>", 11
15 | CHARMAP "<0c>", 12
16 | CHARMAP "<0d>", 13
17 | CHARMAP "<0e>", 14
18 | CHARMAP "<0f>", 15
19 | CHARMAP "<10>", 16
20 | CHARMAP "<11>", 17
21 | CHARMAP "<12>", 18
22 | CHARMAP "<13>", 19
23 | CHARMAP "", 20
24 | CHARMAP "", 21
25 | CHARMAP "<16>", 22
26 | CHARMAP "<17>", 23
27 | CHARMAP "<18>", 24
28 | CHARMAP "<19>", 25
29 | CHARMAP "\n", 26
30 | CHARMAP "<1b>", 27
31 | CHARMAP "<1c>", 28
32 | CHARMAP "<1d>", 29
33 | CHARMAP "<1e>", 30
34 | CHARMAP "<1f>", 31
35 | CHARMAP "<20>", 32
36 | CHARMAP "<21>", 33
37 | CHARMAP "<22>", 34
38 | CHARMAP "<23>", 35
39 | CHARMAP "<24>", 36
40 | CHARMAP "<25>", 37
41 | CHARMAP "<26>", 38
42 | CHARMAP "<27>", 39
43 | CHARMAP "<28>", 40
44 | CHARMAP "<29>", 41
45 | CHARMAP "<2a>", 42
46 | CHARMAP "<2b>", 43
47 | CHARMAP "<2c>", 44
48 | CHARMAP "<2d>", 45
49 | CHARMAP "<2e>", 46
50 | CHARMAP "<2f>", 47
51 | CHARMAP "<30>", 48
52 | CHARMAP "<31>", 49
53 | CHARMAP "<32>", 50
54 | CHARMAP "<33>", 51
55 | CHARMAP "<34>", 52
56 | CHARMAP "<35>", 53
57 | CHARMAP "<36>", 54
58 | CHARMAP "<37>", 55
59 | CHARMAP "<38>", 56
60 | CHARMAP "<39>", 57
61 | CHARMAP "<3a>", 58
62 | CHARMAP "<3b>", 59
63 | CHARMAP "<3c>", 60
64 | CHARMAP "<3d>", 61
65 | CHARMAP "<3e>", 62
66 | CHARMAP "<3f>", 63
67 | CHARMAP "<40>", 64
68 | CHARMAP "<41>", 65
69 | CHARMAP "<42>", 66
70 | CHARMAP "<43>", 67
71 | CHARMAP "<44>", 68
72 | CHARMAP "<45>", 69
73 | CHARMAP "<46>", 70
74 | CHARMAP "<47>", 71
75 | CHARMAP "<48>", 72
76 | CHARMAP "<49>", 73
77 | CHARMAP "<4a>", 74
78 | CHARMAP "<4b>", 75
79 | CHARMAP "<4c>", 76
80 | CHARMAP "<4d>", 77
81 | CHARMAP "<4e>", 78
82 | CHARMAP "<4f>", 79
83 | CHARMAP "<50>", 80
84 | CHARMAP "<51>", 81
85 | CHARMAP "<52>", 82
86 | CHARMAP "<53>", 83
87 | CHARMAP "<54>", 84
88 | CHARMAP "<55>", 85
89 | CHARMAP "<56>", 86
90 | CHARMAP "<57>", 87
91 | CHARMAP "<58>", 88
92 | CHARMAP "<59>", 89
93 | CHARMAP "<5a>", 90
94 | CHARMAP "<5b>", 91
95 | CHARMAP "<5c>", 92
96 | CHARMAP "<5d>", 93
97 | CHARMAP "<5e>", 94
98 | CHARMAP "<5f>", 95
99 | CHARMAP "<60>", 96
100 | CHARMAP "<61>", 97
101 | CHARMAP "<62>", 98
102 | CHARMAP "<63>", 99
103 | CHARMAP "<64>", 100
104 | CHARMAP "<65>", 101
105 | CHARMAP "<66>", 102
106 | CHARMAP "<67>", 103
107 | CHARMAP "<68>", 104
108 | CHARMAP "<69>", 105
109 | CHARMAP "<6a>", 106
110 | CHARMAP "<6b>", 107
111 | CHARMAP "<6c>", 108
112 | CHARMAP "<6d>", 109
113 | CHARMAP "<6e>", 110
114 | CHARMAP "<6f>", 111
115 | CHARMAP "<70>", 112
116 | CHARMAP "<71>", 113
117 | CHARMAP "<72>", 114
118 | CHARMAP "<73>", 115
119 | CHARMAP "<74>", 116
120 | CHARMAP "<75>", 117
121 | CHARMAP "<76>", 118
122 | CHARMAP "<77>", 119
123 | CHARMAP "<78>", 120
124 | CHARMAP "<79>", 121
125 | CHARMAP "<7a>", 122
126 | CHARMAP "<7b>", 123
127 | CHARMAP "<7c>", 124
128 | CHARMAP "<7d>", 125
129 | CHARMAP "<7e>", 126
130 | CHARMAP "<7f>", 127
131 | CHARMAP "<80>", 128
132 | CHARMAP "<81>", 129
133 | CHARMAP "<82>", 130
134 | CHARMAP "<83>", 131
135 | CHARMAP "<84>", 132
136 | CHARMAP "<85>", 133
137 | CHARMAP "<86>", 134
138 | CHARMAP "<87>", 135
139 | CHARMAP "<88>", 136
140 | CHARMAP "<89>", 137
141 | CHARMAP "<8a>", 138
142 | CHARMAP "<8b>", 139
143 | CHARMAP "<8c>", 140
144 | CHARMAP "<8d>", 141
145 | CHARMAP "<8e>", 142
146 | CHARMAP "<8f>", 143
147 | CHARMAP "<90>", 144
148 | CHARMAP "<91>", 145
149 | CHARMAP "<92>", 146
150 | CHARMAP "<93>", 147
151 | CHARMAP "<94>", 148
152 | CHARMAP "<95>", 149
153 | CHARMAP "<96>", 150
154 | CHARMAP "<97>", 151
155 | CHARMAP "<98>", 152
156 | CHARMAP "<99>", 153
157 | CHARMAP "<9a>", 154
158 | CHARMAP "<9b>", 155
159 | CHARMAP "<9c>", 156
160 | CHARMAP "<9d>", 157
161 | CHARMAP "<9e>", 158
162 | CHARMAP "<9f>", 159
163 | CHARMAP "", 160
164 | CHARMAP "", 161
165 | CHARMAP "", 162
166 | CHARMAP "", 163
167 | CHARMAP "", 164
168 | CHARMAP "", 165
169 | CHARMAP "", 166
170 | CHARMAP "", 167
171 | CHARMAP "", 168
172 | CHARMAP "", 169
173 | CHARMAP "", 170
174 | CHARMAP "", 171
175 | CHARMAP "", 172
176 | CHARMAP "", 173
177 | CHARMAP "", 174
178 | CHARMAP "", 175
179 | CHARMAP "0", 176
180 | CHARMAP "1", 177
181 | CHARMAP "2", 178
182 | CHARMAP "3", 179
183 | CHARMAP "4", 180
184 | CHARMAP "5", 181
185 | CHARMAP "6", 182
186 | CHARMAP "7", 183
187 | CHARMAP "8", 184
188 | CHARMAP "9", 185
189 | CHARMAP "A", 186
190 | CHARMAP "B", 187
191 | CHARMAP "C", 188
192 | CHARMAP "D", 189
193 | CHARMAP "E", 190
194 | CHARMAP "F", 191
195 | CHARMAP "G", 192
196 | CHARMAP "H", 193
197 | CHARMAP "I", 194
198 | CHARMAP "J", 195
199 | CHARMAP "K", 196
200 | CHARMAP "L", 197
201 | CHARMAP "M", 198
202 | CHARMAP "N", 199
203 | CHARMAP "O", 200
204 | CHARMAP "P", 201
205 | CHARMAP "Q", 202
206 | CHARMAP "R", 203
207 | CHARMAP "S", 204
208 | CHARMAP "T", 205
209 | CHARMAP "U", 206
210 | CHARMAP "V", 207
211 | CHARMAP "W", 208
212 | CHARMAP "X", 209
213 | CHARMAP "Y", 210
214 | CHARMAP "Z", 211
215 | CHARMAP "a", 212
216 | CHARMAP "b", 213
217 | CHARMAP "c", 214
218 | CHARMAP "d", 215
219 | CHARMAP "e", 216
220 | CHARMAP "f", 217
221 | CHARMAP "g", 218
222 | CHARMAP "h", 219
223 | CHARMAP "i", 220
224 | CHARMAP "j", 221
225 | CHARMAP "k", 222
226 | CHARMAP "l", 223
227 | CHARMAP "m", 224
228 | CHARMAP "n", 225
229 | CHARMAP "o", 226
230 | CHARMAP "p", 227
231 | CHARMAP "q", 228
232 | CHARMAP "r", 229
233 | CHARMAP "s", 230
234 | CHARMAP "t", 231
235 | CHARMAP "u", 232
236 | CHARMAP "v", 233
237 | CHARMAP "w", 234
238 | CHARMAP "x", 235
239 | CHARMAP "y", 236
240 | CHARMAP "z", 237
241 | CHARMAP "'", 238
242 | CHARMAP ",", 239
243 | CHARMAP ".", 240
244 | CHARMAP "_", 241
245 | CHARMAP "-", 242
246 | CHARMAP "!", 243
247 | CHARMAP "?", 244
248 | CHARMAP ":", 245
249 | CHARMAP "/", 246
250 | CHARMAP "", 247
251 | CHARMAP "", 248
252 | CHARMAP "", 249
253 | CHARMAP "", 250
254 | CHARMAP "", 251
255 | CHARMAP "", 252
256 | CHARMAP "", 253
257 | CHARMAP "", 254
258 | CHARMAP " ", 255
259 | POPC
260 | PUSHC
261 | NEWCHARMAP SCRIPT
262 | CHARMAP "<00>", 0
263 | CHARMAP "<01>", 1
264 | CHARMAP "<02>", 2
265 | CHARMAP "<03>", 3
266 | CHARMAP "<04>", 4
267 | CHARMAP "<05>", 5
268 | CHARMAP "<06>", 6
269 | CHARMAP "<07>", 7
270 | CHARMAP "<08>", 8
271 | CHARMAP "<09>", 9
272 | CHARMAP "<0a>", 10
273 | CHARMAP "<0b>", 11
274 | CHARMAP "<0c>", 12
275 | CHARMAP "<0d>", 13
276 | CHARMAP "<0e>", 14
277 | CHARMAP "<0f>", 15
278 | CHARMAP "<10>", 16
279 | CHARMAP "<11>", 17
280 | CHARMAP "<12>", 18
281 | CHARMAP "<13>", 19
282 | CHARMAP "", 20
283 | CHARMAP "", 21
284 | CHARMAP "<16>", 22
285 | CHARMAP "<17>", 23
286 | CHARMAP "<18>", 24
287 | CHARMAP "<19>", 25
288 | CHARMAP "\n", 26
289 | CHARMAP "<1b>", 27
290 | CHARMAP "<1c>", 28
291 | CHARMAP "<1d>", 29
292 | CHARMAP "<1e>", 30
293 | CHARMAP "<1f>", 31
294 | CHARMAP "e ", 32
295 | CHARMAP "ou", 33
296 | CHARMAP " t", 34
297 | CHARMAP "th", 35
298 | CHARMAP "yo", 36
299 | CHARMAP "d ", 37
300 | CHARMAP "s ", 38
301 | CHARMAP "er", 39
302 | CHARMAP "t ", 40
303 | CHARMAP "an", 41
304 | CHARMAP "he", 42
305 | CHARMAP "nd", 43
306 | CHARMAP "u.", 44
307 | CHARMAP " a", 45
308 | CHARMAP "ar", 46
309 | CHARMAP "in", 47
310 | CHARMAP "at", 48
311 | CHARMAP "is", 49
312 | CHARMAP "ea", 50
313 | CHARMAP "to", 51
314 | CHARMAP ". ", 52
315 | CHARMAP "__", 53
316 | CHARMAP "o ", 54
317 | CHARMAP " i", 55
318 | CHARMAP "re", 56
319 | CHARMAP "ed", 57
320 | CHARMAP "ll", 58
321 | CHARMAP "ha", 59
322 | CHARMAP "or", 60
323 | CHARMAP " s", 61
324 | CHARMAP " o", 62
325 | CHARMAP "te", 63
326 | CHARMAP " h", 64
327 | CHARMAP "us", 65
328 | CHARMAP " m", 66
329 | CHARMAP " w", 67
330 | CHARMAP "un", 68
331 | CHARMAP "st", 69
332 | CHARMAP "ow", 70
333 | CHARMAP "on", 71
334 | CHARMAP "it", 72
335 | CHARMAP " I", 73
336 | CHARMAP "n ", 74
337 | CHARMAP "as", 75
338 | CHARMAP "r ", 76
339 | CHARMAP "ve", 77
340 | CHARMAP "en", 78
341 | CHARMAP "ng", 79
342 | CHARMAP "of", 80
343 | CHARMAP " M", 81
344 | CHARMAP " f", 82
345 | CHARMAP "f ", 83
346 | CHARMAP "es", 84
347 | CHARMAP "Fo", 85
348 | CHARMAP "al", 86
349 | CHARMAP "y ", 87
350 | CHARMAP "a ", 88
351 | CHARMAP " y", 89
352 | CHARMAP "av", 90
353 | CHARMAP "I ", 91
354 | CHARMAP "hi", 92
355 | CHARMAP "le", 93
356 | CHARMAP "oo", 94
357 | CHARMAP "ro", 95
358 | CHARMAP " g", 96
359 | CHARMAP "e.", 97
360 | CHARMAP "Ma", 98
361 | CHARMAP "ma", 99
362 | CHARMAP "om", 100
363 | CHARMAP "l ", 101
364 | CHARMAP "el", 102
365 | CHARMAP "ur", 103
366 | CHARMAP " T", 104
367 | CHARMAP " ", 105
368 | CHARMAP " W", 106
369 | CHARMAP "se", 107
370 | CHARMAP "'s", 108
371 | CHARMAP "E ", 109
372 | CHARMAP "li", 110
373 | CHARMAP " b", 111
374 | CHARMAP "<70>", 112
375 | CHARMAP "<71>", 113
376 | CHARMAP "<72>", 114
377 | CHARMAP "<73>", 115
378 | CHARMAP "<74>", 116
379 | CHARMAP "<75>", 117
380 | CHARMAP "<76>", 118
381 | CHARMAP "<77>", 119
382 | CHARMAP "<78>", 120
383 | CHARMAP "<79>", 121
384 | CHARMAP "<7a>", 122
385 | CHARMAP "<7b>", 123
386 | CHARMAP "<7c>", 124
387 | CHARMAP "<7d>", 125
388 | CHARMAP "<7e>", 126
389 | CHARMAP "<7f>", 127
390 | CHARMAP ", ", 128
391 | CHARMAP "u ", 129
392 | CHARMAP "wa", 130
393 | CHARMAP "il", 131
394 | CHARMAP "ut", 132
395 | CHARMAP "Th", 133
396 | CHARMAP "da", 134
397 | CHARMAP " c", 135
398 | CHARMAP "gh", 136
399 | CHARMAP "ca", 137
400 | CHARMAP "ai", 138
401 | CHARMAP "ir", 139
402 | CHARMAP "m ", 140
403 | CHARMAP "Le", 141
404 | CHARMAP "rd", 142
405 | CHARMAP "ig", 143
406 | CHARMAP "ul", 144
407 | CHARMAP "ht", 145
408 | CHARMAP "ba", 146
409 | CHARMAP " l", 147
410 | CHARMAP " G", 148
411 | CHARMAP "no", 149
412 | CHARMAP "ta", 150
413 | CHARMAP " H", 151
414 | CHARMAP "et", 152
415 | CHARMAP "we", 153
416 | CHARMAP " S", 154
417 | CHARMAP "e!", 155
418 | CHARMAP "wi", 156
419 | CHARMAP "HE", 157
420 | CHARMAP "ck", 158
421 | CHARMAP "nt", 159
422 | CHARMAP "", 160
423 | CHARMAP "", 161
424 | CHARMAP "", 162
425 | CHARMAP "", 163
426 | CHARMAP "", 164
427 | CHARMAP "", 165
428 | CHARMAP "", 166
429 | CHARMAP "", 167
430 | CHARMAP "", 168
431 | CHARMAP "", 169
432 | CHARMAP "", 170
433 | CHARMAP "", 171
434 | CHARMAP "", 172
435 | CHARMAP "", 173
436 | CHARMAP "", 174
437 | CHARMAP "", 175
438 | CHARMAP "0", 176
439 | CHARMAP "1", 177
440 | CHARMAP "2", 178
441 | CHARMAP "3", 179
442 | CHARMAP "4", 180
443 | CHARMAP "5", 181
444 | CHARMAP "6", 182
445 | CHARMAP "7", 183
446 | CHARMAP "8", 184
447 | CHARMAP "9", 185
448 | CHARMAP "A", 186
449 | CHARMAP "B", 187
450 | CHARMAP "C", 188
451 | CHARMAP "D", 189
452 | CHARMAP "E", 190
453 | CHARMAP "F", 191
454 | CHARMAP "G", 192
455 | CHARMAP "H", 193
456 | CHARMAP "I", 194
457 | CHARMAP "J", 195
458 | CHARMAP "K", 196
459 | CHARMAP "L", 197
460 | CHARMAP "M", 198
461 | CHARMAP "N", 199
462 | CHARMAP "O", 200
463 | CHARMAP "P", 201
464 | CHARMAP "Q", 202
465 | CHARMAP "R", 203
466 | CHARMAP "S", 204
467 | CHARMAP "T", 205
468 | CHARMAP "U", 206
469 | CHARMAP "V", 207
470 | CHARMAP "W", 208
471 | CHARMAP "X", 209
472 | CHARMAP "Y", 210
473 | CHARMAP "Z", 211
474 | CHARMAP "a", 212
475 | CHARMAP "b", 213
476 | CHARMAP "c", 214
477 | CHARMAP "d", 215
478 | CHARMAP "e", 216
479 | CHARMAP "f", 217
480 | CHARMAP "g", 218
481 | CHARMAP "h", 219
482 | CHARMAP "i", 220
483 | CHARMAP "j", 221
484 | CHARMAP "k", 222
485 | CHARMAP "l", 223
486 | CHARMAP "m", 224
487 | CHARMAP "n", 225
488 | CHARMAP "o", 226
489 | CHARMAP "p", 227
490 | CHARMAP "q", 228
491 | CHARMAP "r", 229
492 | CHARMAP "s", 230
493 | CHARMAP "t", 231
494 | CHARMAP "u", 232
495 | CHARMAP "v", 233
496 | CHARMAP "w", 234
497 | CHARMAP "x", 235
498 | CHARMAP "y", 236
499 | CHARMAP "z", 237
500 | CHARMAP "'", 238
501 | CHARMAP ",", 239
502 | CHARMAP ".", 240
503 | CHARMAP "_", 241
504 | CHARMAP "-", 242
505 | CHARMAP "!", 243
506 | CHARMAP "?", 244
507 | CHARMAP ":", 245
508 | CHARMAP "/", 246
509 | CHARMAP "", 247
510 | CHARMAP "", 248
511 | CHARMAP "", 249
512 | CHARMAP "", 250
513 | CHARMAP "", 251
514 | CHARMAP "", 252
515 | CHARMAP "", 253
516 | CHARMAP "", 254
517 | CHARMAP " ", 255
518 | POPC
519 |
--------------------------------------------------------------------------------
/src/include/constants.inc:
--------------------------------------------------------------------------------
1 | ;;Constants: INVENTORY
2 | DEF INV_MAGIC_CURE = $01
3 | DEF INV_MAGIC_HEAL = $02
4 | DEF INV_MAGIC_MUTE = $03
5 | DEF INV_MAGIC_SLEP = $04
6 | DEF INV_MAGIC_FIRE = $05
7 | DEF INV_MAGIC_ICE = $06
8 | DEF INV_MAGIC_LIT = $07
9 | DEF INV_MAGIC_NUKE = $08
10 | DEF INV_ITEM_POTION_CURE = $09
11 | DEF INV_ITEM_POTION_XCURE = $0a
12 | DEF INV_ITEM_POTION_ETHER = $0b
13 | DEF INV_ITEM_POTION_XETHER = $0c
14 | DEF INV_ITEM_POTION_ELIXIR = $0d
15 | DEF INV_ITEM_POTION_PURE = $0e
16 | DEF INV_ITEM_POTION_EYEDRP = $0f
17 | DEF INV_ITEM_POTION_SOFT = $10
18 | DEF INV_ITEM_POTION_MOOGLE = $11
19 | DEF INV_ITEM_POTION_UNICORN = $12
20 | DEF INV_ITEM_SPELL_SILENCE = $13
21 | DEF INV_ITEM_SPELL_PILLOW = $14
22 | DEF INV_ITEM_SPELL_FLAME = $17
23 | DEF INV_ITEM_SPELL_BLAZE = $18
24 | DEF INV_ITEM_SPELL_BLIZRD = $19
25 | DEF INV_ITEM_SPELL_FROST = $1a
26 | DEF INV_ITEM_SPELL_LITBLT = $1b
27 | DEF INV_ITEM_SPELL_THUNDR = $1c
28 | DEF INV_ITEM_CANDY = $1d
29 | DEF INV_ITEM_KEY = $1f
30 | DEF INV_ITEM_BONE_KEY = $20
31 | DEF INV_ITEM_BRONZE_KEY = $21
32 | DEF INV_ITEM_MIRROR = $27
33 | DEF INV_ITEM_POTION_AMANDA = $2a
34 | DEF INV_ITEM_POTION_OIL = $2d
35 | DEF INV_ITEM_GEM_CRYSTAL = $32
36 | DEF INV_ITEM_GEM_NECTAR = $34
37 | DEF INV_ITEM_GEM_STAMINA = $35
38 | DEF INV_ITEM_GEM_WISDOM = $36
39 | DEF INV_ITEM_GEM_WILL = $37
40 | DEF INV_ITEM_BAG_GOLD = $3a
41 | DEF INV_ITEM_BAG_FANG = $3b
42 | DEF INV_ITEM_MATTOK = $3e
43 | DEF INV_ITEM_RUBY = $3f
44 | DEF INV_ITEM_OPAL = $40
45 | DEF INV_SWORD_BROAD = $42
46 | DEF INV_AXE_BATTLE = $43
47 | DEF INV_SICKLE_SICKLE = $44
48 | DEF INV_WHIP_CHAIN = $45
49 | DEF INV_SWORD_SILVER = $46
50 | DEF INV_SPEAR_WIND = $47
51 | DEF INV_AXE_WERE = $48
52 | DEF INV_MORNING_STAR = $49
53 | DEF INV_SWORD_BLOOD = $4a
54 | DEF INV_SWORD_DRAGON = $4b
55 | DEF INV_WHIP_FLAME = $4c
56 | DEF INV_SWORD_ICE = $4d
57 | DEF INV_AXE_ZEUS = $4e
58 | DEF INV_SWORD_RUSTY = $4f
59 | DEF INV_SPEAR_THUNDER = $50
60 | DEF INV_SWORD_XCALIBR = $51
61 | DEF INV_ARMOR_BRONZE = $52
62 | DEF INV_ARMOR_IRON = $53
63 | DEF INV_ARMOR_SILVER = $54
64 | DEF INV_ARMOR_GOLD = $55
65 | DEF INV_ARMOR_FLAME = $56
66 | DEF INV_ARMOR_ICE = $57
67 | DEF INV_ARMOR_DRAGON = $58
68 | DEF INV_ARMOR_SAMURAI = $59
69 | DEF INV_ARMOR_OPAL = $5a
70 | DEF INV_SHIELD_BRONZE = $5d
71 | DEF INV_SHIELD_IRON = $5e
72 | DEF INV_SHIELD_SILVER = $5f
73 | DEF INV_SHIELD_GOLD = $60
74 | DEF INV_SHIELD_FLAME = $61
75 | DEF INV_SHIELD_DRAGON = $62
76 | DEF INV_SHIELD_AEGIS = $63
77 | DEF INV_SHIELD_OPAL = $64
78 | DEF INV_SHIELD_ICE = $65
79 | DEF INV_HELM_BRONZE = $68
80 | DEF INV_HELM_IRON = $69
81 | DEF INV_HELM_SILVER = $6a
82 | DEF INV_HELM_GOLD = $6b
83 | DEF INV_HELM_OPAL = $6c
84 | DEF INV_HELM_SAMURAI = $6d
85 | ;;Constants: NPC_NAMES
86 | DEF NPC_SNOWMAN_STILL = $00
87 | DEF NPC_FUJI_FOLLOWING = $01
88 | DEF NPC_MYSTERYMAN_FOLLOWING = $02
89 | DEF NPC_WATTS_FOLLOWING = $03
90 | DEF NPC_BOGARD_FOLLOWING = $04
91 | DEF NPC_AMANDA_FOLLOWING = $05
92 | DEF NPC_LESTER_FOLLOWING = $06
93 | DEF NPC_MARCIE_FOLLOWING = $07
94 | DEF NPC_CHOCOBOT_FOLLOWING = $08
95 | DEF NPC_CHOCOBO_FOLLOWING = $09
96 | DEF NPC_WEREWOLF_1 = $0a
97 | DEF NPC_INV_CURE = $0b
98 | DEF NPC_CHEST_1 = $0c
99 | DEF NPC_CHEST_2 = $0d
100 | DEF NPC_CHEST_3 = $0e
101 | DEF NPC_CHEST_4 = $0f
102 | DEF NPC_CHIBIDEVIL = $10
103 | DEF NPC_RABBITE = $11
104 | DEF NPC_GOBLIN = $12
105 | DEF NPC_MUSHROOM = $13
106 | DEF NPC_JELLYFISH = $14
107 | DEF NPC_SWAMPMAN = $15
108 | DEF NPC_LIZARDMAN = $16
109 | DEF NPC_FLOWER = $17
110 | DEF NPC_FACEORB = $18
111 | DEF NPC_SKELETON = $19
112 | DEF NPC_EVIL_PLANT = $1a
113 | DEF NPC_FLYING_FISH = $1b
114 | DEF NPC_ZOMBIE = $1c
115 | DEF NPC_MOUSE = $1d
116 | DEF NPC_PUMPKIN = $1e
117 | DEF NPC_OWL = $1f
118 | DEF NPC_BEE = $20
119 | DEF NPC_CLOUD = $21
120 | DEF NPC_PIG = $22
121 | DEF NPC_CRAB = $23
122 | DEF NPC_SPIDER = $24
123 | DEF NPC_INV_OPEN_NORTH = $25
124 | DEF NPC_INV_OPEN_SOUTH = $26
125 | DEF NPC_INV_OPEN_EAST = $27
126 | DEF NPC_INV_OPEN_WEST = $28
127 | DEF NPC_MIMIC_CHEST = $29
128 | DEF NPC_HOPPING_BUG = $2a
129 | DEF NPC_PORCUPINE = $2b
130 | DEF NPC_CARROT = $2c
131 | DEF NPC_EYE_SPY = $2d
132 | DEF NPC_WEREWOLF_2 = $2e
133 | DEF NPC_GHOST = $2f
134 | DEF NPC_BASILISK = $30
135 | DEF NPC_SCORPION = $31
136 | DEF NPC_SAURUS = $32
137 | DEF NPC_MUMMY = $33
138 | DEF NPC_PAKKUN_LIZARD = $34
139 | DEF NPC_SNAKE = $35
140 | DEF NPC_SHADOW = $36
141 | DEF NPC_BLACK_WIZARD = $37
142 | DEF NPC_FLAME = $38
143 | DEF NPC_GARGOYLE = $39
144 | DEF NPC_MONKEY = $3a
145 | DEF NPC_MOLEBEAR = $3b
146 | DEF NPC_OGRE = $3c
147 | DEF NPC_BARNACLEJACK = $3d
148 | DEF NPC_PHANTASM = $3e
149 | DEF NPC_MINOTAUR = $3f
150 | DEF NPC_GLAIVE_MAGE = $40
151 | DEF NPC_GLAIVE_KNIGHT = $41
152 | DEF NPC_DARK_LORD = $42
153 | DEF NPC_MEGA_FLYTRAP = $43
154 | DEF NPC_DRAGONFLY = $44
155 | DEF NPC_ARMADILLO = $45
156 | DEF NPC_SNOWMAN_MOVING = $46
157 | DEF NPC_SABER_CAT = $47
158 | DEF NPC_WALRUS = $48
159 | DEF NPC_DUCK_SOLDIER = $49
160 | DEF NPC_POTO_RABBIT = $4a
161 | DEF NPC_CYCLONE = $4b
162 | DEF NPC_BEHOLDER_EYE = $4c
163 | DEF NPC_MANTA_RAY = $4d
164 | DEF NPC_JUMPING_HAND = $4e
165 | DEF NPC_TORTOISE = $4f
166 | DEF NPC_FIRE_MOTH = $50
167 | DEF NPC_EARTH_DIGGER = $51
168 | DEF NPC_DENDEN_SNAIL = $52
169 | DEF NPC_DOPPEL_MIRROR = $53
170 | DEF NPC_GUARDIAN = $54
171 | DEF NPC_EVIL_SWORD = $55
172 | DEF NPC_GAUNTLET = $56
173 | DEF NPC_GARASHA_DUCK = $57
174 | DEF NPC_FUZZY_WONDER = $58
175 | DEF NPC_ELEPHANT = $59
176 | DEF NPC_NINJA = $5a
177 | DEF NPC_JULIUS = $5b
178 | DEF NPC_DEMON_HEAD = $5c
179 | DEF NPC_INV_DESSERT_CAVE_STONE = $5d
180 | DEF NPC_WATER_DEMON = $5e
181 | DEF NPC_SEA_DRAGON = $5f
182 | DEF NPC_GALL_FISH = $60
183 | DEF NPC_WILLY = $61
184 | DEF NPC_MYSTERYMAN_1 = $62
185 | DEF NPC_AMANDA_1 = $63
186 | DEF NPC_AMANDA_ILL = $64
187 | DEF NPC_AMANDA_DEAD = $65
188 | DEF NPC_FUJI_1 = $66
189 | DEF NPC_FUJI_WINDOW = $67
190 | DEF NPC_MOTHER = $68
191 | DEF NPC_BOGARD_1 = $69
192 | DEF NPC_BOGARD_2 = $6a
193 | DEF NPC_KETTS_WEREWOLF = $6b
194 | DEF NPC_INV_FUJI_COFFIN = $6c
195 | DEF NPC_CIBBA = $6d
196 | DEF NPC_GUY_WENDEL = $6e
197 | DEF NPC_WATTS = $6f
198 | DEF NPC_MINECART = $70
199 | DEF NPC_CHOCOBO_EGG = $71
200 | DEF NPC_DAVIAS = $72
201 | DEF NPC_LESTER_1 = $73
202 | DEF NPC_LESTER_PARROT = $74
203 | DEF NPC_BOWOW = $75
204 | DEF NPC_SARAH = $76
205 | DEF NPC_MARCIE_1 = $77
206 | DEF NPC_KING_OF_LORIM = $78
207 | DEF NPC_GLADIATOR_FRIEND = $79
208 | DEF NPC_INV_INN = $7a
209 | DEF NPC_GIRL_TOPPLE = $7b
210 | DEF NPC_GUY_TOPPLE = $7c
211 | DEF NPC_GUY_TOPPLE_HOUSE = $7d
212 | DEF NPC_GIRL_TOPPLE_HOUSE = $7e
213 | DEF NPC_OLDMAN_TOPPLE = $7f
214 | DEF NPC_GUY_KETTS = $80
215 | DEF NPC_GIRL_KETTS = $81
216 | DEF NPC_GIRL_CIBBA = $82
217 | DEF NPC_GUY_WENDEL2 = $83
218 | DEF NPC_GUY_WENDEL_HOUSE = $84
219 | DEF NPC_WOMAN_CIBBA = $85
220 | DEF NPC_OLDMAN_WENDEL = $86
221 | DEF NPC_DWARF_1 = $87
222 | DEF NPC_DWARF_2 = $88
223 | DEF NPC_DWARF_3 = $89
224 | DEF NPC_DWARF_4 = $8a
225 | DEF NPC_DWARF_5 = $8b
226 | DEF NPC_GUY_AIRSHIP_1 = $8c
227 | DEF NPC_GUY_AIRSHIP_2 = $8d
228 | DEF NPC_GUY_AIRSHIP_3 = $8e
229 | DEF NPC_GUY_AIRSHIP_4 = $8f
230 | DEF NPC_OLDMAN_MENOS_1 = $90
231 | DEF NPC_GUY_MENOS = $91
232 | DEF NPC_GIRL_MENOS_1 = $92
233 | DEF NPC_OLDMAN_MENOS_2 = $93
234 | DEF NPC_GIRL_MENOS = $94
235 | DEF NPC_WOMAN_MENOS_2 = $95
236 | DEF NPC_GIRL_JADD_1 = $96
237 | DEF NPC_OLDMAN_JADD = $97
238 | DEF NPC_GIRL_JADD_2 = $98
239 | DEF NPC_GUY_JADD = $99
240 | DEF NPC_DWARF_JADD = $9a
241 | DEF NPC_SALESMAN_JADD = $9b
242 | DEF NPC_GIRL_JADD_3 = $9c
243 | DEF NPC_BOY_JADD = $9d
244 | DEF NPC_OLDMAN_ISH = $9e
245 | DEF NPC_GUY_ISH_1 = $9f
246 | DEF NPC_GUY_ISH_2 = $a0
247 | DEF NPC_GIRL_ISH = $a1
248 | DEF NPC_GUY_ISH_3 = $a2
249 | DEF NPC_GUY_ISH_4 = $a3
250 | DEF NPC_INV_STONE_1 = $a4
251 | DEF NPC_INV_STONE_2 = $a5
252 | DEF NPC_INV_STONE_3 = $a6
253 | DEF NPC_INV_STONE_4 = $a7
254 | DEF NPC_INV_STONE_5 = $a8
255 | DEF NPC_INV_STONE_6 = $a9
256 | DEF NPC_INV_STONE_7 = $aa
257 | DEF NPC_INV_STONE_8 = $ab
258 | DEF NPC_GUY_LORIM_FROZEN = $ac
259 | DEF NPC_GUY_LORIM_1 = $ad
260 | DEF NPC_GUY_LORIM_2 = $ae
261 | DEF NPC_SALESMAN = $af
262 | DEF NPC_INV_SALESMAN_1 = $b0
263 | DEF NPC_FUJI_2 = $b1
264 | DEF NPC_INV_SALESMAN_2 = $b2
265 | DEF NPC_MYSTERYMAN_2 = $b3
266 | DEF NPC_BOGARD_3 = $b4
267 | DEF NPC_AMANDA_2 = $b5
268 | DEF NPC_LESTER_2 = $b6
269 | DEF NPC_MARCIE_2 = $b7
270 | DEF NPC_CHOCOBOT = $b8
271 | DEF NPC_CHOCOBO_1 = $b9
272 | DEF NPC_CHOCOBO_2 = $ba
273 | DEF NPC_PRISION_BARS = $bb
274 | DEF NPC_MUSIC_NOTES = $bc
275 | DEF NPC_MAGIC_SALESMAN = $bd
276 | DEF NPC_LAST_GUY = $be
277 |
--------------------------------------------------------------------------------
/tools/mapExport.py:
--------------------------------------------------------------------------------
1 | import PIL.Image, PIL.ImageDraw
2 | import struct
3 | import sys
4 |
5 |
6 | class ROM:
7 | def __init__(self, filename):
8 | self.data = open(filename, "rb").read()
9 |
10 | def getWord(self, bank, addr):
11 | addr += 0x4000 * bank
12 | return struct.unpack("> x):
32 | v |= 1
33 | if b & (0x80 >> x):
34 | v |= 2
35 | buffer[x+y*8] = v
36 | tile = PIL.Image.frombytes('P', (8, 8), bytes(buffer))
37 | tile = tile.resize((16, 16))
38 | tile_cache[addr] = tile
39 | else:
40 | tile = tile_cache[addr]
41 | img.paste(tile, (tx, ty))
42 |
43 | def drawText(img, x, y, str):
44 | img.draw.text((x, y), str, fill=4)
45 |
46 | def drawMetaTile(img, x, y, metatile_data_addr, gfx_offset, meta_tile):
47 | for ty in range(2):
48 | for tx in range(2):
49 | tile_nr = rom.getByte(0x08, metatile_data_addr + meta_tile * 6 + tx + ty * 2)
50 | drawTile(img, x * 32 + tx * 16, y * 32 + ty * 16, 0x0C, gfx_offset + tile_nr * 16)
51 |
52 | metatile_type_info1 = rom.getByte(0x08, metatile_data_addr + meta_tile * 6 + 4)
53 | metatile_type_info2 = rom.getByte(0x08, metatile_data_addr + meta_tile * 6 + 5)
54 | # Draw metatile type info
55 | #if metatile_type_info2 not in {0x04, 0x05}:
56 | # drawText(img, x * 32, y * 32 + 8, "%02x %02x" % (metatile_type_info1, metatile_type_info2))
57 |
58 | for map_nr in range(16):
59 | addr = map_nr * 11
60 | gfx_offset = rom.getWord(0x08, addr + 0)
61 | if gfx_offset >= 0x4000:
62 | gfx_offset -= 0x8000
63 | metatile_data_addr = rom.getWord(0x08, addr + 3) - 0x4000
64 |
65 | print("Map %02x" % (map_nr))
66 | r = {}
67 | for n in range(256):
68 | d = rom.getByte(0x08, metatile_data_addr + n * 6 + 5)
69 | r[d] = r.get(d, 0) + 1
70 | for k, v in sorted(r.items()):
71 | print("%02x: %d" % (k, v))
72 |
73 | map_bank = rom.getByte(0x08, addr + 6)
74 | map_data_addr = rom.getWord(0x08, addr + 7) - 0x4000
75 |
76 | indoor_map = rom.getByte(map_bank, map_data_addr + 0)
77 | rle = rom.getByte(map_bank, map_data_addr + 1)
78 | h = rom.getByte(map_bank, map_data_addr + 2)
79 | w = rom.getByte(map_bank, map_data_addr + 3)
80 | map_data_addr += 4
81 |
82 | if indoor_map:
83 | template_addr = rom.getWord(map_bank, map_data_addr + 0) - 0x4000
84 | map_data_addr += 2
85 | door_data_addr = map_data_addr
86 | map_data_addr += 3 * 4 * 2
87 |
88 | img = PIL.Image.new("P", (32 * 10 * w, 32 * 8 * h))
89 | img.draw = PIL.ImageDraw.Draw(img)
90 |
91 | for ry in range(h):
92 | #print(map_nr, ry, h)
93 | for rx in range(w):
94 | map_script_addr = rom.getWord(map_bank, map_data_addr + 0) - 0x4000
95 | map_tiledata_addr = rom.getWord(map_bank, map_data_addr + 2) - 0x4000
96 | map_data_addr += 4
97 |
98 | addr = map_tiledata_addr
99 | if indoor_map:
100 | addr = template_addr
101 |
102 | tiles = []
103 | while len(tiles) < 10 * 8:
104 | data = rom.getByte(map_bank, addr)
105 | addr += 1
106 |
107 | if data & 0x80:
108 | tiles += [data & 0x7F] * rle
109 | else:
110 | tiles.append(data)
111 |
112 | if indoor_map:
113 | tiles[9 + 3 * 10] = rom.getByte(map_bank, door_data_addr + (rom.getByte(map_bank, map_tiledata_addr + 0) & 3) * 8 + 0)
114 | tiles[9 + 4 * 10] = rom.getByte(map_bank, door_data_addr + (rom.getByte(map_bank, map_tiledata_addr + 0) & 3) * 8 + 1)
115 | tiles[0 + 3 * 10] = rom.getByte(map_bank, door_data_addr + (rom.getByte(map_bank, map_tiledata_addr + 1) & 3) * 8 + 2)
116 | tiles[0 + 4 * 10] = rom.getByte(map_bank, door_data_addr + (rom.getByte(map_bank, map_tiledata_addr + 1) & 3) * 8 + 3)
117 | tiles[4 + 0 * 10] = rom.getByte(map_bank, door_data_addr + (rom.getByte(map_bank, map_tiledata_addr + 2) & 3) * 8 + 4)
118 | tiles[5 + 0 * 10] = rom.getByte(map_bank, door_data_addr + (rom.getByte(map_bank, map_tiledata_addr + 2) & 3) * 8 + 5)
119 | tiles[4 + 7 * 10] = rom.getByte(map_bank, door_data_addr + (rom.getByte(map_bank, map_tiledata_addr + 3) & 3) * 8 + 6)
120 | tiles[5 + 7 * 10] = rom.getByte(map_bank, door_data_addr + (rom.getByte(map_bank, map_tiledata_addr + 3) & 3) * 8 + 7)
121 | map_tiledata_addr += 4
122 | while True:
123 | tile = rom.getByte(map_bank, map_tiledata_addr)
124 | xy = rom.getByte(map_bank, map_tiledata_addr + 1)
125 | map_tiledata_addr += 2
126 | if tile == 0xFF:
127 | break
128 | tiles[(xy & 0x0F) + (xy >> 4) * 10] = tile
129 |
130 | for y in range(8):
131 | for x in range(10):
132 | drawMetaTile(img, rx * 10 + x, ry * 8 + y, metatile_data_addr, gfx_offset, tiles[x+y*10])
133 |
134 | enter_map_script_index = rom.getWord(map_bank, map_script_addr)
135 | map_script_addr += 2
136 | while True:
137 | xy = rom.getByte(map_bank, map_script_addr)
138 | if xy == 0xff:
139 | break
140 | script_index = rom.getWord(map_bank, map_script_addr + 1)
141 | map_script_addr += 3
142 | x = xy & 0x0F
143 | y = xy >> 4
144 | drawText(img, (rx * 10 + x) * 32, (ry * 8 + y) * 32, "%04x" % (script_index))
145 |
146 | pal = img.getpalette()
147 | pal[0:3] = [0xc4,0xf0,0xc2]
148 | pal[3:6] = [0x5a,0xb9,0xa8]
149 | pal[6:9] = [0x1e,0x60,0x6e]
150 | pal[9:12] = [0x2d,0x1b,0x00]
151 | pal[12:15] = [0xff,0x00,0x00]
152 | img.putpalette(pal)
153 | img.save("map%02x.png" % (map_nr))
154 |
--------------------------------------------------------------------------------
/tools/romAsText.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | # Decode the whole rom as text, as we have special text encoding, it requires some extra work that normal hex editors cannot do.
4 |
5 | rom = open(sys.argv[1], "rb").read()
6 |
7 | charmap = {n: "<%02x>" % (n) for n in range(256)}
8 | for n in range(10):
9 | charmap[0xB0 + n] = str(n)
10 | for n in range(26):
11 | charmap[0xBA + n] = chr(65 + n)
12 | charmap[0xD4 + n] = chr(97 + n)
13 | charmap[0x14] = ""
14 | charmap[0x15] = ""
15 | charmap[0x1A] = "\\n"
16 | charmap[0xEE] = "'"
17 | charmap[0xEF] = ","
18 | charmap[0xF0] = "."
19 | charmap[0xF1] = "_"
20 | charmap[0xF2] = "-"
21 | charmap[0xF3] = "!"
22 | charmap[0xF4] = "?"
23 | charmap[0xF5] = ":"
24 | charmap[0xF6] = "/"
25 | charmap[0xFF] = " "
26 | for n in range(0x70):
27 | d0 = rom[0x3f1d + n * 2]
28 | d1 = rom[0x3f1d + n * 2 + 1]
29 | if 0x30 + n >= 0x80:
30 | charmap[0x30 + n] = charmap[d0] + charmap[d1]
31 | else:
32 | charmap[0x20 + n] = charmap[d0] + charmap[d1]
33 |
34 | for idx in range(0, len(rom), 32):
35 | line = "%02x:%04x: " % (idx >> 14, (idx & 0x3FFF) + (0 if idx < 0x4000 else 0x4000))
36 | for n in range(32):
37 | line += charmap[rom[idx+n]]
38 | print(line)
39 |
--------------------------------------------------------------------------------