Richard Boegli's CnC_Generals_Zero_Hour Fork WIP
This is documentation of Richard Boegil's Zero Hour Fork
 
Loading...
Searching...
No Matches
teamsdialog.cpp
Go to the documentation of this file.
1/*
2** Command & Conquer Generals Zero Hour(tm)
3** Copyright 2025 Electronic Arts Inc.
4**
5** This program is free software: you can redistribute it and/or modify
6** it under the terms of the GNU General Public License as published by
7** the Free Software Foundation, either version 3 of the License, or
8** (at your option) any later version.
9**
10** This program is distributed in the hope that it will be useful,
11** but WITHOUT ANY WARRANTY; without even the implied warranty of
12** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13** GNU General Public License for more details.
14**
15** You should have received a copy of the GNU General Public License
16** along with this program. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19// teamsdialog.cpp : implementation file
20//
21
22#include "stdafx.h"
23#include "worldbuilder.h"
24#include "teamsdialog.h"
25#include "CFixTeamOwnerDialog.h"
26
28#include "GameLogic/SidesList.h"
29#include "TeamBehavior.h"
30#include "TeamGeneric.h"
31#include "TeamIdentity.h"
32#include "TeamReinforcement.h"
34#include "WorldBuilderDoc.h"
35#include "cundoable.h"
36#include "WBView3d.h"
37
38static Int thePrevCurTeam = 0;
39
40static const char* NEUTRAL_NAME_STR = "(neutral)";
41
43// CTeamsDialog dialog
44
45
46CTeamsDialog::CTeamsDialog(CWnd* pParent /*=NULL*/)
47 : CDialog(CTeamsDialog::IDD, pParent)
48{
49 //{{AFX_DATA_INIT(CTeamsDialog)
50 // NOTE: the ClassWizard will add member initialization here
51 //}}AFX_DATA_INIT
52}
53
54
55void CTeamsDialog::DoDataExchange(CDataExchange* pDX)
56{
57 CDialog::DoDataExchange(pDX);
58 //{{AFX_DATA_MAP(CTeamsDialog)
59 // NOTE: the ClassWizard will add DDX and DDV calls here
60 //}}AFX_DATA_MAP
61}
62
63
64BEGIN_MESSAGE_MAP(CTeamsDialog, CDialog)
65 //{{AFX_MSG_MAP(CTeamsDialog)
66 ON_BN_CLICKED(IDC_NEWTEAM, OnNewteam)
67 ON_BN_CLICKED(IDC_DELETETEAM, OnDeleteteam)
68 ON_LBN_SELCHANGE(IDC_PLAYER_LIST, OnSelchangePlayerList)
69 ON_NOTIFY(NM_CLICK, IDC_TEAMS_LIST, OnClickTeamsList)
70 ON_NOTIFY(NM_DBLCLK, IDC_TEAMS_LIST, OnDblclkTeamsList)
71 ON_BN_CLICKED(IDC_COPYTEAM, OnCopyteam)
72 ON_BN_CLICKED(IDC_SelectTeamMembers, OnSelectTeamMembers)
73 ON_BN_CLICKED(IDC_MOVEDOWNTEAM, OnMoveDownTeam)
74 ON_BN_CLICKED(IDC_MOVEUPTEAM, OnMoveUpTeam)
75 //}}AFX_MSG_MAP
76END_MESSAGE_MAP()
77
78
79// CTeamsDialog message handlers
80
81static Bool isPlayerDefaultTeamIndex(SidesList& sides, Int i)
82{
83 return sides.isPlayerDefaultTeam(sides.getTeamInfo(i));
84}
85
86static AsciiString playerNameForUI(SidesList& sides, int i)
87{
88 AsciiString b = sides.getSideInfo(i)->getDict()->getAsciiString(TheKey_playerName);
89 if (b.isEmpty())
90 b = NEUTRAL_NAME_STR;
91 return b;
92}
93
94static AsciiString teamNameForUI(SidesList& sides, int i)
95{
96 TeamsInfo *ti = sides.getTeamInfo(i);
97 if (sides.isPlayerDefaultTeam(ti))
98 {
99 AsciiString ostr = ti->getDict()->getAsciiString(TheKey_teamOwner);
100 if (ostr.isEmpty())
101 ostr = NEUTRAL_NAME_STR;
102 AsciiString n;
103 n.format("(default team)");
104 return n;
105 }
106
107 return ti->getDict()->getAsciiString(TheKey_teamName);
108}
109
110static AsciiString UIToInternal(SidesList& sides, const AsciiString& n)
111{
112 Int i;
113 for (i = 0; i < sides.getNumSides(); i++)
114 {
115 if (playerNameForUI(sides, i) == n)
116 return sides.getSideInfo(i)->getDict()->getAsciiString(TheKey_playerName);
117 }
118
119 DEBUG_CRASH(("ui name not found"));
121}
122
123static Int findTeamParentIndex(SidesList& sides, Int i)
124{
125 AsciiString oname = sides.getTeamInfo(i)->getDict()->getAsciiString(TheKey_teamOwner);
126
127 for (int j = 0; j < sides.getNumSides(); j++)
128 {
129 if (oname == sides.getSideInfo(j)->getDict()->getAsciiString(TheKey_playerName))
130 {
131 return -(j+1);
132 }
133 }
134 DEBUG_CRASH(("hmm"));
135 return 0;
136}
137
138void CTeamsDialog::updateUI(Int whatToRebuild)
139{
140 if (m_updating)
141 return;
142
143 ++m_updating;
144
145 // make sure everything is canonical.
146 Bool modified = m_sides.validateSides();
147 DEBUG_ASSERTLOG(!modified,("had to clean up sides in CTeamsDialog::updateUI! (caller should do this)"));
148 if (modified)
149 {
150 whatToRebuild = REBUILD_ALL; // assume the worst.
151 }
152
153 // constrain team index.
154 if (m_curTeam < 0) m_curTeam = 0;
155 if (m_curTeam >= m_sides.getNumTeams())
156 m_curTeam = m_sides.getNumTeams()-1;
157
158 if (whatToRebuild & REBUILD_TEAMS)
159 {
160 UpdateTeamsList();
161 }
162
163 Bool isDefault = true;
164
165 if (m_curTeam >= 0) {
166 isDefault = isPlayerDefaultTeamIndex(m_sides, m_curTeam);
167 }
168
169 // update delete button
170 CButton *del = (CButton*)GetDlgItem(IDC_DELETETEAM);
171 del->EnableWindow(!isDefault); // toplevel team names are delete-able, but "default" teams are not
172 CButton *copyteam = (CButton*)GetDlgItem(IDC_COPYTEAM);
173 copyteam->EnableWindow(!isDefault); // toplevel team names are delete-able, but "default" teams are not
174
175 //update move up and move down buttons
176 CButton *moveup = (CButton*)GetDlgItem(IDC_MOVEUPTEAM);
177 moveup->EnableWindow(!isDefault);
178 CButton *movedown = (CButton*)GetDlgItem(IDC_MOVEDOWNTEAM);
179 movedown->EnableWindow(!isDefault);
180
181 CListBox *players = (CListBox*)GetDlgItem(IDC_PLAYER_LIST);
182 Int whichPlayer = players->GetCurSel();
183
184 CButton *newteam = (CButton*)GetDlgItem(IDC_NEWTEAM);
185 newteam->EnableWindow(whichPlayer>0); // toplevel team names are delete-able, but "default" teams are not
186
187
188 --m_updating;
189}
190
192{
193 CRect rect;
194
195 CDialog::OnInitDialog();
196
197 // default values for our vars
198 m_updating = 0;
200 m_curTeam = thePrevCurTeam;
201
202 CListCtrl *pList = (CListCtrl *)GetDlgItem(IDC_TEAMS_LIST);
203 pList->InsertColumn(0, "Team Name", LVCFMT_LEFT, 150, 0);
204 pList->InsertColumn(1, "Origin", LVCFMT_LEFT, 150, 1);
205 pList->InsertColumn(2, "Priority", LVCFMT_LEFT, 50, 2);
206 pList->InsertColumn(3, "Script", LVCFMT_LEFT, 150, 3);
207 pList->InsertColumn(4, "Trigger", LVCFMT_LEFT, 150, 4);
208
209
210 CListBox *players = (CListBox*)GetDlgItem(IDC_PLAYER_LIST);
211 players->ResetContent();
212 for (int i = 0; i < m_sides.getNumSides(); i++)
213 {
214 players->AddString(playerNameForUI(m_sides, i).str());
215 }
216
218
220
221 return TRUE;
222}
223
225{
226 Bool modified = m_sides.validateSides();
227 DEBUG_ASSERTLOG(!modified,("had to clean up sides in CTeamsDialog::OnOK"));
228
230 SidesListUndoable *pUndo = new SidesListUndoable(m_sides, pDoc);
231 pDoc->AddAndDoUndoable(pUndo);
232 REF_PTR_RELEASE(pUndo); // belongs to pDoc now.
233
234 thePrevCurTeam = m_curTeam;
235
236 CDialog::OnOK();
237}
238
240{
241 CDialog::OnCancel();
242}
243
245{
246 Int num = 1;
247 AsciiString tname;
248 do
249 {
250 tname.format("team%04d",num++);
251 }
252 while (m_sides.findTeamInfo(tname));
253
254 AsciiString oname = m_sides.getTeamInfo(m_curTeam)->getDict()->getAsciiString(TheKey_teamOwner);
255
256 Dict d;
257 d.setAsciiString(TheKey_teamName, tname);
258 d.setAsciiString(TheKey_teamOwner, oname); // owned by the parent of whatever is selected.
259 d.setBool(TheKey_teamIsSingleton, false);
260
261 m_sides.addTeam(&d);
262 Int i;
263 if (m_sides.findTeamInfo(tname, &i)) {
264 m_curTeam = i;
266 }
268}
269
271{
272 if (m_curTeam < 0)
273 return;
274
275 Bool isDefault = isPlayerDefaultTeamIndex(m_sides, m_curTeam);
276 if (isDefault)
277 {
278 DEBUG_CRASH(("should not be allowed"));
279 return;
280 }
281
282 AsciiString tname = m_sides.getTeamInfo(m_curTeam)->getDict()->getAsciiString(TheKey_teamName);
284 if (count > 0)
285 {
286 CString msg;
287 msg.Format(IDS_REMOVING_INUSE_TEAM, count);
288 if (::AfxMessageBox(msg, MB_YESNO) == IDNO)
289 return;
290 }
291
292 m_sides.removeTeam(m_curTeam);
294}
295
297{
298 CPropertySheet editDialog;
299 editDialog.Construct("Edit Team Template.");
300 TeamIdentity identity;
301 identity.setTeamDict(m_sides.getTeamInfo(m_curTeam)->getDict());
302 identity.setSidesList(&m_sides);
303 TeamReinforcement reinforcements;
304 reinforcements.setTeamDict(m_sides.getTeamInfo(m_curTeam)->getDict());
305 TeamBehavior behavior;
306 behavior.setTeamDict(m_sides.getTeamInfo(m_curTeam)->getDict());
307
308 TeamGeneric generic;
309 generic.setTeamDict(m_sides.getTeamInfo(m_curTeam)->getDict());
310
311 TeamObjectProperties object(m_sides.getTeamInfo(m_curTeam)->getDict());
312
313 editDialog.AddPage(&identity);
314 editDialog.AddPage(&reinforcements);
315 editDialog.AddPage(&behavior);
316 editDialog.AddPage(&generic);
317 editDialog.AddPage(&object);
318
319 if (IDOK == editDialog.DoModal()) {
320 }
322}
323
324void CTeamsDialog::UpdateTeamsList()
325{
326 CListCtrl *pList = (CListCtrl *)GetDlgItem(IDC_TEAMS_LIST);
327 pList->DeleteAllItems();
328 CListBox *players = (CListBox*)GetDlgItem(IDC_PLAYER_LIST);
329
330 Int which = players->GetCurSel();
331 if (which < 0)
332 return;
333
334 Int numTeams = m_sides.getNumTeams();
335 Bool selected = false;
336
337 for (Int i=0, inserted = 0; i<numTeams; i++)
338 {
340 if (ti->getDict()->getAsciiString(TheKey_teamOwner) == playerNameForUI(m_sides, which).str())
341 {
342 Bool exists;
343 AsciiString teamName = teamNameForUI(m_sides, i);
344 AsciiString waypoint = ti->getDict()->getAsciiString(TheKey_teamHome, &exists);
345 AsciiString script = ti->getDict()->getAsciiString(TheKey_teamOnCreateScript, &exists);
346 CString pri;
347 pri.Format(TEXT("%d"), ti->getDict()->getInt(TheKey_teamProductionPriority, &exists));
348 AsciiString trigger = ti->getDict()->getAsciiString(TheKey_teamProductionCondition, &exists);
349
350 pList->InsertItem(LVIF_TEXT, inserted, teamName.str(), 0, 0, 0, 0);
351 pList->SetItemText(inserted, 1, waypoint.str());
352 pList->SetItemText(inserted, 2, pri);
353 pList->SetItemText(inserted, 3, script.str());
354 pList->SetItemText(inserted, 4, trigger.str());
355
356 pList->SetItemData(inserted, i);
357 if (m_curTeam == i) {
358 selected = true;
359 pList->SetItemState(inserted, LVIS_SELECTED, LVIS_SELECTED);
360 pList->EnsureVisible(inserted, false);
361 }
362 inserted++;
363 }
364 }
365 if (!selected) {
366 m_curTeam = -1;
367 if (inserted > 0) {
368 m_curTeam = pList->GetItemData(0);
369 pList->SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
370 pList->EnsureVisible(0, false);
371 }
372 }
373}
374
379
380void CTeamsDialog::OnClickTeamsList(NMHDR* pNMHDR, LRESULT* pResult)
381{
382 CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_TEAMS_LIST);
383
384 int nItem = pList->GetNextItem(-1, LVNI_SELECTED);
385 if (nItem >= 0)
386 {
387 m_curTeam = pList->GetItemData(nItem);
388 pList->SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
389 }
391
392 *pResult = 0;
393}
394
395void CTeamsDialog::OnDblclkTeamsList(NMHDR* pNMHDR, LRESULT* pResult)
396{
397 CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_TEAMS_LIST);
398
399 int nItem = pList->GetNextItem(-1, LVNI_SELECTED);
400 if (nItem >= 0)
401 {
402 m_curTeam = pList->GetItemData(nItem);
403 }
404 if (m_curTeam >= 0 && !isPlayerDefaultTeamIndex(m_sides, m_curTeam)) {
406 }
407
408 *pResult = 0;
409}
410
412{
413 Dict d = *m_sides.getTeamInfo(m_curTeam)->getDict();
414 AsciiString origName = d.getAsciiString(TheKey_teamName);
415
416 Int num = 1;
417 AsciiString tname;
418 do
419 {
420 tname.format("%s.%2d",origName.str(), num++);
421 }
422 while (m_sides.findTeamInfo(tname));
423
424 d.setAsciiString(TheKey_teamName, tname);
425 m_sides.addTeam(&d);
426
428}
429
431{
432 Int count = 0;
433 Dict d = *m_sides.getTeamInfo(m_curTeam)->getDict();
434 AsciiString teamName = d.getAsciiString(TheKey_teamName);
435 Coord3D pos;
436 MapObject *pObj;
437 for (pObj=MapObject::getFirstMapObject(); pObj; pObj=pObj->getNext()) {
438 pObj->setSelected(false);
439 AsciiString objectsTeam = pObj->getProperties()->getAsciiString(TheKey_originalOwner);
440 if (teamName==objectsTeam) {
441 pObj->setSelected(true);
442 pos = *pObj->getLocation();
443 count++;
444 }
445 }
446 CString info;
447 info.Format(IDS_NUM_SELECTED_ON_TEAM, teamName.str(), count);
448 if (count>0) {
450 if (pDoc) {
451 WbView3d *p3View = pDoc->GetActive3DView();
452 if (p3View) {
454 }
455 }
456 }
457 ::AfxMessageBox(info, MB_OK);
458}
459
462{
463 // don't move up if already at top of list
464 if (m_curTeam <= 1)
465 return;
466
467 Dict temp, current;
468 int startRemove;
469 int totalTeams = m_sides.getNumTeams();
470
471 // iterates through all modified entries in the teams list
472 for (int i=m_curTeam-1; i<totalTeams; i++)
473 {
474
475 /* saves the one right above the selected team, then deletes it
476 from the list */
477 if (i == (m_curTeam-1)) {
478 temp = *m_sides.getTeamInfo(i)->getDict();
479 m_sides.removeTeam(i);
480 startRemove = i;
481 }
482
483 /* saves the selected item, deletes from the list, then adds it
484 to the bottom of the list -- then adds the saved "temp" item
485 to the bottom of the list */
486 else if (i == m_curTeam) {
487 current = *m_sides.getTeamInfo(startRemove)->getDict();
488 m_sides.removeTeam(startRemove);
489 m_sides.addTeam(&current);
490 m_sides.addTeam(&temp);
491 }
492
493 /* saves each following item, deletes from the list, and then
494 adds it to the bottom of the list */
495 else if (i > m_curTeam) {
496 current = *m_sides.getTeamInfo(startRemove)->getDict();
497 m_sides.removeTeam(startRemove);
498 m_sides.addTeam(&current);
499 }
500 }
501
502 // modify cursor
503 m_curTeam--;
504
505 // rebuild user interface to reflect changes
506/*
507 LVITEM *pItem = NULL;
508 CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_TEAMS_LIST);
509 Bool result = pList->GetItem(pItem);
510 pList->DeleteItem(m_curTeam);
511 pList->InsertItem(pItem);
512 for (i=0; i<m_sides.getNumTeams(); i++)
513 pList->Update(i);
514 pList->SetItemState(m_curTeam, LVIS_SELECTED, LVIS_SELECTED);
515*/
517}
518
521{
522 // don't move down if already at bottom of list
523 if (m_curTeam >= m_sides.getNumTeams()-1)
524 return;
525
526 Dict temp, current;
527 int startRemove;
528 int totalTeams = m_sides.getNumTeams();
529
530 // iterates through all modified entries in the teams list
531 for (int i=m_curTeam; i<totalTeams; i++)
532 {
533
534 /* saves the selected team, then deletes it
535 from the list */
536 if (i == m_curTeam) {
537 temp = *m_sides.getTeamInfo(i)->getDict();
538 m_sides.removeTeam(i);
539 startRemove = i;
540 }
541
542 /* saves the one right after the selected item, deletes it from the list,
543 then adds it to the bottom of the list -- then adds the saved "temp" item
544 to the bottom of the list */
545 else if (i == (m_curTeam+1)) {
546 current = *m_sides.getTeamInfo(startRemove)->getDict();
547 m_sides.removeTeam(startRemove);
548 m_sides.addTeam(&current);
549 m_sides.addTeam(&temp);
550 }
551
552 /* saves each following item, deletes from the list, and then
553 adds it to the bottom of the list */
554 else if (i > m_curTeam+1) {
555 current = *m_sides.getTeamInfo(startRemove)->getDict();
556 m_sides.removeTeam(startRemove);
557 m_sides.addTeam(&current);
558 }
559 }
560
561 // modify cursor
562 m_curTeam++;
563
564 // rebuild user interface to reflect changes
565/* LVITEM *pItem = NULL;
566 CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_TEAMS_LIST);
567 Bool result = pList->GetItem(pItem);
568 pList->DeleteItem(m_curTeam);
569 pList->InsertItem(pItem);
570 for (i=0; i<m_sides.getNumTeams(); i++)
571 pList->Update(i);
572 pList->SetItemState(m_curTeam, LVIS_SELECTED, LVIS_SELECTED);
573*/
575}
576
578{
579 Int numTeams = m_sides.getNumTeams();
580 for (Int i = 0; i < numTeams; ++i) {
581 TeamsInfo *ti = m_sides.getTeamInfo(i);
582 if (!ti) {
583 continue;
584 }
585
586 Bool exists;
587 AsciiString owner = ti->getDict()->getAsciiString(TheKey_teamOwner, &exists);
588
589 if (exists) {
590 if (isValidTeamOwner(owner)) {
591 continue;
592 }
593 }
594
596 }
597
598}
599
601{
602 Int numOwners = m_sides.getNumSides();
603 for (Int i = 0; i < numOwners; ++i) {
604 SidesInfo *side = m_sides.getSideInfo(i);
605 if (!side) {
606 continue;
607 }
608
609 Bool exists;
610 AsciiString sideOwnerName = side->getDict()->getAsciiString(TheKey_playerName, &exists);
611
612 if (!exists) {
613 continue;
614 }
615
616 if (ownerName == sideOwnerName) {
617 return true;
618 }
619
620 if (sideOwnerName.isEmpty()) {
621 sideOwnerName = NEUTRAL_NAME_STR;
622 }
623
624 if (ownerName == sideOwnerName) {
625 return true;
626 }
627 }
628
629 return false;
630}
631
633{
635 if (fix.DoModal() == IDOK) {
636 if (fix.pickedValidTeam()) {
637 ti->getDict()->setAsciiString(TheKey_teamOwner, fix.getSelectedOwner());
638 }
639 }
640}
641
bool Bool
Definition BaseType.h:132
#define TRUE
Definition BaseType.h:109
#define DEBUG_ASSERTLOG(c, m)
Definition Debug.h:158
#define DEBUG_CRASH(m)
Definition Debug.h:192
#define MAP_XY_FACTOR
Definition MapObject.h:60
SidesList * TheSidesList
singleton instance of SidesList
#define IDC_MOVEDOWNTEAM
Definition resource.h:322
#define IDC_MOVEUPTEAM
Definition resource.h:320
#define IDC_DELETETEAM
Definition resource.h:315
#define IDC_SelectTeamMembers
Definition resource.h:318
#define IDC_COPYTEAM
Definition resource.h:161
#define IDC_PLAYER_LIST
Definition resource.h:268
#define IDS_REMOVING_INUSE_TEAM
Definition resource.h:723
#define IDC_TEAMS_LIST
Definition resource.h:264
#define IDC_NEWTEAM
Definition resource.h:173
#define IDS_NUM_SELECTED_ON_TEAM
Definition resource.h:745
#define BOOL
Definition Wnd_File.h:57
const char * str() const
static AsciiString TheEmptyString
void format(AsciiString format,...)
Bool isEmpty() const
CTeamsDialog(CWnd *pParent=NULL)
afx_msg void OnNewteam()
virtual void OnCancel()
Bool isValidTeamOwner(AsciiString ownerName)
afx_msg void OnCopyteam()
void doCorrectTeamOwnerDialog(TeamsInfo *ti)
afx_msg void OnClickTeamsList(NMHDR *pNMHDR, LRESULT *pResult)
SidesList m_sides
Definition teamsdialog.h:75
afx_msg void OnDblclkTeamsList(NMHDR *pNMHDR, LRESULT *pResult)
virtual void DoDataExchange(CDataExchange *pDX)
afx_msg void OnDeleteteam()
virtual BOOL OnInitDialog()
afx_msg void OnEditTemplate()
virtual void OnOK()
void updateUI(Int whatToRebuild)
afx_msg void OnSelectTeamMembers()
void validateTeamOwners(void)
afx_msg void OnMoveDownTeam()
This function moves a team down the list in the teams list dialog.
afx_msg void OnSelchangePlayerList()
afx_msg void OnMoveUpTeam()
static CWorldBuilderDoc * GetActiveDoc()
void AddAndDoUndoable(Undoable *pUndo)
static WbView3d * GetActive3DView()
Definition Dict.h:67
Int getInt(NameKeyType key, Bool *exists=NULL) const
Definition Dict.cpp:284
void setAsciiString(NameKeyType key, const AsciiString &value)
Definition Dict.cpp:496
void setBool(NameKeyType key, Bool value)
Definition Dict.cpp:466
AsciiString getAsciiString(NameKeyType key, Bool *exists=NULL) const
Definition Dict.cpp:314
const Coord3D * getLocation(void) const
Get the center point.
Definition MapObject.h:126
void setSelected(Bool sel)
Definition MapObject.h:145
Dict * getProperties()
return the object's property sheet.
Definition MapObject.h:123
static MapObject * getFirstMapObject(void)
Definition MapObject.h:182
MapObject * getNext(void) const
Next map object in the list. Not a copy, don't delete it.
Definition MapObject.h:134
static Int countMapObjectsWithOwner(const AsciiString &n)
Dict * getDict()
Definition SidesList.h:69
Bool isPlayerDefaultTeam(TeamsInfo *t)
SidesInfo * getSideInfo(Int side)
Definition SidesList.h:219
Int getNumSides()
Definition SidesList.h:153
TeamsInfo * getTeamInfo(Int team)
Definition SidesList.h:209
Int getNumTeams()
Definition SidesList.h:165
void setTeamDict(Dict *pDict)
void setTeamDict(Dict *dict)
Definition TeamGeneric.h:37
void setSidesList(SidesList *pSides)
void setTeamDict(Dict *pDict)
void setTeamDict(Dict *pDict)
Dict * getDict()
Definition SidesList.h:88
virtual void setCenterInView(Real x, Real y)
Set the center for display.
MSG msg
Definition patch.cpp:409
#define REF_PTR_RELEASE(x)
Definition refcount.h:80
Real x
Definition BaseType.h:333
Real y
Definition BaseType.h:333