3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 8231|回复: 9
打印 上一主题 下一主题

[讨论] 【MOD向】技能修改的新新新手入门

  [复制链接]

114

主题

3582

帖子

3857

积分

游戏精英

Rank: 8Rank: 8

贡献度
431
金元
20730
积分
3857
精华
6
注册时间
2008-1-10
跳转到指定楼层
主题
发表于 2012-2-4 19:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zjwzero 于 2012-2-5 21:05 编辑

首先,统一下文件的路径:game\modules\tome-3.9.37.team\ ;接下来列出的路径请自行前后相接

接下来我介绍一下掌管【种族】以及【职业】效果的一系列文件路径,及其关联方式。

我们打开游戏,选择新游戏进入的界面,需要选择一个种族,以及一个职业。它们其实很简单的就放在某个固定的文件路径中,其中的内容也是一目了然。
【种族】这个文件就放在:“data\birth\races”里面
【职业】:“data\birth\classes”
这些文件夹里面的文件都可以用“txt”打开,当然我还是推荐你们用一些具有基础编程能力的工具打开,至少也得是notepad2这类“txt”工具

这些文件都写了许多内容,但是你可以发现里面没有编写任何的【技能】,这是因为它们都采用了“引用”的方式来表达。
那么,我们只需要找到引用的路径就能知道那些【技能】隐藏在哪里。

我选择一个种族文件elf.lua来方便介绍

接下来你们看到的内容就是所谓的种族文件之一,精灵种族
接下来你们会看到3个以newBirthDescriptor开头的大括号及其内容。很容易联想到,游戏选择的时候不是有个种族总类别吗:

-精灵
永恒精灵
自然精灵

就是如此,这三个大括号就是这个意思,至于它们的格式为什么是这样不重要,只要你完完全全的按照这个格式去模仿,就能轻松的制作出新的种族选项,但是,种族技能就另当别论了。

先过目一下,只需过目一下就可以了,接下来我再介绍【技能】的引用位置
【elf.lua】***************************************【Start】
---------------------------------------------------------
--                       Elves                         --
---------------------------------------------------------
newBirthDescriptor{
        type = "race",
        name = "Elf",
        display_name = "精灵",
        desc = {
                "    精灵这个名字通常被用来不正 确地称呼整个精灵种族。",
                "    精灵分为 3个相互联系的种族 而目前只有两种还幸存着。",
                "    除了永恒精灵用魔法保持永生 其他精灵通常能活一千年。",
                "    在不同的精灵种族之间他们对 世界的看法很不相同。",
        },
        descriptor_choices =
        {
                subrace =
                {
                        Shalore = "allow",
                        Thalore = "allow",
                        __ALL__ = "disallow",
                },
                subclass =
                {
                        -- Only human and elves make sense to play celestials
                        ['Sun Paladin'] = "allow",
                        Anorithil = "allow",
                        -- Only human, elves, halflings and undeads are supposed to be archmages
                        Archmage = "allow",
                },
        },
        copy = {
                type = "humanoid", subtype="elf",
                starting_zone = "trollmire",
                starting_quest = "start-allied",
                resolvers.inventory{ id=true, {defined="ORB_SCRYING"} },
                resolvers.generic(function(e) e.hotkey[10] = {"inventory", "鉴定水晶球"} end),
        },
}

---------------------------------------------------------
--                       Elves                         --
---------------------------------------------------------
newBirthDescriptor
{
        type = "subrace",
        name = "Shalore",
        display_name = "永恒精灵",
        desc = {
                "    永恒精灵与魔法世界有着千丝 万缕的联系,曾一度出现过许多伟 大的魔法师。",
                "    尽管如此,他们仍试图保持避 世并隐藏他们的魔法能力。因为他 们深深记得那一段血腥的历史魔法 会战(Spellblaze)还有紧随其后 的魔法猎捕(Spellhunt)。",
                "    他们天生掌握#GOLD#不朽的恩赐#WHITE#,允 许他们在短时间内提高移动速度。",
                "#GOLD#属性修正:",
                "#LIGHT_BLUE# * -2 力量,+1 敏捷,+0 体质",
                "#LIGHT_BLUE# * +2 魔法,+3 意志,+1 灵巧",
                "#GOLD#每等级增加生命值:#LIGHT_BLUE# 9",
                "#GOLD#经验惩罚:#LIGHT_BLUE# 35%",
        },
        inc_stats = { str=-2, mag=2, wil=3, cun=1, dex=1, con=0 },
        experience = 1.3,
        talents_types = { ["race/shalore"]={true, 0} },
        talents = { [ActorTalents.T_SHALOREN_SPEED]=1 },
        copy = {
                moddable_tile = "elf_#sex#",
                moddable_tile_base = "base_shalore_01.png",
                moddable_tile_ornament = {female="braid_02"},
                random_name_def = "shalore_#sex#", random_name_max_syllables = 4,
                default_wilderness = {"playerpop", "shaloren"},
                starting_zone = "scintillating-caves",
                starting_quest = "start-shaloren",
                faction = "shalore",
                starting_intro = "shalore",
                life_rating = 9,
                resolvers.inscription("RUNE:_SHIELDING", {cooldown=14, dur=5, power=100}),
                resolvers.inscription("RUNE:_PHASE_DOOR", {cooldown=7, range=10}),
        },
        experience = 1.35,
        random_escort_possibilities = { {"scintillating-caves", 2, 3}, {"daikara", 1, 3}, {"old-forest", 1, 5}, {"dreadfell", 1, 8}, {"reknor", 1, 2}, },
}

