找回密码
 点一下
查看: 1884|回复: 9

讨论一个关于物品技能的深度问题!

  [复制链接]
发表于 2007-10-17 23:20:44 | 显示全部楼层 |阅读模式
好吧。。实际上我想说的是。。

如果在全模拟系统里面,某个“物品”附带另外一个模拟出来的技能。。。

然后把这个物品装备给单位。。令单位具有该技能,有什么高效率的执行手段么?

比如:
武器特效- 斩首
当使用武器对目标造成重击的时候,杀死目标。

武器特效- 破甲
当使用武器命中目标后,可以忽视目标的护甲。
发表于 2007-10-18 01:07:33 | 显示全部楼层
对物品ID绑定物品所带技能(包括普通属性和模拟技能或其他的)
这些技能或属性都对应一个ID
获得物品时检查所绑定的技能,并运行相应的函数,比如call AddAbi(targetUnit, skillID, value) 根据skillID不同执行不同的函数
丢弃物品时则反之,call AddAbi(targetUnit, skillID, -value)

比如一个攻击%几率发动霜冻新星的技能:

[codes=jass]function Trig_AbilityValue56_Cond takes nothing returns nothing
    if GetRandomInt(0,99) < GetStoredInteger(udg_GC,I2S(h2i(GetTriggerUnit())),"AbilityValue56") and IsUnitEnemy(GetEventTargetUnit(),GetOwningPlayer(GetTriggerUnit())) then
        set udg_TempUnit = CreateUnit(GetOwningPlayer(GetTriggerUnit()),'e000',GetUnitX(GetEventTargetUnit()),GetUnitY(GetEventTargetUnit()),0)
        call UnitApplyTimedLife(udg_TempUnit,'BHwe',0.3)
        call UnitAddAbility(udg_TempUnit,'A06G')  //霜冻新星
        call IssueTargetOrderById(udg_TempUnit,852226,GetEventTargetUnit())
    endif
endfunction

function AddSkillCustom takes unit u,integer s,integer v returns nothing
    local integer origin = GetStoredInteger(udg_GC,I2S(h2i(u)),"AbilityValue"+I2S(s))
    local integer total = origin+v
    call StoreInteger(udg_GC,I2S(h2i(u)),"AbilityValue"+I2S(s),total)
    if s==56 then   // %几率发动霜冻新星 ID=56
    if origin==0 then
            set udg_TempInt = GetStoredInteger(udg_GC,"AbilityValue56","Trigger")
            if udg_TempInt==0 then
                set udg_TempInt = h2i(CreateTrigger())
                call TriggerAddCondition(i2tg(udg_TempInt),Condition(function Trig_AbilityValue56_Cond))
                call StoreInteger(udg_GC,"AbilityValue56","Trigger",udg_TempInt)
            endif
            if not GetStoredBoolean(udg_GC,I2S(h2i(u)),"Ability56_Event") then
                call TriggerRegisterUnitEvent(i2tg(udg_TempInt),u,EVENT_UNIT_TARGET_IN_RANGE)
                call StoreBoolean(udg_GC,I2S(h2i(u)),"Ability56_Event",true)
            endif
        endif
    endif
endfunction[/codes]
回复

使用道具 举报

 楼主| 发表于 2007-10-18 12:06:47 | 显示全部楼层
我的意思是。。。

比如物品数据项目:

    RPG_ItemData_AbilityEquip_00
    RPG_ItemData_AbilityEquip_01
    RPG_ItemData_AbilityEquip_02
    RPG_ItemData_AbilityEquip_03
    RPG_ItemData_AbilityEquip_04
    RPG_ItemData_AbilityEquip_05
    RPG_ItemData_AbilityEquip_06
    RPG_ItemData_AbilityEquip_07
    RPG_ItemData_AbilityEquip_08
    RPG_ItemData_AbilityEquip_09
    RPG_ItemData_AbilityPassive_00
    RPG_ItemData_AbilityPassive_01
    RPG_ItemData_AbilityPassive_02
    RPG_ItemData_AbilityPassive_03
    RPG_ItemData_AbilityPassive_04
    RPG_ItemData_AbilityPassive_05
    RPG_ItemData_AbilityPassive_06
    RPG_ItemData_AbilityPassive_07
    RPG_ItemData_AbilityPassive_08
    RPG_ItemData_AbilityPassive_09

