单位&英雄 -- 变动属性
发这个好像有点晚了,今天整理硬盘的时候找到的东西,都不知道放了多久了。这个系统的作用就是修改单位&英雄的基础属性,调用的函数为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附上,会使用话这个还比较方便一些。 代码也贴上把,因为是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
支持一下 怎么测试啊? 变动属性为什么要写那么多。。。。。
就没有直接改变攻击力的函数么,
难道就只有改变三围的? 就没有直接改变攻击力的函数么,
答日:无 生命,魔法,防御也没有。 楼上水贴,,不过首发的确高明。。。 那楼主怎么改动那些数据的?思路是什么? vj没啥通用性……
Re:单位&英雄  -- 变动属性
引用第9楼frozenleave于2010-07-09 23:12发表的:那楼主怎么改动那些数据的?思路是什么? images/back.gif
其实就是位标识技术,用可以改变相应数据的技能做的。
百分比效果的话就是使用了一点点的算法。 萌新顶一下.............................................
页:
[1]