newBirthDescriptor
{
        type = "subrace",
        name = "Thalore",
        display_name = "自然精灵",
        desc = {
                "    在大部分岁月里,自然精灵隐 藏在丛林里,很少离开。岁月流逝, 这一习惯都没有改变。",
                "    他们长期隐居在自然中,由于 和自然的紧密联系,自然精灵成为 自然秩序的保护者,并与他们的近 亲永恒精灵处于对立状态。",
                "    他们天生掌握#GOLD#自然之怒#WHITE#,允许他们 在短时间内提高伤害和抵抗。",
                "#GOLD#属性修正:",
                "#LIGHT_BLUE# * +2 力量,+3 敏捷,+1 体质",
                "#LIGHT_BLUE# * -2 魔法,+1 意志,+0 灵巧",
                "#GOLD#每等级增加生命值:#LIGHT_BLUE# 11",
                "#GOLD#经验惩罚:#LIGHT_BLUE# 35%",
        },
        inc_stats = { str=2, mag=-2, wil=1, cun=0, dex=3, con=1 },
        experience = 1.3,
        talents_types = { ["race/thalore"]={true, 0} },
        talents = { [ActorTalents.T_THALOREN_WRATH]=1 },
        copy = {
                moddable_tile = "elf_#sex#",
                moddable_tile_base = "base_thalore_01.png",
                moddable_tile_ornament = {female="braid_01"},
                random_name_def = "thalore_#sex#",
                default_wilderness = {"playerpop", "thaloren"},
                starting_zone = "norgos-lair",
                starting_quest = "start-thaloren",
                faction = "thalore",
                starting_intro = "thalore",
                life_rating = 11,
                resolvers.inscription("INFUSION:_REGENERATION", {cooldown=10, dur=5, heal=60}),
                resolvers.inscription("INFUSION:_WILD", {cooldown=12, what={physical=true}, dur=4, power=14}),
        },
        experience = 1.35,
        random_escort_possibilities = { {"norgos-lair", 2, 3}, {"heart-gloom", 1, 2}, {"daikara", 1, 3}, {"old-forest", 1, 5}, {"dreadfell", 1, 8}, {"reknor", 1, 2}, },
}
【elf.lua】***************************************【End】

从上面的内容可以看出,虽然这个文件没有编写【技能】,但是种族的属性修正却明摆在那里,你们还可以看到其它的信息,例如经验惩罚,这些暂且不谈,最重要的,技能的引用链接分别是
永恒精灵:talents_types = { ["race/shalore"]={true, 0} },
自然精灵:talents_types = { ["race/thalore"]={true, 0} },

它们分别对应了文件路径:
永恒精灵:data\talents\misc\ 文件races.lua里面搜索shalore,可得到这样一句话
newTalentType{ type="race/shalore", name = "永恒精灵", generic = true, is_spell=true, description = "角色所拥有的各种种族专长技能。" }
注意这个type="race/shalore"
自然精灵:data\talents\misc\ 同上

按照我个人的理解,文件放在哪里关系不是太大,关键就在于这句话,elf.lua中引用的路径“race/shalore”正好与 races.lua中的type="race/shalore"重合了,至于细节上,文件在不讲究的情况下大致放在哪个位置就行了,我没有研究过,但肯定是有一定讲究的,就目前而言,纯粹的模仿路径就足够了。


另外就是职业路径,有些不同,随便打开“data\birth\classes”的一个文件mage.lua

就以大法师为例子。你找不到只引用某个技能的路径,取而代之的是一大堆引用技能的路径

