mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-10-30 19:12:57 +08:00
198 lines
6.7 KiB
TypeScript
198 lines
6.7 KiB
TypeScript
// @ts-nocheck
|
|
|
|
type Shop = CommonShopEvent | CommonEventShopEvent | ItemShopEvent;
|
|
|
|
export function openShop(shopId: string, noRoute: boolean) {
|
|
const shop = core.status.shops[shopId] as Shop;
|
|
// Step 1: 检查能否打开此商店
|
|
if (!canOpenShop(shopId)) {
|
|
core.drawTip('该商店尚未开启');
|
|
return false;
|
|
}
|
|
|
|
if (!noRoute) {
|
|
core.status.route.push(`openShop:${shopId}`);
|
|
}
|
|
|
|
// Step2: 检查公共事件商店
|
|
if (shop.commonEvent) {
|
|
core.insertCommonEvent(shop.commonEvent, shop.args);
|
|
return;
|
|
}
|
|
|
|
// Step 3: 检查道具商店
|
|
if (shop.item) {
|
|
Mota.r(() => {
|
|
if (!core.isReplaying()) {
|
|
Mota.require('@motajs/legacy-ui').mainUi.open('shop', {
|
|
shopId: shopId
|
|
});
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Step4 普通商店
|
|
core.insertAction(convertShop(shop));
|
|
return true;
|
|
}
|
|
|
|
/// 是否访问过某个快捷商店
|
|
export function isShopVisited(id: string) {
|
|
flags.__shops__ ??= {};
|
|
const shops = core.getFlag<any>('__shops__');
|
|
if (!shops[id]) shops[id] = {};
|
|
return shops[id].visited;
|
|
}
|
|
|
|
/// 当前应当显示的快捷商店列表
|
|
export function listShopIds() {
|
|
return Object.keys(core.status.shops).filter(id => {
|
|
// @ts-expect-error 无法推导
|
|
return isShopVisited(id) || !core.status.shops[id].mustEnable;
|
|
});
|
|
}
|
|
|
|
/// 是否能够打开某个商店
|
|
export function canOpenShop(id: string) {
|
|
if (isShopVisited(id)) return true;
|
|
const shop = core.status.shops[id];
|
|
// @ts-expect-error 无法推导
|
|
if (shop.item || shop.commonEvent || shop.mustEnable) return false;
|
|
return true;
|
|
}
|
|
|
|
/// 启用或禁用某个快捷商店
|
|
export function setShopVisited(id: string, visited: boolean) {
|
|
if (!core.hasFlag('__shops__')) core.setFlag('__shops__', {});
|
|
const shops = core.getFlag<any>('__shops__');
|
|
if (!shops[id]) shops[id] = {};
|
|
if (visited) shops[id].visited = true;
|
|
else delete shops[id].visited;
|
|
}
|
|
|
|
/// 能否使用快捷商店
|
|
export function canUseQuickShop() {
|
|
// 如果返回一个字符串,表示不能,字符串为不能使用的提示
|
|
// 返回null代表可以使用
|
|
|
|
// 检查当前楼层的canUseQuickShop选项是否为false
|
|
if (core.status.thisMap.canUseQuickShop === false)
|
|
return '当前楼层不能使用快捷商店。';
|
|
return null;
|
|
}
|
|
|
|
////// 将一个全局商店转变成可预览的公共事件 //////
|
|
function convertShop(shop): MotaEvent {
|
|
return [
|
|
{
|
|
type: 'function',
|
|
function: "function() {core.addFlag('@temp@shop', 1);}"
|
|
},
|
|
{
|
|
type: 'while',
|
|
condition: 'true',
|
|
data: [
|
|
// 检测能否访问该商店
|
|
{
|
|
type: 'if',
|
|
condition:
|
|
"Mota.require('@user/legacy-plugin-data').isShopVisited('" +
|
|
shop.id +
|
|
"')",
|
|
true: [
|
|
// 可以访问,直接插入执行效果
|
|
{
|
|
type: 'function',
|
|
function:
|
|
"function() { Mota.require('@user/legacy-plugin-data').convertShop_replaceChoices('" +
|
|
shop.id +
|
|
"', false) }"
|
|
}
|
|
],
|
|
false: [
|
|
// 不能访问的情况下:检测能否预览
|
|
{
|
|
type: 'if',
|
|
condition: shop.disablePreview,
|
|
true: [
|
|
// 不可预览,提示并退出
|
|
{ type: 'playSound', name: '操作失败' },
|
|
'当前无法访问该商店!',
|
|
{ type: 'break' }
|
|
],
|
|
false: [
|
|
// 可以预览:将商店全部内容进行替换
|
|
{
|
|
type: 'tip',
|
|
text: '当前处于预览模式,不可购买'
|
|
},
|
|
{
|
|
type: 'function',
|
|
function:
|
|
"function() { Mota.require('@user/legacy-plugin-data').convertShop_replaceChoices('" +
|
|
shop.id +
|
|
"', true) }"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
type: 'function',
|
|
function: "function() {core.addFlag('@temp@shop', -1);}"
|
|
}
|
|
];
|
|
}
|
|
|
|
export function convertShop_replaceChoices(shopId, previewMode) {
|
|
const shop = core.status.shops[shopId];
|
|
const choices = (shop.choices || [])
|
|
.filter(function (choice) {
|
|
if (choice.condition == null || choice.condition == '') return true;
|
|
try {
|
|
return core.calValue(choice.condition);
|
|
} catch (e) {
|
|
return true;
|
|
}
|
|
})
|
|
.map(function (choice) {
|
|
const ableToBuy = core.calValue(choice.need);
|
|
return {
|
|
text: choice.text,
|
|
icon: choice.icon,
|
|
color:
|
|
ableToBuy && !previewMode
|
|
? choice.color
|
|
: [153, 153, 153, 1],
|
|
action:
|
|
ableToBuy && !previewMode
|
|
? [{ type: 'playSound', name: '商店' }].concat(
|
|
choice.action
|
|
)
|
|
: [
|
|
{ type: 'playSound', name: '操作失败' },
|
|
{
|
|
type: 'tip',
|
|
text: previewMode
|
|
? '预览模式下不可购买'
|
|
: '购买条件不足'
|
|
}
|
|
]
|
|
};
|
|
})
|
|
.concat({
|
|
text: '离开',
|
|
action: [{ type: 'playSound', name: '取消' }, { type: 'break' }]
|
|
});
|
|
|
|
let text = shop.text.trim();
|
|
if (text.startsWith('[')) {
|
|
const end = text.indexOf(']');
|
|
text = text.slice(end + 1);
|
|
}
|
|
core.insertAction({ type: 'choices', text: text, choices: choices });
|
|
}
|