head	1.4;
access;
symbols
	v19:1.4
	v18:1.3
	v17:1.2
	v16:1.1
	v15:1.1;
locks; strict;
comment	@# @;


1.4
date	2002.05.06.05.44.50;	author sunshine;	state Exp;
branches;
next	1.3;

1.3
date	2002.02.19.10.34.36;	author sunshine;	state Exp;
branches;
next	1.2;

1.2
date	2002.01.29.19.11.01;	author sunshine;	state Exp;
branches;
next	1.1;

1.1
date	2001.12.24.19.30.19;	author sunshine;	state Exp;
branches;
next	;


desc
@@


1.4
log
@v19
-*- Updated user documentation to reflect the enhanced path finding
    capability.
@
text
@<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- Copyright (C)1997,2001,2002 by Eric Sunshine (sunshine@@sunshineco.com) -->
<!-- Copyright (C)1997 by Paul McCarthy (zarnuk@@high-speed-software.com)    -->
<!-- All rights reserved.                                                   -->
<html>
<head>
<title>SokoSave Help</title>
</head>
<body bgcolor="#ffffdd">

<table width="100%" cellspacing="0" cellpadding="0">
    <tr>
	<td><font size="+3"><b>SokoSave</b></font></td>
	<td align="right"><img src="images/SokoSave.png"></td>
    </tr>
</table>

<p>
<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#5544ff">
	<td>
	    <font color="#ffff00">
		&nbsp;&nbsp;<b>COPYRIGHT</b>
	    </font>
	</td>
    </tr>
</table>
</p>

<p>SokoSave is copyright &copy;1997,2001,2002 by
<a href="mailto:Eric Sunshine &lt;sunshine@@sunshineco.com&gt;"
>Eric Sunshine</a>.<br>
SokoSave is copyright &copy;1997 by
<a href="mailto:Paul McCarthy &lt;zarnuk@@high-speed-software.com&gt;"
>Paul McCarthy</a>.</p>

<p>SokoSave is freeware.  You may use and enjoy this program for free.  You may
make and distribute unmodified copies of this program for free provided that no
fee of any kind is collected.</p>

<p>The latest version of SokoSave can always be found at
<a href="http://www.high-speed-software.com/sokosave/"
>www.high-speed-software.com/sokosave</a>.
</p>

<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#5544ff">
	<td>
	    <font color="#ffff00">
		&nbsp;&nbsp;<b>THE GAME</b>
	    </font>
	</td>
    </tr>
</table>

<p>
<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#ccccff">
	<td>
	    &nbsp;&nbsp;<b>Starting a New Game</b>
	</td>
    </tr>
</table>
</p>

<p>You start a new game by selecting the <b>New...</b> item from the
<b>Game</b> menu.  This brings up a panel that lets you select the puzzle you
would like to play.</p>

<p>
<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#ccccff">
	<td>
	    &nbsp;&nbsp;<b>Objective</b>
	</td>
    </tr>
</table>
</p>

<p>The object of the game is to use the player to push all of the crates onto
the blue goal tiles.  The various elements in the game are illustrated
below.</p>

<table cellspacing="2">
<tr>
    <td><img src="images/SokoPlayer.png"></td>
    <td><img src="images/SokoPlayerHex.gif"></td>
    <td><img src="images/SokoPlayerTriN.gif"></td>
    <td>Player</td></tr>
<tr>
    <td><img src="images/SokoCrate.png"></td>
    <td><img src="images/SokoCrateHex.gif"></td>
    <td><img src="images/SokoCrateTriN.gif"></td>
    <td>Crate</td></tr>
<tr>
    <td><img src="images/SokoCrateSelected.png">
    <td><img src="images/SokoCrateSelectedHex.gif">
    <td><img src="images/SokoCrateSelectedTriN.gif">
    </td><td>Highlighted Crate</td></tr>
<tr>
    <td><img src="images/SokoEmpty.png"></td>
    <td><img src="images/SokoEmptyHex.gif"></td>
    <td><img src="images/SokoEmptyTriN.gif"></td>
    <td>Empty Tile</td></tr>