单位数据项目:

    RPG_UnitAbility_00
    RPG_UnitAbility_01
    RPG_UnitAbility_02
    RPG_UnitAbility_03
    RPG_UnitAbility_04
    RPG_UnitAbility_05
    RPG_UnitAbility_06
    RPG_UnitAbility_07
    RPG_UnitAbility_08
    RPG_UnitAbility_09
    RPG_UnitAbility_10
    RPG_UnitAbility_11
    RPG_UnitAbility_12
    RPG_UnitAbility_13
    RPG_UnitAbility_14
    RPG_UnitAbility_15
    RPG_UnitAbility_16
    RPG_UnitAbility_17
    RPG_UnitAbility_18
    RPG_UnitAbility_19
    RPG_UnitAbility_20
    RPG_UnitAbility_21
    RPG_UnitAbility_22
    RPG_UnitAbility_23
    RPG_UnitAbility_24
    RPG_UnitAbility_25
    RPG_UnitAbility_26
    RPG_UnitAbility_27
    RPG_UnitAbility_28

装备一个物品就给单位添加对应的能力。。

但是要在攻击,防御的时候检查对应能力。。。有什么办法可以不要遍历整个技能表的?

还有就是技能的叠加要如何算。。。
回复

使用道具 举报

发表于 2007-10-18 15:14:21 | 显示全部楼层
1.物品与技能的绑定:
该类技能都对应一个ID号,比如:
1.攻击力 2.防御力 3.攻击速度 ...
54 忽视敌人魔抗(可叠加) 55 杀死敌人取得1全属性(不可叠加) 56 %攻击发动霜冻新星(可叠加)

以下函数实现物品与技能的绑定:
[codes=jass]function ItemIdToI42 takes integer i returns integer
set i = i-'I000'
    return i/256*42+(i-i/256*256)
endfunction

function I42ToItemId takes integer i returns integer
    return i/42*256+(i-i/42*42)+'I000'
endfunction

//这两个函数只能实现对全自定义物品且数量不大于483时的物品代码简单转换,否则就用GameCache吧!

function NewItemSkill takes integer itemId,integer skillId,integer value returns nothing
    set itemId = ItemIdToI42(itemId)
    set udg_ItemSkillId[itemId*10+udg_ItemSkillCount[itemId]] = skillId
    set udg_ItemSkillValue[itemId*10+udg_ItemSkillCount[itemId]] = value
    set udg_ItemSkillCount[itemId] = udg_ItemSkillCount[itemId]+1
endfunction
比如:
call NewItemSkill('I00V',56,10) //+10%几率攻击发动霜冻新星
call NewItemSkill('I00V',1,10)  //攻击力+10 [/codes]


然后得到物品时运行AddItemSkill函数,丢弃时运行DecItemSkill函数

[codes=jass]function AddItemSkill takes unit u,item it returns nothing
    local integer i = 0
    local integer id = ItemIdToI42(GetItemTypeId(it))
    local integer sk
    local integer v
    loop
        set sk = udg_ItemSkillId[id*10+i]
        exitwhen sk==0
        set v = udg_ItemSkillValue[id*10+i]
        call AddSkill(u,sk,v)
        set i=i+1
    endloop
endfunction

function DecItemSkill takes unit u,item it returns nothing
    local integer i = 0
    local integer id = ItemIdToI42(GetItemTypeId(it))
    local integer sk
    local integer v
    loop
        set sk = udg_ItemSkillId[id*10+i]
        exitwhen sk==0
        set v = udg_ItemSkillValue[id*10+i]
        call AddSkill(u,sk,-v)
        set i=i+1
    endloop
