From ab23228b6b1787c72ab3bef5d8f9e9203124b241 Mon Sep 17 00:00:00 2001 From: mengyxu Date: Wed, 23 Apr 2025 18:01:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=88=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E8=A7=81description=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.调整战斗逻辑,战斗伤害不再使用用期望值,每回合伤害独立计算,击败怪物的回合怪物将不造成伤害 2.新增战斗过程查看 --- src/assets/icons/tips.png | Bin 2495 -> 0 bytes src/components/tooltip.vue | 43 ++++++++++++++++---------- src/config/i18n/zh.ts | 2 ++ src/tool/caller.ts | 32 +++++++++++++++++-- src/views/dungeon/battle.vue | 23 +++++++------- src/views/message/bouts.vue | 51 +++++++++++++++++++++++++++++++ src/views/message/sys-info.vue | 20 +++++++++++- src/views/version/update-log.vue | 11 ++++++- 8 files changed, 151 insertions(+), 31 deletions(-) delete mode 100644 src/assets/icons/tips.png create mode 100644 src/views/message/bouts.vue diff --git a/src/assets/icons/tips.png b/src/assets/icons/tips.png deleted file mode 100644 index b7b74bdc4d1363df357dd7fd31da292e39d59922..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2495 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
+

* {{ info }}

