@@ -406,27 +406,36 @@ private double GetPlayerWhr(string name)
406406
407407 private async Task LaunchAllBattles ( )
408408 {
409- foreach ( var squad in FormedSquads )
409+ // merge squads on the same planet into one battle per planet
410+ foreach ( var planetId in FormedSquads . Select ( s => s . PlanetID ) . Distinct ( ) . ToList ( ) )
410411 {
411- // filter to still-connected
412- squad . Attackers = squad . Attackers . Where ( x => server . ConnectedUsers . ContainsKey ( x ) ) . ToList ( ) ;
413- squad . Defenders = squad . Defenders . Where ( x => server . ConnectedUsers . ContainsKey ( x ) ) . ToList ( ) ;
412+ var squads = FormedSquads . Where ( s => s . PlanetID == planetId ) . ToList ( ) ;
413+ var first = squads . First ( ) ;
414+
415+ // merge all squads into one AttackOption
416+ var merged = CreateSquadFromOption ( first ) ;
417+ foreach ( var squad in squads )
418+ {
419+ merged . Attackers . AddRange ( squad . Attackers . Where ( x => server . ConnectedUsers . ContainsKey ( x ) ) ) ;
420+ merged . Defenders . AddRange ( squad . Defenders . Where ( x => server . ConnectedUsers . ContainsKey ( x ) ) ) ;
421+ }
414422
415- if ( squad . Defenders . Count > 0 && squad . Attackers . Count > 0 )
423+ if ( merged . Defenders . Count > 0 && merged . Attackers . Count > 0 )
416424 {
417425 // battle (may be uneven)
418426 try
419427 {
420- var battle = new PlanetWarsServerBattle ( server , squad ) ;
428+ merged . TeamSize = Math . Max ( merged . Attackers . Count , merged . Defenders . Count ) ;
429+ var battle = new PlanetWarsServerBattle ( server , merged ) ;
421430 await server . AddBattle ( battle ) ;
422- RunningBattles [ battle . BattleID ] = squad ;
431+ RunningBattles [ battle . BattleID ] = merged ;
423432
424- foreach ( var usr in squad . Attackers . Union ( squad . Defenders ) )
433+ foreach ( var usr in merged . Attackers . Union ( merged . Defenders ) )
425434 await server . ForceJoinBattle ( usr , battle ) ;
426435
427436 if ( await battle . StartGame ( ) )
428437 {
429- var text = $ "Battle for planet { squad . Name } starts on zk://@join_player:{ squad . Attackers . FirstOrDefault ( ) } Roster: { string . Join ( "," , squad . Attackers ) } vs { string . Join ( "," , squad . Defenders ) } ";
438+ var text = $ "Battle for planet { merged . Name } starts on zk://@join_player:{ merged . Attackers . FirstOrDefault ( ) } Roster: { string . Join ( "," , merged . Attackers ) } vs { string . Join ( "," , merged . Defenders ) } ";
430439 foreach ( var fac in factions ) await server . GhostChanSay ( fac . Shortcut , text ) ;
431440 }
432441 else
@@ -440,10 +449,10 @@ private async Task LaunchAllBattles()
440449 Trace . TraceError ( "PlanetWars LaunchBattle error: {0}" , ex ) ;
441450 }
442451 }
443- else if ( squad . Attackers . Count > 0 )
452+ else if ( merged . Attackers . Count > 0 )
444453 {
445454 // concede - zero defenders
446- RecordPlanetwarsLoss ( squad ) ;
455+ RecordPlanetwarsLoss ( merged ) ;
447456 }
448457 // else: no attackers left, skip entirely
449458 }
0 commit comments