Fix hero balance
Add tests for checking
This commit is contained in:
		| @@ -3,9 +3,10 @@ import { Args } from '../Command'; | ||||
| import { Task } from '../Queue/TaskQueue'; | ||||
| import { grabResources, grabResourceStorage } from '../Page/ResourcesBlock'; | ||||
| import { changeHeroResource, grabCurrentHeroResource } from '../Page/HeroPage'; | ||||
| import { HeroAllResources, Resources } from '../Game'; | ||||
| import { HeroAllResources } from '../Game'; | ||||
| import { grabActiveVillageId } from '../Page/VillageBlock'; | ||||
| import { HeroState } from '../State/HeroState'; | ||||
| import { Core } from '../Core/HeroBalance'; | ||||
|  | ||||
| @registerAction | ||||
| export class BalanceHeroResourcesAction extends ActionController { | ||||
| @@ -18,40 +19,16 @@ export class BalanceHeroResourcesAction extends ActionController { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         const resources = this.getRequirements(heroVillageId); | ||||
|  | ||||
|         const resourcesAsList = resources.asList(); | ||||
|         const currentType = grabCurrentHeroResource(); | ||||
|  | ||||
|         const sorted = resourcesAsList.sort((x, y) => y.value - x.value); | ||||
|         const maxRequirement = sorted[0]; | ||||
|         const minRequirement = sorted[sorted.length - 1]; | ||||
|         const delta = Math.abs(maxRequirement.value - minRequirement.value); | ||||
|         const eps = Math.abs(maxRequirement.value / 10); | ||||
|  | ||||
|         console.log('REQUIREMENTS', sorted); | ||||
|         console.log('REQUIREMENTS', maxRequirement, minRequirement, delta, eps); | ||||
|  | ||||
|         const resType = delta > eps ? maxRequirement.type : HeroAllResources; | ||||
|         if (resType !== currentType) { | ||||
|             changeHeroResource(resType); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private getRequirements(heroVillageId): Resources { | ||||
|         const resources = grabResources(); | ||||
|         const requiredResources = this.scheduler.getVillageRequiredResources(heroVillageId); | ||||
|         const totalRequiredResources = this.scheduler.getTotalVillageRequiredResources(heroVillageId); | ||||
|  | ||||
|         if (requiredResources.gt(resources)) { | ||||
|             return requiredResources.sub(resources); | ||||
|         } | ||||
|  | ||||
|         if (totalRequiredResources.gt(resources)) { | ||||
|             return totalRequiredResources.sub(resources); | ||||
|         } | ||||
|  | ||||
|         const storage = grabResourceStorage(); | ||||
|         return Resources.fromStorage(storage).sub(resources); | ||||
|         const currentType = grabCurrentHeroResource(); | ||||
|  | ||||
|         const heroType = Core.calcHeroResource(resources, requiredResources, totalRequiredResources, storage); | ||||
|  | ||||
|         if (heroType !== currentType) { | ||||
|             changeHeroResource(heroType); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										43
									
								
								src/Core/HeroBalance.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/Core/HeroBalance.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| import { HeroAllResources, HeroResourceType, Resources, ResourceStorage } from '../Game'; | ||||
|  | ||||
| export namespace Core { | ||||
|     export function calcHeroResource( | ||||
|         current: Resources, | ||||
|         required: Resources, | ||||
|         totalRequired: Resources, | ||||
|         storage: ResourceStorage | ||||
|     ): HeroResourceType { | ||||
|         const resourceDiff = calcNeedResources(current, required, totalRequired, storage); | ||||
|         const resourcesAsList = resourceDiff.asList(); | ||||
|  | ||||
|         const sorted = resourcesAsList.filter(x => x.value > 0).sort((x, y) => y.value - x.value); | ||||
|  | ||||
|         if (sorted.length === 0) { | ||||
|             return HeroAllResources; | ||||
|         } | ||||
|  | ||||
|         const maxRequirement = sorted[0]; | ||||
|         const minRequirement = sorted[sorted.length - 1]; | ||||
|         const delta = maxRequirement.value - minRequirement.value; | ||||
|         const eps = maxRequirement.value / 10; | ||||
|  | ||||
|         return delta > eps ? maxRequirement.type : HeroAllResources; | ||||
|     } | ||||
|  | ||||
|     function calcNeedResources( | ||||
|         current: Resources, | ||||
|         required: Resources, | ||||
|         totalRequired: Resources, | ||||
|         storage: ResourceStorage | ||||
|     ): Resources { | ||||
|         if (!current.gt(required)) { | ||||
|             return required.sub(current); | ||||
|         } | ||||
|  | ||||
|         if (!current.gt(totalRequired)) { | ||||
|             return totalRequired.sub(current); | ||||
|         } | ||||
|  | ||||
|         return Resources.fromStorage(storage).sub(current); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user