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