View difference between Paste ID: Wcn4D0pm and VqiwepeW
SHOW: | | - or go back to the newest paste.
1
Design:
2
 Arr[0]	[1]	[2]	[3]	...	[N]	 =>	len(Array)=N+1
3
Count=N	1st	2nd	3rd	...	Nth
4
Get(-1)	(0)	(1)	(2)	...(N-1) =>	for (i=0;i<p->Get(-1);i++)	p->Get(i) [...];
5
Count=N	1st	2nd	3rd	...	Nth		Appears like a normal array.
6
7
======================================================
8
CvBuildingInfo::getPrereqOrBonuses()
9
======================================================
10
// returns array length when called with -1
11
int CvBuildingInfo::getPrereqOrBonuses(int i) const		
12
{
13
	FAssertMsg(i < GC.getNUM_BUILDING_PREREQ_OR_BONUSES(), "Index out of bounds");
14
	if (m_piPrereqOrBonuses)
15
	{
16
		int size = m_piPrereqOrBonuses[0];
17
		if (i == -1)	return size;
18
		if (i < size)	return m_piPrereqOrBonuses[i+1];
19
		return -1;
20
	}
21
	return -1;
22
}
23
24
======================================================
25
CvBuildingInfo::getCheckSum()
26
======================================================
27
	if (m_piPrereqOrBonuses)	CheckSumI(iSum, m_piPrereqOrBonuses[0]+1, m_piPrereqOrBonuses);
28
29
30
======================================================
31
CvBuildingInfo::read()
32
======================================================
33
	if (pXML->TryMoveToXmlFirstChild(L"PrereqBonuses"))
34
	{
35
		iNumChildren = pXML->GetXmlChildrenNumber();
36
		FAssertMsg((iNumChildren <= GC.getNUM_BUILDING_PREREQ_OR_BONUSES()),"Too many Prereq Or Bonuses for the building.");
37
		int *tmp = new int[iNumChildren];
38
		int iTotal = 0;
39
		if (0 < iNumChildren)
40
		{
41
			if (pXML->GetChildXmlVal(szTextVal))
42
			{
43
				for (j=0; j<iNumChildren; j++)
44
				{
45
					int eInfo = pXML->GetInfoClass(szTextVal);
46
					if (eInfo != -1)	tmp[iTotal++] = eInfo;
47
					if (!pXML->GetNextXmlVal(szTextVal))	break;
48
				}
49
				if (iTotal != 0)
50
				{
51
					m_piPrereqOrBonuses = new int[iTotal+1];
52
					m_piPrereqOrBonuses[0] = iTotal;
53
					for (j=0; j<iTotal; j++)	m_piPrereqOrBonuses[j+1] = tmp[j];
54
				}
55
				pXML->MoveToXmlParent();
56
			}
57
		}
58
		else	SAFE_DELETE_ARRAY(m_piPrereqOrBonuses);
59
		pXML->MoveToXmlParent();
60
	}
61
	else	SAFE_DELETE_ARRAY(m_piPrereqOrBonuses);
62
63
======================================================
64
CvBuildingInfo::CopyNonDefaults()
65
======================================================
66
	int iTotalTheirs = pClassInfo->getPrereqOrBonuses(-1);
67
	if (iTotalTheirs != -1)
68
	{
69
		int iTotalOurs = 0;
70
		if (m_piPrereqOrBonuses)	iTotalOurs = m_piPrereqOrBonuses[0];
71
		int* tmp = new int[iTotalTheirs+iTotalOurs+1];
72
		tmp[0] = iTotalTheirs+iTotalOurs;
73
		for (int j=0; j<iTotalTheirs; j++)
74
			tmp[j+1] = pClassInfo->getPrereqOrBonuses(j);
75
		for (int j=0; j<iTotalOurs; j++)
76
			tmp[j+iTotalTheirs+1] = m_piPrereqOrBonuses[j+1];
77
		m_piPrereqOrBonuses = tmp;
78
	}
79
80
======================================================
81
Take Two
82
======================================================
83
// Macro for concatenating two packed arrays in CopyNonDefaults()
84
#define PACKED_ARRAY_COPYNONDEFAULTS(theirFn, ourArr) if (theirFn(-1) != -1) {		\
85
	int theirSize = theirFn(-1), ourSize = 0; if (ourArr)	ourSize = ourArr[0];	\
86
	int* tmp = new int[theirSize+ourSize+1]; tmp[0] = theirSize+ourSize;			\
87
	for (int i=0; i<theirSize; i++)	tmp[i+1] = theirFn(i);							\
88
	for (int i=0; i<ourSize; i++)	tmp[i+theirSize+1] = ourArr[i+1]; ourArr = tmp; }
89
90
void CvBuildingInfo::copyNonDefaults(CvBuildingInfo* pClassInfo, CvXMLLoadUtility* pXML)
91
{ [...]
92
	PACKED_ARRAY_COPYNONDEFAULTS(pClassInfo->getPrereqAndTechs, m_piPrereqAndTechs);
93
94
	if (getPrereqAndBonus() == NO_BONUS) m_iPrereqAndBonus = pClassInfo->getPrereqAndBonus();
95
	PACKED_ARRAY_COPYNONDEFAULTS(pClassInfo->getPrereqOrBonuses, m_piPrereqOrBonuses);
96
[...] }
97
98
99
======================================================
100
CvCity::CanConstructInternal()
101
This modification applies in four other places:
102
	CvGameTextMgr::buildBuildingRequiresString(),
103
	CvPlayer::recalculateResourceConsumption(),
104
	CvPlayerAI::AI_bonusTrade(), and
105
	CvPlayerAI::AI_baseBonusVal().
106
======================================================
107
			for (iI = 0; iI < kBuilding.getPrereqOrBonuses(-1); iI++) // was "iI < GC.getNUM_BUILDING_PREREQ_OR_BONUSES()"
108
			{
109
				if (kBuilding.getPrereqOrBonuses(iI) != NO_BONUS)
110
				{
111
					bRequiresBonus = true;
112
113
					if (hasBonus((BonusTypes)kBuilding.getPrereqOrBonuses(iI)))
114
					{
115
						bNeedsBonus = false;
116
					}
117
				}
118
			}