void wid_game_map_client_scroll_adjust (uint8_t adjust) { if (!player) { return; } widp w = player->wid; if (!w) { return; } uint32_t gridw; uint32_t gridh; wid_get_grid_dim(wid_game_map_client_grid_container, &gridw, &gridh); double fgridw = (double)gridw; double fgridh = (double)gridh; double winw = wid_get_width(wid_game_map_client_window); double winh = wid_get_height(wid_game_map_client_window); gridw -= winw; gridh -= winh; double playerx = wid_get_cx(w); double playery = wid_get_cy(w); playerx -= winw / 2.0; playery -= winh / 2.0; playerx /= fgridw; playery /= fgridh; if (adjust || (last_playery != playery)) { wid_move_to_vert_pct(wid_game_map_client_vert_scroll, playery); } if (adjust || (last_playerx != playerx)) { wid_move_to_horiz_pct(wid_game_map_client_horiz_scroll, playerx); } /* * Lock the level scroll bar so we don't adjust the level size when * explosions or anything else leaks over the edge. */ wid_game_map_client_grid_container->grid->bounds_locked = 1; last_playerx = playerx; last_playery = playery; }
void cloud_move (int jumped) { cloud *f; cloud *f_eo = clouds + nclouds; f = clouds; if (!player) { return; } widp w = player->wid; if (!w) { return; } verify(w); double playerx = wid_get_cx(w); double playery = wid_get_cy(w); static double last_playerx; static double last_playery; if (!last_playerx && !last_playery) { last_playerx = playerx; last_playery = playery; } double dx = playerx - last_playerx; double dy = playery - last_playery; last_playerx = playerx; last_playery = playery; if (jumped) { return; } f = clouds; while (f < f_eo) { f->x -= dx; f->y -= dy; double w = game.video_gl_width; double h = game.video_gl_height; if (f->x > w * 1.5) { f->x = -(w / 2) - myrand() % (int)(w / 2); f->y = myrand() % (int)h; } if (f->x < -w * 1.5) { f->x = w + myrand() % (int)(w / 2); f->y = myrand() % (int)h; } f++; } }