kami 发表于 2012-3-23 22:05:47

让NPC出招,CLEO思路讲解开始

自备瓜子板凳。我这就开始了

范例源码:

//-------------MAIN---------------
thread 'SHEN'

:SHEN_11
wait 0
Actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@)
0A3E: unknown_get_actor_in_sphere 4@ 5@ 6@ radius 3.0 3.0 3.0 handle_as 0@
if
056D:   actor 0@ defined
else_jump @SHEN_11
if or
   Actor.Animation(0@) == "FIGHTA_1"
   Actor.Animation(0@) == "FIGHTA_2"
   Actor.Animation(0@) == "FIGHTA_3"
else_jump @SHEN_11
jump @SHEN_137

:SHEN_137
0209: 10@ = random_int_in_ranges 1 2
jump @SHEN_153

:SHEN_153
if
10@ == 1
else_jump @SHEN_291
if
   not Actor.Dead(0@)
else_jump @SHEN_11
04ED: load_animation "YOMI"
0812: AS_actor 0@ perform_animation "ETC1" IFP "YOMI" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB
wait 150
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR
0812: AS_actor $PLAYER_ACTOR perform_animation "KO_SPIN_L" IFP "PED" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB
04EF: release_animation "YOMI"
jump @SHEN_11

:SHEN_291
wait 200
jump @SHEN_11



完结

kami 发表于 2012-3-23 22:07:00

//-------------MAIN---------------
thread 'SHEN'

:SHEN_11
wait 0
Actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@)    (设置主角当前坐标保存为 4 5 6)
0A3E: unknown_get_actor_in_sphere 4@ 5@ 6@ radius 3.0 3.0 3.0 handle_as 0@(在456 坐标周围3米内选取路人存为变量0@)
if
056D:   actor 0@ defined   (如果0@变量是存在的,也就是说角色已经找到并选好了)
else_jump @SHEN_11(不然就返回11,也就是如果没有选到的话)
if or    (重点1)      
   Actor.Animation(0@) == "FIGHTA_1" (如果路人0@施展了以下几种姿势的任意一种,以下的flght_1 2 3等等是普通出拳的三个姿势)
   Actor.Animation(0@) == "FIGHTA_2"
   Actor.Animation(0@) == "FIGHTA_3"
else_jump @SHEN_11(没有施展的话就跳回开头)
jump @SHEN_137   (判断成功,跳到137)

:SHEN_137   (特级重点2)
0209: 10@ = random_int_in_ranges 1 2   (随机安排数字1-2,在这之间随机选择一个结果存储为变量10@,你可以把范围加的更多,比如0209: 10@ = random_int_in_ranges 1 20,就是随机安排数字1-20,这样做的用意是增加更多的变化)
jump @SHEN_153(跳到153)

:SHEN_153
if
10@ == 1       (如果随机数字结果出来是1)
else_jump @SHEN_291   (不然跳到291,也就是说不是1,是其他的,上文因为只有1-2,所以其他的肯定是2,而2我没有设置新变化,直接跳回从头,所以该CLEO只有10@ ==1 才有下文,2为终结)
if
   not Actor.Dead(0@)   (如果0@角色没有死亡,这里再判断一次角色是否死了,后文施展动作需要)
else_jump @SHEN_11
04ED: load_animation "YOMI"   (一切就绪,条件全部达成,读取所需姿势文件,飞雷神的)
0812: AS_actor 0@ perform_animation "ETC1" IFP "YOMI" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB
wait 150    (让0@角色施展攻击动作)
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR   (让0@角色的意志为始终追杀主角,不然0@施展完CLEO设定动作后会放弃之前行为)
0812: AS_actor $PLAYER_ACTOR perform_animation "KO_SPIN_L" IFP "PED" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB   (让玩家施展被攻击动作)
04EF: release_animation "YOMI"   (这个过程完结,为了内存稳定,拆除放进内存里的动作文件)
jump @SHEN_11   (跳回开头)

:SHEN_291(这是之前10@= 2发生的结果,由于随机范围只有1-2两种,我必须留一种为角色不使用技能,所以选择了2)
wait 200    (重点3)   为什么要设置等待200毫秒?因为不设置的话该CLEO会因为过程处理过快,而发生快速的重复使用和判定,那么由于太快,之前使用的随机判断的CLEO新风格写法就失去了意义,角色会不断使用技能攻击玩家,而不是偶尔,这个200建议设置的和角色在 重点1 处使用的动作时间为最佳)
jump @SHEN_11   完结

为主的祥助 发表于 2012-3-23 22:07:17

要不要插一下 不会怀孕{:soso_e146:}

kami 发表于 2012-3-23 22:21:02

0209: 10@ = random_int_in_ranges 1 2

其中这句话其实并没有实际意义,但是又有至关重要的意义。

虽然其没有关乎任何角色任何车辆,但是我们可以把其结果用来设定为多种可以发生的可能。

进而是CLEO实现真正的 随机 ,而不是开发者能够知道下一步该如何发展的傻瓜式CLEO

kami 发表于 2012-3-23 22:23:04

