Complete.Org: Mailing Lists: Archives: freeciv-dev: June 2004:
[Freeciv-Dev] Re: (PR#8908) endgame numbers
Home

[Freeciv-Dev] Re: (PR#8908) endgame numbers

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: chrisk@xxxxxxxxx
Subject: [Freeciv-Dev] Re: (PR#8908) endgame numbers
From: "andrearo@xxxxxxxxxxxx" <andrearo@xxxxxxxxxxxx>
Date: Fri, 4 Jun 2004 12:55:08 -0700
Reply-to: rt@xxxxxxxxxxx

<URL: http://rt.freeciv.org/Ticket/Display.html?id=8908 >

Here's a patch. It fixes the bug with the population.
The patch also adds flags to each player in the list,
and outlines the current player in the list. Gtk1/2 support.
Screenshot:   http://www.stud.ntnu.no/~andrearo/endgame_screen.png

Andreas Røsdal
diff -ruN -Xfreeciv-cvs-Jun-03/diff_ignore 
freeciv-cvs-Jun-03/client/gui-gtk/repodlgs.c 
freeciv-cvs-Jun-03-endgame/client/gui-gtk/repodlgs.c
--- freeciv-cvs-Jun-03/client/gui-gtk/repodlgs.c        2004-04-24 
07:11:18.000000000 +0200
+++ freeciv-cvs-Jun-03-endgame/client/gui-gtk/repodlgs.c        2004-06-04 
21:43:57.527166898 +0200
@@ -96,10 +96,13 @@
 static GtkWidget *activeunits_list;
 static GtkWidget *upgrade_command;
 
+static SPRITE *flags[MAX_NUM_PLAYERS];
+
 static int activeunits_dialog_shell_is_modal;
 
 /******************************************************************/
 static void create_endgame_report(struct packet_endgame_report *packet);
+static void build_flag(int playerindex);
 static void endgame_destroy_callback(GtkObject *object, gpointer data);
 
 static GtkWidget *endgame_report_shell;
@@ -107,7 +110,7 @@
 static GtkWidget *close_endgame_command;
 static GtkWidget *sw;
 
-#define NUM_SCORE_COLS 14                
+#define NUM_SCORE_COLS 15                
 /******************************************************************/
 
 /******************************************************************
@@ -1129,6 +1132,7 @@
 
   static const char *titles_[NUM_SCORE_COLS] = {
     N_("Player\n"),
+    N_("Flag\n"),
     N_("Score\n"),
     N_("Population\n"),
     N_("Trade\n(M goods)"),
@@ -1185,30 +1189,82 @@
 
   gtk_widget_show_all(GTK_DIALOG(endgame_report_shell)->vbox);
   gtk_widget_show_all(GTK_DIALOG(endgame_report_shell)->action_area);
+  gtk_set_relative_position(toplevel, endgame_report_shell, 10, 10);
+  gtk_widget_show(endgame_report_shell);
 
   /* Insert score statistics into table. */
   gtk_clist_freeze(GTK_CLIST(scores_list));
   gtk_clist_clear(GTK_CLIST(scores_list));
   for (i = 0; i < packet->nscores; i++) {
     my_snprintf(stat[0], sizeof(stat[0]), "%s", 
get_player(packet->id[i])->name);
-    my_snprintf(stat[1], sizeof(stat[1]), "%d", packet->score[i]);
-    my_snprintf(stat[2], sizeof(stat[2]), "%d", packet->pop[i]);
-    my_snprintf(stat[3], sizeof(stat[3]), "%d", packet->bnp[i]);
-    my_snprintf(stat[4], sizeof(stat[4]), "%d", packet->mfg[i]);
-    my_snprintf(stat[5], sizeof(stat[5]), "%d", packet->cities[i]);
-    my_snprintf(stat[6], sizeof(stat[6]), "%d", packet->techs[i]);
-    my_snprintf(stat[7], sizeof(stat[7]), "%d", packet->mil_service[i]);
-    my_snprintf(stat[8], sizeof(stat[8]), "%d", packet->wonders[i]);
-    my_snprintf(stat[9], sizeof(stat[9]), "%d", packet->research[i]);
-    my_snprintf(stat[10], sizeof(stat[10]), "%d", packet->landarea[i]);
-    my_snprintf(stat[11], sizeof(stat[11]), "%d", packet->settledarea[i]);
-    my_snprintf(stat[12], sizeof(stat[12]), "%d", packet->literacy[i]);
-    my_snprintf(stat[13], sizeof(stat[13]), "%d", packet->spaceship[i]);
+    my_snprintf(stat[2], sizeof(stat[2]), "%d", packet->score[i]);
+    my_snprintf(stat[3], sizeof(stat[3]), "%s", 
+                population_to_text(packet->pop[i]));
+    my_snprintf(stat[4], sizeof(stat[4]), "%d", packet->bnp[i]);
+    my_snprintf(stat[5], sizeof(stat[5]), "%d", packet->mfg[i]);
+    my_snprintf(stat[6], sizeof(stat[6]), "%d", packet->cities[i]);
+    my_snprintf(stat[7], sizeof(stat[7]), "%d", packet->techs[i]);
+    my_snprintf(stat[8], sizeof(stat[8]), "%d", packet->mil_service[i]);
+    my_snprintf(stat[9], sizeof(stat[9]), "%d", packet->wonders[i]);
+    my_snprintf(stat[10], sizeof(stat[10]), "%d", packet->research[i]);
+    my_snprintf(stat[11], sizeof(stat[11]), "%d", packet->landarea[i]);
+    my_snprintf(stat[12], sizeof(stat[12]), "%d", packet->settledarea[i]);
+    my_snprintf(stat[13], sizeof(stat[13]), "%d", packet->literacy[i]);
+    my_snprintf(stat[14], sizeof(stat[14]), "%d", packet->spaceship[i]);
     gtk_clist_append(GTK_CLIST(scores_list), row);
+
+    build_flag(packet->id[i]);
+    if (flags[packet->id[i]]) {
+      gtk_clist_set_pixmap(GTK_CLIST(scores_list), i, 1,
+                           flags[packet->id[i]]->pixmap,
+                          flags[packet->id[i]]->mask);
+    }
+    if (packet->id[i] == game.player_idx) {
+      gtk_clist_select_row(GTK_CLIST(scores_list), i, 0);
+    }
   }
   gtk_clist_thaw(GTK_CLIST(scores_list));
 }
 
+
+#define MIN_DIMENSION 5
+
+/*
+ * Builds the flag pixmap.
+ */
+static void build_flag(int playerindex)
+{
+  int start_x, start_y, end_x, end_y, flag_h, flag_w, newflag_h, newflag_w;
+  SPRITE *flag, *croped, *scaled;
+
+  flag = get_nation_by_plr(&game.players[playerindex])->flag_sprite;
+  if (!flag) {
+    flags[playerindex] = NULL;
+    return;
+  }
+  /* calculate the bounding box ... */
+  sprite_get_bounding_box(flag, &start_x, &start_y, &end_x, &end_y);
+  assert(start_x != -1);
+  assert(start_y != -1);
+  assert(end_x != -1);
+  assert(end_y != -1);
+  flag_w = (end_x - start_x) + 1;
+  flag_h = (end_y - start_y) + 1;
+  /* if the flag is smaller then 5 x 5, something is wrong */
+  assert(flag_w >= MIN_DIMENSION && flag_h >= MIN_DIMENSION);
+  /* croping */
+  croped = crop_sprite(flag, start_x, start_y, flag_w, flag_h, NULL, -1, -1);
+  /* scaling */
+  newflag_h = GTK_CLIST(scores_list)->row_height;
+  newflag_w = ((double) newflag_h / flag_h) * flag_w;
+  scaled = sprite_scale(croped, newflag_w, newflag_h);
+  free_sprite(croped);
+  sprite_draw_black_border(scaled);
+  /* and finaly store the scaled flagsprite in the static flags array */
+  flags[playerindex] = scaled;
+}
+
+
 /**************************************************************************
   Show a dialog with player statistics at endgame.
 **************************************************************************/
@@ -1216,8 +1272,6 @@
 {
   if (!endgame_report_shell) {
     create_endgame_report(packet);
-    gtk_set_relative_position(toplevel, endgame_report_shell, 10, 10);
-    gtk_widget_show(endgame_report_shell);
   }
 }
 
diff -ruN -Xfreeciv-cvs-Jun-03/diff_ignore 
freeciv-cvs-Jun-03/client/gui-gtk-2.0/plrdlg.c 
freeciv-cvs-Jun-03-endgame/client/gui-gtk-2.0/plrdlg.c
--- freeciv-cvs-Jun-03/client/gui-gtk-2.0/plrdlg.c      2004-05-02 
07:12:07.000000000 +0200
+++ freeciv-cvs-Jun-03-endgame/client/gui-gtk-2.0/plrdlg.c      2004-06-04 
19:56:46.449523350 +0200
@@ -433,7 +433,7 @@
 /**************************************************************************
  Builds the flag pixmap.
 **************************************************************************/
-static GdkPixbuf *get_flag(struct nation_type *nation)
+GdkPixbuf *get_flag(struct nation_type *nation)
 {
   int x0, y0, x1, y1, w, h;
   GdkPixbuf *im;
diff -ruN -Xfreeciv-cvs-Jun-03/diff_ignore 
freeciv-cvs-Jun-03/client/gui-gtk-2.0/plrdlg.h 
freeciv-cvs-Jun-03-endgame/client/gui-gtk-2.0/plrdlg.h
--- freeciv-cvs-Jun-03/client/gui-gtk-2.0/plrdlg.h      2002-12-15 
01:38:23.000000000 +0100
+++ freeciv-cvs-Jun-03-endgame/client/gui-gtk-2.0/plrdlg.h      2004-06-04 
19:56:55.982872731 +0200
@@ -16,5 +16,6 @@
 #include "plrdlg_g.h"
 
 void popdown_players_dialog(void);
+GdkPixbuf *get_flag(struct nation_type *nation);
 
 #endif  /* FC__PLRDLG_H */
diff -ruN -Xfreeciv-cvs-Jun-03/diff_ignore 
freeciv-cvs-Jun-03/client/gui-gtk-2.0/repodlgs.c 
freeciv-cvs-Jun-03-endgame/client/gui-gtk-2.0/repodlgs.c
--- freeciv-cvs-Jun-03/client/gui-gtk-2.0/repodlgs.c    2004-05-12 
07:12:28.000000000 +0200
+++ freeciv-cvs-Jun-03-endgame/client/gui-gtk-2.0/repodlgs.c    2004-06-04 
20:04:09.993363206 +0200
@@ -44,6 +44,7 @@
 #include "mapview_common.h"
 #include "options.h"
 #include "packhand_gen.h"
+#include "plrdlg.h"
 #include "control.h"
 #include "text.h"
 
@@ -114,7 +115,7 @@
 static GtkWidget *scores_list;
 static GtkWidget *sw;
 
-#define NUM_SCORE_COLS 14                
+#define NUM_SCORE_COLS 15                
 /******************************************************************/
 
 /******************************************************************
@@ -1307,9 +1308,12 @@
   int i;
   static bool titles_done;
   GtkTreeIter it;
+  GtkTreeSelection *selection;
+  GdkPixbuf *flag;
       
   static const char *titles[NUM_SCORE_COLS] = {
     N_("Player\n"),
+    N_("Flag\n"),
     N_("Score\n"),
     N_("Population\n"),
     N_("Trade\n(M goods)"), 
@@ -1325,10 +1329,11 @@
     N_("Spaceship\n")
   };
 
-  static GType model_types[NUM_SCORE_COLS] = {
+  GType model_types[NUM_SCORE_COLS] = {
     G_TYPE_STRING,
+    GDK_TYPE_PIXBUF,
     G_TYPE_INT,
-    G_TYPE_INT,
+    G_TYPE_STRING,
     G_TYPE_INT,
     G_TYPE_INT,
     G_TYPE_INT,
@@ -1358,18 +1363,28 @@
   setup_dialog(endgame_report_shell, toplevel);
   scores_store = gtk_list_store_newv(ARRAY_SIZE(model_types), model_types);
   scores_list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(scores_store));
+  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(scores_list));
   g_object_unref(scores_store);
     
   for (i = 0; i < NUM_SCORE_COLS; i++) {
-    GtkCellRenderer *renderer;
-    GtkTreeViewColumn *col;
+    if (model_types[i] == GDK_TYPE_PIXBUF) {
+      GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new();
+      GtkTreeViewColumn *col = 
+           gtk_tree_view_column_new_with_attributes(titles[i],
+                                                   renderer, "pixbuf",
+                                                   i, NULL);
+      gtk_tree_view_append_column(GTK_TREE_VIEW(scores_list), col);
+    } else { 
+      GtkCellRenderer *renderer;
+      GtkTreeViewColumn *col;
       
-    renderer = gtk_cell_renderer_text_new();
-    g_object_set(renderer, "weight", "bold", NULL);
-    col = gtk_tree_view_column_new_with_attributes(titles[i], renderer,
+      renderer = gtk_cell_renderer_text_new();
+      g_object_set(renderer, "weight", "bold", NULL);
+      col = gtk_tree_view_column_new_with_attributes(titles[i], renderer,
                                                    "text", i, NULL);
-    gtk_tree_view_column_set_sort_column_id(col, i);
-    gtk_tree_view_append_column(GTK_TREE_VIEW(scores_list), col);
+      gtk_tree_view_column_set_sort_column_id(col, i);
+      gtk_tree_view_append_column(GTK_TREE_VIEW(scores_list), col);
+    }
   }  
 
   /* Setup the layout. */
@@ -1388,23 +1403,29 @@
   /* Insert score statistics into table.  */
   gtk_list_store_clear(scores_store);
   for (i = 0; i < packet->nscores; i++) {
+    flag = get_flag(get_nation_by_plr(get_player(packet->id[i])));
     gtk_list_store_append(scores_store, &it);
     gtk_list_store_set(scores_store, &it,
                        0, (gchar *)get_player(packet->id[i])->name,
-                       1, packet->score[i],
-                       2, packet->pop[i],
-                       3, packet->bnp[i],
-                       4, packet->mfg[i],
-                       5, packet->cities[i],
-                       6, packet->techs[i],
-                       7, packet->mil_service[i],
-                       8, packet->wonders[i],
-                       9, packet->research[i],
-                       10, packet->landarea[i],
-                       11, packet->settledarea[i],
-                       12, packet->literacy[i],
-                       13, packet->spaceship[i],
+                       1, flag,
+                       2, packet->score[i],
+                       3, population_to_text(packet->pop[i]),
+                       4, packet->bnp[i],
+                       5, packet->mfg[i],
+                       6, packet->cities[i],
+                       7, packet->techs[i],
+                       8, packet->mil_service[i],
+                       9, packet->wonders[i],
+                       10, packet->research[i],
+                       11, packet->landarea[i],
+                       12, packet->settledarea[i],
+                       13, packet->literacy[i],
+                       14, packet->spaceship[i],
                        -1);
+    if (packet->id[i] == game.player_idx) {
+      gtk_tree_selection_select_iter(selection, &it);
+    }
+    g_object_unref(flag);
   }
 }
 
diff -ruN -Xfreeciv-cvs-Jun-03/diff_ignore freeciv-cvs-Jun-03/server/report.c 
freeciv-cvs-Jun-03-endgame/server/report.c
--- freeciv-cvs-Jun-03/server/report.c  2004-05-12 07:12:44.000000000 +0200
+++ freeciv-cvs-Jun-03-endgame/server/report.c  2004-06-04 19:03:34.000000000 
+0200
@@ -1134,7 +1134,7 @@
   for (i = 0; i < j; i++) {
     packet.id[i] = size[i].player->player_no;
     packet.score[i] = size[i].value;
-    packet.pop[i] = get_pop(size[i].player) * 1000; 
+    packet.pop[i] = get_population(size[i].player); 
     packet.bnp[i] = get_economics(size[i].player); 
     packet.mfg[i] = get_production(size[i].player); 
     packet.cities[i] = get_cities(size[i].player); 

[Prev in Thread] Current Thread [Next in Thread]