From 4ade5d4bc330f2945a48ab9b4e58f58caf011278 Mon Sep 17 00:00:00 2001 From: MrKBear Date: Sun, 8 May 2022 21:33:38 +0800 Subject: [PATCH] Add manufacture behavior --- source/Behavior/Behavior.ts | 2 + source/Behavior/Manufacture.ts | 83 ++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 source/Behavior/Manufacture.ts diff --git a/source/Behavior/Behavior.ts b/source/Behavior/Behavior.ts index b603a2f..bc06b78 100644 --- a/source/Behavior/Behavior.ts +++ b/source/Behavior/Behavior.ts @@ -10,6 +10,7 @@ import { DelayAssimilate } from "@Behavior/DelayAssimilate"; import { Avoidance } from "@Behavior/Avoidance"; import { DirectionCluster } from "@Behavior/DirectionCluster"; import { CentralCluster } from "@Behavior/CentralCluster"; +import { Manufacture } from "@Behavior/Manufacture"; const AllBehaviors: IAnyBehaviorRecorder[] = [ new BehaviorRecorder(Template), @@ -23,6 +24,7 @@ const AllBehaviors: IAnyBehaviorRecorder[] = [ new BehaviorRecorder(Avoidance), new BehaviorRecorder(DirectionCluster), new BehaviorRecorder(CentralCluster), + new BehaviorRecorder(Manufacture), ] /** diff --git a/source/Behavior/Manufacture.ts b/source/Behavior/Manufacture.ts new file mode 100644 index 0000000..7a8e0fe --- /dev/null +++ b/source/Behavior/Manufacture.ts @@ -0,0 +1,83 @@ +import { Behavior } from "@Model/Behavior"; +import { Group } from "@Model/Group"; +import { Individual } from "@Model/Individual"; +import { Model } from "@Model/Model"; + +type IManufactureBehaviorParameter = { + maxFrequency: "number", + minFrequency: "number", + genTarget: "CG", +} + +type IManufactureBehaviorEvent = {} + +class Manufacture extends Behavior { + + public override behaviorId: string = "Manufacture"; + + public override behaviorName: string = "$Title"; + + public override iconName: string = "ProductionFloorManagement"; + + public override describe: string = "$Intro"; + + public override category: string = "$Initiative"; + + public override parameterOption = { + genTarget: { type: "CG", name: "$Gen.Target" }, + maxFrequency: { type: "number", name: "$Max.Frequency", defaultValue: 5, numberStep: .1, numberMin: 0 }, + minFrequency: { type: "number", name: "$Min.Frequency", defaultValue: 0, numberStep: .1, numberMin: 0 } + }; + + public effect = (individual: Individual, group: Group, model: Model, t: number): void => { + + const {genTarget, maxFrequency, minFrequency} = this.parameter; + + if (genTarget.objects) { + + let nextTime = individual.getData("Manufacture.nextTime") ?? + minFrequency + Math.random() * (maxFrequency - minFrequency); + let currentTime = individual.getData("Manufacture.currentTime") ?? 0; + + if (currentTime > nextTime) { + + // 生成个体 + let newIndividual = genTarget.objects.new(1); + newIndividual.position = individual.position.concat([]); + + nextTime = minFrequency + Math.random() * (maxFrequency - minFrequency); + currentTime = 0; + } + + currentTime += t; + + individual.setData("Manufacture.nextTime", nextTime); + individual.setData("Manufacture.currentTime", currentTime); + } + } + + public override terms: Record> = { + "$Title": { + "ZH_CN": "生产", + "EN_US": "Manufacture" + }, + "$Intro": { + "ZH_CN": "在指定的群创造新的个体", + "EN_US": "Create new individuals in a given group" + }, + "$Gen.Target": { + "ZH_CN": "目标群", + "EN_US": "Target group" + }, + "$Max.Frequency": { + "ZH_CN": "最大频率", + "EN_US": "Maximum frequency" + }, + "$Min.Frequency": { + "ZH_CN": "最小频率", + "EN_US": "Minimum frequency" + } + }; +} + +export { Manufacture }; \ No newline at end of file