uint game_perro_atender_call(ushort accion_id, uint extra) { uint result; result = NULL; switch (accion_id) { case 1: // moverse result = game_perro_mover(sched_tarea_actual(), extra); break; case 2: // cavar result = game_perro_cavar(sched_tarea_actual()); break; case 3: // olfatear result = game_perro_olfatear(sched_tarea_actual()); break; case 4: // recibir orden result = game_perro_recibir_orden(sched_tarea_actual()); break; default: break; } return result; //cambiar a la tarea idle }
// recibe un perro, el cual debe cavar en su posición // *** viene del syscall cavar *** uint game_perro_cavar(perro_t *perro) { // ~~~ completar ~~~ //vemos si esta sobre un escondite if (game_perro_olfatear(perro) != AQUI) { //breakpoint(); //no esta sobre un escondite return 0; } //vemos si no tiene 10 huesos if (perro->huesos >= 10) { //breakpoint(); //no puede cargar mas return 0; } //vemos si al escondite le quedan huesos if (game_huesos_en_posicion(perro->x, perro->y) == 0) { //no hay huesos //breakpoint(); return 0; } //aumentamos su cantidad de huesos perro->huesos += 1; //disminuimos la cantidad de huesos del escondite game_huesos_desenterrar(perro->x, perro->y); return 1; }
uint game_syscall_manejar(uint syscall, uint param1) { uint res; // ~ completar llamando a las funciones que haga falta ~ switch(syscall){ case 1: res = game_perro_mover(game_perro_actual, param1); break; case 2: res = game_perro_cavar(game_perro_actual); break; case 3: res = game_perro_olfatear(game_perro_actual); break; case 4: res = (uint) game_perro_recibirOrden(game_perro_actual); break; default: return -1; } return res; }