分享创作 [天升] RPG 框架 1.0beta 版

魔凤啸天 · 2019年01月24日 · 最后由 摄影小生 回复于 2019年03月10日 · 220 次阅读

包含功能

1.数据库结构,buff、人物、技能、装备、物品构造函数(模板类)

2.整合攻击,使用技能,人物装备穿戴和卸下,buff生效的基本功能,仅需调用对应函数并按照说明传入参数即可

3.区分物理/魔法伤害,二者分开计算;区分范围/单体技能;区分技能是否能对自己生效/能否伤害自己,DIY自由度高

注意事项

1.请配合地图数据结构(不一定要地图)进行使用。内置的logic系列函数需求坐标。

2.初始化数据库game.db下的对应数据,请使用形如:game.db.buff.push(new game.mod.buff(3,['hp'],[-1],[1],true,"每下减1血","光环",false,"流血"))

的形式。

3.将源码应用于蝶梦前,请先对源码进行预处理(去除换行、制表符、/**/内的注释),以便在蝶梦编辑器内使用。如不知道怎么去的请自行百度。

计算公式

普通攻击:

Math.floor(atk_obj.ad*(1-to_obj.ad_def*0.001)+atk_obj.with_ap_k*(atk_obj.ap*(1-to_obj.ap_def*0.001)))

技能伤害:

ad_value=Math.floor((skill_obj.ad+skill_obj.ad_k*on_obj.ad)*(1-target[x].ad_def*0.001))

ap_value=Math.floor((skill_obj.ap+skill_obj.ap_k*on_obj.ap)*(1-target[x].ap_def*0.001))

版权声明

1.该RPG框架源码所有权归天升-魔凤啸天所有,天升-魔凤啸天拥有对该代码的最终解释权。

2.该源码允许修改,但不允许二次发布。使用该源码必须保留作者信息并展示给玩家/用户看。

源代码


var game={};/*主游戏*/

game.mod={};/*游戏模板类*/

game.units=[[]];/*全局单位数组,二维,同地图一起初始化。战斗时所有的单位全部在units数组上活动*/

game.logic={};/*游戏逻辑(过程)*/

game.db={};/*数据库对象*/

game.db.buff=[];/*buff数据库(数组)*/

game.db.equip=[];/*装备数据库*/

game.db.skill=[];/*技能数据库*/

game.db.hero=[];/*人物数据库*/

game.mod.hero=function(){/*lv为等级,hp血量,mp蓝量.max最大值,ad物理攻击,ap法术强度*/

    this.lv=arguments[0];

    this.hp=arguments[1];/*def两个防御,spd速度,rag攻击范围,skill为技能对象,xy为坐标,buff为状态对象*/

    this.mp=arguments[2];/*des为描述,with_ap_k为攻击时附带的ap伤害系数,bag为角色背包数组,name名字*/

    this.max_hp=arguments[3];

    this.max_mp=arguments[4];

    this.ad=arguments[5];

    this.ap=arguments[6];

    this.ad_def=arguments[7];

    this.ap_def=arguments[8];

    this.spd=arguments[9];

    this.rag=arguments[10];

    this.skill=arguments[11];

    this.x=arguments[12];

    this.y=arguments[13];

    this.buff=arguments[14];

    this.des=arguments[15];

    this.head=arguments[16];

    this.body=arguments[17];

    this.hand=arguments[18];

    this.down=arguments[19];

    this.foot=arguments[20];

    this.with_ap_k=arguments[21];

    this.bag=arguments[22];

    this.bag_max=arguments[23];

    this.name=arguments[24];

};/*回血回蓝用buff,技能实现*/

game.mod.skill=function(){/*ad物理伤害,ap法术(固定),ad_k ap_k为加成系数,atk_type为伤害类型(ad,ap,mix),*/

    this.ad=arguments[0];/*skill_type为技能类型(范围(需求中点)/单体),buff为加效果ID数组*/

    this.ap=arguments[1];/*hp_cost mp两个为消耗 can_selfuse为能否对自己用,can_atkself为能否伤害自己*/

    this.ad_k=arguments[2];/*name为名字*/

    this.ap_k=arguments[3];

    this.atk_type=arguments[4];

    this.skill_type=arguments[5];

    this.hp_cost=arguments[6];

    this.mp_cost=arguments[7];

    this.buff=arguments[8];

    this.rag=arguments[9];

    this.can_selfuse=arguments[10];

    this.can_atkself=arguments[11];

    this.des=arguments[12];

    this.name=arguments[13];

};

