inheritAction: UI 1차 완성
This commit is contained in:
@@ -14,9 +14,9 @@ class BuySpecificUnique extends \sammo\BaseAPI
|
||||
{
|
||||
public function validateArgs(): ?string
|
||||
{
|
||||
foreach(GameConst::$allItems as $items){
|
||||
foreach($items as $itemKey=>$amount){
|
||||
if($amount == 0){
|
||||
foreach (GameConst::$allItems as $items) {
|
||||
foreach ($items as $itemKey => $amount) {
|
||||
if ($amount == 0) {
|
||||
continue;
|
||||
}
|
||||
$availableItems[$itemKey] = $amount;
|
||||
@@ -29,7 +29,7 @@ class BuySpecificUnique extends \sammo\BaseAPI
|
||||
'amount',
|
||||
])
|
||||
->rule('integer', 'amount')
|
||||
->rule('min', GameConst::$inheritItemUniqueMinPoint)
|
||||
->rule('min', 'amount', GameConst::$inheritItemUniqueMinPoint)
|
||||
->rule('keyExists', 'item', $availableItems);
|
||||
|
||||
if (!$v->validate()) {
|
||||
@@ -53,20 +53,20 @@ class BuySpecificUnique extends \sammo\BaseAPI
|
||||
$generalID = $session->generalID;
|
||||
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
if($userID != $general->getVar('owner')){
|
||||
if ($userID != $general->getVar('owner')) {
|
||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||
}
|
||||
|
||||
$itemTrials = $general->getAuxVar('inheritUniqueTrial') ?? [];
|
||||
if(key_exists($itemKey, $itemTrials)){
|
||||
if (key_exists($itemKey, $itemTrials)) {
|
||||
return '이미 입찰한 아이템입니다. 다음 턴에 시도해 주세요.';
|
||||
}
|
||||
|
||||
$db = DB::db();
|
||||
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||
$trialStor = KVStorage::getStorage($db, "ut_{$itemKey}");
|
||||
$previousPoint = $inheritStor->getValue('previous')??0;
|
||||
if($previousPoint < $amount){
|
||||
$previousPoint = ($inheritStor->getValue('previous') ?? [0, 0])[0];
|
||||
if ($previousPoint < $amount) {
|
||||
return '충분한 유산 포인트를 가지고 있지 않습니다.';
|
||||
}
|
||||
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
#inheritance_list{
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.inherit_padding{
|
||||
width: 33%;
|
||||
padding: 10px 2px;
|
||||
}
|
||||
|
||||
.inherit_item{
|
||||
width: 33%;
|
||||
padding: 10px 2px;
|
||||
}
|
||||
|
||||
.col-form-label{
|
||||
text-align:right;
|
||||
padding-right:2ch;
|
||||
}
|
||||
|
||||
.inherit_value{
|
||||
text-align: right;
|
||||
}
|
||||
@@ -61,7 +61,6 @@
|
||||
|
||||
<script lang="ts">
|
||||
import "../scss/bootstrap5.scss";
|
||||
import "../scss/inheritPoint.scss";
|
||||
import "../scss/game_bg.scss";
|
||||
import "../../css/config.css";
|
||||
|
||||
|
||||
+265
-50
@@ -5,16 +5,19 @@
|
||||
class="tb_layout bg0"
|
||||
style="max-width: 1000px; margin: auto; border: solid 1px #888888"
|
||||
>
|
||||
<div id="inheritance_list">
|
||||
<div id="inheritance_list" class="row">
|
||||
<template v-for="(text, key) in inheritanceViewText" :key="key">
|
||||
<div :id="`inherit_${key}`" class="inherit_item inherit_template_item">
|
||||
<div
|
||||
:id="`inherit_${key}`"
|
||||
class="col col-sm-4 col-12 inherit_item inherit_template_item"
|
||||
>
|
||||
<div class="row">
|
||||
<label
|
||||
:id="`inherit_${key}_head`"
|
||||
class="inherit_head col-sm-6 col-form-label"
|
||||
class="inherit_head col col-md-6 col-sm-12 col-6 col-form-label"
|
||||
>{{ text.title }}</label
|
||||
>
|
||||
<div class="col-sm-6">
|
||||
<div class="col col-md-6 col-sm-12 col-6">
|
||||
<input
|
||||
type="text"
|
||||
class="form-control inherit_value"
|
||||
@@ -38,56 +41,94 @@
|
||||
<div class="row">
|
||||
<div class="col"><div class="bg1 a-center">유산 포인트 상점</div></div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div
|
||||
class="col col-md-4 col-6"
|
||||
v-for="(info, buffKey) in inheritBuffHelpText"
|
||||
:key="buffKey"
|
||||
>
|
||||
<div class="row">
|
||||
<label
|
||||
class="col col-sm-6 col-form-label"
|
||||
:for="`buff-${buffKey}`"
|
||||
>{{ info.title }}</label
|
||||
>
|
||||
<div class="col col-sm-6">
|
||||
<b-form-input
|
||||
:id="`buff-${buffKey}`"
|
||||
type="number"
|
||||
v-model="inheritBuff[buffKey]"
|
||||
:min="prevInheritBuff[buffKey] ?? 0"
|
||||
:max="maxInheritBuff"
|
||||
></b-form-input>
|
||||
<div class="col offset-md-4 col-md-4 col-sm-6 col-12 py-2">
|
||||
<div class="row px-4">
|
||||
<div class="a-right col-6 align-self-center">
|
||||
다음 전투 특기 선택
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<select class="form-select col-6" v-model="nextSpecialWar">
|
||||
<option
|
||||
v-for="(info, key) in availableSpecialWar"
|
||||
:key="key"
|
||||
:value="key"
|
||||
>
|
||||
{{ info.title }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div style="text-align: right">
|
||||
<div class="a-right">
|
||||
<small class="form-text text-muted"
|
||||
>{{ info.info }}<br /><span style="color: white"
|
||||
>필요 포인트:
|
||||
{{
|
||||
inheritActionCost.buff[inheritBuff[buffKey]] -
|
||||
inheritActionCost.buff[prevInheritBuff[buffKey] ?? 0]
|
||||
}}</span
|
||||
><span
|
||||
style="color: white"
|
||||
v-html="availableSpecialWar[nextSpecialWar].info"
|
||||
/><br />다음에 얻을 전투 특기를 정합니다.<br /><span
|
||||
style="color: white"
|
||||
>필요 포인트: {{ inheritActionCost.nextSpecial }}</span
|
||||
></small
|
||||
>
|
||||
</div>
|
||||
<div class="row px-4" style="margin-bottom: 1em">
|
||||
<div class="row px-4">
|
||||
<b-button
|
||||
variant="secondary"
|
||||
@click="inheritBuff[buffKey] = prevInheritBuff[buffKey] ?? 0"
|
||||
class="col col-md-6 col-4 offset-md-0 offset-4"
|
||||
>리셋</b-button
|
||||
><b-button
|
||||
class="col-6 offset-6"
|
||||
variant="primary"
|
||||
class="col col-md-6 col-4"
|
||||
@click="buyInheritBuff(buffKey)"
|
||||
@click="setNextSpecialWar"
|
||||
>구입</b-button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col col-md-4 col-sm-6 col-12 py-2">
|
||||
<div class="row px-4">
|
||||
<div class="a-right col-6 align-self-center">유니크 입찰</div>
|
||||
<div class="col-6">
|
||||
<select class="form-select col-6" v-model="specificUnique">
|
||||
<option
|
||||
v-for="(info, key) in availableUnique"
|
||||
:key="key"
|
||||
:value="key"
|
||||
>
|
||||
{{ info.title }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row px-4">
|
||||
<div class="col">
|
||||
<NumberInputWithInfo
|
||||
title="입찰 포인트"
|
||||
:min="inheritActionCost.minSpecificUnique"
|
||||
:max="this.items.previous"
|
||||
v-model="specificUniqueAmount"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="a-right">
|
||||
<small class="form-text text-muted"
|
||||
>얻고자 하는 유니크 아이템을 포인트를 걸어 입찰합니다. 최고
|
||||
포인트인 경우 다음 턴에 유니크를 얻습니다.<br /><span
|
||||
style="color: white"
|
||||
v-html="availableUnique[specificUnique].info"
|
||||
/></small>
|
||||
</div>
|
||||
|
||||
<div class="row px-4">
|
||||
<b-button
|
||||
class="col-6 offset-6"
|
||||
variant="primary"
|
||||
@click="buySpecificUnique"
|
||||
>구입</b-button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row py-2" style="margin-top: 2em">
|
||||
<div class="col col-md-4 col-sm-6">
|
||||
<div style="width: 100%; padding: 0 10px">
|
||||
<hr :style="{ opacity: 0.5 }" />
|
||||
</div>
|
||||
<div class="row py-sm-2">
|
||||
<div class="col col-md-4 col-sm-6 col-12 py-2">
|
||||
<div class="row px-4">
|
||||
<div class="a-right col-6 align-self-center">랜덤 턴 초기화</div>
|
||||
<b-button
|
||||
@@ -105,7 +146,7 @@
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col col-md-4 col-sm-6">
|
||||
<div class="col col-md-4 col-sm-6 col-12 py-2">
|
||||
<div class="row px-4">
|
||||
<div class="a-right col-6 align-self-center">랜덤 유니크 획득</div>
|
||||
<b-button
|
||||
@@ -123,7 +164,7 @@
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col col-md-4 col-sm-6">
|
||||
<div class="col col-md-4 col-sm-6 col-12 py-2">
|
||||
<div class="row px-4">
|
||||
<div class="a-right col-6 align-self-center">
|
||||
즉시 전투 특기 초기화
|
||||
@@ -144,25 +185,68 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ResetTurnTime -->
|
||||
<!-- BuyRandomUnique -->
|
||||
<!-- ResetSpecialWar -->
|
||||
<!-- SetNextSpecialWar, type -->
|
||||
<!-- BuySpecificUnique, item, amount -->
|
||||
</div>
|
||||
<div style="width: 100%; padding: 0 10px">
|
||||
<hr :style="{ opacity: 0.5 }" />
|
||||
</div>
|
||||
<div class="row">
|
||||
<div
|
||||
class="col col-md-4 col-sm-6 col-12"
|
||||
v-for="(info, buffKey) in inheritBuffHelpText"
|
||||
:key="buffKey"
|
||||
>
|
||||
<div class="row">
|
||||
<label class="col col-sm-6 col-form-label" :for="`buff-${buffKey}`">{{
|
||||
info.title
|
||||
}}</label>
|
||||
<div class="col col-sm-6">
|
||||
<b-form-input
|
||||
:id="`buff-${buffKey}`"
|
||||
type="number"
|
||||
v-model="inheritBuff[buffKey]"
|
||||
:min="prevInheritBuff[buffKey] ?? 0"
|
||||
:max="maxInheritBuff"
|
||||
></b-form-input>
|
||||
</div>
|
||||
</div>
|
||||
<div style="text-align: right">
|
||||
<small class="form-text text-muted"
|
||||
>{{ info.info }}<br /><span style="color: white"
|
||||
>필요 포인트:
|
||||
{{
|
||||
inheritActionCost.buff[inheritBuff[buffKey]] -
|
||||
inheritActionCost.buff[prevInheritBuff[buffKey] ?? 0]
|
||||
}}</span
|
||||
></small
|
||||
>
|
||||
</div>
|
||||
<div class="row px-4" style="margin-bottom: 1em">
|
||||
<b-button
|
||||
variant="secondary"
|
||||
@click="inheritBuff[buffKey] = prevInheritBuff[buffKey] ?? 0"
|
||||
class="col col-md-6 col-4 offset-md-0 offset-4"
|
||||
>리셋</b-button
|
||||
><b-button
|
||||
variant="primary"
|
||||
class="col col-md-6 col-4"
|
||||
@click="buyInheritBuff(buffKey)"
|
||||
>구입</b-button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, PropType } from "vue";
|
||||
import { defineComponent } from "vue";
|
||||
import "../scss/bootstrap5.scss";
|
||||
import "../scss/inheritPoint.scss";
|
||||
import "../scss/game_bg.scss";
|
||||
import TopBackBar from "./components/TopBackBar.vue";
|
||||
import { sum } from "lodash";
|
||||
import _ from "lodash";
|
||||
import { InvalidResponse } from "./defs";
|
||||
import axios from "axios";
|
||||
import NumberInputWithInfo from "./components/NumberInputWithInfo.vue";
|
||||
|
||||
type InheritanceType =
|
||||
| "previous"
|
||||
@@ -300,11 +384,29 @@ declare const inheritActionCost: {
|
||||
resetTurnTime: number;
|
||||
resetSpecialWar: number;
|
||||
randomUnique: number;
|
||||
nextSpecial: number;
|
||||
minSpecificUnique: number;
|
||||
};
|
||||
|
||||
declare const resetTurnTimeLevel: number;
|
||||
declare const resetSpecialWarLevel: number;
|
||||
|
||||
declare const availableSpecialWar: Record<
|
||||
string,
|
||||
{
|
||||
title: string;
|
||||
info: string;
|
||||
}
|
||||
>;
|
||||
|
||||
declare const availableUnique: Record<
|
||||
string,
|
||||
{
|
||||
title: string;
|
||||
info: string;
|
||||
}
|
||||
>;
|
||||
|
||||
export default defineComponent({
|
||||
name: "InheritPoint",
|
||||
data() {
|
||||
@@ -335,6 +437,11 @@ export default defineComponent({
|
||||
inheritActionCost,
|
||||
resetTurnTimeLevel,
|
||||
resetSpecialWarLevel,
|
||||
nextSpecialWar: Object.keys(availableSpecialWar)[0],
|
||||
specificUnique: Object.keys(availableUnique)[0],
|
||||
availableSpecialWar,
|
||||
availableUnique,
|
||||
specificUniqueAmount: inheritActionCost.minSpecificUnique,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
@@ -443,6 +550,105 @@ export default defineComponent({
|
||||
return;
|
||||
}
|
||||
|
||||
alert("성공했습니다.");
|
||||
//TODO: 페이지 새로고침 필요없이 하도록
|
||||
location.reload();
|
||||
},
|
||||
async setNextSpecialWar() {
|
||||
const specialWarName =
|
||||
this.availableSpecialWar[this.nextSpecialWar].title ?? undefined;
|
||||
if (specialWarName === undefined) {
|
||||
alert(`잘못된 타입: ${this.nextSpecialWar}`);
|
||||
return;
|
||||
}
|
||||
|
||||
const cost = inheritActionCost.nextSpecial;
|
||||
if (this.items.previous < cost) {
|
||||
alert("유산 포인트가 부족합니다.");
|
||||
return;
|
||||
}
|
||||
//TODO: JosaUtil
|
||||
if (
|
||||
!confirm(
|
||||
`${cost} 포인트로 다음 전특을 ${specialWarName}(으)로 고정하겠습니까?`
|
||||
)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
let result: InvalidResponse;
|
||||
try {
|
||||
const response = await axios({
|
||||
url: "api.php",
|
||||
method: "post",
|
||||
responseType: "json",
|
||||
data: {
|
||||
path: `InheritAction/SetNextSpecialWar`,
|
||||
args: {
|
||||
type: this.nextSpecialWar,
|
||||
},
|
||||
},
|
||||
});
|
||||
result = response.data;
|
||||
if (!result.result) {
|
||||
throw result.reason;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
alert(`실패했습니다: ${e}`);
|
||||
return;
|
||||
}
|
||||
|
||||
alert("성공했습니다.");
|
||||
//TODO: 페이지 새로고침 필요없이 하도록
|
||||
location.reload();
|
||||
},
|
||||
async buySpecificUnique() {
|
||||
const uniqueName =
|
||||
this.availableUnique[this.specificUnique].title ?? undefined;
|
||||
if (uniqueName === undefined) {
|
||||
alert(`잘못된 타입: ${this.specificUnique}`);
|
||||
return;
|
||||
}
|
||||
|
||||
const amount = this.specificUniqueAmount;
|
||||
if (this.items.previous < amount) {
|
||||
alert("유산 포인트가 부족합니다.");
|
||||
return;
|
||||
}
|
||||
//TODO: JosaUtil
|
||||
if (
|
||||
!confirm(
|
||||
`${amount} 포인트로 ${uniqueName}(을)를 입찰하겠습니까?`
|
||||
)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
let result: InvalidResponse;
|
||||
try {
|
||||
const response = await axios({
|
||||
url: "api.php",
|
||||
method: "post",
|
||||
responseType: "json",
|
||||
data: {
|
||||
path: `InheritAction/BuySpecificUnique`,
|
||||
args: {
|
||||
item: this.specificUnique,
|
||||
amount,
|
||||
},
|
||||
},
|
||||
});
|
||||
result = response.data;
|
||||
if (!result.result) {
|
||||
throw result.reason;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
alert(`실패했습니다: ${e}`);
|
||||
return;
|
||||
}
|
||||
|
||||
alert("성공했습니다.");
|
||||
//TODO: 페이지 새로고침 필요없이 하도록
|
||||
location.reload();
|
||||
@@ -450,10 +656,19 @@ export default defineComponent({
|
||||
},
|
||||
components: {
|
||||
TopBackBar,
|
||||
NumberInputWithInfo,
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
<style>
|
||||
.col-form-label {
|
||||
text-align: right;
|
||||
padding-right: 2ch;
|
||||
}
|
||||
|
||||
.inherit_value {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
+35
-7
@@ -15,10 +15,6 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$me = General::createGeneralObjFromDB($generalID);
|
||||
|
||||
|
||||
$items = [];
|
||||
foreach (array_keys(General::INHERITANCE_KEY) as $key) {
|
||||
$items[$key] = $me->getInheritancePoint($key) ?? 0;
|
||||
}
|
||||
|
||||
$currentInheritBuff = [];
|
||||
foreach ($me->getAuxVar('inheritBuff') as $buff => $buffLevel) {
|
||||
@@ -37,9 +33,37 @@ function calcResetAttrPoint($level)
|
||||
return GameConst::$inheritResetAttrPointBase[$level];
|
||||
}
|
||||
|
||||
$avilableSpecialWar = [];
|
||||
foreach (GameConst::$availableSpecialWar as $specialWarKey) {
|
||||
$specialWarObj = buildGeneralSpecialWarClass($specialWarKey);
|
||||
$avilableSpecialWar[$specialWarKey] = [
|
||||
'title' => $specialWarObj->getName(),
|
||||
'info' => $specialWarObj->getInfo(),
|
||||
];
|
||||
}
|
||||
|
||||
$resetTurnTimeLevel = $me->getAuxVar('inheritResetTurnTime')??0;
|
||||
$resetSpecialWarLevel = $me->getAuxVar('inheritResetSpecialWar')??0;
|
||||
$availableUnique = [];
|
||||
foreach (GameConst::$allItems as $subItems){
|
||||
foreach($subItems as $itemKey=>$amount){
|
||||
if($amount == 0){
|
||||
continue;
|
||||
}
|
||||
$itemObj = buildItemClass($itemKey);
|
||||
$availableUnique[$itemKey] = [
|
||||
'title' => $itemObj->getName(),
|
||||
'info'=>$itemObj->getInfo(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$items = [];
|
||||
foreach (array_keys(General::INHERITANCE_KEY) as $key) {
|
||||
$items[$key] = $me->getInheritancePoint($key) ?? 0;
|
||||
}
|
||||
|
||||
$resetTurnTimeLevel = $me->getAuxVar('inheritResetTurnTime') ?? 0;
|
||||
$resetSpecialWarLevel = $me->getAuxVar('inheritResetSpecialWar') ?? 0;
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@@ -48,7 +72,7 @@ $resetSpecialWarLevel = $me->getAuxVar('inheritResetSpecialWar')??0;
|
||||
<title><?= UniqueConst::$serverName ?>: 유산 관리</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=1024" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<?= WebUtil::printCSS('dist_css/common_vue.css') ?>
|
||||
<?= WebUtil::printCSS('dist_css/v_inheritPoint.css') ?>
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js', true) ?>
|
||||
@@ -66,7 +90,11 @@ $resetSpecialWarLevel = $me->getAuxVar('inheritResetSpecialWar')??0;
|
||||
'resetTurnTime' => calcResetAttrPoint($resetTurnTimeLevel),
|
||||
'resetSpecialWar' => calcResetAttrPoint($resetSpecialWarLevel),
|
||||
'randomUnique' => GameConst::$inheritItemRandomPoint,
|
||||
'nextSpecial' => GameConst::$inheritSpecificSpecialPoint,
|
||||
'minSpecificUnique'=>GameConst::$inheritItemUniqueMinPoint,
|
||||
],
|
||||
'availableSpecialWar' => $avilableSpecialWar,
|
||||
'availableUnique' => $availableUnique,
|
||||
]) ?>
|
||||
</head>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user