[ 編集このページを編集する ]

トップ > MAP作成 > Jass Script > ライブラリ集 > Damage Modify


指定したユニットに指定した値だけダメージ値を上昇させる。

ライブラリ

//下準備
// ▲ブジェクトエディタでItem Damage Bonus('AIfg'等)をBaseにしたスキルを複数用意してください。
//
//◆△垢戮討離好ルのレベルを2に設定し、レベル1のダメージ値を0
//レベル2のダメージ値をそれぞれ1,2,4,8,16,32,64,128,256,512....にしてください
//(以下、それらをdamage+1,damage+2,damage+4....と呼びます。)
//
//、Spell Book('Aspb')をBaseにしたスキルを1つ用意してください。
//Maximum SpellsとMinimum Spellsの値を△悩遒辰Damage Bonusのスキルの数と同じにして、
//Spell Listに△悩遒辰織好ルすべてを入れます。ここではSpell book = 'A006'です。

//===========================================================================
 globals

    //ダメージを上げるskillのIDを格納するglobal変数を定義
    integer array bonusID
 endglobals

//===========================================================================

 library ModifyDamageBonus initializer SetBonusID

  private function SetBonusID takes nothing returns nothing

  //Initializerを使って最初にglobal変数にIDを代入させます。
      set bonusID[0] = 'A00H' //damage+1
      set bonusID[1] = 'A00G' //damage+2
      set bonusID[2] = 'A00F' //damage+4
      set bonusID[3] = 'A00E' //damage+8
      set bonusID[4] = 'A007' //damage+16
      set bonusID[5] = 'A008' //damage+32
      set bonusID[6] = 'A009' //damage+64
      set bonusID[7] = 'A00A' //damage+128
      set bonusID[8] = 'A00B' //damage+256
      set bonusID[9] = 'A00C' //damage+512
      set bonusID[10] = 'A00D' //damage+1024
      //以下、同じように好きな数だけスキルを作って設定してください。ここでは11個だけ作成しました

  endfunction

  function ModifyDamage takes unit u,integer dam returns nothing
       local integer i = 0

 //Spell bookを持っていない場合ユニットに追加
      if GetUnitAbilityLevel(u,'A006') == 0 then 
      call SetPlayerAbilityAvailable(GetOwningPlayer(u),'A006',false)  //Spell Bookが見えないようにする処理
      call UnitAddAbility(u,'A006')
      endif

     loop
     exitwhen dam < 1 or i >= 11   // iの最大値を作ったダメージスキルの数と同じにする
       if dam == 2*(dam/2) + 1 then
        call SetUnitAbilityLevel(u,bonusID[i],2)
       else
        call SetUnitAbilityLevel(u,bonusID[i],1)
       endif
      set dam = dam / 2
      set i = i + 1
     endloop

  endfunction

//===========================================================================
 //Damage Modifyを取り除くfunction

  function RemoveModifyDamage takes unit whichunit returns nothing
      call UnitRemoveAbility(whichunit,'A006')
  endfunction

 endlibrary
//===========================================================================

使い方のサンプル

gg_unit_H000_0000のダメージ値を20秒間gg_unit_H000_0000の最大HPの5%だけ上昇させる

//===========================================================================
function Damage_Bonus_Sample takes nothing returns nothing
    call ModifyDamage(gg_unit_H000_0000,GetUnitState(gg_unit_H000_0000,UNIT_STATE_MAX_LIFE)*.05)
    call TriggerSleepAction(20)
    call RemoveModifyDamage(gg_unit_H000_0000)
endfunction

//===========================================================================

例えばgg_unit_H000_0000の最大HPが1425だった場合、ダメージは1425*0.05=71(小数点以下切捨)上昇します。

処理の説明

基本的な原理は10進数から2進数への変換[外部リンク]と同じです。
サンプルを例にするとダメージを71上昇させるには

71の2進数表記→1000111 = 1+2+4+64

となりdamage+1,+2,+4,+64の4つを持たせれば良いわけです。

指定されたダメージ値を2で割り、余りが出たらスキルのレベルを2にして、余りが0ならレベルを0にしています。
ここでは整数の割り算は小数点が切り捨てられることを利用して、if dam == 2*(dam/2) + 1 thenで余りが1か0かを判定させています。(この式が成立すれば余りは1)
この処理をダメージ値が1になるか、準備したダメージスキルの数を超えるまで続けています。

必要なライブラリ

なし