[Freeciv-Dev] (PR#9479) some fs stuff (fwd)
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: |
undisclosed-recipients: ; |
Subject: |
[Freeciv-Dev] (PR#9479) some fs stuff (fwd) |
From: |
"Per I. Mathisen" <per@xxxxxxxxxxx> |
Date: |
Thu, 22 Jul 2004 13:50:49 -0700 |
Reply-to: |
rt@xxxxxxxxxxx |
<URL: http://rt.freeciv.org/Ticket/Display.html?id=9479 >
---------- Forwarded message ----------
Date: Sun, 20 Jun 2004 12:27:16 +0000 (GMT)
From: Per I. Mathisen <pim@xxxxxxxxxxxx>
To: freeciv-dev@xxxxxxxxxxx
Subject: [Freeciv-Dev] some fs stuff
Can those working on the client (Jason and Vasco mostly) please look at
integrating this? It is the client-common changes from the gui-fs patch.
This stuff will get old fast, and is the biggest roadblock for gui-fs cvs
inclusion, IMHO.
- Per
Index: client/chatline_common.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/chatline_common.c,v
retrieving revision 1.5
diff -u -r1.5 chatline_common.c
--- client/chatline_common.c 28 Nov 2003 17:37:19 -0000 1.5
+++ client/chatline_common.c 20 Jun 2004 12:09:55 -0000
@@ -19,6 +19,7 @@
#include <string.h>
#include "astring.h"
+#include "log.h"
#include "packets.h"
#include "support.h"
@@ -27,6 +28,14 @@
#include "chatline_common.h"
#include "clinet.h"
+static struct {
+ int lines;
+ struct {
+ char *text;
+ int conn_id;
+ } *line;
+} remaining;
+
/**************************************************************************
Send the message as a chat to the server.
**************************************************************************/
@@ -36,7 +45,6 @@
}
static int frozen_level = 0;
-static struct astring remaining = ASTRING_INIT;
/**************************************************************************
Turn on buffering, using a counter so that calls may be nested.
@@ -46,9 +54,7 @@
frozen_level++;
if (frozen_level == 1) {
- assert(remaining.str == NULL);
- astr_minsize(&remaining, 1);
- remaining.str[0] = '\0';
+ assert(remaining.lines == 0);
}
}
@@ -63,11 +69,14 @@
assert(frozen_level >= 0);
if (frozen_level == 0) {
- if (remaining.n > 2) {
- /* +1 to skip the initial '\n' */
- append_output_window(remaining.str + 1);
+ int i;
+
+ for (i = 0; i < remaining.lines; i++) {
+ base_append_output_window(remaining.line[i].text,
+ remaining.line[i].conn_id);
+ free(remaining.line[i].text);
}
- astr_free(&remaining);
+ remaining.lines = 0;
}
}
@@ -87,20 +96,19 @@
**************************************************************************/
void append_output_window(const char *astring)
{
+ base_append_output_window(astring, -1);
+}
+
+void base_append_output_window(const char *astring, int conn_id)
+{
if (frozen_level == 0) {
- real_append_output_window(astring);
+ real_append_output_window(astring, conn_id);
} else {
- /*
- * len_src doesn't include the trailing '\0'
- * len_dst does include the trailing '\0'
- */
- size_t len_src = strlen(astring), len_dst = remaining.n;
-
- /* +1 for the "\n" */
- astr_minsize(&remaining, len_dst + 1 + len_src);
- remaining.str[len_dst - 1] = '\n';
-
- /* +1 for the "\0" */
- memcpy(&remaining.str[len_dst], astring, len_src + 1);
+ remaining.lines++;
+ remaining.line =
+ fc_realloc(remaining.line,
+ remaining.lines * sizeof(*remaining.line));
+ remaining.line[remaining.lines - 1].text = mystrdup(astring);
+ remaining.line[remaining.lines - 1].conn_id = conn_id;
}
}
Index: client/chatline_common.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/chatline_common.h,v
retrieving revision 1.2
diff -u -r1.2 chatline_common.h
--- client/chatline_common.h 18 Jul 2003 22:02:24 -0000 1.2
+++ client/chatline_common.h 20 Jun 2004 12:09:55 -0000
@@ -17,6 +17,7 @@
void send_chat(const char *message);
+void base_append_output_window(const char *astring, int conn_id);
void append_output_window(const char *astring);
void output_window_freeze(void);
Index: client/climisc.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/climisc.c,v
retrieving revision 1.133
diff -u -r1.133 climisc.c
--- client/climisc.c 1 May 2004 03:34:57 -0000 1.133
+++ client/climisc.c 20 Jun 2004 12:09:55 -0000
@@ -864,7 +864,7 @@
my_vsnprintf(message, sizeof(message), format, ap);
va_end(ap);
- handle_chat_msg(message, x, y, event);
+ handle_chat_msg(message, x, y, event, aconnection.id);
}
/**************************************************************************
Index: client/control.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/control.c,v
retrieving revision 1.136
diff -u -r1.136 control.c
--- client/control.c 28 May 2004 19:13:07 -0000 1.136
+++ client/control.c 20 Jun 2004 12:09:55 -0000
@@ -161,6 +161,7 @@
update_unit_info_label(punit);
update_menus();
+ if(punit) set_focus_tile(punit->x, punit->y);
}
/**************************************************************************
@@ -239,6 +240,14 @@
candidate = find_best_focus_candidate(FALSE);
}
+#if 0
+ /* We have to do this ourselves, and not rely on set_unit_focus(),
+ * because above we change punit_focus directly.
+ */
+ if(punit_old_focus && punit_old_focus!=punit_focus)
+ refresh_tile_mapcanvas(punit_old_focus->x, punit_old_focus->y, FALSE);
+#endif
+
/* Accept current focus unit as last resort. */
if (!candidate) {
candidate = find_best_focus_candidate(TRUE);
Index: client/mapview_common.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/mapview_common.c,v
retrieving revision 1.127
diff -u -r1.127 mapview_common.c
--- client/mapview_common.c 17 Jun 2004 19:45:03 -0000 1.127
+++ client/mapview_common.c 20 Jun 2004 12:09:56 -0000
@@ -31,12 +31,15 @@
#include "climap.h"
#include "control.h"
#include "goto.h"
-#include "mapview_common.h"
#include "tilespec.h"
+#include "mapview_common.h"
+
struct mapview_canvas mapview_canvas;
struct overview overview;
+static struct map_position focus_tile = { -1, -1 };
+
/* Arbitrary estimated maximums for width and height of a city description
* text. Eventually this may be determined dynamically. */
#define MAX_CITY_DESC_WIDTH 128
@@ -51,6 +54,29 @@
static void base_canvas_to_map_pos(int *map_x, int *map_y,
int canvas_x, int canvas_y);
static void center_tile_overviewcanvas(int map_x, int map_y);
+
+static void get_mapview_corners(int x[4], int y[4]);
+
+void set_focus_tile(int x, int y)
+{
+ struct map_position old = focus_tile;
+
+ assert(is_real_map_pos(x, y));
+ focus_tile.x = x;
+ focus_tile.y = y;
+
+ if (is_real_map_pos(old.x, old.x)) {
+ refresh_tile_mapcanvas(old.x, old.y, TRUE);
+ }
+ refresh_tile_mapcanvas(focus_tile.x, focus_tile.y, TRUE);
+}
+
+void get_focus_tile(int *x, int *y)
+{
+ *x=focus_tile.x;
+ *y=focus_tile.y;
+}
+
static void get_mapview_corners(int x[4], int y[4]);
static void redraw_overview(void);
static void dirty_overview(void);
@@ -742,6 +768,53 @@
}
}
+void put_terrain(int x, int y, struct canvas *pcanvas,
+ int canvas_x, int canvas_y)
+{
+ struct drawn_sprite drawn_sprites[40];
+ int count = fill_terrain_sprite_array(drawn_sprites, x, y);
+ int i;
+ int unit_width = UNIT_TILE_WIDTH;
+ int unit_height = UNIT_TILE_HEIGHT;
+ int unit_offset_x = 0;
+ int unit_offset_y = 0;
+
+ for (i = 0; i < count; i++) {
+ if (drawn_sprites[i].sprite) {
+ int ox = drawn_sprites[i].offset_x, oy = drawn_sprites[i].offset_y;
+
+ canvas_put_sprite(pcanvas, canvas_x + ox, canvas_y + oy,
+ drawn_sprites[i].sprite,
+ unit_offset_x - ox, unit_offset_y - oy,
+ unit_width - ox, unit_height - oy);
+ }
+ }
+}
+
+void put_city(struct city *pcity, struct canvas *pcanvas,
+ int canvas_x, int canvas_y)
+{
+ struct drawn_sprite drawn_sprites[40];
+ bool solid_bg;
+ int count = fill_city_sprite_array(drawn_sprites, pcity, &solid_bg);
+ int i;
+ int unit_width = UNIT_TILE_WIDTH;
+ int unit_height = UNIT_TILE_HEIGHT;
+ int unit_offset_x = 0;
+ int unit_offset_y = 0;
+
+ for (i = 0; i < count; i++) {
+ if (drawn_sprites[i].sprite) {
+ int ox = drawn_sprites[i].offset_x, oy = drawn_sprites[i].offset_y;
+
+ canvas_put_sprite(pcanvas, canvas_x + ox, canvas_y + oy,
+ drawn_sprites[i].sprite,
+ unit_offset_x - ox, unit_offset_y - oy,
+ unit_width - ox, unit_height - oy);
+ }
+ }
+}
+
/**************************************************************************
Draw the given unit onto the canvas store at the given location.
**************************************************************************/
@@ -1291,6 +1364,42 @@
}
}
+static void tile_draw_focus(struct canvas *pcanvas,
+ int map_x, int map_y,
+ int canvas_x, int canvas_y,
+ enum draw_type draw, bool citymode)
+{
+ const int inset = (is_isometric ? 0 : 1);
+ enum direction8 dir;
+
+ if (citymode) {
+ return;
+ }
+
+ for (dir = 0; dir < 8; dir++) {
+ int start_x, start_y, end_x, end_y, adjc_x, adjc_y;
+
+ /* In non-iso view we draw the rectangle with an inset of 1. This makes
+ * it easy to distinguish from the map grid.
+ *
+ * In iso-view the inset doesn't work perfectly (see comments about
+ * this elsewhere) so we draw without an inset. This may cover up the
+ * map grid if it is drawn. */
+ if (get_tile_boundaries(dir, inset, 1, draw,
+ &start_x, &start_y, &end_x, &end_y)) {
+
+ /** Focus tile **/
+ if ((map_x == focus_tile.x && map_y == focus_tile.y)
+ || (is_isometric && MAPSTEP(adjc_x, adjc_y, map_x, map_y, dir)
+ && (map_x == focus_tile.x && map_y == focus_tile.y))) {
+ canvas_put_line(pcanvas, COLOR_STD_RED, LINE_NORMAL,
+ canvas_x + start_x, canvas_y + start_y,
+ end_x - start_x, end_y - start_y);
+ }
+ }
+ }
+}
+
/****************************************************************************
Draw the grid lines of the given map tile at the given canvas position
@@ -1305,6 +1414,7 @@
tile_draw_coastline(pcanvas, map_x, map_y, canvas_x, canvas_y, draw);
tile_draw_selection(pcanvas, map_x, map_y, canvas_x, canvas_y,
draw, citymode);
+ tile_draw_focus(pcanvas, map_x, map_y, canvas_x, canvas_y, draw, citymode);
}
/**************************************************************************
@@ -1546,6 +1656,11 @@
{
const int dx = max_desc_width - NORMAL_TILE_WIDTH, dy = max_desc_height;
+ canvas_x = 0;
+ canvas_y = 0;
+ width = mapview_canvas.width;
+ height = mapview_canvas.height;
+
if (!draw_city_names && !draw_city_productions) {
return;
}
Index: client/mapview_common.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/mapview_common.h,v
retrieving revision 1.68
diff -u -r1.68 mapview_common.h
--- client/mapview_common.h 16 Jun 2004 22:56:16 -0000 1.68
+++ client/mapview_common.h 20 Jun 2004 12:09:56 -0000
@@ -20,8 +20,9 @@
#include "colors_g.h"
struct unit;
+struct city;
-struct canvas_store; /* opaque type, real type is gui-dep */
+struct canvas; /* opaque type, real type is gui-dep */
struct mapview_canvas {
int gui_x0, gui_y0;
@@ -252,6 +253,10 @@
int unit_width, int unit_height);
void put_unit_full(struct unit *punit, struct canvas *pcanvas,
int canvas_x, int canvas_y);
+void put_terrain(int x, int y, struct canvas *pcanvas,
+ int canvas_x, int canvas_y);
+void put_city(struct city *pcity, struct canvas *pcanvas,
+ int canvas_x, int canvas_y);
void put_city_tile_output(struct city *pcity, int city_x, int city_y,
struct canvas *pcanvas,
@@ -305,7 +310,8 @@
int map_x, int map_y);
void overview_to_map_pos(int *map_x, int *map_y,
int overview_x, int overview_y);
-
+void set_focus_tile(int x, int y);
+void get_focus_tile(int *x, int *y);
void refresh_overview_canvas(void);
void overview_update_tile(int x, int y);
void set_overview_dimensions(int width, int height);
Index: client/packhand.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/packhand.c,v
retrieving revision 1.381
diff -u -r1.381 packhand.c
--- client/packhand.c 16 Jun 2004 22:45:39 -0000 1.381
+++ client/packhand.c 20 Jun 2004 12:09:56 -0000
@@ -847,7 +847,7 @@
/**************************************************************************
...
**************************************************************************/
-void handle_chat_msg(char *message, int x, int y, enum event_type event)
+void handle_chat_msg(char *message, int x, int y, enum event_type event, int
conn_id)
{
int where = MW_OUTPUT; /* where to display the message */
@@ -859,7 +859,7 @@
}
if (BOOL_VAL(where & MW_OUTPUT)) {
- append_output_window(message);
+ base_append_output_window(message,conn_id);
}
if (BOOL_VAL(where & MW_MESSAGES)) {
add_notify_window(message, x, y, event);
@@ -1516,6 +1516,7 @@
char msg[MAX_LEN_MSG];
struct player *pplayer = &game.players[pinfo->playerno];
+ freelog(LOG_NORMAL,"player_info id=%d name=%s",pinfo->playerno,pinfo->name);
sz_strlcpy(pplayer->name, pinfo->name);
pplayer->nation=pinfo->nation;
@@ -1638,7 +1639,7 @@
{
struct connection *pconn = find_conn_by_id(pinfo->id);
- freelog(LOG_DEBUG, "conn_info id%d used%d est%d plr%d obs%d acc%d",
+ freelog(LOG_NORMAL, "conn_info id%d used%d est%d plr%d obs%d acc%d",
pinfo->id, pinfo->used, pinfo->established, pinfo->player_num,
pinfo->observer, (int)pinfo->access_level);
freelog(LOG_DEBUG, "conn_info \"%s\" \"%s\" \"%s\"",
Index: client/packhand_gen.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/packhand_gen.c,v
retrieving revision 1.5
diff -u -r1.5 packhand_gen.c
--- client/packhand_gen.c 6 Jun 2004 21:02:15 -0000 1.5
+++ client/packhand_gen.c 20 Jun 2004 12:09:56 -0000
@@ -102,7 +102,8 @@
((struct packet_chat_msg *)packet)->message,
((struct packet_chat_msg *)packet)->x,
((struct packet_chat_msg *)packet)->y,
- ((struct packet_chat_msg *)packet)->event);
+ ((struct packet_chat_msg *)packet)->event,
+ ((struct packet_chat_msg *)packet)->conn_id);
return TRUE;
case PACKET_CITY_REMOVE:
Index: client/packhand_gen.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/packhand_gen.h,v
retrieving revision 1.5
diff -u -r1.5 packhand_gen.h
--- client/packhand_gen.h 6 Jun 2004 21:02:15 -0000 1.5
+++ client/packhand_gen.h 20 Jun 2004 12:09:56 -0000
@@ -34,7 +34,7 @@
void handle_game_info(struct packet_game_info *packet);
void handle_map_info(int xsize, int ysize, int topology_id);
void handle_nuke_tile_info(int x, int y);
-void handle_chat_msg(char *message, int x, int y, enum event_type event);
+void handle_chat_msg(char *message, int x, int y, enum event_type event, int
conn_id);
void handle_city_remove(int city_id);
struct packet_city_info;
void handle_city_info(struct packet_city_info *packet);
Index: client/text.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/text.c,v
retrieving revision 1.2
diff -u -r1.2 text.c
--- client/text.c 14 May 2004 15:34:45 -0000 1.2
+++ client/text.c 20 Jun 2004 12:09:56 -0000
@@ -129,7 +129,7 @@
****************************************************************************/
const char *popup_info_text(int map_x, int map_y)
{
- const char *activity_text;
+ const char *activity_text = concat_tile_activity_text(map_x, map_y);
struct city *pcity = map_get_city(map_x, map_y);
struct tile *ptile = map_get_tile(map_x, map_y);
struct unit *punit = find_visible_unit(ptile);
@@ -232,7 +232,6 @@
add_line(_("Infrastructure: %s"),
map_get_infrastructure_text(ptile->special));
}
- activity_text = concat_tile_activity_text(map_x, map_y);
if (strlen(activity_text) > 0) {
add_line(_("Activity: %s"), activity_text);
}
@@ -700,3 +699,365 @@
textyear(game.year));
RETURN;
}
+
+const char *mapview_get_terrain_tooltip_text(int x, int y)
+{
+ int infrastructure = get_tile_infrastructure_set(map_get_tile(x, y));
+ INIT;
+
+ add_line(_("Location: (%d, %d) [%d]"),
+ x, y, map_get_tile(x, y)->continent);
+ add_line("%s", map_get_tile_info_text(x, y));
+ if (infrastructure) {
+ add_line("%s",
+ map_get_infrastructure_text(infrastructure));
+ }
+ RETURN;
+}
+
+static void calc_effect(enum unit_activity activity, int x, int y, int diff[3])
+{
+ struct tile backup;
+ int stats_before[3], stats_after[3];
+
+ stats_before[0] = get_food_tile(x,y);
+ stats_before[1] = get_shields_tile(x,y);
+ stats_before[2] = get_trade_tile(x,y);
+
+ /* BEWARE UGLY HACK AHEAD */
+
+ memcpy(&backup, map_get_tile(x, y), sizeof(backup));
+
+ switch (activity) {
+ case ACTIVITY_ROAD:
+ map_set_special(x, y, S_ROAD);
+ break;
+ case ACTIVITY_RAILROAD:
+ map_set_special(x, y, S_RAILROAD);
+ break;
+ case ACTIVITY_MINE:
+ map_mine_tile(x, y);
+ break;
+
+ case ACTIVITY_IRRIGATE:
+ map_irrigate_tile(x, y);
+ break;
+
+ case ACTIVITY_TRANSFORM:
+ map_transform_tile(x, y);
+ break;
+ default:
+ assert(0);
+ }
+
+ stats_after[0] = get_food_tile(x,y);
+ stats_after[1] = get_shields_tile(x,y);
+ stats_after[2] = get_trade_tile(x,y);
+
+ memcpy(map_get_tile(x, y), &backup, sizeof(backup));
+
+ /* hopefully everything is now back in place */
+
+ diff[0] = stats_after[0] - stats_before[0];
+ diff[1] = stats_after[1] - stats_before[1];
+ diff[2] = stats_after[2] - stats_before[2];
+}
+
+static const char *format_effect(enum unit_activity activity,
+ struct unit *punit)
+{
+ char parts[3][25];
+ int diff[3];
+ int n = 0;
+ INIT;
+
+ calc_effect(activity, punit->x, punit->y, diff);
+
+ if (diff[0] != 0) {
+ my_snprintf(parts[n], sizeof(parts[n]), _("%+d food"), diff[0]);
+ n++;
+ }
+
+ if (diff[1] != 0) {
+ my_snprintf(parts[n], sizeof(parts[n]), _("%+d shield"), diff[1]);
+ n++;
+ }
+
+ if (diff[2] != 0) {
+ my_snprintf(parts[n], sizeof(parts[n]), _("%+d trade"), diff[2]);
+ n++;
+ }
+ if (n == 0) {
+ add(_("none"));
+ } else if (n == 1) {
+ add("%s", parts[0]);
+ } else if (n == 2) {
+ add("%s %s", parts[0], parts[1]);
+ } else if (n == 3) {
+ add("%s %s %s", parts[0], parts[1], parts[2]);
+ } else {
+ assert(0);
+ }
+ RETURN;
+}
+
+const char *mapview_get_unit_action_tooltip(struct unit *punit,
+ const char *action,
+ const char *shortcut_)
+{
+ char shortcut[256];
+ INIT;
+
+ if (shortcut_) {
+ my_snprintf(shortcut, sizeof(shortcut), " (%s)", shortcut_);
+ } else {
+ my_snprintf(shortcut, sizeof(shortcut), "%s", "");
+ }
+
+ if (strcmp(action, "unit_fortifying") == 0) {
+ add_line(_("Fortify%s"),shortcut);
+ add_line(_("Time: 1 turn, then till changed"));
+ add_line(_("Effect: +50%% defense bonus"));
+ } else if (strcmp(action, "unit_disband") == 0) {
+ add_line(_("Disband%s"),shortcut);
+ add_line(_("Time: instantly, unit is destroyed"));
+ } else if (strcmp(action, "unit_return_nearest") == 0) {
+ add_line(_("Return to nearest city%s"),shortcut);
+ add_line(_("Time: unknown"));
+ } else if (strcmp(action, "unit_sentry") == 0) {
+ add_line(_("Sentry%s"),shortcut);
+ add_line(_("Time: instantly, till changed"));
+ add_line(_("Effect: Unit wakes up if enemy is near"));
+ } else if (strcmp(action, "unit_add_to_city") == 0) {
+ add_line(_("Add to city%s"),shortcut);
+ add_line(_("Time: instantly, unit is destroyed"));
+ add_line(_("Effect: city size +1"));
+ } else if (strcmp(action, "unit_build_city") == 0) {
+ add_line(_("Build city%s"),shortcut);
+ add_line(_("Time: instantly, unit is destroyed"));
+ add_line(_("Effect: create a city of size 1"));
+ } else if (strcmp(action, "unit_road") == 0) {
+ add_line(_("Build road%s"),shortcut);
+ add_line(_("Time: %d turns"),
+ map_get_turns_for_activity(ACTIVITY_ROAD, punit));
+ add_line(_("Effect: %s"),
+ format_effect(ACTIVITY_ROAD, punit));
+ } else if (strcmp(action, "unit_irrigate") == 0) {
+ add_line(_("Build irrigation%s"),shortcut);
+ add_line(_("Time: %d turns"),
+ map_get_turns_for_activity(ACTIVITY_IRRIGATE, punit));
+ add_line(_("Effect: %s"),
+ format_effect(ACTIVITY_IRRIGATE, punit));
+ } else if (strcmp(action, "unit_mine") == 0) {
+ add_line(_("Build mine%s"),shortcut);
+ add_line(_("Time: %d turns"),
+ map_get_turns_for_activity(ACTIVITY_MINE, punit));
+ add_line(_("Effect: %s"),
+ format_effect(ACTIVITY_MINE, punit));
+ } else if (strcmp(action, "unit_auto_settler") == 0) {
+ add_line(_("Auto-Settle%s"),shortcut);
+ add_line(_("Time: unknown"));
+ add_line(_("Effect: the computer performs settler activities"));
+ } else {
+#if 0
+ ttype = map_get_tile(punit->x, punit->y)->terrain;
+ tinfo = get_tile_type(ttype);
+ if ((tinfo->irrigation_result != T_LAST)
+ && (tinfo->irrigation_result != ttype)) {
+ my_snprintf(irrtext, sizeof(irrtext), irrfmt,
+ (get_tile_type(tinfo->irrigation_result))->terrain_name);
+ } else if (map_has_special(punit->x, punit->y, S_IRRIGATION)
+ && player_knows_techs_with_flag(game.player_ptr, TF_FARMLAND)) {
+ sz_strlcpy(irrtext, _("Bu_ild Farmland"));
+ }
+ if ((tinfo->mining_result != T_LAST) && (tinfo->mining_result != ttype)) {
+ my_snprintf(mintext, sizeof(mintext), minfmt,
+ (get_tile_type(tinfo->mining_result))->terrain_name);
+ }
+ if ((tinfo->transform_result != T_LAST)
+ && (tinfo->transform_result != ttype)) {
+ my_snprintf(transtext, sizeof(transtext), transfmt,
+ (get_tile_type(tinfo->transform_result))->terrain_name);
+ }
+
+ menus_rename("<main>/_Orders/Build _Irrigation", irrtext);
+ menus_rename("<main>/_Orders/Build _Mine", mintext);
+ menus_rename("<main>/_Orders/Transf_orm Terrain", transtext);
+#endif
+ add_line("tooltip for action %s isn't written yet",
+ action);
+ freelog(LOG_NORMAL, "warning: get_unit_action_tooltip: unknown action %s",
+ action);
+ }
+ RETURN;
+}
+
+const char *mapview_get_city_action_tooltip(struct city *pcity,
+ const char *action,
+ const char *shortcut_)
+{
+ INIT;
+
+ if (strcmp(action, "city_buy") == 0) {
+ const char *name;
+
+ if (pcity->is_building_unit) {
+ name = get_unit_type(pcity->currently_building)->name;
+ } else {
+ name = get_impr_name_ex(pcity, pcity->currently_building);
+ }
+
+ add_line(_("Buy production"));
+ add_line(_("Cost: %d (%d in treasury)"),
+ city_buy_cost(pcity), game.player_ptr->economic.gold);
+ add_line(_("Producting: %s (%d turns)"), name,
+ city_turns_to_build(pcity, pcity->currently_building,
+ pcity->is_building_unit, TRUE));
+ } else {
+ add_line("tooltip for action %s isn't written yet", action);
+ freelog(LOG_NORMAL,
+ "warning: get_city_action_tooltip: unknown action %s", action);
+ }
+ RETURN;
+}
+
+/************************************************************************
+Text to popup on middle-click
+************************************************************************/
+const char *mapview_get_terrain_info_text(int map_x, int map_y)
+{
+ const char *activity_text = concat_tile_activity_text(map_x, map_y);
+ struct tile *ptile = map_get_tile(map_x, map_y);
+ const char *diplo_nation_plural_adjectives[DS_LAST] =
+ {Q_("?nation:Neutral"), Q_("?nation:Hostile"),
+ "" /* unused, DS_CEASEFIRE*/,
+ Q_("?nation:Peaceful"), Q_("?nation:Friendly"),
+ Q_("?nation:Mysterious")};
+ INIT;
+
+ add_line(_("Terrain: %s"),
+ map_get_tile_info_text(map_x, map_y));
+ add_line(_("Food/Prod/Trade: %s"),
+ map_get_tile_fpt_text(map_x, map_y));
+ if (tile_has_special(ptile, S_HUT)) {
+ add_line(_("Minor Tribe Village"));
+ }
+ if (game.borders > 0) {
+ struct player *owner = map_get_owner(map_x, map_y);
+ struct player_diplstate *ds = game.player_ptr->diplstates;
+
+ if (owner == game.player_ptr){
+ add_line(_("Our Territory"));
+ } else if (owner) {
+ if (ds[owner->player_no].type == DS_CEASEFIRE) {
+ int turns = ds[owner->player_no].turns_left;
+
+ add_line(PL_("%s territory (%d turn ceasefire)",
+ "%s territory (%d turn ceasefire)",
+ turns),
+ get_nation_name(owner->nation), turns);
+ } else {
+ add_line(_("Territory of the %s %s"),
+ diplo_nation_plural_adjectives[ds[owner->player_no].type],
+ get_nation_name_plural(owner->nation));
+ }
+ } else {
+ add_line(_("Unclaimed territory"));
+ }
+ }
+ if (get_tile_infrastructure_set(ptile)) {
+ add_line(_("Infrastructure: %s"),
+ map_get_infrastructure_text(ptile->special));
+ }
+ if (strlen(activity_text)) {
+ add_line(_("Activity: %s"), activity_text);
+ }
+ RETURN;
+}
+
+const char *mapview_get_city_tooltip_text(struct city *pcity)
+{
+ struct player *owner = city_owner(pcity);
+ INIT;
+
+ add_line("%s", pcity->name);
+ add_line("%s", owner->name);
+ RETURN;
+}
+
+const char *mapview_get_city_info_text(struct city *pcity)
+{
+ struct player *owner = city_owner(pcity);
+ INIT;
+
+ add_line(_("City: %s (%s)"), pcity->name,
+ get_nation_name(owner->nation));
+ if (city_got_citywalls(pcity)) {
+ add(_(" with City Walls"));
+ }
+ RETURN;
+}
+
+const char *mapview_get_unit_tooltip_text(struct unit *punit)
+{
+ struct unit_type *ptype = unit_type(punit);
+ struct city *pcity =
+ player_find_city_by_id(game.player_ptr, punit->homecity);
+ INIT;
+
+ add("%s", ptype->name);
+ if (ptype->veteran[punit->veteran].name[0] != '\0') {
+ add(" (%s)", ptype->veteran[punit->veteran].name);
+ }
+ add("\n");
+ add_line("%s", unit_activity_text(punit));
+ if (pcity) {
+ add_line("%s", pcity->name);
+ }
+ RETURN;
+}
+
+const char *mapview_get_unit_info_text(struct unit *punit)
+{
+ int map_x = punit->x;
+ int map_y = punit->y;
+ const char *activity_text = concat_tile_activity_text(map_x, map_y);
+ INIT;
+
+ if (strlen(activity_text)) {
+ add_line(_("Activity: %s"), activity_text);
+ }
+ if (punit) {
+ char tmp[64] = { 0 };
+ struct unit_type *ptype = unit_type(punit);
+
+ if (punit->owner == game.player_idx) {
+ struct city *pcity =
+ player_find_city_by_id(game.player_ptr, punit->homecity);
+
+ if (pcity){
+ my_snprintf(tmp, sizeof(tmp), "/%s", pcity->name);
+ }
+ }
+ add_line(_("Unit: %s(%s%s)"), ptype->name,
+ get_nation_name(unit_owner(punit)->nation), tmp);
+ if (punit->owner != game.player_idx) {
+ struct unit *apunit = get_unit_in_focus();
+
+ if (apunit) {
+ /* chance to win when active unit is attacking the selected unit */
+ int att_chance = unit_win_chance(apunit, punit) * 100;
+
+ /* chance to win when selected unit is attacking the active unit */
+ int def_chance = (1.0 - unit_win_chance(punit, apunit)) * 100;
+
+ add_line(_("Chance to win: A:%d%% D:%d%%"), att_chance, def_chance);
+ }
+ }
+ add_line(_("A:%d D:%d FP:%d HP:%d/%d%s"),
+ ptype->attack_strength,
+ ptype->defense_strength, ptype->firepower, punit->hp,
+ ptype->hp, punit->veteran ? _(" V") : "");
+ }
+ RETURN;
+}
Index: client/text.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/text.h,v
retrieving revision 1.2
diff -u -r1.2 text.h
--- client/text.h 25 Apr 2004 18:30:00 -0000 1.2
+++ client/text.h 20 Jun 2004 12:09:56 -0000
@@ -40,4 +40,17 @@
const char *get_ping_time_text(struct player *pplayer);
const char *get_report_title(const char *report_name);
+const char *mapview_get_terrain_tooltip_text(int x, int y);
+const char *mapview_get_unit_action_tooltip(struct unit *punit,
+ const char *action,
+ const char *shortcut_);
+const char *mapview_get_city_action_tooltip(struct city *pcity,
+ const char *action,
+ const char *shortcut_);
+const char *mapview_get_terrain_info_text(int map_x, int map_y);
+const char *mapview_get_city_tooltip_text(struct city *pcity);
+const char *mapview_get_city_info_text(struct city *pcity);
+const char *mapview_get_unit_tooltip_text(struct unit *punit);
+const char *mapview_get_unit_info_text(struct unit *punit);
+
#endif /* FC__TEXT_H */
Index: client/tilespec.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/tilespec.c,v
retrieving revision 1.175
diff -u -r1.175 tilespec.c
--- client/tilespec.c 16 Jun 2004 22:45:39 -0000 1.175
+++ client/tilespec.c 20 Jun 2004 12:09:56 -0000
@@ -1533,6 +1533,62 @@
#define ADD_SPRITE_SIMPLE(s) ADD_SPRITE(s, DRAW_NORMAL, TRUE, 0, 0)
#define ADD_SPRITE_FULL(s) ADD_SPRITE(s, DRAW_FULL, TRUE, 0, 0)
+/**********************************************************************
+ Fill in the sprite array for the city
+***********************************************************************/
+int fill_city_sprite_array(struct drawn_sprite *sprs,
+ struct city *pcity, bool *solid_bg)
+{
+ struct drawn_sprite *save_sprs = sprs;
+
+ *solid_bg = FALSE;
+
+ if (!solid_color_behind_units) {
+ ADD_SPRITE(get_city_nation_flag_sprite(pcity), DRAW_FULL, TRUE,
+ flag_offset_x, flag_offset_y);
+ } else {
+ *solid_bg = TRUE;
+ }
+
+ if (pcity->client.occupied) {
+ ADD_SPRITE_SIMPLE(get_city_occupied_sprite(pcity));
+ }
+
+ ADD_SPRITE_SIMPLE(get_city_sprite(pcity));
+
+ if (city_got_citywalls(pcity)) {
+ ADD_SPRITE_SIMPLE(get_city_wall_sprite(pcity));
+ }
+
+ if (map_has_special(pcity->x, pcity->y, S_POLLUTION)) {
+ ADD_SPRITE_SIMPLE(sprites.tx.pollution);
+ }
+ if (map_has_special(pcity->x, pcity->y, S_FALLOUT)) {
+ ADD_SPRITE_SIMPLE(sprites.tx.fallout);
+ }
+
+ if (pcity->client.unhappy) {
+ ADD_SPRITE_SIMPLE(sprites.city.disorder);
+ }
+
+ if (tile_get_known(pcity->x, pcity->y) == TILE_KNOWN_FOGGED
+ && draw_fog_of_war) {
+ ADD_SPRITE_SIMPLE(sprites.tx.fog);
+ }
+
+ /* Put the size sprites last, so that they are not obscured
+ * (and because they can be hard to read if fogged).
+ */
+ if (pcity->size >= 10) {
+ assert(pcity->size < 100);
+ ADD_SPRITE_SIMPLE(sprites.city.size_tens[pcity->size / 10]);
+ }
+
+ ADD_SPRITE_SIMPLE(sprites.city.size[pcity->size % 10]);
+
+ return sprs - save_sprs;
+}
+
/**************************************************************************
Assemble some data that is used in building the tile sprite arrays.
(map_x, map_y) : the (normalized) map position
@@ -2016,7 +2072,7 @@
Add sprites for the base terrain to the sprite list. This doesn't
include specials or rivers.
****************************************************************************/
-static int fill_terrain_sprite_array(struct drawn_sprite *sprs,
+static int fill_terrain_sprite_array0(struct drawn_sprite *sprs,
int map_x, int map_y,
enum tile_terrain_type *ttype_near)
{
@@ -2217,15 +2273,12 @@
build_tile_data(map_x, map_y,
&ttype, &tspecial, ttype_near, tspecial_near);
- /* Terrain and specials. */
- if (!unit_only && !city_only) {
- sprs += fill_terrain_sprite_array(sprs, map_x, map_y, ttype_near);
+ sprs += fill_terrain_sprite_array0(sprs, map_x, map_y, ttype_near);
- if (is_ocean(ttype) && draw_terrain) {
- for (dir = 0; dir < 4; dir++) {
- if (contains_special(tspecial_near[DIR4_TO_DIR8[dir]], S_RIVER)) {
- ADD_SPRITE_SIMPLE(sprites.tx.river_outlet[dir]);
- }
+ if (is_ocean(ttype) && draw_terrain) {
+ for (dir = 0; dir < 4; dir++) {
+ if (contains_special(tspecial_near[DIR4_TO_DIR8[dir]], S_RIVER)) {
+ ADD_SPRITE_SIMPLE(sprites.tx.river_outlet[dir]);
}
}
@@ -2329,13 +2382,103 @@
FALSE, 0, 0);
}
- if (punit && !city_only
- && (draw_units || (punit == pfocus && draw_focus_unit))) {
+ if (punit && (draw_units || (punit == pfocus && draw_focus_unit))) {
bool stacked = (unit_list_size(&map_get_tile(map_x, map_y)->units) > 1);
- bool backdrop = !pcity && !unit_only;
- bool dummy;
+ bool backdrop = !pcity;
+
+ sprs += fill_unit_sprite_array(sprs, punit, solid_bg, stacked, backdrop);
+ }
+
+ if (draw_fortress_airbase && contains_special(tspecial, S_FORTRESS)) {
+ ADD_SPRITE_FULL(sprites.tx.fortress);
+ }
+
+ return sprs - save_sprs;
+}
+
+int fill_terrain_sprite_array(struct drawn_sprite *sprs, int x, int y)
+{
+ enum tile_terrain_type ttype, ttype_near[8];
+ enum tile_special_type tspecial, tspecial_near[8];
+ struct drawn_sprite *save_sprs = sprs;
+
+ if (tile_get_known(x, y) == TILE_UNKNOWN)
+ return -1;
+
+ build_tile_data(x, y, &ttype, &tspecial, ttype_near, tspecial_near);
+
+ sprs += fill_terrain_sprite_array0(sprs, x, y, ttype_near);
+ return sprs - save_sprs;
+}
+
+/**********************************************************************
+ Fill in the sprite array for the tile at position (abs_x0,abs_y0)
+
+The sprites are drawn in the following order:
+ 1) basic terrain type
+ 2) river
+ 3) irritation
+ 4) road/railroad
+ 5) specials
+ 6) mine
+ 7) hut
+ 8) fortress
+ 9) airbase
+10) pollution
+11) fallout
+12) FoW
+***********************************************************************/
+#if 0
+int fill_tile_sprite_array(struct drawn_sprite *sprs, int abs_x0, int abs_y0,
+ bool citymode, bool *solid_bg,
+ enum color_std *bg_color)
+{
+ enum tile_terrain_type ttype, ttype_near[8];
+ enum tile_special_type tspecial, tspecial_near[8];
+ int dir, tileno;
+ struct tile *ptile;
+ struct city *pcity;
+ struct unit *pfocus;
+ struct unit *punit;
+ struct drawn_sprite *save_sprs = sprs;
+
+ *solid_bg = FALSE;
+ *bg_color = COLOR_STD_BACKGROUND;
+
+ ptile=map_get_tile(abs_x0, abs_y0);
+
+ if (tile_get_known(abs_x0, abs_y0) == TILE_UNKNOWN) {
+ return 0;
+ }
+
+ pcity=map_get_city(abs_x0, abs_y0);
+ pfocus=get_unit_in_focus();
- sprs += fill_unit_sprite_array(sprs, punit, &dummy, stacked, backdrop);
+ if (solid_color_behind_units) {
+ punit = get_drawable_unit(abs_x0, abs_y0, citymode);
+ if (punit && (draw_units || (draw_focus_unit && pfocus == punit))) {
+ bool stacked = (unit_list_size(&ptile->units) > 1);
+
+ sprs += fill_unit_sprite_array(sprs, punit, solid_bg,
+ stacked, TRUE);
+
+ *bg_color = player_color(unit_owner(punit));
+ return sprs - save_sprs;
+ }
+
+ if (pcity && draw_cities) {
+ sprs += fill_city_sprite_array(sprs, pcity, solid_bg);
+ *bg_color = player_color(city_owner(pcity));
+ return sprs - save_sprs;
+ }
+ }
+ build_tile_data(abs_x0, abs_y0,
+ &ttype, &tspecial, ttype_near, tspecial_near);
+
+ sprs += fill_terrain_sprite_array0(sprs, abs_x0, abs_y0, ttype_near);
+
+ if (!draw_terrain) {
+ *solid_bg = TRUE;
}
if (!unit_only && !city_only) {
@@ -2355,6 +2498,7 @@
return sprs - save_sprs;
}
+#endif
/**********************************************************************
Set city tiles sprite values; should only happen after
Index: client/tilespec.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/tilespec.h,v
retrieving revision 1.70
diff -u -r1.70 tilespec.h
--- client/tilespec.h 6 Jun 2004 06:09:46 -0000 1.70
+++ client/tilespec.h 20 Jun 2004 12:09:56 -0000
@@ -71,6 +71,12 @@
int map_x, int map_y, bool citymode);
int fill_unit_sprite_array(struct drawn_sprite *sprs, struct unit *punit,
bool *solid_bg, bool stack, bool backdrop);
+int fill_city_sprite_array_iso(struct drawn_sprite *sprs,
+ struct city *pcity);
+int fill_terrain_sprite_array(struct drawn_sprite *sprs, int abs_x0,
+ int abs_y0);
+int fill_city_sprite_array(struct drawn_sprite *sprs,
+ struct city *pcity, bool *solid_bg);
enum color_std player_color(struct player *pplayer);
enum color_std overview_tile_color(int x, int y);
Index: client/gui-gtk/chatline.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk/chatline.c,v
retrieving revision 1.21
diff -u -r1.21 chatline.c
--- client/gui-gtk/chatline.c 1 Apr 2004 01:28:56 -0000 1.21
+++ client/gui-gtk/chatline.c 20 Jun 2004 12:09:56 -0000
@@ -65,7 +65,7 @@
/**************************************************************************
...
**************************************************************************/
-void real_append_output_window(const char *astring)
+void real_append_output_window(const char *astring, int conn_id)
{
bool scroll;
GtkAdjustment *slider =
Index: client/gui-gtk-2.0/chatline.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-gtk-2.0/chatline.c,v
retrieving revision 1.9
diff -u -r1.9 chatline.c
--- client/gui-gtk-2.0/chatline.c 1 Apr 2004 01:20:20 -0000 1.9
+++ client/gui-gtk-2.0/chatline.c 20 Jun 2004 12:09:56 -0000
@@ -67,7 +67,7 @@
/**************************************************************************
...
**************************************************************************/
-void real_append_output_window(const char *astring)
+void real_append_output_window(const char *astring, int conn_id)
{
GtkWidget *sw;
GtkAdjustment *slider;
Index: client/gui-mui/chatline.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-mui/chatline.c,v
retrieving revision 1.7
diff -u -r1.7 chatline.c
--- client/gui-mui/chatline.c 14 Nov 2002 09:14:56 -0000 1.7
+++ client/gui-mui/chatline.c 20 Jun 2004 12:09:56 -0000
@@ -34,7 +34,7 @@
#include "gui_main.h"
#include "muistuff.h"
-void real_append_output_window(const char *astring)
+void real_append_output_window(const char *astring, int conn_id)
{
DoMethod(main_output_listview, MUIM_NList_Insert, astring, -2,
MUIV_List_Insert_Bottom);
set(main_output_listview,MUIA_NList_First, MUIV_NList_First_Bottom);
Index: client/gui-sdl/chatline.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-sdl/chatline.c,v
retrieving revision 1.14
diff -u -r1.14 chatline.c
--- client/gui-sdl/chatline.c 4 Dec 2003 13:53:12 -0000 1.14
+++ client/gui-sdl/chatline.c 20 Jun 2004 12:09:56 -0000
@@ -132,7 +132,7 @@
Appends the string to the chat output window.
Curretn it is wraper to message subsystem.
**************************************************************************/
-void real_append_output_window(const char *astring)
+void real_append_output_window(const char *astring, int conn_id)
{
if (pConnDlg) {
Uint16 *pUniStr;
Index: client/gui-stub/chatline.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-stub/chatline.c,v
retrieving revision 1.4
diff -u -r1.4 chatline.c
--- client/gui-stub/chatline.c 30 Nov 2002 19:27:36 -0000 1.4
+++ client/gui-stub/chatline.c 20 Jun 2004 12:09:57 -0000
@@ -23,7 +23,7 @@
Appends the string to the chat output window. The string should be
inserted on its own line, although it will have no newline.
**************************************************************************/
-void real_append_output_window(const char *astring)
+void real_append_output_window(const char *astring, int conn_id)
{
/* PORTME */
}
Index: client/gui-win32/chatline.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-win32/chatline.c,v
retrieving revision 1.10
diff -u -r1.10 chatline.c
--- client/gui-win32/chatline.c 18 Jul 2003 22:02:25 -0000 1.10
+++ client/gui-win32/chatline.c 20 Jun 2004 12:09:57 -0000
@@ -85,10 +85,9 @@
}
/**************************************************************************
-
+ PS We need to add \r to lineends.
**************************************************************************/
-void real_append_output_window(const char *astring)
- /* We need to add \r to lineends */
+void real_append_output_window(const char *astring, int conn_id)
{
const char *str;
Index: client/gui-xaw/chatline.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/gui-xaw/chatline.c,v
retrieving revision 1.22
diff -u -r1.22 chatline.c
--- client/gui-xaw/chatline.c 24 Oct 2003 00:03:01 -0000 1.22
+++ client/gui-xaw/chatline.c 20 Jun 2004 12:09:57 -0000
@@ -72,7 +72,7 @@
Now uses window's font size and width. Assumes fixed-width font. --jjm
**************************************************************************/
-void real_append_output_window(const char *input_string)
+void real_append_output_window(const char *astring, int conn_id)
{
static int m_width=0;
Index: client/include/chatline_g.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/include/chatline_g.h,v
retrieving revision 1.2
diff -u -r1.2 chatline_g.h
--- client/include/chatline_g.h 27 Jun 2002 00:59:21 -0000 1.2
+++ client/include/chatline_g.h 20 Jun 2004 12:09:57 -0000
@@ -15,7 +15,7 @@
#include "chatline_common.h"
-void real_append_output_window(const char *astring);
+void real_append_output_window(const char *astring, int conn_id);
void log_output_window(void);
void clear_output_window(void);
Index: client/include/diplodlg_g.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/include/diplodlg_g.h,v
retrieving revision 1.4
diff -u -r1.4 diplodlg_g.h
--- client/include/diplodlg_g.h 2 Feb 2004 07:23:45 -0000 1.4
+++ client/include/diplodlg_g.h 20 Jun 2004 12:09:57 -0000
@@ -13,9 +13,10 @@
#ifndef FC__DIPLODLG_G_H
#define FC__DIPLODLG_G_H
-#include "diptreaty.h"
#include "shared.h"
+#include "diptreaty.h"
+
void handle_diplomacy_init_meeting(int counterpart, int initiated_from);
void handle_diplomacy_cancel_meeting(int counterpart, int initiated_from);
void handle_diplomacy_create_clause(int counterpart, int giver,
Index: client/include/mapview_g.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/client/include/mapview_g.h,v
retrieving revision 1.53
diff -u -r1.53 mapview_g.h
--- client/include/mapview_g.h 10 Jun 2004 01:04:53 -0000 1.53
+++ client/include/mapview_g.h 20 Jun 2004 12:09:57 -0000
@@ -78,4 +78,7 @@
void draw_selection_rectangle(int canvas_x, int canvas_y, int w, int h);
void tileset_changed(void);
+void popup_mapcanvas(void);
+void popdown_mapcanvas(void);
+
#endif /* FC__MAPVIEW_G_H */
Index: common/capstr.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/capstr.c,v
retrieving revision 1.169
diff -u -r1.169 capstr.c
--- common/capstr.c 12 Jun 2004 17:42:27 -0000 1.169
+++ common/capstr.c 20 Jun 2004 12:09:57 -0000
@@ -78,7 +78,7 @@
"+starter +union +iso_maps +big_map_size +orders2client " \
"+change_production +tilespec1 +no_earth +trans " \
"+want_hack invasions bombard +killstack2 spec +spec2 " \
- "+city_map"
+ "+city_map +chat_conn"
/* "+1.14.delta" is the new delta protocol for 1.14.0-dev.
*
@@ -124,6 +124,9 @@
* "spec2" is semi-configurable specialists in an array
*
* "city_map" means the city_map is sent as an array instead of a bitfield.
+ *
+ * "chat_conn" means that chat message also contain the connection id
+ * of the source.
*/
void init_our_capability(void)
Index: common/connection.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/connection.c,v
retrieving revision 1.39
diff -u -r1.39 connection.c
--- common/connection.c 22 May 2004 11:31:37 -0000 1.39
+++ common/connection.c 20 Jun 2004 12:09:57 -0000
@@ -53,6 +53,8 @@
neccesary as removing a random connection while we are iterating through
a connection list might corrupt the list. */
int delayed_disconnect = 0;
+
+struct connection *current_connection;
/**************************************************************************
Command access levels for client-side use; at present, they are only
Index: common/connection.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/connection.h,v
retrieving revision 1.34
diff -u -r1.34 connection.h
--- common/connection.h 10 Apr 2004 03:47:49 -0000 1.34
+++ common/connection.h 20 Jun 2004 12:09:57 -0000
@@ -223,6 +223,7 @@
} statistics;
};
+extern struct connection *current_connection;
const char *cmdlevel_name(enum cmdlevel_id lvl);
enum cmdlevel_id cmdlevel_named(const char *token);
Index: common/map.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/map.c,v
retrieving revision 1.170
diff -u -r1.170 map.c
--- common/map.c 12 Jun 2004 17:42:27 -0000 1.170
+++ common/map.c 20 Jun 2004 12:09:57 -0000
@@ -788,6 +788,19 @@
/***************************************************************
...
***************************************************************/
+int map_get_turns_for_activity(enum unit_activity activity,
+ struct unit *punit)
+{
+ int mr = get_unit_type(punit->type)->move_rate;
+ int au = (mr > 0) ? mr / SINGLE_MOVE : 1;
+ int time = map_activity_time(activity, punit->x, punit->y) / 10;
+
+ return (time - 1) / au + 1;
+}
+
+/***************************************************************
+...
+***************************************************************/
static void clear_infrastructure(int x, int y)
{
map_clear_special(x, y, S_INFRASTRUCTURE_MASK);
Index: common/map.h
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/map.h,v
retrieving revision 1.188
diff -u -r1.188 map.h
--- common/map.h 12 Jun 2004 17:42:27 -0000 1.188
+++ common/map.h 20 Jun 2004 12:09:57 -0000
@@ -370,6 +370,8 @@
int map_clean_pollution_time(int x, int y);
int map_clean_fallout_time(int x, int y);
int map_activity_time(enum unit_activity activity, int x, int y);
+int map_get_turns_for_activity(enum unit_activity activity,
+ struct unit *punit);
bool can_channel_land(int x, int y);
bool can_reclaim_ocean(int x, int y);
Index: common/packets.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/packets.c,v
retrieving revision 1.267
diff -u -r1.267 packets.c
--- common/packets.c 14 Jan 2004 11:58:12 -0000 1.267
+++ common/packets.c 20 Jun 2004 12:09:57 -0000
@@ -604,6 +604,12 @@
void pre_send_packet_chat_msg(struct connection *pc,
struct packet_chat_msg *packet)
{
+ if (current_connection) {
+ packet->conn_id = current_connection->id;
+ } else {
+ packet->conn_id = 255;
+ }
+
if (packet->x == -1 && packet->y == -1) {
/* since we can currently only send unsigned ints... */
assert(!is_normal_map_pos(255, 255));
@@ -620,6 +626,9 @@
packet->x = -1;
packet->y = -1;
}
+ if (packet->conn_id == 255) {
+ packet->conn_id = -1;
+ }
}
void pre_send_packet_player_attribute_chunk(struct connection *pc,
Index: common/packets.def
===================================================================
RCS file: /home/freeciv/CVS/freeciv/common/packets.def,v
retrieving revision 1.29
diff -u -r1.29 packets.def
--- common/packets.def 12 Jun 2004 17:42:27 -0000 1.29
+++ common/packets.def 20 Jun 2004 12:09:57 -0000
@@ -365,6 +365,7 @@
STRING message[MAX_LEN_MSG];
COORD x, y;
EVENT event;
+ CONNECTION conn_id;
end
PACKET_CHAT_MSG_REQ=19;cs,handle-per-conn,dsend
Index: server/sernet.c
===================================================================
RCS file: /home/freeciv/CVS/freeciv/server/sernet.c,v
retrieving revision 1.119
diff -u -r1.119 sernet.c
--- server/sernet.c 17 May 2004 02:16:15 -0000 1.119
+++ server/sernet.c 20 Jun 2004 12:10:00 -0000
@@ -605,6 +605,7 @@
err = gettimeofday(&start, &tz);
assert(!err);
#endif
+ current_connection = pconn;
connection_do_buffer(pconn);
start_processing_request(pconn,
pconn->server.
@@ -614,6 +615,7 @@
finish_processing_request(pconn);
connection_do_unbuffer(pconn);
+ current_connection = NULL;
if (!command_ok) {
close_connection(pconn);
}
- [Freeciv-Dev] (PR#9479) some fs stuff (fwd),
Per I. Mathisen <=
|
|