Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

1

15.05.2008, 19:37

Kleine Scriptsprache in einer txt

Hey ho,

Ich möchte für Tears of Blood (Ein Konsolen RPG) eine kleine ScriptSprache für die NPC entwickeln. Sie soll lediglich diese Fkt können:

• Message(Ralf,“Mir geht es gut“)
• Additem('ItemId',Anzahl)
• Removeitem('ItemId',Anzahl)
• ChangeMoney('Betrag') -> Negativer Betrag Spieler Geld abziehen
• Switch/Cases

Jetzt hatte ich mir das ganze so überlegt. Ich lese die Txt Zeilenweise ein und speichere die Zeile in einem String. Nun frage ich mich wie ich es anstelle das erkannt wird um welche Funktion es sich nun handelt. Developer hat mir zwar schon Ansatzweise versucht zu erklären wie ich es umsetzen könnte jedoch hab ich ihm nicht so ganz folgen können dem stl freak xD
Hoffe ihr habt ein Paar Ideen

Edit: Zum besseren Verständnis hier ein Bild:
http://img396.imageshack.us/my.php?image=scriptwg7.jpg

MFG Toa

2

15.05.2008, 20:28

Ich hab es dir doch schon gesagt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
typedef bool (*fnCall)(std::string const&);

// sample function

bool Message(std::string const& arg)
{ std::cout << arg << std::endl; return std::cout; }

// map with registered functions

std::map<std::string, fnCall> registered_function;
registered_function.insert(std::make_pair("Message", &Message));


// read file

std::ifstream file_stream("script.txt");
std::string line;
while (std::getline(file_stream, line))
{
    // befehl aus zeile schneiden

    const std::string::size_type pos (line.find('('));
    if (pos == std::string::npos)
    { 
        std::cerr << "FEHLER: Ungültiges Script!" << std::endl;
        return false;
    }

    // gucken ob befehl vorhanden

    const std::map<std:.string, fnCall>::const_iterator it(registered_function.find(line.substr(0, pos)));
    if (it == registered_function.end())
    {
        std::cerr << "FEHLER: Unbekannter Befehl \"" << line.substr(0, pos) << "\"!" << std::endl;
        return false;
    }

    // registrierte funktion ausführen 

    (*it->second)(line.substr(pos + 1, line.length() - pos - 1));
}
so wäre eine einfache implementierung ... jetzt nur noch einbauen das die argumente automatisch korrekt umgewandelt werden und nicht einfach als ein string übergeben werden ;) (z.B. einfach std::vector<std::string> ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

3

15.05.2008, 20:33

Du hast die Zeile als String, dann extrahierst du den Funktionsnamen(z.B. steht meist vor den Klammern) und die Parameter (das in den Klammern). Die Abbildung von Funktionsnamen und eigentlicher Funktion (das Mapping) kann in einer Map hinterlegt sein. Nun suchst du den Eintrag passend zum Funktionsnamen und rufst die zugehoerige Funktion mit den Parametern auf.

Vielleicht willst du dich gleich mit einer richtigen Skriptsprache beschaeftigen: Lua soll da sehr entgegenkommend sein.

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

4

15.05.2008, 20:38

Mh, eine Idee hätte mir auch gereicht xD .. danke ..

Die anderen Funktionen kann ich ja auch in den Registrated_Funktion Pool packen. Und dann muss ich nur schon schaun das ich diesen übergebenen String

bool Message(std::string const& arg)

so manipuliere das ich die Argumente erhalte...thx^^

5

15.05.2008, 20:53

Was auch geht ...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace interface
{
    struct function
    {
        virtual ~function() {}
        bool operator()(std::string const&) { return true; }
    };
}; // interface



class Message : public interface::function
{
public:
    bool operator()(std::string const& arg) { return std::cout << arg << std::endl; }
};
... dann hast du szs. ein callobjekt ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

6

15.05.2008, 21:06

mhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

*Überfordert ist* ... ich hatte mir das alles ein wenig einfacher vorgestellt..einfach die Zeile einlesen auf ihre Fkt reduzieren und durch map auf die richtige Fkt zugreifen...^^

Anonymous

unregistriert

7

15.05.2008, 21:11

Zitat von »"Toa"«

mhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

*Überfordert ist* ... ich hatte mir das alles ein wenig einfacher vorgestellt..einfach die Zeile einlesen auf ihre Fkt reduzieren und durch map auf die richtige Fkt zugreifen...^^
Siehst du da irgendein Problem?

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

8

15.05.2008, 21:26

Ja irgend ein Problem tritt da auf das man das ganze in keine Methode packen kann aber so ganz hab ich das net verstanden. Könnte Developer vielleicht näher ausführen xD

Anonymous

unregistriert

9

15.05.2008, 21:44

Zitat von »"Toa"«

Ja irgend ein Problem tritt da auf das man das ganze in keine Methode packen kann aber so ganz hab ich das net verstanden. Könnte Developer vielleicht näher ausführen xD
Methodenpointer sind schon was anderes als Funktionspointer, hierfür empfiehlt sicht boost::bind.
http://www.boost.org/doc/libs/1_35_0/libs/bind/bind.html

Denke aber boost::function würde die Sache eher treffen:
http://www.boost.org/doc/libs/1_35_0/libs/bind/bind.html#with_boost_function

Hiermit kann man ganz gut Delegates herleiten und muss sich nicht mehr um die Zuordnung auf die Instanz kümmern.

10

15.05.2008, 22:27

für 5 Funktionen kann man auch einfach n switch oder if/else if nehmen.
Ist natürlich nicht so schön und toll, aber schön einfach und schnell eingebaut.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige