12121
This commit is contained in:
9
Web/src/model/common/FightData
Normal file
9
Web/src/model/common/FightData
Normal file
@@ -0,0 +1,9 @@
|
||||
export interface IFightData<T = any> {
|
||||
result:number,
|
||||
myHarm:number,
|
||||
otHarm:number
|
||||
myStateData:Array<string>,
|
||||
myRemData:Array<any>,
|
||||
otStateData:Array<string>,
|
||||
otRemData:Array<any>
|
||||
}
|
||||
48
Web/src/model/common/UserAttr.ts
Normal file
48
Web/src/model/common/UserAttr.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
export interface IUserAttr<T = any> {
|
||||
id:string,
|
||||
area:number,
|
||||
isSystem:number,
|
||||
isCopy:number,
|
||||
viceId:string,
|
||||
name:string,
|
||||
sex:string,
|
||||
code:string,
|
||||
tips:string,
|
||||
lev:number,
|
||||
minAtk:number,
|
||||
maxAtk:number,
|
||||
defense:number,
|
||||
agility:number,
|
||||
blood:number,
|
||||
upBlood:number,
|
||||
morale:number,
|
||||
upMorale:number,
|
||||
score:number,
|
||||
inBlood:number,
|
||||
crit:number,
|
||||
noHarm:number,
|
||||
dodge:number,
|
||||
rebound:number,
|
||||
reboundLess:number,
|
||||
punish:number,
|
||||
slow:number,
|
||||
slowLess:number,
|
||||
poison:number,
|
||||
poisonLess:number,
|
||||
curse:number,
|
||||
curseLess:number,
|
||||
weaken:number,
|
||||
weakenLess:number,
|
||||
deadly:number,
|
||||
deadlyLess:number,
|
||||
depressed:number,
|
||||
depressedLess:number,
|
||||
breach:number,
|
||||
breachLess:number,
|
||||
del_Fashion:number,
|
||||
atk_Next:number,
|
||||
harm_Add:number,
|
||||
palsyAtk:number,
|
||||
palsyAtkLess:number,
|
||||
|
||||
}
|
||||
165
Web/src/pages/fight/index.vue
Normal file
165
Web/src/pages/fight/index.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
<div class="content">
|
||||
<div class="common">
|
||||
<Abutton>{{ autoFight == 0 ? "开启自动攻击" : "关闭自动攻击" }}</Abutton>
|
||||
</div>
|
||||
<div class="common">
|
||||
你向{{ otAttr.name }}发起了攻击!
|
||||
</div>
|
||||
<div class="common">
|
||||
<Abutton @click="FightAtk">攻击</Abutton>
|
||||
<span> . </span>
|
||||
<span v-if="otAttr.code == 'Monster'">
|
||||
<Abar :href='"/prop/monster?m=" + otAttr.viceId'>查看</Abar>
|
||||
</span>
|
||||
<span v-else>
|
||||
<Abar :href='"/user/user?no=" + otAttr.viceId'>查看</Abar>
|
||||
</span>
|
||||
<span> . </span>
|
||||
<Abutton @click="ExitFight">撤退({{ exitCopper }}铜贝)</Abutton>
|
||||
</div>
|
||||
<div class="common">
|
||||
<div>
|
||||
{{ otAttr.name }}体力({{ otAttr.blood }}/{{ otAttr.upBlood }})
|
||||
<span v-if="otHarm != 0">
|
||||
{{ otHarm > 0 ? "+" + otHarm : otHarm }}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
你体力({{ myAttr.blood }}/{{ myAttr.upBlood }})
|
||||
<span v-if="myHarm != 0">
|
||||
{{ myHarm > 0 ? "+" + myHarm : myHarm }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="common">
|
||||
你状态:
|
||||
<span v-for="item in myLoad">
|
||||
{{ item.name }}({{ item.count }})
|
||||
</span>
|
||||
</div>
|
||||
<div class="common">
|
||||
<span v-for="(item, index) in myDrug" :key="index">
|
||||
<Abutton @click="UseFightDrug(item.id)">{{ item.name }}({{ item.count }})</Abutton>
|
||||
<span v-if="(index + 1) != myDrug.length"> . </span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="common">
|
||||
<Abar href="/user/equ">状态</Abar>
|
||||
<span> . </span>
|
||||
<Abar href="/user/bag">物品</Abar>
|
||||
<span> . </span>
|
||||
<Abar href="/pet">宠物</Abar>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
definePageMeta({
|
||||
layout: layout.empty,
|
||||
middleware: 'page-loading'
|
||||
})
|
||||
let fightId = PageExtend.QueryString("f");
|
||||
const autoFight = ref(0);
|
||||
const myHarm = ref(0);
|
||||
const otHarm = ref(0);
|
||||
const myAttr = ref<IUserAttr | any>({} as IUserAttr);
|
||||
const otAttr = ref<IUserAttr | any>({} as IUserAttr);
|
||||
const myDrug = ref<Array<any>>([]);
|
||||
const myLoad = ref<Array<any>>([]);
|
||||
const exitCopper = ref(0);
|
||||
const coolTime = ref(0);
|
||||
|
||||
let coolLock = false;//冷却锁
|
||||
const coolTimer = ref(0);//冷却定时器
|
||||
let dataLock = false;//数据锁
|
||||
|
||||
onMounted(async () => {
|
||||
try {
|
||||
await BindData("");
|
||||
}
|
||||
finally {
|
||||
PageLoading.Close();
|
||||
}
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
clearTimeout(coolTimer.value)
|
||||
})
|
||||
|
||||
/**加载方法 */
|
||||
const BindData = async (data: string): Promise<void> => {
|
||||
let result = await FightService.Fight(fightId, data);
|
||||
if (result.code == 0) {
|
||||
myAttr.value = result.data.myAttr as IUserAttr;
|
||||
otAttr.value = result.data.otAttr as IUserAttr;
|
||||
myDrug.value = result.data.myDrug;
|
||||
myLoad.value = result.data.myLoad;
|
||||
exitCopper.value = result.data.exitCopper;
|
||||
coolTime.value = result.data.cool;
|
||||
dataLock = false;
|
||||
myHarm.value = result.data.myHarm;
|
||||
otHarm.value = result.data.otHarm;
|
||||
}
|
||||
else if (result.code == 100) {
|
||||
PageExtend.RedirectTo("/fight/result?f=" + fightId);
|
||||
}
|
||||
else {
|
||||
PageExtend.RedirectTo("/map");
|
||||
}
|
||||
};
|
||||
|
||||
/**退出战斗 */
|
||||
const ExitFight = async () => {
|
||||
MessageExtend.LoadingToast("退出战斗中...");
|
||||
let result = await FightService.Exit(fightId);
|
||||
MessageExtend.LoadingClose();
|
||||
if (result.code == 0) {
|
||||
if (result.data == "") {
|
||||
PageExtend.RedirectTo("/map");
|
||||
}
|
||||
else {
|
||||
PageExtend.RedirectTo("/fight?f=" + result.data);
|
||||
}
|
||||
}
|
||||
else if (result.code == 100) {
|
||||
PageExtend.RedirectTo("/fight/result?f=" + fightId);
|
||||
}
|
||||
else if (result.code == 101) {
|
||||
MessageExtend.Notify(result.msg, "danger");
|
||||
}
|
||||
else {
|
||||
PageExtend.RedirectTo("/map");
|
||||
}
|
||||
}
|
||||
|
||||
/**使用药品 */
|
||||
const UseFightDrug = async (drugId: string) => {
|
||||
MessageExtend.LoadingToast("药品使用中...");
|
||||
let result = await FightService.UseFightDrug(fightId, drugId);
|
||||
MessageExtend.LoadingClose();
|
||||
if (result.code == 0) {
|
||||
await BindData("");
|
||||
}
|
||||
else {
|
||||
MessageExtend.Notify(result.msg, "danger");
|
||||
}
|
||||
}
|
||||
|
||||
/**攻击 */
|
||||
const FightAtk = async () => {
|
||||
if (coolLock == false && dataLock == false) {
|
||||
StartCool();
|
||||
let result = FightTool.FightHandle(myAttr.value, otAttr.value);
|
||||
let data = JSON.stringify(result);
|
||||
await BindData(data);
|
||||
}
|
||||
}
|
||||
|
||||
const StartCool = () => {
|
||||
coolLock = true;
|
||||
dataLock = true;
|
||||
coolTimer.value = setTimeout(() => {
|
||||
coolLock = false;
|
||||
}, coolTime.value)
|
||||
}
|
||||
</script>
|
||||
1
Web/src/pages/fight/result.vue
Normal file
1
Web/src/pages/fight/result.vue
Normal file
@@ -0,0 +1 @@
|
||||
<template></template>
|
||||
@@ -6,7 +6,9 @@
|
||||
<Abar href="/task/">任务</Abar>
|
||||
<Abar href="/user/message/">消息{{ messageCount > 0 ? "(" + messageCount + ")" : "" }}</Abar>
|
||||
</div>
|
||||
|
||||
<div class="content" v-if="gameTips != ''" style="color: red;font-size: 16px;">
|
||||
{{ gameTips }}
|
||||
</div>
|
||||
<div class="notification">
|
||||
<GameChat :data="chatData" :show-time="0"></GameChat>
|
||||
</div>
|
||||
@@ -127,6 +129,7 @@ const mapRes = ref<Array<any>>([]);
|
||||
const monster = ref<Array<any>>([]);
|
||||
const messageCount = ref(0);
|
||||
const broadcast = ref<Array<any>>([]);
|
||||
const gameTips = ref('');
|
||||
// 城内地图显示
|
||||
const showCity = ref(false);
|
||||
|
||||
@@ -159,6 +162,7 @@ const BindData = async (map: string): Promise<void> => {
|
||||
broadcast.value = result.data.broadcast;
|
||||
MapVent(result.data.mapInfo.near);
|
||||
onMap.value = mapInfo.value.mapId;
|
||||
gameTips.value = result.data.gameTips;
|
||||
console.log(result)
|
||||
}
|
||||
else if (result.code == 103) {
|
||||
|
||||
1
Web/src/pages/prop/monster.vue
Normal file
1
Web/src/pages/prop/monster.vue
Normal file
@@ -0,0 +1 @@
|
||||
<template></template>
|
||||
@@ -12,11 +12,16 @@
|
||||
<div class="content">
|
||||
<div class="common" style="">
|
||||
【
|
||||
<Acheak @click="ChangeBag('0')" :on-value="type" on-cheak="0">装备</Acheak>|
|
||||
<Acheak @click="ChangeBag('1')" :on-value="type" on-cheak="1">药品</Acheak>|
|
||||
<Acheak @click="ChangeBag('2')" :on-value="type" on-cheak="2">物品</Acheak>|
|
||||
<Acheak @click="ChangeBag('3')" :on-value="type" on-cheak="3">坐骑</Acheak>|
|
||||
<Acheak @click="ChangeBag('4')" :on-value="type" on-cheak="4">九宫</Acheak>|
|
||||
<Acheak @click="ChangeBag('0')" :on-value="type" on-cheak="0">装备</Acheak>
|
||||
<span> | </span>
|
||||
<Acheak @click="ChangeBag('1')" :on-value="type" on-cheak="1">药品</Acheak>
|
||||
<span> | </span>
|
||||
<Acheak @click="ChangeBag('2')" :on-value="type" on-cheak="2">物品</Acheak>
|
||||
<span> | </span>
|
||||
<Acheak @click="ChangeBag('3')" :on-value="type" on-cheak="3">坐骑</Acheak>
|
||||
<span> | </span>
|
||||
<Acheak @click="ChangeBag('4')" :on-value="type" on-cheak="4">九宫</Acheak>
|
||||
<span> | </span>
|
||||
<Acheak @click="ChangeBag('5')" :on-value="type" on-cheak="5">十方</Acheak>
|
||||
】
|
||||
</div>
|
||||
@@ -29,22 +34,34 @@
|
||||
</div>
|
||||
<div class="common">
|
||||
<div v-if="type == '0'">
|
||||
<Acheak @click="ChangeChildBag('0')" :on-value="type_ch" on-cheak="0">全部</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('1')" :on-value="type_ch" on-cheak="1">穿戴</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('2')" :on-value="type_ch" on-cheak="2">过期</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('3')" :on-value="type_ch" on-cheak="3">未鉴定</Acheak>
|
||||
<Acheak @click="ChangeChildBag('0')" :on-value="type_ch" on-cheak="0">全部</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('1')" :on-value="type_ch" on-cheak="1">穿戴</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('2')" :on-value="type_ch" on-cheak="2">过期</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('3')" :on-value="type_ch" on-cheak="3">未鉴定</Acheak>
|
||||
</div>
|
||||
<div v-if="type == '2'">
|
||||
<Acheak @click="ChangeChildBag('0')" :on-value="type_ch" on-cheak="0">全部</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('1')" :on-value="type_ch" on-cheak="1">宝石</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('2')" :on-value="type_ch" on-cheak="2">九宫</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('3')" :on-value="type_ch" on-cheak="3">圣痕</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('4')" :on-value="type_ch" on-cheak="4">礼包</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('5')" :on-value="type_ch" on-cheak="5">材料</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('6')" :on-value="type_ch" on-cheak="6">图纸</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('7')" :on-value="type_ch" on-cheak="7">卡片</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('8')" :on-value="type_ch" on-cheak="8">货物</Acheak>.<Acheak
|
||||
@click="ChangeChildBag('9')" :on-value="type_ch" on-cheak="9">其他</Acheak>
|
||||
<Acheak @click="ChangeChildBag('0')" :on-value="type_ch" on-cheak="0">全部</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('1')" :on-value="type_ch" on-cheak="1">宝石</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('2')" :on-value="type_ch" on-cheak="2">九宫</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('3')" :on-value="type_ch" on-cheak="3">圣痕</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('4')" :on-value="type_ch" on-cheak="4">礼包</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('5')" :on-value="type_ch" on-cheak="5">材料</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('6')" :on-value="type_ch" on-cheak="6">图纸</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('7')" :on-value="type_ch" on-cheak="7">卡片</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('8')" :on-value="type_ch" on-cheak="8">货物</Acheak>
|
||||
<span> . </span>
|
||||
<Acheak @click="ChangeChildBag('9')" :on-value="type_ch" on-cheak="9">其他</Acheak>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
38
Web/src/services/Index/FightService.ts
Normal file
38
Web/src/services/Index/FightService.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
export class FightService {
|
||||
/**
|
||||
* 添加怪物战斗
|
||||
* POST /Fight/FightMonster
|
||||
* @param type body
|
||||
* @param monsterId body
|
||||
* @param sign body
|
||||
*/
|
||||
static async FightMonster(type: number, monsterId: string, sign: string) {
|
||||
return await ApiService.Request("post", "/Fight/FightMonster", { type, monsterId, sign });
|
||||
}
|
||||
|
||||
/**
|
||||
* 战斗接口
|
||||
* POST /Fight/Fight
|
||||
* @param fightId body
|
||||
* @param data body
|
||||
*/
|
||||
static async Fight(fightId: string, data: string) {
|
||||
return await ApiService.Request("post", "/Fight/Fight", { fightId, data });
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出战斗
|
||||
* GET /Fight/Exit
|
||||
*/
|
||||
static async Exit(fightId: string) {
|
||||
return await ApiService.Request("get", "/Fight/Exit", { fightId });
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用药品
|
||||
* GET /Fight/UseFightDrug
|
||||
*/
|
||||
static async UseFightDrug(fightId: string, drugId: string) {
|
||||
return await ApiService.Request("get", "/Fight/UseFightDrug", { fightId, drugId });
|
||||
}
|
||||
}
|
||||
171
Web/src/utility/FightTool.ts
Normal file
171
Web/src/utility/FightTool.ts
Normal file
@@ -0,0 +1,171 @@
|
||||
interface IUnitFight {
|
||||
atkHarm: number,
|
||||
defHarm: number,
|
||||
stateData: Array<string>,
|
||||
remData: Array<any>,
|
||||
}
|
||||
export class FightTool {
|
||||
public static FightHandle(atkUser: IUserAttr, defUser: IUserAttr): IFightData {
|
||||
let result = 0;
|
||||
let myHarm = 0;
|
||||
let otHarm = 0;
|
||||
let myStateData: Array<string> = [];
|
||||
let myRemData: Array<any> = [];
|
||||
let otStateData: Array<string> = [];
|
||||
let otRemData: Array<any> = [];
|
||||
|
||||
var atkHandle = this.UnitFight(atkUser, defUser);
|
||||
myHarm += atkHandle.atkHarm;
|
||||
otHarm += atkHandle.defHarm;
|
||||
otStateData.push(...atkHandle.stateData);
|
||||
otRemData.push(...atkHandle.remData);
|
||||
if (defUser.isSystem == 1) {
|
||||
var defHandle = this.UnitFight(defUser, atkUser);
|
||||
myHarm += defHandle.defHarm;
|
||||
otHarm += defHandle.atkHarm;
|
||||
myStateData.push(...defHandle.stateData);
|
||||
myRemData.push(...defHandle.remData);
|
||||
}
|
||||
|
||||
return {
|
||||
result,
|
||||
myHarm,
|
||||
otHarm,
|
||||
myStateData,
|
||||
myRemData,
|
||||
otStateData,
|
||||
otRemData
|
||||
};
|
||||
}
|
||||
|
||||
private static UnitFight(atkUser: IUserAttr, defUser: IUserAttr): IUnitFight {
|
||||
let atkHarm = 0;
|
||||
let defHarm = 0;
|
||||
let stateData: Array<string> = [];
|
||||
let remData: Array<any> = [];
|
||||
//闪避处理
|
||||
if (defUser.dodge > 0) {
|
||||
let dodgeRide = defUser.dodge - atkUser.deadly + defUser.deadlyLess;
|
||||
if (dodgeRide > 0) {
|
||||
if (this.randomTrigger(dodgeRide)) {
|
||||
return {
|
||||
atkHarm: 0,
|
||||
defHarm: 0,
|
||||
stateData,
|
||||
remData
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//士气处理
|
||||
if (atkUser.upMorale > 0) {
|
||||
atkUser.minAtk = atkUser.minAtk * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3);
|
||||
}
|
||||
if (defUser.upBlood > 0) {
|
||||
defUser.defense = defUser.defense * (1.0 + (atkUser.morale / atkUser.upMorale) * 0.3);
|
||||
}
|
||||
|
||||
if (atkUser.minAtk > defUser.defense && defUser.defense > 0) {
|
||||
let harmRide = (atkUser.minAtk - defUser.defense) / defUser.defense;
|
||||
harmRide = harmRide > 1.2 ? 1.2 : harmRide;
|
||||
let fight_Harm = harmRide * atkUser.maxAtk;
|
||||
defHarm += 0 - fight_Harm;
|
||||
}
|
||||
else {
|
||||
defHarm = -1;
|
||||
}
|
||||
|
||||
//暴击处理
|
||||
if (atkUser.crit > 0) {
|
||||
if (this.randomTrigger(atkUser.crit)) {
|
||||
defHarm = defHarm * 1.5;
|
||||
}
|
||||
}
|
||||
//处理反弹
|
||||
if (defUser.rebound > 0) {
|
||||
let reboundRide = defUser.rebound = atkUser.reboundLess;
|
||||
if (reboundRide > 0) {
|
||||
atkHarm = defHarm * reboundRide;
|
||||
}
|
||||
}
|
||||
defHarm += 0 - atkUser.harm_Add;//额外伤害
|
||||
//连击处理
|
||||
if (atkUser.atk_Next > 0) {
|
||||
if (this.randomTrigger(atkUser.atk_Next)) {
|
||||
defHarm = defHarm * 1.3;
|
||||
atkHarm = atkHarm * 1.3;
|
||||
}
|
||||
}
|
||||
//免伤处理
|
||||
if (defUser.noHarm > 0 && defHarm < -1) {
|
||||
|
||||
defHarm = defHarm * (1 - defUser.noHarm);
|
||||
defHarm = defHarm > 0 ? 0 : defHarm;
|
||||
}
|
||||
//吸血处理
|
||||
if (defHarm < 0 && atkUser.inBlood > 0) {
|
||||
let inBloodRide = atkUser.inBlood - defUser.punish
|
||||
if (inBloodRide > 0) {
|
||||
atkHarm += (0 - defHarm) * inBloodRide;
|
||||
}
|
||||
}
|
||||
|
||||
//#region 状态类处理
|
||||
let slow = atkUser.slow - defUser.slowLess;
|
||||
if (this.randomTrigger(slow)) {
|
||||
stateData.push("Slow");
|
||||
}
|
||||
let poison = atkUser.poison - defUser.poisonLess;
|
||||
if (this.randomTrigger(poison)) {
|
||||
stateData.push("Poison");
|
||||
}
|
||||
let curse = atkUser.curse - defUser.curseLess;
|
||||
if (this.randomTrigger(curse)) {
|
||||
stateData.push("Curse");
|
||||
}
|
||||
let weaken = atkUser.weaken - defUser.weakenLess;
|
||||
if (this.randomTrigger(weaken)) {
|
||||
stateData.push("Weaken");
|
||||
}
|
||||
|
||||
let depressed = atkUser.depressed - defUser.depressedLess;
|
||||
if (this.randomTrigger(depressed)) {
|
||||
stateData.push("Depressed");
|
||||
}
|
||||
let breach = atkUser.breach - defUser.breachLess;
|
||||
if (this.randomTrigger(breach)) {
|
||||
stateData.push("Breach");
|
||||
}
|
||||
let palsyatk = atkUser.palsyAtk - defUser.palsyAtkLess;
|
||||
if (this.randomTrigger(palsyatk)) {
|
||||
stateData.push("PalsyAtk");
|
||||
}
|
||||
if (this.randomTrigger(atkUser.del_Fashion)) {
|
||||
if (defUser.code == 'Person') {
|
||||
remData.push({
|
||||
"code": "equ",
|
||||
"par": "Fashion",
|
||||
"count": 1
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//#endregion
|
||||
//数值处理
|
||||
atkHarm = Math.floor(atkHarm);
|
||||
defHarm = Math.floor(defHarm);
|
||||
return {
|
||||
atkHarm,
|
||||
defHarm,
|
||||
stateData,
|
||||
remData
|
||||
};
|
||||
}
|
||||
|
||||
private static randomTrigger(rate: number): boolean {
|
||||
// Math.random() 返回 [0,1) 浮点
|
||||
const rand = Math.random();
|
||||
return rand < rate;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user