Переводя на обыденный: проверка идет не всегда на закрытость + первую атаку за ход, а только при первой атаке за ход проверяется закрыта карта или нет.
По идее, проверка на закрытость проходит перед бросками, так-то. Но на самом деле аккуратней было бы так:
Если (карта.наличие_маскировки и карта.легитимность_маскировки)
карта.получение_повреждений_с_маскировкой
Если (карта.наличие_щита и карта.легитимность_щита)
карта.получение_повреждений_со_щитом
А уже во внутриклассовых методах определять что и как проходит. Но даже эта структура неидеальна, можно сделать лучше.