Clonk-Center Titelbild

Texte / RPG-Tutorial




RPG-Tutorial


Es wird dringendst empfohlen, verlinktes Doku-Material gründlich zu lesen!
Eventuell auftretende Ähnlichkeiten zu existierenden Clonkern sind rein zufällig,
nicht böse gemeint und rein zufällig, echt ehrlich!
PS: Scriptauszüge sind absichtlich mit Notepad-Screenshots dargestellt!



Ein Gesprächspartner


Zuallererst kopieren wir uns den Clonk in unser Szenario und löschen alles darin
Befindliche außer ActMap, DefCore, Graphics, Overlay und Script.


Dann ändern wir die ID des Clonks, z.B. "RPG1". Als nächstes öffnen wir Script.c
und löschen den kompletten Script des Clonks. Stattdessen inkludieren wir den einfach.
Brauchen wir vielleicht noch. Das müsste dann so aussehen:


Als nächstes definieren wir in der DefCore Entrance, damit wir später per Springen
mit dem Clonk reden können. Als Wert verwenden wir "Entrance=-8,-10,16,20",
d.h. einfach die komplette Clonk-Fläche.


Zurück zum Script. Wir benutzen die Funktion ActivateEntrance(), welche aufgerufen wird,
wenn man vor dem Eingang Springen drückt. Für den Anfang geben wir mit Message()
eine einfach Nachricht aus. Das könnte dann so aussehen:


Danach starten wir unser Szen im Editor und ziehen uns unseren Clonk per Drag'n'Drop
ins Spiel und sprechen ihn einfach mal an:


Für den Anfang nicht schlecht, jedoch wollen wir richtige Dialoge und mehrere
Auswahlmöglichkeiten haben. Deswegen:


Der Dialog


Der Dialog - Basiswissen
Einen Dialog macht man mithilfe eines Menüs. Darum lesen wir uns auch zuerst die Doku dazu durch.
CreateMenu() und AddMenuItem() sowie CloseMenu().

So weit so gut. Allerdings ist das mit dem Dialog als Menü etwas kompliziert.
Zunächst brauchen wir nämlich das Objekt, in das das Menü soll, also den Clonk.
Zum Glück übergibt ActivateEntrance() als ersten Parameter das Objekt,
das versucht dieses hier zu betreten. Also scripten wir erstmal:
public func ActivateEntrance(object pClonk)

Den Dialog öffnen
Da der Clonk noch weiterhin versucht, dieses Objekt zu betreten, würde das Menü
immer wieder geöffnet werden. Um das zu vermeiden geben wir unserem Clonk erstmal
die Anweisung, damit aufzuhören:
SetCommand(pClonk,"");
Als nächstes öffnen wir ein Menü im Dialog-Stil. Dazu einfach ein normales Menü öffnen
und bei int iStyle den Wert C4MN_Style_Dialog übergeben.
Das sieht dann so aus:
CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0);

Den Dialog füllen
Als erstes fügen wir einen leeren Eintrag mit einem Bild unseres Geschprächpartners ein.
Das geht so:
AddMenuItem("","",GetID(this()),pClonk,0,0,0);
Als nächstes folgt der Text, den unser Gegenüber uns mitteilen will.
Ein "" als zweiter Parameter sorgt immer dafür, dass der Eintrag nicht auswählbar ist.
AddMenuItem("Hallo. Willst du einen Flint?","",0,pClonk,0,0,0);
Wir wollen nun zwei Antwortmöglichkeiten geben. Nämlich einfach "Ja" oder "Nein".
Doch bevor wir das tun, müssen wir die Funktionen schreiben, die durch die Einträge
aufgerufen werden. Wir benutzen zwei Funktionen: Eine, die den Dialog einfach nur beendet,
und eine, die dann eben die Aktion ausführt.

Einen Dialog beenden
Ein Menü wird allgemein durch CloseMenu() beendet. Wir schreiben nun eine Funktion,
die den Dialog beendet:

Die ID wird deswegen übergeben, weil ein Menü beim Auswählen eines Eintrags automatisch
als ersten Parameter die ID übergibt, die bei AddMenuItem() als dritter Parameter
angegeben wird.

Ja, ich will Flint!
Als nächstes folgt die Funktion, die dem Clonk den Flint übergibt. Wir nennen sie einfach
mal GiveFlint(). Auch hier wird als erster Parameter wieder die ID übergeben,
also schreiben wir:
protected func GiveFlint(id ID, object pClonk)
Der Rest ist recht einfach. Wir drücken dem Clonk einen Flint in die Hand und beenden
den Dialog mit unserer zuvor gescripteten Funktion:


Die Menüeinträge
Danach fügen wir weiter oben noch die nötigen Menüeinträge ein:
AddMenuItem("Ja!","GiveFlint",0,pClonk,0,pClonk,0);
AddMenuItem("Nein.","EndTalk",0,pClonk,0,pClonk,0);

Und fertig!
Der gesamte Script sollte dann so aussehen:


Ingame sieht das dann so aus:



Hat er auch einen Namen?


Unser Gesprächspartner soll auch einen Namen und eine hübschere Farbe bekommen.
Das machen wir bequem mit der Initialize()-Funktion. Damit der Clonk auch korrekt initialisiert wird und normal reagiert rufen wir danach die überladene Funktion mit return(_inherited()); auf. Wir scripten also:


Das ganze sieht dann so aus:


Bedingte Gesprächsoptionen


Auslagern
Zuallererst lagern wir erstmal ein paar Sachen in andere Funktionen aus,
um die ganze Sache übersichtlich zu halten. Wir scripten uns eine Funtkion,
die das Menü öffnet, indem wir einfach den Script aus ActivateEntrance()
ausschneiden. Ich nenne die Funktion einfach OpenTalk(pClonk):


