[Fixed 78408] 78351 Probleme mit Midway-Zeitreisende

hier kommen Threads hinein, nachdem eine Meldung bearbeitet wurde
Antworten
Benutzeravatar
Dennis0078
Vizeadmiral
Vizeadmiral
Beiträge: 2051
Registriert: Samstag 6. Dezember 2008, 21:05

[Fixed 78408] 78351 Probleme mit Midway-Zeitreisende

Beitrag von Dennis0078 » Mittwoch 30. Januar 2013, 18:52

ich hab mal ein Foto geschossen.
müsste sich mit save wiederholen lassen.


Auf dem Bild sieht man auch bei mehr als 70 Gebäuden einer Art geht es über den Rand .......
Ist aber nicht so tragisch, da man selten über 70 hat.
Dateianhänge
Midway-Zeitreisende.sav
(224.6 KiB) 75-mal heruntergeladen
Midway-Zeitreisende.JPG
Midway-Zeitreisende.JPG (173.41 KiB) 2532 mal betrachtet

Anonymissimus
Flottenkapitän
Flottenkapitän
Beiträge: 990
Registriert: Freitag 14. Mai 2010, 14:39

[FIXED]Re: 78351 Probleme mit Mitway-Zeitreisende

Beitrag von Anonymissimus » Mittwoch 30. Januar 2013, 19:57

Ich vermute mal, ein Midway hat immer nur Systemangriff gesetzt und nie was anderes ?
Damit rechnet dieser check halt nicht. Ist ein Ziel gesetzt, kann man normal nicht gleichzeitig ein System angreifen...
Um die Midway-Implementierung nicht zu verkomplizieren (Notwendigkeit Befehle umzuschalten bzw eine KI für Midways), sollten besser Midways bei dem check ausgenommen werden. Allerdings könnte es auch ein Problem sein, wenn der Befehl Systemangriff lautet obwohl sich gar kein System unter dem Schiff befindet...
Wie funktioniert das bei den Morlocks ? Die greifen auch Systeme an, offenbar ohne Systemangriffsbefehl. Das wäre wahrscheinlich am einfachsten.

EDIT
Sollte besser aufhören rumzuspekulieren. Bin grad dabei.

EDIT2
Fixed.

Benutzeravatar
Sir Pustekuchen
Administrator
Administrator
Beiträge: 4181
Registriert: Dienstag 10. Januar 2006, 16:46
Kontaktdaten:

Re: 78351 Probleme mit Mitway-Zeitreisende

Beitrag von Sir Pustekuchen » Mittwoch 30. Januar 2013, 21:32

Hier kurz der Code:

Code: Alles auswählen

         // Befindet sich das Midway Schlachtschiff über einem System von einem Major,
			// so wird dieses im Kriegsfall bombardiert. Ansonsten verringert sich die Beziehung mit
			// jeder Runde. Umso länger das Midway-Schlachtschiff über einem System steht, umso
			// wahrscheinlicher ist es, dass Krieg erklärt wird (nur den Midways helfen indem man Credits
			// übergibt kann dagegen helfen).
			CSystem* pSystem = &GetSystem(co.x, co.y);
			if (CMajor* pOwner = dynamic_cast<CMajor*>(m_pRaceCtrl->GetRace(pSystem->GetOwnerOfSystem())))
			{
				if (pOwner->GetAgreement(pAlien->GetRaceID()) == DIPLOMATIC_AGREEMENT::WAR)
					ship->second->SetCurrentOrder(SHIP_ORDER::ATTACK_SYSTEM);
				else
					pAlien->SetRelation(pOwner->GetRaceID(), -rand()%20);
			}
Das Midway-Schiff bekommt unter bestimmten Umständen den Systemangriffsbefehl gesetzt. In der nächsten Runde kann es dann das System angreifen. Es muss den Befehlsregeln aller anderen Schiffe folgen. Ich kann mir nur vorstellen, dass die Zielkoordinate beim setzen des Systemangriffbefehls oben nicht zurückgesetzt wird. Ich dachte das macht die Funktion "SetCurrentOrder" automatisch bei den entsprechenden Befehlen, welche nicht gleichzeitig mit einem Flugziel eingestellt werden können. Vielleicht müsste man hier ein mögliches Ziel wegnehmen. Besser wäre es aber, wenn die Funktion SetCurrentOrder() bei den entsprechenden Befehlen automatisch das Flugziel zurücksetzt. Dann kann man es beim Programmieren nicht vergessen.

@Anonymissimus: Deine Meinung? Lieber global/generell in der SetCurrentOrder Funktion prüfen und Ziel aufheben?

