Ejemplo n.º 1
0
		float getGain(const AttribueContainer& value, const ResultContainer& result, ConditionnalFunctor& func) {
			func.reset();
			typename AttribueContainer::const_iterator ita = value.begin();

			typename ResultContainer::const_iterator itr = result.begin();
			typename ResultContainer::const_iterator itre = result.end();

			while (itr != itre) {
				if (func()) {
					attribue_per_result_[*ita][*itr]++;
					attribue_value_total_[*ita]++;
					result_value_yes_[*itr]++;

					++size_total_;
				}

				++func;
				++itr;
				++ita;
			}

			result_ = entropy_ =  getEntropy(result_value_yes_.begin(), result_value_yes_.end(),  size_total_);
			typename AttribuePerResultMap::iterator it_yes = attribue_per_result_.begin();
			typename AttribuePerResultMap::iterator it_yes_e = attribue_per_result_.end();
			typename AttribueMap::iterator it_tot = attribue_value_total_.begin();

			while (it_yes != it_yes_e) {
				result_ -= (it_tot->second / size_total_) * getEntropy(it_yes->second.begin(), it_yes->second.end(), it_tot->second);
				++it_yes;
				++it_tot;
			}
			return result_;
		}
Ejemplo n.º 2
0
ResultContainer AnitomyWrapper::parse(const QString &t_filename) {
  AnitomyString title = toAnitomyFormat(t_filename);

  // Parse the filename through anitomy
  try {
    m_anitomy.Parse(title);
  } catch (std::regex_error &e) {
    qWarning() << "Error parsing: " << fromAnitomyFormat(title);
    qWarning() << e.what();
    return ResultContainer();
  }

  auto &elements = m_anitomy.elements();

  /* Standardize the resolutions a bit
   * anitomy grabs the resolution based on the filename
   * Possibilities:
   *   1920x1080
   *   1280X720
   *   480p
   */
  QString res =
      fromAnitomyFormat(elements.get(anitomy::kElementVideoResolution));

  if (res.contains("x")) {
    // If res contains an 'x', just assume it's of the form WIDTHxHEIGHT
    // Convert it to HEIGHTp instead
    res = res.split("x").last() + "p";
  } else if (res.contains("X")) {
    // If res contains an 'X', just assume it's of the form WIDTHXHEIGHT
    // Convert it to HEIGHTp instead
    res = res.split("X").last() + "p";
  } else if (res.isEmpty()) {
    // If we don't have anything stored for res, assume it's 720p
    // Most subgroups don't list a resolution if they just release 720p
    res = "720p";
  }

  ResultContainer data;

  data.insert(Result::Title,
              fromAnitomyFormat(elements.get(anitomy::kElementAnimeTitle)));
  data.insert(Result::Episode,
              fromAnitomyFormat(elements.get(anitomy::kElementEpisodeNumber)));
  data.insert(Result::SubGroup,
              fromAnitomyFormat(elements.get(anitomy::kElementReleaseGroup)));
  data.insert(Result::Resolution, res);

  return data;
}
Ejemplo n.º 3
0
void diameter(const IntervalObject &v, ResultContainer &result)
{
  if(v.dimension()!=result.dimension())
    throw std::range_error("Unequal dimensions in function capd::vectalg::diameter");
  typename ResultContainer::iterator i = result.begin();
  typename IntervalObject::const_iterator b = v.begin(), e=v.end();

  while(b!=e)
  {
    *i = diam(*b);
    ++i;
    ++b;
  }
}
Ejemplo n.º 4
0
void diameter(const IntervalObject &v, ResultContainer &result)
{
  if(v.dimension()!=result.dimension())
    throw std::range_error("Unequal dimensions in function chomp::vectalg::diameter");
  typedef typename IntervalObject::ScalarType ScalarType;
  typename ResultContainer::iterator i = result.begin();
  typename IntervalObject::const_iterator b = v.begin(), e=v.end();

  while(b!=e)
  {
    *i = (ScalarType(b->rightBound()) - ScalarType(b->leftBound())).rightBound();
    ++i;
    ++b;
  }
}
Ejemplo n.º 5
0
		static Result getRandomResult(const ResultContainer& container) {
			boost::random::uniform_int_distribution<int> distribution(0, container.size());
			int value = distribution(boost::random::mt19937());

			typename ResultContainer::const_iterator it = container.begin();
			typename ResultContainer::const_iterator ite = container.end();

			int i = 0;
			while (it != ite && i < value)
			{
				++it;
				++i;
			}

			return *it;
		}