接下来先过目,过目就可以了
【mage.lua的片段】**********************************【Start】
newBirthDescriptor{
        type = "subclass",
        name = "Archmage",
        display_name= "元素法师",
        locked = function() return profile.mod.allow_build.mage end,
        locked_desc = "憎恨、折磨、追捕、隐藏... 我们 的道路被禁止,但是我们的事业是 公正的。在我们隐藏的山谷里我们 自由学习我们自己的魔法艺术从这 个世界的愤怒中寻求抚慰。只有友 谊和宽容才能获得我们的信任。",
        desc = {
                "    对一个元素法师来说魔法超越一切, 他们尽其一生学习魔法。",
                "    元素法师缺乏最基本的物理格斗技 能,他们用魔法取而代之。",
                "    元素法师从学院里获得魔法知识, 他们通常拒绝任何妖术。",
                "    元素法师在一个名叫Angolwen的秘 密小镇接受训练,并拥有一个直接 传送到那里的独特技能。",
                "他们最重要的属性是:魔法和意志。",
                "#GOLD#属性修正:",
                "#LIGHT_BLUE# * +0 力量,+0 敏捷,+0 体质",
                "#LIGHT_BLUE# * +5 魔法,+3 意志,+1 灵巧",
        },
        stats = { mag=5, wil=3, cun=1, },
        talents_types = {
                ["spell/arcane"]={true, 0.3},
                ["spell/fire"]={true, 0.3},
                ["spell/earth"]={true, 0.3},
                ["spell/water"]={true, 0.3},
                ["spell/air"]={true, 0.3},
                ["spell/phantasm"]={true, 0.3},
                ["spell/temporal"]={false, 0.3},
                ["spell/meta"]={false, 0.3},
                ["spell/divination"]={true, 0.3},
                ["spell/conveyance"]={true, 0.3},
                ["spell/aegis"]={true, 0.3},
                ["cunning/survival"]={false, -0.1},
        },
        unlockable_talents_types = {
                ["spell/wildfire"]={false, 0.3, "mage_pyromancer"},
                ["spell/ice"]={false, 0.3, "mage_cryomancer"},
                ["spell/stone"]={false, 0.3, "mage_geomancer"},
                ["spell/storm"]={false, 0.3, "mage_tempest"},
        },
        birth_example_particles = "arcane_power",
        talents = {
                [ActorTalents.T_ARCANE_POWER] = 1,
                [ActorTalents.T_FLAME] = 1,
                [ActorTalents.T_LIGHTNING] = 1,
                [ActorTalents.T_PHASE_DOOR] = 1,
        },
        copy = {
                -- Mages start in angolwen
                class_start_check = function(self)
                        if self.descriptor.world == "Maj'Eyal" and (self.descriptor.race == "Human" or self.descriptor.race == "Elf" or self.descriptor.race == "Halfling") then
                                self.archmage_race_start_quest = self.starting_quest
                                self.default_wilderness = {"zone-pop", "angolwen-portal"}
                                self.starting_zone = "town-angolwen"
                                self.starting_quest = "start-archmage"
                                self.starting_intro = "archmage"
                                self.faction = "angolwen"
                                self:learnTalent(self.T_TELEPORT_ANGOLWEN, true, nil, {no_unlearn=true})
                        end
                end,

                max_life = 90,
                resolvers.equip{ id=true,
                        {type="weapon", subtype="staff", name="榆木法杖", autoreq=true, ego_chance=-1000},
                        {type="armor", subtype="cloth", name="亚麻长袍", autoreq=true, ego_chance=-1000},
                },
        },
        copy_add = {
                life_rating = -4,
        },
}
【mage.lua的片段】**********************************【End】
这个文件的内容中
talents_types = {
}
这里面的内容十分丰富,它们就是这个职业所具备的所有技能。
而这所有技能的引用路径都在“data\talents\”里面

以闪电系为例子:["spell/air"]={true, 0.3}, (这个true表示不需要投入大系点来解锁,0.3是系数,表示1.3你懂的
你可以在“data\talents\spells”里面的air.lua文件里看到
分别有4个技能,而每一个技能都有一个type:
闪电术:type = {"spell/air", 1},
连锁闪电:type = {"spell/air", 2},
风之羽翼:type = {"spell/air",3},
闪电风暴:type = {"spell/air", 4},
很容易理解了把,1、2、3、4表示技能的需要,你必须学习前面几个技能才能学习后面的技能的意思,技能的排序则直接按照文件中编写的顺序决定,“spell/air”则是关键所在。。。。。。你们会发现,这个文件的路径是“data\talents\spells\air.lua”,这之中的“spells”&“air.lua”组合起来并不是"spell/air"和种族技能是一样的,这个lua语言在此处的应用并不在意文件名,关键是type来连接各个位置的引用,所以air.lua即使改成了“use ege hit LZ.lua”也没关系。虽然lua语言肯定存在着直接引用文件名的功能,但是此处无关。

也正如你们所看到的,一个技能系到底有多少个技能,只需要type = {"spell/air", 5}, 这样无限制的加下去就OK了。



其实还有很多其它的功能,例如技能属性需求,等级需求,但我只是大概的让你们了解一下,就不细说了。

而最后,同样是大概的让你们了解一下,【单个技能】是如何编写的 (至少看起来是这样

继续以闪电系为例子,也就是这个air.lua文件里面的闪电术

它的代码如下,过目一下就可以了,我在这之中会有一些简单的注释,详细的以后再讨论,毕竟我也看得不是很懂

好了,初初初级入门完毕,打酱油去。。。
<

评分

2

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-4-1 04:31 , Processed in 0.031736 second(s), 20 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表