Omnimaga

Calculator Community => TI Calculators => Axe => Topic started by: leafy on January 27, 2011, 07:12:59 pm

Title: Storing Levels into an Appvar
Post by: leafy on January 27, 2011, 07:12:59 pm
How could you store a bunch of levels into an appvar, then read from the appvar to create a temporary variable? The levels are in the format [10240blahblahblah] in hex, and then there are 6 other variables that are tilemap width, tilemap height, starting tilemap x, starting tilemap y, starting sprite x, and starting sprite y.
Any help is appreciated.
Title: Re: Storing Levels into an Appvar
Post by: Ashbad on January 27, 2011, 09:24:15 pm
Well, the way to actually create appvars is in the form: GetCalc("appvNAME",Size)->Pointer to data.  An example:

Code: [Select]
GetCalc("appvSAUSAGE",1337) -> P
"Daddy would you like some sausauge?  Daddy would you like some sausages" -> Str1
" " -> Str2
Copy(Str1,P,Str2-Str1-1)

Would create appvar SAUSAGE that's 1337 bytes in size and Stores the pointer to the appvar in P.  Then, I simply copied the lyrics of the sausage song into it.  It can be read from like any old pointer, such as doing this:

Code: [Select]
Disp P
...
Displays the song up to the first
occurence of hex code $00, which
was at the end of Str1 that we copied
...

Warning, however, if there's not enough RAM to create the appvar, then it will return 0 into P instead of the actual pointer to the appvar.  So, if we ran the second part, instead of saying "Daddy would you like some sausage..." it would say some random crap like "!@HDFJK*%TNHSKJDFJHSK$^FKJD%$" Until the first occurence of $00.  Here's a way to check for the inability to create an appvar:

Code: [Select]
Return!If GetCalc("appvSAUSAGE")
Which pops the last entry into PC and resumes the flow of the program -- or quits the program if no pushes of PC happened.
Title: Re: Storing Levels into an Appvar
Post by: leafy on January 27, 2011, 09:32:56 pm
Why do you use Str2-Str1-1? Is it because of that empty byte after every string?
Title: Re: Storing Levels into an Appvar
Post by: Ashbad on January 28, 2011, 09:59:57 am
yeah, but that helps it so disp stops at the empty byte.  I just used Str2 to get the relative size of The sausage song's lyrics.

And there's only an empty byte after strings ending with something like -> Str1.  If there's no static pointer assigned to it, then no extra byte is added.
Title: Re: Storing Levels into an Appvar
Post by: leafy on January 31, 2011, 10:10:42 pm
So here's one of my sample levels - how would you store this into an appvar?

[666666666666666666666666 --> GDB004
[933338666666666666666666
[600000000000000000000006
[600000000000000000000006
[600006666666666666660006
[600009338666933338160006
[600006000000000006060006
[600006000000000006060006
[600000000000000000060006
[600000000000000000060006
[666669333333386666660006
[666666666666666666660006
[600000000000000000000006
[600000000000000000000006
[666666666666666666933338
[666666666666666666666666
Title: Re: Storing Levels into an Appvar
Post by: Builderboy on January 31, 2011, 10:12:32 pm
Code: [Select]
GetCalc("appvNAME",Size)->A
Copy(GDB004,A,Size)

:D
Title: Re: Storing Levels into an Appvar
Post by: leafy on January 31, 2011, 10:53:55 pm
So if I wanted to put in multiple levels, it would be the same process?
Two questions - the size of the tilemap is half the actual size, right? also, how would I access the appvar contents from the main program?
Title: Re: Storing Levels into an Appvar
Post by: Builderboy on January 31, 2011, 10:59:13 pm
Not quite the same process.  The copy statement copies it to the beginning of the appvar, since the pointer A is pointing to the beginning.  Once you copy the first level, you will need to increment A by the length of the first chunk of data so you don't overwrite it.  You will also need to make sure that when you create the appvar with the GetCalc() command, you initialize it with enough memory to fit all of your levels.

As for the size... why would it be half?

And as for accessing an Appvar that already exists, you would first get the pointer to the start of the appvar with GetCalc("appvNAME")->P, and then copy your levels from the appvar and to wherever you want with a copy statement.
Title: Re: Storing Levels into an Appvar
Post by: leafy on January 31, 2011, 11:03:19 pm
Oh, okay. I get it now :D
I thought it was half for some arndom reason. I see why I'm wrong now.

To initialize the memory, do you have to use Zeros(?
Title: Re: Storing Levels into an Appvar
Post by: Deep Toaster on January 31, 2011, 11:32:05 pm
Oh, okay. I get it now :D
I thought it was half for some arndom reason. I see why I'm wrong now.

You probably figured it out, but each hex digit is one nibble (half a byte) :)

To initialize the memory, do you have to use Zeros(?

Nope, Zeros(42) is exactly the same as [000000000000000000000000000000000000000000000000000000000000000000000000000000000000] (42 bytes of zero, or 84 zeros). Just easier to write ;)
Title: Re: Storing Levels into an Appvar
Post by: Builderboy on February 01, 2011, 01:32:33 am
Oh, okay. I get it now :D
I thought it was half for some arndom reason. I see why I'm wrong now.

To initialize the memory, do you have to use Zeros(?

When I say initialize, I mean create the appvar.  The command for that is getCalc("appvName",size)
Title: Re: Storing Levels into an Appvar
Post by: Compynerd255 on February 09, 2011, 10:37:03 am
When you create a new Appvar using the GetCalc(NAME, SIZE) command, and the appvar name already exists, it is replaced with a new Appvar of Size bytes that is filled with zeroes.

If you would like to read from an appvar, set a maximum size for the level and then when loading it, copy it to L1 or another saferam area. Then, simply read from L1.

If you want to store multiple levels in the same appvar, store the levelset like this:
1. Name of levelset
2. Number of levels
3. The size of each of the levels
4. Each level in turn
If how to read this levelset isn't self-explanatory, I'll explain it later.

Oh, and that "appv" in the appvar name is actually the [2nd]+[v] token, not simply typing "appv".