当前位置:首页 » 网页前端 » 什么叫ai脚本
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

什么叫ai脚本

发布时间: 2022-10-17 12:02:45

⑴ 如何在游戏机制中使用AI/剧情脚本

首先要说的是,并不是说AI,剧情逻辑必须非脚本语言不可,用C++也可以写,甚至更习惯一些。但是脚本语言有脚本语言的长处,动态类型以及相当人性化的数据构造方式,特别是LUA中的表类型,似乎比较擅长描述这种复杂的AI/剧情结构。当然,为了验证自己的想法,我也写了4K的LUA代码,结果觉得该脚本语言相当不容易构造简洁的内容。AI从高自低的分别是计划,状态机,模式。我不知道这种划分是基于何种角度,但是我个人的理解是状态机最高,模式作为某个状态下的某个决策所预定义的动作序列,而计划,是为了实现某个目标的一组步骤的组合。那么硬编码的游戏循环何时调用脚本?答案是,游戏循环执行到调度NPC的AI函数的时候,该AI函数就不再做任何硬编码,而只是简单的dostring("gameEntitys[npc](/"update/")")。就是这么简单,将所有的AI/剧情放置到脚本中。那么,LUA中gameEntitys[npc]("update")是什么意思?简单的说,gameEntitys是一个存储所有NPC的注册表,gameEntitys[npc]将取得该npc的FMS函数,然后给该函数发送update消息告知npc当前的状态进行例行更新。FMS函数对于每一个对象是唯一的,那么比如某一类对象有共同的AI/剧情,那么该类的每一个对象同用同样的FMS函数的话,成员变量如何维持?要知道在LUA中模拟类还是比较麻烦的。答案是upvalue,也就是所有的对象使用同样的函数来生成自身的FMS,该函数就是FMS_Creator(all_state,init_state)。在C++编码中,NPC对象完成构造之后,就调用LUA载入对应的状态机/剧情脚本,然后调用FMS_Creator为自己创建FMS函数:dofile("npc_ai.lua")--引入all_state,init_stategameEntitys[npc]=FMS_Creator(all_state,init_state)当然,NPC析构之后,你也要释放LUA为你分配的资源gameEntitys[npc]=nil已经大概说明了如何在C++中启动NPC的LUA逻辑代码了,那么如何在LUA中编写状态机呢?答案是表。每个表代表一个状态,该表下的key表示该状态接受的消息,key对应的值表示该状态接受到key所表示的消息后要执行的决策,包括相应的动作和可能的状态变迁。看代码吧,最直观的表述:state={name="attack",--状态名enter={--进入该状态要执行,属于状态的消息--func是函数,param是参数,sucess,unsucess是func执行结果所对应的状态转移{func=print,param="openfire"},{func=IsEnemyDie,sucess="cure"},}update={}--同enter,不过用于状态在每一帧的更新exit={}--同enter,不过用于状态在每一帧的更新other_msg={}--同enter,用于表示该状态所接受的其他消息,可以有多个}在LUA中就是可以如此直观的表示每一个状态,其响应的消息以及函数。然后构造该npc接受的状态集合:all_state={}all_state[state.name]=stateinit_state=state这样子,就能传递到FMS_Creator中创建出自己独一无二的状态机函数了。那么剧情脚本呢?其实描述了状态机,剧情脚本是否已经有点眉头了呢?剧情,即为计划,每一个计划由一系列步骤所组成。类似的,对应每个计划的执行会有一个plan()函数,且为了达到独立效果,该函数将会由plan_creator(all_step,first_step)生成。看参数,显然计划的步骤step就是类似于状态的表,不过key方面略有不同,看代码就明白:step={name="findbill",cond={--执行该步骤的前提条件--func是判断条件的函数,param是判断参数{func=IsXXX,param="xxx"},{func=IsStepFinished,param=some_step},},finish={--条件判断成功要执行的动作{func

⑵ 《魔兽世界》怀旧服也打开了安其拉之门

流沙节杖敲响甲虫之锣,其拉虫人涌向希利苏斯,联盟与部落的勇士并肩作战,上古之神的低语萦绕心头。

8月4日,《魔兽世界》怀旧服多个服务器顺利开启安其拉大门,几乎所有玩家都聚集在希利苏斯,一起体验60级最着名的光辉事件——安其拉开门。这漫山遍野的玩家数量,让人不禁想起一年前怀旧服刚开服的盛况。那时,怀旧之梦刚刚启航,玩家们怀揣回忆重返最初的艾泽拉斯……

8月4日,怀旧服安其拉正式开门

2017年11月的暴雪嘉年华上,暴雪公布了要开《魔兽世界》官方怀旧服的消息。经过近两年的筹备,怀旧服在2019年8月27日正式上线。

当时,《魔兽世界》的正式服正持续走着下坡路,由于《争霸艾泽拉斯》这个资料片缺乏新玩法、剧情混乱且职业强度不平衡,所以从2018年以来,正式服的在线人数不断下滑,新资料片差评如潮,就连暴雪的股价都在一直下跌。很多玩家都曾担忧这个屹立了15年之久的经典网游会就此一蹶不振,但是怀旧服的上线,很大程度上扳回了劣势局面。

开服第一天,因为玩家人数太多,几个初始服务器里就出现了严重的排队现象,从中午开始排队人数就超过了1000,晚高峰的时候,哈霍兰、范克瑞斯等人气较高的服务器里排队更是达到5000人。到了第二天,最高排队人数甚至超过了1万,人们需要等待十几个小时才能进入 游戏 。过多的玩家数量导致服务器纷纷宕机,不得不临时开了几个新服,并且后续不断增加服务器数量。截至近期安其拉开门,国服已开放94个服务器。

这是去年8月初怀旧服测试时的情况,但正式开服后也好不到哪去

许多上班族玩家早上起来排队,晚上下班回家还在排队

据大脚插件统计,在开服一周后,《魔兽世界》怀旧服国服晚高峰在线人数超过60万,还有30多万人在 游戏 外排队。由于一些未使用插件的玩家无法被统计进来,所以国服实际人口数量显然比90万更多。在斗鱼、虎牙等直播平台,大量《魔兽世界》主播暂停正式服的直播,转投怀旧服的怀抱,甚至不少炉石区、主机区的主播也过来蹭一蹭这炙手可热的流量,无不说明怀旧服的火爆程度。

最初几周,每个种族的出生地都是人山人海,很多人生平第一次体会到了什么叫“人比怪多”。一些有素质的玩家还呼吁人们在任务怪刷新点前排队,形成一道靓丽的风景线。对于渴望重温青春的老玩家来说,怀旧服让他们又回到了15年前,对于没体验过《魔兽世界》60级内容的玩家来说,怀旧服则约等于一个新 游戏 ,不少正式服的玩家都好奇地过来体验。

这只是北郡修道院一个5级的任务,要求击杀一个有名字的小怪

开服3周时,怀旧服的霜语服务器还发生了着名的“毛人风”事件。“毛人风”事件简单来说,就是一位会长因一己私利,强行把该给别人的装备分给自己,最终导致队友退团退会。又因为这位会长是斗鱼的知名《魔兽世界》主播,这番操作瞬间点燃了观众的怒火,进而又被所有《魔兽世界》玩家鄙视。

那几天绝对是怀旧服最热闹的日子,无数其它服务器甚至是不玩怀旧服的玩家慕名而来,在霜语部落建立小号,赶到奥格瑞玛围观。

狂人与风经此一役,从顶级《魔兽世界》主播沦为过街老鼠

怀旧服带来的人气大大超出暴雪预期,购买月卡的玩家明显增多,连带着公司股票也水涨船高,扭转了此前的下降趋势。动视暴雪股价在怀旧服上线一天内便暴涨近6%,这是自2018年11月以来的最高峰。

尽管如此,《魔兽世界》的总监Ion Hazzikostas却看得非常透彻,他没有因一时的火爆就把团队重心放到怀旧服,而是加大力度开发正式服9.0版本的内容,并让新资料片《暗影国度》借鉴了许多经典旧世的设定,比如等级压缩到60级、大量被删除的经典职业技能回归,全新的“噬渊”地区难度很高,如同怀旧服练级期间那般硬核。Ion Hazzikostas还把怀旧服当做一个给正式服过渡和引流的平台。毕竟, 游戏 的发展要向前看,怀旧服暂时的成功只是正式服从前的幻影。

2018年暴雪嘉年华的手机事件对暴雪股价影响极大

60级时期的《魔兽世界》升级速度很慢,按照上班族玩家的升级速度,从出生到满级最少也要1个月,更别说开服初期排队和抢怪现象很严重。等到大部分玩家都满级时,2019年的十一长假也已经过完了。玩家们的 游戏 内容也从做任务练级变成了组团打副本,黑石深渊、三大副本、黑龙门任务、熔火之心传送任务,这是每个满级玩家都要经历一遍的流程,之后我们便可以进入熔火之心和奥妮克希娅的巢穴,体验《魔兽世界》的核心内容——团队副本。

大家很快就发现,15年前这些颇有难度的团本,放在今天其实是小儿科,因为15年来《魔兽世界》的插件在更新,玩家技术在进步, 游戏 攻略也比以前更加成熟,40个路人组团即可轻松推倒拉格纳罗斯。事实上,怀旧服开服不到6天,就有欧洲团队拿下了拉格纳罗斯首杀,这个团队中有三分之一的人甚至尚未满级。

开服5天,欧服公会APES首杀怀旧服“大螺丝”,此时,大多玩家还在开荒死亡矿井

玩家大部队刚刚满级或即将满级的这段时间是怀旧服的黄金时期,排队有增无减, 游戏 热度比刚开服时还高。每个高级副本都能瞬间组满5人,每处刷怪圣地都要凭本事抢怪,联盟和部落在世界各地展开小规模团战,每天晚上几乎都有大型屠城活动。

玩家们热情钻研 游戏 ,把许多15年前的老玩法发扬光大:42级法师单刷祖尔法拉克墓地升级;防战不带盾,变身仇恨拉满的“狂暴T”;独狼盗贼潜行不打怪,纯靠偷窃赚大钱;史诗弓猎人利用仇恨分离技巧,单刷熔火之心精英怪……

当年开发单刷的人怎么也没想到,这个地方日后成了脚本的温床

最让玩家热情高涨的地方在于,因为团本简单、组队容易,任何人都有机会获取团本中的顶级装备。当时最强力的几把武器——放血者、碧空之歌和毁灭之刃人人皆可获得,只要你积极参与团本活动。这一点是正式服和其它同类网游中望尘莫及的。相反,在正式服你想入手最顶级装备,要在超高难度的史诗副本里灭得死去活来,付出无数时间和心血。

与此同时,便当化的团本还催生了金团的火热。金团与传统的公会DKP团不同,它以 游戏 货币代替出勤分数,只要玩家口袋里有足够的金币,就能买任何看中的装备。金团最大的缺点是团员们互不相识,所以大家没有 情感 基础,缺乏团队攻坚能力,在高难度副本的压力下极易散团,但怀旧服不存在这个问题,怀旧服压根就没有高难度副本。

2019年10月就能6人通黑龙巢穴,侧面反映了副本难度

于是,当副本进度不再是传统DKP团的优势后,大部分玩家都倾向于选择金团。因为金团更加自由,不受固定团队约束,很适合工作繁忙还要顾家的中年玩家。而且金团打出的装备是直接用 游戏 币购买,只要你金币够多,装备获取速度会比大多数人更快。最重要的是,金团打完是可以分钱的,如果你有幸遇到一掷千金的土豪,那么你分得的金币或许比你消费的还要多。

当然,金团火爆并不意味着DKP团无人问津,后者固然有更多约束,但人员固定,归属感更强,更容易收获 游戏 中的友谊。二者在怀旧服中分庭抗礼,让每个玩家都能找到适合自己的团队。

2019年10月到12月期间,怀旧服在线人数、直播流量、 游戏 热度都达到顶峰,每个玩家都能在 游戏 中找到目标和乐趣。只不过伴随着金团的崛起, 游戏 环境也即将发生变化。

金团中流传着一句至理名言:金团金说话。只要你有钱,战士也可以抢法师的套装,牧师也能够收藏盗贼的匕首。

这种事情在国服金团里可不少见。2019年11月6日,祈福服务器的一位亡灵盗贼,因不爽团里另一位盗贼与他竞拍夜幕胸甲,先怒花2万金拍下胸甲(胸甲实际价值500金),后又出1万金让团长把那个竞争者踢出团队。次日,布鲁服务器的一位兽人战士玩家,先花7500金买了把毁灭之刃(对战士几乎无用的匕首),然后让团里的盗贼Roll点比大小,谁点数最小就把毁灭之刃送给谁。他之所以这么做,只是因为觉得好玩而已。

提布市值约10万金,是出血贼神器,然而图里这位是个法师

这就是怀旧服的金团环境,有钱就是大爷,没钱只会被人瞧不起。即便大家老老实实只买自己用的装备,那些极品还是会被竞拍者飙到天价。3000金的法师T2腿、8000金的碧空之歌、1万金的毁灭之刃等等屡见不鲜,等以后开了黑翼之巢,还会有3万金的奈萨里奥之泪和16万的逐风者禁锢之颅。

那么问题来了,这么多金币究竟是从哪里来的?60级时期的《魔兽世界》里没有日常任务,金币获取途径非常有限。大部分刷钱的方法都比较累,需要玩家长时间重复枯燥的操作,普通人既没那个精力也没那个时间,很多人满级后连900金的高级坐骑都买不起。但是,没有金币,在金团里你就只能眼睁睁看别人拿装备,可能很多个CD后,极品装备依然离你遥遥无期,大家都渴望有一个快速获得大量金币的方法。

有需求自然就有市场,玩家们很快发现一些 游戏 交易平台上推出了怀旧服金币交易服务,淘宝和微信上也陆续出现了大量金币卖家,让玩家可以用人民币购买怀旧服金币。这无疑就是最快的金币获取方式,不少人开始在这些平台上买金。去年9月的时候,满级玩家还不多,金币产出有限,1金几乎就等于1元人民币。10月底,满级玩家渐渐多起来,比例就下降到1比0.35左右,此后便一直保持下跌趋势。随着金团日益盛行,买金的玩家也日益增多,金团里的土豪老板出价也越来越高。

这是某些平台今年8月的金价比例,已经比高峰时便宜了20倍

“风脸”卖50万金或许是工作室自导自演,但卖十几万在怀旧服里很常见

早在开服之初,就有很多人意识了怀旧服存在的巨大商机。举例来说,一个60级法师在血色修道院带4个小号升级,1个小时便可收获带刷费加小怪拾取金钱总计100金左右,刷10个小时就有大约1000金到账。1000金币在去年11月能卖400元。换句话说,只要你能忍受每天10小时枯燥的重复劳作,一个月就有1万人民币的收入。在现实生活中,有多少人敢保证自己每天工作10小时,就能稳定月入过万呢?现在一款简单的网游就能做到,真金白银,无任何风险。

尝到了甜头,嗅到了利益,他们变本加厉地在 游戏 中刷钱赚金。事实上,有相当一部分人就是冲着这个目的才玩怀旧服的,这种为赚钱来玩《魔兽世界》的玩家就是金币农夫。金农玩家一切向钱看,在金团里喜欢哄抬装备价格、诱导土豪飙价,自己却不会出一分钱。这类玩家在怀旧服中还不在少数,久而久之,金团的风气就变得无比铜臭,极品价格一路飙升,出价低者遭人奚落,更有人直接在团里买卖金币。

本来很好的团队模式,被利欲熏心的人糟蹋

为了赚钱,部分金农甚至开始不择手段。他们在拍卖行里故意摆放一口价超高而竞标价正常的商品,让粗心的人花上几千金买一组治疗药水。他们利用 游戏 交易系统的漏洞,在与其他玩家面对面交易物品时,恶意撤回自己的商品,空手套白狼。他们中那些有指挥才能的人,会组织金团然后黑金,将拍卖装备所得的金币全部据为己有。

一次金团收入少说也有几万金,他们快速把这些金币转换为人民币,然后重新买个满级号继续开金团——买号花的钱在巨大的黑金利益面前根本不值一提。

各种骗术争奇斗艳

只有你想不到,没有人做不出

金农的存在在一定程度上恶化了怀旧服的 游戏 环境,但他们作为个体玩家,终究难以动摇 游戏 的根基。真正让怀旧服由盛转衰的,是盘踞在艾泽拉斯深处的 游戏 工作室。

个体玩家尚且能抓住怀旧服的赚钱机会,作为专业团体的工作室又怎会对这块大蛋糕无动于衷?工作室在开服之初就展开了自己的业务,首先是升级代练,然后是带刷高级副本,等到大家都满级了,就开始提供打装备、刷材料等服务。他们会多开 游戏 账号,占据高级地图的野外资源,让普通玩家难以获取稀有材料。最早的金币买卖服务也是工作室一手打造,为了激发大家的消费欲望,他们还在 游戏 论坛大肆宣扬金团、贬低DKP团,诱导玩家买金挥霍。

上面这些只不过是工作室投机取巧的小把戏,跟金农玩家的行为没多大区别,他们真正的杀手锏是数量庞大的AI脚本。这些AI脚本由统一的电脑程序控制,可以精准、有效率且不知疲倦地执行各种 游戏 操作,从打怪到采集,从交易到跑尸,这些由脚本操纵的 游戏 账号几乎无所不能。

全自动脚本航班,霸占世界频道,没坐过怀旧服等于白玩

脚本号第一次大规模出现在玩家视野里是在去年11月中旬。有玩家在塔纳利斯地图发现,从加基森到祖尔法拉克副本门口这段路上,总是有大量装备极差、骑着小马的亡灵法师来回跑动。他们的行进路线完全一致,名字都是生僻字,而且打不还手骂不还口,明显不是真人操控。

这些就是工作室的脚本号,通常一台电脑就可运行30个账号,它们要去祖尔法拉克刷钱,所以职业都是刷怪能力最强的法师,背包装满后它们会自动返回加基森,把杂物卖掉再继续刷钱,周而复始。

葬影村是玛拉顿脚本法师必经之地,因为刷完副本要来这儿卖东西

在此之后,细心的玩家渐渐发现,野外所有黑莲花(怀旧服最珍贵的草药)刷新点都有潜行的小号蹲守。许多刷材料、刷图纸的地图,都有行动高度相似的猎人法师在机械性地打怪。各种五人副本外都出现了跟祖尔法拉克一样的脚本队伍,全天候24小时执行编辑好的命令。

不知不觉,工作室的脚本大军已渗透到怀旧服各个角落,它们行为未必一致,目的却完全相同,就是不停地刷钱,为工作室产出大量金币。单个脚本号刷钱效率可能比不上正常玩家,但脚本不需要休息,普通人用8小时刷800金,脚本就用24小时刷1000金,而且一个工作室员工就可以控制上百个脚本。

每一个墓碑都是一个阵亡的脚本号,不少人来玛拉顿门口刷荣誉

各种稀少值钱的 游戏 物品被脚本大面积产出,压榨了普通玩家刷钱的利益,大量金币流入市场,引发物价波动,击溃了 游戏 的经济。脚本号还可以充当PvP对手,专门用来给PvP玩家刷荣誉等级,让不花钱的玩家再怎么努力,也得不到高级军衔,PvP和战场从此沦为刷子 游戏 。

不仅如此,数量庞大的脚本大军还占据了服务器资源,让很多人不得不排队进 游戏 ,影响正常玩家 游戏 体验。工作室们如附骨之疽,拼命汲取怀旧服的每一滴血。

练级打本PvP,工作室可为你解决一切,有时你不禁怀疑,到底是谁在玩你宝贵的账号

当新冠疫情爆发,全国人民居家隔离时,工作室的脚本大军变得更加猖獗。它们不再隐藏和掩饰自己的身份,大大方方从主城赶往各个刷钱地点,玛拉顿副本门口挤满了这些行尸走肉,人数比在线高峰的铁炉堡还多。同时,在各大主城的邮箱旁,出现了许多1级小号,它们会自动交易每个来到邮箱旁的人,目的是欺骗粗心的玩家,劫持交易物品。这说明工作室为了敛财已近乎丧心病狂,脚本、黑金、诈骗甚至外挂,无所不用其极。

有的人可能会疑惑,脚本也好,外挂也罢,这么明显的危害 游戏 的东西,运营者怎么不管管呢?事实是,他们在对待工作室脚本的问题上几乎没有实质性作为。从开服到2020年5月,官方累计冻结过15万个 游戏 账号,这个数量相对怀旧服存在的脚本号而言是九牛一毛,而且大多都只冻结1个月,解封了又是一条刷钱好汉。暴雪针对脚本大军做了两次热修,先增加了黑莲花刷新地点,又对玩家设立了一个每日30次副本的限制,但收效甚微。

关键的是,脚本号跟普通玩家一样,进 游戏 需要花钱充月卡,从 游戏 的改善举动看,50万个脚本跟50万个真人玩家都能带来收入,所以大多时候睁只眼闭只眼就算过去了。

对脚本的打击力度依然远远不够

到最后,工作室的存在已经让 游戏 环境彻底恶化,动摇了怀旧服的根基——玩家的热情。玩家不买金很难在金团里拿装备,PvP军衔也没法同花钱买脚本的人竞争。野外每张地图上都充斥着脚本大军,玩家辛苦打到的材料变得一文不值。

就算是这样,如果能积极严厉地打击工作室,玩家的体验也会好很多,可惜并不是如此。其实我们很早就可预见,《魔兽世界》怀旧服这种火爆又容易赚钱的网游,如果官方不采取有力的制裁手段,金农和工作室必然会把它污染成“脚本世界”,只是大家原本都期望这一次结局能有所不同。

金农遍地、脚本肆虐、 游戏 环境被污染、暴雪官方不作为,很多真心来体验 游戏 的玩家感到心灰意冷,萌生退意。另外,60级的《魔兽世界》相对于后续资料片,可玩内容本就不多,没有竞技场、没有坐骑幻化、没有大秘境,只有每周一次的团本,很容易让人厌倦。再加上疫情结束、全国复工,人们开始为工作忙碌,不少玩家终于选择了AFK,一如他们当初离开正式服那样。

今年6月的怀旧服里已能明显感到玩家数量大幅减少,最直观的例子就是晚上金团数量已大不如前,94个服务器里没有一个需要排队,满负载的屈指可数,各大公会在线人数也比去年少多了。不过,脚本们依然在玛拉顿和厄运之槌等地忙碌,筹备各种物质,因为7月底怀旧服要迎来最后一波热度——安其拉开门事件。到时可能会有不少人回归,体验这场当年错过的史诗。

安其拉开门是《魔兽世界》里首个服务器级的大规模世界事件,它本质上是个副本前置任务,但需要全服联盟、部落玩家齐心协力完成。开门事件分为两部分,一部分是针对整个服务器的物资捐献,另一部分则是精英玩家需要完成的一些列史诗任务。同时,物资捐献进度的快慢直接影响服务器开启团本的速度,精英玩家们能否完成任务则关系到自己能不能拿到传奇坐骑——黑色其拉作战坦克。

完成开门任务的玩家可获得黑色其拉作战坦克,《魔兽世界》里最珍贵的坐骑之一

对工作室来说,这当然是不容错过的大蛋糕,工作室的脚本群里曾曝光过一些黑虫子坐骑订单,价格从10万到30万不等。同时,为了尽快帮“老板”完成开门任务,工作室还专门雇人在希利苏斯24小时轮班刷怪、打材料,很多服务器即便到了凌晨,也依然能看到他们孜孜不倦的身影。

为了延缓开门时间,让自己顺利完成黑虫子的订单,他们还故意去中立拍卖行拦截捐献物资,甚至对那些捐献积极的玩家恶语相向,以“10万元买你一只手”相威胁。

工作室群里流传的一份魔兽合同,16万元成为开门英雄

席瓦莱恩服的某工作室宣言,可能只是气话和玩笑,但也暴露了其嘴脸

可以预见,利用新一拨 游戏 热度,工作室又可以赚得盆满钵满。金农也不会放过这个重要的赚钱机会,金团更是要用全新的极品装备榨干每一位团员的荷包。等开门热度褪去,回归体验的玩家还是会失望离去,因为那个排队杀怪、互惠互助的怀旧服,那个懵懵懂懂、单纯天真的《魔兽世界》,已经再也回不去了。

怀旧服版本更新至此,再往后就只剩一个纳克萨玛斯了,60级的内容很快就将耗尽。其实,作为一个15年前的老 游戏 ,怀旧服存在的意义本就是让我们重温经典,而非再创辉煌。对于想靠它赚钱的人来说,热度消退就是离场的时候,对于真正想怀旧的老玩家来说,怀旧梦或许才刚刚开始。

《燃烧的远征》已经提上议程,阿尔萨斯的怒火还会远吗?

最后,在2020年3月28日,暴雪曾向《魔兽世界》玩家发出过一个问卷调查,内容是怀旧版《燃烧的远征》应采用怎样的升级机制,并提供了数个方案供玩家选择。很显然,这是在为《燃烧的远征》怀旧服做准备,相信等纳克萨玛斯也被玩家攻克后,黑暗之门就会开启了。当燃烧再远征、巫妖王再怒之时,等待老玩家的是过去的美好回忆,还是赚金的牛鬼蛇神呢?

⑶ illustrator脚本怎么用

文件菜单,脚本,打开就会有操作面板或者对话框。AI有不少好脚本,例如印前面板、pdf导入脚本等等吧

⑷ 如何在游戏机制中使用AI/剧情脚本

首先要说的是,并不是说AI,剧情逻辑必须非脚本语言不可,用C++也可以写,甚至更习惯一些。但是脚本语言有脚本语言的长处,动态类型以及相当人性化的数据构造方式,特别是LUA中的表类型,似乎比较擅长描述这种复杂的AI/剧情结构。当然,为了验证自己的想法,我也写了4K的LUA代码,结果觉得该脚本语言相当不容易构造简洁的内容。

AI从高自低的分别是计划,状态机,模式。我不知道这种划分是基于何种角度,但是我个人的理解是状态机最高,模式作为某个状态下的某个决策所预定义的动作序列,而计划,是为了实现某个目标的一组步骤的组合。
那么硬编码的游戏循环何时调用脚本?答案是,游戏循环执行到调度NPC的AI函数的时候,该AI函数就不再做任何硬编码,而只是简单的dostring("gameEntitys[npc](/"update/")")。就是这么简单,将所有的AI/剧情放置到脚本中。

那么,LUA中 gameEntitys[npc]("update")是什么意思?简单的说,gameEntitys是一个存储所有NPC的注册表,gameEntitys[npc]将取得该npc的FMS函数,然后给该函数发送update消息告知npc当前的状态进行例行更新。
FMS函数对于每一个对象是唯一的,那么比如某一类对象有共同的AI/剧情,那么该类的每一个对象同用同样的FMS函数的话,成员变量如何维持?要知道在LUA中模拟类还是比较麻烦的。答案是upvalue,也就是所有的对象使用同样的函数来生成自身的FMS,该函数就是FMS_Creator(all_state, init_state)。

在C++编码中,NPC对象完成构造之后,就调用LUA载入对应的状态机/剧情脚本,然后调用FMS_Creator为自己创建FMS函数:
dofile("npc_ai.lua") --引入all_state,init_state
gameEntitys[npc]=FMS_Creator(all_state, init_state)
当然,NPC析构之后,你也要释放LUA为你分配的资源

gameEntitys[npc]=nil

已经大概说明了如何在C++中启动NPC的LUA逻辑代码了,那么如何在LUA中编写状态机呢?答案是表。每个表代表一个状态,该表下的key表示该状态接受的消息,key对应的值表示该状态接受到key所表示的消息后要执行的决策,包括相应的动作和可能的状态变迁。看代码吧,最直观的表述:

state = {
name = "attack", --状态名
enter = { --进入该状态要执行,属于状态的消息
--func是函数,param是参数,sucess,unsucess是func执行结果所对应的状态转移
{func=print, param="open fire"},
{func=IsEnemyDie, sucess="cure"},
}
update={} --同enter,不过用于状态在每一帧的更新
exit = {} --同enter,不过用于状态在每一帧的更新
other_msg = {} --同enter,用于表示该状态所接受的其他消息,可以有多个
}
在LUA中就是可以如此直观的表示每一个状态,其响应的消息以及函数。然后构造该npc接受的状态集合:

all_state = {}
all_state[state.name]=state

init_state=state
这样子,就能传递到FMS_Creator中创建出自己独一无二的状态机函数了。

那么剧情脚本呢?其实描述了状态机,剧情脚本是否已经有点眉头了呢?剧情,即为计划,每一个计划由一系列步骤所组成。类似的,对应每个计划的执行会有一个plan()函数,且为了达到独立效果,该函数将会由plan_creator(all_step, first_step)生成。
看参数,显然计划的步骤step就是类似于状态的表,不过key方面略有不同,看代码就明白:

step = {
name="find bill",
cond = { --执行该步骤的前提条件
--func是判断条件的函数,param是判断参数
{func=IsXXX, param="xxx"},
{func=IsStepFinished, param=some_step},
},
finish = { --条件判断成功要执行的动作
{func

⑸ 用世界编辑器WE把一部分技能改过后,为什么电脑不会用改过的技能

这是由于你未设置AI(人工智能),所以他对不是系统原来的技能就无法识别,当然也就无法使用啦,至于如何解决这一问题,其实我也一知半解,我所能做的就是为你找一篇关于如何设置AI(人工智能)的文章,至今我也无法完全学会,太深奥了...剩下的就靠你努力啦,这篇文章将帮助你制作一个简单但是十分酷的英雄对战地图的人工智能。
这个你将学习的人工智能系统不是非常完美。我们将创建的是一个可以攻击其它英雄、可以自己拣物品、学习和使用技能的人工智能系统,但是还是无法与人类玩家相比。
但是,当你学习了基础的知识以后你应该可以自己改进它。

前提需要:
JASS基础----这篇文章使用JASS来制作示例,所以你必须了解JASS。在理论上它也可以在T中做出来,但是我不推荐那样做,因为用T来制作可能导致内存泄露、大量不必要的代码以及在T中是无法使用JASS的返回值BUG和游戏缓存系统的。如果你不熟悉JASS,请预先补充一下你自己的JASS知识。你同样必须知道什么是代码行,如果你不知道的话,请补充自己的知识。

基于游戏缓存以及返回值BUG的系统
注意事项:
-我们将要制作的AI系统达不到人类的水平,但是比什么都没有强。而且我认为当你理解了基础以后可以自己改进它。
-你不用完全按照我说的做;我按做我的想法做,但是如果你的想法更好或者你觉得自己的做法更舒服,请按照你自己的想法做。我并不完美,这篇文章也不可能完美,但是我希望它可以对你有所帮助。
-你可以使用在我的演示地图里面的AI系统而不自己动手(如果你那样做了,请告诉我一声),但是我建议你自己动手写,因为地图可能很复杂而且你可以自己动手写一个AI系统中学到更多的知识。

初始化部分:
首先在WE中创建一个触发条件为"玩家1-玩家1(红色)离开游戏"的触发器,然后把它转换为JASS。我们需要这个触发器来监视玩家离开游戏,那样我们才能为这个玩家开启人工智能。现在它只监视一号玩家离开游戏,所以我们在正式地图中需要使用一个循环来监视从0-11号的玩家。

我们希望这个AI系统可以使用技能。听起来似乎很难,其实很简单。我们只需要使英雄学习技能,那么他们就可以自己使用。

注意:电脑控制的英雄释放自定义技能的情况总是和它释放这个自定义技能的基础技能的情况相同(这里翻译的有点含糊不清,自定义技能的基础技能的意思是....基础技能是游戏本身带有的技能,自定义技能都是以某个基础技能为基础的...这样说做过图的大大应该可以明白吧?).所以如果你的自定义技能是以沉默为基础技能的,电脑控制的英雄就会在对战地图中应该使用沉默的情况使用这个技能。千万不要将技能以"通魔(Channel)"为基础,因为电脑从来不会使用它们,即使改变技能的OrderString也没有什么用。

为了知道每个英雄都拥有什么技能,我们创建了一个游戏缓存(game cache)来保存它。

在演示地图中我的触发器在地图的初始化部分创建了一个游戏缓存并将它保存在全局变量 udg_GameCache 中。需要注意的是缓存必须在我们使用它之前初始化,所以我在地图的初始化时间中创建了它。

在我的地图中我写了一个函数SetupSkills.在这个AI触发器的InitTrig函数中我使用了库函数ExecuteFunc来开启另外一个线程执行这个函数。这是为了防止地图的初始化时间太长。

jass: Copy code

我的SetupSkills函数如下:
function SetupSkills takes nothing returns nothing
local string h // Create a local string variable
// Paladin // Here we’ll initialise the Paladin’s skills, repeat this for all other heroes
set h = UnitId2String('Hpal') // Store the returned value of UnitId2String(‘Hpal’) in the local
call StoreInteger(udg_GameCache, h, "BaseSkill1", 'AHhb') // One of his base skills is Holy Light, store it as “BaseSkill1”
call StoreInteger(udg_GameCache, h, "BaseSkill2", 'AHds') // Store Divine Shield as “BaseSkill2”
call StoreInteger(udg_GameCache, h, "BaseSkill3", 'AHad') // Store Devotion Aura as “BaseSkill3”
call StoreInteger(udg_GameCache, h, "UltimateSkill", 'AHre') // Store Resurrection as his “UltimateSkill”
… // Repeat for each Hero.
endfunction

接着是我的AI触发器的InitTrig部分:
function InitTrig_AI takes nothing returns nothing
local integer i = 0
set gg_trg_AI = CreateTrigger( )
loop
exitwhen i > 11
call ( gg_trg_AI, Player(i) )
set i = i + 1
endloop
call TriggerAddAction( gg_trg_AI, function PlayerLeaves )
call ExecuteFunc("SetupSkills")
endfunction

为英雄开启AI系统
为了控制AI我们使用了一个定时器(timer).我写了一个函数StartAI来获取一个单位的类型:英雄(请在演示地图中查看这个函数)。这个函数只是创建一个定时器,并且"绑定"在这个英雄身上,并且开启这个定时器。

这是演示地图中的空的AILoop函数和StartAI函数(这里给的只是一个框架,等下我们将展示一些动作函数,但是你起码必须先把function和endfunction写上去以保证WE不报错) :

jass: Copy code

function AILoop takes nothing returns nothing
endfunction

function StartAI takes unit hero returns nothing
local timer m = CreateTimer()
call AttachObject(m, "hero", hero)
call TimerStart(m, 0, false, function AILoop)
set m = null
endfunction

注意,我的这个StartAI函数通过将periodic参数设置为false来达到使定时器只执行一次的目的(以后我们还会来讨论它的).

现在,你就可以在你的英雄选择系统中当由电脑控制的玩家选择英雄时调用这个函数,并且在玩家离开游戏的时候执行这个函数。检测玩家是否拥有一个英雄,如果它拥有,调用这个函数来开启那个英雄的AI系统。例如:

jass: Copy code

function PlayerLeaves takes nothing returns nothing
local player p = GetTriggerPlayer()
call DisplayTextToForce(bj_FORCE_ALL_PLAYERS, GetPlayerName(p)+" has left the game.")
if udg_Hero[GetPlayerId(p)] != null then
call StartAI(udg_Hero[GetPlayerId(p)])
endif
set p = null
endfunction

注意:这个函数将使AI系统控制离开的玩家的英雄,但是这也不是必要的,你也可以做别的事情。

使这个AI做些什么

当定时器终止的时候我们希望它做了这些事情:
●如果英雄死亡,等待他复活。
●如果英雄将要死亡,命令他移动到地图中心的生命泉水。
●如果英雄状态良好,检测是否有敌人在附近。如果有,则命令英雄攻击它。 否则就检测是否有物品在附近,如果有的话,发送一个巧妙 的命令让英雄拣起它。然后命令英雄巡逻到地图的一个随机坐标。
●如果英雄是活着的而且有未使用的技能点,学习一个技能。

我们由变量的声明开始。注意在我函数里面的实变量"e",它定义了在定时器再次启动前所经过的时间,这样我们就可以在英雄死亡的时候等待短一点的时间,而在他攻击的时候等待长一点的时间。这个变量初始化值为5。

jass: Copy code

局部变量的声明:
function AILoop takes nothing returns nothing
local string a = GetAttachmentTable(GetExpiredTimer())
local unit h = GetTableUnit(a, "hero")
local rect i
local location r
local real x = GetUnitX(h)
local real y = GetUnitY(h)
local group g
local boolexpr b
local boolexpr be
local unit f
local string o = OrderId2String(GetUnitCurrentOrder(h))
local real l = GetUnitState(h, UNIT_STATE_LIFE)
local real e = 5


我们由检测英雄是否死亡开始,如果他死亡了,设置"e"为1.5(因为在复活以后等待5秒的时间太长了,我们并不想这样).

当英雄的生命值"l"为0时,设置"e"为1.5来使定时器更加频繁的检测英雄是否复活.

if l <= 0 then
set e = 1.5
endif


接着我检测英雄的生命是否低于最大生命值的20%.如果是的,命令英雄移动到生命泉并且设置"e"为3.
当英雄的生命值少于最大生命值的20%时,命令英雄移动到生命泉的位置。

if l < GetUnitState(h, UNIT_STATE_MAX_LIFE)/5 then
call IssuePointOrder(h, "move", GetUnitX(gg_unit_nfoh_0001), GetUnitY(gg_unit_nfoh_0001))
set e = 3


如果英雄的状态良好,检测他是否处在一个普通命令中(防止它打断了通魔技能).如果是一个标准命令,我们再检测在500的半径内是否有敌人存在.如果存在敌人,简单的发出一个攻击命令(不要改变"e"的值,5秒对于这个情况刚刚好).

jass: Copy code

function AIFilterEnemyConditions takes nothing returns boolean
return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0 and IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(GetAttachedUnit(GetExpiredTimer(), "hero")))
endfunction


else
if ((o == "smart") or (o == "attack") or (o == "patrol") or (o == "move") or (o == "stop") or (o == "hold") or (o == null)) then
set g = CreateGroup()
set b = Condition(function AIFilterEnemyConditions)
call GroupEnumUnitsInRange(g, x, y, 500, b)
set f = FirstOfGroup(g)
if f == null then

else
call IssueTargetOrder(h, "attack", f)
endif
call DestroyGroup(g)
call DestroyBoolExpr(b)
endif


如果没有敌人存在,再检测物品.如果发现物品,再检测是否为一个提升状态的物品.如果不是,检测英雄物品栏是否有空栏,有的话就命令英雄将它拣起来.

jass: Copy code

function AISetItem takes nothing returns nothing
set bj_lastRemovedItem=GetEnumItem()
endfunction

function AIItemFilter takes nothing returns boolean
return IsItemVisible(GetFilterItem()) and GetWidgetLife(GetFilterItem()) > 0
endfunction

function AIHasEmptyInventorySlot takes unit u returns boolean
return UnitItemInSlot(u, 0) == null or UnitItemInSlot(u, 1) == null or UnitItemInSlot(u, 2) == null or UnitItemInSlot(u, 3) == null or UnitItemInSlot(u, 4) == null or UnitItemInSlot(u, 5) == null
endfunction


if f == null then
set i = Rect(x-800, y-800, x+800, y+800)
set be = Condition(function AIItemFilter)
set bj_lastRemovedItem=null
call EnumItemsInRect(i, be, function AISetItem)
if bj_lastRemovedItem != null and (GetItemType(bj_lastRemovedItem) == ITEM_TYPE_POWERUP or AIHasEmptyInventorySlot(h)) then
call IssueTargetOrder(h, "smart", bj_lastRemovedItem)
else

endif
call RemoveRect(i)
call DestroyBoolExpr(be)


如果物品栏没有空位,或者没有发现物品,则命令英雄到一个随机地点寻找新的目标.

else
set r = GetRandomLocInRect(bj_mapInitialPlayableArea)
call IssuePointOrderLoc(h, "patrol", r)
call RemoveLocation(r)

⑹ HTML,CSS,JS,AI,DW,FLASH、Dreamweaver、html语言这些分别是干什么用的

html是静态页(网页),css是网页样式,js是JavaScript缩写,是一种计算机脚本语言,AI是illustrator文件存储格式,主要是绘制图形的!DW是dreamweaver网页编程的!flash是制作动画的,Dreamweaver就是DW的缩写!

⑺ 星际争霸

先来介绍一下StarEdit,简称SE
是星际自带的一个编辑器
功能比以往任何游戏的编辑器都全面
Blizzard就是用SE做自己的任务关的

有些人的SE用不了,请下载这个
里面有2个dll文件,一个是光盘版的 storm.dll
一个是硬盘版的 storm.dll
做地图时用光盘版的,在浩方玩时用硬盘版的就行
(用那个版就把那个改名为 storm.dll,放在星际目录下)

1。08b的正版
SE可以支持8个玩家,每个玩家一个种族,需要一个开始地点才能保存(start location)
。。。。
这是基本常识,初学者都会,我就不说了

现在来介绍层(layer)
层里面有好几个选项
其他的大家都知道
重点的是地点层(location)
这是RPG地图不可缺少的
选中地点层,你可以用鼠标拖一个框,里面就是地点了
你可以给这个地点改名
比如改成学校,家里。。。
这对后面要讲的触发器是有很大联系的
有的触发必须依赖地点而存在

接着讲Force,玩家组队
你可以把8个玩家分成4队
还可以给每个队改名

结盟就是这组玩家是盟友
结盟胜利就是但一个玩家胜利,全组胜利
任意开始地点就是这组玩家的开始地点是随机的
(其实是玩家随机)

第3个要讲的是 Player Setting(玩家设定)
它在player菜单下
在这里,你可以设定玩家由谁扮演
是人(human),还是电脑(computer),还是中立的,(nautral)
或是走近就可以变成自己的兵的(resuable)

在unit的页面下,你可以设定那个玩家可以造什么兵
不可以造什么兵

在upgrade下,你可以设定玩家的初始升级资料
和允许/禁止玩家的某种升级

Speical Ablities就是魔法设定了

如果你理解了第一章的内容
已经有一定基础了
可以开始进阶内容了

现在讲的是RPG地图的核心内容--触发器(trigger)
触发器有人说很难
其实非常非常…………(此处省略N个非常)简单
任何一个正常人都可以理解

触发器分3个部分
执行人,条件,结果
执行人随便写,只有一个触发和执行人有关(是结盟的触发)
注意,如果你写 force 4 (第4组)
而force 4你没有放一个玩家
或有一个人类玩家,但他没加入游戏
那么执行人为 force 4 的触发都不会执行
(就是要有人或电脑来执行)

条件有很多种
ACCUMULATE Player accumulates quantity resources.
该玩家积累多少资源时
ALWAYS Always.
总是
BRING Player brings quantity units to location.
该玩家带多少单位到特定区域时
COMMAND Player commands quantity units.
该玩家控制多少单位时
COMMAND THE LEAST Current player commands the least units.
当前玩家最少控制多少单位时
COMMAND THE LEAST AT Current player commands the least units at location.
当前玩家在特定区域最少控制多少单位时
COMMAND THE MOST Current player commands the most units.
当前玩家最多控制多少单位时
COMMAND THE MOST AT Current player commands the most units at location.
当前玩家在特定区域最多控制多少单位时
COUNTDOWN TIMER Countdown timer is ration game seconds.
游戏时间倒数计时多少秒时
DEATHS Player has suffered quantity deaths of unit.
该玩家损失多少单位时
ELAPSED TIME Elapsed scenario time is ration game seconds.
游戏时间经过多少秒时(游戏时间)
HIGHEST SCORE Current player has highest score points.
当前玩家得分最高时
KILL Player kills quantity units.
该玩家杀死一定数量的单位时
LEAST KILLS Current player has least kills of unit.
当前玩家杀死单位最少时
LEAST RESOURCES Current player has least resources.
当前玩家积累资源最少时
LOWEST SCORE Current player has lowest score points.
当前玩家得分最低时
MOST KILLS Current player has most kills of unit.
当前玩家杀死单位最多时
MOST RESOURCES Current player has most resources.
当前玩家积累资源最多时
NEVER Never. 从不
OPPONENTS Player has quantity opponents remaining in the game.
该玩家在游戏拥有多少对手时
SCORE Player score type score is quantity.
该玩家得分是多少时
SWITCH Switch is set.
开关被设置或清除时

(慢慢看,3分钟后再看下面)

结果也有很多种

CENTER VIEW Center view for current player at location.
将画面转至某特定区域
COMMENT Comment: comment.
对触发器加以说明,使之便于阅读
CREATE UNITS Create quantity unit at location for player
在特定区域为玩家创造一定数量的单位
CREATE UNITS WITH PROPERTIES Create quantity
unit at location for player. Apply properties
在特定区域为玩家创造一定数量的具有一定属性(如隐形,钻地等)的单位
DEFEAT End scenario in defeat for current player.
当前玩家任务失败
DISPLAY TEXT MESSAGE Display for current player: text.
为当前玩家显示一些交代文字
DRAW End the scenario in a draw for all players.
所有玩家平手
GIVE UNITS TO PLAYER Give quantity units owned by player at location to player.
将特定区域的一个玩家(前者)的一定数量的部队给另一个玩家(后者)
KILL UNIT Kill all units for player.
杀死玩家的所有单位
KILL UNITS AT LOCATION Kill quantity units for player at location.
杀死玩家的在特定区域的一定数量的单位
LEADER BOARD (CONTROL ATLOCATION)
Show Leader Board for most control of units at location. Display label: label
显示目前特定区域里的单位控制情况
LEADER BOARD (CONTROL)
Show Leader Board for most control of unit. Display label: label
显示目前单位控制情况
LEADER BOARD (GREED)
Show Greed Leader Board for player closest to accumulation of number ore and gas.
显示目前总的资源收集情况
LEADER BOARD (KILLS)
Show Leader Board for most kills of unit. Display label: label
显示目前杀死单位的情况
LEADER BOARD (POINTS)
Show Leader Board for most points. Display label: label
显示目前得分情况
LEADER BOARD (RESOURCES)
Show Leader Board for accumulation of most resource. Display label: label
显示目前资源收集情况
LEADER BOARD GOAL(CONTROL AT LOCATION)
Show Leader Board for player closest to control of number of units at location. Display label: label
显示还需在特定区域里控制多少单位可达目标
LEADER BOARD GOAL(CONTROL)
Show Leader Board for player closest to control of number of unit. Display label: label
显示还需控制多少单位可达目标
LEADER BOARD GOAL (KILLS)
Show Leader Board for player closest to number kills of unit. Display label: label
显示还需杀死多少单位可达目标
LEADER BOARD GOAL (POINTS)
Show Leader Board for player closest to number points. Display label: label
显示距离目标得分还差多少
LEADER BOARD GOAL(RESOURCES)
Show Leader Board for player closest to accumulation of number resource. Display label: label
显示还需收集资源可达目标
LEADER BOARD COMPUTER PLAYERS Set use of computer players in leaderboard calculations.
关闭或打开电脑的情况显示
MINIMAP PING Show minimap ping for current player at location.
当前玩家的小地图显示警告框
MODIFY UNIT ENERGY Set energy points for quantity units owned by player at location to percent%.
修改特定区域里一定数量的玩家控制单位的能量
MODIFY UNIT HANGAR COUNT Add at most quantity to hangar for quantity units at location owned by player.
修改特定区域里一定数量的玩家控制单位的弹药(如航母,金甲虫)
MODIFY UNIT HIT POINTS Set hit points for quantity units owned by player at location to percent%.
修改特定区域里一定数量的玩家控制单位的生命值
MODIFY UNIT RESOURCE AMOUNT Set resource amount for quantity resource sources owned by player at location to quantity.
修改特定区域里一定数量的玩家控制单位的能量

MODIFY UNIT HANGAR COUNT Add at most quantity to hangar for quantity units at location owned by player.
修改特定区域里一定数量的玩家控制单位的弹药(如航母,金甲虫)
MODIFY UNIT HIT POINTS Set hit points for quantity units owned by player at location to percent%.
修改特定区域里一定数量的玩家控制单位的生命值
MODIFY UNIT RESOURCE AMOUNT Set resource amount for quantity resource sources owned by player at location to quantity.
修改特定区域里一定数量的玩家控制单位的能量
MODIFY UNIT SHIELD POINTS Set shield points for quantity units owned by player at location to percent%.
修改特定区域里一定数量的玩家控制单位的护盾
MOVE LOCATION Center location labeled location on units owned by player at location.
将一个特定区域移动到一个单位身上在一个特定区域内
MOVE UNITS Move quantity units for player at location to destination.
将玩家一定数量的单位由一个特定区域移动到另一个特定区域
MUTE UNIT SPEECH Mute all non-trigger unit sounds for current player.
关闭当前玩家所有非触发单位的声音
ORDER Issue order to all units owned by player at location: order to destination.
命令玩家的单位在从一个特定区域里移动.攻击.巡逻到另一个特定区域
PAUSE GAME Pause the game.
暂停游戏
PAUSE TIMER Pause the countdown timer.
暂停倒计时
PLAY WAV Play WAV file
播放一段声音
PRESERVE TRIGGER Preserve Trigger.
循环执行当前触发
REMOVE UNIT Remove all units for player.
移除玩家所有单位
REMOVE UNITS AT LOCATION Remove quantity units for player at location.
移除玩家在特定区域里的一定数量的单位
RUN AI SCRIPT Execute AI script script.
运行一个人工智能
RUN AI SCRIPT AT LOCATION Execute AI script script at location.
在特定区域运行一个人工智能
SET ALLIANCE STATUS Set Player to Ally status.
设置当前玩家与另一个玩家同盟或敌对
SET COUNTDOWN TIMER Modify Countdown Timer: Set ration seconds.
设置倒计时时间
SET DEATHS Modify death counts for player: Set quantity for unit.
设置玩家的死亡单位计数
SET DOODAD STATE Set doodad state for units for player at location.
特定区域里小物件的设置
SET INVINCIBILITY Set invincibility for units owned by player at location
设置特定区域里的玩家单位无敌
SET MISSION OBJECTIVES Set Mission Objectives to: text.
设定本关任务
SET NEXT SCENARIO Load scenario after completion of current game.
设定当前任务结束后读取的地图
SET RESOURCES Modify resources for player: Set quantity resource.
为玩家设定一定数量的资源
SET SCORE Modify score for player: Set quantity points.
设定玩家得分
SET SWITCH Set switch.
开关设置
TALKING PORTRAIT Show unit talking to current player for ration milliseconds.
为当前玩家显示单位肖像一段时间
TRANSMISSION Send transmission to current player from unit at location.Play WAV file.Modify transmission ration: Set number milliseconds.Display the following text: Text
设置一段对话。包括小地图上单位的地点显示,伴随的声音及文字
UNMUTE UNIT SPEECH Unmute all non-trigger unit sounds for current player.
解除当前玩家所有非触发单位的声音的关闭
UNPAUSE GAME Unpause the game.
解除游戏暂停
UNPAUSE TIMER Unpause the countdown timer.
解除倒计时暂停
VICTORY End scenario in victory for current player.
当前玩家任务胜利
WAIT Wait for ration milliseconds.
等待一段时间(千分之一秒)

(看5分钟后再接着看)

条件满足了就会执行结果
比如:
条件:我至少杀了一个人(player 1 kill at least one any unit)
结果:把我移动到监狱.
(Move all units for player 1 at anywhere to 监狱.)

星际RPG地图制作(三)AI的使用

首先大家应该知道的是AI脚本有两大类:
1.是无分位置(Location,以下内容不作解释)的AI脚本
2.是在指定位置运行的AI脚本
先讲第一种吧:它的Actions是Run AI Script,其中有三项
1.Send all unit on strategic suicide missions:是一种有计谋的杀戮行动!会把自己的兵力像是开扁似的全叫去打(只要去得到的地方),直至可能被杀到的敌人(包括以其敌对的电脑玩家!以下内容不作解释)全死或自己部队全死,否则就不停的杀杀杀!
2.Send all unit on random suicide missions:像是没用使用任何AI时一样,但警觉范围明显更大。
3.Switch computer player rescue passive:就是让该Player进入被缓救状态(就是你走前去就会加入的那种),简单地说该Player的Control(Player/Setting.....)变了Rescuable。

第二种的AI有很多!但其实大致分以下几类:
1.(种族省略)Custom level:星际旧版本(非血战)的建造基地AI,几乎没有进攻性。
2.还有Zerg/Terran/Protoss Campaign Easy/Medium/Difficult/Insane
以下是各难度等级的介绍:
Easy:低级的发展和进攻AI,一般用来设计系列地图的初始关。
Medium:中等级别的发展和进攻AI,比Easy更晓得发展,会造更多的兵种,在系列地图中,头几关会用得着。
Difficult:一般与玩单人模式的AI差不了多少,大家心知,所以不作介绍。
Insane:有弱智和疯狂的意思,只会疯狂地造兵和发展,有频密的进攻而且所用兵种一次比一次高级的!但一般是以量取胜,且不死掉原有的低级兵种就不会想到去发展高级的,所以弱智,但当魔法和高兵种出现时异常难对付!有时还发傻似的乱打,如果基地大而又少防守公事的话,呵呵...等受罪吧。

还有一个特别的难度(其实不是难度等级):
Area town:只采矿,几乎不发展和造兵的AI!如果用于设置任务中电脑的分基地的AI的话就非常有用(这才是真正用途)。
注:加了Expansion字眼的AI是指以血战为基础的AI,若用没有Expansion一词的AI将不造血战的新兵种(如医生之类)和不升级新的科技(如大象的速度和皮+2的升级)!当然用来有Expansion字眼的AI文件会存为SCX文件。
设置联盟状态AI脚本:
Set player to(*状态)
*Enemy:以Player为敌;
*Ally:以Player为盟。
注:这种AI与Actaion中的Set alliance status有异曲同工之效(但是并非完全一样)!
value this Area higher:使电脑玩家在所用之处放兵力防守,一般是让电脑看守重要地方或建筑的AI。
Enter closest bunker:所用之处的Terran人自动进入最近的堡垒。
还有就是进出运输工具(各族的)
(*动作)Transport:
*Enter:陆地兵种们会进入该位置的运输工具;
*Exit:相反,这个AI会使运输工具里的东东出来。
注:Enter closest bunker和Enter/Exit Transport,还有Set player to Enemy/ally是可用在人类(Human)玩家上的。

怎样才能使电脑有好的作战AI呢?
注意以下几点:1.如果让电脑白手起家的话只是将位置放在总部上即可以,
但是要记住Zerg要给1个Overlord!
2.如果开头电脑玩家有相当范围的基地就把位置几乎覆盖整个基地较好。
3.如果要一个Super电脑,可帮它设一个作弊板机,例如:
Conditions:
-Alway
Actions:
-Modify resources for Current Player:Set 5000 Ore and Gas
-Preserve trigger
这样电脑就有用不尽的资源,呵呵.......
4.别让电脑在Anywhere运行AI不然(发疯的采矿)......而且在运行AI的板机后面不要加Preserve trigger-狂造总部!!!还不能让一个电脑在二个有一定距离的地方用两个AI脚本!不然,它的工兵会跑个不停。呵呵,但可在分基地处用Campaign Area Town

星际RPG地图制作教程(四)开关的使用

这回给大家讲讲Switch的使用,到底什么是Switch?很简单,就是“开关”的意思,更可作“记号”来理解。现在先渐渐有关Switch板机中的几个知识点:
首先是Switch Action里的几个状态:
1.Set:相当于我们把开关打开。
2.Clear:和Set相反,就是把开关关闭。
3.Toggle:Set与Clear间状态的切换,就是说本来是Set的状态,Toggle发生后就变成Clear了。反过来一样。
4.Random:随机,就是让电脑选择是Set还是Clear,但是Toggle就不知道了,可用来搞RPG的“踩地雷”。
总共有256个开关!! 不会不够用了吧?呵呵,但用起来怎么搞得清哪个打哪个?这就有了Rename功能,你可以用它来为你的Switch#改名,就不会搞错啦!呵呵!
有了这些功能就可制作一些次序鲜明的地图板机。
比如要做一个先是让玩家挑难度,再让玩家选种族的地图,只用3个位置(Location),一个人族平民(Civilian),怎么才能做到两个步骤有先后分明之后呢?
这里举一例:先作三个位置分别叫Easy-Zerg,Medium-Terran,Hard-Protoss(这是用来方便记忆,其实名称随便好记就行),再作一个叫Civilian的位置(在该位置创建Terran Civilian)。
如果根据上述条件,不用“开关”即“Switch”,挑难度与选种族的步骤就会重复,很麻烦!
若使用“Switch”问题就好解决了(假如Player1是Human玩家,Player2为Computer且为Zerg):
Player:-Player2
Conditions:-Player1 bring last 1 Terran Civilian to “Easy-Zerg”
Actions:-Execute AI Script“Zerg Campaign Easy”At location“(你所选择给Player2的位置)”
- Set “Switch1”(用哪个都无所谓好记就行,也可用“Rename...”项改个好记的名字给它)
-Remove 1 Terran Civilian for playe1 at“Easy-Zerg”
-Create I Terran Civilian at “Terran Civilian”
这样就完成了第一步,下一步是挑种族了,再创建一个Civilian,再设:
Player:-player1
Conditions:-Player1 bring last 1 Terran Civilian to “Easy-Zerg”
-“Switch1”(就是上一个板机中Actions里Set的那一个)is set
Actions:-Create 1 Zerg Hatchery at “(你设哪就哪)”for Player1

在这里我是把“Switch1”作为“开关”,只要第一个板机发生了我就把“开关”打开,让地图搞清楚第一和第二个板机的先后。
这只是简单的介绍,所以其他的就不一一细讲。

再举一例:我设一个狗狗赛跑比赛(来回走),如何证实某玩家已经到达转弯点位置才回到终点呢?
看看吧:设起跑位置是Start,中转点是Turn,Player1,Player2都为Human玩家。
先是:Player:-Player1
Conditions:-Current player bring last 1 (Zergling)to“Turn”
Actions:-Set “Turned”(我把我选的Switch 用Rename项从命名为Turned了)

第二步:就设:
Player:-Player1
Conditions:-Current player bring last 1(你选择的Unit)to “Start”(来回一次了)
-“Turned”is set
Actions:-End Scenario in victory for current player(胜利板机Victory)

在这里我用“Switch”为赛跑者是否去过转弯点(叫“Turn”的那个位置)作下了记号,只要玩家去过转弯点,“Turned”就Set了,而这是胜利的板机(第二步设的那个板机)的发生条件之一。
如此每个玩家设一次,一个赛跑比赛就基本完工了!如果花点心思,可作一个越野赛地图,如果你做到了,就以本小组的那个美洲豹组长联络(最好找我,他都很忙!呵呵……)
总之,Switch可将一个甚至多个事件的放生作下“记号”,然后就可作为有利的条件,协助你做出更好的地图!

星际RPG的一些名词解释

==RPG==

原指 Use Map Setting 地图中的角色扮演类地图,后来词义扩大为有UMS地图了
经典地图:king of survival ,星际自带任务关, Diablo, Padoraths Return,Doom Quest 2.92,水龙传说,DBZ系列(龙珠),光芒之剑
RPG地图下载:http://www.wrgame.com/scrpg/down/list.asp?id=99

==UMS==

就是 Use Map Setting 模式,在建关的调速上面

==Blood==

UMS地图中的一种,特征是会不断出现兵,看谁杀的多
经典地图:zealot blood, zone control 系列,Pok閙on Bros NEW EVOLUTIONS!

Blood地图下载:http://www.wrgame.com/scrpg/down/list.asp?id=86

==Bound==

UMS地图的一种,又叫小狗地图,特征就是控制小狗,躲避危险,到达目的地
经典地图:ICE Bound,eye bound,TV bound,Mirror bound...
Bound地图下载:http://www.wrgame.com/scrpg/down/list.asp?id=87

==Defense==

UMS地图的一种,就是防御地图,特征就是阻止敌人跑到终点
经典地图:Star Photon Defense ,Tower Defense 系列,Tankders80%,Turret Defense 系列,BUILD HIGH DEENCE,Ultimate Cannon Defense
Defense地图下载:http://www.wrgame.com/scrpg/down/list.asp?id=85

==Micro==

UMS地图的一种,就是微操地图,特征就是会给你和敌人一些兵
你要以弱胜强,是一种技巧性很强的地图
经典地图:很多,都很经典,自己看吧
Micro地图下载:http://www.wrgame.com/scrpg/down/list.asp?id=94

==ETC==

指的是另类的UMS地图,如SCV Football,排球,27bug(这是介绍1.08版的bug的地图)
ETC地图下载:http://www.wrgame.com/scrpg/down/list.asp?id=98

==地图工具介绍==

SE:星际自带的地图编辑器 StarEdit
SCXE:德国出的超强编辑器 StarCraft X-tra Editor
SCMD:一个可以做一些特效的编辑器 SCMDraft
SF:一个超级变态的编辑器,但也不稳定 StarForge
ESE:比SE强一点的增强版,国内有很多网站有 Emerald StarEdit

零升级,零造兵时间的制作

其实如果你以前游戏改多了就会了解“上限”,这一点当年我改仙剑是就发现了。星际同样,任何数据都有上限,要看它储存在内存中所占的16进制字节数,单字节储存的数据上限为255,(由此可只星际中是以单字节储存角色等级数的,所以人物最多只能升到255 级,想再高用什么修改器也是回天乏数了。除非联系“暴雪”请他们把游戏程序改写。:P) 双字节是65535 ,(举个例子,我的一张地图中升第 129 级时需要消耗 65500 水晶,而升第 130 级时忽然降为 436 个水晶,我们把这叫做升翻版了,当时我设置的升级基础是消耗 1000 水晶,每升一级多消耗 500 水晶,现在大家明白是什么原因了吧。)而升级时间比较特殊,经过我的多次测试,它的上限居然是 4369 !
好了,现在我们了解了数据的上限,也知道一旦超过这个上限,数值会返回原点,那么是不是说我们输入的数据正好超过上限加1,数据就会返回 0 呢?相信很多朋友在读到上段就想到了这点了吧,请相信你的推测,因为实际情况的确如此!
好了,如果你够聪明,下面的话就不用看了,和你心中想的是一样的。
为了避免在地图编辑器中升级时间累积那一项输入“0”后点确认时系统自动返回“1”,请输入数据“4370”后点确认〉存盘。下一步就去测试一下你心爱的地图吧~,要是你把升级基础时间也调成了“0”的话…… 呵呵~“operation cwal”的感觉知道吧~~~~

添加背景音乐

您可能很喜欢星际争霸的背景音乐,但是在编辑战役的过程中您也可以加入自己喜欢的背景音乐。这一点是毫无疑问的,但是好多玩家在这个过程中遇到了好多麻烦。您不要灰心,只要您看完这篇文章就会轻而易举的解决您的问题,刚入门的初学者也可以学会使用这项高级技巧。

要播放背景音乐,只要应用到“PLAY WAV“ ACTION即可。例如:
Owner:
- Human player
Condition:
- Always
Action:
- Play ’testbgm.wav’
- Wait for (你的背景音乐的长度) milliseconds.
- Preserve Trigger

爆炸与震动效果的实现
by kink 星际学园

好莱坞的大片给我们带来的震撼效果少不了成吨的火药的铺垫。反观我们自己编的地图,怎么看怎么少了点火药味,不够刺激。

想让自己的任务火暴一点,同样少不了爆炸和震动的效果。怎么做?原理很简单: 产生一个Terran的机械单位并立刻杀死它。这样就有了爆炸效果了。不停地Center View 2个错开一点的区域(Location)就得到了震动效果。

1.爆炸效果

第一步 要定义一家电脑,并且和玩家属于不同的联盟。这样该电脑的隐型单位我们就看不到了。我们假设该玩家为Player8。
第二步 定义几个分

⑻ AI脚本后缀是什么

后辍为AI的文件是illustrator制作的文件,是矢量图,它的优点是如何放大图像都不会产生马塞克现象,也就是不会虚,是在广告、印刷包装包装方面使用的软件,能够绘图、设计等。
为打开.ai文件,可以使用与photoshop软件同属Adobe公司的illustrator软件。在正常的情况下.ai文件也可以通过photoshop打开,但打开后的图片就只是位图而非矢量图,并且背景层是透明的。至于打开后的精度,可以在打开时弹出的对话框上修改图片的分辨率。
ai文件也可以直接用Acrobat阅读器打开,但仅限于查看。

⑼ 星际争霸1的,编辑地图的“执行AI脚本”和“在位置执行AI脚本”,那些脚本的中文意思是什么

即使你在地图配置了电脑单位,如果不替它们设定,它们都只会被动防守,不会作任何行动的.所以我们必须替它们设定行动.

要设定ai,便要在电脑玩家建立Trigger,Conditions须用always,及Action使用run at script.

现在说明各script的意思:

run ai script:

Send all Units on Strategic Suicide Missions:命令电脑所有部队进行攻击,进攻方法较醒目,直至所有人类玩家死去.

Send all Units on Random Suicide Missions:和上面一样,但电脑进攻方法有点不同,只会狂攻.

Switch Computer pLayer to Rescuable:使电玩变成Rescuable.

run ai script at location:

[Expansion] Custom Level:电脑会在你指定的location建立基地,扩张及进攻.(这script是假设电脑在游戏开始时是没有任何基地的)

[Expansion] Campaign Easy:电脑会在你指定的location内的基地建设最基本的建 和军队,也会有少形进攻.

[Expansion] Campaign Medium:电脑会在你指定的location内的基地建设大部份的建 和军队及进行研究,也会有中形进攻.

[Expansion] Campaign Difficult:电脑会在你指定的location内的基地建设所有的建 和军队及进行研究,也会有大形进攻.

Campaign Area Town:电脑会在你指定的location内的基地进行防守,但不会进攻.

[Expansion] Campaign Insane:这个我都不明白....

Value this Area Higher:电脑会视你所指定的location为重要地区,会派兵到该location防守.

Set pLayer To Enemy/Ally:没有甚麽用途的script,因为Action的set alliance status可做到相同效果.

Enter Closest Bunker:命令location中的部队进入碉堡,就像下图那样.

Enter Transport:命令location中的部队进入运输机.

Exit Transport:命令location中的部队离开运输机.

注意:上面Enter closest bunker和enter transport, exit transport叁个script是可以用在人类玩家上的.

配合以上的script,便可以开始制作会动的电脑了.