Tehadon

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite Zurück  1, 2, 3 ... 5, 6, 7 ... 10, 11, 12  Weiter

Worklogs Tehadon

2 Jahre Tehadon

Mittwoch, 12. November 2008 von peacemaker
Ave,

Lange Zeit schon, habt ihr nichts von uns gehört, aber wir leben noch. Und natürlich haben wir weiterhin an Tehadon gewerkelt, aber wir dachten uns, einmal ein bisschen mit Informationen zu geizen. Das tut jetzt aber nichts zur Sache.

Vor genau 2 Jahren, begann ich im Stillen mit der Entwicklung eines Mega-Projektes schlechthin. Ich hatte verdammt grosse Ziele, ein paar davon erscheinen mir heute noch viel zu gross, aber was Tehadon von den üblichen Mega-Projekten unterschied, war, das ich zuerst einige Zeit geplant hatte.
Eigentlich gibts Tehadon schon wesentlich länger, anfangs entwickelte ich jedoch an einen Prototypen, der bei einem Festplattencrash verloren ging.
Nun, ich begann also, im Stillen zu werkeln. Zunächst mal lange Zeit alleine. Hier ein Bild von dieser Anfangszeit von Tehadon. Es ging vielleicht ein halbes Jahr so weiter, bis grosserboss, der noch heute dabei ist, ins Team kam. Zu dieser Zeit sah Tehadon schon etwas anders aus, hier findet ihr ein paar Bilder von dieser Zeit.

Die Zeit verging, Tehadon wurde grösser, das Konzept kriegte einige Änderungen, Systeme wurden verworfen und neugeschrieben, und auch der Grafikstil änderte sich. Davon bemerkt man noch heute einiges, da es durchaus Unterschiede zwischen den heutigen Meshes und denen von früher gibt.
So wuchs sowohl Tehadon, als auch das Team, und irgendwann eröffneten wir ein kleines Forum. Es war mehr als internes Forum gedacht, aber trotz allem kamen ein paar wenige Leute zusammen.
Tehadon wurde publik gemacht.
Das war vielleicht im Frühling 2007, wenn ich micht irre. Das Team zählte zu dieser Zeit 3 Leute.
Und wieder verging Zeit, das Forum bekam Userzuwachs. Auch sonst gab es einige Umstrukturierungen, dennoch war das ursprüngliche Ziel geblieben: ein storylastiges RPG, mit genug Spannung und Action, sowie viel Atmosphäre.
Auch das Team zählte mittlerweile 5 Leute.

Dann, irgendwann im Frühjahr 2008 passierte etwas, was nicht hätte sein sollen. Irgendjemand hat unser Forum, samt Webseite gelöscht. Auf das wie und warum geh ich jetzt nicht ein, fest steht jedoch, das dies eine schwierige Phase war. Wir hatten kein Forum, keine Webseite, unser Motivation war tief unten. Aber ans Aufgeben dachte natürlich keiner. Glücklicherweise hatte ich 2 Monate alte Backups vom Forum.
Wir haben schon früher ein Angebot vom Forenberg gekriegt. Eine Fusion, so schlug man uns vor. Dieses Ereignis liess uns dann dieses überaus freundliche Angebot annehmen, sodass wir Teil des Forenbergs wurden.

Dazu noch ein Kommentar meinerseits. Wie gesagt, ich hatte noch die 2 Monate alten Backups des alten Forums, und so versuchte Nexan diese ins neue Forum einzuspielen. Es sah zuerst sehr schlecht aus, anscheinend waren die Backups fehlerhaft. Und doch schaffte es Nexan irgendwie die Backups zu retten. Ich bin ihm noch heute dankbar dafür :biggrin:

In letzter Zeit wurden wir vermehrt aufgefordert, endlich mal etwas interaktives oder bewegendes rauszubringen. Nun, um zu zeigen das Tehadon auch nach 2-Jähriger Entwicklung nicht fertig ist, sind wir dieser Aufforderung nachgekommen.
Zu einer Demo hats nicht gereicht, ich hoffe jedoch trotzdem, das euch das kleine Gameplay-Video, das wir gemacht haben, gefällt. Ihr seht eine kleine Location mit einer kleineren Quest und noch diverse kleine Systeme mehr. Es soll keine Grafikdemo sein, die Map wurde recht schnell erstellt, die Meshes passen nicht zusammen, die Animationen sind grössenteils noch WIP.
Wen die Technik dahinter interessiert, soll noch etwas warten, ich werde demnächst das komplette HDSS-Skript rausgeben, und auch eine kleine Erklärung diesbezüglich.

Also, hier (ca 60 mb gross) das Video. Die Qualität ist etwas schlecht, und auch sonst will ich mich wegen dem Vista-Warte-Icon entschuldigen. (Jo0oker hat das Video gemacht) Wir geben demnächst vlt noch ne Version mit besserer Qualität raus.


Nun gut, auf das Tehadon gedeihe.
mit freundlichen Grüssen,
das t-team.

der Kampf gegen die Bugs

Dienstag, 4. November 2008 von peacemaker
So, heute ein kürzerer Eintrag.

