Page 7 of 7

Re: Thoughts about data control

PostPosted: Tue Feb 15, 2011 6:15 am
by schnellboot
In computer science, an array type is a data type that is meant to describe a collection of elements (values or variables), each selected by one or more indices that can be computed at run time by the program. Such a collection is usually called an array variable, array value, or simply array.[1] By analogy with the mathematical concepts of vector and matrix, an array type with one or two indices is often called a vector type or matrix type, respectively.
Source: wikipedia

Re: Thoughts about data control

PostPosted: Thu May 26, 2011 10:10 pm
by lcl
Here's what I've been working on to get my data control as clear as possible.

I noticed that many users (including me) are having problems with creating levels and especially choosing how to make them, (multiple geds, using activation regions).

Both of these methods have some things that make them inefficient to use:

Multiple geds:
- Every ged needs to contain all the same actors and events and actions and changing even a small thing in the game will become very big work because all the geds have to be changed. And think about if the thing to be changed is massive..

Activation regions:
- The functionality of this method is not so good. I used activation regions with dimension55355 and it was hard to get it working. Some actors just disappeared from some activation regions and fixing it was really painful.

So, I have thought of other ways to create game levels and I ended up making a system that loads levels from text files.

I have succeeded to create a level according to the contents of a file which I wrote manually.
I am currently working on a level creator program that will be able to write a level into file.

The files' contents will be:

1. Level name (can contain many words, just must use '_' between them. The system will change '_''s to space).
2. Height of level (max count of tiles on vertical axis).
3. Width of level (max count of tiles on horizontal axis).
4. Tile height
5. Tile width
6. The actual data, numbers that represent the levels content.

There may come more things that need to be written in the file.
And the editor will automatically count the widths and heights.

The editor will be published with level loading code as soon as I get it done.

- lcl -

Re: Thoughts about data control

PostPosted: Thu May 26, 2011 10:56 pm
by Game A Gogo
Cool :D
if you ever need help to make your level editor and levels more advanced, I think I mastered file saving with fopen pretty well! I'm sure you looked at P4020

Re: Thoughts about data control

PostPosted: Thu May 26, 2011 11:25 pm
by lcl
Game A Gogo wrote:Cool :D
if you ever need help to make your level editor and levels more advanced, I think I mastered file saving with fopen pretty well! I'm sure you looked at P4020

Thanks! :)
I will ask you if I need help.

Oh, I forgot to say that I am trying to develop it so user friendly that anyone on the forum could use it for their games. The whole idea is to make it suitable for creating levels to anyones games, easily. :)

Re: Thoughts about data control

PostPosted: Mon Aug 08, 2011 8:25 am
by falcon3600games
DST wrote:
Hblade wrote:Does anyone know if DST Is human? O.o. He's way to frakin smart lol.

Well, I'm smarter than your average bear, but that's only part of what being smart is.

Listening to other people and learning from them - that's what smart is!

Programming the computer to work for you - that's what smart is!

Never putting personal pride ahead of learning - that's what smart is!


These things are all really hard sometimes! the last one is probably the hardest!
(especially when you get old!).


It's random for me to post this, but DST, you seem like a top MF at this! :)

Re: Thoughts about data control

PostPosted: Fri Dec 16, 2011 9:16 pm
by DST
I mentioned using data arrays to create spreadshots in another thread. Here's the example:

Say you want a boss to fire this spread pattern:
spreadf.png


Simple create a data array of nine integers, as long as the total number of waves of the shot. In this case it's

Code: Select all
int fSpread[][]={{
0, 0, 0, 1, 0, 1, 0, 0, 0},{
0, 0, 1, 0, 1, 0, 1, 0, 0},{
0, 1, 0, 0, 1, 0, 0, 1, 0},{
0, 0, 0, 1, 0, 1, 0, 0, 0},{
0, 0, 0, 0, 1, 0, 0, 0, 0}};
int sWave=0;



Then write your firing loop, creating a shot at each position with a '1' in it.

Code: Select all
void fSpreadShot(){
int j; int x1;
for(j=0; j<9; j++){
if(fSpread[sWave][j]==1){
x1=j*24;
CreateActor(shot etc, x1, y);
}
} //end j Loop
sWave++;
if(sWave==5){
sWave=0;
}
} //end fSpreadShot


Run this script at a regular interval and boom! The boss will fire spreadshots. You can add sine/cos values to the x and y to allow for the boss to fire them in a specific direction.

At any time, you can run this script with a different data array to make different spreadshots. If you make a [][][] array, you can store all your spreadshots in a big list. You can even use the first array of each array [][][thisone] to store the other values for the script, such as the interval, the type of shot or shot speed, etc. and simply start the 'sWave' on 1.

For extra control, 'sWave' variable in reverse, and write the data arrays the other direction. This way, when you create your data arrays, they will appear geometrically the same as the spread pattern does onscreen, if you catch my drift.

int happyface[][]={{
1, 1, 1, 0, 0, 0, 1, 1, 1},{
1, 1, 0, 1, 1, 1, 0, 1, 1},{
1, 0, 1, 0, 1, 0, 1, 0, 1},{
1, 0, 1, 1, 1, 1, 1, 0, 1},{
1, 0, 1, 0, 1, 0, 1, 0, 1},{
1, 1, 0, 1, 0, 1, 0, 1, 1},{
1, 1, 1, 0, 0, 0, 1, 1, 1}};

Re: Thoughts about data control