<tr>
    <td><img src="images/SokoEmptySafe.png">
    <td><img src="images/SokoEmptySafeHex.gif">
    <td><img src="images/SokoEmptySafeTriN.gif">
    </td><td>Empty Goal Tile</td></tr>
<tr>
    <td><img src="images/SokoWall.png"></td>
    <td><img src="images/SokoWallHex.gif"></td>
    <td><img src="images/SokoWallTriN.gif"></td>
    <td>Wall</td></tr>
</table>

<p>SokoSave supports the classic square-tiled Sokoban, hexagon-tiled Hexoban,
and triangular-tiled Trioban puzzles.</p>

<p>
<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#ccccff">
	<td>
	    &nbsp;&nbsp;<b>Moving Around</b>
	</td>
    </tr>
</table>
</p>

<p>For <em>square-tiled</em> games, the player can move up, down, left and
right.  The player can not move diagonally, though diagonal movement can be
simulated by moving horizontally and then vertically, or vice versa.  For
<em>hexagon-tiled</em> games, the player can move left, right, and digaonally.
For <em>triangle-tiled</em> games, the player can move left, right, diagonally,
and either up or down, depending upon the orientation of the traingular
tile.</p>

<p>The player can not move through walls.</p>

<p>There are several mechanisms for moving the player:</p>

<ul>
    <li><p><em>Point-and-Click.</em> Click on an empty tile with the primary
	mouse button.  If that tile can be reached by the player without
	pushing any crates or going through walls, then the player is moved
	there by the shortest path possible.</p></li>

    <li><p><em>Dragging Player.</em> Click on the player with the primary mouse
	button and then drag the player to the desired tile with the mouse
	button still pressed.  If the destination tile is reachable, the
	player will be moved there by the shortest path.  If the player is
	adjacent to a movable crate and is dragged in the direction of the
	crate, then the crate will be pushed along in front of the
	player.</p></li>

    <li><p><em>Movement Buttons.</em> Press the directional movement buttons at
	the bottom of the puzzle board.</p></li>

    <li><p><em>Arrow Keys.</em> Press the up, down, left, or right arrows on
	the keyboard.  The 1 through 9 keys on the numeric keypad may also be
	used.  For example, 4 will move the player to the left, and 9 will move
	the player up and right.</p></li>
</ul>

<p>
<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#ccccff">
	<td>
	    &nbsp;&nbsp;<b>Pushing Crates</b>
	</td>
    </tr>
</table>
</p>

<p>The player can only push one crate at a time.  If the player is next to a
crate and the tile on the far side of the crate is empty, then moving toward
the crate will push it along in front of the player.</p>

<p>For triangle-tiled puzzles, pushes are <em>weighted</em> to give the crate a
leftward or rightward motion.  The weighting is controlled by the overall
direction of player movement.  For example, if the overall direction of
movement of the player is horizontal, then the crate will be pushed in front of
the player along a horizontal path.  The same rule applies to diagonal
movement.</p>

<p>There are several mechanisms for pushing crates:</p>

