Author: cazfi Date: Mon Apr 27 19:40:51 2015 New Revision: 28927 URL: http://svn.gna.org/viewcvs/freeciv?rev=28927&view=rev Log: Store city worker task to a list (of one element, at the moment).
See patch #6032 Modified: branches/S2_6/ai/threaded/taicity.c branches/S2_6/client/gui-gtk-3.0/citydlg.c branches/S2_6/client/packhand.c branches/S2_6/client/tilespec.c branches/S2_6/common/city.c branches/S2_6/common/city.h branches/S2_6/common/workertask.h branches/S2_6/server/advisors/autosettlers.c branches/S2_6/server/citytools.c branches/S2_6/server/savegame2.c branches/S2_6/server/unithand.c Modified: branches/S2_6/ai/threaded/taicity.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/ai/threaded/taicity.c?rev=28927&r1=28926&r2=28927&view=diff ============================================================================== --- branches/S2_6/ai/threaded/taicity.c (original) +++ branches/S2_6/ai/threaded/taicity.c Mon Apr 27 19:40:51 2015 @@ -376,13 +376,20 @@ if (pcity != NULL && city_owner(pcity) == req->plr) { /* City has not been lost meanwhile */ + struct worker_task *ptask = worker_task_list_get(pcity->task_reqs, 0); + + if (ptask == NULL) { + ptask = fc_malloc(sizeof(struct worker_task)); + worker_task_init(ptask); + worker_task_list_append(pcity->task_reqs, ptask); + } log_debug("%s storing req for act %d at (%d,%d)", pcity->name, data->task.act, TILE_XY(data->task.ptile)); - pcity->task_req.ptile = data->task.ptile; - pcity->task_req.act = data->task.act; - pcity->task_req.tgt = data->task.tgt; - pcity->task_req.want = data->task.want; + ptask->ptile = data->task.ptile; + ptask->act = data->task.act; + ptask->tgt = data->task.tgt; + ptask->want = data->task.want; /* Send info to observers */ package_and_send_worker_task(pcity); Modified: branches/S2_6/client/gui-gtk-3.0/citydlg.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/gui-gtk-3.0/citydlg.c?rev=28927&r1=28926&r2=28927&view=diff ============================================================================== --- branches/S2_6/client/gui-gtk-3.0/citydlg.c (original) +++ branches/S2_6/client/gui-gtk-3.0/citydlg.c Mon Apr 27 19:40:51 2015 @@ -2805,6 +2805,7 @@ struct terrain *pterr = tile_terrain(ptile); struct universal for_terr = { .kind = VUT_TERRAIN, .value = { .terrain = pterr }}; + struct worker_task *ptask; is_showing_workertask_dialog = TRUE; workertask_req.owner = pcity; @@ -2813,7 +2814,9 @@ shl = choice_dialog_start(GTK_WINDOW(toplevel), _("What Action to Request"), _("Select autosettler activity:")); - if (pcity->task_req.ptile != NULL) { + + ptask = worker_task_list_get(pcity->task_reqs, 0); + if (ptask != NULL) { choice_dialog_add(shl, _("Clear request"), G_CALLBACK(set_city_workertask), GINT_TO_POINTER(ACTIVITY_IDLE), NULL); Modified: branches/S2_6/client/packhand.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/packhand.c?rev=28927&r1=28926&r2=28927&view=diff ============================================================================== --- branches/S2_6/client/packhand.c (original) +++ branches/S2_6/client/packhand.c Mon Apr 27 19:40:51 2015 @@ -1101,26 +1101,34 @@ void handle_worker_task(const struct packet_worker_task *packet) { struct city *pcity = game_city_by_number(packet->city_id); + struct worker_task *ptask; if (pcity == NULL || (pcity->owner != client.conn.playing && !client_is_global_observer())) { return; } - /* It's ok for the tile to be NULL. That means clearing - * existing worker task. */ - if (packet->tile_id >= 0) { - pcity->task_req.ptile = index_to_tile(packet->tile_id); - } else { - pcity->task_req.ptile = NULL; - } - pcity->task_req.act = packet->activity; - if (packet->tgt >= 0) { - pcity->task_req.tgt = extra_by_number(packet->tgt); - } else { - pcity->task_req.tgt = NULL; - } - pcity->task_req.want = packet->want; + ptask = worker_task_list_get(pcity->task_reqs, 0); + + if (ptask == NULL && packet->tile_id >= 0) { + ptask = fc_malloc(sizeof(struct worker_task)); + worker_task_list_append(pcity->task_reqs, ptask); + } else if (ptask != NULL && packet->tile_id < 0) { + worker_task_list_remove(pcity->task_reqs, ptask); + free(ptask); + ptask = NULL; + } + + if (ptask != NULL) { + ptask->ptile = index_to_tile(packet->tile_id); + ptask->act = packet->activity; + if (packet->tgt >= 0) { + ptask->tgt = extra_by_number(packet->tgt); + } else { + ptask->tgt = NULL; + } + ptask->want = packet->want; + } refresh_city_dialog(pcity); } Modified: branches/S2_6/client/tilespec.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/client/tilespec.c?rev=28927&r1=28926&r2=28927&view=diff ============================================================================== --- branches/S2_6/client/tilespec.c (original) +++ branches/S2_6/client/tilespec.c Mon Apr 27 19:40:51 2015 @@ -5381,24 +5381,26 @@ case LAYER_WORKERTASK: if (citymode != NULL && ptile != NULL) { - if (citymode->task_req.ptile == ptile) { - switch (citymode->task_req.act) { + struct worker_task *ptask = worker_task_list_get(citymode->task_reqs, 0); + + if (ptask != NULL && ptask->ptile == ptile) { + switch (ptask->act) { case ACTIVITY_MINE: - if (citymode->task_req.tgt == NULL) { + if (ptask->tgt == NULL) { ADD_SPRITE_SIMPLE(t->sprites.unit.mine); } else { - ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(citymode->task_req.tgt)].activity); + ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(ptask->tgt)].activity); } break; case ACTIVITY_IRRIGATE: - if (citymode->task_req.tgt == NULL) { + if (ptask->tgt == NULL) { ADD_SPRITE_SIMPLE(t->sprites.unit.irrigate); } else { - ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(citymode->task_req.tgt)].activity); + ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(ptask->tgt)].activity); } break; case ACTIVITY_GEN_ROAD: - ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(citymode->task_req.tgt)].activity); + ADD_SPRITE_SIMPLE(t->sprites.extras[extra_index(ptask->tgt)].activity); break; case ACTIVITY_TRANSFORM: ADD_SPRITE_SIMPLE(t->sprites.unit.transform); Modified: branches/S2_6/common/city.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/city.c?rev=28927&r1=28926&r2=28927&view=diff ============================================================================== --- branches/S2_6/common/city.c (original) +++ branches/S2_6/common/city.c Mon Apr 27 19:40:51 2015 @@ -3072,8 +3072,7 @@ worklist_init(&pcity->worklist); pcity->units_supported = unit_list_new(); - - worker_task_init(&pcity->task_req); + pcity->task_reqs = worker_task_list_new(); if (is_server()) { pcity->server.mgr_score_calc_turn = -1; /* -1 = never */ @@ -3101,6 +3100,8 @@ citizens_free(pcity); + worker_task_list_destroy(pcity->task_reqs); + unit_list_destroy(pcity->units_supported); if (pcity->tile_cache != NULL) { free(pcity->tile_cache); Modified: branches/S2_6/common/city.h URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/city.h?rev=28927&r1=28926&r2=28927&view=diff ============================================================================== --- branches/S2_6/common/city.h (original) +++ branches/S2_6/common/city.h Mon Apr 27 19:40:51 2015 @@ -385,7 +385,7 @@ int history; /* Cumulative culture */ - struct worker_task task_req; + struct worker_task_list *task_reqs; union { struct { Modified: branches/S2_6/common/workertask.h URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/common/workertask.h?rev=28927&r1=28926&r2=28927&view=diff ============================================================================== --- branches/S2_6/common/workertask.h (original) +++ branches/S2_6/common/workertask.h Mon Apr 27 19:40:51 2015 @@ -25,6 +25,15 @@ int want; }; +/* get 'struct worker_task_list' and related functions: */ +#define SPECLIST_TAG worker_task +#define SPECLIST_TYPE struct worker_task +#include "speclist.h" + +#define worker_task_list_iterate(tasklist, ptask) \ + TYPED_LIST_ITERATE(struct worker_task, tasklist, ptask) +#define worker_task_list_iterate_end LIST_ITERATE_END + void worker_task_init(struct worker_task *ptask); #ifdef __cplusplus Modified: branches/S2_6/server/advisors/autosettlers.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/advisors/autosettlers.c?rev=28927&r1=28926&r2=28927&view=diff ============================================================================== --- branches/S2_6/server/advisors/autosettlers.c (original) +++ branches/S2_6/server/advisors/autosettlers.c Mon Apr 27 19:40:51 2015 @@ -762,9 +762,9 @@ /* Have nearby cities requests? */ city_list_iterate(pplayer->cities, pcity) { - struct worker_task *ptask = &pcity->task_req; - - if (ptask->ptile != NULL) { + struct worker_task *ptask = worker_task_list_get(pcity->task_reqs, 0); + + if (ptask != NULL) { bool consider = TRUE; /* Do not go to tiles that already have workers there. */ Modified: branches/S2_6/server/citytools.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/citytools.c?rev=28927&r1=28926&r2=28927&view=diff ============================================================================== --- branches/S2_6/server/citytools.c (original) +++ branches/S2_6/server/citytools.c Mon Apr 27 19:40:51 2015 @@ -3040,8 +3040,12 @@ void clear_worker_task(struct city *pcity) { struct packet_worker_task packet; - - worker_task_init(&pcity->task_req); + struct worker_task *ptask = worker_task_list_get(pcity->task_reqs, 0); + + if (ptask != NULL) { + worker_task_list_remove(pcity->task_reqs, ptask); + free(ptask); + } packet.city_id = pcity->id; packet.tile_id = -1; @@ -3059,20 +3063,24 @@ void package_and_send_worker_task(struct city *pcity) { struct packet_worker_task packet; + struct worker_task *ptask = worker_task_list_get(pcity->task_reqs, 0); packet.city_id = pcity->id; - if (pcity->task_req.ptile == NULL) { + if (ptask != NULL) { + packet.tile_id = tile_index(ptask->ptile); + packet.activity = ptask->act; + if (ptask->tgt == NULL) { + packet.tgt = -1; + } else { + packet.tgt = extra_number(ptask->tgt); + } + packet.want = ptask->want; + } else { packet.tile_id = -1; - } else { - packet.tile_id = tile_index(pcity->task_req.ptile); - } - packet.activity = pcity->task_req.act; - if (pcity->task_req.tgt == NULL) { - packet.tgt = -1; - } else { - packet.tgt = extra_number(pcity->task_req.tgt); - } - packet.want = pcity->task_req.want; + packet.activity = ACTIVITY_IDLE; + packet.tgt = 0; + packet.want = 0; + } lsend_packet_worker_task(city_owner(pcity)->connections, &packet); lsend_packet_worker_task(game.glob_observers, &packet); Modified: branches/S2_6/server/savegame2.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/savegame2.c?rev=28927&r1=28926&r2=28927&view=diff ============================================================================== --- branches/S2_6/server/savegame2.c (original) +++ branches/S2_6/server/savegame2.c Mon Apr 27 19:40:51 2015 @@ -4366,6 +4366,7 @@ int nat_x, nat_y; citizens size; const char *stylename; + bool tasks_handled; sg_warn_ret_val(secfile_lookup_int(loading->file, &nat_x, "%s.x", citystr), FALSE, "%s", secfile_error()); @@ -4606,31 +4607,39 @@ } } - nat_x = secfile_lookup_int_default(loading->file, -1, "%s.task1.x", citystr); - nat_y = secfile_lookup_int_default(loading->file, -1, "%s.task1.y", citystr); - - if (nat_x >= 0 && nat_y >= 0) { - const char *str; - - pcity->task_req.ptile = native_pos_to_tile(nat_x, nat_y); - - str = secfile_lookup_str(loading->file, "%s.task1.activity", citystr); - pcity->task_req.act = unit_activity_by_name(str, fc_strcasecmp); - - sg_failure_ret_val(unit_activity_is_valid(pcity->task_req.act), FALSE, - "Unknown workertask activity %s", str); - - str = secfile_lookup_str(loading->file, "%s.task1.target", citystr); - - if (strcmp("-", str)) { - pcity->task_req.tgt = extra_type_by_rule_name(str); - - sg_failure_ret_val(pcity->task_req.tgt != NULL, FALSE, - "Unknown workertask target %s", str); - } - - pcity->task_req.want = secfile_lookup_int_default(loading->file, 1, - "%s.task1.want", citystr); + tasks_handled = FALSE; + for (i = 0; !tasks_handled; i++) { + nat_x = secfile_lookup_int_default(loading->file, -1, "%s.task%d.x", citystr, i); + nat_y = secfile_lookup_int_default(loading->file, -1, "%s.task%d.y", citystr, i); + + if (nat_x >= 0 && nat_y >= 0) { + const char *str; + struct worker_task *ptask = fc_malloc(sizeof(struct worker_task)); + + ptask->ptile = native_pos_to_tile(nat_x, nat_y); + + str = secfile_lookup_str(loading->file, "%s.task%d.activity", citystr, i); + ptask->act = unit_activity_by_name(str, fc_strcasecmp); + + sg_failure_ret_val(unit_activity_is_valid(ptask->act), FALSE, + "Unknown workertask activity %s", str); + + str = secfile_lookup_str(loading->file, "%s.task%d.target", citystr, i); + + if (strcmp("-", str)) { + ptask->tgt = extra_type_by_rule_name(str); + + sg_failure_ret_val(ptask->tgt != NULL, FALSE, + "Unknown workertask target %s", str); + } + + ptask->want = secfile_lookup_int_default(loading->file, 1, + "%s.task%d.want", citystr, i); + + worker_task_list_append(pcity->task_reqs, ptask); + } else { + tasks_handled = TRUE; + } } CALL_FUNC_EACH_AI(city_load, loading->file, pcity, citystr); @@ -4859,28 +4868,22 @@ } players_iterate_end; } - if (pcity->task_req.ptile != NULL) { - index_to_native_pos(&nat_x, &nat_y, tile_index(pcity->task_req.ptile)); - secfile_insert_int(saving->file, nat_y, "%s.task1.y", buf); - secfile_insert_int(saving->file, nat_x, "%s.task1.x", buf); - secfile_insert_str(saving->file, unit_activity_name(pcity->task_req.act), "%s.task1.activity", - buf); - if (pcity->task_req.tgt != NULL) { - secfile_insert_str(saving->file, extra_rule_name(pcity->task_req.tgt), "%s.task1.target", - buf); + i = 0; + worker_task_list_iterate(pcity->task_reqs, ptask) { + index_to_native_pos(&nat_x, &nat_y, tile_index(ptask->ptile)); + secfile_insert_int(saving->file, nat_y, "%s.task%d.y", buf, i); + secfile_insert_int(saving->file, nat_x, "%s.task%d.x", buf, i); + secfile_insert_str(saving->file, unit_activity_name(ptask->act), "%s.task%d.activity", + buf, i); + if (ptask->tgt != NULL) { + secfile_insert_str(saving->file, extra_rule_name(ptask->tgt), "%s.task%d.target", + buf, i); } else { - secfile_insert_str(saving->file, "-", "%s.task1.target", - buf); - } - secfile_insert_int(saving->file, pcity->task_req.want, "%s.task1.want", buf); - } else { - /* Dummy data to keep tabular format happy */ - secfile_insert_int(saving->file, -1, "%s.task1.y", buf); - secfile_insert_int(saving->file, -1, "%s.task1.x", buf); - secfile_insert_str(saving->file, "-", "%s.task1.activity", buf); - secfile_insert_str(saving->file, "-", "%s.task1.target", buf); - secfile_insert_int(saving->file, 0, "%s.task1.want", buf); - } + secfile_insert_str(saving->file, "-", "%s.task%d.target", + buf, i); + } + secfile_insert_int(saving->file, ptask->want, "%s.task%d.want", buf, i); + } worker_task_list_iterate_end; i++; } city_list_iterate_end; Modified: branches/S2_6/server/unithand.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_6/server/unithand.c?rev=28927&r1=28926&r2=28927&view=diff ============================================================================== --- branches/S2_6/server/unithand.c (original) +++ branches/S2_6/server/unithand.c Mon Apr 27 19:40:51 2015 @@ -3037,25 +3037,34 @@ const struct packet_worker_task *packet) { struct city *pcity = game_city_by_number(packet->city_id); + struct worker_task *ptask; if (pcity == NULL || pcity->owner != pplayer) { return; } - /* It's ok for the tile to be NULL. That means clearing - * existing worker task. */ - if (packet->tile_id >= 0) { - pcity->task_req.ptile = index_to_tile(packet->tile_id); - } else { - pcity->task_req.ptile = NULL; - } - pcity->task_req.act = packet->activity; - if (packet->tgt >= 0) { - pcity->task_req.tgt = extra_by_number(packet->tgt); - } else { - pcity->task_req.tgt = NULL; - } - pcity->task_req.want = packet->want; + ptask = worker_task_list_get(pcity->task_reqs, 0); + + if (ptask == NULL && packet->tile_id >= 0) { + ptask = fc_malloc(sizeof(struct worker_task)); + worker_task_init(ptask); + worker_task_list_append(pcity->task_reqs, ptask); + } else if (ptask != NULL && packet->tile_id < 0) { + worker_task_list_remove(pcity->task_reqs, ptask); + free(ptask); + ptask = NULL; + } + + if (ptask != NULL) { + ptask->ptile = index_to_tile(packet->tile_id); + ptask->act = packet->activity; + if (packet->tgt >= 0) { + ptask->tgt = extra_by_number(packet->tgt); + } else { + ptask->tgt = NULL; + } + ptask->want = packet->want; + } lsend_packet_worker_task(pplayer->connections, packet); } _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits