private void ChangeData(MouseEventArgs e)
{
if (e.Button != MouseButtons.Left && e.Button != MouseButtons.Right)
return;
int id = this.GetTileAtPoint(e.X, e.Y);
switch (this.TilesetMode)
{
case TilesetMode.Passage:
if ((_tileset.passages[id] & ~0x40 & ~0x80) == 0)
_tileset.passages[id] |= 0x01 | 0x02 | 0x04 | 0x08;
else
_tileset.passages[id] &= ~(0x01 | 0x02 | 0x04 | 0x08);
break;
case TilesetMode.Passage4Dir:
{
const int half = Constants.TILESIZE / 2;
int x = 1 + e.X % Constants.TILESIZE;
int y = 1 + e.Y % Constants.TILESIZE;
var dist = new List<double>
{
Math.Pow(half - x, 2) + Math.Pow(Constants.TILESIZE - y, 2), // Bottom
Math.Pow(x, 2) + Math.Pow(half - y, 2), // Left
Math.Pow(Constants.TILESIZE - x, 2) + Math.Pow(half - y, 2), // Right
Math.Pow(half - x, 2) + Math.Pow(y, 2) // Top
};
int index = dist.IndexOf(dist.Min());
int bit = new[] { 0x01, 0x02, 0x04, 0x08 }[index];
if ((_tileset.passages[id] & bit) == bit)
_tileset.passages[id] &= ~bit;
else
_tileset.passages[id] |= bit;
}
break;
case TilesetMode.Priority:
if (e.Button == MouseButtons.Left)
_tileset.priorities[id] = (_tileset.priorities[id] + 1) % Constants.PRIORITIES;
else
{
_tileset.priorities[id]--;
if (_tileset.priorities[id] < 0)
_tileset.priorities[id] = Constants.PRIORITIES - 1;
}
break;
case TilesetMode.Bush:
if ((_tileset.passages[id] & 0x40) == 0x40)
_tileset.passages[id] &= ~0x40;
else
_tileset.passages[id] |= 0x40;
break;
case TilesetMode.Counter:
if ((_tileset.passages[id] & 0x80) == 0x80)
_tileset.passages[id] &= ~0x80;
else
_tileset.passages[id] |= 0x80;
break;
case TilesetMode.Terrain:
if (e.Button == MouseButtons.Left)
_tileset.terrain_tags[id] = (_tileset.terrain_tags[id] + 1) % Constants.TERRAINS;
else
{
_tileset.terrain_tags[id]--;
if (_tileset.terrain_tags[id] < 0)
_tileset.terrain_tags[id] = Constants.TERRAINS - 1;
}
break;
}
Invalidate();
}