<ul>
    <li><p><em>Point-and-Click.</em> This is perhaps the most useful form of
	automated movement.  Click on a crate with the primary mouse button and
	then release the button.  The crate becomes highlighted.  Next, click
	on the tile to which the crate should be moved.  The player will
	automatically push the crate to the destination tile by the shortest
	path possible, provided that the following three conditions are met.
	First, the player must be able to reach the crate in order to push it.
	Second, at least one path must exist from the crate's current location
	to the destination location.  Third, it must be possible for the player
	to push the crate to every intermediate position along a path.</p>

	<p>If you highlight a crate and then decide not to move that crate, you
	can unhighlight it using one of the following methods: click on the
	same crate a second time; click on a different crate; click on a wall;
	click on an unreachable empty tile; move the player; or press the
	<em>Escape</em> key on the keyboard.</p></li>

    <li><p><em>Dragging Crate.</em> Click on a crate with the primary mouse
	button and then drag the crate to the desired tile with the mouse
	button still pressed.  Moving a crate in this fashion is only allowed
	when three conditions are met.  First, the player must be able to reach
	the crate in order to push it.  Second, at least one path must exist
	from the crate's current location to the destination location.  Third,
	it must be possible for the player to push the crate to every
	intermediate position along a path.  If these conditions are met, then
	the player automatically pushes the crate to the destination tile by
	the shortest path possible.</p></li>

    <li><p><em>Dragging Player.</em> When dragging the player, if the player is
	adjacent to a crate, the crate will be pushed in the direction of
	player movement.</p></li>

    <li><p><em>Quick Push.</em> The secondary mouse button can be used to
	quickly push crates long distances in a straight line.  To use this
	mechanism, line up the player behind the crate and click with the
	secondary mouse button on the tile where you want the crate to end
	up.  If there are no obstacles in the way, the player will push the
	crate to the destination.  If the mouse has only a single button, this
	type of movement can instead be triggered by holding down a modifier
	key, such as <em>Shift</em>, <em>Control</em>, or <em>Alternate</em>
	when pressing the mouse's button.</p></li>

    <li><p><em>Movement Buttons.</em> When the player is adjacent to a crate,
	activating the appropriate directional movement button at the bottom of
	the puzzle board will cause the crate to be pushed along in front of
	the player as the player moves in that direction.</p></li>

    <li><p><em>Arrow Keys.</em> When the player is adjacent to a crate,
	pressing the appropriate arrow on the keyboard will cause the crate to
	be pushed as the player moves in that direction.  The 1 through 9 keys
	on the numeric keypad may also be used.</p></li>
</ul>

<p>
<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#ccccff">
	<td>
	    &nbsp;&nbsp;<b>Undo, Redo, and Playback</b>
	</td>
    </tr>
</table>
</p>

<p>SokoSave provides unlimited undo and redo capabilities.  If you make a
mistake, you can back up as many moves as you like by pressing the <em>Undo
Move</em> button at the bottom of the board.  If you take back too many moves,
you can use the <em>Redo Move</em> button to "undo the undo".  Redo is
available until you make a move which differs from the sequence of moves that
was undone.</p>

<table>
<tr>
    <td><img src="images/SokoArrowLeft.gif"></td>
    <td>Undo Move</td></tr>
<tr>
    <td><img src="images/SokoArrowRight.gif"></td>
    <td>Redo Move</td></tr>
</table>

<p>SokoSave also features smart undo and redo for pushes.  Rather than applying
to only a single move, the <em>Undo Push</em> and <em>Redo Push</em> buttons
undo and redo an entire series of logically related actions.  When <em>Undo
Push</em> is used, if the last action was a push, then that push is undone
along with all other pushes in the same direction.  If the last action was a
move, then that move is undone along with all other moves until a push is
reached.  <em>Redo Push</em> works in a complementary fashion.</p>

<table>
<tr>
    <td><img src="images/SokoArrowLeftLeft.gif"></td>
    <td>Undo Push</td></tr>
<tr>
    <td><img src="images/SokoArrowRightRight.gif"></td>
    <td>Redo Push</td></tr>
</table>

<p>You can also use the playback slider to back up to any point in the game.
If the <em>Animate</em> switch is checked, then the moves and pushes are
animated during replay.  If this switch is not checked, then the game returns
instantaneously to the selected point of play without any animation.  If an
animated playback becomes too lengthy, you can abort the playback by pressing
the <em>Stop</em> button; by pressing the <em>Escape</em> key on the keyboard;
by clicking in the puzzle area with the mouse; or by switching to a different
window.</p>

<p>SokoSave's undo and redo mechanisms are intelligent.  If you make moves
which SokoSave considers to be opposite of your most recent moves, then undo or
redo actions are invoked automatically on your behalf.  For instance, if you
move the player left three times and up once without pushing a crate, and then
immediately move down once and right three times, SokoSave sees this as four
moves followed by four undo actions.</p>

