For Pokemon TI, I've been thinking about the sprite data I'd need. I'm looking at about 77312 bytes just for the battles sprites (this is the total for front and back, but it's still a lot). I was wondering if someone could help me with compressing the images.
They're 4 lvl greyscale and here's a sample of the hex data:
I'm trying to see if I can make heads or tails of this page, though. If I could figure out the compression technique used in Red and Blue, that could make my life even easier, quite possibly. Then I could theoretically grab the hex right out of the rom. Of course, that depends on how efficient that compression would be in Axe.
Slight update, and new section thanks to what squidgetx posted.
1) Appvars and Programs
Spoiler For Spoiler:
Appvars and programs have just about the same structure when accessed through Axe. They can have names up to 8 characters in length, that do not start with a number. Appvars can contain lowercase letters in their name, and while programs can, it is more common practice for them to have all uppercase names. This is because if a program contains lowercase letters in its name, it cannot be run from the homescreen.
GetCalc("appvAPPVAR")→PointerWhere 'APPVAR' is to be substituted with the name of the appvar you want to access, and Pointer is where you want the data to point to. For example:
GetCalc("appvAPPVAR")→AThis stores the location in RAM of the appvar APPVAR to the pointer A. You can then access data in the appvar by using pointers as you normally would.
GetCalc("appvAPPVAR")→A 1→{A}The code above would store 1 to the first byte of the appvar APPVAR. The code above will only work if the appvar exists and is in the RAM.
Now, if your appvar doesn't exist, you can easily create it by adding a second argument to your GetCalc() command.
GetCalc("appvAPPVAR",Size)→PointerWhere Size is the size in bytes of the appvar you want to create.
If the appvar exists, but is in the archive, there are a number of things you can do. You could unarchive it, but if you are only going to read data from it, this is not the best way to do it.
Archive "appvAPPVAR"This can take more and more time if you haven't GarbageCollected recently, though. However, this does allow you to save your data in the archive.
If you simply want to read data from an archived appvar, then you could copy it to a file.
DelVar "appvAPPVAR"This will only work if the appvar is in the RAM. If you copied your appvar to a file, you don't need to worry about deleting a file, as ending the program will take care of clearing the file for you. In addition, you can copy an appvar to a file that you previously used with no adverse effects.
GetCalc("appvAPPVAR",Y0) GetCalc("appvAPPVAR2",Y0)This would copy the appvar APPVAR to file Y0, then copy the appvar APPVAR2 to file Y0. Accessing file Y0 would then allow you to access the data in APPVAR2.
Please note that data cannot be stored to files, merely read from files.
Programs can be accessed exactly the same way as appvars, except that you use the 'prgm' token instead of the 'v' you get from [2nd]+[8] (which becomes 'appv' with the Axe Tokens).
2) Real Variables
Spoiler For Spoiler:
Accessing real vars is fairly easy to do, actually. First, getting the pointer to a real var is:
GetCalc("varA")→P 1→float{P}will not give you proper results. In fact, it will render the variable A invalid until you overwrite it properly, whether inside or outside the Axe program.
The correct offset for accessing a real var is Pointer-2.
GetCalc("varA")→P 1→float{P-2}This code will store one to the real var A, and you can see that now outside of the Axe program. You can store 0-65535 to real vars using Axe, as Axe only supports two byte numbers. Note: You don't need to put a r after the float command if you are storing a two byte number. The 'var' token is the 'u' you get from [2nd]+[7] (it becomes 'var' with the Axe tokens).
3) Accessing Arbitrary Variables (courtesy of squidgetx)
It does the same thing as GetCalc("appvHI")->A, but I'm sure you can think of many applications of this method instead (shells and mem readers come to mind). You can use 05 to get a program or 06 to get a protected program (instead of $15). Other prefixes you may be able to use are (taken from the SDK. also I haven't tested all of these and would be wary if you tried GetCalc'ing an application for example)
Data Types: 00h Real 01h List 02h Matrix 03h Equation 04h String 05h Program 06h Protected Program 07h Picture 08h Graph Database 0Bh New EQU 0Ch Complex 0Dh Complex 14h Application 15h AppVar 17h Group
This could be taken as a little confusing, so let's break this down a little bit.
Copy("HI",L1+1,2) This line copies the name of the variable (in this case, "HI") to L1+1.
0->{L1+3} This line adds the null byte or terminating zero to the end of the name string starting at L1+1. Where 3 is would be the length of the variable name + 1.
E15->{L1} This line stores the type byte of the variable to L1. In this case, it's denotating an appvar. The E means the number that follows is the hexadecimal equivalent, so any of the hex numbers from the above list would work here in place of the 15.
GetCalc(L1)->A This uses the string you just constructed at the beginning of L1 to create the variable.
Once again Quigibo, why won't my file be accepted?
Open it up in Noteworthy Composer (there's a download link in this topic, I think it's on page 1) and save it as a type 0 or type 1 midi. Then it should work.
Runer122 thank you! It makes perfect sense now. The 7 bytes are just a string of bits that are on or off depending on whether or not the TM or HM in question can be applied.
Wanted to show I was still working on this. Slowly, but surely. I've drawn up the special symbols, though I don't have them all on my computer, so I can't show you yet.
I've also been working on stat generation and such, and I feel I've got a good start, but I can't figure out the TM-HM flags. It's a seven byte set of flags for each Pokemon that determines what TMs and HMs they can and can't learn. If someone could help with this, it would be greatly appreciated.
Quote from: Bulbapedia
The TMs which a Pokémon can learn are stored as a bunch of flags. Starting from the LSB of the first byte, and ending with the MSB of the last byte. The five HMs are treated as TMs 51-55.
01 2D 31 31 2D 41 16 03 2D 40 55 00 40 E5 40 21 2D 00 00 03 A4 03 38 C0 03 08 06 00Here is the list of TMs and HMs Bulbasaur can learn in Generation I. And the link to the base stats data structure page.
Yeah, it's gonna be something like that. I'm planning on a map and tile editor, as well as some map related data, like maybe setting the NPC convos or shop data.
I found a bug: If you use Bitmap(, it doesnt show up good in an application. It shows up a randomly-filled square with the size of the picture. Is this a known bug? Else, this is version 0.4.8
Yeah, I reported this a long while ago as well.
In order to use it in an App, you have to copy the bitmap to somewhere in RAM be it an appvar or freeram, then use Bitmap() with a pointer to the bitmap.
Pokemon TI: A port of Pokemon Red and Blue to the TI-83+ SE/84+/84+ SE. Nostalgia: A game that's made in memory of classic BASIC and ASM rpgs. Blur: A tunnel game that blazes past the rest. Collision Course: A tunnel game with a twist. Colliding doesn't cause a crash, but instead a recoil. FMA: A Fullmetal Alchemist game made for Cage Match #5.
Just be aware of the fact that right now, the convertor doesn't properly create the appvar's checksum. You can fix this by opening the appvar in Wabbitemu and exporting it. This recalculates the checksum and lets you send the appvar to your calc.