@@ -318,9 +318,16 @@ public Set<Plot> getConnectedPlots(Plot plot) {
318318 }
319319
320320 public boolean startMerge (Plot plot , int dir ) {
321+ return this .startMerge (plot , dir , new HashSet <>());
322+ }
323+
324+ public boolean startMerge (Plot plot , int dir , Set <PlotMerged > mergedSet ) {
321325 if (!plot .hasOwner ()) return false ;
322326
323- int max = 8 ;
327+ final PlotMerged plotMerged = new PlotMerged (plot , dir );
328+ if (mergedSet .contains (plotMerged )) return false ;
329+ mergedSet .add (plotMerged );
330+
324331 final Set <Plot > visited = new HashSet <>();
325332 final Set <PlotVector > merged = new HashSet <>();
326333 final Set <Plot > connected = this .getConnectedPlots (plot );
@@ -340,17 +347,15 @@ public boolean startMerge(Plot plot, int dir) {
340347 });
341348
342349 boolean toReturn = false ;
343- while ((current = frontier .poll ()) != null && max >= 0 ) {
344- if (visited .contains (current )) continue ;
350+ while ((current = frontier .poll ()) != null ) {
351+ if (! visited .add (current )) continue ;
345352
346- visited .add (current );
347- Set <Plot > plots ;
353+ Set <Plot > nextPlots ;
348354 for (int iDir = 0 ; iDir < 4 ; iDir ++) {
349355 if ((dir == -1 || dir == iDir ) && !current .isMerged (iDir )) {
350356 final Plot other = this .getPlotById (current .getRelative (iDir ));
351- if (other .isOwner (plot .getOwner ()) && (other .getBasePlot ().equals (current .getBasePlot ())
352- || (plots = this .getConnectedPlots (other )).size () <= max && frontier .
353- addAll (plots ) && (max -= plots .size ()) != -1 )) {
357+ if (other .isOwner (plot .getOwner ()) && (other .getBasePlot ().equals (current .getBasePlot ()) ||
358+ (nextPlots = this .getConnectedPlots (other )).size () > 0 && frontier .addAll (nextPlots ))) {
354359 this .mergePlot (other , current , whenDone );
355360 merged .add (current .getPlotVector ());
356361 merged .add (other .getPlotVector ());
@@ -360,6 +365,21 @@ public boolean startMerge(Plot plot, int dir) {
360365 }
361366 }
362367
368+ int relativeDir ;
369+ for (Plot visitedPlot0 : visited ) {
370+ for (Plot visitedPlot1 : visited ) {
371+ if (!visitedPlot0 .equals (visitedPlot1 )) continue ;
372+
373+ relativeDir = visitedPlot0 .getRelativeDir (visitedPlot1 .getPlotVector ());
374+ if (!visitedPlot0 .isMerged (relativeDir ))
375+ this .startMerge (visitedPlot0 , relativeDir , mergedSet );
376+
377+ relativeDir = visitedPlot1 .getRelativeDir (visitedPlot0 .getPlotVector ());
378+ if (!visitedPlot1 .isMerged (relativeDir ))
379+ this .startMerge (visitedPlot1 , relativeDir , mergedSet );
380+ }
381+ }
382+
363383 whenDone .start ();
364384 return toReturn ;
365385 }
0 commit comments