2008-01-08 14:52:32 +01:00
|
|
|
/*****************************************************************************
|
|
|
|
* Eliot
|
2012-10-07 16:25:41 +02:00
|
|
|
* Copyright (C) 2005-2012 Antoine Fraboulet & Olivier Teulière
|
2008-01-08 14:52:32 +01:00
|
|
|
* Authors: Antoine Fraboulet <antoine.fraboulet @@ free.fr>
|
|
|
|
* Olivier Teulière <ipkiss @@ gmail.com>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*****************************************************************************/
|
2005-08-15 20:14:52 +02:00
|
|
|
|
|
|
|
#include <string>
|
2009-11-29 17:01:31 +01:00
|
|
|
#include <cstdio>
|
2006-01-22 13:23:52 +01:00
|
|
|
#include <wchar.h>
|
2005-08-15 20:14:52 +02:00
|
|
|
#include "coord.h"
|
2005-11-05 14:56:59 +01:00
|
|
|
#include "board.h" // for BOARD_MIN and BOARD_MAX (TODO: remove this include)
|
2005-11-05 16:48:59 +01:00
|
|
|
#include "debug.h"
|
2006-01-22 13:23:52 +01:00
|
|
|
#include "encoding.h"
|
2005-08-15 20:14:52 +02:00
|
|
|
|
2005-11-05 00:26:03 +01:00
|
|
|
|
2012-02-18 22:26:52 +01:00
|
|
|
INIT_LOGGER(game, Coord);
|
|
|
|
|
|
|
|
|
2005-11-05 14:56:59 +01:00
|
|
|
Coord::Coord(int iRow, int iCol, Direction iDir)
|
2005-08-15 20:14:52 +02:00
|
|
|
{
|
2005-11-05 14:56:59 +01:00
|
|
|
m_row = iRow;
|
|
|
|
m_col = iCol;
|
|
|
|
m_dir = iDir;
|
2005-11-05 00:26:03 +01:00
|
|
|
}
|
|
|
|
|
2006-01-22 13:23:52 +01:00
|
|
|
Coord::Coord(const wstring &iStr)
|
2005-11-05 00:26:03 +01:00
|
|
|
{
|
|
|
|
setFromString(iStr);
|
2005-08-15 20:14:52 +02:00
|
|
|
}
|
|
|
|
|
2005-11-05 14:56:59 +01:00
|
|
|
bool Coord::isValid() const
|
2005-08-15 20:14:52 +02:00
|
|
|
{
|
2005-11-05 14:56:59 +01:00
|
|
|
return (m_row >= BOARD_MIN && m_row <= BOARD_MAX &&
|
|
|
|
m_col >= BOARD_MIN && m_col <= BOARD_MAX);
|
2005-08-15 20:14:52 +02:00
|
|
|
}
|
|
|
|
|
2009-02-19 19:25:17 +01:00
|
|
|
|
|
|
|
bool Coord::operator==(const Coord &iOther) const
|
|
|
|
{
|
|
|
|
if (!isValid() && !iOther.isValid())
|
|
|
|
return true;
|
|
|
|
return m_row == iOther.m_row
|
|
|
|
&& m_col == iOther.m_col
|
|
|
|
&& m_dir == iOther.m_dir;
|
|
|
|
}
|
2005-08-15 20:14:52 +02:00
|
|
|
|
2012-12-26 17:03:43 +01:00
|
|
|
|
2005-11-05 14:56:59 +01:00
|
|
|
void Coord::swap()
|
|
|
|
{
|
|
|
|
int tmp = m_col;
|
|
|
|
m_col = m_row;
|
|
|
|
m_row = tmp;
|
|
|
|
}
|
|
|
|
|
2006-01-22 13:23:52 +01:00
|
|
|
|
|
|
|
void Coord::setFromString(const wstring &iWStr)
|
2005-11-05 00:26:03 +01:00
|
|
|
{
|
2006-01-22 13:23:52 +01:00
|
|
|
// TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO
|
|
|
|
// Temporary implementation: convert the wchar_t* string into a char* one
|
2011-07-30 21:48:05 +02:00
|
|
|
string iStr = lfw(iWStr);
|
2006-01-22 13:23:52 +01:00
|
|
|
|
2005-11-05 00:26:03 +01:00
|
|
|
char l[4];
|
|
|
|
int col;
|
|
|
|
|
|
|
|
if (sscanf(iStr.c_str(), "%1[a-oA-O]%2d", l, &col) == 2)
|
|
|
|
{
|
|
|
|
setDir(HORIZONTAL);
|
|
|
|
}
|
|
|
|
else if (sscanf(iStr.c_str(), "%2d%1[a-oA-O]", &col, l) == 2)
|
|
|
|
{
|
|
|
|
setDir(VERTICAL);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-11-05 14:56:59 +01:00
|
|
|
col = -1;
|
|
|
|
l[0] = 'A' - 1;
|
2005-11-05 00:26:03 +01:00
|
|
|
}
|
|
|
|
int row = toupper(*l) - 'A' + 1;
|
|
|
|
setCol(col);
|
|
|
|
setRow(row);
|
2012-12-18 02:04:33 +01:00
|
|
|
// Input such as "A12foo#bar&stuff" should be invalid
|
2012-12-22 00:52:55 +01:00
|
|
|
if (isValid() && toString() != toUpper(iWStr))
|
2012-12-18 02:04:33 +01:00
|
|
|
setCol(-1);
|
2005-11-05 00:26:03 +01:00
|
|
|
}
|
|
|
|
|
2012-12-26 17:03:43 +01:00
|
|
|
wstring Coord::toString() const
|
2005-08-15 20:14:52 +02:00
|
|
|
{
|
2005-11-05 16:48:59 +01:00
|
|
|
ASSERT(isValid(), "Invalid coordinates");
|
2005-11-05 14:56:59 +01:00
|
|
|
|
2006-01-22 13:23:52 +01:00
|
|
|
wchar_t res[7];
|
|
|
|
wchar_t srow[3];
|
|
|
|
wchar_t scol[3];
|
2006-01-01 20:49:35 +01:00
|
|
|
|
2006-01-22 13:23:52 +01:00
|
|
|
_swprintf(scol, 3, L"%d", m_col);
|
|
|
|
_swprintf(srow, 3, L"%c", m_row + 'A' - 1);
|
2006-01-01 20:49:35 +01:00
|
|
|
|
2012-12-26 17:03:43 +01:00
|
|
|
if (getDir() == HORIZONTAL)
|
|
|
|
_swprintf(res, 7, L"%ls%ls", srow, scol);
|
|
|
|
else
|
|
|
|
_swprintf(res, 7, L"%ls%ls", scol, srow);
|
2006-01-22 13:23:52 +01:00
|
|
|
|
|
|
|
return res;
|
2006-01-01 20:49:35 +01:00
|
|
|
}
|
2005-11-05 00:26:03 +01:00
|
|
|
|