Seite 1 von 1

Waffenhändler Tony

Verfasst: 18 Feb 2005, 21:48
von Wulfy301
Hallo Leute,

für alle, die es wie mich stört das Tony ständig Inventur macht!:summer:
Diese Stelle im Source gibt an ob Tony im Laden ist oder nicht.

C:\ja2\Build\Strategic\Strategic Event Handler.c

if( gMercProfiles[ TONY ].ubLastDateSpokenTo > 0 && !( gWorldSectorX == 5 && gWorldSectorY == MAP_ROW_C && gbWorldSectorZ == 0 ) )
{
// San Mona C5 is not loaded so make Tony possibly not available
if (Random( 4 ))
{
// Tony IS available
SetFactFalse( FACT_TONY_NOT_AVAILABLE );
gMercProfiles[ TONY ].sSectorX = 5;
gMercProfiles[ TONY ].sSectorY = MAP_ROW_C;
}
else
{
// Tony is NOT available
SetFactTrue( FACT_TONY_NOT_AVAILABLE );
gMercProfiles[ TONY ].sSectorX = 0;
gMercProfiles[ TONY ].sSectorY = 0;
}
}

Wenn man den Random-Wert auf Null setzt ist Tony immer im Laden!
Ich habe es ein paar mal versucht und er war jedes Mal da, scheint also hinzuhauen.

Mfg...

Verfasst: 20 Feb 2005, 01:13
von Tobeas
wärs möglich das gleiche auch bei anderen NPCs zu machen, also einzufügen?

Verfasst: 20 Feb 2005, 01:39
von Wulfy301
Moin Tobeas,

ja, sollte mit jedem NPC gehen.

Mfg...

Verfasst: 20 Feb 2005, 01:42
von Nitrat
ehh, welchen Sinn ergibt es, das mit den NPC's zu machen ?

MFG....

Verfasst: 20 Feb 2005, 02:27
von Wulfy301
@Nitrat

NPC oder RPC, ich bring das immer durcheinander, dann müsste Tony also ein RPC sein.
In dem Fall muss es richtig heißen: "Ja, sollte mit jedem RPC gehen"!:D

Mfg...

Verfasst: 20 Feb 2005, 03:23
von Nitrat
RPC = Recrutable Playble Character
NPC = Non Playble Character
EPC = Escortable Person Character

(schreibweise ist so ähnlich, aber hoff das der sinngehalt richtig ist :D )
MFG.....

Verfasst: 20 Feb 2005, 19:26
von -=[MAD]=-
Nitrat hat geschrieben:ehh, welchen Sinn ergibt es, das mit den NPC's zu machen ?

MFG....
hmm, vielleicht damit zB ein paar gewisse Terroristen ( ;) )immer im gleichen sektor sind (und überhaupt da) :)

gruss, -=[MAD]=-

Verfasst: 20 Feb 2005, 19:33
von shadow the deat
ist unterschiedlich manches ist im Souce manches ist aber auch Sheduler :D
naja auf jeden Fall sind die Terroristen im Source *lol*

Verfasst: 21 Feb 2005, 17:27
von Wulfy301
Das die Terroristen immer im gleichen Sektor sind, ist etwas Langweilig, aber das alle Terroristen in einem Spiel zufinden sind, ist keine schlechte Idee, muss ich mal schauen ob das geht!

Mfg...

Verfasst: 21 Feb 2005, 17:40
von Nitrat
Wär daran intressiert das in dem Best Off Mod zu intergrieren lassen.


MFG....

Verfasst: 21 Feb 2005, 17:45
von Wulfy301
@Nitrat

Wenn ich erfolgreich bin, werde ich es natürlich ins Forum stellen, sollen doch alle was davon haben!

Mfg...

Verfasst: 21 Feb 2005, 19:01
von shadow the deat
ich kann dir zwar grad nicht sagen wo das war aber es war in Strategic
und war ne Prozentzahl die für die Schwirigkeitsgrade unterschiedlich war
also auf 100 % und du hast die immer :D

Verfasst: 21 Feb 2005, 19:51
von Wulfy301
@shadow the deat

Im Anhang ist ein Auszug der Stelle im Source, der Terroristen betreffenden, das mit den 100 % habe ich ausprobiert, hat aber nicht geklappt, es scheint etwas komplizierter zu sein.

Mfg...

Verfasst: 21 Feb 2005, 20:29
von Realist
moin

hatte ich mir schonmal angeguckt, sollte kein problem darstellen.
werds mir nochmals anschauen, und posten was man machen muss, falls mir niemand zuvorkommt ;).

