Ejemplo n.º 1
0
void hacerMovimiento(t_personaje *personaje) {
	if(!tieneRecursoActual(personaje)) {
		leerSiguienteRecurso(personaje);
		if(!personaje->nivel_actual) {
			return;
		}
	}

	log_info(logger, "Posicion del recurso: (%d, %d), mi posicion: (%d, %d).", personaje->recursoActual->pos->x, personaje->recursoActual->pos->y, personaje->pos->x, personaje->pos->y);

	char* recursoBloqueante = "";

	mover(personaje);
	if(samePoint(personaje->pos, personaje->recursoActual->pos)) {
		recursoBloqueante = pedirRecurso(personaje);
		log_debug(logger, string_equals_ignore_case(recursoBloqueante, "0") ? "Recurso otorgado" : "Bloqueado! Recurso no otorgado");
	}

	t_mensaje* requestMovimiento = mensaje_create(MOVER, pointAsString(*personaje->pos));
	socketSend(personaje->connNivel, requestMovimiento, handleConnectionError);
	pedirSiguienteTurno(personaje, recursoBloqueante);
}
void Foam::binaryOperationSearchableSurface::findNearest
(
    const pointField& samples,
    const scalarField& nearestDistSqr,
    List<pointIndexHit>& info
) const
{
    if(debug) {
        Info << "Foam::binaryOperationSearchableSurface::findNearest "
            << name() << " : "
            << samples.size() << " samples" << endl;
    }

    List<pointIndexHit> hitA;
    List<pointIndexHit> hitB;
    if(debug) {
        Info << "Doing A" << endl;
    }
    a().findNearest(samples,nearestDistSqr,hitA);
    if(debug) {
        Info << "Doing B" << endl;
    }
    b().findNearest(samples,nearestDistSqr,hitB);

    List<bool> inAA,inAB;
    List<bool> inBA,inBB;
    List<bool> same;

    insideA(hitB,inAB);
    insideB(hitA,inBA);
    insideB(hitB,inBB);
    insideA(hitA,inAA);
    samePoint(hitA,hitB,same);

    info.setSize(samples.size());

    forAll(info,i) {
        hitWhom hA=HITSA;
        hitWhom hB=HITSB;
        if(same[i]) {
            hA=BOTH;
            hB=BOTH;
        }
        bool validA=(hitA[i].hit() && this->decidePoint(hA,inAA[i],inBA[i]));
        bool validB=(hitB[i].hit() && this->decidePoint(hB,inAB[i],inBB[i]));
        if(!validA && !validB) {
            // WarningIn("Foam::binaryOperationSearchableSurface::findNearest")
            //     << "Neither hit " << hitA[i] << " nor " << hitB[i]
            //         << " near " << samples[i] << " valid" << endl
            //         << same[i] << " " << inAA[i] << " " << inBA[i]
            //         << " " << inAB[i] << " " << inBB[i] << endl
            //         << mag(hitA[i].rawPoint()-samples[i]) << " "
            //         << mag(hitB[i].rawPoint()-samples[i])
            //         << endl;
        } else if( validA && validB ) {
            if(same[i]) {
                info[i]=hitA[i];
            } else if(
                mag(samples[i]-hitA[i].rawPoint())
                <
                mag(samples[i]-hitB[i].rawPoint())
            ) {
                info[i]=hitA[i];
            } else {
                info[i]=hitB[i];
            }
        } else if( validA ) {
            info[i]=hitA[i];
        } else {
            info[i]=hitB[i];
        }
    }