13 months agoAlso report variants whose name starts with a digit master
H.G.Muller [Fri, 26 Jan 2018 16:36:52 +0000]
Also report variants whose name starts with a digit

The variants feature did suppress all definitions not starting with
a lower-case letter. Now also digits are allowed, to make external
definition of a parent variant with board-size overrides possible.
(I which case the GUI would check for a variant NxM+S_name being

13 months agoAllow board width of 14 files
H.G.Muller [Fri, 26 Jan 2018 16:24:40 +0000]
Allow board width of 14 files

The board width was limited to 12 files, because Grant Acedrex needed that,
and a large safey margin was kept in case pieces would occur with large
lateral leaps. This was a bit conservative, as usually all leapers are
short range (up to 2 squares). In that case we only need a margin of two
squares. So we set the max width to 14, and leave it to the user to make
sure his pieces will not be able to jump over the guard band.

13 months agoImplement iron pieces
H.G.Muller [Fri, 26 Jan 2018 15:42:40 +0000]
Implement iron pieces

A piece with value -666 or below is now considered uncapturable.

13 months agoFix virginity of Pawns on advanced ranks
H.G.Muller [Fri, 26 Jan 2018 15:29:05 +0000]
Fix virginity of Pawns on advanced ranks

The edit command only granted virginity to Pawns set up on the 2nd rank,
even in games where the initial position has the Pawns on more foreward
ranks. (So far this did not matter, as the only variants with such advanced
Pawns did not have initial double pushes.) Now every Pawn on or behind the
starting position's Pawn rank will be considered virgin. This allows setting
up initial positions with staggered Pawn ranks externally, as long as the
default Pawn rank is chosen at the location of the most advanced Pawns.

2 years agoKeep track of location of unique pieces
H.G.Muller [Sun, 15 May 2016 18:06:34 +0000]
Keep track of location of unique pieces

An array lc[] is defined to keep for each piece type where the last moved
or unmoved piece of that type is standing. For piece types that are only
present in a single copy this faithfully tracks their location.

3 years agoRestructure manual file
H.G.Muller [Wed, 16 Mar 2016 22:58:11 +0000]
Restructure manual file

All options are now explicitly described as items in the man file,
to make this file usable as information source for XBoard's help
clicks in the Engine Settings window.

3 years agoFix hanging on platforms with unsigned char
H.G.Muller [Wed, 16 Mar 2016 08:40:33 +0000]
Fix hanging on platforms with unsigned char

When fgetc is assigned to a char, the code for EOF is clipped, and
not recognized in a comparison when it is not sign-extended. Using an
int (as should have been done in the first place to make the recognition
of EOF unique) now solves this.

3 years agoBump version number 5.0b
H.G.Muller [Wed, 17 Feb 2016 21:02:07 +0000]
Bump version number

3 years agoAdjust Grande Acedrex piece values for Zebra promotion
H.G.Muller [Wed, 17 Feb 2016 18:51:56 +0000]
Adjust Grande Acedrex piece values for Zebra promotion

An 11th-rank Pawn was worth more than a 12th-rank Zebra, which led to
unwillingness to promote d- and i-Pawns.

3 years agoDescribe hopper options in ini file
H.G.Muller [Wed, 17 Feb 2016 18:48:04 +0000]
Describe hopper options in ini file

The possibility to define colliders and accept only friends as platform
is discussed in the ini file.

3 years agoDescribe ini-file sytax for secondary board step
H.G.Muller [Wed, 17 Feb 2016 18:37:09 +0000]
Describe ini-file sytax for secondary board step

The new method to explicitly specify the secondary step after a second
comma in the ray descriptor is now discussed in the ini file.

3 years agoAdjust game phase for imbalance
H.G.Muller [Wed, 17 Feb 2016 10:16:00 +0000]
Adjust game phase for imbalance

The game phase used to be determined only from the total material. In the
presence of a large imbalance this would prevent reaching the end-game
phases, with as a result that Fairy-Max preferred chasing the King with
checks rather than pushing Pawns to promotion. Now the game-phase variable
reflects more the material of the weakest side, by subtracting 2/3 of the
strong side's advantage. (The factor 2/3 was applied to compensate for the
fact that rounding takes place after totalling the advantage, rather than
on the individual pieces, which tends to exaggerate multi-piece advantages,
especially because Pawns then can also contribute.)

3 years agoFix input of promotion move in Makruk
H.G.Muller [Wed, 17 Feb 2016 07:51:04 +0000]
Fix input of promotion move in Makruk

The table-driven promotion had broken the understanding of the input
promotion suffix in Makruk, because in the search Makruk promotions
were still treated as an exception. Now the 6rd-rank promotion is also
taken from the table, by writing the promotion upgrade not always on
last rank, but on the zone edge (possibly overwriting the pre-promotion
bonus normally stored there). This means zone depths other than 1 or 3
would now also work.

