1
/* ipuz-crossword.h
2
 *
3
 * Copyright 2022 Jonathan Blandford <jrb@gnome.org>
4
 *
5
 * This library is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU Lesser General Public
7
 * License as published by the Free Software Foundation; either
8
 * version 2.1 of the License, or (at your option) any later version.
9
 *
10
 * This library is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 * Lesser General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU Lesser General Public
16
 * License along with this library; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18
 *
19
 * SPDX-License-Identifier: (LGPL-2.1-or-later OR MIT)
20
 */
21

            
22
#pragma once
23

            
24
#include <glib-object.h>
25
#include <libipuz/ipuz-puzzle.h>
26
#include <libipuz/ipuz-board.h>
27
#include <libipuz/ipuz-charset.h>
28
#include <libipuz/ipuz-clue.h>
29
#include <libipuz/ipuz-guesses.h>
30
#include <libipuz/ipuz-symmetry.h>
31

            
32
G_BEGIN_DECLS
33

            
34

            
35
#define IPUZ_TYPE_CROSSWORD (ipuz_crossword_get_type ())
36
9305
G_DECLARE_DERIVABLE_TYPE    (IPuzCrossword, ipuz_crossword, IPUZ, CROSSWORD, IPuzPuzzle);
37

            
38

            
39
typedef void (*IPuzCrosswordForeachCellFunc) (IPuzCrossword *xword,
40
                                              IPuzCell      *cell,
41
                                              IPuzCellCoord  coord,
42
                                              gpointer       user_data);
43

            
44

            
45
/* Indication of where to physically place the clues on a playing
46
 * board compared to the grid */
47
typedef enum
48
{
49
  IPUZ_CLUE_PLACEMENT_NULL,   /* @ Auto place clues @ */
50
  IPUZ_CLUE_PLACEMENT_BEFORE, /* @ Put clues before the puzzle @ */
51
  IPUZ_CLUE_PLACEMENT_AFTER,  /* @ Put clues after the puzzle @ */
52
  IPUZ_CLUE_PLACEMENT_BLOCKS, /* @ Put clues in blocks adjacent to entry @ */
53
} IPuzCluePlacement;
54

            
55

            
56
typedef void (*IPuzCrosswordForeachClueFunc) (IPuzCrossword     *xword,
57
                                              IPuzClueDirection  direction,
58
                                              IPuzClue          *clue,
59
                                              IPuzClueId         clue_id,
60
                                              gpointer           user_data);
61

            
62
typedef struct _IPuzCrosswordClass IPuzCrosswordClass;
63
struct _IPuzCrosswordClass
64
{
65
  IPuzPuzzleClass parent_class;
66

            
67
  void     (*fix_symmetry)         (IPuzCrossword      *self,
68
                                    IPuzSymmetry        symmetry,
69
                                    GArray             *symmetry_coords);
70
  void     (*fix_numbering)        (IPuzCrossword      *self);
71
  void     (*fix_clues)            (IPuzCrossword      *self);
72
  void     (*fix_enumerations)     (IPuzCrossword      *self);
73
  void     (*fix_styles)           (IPuzCrossword      *self);
74
  void     (*fix_all)              (IPuzCrossword      *self,
75
                                    const gchar        *first_attribute_name,
76
                                    va_list             var_args);
77
  gboolean (*clue_continues_up)    (IPuzCrossword      *self,
78
                                    IPuzCellCoord       coord);
79
  gboolean (*clue_continues_down)  (IPuzCrossword      *self,
80
                                    IPuzCellCoord       coord);
81
  gboolean (*clue_continues_left)  (IPuzCrossword      *self,
82
                                    IPuzCellCoord       coord);
83
  gboolean (*clue_continues_right) (IPuzCrossword      *self,
84
                                    IPuzCellCoord       coord);
85
  void     (*mirror_cell)          (IPuzCrossword      *self,
86
                                    IPuzCellCoord       src_coord,
87
                                    IPuzCellCoord       dest_coord,
88
                                    IPuzSymmetry        symmetry,
89
                                    IPuzSymmetryOffset  symmetry_offset);
90
  gboolean (*check_mirror)         (IPuzCrossword      *self,
91
                                    IPuzCellCoord       src_coord,
92
                                    IPuzCellCoord       target_coord,
93
                                    IPuzSymmetry        symmetry,
94
                                    IPuzSymmetryOffset  symmetry_offset);
95
};
96

            
97

            
98
IPuzCrossword     *ipuz_crossword_new                    (void);
99
guint              ipuz_crossword_get_width              (IPuzCrossword                *self);
100
guint              ipuz_crossword_get_height             (IPuzCrossword                *self);
101
void               ipuz_crossword_set_size               (IPuzCrossword                *self,
102
                                                          gint                          width,
103
                                                          gint                          height);
104
IPuzBoard         *ipuz_crossword_get_board              (IPuzCrossword                *self);
105
gboolean           ipuz_crossword_set_guesses            (IPuzCrossword                *self,
106
                                                          IPuzGuesses                  *guesses);
107
IPuzGuesses       *ipuz_crossword_get_guesses            (IPuzCrossword                *self);
108
IPuzCell          *ipuz_crossword_get_cell               (IPuzCrossword                *self,
109
                                                          IPuzCellCoord                 coord);
110
void               ipuz_crossword_foreach_cell           (IPuzCrossword                *self,
111
                                                          IPuzCrosswordForeachCellFunc  func,
112
                                                          gpointer                      user_data);
