diff --git a/source/Behavior/Behavior.ts b/source/Behavior/Behavior.ts index ca265e0..40b72b5 100644 --- a/source/Behavior/Behavior.ts +++ b/source/Behavior/Behavior.ts @@ -5,7 +5,8 @@ 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"; +import { ContactAssimilate } from "@Behavior/ContactAssimilate"; +import { DelayAssimilate } from "@Behavior/DelayAssimilate"; const AllBehaviors: IAnyBehaviorRecorder[] = [ new BehaviorRecorder(Template), @@ -15,6 +16,7 @@ const AllBehaviors: IAnyBehaviorRecorder[] = [ new BehaviorRecorder(Tracking), new BehaviorRecorder(ContactAttacking), new BehaviorRecorder(ContactAssimilate), + new BehaviorRecorder(DelayAssimilate), ] /** diff --git a/source/Behavior/ContactAssimilate.ts b/source/Behavior/ContactAssimilate.ts index a358f5a..89da19a 100644 --- a/source/Behavior/ContactAssimilate.ts +++ b/source/Behavior/ContactAssimilate.ts @@ -50,7 +50,7 @@ class ContactAssimilate extends Behavior { + + public override behaviorId: string = "DelayAssimilate"; + + public override behaviorName: string = "$Title"; + + public override iconName: string = "FunctionalManagerDashboard"; + + public override describe: string = "$Intro"; + + public override category: string = "$Initiative"; + + public override parameterOption = { + target: { type: "CG", name: "$Target" }, + maxDelay: { type: "number", name: "$Max.Delay", defaultValue: 20, numberStep: 1, numberMin: 0 }, + minDelay: { type: "number", name: "$Min.Delay", defaultValue: 5, numberStep: 1, numberMin: 0 }, + success: { type: "number", name: "$Success", defaultValue: 90, numberStep: 5, numberMin: 0 } + }; + + public effect = (individual: Individual, group: Group, model: Model, t: number): void => { + + let assimilateGroup = this.parameter.target.objects; + if (!assimilateGroup) return; + + const {maxDelay, minDelay, success} = this.parameter; + + let nextTime = individual.getData("DelayAssimilate.nextTime") ?? + minDelay + Math.random() * (maxDelay - minDelay); + let currentTime = individual.getData("DelayAssimilate.currentTime") ?? 0; + + currentTime += t; + if (currentTime > nextTime) { + + // 成功判定 + if (Math.random() * 100 < success) { + individual.transfer(assimilateGroup); + nextTime = undefined; + currentTime = undefined; + } else { + + nextTime = minDelay + Math.random() * (maxDelay - minDelay); + currentTime = 0; + } + } + + individual.setData("DelayAssimilate.nextTime", nextTime); + individual.setData("DelayAssimilate.currentTime", currentTime); + } + + public override terms: Record> = { + "$Title": { + "ZH_CN": "延迟同化", + "EN_US": "Delayed assimilation" + }, + "$Intro": { + "ZH_CN": "随着时间的推移,个体逐渐向另一个群同化。", + "EN_US": "Over time, individuals gradually assimilate to another group." + }, + "$Target": { + "ZH_CN": "同化目标", + "EN_US": "Assimilation target" + }, + "$Max.Delay": { + "ZH_CN": "最长时间", + "EN_US": "Longest time" + }, + "$Min.Delay": { + "ZH_CN": "最短时间", + "EN_US": "Shortest time" + }, + "$Success": { + "ZH_CN": "成功率", + "EN_US": "Minimum strength" + }, + "$Initiative": { + "ZH_CN": "主动", + "EN_US": "Initiative" + } + }; +} + +export { DelayAssimilate }; \ No newline at end of file