Can someone explain TTP c-code?

  • Videogamer555
    17th Jan 2012 Member 0 Permalink
    Sorry that was a typo. It should have said "Can someone explain TPT c-code?"

    This looks so completely different than the Lua scripts I've been using to alter powder update functions. The c code is much different. So I need some help as to what the variables are in here. What's r, rx, ry, nb (and other such variables 1 and 2 letter variables seen in here)? What commands change the pressure? I need some help with modding here. And the above asked for info would really help me out.

    #include

    int update_BANG(UPDATE_FUNC_ARGS) {
    int r, rx, ry, nb;
    if(parts[i].tmp==0)
    {
    if(parts[i].temp>=673.0f)
    parts[i].tmp = 1;
    else
    for (rx=-1; rx<2; rx++)<br/> for (ry=-1; ry<2; ry++)<br/> if (x+rx>=0 && y+ry>0 && x+rx {
    r = pmap[y+ry][x+rx];
    if (!r)
    continue;
    if ((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM)
    {
    parts[i].tmp = 1;
    }
    else if ((r&0xFF)==PT_SPRK || (r&0xFF)==PT_LIGH)
    {
    parts[i].tmp = 1;
    }
    }

    }
    else if(parts[i].tmp==1)
    {
    int tempvalue = 2;
    flood_prop(x, y, offsetof(particle, tmp), &tempvalue, 0);
    }
    else if(parts[i].tmp==2)
    {
    parts[i].tmp = 3;
    }
    else if(parts[i].tmp>=3)
    {
    float otemp = parts[i].temp-275.13f;
    //Explode!!
    pv[y/CELL][x/CELL] += 0.5f;
    parts[i].tmp = 0;
    if(!(rand()%3))
    {
    if(!(rand()%2))
    {
    create_part(i, x, y, PT_FIRE);
    parts[i].temp = (MAX_TEMP/4)+otemp;
    }
    else
    {
    create_part(i, x, y, PT_SMKE);
    parts[i].temp = (MAX_TEMP/4)+otemp;
    }
    }
    else
    {
    if(!(rand()%15))
    {
    create_part(i, x, y, PT_BOMB);
    parts[i].tmp = 1;
    parts[i].life = 50;
    parts[i].temp = (MAX_TEMP/3)+otemp;
    parts[i].vx = rand()%20-10;
    parts[i].vy = rand()%20-10;
    }
    else
    {
    kill_part(i);
    }
    }
    return 1;
    }
    return 0;
    }
  • Neospector
    17th Jan 2012 Member 0 Permalink
    I would assume PT_BANG is the name of TNT, most likely. This is what creates the explosion.

    Some of the variables are simple. But this is actually somewhat complex, I assume to make it explode the way it does.
    However, I am guessing pv[y/CELL][x/CELL] += 0.5f; controls pressure. It seems fairly obvious, that the pressure in the X and Y cells are made += 0.5f, but someone correct me if I am wrong.
  • mniip
    17th Jan 2012 Developer 0 Permalink
    @Videogamer555 (View Post)
    read wiki :/
    there is an article called 'variables in source'
  • jacksonmj
    17th Jan 2012 Developer 0 Permalink
    In C, all variables must be declared before using them.int r, rx, ry, nb;
    int = integer. So r rx ry and nb are all integers.

    What they are used for depends on the rest of the code.

    In update functions, the convention is that rx and ry are distances from the particle currently being updated. They are used to loop through nearby coordinates to find adjacent particles. (Like xoff/yoff in this Lua script)

    r is usually a pmap value. If the pmap value is r, then r&0xFF is the type of the particle, and r>>8 is the index in the parts array.

    for (rx=-1; rx<2; rx++)
    for (ry=-1; ry<2; ry++)
    {
    r = pmap[y+ry][x+rx];
    if ((r&0xFF) && (rx || ry)) //if there's a particle there and rx or ry are non-zero
    {
    //Do stuff
    parts[r>>8].temp = 9001;
    }
    }


    nb isn't actually used for TNT, in some other update functions it stores the index of a new particle from create_part so that some properties of the new particle can be changed (see src/elements/bomb.c).


    pv is a 2D array storing the pressure values, see the wiki page mentioned by mniip.
  • Videogamer555
    17th Jan 2012 Member 0 Permalink
    So isn't saying parts[r>>8] the same as saying parts[i] (where i is already passed to the function and so doesn't need to be defined)? If so, why would anyone choose the longer way of doing it and define r and then set it equal to pmap[x][y] and then shift it 8 bits to the right, when they could much easier do it as parts[i]? Also just what data is stored in the pmap other than "type" data for the particle?
  • jacksonmj
    17th Jan 2012 Developer 0 Permalink
    @Videogamer555 (View Post)
    Yes, you would just use parts[i]. But usually r isn't pmap[y][x], it's one of the particles next to it.
    (That was missing from the code in my previous post, I have now edited it)

    pmap only stores the type and index of the particle in each location.