Menu

新增等级系统

重新制作了状态显示界面,可以查看到个人的等级,经验相关的东西。

如图:

增加了Level Info的显示。

其中 Level 代表当前等级。

Exp 代表了当前经验和升级需要的经验。

Ability Point 代表了能力点数,熟称AP。每升一级,会获得一点AP,AP永远都会累加。

但等级超过了一定数量后,可以在NPC处购买转生契约,可以重置等级和经验,又重一级开始练。因为越到高级,等级需要的经验很多,所以很难继续下去,选择转生是一个不错的选择,可以轻松的获得AP。

AP用来做什么呢,目前AP的定义暂时保留,当然,肯定新技能的提升会用到AP点数。所谓的新技能,是原本游戏中根本不存在我自定义的技能。比如金属转换,比如魔法释放,比如高级打铁,高级裁缝等等等这些技能。

然后最后一个是Desting Count,所谓的转生次数。也就是你自己当前转过多少次了。

以后估计还会出一个累计等级吧。让你知道你一共练了多少级别。我也希望本站以后有上万级的玩家。

经验怎么获得呢?

目前首先开放了杀怪的方式,无论是你自己杀怪,还是你的宠物杀死怪物。。。当然,强调一下,杀死玩家也可以升级,以PK升级的也可以选择的路线,虽然很血腥,但是还是爽爽的。

宠物杀怪拥有者不获得经验的BUG已经修复了,近期服务器更新后,就会有效果了。

这个是升级的示意图,其中Congratulation , You are level up !是代表你已经升级了。也就是你成功的到达了下一个等级。

You got 3075 experience ! 代表你获得了3075点经验。

Now you exp completed 61% by level need now!是说,你完成了提升等级需要的经验比是61%,也就是你还差39%的经验就升级了。具体需求的经验可以在自己的状态里面查看。

无论你是打开自己的面板,还是别人的面板,都能看到对应角色的等级,在下方会有显示。

等级系统目前还在完善,后续会陆续添加很多功能:)

本站的Ultima Online的QQ群是:286813070…欢迎大家多多宣传也多来玩吧:)

have fun !

上面说了功能,那么下面说说代码。

我阅读了下脚本相关的代码。在角色创建的代码中加入了默认的等级。然后在登录中检测,这个检测是为了确保以前服务器上的玩家在创建时候并没有这个系统的一个补注。

然后在怪物死亡的时候判断杀死他的生物,如果是玩家或者是玩家的宠物,就给予对应生物经验的奖励。

这个系统本身实现起来没有任何的复杂度。我自己做了一个存档版本类型,用来兼容以前的存档。这个是为了保证文档序列化的唯一性。

代码如下:

这个是给予经验的代码片段。其中包括了检测是不是玩家杀死,或者是不是玩家宠物杀死的。也包含了简单的经验值计算方式。



if (willKill && from is PlayerMobile)
            {
                Timer.DelayCall(TimeSpan.FromSeconds(10), new TimerCallback(((PlayerMobile)from).RecoverAmmo));

                // modify by garfield

                int _a = Utility.RandomMinMax(0, 5);
                int _b = Utility.RandomMinMax(0, 5);
                int _c = Utility.RandomMinMax(0, 5);
                int _d = Utility.RandomMinMax(1, 5);

                int _exp = (int)(Str * _a + Dex * _b + Int * _c + SkillsTotal / _d);

                ((PlayerMobile)from).GetExp(_exp);

                
            }
            else if (willKill && from is BaseCreature)
            {
                if (((BaseCreature)from).Controlled && ((BaseCreature)from).ControlMaster != null)
                {
                    Mobile _ControlMaster = ((BaseCreature)from).ControlMaster;

                    if (_ControlMaster is PlayerMobile)
                    {
                        int _a = Utility.RandomMinMax(0, 5);
                        int _b = Utility.RandomMinMax(0, 5);
                        int _c = Utility.RandomMinMax(0, 5);
                        int _d = Utility.RandomMinMax(1, 5);

                        int _exp = (int)(Str * _a + Dex * _b + Int * _c + SkillsTotal / _d);

                        ((PlayerMobile)_ControlMaster).GetExp(_exp);
                    }
                }
            }

需求经验初始化代码,这个函数是初始化每级需要经验的。。其实也不算很变态。


public static void Initialize()
        {
            LevelExp = new uint[LevelMax];

            for (int i = 0; i < LevelMax; ++i)
            {
                int _baseExp = 1000;

                if ( i < 2 )
                {
                    LevelExp[i] = (uint)_baseExp;
                    continue;
                }

                if (i > 10 && i <= 20)
                {
                    //case lv11 1000 + 500
                    _baseExp += ((i - 1) * 10);
                }
                else if (i > 20 && i <= 30)
                {
                    //case lv11 1000 + 500
                    _baseExp += ((i - 1) * 30);
                }
                else if (i > 30 && i <= 40)
                {
                    //case lv11 1000 + 500
                    _baseExp += ((i - 1) * 40);
                }
                else if (i > 40 && i <= 50)
                {
                    //case lv11 1000 + 500
                    _baseExp += ((i - 1) * 50);
                }
                else if (i > 50 && i <= 70)
                {
                    //case lv11 1000 + 500
                    _baseExp += ((i - 1) * 65);
                }
                else if (i > 70 && i <= 100)
                {
                    //case lv11 1000 + 500
                    _baseExp += ((i - 1) * 80);
                }
                else if (i > 100 && i <= 150)
                {
                    //case lv11 1000 + 500
                    _baseExp += ((i - 1) * 120);
                }
                else if (i > 150 && i <= 200)
                {
                    //case lv11 1000 + 500
                    _baseExp += ((i - 1) * 180);
                }
                else if (i > 200)
                {
                    //case lv11 1000 + 500
                    _baseExp += ((i - 1) * 225);
                }

                LevelExp[i] = (uint)((i - 1) * _baseExp);
            }
        }

嗯嗯,我觉得这个系统游泳的代码就这2处。其他的都是浮云。

Categories:   Garfield's Diary

Comments