bool AVATAR::AvatarOnField(POS pos) //Überprüft, ob der Avatar dieses Feld blockiert { if(death!=0) return 0; //Avatar bereits tot if(movement.moving==0 || movement.progress<=100-OccupiedLimit) //Avatar befindet sich am eigenen position-Feld { if(poscmp(pos,position)) //=gesuchte Position return 1; //ja } if(movement.moving!=0 && movement.progress>=OccupiedLimit && !movement.blocking/* siehe unten */) //Avatar befindet sich bereits auf nächstem Feld { if(poscmp(pos,game->getTargetFieldCoord(position,movement.richtung))) //nächstes Feld=gesuchte Position return 1; //ja } //Der Grund, warum oben im if movement.blocking steht: // Wenn der Avatar gegen ein nicht betretbares Feld gedrückt wird und dadurch blockiert, ist er auf genau 22%.(=WC=Wkgl=OccupiedLimit) // Wenn dieses Feld dadurch blockiert werden würde, könnte es von niemand anderen mehr betreten werden. Um das zu vermeiden wird der blocking-Wert eingebaut. // //Wann kann es vorkommen: // 07 <--- Hier ist die Kugel // 07 // 12 11 <--- Hier würde das Feld vom Avatar blockiert werden und die Kugel würde daher im Feld darüber stehenbleiben (und ebenfalls blockieren) // ^ 01 <--- In dieses Freie Feld sollte die Kugel kommen // | // Hier ist der Avatar, der gegen das Feld drückt in das die Kugel kommen wird return 0; //nein }
/* * Now the book searching functions. If there is less than * 512 bytes to search, the book is searched linearly. */ int linSB(FILE *f, long from, long to, char *p, char *s) { if( fseek(f,from,SEEK_SET)!=0 ) { return -1; } if(!feof(f)) fgets(s,80,f); /* skip to the first \n */ while(ftell(f)<=to && !feof(f)) { fgets(s,100,f); if( poscmp(p,s)==0 ) return 0; } return -1; }
void AVATAR::killOnField(POS pos) //tötet den Avatar, wenn er die übergebene Position blockiert { if(death!=0) return; //bereits tot bool kill=0; //Zwischenspeicher ob der Avatar getötet werden soll if(movement.moving==0 || movement.progress<=100-OccupiedLimit) //Avatar befindet sich am eigenen position-Feld { if(poscmp(pos,position)) { kill=1; } } if(movement.moving!=0 && movement.progress>=OccupiedLimit && !movement.blocking/* siehe Beschreibung in "AVATAR::AvatarOnField()" */) //Avatar befindet sich bereits auf nächstem Feld { if(poscmp(pos,game->getTargetFieldCoord(position,movement.richtung))) //Der Avatar bewegt sich auf dieses Feld zu { kill=1; } } if(kill) { int feld=game->getField(position); //Feldtyp herausfinden death=game->addFieldEffect(position,AVATARKILL,((movement.moving==0)?NONE:movement.richtung),WHITE,movement.progress); //Den Avatar zu Tode verurteilen game->addGameLogEvent(AVATARDEATH, NONE); //Ereignis berichten game->addGameLogEvent(GAMEOVER, NONE); //Ereignis berichten } }
void AVATAR::stopMovementTo(POS pos,int limit) //Wenn sich der Avatar gerade auf dieses Feld zubewegt: abprallen lassen { if(movement.moving==1 && death==0) { if(poscmp(pos,game->getTargetFieldCoord(position,movement.richtung))) //Der Avatar bewegt sich auf dieses Feld zu { if(movement.progress>=limit) { movement.moving=-1; //sofort abprallen game->addFieldEffect(position,COLLISION,movement.richtung,AVATARCOLLITIONCOLOR); }else if(movement.limit>limit) { movement.limit=limit; //Nach dem neuen Limit abprallen } } } }
/* * There is more than 512 bytes to search -> use binary search. */ int binSB(FILE *f, long from, long to, char *p, char *s) { long mid; if( to-from < 512 ) return( linSB(f,from,to,p,s) ); mid=(to+from)/2; if( fseek(f,mid,SEEK_SET)!=0 ) return -1; if(!feof(f)) fgets(s,80,f); /* skip to the first \n */ if(!feof(f)) fgets(s,100,f); switch(poscmp(p,s)) { case 0: return(0); case 1: return( binSB(f,mid,to,p,s) ); case -1: return( binSB(f,from,mid,p,s) ); default: return -1; } }