36static const char* NEUTRAL_NAME_STR =
"(neutral)";
38static Int thePrevCurPlyr = 0;
40static Bool islegalplayernamechar(
char c)
43 return ::isalnum(c) || c ==
'_';
69 for (
Int i = 0; i < numTeams; ++i) {
77 if (exists && teamOwner.
compare(oldpname) == 0) {
86static void ensureValidPlayerName(
Dict *d)
91 for (
char* p = buf; *p; ++p)
92 if (!islegalplayernamechar(*p))
101 b = NEUTRAL_NAME_STR;
110 if (playerNameForUI(sides, i) == n)
125 if (token == tokenIn)
138 if (containsToken(cur_allies, token))
142 new_enemies.
concat(token);
151 for (
Int i = 0; i < alliesList->GetCount(); i++)
153 if (alliesList->GetSel(i) > 0)
155 alliesList->GetText(i, buffer);
159 allies.
concat(UIToInternal(sides, nm));
166static void buildAlliesList(CListBox *alliesList,
SidesList& sides,
const AsciiString& omitPlayer)
171 alliesList->ResetContent();
175 if (name == omitPlayer || name.
isEmpty())
177 name = playerNameForUI(sides, i);
178 alliesList->AddString(name.
str());
182static void selectAlliesList(CListBox *alliesList,
SidesList& sides,
const AsciiString& cur_allies)
187 if (extractFromAlliesList(alliesList, sides) == cur_allies)
190 alliesList->SetSel(-1,
false);
202 oindex_in_list = alliesList->FindStringExact(-1, playerNameForUI(sides, i).str());
203 if (oindex_in_list == -1)
208 alliesList->SetSel(oindex_in_list,
true);
213static const char* calcRelationStr(
SidesList& sides,
int t1,
int t2)
215 const char* allied =
"Ally";
216 const char* enemies =
"Enemy";
217 const char* neutral =
"Neutral";
252 CDialog::DoDataExchange(pDX);
289 if (addPlyr.DoModal() != IDOK)
298 pname.format(
"player%04d",num);
299 pnameu.format(L
"Player %04d's Display Name",num);
305 newPlayerDict.setBool(TheKey_playerIsHuman,
true);
306 newPlayerDict.setUnicodeString(TheKey_playerDisplayName, pnameu);
307 newPlayerDict.setAsciiString(TheKey_playerFaction, addedPTName);
308 newPlayerDict.setAsciiString(TheKey_playerEnemies,
AsciiString(
""));
309 newPlayerDict.setAsciiString(TheKey_playerAllies,
AsciiString(
""));
314 if (editor.DoModal() == IDOK)
317 if (newPlayerDict.getAsciiString(TheKey_playerName).isEmpty())
323 ensureValidPlayerName(&newPlayerDict);
324 m_sides.addSide(&newPlayerDict);
327 DEBUG_ASSERTLOG(!modified,(
"had to clean up sides in PlayerListDlg::OnNewplayer"));
338 AfxMessageBox(
"Implement me. (Sorry.)");
348 Dict playerDictCopy = *playerDict;
350 if (editor.DoModal() == IDOK)
352 ensureValidPlayerName(&playerDictCopy);
364 if (::AfxMessageBox(
msg, MB_YESNO) == IDNO)
372 fixDefaultTeamName(
m_sides, pnameold, pnamenew);
375 DEBUG_ASSERTLOG(!modified,(
"had to clean up sides in PlayerListDlg::OnEditplayer"));
392 for (i = 0; i <
m_sides.getNumTeams(); i++)
405 if (::AfxMessageBox(
msg, MB_YESNO) == IDNO)
409 if (
m_sides.getNumSides() <= 1)
414 for (i = 0; i <
m_sides.getNumTeams(); i++)
425 DEBUG_ASSERTLOG(!modified,(
"had to clean up sides in PlayerListDlg::OnRemoveplayer"));
431 CListBox *list = (CListBox*)GetDlgItem(
IDC_PLAYERS);
447 DEBUG_ASSERTLOG(!modified,(
"had to clean up sides in PlayerListDlg::updateTheUI! (caller should do this)"));
454 CListBox *list = (CListBox*)GetDlgItem(
IDC_PLAYERS);
455 list->ResetContent();
458 for (
int i = 0; i < len; i++)
465 fmt = NEUTRAL_NAME_STR;
468 list->AddString(fmt.
str());
479 playername->EnableWindow(!isNeutral);
480 playername->GetWindowText(buffer,
sizeof(buffer)-2);
481 if (strcmp(cur_pname.
str(), buffer) != 0)
482 playername->SetWindowText(cur_pname.
str());
488 playerdname->EnableWindow(!isNeutral);
489 playerdname->GetWindowText(buffer,
sizeof(buffer)-2);
492 if (strcmp(cur_pdnamea.
str(), buffer) != 0)
493 playerdname->SetWindowText(cur_pdnamea.
str());
499 Bool hasColor =
false;
500 Int color = pdict->
getInt(TheKey_playerColor, &hasColor);
517 Bool isHuman = pdict->
getBool(TheKey_playerIsHuman);
519 controller->SetCheck(isHuman ? 0 : 1);
520 controller->EnableWindow(!isNeutral);
526 factions->ResetContent();
532 factions->AddString(nm.
str());
535 i = factions->FindStringExact(-1, pdict->
getAsciiString(TheKey_playerFaction).
str());
536 factions->SetCurSel(i);
546 buildAlliesList(allieslist,
m_sides, cur_pname);
547 selectAlliesList(allieslist,
m_sides, cur_allies);
548 allieslist->EnableWindow(!isNeutral);
551 buildAlliesList(enemieslist,
m_sides, cur_pname);
552 selectAlliesList(enemieslist,
m_sides, cur_enemies);
553 enemieslist->EnableWindow(!isNeutral);
555 regardOthers->ResetContent();
556 regardMe->ResetContent();
559 for (i = 0; i <
m_sides.getNumSides(); i++)
561 pname =
m_sides.getSideInfo(i)->getDict()->getAsciiString(TheKey_playerName);
562 if (pname.
isEmpty() || pname == cur_pname)
564 pname = playerNameForUI(
m_sides, i);
567 sprintf(buffer,
"%s: %s",pname.
str(),rstr);
568 regardOthers->AddString(buffer);
571 sprintf(buffer,
"%s: %s",pname.
str(),rstr);
572 regardMe->AddString(buffer);
585 editbtn->EnableWindow(!isneutral);
587 rmvbtn->EnableWindow(
m_sides.getNumSides() > 1 && !isneutral);
598 CDialog::OnInitDialog();
607 item->GetWindowRect(&rect);
608 ScreenToClient(&rect);
609 DWORD style = item->GetStyle();
611 item->DestroyWindow();
630 if (dlg.DoModal() == IDOK) {
645 for (
Int c=0; c<numColors; ++c)
653 pCombo->AddString(str.
str());
662 Bool selected =
false;
666 for (
Int c=0; c<numColors; ++c)
672 pCombo->SetCurSel(c);
678 pCombo->SetCurSel(-1);
687 if (pCombo && playerDict) {
689 pCombo->GetWindowText(str);
692 for (
Int c=0; c<numColors; ++c)
701 if (str == asciiColor.
str()) {
708 playerDict->
setInt(TheKey_playerColor, color);
728 enemies = removeDupsFromEnemies(allies, enemies);
744 DEBUG_ASSERTLOG(!modified,(
"had to clean up sides in CTeamsDialog::OnOK"));
776 Int sel = faction->GetCurSel();
778 faction->GetLBText(sel, theText);
780 faction->GetWindowText(theText);
795 playername->GetWindowText(buf,
sizeof(buf)-2);
801 if (pnameold == pnamenew)
804 if (
m_sides.findSideInfo(pnamenew))
811 ensureValidPlayerName(pdict);
813 updateAllTeams(
m_sides, pnameold, pnamenew);
814 fixDefaultTeamName(
m_sides, pnameold, pnamenew);
824 playername->GetWindowText(buf,
sizeof(buf)-2);
833 if (pnameold == pnamenew)
848 playerUStr = playerUName;
850 newPlayerDict.
setBool(TheKey_playerIsHuman,
false);
856 ensureValidPlayerName(&newPlayerDict);
857 sides->
addSide(&newPlayerDict);
860 DEBUG_ASSERTLOG(!modified,(
"had to clean up sides in PlayerListDlg::OnNewplayer"));
868 addSide(&
m_sides,
"FactionCivilian",
"PlyrCivilian", L
"PlyrCivilian");
869 addSide(&
m_sides,
"FactionAmerica",
"SkirmishAmerica", L
"SkirmishAmerica");
870 addSide(&
m_sides,
"FactionChina",
"SkirmishChina", L
"SkirmishChina");
871 addSide(&
m_sides,
"FactionGLA",
"SkirmishGLA", L
"SkirmishGLA");
873 addSide(&
m_sides,
"FactionAmericaAirForceGeneral",
"SkirmishAmericaAirForceGeneral", L
"SkirmishAmericaAirForceGeneral");
874 addSide(&
m_sides,
"FactionAmericaLaserGeneral",
"SkirmishAmericaLaserGeneral", L
"SkirmishAmericaLaserGeneral");
875 addSide(&
m_sides,
"FactionAmericaSuperWeaponGeneral",
"SkirmishAmericaSuperWeaponGeneral", L
"SkirmishAmericaSuperWeaponGeneral");
876 addSide(&
m_sides,
"FactionChinaTankGeneral",
"SkirmishChinaTankGeneral", L
"SkirmishChinaTankGeneral");
877 addSide(&
m_sides,
"FactionChinaNukeGeneral",
"SkirmishChinaNukeGeneral", L
"SkirmishChinaNukeGeneral");
878 addSide(&
m_sides,
"FactionChinaInfantryGeneral",
"SkirmishChinaInfantryGeneral", L
"SkirmishChinaInfantryGeneral");
879 addSide(&
m_sides,
"FactionGLADemolitionGeneral",
"SkirmishGLADemolitionGeneral", L
"SkirmishGLADemolitionGeneral");
880 addSide(&
m_sides,
"FactionGLAToxinGeneral",
"SkirmishGLAToxinGeneral", L
"SkirmishGLAToxinGeneral");
881 addSide(&
m_sides,
"FactionGLAStealthGeneral",
"SkirmishGLAStealthGeneral", L
"SkirmishGLAStealthGeneral");
unsigned short UnsignedShort
@ MAX_PLAYER_COUNT
max number of Players.
#define DEBUG_ASSERTLOG(c, m)
GameTextInterface * TheGameText
MultiplayerSettings * TheMultiplayerSettings
The MultiplayerSettings singleton.
NameKeyType NAMEKEY(const AsciiString &name)
PlayerTemplateStore * ThePlayerTemplateStore
singleton instance of PlayerTemplateStore
SidesList * TheSidesList
singleton instance of SidesList
Bool nextToken(AsciiString *token, const char *seps=NULL)
void concat(const AsciiString &stringSrc)
int compare(const AsciiString &stringSrc) const
void set(const AsciiString &stringSrc)
static AsciiString TheEmptyString
void format(AsciiString format,...)
void translate(const UnicodeString &stringSrc)
static CWorldBuilderDoc * GetActiveDoc()
void AddAndDoUndoable(Undoable *pUndo)
Int getInt(NameKeyType key, Bool *exists=NULL) const
void setAsciiString(NameKeyType key, const AsciiString &value)
void setBool(NameKeyType key, Bool value)
Bool getBool(NameKeyType key, Bool *exists=NULL) const
void setUnicodeString(NameKeyType key, const UnicodeString &value)
UnicodeString getUnicodeString(NameKeyType key, Bool *exists=NULL) const
void setInt(NameKeyType key, Int value)
AsciiString getAsciiString(NameKeyType key, Bool *exists=NULL) const
static Int countMapObjectsWithOwner(const AsciiString &n)
RGBColor getRGBValue(void) const
AsciiString getTooltipName(void) const
afx_msg void OnNewplayer()
afx_msg void OnChangePlayername()
afx_msg void OnSelectPlayerColor()
afx_msg void OnChangePlayerdisplayname()
virtual void DoDataExchange(CDataExchange *pDX)
afx_msg void OnAddskirmishplayers()
afx_msg void OnSelchangePlayers()
afx_msg void OnColorPress()
afx_msg void OnPlayeriscomputer()
afx_msg void OnEditplayer()
afx_msg void OnRemoveplayer()
afx_msg void OnEditchangePlayerfaction()
afx_msg void OnSelchangeEnemieslist()
afx_msg void OnSelchangeAllieslist()
virtual BOOL OnInitDialog()
CButtonShowColor m_colorButton
PlayerListDlg(CWnd *pParent=NULL)
void SelectColor(RGBColor rgb)
afx_msg void OnDblclkPlayers()
void PopulateColorComboBox(void)
const RGBColor * getPreferredColor() const
SidesInfo * getSideInfo(Int side)
void addSide(const Dict *d)
SidesInfo * findSideInfo(AsciiString name, Int *index=NULL)
TeamsInfo * getTeamInfo(Int team)
TeamsInfo * findTeamInfo(AsciiString name, Int *index=NULL)
const WideChar * str() const
void translate(const AsciiString &stringSrc)
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
#define REF_PTR_RELEASE(x)