[Freeciv-Dev] Re: (PR#15843) Editor: Fix fortress, paint city
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
Subject: |
[Freeciv-Dev] Re: (PR#15843) Editor: Fix fortress, paint city |
From: |
"Per I. Mathisen" <per@xxxxxxxxxxx> |
Date: |
Sat, 11 Mar 2006 04:36:05 -0800 |
Reply-to: |
bugs@xxxxxxxxxxx |
<URL: http://bugs.freeciv.org/Ticket/Display.html?id=15843 >
On Fri, 10 Mar 2006, Per I. Mathisen wrote:
> moves the city painting into the paint tab. You can now select which
> player to paint as for cities and fortresses in the paint tab. The city
> tab is removed.
New patch fixes the widget layout problems. Any objections to committing
this now?
- Per
Index: server/edithand.c
===================================================================
--- server/edithand.c (revision 11755)
+++ server/edithand.c (working copy)
@@ -59,17 +59,17 @@
/****************************************************************************
Handles new tile information from the client, to make local edits to
- the map.
+ the map. Toggle specials, and remember to add/remove ownership for
+ fortresses when they are used as border sources.
TODO: Handle resources.
****************************************************************************/
-void handle_edit_tile(struct connection *pc, int x, int y,
- Terrain_type_id terrain, Resource_type_id resource,
- bv_special special)
+void handle_edit_tile(struct connection *pc, struct packet_edit_tile *packet)
{
- struct tile *ptile = map_pos_to_tile(x, y);
- struct terrain *pterrain = get_terrain(terrain), *old_terrain;
- struct resource *presource = get_resource(resource);
+ struct tile *ptile = map_pos_to_tile(packet->x, packet->y);
+ struct terrain *pterrain = get_terrain(packet->terrain), *old_terrain;
+ struct resource *presource = get_resource(packet->resource);
+ struct player *owner = get_player(packet->owner);
if (pc->access_level != ALLOW_HACK || !game.info.is_edit_mode
|| !ptile || !pterrain) {
@@ -79,10 +79,18 @@
old_terrain = ptile->terrain;
specials_iterate(s) {
- if (contains_special(special, s) && !tile_has_special(ptile, s)) {
+ if (contains_special(packet->special, s) && !tile_has_special(ptile, s)) {
tile_add_special(ptile, s);
- } else if (!contains_special(special, s) && tile_has_special(ptile, s)) {
+ if (game.info.borders > 0 && owner && s == S_FORTRESS) {
+ map_claim_ownership(ptile, owner, ptile);
+ }
+ } else if (!contains_special(packet->special, s)
+ && tile_has_special(ptile, s)) {
tile_remove_special(ptile, s);
+ if (s == S_FORTRESS && ptile->owner) {
+ ptile->owner = NULL;
+ ptile->owner_source = NULL;
+ }
}
} specials_iterate_end;
Index: common/packets.def
===================================================================
--- common/packets.def (revision 11755)
+++ common/packets.def (working copy)
@@ -1362,6 +1362,7 @@
TERRAIN terrain;
RESOURCE resource;
BV_SPECIAL special;
+ PLAYER owner; # for fortress
end
PACKET_EDIT_UNIT=126;cs,handle-per-conn,lsend
Index: client/gui-gtk-2.0/editdlg.c
===================================================================
--- client/gui-gtk-2.0/editdlg.c (revision 11755)
+++ client/gui-gtk-2.0/editdlg.c (working copy)
@@ -39,7 +39,7 @@
#include "gui_stuff.h"
#define TABLE_WIDTH 3
-#define TOOL_WIDTH 5
+#define TOOL_WIDTH 4
enum unit_param {
UPARAM_OWNER,
@@ -62,9 +62,11 @@
} paint_item;
static paint_item *terrains;
-
+static paint_item paint_city[] = {
+ { N_("City"), 0 }
+};
static paint_item specials[] = {
- { N_("clear all"), S_LAST },
+ { N_("Clear all"), S_LAST },
{ NULL, S_ROAD },
{ NULL, S_IRRIGATION },
{ NULL, S_RAILROAD },
@@ -79,11 +81,13 @@
};
static char *tool_names[ETOOL_LAST] = {
- N_("Paint"), N_("Unit"), N_("City"), N_("Player"), N_("Delete")
+ N_("Paint"), N_("Unit"), N_("Player"), N_("Delete")
};
#define SPECIALS_NUM ARRAY_SIZE(specials)
+#define CITY_NUM ARRAY_SIZE(paint_city)
+static GtkWidget *paint_spin = NULL;
static GtkWidget *toolwin;
static GtkWidget *notebook;
@@ -177,11 +181,25 @@
switch(paint){
case EPAINT_TERRAIN:
editor_set_selected_terrain(get_terrain(terrains[id].paint));
+ if (paint_spin) {
+ gtk_widget_set_sensitive(paint_spin, FALSE);
+ }
break;
case EPAINT_SPECIAL:
editor_set_selected_special(specials[id].paint);
+ if (paint_spin) {
+ gtk_widget_set_sensitive(paint_spin, specials[id].paint == S_FORTRESS);
+ }
break;
+ case EPAINT_CITY:
+ if (paint_spin) {
+ gtk_widget_set_sensitive(paint_spin, TRUE);
+ }
+ break;
case EPAINT_LAST:
+ if (paint_spin) {
+ gtk_widget_set_sensitive(paint_spin, FALSE);
+ }
break;
}
}
@@ -222,23 +240,14 @@
}
/****************************************************************************
- FIXME: this is for demonstration purposes only (and not demonstration of
- coding goodness to be sure!)
+ Select which player is owning painted cities and fortresses.
****************************************************************************/
static void city_callback(GtkSpinButton *spinbutton, gpointer data)
{
- struct city *pcity = editor_get_selected_city();
- enum city_param param = GPOINTER_TO_INT(data);
+ struct player *pplayer;
- switch (param) {
- case CPARAM_OWNER:
- pcity->owner = get_player(gtk_spin_button_get_value_as_int(spinbutton));
- return;
- case CPARAM_LAST:
- break;
- }
-
- assert(0);
+ pplayer = get_player(gtk_spin_button_get_value_as_int(spinbutton));
+ editor_set_selected_paint_player(pplayer);
}
#if 0
@@ -256,18 +265,19 @@
****************************************************************************/
static GtkWidget *create_map_palette(void)
{
- GtkWidget *button, *vbox;
+ GtkWidget *button, *vbox, *label, *hbox;
+ GtkAdjustment *adj;
GtkWidget *table = gtk_table_new(12, TABLE_WIDTH, TRUE);
int i, j, sig;
int magic[3] = { 0, 5, 11 }; /* magic numbers to make the table look good */
- int types_num[] = { game.control.terrain_count, SPECIALS_NUM };
- paint_item *ptype[EPAINT_LAST] = { NULL, specials };
+ int types_num[] = { game.control.terrain_count, SPECIALS_NUM, CITY_NUM };
+ paint_item *ptype[EPAINT_LAST] = { NULL, specials, paint_city };
terrains = fc_realloc(terrains,
game.control.terrain_count * sizeof(*terrains));
ptype[0] = terrains;
- vbox = gtk_vbox_new(TRUE, 5);
+ vbox = gtk_vbox_new(FALSE, 5);
for(i = 0; i < EPAINT_LAST; i++) {
for(j = 0; j < types_num[i]; j++) {
@@ -283,6 +293,8 @@
item->name = get_special_name(item->paint);
}
break;
+ case EPAINT_CITY:
+ break;
}
button = gtk_toggle_button_new_with_label(item->name);
@@ -308,10 +320,24 @@
g_object_set_data(G_OBJECT(button), "sigid", GINT_TO_POINTER(sig));
}
}
-
+
+ adj = GTK_ADJUSTMENT(gtk_adjustment_new(game.player_ptr->player_no, 0,
+ game.info.nplayers - 1,
+ 1.0, 5.0, 5.0));
+ editor_set_selected_paint_player(game.player_ptr);
editor_set_selected_terrain(get_terrain(terrains[0].paint));
+
+ hbox = gtk_hbox_new(FALSE, 2);
+ paint_spin = gtk_spin_button_new(adj, 1, 0);
+ label = gtk_label_new(_("Owner: "));
+ g_signal_connect(paint_spin, "value-changed", G_CALLBACK(city_callback),
NULL);
+
gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 5);
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), paint_spin, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
gtk_widget_show_all(vbox);
+ gtk_widget_set_sensitive(paint_spin, FALSE);
return vbox;
}
@@ -367,40 +393,6 @@
return vbox;
}
-/****************************************************************************
- Create the tab for the city editor tool.
-****************************************************************************/
-static GtkWidget *create_city_palette(void)
-{
- GtkWidget *hbox, *vbox, *label, *sb;
- GtkAdjustment *adj;
- int i;
- struct city *pcity = editor_get_selected_city();
-
- const char *names[CPARAM_LAST] = { _("Owner"), };
- int inits[CPARAM_LAST][3] = {
- {pcity->owner->player_no, 0, game.info.nplayers - 1},
- };
-
- vbox = gtk_vbox_new(FALSE, 5);
-
- for (i = 0; i < CPARAM_LAST; i++) {
- adj = GTK_ADJUSTMENT(gtk_adjustment_new(inits[i][0], inits[i][1],
- inits[i][2], 1.0, 5.0, 5.0));
- hbox = gtk_hbox_new(FALSE, 5);
- sb = gtk_spin_button_new(adj, 1, 0);
- label = gtk_label_new(names[i]);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), sb, TRUE, TRUE, 0);
-
- g_signal_connect(sb, "value-changed", G_CALLBACK(city_callback),
- GINT_TO_POINTER(i));
- }
-
- return vbox;
-}
-
#if 0
/****************************************************************************
Create the tab for the player editor tool.
@@ -457,8 +449,6 @@
create_map_palette(), NULL);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
create_units_palette(), NULL);
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
- create_city_palette(), NULL);
#if 0
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
create_player_palette(), NULL);
Index: client/editor.c
===================================================================
--- client/editor.c (revision 11755)
+++ client/editor.c (working copy)
@@ -38,6 +38,7 @@
static enum editor_paint_type selected_paint_type = EPAINT_LAST;
static struct unit *selected_unit;
static struct city *selected_city;
+static struct player *paint_player = NULL;
/****************************************************************************
Initialize the editor tools data.
@@ -66,7 +67,7 @@
}
/****************************************************************************
- Returns the currently selected editor tool type.
+ Sets the currently selected editor tool type.
****************************************************************************/
void editor_set_selected_tool_type(enum editor_tool_type type)
{
@@ -74,7 +75,7 @@
}
/****************************************************************************
- Returns the currently selected editor paint type.
+ Sets the currently selected editor paint type.
****************************************************************************/
void editor_set_selected_paint_type(enum editor_paint_type type)
{
@@ -98,6 +99,14 @@
}
/****************************************************************************
+ Sets the selected player in the paint dialog.
+****************************************************************************/
+void editor_set_selected_paint_player(struct player *pplayer)
+{
+ paint_player = pplayer;
+}
+
+/****************************************************************************
Returns the selected unit.
****************************************************************************/
struct unit *editor_get_selected_unit(void)
@@ -197,16 +206,20 @@
tile_add_special(&tile, selected_special);
}
break;
+ case EPAINT_CITY:
+ do_city(ptile);
+ return;
case EPAINT_LAST:
return;
- }
+ }
/* send the result to the server for changing */
/* FIXME: No way to change resources. */
dsend_packet_edit_tile(&aconnection, ptile->x, ptile->y,
tile.terrain->index,
tile.resource ? tile.resource->index : -1,
- tile.special);
+ tile.special,
+ paint_player ? paint_player->player_no : 0);
}
/****************************************************************************
@@ -228,9 +241,6 @@
case ETOOL_UNIT:
do_unit(ptile);
break;
- case ETOOL_CITY:
- do_city(ptile);
- break;
case ETOOL_PLAYER:
case ETOOL_DELETE:
case ETOOL_LAST:
Index: client/editor.h
===================================================================
--- client/editor.h (revision 11755)
+++ client/editor.h (working copy)
@@ -19,7 +19,6 @@
enum editor_tool_type {
ETOOL_PAINT,
ETOOL_UNIT,
- ETOOL_CITY,
ETOOL_PLAYER,
ETOOL_DELETE,
ETOOL_LAST
@@ -28,6 +27,7 @@
enum editor_paint_type {
EPAINT_TERRAIN,
EPAINT_SPECIAL,
+ EPAINT_CITY,
EPAINT_LAST
};
@@ -40,6 +40,7 @@
void editor_set_selected_paint_type(enum editor_paint_type type);
void editor_set_selected_terrain(struct terrain *pterrain);
void editor_set_selected_special(enum tile_special_type special);
+void editor_set_selected_paint_player(struct player *pplayer);
struct unit *editor_get_selected_unit(void);
struct city *editor_get_selected_city(void);
|
|