|
1 | 1 | #include "game/scenes/mechlab/har_economy.h" |
2 | 2 | #include "formats/pilot.h" |
| 3 | +#include "utils/c_array_util.h" |
3 | 4 | #include "utils/log.h" |
4 | 5 | #include "utils/random.h" |
5 | 6 |
|
@@ -113,3 +114,68 @@ void upgrade_har(sd_pilot *pilot, enum HAR_UPGRADE upgrade) { |
113 | 114 | abort(); |
114 | 115 | } |
115 | 116 | } |
| 117 | + |
| 118 | +static void update_total_value(sd_pilot *pilot) { |
| 119 | + int value = har_prices[pilot->har_id]; |
| 120 | + for(int i = 1; i < pilot->arm_power; i++) { |
| 121 | + value += har_upgrade_price[pilot->har_id] * upgrade_level_multiplier[i] * arm_leg_multiplier; |
| 122 | + } |
| 123 | + |
| 124 | + for(int i = 1; i < pilot->arm_speed; i++) { |
| 125 | + value += har_upgrade_price[pilot->har_id] * upgrade_level_multiplier[i] * arm_leg_multiplier; |
| 126 | + } |
| 127 | + |
| 128 | + for(int i = 1; i < pilot->leg_power; i++) { |
| 129 | + value += har_upgrade_price[pilot->har_id] * upgrade_level_multiplier[i] * arm_leg_multiplier; |
| 130 | + } |
| 131 | + |
| 132 | + for(int i = 1; i < pilot->leg_speed; i++) { |
| 133 | + value += har_upgrade_price[pilot->har_id] * upgrade_level_multiplier[i] * arm_leg_multiplier; |
| 134 | + } |
| 135 | + |
| 136 | + for(int i = 1; i < pilot->armor; i++) { |
| 137 | + value += har_upgrade_price[pilot->har_id] * upgrade_level_multiplier[i] * armor_multiplier; |
| 138 | + } |
| 139 | + |
| 140 | + for(int i = 1; i < pilot->stun_resistance; i++) { |
| 141 | + value += har_upgrade_price[pilot->har_id] * upgrade_level_multiplier[i] * stun_res_multiplier; |
| 142 | + } |
| 143 | + |
| 144 | + pilot->total_value = (value * 70) / 100; |
| 145 | +} |
| 146 | + |
| 147 | +static int rank_additions[] = { |
| 148 | + 500, 200, 160, 120, 100, 90, 80, 70, 60, 55, 50, 45, 40, 35, 30, 25, 20, |
| 149 | + 17, 15, 14, 13, 12, 11, 11, 10, 9, 8, 8, 7, 7, 6, 6, 5, 0, |
| 150 | +}; |
| 151 | + |
| 152 | +static float rank_scale(unsigned rank) { |
| 153 | + assert(rank >= 1); |
| 154 | + rank -= 1; |
| 155 | + float a = rank * 0.1 + 1.0; |
| 156 | + float b = rank * 0.2 + 1.0; |
| 157 | + return b * a * a; |
| 158 | +} |
| 159 | + |
| 160 | +static float rank_bonus(unsigned rank) { |
| 161 | + assert(rank >= 1); |
| 162 | + rank -= 1; |
| 163 | + if(rank < N_ELEMENTS(rank_additions)) { |
| 164 | + return rank_additions[rank]; |
| 165 | + } |
| 166 | + return 5.0; |
| 167 | +} |
| 168 | + |
| 169 | +float calculate_winnings(sd_pilot *winner, sd_pilot *loser, float winnings_multiplier) { |
| 170 | + update_total_value(winner); |
| 171 | + update_total_value(loser); |
| 172 | + |
| 173 | + int adjusted_value = winner->total_value - (har_prices[0] * 85) / 100 - 500; |
| 174 | + float loser_value = (loser->total_value + loser->money) / 45.0 + (int)loser->winnings; |
| 175 | + float winnings = loser_value + (adjusted_value / rank_scale(winner->rank) / 30.0); |
| 176 | + |
| 177 | + winnings += winner->trn_rank_money * rank_bonus(winner->rank); |
| 178 | + winnings *= 0.7f; |
| 179 | + winnings *= winnings_multiplier; |
| 180 | + return winnings; |
| 181 | +} |
0 commit comments