ui.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. #include "eruta.h"
  2. #include "image.h"
  3. #include "store.h"
  4. #include "zori.h"
  5. #include "zori_style.h"
  6. #include "zori_screen.h"
  7. #include "zori_console.h"
  8. #include "zori_button.h"
  9. #include "zori_page.h"
  10. #include "zori_menu.h"
  11. #include "zori_longtext.h"
  12. #include "draw.h"
  13. #include "monolog.h"
  14. #include "ui.h"
  15. /* This file contains the concrete implementation of the Eruta GUI
  16. * and it's various GUI screens and pages. */
  17. static struct ui_state the_ui_state;
  18. char POEM_TEXT[] = "After mankind's summer, winter suddenly came"
  19. "Most reached for the stars, but some remained"
  20. "The earth scarred by the Ancients unhostpitable"
  21. "The hopes low, and so much wisdom forgotten"
  22. "Yet when it seemed the last hour struck"
  23. "Our hope returned, a savior arose"
  24. "Lord Kei, who by Creator's grace"
  25. "Restored the Trees that guard us all from harm"
  26. "Thus ushered in a new millennial spring"
  27. "Lord Kei, watch over us and protect us"
  28. "Until the Travellers return with bounty of the stars";
  29. char INTRO_TEXT[] = "Millennia have passed since mankind first traveled to the moon. "
  30. "Civilizations rose as never before, yet to fall again. "
  31. "When all hope seemed lost, the 21 trees sprouted from the earth. "
  32. "They brought mysterious powers that protected and strengthened mankind. "
  33. "Hi!\n\n"
  34. "Hello µ world, this is me, 無 life should be\nfun for everyone!";
  35. char INTRO_TEXT2[] = "Something happened, and I was changed!";
  36. zori_id ui_state_make_sub_menu(zori_id parent, int x, int y, int w, int bh);
  37. /* Set up HUD. */
  38. void ui_state_init_hud(struct ui_state * ui,
  39. zori_display * display, zori_font * font) {
  40. Rebox box;
  41. ui->hud.page = zori_new_page(-1, ui->screen);
  42. LOG_NOTE("HUD page: %d\n", ui->hud.page);
  43. box = rebox_make(10, 300, 620, 200);
  44. ui->hud.dialog = zori_new_longtext(-1, ui->hud.page, &box, INTRO_TEXT);
  45. }
  46. /* Set up Zori GUI. */
  47. void ui_state_init(struct ui_state * ui,
  48. zori_display * display,
  49. zori_font * font
  50. ) {
  51. struct zori_style style;
  52. Rebox box;
  53. memset(&style, 0, sizeof(style));
  54. style.text.font = font;
  55. style.text.color = color_rgb(255,255,255);
  56. style.text.flags = ZORI_FONT_ALIGN_CENTRE;
  57. style.back.color = color_rgba(0, 16, 64, 128);
  58. if ( !ZORI_ID_OK_P(zori_start(&style)) ) {
  59. LOG_ERROR( "Out of memory when allocating GUI.");
  60. return;
  61. }
  62. if (zori_start(&style) != ZORI_ID_OK) {
  63. LOG_ERROR( "Cannot set up ZORI UI screen.");
  64. return;
  65. }
  66. ui->main.background_image = store_load_bitmap_id(1000, "/image/background/eruta_mainmenu.png");
  67. ui->mouse_image = store_load_bitmap_id(1001, "image/gin/fountain-pen_32.png");
  68. ui->keyjoy_image = store_load_bitmap_id(1002, "image/gin/fountain-pen_32.png");
  69. if (ui->main.background_image < 0) {
  70. LOG_ERROR( "Cannot load main menu background.");
  71. }
  72. if (ui->mouse_image < 0) {
  73. LOG_ERROR( "Cannot load mouse cursor image.");
  74. }
  75. if (ui->keyjoy_image < 0) {
  76. LOG_ERROR( "Cannot load keyjoy cursor image.");
  77. }
  78. draw_convert_average_to_alpha(store_get_bitmap(ui->mouse_image), al_map_rgb(255,255,255));
  79. draw_convert_average_to_alpha(store_get_bitmap(ui->keyjoy_image), al_map_rgb(255,255,255));
  80. ui->screen = zori_new_screen(-1, display);
  81. if (!ZORI_ID_OK_P(ui->screen)) {
  82. LOG_ERROR( "Cannot set up main screen.");
  83. return;
  84. }
  85. ui->main.page = zori_new_page(-1, ui->screen);
  86. LOG_NOTE("Main page: %d\n", ui->main.page);
  87. box = rebox_make(280, 140, 140, 240);
  88. ui->main.menu = zori_new_menu(-1, ui->main.page, &box);
  89. zori_set_background_bitmap(ui->main.page,
  90. store_get_bitmap(ui->main.background_image));
  91. LOG_NOTE("Main menu: %d\n", ui->main.menu);
  92. zori_set_text_font_flags(ui->main.menu, ZORI_FONT_ALIGN_CENTRE);
  93. {
  94. Rebox box = rebox_make(300, 160, 100, 60);
  95. ui->main.button.resume = zori_new_button(-1, ui->main.menu, &box, "Continue");
  96. // zori_set_text_font_flags(ui->main.button.resume, ZORI_FONT_ALIGN_CENTRE);
  97. LOG_NOTE("Button: %d\n", ui->main.button.resume);
  98. }
  99. {
  100. Rebox box = rebox_make(300, 260, 100, 60);
  101. ui->main.button.new = zori_new_button(-1, ui->main.menu, &box, "New");
  102. zori_set_text_font_flags(ui->main.button.new, ZORI_FONT_ALIGN_RIGHT);
  103. LOG_NOTE("Button: %d\n", ui->main.button.new);
  104. }
  105. ui_state_init_hud(ui, display, font);
  106. }
  107. void ui_handle_main_menu(struct ui_state * ui, int selected) {
  108. LOG_NOTE("Main menu selected: %d\n", selected);
  109. if (selected == ui->main.button.resume) {
  110. LOG_NOTE("Resume");
  111. } else if (selected == ui->main.button.new) {
  112. LOG_NOTE("New");
  113. }
  114. }
  115. void ui_state_update(struct ui_state * ui,
  116. zori_display * display, zori_font * font) {
  117. int value = 0;
  118. if ((value = zori_result(ui->main.menu))) {
  119. ui_handle_main_menu(ui, value);
  120. }
  121. }
  122. #ifdef COMMENT_
  123. /* Direct mode operation? */
  124. INTRO_TEXT2 =
  125. def make_sub_menu(parent, x, y, w, h, bh)
  126. sub_menu = parent.make_menu(x, y, w, h, nil)
  127. sub_menu.make_button(x, y + 20, w - 20, bh, "Sub choice 1") do
  128. puts "choice 1"
  129. end
  130. sub_menu.make_button(x, y + 30 + bh, w - 20, bh, "Sub choice 2") do
  131. puts "choice 2"
  132. end
  133. sub_menu.make_button(x, y + 40 + 2* bh, w - 20, bh, "Sub choice 3") do
  134. puts "choice 3"
  135. end
  136. sub_menu.fit_children
  137. sub_menu.hide
  138. return sub_menu
  139. end
  140. def do_main_menu
  141. main_music = Music.load(:main, '/music/nethis-the_writer.ogg')
  142. $lote = nil
  143. $lobe = nil
  144. if PLAY_MUSIC
  145. res = main_music.play!
  146. end
  147. # res = nil
  148. # $main_menu = MainMenu.new
  149. # $main_menu.active = true
  150. Zori.make_page(:default) do |m|
  151. State.talk_box = m.make_longtext(10, 310, 620, 160, "Testing 1 2 3")
  152. State.talk_box.graph.each { |g| g.font = Eruta::Zori.font.id }
  153. State.talk_box.delay = 0.1
  154. State.talk_box.page_lines = 5
  155. State.talk_box.page = 0
  156. State.talk_box.hide
  157. end
  158. Zori.make_page(:main_menu) do |m|
  159. if MAIN_BACKGROUND
  160. main_back = Bitmap.load(:main_back,
  161. '/image/background/eruta_mainmenu.png')
  162. p main_back, main_back.width, main_back.height, main_back.name, main_back.id
  163. main_back = Bitmap.load(:main_back,
  164. '/image/background/eruta_mainmenu.png')
  165. p main_back, main_back.width, main_back.height, main_back.name, main_back.id
  166. p Bitmap[:main_back]
  167. p Store[:bitmap_main_back]
  168. m.graph_image(0, 0, main_back.id)
  169. end
  170. main_menu = m.make_menu(250, 190, 120, 440, nil)
  171. ma = main_menu
  172. main_button_1 = ma.make_button(260, 200, 100, 30, "Continue")
  173. sub_menu = make_sub_menu(main_button_1, 50, 190, 120, 440, 30)
  174. sub_menu.hide
  175. main_button_2 = ma.make_button(260, 240, 100, 30, "New") do
  176. do_start_test_map
  177. Zori.go(:default)
  178. end
  179. main_button_3 = ma.make_button(260, 280, 100, 30, "Settings") do
  180. Zori.go(:settings)
  181. end
  182. main_button_4 = ma.make_button(260, 320, 100, 30, "Instructions")
  183. main_button_5 = ma.make_button(260, 360, 100, 30, "µ£éè")
  184. main_button_5 << sub_menu
  185. main_button_5= ma.make_button(260, 400, 100, 30, "Quit") do
  186. Eruta.quit
  187. end
  188. main_menu.fit_children
  189. end
  190. Zori.make_page(:settings) do |se|
  191. lote2 = se.make_longtext(100, 10, 160, 100, INTRO_TEXT)
  192. lote2.delay = 1
  193. lote2.page = 0
  194. lote2.page_lines = 3
  195. # $lote2.line_stop = 999990
  196. settings_menu = se.make_menu(480, 380, 120, 440, nil)
  197. sm = settings_menu
  198. settings_ok_button = sm.make_button(500, 300, 100, 30, "Font 1") do
  199. if lote2
  200. lote2.graph.each { |g| g.font = 0 }
  201. end
  202. end
  203. settings_ok_button = sm.make_button(500, 350, 100, 30, "Font 2") do
  204. if lote2
  205. lote2.graph.each { |g| g.font = Eruta::Zori.font.id }
  206. end
  207. lote2.text = INTRO_TEXT2
  208. end
  209. settings_ok_button = sm.make_button(500, 400, 100, 30, "OK") do
  210. Zori.go(:main_menu)
  211. if lote
  212. lote.close
  213. lote = nil
  214. end
  215. end
  216. sm.fit_children
  217. end
  218. Zori[:main_menu].hide
  219. Zori[:settings].hide
  220. Zori.go(:main_menu)
  221. end
  222. #endif