diff --git a/packages-user/client-modules/src/render/ui/save.tsx b/packages-user/client-modules/src/render/ui/save.tsx
index 6e40e0a..39acc1f 100644
--- a/packages-user/client-modules/src/render/ui/save.tsx
+++ b/packages-user/client-modules/src/render/ui/save.tsx
@@ -1,14 +1,16 @@
import { ElementLocator, IWheelEvent } from '@motajs/render-core';
import { DefaultProps } from '@motajs/render-vue';
+import { Font } from '@motajs/render';
import {
GameUI,
IUIMountable,
SetupComponentOptions,
UIComponentProps
} from '@motajs/system-ui';
-import { defineComponent } from 'vue';
-import { Page } from '../components';
+import { defineComponent, ref } from 'vue';
+import { Background, Page, PageExpose } from '../components';
import { useKey } from '../use';
+import { MAP_WIDTH, MAP_HEIGHT } from '../shared';
export interface SaveProps extends UIComponentProps, DefaultProps {
loc: ElementLocator;
@@ -25,6 +27,40 @@ const saveProps = {
props: ['loc', 'controller', 'instance']
} satisfies SetupComponentOptions<SaveProps, SaveEmits, keyof SaveEmits>;
+function SaveBtn(props: {
+ loc: ElementLocator;
+ index: number;
+ emit: (index: number) => void;
+ isDelete: boolean;
+}) {
+ const w = props.loc[2];
+ return (
+ <container loc={props.loc}>
+ <text
+ text={
+ props.index === -1 ? '自动存档' : '存档' + (props.index + 1)
+ }
+ font={new Font('normal', 18)}
+ loc={[w! / 2, 0, undefined, undefined, 0.5, 0]}
+ />
+ <g-rect
+ loc={[0, 20, w, w]}
+ fill
+ stroke
+ fillStyle="gray"
+ strokeStyle={props.isDelete ? 'red' : 'white'}
+ onClick={() => props.emit(props.index)}
+ />
+ <text
+ text={'1000/10/10'}
+ fillStyle={'yellow'}
+ font={new Font('normal', 18)}
+ loc={[w! / 2, w! + 20, undefined, undefined, 0.5, 0]}
+ />
+ </container>
+ );
+}
+
export const Save = defineComponent<SaveProps, SaveEmits, keyof SaveEmits>(
(props, { emit }) => {
// 这些注释写完之后删了
@@ -39,13 +75,97 @@ export const Save = defineComponent<SaveProps, SaveEmits, keyof SaveEmits>(
key.realize('exit', () => {});
// 其他按键自定义,需要新开一个 save 的 group
+ /** 除自动存档外,每一页容纳的存档数量 */
+ const pageRef = ref<PageExpose>();
+ const pageCap = 5;
+
+ let isDelete = ref(false);
+
const emitSave = (index: number) => {
- emit('emit', index);
+ if (index === -1) {
+ console.log('不能覆盖自动存档!');
+ return;
+ }
+ emit('emit', index, isDelete.value);
};
- const wheel = (ev: IWheelEvent) => {};
+ const wheel = (ev: IWheelEvent) => {
+ if (ev.wheelY < 0) {
+ pageRef.value?.movePage(-(ev.ctrlKey ? 10 : 1));
+ } else if (ev.wheelY > 0) {
+ pageRef.value?.movePage(ev.ctrlKey ? 10 : 1);
+ }
+ };
- return () => <Page loc={props.loc} pages={1000} onWheel={wheel}></Page>;
+ return () => (
+ <container loc={props.loc}>
+ <Background loc={[0, 0, MAP_WIDTH, MAP_HEIGHT]} color="black" />
+ <Page
+ loc={[0, 0, MAP_WIDTH, MAP_HEIGHT - 10]}
+ pages={1000}
+ onWheel={wheel}
+ ref={pageRef}
+ >
+ {(page: number) => (
+ <container loc={[0, 0, MAP_WIDTH, MAP_HEIGHT]}>
+ <SaveBtn
+ loc={[30, 50, 120, 170]}
+ index={-1}
+ emit={emitSave}
+ isDelete={isDelete.value}
+ />
+ <SaveBtn
+ loc={[180, 50, 120, 170]}
+ index={page * pageCap}
+ emit={emitSave}
+ isDelete={isDelete.value}
+ />
+ <SaveBtn
+ loc={[330, 50, 120, 170]}
+ index={page * pageCap + 1}
+ emit={emitSave}
+ isDelete={isDelete.value}
+ />
+ <SaveBtn
+ loc={[30, 230, 120, 170]}
+ index={page * pageCap + 2}
+ emit={emitSave}
+ isDelete={isDelete.value}
+ />
+ <SaveBtn
+ loc={[180, 230, 120, 170]}
+ index={page * pageCap + 3}
+ emit={emitSave}
+ isDelete={isDelete.value}
+ />
+ <SaveBtn
+ loc={[330, 230, 120, 170]}
+ index={page * pageCap + 4}
+ emit={emitSave}
+ isDelete={isDelete.value}
+ />
+ </container>
+ )}
+ </Page>
+ <text
+ text={'删除模式'}
+ font={new Font('normal', 18)}
+ loc={[30, 450, undefined, undefined, 0, 0]}
+ zIndex={1}
+ fillStyle={isDelete.value ? 'red' : 'white'}
+ onClick={() => {
+ isDelete.value = !isDelete.value;
+ }}
+ />
+ <text
+ text={'返回游戏'}
+ font={new Font('normal', 18)}
+ loc={[450, 450, undefined, undefined, 1, 0]}
+ zIndex={1}
+ onClick={() => emit('exit')}
+ />
+ </container>
+ );
},
saveProps
);
@@ -79,12 +199,17 @@ export function selectSave(
const instance = controller.open(SaveUI, {
loc,
...props,
- onEmit: index => {
+ onEmit: (index: number, isDelete: boolean) => {
+ if (index === -1) return; // 自动存档不能用于保存
+ if (isDelete) {
+ return;
+ }
controller.close(instance);
res(index);
},
onExit: () => {
- res(-1);
+ controller.close(instance);
+ res(-2);
}
});
});
diff --git a/packages-user/client-modules/src/render/ui/toolbar.tsx b/packages-user/client-modules/src/render/ui/toolbar.tsx
index 88affe6..0f733e3 100644
--- a/packages-user/client-modules/src/render/ui/toolbar.tsx
+++ b/packages-user/client-modules/src/render/ui/toolbar.tsx
@@ -21,6 +21,9 @@ import { KeyCode } from '@motajs/client-base';
import { Progress } from '../components/misc';
import { generateBinary } from '@motajs/legacy-common';
import { SetupComponentOptions } from '@motajs/system-ui';
+import { selectSave } from './save';
+import { mainUIController } from '@user/client-modules';
+import { STATUS_BAR_WIDTH, MAP_WIDTH, MAP_HEIGHT } from '../shared';
interface ToolbarProps extends DefaultProps {
loc?: ElementLocator;
@@ -84,7 +87,21 @@ export const PlayingToolbar = defineComponent<
const book = () => core.openBook(true);
const tool = () => core.openToolbox(true);
const fly = () => core.useFly(true);
- const save = () => core.save(true);
+ const save = async () => {
+ const index = await selectSave(mainUIController, [
+ STATUS_BAR_WIDTH,
+ 0,
+ MAP_WIDTH,
+ MAP_HEIGHT
+ ]);
+ if (index === -2) {
+ // 如果用户未选择存档,而是关闭了存档。
+ console.log('用户关闭了存档界面。');
+ } else {
+ // 用户选择了一个存档。
+ console.log('用户选择在存档位' + index + '保存。');
+ }
+ };
const load = () => core.load(true);
const equip = () => core.openEquipbox(true);
const shop = () => core.openQuickShop(true);