Переглянути джерело

Started implementing command system.

Config file now ends with ini instead of init.
Thomas Buck 10 роки тому
джерело
коміт
03bb3e01ed

+ 2
- 2
README.md Переглянути файл

@@ -13,7 +13,7 @@ It seems as if OpenRaider will currently only work on Little-Endian platforms. T
13 13
 OpenRaider needs some configuration files, and level data and assets from custom levels or the Tomb Raider games.
14 14
 These are stored in `~/.OpenRaider`. Running `make setup` will create/copy the necessary files and directories.
15 15
 
16
-You still need to add level files in `~/.OpenRaider/paks/` and add them to `~/.OpenRaider/OpenRaider.init`.
16
+You still need to add level files in `~/.OpenRaider/paks/` and add them to `~/.OpenRaider/OpenRaider.ini`.
17 17
 Dust off your old Tomb Raider CDs or grab some [custom levels](http://www.aspidetr.com/levels/yvel-woods-v1-5/) from the interwebs.
18 18
 
19 19
 ## Documentation
@@ -71,7 +71,7 @@ A Doxygen API documentation can be created with `make doc`.
71 71
 
72 72
 ### Configuration file
73 73
 
74
-OpenRaider will try to load `~/.OpenRaider/OpenRaider.init` or, if it doesn't exist, `OpenRaider.init` from the current directory.
74
+OpenRaider will try to load `~/.OpenRaider/OpenRaider.ini` or, if it doesn't exist, `OpenRaider.ini` from the current directory.
75 75
 Running `make setup` will create a minimal configuration in your home directory.
76 76
 
77 77
 The configuration file format is very simple:

+ 1
- 1
cmake/setup.sh Переглянути файл

@@ -2,7 +2,7 @@
2 2
 
3 3
 echo "Setting up OpenRaider for user $USER..."
4 4
 mkdir -p ~/.OpenRaider
5
-cp data/OpenRaider.init ~/.OpenRaider/
5
+cp data/OpenRaider.ini ~/.OpenRaider/
6 6
 mkdir -p ~/.OpenRaider/paks
7 7
 mkdir -p ~/.OpenRaider/music
8 8
 mkdir -p ~/.OpenRaider/data

+ 2
- 2
cmake/setup_mac.sh Переглянути файл

@@ -3,7 +3,7 @@ cd `dirname $0`
3 3
 if [ ! -d "${HOME}/.OpenRaider" ]; then
4 4
     echo "Setting up OpenRaider for user $USER..."
5 5
     mkdir -p ~/.OpenRaider
6
-    cp ../Resources/defaults/OpenRaider.init ~/.OpenRaider/
6
+    cp ../Resources/defaults/OpenRaider.ini ~/.OpenRaider/
7 7
     mkdir -p ~/.OpenRaider/paks
8 8
     mkdir -p ~/.OpenRaider/music
9 9
     mkdir -p ~/.OpenRaider/data
@@ -11,7 +11,7 @@ if [ ! -d "${HOME}/.OpenRaider" ]; then
11 11
     cp ../Resources/defaults/*.tga ~/.OpenRaider/data
12 12
     cp ../Resources/defaults/*.ttf ~/.OpenRaider/data
13 13
     echo "DONE"
14
-    osascript -e 'tell app "System Events" to display alert "Initial Configuration stored in ~/.OpenRaider\n\nView and edit OpenRaider.init to your needs..."'
14
+    osascript -e 'tell app "System Events" to display alert "Initial Configuration stored in ~/.OpenRaider\n\nView and edit OpenRaider.ini to your needs..."'
15 15
 fi
16 16
 if [[ ! -n `find "${HOME}/.OpenRaider/paks" -type f -exec echo Found {} \;` ]]; then
17 17
     echo "Missing level files!"

data/OpenRaider.init → data/OpenRaider.ini Переглянути файл


+ 1
- 1
include/Config.h.in Переглянути файл

@@ -2,7 +2,7 @@
2 2
 #define BUILD_HOST "@OpenRaider_BUILD_HOST@ @OpenRaider_HOSTNAME@"
3 3
 
4 4
 #define DEFAULT_CONFIG_PATH "~/.OpenRaider/"
5
-#define DEFAULT_CONFIG_FILE "OpenRaider.init"
5
+#define DEFAULT_CONFIG_FILE "OpenRaider.ini"
6 6
 #define DEFAULT_WIDTH 640
7 7
 #define DEFAULT_HEIGHT 480
8 8
 

+ 10
- 0
include/OpenRaider.h Переглянути файл

@@ -8,6 +8,8 @@
8 8
 #ifndef _OPENRAIDER_H_
9 9
 #define _OPENRAIDER_H_
10 10
 
11
+#include <vector>
12
+
11 13
 #include "Window.h"
12 14
 
13 15
 /*!
@@ -32,6 +34,14 @@ public:
32 34
      */
33 35
     int loadConfig(const char *config);
34 36
 
37
+    int command(const char *command);
38
+
39
+    int command(const char *command, std::vector<char *> *args);
40
+
41
+    int set(const char *var, const char *value);
42
+
43
+    int bind(const char *action, const char *key);
44
+
35 45
     int initialize();
36 46
 
37 47
     void run();

+ 3
- 0
include/utils/strings.h Переглянути файл

@@ -10,6 +10,9 @@
10 10
 #define _UTILS_STRINGS_H_
11 11
 
12 12
 #include <cstdarg>
13
+#include <vector>
14
+
15
+void printStringVector(std::vector<char *> *args);
13 16
 
14 17
 /*!
15 18
  * \brief Check if a string ends with another string.

+ 1
- 1
src/CMakeLists.txt Переглянути файл

@@ -72,7 +72,7 @@ if (APPLE)
72 72
     set (SRCS ${SRCS} ${MAC_ICON})
73 73
 
74 74
     # Copy Data
75
-    set (MAC_DATA "../data/OpenRaider.init" "../data/test.ttf")
75
+    set (MAC_DATA "../data/OpenRaider.ini" "../data/test.ttf")
76 76
     set (MAC_DATA ${MAC_DATA} "../data/snow.tga" "../data/snow2.tga" "../data/splash.tga")
77 77
     set_source_files_properties (${MAC_DATA} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/defaults)
78 78
     set (SRCS ${SRCS} ${MAC_DATA})

+ 144
- 4
src/OpenRaider.cpp Переглянути файл

@@ -6,6 +6,7 @@
6 6
  */
7 7
 
8 8
 #include <cstdio>
9
+#include <cstring>
9 10
 #include <assert.h>
10 11
 
11 12
 #include "WindowSDL.h"
@@ -20,7 +21,8 @@
20 21
 OpenRaider::OpenRaider() {
21 22
     mInit = false;
22 23
     mRunning = false;
23
-    mWindow = NULL;
24
+
25
+    mWindow = new WindowSDL();
24 26
 }
25 27
 
26 28
 OpenRaider::~OpenRaider() {
@@ -30,20 +32,158 @@ OpenRaider::~OpenRaider() {
30 32
 
31 33
 int OpenRaider::loadConfig(const char *config) {
32 34
     assert(config != NULL);
35
+    assert(config[0] != '\0');
33 36
 
34 37
     char *configFile = fullPath(config, 0);
35
-    printf("Trying to load \"%s\"...\n", configFile);
38
+    printf("Loading config from \"%s\"...\n", configFile);
39
+
40
+    FILE *f = fopen(configFile, "r");
41
+    if (f == NULL) {
42
+        printf("Could not open file!\n");
43
+        return -1;
44
+    }
45
+
46
+    char buffer[256];
47
+    while (fgets(buffer, 256, f) != NULL) {
48
+        command(buffer);
49
+    }
50
+
51
+    fclose(f);
52
+
53
+    return 0;
54
+}
55
+
56
+int OpenRaider::command(const char *command) {
57
+    assert(command != NULL);
58
+    assert(command[0] != '\0');
59
+
60
+    int returnValue = 0;
61
+    char *cmd = bufferString("%s", command);
62
+    size_t length = strlen(cmd);
63
+
64
+    // Command ends at '\n' or # when a comment begins
65
+    for (size_t i = 0; i < length; i++) {
66
+        if (cmd[i] == '\n' || cmd[i] == '#') {
67
+            cmd[i] = '\0';
68
+            break;
69
+        }
70
+    }
71
+
72
+    char *token = strtok(cmd, " \t");
73
+    if (token != NULL) {
74
+        // token is the command to execute
75
+        // get arguments
76
+        std::vector<char *> args;
77
+        char *next;
78
+        while ((next = strtok(NULL, " \t")) != NULL) {
79
+            args.push_back(next);
80
+        }
81
+
82
+        // Execute
83
+        returnValue = this->command(token, &args);
84
+    }
85
+
86
+    free(cmd);
87
+    return returnValue;
88
+}
89
+
90
+int OpenRaider::command(const char *command, std::vector<char *> *args) {
91
+    assert(command != NULL);
92
+    assert(command[0] != '\0');
93
+    assert(args != NULL);
94
+
95
+    if (strcmp(command, "set") == 0) {
96
+        if (args->size() != 2) {
97
+            printf("Invalid use of set-command ");
98
+            printStringVector(args);
99
+            printf("\n");
100
+            return -2;
101
+        } else {
102
+            return set(args->at(0), args->at(1));
103
+        }
104
+    } else if (strcmp(command, "bind") == 0) {
105
+        if (args->size() != 2) {
106
+            printf("Invalid use of bind-command ");
107
+            printStringVector(args);
108
+            printf("\n");
109
+            return -3;
110
+        } else {
111
+            return bind(args->at(0), args->at(1));
112
+        }
113
+    } else {
114
+        printf("Unknown command: %s ", command);
115
+        printStringVector(args);
116
+        printf("\n");
117
+        return -1;
118
+    }
119
+}
120
+
121
+int OpenRaider::set(const char *var, const char *value) {
122
+    if (strcmp(var, "size") == 0) {
123
+        // value has format like "\"1024x768\""
124
+        unsigned int w = DEFAULT_WIDTH, h = DEFAULT_HEIGHT;
125
+        if (sscanf(value, "\"%dx%d\"", &w, &h) != 2) {
126
+            printf("set-size-Error: Invalid value (%s)\n", value);
127
+            return -2;
128
+        }
129
+        mWindow->setSize(w, h);
130
+    } else if (strcmp(var, "fullscreen") == 0) {
131
+
132
+    } else if (strcmp(var, "gldriver") == 0) {
133
+
134
+    } else if (strcmp(var, "audio") == 0) {
135
+
136
+    } else if (strcmp(var, "volume") == 0) {
137
+
138
+    } else if (strcmp(var, "mouse_x") == 0) {
139
+
140
+    } else if (strcmp(var, "mouse_y") == 0) {
141
+
142
+    } else if (strcmp(var, "basedir") == 0) {
143
+
144
+    } else if (strcmp(var, "pakdir") == 0) {
145
+
146
+    } else if (strcmp(var, "audiodir") == 0) {
147
+
148
+    } else if (strcmp(var, "datadir") == 0) {
149
+
150
+    } else if (strcmp(var, "font") == 0) {
151
+
152
+    } else {
153
+        printf("set-Error: Unknown variable (%s = %s)\n", var, value);
154
+        return -1;
155
+    }
36 156
 
37 157
     return 0;
38 158
 }
39 159
 
160
+int OpenRaider::bind(const char *action, const char *key) {
161
+    if (strcmp(action, "console") == 0) {
162
+
163
+    } else if (strcmp(action, "forward") == 0) {
164
+
165
+    } else if (strcmp(action, "backward") == 0) {
166
+
167
+    } else if (strcmp(action, "jump") == 0) {
168
+
169
+    } else if (strcmp(action, "crouch") == 0) {
170
+
171
+    } else if (strcmp(action, "left") == 0) {
172
+
173
+    } else if (strcmp(action, "right") == 0) {
174
+
175
+    } else {
176
+        printf("bind-Error: Unknown action (%s --> %s)\n", key, action);
177
+        return -1;
178
+    }
179
+    return 0;
180
+}
181
+
40 182
 int OpenRaider::initialize() {
41
-    assert(mWindow == NULL);
42 183
     assert(mInit == false);
43 184
     assert(mRunning == false);
44 185
 
45 186
     // Initialize Windowing
46
-    mWindow = new WindowSDL();
47 187
     if (mWindow->initialize() != 0)
48 188
         return -1;
49 189
 

+ 10
- 0
src/utils/strings.cpp Переглянути файл

@@ -17,6 +17,16 @@
17 17
 
18 18
 #include "utils/strings.h"
19 19
 
20
+void printStringVector(std::vector<char *> *args) {
21
+    printf("(");
22
+    for (std::vector<char *>::size_type i = 0; i < args->size(); i++) {
23
+        printf("%s", args->at(i));
24
+        if (i < (args->size() - 1))
25
+            printf(" ");
26
+    }
27
+    printf(")");
28
+}
29
+
20 30
 bool stringEndsWith(const char *str, const char *suffix) {
21 31
     assert(str != NULL);
22 32
     assert(suffix != NULL);

Завантаження…
Відмінити
Зберегти