16
16
17
17
namespace military {
18
18
19
+
20
+ // this function should be used
21
+ // only for provinces owned by a war participant
22
+ bool does_province_count_for_war_occupation (sys::state& state, dcon::war_id w, dcon::province_id p) {
23
+ auto controller = state.world .province_get_nation_from_province_control (p);
24
+ auto owner = state.world .province_get_nation_from_province_ownership (p);
25
+ // province must be occupied
26
+ if (owner == controller) {
27
+ return false ;
28
+ }
29
+ // rebels do not count
30
+ if (!controller) {
31
+ return false ;
32
+ }
33
+ // count occupations only for wars declared after targetted war
34
+ auto date = state.world .war_get_start_date (w);
35
+ for (auto candidate_war : state.world .nation_get_war_participant (owner)) {
36
+ auto is_attacker = candidate_war.get_is_attacker ();
37
+ for (auto o : candidate_war.get_war ().get_war_participant ()) {
38
+ if (o.get_nation () == controller) {
39
+ auto & candidate_date = candidate_war.get_war ().get_start_date ();
40
+ if (candidate_date < date) {
41
+ return false ;
42
+ }
43
+ }
44
+ }
45
+ }
46
+ return true ;
47
+ }
48
+
49
+
19
50
template auto province_is_blockaded<ve::tagged_vector<dcon::province_id>>(sys::state const &, ve::tagged_vector<dcon::province_id>);
20
51
template auto province_is_under_siege<ve::tagged_vector<dcon::province_id>>(sys::state const &, ve::tagged_vector<dcon::province_id>);
21
52
template auto battle_is_ongoing_in_province<ve::tagged_vector<dcon::province_id>>(sys::state const &, ve::tagged_vector<dcon::province_id>);
@@ -4240,15 +4271,15 @@ void update_ticking_war_score(sys::state& state) {
4240
4271
for (auto prv : wg.get_associated_state ().get_abstract_state_membership ()) {
4241
4272
if (prv.get_province ().get_nation_from_province_ownership () == wg.get_target_nation ()) {
4242
4273
++total_count;
4243
- if (get_role (state, war, prv.get_province (). get_nation_from_province_control ()) == role ) {
4274
+ if (does_province_count_for_war_occupation (state, war, prv.get_province ()) ) {
4244
4275
++occupied;
4245
4276
}
4246
4277
}
4247
4278
}
4248
4279
} else if ((bits & cb_flag::po_annex) != 0 ) {
4249
4280
for (auto prv : wg.get_target_nation ().get_province_ownership ()) {
4250
4281
++total_count;
4251
- if (get_role (state, war, prv.get_province (). get_nation_from_province_control ()) == role ) {
4282
+ if (does_province_count_for_war_occupation (state, war, prv.get_province ()) ) {
4252
4283
++occupied;
4253
4284
}
4254
4285
}
@@ -4260,7 +4291,7 @@ void update_ticking_war_score(sys::state& state) {
4260
4291
4261
4292
province::for_each_province_in_state_instance (state, st.get_state (), [&](dcon::province_id prv) {
4262
4293
++total_count;
4263
- if (get_role (state, war, state. world . province_get_nation_from_province_control ( prv)) == role ) {
4294
+ if (does_province_count_for_war_occupation (state, war, prv)) {
4264
4295
++occupied;
4265
4296
}
4266
4297
});
@@ -4398,7 +4429,7 @@ float primary_warscore_from_occupation(sys::state& state, dcon::war_id w) {
4398
4429
for (auto prv : state.world .nation_get_province_ownership (pattacker)) {
4399
4430
auto v = province_point_cost (state, prv.get_province (), pattacker);
4400
4431
sum_attacker_prov_values += v;
4401
- if (get_role (state, w, prv.get_province (). get_nation_from_province_control ()) == war_role::defender )
4432
+ if (does_province_count_for_war_occupation (state, w, prv.get_province ()) )
4402
4433
sum_attacker_occupied_values += v;
4403
4434
}
4404
4435
@@ -4407,7 +4438,7 @@ float primary_warscore_from_occupation(sys::state& state, dcon::war_id w) {
4407
4438
for (auto prv : state.world .nation_get_province_ownership (pdefender)) {
4408
4439
auto v = province_point_cost (state, prv.get_province (), pdefender);
4409
4440
sum_defender_prov_values += v;
4410
- if (get_role (state, w, prv.get_province (). get_nation_from_province_control ()) == war_role::attacker )
4441
+ if (does_province_count_for_war_occupation (state, w, prv.get_province ()) )
4411
4442
sum_defender_occupied_values += v;
4412
4443
}
4413
4444
@@ -4436,100 +4467,108 @@ float primary_warscore_from_war_goals(sys::state& state, dcon::war_id w) {
4436
4467
return total;
4437
4468
}
4438
4469
4439
- float directed_warscore (sys::state& state, dcon::war_id w, dcon::nation_id primary, dcon::nation_id secondary) {
4470
+ float directed_warscore (
4471
+ sys::state& state,
4472
+ dcon::war_id w,
4473
+ dcon::nation_id potential_beneficiary,
4474
+ dcon::nation_id target
4475
+ ) {
4440
4476
float total = 0 .0f ;
4441
4477
4442
- auto is_pattacker = state.world .war_get_primary_attacker (w) == primary;
4443
- auto is_pdefender = state.world .war_get_primary_defender (w) == primary;
4478
+ auto beneficiary_is_primary_attacker = state.world .war_get_primary_attacker (w) == potential_beneficiary;
4479
+ auto beneficiary_is_primary_defender = state.world .war_get_primary_defender (w) == potential_beneficiary;
4480
+
4481
+ auto beneficiary_is_war_leader = beneficiary_is_primary_attacker || beneficiary_is_primary_defender;
4482
+
4483
+ auto target_is_primary_attacker = state.world .war_get_primary_attacker (w) == target;
4484
+ auto target_is_primary_defender = state.world .war_get_primary_defender (w) == target;
4444
4485
4445
- auto is_tpattacker = state.world .war_get_primary_attacker (w) == secondary;
4446
- auto is_tpdefender = state.world .war_get_primary_defender (w) == secondary;
4486
+ auto target_is_war_leader = target_is_primary_attacker || target_is_primary_defender;
4447
4487
4448
- if (is_pattacker && is_tpdefender )
4488
+ if (beneficiary_is_primary_attacker && target_is_primary_defender )
4449
4489
return primary_warscore (state, w);
4450
- if (is_pdefender && is_tpattacker )
4490
+ if (target_is_primary_attacker && beneficiary_is_primary_defender )
4451
4491
return -primary_warscore (state, w);
4452
4492
4453
- int32_t sum_attacker_prov_values = 0 ;
4454
- int32_t sum_attacker_occupied_values = 0 ;
4455
- for (auto prv : state.world .nation_get_province_ownership (primary )) {
4456
- auto v = province_point_cost (state, prv.get_province (), primary );
4457
- sum_attacker_prov_values += v;
4493
+ int32_t beneficiary_score_from_occupation = 0 ;
4494
+ int32_t beneficiary_potential_score_from_occupation = 0 ;
4495
+ for (auto prv : state.world .nation_get_province_ownership (target )) {
4496
+ auto v = province_point_cost (state, prv.get_province (), target );
4497
+ beneficiary_potential_score_from_occupation += v;
4458
4498
4459
- if (is_tpattacker) {
4460
- if (get_role (state, w, prv.get_province ().get_nation_from_province_control ()) == war_role::attacker)
4461
- sum_attacker_occupied_values += v;
4462
- } else if (is_tpdefender) {
4463
- if (get_role (state, w, prv.get_province ().get_nation_from_province_control ()) == war_role::defender)
4464
- sum_attacker_occupied_values += v;
4499
+ if (beneficiary_is_primary_attacker || beneficiary_is_primary_defender) {
4500
+ if (does_province_count_for_war_occupation (state, w, prv.get_province ()))
4501
+ beneficiary_score_from_occupation += v;
4465
4502
} else {
4466
- if (prv.get_province ().get_nation_from_province_control () == secondary )
4467
- sum_attacker_occupied_values += v;
4503
+ if (prv.get_province ().get_nation_from_province_control () == potential_beneficiary )
4504
+ beneficiary_score_from_occupation += v;
4468
4505
}
4469
4506
}
4470
4507
4471
- int32_t sum_defender_prov_values = 0 ;
4472
- int32_t sum_defender_occupied_values = 0 ;
4473
- for (auto prv : state.world .nation_get_province_ownership (secondary )) {
4474
- auto v = province_point_cost (state, prv.get_province (), secondary );
4475
- sum_defender_prov_values += v;
4508
+ int32_t against_beneficiary_score_from_occupation = 0 ;
4509
+ int32_t against_beneficiary_potential_score_from_occupation = 0 ;
4510
+ for (auto prv : state.world .nation_get_province_ownership (potential_beneficiary )) {
4511
+ auto v = province_point_cost (state, prv.get_province (), potential_beneficiary );
4512
+ against_beneficiary_potential_score_from_occupation += v;
4476
4513
4477
- if (is_pattacker) {
4478
- if (get_role (state, w, prv.get_province ().get_nation_from_province_control ()) == war_role::attacker)
4479
- sum_defender_occupied_values += v;
4480
- } else if (is_pdefender) {
4481
- if (get_role (state, w, prv.get_province ().get_nation_from_province_control ()) == war_role::defender)
4482
- sum_defender_occupied_values += v;
4483
- } else {
4484
- if (prv.get_province ().get_nation_from_province_control () == primary)
4485
- sum_defender_occupied_values += v;
4486
- }
4514
+ if (does_province_count_for_war_occupation (state, w, prv.get_province ()))
4515
+ against_beneficiary_score_from_occupation += v;
4487
4516
}
4488
4517
4489
- if (sum_defender_prov_values > 0 )
4490
- total += (float (sum_defender_occupied_values) * 100 .0f ) / float (sum_defender_prov_values);
4491
- if (sum_attacker_prov_values > 0 )
4492
- total -= (float (sum_attacker_occupied_values) * 100 .0f ) / float (sum_attacker_prov_values);
4518
+ if (beneficiary_potential_score_from_occupation > 0 )
4519
+ total +=
4520
+ (float (beneficiary_score_from_occupation) * 100 .0f )
4521
+ / float (beneficiary_potential_score_from_occupation);
4522
+
4523
+ if (against_beneficiary_potential_score_from_occupation > 0 )
4524
+ total -=
4525
+ (float (against_beneficiary_score_from_occupation) * 100 .0f )
4526
+ / float (against_beneficiary_potential_score_from_occupation);
4493
4527
4494
4528
for (auto wg : state.world .war_get_wargoals_attached (w)) {
4495
- if ((wg.get_wargoal ().get_added_by () == primary || is_pattacker || is_pdefender)
4496
- && wg.get_wargoal ().get_target_nation () == secondary) {
4529
+ auto wargoal_is_added_by_beneficiary = wg.get_wargoal ().get_added_by () == potential_beneficiary;
4530
+ auto wargoal_is_added_by_target = wg.get_wargoal ().get_added_by () == target;
4531
+ auto wargoal_targets_beneficiary = wg.get_wargoal ().get_target_nation () == potential_beneficiary;
4532
+ auto wargoal_targets_target = wg.get_wargoal ().get_target_nation () == target;
4497
4533
4534
+ if (
4535
+ (wargoal_is_added_by_beneficiary || beneficiary_is_war_leader) && wargoal_targets_target
4536
+ ) {
4498
4537
total += wg.get_wargoal ().get_ticking_war_score ();
4499
- } else if (wg. get_wargoal (). get_added_by () == secondary
4500
- && (wg. get_wargoal (). get_target_nation () == primary || is_pattacker || is_pdefender)) {
4501
-
4538
+ } else if (
4539
+ wargoal_is_added_by_target && (wargoal_targets_beneficiary || beneficiary_is_war_leader)
4540
+ ) {
4502
4541
total -= wg.get_wargoal ().get_ticking_war_score ();
4503
- } else if (wg. get_wargoal (). get_added_by () == primary
4504
- && (wg. get_wargoal (). get_target_nation () == secondary || is_tpattacker || is_tpdefender)) {
4505
-
4542
+ } else if (
4543
+ wargoal_is_added_by_beneficiary && (wargoal_targets_target || target_is_war_leader)
4544
+ ) {
4506
4545
total += wg.get_wargoal ().get_ticking_war_score ();
4507
- } else if ((wg. get_wargoal (). get_added_by () == secondary || is_tpattacker || is_tpdefender)
4508
- && (wg. get_wargoal (). get_target_nation () == primary)) {
4509
-
4546
+ } else if (
4547
+ (wargoal_is_added_by_target || target_is_war_leader) && wargoal_targets_beneficiary
4548
+ ) {
4510
4549
total -= wg.get_wargoal ().get_ticking_war_score ();
4511
4550
}
4512
4551
}
4513
4552
4514
- auto d_cpc = state.world .nation_get_central_ports (secondary );
4553
+ auto d_cpc = state.world .nation_get_central_ports (target );
4515
4554
int32_t d_blockaded_in_war = 0 ;
4516
- for (auto p : state.world .nation_get_province_ownership (secondary )) {
4555
+ for (auto p : state.world .nation_get_province_ownership (target )) {
4517
4556
if (military::province_is_blockaded (state, p.get_province ()) && !province::is_overseas (state, p.get_province ().id )) {
4518
4557
for (auto v : state.world .province_get_navy_location (p.get_province ().get_port_to ())) {
4519
4558
if (!v.get_navy ().get_is_retreating () && !v.get_navy ().get_battle_from_navy_battle_participation ()) {
4520
4559
4521
- if (is_pattacker ) {
4560
+ if (beneficiary_is_primary_attacker ) {
4522
4561
if (get_role (state, w, v.get_navy ().get_controller_from_navy_control ()) == war_role::attacker) {
4523
4562
++d_blockaded_in_war;
4524
4563
break ; // out of inner loop
4525
4564
}
4526
- } else if (is_pdefender ) {
4565
+ } else if (beneficiary_is_primary_defender ) {
4527
4566
if (get_role (state, w, v.get_navy ().get_controller_from_navy_control ()) == war_role::defender) {
4528
4567
++d_blockaded_in_war;
4529
4568
break ; // out of inner loop
4530
4569
}
4531
4570
} else {
4532
- if (v.get_navy ().get_controller_from_navy_control () == primary ) {
4571
+ if (v.get_navy ().get_controller_from_navy_control () == potential_beneficiary ) {
4533
4572
++d_blockaded_in_war;
4534
4573
break ; // out of inner loop
4535
4574
}
@@ -4541,22 +4580,22 @@ float directed_warscore(sys::state& state, dcon::war_id w, dcon::nation_id prima
4541
4580
auto def_b_frac = std::clamp (d_cpc > 0 ? float (d_blockaded_in_war) / float (d_cpc) : 0 .0f , 0 .0f , 1 .0f );
4542
4581
4543
4582
int32_t a_blockaded_in_war = 0 ;
4544
- for (auto p : state.world .nation_get_province_ownership (primary )) {
4583
+ for (auto p : state.world .nation_get_province_ownership (potential_beneficiary )) {
4545
4584
if (military::province_is_blockaded (state, p.get_province ()) && !province::is_overseas (state, p.get_province ().id )) {
4546
4585
for (auto v : state.world .province_get_navy_location (p.get_province ().get_port_to ())) {
4547
4586
if (!v.get_navy ().get_is_retreating () && !v.get_navy ().get_battle_from_navy_battle_participation ()) {
4548
- if (is_tpattacker ) {
4587
+ if (target_is_primary_attacker ) {
4549
4588
if (get_role (state, w, v.get_navy ().get_controller_from_navy_control ()) == war_role::attacker) {
4550
4589
++a_blockaded_in_war;
4551
4590
break ; // out of inner loop
4552
4591
}
4553
- } else if (is_tpdefender ) {
4592
+ } else if (target_is_primary_defender ) {
4554
4593
if (get_role (state, w, v.get_navy ().get_controller_from_navy_control ()) == war_role::defender) {
4555
4594
++a_blockaded_in_war;
4556
4595
break ; // out of inner loop
4557
4596
}
4558
4597
} else {
4559
- if (v.get_navy ().get_controller_from_navy_control () == secondary ) {
4598
+ if (v.get_navy ().get_controller_from_navy_control () == target ) {
4560
4599
++a_blockaded_in_war;
4561
4600
break ; // out of inner loop
4562
4601
}
@@ -4565,7 +4604,7 @@ float directed_warscore(sys::state& state, dcon::war_id w, dcon::nation_id prima
4565
4604
}
4566
4605
}
4567
4606
}
4568
- auto a_cpc = state.world .nation_get_central_ports (primary );
4607
+ auto a_cpc = state.world .nation_get_central_ports (potential_beneficiary );
4569
4608
auto att_b_frac = std::clamp (a_cpc > 0 ? float (a_blockaded_in_war) / float (a_cpc) : 0 .0f , 0 .0f , 1 .0f );
4570
4609
4571
4610
total += 25 .0f * (def_b_frac - att_b_frac);
0 commit comments