Old revision #p2pn4keww | New revision #pnufelyg1 | ||
---|---|---|---|
1 | static int CDECL StationRatingSorter(const Station * const *a, const Station * const *b) | ||
2 | { | ||
3 | // GSortT(used_stations->Begin(), used_stations.Lenght(), ); | ||
4 | const Station *sta = *a; | ||
5 | const Station *stb = *b; | ||
6 | return stb->goods[0].rating - sta->goods[0].rating; | ||
7 | } | ||
8 | |||
1 | uint MoveGoodsToStation(CargoID type, uint amount, SourceType source_type, SourceID source_id, const StationList *all_stations) | 9 | uint MoveGoodsToStation(CargoID type, uint amount, SourceType source_type, SourceID source_id, const StationList *all_stations) |
2 | { | 10 | { |
3 | /* Return if nothing to do. Also the rounding below fails for 0. */ | 11 | /* Return if nothing to do. Also the rounding below fails for 0. */ | … | … |
16 | uint best_rating5 = 0; // rating of st5 | 24 | uint best_rating5 = 0; // rating of st5 |
17 | uint best_rating6 = 0; // rating of st6 | 25 | uint best_rating6 = 0; // rating of st6 |
18 | 26 | ||
27 | StationList used_stations; | ||
28 | |||
19 | for (Station * const *st_iter = all_stations->Begin(); st_iter != all_stations->End(); ++st_iter) { | 29 | for (Station * const *st_iter = all_stations->Begin(); st_iter != all_stations->End(); ++st_iter) { |
20 | Station *st = *st_iter; | 30 | Station *st = *st_iter; |
21 | 31 | … | … |
33 | } | 43 | } |
34 | 44 | ||
35 | /* This station can be used, add it to st1/st2/st3/st4/st5/st6 */ | 45 | /* This station can be used, add it to st1/st2/st3/st4/st5/st6 */ |
46 | used_stations.Include(st); | ||
47 | |||
36 | if (st1 == NULL || st->goods[type].rating >= best_rating1) { | 48 | if (st1 == NULL || st->goods[type].rating >= best_rating1) { |
37 | st6 = st5; best_rating6 = best_rating5; | 49 | st6 = st5; best_rating6 = best_rating5; |
38 | st5 = st4; best_rating5 = best_rating4; | 50 | st5 = st4; best_rating5 = best_rating4; | … | … |
63 | } | 75 | } |
64 | } | 76 | } |
65 | 77 | ||
78 | uint no_stations = used_stations.Length(); | ||
79 | |||
80 | GSortT(used_stations.Begin(), used_stations.Length(), &StationRatingSorter); | ||
81 | |||
82 | if (no_stations > 1) { | ||
83 | Station *st1 = &used_stations.Begin(); | ||
84 | Station *st2 = &st1++; | ||
85 | uint offset = 0; | ||
86 | |||
87 | while (no_stations > 1) { | ||
88 | const int diff = st1->goods[type].rating - st2->goods[type].rating; | ||
89 | if (diff <= 0) { | ||
90 | if (offset != 0) { | ||
91 | st1 += offset; | ||
92 | st2 += offset; | ||
93 | offset = 0; | ||
94 | continue; | ||
95 | } | ||
96 | |||
97 | st1++; | ||
98 | st2++; | ||
99 | no_stations--; | ||
100 | } else { | ||
101 | Swap(*st1, *st2); | ||
102 | |||
103 | if (st1 == *used_stations.Begin()) continue; | ||
104 | |||
105 | st1--; | ||
106 | st2--; | ||
107 | offset++; | ||
108 | } | ||
109 | } | ||
110 | // for (Station **st_iter = used_stations.Begin(); st_iter != used_stations.End(); ++st_iter) { | ||
111 | // Station *st1 = *st_iter; | ||
112 | // Station *st2 = *st_iter + 1; | ||
113 | // | ||
114 | // if (st1->goods[type].rating >= st2->goods[type].rating) { | ||
115 | // st2 = st1; | ||
116 | // } | ||
117 | // | ||
118 | // } | ||
119 | } | ||
120 | |||
66 | /* no stations around at all? */ | 121 | /* no stations around at all? */ |
67 | if (st1 == NULL) return 0; | 122 | if (st1 == NULL) return 0; |
68 | 123 | … | … |
159 | } | 214 | } |
160 | 215 | ||
161 | if (st6 == NULL) { | 216 | if (st6 == NULL) { |
162 | /* Five stations around, the best five (highest rating) are in st1, st2, st3, st4 and st5 | 162 | /* Five stations around, the best five (highest rating) are in st1, st2, st3, st4 and st5 */ |
163 | assert(st1 != NULL); | 218 | assert(st1 != NULL); |
164 | assert(st2 != NULL); | 219 | assert(st2 != NULL); |
165 | assert(st3 != NULL); | 220 | assert(st3 != NULL); |