with core, ui, effect, attribute, skill, resource, faction, might, magic, item, unit, construction, world, menu; use menu; package body menu is ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ draw_offset : constant integer := 16; icon_offset : constant integer := 4; icon_size : constant integer := 32; offset : constant integer := icon_size + 2 * icon_offset; button_width : constant integer := offset + 24 * 8; button_height : constant integer := offset; ------------------------------------------------------------------------------------------ function make_button (element_index : in integer; text : in core.short_string; icon : in core.sprite) return element is begin return (button, 0, text, icon, draw_offset, draw_offset + element_index * offset, button_width, button_height); end make_button; ------------------------------------------------------------------------------------------ procedure configure is begin trait (attribute_information) := ("Attribute Information ", true, attribute.count, 10, 100, 64, new element_array (0 .. attribute.count - 1)); trait (skill_information) := ("Skill Information ", true, skill.count, 10, 700, 64, new element_array (0 .. skill.count - 1)); trait (resource_information) := ("Resource Information ", true, resource.count, 10, 400, 64, new element_array (0 .. resource.count - 1)); trait (none) := ("-- ", true, 2, 10, 0, 0, new element_array (0 .. 1)); -- for index in 0 .. attribute.count - 1 loop trait (attribute_information).elements (index) := make_button (index, attribute.name (index), attribute.icon (index)); end loop; -- for index in 0 .. skill.count - 1 loop trait (skill_information).elements (index) := make_button (index, skill.name (index), skill.icon (index)); end loop; -- for index in 0 .. resource.count - 1 loop trait (resource_information).elements (index) := make_button (index, resource.name (index), resource.icon (index)); end loop; -- for index in 0 .. 1 loop trait (none).elements (index) := make_button (index, "-- ", resource.icon (0)); end loop; end configure; ------------------------------------------------------------------------------------------ procedure synchronize is limitation : integer; begin mouse_over_menu := none; mouse_over_menu_element := -1; -- for index in codex loop if trait (index).hide then goto next; end if; limitation := (if trait (index).length < trait (index).height then trait (index).length else trait (index).height); -- if core.cursor_x > trait (index).x and core.cursor_x < trait (index).x + 2 * draw_offset + offset + 24 * 8 and core.cursor_y > trait (index).y and core.cursor_y < trait (index).y + limitation * offset + 2 * draw_offset then mouse_over_menu := index; end if; -- if mouse_over_menu /= none then for element_index in 0 .. limitation - 1 loop if core.cursor_x > trait (index).x + trait (index).elements (element_index).x and core.cursor_x < trait (index).x + trait (index).elements (element_index).x + trait (index).elements (element_index).width and core.cursor_y > trait (index).y + trait (index).elements (element_index).y and core.cursor_y < trait (index).y + trait (index).elements (element_index).y + trait (index).elements (element_index).height then mouse_over_menu_element := element_index; end if; end loop; return; end if; <> end loop; end synchronize; ------------------------------------------------------------------------------------------ procedure draw (index : in codex; x, y : in integer; center : in boolean) is scroll_bar : constant boolean := (if trait (index).length > trait (index).height then true else false); limitation : constant integer := (if scroll_bar then trait (index).height else trait (index).length); width : constant integer := 2 * draw_offset + offset + 24 * 8; height : constant integer := limitation * offset + 2 * draw_offset; begin if index = none then return; end if; -- trait (index).hide := false; trait (index).x := (if center then (core.window_width - width) / 2 else x); trait (index).y := (if center then (core.window_height - height) / 2 else y); -- ui.draw_title_bar (trait (index).x, trait (index).y, width, trait (index).title); ui.draw_tiny_menu (trait (index).x, trait (index).y, width, height, true); -- for element_index in 0 .. limitation - 1 loop ui.draw_frame (trait (index).x + draw_offset, trait (index).y + draw_offset + element_index * offset, width - 2 * draw_offset, offset); -- core.draw (trait (index).elements (element_index).icon, trait (index).x + draw_offset + icon_offset, trait (index).y + draw_offset + icon_offset + element_index * offset); core.write (trait (index).elements (element_index).text, trait (index).x + draw_offset + offset, trait (index).y + draw_offset + 2 * icon_offset + element_index * offset); end loop; -- if scroll_bar then ui.draw_scroll_bar (trait (index).x + width - draw_offset, trait (index).y + draw_offset, height - 2 * draw_offset, 0); end if; end draw; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ end menu;