// °ЎБЯДЎ ЕЧАМєн(prob_lst)А» №ЮѕЖ random_set.size()°іАЗ indexё¦ ј±ЕГЗПї© random_setА» return bool MakeDistinctRandomNumberSet(std::list <float> prob_lst, OUT std::vector<int>& random_set) { int size = prob_lst.size(); int n = random_set.size(); if (size < n) return false; std::vector <int> select_bit(size, 0); for (int i = 0; i < n; i++) { float range = 0.f; for (std::list <float>::iterator it = prob_lst.begin(); it != prob_lst.end(); it++) { range += *it; } float r = fnumber (0.f, range); float sum = 0.f; int idx = 0; for (std::list <float>::iterator it = prob_lst.begin(); it != prob_lst.end(); it++) { while (select_bit[idx++]); sum += *it; if (sum >= r) { select_bit[idx - 1] = 1; random_set[i] = idx - 1; prob_lst.erase(it); break; } } } return true; }
int constant(LVALUE *lval) { constype=CINT; conssign=dosigned; lval->is_const = 1 ; /* assume constant will be found */ if ( fnumber(&lval->const_val) ) { lval->val_type=DOUBLE; if ( doublestrings ) { immedlit(litlab); outdec(lval->const_val); nl(); callrts("__atof2"); WriteDefined("math_atof",1); } else { immedlit(dublab); outdec(lval->const_val); nl(); callrts("dload"); } lval->is_const = 0 ; /* floating point not constant */ lval->flags=0; return(1); } else if ( number(&lval->const_val) || pstr(&lval->const_val) ) { /* Insert long stuff/long pointer here? */ if ( (unsigned long )lval->const_val >= 65536LU ) constype = LONG; lval->val_type = constype ; lval->flags = (lval->flags&MKSIGN)|conssign; if (constype == LONG) vlongconst(lval->const_val); else vconst(lval->const_val); return(1); } else if ( tstr(&lval->const_val) ) { lval->is_const = 0 ; /* string address not constant */ lval->ptr_type=CCHAR; /* djm 9/3/99 */ lval->val_type=CINT; lval->flags=0; immedlit(litlab); } else { lval->is_const = 0 ; return(0); } outdec(lval->const_val); nl(); return(1); }
int Gamble(std::vector<float>& vec_probs) { float range = 0.f; for (int i = 0; i < vec_probs.size(); i++) { range += vec_probs[i]; } float fProb = fnumber(0.f, range); float sum = 0.f; for (int idx = 0; idx < vec_probs.size(); idx++) { sum += vec_probs[idx]; if (sum >= fProb) return idx; } return -1; }
void CrwMap::extract0x102a(const CiffComponent& ciffComponent, const CrwMapInfo* crwMapInfo, Image& image, ByteOrder byteOrder) { if (ciffComponent.typeId() != unsignedShort) { return extractBasic(ciffComponent, crwMapInfo, image, byteOrder); } long aperture = 0; long shutterSpeed = 0; std::string ifdItem(ExifTags::ifdItem(canonCs2IfdId)); uint16_t c = 1; while (uint32_t(c)*2 < ciffComponent.size()) { uint16_t n = 1; ExifKey key(c, ifdItem); UShortValue value; value.read(ciffComponent.pData() + c*2, n*2, byteOrder); image.exifData().add(key, &value); if (c == 21) aperture = value.toLong(); if (c == 22) shutterSpeed = value.toLong(); c += n; } // Exif.Photo.FNumber float f = fnumber(canonEv(aperture)); // Beware: primitive conversion algorithm uint32_t den = 1000000; uint32_t nom = static_cast<uint32_t>(f * den); uint32_t g = gcd(nom, den); URational ur(nom/g, den/g); URationalValue fn; fn.value_.push_back(ur); image.exifData().add(ExifKey("Exif.Photo.FNumber"), &fn); // Exif.Photo.ExposureTime ur = exposureTime(canonEv(shutterSpeed)); URationalValue et; et.value_.push_back(ur); image.exifData().add(ExifKey("Exif.Photo.ExposureTime"), &et); } // CrwMap::extract0x102a
bool DSManager::DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_REFINE_GRID_SIZE]) { if (NULL == ch) return false; if (NULL == aItemPoses) { return false; } if (!ch->DragonSoul_RefineWindow_CanRefine()) { sys_err ("%s do not activate DragonSoulRefineWindow. But how can he come here?", ch->GetName()); ch->ChatPacket(CHAT_TYPE_INFO, "[SYSTEM ERROR]You cannot use dragon soul refine window."); return false; } // И¤ЅГіЄ ёрё¦ БЯє№µЗґВ item pointer ѕшѕЦ±в А§ЗШј set »зїл // АМ»уЗС ЖРЕ¶А» єёіѕ °жїм, БЯє№µИ TItemPos°Ў АЦА» јцµµ АЦ°н, АЯёшµИ TItemPos°Ў АЦА» јцµµ АЦґЩ. std::set <LPITEM> set_items; for (int i = 0; i < DRAGON_SOUL_REFINE_GRID_SIZE; i++) { LPITEM pItem = ch->GetItem(aItemPoses[i]); if (pItem) { set_items.insert(pItem); } } if (set_items.size() == 0) { return false; } int fee; LPITEM pRefineStone = NULL; LPITEM pDragonSoul = NULL; for (std::set <LPITEM>::iterator it = set_items.begin(); it != set_items.end(); it++) { LPITEM pItem = *it; // Е¬¶у uiїЎј АеВшЗС ѕЖАМЕЫАє °і·®ГўїЎ їГё± јц ѕшµµ·П ё·ѕТ±в ¶§№®їЎ, // є°µµАЗ ѕЛёІ Гіё®ґВ ѕИЗФ. if (pItem->IsEquipped()) { return false; } // їлИҐј®°ъ °Иј®ёёАМ °і·®ГўїЎ АЦА» јц АЦґЩ. // ±Чё®°н ЗПіЄѕїёё АЦѕоѕЯЗСґЩ. if (pItem->IsDragonSoul()) { if (pDragonSoul != NULL) { SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell())); return false; } pDragonSoul = pItem; } else if(IsDragonSoulRefineMaterial(pItem)) { if (pRefineStone != NULL) { SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell())); return false; } pRefineStone = pItem; } else { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°ИїЎ ЗКїдЗС Аз·б°Ў ѕЖґХґПґЩ.")); SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell())); return false; } } BYTE bType, bGrade, bStep, bStrength; if (!pDragonSoul || !pRefineStone) { SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL, NPOS); return false; } if (NULL != pDragonSoul) { GetDragonSoulInfo(pDragonSoul->GetVnum(), bType, bGrade, bStep, bStrength); float fWeight = 0.f; // °ЎБЯДЎ °ЄАМ ѕшґЩёй °ИЗТ јц ѕшґВ їлИҐј® if (!m_pTable->GetWeight(bType, bGrade, bStep, bStrength + 1, fWeight)) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°ИЗТ јц ѕшґВ їлИҐј®АФґПґЩ.")); SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE, TItemPos(pDragonSoul->GetWindow(), pDragonSoul->GetCell())); return false; } // °ИЗЯА» ¶§ °ЎБЯДЎ°Ў 0АМ¶уёй ґх АМ»у °ИµЗјґВ ѕИµИґЩ. if (fWeight < FLT_EPSILON) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°ИЗТ јц ѕшґВ їлИҐј®АФґПґЩ.")); SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE, TItemPos(pDragonSoul->GetWindow(), pDragonSoul->GetCell())); return false; } } float fProb; if (!m_pTable->GetRefineStrengthValues(bType, pRefineStone->GetSubType(), bStrength, fee, fProb)) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°ИЗТ јц ѕшґВ їлИҐј®АФґПґЩ.")); SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pDragonSoul->GetWindow(), pDragonSoul->GetCell())); return false; } if (ch->GetGold() < fee) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°і·®А» ЗП±в А§ЗС µ·АМ єОБ·ЗХґПґЩ.")); SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY, NPOS); return false; } ch->PointChange(POINT_GOLD, -fee); LPITEM pResult = NULL; BYTE bSubHeader; if (fnumber(0.f, 100.f) <= fProb) { pResult = ITEM_MANAGER::instance().CreateItem(MakeDragonSoulVnum(bType, bGrade, bStep, bStrength + 1)); if (NULL == pResult) { sys_err ("INVALID DRAGON SOUL(%d)", MakeDragonSoulVnum(bType, bGrade, bStep, bStrength + 1)); return false; } pDragonSoul->RemoveFromCharacter(); pDragonSoul->CopyAttributeTo(pResult); RefreshItemAttributes(pResult); pDragonSoul->SetCount(pDragonSoul->GetCount() - 1); pRefineStone->SetCount(pRefineStone->GetCount() - 1); char buf[128]; sprintf(buf, "STRENGTH : %d -> %d", bStrength, bStrength + 1); LogManager::instance().ItemLog(ch, pDragonSoul, "DS_STRENGTH_REFINE_SUCCESS", buf); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°ИїЎ јє°шЗЯЅАґПґЩ.")); ch->AutoGiveItem(pResult, true); bSubHeader = DS_SUB_HEADER_REFINE_SUCCEED; } else { if (bStrength != 0) { pResult = ITEM_MANAGER::instance().CreateItem(MakeDragonSoulVnum(bType, bGrade, bStep, bStrength - 1)); if (NULL == pResult) { sys_err ("INVALID DRAGON SOUL(%d)", MakeDragonSoulVnum(bType, bGrade, bStep, bStrength - 1)); return false; } pDragonSoul->CopyAttributeTo(pResult); RefreshItemAttributes(pResult); } bSubHeader = DS_SUB_HEADER_REFINE_FAIL; char buf[128]; sprintf(buf, "STRENGTH : %d -> %d", bStrength, bStrength - 1); // strength°ИґВ ЅЗЖРЅГ ±ъБъ јцµµ АЦѕо, їшє» ѕЖАМЕЫА» №ЩЕБАё·О ·О±Чё¦ іІ±и. LogManager::instance().ItemLog(ch, pDragonSoul, "DS_STRENGTH_REFINE_FAIL", buf); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°ИїЎ ЅЗЖРЗЯЅАґПґЩ.")); pDragonSoul->SetCount(pDragonSoul->GetCount() - 1); pRefineStone->SetCount(pRefineStone->GetCount() - 1); if (NULL != pResult) ch->AutoGiveItem(pResult, true); } SendRefineResultPacket(ch, bSubHeader, NULL == pResult? NPOS : TItemPos (pResult->GetWindow(), pResult->GetCell())); return true; }
// ЖЇБ¤ їлИҐј®А» АеєсГўїЎј Б¦°ЕЗТ ¶§їЎ јє°ш ї©єОё¦ °бБ¤ЗП°н, ЅЗЖРЅГ єО»к№°А» БЦґВ ЗФјц. bool DSManager::PullOut(LPCHARACTER ch, TItemPos DestCell, LPITEM& pItem, LPITEM pExtractor) { if (NULL == ch || NULL == pItem) { sys_err ("NULL POINTER. ch(%p) or pItem(%p)", ch, pItem); return false; } // ёсЗҐ А§ДЎ°Ў validЗСБц °Л»з ИД, validЗПБц ѕКґЩёй АУАЗАЗ єу °ш°ЈА» ГЈґВґЩ. if (!IsValidCellForThisItem(pItem, DestCell)) { int iEmptyCell = ch->GetEmptyDragonSoulInventory(pItem); if (iEmptyCell < 0) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("јТБцЗ°їЎ єу °ш°ЈАМ ѕшЅАґПґЩ.")); return false; } else { DestCell.window_type = DRAGON_SOUL_INVENTORY; DestCell.cell = iEmptyCell; } } if (!pItem->IsEquipped() || !pItem->RemoveFromCharacter()) return false; bool bSuccess; DWORD dwByProduct = 0; int iBonus = 0; float fProb; float fDice; // їлИҐј® ГЯГв јє°ш ї©єО °бБ¤. { DWORD dwVnum = pItem->GetVnum(); BYTE ds_type, grade_idx, step_idx, strength_idx; GetDragonSoulInfo(pItem->GetVnum(), ds_type, grade_idx, step_idx, strength_idx); // ГЯГв Б¤єё°Ў ѕшґЩёй АПґЬ №«Б¶°З јє°шЗПґВ °НАМ¶у »э°ўЗПАЪ. if (!m_pTable->GetDragonSoulExtValues(ds_type, grade_idx, fProb, dwByProduct)) { pItem->AddToCharacter(ch, DestCell); return true; } if (NULL != pExtractor) { iBonus = pExtractor->GetValue(ITEM_VALUE_DRAGON_SOUL_POLL_OUT_BONUS_IDX); pExtractor->SetCount(pExtractor->GetCount() - 1); } fDice = fnumber(0.f, 100.f); bSuccess = fDice <= (fProb * (100 + iBonus) / 100.f); } // ДіёЇЕНАЗ їлИҐј® ГЯГв №Ч ГЯ°Ў И¤Ає Б¦°Е. єО»к№° Б¦°ш. { char buf[128]; if (bSuccess) { if (pExtractor) { sprintf(buf, "dice(%d) prob(%d + %d) EXTR(VN:%d)", (int)fDice, (int)fProb, iBonus, pExtractor->GetVnum()); } else { sprintf(buf, "dice(%d) prob(%d)", fDice, fProb); } LogManager::instance().ItemLog(ch, pItem, "DS_PULL_OUT_SUCCESS", buf); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("їлИҐј® ГЯГвїЎ јє°шЗПїґЅАґПґЩ.")); pItem->AddToCharacter(ch, DestCell); return true; } else { if (pExtractor) { sprintf(buf, "dice(%d) prob(%d + %d) EXTR(VN:%d) ByProd(VN:%d)", (int)fDice, (int)fProb, iBonus, pExtractor->GetVnum(), dwByProduct); } else { sprintf(buf, "dice(%d) prob(%d) ByProd(VNUM:%d)", (int)fDice, (int)fProb, dwByProduct); } LogManager::instance().ItemLog(ch, pItem, "DS_PULL_OUT_FAILED", buf); M2_DESTROY_ITEM(pItem); pItem = NULL; if (dwByProduct) { LPITEM pByProduct = ch->AutoGiveItem(dwByProduct, true); if (pByProduct) ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("їлИҐј® ГЯГвїЎ ЅЗЖРЗПї© %sё¦ ѕтѕъЅАґПґЩ."), pByProduct->GetName()); else ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("їлИҐј® ГЯГвїЎ ЅЗЖРЗПїґЅАґПґЩ.")); } else ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("їлИҐј® ГЯГвїЎ ЅЗЖРЗПїґЅАґПґЩ.")); } } return bSuccess; }
bool DSManager::DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_REFINE_GRID_SIZE]) { if (NULL == ch) return false; if (NULL == aItemPoses) { return false; } if (!ch->DragonSoul_RefineWindow_CanRefine()) { sys_err ("%s do not activate DragonSoulRefineWindow. But how can he come here?", ch->GetName()); ch->ChatPacket(CHAT_TYPE_INFO, "[SYSTEM ERROR]You cannot use dragon soul refine window."); return false; } // 혹시나 모를 중복되는 item pointer 없애기 위해서 set 사용 // 이상한 패킷을 보낼 경우, 중복된 TItemPos가 있을 수도 있고, 잘못된 TItemPos가 있을 수도 있다. std::set <LPITEM> set_items; for (int i = 0; i < DRAGON_SOUL_REFINE_GRID_SIZE; i++) { LPITEM pItem = ch->GetItem(aItemPoses[i]); if (pItem) { set_items.insert(pItem); } } if (set_items.size() == 0) { return false; } int fee; LPITEM pRefineStone = NULL; LPITEM pDragonSoul = NULL; for (std::set <LPITEM>::iterator it = set_items.begin(); it != set_items.end(); it++) { LPITEM pItem = *it; // 클라 ui에서 장착한 아이템은 개량창에 올릴 수 없도록 막았기 때문에, // 별도의 알림 처리는 안함. if (pItem->IsEquipped()) { return false; } // 용혼석과 강화석만이 개량창에 있을 수 있다. // 그리고 하나씩만 있어야한다. if (pItem->IsDragonSoul()) { if (pDragonSoul != NULL) { SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell())); return false; } pDragonSoul = pItem; } else if(IsDragonSoulRefineMaterial(pItem)) { if (pRefineStone != NULL) { SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell())); return false; } pRefineStone = pItem; } else { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화에 필요한 재료가 아닙니다.")); SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell())); return false; } } BYTE bType, bGrade, bStep, bStrength; if (!pDragonSoul || !pRefineStone) { SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL, NPOS); return false; } if (NULL != pDragonSoul) { GetDragonSoulInfo(pDragonSoul->GetVnum(), bType, bGrade, bStep, bStrength); float fWeight = 0.f; // 가중치 값이 없다면 강화할 수 없는 용혼석 if (!m_pTable->GetWeight(bType, bGrade, bStep, bStrength + 1, fWeight)) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화할 수 없는 용혼석입니다.")); SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE, TItemPos(pDragonSoul->GetWindow(), pDragonSoul->GetCell())); return false; } // 강화했을 때 가중치가 0이라면 더 이상 강화되서는 안된다. if (fWeight < FLT_EPSILON) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화할 수 없는 용혼석입니다.")); SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE, TItemPos(pDragonSoul->GetWindow(), pDragonSoul->GetCell())); return false; } } float fProb; if (!m_pTable->GetRefineStrengthValues(bType, pRefineStone->GetSubType(), bStrength, fee, fProb)) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화할 수 없는 용혼석입니다.")); SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pDragonSoul->GetWindow(), pDragonSoul->GetCell())); return false; } if (ch->GetGold() < fee) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("개량을 하기 위한 돈이 부족합니다.")); SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY, NPOS); return false; } ch->PointChange(POINT_GOLD, -fee); LPITEM pResult = NULL; BYTE bSubHeader; if (fnumber(0.f, 100.f) <= fProb) { pResult = ITEM_MANAGER::instance().CreateItem(MakeDragonSoulVnum(bType, bGrade, bStep, bStrength + 1)); if (NULL == pResult) { sys_err ("INVALID DRAGON SOUL(%d)", MakeDragonSoulVnum(bType, bGrade, bStep, bStrength + 1)); return false; } pDragonSoul->RemoveFromCharacter(); pDragonSoul->CopyAttributeTo(pResult); RefreshItemAttributes(pResult); pDragonSoul->SetCount(pDragonSoul->GetCount() - 1); pRefineStone->SetCount(pRefineStone->GetCount() - 1); char buf[128]; sprintf(buf, "STRENGTH : %d -> %d", bStrength, bStrength + 1); LogManager::instance().ItemLog(ch, pDragonSoul, "DS_STRENGTH_REFINE_SUCCESS", buf); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화에 성공했습니다.")); ch->AutoGiveItem(pResult, true); bSubHeader = DS_SUB_HEADER_REFINE_SUCCEED; } else { if (bStrength != 0) { pResult = ITEM_MANAGER::instance().CreateItem(MakeDragonSoulVnum(bType, bGrade, bStep, bStrength - 1)); if (NULL == pResult) { sys_err ("INVALID DRAGON SOUL(%d)", MakeDragonSoulVnum(bType, bGrade, bStep, bStrength - 1)); return false; } pDragonSoul->CopyAttributeTo(pResult); RefreshItemAttributes(pResult); } bSubHeader = DS_SUB_HEADER_REFINE_FAIL; char buf[128]; sprintf(buf, "STRENGTH : %d -> %d", bStrength, bStrength - 1); // strength강화는 실패시 깨질 수도 있어, 원본 아이템을 바탕으로 로그를 남김. LogManager::instance().ItemLog(ch, pDragonSoul, "DS_STRENGTH_REFINE_FAIL", buf); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("강화에 실패했습니다.")); pDragonSoul->SetCount(pDragonSoul->GetCount() - 1); pRefineStone->SetCount(pRefineStone->GetCount() - 1); if (NULL != pResult) ch->AutoGiveItem(pResult, true); } SendRefineResultPacket(ch, bSubHeader, NULL == pResult? NPOS : TItemPos (pResult->GetWindow(), pResult->GetCell())); return true; }
// 특정 용혼석을 장비창에서 제거할 때에 성공 여부를 결정하고, 실패시 부산물을 주는 함수. bool DSManager::PullOut(LPCHARACTER ch, TItemPos DestCell, LPITEM& pItem, LPITEM pExtractor) { if (NULL == ch || NULL == pItem) { sys_err ("NULL POINTER. ch(%p) or pItem(%p)", ch, pItem); return false; } // 목표 위치가 valid한지 검사 후, valid하지 않다면 임의의 빈 공간을 찾는다. if (!IsValidCellForThisItem(pItem, DestCell)) { int iEmptyCell = ch->GetEmptyDragonSoulInventory(pItem); if (iEmptyCell < 0) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("소지품에 빈 공간이 없습니다.")); return false; } else { DestCell.window_type = DRAGON_SOUL_INVENTORY; DestCell.cell = iEmptyCell; } } if (!pItem->IsEquipped() || !pItem->RemoveFromCharacter()) return false; bool bSuccess; DWORD dwByProduct = 0; int iBonus = 0; float fProb; float fDice; // 용혼석 추출 성공 여부 결정. { DWORD dwVnum = pItem->GetVnum(); BYTE ds_type, grade_idx, step_idx, strength_idx; GetDragonSoulInfo(pItem->GetVnum(), ds_type, grade_idx, step_idx, strength_idx); // 추출 정보가 없다면 일단 무조건 성공하는 것이라 생각하자. if (!m_pTable->GetDragonSoulExtValues(ds_type, grade_idx, fProb, dwByProduct)) { pItem->AddToCharacter(ch, DestCell); return true; } if (NULL != pExtractor) { iBonus = pExtractor->GetValue(ITEM_VALUE_DRAGON_SOUL_POLL_OUT_BONUS_IDX); pExtractor->SetCount(pExtractor->GetCount() - 1); } fDice = fnumber(0.f, 100.f); bSuccess = fDice <= (fProb * (100 + iBonus) / 100.f); } // 캐릭터의 용혼석 추출 및 추가 혹은 제거. 부산물 제공. { char buf[128]; if (bSuccess) { if (pExtractor) { sprintf(buf, "dice(%d) prob(%d + %d) EXTR(VN:%d)", (int)fDice, (int)fProb, iBonus, pExtractor->GetVnum()); } else { sprintf(buf, "dice(%d) prob(%d)", fDice, fProb); } LogManager::instance().ItemLog(ch, pItem, "DS_PULL_OUT_SUCCESS", buf); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("용혼석 추출에 성공하였습니다.")); pItem->AddToCharacter(ch, DestCell); return true; } else { if (pExtractor) { sprintf(buf, "dice(%d) prob(%d + %d) EXTR(VN:%d) ByProd(VN:%d)", (int)fDice, (int)fProb, iBonus, pExtractor->GetVnum(), dwByProduct); } else { sprintf(buf, "dice(%d) prob(%d) ByProd(VNUM:%d)", (int)fDice, (int)fProb, dwByProduct); } LogManager::instance().ItemLog(ch, pItem, "DS_PULL_OUT_FAILED", buf); M2_DESTROY_ITEM(pItem); pItem = NULL; if (dwByProduct) { LPITEM pByProduct = ch->AutoGiveItem(dwByProduct, true); if (pByProduct) ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("용혼석 추출에 실패하여 %s를 얻었습니다."), pByProduct->GetName()); else ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("용혼석 추출에 실패하였습니다.")); } else ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("용혼석 추출에 실패하였습니다.")); } } return bSuccess; }