PostPosted: Tue Dec 27, 2011 12:39 am
by Fuzzy
I was inspired by DSTs function and I came up with something a little different. Here it is.
Code: Select all
int firingPattern = 0x15; // the binary pattern looks like 1010100000000000 - it is "21" in decimal.
int patternFire(int pattern)
{
    int result = 0; // start with no signal to fire
    int steps = 16; // pattern length in bits - we are using a 16 bit space.
    result = pattern & 0x1; // grab the parity bit
    if ((result == 1) {
        CreateActor(shot etc, parentX, parentY);
    }
    pattern = pattern >> 1; // consume the end bit - this is bitwise division by 2.
    pattern = pattern ^ result << (steps-1); // use the result bit to rebuild the pattern.
    return pattern;
}


It fires a 1D stream of shots endlessly with a pattern. You probably want to fire only every few draws, so use a timer.

If you want a 2D pattern, you can use an array of firingPatterns, and call the function on each one.

Re: Thoughts about data control

PostPosted: Sun Apr 29, 2012 7:32 pm
by Bee-Ant
Random code before I sleep...

I was thinking of storing string securely, because as you can see, saving them through saveVars() still left the string readable.
So here I came up with encoding idea.
Code: Select all
char *Encode(char str[64])
{
    int i,char1,char2,char3,char4;
    char tmp1[5],*tmp2=malloc(256);
    for(i=0;i<strlen(str);i++)
    {
        char1=(int)str[i]-10;
        char2=(int)str[i]+rand(20)-10;
        char3=(int)str[i]+rand(20)-10;
        char4=(int)str[i]+rand(20)-10;
        sprintf(tmp1,"%s%s%s%s",&char1,&char2,&char3,&char4);
        strcat(tmp2,tmp1);
    }
    return tmp2;
}

char *Decode(char str[256])
{
    int i,char1;
    char tmp1[2],*tmp2=malloc(64);
    for(i=0;i<strlen(str)/4;i++)
    {
        char1=(int)str[i*4]+10;
        sprintf(tmp1,"%s",&char1);
        strcat(tmp2,tmp1);
    }
    return tmp2;
}

The usage as follows:
(considering you have global var called password that's stored in data group)
Code: Select all
//to save data
strcpy(data,Encode("BeeIsHandsome"));
saveVars("data.sav","data");

//to load data
loadVars("data.sav","data");
strcpy(PassText.text,Decode(password));

To check whether the code is correct or not, run this code on a Text actor or something:
Code: Select all
strcpy(Password,"BeeIsHandsome");
sprintf(text,"Original: %s\nEncoded: %s\nDecoded: %s",Password,Encode(Password),Decode(Encode(Password)));

The key to encode is just get the ASCII code for each letter, subtract by 20, and add 3 more letters randomly.
You can mess with the pattern by changing the subtraction or randomness of the additional letters.

Useful for secure data exchanging or storing. Might be useful to deceive CheatEngine user too :P

I guess that's all.
Night...



*EDIT: tested, working now

Re: Thoughts about data control

PostPosted: Sun Apr 29, 2012 9:34 pm
by SuperSonic
Dude, that's awsome! I really need to study this topic for other cool stuff like this :P

Re: Thoughts about data control

PostPosted: Mon Apr 30, 2012 8:54 am
by Bee-Ant
Here I am again...
I dunno whether someone already posted this or not, but here the function to convert decimal to binary and vice versa:
Code: Select all
char *DecToBin(int xx)
{
    int i,yy=xx,aa,bb,cc;
    char tmp1[2],tmp2[256],*tmp3=malloc(256);
    while(yy>=2)
    {
        aa=yy/2;
        bb=yy%2;
        sprintf(tmp1,"%i",bb);
        strcat(tmp2,tmp1);
        yy=aa;
    }
    if(yy<=1)
    {
        sprintf(tmp1,"%i",yy);
        strcat(tmp2,tmp1);
    }
    for(i=strlen(tmp2);i>0;i--)
    {
        cc=tmp2[i-1]-48;
        sprintf(tmp1,"%i",cc);
        strcat(tmp3,tmp1);
    }
    return tmp3;
}

int BinToDec(char str[256])
{
    int i,j,tmp,xx;
    double yy;
    for(i=0;i<strlen(str);i++)
    {
        j=strlen(str)-1-i;
        xx=(str[i]-48)*pow(2,j);
        yy+=xx;
    }
    tmp=yy;
    return tmp;
}


Usage:
Code: Select all
//Decimal to Binary
sprintf(text,"%s",DecToBin(89)); //you will get 1011001 output

//Binary to Decimal
sprintf(text,"%i",BinToDec("1011001")); //you will get 89 output


Please note that with the function above the binary is stored as string.
There are 2 ways If you want them as integer, first, simply use atoi():
Code: Select all
//Decimal to Binary
sprintf(text,"%i",atoi(DecToBin(89))); //you will get 1011001 output

Second, use this function instead:
Code: Select all
int DecToBin(int xx)
{
    int i,yy=xx,aa,bb,cc,tmp4;
    char tmp1[2],tmp2[256],tmp3[256];
    while(yy>=2)
    {
        aa=yy/2;
        bb=yy%2;
        sprintf(tmp1,"%i",bb);
        strcat(tmp2,tmp1);
        yy=aa;
    }
    if(yy<=1)
    {
        sprintf(tmp1,"%i",yy);
        strcat(tmp2,tmp1);
    }
    for(i=strlen(tmp2);i>0;i--)
    {
        cc=tmp2[i-1]-48;
        sprintf(tmp1,"%i",cc);
        strcat(tmp3,tmp1);
    }
    tmp4=atoi(tmp3);
    return tmp4;
}

Hopefully will be useful, enjoy :D