Seite 1 von 1

[FIXED:abcab4f] Gebäudevoraussetzungen blockieren sich

Verfasst: Sonntag 18. August 2013, 16:24
von Vuto
Wir haben immer noch ein paar Gebäude die nicht baubar sind, da sie sich gegenseitig ausschließende Voraussetzungen haben.
Only own colony, only minorrace stystem und only conquered system blockieren einander.
Z.B. die Kartelle der Hanuhr. Siehe auch Protektionismus. (dort wurden dann alle Voraussetzungen entfernt)

Zwei Möglichkeiten zur Problemlösung:
1. Wir ändern alle Gebäude die das Problem haben.
2. Wir ändern den Code.


EDIT: Überarbeiteter Code ist in Post Nr.4

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Mittwoch 21. August 2013, 09:35
von Darkness
Diese Blockade war doch beabsichtigt. Hier wurden doch einfach sinnvolle Baueinschränkungen für Gebäude vorgenommen. Straflager nur auf eroberter Welt baubar und nicht auf Mitgliedswelt, Geheimdienstgebäude nur in eigenen und nicht baubar etc.

Wüsste auch grade nicht welche Gebäude da mehrfachbetroffen wären.

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Mittwoch 21. August 2013, 13:38
von Vuto
Jain, beabsichtigt war es vermutlich, sinnvoll und durchdacht ist es trotzdem nicht.
Was man schon daran sieht, dass wir uns bei ein paar Gebäuden nicht daran halten und sie deshalb nicht baubar sind. Der Bedarf für diese Möglichkeit der Einstellungen ist also vorhanden.

Wie ich oben schon geschrieben habe, sind die Kartelle der Hanuhr betroffen, sie sollen in einer eigenen Kolonien und eroberten Systemen baubar sein, aber nicht in Minorracesystemen. Kombinationen aus zwei Voraussetzungen bedeuten momentan, dass es nirgends baubar ist, da immer A und B zutreffen müssen und nicht A oder B.

Eigentlich wäre es sinnvoll das "only" generell zu streichen und nicht mehr auszuwählen wo es ausschließlich baubar ist, sondern sinnvolle Kombinationen zuzulassen. Z.B. Ein Gebäude baubar im Heimatsystem und Minorracewelten (z.B. eine Botschaft) wäre doch denkbar. Die Einstellungen zum Heimatsystem müsste ich dann noch in den Code aufnehmen.

Hier mal ein Liste wie viele Gebäude mit Voraussetzungen wir zur Zeit haben:
Heimatsystem: 24 (manches bei allen Majors z.B. Derithiummine)
Kolonie: 11
Minor: 6 (nur Kommunikationsnetzwerke)
Erobert: 1 (nur Cartarer)
Mischungen: 4 (nicht baubar)

Von dem Bug direkt sind also nur wenige Gebäude betroffen, aber mit der Lösung könnten wir viele Gebäude verbessern. Ich bin übrigens überrascht, dass wir sozusagen keine Gebäude für eroberte Systeme und Minorsysteme haben. Ich finde das sollten wir ändern.

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Donnerstag 22. August 2013, 19:39
von Vuto
Ich habe meinen grauen Zellen eine kleine Pause gegönnt und mich danach noch mal an den Code gemacht. Jetzt stimmt alles und es wurde auch schon mit allen Kombinationsmöglichkeiten getestet.

Bestehender Code System.cpp (Zeile 2706-2723):

Code: Alles auswählen

	// Nur Heimatplanet checken
	if (building->GetOnlyHomePlanet())
	{
		if (m_sOwnerOfSystem == pMajor->GetRaceID() && sector->GetName() != pMajor->GetHomesystemName())
			return FALSE;
	}
	// Nur eigene Kolonie checken (Heimatsystem ist auch eine eigene Kolonie)
	if (building->GetOnlyOwnColony())
		if (sector->GetColonyOwner() != m_sOwnerOfSystem)
			return FALSE;
	// Nur Minorraceplanet checken
	if (building->GetOnlyMinorRace())
		if (sector->GetMinorRace() == FALSE)
			return FALSE;
	// Nur erobertes System checken
	if (building->GetOnlyTakenSystem())
		if (sector->GetTakenSector() == FALSE)
			return FALSE;
Neuer Code kommt in Zeile 2769 (wichtig, nicht an der alten Stelle einfügen):