Den Rest wollen wir ja variabel machen. Also basteln wir uns erstmal eine Funktion
Menu1(pClonk). Wir kopieren den restlichen Script da rein:


Hat er schon einen Flint?
Nun bauen wir uns erstmal eine zweite Funktion, die dem armen Clonk mitteilt,
dass er schon einen Flint hat, und deswegen keinen mehr bekommt. Wir geben dabei nur
die Antwortmöglichkeit "Tschüss":


Der Rest ist wieder einfach. Wir nehmen unsere ActivateEntrance()-Funtkion vom
Anfang und öffnen mit der zuvor gescripteten Funktion OpenTalk() einen Dialog.
Dann überprüfen wir mit FindContents(), ob der Clonk schon einen Flint hat.
Wenn ja, rufen wir unser zweites Menü auf, ansonsten das erste:


Gesamtscript:


Einmalige Aktionen


Wir wollen nun, dass uns Günther einmal einen Superflint gibt. Aber eben nur einmal.
Dazu bedarf es einer lokalen Variable und einer weiteren Menü-Funktion.
Wir scripten also den Menüeintrag mit einer neuen Funktion Menu3(). Dazu brauchen
wir aber auch eine neue Funktion, die dem Clonk einen Superflint gibt. Die nennen wir
einfach GiveSuperFlint(). Dann definieren wir eine lokale Variable SFlint:


Dann müssen wir in der Funktion GiveSuperFlint() diese Varaible auf 1 setzen,
und im ActivateEntrance()-Script genau das überprüfen:


Hier nochmal die GiveSuperFlint()-Funktion:


Händler


Ein Händler
Zuerst brauchen wir einen Händler, also duplizieren wir einfach unseren Günther
und ändern wieder die ID.


Ein Menü
Dann öffnen wir den Script und benennen Menu1() in Menu() um.
Menu2() und Menu3() löschen wir. Wir geben einen Text ein, sowie die
Auswahlmöglichkeiten "Einkaufen" und "Tschüss". Als Funktion für das Einkaufen geben wir
statt GiveFlint() die Funktion BuyMenu an. Die scripten wir später noch.


Wie?
Das, was der Händler alles da hat, definieren wir über seinen Inhalt. Alles was er da drin
hat, kann er auch verkaufen. Also brauchen wir eine Schleife, die zu jedem enthaltenen
Objekt einen Menüeintrag macht.

Das Kaufmenü
Also, scripten wir die Funktion BuyMenu(id ID, object pCLonk).
Zuerst einmal öffnen wir einen neuen Dialog, da der alte durch Auswählen eines Eintrags
geschlossen wurde. Und zwar einfach mittels der Funktion OpenTalk(pClonk).
Dann die Zähl-Variable definieren. Hier im Beispiel ist das i. Dann eine kleine
while-Schleife, die pro Objekt einen Eintrag macht.
Als Funktion beim Auswählen nehmen wir Buy. Für Script-Neulinge steht sie nochmal hier:

while(Contents(i,0))
{
  AddMenuItem(Format("%s kaufen:%d",GetName(Contents(i,0)),GetValue(Contents(i,0))),"Buy",GetID(Contents(i,0)),pClonk,0,pClonk,0);
  i++;
}


Zum Schluss noch einen Eintrag, um die ganze Sache auch abbrechen zu können,
ohne etwas zu kaufen. Die gesamte Funktion sieht dann so aus:


Einkaufen!
Jetzt brauchen wir noch eine Funktion, die dem Clonk sein Objekt gibt und ihm Geld klaut.
Allerdings soll auch überprüft werden, ob der Clonk auch genug Geld hat. Also überprüfen
wir das erstmal. Wenn ja, geben wir ihm sein Objekt, ziehen im Geld ab und spielen noch
einen netten Sound ab. Andernfalls spielen wir einen bösen Sound ab und geben ihm nichts.
Zum Schluss öffnen wir das Menü einfach wieder, falls der Clonk noch was kaufen will.


Und fertig!
Dann ist der Händler vorerst fertig. Wir geben ihm noch einen anderen Namen und probieren
ihn aus.


Verkaufen?
Verkaufen geht genauso, bloß dass nicht der Inhalt des Händlers, sondern der des Clonks
durchsucht werden muss. Das Objekt muss dann entfernt werden und dem Clonk Geld gegeben
statt abgezogen werden.


Quests


Ein Aufgabensteller
Zuerst brauchen wir jemanden, der uns diese Aufgabe stellt. Dafür duplizieren wir wieder
Günther, ändern seine ID und nennen ihn "Matthes der Dorfchef".

Eine globale Variable
Wir öffenen/erstellen nun den Szenarioscript und definieren eine globale Vraiable namens
Quest. Die benutzen wir, um wie beim Kapitel "Einmalige Aktionen" die Aufgabe nur
einmal zu stellen und dann immer nachzufragen, ob sie schon erledigt wurde.

Die Aufgabe
Wir inszenieren also eine kleine Unterhaltung zwischen dem Clonk und Matthes, in dem
Matthes ihm vom bösen Günther erzählt und ihn bittet, Günther totzumachen. Matthes übergibt
uns dann einen Teraflint. Da wir das ja schon können, gehe ich jetzt nicht näher darauf
ein. Da der Script:


Hat er schon Ja gesagt?
Wir brauchen noch eine Überprüfung in ActivateEntrance(), die feststellt, ob die
Aufgabe schon gestellt wurde:


Ok, ich machs.
Als nächstes brauchen wir die Funktion AcceptGunther(id ID, object pClonk).
In dieser wird dem Clonk der Teraflint übergeben und die globale Variable wird gesetzt.
Dazu noch einen Sound und fertig:


