static void initialize_menu_entry_renderer(struct menu_entry_renderer *self, const struct b6_clock *clock, struct renderer *renderer, struct renderer_base *base, const struct fixed_font *normal_font, const struct fixed_font *bright_font, float x, float y, const struct b6_utf8 *utf8) { static const struct renderer_observer_ops renderer_observer_ops = { .on_render = menu_entry_renderer_on_render, }; unsigned long int len = utf8->nchars; unsigned short int font_w = get_fixed_font_width(normal_font); unsigned short int font_h = get_fixed_font_height(normal_font); initialize_toolkit_label(&self->label[0], renderer, normal_font, len * font_w, font_h, base, x - len * 16 / 2, y, len * 16, 16); set_toolkit_label(&self->label[0], utf8); enable_toolkit_label_shadow(&self->label[0]); initialize_toolkit_label(&self->label[1], renderer, bright_font, len * font_w, font_h, base, x - len * 16 / 2, y, len * 16, 16); set_toolkit_label(&self->label[1], utf8); enable_toolkit_label_shadow(&self->label[1]); hide_toolkit_label(&self->label[1]); self->clock = clock; setup_renderer_observer(&self->renderer_observer, "menu_entry", &renderer_observer_ops); }
static int hall_of_fame_phase_init(struct phase *up, const struct phase *prev) { static const struct controller_observer_ops controller_observer_ops = { .on_key_pressed = on_key_pressed, .on_text_input = on_text_input, }; static const struct renderer_observer_ops renderer_observer_ops = { .on_render = on_render, }; struct hall_of_fame_phase *self = b6_cast_of(up, struct hall_of_fame_phase, up); struct renderer *renderer = get_engine_renderer(up->engine); struct renderer_base *root; unsigned short int font_w, font_h; struct hall_of_fame_iterator iter; struct data_entry *entry; struct istream *is; const char *skin_id = hof_skin ? hof_skin : get_skin_id(); int i; self->array = open_hall_of_fame(&up->engine->hall_of_fame, up->engine->layout_provider->id, up->engine->game_config->entry.id); if (!self->array) return -1; if (b6_utf8_is_empty(&self->name.utf8)) { struct b6_utf8 utf8; if (user || (user = get_user_name())) b6_utf8_from_ascii(&utf8, user); else b6_clone_utf8(&utf8, B6_UTF8("PLAYER")); b6_clear_utf8_string(&self->name); b6_extend_utf8_string(&self->name, &utf8); } self->entry = NULL; self->quit = 0; if (prev == lookup_phase(B6_UTF8("game"))) { struct game_result game_result; get_last_game_result(up->engine, &game_result); self->entry = amend_hall_of_fame(self->array, game_result.level + 1, game_result.score); if (!self->entry) self->quit = 1; else alter_hall_of_fame_entry(self->entry, &self->name.utf8); } root = get_renderer_base(renderer); if (make_font(&self->font, skin_id, HOF_FONT_DATA_ID)) return -1; font_w = get_fixed_font_width(&self->font); font_h = get_fixed_font_height(&self->font); if ((self->background = create_renderer_tile(renderer, root, 0, 0, 640, 480, NULL))) set_renderer_tile_texture(self->background, make_texture( renderer, skin_id, HOF_BACKGROUND_DATA_ID)); if ((self->panel = create_renderer_tile(renderer, root, 0, 0, 112, 480, NULL))) set_renderer_tile_texture(self->panel, make_texture( renderer, skin_id, HOF_PANEL_DATA_ID)); for (i = 0; i < b6_card_of(self->label); i += 1) { const unsigned short int u = 2 + 32 * font_w, v = 2 + font_h; const float x = 96, y = 50 + i * 40; const float w = 2 + 32 * 16, h = 2 + 16; initialize_toolkit_label(&self->label[i], renderer, &self->font, u, v, root, x, y, w, h); enable_toolkit_label_shadow(&self->label[i]); } reset_hall_of_fame_iterator(&iter, self->array); for (i = 0; i < b6_card_of(self->label); i += 1) { struct b6_json_object *entry; if (!hall_of_fame_iterator_has_next(&iter)) break; entry = hall_of_fame_iterator_get_next(&iter); if (entry == self->entry) self->rank = i; setup_label(self, i, entry); } for (; i < b6_card_of(self->label); i += 1) hide_toolkit_label(&self->label[i]); if (self->entry) { float x = self->label[self->rank].image[0].tile->x + (16 + self->name.utf8.nchars) * 16; float y = self->label[self->rank].image[0].tile->y; self->cursor_base = create_renderer_base_or_die(renderer, root, "cursor", x, y); initialize_toolkit_label(&self->cursor_label, renderer, &self->font, 16, 16, self->cursor_base, 1, 1, 16, 16); enable_toolkit_label_shadow(&self->cursor_label); set_toolkit_label(&self->cursor_label, &b6_utf8_char['#']); } else self->cursor_base = NULL; add_renderer_observer(renderer, setup_renderer_observer( &self->renderer_observer, "hof", &renderer_observer_ops)); add_controller_observer(get_engine_controller(up->engine), setup_controller_observer( &self->controller_observer, &controller_observer_ops)); self->music = 0; initialize_fade_io(&self->fade_io, "hof_fade_io", renderer, up->engine->clock, 0., 1., 5e-6); if (self->quit) { set_fade_io_target(&self->fade_io, 0.); return 0; } if ((entry = lookup_data(skin_id, audio_data_type, HOF_MUSIC_DATA_ID)) && (is = get_data(entry))) { int retval = up->engine->mixer->ops->load_music_from_stream( up->engine->mixer, is); if (!retval) { play_music(up->engine->mixer); self->music = 1; } else log_w(_s("could not load background music")); put_data(entry, is); } else log_w(_s("cannot find background music")); return 0; }