PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "case" und "random" hilfe


logi
28.04.2012, 10:23
Hallo,

nachdem ich meine suchmachine nun für stunden (ohne erfolg) zum kochen gebracht hab dachte ich mir poste ich es mal hier und hoffe auf antwort...


ich hab mir ein kleines Script zusammengeschustert was auch soweit ganz gut funktioniert (nach Stunden an Arbeit ...).

// intel or bomb?

_suspect = _this select 0;
_bomber = (_this select 3) select 0;


while {alive _suspect} do {

// Remove action ...
_action = _suspect addAction["foo", "foo.sqf"];
while {_action >= 0} do {
_suspect removeAction _action;
_action = _action - 1;
};


// guy got bomb or whatever (option false)
if (!_bomber) exitwith {"Bo_GBU12_lgb" createVehicle (getPos _suspect)};


// guy got intel (option true)
_suspect switchMove "ActsPsitMstpSnonWunaDnon_sceneNikitinDisloyalty_Sy kes";


while {true} do {
_suspect switchMove "ActsPsitMstpSnonWunaDnon_sceneNikitinDisloyalty_Sy kes";
waitUntil {!(animationState _suspect == "ActsPsitMstpSnonWunaDnon_sceneNikitinDisloyalty_Sy kes")};
}};

Jedoch bin ich jetzt an einem Punkt der meine Kenntnisse bei weitem übersteigt.

das obige Script soll nun zufällig eines von 5 Scripten aufrufen. Und das jeweilig ausgewählte Script dann auch niemals wieder aufrufen.

ich habe natürlich gegoogelt was das Zeug hält habe mir auch wieder was gebastelt was aber nicht funktioniert. Aber vielleicht gibts euch ne Idee auf was ich eigentlich aus bin.


if (isServer) then {};
_m = case select




switch (start) do {

case 1: {execVM "script1.sqf"};
case 2: {execVM "script2.sqf"};
case 2: {execVM "script3.sqf"};
case 3: {execVM "script4.sqf"};

case = case - [_m];

};_suspect aus dem ersten script wird von mehreren AI über eine addAction aufgerufen.

Wenn ich hier voll auf dem Holzweg sein sollte sagt es mir. Ich bin ein blutiger anfänger was sqf angeht.

schonmal vielen dank! :)

Ghost_Aut
28.04.2012, 18:07
Beispiel:

_typeNr = round (random 3);

switch (_typeNr) do {
case 0: {
//Script 1//
[] execVM "script_1.sqf";
};

case 1: {
//Script 2//
[] execVM "script_2.sqf";
};

case 2: {
//script 3//
[] execVM "script_3.sqf";
};

case 3: {
//script 4//
[] execVM "script_4.sqf";
};
};

logi
28.04.2012, 21:47
Hallo Ghost!

Vielen Dank für deine schnelle Antwort. Funktioniert auch alles hervorragend bis auf eine kleine Sache...

Wie stelle ich sicher das das aufgerufene Script nicht noch mal aufgerufen wird?

Moerderhoschi
28.04.2012, 23:14
// pruefen ob array vorhanden falls nicht dann erstellen
if (isnil"c_array") then {c_array = [1,2,3,4]};

// pruefen ob array befuellt mit werten, midestens 1 wert
if (count c_array > 0) then {

// selektierung eines wertes aus dem array, anschließend entfernen des wertes aus array
_zaehler = ((count c_array)-1);
_auswahl = c_array select (round (random _zaehler));
c_array = c_array - [_auswahl];

switch (_auswahl) do
{
case 1: {execVM "script1.sqf"};
case 2: {execVM "script2.sqf"};
case 3: {execVM "script3.sqf"};
case 4: {execVM "script4.sqf"};
default {};

};
};


gruß
hoschi

TeRp
29.04.2012, 00:18
hoschi's script noch ein bisschen verbessert und formatiert!
Ordentlich Einrücken ist immer toll, Herr Hoschi :D


