close_btn
로그인, 회원가입후 더 많은 혜택을 누리세요 로그인 회원가입 닫기

마방및 마법데미지 본x화

2016.06.27 19:29

최강빅토리 조회 수:282

마방과 마법데미지 본x화에 대한 개인적인 분석결과이며 리니지 파워북과 게임어바웃 자료 참조했습니다.

예전에 쓴글인데 다시 좀 정리좀 했습니다.

 


마법데미지와 인트와 SP와의 상관관계부터 설명합니다

기본마법데미지는 인트8 SP(-1)에서의 값을 지칭합니다.

마법레벨에 의한SP상승은 마법데미지와 관계없습니다.(확률마법과는 상관있을지 모릅니다.)

아이템이나 기타에 의한 SP상승은 똑같이 적용됩니다.

인트1당 기본마법데미지 20% 추가

SP1당 기본마법데미지 15% 추가

마법데미지=기본데미지 * (100% + SP*15% + 인트*20%)

예를들어 에너지볼트는 기본데미지 8 이며

인트25 SP20(마법레벨10+인트에의한SP11)에서 데미지는 8 * 385% = 32 (100% + SP11 * 15% + 인트6 * 20%=385%)입니다.

인트에의한 sp추가구간 (9,12,15,18,19,20,21,22,23,24,25,36) 25이후 10구간후 1씩추가 되는거 같지만 36이후로는 모름.

 


마방 0~100까지는 10당 5%감소 101~ 에서는 10당 1%감소임.(mr220까지 확인) 마방600이면 데미지 0일거라 추측

마방 100이하에서

마법데미지 = 마법데미지 - (마법데미지 * 마방 / 200) //10당 5%감소 100일때 50%

마방 100이상에서

마법데미지 = (마법데미지/2) - (마법데미지 * (마방-100) / 1000) //10당 1%감소 200일때 60%

 


속성 0~100까지는 10당 4.5%감소 101~ 에서는 수치화할 자료가 부족 변화가 미미함. (아마 1% 감소일거라 추측)

속성데미지는 해당속성말고는 감소없음.

속성 100이하에서

마법데미지 = 마법데미지 - (마법데미지 * 속성 / 222) //10당 4.5%감소 100일때 45%

속성 100이상에서

마법데미지 = (마법데미지*55/100) - (마법데미지 * (속성-100) / 1000) //10당 1%감소 200일때 55%

 


마방100 속성100 이면 해당속성 마법데미지 72.5% 감소

마법데미지 = 마법데미지 * (1-0.5) * (1-0.45)

마방200 속성200 이면 마법데미지 82.0% 감소

마방300 속성300 이면 마법데미지 89.5% 감소

마방400 속성400 이면 마법데미지 95.0% 감소

 


그리고 마법 기본데미지 나x켓에서 수정해야하는데

예를들어 파워북 콘오브콜드 실험값을 보면

보통MR100인 상대를 인트25 SP20 세팅으로 때렸다고 나옵니다. 그때 데미지평균이 64 이고(크리뺀값)

