/**************************************************************** User selected poisoning from choice dialog *****************************************************************/ static void spy_poison_callback(GtkWidget *w, gpointer data) { if (NULL != game_unit_by_number(diplomat_id) && NULL != game_city_by_number(diplomat_target_id)) { request_diplomat_action(SPY_POISON, diplomat_id, diplomat_target_id, 0); } gtk_widget_destroy(diplomat_dialog); }
/**************************************************************** User responded to bribe dialog *****************************************************************/ static void bribe_response(GtkWidget *w, gint response) { if (response == GTK_RESPONSE_YES) { request_diplomat_action(DIPLOMAT_BRIBE, diplomat_id, diplomat_target_id, 0); } gtk_widget_destroy(w); }
/**************************************************************** User has responded to incite dialog *****************************************************************/ static void incite_response(GtkWidget *w, gint response) { if (response == GTK_RESPONSE_YES) { request_diplomat_action(DIPLOMAT_INCITE, diplomat_id, diplomat_target_id[ATK_CITY], 0); } gtk_widget_destroy(w); }
/**************************************************************** ... *****************************************************************/ static void spy_sabotage_unit_callback(Widget w, XtPointer client_data, XtPointer call_data) { request_diplomat_action(SPY_SABOTAGE_UNIT, diplomat_id, diplomat_target_id, 0); destroy_message_dialog(w); }
/**************************************************************** ... *****************************************************************/ static void diplomat_bribe_yes_callback(Widget w, XtPointer client_data, XtPointer call_data) { request_diplomat_action(DIPLOMAT_BRIBE, diplomat_id, diplomat_target_id, 0); destroy_message_dialog(w); }
/**************************************************************** User selected embassy establishing from choice dialog *****************************************************************/ static void diplomat_embassy_callback(GtkWidget *w, gpointer data) { if (NULL != game_unit_by_number(diplomat_id) && NULL != game_city_by_number(diplomat_target_id)) { request_diplomat_action(DIPLOMAT_EMBASSY, diplomat_id, diplomat_target_id, 0); } gtk_widget_destroy(diplomat_dialog); }
/**************************************************************** User selected stealing from choice dialog *****************************************************************/ static void diplomat_steal_callback(GtkWidget *w, gpointer data) { if (NULL != game_unit_by_number(diplomat_id) && NULL != game_city_by_number(diplomat_target_id)) { request_diplomat_action(DIPLOMAT_STEAL, diplomat_id, diplomat_target_id, A_UNSET); } gtk_widget_destroy(diplomat_dialog); }
/**************************************************************** User selected investigating from choice dialog *****************************************************************/ static void diplomat_investigate_callback(GtkWidget *w, gpointer data) { if (NULL != game_city_by_number(diplomat_target_id) && NULL != game_unit_by_number(diplomat_id)) { request_diplomat_action(DIPLOMAT_INVESTIGATE, diplomat_id, diplomat_target_id, 0); } gtk_widget_destroy(diplomat_dialog); }
/**************************************************************** User selected sabotaging from choice dialog *****************************************************************/ static void diplomat_sabotage_callback(GtkWidget *w, gpointer data) { if (NULL != game_unit_by_number(diplomat_id) && NULL != game_city_by_number(diplomat_target_id)) { request_diplomat_action(DIPLOMAT_SABOTAGE, diplomat_id, diplomat_target_id, B_LAST + 1); } gtk_widget_destroy(diplomat_dialog); }
/**************************************************************** ... *****************************************************************/ static void diplomat_incite_yes_callback(Widget w, XtPointer client_data, XtPointer call_data) { request_diplomat_action(DIPLOMAT_INCITE, diplomat_id, diplomat_target_id, 0); destroy_message_dialog(w); process_diplomat_arrival(NULL, 0); }
/**************************************************************** ... *****************************************************************/ static int spy_sabotage_unit_callback(struct widget *pWidget) { if (Main.event.button.button == SDL_BUTTON_LEFT) { int diplomat_id = MAX_ID - pWidget->ID; int target_id = pWidget->data.unit->id; popdown_diplomat_dialog(); request_diplomat_action(SPY_SABOTAGE_UNIT, diplomat_id, target_id, 0); } return -1; }
/**************************************************************** User has responded to spy's sabotage building dialog *****************************************************************/ static void spy_improvements_response(GtkWidget *w, gint response, gpointer data) { if (response == GTK_RESPONSE_ACCEPT && sabotage_improvement > -2) { if (NULL != game_unit_by_number(diplomat_id) && NULL != game_city_by_number(diplomat_target_id)) { request_diplomat_action(DIPLOMAT_SABOTAGE, diplomat_id, diplomat_target_id, sabotage_improvement + 1); } } gtk_widget_destroy(spy_sabotage_shell); spy_sabotage_shell = NULL; }
static int diplomat_bribe_yes_callback(struct widget *pWidget) { if (Main.event.button.button == SDL_BUTTON_LEFT) { if (NULL != game_unit_by_number(pBribe_Dlg->diplomat_id) && NULL != game_unit_by_number(pBribe_Dlg->diplomat_target_id)) { request_diplomat_action(DIPLOMAT_BRIBE, pBribe_Dlg->diplomat_id, pBribe_Dlg->diplomat_target_id, 0); } popdown_bribe_dialog(); } return -1; }
/**************************************************************** User responded to steal advances dialog *****************************************************************/ static void spy_advances_response(GtkWidget *w, gint response, gpointer data) { if (response == GTK_RESPONSE_ACCEPT && steal_advance > 0) { if (NULL != game_unit_by_number(diplomat_id) && NULL != game_city_by_number(diplomat_target_id)) { request_diplomat_action(DIPLOMAT_STEAL, diplomat_id, diplomat_target_id, steal_advance); } } gtk_widget_destroy(spy_tech_shell); spy_tech_shell = NULL; }
/**************************************************************** ... *****************************************************************/ static int diplomat_steal_callback(struct widget *pWidget) { if (Main.event.button.button == SDL_BUTTON_LEFT) { if (NULL != game_unit_by_number(pDiplomat_Dlg->diplomat_id) && NULL != game_city_by_number(pDiplomat_Dlg->diplomat_target_id)) { request_diplomat_action(DIPLOMAT_STEAL, pDiplomat_Dlg->diplomat_id, pDiplomat_Dlg->diplomat_target_id, A_UNSET); } popdown_diplomat_dialog(); } return -1; }
/************************************************************************* Callback from diplomat/spy dialog for "keep moving". (This should only occur when entering the tile of an allied unit.) **************************************************************************/ static void diplomat_keep_moving_unit_callback(GtkWidget *w, gpointer data) { struct unit *punit; struct unit *tunit; if ((punit = game_unit_by_number(diplomat_id)) && (tunit = game_unit_by_number(diplomat_target_id[ATK_UNIT])) && !same_pos(unit_tile(punit), unit_tile(tunit))) { request_diplomat_action(DIPLOMAT_MOVE, diplomat_id, diplomat_target_id[ATK_UNIT], ATK_UNIT); } gtk_widget_destroy(diplomat_dialog); }
/**************************************************************** ... *****************************************************************/ static void spy_poison_callback(Widget w, XtPointer client_data, XtPointer call_data) { destroy_message_dialog(w); diplomat_dialog = NULL; if (NULL != game_unit_by_number(diplomat_id) && NULL != game_city_by_number(diplomat_target_id)) { request_diplomat_action(SPY_POISON, diplomat_id, diplomat_target_id, 0); } process_diplomat_arrival(NULL, 0); }
/**************************************************************** Callback from diplomat/spy dialog for "keep moving". (This should only occur when entering allied city.) *****************************************************************/ static void diplomat_keep_moving_callback(GtkWidget *w, gpointer data) { struct unit *punit; struct city *pcity; if ((punit = game_unit_by_number(diplomat_id)) && (pcity = game_city_by_number(diplomat_target_id)) && !same_pos(unit_tile(punit), city_tile(pcity))) { request_diplomat_action(DIPLOMAT_MOVE, diplomat_id, diplomat_target_id, 0); } gtk_widget_destroy(diplomat_dialog); }
/**************************************************************** ... *****************************************************************/ static int spy_poison_callback( struct widget *pWidget ) { if (Main.event.button.button == SDL_BUTTON_LEFT) { if (NULL != game_unit_by_number(pDiplomat_Dlg->diplomat_id) && NULL != game_city_by_number(pDiplomat_Dlg->diplomat_target_id)) { request_diplomat_action(SPY_POISON, pDiplomat_Dlg->diplomat_id, pDiplomat_Dlg->diplomat_target_id, 0); } popdown_diplomat_dialog(); } return -1; }
/**************************************************************** ... *****************************************************************/ static void diplomat_steal_callback(Widget w, XtPointer client_data, XtPointer call_data) { destroy_message_dialog(w); diplomat_dialog = NULL; if (NULL != game_unit_by_number(diplomat_id) && NULL != game_city_by_number(diplomat_target_id)) { request_diplomat_action(DIPLOMAT_STEAL, diplomat_id, diplomat_target_id, A_UNSET); } process_diplomat_arrival(NULL, 0); }
/************************************************************************** Callback from diplomat/spy dialog for "keep moving". (This should only occur when entering allied city.) **************************************************************************/ static void diplomat_keep_moving_callback(Widget w, XtPointer client_data, XtPointer call_data) { struct unit *punit; struct city *pcity; destroy_message_dialog(w); diplomat_dialog = NULL; if ((punit = game_unit_by_number(diplomat_id)) && (pcity = game_city_by_number(diplomat_target_id)) && !same_pos(unit_tile(punit), city_tile(pcity))) { request_diplomat_action(DIPLOMAT_MOVE, diplomat_id, diplomat_target_id, 0); } process_diplomat_arrival(NULL, 0); }
/**************************************************************** Callback from diplomat/spy dialog for "keep moving". (This should only occur when entering allied city.) *****************************************************************/ static int diplomat_keep_moving_callback(struct widget *pWidget) { if (Main.event.button.button == SDL_BUTTON_LEFT) { struct unit *punit; struct city *pcity; if ((punit = game_unit_by_number(pDiplomat_Dlg->diplomat_id)) && (pcity = game_city_by_number(pDiplomat_Dlg->diplomat_target_id)) && !same_pos(unit_tile(punit), city_tile(pcity))) { request_diplomat_action(DIPLOMAT_MOVE, pDiplomat_Dlg->diplomat_id, pDiplomat_Dlg->diplomat_target_id, 0); } popdown_diplomat_dialog(); } return -1; }
/**************************************************************** ... *****************************************************************/ static void spy_sabotage_callback(Widget w, XtPointer client_data, XtPointer call_data) { XtDestroyWidget(spy_sabotage_shell); spy_sabotage_shell = 0l; if(!sabotage_improvement){ log_error("Bug in spy sabotage code"); process_diplomat_arrival(NULL, 0); return; } if (NULL != game_unit_by_number(diplomat_id) && NULL != game_city_by_number(diplomat_target_id)) { request_diplomat_action(DIPLOMAT_SABOTAGE, diplomat_id, diplomat_target_id, sabotage_improvement + 1); } process_diplomat_arrival(NULL, 0); }
/**************************************************************** ... *****************************************************************/ static void spy_steal_callback(Widget w, XtPointer client_data, XtPointer call_data) { XtDestroyWidget(spy_tech_shell); spy_tech_shell = 0l; if(!steal_advance){ log_error("Bug in spy steal tech code"); process_diplomat_arrival(NULL, 0); return; } if (NULL != game_unit_by_number(diplomat_id) && NULL != game_city_by_number(diplomat_target_id)) { request_diplomat_action(DIPLOMAT_STEAL, diplomat_id, diplomat_target_id, steal_advance); } process_diplomat_arrival(NULL, 0); }
static int sabotage_impr_callback(struct widget *pWidget) { if (Main.event.button.button == SDL_BUTTON_LEFT) { int sabotage_improvement = MAX_ID - pWidget->ID; int diplomat_target_id = pWidget->data.cont->id0; int diplomat_id = pWidget->data.cont->id1; popdown_advanced_terrain_dialog(); if(sabotage_improvement == 1000) { sabotage_improvement = -1; } if (NULL != game_unit_by_number(diplomat_id) && NULL != game_city_by_number(diplomat_target_id)) { request_diplomat_action(DIPLOMAT_SABOTAGE, diplomat_id, diplomat_target_id, sabotage_improvement + 1); } } return -1; }
/**************************************************************** User selected unit sabotaging from choice dialog *****************************************************************/ static void spy_sabotage_unit_callback(GtkWidget *w, gpointer data) { request_diplomat_action(SPY_SABOTAGE_UNIT, diplomat_id, diplomat_target_id, 0); gtk_widget_destroy(diplomat_dialog); }
/************************************************************************** ... **************************************************************************/ static int spy_steal_popup(struct widget *pWidget) { struct city *pVcity = pWidget->data.city; int id = MAX_ID - pWidget->ID; struct player *pVictim = NULL; struct CONTAINER *pCont; struct widget *pBuf = NULL; struct widget *pWindow; SDL_String16 *pStr; SDL_Surface *pSurf; int max_col, max_row, col, i, count = 0; SDL_Rect area; popdown_diplomat_dialog(); if(pVcity) { pVictim = city_owner(pVcity); } if (pDiplomat_Dlg || !pVictim) { return 1; } count = 0; advance_index_iterate(A_FIRST, i) { if (player_invention_reachable(client.conn.playing, i, FALSE) && TECH_KNOWN == player_invention_state(pVictim, i) && (TECH_UNKNOWN == player_invention_state(client.conn.playing, i) || TECH_PREREQS_KNOWN == player_invention_state(client.conn.playing, i))) { count++; } } advance_index_iterate_end; if(!count) { /* if there is no known tech to steal then send steal order at Spy's Discretion */ int target_id = pVcity->id; request_diplomat_action(DIPLOMAT_STEAL, id, target_id, advance_count()); return -1; } pCont = fc_calloc(1, sizeof(struct CONTAINER)); pCont->id0 = pVcity->id; pCont->id1 = id;/* spy id */ pDiplomat_Dlg = fc_calloc(1, sizeof(struct diplomat_dialog)); pDiplomat_Dlg->diplomat_id = id; pDiplomat_Dlg->diplomat_target_id = pVcity->id; pDiplomat_Dlg->pdialog = fc_calloc(1, sizeof(struct ADVANCED_DLG)); pStr = create_str16_from_char(_("Select Advance to Steal"), adj_font(12)); pStr->style |= TTF_STYLE_BOLD; pWindow = create_window_skeleton(NULL, pStr, 0); pWindow->action = spy_steal_dlg_window_callback; set_wstate(pWindow , FC_WS_NORMAL); add_to_gui_list(ID_DIPLOMAT_DLG_WINDOW, pWindow); pDiplomat_Dlg->pdialog->pEndWidgetList = pWindow; area = pWindow->area; area.w = MAX(area.w, adj_size(8)); /* ------------------ */ /* exit button */ pBuf = create_themeicon(pTheme->Small_CANCEL_Icon, pWindow->dst, WF_WIDGET_HAS_INFO_LABEL | WF_RESTORE_BACKGROUND); pBuf->info_label = create_str16_from_char(_("Close Dialog (Esc)"), adj_font(12)); area.w += pBuf->size.w + adj_size(10); pBuf->action = exit_spy_steal_dlg_callback; set_wstate(pBuf, FC_WS_NORMAL); pBuf->key = SDLK_ESCAPE; add_to_gui_list(ID_TERRAIN_ADV_DLG_EXIT_BUTTON, pBuf); /* ------------------------- */ count++; /* count + at Spy's Discretion */ /* max col - 104 is steal tech widget width */ max_col = (Main.screen->w - (pWindow->size.w - pWindow->area.w) - adj_size(2)) / adj_size(104); /* max row - 204 is steal tech widget height */ max_row = (Main.screen->h - (pWindow->size.h - pWindow->area.h)) / adj_size(204); /* make space on screen for scrollbar */ if (max_col * max_row < count) { max_col--; } if (count < max_col + 1) { col = count; } else { if (count < max_col + adj_size(3)) { col = max_col - adj_size(2); } else { if (count < max_col + adj_size(5)) { col = max_col - 1; } else { col = max_col; } } } pStr = create_string16(NULL, 0, adj_font(10)); pStr->style |= (TTF_STYLE_BOLD | SF_CENTER); count = 0; advance_index_iterate(A_FIRST, i) { if (player_invention_reachable(client.conn.playing, i, FALSE) && TECH_KNOWN == player_invention_state(pVictim, i) && (TECH_UNKNOWN == player_invention_state(client.conn.playing, i) || TECH_PREREQS_KNOWN == player_invention_state(client.conn.playing, i))) { count++; copy_chars_to_string16(pStr, advance_name_translation(advance_by_number(i))); pSurf = create_sellect_tech_icon(pStr, i, FULL_MODE); pBuf = create_icon2(pSurf, pWindow->dst, WF_FREE_THEME | WF_RESTORE_BACKGROUND); set_wstate(pBuf, FC_WS_NORMAL); pBuf->action = spy_steal_callback; pBuf->data.cont = pCont; add_to_gui_list(MAX_ID - i, pBuf); if (count > (col * max_row)) { set_wflag(pBuf, WF_HIDDEN); } } } advance_index_iterate_end; /* get spy tech */ i = advance_number(unit_type(game_unit_by_number(id))->require_advance); copy_chars_to_string16(pStr, _("At Spy's Discretion")); pSurf = create_sellect_tech_icon(pStr, i, FULL_MODE); pBuf = create_icon2(pSurf, pWindow->dst, (WF_FREE_THEME | WF_RESTORE_BACKGROUND| WF_FREE_DATA)); set_wstate(pBuf, FC_WS_NORMAL); pBuf->action = spy_steal_callback; pBuf->data.cont = pCont; add_to_gui_list(MAX_ID - advance_count(), pBuf); count++; /* --------------------------------------------------------- */ FREESTRING16(pStr); pDiplomat_Dlg->pdialog->pBeginWidgetList = pBuf; pDiplomat_Dlg->pdialog->pBeginActiveWidgetList = pDiplomat_Dlg->pdialog->pBeginWidgetList; pDiplomat_Dlg->pdialog->pEndActiveWidgetList = pDiplomat_Dlg->pdialog->pEndWidgetList->prev->prev; /* -------------------------------------------------------------- */ i = 0; if (count > col) { count = (count + (col - 1)) / col; if (count > max_row) { pDiplomat_Dlg->pdialog->pActiveWidgetList = pDiplomat_Dlg->pdialog->pEndActiveWidgetList; count = max_row; i = create_vertical_scrollbar(pDiplomat_Dlg->pdialog, col, count, TRUE, TRUE); } } else { count = 1; } area.w = MAX(area.w, (col * pBuf->size.w + adj_size(2) + i)); area.h = count * pBuf->size.h + adj_size(2); /* alloca window theme and win background buffer */ pSurf = theme_get_background(theme, BACKGROUND_SPYSTEALDLG); if (resize_window(pWindow, pSurf, NULL, (pWindow->size.w - pWindow->area.w) + area.w, (pWindow->size.h - pWindow->area.h) + area.h)) { FREESURFACE(pSurf); } area = pWindow->area; widget_set_position(pWindow, (Main.screen->w - pWindow->size.w) / 2, (Main.screen->h - pWindow->size.h) / 2); /* exit button */ pBuf = pWindow->prev; pBuf->size.x = area.x + area.w - pBuf->size.w - 1; pBuf->size.y = pWindow->size.y + adj_size(2); setup_vertical_widgets_position(col, area.x + 1, area.y, 0, 0, pDiplomat_Dlg->pdialog->pBeginActiveWidgetList, pDiplomat_Dlg->pdialog->pEndActiveWidgetList); if(pDiplomat_Dlg->pdialog->pScroll) { setup_vertical_scrollbar_area(pDiplomat_Dlg->pdialog->pScroll, area.x + area.w, area.y, area.h, TRUE); } redraw_group(pDiplomat_Dlg->pdialog->pBeginWidgetList, pWindow, FALSE); widget_mark_dirty(pWindow); return -1; }