DWORD print(CubeMainBIN* curForm, LPWSTR buf, LPINT len, DWORD)//maxsize)
{
	if (!buf || !curForm || !curForm->enabled) return 0;

	InNoSocket = false;
	int realNbInputs=0;

	printInputItem(&curForm->input1, buf, len, &realNbInputs);
	printInputItem(&curForm->input2, buf, len, &realNbInputs);
	printInputItem(&curForm->input3, buf, len, &realNbInputs);
	printInputItem(&curForm->input4, buf, len, &realNbInputs);
	printInputItem(&curForm->input5, buf, len, &realNbInputs);
	printInputItem(&curForm->input6, buf, len, &realNbInputs);
	printInputItem(&curForm->input7, buf, len, &realNbInputs);

	if (realNbInputs != curForm->numinputs)
	{
		PRINT(BUF, L" *** ERROR : numInputs(%d) != realNbInputs(%d) ***", curForm->numinputs, realNbInputs);
		return 1;
	}

	PRINT(BUF,L" => ");
	int realNbOutputs=0;

	printOutputItem(&curForm->output1, buf, len, &realNbOutputs);
	printOutputItem(&curForm->output2, buf, len, &realNbOutputs);
	printOutputItem(&curForm->output3, buf, len, &realNbOutputs);


//	if (curForm->ladder)
//		sprintf(BUF," [ladder only]");

	if (curForm->minDiff == 1)
		PRINT(BUF, L" %s", getLocalString(STR_ONLY_N_H));
	else if (curForm->minDiff == 2)
		PRINT(BUF, L" %s", getLocalString(STR_ONLY_HELL));

	if (curForm->playerClass != 0xFF)
	{
		CharStatsBIN* charStats = D2GetCharStatsBIN(curForm->playerClass);
		PRINT(BUF, L" (");
		PRINT(BUF, getLocalString(STR_ONLY_CLASS), charStats->name);
		PRINT(BUF, L")");
	}

	if ((curForm->op>0) && (curForm->op!=28))
		PRINT(BUF, L" [op%d(%d,%d)]", curForm->op, curForm->param, curForm->value);

//	if (curForm->version == 100)
//		sprintf(BUF, " [expansion only]");

	return 1;
}
Esempio n. 2
0
std::string Bundle::formatMessage(const std::string &key, const std::vector<std::string> *parms) const
{
  std::string messageIn = getLocalString(key);
  std::string messageOut;

  if (!parms || (parms->size() == 0))
    return messageIn;

  int parmCnt = parms->size();
  int startPos = 0;
  int lCurlyPos = messageIn.find_first_of("{");

  while (lCurlyPos >= 0) {
    messageOut += messageIn.substr( startPos, lCurlyPos - startPos);
    int rCurlyPos = messageIn.find_first_of("}", lCurlyPos++);
    if (rCurlyPos < 0) {
      messageOut += messageIn.substr(lCurlyPos);
      return messageOut;
    }
    std::string numStr = messageIn.substr(lCurlyPos, rCurlyPos-lCurlyPos);
    int num;
    if (sscanf(numStr.c_str(), "%d", &num) != 1)
      messageOut += messageIn.substr(lCurlyPos, rCurlyPos-lCurlyPos);
    else {
      num--;
      if ((num >= 0) && (num < parmCnt))
	messageOut += (*parms)[num];
    }
    startPos = rCurlyPos+1;
    lCurlyPos = messageIn.find_first_of("{", startPos);
  }
  messageOut += messageIn.substr(startPos);
  return messageOut;
}
Esempio n. 3
0
void STDCALL printDisabledStatsBtn(WORD statID, sDrawImageInfo* data, DWORD x, DWORD y, DWORD p4, DWORD p5, DWORD p6)
{
	if ( onRealm || !D2isLODGame())
	{
		D2PrintImage(data,x,y,p4,p5,p6);
		return;
	}
	Unit* ptChar = D2GetClientPlayer();

	CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
	int minValue=1;
	switch (statID)
	{
		case STATS_STRENGTH: minValue = charStats->baseSTR; break;
		case STATS_DEXTERITY: minValue = charStats->baseDEX; break;
		case STATS_VITALITY: minValue = charStats->baseVIT; break;
		case STATS_ENERGY: minValue = charStats->baseENE; break;
	}
	int statValue = D2GetPlayerBaseStat(ptChar, statID, 0);

	if (isOnRect(D2GetMouseX(),D2GetMouseY(),x+5,y+5,32,32))
	{
		WCHAR text[100];
		if (active_StatsShiftClickLimit)
			_snwprintf(text, sizeof(text) - 1, getLocalString(STR_STATS_UNASSIGN_WITH_LIMIT), limitValueToShiftClick);
		else
			_snwprintf(text, sizeof(text) - 1, getLocalString(STR_STATS_UNASSIGN_WITHOUT_LIMIT));
		wcscat(text,L"\n");
		int len = wcslen(text);
		_snwprintf(text + len, sizeof(text) - len, getLocalString(STR_STATS_BASE_MIN), statValue, minValue);
		D2SetFont(1);
		D2PrintPopup(text, x+18, y-32, WHITE, 1);
	}

	if ( GetKeyState(keyUsedForUnassignStatPoint) >= 0) {
		if ( D2GetPlayerBaseStat(ptChar, 4, 0) <= 0)
			setFrame(data, 2);
	} else {
		setImage(data, unassignStatsBtnImages);
		if (minValue >= statValue)
			setFrame(data, 2);
	}

	D2PrintImage(data,x,y,p4,p5,p6);
}
Esempio n. 4
0
void FASTCALL printPageNumber(LPWSTR maxGoldText, DWORD x, DWORD y, DWORD color, DWORD bfalse)
{
	if (onRealm || !D2isLODGame() )
	{
		D2PrintString(maxGoldText,x,y,color,bfalse);
		return;
	}

	Unit* ptChar = D2GetClientPlayer();
	WCHAR popupText[100];

	if (PCPY->currentStash)
	{
		bool isShared = PCPY->currentStash->isShared;
		bool isIndex = PCPY->currentStash->isIndex;
		DWORD currentId = PCPY->currentStash->id;

		if (PCPY->currentStash->name && PCPY->currentStash->name[0])
			mbstowcs(popupText,PCPY->currentStash->name,50);//strlen(PCPY->currentStash->name)+1
		else _snwprintf(popupText, sizeof(popupText), getLocalString( isShared ? STR_SHARED_PAGE_NUMBER : STR_PERSONAL_PAGE_NUMBER), currentId+1);
		D2PrintString(popupText, x, y, isShared ? (isIndex ? CRYSTAL_RED : RED) : (isIndex ? BRIGHT_WHITE : WHITE), bfalse);
	} else {
		_snwprintf(popupText, sizeof(popupText), getLocalString(STR_NO_SELECTED_PAGE));
		D2PrintString(popupText, x, y, WHITE, bfalse);
	}

	//printGoldMaxPopup
	DWORD mx = D2GetMouseX();
	DWORD my = D2GetMouseY();
	if ((RX(0x5E) < mx) && (mx < RX(0xF8)) && (RY(0x1C8) < my) && (my < RY(0x1B6)) )
	{
		if (active_sharedGold)
		{
			_snwprintf(popupText, sizeof(popupText), L"%s\n%s: %u", maxGoldText, getLocalString(STR_SHARED_GOLD_QUANTITY), PCPY->sharedGold);
			DWORD x = D2GetPixelLen(maxGoldText);
			DWORD x2 = D2GetPixelLen(popupText) - x;
			D2PrintPopup(popupText, RX(0xA8-max(x,x2)/2), RY(0x1CA), WHITE, 0);
		} else 
			D2PrintPopup(maxGoldText, RX(0xA8), RY(0x1CA), WHITE, 1);
	}
}
Esempio n. 5
0
//6FB21FAA
void STDCALL printRunewordsPage()
{
	if (!D2isLODGame() || !D2GetResolution()) return D2PrintStatsPage();
	
	LPWSTR lpText;
	bDontPrintBorder = true;

	//Init data for print image
	sDrawImageInfo data;
	ZeroMemory(&data,sizeof(data));

	//print background
/*	setImage(&data, newStatsInterfaceImages);
	setFrame(&data, 0);
	D2PrintImage(&data, 0,	256, -1, 5, 0);
	setFrame(&data, 1);
	D2PrintImage(&data, 256,256, -1, 5, 0);
	setFrame(&data, 2);
	D2PrintImage(&data, 0,	512, -1, 5, 0);
	setFrame(&data, 3);
	D2PrintImage(&data, 256,512, -1, 5, 0);
	setFrame(&data, 4);
	D2PrintImage(&data, 0,	552, -1, 5, 0);
	setFrame(&data, 5);
	D2PrintImage(&data, 256,552, -1, 5, 0);
*/
	fillRect(0,0,400,552,0,5);

	//print button close
	setImage(&data, D2LoadBuySelBtn());
	setFrame(&data, 10 + isDownBtn.close);
	D2PrintImage(&data, getXCloseBtn(), getYCloseBtn(), -1, 5, 0);
	
	//print next page button
	setFrame(&data, isDownBtn.nextPage);
	D2PrintImage(&data, getXNextPageBtn(), getYNextPageBtn(), -1, 5, 0);

	//print previous runes button
	setImage(&data, stashBtnsImages);
	setFrame(&data, isDownBtn.prevRunes);
	D2PrintImage(&data, getXPrevRunesBtn(), getYPrevRunesBtn(), -1, 5, 0);

	//print previous runes button
	setFrame(&data, 2 + isDownBtn.nextRunes);
	D2PrintImage(&data, getXNextRunesBtn(), getYNextRunesBtn(), -1, 5, 0);

	D2SetFont(6);

	//146;//B400
	int nbRunes = *D2GetNbRunesBIN();
	RunesBIN* runesFirst = nbRunes>1 ? D2GetRunesBIN(1)-1 : NULL;
	RunesBIN* runesLast = runesFirst? runesFirst + nbRunes : NULL;
//	log_msg("nbRunes(%d,%d) runesFirst(%08X, %08X) runesLast(%08X, %08X)",nbRunes,SgptDataTables->nbRunes,runesFirst, SgptDataTables->runes,runesLast,SgptDataTables->runes + SgptDataTables->nbRunes);
 
	int nbRunesCompleted=0;
	DWORD curNbRunes=0;
	for ( RunesBIN* runesData = runesFirst; runesData < runesLast; runesData++)
	{
		if (!runesData->Complete || runesData->Server) continue;
		nbRunesCompleted++;
		if ( (curRunesPage * NB_RUNES_PER_PAGE < nbRunesCompleted) &&
			(nbRunesCompleted <= (curRunesPage+1) * NB_RUNES_PER_PAGE) )
			printRuneword(runesData, curNbRunes++);
	}
	maxRunesPage = nbRunesCompleted ?  (nbRunesCompleted-1) / NB_RUNES_PER_PAGE : 0;


//////////////////// POPUP PRINTING ////////////////////
	//set MouseX & MouseY
	DWORD x = D2GetMouseX();
	DWORD y = D2GetMouseY();

	if (isOnCloseBtn(x,y))			// print popup "close"
	{
		D2PrintPopup(D2GetStringFromIndex(0x1030), getXCloseBtn()+getLCloseBtn()/2, getYCloseBtn()-getHCloseBtn(), WHITE, 1);
	}
	else if (isOnNextPageBtn(x,y))	// print popup "next page"
	{
		lpText = getLocalString(STR_NEXT_PAGE);
		D2PrintPopup(lpText, getXNextPageBtn()+getLNextPageBtn()/2, getYNextPageBtn()-getHNextPageBtn(), WHITE, 1);
	}
}
Esempio n. 6
0
void* STDCALL printBtns()
{
	if (onRealm || !D2isLODGame()) return D2LoadBuySelBtn();

	Unit* ptChar = D2GetClientPlayer();

	sDrawImageInfo data;
	ZeroMemory(&data,sizeof(data));
	setImage(&data, stashBtnsImages);

	setFrame(&data, 0 + isDownBtn.previous);
	D2PrintImage(&data, getXPreviousBtn(), getYPreviousBtn(), -1, 5, 0);

	setFrame(&data, 2 + isDownBtn.next);
	D2PrintImage(&data, getXNextBtn(), getYNextBtn(), -1, 5, 0);

	if (active_sharedStash)
	{
		setFrame(&data, 4 + isDownBtn.toggleToSharedStash + (PCPY->showSharedStash?2:0) );
		D2PrintImage(&data, getXSharedBtn(), getYSharedBtn(), -1, 5, 0);
	}

	setFrame(&data, 8 + isDownBtn.previousIndex);
	D2PrintImage(&data, getXPreviousIndexBtn(), getYPreviousIndexBtn(), -1, 5, 0);

	setFrame(&data, 10 + isDownBtn.nextIndex);
	D2PrintImage(&data, getXNextIndexBtn(), getYNextIndexBtn(), -1, 5, 0);

	if (active_sharedGold)
	{
		setImage(&data, sharedGoldBtnsImages);
		setFrame(&data, 0 + isDownBtn.putGold);
		D2PrintImage(&data, getXPutGoldBtn(), getYPutGoldBtn(), -1, 5, 0);

		setFrame(&data, 2 + isDownBtn.takeGold);
		D2PrintImage(&data, getXTakeGoldBtn(), getYTakeGoldBtn(), -1, 5, 0);
	}


	LPWSTR lpText;
	WCHAR text[100];
	DWORD mx = D2GetMouseX();
	DWORD my = D2GetMouseY();

	D2SetFont(1);

	if (isOnButtonPreviousStash(mx,my)) {
		lpText = getLocalString(STR_STASH_PREVIOUS_PAGE);
		D2PrintPopup(lpText, getXPreviousBtn()+getLPreviousBtn()/2, getYPreviousBtn()-getHPreviousBtn(), WHITE, 1);

	} else if (isOnButtonNextStash(mx,my)) {
		lpText = getLocalString(STR_STASH_NEXT_PAGE);
		D2PrintPopup(lpText, getXNextBtn()+getLNextBtn()/2, getYNextBtn()-getHNextBtn(), WHITE, 1);

	} else if (active_sharedStash && isOnButtonToggleSharedStash(mx,my)) {
		lpText = getLocalString(PCPY->showSharedStash ? STR_TOGGLE_TO_PERSONAL : STR_TOGGLE_TO_SHARED);
		D2PrintPopup(lpText, getXSharedBtn()+getLSharedBtn()/2, getYSharedBtn()-getHSharedBtn(), WHITE, 1);

	} else if (isOnButtonPreviousIndexStash(mx,my)) {
		_snwprintf(text, sizeof(text), getLocalString(STR_STASH_PREVIOUS_INDEX) ,nbPagesPerIndex,nbPagesPerIndex2);
		D2PrintPopup(text, getXPreviousIndexBtn()+getLPreviousIndexBtn()/2, getYPreviousIndexBtn()-getHPreviousIndexBtn(), 0, 0);

	} else if (isOnButtonNextIndexStash(mx,my))	{
		_snwprintf(text, sizeof(text), getLocalString(STR_STASH_NEXT_INDEX) ,nbPagesPerIndex,nbPagesPerIndex2);
		D2PrintPopup(text, getXNextIndexBtn()+getLNextIndexBtn()/2, getYNextIndexBtn()-getHNextIndexBtn(), WHITE, 1);

	} else if (active_sharedGold && isOnButtonPutGold(mx,my))	{
		lpText = getLocalString(STR_PUT_GOLD);
		D2PrintPopup(lpText, getXPutGoldBtn()+getLPutGoldBtn()/2, getYPutGoldBtn()-getHPutGoldBtn(), WHITE, 1);

	} else if (active_sharedGold && isOnButtonTakeGold(mx,my))	{
		lpText = getLocalString(STR_TAKE_GOLD);
		D2PrintPopup(lpText, getXTakeGoldBtn()+getLTakeGoldBtn()/2, getYTakeGoldBtn()-getHTakeGoldBtn(), WHITE, 1);
	}

	return D2LoadBuySelBtn();
}
void STDCALL printNewStatsPageTwo(int currentPage)
{
	if (!D2isLODGame()) return D2PrintStatsPage();

	WCHAR text[BUFSIZE];
	LPWSTR lpText;
	bDontPrintBorder = false;

	Unit* ptChar = D2GetClientPlayer();

	d2_assert(!ptChar, "Printing stats page : no character selected",__FILE__,__LINE__);
	d2_assert(ptChar->nUnitType != UNIT_PLAYER, "Printing stats page : bad unit type",__FILE__,__LINE__);

	//Init data for print image
	sDrawImageInfo data;
	ZeroMemory(&data,sizeof(data));

	//print background
	fillRect(RX(0),RY(480),320,432,0,5);//552
	setImage(&data, newStatsInterfaceImages);
	setFrame(&data, 0);
	D2PrintImage(&data, RX(0),	RY(224), -1, 5, 0);
	setFrame(&data, 1);
	D2PrintImage(&data, RX(256),RY(224), -1, 5, 0);//256
	setFrame(&data, 2);
	D2PrintImage(&data, RX(0),	RY(48), -1, 5, 0);//432
	setFrame(&data, 3);
	D2PrintImage(&data, RX(256),RY(48), -1, 5, 0);

	D2SetFont(1);
	for (int i=0; i<nbStatsInterface; i++)
		manageStatLine(ptChar, &statsInterface[i], currentPage, text);

/*
//	DWORD x,y;
//	DWORD curValue;
//	CharStatsBIN* charStats = D2GetCharStatsBIN(ptChar->nPlayerClass);
//	DifficultyLevelsBIN* difficultyLevels = D2GetDifficultyLevelsBIN (D2GetDifficultyLevel());
	//print deadly Strike / Critical Strike
	x=RX(25);
	y=RY(445);
	Unit* ptItem = D2GetSkillItem(ptChar);
	DWORD cs = ptItem ? D2GetCriticalStrikeFromMasteries(ptChar,ptItem,0,2) : 0;
	cs = cs>100?100:cs;
	cs += D2GetPlayerStat(ptChar, STATS_PASSIVE_CRITICAL_STRIKE, 0)*(100-cs)/100;
	cs = cs>100?100:cs;
	//SkillDescBIN* skilldesc = SgptDataTables->skilldesc + 9;
	LPWSTR lpCS = D2GetStringFromIndex(skilldesc->strNameID);

	lpText = D2GetStringFromIndex(getDescStrPos(STATS_ITEM_DEADLYSTRIKE));
	curValue = D2GetPlayerStat(ptChar, STATS_ITEM_DEADLYSTRIKE, 0);

	cs += curValue*(100-cs)/100;
	curValue = cs>100?100:cs;

	swprintf(text,L"%i%% %s/%s",curValue,lpCS,lpText);
	D2SetFont(1);
	D2SetFont( D2GetPixelLen(text)>0x110 ? 6 : 1);
	D2PrintString(text, x, y, WHITE, 0);
*/

	//print background previous/next page buttons
	setImage(&data, statsBackgroundImages);
	setFrame(&data, D2GetResolution()?1:0);
	D2PrintImage(&data, getXPreviousPageBtn()-7, getYPreviousPageBtn()+8, -1, 5, 0);

	//print button close
	setImage(&data, D2LoadBuySelBtn());
	setFrame(&data, 10 + isDownBtn.close);
	D2PrintImage(&data, getXCloseBtn(), getYCloseBtn(), -1, 5, 0);
	
	//print previous page button
	setFrame(&data, 12 + isDownBtn.previousPage);
	D2PrintImage(&data, getXPreviousPageBtn(), getYPreviousPageBtn(), -1, 5, 0);

	//print next page button
	setFrame(&data, 14 + isDownBtn.nextPage);
	D2PrintImage(&data, getXNextPageBtn(), getYNextPageBtn(), -1, 5, 0);


//////////////////// POPUP PRINTING ////////////////////
	//set MouseX & MouseY
	DWORD mx = D2GetMouseX();
	DWORD my = D2GetMouseY();
	
	D2SetFont(1);

	if (isOnCloseBtn(mx,my))			// print popup "close"
	{
		D2PrintPopup(D2GetStringFromIndex(0x1030), getXCloseBtn()+getLCloseBtn()/2, getYCloseBtn()-getHCloseBtn(), WHITE, 1);
	}
	else if (isOnPreviousPageBtn(mx,my))	//print popup "previous page"
	{
		lpText = getLocalString(STR_PREVIOUS_PAGE);
		D2PrintPopup(lpText, getXPreviousPageBtn()+getLPreviousPageBtn()/2, getYPreviousPageBtn()-getHPreviousPageBtn(), WHITE, 1);
	}
	else if (isOnNextPageBtn(mx,my))	//print popup "next page"
	{
		lpText = getLocalString(STR_NEXT_PAGE);
		D2PrintPopup(lpText, getXNextPageBtn()+getLNextPageBtn()/2, getYNextPageBtn()-getHNextPageBtn(), WHITE, 1);
	}
}
/*
6FC9275F  |. E8 ECCCFFFF    |CALL D2Game.6FC8F450                    ; \D2Game.6FC8F450
*/
void printOutputItem(CubeOutput* output, LPWSTR buf, LPINT len, LPINT nbOutputs)
{
	if (output->outputType == 0)
		return;
	if (*nbOutputs > 0)
		PRINT(BUF, L" + ");
	*nbOutputs += 1;

	if (output->outputType == 1) {
		PRINT(BUF, getLocalString(STR_COW_PORTAL));
		return;
	} else if (output->outputType == 2) {
		PRINT(BUF, getLocalString(STR_PANDEMONIUM_PORTAL));
		return;
	} else if (output->outputType == 3) {
		PRINT(BUF, getLocalString(STR_PANDEMONIUM_FINAL_PORTAL));
		return;
	}

	if ((output->quantityOrNbSockets>1) && !output->haveSockets)
	{
		if (output->quantityOrNbSockets = 255)
			PRINT(BUF, L"%s ", getLocalString(STR_FULL));
		else
			PRINT(BUF, L"%u ", output->quantityOrNbSockets);
	}

	if (output->repair)
		PRINT(BUF, L"%s ", getLocalString(STR_REPAIR));

	if (output->repair && output->recharge)
		PRINT(BUF, L"%s ", getLocalString(STR_AND));

	if (output->recharge)
		PRINT(BUF, L"%s ", getLocalString(STR_RECHARGE));

	if (output->destroysFillers)
		PRINT(BUF, L"%s ", getLocalString(STR_DESTROY_FILLERS));

	if (output->removeFillers)
		PRINT(BUF, L"%s ", getLocalString(STR_REMOVE_FILLERS));

	if (output->regeneratesUnique)
		PRINT(BUF, L"%s ", getLocalString(STR_REGENERATE));

	if (output->upgradeToExceptional)
		PRINT(BUF, L"%s ", getLocalString(STR_UPGRADE_TO_EXCEPTIONAL));

	if (output->upgradeToElite)
		PRINT(BUF, L"%s ", getLocalString(STR_UPGRADE_TO_ELITE));

	if (output->isEthereal)
		PRINT(BUF, L"%s ", getLocalString(STR_ETHERAL));

	if (output->isSpecificItem) {
		if (output->quality == ITEMQUALITY_UNIQUE)
		{
			UniqueItemsBIN* uniqueItems = SgptDataTables->uniqueItems + output->specificID-1;
			PRINT(BUF, D2GetStringFromIndex(uniqueItems->uniqueNameId));
		} else if (output->quality == ITEMQUALITY_SET) {
			SetItemsBIN* setItems = SgptDataTables->setItems + output->specificID-1;
			PRINT(BUF, D2GetStringFromIndex(setItems->setNameId));
		} else {
			PRINT(BUF,STRING_ERROR);return;
		}
	} else {
		switch (output->quality)
		{
			case 1:PRINT(BUF, L"%s ", getLocalString(STR_CRACKED));break;
			case 2:PRINT(BUF, L"%s ", getLocalString(STR_NORMAL));break;
			case 3:PRINT(BUF, L"%s ", getLocalString(STR_SUPERIOR));break;
			case 4:PRINT(BUF, L"%s ", getLocalString(STR_MAGIC));break;
			case 5:PRINT(BUF, L"%s ", getLocalString(STR_SET));break;
			case 6:PRINT(BUF, L"%s ", getLocalString(STR_RARE));break;
			case 7:PRINT(BUF, L"%s ", getLocalString(STR_UNIQUE));break;
			case 8:PRINT(BUF, L"%s ", getLocalString(STR_CRAFTED));break;
			case 9:PRINT(BUF, L"%s ", getLocalString(STR_TEMPERED));break;
		}
		switch (output->outputType)
		{
		case 0xFC:
		{
			ItemsBIN* items = D2GetItemsBIN(output->ID);
			PRINT(BUF, StripGender(D2GetStringFromIndex(items->NameStr)));
			break;
		}
		case 0xFD:
		{
			ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(output->ID);
			if (!itemTypeData)
				PRINT(BUF, L"Unknow Item Type");
			else
				PRINT(BUF, getLocalTypeString(itemTypeData->code));
			break;
		}
		case 0xFE: PRINT(BUF, L"%s", getLocalString(STR_ITEM)); break;
		case 0xFF: PRINT(BUF, L"%s", getLocalString(STR_ITEM_SAME_TYPE)); break;
		default: PRINT(BUF, L"%s ", STRING_ERROR); return;
		}
	}
	if (output->haveSockets == 1 || InNoSocket)
	{
		PRINT(BUF, L" ");
		if (output->quantityOrNbSockets >= 1)
			PRINT(BUF, getLocalString(STR_WITH_N_SOCKETS), output->quantityOrNbSockets);
//		else if (output->quantityOrNbSockets == 1)
	//			PRINT(BUF, getLocalString(STR_WITH_ONE_SOCKET));
		else
			PRINT(BUF, getLocalString(STR_WITH_SOCKETS));
	}
}
void printInputItem(CubeInput* input, LPWSTR buf, LPINT len, LPINT nbInputs)//maxsize)
{
	if (!input->byItemID && !input->byItemTypeID)
		return;
	if (*nbInputs)
		PRINT(BUF, L" + ");

	BYTE nb = input->quantity > 0 ? input->quantity : 1;
	*nbInputs += nb;
	if (nb > 1)
		PRINT(BUF, L"%u ", nb);

	if (input->isEthereal)
		PRINT(BUF, L"%s ", getLocalString(STR_ETHERAL));

	if (input->isNotEthereal)
		PRINT(BUF, L"%s ", getLocalString(STR_NOT_ETHERAL));

	if (input->isNotRuneword)
		PRINT(BUF, L"%s ", getLocalString(STR_NOT_RUNEWORD));

	if (input->isBasic)
		PRINT(BUF, L"%s ", getLocalString(STR_BASIC));

	if (input->isExceptional)
		PRINT(BUF, L"%s ", getLocalString(STR_EXCEPTIONAL));

	if (input->isElite)
		PRINT(BUF, L"%s ", getLocalString(STR_ELITE));

	if (input->isSpecificItem) {
		if (input->quality == ITEMQUALITY_UNIQUE)
		{
			UniqueItemsBIN* uniqueItems = SgptDataTables->uniqueItems + input->specificID - 1;
			PRINT(BUF, StripGender(D2GetStringFromIndex(uniqueItems->uniqueNameId)));
		}
		else if (input->quality == ITEMQUALITY_SET) {
			SetItemsBIN* setItems = SgptDataTables->setItems + input->specificID - 1;
			PRINT(BUF, StripGender(D2GetStringFromIndex(setItems->setNameId)));
		}
		else {
			PRINT(BUF, L"%s ", STRING_ERROR); return;
		}
	}
	else {
		switch (input->quality)
		{
		case 1:PRINT(BUF, L"%s ", getLocalString(STR_CRACKED)); break;
		case 2:PRINT(BUF, L"%s ", getLocalString(STR_NORMAL)); break;
		case 3:PRINT(BUF, L"%s ", getLocalString(STR_SUPERIOR)); break;
		case 4:PRINT(BUF, L"%s ", getLocalString(STR_MAGIC)); break;
		case 5:PRINT(BUF, L"%s ", getLocalString(STR_SET)); break;
		case 6:PRINT(BUF, L"%s ", getLocalString(STR_RARE)); break;
		case 7:PRINT(BUF, L"%s ", getLocalString(STR_UNIQUE)); break;
		case 8:PRINT(BUF, L"%s ", getLocalString(STR_CRAFTED)); break;
		case 9:PRINT(BUF, L"%s ", getLocalString(STR_TEMPERED)); break;
		}
		if (input->byItemTypeID) {
			ItemTypesBIN* itemTypeData = D2GetItemTypesBIN(input->ID);
			if (!itemTypeData)
				PRINT(BUF, L"Unknow Item Type");
			else
				PRINT(BUF, getLocalTypeString(itemTypeData->code));
		}
		else if (input->ID == 0xFFFF) {
			PRINT(BUF, getLocalString(STR_ITEM));
		}
		else {
			ItemsBIN* items = D2GetItemsBIN(input->ID);
			PRINT(BUF, StripGender(D2GetStringFromIndex(items->NameStr)));
		}
	}
	if (input->includeUpgradedVersions && !input->isElite)
		PRINT(BUF, L" %s", getLocalString(STR_INCLUDE_UPGRADED));

	if (input->haveNoSocket)
	{
		PRINT(BUF, L" %s", getLocalString(STR_WITHOUT_SOCKET));
		InNoSocket = true;
	}
	if (input->haveSockets)
		PRINT(BUF, L" %s", getLocalString(STR_WITH_SOCKETS));
}