Ich arbeite ja atm an der externen KampfAI (geskriptete, erste Version) und dabei sind einige HDSS-Bugs hervorgekrochen. Na gut, so habe ich mich wieder in die Dichten des HDSS-Kompilers gewagt und den Käferchen den Kampf angesagt.
Ich konnte ein paar von desselbigen ins Nirvana befördern, aber es bleiben immernoch genug.
Das Kampfskript schaut mittlerweile etwa so aus:

Code: [AUSKLAPPEN]

void checkStates ()
{
   $user = getState ($this->target); // Gegnerstate ermitteln
   var $zufall;
   $zufall = rand (1,2);
   
   if ($user == 16)
   {
      if ($zufall==1)
      {
         $this->clearStateQueue();
         $this->addState (18,"");
         $this->addState (16,"");

      };

      if ($zufall==2)
      {
         $this->clearStateQueue ();
         $this->addState (19,"");
         $this->addState (16,"");
         $this->addState (18,"");
      };
   };

   // geht nach rechts
   if ($user == 19)
   {
      $this->clearStateQueue ();
      $this->addState (18, "");
      if ($zufall == 1)
      {
         $this->addState (19,"");
      };
      $this->addState (16, "");
   };

   // geht nach links
   if ($user == 18)
   {
      
      $this->clearStateStack ();
      $this->addState (18, "");
      $this->addState (19, "");
      $this->addState (16, "");

      if ($zufall == 1)
      {
         $this->addState (18,"");
      };
   };
};

Also, diese Funktion "checkStates" wird jeweils aufgerufen, wenn die State-Queue des NPCs während eines Kampfs LEER ist, d.H. er all seine "Aufträge" im Kampf erledigt hat.
Die Funktion wird implizit mit dem Parameter $this aufgerufen, dieser beinhaltet die NPC-Instanz.

Ich habe die Konstanten wieder weggenommen, und werde sie demnächst nocheinmal inplementieren, jedoch mit der Möglichkeit sie extern zu definieren.
Auch Includes kommen demnächst wohl wieder dazu, sowohl das inkludieren einzelner Files, als auch der #includeDir-Befehl welcher das inkludieren ganzer Ordner möglich macht. (Praktisch für z.B. NPC-Ordner, wo jeder NPC ein eigenes skript hat)
Aber zuerst kommen noch ein paar HDSS-Bugs weg.

mfG

zurück aus der Versenkung

Donnerstag, 30. Oktober 2008 von peacemaker
So, nach langer Zeit, bin ich zurück aus der Versenkung.
Das ich so wenig schreibe liegt nicht daran, das Tehadon eingeschlafen ist, sondern ich kaum Zeit finde Worklog-einträge zu machen und es seit Wochen vor mir herschiebe.
Na gut, ich verfasse heute trotzdem einen, aber nicht zu lang.

So, was ist denn so geschehen? Ziemlich viel, nur erinnere ich micht nicht so genau. Hört sich etwas komisch an, aber es sind wirklich viele kleine Sachen gewesen, und sowas vergisst man schnell.

Eine erste Version des Spieler-Tagebuchs habe ich reingemacht. Es ist sehr simpel, aber es tut seinen Zweck. Neue Einträge fügt man per HDSS ein:
Code: [AUSKLAPPEN]

DIARY_AddEntry ("Wetter", "Heute ist das Wetter ja schön \n");
DIARY_AddToEntry ("Wetter", "Na gut, ich hab meine Meinung geändert. Das Wetter ist grässlich\n");

Ersteres erstellt einen Eintrag, zweiteres erweitert ihn. Dieses \n bewirkt eine neue Zeile.
Nur haben es Tagebucheinträge an sich, oft länger zu sein. Und das direkt ins Skript zu schreiben ist auch nicht so eine gute Idee, wesshalb ich den Befehl ReadFileLine gemacht habe. Dieser Befehl lädt eine Datei, liefert die erste Zeile zurück, und schliesst es anschliessend wieder.

Dann hab ich noch ne Sound-Klasse in HDSS inplementiert. Diese funktioniert etwa so:
Code: [AUSKLAPPEN]

var $sound;
$sound = new (SFX);
$sound->load ("data\sfx\testSound.wav");
$sound->play (); // Spielt den Sound ab


So wie es ausschaut, werden wir viele sachen explizit mit HDSS machen. So zB. die Texturierung der Terrains, oder das Sound-System, usw. So kam auch auf die Idee, die Kampf-KI etwas mehr nach aussen zu verlagern.
Folgendes habe ich schon hingekriegt:
Code: [AUSKLAPPEN]

void checkStates ()
{
var $zufall;

if ($otherState == AI_FIGHT_ATTACK_SHORT)
{
// Statequeue leeren
$this->clearStateQueue ();
$zufall = rand (1,2);
if ($zufall == 1)
{
$this->addState (AI_FIGHT_GO_LEFT, ""); // nach links ausweichen
$this->addState (AI_FIGHT_ATTACK_SHORT, ""); // anschliessend angreifen
};
//
if ($zufall == 2)
{
$this->addState (AI_FIGHT_PARADE, ""); // abwehren
$this->addState (AI_FIGHT_GO_RIGHT, ""); // nach rechts ausweichen
$this->addState (AI_FIGHT_ATTACK_SHORT, ""); // anschliessend angreifen
};
};
};