endfunction[/codes]
其中的AddSkill函数就可以自己随心定义了,比如我上面给出的代码就是一例
回复

使用道具 举报

发表于 2007-10-18 15:33:54 | 显示全部楼层
算鸟,把我遗弃了2个多月的地图里的DD贴上来参考吧
技能最大等级=4,所以4进制的算法可能看着很别扭~

//**************  自定义技能系统  **********************
1~30 可叠加类
01 攻击 -4096~4095
02 防御 -4096~4095
03 攻速 -4096%~4095%

31~40 穷举类, 不可叠加存在多个时取最大值的技能
31 闪避 0~100%, limit=50
32 魔法抗性 -100%~100%, limit=50
33 吸血 0~64%

41~50 利用升级技能Bug(比如生命晶体)
41 生命 无上下限
42 魔法
43 视野

51~XX 自定义类
51 金钱获取率           (可叠加)
52 经验获取率           (可叠加)
53 魔导力 增加魔法威力  (该属性作用在技能中定义)
54 忽视敌人魔抗         (该属性作用在技能中定义)
55 杀死敌人取得1全属性  (不可叠加)
56 %攻击发动霜冻新星    (可叠加)
57 吸血 可开启/关闭     (点击带吸血效果的物品可以开启/关闭吸血)
58 移动速度             (可叠加)
59 施法时%几率重置CD    (可叠加)

[codes=jass]function AddSkill1_Dec takes unit u,integer s,integer value,integer total returns nothing
    local integer a
    local integer b
    local integer i=0
    local integer p=0
    loop
    set a=value-value/4*4
    set value=value/4
    set b=total-total/4*4
    set total=total/4
        if a+p>0 then
            if a+p+b<4 then
                set p=0
            else
                set p=1
            endif
            if b==0 then
                call UnitRemoveAbility(u,udg_SkillId[s*100+i])
            else
                call UnitAddAbility(u,udg_SkillId[s*100+i])
                call SetUnitAbilityLevel(u,udg_SkillId[s*100+i],b)
                call UnitMakeAbilityPermanent(u,true,udg_SkillId[s*100+i])
            endif
        endif
        exitwhen value==0
        set i = i+1
    endloop
    if p==1 then
        loop
            set b=total-total/4*4
            set total=total/4
            set i=i+1
            exitwhen b!=3
            call UnitAddAbility(u,udg_SkillId[s*100+i])
            call SetUnitAbilityLevel(u,udg_SkillId[s*100+i],b)
            call UnitMakeAbilityPermanent(u,true,udg_SkillId[s*100+i])
        endloop
        if b==0 then
            call UnitRemoveAbility(u,udg_SkillId[s*100+i])
        else
            call SetUnitAbilityLevel(u,udg_SkillId[s*100+i],b)
        endif
    endif
endfunction

