프로그래밍 이야기/녹픽던 모딩

[녹픽던 모딩] attackProc, defenseProc, damage

mizq4482 2022. 3. 5. 12:50

attackproc, defenseProc

물리 공격 (근접 공격, 투척 무기) 적중(피격)시 발생 효과 완드 등으로 발동하는 마법 피해에선 작동하지 않음.

 

다음 스크립트들에 적용할 수 있음.

 

[Hero] - 영웅이 공격(피격)할 때마다 발동시킬 수 있음. if문을 사용하면 [특정 버프] 상태일 때 등의 조건을 줄 수 있음.

주로 플레이어에게 한정된 버프 효과등을 구현할 때 사용함.

 

─ attackProc관련

// Hex(주술) 버프가 null이 아니라면 (즉, 주술 버프가 있다면 발동)
if (buff(Hex.class) != null) {
damage *= 1.5f;
}

단, 특정 무기를 장착한 후 attackProc 발동 효과는 Hero에서 발동시키는 것은 비효율적.

이 경우는 해당 무기에서 구현하는 것이 옳음.

if (belongings.weapon instanceof 대충 무기) { 대충 효과; }

... 이러한 형식을 Hero의 attackProc에 사용할 바엔 해당 무기의 proc에 구현하라는 것.

 

 

─ defenseProc관련

defenseProc의 경우 무기에서 적용할 수 없기에, 관련 효과를 주고싶다면 hero의 defenseProc에 작성하는 것이 맞음.

// 이걸 defensProc에 넣으면, 특정 무기 장착시 적의 물리 공격을 20%감소시켜 받는다.
if (belongings.weapon instanceof 대충 무기) { damage *= 0.8f; }

 

 

[Mob] - 몬스터가 공격할 때마다 발동. 몬스터에게 한정된 효과 등 구현. (타락 같은 게 대표적인 예.)

 

[Actor] - 모든 캐릭터가 공격할 때마다 발동. 플레이어, 몬스터에게 동일하게 적용된 효과 구현.

(취약, 약화, 주술 등 플레이어와 몬스터 구분없이 동일한 효과를 내는 상태이상 등을 구현할 때 사용)

 

대충 요약하면

Actor - 영웅, 몬스터, NPC 전부

Hero - 영웅(=플레이어)

Mob - 영웅이 아닌 대상 (NPC 제외)

... 을 대상으로 한다.

 

[Weapon 계열] - 해당 무기가 적중할 때 발동. Hero와 무기를 든 석상, 거울상 등에서 발동함.

 

 

 

damage

모든 종류의 피해가 발생 처리.

특정 버프가 있다면 2배로 받는다던가, 그런 식으로 가능하지만... 상태이상(연소) 등도 포함된 다는 것에 주의.

 

if (src instanceof Wand) {
...대충 효과 }

이런 식으로 damage에서 발동 조건을 한정시킬 수 있다.

src는 공격자 판별용 Object 변수로, 이 경우에는 해당 캐릭터가 Wand로 피해를 받았을 때 효과가 발동한다.

Wand는 완드 계열의 부모 클래스이기에, 붕괴나 화염 폭발 등 DamageWand를 포함한 모든 Wand가 효과 범위에 들어간다.

 

 

 

 

─ 예시

 

attackProc (Hero, Mob, Actor)

  @Override
    public int attackProc(final Char enemy, int damage) {
        damage = super.attackProc(enemy, damage);
        ...
        if (buff(Hex.class) != null) damage *= 1.25f;
        ...
        }

 

Hex 라는 버프가 있다면 입히는 물리 피해가 1.25배로 합니다.(=입히는 피해 1.25배)

 

 

defenseProc (Hero, Mob, Actor)

 

  @Override
    public int defenseProc(Char enemy, int damage) {
    ...
    if (buff(IAMSTRONG.class) != null) damage = 1;
    ...
    }

IAMSTRONG 라는 버프가 있다면 모든 물리 피해를 1만 받습니다.

단, 이후 작성하는 코드에 따라선 1 이상이 될 수도 있습니다.

 

 

damage (Hero, Mob, Actor)

@Override
    public void damage(int dmg, Object src) {
    ...
    if (src instanceof Hero) dmg = 999;
    }

피해를 입힌 대상이 Hero 라면 최종 피해량이 999가 됩니다.

 

 

proc (Weapon)

이름은 다르지만, attackProc와 동일한 효과.

무기를 장착할 수 있는 캐릭터가 공격할 때, 해당 캐릭터의 attackProc에서 작동시키는 방식으로 돌아감.

@Override
    public int proc(Char attacker, Char defender, int damage) {
    if (attacker instanceof Hero) damage *= 1.5f;
        return super.proc(attacker, defender, damage);
    }

공격자가 Hero라면 데미지를 1.5배로 합니다.

거울상, 석상 등 Hero가 아닌 대상은 이 무기를 장착한 상태라도 피해량이 1.5배로 증가하지 않습니다.

728x90