一、地图声明与规则标记(MapInfo.txt)
魔王岭地图号固定 K004,在 Mir200\Envir\MapInfo.txt 加一行:
[K004 魔王岭] NORECONNECT(0159) MISSION NOCALLHERO NORECALL NOGUILDRECALL NODEARRECALL NOMasterRECALL NORANDOMMOVE RUNHUMAN
NORECONNECT(0159) 掉线回 0159;MISSION 标记为任务地图;NOCALLHERO 禁召英雄;NORECALL 禁记忆回城;NORANDOMMOVE 禁随机卷;RUNHUMAN 允许人物跑动。地图文件 Mir200\Map\K004.map 必须存在,尺寸与 FINDMAPPATH 坐标匹配。
二、脚本存放路径与文件分工
主 NPC 脚本:Mir200\Envir\QuestDiary\魔王岭\Main.txt(NPC 对话、摆放弓手、领奖)
刷怪名库:Mir200\Envir\QuestDiary\魔王岭\刷怪.txt(每行一个怪物名,GetRandomName 随机抽)
触发链路:NPC [@main] → [@首次寻路] → [@刷怪](DelayGoto 循环)→ [@出怪]/MOBPLACE → 弓手击杀计数 → [@位置]/[@使用]/[@移动]/[@领]
改完 M2 → 控制 → 重读 NPC 脚本,不重启全服。
三、核心变量分工(M 系列临时变量)
M20 = 总刷怪数(写59实际刷60只)
M21 = 每波刷怪数(如 5 / 20)
M22 = 已刷怪计数
M23 = 当前波次序号
M24 = 正在刷怪波数(M22 ÷ M21 整除值)
M30 = 人物击杀计数(弓手杀怪累加)
M1 = 任务中止标记(=0 时刷怪循环 break)
S1 = GetRandomName 抽到的怪物名(字符型)
变量全用 M/S,不下线保存,单局任务隔离;别用 G/A 全局变量否则多玩家串数据。
四、NPC 主对话与首次寻路([@main] / [@首次寻路])
[@main]
赶快召唤出弓箭手,盗走天关宝物的怪物就要出现了!\
拦截逃离的怪物,夺回被盗的宝物!\
每次用5个弩牌换取弓箭手,都需要付出一张灵符哦\
请<摆放第一个弓箭手/@首次寻路>\
<移动弓箭手/@移动> <领奖/@领> <规则/@查看> <回城/@返回>\
[@首次寻路]
#IF
FINDMAPPATH k004 29 23 58 43
#ACT
MOV M20 59
MOV M21 20
MOV M22 0
MOV M23 0
MOV M24 0
MOV M30 0
DELAYGOTO 2000 @刷怪
CLOSE
#ELSESAY
无法到达终点!
FINDMAPPATH 地图 起点X 起点Y 终点X 终点Y:校验出怪路径可达,仅在首次触发生效;不通则走 #ELSESAY。DELAYGOTO 2000 = 2 秒后进刷怪循环。
五、刷怪循环([@刷怪] 核心)
[@刷怪]
#IF
EQUAL M1 0
#ACT
BREAK
#IF
CHECKMAPNAME Self K004
#ELSEACT
BREAK
#IF
LARGE M22 M20
#ACT
BREAK
#IF
EQUAL M23 M24
#ACT
INC M23 1
GETRANDOMNAME ..\QuestDiary\魔王岭\刷怪.txt S1
#IF
CHECKRANGEMONCOUNT K004 29 23 0 = 0
#ACT
PARAM1 29
PARAM2 23
PARAM3 1
MOBPLACE <$STR(S1)>
INC M22 1
DIV M24 <$STR(M22)> <$STR(M21)>
DELAYGOTO 2000 @刷怪
#ELSEACT
DELAYGOTO 1000 @刷怪
执行顺序:M1=0 中止 → 人物离开 K004 中止 → 已刷数 ≥ 总数中止 → 波次切换抽新怪名 → 出怪点(29,23)无怪则 MOBPLACE 刷一只 → M22+1 → M24=整除波次 → 2 秒后递归;有怪则 1 秒后重试。CHECKRANGEMONCOUNT 地图 X Y 范围 数量 判定出怪点占用。
六、弓手摆放 / 移动 / 换取(弩牌+灵符逻辑)
摆放位用地图坐标硬写,例 1 号位 (51,43)、9 号位 (48,47)、8 号位 (45,51):
[@32110号]
#IF
CHECKMAPMOBCOUNT K004 51 43 弓箭手1 > 0
#ACT
MESSAGEBOX 该位置已有弓箭手
#ELSEACT
TAKE 弩牌 5
TAKE 灵符 1
MOVEMOBTO 弓箭手1 K004 <$STR(M10)> <$STR(M11)> K004 51 43
CLOSE
MOVEMOBTO 怪物名 源地图 源X 源Y 目标地图 目标X 目标Y:把已存在的“弓箭手1”从暂存位移到指定格。换弓手扣 5 弩牌 + 1 灵符;纯移动扣 1 弩牌;CHECKMAPMOBCOUNT 防重叠。弓手实体名在 Monster.DB 加“弓箭手1…弓箭手6”,Appr 指向武器弓箭手动作帧。
七、击杀计数与奖励结算([@领])
QF 里挂击杀触发,弓手杀怪算人物拦截数:
[@KillMonInMap_K004]
#IF
CHECKMAPNAME Self K004
#ACT
INC M30 1
SAVEVAR HUMAN 拦截数 <$STR(M30)> ..\QuestDiary\魔王岭\个人数据.txt
领奖按 M30 分段:
[@领]
#IF
LARGE M30 46
#ACT
GIVE 银宝箱 1
SENDMSG 6 拦截47-49只,获银宝箱!
#ELSEIF
LARGE M30 40
#ACT
GIVE 铜宝箱 1
SENDMSG 6 拦截41-46只,获铜宝箱!
#ELSEIF
LARGE M30 0
#ACT
GIVE 木宝箱 1
SENDMSG 6 拦截少于41只,获木宝箱!
#ELSE
#ACT
MESSAGEBOX 未拦截到任何怪物
拦截越多宝箱越高,0 逃怪可加额外大奖(在 M30 = M20 时判)。
八、刷怪名库格式(刷怪.txt)
白野猪
红野猪
黑野猪
角蝇
蛆
祖玛卫士
祖玛弓箭手
魔龙射手
GETRANDOMNAME 按行随机取一行写入 S1,MOBPLACE 直接用 S1 名字刷怪;要分阶段难度就建 魔王小怪.txt / 魔王中怪.txt / 魔王大怪.txt,在 [@刷怪] 里用 SMALL M22 10 / 35 / 40 分段抽不同文件。
九、IGE / GEE / HERO 差异点
• FINDMAPPATH、GETRANDOMNAME、MOBPLACE、MOVEMOBTO、CHECKRANGEMONCOUNT 在 IGE / GEE 原生支持;老 HERO 无 FINDMAPPATH,用 MAPMOVE 强传替代路径校验。
- IGE 的 MOBPLACE 支持 PARAM1/2/3 出怪坐标参数;老 BLUE 需写 MOBPLACE 怪物名 地图 X Y 全参。
• 弓手实体必须进 Monster.DB 且 StdMode 正常,否则 MOBPLACE 刷出透明怪不攻击。
- 多人在同 K004 会共享 M 变量串数据,正经做法每人独立子地图 K004-1 / K004-2 或用 HUMAN 自定义变量替代 M 系列。
十、常见坏象定位
• 点摆放不刷弓手:弩牌/灵符不足、CHECKMAPMOBCOUNT 坐标错、Monster.DB 无“弓手1”
- 刷怪只刷一种:M23=M24 分支没 INC M23,或刷怪.txt 只有一行
• 怪刷在墙里不动:29,23 非可站立格,MapInfo 阻挡层与坐标不符
• 离开地图还在刷:CHECKMAPNAME Self K004 写成 CHECKMAPNAME K004(缺 Self)
- 领奖计数 0:QF 杀怪触发标签名错(IGE 用 @KillMonInMap_K004,非 @KillMon)
• 重读脚本不生效:NPC 在 MapQuest_def 而非 QuestDiary,路径放错目录
整套魔王岭链路:MapInfo 标 K004 → QuestDiary\魔王岭\Main.txt 写 [@main]/[@首次寻路]/[@刷怪]/[@领] → 刷怪.txt 备怪名 → Monster.DB 加弓手实体 → QF 挂击杀计数 → M2 重读 NPC 脚本 → 进图 5 弩牌+1 灵符换弓手 → FINDMAPPATH 起刷 → MOBPLACE 出怪 → 弓手拦截 → M30 结算宝箱。任一层坐标、变量、实体名、标签名错位即不刷怪或领不到奖。