Ok, erledigt!
Als nächstes ergänzen wir die Frage nach Erfüllung der Aufgabe um eine Abfrage,
ob Günther noch lebt. Wenn nicht, gibt es einen zusätzlichen Eintrag, durch den man dann
auch eine Belohnung bekommt:


Belohnung
Als nächstes dann eine Funktion, die uns dafür belohnt und die Quest-Variable auf 2 setzt:


Danke!
Wenn wir jetzt Matthes ansprechen, soll er uns nur noch "Danke sagen" und wir sollen nur noch
"Tschüss" sagen können. Also scripten wir in ActivateEntrance() eine weitere Abfrage:


Dann brauchen wir nurnoch die Menü-Funktion Menu5(). Aber sowas ist mitlerweile ja
kein Problem mehr:


Und fertig!
Jetzt haben wir schon ein richtiges kleines Mini-RPG, indem man von Matthes den Auftrag
bekommt, Günther zu töten, der einem auch noch kostenlos Flints gibt. Einen Händler, bei
dem man sich Sachen kaufen kann gibt es auch. Ist doch garnicht mal so schlecht für den
Anfang...


Clonkbastler 27.03.2008


87 Kommentare


14.03.2010 21:54 von Octagon:
Ein prima Tutorial! Wenn man Texte voten könnte, gäbe es von mir *****. Ich habe mich schon immer gefragt, wie irrsinnig kompliziert wohl die Funktion für Grafikprojektion, ausgerichtete Messages, Hintergrund und Rahmen sein muss, die bei M&M oder Western angewandt wird - no dabei wird einfach nur ein Menü geöffnet! Genial, dass du auch noch Shop und Quest eingebaut hast... jetzt steht dem eigenen Adventure ja nichts mehr im Wege.

@Veltago: Ersetze einfach das ">if(!GetAlive(FindObjekt(EFLN)))" durch ein "FindObject(...a)&&FindObject(...b)" mit den Parametern zum Finden eines Objekts mit einer gewissen Inhalts-ID von pClonk.
Und es bietet sich an, das Überprüfen des Questziels in das Dialogmenü zu setzen. Dann muss man sich nicht jedes Mal, wenn man eine Wompfbeere oder einen Stein kaufen möchte, den Questdialog anhören und umgekehrt.

16.10.2009 21:06 von Twonky:
>if(!GetAlive(FindObjekt(EFLN)))

Macht genau das:
Es sucht sich irgendeinen EFLN (also wohl Terraflint) auf der Karte und prüft ob dieser noch lebt oder schon tot ist. Also, ich meine, es würde genau das machen, hätte man FindObject richtig geschrieben. Also muss man da was ändern, ja.

Man kann Händler und Questgeber kombinieren, aber das wird vermutlich nicht durch simples zusammenkopieren klappen. Ob deine "Lösung" funktioniert weiß ich nicht. Ich kann das nicht so mal eben überschauen.
Edit:
Nach kürzerem ansehen kann ich sagen: Es geht nicht, man kann nicht einfach zusammenkopieren. Ich weiß nicht, inwiefern dir Funktionen ein Begriff sind, aber bei zwei Funktionen mit dem gleichen Namen wird eine überschrieben...
Zuletzt geändert: 16.10.2009 21:09

16.10.2009 19:32 von Veltago:
Also im Tutorial steht das man Günther töten muss. Aber ich hab geschrieben das man 2 Objekte finden muss muss man das Script ändern?
confused


Ich hab da den Händler und Questgeber zusammengefügt damit im Menü steht

Ja!
Nein.
Kannst du mir einen Gefallen tun?

geht das? confused

15.10.2009 17:43 von Twonky:
Sind Typos drin. Wird so nicht funktionieren. Z.B. verwendet C4-Script amerikanisches Englisch, also Color statt Colour. "Contents" ist übrigends die Mehrzahl von Content, schreibt sich also mit t.

>if(!GetAlive(FindObjekt(EFLN)))

Häh?

