1 #include "trade_route.h"
2 
3 #define MAX_ROUTES 20
4 
5 struct route_resource {
6     int limit;
7     int traded;
8 };
9 
10 static struct route_resource data[MAX_ROUTES][RESOURCE_MAX];
11 
trade_route_init(int route_id,resource_type resource,int limit)12 void trade_route_init(int route_id, resource_type resource, int limit)
13 {
14     data[route_id][resource].limit = limit;
15     data[route_id][resource].traded = 0;
16 }
17 
trade_route_limit(int route_id,resource_type resource)18 int trade_route_limit(int route_id, resource_type resource)
19 {
20     return data[route_id][resource].limit;
21 }
22 
trade_route_traded(int route_id,resource_type resource)23 int trade_route_traded(int route_id, resource_type resource)
24 {
25     return data[route_id][resource].traded;
26 }
27 
trade_route_increase_limit(int route_id,resource_type resource)28 int trade_route_increase_limit(int route_id, resource_type resource)
29 {
30     switch (data[route_id][resource].limit) {
31         case 0: data[route_id][resource].limit = 15; break;
32         case 15: data[route_id][resource].limit = 25; break;
33         case 25: data[route_id][resource].limit = 40; break;
34         default: return 0;
35     }
36     return 1;
37 }
38 
trade_route_decrease_limit(int route_id,resource_type resource)39 int trade_route_decrease_limit(int route_id, resource_type resource)
40 {
41     switch (data[route_id][resource].limit) {
42         case 40: data[route_id][resource].limit = 25; break;
43         case 25: data[route_id][resource].limit = 15; break;
44         case 15: data[route_id][resource].limit = 0; break;
45         default: return 0;
46     }
47     return 1;
48 }
49 
trade_route_increase_traded(int route_id,resource_type resource)50 void trade_route_increase_traded(int route_id, resource_type resource)
51 {
52     data[route_id][resource].traded++;
53 }
54 
trade_route_reset_traded(int route_id)55 void trade_route_reset_traded(int route_id)
56 {
57     for (int r = RESOURCE_MIN; r < RESOURCE_MAX; r++) {
58         data[route_id][r].traded = 0;
59     }
60 }
61 
trade_route_limit_reached(int route_id,resource_type resource)62 int trade_route_limit_reached(int route_id, resource_type resource)
63 {
64     return data[route_id][resource].traded >= data[route_id][resource].limit;
65 }
66 
trade_routes_save_state(buffer * limit,buffer * traded)67 void trade_routes_save_state(buffer *limit, buffer *traded)
68 {
69     for (int route_id = 0; route_id < MAX_ROUTES; route_id++) {
70         for (int r = 0; r < RESOURCE_MAX; r++) {
71             buffer_write_i32(limit, data[route_id][r].limit);
72             buffer_write_i32(traded, data[route_id][r].traded);
73         }
74     }
75 }
76 
trade_routes_load_state(buffer * limit,buffer * traded)77 void trade_routes_load_state(buffer *limit, buffer *traded)
78 {
79     for (int route_id = 0; route_id < MAX_ROUTES; route_id++) {
80         for (int r = 0; r < RESOURCE_MAX; r++) {
81             data[route_id][r].limit = buffer_read_i32(limit);
82             data[route_id][r].traded = buffer_read_i32(traded);
83         }
84     }
85 }
86