Was ist dieses $this->addState() ? Ich habe ja im letzten Eintrag erklärt, das die NPCs eine sog. State-Queue benutzen.
Eine Queue ist ... eine Warteliste. Wir fügen jetzt ein in diese Warteliste eine Anweisung hinzu. Der NPC ackert jetzt diese Anweisungen ab, zuerst das vorderste (das zuerst hinzuegfügte). Ist das getan, werden alle nach unten verschoben.
Es ist ein sehr einfaches Prinzip, aber ziemlich effektiv, da die NPCs so während den Kämpfen wirkliche "Taktiken" verfolgen können.
Hier nochmal der Codeausschnitt von letztes Mal.
Der Befehl AI_MoveStateUp () verschiebt alle States um eins nach oben.

Die Kämpfe sehen noch nicht soo gut aus, das liegt aber mehr an den Animationen, bzw. daran, das die Hotspots noch sehr ungenau und hardcoded sind.
Natürlich kommt auch hier demnächst entsprechendes HDSS-Zeugs rein.

Für die Non-Programmierer die jetzt kein Wort verstanden haben, Bilderchen:

user posted image

Ein NPC beim benutzen eines IAOs.
user posted image

Und hier 3 NPCs die am Lagerfeuer sitzen und nichts tun.
(Die Füsse werden noch verbessert)

Übrigens können NPCs jetzt auch saufen. Das heisst, wenn ein Item das entsprechende Flag hat, wird beim benutzen einfach getrunken, und in dem Moment, in welchem getrunken wird, die onUse-Funktion des Items aufgerufen.
Das Zeugs mit $this und $user funktioniert auch.

Code: [AUSKLAPPEN]

void onUse_item ()
{
message ($user->name); // NPC-Name
message ("trink gerade ");
message ($this->name); // Item-Name
};


Es gibt noch ein paar dinge mehr, aber die spar ich mir für den nächsten Eintrag auf.

mfG

burn burn burn

Sonntag, 5. Oktober 2008 von peacemaker
Guten Tag allerseits,

Der letzte Eintrag liegt wieder eine Zeit zurück, also poste ich mal wieder ein paar Errungenschaften.
Das erste ist, das ich endlich Partikeleffekte eingebaut habe. Habs lange vor mir hergeschoben, aber nun wurde es Zeit. Die passende HDSS-Klasse gibts dazu auch schon: PFX.
Also, die Partikeleffekte lassen sich 100% extern erstellen. Die kann man dann mit lustigen Quests verknpüpfen, oder sonst jedwelchen Events.

Dieses Skript:
Code: [AUSKLAPPEN]
$path="data\gfx\particle\Particle_008.png";
$fire = new (pfx);
$fire->interval = 1;
$fire->emitterlifetime = (-1);
$fire->texture = $path;
$fire->setParticleLifetime (10, 25);
$fire->setParticleSize (60, 140);
$fire->alphavel = 1;
$fire->setTemplateColor (255,255,0,255,0,0);

// den PFX bei einem Waypoint positionieren
PFX_InsertWP ($fire, "TEST_WAYPOINT");

würde im Spiel drin so ausschauen:

user posted image

Nichts grosses, aber es funktioniert und öffnet wie gesagt einige neue Questmöglichkeiten.
Allzu viel habe ich sonst nicht gemacht. Ein paar NPC-Methoden in HDSS inplementiert, die State-Machine abgeändert... ungefähr das.
Aus Faulheitsgründen will ich hier nicht erklären wie das State-Zeugs funktioniert, sondern zeige euch
den Codeauschnitt dazu.

user posted image


Ansonsten ist nicht allzu viel geschehen. Ein paar kleine Dinge am Quest-system, ein paar am Dialogsystem.


mfG

Quests, Dialoge, IAOs, ...

Samstag, 20. September 2008 von peacemaker
Guten Tag,
Heute habe ich wieder einige Dinge eingebaut / verändert / neu gemacht.
Zu allererst das Quest-System. Quests lassen sich nun per HDSS skripten. Ich habe mehrere Dinge damit schon getestet, auch mehrteilige Quest lassen sich mit dem Event-basierten System sehr leicht machen.
Wenn wir in der Editing-Phase eine gute Arbeit leisten, werden die Quests von Tehadon recht interessant. Aber das ist noch in Ferne. Jedenfalls bietet das Questsystem alle Dinge, die wir brauchen.
So, wie erstellt man eine Quest? Eigentlich genau gleich wie früher.
Code: [AUSKLAPPEN]

// eine Testquest:
var $testQuest;
$testQuest = new (quest);
$testQuest->name = "Der verlorene Trinkbeutel";
$testquest->onStart = fref (testQuest_onStart);
$testQuest->onRun   = fref (testQuest_onRun);
$testQuest->onSolved= fref (testQuest_onSolved);

