cccty1l 发表于 2010-6-6 14:26:44

单位&英雄  -- 变动属性

发这个好像有点晚了,今天整理硬盘的时候找到的东西,都不知道放了多久了。

这个系统的作用就是修改单位&英雄的基础属性,调用的函数为UnitAddConditionByType(unit u,integer data,integer type)
data就是要变动的数值,可以是正,也可以是负。
type就是要变动的属性类型,我提供的有一下几类。

    //单位数据对应的地址
    //基础属性附加(1-10)(1-6)
    constant integer Unit_ATK=1;//攻击力
    constant integer Unit_DFF=2;//防御
    constant integer Unit_LL=3;//力量
    constant integer Unit_MJ=4;//敏捷
    constant integer Unit_ZH=5;//智力
    constant integer Unit_ASp=6;//攻击速读
    constant integer Unit_SW=7;//属性三围(就是力量+敏捷+智力)
    constant integer Unit_HP=8;//血上限
    constant integer Unit_MP=9;//魔法上限
    constant integer Unit_WSp=10;//移动速度

    //基础属性附加百分比(11-18)
    constant integer Unit_ATKp=18;
    constant integer Unit_DFFp=11;
    constant integer Unit_LLp=12;
    constant integer Unit_MJp=13;
    constant integer Unit_ZHp=14;
    constant integer Unit_SWp=15;
    constant integer Unit_HPp=16;
    constant integer Unit_MPp=17;


基本属性类型就是1-10这个,下面那些带p的就是指百分比,因为这个系统的初衷是给我的装备系统做的,因此有一项是提升某某属性获取百分比,或者降低的。

比如,单位的攻击+100了,而获取攻击百分比为30,那么它就+130的攻击,而百分比是-30的话,就是70了。
注意的是,如果单位某项属性的加强是负的,那么百分比就失效了,比如单位生命上限-300,生命获取百分比为20,它不会再多掉60的血,依旧是减300血上限。

那么现在如果你想增加英雄的力量20点的话,就这么调用
call UnitAddConditionByType(Hero,20,Unit_LL)
当然,这个20是在单位原有属性加强的基础上额外再增加的,所以如果大家想把增加的属性归零的话,要么记录下一共加了多少,要么就把该属性的加成百分比设置为-100。


set TestUnit=CreateUnit( P, 'Hamg', -586.2, -294.2, 137.630 )
call UnitAddAbility(TestUnit,'zBK0')
call UnitAddAbility(TestUnit,'zBK1')
call SetPlayerAbilityAvailable(P,'zBK0',false)
call SetPlayerAbilityAvailable(P,'zBK1',false)

记得给要改变属性的单位加上魔法书和禁用它们。

具体的用法大家可以看我的演示地图,因为是之前联系Znic的东西,所有都是用那种语法做的,大家不习惯的可以直接在地图的jass脚本中复制转化以后的。

再附一个w3a文件,技能等级都是4级的,方便SLK优化,然后我也把这个模板制作的SLK附上,会使用话这个还比较方便一些。

cccty1l 发表于 2010-6-6 14:35:07

代码也贴上把,因为是Znic,基本上是接近c语法的,不过那时候我还没接触过c语言,所以缩进的话貌似看起来很不舒服。

//! textmacro hash takes Q
integer $Q$hasha[],$Q$hashb[],$Q$hashc[],$Q$hashd[],$Q$hashe=1;
function $Q$_get(integer z)->integer{integer x=$Q$hasha;
while(x!=0){if($Q$hashd==z)break;x=$Q$hashc;}return x;}
function $Q$_sto(integer z)->integer{integer n=z-z/8191*8191,x=$Q$hasha,y=x;
while(x!=0){if($Q$hashd==z)return x;x=$Q$hashc;}if($Q$hashe<8191)
{x=$Q$hashe;$Q$hasha=x;if(y!=0)$Q$hashb=x;n=$Q$hashc;$Q$hashc=y;
$Q$hashd=z;if(n!=0)$Q$hashe=n;else $Q$hashe=x+1;}return x;}
function $Q$_del(integer m){integer x=$Q$hashb,y=$Q$hashc,n;if(x!=0)
{$Q$hashb=0;$Q$hashc=y;}else{n=$Q$hashd;if(n==0)return;n=n-n/8191*8191;
$Q$hasha=y;}if(y!=0)$Q$hashb=x;$Q$hashd=0;$Q$hashc=$Q$hashe;$Q$hashe=m;}
//! endtextmacro

