[ ]
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 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. |
|
|