Also, zuerst wird eine Instanz der Quest-Klasse erstellt. Eine leere Quest. Dann wird der Quest ein Name verliehen. Dieser Name erscheint z.B. im Questlog / Tagebuch.
So, dann noch die 3 Hauptevents. onStart wird einmalig beim Annehmen der Quest ausgeführt. onRun wird solange die Quest aktiv ist ausgeführt. onSolved hingegen wird ausgeführt, wenn die Quest erfolgreich gelöst wurde. onFailed wenn sie gescheitert ist. Dieses fref () liefert eine Art Zeiger auf eine Funktion. (Referenz). Also, die Quest wurde erstellt. Und jetzt die Events:

Code: [AUSKLAPPEN]

// beim annehmen
void testQuest_onStart ()
{
 message ("Du hast die Quest angenommen!");
};
// während der Aktivität
void testQuest_onRun ()
{
 if (keyhit (57)==1)
 {
  $this->state = GET_QUEST_STATE ("QUEST_STATE_ON_SOLVED");
 };
};
// beim erfolgreichen Lösen
void testQuest_onSolved ()
{
 message ("Du hast die Quest gelöst");
};

Ich glaube da benötigt es keine Erklärungen. Die Quest ist gelöst, wenn der Spieler die Leertaste drückt.
So, jetzt müsste das ganze im Questlog untergebracht werden. Für einen Questlog brauch ich aber ein Listview-GUI-Element. Das werde ich dann demnächst machen.

Nächster Punkt: Dialoge.
Jaa, wir hatten schon ein Dialog-System. Das jetzige ist eigtl genau gleich. Nur das es keine DIALOGFUNCs mehr gibt, sondern das ganze direkt über normale Funktionen gemacht wird.
Ich erkläre nicht allzu viel, hier ein kurzes Beispiel:
Code: [AUSKLAPPEN]

var $dialog;
$dialog = new (dialog);
$dialog->start = fref (start);

