4.4 第二个实用范例
输入以下代码:
mixed on_char_appear(mapping ob)
{
if (ob["type"] == OBJECT_TYPE_MONSTER)
printf("Monster %s is appeared, at %d, %d.\n", ob["name"],
ob["x"], ob["y"]);
else
if (ob["type"] == OBJECT_TYPE_CHAR)
printf("Player %s is appeared, at %d, %d.\n", ob["name"],
ob["x"], ob["y"]);
}
mixed on_item_appear(mapping ob)
{
printf("Item %s is appeared at %d, %d\n", ob["name"], ob["x"], ob["y"]);
}
加载以后在游戏中走动一会儿,注意一下调试窗口出现的信息
Appendix A. ACI 使用的一些全局变量
all_objects - mapping,保存可视范围内所有的人物,怪物,NPC,id 为关键字。
brief_index - int, 该场景的逻辑图,零表示没有逻辑图
zone - string, 该场景的地图名字
Appendix B. 关于一般对象和“我”的数据组织
// “我”,等效于 all_objects[my_id()]
mapping me()
// 我的 id,等效于 me()["id"]
int my_id()
普通对象和 me() 这个对象包含以下数据:
"name" - 名字
"id" - 代号
"type" - 类型,包括:OBJECT_TYPE_MONSTER/OBJECT_TYPE_CHAR/
- OBJECT_TYPE_NPC/OBJECT_TYPE_ITEM
"x" - 横坐标
"y" - 纵坐标
me() 这个对象还包括以下数据
"equip" - mapping,包括了身上所有的装备,关键字为装备的序号
"carry" - array,包括了身上所有的物品,序号从 0 - n
"life" - 当前血值
"max_life" - 最大血值
"mana" - 当前蓝值
"max_mana" - 最大蓝值
Appendix C. ACI 提供的游戏常用函数
// 转向,direction 表明了方向,0 - 360 度,0 表示北,45 表示东北,
// 90 表示东,以此类推
int face(int direction)
// 走路到某坐标,返回 1 表示成功抵达,0 表示被中断
int walk_to(int x, int y)
// 走路到某坐标附近,返回 1 表示成功抵达,0 表示被中断
int walk_close_to(int x, int y, int distance)
// 跑步到某坐标,返回 1 表示成功抵达,0 表示被中断
int run_to(int x, int y)
// 跑步到某坐标附近,返回 1 表示成功抵达,0 表示被中断
int run_close_to(int x, int y, int distance)
// 使用异形换位到每个坐标处,返回 1 表示成功抵达,0 表示失败
int fly_to(int x, int y)
// 上马
void ride()
// 下马
void unride()
// 使用魔法,object_id 可以是对象 ID,或对象,或对象名字,magic 是
// 魔法名字,返回 1 表示成功,0 表示失败
int cast(mixed object_id, mixed magic);
// 使用魔法并自动选择所需要的符具药粉,参数参见 cast
int casti(mixed object_id, mixed magic);
// 物理攻击某个对象,object_id 参见 cast,注意,必须和对象相邻使用
// 该命令才可能有效果,返回 1 表示成功,0 表示失败
int hit(mixed object_id)
// 使用物品,如药品等,item 可以使物品对象 id,或物品对象,如果 item
// 为零或负数,那么表示是物品在包裹中的序号
int apply(mixed item)
// 丢弃物品,参数 item 参见 apply
int drop(mixed item)
// 拾取物品,注意,人必须站在物品上面,x, y 即自己的坐标
void get_at(int x, int y)
// 和 npc 开始对话,npc 可以是名字或者是 NPC 对象
// 返回 1 表示成功,返回 0 表示失败
int talk_to(mixed npc)
// 和 npc 对话,选择 msg 的条目,msg 可以是动作如"@buy",也可以
// 是部分文字,比如"购买"
int talk_to(mixed npc, string msg)
// 和 npc 对话,选择 msg 的条目,并输入额外信息,如密码,npc 要求的
// 其他信息等
int talk_to(mixed npc, string msg, string extra)
// 刷新 npc 所出售的物品,item_name 是物品的名字,如果为 0 或负数表示
// 是 npc 所出售物品的序号,page 表示刷新第几页,要刷新第一页则是 0
int show_inv(mixed item_name, int page)
// 购买 npc 所出售的物品,必须刷新所出售的物品以后方可使用
// item 是物品对象 id,或者物品的名字,如果 item 为负数则表示刷新页面
// 中的物品的序号
// amount 是购买的数量,如果是不可合并的物品则应该为 1
// from_npc 是 npc 的名字或对象 id,或对象
// 返回 1 表示成功,返回 0 表示失败,失败可能是超重或金钱不足
int buy(mixed item, mixed amount, mixed from_npc)
// 售出包裹中的物品
// item 参见 apply,amount 表示数量,to_npc 参见 buy
// 返回 1 表示成功,返回 0 表示失败
int sell(mixed item, mixed amount, mixed to_npc)
// 修理包裹中的物品
// 参数说明参见 sell
// 返回 1 表示成功,返回 0 表示失败
int repair(mixed item, mixed by_npc)
// 保存包裹中的物品
// 参数说明参见 sell
// 返回 1 表示成功,返回 0 表示失败
int store(mixed item, mixed amount, mixed to_npc)
// 取出仓库的物品
// item 表示物品对象 id,或物品对象,如果 item 为零或负数,则表示物品
// 在仓库中的序号
// amount 表示物品的数量,如果是不可合并的物品,amount 为 1
// from_npc 表示仓库保管员,可以是 npc 的对象 id,或 npc 对象,或 npc
// 的名字
int take(mixed item, mixed amount, mixed from_npc)
// 装备物品
// item 参见 apply,to_pos 表示装备到身上那个位置,如果没有第二个参数
// 表示让系统自动判断合时的位置
int equip(mixed item, mixed to_pos)
// 卸下物品
// item 表示身上物品对象 id,或物品对象,或物品的名字,如果是零或负数
// 表示物品的序号
int unequip(mixed item)
// 说话
void say(string msg)
// 呐喊
void shout(string msg)
// 密语
// to_who 是密语对象的名字
void tell(string to_who, string msg)
// 段落密语
// to_who 是密语对象的名字
// msgs 是一段文字,用 "\n" 分开,系统会自动逐条告知对方
void tell_msgs(string to_who, string msgs)
// 小组聊天
void league(string msg)
// 行会聊天
void party(string msg)
// 更换攻击方式
// mode 表示攻击方式,即游戏中的文字,如 "[和平攻击方式]"
void change_attack_mode(string mode)
// 更换宝宝的工作方式
// 只有两种工作方式可以选择,PET_PEACE_MODE,PET_ATTACK_MODE
void change_pet_mode(string mode)
Appendix D. ACI 提供的其他控制函数
// 返回城市,停止练功
void back()
// 靠近某个 NPC
// type 取值: "storer" - 仓库
// "weapon" - 武器
// "armor" - 防具
// "jewelry" - 首饰
// "potion" - 药水
// "item" - 物品
// "book" - 书籍
// "boot" - 鞋具
// 如果成功到达 NPC 附近,返回 1,同时 the_npc 被设置为该 NPC
int close_to_npc(mixed type, mixed &the_npc)
// 取物品对象
// name_id 可以是身上(包括装备)任何一个物品的 id 或名字
// 返回 0 表示无此物品
mixed get_item_of_me(mixed name_id);
// 取包裹中的物品对象
// name_id 可以是包裹中的物品名字,对象 id,如果 name_id 是零或负数
// 表示包裹中物品的序号
mixed get_item(mixed name_id)
// 取包裹中的物品对象的 id
// name_id 参见 get_item
int get_item_id(mixed name_id)
// 取包裹中的物品对象在包裹中的序号
// name_id 参见 get_item
// 返回值是零或正数表示序号,返回 -1 表示没有找到该物品
int get_item_index(mixed name_id)
// 取包裹中的物品对象的数量
// name_id 参见 get_item
// 返回值是正数表示数量,返回 0 表示并无该物品
int get_item_amount(mixed name_id)
// 统计包裹中不可合并物品(如符具)的总数量
// name_id 是物品的名字
// 返回值是 0 或正数
int count_item_amount(string name)
// 取仓库中物品的序号
// name_id 可以是仓库物品的物品名字,对象 id
// 返回 0 或正数表示仓库中物品的序号,返回 -1 表示并无该物品
// 注意,必须首先和 npc 对话,打开仓库才能使用这个函数
int get_store_item_index(mixed name_id)
// 取仓库中物品的数量
// name_id 参见 get_store_item_index,如果 name_id 为零或负数表示
// 仓库中的物品序号
// 返回值是正数表示数量,返回 0 表示并无该物品
// 注意,必须首先和 npc 对话,打开仓库才能使用这个函数
int get_store_item_amount(mixed name_id)
// 前往某地,如果 x, y 为零表示到达指定城市即可
int goto_city(string to_city, int x, int y)
// 练功中,包括练级,挖矿,摆摊
int is_doing_quest()
// 边跑边打中
int is_in_job()
// 边跑边打至某地,如果 x, y 为零表示到达指定城市即可
void run_with_fight(string to_city, int x, int y)
// 开始练功,包括练级,挖矿,摆摊
// 如果输入了非零参数,则表示从头检测状态并开始练功,如果没
// 有参数或者输入零参数,表示从上次停止时继续
void start_quest(mixed reset)
// 停止边跑边打
void stop_job()
// 停止练功,包括练级,挖矿,摆摊
void stop_quest()
Appendix E. ACI 支持的消息接口函数
// 获得战斗经验/武器经验
void on_acquire_exp(int got_exp, int weapon_exp)
{
}
// 成功使用了和一个物品
void on_applied_item(mapping item)
{
}
// 被攻击
void on_attack_by(mapping attacker, int damaged)
{
}
// 他人攻击信息
void on_attack_info(mapping attacker, mapping victim, int damaged)
{
}
// 当踩到了一个物品时,判断该物品是否需要拾取,返回 -1 表示不需要拾
// 取,返回 0 表示采用原先的判断流程
int on_auto_get(mapping ob)
{
return 0;
}
// 包裹里的物品数量刷新了
void on_carried_updated(mapping item, int amount)
{
}
// 人物出现
void on_char_appear(mapping ob)
{
}
// 人物死亡
void on_char_died(mapping ob)
{
}
// 人物消失(离开视野)
void on_char_disappeared(mapping ob)
{
}
// 你进入了游戏
void on_enter_world()
{
}
// 你进入了某个区域
void on_enter_zone()
{
}
// 前往练功地点
// 如果定义了这个函数,则系统自动采用这个函数前往练功地点
// 返回 0 表示采用预定的流程前往练功地点,返回 -1 表示无法前
// 往练功地点,返回 1 表示成功到达了练功地点
int on_go_to_pz(string rzone, int x, int y)
{
return 0;
}
// 物品出现
void on_item_appear(mapping item)
{
}
// 物品消失(离开视野)
void on_item_disappeared(mapping item)
{
}
// 加入了小组,返回非零表示不理会,返回 0 表示采用原先的处理流程
int on_join_team(string member_leader, mapping members)
{
return 0;
}
// 你离开了游戏
void on_leave_world()
{
}
// 怪物消失了(离开视野)
void on_monster_disappeared(mapping ob)
{
}
// 获得了新物品
void on_new_carried(mapping item)
{
}