Files
wsmud/world/cmd/dialog/shop.js
2026-05-26 16:41:20 +08:00

282 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
this.inherits(COMMAND);
this.command = "shop";
this.allow_busy = true;
this.allow_state = true;
this.allow_die = true;
this.allow_faint = true;
this.regex = /(?:(\w+)\s+(\d+))/;
this.enter = function (me, par, count) {
if (me.query_temp("new")) return me.notify("你先完成新手指导再说。");
if (!me.is_player) return me.notify("你不能购买。");
if (!this.list)
this.load_selllist();
if (count != undefined) {
var item = this.list.get(par);
if (!item) return me.notify("商店不出售这个东西。");
if (item.is_show && item.is_show(me) === false) return me.notify("商店不出售这个东西。");
count = parseInt(count);
if (!(count > 0)) return;
if (item.limit > 0 && me.query_temp(item.limit_key, 0) + count > item.limit) {
return me.notify(item.name + "到达" + (item.limit_time < 3 ?
["本日", '本周', '本月'][item.limit_time] : "") + "购买上限。");
}
if (item.max > 0 && me.query_temp(item.max_key, 0) + count > item.max) {
return me.notify("没有这么多的" + item.name + "出售了。");
}
if (item.on_buy && item.on_buy(me, count) === false) return;
let discount = 1;
if (item.query_discount) discount = item.query_discount(me);
else discount = item.discount ?? 1;
let need_money = 0;
if (item.mtype === 0) {
need_money = item.value * count * 10000;
if (discount < 1) need_money = need_money * discount;
need_money = parseInt(need_money);
if (!(me.money >= need_money)) {
return me.notify("你没有那么多的银两。");
}
me.add_money(-need_money, "购买" + item.name + "");
} else if (item.mtype === 1) {
need_money = item.value * count;
if (discount < 1) need_money = need_money * discount;
need_money = parseInt(need_money);
if (!(me.cash_money >= need_money)) {
return me.notify("你没有那么多的元宝。");
}
me.add_cash(-need_money, "购买" + item.name + "");
} else {
need_money = item.value * count;
if (discount < 1) need_money = need_money * discount;
need_money = parseInt(need_money);
if (!(me.query_temp('my', 0) >= need_money))
return me.notify("你没有那么多的古币。");
me.add_temp('my', -need_money);
}
var obj = me.add_obj(item.path, count);
me.notify("你从商店里购买了" + obj.unit_name(count) + "。");
if (item.limit > 0) {
let val = 0;
if (item.limit_time === 0) {
val = me.add_temp(item.limit_key, count, UTIL.diff_time());
} else if (item.limit_time === 1) {
val = me.add_temp(item.limit_key, count, UTIL.diff_week_time());
} else if (item.limit_time === 2) {
val = me.add_temp(item.limit_key, count, UTIL.diff_month_time());
} else if (item.limit_time > 10000) {
val = me.add_temp(item.limit_key, count, item.limit_time);
}
// me.send(`{"type":"dialog","dialog":"shop",item:["${item.id}",${val}],money:[${me.money},${me.cash_money}]}`);
for (let x of this.list_keys) {
if (x.limit_key === item.limit_key) {
me.send(`{"type":"dialog","dialog":"shop",item:["${x.id}",${Math.min(val, x.limit)}],${format_moneys(me)}}`);
}
}
} else {
me.send(`{"type":"dialog","dialog":"shop",${format_moneys(me)}}`);
}
if (item.max > 0) {
let val = me.add_temp(item.max_key, count);
if (val >= item.max) {
me.send(`{"type":"dialog","dialog":"shop",remove:"${item.id}"}`);
item.on_full && item.on_full(me);
}
}
if (item.mtype === 1 && item.rcash) {
me.add_money(need_money * 10000);
me.notify('你获得' + need_money + '两<hiy>黄金</hiy>。');
}
WORLD.add_recover_obj(me, {
name: obj.unit_name(count),
count: count,
value: need_money,
limit_key: item.limit > 0 ? item.limit_key : null,
max_key: item.max_key,
id: obj.id,
rcash: item.rcash,
path: obj.path
}, 12, item.mtype);
return;
}
if (par && par === this.idx)
return me.send(`{"type":"dialog","dialog":"shop",${format_moneys(me)}}`);
var str = ['{"type":"dialog","dialog":"shop","selllist":['];
for (let i = 0; i < this.groups.length; i++) {
if (i > 0) str.push(',[');
else str.push('[');
for (let item of this.groups[i]) {
if (item.is_show && item.is_show(me) === false) continue;
str.push('["', item.id, '","', item.name, '","', item.desc, '"');
str.push(',', item.value, ',', item.grade, ',');
if (item.query_discount) str.push(item.query_discount(me));
else str.push(item.discount ?? 1);
if (item.limit > 0)
str.push(',', item.limit, ',', me.query_temp(item.limit_key, 0), '');
else if (item.max > 0)
str.push(',', item.max, ',', me.query_temp(item.max_key, 0), '');
str.push('],');
}
str.push('0]');
}
str.push('],', format_moneys(me));
str.push(`,idx:"`, this.idx, `"}`);
me.send(str.join(""));
}
function format_moneys(me) {
return `money:[${me.money},${me.cash_money}]`;
// return `money:[${me.money},${me.cash_money},${me.query_temp('my', 0)}],mtype:"枚<hij>古币</hij>"`;
}
this.list = null;
this.list_keys = null;
this.idx = null;
this.load_selllist = function () {
this.list = new Map();
this.list_keys = [];
this.idx = UTIL.create_id();
for (let i = 0; i < this.groups.length; i++) {
for (let item of this.groups[i]) {
item.mtype = i;
let obj = OBJ.CREATE(item.path);
if (!obj) continue;
item.name = obj.name;
item.unit = obj.unit;
item.grade = obj.grade;
item.id = Object.getPrototypeOf(obj).id + i.toString();
this.list.set(item.id, item);
if (item.limit_key) {
this.list_keys.push(item);
}
}
}
}
//去掉元宝,每周兑换,按月领取,黄金频率降低
function query_age_discount(me) {
var dt = Date.now() - me.reg_time * 60000;
let age = Math.floor(dt / 86400000 / 12);
if (age < 1) age = 1;
else if (age > 10) age = 10;
return age / 10;
}
const start_date = new Date(2026, 1, 15, 0, 0);
const end_date = new Date(2026, 1, 24, 0, 0);
this.groups = [
[
{
name: "<hic>扫荡符</hic>", unit: "张", path: "cash/saodang", grade: 2,
desc: "可以快速完成副本,前提是这个副本你已经解锁相关单人难度的扫荡模式", value: 1,
discount: 0.5,
query_discount: query_age_discount,
limit: 50, limit_time: 0, limit_key: "shp1"
},
{
name: "<hic>天师符</hic>", unit: "张", grade: 3,
path: "cash/tianshifu", desc: "可使你原地复活,不用跑路", value: 5,
query_discount: query_age_discount,
limit: 10, limit_time: 0, limit_key: "shp2"
},
{
name: "<hig>背包扩充</hig>", unit: "块", grade: 1,
path: "cash/pack_add", desc: "使你的背包扩充10格最大100格", value: 128,
limit: 1, limit_time: 1, limit_key: "shp3"
},
{
name: "<hig>仓库扩充</hig>", unit: "块", grade: 1,
path: "cash/ck_add", desc: "使你的仓库扩充10格最大400格", value: 168,
limit: 1, limit_time: 1, limit_key: "shp4"
},
{
name: "<hiy>洗髓丹</hiy>", unit: "颗", grade: 3,
path: "cash/xi", desc: "重置你的先天属性", value: 128,
limit: 5, limit_time: 1, limit_key: "shp5"
},
{
name: "<hic>改名符</hic>", unit: "张", grade: 2,
path: "cash/gaiming", limit: 1, limit_time: 2, limit_key: "shp9",
desc: "更改你的名字", value: 200
},
{
name: "<hio>叛师符</hio>", unit: "张", grade: 5,
path: "cash/tuoli", value: 500,
desc: "重新选择你的门派,会遗忘你当前门派的武功,返还你消耗的潜能(不包括100级前的消耗)",
limit: 3, limit_time: 2, limit_key: "shp6"
},
{
name: "<hio>变性丹</hio>", unit: "颗", grade: 5, value: 500,
path: "cash/bian", desc: "更改性别,会遗忘不符合性别要求的武功,返还你消耗的潜能(不包括100级前的消耗)",
limit: 3, limit_time: 2, limit_key: "shp7",
}
]
, [
{
name: "<hic>扫荡符</hic>", unit: "张", path: "cash/saodang", grade: 2,
desc: "可以快速完成副本,前提是这个副本你已经解锁相关单人难度的扫荡模式", value: 1
},
{
name: "<hic>天师符</hic>", unit: "张", grade: 3,
path: "cash/tianshifu", desc: "可使你原地复活,不用跑路", value: 5
},
{
name: "<hig>背包扩充</hig>", unit: "块", grade: 1,
path: "cash/pack_add", desc: "使你的背包扩充10格最大100格", value: 32
},
{
name: "<hig>仓库扩充</hig>", unit: "块", grade: 1,
path: "cash/ck_add", desc: "使你的仓库扩充10格最大400格", value: 40
},
{
name: "<hiy>洗髓丹</hiy>", unit: "颗", grade: 3,
path: "cash/xi", desc: "重置你的先天属性", value: 80
},
{
name: "<hic>改名符</hic>", unit: "张", grade: 2,
path: "cash/gaiming", desc: "更改你的名字", value: 98
},
{
name: "<hio>叛师符</hio>", unit: "张", grade: 5,
path: "cash/tuoli",
desc: "重新选择你的门派,会遗忘你当前门派的武功,返还你消耗的潜能(不包括100级前的消耗)",
value: 300
},
{
name: "<hio>变性丹</hio>", unit: "颗", grade: 5,
path: "cash/bian", desc: "更改性别,会遗忘不符合性别要求的武功,返还你消耗的潜能(不包括100级前的消耗)",
value: 300
},
{
name: "房契", unit: "颗", grade: 3,
path: "cash/fang", desc: "使用后获得扬州城豪华型住宅,拥有自己的练功房,钓鱼采药的小花园,和管家黄金购买的房子无区别。",
value: 998, max_key: "shpm1", max: 1,
is_show: function (me) {
if (me.query_temp('home', 0) === 2) return false;
if (me.query_bool('gift', 1)) return false;
return true;
},
on_full: function (me) {
me.remove_temp('shpm1');
me.set_bool('gift', 1, true);//gift标志0随从包 1房契 2程灵素
}
}
]
];