float CalcAttackRating(LPCHARACTER pkAttacker, LPCHARACTER pkVictim, bool bIgnoreTargetRating) { int iARSrc; int iERSrc; if (LC_IsYMIR()) // 천마 { iARSrc = MIN(90, pkAttacker->GetPolymorphPoint(POINT_DX)); iERSrc = MIN(90, pkVictim->GetPolymorphPoint(POINT_DX)); } else { int attacker_dx = pkAttacker->GetPolymorphPoint(POINT_DX); int attacker_lv = pkAttacker->GetLevel(); int victim_dx = pkVictim->GetPolymorphPoint(POINT_DX); int victim_lv = pkAttacker->GetLevel(); iARSrc = MIN(90, (attacker_dx * 4 + attacker_lv * 2) / 6); iERSrc = MIN(90, (victim_dx * 4 + victim_lv * 2) / 6); } float fAR = ((float) iARSrc + 210.0f) / 300.0f; // fAR = 0.7 ~ 1.0 if (bIgnoreTargetRating) return fAR; // ((Edx * 2 + 20) / (Edx + 110)) * 0.3 float fER = ((float) (iERSrc * 2 + 5) / (iERSrc + 95)) * 3.0f / 10.0f; return fAR - fER; }
void CParty::Link(LPCHARACTER pkChr) { TMemberMap::iterator it; if (pkChr->IsPC()) it = m_memberMap.find(pkChr->GetPlayerID()); else it = m_memberMap.find(pkChr->GetVID()); if (it == m_memberMap.end()) { sys_err("%s is not member of this party", pkChr->GetName()); return; } // 플레이어 파티일 경우 업데이트 이벤트 생성 if (m_bPCParty && !m_eventUpdate) { party_update_event_info* info = AllocEventInfo<party_update_event_info>(); info->pid = m_dwLeaderPID; m_eventUpdate = event_create(party_update_event, info, PASSES_PER_SEC(3)); } if (it->second.bRole == PARTY_ROLE_LEADER) m_pkChrLeader = pkChr; sys_log(2, "PARTY[%d] %s linked to party", GetLeaderPID(), pkChr->GetName()); it->second.pCharacter = pkChr; pkChr->SetParty(this); if (pkChr->IsPC()) { if (it->second.strName.empty()) { it->second.strName = pkChr->GetName(); } SendPartyJoinOneToAll(pkChr->GetPlayerID()); SendPartyJoinAllToOne(pkChr); SendPartyLinkOneToAll(pkChr); SendPartyLinkAllToOne(pkChr); SendPartyInfoAllToOne(pkChr); SendPartyInfoOneToAll(pkChr); SendParameter(pkChr); //sys_log(0, "PARTY-DUNGEON connect %p %p", this, GetDungeon()); if (GetDungeon() && GetDungeon()->GetMapIndex() == pkChr->GetMapIndex()) { pkChr->SetDungeon(GetDungeon()); } RequestSetMemberLevel(pkChr->GetPlayerID(), pkChr->GetLevel()); } }
void CWarMap::OnKill(LPCHARACTER killer, LPCHARACTER ch) { if (m_bEnded) return; DWORD dwKillerGuild = 0; DWORD dwDeadGuild = 0; if (killer->GetGuild()) dwKillerGuild = killer->GetGuild()->GetID(); if (ch->GetGuild()) dwDeadGuild = ch->GetGuild()->GetID(); BYTE idx; sys_log(0, "WarMap::OnKill %u %u", dwKillerGuild, dwDeadGuild); if (!GetTeamIndex(dwKillerGuild, idx)) return; if (!GetTeamIndex(dwDeadGuild, idx)) return; switch (m_kMapInfo.bType) { case WAR_MAP_TYPE_NORMAL: SendGuildWarScore(dwKillerGuild, dwDeadGuild, 1, ch->GetLevel()); break; case WAR_MAP_TYPE_FLAG: { CAffect * pkAff = ch->FindAffect(AFFECT_WAR_FLAG); if (pkAff) { if (GetTeamIndex(pkAff->lApplyValue, idx)) AddFlag(idx, ch->GetX(), ch->GetY()); ch->RemoveAffect(AFFECT_WAR_FLAG); } } break; default: sys_err("unknown war map type %u index %d", m_kMapInfo.bType, m_kMapInfo.lMapIndex); break; } }
bool operator () (LPENTITY ent) { if (!ent->IsType(ENTITY_CHARACTER)) return false; LPCHARACTER pkChr = (LPCHARACTER) ent; if (pkChr->IsBuilding() && (pkChr->IsAffectFlag(AFF_BUILDING_CONSTRUCTION_SMALL) || pkChr->IsAffectFlag(AFF_BUILDING_CONSTRUCTION_LARGE) || pkChr->IsAffectFlag(AFF_BUILDING_UPGRADE))) { m_pkChrBuilding = pkChr; } if (pkChr->IsNPC()) { if ( !pkChr->IsMonster() || !m_pkChr->IsAttackMob() || m_pkChr->IsAggressive() ) return false; } if (pkChr->IsDead()) return false; if (pkChr->IsAffectFlag(AFF_EUNHYUNG) || pkChr->IsAffectFlag(AFF_INVISIBILITY) || pkChr->IsAffectFlag(AFF_REVIVE_INVISIBLE)) return false; if (pkChr->IsAffectFlag(AFF_TERROR) && m_pkChr->IsImmune(IMMUNE_TERROR) == false ) // 공포 처리 { if ( pkChr->GetLevel() >= m_pkChr->GetLevel() ) return false; } if ( m_pkChr->IsNoAttackShinsu() ) { if ( pkChr->GetEmpire() == 1 ) return false; } if ( m_pkChr->IsNoAttackChunjo() ) { if ( pkChr->GetEmpire() == 2 ) return false; } if ( m_pkChr->IsNoAttackJinno() ) { if ( pkChr->GetEmpire() == 3 ) return false; } int iDistance = DISTANCE_APPROX(m_lx - pkChr->GetX(), m_ly - pkChr->GetY()); if (iDistance < m_iMinDistance && iDistance <= m_iMaxDistance) { m_pkChrVictim = pkChr; m_iMinDistance = iDistance; } return true; }
bool CPolymorphUtils::PolymorphCharacter(LPCHARACTER pChar, LPITEM pItem, const CMob* pMob) { BYTE bySkillLevel = pChar->GetSkillLevel(POLYMORPH_SKILL_ID); DWORD dwDuration = 0; DWORD dwBonusPercent = 0; int iPolyPercent = 0; switch (pChar->GetSkillMasterType(POLYMORPH_SKILL_ID)) { case SKILL_NORMAL: dwDuration = 10; break; case SKILL_MASTER: dwDuration = 15; break; case SKILL_GRAND_MASTER: dwDuration = 20; break; case SKILL_PERFECT_MASTER: dwDuration = 25; break; default: return false; } // dwDuration *= 60; // 변신 확률 = 캐릭터 레벨 - 몹 레벨 + 둔갑서 레벨 + 29 + 둔갑 스킬 레벨 iPolyPercent = pChar->GetLevel() - pMob->m_table.bLevel + pItem->GetSocket(2) + (29 + bySkillLevel); if (iPolyPercent <= 0) { pChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("둔갑에 실패 하였습니다")); return false; } else { if (number(1, 100) > iPolyPercent) { pChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("둔갑에 실패 하였습니다")); return false; } } pChar->AddAffect(AFFECT_POLYMORPH, POINT_POLYMORPH, pMob->m_table.dwVnum, AFF_POLYMORPH, dwDuration, 0, true); // 변신 보너스 = 둔갑 스킬 레벨 + 둔갑서 레벨 dwBonusPercent = bySkillLevel + pItem->GetSocket(2); switch (GetBonusType(pMob->m_table.dwVnum)) { case POLYMORPH_ATK_BONUS: pChar->AddAffect(AFFECT_POLYMORPH, POINT_ATT_BONUS, dwBonusPercent, AFF_POLYMORPH, dwDuration - 1, 0, false); break; case POLYMORPH_DEF_BONUS: pChar->AddAffect(AFFECT_POLYMORPH, POINT_DEF_BONUS, dwBonusPercent, AFF_POLYMORPH, dwDuration - 1, 0, false); break; case POLYMORPH_SPD_BONUS: pChar->AddAffect(AFFECT_POLYMORPH, POINT_MOV_SPEED, dwBonusPercent, AFF_POLYMORPH, dwDuration - 1, 0, false); break; default: case POLYMORPH_NO_BONUS: break; } return true; }
void CThreeWayWar::onDead(LPCHARACTER pChar, LPCHARACTER pkKiller) { if (false == pChar->IsPC()) return; if (GM_PLAYER != pChar->GetGMLevel() && false == test_server) return; if (-1 == GetRegenFlag()) return; DecreaseReviveTokenForPlayer( pChar->GetPlayerID() ); if (false == IsSungZiMapIndex(pChar->GetMapIndex())) return; if (NULL == pkKiller || true != pkKiller->IsPC()) return; // °°Ає Б¦±№Ає °и»кЗПБц ѕКАЅ if (pChar->GetEmpire() == pkKiller->GetEmpire()) return; int nKillScore = GetKillScore(pkKiller->GetEmpire()); // Б¦±№ Еі ЅєДЪѕо°Ў -1АП°жїмґВ Е»¶ф±№°ЎА̱⶧№®їЎ БЎјц ГјЕ©ё¦ ЗПёй ѕИµИґЩ. if (nKillScore >= 0) { nKillScore += GetKillValue(pChar->GetLevel()); SetKillScore(pkKiller->GetEmpire(), nKillScore); } if (nKillScore != 0 && (test_server || (nKillScore % 5) == 0)) { char szBuf[64 + 1]; snprintf(szBuf, sizeof(szBuf), LC_TEXT("ЗцАз ЅєДЪѕо ЅЕјц±№:%d ГµБ¶±№:%d Бшіл±№:%d"), GetKillScore(1), GetKillScore(2), GetKillScore(3)); SendNoticeMap(szBuf, GetSungziMapIndex(), false); } const int nVictoryScore = quest::CQuestManager::instance().GetEventFlag("threeway_war_kill_count"); if (0 == GetRegenFlag()) { int nEliminatedEmpireCount = 0; BYTE bLoseEmpire = 0; for (int n = 1; n < 4; ++n) { if (nVictoryScore > GetKillScore(n)) { ++nEliminatedEmpireCount; bLoseEmpire = n; } } if (1 != nEliminatedEmpireCount) return; //---------------------- //Д«їоЖ® ГК±вИ //---------------------- SetKillScore(1, 0); SetKillScore(2, 0); SetKillScore(3, 0); SetKillScore(bLoseEmpire, -1); quest::warp_all_to_map_my_empire_event_info * info; //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : јєБцїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetSungziMapIndex(); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(10)); //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : Ел·ОїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetPassMapIndex(bLoseEmpire); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(10)); //---------------------- //јєБцїЎ ЖГ±вґВ ±№°ЎїЎ ґлЗС АМѕЯ±вё¦ ё¶їХАМ ЗФ! //---------------------- const std::string Nation(EMPIRE_NAME(bLoseEmpire)); const std::string Script( LC_TEXT("јєБцАЗ ё¶їХ: іКИс ") + Nation + LC_TEXT("іај®µйАє АМ°ч јєБцїЎ АЦА» АЪ°ЭА» АТѕъґЩ. ёрµО јєБцїЎј №°·ЇіЄ°Е¶у~~[ENTER][ENTER] 10ГК ИДїЎ ёрµО ё¶А»·О АМµїЗП°Ф µЛґПґЩ. ") + "[ENTER][DONE]" ); CHARACTER_MANAGER::instance().SendScriptToMap(pChar->GetMapIndex(), Script); //---------------------- // °шБц ЗС№ж іЇ·ББЬ. //---------------------- char szNotice[512+1]; snprintf(szNotice, sizeof(szNotice), LC_TEXT("»п°Её® АьЕхїЎј %s ±№°Ў°Ў °ЎАеёХАъ Е»¶фА» ЗПїґЅАґПґЩ"), Nation.c_str()); BroadcastNotice(szNotice); snprintf(szNotice, sizeof(szNotice), "First Step: %s exclusion", Nation.c_str()); LogManager::instance().CharLog(0, 0, 0, 0, "THREEWAY", szNotice, NULL); //---------------------- // ёчА» ё®БЁЗСґЩ. //---------------------- regen_mob_event_info* regen_info = AllocEventInfo<regen_mob_event_info>(); regen_info->dwMapIndex = pChar->GetMapIndex(); event_create(regen_mob_event, regen_info, PASSES_PER_SEC(10)); SetRegenFlag(1); } else if (1 == GetRegenFlag()) { int nVictoryEmpireIndex = 0; for (int n = 1; n < 4; ++n) { nKillScore = GetKillScore(n); if (nKillScore == -1) continue; if (nVictoryScore <= nKillScore) { nVictoryEmpireIndex = n; break; } } if (0 == nVictoryEmpireIndex) return; for (int n = 1; n < 4; ++n) { if (n != nVictoryEmpireIndex) { BYTE bLoseEmpire = n; quest::warp_all_to_map_my_empire_event_info * info; //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : јєБцїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetSungziMapIndex(); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(5)); //---------------------- //Е»¶ф±№°Ў ЕрАе ЅГЕ°±в : Ел·ОїЎј //---------------------- info = AllocEventInfo<quest::warp_all_to_map_my_empire_event_info>(); info->m_lMapIndexFrom = GetPassMapIndex(bLoseEmpire); info->m_lMapIndexTo = EMPIRE_START_MAP(bLoseEmpire); info->m_x = EMPIRE_START_X(bLoseEmpire); info->m_y = EMPIRE_START_Y(bLoseEmpire); info->m_bEmpire = bLoseEmpire; event_create(quest::warp_all_to_map_my_empire_event, info, PASSES_PER_SEC(5)); } } //------------------------------ // ГЦБѕ ЅєДЪѕо ЗҐЅГ //------------------------------ { char szBuf[64 + 1]; snprintf(szBuf, sizeof(szBuf), LC_TEXT("ЗцАз ЅєДЪѕо ЅЕјц±№:%d ГµБ¶±№:%d Бшіл±№:%d"), GetKillScore(1), GetKillScore(2), GetKillScore(3)); SendNoticeMap(szBuf, GetSungziMapIndex(), false); } // ёЮјјБцё¦ ¶зїцБШґЩ. LPSECTREE_MAP pSecMap = SECTREE_MANAGER::instance().GetMap(pChar->GetMapIndex()); if (NULL != pSecMap) { const std::string EmpireName(EMPIRE_NAME(nVictoryEmpireIndex)); const std::string Script( EmpireName + LC_TEXT(". іКИс°Ў јєБцАЗ јцИЈАЪё¦ Ав°Ф µИґЩёй іКИсґВ јєБцАЗ БЦАОАМ µИґЩ.[ENTER][ENTER] ") + "[ENTER][DONE]"); struct packet_script pack_script; pack_script.header = HEADER_GC_SCRIPT; pack_script.skin = 1; pack_script.src_size = Script.size(); quest::FSendPacketToEmpire fSend; fSend.bEmpire = nVictoryEmpireIndex; pack_script.size = pack_script.src_size + sizeof(struct packet_script); fSend.buf.write(&pack_script, sizeof(struct packet_script)); fSend.buf.write(&Script[0], Script.size()); pSecMap->for_each(fSend); char szBuf[512]; snprintf(szBuf, sizeof(szBuf), "Second Step: %s remain", EMPIRE_NAME( nVictoryEmpireIndex )); LogManager::instance().CharLog(0, 0, 0, 0, "THREEWAY", szBuf, NULL); } //------------------------------ // ё¶Бцё· єё»у : Бш±ё№МИЈ јТИЇ //----------------------------- for (int n = 0; n < quest::CQuestManager::instance().GetEventFlag("threeway_war_boss_count");) { int x = pChar->GetX(); int y = pChar->GetY(); x = (thecore_random() & 1) ? x - number(200, 1000) : x + number(200, 1000); y = (thecore_random() & 1) ? y - number(200, 1000) : y + number(200, 1000); if (x < 0) x = pChar->GetX(); if (y < 0) y = pChar->GetY(); LPCHARACTER ch = CHARACTER_MANAGER::instance().SpawnMob( GetEventSungZiMapInfo().m_iBossMobVnum, pChar->GetMapIndex(), x, y, 0, false); if (NULL != ch) { ch->SetAggressive(); ++n; } } SetRegenFlag(-1); } }
int CalcArrowDamage(LPCHARACTER pkAttacker, LPCHARACTER pkVictim, LPITEM pkBow, LPITEM pkArrow, bool bIgnoreDefense) { if (!pkBow || pkBow->GetType() != ITEM_WEAPON || pkBow->GetSubType() != WEAPON_BOW) return 0; if (!pkArrow) return 0; // 타격치 계산부 int iDist = (int) (DISTANCE_SQRT(pkAttacker->GetX() - pkVictim->GetX(), pkAttacker->GetY() - pkVictim->GetY())); //int iGap = (iDist / 100) - 5 - pkBow->GetValue(5) - pkAttacker->GetPoint(POINT_BOW_DISTANCE); int iGap = (iDist / 100) - 5 - pkAttacker->GetPoint(POINT_BOW_DISTANCE); int iPercent = 100 - (iGap * 5); if (iPercent <= 0) return 0; else if (iPercent > 100) iPercent = 100; int iDam = 0; float fAR = CalcAttackRating(pkAttacker, pkVictim, false); iDam = number(pkBow->GetValue(3), pkBow->GetValue(4)) * 2 + pkArrow->GetValue(3); int iAtk; // level must be ignored when multiply by fAR, so subtract it before calculation. iAtk = pkAttacker->GetPoint(POINT_ATT_GRADE) + iDam - (pkAttacker->GetLevel() * 2); iAtk = (int) (iAtk * fAR); iAtk += pkAttacker->GetLevel() * 2; // and add again // Refine Grade iAtk += pkBow->GetValue(5) * 2; iAtk += pkAttacker->GetPoint(POINT_PARTY_ATTACKER_BONUS); iAtk = (int) (iAtk * (100 + (pkAttacker->GetPoint(POINT_ATT_BONUS) + pkAttacker->GetPoint(POINT_MELEE_MAGIC_ATT_BONUS_PER))) / 100); iAtk = CalcAttBonus(pkAttacker, pkVictim, iAtk); int iDef = 0; if (!bIgnoreDefense) iDef = (pkVictim->GetPoint(POINT_DEF_GRADE) * (100 + pkAttacker->GetPoint(POINT_DEF_BONUS)) / 100); if (pkAttacker->IsNPC()) iAtk = (int) (iAtk * pkAttacker->GetMobDamageMultiply()); iDam = MAX(0, iAtk - iDef); int iPureDam = iDam; iPureDam = (iPureDam * iPercent) / 100; if (test_server) { pkAttacker->ChatPacket(CHAT_TYPE_INFO, "ARROW %s -> %s, DAM %d DIST %d GAP %d %% %d", pkAttacker->GetName(), pkVictim->GetName(), iPureDam, iDist, iGap, iPercent); } return iPureDam; //return iDam; }
int CalcMeleeDamage(LPCHARACTER pkAttacker, LPCHARACTER pkVictim, bool bIgnoreDefense, bool bIgnoreTargetRating) { LPITEM pWeapon = pkAttacker->GetWear(WEAR_WEAPON); bool bPolymorphed = pkAttacker->IsPolymorphed(); if (pWeapon && !(bPolymorphed && !pkAttacker->IsPolyMaintainStat())) { if (pWeapon->GetType() != ITEM_WEAPON) return 0; switch (pWeapon->GetSubType()) { case WEAPON_SWORD: case WEAPON_DAGGER: case WEAPON_TWO_HANDED: case WEAPON_BELL: case WEAPON_FAN: case WEAPON_MOUNT_SPEAR: break; case WEAPON_BOW: sys_err("CalcMeleeDamage should not handle bows (name: %s)", pkAttacker->GetName()); return 0; default: return 0; } } int iDam = 0; float fAR = CalcAttackRating(pkAttacker, pkVictim, bIgnoreTargetRating); int iDamMin = 0, iDamMax = 0; // TESTSERVER_SHOW_ATTACKINFO int DEBUG_iDamCur = 0; int DEBUG_iDamBonus = 0; // END_OF_TESTSERVER_SHOW_ATTACKINFO if (bPolymorphed && !pkAttacker->IsPolyMaintainStat()) { // MONKEY_ROD_ATTACK_BUG_FIX Item_GetDamage(pWeapon, &iDamMin, &iDamMax); // END_OF_MONKEY_ROD_ATTACK_BUG_FIX DWORD dwMobVnum = pkAttacker->GetPolymorphVnum(); const CMob * pMob = CMobManager::instance().Get(dwMobVnum); if (pMob) { int iPower = pkAttacker->GetPolymorphPower(); iDamMin += pMob->m_table.dwDamageRange[0] * iPower / 100; iDamMax += pMob->m_table.dwDamageRange[1] * iPower / 100; } } else if (pWeapon) { // MONKEY_ROD_ATTACK_BUG_FIX Item_GetDamage(pWeapon, &iDamMin, &iDamMax); // END_OF_MONKEY_ROD_ATTACK_BUG_FIX } else if (pkAttacker->IsNPC()) { iDamMin = pkAttacker->GetMobDamageMin(); iDamMax = pkAttacker->GetMobDamageMax(); } iDam = number(iDamMin, iDamMax) * 2; // TESTSERVER_SHOW_ATTACKINFO DEBUG_iDamCur = iDam; // END_OF_TESTSERVER_SHOW_ATTACKINFO // int iAtk = 0; // level must be ignored when multiply by fAR, so subtract it before calculation. iAtk = pkAttacker->GetPoint(POINT_ATT_GRADE) + iDam - (pkAttacker->GetLevel() * 2); iAtk = (int) (iAtk * fAR); iAtk += pkAttacker->GetLevel() * 2; // and add again if (pWeapon) { iAtk += pWeapon->GetValue(5) * 2; // 2004.11.12.myevan.TESTSERVER_SHOW_ATTACKINFO DEBUG_iDamBonus = pWeapon->GetValue(5) * 2; /////////////////////////////////////////////// } iAtk += pkAttacker->GetPoint(POINT_PARTY_ATTACKER_BONUS); // party attacker role bonus iAtk = (int) (iAtk * (100 + (pkAttacker->GetPoint(POINT_ATT_BONUS) + pkAttacker->GetPoint(POINT_MELEE_MAGIC_ATT_BONUS_PER))) / 100); iAtk = CalcAttBonus(pkAttacker, pkVictim, iAtk); int iDef = 0; if (!bIgnoreDefense) { iDef = (pkVictim->GetPoint(POINT_DEF_GRADE) * (100 + pkVictim->GetPoint(POINT_DEF_BONUS)) / 100); if (!pkAttacker->IsPC()) iDef += pkVictim->GetMarriageBonus(UNIQUE_ITEM_MARRIAGE_DEFENSE_BONUS); } if (pkAttacker->IsNPC()) iAtk = (int) (iAtk * pkAttacker->GetMobDamageMultiply()); iDam = MAX(0, iAtk - iDef); if (test_server) { int DEBUG_iLV = pkAttacker->GetLevel()*2; int DEBUG_iST = int((pkAttacker->GetPoint(POINT_ATT_GRADE) - DEBUG_iLV) * fAR); int DEBUG_iPT = pkAttacker->GetPoint(POINT_PARTY_ATTACKER_BONUS); int DEBUG_iWP = 0; int DEBUG_iPureAtk = 0; int DEBUG_iPureDam = 0; char szRB[32] = ""; char szGradeAtkBonus[32] = ""; DEBUG_iWP = int(DEBUG_iDamCur * fAR); DEBUG_iPureAtk = DEBUG_iLV + DEBUG_iST + DEBUG_iWP+DEBUG_iDamBonus; DEBUG_iPureDam = iAtk - iDef; if (pkAttacker->IsNPC()) { snprintf(szGradeAtkBonus, sizeof(szGradeAtkBonus), "=%d*%.1f", DEBUG_iPureAtk, pkAttacker->GetMobDamageMultiply()); DEBUG_iPureAtk = int(DEBUG_iPureAtk * pkAttacker->GetMobDamageMultiply()); } if (DEBUG_iDamBonus != 0) snprintf(szRB, sizeof(szRB), "+RB(%d)", DEBUG_iDamBonus); char szPT[32] = ""; if (DEBUG_iPT != 0) snprintf(szPT, sizeof(szPT), ", PT=%d", DEBUG_iPT); char szUnknownAtk[32] = ""; if (iAtk != DEBUG_iPureAtk) snprintf(szUnknownAtk, sizeof(szUnknownAtk), "+?(%d)", iAtk-DEBUG_iPureAtk); char szUnknownDam[32] = ""; if (iDam != DEBUG_iPureDam) snprintf(szUnknownDam, sizeof(szUnknownDam), "+?(%d)", iDam-DEBUG_iPureDam); char szMeleeAttack[128]; snprintf(szMeleeAttack, sizeof(szMeleeAttack), "%s(%d)-%s(%d)=%d%s, ATK=LV(%d)+ST(%d)+WP(%d)%s%s%s, AR=%.3g%s", pkAttacker->GetName(), iAtk, pkVictim->GetName(), iDef, iDam, szUnknownDam, DEBUG_iLV, DEBUG_iST, DEBUG_iWP, szRB, szUnknownAtk, szGradeAtkBonus, fAR, szPT); pkAttacker->ChatPacket(CHAT_TYPE_TALKING, "%s", szMeleeAttack); pkVictim->ChatPacket(CHAT_TYPE_TALKING, "%s", szMeleeAttack); } return CalcBattleDamage(iDam, pkAttacker->GetLevel(), pkVictim->GetLevel()); }
int CalcMagicDamageWithValue(int iDam, LPCHARACTER pkAttacker, LPCHARACTER pkVictim) { return CalcBattleDamage(iDam, pkAttacker->GetLevel(), pkVictim->GetLevel()); }