Exemple #1
0
// 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;
}
Exemple #2
0
// 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 ~~~

}
Exemple #3
0
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);
    }
}
Exemple #4
0
// 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);
}