← Back to team overview

widelands-dev team mailing list archive

Re: [Merge] lp:~widelands-dev/widelands/bug-1810062-territorial-calculations into lp:widelands

 

@GunChleoc: i checked your code suggestion from my perspective this won't work. see the comment below. 

The mechanism is that we only check a certain area in each loop. Beginning with the initial seed we discover new fields to be checked. but we can't add them to check directly cause we will recheck them in the next loop. so we add them to a new table and make them the area to check in the next run.

Diff comments:

> === modified file 'data/scripting/win_conditions/territorial_functions.lua'
> --- data/scripting/win_conditions/territorial_functions.lua	2019-02-12 17:30:21 +0000
> +++ data/scripting/win_conditions/territorial_functions.lua	2019-02-19 07:34:52 +0000
> @@ -14,24 +14,65 @@
>  local wc_had_territory = _"%1$s had %2$3.0f%% of the land (%3$i of %4$i)."
>  
>  -- RST
> --- .. function:: get_buildable_fields()
> ---
> ---    Collects all fields that are buildable
> ---
> ---    :returns: a table with the map's buildable fields
> ---
> -function get_buildable_fields()
> +-- .. function:: get_valuable_fields()
> +--
> +--    Collects all fields that are valuable
> +--
> +--    :returns: a table with the map's valuable fields
> +--
> +function get_valuable_fields()
>     local fields = {}
> +   local check = {}
>     local map = wl.Game().map
> -   for x=0, map.width-1 do
> -      for y=0, map.height-1 do
> -         local f = map:get_field(x,y)
> -         if f.buildable then
> -            table.insert(fields, f)
> -         end
> -      end
> -   end
> -   return fields
> +   local plrs = wl.Game().players
> +   for idx, player in ipairs(plrs) do
> +      local sf = map.player_slots[idx].starting_field
> +   -- initialize the fields table and the check area with the regions around the starting field of each Player
> +      for idx, fg in ipairs(sf:region(9)) do

Im back at my machine now. The code you provided above won't work, because check will only be increased by the newly discovered fields but the fields already checked will not be dropped. so computing time will increase unnecessarily.

> +         fields[fg.__hash] = fg
> +         check[fg.__hash] = fg
> +      end
> +   end
> +   if map.allows_seafaring == true then
> +      -- add port spaces to the starting check area
> +      for idx, spaces in ipairs(map.port_spaces) do
> +         local f = map:get_field(spaces["x"],spaces["y"])
> +         for idx, fg in ipairs(f:region(5)) do
> +            fields[fg.__hash] = fg
> +            check[fg.__hash] = fg
> +         end
> +      end
> +   end
> +   local loop = true
> +   while loop do
> +      loop = false
> +      local new = {}
> +      -- checking the check region for buildcaps and add fields that can be conquered
> +      for idx, f in pairs(check) do
> +         local radius ={}
> +         if f:has_max_caps("big") then
> +            radius = f:region(9)
> +         elseif f:has_max_caps("medium") then
> +            radius = f:region(7)
> +         elseif f:has_max_caps("small") then
> +            radius = f:region(5)
> +         end
> +         for idx, fg in ipairs(radius) do
> +            if fields[fg.__hash] == nil and check[fg.__hash] == nil and fg:has_max_caps("walkable") then
> +               new[fg.__hash] = fg
> +               fields[fg.__hash] = fg
> +               loop = true
> +            end
> +         end
> +      end
> +      check = new
> +   end
> +   local result = {}
> +   -- as our fields table is not continuosly indexed we need to build a properly indexed table
> +   for idx,f in pairs(fields) do
> +      table.insert(result, f)
> +   end
> +   return result
>  end
>  
>  -- RST


-- 
https://code.launchpad.net/~widelands-dev/widelands/bug-1810062-territorial-calculations/+merge/361366
Your team Widelands Developers is subscribed to branch lp:~widelands-dev/widelands/bug-1810062-territorial-calculations.


References