From e8e37ce1506a778c4b2e8fd667ca6861db415c55 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 16 Oct 2011 19:15:47 -0700 Subject: game: Get rid of named objects Instead, rely on resources by name. --- libgame/game-game.c | 52 +++++++++++++++++++++------------------------------ libgame/game-game.h | 4 +--- libgame/game-object.c | 19 ------------------- 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 @@ -252,17 +252,6 @@ always_relevant (GameFilter *filter, GameObject *object) return TRUE; } -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) { @@ -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"), -- cgit v1.2.3