> else if(Quest==2 Menu5(pClonk);

Fehlt Klammer zu.

Gibt bestimmt noch viel mehr; Semantik hab ich nicht beachtet. Wenn Clonk abstürzt ist das meistens nicht so schlimm und wenn du den Debug-Modus aktiviert hast, gibt es keine bessere Möglichkeit ein Script zu überprüfen, als es auszuführen...
Zuletzt geändert: 15.10.2009 17:44

15.10.2009 17:11 von Veltago:
Nein ich hab Angst dass dan Clonk abstürzt mein Spiel quilt über vor bugs

14.10.2009 21:22 von Dragonclonk:
Veltago:
Probiers doch aus. o_O

14.10.2009 21:07 von Veltago:
Ist das richtig?




/*-- Bert --*/

#strict
#include CLNK

protected func Initialize() {
  
{
  SetName("Bert");
  SetColourDw(RGB(64,64,64));
}

public func ActivateEntrance(objekt pClonk)
{
  OpenTalk(pClonk);
  if(FindContens(AXE1,pClonk)) Menu3(pClonk);
   else Menu(pClonk);
  return(true);
}

/*------ Menüs ------*/

protected func Menu1(objekt pClonk)
{
  AddMenuItem("Hallo. Brauchst du was?","",0,pClonk,0,0,0);
  AddMenuItem("Kaufen",BuyMenu",0,pClonk,0,pClonk,0);
  AddMenuItem("Nein.",EndTalk",0,pClonk,0,pClonk,0);
}

protected func BuyMenu(id ID, objekt pClonk)
{
  OpenTalk(pClonk);
  var i;
  while(Contens(i,0))
    {
     AddMenuItem(Format("%s kaufen %d",GetName(Contens(i,0)),GetValue(Contens(i,0)),"Buy",GetID(Contens(i,0)),pClonk,0,pClonk,0);
     i++;
    }

/*--- Funktionen ---*/

protected func Buy(id ID, objekt pClonk)
{
  if(GetWealth(GetOwner(pClonk))>=GetValue(0,ID))
   {
    CreateContens(ID,pClonk);
    DoWealth(GetOwner(pClonk),-GetValue(0,ID));
    Sound("Cash");
   }
   else
    Sound("Error");
   BuyMenu(0,pClonk);
  }
  
/*--- Menüfunktionen ---*/

protected func EndTalk(id ID, objekt pClonk)
{
  CloseMenu(pClonk);
}

protected func EndTalk(objekt pClonk)
{
  SetCommand(pClonk,"");
  CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0);
  AddMenuItem("","",GetID(this()),pClonk,0,0,0);
}

/* ------ Quest ------*/

protected func Menu1(objekt pClonk)
{
  AddMenuItem("Hallo, ich bin der Händler. Könntest du mir einen Gefallen tun?","",0,pClonk,0,0,0);
   AddMenuItem("Kommt drauf an?","Menu2",0,pClonk,0,pClonk,0);
}

protected func Menu2(id ID, objekt pClonk)
{
  OpenTalk(pClonk);
  AddMenuItem("Bring mir eine Kältepflanze und eine Feuerpflanze.","",0,pClonk,0,0,0);
  AddMenuItem("Wo kann ich den solche Pflanzen finden","Menu3",0,pClonk,0,pClonk,0,0,0);
}

protected func Menu3(id ID, objekt pClonk)
{
  OpenTalk(pClonk);
  AddMenuItem("Keine Ahnung... Such doch mal.","",0,pClonk,0,0,0);
  AddMenuItem("Okay! Schon so gut wie erledigt!","AcceptFind",0,pClonk,0,pClonk,0);
  AddMenuItem(Nene! Denkst du ich schlepp mich für deine dummen Pflanzen hier um die Welt?!","EndTalk",0,pClonk,0,pClonk,0);
}

public func ActivateEntrance(objekt pClonk)
{
  OpenTalk(pClonk);
  if(!Quest) Menu1(pClonk);
   else(Menu4(pClonk));
  return(true);
}

/* --- Funktionen ---*/

protected func AcceptFind(id ID, objekt pClonk)
{
  CreateContents(AXE1,pClonk);
  Sound("Connect");
  Quest=1;
}

protected func Menu4(objekt pClonk)
{
  OpenTalk(pClonk);
  AddMenuItem("Hast du sie?","",0,pClonk,0,0,0);
  AddMenuItem("Nein.","EndTalk",0,pClonk,0,pClonk,0);
  if(!GetAlive(FindObjekt(EFLN))) AddMenuItem("Ja!","Belohnung",0,pClonk,0,pClonk.0);
}

protected func Belohnung(id ID, objekt pClonk)
{
  DoWealth(GetOwner(pClonk),200);
  Sound("Cash");
  OpenTalk(pClonk);
  AddMenuItem("Danke! Hier!","",0,pClonk,0,pClonk,0);
  AddMenuItem("Mögest du auf einem guten Pfad wandeln.","EndTalk",0,pClonk,0,pClonk,0);
}

public func ActivateEntrance(objekt pClonk)
{
  OpenTalk(pClonk);
  if(!Quest) Menu1(pClonk);
   else if(Quest==1) Menu4(pClonk);
    else if(Quest==2 Menu5(pClonk);
  return(true);
}

protected func Menu5(objekt pClonk)
{
  OpenTalk(pClonk);
  AddMenuItem("DankeDanke...","",0,pClonk,0,0,0);
  AddMenuItem("Tschüss!","EndTalk",0,pClonk,0,pClonk,0);
}

14.10.2009 20:23 von Veltago:
Idee: +5 mit * und diiiiiiiiiiiickem Lob
Umsetzung.: +3
Funktion:-1 no

28.09.2008 10:12 von Twonky:
Wir auch nicht, wenn du uns keine näheren Informationen mitteilst.

28.09.2008 10:11 von sstj_clonkfan:
bei mir funkt quest nicht...cry weiß nicht was falsch ist...

05.09.2008 10:17 von Mr Wipf:
Ich würde sagen, dass jeder noch so schlechte Scripter, denn CreateMenu()-Befehl kann. Das Tutorial kannaber trotzdem eie große Hilfe sein, wenn man garnicht scripten kann. Wären wir auf dem CCAN:
Idee: +1
Umsetzung: +2
Nutzen: +1smile

17.08.2008 15:45 von mo_sc:
Bei mir wird die ActiveEntrance Funktion nicht aufgerufen, wenn ich mich mit meinem Clonk davorstelle und springen drücke. Den Entrance hab ich in der DefCore festgelegt. Ich kann ActiveEntrance nur durch den Editor aufrufen... cry

D´oh! Hab jetz gemerkt worans liegt -.-
Zuletzt geändert: 17.08.2008 15:51

29.07.2008 15:57 von Flintwipf:
Ich kapier das mit dem "Drag'n Drop" Verfahren nicht...

26.07.2008 7:55 von Dragonclonk:
Dieses Tutorial hat mich sehr sehr weit gebracht, Scriptkenntnisse sind dank dieses Tutorials gestiegen. Danke
mfg Dragonclonk.

13.07.2008 9:32 von Tobiris:
Bei dem script wo drüber steht "Einkaufen" da stehen immerzu die "0" mit dem "ID" in der klammer... Soll man bei der "0" Den wert und bei dem "ID" die ID des Objekts eintragen?! Wenn ja dann habe ich es verstanden xD Mir hilft es immer besser wenn ich ein Beispiel sehe dann kann ich es vergleichen.

13.07.2008 9:30 von Tobiris:
Ich hab ja ein wenig Grundwissen aber ich kapier das halt nicht wie und wo man diesen Geldabziehscript beifügen soll :/

12.07.2008 23:48 von Speed:
ein WENIG grundwissen wäre nicht schlecht dann wärs auch nicht so umständlich für dich ;)

12.07.2008 20:04 von Tobiris:
Weil ich da nicht durchstig. Da wü er mit dem Händler angefangen hat und nicht mehr rictig erklärt hat hab ich agrnichts mehr verstanden und jetzt auch nicht. Ich muss immer den Gesammten script sehen damit ich die zusammenhänge berstehe. Aber da hat er es ja nicht mehr gemacht frown

12.07.2008 19:50 von Twonky:
Wieso fast unverständlich?

12.07.2008 18:52 von Tobiris:
Ok jetzt wo ich das fast unverständliche Tutorial hir nach knapp nem halben Tag kapiert habe ^^ weiß ich endlich wie man ein Menu amcht :Danke

27.04.2008 17:47 von Twonky:
Also, mit Einrückung wär's einfacher. Und noch einfacher wäre es, wenn du den Fehler nennen würdest. Aber im Tutorial wird OpenTalk() immer groß geschrieben. Wenn du die Funktion so übernommen hast, dann musst du sie auch groß schreiben. C4Script unterscheidet nunmal Groß- und Kleinschreibung.

27.04.2008 17:00 von Alexander:
Bin dumm oder was, ich find denn Fehler net

protected func BuyMenu(id ID, object pClonk)
{
CloseMenu(pClonk);
opentalk(pClonk);
while(Contents(i,0))
{
AddMenuItem(Format("%s kaufen:%d",GetName(Contents(i,0)),GetValue(Contents(i,0))),"Buy2",GetID(Contents(i,0)),pClonk,0,pClonk,0);

protected func Buy2(id ID, object pClonk)
{
CloseMenu(pClonk);
opentalk(pClonk);
  
if(GetWealth(GetOwner(pClonk))>=GetValue(0,ID))
{
CreateContents(ID,pClonk);
DoWealth(GetOwner(pClonk),-GetValue(0,ID));
Sound("UnCash")
}
else
Sound("CommandFailure1");
BuyMenu(0,pClonk);
}
i++;
}
AddMenuItem("Tüß, geh weiter","Gehen",0,pClonk,0,pClonk,0);
}

27.04.2008 9:47 von B_E:
Naja, so lange sie nicht angemeldet sind bekommen sie auch wenigstens keine Clunker...

26.04.2008 22:56 von Sven2:
Andrias: "Menü2" ist kein gültiger Funktionsname. Funktionsnamen dürfen keine Umlaute (ä, ö, ü) oder ß enthalten.

Und müsst ihr die Kommentare hier mit euren riesigen Scripten fluten? Das macht die Seite etwas unübersichtlich.
Zuletzt geändert: 26.04.2008 23:41

26.04.2008 22:02 von Pikandy:
Ich wolt mal fragen op ihr mir helfen könnt und mir sagen könnt was hier nicht stimmt, weil jedes mal wenn ich das Szenario starten will sagt er mir [...]

(Admin-snip)

Ok danke.
Zuletzt geändert: 27.04.2008 10:49

26.04.2008 17:30 von Alexander:
http://www.materialordner.de/CZEGFXJFXU7RwhYFT44k079H46pD16is.html
Wer mir des als erster macht gebe ich ihn 10 Clunker xD(Weiß net was ich mit denn Clunker machen soll xD)

14.04.2008 21:40 von Kischdel:
@K-Pone

du darfst nur texturen für ein material verwenden, wenn die kombination auch in der TexMap.txt definiert ist

11.04.2008 16:52 von Vorador42:
Oh, ähm, ja... *peinlich* Danke. Aber es klappt trotzdem nicht :(

10.04.2008 16:31 von ClonkBastler:
Vorador42:
Du hast da nach den if-Anweisungen in ActivateEntrance() ein paar geschweifte Klammern vergessen...

10.04.2008 15:41 von K-Pone:
Also ich muss schon sagen, es ist auf jeden Fall brauchbar. Wenn ich jetzt noch wüsste, wie das geht mit dem Karten erstellen, ohne dass bestimmte Materialien durch Sky ersetzt werden könnt ich mal ein kleines Hazard RPG erstellen.

09.04.2008 18:32 von Vorador42:
Oh, tut mir leid wenn ich nerve. Aber könnt ihr mir bei noch einem Problem helfen? *grins* Find ich toll!^^ Hier ist mein Script. Das Problem ist, dass das Spiel hängt, sobald man ein 2. mal mit ihm spricht.


/*-- RPG Testclonk --*/


#strict
#include

public func ActivateEntrance(object pClonk)
{
  opentalk(pClonk);
  if(Equal(Local(1),0))  SetCommand(pClonk,"");  Menu1(pClonk);
  if(Equal(Local(1),1))  SetCommand(pClonk,"");  Beleidigt(pClonk);
  if(Equal(Local(1),2))  SetCommand(pClonk,"");  Befreit(pClonk);
  if(Equal(Local(1),3))  SetCommand(pClonk,"");  Nein(pClonk);
  return(true);
}


public func opentalk(object pClonk)
{
  CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0);
  AddMenuItem("","",GetID(this()),pClonk,0,0,0);
}

protected func Initialize()
{
  SetName("Fremder");
  SetColorDw(RGB(130,100,70));
  return(_inherited());
}



protected func Menu1(object pClonk)
{
  AddMenuItem("Seid gegrüßt!","",0,pClonk,0,pClonk,0);
  AddMenuItem("Guten Tag.","Aufruf01",0,pClonk,0,pClonk,0);
  AddMenuItem("Es tut mir leid, ich muss weiter.","Gehen",0,pClonk,0,pClonk,0);
}

protected func Aufruf01(id ID,object pClonk)
{
  CloseMenu(pClonk);
  opentalk(pClonk);
  AddMenuItem("Was führt euch her?","",0,pClonk,0,pClonk,0);
  AddMenuItem("Ich suche einen Job.","Aufruf02",0,pClonk,0,pClonk,0);
  AddMenuItem("Nichts. Ich muss dann mal.","Gehen",0,pClonk,0,pClonk,0);
}

protected func Aufruf02(id ID,object pClonk)
{
  CloseMenu(pClonk);
  opentalk(pClonk);
  AddMenuItem("Oh, da seid ihr bei mir genau richtig!","",0,pClonk,0,pClonk,0);
  AddMenuItem("Wunderbar. Was kann ich tun?","Aufruf03",0,pClonk,0,pClonk,0);
}

protected func Aufruf03(id ID,object pClonk)
{
  CloseMenu(pClonk);
  opentalk(pClonk);
  AddMenuItem("Mein Sohn wurde von den Räubern entführt. Könnt ihr ihn befreien?","",0,pClonk,0,pClonk,0);
  AddMenuItem("Natürlich, das ist Ehrensache!","Aufruf04",0,pClonk,0,pClonk,0);
  AddMenuItem("Ich hab besseres zu tun.","EndGehen",0,pClonk,0,pClonk,0);
}

protected func Aufruf04(id ID,object pClonk)
{
  CloseMenu(pClonk);
  opentalk(pClonk);
  AddMenuItem("Oh, ich danke euch! Hier ist ein wenig Gold. Den Rest bekommt ihr hinterher.","",0,pClonk,0,pClonk,0);
  AddMenuItem("Auf bald!","Gehen",0,pClonk,0,pClonk,0);
  SetGlobal(1,1);
  SetLocal(1,2);
}

protected func Befreit(id ID,object pClonk)
{
  CloseMenu(pClonk);
  opentalk(pClonk);
  AddMenuItem("Habt ihr meinen Sohn schon befreit?","",0,pClonk,0,pClonk,0);
  if(Equal(Global(1),2))   AddMenuItem("Er... Er ist tot...","Gerettet",0,pClonk,0,pClonk,0);
  AddMenuItem("Nein, noch nicht...","Gehen",0,pClonk,0,pClonk,0);
}

protected func Beleidigt(id ID,object pClonk)
{
  CloseMenu(pClonk);
  opentalk(pClonk);
  AddMenuItem("Ich will nicht mit euch sprechen!","",0,pClonk,0,pClonk,0);
  AddMenuItem("Ok...","Gehen",0,pClonk,0,pClonk,0);
}

protected func Nein(id ID,object pClonk)
{
  CloseMenu(pClonk);
  opentalk(pClonk);
  AddMenuItem("*schluchtz* :(","",0,pClonk,0,pClonk,0);
  AddMenuItem("...","Gehen",0,pClonk,0,pClonk,0);
}

protected func Gehen(id ID,object pClonk)
{
  CloseMenu(pClonk);
}

protected func Gerettet(id ID,object pClonk)
{
  SetLocal(1,3);
  CloseMenu(pClonk);
  opentalk(pClonk);
  AddMenuItem("Naja... Trotzdem danke. :(","",0,pClonk,0,pClonk,0);
  AddMenuItem("Tschüss!","Gehen",0,pClonk,0,pClonk,0);
}

protected func EndGehen(id ID,object pClonk)
{
  SetLocal(1,1);
  CloseMenu(pClonk);
  opentalk(pClonk);
  AddMenuItem("Wie kannst du nur?!","",0,pClonk,0,pClonk,0);
  AddMenuItem("Tschüss!","Gehen",0,pClonk,0,pClonk,0);
}

08.04.2008 12:26 von Vorador42:
Dankesehr

07.04.2008 13:54 von N8clonk:
Wirklich sehr nützlich. :)

07.04.2008 12:30 von ClonkBastler:
Nein, beim Auswählen eines Menüeintrags wird das vorhandene Menü geschlossen, sofern man das nicht verhindert.
Der Fehler liegt bei den Einträgen in Menu1(). Als vorletzter Parameter muss noch pClonk übergeben werden.
Zuletzt geändert: 07.04.2008 17:30

06.04.2008 16:22 von mozart:
bekannter Fehler, bei
protected func Aufruf01(id ID,object pClonk)
{
  opentalk(pClonk);
öffnest du ein neues Gespräch, du hast aber schon eins offen.
Die Gespräche überschreiben sich, es erscheint ein leeres Fenster, kein Error

06.04.2008 14:58 von Vorador42:
Sehr gut gemacht! Ich hab jetzt leider ein kleiner Problem. Wenn ich mit dem Clonk mit gleich folgendem Script spreche, dann passiert garnichts mehr, sobald ich sage: "Guten Tag." Kann mir jemand helfen?
Das ist der Script:

/*-- Fremder --*/


#strict
#include

public func ActivateEntrance(object pClonk)
{
  opentalk(pClonk);
  Menu1(pClonk);
  return(true);
}


protected func opentalk(object pClonk)
{
  SetCommand(pClonk,"");
  CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0);
  AddMenuItem("","",GetID(this()),pClonk,0,0,0);
}

protected func Initialize()
{
  SetName("Fremder");
  SetColorDw(RGB(130,100,70));
  return(_inherited());
}



protected func Menu1(object pClonk)
{
  AddMenuItem("Seid gegrüßt!","",0,pClonk,0,0,0);
  AddMenuItem("Guten Tag.","Aufruf01",0,pClonk,0,0,0);
  AddMenuItem("Es tut mir leid, ich muss weiter.","Gehen",0,pClonk,0,0,0);
}

protected func Aufruf01(id ID,object pClonk)
{
  opentalk(pClonk);
  AddMenuItem("Was führt euch her?","",0,pClonk,0,pClonk,0);
  AddMenuItem("Ich suche einen Job.","Aufruf02",0,pClonk,0,pClonk,0);
  AddMenuItem("Es tut mir leid, ich muss weiter.","Gehen",0,pClonk,0,pClonk,0);

}


protected func Gehen(id ID,object pClonk)
{
  CloseMenu(pClonk);
}

06.04.2008 9:45 von ClonkBastler:
Man muss nur die Death-Aktion löschen, die Funktionen Death(),Hurt(), CathBlow(), Damage() und Punch() überladen...
Außerdem noch die Categroy in der DefCore auf C4D_Object ändern, damit der NPC nicht wegfliegt, wenn er von nem Stein getroffen wird...
War mir so schon lang genug ;)
Zuletzt geändert: 06.04.2008 09:46

05.04.2008 22:57 von Kischdel:
LOL..

wenn deine hier beschrieben clonks sterben kann man immernoch mit den Leichen reden :D

ich würde sie unverwundbar machen.. ist ja doof wenn ein händler stirbt, bzw wenn man bei einer leiche einkaufen muss

05.04.2008 18:34 von ClonkBastler:
Wenn du Menu2() von einem Menüeintrag aufrufst, musst du als ersten Parameter die ID übergeben, sonst funktionierts nicht...

05.04.2008 13:15 von Alexander:
Oh, man ich meine doch wenn er Menu 1 durchgesagt hat das er Menu2 Öffen soll das geht net, hab wurklich alles richtig, er macht das was er machen soll nur ohne text, da ist kein Error(Hat kein INet)

04.04.2008 9:40 von SasCh:
Das ist echt toll :D

03.04.2008 20:40 von Berglurch:
werd ich mir gleich mal ein basteln^^

02.04.2008 14:36 von Liech:
2 Menüs auf einmal für das selbe objekt sind nicht auf einmal möglich. Das überläd sich dann.

01.04.2008 13:38 von Alexander:
Ha hab denk ein Fehler indekt!
Alles geht nochmals danke aber keiner macht 2 Menu auf also am anfang da aber wenn Menu2 oder BuyMenu usw. machen will beendet er der das talk, kein error angezeigt.

01.04.2008 13:34 von Liech:
@Alexander:
das dürfte helfen

01.04.2008 9:01 von Gecko:
>Ich glaube, Gecko meinte, dass ich ihn für die Screens verwenden sollte...

Ja!
Aber trotzdem ein Super Tutorial.
Hab's noch ein Bissle erweitert mit SetCommand des Talkers, das ist toll. ;)

30.03.2008 21:30 von Nachtfalter:
Danke für's Tutorial.

30.03.2008 19:18 von ClonkBastler:
protected func OpenTalk(object pClonk)
Klein schreiben, ist ein Datentyp.

30.03.2008 18:24 von Alexander:
Em, jetzt funzt es aber nur noch:

protected func OpenTalk(Object pClonk)
{
SetCommand(pClonk,"");
CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0);
AddMenuItem("","",GetID(this()),pClonk,0,0,0);
}

Stimmt was net C4Scripter 0.9.9 funzt net, schor früher probirt.

30.03.2008 17:31 von ClonkBastler:
Ich glaube, Gecko meinte, dass ich ihn für die Screens verwenden sollte...

30.03.2008 17:18 von JaeB_:
Gecko:
  C4Scripter 0.9.9 (CC)
  C4Scripter 0.71 (CCAN)

30.03.2008 16:42 von ClonkBastler:
Ah, nach else Menu1(pClonk) fehlt auch noch ein ;. else Menu1(pClonk);

30.03.2008 16:17 von Alexander:
Allso das ist alles mein Letzten Kommtetar ist 1 und das 2 also wiso geht es net ClonkBastler

protected func Menu2(object pClonk)

{
AddMenuItem("Ich seh das eins hast...","",pClonk,0,0,0);
AddMenuItem("Tüß!","EndTalk",0,pClonk,0,pClonk,0);
}
protected func GiveFlint(id ID, object pClonk)
{
CreateContents(FLNT,pClonk);
EndTalk(0,pClonk);
}

protected func EndTalk(id ID, object pClonk)
{
CloseMenu(pClonk);
}

protected func OpenTalk(Object pClonk)
{
SetCommand(pClonk,"");
CreateMenu(GetID(this()),pClonk,0,C4MN_Extra_None,GetName(),0,C4MN_Style_Dialog,0);
AddMenuItem("","",GetID(this()),pClonk,0,0,0);
}

30.03.2008 16:08 von ClonkBastler:
Hast du Menu2() auch?

30.03.2008 15:03 von Alexander:
Trotzdem Error.
Aber mein fehler mit ;

30.03.2008 14:33 von Konsti:
Du hast bei OpenTalk(pClonk) und Menu1(pClonk) kein ; hinten drangemacht. Es sollte also OpenTalk(pClonk); und Menu1(pClonk); heißen.

30.03.2008 14:17 von Alexander:
ERROR: syntax error: see previous parser error for details.
by: OpenTalk(Gesil #107) (obj Richard #103) (Händler.c4d\Script.c:43)
by: ActivateEntrance(Gesil #107) (obj Richard #103) (Händler.c4d\Script.c:0)

Das ist es!!
Help.

Hir:

public func ActivateEntrance(object pClonk)
{
OpenTalk(pClonk)
if(FindContents(FLNT,pClonk)) Menu2(pClonk);
else Menu1(pClonk)
return(true);
}

protected func Menu1(object pClonk)
{
  AddMenuItem("Hallo Wilst du einen Flint?","",0,pClonk,0,0,0);
  AddMenuItem("Ja!","GiveFlint",0,pClonk,0,pClonk,0);
  AddMenuItem("Nein.","EndTalk",0,pClonk,0,pClonk,0);
  return(true);
}
Zuletzt geändert: 30.03.2008 14:22

30.03.2008 3:14 von DarkyDonut:
SEHR SCHÖN!
Hätt ichs mir nur durchgelesen...

29.03.2008 23:08 von Milkman:
ich finde das tut ganz gut, obwohl man alternativ auch den schon vorhandenen talker benutzen könnte.

29.03.2008 23:04 von Gecko:
C4Scripter? frown

29.03.2008 17:58 von Liech:
Alexander:
Das liegt vermutlich daran das du die Verttices gelöscht hast. Kopiere einfach nochmal Defcore.txt vom orginal clonk rein und ändere die ID.

29.03.2008 17:40 von ClonkBastler:
2 Tage nur ;)

29.03.2008 17:23 von Elfangor:
omg das muss ja arbeit gewesen sein mit den vielen screens.. schaut gut aus

29.03.2008 16:37 von Alexander:
Em my clonk geht durch alle Metriale ,fehler so, hilft jemand mir(DefCore)

29.03.2008 14:25 von ClonkBastler:
@Wipfhunter:
Theoretisch sollten NPC's das auch nicht tun. Günther allerdings schon. Ich ergänze das mal eben. Dankeschön.

29.03.2008 13:17 von Darksimi:
Gut, wenn mein Clonk wieder läuft probier ichs mal aus ^^

29.03.2008 13:08 von Torben:
sehr super mega praktisch (=

29.03.2008 13:07 von Liech:
Schönes tutorial. Jedoch sollte der funktion Initialize() noch damit der clonk auch korrekt reagiert (zb. wenn man ein stein auf ihn wirft das er dann durch die gegend trudelt und keine statue bleibt) am ende return(_inherited()); anfügen.

Durch _inherited() wird eine "überladene" funktion aufgerufen, in dem fall das was im clonk script steht. (Nämlich SetAction("Walk"); )

Wäre gut wenn du das noch oben erklärst.

29.03.2008 11:23 von Simsi:
ich find das tut echt gut gemacht, gibts da vllt au ne weiterführung weil du hast gesagt dass wir das #include im clonk vllt noch brauchen das fänd ich dann gut wenns noch ne fortsetzung gäb

29.03.2008 9:53 von Plüschtroll:
tolles tutorial!

29.03.2008 9:11 von Melmier:
Des is aber genial gemacht, ich bin zwar scripttechnisch ein noob, weswegen ich mich da goa naut nei vertiefen will, aber für die die sowas machen wollen genial!

29.03.2008 7:51 von Methos:
>ohne euch wäre clonk nicht das was es heute einmal ist



>Niwohlos!


Niwoh ungleich Niveau.

28.03.2008 23:22 von Deffi:
>ohne euch wäre clonk nicht das was es heute einmal ist


Niwohlos!

28.03.2008 22:04 von ClonkBastler:
*Da-noch-keine-100-Clunker-hab-neuen-Kommentar-schreib*
Ja warum denn nicht? Nach else kann man auch einen ganzen Block schreiben, und so sparen wir noch zwei geschweifte Klammern... ;)

28.03.2008 21:58 von ClonkBastler:
Das Tut ist auch eher für Anfänger gedacht, ich wollte da nicht gleich auf #include/#appendto zurückgreifen...

28.03.2008 21:55 von Cäsar:
Toll, aber irgendwie ärgerts mich, dass da so viele Clonks erzeugt werden...
else lässt sich öfters schachteln?
"else if" <- Das haut mich jetzt um.
Zuletzt geändert: 28.03.2008 21:58

28.03.2008 21:44 von ClonkBastler:
@Luchs:
Ich habe zwar C4Scripter, benutzte ihn aber nie. Ich hab das ganze selbst zum ersten Mal gemacht und wollte vorher nicht die ganzen Optionen ändern und mich mit C4Scripter zurechtfinden zu müssen... Sry.

28.03.2008 21:34 von mozart:
*niederknie*
warum kann man texte nicht bevoten?
[+][+][+][+][+] wenns möglich wär

28.03.2008 21:30 von Luchs:
Wenn du schon Editorscreenshots machst, warum nicht gleich mit irgendeinem Editor, der sinnvolles Syntaxhighlighting macht? :/

28.03.2008 20:55 von Kanibal:
Günther der Hacker! loool boogie

28.03.2008 20:01 von Miniwipf:
Lustige Idee, dass man von matthes den Auftrag bekommt, Günther zu töten. Solche realitätsnahe RPG's sind selten und sollten umbedingt gefördert werden! laugh Mal sehen, ob Günther damit auch einverstanden ist xD

28.03.2008 19:49 von NC-Jeyfan:
Ich bin zwar kein großer Clonk fan, spiele aber Clonk immer wieder gern wenn ich mal Zeit habe, ich Bastel gerne Maps im Editor zusammen und hab schon manhe große Scenarien fertiggestellt wo mein Cousen und mein kleiner Bruder nur staunen und sie nur eins sagen können "Woher hat er diese Ideen", doch nichts wäre ich, wäre Clonk-Center nicht da, unzählige maps konnt dank euch hier downloaden, und jetzt erklärt ihr sogar wie man so manche sachen im script machen kann, dankeschön kann ich da nur sagen, ohne euch wäre clonk nicht das was es heute einmal ist, danke =)

28.03.2008 19:41 von Methos:
CNDG ist cooler.

28.03.2008 19:37 von Speed:
hrr jez mach ich ne ki händler für funszen :> haha cs sounds sind drinnen O_o (mojnster ,ultra kill und so lol)

28.03.2008 19:36 von Deffi:
Hm, nett gemacht :)

28.03.2008 19:26 von Käse:
Sei gepriesen! :D

28.03.2008 18:25 von Speed:
schaut doch gut aus :D