📄 auto_ore.c
字号:
// Written by BBX workgroup
// Release: 2004/6/2
// 功能:回城准备完毕之后自动合成刚玉石
// 说明:当回城准备完毕之后,系统会调用:
// on_post_prepare_for_quest()
// 在该消息处理函数中,首先调用函数 process_ore()
// 选择合适的矿石,然后前往边境城市啊彬处,与啊彬
// 对话,合成刚玉石,重复上面的过程,直至没有合适
// 的矿石可以选择。
//
// 函数:
// int process_ore()
// 用来存放和好的钢玉石,然后取得合适的矿石。
// 先去仓库,取得仓库信息,然后从仓库和包裹中挑选
// 合适的矿石,并从仓库中取出相应矿石。
// 如果成功返回 1,失败返回 0。
//
// 选择矿石的算法:
// 1、将矿石从小到大排列,取纯度最低的10块矿石。
// 2、如果不满足条件,将先前10块矿石中纯度最高的
// 替换为所有矿石中纯度最高的。
// 3、如果仍不满足条件,继续将纯度次高的替换为所有
// 矿石中纯度次高的。
// 4、依次循环。
// 取得矿物的品质,四舍五入
#define GET_QUAL(x) (((x) + 500) / 1000)
#define ORE_NAME "钢玉矿石"
// 从仓库和包裹里选择合适的矿石
int process_ore()
{
int i, j;
int quality;
int total_num;
int total_quality;
array ore_list;
mapping my = me();
mapping mc;
mapping ob;
mapping npc;
total_num = 0;
total_quality = 0;
// 取得包裹信息
mc = my["carry"];
// 分配数组,存放所有钢玉矿石的信息
ore_list = allocate_array(sizeof(my_storage_info) + sizeof(mc));
// 靠近仓库管理员,取得 npc 信息
close_to_npc("storer", &npc);
// 尝试将身上的矿物存入仓库
for (i = sizeof(mc) - 1; i >= 0; i--)
{
ob = mc[i];
if (ob["item_class"] == ITEM_MINE)
{
// 如果物品类型是矿物
if (get_mine_treatment(ob) == ITEM_STORED)
// 该矿物的处理方式是 存 ,存入仓库
store(-i, npc);
continue;
}
}
// 取得仓库内物品信息
get_storage_info(npc, storage_password);
if (! is_array(my_storage_info))
// 如果没有取到,设置为空
my_storage_info = ({ });
// 获得仓库内钢玉矿石的信息
for ( i = 0; i < sizeof(my_storage_info); i++)
{
if (! is_mapping(ob = my_storage_info[i]))
continue;
if (ob["name"] == ORE_NAME)
{
ore_list[total_num++] = ob;
total_quality += GET_QUAL(ob["quality"]);
}
}
// 刷新包裹
refresh_inv();
while (! is_mapping(my = me()) || ! my["got_inventory"])
sleep(1);
// 获得包裹内内钢玉矿石的信息
mc = my["carry"];
for ( i = 0; i < sizeof(mc); i++)
{
if (! is_mapping(ob = mc[i]))
continue;
if (ob["name"] == ORE_NAME)
{
ore_list[total_num++] = ob;
total_quality += GET_QUAL(ob["quality"]);
}
}
if (total_num < 10 || total_quality < 100)
// 如果矿石数目少于 10 或者 总纯度少于 100,返回 */
return 0;
// 将钢玉矿石数组从小到大排序
for (i = 0; i < total_num - 1; i++)
{
for (j = total_num - 1; j > i; j--)
{
if (ore_list[j]["quality"] < ore_list[j - 1]["quality"])
{
ob = ore_list[j];
ore_list[j] = ore_list[j - 1];
ore_list[j - 1] = ob;
}
}
}
// 调试信息
printf("After sort (%d):\n", total_num);
for (i = 0; i < total_num; i++)
printf(" %d ", GET_QUAL(ore_list[i]["quality"]));
printf("\n");
quality = 0;
// 计算纯度最低的10块钢玉石的纯度总和
for (i = 0; i < 10; i++)
{
quality += GET_QUAL(ore_list[i]["quality"]);
// 标记将要使用该块矿石
ore_list[i]["will_use"] = 1;
}
// 将先前10块矿石中纯度最高的替换为所有矿石中纯度最高的
// 如果仍不满足条件,继续将纯度次高的替换为所有矿石中纯度次高的
// 依次循环
for (i = 9, j = 0; i >= 0; i--, j++)
{
if (quality >= 100)
break;
quality -= GET_QUAL(ore_list[i]["quality"]);
ore_list[i]["will_use"] = 0;
while (1)
{
if (quality + GET_QUAL(ore_list[total_num - 1 - j]["quality"]) <= 100)
break;
else
if (quality + GET_QUAL(ore_list[total_num - 1 - j]["quality"]) >= 100 &&
quality + GET_QUAL(ore_list[total_num - 1 - j - 1]["quality"]) < 100)
break;
else
j++;
}
// 调试信息
printf("Replace i %d with %d \n", i, total_num - 1 - j);
quality += GET_QUAL(ore_list[total_num - 1 - j]["quality"]);
ore_list[total_num - 1 - j]["will_use"] = 1;
// 调试信息
printf("Selected ore (%d):\n", quality);
for (m = 0; m < total_num; m++)
if (ore_list[m]["will_use"])
printf(" %d ", GET_QUAL(ore_list[m]["quality"]));
printf("\n");
}
if (quality < 100)
// 没有找到合适的钢玉矿石
return 0;
// 从仓库中取出相应的矿石
for (i = 0, j = 0; i < total_num; i++)
{
if (ore_list[i]["will_use"])
{
take(ore_list[i]["id"], 1, npc);
// 等待操作完成
clear_command();
}
}
return 1;
}
//回城准备完毕之后自动合成刚玉石
int on_post_prepare_for_quest()
{
tell_user("开始自动合成钢玉矿石");
do
{
// 选择合适的矿石
if (! process_ore())
{
// 没有合适的矿石
tell_user("没有合适的矿石");
return 0;
}
if (! goto_city_ex("边境城市", 0, 0, 6) ||
! run_close_to(422, 262, 6))
{
// 前往边境城市阿彬处失败(尝试6次)
tell_user("靠近啊彬失败");
return 0;
}
// 与啊彬对话
talk_to("啊彬");
talk_to("啊彬", "制作钢玉石");
talk_to("啊彬", "收集完所需材料");
talk_to("啊彬", "关闭");
} while (1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -