feat: 메인 페이지 지도 표기(wip)
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
@charset 'utf-8';
|
||||||
|
|
||||||
.map_title_tooltiptext .tooltip-inner {
|
.map_title_tooltiptext .tooltip-inner {
|
||||||
max-width: 220px;
|
max-width: 220px;
|
||||||
width: 220px;
|
width: 220px;
|
||||||
|
|||||||
+75
-21
@@ -18,34 +18,55 @@
|
|||||||
<div class="commonToolbar">툴바?</div>
|
<div class="commonToolbar">툴바?</div>
|
||||||
<div class="scenarioName">시나리오</div>
|
<div class="scenarioName">시나리오</div>
|
||||||
<div v-if="frontInfo" class="gameInfo">
|
<div v-if="frontInfo" class="gameInfo">
|
||||||
<div class="subScenarioName">{{globalInfo.scenarioText}}</div>
|
<div class="subScenarioName">{{ globalInfo.scenarioText }}</div>
|
||||||
<div class="subNPCType">NPC 수, 상성: {{globalInfo.extendedGeneral?'확장':'표준'}} {{globalInfo.isFiction?'가상':'사실'}}</div>
|
<div class="subNPCType">
|
||||||
<div class="subNPCMode">NPC선택: {{['불가능','가능','선택 생성'][globalInfo.npcMode]}}</div>
|
NPC 수, 상성: {{ globalInfo.extendedGeneral ? "확장" : "표준" }}
|
||||||
<div class="subTournamentMode">토너먼트: 경기당 {{calcTournamentTerm(globalInfo.turnterm)}}분</div>
|
{{ globalInfo.isFiction ? "가상" : "사실" }}
|
||||||
|
</div>
|
||||||
|
<div class="subNPCMode">NPC선택: {{ ["불가능", "가능", "선택 생성"][globalInfo.npcMode] }}</div>
|
||||||
|
<div class="subTournamentMode">토너먼트: 경기당 {{ calcTournamentTerm(globalInfo.turnterm) }}분</div>
|
||||||
<div class="subOtherSetting">기타 설정: (TODO)자율행동[내정, 훈련/사기진작, 사령턴, 24시간 유효]</div>
|
<div class="subOtherSetting">기타 설정: (TODO)자율행동[내정, 훈련/사기진작, 사령턴, 24시간 유효]</div>
|
||||||
<div class="subYearMonth">현재: {{globalInfo.year}}年 {{globalInfo.month}}月 ({{globalInfo.turnterm}}분 턴 서버)</div>
|
<div class="subYearMonth">
|
||||||
<div class="subOnlineUserCnt">전체 접속자 수: {{globalInfo.onlineUserCnt.toLocaleString()}}명</div>
|
현재: {{ globalInfo.year }}年 {{ globalInfo.month }}月 ({{ globalInfo.turnterm }}분 턴 서버)
|
||||||
<div class="subAPILimit">턴당 갱신횟수: {{globalInfo.apiLimit.toLocaleString()}}회</div>
|
</div>
|
||||||
|
<div class="subOnlineUserCnt">전체 접속자 수: {{ globalInfo.onlineUserCnt.toLocaleString() }}명</div>
|
||||||
|
<div class="subAPILimit">턴당 갱신횟수: {{ globalInfo.apiLimit.toLocaleString() }}회</div>
|
||||||
<div class="subGeneralCnt">
|
<div class="subGeneralCnt">
|
||||||
등록 장수: 유저
|
등록 장수: 유저
|
||||||
{{globalInfo.genCount.toLocaleString()}} / {{globalInfo.generalCntLimit.toLocaleString()}}
|
{{ globalInfo.genCount.toLocaleString() }} / {{ globalInfo.generalCntLimit.toLocaleString() }}
|
||||||
+ NPC TODO:NPC Cnt 명
|
+ NPC TODO:NPC Cnt 명
|
||||||
</div>
|
</div>
|
||||||
<div class="subTournamentState">TODO: tournament Text</div>
|
<div class="subTournamentState">TODO: tournament Text</div>
|
||||||
<div class="subLastExecuted" :style="{color:serverLocked?'magenta':'cyan'}">동작 시각: {{formatTime(lastExecuted).substring(5)}}</div>
|
<div class="subLastExecuted" :style="{ color: serverLocked ? 'magenta' : 'cyan' }">
|
||||||
<div v-if="globalInfo.auctionCount" class="subAuctionState" style="color:cyan">{{globalInfo.auctionCount.toLocaleString()}}건 거래 진행중</div>
|
동작 시각: {{ formatTime(lastExecuted).substring(5) }}
|
||||||
<div v-else class="subAcutionState" style="color:magenta">진행중인 거래 없음</div>
|
|
||||||
<div v-if="globalInfo.lastVote" class="subVoteState">
|
|
||||||
<span style="color:cyan">설문 진행 중: </span><span>{{globalInfo.lastVote.title}}</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="subVoteState" style="color:magenta">진행중인 설문 없음</div>
|
<div v-if="globalInfo.auctionCount" class="subAuctionState" style="color: cyan">
|
||||||
|
{{ globalInfo.auctionCount.toLocaleString() }}건 거래 진행중
|
||||||
|
</div>
|
||||||
|
<div v-else class="subAcutionState" style="color: magenta">진행중인 거래 없음</div>
|
||||||
|
<div v-if="globalInfo.lastVote" class="subVoteState">
|
||||||
|
<span style="color: cyan">설문 진행 중: </span><span>{{ globalInfo.lastVote.title }}</span>
|
||||||
|
</div>
|
||||||
|
<div v-else class="subVoteState" style="color: magenta">진행중인 설문 없음</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="onlineNations">접속중인 국가: {{globalInfo.onlineNations}}</div>
|
<div class="onlineNations">접속중인 국가: {{ globalInfo.onlineNations }}</div>
|
||||||
<div class="nationNotice">국가 방침</div>
|
<div class="nationNotice">국가 방침</div>
|
||||||
<div>접속자</div>
|
<div>접속자</div>
|
||||||
<div class="d-grid"><BButton @click="tryRefresh">갱신</BButton></div>
|
<div class="d-grid"><BButton @click="tryRefresh">갱신</BButton></div>
|
||||||
<!-- TODO: 운영자 툴바는 어디에?-->
|
<!-- TODO: 운영자 툴바는 어디에?-->
|
||||||
<div class="mapView">지도</div>
|
<div class="mapView">
|
||||||
|
<MapViewer
|
||||||
|
v-if="map"
|
||||||
|
:serverNick="serverNick"
|
||||||
|
:serverID="serverID"
|
||||||
|
:mapName="unwrap(gameConstStore?.gameConst.mapName)"
|
||||||
|
:isDetailMap="true"
|
||||||
|
:cityPosition="cityPosition"
|
||||||
|
:imagePath="imagePath"
|
||||||
|
:formatCityInfo="formatCityInfoText"
|
||||||
|
:mapData="map"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<div class="reservedCommandZone">예턴</div>
|
<div class="reservedCommandZone">예턴</div>
|
||||||
<div v-if="frontInfo" class="cityInfo">
|
<div v-if="frontInfo" class="cityInfo">
|
||||||
<CityBasicCard :city="frontInfo.city" />
|
<CityBasicCard :city="frontInfo.city" />
|
||||||
@@ -86,7 +107,14 @@
|
|||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div class="commonToolbar">툴바?</div>
|
<div class="commonToolbar">툴바?</div>
|
||||||
<MessagePanel v-if="generalInfo" :generalID="generalInfo.no" :generalName="generalInfo.name" :nationID="generalInfo.nation" :permissionLevel="generalInfo.permission" ref="msgPanel" />
|
<MessagePanel
|
||||||
|
v-if="generalInfo"
|
||||||
|
:generalID="generalInfo.no"
|
||||||
|
:generalName="generalInfo.name"
|
||||||
|
:nationID="generalInfo.nation"
|
||||||
|
:permissionLevel="generalInfo.permission"
|
||||||
|
ref="msgPanel"
|
||||||
|
/>
|
||||||
<div class="commonToolbar">툴바?</div>
|
<div class="commonToolbar">툴바?</div>
|
||||||
</main>
|
</main>
|
||||||
</BContainer>
|
</BContainer>
|
||||||
@@ -106,6 +134,10 @@ declare const staticValues: {
|
|||||||
mapName: string;
|
mapName: string;
|
||||||
unitSet: string;
|
unitSet: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
declare const getCityPosition: () => CityPositionMap;
|
||||||
|
declare const formatCityInfo: (city: MapCityParsedRaw) => MapCityParsed;
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { BContainer, BButton, useToast } from "bootstrap-vue-3";
|
import { BContainer, BButton, useToast } from "bootstrap-vue-3";
|
||||||
@@ -124,9 +156,10 @@ import NationBasicCard from "./components/NationBasicCard.vue";
|
|||||||
import GeneralBasicCard from "./components/GeneralBasicCard.vue";
|
import GeneralBasicCard from "./components/GeneralBasicCard.vue";
|
||||||
import MessagePanel from "./components/MessagePanel.vue";
|
import MessagePanel from "./components/MessagePanel.vue";
|
||||||
import type { GeneralListItemP1 } from "./defs/API/Nation";
|
import type { GeneralListItemP1 } from "./defs/API/Nation";
|
||||||
import type { NationStaticItem } from "./defs";
|
import type { MapResult, NationStaticItem } from "./defs";
|
||||||
import { formatTime } from "./util/formatTime";
|
import { formatTime } from "./util/formatTime";
|
||||||
import { calcTournamentTerm } from "./utilGame";
|
import { calcTournamentTerm } from "./utilGame";
|
||||||
|
import MapViewer, { type CityPositionMap, type MapCityParsed, type MapCityParsedRaw } from "./components/MapViewer.vue";
|
||||||
|
|
||||||
const { serverName, serverNick, serverID } = staticValues;
|
const { serverName, serverNick, serverID } = staticValues;
|
||||||
|
|
||||||
@@ -150,7 +183,6 @@ let responseLock = false;
|
|||||||
const msgPanel = ref<InstanceType<typeof MessagePanel>>();
|
const msgPanel = ref<InstanceType<typeof MessagePanel>>();
|
||||||
|
|
||||||
async function tryRefresh() {
|
async function tryRefresh() {
|
||||||
|
|
||||||
msgPanel.value?.tryRefresh();
|
msgPanel.value?.tryRefresh();
|
||||||
|
|
||||||
if (responseLock) {
|
if (responseLock) {
|
||||||
@@ -225,6 +257,7 @@ watch(refreshCounter, async () => {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
recordLock = true;
|
recordLock = true;
|
||||||
|
|
||||||
const response = await SammoAPI.Global.GetRecentRecord({
|
const response = await SammoAPI.Global.GetRecentRecord({
|
||||||
lastGeneralRecordID: lastGeneralRecordID.value,
|
lastGeneralRecordID: lastGeneralRecordID.value,
|
||||||
lastWorldHistoryID: lastWorldHistoryID.value,
|
lastWorldHistoryID: lastWorldHistoryID.value,
|
||||||
@@ -294,8 +327,8 @@ watch(refreshCounter, async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const frontInfo = ref<GetFrontInfoResponse>();
|
const frontInfo = ref<GetFrontInfoResponse>();
|
||||||
const globalInfo = ref<GetFrontInfoResponse['global']>({} as GetFrontInfoResponse['global'])
|
const globalInfo = ref<GetFrontInfoResponse["global"]>({} as GetFrontInfoResponse["global"]);
|
||||||
const generalInfo = ref<GetFrontInfoResponse['general']>();
|
const generalInfo = ref<GetFrontInfoResponse["general"]>();
|
||||||
const nationStaticInfo = ref<NationStaticItem>();
|
const nationStaticInfo = ref<NationStaticItem>();
|
||||||
|
|
||||||
let generalInfoLock = false;
|
let generalInfoLock = false;
|
||||||
@@ -338,6 +371,27 @@ watch(refreshCounter, async () => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const map = ref<MapResult>();
|
||||||
|
|
||||||
|
const cityPosition = getCityPosition();
|
||||||
|
const formatCityInfoText = formatCityInfo;
|
||||||
|
const imagePath = window.pathConfig.gameImage;
|
||||||
|
|
||||||
|
watch(refreshCounter, async () => {
|
||||||
|
try {
|
||||||
|
map.value = await SammoAPI.Global.GetMap({
|
||||||
|
neutralView: 0,
|
||||||
|
showMe: 1,
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
toasts.danger({
|
||||||
|
title: "지도 갱신 실패",
|
||||||
|
body: `${e}`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import "@scss/common/break_500px.scss";
|
@import "@scss/common/break_500px.scss";
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ Session::requireGameLogin()->setReadOnly();
|
|||||||
//TODO: 국가정보 받아오기
|
//TODO: 국가정보 받아오기
|
||||||
|
|
||||||
//TODO: 시나리오 정보는 gameConst 받아올때 가져오기
|
//TODO: 시나리오 정보는 gameConst 받아올때 가져오기
|
||||||
|
$mapName = GameConst::$mapName;
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
@@ -38,6 +39,7 @@ Session::requireGameLogin()->setReadOnly();
|
|||||||
]
|
]
|
||||||
], false) ?>
|
], false) ?>
|
||||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||||
|
<?= WebUtil::printJS("js/map/theme_{$mapName}.js") ?>
|
||||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||||
<?= WebUtil::printDist('vue', 'v_front', true) ?>
|
<?= WebUtil::printDist('vue', 'v_front', true) ?>
|
||||||
|
|||||||
Reference in New Issue
Block a user