3 years agoAdapt pieceToChar strings to new XBoard 4.9 piece order
H.G.Muller [Tue, 9 Feb 2016 21:19:31 +0000]
Adapt pieceToChar strings to new XBoard 4.9 piece order

The Camel and Zebra have been exchanged, and the Gnu is now in the 3rd
row of the 'periodic table' as well.

3 years agoImplement 'random' command
H.G.Muller [Wed, 27 Jan 2016 13:36:43 +0000]
Implement 'random' command

Let the randomization during the first 6 half-moves be controlled by
the CECP 'random' command. And do not randomize at all during analysis.

3 years agoFix preserving game history during undo
H.G.Muller [Wed, 27 Jan 2016 13:24:20 +0000]
Fix preserving game history during undo

Making moves to restore the target position after undo/remove did not
restore the hash key from scratch, and thus got it out of sync with the
original game, so it was no longer recognized. In fact this lead to
a lost position after undo always being seen as a rep draw. The keys
are now also recomputed inside the undo's remake loop.

3 years agoDo not drop out of analysis on checkmate
H.G.Muller [Wed, 27 Jan 2016 11:11:52 +0000]
Do not drop out of analysis on checkmate

Fairy-Max would stop playing when checkmated, by switching to force mode,
but the GUI would still assume it was in analyze mode, so that after 'undo'
analysis would not resume. Now we stay in analyze mode even after checkmate.
(When playing this is apparently not a problem, as GUIs seem to assume a
game is irreversibly finished after checkmate.)

3 years agoPrint mate scores according to new CECP standard
H.G.Muller [Wed, 27 Jan 2016 11:06:19 +0000]
Print mate scores according to new CECP standard

Mate in N is now printed as 100000+N, rather than 8000-N.

3 years agoBump version number
H.G.Muller [Tue, 26 Jan 2016 19:48:17 +0000]
Bump version number

3 years agoClear rather than invalidate hash table on null-move switch
H.G.Muller [Tue, 26 Jan 2016 19:38:55 +0000]
Clear rather than invalidate hash table on null-move switch

Since the code to clear the hash table is there now anyway, it is
better to also use it when the null move is switche off. Invalidating
the hash by spoiling the keys would also prevent recognition from
positions in the persistent hash.

3 years agoUse notation with explicit 2nd-stage step in ini file
H.G.Muller [Tue, 26 Jan 2016 19:25:06 +0000]
Use notation with explicit 2nd-stage step in ini file

The new variants are now defined with explicit secondary board step as
3rd move parameter, rather than obscure bit patterns in the hexadecimal
flag word, so the latter can be purely move rights. This applies to
Grande Acedrex' Unicorn and Griffon (the most interesting cases), but
also to 2- or 3-stride castling.

3 years agoLet 3rd move param specify secondary board step
H.G.Muller [Tue, 26 Jan 2016 16:33:20 +0000]
Let 3rd move param specify secondary board step

For direction-changing pieces it was a nuisance to calculate the required
toggle by hand, for inclusion in the hexadecimal flag word. It is now
possible to explicitly specify the desired secondary step as a 3rd parameter
behind the move rights. This will then be XORed with the primary step,
and copied into the appropriate bit field of the flags word.
Which bits these are now is determined by a single macro RBITS.

3 years agoChange default promotion piece in ASEAN to Rook
H.G.Muller [Tue, 26 Jan 2016 12:45:04 +0000]
Change default promotion piece in ASEAN to Rook

Apparently the rules were changed from the original proposal, to allow
full promotion choice. And a Rook is the strongest piece.

3 years agoFix cosmetic layout typo
H.G.Muller [Tue, 26 Jan 2016 12:34:27 +0000]
Fix cosmetic layout typo

3 years agoFix e.p. after null move
H.G.Muller [Mon, 25 Jan 2016 23:16:45 +0000]
Fix e.p. after null move

3 years agoUse macro name FAIRYDIR instead of DATADIR
H.G.Muller [Mon, 25 Jan 2016 18:08:10 +0000]
Use macro name FAIRYDIR instead of DATADIR

The name DATADIR collided with a definition in one of the hearder files
included through windows.h .

3 years agoMention persistent hash in changelog
H.G.Muller [Mon, 25 Jan 2016 16:00:20 +0000]
Mention persistent hash in changelog

3 years agoFix e.p. capture after 3rd-rank double push
H.G.Muller [Mon, 25 Jan 2016 15:45:29 +0000]
Fix e.p. capture after 3rd-rank double push

The fuzziness of e.p. square comparison on 10-rank boards with triple push
was allowing e.p. capture after a double-push from 3rd rank (as possible
in Wildebeest Chess) also on the from-square of the pushed Pawn. To cure
that, the bits to be ignored in the epSqr-toSqr comparison are now passed
in the higher-order bits of epSqr rather than taken from a fixed global
flag. The rank-unit ignore bit is then set only for double-moves of truly
virgin pieces, so not for 3rd-rank double pushes (which just fake virginity).
In addition a very high bit in epSqr (that would specify ignoring of bits
not used in the square number) is set in the global flag, and thus epSqr,
irrespecive of virginity, for Pawns only. This simplifies identifying
the epSqr as the square skipped in castling, in the face of these extra
high-order bits that might now be present.

3 years agoDescribe persistent hash in man page
H.G.Muller [Sun, 24 Jan 2016 22:20:05 +0000]
Describe persistent hash in man page

3 years agoAdd automatic popup for saving in persistent hash
H.G.Muller [Sun, 24 Jan 2016 22:08:05 +0000]
Add automatic popup for saving in persistent hash

A check option 'Automatic persistent-hash dialog' is now defined by
the engine. Ticking it will use the "askuser" command of CECP at the
start of any analysis search, to ask whether the position should be
stored in the persistent hash. The user can then simply answer this
with a single 'OK' or 'Cancel' click, rather than having to go deep
into the menus for hitting the 'Save in hash file' button.
  If the user types a number before hitting 'OK', the position will
be saved in the hash file with that score (interpreted as centi-Pawn),
rather than the latest analysis score.

3 years agoAdd option to save position in persistent hash
H.G.Muller [Sun, 24 Jan 2016 21:48:00 +0000]
Add option to save position in persistent hash

An engine-defined button 'Save in hash file' is added to the options,
and will, during analysis, append the current position with the score
of the last-printed PV in the persistent hash file in the current
directory. If needed the file will be created.

3 years agoAdd persistent-hash
H.G.Muller [Sun, 24 Jan 2016 21:31:33 +0000]
Add persistent-hash

At the start of each game a file for the selected variant is read,
and the (key,score) pairs in it are stuffed in the hash table with
draft 99 (which protects them from overwrite) and exact score.
The file (named VARIANT.hash) is sought in two places, Fairy-Max's
private data files, and in the current directory. If both exist,
both will be read, the one in the current directory last.
 A persistent hash file makruk.hash is now included in the install.
It contains 3 mated-in-5 positions (times 8 orientations and 2 colors),
two 2 from the KNMMK and 1 from the KMMMK end-game, to facilitate
recognition of mates in the 'difficult' corner.

3 years agoUse explicitly defined random function
H.G.Muller [Sun, 24 Jan 2016 21:01:47 +0000]
Use explicitly defined random function

To guarantee platform-independence of the hash keys, Fairy-Max now uses
its own random function. A simple linear congruent PRNG is used, but this
did not give working keys when we just selected bits from them. An extra
multiplication that makes the selected bits dependent on all bits was
good enough to solve this.

3 years agoAbsolutize hash key
H.G.Muller [Sun, 24 Jan 2016 20:47:33 +0000]
Absolutize hash key

The hash keys always started at 0, irrespective of what position was
set up. In addition there were some events that would (intentionally)
spoil the key in an ad-hoc manner (such as castling or promotion),
so that the hash key of a position later in the game would depend
on such events being in the game history or not. Such a key shift would
spoil recognition of the game history, but as they only happened on
irreversible moves this was not a problem.
We now calculate the keys from scratch before every search.

3 years agoImplement corner-leave extension for bare King
H.G.Muller [Sun, 24 Jan 2016 20:35:08 +0000]
Implement corner-leave extension for bare King

During bare-King checkmating all extensions and reductions are now
disabled (LMR was quite harmful here, as it puts emphasis on searching
lines that move pieces to the center rather than to the bare King),
except for this new one: a bare King stepping out of a corner gets an
extension of 2 ply. This doubles the length of lines where the King
is forced to step back and forth between two squares in the corner
(which it would avoid if it could). As these are usually the lines that
lead to mate, this helps finding the checkmate faster.

3 years agoPrevent search abort spoils hash key
H.G.Muller [Sun, 24 Jan 2016 20:22:45 +0000]
Prevent search abort spoils hash key

An analysis search would be aborted by input, but would fail to restore
the hash key in that process.

3 years agoPass DATADIR to compiler rather than complete INI_FILE
H.G.Muller [Sun, 24 Jan 2016 20:14:30 +0000]
Pass DATADIR to compiler rather than complete INI_FILE

Fairy-Max now buils the name of the default ini file internally
from the DATADIR macro passed to the compiler, so that it can in the
future also manage other files in that same directory.

3 years agoPrint variants feature from inifile that is used
H.G.Muller [Sun, 24 Jan 2016 20:10:19 +0000]
Print variants feature from inifile that is used

The PrintVariants routine to print the supported variants was using the
hard-coded default ini file, even if the user had overruled this in a
command-line argument.

3 years agoUse separate Kings in Wildebeest Chess
H.G.Muller [Thu, 21 Jan 2016 21:25:36 +0000]
Use separate Kings in Wildebeest Chess

