1 #include "chief.h"
2 
3 #include "city/data_private.h"
4 #include "city/figures.h"
5 #include "city/finance.h"
6 #include "city/health.h"
7 #include "city/houses.h"
8 #include "city/labor.h"
9 #include "city/migration.h"
10 #include "city/military.h"
11 #include "city/population.h"
12 #include "city/resource.h"
13 #include "city/sentiment.h"
14 #include "core/calc.h"
15 #include "graphics/image.h"
16 #include "graphics/lang_text.h"
17 #include "graphics/panel.h"
18 #include "graphics/text.h"
19 #include "scenario/invasion.h"
20 #include "scenario/property.h"
21 #include "translation/translation.h"
22 
23 
24 #define ADVISOR_HEIGHT 24
25 #define X_OFFSET 232
26 
draw_title(int y,int text_id)27 static void draw_title(int y, int text_id)
28 {
29     image_draw(image_group(GROUP_BULLET), 32, y + 1);
30     lang_text_draw(61, text_id, 52, y, FONT_NORMAL_WHITE);
31 
32 }
33 
draw_background(void)34 static int draw_background(void)
35 {
36     int width;
37 
38     outer_panel_draw(0, 0, 40, ADVISOR_HEIGHT);
39     image_draw(image_group(GROUP_ADVISOR_ICONS) + 11, 10, 10);
40 
41     lang_text_draw(61, 0, 60, 12, FONT_LARGE_BLACK);
42     inner_panel_draw(24, 60, 37, 17);
43 
44     // workers
45     draw_title(66, 1);
46     if (city_labor_unemployment_percentage() > 0) {
47         width = lang_text_draw(61, 12, X_OFFSET, 66, FONT_NORMAL_RED);
48         width += text_draw_percentage(city_labor_unemployment_percentage(), X_OFFSET + width, 66, FONT_NORMAL_RED);
49         text_draw_number(city_labor_workers_unemployed() - city_labor_workers_needed(), '(', ")",
50             X_OFFSET + width, 66, FONT_NORMAL_RED, 0);
51     } else if (city_labor_workers_needed() > 0) {
52         width = lang_text_draw(61, 13, X_OFFSET, 66, FONT_NORMAL_RED);
53         lang_text_draw_amount(8, 12, city_labor_workers_needed(), X_OFFSET + width, 66, FONT_NORMAL_RED);
54     } else {
55         lang_text_draw(61, 14, X_OFFSET, 66, FONT_NORMAL_GREEN);
56     }
57 
58     // finance
59     draw_title(86, 2);
60     int treasury = city_finance_treasury();
61     int balance_last_year = city_finance_overview_last_year()->balance;
62     if (treasury > balance_last_year) {
63         width = lang_text_draw(61, 15, X_OFFSET, 86, FONT_NORMAL_GREEN);
64         text_draw_money(treasury - balance_last_year, X_OFFSET + width, 86, FONT_NORMAL_GREEN);
65     } else if (treasury < balance_last_year) {
66         width = lang_text_draw(61, 16, X_OFFSET, 86, FONT_NORMAL_RED);
67         text_draw_money(balance_last_year - treasury, X_OFFSET + width, 86, FONT_NORMAL_RED);
68     } else {
69         lang_text_draw(61, 17, X_OFFSET, 86, FONT_NORMAL_GREEN);
70     }
71 
72     // migration
73     draw_title(106, 3);
74     if (city_figures_total_invading_enemies() > 3) {
75         lang_text_draw(61, 79, X_OFFSET, 106, FONT_NORMAL_GREEN);
76     } else if (city_migration_newcomers() >= 5) {
77         lang_text_draw(61, 25, X_OFFSET, 106, FONT_NORMAL_GREEN);
78     } else if (city_migration_no_room_for_immigrants()) {
79         lang_text_draw(61, 18, X_OFFSET, 106, FONT_NORMAL_RED);
80     } else if (city_migration_percentage() >= 80) {
81         lang_text_draw(61, 25, X_OFFSET, 106, FONT_NORMAL_GREEN);
82     } else {
83         int text_group = 61;
84         int text_id;
85         switch (city_migration_no_immigration_cause()) {
86             case NO_IMMIGRATION_LOW_WAGES: text_id = 19; break;
87             case NO_IMMIGRATION_NO_JOBS: text_id = 20; break;
88             case NO_IMMIGRATION_NO_FOOD: text_id = 21; break;
89             case NO_IMMIGRATION_HIGH_TAXES: text_id = 22; break;
90             case NO_IMMIGRATION_MANY_TENTS: text_id = 70; break;
91             case NO_IMMIGRATION_LOW_MOOD: text_id = 71; break;
92             case NO_IMMIGRATION_SQUALOR:
93                 text_group = CUSTOM_TRANSLATION;
94                 text_id = TR_ADVISOR_CHIEF_NO_IMMIGRATION_SQUALOR;
95                 break;
96             default: text_id = 0; break;
97         }
98         if (text_id) {
99             lang_text_draw(text_group, text_id, X_OFFSET, 106, FONT_NORMAL_RED);
100         }
101     }
102 
103     // housing capacity
104     image_draw(image_group(GROUP_BULLET), 32, 126 + 1);
105     text_draw(translation_for(TR_HEADER_HOUSING), 52, 126, FONT_NORMAL_WHITE, 0);
106 
107     if (!city_population_open_housing_capacity()) {
108         width = text_draw(translation_for(TR_ADVISOR_HOUSING_NO_ROOM), X_OFFSET, 126, FONT_NORMAL_GREEN, 0);
109     } else {
110         width = text_draw(translation_for(TR_ADVISOR_HOUSING_ROOM), X_OFFSET, 126, FONT_NORMAL_GREEN, 0);
111         text_draw_number(city_population_open_housing_capacity(), '@', " ", X_OFFSET + width, 126, FONT_NORMAL_GREEN, 0);
112     }
113 
114     // food stocks
115     draw_title(146, 4);
116     if (scenario_property_rome_supplies_wheat()) {
117         lang_text_draw(61, 26, X_OFFSET, 146, FONT_NORMAL_GREEN);
118     } else if (city_resource_food_supply_months() > 0) {
119         width = lang_text_draw(61, 28, X_OFFSET, 146, FONT_NORMAL_GREEN);
120         lang_text_draw_amount(8, 4, city_resource_food_supply_months(), X_OFFSET + width, 146, FONT_NORMAL_GREEN);
121     } else {
122         lang_text_draw(61, 27, X_OFFSET, 146, FONT_NORMAL_RED);
123     }
124 
125     // food consumption
126     draw_title(166, 62);
127     if (scenario_property_rome_supplies_wheat()) {
128         lang_text_draw(61, 26, X_OFFSET, 166, FONT_NORMAL_GREEN);
129     } else {
130         int pct = city_resource_food_percentage_produced();
131         if (pct > 150) {
132             lang_text_draw(61, 63, X_OFFSET, 166, FONT_NORMAL_GREEN);
133         } else if (pct > 105) {
134             lang_text_draw(61, 64, X_OFFSET, 166, FONT_NORMAL_GREEN);
135         } else if (pct > 95) {
136             lang_text_draw(61, 65, X_OFFSET, 166, FONT_NORMAL_GREEN);
137         } else if (pct > 75) {
138             lang_text_draw(61, 66, X_OFFSET, 166, FONT_NORMAL_RED);
139         } else if (pct > 30) {
140             lang_text_draw(61, 67, X_OFFSET, 166, FONT_NORMAL_RED);
141         } else if (pct > 0) {
142             lang_text_draw(61, 68, X_OFFSET, 166, FONT_NORMAL_RED);
143         } else {
144             lang_text_draw(61, 69, X_OFFSET, 166, FONT_NORMAL_RED);
145         }
146     }
147 
148     // military
149     draw_title(186, 5);
150 
151     int food_text = 0;
152     int food_stress = city_data.mess_hall.food_stress_cumulative;
153 
154     if (food_stress > 60) {
155         food_text = TR_ADVISOR_LEGION_FOOD_CRITICAL;
156     } else if (food_stress > 40) {
157         food_text = TR_ADVISOR_LEGION_FOOD_NEEDED;
158     }
159     if (food_text && city_figures_soldiers() > 0) {
160         text_draw(translation_for(food_text), X_OFFSET, 186, FONT_NORMAL_RED, 0);
161     } else if (city_figures_imperial_soldiers()) {
162         lang_text_draw(61, 76, X_OFFSET, 186, FONT_NORMAL_RED);
163     } else if (city_figures_enemies()) {
164         lang_text_draw(61, 75, X_OFFSET, 186, FONT_NORMAL_RED);
165     } else if (scenario_invasion_exists_upcoming()) {
166         lang_text_draw(61, 74, X_OFFSET, 186, FONT_NORMAL_RED);
167     } else if (city_military_distant_battle_roman_army_is_traveling()) {
168         lang_text_draw(61, 78, X_OFFSET, 186, FONT_NORMAL_GREEN);
169     } else if (city_military_months_until_distant_battle() > 0) {
170         lang_text_draw(61, 77, X_OFFSET, 186, FONT_NORMAL_RED);
171     } else if (city_figures_soldiers() > 0) { // FIXED was ">=0" (always true)
172         lang_text_draw(61, 73, X_OFFSET, 186, FONT_NORMAL_GREEN);
173     } else {
174         lang_text_draw(61, 72, X_OFFSET, 186, FONT_NORMAL_GREEN);
175     }
176 
177     // crime
178     draw_title(206, 6);
179     if (city_figures_rioters()) {
180         lang_text_draw(61, 33, X_OFFSET, 206, FONT_NORMAL_RED);
181     } else if (city_figures_criminals() > 10) {
182         lang_text_draw(61, 32, X_OFFSET, 206, FONT_NORMAL_RED);
183     } else if (city_figures_criminals()) {
184         lang_text_draw(61, 31, X_OFFSET, 206, FONT_NORMAL_RED);
185     } else if (city_figures_protesters() || city_sentiment_crime_cooldown()) {
186         lang_text_draw(61, 30, X_OFFSET, 206, FONT_NORMAL_RED);
187     } else {
188         lang_text_draw(61, 29, X_OFFSET, 206, FONT_NORMAL_GREEN);
189     }
190 
191     // health
192     draw_title(226, 7);
193     int health_rate = city_health();
194     if (health_rate >= 40) {
195         lang_text_draw(56, health_rate / 10 + 27, X_OFFSET, 226, FONT_NORMAL_GREEN);
196     } else {
197         lang_text_draw(56, health_rate / 10 + 27, X_OFFSET, 226, FONT_NORMAL_RED);
198     }
199 
200     // education
201     house_demands *demands = city_houses_demands();
202     draw_title(246, 8);
203     if (demands->education == 1) {
204         lang_text_draw(61, 39, X_OFFSET, 246, FONT_NORMAL_RED);
205     } else if (demands->education == 2) {
206         lang_text_draw(61, 40, X_OFFSET, 246, FONT_NORMAL_RED);
207     } else if (demands->education == 3) {
208         lang_text_draw(61, 41, X_OFFSET, 246, FONT_NORMAL_RED);
209     } else {
210         lang_text_draw(61, 42, X_OFFSET, 246, FONT_NORMAL_GREEN);
211     }
212 
213     // religion
214     draw_title(266, 9);
215     if (demands->religion == 1) {
216         lang_text_draw(61, 46, X_OFFSET, 266, FONT_NORMAL_RED);
217     } else if (demands->religion == 2) {
218         lang_text_draw(61, 47, X_OFFSET, 266, FONT_NORMAL_RED);
219     } else if (demands->religion == 3) {
220         lang_text_draw(61, 48, X_OFFSET, 266, FONT_NORMAL_RED);
221     } else {
222         lang_text_draw(61, 49, X_OFFSET, 266, FONT_NORMAL_GREEN);
223     }
224 
225     // entertainment
226     draw_title(286, 10);
227     if (demands->entertainment == 1) {
228         lang_text_draw(61, 43, X_OFFSET, 286, FONT_NORMAL_RED);
229     } else if (demands->entertainment == 2) {
230         lang_text_draw(61, 44, X_OFFSET, 286, FONT_NORMAL_RED);
231     } else {
232         lang_text_draw(61, 45, X_OFFSET, 286, FONT_NORMAL_GREEN);
233     }
234 
235     // sentiment
236     draw_title(306, 11);
237     int sentiment = city_sentiment();
238     if (sentiment <= 0) {
239         lang_text_draw(61, 50, X_OFFSET, 306, FONT_NORMAL_RED);
240     } else if (sentiment >= 100) {
241         lang_text_draw(61, 61, X_OFFSET, 306, FONT_NORMAL_GREEN);
242     } else {
243         lang_text_draw(61, sentiment / 10 + 51, X_OFFSET, 306, FONT_NORMAL_GREEN);
244     }
245 
246     return ADVISOR_HEIGHT;
247 }
248 
window_advisor_chief(void)249 const advisor_window_type *window_advisor_chief(void)
250 {
251     static const advisor_window_type window = {
252         draw_background,
253         0,
254         0,
255         0
256     };
257     return &window;
258 }
259