1 #include "attributes.h"
2 
3 #include "core/image.h"
4 #include "core/image_group_editor.h"
5 #include "core/string.h"
6 #include "game/resource.h"
7 #include "graphics/arrow_button.h"
8 #include "graphics/button.h"
9 #include "graphics/generic_button.h"
10 #include "graphics/graphics.h"
11 #include "graphics/image.h"
12 #include "graphics/lang_text.h"
13 #include "graphics/panel.h"
14 #include "graphics/screen.h"
15 #include "graphics/text.h"
16 #include "graphics/window.h"
17 #include "input/input.h"
18 #include "scenario/editor.h"
19 #include "scenario/property.h"
20 #include "widget/input_box.h"
21 #include "widget/minimap.h"
22 #include "widget/sidebar/editor.h"
23 #include "window/editor/allowed_buildings.h"
24 #include "window/editor/demand_changes.h"
25 #include "window/editor/invasions.h"
26 #include "window/editor/map.h"
27 #include "window/editor/price_changes.h"
28 #include "window/editor/requests.h"
29 #include "window/editor/special_events.h"
30 #include "window/editor/starting_conditions.h"
31 #include "window/editor/win_criteria.h"
32 #include "window/select_list.h"
33 
34 #define BRIEF_DESC_LENGTH 64
35 
36 static void button_starting_conditions(int param1, int param2);
37 static void button_requests(int param1, int param2);
38 static void button_enemy(int param1, int param2);
39 static void button_invasions(int param1, int param2);
40 static void button_allowed_buildings(int param1, int param2);
41 static void button_win_criteria(int param1, int param2);
42 static void button_special_events(int param1, int param2);
43 static void button_price_changes(int param1, int param2);
44 static void button_demand_changes(int param1, int param2);
45 static void change_climate(int param1, int param2);
46 static void change_image(int forward, int param2);
47 
48 static generic_button buttons[] = {
49     {212, 76, 250, 30, button_starting_conditions, button_none, 1, 0},
50     {212, 116, 250, 30, change_climate, button_none, 2, 0},
51     {212, 156, 250, 30, button_requests, button_none, 3, 0},
52     {212, 196, 250, 30, button_enemy, button_none, 4, 0},
53     {212, 236, 250, 30, button_invasions, button_none, 5, 0},
54     {212, 276, 250, 30, button_allowed_buildings, button_none, 6, 0},
55     {212, 316, 250, 30, button_win_criteria, button_none, 7, 0},
56     {212, 356, 250, 30, button_special_events, button_none, 8, 0},
57     {212, 396, 250, 30, button_price_changes, button_none, 9, 0},
58     {212, 436, 250, 30, button_demand_changes, button_none, 10, 0},
59 };
60 
61 static arrow_button image_arrows[] = {
62     {20, 424, 19, 24, change_image, 0, 0},
63     {44, 424, 21, 24, change_image, 1, 0},
64 };
65 
66 static struct {
67     int is_paused;
68     uint8_t brief_description[BRIEF_DESC_LENGTH];
69     int focus_button_id;
70 } data;
71 
72 static input_box scenario_description_input = {
73     92, 40, 19, 2, FONT_NORMAL_WHITE, 1,
74     data.brief_description, BRIEF_DESC_LENGTH
75 };
76 
start(void)77 static void start(void)
78 {
79     if (data.is_paused) {
80         input_box_resume(&scenario_description_input);
81     } else {
82         string_copy(scenario_brief_description(), data.brief_description, BRIEF_DESC_LENGTH);
83         input_box_start(&scenario_description_input);
84     }
85 }
86 
stop(int paused)87 static void stop(int paused)
88 {
89     if (paused) {
90         input_box_pause(&scenario_description_input);
91     } else {
92         input_box_stop(&scenario_description_input);
93     }
94     data.is_paused = paused;
95     scenario_editor_update_brief_description(data.brief_description);
96 }
97 
draw_background(void)98 static void draw_background(void)
99 {
100     window_editor_map_draw_all();
101 
102     graphics_in_dialog();
103 
104     outer_panel_draw(0, 28, 30, 28);
105 
106     button_border_draw(18, 278, 184, 144, 0);
107     image_draw(image_group(GROUP_EDITOR_SCENARIO_IMAGE) + scenario_image_id(), 20, 280);
108 
109     graphics_reset_dialog();
110 }
111 
draw_foreground(void)112 static void draw_foreground(void)
113 {
114     graphics_in_dialog();
115 
116     input_box_draw(&scenario_description_input);
117 
118     button_border_draw(212, 76, 250, 30, data.focus_button_id == 1);
119     lang_text_draw_centered(44, 88, 212, 85, 250, FONT_NORMAL_BLACK);
120 
121     lang_text_draw(44, 76, 32, 125, FONT_NORMAL_BLACK);
122     button_border_draw(212, 116, 250, 30, data.focus_button_id == 2);
123     lang_text_draw_centered(44, 77 + scenario_property_climate(), 212, 125, 250, FONT_NORMAL_BLACK);
124 
125     lang_text_draw(44, 40, 32, 165, FONT_NORMAL_BLACK);
126     button_border_draw(212, 156, 250, 30, data.focus_button_id == 3);
127 
128     editor_request request;
129     scenario_editor_request_get(0, &request);
130     if (request.resource) {
131         lang_text_draw_year(scenario_property_start_year() + request.year, 222, 165, FONT_NORMAL_BLACK);
132         int width = text_draw_number(request.amount, '@', " ", 312, 165, FONT_NORMAL_BLACK);
133         int offset = request.resource + resource_image_offset(request.resource, RESOURCE_IMAGE_ICON);
134         image_draw(image_group(GROUP_EDITOR_RESOURCE_ICONS) + offset, 322 + width, 160);
135     } else {
136         lang_text_draw_centered(44, 19, 212, 165, 250, FONT_NORMAL_BLACK);
137     }
138 
139     lang_text_draw(44, 41, 32, 205, FONT_NORMAL_BLACK);
140     button_border_draw(212, 196, 250, 30, data.focus_button_id == 4);
141     lang_text_draw_centered(37, scenario_property_enemy(), 212, 205, 250, FONT_NORMAL_BLACK);
142 
143     lang_text_draw(44, 42, 32, 245, FONT_NORMAL_BLACK);
144     button_border_draw(212, 236, 250, 30, data.focus_button_id == 5);
145 
146     editor_invasion invasion;
147     scenario_editor_invasion_get(0, &invasion);
148     if (invasion.type) {
149         lang_text_draw_year(scenario_property_start_year() + invasion.year, 222, 245, FONT_NORMAL_BLACK);
150         int width = text_draw_number(invasion.amount, '@', " ", 302, 245, FONT_NORMAL_BLACK);
151         lang_text_draw(34, invasion.type, 302 + width, 245, FONT_NORMAL_BLACK);
152     } else {
153         lang_text_draw_centered(44, 20, 212, 245, 250, FONT_NORMAL_BLACK);
154     }
155 
156     button_border_draw(212, 276, 250, 30, data.focus_button_id == 6);
157     lang_text_draw_centered(44, 44, 212, 285, 250, FONT_NORMAL_BLACK);
158 
159     button_border_draw(212, 316, 250, 30, data.focus_button_id == 7);
160     lang_text_draw_centered(44, 45, 212, 325, 250, FONT_NORMAL_BLACK);
161 
162     button_border_draw(212, 356, 250, 30, data.focus_button_id == 8);
163     lang_text_draw_centered(44, 49, 212, 365, 250, FONT_NORMAL_BLACK);
164 
165     button_border_draw(212, 396, 250, 30, data.focus_button_id == 9);
166     lang_text_draw_centered(44, 95, 212, 405, 250, FONT_NORMAL_BLACK);
167 
168     button_border_draw(212, 436, 250, 30, data.focus_button_id == 10);
169     lang_text_draw_centered(44, 94, 212, 445, 250, FONT_NORMAL_BLACK);
170 
171     arrow_buttons_draw(0, 0, image_arrows, 2);
172 
173     graphics_reset_dialog();
174 }
175 
handle_input(const mouse * m,const hotkeys * h)176 static void handle_input(const mouse *m, const hotkeys *h)
177 {
178     const mouse *m_dialog = mouse_in_dialog(m);
179     if (input_box_handle_mouse(m_dialog, &scenario_description_input) ||
180         generic_buttons_handle_mouse(m_dialog, 0, 0, buttons, 10, &data.focus_button_id) ||
181         arrow_buttons_handle_mouse(m_dialog, 0, 0, image_arrows, 2, 0) ||
182         widget_sidebar_editor_handle_mouse_attributes(m)) {
183         return;
184     }
185     if (input_go_back_requested(m, h)) {
186         stop(0);
187         window_editor_map_show();
188     }
189 }
190 
button_starting_conditions(int param1,int param2)191 static void button_starting_conditions(int param1, int param2)
192 {
193     stop(1);
194     window_editor_starting_conditions_show();
195 }
196 
button_requests(int param1,int param2)197 static void button_requests(int param1, int param2)
198 {
199     stop(1);
200     window_editor_requests_show();
201 }
202 
set_enemy(int enemy)203 static void set_enemy(int enemy)
204 {
205     scenario_editor_set_enemy(enemy);
206     start();
207 }
208 
button_enemy(int param1,int param2)209 static void button_enemy(int param1, int param2)
210 {
211     stop(1);
212     window_select_list_show(screen_dialog_offset_x() + 12, screen_dialog_offset_y() + 40, 37, 20, set_enemy);
213 }
214 
button_invasions(int param1,int param2)215 static void button_invasions(int param1, int param2)
216 {
217     stop(1);
218     window_editor_invasions_show();
219 }
220 
button_allowed_buildings(int param1,int param2)221 static void button_allowed_buildings(int param1, int param2)
222 {
223     stop(1);
224     window_editor_allowed_buildings_show();
225 }
226 
button_win_criteria(int param1,int param2)227 static void button_win_criteria(int param1, int param2)
228 {
229     stop(1);
230     window_editor_win_criteria_show();
231 }
232 
button_special_events(int param1,int param2)233 static void button_special_events(int param1, int param2)
234 {
235     stop(1);
236     window_editor_special_events_show();
237 }
238 
button_price_changes(int param1,int param2)239 static void button_price_changes(int param1, int param2)
240 {
241     stop(1);
242     window_editor_price_changes_show();
243 }
244 
button_demand_changes(int param1,int param2)245 static void button_demand_changes(int param1, int param2)
246 {
247     stop(1);
248     window_editor_demand_changes_show();
249 }
250 
change_climate(int param1,int param2)251 static void change_climate(int param1, int param2)
252 {
253     scenario_editor_cycle_climate();
254     image_load_climate(scenario_property_climate(), 1, 0);
255     widget_minimap_invalidate();
256     window_request_refresh();
257 }
258 
change_image(int forward,int param2)259 static void change_image(int forward, int param2)
260 {
261     scenario_editor_cycle_image(forward);
262     window_request_refresh();
263 }
264 
window_editor_attributes_show(void)265 void window_editor_attributes_show(void)
266 {
267     window_type window = {
268         WINDOW_EDITOR_ATTRIBUTES,
269         draw_background,
270         draw_foreground,
271         handle_input
272     };
273     start();
274     window_show(&window);
275 }
276