game.mod.buff=function(){/*time持续时间,undefined表示永久,affect_element为影响属性数组,用对应的属性名字符串来表示影响的属性*/

    this.time=arguments[0];/*affect_value为每个影响属性对应的值,k为对应影响系数*/

    this.affect_element=arguments[1];/*is_continue判断是否持续影响,或者只是一次作用*/

    this.affect_value=arguments[2];/*buff_type为buff类型,如攻击特效等.buff只能作用数值属性,其它要另外实现*/

    this.affect_k=arguments[3];/*is_affect用于标识buff是否已生效*/

    this.is_continue=arguments[4];

    this.des=arguments[5];

    this.buff_type=arguments[6];/*攻击特效的作用时间为攻击时,一般时不生效*/

    this.is_affect=arguments[7];

    this.name=arguments[8];

};

game.mod.wupin=function(){/*number数量,can_add为是否可堆叠,can_use为是否可使用,hp耐久,max最大*/

    this.number=arguments[0];/*have_buff为是否有buff,buff为使用后加上去的*/

    this.affect_element=arguments[1];

    this.affect_value=arguments[2];

    this.affect_k=arguments[3];

    this.can_add=arguments[4];

    this.can_use=arguments[5];

    this.have_buff=arguments[6];

    this.hp=arguments[7];

    this.max_hp=arguments[8];

    this.des=arguments[9];

    this.buff=arguments[10];

    this.name=arguments[11];

};

game.mod.equip=function(){/*part穿戴部分,buff为穿戴后加上的id数组,limit为限制(如等级lv)字串数组,只能是数字,value为对应值*/

    this.hp=arguments[0];

    this.max_hp=arguments[1];

    this.part=arguments[2];

    this.buff=arguments[3];

    this.limit=arguments[4];

    this.limit_value=arguments[5];

    this.des=arguments[6];

    this.name=arguments[7];

};

game.logic.buff_effect=function(on_obj,on_buff){

    let x=0;

    if(on_buff.is_continue){

        while(x<on_buff.affect_element.length){

            on_obj[on_buff.affect_element[x]]=on_obj[on_buff.affect_element[x]]*on_buff.affect_k[x]+on_buff.affect_value[x];

            x++;

        }

    }

    else{

        if(!on_buff.is_affect){

            while(x<on_buff.affect_element.length){

                on_obj[on_buff.affect_element[x]]=on_obj[on_buff.affect_element[x]]*on_buff.affect_k[x]+on_buff.affect_value[x];

                x++;

            }

            on_buff.is_affect=true;

        }

    }

    if(on_buff.time!=undefined){

        on_buff.time--;

    }

};

game.logic.extend=function(on_obj,excepts){

    let temp={};

    for(x in on_obj){

        if(x in excepts){

            continue;

        }

        else if(typeof(on_obj[x])=='object'){

            temp[x]=game.logic.extend(on_obj[x]);

        }

        else{

            temp[x]=on_obj[x];

        }

    }

    return temp;

};/*对象继承*/

game.logic.atk=function(on_obj,to_obj){/*第一个为发起单位对象,第二个为被攻击者对象*/

    if(on_obj.rag<Math.pow(Math.pow(to_obj.x-on_obj.x,2)+Math.pow(to_obj.y-on_obj.y,2),0.5)){

        return false;

    }/*勾股定理算攻击距离,如果小于返回false*/

    else{

        let atk_obj=game.logic.extend(on_obj,{'bag':0,'skill':0,'des':0,'buff':0,'head':0,'body':0,'hand':0,'down':0,'foot':0,'name':0});

        for(x in on_obj.buff){

            if(on_obj.buff[x].buff_type=="攻击特效"){

                game.logic.buff_effect(atk_obj,on_obj.buff[x]);

            }

        }

        to_obj.hp-=Math.floor(atk_obj.ad*(1-to_obj.ad_def*0.001)+atk_obj.with_ap_k*(atk_obj.ap*(1-to_obj.ap_def*0.001)));

    }

};