<p>
<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#ccccff">
	<td>
	    &nbsp;&nbsp;<b>Scoring</b>
	</td>
    </tr>
</table>
</p>

<p>SokoSave computes several scores as you play.</p>

<ul>
    <li><p><em>Moves.</em> Number of player moves.</p></li>
    <li><p><em>Pushes.</em> Number of crate moves.</p></li>
    <li><p><em>Runs.</em> Number of straight lines in which crates have been
	pushed.  Looked at another way, this is the number of times crates
	have changed direction while being pushed.</p></li>
    <li><p><em>Focus.</em> Number of times the player's attention has shifted
	between crates.  A high focus count typically indicates a puzzle with a
	complex solution that requires repeated shuffling of crates.</p></li>
</ul>

<p>Puzzle maniacs should try to find solutions with the minimum number of
moves, pushes, runs, or focus changes.  These are different goals.  For
example, sometimes you can reduce the number of moves at the cost of added
pushes and vice versa.  As an illustration of these potentially conflicting
goals, consider the following puzzle.</p>

<img src="images/SokoExample1.gif">

<p>As illustrated below, one can minimize the number of pushes (represented by
the dark line), but at the expense of the number of moves (represented by the
light line).  In this case, getting the crate to the goal required only 6
pushes, but 28 moves.</p>

<img src="images/SokoExample2.gif">

<p>Conversely, minimizing the number of moves often results in a greater number
of pushes, as illustrated below.  In this instance, getting the crate to the
goal required 14 pushes (8 more than the previous example), but only 18 moves
(10 fewer than the previous example).</p>

<img src="images/SokoExample3.gif">

<p>The effect of the automated movement mechanisms on scoring may impact your
choice of which mechanisms to employ or in what manner to employ them.</p>

<p>When the player is moved via either dragging or point-and-click, the
computer always chooses the path to the destination tile which requires the
fewest number of moves.</p>

<p>When the secondary mouse button is used to push a crate in a straight line,
both the number of moves and the number of pushes needed to reach the
destination tile are minimized.</p>

<p>When a crate is moved via either dragging or point-and-click, the chosen
path minimizes the number of pushes required to deposit the crate at the
destination tile.  As a secondary objective, the chosen path also minimizes the
overall number of moves needed to satisfy the primary objective of minimizing
the number of pushes.  If your goal is to minimize the overall number of moves
in a game, then use caution when employing automated crate movement, since
minimizing moves is only a secondary goal of this mechanism.</p>

<p>
<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#ccccff">
	<td>
	    &nbsp;&nbsp;<b>Saving and Restoring Games</b>
	</td>
    </tr>
</table>
</p>

<p>You can save your current position by selecting the <b>Save</b> or <b>Save
As...</b> item from the <b>Game</b> menu.  <b>Save</b> uses the current
save-file-name associated with the board.  This name is displayed in the
window's title bar.  Each time you use <b>Save</b> it replaces the last saved
position with the current position.  Using <b>Save As...</b> lets you
specify a different name for the saved game, thus allowing you to keep any
number of different positions per puzzle.  To restore a saved game, use the
<b>Open...</b> item from the <b>Game</b> menu.</p>

<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#5544ff">
	<td>
	    <font color="#ffff00">
		&nbsp;&nbsp;<b>CONCLUSION</b>
	    </font>
	</td>
    </tr>
</table>

<p>
<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#ccccff">
	<td>
	    &nbsp;&nbsp;<b>Credits</b>
	</td>
    </tr>
</table>
</p>

<p><a href="mailto:Paul McCarthy &lt;zarnuk@@high-speed-software.com&gt;">Paul
McCarthy</a> wrote the original version of SokoSave for NextStep.</p>

