Sonntag, 13. Mai 2012

die Gegnerchen, die Dummerchen

die Gegner sehen - endlich - Hindernisse in ihrer Umgebung und können ihnen ausweichen.
Wochen saßen wir vor dem Problem und hatte mehrere komplizierte Versuche mit Knoten und Pathfinding, mit 6 versch. Bacon um jeden Gegner, die die Umgebung abscannen, oder 6 versch. Bacon um den Spieler, die als Anlaufstelle für Nahkampfgegner dienten, ....

.... am Ende war es die simpelste Idee, die den Erfolg brachte:
2 kleine Positionen neben jedem Gegner, die vom Gegner angetraced wurden. Liegt was dazwischen, dreht er sich weg - das ist alles. Schon rennen die Gegner schön um Hindernisse und positionieren sich damit total selbständig um den Spieler
function gegner_checkt_Umwelt()
{
    VECTOR content_left;
    VECTOR content_right;
    int content_range = 120;

    vec_set(content_left.x, vector(content_range, -content_range/2, 20));
    vec_rotate(content_left.x, vector(my.pan,0,0));
    vec_add(content_left.x, my.x);
    draw_point3d(content_left, vector(0,0,255), 100, 10); // debugzwecke

    vec_set(content_right.x, vector(content_range, content_range/2, 20));
    vec_rotate(content_right.x, vector(my.pan,0,0));
    vec_add(content_right.x, my.x);
    draw_point3d(content_right, vector(0,0,255), 100, 10); // debugzwecke
   
    if( c_trace(my.x, content_left.x,  IGNORE_ME | IGNORE_PASSABLE) > 0)
        my.pan += 5 * time_step;
    if(c_trace(my.x, content_right.x, IGNORE_ME | IGNORE_PASSABLE) > 0)
        my.pan -= 5 * time_step;
   
    if((c_trace(my.x,content_left.x,  IGNORE_ME | IGNORE_PASSABLE) + c_trace(my.x,content_right.x, IGNORE_ME | IGNORE_PASSABLE)) <= 0)
    {
        you = enet_ent_locpointer(my.ziel_pointer); // wenn nichts dazwischen, dreh dich zum Ziel
        VECTOR vTarget_Angle;
        vec_to_angle(vTarget_Angle, vec_sub(vec_set(temp, you.x),my.x));
        var diff = ang(vTarget_Angle.x - my.pan + 360);
        my.pan += diff * 0.125 * time_step;
    }
}
...manchmal ist die einfachste Lösung die beste!

Montag, 30. April 2012

Friedhof

Friedhof erstellt - nun fehlt noch der Effekt für den Eingang der Gruft und die Gegner, die um das Gemäuer lungern.

Samstag, 28. April 2012

auch im April gibts news - erste Map

so, ein kleines Update der ersten Map.
Zuerst mit Terrains erstellt, die mit shade-C, dann mit einem 3DGS-shader ausprobiert.
War aber nicht zufriedenstellend: Steile Klippen werden nicht gut dargestellt und insg. finde ich Terrains zu unflexibel.
Nun ein weiterer Versuch: Die Umgebung mit blender modellieren und größere, statische Modelle gleich dort einfügen.
Das "Modellterrain" hat nun ein 3dgs-Shader für die Textur und der Shadow-Map, die mit blender gebacken wurde - sie ist zwar statisch und hat eine niedrige Auflösung, doch soll mir das genügen - AAA ist nicht mein Ziel, sag ich mir immer wieder.

Die Map hat ein kleines Dorf, dort gibts die erste Quest. Diese führt einen zum örtlichen Friedhof, wo der Spieler den ersten "Dungeon" entdeckt. Danach gehts weiter, durch das Gebirge und Höhlen ins Hochland - dort sollten die am Friedhof aufgekommenen Fragen beantwortet werden :)


Übersicht der Map in blender, shadowmap, rbg-map für den Shader+shadowmap

Dienstag, 20. März 2012

2 kleine Modelle

solang ich daheim bin, gibts nichts viel großes Neues an meinem Spiel, nur kleiner Dinge, die ich dann später am PC in das Spiel einfüge:

Gegnermodell "Fliege"
Mausoleum/Gruft im Friedhof - wird der Eingang des ersten Dungeon

in Blender, dem Modellierungsprogramm
Zaunelement



Samstag, 11. Februar 2012

erster Test mit Dialogfenster

...war efolgreich :-D
NPC wird angeklickt, in dem Fall ein Fertigkeitshändler (hat noch kein Sortiment), man wird begrüßt, kann mit ihm handeln und aber auch sich etwas erzählen lassen, das dann in eine Quest mündet - sowohl die mögliche Quest als auch das Handeln wird per "über-Kopf-zeichen" angezeigt.

Für die Kopfsymbole hab ich einfache Funktionen geschrieben, die ich bei den jeweiligen NPCs einfach mit create_kopfsymbol(kopfsymbol_ID_unterhaltung,kopfsymbol_pos_links); aufrufen kann.

Die Texte, die der NPC dann abspult, sind per str_cpy in einen dialog-string einkopiert, dh. ich brauch nicht für jeden NPC ein extra Dialogfenster, sondern hab ein universelles, in das ich dann die strings einkopiere und die Buttons per pan_setbutton sichtbar und unsichtbar machen lassen kann.

Anbei noch ein Video, das das ganze verdeutlicht:

Montag, 6. Februar 2012

Kleinvieh macht auch Mist

in diesem Sinne ein Video. Das zeigt zwei kleine Icons über dem Mann am Haus. Das Buch signalisiert dem Spieler, dass der Mann etwas zur Story beiträgt und eventl. eine Quest für den Spieler hat, der Beutel mit dem Geld bedeutet, dass der Spieler mit dem NPC handel betreiben kann - also seine gefunden Gegenstände dort verkaufen kann bzw andere vom ihm kaufen:

Als nächstes werd ich an das Interface des Händlers rangehn - sodass der Spieler mit diesem Handel betreiben kann, damit wir uns mal einer Testversion mit einem kleinen Gebiet zum Spielen nähern.
Dazu fehlt aber noch einiges:
  • Gegner müssen überarbeitet werden
  • das Droppverhalten muss überarbeitet werden
  • einige andere Zustände wie Gift, Krankheit, Stun, Slow
  • Händler für Gegenstände und für Fertigkeiten
  • 4,5 Fertigkeiten zum Testen
  • Itemanzeige an der Spielfigur
  • usw :-)

Samstag, 14. Januar 2012

neues Spiel, neues Glück

mit dem alten Spiel hab ich viel über das neue Acknex 8 und ANet gelernt, aber mein Quellcode war einfach zu abstrus.
Da mein Traum eh ein RPG im Multiplayer ist, das die ganzen Dinge, die "Dungeon Siege II" falsch gemacht hat, richtig machen soll :-> setzte ich mit Anfang November 2011 ran.
Das Ergebnis sind bisher über 5000 Zeilen selbstgeschrieben und ein kleines Video:


Spiel soll ein kleines RPG für LAN Parties im Multiplayer werden. Das Spiel wird mit Hilfe der Engine Acknex 8 programmiert und ist ein Hobby-1-Mann-Projekt.
"Inspiriert" hat mich zum einen eines meiner Lieblingsspiele "Dungeon Siege I + II" und "League of Legends". Der Sinn des Spiels besteht im "zusammen Spielen" und PC-gesteuerte Monster o.ä. zu erschlagen, dadurch Erfahrung zu gewinnen, an bessere Gegenstände und Gebiete zu kommen und somit die Story voran zu treiben. Story ist noch nicht ganz fertig, Bruder feilt noch daran rum :)
2D-Grafiken sind alle selbst gemacht, Modelle hab ich teilweise gekauft, teilweise mach ich sie selbst."

