Added the menu loading and checking functions.
Signed-off-by: Gergely POLONKAI (W00d5t0ck) <polesz@w00d5t0ck.info>
This commit is contained in:
parent
d60f0a85f1
commit
db4ca68b7e
@ -25,6 +25,7 @@
|
||||
<xi:include href="xml/interpreter.xml"/>
|
||||
<xi:include href="xml/db.xml"/>
|
||||
<xi:include href="xml/player.xml"/>
|
||||
<xi:include href="xml/menu.xml"/>
|
||||
<xi:include href="xml/world.xml"/>
|
||||
|
||||
</chapter>
|
||||
|
@ -79,6 +79,11 @@ wmud_player_auth
|
||||
wmud_player_exists
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<TITLE></TITLE>
|
||||
<FILE>menu</FILE>
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<TITLE></TITLE>
|
||||
<FILE>world</FILE>
|
||||
|
@ -1,5 +1,5 @@
|
||||
bin_PROGRAMS = wmud
|
||||
AM_CPPFLAGS = -DWMUD_STATEDIR=\""$(localstatedir)"\" -DWMUD_CONFDIR=\""$(sysconfdir)"\" $(MEMCACHED_CFLAGS) $(GLIB_CFLAGS) $(GIO_CFLAGS) $(GTHREAD_CFLAGS) $(SQLITE3_CFLAGS)
|
||||
|
||||
wmud_SOURCES = main.c game-networking.c interpreter.c db.c players.c maintenance.c game.c configuration.c world.c
|
||||
wmud_SOURCES = main.c game-networking.c interpreter.c db.c players.c maintenance.c game.c configuration.c world.c menu.c
|
||||
wmud_LDADD = $(MEMCACHED_LIBS) $(GLIB_LIBS) $(GIO_LIBS) $(GTHREAD_LIBS) $(SQLITE3_LIBS)
|
||||
|
57
wmud/db.c
57
wmud/db.c
@ -25,6 +25,7 @@
|
||||
#include "db.h"
|
||||
#include "players.h"
|
||||
#include "configuration.h"
|
||||
#include "menu.h"
|
||||
|
||||
/**
|
||||
* SECTION:db
|
||||
@ -550,3 +551,59 @@ wmud_db_load_planet_planes(GSList **planet_planes, GError **err)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
wmud_db_load_menu(GSList **menu_items, GError **err)
|
||||
{
|
||||
sqlite3_stmt *sth = NULL;
|
||||
int sqlite_code;
|
||||
|
||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading menu items");
|
||||
if (dbh == NULL)
|
||||
{
|
||||
if (err)
|
||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT, "Database backend not initialized");
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ((sqlite_code = sqlite3_prepare_v2(dbh, "SELECT id, menuchar, need_active_char, placement, display_text, fnctn FROM menu", -1, &sth, NULL)) != SQLITE_OK)
|
||||
{
|
||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_BADQUERY, "Bad query in wmud_db_load_menu(): %s", sqlite3_errmsg(dbh));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
sqlite_code = sqlite3_step(sth);
|
||||
if (sqlite_code == SQLITE_ROW)
|
||||
{
|
||||
wmudMenu *menu_item = g_new0(wmudMenu, 1);
|
||||
menu_item->id = sqlite3_column_int(sth, 0);
|
||||
menu_item->menuchar = *(sqlite3_column_text(sth, 1));
|
||||
menu_item->need_active_char = (sqlite3_column_int(sth, 2) != 0);
|
||||
menu_item->placement = sqlite3_column_int(sth, 4);
|
||||
menu_item->text = g_strdup((gchar *)sqlite3_column_text(sth, 5));
|
||||
menu_item->func = g_strdup((gchar *)sqlite3_column_text(sth, 6));
|
||||
|
||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded menu item %s(%d)", menu_item->text, menu_item->id);
|
||||
|
||||
*menu_items = g_slist_prepend(*menu_items, menu_item);
|
||||
}
|
||||
else if (sqlite_code == SQLITE_DONE)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_set_error(err, WMUD_DB_ERROR, WMUD_DB_ERROR_BADQUERY, "Query error in wmud_db_load_menu_items(): %s", sqlite3_errmsg(dbh));
|
||||
sqlite3_finalize(sth);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
sqlite3_finalize(sth);
|
||||
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -50,6 +50,7 @@ gboolean wmud_db_load_areas(GSList **areas, GError **err);
|
||||
gboolean wmud_db_load_rooms(GSList **rooms, GError **err);
|
||||
gboolean wmud_db_load_exits(GSList **exits, GError **err);
|
||||
gboolean wmud_db_load_planet_planes(GSList **planet_planes, GError **err);
|
||||
gboolean wmud_db_load_menu(GSList **menu_items, GError **err);
|
||||
|
||||
#endif /* __WMUD__DB_H__ */
|
||||
|
||||
|
10
wmud/main.c
10
wmud/main.c
@ -136,6 +136,7 @@ main(int argc, char **argv)
|
||||
GError *err = NULL;
|
||||
GThread *game_thread;
|
||||
GMainContext *game_context;
|
||||
GSList *game_menu;
|
||||
|
||||
/* Initialize the thread and type system */
|
||||
g_thread_init(NULL);
|
||||
@ -182,9 +183,16 @@ main(int argc, char **argv)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!wmud_menu_init(&game_menu))
|
||||
{
|
||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "An error occured during menu loading.");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Initialization ends here */
|
||||
|
||||
wmud_game_init(&game_thread, &game_context);
|
||||
wmud_game_init(&game_thread, &game_context, game_menu);
|
||||
|
||||
g_clear_error(&err);
|
||||
if (!wmud_networking_init(active_config->port, game_context, &err))
|
||||
|
112
wmud/menu.c
Normal file
112
wmud/menu.c
Normal file
@ -0,0 +1,112 @@
|
||||
/* wMUD - Yet another MUD codebase by W00d5t0ck
|
||||
* Copyright (C) 2012 - Gergely POLONKAI
|
||||
*
|
||||
* menu.c: menu handling routines
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include "menu.h"
|
||||
#include "db.h"
|
||||
|
||||
#include "menu.h"
|
||||
|
||||
/**
|
||||
* SECTION:menu
|
||||
* @short_description: Menu handling
|
||||
* @title: Menu handling routines
|
||||
*
|
||||
*/
|
||||
|
||||
GQuark
|
||||
wmud_menu_error_quark()
|
||||
{
|
||||
return g_quark_from_static_string("wmud-menu-error");
|
||||
}
|
||||
|
||||
gboolean
|
||||
wmud_menu_items_check(GSList *menu_items, GError **err)
|
||||
{
|
||||
/* TODO: Check for duplicate menuchars */
|
||||
/* TODO: Check for duplicate menu texts */
|
||||
/* TODO: Check for duplicate placements */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
menu_item_free(wmudMenu *menu_item)
|
||||
{
|
||||
if (menu_item->text)
|
||||
g_free(menu_item->text);
|
||||
if (menu_item->display_text)
|
||||
g_free(menu_item->display_text);
|
||||
if (menu_item->display_text_ansi)
|
||||
g_free(menu_item->display_text_ansi);
|
||||
if (menu_item->func)
|
||||
g_free(menu_item->func);
|
||||
|
||||
g_free(menu_item);
|
||||
}
|
||||
|
||||
void
|
||||
wmud_menu_items_free(GSList **menu_items)
|
||||
{
|
||||
if (menu_items)
|
||||
{
|
||||
#if GLIB_CHECK_VERSION(2, 28, 0)
|
||||
g_slist_free_full(*menu_items, (GDestroyNotify)menu_item_free);
|
||||
#else
|
||||
g_slist_foreach(*menu_items, (GFunc)menu_item_free, NULL);
|
||||
g_slist_free(*menu_items);
|
||||
#endif
|
||||
*menu_items = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
wmud_menu_init(GSList **menu)
|
||||
{
|
||||
GSList *menu_items = NULL;
|
||||
GError *in_err = NULL;
|
||||
|
||||
if (!wmud_db_load_menu(&menu_items, &in_err))
|
||||
{
|
||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "Unable to load menu items from the database: %s", in_err->message);
|
||||
wmud_menu_items_free(&menu_items);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!menu_items)
|
||||
{
|
||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "No menu items were found in the database!");
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!wmud_menu_items_check(menu_items, &in_err))
|
||||
{
|
||||
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, "Menu items pre-flight check error: %s", in_err->message);
|
||||
wmud_menu_items_free(&menu_items);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
*menu = menu_items;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
58
wmud/menu.h
Normal file
58
wmud/menu.h
Normal file
@ -0,0 +1,58 @@
|
||||
/* wMUD - Yet another MUD codebase by W00d5t0ck
|
||||
* Copyright (C) 2012 - Gergely POLONKAI
|
||||
*
|
||||
* menu.h: menu handling routines
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef __WMUD_MENU_H__
|
||||
#define __WMUD_MENU_H__
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
/**
|
||||
* wmudMenu:
|
||||
* @id: The databas ID of the menu item
|
||||
* @menuchar: The highlighted character of the menu item. Players must enter it
|
||||
* in the menu to activate the menu item
|
||||
* @need_active_char: If %TRUE, the menu item will be displayed only if the
|
||||
* player has a character selected
|
||||
* @placement: The order number of the menu item. The whole menu is sorted
|
||||
* based on this field
|
||||
* @text: The text to be displayed to the player. It gets processed by
|
||||
* wmud_menu_process_item() to highlight the menuchar
|
||||
* @display_text: The actual text that gets displayed to the player
|
||||
* @display_text_ansi: The actual text that gets displayed to the player when
|
||||
* ANSI colour mode is enabled
|
||||
* @func: the menu item's function. See menu.c for the list of possible values.
|
||||
*/
|
||||
typedef struct _wmudMenu {
|
||||
guint id;
|
||||
gchar menuchar;
|
||||
gboolean need_active_char;
|
||||
guint placement;
|
||||
gchar *text;
|
||||
gchar *display_text;
|
||||
gchar *display_text_ansi;
|
||||
gchar *func;
|
||||
} wmudMenu;
|
||||
|
||||
#define WMUD_MENU_ERROR wmud_menu_error_quark()
|
||||
GQuark wmud_menu_error_quark();
|
||||
gboolean wmud_menu_init(GSList **menu);
|
||||
gboolean wmud_menu_items_check(GSList *menu_items, GError **err);
|
||||
void wmud_menu_items_free(GSList **menu_items);
|
||||
|
||||
#endif /* __WMUD_MENU_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user