DotA是只使用了war3的地图编辑器制作出来的吗?还是自己也要写代码?war3提供了相应的API吗?
按时间排序
留个名,最近把13w行的dotaai读了一遍,也就那么回事
魔兽地图DotA的代码全部使用了魔兽3地图编辑器所开放的api(加入额外的API需要***诸如JAPI一类的补丁,并且需要平台支持)。美术和声音资源主要使用魔兽自带素材,也有少量导入的素材(集成在8M中)。魔兽地图文件本身是使用暴雪早期的MPQ压缩技术的资源压缩包,可以用MPQ查看器打开,和wow(6.0以前)的资源查看器几乎完全兼容。但DotA的地图文件不能用地图编辑器(World Editor)打开,因为地图编辑器的图形界面的触发编辑器需要读取额外的文件(记得是w3t还是w3g)。而保存地图时,地图编辑器会把这个触发编辑器里的内容编译为游戏本身的脚本代码,即jass(*.j文件),并在游戏运行时使用,因此这个触发编辑器的对应文件其实不是地图运行的必需品。值得一提的是jass是“Just Another Script System”的缩写。所有Jass可用的API都在魔兽3资源里的common.j(简称CJ)文件中列出。除此之外,暴雪还编写了blizzard.j(简称BJ)基于CJ提供的API,把对战初始化及一些常用的函数(比如组选取)整合起来。由于不少BJ函数本身存在泄漏问题(使用新建句柄而不回收),甚至存在正确性问题(比如组中随机选取多个对象的函数存在代码遗漏),因此多数we使用者都使用WE MOD来做图,导入修正过的BJ覆盖魔兽自带的文件等。国内这一块做的最好的,应该就是YDWE了。理论上只使用地图编辑器是可以做出DotA这样的地图的。但许多Jass里的功能难以在触发编辑器中实现,移植性和维护成本也不同,所以多数资深作者还是选用了Jass为主导的脚本来制作地图。YDWE的开发初衷之一,就是允许使用者在完全不会jass的条件下也能实现原本jass才能实现的内容。除此之外,由于触发编辑器本身可以在GUI里插入或者转化为自定义代码,因此你也完全可以在we里实现纯jass代码的制作。DotA虽然不能用we打开,但这不代表它就完全不是用we做的了。制作者完全可以用we所见即所得的编辑方式来更改地形地貌和物体属性(也可能是直接更改的slk文件),然后把编辑器生成的对应文件(比如w3e地形文件)直接提取出放入地图中,并撰写相关脚本。DotA的脚本中的变量与函数命名也经过了特殊处理,命名都是一些随机字母数字组合,毫无可读性,应该是经过命名替换处理的。DotA为什么要这么做让玩家手中的地图文件难以打开和编辑呢?这当然是为了避免玩家篡改地图,甚至利用某些版本的漏洞制作互通图。当然,由于魔兽地图本身的限制,可读性再差的代码也能被资深地图开发者所理解,但这些“加密”手段多多少少提升了破解的门槛,提升了破解的成本,对魔兽地图的反改图起到了一定的作用。
我这么说吧,你新建一张图(它自带原始技能,原始物品,原始科技树),他的大小微乎其微,也就几百k,然后你稍微写点触发,自定义点技能,就能接近1m,我曾经自定义了200多个技能,50左右物品,触发简单,就一个物品合成,地图文件就成了3m左右,然后进行加密,优化,去掉重复语句,它的大小小了近一半。这些都是铺垫,我想说的是什么呢,dota一张图7-10m左右,当然肯定是优化加密后,所以我当时就想,他得有多少语句才能有这么大的体积,后来想想他的技能并不是原技能简单的修改,物品也是那么的完美,也就不难解释了。所以,dota是张神图。我曾经拿到过icefrog改之前的一个上古版本的未加密的dota,它的大小在3m左右,我小心的打开它,才发现它是多么的精妙,虽然方式的版本英雄少,但这并不影响它是一张神图,几乎每个技能都是触发语句写的,并不是简单的新建-自定义技能,它的物品合成也是那么的精妙,我无耻的承认后来我写图有的编码也是借鉴此图的。后来转手蛙神手后,这张图迸发出强大的活力,因为它里面的技能,触发变的更为精确,物品合成变得更为方便(比如身上满六格也能买卷轴合成)。综上,dota绝对是一张神图,并且不是简单的一个人就能搞定的,icefrog也是个团队,并不是简单的一个人,这张图绝对付出了制作者的心血。
DotA这个地图,除了几位少数的一些技能,基本上都被替换成了IF自己写的技能方法了。至于原因是因为魔兽原声技能缺陷实在太多,而且十分简单。比如早期穿刺技能不仅会重置单位面朝方向,还会让单位在滞空的时候成为无敌状态。于是现在的穿刺技能实际是靠模拟来实现的。所谓模拟就是用代码来重新实现这个技能的效果,利用各种马甲,触发还有jass几乎可以模拟出一切想要的技能效果,于是现在DOTA里各种各样的仅能都一一脱出了原生技能的外衣(早期的DOTA基本就是对战里各个机能的数值修改,从6.60开始,各种各样的有趣的技能就层出不穷了)最为夸张的就是DOTA当中的物品合成机制了,魔兽平台本身的限制是当物品栏满的时候是不可以拾取物品的,这也就造成了合成装备变得十分的麻烦,if利用了某个游戏原生功能实现了更为友好的物品合成系统(具体记不太清了,不敢乱答,欢迎补充),并且重写了所有物品的合成,共享,使用机制,可谓劳模…不过频繁的用触发器还有创造删除马甲有时候运行效率不高,比如某个版本水人第一次释放E技能(变体攻击)游戏就会卡一下,早期版本玩家首选卡尔之后预读技能非常卡等等,现在都已经修复了。DOTA地图占用空间很大的一部分是loading图,把那个压缩压缩其实还能塞下很多代码,但是魔兽这引擎确实太老了,有好的技能构思即使用模拟,触发器强行实现了,各种bug还有超低的运行效率同样会毁掉游戏体验,所以现在版本停留在6.83也就不难理解了。
只有非常简单的判定和少数触发需要自己写,其它的都非常非常简单,你要是想了解,最好的方式是用帝国时代2的地图编辑器来体会一下。dota地图难度不在地图,而是在极度有限的资源里实现高品质判定和角色及物品平衡性调试。很多国产的rpg都死在平衡性上的。
3留个名,前rpg地图改图者找找老软件,晚点来答题---------------------------首先提一下地图工具的问题很多杀软和游戏平台扫描到改图工具会当作***为了账号不被罚分请不要开着平台改图请不要使用改图登陆平台请不要散播有bug的改图请不要恶意使用改图工具请不要诋毁原作者请不要在改图上删除原作者名或者假自己名字所有war3原始***文件版权属于暴雪公司所有rpg地图所有权属于原作者请在阅读以下内容前对dota和计算机常识有基本了解------------------------------推荐的工具是魔兽改图***,搜关键词百度很多这是基本 的界面我们选择第一个软件HWM--------------------------------------------------HWM中找到在war3目录maps下面download下面的dota地图以之前11更新的旧地图6.83-mu1为例打开地图以后首先修复文件头再选择分析文件得到所有的地图内文件--------------------------------------------------------------------------------------------------------------------------------------------得到分析文件以后可以使用“筛选文件”来筛选一些我们需要的东西其中blp和mdx为贴图,对游戏本质内容影响不大,可惜忽略slk为数据文件,所有基本数据都储存其中内容如字面,比如itemdata就是物品unitblance就是平衡性不详细解释我们仅仅打开一个看看这是itemdata,我们用excel打开这是itemdata,我们用excel打开最上方就能看到各个列的名称下面是不同物品的数值比如drop是控制是否不能丢弃比如盾圣剑等等但是这个slk表中我们看到的诸如是否能丢弃(drop),是否能叠加(stockmax)比如眼吃树,物品的贴图位置(file)还有物品冷却时间对应的id(cooldownid)等等,并没有看到物品具体属性,此时看表有一列ablitydata,对应的是另一个ablitydada.slk,那么相关修改再去这个slk中找,介于这几个slk关联非常复杂,不细说,有兴趣的自己挖掘-------------------------------------------------slk在普通地图中使用非常普遍,但大多数rpg地图已经不再靠修改slk实现游戏特色---------------------------------------------------再看看hwm解压出来的txt类文件大多数名字和slk命名方式一样,使用起来并不复杂但其中最有趣的是war3mapmisc.txt这是一个杂项控制解压这个txt打开看看有什么[Misc]HeroFactorXP=100,100,100,100,100GlobalExperience=0BuildingKillsGiveExp=1MaxUnitSpeed=522.0MinUnitSpeed=100.0TradingIncLarge=0TradingIncSmall=0AttackNotifyRange=1000.0DamageBonusMagic=1.25,0.75,2.00,0.35,1.00,0.75,0.05,1.00DamageBonusNormal=1.00,1.50,1.25,0.70,1.00,0.75,0.05,1.00DamageBonusPierce=2.00,0.75,0.75,0.35,1.00,0.50,0.05,1.50DamageBonusSiege=1.00,0.50,1.25,1.50,1.00,0.75,0.05,1.00BoneDecayTime=12.0DrainUsesEtheralBonus=1AgiAttackSpeedBonus=0.01AgiDefenseBase=-1.0AgiDefenseBonus=0.14StrRegenBonus=0.03StrHitPointBonus=19.0IntManaBonus=13.0IntRegenBonus=0.04AgiMoveBonus=0.0HeroAwakenLifeFactor=1.0HeroAwakenManaFactor=1.0MaxHeroLevel=25HeroExpRange=0.0ReviveBaseFactor=0.3ReviveLevelFactor=0.0ReviveMaxFactor=0.0ReviveMaxTimeFactor=4.5ReviveTimeFactor=0.1GrantNormalXPFormulaC=6.0EtherealHealBonus=1.4FrostAttackSpeedDecrease=0.2FrostMoveSpeedDecrease=0.3DayLength=300.0MaxUnitLevel=25MagicImmunesResistLeech=0EtherealDamageBonus=1.40,1.00,1.00,1.40,1.00,1.40,1.00GuardDistance=600.0MaxGuardDistance=600.0GuardReturnTime=3.0MoveSpeedBonusesStack=0CanDeactivateAvatar=0HeroReviveManaFactor=1.0HeroAwakenManaStart=0HeroReviveManaStart=0DamageBonusChaos=1.00,1.00,1.00,0.40,1.00,1.00,1.00,1.00UpkeepUsage=,,,FollowRange=0.0MagicImmunesResistDamage=1FoggedAttackRevealRadius=200.0FlyingHeroesBestowAuras=1PawnItemRange=150.0DisplayBuildingStatus=1PolymorphedUnitsBestowAuras=1HeroFactorXP=100,100,100,100,100GlobalExperience=0BuildingKillsGiveExp=1 以上控制经验增长修改这几个数字可以让升级更快MaxUnitSpeed=522.0最高移动速度,522这也是-ms能看到的玩家最快速度(无论相位对剑风杖等怎样叠加),但白牛显然超过这个速度,白牛c技能的实现是另一种方式,另外500以上移动速度在imba中还是一个成就DamageBonusMagic=1.25,0.75,2.00,0.35,1.00,0.75,0.05,1.00DamageBonusNormal=1.00,1.50,1.25,0.70,1.00,0.75,0.05,1.00DamageBonusPierce=2.00,0.75,0.75,0.35,1.00,0.50,0.05,1.50DamageBonusSiege=1.00,0.50,1.25,1.50,1.00,0.75,0.05,1.00这个是控制伤害的,但dota中玩家可控制的都是英雄攻击英雄甲所以基本不具有参考意义,但在普通对战地图中非常有用,为什么攻城单位打建筑伤害高,为什么穿刺打英雄伤害低,都是这些参数AgiAttackSpeedBonus=0.01AgiDefenseBase=-1.0AgiDefenseBonus=0.14敏捷加成,每点敏捷加1%攻速,太低了,即便小黑三级大90敏捷也加90%而已,这个参数是所有累计I以后一次计算,对一般物理输出英雄,堆敏捷显然不如直接堆攻速基础护甲为-1,每点点敏捷加0.14护甲,所以7点敏捷加一点护甲StrRegenBonus=0.03StrHitPointBonus=19.0IntManaBonus=13.0IntRegenBonus=0.04AgiMoveBonus=0.0每点力量0.03点回血,30点力量加一点回血,这也是够慢的了,每点力量19点血,每点智力13点蓝,每点智力0.04回蓝,敏捷不增加移动速度NeedHeroXP=200,500,900,00,00,00,,,,,,升级经验,另外小兵经验随着游戏时间也是增加的---------------------------------------------------------------------下面是重头戏,大家所说的jass语言,这是暴雪使用的一种简单的编程语言,和暴雪的游戏一样,易于上手,难于精通,我们在分析文件中筛选文件选择筛选文件类型 和搜索slk或者txt一样,只要搜索
文件就可以搜到,有且仅有一个j 文件,dota目前的j文件已经有2.8mb,解压这个地图并且可以使用***软件中的c文本编辑软件,这里我使用的是emedit 也是一个非常好用的文本编辑软件打开的j文件大约有十万行的代码!!!我们不求甚解仅仅想大致看看的话,举个栗子!!!function DB2 takes nothing returns nothinglocal string DC2=StringCase(GetEventPlayerChatString(),false)local boolean R4O=DC2=="-random"or DC2=="-random int"or DC2=="-random agi"or DC2=="-random str"local boolean DD2=DC2=="-repick"local boolean DE2=DC2=="-gameinfo"local boolean DF2=SubString(DC2,0,5)=="-swap"local boolean DG2=DC2=="-recreate"local boolean DH2=DC2=="-unstuck"local boolean DZ2=DC2=="-matchup"or DC2=="-ma"local boolean DV2=DC2=="-movespeed"or DC2=="-ms"local boolean DW2=DC2=="-msa"local boolean DX2=DC2=="-disablehelp"local boolean DY2=DC2=="-enablehelp"local boolean DJ2=DC2=="-creepstats"or DC2=="-cs"local boolean DK2=DC2=="-cson"or DC2=="-csoff"local boolean DL2=DC2=="-hidemsg"local boolean DM2=DC2=="-showmsg"local boolean DN2=DC2=="-weather snow"or DC2=="-weather rain"or DC2=="-weather off"or DC2=="-weather random"or DC2=="-weather wind"or DC2=="-weather moonlight"local boolean DS2=DC2=="-showdeny"or DC2=="-hidedeny"local boolean DT2=DC2=="-denyinfo"or DC2=="-di"local boolean DR2=DC2=="-don"or DC2=="-deathon"or DC2=="-doff"or DC2=="-deathoff"local boolean DP2=SubString(DC2,0,5)=="-roll"and DC2!="-rollhero"local boolean DQ2=DC2=="-hhn"or DC2=="-hideheronames"local boolean DU2=DC2=="-mute"local boolean E02=DC2=="-afk"local boolean EI2=SubString(DC2,0,8)=="-kickafk"local boolean E12=DC2=="-apm"local boolean EO2=DC2=="-clear"local boolean BPO=DC2=="-courier"local boolean AH=DC2=="-ah"local boolean E22=DC2=="-invokelist"or DC2=="-il"local boolean E32=DC2=="-list"local boolean E42=DC2=="-rolloff"local boolean E52=DC2=="-rollon"local boolean E62=SubString(DC2,0,6)=="-music"local boolean E72=SubString(DC2,0,6)=="-water"local boolean E82=SubString(DC2,0,6)=="-quote"local boolean E92=SubString(DC2,0,3)=="-cm"local boolean EA2=SubString(DC2,0,9)=="-itemswap"local boolean EB2=DC2=="-bonus"local boolean EC2=DC2=="-rollhero"or DC2=="-rh"local boolean ED2=SubString(DC2,0,9)=="-rickroll"local boolean NoSwitch=DC2=="-noswitch"local boolean EE2=SubString(DC2,0,7)=="-switch"or DC2=="-ok"or DC2=="-no"local boolean Terrain=DC2=="-terrain"or DC2=="-terrain default"or DC2=="-terrain snow"local boolean EF2=DC2=="-tips"local boolean EG2=DC2=="-ii"or DC2=="-iteminfo"local boolean EH2=DC2=="-center"or DC2=="-centeroff"or DC2=="-c"or DC2=="-co"local boolean EZ2=DC2=="-unlock"local boolean ***=DC2=="-disableselection"or DC2=="-ds"local boolean EW2=DC2=="-enableselection"or DC2=="-es"local boolean EX2=DC2=="-sleep"local boolean EY2=DC2=="-calm"local boolean R4I=DC2=="-st"local boolean EJ2=DC2=="-nosanta"call PMI("EK2",R4O)call PMI("EL2",DD2)call PMI("EM2",DE2)call PMI("EN2",DF2)call PMI("ES2",DG2)call PMI("ET2",DH2)call PMI("ER2",DZ2)call PMI("EP2",DV2)call PMI("EQ2",DW2)call PMI("EU2",DX2)call PMI("F02",DY2)call PMI("FI2",DJ2)call PMI("F12",DK2)call PMI("FO2",DL2)call PMI("F22",DM2)call PMI("F32",DN2)call PMI("F42",DS2)call PMI("F52",DT2)call PMI("F62",DR2)call PMI("F72",DP2)call PMI("F82",DQ2)call PMI("F92",DU2)call PMI("FA2",E02)call PMI("FB2",EI2)call PMI("FC2",E12)call PMI("FD2",EO2)call PMI("FE2",BPO)call PMI("FF2",AH)call PMI("FG2",E22)call PMI("FH2",E32)call PMI("FZ2",E42)call PMI("FV2",E52)call PMI("FW2",E62)call PMI("FY2",E72)call PMI("FJ2",E82)call PMI("FK2",E92)call PMI("FL2",EA2)call PMI("FM2",EB2)call PMI("FN2",EC2)call PMI("FS2",ED2)call PMI("FT2",EE2)call PMI("FR2",EG2)call PMI("FP2",EF2)call PMI("FQ2",EH2)call PMI("FU2",EZ2)call PMI("G02",***)call PMI("GI2",EW2)call PMI("G12",EX2)call PMI("GO2",R4I)call PMI("G22",EY2)call PMI("G32",EJ2)endfunction这是一个function,所用是当玩家在聊天窗口打出以上字符时的过程其中最最常用就是
-random了 当玩家打出 -random 或者 -random int agi str 等命令会执行function EK2,那么这个EK2是做什么的呢?搜索function EK2function EK2 takes nothing returns nothinglocal player T4I=GetTriggerPlayer()local trigger tset L2=T4Iif G52()and F3[GetPlayerId(T4I)]==false thenset F3[GetPlayerId(T4I)]=truecall TFI(T4I)call DisplayTimedTextToPlayer(T4I,0,U2,10,GetObjectName())set t=CreateTrigger()call TriggerRegisterTimerEvent(t,6,false)call TriggerAddCondition(t,Condition(function G62))call SavePlayerHandle(LY,(GetHandleId(t)),(54),(T4I))call SaveStr(LY,(GetHandleId(t)),(146),(StringCase(GetEventPlayerChatString(),false)))endifset t=nullendfunction这里已经调用了大量的触发,如果不一一查找下去,我们已经看不懂了。只能看到添加了一个G62的触发 再来试试看看这G62是做什么的,搜索这个functionfunction G62 takes nothing returns booleanlocal trigger t=GetTriggeringTrigger()local integer S5I=GetHandleId(t)local player p=(LoadPlayerHandle(LY,(S5I),(54)))local string G72=(LoadStr(LY,(S5I),(146)))set L2=pif G52()thenset S0[GetPlayerId(p)]=trueif G72=="-random int"thencall RAI(p)call SetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)-100)elseif G72=="-random str"thencall REI(p)call SetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)-100)elseif G72=="-random agi"thencall RFI(p)call SetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)-100)elsecall SetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)-50)call RGI(p)endifelsecall DisplayTimedTextToPlayer(p,0,U2,10,GetObjectName())endifset t=nullset p=nullreturn falseendfunction这里又出现了RAI REI RGI RFI G52等几个触发,我们也不去管他了,只看不继续触发的内容if G72=="-random int"thencall RAI(p)call SetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)-100)elseif G72=="-random str"thencall REI(p)call SetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)-100)elseif G72=="-random agi"thencall RFI(p)call SetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)-100)elsecall SetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p,PLAYER_STATE_RESOURCE_GOLD)-50)call RGI(p)endif这几个if语句还是很好理解的,根据这四个玩家输入的命令,分别扣掉玩家gold100或者50话说我第一次知道还可以仅随机力量或者智力敏捷英雄以上所有代码仅仅为了执行一个工作当玩家敲了-random 时扣除50块钱当然还执行了其他一些工作,不过还有其他的触发,我们已经没有一一深入下去了如果仅仅就这一段进行修改也是可以的比如我们将这里的50 改成0出门 就可以多一个树枝了,对于有些英雄,差距就是出门更早出一个大魔棒了再看一个ifif S0[GetPlayerId(Me)]==true and D0[GetPlayerId(Me)]==false and RZ0[GetPlayerId(Me)]==0 thenset RZ0[GetPlayerId(Me)]=1call SetPlayerState(Me,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(Me,PLAYER_STATE_RESOURCE_GOLD)-100)endifif S0[GetPlayerId(GH2)]==true and D0[GetPlayerId(GH2)]==false and RZ0[GetPlayerId(GH2)]==0 thenset RZ0[GetPlayerId(GH2)]=1call SetPlayerState(GH2,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(GH2,PLAYER_STATE_RESOURCE_GOLD)-100)endif这里可以通过修改实现-repick不花钱所以基本上可以说整个jass除了已经定义好的变量十万行代码里基本都是这些无数个function组成的因此有答主说jass是个面向触发的编辑器也是很有道理的一个简单的功能或者技能需要几十个上百个function实现在此向历代dota作者表示由衷的钦佩这里的栗子只解释了如何修改-random和-repick时减少的金钱,更复杂的修改技能等内容,需要大量时间摸索,本人经历有限就不描述了像mimiya这样能实现dota imba的修改的优秀改图者,是消耗了大量的时间精力的-------------------------------------------------------------本人并未修改或研究过任何版本的dota地图,仅以提供的工具解释修改地图的基本过程,修改的程度是极浅的本人并未完整学习过任何计算机编程语言,有专用词语使用上的错误,请诸位码农谅解本人认为在j语言的使用上,dota已经达到一个相当复杂的高度,针对题主的问题,我的直接***是:仅仅使用自带的worldedit编辑器不可能实现dota,历代作者多年修改必定涉及到代码层,也就是j文件暴雪方面是否有提供给几位作者专门的api不得而知但仅仅worldedit编辑器的话,尽管在***war3时的用户协议声明会提供技术支持,但是在每次运行世界编辑器时有一个直接的提示!暴雪是不提供任何技术支持的!是的,暴雪爸爸你最?!
这问题是09问的吗
魔兽自带脚本jass多半都是用那个写的另外,如果题主对魔兽地图创作感兴趣,安利下载YDWE这个软件,其中的功能使你能在不会jass也能完成大部分程序
题主你可以稍微百度一下地图编辑器新手教学就知道了。
DOTA 的图没有使用任何奇怪的技术,代码是魔兽的脚本语言 JASS 写的。DOTA 这图很牛叉,几乎把所有的魔兽技能都用代码重制了,而且为了比如满物品栏合成这样的 feature,所有的物品都有若干个副本。
看到这个问题想到了我高中的岁月啊,像DotA这种显然是要自己写代码了,魔兽自己有一种语言叫做jass,是一种四不像语言。因为虽然理论上你可以在触发器里面完成所有工作但是触发器的效率远没有jass高
用war3地图编辑器开发Dota分为很多部分,单位属性技能属性等一般用物体编辑器,还有包括触发编辑器,声音编辑器,AI编辑器,地形编辑器等部分。回到题主的问题上,我把只要用编辑器理解为不用写代码,如果是开发类Dota地图的话,是有可能的,触发编辑器通过简单的图形化事件编程(event-condition-action)可以自动生成需要的代码,事实上大部分人都是这样开头的。回到Dota上,Dota作者冰蛙使用了编辑器提供的更高效的脚本语言jass,当然编辑器肯定要提供api的(jass语法类似vb,不过不是面向对象的),代码量超过了9W行,具体大小(指拆图出来的war3map.j文件)在2.7m左右(我拆的图是6.80版本的,包括定义的全局变量)
就是简单的脚本语言+所见即所得的编辑~不过里面的API很坑爹~原始API封装了就变成带有那个BI还是什么开头的API,带有那个啥字样的再封装就是Trigger效率极其低下,如果纯用trigger做 DOTA几乎随时崩,魔兽地图大小就只允许那么1,5M还是多少哦 忘了。然后一张地图的代码只存在了script.txt文件里 ,非常不利于协同开发和调试。里面是事件机制的,给单位注册事件。写代码一不注意就要memory leak!恶心!另外补充下 DOTA就 5K左右的代码~ ICE FROG自己写了一个引用计数的东西来管理内存,然后你能看到的就是一堆触发!可以总结成 :面向触发编程~
大部分可视内容是直接通过war3地图编辑器实现,一部分核心内容是代码实现,据说是C语言网上放出过一个解密版的DOTA地图可以研究一下
已有帐号?
无法登录?
社交帐号登录(window.slotbydup=window.slotbydup || []).push({
id: '2397579',
container: s,
size: '680,60',
display: 'inlay-fix'
《Dota2》自定义制作工具 RPG地图我来了
发表时间: 13:14:03|
编辑:夜洛
《DOTA2》作为当下最火爆的MOBA网游之一,每天有数以万计的玩家沉浸在天辉夜魇的战斗之中。然而,我们都知道,《DOTA》是依据暴雪著名RTS游戏《魔兽争霸3》而制造出的地图,而在《魔兽争霸3》中,玩家可以进行各种各样有趣的地图的开发,最为出名的莫过于《DOTA》、《真三》、《守卫剑阁》、《澄海》等等,不过在《DOTA2》中却没有这样的功能。不过就在今天,IceFrog在微博宣布,正式推出了Dota 2自定义游戏制作工具!这意味着未来我们能够在《DOTA2》中进行各种各样的,包括将其打造成RPG游戏!微博截图
Dota2,自定义制作工具,RPG地图
热门游戏专题
猜你喜欢的游戏