@ -12,33 +12,33 @@ namespace Services.Immortal;
public class BuildOrderService : IBuildOrderService
{
private readonly BuildOrderModel buildOrder = new ( ) ;
private int lastInterval ;
private readonly BuildOrderModel _ buildOrder = new ( ) ;
private readonly IToastService toastService ;
private readonly IToastService _ toastService ;
private int _l astInterval ;
public BuildOrderService ( IToastService toastService )
{
this . toastService = toastService ;
_ toastService = toastService ;
Reset ( ) ;
}
public int BuildingInputDelay { get ; set ; } = 2 ;
public Dictionary < int , List < EntityModel > > StartedOrders = > buildOrder . StartedOrders ;
public Dictionary < int , List < EntityModel > > CompletedOrders = > buildOrder . CompletedOrders ;
public Dictionary < string , int > UniqueCompletedTimes = > buildOrder . UniqueCompletedTimes ;
public Dictionary < int , int > SupplyCountTimes = > buildOrder . SupplyCountTimes ;
public Dictionary < int , List < EntityModel > > StartedOrders = > _ buildOrder . StartedOrders ;
public Dictionary < int , List < EntityModel > > CompletedOrders = > _ buildOrder . CompletedOrders ;
public Dictionary < string , int > UniqueCompletedTimes = > _ buildOrder . UniqueCompletedTimes ;
public Dictionary < int , int > SupplyCountTimes = > _ buildOrder . SupplyCountTimes ;
public int GetLastRequestInterval ( )
{
return l astInterval;
return _l astInterval ;
}
public Dictionary < int , List < EntityModel > > GetOrders ( )
{
return buildOrder . StartedOrders ;
return _ buildOrder . StartedOrders ;
}
public void Subscribe ( Action action )
@ -54,49 +54,52 @@ public class BuildOrderService : IBuildOrderService
public void Add ( EntityModel entity , int atInterval )
{
if ( ! buildOrder . StartedOrders . ContainsKey ( atInterval ) )
buildOrder . StartedOrders . Add ( atInterval , new List < EntityModel > ( ) ) ;
if ( ! _ buildOrder . StartedOrders . ContainsKey ( atInterval ) )
_ buildOrder . StartedOrders . Add ( atInterval , new List < EntityModel > ( ) ) ;
var production = entity . Production ( ) ;
var completedTime = atInterval ;
if ( production ! = null ) completedTime + = production . BuildTime ;
if ( ! buildOrder . CompletedOrders . ContainsKey ( completedTime ) )
buildOrder . CompletedOrders . Add ( completedTime , new List < EntityModel > ( ) ) ;
var supply = entity . Supply ( ) ;
if ( ! _ buildOrder . CompletedOrders . ContainsKey ( completedTime ) )
_ buildOrder . CompletedOrders . Add ( completedTime , new List < EntityModel > ( ) ) ;
_ buildOrder . StartedOrders [ atInterval ] . Add ( entity . Clone ( ) ) ;
_ buildOrder . CompletedOrders [ completedTime ] . Add ( entity . Clone ( ) ) ;
buildOrder . StartedOrders [ atInterval ] . Add ( entity . Clone ( ) ) ;
buildOrder . CompletedOrders [ completedTime ] . Add ( entity . Clone ( ) ) ;
if ( ! _ buildOrder . UniqueCompletedTimes . ContainsKey ( entity . DataType ) )
_ buildOrder . UniqueCompletedTimes . Add ( entity . DataType , atInterval ) ;
if ( ! buildOrder . UniqueCompletedTimes . ContainsKey ( entity . DataType ) )
buildOrder . UniqueCompletedTimes . Add ( entity . DataType , atInterval ) ;
if ( ! buildOrder . UniqueCompletedCount . ContainsKey ( entity . DataType ) )
buildOrder . UniqueCompletedCount . Add ( entity . DataType , 1 ) ;
if ( ! _ buildOrder . UniqueCompletedCount . ContainsKey ( entity . DataType ) )
_ buildOrder . UniqueCompletedCount . Add ( entity . DataType , 1 ) ;
else
buildOrder . UniqueCompletedCount [ entity . DataType ] + + ;
_ buildOrder . UniqueCompletedCount [ entity . DataType ] + + ;
//entity.
if ( ! buildOrder . UniqueCompleted . ContainsKey ( entity . DataType ) )
buildOrder . UniqueCompleted . Add ( entity . DataType , new Dictionary < int , List < EntityModel > > ( ) ) ;
if ( ! _ buildOrder . UniqueCompleted . ContainsKey ( entity . DataType ) )
_ buildOrder . UniqueCompleted . Add ( entity . DataType , new Dictionary < int , List < EntityModel > > ( ) ) ;
if ( ! buildOrder . UniqueCompleted [ entity . DataType ] . ContainsKey ( completedTime ) )
buildOrder . UniqueCompleted [ entity . DataType ] . Add ( completedTime , new List < EntityModel > ( ) ) ;
if ( ! _ buildOrder . UniqueCompleted [ entity . DataType ] . ContainsKey ( completedTime ) )
_ buildOrder . UniqueCompleted [ entity . DataType ] . Add ( completedTime , new List < EntityModel > ( ) ) ;
buildOrder . UniqueCompleted [ entity . DataType ] [ completedTime ] . Add ( entity ) ;
if ( entity . Production ( ) ? . ProducedBy ! = null )
_ buildOrder . TrainingCapacityUsed . Add ( new TrainingCapacityUsedModel
{
StartingUsageTime = atInterval ,
StopUsageTime = completedTime ,
UsedSlots = entity . Supply ( ) ! = null ? entity . Supply ( ) ! . Takes : 1 ,
UsedBuilding = entity . Production ( ) ! . ProducedBy
} ) ;
_ buildOrder . UniqueCompleted [ entity . DataType ] [ completedTime ] . Add ( entity ) ;
if ( supply ! = null )
{
if ( ! supply . Takes . Equals ( 0 ) ) buildOrder . CurrentSupplyUsed + = supply . Takes ;
if ( ! supply . Grants . Equals ( 0 ) )
buildOrder . SupplyCountTimes . Add ( buildOrder . SupplyCountTimes . Last ( ) . Key + supply . Grants , completedTime ) ;
}
if ( entity . Supply ( ) ! = null & & entity . Supply ( ) ! . Takes > 0 )
_ buildOrder . CurrentSupplyUsed + = entity . Supply ( ) ! . Takes ;
if ( entity . Supply ( ) ! = null & & entity . Supply ( ) ! . Grants > 0 )
_ buildOrder . SupplyCountTimes . Add ( _ buildOrder . SupplyCountTimes . Last ( ) . Key + entity . Supply ( ) ! . Grants ,
completedTime ) ;
if ( atInterval > lastInterval ) l astInterval = atInterval ;
if ( atInterval > _l astInterval ) _l astInterval = atInterval ;
NotifyDataChanged ( ) ;
}
@ -105,17 +108,18 @@ public class BuildOrderService : IBuildOrderService
{
if ( forInterval < 0 )
{
toastService . AddToast ( new ToastModel ( ) { SeverityType = SeverityType . Error , Title = "Wait" , Message = "This should never happen." } ) ;
_ toastService . AddToast ( new ToastModel
{ SeverityType = SeverityType . Error , Title = "Wait" , Message = "This should never happen." } ) ;
return false ;
} ;
}
l astInterval + = forInterval ;
_l astInterval + = forInterval ;
if ( ! buildOrder . StartedOrders . ContainsKey ( l astInterval) )
buildOrder . StartedOrders . Add ( l astInterval, new List < EntityModel > ( ) ) ;
if ( ! _ buildOrder . StartedOrders . ContainsKey ( _l astInterval ) )
_ buildOrder . StartedOrders . Add ( _l astInterval , new List < EntityModel > ( ) ) ;
if ( ! buildOrder . CompletedOrders . ContainsKey ( l astInterval) )
buildOrder . CompletedOrders . Add ( l astInterval, new List < EntityModel > ( ) ) ;
if ( ! _ buildOrder . CompletedOrders . ContainsKey ( _l astInterval ) )
_ buildOrder . CompletedOrders . Add ( _l astInterval , new List < EntityModel > ( ) ) ;
NotifyDataChanged ( ) ;
return true ;
@ -123,19 +127,23 @@ public class BuildOrderService : IBuildOrderService
public bool AddWaitTo ( int interval )
{
if ( interval < = l astInterval)
if ( interval < = _l astInterval )
{
toastService . AddToast ( new ToastModel ( ) { SeverityType = SeverityType . Error , Title = "Logic Error" , Message = "You cannot wait to a time that has already elapsed." } ) ;
_ toastService . AddToast ( new ToastModel
{
SeverityType = SeverityType . Error , Title = "Logic Error" ,
Message = "You cannot wait to a time that has already elapsed."
} ) ;
return false ;
}
lastInterval = interval ;
_l astInterval = interval ;
if ( ! buildOrder . StartedOrders . ContainsKey ( l astInterval) )
buildOrder . StartedOrders . Add ( l astInterval, new List < EntityModel > ( ) ) ;
if ( ! _ buildOrder . StartedOrders . ContainsKey ( _l astInterval ) )
_ buildOrder . StartedOrders . Add ( _l astInterval , new List < EntityModel > ( ) ) ;
if ( ! buildOrder . CompletedOrders . ContainsKey ( l astInterval) )
buildOrder . CompletedOrders . Add ( l astInterval, new List < EntityModel > ( ) ) ;
if ( ! _ buildOrder . CompletedOrders . ContainsKey ( _l astInterval ) )
_ buildOrder . CompletedOrders . Add ( _l astInterval , new List < EntityModel > ( ) ) ;
NotifyDataChanged ( ) ;
return true ;
@ -149,7 +157,7 @@ public class BuildOrderService : IBuildOrderService
var metTime = 0 ;
foreach ( var requiredEntity in requirements )
if ( buildOrder . UniqueCompletedTimes . TryGetValue ( requiredEntity . Id , out var completedTime ) )
if ( _ buildOrder . UniqueCompletedTimes . TryGetValue ( requiredEntity . Id , out var completedTime ) )
{
if ( completedTime > metTime ) metTime = completedTime ;
}
@ -167,8 +175,8 @@ public class BuildOrderService : IBuildOrderService
if ( supply = = null | | supply . Takes . Equals ( 0 ) ) return 0 ;
foreach ( var supplyAtTime in buildOrder . SupplyCountTimes )
if ( supply . Takes + buildOrder . CurrentSupplyUsed < supplyAtTime . Key )
foreach ( var supplyAtTime in _ buildOrder . SupplyCountTimes )
if ( supply . Takes + _ buildOrder . CurrentSupplyUsed < = supplyAtTime . Key )
return supplyAtTime . Value ;
return null ;
@ -177,7 +185,7 @@ public class BuildOrderService : IBuildOrderService
public bool Add ( EntityModel entity , IEconomyService withEconomy )
{
var atInterval = l astInterval;
var atInterval = _l astInterval ;
if ( ! HandleSupply ( entity , ref atInterval ) ) return false ;
if ( ! HandleRequirements ( entity , ref atInterval ) ) return false ;
@ -190,47 +198,47 @@ public class BuildOrderService : IBuildOrderService
public void RemoveLast ( )
{
if ( buildOrder . StartedOrders . Keys . Count > 1 )
if ( _ buildOrder . StartedOrders . Keys . Count > 1 )
{
if ( buildOrder . StartedOrders . Count = = 0 )
if ( _ buildOrder . StartedOrders . Count = = 0 )
{
buildOrder . StartedOrders . Remove ( buildOrder . StartedOrders . Last ( ) . Key ) ;
buildOrder . CompletedOrders . Remove ( buildOrder . CompletedOrders . Last ( ) . Key ) ;
_ buildOrder . StartedOrders . Remove ( _ buildOrder . StartedOrders . Last ( ) . Key ) ;
_ buildOrder . CompletedOrders . Remove ( _ buildOrder . CompletedOrders . Last ( ) . Key ) ;
lastInterval = buildOrder . StartedOrders . Last ( ) . Key ;
_l astInterval = _ buildOrder . StartedOrders . Last ( ) . Key ;
return ;
}
var lastStarted = buildOrder . StartedOrders . Keys . Last ( ) ;
var lastCompleted = buildOrder . CompletedOrders . Keys . Last ( ) ;
var lastStarted = _ buildOrder . StartedOrders . Keys . Last ( ) ;
var lastCompleted = _ buildOrder . CompletedOrders . Keys . Last ( ) ;
EntityModel entityRemoved = default ! ;
if ( buildOrder . StartedOrders [ lastStarted ] . Count > 0 )
if ( _ buildOrder . StartedOrders [ lastStarted ] . Count > 0 )
{
entityRemoved = buildOrder . StartedOrders [ lastStarted ] . Last ( ) ;
buildOrder . StartedOrders [ lastStarted ] . Remove ( buildOrder . StartedOrders [ lastStarted ] . Last ( ) ) ;
buildOrder . CompletedOrders [ lastCompleted ] . Remove ( buildOrder . CompletedOrders [ lastCompleted ] . Last ( ) ) ;
entityRemoved = _ buildOrder . StartedOrders [ lastStarted ] . Last ( ) ;
_ buildOrder . StartedOrders [ lastStarted ] . Remove ( _ buildOrder . StartedOrders [ lastStarted ] . Last ( ) ) ;
_ buildOrder . CompletedOrders [ lastCompleted ] . Remove ( _ buildOrder . CompletedOrders [ lastCompleted ] . Last ( ) ) ;
}
if ( buildOrder . StartedOrders [ lastStarted ] . Count = = 0 ) buildOrder . StartedOrders . Remove ( lastStarted ) ;
if ( buildOrder . CompletedOrders [ lastCompleted ] . Count = = 0 ) buildOrder . CompletedOrders . Remove ( lastCompleted ) ;
if ( _ buildOrder . StartedOrders [ lastStarted ] . Count = = 0 ) _ buildOrder . StartedOrders . Remove ( lastStarted ) ;
if ( _ buildOrder . CompletedOrders [ lastCompleted ] . Count = = 0 )
_ buildOrder . CompletedOrders . Remove ( lastCompleted ) ;
if ( buildOrder . StartedOrders . Keys . Count > 0 )
lastInterval = buildOrder . StartedOrders . Keys . Last ( ) ;
if ( _ buildOrder . StartedOrders . Keys . Count > 0 )
_l astInterval = _ buildOrder . StartedOrders . Keys . Last ( ) ;
else
l astInterval = 0 ;
_l astInterval = 0 ;
if ( entityRemoved . Supply ( ) ? . Grants > 0 )
SupplyCountTimes . Remove ( SupplyCountTimes . Last ( ) . Key ) ;
if ( entityRemoved . Supply ( ) ? . Takes > 0 )
buildOrder . CurrentSupplyUsed - = entityRemoved . Supply ( ) ! . Takes ;
_ buildOrder . CurrentSupplyUsed - = entityRemoved . Supply ( ) ! . Takes ;
buildOrder . UniqueCompletedCount [ entityRemoved ! . DataType ] - - ;
if ( buildOrder . UniqueCompletedCount [ entityRemoved ! . DataType ] = = 0 )
_ buildOrder . UniqueCompletedCount [ entityRemoved ! . DataType ] - - ;
if ( _ buildOrder . UniqueCompletedCount [ entityRemoved ! . DataType ] = = 0 )
UniqueCompletedTimes . Remove ( entityRemoved . DataType ) ;
if ( entityRemoved . Info ( ) . Descriptive = = DescriptiveType . Worker )
@ -251,14 +259,14 @@ public class BuildOrderService : IBuildOrderService
WriteIndented = true
} ;
options . Converters . Add ( new JsonStringEnumConverter ( ) ) ;
return JsonSerializer . Serialize ( buildOrder , options ) ;
return JsonSerializer . Serialize ( _ buildOrder , options ) ;
}
public string BuildOrderAsYaml ( )
{
var stringBuilder = new StringBuilder ( ) ;
var serializer = new Serializer ( ) ;
stringBuilder . AppendLine ( serializer . Serialize ( buildOrder ) ) ;
stringBuilder . AppendLine ( serializer . Serialize ( _ buildOrder ) ) ;
var buildOrderText = stringBuilder . ToString ( ) ;
return buildOrderText ;
}
@ -266,7 +274,7 @@ public class BuildOrderService : IBuildOrderService
public List < EntityModel > GetCompletedBefore ( int interval )
{
return ( from ordersAtTime in buildOrder . StartedOrders
return ( from ordersAtTime in _ buildOrder . StartedOrders
from orders in ordersAtTime . Value
where ordersAtTime . Key + ( orders . Production ( ) = = null ? 0 : orders . Production ( ) . BuildTime ) < = interval
select orders ) . ToList ( ) ;
@ -274,7 +282,7 @@ public class BuildOrderService : IBuildOrderService
public List < EntityModel > GetHarvestPointsCompletedBefore ( int interval )
{
return ( from ordersAtTime in buildOrder . StartedOrders
return ( from ordersAtTime in _ buildOrder . StartedOrders
from orders in ordersAtTime . Value
where ordersAtTime . Key + ( orders . Production ( ) = = null ? 0 : orders . Production ( ) . BuildTime ) < = interval
where orders . Harvest ( ) ! = null
@ -284,24 +292,24 @@ public class BuildOrderService : IBuildOrderService
public void SetName ( string name )
{
buildOrder . Name = name ;
_ buildOrder . Name = name ;
NotifyDataChanged ( ) ;
}
public string GetName ( )
{
return buildOrder . Name ;
return _ buildOrder . Name ;
}
public void SetNotes ( string notes )
{
buildOrder . Notes = notes ;
_ buildOrder . Notes = notes ;
NotifyDataChanged ( ) ;
}
public string GetNotes ( )
{
return buildOrder . Notes ;
return _ buildOrder . Notes ;
}
public void DeprecatedSetColor ( string color )
@ -315,37 +323,39 @@ public class BuildOrderService : IBuildOrderService
public void Reset ( )
{
l astInterval = 0 ;
buildOrder . Initialize ( DataType . FACTION_Aru ) ;
_l astInterval = 0 ;
_ buildOrder . Initialize ( DataType . FACTION_Aru ) ;
NotifyDataChanged ( ) ;
}
public bool AddWaitTo ( int interval , TimingService timingService )
public int? WillMeetTrainingQueue ( EntityModel entity )
{
if ( lastInterval > = interval ) return false ;
if ( interval > timingService . GetAttackTime ( ) ) return false ;
var supply = entity . Supply ( ) ;
var production = entity . Production ( ) ;
if ( supply = = null | | production = = null | | supply . Takes . Equals ( 0 ) ) return 1 ;
if ( ! buildOrder . StartedOrders . ContainsKey ( lastInterval ) )
buildOrder . StartedOrders . Add ( lastInterval , new List < EntityModel > ( ) ) ;
var producedBy = production . ProducedBy ;
if ( producedBy = = null )
return 1 ;
if ( ! buildOrder . CompletedOrders . ContainsKey ( lastInterval ) )
buildOrder . CompletedOrders . Add ( lastInterval , new List < EntityModel > ( ) ) ;
var uniqueCompleted = _ buildOrder . UniqueCompleted [ producedBy ] ;
NotifyDataChanged ( ) ;
return true ;
}
public int? WillMeetTrainingQueue ( EntityModel entity )
{
var supply = entity . Supply ( ) ;
foreach ( var used in _ buildOrder . TrainingCapacityUsed )
{
//used.UsedBuilding
}
if ( supply = = null | | supply . Takes . Equals ( 0 ) ) return 0 ;
foreach ( var atTime in uniqueCompleted )
{
foreach ( var productionEntity in uniqueCompleted [ atTime . Key ] )
{
}
}
foreach ( var supplyAtTime in buildOrder . SupplyCountTimes )
if ( supply . Takes + buildOrder . CurrentSupplyUsed < supplyAtTime . Key )
foreach ( var supplyAtTime in _ buildOrder . SupplyCountTimes )
if ( supply . Takes + _ buildOrder . CurrentSupplyUsed < supplyAtTime . Key )
return supplyAtTime . Value ;
return null ;
@ -375,14 +385,14 @@ public class BuildOrderService : IBuildOrderService
}
if ( withEconomy . GetOverTime ( ) . Last ( ) . Ether < production . Ether )
toastService . AddToast ( new ToastModel
_ toastService . AddToast ( new ToastModel
{
Title = "Not Enough Ether" , Message = "Build more ether extractors!" ,
SeverityType = SeverityType . Error
} ) ;
if ( withEconomy . GetOverTime ( ) . Last ( ) . Alloy < production . Alloy )
toastService . AddToast ( new ToastModel
_ toastService . AddToast ( new ToastModel
{
Title = "Not Enough Alloy" , Message = "Build more bases!" ,
SeverityType = SeverityType . Error
@ -396,7 +406,7 @@ public class BuildOrderService : IBuildOrderService
var minSupplyInterval = WillMeetSupply ( entity ) ;
if ( minSupplyInterval = = null )
{
toastService . AddToast ( new ToastModel
_ toastService . AddToast ( new ToastModel
{
Title = "Supply Cap Reached" , Message = "Build more supply!" ,
SeverityType = SeverityType . Error
@ -415,7 +425,7 @@ public class BuildOrderService : IBuildOrderService
var minSupplyInterval = WillMeetSupply ( entity ) ;
if ( minSupplyInterval = = null )
{
toastService . AddToast ( new ToastModel
_ toastService . AddToast ( new ToastModel
{
Title = "Supply Cap Reached" , Message = "Build more supply!" ,
SeverityType = SeverityType . Error
@ -435,7 +445,7 @@ public class BuildOrderService : IBuildOrderService
var minRequirementInterval = WillMeetRequirements ( entity ) ;
if ( minRequirementInterval = = null )
{
toastService . AddToast ( new ToastModel
_ toastService . AddToast ( new ToastModel
{
Title = "Missing Requirements" , Message = "You don't have what's needed for this unit." ,
SeverityType = SeverityType . Error