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

마방 및 마법데미지 본x화

2016.06.02 08:24

연구사원 조회 수:595

퍼옴 이라서 중복이라면 삭제 요청 해주세요.

 

마법데미지와 인트와 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);
}
 

대충 여기까지 입니다.

 

-출처 : 러브연구소 왠마왕님 입니다.

[출처] 마방 및 마법데미지 본x화 (비공개 카페)

번호 제목 글쓴이 날짜 조회 수
공지 소스자료는 직접 올려주세요 게임존 2017.06.06 550
209 [요정]속성 마법에 의한 추가 데미지 연구사원 2016.06.07 94
208 특정지역 몬스터 아덴드랍율 높히기.txt [1] 연구사원 2016.06.07 131
207 NPC 호칭 달아주기 소스 연구사원 2016.06.07 74
206 환생 npc LTE 2016.06.06 136
205 gm용 아이템 생성 npc [1] LTE 2016.06.06 212
204 워프 npc LTE 2016.06.06 58
203 성형 npc LTE 2016.06.06 67
202 수동 스킬마스터 LTE 2016.06.06 323
201 홍보코인 상점npc LTE 2016.06.06 131
200 자동전직 npc LTE 2016.06.06 108
199 개경소스 [1] 연구사원 2016.06.03 344
198 공성전 군주지급템에 관한 소스 연구사원 2016.06.02 87
» 마방 및 마법데미지 본x화 [1] 연구사원 2016.06.02 595
196 정확한 마방값을 불러오자 김닉넴 2016.05.20 196
195 버그사용자에게 몬스터가 말하기 | 김닉넴 2016.05.20 163
194 윈성 용병대장에게서 폭풍의칼날단 받는소스 입니다 김닉넴 2016.05.20 89
193 빈주문서추가 김닉넴 2016.05.20 52
192 마방이랑 옵션 완벽 적용 [1] 김닉넴 2016.05.20 218
191 공성시간 자동 돌리기 김닉넴 2016.05.20 84
190 재질에 의한 타격치.. 김닉넴 2016.05.20 58
189 헤이스트 아이템 헤이스트효과구현 김닉넴 2016.05.20 35
188 언데드계열 힐주기 김닉넴 2016.05.20 28
187 덱방을 알아보자.. 김닉넴 2016.05.20 49
186 마법사_에볼 김닉넴 2016.05.20 70
185 마법서복권 김닉넴 2016.05.20 65
184 마법투구 헤이스트추가 김닉넴 2016.05.20 37
183 마수군왕의 징표함 적용 김닉넴 2016.05.20 31
182 만라우풀일때 아이템 안떨구기 김닉넴 2016.05.20 118
181 말하는 두루마리 무게버그수정.txt 김닉넴 2016.05.20 50
180 몬스터 벽인식 김닉넴 2016.05.20 148
179 몹 HP게이지 만들기 [3] 김닉넴 2016.05.20 185
178 GM명령어 아크변신 김닉넴 2016.05.20 138
177 간단 낚시 버그 김닉넴 2016.05.20 173
176 UI5 Key [출처] UI5 Key 김닉넴 2016.05.20 31
175 UI5 서버버전패킷 & 언노운 김닉넴 2016.05.20 51
174 UI5 옵코드 김닉넴 2016.05.20 245
173 린드비오르 레이드 맵 / 확인불명 신규맵 김닉넴 2016.05.20 49
172 4.20일자 key 언노운 서버버전 옵코드 김닉넴 2016.05.20 150
171 신규 spr 김닉넴 2016.05.20 194
170 두번째 인던맵 입니다 김닉넴 2016.05.20 77
169 인던 녹색 메세지 패킷 김닉넴 2016.05.20 29
168 이블 트릭.. 이블 리버스.. 소스(?) 일까나..ㅎㅎ 김닉넴 2016.05.20 104
167 A* 알고리즘 (몬스터 길찾기) 김닉넴 2016.05.20 286
166 [에바/일팩] * 귓속말 글자수 늘리는 방법 김닉넴 2016.05.20 23
165 [에바/일팩] * 3.63혈맹창 리뉴얼 김닉넴 2016.05.20 59
164 [점팩] * 드레이크인형 김닉넴 2016.05.20 55
163 [에바/일팩] * 바운스헌터 및 신규변신 김닉넴 2016.05.20 83
162 [에바/일팩] 스턴 확률조정법 김닉넴 2016.05.20 146
161 [150811] Opcodes 김닉넴 2016.05.20 402
160 PK 승리시 깃털 뺏기 김닉넴 2016.05.20 59