//初始时,要调用下这个就是用//runtextmacro SetP()
//! textmacro SetP
globals
player Lp
integer Lpid
player array P
constant group G=CreateGroup()
constant force F=CreateForce()
endglobals
set P=Player(0)
set P=Player(1)
set P=Player(2)
set P=Player(3)
set P=Player(4)
set P=Player(5)
set P=Player(6)
set P=Player(7)
set P=Player(8)
set P=Player(9)
set P=Player(10)
set P=Player(11)
set P=Player(12)
set P=Player(13)
set P=Player(14)
set P=Player(15)
set Lp=GetLocalPlayer()
set Lpid=GetPlayerId(Lp)
call ForceAddPlayer(F,P)
//! endtextmacro

//! zinc

library rwshuxing
{

    constant integer Maxnum=50;
    function H2I(handle h)->integer{return h;return 0;}
    //! runtextmacro hash("Unit")

    function getunitid(unit u)->integer
    {return Unit_sto(H2I(u));}

    integer UnitT[],Unitid=1;

    public function CreateUnitDataId(unit u)->integer
    {
      integer x=getunitid(u),y=Unitid;
      if(x!=0)
      {
            if(y<8190-Maxnum)
            {
                if(UnitData!=0) Unitid=UnitData;
                else Unitid=y+Maxnum;
                UnitT=y;return y;
            }
            else Unit_del(x);
      }
      return 0;
    }

    function GetUnitDataId(unit u)->integer
    {return UnitT;}

    function DelUnitDataId(unit u)
    {
      integer x=Unit_get(H2I(u)),y;
      if(x!=0)
      {
            Unit_del(x);y=UnitT;
            if(y!=0)
            {
                UnitData=Unitid;Unitid=y;
            }
      }
    }

//! textmacro UnitSetxx takes xx,id
integer $xx$num=0;function Set$xx$(unit u,integer y){
integer x=y,z=$id$,num=0;while(y>0){y=y/4;
SetUnitAbilityLevel(u,z+num,x-y*4+1);num=num+1;x=y;}if($xx$num<=num)$xx$num=num;
else while(num<$xx$num){SetUnitAbilityLevel(u,z+num,0);num=num+1;}}
//! endtextmacro

//! textmacro UnitSetxx2 takes xx,id
function Set$xx$(unit u,integer x)
{integer y=x,num=$id$;while(x>0){x=x/4;
SetUnitAbilityLevel(u,num,y-x*4+1);UnitRemoveAbility(u,num);
UnitAddAbility(u,num);num=num+1;y=x;}}
//! endtextmacro

//! textmacro ConditionX takes xx
function UnitSet$xx$()->boolean
{unit u=tUnit;integer x;x=UnitData+tData;UnitData=x;
if(x>=0){Set$xx$(u,x*(Unit_div+UnitData)/Unit_div);Set$xx$2(u,0);}else {Set$xx$(u,0);Set$xx$2(u,-x);}
u=null;return true;}

function UnitSet$xx$p()->boolean{unit u=tUnit;integer x,y;
x=UnitData+tData;UnitData=x;y=UnitData;
if(y>=0){Set$xx$(u,y*(Unit_div+x)/Unit_div);Set$xx$2(u,0);}else {Set$xx$(u,0);Set$xx$2(u,-y);}
u=null;return true;}
//! endtextmacro

    unit tUnit;
    integer tData,tId;
    integer UnitData[];

    //设置单位附加的攻击力
    //! runtextmacro UnitSetxx("ATK","'+ATa'")
    //! runtextmacro UnitSetxx("ATK2","'/ATa'")
    //! runtextmacro ConditionX("ATK")

    //防御   !!
    //! runtextmacro UnitSetxx("DFF","'+DFa'")
    //! runtextmacro UnitSetxx("DFF2","'/DFa'")
    //! runtextmacro ConditionX("DFF")

    //攻击速度(+-500)
    //! runtextmacro UnitSetxx("ASp","'+As0'")
    //! runtextmacro UnitSetxx("ASp2","'/As0'")
    function UnitSetASp()->boolean
    {
      unit u=tUnit;
      integer x;
      x=UnitData+tData;UnitData=x;
      if(x>=0){SetASp(u,x);SetASp2(u,0);}
      else {SetASp(u,0);SetASp2(u,-x);}
      u=null;return true;
    }

    //三围!!
    //力量
    //! runtextmacro UnitSetxx("LL","'+LLa'")
    //! runtextmacro UnitSetxx("LL2","'/LLa'")
    //! runtextmacro ConditionX("LL")
    //敏捷
    //! runtextmacro UnitSetxx("MJ","'+MJa'")
    //! runtextmacro UnitSetxx("MJ2","'/MJa'")
    //! runtextmacro ConditionX("MJ")
    //智慧
    //! runtextmacro UnitSetxx("ZH","'+ZHa'")
    //! runtextmacro UnitSetxx("ZH2","'/ZHa'")
    //! runtextmacro ConditionX("ZH")
    function UnitSetSW()->boolean
    {
      unit u=tUnit;
      integer x;
      x=UnitData+tData;UnitData=x;
      if(x>=0){SetLL(u,x*(Unit_div+UnitData)/Unit_div);SetLL2(u,0);}else {SetLL(u,0);SetLL2(u,-x);}
      x=UnitData+tData;UnitData=x;
      if(x>=0){SetMJ(u,x*(Unit_div+UnitData)/Unit_div);SetMJ2(u,0);}else {SetMJ(u,0);SetMJ2(u,-x);}
      x=UnitData+tData;UnitData=x;
      if(x>=0){SetZH(u,x*(Unit_div+UnitData)/Unit_div);SetZH2(u,0);}else {SetZH(u,0);SetZH2(u,-x);}
      u=null;return true;
    }

    function UnitSetSWp()->boolean
    {
      unit u=tUnit;
      integer x,y;
      x=UnitData+tData;UnitData=x;y=UnitData;
      if(y>=0){SetLL(u,y*(Unit_div+x)/Unit_div);SetLL2(u,0);}else {SetLL(u,0);SetLL2(u,-y);}
      x=UnitData+tData;UnitData=x;y=UnitData;
      if(y>=0){SetMJ(u,y*(Unit_div+x)/Unit_div);SetMJ2(u,0);}else {SetMJ(u,0);SetMJ2(u,-y);}
      x=UnitData+tData;UnitData=x;y=UnitData;
      if(y>=0){SetZH(u,y*(Unit_div+x)/Unit_div);SetZH2(u,0);}else {SetZH(u,0);SetZH2(u,-y);}
      u=null;return true;
    }

//! textmacro ConditionX2 takes xx
function UnitSet$xx$()->boolean
    {unit u=tUnit;
    integer x,y,z,l;
    y=UnitData;x=tData;z=x+y;UnitData=z;
    l=UnitData;
    if(l>=-Unit_div)
      {if(z>=0)
            {if(y>=0) x=x*(Unit_div+l)/Unit_div;
            else x=-y+z*(Unit_div+l)/Unit_div;}
      else {if(y>=0) x=z-y*(Unit_div+l)/Unit_div;}}
    else
      {if(z>=0) {if(y>=0) x=0;else x=-y;}
      else {if(y>=0) x=z;}}
    if(x>=0) Set$xx$(u,x);else Set$xx$2(u,-x);
    return true;}

function UnitSet$xx$p()->boolean
    {unit u=tUnit;
    integer x,y,z,l,a=-Unit_div;
    x=tData,y=UnitData;z=x+y;UnitData=z;l=UnitData;
    if(l>=0)
      {if(z>=a) {if(y<a) x=z-a;}
      else {if(y>=a) x=a-y;else x=0;}
      if(x>=0) Set$xx$(u,l*x/Unit_div);else Set$xx$2(u,l*x/a);}
    return true;}
//! endtextmacro

    //生命上限
    //! runtextmacro UnitSetxx2("HP","'+HPa'")
    //! runtextmacro UnitSetxx2("HP2","'/HPa'")
    //! runtextmacro ConditionX2("HP")

    //魔法上限
    //! runtextmacro UnitSetxx2("MP","'+MPa'")
    //! runtextmacro UnitSetxx2("MP2","'/MPa'")
    //! runtextmacro ConditionX2("MP")

    //移动速度
    function UnitSetWSp()->boolean
    {
      unit u=tUnit;
      integer x;
      x=tData+UnitData;UnitData=x;x=R2I(GetUnitDefaultMoveSpeed(u))+x;
      if(x>=Unit_w_max) x=Unit_w_max;
      else {if(x<=Unit_w_min) x=Unit_w_min;}
      SetUnitMoveSpeed(u,x);
      u=null;return true;
    }




//需要传入一个物品,测试用

    public function UnitAddCondition(unit u)
    {
      integer z=1;tId=GetUnitDataId(u);tUnit=u;
      while(z<10){
      tData=GetRandomInt(0,100);
      ForceEnumPlayersCounted(F,zhuce,1);
      z=z+1;}
    }

    public function UnitAddConditionByType(unit u,integer data,integer fenlei)
    {
      tId=GetUnitDataId(u);tUnit=u;tData=data;
      ForceEnumPlayersCounted(F,zhuce,1);
    }


    conditionfunc zhuce[];
    string zhuces[];
    //几率   除数
    constant integer Unit_div=100;
    //单位移动速度区间
    constant integer Unit_w_min=150;
    constant integer Unit_w_max=400;


    //单位数据对应的地址
    //基础属性附加(1-10)(1-6)
    constant integer Unit_ATK=1;
    constant integer Unit_DFF=2;
    constant integer Unit_LL=3;
    constant integer Unit_MJ=4;
    constant integer Unit_ZH=5;
    constant integer Unit_ASp=6;
    constant integer Unit_SW=7;
    constant integer Unit_HP=8;
    constant integer Unit_MP=9;
    constant integer Unit_WSp=10;

    //基础属性附加百分比(11-18)
    constant integer Unit_ATKp=18;
    constant integer Unit_DFFp=11;
    constant integer Unit_LLp=12;
    constant integer Unit_MJp=13;
    constant integer Unit_ZHp=14;
    constant integer Unit_SWp=15;
    constant integer Unit_HPp=16;
    constant integer Unit_MPp=17;

    function onInit()
    {
    zhuce=Condition(function UnitSetATK);
    zhuce=Condition(function UnitSetATKp);
    zhuce=Condition(function UnitSetDFF);
    zhuce=Condition(function UnitSetDFFp);
    zhuce=Condition(function UnitSetLL);
    zhuce=Condition(function UnitSetLLp);
    zhuce=Condition(function UnitSetMJ);
    zhuce=Condition(function UnitSetMJp);
    zhuce=Condition(function UnitSetZH);
    zhuce=Condition(function UnitSetZHp);
    zhuce=Condition(function UnitSetSW);
    zhuce=Condition(function UnitSetSWp);
    zhuce=Condition(function UnitSetASp);
    zhuce=Condition(function UnitSetHP);
    zhuce=Condition(function UnitSetHPp);
    zhuce=Condition(function UnitSetMP);
    zhuce=Condition(function UnitSetMPp);
    zhuce=Condition(function UnitSetWSp);
    }
}
//! endzinc

