Entwicklertagebuch - [OC] Projekt Maddino.

Liebe Community!

Inspiriert durch den kürzlich von Shadow eröffneten Blog, möchte auch ich künftig meine Erfahrungen, die ich beim Entwickeln sammle, mit euch teilen. Eigentlich hatte ich nichtmehr vor für Clonk zu entwickeln (außer es wäre nochmal ein Wettbewerb gekommen). Aber die Ereignisse der letzten Zeit und das damit verbundene “Erwachen” der Community hat noch einmal die Motivation in mir geweckt. :tongue: Doch statt CR soll es diesmal OC sein, mit dem ich mich beschäftige!

Warum Projekt “Maddino”?
Ich habe geplant in etwa 6 Szenarien zu entwickeln. Da diese keinem bestimmten Genre zuzuordnen sind und einfach nur dem entsprechen, was ich gerne in Clonk spiele, habe ich das Projekt Maddino genannt. Das Grundkonzept steht, da ich schon länger geplant hatte, so etwas zu machen.
Die Szenarien sind:

Rumble de Dumble - Mircomelee, so ähnlich wie Kampf der Katapulte in CR - aber mit Kanonen!  Stand: BETA
Fast-Food-Fight - Micromelee  Stand: BETA
Kleines Gemenge - Micromelee  Stand: 5%
Robinson Clonker - Siedlung Stand: 1%
Stonewall - Melee - Capture the Flag  Stand: 0%
Medieval Arena - feat. Stormhunter - Rollenspiel Melee?  Stand: 0,1%
Straight to Heaven  - Siedelmelee  Stand: 0%

Welchen Zweck soll dieser Blog erfüllen?
Ich hätte gedacht, dass sich das Ganze so entwickelt wie bei Tflk3 der mit seinem Blog “Bitte um Hilfe mit script” immerhin 119 Posts schaffte. Also soll das Ganze auf der einen Seite die Aktivität meinerseits erhalten. Auf der anderen Seite bin ich noch recht unerfahren mit dem OC-Script. Hier kann ich meine Fragen stellen, falls ich gerade keine Zeit habe, um im IRC auf eine Antwort zu warten. Außerdem gibt es hier Zapper, Sven und co. welche sich bestens mit OC auskennen dürften. Für mich ist der Umstieg von Pascal auf OC-script nicht kinderleicht und so schleichen sich öfter mal kleine Fehler ein, was u. a. Zapfer schon miterleben durfte. :tongue:
Außerdem hoffe ich durch den Blog den ein oder anderen Betagtester von Zeit zu Zeit zu finden!

Wieso OC?
Ich denke jetzt nach der Schließung des CF hat es noch weniger Sinn für CR zu entwickeln. OC hingegen bietet neue Herausforderungen und Möglichkeiten! Hier gibt es noch nicht so viel Content, wodurch man seinen Ideen freien Lauf lassen kann. Außerdem hatte ich daran gedacht, ab und zu ein begleitendes Tutorial zu schreiben. Da OC größtenteils auf englisch supportet wird, könnte sich das als nützlich erweisen. Damit angefangen, hatte ich ja schonmal.

Wer ist dieser Maddino überhaupt?!
In Wirklichkeit heiße ich Maximilian und bin 18 Jahre alt. Seit 2008 bin ich nun schon bei Clonk dabei! Der Höhepunkt meiner Laufbahn bei Clonk war der 3. Platz beim Let’s Rock Wettbewerb von 2012. Momentan bin ich am Beenden meines Abiturs, um danach Wirtschaftsmathematik zu studieren. :happy:

Ist schon was fertig?
Maddino Version 0.1 BETA

Hallo Maddino!

Freu mich auf neuen Content, vielleicht mit ein paar netten Testrunden. OC Go!

OC braucht content, content, content!
Freut mich dass du so was machst, und hey, vielleicht motiviert das hier ja mehr Leute, sich mal in OC einzuarbeiten :wink:

Schön zu hören dass sich jetzt auch Entwickler an OC wagen!

Falls du (mehr) Feedback willst kannst du das Projekt auch gerne in das Deutsche Subforum von OC vorstellen.

Hört sich schonmal gut an das Ganze, und ein paar mehr Melees für OC wären sicherlich nicht schlecht wo Sven die Liga langsam zum laufen bringt.

>Hört sich schonmal gut an das Ganze, und ein paar mehr Melees für OC wären sicherlich nicht schlecht wo Sven die Liga langsam zum laufen bringt.


Oh es wird an der Liga gearbeitet :shocked: Wusste ich noch gar nicht! Wisst ihr schon in etwa wann ihr sie freigeben wollt?

Eine Testliga laeuft schon, aber bis das ganze dann auch alles mit einem neuen Release funktioniert dauert wahrscheinlich noch 1-2 Monate.

Sven2 kann dir bestimmt mehr erzaehlen, oder er sollte mal ein Blogpost erstellen :happy:

Presented by and auf clonkspot™!

…allerdings voraussichtlich nur die CR-Liga.

Ich wünschte ich hätte auch die Zeit mich mal so richtig mit OC zu befassen!
Allerdings bremsen mich meine ganzen anderen "Nicht-Clonk"-Projekte aus…

Bin jedenfalls sehr gespannt. Denn das was imho OC noch so richtig fehlt ist Content und Leute die diesen Content spielen.

static Sword2;

