@@ -384,7 +384,7 @@ static const df::job_skill noble_skills[] = {
384
384
df::enums::job_skill::RECORD_KEEPING,
385
385
};
386
386
387
- struct dwarf_info
387
+ struct dwarf_info_t
388
388
{
389
389
int highest_skill;
390
390
int total_skill;
@@ -432,6 +432,38 @@ DFhackCExport command_result plugin_shutdown ( color_ostream &out )
432
432
return CR_OK;
433
433
}
434
434
435
+ // sorting objects
436
+ struct dwarfinfo_sorter
437
+ {
438
+ dwarfinfo_sorter (std::vector <dwarf_info_t > & info):dwarf_info(info){};
439
+ bool operator () (int i,int j)
440
+ {
441
+ if (dwarf_info[i].state == IDLE && dwarf_info[j].state != IDLE)
442
+ return true ;
443
+ if (dwarf_info[i].state != IDLE && dwarf_info[j].state == IDLE)
444
+ return false ;
445
+ return dwarf_info[i].mastery_penalty > dwarf_info[j].mastery_penalty ;
446
+ };
447
+ std::vector <dwarf_info_t > & dwarf_info;
448
+ };
449
+ struct laborinfo_sorter
450
+ {
451
+ bool operator () (int i,int j)
452
+ {
453
+ return labor_infos[i].mode < labor_infos[j].mode ;
454
+ };
455
+ };
456
+
457
+ struct values_sorter
458
+ {
459
+ values_sorter (std::vector <int > & values):values(values){};
460
+ bool operator () (int i,int j)
461
+ {
462
+ return values[i] > values[j];
463
+ };
464
+ std::vector<int > & values;
465
+ };
466
+
435
467
DFhackCExport command_result plugin_onupdate ( color_ostream &out )
436
468
{
437
469
static int step_count = 0 ;
@@ -478,7 +510,7 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out )
478
510
if (n_dwarfs == 0 )
479
511
return CR_OK;
480
512
481
- std::vector<dwarf_info > dwarf_info (n_dwarfs);
513
+ std::vector<dwarf_info_t > dwarf_info (n_dwarfs);
482
514
483
515
std::vector<int > best_noble (ARRAY_COUNT (noble_skills));
484
516
std::vector<int > highest_noble_skill (ARRAY_COUNT (noble_skills));
@@ -643,8 +675,8 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out )
643
675
644
676
labors.push_back (labor);
645
677
}
646
-
647
- std::sort (labors.begin (), labors.end (), [] ( int i, int j) { return labor_infos[i]. mode < labor_infos[j]. mode ; } );
678
+ laborinfo_sorter lasorter;
679
+ std::sort (labors.begin (), labors.end (), lasorter );
648
680
649
681
// Handle all skills except those marked HAULERS
650
682
@@ -734,7 +766,10 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out )
734
766
}
735
767
736
768
if (labor_infos[labor].mode != EVERYONE)
737
- std::sort (candidates.begin (), candidates.end (), [&values] (int i, int j) { return values[i] > values[j]; });
769
+ {
770
+ values_sorter ivs (values);
771
+ std::sort (candidates.begin (), candidates.end (), ivs);
772
+ }
738
773
739
774
for (int dwarf = 0 ; dwarf < n_dwarfs; dwarf++)
740
775
{
@@ -815,16 +850,9 @@ DFhackCExport command_result plugin_onupdate ( color_ostream &out )
815
850
if (dwarf_info[dwarf].state == IDLE || dwarf_info[dwarf].state == BUSY)
816
851
hauler_ids.push_back (dwarf);
817
852
}
818
-
853
+ dwarfinfo_sorter sorter (dwarf_info);
819
854
// Idle dwarves come first, then we sort from least-skilled to most-skilled.
820
- std::sort (hauler_ids.begin (), hauler_ids.end (), [&dwarf_info] (int i, int j) -> bool
821
- {
822
- if (dwarf_info[i].state == IDLE && dwarf_info[j].state != IDLE)
823
- return true ;
824
- if (dwarf_info[i].state != IDLE && dwarf_info[j].state == IDLE)
825
- return false ;
826
- return dwarf_info[i].mastery_penalty > dwarf_info[j].mastery_penalty ;
827
- });
855
+ std::sort (hauler_ids.begin (), hauler_ids.end (), sorter);
828
856
829
857
// don't set any haulers if everyone is off drinking or something
830
858
if (hauler_ids.size () == 0 ) {
0 commit comments