Clonk-Center Titelbild

Clonk Center Forum / Allgemein / Scripthilfe


[ ]


Seite 0[1] [2]

Von Konsti am 20.02.2006 16:40  
So, eröffne auch mal ein Thema ;)
Falls jemand mal eine kleine Scripthilfe braucht, kann er es hier reinschreiben.

Was ich gerne wissen würd, wie man eine Message in der Farbe des Clonkes bei denn die Message aufgerufen wird färbt.

Von Tyron am 20.02.2006 16:58  
Fällt mir so spontan nicht ein aber in TehStury vom CCAN hatte ich das eingebaut.

Von Konsti am 20.02.2006 19:24  
Du meinst nicht zufällig das Script?:

global func SaySentence(who, sid) {
var thechar, sentence;
if(who=="flgr") thechar=char_flgr;
if(who=="falkner") thechar=char_falkner;
if(who=="horex") thechar=char_horex;
if(who=="newotn") thechar=char_newton;
sentence=Call(Format("%s_speech(%d)",who,sid));
Message("<c %x>%s</c>",thechar,GetColorDw(thechar),sentence);
}

"<c %x>%s</c>" ist für die Farbe und denn Text der Message, "thechar" ist wer das aufruft, "GetColorDw(thechar)" ist die Farbe des aufrufendes Objekts, nur das "sentence" versteh ich nicht :/

Wie wäre es mit

global func Speak(message)
{
Message("<c %x><%s> %s</c>", this(), GetColorDw(this()), GetName(this()), message);
}

Als Objekt, geht doch auch...

Dann in Szenarioscript:

#strict
static Clonk;

func Initialize() {
  //Der Clonk
  Clonk = CreateObject(CLNK,100,100,-1);
  //Das Dialog-Objekt
  CreateObject(SPEK,0,0,-1);
  return(1);
}

func Script10()
{
Clonk->Speak("Hallo!");
}

geht das ;)

Naja, dann noch eine Frage:
Wenn ich ein Sound abspiele, was bedeutet das * dahinter? Also z.B. Sound("Die*");

Danke schonmal in vorraus.

Von Tyron am 20.02.2006 19:44  
>"<c %x>%s</c>" ist für die Farbe und denn Text der Message, "thechar" ist wer das aufruft, "GetColorDw(thechar)" ist die Farbe des aufrufendes Objekts, nur das "sentence" versteh ich nicht :/


Wenn du in der Doku die Funktion nachschlägst findest du folgenden Hinweise:
Zeigt eine Nachricht an. Diese kann nach dem C-Formatierungsstil formatiert werden (siehe Format)

Wenn du dann bei Format nachsiehst, wirst du entdecken, dass man Variablen in die Nachrichten einbinden kann. Bei der Funktion da wird der Wert der Variable sentence über das %s in die Nachricht eingebunden.

>Wenn ich ein Sound abspiele, was bedeutet das * dahinter? Also z.B. Sound("Die*");

Eine beliebige Zahl. Die* spielt zufällig Die1, Die2 oder Die3 ab.

Von Konsti am 20.02.2006 19:48  
Ah, Thx.

Von Konsti am 20.02.2006 19:46  
Hm... Wieso ist die Message dann immer schwarz?

Von Tyron am 20.02.2006 19:51  
Vielleicht ist this() nicht gesetzt. Prüf das mal.
Du brauchst übrigens nicht wirklich ein Dialog Objekt. Du könntest die funktion auch einen Script in die System.c4g deines Szenarios legen.

Von boni am 20.02.2006 16:59  
Das funktioniert mit Textformatierung.
"<c ff0000>Ich bin rot!</c>" wäre rot.
<c XXXXXX>[Text]</c> ist der Syntax. Der Wert wird im HEX-Format angegeben.

Von Flinti am 07.03.2006 17:21  
gibt es auch andere Formatierungmöglichkeiten als
<c>bla</c>  und
<i>bla</i> ?

Von Clonkinator am 20.02.2006 18:37  
Hey, für sowas gibt's Inserate! *Hinterhältiggrins*

Von Tyron am 20.02.2006 19:37  
*g*
Du könntest auch umgekehrt Scripthilfe anbieten (:

Von Konsti am 07.03.2006 16:35  
Was macht die Funktion <WildcardMatch>?

Von boni am 07.03.2006 16:50  
Einen Wildcardmatch ;)
Das ist z.b. wenn du hast Foo*Bar, dann findet er alles wo Foo am Anfang, dann irgendwas dazwischen und Bar am ende steht.