@Nitrat
soll rein, ja? :)

Verfasst: 21 Feb 2005, 20:46
von Wulfy301
@Realist

Ich hoffe das es für dich kein Problem ist, alles was ich bis jetzt probiert habe, ergab nicht die erwünschte Wirkung!:shakehead:
So wie es aussieht sollen nicht mehr als 4 Terroristen im Spiel vorkommen.

Mfg...

Verfasst: 21 Feb 2005, 20:58
von shadow the deat
[PHP]switch( gGameOptions.ubDifficultyLevel )
{
case DIF_LEVEL_EASY:
uiChance = 70;
break;
case DIF_LEVEL_HARD:
uiChance = 30;
break;
default:
uiChance = 50;
break;
}
// add at least 2 more
ubNumAdditionalTerrorists = 2;
for (ubLoop = 0; ubLoop < (MAX_ADDITIONAL_TERRORISTS - 2); ubLoop++)
{
if (Random( 100 ) < uiChance)
{
ubNumAdditionalTerrorists++;
}
}
[/PHP]

die Sachen definieren nur den Wert für uiChance den einfach auf 100
[PHP]#define MAX_ADDITIONAL_TERRORISTS 4[/PHP]
das muss auf 5 oder 6 muss man testen

[PHP]if ( ( gMercProfiles[ ubTerrorist ].sSectorX == 0 ) && ( Random( 100 ) < 40 ) )[/PHP]

Statt der 40 nimm uiChance müsste gehn wenn nicht 100

Verfasst: 22 Feb 2005, 19:32
von Wulfy301
@shadow the deat

Habe die neuen Einstellungen ein paar mal getestet aber es scheint nicht zu funktionieren.
Man kann nur max. 5 Terroristen einstellen, bei 6 stürzt der Computer ab. Im Source sind folgende Sektoren ( H14 / C6 / G1 / G2 / G8 / I14 / F9 / B2 / L11 / H2 ) angegeben, wo die Terroristen auftauchen sollen, mehr als 4 gleichzeitig konnte ich aber nie finden.

Mfg...

Verfasst: 23 Feb 2005, 07:00
von Realist
mmh,
ich hab mit source schon die 5 terris geschafft zu finden, prinzipiell ist shadows idee die richtige. :)

Verfasst: 23 Feb 2005, 18:16
von Wulfy301
@Realist

Was meinst Du mit "prinzipiell ist shadows idee die richtige"?
Hast Du einen andere Lösung?

Mfg...

Verfasst: 23 Feb 2005, 20:56
von Tobeas
muss man nicht

[PHP]for (ubLoop = 0; ubLoop < (MAX_ADDITIONAL_TERRORISTS - 2); ubLoop++)[/PHP]
ändern zu

[PHP]for (ubLoop = 0; ubLoop < (MAX_ADDITIONAL_TERRORISTS); ubLoop++)[/PHP]

Verfasst: 24 Feb 2005, 08:07
von Realist
@Wulfy
nein meine lösung ist "vom prinzip her" die gleiche, daher sage ich auch "prinzipiell richtig".
kann ja mal meins posten mit dem ich 5 terroristen kirege.

@Tobeas
kann man machen, ich hab allerdings
ubNumAdditionalTerrorists,
das in der schleife erhöht wird, einfach nach der schleife manuell hochgesetzt :)
natürlich nur zu testzwecken :D

Verfasst: 24 Feb 2005, 09:18
von Realist
doh, wie lange hat man eigentlich zeit seinen beitrag zu editen?

Code: Alles auswählen

// neu:
#define MAX_ADDITIONAL_TERRORISTS 5


void DecideActiveTerrorists( void )
{
	UINT8		ubLoop, ubLoop2;
	UINT8		ubTerrorist;
	UINT8		ubNumAdditionalTerrorists, ubNumTerroristsAdded = 0;
	UINT32	uiChance, uiLocationChoice;
	BOOLEAN	fFoundSpot;
// neu:
	INT16		sTerroristPlacement[MAX_ADDITIONAL_TERRORISTS][2] = { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} };


	#ifdef CRIPPLED_VERSION
		return;
	#endif

	// one terrorist will always be Elgin
	// determine how many more terrorists - 2 to 4 more

	// using this stochastic process(!), the chances for terrorists are:
	// EASY:		3, 9%			4, 42%		5, 49%
	// MEDIUM:	3, 25%		4, 50%		5, 25%
	// HARD:		3, 49%		4, 42%		5, 9%
	switch( gGameOptions.ubDifficultyLevel )
	{
		case DIF_LEVEL_EASY:
			uiChance = 70;
			break;
		case DIF_LEVEL_HARD:
			uiChance = 30;
			break;
		default:
			uiChance = 50;
			break;
	}

	// add at least 2 more
	ubNumAdditionalTerrorists = 2;
	for (ubLoop = 0; ubLoop < (MAX_ADDITIONAL_TERRORISTS - 2); ubLoop++)
	{
		if (Random( 100 ) < uiChance)
		{
			ubNumAdditionalTerrorists++;
		}
	}