void start ()
{
 NPC_Say ("Wie gehts dir?");
 AddChoice (fref (gut), "gut");
 AddChoice (fref(schlecht), "schlecht);
}

void gut ()
{
 NPC_Say ("Gut so.");
 AddChoice (fref (end), "[ENDE]");
}
void schlecht ()
{
 NPC_Say ("Das ist nicht gut.");
 AddChoice (fref (end), "[ENDE]");
}

void end ()
{
 CloseDialog ();
}

Bild dazu:

user posted image

Na gut, noch ein Punkt: IAOs. Das IAO-System ist drin, es funktioniert auch noch. IAO? Interactive Objects. Eine Bank, ein Schleifstein, ein Katapult, ein Ambos, ein Kochtopf, etc.

Hier ein Script welches ich schonmal gezeigt habe:
Code: [AUSKLAPPEN]

// IAO
var $bench;
var $user;

$bench = new (IAO);
$bench->mesh= loadMesh ($mod->meshDir."IAO_Bank_01.3DS");
$bench->name= "Bank"; // Fokus-Name
$bench->range= 200;// Aktions-Radius

void $bench :: onStart ()
{
if (B3DDistance3D ($user->entity,$bench->activeWP) > $bench->range)
{
$user->gotoWP ($bench->activeWP);
addTrigger (pos($user->targetWP), ref($bench::onArrive));
} else {
$this->onArrive ();
};
};

void $bench :: onArrive ()
{
$user->alignToEntity ($this->mesh);
$user->sit ();
};

void $bench :: onEnd ()
{
$user->standUp ();
};


So, das ergebnis von desselbigen.
Kommt man in die Nähe wird der Fokusname angezeigt:

user posted image

Ein Mausklick nun, und der Herr da oben sitzt ab. Wie gesagt, man muss nur einmal klicken. Das umdrehen und absitzen machts von alleine.
Für das aufstehen noch einmal klicken.
Das Sitzen sieht dann so aus:

user posted image

Dann habe ich noch ein kleines Featurchen eingebaut: NPC-Environement-Dialoge. Kommt man einen NPC nahe, lässt er ab und zu einen Spruch ab, meist eher sinnlos aber es lässt die NPCs etwas leben.
Der 3D-Sound funktioniert leider immer noch nicht, warum auch immer.
Um so ein Kommentar hinzuzufügen:

Code: [AUSKLAPPEN]

var $npc;
$npc = new (npc);
// ...
// ...
$npc->addEnvDia ("hrr_verschwinde.wav");
$npc->addEnvDia ("ich_hasse_mein_leben.wav");
$npc->addEnvDia ("verschwinde_ich_hab_schlechte_laune.wav");


mfG Smile

Items und so.

Donnerstag, 18. September 2008 von peacemaker
So, weiter gehts.
Das erste was ich heute gemacht habe, sind Items in HDSS reingemacht. D.H. man kann jetzt Items per HDSS erstellen. Und ja, es funktioniert auch sehr gut.
Und was ich auch gleich gemacht habe, sind die beiden Events 'onPickUp' und 'onUse'. Ersteres wird aufgerufen wenn man das Item vom Boden aufnimmt, zweiteres wenn man es benutzt. Dafür musste ich zuerst noch sog. Funktionsreferenzen einbauen. Das sind Variabeln die auf eine Funktion "zeigen", bzw. deren ID beinhalten.
Das geht in HDSS mithilfe der Funktion fref. Für Variabel-Referenzen benutzt man hingegen ref.
Code: [AUSKLAPPEN]

var $fnc;
$fnc = fref (funktion);
callFnc ($fnc);

Nur so als Beispiel...

Um jetzt das Skript vorweg zu zeigen:
Code: [AUSKLAPPEN]


void onstart ()
{
 // das Zeugs von gestern (siehe letzten Eintrag)
 // ...
 // jetzt aber:
 var $feldFlasche;
 $feldFlasche = new (item);
 $feldFlasche->name = "Feldflasche";
 $feldFlasche->meshpath = "data\modelle\item\ITEM_Trinkbeutel_leder_GB.b3d";
 $feldFlasche->handSlot = "SLOT_Hand";
 $feldFlasche->onPickUp = fref (feldFlasche_onPickUp);
 $feldFlasche->onUse   = fref (feldFlasche_onUse);

 // Item einfügen:
 ITEM_InsertWP ($feldFlasche, "WP_Stand_start");
}
// beim aufnehmen
void feldFlasche_onPickUp ()
{
 message ("Du hast die sehr wertvolle Feldflasche gefunden!");
}
// beim benutzen
void feldFlasche_onUse ()
{
 message ("Du hast gerade die aus der Feldflasche getrunken");
}

Ich denke es sollte alles verständlich sein. Der Member handSlot beinhaltet den Namen des Slots, wo das Item später gehalten wird.
ITEM_InsertWP fügt ein Item an einem Waypoint in die Welt ein. Macht ziemlich wenig Sinn, manchmal brauchts man. Später wird das ganze natürlich bequem per Editor reingemacht, aber der ist atm noch nicht so weit, das er Items setzen kann.
Ähm jo, ich denke das sollte alles .
Hier noch, die Feldflasche (128 Polys) von GB:

user posted image

Nun, allzu viel zu sehen gibt es ja nicht, trotzdem hier noch Screens vom Ergebnis.
(--> Die Feldflasche ist etwas zu klein skaliert, man sieht sie kaum)

Also, wenn man das Item im Fokus hat, siehts so aus:
(Etwas weiter gezoomt)

user posted image


Beim Aufnehmen der Flasche:

user posted image


Beim mehrmaligem benutzen:

user posted image

Die Schrift dieser messages ist wirklich oberhässlich. Und nein, nicht nur die Schrift, der Code auch. Gleich morgen oder übermorgen werd ich mich darum kümmern, das tut mir so in diesem Zustand in der Seele weh Very Happy

Na gut, die ganz ganz einfallsreichen unter euch werden sich jetzt vlt fragen: Warum sollte da immer eine Nachricht ausgegeben werden, wenn ein NPC das Item aufnimmt (diese Events werden nicht nur beim Spieler ausgeführt).
Oder gar benutzt, da würden ja ziemlich viele messages kommen....
Nun, das müsste man mit einer kleinen If-Abfrage lösen:
Code: [AUSKLAPPEN]

void item_onUse ()
{
 if ($user==$hero)
 {
  // Der Spieler benutzts
 } else {
 // irgendein NPC benutzts
 }
}

Und jo, ganz recht, Else gibt es noch gar nicht! Na gut, kommt sicher noch.
Ich denke das wäre alles. Sobald ich den kleinen Bug mit den Member-Abfragen gefixt habe, mache ich, das man das Trinken sieht, also mit Animation und all dem Rest.
Domi hat diese Animation schon gemacht, und ja, sie sieht recht gut aus, wie ich finde.

mfG

ein kleiner Schritt

Mittwoch, 17. September 2008 von peacemaker
Ave, Worklog-Leser.

Es ist auch jetzt wieder eine zeitlang her, seit hier der letzte Worklog-Eintrag gemacht wurde. Hey, Tehadon wird natürlich weiterentwickelt, aber mir fehlt schlichtweg die Zeit längere Worklog-Einträge zu machen. Na gut, heute hab ich mir die genommen.
Also, was ist denn so passiert.
Um mal endlich weiterzukommen, habe ich mir bezüglich HDSS ein Ziel gesetzt: diesen Montag hätte es reif für Tehadon sein sollen. Trotz durchprogrammiertem Wochenende (NIE MEHR!) habe ich das nicht so hingekriegt wie ich es wollte. Wichtige Dinge wie Stringverkettungen z.B. fehlen noch ganz, externe Methoden wurden auch nur irgendwie schnell-schnell inplementiert, und der letzte Code ist voller Workarounds.
Wie stehts mit HDSS selber aus? Also, Funktionen mit Return-Values funktionieren. Die Dinger mit den komplexen Termen hatte ich ja schon gemacht. Was mir atm nocht stark fehlt sind Referenzen auf Funktionen. Ist aber sehr schnell gemacht.
Nun, ich hab mir trotzdem gedacht, das es Zeit wird, HDSS in Tehadon reinzuhauen. Gesagt, getan, aber vorher hatte ich einige sehr dicke Probleme mit IDEal, der von uns genutzten Entwicklungsumgebung. Man konnte nichts speichern, teilweise wurden Projektfiles gar nicht geöffnet und so weiter. Ich war gezwungen die Standard-BB-IDE zu nutzen. Mir erscheint es heute mehr als nur schwer vorstellbar, das ich tatsächlich fast eineinhalb Jahre lang Tehadon damit gemacht habe. Na gut, in den älteren Code-Teilen (wie in dem Core-Teil mit den Grundfunktionen (--> die Parserlib, ganz schlimm)) sieht man das noch sehr gut.
Also, irgendwie gings heute plötzlich. Also ging ich mit Vollgas an die Inplementierung von HDSS in Tehadon. Ich war überrascht WIE flott das ging, zwar hatte es anfangs einige Probleme, aber ziemlich schnell schon funktionierte es.
Und dann ging ich gleich an die erste Inplementierung: die NPC-Klasse. (Na gut, Klasse in BB... Type eben)
Das Ding hat 138 Fields (Member) und alle konnte ich natürlich nicht machen. Wozu auch, es gibt einige die gar nicht gebraucht werden.
Übrigens, HDSS kann jetzt ziemlich gut mit internen Type-Lists kombiniert werden. Ich habe zwar keine Pointer und dergleichen zur Verfügung, aber durch ein ziemlich einfaches, aber schnelles Event-System (*hust* ASP.NET) habe ich das hingekriegt.
Na gut, zurück zu vorhin. Die NPC-Klasse ist also zu kleinem Teil drin. So grund-Dinger wie mesh etc. sind schon verfügbar, man kann schon NPCs erstellen.
Weiterhin habe ich noch das onStart-Event hinzugefügt. Das wird, welch Wunder, beim Start von Tehadon ausgeführt.
So, genug gelabert, jetzt kommen handfeste Dinge.

Hier erstmal das Skript.
Code: [AUSKLAPPEN]
void onstart ()
{
 message ("willkommen bei tehadon!");

 var $isomer;
 $isomer = new (npc);
 $isomer->name = "Isomer";
 $isomer->meshpath = "data\modelle\npc\platzhalter\intenar\intenar.B3D";
 $isomer->startWP = "WP_Stand_Middle";

 var $asoren;
 $asoren = new (npc);
 $asoren->name = "Asoren";
 $asoren->meshpath = "data\modelle\npc\platzhalter\intenar\intenar.B3D";
 $asoren->startWP = "WP_Stand_Right";
}


Und hier die Ergebnisse in zwei Bildern gezeigt:

user posted image

(Dieser Text wird ja im Event onStart angezeigt)

user posted image

Bevor ichs vergesse: wie ihr vlt seht haben die NPC-Meshes jetzt Texturen. Das ist natürlich noch nicht die finale Textur, aber ich finde sie ziemlich gut getroffen. Mit ein paar Details wird das ganze ziemlich nett :biggrin:
Ähm jo, was bleibt zu sagen. Jetzt gehts erstmal Highspeed an den Items, Dialogen und schlussendlich Quest-System. Wenns gut läuft habe ich das bis Sonntag geschafft. Wenn nicht, auch egal. Man hat ja Zeit.

Und ähm jo, die Landschaft ist etwas arg leer auf den Bildern. Auch die fehlenden Schatten machen sich bei den NPCs bemerkbar --> sie sehen aus als würden sie schweben. Alles kein Problem, kommt ja alles noch.

mfG



IAOs und das übliche

Dienstag, 9. September 2008 von peacemaker
Ihr erratet nie, woran ich gearbeitet habe! Nämlich an, welch Wunder, HDSS.
In einem wahren Kampf gegen diese Käfer, habe ich endlich ein paar weitere dorthin geschickt, wo sie hingehören: ins virtuelle Nirvana.

Klartext: Punkt-vor-Strich und Klammer-Rechnungen gehen, Grund-Mathe-Operationen (+ - * / ) gehen, und öhm.. ja.
Dieses Ding da konnte der HDSS-Compiler korrekt kompilieren, die HDSS-VM korrekt berechnen.

Code: [AUSKLAPPEN]

print ((((2+4)*2)*2)+3*(((((((2+2)+2)-8)*8)-6)*6)-6) + (1*(22*(2+3))-(22*(2-3)) * 2));

Ich glaube die Ausgabe war -236.
Was noch Problemchen macht sind + und - im gleichen Term. Hört sich vlt etwas dumm an, wobei mmh... das ist es ja auch. Aber das habe ich wirklich sauschnell gefixt. Ist ja etwas sehr kleines, nur kurz was an einer select/Case-Abfrage ändern.

Mein Ziel ist, bis nächsten Montag HDSS in den Alpha-Status zu bringen. Diesbezüglich gab es ein paar Planänderungen. Alles was nicht gebraucht wird, wurde rausgenommen, Workarounds und provisorische Lösungen kann ich nicht gebrauchen.
Ansonsten, zu dieser HDSS-Alpha: Wenn ich bis nächsten Montag einen akzeptablen Zustand erreichen kann, werdet ihr schon dann die HDSS-Alpha zu Gesicht bekommen. Wenn nicht, müsst ihr euch wohl oder übel gedulden, da ich, wenn ich noch weiter an HDSS arbeite die ganze Tehadon-Entwicklung anhalte. Ich muss paralell mit Willi arbeiten, sonst werden wir einige Probleme haben.
Desshalb gehts dann auch gleich mit Vollgas an die IAOs, interactive Objects. Also alles so Zeugs wie Bänke, Stühle, Schleifsteine, Amboss, Brunnen und so weiter und so fort.

Hier mal eine Bank, wie sie später geskriptet wird:
Code: [AUSKLAPPEN]
// IAO
var $bench;
var $user;

$bench = new (IAO);
$bench->mesh    = loadMesh ($mod->meshDir."IAO_Bank_01.3DS");
$bench->name    = "Bank"; // Fokus-Name
$bench->range    = 200;    // Aktions-Radius

void $bench :: onStart ()
{
    if (B3DDistance3D ($user->entity,$bench->activeWP) > $bench->range)
    {
        $user->gotoWP ($bench->activeWP);
        addTrigger (pos($user->targetWP), ref($bench::onArrive));
    } else {
        $this->onArrive ();
    };
};

void $bench :: onArrive ()
{
    $user->alignToEntity ($this->mesh);
    $user->sit ();
};

void $bench :: onEnd ()
{
    $user->standUp ();
};


Und danach, mit eben so viel Vollgas an das Pathfinding der NPCs. Zu lange hab ichs vor mir hergeschoben, jetzt kommts rein! Aber vorher noch, wird HDSS in Tehadon inplementiert. Davor fürchte ich mich ein bisschen, weil ich kAhnung habe ob die Systeme zusammenpassen werden.

mfG

HDSS, Third-Person, SHDSS ...

Samstag, 6. September 2008 von peacemaker
Sodele, ein kleiner Eintrag hier.
Heute erzähle ich vor allem von der Arbeit anderer Leute :biggrin: Ihr werdet schon sehen.

Also, Thema #1, wie immer, HDSS. Tja, was soll ich sagen. Ich habe jetzt angefangen, einige Dinge, die ich bisher immer vor mir her schob, zu machen. Zuerst einmal, Punkt-vor-Strich komplett inplementieren. Also, das ist keine grosse Sache.
Des weiteren mal so einen komischen Bugs mit Termen zu reparieren.
Jetzt sollten so Dinger wie
Code: [AUSKLAPPEN]

print (len (replace ("t_e_s_t", chr (90+len("12345")), " "))+25);

Endgültig gehen.
Nun, da werde ich noch einige Arbeit vor mir haben. Aber ich denke das geht schon relativ schnell.

Nächster Punkt: Willi, die Rübe, hat mal angefangen die Third-Person-Kamera-Steuerung einzubauen. Ja, und sie funktioniert! Und sogar ziemlich gut, wie ich sagen muss.
Da wir jetzt das SVN-System installiert haben, und auch das Ganze Zeugs mit dem TicketTrac gemacht haben, können jetzt beide an Tehadon arbeiten.

Nun, der dritte Punkt: Jo0oker, unser primärer Tool-Programmierer hat mal vor einer Woche oder so angefangen, einen HDSS-Editor zu entwickeln. Zwar wird später in Tehadon alles im T-Editor geskriptet, aber für diverse Dinge ist dieser Editor viel besser geeignet, weil die Skripte alleine ausführbar sind.
Das ganze hat er in C# und .NET geschrieben.
Mit F5 startet der Editor automatisch den HDSS-Compiler welcher das Skript temporär kompiliert. Anschliessend wird die VM, welche den Zwischencode ausführt gestartet.
Dann kann man sehen was man gemacht hat. Tja, wir dachten uns, ein kleines Video zu zeigen.
Jo0oker demonstriert euch in diesem Video den Umgang mit der (simplen) Image-Klasse.

Das Video gibt es hier zum Downloaden. Kommentare wie immer hier rein. Die rar-Datei ist 815 kb gross.

mfG

Reformen, HDSS, Mitarbeiterdemo

Samstag, 30. August 2008 von peacemaker
So, ein weiterer Worklogeintrag, für die Interessierten.

Also, zuerst steht da im Titel Reformen. Was ist damit gemeint? Es sind in letzter Zeit einige Reformierungen in der Programmierung von Tehadon im Gange. Soll heissen, ich habe mich endlich dazu durchgewrungen SVN zu benutzen, und habe auch angefangen die Arbeit jetzt mit nem TicketTrac zu arbeiten.
Jetzt steht einer einigermassen ordentlich ablaufenden Entwicklung nichts im Wege, denn jetzt können wir schon zu zweit an Tehadon arbeiten. Willi hat sich bereit erklärt die Physik, Kamerasteuerung, GUI zu inplementieren. Ich werde dann asbald HDSS in Tehadon einfügen. Das kann aber erst geschehen, wenn die vielen Bugs einigermassen weg sind.
Sobald das getan ist, gehts mit Vollgas an den IAOs, anschliessend ans Inventar und paralell ans NPC-Itemsystem. Die DGF-AI müsste auch mal erweitert werden.
Ansonsten, fehlt nicht mehr sooo viel, um mal ne Techdemo rauszuschmeissen. Ich muss aber sagen, das dieses "nicht so viel" wohl noch einiges an Arbeit fordern wird.

Kommen wir zu HDSS. Ich dachte mal euch erst einen kleinen Überblick, was schon alles funktioniert, zu schaffen.
  • If-Abfragen, boolsche Operatoren (==, >, <, =>, <=)
  • Mathe-Operationen: +, -, * (Divisionen gibts noch nicht)
  • verschachtelte Terme à la print (len (parse (1+15)));
  • externe Invokes (Befehle)
  • Do-Schleife
  • OOP:
    • Klassenerstellung (noch intern)
    • Instanz-Erstellung
    • Member-Zugriff
    • interne Methoden
  • Prozeduren
  • Variabeln
  • bequem bedienbares Interface (sfhIF, siehe einen Beitrag oben)
  • Precompiler:
    • #include, #includeDir zum Includen von Dateien / Ordnern
    • #replace zum ersetzen eines textes im Skript
  • Textressourcen
So, ich hoffe ich habe nix vergessen. Ansonsten, was noch grösseres fehlt ist:
  • AND/ OR/ XOR
  • While
  • Funktionen mit Rückgabewerten
  • Punkt-vor-Strich (habe ich wieder entfernt, ein neuer Ansatz muss her)
  • bugs-killen
Zum letzten Punkt: das kommt erst richtig dran, wenn ich die Alpha rausbringe.

Gut, kommen wir zu diesen Textressourcen, die ihr oben vlt bemerkt habt. Was sind das? Ich habe die heute eingebaut, zuerst aber muss ich euch vom HDSS-Zwischencode erzählen.
HDSS-Zwischencode besteht praktisch nur aus Zahlen. Wieso? Weil Integers viel schneller verarbeitet werden können, als Strings. Und trotzdem wird der Zwischencode immer als String eingeladen und gecastet. Warum, das ist doch viel langsamer? Ganz einfach und banal: die HDSS-Strings werden ja auch im Zwischencode gespeichert. Und einen String mit Zahlen darzustellen war mir zu umständlich. Aber jetzt nur wegen Strings das ganze etwa 10% langsamer machen? Nein, natürlich nicht, also hatte ich die Idee Strings in separaten Dateien mit einer ID zu speichern. Diese ID ist ein Integer-Wert. Wird jetzt im Zwischencode ein String aufgerufen, wird einfach die ID angegeben, und da alle Strings dann von dieser Textressource in einen Array kommen, geht das sauschnell.
Ist vlt etwas kompliziert, desshalb ein Beispiel:
Code: [AUSKLAPPEN]

print ("das ist ein Text");
print ("das ist auch ein Text");

Ein normales HDSS-Skript.
Jetzt die Textressource-Datei:
Code: [AUSKLAPPEN]

1=das ist ein Text
2=das ist auch ein Text


Wie gesagt, HDSS-Zwischencode besteht praktisch nur aus Zahlen, aber in diesem Beispiel verdeutliche ich das mit Strings.
Der daraus generierte Zwischencode:
Code: [AUSKLAPPEN]

PRINT
STRING
1
PRINT
STRING
2

Seht ihr, was nach 'STRING' kommt? Eine ID. Das ist die ID der Textressource-Value. Ich hoffe ihr versteht was ich meine, irgendwie habe ich etwas wirr beschrieben. Wenn Fragen vorhanden sind, sind sie wie immer hier willkommen.
So, diese Textressourcen funktionieren bereits einwandfrei.
Als nächsten Schritt werde ich den Zwischencode nicht mehr als String sondern als Int einlesen lassen. Ich erhoffe mir damit mindestens 10% Speedgewinn, was wirklich sehr erfreulich wäre.

So, leider ist durch HDSS Tehadon etwas kurz gekommen, in letzter Zeit. Aber es geht nicht anders, dafür sollte ab jetzt mehr geschehen.
Ich habe mal, vor langer Zeit, nämlich am 2. Mai 2008, eine Tehadon-Mitarbeiter-Demo rausgegeben. Natürlich nur Team-intern. Dort habe ich diverse Dinge gezeigt, so z.B. den Maploader, das Dialog-System, TA-System der NPCs, Quest-System und noch das Skriptevent-System.
Man konnte eine kleine mehrteilige Quest lösen.
Nun, diese Demo war ziemlich verbuggt und so, wesshalb die Öffentlichkeit noch gar nix davon sah. Wird sie wohl auch nicht.
Ich wollte euch aber trotzdem ein paar Screens zeigen, heute stiess ich zufällig auf den alten Game-Content und probierte es aus. Dabei habe ich ein paar Screens gemacht. Allzu schön sind sie nicht, aber wenigstens etwas sichtbares.

user posted image

user posted image

user posted image

An der komischen Schrift-Verzerrung ist JPG Schuld.
Dieser untexturierte NPC übrigens ist von Domi. sieht etwas komisch aus, ohne Texturen, aber die Animationen sind ziemlich schön. Die meisten jedenfalls.

mfG


Gehe zu Seite Zurück  1, 2, 3 ... 5, 6, 7 ... 10, 11, 12  Weiter