From 6c483317aa5b73e4a909c9a270e7f8f335e2ec6a Mon Sep 17 00:00:00 2001 From: MrKBear Date: Tue, 12 Apr 2022 17:44:51 +0800 Subject: [PATCH] Add contact assimilate behavior --- source/Behavior/Behavior.ts | 2 + source/Behavior/ContactAssimilate.ts | 88 ++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 source/Behavior/ContactAssimilate.ts diff --git a/source/Behavior/Behavior.ts b/source/Behavior/Behavior.ts index d506530..ca265e0 100644 --- a/source/Behavior/Behavior.ts +++ b/source/Behavior/Behavior.ts @@ -5,6 +5,7 @@ import { Brownian } from "@Behavior/Brownian"; import { BoundaryConstraint } from "@Behavior/BoundaryConstraint"; import { Tracking } from "@Behavior/Tracking"; import { ContactAttacking } from "@Behavior/ContactAttacking"; +import { ContactAssimilate } from "@Behavior/ContactAssimilate"; const AllBehaviors: IAnyBehaviorRecorder[] = [ new BehaviorRecorder(Template), @@ -13,6 +14,7 @@ const AllBehaviors: IAnyBehaviorRecorder[] = [ new BehaviorRecorder(BoundaryConstraint), new BehaviorRecorder(Tracking), new BehaviorRecorder(ContactAttacking), + new BehaviorRecorder(ContactAssimilate), ] /** diff --git a/source/Behavior/ContactAssimilate.ts b/source/Behavior/ContactAssimilate.ts new file mode 100644 index 0000000..a358f5a --- /dev/null +++ b/source/Behavior/ContactAssimilate.ts @@ -0,0 +1,88 @@ +import { Behavior } from "@Model/Behavior"; +import { Group } from "@Model/Group"; +import { Individual } from "@Model/Individual"; +import { Model } from "@Model/Model"; + +type IContactAssimilateBehaviorParameter = { + target: "CLG", + assimilate: "CG", + success: "number", + range: "number" +} + +type IContactAssimilateBehaviorEvent = {} + +class ContactAssimilate extends Behavior { + + public override behaviorId: string = "ContactAssimilate"; + + public override behaviorName: string = "$Title"; + + public override iconName: string = "SyncStatus"; + + public override describe: string = "$Intro"; + + public override category: string = "$Interactive"; + + public override parameterOption = { + target: { type: "CLG", name: "$Target" }, + assimilate: { type: "CG", name: "$Assimilate" }, + range: { type: "number", name: "$Range", defaultValue: .05, numberMin: 0, numberStep: .01 }, + success: { type: "number", name: "$Success", defaultValue: 90, numberMin: 0, numberMax: 100, numberStep: 5 } + }; + + public effect = (individual: Individual, group: Group, model: Model, t: number): void => { + + let assimilateGroup = this.parameter.assimilate.objects; + if (!assimilateGroup) return; + + for (let i = 0; i < this.parameter.target.objects.length; i++) { + const targetGroup = this.parameter.target.objects[i]; + + targetGroup.individuals.forEach((targetIndividual) => { + + // 排除自己 + if (targetIndividual === individual) return; + let dis = targetIndividual.distanceTo(individual); + + // 进入同化范围 + if (dis <= this.parameter.range) { + + // 成功判定 + if (Math.random() * 100 < this.parameter.success) { + targetIndividual.transfer(this.parameter.assimilate.objects!); + } + } + }); + } + } + + public override terms: Record> = { + "$Title": { + "ZH_CN": "接触同化", + "EN_US": "Contact Assimilate" + }, + "$Target": { + "ZH_CN": "从哪个群...", + "EN_US": "From group..." + }, + "$Assimilate": { + "ZH_CN": "到哪个群...", + "EN_US": "To group..." + }, + "$Range": { + "ZH_CN": "同化范围 (m)", + "EN_US": "Assimilate range (m)" + }, + "$Success": { + "ZH_CN": "成功率 (%)", + "EN_US": "Success rate (%)" + }, + "$Intro": { + "ZH_CN": "将进入同化范围内的个体同化至另一个群", + "EN_US": "Assimilate individuals who enter the assimilation range to another group" + } + }; +} + +export { ContactAssimilate }; \ No newline at end of file