Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / etwas für jeden Spieler machen, der x erfüllt hat
- - By Serpens66 (More than 200 posts.) Date 26.10.2014 15:06
Ich möchte in einer Regel unterschiedliche Bedingungen und Folgen für jeden Spieler aufstellen.

Bisher mache ich das noch recht umständlich, vermutlich auch, weil ichs noch nicht besser weiß.  Als Beispiel mal folgendes:

// 5 Kaufbare Hazardclonks, sobald zukunftsFundament erforscht:
if(GetPlrKnowledge(0,B556) && playerzf1==0) {playerzf1=1;DoHomebaseMaterial(0,HZCK,5);}
if(GetPlrKnowledge(1,B556) && playerzf2==0) {playerzf2=1;DoHomebaseMaterial(1,HZCK,5);}
if(GetPlrKnowledge(2,B556) && playerzf3==0) {playerzf3=1;DoHomebaseMaterial(2,HZCK,5);}
if(GetPlrKnowledge(3,B556) && playerzf4==0) {playerzf4=1;DoHomebaseMaterial(3,HZCK,5);}
if(GetPlrKnowledge(4,B556) && playerzf5==0) {playerzf5=1;DoHomebaseMaterial(4,HZCK,5);}
if(GetPlrKnowledge(5,B556) && playerzf6==0) {playerzf6=1;DoHomebaseMaterial(5,HZCK,5);}
if(GetPlrKnowledge(6,B556) && playerzf7==0) {playerzf7=1;DoHomebaseMaterial(6,HZCK,5);}
if(GetPlrKnowledge(7,B556) && playerzf8==0) {playerzf8=1;DoHomebaseMaterial(7,HZCK,5);}


Abgesehen davon, dass ich hier und für alles weitere jeweils viele lokale Variablen brauche (komme mit Arrays noch nicht klar, bzw. habe mich noch nicht genug damit beschäftigt),
wird das ganze eben nur für 8 Spieler durchgeführt. Was aber wenn es mehr als 8 sind, bzw. durch Beitritte/Austritte jemand eben eine höhere Spielzahl hat.
Außerdem möchte ich auch sowas einbauen:

// sorgt dafür dass immer wieder x 5er Goldstücke zu kaufen sind, wenn der Vorrat auf 0 geht
if(GetHomebaseMaterial(0,GOL5)==0) {DoHomebaseMaterial(0,GOL5,5);}
if(GetHomebaseMaterial(1,GOL5)==0) {DoHomebaseMaterial(1,GOL5,5);}
if(GetHomebaseMaterial(2,GOL5)==0) {DoHomebaseMaterial(2,GOL5,5);}
if(GetHomebaseMaterial(3,GOL5)==0) {DoHomebaseMaterial(3,GOL5,5);}
if(GetHomebaseMaterial(4,GOL5)==0) {DoHomebaseMaterial(4,GOL5,5);}
if(GetHomebaseMaterial(5,GOL5)==0) {DoHomebaseMaterial(5,GOL5,5);}
if(GetHomebaseMaterial(6,GOL5)==0) {DoHomebaseMaterial(6,GOL5,5);}
if(GetHomebaseMaterial(7,GOL5)==0) {Log("für spieler 8 gold erstellt");DoHomebaseMaterial(7,GOL5,5);}


Das "Log" habe ich eingebaut, um zu sehen, was passiert, wenn es keinen 8ten Spieler gibt. Natürlich wird dann ständig für ihn Gold erstellt, was natürlich nicht gut ist. Deswegen brauche ich also zusätzlich zu vermutlich zahllosen Verbesserungen, eine Abfrage, ob es einen Spieler überhaupt gibt.

Ich brauche also:
Einen Weg, wie ich die Bedingungen und Folgen für jeden existierenden Spieler durchgehen kann, ohne eine konkrete Spielerzahl angeben zu müssen. Vermutlich komme ich da um ein Array diesmal nicht drumherum, oder? ^^
Parent - By Drome (More than 50 posts.) Date 26.10.2014 16:32
Schön und (relativ) einfach geht das mit for-Schleifen und Arrays, ja. Wenn du aber eh nur boole'sche Werte für jeden Spieler speichern willst, kannst du auch Bitmasken benutzen (wobei dir die um die Ohren fliegen, wenn es mehr als 32 Spieler/Spieler-IDs gibt). Die sind aber vermutlich schwerer zu verstehen als Arrays. Zu beiden findest du massig Material bei Google (C4Script benutzt Arrays nicht so viel anders als andere Skriptsprachen, wie Python o.ä.).
Parent - By alex (More than 200 posts.) Date 26.10.2014 16:44
Dafür gibt es ziemlich viele Möglichkeiten, die ist mir am schnellsten eingefallen:

----------

static playerzf;

func Initialize() {
    ....
    playerzf = CreateArray(8);
    ....
}

protected func InitializePlayer(int iPlr, int ix, int iy, object pObj, int iTeam)
{
  ....
  playerzf[iPlr] = 0; //Soll nach jedem Beitritt resettet werden
  ....
}
   
   
   
var x = GetPlayerCount();
for(var i = 0; i < x; ++i) {
    if(!GetPlayerID(i)) { ++x; continue; } //Sind iwie 'Lücken' entstanden?
    if(GetPlrKnowledge(i,B556) && playerzf[i\] == 0) {
        playerzf[i\] = 1;
        DoHomebaseMaterial(i,HZCK,5);
    }
}
   
   
var x = GetPlayerCount();
for(var i = 0; i < x; ++i) {
    if(!GetPlayerID(i)) { ++x; continue; } //Sind iwie 'Lücken' entstanden?
    if(GetHomebaseMaterial(i,GOL5) == 0) { DoHomebaseMaterial(i,GOL5,5); }
}

Ich hoffe das klappt^^
Parent - By B_E (More than 200 posts.) Date 27.10.2014 12:15 Edited 27.10.2014 12:24
Mal ein anderer, modularer Ansatz für das erste Problem aus dem Kopf, aber sollte so funktionieren:

In deinem Objektordner unter <z.B. Object.c4d>/System.c4g/PlrKnowledge.c (der System.c4g-Ordner muss genau so heißen, der Name der PlrKnowledge-Datei kann auch anders lauten):

global func SetPlrKnowledge(int iPlr, id idDef, bool fRemove) {
  inherited(iPlr, idDef, fRemove);
  GameCallEx("OnPlrKnowledge", iPlr, idDef, fRemove);
}


Im Szenario- oder Regelscript:

// wird bei jeder vollständigen Erforschung aufgerufen
public func OnPlrKnowledge(int iPlr, id idDef, bool fRemove) {
  if(idDef == <ID vom Zukunftsfundament> && !fRemove) {
    DoHomebaseMaterial(iPlr, HZCK, 5);
  }
  // ggf. beliebige weitere Regeln
}


Für das zweite Problem sollten in der DefCore.txt folgende Einträge sein:

Timer=1
TimerCall=Refresh


Im Objektscript dann:

// wird als TimerCall jeden Frame von der Engine aufgerufen
protected func Refresh() {
  // durchlaufe alle Spieler, siehe Beispiel 1 von GetPlayerByIndex
  for(var i = 0; i < GetPlayerCount(); i++)
    int iPlr = GetPlayerByIndex(i);
    if(GetHomebaseMaterial(iPlr,GOL5) == 0) {
      DoHomebaseMaterial(iPlr,GOL5,5);
    }
    // ggf. weitere Checks
  }
Up Topic Deutsch / Hilfestellung / etwas für jeden Spieler machen, der x erfüllt hat

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill