Пример #1
0
void dibujar() {

	if (desactivarGUI) {
		return;
	}
	log_trace(logFile, "Dibujando...");
	pthread_mutex_lock(mutexDibujables);

	t_list* tempI;

	tempI = list_create();

	list_add_all(tempI, listaRecursos);
	list_add_all(tempI, listaPersonajes);
	list_add_all(tempI, listaEnemigos);

	if (nivel_gui_dibujar(tempI, configObj->nombre) == -1) {
		log_info(logFile, "No se puedo dibujar");
		//      EXIT_FAILURE;
	} else {
		log_trace(logFile, "Dibujado...");
	}

	pthread_mutex_unlock(mutexDibujables);

}
void dibujarPantalla(t_list* personajes, t_list* recursos) {
	borrarTodo();

	list_iterate(personajes, crearGuiPersonajes);
	list_iterate(recursos, crearGuiRecursos);

	nivel_gui_dibujar(listaItems);
}
Пример #3
0
void moverEnemigoEnDireccion(t_enemigo * enemigo, char * orientacion1, int orientacion2){
	/*//TODO no estaría esquivando la caja

	if(orientacion1 == horizontal)
		enemigo->posicion->posX = enemigo->posicion->posX + orientacion2;
	else if(orientacion1 == vertical)
		enemigo->posicion->posY = enemigo->posicion->posY + orientacion2;
	*/

	if(orientacion1 == horizontal){
		if(hayCajaOExcedeLimite(enemigo->posicion->posX + orientacion2, enemigo->posicion->posY)){
			enemigo->cantTurnosEnL = -1;
			enemigo->posicion->posX = enemigo->posicion->posX + (orientacion2 * -1);
			pthread_mutex_lock(&mx_lista_items);
			MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
			pthread_mutex_unlock(&mx_lista_items);

		}else{
			enemigo->posicion->posX = enemigo->posicion->posX + orientacion2;
			pthread_mutex_lock(&mx_lista_items);
			MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
			pthread_mutex_unlock(&mx_lista_items);

		}
	}else if(orientacion1 == vertical){
		if(hayCajaOExcedeLimite(enemigo->posicion->posX, enemigo->posicion->posY + orientacion2)){
			enemigo->cantTurnosEnL = -1;
			enemigo->posicion->posY = enemigo->posicion->posY + (orientacion2 * -1);
			pthread_mutex_lock(&mx_lista_items);
			MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
			pthread_mutex_unlock(&mx_lista_items);

		}else{
			enemigo->posicion->posY = enemigo->posicion->posY + orientacion2;
			pthread_mutex_lock(&mx_lista_items);
			MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
			pthread_mutex_unlock(&mx_lista_items);

		}
	}

	if(graficar)
		nivel_gui_dibujar(items,nombre);


	if(IMPRIMIR_INFO_ENEMIGO){
		pthread_mutex_lock(&mutex_log);
		log_info(logger,"Posicion del enemigo. PosX: %d, PosY: %d ", enemigo->posicion->posX, enemigo->posicion->posY);
		pthread_mutex_unlock(&mutex_log);
	}

}
int verificar_Posicion(t_datosParaPedirInstancia *datos, t_list *listaDeCajas)
{
	char *recurso = malloc(strlen(datos->recurso) + 1);
	strcpy(recurso,datos->recurso);

	//busca en la lista de las cajas, la struct con el mismo recurso, para poder ver la posX y la posY

	bool es_Misma_Caja(t_datosCaja *ptr)
		{
			return strcmp(ptr->caja_letra, recurso) == 0;
		}

	t_datosCaja *datosCaja = list_remove_by_condition(listaDeCajas, (void *) es_Misma_Caja);

	//se fija si las posX y posY son iguales, tambien se fija si hay suficientes instancias
	if((datosCaja->caja_posx == datos->posX) && (datosCaja->caja_posy == datos->posY) && (datosCaja->caja_instancias > 0))
	{
		datosCaja->caja_instancias--; //TODO
		char letra = datosCaja->caja_letra[0];


		restarRecurso(ListaItems, letra); //parte grafica

		nivel_gui_dibujar(ListaItems);
		list_add(listaDeCajas, datosCaja);


		bool es_Mismo_Recurso(t_recursosDisponibles *ptr)
				{
					return strcmp(ptr->recurso_letra, recurso) == 0;
				}

	//edito la lista de recursos disponibles
	t_recursosDisponibles *recursoDisponible = list_remove_by_condition(listaDeRecursosDisponibles, (void *) es_Mismo_Recurso);

	recursoDisponible->recurso_instancias--;

	list_add(listaDeRecursosDisponibles, recursoDisponible);

		return YES;

	}else
Пример #5
0
void agregarRecursosLista(ITEM_NIVEL *ListaItems,t_queue *cola)
{
        t_log *log = log_create(logName,"Nivel",FALSE,LOG_LEVEL_INFO);
        recursoStruct *unRecurso;
        cajaStruct *unaCaja;

        bool condicionAgregar(void* caja) {
                return (((cajaStruct*) caja)->simbolo == unRecurso->recurso);
        }

        while (!queue_is_empty(cola))
        {
                unRecurso = queue_pop(cola);

                unaCaja = list_find(nivel.cajas,condicionAgregar);
                unaCaja->instancias++;
                sumarRecurso(ListaItems,unaCaja->simbolo);
                nivel_gui_dibujar(ListaItems);
        }
        log_destroy(log);
}
Пример #6
0
t_enemigo * crearseASiMismo(int id){
	bool igualACeroCero;
	t_enemigo * enemigo;
	while(1){
		enemigo = enemigo_create(id);
		igualACeroCero = (enemigo->posicion->posX == 0 && enemigo->posicion->posY == 0);
		if(!igualACeroCero)
			break;
	}

	list_add(listaDeEnemigos, enemigo);
	pthread_mutex_lock(&mx_lista_items);
	CrearEnemigo(items,enemigo->id, enemigo->posicion->posX, enemigo->posicion->posY); //cuidado con esto, el enemigo deberia tener id individuales
	pthread_mutex_unlock(&mx_lista_items);

	if(graficar){
		pthread_mutex_lock(&mx_lista_items);
		nivel_gui_dibujar(items,nombre);
		pthread_mutex_unlock(&mx_lista_items);
	}

	return enemigo;
}
Пример #7
0
int32_t eliminarRecurso(ITEM_NIVEL *ListaItems,char c)
{
        cajaStruct *unRecurso;

        bool condicionRecurso(void* recurso) {
                        return (((cajaStruct*) recurso)->simbolo == c);
        }

        unRecurso = (cajaStruct *) list_find(nivel.cajas,condicionRecurso);

        if (unRecurso != NULL) {
                if(unRecurso->instancias == 0)
                        return 1;
                unRecurso->instancias--;
        }
        else {
                perror("recurso invalido");
                return -1;
        }

        restarRecurso(ListaItems,c);
        nivel_gui_dibujar(ListaItems);
        return 0;
}
Пример #8
0
void iniciar_gui(t_nivel* nivel){
	int rows, cols;
	nivel_gui_inicializar();
	nivel_gui_get_area_nivel(&rows, &cols);
	nivel_gui_dibujar(nivel->lista_items);
}
Пример #9
0
int main(int argc, char* argv[]) {
    // Lo puse t0d0 en el llamado de abajo, no se porque y si se puede capturar 2 veces la señal como estaba hecho.
    // signal(SIGINT, notificarPersonajes);

    pthread_mutex_init(&semNiv, NULL);

    logger = logInit(argv, argv[1]);

    // Capturamos sigint y avisamos a los personajes para que cierren y cerramos el nivel.
    signal(SIGINT, cerrarForzado);

    t_config *configNivel;
    char** arrCaja;
    char* nom_nivel;
    char* ip_orq;
    char* port_orq;
    char* dir_orq;
    char ip[16];
    int puerto;

    //--Creamos el config
    configNivel = config_try_create(
                      //"nivel1.config" //Modo Debug
                      argv[1], "Nombre,orquestador,TiempoChequeoDeadlock,Recovery,ip,puerto,Caja1");

    ITEM_NIVEL *ListaItems = NULL;

    //--Creamos cada caja de recursos
    char* cajaAux;
    cajaAux = malloc(sizeof(char) * 6);
    sprintf(cajaAux, "Caja1");

    //--Inicializa la lista con los personajes y sus recursos
    personajes = list_create();
    personaje_t pjAux;

    int t = 1;
    int cols = 0;
    int rows = 0;
    int posXCaja = 0;
    int posYCaja = 0;
    nivel_gui_inicializar();
    // Conseguimos el area del nivel
    char state = nivel_gui_get_area_nivel(&cols, &rows);
    // Validamos que no haya habido error
    if (state != EXIT_SUCCESS) {
        cerrarNivel("Error al intentar conseguir el area del nivel (GUI).");
        exit(EXIT_FAILURE);
    }
    char* messageLimitErr;
    messageLimitErr = malloc(sizeof(char) * 100);

    //--Mientras pueda levantar el array
    while ((arrCaja = config_try_get_array_value(configNivel, cajaAux)) != NULL ) {
        posXCaja = atoi(arrCaja[3]);
        posYCaja = atoi(arrCaja[4]);
        // Validamos que la caja a crear esté dentro de los valores posibles del mapa
        if (posXCaja > rows || posYCaja > cols || posXCaja < 1 || posYCaja < 1) {
            sprintf(messageLimitErr, "La caja %c excede los limites de la pantalla. (%d,%d) - (%d,%d)", arrCaja[1][0], posXCaja, posYCaja, rows, cols);
            cerrarNivel(messageLimitErr);
            exit(EXIT_FAILURE);
        }
        // Si pasó la validacion, la creamos.
        CrearCaja(&ListaItems, arrCaja[1][0], atoi(arrCaja[3]), atoi(arrCaja[4]), atoi(arrCaja[2]));
        //--Rearma el cajaAux para la iteracion
        sprintf(cajaAux, "Caja%d", ++t);
    }

    free(cajaAux);

    //--Boludeces de los sockets
    message_t message;
    fd_set master, temp;
    struct sockaddr_in myAddress;
    struct sockaddr_in remoteAddress;
    int maxSock;
    int sockListener;
    int sockOrq;

    //--Saludo al orquestador

    //--Obetenemos el string del nombre y dirección del orquestador
    nom_nivel = config_get_string_value(configNivel, "Nombre");
    dir_orq = config_get_string_value(configNivel, "orquestador");
    puerto = config_get_int_value(configNivel, "puerto");
    memcpy(ip, config_get_string_value(configNivel, "ip"), 16);
    // Conseguimos el tiempo de espera de chequeo
    int tiempoChequeo = config_get_int_value(configNivel, "TiempoChequeoDeadlock");

    ip_orq = strtok(dir_orq, ":"); 	//--Separar ip
    port_orq = strtok(NULL, ":");	//--Separar puerto

    // Crear un socket:
    struct sockaddr_in socketInfo;
    if ((sockOrq = socket(AF_INET, SOCK_STREAM, 0)) != 0) {

        socketInfo.sin_family = AF_INET;
        socketInfo.sin_addr.s_addr = inet_addr(ip_orq);
        socketInfo.sin_port = htons(atoi(port_orq));

        // Conectar el socket con la direccion 'socketInfo'.
        if (connect(sockOrq, (struct sockaddr*) &socketInfo, sizeof(socketInfo)) == -1) {
            perror("Connect");
            exit(EXIT_FAILURE);
        }

        log_info(logger, "Conexión con orquestador.");

        orq_t orqMsj;
        orqMsj.type = NIVEL;
        orqMsj.detail = SALUDO;
        strcpy(orqMsj.name, nom_nivel);

        //memcpy(orqMsj.ip, &localhost->sin_addr.s_addr, 16);
        strcpy(orqMsj.ip, ip);
        orqMsj.port = puerto;

        //--Envía el "Saludo" para ser agregado
        if (send(sockOrq, &orqMsj, sizeof(orq_t), 0) == -1) {
            perror("Saludo");
            exit(EXIT_FAILURE);
        }
    }

    // Definimos los threads
    pthread_t thr_interbloqueos;
    paramInterbloqueo_t parametros;
    parametros.numSock = sockOrq;
    parametros.tiempoChequeo = tiempoChequeo;
    parametros.recovery = config_get_int_value(configNivel, "Recovery");

    // y los lanzamos
    if (pthread_create(&thr_interbloqueos, NULL, (void*) detectInterbloqueos, (void *) &parametros)) {
        log_error(logger, strerror(errno));
        exit(EXIT_FAILURE);
    }

    int maxRows, maxCols;
    int posX, posY;
    int posItemY, posItemX;
    int i;

    nivel_gui_get_area_nivel(&maxRows, &maxCols);

    nivel_gui_dibujar(ListaItems, nom_nivel);

    iniSocks(&master, &temp, &myAddress, remoteAddress, &maxSock, &sockListener, puerto, logger);
    while (1) {
        //--Gestiona un cliente ya conectado
        i = getSockChanged(&master, &temp, &maxSock, sockListener, &remoteAddress, &message, sizeof(message_t), logger);
        if (i != -1) {

            pthread_mutex_lock(&semNiv);

            int contPj;
            int contRec;
            char *auxRec;
            personaje_t *tempAux;
            //--Recibe mensaje y define comportamiento según el tipo
            switch (message.type) {
            case SALUDO:
                //--Agregamos personaje a la lista de items y a la de personajes/recursos
                CrearPersonaje(&ListaItems, i, message.name, INIX, INIY);
                pjAux.numSock = i;
                pjAux.chirimbolo = message.name;
                pjAux.blocked = false;
                pjAux.recursos = list_create();
                list_add_new(personajes, &pjAux, sizeof(personaje_t));

                //--Armamos la estrucura para enviar la posición inicial
                message.type = SALUDO;
                message.detail = INIX;
                message.detail2 = INIY;

                log_info(logger, "Se agregó el personaje %c con el socket %d", message.name, i);

                if (send(i, &message, sizeof(message), 0) == -1)
                    perror("Respuesta posición inicial");
                break;
            case POSICION:
                //--Obtiene posición del item pedido
                getPosRec(ListaItems, message.detail, &posX, &posY);

                //--Armamos la estrucura para enviar la posición del recurso pedido
                message.type = POSICION;
                message.detail = posX;
                message.detail2 = posY;

                if (send(i, &message, sizeof(message), 0) == -1)
                    perror("Respuesta posición recurso");
                break;
            case MOVIMIENTO:
                //--Devuelve las posiciones X e Y del item
                if (getPosPer(ListaItems, i, &posX, &posY) == -1)
                    perror("GetPosItem");

                switch (message.detail) {

                case ARRIBA:
                    if (posY > 1)
                        posY--;
                    break;

                case ABAJO:
                    if (posY < maxRows)
                        posY++;
                    break;

                case IZQUIERDA:
                    if (posX > 1)
                        posX--;
                    break;
                case DERECHA:
                    if (posX < maxCols)
                        posX++;
                    break;
                }

                //--Define confirmación y la devuelve
                message.type = MOVIMIENTO;
                message.detail2 = message.detail;
                message.detail = 1;
                if (send(i, &message, sizeof(message), 0) == -1)
                    perror("Confirmacion");

                //--Desbloquear en caso de que esté bloqueado
                for (contPj = 0; contPj < list_size(personajes); contPj++) {
                    tempAux = list_get(personajes, contPj);

                    if (tempAux->numSock == i && tempAux->blocked)
                        tempAux->blocked = false;
                }

                MoverPersonaje(ListaItems, i, posX, posY);
                break;
            case PEDIDO:
                //--Obtiene posición del item pedido y del personaje
                getPosRec(ListaItems, message.detail, &posItemX, &posItemY);
                getPosPer(ListaItems, i, &posX, &posY);

                //--Valida si llegó al recurso
                if ((posItemX == posX) && (posItemY == posY)) {

                    //-- Siempre le tiene que agregar a la lista de recursos, este o no bloqueado
                    //--Agrega el recurso a la lista de recursos del personaje
                    int contPj;
                    personaje_t* tempAux;
                    for (contPj = 0; contPj < list_size(personajes); contPj++) {
                        tempAux = list_get(personajes, contPj);

                        if (tempAux->numSock == i) {
                            list_add_new(tempAux->recursos, &(message.detail), sizeof(message.detail));
                            break;
                        }
                    }

                    //--Resta uno a la cantidad del item
                    int result = restarQuantityRec(ListaItems, message.detail);

                    if (result >= 0) {

                        log_info(logger, "A %d se le da el recurso %c", i, message.detail);

                        //--Si pudo restar la cantidad
                        tempAux->blocked = false;
                        //--Define confirmación y la devuelve
                        message.detail = 1;
                        if (send(i, &message, sizeof(message), 0) == -1)
                            perror("Confirmacion");

                    } else {
                        //--Si el recurso ya no tiene instacias
                        tempAux->blocked = true;

                        log_info(logger, "A %d se le niega el recurso %c", i, message.detail);
                        //--Define rechazo y lo devuelve
                        message.detail = 0;
                        if (send(i, &message, sizeof(message), 0) == -1)
                            perror("Confirmacion");
                    }
                } else {
                    log_error(logger, "Posicion erronea al pedir recurso");
                    exit(EXIT_FAILURE);
                }

                break;
            case SALIR:
                for (contPj = 0; contPj < list_size(personajes); contPj++) {
                    tempAux = list_get(personajes, contPj);

                    if (tempAux->numSock == i) {
                        //--Elimina y libera la lista de recursos de personaje

                        for (contRec = 0; contRec < list_size(tempAux->recursos); contRec++) {
                            auxRec = list_get(tempAux->recursos, contRec);
                            //--Suma la cantidad de recursos que el personaje libera
                            sumarQuantityRec(ListaItems, *auxRec, 1);
                        }

                        list_destroy_and_destroy_elements(tempAux->recursos, free);

                        //--Elimina y libera al personaje de la lista de personajes
                        list_remove_and_destroy_element(personajes, contPj, free);
                        BorrarPer(&ListaItems, i);
                        break;
                    }
                }

                log_debug(logger, "%d se desconectó", i);
                break;
            }
            nivel_gui_dibujar(ListaItems, nom_nivel);

            pthread_mutex_unlock(&semNiv);
        }

    }

    nivel_gui_terminar();
    return 0;
}
Пример #10
0
void procesar_mensaje (int sock_plataforma, int nro_nivel, t_paquete paqueteAux, t_list *ListaItems, t_list *ListaPersonajes, t_configNivel datosNivel, pthread_mutex_t *mutexListaItems, pthread_mutex_t *mutexListaPersonajes, pthread_mutex_t *mutexEnemigos, t_log *logger)
{
    switch(paqueteAux.selector)
    {
    case NUEVO_PERSONAJE:
    {
        t_nuevoPersonaje *nuevoPersonaje = (t_nuevoPersonaje *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        pthread_mutex_lock(mutexListaPersonajes);
        t_personaje *personaje = (t_personaje *) malloc(sizeof(t_personaje));
        personaje->personajeID = nuevoPersonaje->personajeID;
        personaje->nivelID = nuevoPersonaje->nivelID;
        personaje->recursosAsignados = list_create();
        personaje->recursosNecesitados = list_create();
        personaje->posX = 0;
        personaje->posY = 0;
        personaje->recursoBloqueante = '\0';
        personaje->prioridad = prioridad;
        ++prioridad;
        crearListaRecursosNecesitados(nuevoPersonaje->recursosNecesitados,personaje->recursosNecesitados);

        ITEM_NIVEL *itemPersonaje = malloc(sizeof(ITEM_NIVEL));
        itemPersonaje->id = nuevoPersonaje->personajeID;
        itemPersonaje->posx = 0;
        itemPersonaje->posy = 0;
        itemPersonaje->item_type = PERSONAJE_ITEM_TYPE;

        list_add(ListaItems,itemPersonaje);
        list_add(ListaPersonajes,personaje);
        nivel_gui_dibujar(ListaItems,datosNivel.nombre);
        pthread_mutex_unlock(mutexListaItems);
        pthread_mutex_unlock(mutexListaPersonajes);

        log_info(logger, "Personaje: %c conectado.", personaje->personajeID);

        break;
    }

    case UBICACION_RECURSO:
    {
        log_info(logger, "Mensaje UBICACION_RECURSO recibido.");

        t_ubicacionRecurso *ubicacionRecurso = (t_ubicacionRecurso *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        bool _funcBuscarRecurso(ITEM_NIVEL *item) {
            return item->id == ubicacionRecurso->recursoID;
        }
        ITEM_NIVEL *itemBuscado = list_find(ListaItems,(void *)_funcBuscarRecurso);
        pthread_mutex_unlock(mutexListaItems);

        ubicacionRecurso->posX = itemBuscado->posx;
        ubicacionRecurso->posY = itemBuscado->posy;

        t_paquete *paquete = empaquetar(UBICACION_RECURSO, sizeof(t_ubicacionRecurso), ubicacionRecurso);

        if(send(sock_plataforma,paquete,sizeof(t_paquete),0) == -1)
        {
            log_error(logger, "Error al enviar mensaje UBICACION_RECURSO.");
            exit(1);
        }

        free(paquete);

        log_info(logger, "Mensaje UBICACION_RECURSO enviado.");

        break;
    }

    case UBICACION_PERSONAJE:
    {
        log_info(logger, "Mensaje UBICACION_PERSONAJE recibido.");

        t_ubicacionPersonaje *ubicacionPersonaje = (t_ubicacionPersonaje *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        pthread_mutex_lock(mutexListaPersonajes);
        bool _funcBuscarEnListaItems(ITEM_NIVEL *personaje) {
            return personaje->id == ubicacionPersonaje->personajeID;
        }
        ITEM_NIVEL *itemPersonaje = list_find(ListaItems,(void *)_funcBuscarEnListaItems);
        bool _funcBuscarEnListaPersonajes(t_personaje *personaje) {
            return personaje->personajeID == ubicacionPersonaje->personajeID;
        }
        t_personaje *personaje = list_find(ListaPersonajes,(void *)_funcBuscarEnListaPersonajes);

        if((itemPersonaje != NULL) && (personaje != NULL))
        {
            itemPersonaje->posx = ubicacionPersonaje->posX;
            itemPersonaje->posy = ubicacionPersonaje->posY;

            personaje->posX = ubicacionPersonaje->posX;
            personaje->posY = ubicacionPersonaje->posY;

            bool _funcPisarEnemigo(ITEM_NIVEL *itemEnemigo)
            {
                if(itemEnemigo->item_type == ENEMIGO_ITEM_TYPE)
                {
                    return ((itemPersonaje->posx == itemEnemigo->posx) && (itemPersonaje->posy == itemEnemigo->posy));
                }

                return false;
            }

            bool muertePorEnemigo = list_any_satisfy(ListaItems, (void *) _funcPisarEnemigo);

            if(muertePorEnemigo)
            {
                t_victimaEnemigo victimaEnemigo;
                victimaEnemigo.personajeID = itemPersonaje->id;
                victimaEnemigo.nivelID = nro_nivel;

                t_paquete *paquete = empaquetar(VICTIMA_ENEMIGO, sizeof(t_victimaEnemigo), &victimaEnemigo);

                if(send(sock_plataforma, paquete, sizeof(t_paquete), 0) == -1)
                {
                    log_error(logger, "Error al enviar mensaje VICTIMA_ENEMIGO.");
                    exit(1);
                }

                free(paquete);

                log_info(logger, "Mensaje VICTIMA_ENEMIGO enviado.");
            }

            nivel_gui_dibujar(ListaItems,datosNivel.nombre);
            pthread_mutex_unlock(mutexListaItems);
            pthread_mutex_unlock(mutexListaPersonajes);
        }

        break;
    }

    case INSTANCIA_RECURSO:
    {
        log_info(logger, "Mensaje INSTANCIA_RECURSO recibido.");

        t_instanciaRecurso *instanciaRecurso = (t_instanciaRecurso *) paqueteAux.datos;

        pthread_mutex_lock(mutexListaItems);
        pthread_mutex_lock(mutexListaPersonajes);
        bool _funcBuscarRecursoEnItems(ITEM_NIVEL *rec) {
            return rec->id == instanciaRecurso->recursoID;
        }
        ITEM_NIVEL *itemRecurso = list_find(ListaItems,(void *)_funcBuscarRecursoEnItems);

        bool _funcBuscarPersonaje(t_personaje *pers) {
            return pers->personajeID == instanciaRecurso->personajeID;
        }
        t_personaje *personaje = list_find(ListaPersonajes,(void *)_funcBuscarPersonaje);

        if(personaje != NULL)
        {
            if(itemRecurso->quantity)
            {
                --itemRecurso->quantity;

                bool _funcBuscarRecurso(t_recurso *recurso) {
                    return recurso->recursoID == instanciaRecurso->recursoID;
                }
                t_recurso *recursoAsignado = list_find(personaje->recursosAsignados, (void *) _funcBuscarRecurso);
                t_recurso *recursoNecesitado = list_find(personaje->recursosNecesitados, (void *) _funcBuscarRecurso);

                if(recursoAsignado != NULL)
                {
                    ++recursoAsignado->cantidad;
                }
                else
                {
                    t_recurso *recurso = malloc(sizeof(t_recurso));
                    recurso->recursoID = instanciaRecurso->recursoID;
                    recurso->cantidad = 1;
                    list_add (personaje->recursosAsignados, recurso);
                }

                --recursoNecesitado->cantidad;

                if(recursoNecesitado->cantidad == 0)
                {
                    list_remove_by_condition(personaje->recursosNecesitados, (void *) _funcBuscarRecurso);
                }

                if (send(sock_plataforma,&paqueteAux,sizeof(t_paquete),0) == -1)
                {
                    log_error(logger, "Error al enviar mensaje RESPUESTA.");
                    exit(1);
                }

                log_info(logger, "Mensaje INSTANCIA_RECURSO enviado.");

            }
            else
            {
                personaje->recursoBloqueante = instanciaRecurso->recursoID;
            }
        }
Пример #11
0
void mensajesConPlataforma(int32_t socketEscucha) {//ATIENDE LA RECEPCION Y POSTERIOR RESPUESTA DE MENSAJES DEL ORQUESTADOR
	enum tipo_paquete unMensaje = PER_conexionNivel_ORQ;
	char* elMensaje=NULL;

	pthread_mutex_lock(&mutex_log);
	log_info(logger,"Voy a esperar recibir un mensaje de %d", socketEscucha);
	pthread_mutex_unlock(&mutex_log);

	pthread_mutex_lock(&mutex_mensajes); //(matyx)
	recibirMensaje(socketEscucha, &unMensaje,&elMensaje);
	pthread_mutex_unlock(&mutex_mensajes);

	sleep(1);

		pthread_mutex_lock(&mutex_log);
		log_info(logger, "Llego el tipo de paquete: %s .",obtenerNombreEnum(unMensaje));
		log_info(logger, "Llego este mensaje: %s .",elMensaje);
		pthread_mutex_unlock(&mutex_log);

		switch (unMensaje) {

			case PLA_movimiento_NIV: {//graficar y actualizar la lista RECIBE "@,1,3"

				char ** mens = string_split(elMensaje,",");

				char idPers = mens[0][0];


				if(huboCambios==true){

					pthread_mutex_lock(&mutex_log);
					log_info(logger,"envio los cambios de configuracion");
					pthread_mutex_unlock(&mutex_log);

					pthread_mutex_lock(&mutex_mensajes);
					enviarMensaje(socketDeEscucha, NIV_cambiosConfiguracion_PLA,buffer1);
					pthread_mutex_unlock(&mutex_mensajes);

					huboCambios=false;

					pthread_mutex_lock(&mutex_log);
					log_info(logger,"me preparo para recibir el ok");
					pthread_mutex_unlock(&mutex_log);

					pthread_mutex_lock(&mutex_mensajes);
					recibirMensaje(socketEscucha, &unMensaje,&elMensaje);
					pthread_mutex_unlock(&mutex_mensajes);

					pthread_mutex_lock(&mutex_log);
					log_info(logger,"deberia haber recibido el OK1");
					pthread_mutex_unlock(&mutex_log);

					if(unMensaje==OK1){
						pthread_mutex_lock(&mutex_log);
						log_info(logger,"ya envie el cambio de configuracion, y me dieron el ok");
						pthread_mutex_unlock(&mutex_log);

						if(existePersonajeEnListaItems(idPers)){

							pthread_mutex_lock(&mutex_listas);
							MoverPersonaje(items, idPers,atoi(mens[1]), atoi(mens[2]));
							pthread_mutex_unlock(&mutex_listas);

							pthread_mutex_lock(&mutex_log);
							log_info(logger, "El personaje %s se movio a %s %s ",mens[0],mens[1],mens[2]);
							pthread_mutex_unlock(&mutex_log);

							if(graficar)
								nivel_gui_dibujar(items,nombre);
							}

						pthread_mutex_lock(&mutex_mensajes);
						enviarMensaje(socketEscucha,NIV_movimiento_PLA,"0"); //"0" SI ES VALIDO
						pthread_mutex_unlock(&mutex_mensajes);


						} else {
							pthread_mutex_lock(&mutex_log);
							log_info(logger,"no recibi OK1,recibi cualquiera");
							pthread_mutex_unlock(&mutex_log);
						}
					} else {

						if(existePersonajeEnListaItems(idPers)){

							pthread_mutex_lock(&mutex_listas);
							MoverPersonaje(items, elMensaje[0],atoi(mens[1]), atoi(mens[2]));
							pthread_mutex_unlock(&mutex_listas);

							pthread_mutex_lock(&mutex_log);
							log_info(logger, "El personaje %s se movio a %s %s ",mens[0],mens[1],mens[2]);
							pthread_mutex_unlock(&mutex_log);

							if(graficar)
								nivel_gui_dibujar(items,nombre);
						}

						pthread_mutex_lock(&mutex_log);
						log_info(logger, "Confirmo que el personaje %s puede moverse",mens[0]);
						pthread_mutex_unlock(&mutex_log);

						pthread_mutex_lock(&mutex_mensajes);
						enviarMensaje(socketEscucha,NIV_movimiento_PLA,"0"); //"0" SI ES VALIDO
						pthread_mutex_unlock(&mutex_mensajes);

					}

				break;
			}
			case PLA_personajeMuerto_NIV:{ //RECIBE "@" MUERTE POR ENEMIGOS
				char id=elMensaje[0];
				t_personaje_niv1 * personaje = malloc(sizeof(t_personaje_niv1));

				personaje = buscarPersonajeListaPersonajes(listaPersonajesRecursos,string_substring_until(elMensaje,1));

				pthread_mutex_lock(&mutex_listas);
//				liberarRecursosDelPersonaje(personaje->recursosActuales); // tambien suma sus recursos a disponible
				borrarPersonajeListaPersonajes(listaPersonajesRecursos,elMensaje);

				pthread_mutex_unlock(&mutex_listas);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "El personaje %c ha muerto ",id);
				pthread_mutex_unlock(&mutex_log);



				break;
			}
			case PLA_nuevoPersonaje_NIV:{ //RECIBE "@" LA POSICION DE INICIO SERA SIEMPRE 0,0 POR LO QUE NO LA RECIBE


				char * simbolo = malloc(strlen(elMensaje)+1);
				strcpy(simbolo,elMensaje);

				pthread_mutex_lock(&mutex_listas);
				CrearPersonaje(items,elMensaje[0],0,0);
				pthread_mutex_unlock(&mutex_listas);

				//ACA CREO UNA LISTA DE PERSONAJES CON SUS RESPECTIVOS RECURSOS ASIGNADOS
				t_personaje_niv1 * personaje = malloc(sizeof(t_personaje_niv1));
				personaje->simbolo = string_substring_until(elMensaje,1);
				personaje->recursosActuales = list_create();
				personaje->recursoBloqueante = string_new();
				personaje->posicion = posicion_create_pos(0,0);
				personaje->ingresoSistema = ingresoAlSistema;
				ingresoAlSistema++;

				pthread_mutex_lock(&mutex_listas);
				list_add(listaPersonajesRecursos,personaje);
				pthread_mutex_unlock(&mutex_listas);

				if(graficar)
					nivel_gui_dibujar(items,nombre);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "El nuevo personaje %c se dibujo en el mapa",elMensaje[0]);
				pthread_mutex_unlock(&mutex_log);

				break;

			}
			case PLA_posCaja_NIV:{ // RECIBE "F" SI ESTA SOLICITANDO UNA FLOR, POR EJEMPLO

				char * pos = string_new();
				ITEM_NIVEL * caja = buscarRecursoEnLista(items, elMensaje);

				string_append(&pos, string_from_format("%d",caja->posx));
				string_append(&pos, ",");
				string_append(&pos, string_from_format("%d",caja->posy));

				pthread_mutex_lock(&mutex_log);
				log_info(logger,"enviare la posicion de la caja");
				pthread_mutex_unlock(&mutex_log);

				pthread_mutex_lock(&mutex_mensajes);
				enviarMensaje(socketEscucha, NIV_posCaja_PLA,pos); //"X,Y"
				pthread_mutex_unlock(&mutex_mensajes);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "Envio posicion del recurso %s coordenadas %s ",elMensaje,pos);
				pthread_mutex_unlock(&mutex_log);

				free(pos);
				break;

			}
			case PLA_solicitudRecurso_NIV:{ // LE CONTESTO SI EL RECURSOS ESTA DISPONIBLE




				// El mensaje de ejemplo es : "@,H"

				char * rta;
				bool hayRecurso = determinarRecursoDisponible (string_substring_from(elMensaje, 2)); //SI ESTA EL RECURSO TMB LO RESTA
				t_personaje_niv1 * pers = buscarPersonajeListaPersonajes(listaPersonajesRecursos, string_substring_until(elMensaje,1));

				if (hayRecurso){
					rta = "0";

					pthread_mutex_lock(&mutex_listas);
					list_add(pers->recursosActuales, string_substring_from(elMensaje, 2));
					pers->recursoBloqueante = string_new();

					pthread_mutex_unlock(&mutex_listas);

				}else{

					pthread_mutex_lock(&mutex_listas);
					pers->recursoBloqueante = string_substring_from(elMensaje, 2);
					rta = "1";
					pthread_mutex_unlock(&mutex_listas);
				}


				pthread_mutex_lock(&mutex_mensajes);
				enviarMensaje(socketEscucha, NIV_recursoConcedido_PLA,rta);//"0" CONCEDIDO, "1" NO CONCEDIDO
				pthread_mutex_unlock(&mutex_mensajes);

				break;
			}

			case PLA_personajesDesbloqueados_NIV:{//"5,@,#,....." recorro lista personaje recursos y actualizo recBloqueante a vacio
				char ** mens = string_split(elMensaje,",");
				int i;

				int cantPersonajes=atoi(mens[0]);
				for(i=1;i<=cantPersonajes;i++){
					char * unPersDesbloqueado=mens[i];

					t_personaje_niv1 * unPers=buscarPersonajeListaPersonajes(listaPersonajesRecursos,unPersDesbloqueado);

					pthread_mutex_lock(&mutex_listas);
					unPers->recursoBloqueante=string_new();
					pthread_mutex_unlock(&mutex_listas);

					pthread_mutex_lock(&mutex_log);
					log_info(logger, "Personajes %s desbloqueados",mens[i]);
					pthread_mutex_unlock(&mutex_log);

				}


				break;
			}

			case PLA_actualizarRecursos_NIV:{ //"3;F,1;C,3;....." actualizo la lista de recursos sumandole esas cantidades
				char ** mens = string_split(elMensaje,";");
				int cantRecursos= atoi(mens[0]);
				int i;
				pthread_mutex_lock(&mutex_log);
				log_info(logger, "Recursos desbloqueados: %s",elMensaje);
				pthread_mutex_unlock(&mutex_log);

				for(i=1;i<=cantRecursos;i++){
					char** mensajeIndividual= string_split(mens[i],",");
					pthread_mutex_lock(&mutex_listas);
					int cantidad=atoi(mensajeIndividual[1]);
					sumarRecurso(items, mensajeIndividual[0][0],cantidad);
					pthread_mutex_unlock(&mutex_listas);

					if(graficar)
						nivel_gui_dibujar(items,nombre);
				}


				break;
			}
			case PLA_nivelFinalizado_NIV:{  //recibe personaje que termino el nivel ej: "@"
				char id=elMensaje[0];
				t_personaje_niv1 * personaje = malloc(sizeof(t_personaje_niv1));

				personaje = buscarPersonajeListaPersonajes(listaPersonajesRecursos,string_substring_until(elMensaje,1));

				pthread_mutex_lock(&mutex_listas);
	//			liberarRecursosDelPersonaje(personaje->recursosActuales);
				BorrarItem(items,id);
				borrarPersonajeListaPersonajes(listaPersonajesRecursos,elMensaje);
				pthread_mutex_unlock(&mutex_listas);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "El personaje %c ha terminado el nivel ",id);
				pthread_mutex_unlock(&mutex_log);

				if(graficar){

					nivel_gui_dibujar(items,nombre);

				}

				break;
			}


			case PLA_perMuereInterbloqueo_NIV:{
				char id=elMensaje[0];
				t_personaje_niv1 * personaje = malloc(sizeof(t_personaje_niv1));

				personaje = buscarPersonajeListaPersonajes(listaPersonajesRecursos,string_substring_until(elMensaje,1));

				pthread_mutex_lock(&mutex_listas);
//				liberarRecursosDelPersonaje(personaje->recursosActuales);
				BorrarItem(items,id);
				borrarPersonajeListaPersonajes(listaPersonajesRecursos,elMensaje);
				pthread_mutex_unlock(&mutex_listas);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "El personaje %c ha muerto por interbloqueo ",id);
				pthread_mutex_unlock(&mutex_log);

				if(graficar)
					nivel_gui_dibujar(items,nombre);

				break;
			}

			case PLA_perMuereNaturalmente_NIV: {
				char id = elMensaje[0];
				t_personaje_niv1 * personaje = malloc(sizeof(t_personaje_niv1));

				personaje = buscarPersonajeListaPersonajes(listaPersonajesRecursos,string_substring_until(elMensaje, 1));

				pthread_mutex_lock(&mutex_listas);
				liberarRecursosDelPersonaje(personaje->recursosActuales);
				BorrarItem(items, id);
				borrarPersonajeListaPersonajes(listaPersonajesRecursos, elMensaje);
				pthread_mutex_unlock(&mutex_listas);

				pthread_mutex_lock(&mutex_log);
				log_info(logger, "El personaje %c ha muerto por causas externas", id);
				pthread_mutex_unlock(&mutex_log);

				if (graficar)
					nivel_gui_dibujar(items, nombre);

				break;
			}

			{
				default:
					pthread_mutex_lock(&mutex_log);
					log_info(logger, "Recibi mensaje inexistente, la ejecucion del nivel finalizara");
					pthread_mutex_unlock(&mutex_log);

					eliminarEstructuras();

					break;
			}


			free(elMensaje);

		}


}
Пример #12
0
void moverEnemigoEn(t_enemigo * enemigo, t_personaje_niv1 * personaje, char * orientacion){
		/* //TODO no estaría esquivando la caja

	if(orientacion == horizontal)
		if(enemigo->posicion->posX > personaje->posicion->posX)
			enemigo->posicion->posX = enemigo->posicion->posX - 1;
		else
			enemigo->posicion->posX = enemigo->posicion->posX + 1;
	else if(orientacion == vertical){
		if(enemigo->posicion->posY > personaje->posicion->posY)
			enemigo->posicion->posY = enemigo->posicion->posY - 1;
		else
			enemigo->posicion->posY = enemigo->posicion->posY + 1;
	}*/


	if(orientacion == horizontal){
		if(enemigo->posicion->posX > personaje->posicion->posX){
			if(hayCaja(enemigo->posicion->posX - 1, enemigo->posicion->posY) || (enemigo->posicion->posX - 1 == 0 && enemigo->posicion->posY == 0)){
				orientacion = vertical;
				enemigo->posicion->posY = enemigo->posicion->posY + obtenerDireccionCercaniaEn(orientacion,enemigo,personaje);
				pthread_mutex_lock(&mx_lista_items);
				MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
				pthread_mutex_unlock(&mx_lista_items);

			}else{

				enemigo->posicion->posX = enemigo->posicion->posX - 1;
				pthread_mutex_lock(&mx_lista_items);
				MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
				pthread_mutex_unlock(&mx_lista_items);

			}
		}else{
			if(hayCaja(enemigo->posicion->posX + 1, enemigo->posicion->posY) || (enemigo->posicion->posX + 1 == 0 && enemigo->posicion->posY == 0)){
				orientacion = vertical;
				enemigo->posicion->posY = enemigo->posicion->posY + obtenerDireccionCercaniaEn(orientacion,enemigo,personaje);
				pthread_mutex_lock(&mx_lista_items);
				MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
				pthread_mutex_unlock(&mx_lista_items);

			}else{
				enemigo->posicion->posX = enemigo->posicion->posX + 1;
				pthread_mutex_lock(&mx_lista_items);
				MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
				pthread_mutex_unlock(&mx_lista_items);

			}
		}
	}else if(orientacion == vertical){
		if(enemigo->posicion->posY > personaje->posicion->posY)
			if(hayCaja(enemigo->posicion->posX, enemigo->posicion->posY - 1) || (enemigo->posicion->posX == 0 && enemigo->posicion->posY - 1 == 0)){
				orientacion = horizontal;
				enemigo->posicion->posX = enemigo->posicion->posX + obtenerDireccionCercaniaEn(orientacion,enemigo,personaje);
				pthread_mutex_lock(&mx_lista_items);
				MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
				pthread_mutex_unlock(&mx_lista_items);

			}else{
				enemigo->posicion->posY = enemigo->posicion->posY - 1;
				pthread_mutex_lock(&mx_lista_items);
				MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
				pthread_mutex_unlock(&mx_lista_items);

			}
		else if(hayCaja(enemigo->posicion->posX, enemigo->posicion->posY + 1) || (enemigo->posicion->posX == 0 && enemigo->posicion->posY + 1 == 0)){
			orientacion = horizontal;
			enemigo->posicion->posX = enemigo->posicion->posX + obtenerDireccionCercaniaEn(orientacion,enemigo,personaje);
			pthread_mutex_lock(&mx_lista_items);
			MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
			pthread_mutex_unlock(&mx_lista_items);

		}else
			enemigo->posicion->posY = enemigo->posicion->posY + 1;
			pthread_mutex_lock(&mx_lista_items);
			MoverEnemigo(items, enemigo->id, enemigo->posicion->posX,enemigo->posicion->posY);
			pthread_mutex_unlock(&mx_lista_items);

	}


	if(graficar)
		nivel_gui_dibujar(items,nombre);

	if(IMPRIMIR_INFO_ENEMIGO){
		pthread_mutex_lock(&mutex_log);
		log_info(logger,"Posicion del enemigo. PosX: %d, PosY: %d ", enemigo->posicion->posX, enemigo->posicion->posY);
		pthread_mutex_unlock(&mutex_log);
	}

	//TODO alcanza con esto o tengo q usar una funcion list_replace?
	enemigo->ultimoMovimiento = orientacion;
}