Von Konsti am 07.03.2006 17:46  
Ahh... Weil da hat ich sowas gesehen:

protected func FxBanBurnPSpellEffect(szNewEffect, iEffectTarget, iEffectNumber, iNewEffectNumber, var1, var2, var3)
  {
  // Feuer abblocken
  if (WildcardMatch(szNewEffect, "*Fire*")) return(-1);
  // Alles andere ist OK
  return();
  }

Von Konsti am 07.03.2006 18:50  
So, dass wird jetzt etwas lang:
Ich programmiere grad ein Vogel, der Sachen klaut (http://www.cc.striver.net/ideas.php?a=sh&id=494).

Hier Das Script.c:

/*-- Vogel --*/

#strict

public func IsPossessible() { return(1); }

/* Initialisierung */

protected func Initialize()
{
  SetAction("Fly");
  if (Random(2)) return(SetComDir(COMD_Right()));
  return(SetComDir(COMD_Left()));
}

/* TimerCall mit KI-Steuerung */

protected func Activity()
{
  // Geräusche machen
  if (!Random(25)) Sound("Raven*");

  // Die KI-Steuerung wird bei Besessenheit nicht gebraucht
  if (GetEffect("PossessionSpell", this())) return();

  // Nichts machen
  if (Random(2) || GetAction() ne "Fly") return(1);

  // Nach oben oder unten fliegen
  SetComDir(COMD_Up());
  if (Random(2)) SetComDir(COMD_Down());

  // Nichts machen
  if (!Random(4)) return(1);

  // Umdrehen
  if (Random(2)) return(TurnRight());
  return(TurnLeft());
}

HitCheck:
  if(Not(SetVar(0,FindObject(CLNK, -15,0,30,25))))
   SetVar(0,FindObject(CLNK, -25,0,50,30));
  if(Not(Var(0))) return(0);
  if(Not(SetVar(1,Contents(0,Var(0))))) return(Attack());
  CreateContents(GetID(Var(1)));
  RemoveObject(Var(1));
  Sound("UnCash");
  Attack();
  return(1);

Attack:
  SetAction("Attack");
  Sound("Raven*");
  return(1);

Activity:

  if(Or(InLiquid(),GreaterThan(GetY(FindObject(this())),100)))
   return(SetComDir(COMD_Up()));

  if(Not(Random(10)))
   if(Contents())
    Exit(Contents());

  if (Random(2)) return(1);

  if (Not(SEqual(GetAction(),"Fly"))) return(1);

/* Kontakte */

protected func ContactLeft()
{
  // Die KI-Steuerung wird bei Besessenheit nicht gebraucht
  if (GetEffect("PossessionSpell", this())) return();

  return(TurnRight());
}

protected func ContactRight()
{
  // Die KI-Steuerung wird bei Besessenheit nicht gebraucht
  if (GetEffect("PossessionSpell", this())) return();

  return(TurnLeft());
}

protected func ContactTop()
{
  // Die KI-Steuerung wird bei Besessenheit nicht gebraucht
  if (GetEffect("PossessionSpell", this())) return();

  return(SetComDir(COMD_Down()));
}

protected func ContactBottom()
{
  // Die KI-Steuerung wird bei Besessenheit nicht gebraucht
  if (GetEffect("PossessionSpell", this())) return();

  return(SetComDir(COMD_Up()));
}

/* Aktionen */

public func TurnRight()
{
  if (Stuck() || GetAction() ne "Fly") return();
  if (GetXDir() < 0) SetXDir(0);
  SetDir(DIR_Right());
  SetComDir(COMD_Right());
  return(1);
}

public func TurnLeft()
{
  if (Stuck() || GetAction() ne "Fly") return();
  if (GetXDir() > 0) SetXDir(0);
  SetDir(DIR_Left());
  SetComDir(COMD_Left());
  return(1);
}

/* Einwirkungen */

protected func CatchBlow(iLevel, pObject)
{
  if (pObject->~IsArrow()) SetAction("Tumble");
  if (!Random(3)) Sound("RavenHurt");
  return(1);
}

protected func Death()
{
  ChangeDef(_DBR);
  return(1);
}

/* Steuerung durch Besessenheit */

protected func ControlCommand(szCommand, pTarget, iTx, iTy)
{
// Bewegungskommando
if (szCommand eq "MoveTo")
  return(SetCommand(this(),szCommand, pTarget, iTx, iTy));
return(0);
}

protected func ContainedLeft()
{
[$TxtMovement$]
SetCommand(this(), "None");
TurnLeft();
return(1);
}

protected func ContainedRight()
{
[$TxtMovement$]
SetCommand(this(), "None");
TurnRight();
return(1);
}

protected func ContainedUp()
{
[$TxtMovement$]
SetCommand(this(), "None");
SetComDir(COMD_Up());
return(1);
}

protected func ContainedDown()
{
[$TxtMovement$]
SetCommand(this(), "None");
SetComDir(COMD_Down());
return(1);
}

protected func ContainedDig()
{
[$TxtAttack$]
Attack();
return(1);
}

protected func ContainedThrow() { return(1); }

protected func ContainedDigDouble()
{
[$TxtLeave$]
RemoveEffect("PossessionSpell", this());
return(1);
}

Hier die ActMap:

[Action]
Name=Fly
Procedure=FLOAT
Directions=2
FlipDir=1
Length=20
Delay=1
Facet=0,0,28,24
NextAction=Fly
TurnAction=Turn
StartCall=HitCheck
PhaseCall=Survive

[Action]
Name=Turn
Procedure=FLOAT
Directions=2
FlipDir=1
Length=20
Delay=1
Facet=0,24,28,24
NextAction=Fly

[Action]
Name=Attack
Procedure=FLOAT
Directions=2
FlipDir=1
Length=20
Delay=1
Facet=0,48,28,24
NextAction=Fly

[Action]
Name=Tumble
Procedure=NONE
Directions=2
FlipDir=1
Length=20
Delay=1
Facet=0,72,28,24
NextAction=Fly
ObjectDisabled=1
InLiquidAction=Fly


Also, wenn ich das Spiel starte, kommt dass:

...
C4AulParse Vogel(_BRD)::[196;2] Undefined function: Survive
WARNING: C4AulParse Vogel(_BRD)::[196;2] Error getting function in Action Fly: PhaseCall
C4AulScriptEngine linked - 17138 lines, 1 warning, 0 errors
...

Woran liegt das?
Es fungzt zwar, aber dann kommt noch dieser Fehler:

WARNING: C4AulParse Vogel(_BRD)::[196;2] Error getting function in Action Fly: PhaseCall

Achja: Er fliegt er immer nur gradeaus, aber fliegt nicht hoch oder unter (?)

Wäre nett, wenn mir jemand hilft ;)
(P.S: Hoffentlich hab ich nicht die Baumstrucktur kaputt gemacht ;))

