皇家守卫军吧 关注:79,175贴子:873,280
  • 9回复贴,共1

【修改求助】怎样把一代英雄马格努斯改出更多的分身?

只看楼主收藏回复

1代英雄马格努斯是可以释放分身的,原版里,马格努斯是个无护甲的法师,10级满级才能放出3个分身,每个分身有几十点血量,和个位数的魔法攻击
我的想法是,马格努斯的虚影分身太废物了,能不能像我改3代花仙子catha一样,改出8个分身(soldier_catha),每个分身都有接近本体的血量和攻击?
我做了几次修改,每次都是老马在放超过3个分身的时候卡死了,以下是修改流程
看了下代码后:
1、加了护甲(这个无所谓,基本没影响,我还改过免疫敌人物理攻击的,但我要的不是这个);
2、稍微改大了近战攻击力(这个更无所谓),改大了9、10级的魔法攻击力(这个无所谓);
3、改大了虚影分身的血量和攻击力,贴上原版代码:
tt.hero.skills.mirage.health_factor = 0.3→1.0//把每个分身的血量从本体的30%改到了100%;
tt.hero.skills.mirage.damage_factor = 0.2→1.25//把每个分身的攻击力,从……不到20%,改到了接近100%。是的,这个攻击力肯定是加了系数的。我试过这里改成1.0,那么攻击力大概是本体的80%吧;
当然,到目前,也只是1个本体+3个影分身,接近4个人的攻击力,威力接近3个无技能的满级魔法塔,但离我想象的,1个本体+8个影分身,每个实体/分身都有几乎一样的攻击力,还差一大截
然后在12265行里,看到了我想改的东西:
tt.hero.skills.mirage.count = {
1,
2,
3
}
这不就是虚影分身的数量吗?第一次修改,我赶紧把分身改成1-8个: {1,2,,3,4,5,6,7,8},这里为了方便阅读就不按每行都换行来写了,大家知道意思就行
然后在测试时,老马满级了还是只有3个影分身(记不清了,应该是的),我后来查看代码,看到了这个:
tt.hero.skills.mirage.xp_level_steps = {
nil,
1,
nil,
nil,
2,
nil,
nil,
3
}
这应该是马格努斯每一级对应的虚影分身数量,很奇怪的是,总共就8级,回忆了下,原版里8级时开始有3个分身,9、10级不变。搞半天难道原因在这?赶紧把分身数量改了,大概是这样:
tt.hero.skills.mirage.xp_level_steps = {nil,1,nil,2,nil,3,nil,4,6}
改完后测试,老马在刚到8级时突然就不动作了,当然,游戏仍然在进行。老马被怪海群殴死后也无法复生。
我多测试了几次,发现老马是有了释放影分身的动作后才死机的
又查看了下代码,发现有个这,应该是每个虚影分身的角度,没有对应角度的话,超过原版3个影分身后,其他分身不知道往哪里放,的确可能引发卡死
tt.timed_attacks.list[1].entity_rotations = {
{
d2r(0)
},
{
d2r(0),
d2r(180)
},
{
d2r(0),
d2r(120),
d2r(240)
}
}
然后我赶紧把角度改好了,因为我测试时用的是6个分身,所以代码大概是这样:
tt.timed_attacks.list[1].entity_rotations = {
{
d2r(0)
},
{
d2r(0),
d2r(180)
},
{
d2r(0),
d2r(120),
d2r(240)
},
{
d2r(0),
d2r(90),
d2r(180),
d2r(270)
},
{
d2r(0),
d2r(60),
d2r(120),
d2r(180),
d2r(240),
d2r(300)
}
}
再测试,老马又卡死了……
又看了下代码,看到了这个,估计是每次释放虚影分身时,获得的经验值
tt.hero.skills.mirage.xp_gain = {
50,
100,
150
}
我猜测,估计是因为超过3个分身,没有对应的经验值,所以才卡死的?修改了代码后再测试:
tt.hero.skills.mirage.xp_gain = {150,200,350,400,450,200}
然后老马能放4个分身了,等到老马又卡死了……老马啊,老马!我到底错在哪里了呢???
@一只钱师傅
@你咋不上天啊hh
@小书生SUN
@以水


