Beispiel #1
0
/**************************************************************************
  Handle spaceship loss.
**************************************************************************/
void spaceship_lost(struct player *pplayer)
{
  notify_player(NULL, NULL, E_SPACESHIP, ftc_server,
                _("Without guidance from the capital, the %s "
                  "spaceship is lost!"),
                nation_adjective_for_player(pplayer));
  spaceship_init(&pplayer->spaceship);
  send_spaceship_info(pplayer, NULL);
}
Beispiel #2
0
/**************************************************************************
  Updates the player list dialog.

  FIXME: use plrdlg_common.c
**************************************************************************/
void real_players_dialog_update(void)
{
  if (players_dialog_shell) {
    int j = 0;
    Dimension width;
    static char *namelist_ptrs[MAX_NUM_PLAYERS];
    static char namelist_text[MAX_NUM_PLAYERS][256];
    const struct player_diplstate *pds;

    players_iterate(pplayer) {
      char idlebuf[32], statebuf[32], namebuf[32], dsbuf[32];
      
      /* skip barbarians */
      if(is_barbarian(pplayer))
        continue;

      /* text for state */
      sz_strlcpy(statebuf, plrdlg_col_state(pplayer));

      /* text for idleness */
      if(pplayer->nturns_idle>3) {
	fc_snprintf(idlebuf, sizeof(idlebuf),
		    PL_("(idle %d turn)",
			"(idle %d turns)",
			pplayer->nturns_idle - 1),
		    pplayer->nturns_idle - 1);
      } else {
	idlebuf[0]='\0';
      }

      /* text for name, plus AI marker */       
      if (pplayer->ai_controlled) {
        fc_snprintf(namebuf, sizeof(namebuf), "*%-15s",player_name(pplayer));
      } else {
        fc_snprintf(namebuf, sizeof(namebuf), "%-16s",player_name(pplayer));
      }
      namebuf[16] = '\0';

      /* text for diplstate type and turns -- not applicable if this is me */
      if (NULL == client.conn.playing
          || pplayer == client.conn.playing) {
	strcpy(dsbuf, "-");
      } else {
	pds = player_diplstate_get(client.conn.playing, pplayer);
	if (pds->type == DS_CEASEFIRE) {
	  fc_snprintf(dsbuf, sizeof(dsbuf), "%s (%d)",
		      diplstate_text(pds->type), pds->turns_left);
	} else {
	  fc_snprintf(dsbuf, sizeof(dsbuf), "%s",
		      diplstate_text(pds->type));
	}
      }

      /* assemble the whole lot */
      fc_snprintf(namelist_text[j], sizeof(namelist_text[j]),
	      "%-16s %-12s %-8s %-15s %-8s %-6s   %-15s%s", 
	      namebuf,
	      nation_adjective_for_player(pplayer), 
	      get_embassy_status(client.conn.playing, pplayer),
	      dsbuf,
	      get_vision_status(client.conn.playing, pplayer),
	      statebuf,
	      player_addr_hack(pplayer),  /* Fixme for multi-conn */
	      idlebuf);

      namelist_ptrs[j]=namelist_text[j];
      list_index_to_player_index[j] = player_number(pplayer);
      j++;
    } players_iterate_end;
    
    XawListChange(players_list, namelist_ptrs, j, 0, True);

    XtVaGetValues(players_list, XtNwidth, &width, NULL);
    XtVaSetValues(players_label, XtNwidth, width, NULL); 
  }
}
Beispiel #3
0
/**************************************************************************
  Popup (or raise) the spaceship dialog for the given player.
**************************************************************************/
void popup_spaceship_dialog(struct player *pPlayer)
{
    struct SMALL_DLG *pSpaceShp;

    if(!(pSpaceShp = get_spaceship_dialog(pPlayer))) {
        struct widget *pBuf, *pWindow;
        SDL_String16 *pStr;
        char cBuf[128];
        SDL_Rect area;

        pSpaceShp = fc_calloc(1, sizeof(struct SMALL_DLG));

        fc_snprintf(cBuf, sizeof(cBuf), _("The %s Spaceship"),
                    nation_adjective_for_player(pPlayer));
        pStr = create_str16_from_char(cBuf, adj_font(12));
        pStr->style |= TTF_STYLE_BOLD;

        pWindow = create_window_skeleton(NULL, pStr, 0);

        pWindow->action = space_dialog_window_callback;
        set_wstate(pWindow, FC_WS_NORMAL);
        pWindow->data.player = pPlayer;
        pWindow->private_data.small_dlg = pSpaceShp;
        add_to_gui_list(ID_WINDOW, pWindow);
        pSpaceShp->pEndWidgetList = pWindow;

        area = pWindow->area;

        /* ---------- */
        /* create 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));
        pBuf->data.player = pPlayer;
        pBuf->action = exit_space_dialog_callback;
        set_wstate(pBuf, FC_WS_NORMAL);
        pBuf->key = SDLK_ESCAPE;
        area.w = MAX(area.w, (pBuf->size.w + adj_size(10)));

        add_to_gui_list(ID_BUTTON, pBuf);

        pBuf = create_themeicon_button_from_chars(pTheme->OK_Icon, pWindow->dst,
                _("Launch"), adj_font(12), 0);

        pBuf->action = launch_spaceship_callback;
        area.w = MAX(area.w, pBuf->size.w);
        area.h += pBuf->size.h + adj_size(20);
        add_to_gui_list(ID_BUTTON, pBuf);

        pStr = create_str16_from_char(get_spaceship_descr(NULL), adj_font(12));
        pStr->bgcol = (SDL_Color) {
            0, 0, 0, 0
        };
        pBuf = create_iconlabel(NULL, pWindow->dst, pStr, WF_RESTORE_BACKGROUND);
        area.w = MAX(area.w, pBuf->size.w);
        area.h += pBuf->size.h + adj_size(20);
        add_to_gui_list(ID_LABEL, pBuf);

        pSpaceShp->pBeginWidgetList = pBuf;
        /* -------------------------------------------------------- */

        area.w = MAX(area.w, adj_size(300) - (pWindow->size.w - pWindow->area.w));

        resize_window(pWindow, NULL, NULL,
                      (pWindow->size.w - pWindow->area.w) + area.w,
                      (pWindow->size.h - pWindow->area.h) + area.h);

        area = pWindow->area;

        widget_set_position(pWindow,
                            (main_window_width() - pWindow->size.w) / 2,
                            (main_window_height() - 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);

        /* launch button */
        pBuf = pBuf->prev;
        pBuf->size.x = area.x + (area.w - pBuf->size.w) / 2;
        pBuf->size.y = area.y + area.h - pBuf->size.h - adj_size(7);

        /* info label */
        pBuf = pBuf->prev;
        pBuf->size.x = area.x + (area.w - pBuf->size.w) / 2;
        pBuf->size.y = area.y + adj_size(7);

        dialog_list_prepend(dialog_list, pSpaceShp);

        refresh_spaceship_dialog(pPlayer);
    } else {
        if (sellect_window_group_dialog(pSpaceShp->pBeginWidgetList,
                                        pSpaceShp->pEndWidgetList)) {
            widget_flush(pSpaceShp->pEndWidgetList);
        }
    }

}
Beispiel #4
0
/**************************************************************************
  Popup (or raise) the short player list dialog version.
**************************************************************************/
void popup_players_nations_dialog(void)
{
  struct widget *pWindow = NULL, *pBuf = NULL;
  SDL_Surface *pLogo = NULL;
  SDL_String16 *pStr;
  char cBuf[128], *state;
  int n = 0, w = 0, units_h = 0;
  const struct player_diplstate *pDS;
  SDL_Rect area;
  
  if (pShort_Players_Dlg) {
    return;
  }
     
  pShort_Players_Dlg = fc_calloc(1, sizeof(struct ADVANCED_DLG));
  
  /* TRANS: Nations report title */
  pStr = create_str16_from_char(_("Nations") , adj_font(12));
  pStr->style |= TTF_STYLE_BOLD;
  
  pWindow = create_window_skeleton(NULL, pStr, 0);
    
  pWindow->action = players_nations_window_dlg_callback;
  set_wstate(pWindow, FC_WS_NORMAL);
  
  add_to_gui_list(ID_WINDOW, pWindow);
  pShort_Players_Dlg->pEndWidgetList = pWindow;
  
  area = pWindow->area;
  
  /* ---------- */
  /* 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 = MAX(area.w, pBuf->size.w + adj_size(10));
  pBuf->action = exit_players_nations_dlg_callback;
  set_wstate(pBuf, FC_WS_NORMAL);
  pBuf->key = SDLK_ESCAPE;
  
  add_to_gui_list(ID_BUTTON, pBuf);
  /* ---------- */
  
  players_iterate(pPlayer) {
    if (pPlayer != client.conn.playing) {
      if(!pPlayer->is_alive || is_barbarian(pPlayer)) {
        continue;
      }
      
      pDS = player_diplstate_get(client.conn.playing, pPlayer);
            
      if(pPlayer->ai_controlled) {
	state = _("AI");
      } else {
        if (pPlayer->is_connected) {
          if (pPlayer->phase_done) {
      	    state = _("done");
          } else {
      	    state = _("moving");
          }
        } else {
          state = _("disconnected");
        }
      }
     
      if(pDS->type == DS_CEASEFIRE) {
	fc_snprintf(cBuf, sizeof(cBuf), "%s(%s) - %d %s",
                    nation_adjective_for_player(pPlayer),
                    state,
		pDS->turns_left, PL_("turn", "turns", pDS->turns_left));
      } else {
	fc_snprintf(cBuf, sizeof(cBuf), "%s(%s)",
                    nation_adjective_for_player(pPlayer),
                    state);
      }
      
      pStr = create_str16_from_char(cBuf, adj_font(10));
      pStr->style |= TTF_STYLE_BOLD;
   
      pLogo = get_nation_flag_surface(nation_of_player(pPlayer));
      
      pBuf = create_iconlabel(pLogo, pWindow->dst, pStr, 
    	(/*WF_FREE_THEME|*/WF_RESTORE_BACKGROUND|WF_DRAW_TEXT_LABEL_WITH_SPACE));
                      
      /* now add some eye candy ... */
      switch (pDS->type) {
	case DS_ARMISTICE:
	  pBuf->string16->fgcol = *get_theme_color(COLOR_THEME_PLRDLG_ARMISTICE);
	  set_wstate(pBuf, FC_WS_NORMAL);
        break;
        case DS_WAR:
	  if(can_meet_with_player(pPlayer) || can_intel_with_player(pPlayer)) {
            set_wstate(pBuf, FC_WS_NORMAL);
	    pBuf->string16->fgcol = *get_theme_color(COLOR_THEME_PLRDLG_WAR);
          } else {
	    pBuf->string16->fgcol = *(get_theme_color(COLOR_THEME_PLRDLG_WAR_RESTRICTED));
	  }
        break;
	case DS_CEASEFIRE:
	  pBuf->string16->fgcol = *get_theme_color(COLOR_THEME_PLRDLG_CEASEFIRE);
	  set_wstate(pBuf, FC_WS_NORMAL);
        break;
        case DS_PEACE:
	  pBuf->string16->fgcol = *get_theme_color(COLOR_THEME_PLRDLG_PEACE);
	  set_wstate(pBuf, FC_WS_NORMAL);
        break;
	case DS_ALLIANCE:
	  pBuf->string16->fgcol = *get_theme_color(COLOR_THEME_PLRDLG_ALLIANCE);
	  set_wstate(pBuf, FC_WS_NORMAL);
        break;
	case DS_NO_CONTACT:
	  pBuf->string16->fgcol = *(get_theme_color(COLOR_THEME_WIDGET_DISABLED_TEXT));
	break;
        default:
	  set_wstate(pBuf, FC_WS_NORMAL);
        break;
      }
      
      pBuf->string16->bgcol = (SDL_Color) {0, 0, 0, 0};
    
      pBuf->data.player = pPlayer;
  
      pBuf->action = player_nation_callback;
            
  
      add_to_gui_list(ID_LABEL, pBuf);
    
      area.w = MAX(w, pBuf->size.w);
      area.h += pBuf->size.h;
    
      if (n > 19)
      {
        set_wflag(pBuf, WF_HIDDEN);
      }
      
      n++;  
    }
  } players_iterate_end;
  pShort_Players_Dlg->pBeginWidgetList = pBuf;
  pShort_Players_Dlg->pBeginActiveWidgetList = pShort_Players_Dlg->pBeginWidgetList;
  pShort_Players_Dlg->pEndActiveWidgetList = pWindow->prev->prev;
  pShort_Players_Dlg->pActiveWidgetList = pShort_Players_Dlg->pEndActiveWidgetList;
  
  
  /* ---------- */
  if (n > 20)
  {
     
    units_h = create_vertical_scrollbar(pShort_Players_Dlg, 1, 20, TRUE, TRUE);
    pShort_Players_Dlg->pScroll->count = n;
    
    n = units_h;
    area.w += n;
    
    units_h = 20 * pBuf->size.h;
    
  } else {
    units_h = area.h;
  }
        
  /* ---------- */
  
  area.h = units_h;

  resize_window(pWindow, NULL, NULL,
                (pWindow->size.w - pWindow->area.w) + area.w,
                (pWindow->size.h + pWindow->area.h) + area.h);
  
  area = pWindow->area;
  
  widget_set_position(pWindow,
    ((Main.event.motion.x + pWindow->size.w + adj_size(10) < Main.screen->w) ?
      (Main.event.motion.x + adj_size(10)) :
      (Main.screen->w - pWindow->size.w - adj_size(10))),
    ((Main.event.motion.y - adj_size(2) + pWindow->size.h < Main.screen->h) ?
      (Main.event.motion.y - adj_size(2)) :
      (Main.screen->h - pWindow->size.h - adj_size(10))));
  
  w = area.w;
  
  if (pShort_Players_Dlg->pScroll)
  {
    w -= n;
  }
  
  /* 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);
  
  /* cities */
  pBuf = pBuf->prev;
  setup_vertical_widgets_position(1,
	area.x, area.y,
	w, 0, pShort_Players_Dlg->pBeginActiveWidgetList, pBuf);
  
  if (pShort_Players_Dlg->pScroll)
  {
    setup_vertical_scrollbar_area(pShort_Players_Dlg->pScroll,
	area.x + area.w, area.y,
    	area.h, TRUE);
  }
  
  /* -------------------- */
  /* redraw */
  redraw_group(pShort_Players_Dlg->pBeginWidgetList, pWindow, 0);
  widget_mark_dirty(pWindow);
  
  flush_dirty();
}
Beispiel #5
0
/**************************************************************************
  Slot for selecting player/nation
**************************************************************************/
void plr_widget::nation_selected(const QItemSelection &sl,
                                 const QItemSelection &ds)
{
  QModelIndex index;
  QVariant qvar;
  QModelIndexList indexes = sl.indexes();
  struct city *pcity;
  const struct player_diplstate *state;
  struct player_research *research;
  char tbuf[256];
  QString res;
  QString sp = " ";
  QString nl = "<br>";
  struct player *pplayer;
  int a , b;
  bool added;
  bool entry_exist = false;
  struct player *me;
  Tech_type_id tech_id;

  other_player = NULL;
  intel_str.clear();
  tech_str.clear();
  ally_str.clear();
  if (indexes.isEmpty()) {
    plr->update_report();
    return;
  }
  index = indexes.at(0);
  qvar = index.data(Qt::UserRole);
  pplayer = reinterpret_cast<player *>(qvar.value<void *>());
  other_player = pplayer;
  if (pplayer->is_alive == false) {
    plr->update_report();
    return;
  }
  pcity = player_capital(pplayer);
  research = player_research_get(pplayer);

  switch (research->researching) {
  case A_UNKNOWN:
    res = _("(Unknown)");
    break;
  case A_UNSET:
    res = _("(none)");
    break;
  default:
    res = QString(advance_name_researching(pplayer))
          + sp + "(" + QString::number(research->bulbs_researched) + "/"
          + QString::number(total_bulbs_required(pplayer)) + ")";
    break;
  }
  /** Formatting rich text */
  intel_str =
    QString("<table><tr><td><b>") + _("Nation") + QString("</b></td><td>")
    + QString(nation_adjective_for_player(pplayer))
    + QString("</td><tr><td><b>") + N_("Ruler:") + QString("</b></td><td>")
    + QString(ruler_title_for_player(pplayer, tbuf, sizeof(tbuf)))
    + QString("</td></tr><tr><td><b>") + N_("Government:") 
    + QString("</b></td><td>") + QString(government_name_for_player(pplayer))
    + QString("</td></tr><tr><td><b>") + N_("Capital:")
    + QString("</b></td><td>")
    + QString(((!pcity) ? _("(unknown)") : city_name(pcity)))
    + QString("</td></tr><tr><td><b>") + N_("Gold:")
    + QString("</b></td><td>") + QString::number(pplayer->economic.gold)
    + QString("</td></tr><tr><td><b>") + N_("Tax:")
    + QString("</b></td><td>") + QString::number(pplayer->economic.tax)
    + QString("%</td></tr><tr><td><b>") + N_("Science:")
    + QString("</b></td><td>") + QString::number(pplayer->economic.science)
    + QString("%</td></tr><tr><td><b>") + N_("Luxury:")
    + QString("</b></td><td>") + QString::number(pplayer->economic.luxury)
    + QString("%</td></tr><tr><td><b>") + N_("Researching:")
    + QString("</b></td><td>") + res + QString("</td></table>");

  for (int i = 0; i < static_cast<int>(DS_LAST); i++) {
    added = false;
    if (entry_exist) {
      ally_str += "<br>";
    }
    entry_exist = false;
    players_iterate_alive(other) {
      if (other == pplayer) {
        continue;
      }
      state = player_diplstate_get(pplayer, other);
      if (static_cast<int>(state->type) == i) {
        if (added == false) {
          ally_str = ally_str  + QString("<b>")
                     + QString(diplstate_type_translated_name(
                                 static_cast<diplstate_type>(i)))
                     + ": "  + QString("</b>") + nl;
          added = true;
        }
        ally_str = ally_str + nation_plural_for_player(other) + ", ";
        entry_exist = true;
      }
    }
    players_iterate_alive_end;
    if (entry_exist) {
      ally_str.replace(ally_str.lastIndexOf(","), 1, ".");
    }
  }
  me = client_player();
  if ((player_has_embassy(me, pplayer) || client_is_global_observer())
      && me != pplayer) {
    a = 0;
    b = 0;
    techs_known = QString("<b>") + _("Techs unknown by") + sp
                  + QString(nation_adjective_for_player(pplayer)) + sp
                  + QString(_("nation")) + QString("</b> :");
    techs_unknown = QString("<b>") + _("Techs unkown by you") + sp
                    + QString("</b> :");

    advance_iterate(A_FIRST, padvance) {
      tech_id = advance_number(padvance);
      if (player_invention_state(me, tech_id) == TECH_KNOWN
          && (player_invention_state(pplayer, tech_id) == TECH_UNKNOWN)) {
        a++;
        techs_known = techs_known + QString("<i>") 
                      + advance_name_for_player(pplayer, tech_id)
                      + "," + QString("</i>") + sp;
      }
      if (player_invention_state(me, tech_id) == TECH_UNKNOWN
          && (player_invention_state(pplayer, tech_id) == TECH_KNOWN)) {
        b++;
        techs_unknown = techs_unknown + QString("<i>")
                        + advance_name_for_player(pplayer, tech_id)
                        + "," + QString("</i>") + sp;
      }
    } advance_iterate_end;
Beispiel #6
0
/******************************************************************
  The name of the player's nation for the plrdlg.
*******************************************************************/
static const char *col_nation(const struct player *player)
{
  return nation_adjective_for_player(player);
}
Beispiel #7
0
/*****************************************************************************
  The name of the player's nation for the plrdlg.
*****************************************************************************/
static const char *col_nation(const struct city *pcity,
                              const struct player_slot *pslot)
{
  return nation_adjective_for_player(player_slot_get_player(pslot));
}