function AddSkill1 takes unit u,integer s,integer v returns nothing
    local integer origin = GetStoredInteger(udg_GC,I2S(h2i(u)),"AbilityValue"+I2S(s))
    local integer total = origin+v
    local integer a
    local integer b
    local integer i=0
    local integer p=0
    call StoreInteger(udg_GC,I2S(h2i(u)),"AbilityValue"+I2S(s),total)
    if origin<0 then
        set a = GetUnitAbilityLevel(u,udg_SkillId[s*100-1])
        if a==1 then
            set origin=origin+16
        elseif a==2 then
            set origin=origin+256
        else
            set origin=origin+4096
        endif
        if total>=0 then
            call UnitRemoveAbility(u,udg_SkillId[s*100-1])
        endif
    endif
    if total<0 then
        if total>=-16 then
            set total=total+16
            set a=1
        elseif total>=-256 then
            set total=total+256
            set a=2
        else
            set total=total+4096
            set a=3
        endif
        call UnitAddAbility(u,udg_SkillId[s*100-1])
        call UnitMakeAbilityPermanent(u,true,udg_SkillId[s*100-1])
        call SetUnitAbilityLevel(u,udg_SkillId[s*100-1],a)
    endif
    set v=total-origin
    if v<0 then
        call AddSkill1_Dec(u,s,-v,total)
    else
        loop
        set a=v-v/4*4
        set v=v/4
        set b=total-total/4*4
        set total=total/4
            if a+p>0 then
                if b>=a+p then
                    call UnitAddAbility(u,udg_SkillId[s*100+i])
                    call UnitMakeAbilityPermanent(u,true,udg_SkillId[s*100+i])
                    call SetUnitAbilityLevel(u,udg_SkillId[s*100+i],b)
                    set p=0
                elseif b==0 then
                    call UnitRemoveAbility(u,udg_SkillId[s*100+i])
                    set p=1
                else
                    call SetUnitAbilityLevel(u,udg_SkillId[s*100+i],b)
                    set p=1
                endif
            endif
            exitwhen v==0
            set i = i+1
        endloop
        if p==1 then
            loop
                set b=total-total/4*4
                set total=total/4
                set i=i+1
                exitwhen b!=0
                call UnitRemoveAbility(u,udg_SkillId[s*100+i])
            endloop
            if b==1 then
                call UnitAddAbility(u,udg_SkillId[s*100+i])
                call UnitMakeAbilityPermanent(u,true,udg_SkillId[s*100+i])
            else
                call SetUnitAbilityLevel(u,udg_SkillId[s*100+i],b)
            endif
        endif
    endif
endfunction[/codes]

[codes=jass]function AddSkill2 takes unit u,integer s,integer v returns nothing
    local integer origin = GetStoredInteger(udg_GC,I2S(h2i(u)),"AbilityValue"+I2S(s))
    local integer total = origin+v
    local integer a=udg_SkillLimit[s*100]//最小值
    local integer b=udg_SkillLimit[s*100+1]//最大值
    local integer c
    local integer d
    local integer i
    call StoreInteger(udg_GC,I2S(h2i(u)),"AbilityValue"+I2S(s),total)
    if origin<a then
        set origin=a
    elseif origin>b then
        set origin=b
    endif
    if total<a then
        set total=a
    elseif total>b then
        set total=b
    endif
    if origin<0 then
        set i=-1
    else
        set i=1
    endif
    if udg_SkillUI[s*100]==0 then
        set a=(origin+i-2)/4
        call UnitRemoveAbility(u,udg_SkillId[s*100+a])
    else
        set a=(origin+7*i-8)/16
        call UnitRemoveAbility(u,udg_SkillUI[s*100+a])
    endif
    if total<0 then
        set i=-1
    elseif total>0 then
        set i=1
    else
        return
    endif
    set a = (total+i-2)/4
    set b = total*i + (1-total*i)/4*4
    if udg_SkillUI[s*100]==0 then
        call UnitAddAbility(u,udg_SkillId[s*100+a])
    else
        set c = (total+7*i-8)/16
        set d = (total*i+3)/4+(1-total*i)/16*4
        call UnitAddAbility(u,udg_SkillUI[s*100+c])
        call UnitMakeAbilityPermanent(u,true,udg_SkillUI[s*100+c])
        call SetUnitAbilityLevel(u,udg_SkillUI[s*100+c],d)
    endif
    call UnitMakeAbilityPermanent(u,true,udg_SkillId[s*100+a])
    call SetUnitAbilityLevel(u,udg_SkillId[s*100+a],b)
endfunction[/codes]

