Detecting how many times certain tiles are present on board...

This part of code

if(strequals(#L,wolf__16-10.nw)){ this.uncut = 0; this.b = 0; this.everythingcut = 1; for(this.i=0;this.i<64*64;this.i++){ if(this.i>0&&this.i%64==0)this.b++; if(tiles[this.i%64,this.b]==0x1E8||tiles[this.i%64,this.b]==0x1E9||tiles[this.i%64,this.b]==0x1F8||tiles[this.i%64,this.b]==0x1F9))this.uncut += 1; } if(this.uncut>10)this.everythingcut = 0; }
part of:

[CODE]if(playerenters){
setshape 1,32,32;
}
if (playertouchsme) {
toweapons Sicle;
hide;
}
if(weaponfired){
freezeplayer .5;
setani sicle,sicle.png;

this.cutabletiles = {0x1E8,0x1E9,0x1F8,0x1F9};
this.cuttiles = {0x2A7,0x2A8,0x2B7,0x2B8};
this.targettiles = {0,playerx-2,playerx-1,playerx,playerx+1,playerx+2,playerx+3};
if(dir==0){
for(this.i=0;this.i<6;this.i++){
if(tiles[this.targettiles[1],playery+this.i]==0x1E8)tiles[this.targettiles[1],playery+this.i] = 0x2A7;
if(tiles[this.targettiles[1],playery+this.i]==0x1E9)tiles[this.targettiles[1],playery+this.i] = 0x2A8;
if(tiles[this.targettiles[1],playery+this.i]==0x1F8)tiles[this.targettiles[1],playery+this.i] = 0x2B7;
if(tiles[this.targettiles[1],playery+this.i]==0x1F9)tiles[this.targettiles[1],playery+this.i] = 0x2B8;

  if(tiles[this.targettiles[2],playery+this.i]==0x1E8)tiles[this.targettiles[2],playery+this.i] = 0x2A7;
  if(tiles[this.targettiles[2],playery+this.i]==0x1E9)tiles[this.targettiles[2],playery+this.i] = 0x2A8;
  if(tiles[this.targettiles[2],playery+this.i]==0x1F8)tiles[this.targettiles[2],playery+this.i] = 0x2B7;
  if(tiles[this.targettiles[2],playery+this.i]==0x1F9)tiles[this.targettiles[2],playery+this.i] = 0x2B8;

  if(this.i<4){
    if(tiles[this.targettiles[3],playery+this.i]==0x1E8)tiles[this.targettiles[3],playery+this.i] = 0x2A7;
    if(tiles[this.targettiles[3],playery+this.i]==0x1E9)tiles[this.targettiles[3],playery+this.i] = 0x2A8;
    if(tiles[this.targettiles[3],playery+this.i]==0x1F8)tiles[this.targettiles[3],playery+this.i] = 0x2B7;
    if(tiles[this.targettiles[3],playery+this.i]==0x1F9)tiles[this.targettiles[3],playery+this.i] = 0x2B8;

    if(tiles[this.targettiles[4],playery+this.i]==0x1E8)tiles[this.targettiles[4],playery+this.i] = 0x2A7;
    if(tiles[this.targettiles[4],playery+this.i]==0x1E9)tiles[this.targettiles[4],playery+this.i] = 0x2A8;
    if(tiles[this.targettiles[4],playery+this.i]==0x1F8)tiles[this.targettiles[4],playery+this.i] = 0x2B7;
    if(tiles[this.targettiles[4],playery+this.i]==0x1F9)tiles[this.targettiles[4],playery+this.i] = 0x2B8;
  }

  if(tiles[this.targettiles[5],playery+this.i]==0x1E8)tiles[this.targettiles[5],playery+this.i] = 0x2A7;
  if(tiles[this.targettiles[5],playery+this.i]==0x1E9)tiles[this.targettiles[5],playery+this.i] = 0x2A8;
  if(tiles[this.targettiles[5],playery+this.i]==0x1F8)tiles[this.targettiles[5],playery+this.i] = 0x2B7;
  if(tiles[this.targettiles[5],playery+this.i]==0x1F9)tiles[this.targettiles[5],playery+this.i] = 0x2B8;

  if(tiles[this.targettiles[6],playery+this.i]==0x1E8)tiles[this.targettiles[6],playery+this.i] = 0x2A7;
  if(tiles[this.targettiles[6],playery+this.i]==0x1E9)tiles[this.targettiles[6],playery+this.i] = 0x2A8;
  if(tiles[this.targettiles[6],playery+this.i]==0x1F8)tiles[this.targettiles[6],playery+this.i] = 0x2B7;
  if(tiles[this.targettiles[6],playery+this.i]==0x1F9)tiles[this.targettiles[6],playery+this.i] = 0x2B8;
}

}
if(dir==1){
for(this.i=-2;this.i<6;this.i++){
if(tiles[this.targettiles[1],playery+this.i]==0x1E8)tiles[this.targettiles[1],playery+this.i] = 0x2A7;
if(tiles[this.targettiles[1],playery+this.i]==0x1E9)tiles[this.targettiles[1],playery+this.i] = 0x2A8;
if(tiles[this.targettiles[1],playery+this.i]==0x1F8)tiles[this.targettiles[1],playery+this.i] = 0x2B7;
if(tiles[this.targettiles[1],playery+this.i]==0x1F9)tiles[this.targettiles[1],playery+this.i] = 0x2B8;

  if(tiles[this.targettiles[2],playery+this.i]==0x1E8)tiles[this.targettiles[2],playery+this.i] = 0x2A7;
  if(tiles[this.targettiles[2],playery+this.i]==0x1E9)tiles[this.targettiles[2],playery+this.i] = 0x2A8;
  if(tiles[this.targettiles[2],playery+this.i]==0x1F8)tiles[this.targettiles[2],playery+this.i] = 0x2B7;
  if(tiles[this.targettiles[2],playery+this.i]==0x1F9)tiles[this.targettiles[2],playery+this.i] = 0x2B8;

  if(this.i in |4,6|){}
  else{
    if(tiles[this.targettiles[3],playery+this.i]==0x1E8)tiles[this.targettiles[3],playery+this.i] = 0x2A7;
    if(tiles[this.targettiles[3],playery+this.i]==0x1E9)tiles[this.targettiles[3],playery+this.i] = 0x2A8;
    if(tiles[this.targettiles[3],playery+this.i]==0x1F8)tiles[this.targettiles[3],playery+this.i] = 0x2B7;
    if(tiles[this.targettiles[3],playery+this.i]==0x1F9)tiles[this.targettiles[3],playery+this.i] = 0x2B8;

    if(tiles[this.targettiles[4],playery+this.i]==0x1E8)tiles[this.targettiles[4],playery+this.i] = 0x2A7;
    if(tiles[this.targettiles[4],playery+this.i]==0x1E9)tiles[this.targettiles[4],playery+this.i] = 0x2A8;
    if(tiles[this.targettiles[4],playery+this.i]==0x1F8)tiles[this.targettiles[4],playery+this.i] = 0x2B7;
    if(tiles[this.targettiles[4],playery+this.i]==0x1F9)tiles[this.targettiles[4],playery+this.i] = 0x2B8;
  }
}

}
if(dir==2){
for(this.i=0;this.i<6;this.i++){
if(tiles[this.targettiles[1],playery+this.i]==0x1E8)tiles[this.targettiles[1],playery+this.i] = 0x2A7;
if(tiles[this.targettiles[1],playery+this.i]==0x1E9)tiles[this.targettiles[1],playery+this.i] = 0x2A8;
if(tiles[this.targettiles[1],playery+this.i]==0x1F8)tiles[this.targettiles[1],playery+this.i] = 0x2B7;
if(tiles[this.targettiles[1],playery+this.i]==0x1F9)tiles[this.targettiles[1],playery+this.i] = 0x2B8;

  if(tiles[this.targettiles[2],playery+this.i]==0x1E8)tiles[this.targettiles[2],playery+this.i] = 0x2A7;
  if(tiles[this.targettiles[2],playery+this.i]==0x1E9)tiles[this.targettiles[2],playery+this.i] = 0x2A8;
  if(tiles[this.targettiles[2],playery+this.i]==0x1F8)tiles[this.targettiles[2],playery+this.i] = 0x2B7;
  if(tiles[this.targettiles[2],playery+this.i]==0x1F9)tiles[this.targettiles[2],playery+this.i] = 0x2B8;

  if(this.i>2){
    if(tiles[this.targettiles[3],playery+this.i]==0x1E8)tiles[this.targettiles[3],playery+this.i] = 0x2A7;
    if(tiles[this.targettiles[3],playery+this.i]==0x1E9)tiles[this.targettiles[3],playery+this.i] = 0x2A8;
    if(tiles[this.targettiles[3],playery+this.i]==0x1F8)tiles[this.targettiles[3],playery+this.i] = 0x2B7;
    if(tiles[this.targettiles[3],playery+this.i]==0x1F9)tiles[this.targettiles[3],playery+this.i] = 0x2B8;

    if(tiles[this.targettiles[4],playery+this.i]==0x1E8)tiles[this.targettiles[4],playery+this.i] = 0x2A7;
    if(tiles[this.targettiles[4],playery+this.i]==0x1E9)tiles[this.targettiles[4],playery+this.i] = 0x2A8;
    if(tiles[this.targettiles[4],playery+this.i]==0x1F8)tiles[this.targettiles[4],playery+this.i] = 0x2B7;
    if(tiles[this.targettiles[4],playery+this.i]==0x1F9)tiles[this.targettiles[4],playery+this.i] = 0x2B8;
  }

  if(tiles[this.targettiles[5],playery+this.i]==0x1E8)tiles[this.targettiles[5],playery+this.i] = 0x2A7;
  if(tiles[this.targettiles[5],playery+this.i]==0x1E9)tiles[this.targettiles[5],playery+this.i] = 0x2A8;
  if(tiles[this.targettiles[5],playery+this.i]==0x1F8)tiles[this.targettiles[5],playery+this.i] = 0x2B7;
  if(tiles[this.targettiles[5],playery+this.i]==0x1F9)tiles[this.targettiles[5],playery+this.i] = 0x2B8;

  if(tiles[this.targettiles[6],playery+this.i]==0x1E8)tiles[this.targettiles[6],playery+this.i] = 0x2A7;
  if(tiles[this.targettiles[6],playery+this.i]==0x1E9)tiles[this.targettiles[6],playery+this.i] = 0x2A8;
  if(tiles[this.targettiles[6],playery+this.i]==0x1F8)tiles[this.targettiles[6],playery+this.i] = 0x2B7;
  if(tiles[this.targettiles[6],playery+this.i]==0x1F9)tiles[this.targettiles[6],playery+this.i] = 0x2B8;
}

}
if(dir==3){
for(this.i=-2;this.i<5;this.i++){
if(this.i in |4,6|){}
else{
if(tiles[this.targettiles[3],playery+this.i]==0x1E8)tiles[this.targettiles[3],playery+this.i] = 0x2A7;
if(tiles[this.targettiles[3],playery+this.i]==0x1E9)tiles[this.targettiles[3],playery+this.i] = 0x2A8;
if(tiles[this.targettiles[3],playery+this.i]==0x1F8)tiles[this.targettiles[3],playery+this.i] = 0x2B7;
if(tiles[this.targettiles[3],playery+this.i]==0x1F9)tiles[this.targettiles[3],playery+this.i] = 0x2B8;

    if(tiles[this.targettiles[4],playery+this.i]==0x1E8)tiles[this.targettiles[4],playery+this.i] = 0x2A7;
    if(tiles[this.targettiles[4],playery+this.i]==0x1E9)tiles[this.targettiles[4],playery+this.i] = 0x2A8;
    if(tiles[this.targettiles[4],playery+this.i]==0x1F8)tiles[this.targettiles[4],playery+this.i] = 0x2B7;
    if(tiles[this.targettiles[4],playery+this.i]==0x1F9)tiles[this.targettiles[4],playery+this.i] = 0x2B8;
  }

  if(tiles[this.targettiles[5],playery+this.i]==0x1E8)tiles[this.targettiles[5],playery+this.i] = 0x2A7;
  if(tiles[this.targettiles[5],playery+this.i]==0x1E9)tiles[this.targettiles[5],playery+this.i] = 0x2A8;
  if(tiles[this.targettiles[5],playery+this.i]==0x1F8)tiles[this.targettiles[5],playery+this.i] = 0x2B7;
  if(tiles[this.targettiles[5],playery+this.i]==0x1F9)tiles[this.targettiles[5],playery+this.i] = 0x2B8;

  if(tiles[this.targettiles[6],playery+this.i]==0x1E8)tiles[this.targettiles[6],playery+this.i] = 0x2A7;
  if(tiles[this.targettiles[6],playery+this.i]==0x1E9)tiles[this.targettiles[6],playery+this.i] = 0x2A8;
  if(tiles[this.targettiles[6],playery+this.i]==0x1F8)tiles[this.targettiles[6],playery+this.i] = 0x2B7;
  if(tiles[this.targettiles[6],playery+this.i]==0x1F9)tiles[this.targettiles[6],playery+this.i] = 0x2B8;
}

}

if(strequals(#L,wolf__16-10.nw)){
this.uncut = 0;
this.b = 0;
this.everythingcut = 1;
for(this.i=0;this.i<6464;this.i++){
if(this.i>0&&this.i%64==0)this.b++;
if(tiles[this.i%64,this.b]==0x1E8||tiles[this.i%64,this.b]==0x1E9||tiles[this.i%64,this.b]==0x1F8||tiles[this.i%64,this.b]==0x1F9))this.uncut += 1;
}
if(this.uncut>10)this.everythingcut = 0;
}
sleep .6;
setani idle,;
updateboard playerx-2,playery-3,5
16,7*16;
}[/CODE]

this.uncut always equals 0, while the specified tiles are present in the board…
If I use this syntax:

if(tiles[this.i%64,this.b]==(0x1E8||0x1E9||0x1F8||0x1F9))this.uncut += 1;

this.uncut is always equal to 31, even when everything is cut…

I don’t get it, shouldn’t it be the sum of “uncut” tiles?

[QUOTE=2ndwolf;98275]

    for(this.i=0;this.i<64*64;this.i++){
      if(this.i>0&&this.i%64==0)this.b++;
      if(tiles[this.i%64,this.b]==0x1E8||tiles[this.i%64,this.b]==0x1E9||tiles[this.i%64,this.b]==0x1F8||tiles[this.i%64,this.b]==0x1F9))this.uncut += 1;
    }

[/QUOTE]
You can’t do this many loops per frame. So you’d do something like this:

    for(this.i=0;this.i<64*64;this.i++){
      if(this.i>0&&this.i%64==0)this.b++;
      if(tiles[this.i%64,this.b]==0x1E8||tiles[this.i%64,this.b]==0x1E9||tiles[this.i%64,this.b]==0x1F8||tiles[this.i%64,this.b]==0x1F9))this.uncut += 1;
      if (this.i%1024 == 0)sleep 0.05;
    }

