Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
when changing the number of strategies in the game (#571)
- Fixed improper shared pointer handling when writing a .nfg file based on a game in
extensive form.
- Fixed a regression in the GUI in which unique action labels were not being generated when
adding a move via drag-and-drop of a player icon (#618)


## [16.3.2] - unreleased
Expand Down
6 changes: 4 additions & 2 deletions src/games/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -743,15 +743,17 @@ class GameRep : public std::enable_shared_from_this<GameRep> {
{
throw UndefinedException();
}
virtual GameInfoset AppendMove(GameNode p_node, GamePlayer p_player, int p_actions)
virtual GameInfoset AppendMove(GameNode p_node, GamePlayer p_player, int p_actions,
bool p_generateLabels = false)
{
throw UndefinedException();
}
virtual GameInfoset AppendMove(GameNode p_node, GameInfoset p_infoset)
{
throw UndefinedException();
}
virtual GameInfoset InsertMove(GameNode p_node, GamePlayer p_player, int p_actions)
virtual GameInfoset InsertMove(GameNode p_node, GamePlayer p_player, int p_actions,
bool p_generateLabels = false)
{
throw UndefinedException();
}
Expand Down
14 changes: 12 additions & 2 deletions src/games/gametree.cc
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,8 @@ GameInfoset GameTreeRep::LeaveInfoset(GameNode p_node)
return node->m_infoset->shared_from_this();
}

GameInfoset GameTreeRep::AppendMove(GameNode p_node, GamePlayer p_player, int p_actions)
GameInfoset GameTreeRep::AppendMove(GameNode p_node, GamePlayer p_player, int p_actions,
bool p_generateLabels)
{
GameNodeRep *node = p_node.get();
if (p_actions <= 0 || !node->m_children.empty()) {
Expand All @@ -583,6 +584,10 @@ GameInfoset GameTreeRep::AppendMove(GameNode p_node, GamePlayer p_player, int p_
auto newInfoset = std::make_shared<GameInfosetRep>(this, p_player->m_infosets.size() + 1,
p_player.get(), p_actions);
p_player->m_infosets.push_back(newInfoset);
if (p_generateLabels) {
std::for_each(newInfoset->m_actions.begin(), newInfoset->m_actions.end(),
[act = 1](const GameAction &a) mutable { a->SetLabel(std::to_string(act++)); });
}
return AppendMove(p_node, newInfoset);
}

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

GameInfoset GameTreeRep::InsertMove(GameNode p_node, GamePlayer p_player, int p_actions)
GameInfoset GameTreeRep::InsertMove(GameNode p_node, GamePlayer p_player, int p_actions,
bool p_generateLabels)
{
if (p_actions <= 0) {
throw UndefinedException();
Expand All @@ -622,6 +628,10 @@ GameInfoset GameTreeRep::InsertMove(GameNode p_node, GamePlayer p_player, int p_
auto newInfoset = std::make_shared<GameInfosetRep>(this, p_player->m_infosets.size() + 1,
p_player.get(), p_actions);
p_player->m_infosets.push_back(newInfoset);
if (p_generateLabels) {
std::for_each(newInfoset->m_actions.begin(), newInfoset->m_actions.end(),
[act = 1](const GameAction &a) mutable { a->SetLabel(std::to_string(act++)); });
}
return InsertMove(p_node, newInfoset);
}

Expand Down
6 changes: 4 additions & 2 deletions src/games/gametree.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,11 @@ class GameTreeRep : public GameExplicitRep {

/// @name Modification
//@{
GameInfoset AppendMove(GameNode p_node, GamePlayer p_player, int p_actions) override;
GameInfoset AppendMove(GameNode p_node, GamePlayer p_player, int p_actions,
bool p_generateLabels = false) override;
GameInfoset AppendMove(GameNode p_node, GameInfoset p_infoset) override;
GameInfoset InsertMove(GameNode p_node, GamePlayer p_player, int p_actions) override;
GameInfoset InsertMove(GameNode p_node, GamePlayer p_player, int p_actions,
bool p_generateLabels = false) override;
GameInfoset InsertMove(GameNode p_node, GameInfoset p_infoset) override;
void CopyTree(GameNode dest, GameNode src) override;
void MoveTree(GameNode dest, GameNode src) override;
Expand Down
5 changes: 1 addition & 4 deletions src/gui/gamedoc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -639,10 +639,7 @@ void gbtGameDocument::DoAppendMove(GameNode p_node, GameInfoset p_infoset)

void gbtGameDocument::DoInsertMove(GameNode p_node, GamePlayer p_player, unsigned int p_actions)
{
const GameInfoset infoset = m_game->InsertMove(p_node, p_player, p_actions);
auto actions = infoset->GetActions();
std::for_each(actions.begin(), actions.end(),
[act = 1](const GameAction &a) mutable { a->SetLabel(std::to_string(act)); });
m_game->InsertMove(p_node, p_player, p_actions, true);
m_game->SortInfosets();
UpdateViews(GBT_DOC_MODIFIED_GAME);
}
Expand Down
Loading