Von Clonkinator am 07.03.2006 18:53  
Jetzt hab' ich hinter einem solchen Monsterkommentar einen so mickrigen gesetzt... XO

Von Konsti am 07.03.2006 18:54  
[Nelson]Ha ha[/Nelson]

Von Clonkinator am 11.03.2006 19:08  
O_o

Von Tyron am 08.03.2006 22:31  
.oO( Ein Glück dass man im Forum keine Clunker für Kommentare bekommt )

Von Stivo am 09.03.2006 11:07  
Der Fehler, den dir der Debugmodus herausschreibt, liegt daran, das die Aktion Fly im Script des Vogels Survive() aufruft, was aber nicht vorhanden ist. Mach also eine Funktion Survive() oder lösche "PhaseCall=Survive" aus der ActMap.txt.

> CreateContents(GetID(Var(1)));

> RemoveObject(Var(1));

Du nimmst hier besser "Enter(this(),Var(1));", da sonst der Besitzer des Gegenstand geändert werden könnte, etc...

Bei Activity() könntest du noch schreiben:
if(!Random(20)) SetCommand(this(),"MoveTo",FindObject(0,-250,-250,500,500,OCF_CrewMember()));
Damit der Vogel ab und zu automatisch zu einem Clonk fliegt, um ihn zu beklauen.

Von Konsti am 09.03.2006 15:22  
Oh, vielen Dank das du dir die Mühe machst ;)
Aber:

Er zeigt immernoch ein Fehler an:
C4AulExec (_BRD:_BRD)::Activity[60] func "FindObject" par 0: "object" cannot be converted to "id"

>Bei Activity() könntest du noch schreiben:

>if(!Random(20)) SetCommand(this(),"MoveTo",FindObject(0,-250,-250,500,500,OCF_CrewMember()));

>Damit der Vogel ab und zu automatisch zu einem Clonk fliegt, um ihn zu beklauen.


