Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions config/default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,5 @@ runtime:
resources:
calculation: 'no-distance-simple-multiply'
warehouse: 'base-resource-summary'
queue:
resourceConsumer: 'simple-resource-consumer'
2 changes: 2 additions & 0 deletions config/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,5 @@ runtime:
resources:
calculation: 'no-distance-simple-multiply'
warehouse: 'base-resource-summary'
queue:
resourceConsumer: 'simple-resource-consumer'
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@ import {BuildingModel} from '@warp-core/database/model/building.model';
import {QueueElementCostModel} from '@warp-core/database/model/queue-element-cost.model';
import {AddToQueueInput} from '@warp-core/user/queue/building-queue/input/add-to-queue.input';

export interface ResourcesCalculatorInterface {
export abstract class BuildingQueueResourceConsumerInterface {
/**
* Method to calculate resources for queue
* @param addToQueueElement
* @param buildingZone
* @param building
*/
calculateResourcesCosts(
public abstract calculateResourcesCosts(
addToQueueElement: AddToQueueInput,
buildingZone: BuildingZoneModel,
building: BuildingModel,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,34 +32,6 @@ describe('Simple calculation of resources for queue element', () => {
},
queueCosts: [],
},
{
name: 'empty queue cost when demanded resources are not construction related',
addToQueue: {
endLevel: 2,
},
buildingZone: {
level: 1,
},
building: {
buildingDetailsAtCertainLevel: [
{
level: 1,
},
{
level: 2,
requirements: [
{
resource: {
type: ResourceTypeEnum.TECHNOLOGY_RESOURCE,
},
cost: 5,
},
],
},
],
},
queueCosts: [],
},
{
name: 'single resource in queue cost when update require one resource',
addToQueue: {
Expand All @@ -78,7 +50,7 @@ describe('Simple calculation of resources for queue element', () => {
requirements: [
{
resource: {
type: ResourceTypeEnum.CONSTRUCTION_RESOURCE,
type: ResourceTypeEnum.TECHNOLOGY_RESOURCE,
},
cost: 5,
},
Expand All @@ -90,7 +62,7 @@ describe('Simple calculation of resources for queue element', () => {
{
cost: 5,
resource: {
type: ResourceTypeEnum.CONSTRUCTION_RESOURCE,
type: ResourceTypeEnum.TECHNOLOGY_RESOURCE,
},
},
],
Expand Down Expand Up @@ -147,9 +119,9 @@ describe('Simple calculation of resources for queue element', () => {
],
},
{
name: 'single resource in queue cost when update by multiple levels require one resource',
name: 'multiple resource types in queue cost when update by one level require two resources',
addToQueue: {
endLevel: 3,
endLevel: 2,
},
buildingZone: {
level: 1,
Expand All @@ -164,20 +136,15 @@ describe('Simple calculation of resources for queue element', () => {
requirements: [
{
resource: {
id: 'coal',
id: 'wood',
type: ResourceTypeEnum.CONSTRUCTION_RESOURCE,
},
cost: 5,
},
],
},
{
level: 3,
requirements: [
{
resource: {
id: 'coal',
type: ResourceTypeEnum.CONSTRUCTION_RESOURCE,
type: ResourceTypeEnum.ENERGY_RESOURCE,
},
cost: 10,
},
Expand All @@ -188,17 +155,24 @@ describe('Simple calculation of resources for queue element', () => {
queueCosts: [
{
resource: {
id: 'coal',
id: 'wood',
type: ResourceTypeEnum.CONSTRUCTION_RESOURCE,
},
cost: 15,
cost: 5,
},
{
resource: {
id: 'coal',
type: ResourceTypeEnum.ENERGY_RESOURCE,
},
cost: 10,
},
],
},
{
name: 'multiple resources in queue cost when update by multiple levels require multiple resources',
name: 'single resource in queue cost when update by multiple levels require one resource',
addToQueue: {
endLevel: 5,
endLevel: 3,
},
buildingZone: {
level: 1,
Expand Down Expand Up @@ -230,44 +204,6 @@ describe('Simple calculation of resources for queue element', () => {
},
cost: 10,
},
{
resource: {
id: 'wood',
type: ResourceTypeEnum.CONSTRUCTION_RESOURCE,
},
cost: 5,
},
],
},
{
level: 4,
requirements: [
{
resource: {
id: 'coal',
type: ResourceTypeEnum.CONSTRUCTION_RESOURCE,
},
cost: 30,
},
{
resource: {
id: 'wood',
type: ResourceTypeEnum.CONSTRUCTION_RESOURCE,
},
cost: 50,
},
],
},
{
level: 5,
requirements: [
{
resource: {
id: 'wood',
type: ResourceTypeEnum.CONSTRUCTION_RESOURCE,
},
cost: 75,
},
],
},
],
Expand All @@ -278,19 +214,12 @@ describe('Simple calculation of resources for queue element', () => {
id: 'coal',
type: ResourceTypeEnum.CONSTRUCTION_RESOURCE,
},
cost: 45,
},
{
resource: {
id: 'wood',
type: ResourceTypeEnum.CONSTRUCTION_RESOURCE,
},
cost: 130,
cost: 15,
},
],
},
{
name: 'multiple resources in queue cost when update by multiple levels require multiple resources but not all resources are construction type',
name: 'multiple resources in queue cost when update by multiple levels require multiple resources',
addToQueue: {
endLevel: 5,
},
Expand All @@ -312,13 +241,6 @@ describe('Simple calculation of resources for queue element', () => {
},
cost: 5,
},
{
resource: {
id: 'brain',
type: ResourceTypeEnum.TECHNOLOGY_RESOURCE,
},
cost: 1,
},
],
},
{
Expand All @@ -338,13 +260,6 @@ describe('Simple calculation of resources for queue element', () => {
},
cost: 5,
},
{
resource: {
id: 'brain',
type: ResourceTypeEnum.TECHNOLOGY_RESOURCE,
},
cost: 1,
},
],
},
{
Expand Down Expand Up @@ -376,13 +291,6 @@ describe('Simple calculation of resources for queue element', () => {
},
cost: 75,
},
{
resource: {
id: 'brain',
type: ResourceTypeEnum.TECHNOLOGY_RESOURCE,
},
cost: 1,
},
],
},
],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
import {Injectable} from '@nestjs/common';

import {ResourceTypeEnum} from '@warp-core/database/enum/resource-type.enum';
import {AddMechanic} from '@warp-core/core/utils/mechanics';
import {BuildingZoneModel} from '@warp-core/database/model/building-zone.model';
import {BuildingModel} from '@warp-core/database/model/building.model';
import {QueueElementCostModel} from '@warp-core/database/model/queue-element-cost.model';
import {ResourceModel} from '@warp-core/database/model/resource.model';
import {ResourcesCalculatorInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/resources-calculator.interface';
import {BuildingQueueResourceConsumerInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/building-queue-resource-consumer.interface';
import {AddToQueueInput} from '@warp-core/user/queue/building-queue/input/add-to-queue.input';

@Injectable()
export class SimpleCalculationService implements ResourcesCalculatorInterface {
@AddMechanic(BuildingQueueResourceConsumerInterface, 'simple-resource-consumer')
export class SimpleCalculationService
implements BuildingQueueResourceConsumerInterface
{
public async calculateResourcesCosts(
addToQueueElement: AddToQueueInput,
buildingZone: BuildingZoneModel,
Expand All @@ -33,15 +36,11 @@

for (const buildingUpdateCost of buildingUpdateCosts) {
const resource = await buildingUpdateCost.resource;

if (resource.type !== ResourceTypeEnum.CONSTRUCTION_RESOURCE) {
continue;
}
this.addToQueueCost(queueCost, resource, buildingUpdateCost.cost);
}
}

return Array.from(queueCost, ([resourceName, cost]) => cost);

Check warning on line 43 in src/user/queue/building-queue/add/calculate-resources/simple-calculation.service.ts

View workflow job for this annotation

GitHub Actions / test (22.x)

'resourceName' is defined but never used

Check warning on line 43 in src/user/queue/building-queue/add/calculate-resources/simple-calculation.service.ts

View workflow job for this annotation

GitHub Actions / test (24.x)

'resourceName' is defined but never used
}

private addToQueueCost(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {QueueElementCostModel} from '@warp-core/database/model/queue-element-cos
import {BuildingQueueRepository} from '@warp-core/database/repository/building-queue.repository';
import {BuildingZoneRepository} from '@warp-core/database/repository/building-zone.repository';
import {BuildingQueryEmitter} from '@warp-core/global/building';
import {ResourcesCalculatorInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/resources-calculator.interface';
import {BuildingQueueResourceConsumerInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/building-queue-resource-consumer.interface';
import {PrepareSingleBuildingQueueElementService} from '@warp-core/user/queue/building-queue/add/prepare-single-building-queue-element.service';
import {AddToQueueInput} from '@warp-core/user/queue/building-queue/input/add-to-queue.input';

Expand All @@ -25,7 +25,7 @@ describe('Prepare single building queue element tests', () => {
let buildingZoneRepository: jest.Mocked<BuildingZoneRepository>;
let buildingService: jest.Mocked<BuildingQueryEmitter>;
let habitatMock: jest.Mocked<AuthorizedHabitatModel>;
let resourcesCalculator: ResourcesCalculatorInterface;
let resourcesCalculator: BuildingQueueResourceConsumerInterface;

beforeEach(async () => {
jest.clearAllMocks();
Expand All @@ -42,7 +42,7 @@ describe('Prepare single building queue element tests', () => {
BuildingQueryEmitter,
AuthorizedHabitatModel,
{
provide: 'QUEUE_ADD_CALCULATION',
provide: BuildingQueueResourceConsumerInterface,
useValue: resourcesCalculator,
},
],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {Inject, Injectable} from '@nestjs/common';
import {Injectable} from '@nestjs/common';
import {DateTime} from 'luxon';

import {AuthorizedHabitatModel} from '@warp-core/auth';
Expand All @@ -9,15 +9,14 @@ import {BuildingModel} from '@warp-core/database/model/building.model';
import {BuildingQueueRepository} from '@warp-core/database/repository/building-queue.repository';
import {BuildingZoneRepository} from '@warp-core/database/repository/building-zone.repository';
import {BuildingQueryEmitter} from '@warp-core/global/building';
import {ResourcesCalculatorInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/resources-calculator.interface';
import {BuildingQueueResourceConsumerInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/building-queue-resource-consumer.interface';
import {QueueError} from '@warp-core/user/queue/building-queue/exception/queue.error';
import {AddToQueueInput} from '@warp-core/user/queue/building-queue/input/add-to-queue.input';

@Injectable()
export class PrepareSingleBuildingQueueElementService {
constructor(
@Inject('QUEUE_ADD_CALCULATION')
protected readonly calculationService: ResourcesCalculatorInterface,
protected readonly calculationService: BuildingQueueResourceConsumerInterface,
protected readonly buildingQueueRepository: BuildingQueueRepository,
protected readonly buildingZoneRepository: BuildingZoneRepository,
protected readonly buildingService: BuildingQueryEmitter,
Expand Down
11 changes: 7 additions & 4 deletions src/user/queue/building-queue/building-queue.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ import {MiddlewareConsumer, Module, NestModule} from '@nestjs/common';

import {AuthModule} from '@warp-core/auth';
import {CoreConfigModule} from '@warp-core/core/config/core-config.module';
import {RegisterMechanic} from '@warp-core/core/utils/mechanics';
import {DatabaseModule} from '@warp-core/database/database.module';
import {BuildingQueryEmitter} from '@warp-core/global/building';
import {BuildingZoneEmitter} from '@warp-core/user/building-zone/exchange';
import {BuildingQueueAddService} from '@warp-core/user/queue/building-queue/add/building-queue-add.service';
import {BuildingQueueDraftService} from '@warp-core/user/queue/building-queue/add/building-queue-draft.service';
import {BuildingQueueResourceConsumerInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/building-queue-resource-consumer.interface';
import {SimpleCalculationService} from '@warp-core/user/queue/building-queue/add/calculate-resources/simple-calculation.service';
import {PrepareSingleBuildingQueueElementService} from '@warp-core/user/queue/building-queue/add/prepare-single-building-queue-element.service';
import {BuildingQueueHandlerService} from '@warp-core/user/queue/building-queue/building-queue-handler.service';
Expand Down Expand Up @@ -40,10 +42,11 @@ import {QueueConsumerMiddleware} from '@warp-core/user/queue/building-queue/queu
BuildingQueueProcessingEmitter,
ValidateSingleQueueElementService,
QueueConsumerMiddleware,
{
provide: 'QUEUE_ADD_CALCULATION',
useClass: SimpleCalculationService,
},
SimpleCalculationService,
RegisterMechanic.forFeature(
BuildingQueueResourceConsumerInterface,
'runtime.mechanics.queue.resourceConsumer',
),
],
imports: [DatabaseModule, CoreConfigModule, AuthModule],
})
Expand Down
Loading