Highest score on the field
JavaScript (ES6), 157 bytes

s=&gt;[...o=s].map((n,i)=&gt;o=n&lt;'.'|(a=[...s]).map(_=&gt;a.map((c,j)=&gt;c&gt;'-'&amp;c&lt;10&amp;(a[j+1]|a[j-1]|a[j+l]|a[j-l])&gt;90?a[n-=-c,j]=99:0),a[i]=99)|o&gt;n?o:n,l=~s.search`
`)|o


Explanation

Takes an input field as a string. For each number in the field, sums all numbers in the area. It does this by iterating over each number in the field multiple times, adding the number to the score if an adjacent cell contains a previously counted number. Counted numbers that are part of the area are represented by setting them to 99 so that they are not counted again. Outputs the highest score as a number.



var solution =

s=&gt;
  [...o=s].map((n,i)=&gt;o=n&lt;'.'|             // for each number on the field
                                           // n = area score
      (a=[...s])                           // a = array of each field character
      .map(_=&gt;                             // loop to ensure whole area is found
        a.map((c,j)=&gt;                      // for each cell c at index j
          c&gt;'-'&amp;c&lt;10&amp;                      // if the current cell is a number
          (a[j+1]|a[j-1]|a[j+l]|a[j-l])&gt;90 // and an adjacent cells is in the area
          ?a[n-=-c,j]=99:0                 // add the cell to the area
        ),                                 // and the number to the score
        a[i]=99                            // mark the starting cell as counted
      )
      |o&gt;n?o:n,                            // o = output (max of o and n)
    l=~s.search`
`                                          // l = line length of field
  )
  |o                                       // return o
&lt;textarea id="input" rows="6" cols="40"&gt;12-45-
4-65-9
87-654
12-487
45----
684764&lt;/textarea&gt;&lt;br /&gt;
&lt;button onclick="result.textContent=solution(input.value)"&gt;Go&lt;/button&gt;
&lt;pre id="result"&gt;&lt;/pre&gt;