/*---------------------------------------------------------------------------- * Move an object up, pushing every other object on its way if possible. *----------------------------------------------------------------------------*/ int levitate(struct object *o) { struct object *tmp; if (idx_y(o->idx) == MAX) return 0; if ((tmp = OBJ[idx_up(o->idx)]) && tmp->dir == STILL) { if (levitate(tmp)) { object_move(o, DIR_UP); return DIR_UP; } return STILL; } return object_try_move(o, DIR_UP); }
/*---------------------------------------------------------------------------- * Try to move the player object in direction dir *----------------------------------------------------------------------------*/ void try_move_player(uint8_t dir) { struct object *o; if ((o = OBJ[game.po->idx + offset[dir]]) && o->dir == STILL) { if ((o->type & HEAVY) && (o->idx / bounds[dir] == (o->idx + offset[dir]) / bounds[dir])) { if (game.cs.pushing++ > PUSH_DELAY && object_try_move(o, dir)) { object_move(game.po, dir); game.cs.pushing = 0; } return; } } object_try_move(game.po, dir); game.cs.pushing = 0; }
int loop_hook(t_env *e) { e->tick.frame_start = clock(); move_translate(e); move_rotate(e); e->key[KP] || e->key[KM] || e->mouse.kp || e->mouse.km ? move_zoom(e) : 0; e->key[MOUSE] ? mouse_orientation(e) : 0; e->key[FI] ? kswitch(&e->cam->filter.invert) : 0; e->key[FG] ? kswitch(&e->cam->filter.gray_scale) : 0; e->key[FGM] ? e->cam->filter.gamma += 0.05 : 0; e->key[FGP] ? e->cam->filter.gamma -= 0.05 : 0; e->mouse.lmb ? object_select(e) : 0; object_move(e, e->cam->selection); object_mouse_move(e, e->cam->selection); object_mouse_rotate(e, e->cam->selection); e->key[DEL] ? object_delete(e, e->cam->selection) : 0; e->mouse.kp = 0; e->mouse.km = 0; e->mouse.lmb = 0; e->mouse.rmb = 0; expose_hook(e); e->tick.frame = (clock() - e->tick.frame_start) / (float)CLOCKS_PER_SEC; return (0); }
int main() { SDL_Init(SDL_INIT_VIDEO); // SDL Initialization SDL_Window *window = SDL_CreateWindow("Roguelike", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, 0);//SDL_WINDOW_FULLSCREEN_DESKTOP); SDL_Renderer *renderer = SDL_CreateRenderer(window, 0, SDL_RENDERER_SOFTWARE); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); SDL_RenderSetLogicalSize(renderer, SCREEN_WIDTH, SCREEN_HEIGHT); SDL_Texture *screen = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, SCREEN_WIDTH, SCREEN_HEIGHT); // Set up our console PT_Console *console = PT_ConsoleInit(SCREEN_WIDTH, SCREEN_HEIGHT, GRID_ROW_COUNT, GRID_COL_COUNT); PT_ConsoleSetBitmapFont(console, "./terminal16x16.png", 0, 16, 16); game_init(); // Main game loop u32 delayTime = 1000 / FPS_LIMIT; u32 frameStart, frameTime = 0; i32 spareTime = 0; bool done = false; while (!done) { frameStart = SDL_GetTicks(); // Handle all events in the queue SDL_Event event; while (SDL_PollEvent(&event) != 0) { if (event.type == SDL_QUIT) { done = true; break; } if (event.type == SDL_KEYDOWN) { SDL_Keycode key = event.key.keysym.sym; switch (key) { case SDLK_UP: object_move(player, 0, -1); break; case SDLK_DOWN: object_move(player, 0, 1); break; case SDLK_LEFT: object_move(player, -1, 0); break; case SDLK_RIGHT: object_move(player, 1, 0); break; default: break; } } } // Render the current frame render_all(renderer, screen, console); // Avoid pegging the CPU at 100% by sleeping for a bit frameTime = SDL_GetTicks() - frameStart; spareTime = delayTime - frameTime; if (spareTime > 0) { SDL_Delay(spareTime); } } // Clean up SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; }
void run_object_single(obj_type *obj,int tick) { // spawning if (obj->spawning) object_spawn(obj); memmove(&obj->last_pnt,&obj->pnt,sizeof(d3pnt)); memmove(&obj->last_ang,&obj->ang,sizeof(d3ang)); // item counts obj->count++; if (obj->item_count!=0) obj->item_count--; // turning and looking if (obj->player) { if (!obj->input_freeze) { object_player_turn(obj); object_player_look(obj); } else { if (!obj->suspend) { object_turn(obj); } } object_fs_effect_run(tick,obj); } else { if (!obj->suspend) { object_turn(obj); } } object_thrust(obj); // watches object_watch(obj); // health recover object_health_recover(obj); // movement if (!obj->suspend) { object_auto_walk(obj); object_fix_motion(obj); object_movement(obj,&obj->forward_move); object_movement(obj,&obj->side_move); object_simple_movement(obj,&obj->vert_move); object_gravity(obj); object_fix_force(obj); object_move(obj); object_fix_bump_smooth(obj); object_ducking(obj); object_touch(obj); object_liquid(tick,obj); object_crush(obj,FALSE); item_pickup_check(obj); } // auto-growing object_grow_run(obj); // animation events if (obj->player) { object_event_animations(obj); } // death check object_death(obj); }