1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back! *
3 *----------------------------------------------------------*
4 * ©1995 Artsoft Development *
6 * 33659 Bielefeld-Senne *
7 * Telefon: (0521) 493245 *
8 * eMail: aeglos@valinor.owl.de *
9 * aeglos@uni-paderborn.de *
10 * q99492@pbhrzx.uni-paderborn.de *
11 *----------------------------------------------------------*
14 * Letzte Aenderung: 15.06.1995 *
15 ***********************************************************/
28 if (direct_draw_on && game_status==PLAYING)
29 redraw_mask &= ~REDRAW_MAIN;
34 if (redraw_mask & REDRAW_ALL ||
35 (redraw_mask & REDRAW_FIELD && redraw_mask & REDRAW_DOORS))
37 XCopyArea(display,backbuffer,window,gc,
38 0,0, WIN_XSIZE,WIN_YSIZE,
42 else if (redraw_mask & REDRAW_FIELD)
44 XCopyArea(display,backbuffer,window,gc,
45 REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE,
47 redraw_mask &= ~REDRAW_MAIN;
49 else if (redraw_mask & REDRAW_DOORS)
51 if (redraw_mask & REDRAW_DOOR_1)
52 XCopyArea(display,backbuffer,window,gc,
53 DX,DY, DXSIZE,DYSIZE, DX,DY);
54 if (redraw_mask & REDRAW_DOOR_2)
56 if ((redraw_mask & REDRAW_DOOR_2) == REDRAW_DOOR_2)
57 XCopyArea(display,backbuffer,window,gc,
58 VX,VY, VXSIZE,VYSIZE, VX,VY);
61 if (redraw_mask & REDRAW_VIDEO_1)
62 XCopyArea(display,backbuffer,window,gc,
63 VX+VIDEO_DISPLAY1_XPOS,VY+VIDEO_DISPLAY1_YPOS,
64 VIDEO_DISPLAY_XSIZE,VIDEO_DISPLAY_YSIZE,
65 VX+VIDEO_DISPLAY1_XPOS,VY+VIDEO_DISPLAY1_YPOS);
66 if (redraw_mask & REDRAW_VIDEO_2)
67 XCopyArea(display,backbuffer,window,gc,
68 VX+VIDEO_DISPLAY2_XPOS,VY+VIDEO_DISPLAY2_YPOS,
69 VIDEO_DISPLAY_XSIZE,VIDEO_DISPLAY_YSIZE,
70 VX+VIDEO_DISPLAY2_XPOS,VY+VIDEO_DISPLAY2_YPOS);
71 if (redraw_mask & REDRAW_VIDEO_3)
72 XCopyArea(display,backbuffer,window,gc,
73 VX+VIDEO_CONTROL_XPOS,VY+VIDEO_CONTROL_YPOS,
74 VIDEO_CONTROL_XSIZE,VIDEO_CONTROL_YSIZE,
75 VX+VIDEO_CONTROL_XPOS,VY+VIDEO_CONTROL_YPOS);
78 redraw_mask &= ~REDRAW_DOORS;
81 if (redraw_mask & REDRAW_MICROLEV)
83 XCopyArea(display,backbuffer,window,gc,
84 MICROLEV_XPOS,MICROLEV_YPOS, MICROLEV_XSIZE,MICROLEV_YSIZE,
85 MICROLEV_XPOS,MICROLEV_YPOS);
86 XCopyArea(display,backbuffer,window,gc,
87 SX,MICROLABEL_YPOS, SXSIZE,FONT4_YSIZE,
89 redraw_mask &= ~REDRAW_MICROLEV;
92 if (redraw_mask & REDRAW_TILES)
94 if (redraw_tiles>REDRAWTILES_TH)
95 XCopyArea(display,backbuffer,window,gc,SX,SY,SXSIZE,SYSIZE,SX,SY);
97 for(x=0;x<SCR_FIELDX;x++)
98 for(y=0;y<SCR_FIELDY;y++)
100 XCopyArea(display,backbuffer,window,gc,
101 SX+x*TILEX,SY+y*TILEY,TILEX,TILEY,SX+x*TILEX,SY+y*TILEY);
106 for(x=0;x<SCR_FIELDX;x++)
107 for(y=0;y<SCR_FIELDY;y++)
115 long fading_delay = 300000;
117 if (fading_on && (redraw_mask & REDRAW_FIELD))
119 XSetClipOrigin(display,clip_gc[PIX_FADEMASK],0,0);
120 XCopyArea(display,backbuffer,window,clip_gc[PIX_FADEMASK],
121 REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE, REAL_SX,REAL_SY);
125 XSetClipOrigin(display,clip_gc[PIX_FADEMASK],-1,-1);
126 XCopyArea(display,backbuffer,window,clip_gc[PIX_FADEMASK],
127 REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE, REAL_SX,REAL_SY);
131 XSetClipOrigin(display,clip_gc[PIX_FADEMASK],0,-1);
132 XCopyArea(display,backbuffer,window,clip_gc[PIX_FADEMASK],
133 REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE, REAL_SX,REAL_SY);
137 XSetClipOrigin(display,clip_gc[PIX_FADEMASK],-1,0);
138 XCopyArea(display,backbuffer,window,clip_gc[PIX_FADEMASK],
139 REAL_SX,REAL_SY, FULL_SXSIZE,FULL_SYSIZE, REAL_SX,REAL_SY);
143 redraw_mask &= ~REDRAW_MAIN;
151 drawto_field = backbuffer;
152 XFillRectangle(display,drawto_field,gc,
153 REAL_SX,REAL_SY,FULL_SXSIZE,FULL_SYSIZE);
154 redraw_mask|=REDRAW_FIELD;
156 if (game_status==PLAYING && direct_draw_on)
158 drawto_field = window;
159 XFillRectangle(display,drawto_field,gc,
160 REAL_SX,REAL_SY,FULL_SXSIZE,FULL_SYSIZE);
164 void DrawText(int x, int y, char *text, int font, int col)
166 DrawTextExt(drawto, gc, x, y, text, font, col);
168 redraw_mask|=REDRAW_FIELD;
170 redraw_mask|=REDRAW_DOOR_1;
173 void DrawTextExt(Drawable d, GC gc, int x, int y,
174 char *text, int font, int font_color)
176 int font_width, font_height, font_start;
179 if (font!=FS_SMALL && font!=FS_BIG)
181 if (font_color<FC_RED || font_color>FC_SPECIAL2)
185 (font==FS_BIG ? FONT1_XSIZE :
186 font_color<FC_SPECIAL1 ? FONT2_XSIZE :
187 font_color<FC_SPECIAL2 ? FONT3_XSIZE : FONT4_XSIZE);
189 (font==FS_BIG ? FONT1_XSIZE :
190 font_color<FC_SPECIAL2 ? FONT2_XSIZE: FONT4_XSIZE);
191 font_pixmap = (font==FS_BIG ? PIX_BIGFONT : PIX_SMALLFONT);
193 font_color*(font==FS_BIG ? FONT1_YSIZE : FONT2_YSIZE)*FONT_LINES_PER_FONT;
199 if (c>='a' && c<='z')
201 else if (c=='ä' || c=='Ä')
203 else if (c=='ö' || c=='Ö')
205 else if (c=='ü' || c=='Ü')
209 XCopyArea(display,pix[font_pixmap],d,gc,
210 ((c-32) % FONT_CHARS_PER_LINE)*font_width,
211 ((c-32) / FONT_CHARS_PER_LINE)*font_height + font_start,
212 font_width,font_height, x,y);
218 void DrawGraphic(int x, int y, int graphic)
220 DrawGraphicExt(drawto_field, gc, x, y, graphic);
223 redraw_mask |= REDRAW_TILES;
226 void DrawGraphicExt(Drawable d, GC gc, int x, int y, int graphic)
228 DrawGraphicExtHiRes(d, gc, SX+x*TILEX, SY+y*TILEY, graphic);
231 void DrawGraphicExtHiRes(Drawable d, GC gc, int x, int y, int graphic)
234 XFillRectangle(display,d,gc, x,y, TILEX,TILEY);
235 else if (graphic<256)
236 XCopyArea(display,pix[PIX_BACK],d,gc,
237 SX+(graphic % GFX_PER_LINE)*TILEX,
238 SY+(graphic / GFX_PER_LINE)*TILEY,
243 XCopyArea(display,pix[PIX_BIGFONT],d,gc,
244 (graphic % FONT_CHARS_PER_LINE)*TILEX,
245 (graphic / FONT_CHARS_PER_LINE)*TILEY +
246 FC_SPECIAL1*TILEY*FONT_LINES_PER_FONT,
251 void DrawGraphicThruMask(int x, int y, int graphic)
253 int src_x,src_y, dest_x,dest_y;
255 if (graphic<0 || graphic>255)
257 DrawGraphic(x,y,graphic);
261 src_x = SX+(graphic % GFX_PER_LINE)*TILEX;
262 src_y = SY+(graphic / GFX_PER_LINE)*TILEY;
266 XSetClipOrigin(display,clip_gc[PIX_BACK],dest_x-src_x,dest_y-src_y);
267 XCopyArea(display,pix[PIX_BACK],drawto_field,clip_gc[PIX_BACK], src_x,src_y,
268 TILEX,TILEY, dest_x,dest_y);
272 redraw_mask|=REDRAW_TILES;
275 void DrawElementThruMask(int x, int y, int element)
277 DrawGraphicThruMask(x,y,el2gfx(element));
280 void DrawMiniGraphic(int x, int y, int graphic)
282 DrawMiniGraphicExt(drawto, gc, x, y, graphic);
284 redraw[x/2][y/2]=TRUE;
285 redraw_mask|=REDRAW_TILES;
288 void DrawMiniGraphicExt(Drawable d, GC gc, int x, int y, int graphic)
290 DrawMiniGraphicExtHiRes(d,gc, SX+x*MINI_TILEX,SY+y*MINI_TILEY, graphic);
293 void DrawMiniGraphicExtHiRes(Drawable d, GC gc, int x, int y, int graphic)
296 XFillRectangle(display,d,gc, x,y, MINI_TILEX,MINI_TILEY);
297 else if (graphic<256)
298 XCopyArea(display,pix[PIX_BACK],d,gc,
299 MINI_GFX_STARTX+(graphic % MINI_GFX_PER_LINE)*MINI_TILEX,
300 MINI_GFX_STARTY+(graphic / MINI_GFX_PER_LINE)*MINI_TILEY,
301 MINI_TILEX,MINI_TILEY, x,y);
305 XCopyArea(display,pix[PIX_SMALLFONT],d,gc,
306 (graphic % FONT_CHARS_PER_LINE)*FONT4_XSIZE,
307 (graphic / FONT_CHARS_PER_LINE)*FONT4_YSIZE +
308 FC_SPECIAL2*FONT2_YSIZE*FONT_LINES_PER_FONT,
309 MINI_TILEX,MINI_TILEY, x,y);
313 int el2gfx(int element)
317 case EL_LEERRAUM: return(-1);
318 case EL_ERDREICH: return(GFX_ERDREICH);
319 case EL_MAUERWERK: return(GFX_MAUERWERK);
320 case EL_FELSBODEN: return(GFX_FELSBODEN);
321 case EL_FELSBROCKEN: return(GFX_FELSBROCKEN);
322 case EL_SCHLUESSEL: return(GFX_SCHLUESSEL);
323 case EL_EDELSTEIN: return(GFX_EDELSTEIN);
324 case EL_AUSGANG_ZU: return(GFX_AUSGANG_ZU);
325 case EL_AUSGANG_ACT: return(GFX_AUSGANG_ACT);
326 case EL_AUSGANG_AUF: return(GFX_AUSGANG_AUF);
327 case EL_SPIELFIGUR: return(GFX_SPIELFIGUR);
328 case EL_SPIELER1: return(GFX_SPIELER1);
329 case EL_SPIELER2: return(GFX_SPIELER2);
330 case EL_SPIELER3: return(GFX_SPIELER3);
331 case EL_SPIELER4: return(GFX_SPIELER4);
332 case EL_KAEFER: return(GFX_KAEFER);
333 case EL_KAEFER_R: return(GFX_KAEFER_R);
334 case EL_KAEFER_O: return(GFX_KAEFER_O);
335 case EL_KAEFER_L: return(GFX_KAEFER_L);
336 case EL_KAEFER_U: return(GFX_KAEFER_U);
337 case EL_FLIEGER: return(GFX_FLIEGER);
338 case EL_FLIEGER_R: return(GFX_FLIEGER_R);
339 case EL_FLIEGER_O: return(GFX_FLIEGER_O);
340 case EL_FLIEGER_L: return(GFX_FLIEGER_L);
341 case EL_FLIEGER_U: return(GFX_FLIEGER_U);
342 case EL_MAMPFER: return(GFX_MAMPFER);
343 case EL_ZOMBIE: return(GFX_ZOMBIE);
344 case EL_BETON: return(GFX_BETON);
345 case EL_DIAMANT: return(GFX_DIAMANT);
346 case EL_MORAST_LEER: return(GFX_MORAST_LEER);
347 case EL_MORAST_VOLL: return(GFX_MORAST_VOLL);
348 case EL_TROPFEN: return(GFX_TROPFEN);
349 case EL_BOMBE: return(GFX_BOMBE);
350 case EL_SIEB_LEER: return(GFX_SIEB_LEER);
351 case EL_SIEB_VOLL: return(GFX_SIEB_VOLL);
352 case EL_SIEB_TOT: return(GFX_SIEB_TOT);
353 case EL_SALZSAEURE: return(GFX_SALZSAEURE);
354 case EL_AMOEBE1: return(GFX_AMOEBE1);
355 case EL_AMOEBE2: return(GFX_AMOEBE2);
356 case EL_AMOEBE3: return(GFX_AMOEBE3);
357 case EL_KOKOSNUSS: return(GFX_KOKOSNUSS);
358 case EL_LIFE: return(GFX_LIFE);
359 case EL_LIFE_ASYNC: return(GFX_LIFE_ASYNC);
360 case EL_DYNAMIT: return(GFX_DYNAMIT);
361 case EL_BADEWANNE: return(GFX_BADEWANNE);
362 case EL_BADEWANNE1: return(GFX_BADEWANNE1);
363 case EL_BADEWANNE2: return(GFX_BADEWANNE2);
364 case EL_BADEWANNE3: return(GFX_BADEWANNE3);
365 case EL_BADEWANNE4: return(GFX_BADEWANNE4);
366 case EL_BADEWANNE5: return(GFX_BADEWANNE5);
367 case EL_ABLENK_AUS: return(GFX_ABLENK_AUS);
368 case EL_ABLENK_EIN: return(GFX_ABLENK_EIN);
369 case EL_SCHLUESSEL1: return(GFX_SCHLUESSEL1);
370 case EL_SCHLUESSEL2: return(GFX_SCHLUESSEL2);
371 case EL_SCHLUESSEL3: return(GFX_SCHLUESSEL3);
372 case EL_SCHLUESSEL4: return(GFX_SCHLUESSEL4);
373 case EL_PFORTE1: return(GFX_PFORTE1);
374 case EL_PFORTE2: return(GFX_PFORTE2);
375 case EL_PFORTE3: return(GFX_PFORTE3);
376 case EL_PFORTE4: return(GFX_PFORTE4);
377 case EL_PFORTE1X: return(GFX_PFORTE1X);
378 case EL_PFORTE2X: return(GFX_PFORTE2X);
379 case EL_PFORTE3X: return(GFX_PFORTE3X);
380 case EL_PFORTE4X: return(GFX_PFORTE4X);
381 case EL_DYNAMIT_AUS: return(GFX_DYNAMIT_AUS);
382 case EL_PACMAN: return(GFX_PACMAN);
383 case EL_PACMAN_R: return(GFX_PACMAN_R);
384 case EL_PACMAN_O: return(GFX_PACMAN_O);
385 case EL_PACMAN_L: return(GFX_PACMAN_L);
386 case EL_PACMAN_U: return(GFX_PACMAN_U);
387 case EL_UNSICHTBAR: return(GFX_UNSICHTBAR);
388 case EL_ERZ_1: return(GFX_ERZ_1);
389 case EL_ERZ_2: return(GFX_ERZ_2);
390 case EL_BIRNE_AUS: return(GFX_BIRNE_AUS);
391 case EL_BIRNE_EIN: return(GFX_BIRNE_EIN);
394 if (IS_CHAR(element))
395 return(GFX_CHAR_START + (element-EL_CHAR_START));
402 void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int cut_mode)
404 int width = TILEX, height = TILEY;
409 DrawGraphic(x,y,graphic);
413 if (dx || dy) /* Verschiebung der Grafik? */
415 if (x<0) /* Element kommt von links ins Bild */
422 else if (x==SCR_FIELDX) /* Element kommt von rechts ins Bild */
428 else if (x==0 && dx<0) /* Element verläßt links das Bild */
434 else if (x==SCR_FIELDX-1 && dx>0) /* El. verläßt rechts das Bild */
436 else if (dx) /* allg. Bewegung in x-Richtung */
437 redraw[x+SIGN(dx)][y]=TRUE;
439 if (y<0) /* Element kommt von oben ins Bild */
441 if (cut_mode==CUT_BELOW) /* Element oberhalb des Bildes */
449 else if (y==SCR_FIELDY) /* Element kommt von unten ins Bild */
455 else if (y==0 && dy<0) /* Element verläßt oben das Bild */
461 else if (dy>0 && cut_mode==CUT_ABOVE)
463 if (y==SCR_FIELDY-1) /* Element unterhalb des Bildes */
470 } /* Element verläßt unten das Bild */
471 else if (dy>0 && (y==SCR_FIELDY-1 || cut_mode==CUT_BELOW))
473 else if (dy) /* allg. Bewegung in y-Richtung */
474 redraw[x][y+SIGN(dy)]=TRUE;
477 XCopyArea(display,pix[PIX_BACK],drawto_field,gc,
478 SX+(graphic % GFX_PER_LINE)*TILEX+cx,
479 SY+(graphic / GFX_PER_LINE)*TILEY+cy,
480 width,height, SX+x*TILEX+dx,SY+y*TILEY+dy);
484 redraw_mask|=REDRAW_TILES;
487 void DrawElementShifted(int x, int y, int dx, int dy, int element,int cut_mode)
489 int ux = UNSCROLLX(x), uy = UNSCROLLY(y);
490 int graphic = el2gfx(element);
491 int phase = ABS(MovPos[ux][uy])/(TILEX/2);
492 int dir = MovDir[ux][uy];
493 int horiz_move = (dir==MV_LEFT || dir==MV_RIGHT);
495 if (element==EL_PACMAN ||
496 element==EL_KAEFER ||
499 if (element==EL_PACMAN)
500 graphic = GFX_PACMAN + 4*!phase;
506 else if (dir==MV_LEFT)
508 else if (dir==MV_DOWN)
511 else if ((element==EL_FELSBROCKEN ||
512 element==EL_EDELSTEIN ||
513 element==EL_DIAMANT) && horiz_move && phase)
515 if (element==EL_FELSBROCKEN)
520 else if ((element==EL_SIEB_LEER ||
521 element==EL_SIEB_VOLL) && SiebAktiv)
523 graphic += 3-(SiebAktiv%8)/2;
525 else if (IS_AMOEBOID(element))
527 graphic = (element==EL_AMOEBE1 ? GFX_AMOEBE_TOT : GFX_AMOEBE_LEBT);
528 graphic += (x+2*y) % 4;
532 DrawGraphicShifted(x,y, dx,dy, graphic, cut_mode);
534 DrawGraphic(x,y, graphic);
537 void ErdreichAnbroeckeln(int x, int y)
539 int i, width, height, cx,cy;
540 int ux = UNSCROLLX(x), uy = UNSCROLLY(y);
541 int element, graphic;
543 static int xy[4][2] =
551 if (!IN_LEV_FIELD(ux,uy))
554 element = Feld[ux][uy];
556 if (element==EL_ERDREICH)
558 if (!IN_SCR_FIELD(x,y))
561 graphic = GFX_ERDENRAND;
569 if (!IN_LEV_FIELD(uxx,uyy))
572 element = Feld[uxx][uyy];
575 if (element==EL_ERDREICH || IS_SOLID(element))
578 if (element==EL_ERDREICH)
585 cx = (i==2 ? TILEX-snip : 0);
593 cy = (i==3 ? TILEY-snip : 0);
596 XCopyArea(display,pix[PIX_BACK],drawto_field,gc,
597 SX+(graphic % GFX_PER_LINE)*TILEX+cx,
598 SY+(graphic / GFX_PER_LINE)*TILEY+cy,
599 width,height, SX+x*TILEX+cx,SY+y*TILEY+cy);
607 graphic = GFX_ERDENRAND;
618 if (!IN_LEV_FIELD(uxx,uyy) || Feld[uxx][uyy]!=EL_ERDREICH ||
619 !IN_SCR_FIELD(xx,yy) || IS_SOLID(element))
623 if (!IN_LEV_FIELD(uxx,uyy) || Feld[uxx][uyy]!=EL_ERDREICH ||
624 !IN_SCR_FIELD(xx,yy))
631 cx = (i==1 ? TILEX-snip : 0);
639 cy = (i==0 ? TILEY-snip : 0);
642 XCopyArea(display,pix[PIX_BACK],drawto_field,gc,
643 SX+(graphic % GFX_PER_LINE)*TILEX+cx,
644 SY+(graphic / GFX_PER_LINE)*TILEY+cy,
645 width,height, SX+xx*TILEX+cx,SY+yy*TILEY+cy);
653 void DrawScreenElement(int x, int y, int element)
655 DrawElementShifted(x,y,0,0,element,CUT_NO_CUTTING);
656 ErdreichAnbroeckeln(x,y);
659 void DrawLevelElement(int x, int y, int element)
661 if (IN_LEV_FIELD(x,y) && IN_SCR_FIELD(SCROLLX(x),SCROLLY(y)))
662 DrawScreenElement(SCROLLX(x),SCROLLY(y),element);
665 void DrawScreenField(int x, int y)
667 int ux = UNSCROLLX(x), uy = UNSCROLLY(y);
670 if (!IN_LEV_FIELD(ux,uy))
672 DrawScreenElement(x,y,EL_BETON);
676 element = Feld[ux][uy];
678 if (IS_MOVING(ux,uy))
680 int horiz_move = (MovDir[ux][uy]==MV_LEFT || MovDir[ux][uy]==MV_RIGHT);
681 BOOL cut_mode = CUT_NO_CUTTING;
683 if (Store[ux][uy]==EL_MORAST_LEER ||
684 Store[ux][uy]==EL_SIEB_LEER ||
685 Store[ux][uy]==EL_AMOEBE2)
686 cut_mode = CUT_ABOVE;
687 else if (Store[ux][uy]==EL_MORAST_VOLL ||
688 Store[ux][uy]==EL_SIEB_VOLL ||
689 Store[ux][uy]==EL_SALZSAEURE)
690 cut_mode = CUT_BELOW;
692 if (cut_mode==CUT_ABOVE)
693 DrawElementShifted(x,y,0,0,Store[ux][uy],CUT_NO_CUTTING);
695 DrawScreenElement(x,y,EL_LEERRAUM);
698 DrawElementShifted(x,y,MovPos[ux][uy],0,element,CUT_NO_CUTTING);
700 DrawElementShifted(x,y,0,MovPos[ux][uy],element,cut_mode);
702 else if (IS_BLOCKED(ux,uy))
707 BOOL cut_mode = CUT_NO_CUTTING;
709 Blocked2Moving(ux,uy,&oldx,&oldy);
712 horiz_move = (MovDir[oldx][oldy]==MV_LEFT || MovDir[oldx][oldy]==MV_RIGHT);
714 if (Store[oldx][oldy]==EL_MORAST_LEER ||
715 Store[oldx][oldy]==EL_SIEB_LEER ||
716 Store[oldx][oldy]==EL_AMOEBE2)
717 cut_mode = CUT_ABOVE;
719 DrawScreenElement(x,y,EL_LEERRAUM);
720 element = Feld[oldx][oldy];
723 DrawElementShifted(sx,sy,MovPos[oldx][oldy],0,element,CUT_NO_CUTTING);
725 DrawElementShifted(sx,sy,0,MovPos[oldx][oldy],element,cut_mode);
727 else if (IS_DRAWABLE(element))
728 DrawScreenElement(x,y,element);
730 DrawScreenElement(x,y,EL_LEERRAUM);
733 void DrawLevelField(int x, int y)
735 if (IN_SCR_FIELD(SCROLLX(x),SCROLLY(y)))
736 DrawScreenField(SCROLLX(x),SCROLLY(y));
737 else if (IS_MOVING(x,y))
741 Moving2Blocked(x,y,&newx,&newy);
742 if (IN_SCR_FIELD(SCROLLX(newx),SCROLLY(newy)))
743 DrawScreenField(SCROLLX(newx),SCROLLY(newy));
745 else if (IS_BLOCKED(x,y))
749 Blocked2Moving(x,y,&oldx,&oldy);
750 if (IN_SCR_FIELD(SCROLLX(oldx),SCROLLY(oldy)))
751 DrawScreenField(SCROLLX(oldx),SCROLLY(oldy));
755 void DrawMiniElement(int x, int y, int element)
761 DrawMiniGraphic(x,y,-1);
765 graphic = el2gfx(element);
766 DrawMiniGraphic(x,y,graphic);
769 redraw[x/2][y/2]=TRUE;
770 redraw_mask|=REDRAW_TILES;
773 void DrawMiniElementOrWall(int x, int y, int scroll_x, int scroll_y)
775 if (x+scroll_x<-1 || x+scroll_x>lev_fieldx ||
776 y+scroll_y<-1 || y+scroll_y>lev_fieldy)
777 DrawMiniElement(x,y,EL_LEERRAUM);
778 else if (x+scroll_x==-1 || x+scroll_x==lev_fieldx ||
779 y+scroll_y==-1 || y+scroll_y==lev_fieldy)
780 DrawMiniElement(x,y,EL_BETON);
782 DrawMiniElement(x,y,Feld[x+scroll_x][y+scroll_y]);
785 void DrawMicroElement(int xpos, int ypos, int element)
789 if (element==EL_LEERRAUM)
792 graphic = el2gfx(element);
794 XCopyArea(display,pix[PIX_BACK],drawto,gc,
795 MICRO_GFX_STARTX+(graphic % MICRO_GFX_PER_LINE)*MICRO_TILEX,
796 MICRO_GFX_STARTY+(graphic / MICRO_GFX_PER_LINE)*MICRO_TILEY,
797 MICRO_TILEX,MICRO_TILEY, xpos,ypos);
806 for(x=0;x<SCR_FIELDX;x++)
807 for(y=0;y<SCR_FIELDY;y++)
808 DrawScreenField(x,y);
810 redraw_mask |= REDRAW_FIELD;
813 void DrawMiniLevel(int scroll_x, int scroll_y)
819 for(x=0;x<2*SCR_FIELDX;x++)
820 for(y=0;y<2*SCR_FIELDY;y++)
821 DrawMiniElementOrWall(x,y,scroll_x,scroll_y);
823 redraw_mask |= REDRAW_FIELD;
826 void DrawMicroLevel(int xpos, int ypos)
830 XFillRectangle(display,drawto,gc,
831 xpos-MICRO_TILEX,ypos-MICRO_TILEY,
832 MICRO_TILEX*(STD_LEV_FIELDX+2),
833 MICRO_TILEY*(STD_LEV_FIELDY+2));
835 for(x=-1;x<=STD_LEV_FIELDX;x++)
836 for(y=-1;y<=STD_LEV_FIELDY;y++)
837 if (x>=0 && x<lev_fieldx && y>=0 && y<lev_fieldy)
838 DrawMicroElement(xpos+MICRO_TILEX*x,ypos+MICRO_TILEY*y,
839 Feld[x][y]=Ur[x][y]);
840 else if (x>=-1 && x<lev_fieldx+1 && y>=-1 && y<lev_fieldy+1)
841 DrawMicroElement(xpos+MICRO_TILEX*x,ypos+MICRO_TILEY*y,
844 XFillRectangle(display,drawto,gc, SX,MICROLABEL_YPOS, SXSIZE,FONT4_YSIZE);
848 int len = strlen(level.name);
849 int lxpos = SX+(SXSIZE-len*FONT4_XSIZE)/2;
850 int lypos = MICROLABEL_YPOS;
852 DrawText(lxpos,lypos,level.name,FS_SMALL,FC_SPECIAL2);
855 redraw_mask |= REDRAW_MICROLEV;
858 int AYS_in_range(int x, int y)
860 if (y>DY+249 && y<DY+278)
862 if (x>DX+1 && x<DX+48)
864 else if (x>DX+51 && x<DX+98)
870 BOOL AreYouSure(char *text, unsigned int ays_state)
872 int mx,my, ty, result = -1;
874 CloseDoor(DOOR_CLOSE_1);
876 /* Alten Türinhalt sichern */
877 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
878 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1, DXSIZE,DYSIZE,
879 DOOR_GFX_PAGEX2,DOOR_GFX_PAGEY1);
881 /* Fragetext schreiben */
882 XFillRectangle(display,pix[PIX_DB_DOOR],gc,
883 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1,DXSIZE,DYSIZE);
892 for(tl=0,tx=0;tx<7;tl++,tx++)
906 DrawTextExt(pix[PIX_DB_DOOR],gc,
907 DOOR_GFX_PAGEX1+51-(tl*14)/2,SY+ty*16,txt,FS_SMALL,FC_YELLOW);
911 if (ays_state & AYS_ASK)
912 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
913 DOOR_GFX_PAGEX4,OK_BUTTON_GFX_YPOS,
914 DXSIZE,OK_BUTTON_YSIZE,
915 DOOR_GFX_PAGEX1,OK_BUTTON_YPOS);
916 else if (ays_state & AYS_CONFIRM)
917 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DB_DOOR],gc,
918 DOOR_GFX_PAGEX4,CONFIRM_BUTTON_GFX_YPOS,
919 DXSIZE,CONFIRM_BUTTON_YSIZE,
920 DOOR_GFX_PAGEX1,CONFIRM_BUTTON_YPOS);
922 OpenDoor(DOOR_OPEN_1);
924 if (!(ays_state & AYS_ASK) && !(ays_state & AYS_CONFIRM))
927 if (game_status!=MAINMENU)
930 button_status = MB_RELEASED;
937 if (XPending(display))
941 XNextEvent(display, &event);
945 HandleExposeEvent((XExposeEvent *) &event);
948 SleepWhileUnmapped();
956 if (event.type==MotionNotify)
958 motion_status = TRUE;
959 mx = ((XMotionEvent *) &event)->x;
960 my = ((XMotionEvent *) &event)->y;
964 motion_status = FALSE;
965 mx = ((XButtonEvent *) &event)->x;
966 my = ((XButtonEvent *) &event)->y;
967 if (event.type==ButtonPress)
968 button_status = ((XButtonEvent *) &event)->button;
970 button_status = MB_RELEASED;
973 if (ays_state & AYS_ASK)
974 choice = CheckChooseButtons(mx,my,button_status);
976 choice = CheckConfirmButton(mx,my,button_status);
995 key_status = KEY_PRESSED;
996 switch(XLookupKeysym((XKeyEvent *)&event,
997 ((XKeyEvent *)&event)->state))
1008 HandleFocusEvent(FOCUS_IN);
1011 HandleFocusEvent(FOCUS_OUT);
1017 else if (JoystickButton()==JOY_BUTTON_NEW_PRESSED)
1021 if (joy & JOY_BUTTON_1)
1023 else if (joy & JOY_BUTTON_2)
1028 if (game_status!=MAINMENU)
1031 if (!(ays_state & AYS_STAY_OPEN))
1033 CloseDoor(DOOR_CLOSE_1);
1035 if (!(ays_state & AYS_STAY_CLOSED) &&
1036 (game_status==PLAYING || game_status==LEVELED))
1038 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
1039 DOOR_GFX_PAGEX2,DOOR_GFX_PAGEY1, DXSIZE,DYSIZE,
1040 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1);
1041 OpenDoor(DOOR_OPEN_1);
1048 void OpenDoor(unsigned int door_state)
1050 if (door_state & DOOR_COPY_BACK)
1052 XCopyArea(display,pix[PIX_DB_DOOR],pix[PIX_DB_DOOR],gc,
1053 DOOR_GFX_PAGEX2,DOOR_GFX_PAGEY1, DXSIZE,DYSIZE+VYSIZE,
1054 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1);
1055 door_state &= ~DOOR_COPY_BACK;
1058 MoveDoor(door_state);
1062 void CloseDoor(unsigned int door_state)
1064 XCopyArea(display,backbuffer,pix[PIX_DB_DOOR],gc,
1065 DX,DY, DXSIZE,DYSIZE, DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1);
1066 XCopyArea(display,backbuffer,pix[PIX_DB_DOOR],gc,
1067 VX,VY, VXSIZE,VYSIZE, DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
1069 MoveDoor(door_state);
1073 void MoveDoor(unsigned int door_state)
1075 static int door1 = DOOR_CLOSE_1;
1076 static int door2 = DOOR_OPEN_2;
1077 int x, start, stepsize = 4;
1079 if (door1==DOOR_OPEN_1 && door_state & DOOR_OPEN_1)
1080 door_state &= ~DOOR_OPEN_1;
1081 else if (door1==DOOR_CLOSE_1 && door_state & DOOR_CLOSE_1)
1082 door_state &= ~DOOR_CLOSE_1;
1083 if (door2==DOOR_OPEN_2 && door_state & DOOR_OPEN_2)
1084 door_state &= ~DOOR_OPEN_2;
1085 else if (door2==DOOR_CLOSE_2 && door_state & DOOR_CLOSE_2)
1086 door_state &= ~DOOR_CLOSE_2;
1088 if (door_state & DOOR_ACTION)
1090 if (door_state & DOOR_OPEN_1)
1092 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DOOR],gc,
1093 104,136, 8,8, 146,136);
1094 if (!(door_state & DOOR_NO_DELAY))
1098 XCopyArea(display,pix[PIX_DOOR],window,gc,
1099 104,136, 8,8, DX+46,DY+136);
1103 if (game_status==MAINMENU)
1109 else if (door_state & DOOR_CLOSE_1)
1110 XCopyArea(display,pix[PIX_DOOR],pix[PIX_DOOR],gc,
1111 88,136, 8,8, 146,136);
1113 if (!(door_state & DOOR_NO_DELAY))
1114 PlaySoundStereo(SND_OEFFNEN,PSND_MAX_RIGHT);
1116 start = ((door_state & DOOR_NO_DELAY) ? DXSIZE : 0);
1118 for(x=start;x<=DXSIZE;x+=stepsize)
1120 if (door_state & DOOR_ACTION_1)
1122 int i = (door_state & DOOR_OPEN_1 ? DXSIZE-x : x);
1124 XCopyArea(display,pix[PIX_DB_DOOR],drawto,gc,
1125 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY1+i/2,
1126 DXSIZE,DYSIZE-i/2, DX,DY);
1128 XFillRectangle(display,drawto,gc,DX,DY+DYSIZE-i/2,DXSIZE,i/2);
1130 XSetClipOrigin(display,clip_gc[PIX_DOOR],DX-DXSIZE+i,DY);
1131 XCopyArea(display,pix[PIX_DOOR],drawto,clip_gc[PIX_DOOR],
1132 DXSIZE-i,0, i,30, DX,DY);
1133 XCopyArea(display,pix[PIX_DOOR],drawto,clip_gc[PIX_DOOR],
1134 DXSIZE-i,DYSIZE-30, i,30, DX,DY+DYSIZE-30);
1135 XSetClipOrigin(display,clip_gc[PIX_DOOR],DX-i,DY);
1136 XCopyArea(display,pix[PIX_DOOR],drawto,clip_gc[PIX_DOOR],
1137 DXSIZE,0, i,30, DX+DXSIZE-i,DY);
1138 XCopyArea(display,pix[PIX_DOOR],drawto,clip_gc[PIX_DOOR],
1139 DXSIZE,DYSIZE-30, i,30, DX+DXSIZE-i,DY+DYSIZE-30);
1142 XSetClipOrigin(display,clip_gc[PIX_DOOR],DX-i,DY);
1143 XCopyArea(display,pix[PIX_DOOR],drawto,clip_gc[PIX_DOOR],
1144 DXSIZE+14,30,i-14,DYSIZE-60,DX+DXSIZE+14-i,DY+30);
1145 XSetClipOrigin(display,clip_gc[PIX_DOOR],DX-DXSIZE+i,DY);
1146 XCopyArea(display,pix[PIX_DOOR],drawto,clip_gc[PIX_DOOR],
1147 DXSIZE-i,30,i-14,DYSIZE-60,DX,DY+30);
1149 redraw_mask |= REDRAW_DOOR_1;
1152 if (door_state & DOOR_ACTION_2)
1154 int i = (door_state & DOOR_OPEN_2 ? VXSIZE-x : x);
1156 XCopyArea(display,pix[PIX_DB_DOOR],drawto,gc,
1157 DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2+i/2,
1158 VXSIZE,VYSIZE-i/2, VX,VY);
1160 XFillRectangle(display,drawto,gc,VX,VY+VYSIZE-i/2,VXSIZE,i/2);
1162 XSetClipOrigin(display,clip_gc[PIX_DOOR],
1163 VX-VXSIZE+i,VY-DOOR_GFX_PAGEY2);
1164 XCopyArea(display,pix[PIX_DOOR],drawto,clip_gc[PIX_DOOR],
1165 VXSIZE-i,DOOR_GFX_PAGEY2, i,VYSIZE, VX,VY);
1166 XSetClipOrigin(display,clip_gc[PIX_DOOR],
1167 VX-i,VY-DOOR_GFX_PAGEY2);
1168 XCopyArea(display,pix[PIX_DOOR],drawto,clip_gc[PIX_DOOR],
1169 VXSIZE,DOOR_GFX_PAGEY2, i,VYSIZE, VX+VXSIZE-i,VY);
1171 redraw_mask |= REDRAW_DOOR_2;
1175 Delay(stepsize*5000);
1177 if (game_status==MAINMENU)
1182 if (door_state & DOOR_ACTION_1)
1183 door1 = door_state & DOOR_ACTION_1;
1184 if (door_state & DOOR_ACTION_2)
1185 door2 = door_state & DOOR_ACTION_2;
1188 long mainCounter(int mode)
1190 static struct timeval base_time = { 0, 0 };
1191 struct timeval current_time;
1194 gettimeofday(¤t_time,NULL);
1195 if (mode==0 || current_time.tv_sec<base_time.tv_sec)
1196 base_time = current_time;
1198 counter_ms = (current_time.tv_sec - base_time.tv_sec)*1000
1199 + (current_time.tv_usec - base_time.tv_usec)/1000;
1202 return(counter_ms/10); /* return 1/100 secs since last init */
1204 return(counter_ms); /* return 1/1000 secs since last init */
1207 void InitCounter() /* set counter back to zero */
1212 long Counter() /* returns 1/100 secs since last call of InitCounter() */
1214 return(mainCounter(1));
1217 long Counter2() /* returns 1/1000 secs since last call of InitCounter() */
1219 return(mainCounter(2));
1222 void WaitCounter(long value) /* wait for counter to reach value */
1226 while((wait=value-Counter())>0)
1227 microsleep(wait*10000);
1230 void WaitCounter2(long value) /* wait for counter to reach value */
1234 while((wait=value-Counter2())>0)
1235 microsleep(wait*1000);
1238 void Delay(long value)
1243 BOOL DelayReached(long *counter_var, int delay)
1245 long actual_counter = Counter();
1247 if (actual_counter>*counter_var+delay || actual_counter<*counter_var)
1249 *counter_var = actual_counter;
1256 int ReadPixel(Drawable d, int x, int y)
1258 static XImage *pixelimage;
1260 pixelimage = XGetImage(display, d, x,y, 1,1, AllPlanes, ZPixmap);
1261 return(XGetPixel(pixelimage,0,0));
1264 static struct JoystickInfo joystick[2] =
1266 JOYSTICK_XLEFT, JOYSTICK_XRIGHT, JOYSTICK_XMIDDLE,
1267 JOYSTICK_YUPPER, JOYSTICK_YLOWER, JOYSTICK_YMIDDLE,
1269 JOYSTICK_XLEFT, JOYSTICK_XRIGHT, JOYSTICK_XMIDDLE,
1270 JOYSTICK_YUPPER, JOYSTICK_YLOWER, JOYSTICK_YMIDDLE
1273 void LoadJoystickData()
1279 if (joystick_status==JOYSTICK_OFF)
1282 if (!(file=fopen(JOYDAT_FILE,"r")))
1285 fscanf(file,"%s",cookie);
1286 if (strcmp(cookie,JOYSTICK_COOKIE)) /* ungültiges Format? */
1288 fprintf(stderr,"%s: wrong format of joystick file!\n",progname);
1295 fscanf(file,"%s",cookie);
1296 fscanf(file, "%d %d %d \n",
1297 &joystick[i].xleft, &joystick[i].xmiddle, &joystick[i].xright);
1298 fscanf(file, "%d %d %d \n",
1299 &joystick[i].yupper, &joystick[i].ymiddle, &joystick[i].ylower);
1303 CheckJoystickData();
1306 void SaveJoystickData()
1311 if (joystick_status==JOYSTICK_OFF)
1314 CheckJoystickData();
1316 if (!(file=fopen(JOYDAT_FILE,"w")))
1318 fprintf(stderr,"%s: cannot save joystick calibration data!\n",progname);
1322 fprintf(file,"%s\n",JOYSTICK_COOKIE); /* Formatkennung */
1325 fprintf(file,"JOYSTICK_%d_DATA\n",i);
1326 fprintf(file, "%d %d %d \n",
1327 joystick[i].xleft, joystick[i].xmiddle, joystick[i].xright);
1328 fprintf(file, "%d %d %d \n",
1329 joystick[i].yupper, joystick[i].ymiddle, joystick[i].ylower);
1333 chmod(JOYDAT_FILE, JOYDAT_PERMS);
1336 void CheckJoystickData()
1343 if (joystick[i].xmiddle <= distance)
1344 joystick[i].xmiddle = distance;
1345 if (joystick[i].ymiddle <= distance)
1346 joystick[i].ymiddle = distance;
1348 if (joystick[i].xleft >= joystick[i].xmiddle)
1349 joystick[i].xleft = joystick[i].xmiddle-distance;
1350 if (joystick[i].xright <= joystick[i].xmiddle)
1351 joystick[i].xright = joystick[i].xmiddle+distance;
1353 if (joystick[i].yupper >= joystick[i].ymiddle)
1354 joystick[i].yupper = joystick[i].ymiddle-distance;
1355 if (joystick[i].ylower <= joystick[i].ymiddle)
1356 joystick[i].ylower = joystick[i].ymiddle+distance;
1360 int JoystickPosition(int middle, int margin, int actual)
1365 if (margin<middle && actual>middle)
1367 if (margin>middle && actual<middle)
1370 range=ABS(margin-middle);
1371 pos=ABS(actual-middle);
1372 percentage=(int)(pos*100/range);
1381 struct joystick_control
1388 int js_x,js_y, js_b1,js_b2;
1389 int left, right, up, down;
1392 if (joystick_status==JOYSTICK_OFF)
1395 if (read(joystick_device, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
1397 fprintf(stderr,"%s: cannot read joystick settings - no joystick support\n",progname);
1398 joystick_status = JOYSTICK_OFF;
1404 js_b1 = joy_ctrl.buttons & 1;
1405 js_b2 = joy_ctrl.buttons & 2;
1407 left = JoystickPosition(joystick[joystick_nr].xmiddle,
1408 joystick[joystick_nr].xleft, js_x);
1409 right = JoystickPosition(joystick[joystick_nr].xmiddle,
1410 joystick[joystick_nr].xright, js_x);
1411 up = JoystickPosition(joystick[joystick_nr].ymiddle,
1412 joystick[joystick_nr].yupper, js_y);
1413 down = JoystickPosition(joystick[joystick_nr].ymiddle,
1414 joystick[joystick_nr].ylower, js_y);
1416 if (left>JOYSTICK_PERCENT)
1418 else if (right>JOYSTICK_PERCENT)
1419 result |= JOY_RIGHT;
1420 if (up>JOYSTICK_PERCENT)
1422 else if (down>JOYSTICK_PERCENT)
1425 result |= JOY_BUTTON_1;
1427 result |= JOY_BUTTON_2;
1432 int JoystickButton()
1434 static int last_joy_button=0;
1435 int joy_button=(Joystick() & JOY_BUTTON);
1440 if (last_joy_button)
1441 result=JOY_BUTTON_PRESSED;
1443 result=JOY_BUTTON_NEW_PRESSED;
1447 if (last_joy_button)
1448 result=JOY_BUTTON_NEW_RELEASED;
1450 result=JOY_BUTTON_NOT_PRESSED;
1453 last_joy_button = joy_button;
1457 void CalibrateJoystick()
1459 struct joystick_control
1466 int new_joystick_xleft, new_joystick_xright, new_joystick_xmiddle;
1467 int new_joystick_yupper, new_joystick_ylower, new_joystick_ymiddle;
1469 if (joystick_status==JOYSTICK_OFF)
1473 DrawText(SX+16, SY+7*32, "MOVE JOYSTICK TO",FS_BIG,FC_YELLOW);
1474 DrawText(SX+16, SY+8*32, " THE UPPER LEFT ",FS_BIG,FC_YELLOW);
1475 DrawText(SX+16, SY+9*32, "AND PRESS BUTTON",FS_BIG,FC_YELLOW);
1478 joy_ctrl.buttons = 0;
1479 while(Joystick() & JOY_BUTTON);
1480 while(!joy_ctrl.buttons)
1482 if (read(joystick_device, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
1484 joystick_status=JOYSTICK_OFF;
1490 new_joystick_xleft = joy_ctrl.x;
1491 new_joystick_yupper = joy_ctrl.y;
1494 DrawText(SX+16, SY+7*32, "MOVE JOYSTICK TO",FS_BIG,FC_YELLOW);
1495 DrawText(SX+32, SY+8*32, "THE LOWER RIGHT",FS_BIG,FC_YELLOW);
1496 DrawText(SX+16, SY+9*32, "AND PRESS BUTTON",FS_BIG,FC_YELLOW);
1499 joy_ctrl.buttons = 0;
1500 while(Joystick() & JOY_BUTTON);
1501 while(!joy_ctrl.buttons)
1503 if (read(joystick_device, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
1505 joystick_status=JOYSTICK_OFF;
1511 new_joystick_xright = joy_ctrl.x;
1512 new_joystick_ylower = joy_ctrl.y;
1515 DrawText(SX+32, SY+16+7*32, "CENTER JOYSTICK",FS_BIG,FC_YELLOW);
1516 DrawText(SX+16, SY+16+8*32, "AND PRESS BUTTON",FS_BIG,FC_YELLOW);
1519 joy_ctrl.buttons = 0;
1520 while(Joystick() & JOY_BUTTON);
1521 while(!joy_ctrl.buttons)
1523 if (read(joystick_device, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
1525 joystick_status=JOYSTICK_OFF;
1531 new_joystick_xmiddle = joy_ctrl.x;
1532 new_joystick_ymiddle = joy_ctrl.y;
1534 joystick[joystick_nr].xleft = new_joystick_xleft;
1535 joystick[joystick_nr].yupper = new_joystick_yupper;
1536 joystick[joystick_nr].xright = new_joystick_xright;
1537 joystick[joystick_nr].ylower = new_joystick_ylower;
1538 joystick[joystick_nr].xmiddle = new_joystick_xmiddle;
1539 joystick[joystick_nr].ymiddle = new_joystick_ymiddle;
1541 CheckJoystickData();
1544 while(Joystick() & JOY_BUTTON);
1550 DrawText(SX+16, SY+16, "NO JOYSTICK",FS_BIG,FC_YELLOW);
1551 DrawText(SX+16, SY+48, " AVAILABLE ",FS_BIG,FC_YELLOW);