@@ -18,7 +19,9 @@ import { useI18n } from "vue3-i18n"; const { t } = useI18n(); const { state, commit, dispatch } = useStore(); const tipsShow = ref(false); -const tipsStyle = ref({}); +const tipsStyle = ref({ + transform: '' +}); const prop = defineProps({ placement: { @@ -31,16 +34,25 @@ const prop = defineProps({ width: { type: String, default: '16rem' + }, + showIcon: { + type: Boolean, + default: true + }, + x: { + type: String, + default: null } }) const showTips = (e) => { const x = e.pageX, y = e.pageY, maxH = window.innerHeight, maxW = window.innerWidth; - const xt = x < 100 ? '15%' : y < maxH - 100 ? '0%' : '-40%'; - const yt = y < maxH - 200 ? '100%' : '-50%'; - tipsStyle.value = { - transform: 'translate(' + xt + ', ' + yt + ')' + let xt = x < 100 ? '15%' : y < maxH - 100 ? '0%' : '-40%'; + if (prop.x) { + xt = prop.x; } + const yt = y < maxH / 2 ? '100%' : '-50%'; + tipsStyle.value.transform = 'translate(' + xt + ', ' + yt + ')'; tipsShow.value = true } const closeTips = () => { @@ -66,28 +78,27 @@ onMounted(() => { }); border-radius: 4px; padding: 1.2rem; background: #111111; - padding-top: 3.6rem; + // padding-top: 3.6rem; font-size: 0.86rem; font-weight: normal; z-index: 9999; box-shadow: 0 0 3px 3px rgba($color: #000000, $alpha: 1.0); - .info { - font-weight: normal; - margin-top: 0.4rem; - } - - &::after { - position: absolute; - top: 0.4rem; - left: 50%; + .tip-icons { + // position: absolute; + margin-left: 50%; transform: translateX(-50%); display: flex; width: 3.2rem; height: 3.2rem; - background-image: url(@/assets/icons/tips.png); background-size: cover; } + + .info { + font-weight: normal; + margin-top: 0.4rem; + } + } .top { diff --git a/src/config/i18n/zh.ts b/src/config/i18n/zh.ts index 36c1d57..3a7553a 100644 --- a/src/config/i18n/zh.ts +++ b/src/config/i18n/zh.ts @@ -2,6 +2,7 @@ export default class Zh { title = '挂机放置游戏'; welcome = ['欢迎你勇士,点击地图上的副本开始战斗。', '界面左上角菜单可以打开世界副本地图。']; + sys = '系统'; loadEmpty = '未读取到存档!'; loadError = '存档坏了!'; @@ -146,6 +147,7 @@ export default class Zh { eliteMonster = '无尽模式精英怪'; startDungeon = '你已进入'; battle = '你遭遇了(lv${lv}${name}),正在战斗中...'; + bouts = ['点击查看战斗过程', '回合', '触发了暴击', '你造成了${dmg}点伤害', '受到${dmg}点伤害', '战斗结束', '你获胜', '你战败']; killMonster = '你击杀了(lv${lv}${name}),共受到了${dmg}点伤害'; beKilled = '你被(lv${lv}${name})击败,共受到了${dmg}点伤害'; getCoins = '获得金币:'; diff --git a/src/tool/caller.ts b/src/tool/caller.ts index f0464fd..91fabb7 100644 --- a/src/tool/caller.ts +++ b/src/tool/caller.ts @@ -63,9 +63,9 @@ export const callPlayerAttribute = (playerAttribute: any, rA: any) => { critdmg = attribute.critDmg / 100; attribute.dps = Math.ceil((1 - crit + crit * critdmg) * atk); //计算减伤比例 -// attribute.def = 500; + // attribute.def = 500; attribute.reducPercent = (0.5 * attribute.def) / (35 + 0.55 * attribute.def) + (0.09 * attribute.def) / (attribute.def + 200); -// attribute.reducPercent = (0.5 * attribute.def) / (200 + 0.502 * attribute.def); + // attribute.reducPercent = (0.5 * attribute.def) / (200 + 0.502 * attribute.def); return attribute; }; @@ -127,3 +127,31 @@ export const getPointsOfReborn = (playerAttribute) => { return Math.round(points * 1.2); }; + +export const callBattleResult = (player, monster) => { + const tmp = player.curHp, + crit = player.crit / 100, + critdmg = player.critDmg / 100, + atk = player.atk; + let monsterDmg = Math.ceil(monster.atk * (1 - player.reducPercent) - player.bloc); + monsterDmg < 1 && (monsterDmg = 1); + let curHp = player.curHp, + mHp = monster.hp; + const bouts: any = []; + while (true) { + const bout: any = {}; + bouts.push(bout); + if (Math.random() < crit) { + bout.crit = true; + bout.dmg = Math.ceil(atk * critdmg); + } else { + bout.dmg = atk; + } + mHp -= bout.dmg; + if (mHp < 0) break; + bout.takeDmg = monsterDmg; + curHp -= monsterDmg; + if (curHp < 0) break; + } + return { win: curHp > 0, bouts: bouts, takeDmg: tmp - curHp }; +}; diff --git a/src/views/dungeon/battle.vue b/src/views/dungeon/battle.vue index 3e6b62c..4019a8f 100644 --- a/src/views/dungeon/battle.vue +++ b/src/views/dungeon/battle.vue @@ -16,7 +16,7 @@ import { useStore } from "vuex"; import { computed, nextTick, onMounted, ref } from "vue"; import { useI18n } from "vue3-i18n"; import { dungeon_icon, player_move_time, player_battle_time } from "@/config"; -import { randonBootyEquip } from "@/tool"; +import { randonBootyEquip, callBattleResult } from "@/tool"; const { t } = useI18n(); const { state, commit, dispatch } = useStore(); @@ -103,30 +103,31 @@ const playerMove = (monsterIdx?, playerIdx?) => { const battleWithMonster = (monster) => { return new Promise((resolve, reject) => { const player = state.playerAttribute.attribute; - let monsterDmg = Math.ceil(monster.atk * (1 - player.reducPercent) - player.bloc); - monsterDmg < 1 && (monsterDmg = 1); + const result = callBattleResult(player, monster); + // let monsterDmg = Math.ceil(monster.atk * (1 - player.reducPercent) - player.bloc); + // monsterDmg < 1 && (monsterDmg = 1); - const playerDeadTime = Math.ceil(player.curHp / monsterDmg); - const monsterDeadTime = Math.ceil(monster.hp / player.dps); - const takeDmg = monsterDeadTime * monsterDmg; + // const playerDeadTime = Math.ceil(player.curHp / monsterDmg); + // const monsterDeadTime = Math.ceil(monster.hp / player.dps); + // const takeDmg = monsterDeadTime * monsterDmg; const battleTime = Math.round(player_battle_time * 100 / (100 + state.rebornAttribute.battleSpeed)) const getMsg = (i18nName) => { - return t(i18nName).replace('${lv}', monster.lv).replace('${name}', t('difficulty.' + props.dungeon?.difficulty) + t(monster.type)).replace('${dmg}', takeDmg + ''); + return t(i18nName).replace('${lv}', monster.lv).replace('${name}', t('difficulty.' + props.dungeon?.difficulty) + t(monster.type)).replace('${dmg}', result.takeDmg + ''); }; commit("set_sys_info", { msg: getMsg('battle'), type: 'battle' }); battle.value.timeOut = setTimeout(() => { nextTick(() => { - commit('add_player_curhp', -1 * takeDmg); + commit('add_player_curhp', -1 * result.takeDmg); }) - if (monsterDeadTime < playerDeadTime) { - commit("set_sys_info", { msg: getMsg('killMonster'), type: 'battle' }); + if (result.win) { + commit("set_sys_info", { msg: getMsg('killMonster'), type: 'battle', bouts: result.bouts }); //随机获取装备战利品 const equips = randonBootyEquip(monster); commit('add_bootys', { equips: equips, coins: monster.coins }); resolve(true); } else { - commit("set_sys_info", { msg: getMsg('beKilled'), type: 'warning' }); + commit("set_sys_info", { msg: getMsg('beKilled'), type: 'warning', bouts: result.bouts }); battle.value.battleShow = false; dispatch('play_music', 'backgound'); } diff --git a/src/views/message/bouts.vue b/src/views/message/bouts.vue new file mode 100644 index 0000000..e2c5356 --- /dev/null +++ b/src/views/message/bouts.vue @@ -0,0 +1,51 @@ + + + + \ No newline at end of file diff --git a/src/views/message/sys-info.vue b/src/views/message/sys-info.vue index aa722c3..61a99e1 100644 --- a/src/views/message/sys-info.vue +++ b/src/views/message/sys-info.vue @@ -1,9 +1,17 @@