Anonymissimus
Flottenkapitän
Flottenkapitän
Beiträge: 990
Registriert: Freitag 14. Mai 2010, 14:39

Re: 78351 Probleme mit Mitway-Zeitreisende

Beitrag von Anonymissimus » Mittwoch 30. Januar 2013, 22:40

Sir Pustekuchen hat geschrieben:Besser wäre es aber, wenn die Funktion SetCurrentOrder() bei den entsprechenden Befehlen automatisch das Flugziel zurücksetzt. Dann kann man es beim Programmieren nicht vergessen.
Ich glaube, da sollten wir besser nix rumstellen...zumindest nicht jetzt. Aber wäre zu überlegen, analog zu der ShouldUnsetOrder() Methode, die in SetTargetKO aufgerufen wird und orders wegnimmt die nicht mit einem Ziel kompatibel sind.

Ich habs anders behoben...

Benutzeravatar
Sir Pustekuchen
Administrator
Administrator
Beiträge: 4181
Registriert: Dienstag 10. Januar 2006, 16:46
Kontaktdaten:

Re: [FIXED]78351 Probleme mit Mitway-Zeitreisende

Beitrag von Sir Pustekuchen » Mittwoch 30. Januar 2013, 23:20

Der Bug ist auch noch nicht behoben. Wenn das Schiff über einem System steht und einen Systemangriffsbefehl bekommt, dann wird der Zielkurs nicht zurückgesetzt. Nur wenn es nicht über einem System steht.

Ich denke auch in der Funktion ist das zurücknehmen des Zielkurses analog beim Setzen eines Kurses richtig. Es gibt nur 7 Stellen im Code, wo die Funktion verwendet wird. Und bei so gut wie allen muss vorher explizit der Kurs zurückgenommen werden. Das Problem hätten wir dann nicht mehr. Von daher werde ich es da hinhein schieben.

Hier wie beim Befehlgeben durch den Spieler:
// Bei manchen Befehlen müssen wir einen möglichen Zielkurs wieder zurücknehmen.
if (nOrder != SHIP_ORDER::NONE && nOrder != SHIP_ORDER::AVOID && nOrder != SHIP_ORDER::ATTACK && nOrder != SHIP_ORDER::ENCLOAK && nOrder != SHIP_ORDER::DECLOAK && nOrder != SHIP_ORDER::ASSIGN_FLAGSHIP && nOrder != SHIP_ORDER::CREATE_FLEET && nOrder != SHIP_ORDER::TRANSPORT)
{
pDoc->CurrentShip()->second->SetTargetKO(CPoint(-1, -1));
resources::pMainFrame->InvalidateView(RUNTIME_CLASS(CGalaxyMenuView));
}

Anonymissimus
Flottenkapitän
Flottenkapitän
Beiträge: 990
Registriert: Freitag 14. Mai 2010, 14:39

Re: 78351 Probleme mit Mitway-Zeitreisende

Beitrag von Anonymissimus » Donnerstag 31. Januar 2013, 01:48

Okay...lass mich das machen, bitte.

Anonymissimus
Flottenkapitän
Flottenkapitän
Beiträge: 990
Registriert: Freitag 14. Mai 2010, 14:39

Re: 78351 Probleme mit Mitway-Zeitreisende

Beitrag von Anonymissimus » Donnerstag 31. Januar 2013, 19:48

Puste:
Also sorry nein, ich committe das hier nicht, und zwar weil ich das Bugpotential für zu groß halte. Das ist eigentlich eine Refaktorierung, und man sollte irgendwann wenn ein release naht sich auf möglichst wenig invasive commits beschränken. Ich fühl mich für bugs die durch meine commits verursacht werden verantwortlich und mach das - zumindest momentan - nicht.
Es ist besser, ein paar kleine bugs zu akzeptieren, anstatt erneut wieder viel rumzumachen, sonst kommt man nie zu Potte. Wodurch dann auch die bisherige großartige Leistung unserer Tester wieder relativ nutzlos würde.

Hier das patch...ich glaube die Midways bombardieren da aber gar nicht mehr...

Code: Alles auswählen

From 1b228863455fb1b16ecb30bbb9396f02d1339bf5 Mon Sep 17 00:00:00 2001
From: unknown <_@a.(none)>
Date: Thu, 31 Jan 2013 02:57:16 +0100
Subject: [PATCH] refactor neccessary unsetting of targets because of setting
 orders

