* tools.c *
***********************************************************/
+#include <stdarg.h>
+
#ifdef __FreeBSD__
#include <machine/joystick.h>
#endif
#include "cartoons.h"
#include "network.h"
-#include <math.h>
-
#ifdef MSDOS
extern boolean wait_for_vsync;
#endif
this could mean that we have to wait for the graphics to complete,
although we could go on doing calculations for the next frame */
- XSync(display,FALSE);
+ XSync(display, FALSE);
+ /*
#ifdef MSDOS
wait_for_vsync = TRUE;
#endif
+ */
if (redraw_mask & REDRAW_ALL)
{
if (setup.soft_scrolling)
{
- fx += (ScreenMovDir & (MV_LEFT|MV_RIGHT) ? ScreenGfxPos : 0);
- fy += (ScreenMovDir & (MV_UP|MV_DOWN) ? ScreenGfxPos : 0);
+ fx += (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0);
+ fy += (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0);
}
- XCopyArea(display,buffer,window,gc,
- fx,fy, SXSIZE,SYSIZE,
- SX,SY);
+ if (setup.soft_scrolling ||
+ ABS(ScreenGfxPos) + ScrollStepSize == TILEX ||
+ ABS(ScreenGfxPos) == ScrollStepSize ||
+ redraw_tiles > REDRAWTILES_THRESHOLD)
+ XCopyArea(display, buffer, window, gc, fx, fy, SXSIZE, SYSIZE, SX, SY);
}
redraw_mask &= ~REDRAW_MAIN;
}
VX+VIDEO_CONTROL_XPOS,VY+VIDEO_CONTROL_YPOS);
}
}
+ if (redraw_mask & REDRAW_DOOR_3)
+ XCopyArea(display, backbuffer, window, gc,
+ EX, EY, EXSIZE, EYSIZE,
+ EX, EY);
redraw_mask &= ~REDRAW_DOORS;
}
redraw_mask |= REDRAW_FIELD;
}
-void DrawText(int x, int y, char *text, int font, int col)
+void DrawTextFCentered(int y, int font_type, char *format, ...)
+{
+ char buffer[FULL_SXSIZE / FONT3_XSIZE + 10];
+ int font_xsize;
+ va_list ap;
+
+ font_xsize = (font_type < FC_SPECIAL1 ? FONT2_XSIZE :
+ font_type < FC_SPECIAL2 ? FONT3_XSIZE : FONT4_XSIZE);
+
+ va_start(ap, format);
+ vsprintf(buffer, format, ap);
+ va_end(ap);
+
+ DrawText(SX + (SXSIZE - strlen(buffer) * font_xsize) / 2, SY + y,
+ buffer, FS_SMALL, font_type);
+}
+
+void DrawTextF(int x, int y, int font_type, char *format, ...)
{
- DrawTextExt(drawto, gc, x, y, text, font, col);
+ char buffer[FULL_SXSIZE / FONT3_XSIZE + 10];
+ va_list ap;
+
+ va_start(ap, format);
+ vsprintf(buffer, format, ap);
+ va_end(ap);
+
+ DrawText(SX + x, SY + y, buffer, FS_SMALL, font_type);
+}
+
+void DrawText(int x, int y, char *text, int font_size, int font_type)
+{
+ DrawTextExt(drawto, gc, x, y, text, font_size, font_type);
+
if (x < DX)
redraw_mask |= REDRAW_FIELD;
else if (y < VY)
}
void DrawTextExt(Drawable d, GC gc, int x, int y,
- char *text, int font, int font_color)
+ char *text, int font_size, int font_type)
{
int font_width, font_height, font_start;
int font_pixmap;
- if (font != FS_SMALL && font != FS_BIG)
- font = FS_SMALL;
- if (font_color < FC_RED || font_color > FC_SPECIAL2)
- font_color = FC_RED;
-
- font_width = (font == FS_BIG ? FONT1_XSIZE :
- font_color < FC_SPECIAL1 ? FONT2_XSIZE :
- font_color < FC_SPECIAL2 ? FONT3_XSIZE : FONT4_XSIZE);
- font_height = (font == FS_BIG ? FONT1_XSIZE :
- font_color < FC_SPECIAL2 ? FONT2_XSIZE : FONT4_XSIZE);
- font_pixmap = (font == FS_BIG ? PIX_BIGFONT : PIX_SMALLFONT);
- font_start = (font_color * (font == FS_BIG ? FONT1_YSIZE : FONT2_YSIZE) *
+ if (font_size != FS_SMALL && font_size != FS_BIG)
+ font_size = FS_SMALL;
+ if (font_type < FC_RED || font_type > FC_SPECIAL2)
+ font_type = FC_RED;
+
+ font_width = (font_size == FS_BIG ? FONT1_XSIZE :
+ font_type < FC_SPECIAL1 ? FONT2_XSIZE :
+ font_type < FC_SPECIAL2 ? FONT3_XSIZE : FONT4_XSIZE);
+ font_height = (font_size == FS_BIG ? FONT1_XSIZE :
+ font_type < FC_SPECIAL2 ? FONT2_XSIZE : FONT4_XSIZE);
+ font_pixmap = (font_size == FS_BIG ? PIX_BIGFONT : PIX_SMALLFONT);
+ font_start = (font_type * (font_size == FS_BIG ? FONT1_YSIZE : FONT2_YSIZE) *
FONT_LINES_PER_FONT);
while(*text)
src_x = (graphic % HEROES_PER_LINE) * TILEX + cx;
src_y = (graphic / HEROES_PER_LINE) * TILEY + cy;
}
+ else /* big font graphics currently not allowed (and not needed) */
+ return;
dest_x = FX + x * TILEX + dx;
dest_y = FY + y * TILEY + dy;
int mx, my, ty, result = -1;
unsigned int old_door_state;
+#ifndef MSDOS
/* pause network game while waiting for request to answer */
if (options.network &&
game_status == PLAYING &&
req_state & REQUEST_WAIT_FOR)
SendToServer_PausePlaying();
+#endif
old_door_state = GetDoorState();
}
}
+#ifndef MSDOS
/* continue network game after request */
if (options.network &&
game_status == PLAYING &&
req_state & REQUEST_WAIT_FOR)
SendToServer_ContinuePlaying();
+#endif
return(result);
}
unsigned int MoveDoor(unsigned int door_state)
{
- static unsigned int door1 = DOOR_OPEN_1;
- static unsigned int door2 = DOOR_CLOSE_2;
- static long door_delay = 0;
+ static int door1 = DOOR_OPEN_1;
+ static int door2 = DOOR_CLOSE_2;
+ static unsigned long door_delay = 0;
int x, start, stepsize = 2;
- long door_delay_value = stepsize * 5;
+ unsigned long door_delay_value = stepsize * 5;
if (door_state == DOOR_GET_STATE)
return(door1 | door2);