Revert "draw init locks yellow if partially solved"
[intricacy.git] / README
blob64f1dfbe83df3ffd00801ab0e70e53382d7881c1
1 Intricacy
2 =========
3 A game of competitive puzzle-design.
5 http://mbays.freeshell.org/intricacy/
8 Playing
9 =======
10 Press 'T' on the starting screen to play the tutorials, which should lead you
11 to discover the main game mechanics. When you've finished or had enough of the
12 tutorials, select a codename with 'C' and register it with 'R'. The rest you
13 can hopefully figure out, but see below if you'd rather read about it.
16 Configuration
17 =============
18 You can change keybindings in SDL mode by right-clicking on the corresponding
19 button and pressing a key.
21 The buttons in the top right when solving/editing locks in SDL mode are as
22 follows:
23     * The three hexes toggles between two modes for colouring pieces; in one
24         mode (three yellow hexes), the colours are determined by the nature of
25         the pieces; in the other mode, adjacent pieces always get different
26         colours.
27     * The lone hex with optional arrow toggles "blockage annotations". These
28         are there to help you figure out what's going on when you can't
29         understand why a piece refuses to move. An orange arrow indicates a
30         blocked force, a purple arrow indicates a force which blocked another
31         force.
32     * The soundwave icon toggles sound.
33     * The narrow hex enscribed within a wide hex toggles between fullscreen
34         and windowed mode. The resolution used when switching to fullscreen 
35         is that of the window prior to fullscreening.
37 Config files are saved in ~/.intricacy/ on unixoids, or something like
38 "...\Application Data\intricacy\" on windows. In particular, the locks you
39 create in the lock editor are saved in there (and you can organise them into
40 directories by including (back)slashs in the lock name). You can edit them in
41 a text editor if you want - see AsciiLock.hs for what the characters mean.
44 Rough description of the game mechanics
45 =======================================
46 * Locks consist of blocks, pivots and balls. Blocks can be connected to other
47     blocks by springs. Pivots have arms. When picking a lock, you control two
48     tools - a hook, which acts as a mobile one-armed pivot, and a wrench,
49     which acts as a mobile block with momentum.
50 * To open a lock, the "bolthole" (the area in the top-right) must be empty.
51 * Each turn, the tools push and rotate according to the player's commands, and
52     then each spring which is compressed or extended beyond its natural length
53     pushes/pulls on the block at its end.
54 * If two forces try to move a piece in two different directions, or try to
55     move two pieces into the same hex, one or both is blocked.
56 * If a pivot/hook is trying to turn and there's a piece in the way of one of
57     its arms, it will at first try to push the piece away - but if that force
58     is blocked, it will try instead to pull the piece round with the arm as it
59     turns.
60 * If two springs are trying to push two blocks into the same hex, they will
61     generally both be blocked. However, if one of the forces is also pushing
62     against a fixed piece such as a tool, it won't block the other force.
65 Full details of the metagame mechanics
66 ======================================
67 (Where by the 'game' I mean the lock-picking bit, and by the 'metagame' I mean
68 the bit with the 3-letter codenames and the three lock slots and notes and so
69 on.)
71 A player accesses a lock slot when one of the following holds
72     (i) the player has read three notes on the lock in the slot;
73     (ii) the player has solved the lock in the slot, and declared the solution;
74     (iii) there's no lock in the slot, and the player has accessed all the slots
75         which do have locks in them.
77 Scoring is always relative - each player has a score relative to each other
78 player. That score is the number of the second player's lock slots to which
79 the first player has access, minus the number of the first player's lock slots
80 to which the second player has access; but a point is not awarded for
81 case (ii) if the owner of the lock has read the note.
83 A player reads every note in every lock the player accesses. When a lock is
84 replaced ('retired'), each note secured by the lock becomes 'public', and is
85 read by every player.
87 Note this means that once three notes on a lock become public, every player
88 accesses the lock. The lock is then 'public' (and its owner should replace
89 it!).
91 To declare a solution, you must secure a note on it behind a non-public lock
92 in one of your three lock slots. Once the note is placed, it can't be moved.
95 Full details of the game mechanics
96 ==================================
97 Springs are directed; one of the blocks it is connected to is the 'root', the
98 other the 'end'. A block is stationary if it is not the end of any spring. The
99 directed graph whose nodes are the blocks and whose edges are the springs is
100 required to be acyclic. A spring may also be rooted in a pivot.
102 I will now attempt to describe in full excruciating detail the game physics,
103 i.e. the algorithm used to determine what happens on a turn. You shouldn't
104 need to read this to play the game! Experimenting and turning on blockage
105 annotations should be enough.
107 The following description corresponds to the code in Physics.hs. The algorithm
108 is the result of an extended process of experiment and iterated
109 simplification; see notes/game in the source distribution if you're perverse
110 enough to want to read a scattered stream-of-consciousness account of the
111 process.
113 Each turn is separated into two phases. In the first phase, the forces arising
114 from the player's move are 'resolved', possibly resulting in some movement. In
115 the second phase, forces arising from stretched or compressed springs are
116 resolved, possibly resulting in some movement.
118 Here we abuse physics terminology, and use the term 'force' to refer to either
119 a directional force in the usual sense, which we call a 'push', or a
120 rotational force, which we call a 'torque'. A force is always on a piece, in
121 some direction. Only the obvious six hex directions and the two obvious
122 rotational directions occur; the magnitude is always 1. 
124 Player moves result in forces on the tools in the obvious way. A wrench which
125 is moving gets a push in that direction each turn (sorry, Newton!). A spring
126 which is not at its relaxed length results in a push on the end piece.
128 To _resolve_ these initial forces:
129     * each initial force is 'propagated to a force group'
130     * if a group is 'inconsistent' with another group: if one of the group is
131         'dominated' by the other, it is 'blocked'; else both are blocked
132     * each force in each unblocked force group is 'applied'
134 To _apply_ a push: move the piece in the given direction.
135 To _apply_ a torque: rotate the piece in the given direction.
137 To _propagate_ a force:
138     * If applying the force would result in an overlap with another piece,
139         push that piece - but if it's an arm, twist the pivot instead when
140         that makes sense.
141     * If the force is a torque and an arm is pushing on another piece, we have
142         a special rule: if the obvious push ends up propagating to a resisted
143         force (see below), then it is replaced with a 'clawing' push. e.g. in
144         the following situation:
145             \ O #
146              o
147         if the pivot is twisted clockwise, the ball will first be pushed east,
148         but when that force propagates to a push on the stationary block to
149         its east which is resisted, processing will back up and a push on the
150         ball southeast will be tried instead.
151     * A spring connecting two blocks transmits a push on one block to the
152         other unless the direction is such that the push is tending to
153         compress/extend the spring and the spring isn't already fully
154         compressed/extended.
156 A force is _resisted_ if it is a push on a pivot or on a block which isn't the
157     end of a spring, or it's a torque on a block, or it's a force on a hook
158     which isn't already getting that force this phase as the result of a
159     player move, or it's a force on a wrench which isn't a push in the
160     direction it's already moving.
162 To _propagate an initial force to a force group_:
163     * Propagate the force as above, then recursively propagate the resulting
164         forces, checking for resistance as we go. The force group consists of
165         all the resulting propagated forces.
166     * On resistance: back up to try clawing as described above if appropriate,
167         else consider the whole force group resisted - so the resulting force
168         group is empty.
170 Two forces are _inconsistent_ when
171     * they act on the same piece in different directions, or
172     * applying both at once results in overlapping pieces.
174 Two force groups are _inconsistent_ iff there is some force from the first
175     which is inconsistent with some force from the second.
177 A force group _dominates_ another iff their initial forces are spring forces,
178     and the root of the first spring is an ancestor of the root of the second
179     spring, where an ancestor of a block B is recursively defined to be a block
180     which is the root of a spring which ends at B, or an ancestor of such a
181     block.
183 -- mbays@sdf.org 2013