Seite 55 von 180 ErsteErste ... 54551525354555657585965105155 ... LetzteLetzte
Ergebnis 811 bis 825 von 2699

Thema: Der SDK-Fragen-Thread

  1. #811
    Registrierter Benutzer Avatar von Monaldinio
    Registriert seit
    10.11.09
    Ort
    HRO
    Beiträge
    7.650
    Ich stehe vor einen Rätsel...

    In meinen Mod gibt es eine Game Option (wenn man ein "eigenes Spiel" startet) die verhindert das die sogenannten Expasion Fraktionen bei Erfindung einer bestimmten Tech spawnen...
    Dazu wurde der CivilizationInfo.xml und der CivilizationSchema.xml ein Tag hinzugefügt der das ganze regelt, <bExpansion>1</bExpansion>...und <SpawningTech>TECH_BlaBla</SpawningTech>

    Nun habe ich mir die SDK Dateien angeguckt und alle nach "Expansion" durchsucht...
    In 5 Dateien habe ich verweise gefunden die entweder den neuen Tag definieren...oder die Game Option "No expansion Faction"...

    Aber ich finde keine Verbindung wie die beiden Sachen miteinander interagieren...
    Es müsste doch, einen Codeteil geben der, wörtlich übersetzt, besagt...

    Wenn Fraktion den Tag <bExpansion>1</bExpansion> hat und die Game Option "No expansion Faction" aktiviert ist, soll die Fraktion bei erforschung einer bestimmten Tech nicht spawnen...

    Finde ich aber nicht!

    Hintergrund, ich habe vor einiger Zeit 7 Weitere Fraktionen hinzugefügt, die aber nicht zum dem Alpha Centauri "universum" gehören...
    Deswegen möchte ich eine Gameoption hinzufügen die genau das gleiche macht wie die oben beschriebene Optionen, damit man diese 7 Fraktionen auch bei belieben aus dem Spiel durch spawnen ausgrenzen kann...

    Ich habe die 5 Dateien mal angehängt, vieleicht sieht jemand etwas was ich nicht verstanden habe...
    Angehängte Dateien Angehängte Dateien
    Geändert von Monaldinio (09. November 2013 um 12:42 Uhr)
    Conflict on Chiron - Sid Meier's Alpha Centauri vs. Call to Power!

    Neu Version Conflict on Chiron v3.4 BETA - 16.01.16

    Patch1 - 07.04.16

    Die deutschen Sounds und Wunderfilme sind bereits in der MainFile integriert!
    Ihr könnt sofort loslegen.

    Über Feedback würde ich mich freuen...

  2. #812
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Das kommt mir bekannt vor.

  3. #813
    Registrierter Benutzer Avatar von Monaldinio
    Registriert seit
    10.11.09
    Ort
    HRO
    Beiträge
    7.650
    Nochmal alles durchgeguckt...und dass hier aus der CvTeam.cpp nochmal genauer unter die Lupe genommen...

    Code:
    if (!GC.getGameINLINE().isOption(GAMEOPTION_NO_EXPANSION_FACTIONS))
    					{
    						for (int iI = 0; iI < GC.getNumCivilizationInfos(); iI++)
    						{
    							if ((TechTypes)(GC.getCivilizationInfo((CivilizationTypes)iI).getSpawningTech() == eIndex))   #######ist das hier die verbindunng?????######
    							{
    								bool bValid = true;
    								PlayerTypes eNewPlayer = NO_PLAYER;
    								LeaderHeadTypes eLeader = NO_LEADER;
    								for (iJ = 0; iJ < MAX_CIV_PLAYERS; iJ++)
    								{
    									if (GET_PLAYER((PlayerTypes)iJ).isEverAlive())
    									{
    										if (GET_PLAYER((PlayerTypes)iJ).getCivilizationType() == iI)
    										{
    											bValid = false;
    											break;
    										}
    									}
    								}
    								if (bValid)
    								{
    									bValid = false;								
    									for (iJ = 0; iJ < GC.getNumLeaderHeadInfos(); ++iJ)
    									{
    										if (!GC.getCivilizationInfo((CivilizationTypes)iI).isLeaders(iJ))
    										{
    											continue;
    										}
    										for (iK = 0; iK < MAX_CIV_PLAYERS; iK++)
    										{
    											if (GET_PLAYER((PlayerTypes)iK).isEverAlive() && GET_PLAYER((PlayerTypes)iK).getPersonalityType() == iJ)
    											{
    												continue;
    											}
    										}
    										bValid = true;
    										eLeader = (LeaderHeadTypes)iJ;
    										break;
    									}
    								}
    								if (bValid)
    								{
    									for (iJ = 0; iJ < MAX_CIV_PLAYERS; ++iJ)
    									{
    										if (!GET_PLAYER((PlayerTypes)iJ).isEverAlive())
    										{
    											eNewPlayer = (PlayerTypes)iJ;
    											break;
    										}
    									}
    									if (eNewPlayer == NO_PLAYER)
    									{
    										// Try to recycle a dead player
    										for (int iJ = 0; iJ < MAX_CIV_PLAYERS; ++iJ)
    										{
    											if (!GET_PLAYER((PlayerTypes)iJ).isAlive())
    											{
    												eNewPlayer = (PlayerTypes)iJ;
    												break;
    											}
    										}
    									}
    									if (eNewPlayer == NO_PLAYER)
    									{
    										bValid = false;
    									}
    									if (GET_TEAM(GET_PLAYER(eNewPlayer).getTeam()).isAlive())
    									{
    										bValid = false;
    									}
    								}
    								if (bValid)
    								{
    									GC.getGameINLINE().addPlayer(eNewPlayer, eLeader, (CivilizationTypes)iI);
    									GC.getInitCore().setLeaderName(eNewPlayer, GC.getLeaderHeadInfo(eLeader).getTextKeyWide());
    									CvTeam& kNewTeam = GET_TEAM(GET_PLAYER(eNewPlayer).getTeam());
    									for (iJ = 0; iJ < GC.getNumTechInfos(); iJ++)
    									{
    										bValid = false;
    										if ((GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).isFreeTechs(iJ)) ||
    										(!(GET_TEAM(GET_PLAYER(eNewPlayer).getTeam()).isHuman()) && GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).isAIFreeTechs(iJ)) ||
    										(GC.getTechInfo((TechTypes)iJ).getEra() < GC.getGameINLINE().getStartEra()))
    										{
    											bValid = true;
    										}
    										if (!bValid)
    										{
    											for (iK = 0; iK < MAX_PLAYERS; iK++)
    											{
    												if (GET_PLAYER((PlayerTypes)iK).isAlive())
    												{
    													if (GET_PLAYER((PlayerTypes)iK).getTeam() == GET_PLAYER(eNewPlayer).getTeam())
    													{
    														if (GC.getCivilizationInfo(GET_PLAYER((PlayerTypes)iK).getCivilizationType()).isCivilizationFreeTechs(iJ))
    														{
    															bValid = true;
    															break;
    														}
    													}
    												}
    											}
    										}
    										if (!bValid)
    										{
    											int iCount = 0;
    											for (iK = 0; iK < MAX_CIV_TEAMS; iK++)
    											{
    												if (GET_TEAM((TeamTypes)iK).isAlive())
    												{
    													if (GET_TEAM((TeamTypes)iK).isHasTech((TechTypes)iJ))
    													{
    														iCount++;
    														if (iCount > 1)
    														{
    															bValid = true;
    															break;
    														}
    													}
    												}
    											}
    										}
    										if (bValid)
    										{
    											GET_TEAM(GET_PLAYER(eNewPlayer).getTeam()).setHasTech(((TechTypes)iJ), true, NO_PLAYER, false, false);
    											if (GC.getGameINLINE().isOption(GAMEOPTION_NO_TECH_BROKERING))
    											{
    												kNewTeam.setNoTradeTech((TechTypes)iJ, true);
    											}
    										}
    									}
    									GET_PLAYER(eNewPlayer).initFreeState();
    									GET_PLAYER(eNewPlayer).setStartingPlot(GET_PLAYER(eNewPlayer).findStartingPlot(), true);
    									GET_PLAYER(eNewPlayer).initFreeUnits();
    									GET_TEAM(GET_PLAYER(eNewPlayer).getTeam()).changeEspionagePointsEver((GET_PLAYER(eNewPlayer).isRoze() ? 7 : 4) * std::max(1, GC.getGameINLINE().getElapsedGameTurns()));
    								}
    							}						
    						}
    					}

    In der CvInfos.cpp ist folgendes definiert...
    Code:
    , m_bExpansion(false)
    , m_iSpawningTech(NO_TECH)
    Code:
    bool CvCivilizationInfo::isExpansion() const
    {
    	return m_bExpansion;

    Code:
    stream->Read(&m_bExpansion);
    stream->Read(&m_iSpawningTech);


    Code:
    	
    stream->Write(m_bExpansion);
    stream->Write(m_iSpawningTech);


    Code:
    pXML->GetChildXmlValByName(&m_bExpansion, "bExpansion");




    In der CvInfos.h das...


    Code:
    bool m_bExpansion;
    int m_iSpawningTech;
    Conflict on Chiron - Sid Meier's Alpha Centauri vs. Call to Power!

    Neu Version Conflict on Chiron v3.4 BETA - 16.01.16

    Patch1 - 07.04.16

    Die deutschen Sounds und Wunderfilme sind bereits in der MainFile integriert!
    Ihr könnt sofort loslegen.

    Über Feedback würde ich mich freuen...

  4. #814
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Die CvInfo ist vollständig. Dort brauchst du nicht mehr suchen. Viel wichtiger ist, wo wird isExpansion() abgefragt?

  5. #815
    Registrierter Benutzer Avatar von Monaldinio
    Registriert seit
    10.11.09
    Ort
    HRO
    Beiträge
    7.650
    Eben, das suche ich ja auch wie ein irrer wo das abgefragt wird...

    Das habe ich noch gefunden, aber ist mMn nicht das was ich suche...



    Code:
    if (GC.getBuildingInfo(eBuilding).isMorganCorporation() && !isMorgan())
    	{
    		return false;
    	}
    	if (GC.getBuildingInfo(eBuilding).isDawnOfPlanet())
    	{
    		if (GC.getGameINLINE().isOption(GAMEOPTION_NO_EXPANSION_FACTIONS))
    		{
    			return false;
    		}
    		if (!isVotingMember((VoteSourceTypes)GC.getInfoTypeForString(GC.getDefineSTRING("DIPLOVOTE_CONCORDAT"))))
    		{
    			return false;
    		}
    		for (iI = 0; iI < MAX_CIV_PLAYERS; iI++)
    		{
    			if (GET_PLAYER((PlayerTypes)iI).isEverAlive())
    			{
    				if (GET_PLAYER((PlayerTypes)iI).isChaDawn())
    				{
    					return false;
    				}
    			}
    		}
    	}
    Geändert von Monaldinio (09. November 2013 um 13:53 Uhr)
    Conflict on Chiron - Sid Meier's Alpha Centauri vs. Call to Power!

    Neu Version Conflict on Chiron v3.4 BETA - 16.01.16

    Patch1 - 07.04.16

    Die deutschen Sounds und Wunderfilme sind bereits in der MainFile integriert!
    Ihr könnt sofort loslegen.

    Über Feedback würde ich mich freuen...

  6. #816
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Habe mal nachgeschaut. Die Methode wurde schon vor dem Mergen nicht verwendet!

    edit: Kann es sein, dass diese in Python genutzt wird?

  7. #817
    Registrierter Benutzer Avatar von Monaldinio
    Registriert seit
    10.11.09
    Ort
    HRO
    Beiträge
    7.650
    Habe ich mich auch schon gefragt, habe im Eventmanager, GameUtils, CvUtil und Custom Faction nachgeshaut, nichts gefunden...
    Conflict on Chiron - Sid Meier's Alpha Centauri vs. Call to Power!

    Neu Version Conflict on Chiron v3.4 BETA - 16.01.16

    Patch1 - 07.04.16

    Die deutschen Sounds und Wunderfilme sind bereits in der MainFile integriert!
    Ihr könnt sofort loslegen.

    Über Feedback würde ich mich freuen...

  8. #818
    Registrierter Benutzer Avatar von Monaldinio
    Registriert seit
    10.11.09
    Ort
    HRO
    Beiträge
    7.650
    Ich glaube ich habe des Rätsels Lösung gefunden.

    Habe in der CivilizationInfo mal den Tag bei einer "Expansion Fraktion" rausgenommen... <bExpansion>1</bExpansion>...
    Demnach müsste sie jetzt eigentlich eine "ganz normale" Fraktion sein, die bei Spielbeginn ausgewählt werden könnte...
    Dem ist aber nicht so...
    ich denke ich habe es nun rausgefunden...es gibt einen weiterenTag in der CivilizationInfo <iMinEra>1</iMinEra>...habe ihn auf 0 gesetzt und die eigentliche Expansion Fraktion war nun von beginn an auswählbar...
    Ich sehe gerade das es gar kein bool ist sondern integer... Ist mir ja noch nie aufgefallen...
    Was sohl passiert wenn ich 2 einsetze?!
    Geändert von Monaldinio (09. November 2013 um 14:56 Uhr)
    Conflict on Chiron - Sid Meier's Alpha Centauri vs. Call to Power!

    Neu Version Conflict on Chiron v3.4 BETA - 16.01.16

    Patch1 - 07.04.16

    Die deutschen Sounds und Wunderfilme sind bereits in der MainFile integriert!
    Ihr könnt sofort loslegen.

    Über Feedback würde ich mich freuen...

  9. #819
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.028
    MinEraSize ist bei den meisten Funktionen die Größe eines Gebietes, die nötig ist, um etwas zu bauen (Gebäude, Schiffe). Wie die jetzt aber auf deine Funktion bei den Civilisationen wirkt...

    Im Standart-BtS gibt es den Tag dort halt nicht.

    Ich habe ebenfalls ein Problemchen. Ich habe diese Funktion für meine Artillerieduelle geschrieben:
    Code:
    void CvUnit::resolveArtilleryCombat(CvUnit* pDefender, CvPlot* pPlot, CvBattleDefinition& kBattle)
    {
    	CombatDetails cdAttackerDetails;
    	CombatDetails cdDefenderDetails;
    
    	int iAttackerStrength = currCombatStr(NULL, NULL, &cdAttackerDetails);
    	int iAttackerFirepower = currFirepower(NULL, NULL);
    	int iDefenderStrength;
    	int iAttackerDamage;
    	int iDefenderDamage;
    	int iDefenderOdds;
    
    	getDefenderCombatValues(*pDefender, pPlot, iAttackerStrength, iAttackerFirepower, iDefenderOdds, iDefenderStrength, iAttackerDamage, iDefenderDamage, &cdDefenderDetails);
    	int iAttackerKillOdds = iDefenderOdds * (100 - withdrawalProbability()) / 100;
    
    	if (isHuman() || pDefender->isHuman())
    	{
    		//Added ST
    		CyArgsList pyArgsCD;
    		pyArgsCD.add(gDLL->getPythonIFace()->makePythonObject(&cdAttackerDetails));
    		pyArgsCD.add(gDLL->getPythonIFace()->makePythonObject(&cdDefenderDetails));
    		pyArgsCD.add(getCombatOdds(this, pDefender));
    		CvEventReporter::getInstance().genericEvent("combatLogCalc", pyArgsCD.makeFunctionArgs());
    	}
    
    	while (true)
    	{
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                      02/21/10                                jdog5000      */
    /*                                                                                              */
    /* Lead From Behind                                                                             */
    /************************************************************************************************/
    		// From Lead From Behind by UncutDragon
    		// original
    		//if (GC.getGameINLINE().getSorenRandNum(GC.getDefineINT("COMBAT_DIE_SIDES"), "Combat") < iDefenderOdds)
    		// modified
    		if (GC.getGameINLINE().getSorenRandNum(GC.getCOMBAT_DIE_SIDES(), "Combat") < iDefenderOdds)
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                       END                                                  */
    /************************************************************************************************/
    		{
    			if (getCombatFirstStrikes() == 0)
    			{
    				if (getDamage() + iAttackerDamage >= maxHitPoints() && GC.getGameINLINE().getSorenRandNum(100, "Withdrawal") < withdrawalProbability())
    				{
    //					flankingStrikeCombat(pPlot, iAttackerStrength, iAttackerFirepower, iAttackerKillOdds, iDefenderDamage, pDefender);
    
    					changeExperience(GC.getDefineINT("EXPERIENCE_FROM_WITHDRAWL"), pDefender->maxXPValue(), true, pPlot->getOwnerINLINE() == getOwnerINLINE(), !pDefender->isBarbarian());
    					break;
    				}
    
    				changeDamage(iAttackerDamage, pDefender->getOwnerINLINE());
    
    				if (pDefender->getCombatFirstStrikes() > 0 && pDefender->isRanged())
    				{
    					kBattle.addFirstStrikes(BATTLE_UNIT_DEFENDER, 1);
    					kBattle.addDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_RANGED, iAttackerDamage);
    				}
    
    				cdAttackerDetails.iCurrHitPoints = currHitPoints();
    
    				if (isHuman() || pDefender->isHuman())
    				{
    					CyArgsList pyArgs;
    					pyArgs.add(gDLL->getPythonIFace()->makePythonObject(&cdAttackerDetails));
    					pyArgs.add(gDLL->getPythonIFace()->makePythonObject(&cdDefenderDetails));
    					pyArgs.add(1);
    					pyArgs.add(iAttackerDamage);
    					CvEventReporter::getInstance().genericEvent("combatLogHit", pyArgs.makeFunctionArgs());
    				}
    			}
    		}
    		else
    		{
    			if (pDefender->getCombatFirstStrikes() == 0)
    			{
    				if (std::min(GC.getMAX_HIT_POINTS(), pDefender->getDamage() + iDefenderDamage) > combatLimit())
    				{
    					changeExperience(GC.getDefineINT("EXPERIENCE_FROM_WITHDRAWL"), pDefender->maxXPValue(), true, pPlot->getOwnerINLINE() == getOwnerINLINE(), !pDefender->isBarbarian());
    					pDefender->setDamage(combatLimit(), getOwnerINLINE());
    					break;
    				}
    
    				pDefender->changeDamage(iDefenderDamage, getOwnerINLINE());
    
    				if (getCombatFirstStrikes() > 0 && isRanged())
    				{
    					kBattle.addFirstStrikes(BATTLE_UNIT_ATTACKER, 1);
    					kBattle.addDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_RANGED, iDefenderDamage);
    				}
    
    				cdDefenderDetails.iCurrHitPoints=pDefender->currHitPoints();
    
    				if (isHuman() || pDefender->isHuman())
    				{
    					CyArgsList pyArgs;
    					pyArgs.add(gDLL->getPythonIFace()->makePythonObject(&cdAttackerDetails));
    					pyArgs.add(gDLL->getPythonIFace()->makePythonObject(&cdDefenderDetails));
    					pyArgs.add(0);
    					pyArgs.add(iDefenderDamage);
    					CvEventReporter::getInstance().genericEvent("combatLogHit", pyArgs.makeFunctionArgs());
    				}
    			}
    		}
    
    		if (getCombatFirstStrikes() > 0)
    		{
    			changeCombatFirstStrikes(-1);
    		}
    
    		if (pDefender->getCombatFirstStrikes() > 0)
    		{
    			pDefender->changeCombatFirstStrikes(-1);
    		}
    
    		if (isDead() || pDefender->isDead())
    		{
    			if (isDead())
    			{
    				int iExperience = defenseXPValue();
    				iExperience = ((iExperience * iAttackerStrength) / iDefenderStrength);
    				iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
    				pDefender->changeExperience(iExperience, maxXPValue(), true, pPlot->getOwnerINLINE() == pDefender->getOwnerINLINE(), !isBarbarian());
    			}
    			else
    			{
    				int iExperience = pDefender->attackXPValue();
    				iExperience = ((iExperience * iDefenderStrength) / iAttackerStrength);
    				iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
    				changeExperience(iExperience, pDefender->maxXPValue(), true, pPlot->getOwnerINLINE() == getOwnerINLINE(), !pDefender->isBarbarian());
    			}
    
    			break;
    		}
    	}
    }
    //Kathy Artillerieduell End
    Das soll bewirken, dass sich eine angreifende und eine verteidigende Artillerie gegenseitig bekämpfen, bis eine tot ist. Leider scheint jedoch für den Angreifer (wie im normalen Kampf) das CombatLimit zu gelten. Ich kann nur nicht erkennen, wo, und weiß daher nicht, wie ich es ausschalten soll.

    Edit: Wie so oft finde ich die Lösung gleich nach dem Posten
    Geändert von Kathy (09. November 2013 um 17:00 Uhr)

  10. #820
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    iMinEraSize != iMinEra

  11. #821
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.028
    Du hast Recht, schon, weil es iMinAreaSize ist.

    Schätze mal, iMinEra ist dann die das Startzeitalter, das mindestens herrschen muss, damit die Fraktion am Anfanz zur Verfügung steht.

  12. #822
    Registrierter Benutzer Avatar von Monaldinio
    Registriert seit
    10.11.09
    Ort
    HRO
    Beiträge
    7.650
    GENAU!

    Auch danach habe ich die DLL Dateien durchscht, aber nichts gefunden...ich bin am verzweifeln.
    Mein Vorhaben soeine Option für meine 7 extra Fraktionen zu schaffen rückt so allmälich in weiter ferne, wenn ich nicht verstehe wie die original Option funktioniert...
    Conflict on Chiron - Sid Meier's Alpha Centauri vs. Call to Power!

    Neu Version Conflict on Chiron v3.4 BETA - 16.01.16

    Patch1 - 07.04.16

    Die deutschen Sounds und Wunderfilme sind bereits in der MainFile integriert!
    Ihr könnt sofort loslegen.

    Über Feedback würde ich mich freuen...

  13. #823
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.028
    Ich habe ein Problem mit meinem Artillerie-Code, und zwar immer dann, wenn zurückgeschossen wird. Bei einem RangedStrike wir "hasMadeAttack" auf true gesetzt. Das führt dazu, dass kein weiterer Artillerieangriff ausgeführt werden kann - was ja seine Richtigkeit hat. Wenn ich im Test über einen Fernkampf eine Einheit angreife, die nicht zurückschießen kann, passiert auch genau das. Aber immer, wenn ich eine Einheit angreife, die zurückschießt, kann meine angreifende Einheit danach noch einmal schießen (wenn sie überlebt). Das ist der Code:
    Code:
    	if (GC.getDefineINT("RANGED_ATTACKS_USE_MOVES") == 0)
    	{
    		setMadeAttack(true);
    	}
    	changeMoves(GC.getMOVE_DENOMINATOR());
    
    	iDamage = rangeCombatDamage(pDefender);
    
    	iUnitDamage = std::max(pDefender->getDamage(), std::min((pDefender->getDamage() + iDamage), airCombatLimit()));
    
    	szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_AIR", pDefender->getNameKey(), getNameKey(), -(((iUnitDamage - pDefender->getDamage()) * 100) / pDefender->maxHitPoints()));
    	//red icon over attacking unit
    	gDLL->getInterfaceIFace()->addMessage(pDefender->getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), this->getX_INLINE(), this->getY_INLINE(), true, true);
    	//white icon over defending unit
    	gDLL->getInterfaceIFace()->addMessage(pDefender->getOwnerINLINE(), false, 0, L"", "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, pDefender->getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), pDefender->getX_INLINE(), pDefender->getY_INLINE(), true, true);
    
    	szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ATTACK_BY_AIR", getNameKey(), pDefender->getNameKey(), -(((iUnitDamage - pDefender->getDamage()) * 100) / pDefender->maxHitPoints()));
    	gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pDefender->getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX_INLINE(), pPlot->getY_INLINE());
    
    	collateralCombat(pPlot, pDefender);
    
    	//set damage but don't update entity damage visibility
    	pDefender->setDamage(iUnitDamage, getOwnerINLINE(), false);
    
    	if (pPlot->isActiveVisible(false))
    	{
    		// Range strike entity mission
    		CvMissionDefinition kDefiniton;
    		kDefiniton.setMissionTime(GC.getMissionInfo(MISSION_RANGE_ATTACK).getTime() * gDLL->getSecsPerTurn());
    		kDefiniton.setMissionType(MISSION_RANGE_ATTACK);
    		kDefiniton.setPlot(pDefender->plot());
    		kDefiniton.setUnit(BATTLE_UNIT_ATTACKER, this);
    		kDefiniton.setUnit(BATTLE_UNIT_DEFENDER, pDefender);
    		gDLL->getEntityIFace()->AddMission(&kDefiniton);
    
    		//delay death
    /************************************************************************************************/
    /* UNOFFICIAL_PATCH                       05/10/10                             jdog5000         */
    /*                                                                                              */
    /* Bugfix                                                                                       */
    /************************************************************************************************/
    /* original bts code
    		pDefender->getGroup()->setMissionTimer(GC.getMissionInfo(MISSION_RANGE_ATTACK).getTime());
    */
    		// mission timer is not used like this in any other part of code, so it might cause OOS
    		// issues ... at worst I think unit dies before animation is complete, so no real
    		// harm in commenting it out.
    /************************************************************************************************/
    /* UNOFFICIAL_PATCH                        END                                                  */
    /************************************************************************************************/
    	}
    	//Kathy Artillerieduell start
    	CvPlot* pAttackerPlot;
    	int iXAttackerPlot;
    	int iYAttackerPlot;
    	pAttackerPlot = this->plot();
    	iXAttackerPlot = pAttackerPlot->getX();
    	iYAttackerPlot = pAttackerPlot->getY();
    	if (pPlot->isWater())
    	{
    
    		if (pDefender->canRangeDefenseAt(pPlot,iXAttackerPlot,iYAttackerPlot))//Tauschen von Defender- und Targetplot
    
    		{
    			int iBreitseiteDamage;
    			int iBreitseiteUnitDamage;
    			iBreitseiteDamage = pDefender->rangeCombatDamage(this);
    
    			iBreitseiteUnitDamage = std::max(this->getDamage(), std::min((this->getDamage() + iBreitseiteDamage), 100));
    
    			szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_BREITSEITE", getNameKey(), pDefender->getNameKey(), -(((iBreitseiteUnitDamage - this->getDamage()) * 100) / this->maxHitPoints()));
    			//red icon over attacking unit
    			gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), this->getX_INLINE(), this->getY_INLINE(), true, true);
    			//white icon over defending unit
    			gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, 0, L"", "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), getX_INLINE(), getY_INLINE(), true, true);
    
    			szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ATTACK_BY_BREITSEITE", pDefender->getNameKey(), getNameKey(), -(((iBreitseiteUnitDamage - getDamage()) * 100) / maxHitPoints()));
    			gDLL->getInterfaceIFace()->addMessage(pDefender->getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX_INLINE(), pPlot->getY_INLINE());
    
    			//set damage but don't update entity damage visibility
    			setDamage(iBreitseiteUnitDamage, getOwnerINLINE(), false);
    
    			if (pPlot->isActiveVisible(false))
    			{
    				// Range strike entity mission
    				CvMissionDefinition kDefiniton;
    				kDefiniton.setMissionTime(GC.getMissionInfo(MISSION_RANGE_ATTACK).getTime() * gDLL->getSecsPerTurn());
    				kDefiniton.setMissionType(MISSION_RANGE_ATTACK);
    				kDefiniton.setPlot(plot());
    				kDefiniton.setUnit(BATTLE_UNIT_ATTACKER, pDefender);
    				kDefiniton.setUnit(BATTLE_UNIT_DEFENDER, this);
    				gDLL->getEntityIFace()->AddMission(&kDefiniton);
    			
    			}
    
    			if (this->isDead())
    			{
    				szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_DIED_BY_BREITSEITE", getNameKey(), pDefender->getNameKey(), -(((iBreitseiteUnitDamage - this->getDamage()) * 100) / this->maxHitPoints()));
    				//red icon over attacking unit
    				gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), this->getX_INLINE(), this->getY_INLINE(), true, true);
    				//white icon over defending unit
    				gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, 0, L"", "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), getX_INLINE(), getY_INLINE(), true, true);
    				bool bInOwnBorders;
    				bInOwnBorders = false;
    				if ( pAttackerPlot->getOwner()== pDefender->getOwner() )
    				{
    					bInOwnBorders = true;
    				}
    				pDefender->changeExperience(1,1,true,bInOwnBorders,true);
    			}
    
    		}
    	}
    	else//Artillerieduell Land beginn
    	{
    		CvUnit* pBestDefender;
    		pBestDefender = pPlot->getBestArtillerieDefender(NO_PLAYER, getOwnerINLINE(), this, true,true,false,pAttackerPlot);
    		if (pBestDefender != NULL)
    		{
    			if (getDomainType() == DOMAIN_SEA)//Beginn Land-See-Duell
    			{
    				int iBreitseiteDamage;
    				int iBreitseiteUnitDamage;
    				iBreitseiteDamage = pBestDefender->rangeCombatDamage(this);
    
    				iBreitseiteUnitDamage = std::max(this->getDamage(), std::min((this->getDamage() + iBreitseiteDamage), 100));
    
    				szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_COASTAL_DEFENSE", getNameKey(), pBestDefender->getNameKey(), -(((iBreitseiteUnitDamage - this->getDamage()) * 100) / this->maxHitPoints()));
    				//red icon over attacking unit
    				gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), this->getX_INLINE(), this->getY_INLINE(), true, true);
    				//white icon over defending unit
    				gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, 0, L"", "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), getX_INLINE(), getY_INLINE(), true, true);
    				
    				szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_ATTACK_BY_COASTAL_DEFENSE", pBestDefender->getNameKey(), getNameKey(), -(((iBreitseiteUnitDamage - getDamage()) * 100) / maxHitPoints()));
    				gDLL->getInterfaceIFace()->addMessage(pDefender->getOwnerINLINE(), true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pPlot->getX_INLINE(), pPlot->getY_INLINE());
    
    				//set damage but don't update entity damage visibility
    				setDamage(iBreitseiteUnitDamage, getOwnerINLINE(), false);
    
    				if (pPlot->isActiveVisible(false))
    				{
    					// Range strike entity mission
    					CvMissionDefinition kDefiniton;
    					kDefiniton.setMissionTime(GC.getMissionInfo(MISSION_RANGE_ATTACK).getTime() * gDLL->getSecsPerTurn());
    					kDefiniton.setMissionType(MISSION_RANGE_ATTACK);
    					kDefiniton.setPlot(plot());
    					kDefiniton.setUnit(BATTLE_UNIT_ATTACKER, pBestDefender);
    					kDefiniton.setUnit(BATTLE_UNIT_DEFENDER, this);
    					gDLL->getEntityIFace()->AddMission(&kDefiniton);
    				
    				}
    					
    				if (this->isDead())
    				{
    					szBuffer = gDLL->getText("TXT_KEY_MISC_YOU_DIED_BY_COASTAL_DEFENSE", getNameKey(), pBestDefender->getNameKey(), -(((iBreitseiteUnitDamage - this->getDamage()) * 100) / this->maxHitPoints()));
    					//red icon over attacking unit
    					gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_COMBAT", MESSAGE_TYPE_INFO, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), this->getX_INLINE(), this->getY_INLINE(), true, true);
    					//white icon over defending unit
    					gDLL->getInterfaceIFace()->addMessage(getOwnerINLINE(), false, 0, L"", "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, getButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), getX_INLINE(), getY_INLINE(), true, true);
    					bool bInOwnBorders;
    					bInOwnBorders = false;
    					if ( pAttackerPlot->getOwner()== pBestDefender->getOwner() )
    					{
    						bInOwnBorders = true;
    					}
    					pBestDefender->changeExperience(1,1,true,bInOwnBorders,true);
    				}
    			}
    			else
    			{
    				CvBattleDefinition kBattle;
    				kBattle.setUnit(BATTLE_UNIT_ATTACKER, this);
    				kBattle.setUnit(BATTLE_UNIT_DEFENDER, pBestDefender);
    				kBattle.setDamage(BATTLE_UNIT_ATTACKER, BATTLE_TIME_BEGIN, getDamage());
    				kBattle.setDamage(BATTLE_UNIT_DEFENDER, BATTLE_TIME_BEGIN, pBestDefender->getDamage());
    
    				resolveArtilleryCombat(pBestDefender,pBestDefender->plot(),kBattle);
    
    				//Texte und Kampfanimationen fehlen
    			}//Artillerieduell Land End
    		}
    	}
    	//Kathy Artillerieduell end
    	return true;
    }
    Da das Problem immer dann auftritt, wenn zurückgeschossen wird, vermute ich, dass es an "canRangeDefenseAt" liegen könnte:
    Code:
    //Kathy Artillerieduell start
    bool CvUnit::canRangeDefenseAt(const CvPlot* pPlot, int iX, int iY) const
    {
    
    	if (getDomainType() == DOMAIN_AIR)
    	{
    		return false;
    	}
    
    	if (airRange() <= 0)
    	{
    		return false;
    	}
    
    	if (airBaseCombatStr() <= 0)
    	{
    		return false;
    	}
    
    	if (!canFight())
    	{
    		return false;
    	}
    
    	CvPlot* pTargetPlot = GC.getMapINLINE().plotINLINE(iX, iY);
    
    	if (NULL == pTargetPlot)
    	{
    		return false;
    	}
    
    	if (!pPlot->isVisible(getTeam(), false))
    	{
    		return false;
    	}
    	//Kathy Artillerie kann nicht von Schiffen schießen beginn
    	if (pPlot->isWater())
    	{
    		if (getDomainType() == DOMAIN_LAND)
    		{
    			return false;
    		}
    	}
    	//Kathy Artillerie kann nicht von Schiffen schießen end
    /************************************************************************************************/
    /* UNOFFICIAL_PATCH                       05/10/10                             jdog5000         */
    /*                                                                                              */
    /* Bugfix                                                                                       */
    /************************************************************************************************/
    	// Need to check target plot too
    	if (!pTargetPlot->isVisible(getTeam(), false))
    	{
    		return false;
    	}
    /************************************************************************************************/
    /* UNOFFICIAL_PATCH                        END                                                  */
    /************************************************************************************************/
    
    	if (plotDistance(pPlot->getX_INLINE(), pPlot->getY_INLINE(), pTargetPlot->getX_INLINE(), pTargetPlot->getY_INLINE()) > airRange())
    	{
    		return false;
    	}
    
    	CvUnit* pDefender = airStrikeTarget(pTargetPlot);
    	if (NULL == pDefender)
    	{
    		return false;
    	}
    
    	if (!pPlot->canSeePlot(pTargetPlot, getTeam(), airRange(), getFacingDirection(true)))
    	{
    		return false;
    	}
    	
    	return true;
    }
    Da wird aber der Angreifer (der für den Rückschuss der Verteidiger ist) gar nicht erwähnt.

  14. #824
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    if (GC.getDefineINT("RANGED_ATTACKS_USE_MOVES") == 0)
    {
    setMadeAttack(true);
    }

    Wenn ein Weitangirff erfolgt musst du setMadeAttack(true); setzen? Wenn GC.getDefineINT("RANGED_ATTACKS_USE_MOVES") nicht 0 ist, passiert das doch garnicht.

    edit:

    Allgemein solltest du setMadeAttack(true); erst am Ende setzen.

    Es ist möglich, keinen Angriff zu machen.

  15. #825
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.028
    Das mit dem ans Ende setzen habe ich dann auch tatsächlich gemacht. Vorher stand es da, wo es stand, hatte ich mir nicht ausgedacht. Dadurch ist das Problem jetzt auch tatsächlich gelöst, auch wenn ich es immer noch nicht verstanden habe. Denn "GC.getDefineINT("RANGED_ATTACKS_USE_MOVES")" (dessen Sinn ich auch nicht verstanden habe) ist 0, laut GlobalDefines.

    Es ist möglich, keinen Angriff zu machen.
    Verstehe ich nicht, der Code "bool CvUnit::rangeStrike(int iX, int iY)" wird aufgerufen, wenn angegriffen wird, danach gibt es keine Möglichkeit mehr, keinen Angriff zu machen, weil ja schon angegriffen ist.

Seite 55 von 180 ErsteErste ... 54551525354555657585965105155 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •