From: Holger Schemel Date: Sun, 15 Jul 2001 15:47:27 +0000 (+0200) Subject: rnd-20010715-1-src X-Git-Tag: 2.0.1^2~18 X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=commitdiff_plain;h=b40c5be44ed492da183f29d9f2f8184391c31cf0 rnd-20010715-1-src --- diff --git a/Makefile b/Makefile index a4db1d9d..4da272c5 100644 --- a/Makefile +++ b/Makefile @@ -57,7 +57,10 @@ sdl: @$(MAKE_CMD) TARGET=sdl solaris: - @$(MAKE_CMD) PLATFORM=solaris + @$(MAKE_CMD) PLATFORM=solaris TARGET=x11 + +solaris-sdl: + @$(MAKE_CMD) PLATFORM=solaris TARGET=sdl msdos: @$(MAKE_CMD) PLATFORM=msdos diff --git a/src/Makefile b/src/Makefile index 21c753a3..3269ec51 100644 --- a/src/Makefile +++ b/src/Makefile @@ -23,10 +23,15 @@ endif AR = ar RANLIB = ranlib +BMP2ICO = bmp2ico +WINDRES = windres + ifeq ($(PLATFORM),msdos) # MS-DOS native compiling RM = del -PROGNAME = ../rocks.exe + +PROGBASE = rocks +PROGNAME = ../$(PROGBASE).exe SYS_CFLAGS = -DTARGET_X11 SYS_LDFLAGS = -s -lalleg @@ -34,7 +39,9 @@ SYS_LDFLAGS = -s -lalleg else # Unix or cross-compiling for MS-DOS and Win32 RM = rm -f -PROGNAME = ../rocksndiamonds + +PROGBASE = rocksndiamonds +PROGNAME = ../$(PROGBASE) ifeq ($(PLATFORM),solaris) EXTRA_LDFLAGS = -lnsl -lsocket -R$(XLIB_PATH) @@ -46,12 +53,13 @@ PROFILING_FLAGS = -pg endif ifeq ($(PLATFORM),cross-msdos) -PROGNAME = ../rocks.exe +PROGBASE = rocks +PROGNAME = ../$(PROGBASE).exe TARGET = allegro endif ifeq ($(PLATFORM),cross-win32) -PROGNAME = ../rocksndiamonds.exe +PROGNAME = ../$(PROGBASE).exe TARGET = sdl endif @@ -135,15 +143,25 @@ OBJS = main.o \ LIBDIR = libgame LIBGAME = $(LIBDIR)/libgame.a +ICONBASE = windows_icon +ifeq ($(PLATFORM),cross-win32) +ICON32X32 = ../graphics/$(ICONBASE)_32x32.bmp +ICON = $(ICONBASE).o +endif + all: $(PROGNAME) -$(PROGNAME): $(LIBGAME) $(OBJS) - $(CC) $(PROFILING) $(OBJS) $(LIBGAME) $(LDFLAGS) -o $(PROGNAME) +$(PROGNAME): $(LIBGAME) $(OBJS) $(ICON) + $(CC) $(PROFILING) $(OBJS) $(ICON) $(LIBGAME) $(LDFLAGS) -o $(PROGNAME) $(LIBGAME): $(MAKE) -C $(LIBDIR) +$(ICON): + $(BMP2ICO) -transparent $(ICONBASE).ico $(ICON32X32) + echo "$(ICONBASE) ICON $(ICONBASE).ico" | $(WINDRES) -o $(ICON) + .c.o: $(CC) $(PROFILING) $(CFLAGS) -c $*.c @@ -152,11 +170,15 @@ clean-obj: $(RM) $(OBJS) $(RM) $(LIBGAME) +clean-ico: + $(RM) $(ICONBASE).ico + $(RM) $(ICONBASE).o + clean-bin: $(RM) $(PROGNAME) $(RM) ../*.exe -clean: clean-obj clean-bin +clean: clean-obj clean-ico clean-bin #-----------------------------------------------------------------------------# diff --git a/src/game.c b/src/game.c index 3db4e1bc..37608e5d 100644 --- a/src/game.c +++ b/src/game.c @@ -4292,6 +4292,51 @@ static void PlayerActions(struct PlayerInfo *player, byte player_action) } } +static void sleep_milliseconds_x(unsigned long milliseconds_delay) +{ + boolean do_busy_waiting = (milliseconds_delay < 5 ? TRUE : FALSE); + +#if defined(PLATFORM_MSDOS) + /* don't use select() to perform waiting operations under DOS/Windows + environment; always use a busy loop for waiting instead */ + do_busy_waiting = TRUE; +#endif + + + + do_busy_waiting = TRUE; + + + + if (do_busy_waiting) + { + /* we want to wait only a few ms -- if we assume that we have a + kernel timer resolution of 10 ms, we would wait far to long; + therefore it's better to do a short interval of busy waiting + to get our sleeping time more accurate */ + + unsigned long base_counter = Counter(), actual_counter = Counter(); + + while (actual_counter < base_counter + milliseconds_delay && + actual_counter >= base_counter) + actual_counter = Counter(); + } + else + { +#if defined(TARGET_SDL) + SDL_Delay(milliseconds_delay); +#else + struct timeval delay; + + delay.tv_sec = milliseconds_delay / 1000; + delay.tv_usec = 1000 * (milliseconds_delay % 1000); + + if (select(0, NULL, NULL, NULL, &delay) != 0) + Error(ERR_WARN, "sleep_milliseconds(): select() failed"); +#endif + } +} + void GameActions() { static unsigned long action_delay = 0; @@ -4309,7 +4354,45 @@ void GameActions() /* ---------- main game synchronization point ---------- */ - WaitUntilDelayReached(&action_delay, action_delay_value); + + +#if 1 + WaitUntilDelayReached(&action_delay, action_delay_value); +#else + { + unsigned long count1 = SDL_GetTicks(), count2, current_ms, test; + + /* + WaitUntilDelayReached(&action_delay, action_delay_value); + */ + + /* + SDL_Delay(20); + */ + + /* + sleep_milliseconds_x(20); + */ + + current_ms = SDL_GetTicks(); + test = -1; + while (current_ms < count1 + 20) + { + current_ms = SDL_GetTicks(); /* busy wait! */ + + if (test != current_ms) + { + Error(ERR_RETURN, "current_ms == %ld", current_ms); + test = current_ms; + } + } + + count2 = SDL_GetTicks(); + Error(ERR_RETURN, "delay == %ld", count2 - count1); + } +#endif + + if (network_playing && !network_player_action_received) {