Vom Spielprinzip soll es so aussehen:

  • Jeder Spieler startet mit der gleichen Spielfigur (keine Auswahl an Klassen, ist mir zu viel Umfang für Hobbyprogrammierung).
  • Es gibt eine Karte, die der Host am Beginn auswählt (vergleichbar mit dem Multiplayerprinzip von "Unreal Tournament", "Rune" oder jedes Aufbaustrategiespiel).
  • Auf dieser Karte sind verschiedene Gegnerspots.
  • Manche Gegner tauchen immer wieder nach einiger Zeit auf, manche "unique" nicht (Minibosse, die bestimmte sachen Droppen).
  • Es gibt für jede Karte einen art Endboss, der besondere Gegenstände droppt.
  • Die Karten sollen teilweise Spielwiesen zum Farmen sein, teilweise das Prinzip der Dungeons aus "Guild Wars" wiederspiegeln (bestimmte Gegnertypen und Schadenstypen -> Vorbereitung/Nachdenken vor Dungeon nötig). Die Dungeons können, wenn sie einmal in der Map vom Spieler erreicht/entdeckt wurden, vom Host ab dieser "Entdeckung" direkt als Startkarte angewählt werden -> zielgerichtete Dungeon-Vorhaben möglich.
  • Es gibt kein Crafting und keine Berufe, ist mir zu viel Umfang für Hobbyprogrammierung.
  • Wer stirbt, bekommt Gold und Erfahrungspunkte abgezogen und erscheint am Anfangslager wieder. Pro Tod gibt es eine Wartezeit abzuwarten, die sich erhöht, aber Maxima hat.
  • Am Anfangslager kann man sich die Fertigkeiten seiner Klasse neu sortieren und neue kaufen (Dungeon Siege+Guildwars - Prinzip) - diese können im Lager in der unteren Interfacereihe zu 4 verwendbaren zusammengestellt werden. Zieht man eine Fertigkeit daraus hinaus und eine andere hinein, wird die alte nicht gelöscht, sie bleibt weiterhin im "Zauberbuch" verfügbar, falls man seine Spielweise später ändern will.
  • Spieler können bei Bossen nach ihrem Ableben mit einem Siegel der Erbeutung eine Elitefertigkeit erhalten (GW - Prinzip). Jedoch ist nur eine Elitefertigkeit pro Fertigkeitsanordnung im Interface möglich. Da 4 Fertigkeits-Slots (wie im Video) mir etwas wenig erscheinen, bin ich am überlegen, diese auf 6 zu erhöhen. Doch es sollte wie in "League of Legends" möglich sein, diese mit einer Hand zu aktivieren [Q] [W] [E] [R]. Entweder ich fang ne zweite Reihe bei [A] ... an oder ich setz Slot 5 und 6 auf [V] und für den Daumen. Da aber noch Heil- und Mana-tränke im Spiel vorkommen, sollte der Spieler auch diese benutzerfreundlich aus dem Interface bzw mit Shortcut aktivieren können, ohne ins Inventar zu switchen. Das wären aber schon 8 Tasten, die er blind drücken zu können hat. - zu viel?
---------------------------------------------

Zugegebener Maßen sieht man im Video nicht wirklich viel. Ein Algorythmus für ein Zufallswald hab ich geschrieben, eine Save-Load funktion (gesamter Inventarinhalt und Charakterwerte werden in txt-Datei abgespeichert und kann geladen werden), die Charakterwerte agieren miteinander -> Mehr Stärke -> mehr Angriffsschaden usw. Multiplayer funktioniert. Die Gegenstände können ihre Attribute per Zufall bekommen. Gegenstände werden als structs gemanaged; auch die Fertigkeiten haben ihren eigenen.
In ein paar Wochen nach den Klausuren werde ich hoffentlich genug Content haben (modelliere mit Blender gerade ein Erd-Golem, der ein Hauptgegner im ersten Dungeon wird). Dieser Dungeon soll im nächsten Video + Wald und Dorf der nächste Video-Content werden, in dem das Video ein art "let's Play" werden könnte.
---------------------------------------------

Falls jemand Kritik äußern möchte; sich irgendwelche Farben im Spiel beissen sollten (ich hab ne Dyschromatopsie, Rot grün-Schwäche); es Ideen zum Content/Fertigkeiten/.... gibt - gern als Nachricht oder youtube-Kommentar, freue mich über jeden Kommentar!
in diesem Sinne, JoGa