// recibe una direccion y un perro, al cual debe mover en esa dirección // *** viene del syscall mover *** uint game_perro_mover(perro_t *perro, direccion dir) { int x, y; uint res = game_dir2xy(dir, &x, &y); int nuevo_x = perro->x + x; int nuevo_y = perro->y + y; int viejo_x = perro->x; int viejo_y = perro->y; if (res == 0 && game_es_posicion_valida(nuevo_x, nuevo_y) && ! game_hay_perros_de(nuevo_x, nuevo_y, perro->jugador) ) { screen_borrar_perro(perro); perro->x = nuevo_x; perro->y = nuevo_y; mmu_mover_perro(perro, viejo_x, viejo_y); screen_pintar_perro(perro); res = 0; } else { res = -1; } return res; }
// toma un perro ya existente libre y lo recicla seteando x e y a la cucha. // luego inicializa su mapeo de memoria, tss, lo agrega al sched y pinta la pantalla void game_perro_reciclar_y_lanzar(perro_t *perro, uint tipo) { jugador_t *j = perro->jugador; perro->x = j->x_cucha; perro->y = j->y_cucha; perro->tipo = tipo; perro->libre = FALSE; // ahora debo llamar a rutinas que inicialicen un nuevo mapa de // memoria para el nuevo perro, que carguen su tss correspondiente, // lo scheduleen y finalmente lo pinten en pantalla //inicializa memoria int cr3 = mmu_inicializar_memoria_perro(perro, j->index, tipo); perro->cr3 = cr3; //pinta al perro screen_pintar_perro(perro); //agrega la tarea al scheduler sched_agregar_tarea(perro); //TODO: que onda la TSS, hay que cambiar la direccion de la tarea ??? // ~~~ completar ~~~ }
void screen_cargar_atras_debug() { int i, j; for (i = POSICION_CUADRO_DEBUG_X; i < POSICION_CUADRO_DEBUG_X + ANCHO_CUADRO_DEBUG; i++) { for (j = POSICION_CUADRO_DEBUG_Y-1; j < POSICION_CUADRO_DEBUG_Y + ALTO_CUADRO_DEBUG; j++) { p[j+1][i] = p2[j+1][i]; } } for (i = POSICION_CUADRO_DEBUG_X; i < POSICION_CUADRO_DEBUG_X + ANCHO_CUADRO_DEBUG; i++) { for (j = POSICION_CUADRO_DEBUG_Y-1; j < POSICION_CUADRO_DEBUG_Y + ALTO_CUADRO_DEBUG; j++) { screen_actualizar_posicion_mapa(i, j); } } screen_pintar_jugador(&jugadorA); screen_pintar_jugador(&jugadorB); for (i = 0; i < MAX_CANT_PERROS_VIVOS; i++) { perro_t *dog = &(jugadorA.perros[i]); if (dog->libre) continue; screen_pintar_perro(dog); } }
// toma un perro ya existente libre y lo recicla seteando x e y a la cucha. // luego inicializa su mapeo de memoria, tss, lo agrega al sched y pinta la pantalla void game_perro_reciclar_y_lanzar(perro_t *perro, uint tipo) { jugador_t *j = perro->jugador; perro->x = j->x_cucha; perro->y = j->y_cucha; perro->tipo = tipo; perro->libre = FALSE; perro->huesos = 0; perro->indice_reloj = 0; // ahora debo llamar a rutinas que inicialicen un nuevo mapa de // memoria para el nuevo perro, que carguen su tss correspondiente, // lo scheduleen y finalmente lo pinten en pantalla tss* tss_jugador = j->index == JUGADOR_A ? tss_jugadorA : tss_jugadorB; tss_inicializar_perro(&tss_jugador[perro->index], perro); tss_agregar_a_gdt(&tss_jugador[perro->index], GDT_IDX_TSS_PERRO(j->index, perro->index)); sched_agregar_tarea(perro); screen_pintar_perro(perro); }