<p><a href="mailto:Eric Sunshine &lt;sunshine@@sunshineco.com&gt;">Eric
Sunshine</a> added many new features, including several powerful automated
movement mechanisms for ease of game play; added support for hexagonal
<a href="http://users.bentonrea.com/~sasquatch/sokoban/hex.html">Hexoban</a>
puzzles and triangular Trioban puzzles; generalized the core SokoSave game
logic and extracted it into a portable and reusable library; and ported
SokoSave to Microsoft Windows using C++Builder, and to MacOS/X, MacOS/X Server
1.0 (Rhapsody/YellowBox) for Mach and Windows, and OpenStep for Mach and
Windows.</p>

<p>Classic puzzles 1 through 50 were published by Hiroyuki Imabayashi when he
invented Sokoban in 1982.  Joseph L. Traub collected another 40 levels for
XSokoban.</p>

<p><a href="http://users.bentonrea.com/~sasquatch/sokoban/">David W.
Skinner</a> invented the hexagonal-style
<a href="http://users.bentonrea.com/~sasquatch/sokoban/hex.html">Hexoban</a>
puzzle layout, created the "dws" Hexoban puzzles, and the "dwstri" Trioban
puzzles.
<a href="http://trioban.online.fr/">Fran&ccedil;ois Marques</a> invented the
triangular-style Trioban puzzle layout, created the Hexoban-style Heloban and
Heroban puzzle sets, and the Trioban-style Tryoban puzzle set.
<a href="http://www.multimania.com/nabokos/">Aymeric Du Peloux</a> created the
<a href="http://www.multimania.com/nabokos/hexocet.html">Hexocet</a> Hexoban
puzzle collection, as well as the "adptri" Trioban puzzles.
<a href="http://www.riviere.ws/r/kriviere.html">J. Kenneth Riviere</a> created
the "jkr" Hexoban puzzles.
<a href="http://www.clickfest88.freeserve.co.uk/">David Holland</a> created the
"dh" Hexoban puzzles.
<a href="http://www.sokomind.de/">Gerald Holler</a> created the "gh" Hexoban
puzzle.</p>

<p>
<table width="100%" border="0" cellspacing="0" cellpadding="2">
    <tr bgcolor="#ccccff">
	<td>
	    &nbsp;&nbsp;<b>Feedback</b>
	</td>
    </tr>
</table>
</p>

<p>When sending feedback to the authors, please mention the SokoSave
<em>release</em> and <em>build</em> numbers, as well as the operating system
<em>type</em> and <em>version</em> information with your correspondence.</p>

<p><em>Send comments to:</em><br>
Eric Sunshine
&lt;<a href="mailto:Eric Sunshine &lt;sunshine@@sunshineco.com&gt;"
>sunshine@@sunshineco.com</a>&gt;<br>
Paul McCarthy
&lt;<a href="mailto:Paul McCarthy &lt;zarnuk@@high-speed-software.com&gt;"
>zarnuk@@high-speed-software.com</a>&gt;<br>
</p>
</body>
</html>
@


1.3
log
@v18
-*- Added support for new triangular-style Trioban puzzles.
@
text
@d117 2
a118 2
<p>SokoSave supports the classic square-tiled Sokoban puzzles, as well as the
newer hexagon-tiled Hexoban and triangular-tiled Trioban puzzles.</p>
d157 1
a157 1
	the bottom of the board.</p></li>
d160 1
a160 1
	the keyboard.  The 1 through 9 keys on the numeric keypad can also be
d176 2
a177 2
crate and an empty tile is on the far side of the crate, then moving toward the
crate will push it along in front of the player.</p>
d198 1
a198 3
	to push the crate to every intermediate position along a path.  When
	choosing the shortest path, the computer will not consider any path
	which requires the crate to visit the same tile twice.</p>
d215 1
a215 3
	the shortest path possible, with the proviso that the computer will not
	consider any path which requires the crate to visit the same tile
	twice.</p></li>
d233 2
a234 2
	the board will cause the crate to be pushed as the player moves in that
	direction.</p></li>
d239 1
a239 1
	on the numeric keypad can also be used.</p></li>
