| 512 | } |
| 513 | |
| 514 | static void follow_a_dwarf(color_ostream &out) { |
| 515 | DEBUG(cycle,out).print("choosing a unit to follow\n"); |
| 516 | |
| 517 | vector<df::unit*> citizen_combat_units; |
| 518 | vector<df::unit*> other_combat_units; |
| 519 | vector<df::unit*> nicknamed_units; |
| 520 | vector<df::unit*> job_units; |
| 521 | vector<df::unit*> other_units; |
| 522 | get_dwarf_buckets(out, citizen_combat_units, other_combat_units, nicknamed_units, job_units, other_units); |
| 523 | |
| 524 | set_next_cycle_unpaused_ms(out, !citizen_combat_units.empty()); |
| 525 | |
| 526 | // coalesce the buckets and add weights |
| 527 | vector<df::unit*> units; |
| 528 | vector<float> intervals; |
| 529 | vector<float> weights; |
| 530 | intervals.push_back(0); |
| 531 | add_bucket(citizen_combat_units, units, intervals, weights, config.prefer_conflict ? CITIZEN_COMBAT_PREFERRED_WEIGHT : JOB_WEIGHT); |
| 532 | add_bucket(other_combat_units, units, intervals, weights, config.prefer_conflict ? OTHER_COMBAT_PREFERRED_WEIGHT : JOB_WEIGHT); |
| 533 | add_bucket(nicknamed_units, units, intervals, weights, NICKNAMED_CITIZEN_PREFERRED_WEIGHT); |
| 534 | add_bucket(job_units, units, intervals, weights, JOB_WEIGHT); |
| 535 | add_bucket(other_units, units, intervals, weights, OTHER_WEIGHT); |
| 536 | |
| 537 | if (units.empty()) { |
| 538 | DEBUG(cycle,out).print("no units to follow\n"); |
| 539 | return; |
| 540 | } |
| 541 | |
| 542 | std::piecewise_constant_distribution<float> distribution(intervals.begin(), intervals.end(), weights.begin()); |
| 543 | int unit_idx = distribution(rng); |
| 544 | df::unit *unit = units[unit_idx]; |
| 545 | |
| 546 | if (debug_cycle.isEnabled(DebugCategory::LDEBUG)) { |
| 547 | DUMP_BUCKET(citizen_combat_units); |
| 548 | DUMP_BUCKET(other_combat_units); |
| 549 | DUMP_BUCKET(nicknamed_units); |
| 550 | DUMP_BUCKET(job_units); |
| 551 | DUMP_BUCKET(other_units); |
| 552 | DUMP_FLOAT_VECTOR(intervals); |
| 553 | DUMP_FLOAT_VECTOR(weights); |
| 554 | DEBUG(cycle,out).print("selected unit idx {}\n", unit_idx); |
| 555 | } |
| 556 | |
| 557 | unit_history.add_and_follow(out, unit); |
| 558 | } |
| 559 | |
| 560 | ///////////////////////////////////////////////////// |
| 561 | // Lua API |
no test coverage detected