Geht irgenwie nicht :(

Achja: Kann ich es auch so machen, dass er bestohlene Clonk/Lebewesen (falls es eins ist) noch ein ganz wenig Leben gezogen wird und weggeschleudert?

Von Stivo am 09.03.2006 17:15  
protected func Activity()
{
  // Geräusche machen
  if (!Random(25)) Sound("Raven*");

  // Die KI-Steuerung wird bei Besessenheit nicht gebraucht
  if (GetEffect("PossessionSpell", this())) return();

  // Nichts machen
  if (Random(2) || GetAction() ne "Fly") return(1);

  // Einem Clonk folgen!
  if(!Random(20)) SetCommand(this(),"Follow",FindObject(0,-250,-250,500,500,OCF_CrewMember()));

  // Verfolgung abbrechen
  if(GetCommand())
   if(!Random(10))
    SetCommand(this(),"None");

  // Gengenstand abwerfen
  if(!Random(10))
   if(Contents())
    Exit(Contents());


  // Hier liegt ein Fehler: FindObject() erwartet als ersten Parameter eine ID und kein Objekt (z.B.: this()).
  if(InLiquid() || GetY(FindObject(this()))> 100)
   return(SetComDir(COMD_Up()));

  // Nur wenn keinem Clonk gefolgt wird
  if(GetCommand()) return(0);

  // Nach oben oder unten fliegen
  SetComDir(COMD_Up());
  if (Random(2)) SetComDir(COMD_Down());

  // Nichts machen
  if (!Random(4)) return(1);

  // Umdrehen
  if (Random(2)) return(TurnRight());
  return(TurnLeft());
}

Von Stivo am 09.03.2006 17:37  
> Kann ich es auch so machen, dass er bestohlene Clonk/Lebewesen (falls es eins ist) noch ein ganz > wenig Leben gezogen wird und weggeschleudert?


HitCheck:
  if(Not(SetVar(0,FindObject(CLNK, -15,0,30,25))))
   SetVar(0,FindObject(CLNK, -25,0,50,30));
  if(Not(Var(0))) return(0);
  if(Not(SetVar(1,Contents(0,Var(0))))) return(Attack(Var()));
  CreateContents(GetID(Var(1)));
  RemoveObject(Var(1));
  Sound("UnCash");
  Attack(Var());
  return(1);

private func Attack(pObj)
{
  if(pObj)
   {
   DoEnergy(-10,pObj);
   // Um den Clonk wegzuschleudern, nimmst du am Besten Fling(),SetXDir() +/ SetYDir()
   }
  SetAction("Attack");
  Sound("Raven*");
}

Von Konsti am 09.03.2006 19:17  
Danke, da wo ich Fling machen sollte, hab ich dies gemacht:

...

private func Attack(pObj)
{
  if(pObj)
   {
   DoEnergy(-2,pObj);
    if(GetX(pObj) < GetX(this()))
      Fling(pObj, -1, -1);
    else
      Fling(pObj, 1, -1);
   }
  SetAction("Attack");
  Sound("Raven*");
}

...

Und es fungzt! :D

Aber: Es gibt immernoch ein Fehler:
Wenn der Vogel ein Clonk verfolgt, guckt er nur in eine Richtung.
Er gibt dies über denn Vogel aus: C4AulExec (_BRD:_BRD)::Activity[46] func "FindObject" par 0: "object" cannot be converted to "id"

Von Stivo am 09.03.2006 20:28  
> Es gibt immernoch ein Fehler

Das liegt daran, dass du bei FindObject() als ersten Parameter this() angegeben hast. Es wird aber eine ID erwartet!

Von Konsti am 10.03.2006 15:41  
Ja, der Fehler ist jetzt weg. Jedoch: Er wirft Sachen nicht ab, weil er sie sofort dann wieder einsammtelt. Und wenn er ein Clonk verfolgt, guckt er immer nur in eine Richtung, d.h. er fliegt oft Falschrum :/

Von Stivo am 10.03.2006 16:15  
> Er wirft Sachen nicht ab, weil er sie sofort dann wieder einsammtelt.

Exit(Contents(),+20);

Für das andere Problem weiss ich auch keine Lösung.

Von Konsti am 10.03.2006 17:00  
K, danke für alles. Ich versuch es mal im CF.

Von Konsti am 09.03.2006 15:23  
Und, er fliegt immernoch nur in eine Richtung, außer es passiert was besonderes...

Von Stivo am 09.03.2006 17:07  
Da fällt mir gerade auf, du hast 2 mal die Funktion Activity.

Seite 0[1] [2]