void apply_level_settings_menu();
/* leveleditor internals */
-static char **level_subsets;
-static int subsets_num;
+static string_list_type level_subsets;
static int le_level_changed; /* if changes, ask for saving, when quiting*/
static int pos_x, cursor_x, cursor_y, cursor_tile, fire;
static int le_level;
default:
if(i != -1)
{
- subset_load(&le_level_subset,level_subsets[i-2]);
+ subset_load(&le_level_subset,level_subsets.item[i-2]);
leveleditor_menu.item[3].kind = MN_GOTO;
menu_item_change_input(&subset_settings_menu.item[2],le_level_subset.title);
menu_item_change_input(&subset_settings_menu.item[3],le_level_subset.description);
{
int i;
char str[80];
- level_subsets = NULL;
- level_subsets = dsubdirs("/levels", "info", &subsets_num);
+ level_subsets = dsubdirs("/levels", "info");
le_show_grid = YES;
menu_init(&subset_load_menu);
menu_additem(&subset_load_menu,menu_item_create(MN_LABEL,"Load Level Subset",0,0));
menu_additem(&subset_load_menu,menu_item_create(MN_HL,"",0,0));
- for(i = 0; i < subsets_num; ++i)
+ for(i = 0; i < level_subsets.num_items; ++i)
{
- menu_additem(&subset_load_menu,menu_item_create(MN_ACTION,level_subsets[i],0,0));
+ menu_additem(&subset_load_menu,menu_item_create(MN_ACTION,level_subsets.item[i],0,0));
}
menu_additem(&subset_load_menu,menu_item_create(MN_HL,"",0,0));
menu_additem(&subset_load_menu,menu_item_create(MN_BACK,"Back",0,0));
menu_item_change_input(&level_settings_menu.item[2], le_current_level->name);
sprintf(str,"%d",le_current_level->width);
+
+ string_list_copy(level_settings_menu.item[3].list, dsubdirs("images/themes", "solid0.png"));
+ string_list_copy(level_settings_menu.item[4].list, dfiles("music/", NULL));
+ string_list_copy(level_settings_menu.item[5].list, dfiles("images/background", NULL));
+
menu_item_change_input(&level_settings_menu.item[6], str);
sprintf(str,"%d",le_current_level->time_left);
menu_item_change_input(&level_settings_menu.item[7], str);
{
int i,y,j;
strcpy(le_current_level->name,level_settings_menu.item[2].input);
-
+
+ strcpy(le_current_level->bkgd_image,string_list_active(level_settings_menu.item[5].list));
+
+ if(strcmp(le_current_level->theme,string_list_active(level_settings_menu.item[3].list)) != 0)
+ {
+ strcpy(le_current_level->theme,string_list_active(level_settings_menu.item[3].list));
+ level_free_gfx();
+ level_load_gfx(le_current_level);
+ }
+
+ strcpy(le_current_level->song_title,string_list_active(level_settings_menu.item[4].list));
+
i = le_current_level->width;
le_current_level->width = atoi(level_settings_menu.item[6].input);
if(le_current_level->width < i)
}
+
if(le_current_level != NULL)
{
if(event.type == SDL_KEYDOWN || event.type == SDL_KEYUP || ((event.type == SDL_MOUSEBUTTONDOWN || SDL_MOUSEMOTION) && (event.motion.x > screen->w-64 && event.motion.x < screen->w &&
event.motion.y > 0 && event.motion.y < screen->h)))
{
- /* Check for button events */
- button_event(&le_test_level_bt,&event);
- if(button_get_state(&le_test_level_bt) == BN_CLICKED)
- le_testlevel();
- button_event(&le_save_level_bt,&event);
- if(button_get_state(&le_save_level_bt) == BN_CLICKED)
- level_save(le_current_level,le_level_subset.name,le_level);
- button_event(&le_next_level_bt,&event);
- if(button_get_state(&le_next_level_bt) == BN_CLICKED)
- {
- if(le_level < le_level_subset.levels)
- le_goto_level(++le_level);
- }
- button_event(&le_previous_level_bt,&event);
- if(button_get_state(&le_previous_level_bt) == BN_CLICKED)
+ if(show_menu == NO)
{
- if(le_level > 1)
- le_goto_level(--le_level);
- }
- button_event(&le_rubber_bt,&event);
- if(button_get_state(&le_rubber_bt) == BN_CLICKED)
- le_current_tile = '.';
- button_event(&le_select_mode_one_bt,&event);
- if(button_get_state(&le_select_mode_one_bt) == BN_CLICKED)
- le_selection_mode = CURSOR;
- button_event(&le_select_mode_two_bt,&event);
- if(button_get_state(&le_select_mode_two_bt) == BN_CLICKED)
- le_selection_mode = SQUARE;
- button_event(&le_bad_bsod_bt,&event);
- if(button_get_state(&le_bad_bsod_bt) == BN_CLICKED)
- le_current_tile = '0';
- button_event(&le_settings_bt,&event);
- if(button_get_state(&le_settings_bt) == BN_CLICKED)
- {
- if(show_menu == NO)
+ /* Check for button events */
+ button_event(&le_test_level_bt,&event);
+ if(button_get_state(&le_test_level_bt) == BN_CLICKED)
+ le_testlevel();
+ button_event(&le_save_level_bt,&event);
+ if(button_get_state(&le_save_level_bt) == BN_CLICKED)
+ level_save(le_current_level,le_level_subset.name,le_level);
+ button_event(&le_next_level_bt,&event);
+ if(button_get_state(&le_next_level_bt) == BN_CLICKED)
{
- update_level_settings_menu();
- menu_set_current(&level_settings_menu);
- show_menu = YES;
+ if(le_level < le_level_subset.levels)
+ le_goto_level(++le_level);
}
- else
+ button_event(&le_previous_level_bt,&event);
+ if(button_get_state(&le_previous_level_bt) == BN_CLICKED)
{
- menu_set_current(&leveleditor_menu);
- show_menu = NO;
+ if(le_level > 1)
+ le_goto_level(--le_level);
+ }
+ button_event(&le_rubber_bt,&event);
+ if(button_get_state(&le_rubber_bt) == BN_CLICKED)
+ le_current_tile = '.';
+ button_event(&le_select_mode_one_bt,&event);
+ if(button_get_state(&le_select_mode_one_bt) == BN_CLICKED)
+ le_selection_mode = CURSOR;
+ button_event(&le_select_mode_two_bt,&event);
+ if(button_get_state(&le_select_mode_two_bt) == BN_CLICKED)
+ le_selection_mode = SQUARE;
+ button_event(&le_bad_bsod_bt,&event);
+ if(button_get_state(&le_bad_bsod_bt) == BN_CLICKED)
+ le_current_tile = '0';
+ button_event(&le_settings_bt,&event);
+ if(button_get_state(&le_settings_bt) == BN_CLICKED)
+ {
+ if(show_menu == NO)
+ {
+ update_level_settings_menu();
+ menu_set_current(&level_settings_menu);
+ show_menu = YES;
+ }
+ else
+ {
+ menu_set_current(&leveleditor_menu);
+ show_menu = NO;
+ }
+ }
+ }
+ else
+ {
+ button_event(&le_settings_bt,&event);
+ if(button_get_state(&le_settings_bt) == BN_CLICKED)
+ {
+ if(show_menu == NO)
+ {
+ update_level_settings_menu();
+ menu_set_current(&level_settings_menu);
+ show_menu = YES;
+ }
+ else
+ {
+ menu_set_current(&leveleditor_menu);
+ show_menu = NO;
+ }
}
}
}
- }
+ if(show_menu == NO)
+ {
+ button_event(&le_move_left_bt,&event);
+ if(button_get_state(&le_move_left_bt) == BN_PRESSED)
+ {
+ pos_x -= 192;
+ }
+ else if(button_get_state(&le_move_left_bt) == BN_HOVER)
+ {
+ pos_x -= 96;
+ }
+ button_event(&le_move_right_bt,&event);
+ if(button_get_state(&le_move_right_bt) == BN_PRESSED)
+ {
+ pos_x += 192;
+ }
+ else if(button_get_state(&le_move_right_bt) == BN_HOVER)
+ {
+ pos_x += 96;
+ }
- button_event(&le_move_left_bt,&event);
- if(button_get_state(&le_move_left_bt) == BN_PRESSED)
- {
- pos_x -= 192;
- }
- else if(button_get_state(&le_move_left_bt) == BN_HOVER)
- {
- pos_x -= 96;
- }
- button_event(&le_move_right_bt,&event);
- if(button_get_state(&le_move_right_bt) == BN_PRESSED)
- {
- pos_x += 192;
- }
- else if(button_get_state(&le_move_right_bt) == BN_HOVER)
- {
- pos_x += 96;
+ if(le_mouse_pressed)
+ {
+ le_change(cursor_x, cursor_y, le_current_tile);
+ }
+ }
}
- if(le_mouse_pressed)
- {
- le_change(cursor_x, cursor_y, le_current_tile);
- }
}
int show_menu;
int menu_change;
texture_type checkbox, checkbox_checked, back, arrow_left, arrow_right;
-;
menu_type main_menu, game_menu, options_menu, highscore_menu, load_game_menu, save_game_menu;
menu_type* current_menu, * last_menu;
pnew_item->target_menu = target_menu;
pnew_item->input = (char*) malloc(sizeof(char));
pnew_item->input[0] = '\0';
+ if(kind == MN_STRINGSELECT)
+ {
+ pnew_item->list = (string_list_type*) malloc(sizeof(string_list_type));
+ string_list_init(pnew_item->list);
+ }
+ else
+ pnew_item->list = NULL;
return pnew_item;
}
{
free(pmenu->item[i].text);
free(pmenu->item[i].input);
+ string_list_free(pmenu->item[i].list);
}
free(pmenu->item);
}
pmenu->active_item = 0;
break;
case MN_LEFT:
- if(pmenu->item[pmenu->active_item].kind == MN_STRINGSELECT)
- {}
+ if(pmenu->item[pmenu->active_item].kind == MN_STRINGSELECT && pmenu->item[pmenu->active_item].list->num_items != 0)
+ {
+ if(pmenu->item[pmenu->active_item].list->active_item > 0)
+ --pmenu->item[pmenu->active_item].list->active_item;
+ else
+ pmenu->item[pmenu->active_item].list->active_item = pmenu->item[pmenu->active_item].list->num_items-1;
+ }
+ break;
case MN_RIGHT:
- if(pmenu->item[pmenu->active_item].kind == MN_STRINGSELECT)
- {}
+ if(pmenu->item[pmenu->active_item].kind == MN_STRINGSELECT && pmenu->item[pmenu->active_item].list->num_items != 0)
+ {
+ if(pmenu->item[pmenu->active_item].list->active_item < pmenu->item[pmenu->active_item].list->num_items-1)
+ ++pmenu->item[pmenu->active_item].list->active_item;
+ else
+ pmenu->item[pmenu->active_item].list->active_item = 0;
+ }
+ break;
case MN_HIT:
if(pmenu->item[pmenu->active_item].kind == MN_GOTO && pmenu->item[pmenu->active_item].target_menu != NULL)
menu_set_current((menu_type*)pmenu->item[pmenu->active_item].target_menu);
menu_width = 0;
for(i = 0; i < pmenu->num_items; ++i)
{
- y = strlen(pmenu->item[i].text) + (pmenu->item[i].input ? strlen(pmenu->item[i].input) + 1 : 0);
+ y = strlen(pmenu->item[i].text) + (pmenu->item[i].input ? strlen(pmenu->item[i].input) + 1 : 0) + strlen(string_list_active(pmenu->item[i].list));
if( y > menu_width )
{
menu_width = y;
for(i = 0; i < pmenu->num_items; ++i)
{
if(pmenu->arrange_left == YES)
- b = (a - ((strlen(pmenu->item[i].text)+strlen(pmenu->item[i].input)) * 16)) / 2;
+ b = (a - ((strlen(pmenu->item[i].text)+strlen(pmenu->item[i].input)+ strlen(string_list_active(pmenu->item[i].list))) * 16)) / 2;
else
b = 0;
}
else if(pmenu->item[i].kind == MN_STRINGSELECT)
{
- /* Draw arrows */
- texture_draw(&arrow_left,-b +screen->w/2 - ((strlen(pmenu->item[i].input)*16)/2) + ((strlen(pmenu->item[i].text) + 1)*16)/2 - 17,(i)*24 - menu_height/2 + 10 + screen->h / 2 -8 + f,NO_UPDATE);
- texture_draw(&arrow_right,-b +screen->w/2 - ((strlen(pmenu->item[i].input)*16)/2) + ((strlen(pmenu->item[i].text) + 1)*16)/2 - 1 + (strlen(pmenu->item[i].input)+1)*16,(i)*24 - menu_height/2 + 10 + screen->h / 2 -8 + f,NO_UPDATE);
- /* Draw input background */
- fillrect(-b +screen->w/2 - ((strlen(pmenu->item[i].input)*16)/2) + ((strlen(pmenu->item[i].text) + 1)*16)/2 - 1,(i)*24 - menu_height/2 + 10 + screen->h /2 - 10 + f,(strlen(pmenu->item[i].input)+1)*16 + 2,20,255,255,255,255);
- fillrect(- b +screen->w/2 - ((strlen(pmenu->item[i].input)*16)/2) + ((strlen(pmenu->item[i].text) + 1)*16)/2,(i)*24 - menu_height/2 + 10 + screen->h /2 - 9 + f,(strlen(pmenu->item[i].input)+1)*16,18,0,0,0,128);
-
- text_drawf(&gold_text,pmenu->item[i].input, - b + ((strlen(pmenu->item[i].text)+1) * 16)/2,(i)*24 - menu_height/2 + 10 + f,A_HMIDDLE, A_VMIDDLE,2,NO_UPDATE);
+ /* Draw arrows */
+ texture_draw(&arrow_left,-b +screen->w/2 - ((strlen(string_list_active(pmenu->item[i].list))*16)/2) + ((strlen(pmenu->item[i].text) + 1)*16)/2 - 17,(i)*24 - menu_height/2 + 10 + screen->h / 2 -8 + f,NO_UPDATE);
+ texture_draw(&arrow_right,-b +screen->w/2 - ((strlen(string_list_active(pmenu->item[i].list))*16)/2) + ((strlen(pmenu->item[i].text) + 1)*16)/2 - 1 + (strlen(string_list_active(pmenu->item[i].list))+1)*16,(i)*24 - menu_height/2 + 10 + screen->h / 2 -8 + f,NO_UPDATE);
+ /* Draw input background */
+ fillrect(-b +screen->w/2 - ((strlen(string_list_active(pmenu->item[i].list))*16)/2) + ((strlen(pmenu->item[i].text) + 1)*16)/2 - 1,(i)*24 - menu_height/2 + 10 + screen->h /2 - 10 + f,(strlen(string_list_active(pmenu->item[i].list))+1)*16 + 2,20,255,255,255,255);
+ fillrect(- b +screen->w/2 - ((strlen(string_list_active(pmenu->item[i].list))*16)/2) + ((strlen(pmenu->item[i].text) + 1)*16)/2,(i)*24 - menu_height/2 + 10 + screen->h /2 - 9 + f,(strlen(string_list_active(pmenu->item[i].list))+1)*16,18,0,0,0,128);
+
+ text_drawf(&gold_text,string_list_active(pmenu->item[i].list), - b + ((strlen(pmenu->item[i].text)+1) * 16)/2,(i)*24 - menu_height/2 + 10 + f,A_HMIDDLE, A_VMIDDLE,2,NO_UPDATE);
if(i == pmenu->active_item)
{
- text_drawf(&blue_text,pmenu->item[i].text, - b -(((strlen(pmenu->item[i].input)+1) * 16)/2),(i)*24 - menu_height/2 + 10 + f,A_HMIDDLE, A_VMIDDLE,3,NO_UPDATE);
+ text_drawf(&blue_text,pmenu->item[i].text, - b -(((strlen(string_list_active(pmenu->item[i].list))+1) * 16)/2),(i)*24 - menu_height/2 + 10 + f,A_HMIDDLE, A_VMIDDLE,3,NO_UPDATE);
}
else
{
- text_drawf(&white_text,pmenu->item[i].text, - b -(((strlen(pmenu->item[i].input)+1) * 16)/2),(i)*24 - menu_height/2 +10 + f,A_HMIDDLE, A_VMIDDLE,2,NO_UPDATE);
+ text_drawf(&white_text,pmenu->item[i].text, - b -(((strlen(string_list_active(pmenu->item[i].list))+1) * 16)/2),(i)*24 - menu_height/2 +10 + f,A_HMIDDLE, A_VMIDDLE,2,NO_UPDATE);
}
}
else if(i == pmenu->active_item)
#include <SDL.h>
#include "texture.h"
#include "timer.h"
+#include "type.h"
typedef struct menu_item_type
{
int kind;
+ int toggled;
char *text;
char *input;
- int toggled;
+ string_list_type* list;
void* target_menu;
}
menu_item_type;
/* Get all names of sub-directories in a certain directory. */
/* Returns the number of sub-directories found. */
/* Note: The user has to free the allocated space. */
-char ** dsubdirs(char *rel_path, char* expected_file, int* num)
+string_list_type dsubdirs(char *rel_path, char* expected_file)
{
DIR *dirStructP;
struct dirent *direntp;
int i = 0;
- char ** sdirs= NULL;
+ string_list_type sdirs;
char filename[1024];
char path[1024];
+ string_list_init(&sdirs);
sprintf(path,"%s/%s",st_dir,rel_path);
if((dirStructP = opendir(path)) != NULL)
{
continue;
}
- sdirs = (char**) realloc(sdirs, sizeof(char*) * (i+1));
- sdirs[i] = (char*) malloc(sizeof(char) * strlen(direntp->d_name) + 1 );
- strcpy(sdirs[i],direntp->d_name);
- ++i;
+ string_list_add_item(&sdirs,direntp->d_name);
}
}
closedir(dirStructP);
}
}
- sdirs = (char**) realloc(sdirs, sizeof(char*) * (i+1));
- sdirs[i] = (char*) malloc(sizeof(char) * strlen(direntp->d_name) + 1 );
- strcpy(sdirs[i],direntp->d_name);
- ++i;
+ string_list_add_item(&sdirs,direntp->d_name);
+ }
+ }
+ closedir(dirStructP);
+ }
+
+ return sdirs;
+}
+
+string_list_type dfiles(char *rel_path, char* expected_file)
+{
+ DIR *dirStructP;
+ struct dirent *direntp;
+ int i = 0;
+ string_list_type sdirs;
+ char filename[1024];
+ char path[1024];
+
+ string_list_init(&sdirs);
+ sprintf(path,"%s/%s",st_dir,rel_path);
+ if((dirStructP = opendir(path)) != NULL)
+ {
+ while((direntp = readdir(dirStructP)) != NULL)
+ {
+ char absolute_filename[1024];
+ struct stat buf;
+
+ sprintf(absolute_filename, "%s/%s", path, direntp->d_name);
+
+ if (stat(absolute_filename, &buf) == 0 && S_ISREG(buf.st_mode))
+ {
+ if(expected_file != NULL)
+ {
+ sprintf(filename,"%s/%s/%s",path,direntp->d_name,expected_file);
+ if(!faccessible(filename))
+ continue;
+ }
+
+ string_list_add_item(&sdirs,direntp->d_name);
+ }
+ }
+ closedir(dirStructP);
+ }
+
+ sprintf(path,"%s/%s",DATA_PREFIX,rel_path);
+ if((dirStructP = opendir(path)) != NULL)
+ {
+ while((direntp = readdir(dirStructP)) != NULL)
+ {
+ char absolute_filename[1024];
+ struct stat buf;
+
+ sprintf(absolute_filename, "%s/%s", path, direntp->d_name);
+
+ if (stat(absolute_filename, &buf) == 0 && S_ISREG(buf.st_mode))
+ {
+ if(expected_file != NULL)
+ {
+ sprintf(filename,"%s/%s/%s",path,direntp->d_name,expected_file);
+ if(!faccessible(filename))
+ {
+ continue;
+ }
+ else
+ {
+ sprintf(filename,"%s/%s/%s/%s",st_dir,rel_path,direntp->d_name,expected_file);
+ if(faccessible(filename))
+ continue;
+ }
+ }
+
+ string_list_add_item(&sdirs,direntp->d_name);
}
}
closedir(dirStructP);
}
- *num = i;
return sdirs;
}
#include "menu.h"
#include "sound.h"
+#include "type.h"
int faccessible(char *filename);
int fcreatedir(char* relative_dir);
int fwriteable(char *filename);
-char ** dsubdirs(char *rel_path, char* expected_file, int* num);
+string_list_type dsubdirs(char *rel_path, char* expected_file);
+string_list_type dfiles(char *rel_path, char* expected_file);
void free_strings(char **strings, int num);
void st_directory_setup(void);
void st_general_setup(void);
SDLKey key;
int done, quit, frame, pict, i;
char str[80];
- char **level_subsets;
- int subsets_num;
- level_subsets = NULL;
- level_subsets = dsubdirs("/levels", "info", &subsets_num);
+ string_list_type level_subsets;
+ level_subsets = dsubdirs("/levels", "info");
st_subset subset;
subset_init(&subset);
case 2:
done = 0;
i = 0;
- if(level_subsets != NULL)
+ if(level_subsets.num_items != 0)
{
- subset_load(&subset,level_subsets[0]);
+ subset_load(&subset,level_subsets.item[0]);
while(!done)
{
texture_draw(&img_choose_subset,(screen->w - img_choose_subset.w) / 2, 0, NO_UPDATE);
- if(subsets_num != 0)
+ if(level_subsets.num_items != 0)
{
texture_draw(&subset.image,(screen->w - subset.image.w) / 2 + 25,78,NO_UPDATE);
- if(subsets_num > 1)
+ if(level_subsets.num_items > 1)
{
if(i > 0)
texture_draw(&arrow_left,(screen->w / 2) - ((strlen(subset.title)+2)*16)/2,20,NO_UPDATE);
- if(i < subsets_num-1)
+ if(i < level_subsets.num_items-1)
texture_draw(&arrow_right,(screen->w / 2) + ((strlen(subset.title))*16)/2,20,NO_UPDATE);
}
text_drawf(&gold_text, subset.title, 0, 20, A_HMIDDLE, A_TOP, 1, NO_UPDATE);
{
--i;
subset_free(&subset);
- subset_load(&subset,level_subsets[i]);
+ subset_load(&subset,level_subsets.item[i]);
}
}
else if(key == SDLK_RIGHT)
{
- if(i < subsets_num -1)
+ if(i < level_subsets.num_items -1)
{
++i;
subset_free(&subset);
- subset_load(&subset,level_subsets[i]);
+ subset_load(&subset,level_subsets.item[i]);
}
}
else if(key == SDLK_SPACE || key == SDLK_RETURN)
texture_free(&title);
texture_free(&anim1);
texture_free(&anim2);
- free_strings(level_subsets,subsets_num);
+ string_list_free(&level_subsets);
/* Return to main! */
//
#include "SDL_image.h"
+#include "string.h"
+#include "stdlib.h"
#include "setup.h"
#include "globals.h"
#include "screen.h"
#include "type.h"
#include "scene.h"
+void string_list_init(string_list_type* pstring_list)
+{
+pstring_list->num_items = 0;
+pstring_list->active_item = -1;
+pstring_list->item = NULL;
+}
+char* string_list_active(string_list_type* pstring_list)
+{
+if(pstring_list == NULL)
+return "";
+
+if(pstring_list->active_item != -1)
+return pstring_list->item[pstring_list->active_item];
+else
+return "";
+}
+
+void string_list_add_item(string_list_type* pstring_list, char* str)
+{
+char *pnew_string;
+pnew_string = (char*) malloc(sizeof(char)*(strlen(str)+1));
+strcpy(pnew_string,str);
+++pstring_list->num_items;
+pstring_list->item = (char**) realloc(pstring_list->item,sizeof(char**)*pstring_list->num_items);
+pstring_list->item[pstring_list->num_items-1] = pnew_string;
+if(pstring_list->active_item == -1)
+pstring_list->active_item = 0;
+}
+
+void string_list_copy(string_list_type* pstring_list, string_list_type pstring_list_orig)
+{
+int i;
+string_list_free(pstring_list);
+for(i = 0; i < pstring_list_orig.num_items; ++i)
+string_list_add_item(pstring_list,pstring_list_orig.item[i]);
+}
+
+void string_list_free(string_list_type* pstring_list)
+{
+if(pstring_list != NULL)
+{
+ int i;
+ for(i=0; i < pstring_list->num_items; ++i)
+ free(pstring_list->item[i]);
+free(pstring_list->item);
+pstring_list->item = NULL;
+pstring_list->num_items = 0;
+pstring_list->active_item = -1;
+}
+}
}
base_type;
+
+typedef struct string_list_type
+{
+ int num_items;
+ int active_item;
+ char **item;
+ }
+string_list_type;
+
+void string_list_init(string_list_type* pstring_list);
+char* string_list_active(string_list_type* pstring_list);
+void string_list_copy(string_list_type* pstring_list, string_list_type pstring_list_orig);
+void string_list_add_item(string_list_type* pstring_list, char* str);
+void string_list_free(string_list_type* pstring_list);
+
#endif /*SUPERTUX_TYPE_H*/