summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2011-10-16 19:15:47 -0700
committerBenjamin Otte <otte@redhat.com>2011-10-16 22:32:55 -0700
commite8e37ce1506a778c4b2e8fd667ca6861db415c55 (patch)
treeeed107416968bdd51ee90e16b11365bd5ad6bd9f
parent29daf412d442f98c64d3e26313f5f7c157691f81 (diff)
game: Get rid of named objects
Instead, rely on resources by name.
-rw-r--r--libgame/game-game.c52
-rw-r--r--libgame/game-game.h4
-rw-r--r--libgame/game-object.c19
3 files changed, 22 insertions, 53 deletions
diff --git a/libgame/game-game.c b/libgame/game-game.c
index e51b263..f0f3e75 100644
--- a/libgame/game-game.c
+++ b/libgame/game-game.c
@@ -253,17 +253,6 @@ always_relevant (GameFilter *filter, GameObject *object)
}
static void
-unref_and_unset_name (gpointer data)
-{
- GameObject *object = GAME_OBJECT (data);
-
- g_free (object->name);
- object->name = NULL;
- g_object_notify (G_OBJECT (object), "name");
- g_object_unref (object);
-}
-
-static void
game_game_init (GTypeInstance *instance, gpointer g_class)
{
GameGame *game = (GameGame *) instance;
@@ -271,8 +260,6 @@ game_game_init (GTypeInstance *instance, gpointer g_class)
game->frame_rate = 25;
game->max_players = 1;
- game->named_objects = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
- unref_and_unset_name);
game->rand = g_rand_new ();
game->flush_requests = g_queue_new ();
@@ -389,7 +376,11 @@ game_game_dispose (GObject *object)
game_game_unset_match (game);
- g_hash_table_destroy (game->named_objects);
+ if (game->default_resources)
+ {
+ g_hash_table_destroy (game->default_resources);
+ game->default_resources = NULL;
+ }
game_container_iter_init (&iter, GAME_CONTAINER (game));
while ((o = game_container_iter_next (&iter))) {
if (o->permanent) {
@@ -1092,22 +1083,12 @@ err:
return NULL;
}
-GameObject *
-game_game_get_object (GameGame *game, const char *name)
-{
- g_return_val_if_fail (GAME_IS_GAME (game), NULL);
- g_return_val_if_fail (name != NULL, NULL);
-
- return g_hash_table_lookup (game->named_objects, name);
-}
-
static void
game_game_add_resource (GameGame * game,
const char * name,
GameResource *resource)
{
- g_object_ref (resource);
- g_object_set (resource, "name", name, NULL);
+ g_hash_table_insert (game->default_resources, g_strdup (name), g_object_ref (resource));
}
static void
@@ -1121,6 +1102,12 @@ game_game_load_default_resources (GameGame *game)
GError *error = NULL;
GameResource *resource;
+ if (G_LIKELY (game->default_resources))
+ return;
+
+ game->default_resources = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, g_object_unref);
+
s = g_strconcat (game->name, ".resources", NULL);
data_resource = game_game_load_resource (game, s);
g_free (s);
@@ -1157,18 +1144,21 @@ game_game_load_default_resources (GameGame *game)
GameResource *
game_game_get_resource (GameGame *game, const char *name)
{
- gpointer p;
+ GameResource *resource;
g_return_val_if_fail (GAME_IS_GAME (game), NULL);
g_return_val_if_fail (name != NULL, NULL);
game_game_load_default_resources (game);
- p = g_hash_table_lookup (game->named_objects, name);
- if (GAME_IS_RESOURCE (p))
- return p;
- else
- return NULL;
+ resource = g_hash_table_lookup (game->default_resources, name);
+ if (resource == NULL)
+ {
+ g_critical ("No resources named `%s'", name);
+ return NULL;
+ }
+
+ return resource;
}
GameObject *
diff --git a/libgame/game-game.h b/libgame/game-game.h
index c1430c0..c1a69ea 100644
--- a/libgame/game-game.h
+++ b/libgame/game-game.h
@@ -59,7 +59,7 @@ struct _GameGame
gchar * description;
gchar * version;
- GHashTable * named_objects; /* named objects for easy access */
+ GHashTable * default_resources; /* loaded default resources: name => GameResource */
GameGraphic * icon; /* the icon to use */
GameGraphic * viewport; /* default thing you see when no game is running */
GameMatch * match; /* the current match */
@@ -130,8 +130,6 @@ void game_game_set_max_players (GameGame * game,
guint game_game_get_max_players (GameGame * game);
-GameObject * game_game_get_object (GameGame * game,
- const char * name);
GameResource * game_game_get_resource (GameGame * game,
const char * name);
GameDataResource *game_game_load_resource (GameGame * game,
diff --git a/libgame/game-object.c b/libgame/game-object.c
index 25a5134..c4004cd 100644
--- a/libgame/game-object.c
+++ b/libgame/game-object.c
@@ -24,7 +24,6 @@
enum {
PROP_0,
PROP_GAME,
- PROP_NAME,
PROP_PERMANENT,
};
@@ -71,9 +70,6 @@ game_object_get_property (GObject *object_, guint param_id, GValue *value,
case PROP_GAME:
g_value_set_object (value, object->game);
break;
- case PROP_NAME:
- g_value_set_string (value, object->name);
- break;
case PROP_PERMANENT:
g_value_set_boolean (value, object->permanent);
break;
@@ -101,18 +97,6 @@ game_object_set_property (GObject *obj, guint param_id, const GValue *value,
if (klass->game_set)
klass->game_set (object);
break;
- case PROP_NAME:
- /* may not be set before game is set */
- g_assert (object->game != NULL);
- if (object->name)
- g_hash_table_remove (object->game->named_objects, object->name);
- g_assert (object->name == NULL);
- object->name = g_strdup (g_value_get_string (value));
- if (object->name) {
- g_hash_table_insert (object->game->named_objects, object->name, object);
- g_object_ref (object);
- }
- break;
case PROP_PERMANENT:
if (object->permanent != g_value_get_boolean (value)) {
object->permanent = g_value_get_boolean (value);
@@ -189,9 +173,6 @@ game_object_class_init (gpointer g_class, gpointer class_data)
g_object_class_install_property (object_class, PROP_GAME,
g_param_spec_object ("game", _("game"), _("game this object belongs to"),
GAME_TYPE_GAME, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
- g_object_class_install_property (object_class, PROP_NAME,
- g_param_spec_string ("name", _("name"), _("unique name for easy identification"),
- NULL, G_PARAM_READWRITE));
g_object_class_install_property (object_class, PROP_PERMANENT,
g_param_spec_boolean ("permanent", _("permanent"),
_("whether this object stays alive on level change"),