[codes=jass]function AddSkill3 takes unit u,integer s,integer v returns nothing
    local integer a=1024
    local integer b=8
    local integer c
    local integer i
    if v<0 then
        set i=-1
    else
        set i=1
    endif
    set v=v*i
    loop
        if v>=a then
            set c=b/3*i
            call UnitAddAbility(u,udg_SkillId[s*100+c])
            call UnitMakeAbilityPermanent(u,true,udg_SkillId[s*100+c])
            call SetUnitAbilityLevel(u,udg_SkillId[s*100+c],b+2-b/3*3)
            call UnitRemoveAbility(u,udg_SkillId[s*100+c])
            set v = v-a
            exitwhen v<=0
        else
            set a=a/4
            set b=b-1
        endif
    endloop
endfunction[/codes]

[codes=jass]function Trig_AbilityValue55_Cond takes nothing returns nothing
    set udg_TempUnit = GetKillingUnit()
    if IsUnitType(GetTriggerUnit(),UNIT_TYPE_HERO) and GetStoredInteger(udg_GC,I2S(h2i(udg_TempUnit)),"AbilityValue55") >0 and IsUnitEnemy(GetTriggerUnit(),GetOwningPlayer(udg_TempUnit)) then
        set udg_TempInt = 0
        loop
            if GetItemTypeId(UnitItemInSlot(udg_TempUnit,udg_TempInt)) == 'I036' then
                set udg_TempItem = UnitItemInSlot(udg_TempUnit,udg_TempInt)
                exitwhen true
            endif
            set udg_TempInt=udg_TempInt+1
        endloop
        call SetItemCharges(udg_TempItem,GetItemCharges(udg_TempItem)+1)
        call SetHeroStr(udg_TempUnit,GetHeroStr(udg_TempUnit,false)+1,true)
        call SetHeroAgi(udg_TempUnit,GetHeroAgi(udg_TempUnit,false)+1,true)
        call SetHeroInt(udg_TempUnit,GetHeroInt(udg_TempUnit,false)+1,true)
    endif
endfunction

function Trig_AbilityValue56_Cond takes nothing returns nothing
    if GetRandomInt(0,99) < GetStoredInteger(udg_GC,I2S(h2i(GetTriggerUnit())),"AbilityValue56") and IsUnitEnemy(GetEventTargetUnit(),GetOwningPlayer(GetTriggerUnit())) then
        set udg_TempUnit = CreateUnit(GetOwningPlayer(GetTriggerUnit()),'e000',GetUnitX(GetEventTargetUnit()),GetUnitY(GetEventTargetUnit()),0)
        call UnitApplyTimedLife(udg_TempUnit,'BHwe',0.3)
        call UnitAddAbility(udg_TempUnit,'A06G')  //霜华之锋
        call IssueTargetOrderById(udg_TempUnit,852226,GetEventTargetUnit())
    endif
endfunction

function Trig_AbilityValue59_Cond takes nothing returns nothing
    if GetRandomInt(0,99) < GetStoredInteger(udg_GC,I2S(h2i(GetTriggerUnit())),"AbilityValue59") then
        call ResetHeroSkillCD(GetTriggerUnit(),GetSpellAbilityId())
    endif
endfunction




