/************************************************************************** ... **************************************************************************/ void handle_remove_unit(struct packet_generic_integer *packet) { struct unit *punit; struct city *pcity; if((punit=game_find_unit_by_id(packet->value))) { int x, y, hc; x=punit->x; y=punit->y; hc=punit->homecity; if(punit==get_unit_in_focus()) { set_unit_focus_no_center(0); game_remove_unit(packet->value); advance_unit_focus(); } else game_remove_unit(packet->value); if((pcity=map_get_city(x, y))) refresh_city_dialog(pcity); if((pcity=city_list_find_id(&game.player_ptr->cities, hc))) refresh_city_dialog(pcity); refresh_tile_mapcanvas(x, y, 1); } }
/**************************************************************** Disables CMA control over the city. *****************************************************************/ static void release_city(Widget w, XtPointer list, XtPointer call_data) { cma_release_city(current_city); refresh_city_dialog(current_city); XtSetSensitive(control_button, TRUE); XtSetSensitive(release_button, FALSE); XtSetSensitive(change_button, TRUE); }
/**************************************************************** Enable CMA control over the city. *****************************************************************/ static void control_city(Widget w, XtPointer list, XtPointer call_data) { struct cm_parameter param; cmafec_get_fe_parameter(current_city, ¶m); cma_put_city_under_agent(current_city, ¶m); refresh_city_dialog(current_city); XtSetSensitive(control_button, FALSE); XtSetSensitive(release_button, TRUE); XtSetSensitive(change_button, FALSE); }
/************************************************************************** ... **************************************************************************/ void handle_unit_info(struct packet_unit_info *packet) { struct city *pcity; struct unit *punit; int repaint_unit; int repaint_city; repaint_unit=0; repaint_city=0; punit=unit_list_find(&game.players[packet->owner].units, packet->id); if(punit) { if(punit->activity!=packet->activity) { /* change activity */ punit->activity=packet->activity; repaint_unit=1; /* refresh_tile_mapcanvas(punit->x, punit->y, 1); update_unit_pix_label(punit); refresh_unit_city_dialogs(punit); update_unit_focus(); */ } if(punit->homecity!=packet->homecity) { /* change homecity */ struct city *pcity; if((pcity=game_find_city_by_id(punit->homecity))) { unit_list_unlink(&pcity->units_supported, punit); refresh_city_dialog(pcity); } punit->homecity=packet->homecity; if((pcity=game_find_city_by_id(punit->homecity))) { unit_list_insert(&pcity->units_supported, punit); refresh_city_dialog(pcity); } } if(punit->hp!=packet->hp) { /* hp changed */ punit->hp=packet->hp; repaint_unit=1; } if(punit->attacks_left!=packet->attacksleft) { /* #attacks changed */ punit->attacks_left=packet->attacksleft; repaint_unit=1; } if(punit->x!=packet->x || punit->y!=packet->y) { /* change position */ struct city *pcity; pcity=map_get_city(punit->x, punit->y); if(tile_is_known(packet->x, packet->y)) { do_move_unit(punit, packet); update_unit_focus(); } else { unit_list_unlink(&game.players[packet->owner].units, punit); unit_list_unlink(&map_get_tile(punit->x, punit->y)->units, punit); refresh_tile_mapcanvas(punit->x, punit->y, 1); free(punit); } if(pcity) refresh_city_dialog(pcity); if((pcity=map_get_city(punit->x, punit->y))) refresh_city_dialog(pcity); repaint_unit=0; } if (punit->unhappiness!=packet->unhappiness) { punit->unhappiness=packet->unhappiness; repaint_city=1; } if (punit->upkeep!=packet->upkeep) { punit->upkeep=packet->upkeep; repaint_city=1; } if (repaint_city) { if((pcity=game_find_city_by_id(punit->homecity))) { refresh_city_dialog(pcity); } } punit->moves_left=packet->movesleft; punit->bribe_cost=packet->bribe_cost; } else { /* create new unit */ punit=(struct unit *)malloc(sizeof(struct unit)); punit->id=packet->id; punit->owner=packet->owner; punit->x=packet->x; punit->y=packet->y; punit->veteran=packet->veteran; punit->homecity=packet->homecity; punit->type=packet->type; punit->attacks_left=packet->attacksleft; punit->moves_left=packet->movesleft; punit->hp=packet->hp; punit->unhappiness=0; punit->activity=packet->activity; punit->upkeep=0; punit->hp=packet->hp; punit->bribe_cost=packet->bribe_cost; unit_list_insert(&game.players[packet->owner].units, punit); unit_list_insert(&map_get_tile(punit->x, punit->y)->units, punit); if((pcity=game_find_city_by_id(punit->homecity))) unit_list_insert(&pcity->units_supported, punit); /* this is ugly - prevent unit from being drawn if it's moved into * screen by a transporter - only works for ground_units.. yak */ if(!is_ground_unit(punit) || map_get_terrain(punit->x, punit->y)!=T_OCEAN) repaint_unit=1; else repaint_unit=0; } if(punit && punit==get_unit_in_focus()) update_unit_info_label(punit); if(repaint_unit) refresh_tile_mapcanvas(punit->x, punit->y, 1); update_unit_focus(); }
/************************************************************************** ... **************************************************************************/ void handle_city_info(struct packet_city_info *packet) { int i, x, y, city_is_new; struct city *pcity; pcity=city_list_find_id(&game.players[packet->owner].cities, packet->id); if(!pcity) { city_is_new=1; pcity=(struct city *)malloc(sizeof(struct city)); } else city_is_new=0; pcity->id=packet->id; pcity->owner=packet->owner; pcity->x=packet->x; pcity->y=packet->y; strcpy(pcity->name, packet->name); pcity->size=packet->size; pcity->ppl_happy[4]=packet->ppl_happy; pcity->ppl_content[4]=packet->ppl_content; pcity->ppl_unhappy[4]=packet->ppl_unhappy; pcity->ppl_elvis=packet->ppl_elvis; pcity->ppl_scientist=packet->ppl_scientist; pcity->ppl_taxman=packet->ppl_taxman; for (i=0;i<4;i++) pcity->trade[i]=packet->trade[i]; pcity->food_prod=packet->food_prod; pcity->food_surplus=packet->food_surplus; pcity->shield_prod=packet->shield_prod; pcity->shield_surplus=packet->shield_surplus; pcity->trade_prod=packet->trade_prod; pcity->corruption=packet->corruption; pcity->luxury_total=packet->luxury_total; pcity->tax_total=packet->tax_total; pcity->science_total=packet->science_total; pcity->food_stock=packet->food_stock; pcity->shield_stock=packet->shield_stock; pcity->polution=packet->polution; pcity->incite_revolt_cost=packet->incite_revolt_cost; pcity->is_building_unit=packet->is_building_unit; pcity->currently_building=packet->currently_building; pcity->did_buy=packet->did_buy; pcity->did_sell=packet->did_sell; i=0; for(y=0; y<CITY_MAP_SIZE; y++) for(x=0; x<CITY_MAP_SIZE; x++) pcity->city_map[x][y]=packet->city_map[i++]-'0'; for(i=0; i<B_LAST; i++) pcity->improvements[i]=(packet->improvements[i]=='1') ? 1 : 0; if(city_is_new) { unit_list_init(&pcity->units_supported); city_list_insert(&game.players[packet->owner].cities, pcity); map_set_city(pcity->x, pcity->y, pcity); if(pcity->owner==game.player_idx) city_report_dialog_update(); for(i=0; i<game.nplayers; i++) { struct genlist_iterator myiter; genlist_iterator_init(&myiter, &game.players[i].units.list, 0); for(;ITERATOR_PTR(myiter); ITERATOR_NEXT(myiter)) { struct unit *punit=(struct unit *)ITERATOR_PTR(myiter); if(punit->homecity==pcity->id) unit_list_insert(&pcity->units_supported, punit); } } } refresh_tile_mapcanvas(pcity->x, pcity->y, 1); if(city_is_new && client_state==CLIENT_GAME_RUNNING_STATE && pcity->owner==game.player_idx) popup_city_dialog(pcity, 0); if(!city_is_new) refresh_city_dialog(pcity); }
/**************************************************************** ... *****************************************************************/ struct city_dialog *create_city_dialog(struct city *pcity, int make_modal) { int i; struct city_dialog *pdialog; Pixmap icon_pixmap; pdialog=(struct city_dialog *)malloc(sizeof(struct city_dialog)); pdialog->pcity=pcity; pdialog->shell=XtVaCreatePopupShell(pcity->name, make_modal ? transientShellWidgetClass : topLevelShellWidgetClass, toplevel, XtNallowShellResize, True, NULL); pdialog->main_form= XtVaCreateManagedWidget("citymainform", formWidgetClass, pdialog->shell, NULL); pdialog->cityname_label= XtVaCreateManagedWidget("citynamelabel", labelWidgetClass, pdialog->main_form, NULL); pdialog->citizen_labels[0]= XtVaCreateManagedWidget("citizenlabels", commandWidgetClass, pdialog->main_form, XtNfromVert, pdialog->cityname_label, XtNbitmap, get_citizen_pixmap(2), NULL); for(i=1; i<NO_CITIZENS_SHOWN; i++) pdialog->citizen_labels[i]= XtVaCreateManagedWidget("citizenlabels", commandWidgetClass, pdialog->main_form, XtNfromVert, pdialog->cityname_label, XtNfromHoriz, (XtArgVal)pdialog->citizen_labels[i-1], XtNbitmap, get_citizen_pixmap(2), NULL); pdialog->sub_form= XtVaCreateManagedWidget("citysubform", formWidgetClass, pdialog->main_form, XtNfromVert, (XtArgVal)pdialog->citizen_labels[0], NULL); pdialog->production_label= XtVaCreateManagedWidget("cityprodlabel", labelWidgetClass, pdialog->sub_form, NULL); pdialog->output_label= XtVaCreateManagedWidget("cityoutputlabel", labelWidgetClass, pdialog->sub_form, XtNfromVert, (XtArgVal)pdialog->production_label, NULL); pdialog->storage_label= XtVaCreateManagedWidget("citystoragelabel", labelWidgetClass, pdialog->sub_form, XtNfromVert, (XtArgVal)pdialog->output_label, NULL); pdialog->polution_label= XtVaCreateManagedWidget("citypolutionlabel", labelWidgetClass, pdialog->sub_form, XtNfromVert, (XtArgVal)pdialog->storage_label, NULL); pdialog->map_canvas= XtVaCreateManagedWidget("citymapcanvas", xfwfcanvasWidgetClass, pdialog->sub_form, "exposeProc", (XtArgVal)city_map_canvas_expose, "exposeProcData", (XtArgVal)pdialog, XtNfromHoriz, (XtArgVal)pdialog->production_label, NULL); pdialog->building_label= XtVaCreateManagedWidget("citybuildinglabel", labelWidgetClass, pdialog->sub_form, XtNfromHoriz, (XtArgVal)pdialog->map_canvas, NULL); pdialog->progress_label= XtVaCreateManagedWidget("cityprogresslabel", labelWidgetClass, pdialog->sub_form, XtNfromHoriz, (XtArgVal)pdialog->map_canvas, XtNfromVert, pdialog->building_label, NULL); pdialog->buy_command= XtVaCreateManagedWidget("citybuycommand", commandWidgetClass, pdialog->sub_form, XtNfromVert, pdialog->building_label, XtNfromHoriz, (XtArgVal)pdialog->progress_label, NULL); pdialog->change_command= XtVaCreateManagedWidget("citychangecommand", commandWidgetClass, pdialog->sub_form, XtNfromVert, pdialog->building_label, XtNfromHoriz, (XtArgVal)pdialog->buy_command, NULL); pdialog->improvement_viewport= XtVaCreateManagedWidget("cityimprovview", viewportWidgetClass, pdialog->sub_form, XtNfromHoriz, (XtArgVal)pdialog->map_canvas, XtNfromVert, pdialog->progress_label, NULL); pdialog->improvement_list= XtVaCreateManagedWidget("cityimprovlist", listWidgetClass, pdialog->improvement_viewport, XtNforceColumns, 1, XtNdefaultColumns,1, XtNlist, (XtArgVal)dummy_improvement_list, XtNverticalList, False, NULL); pdialog->sell_command= XtVaCreateManagedWidget("citysellcommand", commandWidgetClass, pdialog->sub_form, XtNfromVert, pdialog->improvement_viewport, XtNfromHoriz, (XtArgVal)pdialog->map_canvas, NULL); icon_pixmap = XCreateBitmapFromData(display, RootWindowOfScreen(XtScreen(toplevel)), cityicon_bits, cityicon_width, cityicon_height); pdialog->support_unit_label= XtVaCreateManagedWidget("supportunitlabel", labelWidgetClass, pdialog->main_form, XtNfromVert, pdialog->sub_form, NULL); pdialog->support_unit_pixcomms[0]= XtVaCreateManagedWidget("supportunitcanvas", pixcommWidgetClass, pdialog->main_form, XtNfromVert, pdialog->support_unit_label, NULL); pdialog->support_unit_ids[0]=-1; for(i=1; i<NO_UNITS_SHOWN; i++) { pdialog->support_unit_pixcomms[i]= XtVaCreateManagedWidget("supportunitcanvas", pixcommWidgetClass, pdialog->main_form, XtNfromVert, pdialog->support_unit_label, XtNfromHoriz, (XtArgVal)pdialog->support_unit_pixcomms[i-1], XtNinternalHeight, 0, NULL); pdialog->support_unit_ids[i]=-1; } pdialog->present_unit_label= XtVaCreateManagedWidget("presentunitlabel", labelWidgetClass, pdialog->main_form, XtNfromVert, pdialog->support_unit_pixcomms[0], NULL); pdialog->present_unit_pixcomms[0]= XtVaCreateManagedWidget("presentunitcanvas", pixcommWidgetClass, pdialog->main_form, XtNfromVert, pdialog->present_unit_label, NULL); pdialog->present_unit_ids[0]=-1; for(i=1; i<NO_UNITS_SHOWN; i++) { pdialog->present_unit_pixcomms[i]= XtVaCreateManagedWidget("presentunitcanvas", pixcommWidgetClass, pdialog->main_form, XtNfromVert, pdialog->present_unit_label, XtNfromHoriz, (XtArgVal)pdialog->support_unit_pixcomms[i-1], NULL); pdialog->present_unit_ids[i]=-1; } XtVaSetValues(pdialog->shell, XtNiconPixmap, icon_pixmap, NULL); pdialog->close_command= XtVaCreateManagedWidget("cityclosecommand", commandWidgetClass, pdialog->main_form, XtNfromVert, pdialog->present_unit_pixcomms[0], NULL); pdialog->rename_command= XtVaCreateManagedWidget("cityrenamecommand", commandWidgetClass, pdialog->main_form, XtNfromVert, pdialog->present_unit_pixcomms[0], XtNfromHoriz, pdialog->close_command, NULL); pdialog->trade_command= XtVaCreateManagedWidget("citytradecommand", commandWidgetClass, pdialog->main_form, XtNfromVert, pdialog->present_unit_pixcomms[0], XtNfromHoriz, pdialog->rename_command, NULL); XtAddCallback(pdialog->sell_command, XtNcallback, sell_callback, (XtPointer)pdialog); XtAddCallback(pdialog->buy_command, XtNcallback, buy_callback, (XtPointer)pdialog); XtAddCallback(pdialog->change_command, XtNcallback, change_callback, (XtPointer)pdialog); XtAddCallback(pdialog->close_command, XtNcallback, close_callback, (XtPointer)pdialog); XtAddCallback(pdialog->rename_command, XtNcallback, rename_callback, (XtPointer)pdialog); XtAddCallback(pdialog->trade_command, XtNcallback, trade_callback, (XtPointer)pdialog); genlist_insert(&dialog_list, pdialog, 0); for(i=0; i<B_LAST+1; i++) pdialog->improvlist_names_ptrs[i]=0; for(i=0; i<NO_CITIZENS_SHOWN; i++) pdialog->citizen_type[i]=-1; XtRealizeWidget(pdialog->shell); refresh_city_dialog(pdialog->pcity); if(make_modal) XtSetSensitive(toplevel, FALSE); pdialog->is_modal=make_modal; return pdialog; }