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 + '两黄金。');
}
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:"枚古币"`;
}
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: "扫荡符", 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: "天师符", unit: "张", grade: 3,
path: "cash/tianshifu", desc: "可使你原地复活,不用跑路", value: 5,
query_discount: query_age_discount,
limit: 10, limit_time: 0, limit_key: "shp2"
},
{
name: "背包扩充", unit: "块", grade: 1,
path: "cash/pack_add", desc: "使你的背包扩充10格,最大100格", value: 128,
limit: 1, limit_time: 1, limit_key: "shp3"
},
{
name: "仓库扩充", unit: "块", grade: 1,
path: "cash/ck_add", desc: "使你的仓库扩充10格,最大400格", value: 168,
limit: 1, limit_time: 1, limit_key: "shp4"
},
{
name: "洗髓丹", unit: "颗", grade: 3,
path: "cash/xi", desc: "重置你的先天属性", value: 128,
limit: 5, limit_time: 1, limit_key: "shp5"
},
{
name: "改名符", unit: "张", grade: 2,
path: "cash/gaiming", limit: 1, limit_time: 2, limit_key: "shp9",
desc: "更改你的名字", value: 200
},
{
name: "叛师符", unit: "张", grade: 5,
path: "cash/tuoli", value: 500,
desc: "重新选择你的门派,会遗忘你当前门派的武功,返还你消耗的潜能(不包括100级前的消耗)",
limit: 3, limit_time: 2, limit_key: "shp6"
},
{
name: "变性丹", unit: "颗", grade: 5, value: 500,
path: "cash/bian", desc: "更改性别,会遗忘不符合性别要求的武功,返还你消耗的潜能(不包括100级前的消耗)",
limit: 3, limit_time: 2, limit_key: "shp7",
}
]
, [
{
name: "扫荡符", unit: "张", path: "cash/saodang", grade: 2,
desc: "可以快速完成副本,前提是这个副本你已经解锁相关单人难度的扫荡模式", value: 1
},
{
name: "天师符", unit: "张", grade: 3,
path: "cash/tianshifu", desc: "可使你原地复活,不用跑路", value: 5
},
{
name: "背包扩充", unit: "块", grade: 1,
path: "cash/pack_add", desc: "使你的背包扩充10格,最大100格", value: 32
},
{
name: "仓库扩充", unit: "块", grade: 1,
path: "cash/ck_add", desc: "使你的仓库扩充10格,最大400格", value: 40
},
{
name: "洗髓丹", unit: "颗", grade: 3,
path: "cash/xi", desc: "重置你的先天属性", value: 80
},
{
name: "改名符", unit: "张", grade: 2,
path: "cash/gaiming", desc: "更改你的名字", value: 98
},
{
name: "叛师符", unit: "张", grade: 5,
path: "cash/tuoli",
desc: "重新选择你的门派,会遗忘你当前门派的武功,返还你消耗的潜能(不包括100级前的消耗)",
value: 300
},
{
name: "变性丹", 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程灵素
}
}
]
];