// pruefen ob array vorhanden falls nicht dann erstellen
if (isnil"c_array") then
{ c_array = ["script1.sqf","script2.sqf","script3.sqf"] };

// pruefen ob array befuellt mit werten, midestens 1 wert
if (count c_array > 0) then
{
// selektierung eines wertes aus dem array, anschließend entfernen des wertes aus array
_auswahl = c_array select (round (random ((count c_array)-1)));
call format ["execVM %1",_auswahl];
c_array = c_array - [_auswahl];
};

Sollte so funktionieren, aber ich bin auch schon länger aus der ArmAaaAaAaaAa-Geschichte raus. Also keine Garantie ;)

logi
29.04.2012, 09:52
:daumen:

vielen dank jungs!

Xeno
29.04.2012, 19:26
Sollte so funktionieren, aber ich bin auch schon länger aus der ArmAaaAaAaaAa-Geschichte raus. Also keine Garantie ;)
Du bist wirklich lange raus... so macht das kein Mensch mehr, lol

Ich hau noch ne dritte Version rein :p

if (isnil"c_array") then {c_array = [1,2,3,4]};

if (count c_array > 0) then {
_auswahl = c_array select (floor (random (count c_array) - 1));
c_array = c_array - [_auswahl];
execVM format ["script%1.sqf", _auswahl];
};


Xeno

logi
29.04.2012, 19:29
Nochmals danke für die schnellen und super antworten. Beide Scripts funktionieren super jedoch habe ich ein kleines Problem was mich an den rande des Wahnsinns treibt.


//init of the _suspect:
//this addAction ["Interrogate","scripts\arest.sqf",[true],1,false,true,"","(_target distance player) < 5"];
//
// intel or bomb?

_suspect = _this select 0;
_bomber = (_this select 3) select 0;

while {alive _suspect} do {

// Remove all actions from the suspect
_action = _suspect addAction["foo", "foo.sqf"];
while {_action >= 0} do {
_suspect removeAction _action;
_action = _action - 1;};

// option false
if (!_bomber) exitwith {"grenade" createVehicle (getPos _suspect)};



// pruefen ob array vorhanden falls nicht dann erstellen
if (isnil"c_array") then {c_array = [1,2,3,4]};

// pruefen ob array befuellt mit werten, midestens 1 wert
if (count c_array > 0) then {

// selektierung eines wertes aus dem array, anschließend entfernen des wertes aus array
_zaehler = ((count c_array)-1);
_auswahl = c_array select (round (random _zaehler));
c_array = c_array - [_auswahl];

switch (_auswahl) do
{
case 1: {execVM "script1.sqf"};
case 2: {execVM "script2.sqf"};
case 3: {execVM "script3.sqf"};
case 4: {execVM "script4.sqf"};
case 5: {execVM "script5.sqf"};
default {};

};
};



// option false
if (!_bomber) exitwith {"grenade" createVehicle (getPos _suspect)};


// guy got intel (option true)

while {true} do {
_suspect switchMove "ActsPsitMstpSnonWunaDnon_sceneNikitinDisloyalty_Sy kes";
waitUntil {!(animationState _suspect == "ActsPsitMstpSnonWunaDnon_sceneNikitinDisloyalty_Sy kes")};}


}};




Das Scripts funktioniert eigentlich einwandfrei ... Nur das es dinge macht die meiner Meinung nach keinen Sinn ergeben.

Wenn Player Bluefor ist und _suspect Opfor dann muss ich _suspect erst verwunden damit die AddAction erscheint. :stupid:

Wenn Player Opfor ist und _suspect Opfor habe ich keine Problem. Genauso wenn Player Bluefor ist und _suspect Civi.

Macht das für einen für euch einen Sinn? Denn ich bin mit meinem Latein am Ende...

Moerderhoschi
29.04.2012, 20:09
_auswahl = c_array select (floor (random (count c_array) - 1));