function AddSkillCustom takes unit u,integer s,integer v returns nothing
    local integer origin = GetStoredInteger(udg_GC,I2S(h2i(u)),"AbilityValue"+I2S(s))
    local integer total = origin+v
    call StoreInteger(udg_GC,I2S(h2i(u)),"AbilityValue"+I2S(s),total)

    if s==51 then   //金钱获取率
        if u == udg_Hero[GetPlayerId(GetOwningPlayer(u))] then
            call DisableTrigger(trg_GoldRate)
            set udg_GoldRate[GetPlayerId(GetOwningPlayer(u))] = udg_GameGoldRate*(100+total)
            call SetPlayerState(GetOwningPlayer(u), PLAYER_STATE_GOLD_UPKEEP_RATE, 100 - udg_GoldRate[GetPlayerId(GetOwningPlayer(u))]*(100 - udg_UpkeepRate[GetPlayerId(GetOwningPlayer(u))])/10000)
            call EnableTrigger(trg_GoldRate)
        endif
    elseif s==52 then   //经验获取率
        if u == udg_Hero[GetPlayerId(GetOwningPlayer(u))] then
            call SetPlayerHandicapXP(GetOwningPlayer(u),udg_GameExpRate*(1.+total/100.)/100.)
        endif
    //elseif s==53 then   //魔导力 增加魔法威力
    //elseif s==54 then   //忽视敌人魔抗
    elseif s==55 then   //杀死敌人取得1全属性
        if v>0 then
            if GetStoredBoolean(udg_GC,"AbilityValue55","Trigger")==false then
                call TriggerAddCondition(trg_UnitDie,Condition(function Trig_AbilityValue55_Cond))
                call StoreBoolean(udg_GC,"AbilityValue55","Trigger",true)
            endif
            call SetHeroStr(u,GetHeroStr(u,false)+GetItemCharges(GetManipulatedItem()),true)
            call SetHeroAgi(u,GetHeroStr(u,false)+GetItemCharges(GetManipulatedItem()),true)
            call SetHeroInt(u,GetHeroStr(u,false)+GetItemCharges(GetManipulatedItem()),true)
        elseif v<0 then
            call SetHeroStr(u,GetHeroStr(u,false)-GetItemCharges(GetManipulatedItem()),true)
            call SetHeroAgi(u,GetHeroStr(u,false)-GetItemCharges(GetManipulatedItem()),true)
            call SetHeroInt(u,GetHeroStr(u,false)-GetItemCharges(GetManipulatedItem()),true)
        endif
    elseif s==56 then   // %几率攻击时发动霜冻新星
        if origin==0 then
            set udg_TempInt = GetStoredInteger(udg_GC,"AbilityValue56","Trigger")
            if udg_TempInt==0 then
                set udg_TempInt = h2i(CreateTrigger())
                call TriggerAddCondition(i2tg(udg_TempInt),Condition(function Trig_AbilityValue56_Cond))
                call StoreInteger(udg_GC,"AbilityValue56","Trigger",udg_TempInt)
            endif
            if not GetStoredBoolean(udg_GC,I2S(h2i(u)),"Ability56_Event") then
                call TriggerRegisterUnitEvent(i2tg(udg_TempInt),u,EVENT_UNIT_TARGET_IN_RANGE)
                call StoreBoolean(udg_GC,I2S(h2i(u)),"Ability56_Event",true)
            endif
        endif
    elseif s==57 then  //吸血(33)可开启/关闭
        if GetStoredBoolean(udg_GC,I2S(h2i(u)),"Ability57On") then
            call AddSkill2(u,33,GetStoredInteger(udg_GC,I2S(h2i(u)),"AbilityValue57")-GetStoredInteger(udg_GC,I2S(h2i(u)),"AbilityValue33"))
        endif
    elseif s==58 then   //移动速度
        call SetUnitMoveSpeed(u,GetUnitDefaultMoveSpeed(u)+total)
    elseif s==59 then   // %几率无视CD施法
        if origin==0 then
            if not GetStoredBoolean(udg_GC,I2S(h2i(u)),"Ability59_TrgCond") then
                call TriggerAddCondition(trg_HeroSpellEff[GetPlayerId(GetOwningPlayer(u))],Condition(function Trig_AbilityValue59_Cond))
                call StoreBoolean(udg_GC,I2S(h2i(u)),"Ability59_TrgCond",true)
            endif
        endif
    endif
endfunction[/codes]

[codes=jass]function AddSkill takes unit u,integer s,integer v returns nothing
    if s<=30 then
        call AddSkill1(u,s,v)
    elseif s<=40 then
        call AddSkill2(u,s,v)
    elseif s<=50 then
        call AddSkill3(u,s,v)
    else
        call AddSkillCustom(u,s,v)
    endif
endfunction[/codes]

[codes=jass]function GetSkillValue takes unit u,integer s returns integer
    return GetStoredInteger(udg_GC,I2S(h2i(u)),"AbilityValue"+I2S(s))