(MR 0 일때 데미지구하는 공식은 64 * (1 + mr/100)

MR 0 에서 128 이고 기본데미지는 128 / 3.85(385%)하면 기본평균값 33.2

나x켓의 평균값은 damage_value + damage_dice_count * damage_dice평값

(damage_dice평값은 dice 4이면 1-4까지중에서 랜덤값이 나옴 평균은 2.5)

제 나x켓 콘오브콜드는 value 19 count 2 dice 4 로 나옴 평균값은 19 + 2 * 2.5 = 24가 평균값임

제대로 고칠려면 value 25 count 2 dice 15 로 고치면 평균33나옴

 


파워북에 나온 실험값들에서 기본데미지 구하면 아래와 같음.(2009~2012년자료라 2014년과 조금 다른값도 있음 주의)

에너지볼트 평균8 value 2 count 2 dice 5

콘오브콜드 평균33 value 25 count 2 dice 15

선버스트 평균51 value 33 count 2 dice 17

디스인티그레이트 평균94 value 42 count 2 dice 51 (디스는 풀라일때임 주의)

미티어스트라이크 평균36 value 29 count 2 dice 6

라이트닝 평균12 value 2 count 2 dice 9

라이트닝스톰 평균33 value 14 count 2 dice 18

 


아래껀 예전에 제가 대충 값을 잡아서 올렸던 나x켓값임 쓸려면 쓰세요.

마법이름 크리티컬 SP당 INT당 Value Dice Dice_Count 최소 최대 평균
아이스대거(1물) O 15 20 2 6 2 4 14 9
에너지볼드(1무뉴트럴) O 15 20 2 5 2 4 12 8
윈드커터(1바람) O 15 20 2 6 2 4 14 9
스탈락(2땅) O 15 20 4 6 2 6 16 11
칠터치(2물카오틱) O 15 20 2 7 2 4 16 10
파이어애로우(2불) O 15 20 4 6 2 6 16 11
라이트닝(3바람) X 15 20 2 9 2 4 20 12
프로즌클라우드(3물) X 15 20 4 6 2 6 16 11
뱀파이어릭터치(4물카오틱) O 15 20 6 9 2 8 24 16
어스재일(4땅) X 15 20 6 7 2 8 20 14
파이어볼(4불) X 15 20 4 7 2 6 18 12
콘오브콜드(5물) O 15 20 24 9 2 26 42 34
콜라이트닝(5바람) O 15 20 22 13 2 24 48 36
선버스트(6불) O 15 20 38 13 2 40 64 52
이럽션(6땅) O 15 20 30 4 2 32 38 35
아이스랜스(7물) X 15 20 16 10 2 18 36 27
토네이도(7바람) X 15 20 10 15 2 12 40 26
블리자드(8물) X 15 20 16 14 2 18 44 31
어스퀘이크(8땅) X 15 20 10 15 2 12 40 26
파이어월(8불) X 15 20 16 14 2 18 44 31
라이트닝스톰(9바람) X 15 20 14 16 2 16 46 31
파이어스톰(9불) X 15 20 14 17 2 16 48 32
디스인티그레이트(10무로우풀) X 10 13 88 36 2 90 160 125
미티어스트라이크(10땅) X 15 20 42 15 2 44 72 58
프리징블리자드(10물) X 15 20 14 17 2 16 48 32

 


여기까지가 마방 속성 인트 SP에 따른 마법데미지 공식입니다.

본x화를 원하는분들은 각자 펙에 맞게 소스를 바꾸시면 됩니다.

 


아래 소스는 테스트안했음 제가가진 에바펙중 소스를 위에 공식에 맞게 바꿔본 겁니다.

초보분들 이런식으로하면 된다는 예시이지 자기펙에 맞게해야함.

그리고 운영중인 펙에서 테스트하지마세요. 자잘한 문제없나 안정성 확인하고 쓰세요.

 


밑에 파란색 검색해서 아래부분 몽땅 바꾸시면 되요.

제가 예전에 소스 남겼던걸 3.63펙에 누군가 적용시켰길래 가져와서 수치몇가지 변경했어요.

 


 // ●●●● damage_dice, damage_dice_count, damage_value, SP로부터 마법 데미지를 산출 ●●●●

 private int calcMagicDiceDamage(int skillId) {

  L1Skills l1skills = SkillsTable.getInstance().getTemplate(skillId);

  int dice = l1skills.getDamageDice();

  int diceCount = l1skills.getDamageDiceCount();

  int value = l1skills.getDamageValue();

  int magicDamage = 0;

  int PowerMr = 0; // 마방

  double coefficient = 0; // PC마법상수

 


  Random random = new Random();

  for (int i = 0; i < diceCount; i++) {

   magicDamage += (_random.nextInt(dice) + 1);

  }

  magicDamage += value;

 


  if (_calcType == PC_PC || _calcType == PC_NPC) {

   int PowerSp = _pc.getAbility().getSp() - getMagicLevel();

   // 총SP에서 매직보너스뺀 나머지SP구하기 +1은 수식에서 바로 넣었습니다.

   int PowerInt = _pc.getAbility().getTotalInt() - getMagicBonus();

   // SP가 오르지않는 INT 구하기 -9는 수식에서 바로 넣었습니다.

   coefficient = (1.0 + (PowerSp + 1) * 0.15 + (PowerInt - 9) * 0.2); // PC마법 상수 구하기

  } else if (_calcType == NPC_PC || _calcType == NPC_NPC) {

   int spByItem = _npc.getAbility().getSp()

     - _npc.getAbility().getTrueSp();

   int charaIntelligence = _npc.getAbility().getTotalInt();

   coefficient = (1.0 + (charaIntelligence - 8) * 0.2 + spByItem * 0.15); // NPC마법 상수  구하기

  }

 


  if (coefficient < 1) {

   coefficient = 1;

  }

  magicDamage *= coefficient; // 기본 마법데미지에 마법상수 곱하기

  /** 치명타 발생 부분 추가 - By 시니 - */

  double criticalCoefficient = 1.4;

  int rnd = random.nextInt(100) + 1;

  if (_calcType == PC_PC || _calcType == PC_NPC) {

   switch (skillId) { // 6레벨 이하 광역마법 제외한 공격마법

   case ENERGY_BOLT:

   case ICE_DAGGER:

   case WIND_CUTTER:

   case CHILL_TOUCH:

   case FIRE_ARROW:

   case STALAC:

   case VAMPIRIC_TOUCH:

   case CONE_OF_COLD:

   case ERUPTION:

   case CALL_LIGHTNING:

   case SUNBURST:

   case SMASH_ENERGY:

   case DISINTEGRATE:

    int propCritical =  (CalcStat.calcBaseMagicCritical(

      _pc.getType(), _pc.ability.getTotalInt()) + 15);

    if (_calcType == PC_PC || _calcType == PC_NPC) {

     if (_pc.getSkillEffectTimerSet().hasSkillEffect(LIND_MAAN)

       || _pc.getSkillEffectTimerSet().hasSkillEffect(

         SHAPE_MAAN) // 형상의 마안 - 일정확률로 마법치명타+1

       || _pc.getSkillEffectTimerSet().hasSkillEffect(

         LIFE_MAAN)) { // 생명의 마안 - 일정확률로 마법치명타+1

      propCritical += 1; // 마안에 의한 마법치명타 +1

     }

    }

    if (criticalOccur(propCritical)) {

     magicDamage *= 1.5;

     /**크리이펙트추가-KCH**/

     if (l1skills.getCriticalGfx() != 0) // 크리이펙이 디비에 추가되어있다면

            L1SkillUse.CRITICAL_GFX = true;

     /**크리이펙트추가-KCH**/

 

     if (skillId == CALL_LIGHTNING || skillId == CONE_OF_COLD

       || skillId == SUNBURST || skillId == DISINTEGRATE) {// 이스킬일 경우

      L1SkillUse.CRITICAL_CASTGFX = true;

                    }

    }

    break;

   }

  } else if (_calcType == NPC_PC || _calcType == NPC_NPC) {

   if (rnd <= 15) {

    magicDamage *= criticalCoefficient;

   }

  }

  if (getTargetMr() < 101) {

   PowerMr = getTargetMr() / 2; //PowerMr int형으로 바꾸면서 변경

   // 마방100되면 10당 (기본데미지*마법상수)의 5% 데미지 줄어들게 설정 총50%

  } else {

   PowerMr = 50 + (getTargetMr() - 100) / 10; //PowerMr int형으로 바꾸면서 변경

   // 마방100초과분에 대해 10당 (기본데미지*마법상수)의 1% 줄어들게 설정 100당 10%

  } // 마방 600되면 마법데미지 0

  if (skillId == FINAL_BURN) {

   PowerMr = 0;

  }

  magicDamage -= magicDamage * PowerMr / 100;

  // 먼저 마방에 의한 데미지 감소부터 처리 PowerMr int형으로 바꾸면서 변경

  double attrDeffence = calcAttrResistance(l1skills.getAttr());

  // 속성방어 100당 45%줄어듬. 10당 4.5% 초과분에 대해서 10당 1% 줄어들게 설정

  magicDamage -= magicDamage * attrDeffence; // 마방에 의한 데미지 감소후 속성방어에 의한 데미지 감소 처리

  if (_calcType == PC_PC || _calcType == PC_NPC) {

   magicDamage += _pc.getBaseMagicDmg(); // 베이스 스탯 마법 데미지 보너스 추가

  }

  if (_calcType == PC_PC || _calcType == PC_NPC) {

   int weaponAddDmg = 0;

   L1ItemInstance weapon = _pc.getWeapon();

   if (weapon != null) {

    weaponAddDmg = weapon.getItem().getMagicDmgModifier();

   }

   magicDamage += weaponAddDmg; // 무기에 의한 마법 데미지 추가

  }

  return magicDamage;

 }

 

 

 

public int calcMrDefense (int dmg) { //기타 무기마법 등등 연동되는마방부분.
보라색 부분은 전부 지우시고 빨간부분으로 대체


int mr = getTargetMr();
if (_calcType == NPC_PC || _calcType == PC_NPC || _calcType == NPC_NPC) {
if (mr < 50){
dmg -= dmg * mr / 210;
} else if (mr >= 50 && mr < 60){
dmg -= dmg * mr / 200;
} else if (mr >= 60 && mr < 70){
dmg -= dmg * mr / 190;
} else if (mr >= 70 && mr < 80){
dmg -= dmg * mr / 180;
} else if (mr >= 80 && mr < 90){
dmg -= dmg * mr / 170;
}else if (mr >= 90 && mr < 100){
dmg -= dmg * mr / 160;
} else if (mr >= 100){
dmg -= dmg * 100 / 130; // 마방 100% 이상은 소용없게...
}
}
if (_calcType == PC_PC){
if (mr < 50){
dmg -= dmg * mr / 300;
} else if (mr >= 50 && mr < 60){
dmg -= dmg * mr / 299;
} else if (mr >= 60 && mr < 70){
dmg -= dmg * mr / 298;
} else if (mr >= 70 && mr < 80){
dmg -= dmg * mr / 297;
} else if (mr >= 80 && mr < 90){
dmg -= dmg * mr / 296;
} else if (mr >= 90 && mr < 100){
dmg -= dmg * mr / 294;
} else if (mr >= 100 && mr < 110){
dmg -= dmg * mr / 292;
} else if (mr >= 110 && mr < 120){ //110 같거나크고 120보다 작다
dmg -= dmg * mr / 290;
} else if (mr >= 120 && mr < 130){
dmg -= dmg * mr / 285;
} else if (mr >= 130 && mr < 140){ //130 같거나크고 140보다 작다
dmg -= dmg * mr / 284;
} else if (mr >= 140 && mr < 150){
dmg -= dmg * mr / 283;
} else if (mr >= 150 && mr < 160){ //위내용처럼 120~130은 적용이안되더라구요 ㅠㅠ
dmg -= dmg * mr / 280;
} else if (mr >= 160 && mr < 170){
dmg -= dmg * mr / 279;
} else if (mr >= 170 && mr < 180){ //그래서 추가했습니다
dmg -= dmg * mr / 278;
} else if (mr >= 180 && mr < 190){
dmg -= dmg * mr / 270;
} else if (mr >= 190 && mr < 200){
dmg -= dmg * mr / 265;
} else if (mr >= 200 && mr < 210){
dmg -= dmg * mr / 263;
} else if (mr >= 210 && mr < 220){
dmg -= dmg * mr / 261;
} else if (mr >= 220 && mr < 230){
dmg -= dmg * mr / 260;
} else if (mr >= 230 && mr < 240){
dmg -= dmg * mr / 259;
} else if (mr >= 240 && mr < 250){
dmg -= dmg * mr / 258;
} else if (mr >= 250 && mr < 260){
dmg -= dmg * mr / 257;
} else if (mr >= 260){
dmg -= dmg * 260 / 290; //220이상부터 데미지 안 들어옵니다.
}
}
return dmg;
} // by USZero(영화처럼)

int PowerMr = 0;
if (getTargetMr() < 101) {
PowerMr = getTargetMr() / 2; //마방100되면 10당 5% 데미지 줄어들게 설정 총50%
} else {
PowerMr = 50 + (getTargetMr() - 100) / 10; //마방100초과분에 대해 10당 1% 줄어들게 설정 100당 10%
} //마방 600되면 마법데미지 0
dmg -= dmg * PowerMr / 100;
return dmg;
}

 