floor wird keinesfalls benoetigt.

Angenommen der Array hat noch einen Wert, dann wird mit meiner methode

_zaehler = ((count c_array)-1);
_auswahl = c_array select (round (random _zaehler));

der c_array gezaehlt dass ergibt 1, anschließen wird -1 durchgefuehrt was 0 ergibt und schlussendlich ergibt round random 0 immer 0. Meiner Ansicht nach also absolut keine notwendigkeit fuer ein floor.

Das Skript welches ich oben geschrieben habe, habe ich auch getestet und es funktionierte so wie gewollt auch ohne die werte mit floor abzurunden.

gruß
hoschi

logi
29.04.2012, 20:53
Hoschi dein script funktioniert einwandfrei :daumen:

glaube auch nicht das der fehler dort liegt. obwohl ich um ehrlich zu sein keine ahnung hab was da so probleme macht.

xeno hast du ne idee?

TeRp
29.04.2012, 21:03
Mal so ein kurzer Einwand nebenbei.
Wenn man nur round benutzt hast man unterschiedliche Wahrscheinlichkeiten für das Auftreten der Ereignisse.
Insbesondere das erste und letzte Element des Arrays haben eine niedrigere Wahrscheinlichkeit als die restlichen Elemente.

Beispiel der Array [0,1,2,3]:
Mit round (random (count array - 1)):
0 ergibt sich für random-Werte [0,0.5[
1 ergibt sich für random-Werte [0.5,1.5[
2 ergibt sich für Random-Werte [1.5,2.5[
3 ergibt sich für Random-Werte [2.5,3[

Mit floor (random (count array)):
0 ergibt für [0,1[
1 ergibt sich für [1,2[
2 ergibt sich für [2,3[
3 ergibt sich für [3,4[
Und im Falle, dass sich 4 ergeben sollte (sehr unwahrscheinlich), wird einfach wiederholt bis sich ein anderer Werte ergibt.

Das ist das Problem bei Xeno's Script, das letzte Element wird mit allerhöchster Wahrscheinlichkeit zu allerletzt ausgeführt, eben wegen dieses Umgangs mit floor :D

So, genug Offtopic von mir :D

Ontopic: Gut das der Xeno immer ncoh ArmAaaAaa scriptet und diese Kacksprache super beherrscht :D

flickflack
30.04.2012, 06:15
[...]diese Kacksprache[...]

^this :zahn:

logi
30.04.2012, 16:49
keiner ne idee?

Lester
30.04.2012, 17:08
Und im Falle, dass sich 4 ergeben sollte (sehr unwahrscheinlich), wird einfach wiederholt bis sich ein anderer Werte ergibt.lt. BIKI hat BIS inzwischen da Hand angelegt, so das nie der Maximalwert erreicht werden kann.
Ich kann mich nur zu gut daran erinnern das es mal anders war, aber mittlerweile heisst es:
Random real (floating point) value from 0 (inclusive) to x (not inclusive).

Moerderhoschi
30.04.2012, 17:45
keiner ne idee?

Haeng deine Missi mal hier an einen post an und dann kann man mal schauen an was es liegt.

gruß
hoschi

logi
01.05.2012, 14:17
hier und nochmal danke! :daumen:

Moerderhoschi
01.05.2012, 16:59
Bei der von dir angehaengten Mission kann ich als Blufor Einheit ohne Probleme den actionmenue Eintrag vom Opfor Takistani auswaehlen auch ohne vorher auf ihn feuern zu muessen.

Bitte schildere nochmal genau den Ablauf wann wie das Problem bei dir auftritt.

gruß
hoschi

logi
02.05.2012, 10:32
Ich hab mein Spiel gerade mal ohne Mods gestartet und hatte auch keinerlei Probleme. Jetzt blicke ich gar nicht mehr durch. Wenn einer eine Idee hat bzw. ein alternatives Script hätte was aufs gleiche hinausläuft wäre ich sehr dankbar.