比如你可以设定为
0209: 10@ = random_int_in_ranges 1 5

然后在后文把其中 1 2 3 的可能结果设置为判断没有结果,等待多少毫秒返回

把4设置为 让角色使用飞踢。

把5设置为 让角色使用头撞。

总之要巧妙运用。   因为是随机处理并调用生成的10@这个结果。....
所以你只需要设定你想发生的在其中 数字代表的范围上的可能 即可。
至于10@到底会是什么,系统会随机帮你选一个结果

Mario?Maurer 发表于 2012-3-23 22:24:12

汗……kami說得只微微看懂了些..

kami 发表于 2012-3-23 22:26:13

这是该CLEO的小测试档。

内容和上文一样。

添加好ifp后进入游戏,如果行人使用普通拳击三式的任意一式攻击你。

那么有百分之50的可能会触发行人使用飞雷神斩杀,不过我没有设定给主角减血,这是小技巧,会CLEO的加两个句子即可。

因为0209: 10@ = random_int_in_ranges 1 2   
只有1-2,所以一半被我设置为触发技能,一半设置为触发失败,没有变化,并且等待200毫秒后跳回去重新判断是否触发。

点击进入下载-行人出招.rar

kami 发表于 2012-3-23 22:26:42

青青飘过 发表于 2012-3-23 22:24 static/image/common/back.gif
汗……kami說得只微微看懂了些..

慢慢看,不要急躁,我上了CLEO,你可以边玩边体悟

izzy 发表于 2012-3-23 22:31:24

插楼无罪吧 = =
学习了。。感谢
哈。。感觉蛮简单的
在kami说发教程前,我以为跟读写内存有关= =||| (不懂)

:SHEN_291
wait 200
jump @SHEN_11这语段很经典,真心的说

kami 发表于 2012-3-23 22:33:37

范例源码:

//-------------MAIN---------------
thread 'SHEN'

:SHEN_11
wait 0
Actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@)
0A3E: unknown_get_actor_in_sphere 4@ 5@ 6@ radius 3.0 3.0 3.0 handle_as 0@
if
056D:   actor 0@ defined
else_jump @SHEN_11
if or
   Actor.Animation(0@) == "FIGHTA_1"
   Actor.Animation(0@) == "FIGHTA_2"
   Actor.Animation(0@) == "FIGHTA_3"
else_jump @SHEN_11
jump @SHEN_137

:SHEN_137
0209: 10@ = random_int_in_ranges 1 2
jump @SHEN_153

:SHEN_153
if
10@ == 1
else_jump @SHEN_291
if
   not Actor.Dead(0@)
else_jump @SHEN_11
04ED: load_animation "YOMI"
0812: AS_actor 0@ perform_animation "ETC1" IFP "YOMI" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB
wait 150
05E2: AS_actor 0@ kill_actor $PLAYER_ACTOR
0812: AS_actor $PLAYER_ACTOR perform_animation "KO_SPIN_L" IFP "PED" rate 10.0 loopA 0 lockX 1 lockY 1 lockF 0 time -1 // versionB
04EF: release_animation "YOMI"
jump @SHEN_11

:SHEN_291
if10@ == 2
else_jump @SHEN_11
角色0撞死玩家
玩家被撞死了
jump @SHEN_11





这样应该容易理解些了吧。

我把1-2的两个结果设置为了角色施展两种不同的技能。

不过这样做角色0就是始终在放1或者2这两个技能了,而没有普通进攻的时候了。

所以我在上面使用了2这个结果为等待,并没有任何变化的跳回去,就是这个意思

3DMax 发表于 2012-3-23 22:35:18

原来kami刚刚搞的就是这个啊!

kami 发表于 2012-3-23 22:38:24

这样的CLEO写法可以延伸出无数种风格。

比如选好角色后,然后判断角色外观是哪一个人。

之后设定几种可能性。

设定每种可能性角色在做啥
比如撒尿,吃饭,睡觉,拉屎

只要你设置的多,那么角色就越智能。
当然还是要预留很多个没有发生任何变化的可能,并且要设定等待时间。

这样就做好了一个路人的高智能CLEO了。

如此这般把所有路人的专属CLEO做完

就成了我的CLEO创意之一,众生百态CLEO。

只要你设置的可能范围有多广,后续变化有多完善,那么路人的真实度就更高。

0209: 10@ = random_int_in_ranges 1 65535

哈哈,只要你有耐心设定65535种可能性。

那么该路人肯定已经是真实的人了

kami 发表于 2012-3-23 22:58:41

我开此贴的目地,是希望大家明白随机CLEO的写法。

希望大家能够开发出更多高级类的CLEO,提升SA的NPC的AI程度。

增加更多挑战性极强的对手。

紫夕£夏夜 发表于 2012-3-23 23:02:18

嘿嘿,表示这个教程收益匪浅,准备开始写让人物做动作的CLEO了:lol

祭祀秀忒 发表于 2012-3-23 23:08:40

搬板凳来学习啦= =
页: [1] 2 3
查看完整版本: 让NPC出招,CLEO思路讲解开始