1 /*
2  * sact.h: SACT
3  *
4  * Copyright (C) 1997-1998 Masaki Chikama (Wren) <chikama@kasumi.ipl.mech.nagoya-u.ac.jp>
5  *               1998-                           <masaki-c@is.aist-nara.ac.jp>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21 */
22 /* $Id: sact.h,v 1.3 2003/07/14 16:22:51 chikama Exp $ */
23 
24 #ifndef __SACT_H__
25 #define __SACT_H__
26 
27 #include "config.h"
28 
29 #include <glib.h>
30 #include "portab.h"
31 #include "graphics.h"
32 #include "surface.h"
33 #include "sacttimer.h"
34 #include "variable.h"
35 
36 
37 // ���ץ饤�Ȥκ����
38 #define SPRITEMAX 21845
39 
40 // CG�κ����
41 #define CGMAX 63336
42 
43 // ��å������κ���Ĺ��
44 #define MSGBUFMAX 257*10
45 
46 // �����κ������ǿ�
47 #define SEL_ELEMENT_MAX 20
48 
49 
50 // �����������Ȥμ���
51 #define KEYWAIT_NONE 0
52 #define KEYWAIT_SIMPLE 1
53 #define KEYWAIT_SPRITE 2
54 #define KEYWAIT_MESSAGE 3
55 #define KEYWAIT_SELECT 4
56 #define KEYWAIT_BACKLOG 5
57 
58 // ʸ�����ִ���
59 typedef struct {
60 	char *src; // �֤�������ʸ����
61 	char *dst; // �֤�����ʸ����
62 } strexchange_t;
63 
64 // SACTEFAM ��Ȥä��ޥ���
65 typedef struct {
66 	int fd;       // SACTEFAM.KLD �Υե�����ǥ������ץ꥿
67 	char *mapadr; // mmap ���줿�ǽ�Υ��ɥ쥹
68 	off_t size;   // mmap �����礭��
69 	int datanum;  // SACTEFAM.KLD ��Υޥ����ե�����ο�
70 	int *no;      // ���ʥꥪ¦�Ǥ��ֹ�
71 	int *offset;  // �ǡ����ؤΥ��ե��å�
72 } SACTEFAM_t;
73 
74 
75 // CG_XX �Ǻ��CG�μ���
76 enum cgtype {
77 	CG_NOTUSED = 0,
78 	CG_LINKED  = 1,
79 	CG_SET     = 2,
80 	CG_REVERSE = 3,
81 	CG_STRETCH = 4
82 };
83 
84 // cg�˴ؤ������
85 struct _cginfo {
86 	enum cgtype type;  // CG�μ���, 0: ̤����, 1:�������Ƥ���, ...
87 	int no;            // CG���ֹ�
88 	surface_t *sf;     // CG����
89 	int refcnt;        // ���ȥ����������ˤʤä��鳫�����Ƥ�褤��
90 };
91 typedef struct _cginfo cginfo_t;
92 
93 // ���ץ饤�ȤΥ�����
94 enum spritetype {
95 	SPRITE_NORMAL = 0,
96 	SPRITE_SWITCH = 1,
97 	SPRITE_GETA   = 2,
98 	SPRITE_GETB   = 3,
99 	SPRITE_PUT    = 4,
100 	SPRITE_ANIME  = 5,
101 	SPRITE_SWPUT  = 6,
102 	SPRITE_MSG    =100,
103 	SPRITE_WP,
104 	SPRITE_NONE   =-1
105 };
106 
107 // (����������)
108 struct _sprite;
109 
110 // ���ץ饤�Ȥ˴ؤ���Ƽ����
111 struct _sprite {
112 	// ���ץ饤�ȤΥ�����
113 	enum spritetype type;
114 
115 	// ���ץ饤���ֹ�
116 	int no;
117 
118 	// ���줾��ξ��֤λ����Ĥ餹��������ֹ�
119 	int numsound1, numsound2, numsound3;
120 
121 	// ��� sprite ���礭��(cg1���礭��)
122 	MyDimension cursize;
123 
124 	// ���줾��ξ��֤�ɽ������ CG
125 	cginfo_t *cg1, *cg2, *cg3;
126 
127 	// update ����Ȥ���ɽ������cg
128 	cginfo_t *curcg;
129 
130 	// ���ץ饤�Ȥ�ɽ�����뤫
131 	boolean show;
132 	boolean show_save; // Zkey hide save��
133 
134 	// ɽ������ݤΥ֥���Ψ 0:���������ʤ�, 255: �̾�ɽ��
135 	int blendrate;
136 
137 	// ���ץ饤�Ȥ� Freeze ����Ƥ��뤫(0:No 1-3: �����ֹ�)
138 	int freezed_state;
139 
140 	// ɽ������ (SetPos)
141 	MyPoint loc;
142 
143 	// ���ߤΥ��ץ饤�Ȥ�ɽ������
144 	MyPoint cur;
145 
146 	// event callback
147 	int (* eventcb)(struct _sprite *sp, agsevent_t *e);  // for key/mouse
148 	int (* teventcb)(struct _sprite *sp, agsevent_t *e); // for timer
149         // sprite������� callback
150 	void (* remove)(struct _sprite *sp);
151 	// sprite������褹��Ȥ��� callback
152 	int  (* update)(struct _sprite *sp);
153 
154 	boolean focused; // forcus�����Ƥ��뤫
155 	boolean pressed; // ����sprite��ǥޥ�����������Ƥ��뤫
156 
157 	GSList *expsp; // �������ץ饤�ȤΥꥹ��
158 
159 	// move command �ѥѥ�᡼��
160 	struct {
161 		MyPoint to;     // ��ư��
162 		int time;       // ��ư��λ����
163 		int speed;      // ��ư®��
164 		int starttime;  // ��ư���ϻ���
165 		int endtime;    // ��ư��λͽ�����
166 		boolean moving; // ��ư�椫�ɤ���
167 	} move;
168 
169 	// SACT.Numeral�ѥѥ�᡼��
170 	struct {
171 		int cg[10];
172 		MyPoint pos;
173 		int span;
174 	} numeral;
175 
176 	// ���ץ饤�Ȥμ�����ξ���
177 	union {
178 		// �����å����ץ饤��
179 		struct {
180 
181 		} sw;
182 
183 		// ���åȥ��ץ饤��
184 		struct {
185 			boolean dragging;  // �ɥ�å���
186 			MyPoint dragstart; // �ɥ�å����ϰ���
187 		} get;
188 
189 		// �ץåȥ��ץ饤��
190 		struct {
191 
192 		} put;
193 
194 		// ���˥᡼������ץ饤��
195 		struct {
196 			int interval;      // �����ޤδֳ�(10msec)
197 			int starttime;     // ���ϻ���
198 			int npat;          // ���˥ᥳ�޿�(1/2/3)
199 			unsigned int tick; // ������
200 		} anime;
201 
202 		// ��å��������ץ饤��
203 		struct {
204 			GSList    *buf;       // ɽ������ʸ���Υꥹ��
205 			surface_t *canvas;    // ʸ�������褹��surface
206 			MyPoint    dspcur;    // ���ߤ�ɽ������
207 		} msg;
208 	} u;
209 };
210 typedef struct _sprite sprite_t;
211 
212 // SACT���Τξ���
213 struct _sact {
214 	// SACT�ΥС������
215 	int version;
216 
217 	// ���ץ饤������
218 	sprite_t *sp[SPRITEMAX];
219 
220 	GSList *sp_zhide;  // Z�����Ǿä����ץ饤�ȤΥꥹ��
221 	GSList *sp_quake;  // Quake���ɤ餹���ץ饤�ȤΥꥹ��
222 
223 	GSList *updatelist; // �����褹�륹�ץ饤�ȤΥꥹ��
224 
225 	cginfo_t *cg[CGMAX]; // cg�ޤ���CG_xx�Ǻ�ä� CG
226 
227 	// ��ɸ�Ϥθ���
228 	MyPoint origin;
229 
230 	// ʸ���� push/pop/replce ��
231 	GSList *strstack;
232 	GSList *strreplace;
233 	char   *strreplacesrc;
234 	char   *strreplacedst;
235 
236 	// ��å��������ץ饤���ѥ�å������Хåե�
237 	char msgbuf[MSGBUFMAX];
238 	char msgbuf2[MSGBUFMAX];
239 
240 	// ���������
241 	struct {
242 		char *elem[SEL_ELEMENT_MAX]; // �����ʸ����
243 		int spno; // �طʥ��ץ饤���ֹ�
244 		int font_size; // �����ʸ��������
245 		int font_type; // �����ե����
246 		int frame_dot; // �ȥ��ץ饤�Ȥγ�¦����Υԥ������
247 		int linespace; // �����ιԴ�
248 		int movecursor; // �������
249 		int align; // �Ԥ���
250 		void (* cbmove)(agsevent_t *);
251 		void (* cbrelease)(agsevent_t *);
252 		surface_t   *charcanvas;
253 	} sel;
254 
255 	// event listener
256 	GSList *eventlisteners;
257 	GSList *teventlisteners;
258 	GSList *teventremovelist;
259 
260 	// MOVE���륹�ץ饤�ȤΥꥹ��
261 	GSList *movelist;
262 	int movestarttime; // ���Ƥ˰�ư���Ϥ��뤿��γ��ϻ���
263 	int movecurtime;
264 
265 	MyRectangle updaterect; // ������ɬ�פ�sprite���ΰ����
266 
267 	// sact timer
268 	stimer_t timer[65536];
269 
270 	// DnD�˴ؤ�����
271 	sprite_t *draggedsp;  // drag��Υ��ץ饤��
272 	boolean dropped;      // ���ץ饤�Ȥ��ɥ�åפ��줿���ɤ���
273 
274 	// keywait�μ���
275 	int waittype;
276 	int waitkey;
277 	int sp_result_sw;
278 	int sp_result_get;
279 	int sp_result_put;
280 
281 	// wait skip level
282 	//  0 �̾省���Ԥ�
283 	//  1 ���ɤΤߥ����å�
284 	//  2 ̤�ɤ⥹���å�
285 	int waitskiplv;
286 
287 	// �ϰϳ�����å������Ȥ��β�
288 	int numsoundob;
289 
290 	// depth map
291 	surface_t *dmap;
292 
293 	// SACTEFAM.KLD
294 	SACTEFAM_t am;
295 
296 	boolean zhiding;  // Zkey�ˤ�뱣����
297 	int     zofftime;
298 	boolean zdooff;
299 
300 	// �Хå���
301 	boolean logging;
302 	GList  *log;
303 };
304 typedef struct _sact sact_t;
305 
306 // shortcut
307 #define sact sactprv
308 extern sact_t sact;
309 
310 #endif /* __SACT_H__ */
311