コード例 #1
0
ファイル: avatar.cpp プロジェクト: Mathias-Gartner/Sokorun
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
}
コード例 #2
0
ファイル: book.c プロジェクト: ageneau/scid
/*
 *	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;
}
コード例 #3
0
ファイル: avatar.cpp プロジェクト: Mathias-Gartner/Sokorun
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
    }
}
コード例 #4
0
ファイル: avatar.cpp プロジェクト: Mathias-Gartner/Sokorun
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
            }
        }
    }
}
コード例 #5
0
ファイル: book.c プロジェクト: ageneau/scid
/*
 *	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;
	}
}