Ejemplo n.º 6
0
	void get_top(size_t k, time_t time, ResultContainer &top_size)
	{
		std::vector<typename treap_t::p_node_type> top_nodes;

		{
			std::unique_lock<std::mutex> locker(m_lock);
			treap_to_container(m_treap.top(), top_nodes);

			for (auto it = top_nodes.begin(); it != top_nodes.end(); ++it) {
				auto n = *it;
				if (check_expiration(n, time, m_period)) {
					m_treap.erase(n);
					delete n;
					--m_num_events;
				} else {
					top_size.push_back(*n);
				}
			}
		}

		k = std::min(top_size.size(), k);
		std::function<decltype(weight_compare)> comparator_weight(weight_compare);
		std::partial_sort(top_size.begin(), top_size.begin() + k, top_size.end(), std::not2(comparator_weight));
		top_size.resize(k);
	}
Ejemplo n.º 7
0
void
TextOutputBuilder::buildResult(std::ostream& stream, const ResultContainer& facts)
{
    const ResultContainer::result_t& results = facts.getAnswerSets();

    if (!Globals::Instance()->getOption("Silent")) {
        stream << std::endl;
    }

    if (results.empty()) {
        return;
    }

    if (((*results.begin())->hasWeights()) && !Globals::Instance()->getOption("AllModels")) {
        stream << "Best model: ";
    }

    for (ResultContainer::result_t::const_iterator rit = results.begin(); rit != results.end(); ++rit) {
        RawPrintVisitor rpv(stream);
        (*rit)->accept(rpv);
        stream << std::endl;

        if ((*rit)->hasWeights()) {
            stream << "Cost ([Weight:Level]): <";

            //
            // Display all weight values up to the highest specified level
            //
            for (unsigned lev = 1; lev <= AnswerSet::getMaxLevel(); ++lev) {
                if (lev > 1)
                    stream << ",";

                stream << "[" << (*rit)->getWeight(lev) << ":" << lev << "]";
            }

            stream << ">" << std::endl;
        }

        //
        // empty line
        //
        if (!Globals::Instance()->getOption("Silent")) {
            stream << std::endl;
        }
    }
}
Ejemplo n.º 8
0
CDissolveDialog::Error CDissolveDialog::IsEnableUpdate(const ITEMBASE& sourceItem)
{
	const DissolveScript* const script = ITEMMGR->GetDissolveScript(
		sourceItem.wIconIdx);

	if(0 == script)
	{
		return ErrorNoScript;
	}

	CHero* const hero = OBJECTMGR->GetHero();

	if(0 == hero)
	{
		return ErrorNoHero;
	}
	else if(script->mLevel > hero->GetLevel())
	{
		CHATMGR->AddMsg(
			CTC_SYSMSG,
			CHATMGR->GetChatMsg(819),
			script->mLevel);
		return ErrorInvalidLevel;
	}

	// 결과 창에 표시 가능한 재료가 모두 등록될 수 있는지 살펴본다
	{
		ResultContainer resultContainer;
		GetDissolvedRandomResult(
			sourceItem,
			resultContainer);
		
		for(WORD cellIndex = 0; mRandomResultDialog->GetCellNum() > cellIndex; ++cellIndex)
		{
			if(resultContainer.empty())
			{
				break;
			}

			const ResultContainer::const_iterator iterator = resultContainer.begin();
			const ItemIndex itemIndex = iterator->first;

			CItem* const item = (CItem*)mRandomResultDialog->GetIconForIdx(
				cellIndex);

			if(0 == item->GetItemIdx())
			{
				resultContainer.erase(
					itemIndex);
			}
			else if(item->GetItemIdx() == itemIndex)
			{
				resultContainer.erase(
					itemIndex);
			}
		}

		if(false == resultContainer.empty())
		{
			return ErrorInsufficientDynamicResult;
		}

		GetDissolvedResult(
			sourceItem,
			resultContainer);

		for(BYTE tabIndex = 0; tabIndex < GetTabNum(); ++tabIndex)
		{
			cIconGridDialog* const iconGridDialog = (cIconGridDialog*)GetTabSheet(
				tabIndex);

			for(WORD cellIndex = 0; cellIndex < iconGridDialog->GetCellNum(); ++cellIndex)
			{
				if(resultContainer.empty())
				{
					break;
				}

				const ResultContainer::const_iterator iterator = resultContainer.begin();
				const ItemIndex itemIndex = iterator->first;

				CItem* const item = (CItem*)iconGridDialog->GetIconForIdx(
					cellIndex);

				if(0 == item->GetItemIdx())
				{
					resultContainer.erase(
						itemIndex);
				}
				else if(item->GetItemIdx() == itemIndex)
				{
					resultContainer.erase(
						itemIndex);
				}
			}
		}

		if(false == resultContainer.empty())
		{
			return ErrorInsufficientResult;
		}
	}

	// 인벤토리에 결과가 들어갈 공간이 적당한지도 검사한다
	{
		ResultContainer resultContainer;
		GetDissolvedResult(
			sourceItem,
			resultContainer);
		ResultContainer randomResultContainer;
		GetDissolvedRandomResult(
			sourceItem,
			randomResultContainer);

		for(ResultContainer::const_iterator iterator = randomResultContainer.begin();
			randomResultContainer.end() != iterator;
			++iterator)
		{
			const ItemIndex itemIndex = iterator->first;
			const ItemQuantity itemQuantity = iterator->second;

			resultContainer[itemIndex] += itemQuantity;
		}

		CInventoryExDialog* const inventoryDialog = (CInventoryExDialog*)WINDOWMGR->GetWindowForID(
			IN_INVENTORYDLG);

		if(0 == inventoryDialog)
		{
			return ErrorIsNoInventory;
		}

		size_t inventorySlot = 0;

		for(POSTYPE position = TP_INVENTORY_START;
			position > TP_INVENTORY_END + TABCELL_INVENTORY_NUM * HERO->Get_HeroExtendedInvenCount();
			++position)
		{
			CItem* const item = inventoryDialog->GetItemForPos(
				position);

			if(0 == item)
			{
				++inventorySlot;
				continue;
			}

			const ITEM_INFO* const itemInfo = ITEMMGR->GetItemInfo(
				item->GetItemIdx());

			if(0 == itemInfo)
			{
				continue;
			}
			else if(0 == itemInfo->Stack)
			{
				continue;
			}
			else if(resultContainer.end() == resultContainer.find(item->GetItemIdx()))
			{
				continue;
			}

			resultContainer[item->GetItemIdx()] -= (itemInfo->Stack - item->GetDurability());
		}

		size_t needSlot = 0;

		for(ResultContainer::const_iterator iterator = resultContainer.begin();
			resultContainer.end() != iterator;
			++iterator)
		{
			const ItemQuantity itemQuantity = iterator->second;

			if(0 >= itemQuantity)
			{
				continue;
			}

			const ITEM_INFO* const itemInfo = ITEMMGR->GetItemInfo(
				iterator->first);

			if(0 == itemInfo)
			{
				continue;
			}
			else if(0 == itemInfo->Stack)
			{
				needSlot += itemQuantity;
				continue;
			}

            needSlot += size_t(ceil(float(itemQuantity) / itemInfo->Stack));
		}

		if(inventorySlot > needSlot)
		{
			return ErrorInsufficientInventory;
		}
	}

	return ErrorNone;
}
Ejemplo n.º 9
0
CDissolveDialog::Error CDissolveDialog::Submit()
{
	CInventoryExDialog* const inventoryDialog = (CInventoryExDialog*)WINDOWMGR->GetWindowForID(
		IN_INVENTORYDLG);

	if(0 == inventoryDialog)
	{
		return ErrorIsNoInventory;
	}

	MSG_ITEM_DISSOLVE_SYN message;
	ZeroMemory(
		&message,
		sizeof(message));
	message.Category = MP_ITEM;
	message.Protocol = MP_ITEM_DISSOLVE_SYN;
	message.dwObjectID = gHeroID;

	typedef std::set< POSTYPE > ReservedPositionContainer;
	ReservedPositionContainer reservedPositionContainer;

	// 재료 취합
	for(WORD cellIndex = 0; mSourceDialog->GetCellNum() > cellIndex; ++cellIndex)
	{
		CItem* const sourceItem = (CItem*)mSourceDialog->GetIconForIdx(
			cellIndex);
		CItem* const inventoryItem = ITEMMGR->GetItem(
			sourceItem->GetDBIdx());

		if(0 == inventoryItem)
		{
			continue;
		}
		else if(ITEMMGR->IsDupItem(inventoryItem->GetItemIdx()))
		{
			if(sourceItem->GetDurability() != inventoryItem->GetDurability())
			{
				const ITEMBASE sourceItemBase = inventoryItem->GetItemBaseInfo();

				RemoveSource(
					sourceItemBase,
					cellIndex);
				RemoveResult(
					sourceItemBase);
				return ErrorInInvalidSource;
			}
		}

		MSG_ITEM_DISSOLVE_SYN::Item item;
		ZeroMemory(
			&item,
			sizeof(item));
		item.mType = MSG_ITEM_DISSOLVE_SYN::Item::TypeSource;
		item.mIndex = inventoryItem->GetItemIdx();
		item.mDbIndex = inventoryItem->GetDBIdx();
		item.mQuantity = (ITEMMGR->IsDupItem(inventoryItem->GetItemIdx()) ? inventoryItem->GetDurability() : 1);
		item.mPosition = inventoryItem->GetPosition();

		if(FALSE == message.Add(item))
		{
			return ErrorInsufficientInventory;
		}

		reservedPositionContainer.insert(
			inventoryItem->GetPosition());
	}

	ResultContainer resultContainer;

	// 결과 취합
	for(BYTE tabIndex = 0; tabIndex < GetTabNum(); ++tabIndex)
	{
		cPushupButton* const button = GetTabBtn(
			tabIndex);

		if(FALSE == button->IsActive())
		{
			break;
		}

		cIconGridDialog* const iconGridDialog = (cIconGridDialog*)GetTabSheet(
			tabIndex);

		for(WORD cellIndex = 0; iconGridDialog->GetCellNum() > cellIndex; ++cellIndex)
		{
			CItem* const item = (CItem*)iconGridDialog->GetIconForIdx(
				cellIndex);

			if(0 == item->GetItemIdx())
			{
				break;
			}

			resultContainer[item->GetItemIdx()] += item->GetDurability();
		}
	}

	// 랜덤 결과 취합
	for(WORD cellIndex = 0; mRandomResultDialog->GetCellNum() > cellIndex; ++cellIndex)
	{
		CItem* const item = (CItem*)mRandomResultDialog->GetIconForIdx(
			cellIndex);

		if(0 == item->GetItemIdx())
		{
			break;
		}

		resultContainer[item->GetItemIdx()] += item->GetDurability();
	}

	// 중첩 처리 가능한 경우 최대한 시도한다
	for(ResultContainer::iterator iterator = resultContainer.begin();
		resultContainer.end() != iterator;
		++iterator)
	{
		const ItemIndex resultItemIndex = iterator->first;
		ItemQuantity& resultItemQuantity = iterator->second;

		if(FALSE == ITEMMGR->IsDupItem(resultItemIndex))
		{
			continue;
		}
		else if(0 >= resultItemQuantity)
		{
			continue;
		}

		for(POSTYPE inventoryCellIndex = TP_INVENTORY_START;
			inventoryCellIndex < TP_INVENTORY_END + TABCELL_INVENTORY_NUM * HERO->Get_HeroExtendedInvenCount();
			++inventoryCellIndex)
		{
			if(0 >= resultItemQuantity)
			{
				break;
			}
			else if(reservedPositionContainer.end() != reservedPositionContainer.find(inventoryCellIndex))
			{
				continue;
			}

			CItem* const item = inventoryDialog->GetItemForPos(
				inventoryCellIndex);
			const ITEM_INFO* const itemInfo = ITEMMGR->GetItemInfo(
				item ? item->GetItemIdx() : 0);

			if(0 == itemInfo)
			{
				continue;
			}
			else if(itemInfo->ItemIdx != resultItemIndex)
			{
				continue;
			}
			else if(itemInfo->Stack <= item->GetDurability())
			{
				continue;
			}
			else if(itemInfo->wSeal != item->GetItemBaseInfo().nSealed)
			{
				continue;
			}

			MSG_ITEM_DISSOLVE_SYN::Item resultItem;
			ZeroMemory(
				&resultItem,
				sizeof(resultItem));
			resultItem.mType = MSG_ITEM_DISSOLVE_SYN::Item::TypeResult;
			resultItem.mPosition = item->GetPosition();
			resultItem.mIndex = item->GetItemIdx();
			resultItem.mDbIndex = item->GetDBIdx();
			resultItem.mQuantity = min(
				itemInfo->Stack - item->GetDurability(),
				DURTYPE(resultItemQuantity));

			if(FALSE == message.Add(resultItem))
			{
				return ErrorInsufficientInventory;
			}

			resultItemQuantity -= resultItem.mQuantity;
		}
	}

	// 결과를 인벤토리 빈 칸에 채워나간다
	for(POSTYPE inventoryCellIndex = TP_INVENTORY_START;
		inventoryCellIndex < TP_INVENTORY_END + TABCELL_INVENTORY_NUM * HERO->Get_HeroExtendedInvenCount();)
	{
		if(resultContainer.empty())
		{
			break;
		}

		const ResultContainer::iterator resultIterator = resultContainer.begin();
		const ItemIndex resultItemIndex = resultIterator->first;
		ItemQuantity& resultItemQuantity = resultIterator->second;

		if(0 >= resultItemQuantity)
		{
			resultContainer.erase(
				resultIterator);
			continue;
		}

		CItem* const item = inventoryDialog->GetItemForPos(
			inventoryCellIndex);

		if(0 < item)
		{
			// 재료가 위치한 슬롯은 사용 가능하므로 검사한다
			if(reservedPositionContainer.end() == reservedPositionContainer.find(item->GetPosition()))
			{
				++inventoryCellIndex;
				continue;
			}
		}

		const ITEM_INFO* const itemInfo = ITEMMGR->GetItemInfo(
			resultItemIndex);

		if(0 == itemInfo)
		{
			++inventoryCellIndex;
			continue;
		}

		MSG_ITEM_DISSOLVE_SYN::Item resultItem;
		ZeroMemory(
			&resultItem,
			sizeof(resultItem));
		resultItem.mType = MSG_ITEM_DISSOLVE_SYN::Item::TypeResult;
		resultItem.mPosition = inventoryCellIndex;
		resultItem.mIndex = resultItemIndex;
		resultItem.mQuantity = min(
			itemInfo->Stack ? itemInfo->Stack : 1,
			resultItemQuantity);

		if(FALSE == message.Add(resultItem))
		{
			return ErrorInsufficientInventory;
		}

        resultItemQuantity -= resultItem.mQuantity;
		++inventoryCellIndex;
	}

	NETWORK->Send(
		&message,
		message.GetSize());
	return ErrorNone;
}
Ejemplo n.º 10
0
void CDissolveDialog::PutTip()
{
	typedef ItemIndex SourceItemIndex;
	typedef ItemQuantity SourceItemQuantity;
	typedef ItemQuantity ResultItemQuantity;
	typedef std::pair< SourceItemQuantity, ResultItemQuantity > Quantity;

	typedef std::map< SourceItemIndex, Quantity > SourceItemContainer;
	typedef ItemIndex ResultItemIndex;

	typedef std::map< ResultItemIndex, SourceItemContainer > ResultItemContainer;
	ResultItemContainer resultItemContainer;
	ResultItemContainer randomResultItemContainer;

	for(WORD cellIndex = 0; mSourceDialog->GetCellNum() > cellIndex; ++cellIndex)
	{
		CItem* const item = (CItem*)mSourceDialog->GetIconForIdx(
			cellIndex);

		ResultContainer resultContainer;
		GetDissolvedResult(
			item->GetItemBaseInfo(),
			resultContainer);

		while(false == resultContainer.empty())
		{
			const ResultContainer::const_iterator iterator = resultContainer.begin();
			const ItemIndex resultItemIndex = iterator->first;
			const ItemQuantity resultItemQuantity = iterator->second;
			resultContainer.erase(
				resultItemIndex);

			SourceItemContainer& sourceItemContainer = resultItemContainer[resultItemIndex];
			Quantity& quantity = sourceItemContainer[item->GetItemIdx()];
			quantity.first += (ITEMMGR->IsDupItem(item->GetItemIdx()) ? item->GetDurability() : 1);
			quantity.second += resultItemQuantity;
		}

		GetDissolvedRandomResult(
			item->GetItemBaseInfo(),
			resultContainer);

		while(false == resultContainer.empty())
		{
			const ResultContainer::const_iterator iterator = resultContainer.begin();
			const ItemIndex resultItemIndex = iterator->first;
			const ItemQuantity resultItemQuantity = iterator->second;
			resultContainer.erase(
				resultItemIndex);

			SourceItemContainer& sourceItemContainer = randomResultItemContainer[resultItemIndex];
			Quantity& quantity = sourceItemContainer[item->GetItemIdx()];
			quantity.first += (ITEMMGR->IsDupItem(item->GetItemIdx()) ? item->GetDurability() : 1);
			quantity.second += resultItemQuantity;
		}
	}

	LPCTSTR textDissolve = RESRCMGR->GetMsg(
		617);

	for(BYTE tabIndex = 0; GetTabNum() > tabIndex; ++tabIndex)
	{
		cPushupButton* const button = GetTabBtn(
			tabIndex);

		if(FALSE == button->IsActive())
		{
			break;
		}

		cIconGridDialog* const iconGridDialog = (cIconGridDialog*)GetTabSheet(
			tabIndex);

		for(WORD cellIndex = 0; iconGridDialog->GetCellNum() > cellIndex; ++cellIndex)
		{
			CItem* const item = (CItem*)iconGridDialog->GetIconForIdx(
				cellIndex);

			if(resultItemContainer.end() == resultItemContainer.find(item->GetItemIdx()))
			{
				continue;
			}

			ITEMMGR->AddToolTip(
				item);
			item->AddToolTipLine(
				"");
			item->AddToolTipLine(
				textDissolve);

			const SourceItemContainer& sourceItemContainer = resultItemContainer[item->GetItemIdx()];

			for(SourceItemContainer::const_iterator iterator = sourceItemContainer.begin();
				sourceItemContainer.end() != iterator;
				++iterator)
			{
				const SourceItemIndex sourceItemIndex = iterator->first;
				const Quantity& quantity = iterator->second;

				PutTip(
					*item,
					sourceItemIndex,
					quantity.first,
					quantity.second);
			}
		}
	}

	for(WORD cellIndex = 0; mRandomResultDialog->GetCellNum() > cellIndex; ++cellIndex)
	{
		CItem* const item = (CItem*)mRandomResultDialog->GetIconForIdx(
			cellIndex);

		if(randomResultItemContainer.end() == randomResultItemContainer.find(item->GetItemIdx()))
		{
			continue;
		}

		ITEMMGR->AddToolTip(
			item);
		item->AddToolTipLine(
			"");
		item->AddToolTipLine(
			textDissolve);

		const SourceItemContainer& sourceItemContainer = randomResultItemContainer[item->GetItemIdx()];

		for(SourceItemContainer::const_iterator iterator = sourceItemContainer.begin();
			sourceItemContainer.end() != iterator;
			++iterator)
		{
			const SourceItemIndex sourceItemIndex = iterator->first;
			const Quantity& quantity = iterator->second;

			PutTip(
				*item,
				sourceItemIndex,
				quantity.first,
				quantity.second);
		}
	}
}
Ejemplo n.º 11
0
void CDissolveDialog::Succeed(const MSG_ITEM_DISSOLVE_ACK& message)
{
	for(WORD cellIndex = 0; mSourceDialog->GetCellNum() > cellIndex; ++cellIndex)
	{
		CItem* const item = (CItem*)mSourceDialog->GetIconForIdx(
			cellIndex);

		item->SetLock(
			TRUE);
		item->SetMovable(
			FALSE);
		ITEMMGR->RemoveOption(
			item->GetDBIdx());
	}

	ResultContainer resultContainer;

	for(DWORD i = 0; i < message.mUpdateResult.mSize; ++i)
	{
		const ITEMBASE& itemBase = message.mUpdateResult.mItem[i];

		if(0 == itemBase.wIconIdx)
		{
			continue;
		}

		resultContainer[itemBase.wIconIdx] += (ITEMMGR->IsDupItem(itemBase.wIconIdx) ? itemBase.Durability : 1);
	}

	DWORD lockedTime = gCurTime;
	const DWORD delayedTime = 30;

	for(BYTE tablIndex = 0; GetTabNum() > tablIndex; ++tablIndex)
	{
		const BOOL isInstantLocked = (tablIndex != GetCurTabNum());
		cIconGridDialog* const iconGridDialog = (cIconGridDialog*)GetTabSheet(
			tablIndex);

		if(0 == iconGridDialog)
		{
			break;
		}

		for(WORD cellIndex = 0; iconGridDialog->GetCellNum() > cellIndex; ++cellIndex)
		{
			CItem* const item = (CItem*)iconGridDialog->GetIconForIdx(
				cellIndex);
			item->SetVisibleDurability(
				FALSE);
			item->SetItemParam(
				lockedTime += delayedTime);

			const ResultContainer::iterator iterator = resultContainer.find(
				item->GetItemIdx());

			if(resultContainer.end() == iterator)
			{
				item->SetDurability(
					0);
				item->SetLock(
					isInstantLocked);
				continue;
			}
			
			const ItemQuantity itemQuantity = iterator->second;

			if(0 >= itemQuantity)
			{
				item->SetDurability(
					0);
				item->SetLock(
					isInstantLocked);
				continue;
			}

			item->SetDurability(
				min(DURTYPE(itemQuantity), item->GetDurability()));

			resultContainer[item->GetItemIdx()] -= item->GetDurability();
		}
	}

	for(WORD cellIndex = 0; mRandomResultDialog->GetCellNum() > cellIndex; ++cellIndex)
	{
		CItem* const item = (CItem*)mRandomResultDialog->GetIconForIdx(
			cellIndex);
		item->SetVisibleDurability(
			FALSE);
		item->SetItemParam(
			lockedTime += delayedTime);

		const ResultContainer::iterator iterator = resultContainer.find(
			item->GetItemIdx());

		if(resultContainer.end() == iterator)
		{
			item->SetDurability(
				0);
			continue;
		}

		const ItemQuantity itemQuantity = iterator->second;

		if(0 >= itemQuantity)
		{
			item->SetDurability(
				0);
			continue;
		}

		item->SetDurability(
			min(DURTYPE(itemQuantity), item->GetDurability()));

		resultContainer[item->GetItemIdx()] -= item->GetDurability();
	}

	mSubmitButton->SetActive(
		FALSE);

	mIsEffectStart = TRUE;

	CHATMGR->AddMsg(
		CTC_SYSMSG,
		CHATMGR->GetChatMsg(1072));
}
Ejemplo n.º 12
0
void CDissolveDialog::RemoveResult(const ITEMBASE& sourceItem)
{
	ResultContainer resultContainer;
	GetDissolvedResult(
		sourceItem,
		resultContainer);

	ResultContainer remainedResultContainer;

	for(BYTE tabIndex = 0; tabIndex < GetTabNum(); ++tabIndex)
	{
		cPushupButton* const button = GetTabBtn(
			tabIndex);

		if(FALSE == button->IsActive())
		{
			break;
		}

		cIconGridDialog* const iconGridDialog = (cIconGridDialog*)GetTabSheet(
			tabIndex);

		for(WORD cellIndex = 0; cellIndex < iconGridDialog->GetCellNum(); ++cellIndex)
		{
			CItem* const item = (CItem*)iconGridDialog->GetIconForIdx(
				cellIndex);
			const ResultContainer::iterator iterator = resultContainer.find(
				item->GetItemIdx());

			if(resultContainer.end() == iterator)
			{
				continue;
			}

			const DURTYPE quantity = iterator->second;

			if(item->GetDurability() <= quantity)
			{
				Clear(
					*item);
			}
			else
			{
				item->SetDurability(
					item->GetDurability() - quantity);
			}
		}
	}

	ResultContainer randomResultContainer;
	GetDissolvedResult(
		sourceItem,
		randomResultContainer);

	// 랜덤 결과를 제거한다
	for(ResultContainer::const_iterator iterator = randomResultContainer.begin();
		randomResultContainer.end() != iterator;
		++iterator)
	{
		const ItemIndex itemIndex = iterator->first;
		const ItemQuantity itemQuantity = iterator->second;
		
		for(WORD cellIndex = 0; mRandomResultDialog->GetCellNum() > cellIndex; ++cellIndex)
		{
			CItem* const item = (CItem*)mRandomResultDialog->GetIconForIdx(
				cellIndex);

			if(item->GetItemIdx() != itemIndex)
			{
				continue;
			}
			else if(item->GetDurability() <= DURTYPE(itemQuantity))
			{
				Clear(
					*item);
				break;
			}

			item->SetDurability(
				item->GetDurability() - itemQuantity);
			break;
		}
	}

	// 결과를 재배치한다
	{
		ClearResult();

		for(WORD cellIndex = 0; mSourceDialog->GetCellNum() > cellIndex; ++cellIndex)
		{
			CItem* const item = (CItem*)mSourceDialog->GetIconForIdx(
				cellIndex);

			if(item->GetDBIdx() == sourceItem.dwDBIdx)
			{
				continue;
			}

			AddResult(
				item->GetItemBaseInfo());
		}
	}

	// 현재 탭이 숨겨질 경우, 그 이전 탭으로 변경해야한다
	{
		cPushupButton* const button = GetTabBtn(
			GetCurTabNum());

		if(FALSE == button->IsActive())
		{
			SelectTab(
				BYTE(max(int(GetCurTabNum()) - 1, 0)));
		}
	}
}
Ejemplo n.º 13
0
void CDissolveDialog::AddResult(const ITEMBASE& sourceItem)
{
	ResultContainer resultContainer;
	GetDissolvedResult(
		sourceItem,
		resultContainer);

	for(BYTE tabIndex = 0; tabIndex < GetTabNum(); ++tabIndex)
	{
		cIconGridDialog* const iconGridDialog = (cIconGridDialog*)GetTabSheet(
			tabIndex);

		for(WORD cellIndex = 0; iconGridDialog->GetCellNum() > cellIndex; ++cellIndex)
		{
			CItem* const item = (CItem*)iconGridDialog->GetIconForIdx(
				cellIndex);
			const ResultContainer::const_iterator iterator = resultContainer.find(
				item->GetItemIdx());

			if(resultContainer.end() != iterator)
			{
				const ItemIndex itemIndex = iterator->first;
				const ItemQuantity itemQuantity = iterator->second;

				item->SetDurability(
					item->GetDurability() + itemQuantity);

				resultContainer.erase(
					itemIndex);
			}
			else if(0 == item->GetItemIdx())
			{
				if(resultContainer.empty())
				{
					break;
				}

				const ResultContainer::const_iterator iterator = resultContainer.begin();
				const ItemIndex itemIndex = iterator->first;
				const ItemQuantity itemQuantity = iterator->second;

				cImage image;
				ITEMBASE itemBase;
				ZeroMemory(
					&itemBase,
					sizeof(itemBase));
				itemBase.wIconIdx = itemIndex;
				itemBase.Durability = itemQuantity;
				item->SetItemBaseInfo(
					itemBase);
				item->SetBasicImage(
					ITEMMGR->GetIconImage(itemBase.wIconIdx, &image));
				
				resultContainer.erase(
					itemIndex);
			}

			cPushupButton* const button = GetTabBtn(
				tabIndex);
			button->SetActive(
				TRUE);
		}
	}

	GetDissolvedRandomResult(
		sourceItem,
		resultContainer);

	for(WORD cellIndex = 0; mRandomResultDialog->GetCellNum() > cellIndex; ++cellIndex)
	{
		CItem* const item = (CItem*)mRandomResultDialog->GetIconForIdx(
			cellIndex);
		const ResultContainer::const_iterator iterator = resultContainer.find(
			item->GetItemIdx());

		if(resultContainer.end() != iterator)
		{
			const ItemIndex itemIndex = iterator->first;
			const ItemQuantity itemQuantity = iterator->second;

			item->SetDurability(
				item->GetDurability() + itemQuantity);
			
			resultContainer.erase(
				itemIndex);
		}
		else if(0 == item->GetItemIdx())
		{
			if(resultContainer.empty())
			{
				break;
			}

			const ResultContainer::const_iterator iterator = resultContainer.begin();
			const ItemIndex itemIndex = iterator->first;
			const ItemQuantity itemQuantity = iterator->second;

			cImage image;
			ITEMBASE itemBase;
			ZeroMemory(
				&itemBase,
				sizeof(itemBase));
			itemBase.wIconIdx = itemIndex;
			itemBase.Durability = itemQuantity;
			item->SetItemBaseInfo(
				itemBase);
			item->SetBasicImage(
				ITEMMGR->GetIconImage(itemBase.wIconIdx, &image));
			
			resultContainer.erase(
				itemIndex);
		}
	}

	PutTip();
}