So you’ll do a 0.05 second pause after every 1024 iterations.

That’s nice but it still bugs

Maybe if your code wasn’t such a monster, i’d be able to help you. If you start commenting your code, you’ll find it’s alot easier for you to debug and for others to follow.

I don’t know, to me it’s pretty straightforward…
Maybe if you saw it work you’d think that too, couldn’t use for in for cuz it lags and couldn’t use vecx and vecy cuz it wasn’t really what I needed.
So it’s pretty much the same thing over repeated 4 times (once for each tile to replace for their own counterpart), that repeated 6 times for each of the x coordinates (the for loop is for the y coordinates), that repeated 4 times (once for each direction).

Followed by that buggy for loop, then update tiles.

The tiles to replace are the four tall grass tiles to the four cut grass tiles.

I know it could be way shorter with a for in a for in another for, but it freezes graal for me.

Edit:
Here you go, tricxta. Surprisingly, this one doesn’t lag on graal.
Edit edit: I added the leaps, I thought they might be annoying, but actually they’re a nice touch.

[CODE]if(playerenters){
setshape 1,32,32;
}
if (playertouchsme) {
toweapons Sicle;
hide;
}
if(weaponfired){
this.b = 0;
freezeplayer .5;
setani sicle,sicle.png;
//loop through the x coordinates and…
for(this.x=-2;this.x<6;this.x++){
//loop through the y coordinates
for(this.i=-2;this.i<6;this.i++){
//if the tiles are behind the player, continue
if (dir==0&&this.i>2){continue;}
if (dir==1&&this.x>1){continue;}
if (dir==2&&this.i<0){continue;}
if (dir==3&&this.x<0){continue;}
//replace cut tiles
if(tiles[playerx+this.x,playery+this.i]==0x1E8){
tiles[playerx+this.x,playery+this.i] = 0x2A7;
this.b++;
}
if(tiles[playerx+this.x,playery+this.i]==0x1E9){
tiles[playerx+this.x,playery+this.i] = 0x2A8;
this.b++;
}
if(tiles[playerx+this.x,playery+this.i]==0x1F8){
tiles[playerx+this.x,playery+this.i] = 0x2B7;
this.b++;
}
if(tiles[playerx+this.x,playery+this.i]==0x1F9){
tiles[playerx+this.x,playery+this.i] = 0x2B8;
this.b++;
}
//if 4 tiles were cut, put a leap.
if(this.b%4==3)putleaps 0,playerx+this.x,playery+this.y;
}
}

//check how many tiles are uncut
if(strequals(#L,wolf__16-10.nw)){
this.uncut = 0;
this.b = 0;
this.everythingcut = 1;
for(this.i=0;this.i<6464;this.i++){
if(this.i>0&&this.i%64==0)this.b++;
if(tiles[this.i%64,this.b]==(0x1E8||0x1E9||0x1F8||0x1F9))this.uncut += 1;
if (this.i%1024 == 0)sleep 0.05;
}
//if most is uncut, everythingcut is false
if(this.uncut>10)this.everythingcut = 0;
}
sleep .6;
setani idle,;
updateboard playerx-2,playery-3,5
16,7*16;
} [/CODE]

Here you are, please pay note to what I did so I don’t see you making the same errors again.

if(playerenters){
  setshape 1,32,32;
  this.cutabletiles = {0x1A4,0x1A5,0x1B4,0x1B5};//tiles we can cut
  this.cutDimensions = {2,2};//size of the area we're allowed to cut, width:2, height:2
  this.cutTiles =     {0x2A7,0x2A8,0x2B7,0x2B8};//tiles that've been cut

if (playertouchsme){
  toweapons Sicle;
  hide;
}
if(weaponfired){
  freezeplayer .5;
  setani sicle,sicle.png;

  this.targetC = {int(playerx+1)+vecx(playerdir)*2,int(playery+1)+vecy(playerdir)*2};//look where to focus
  this.canCut = 0;

  for (this.i = 0; this.i <  arraylen(this.cutabletiles); this.i++)//look through the cutable array and see if it matches the tiles at targetC[0],targetC[1]
    this.canCut += (tiles[this.targetC[0]+(this.i%this.cutDimensions[0]),this.targetC[1]+int(this.i/this.cutDimensions[0])] == this.cutabletiles[this.i]);

  //if the arrays match we're allowed to cut
  if (this.canCut == (this.cutDimensions[0]*this.cutDimensions[1])){
    putleaps 0,this.targetC[0],this.targetC[1];
    for (this.i = 0; this.i < 4; this.i++)//replace tiles with the cutTiles array
      tiles[this.targetC[0]+(this.i%this.cutDimensions[0]),this.targetC[1]+int(this.i/this.cutDimensions[0])] = this.cutTiles[this.i];
    updateboard this.targetC[0],this.targetC[1],this.cutDimensions[0],this.cutDimensions[1];
  }
}

I’m alright with the cutting behavior, what I need is something that would detect if most of the grass was cut in a particular level, it’s a condition to fulfill as part of a fetch quest I’m adding to Armonston.

(btw I prefer my shortened version :wink: but thanks)

if (strequals(#L,whatever)){
  this.tilesLeft = 0;
  for (this.i = 0; this.i < 4096; this.i++){
    this.tilesLeft += (tiles[(this.i%64),int(this.i/64)] in this.cutabletiles);
    if (this.i%1000 == 0)sleep 0.05;
  }
  if (this.tilesLeft > 0){
    setplayerprop #c,well dayum! I missed a spot!;
  }
}

Simple enough, learn to use “in” in collaboration with arrays.

Works! I still don’t get why mine didn’t but wtv it works!:awesome:

Just practice and try spot repetition in your code and jump on it as to avoid monsters like what you posted in this thread.