---
 Source/GUI/GalaxyMenuView.cpp   |    4 ----
 Source/GUI/ShipBottomView.cpp   |   16 ++++++++--------
 Source/Gamedata/AI/ShipAI.cpp   |    3 ---
 Source/Gamedata/Ships/Ship.cpp  |   18 ++++++++++++------
 Source/Gamedata/Ships/Ship.h    |    3 ++-
 Source/Gamedata/Ships/Ships.cpp |    8 +++++---
 Source/Gamedata/Ships/Ships.h   |    3 ++-
 7 files changed, 29 insertions(+), 26 deletions(-)

diff --git a/Source/GUI/GalaxyMenuView.cpp b/Source/GUI/GalaxyMenuView.cpp
index 2eda9e5..e98d16f 100644
--- a/Source/GUI/GalaxyMenuView.cpp
+++ b/Source/GUI/GalaxyMenuView.cpp
@@ -1324,10 +1324,6 @@ void CGalaxyMenuView::SearchNextIdleShipAndJumpToIt(CBotf2Doc* pDoc, SHIP_ORDER:
 				if(previous_ship != pDoc->m_ShipMap.end() && order != SHIP_ORDER::NONE) {
 					previous_ship->second->SetCurrentOrder(order);
 					assert(order == SHIP_ORDER::WAIT_SHIP_ORDER || order == SHIP_ORDER::SENTRY_SHIP_ORDER);
-					//In case the previous ship was selected via mouse instead via hotkey, which
-					//checks whether there's a target != -1,-1 set, it can be a ship which still
-					//has a valid target, but still would get order sentry or wait
-					previous_ship->second->SetTargetKO(CPoint(-1, -1), true);
 				}
 				m_PreviouslyJumpedToShip = RememberedShip(i->second->GetShipName(), i->second->Key());
 				m_pPlayersRace->GetStarmap()->Select(sector);// sets orange rectangle in galaxy view
diff --git a/Source/GUI/ShipBottomView.cpp b/Source/GUI/ShipBottomView.cpp
index e77b537..1d1e8f4 100644
--- a/Source/GUI/ShipBottomView.cpp
+++ b/Source/GUI/ShipBottomView.cpp
@@ -932,13 +932,6 @@ void CShipBottomView::OnLButtonDown(UINT nFlags, CPoint point)
 			if (i->rect.PtInRect(point))
 			{
 				SHIP_ORDER::Typ nOrder = static_cast<SHIP_ORDER::Typ>(i - m_vSecondaryShipOrders.begin());
-				// Bei manchen Befehlen müssen wir einen möglichen Zielkurs wieder zurücknehmen.
-				if (nOrder != SHIP_ORDER::NONE && nOrder != SHIP_ORDER::AVOID && nOrder != SHIP_ORDER::ATTACK && nOrder != SHIP_ORDER::ENCLOAK && nOrder != SHIP_ORDER::DECLOAK && nOrder != SHIP_ORDER::ASSIGN_FLAGSHIP && nOrder != SHIP_ORDER::CREATE_FLEET && nOrder != SHIP_ORDER::TRANSPORT)
-				{
-					pDoc->CurrentShip()->second->SetTargetKO(CPoint(-1, -1));
-					resources::pMainFrame->InvalidateView(RUNTIME_CLASS(CGalaxyMenuView));
-				}
-
 				// Wenn wir eine Flotte bilden wollen (Schiffe gruppieren), dann in der MainView die Flottenansicht zeigen
 				if (nOrder == SHIP_ORDER::CREATE_FLEET)
 				{
@@ -966,11 +959,15 @@ void CShipBottomView::OnLButtonDown(UINT nFlags, CPoint point)
 					resources::pMainFrame->InvalidateView(RUNTIME_CLASS(CTransportMenuView));
 				}
 				else if (nOrder == SHIP_ORDER::TERRAFORM) {
+					resources::pMainFrame->InvalidateView(RUNTIME_CLASS(CGalaxyMenuView));
+					pDoc->CurrentShip()->second->SetTargetKO(CPoint(-1, -1));
 					//command is given when clicked on planet
 				}
 				else if (nOrder == SHIP_ORDER::CANCEL) {
 					pDoc->CurrentShip()->second->UnsetCurrentOrder();
 					pDoc->CurrentShip()->second->SetIsShipFlagShip(false);
+					pDoc->CurrentShip()->second->SetTargetKO(CPoint(-1, -1));
+					resources::pMainFrame->InvalidateView(RUNTIME_CLASS(CGalaxyMenuView));
 				}
 				else if (nOrder == SHIP_ORDER::ATTACK)
 					pDoc->CurrentShip()->second->SetCombatTactic(COMBAT_TACTIC::CT_ATTACK);
@@ -978,7 +975,10 @@ void CShipBottomView::OnLButtonDown(UINT nFlags, CPoint point)
 					pDoc->CurrentShip()->second->SetCombatTactic(COMBAT_TACTIC::CT_AVOID);
 				// ansonsten ganz normal den Befehl geben
 				else
-					pDoc->CurrentShip()->second->SetCurrentOrder(nOrder);
+					// Bei manchen Befehlen müssen wir einen möglichen Zielkurs wieder zurücknehmen.
+					//done in SetCurrentOrder()
+					if(pDoc->CurrentShip()->second->SetCurrentOrder(nOrder))
+						resources::pMainFrame->InvalidateView(RUNTIME_CLASS(CGalaxyMenuView));
 				// bei Terraforming wird die Planetenansicht eingeblendet
 				if (nOrder == SHIP_ORDER::TERRAFORM)
 				{
diff --git a/Source/Gamedata/AI/ShipAI.cpp b/Source/Gamedata/AI/ShipAI.cpp
index 890230c..2f3fc6f 100644
--- a/Source/Gamedata/AI/ShipAI.cpp
+++ b/Source/Gamedata/AI/ShipAI.cpp
@@ -324,8 +324,6 @@ bool CShipAI::DoColonize(CShips* pShip)
 	{
 		if (pSector->GetPlanet(i)->GetTerraformed() && !pSector->GetPlanet(i)->GetColonized())
 		{
-			// Hier muss als erstes ein möglicher neuer Kurs gelöscht werden
-			pShip->SetTargetKO(CPoint(-1, -1));
 			pShip->SetCurrentOrder(SHIP_ORDER::COLONIZE);
 			return true;
 		}
@@ -596,7 +594,6 @@ bool CShipAI::DoStationBuild(CShips* pShip)
 	// Nur wenn der Sektor uns bzw. niemanden gehört
 	if (m_pDoc->GetSector(ptKO.x, ptKO.y).GetOwnerOfSector() == "" || m_pDoc->GetSector(ptKO.x, ptKO.y).GetOwnerOfSector() == sRace)
 	{
-		pShip->SetTargetKO(CPoint(-1, -1));
 		pShip->SetCurrentOrder(SHIP_ORDER::BUILD_OUTPOST);
 		return true;
 	}
diff --git a/Source/Gamedata/Ships/Ship.cpp b/Source/Gamedata/Ships/Ship.cpp
index 0954513..4e19304 100644
--- a/Source/Gamedata/Ships/Ship.cpp
+++ b/Source/Gamedata/Ships/Ship.cpp
@@ -507,9 +507,9 @@ F
 	SetCrewExperiance(expAdd);
 }
 
-//when setting a ship target, some running orders need to be unset if they're active
+//when setting a ship target (respectively order), some orders (resp. the target) need to be unset
 //this function calculates whether that's needed
-static bool ShouldUnsetOrder(SHIP_ORDER::Typ order) {
+static bool TargetCompatible(SHIP_ORDER::Typ order) {
 	switch(order) {
 		case SHIP_ORDER::ATTACK_SYSTEM:
 		case SHIP_ORDER::BLOCKADE_SYSTEM:
@@ -522,9 +522,9 @@ static bool ShouldUnsetOrder(SHIP_ORDER::Typ order) {
 		case SHIP_ORDER::SENTRY_SHIP_ORDER:
 		case SHIP_ORDER::REPAIR:
 		case SHIP_ORDER::IMPROVE_SHIELDS:
-			return true;
+			return false;
 	}
-	return false;
+	return true;
 }
 
 void CShip::SetTargetKO(const CPoint& TargetKO, const bool simple_setter)
@@ -536,7 +536,7 @@ void CShip::SetTargetKO(const CPoint& TargetKO, const bool simple_setter)
 
 	if(simple_setter)
 		return;
-	if(TargetKO != CPoint(-1, -1) && ShouldUnsetOrder(m_iCurrentOrder)) {
+	if(TargetKO != CPoint(-1, -1) && !TargetCompatible(m_iCurrentOrder)) {
 		SetTerraform(-1);
 		UnsetCurrentOrder();
 	}
@@ -547,7 +547,7 @@ void CShip::SetCurrentOrderAccordingToType() {
 	SetCombatTacticAccordingToType();
 }
 
-void CShip::SetCurrentOrder(SHIP_ORDER::Typ nCurrentOrder) {
+bool CShip::SetCurrentOrder(SHIP_ORDER::Typ nCurrentOrder) {
 	assert(nCurrentOrder != SHIP_ORDER::TERRAFORM
 		&& nCurrentOrder != SHIP_ORDER::ATTACK
 		&& nCurrentOrder != SHIP_ORDER::AVOID
@@ -555,6 +555,12 @@ void CShip::SetCurrentOrder(SHIP_ORDER::Typ nCurrentOrder) {
 	if(m_iCurrentOrder == SHIP_ORDER::TERRAFORM)
 		SetTerraform(-1);
 	m_iCurrentOrder = nCurrentOrder;
+	if(HasTarget() && !TargetCompatible(nCurrentOrder))
+	{
+		SetTargetKO(CPoint(-1, -1));
+		return true;
+	}
+	return false;
 }
 
 void CShip::SetCombatTacticAccordingToType() {
diff --git a/Source/Gamedata/Ships/Ship.h b/Source/Gamedata/Ships/Ship.h
index 5a2a1d6..2b3b511 100644
--- a/Source/Gamedata/Ships/Ship.h
+++ b/Source/Gamedata/Ships/Ship.h
@@ -138,7 +138,8 @@ public:
 	void SetLoadedResources(USHORT add, BYTE res) {m_iLoadedResources[res] += add;}
 	void SetColonizePoints(BYTE ColonizePoints) {m_iColonizePoints = ColonizePoints;}
 	void SetStationBuildPoints(BYTE StationBuildPoints) {m_iStationBuildPoints = StationBuildPoints;}
-	void SetCurrentOrder(SHIP_ORDER::Typ nCurrentOrder);
+	//@return was a target unset because of this
+	bool SetCurrentOrder(SHIP_ORDER::Typ nCurrentOrder);
 	void SetSpecial(int n, SHIP_SPECIAL::Typ nAbility) {m_nSpecial[n] = nAbility;}
 	void SetTerraform(short planetNumber = -1);
 	void SetShipName(const CString& ShipName) {m_strShipName = ShipName;}
diff --git a/Source/Gamedata/Ships/Ships.cpp b/Source/Gamedata/Ships/Ships.cpp
index 6ac193a..f45f943 100644
--- a/Source/Gamedata/Ships/Ships.cpp
+++ b/Source/Gamedata/Ships/Ships.cpp
@@ -289,10 +289,12 @@ void CShips::SetTerraform(short planetNumber) {
 		i->second->SetTerraform(planetNumber);
 }
 
-void CShips::SetCurrentOrder(SHIP_ORDER::Typ nCurrentOrder) {
-	m_Leader.SetCurrentOrder(nCurrentOrder);
+bool CShips::SetCurrentOrder(SHIP_ORDER::Typ nCurrentOrder) {
+	bool result = m_Leader.SetCurrentOrder(nCurrentOrder);
 	for(CShips::iterator i = begin(); i != end(); ++i)
-		i->second->SetCurrentOrder(nCurrentOrder);
+		if(i->second->SetCurrentOrder(nCurrentOrder))
+			result = true;
+	return result;
 }
 
 void CShips::SetCurrentOrderAccordingToType() {
diff --git a/Source/Gamedata/Ships/Ships.h b/Source/Gamedata/Ships/Ships.h
index 9c6365c..0675008 100644
--- a/Source/Gamedata/Ships/Ships.h
+++ b/Source/Gamedata/Ships/Ships.h
@@ -200,7 +200,8 @@ public:
 		void SetLoadedResources(USHORT add, BYTE res) { m_Leader.SetLoadedResources(add, res); }
 		void SetColonizePoints(BYTE ColonizePoints) { m_Leader.SetColonizePoints(ColonizePoints); }
 		void SetStationBuildPoints(BYTE StationBuildPoints) { m_Leader.SetStationBuildPoints(StationBuildPoints); }
-		void SetCurrentOrder(SHIP_ORDER::Typ nCurrentOrder);
+		//@return was a target unset because of this
+		bool SetCurrentOrder(SHIP_ORDER::Typ nCurrentOrder);
 		void SetSpecial(int n, SHIP_SPECIAL::Typ nAbility) { m_Leader.SetSpecial(n, nAbility); }
 		void SetTerraform(short planetNumber = -1);
 		void SetShipName(const CString& ShipName) { m_Leader.SetShipName(ShipName); }
-- 
1.7.10.msysgit.1

Benutzeravatar
Sir Pustekuchen
Administrator
Administrator
Beiträge: 4181
Registriert: Dienstag 10. Januar 2006, 16:46
Kontaktdaten:

Re: 78351 Probleme mit Mitway-Zeitreisende

Beitrag von Sir Pustekuchen » Donnerstag 31. Januar 2013, 19:53

Alle klar, da mache ich nur die kleine Änderung in der CShipAI Klasse und lasse den Rest unberührt...

edit:
fixed...

Antworten

Zurück zu „Archiv Bug-Meldungen aus BotE-Testversionen“