d294 6
a299 8
<p>SokoSave's undo and redo mechanisms are intelligent.  If you make a move
which SokoSave considers to be opposite of your most recent move, then an undo
or redo action is invoked automatically on your behalf.  For instance, if you
move the player left without pushing a crate, and then immediately move to the
right, SokoSave sees this as a move left followed by an undo.  The benefit of
this behavior is that it may improve your score since movement left followed by
movement right would typically increase the overall count of moves by two, for
example, whereas movement left followed by an undo costs nothing.</p>
d342 1
a342 1
(10 less than the previous example).</p>
d359 5
a363 7
destination tile.  The chosen path never involves pushing the crate to the
same tile multiple times.  As a secondary objective, the chosen path also
minimizes the overall number of moves needed to satisfy the primary objective
of minimizing the number of pushes.  If your goal is to minimize the overall
number of moves in a game, then use caution when employing automated crate
movement, since minimizing moves is only a secondary goal of this
mechanism.</p>
@


1.2
log
@v17
-*- Added support for the new hexagonal-style puzzles.

-*- No longer fills areas outside the puzzle with wall segments.  Doing so
    causes some "artistic" effect to be lost from some puzzles.  Added
    SokoCellType SOKO_CELL_NULL to support of this.

-*- Flattened the wall segment graphic.  Its previous extreme 3D effect
    tended to overwhelm the puzzle board.

-*- Extended keyboard movement support.  Numeric keypad can now be used,
    as well as standard arrow keys.  Added key equivalents for hexagonal
    puzzles.

-*- Augmented the behavior of the "Animate" switch so that it now controls
    all animation, rather than only controlling animation of lengthy
    playback sessions, which was the case previously.

-*- SokoPuzzle now calculates two new scores in addition to "moves" and
    "pushes".  The "runs" score is the number of straight lines in which
    crates have been pushed.  Looked at another way, it is the number of
    turns crates have made while being pushed.  The "focus" score is the
    number of times the player's focus has changed from one crate to
    another.

-*- Upgraded the documentation to explain hexagonal support and to explain
    that numeric keypad can now be used for movement.

-*- Added discussion of new score metrics to help file.

-*- Did more fine-tuning of the gamma of the help file images.

-*- Updated the movement example images in help to reflect new appearance
    of tiles and game board.
@
text
@d84 1
a84 1
<table>
d88 1
d93 1
d98 1
d103 1
d108 1
d113 1
d118 1
a118 2
newer hexagon-tiled puzzles.  The tiles in the first column are used for square
games.  Those in the second column are used for the hexagonal games.</p>
d130 7
a136 3
<p>For square-tiled games, the player can move up, down, left or right.  The
player can not move diagonally, though diagonal movement can be simulated by
moving horizontally and then vertically, or vice versa.</p>
a137 3
<p>For hexagon-tiled games, the player can move up-and-left, up-and-right,
left, right, down-and-left, or down-and-right.<p>

d176 2
a177 2
crate and an empty tile is on the far side of the crate, then moving towards
the crate will push it along in front of the player.</p>
d179 7
d221 3
a223 3
    <li><p><em>Dragging Player.</em> When dragging the player, as described
	above, if the player is adjacent to a crate, the crate will be pushed
	in the direction of player movement.</p></li>
d417 7
a423 5
movement mechanisms for ease of game play; added support for hexagonal puzzles;
generalized the core SokoSave game logic and extracted it into a portable and
reusable library; and ported SokoSave to Microsoft Windows using C++Builder,
and to MacOS/X, MacOS/X Server 1.0 (Rhapsody/YellowBox) for Mach and Windows,
and OpenStep for Mach and Windows.</p>
d430 7
a436 2
Skinner</a> invented the hexagonal-style <em>Hexoban</em> puzzle layout and
created the "dws" Hexoban puzzles.
d438 2
a439 1
"adp" Hexoban puzzles.
d442 2
a443 2
<a href="http://www.clickfest88.freeserve.co.uk/">David Holland</a> created
the "dh" Hexoban puzzles.
@