func Initialize()
{
  Sword2 = CreateObject(Sword, 475, 169);
  Sword2 -> SetR(180);
  Sword2 -> SetPosition(474, 159);
  Sword2 -> SetProperty("Collectible",0);
}

func RelaunchPlayer()
{
  Sword2 -> Fling(0,-6); 
  Sword2 -> SetRDir(12,10);
  Schedule(Sword2, SetSpeed(0,0,1), 200, 0);
}


Ich bin gerade am Entwickeln einer tollen Animation die ausgeführt wird, wenn ein Spieler stirbt. Das Problem liegt bei SetSpeed.
Die Engine sagt mir:
[17:57:48] ERROR: SetXDir: must be called from object context.
[17:57:48]  by: Scenario->SetSpeed(0,0,1) (System.ocg\Object.c:11)

Ziel ist es ein Schwert in der Luft rumwirblen zu lassen (mit tollen Partikeln!!). Doch wenn es wieder auf den Boden aufkommt, rutscht es weg, statt stehen zu bleiben. Wollte ausprobieren, wie ich das mit SetSpeed timen muss, um es zu verhindern. Verstehe aber jetzt diesen Error nicht.

>Schedule(Sword2, SetSpeed(0,0,1), 200, 0);


Du rufst hier SetSpeed direkt auf, deshalb hat es keinen Objektkontext. Du willst vermutlich eher einen String mit der Funktion übergeben.

Kann OC schon Funktionspointer/Closures?

Bei einem Funktionsaufruf werden immer alle Parameter sofort ausgewertet (wie in allen anderen Programmiersprachen auch!).
Wenn du also Schedule(…, Foobar(),…) benutzt, dann wird als allererstes "Foobar()" ausgewertet. In deinem Fall eben "SetSpeed". Und das alleine geht nicht aus dem selben Grund, warum du auch überall vorher "Sword->" dazuschreiben musstest: es fehlt sonst das Bezugsobjekt! Vom Szenario kannst du die Geschwindigkeit so jedenfalls nicht ändern :slight_smile:

Wenn du Schedule benutzen willst um einfach globalen Code auszuführen wäre das in deinem Fall zB
Schedule(nil, "Sword2 -> SetSpeed(0, 0, 1)", 200, 0); // weil Sword2 eine globale Variable ist
oder vllt sogar (ungetestet):
Schedule(Sword2, "SetSpeed(0, 0, 1)", 200, 0);

Du könntest auch ScheduleCall benutzen, was eine Funktion in einem Objekt aufruft (in dem Fall werden die Parameter spaeter übergeben):
ScheduleCall(Sword2, "SetSpeed", 200, 0, 0, 0, 1);

>Kann OC schon Funktionspointer/Closures?


Per Günther's latest work™ schon

Jap hattest Recht. Muss ein Sting sein!

func Initialize()
{
  Sword2 = CreateObject(Sword, 475, 169);
  Sword2 -> SetR(180);
  Sword2 -> SetPosition(474, 159);
  Sword2 -> SetProperty("Collectible",0);
}

func AnimationStop()
{
  Sword2 -> RemoveObject();
  Sword2 = CreateObject(Sword, 475, 169);
  Sword2 -> SetR(180);
  Sword2 -> SetPosition(474, 159);
}

func RelaunchPlayer()
{
  Sword2 -> Fling(0,-6); 
  Sword2 -> SetRDir(12,10);
  Schedule(Sword2, "AnimationStop()", 58, 0);
}


Wollte ich jetzt so lösen. Bekomme aber einen Haufen solcher Errors:
[18:57:56] ERROR: unknown identifier: AnimationStop (Objects.ocd\Items.ocd\Weapons.ocd\Sword.ocd\Script.c:337:1)
[18:57:56]  by: Object(1)->FxIntScheduleTimer(Object(1),{Name = "IntSchedule", Repeats = 0, Script = "AnimationStop()"}) (System.ocg\Schedule.c:29)


Warum kennt die Engine AnimationStop nicht?

Hat sich Zapper zum Dank geklärt:

Schedule(nil, "AnimationStop()", 58, 0);

ist die Lösung. Habe AnimationStop() im Objekt aufgerufen, die Funktion ist aber im Szenario definiert! :wink:

Ist es bei OC eigentlich möglich, die einzelnen Inventarplätze auf Inhalt zu untersuchen? Ich werde aus Contents() nicht ganz schlau… steht der index für den einzelnen Inventarplatz?

Da musst du vermutlich im Script des Clonks selbst nachgucken - Contents() hat keine Löcher.

clonk->GetItem(i) gibt dir das Item an der Stelle i
clonk->GetItemPos(item) gibt dir die Position vom item

Wenn du in OC durch alle Inventarobjekte vom Clonk durchgehen willst, geht das zB so:
for (var item in clonk->GetItems()) // tu was mit item

Oder allgemeiner für alle Objekte:
var item, i=0;
while (item = clonk->Contents(i++)) // tu was mit item

Hey! Das ist genau das was ich gesucht habe :birthday::birthday:

Warum steht das nicht in der Docu?

Weil die Dokumentation primär globale Funktionen dokumentiert, die größtenteils in C++ in der Engine implementiert sind. Für sowas spezifisches wie das Clonk-Inventarmanagement kann ja jeder problemlos einfach im entsprechenden Skript nachgucken.