Code: Alles auswählen

	// Checken ob zumindest eine der Voraussetzungen zutrifft: Heimatplanet, eigene Kolonie, Minorraceplanet oder Erobertes System
	// Zuerst Heimatplanet checken
	if (building->GetOnlyHomePlanet())
	{
		if (sector->GetName() == pMajor->GetHomesystemName())
		{
			return TRUE;
		}
		if (building->GetOnlyOwnColony())
		{
			if (sector->GetColonyOwner() == m_sOwnerOfSystem && sector->GetName() != pMajor->GetHomesystemName())
				return TRUE;
		}
		if (building->GetOnlyMinorRace())
		{
			if (sector->GetMinorRace() == TRUE && sector->GetTakenSector() == FALSE)
				return TRUE;
		}
		if (building->GetOnlyTakenSystem())
		{
			if (sector->GetTakenSector() == TRUE)
				return TRUE;
		}
		return FALSE;
	}
	// Zuerst eigene Kolonie checken
	if (building->GetOnlyOwnColony())
	{
		if (sector->GetColonyOwner() == m_sOwnerOfSystem && sector->GetName() != pMajor->GetHomesystemName())
		{
			return TRUE;
		}
		if (building->GetOnlyHomePlanet())
		{
			if (sector->GetName() == pMajor->GetHomesystemName())
				return TRUE;
		}
		if (building->GetOnlyMinorRace())
		{
			if (sector->GetMinorRace() == TRUE && sector->GetTakenSector() == FALSE)
				return TRUE;
		}
		if (building->GetOnlyTakenSystem())
		{
			if (sector->GetTakenSector() == TRUE)
				return TRUE;
		}
		return FALSE;
	}
	// Zuerst Minorraceplanet checken
	if (building->GetOnlyMinorRace())
	{
		if (sector->GetMinorRace() == TRUE && sector->GetTakenSector() == FALSE)
		{
			return TRUE;
		}
		if (building->GetOnlyHomePlanet())
		{
			if (sector->GetName() == pMajor->GetHomesystemName())
				return TRUE;
		}
		if (building->GetOnlyOwnColony())
		{
			if (sector->GetColonyOwner() == m_sOwnerOfSystem && sector->GetName() != pMajor->GetHomesystemName())
				return TRUE;
		}
		if (building->GetOnlyTakenSystem())
		{
			if (sector->GetTakenSector() == TRUE)
				return TRUE;
		}
		return FALSE;
	}
	// Zuerst erobertes System checken
	if (building->GetOnlyTakenSystem())
	{
		if (sector->GetTakenSector() == TRUE)
		{
			return TRUE;
		}
		if (building->GetOnlyHomePlanet())
		{
			if (sector->GetName() == pMajor->GetHomesystemName())
				return TRUE;
		}
		if (building->GetOnlyOwnColony())
		{
			if (sector->GetColonyOwner() == m_sOwnerOfSystem && sector->GetName() != pMajor->GetHomesystemName())
				return TRUE;
		}
		if (building->GetOnlyMinorRace())
		{
			if (sector->GetMinorRace() == TRUE && sector->GetTakenSector() == FALSE)
				return TRUE;
		}
		return FALSE;
	}
Durch die Verschiebung ans Ende muss man sich nicht mehr mit "return FALSE;" herumgeschlagen, sondern kann "return TRUE;" ausgeben, falls eine Bedingung erfüllt ist.
Das ganze ist leider ein ziemliches "if"-Monster, aber für etwas kompakteres reichen meine Programmierfähigkeiten leider nicht aus.

Zusätzlich mache ich noch zwei kleine Veränderungen an der SystemMenuView.cpp und der StringTable, da es für Minorracesystem bisher keinen String gab.


Mit dem Fix können alle vier Bedingungen frei kombiniert werden, trifft eine zu, ist das Gebäude baubar.
An unseren bestehenden Gebäuden verändert sich Folgendes:
- Die bisher nicht baubaren Gebäude sind baubar.
- Bei den "only own colony"-Gebäuden muss jetzt auch ein Haken bei Homesystem gesetzt werden, sofern wir wollen, dass sie weiterhin in Kolonien und dem Heimatsystem baubar sind. Jetzt haben wir die Auswahl.