private double calcAttrResistance(int attr) { //검색 빨간부분수정
int resist = 0;
int resistFloor = 0;
if (_calcType == PC_PC || _calcType == NPC_PC) {
switch(attr){
case L1Skills.ATTR_EARTH: resist = _targetPc.getResistance().getEarth(); break;
case L1Skills.ATTR_FIRE: resist = _targetPc.getResistance().getFire(); break;
case L1Skills.ATTR_WATER: resist = _targetPc.getResistance().getWater(); break;
case L1Skills.ATTR_WIND: resist = _targetPc.getResistance().getWind(); break;
}
} else if (_calcType == PC_NPC || _calcType == NPC_NPC) {
}
if (resist < 0) {
resistFloor = (int) (-0.45 * Math.abs(resist));
} else if (resist < 101) {
resistFloor = (int) (0.45 * Math.abs(resist));
} else {
resistFloor = (int) (45 + 0.1 * Math.abs(resist)); //속성100초과분에 대해 0.45의 1/5정도 감소되게 변경
}
double attrDeffence = resistFloor / 100;
return attrDeffence;
}

 

public int calcMagicDamage(int skillId) { //검색 아래보라부분은 검증하고 지우세요.
int damage = 0;
if (_calcType == PC_PC || _calcType == NPC_PC) {
damage = calcPcMagicDamage(skillId);
} else if (_calcType == PC_NPC || _calcType == NPC_NPC) {
damage = calcNpcMagicDamage(skillId);
//////////혈원에게는 범위마법 데미지 0 디플추가////////////
if (_calcType == PC_PC){
if (_pc.getClanid() > 0 && (_pc.getClanid() == _targetPc.getClanid())) {
if (skillId == 17 || skillId == 22 || skillId == 25 || skillId == 53
|| skillId == 53|| skillId == 59|| skillId == 62|| skillId == 65
|| skillId == 70|| skillId == 74|| skillId == 80) { //미티어 포함한 범위마법들..
damage = 0;
}
}
}
//////////혈원에게는 범위마법 데미지 0 디플추가끝////////////
}

if(skillId != FINAL_BURN){ //파번을 비롯한 마방계산을 calcMagicDiceDamage에서 하기때문
damage = calcMrDefense(damage);
} else if(skillId == FINAL_BURN && _targetPc != null) { // final burn's temporary damage
if(_targetPc.getResistance().getEffectedMrBySkill() <= 50)
damage = _pc.getCurrentMp() + _random.nextInt(_pc.getCurrentMp()/2+1);
else if(_targetPc.getResistance().getEffectedMrBySkill() > 50 && _targetPc.getResistance().getEffectedMrBySkill() < 100)
damage = _pc.getCurrentMp() - _random.nextInt(_pc.getCurrentMp()/2+1);
else if(_targetPc.getResistance().getEffectedMrBySkill() > 100)
damage = _random.nextInt(_pc.getCurrentMp()/2+1);
}

 

 

번호 제목 글쓴이 날짜 조회 수
공지 소스자료는 직접 올려주세요 게임존 2017.06.06 550
309 재질에 의한 타격치.. 준희미니 2016.06.29 39
308 헤이스트 아이템 헤이스트효과구현 준희미니 2016.06.29 41
307 언데드계열 힐주기 준희미니 2016.06.29 27
306 경험치 중복 떨구기 및 문지방적용시 잊섬에서 경험치 적용안되는부분 수정.txt 준희미니 2016.06.29 49
305 고대인의 지혜및 기타지팡이 엠흡수.txt 준희미니 2016.06.29 67
304 리스창 케릭삭제부분.txt 준희미니 2016.06.29 38
303 마법공격시 보라돌이,유저공격시 카오적용.txt 준희미니 2016.06.29 41
302 cpu_100%.txt 준희미니 2016.06.29 107
301 특정지역 몬스터 아덴드랍율 높히기.txt 준희미니 2016.06.29 99
300 트리플에로우 카오적용.txt 준희미니 2016.06.29 49
299 점프팩 옵코...관련 준희미니 2016.06.29 177
298 세트 착용시 화려한 임팩 준희미니 2016.06.28 53
297 환영의 체인소드 저만의 짜집기 준희미니 2016.06.28 38
296 어스가디언 (수정) 준희미니 2016.06.28 23
295 허수아비 파티시 어택불가 준희미니 2016.06.28 27
294 이미 마법을 배우면 더이상 안배워지도록 준희미니 2016.06.28 82
293 [서버방어프로젝트1] 너 스핵쓰냐? 잡아줄게 준희미니 2016.06.28 75
292 [일팩유저화이팅]하딘시스템 준희미니 2016.06.28 35
291 페이트님 혈맹버프를 실시간으로... 준희미니 2016.06.28 26
290 계급 및 혈맹 매칭 준희미니 2016.06.28 28
289 강제변신검 특화검 혹시나 필요하신분있을꺼같아서 준희미니 2016.06.28 59
288 npc 거리제한 해제 준희미니 2016.06.28 41
287 흑사버프 준희미니 2016.06.28 30
286 제브레퀴 라이브화 준희미니 2016.06.28 30
285 [에바] 3.80 옵코드 준희미니 2016.06.28 160
284 보스몹 유저 소환 준희미니 2016.06.28 98
283 성혈전용 던전이동주문서 만들어보자 준희미니 2016.06.28 45
282 전쟁.종전.항복 소스입니다 준희미니 2016.06.28 24
281 서먼 공속 막는 야매 준희미니 2016.06.28 35
280 환생물약(고전) 최강빅토리 2016.06.27 117
279 아덴 증가 로그 시스템 추가 최강빅토리 2016.06.27 57
278 몹 공격시 4대 용처럼 몹 주위로 강제 소환 되도록 하기 최강빅토리 2016.06.27 56
277 pvp 이긴사람에게 아이템 지급~ 최강빅토리 2016.06.27 65
276 지엠설정 아이피체크 외부화~ 최강빅토리 2016.06.27 64
275 기란마을 제이프퀘 본섭화 최강빅토리 2016.06.27 48
274 펫레이싱 본섭화 하기~ 최강빅토리 2016.06.27 57
273 엔피씨에게 호칭을 주자~ 최강빅토리 2016.06.27 40
272 유저 접속시 매니저창에 서버에 접속한 총인원을 표시 최강빅토리 2016.06.27 52
271 쉽게 올버프물약 만들어보자~ 최강빅토리 2016.06.27 190
270 아이템드랍 필드별제한 최강빅토리 2016.06.27 52
269 스핵5회감지시 좀비로변신하게~ 최강빅토리 2016.06.27 53
268 세트착용시 화려한임팩 최강빅토리 2016.06.27 61
267 붉은기사단의 물약 최강빅토리 2016.06.27 47
266 변신이벤트 외부화로 해봅시다~(2.7 Rev1484용)[Eva는 조금다름] 최강빅토리 2016.06.27 72
» 마방및 마법데미지 본x화 최강빅토리 2016.06.27 282
264 PK시 이긴사람이 진사람에게 깃털 뺏어오기 최강빅토리 2016.06.27 34
263 스냅퍼 용사/지혜 반지 준희미니 2016.06.27 40
262 투석기입니다용; 준희미니 2016.06.27 15
261 성장의 마법사^에킨스 준희미니 2016.06.27 30
260 한국옵 코 준희미니 2016.06.27 108