endfunction

function GetWiz takes unit u returns integer    //魔导力
    return GetStoredInteger(udg_GC,I2S(h2i(u)),"AbilityValue53")
endfunction

//! define AddAttack(u,v) AddSkill1(u,1,v)
//! define AddDef(u,v) AddSkill1(u,2,v)
//! define AddAttackSpeed(u,v) AddSkill1(u,3,v)

//! define AddEvasion(u,v) AddSkill2(u,31,v)
//! define AddRes(u,v) AddSkill2(u,32,v)

//! define AddMaxLife(u,v) AddSkill3(u,41,v)
//! define AddMaxMana(u,v) AddSkill3(u,42,v)
//! define AddSight(u,v) AddSkill3(u,43,v)

//! define AddGoldRate(u,v) AddSkillCustom(u,51,v)
//! define AddExpRate(u,v) AddSkillCustom(u,52,v)
//! define AddWiz(u,v) AddSkillCustom(u,53,v)
//! define AddLeech(u,v) AddSkillCustom(u,57,v)
//! define AddMoveSpeed(u,v) AddSkillCustom(u,58,v)


//======  白字攻击增加(只能使用正数)
function AddBaseAttack takes unit u,integer v returns nothing
    local integer a=16
    local integer b=8
    local integer i='I05K'
    if GetUnitAbilityLevel(u,'AInv')==0 then
        call UnitAddAbility(u,'Aihn')
    endif
    loop
        exitwhen v<=0
        if v>=a then
            call UnitAddItemById(u,i)
            set v = v-a
        else
            set a=a/4
            set i=i-1
        endif
    endloop
    call UnitRemoveAbility(u,'Aihn')
endfunction[/codes]
回复

使用道具 举报

发表于 2007-10-18 15:44:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-10-18 19:39:24 | 显示全部楼层
那个UnitRemoveItem(hero,it) 做什么用的?
最好给的完整点


这样的GameCache用法明显素不对的阿,会引起不必要的string泄漏
[codes=jass]GetStoredInteger(udg_GC,"ItemAbilities",I2S(itid)+"_4")
[/codes]

应该素
[codes=jass]GetStoredInteger(udg_GC,"ItemAbilities_4",I2S(itid))   //不需要清空的数据

GetStoredInteger(udg_GC,I2S(H2I(anyObject)),"Anything") //需要清空的数据[/codes]
回复

使用道具 举报

发表于 2007-10-18 20:17:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-10-18 23:15:10 | 显示全部楼层
我想说的主要问题是,由于完全模拟战斗系统是基于“单位受到伤害”事件的,所以在伤害函数中检查单位技能并做出对应判断应该是最高效率的执行方案了,而不是另外创造一个触发。

现在就是在头大要如何在攻击函数中有效率地检索这个“技能”并且执行对应的函数,还有就是技能的叠加。。。。(使用技能叠加引用数?)
回复

使用道具 举报

发表于 2007-10-19 00:18:52 | 显示全部楼层
一个触发多个条件的写法是最佳的选择

[codes=jass]function Trg_xxx_Cond takes nothing return nothing
    //这里运行技能相关代码,不能有等待动作存在
endfunction

function xxx...
    local integer i = GetStoredInteger(udg_GC,I2S(h2i(u)),"UnitDamagedTrigger")
    if i==0 then
        set i = h2i(CreateTrigger())
        call TriggerRegisterUnitEvent(i2tg(i),u,EVENT_UNIT_DAMAGED)
        call StoreInteger(udg_GC,I2S(h2i(u)),"UnitDamagedTrigger",i)
    endif
    call TriggerAddCondition(i2tg(i),Condition(function Trg_xxx_Cond))
    // any code......
endfunction[/codes]

如果对条件中写动作不理解可以参见该贴:
http://gacn.net/bbs/read.php?tid=1540

对于技能叠加,上面的代码已经很详细了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-25 09:43 , Processed in 0.033049 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表