1.1
log
@v15
-*- Converted the documentation from RTFD format to HTML format.
    Documentation is no longer embedded in a scrollable text object on the
    Info panel.  Instead, a "Help" menu item now displays the help file
    via a web browser.
@
text
@d2 3
a4 3
<!-- Copyright (C)1997,2001 by Eric Sunshine (sunshine@@sunshineco.com).   -->
<!-- Copyright (C)1997 by Paul McCarthy (zarnuk@@high-speed-software.com). -->
<!-- All rights reserved.                                                 -->
d30 1
a30 1
<p>SokoSave is copyright &copy;1997,2001 by
d81 1
a81 1
the blue goal squares.  The various elements in the game are illustrated
d87 1
d91 1
d95 1
d99 2
a100 1
    <td>Empty Square</td></tr>
d103 2
a104 1
    </td><td>Empty Goal Square</td></tr>
d107 1
d111 4
d125 3
a127 3
<p>The player can move up, down, left or right.  The player can not move
diagonally, though diagonal movement can be simulated by moving horizontally
and then vertically, or vice versa.  The player can not move through walls.</p>
d129 5
d137 2
a138 2
    <li><p><em>Point-and-Click.</em> Click on an empty square with the primary
	mouse button.  If that square can be reached by the player without
d143 2
a144 2
	button and then drag the player to the desired square with the mouse
	button still pressed.  If the destination square is reachable, the
d154 3
a156 1
	the keyboard.</p></li>
d170 1
a170 1
crate and an empty square is on the far side of the crate, then moving towards
d179 2
a180 2
	on the square to which the crate should be moved.  The player will
	automatically push the crate to the destination square by the shortest
d187 1
a187 1
	which requires the crate to visit the same square twice.</p>
d192 1
a192 1
	click on an unreachable empty square; move the player; or press the
d196 1
a196 1
	button and then drag the crate to the desired square with the mouse
d203 1
a203 1
	the player automatically pushes the crate to the destination square by
d205 1
a205 1
	consider any path which requires the crate to visit the same square
d215 1
a215 1
	secondary mouse button on the square where you want the crate to end
d229 2
a230 1
	be pushed as the player moves in that direction.</p></li>
d261 5
a265 5
undo and redo an entire series of actions.  When <em>Undo Push</em> is used, if
the last action was a push, then that push is undone along with all other
pushes in the same direction.  If the last action was a move, then that move is
undone along with all other moves until a push is reached.  <em>Redo Push</em>
works in a complementary fashion.</p>
d290 3
a292 3
this behavior is that it may improve your score since, for example, movement
left followed by movement right would typically increase the overall count of
moves by two, whereas movement left followed by an undo costs nothing.</p>
d304 13
d318 4
a321 3
pushes or moves.  These are different goals.  Sometimes you can reduce the
number of moves at the cost of added pushes and vice versa.  As an example of
these potentially conflicting goals, consider the following puzzle.</p>
d323 1
a323 1
<img src="images/SokoExample1.png">
d330 1
a330 1
<img src="images/SokoExample2.png">
d337 1
a337 1
<img src="images/SokoExample3.png">
d343 1
a343 1
computer always chooses the path to the destination square which requires the
d348 1
a348 1
destination square are minimized.</p>
d352 2
a353 2
destination square.  The chosen path never involves pushing the crate to the
same square multiple times.  As a secondary objective, the chosen path also
d355 1
a355 1
of minimizing the number of pushes.  If your goal is to minimize the total
d376 2
a377 2
number of different positions per puzzle.  In order to restore a saved game,
use the <b>Open...</b> item from the <b>Game</b> menu.</p>
d403 22
a424 6
Sunshine</a> added a number of new features, including several powerful
automated movement mechanisms for ease of game play; generalized the core
SokoSave game logic and extracted it into a portable and reusable library; and
ported SokoSave to Microsoft Windows using C++Builder, and to MacOS/X, MacOS/X
Server 1.0 (Rhapsody/YellowBox) for Mach and Windows, and OpenStep for Mach and
Windows.</p>
@