// neu:
	ubNumAdditionalTerrorists = 5;

	// ifdefs added by CJC
	#ifdef JA2TESTVERSION
		ubNumAdditionalTerrorists = 4;
	#endif

	while ( ubNumTerroristsAdded < ubNumAdditionalTerrorists )
	{

		ubLoop = 1; // start at beginning of array (well, after Elgin)

		// NB terrorist ID of 0 indicates end of array
		while ( ubNumTerroristsAdded < ubNumAdditionalTerrorists && gubTerrorists[ ubLoop ] != 0 )
		{

			ubTerrorist = gubTerrorists[ ubLoop ];

			// random 40% chance of adding this terrorist if not yet placed
// neu:
			if ( ( gMercProfiles[ ubTerrorist ].sSectorX == 0 ) )
			{
				fFoundSpot = FALSE;
				// Since there are 5 spots per terrorist and a maximum of 5 terrorists, we
				// are guaranteed to be able to find a spot for each terrorist since there
				// aren't enough other terrorists to use up all the spots for any one
				// terrorist
				do
				{
					// pick a random spot, see if it's already been used by another terrorist
					uiLocationChoice = Random( NUM_TERRORIST_POSSIBLE_LOCATIONS );

					for (ubLoop2 = 0; ubLoop2 < ubNumTerroristsAdded; ubLoop2++)
					{
						if (sTerroristPlacement[ubLoop2][0] == gsTerroristSector[ubLoop][uiLocationChoice][0] )
						{
							if (sTerroristPlacement[ubLoop2][1] == gsTerroristSector[ubLoop][uiLocationChoice][1] )
							{
								continue;
							}
						}
					}
					fFoundSpot = TRUE;

				} while( !fFoundSpot );

				// place terrorist!
				gMercProfiles[ ubTerrorist ].sSectorX = gsTerroristSector[ ubLoop ][ uiLocationChoice ][ 0 ];
				gMercProfiles[ ubTerrorist ].sSectorY = gsTerroristSector[ ubLoop ][ uiLocationChoice ][ 1 ];
				gMercProfiles[ ubTerrorist ].bSectorZ = 0;
				sTerroristPlacement[ ubNumTerroristsAdded ][ 0 ] = gMercProfiles[ ubTerrorist ].sSectorX;
				sTerroristPlacement[ ubNumTerroristsAdded ][ 1 ] = gMercProfiles[ ubTerrorist ].sSectorY;
				ubNumTerroristsAdded++;
			}
			ubLoop++;

		}

		// start over if necessary
	}

	// set total terrorists outstanding in Carmen's info byte
	gMercProfiles[ 78 ].bNPCData = 1 + ubNumAdditionalTerrorists;

	// store total terrorists
	gubNumTerrorists = 1 + ubNumAdditionalTerrorists;
}
damit kriegt man 5 terroristen und das mit ziemlicher sicherheit.
also den wirt und 4 weitere.

immer wenn ich versuch den letzten noch einzufügen, schmiert das spiel ab.
bis jetzt kA worans liegt.

Verfasst: 24 Feb 2005, 21:23
von Wulfy301
@Realist

Habe es getestet und auf anhieb 5 Terroristen gefunden!:k:
Die uiChange Werte habe ich alle auf 100 gesetzt, weiß allerdings nicht ob das überhaupt nötig ist?
case DIF_LEVEL_EASY:
uiChance = 100;
break;
case DIF_LEVEL_HARD:
uiChance = 100;
break;
default:
uiChance = 100;
break;

Mfg...

Verfasst: 25 Feb 2005, 07:38
von Realist
die uiChance werte bestimmen, wieviele zusätzliche terroristen man bekommen kann.
jedesmal wenn man mit dieser chance glück hat wird nämlich ubNumAdditionalTerrorists eins hochgesetzt.
erst danach wird wirklich bestimmt ob man auch die zahl von ubNumAdditionalTerrorists wirklich erreicht, und zwar erhält jeder terrorist eine 40% existenzchance.

noch was, schau doch mal in c6 san mona (wo angel seinen bikerladen hat) ganz im süden ungefähr in der mitte ob da ein paar zivilisten "außerhalb" der map stehen, sie also nicht erreichbar sind.