Das sind die elf Gebäude, ich würde sie vorerst in Kolonien und im Heimatsystem baubar lassen, oder hat jemand eine andere Meinung dazu?
Terraner:
Private Farm
Angström-Institut

Hanuhr:
Private Farm

Khayrin:
Halle des Imperators
Taktische Schule
Zentrum zur Kampferprobung

Rotharianer:
Superorganismus-Institut
Synergetik-Akademie

Cartarer:
Kriegsanleihendezernat

Omega:
Da'unor Forschungsabteilung
Kampftrainingszentrum


So, jetzt ist die Frage:
Wollt ihr diesen Fix und wenn ja, soll ich direkt committen oder soll es sich erst noch Anonymissimus anschauen?

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Donnerstag 22. August 2013, 20:21
von Anonymissimus
Hm, also ich traue dir völlig zu dass du diese Logik hier richtig hinkriegst. :) Zumal du schon ein Weilchen dran rummachst.

Ich frag mich eher, wie du es denn testen können willst ? Du musst mindestens eine virtual engine mit einem windows, dem visual C++ compiler und MFC dafür haben da BotE unter Linux völlig unkompilierbar ist !? Jedesmal jemand anderen zu bitten es zu kompilieren oder so ist impraktikabel. BotE diskriminiert nunmal von Haus aus einige gängige Betriebssysteme, da muss man sich unterwerfen oder bleiben lassen. ;)

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Donnerstag 22. August 2013, 21:19
von Vuto
Genau, mit einer Virtuellen Maschine mit Win-XP geht das auch unter Linux, das war mein letztes Windows, ich habe lange nach der CD suchen müssen. Die alte BotF-CD habe ich dabei auch gefunden, schon das Cover weckt nostalgische Gefühle. Leider war ein großer Kratzer darauf, aber mit BotE habe ich eine sehr gute Alternative. :wink:

Gut, wenn keiner "NEIN! HALT! STOP!" schreit, werde ich es demnächst hochladen. Ich gebe euch noch genug Zeit zum Widerspruch. :)


Noch eine Frage, Anonymissimus, kann ich die GdiPlus.dll in /trunk rein kopieren, das würde mir einige Klicks sparen, oder stört das?

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Freitag 23. August 2013, 11:02
von Darkness
Wenn hier Jemand
"NEIN! HALT! STOP!"
zu irgendeinem Fortschritt in der Entwicklung schreit werd ich ihn aus dem Verkehr ziehen. :twisted:

Im schlimmsten Fall funktioniert es nicht richtig und muss angepasst werden, im besten Fall ist es ein weiterer Schritt in die richtige Richtung. :D

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Freitag 23. August 2013, 17:09
von Anonymissimus
Vuto hat geschrieben:Genau, mit einer Virtuellen Maschine mit Win-XP geht das auch unter Linux, das war mein letztes Windows, ich habe lange nach der CD suchen müssen. Die alte BotF-CD habe ich dabei auch gefunden, schon das Cover weckt nostalgische Gefühle. Leider war ein großer Kratzer darauf, aber mit BotE habe ich eine sehr gute Alternative. :wink:
Okay. Ist halt etwas langsam so, aber geht. IIRC das größte Problem ist dass der Zugriff auf die geshareten Festplatten sehr langsam ist, falls du den sourcecode auf so einer liegen hast.
Vuto hat geschrieben:Noch eine Frage, Anonymissimus, kann ich die GdiPlus.dll in /trunk rein kopieren, das würde mir einige Klicks sparen, oder stört das?
Ich frag mich grade warum sie da nicht schon ist...ich glaube ich musste die da auch mal reinkopieren, aber nur unter Linux, denn unter windows liegt sie wohl irgendwo im System.
Jedenfalls, man braucht solche Dateien nicht zu git hinzuzufügen nach dem Reinkopieren oder Erstellen; in der Datei ./git/info/exclude kann man <Dateiname> als zu ignorierende Datei reinschreiben. Da jene dll an diesem Ort nicht für alle Entwickler Sinn macht, ist das hier das was du tun solltest, sodass sie also nicht dauernd bei den einzutragenden Veränderungen auftaucht. :)

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Freitag 23. August 2013, 19:29
von Vuto
Die Geschwindigkeit ist eigentlich akzeptabel, aber ich habe auch keine Vergleich wie schnell es ohne VM dazwischen ist. Da mein Computer sowieso alt und langsam ist fällt es vermutlich noch weniger auf. :wink:

Was die DLL betrifft hast du vermutlich Recht, die grob geschätzt drei Linuxuser die vor dem nächsten Release die Testversionen ausprobieren werden, schaffen es bestimmt auch die DLL selbst einzufügen.

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Samstag 24. August 2013, 08:00
von rainer
Vuto hat geschrieben:Wollt ihr diesen Fix und wenn ja, soll ich direkt committen oder soll es sich erst noch Anonymissimus anschauen?
Am besten kann man solche Sachen testen, wenn "mehrere" testen - darum würde ich die "Testversionen" wiederaufleben lassen, die aus dem offiziellen Repository kommen.
(Mein aktueller Code ist aber so verseucht...müßte erstmal einiges "gesäubert" übertragen...und ob der Code dann "gut" ist, naja...)

Zurück zur Frage: Also direkt committen :wink: , dann kann der nächste (z.B. Anonymissimus) ja eh noch -und direkt- eingreifen/verbessern. (Man committet ja eh nur, was man guten Gewissens vertreten kann und wenn man nie etwas ausprobiert, geht auch nichts vorwärts, was ganz schlecht wäre - da bin ich also gleicher Meinung wie Darkness )

Testversionen http://forum.birth-of-the-empires.de/vi ... 238#p29238: da die Commit-Nummer aus Codeplex nicht mehr verfügbar ist, schlage ich dann eine Datumskennung vor (2013-08-24 und so...)

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Mittwoch 28. August 2013, 19:53
von Vuto
So, ich habe es dann endlich mal committet.

Datumskennung für die Testversionen sollte ok sein, aber die ersten 7 SHA-Ziffern wären auch eine Möglichkeit.

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Donnerstag 26. September 2013, 20:17
von Anonymissimus
Main kann bei unterworfenen Minors deren Gebäude nicht mehr errichten, ich glaube das ging früher ? Kann das mal einer bestätigen bitte, ich unterwerfe da zu wenig für. ;)
Besonders komisch dass ich die Schiffe desselben Minors nämlich bauen kann. Das ist zumindest inkonsequent.

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Freitag 27. September 2013, 00:02
von Vuto
Danke fürs testen, ich werde es mir morgen anschauen.

Vorher konnte man bei unterworfenen Minors definitiv ihre Gebäude bauen, gut möglich dass ich das Detail übersehen habe.
An meine Test für unterworfenen Majors und Heimatplaneten kann ich mich erinnern, an eroberte Minors überraschenderweise nicht. :wink:

Vermutlich muss ich nur 4x

Code: Alles auswählen

&& sector->GetTakenSector() == FALSE
löschen.


Noch ein Frage, soll ich bei der Gelegenheit meine geschweiften Klammern ändern?

Code: Alles auswählen

if(a)
{
b;
}

zu

if(a) {
b;
}
Es hat beides Vor- und Nachtteile, eigentlich wären in dem Codestück sowieso alle außer den vorderen vier Klammerpaaren verzichtbar.
Es ist nur eine Nebensächlichkeit, aber ich wüsste trotzdem gerne ob wir eine bevorzugte Variante haben.

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Samstag 28. September 2013, 14:17
von rainer
Vuto hat geschrieben:Noch ein Frage, soll ich bei der Gelegenheit meine geschweiften Klammern ändern?

Code: Alles auswählen

if(a)
{
b;
}
[2. Variante gleich gar nicht zitiert]
Es hat beides Vor- und Nachtteile, eigentlich wären in dem Codestück sowieso alle außer den vorderen vier Klammerpaaren verzichtbar.
Es ist nur eine Nebensächlichkeit, aber ich wüsste trotzdem gerne ob wir eine bevorzugte Variante haben.
ich denke, dass obige Variante leichter lesbar ist und auch im Code öfters vorkommt (obwohl die andere Variante wohl die profi-mäßiger ist)

Re: Gebäudevoraussetzungen blockieren sich gegenseitig

Verfasst: Donnerstag 3. Oktober 2013, 20:43
von Vuto
Ist gefixt, es musste wirklich nur GetTakenSector gelöscht werden.

Klammern habe ich so gelassen, ich werde mich einfach immer nach der Klammerung des umgebenden Codeblocks richten.