From 0de5a461ed7dceaaf32b805707441451d79c5048 Mon Sep 17 00:00:00 2001
From: Pedro Folloni Pesserl <fpesserl7@gmail.com>
Date: Thu, 2 Feb 2023 02:38:42 -0300
Subject: [PATCH] add wrapper functions

---
 t1/mundo.c | 176 ++++++++++++++++++++++++++++-------------------------
 1 file changed, 93 insertions(+), 83 deletions(-)

diff --git a/t1/mundo.c b/t1/mundo.c
index f089556..8b11a53 100644
--- a/t1/mundo.c
+++ b/t1/mundo.c
@@ -240,6 +240,7 @@ void trata_evento_chegada(int id_heroi, int id_local, mundo_t *m, lef_t *lista_d
 			printf("FILA %d\n", tamanho_fila(m->locais[id_local].fila));
 			return;
 		}
+
 		printf("DESISTE\n");
 		evento_t saida = { m->tempo_atual, SAIDA, id_heroi, id_local };
 		adiciona_ordem_lef(lista_de_eventos, &saida);
@@ -251,12 +252,96 @@ void trata_evento_chegada(int id_heroi, int id_local, mundo_t *m, lef_t *lista_d
 	int t_permanencia_local = max(1, m->herois[id_heroi].paciencia/10 + aleat(-2,6));
 	evento_t saida = { m->tempo_atual + t_permanencia_local, SAIDA, id_heroi, id_local };
 	adiciona_ordem_lef(lista_de_eventos, &saida);
-	return;
+}
+
+void trata_evento_saida(int id_heroi, int id_local, mundo_t *m, lef_t *lista_de_eventos) {
+	printf("%6d:SAIDA HEROI %2d Local %d (%2d/%2d)",
+			m->tempo_atual,
+			id_heroi,
+			id_local,
+			cardinalidade_cjt(m->locais[id_local].publico),
+			m->locais[id_local].lotacao_max);
+
+	if (pertence_cjt(m->locais[id_local].publico, id_heroi)) {
+		retira_cjt(m->locais[id_local].publico, id_heroi);
+		if (!vazia_fila(m->locais[id_local].fila)) {
+			int id_heroi_fila;
+			retira_fila(m->locais[id_local].fila, &id_heroi_fila);
+			printf(", REMOVE FILA HEROI %d", id_heroi_fila);
+			evento_t chegada_heroi_fila = { m->tempo_atual, CHEGADA, id_heroi_fila, id_local };
+			adiciona_inicio_lef(lista_de_eventos, &chegada_heroi_fila);
+		}
+	}
+	printf("\n");
+
+	int id_local_destino = aleat(0, m->n_locais-1);
+	int t_deslocamento = distancia(m->locais[id_local], m->locais[id_local_destino]) / velocidade_heroi(m->herois[id_heroi]);
+	evento_t chegada_heroi = { m->tempo_atual + t_deslocamento/15, CHEGADA, id_heroi, id_local_destino };
+	adiciona_ordem_lef(lista_de_eventos, &chegada_heroi);
+}
+
+void trata_evento_missao(int id_missao, mundo_t *m, lef_t *lista_de_eventos) {
+	conjunto_t *missao;
+	if (m->missoes[id_missao] == NULL)
+		if ( !(m->missoes[id_missao] = cria_subcjt_cjt(m->cj_habilidades, aleat(3, 6))) )
+			MEM_ERROR_EXIT;
+
+	missao = m->missoes[id_missao];
+
+	printf("%6d:MISSAO %4d HAB_REQ ", m->tempo_atual, id_missao);
+	imprime_cjt(missao);
+
+	local_t local_encontrado;
+	conjunto_t *equipe_escolhida = escolhe_menor_equipe(missao, id_missao, m, &local_encontrado);
+
+	printf("%6d:MISSAO %4d ", m->tempo_atual, id_missao);
+	if (vazio_cjt(equipe_escolhida)) {
+		printf("IMPOSSIVEL\n");
+		evento_t nova_tentativa = { aleat(m->tempo_atual, m->fim_do_mundo), MISSAO, id_missao, 0 };
+		adiciona_ordem_lef(lista_de_eventos, &nova_tentativa);
+	} else {
+		printf("HER_EQS %d:", local_encontrado.id);
+		imprime_cjt(local_encontrado.publico);
+
+		int id_heroi_encontrado;
+		inicia_iterador_cjt(local_encontrado.publico);
+		int i;
+		for (i = 0; i < cardinalidade_cjt(local_encontrado.publico); i++) {
+			incrementa_iterador_cjt(local_encontrado.publico, &id_heroi_encontrado);
+			(m->herois[id_heroi_encontrado].exp)++;
+		}
+		missao = destroi_cjt(missao);
+		m->missoes[id_missao] = NULL;
+	}
+	equipe_escolhida = destroi_cjt(equipe_escolhida);
+}
+
+void trata_evento_fim(mundo_t *m, lef_t **lista_de_eventos) {
+	printf("%6d:FIM\n", m->tempo_atual);
+	int i;
+	for (i = 0; i < m->n_herois; i++) {
+		printf("HEROI %2d EXPERIENCIA %2d\n", m->herois[i].id, m->herois[i].exp);
+		m->herois[i].habilidades_do_heroi = destroi_cjt(m->herois[i].habilidades_do_heroi);
+	}
+
+	for (i = 0; i < m->n_locais; i++) {
+		m->locais[i].publico = destroi_cjt(m->locais[i].publico);
+		m->locais[i].fila = destroi_fila(m->locais[i].fila);
+	}
+
+	free(m->herois);
+	free(m->locais);
+	for (i = 0; i < m->n_missoes; i++)
+		if (m->missoes[i] != NULL)
+			m->missoes[i] = destroi_cjt(m->missoes[i]);
+	free(m->missoes);
+	m->cj_habilidades = destroi_cjt(m->cj_habilidades);
+	free(m);
+	*lista_de_eventos = destroi_lef(*lista_de_eventos);
 }
 
 int main() {
-	/* srand(time(0)); */
-	srand(0);
+	srand(time(0));
 
 	lef_t *lista_de_eventos;
 	if ( !(lista_de_eventos = cria_lef()) )
@@ -270,96 +355,21 @@ int main() {
 		mundo->tempo_atual = evento_atual->tempo;
 
 		/* trata o evento e atualiza estado do sistema */
-		int id_heroi, id_local, id_missao, i;
 		switch (evento_atual->tipo) {
 			case CHEGADA:
 				trata_evento_chegada(evento_atual->dado1, evento_atual->dado2, mundo, lista_de_eventos);
 				break;
 
-			case SAIDA: ;
-				id_heroi = evento_atual->dado1;
-				id_local = evento_atual->dado2;
-				printf("%6d:SAIDA HEROI %2d Local %d (%2d/%2d)",
-					mundo->tempo_atual,
-					id_heroi,
-					id_local,
-					cardinalidade_cjt(mundo->locais[id_local].publico),
-					mundo->locais[id_local].lotacao_max);
-
-				if (pertence_cjt(mundo->locais[id_local].publico, id_heroi)) {
-					retira_cjt(mundo->locais[id_local].publico, id_heroi);
-					if (!vazia_fila(mundo->locais[id_local].fila)) {
-						int id_heroi_fila;
-						retira_fila(mundo->locais[id_local].fila, &id_heroi_fila);
-						printf(", REMOVE FILA HEROI %d", id_heroi_fila);
-						evento_t chegada_heroi_fila = { mundo->tempo_atual, CHEGADA, id_heroi_fila, id_local };
-						adiciona_inicio_lef(lista_de_eventos, &chegada_heroi_fila);
-					}
-				}
-				printf("\n");
-
-				int id_local_destino = aleat(0, mundo->n_locais-1);
-				int t_deslocamento = distancia(mundo->locais[id_local], mundo->locais[id_local_destino]) / velocidade_heroi(mundo->herois[id_heroi]);
-				evento_t chegada_heroi = { mundo->tempo_atual + t_deslocamento/15, CHEGADA, id_heroi, id_local_destino };
-				adiciona_ordem_lef(lista_de_eventos, &chegada_heroi);
+			case SAIDA:
+				trata_evento_saida(evento_atual->dado1, evento_atual->dado2, mundo, lista_de_eventos);
 				break;
 
-			case MISSAO: ;
-				id_missao = evento_atual->dado1;
-				local_t local_encontrado;
-				conjunto_t *missao;
-				if (mundo->missoes[id_missao] == NULL)
-					if ( !(mundo->missoes[id_missao] = cria_subcjt_cjt(mundo->cj_habilidades, aleat(3, 6))) )
-						MEM_ERROR_EXIT;
-				
-				missao = mundo->missoes[id_missao];
-				printf("%6d:MISSAO %4d HAB_REQ ", mundo->tempo_atual, id_missao);
-				imprime_cjt(missao);
-				
-				conjunto_t *equipe_escolhida = escolhe_menor_equipe(missao, id_missao, mundo, &local_encontrado);
-
-				printf("%6d:MISSAO %4d ", mundo->tempo_atual, id_missao);
-				if (vazio_cjt(equipe_escolhida)) {
-					printf("IMPOSSIVEL\n");
-					evento_t nova_tentativa = { aleat(mundo->tempo_atual, mundo->fim_do_mundo), MISSAO, id_missao, 0 };
-					adiciona_ordem_lef(lista_de_eventos, &nova_tentativa);
-				} else {
-					printf("HER_EQS %d:", local_encontrado.id);
-					imprime_cjt(local_encontrado.publico);
-
-					int id_heroi_encontrado;
-					inicia_iterador_cjt(local_encontrado.publico);
-					for (i = 0; i < cardinalidade_cjt(local_encontrado.publico); i++) {
-						incrementa_iterador_cjt(local_encontrado.publico, &id_heroi_encontrado);
-						(mundo->herois[id_heroi_encontrado].exp)++;
-					}
-					missao = destroi_cjt(missao);
-					mundo->missoes[id_missao] = NULL;
-				}
-				equipe_escolhida = destroi_cjt(equipe_escolhida);
+			case MISSAO:
+				trata_evento_missao(evento_atual->dado1, mundo, lista_de_eventos);
 				break;
 
 			case FIM:
-				printf("%6d:FIM\n", mundo->tempo_atual);
-				for (i = 0; i < mundo->n_herois; i++) {
-					printf("HEROI %2d EXPERIENCIA %2d\n", mundo->herois[i].id, mundo->herois[i].exp);
-					mundo->herois[i].habilidades_do_heroi = destroi_cjt(mundo->herois[i].habilidades_do_heroi);
-				}
-
-				for (i = 0; i < mundo->n_locais; i++) {
-					mundo->locais[i].publico = destroi_cjt(mundo->locais[i].publico);
-					mundo->locais[i].fila = destroi_fila(mundo->locais[i].fila);
-				}
-				
-				free(mundo->herois);
-				free(mundo->locais);
-				for (i = 0; i < mundo->n_missoes; i++)
-					if (mundo->missoes[i] != NULL)
-						mundo->missoes[i] = destroi_cjt(mundo->missoes[i]);
-				free(mundo->missoes);
-				mundo->cj_habilidades = destroi_cjt(mundo->cj_habilidades);
-				free(mundo);
-				lista_de_eventos = destroi_lef(lista_de_eventos);
+				trata_evento_fim(mundo, &lista_de_eventos);
 				break;
 		}
 
-- 
GitLab