Wildebeest Chess has some weak pieces (Knights and Camels) that have
to checkmate (or in thi scase stalemat, which is a win) in pairs,
and could thus benefit fro the increase of centralization width when
a King is bared.

3 years agoUpdate change log
H.G.Muller [Thu, 21 Jan 2016 21:22:41 +0000]
Update change log

3 years agoFix in-tree repetition detection
H.G.Muller [Thu, 21 Jan 2016 21:14:27 +0000]
Fix in-tree repetition detection

The repetition detection during search was based on the idea that
all nodes would do IID. But when they did not, the busy flag would
not be set. We now explicitly set the busy flag at the start of the
IID loop. (Cannot do it before the loop, as with a sufficient-depth
hash hit the loop would not be executed at all, and the flag would
never be cleared.) For this we have to reserve the entry in advance,
(by writing key), for which we have to check if it isn't game history.

3 years agoClear hash table every move when mating bare King
H.G.Muller [Thu, 21 Jan 2016 21:07:24 +0000]
Clear hash table every move when mating bare King

While mating a bare King the sloppiness of not including centralization
score when updating incremental eval at game level really hurt when
mating a bare King: it would drive the King back to a good place to get
a hash hit there, because the hash would contain a high score, reflecting
that there would be so much to gain to drive the King away from it.
So we now clear the hash table, except for game history and mate scores
(that were not based on eval, and help to find deep mates by accumulating
them over a number of moves).

3 years agoImprove corner painting
H.G.Muller [Thu, 21 Jan 2016 20:59:48 +0000]
Improve corner painting

The entire centralization table is now re-computed when a bare King
reaches a corner square, to contain a penalty that linearly ramps up
to the two adjacent corners. This seems the best way to guide a drive to
one of these corners, and wastes no time in the safe corner. Works
for KBNK, KNFFK, KEMK, KNMK and KXMK at 40moves/min within their respective
reversible-move limits, against an opponnet that thinks 10 times longer
and knows what the safe corner is.
  Would not work with boards with odd sizes, where corner colors do not
alternate, or when failure to mate in a corner is due to piece assymetry
rather than color binding. But currently we have no such variants.

3 years agoFix reading promotion suffix
H.G.Muller [Sat, 16 Jan 2016 15:56:07 +0000]
Fix reading promotion suffix

The double-digit-rank patch had broken reading of the promotion
suffix, which was only apparent in variants where the piece ID was
used that corresponded to linefeed. (E.g. team-mate.)

3 years agoImprove bare-King corner painting
H.G.Muller [Sat, 16 Jan 2016 14:39:03 +0000]
Improve bare-King corner painting

A bare King now changes the center bonus of two squares, and rather
than subtracting 5 from the penalty, it now immediately sets it to 6
if it was above 15. So it will now only affect squares really close
to a corner, giving them a penalty lower than the board-edge midpoints,
so that there will be a reward for driving the King out of that corner,
but it won't act as a trap for the stronger side's pieces to lure them
out of the center.
  A square diagonally next to the bare Kings location is painted as well,
to speed up painting of ranks and files one step away from the edge,
when the King is trapped against the latter.

3 years agoLet any pair of Kings be subject to baring detection
H.G.Muller [Thu, 14 Jan 2016 22:04:33 +0000]
Let any pair of Kings be subject to baring detection