113
IPuzCharset       *ipuz_crossword_get_solution_chars     (IPuzCrossword                *self);
114
IPuzSymmetry       ipuz_crossword_get_symmetry           (IPuzCrossword                *self);
115
IPuzCellCoord      ipuz_crossword_get_offset_coord       (IPuzCrossword                *self,
116
                                                          IPuzCellCoord                 coord,
117
                                                          IPuzSymmetry                  symmetry,
118
                                                          IPuzSymmetryOffset            offset_type);
119

            
120
/* Clue sets */
121
guint              ipuz_crossword_get_n_clue_sets        (IPuzCrossword                *self);
122
IPuzClueDirection  ipuz_crossword_clue_set_get_dir       (IPuzCrossword                *self,
123
                                                          guint                         index);
124
const gchar       *ipuz_crossword_clue_set_get_label     (IPuzCrossword                *self,
125
                                                          IPuzClueDirection             direction);
126

            
127
/* Clues */
128
GArray            *ipuz_crossword_get_clues              (IPuzCrossword                *self,
129
                                                          IPuzClueDirection             direction);
130
void               ipuz_crossword_foreach_clue           (IPuzCrossword                *self,
131
                                                          IPuzCrosswordForeachClueFunc  func,
132
                                                          gpointer                      data);
133
guint              ipuz_crossword_get_n_clues            (IPuzCrossword                *self,
134
                                                          IPuzClueDirection             direction);
135
IPuzClue          *ipuz_crossword_get_clue_by_id         (IPuzCrossword                *self,
136
                                                          IPuzClueId                    clue_id);
137
void               ipuz_crossword_unlink_clue            (IPuzCrossword                *self,
138
                                                          IPuzClue                     *clue);
139
IPuzClueId         ipuz_crossword_get_clue_id            (IPuzCrossword                *self,
140
                                                          const IPuzClue               *clue);
141
gchar             *ipuz_crossword_get_clue_string_by_id  (IPuzCrossword                *self,
142
                                                          IPuzClueId                    clue_id);
143
gchar             *ipuz_crossword_get_guess_string_by_id (IPuzCrossword                *self,
144
                                                          IPuzClueId                    clue_id);
145
gboolean           ipuz_crossword_clue_guessed           (IPuzCrossword                *self,
146
                                                          IPuzClue                     *clue,
147
                                                          gboolean                     *correct);
148
guint              ipuz_crossword_find_clue              (IPuzCrossword                *self,
149
                                                          IPuzClue                     *clue);
150
IPuzClue          *ipuz_crossword_find_clue_by_number    (IPuzCrossword                *self,
151
                                                          IPuzClueDirection             direction,
152
                                                          gint                          number);
153
IPuzClue          *ipuz_crossword_find_clue_by_label     (IPuzCrossword                *self,
154
                                                          IPuzClueDirection             direction,
155
                                                          const char                   *label);
156
IPuzClue          *ipuz_crossword_find_clue_by_coord     (IPuzCrossword                *self,
157
                                                          IPuzClueDirection             direction,
158
                                                          IPuzCellCoord                 coord);
159

            
160
/* Game state */
161
gboolean           ipuz_crossword_game_won               (IPuzCrossword                *self);
162

            
163
/* Correction API */
164
void               ipuz_crossword_fix_symmetry           (IPuzCrossword                *self,
165
                                                          IPuzSymmetry                  symmetry,
166
                                                          GArray                       *symmetry_coords);
167
void               ipuz_crossword_fix_numbering          (IPuzCrossword                *self);
168
void               ipuz_crossword_fix_clues              (IPuzCrossword                *self);
169
void               ipuz_crossword_fix_enumerations       (IPuzCrossword                *self);
170
void               ipuz_crossword_fix_styles             (IPuzCrossword                *self);
171
void               ipuz_crossword_fix_all                (IPuzCrossword                *self,
172
                                                          const char                   *first_attribute_name,
173
                                                          ...);
174
gboolean           ipuz_crossword_clue_continues_up      (IPuzCrossword                *self,
175
                                                          IPuzCellCoord                 coord);
176
gboolean           ipuz_crossword_clue_continues_down    (IPuzCrossword                *self,
177
                                                          IPuzCellCoord                 coord);
178
gboolean           ipuz_crossword_clue_continues_left    (IPuzCrossword                *self,
179
                                                          IPuzCellCoord                 coord);
180
gboolean           ipuz_crossword_clue_continues_right   (IPuzCrossword                *self,
181
                                                          IPuzCellCoord                 coord);
182
void               ipuz_crossword_mirror_cell            (IPuzCrossword                *self,
183
                                                          IPuzCellCoord                 src_coord,
184
                                                          IPuzCellCoord                 dest_coord,
185
                                                          IPuzSymmetry                  symmetry,
186
                                                          IPuzSymmetryOffset            symmetry_offset);
187
gboolean           ipuz_crossword_check_mirror           (IPuzCrossword                *self,
188
                                                          IPuzCellCoord                 src_coord,
189
                                                          IPuzCellCoord                 target_coord,
190
                                                          IPuzSymmetry                  symmetry,
191
                                                          IPuzSymmetryOffset            symmetry_offset);
192

            
193
/* Public functions */
194
void               ipuz_crossword_print                  (IPuzCrossword                *self);
195

            
196

            
197

            
198
G_END_DECLS