Skip to content

Commit 68d73e7

Browse files
authored
Fix regression in GUI not properly numbering actions at a new information set. (#619)
Due to a previous refactoring the GUI was not generating distinct labels at new information sets created by drag-and-drop of the player icon. Instead, the label "1" was assigned to all actions. This restores the correct behaviour. Internally, the action generation option has been refactored to be part of the game operation itself, in anticipation of future developments on the rules on action labels. Closes #618.
1 parent 9115592 commit 68d73e7

5 files changed

Lines changed: 23 additions & 10 deletions

File tree

ChangeLog

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
when changing the number of strategies in the game (#571)
88
- Fixed improper shared pointer handling when writing a .nfg file based on a game in
99
extensive form.
10+
- Fixed a regression in the GUI in which unique action labels were not being generated when
11+
adding a move via drag-and-drop of a player icon (#618)
1012

1113

1214
## [16.3.2] - unreleased

src/games/game.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -743,15 +743,17 @@ class GameRep : public std::enable_shared_from_this<GameRep> {
743743
{
744744
throw UndefinedException();
745745
}
746-
virtual GameInfoset AppendMove(GameNode p_node, GamePlayer p_player, int p_actions)
746+
virtual GameInfoset AppendMove(GameNode p_node, GamePlayer p_player, int p_actions,
747+
bool p_generateLabels = false)
747748
{
748749
throw UndefinedException();
749750
}
750751
virtual GameInfoset AppendMove(GameNode p_node, GameInfoset p_infoset)
751752
{
752753
throw UndefinedException();
753754
}
754-
virtual GameInfoset InsertMove(GameNode p_node, GamePlayer p_player, int p_actions)
755+
virtual GameInfoset InsertMove(GameNode p_node, GamePlayer p_player, int p_actions,
756+
bool p_generateLabels = false)
755757
{
756758
throw UndefinedException();
757759
}

src/games/gametree.cc

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,8 @@ GameInfoset GameTreeRep::LeaveInfoset(GameNode p_node)
569569
return node->m_infoset->shared_from_this();
570570
}
571571

572-
GameInfoset GameTreeRep::AppendMove(GameNode p_node, GamePlayer p_player, int p_actions)
572+
GameInfoset GameTreeRep::AppendMove(GameNode p_node, GamePlayer p_player, int p_actions,
573+
bool p_generateLabels)
573574
{
574575
GameNodeRep *node = p_node.get();
575576
if (p_actions <= 0 || !node->m_children.empty()) {
@@ -583,6 +584,10 @@ GameInfoset GameTreeRep::AppendMove(GameNode p_node, GamePlayer p_player, int p_
583584
auto newInfoset = std::make_shared<GameInfosetRep>(this, p_player->m_infosets.size() + 1,
584585
p_player.get(), p_actions);
585586
p_player->m_infosets.push_back(newInfoset);
587+
if (p_generateLabels) {
588+
std::for_each(newInfoset->m_actions.begin(), newInfoset->m_actions.end(),
589+
[act = 1](const GameAction &a) mutable { a->SetLabel(std::to_string(act++)); });
590+
}
586591
return AppendMove(p_node, newInfoset);
587592
}
588593

@@ -609,7 +614,8 @@ GameInfoset GameTreeRep::AppendMove(GameNode p_node, GameInfoset p_infoset)
609614
return node->m_infoset->shared_from_this();
610615
}
611616

612-
GameInfoset GameTreeRep::InsertMove(GameNode p_node, GamePlayer p_player, int p_actions)
617+
GameInfoset GameTreeRep::InsertMove(GameNode p_node, GamePlayer p_player, int p_actions,
618+
bool p_generateLabels)
613619
{
614620
if (p_actions <= 0) {
615621
throw UndefinedException();
@@ -622,6 +628,10 @@ GameInfoset GameTreeRep::InsertMove(GameNode p_node, GamePlayer p_player, int p_
622628
auto newInfoset = std::make_shared<GameInfosetRep>(this, p_player->m_infosets.size() + 1,
623629
p_player.get(), p_actions);
624630
p_player->m_infosets.push_back(newInfoset);
631+
if (p_generateLabels) {
632+
std::for_each(newInfoset->m_actions.begin(), newInfoset->m_actions.end(),
633+
[act = 1](const GameAction &a) mutable { a->SetLabel(std::to_string(act++)); });
634+
}
625635
return InsertMove(p_node, newInfoset);
626636
}
627637

src/games/gametree.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,11 @@ class GameTreeRep : public GameExplicitRep {
120120

121121
/// @name Modification
122122
//@{
123-
GameInfoset AppendMove(GameNode p_node, GamePlayer p_player, int p_actions) override;
123+
GameInfoset AppendMove(GameNode p_node, GamePlayer p_player, int p_actions,
124+
bool p_generateLabels = false) override;
124125
GameInfoset AppendMove(GameNode p_node, GameInfoset p_infoset) override;
125-
GameInfoset InsertMove(GameNode p_node, GamePlayer p_player, int p_actions) override;
126+
GameInfoset InsertMove(GameNode p_node, GamePlayer p_player, int p_actions,
127+
bool p_generateLabels = false) override;
126128
GameInfoset InsertMove(GameNode p_node, GameInfoset p_infoset) override;
127129
void CopyTree(GameNode dest, GameNode src) override;
128130
void MoveTree(GameNode dest, GameNode src) override;

src/gui/gamedoc.cc

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -639,10 +639,7 @@ void gbtGameDocument::DoAppendMove(GameNode p_node, GameInfoset p_infoset)
639639

640640
void gbtGameDocument::DoInsertMove(GameNode p_node, GamePlayer p_player, unsigned int p_actions)
641641
{
642-
const GameInfoset infoset = m_game->InsertMove(p_node, p_player, p_actions);
643-
auto actions = infoset->GetActions();
644-
std::for_each(actions.begin(), actions.end(),
645-
[act = 1](const GameAction &a) mutable { a->SetLabel(std::to_string(act)); });
642+
m_game->InsertMove(p_node, p_player, p_actions, true);
646643
m_game->SortInfosets();
647644
UpdateViews(GBT_DOC_MODIFIED_GAME);
648645
}

0 commit comments

Comments
 (0)