← Back to team overview

widelands-dev team mailing list archive

Re: [Merge] lp:~widelands-dev/widelands/find_attack_soldiers into lp:widelands

 

Mars, could you just push and reuse this branch please?

On my phone, will have a closer look from home or tomorrow. 


> Am 16.02.2015 um 15:33 schrieb Martin Schmidt <launchpad@xxxxxxxxxxxxxxx>:
> 
> Your patch was really useful, I just changed the sorting to stl and that's it. I also tried a short game and it really makes a difference seeing soldiers coming from all military builings in range to attack instead of weaking one building totally. 
> Here is the patch:
> 
> === modified file 'src/logic/player.cc'
> --- src/logic/player.cc    2014-12-20 22:03:47 +0000
> +++ src/logic/player.cc    2015-02-16 14:32:33 +0000
> @@ -100,31 +100,26 @@
>    int priority;  // (strength + 1) * health - position in building.
> };
> 
> +/**
> +* Find the strongest players with highest priority
> +*/
> +bool compare_soldiers(const SoldierPriority& a, const SoldierPriority& b) {
> +    return a.priority > b.priority;
> +}
> +
> void sort_soldiers(std::vector<SoldierPriority>* soldiers,
> -                          uint32_t max = std::numeric_limits<uint32_t>::max()) {
> -    std::vector<SoldierPriority> temp;
> -    SoldierPriority soldier;
> -    uint32_t left = soldiers->size();
> -
> -    while (left) {
> -        int32_t maxlevel = -1;
> -        uint32_t pos = 0;
> -        uint32_t maxpos = 0;
> -        for (const SoldierPriority& soldier_priority : *soldiers) {
> -            const int32_t level = soldier_priority.priority;
> -            if (level > maxlevel) {
> -                maxlevel = level;
> -                maxpos = pos;
> -                soldier.soldier = soldier_priority.soldier;
> -                soldier.priority = level;
> -            }
> -            pos++;
> -        }
> -        temp.push_back(soldier);
> -        soldiers->erase(soldiers->begin() + maxpos);
> -        left--;
> +                   uint32_t max = std::numeric_limits<uint32_t>::max()) {
> +    if (max >= soldiers->size()) {
> +        return;
>    }
> -    soldiers->insert(soldiers->end(), temp.begin(), temp.begin() + std::min<int>(max, temp.size()));
> +
> +    std::stable_sort(soldiers->begin(), soldiers->end(), compare_soldiers);
> +    // Can an unstable sorting algorithm cause desyncts or are the implementations
> +    // of std algorithms guaranteed to return the same (possibly non-stable)
> +    // sorting? If yes, partial_sort may be favourable
> +    // std::partial_sort(soldiers->begin(), soldiers->begin() + max,
> +    // soldiers->end(), compare_soldiers);
> +    soldiers->resize(max);
> }
> 
> }
> 
> 
> -- 
> https://code.launchpad.net/~widelands-dev/widelands/find_attack_soldiers/+merge/245276
> You proposed lp:~widelands-dev/widelands/find_attack_soldiers for merging.

-- 
https://code.launchpad.net/~widelands-dev/widelands/find_attack_soldiers/+merge/245276
Your team Widelands Developers is subscribed to branch lp:~widelands-dev/widelands/find_attack_soldiers.


References