feat: -60 turnterm 가변턴
This commit is contained in:
@@ -68,7 +68,7 @@ import { formatTime } from "@/util/formatTime";
|
||||
import { mb_strwidth } from "@/util/mb_strwidth";
|
||||
import { parseTime } from "@/util/parseTime";
|
||||
import type { StoredActionsHelper } from "@/util/StoredActionsHelper";
|
||||
import addMinutes from "date-fns/esm/addMinutes/index";
|
||||
import { addMinutes } from "date-fns/addMinutes";
|
||||
import { range } from "lodash-es";
|
||||
import { inject, onMounted, ref, type PropType } from "vue";
|
||||
import VueTypes from "vue-types";
|
||||
@@ -76,6 +76,7 @@ import DragSelect from "@/components/DragSelect.vue";
|
||||
import { BButton } from "bootstrap-vue-next";
|
||||
import { QueryActionHelper } from "@/util/QueryActionHelper";
|
||||
import type { ChiefResponse } from "@/defs/API/NationCommand";
|
||||
import { VarTurn60 } from "@/varTurn60";
|
||||
|
||||
const props = defineProps({
|
||||
style: VueTypes.object.isRequired,
|
||||
@@ -198,10 +199,21 @@ if (!props.officer || !props.officer.turnTime) {
|
||||
}
|
||||
} else {
|
||||
const baseTurnTime = parseTime(props.officer.turnTime);
|
||||
for (const idx of range(props.officer.turn.length)) {
|
||||
turnTimes.value.push(
|
||||
formatTime(addMinutes(baseTurnTime, idx * props.turnTerm), props.turnTerm >= 5 ? "HH:mm" : "mm:ss")
|
||||
);
|
||||
if(props.turnTerm == -60){
|
||||
const baseTurnTimeObj = VarTurn60.fromDatetime(baseTurnTime);
|
||||
for (const idx of range(props.officer.turn.length)) {
|
||||
turnTimes.value.push(
|
||||
formatTime(baseTurnTimeObj.addTurn(idx).toDate(), "HH:mm")
|
||||
);
|
||||
}
|
||||
}
|
||||
else{
|
||||
for (const idx of range(props.officer.turn.length)) {
|
||||
turnTimes.value.push(
|
||||
formatTime(addMinutes(baseTurnTime, idx * props.turnTerm), props.turnTerm >= 5 ? "HH:mm" : "mm:ss")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -310,14 +310,13 @@ declare const staticValues: {
|
||||
import { reactive, ref, watch } from "vue";
|
||||
import "@scss/game_bg.scss";
|
||||
import TopBackBar from "@/components/TopBackBar.vue";
|
||||
import _ from "lodash-es";
|
||||
import { sum } from "lodash-es";
|
||||
import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue";
|
||||
import { SammoAPI } from "./SammoAPI";
|
||||
import { InheritResetStat, type inheritBuffType, type InheritPointLogItem } from "./defs/API/InheritAction";
|
||||
import * as JosaUtil from "@/util/JosaUtil";
|
||||
import { BButton } from "bootstrap-vue-next";
|
||||
import { unwrap } from "./util/unwrap";
|
||||
import { add as dateAdd } from 'date-fns';
|
||||
|
||||
const inheritanceViewText: Record<InheritanceViewType, { title: string; info: string }> = {
|
||||
sum: {
|
||||
@@ -428,7 +427,7 @@ const title = "유산 관리";
|
||||
|
||||
const items = ref(
|
||||
(() => {
|
||||
const totalPoint = Math.floor(_.sum(Object.values(staticValues.items)));
|
||||
const totalPoint = Math.floor(sum(Object.values(staticValues.items)));
|
||||
const previousPoint = Math.floor(staticValues.items["previous"]);
|
||||
const newPoint = Math.floor(totalPoint - previousPoint);
|
||||
const result: Record<InheritanceViewType, number> = {
|
||||
|
||||
+1
-1
@@ -485,7 +485,7 @@ watch(inheritCity, (newValue: undefined | number) => {
|
||||
const inheritTurnTimeZone = ref<number>();
|
||||
const turnTimeZoneList: string[] = (()=>{
|
||||
const result: string[] = [];
|
||||
const zoneSec = turnterm; // * 60 / 60
|
||||
const zoneSec = Math.abs(turnterm); // * 60 / 60
|
||||
let zoneCur = 0;
|
||||
for(const idx of range(60)){
|
||||
const zoneNext = zoneCur + zoneSec;
|
||||
|
||||
@@ -276,7 +276,7 @@ declare const staticValues: {
|
||||
</script>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import addMinutes from "date-fns/esm/addMinutes";
|
||||
import { addMinutes } from "date-fns/addMinutes";
|
||||
import { isString, range, trim } from "lodash-es";
|
||||
import queryString from "query-string";
|
||||
import { onMounted, ref, watch } from "vue";
|
||||
@@ -297,6 +297,7 @@ import { QueryActionHelper } from "./util/QueryActionHelper";
|
||||
import SimpleClock from "./components/SimpleClock.vue";
|
||||
import type { ReservedCommandResponse } from "./defs/API/Command";
|
||||
import { unwrap } from "./util/unwrap";
|
||||
import { VarTurn60 } from "./varTurn60";
|
||||
|
||||
defineExpose({
|
||||
updateCommandTable,
|
||||
@@ -544,7 +545,13 @@ async function reloadCommandList() {
|
||||
});
|
||||
|
||||
yearMonth += 1;
|
||||
nextTurnTime = addMinutes(nextTurnTime, result.turnTerm);
|
||||
if(result.turnTerm == -60){
|
||||
nextTurnTime = VarTurn60.fromDatetime(nextTurnTime).addTurn(1).toDate();
|
||||
}
|
||||
else{
|
||||
nextTurnTime = addMinutes(nextTurnTime, result.turnTerm);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
serverNow.value = parseTime(result.date);
|
||||
|
||||
@@ -256,7 +256,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import addMinutes from "date-fns/esm/addMinutes";
|
||||
import { addMinutes } from "date-fns/addMinutes";
|
||||
import queryString from "query-string";
|
||||
import { onMounted, ref, watch, type PropType, inject, type Ref } from "vue";
|
||||
import { formatTime } from "@util/formatTime";
|
||||
@@ -282,6 +282,7 @@ import { unwrap_err } from "@/util/unwrap_err";
|
||||
import type { GameConstStore } from "@/GameConstStore";
|
||||
import { postFilterNationCommandGen } from "@/utilGame/postFilterNationCommandGen";
|
||||
import { unwrap } from "@/util/unwrap";
|
||||
import { VarTurn60 } from "@/varTurn60";
|
||||
|
||||
const toasts = unwrap(useToast());
|
||||
|
||||
@@ -536,13 +537,19 @@ function updateCommandList() {
|
||||
...obj,
|
||||
year,
|
||||
month,
|
||||
time: formatTime(nextTurnTime, props.turnTerm >= 5 ? "HH:mm" : "mm:ss"),
|
||||
time: formatTime(nextTurnTime, Math.abs(props.turnTerm) >= 5 ? "HH:mm" : "mm:ss"),
|
||||
tooltip: tooltip.length == 0 ? undefined : tooltip.join("\n"),
|
||||
style,
|
||||
});
|
||||
|
||||
yearMonth += 1;
|
||||
nextTurnTime = addMinutes(nextTurnTime, props.turnTerm);
|
||||
|
||||
if(props.turnTerm == -60){
|
||||
nextTurnTime = VarTurn60.fromDatetime(nextTurnTime).addTurn(1).toDate();
|
||||
}
|
||||
else{
|
||||
nextTurnTime = addMinutes(nextTurnTime, props.turnTerm);
|
||||
}
|
||||
}
|
||||
reservedCommandList.value = _reservedCommandList;
|
||||
updated.value = true;
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<AutorunInfo :autorunMode="globalInfo.autorunUser" />
|
||||
</div>
|
||||
<div class="s-border-t col py-2 col-8 col-lg-4 subYearMonth">
|
||||
현재: {{ globalInfo.year }}年 {{ globalInfo.month }}月 ({{ globalInfo.turnterm }}분 턴 서버)
|
||||
현재: {{ globalInfo.year }}年 {{ globalInfo.month }}月 ({{ globalInfo.turnterm == -60 ? '가변 60' : globalInfo.turnterm }}분 턴 서버)
|
||||
</div>
|
||||
<div class="s-border-t col py-2 col-4 col-lg-2 subOnlineUserCnt">
|
||||
전체 접속자 수: {{ (globalInfo.onlineUserCnt ?? 0).toLocaleString() }}명
|
||||
|
||||
@@ -175,8 +175,9 @@ import { clamp } from "lodash-es";
|
||||
import { formatCityName } from "@/utilGame/formatCityName";
|
||||
import { isValidObjKey } from "@/utilGame/isValidObjKey";
|
||||
import { calcInjury } from "@/utilGame/calcInjury";
|
||||
import { addMinutes } from "date-fns/esm";
|
||||
import { addMinutes } from "date-fns/addMinutes";
|
||||
import type { GameIActionInfo } from "@/defs/GameObj";
|
||||
import { VarTurn60 } from "@/varTurn60";
|
||||
const imagePath = window.pathConfig.gameImage;
|
||||
const gameConstStore = unwrap(inject<Ref<GameConstStore>>("gameConstStore"));
|
||||
const props = defineProps<{
|
||||
@@ -278,7 +279,12 @@ watch(
|
||||
() => {
|
||||
let turnTime = parseTime(general.value.turntime);
|
||||
if (turnTime.getTime() < props.lastExecuted.getTime()) {
|
||||
turnTime = addMinutes(turnTime, props.turnTerm);
|
||||
if(props.turnTerm == -60){
|
||||
turnTime = VarTurn60.fromDatetime(turnTime).addTurn(1).toDate();
|
||||
}
|
||||
else {
|
||||
turnTime = addMinutes(turnTime, props.turnTerm);
|
||||
}
|
||||
}
|
||||
nextExecuteMinute.value = Math.floor(clamp((turnTime.getTime() - props.lastExecuted.getTime()) / 60000, 0, 999));
|
||||
},
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
<script setup lang="ts">
|
||||
import type { MsgItem, MsgTarget, MsgType } from "@/defs/API/Message";
|
||||
import { parseTime } from "@/util/parseTime";
|
||||
import { differenceInMilliseconds, addMinutes } from "date-fns/esm";
|
||||
import { addMinutes, differenceInMilliseconds } from "date-fns";
|
||||
import { computed, onMounted, ref, toRef, watch, type ComputedRef, type Ref } from "vue";
|
||||
import linkifyStr from "linkify-string";
|
||||
import { SammoAPI } from "@/SammoAPI";
|
||||
|
||||
@@ -93,7 +93,7 @@ $(function () {
|
||||
const runAnalysis = async function () {
|
||||
let realKillturn = killturn;
|
||||
if(autorun_user && autorun_user.limit_minutes){
|
||||
realKillturn -= autorun_user.limit_minutes / turnterm;
|
||||
realKillturn -= autorun_user.limit_minutes / Math.abs(turnterm);
|
||||
}
|
||||
const $content = $('#on_mover .content');
|
||||
try {
|
||||
|
||||
+1
-1
@@ -147,7 +147,7 @@ const descriptor: NamedRules<InstallFormType> = {
|
||||
turnterm: {
|
||||
required: true,
|
||||
type: "enum",
|
||||
enum: [1, 2, 5, 10, 20, 30, 60, 120],
|
||||
enum: [1, 2, 5, 10, 20, 30, 60, 120, -60],
|
||||
transform: parseInt,
|
||||
},
|
||||
sync: {
|
||||
|
||||
+3
-3
@@ -6,7 +6,7 @@ import axios from 'axios';
|
||||
import { convertFormData } from '@util/convertFormData';
|
||||
import { isBrightColor } from "@util/isBrightColor";
|
||||
import { unwrap } from '@util/unwrap';
|
||||
import _, { isError, isString } from 'lodash-es';
|
||||
import { isError, isString, last, trim } from 'lodash-es';
|
||||
import { addMinutes } from 'date-fns';
|
||||
import { parseTime } from '@util/parseTime';
|
||||
import { formatTime } from '@util/formatTime';
|
||||
@@ -234,7 +234,7 @@ function redrawMsg(msgResponse: MsgResponse, addFront: boolean): MsgResponse {
|
||||
if (!msgList || msgList.length == 0) {
|
||||
continue;
|
||||
}
|
||||
const lastMsg = unwrap(_.last(msgList));
|
||||
const lastMsg = unwrap(last(msgList));
|
||||
minMsgSeq[msgType] = Math.min(minMsgSeq[msgType], lastMsg.id);
|
||||
}
|
||||
return obj;
|
||||
@@ -605,7 +605,7 @@ function activateMessageForm() {
|
||||
|
||||
$msgSubmit.on('click', async function () {
|
||||
|
||||
const text = _.trim(unwrap_any<string>($msgInput.val()));
|
||||
const text = trim(unwrap_any<string>($msgInput.val()));
|
||||
$msgInput.val('').trigger('focus');
|
||||
|
||||
const targetMailbox = unwrap_any<string>($mailboxList.val());
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { clamp } from 'lodash-es';
|
||||
export function calcTournamentTerm(turnTerm: number): number{
|
||||
turnTerm = Math.abs(turnTerm);
|
||||
return clamp(turnTerm, 5, 120);
|
||||
}
|
||||
@@ -0,0 +1,260 @@
|
||||
import {
|
||||
addSeconds,
|
||||
addDays,
|
||||
differenceInCalendarDays,
|
||||
} from 'date-fns';
|
||||
import {
|
||||
toZonedTime,
|
||||
fromZonedTime,
|
||||
} from 'date-fns-tz';
|
||||
import { formatTime } from './util/formatTime';
|
||||
|
||||
import { parse as parseDF, isValid } from 'date-fns';
|
||||
|
||||
export const SEOUL_TZ = 'Asia/Seoul';
|
||||
|
||||
// 문자열이 타임존/오프셋을 포함하는지 단순 판별 (ISO 형태 위주)
|
||||
const TZ_OFFSET_RE = /([zZ]|[+-]\d{2}:?\d{2})$/;
|
||||
|
||||
function tryParseWithFormats(s: string): Date | null {
|
||||
const fmts = [
|
||||
"yyyy-MM-dd'T'HH:mm:ss", // 2025-10-31T09:30:00
|
||||
'yyyy-MM-dd HH:mm:ss', // 2025-10-31 09:30:00
|
||||
"yyyy-MM-dd'T'HH:mm", // 2025-10-31T09:30
|
||||
'yyyy-MM-dd HH:mm', // 2025-10-31 09:30
|
||||
'yyyy-MM-dd', // 2025-10-31
|
||||
];
|
||||
for (const fmt of fmts) {
|
||||
const d = parseDF(s, fmt, new Date(0));
|
||||
if (isValid(d)) return d;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/** 문자열/Date/number 입력을 UTC Date로 정규화
|
||||
* - 문자열에 오프셋/타임존이 없으면 Asia/Seoul 기준 “벽시계 시간”으로 간주
|
||||
* - number는 epoch ms로 간주 (epoch s면 직접 *1000 해서 넘겨줘)
|
||||
*/
|
||||
export function toUTC(input: string | Date | number): Date {
|
||||
if (input instanceof Date) {
|
||||
return new Date(input.getTime()); // 이미 절대시간
|
||||
}
|
||||
if (typeof input === 'number') {
|
||||
return new Date(input); // epoch ms
|
||||
}
|
||||
const s = input.trim();
|
||||
|
||||
// 오프셋/타임존이 명시된 ISO라면 기본 파서로 (절대시간 유지)
|
||||
if (TZ_OFFSET_RE.test(s)) {
|
||||
const d = new Date(s);
|
||||
if (isValid(d)) return d;
|
||||
}
|
||||
|
||||
// 오프셋이 없는 문자열 → 서울 벽시계로 파싱해서 UTC로 변환
|
||||
const parsedLocal = tryParseWithFormats(s) ?? new Date(s);
|
||||
if (!isValid(parsedLocal)) {
|
||||
throw new Error(`Unparsable date string: "${input}"`);
|
||||
}
|
||||
// parsedLocal는 "그 문자열 그대로의 Y/M/D h:m:s"를 들고 있음(타임존 無)
|
||||
// 이를 Asia/Seoul 로컬로 간주해 UTC로 변환
|
||||
const utc = fromZonedTime(parsedLocal, SEOUL_TZ);
|
||||
return utc;
|
||||
}
|
||||
|
||||
export class VarTurn60 {
|
||||
static readonly TZ = 'Asia/Seoul';
|
||||
static readonly MonthAdjustOffset = 2;
|
||||
|
||||
// [turnIdx, minOffset, turnTermMinutes]
|
||||
static readonly min30ToTurn: Array<[number, number, number]> = [
|
||||
[0, 0, 120],
|
||||
[0, 30, 120],
|
||||
[0, 60, 120],
|
||||
[0, 90, 120],
|
||||
[1, 0, 120],
|
||||
[1, 30, 120],
|
||||
[1, 60, 120],
|
||||
[1, 90, 120],
|
||||
[2, 0, 120],
|
||||
[2, 30, 120],
|
||||
[2, 60, 120],
|
||||
[2, 90, 120],
|
||||
[3, 0, 60],
|
||||
[3, 30, 60],
|
||||
[4, 0, 60],
|
||||
[4, 30, 60],
|
||||
[5, 0, 60],
|
||||
[5, 30, 60],
|
||||
[6, 0, 60],
|
||||
[6, 30, 60],
|
||||
[7, 0, 60],
|
||||
[7, 30, 60],
|
||||
[8, 0, 60],
|
||||
[8, 30, 60],
|
||||
[9, 0, 60],
|
||||
[9, 30, 60],
|
||||
[10, 0, 60],
|
||||
[10, 30, 60],
|
||||
[11, 0, 60],
|
||||
[11, 30, 60],
|
||||
[12, 0, 60],
|
||||
[12, 30, 60],
|
||||
[13, 0, 60],
|
||||
[13, 30, 60],
|
||||
[14, 0, 60],
|
||||
[14, 30, 60],
|
||||
[15, 0, 60],
|
||||
[15, 30, 60],
|
||||
[16, 0, 30],
|
||||
[17, 0, 30],
|
||||
[18, 0, 30],
|
||||
[19, 0, 30],
|
||||
[20, 0, 30],
|
||||
[21, 0, 30],
|
||||
[22, 0, 60],
|
||||
[22, 30, 60],
|
||||
[23, 0, 60],
|
||||
[23, 30, 60],
|
||||
];
|
||||
|
||||
// [hour, minOffset, turnTermMinutes] for turnIdx 0..23
|
||||
static readonly turnToHM: Array<[number, number, number]> = [
|
||||
[0, 0, 120],
|
||||
[2, 0, 120],
|
||||
[4, 0, 120],
|
||||
[6, 0, 60],
|
||||
[7, 0, 60],
|
||||
[8, 0, 60],
|
||||
[9, 0, 60],
|
||||
[10, 0, 60],
|
||||
[11, 0, 60],
|
||||
[12, 0, 60],
|
||||
[13, 0, 60],
|
||||
[14, 0, 60],
|
||||
[15, 0, 60],
|
||||
[16, 0, 60],
|
||||
[17, 0, 60],
|
||||
[18, 0, 60],
|
||||
[19, 0, 30],
|
||||
[19, 30, 30],
|
||||
[20, 0, 30],
|
||||
[20, 30, 30],
|
||||
[21, 0, 30],
|
||||
[21, 30, 30],
|
||||
[22, 0, 60],
|
||||
[23, 0, 60],
|
||||
];
|
||||
|
||||
constructor(
|
||||
public readonly baseDayUTC: Date, // UTC 기준 하루의 00:00 (Seoul 기준)
|
||||
public readonly turnIdx: number, // 0..23
|
||||
public readonly secOffset: number // seconds within the turn
|
||||
) { }
|
||||
|
||||
// ----- Utilities -----
|
||||
|
||||
/** date → 서울 자정 (UTC 기준 Date) */
|
||||
private static toSeoulMidnightUTC(dateUTC: Date): Date {
|
||||
const zoned = toZonedTime(dateUTC, this.TZ);
|
||||
const midnightInSeoul = new Date(
|
||||
zoned.getFullYear(), zoned.getMonth(), zoned.getDate(), 0, 0, 0, 0
|
||||
);
|
||||
return fromZonedTime(midnightInSeoul, this.TZ);
|
||||
}
|
||||
|
||||
private static format(dateUTC: Date, withFraction = true): string {
|
||||
const zoned = toZonedTime(dateUTC, this.TZ);
|
||||
return formatTime(zoned, withFraction);
|
||||
}
|
||||
|
||||
private static addSecondsUTC(base: Date, sec: number): Date {
|
||||
return addSeconds(base, sec);
|
||||
}
|
||||
|
||||
private static addDaysUTC(base: Date, days: number): Date {
|
||||
return addDays(base, days);
|
||||
}
|
||||
|
||||
// ----- Core Logic -----
|
||||
|
||||
|
||||
static fromDatetime(input: string | Date | number): VarTurn60 {
|
||||
const utc = toUTC(input);
|
||||
const baseDayUTC = this.toSeoulMidnightUTC(utc);
|
||||
const zoned = toZonedTime(utc, this.TZ);
|
||||
|
||||
const totalSec = zoned.getHours() * 3600 + zoned.getMinutes() * 60 + zoned.getSeconds();
|
||||
const min30 = Math.floor(totalSec / 1800);
|
||||
if (min30 < 0 || min30 >= 48) throw new RangeError('half-hour index out of range');
|
||||
const [turnIdx, minOffset] = this.min30ToTurn[min30];
|
||||
const secOffset = totalSec - 1800 * min30 + minOffset * 60;
|
||||
|
||||
return new VarTurn60(baseDayUTC, turnIdx, secOffset);
|
||||
}
|
||||
|
||||
static calcTurnDiff(a: string | Date | number, b: string | Date | number): number {
|
||||
const aObj = this.fromDatetime(a);
|
||||
const bObj = this.fromDatetime(b);
|
||||
const dayDiff = differenceInCalendarDays(bObj.baseDayUTC, aObj.baseDayUTC);
|
||||
return dayDiff * 24 + (bObj.turnIdx - aObj.turnIdx);
|
||||
}
|
||||
|
||||
cutTurn(withFraction = true): [string, number] {
|
||||
const [hour, minOffset, turnTerm] = VarTurn60.turnToHM[this.turnIdx];
|
||||
const sec = (hour * 60 + minOffset) * 60;
|
||||
const date = VarTurn60.addSecondsUTC(this.baseDayUTC, sec);
|
||||
return [VarTurn60.format(date, withFraction), turnTerm];
|
||||
}
|
||||
|
||||
toDate(): Date {
|
||||
const [hour, minOffset] = VarTurn60.turnToHM[this.turnIdx];
|
||||
const sec = (hour * 60 + minOffset) * 60 + this.secOffset;
|
||||
const date = toZonedTime(VarTurn60.addSecondsUTC(this.baseDayUTC, sec), SEOUL_TZ);
|
||||
return date;
|
||||
}
|
||||
|
||||
toDateStr(withFraction = true): string {
|
||||
const [hour, minOffset] = VarTurn60.turnToHM[this.turnIdx];
|
||||
const sec = (hour * 60 + minOffset) * 60 + this.secOffset;
|
||||
const date = VarTurn60.addSecondsUTC(this.baseDayUTC, sec);
|
||||
return VarTurn60.format(date, withFraction);
|
||||
}
|
||||
|
||||
cutDay(withFraction = true): [string, boolean, number] {
|
||||
const newMonth = ((this.turnIdx + VarTurn60.MonthAdjustOffset) % 12) + 1;
|
||||
const moved = this.addTurn(-(newMonth - 1));
|
||||
const [dateStr] = moved.cutTurn(withFraction);
|
||||
const yearPulled = newMonth > 3;
|
||||
return [dateStr, yearPulled, newMonth];
|
||||
}
|
||||
|
||||
addTurn(moreTurn: number): VarTurn60 {
|
||||
let dayDiff = Math.trunc(moreTurn / 24);
|
||||
moreTurn %= 24;
|
||||
|
||||
let nextTurnIdx = this.turnIdx + moreTurn;
|
||||
if (nextTurnIdx < 0) {
|
||||
dayDiff -= 1;
|
||||
nextTurnIdx += 24;
|
||||
} else if (nextTurnIdx >= 24) {
|
||||
dayDiff += 1;
|
||||
nextTurnIdx -= 24;
|
||||
}
|
||||
|
||||
const [, , oldTurnTerm] = VarTurn60.turnToHM[this.turnIdx];
|
||||
const [, , nextTurnTerm] = VarTurn60.turnToHM[nextTurnIdx];
|
||||
|
||||
let nextSecOffset = this.secOffset;
|
||||
if (oldTurnTerm !== nextTurnTerm) {
|
||||
nextSecOffset = (nextSecOffset * nextTurnTerm) / oldTurnTerm;
|
||||
const cap = nextTurnTerm * 60 - 1;
|
||||
if (nextSecOffset < 0) nextSecOffset = 0;
|
||||
if (nextSecOffset > cap) nextSecOffset = cap;
|
||||
}
|
||||
|
||||
const nextBaseDayUTC =
|
||||
dayDiff === 0 ? this.baseDayUTC : VarTurn60.addDaysUTC(this.baseDayUTC, dayDiff);
|
||||
|
||||
return new VarTurn60(nextBaseDayUTC, nextTurnIdx, nextSecOffset);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user