Verfasst: 25 Feb 2005, 09:00
von Wulfy301
@Realist

Nö, ich kann keine Zivilisten in C6 am südlichen Rand finden. Warum?

Mfg...

Verfasst: 25 Feb 2005, 09:20
von Realist
es ist so, dass bei mir welche da sind - in einem "toten" bereich am rand.
wenn ich granaten auf sie werfe, werden sie verletzt, bewegen sich daher kurz (bleiben aber in ihrem feld), in der bewegung halten sie inne und man sieht nur noch eine weiße fläche in form des "schattens" den sie werfen würden. als ob man sie ausschneiden würde...
wollte wissen ob das irgendwie von den änderungen an den terroristen kommt, aber wenn nicht, dann ist ja gut :)

Verfasst: 03 Okt 2005, 20:38
von Wulfy301
Problem:

Nach längerem Spielen ist Tony nicht mehr im Laden, er "vertritt sich mal kurz die Beine"!
Das aber nun schon sehr lange, ich befürchte er wird auch nicht mehr auftauchen.

Den Random-Wert auf Null zu setzen ist nicht die richtige Vorgehensweise, hat jemand eine Idee wie Tony immer im Laden ist?:confused:


Mfg...

Verfasst: 03 Okt 2005, 20:51
von Realist
Wulfy301 hat geschrieben:C:\ja2\Build\Strategic\Strategic Event Handler.c

if( gMercProfiles[ TONY ].ubLastDateSpokenTo > 0 && !( gWorldSectorX == 5 && gWorldSectorY == MAP_ROW_C && gbWorldSectorZ == 0 ) )
{
// San Mona C5 is not loaded so make Tony possibly not available
if (Random( 4 ))
{
// Tony IS available
SetFactFalse( FACT_TONY_NOT_AVAILABLE );
gMercProfiles[ TONY ].sSectorX = 5;
gMercProfiles[ TONY ].sSectorY = MAP_ROW_C;
}
else
{
// Tony is NOT available
SetFactTrue( FACT_TONY_NOT_AVAILABLE );
gMercProfiles[ TONY ].sSectorX = 0;
gMercProfiles[ TONY ].sSectorY = 0;
}
}

Wenn man den Random-Wert auf Null setzt ist Tony immer im Laden!
Ich habe es ein paar mal versucht und er war jedes Mal da, scheint also hinzuhauen.
Ich kann mich irren, aber gibt Random( 0 ) nicht immer 0 zurück?
Folglich ist if ( 0 ) niemals wahr und Tony ist überhaupt nie anzutreffen.
Mach mal lieber sowas hier:

Code: Alles auswählen

f( gMercProfiles[ TONY ].ubLastDateSpokenTo > 0 && !( gWorldSectorX == 5 && gWorldSectorY == MAP_ROW_C && gbWorldSectorZ == 0 ) )
{
// San Mona C5 is not loaded so make Tony possibly not available
if ([highlight]1[/highlight])
{
// Tony IS available
SetFactFalse( FACT_TONY_NOT_AVAILABLE );
gMercProfiles[ TONY ].sSectorX = 5;
gMercProfiles[ TONY ].sSectorY = MAP_ROW_C;
}
else // kommt niemals zum Tragen
{
// Tony is NOT available
SetFactTrue( FACT_TONY_NOT_AVAILABLE );
gMercProfiles[ TONY ].sSectorX = 0;
gMercProfiles[ TONY ].sSectorY = 0;
}
}
Oder nimm noch besser die ganze if-Abfrage raus und behalte nur den Code im if-Zweig.

Verfasst: 03 Okt 2005, 21:01
von Wulfy301
@Realist

Danke für die schnelle Hilfe, muss das gleich mal Testen ! :erdbeerteechug:

Mfg...

Verfasst: 03 Okt 2005, 21:23
von Wulfy301
Funktioniert!:k:

Dafür gibts nen :keks:

Mfg...

Verfasst: 03 Okt 2005, 21:35
von Realist
Wenn man Tony IMMER haben will, machts übrigens überhaupt keinen Sinn, die GANZE if Prüfung beizubehalten beginnend mit [highlight]if( gMercProfiles[ TONY ].ubLastDateSpokenTo > 0 && !( gWorldSectorX == 5 &&[/highlight](usw). Daher kann man den ganzen Code im letzten Codefenster oben löschen, sobald die Sektorkoordinaten von Tony erst einmal irgendwo initialisiert sind (was sie ja selbstverständlich standardmäßig irgendwo werden).