Seite 172 von 181 ErsteErste ... 72122162168169170171172173174175176 ... LetzteLetzte
Ergebnis 2.566 bis 2.580 von 2702

Thema: Der SDK-Fragen-Thread

  1. #2566
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.614
    Blöderweise habe ich schon wieder eine Endlosschleife die hier gemeldet wurde. Ich hoffe, dass ich diesmal nicht wieder an so einer seltsamen endlos-Fehlermeldung hängen bleibe.
    Komischerweise tritt das Problem nicht sofort auf, sondern erst nach zwei Runden - aber reproduzierbar, egal, was man als Spieler macht.

    Das ganze ist mit der aktuellen Version meines Mods gespielt. In der Version ist der reklamierte Code schon korrigiert.

    rucivfan, kannst du mir deinen Trick verraten? Wo setzt du in so einem Fall die Haltepunkte? Und wann setzt du sie? Beim Start des Debugging, oder erst, wenn das Spiel schon in der Schleife festhängt?
    That's why I am here: Mein Mod
    Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude

    Die aktuelle Story zum Mod:
    Die Vereinigten Staaten von Amerika

    Alte Stories zu alten Versionen:
    Alte Storys

  2. #2567
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.062
    Es gibt mindestens zwei schwerwiegende Syntax-Fehler. Am Zeilen-Ende einer If-Abfrage kommt kein ; hin. Hatte gerade ebenfalls die Endlosschleife, aber konnte irgend wie nicht mit visual Studio debuggen. Muss noch mal neu starten.

  3. #2568
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.062
    Nach der Beseitigung der Syntax-Fehler lief das Spiel bis Runde 434 durch. Es gab in Runde 433 keine Endlosschleife.

    edit: Ursache ist möglicherweise eine Stadteinnahme und falsch ausgelöster Code in Folge der Syntaxfehler.

    edit: Bei meinen zweiten Versuch läuft Runde 433 nicht durch.

    edit: Ursache sind Einheiten auf den Plot (90, 39) [4 der gotischen Hauptstadt] im Rundenwechsel. SpielerID 17 == Gote
    Geändert von rucivfan (22. November 2017 um 02:17 Uhr)

  4. #2569
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.062
    Ursache liegt eindeutig an der Spieloption GAMEOPTION_STACK_LIMIT. Der Code ist nicht dafür gemacht, dass Stackgrößen begrenzt sind. Die Änderungen im Anhang sind weder komplett noch ein Fix. Die Runde läuft aber weiter.
    Angehängte Dateien Angehängte Dateien

  5. #2570
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.614
    Danke für deine Hilfe. Sieht so aus, als hätte ich da ein ziemliches Monster erschaffen mit der Option, wenn ich mir anschaue, wo es überall hakt. Ich überlege fast, die Option wieder rauszunehmen.
    That's why I am here: Mein Mod
    Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude

    Die aktuelle Story zum Mod:
    Die Vereinigten Staaten von Amerika

    Alte Stories zu alten Versionen:
    Alte Storys

  6. #2571
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.614
    Leider tritt drei Runden später schon wieder eine Endlosschleife auf.
    https://www.civforum.de/showthread.p...=1#post7824946
    Wenn ich richtig verstanden habe, muss ich vor allem alle AI-Codes, die "GeneratePath" enthalten, anpassen, um das Problem zu vertuschen?
    That's why I am here: Mein Mod
    Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude

    Die aktuelle Story zum Mod:
    Die Vereinigten Staaten von Amerika

    Alte Stories zu alten Versionen:
    Alte Storys

  7. #2572
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.062
    Zitat Zitat von Kathy Beitrag anzeigen
    Leider tritt drei Runden später schon wieder eine Endlosschleife auf.
    https://www.civforum.de/showthread.p...=1#post7824946
    Wenn ich richtig verstanden habe, muss ich vor allem alle AI-Codes, die "GeneratePath" enthalten, anpassen, um das Problem zu vertuschen?
    Nein, nicht alle. Es müssen alle GeneratePath Aufrufe angepasst werden, bei denen Einheiten später nicht angreifen. Also bei reinen Bewegungsbefehlen muss die KI auch das reine Bewegen auf den Zielplot testen. GeneratePath ist auch für mögliche Angriffe true.

  8. #2573
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.062
    Problem ist wieder beim Goten. Die Option sollte wirklich einfach entfernt werden. Ohne einen kompletten Rework des KI-Codes und des Spielmechanikscodes sehe ich für die Spieloption schwarz.

  9. #2574
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.614
    Ich habe ein Problem mit einem Code in meinem Stadtstaaten-Feature. Und war soll unter bestimmten Umständen ein Stadtstaat (eCityState) seinen bisherigen Herrscher verlassen und sich einem anderen Herrscher anschließen, in der Regel, weil dieser nach Erledigung einer Mission bessere Beziehungen zum Stadtstaat hat. Allerdings haben sich einige User gewünscht, dass man den Stadtstaat nicht einfach so aufs Auge gedrückt bekommt, sondern gefragt wird, ob man ihn als Vasall haben will. Das hatte ich so gelöst:

    Code:
    //Kathy Beginn Citystate-Quests
    void CvTeam::doCityStateDesert(TeamTypes eCityState) const
    {
    	bool bDesert = false;
    
    	if ( getID() != GET_TEAM(eCityState).getID() )//Nicht, wenn CityState Teammitglied vom TestTeam ist
    	{
    		if ( !GET_TEAM(eCityState).isVassal(getID()) )//Wenn bereits Vasall passiert auch nichts
    		{
    			
    			for (int iPlayer = 0; iPlayer < MAX_PLAYERS; iPlayer++)
    			{
    				CvPlayer& kLoopPlayer = GET_PLAYER((PlayerTypes)iPlayer);
    				if (kLoopPlayer.getTeam() == eCityState && kLoopPlayer.isAlive())//Überprüfen aller Spieler im Team, ob ein Stadtstaat dabei ist
    				{
    					CivilizationTypes eCityStateCiv = (CivilizationTypes)kLoopPlayer.getCivilizationType();
    					CvWString szBuffer;
    
    					if ( GC.getCivilizationInfo(eCityStateCiv).isCitystate() )
    					{
    						bool bNoMaster = true;//Wenn kein alter Master vorhanden: Desertiert immer
    						int iMasterID = -1;
    						for (int iI = 0; iI < MAX_CIV_TEAMS; iI++)//Suchen alter Master
    						{
    							if (GET_TEAM(eCityState).isVassal((TeamTypes)iI) )
    							{
    								bNoMaster = false;
    								iMasterID = iI;
    								if ((GET_TEAM(eCityState).AI_getAttitude((TeamTypes)iI) < (GET_TEAM(eCityState).AI_getAttitude(getID()))))
    								{
    									bDesert = true;
    								}
    								break;
    							}
    						}
    						if ( bDesert || bNoMaster)
    						{
    							if (iMasterID != -1)//Ablösen des alten Hegemon
    							{
    								GET_TEAM((TeamTypes)iMasterID).freeVassal(eCityState);
    								GET_TEAM((TeamTypes)eCityState).setVassal((TeamTypes)iMasterID,false,false);
    
    								for (int kPlayer = 0; kPlayer < MAX_PLAYERS; kPlayer++)
    								{
    									if (GET_PLAYER((PlayerTypes)kPlayer).getTeam() == (TeamTypes)iMasterID)
    									{
    										CvWString szBuffer;
    										PlayerTypes eOldMasterPlayer;
    										eOldMasterPlayer = ((PlayerTypes)kPlayer);
    										szBuffer = gDLL->getText("TXT_CITYSTATE_WECHSEL_LOST_TEXT", GET_TEAM((TeamTypes)eCityState).getName().GetCString() , GET_TEAM((TeamTypes)this->getID()).getName().GetCString() );
    										gDLL->getInterfaceIFace()->addMessage(eOldMasterPlayer, true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_UNITCAPTURE", MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), -1, -1);
    									}
    								}
    
    							}
    //							assignVassal(eCityState,false);	//original Code
    							for (int jPlayer = 0; jPlayer < MAX_PLAYERS; jPlayer++)
    							{
    								if (GET_PLAYER((PlayerTypes)jPlayer).getTeam() == getID() )
    								{
    									CvWString szBuffer;
    									PlayerTypes eMasterPlayer;
    									eMasterPlayer = ((PlayerTypes)jPlayer);
    									CvPlayer& kMasterPlayer = GET_PLAYER((PlayerTypes)jPlayer);
    									
    									//Kathy begin: Ask Humans first
    									if ( kMasterPlayer.isHuman() )
    									{
    										// Ramkhamhaeng Beginn
    										CLinkList<TradeData> ourList;
    										CLinkList<TradeData> theirList; // wird nicht gebraucht
    										TradeData item;
    										setTradeItem(&item, TRADE_VASSAL);
    										
    										if (kMasterPlayer.canTradeItem(kLoopPlayer.getID(), item, false))
    										{
    											ourList.insertAtEnd(item);
    
    											CvDiploParameters* pDiplo;
    											pDiplo = new CvDiploParameters(kLoopPlayer.getID());
    											FAssertMsg(pDiplo != NULL, "pDiplo must be valid");
    											pDiplo->setDiploComment((DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_OFFER_VASSAL"));
    											pDiplo->setAIContact(true);
    											pDiplo->setTheirOfferList(ourList);
    											pDiplo->setOurOfferList(theirList);
    
    											gDLL->beginDiplomacy(pDiplo,eMasterPlayer);
    											//abContacted[GET_PLAYER((PlayerTypes)iI).getTeam()] = true; //Redundant, aber steht häufig mit im Code.
    										}
    										// Ramkhamhaeng End
    									}
    									else
    									{
    										assignVassal(eCityState,false);
    									}
    									//Kathy end: Ask Humans first
    									szBuffer = gDLL->getText("TXT_CITYSTATE_WECHSEL_TEXT", GET_TEAM((TeamTypes)eCityState).getName().GetCString() , GET_TEAM((TeamTypes)this->getID()).getName().GetCString() );
    									gDLL->getInterfaceIFace()->addMessage(eMasterPlayer, true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_UNITCAPTURE", MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), -1, -1);
    									break;
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    }
    //Kathy End Citystate-Quests
    In meinen Tests hatte das auch funktioniert - oder es sah so aus, als funktioniere es - aber in der Spielpraxis leider nicht. Zuerst dachte ich, es liegt an
    if (kMasterPlayer.canTradeItem(kLoopPlayer.getID(), item, true))
    Das erschien mir logisch, denn bei "TestDenial" ergab der Code immer false. Aber auch, nachdem ich "TestDenial" abgestellt habe (siehe oben) schickt der Stadtstaat nach Erledigung der Mission kein Angebot, sich unter meinen Schutz zu begeben. Irgendwie wird der Diplomatie-Teil nicht getriggert. Erkennt jemand hier einen groben Fehler? Für mich war es das erste mal, dass ich etwas mit Diplo gemacht habe, Ramkhamhaeng hatte mir damals große Teile des Codes geliefert.

    Edit: Wenn ich mir das so anschaue, kann das eigentlich nie funktioniert haben - kMasterplayer ist menschlich, folglich ergibt (kMasterPlayer.canTradeItem(kLoopPlayer.getID(), item, false)) für TRADE_VASSAL false.

    Edit 2: Und genau das war es. Jetzt hat es auch im Spiel funktioniert.
    Geändert von Kathy (20. Januar 2018 um 23:38 Uhr)
    That's why I am here: Mein Mod
    Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude

    Die aktuelle Story zum Mod:
    Die Vereinigten Staaten von Amerika

    Alte Stories zu alten Versionen:
    Alte Storys

  10. #2575
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.904
    Ich habe beim Kompilieren ein Problem beim Einbinden von Windows-Headern/Libs.

    Folgenden Code kann ich, als eigenständiges Programm, mit dem Visual C++ 2010-Compiler kompilieren, wobei ich gegen Ole32.lib und OleAut32.lib linken muss damit er die benutzten Funktionen findet.
    Code:
    #include <windows.h>
    #include <shldisp.h>
    
    #include <cstdlib>
    #include <string.h>
    #include <iostream>
    
    //using namespace std;
    
    
    /* Return folder of this DLL/EXE.
     *
     * Free returned char after usage! */
    const char *get_dll_folder(){
    
    #define MAX_PARAM 1000
        char *path = (char *)calloc( (MAX_PARAM + 1), sizeof(char));
        path[0] = '\0';
        HMODULE hm = NULL;
    
        if (!GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
                    (LPCSTR) &get_dll_folder,
                    &hm))
        {
            int ret = GetLastError();
            fprintf(stderr, "GetModuleHandle returned %d\n", ret);
        }
        GetModuleFileNameA(hm, path, MAX_PARAM /*sizeof(path)*/);
    
        // path variable should now contain the full filepath to localFunc
        // Strip dll filename.
        char *last_slash = strrchr(path, '\\');
        *last_slash = '\0';
        fprintf(stdout, "%s\n", path);
    
        return path;
    }
    
    int StringToWString(std::wstring &ws, const std::string &s)
    {
        std::wstring wsTmp(s.begin(), s.end());
        ws = wsTmp;
        return 0;
    }
    
    
    int main()
    {
        std::cout << "Hello world!" << std::endl;
        const char *dll_folder = get_dll_folder();
    
        std::string absolute_path = std::string(dll_folder);
        absolute_path.append("\\");
        absolute_path.append("test.zip");
        std::wstring wabsolute_path;
        StringToWString(wabsolute_path, absolute_path);
    
        free((void *)dll_folder);
    
        return 0;
    }
    Wenn ich den Code in eine DLL-Datei packe. Z.B. in CvGameCoreDLL.cpp zeigt Visual Studio 2010 auch erst einmal keine Fehler wegen unbekannter Typen/Definitionen an, aber beim Komplieren kann er sie nicht finden.
    Code:
    CvGameCoreDLL.cpp(169): error C2065: 'GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS' : undeclared identifier
    1>CvGameCoreDLL.cpp(169): error C2065: 'GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT' : undeclared identifier
    1>CvGameCoreDLL.cpp(169): error C3861: 'GetModuleHandleExA': identifier not found, even with argument-dependent lookup
    Hat jmd. eine Idee was die Ursache sein könnte?

  11. #2576
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.062

  12. #2577
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.904
    Danke, das war es.

    @All: An der Stelle ist es wichtig festzustellen, dass windows.h schon in einer Headerdatei eingebunden ist! Daher muss
    '#define _WIN32_WINNT' in CvGameCoreDLL.h definiert werden und nicht erst dort wo der neue Code eingefügt wird.

  13. #2578
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.904
    Bist du auch schon mal über diesen Fehler gestolpert?

    Code:
    I:\Microsoft Visual C++ Toolkit 2003\include\memory(498): fatal error C1067: compiler limit : debug information module size exceeded
    1>NMAKE : fatal error U1077: ""I:\Microsoft Visual C++ Toolkit 2003\bin\cl.exe"": R³ckgabe-Code "0x2"
    Release-DLL kann ich kompilierten. Debug-DLL jetzt nicht mehr. Das könnte daran liegen, dass ich jetzt mehr Header eingebunden habe, was ich irgendwie ausschließen müsste, wenn die Debug-Metadaten angelegt werden
    Oder kann man einfach das Limit hochschrauben?

  14. #2579
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.062
    Das ist ein "guter" Bekannter. In BASE hatten wir zu viele Konstanten in CvGlobal angelegt. Die Problem-Lösung war dann, BASE-eigene Konstanten auszulagern in eine eigene Klasse. Soweit ich mich angelesen hatte, kann man das Limit in VS 2010 bzw beim zugehörigen Compiler nicht erhöhen. Für VS 2012 und neuer gäbe es einen Befehl dafür.
    Geändert von rucivfan (28. Juni 2018 um 00:32 Uhr)

  15. #2580
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.904
    Ja, ich habe das auch mit zu langen Interface-Dateien in Verbindung gebracht. Die Meldung taucht auch beim Kompilieren von CyCityInterface1.cpp auf. Das hat mich etwas verwundert, weil ich diese Datei (oder irgendwas in Verbindung zu CvCity) geändert habe.

    Meinst du es bringt etwas CyCityInterface1 auf zwei Dateien zu splitten?

Seite 172 von 181 ErsteErste ... 72122162168169170171172173174175176 ... LetzteLetzte

Berechtigungen

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