Instead of checking fixed pieces 3 and 4 for being Kings, and adjusting
the centralization weight for the bare one, we now look which pieces
are royal during game load (wk and bk). This way it is no longer necessary
to have an unnatural piece ordering (that would interfere with capture

3 years agoAdd variant pseudo-wildebeest
H.G.Muller [Thu, 14 Jan 2016 18:24:18 +0000]
Add variant pseudo-wildebeest

This is Wildebeest Chess with one defect: the castling where the King
moves only a single square towards the Rook is not allowed. The other
special stuff, such as 2nd-rank Pawn triple pushes e.p. capturable on
both skipped squares, e.p-capturable double pushes from 3rd rank, and
castlings that step 2-4 squares towards the Rook, all works. It even
knows stalemate is a draw.

3 years agoAllow stalemate to be scored as a win
H.G.Muller [Thu, 14 Jan 2016 19:06:51 +0000]
Allow stalemate to be scored as a win

A new kludge is introduced to indicate an alternate winning condition:
When the value of piece number 9 is -2, stalemate detection is spoiled,
so that stalemate will score the same as checkmate.

3 years agoSuppress draw claims in force mode
H.G.Muller [Thu, 14 Jan 2016 13:19:22 +0000]
Suppress draw claims in force mode

Making 50-move or rep-draw claims should not be done in force mode,
as these are not draws by rule, but choices that are the result of
a thought process. It must be possible to input a game into the engine
where the players decided to play on rather than claim.

3 years agoFix storing of larger boards in game history
H.G.Muller [Thu, 14 Jan 2016 13:11:17 +0000]
Fix storing of larger boards in game history

The board copies stored as game history by the interface for claiming
rep-draws could still only hold 8 ranks, leading to spurious draw claims.

3 years agoAdd kludge to play Pawn double-push from 3rd rank
H.G.Muller [Thu, 14 Jan 2016 12:20:55 +0000]
Add kludge to play Pawn double-push from 3rd rank

A Pawn move specifying a toggle delay 3 (which would be a 5-step move,
and thus unlikely to be needed in practice in its normal meaning) is
now treated special: the delay is reduced to 0 when the Pawn is on
3rd rank, and in that case the Pawn is imagined virgin even though
it already moved there from 2nd rank. This enables double-pushes
from 3nd rank. In all other cases the delay is reduced to 1, and
the virginity untouched, meaning that it specifies a triple-push,
which could be a 2nd-rank-only triple push if the move was defined
as virgin-only. So flag=24 (hex!) specifies a 2nd-rank double-push,
flag=424 a 2nd-rank triple-push, and flag=C24 a 2nd-rank triple-push
AND a 3rd-rank double-push.
 The kludge test for activating e.p. capture on both squares of
a triple-push was changed to recognize both 4xx and Cxx mode flags,
instead of just 424, so that on 10-rank boards all mentioned triple-
pushes are subject to this.

3 years agoMake e.p. test slightly more elegant
H.G.Muller [Thu, 14 Jan 2016 10:14:59 +0000]
Make e.p. test slightly more elegant

3 years agoAllow e.p. capture on 1st skip-square of triple push
H.G.Muller [Wed, 13 Jan 2016 22:39:08 +0000]
Allow e.p. capture on 1st skip-square of triple push

Some variants on 10-rank boards have Pawn triple pushes from 2nd rank,
which can then be e.p. captured both on 3rd and 4th rank. Fairy-Max
only passes one epSqr, however, set to the last skipped square.
The test whether the toSqr matches the epSqr is now made 'fuzzy'
in such a case (as yet tested only on the white Pawn, and only recognized
when the triple push is defined as its first move) by ignoring the
lowest-order rank bit (obliterating the difference between rank 2/3 and

3 years agoFix introduced castling bugs
H.G.Muller [Wed, 13 Jan 2016 18:16:24 +0000]
Fix introduced castling bugs

Testing if the epSquare was on the back rank through pt[] needed the
latter to be also defined for the dummy square S, to prevent an
out-of-bounds access that would crash the engine. The castling
test itself was simplified too much, and would also castle with an
empty corner square.

3 years agoAdd Roman Chess
H.G.Muller [Wed, 13 Jan 2016 12:30:52 +0000]
Add Roman Chess

This is actually the most straightforward 10x10 variant, needing
only XBoard standard pieces (FIDE + Commoner), no Pawn triple-push,
and the stride-3 castling usual for 10-wide boards.

3 years agoMention ASEAN chess on man page
H.G.Muller [Wed, 13 Jan 2016 08:32:11 +0000]
Mention ASEAN chess on man page

This is now listed with the Makruk variants.

3 years agoAdd variant janus
H.G.Muller [Wed, 13 Jan 2016 08:23:15 +0000]
Add variant janus

Now larger castling strides work perfectly, Janus Chess (wich has a
stride-4 j-side castling) could be implemented.

3 years agoFix check test for long castling strides
H.G.Muller [Wed, 13 Jan 2016 08:01:51 +0000]
Fix check test for long castling strides

Castling used to be refuted by a capture to between epSqr-1 and epSqr+1
(inclusive), where epSquare (E) was the first square skipped by King.
This took care of the rule that forbids castling out of or through check
for castlings where the King stepped 2 or 3 squares. But for King strides
of 4 (or more) the last square(s) the King passed through were not checked.
Now the range limits for the test are extended to the Kings toSqr.
The test for epSqr being on last rank is now made through pt[] (which
assumes that an e.p. square for Pawns never lies in the promotion zone).

3 years agoGive bonus for any multi-step royal move
H.G.Muller [Tue, 12 Jan 2016 21:23:25 +0000]
Give bonus for any multi-step royal move

Variants can have initial moves intended to bring a royal to safety
other than castlings, but only castling got a bonus large enough to
overcome the middle-game King-move penalty. Now other moves that
transport a royal more than 1 file sideways also get a (somewhat more
modest) bonus that makes them attractive.

3 years agoMake emptiness test compatible with 4-stride castling
H.G.Muller [Tue, 12 Jan 2016 18:21:41 +0000]
Make emptiness test compatible with 4-stride castling

On a castling move (rights 34) we now always test the two squares next
to Rook and the two squares next to King for emptiness. (The latter used
to be just one square.) This works for strides of upto 4. Unfortunately
only 3 squares are tested (King from-square plus two neighbors) for
castling through check, so for the time being castling will be unjustly
allowed when the square next to the Rook is under attack.

3 years agoFix castling on odd-size boards
H.G.Muller [Tue, 12 Jan 2016 16:59:33 +0000]
Fix castling on odd-size boards

The castling emptiness test was not working on odd-width boards
(and dubious on 10-wide boards), and partner indication was not
working on boards with other than 8 ranks.

3 years agoCap hash-table size to 384MB
H.G.Muller [Tue, 12 Jan 2016 12:08:03 +0000]
Cap hash-table size to 384MB

We now start testing if the hash table fits the memory command at 32M
entries = 384MB. This prevents hanging when people ask for 1GB hash.

3 years agoFix under-promotion to Bishop in Mexican Chess
H.G.Muller [Tue, 12 Jan 2016 11:14:21 +0000]
Fix under-promotion to Bishop in Mexican Chess

The Bishop had a piece value ending in '3', which is the current kludge
for making a piece invalid as promotion choice.

3 years agoAllow more space for pieceToCharTable
H.G.Muller [Tue, 12 Jan 2016 10:47:57 +0000]
Allow more space for pieceToCharTable

The 80-character buffer for reading the pieceToChar string from the
ini file was too small for using all piece types, now that XBoard
supports 2x54 of those. Make it future-proof with 200.

3 years agoFix castling test for non-8-rank boards
H.G.Muller [Tue, 12 Jan 2016 10:16:43 +0000]
Fix castling test for non-8-rank boards

The castling test decided whether an e.p. square indicated a Pawn or a King
double move depending on whether it was on 1st or 8th rank. But the test
for 8th rank of course should have been highest rank. As it was actually
testing for >= 8th rank, a lot of white double Pawn pushes were seen as
castlings and rejected as illegal because they passed through checks.

3 years agoGive Pawns initial triple push in Mexican Chess
H.G.Muller [Tue, 12 Jan 2016 09:58:34 +0000]
Give Pawns initial triple push in Mexican Chess

A new source (boardgamegeek.com) revealed that in Mexican Chess the Pawns
have an initial triple push. It did not specify what the rules for e.p.
capture are. Fairy-Max can currently only e.p. capture on the last square
a multi-push skipped over, so for now that is what it does.

3 years agoFix Cygwin compile error
H.G.Muller [Mon, 11 Jan 2016 22:25:12 +0000]
Fix Cygwin compile error

The macro CONST is apparently predefined in Cygwin gcc, which clashed
with the use as a variable name. So the variable is renamed CONS now.

3 years agoUpdate man page
H.G.Muller [Mon, 11 Jan 2016 10:42:19 +0000]
Update man page

The manual is updated to mention the new variants, analyze mode
and move exclusion. The relation to XBoard and importance of using
the latest version of that is also explained more elaborately.

3 years agoUpdate comments in ini file
H.G.Muller [Mon, 11 Jan 2016 10:41:07 +0000]
Update comments in ini file

The self-documenting text in fmax.ini is updated to mention the
new features.

3 years agoAdd variant grande-acedrex
H.G.Muller [Fri, 8 Jan 2016 22:45:20 +0000]
Add variant grande-acedrex

A game description of Grande Acedrex is added, making use of all the
new features: Pawns set up on 4th rank, file-dependent default promotion
with rejection of under-promotion, and of course the 12x12 board.
It uses XBoard 4.9's minor Lion and Zebra piece images.

3 years agoFix promotion bonus
H.G.Muller [Fri, 8 Jan 2016 22:40:25 +0000]
Fix promotion bonus

The true bonus is now calculated in the tree, from the piece value w[]
of the Pawn and the default promotion piece, rather than assumed to be
a Queen value. Correction at game level is still needed for under-
promotions, but again based on true piece value. The pt[] table now
only contains the push bonus 64 on 6th and 7th rank, and the compensating
term -128 on 8th rank to cancel that. With Ferz promotion these are
divided by 8, as they used to be.

3 years agoMake default piece file dependent
H.G.Muller [Fri, 8 Jan 2016 19:32:47 +0000]
Make default piece file dependent

The promotion table can now be initialized such that each file will
have a different default promotion piece, namely the piece that started
on the promotion square. (For King the piece left of it.)
For now this is triggered by the Pawns starting on 4th rank.

3 years agoLet variant ASEAN use new method to shift Pawn rank
H.G.Muller [Fri, 8 Jan 2016 18:24:39 +0000]
Let variant ASEAN use new method to shift Pawn rank

To start the Pawns on 3rd rank ASEAN now uses the suffix '=-2' instead
of '=1', which is the new general method to relocate the Pawn rank while
keeping the promotion zone just 1 rank. This means the dedicated code
for the '=1' kludge culd be deleted.

3 years agoMake pawn placement variable
H.G.Muller [Fri, 8 Jan 2016 17:18:51 +0000]
Make pawn placement variable

The placement of Pawns, which was hard-coded on 2nd rank, with an
exception for Makruk, is now determined by a more general mechanism
through a variable pRank, which could also have other values than 1
(default) or 2 (Makruk). pRank can be configured through an =N suffix
to the board size with negative N (which then assumes a 1-rank zone).

3 years agoDrive promotion from table
H.G.Muller [Fri, 8 Jan 2016 16:34:30 +0000]
Drive promotion from table

The pt[] table now indicates the promotion itself, rather than just flagging
it through the '1' bit. I.e., the content of that table for the to-square
is now always added to the piece as well as the score (for which the table
had to be upgraded to int). This upgrades the Pawn either to a 'heavy'
Pawn that is worth more on capture, (when pt[to]=64), or it performs
the promotion. For this pt[to] has to be 0x287-p (p=1 or 2), where the
0x280+2*64 = 0x300 adds to the score only.

3 years agoFix from-square in PV for rank > 8
H.G.Muller [Fri, 8 Jan 2016 09:47:14 +0000]
Fix from-square in PV for rank > 8

Due to sign extension of the from-square while packing the PV moves
garbage rank numbers were printed. The higher bits are masked off now.

3 years agoAdd Mexican Chess
H.G.Muller [Fri, 8 Jan 2016 09:24:32 +0000]
Add Mexican Chess

Another 10x10 variant, this time with Camels. (Not sure what these
do in Mexico, though...)

3 years agoAdd Ciccolini's Chess
H.G.Muller [Fri, 8 Jan 2016 08:53:58 +0000]
Add Ciccolini's Chess

The capacity for bigger boards is used to define Ciccolini's Chess,
a 10x10 variant that features Zebras and enhances the Bishops with
a Dabbabarider move (preserving their color binding).

3 years agoFix printing of PV
H.G.Muller [Thu, 7 Jan 2016 22:53:00 +0000]
Fix printing of PV

The packing of the PV moves has to reserve 9 bits for the to-square now.

3 years agoFix move parsing
H.G.Muller [Thu, 7 Jan 2016 22:47:38 +0000]
Fix move parsing

The test for success was inverted.

3 years agoFix edit command
H.G.Muller [Thu, 7 Jan 2016 22:41:21 +0000]
Fix edit command

In many places of the edit command it was still hard-coded that the
board should have 8 ranks. (In particular for determining virginity.)

3 years agoFix double-digit move <-> text conversion
H.G.Muller [Thu, 7 Jan 2016 21:22:18 +0000]
Fix double-digit move <-> text conversion

The rank number can no longer be derived by subtracting '0' from
an input character when we have more than 10 ranks, and the file and
promotion suffix don't occur in a fixed place. So we have to use sscanf
and %d formats to convert the move. The ranks now also count from 0
on boards with 10 ranks.

3 years agoFix hint command for boards wider than 8 files
H.G.Muller [Thu, 7 Jan 2016 20:27:33 +0000]
Fix hint command for boards wider than 8 files

The file mask was still only looking at the 3 lowest bits.

3 years agoAccept game definitions with more than 8 ranks
H.G.Muller [Thu, 7 Jan 2016 20:24:52 +0000]
Accept game definitions with more than 8 ranks

3 years agoFix pushing bonus of Pawns beyond f-file
H.G.Muller [Thu, 7 Jan 2016 19:25:14 +0000]
Fix pushing bonus of Pawns beyond f-file

The test whether there were Pawns 2 squares left or right of the from-square,
to give a penalty for pushing if there were not, tested still like the
board was always 8 files wide, so that g- and h-Pawns would never see
a right neighbor even on wider boards. Now the file test is completely
omitted, assuming Pawns will never be on last rank, so that x-2 and x+2
will never exceed the bounds of b[], but will just map in the guard band,
where there should be no Pawns (as InitGame clears the entire b[] array).

3 years agoIncrease board-rank maximum from 8 to 16
H.G.Muller [Thu, 7 Jan 2016 19:10:20 +0000]
Increase board-rank maximum from 8 to 16

By increasing S from 128 to 256, and enlarging all board-size arrays
(b[], pt[], T[], map[]), it should now be possible to have square numbers
running up to 256, which is good enough for a board of 16 ranks.
The maximum width remains 16 minus the largest lateral jump.

3 years agoChange to-square encoding in hash
H.G.Muller [Thu, 7 Jan 2016 16:57:04 +0000]
Change to-square encoding in hash

Valid hash moves used to have the S-bit (1<<7) set, but this would not
work anymore when S is increased to 1<<8, as it would not fir in the byte.
Now the toSquare is stored after incrementing it, so that 0 is available
for encoding invalid moves. Adding S-1 back during the probe then restores
the S-bit for valid moves, and undoes the increment.

3 years agoUse int for square numbers everywhere
H.G.Muller [Thu, 7 Jan 2016 16:16:48 +0000]
Use int for square numbers everywhere

A lot of the variables used to hold square numbers were still signed char.
They are now all upgraded to int, except in the hash table, where they
are now explicitly specified as unsigned char, so that assigning them
to int won't give any problems for (as yet not occurring) square numbers
above 127. The only variables that are still signed int is those holding
piece codes.

3 years agoAdd Los-Alamos Chess
H.G.Muller [Thu, 7 Jan 2016 15:56:45 +0000]
Add Los-Alamos Chess

3 years agoFix text conversion of moves
H.G.Muller [Thu, 7 Jan 2016 15:55:52 +0000]
Fix text conversion of moves

Some printing and reading of moves did not yet take account of BH.

3 years agoFix promotion on board with other than 8 ranks
H.G.Muller [Tue, 5 Jan 2016 21:10:06 +0000]
Fix promotion on board with other than 8 ranks

The '1' bit in the pt[] board is now used to indicate the promotion rank.
The ranks where bonuses are awarded are now marked by 64 rather than 32,
so they can be ANDed with 2 times the piece code (in stead of with the
piece code, and multiplied by 2 afterwards) to pick out the virginity bit
and convert it to 64.

3 years agoMake boards with less than 8 ranks possible
H.G.Muller [Tue, 5 Jan 2016 20:37:44 +0000]
Make boards with less than 8 ranks possible

The board scan now wraps when x surpasses BE, the highest square calculated
when loading the game, and the off-board test for y also compares with
this. The setup routine now refers the location of white pieces relative
to 16*BH, and the center points use (BH-1)/2. as reference point instead
of the fixed 3.5.

3 years agoLet Pawn 6/7th-rank bonus come from table
H.G.Muller [Tue, 5 Jan 2016 19:50:47 +0000]
Let Pawn 6/7th-rank bonus come from table

Instead of being calculated on the fly as y+16&32 the bonus for
pushing a Pawn to 6th or 7th rank now comes from a board-size table pt[],
initialized to that value (0 or 32). This makes the Pawn-push bonus no
longer a show stopper for using boards with other than 8 ranks.

3 years agoLimit clearing of hash table after 'undo' to game history
H.G.Muller [Sat, 19 Dec 2015 15:49:59 +0000]
Limit clearing of hash table after 'undo' to game history

During analysis we would like to keep the hash table after taking back
a move, to be able to propagate the just obtained score backwards.
So now only the game-history entries (with draft 99) are cleared,
before the game (minus last move) is re-entered to setup the previous

3 years agoFix cleanup after search abort
H.G.Muller [Sat, 19 Dec 2015 15:39:10 +0000]
Fix cleanup after search abort

The PV pointer was not properly restored on a return of D() forced by
the abort flag. In addition the 'busy flag' in the current hash entry
now has to be cleared as well. (Even if the entry is not written yet
this is harmless, as no nodes are supposed to remain busy during the
search. Draw detection on game-history positions works even without busy
flag, through the old mechanism of being filled with an exact draw score.)

3 years agoImplement in-search repetition detection
H.G.Muller [Sat, 19 Dec 2015 15:32:53 +0000]
Implement in-search repetition detection

The '1' bit in the hash flags field is now used to indicate the node
is 'busy', by setting it during every hash store except for the final IID
iteration (which clears it). The hash probe checks the bit on a hash hit,
and when it is set returns from the node immediately with a draw score.
With 'first-floor exit' for playing a move the bit remains set.

3 years agoAssign other bits in hash flags for bound type
H.G.Muller [Sat, 19 Dec 2015 13:17:27 +0000]
Assign other bits in hash flags for bound type

The use of the 8 and S (=128) bit here was a legacy of micro-Max'
0x88 square numbering, that left these bits unused, so that the flags
could be merged in the from square (X) of the hash move. Fairy-Max stores
the hash flags in a separate field (F), so it can use any bits, and
using bits 4 and 2 is more convenient.

3 years agoSuppress input buffering
H.G.Muller [Sat, 19 Dec 2015 08:52:12 +0000]
Suppress input buffering

The stream input buffer for stdin hides input from the Input()
polling routine when multiple commands arrive at once, as happens
when XBoard sends an 'in/exclude all' command followed by individual
move excludes. Analysis was then resumed before seeing the later
commands, and processing of commands would be out of phase from that
point on. Without stream buffer analysis will always abort when there
are still commands waiting, as they have to wait in the stdin pipe.
 Strange enough line-mode buffering (_IOLBF) did not solve this.

3 years agoImplement move exclusion
H.G.Muller [Fri, 18 Dec 2015 20:24:14 +0000]
Implement move exclusion

The CECP include and exclude commands are implemented. They set a byte
in a map[] array corresponding to the move, and such moves are assigned
score -INF in the root of the search.
 No attention is payed to the promotion suffix, so all promotion choices
(including Seirawan gatings) will be excluded in unison.

3 years agoRead start time before analysis
H.G.Muller [Fri, 18 Dec 2015 19:43:15 +0000]
Read start time before analysis

Reading the start time is now also placed at the top of the command loop,
so that it is not only done when starting a think, but also on analysis.