Skrypt

Witam, już nie przybywam z problemami z kompilacją, a problemem dotyczącym modyfikacji nad którą, pracuję.

1.Zacząłem tworzyć modyfikację, która m.in. dodaje dodatkowe/alternatywne ulepszenie jednostek, dzięki pomocy Ivana, dowiedziałem się jak tworzyć ulepszenia.
Moje pytanie jak zrobić, aby po wybudowaniu jednego budynku, dostałbym 2 ulepszenia
przykład: pikinier - buduje ul.wieża strażnicza (nie pamiętam po ang.) i dostaję halabardników i Zbójców(?, Rogue).

2.Nie wiedziałem jak to zrobić, więc zacząłem pisać jakiś prosty skrypt:

		
level = 0;
		BOOST_FOREACH(const JsonNode &node, town_node"alternative_upgrades"].Vector())
		{
			if(towns[townID].alternative_upgrades[level] != -1)
				towns[townID].creatures[level].push_back(node.Float());
			level ++;
		}

Po skompilowaniu wywala błąd z “Vector”.

  1. Który fragment w kodzie VCMI, dotyczy ulepszonych jednostek?
		// Read creatures belonging to that city
		level = 0;
		BOOST_FOREACH(const JsonNode &list, town_node"creatures"].Vector())
		{
			BOOST_FOREACH(const JsonNode &node, list.Vector())
			{
				towns[townID].creatures[level].push_back(node.Float());
			}
			level ++;
		}

ten fragment tylko czyta, jakie są jednostki (wszystkie w creatures), a gdzie jest fragment, który pozwala na werbowanie ulepszeń?

A jest coś takiego jak “alternative_upgrades”?

Dostrzegam pewną sprzeczność.

Nie ma jednego fragmentu, który obsługuje coś takiego, jak “ulepszenia jednostek”. Masz na myśli parsowanie stworzeń i ich ulepszeń, konfigurację miasta, interfejs miasta umozliwiający rekrutację, interfejs jednostki umożliwiającej ulepszenie, kod sprawdzający możliwe ulepszenia? Każdy fragment znajduje się w sobie właściwym miejscu, trzeba więc sprecyzować zapytanie.

“alternative_upgrades” jest zrobiony przeze mnie i jest na pewno dobrze zrobiony. Zmodyfikowałem CTownHandler.h i dodałem tą zmienną.
I oto linijki z alternative_upgrades

"alternative_upgrades" : { "type" : "array", "items" : { "type" : "number"} },

z buildings.json

std::vector<int> alternative_upgrades;

zmienna

template <typename Handler> void serialize(Handler &h, const int version)
	{
		h & names & creatures & alternative_upgrades & hordeLvl & mageLevel & bonus
			& primaryRes & warMachine & typeID;
	}

i modyfikacja template’a

Od Ivana dowiedziałem się jak poprzez dodanie budynku, mogę dodać kolejne ulepszenie np. Hota i w nowym zamku jest 3 stopniowa jednostka, dzięki dodatkowemu budynkowi.

Chodzi mi o to gdzie to jest w skryptach, że jak zbuduje budynek dwelling w mieście, to odblokowuje mi on ulepszoną jednostkę?

Czy teraz jest jasne ?

To nie jest “w skryptach”, bo lista wybudowanych struktur w mieście jest elementarna. Za to nie ma struktury opisującej dostępne do rekrutacji typy jednostek, więc jej nie znajdziesz :stuck_out_tongue:
Takie rozwiązanie przyjęto w zdecydowanej większości pierwotnego kodu, bo było najprostsze. Program sprawdza po prostu listę wybudowanych budynków i na tej podstawie określa, jakie jednostki są dostępne.

To jest schemat. Nie wiem dokładnie, jak z niego korzystać, ale na pewno nie należy go parsować. Parsować możesz tablice, które zawierają konkretne elementy.

Nie zrozumiałem cię. Wpisałem to do schema w buildings.json, tak jak inne zmienne są wpisane i co, nie muszę tego wpisywać ?

Co do pierwszego. Wcześniej, gdy podział był na basic_creatures i upgrade_creatures, to był w kodzie VCMI przykład z sharpshooterem, ale po aktualizacji nie wiem, gdzie to teraz jest.

—EDIT----------------

2457	 	                ssi.creatures[bid-37].second.push_back(t->town->upgradedCreatures[bid-37]); 
2458	 	                //Test for 2nd upgrade - add sharpshooters if grand elves dwelling was constructed 
2459	 	                //if (t->subID == 1 && bid == 39) 
2460	 	                //      ssi.creatures[bid-37].second.push_back(137); 
2461	 	                sendAndApply(&ssi); 
2462	 	        } 
2463	 	        else if(bid >= 30) //bas. dwelling 
2464	 	        { 
2465	 	                int crid = t->town->basicCreatures[bid-30]; 
2466	 	                SetAvailableCreatures ssi; 
2467	 	                ssi.tid = tid; 
2468	 	                ssi.creatures = t->creatures; 
2469	 	                ssi.creatures[bid-30].first = VLC->creh->creatures[crid]->growth; 
2470	 	                ssi.creatures[bid-30].second.push_back(crid); 
 	2466	                if (bid <= EBuilding::DWELL_LAST) 
 	2467	                        ssi.creatures[level].first = crea->growth; 
 	2468	                ssi.creatures[level].second.push_back(crea->idNumber); 

szybka kopia, jak widać jest tutaj przykład z kolejną jednostką, ale został plik zaaktualizowany przez co nie ma tej części.

Ten kod

 BOOST_FOREACH(const JsonNode &node, town_node"alternative_upgrades"].Vector())

Pobiera wektor wartości o nazwie “alternative_upgrades”. Gdzie jest ten wektor w pliku konfiguracyjnym?
Bo tu

"alternative_upgrades" : { "type" : "array", "items" : { "type" : "number"} },

z pewnością go nie ma.

Dodam też, że plik buildings.json jest bodaj jedynym , który zawiera schemat. Więc sugeruję się nim nie kierować, a przed użyciem schematu zastanowić się, jak działa. Bo ja tego nie wiem.

Widzę, że się nie dogadamy.
Wartości są i są one pod creatures i wygląda to tak:

"alternative_upgrades" : -1, -1, -1, -1, -1, -1, -1],

“basic_creatures” i “upgrade_creatures” zostały zmienione na "creatures"
i obecnie to wygląda tak:

"creatures" :  [14, 15], [16, 17], [18, 19, 137], [20, 21], [22, 23], [24, 25], [26, 27] ],

To wygląda jakbyś nawet tego nie zauważył. A wcześniej była to zwykła tablica, jak moja.

Dobra, jak widać poradziłem sobie sam. Działa elegancko. Usunąłem to:

level = 0;
        BOOST_FOREACH(const JsonNode &node, town_node"alternative_upgrades"].Vector())
        {
            if(towns[townID].alternative_upgrades[level] != -1)
                towns[townID].creatures[level].push_back(node.Float());
            level ++;
        } 

i przerobiłem delikatnie tak jak było na przykładzie i działa.

Dziękuję za wszelką próbę pomocy.

error vector subscript out of range
line 932

error “standard libraries c++ out of range” && 0
line 933

Niestety, znów powróciłem, jednak bez wczytania alternative_upgrades, się nie obejdzie, ponieważ dzięki temu będę mógł dodać w łatwy sposób alternatywne jednostki.