refac: 감찰부 vue3 재 작성 (#222)

- 장수 정보, 추가 정보 vue3 component
- b_battleCenter -> v_battleCenter

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/222
This commit is contained in:
2022-07-16 15:49:23 +09:00
parent 800106f9cb
commit 43a95979e1
16 changed files with 632 additions and 87 deletions
+61 -32
View File
@@ -1,5 +1,5 @@
<template>
<div class="general-card-basic">
<div class="general-card-basic bg2">
<div
class="general-icon"
:style="{
@@ -19,7 +19,7 @@
{{ general.turntime.substring(11, 19) }}
</div>
<div>통솔</div>
<div class="bg1">통솔</div>
<div>
<div class="row gx-0">
<div class="col">
@@ -27,46 +27,46 @@
<!-- eslint-disable-next-line vue/no-v-html -->
<span v-if="general.lbonus > 0" style="color: cyan">+{{ general.lbonus }}</span>
</div>
<div class="col">
<SammoBar :height="10" :percent="general.leadership_exp / 20" />
<div class="col align-self-center">
<SammoBar :height="10" :percent="(general.leadership_exp / 20) * 100" />
</div>
</div>
</div>
<div>무력</div>
<div class="bg1">무력</div>
<div>
<div class="row gx-0">
<div class="col" :style="{ color: injuryInfo.color }">
{{ general.strength }}
</div>
<div class="col">
<SammoBar :height="10" :percent="general.strength_exp / 20" />
<div class="col align-self-center">
<SammoBar :height="10" :percent="(general.strength_exp / 20) * 100" />
</div>
</div>
</div>
<div>지력</div>
<div class="bg1">지력</div>
<div>
<div class="row gx-0">
<div class="col" :style="{ color: injuryInfo.color }">
{{ general.intel }}
</div>
<div class="col">
<SammoBar :height="10" :percent="general.intel_exp / 20" />
<div class="col align-self-center">
<SammoBar :height="10" :percent="(general.intel_exp / 20) * 100" />
</div>
</div>
</div>
<div>명마</div>
<div class="bg1">명마</div>
<div v-b-tooltip.hover :title="horse.info ?? undefined">{{ horse.name }}</div>
<div>무기</div>
<div class="bg1">무기</div>
<div v-b-tooltip.hover :title="weapon.info ?? undefined">{{ weapon.name }}</div>
<div>서적</div>
<div class="bg1">서적</div>
<div v-b-tooltip.hover :title="book.info ?? undefined">{{ book.name }}</div>
<div>자금</div>
<div class="bg1">자금</div>
<div>{{ general.gold.toLocaleString() }}</div>
<div>군량</div>
<div class="bg1">군량</div>
<div>{{ general.rice.toLocaleString() }}</div>
<div>도구</div>
<div class="bg1">도구</div>
<div v-b-tooltip.hover :title="item.info ?? undefined">{{ item.name }}</div>
<!-- TODO: show_img_level을 고려 -->
@@ -77,55 +77,65 @@
}"
></div>
<div>병종</div>
<div class="bg1">병종</div>
<div v-b-tooltip.hover :title="crewtype.info ?? undefined">{{ crewtype.name }}</div>
<div>병사</div>
<div class="bg1">병사</div>
<div>{{ general.crew.toLocaleString() }}</div>
<div>성격</div>
<div class="bg1">성격</div>
<div v-b-tooltip.hover :title="personal.info ?? undefined">{{ personal.name }}</div>
<!-- TODO: bonusTrain 같은 개념이 필요 -->
<div>훈련</div>
<div class="bg1">훈련</div>
<div>{{ general.train }}</div>
<div>사기</div>
<div class="bg1">사기</div>
<div>{{ general.atmos }}</div>
<div>특기</div>
<div class="bg1">특기</div>
<div>
<span v-b-tooltip.hover :title="specialDomestic.info ?? undefined"> {{ specialDomestic.name }}</span> /
<span v-b-tooltip.hover :title="specialWar.info ?? undefined"> {{ specialWar.name }}</span>
</div>
<div>Lv</div>
<div class="bg1">Lv</div>
<!-- TODO: 경험치 막대가 필요 -->
<div class="general-exp-level">
{{ general.explevel }}
</div>
<div class="general-exp-level-bar">{{ nextExpLevelRemain(general.experience, general.explevel) }}</div>
<div>연령</div>
<div class="general-exp-level-bar d-grid">
<div class="align-self-center">
<SammoBar
:height="10"
:percent="(([a, b]) => (a / b) * 100)(nextExpLevelRemain(general.experience, general.explevel))"
/>
</div>
</div>
<div class="bg1">연령</div>
<div :style="{ color: ageColor }">{{ general.age }}</div>
<div>수비</div>
<div class="bg1">수비</div>
<div class="general-defence-train">
<span v-if="general.defence_train === 999" style="color: red">수비 안함</span>
<span v-else style="color: limegreen">수비 (훈사{{ general.defence_train }})</span>
</div>
<div>삭턴</div>
<div class="bg1">삭턴</div>
<div>{{ general.killturn }} </div>
<div>실행</div>
<div class="bg1">실행</div>
<div>{{ nextExecuteMinute }} 남음</div>
<div>부대</div>
<div class="bg1">부대</div>
<div v-if="!troopInfo" class="general-troop">-</div>
<div v-else class="general-troop">
<s v-if="troopInfo.leader.reservedCommand && troopInfo.leader.reservedCommand[0].action != 'che_집합'" style="color: gray">
<s
v-if="troopInfo.leader.reservedCommand && troopInfo.leader.reservedCommand[0].action != 'che_집합'"
style="color: gray"
>
{{ troopInfo.name }}
</s>
<span v-else style="color: orange">
{{ troopInfo.name }}({{ gameConstStore.cityConst[troopInfo.leader.city].name }})
</span>
</div>
<div>벌점</div>
<div class="general-v">
<div class="bg1">벌점</div>
<div class="general-connect-score">
{{ formatConnectScore(general.connect) }} {{ general.connect.toLocaleString() }}({{ general.con }})
</div>
</div>
@@ -233,7 +243,18 @@ onMounted(() => {
grid-template-rows: repeat(9, calc(64px / 3));
text-align: center;
font-size: 14px;
border-bottom: 1px solid gray;
border-right: 1px solid gray;
> div.bg1, > .general-crew-type-icon, > .general-icon {
border-left: 1px solid gray;
}
> div {
border-top: 1px solid gray;
}
}
.general-icon {
width: 64px;
height: 64px;
@@ -263,4 +284,12 @@ onMounted(() => {
.general-defence-train {
grid-column: 2 / 4;
}
.general-troop {
grid-column: 2 / 4;
}
.general-connect-score {
grid-column: 5 / 8;
}
</style>
+59 -35
View File
@@ -1,29 +1,29 @@
<template>
<div class="general-card-supplement row gx-0">
<div class="general-card-supplement row gx-0 bg2">
<div class="col-12 general-card-info">
<div class="part-title">추가 정보</div>
<div>명성</div>
<div class="part-title bg1">추가 정보</div>
<div class="bg1">명성</div>
<div>{{ formatHonor(general.experience) }} ({{ general.experience.toLocaleString() }})</div>
<div>계급</div>
<div>{{ general.dedLevelText }} ({{ general.dedication.toLocaleString() }}</div>
<div>봉급</div>
<div class="bg1">계급</div>
<div>{{ general.dedLevelText }} ({{ general.dedication.toLocaleString() }})</div>
<div class="bg1">봉급</div>
<div>{{ general.bill.toLocaleString() }}</div>
<div>전투</div>
<div class="bg1">전투</div>
<div>{{ general.warnum.toLocaleString() }}</div>
<div>계략</div>
<div class="bg1">계략</div>
<div>{{ general.firenum.toLocaleString() }}</div>
<div>사관</div>
<div class="bg1">사관</div>
<div>{{ general.belong }}년차</div>
<div>승률</div>
<div class="bg1">승률</div>
<div>{{ ((general.killnum / Math.max(general.warnum, 1)) * 100).toFixed(2) }} %</div>
<div>승리</div>
<div class="bg1">승리</div>
<div>{{ general.killnum.toLocaleString() }}</div>
<div>패배</div>
<div class="bg1">패배</div>
<div>{{ general.deathnum.toPrecision() }}</div>
<div>살상률</div>
<div class="bg1">살상률</div>
<div>
{{
((general.killcrew / Math.max(general.deathcrew, 1)) * 100).toLocaleString(undefined, {
@@ -33,30 +33,30 @@
}}
%
</div>
<div>사살</div>
<div class="bg1">사살</div>
<div>{{ general.killcrew.toLocaleString() }}</div>
<div>피살</div>
<div class="bg1">피살</div>
<div>{{ general.deathcrew.toLocaleString() }}</div>
</div>
<div class="col-7 general-card-dex">
<div class="part-title">숙련도</div>
<div :class="[props.showCommandList ? 'col-7' : 'col', 'general-card-dex']">
<div class="part-title bg1">숙련도</div>
<template v-for="[dexType, dex, dexInfo] of dexList" :key="dexType">
<div>{{ dexType }}</div>
<div class="bg1">{{ dexType }}</div>
<div :style="{ color: dexInfo.color }">{{ dexInfo.name }}</div>
<div>{{ (dex / 1000).toLocaleString(undefined, { minimumFractionDigits: 1, maximumFractionDigits: 1 }) }}K</div>
<div>
<SammoBar :height="10" :percent="dex / 1_000_000" />
<div class="d-grid">
<div class="align-self-center"><SammoBar :height="10" :percent="dex / 1_000_000 * 100" /></div>
</div>
</template>
</div>
<div class="col-5 general-card-turn">
<div
v-if="props.showCommandList && general.reservedCommand && general.reservedCommand.length > 0"
class="col-5 general-card-turn"
>
<div class="part-title">예약턴</div>
<template v-if="general.reservedCommand">
<div v-for="(turn, idx) in general.reservedCommand.slice(0, 5)" :key="idx">
{{ turn.brief }}
</div>
</template>
<div v-else style="grid-row: 2 / 7">NPC</div>
<div v-for="(turn, idx) in general.reservedCommand.slice(0, 5)" :key="idx">
{{ turn.brief }}
</div>
</div>
</div>
</template>
@@ -69,6 +69,7 @@ import { formatDexLevel, type DexInfo } from "@/utilGame/formatDexLevel";
import { formatHonor } from "@/utilGame/formatHonor";
const props = defineProps<{
general: GeneralListItemP1;
showCommandList?: boolean;
}>();
const dexList = computed((): [string, number, DexInfo][] => {
@@ -83,13 +84,14 @@ const dexList = computed((): [string, number, DexInfo][] => {
</script>
<style lang="scss" scoped>
.general-card-basic {
display: grid;
grid-template-columns: 64px repeat(3, 2fr 5fr);
grid-template-rows: repeat(9, calc(64px / 3));
.general-card-supplement {
text-align: center;
font-size: 14px;
}
.part-title {
grid-column: 1 / 7;
}
.general-icon {
width: 64px;
height: 64px;
@@ -124,9 +126,18 @@ const dexList = computed((): [string, number, DexInfo][] => {
display: grid;
grid-template-columns: repeat(3, 64px 1fr);
grid-template-rows: repeat(5, calc(64px / 3));
border-right: solid 1px gray;
.part-title {
grid-column: 1 / 4;
grid-column: 1 / 7;
}
.bg1 {
border-left: solid 1px gray;
}
> div {
border-bottom: solid 1px gray;
}
}
@@ -134,15 +145,28 @@ const dexList = computed((): [string, number, DexInfo][] => {
display: grid;
grid-template-columns: 64px 40px 60px 1fr;
grid-template-rows: repeat(6, calc(64px / 3));
border-right: solid 1px gray;
.part-title {
grid-column: 1 / 5;
}
.bg1 {
border-left: solid 1px gray;
}
> div {
border-bottom: solid 1px gray;
}
}
.general-card-turn {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: repeat(6, calc(64px / 3));
.bg1 {
border-left: solid 1px gray;
}
> div {
border-bottom: solid 1px gray;
}
}
</style>
+23 -7
View File
@@ -1,25 +1,40 @@
<template>
<div
v-b-tooltip.hover.top
:title="`${props.percent}$`"
:title="`${props.percent.toLocaleString(undefined, { maximumFractionDigits: 2 })}%`"
class="sammo-bar"
:style="{
height: `${props.height}px`,
backgroundImage: `url(${imagePath}/pr${props.height - 2}.png)`,
backgroundRepeat: 'repeat-x',
backgroundPosition: 'center',
height: `${props.height + 2}px`,
position: 'relative',
borderTop: 'solid 1px #888',
borderBottom: 'solid 1px #333',
margin: 'auto',
width: props.width === undefined ? '100%' : props.width,
}"
>
<div
class="sammo-bar-base"
:style="{
position: 'absolute',
left: '0',
width: '100%',
height: `${props.height}px`,
backgroundImage: `url(${imagePath}/pr${props.height - 2}.gif)`,
backgroundRepeat: 'repeat-x',
backgroundPosition: 'center',
}"
></div>
<div
class="sammo-bar-in"
:style="{
position: 'absolute',
left: '0',
width: `${clamp(props.percent, 0, 100)}%`,
height: `${props.height}px`,
backgroundImage: `url(${imagePath}/pb${props.height - 2}.png)`,
backgroundImage: `url(${imagePath}/pb${props.height - 2}.gif)`,
backgroundRepeat: 'repeat-x',
backgroundPosition: 'left center',
width: `${clamp(props.percent, 0, 100)}%`,
}"
/>
</div>
@@ -30,6 +45,7 @@ import { clamp } from "lodash";
const imagePath = window.pathConfig.gameImage;
const props = defineProps<{
height: 7 | 10;
width?: string;
percent: number;
}>();
</script>