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
// 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;
	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;
    uint cr3 = perro->cr3;

    // ~~~ completar ~~~
    //verificar si se sale del tablero
    if (!game_es_posicion_valida(nuevo_x, nuevo_y)) {
    	return NULL;
    }

	perro_t *otro_perro;
    //verificar si hay otro perro del mismo jugador ahi
    otro_perro = game_perro_hay_perro_de_jugador(perro->jugador, nuevo_x, nuevo_y);
    if ( otro_perro != NULL) {
    	//game_perro_termino(otro_perro);
    	return NULL;
    }

    jugador_t* otro_jugador;

    if (&jugadorA == perro->jugador) {
    	otro_jugador = &jugadorB;
    }

    //verificar si hay otro perro del otro jugadr ahi
    otro_perro = game_perro_hay_perro_de_jugador(otro_jugador, nuevo_x, nuevo_y);
    if ( otro_perro != NULL) {
    	//debemos matar al perro
    	//sched_remover_tarea(sched_buscar_gdtindex_tarea_desde_perro(otro_perro));
    	game_perro_termino(otro_perro);
    }
    screen_borrar_perro(perro);

    //mapeamos como lo pide el enunciado la nueva posicion visitada en modo solo lectura
 	mmu_mapear_pagina(mmu_xy2virtual(nuevo_x, nuevo_y), cr3, mmu_xy2fisica(nuevo_x, nuevo_y), 0x5);
 	// luego copiamos código y pila a la nueva posición de memoria
    mmu_copiar_pagina(0x401000, mmu_xy2virtual(nuevo_x, nuevo_y));	
    // por último mapeamos la dirección 0x401000 a la nueva dirección fisica donde el codigo copiado 
    // y la pila se alojan, con nivel de usuario, y de lectura/escritura
    mmu_mapear_pagina(0x401000, cr3, mmu_xy2fisica(nuevo_x, nuevo_y), 0x7);	
    
    perro->x = nuevo_x;
    perro->y = nuevo_y;

    return 1;
}
Exemple #3
0
void game_syscall_pirata_mover(uint id, direccion dir)
{
	int x_dir =0, y_dir =0;
	int pirx  =0, piry  =0;
    pirata_t* pirata = id_pirata2pirata(id);

	game_dir2xy(dir, &x_dir, &y_dir);
	game_lineal2xy(pirata->pos, &pirx, &piry);

	uint x = pirx + x_dir;
	uint y = piry + y_dir;

	uint pos_orig  = game_xy2lineal(pirx, piry);
	uint pos_nueva = game_xy2lineal(x, y);
	
	if (game_posicion_valida(x,y)) {
		mover_pirata(pos_orig, pos_nueva, pirata);
	} else {
		tarea_suicidarse();
	}
}