IP属地:山东1楼2024-04-01 10:39回复
    我猜技能等级只能有3级的数据,超过3级都不行,你可以改成分身数量2,4,6,或者其他任意3组数据,可以这么尝试一下。


    IP属地:广东来自Android客户端2楼2024-04-01 12:45
    收起回复
      我也试过修改分身数量,但也没有成功,只能说一下我知道的部分:
      首先技能的等级最大只有3级,英雄每升一级多一个分身之类的就别想了。
      tt.hero.skills.mirage.count = {1,2,3}这里设置三个技能等级的分身数量。
      tt.hero.skills.mirage.xp_level_steps = {nil,1,nil,nil,2,nil,nil,3}这里设置英雄等级对应的技能等级,从上到下依次对应1、2、3、4……级,如果设置通关后保留英雄等级的话需要把nil设为对应等级。
      tt.timed_attacks.list[1].entity_rotations = 这里设置分身的角度。


      IP属地:北京3楼2024-04-03 09:52
      回复
        发一下马格努斯的脚本代码,目前还没完全搞懂,不过问题应该出在这里,如果不是的话就只能挖更底层的代码了:
        scripts.hero_magnus = {}
        function scripts.hero_magnus.level_up(this, store, initial)
        local hl = this.hero.level
        local ls = this.hero.level_stats
        this.health.hp_max = ls.hp_max[hl]
        this.regen.health = ls.regen_health[hl]
        this.health.armor = ls.armor[hl]
        this.melee.attacks[1].damage_min = ls.melee_damage_min[hl]
        this.melee.attacks[1].damage_max = ls.melee_damage_max[hl]
        local ra = this.ranged.attacks[1]
        local b = E:get_template(ra.bullet)
        b.bullet.damage_min = ls.ranged_damage_min[hl]
        b.bullet.damage_max = ls.ranged_damage_max[hl]
        local s, sl
        s = this.hero.skills.mirage
        sl = s.xp_level_steps[hl]
        local a = this.timed_attacks.list[1]
        if sl then
        s.level = sl
        a.disabled = nil
        a.count = s.count[sl]
        local il = E:get_template(a.entity)
        il.level = hl
        il.health.hp_max = ls.hp_max[sl] * s.health_factor
        il.melee.attacks[1].damage_min = math.floor(ls.melee_damage_min[sl] * s.damage_factor)
        il.melee.attacks[1].damage_max = math.floor(ls.melee_damage_max[sl] * s.damage_factor)
        local ira = il.ranged.attacks[1]
        local ib = E:get_template(ira.bullet)
        ib.bullet.damage_min = math.floor(ls.ranged_damage_min[sl] * s.damage_factor)
        ib.bullet.damage_max = math.floor(ls.ranged_damage_max[sl] * s.damage_factor)
        end
        s = this.hero.skills.arcane_rain
        sl = s.xp_level_steps[hl]
        local a = this.timed_attacks.list[2]
        if sl then
        s.level = sl
        a.disabled = nil
        local c = E:get_template(a.entity)
        c.count = s.count[sl]
        local r = E:get_template(c.entity)
        r.damage_min = s.damage[sl]
        r.damage_max = s.damage[sl]
        end
        this.health.hp = this.health.hp_max
        end
        function scripts.hero_magnus.update(this, store)
        local h = this.health
        local he = this.hero
        local a, skill, brk, sta
        U.y_animation_play(this, "levelUp", nil, store.tick_ts, 1)
        this.health_bar.hidden = false
        while true do
        if h.dead then
        SU.y_hero_death_and_respawn(store, this)
        end
        if this.unit.is_stunned then
        SU.soldier_idle(store, this)
        else
        while this.nav_rally.new do
        if SU.y_hero_new_rally(store, this) then
        goto label_75_0
        end
        end
        skill = this.hero.skills.mirage
        a = this.timed_attacks.list[1]
        if not a.disabled and store.tick_ts - a.ts >= a.cooldown then
        S:queue(a.sound)
        U.animation_start(this, a.animation, nil, store.tick_ts)
        if U.y_wait(store, a.cast_time, function()
        return SU.hero_interrupted(this)
        end) then
        goto label_75_0
        end
        SU.hero_gain_xp_from_skill(this, skill)
        a.ts = store.tick_ts
        local rotations = a.entity_rotations[a.count]
        for i = 1, a.count do
        local angle = rotations[i]
        local o = V.v(V.rotate(angle, a.initial_pos.x, a.initial_pos.y))
        local r = V.v(V.rotate(angle, a.initial_rally.x, a.initial_rally.y))
        local e = E:create_entity(a.entity)
        local rx, ry = this.pos.x + r.x, this.pos.y + r.y
        e.nav_rally.center = V.v(rx, ry)
        e.nav_rally.pos = V.v(rx, ry)
        e.pos.x, e.pos.y = this.pos.x + o.x, this.pos.y + o.y
        e.tween.ts = store.tick_ts
        e.tween.props[1].keys[1][2].x = -o.x
        e.tween.props[1].keys[1][2].y = -o.y
        e.render.sprites[1].flip_x = this.render.sprites[1].flip_x
        e.owner = this
        queue_insert(store, e)
        end
        if not U.y_animation_wait(this) then
        goto label_75_0
        end
        end
        skill = this.hero.skills.arcane_rain
        a = this.timed_attacks.list[2]
        if not a.disabled and store.tick_ts - a.ts >= a.cooldown then
        local target = U.find_random_enemy(store.entities, this.pos, a.min_range, a.max_range, a.vis_flags, a.vis_bans)
        if not target then
        SU.delay_attack(store, a, 0.13333333333333333)
        else
        S:queue(a.sound)
        local flip = target.pos.x < this.pos.x
        U.animation_start(this, a.animation, flip, store.tick_ts)
        if U.y_wait(store, a.cast_time, function()
        return SU.hero_interrupted(this)
        end) then
        goto label_75_0
        end
        SU.hero_gain_xp_from_skill(this, skill)
        a.ts = store.tick_ts
        local pi, spi, ni = target.nav_path.pi, target.nav_path.spi, target.nav_path.ni
        if #target.enemy.blockers == 0 and P:is_node_valid(pi, ni + 5) then
        ni = ni + 5
        end
        local pos = P:node_pos(pi, spi, ni)
        local e = E:create_entity(a.entity)
        e.pos = pos
        queue_insert(store, e)
        if not U.y_animation_wait(this) then
        goto label_75_0
        end
        end
        end
        if SU.hero_level_up(store, this) then
        U.y_animation_play(this, "levelUp", nil, store.tick_ts, 1)
        end
        brk, sta = SU.y_soldier_melee_block_and_attacks(store, this)
        if brk or sta ~= A_NO_TARGET then
        -- block empty
        else
        brk, sta = SU.y_soldier_ranged_attacks(store, this)
        if brk then
        -- block empty
        elseif SU.soldier_go_back_step(store, this) then
        -- block empty
        else
        SU.soldier_idle(store, this)
        SU.soldier_regen(store, this)
        end
        end
        end
        ::label_75_0::
        coroutine.yield()
        end
        end


        IP属地:北京4楼2024-04-03 09:59
        回复
          现在才看到有艾特我……这个东西我没找到,大概放在马格努斯技能脚本的底层逻辑里(这个我也不能100%确定),就是这一句tt.main_script.update = scripts.hero_magnus.update,在game_scripts.lua搜hero_magnus,就可以在update目录下看到,这游戏代码挺操蛋的,有goto语句它反编译就有问题,全部是人看不懂的东西,所以你要么就把有关hero_magnus.update的内容全部重写,然后新建一个game_scripts.lua脚本,就比如我改版里的game_scripts10.lua,然后把相关的内容放进去,再在调用的那边改tt.main_script.update = scripts10.hero_magnus.update这样的


          IP属地:福建6楼2024-06-28 23:07
          回复
            还有技能不是只有3级上限的,只要你想你可以改成4级5级6级……参考我改版里的雷神一技能,比如说你可以改成每次雷神升级,1技能都能升一级,但你要把每一级的伤害变化什么的写好,不然会蓝屏。。。多说一些话吧,这游戏代码挺蠢的,毕竟可能作者也没想到会有人研究代码搞改版,像那些有mod工坊的游戏,像骑马与砍杀,暗黑地牢这些游戏都挺好改,除了一些游戏底层机制基本都能改,我也没什么能力,就是个普通的游戏发烧友,按我说改版这个东西就是一腔热血,有时候会为了一个小小的机制想破脑筋,就是完美主义这样子,至于能不能让其他人感受到这份热情,其实是玄学……


            IP属地:福建7楼2024-06-28 23:14
            回复
              关于可以改分身数量,改完后刚开始能成功召唤4个分身,5个分身,但玩着玩着就有可能会蓝屏,这个东西是最操蛋的,就是你代码肯定在某些地方没有阐述明白,比如你刚改完,效果对了,没毛病,但是某天玩着玩着就蓝屏了,然后指向底层代码,比如说gui_utils.lua这种完全不相干也没改过的脚本,我猜测就是因为它那些脚本里各种循环语句,检测你的代码,可能你刚改完没问题,玩着玩着它一检测,咦!不对!就给你蓝屏了,然后代码以为是你搞了一种新的东西,然后在底层文件里没被检测到,程序不知道你这个新代码是什么意思,就蓝屏了。。。


              IP属地:福建8楼2024-06-28 23:23
              回复
                tt.hero.skills.mirage.xp_level_steps = {
                nil,
                1,
                nil,
                nil,
                2,
                nil,
                nil,
                3这个代码是马格努斯到几级时这个mirage技能会升级,例如第一行的nil对应空值,1级马格努斯,没有获得这个技能,第二行的1代表马格努斯获得1级的mirage,然后调用1级mirage的参数(这边如果你mirage的参数没写明白就会蓝屏,或者出现你说的那种,马格努斯不动了,无法操控的情况),以此类推,所以这个技能会在马格努斯2/5/8级的时候升级。tt.hero.skills.mirage.count = {
                1,
                2,
                3
                }这个东西就是每级mirage所对应的召唤幻影数量


                IP属地:福建9楼2024-06-28 23:27
                回复
                  关于这个技能等级,你也可以写成
                  [2.0] = 1,
                  [5.0] = 2,
                  [8.0] = 3原版的二技能就是这么写的,效果完全一样,这样可能会更好理解,2级时获得1级mirage,5级时获得2级mirage这样的,也是能被这游戏的程序正确识别的。


                  IP属地:福建10楼2024-06-28 23:29
                  回复