/* Generic "growing-wall" special (callback) */ static void growing_wall_callback(game_t *p_game, int id, void *p_priv_in) { growing_wall_priv_t *p_priv = (growing_wall_priv_t*)p_priv_in; point_t new_pt = pt_add_dir(p_priv->pt, get_dx(p_priv->dir)); mask_tile_t *p_mask_tile; tile_t *p_tile; /* Reduce the speed */ if ( !(p_priv->toggle = !p_priv->toggle) ) return; assert(pt_in_rect(new_pt, pt(0,0), pt(p_game->p_cur_level->w, p_game->p_cur_level->h))); p_tile = &p_game->p_cur_level->p_level_data[new_pt.y * p_game->p_cur_level->w + new_pt.x]; p_mask_tile = &MTILE_AT(p_game, new_pt.x, new_pt.y); if (!MASK_TILE_IS_WALKABLE(*p_mask_tile)) { status_enqueue_message(p_game, "THE ROARING STOPS"); callback_unregister(p_game, p_priv->id); return; } p_priv->pt = new_pt; *p_tile = p_priv->tile; p_mask_tile->id = MASK_ID(p_priv->tile); }
/* Update the status of a subarch thread for Java */ void updateStatus(int * subArchThreadStatus) { int id = MASK_ID(*subArchThreadStatus); if (global_spu_data->threads[id].complete) { *subArchThreadStatus |= SUBARCH_READY_BIT; } }
/* Syscall accessed from Java code */ extern "C" VM_Address subArchGetRefReturn(int threadId) { int id = MASK_ID(threadId); checkIdComplete(id); VM_Address ret = *((VM_Address*)&global_spu_data->threads[id].retVal[0]); global_spu_data->threads[id].in_use = 0; return ret; }
/* Syscall accessed from Java code */ extern "C" double subArchGetDoubleReturn(int threadId) { int id = MASK_ID(threadId); checkIdComplete(id); double ret = *((double*)&global_spu_data->threads[id].retVal[0]); global_spu_data->threads[id].in_use = 0; return ret; }
/* Syscall accessed from Java code */ extern "C" long long subArchGetLongReturn(int threadId) { int id = MASK_ID(threadId); checkIdComplete(id); long long ret = *((long long*)&global_spu_data->threads[id].retVal[0]); global_spu_data->threads[id].in_use = 0; return ret; }
/* Syscall accessed from Java code */ extern "C" float subArchGetFloatReturn(int threadId) { int id = MASK_ID(threadId); checkIdComplete(id); float ret = *((float*)&global_spu_data->threads[id].retVal[0]); global_spu_data->threads[id].in_use = 0; return ret; }