Seite 2 von 2 ErsteErste 12
Ergebnis 16 bis 19 von 19

Thema: CvGameCore.dll-Tutorial und Erste Hilfe bei DLL-Problemen

  1. #16
    Meister-Bananenpflücker Avatar von Affenbauch
    Registriert seit
    20.04.11
    Ort
    Auf dem Bananenbaum
    Beiträge
    99

    Big Grin Mini-Mod: Ureinwohner bekommen Gold jede Runde

    Hallo, ihr Lieben!

    Oh, Mann! Was hab ich mir die Zähne ausgebissen an meiner kleinen Änderung... aber im Nachhinein kann ich gut darüber schmunzeln.

    Ich wollte programmieren, dass die Ureinwohner jede Runde mit einer gewissen prozentualen Chance einen kleinen Festbetrag + einen kleinen zufälligen Betrag Gold erhalten... damit das Handeln mit den Ureinwohnern attraktiv bleibt.


    Ja, da hab ich mich also fein in den Code eingelesen, schnell die relevanten Stellen gefunden und losgecodet.

    Dann hab ich kompiliert und einen ersten Testdurchlauf gestartet und es funktionierte:

    Die Goldmenge der Ureinwohner stieg immer ein wenig an, was ich über das Tradefenster jede Runde brav überprüft habe...
    (Ja, die Pfiffigen unter euch dürfen jetzt schon glucksend lachen und mit der flachen Hand vor ihre Stirn patschen! )

    Zum Testen habe ich recht hohe Werte gewählt, aber der Anstieg (bei mehreren Ureinwohnervölkern getestet) war viel niedriger und sehr regelmäßig, ab und zu mal eine kleine Abweichung und dann wieder schön regelmäßig weiter.

    Tja, da saß ich nun vor den mitgeschriebenen Zahlen.
    Anstieg ja, aber dann seltsamerweise völlig unterschiedlich hoch bei den verschiedenen Ureinwohnervölkern...

    Ich dachte mir erstmal: "Hä? Das hast du doch nie im Leben so gecodet."

    Hatte ich auch nicht.

    Im Code war alles richtig.

    Nach diesem Testlauf las ich dann die PM von ray, die die Stellen im Code, die ich schon selbst gefunden hatte, noch einmal bestätigte.
    Ich hatte ray gefragt, wie man die Mini-Mod coden könnte, bin dann aber doch sofort selbst ins kalte Wasser gesprungen und fand mich recht schnell zurecht bei dem, was ich suchte.

    Noch einmal ausdrücklich "Heißen Dank!" für die Unterstützung und die PM, ray!
    In dieser Phase der Unsicherheit war es wichtig, eine Vergewisserung zu haben, nicht völligen Mumpitz zu coden.

    Tja, also weiter gewerkelt und gewurschtelt... mal die Zufallselemente ganz rausgenommen, mal die Werte erhöht... immer dieselben seltsamen unterschiedlichen Anstiege im Handelsfenster mit den Ureinwohnern... Ratlosigkeit.

    Irgendwann bin ich dann in einem anderen Zusammenhang auf diese wundervolle Seite gekommen: http://civ-wiki.de/wiki/Tipps_zum_Modden_%28TAC%29

    Die kannte ich schon, schon öfter besucht, aber diesmal kam endlich die Erleuchtung für mein Problem.

    Ich las:

    Computergegner übernehmen

    Durch wiederholtes Drücken von "Strg + Alt + Z" schaltet man von einer Fraktion zur nächsten. Man sieht, was die jeweilige Fraktion sieht, und übernimmt das Kommando über sie.
    und dachte mir:

    Moment mal! Was, wenn nur ein bestimmter Anteil des Goldes eines Ureinwohnervolkes, der nach und nach wächst, zum Handeln mit dem Spieler zur Verfügung steht?

    Tja, also meine erste Version des Codes von vor 3 Stunden mit neuer Einbindung der drei Steuerungsvariablen in XML (GlobalDefinesAlt.xml) genommen,
    ZACK! wieder rein in CIV4COL -TAC 2.02_inoffiziell mit meiner gemoddeten DLL und erstmal den flotten Wechsel mit Strg + Alt + Z gemacht:

    Und siehe da: Lief alles von Anfang an einwandfrei.

    - Aber wer soll denn bitte wissen, dass die Uris nicht ihr gesamtes Gold im Tradefenster angezeigt bekommen, sondern nur einen Teil davon?
    - Und wer soll wissen, dass die Summe, die die Uris zum Handeln haben, sich mit steigender Rundenzahl erhöht?
    - Wie das genau von Statten geht, weiß ich noch nicht, aber so wichtig ist das auch nicht.
    - Hauptsache, das Gesamtgold der Uris erhöht sich ab und zu und das Gold wird nach und nach für den Handel freigeschaltet.

    Ich bin jetzt erstmal feddich für heute.


    Hier schonmal die Code-Schnippsel für Interessierte:

    CvGame.cpp:

    Code:
    	// Affenbauch 29-04-2011 Ureinwohner bekommen Gold am Ende jeder Runde - START
    
    	int Zufall;
    	int Goldsumme;
    	int NativeGoldIncreasePerTurnChance = GC.getDefineINT("NATIVE_GOLD_INCREASE_PER_TURN_CHANCE");
    	int NativeGoldIncreasePerTurnFixed = GC.getDefineINT("NATIVE_GOLD_INCREASE_PER_TURN_FIXED");  // the fixed amount of gold the natives get per turn
    	int NativeGoldIncreasePerTurnRandom = GC.getDefineINT("NATIVE_GOLD_INCREASE_PER_TURN_RANDOM"); // the random amount of gold the natives get per turn
    
    	for (iI = 0; iI < MAX_PLAYERS; iI++)
    	{
    	
    		//The native players.
    		std::vector<PlayerTypes> natives;
    		
    		PlayerTypes eLoopPlayer = (PlayerTypes)iI;
    		CvPlayer& kPlayer = GET_PLAYER(eLoopPlayer);
    
    		if (kPlayer.isNative())
    		{
    			Zufall = (getSorenRandNum(100, "test chance for native gold increase"));
    			if (Zufall <= NativeGoldIncreasePerTurnChance)
    				{
    					Goldsumme = (getSorenRandNum(NativeGoldIncreasePerTurnRandom, "Random Amount of Native Gold increase") + NativeGoldIncreasePerTurnFixed);
    					kPlayer.changeGold((Goldsumme));
    				}
    		}
    				
    	}
    
    	// Affenbauch 29-04-2011 Ureinwohner bekommen Gold am Ende jeder Runde - ENDE

    GlobalDefinesAlt.xml:

    Code:
    	<!-- Affenbauch: Ureinwohner bekommen Gold am Ende jeder Runde START-->
    	<Define>
    		<DefineName>NATIVE_GOLD_INCREASE_PER_TURN_CHANCE</DefineName>
    		<iDefineIntVal>30</iDefineIntVal>
    	</Define>
    	<!-- NATIVE_GOLD_INCREASE_PER_TURN_CHANCE ist die Chance in Prozent, dass die jeweiligen Ureinwohner Gold bekommen. Auf 0 stellen, um das gesamte Feature zu deaktivieren. -->
    	<Define>
    		<DefineName>NATIVE_GOLD_INCREASE_PER_TURN_FIXED</DefineName>
    		<iDefineIntVal>50</iDefineIntVal>
    	</Define>
    	<!-- NATIVE_GOLD_INCREASE_PER_TURN_FIXED ist der Festbetrag in Gold -->
    	<Define>
    		<DefineName>NATIVE_GOLD_INCREASE_PER_TURN_RANDOM</DefineName>
    		<iDefineIntVal>50</iDefineIntVal>
    	</Define>
    	<!-- NATIVE_GOLD_INCREASE_PER_TURN_RANDOM ist der maximale zufaellige Goldbetrag -->
    	<!-- Affenbauch: Ureinwohner bekommen Geld am Ende jeder Runde ENDE -->
    Ja, das nächste mal dokumentiere ich meinen Code in Englisch. Ganz bestimmt.


    Falls jemand diese Mini-Mod in sein Projekt aufnehmen möchte, stelle ich die Mini-Mod gerne zur Verfügung.
    Über XML ist ja alles skalierbar.
    Wer die Mini-Mod deaktivieren möchte, setzt einfach NATIVE_GOLD_INCREASE_PER_TURN_CHANCE oder gleich alle drei Werte auf 0.
    Da kann nichts anbrennen.

    Liebe Grüße vom Bananenbaum,
    Affenbauch
    Geändert von Affenbauch (30. April 2011 um 10:57 Uhr)
    Unter aller Kanone!

  2. #17
    Meister-Bananenpflücker Avatar von Affenbauch
    Registriert seit
    20.04.11
    Ort
    Auf dem Bananenbaum
    Beiträge
    99

    Big Grin

    Hossa!

    Hier die neue, verbesserte Version des Features.


    CvGame.cpp:


    Code:
    	// Affenbauch 29-04-2011 Natives get gold per turn feature - START
    
    	int Zufall;
    	int Goldsumme;
     	int NativeGoldIncreasePerTurnChance = GC.getDefineINT("NATIVE_GOLD_INCREASE_PER_TURN_CHANCE"); 
    	// chance in percent that a native player gets the specified amount of gold at the end of a turn
    	// NATIVE_GOLD_INCREASE_PER_TURN_CHANCE is also used as an on/off-switch for the "Natives get gold per turn feature": 
    	// NATIVE_GOLD_INCREASE_PER_TURN_CHANCE = 0: feature disabled
    	// NATIVE_GOLD_INCREASE_PER_TURN_CHANCE > 0: feature enabled
    	int NativeGoldIncreasePerTurnFixed = GC.getDefineINT("NATIVE_GOLD_INCREASE_PER_TURN_FIXED");  // the fixed amount of gold the native player gets per turn, if the test for NATIVE_GOLD_INCREASE_PER_TURN_CHANCE was succesful for the player
    	int NativeGoldIncreasePerTurnRandom = GC.getDefineINT("NATIVE_GOLD_INCREASE_PER_TURN_RANDOM"); // an additional random amount of gold the native player gets per turn, if the test for NATIVE_GOLD_INCREASE_PER_TURN_CHANCE was succesful for the player
    
    	if (NativeGoldIncreasePerTurnChance > 0)
    	{
    	for (iI = 0; iI < MAX_PLAYERS; iI++)
    	{
    	
    		//The native players.
    		std::vector<PlayerTypes> natives;
    		
    		PlayerTypes eLoopPlayer = (PlayerTypes)iI;
    		CvPlayer& kPlayer = GET_PLAYER(eLoopPlayer);
    
    		if (kPlayer.isNative())
    		{
    			Zufall = (getSorenRandNum(100, "test chance for native gold increase"));
    			if (Zufall <= NativeGoldIncreasePerTurnChance)
    				{
    					Goldsumme = (getSorenRandNum(NativeGoldIncreasePerTurnRandom, "Random Amount of Native Gold increase") + NativeGoldIncreasePerTurnFixed);
    					kPlayer.changeGold((Goldsumme));
    				}
    		}
    				
    	}
    	}
    
    	// Affenbauch 29-04-2011 Natives get gold per turn feature - END
    GlobalDefinesAlt.xml:

    Code:
    	<!-- Affenbauch: Ureinwohner bekommen Gold am Ende jeder Runde START-->
            <!-- Es werden der Reihe nach alle Ureinwohnervoelker ueberprueft. NATIVE_GOLD_INCREASE_PER_TURN_CHANCE ist die Chance in Prozent, dass das jeweilige Ureinwohnervolk nach der aktuellen Spielrunde Gold bekommt. -->
            <!-- NATIVE_GOLD_INCREASE_PER_TURN_CHANCE ist gleichzeitig der An-Aus-Schalter für das Feature "Ureinwohner bekommen Gold am Ende jeder Runde". Wert 0 = Feature ausschalten, Wert größer 0 = Feature einschalten. -->
    	<Define>
                    <DefineName>NATIVE_GOLD_INCREASE_PER_TURN_CHANCE</DefineName>
    		<iDefineIntVal>50</iDefineIntVal>
    	</Define>
    	<!-- NATIVE_GOLD_INCREASE_PER_TURN_FIXED ist der Festbetrag in Gold, den das jeweilige Ureinwohnervolk nach der aktuellen Spielrunde bekommt, wenn die Ueberpruefung von NATIVE_GOLD_INCREASE_PER_TURN_CHANCE erfolgreich war. -->
    	<Define>
                   <DefineName>NATIVE_GOLD_INCREASE_PER_TURN_FIXED</DefineName>
    		<iDefineIntVal>100</iDefineIntVal>
    	</Define>
    	<!-- NATIVE_GOLD_INCREASE_PER_TURN_RANDOM ist der maximale zufaellige Goldbetrag, den das jeweilige Ureinwohnervolk nach der aktuellen Spielrunde bekommt, wenn die Ueberpruefung von NATIVE_GOLD_INCREASE_PER_TURN_CHANCE erfolgreich war. -->
    	<Define>
    		<DefineName>NATIVE_GOLD_INCREASE_PER_TURN_RANDOM</DefineName>
    		<iDefineIntVal>100</iDefineIntVal>
    	</Define>
    	<!-- Affenbauch: Ureinwohner bekommen Gold am Ende jeder Runde ENDE -->
    Jetzt mit praktischem An-Aus-Schalter.
    Geändert von Affenbauch (30. April 2011 um 11:48 Uhr)
    Unter aller Kanone!

  3. #18
    Talking Bull Avatar von Writing Bull
    Registriert seit
    01.10.08
    Beiträge
    21.376
    Glückwunsch zu deinem allerersten kleinen DLL-Projekt!

    Ich fand's spannend mitzulesen, wie du auf neue Hindernisse gestoßen und drüberhinweg gekrabbelt bist. Ich finde persönlich, dass das ganz besonders viel Spaß beim Modden macht - wenn einem nicht alles in den Schoß fällt, sondern wenn man sich erst mal reinfuchsen muss. Dann ist man nachher umso stolzer!

    Wir werden bei TAC deinen Code leider nicht mehr in die finale Version unserer Basisedition übernehmen. Dafür kommt das zu spät. Es ist ja nicht damit getan, nur den DLL-Code zu programmieren. Man muss die Auswirkungen aufs Balancing abschätzen, man muss testen und immer wieder testen, man findet Bugs an den unmöglichsten Stellen und fixt die dann usw. Wir haben die Erfahrung gemacht, dass wir bei neuen Features mitunter noch ein halbes Jahr nach deren Einführung Bugs entdeckt haben, z.B. seltene Abstürze oder Fehler im Multiplayermodus.

    Anfang Juni kommt TAC 2.02b raus, etwa Mitte Juli dann die finale Version TAC 2.03. Danach werden wir Szenarien erstellen, ein erstes entsteht derzeit bereits. Für die Szenarien kann dein Feature dann spannend sein, insbesondere für solche, die Wert auf einen friedlichen Umgang mit den Ureinwohnern legen. Ich würde mich freuen, wenn du hier im Forum am Ball bleiben würdest, Affenbauch!

    Edit: Noch eine Kleinigkeit - ich würde dir raten, Kommentare vor und nicht hinter die xml-Tags zu schreiben. Weil das in dieser Weise auch von den anderen Moddern praktiziert wird. Sonst verwirrt das ein bisschen.

  4. #19
    Meister-Bananenpflücker Avatar von Affenbauch
    Registriert seit
    20.04.11
    Ort
    Auf dem Bananenbaum
    Beiträge
    99
    Besten Dank für den Glückwunsch, Chefstier!

    Ja, natürlich bleibe ich hier am Ball, auch wenn mein Code es nicht in die DLL von TAC schafft, oder wie der Engländer sagt: "I'll be freeballing on here for sure."

    Mit Affentanz in den Mai,
    Affenbauch


    Edit: Habe dein Edit gelesen.


    Zitat Zitat von Writing Bull Beitrag anzeigen
    Wir werden bei TAC deinen Code leider nicht mehr in die finale Version unserer Basisedition übernehmen. Dafür kommt das zu spät. Es ist ja nicht damit getan, nur den DLL-Code zu programmieren. Man muss die Auswirkungen aufs Balancing abschätzen, man muss testen und immer wieder testen, man findet Bugs an den unmöglichsten Stellen und fixt die dann usw.
    Der renitente kleine Kobold auf meiner Schulter quiekt:
    "Aber es ist ja ausschaltbar!"

    Ich stopfe den Kobold mal schnell zurück in seine Kiste!
    Geändert von Affenbauch (30. April 2011 um 11:52 Uhr)
    Unter aller Kanone!

Seite 2 von 2 ErsteErste 12

Berechtigungen

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