game.logic.put_on=function(on_obj,part,in_bag_id){/*穿戴装备,第一个为动作发起者*/

    let equip_obj=on_obj.bag[in_bag_id];

    if(equip_obj.part!=part){/*部位不对*/

        return false;

    }

    for(x in equip_obj.limit){/*不满足条件*/

        if(on_obj[equip_obj.limit[x]]<equip_obj.limit_value[x]){

            return false;

        }

    }

    if(on_obj[part]!=undefined){

        if(on_obj.bag.length==on_obj.bag_max){/*背包空间不足*/

            return false;

        }

        let linshi=game.logic.extend(on_obj[part]);

        on_obj[part]=game.logic.extend(equip_obj,{});

        on_obj.bag[in_bag_id]=linshi;

    }

    else{

        on_obj[part]=game.logic.extend(equip_obj,{});

        on_obj.bag.splice(in_bag_id,1);

    }

    for(x in equip_obj.buff){/*添加装备附加属性buff*/

        if(!game.db.buff[equip_obj.buff[x]].name in on_obj.buff){

            on_obj.buff[game.db.buff[equip_obj.buff[x]].name]=game.logic.extend(game.db.buff[equip_obj.buff[x]],{});

        }

    }

};

game.logic.take_off=function(on_obj,part){

    if(on_obj[part]==undefined){/*无装备可脱*/

        return false;

    }

    if(on_obj.bag.length==on_obj.bag_max){/*背包空间不足*/

        return false;

    }

    for(x in on_obj[part].buff){

        delete on_obj.buff[game.db.buff[on_obj[part].buff[x]].name];

    }

    on_obj.bag.push(extend(on_obj[part],{}));

    delete on_obj[part];

};

game.logic.use_skill=function(on_obj,skill_obj,to_point){

    let err=false;

    if(on_obj.hp<=skill_obj.hp_cost){/*血不够耗*/

        return false;

    }

    if(on_obj.mp<skill_obj.mp_cost){/*蓝不够*/

        return false;

    }

    let x=to_point[0],y=to_point[1],have_target=false,target=[game.units[x][y]];

    if(skill_obj.rag<Math.pow(Math.pow(x-on_obj.x,2)+Math.pow(y-on_obj.y,2),0.5)){

        return false;

    }/*施法距离不够*/

    if(target[0]==undefined){

        if(skill_obj.skill_type=="范围"){

            let start_x=on_obj.x-skill_obj.rag,start_y=on_obj.y-skill_obj.rag;

            let end_x=on_obj.x+skill_obj.rag+1,end_y=on_obj.y+skill_obj.rag+1;

            target=[];

            for(let i=start_x;i<end_x;i++){

                for(let ii=start_y;ii<end_y;ii++){

                    if(game.units[i][ii]!=undefined){

                        have_target=true;

                        target.push(game.units[i][ii]);

                    }

                }

                if(have_target){

                    break;

                }

            }

            if(!have_target){

                return false;

            }

        }

        else{

            return false;

        }

    }

    for(x in target){

        if(target[x]==on_obj&&skill_obj.can_selfuse==false){/*检测是否对自己使用*/

            err=true;

            break;

        }

    }

    if(err=true){

        return false;

    }

    let ad_value=0,ap_value=0;

    on_obj.hp-=skill_obj.hp_cost,on_obj.mp-=skill_obj.mp_cost;

    for(x in target){

        if(!(!skill_obj.can_atkself&&target[x]==on_obj)){/*如果打不了自己就不对自己造成伤害,反之目标(包括自己掉血)*/

            ad_value=Math.floor((skill_obj.ad+skill_obj.ad_k*on_obj.ad)*(1-target[x].ad_def*0.001));

            ap_value=Math.floor((skill_obj.ap+skill_obj.ap_k*on_obj.ap)*(1-target[x].ap_def*0.001));

            if(skill_obj.atk_type=="ad"){

                target[x].hp-=ad_value;

            }

            else if(skill_obj.atk_type=="ap"){

                target[x].hp-=ap_value;

            }

            else{

                target[x].hp-=(ad_value+ap_value);

            }

        }

        for(y in skill_obj.buff){

            let on_buff=game.db.buff[skill_obj.buff[y]];

            target[x].buff[on_buff.name]=game.logic.extend(on_buff,{});

        }

    }

};

加上MD后可复制代码


=:MD.game={};MD.game.mod={};MD.game.units=[[]];MD.game.logic={};MD.game.db={};MD.game.db.buff=[];MD.game.db.equip=[];MD.game.db.skill=[];MD.game.db.hero=[];MD.game.mod.hero=function(){this.lv=arguments[0];this.hp=arguments[1];this.mp=arguments[2];this.max_hp=arguments[3];this.max_mp=arguments[4];this.ad=arguments[5];this.ap=arguments[6];this.ad_def=arguments[7];this.ap_def=arguments[8];this.spd=arguments[9];this.rag=arguments[10];this.skill=arguments[11];this.x=arguments[12];this.y=arguments[13];this.buff=arguments[14];this.des=arguments[15];this.head=arguments[16];this.body=arguments[17];this.hand=arguments[18];this.down=arguments[19];this.foot=arguments[20];this.with_ap_k=arguments[21];this.bag=arguments[22];this.bag_max=arguments[23];this.name=arguments[24];};MD.game.mod.skill=function(){this.ad=arguments[0];this.ap=arguments[1];this.ad_k=arguments[2];this.ap_k=arguments[3];this.atk_type=arguments[4];this.skill_type=arguments[5];this.hp_cost=arguments[6];this.mp_cost=arguments[7];this.buff=arguments[8];this.rag=arguments[9];this.can_selfuse=arguments[10];this.can_atkself=arguments[11];this.des=arguments[12];this.name=arguments[13];};MD.game.mod.buff=function(){this.time=arguments[0];this.affect_element=arguments[1];this.affect_value=arguments[2];this.affect_k=arguments[3];this.is_continue=arguments[4];this.des=arguments[5];this.buff_type=arguments[6];this.is_affect=arguments[7];this.name=arguments[8];};MD.game.mod.wupin=function(){this.number=arguments[0];this.affect_element=arguments[1];this.affect_value=arguments[2];this.affect_k=arguments[3];this.can_add=arguments[4];this.can_use=arguments[5];this.have_buff=arguments[6];this.hp=arguments[7];this.max_hp=arguments[8];this.des=arguments[9];this.buff=arguments[10];this.name=arguments[11];};MD.game.mod.equip=function(){this.hp=arguments[0];this.max_hp=arguments[1];this.part=arguments[2];this.buff=arguments[3];this.limit=arguments[4];this.limit_value=arguments[5];this.des=arguments[6];this.name=arguments[7];};MD.game.logic.buff_effect=function(on_obj,on_buff){let x=0;if(on_buff.is_continue){while(x<on_buff.affect_element.length){on_obj[on_buff.affect_element[x]]=on_obj[on_buff.affect_element[x]]*on_buff.affect_k[x]+on_buff.affect_value[x];x++;}}else{if(!on_buff.is_affect){while(x<on_buff.affect_element.length){on_obj[on_buff.affect_element[x]]=on_obj[on_buff.affect_element[x]]*on_buff.affect_k[x]+on_buff.affect_value[x];x++;}on_buff.is_affect=true;}}if(on_buff.time!=undefined){on_buff.time--;}};MD.game.logic.extend=function(on_obj,excepts){let temp={};for(x in on_obj){if(x in excepts){continue;}else if(typeof(on_obj[x])=='object'){temp[x]=MD.game.logic.extend(on_obj[x]);}else{temp[x]=on_obj[x];}}return temp;};MD.game.logic.atk=function(on_obj,to_obj){if(on_obj.rag<Math.pow(Math.pow(to_obj.x-on_obj.x,2)+Math.pow(to_obj.y-on_obj.y,2),0.5)){return false;}else{let atk_obj=MD.game.logic.extend(on_obj,{'bag':0,'skill':0,'des':0,'buff':0,'head':0,'body':0,'hand':0,'down':0,'foot':0,'name':0});for(x in on_obj.buff){if(on_obj.buff[x].buff_type=="攻击特效"){MD.game.logic.buff_effect(atk_obj,on_obj.buff[x]);}}to_obj.hp-=Math.floor(atk_obj.ad*(1-to_obj.ad_def*0.001)+atk_obj.with_ap_k*(atk_obj.ap*(1-to_obj.ap_def*0.001)));}};MD.game.logic.put_on=function(on_obj,part,in_bag_id){let equip_obj=on_obj.bag[in_bag_id];if(equip_obj.part!=part){return false;}for(x in equip_obj.limit){if(on_obj[equip_obj.limit[x]]<equip_obj.limit_value[x]){return false;}}if(on_obj[part]!=undefined){if(on_obj.bag.length==on_obj.bag_max){return false;}let linshi=MD.game.logic.extend(on_obj[part]);on_obj[part]=MD.game.logic.extend(equip_obj,{});on_obj.bag[in_bag_id]=linshi;}else{on_obj[part]=MD.game.logic.extend(equip_obj,{});on_obj.bag.splice(in_bag_id,1);}for(x in equip_obj.buff){if(!MD.game.db.buff[equip_obj.buff[x]].name in on_obj.buff){on_obj.buff[MD.game.db.buff[equip_obj.buff[x]].name]=MD.game.logic.extend(MD.game.db.buff[equip_obj.buff[x]],{});}}};MD.game.logic.take_off=function(on_obj,part){if(on_obj[part]==undefined){return false;}if(on_obj.bag.length==on_obj.bag_max){return false;}for(x in on_obj[part].buff){delete on_obj.buff[MD.game.db.buff[on_obj[part].buff[x]].name];}on_obj.bag.push(extend(on_obj[part],{}));delete on_obj[part];};MD.game.logic.use_skill=function(on_obj,skill_obj,to_point){let err=false;if(on_obj.hp<=skill_obj.hp_cost){return false;}if(on_obj.mp<skill_obj.mp_cost){return false;}let x=to_point[0],y=to_point[1],have_target=false,target=[MD.game.units[x][y]];if(skill_obj.rag<Math.pow(Math.pow(x-on_obj.x,2)+Math.pow(y-on_obj.y,2),0.5)){return false;}if(target[0]==undefined){if(skill_obj.skill_type=="范围"){let start_x=on_obj.x-skill_obj.rag,start_y=on_obj.y-skill_obj.rag;let end_x=on_obj.x+skill_obj.rag+1,end_y=on_obj.y+skill_obj.rag+1;target=[];for(let i=start_x;i<end_x;i++){for(let ii=start_y;ii<end_y;ii++){if(MD.game.units[i][ii]!=undefined){have_target=true;target.push(MD.game.units[i][ii]);}}if(have_target){break;}}if(!have_target){return false;}}else{return false;}}for(x in target){if(target[x]==on_obj&&skill_obj.can_selfuse==false){err=true;break;}}if(err=true){return false;}let ad_value=0,ap_value=0;on_obj.hp-=skill_obj.hp_cost,on_obj.mp-=skill_obj.mp_cost;for(x in target){if(!(!skill_obj.can_atkself&&target[x]==on_obj)){ad_value=Math.floor((skill_obj.ad+skill_obj.ad_k*on_obj.ad)*(1-target[x].ad_def*0.001));ap_value=Math.floor((skill_obj.ap+skill_obj.ap_k*on_obj.ap)*(1-target[x].ap_def*0.001));if(skill_obj.atk_type=="ad"){target[x].hp-=ad_value;}else if(skill_obj.atk_type=="ap"){target[x].hp-=ap_value;}else{target[x].hp-=(ad_value+ap_value);}}for(y in skill_obj.buff){let on_buff=MD.game.db.buff[skill_obj.buff[y]];target[x].buff[on_buff.name]=MD.game.logic.extend(on_buff,{});}}};

后话

觉得有用的话不妨微信打赏支持一下~

共收到 2 条回复

后续使用框架制作的游戏可以到这里来发布,我会不定期整理到正文中。我自己的作品以及内容更新也会第一时间整入其中。

你把这些都定义成为函数了,支持一下~

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册