kongrui05 发表于 2010-6-6 18:40:25


支持一下

魔鬼の狮子 发表于 2010-6-20 17:01:39

怎么测试啊?

frozenleave 发表于 2010-7-6 18:19:04

变动属性为什么要写那么多。。。。。
就没有直接改变攻击力的函数么,
难道就只有改变三围的?

w21m0115d01 发表于 2010-7-6 19:23:58

就没有直接改变攻击力的函数么,

答日:无

希瓦 发表于 2010-7-6 20:00:57

生命,魔法,防御也没有。

5792211 发表于 2010-7-7 22:46:15

frozenleave 发表于 2010-7-9 23:12:05

楼上水贴,,不过首发的确高明。。。

frozenleave 发表于 2010-7-9 23:12:46

那楼主怎么改动那些数据的?思路是什么?

疯人¢衰人 发表于 2010-7-11 14:21:41

vj没啥通用性……

cccty1l 发表于 2010-7-11 19:44:26

Re:单位&amp;英雄&#160;&#160;-- 变动属性

引用第9楼frozenleave于2010-07-09 23:12发表的:
那楼主怎么改动那些数据的?思路是什么? images/back.gif


其实就是位标识技术,用可以改变相应数据的技能做的。
百分比效果的话就是使用了一点点的算法。

月城明 发表于 2023-1-9 21:11:16

萌新顶一下.............................................
页: [1]
查看完整版本: 单位&英雄  -- 变动属性