From a47f213588e727442e8e253742fcd330360d8f30 Mon Sep 17 00:00:00 2001 From: johns <> Date: Thu, 28 Mar 2002 00:49:59 +0000 Subject: [PATCH] Renamed FrameCounter to GameCycle. Network timeouts, didn't block mouse and scrolling. --- doc/ChangeLog.html | 3 + src/action/action_build.cpp | 8 +-- src/action/action_follow.cpp | 2 +- src/action/action_minegold.cpp | 4 +- src/action/action_move.cpp | 5 +- src/action/action_research.cpp | 7 +- src/action/action_returngoods.cpp | 6 +- src/action/action_still.cpp | 7 +- src/action/action_train.cpp | 6 +- src/action/action_upgradeto.cpp | 7 +- src/action/actions.cpp | 9 ++- src/ai/script_ai.cpp | 6 +- src/include/myendian.h | 2 +- src/include/network.h | 15 ++-- src/include/video.h | 6 +- src/map/minimap.cpp | 3 +- src/network/commands.cpp | 6 +- src/network/netconnect.cpp | 6 +- src/network/network.cpp | 109 +++++++++++++++--------------- src/pathfinder/astar.cpp | 7 +- src/sound/sound_server.cpp | 3 +- src/stratagus/mainloop.cpp | 54 +++++++++------ src/stratagus/player.cpp | 8 +-- src/stratagus/spells.cpp | 42 ++++++------ src/stratagus/stratagus.cpp | 2 +- src/ui/mainscr.cpp | 6 +- src/unit/unit.cpp | 26 +++---- src/video/X11.cpp | 7 +- src/video/sdl.cpp | 82 ++++------------------ src/video/svgalib.cpp | 9 ++- src/video/wince.cpp | 11 ++- 31 files changed, 216 insertions(+), 258 deletions(-) diff --git a/doc/ChangeLog.html b/doc/ChangeLog.html index 87b561f8b..0f00239b5 100644 --- a/doc/ChangeLog.html +++ b/doc/ChangeLog.html @@ -753,6 +753,9 @@ <LI>Split sound_server.c into wav.c, oss_audio.c and sdl_audio.c. <LI>Ogg, mp3 audio format support added. <LI>Randomize startpositions of network play (from Daniel Burrows). + <LI>Renamed FrameCounter to GameCycle. + <LI>Network timeout didn't block mouse movement and scrolling. + <LI>Removed WaitAndKeepSync from GameLoop. <LI>+++ </UL> </UL> diff --git a/src/action/action_build.cpp b/src/action/action_build.cpp index ae19eb67c..f5898b32e 100644 --- a/src/action/action_build.cpp +++ b/src/action/action_build.cpp @@ -77,7 +77,7 @@ global void HandleActionBuild(Unit* unit) if( unit->SubAction++<10 ) { // To keep the load low, retry each 1/4 second. // NOTE: we can already inform the AI about this problem? - unit->Wait=FRAMES_PER_SECOND/4+unit->SubAction; + unit->Wait=CYCLES_PER_SECOND/4+unit->SubAction; return; } @@ -122,7 +122,7 @@ global void HandleActionBuild(Unit* unit) if( unit->SubAction++<10 ) { // To keep the load low, retry each 1/4 second. // NOTE: we can already inform the AI about this problem? - unit->Wait=FRAMES_PER_SECOND/4+unit->SubAction; + unit->Wait=CYCLES_PER_SECOND/4+unit->SubAction; return; } @@ -201,7 +201,7 @@ global void HandleActionBuild(Unit* unit) build->Orders[0].Action=UnitActionBuilded; build->Data.Builded.Sum=0; // FIXME: Is it necessary? build->Data.Builded.Val=stats->HitPoints; - n=(stats->Costs[TimeCost]*FRAMES_PER_SECOND/6)/(SpeedBuild*5); + n=(stats->Costs[TimeCost]*CYCLES_PER_SECOND/6)/(SpeedBuild*5); if( n ) { build->Data.Builded.Add=stats->HitPoints/n; } else { // No build time pops-up? @@ -215,7 +215,7 @@ global void HandleActionBuild(Unit* unit) DebugLevel3Fn("Build Sum %d, Add %d, Val %d, Sub %d\n" ,build->Data.Builded.Sum,build->Data.Builded.Add ,build->Data.Builded.Val,build->Data.Builded.Sub); - build->Wait=FRAMES_PER_SECOND/6; + build->Wait=CYCLES_PER_SECOND/6; // // Building oil-platform, must remove oil-patch. diff --git a/src/action/action_follow.cpp b/src/action/action_follow.cpp index c2a9a0844..3727dba18 100644 --- a/src/action/action_follow.cpp +++ b/src/action/action_follow.cpp @@ -104,7 +104,7 @@ global void HandleActionFollow(Unit* unit) // if( unit->SubAction++<10 ) { // To keep the load low, retry delayed. - unit->Wait=FRAMES_PER_SECOND/10+unit->SubAction; + unit->Wait=CYCLES_PER_SECOND/10+unit->SubAction; break; } // FALL THROUGH diff --git a/src/action/action_minegold.cpp b/src/action/action_minegold.cpp index 7fb1afe4b..02c057e82 100644 --- a/src/action/action_minegold.cpp +++ b/src/action/action_minegold.cpp @@ -495,7 +495,7 @@ global void HandleActionMineGold(Unit* unit) } } else { // To keep the load low, retry each 1/4 second. - unit->Wait=unit->SubAction+FRAMES_PER_SECOND/4; + unit->Wait=unit->SubAction+CYCLES_PER_SECOND/4; } } else { unit->SubAction=64; @@ -530,7 +530,7 @@ global void HandleActionMineGold(Unit* unit) } } else { // To keep the load low, retry each 1/4 second. - unit->Wait=unit->SubAction-64+FRAMES_PER_SECOND/4; + unit->Wait=unit->SubAction-64+CYCLES_PER_SECOND/4; } } else { unit->SubAction=128; diff --git a/src/action/action_move.cpp b/src/action/action_move.cpp index 3a67b0539..a29dbf0f2 100644 --- a/src/action/action_move.cpp +++ b/src/action/action_move.cpp @@ -14,8 +14,7 @@ // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the License, -// or (at your option) any later version. +// by the Free Software Foundation; either only 2 of the License. // // FreeCraft is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -280,7 +279,7 @@ global void HandleActionMove(Unit* unit) // if( unit->SubAction++<10 ) { // To keep the load low, retry delayed. - unit->Wait=FRAMES_PER_SECOND/10+unit->SubAction; + unit->Wait=CYCLES_PER_SECOND/10+unit->SubAction; // FIXME: Now the units didn't defend themself :((((((( break; } diff --git a/src/action/action_research.cpp b/src/action/action_research.cpp index bb39a191c..935811d09 100644 --- a/src/action/action_research.cpp +++ b/src/action/action_research.cpp @@ -10,12 +10,11 @@ // /**@name action_research.c - The research action. */ // -// (c) Copyright 1998,2000,2001 by Lutz Sammer +// (c) Copyright 1998,2000-2002 by Lutz Sammer // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the License, -// or (at your option) any later version. +// by the Free Software Foundation; only version 2 of the License. // // FreeCraft is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -113,7 +112,7 @@ global void HandleActionResearch(Unit* unit) } unit->Reset=1; - unit->Wait=FRAMES_PER_SECOND/6; + unit->Wait=CYCLES_PER_SECOND/6; // FIXME: should be animations here? } diff --git a/src/action/action_returngoods.cpp b/src/action/action_returngoods.cpp index eed2ac140..783a162af 100644 --- a/src/action/action_returngoods.cpp +++ b/src/action/action_returngoods.cpp @@ -97,7 +97,8 @@ global void HandleActionReturnGoods(Unit* unit) unit->Orders[0].X=unit->X; unit->Orders[0].Y=unit->Y; // Return point to continue. DebugLevel3("Return to %d=%d,%d\n" - ,UnitNumber(destu),unit->Orders[0].X,unit->Orders[0].Y); + ,UnitNumber(unit->Orders[0].Goal) + ,unit->Orders[0].X,unit->Orders[0].Y); unit->Orders[0].Action=UnitActionHarvest; unit->Orders[0].Arg1=(void*)-1; NewResetPath(unit); @@ -119,7 +120,8 @@ global void HandleActionReturnGoods(Unit* unit) ++destu->Refs; } DebugLevel3("Return to %d=%d,%d\n" - ,UnitNumber(destu),unit->Orders[0].X,unit->Orders[0].Y); + ,UnitNumber(unit->Orders[0].Goal) + ,unit->Orders[0].X,unit->Orders[0].Y); unit->Orders[0].Action=UnitActionHaulOil; unit->Orders[0].Arg1=(void*)-1; NewResetPath(unit); diff --git a/src/action/action_still.cpp b/src/action/action_still.cpp index 118322e78..8e1553419 100644 --- a/src/action/action_still.cpp +++ b/src/action/action_still.cpp @@ -10,12 +10,11 @@ // /**@name action_still.c - The stand still action. */ // -// (c) Copyright 1998,2000,2001 by Lutz Sammer +// (c) Copyright 1998,2000-2002 by Lutz Sammer // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the License, -// or (at your option) any later version. +// by the Free Software Foundation; only version 2 of the License. // // FreeCraft is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -63,7 +62,7 @@ global void ActionStillGeneric(Unit* unit,int ground) if( unit->Removed ) { // Removed units, do nothing? // If peon is in building or unit is in transporter it is removed. - unit->Wait=FRAMES_PER_SECOND/6; + unit->Wait=CYCLES_PER_SECOND/6; return; } diff --git a/src/action/action_train.cpp b/src/action/action_train.cpp index 009fd11f6..365acc2df 100644 --- a/src/action/action_train.cpp +++ b/src/action/action_train.cpp @@ -82,7 +82,7 @@ global void HandleActionTrain(Unit* unit) unit->Data.Train.Ticks=unit->Data.Train.What[0] ->Stats[player->Player].Costs[TimeCost]; unit->Reset=1; - unit->Wait=FRAMES_PER_SECOND/6; + unit->Wait=CYCLES_PER_SECOND/6; return; } @@ -103,7 +103,7 @@ global void HandleActionTrain(Unit* unit) unit->Data.Train.Ticks=unit->Data.Train.What[0] ->Stats[player->Player].Costs[TimeCost]; unit->Reset=1; - unit->Wait=FRAMES_PER_SECOND/6; + unit->Wait=CYCLES_PER_SECOND/6; return; } @@ -182,7 +182,7 @@ global void HandleActionTrain(Unit* unit) } unit->Reset=1; - unit->Wait=FRAMES_PER_SECOND/6; + unit->Wait=CYCLES_PER_SECOND/6; } //@} diff --git a/src/action/action_upgradeto.cpp b/src/action/action_upgradeto.cpp index dd3db2b43..a9af030b2 100644 --- a/src/action/action_upgradeto.cpp +++ b/src/action/action_upgradeto.cpp @@ -10,12 +10,11 @@ // /**@name action_upgradeto.c - The unit upgrading to new action. */ // -// (c) Copyright 1998,2000,2001 by Lutz Sammer +// (c) Copyright 1998,2000-2002 by Lutz Sammer // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the License, -// or (at your option) any later version. +// by the Free Software Foundation; only version 2 of the License. // // FreeCraft is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -109,7 +108,7 @@ global void HandleActionUpgradeTo(Unit* unit) } unit->Reset=1; - unit->Wait=FRAMES_PER_SECOND/6; + unit->Wait=CYCLES_PER_SECOND/6; } //@} diff --git a/src/action/actions.cpp b/src/action/actions.cpp index c1ad939b3..e4b1a6952 100644 --- a/src/action/actions.cpp +++ b/src/action/actions.cpp @@ -10,12 +10,11 @@ // /**@name actions.c - The actions. */ // -// (c) Copyright 1998,2000,2001 by Lutz Sammer +// (c) Copyright 1998,2000-2002 by Lutz Sammer // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the License, -// or (at your option) any later version. +// by the Free Software Foundation; only version 2 of the License. // // FreeCraft is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -327,7 +326,7 @@ local void HandleUnitAction(Unit* unit) } /** -** Update the actions of all units each frame. +** Update the actions of all units each game cycle. ** ** IDEA: to improve the preformance use slots for waiting. */ @@ -416,7 +415,7 @@ global void UnitActions(void) fprintf(logf,";;;\tMap: %s\n\n",TheMap.Description); } - fprintf(logf,"%d: ",FrameCounter); + fprintf(logf,"%d: ",GameCycle); fprintf(logf,"%d %s S%d/%d-%d P%d Refs %d\n", UnitNumber(unit),unit->Type ? unit->Type->Ident : "unit-killed", unit->State,unit->SubAction, diff --git a/src/ai/script_ai.cpp b/src/ai/script_ai.cpp index 5954d63af..14f255c17 100644 --- a/src/ai/script_ai.cpp +++ b/src/ai/script_ai.cpp @@ -776,15 +776,15 @@ local SCM CclAiSleep(SCM value) { int i; - DebugLevel3Fn("%d %d\n",FrameCounter,AiPlayer->SleepFrames); + DebugLevel3Fn("%lu %d\n",GameCycle,AiPlayer->SleepFrames); if( AiPlayer->SleepFrames ) { - if( AiPlayer->SleepFrames<FrameCounter ) { + if( AiPlayer->SleepFrames<GameCycle ) { AiPlayer->SleepFrames=0; return SCM_BOOL_F; } } else { i=gh_scm2int(value); - AiPlayer->SleepFrames=FrameCounter+i; + AiPlayer->SleepFrames=GameCycle+i; } return SCM_BOOL_T; diff --git a/src/include/myendian.h b/src/include/myendian.h index 4836470c5..f7a5ff939 100644 --- a/src/include/myendian.h +++ b/src/include/myendian.h @@ -135,7 +135,7 @@ extern unsigned inline _FetchLE32(unsigned char **pp) { #include <sys/types.h> #else #include <endian.h> -#endif /* __FreeBSD__ */ +#endif // __FreeBSD__ #if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN #include <byteswap.h> diff --git a/src/include/network.h b/src/include/network.h index ae261e949..cc086cbb0 100644 --- a/src/include/network.h +++ b/src/include/network.h @@ -10,12 +10,11 @@ // /**@name network.h - The network header file. */ // -// (c) Copyright 1998-2001 by Lutz Sammer +// (c) Copyright 1998-2002 by Lutz Sammer // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the License, -// or (at your option) any later version. +// by the Free Software Foundation; only version 2 of the License. // // FreeCraft is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -41,7 +40,7 @@ -- Defines ----------------------------------------------------------------------------*/ -#define NetworkMaxLag 250 /// Debuging network lag (# frames) +#define NetworkMaxLag 250 /// Debuging network lag (# game cycles) #define NetworkDups 4 /// Repeat old commands @@ -105,7 +104,7 @@ typedef struct _ack_message_ { */ typedef struct _network_command_ { unsigned char Type; /// Network command type. - unsigned char Frame; /// Destination frame. + unsigned char Cycle; /// Destination game cycle. UnitRef Unit; /// Command for unit. unsigned short X; /// Map position X. unsigned short Y; /// Map position Y. @@ -126,7 +125,7 @@ typedef struct _network_packet_ { ** Network chat message. */ typedef struct _network_chat_ { - unsigned char Frame; /// Destination frame + unsigned char Cycle; /// Destination game cycle unsigned char Type; /// Network command type unsigned char Player; /// Sending player char Text[7]; /// Message bytes @@ -139,8 +138,8 @@ typedef struct _network_chat_ { extern int NetworkNumInterfaces; /// Network number of interfaces extern int NetworkFildes; /// Network file descriptor extern int NetworkInSync; /// Network is in sync -extern int NetworkUpdates; /// Network update each # frames -extern int NetworkLag; /// Network lag (# frames) +extern int NetworkUpdates; /// Network update each # game cycles +extern int NetworkLag; /// Network lag (# game cycles) /*---------------------------------------------------------------------------- -- Functions diff --git a/src/include/video.h b/src/include/video.h index 34d29ed0a..37e9d29b5 100644 --- a/src/include/video.h +++ b/src/include/video.h @@ -112,7 +112,7 @@ struct _palette_link_ { }; /// MACRO defines speed of colorcycling FIXME: should be made configurable -#define COLOR_CYCLE_SPEED (FRAMES_PER_SECOND/4) +#define COLOR_CYCLE_SPEED (CYCLES_PER_SECOND/4) // FIXME: not quite correct for new multiple palette version /// System-Wide used colors. @@ -435,9 +435,9 @@ extern global VMemType8* VideoFindNewPalette8( const VMemType8 *cube, /** ** Video synchronization speed. Synchronization time in prozent. ** If =0, video framerate is not synchronized. 100 is exact - ** FRAMES_PER_SECOND (30). Game will try to redraw screen within + ** CYCLES_PER_SECOND (30). Game will try to redraw screen within ** intervals of VideoSyncSpeed, not more, not less. - ** @see FRAMES_PER_SECOND @see VideoInterrupts + ** @see CYCLES_PER_SECOND @see VideoInterrupts */ extern int VideoSyncSpeed; diff --git a/src/map/minimap.cpp b/src/map/minimap.cpp index b934e6d44..86a4b6f7f 100644 --- a/src/map/minimap.cpp +++ b/src/map/minimap.cpp @@ -14,8 +14,7 @@ // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the License, -// or (at your option) any later version. +// by the Free Software Foundation; only version 2 of the License. // // FreeCraft is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/src/network/commands.cpp b/src/network/commands.cpp index a4836daa6..534f09db8 100644 --- a/src/network/commands.cpp +++ b/src/network/commands.cpp @@ -104,8 +104,8 @@ local void CommandLog(const char* name,const Unit* unit,int flag, // // Frame, unit, (type-ident only for better readable. // - fprintf(logf,"(log %d 'U%d '%s '%s '%s", - FrameCounter,UnitNumber(unit),unit->Type->Ident,name, + fprintf(logf,"(log %lu 'U%d '%s '%s '%s", + GameCycle,UnitNumber(unit),unit->Type->Ident,name, flag ? "flush" : "append"); // @@ -599,7 +599,7 @@ global void ParseCommand(unsigned short msgnr,UnitRef unum, Unit *unit, *dest; int id, status; - DebugLevel3Fn(" %d frame %d\n", msgnr, FrameCounter); + DebugLevel3Fn(" %d cycle %lu\n", msgnr, GameCycle); unit=UnitSlots[unum]; DebugCheck( !unit ); diff --git a/src/network/netconnect.cpp b/src/network/netconnect.cpp index 33d0879f0..571bb411d 100644 --- a/src/network/netconnect.cpp +++ b/src/network/netconnect.cpp @@ -643,7 +643,8 @@ char *ncconstatenames[] = { #endif /** -** Send a message to the server, but only if the last packet was a while ago +** Send a message to the server, but only if the last packet was a while +** ago ** ** @param msg The message to send ** @param msecs microseconds to delay @@ -664,7 +665,8 @@ local void NetworkSendRateLimitedClientMessage(InitMessage *msg, long msecs) } n = NetworkSendICMessage(NetworkServerIP, htons(NetworkServerPort), msg); DebugLevel0Fn("Sending Init Message (%s:%d): %d:%d(%d) %d.%d.%d.%d:%d\n", - ncconstatenames[NetLocalState], NetStateMsgCnt, msg->Type, msg->SubType, n, + ncconstatenames[NetLocalState], NetStateMsgCnt, msg->Type, + msg->SubType, n, NIPQUAD(ntohl(NetworkServerIP)), NetworkServerPort); } } diff --git a/src/network/network.cpp b/src/network/network.cpp index f4812d483..fbdac828a 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -117,10 +117,10 @@ ** ** @li [IP Header - 20 bytes] ** @li [UDP Header - 8 bytes] -** @li [Type 1 byte][Frame 1 byte][Data 8 bytes] - Slot 0 -** @li [Type 1 byte][Frame 1 byte][Data 8 bytes] - Slot 1 -** @li [Type 1 byte][Frame 1 byte][Data 8 bytes] - Slot 2 -** @li [Type 1 byte][Frame 1 byte][Data 8 bytes] - Slot 3 +** @li [Type 1 byte][Cycle 1 byte][Data 8 bytes] - Slot 0 +** @li [Type 1 byte][Cycle 1 byte][Data 8 bytes] - Slot 1 +** @li [Type 1 byte][Cycle 1 byte][Data 8 bytes] - Slot 2 +** @li [Type 1 byte][Cycle 1 byte][Data 8 bytes] - Slot 3 ** ** @subsection internals Putting it together ** @@ -129,8 +129,8 @@ ** some time to reach the other clients (lag), so the command is not ** executed immediatly on the local computer, it is stored in a delay ** queue and send to all other clients. After a delay of ::NetworkLag -** frames the commands of the other players are received and executed -** together with the local command. Each ::NetworkUpdates frames there +** game cycles the commands of the other players are received and executed +** together with the local command. Each ::NetworkUpdates game cycles there ** must a package send, to keep the clients in sync, if there is no user ** command, a dummy sync package is send. ** To avoid too much trouble with lost packages, a package contains @@ -174,7 +174,7 @@ ** It would be better to transfer the group first and than only a ** single command for the complete group. ** -** @li The frame is transfered for each slot, this is not needed. We +** @li The game cycles is transfered for each slot, this is not needed. We ** can save some bytes if we compress this. ** ** @li We can sort the command by importants, currently all commands are @@ -265,8 +265,8 @@ typedef struct _network_command_queue_ { global int NetworkNumInterfaces; /// Network number of interfaces global int NetworkFildes = -1; /// Network file descriptor global int NetworkInSync = 1; /// Network is in sync -global int NetworkUpdates = 5; /// Network update each # frames -global int NetworkLag = 5; /// Network lag in # frames +global int NetworkUpdates = 5; /// Network update each # game cycles +global int NetworkLag = 5; /// Network lag in # game cycles local char NetMsgBuf[128][PlayerMax]; /// Chat message buffers local int NetMsgBufLen[PlayerMax]; /// Stored chat message length @@ -353,7 +353,7 @@ local void NetworkSendPacket(const NetworkCommandQueue *ncq) IfDebug( ++NetworkSendPackets ); - DebugLevel3Fn("In frame %d sending: ",FrameCounter); + DebugLevel3Fn("In cycle %lu sending: ",GameCycle); // // Build packet of 4 messages. @@ -486,7 +486,7 @@ global void InitNetwork2(void) for (i = 0; i <= NetworkLag; i += NetworkUpdates) { for (n = 0; n < HostsCount; ++n) { NetworkIn[i][Hosts[n].PlyNr].Time = i; - NetworkIn[i][Hosts[n].PlyNr].Data.Frame = i; + NetworkIn[i][Hosts[n].PlyNr].Data.Cycle = i; NetworkIn[i][Hosts[n].PlyNr].Data.Type = MessageSync; } } @@ -528,7 +528,7 @@ global void NetworkSendCommand(int command, const Unit *unit, int x, int y, ncq = malloc(sizeof(NetworkCommandQueue)); dl_insert_first(CommandsIn, ncq->List); - ncq->Time = FrameCounter; + ncq->Time = GameCycle; ncq->Data.Type = command; if (status) { ncq->Data.Type |= 0x80; @@ -614,9 +614,9 @@ global void NetworkEvent(void) if (nc->Type == MessageResend) { const NetworkCommandQueue *ncq; - // Destination frame (time to execute). - n = ((FrameCounter + 128) & ~0xFF) | nc->Frame; - if (n > FrameCounter + 128) { + // Destination cycle (time to execute). + n = ((GameCycle + 128) & ~0xFF) | nc->Cycle; + if (n > GameCycle + 128) { DebugLevel3Fn("+128 needed!\n"); n -= 0x100; } @@ -661,9 +661,9 @@ global void NetworkEvent(void) continue; } - // Destination frame (time to execute). - n = ((FrameCounter + 128) & ~0xFF) | nc->Frame; - if (n > FrameCounter + 128) { + // Destination cycle (time to execute). + n = ((GameCycle + 128) & ~0xFF) | nc->Cycle; + if (n > GameCycle + 128) { DebugLevel3Fn("+128 needed!\n"); n -= 0x100; } @@ -672,14 +672,14 @@ global void NetworkEvent(void) // FIXME: must support compressed sync slots. } - if (NetworkIn[nc->Frame][player].Time != n) { + if (NetworkIn[nc->Cycle][player].Time != n) { DebugLevel3Fn("Command %3d for %8d(%02X) got\n", - nc->Type, n, nc->Frame); + nc->Type, n, nc->Cycle); } // Place in network in - NetworkIn[nc->Frame][player].Time = n; - NetworkIn[nc->Frame][player].Data = *nc; + NetworkIn[nc->Cycle][player].Time = n; + NetworkIn[nc->Cycle][player].Data = *nc; } // @@ -687,7 +687,7 @@ global void NetworkEvent(void) // if (!NetworkInSync) { NetworkInSync = 1; - n = ((FrameCounter) / NetworkUpdates) * NetworkUpdates + NetworkUpdates; + n = ((GameCycle) / NetworkUpdates) * NetworkUpdates + NetworkUpdates; DebugLevel3Fn("wait for %d - ", n); for (player = 0; player < HostsCount; ++player) { if (NetworkIn[n & 0xFF][Hosts[player].PlyNr].Time != n) { @@ -695,7 +695,7 @@ global void NetworkEvent(void) break; } } - DebugLevel3("%d in sync %d\n", FrameCounter, NetworkInSync); + DebugLevel3("%lu in sync %d\n", GameCycle, NetworkInSync); } } @@ -707,7 +707,7 @@ global void NetworkQuit(void) NetworkCommand nc; nc.Type = MessageQuit; - nc.Frame = FrameCounter & 0xFF; + nc.Cycle = GameCycle & 0xFF; NetworkBroadcast(&nc, sizeof(NetworkCommand)); // FIXME: if lost? Need an acknowledge for QuitMessages. @@ -761,9 +761,9 @@ local void ParseNetworkCommand(const NetworkCommandQueue *ncq) case MessageSync: ply = ntohs(ncq->Data.X) << 16; ply |= ntohs(ncq->Data.Y); - if (ply != NetworkSyncSeeds[FrameCounter & 0xFF] + if (ply != NetworkSyncSeeds[GameCycle & 0xFF] || ntohs(ncq->Data.Unit) - != NetworkSyncHashs[FrameCounter & 0xFF]) { + != NetworkSyncHashs[GameCycle & 0xFF]) { DebugLevel0Fn("\n\aNetwork out of sync!\n\n"); } return; @@ -811,12 +811,12 @@ local void NetworkResendCommands(void) // Build packet of 4 messages. // packet.Commands[0].Type = MessageResend; - packet.Commands[0].Frame = - (FrameCounter / NetworkUpdates) * NetworkUpdates + NetworkUpdates; + packet.Commands[0].Cycle = + (GameCycle / NetworkUpdates) * NetworkUpdates + NetworkUpdates; - DebugLevel2Fn("In frame %d for frame %d(%x):", FrameCounter, - (FrameCounter / NetworkUpdates) * NetworkUpdates + NetworkUpdates, - packet.Commands[0].Frame); + DebugLevel2Fn("In cycle %lu for cycle %lu(%x):", GameCycle, + (GameCycle / NetworkUpdates) * NetworkUpdates + NetworkUpdates, + packet.Commands[0].Cycle); ncq = (NetworkCommandQueue *)(CommandsOut->last); @@ -871,8 +871,8 @@ local void NetworkSendCommands(void) dl_insert_first(CommandsOut, ncq->List); // Fill in the time - ncq->Time = FrameCounter + NetworkLag; - ncq->Data.Frame = ncq->Time & 0xFF; + ncq->Time = GameCycle + NetworkLag; + ncq->Data.Cycle = ncq->Time & 0xFF; DebugLevel3Fn("sending for %d\n", ncq->Time); NetworkSendPacket(ncq); @@ -900,12 +900,12 @@ local void NetworkExecCommands(void) while (!dl_empty(CommandsOut)) { ncq = (NetworkCommandQueue *)(CommandsOut->last); // FIXME: how many packets must be kept exactly? - // if (ncq->Time + NetworkLag + NetworkUpdates >= FrameCounter) - // THIS is too much if (ncq->Time >= FrameCounter) - if (ncq->Time + NetworkLag > FrameCounter) { + // if (ncq->Time + NetworkLag + NetworkUpdates >= GameCycle) + // THIS is too much if (ncq->Time >= GameCycle) + if (ncq->Time + NetworkLag > GameCycle) { break; } - DebugLevel3Fn("remove %d,%d\n", FrameCounter, ncq->Time); + DebugLevel3Fn("remove %lu,%d\n", GameCycle, ncq->Time); dl_remove_last(CommandsOut); free(ncq); } @@ -914,8 +914,8 @@ local void NetworkExecCommands(void) // ncq = (NetworkCommandQueue *)(CommandsOut->last); while (ncq->List->prev) { - if (ncq->Time == FrameCounter) { - DebugLevel3Fn("execute loc %d,%d\n", FrameCounter, ncq->Time); + if (ncq->Time == GameCycle) { + DebugLevel3Fn("execute loc %lu,%d\n", GameCycle, ncq->Time); ParseNetworkCommand(ncq); break; } @@ -925,14 +925,14 @@ local void NetworkExecCommands(void) // // Remove external commands. // - ncq = &NetworkIn[FrameCounter & 0xFF][i]; + ncq = &NetworkIn[GameCycle & 0xFF][i]; if (ncq->Time) { - DebugLevel3Fn("execute net %d,%d(%x),%d\n", - FrameCounter, i, FrameCounter & 0xFF, ncq->Time); - if (ncq->Time != FrameCounter) { - DebugLevel2Fn("frame %d idx %d time %d\n", - FrameCounter, FrameCounter & 0xFF, ncq->Time); - DebugCheck(ncq->Time != FrameCounter); + DebugLevel3Fn("execute net %lu,%d(%lx),%d\n", + GameCycle, i, GameCycle & 0xFF, ncq->Time); + if (ncq->Time != GameCycle) { + DebugLevel2Fn("cycle %lu idx %lu time %d\n", + GameCycle, GameCycle & 0xFF, ncq->Time); + DebugCheck(ncq->Time != GameCycle); } ParseNetworkCommand(ncq); } @@ -953,16 +953,16 @@ local void NetworkSyncCommands(void) // Check if all next messages are available. // NetworkInSync = 1; - n = FrameCounter + NetworkUpdates; + n = GameCycle + NetworkUpdates; for (i = 0; i < HostsCount; ++i) { DebugLevel3Fn("sync %d\n", Hosts[i].PlyNr); ncq = &NetworkIn[n & 0xFF][Hosts[i].PlyNr]; DebugLevel3Fn("sync %d==%d\n", ncq->Time, n); if (ncq->Time != n) { NetworkInSync = 0; - NetworkDelay = NetworkUpdates; + NetworkDelay = FrameCounter + NetworkUpdates; // FIXME: should send a resent request. - DebugLevel3Fn("%d not in sync %d\n", FrameCounter, n); + DebugLevel3Fn("%lu not in sync %d\n", GameCycle, n); break; } } @@ -977,8 +977,8 @@ global void NetworkCommands(void) // // Send messages to all clients (other players) // - if (!(FrameCounter % NetworkUpdates)) { - DebugLevel3Fn("Update %d\n", FrameCounter); + if (!(GameCycle % NetworkUpdates)) { + DebugLevel3Fn("Update %lu\n", GameCycle); NetworkSendCommands(); NetworkExecCommands(); @@ -993,11 +993,10 @@ global void NetworkCommands(void) global void NetworkRecover(void) { // Got no message just resent our oldest messages - // FIXME: must remove the use of VideoInterrupts! - if (NetworkDelay < VideoInterrupts) { + if (FrameCounter > NetworkDelay) { NetworkDelay += NetworkUpdates; if (!dl_empty(CommandsOut)) { - DebugLevel3Fn("%d %d\n", FrameCounter, VideoInterrupts); + DebugLevel3Fn("cycle %lu vi %d\n", GameCycle, VideoInterrupts); NetworkResendCommands(); } } diff --git a/src/pathfinder/astar.cpp b/src/pathfinder/astar.cpp index 9bdbedc61..27267d872 100644 --- a/src/pathfinder/astar.cpp +++ b/src/pathfinder/astar.cpp @@ -627,17 +627,18 @@ global int AStarNextPathElement(Unit* unit,int* pxd,int *pyd) */ global int NextPathElement(Unit* unit,int* pxd,int *pyd) { - static int LastFrameCounter; + static int LastGameCycle; static int UnreachableCounter; int result; // // Reduce the load, stop handling pathes if too many UNREACHABLE results. // - if( FrameCounter!=LastFrameCounter ) { - LastFrameCounter=FrameCounter; + if( GameCycle!=LastGameCycle ) { + LastGameCycle=GameCycle; UnreachableCounter=3; } + // FIXME: Can use the time left in frame. if( !UnreachableCounter ) { DebugLevel0Fn("Done too much %d.\n",UnitNumber(unit)); return PF_WAIT; diff --git a/src/sound/sound_server.cpp b/src/sound/sound_server.cpp index 3d849545e..66686bf82 100644 --- a/src/sound/sound_server.cpp +++ b/src/sound/sound_server.cpp @@ -210,7 +210,6 @@ local void MixMusicToStereo32(int* buffer, int size) if (n) { // End reached SCM cb; - DebugLevel3Fn("End of music %d\n", i); PlayingMusic = 0; if (ModFile) { ModPlug_Unload(ModFile); @@ -979,7 +978,7 @@ global void WriteSound(void) audio_buf_info info; ioctl(SoundFildes,SNDCTL_DSP_GETOSPACE,&info); - DebugLevel0("%d Free bytes %d\n",FrameCounter,info.bytes); + DebugLevel0("%lu Free bytes %d\n",GameCycle,info.bytes); if( info.bytes<sizeof(buffer) ) { return; } diff --git a/src/stratagus/mainloop.cpp b/src/stratagus/mainloop.cpp index 5253ab443..c00b12c27 100644 --- a/src/stratagus/mainloop.cpp +++ b/src/stratagus/mainloop.cpp @@ -52,6 +52,7 @@ #include "deco.h" #include "trigger.h" #include "campaign.h" +#include "sound_server.h" #if defined(USE_SDLCD) || defined(USE_LIBCDA) #include "sound_server.h" @@ -308,7 +309,7 @@ global void UpdateDisplay(void) { int f; f=(168*(NextFrameTicks-GetTicks())) - /((100*1000/FRAMES_PER_SECOND)/VideoSyncSpeed); + /((100*1000/CYCLES_PER_SECOND)/VideoSyncSpeed); if( f<0 || f>168 ) { f=168; } @@ -452,9 +453,18 @@ local void EnableDrawRefresh(void) */ global void GameMainLoop(void) { -#if defined(USE_SDLCD) || defined(USE_LIBCDA) - int counter = 30; -#endif + EventCallback callbacks; + + callbacks.ButtonPressed=(void*)HandleButtonDown; + callbacks.ButtonReleased=(void*)HandleButtonUp; + callbacks.MouseMoved=(void*)HandleMouseMove; + callbacks.MouseExit=(void*)HandleMouseExit; + + callbacks.KeyPressed=HandleKeyDown; + callbacks.KeyReleased=HandleKeyUp; + + callbacks.NetworkEvent=NetworkEvent; + callbacks.SoundReady=WriteSound; SetVideoSync(); EnableDrawRefresh(); @@ -462,11 +472,12 @@ global void GameMainLoop(void) GameRunning=1; for( ; GameRunning; ) { - // FIXME: The mouse and network should continue in pause mode! - if(!GamePaused) { - ++FrameCounter; - if( !FrameCounter ) { - // FIXME: tests with frame counters now fails :( + // + // Game logic part + // + if (!GamePaused && NetworkInSync) { + if( !++GameCycle ) { + // FIXME: tests with game cycle counter now fails :( // FIXME: Should happen in 68 years :) fprintf(stderr,"FIXME: *** round robin ***\n"); fprintf(stderr,"FIXME: *** round robin ***\n"); @@ -476,14 +487,8 @@ global void GameMainLoop(void) NetworkCommands(); // Get network commands UnitActions(); // handle units MissileActions(); // handle missiles - PlayersEachFrame(); // handle players - TriggersEachFrame(); // handle triggers -#if defined(USE_SDLCD) || defined(USE_LIBCDA) - if (counter --== 0) { - CDRomCheck(); - counter = 30; // every second - } -#endif + PlayersEachCycle(); // handle players + TriggersEachCycle(); // handle triggers MustRedraw&=~RedrawMinimap; // FIXME: this a little hack! // @@ -496,7 +501,7 @@ global void GameMainLoop(void) // Check game goals. // Check rescue of units. // - switch( FrameCounter%FRAMES_PER_SECOND ) { + switch( GameCycle%CYCLES_PER_SECOND ) { case 0: UnitIncrementMana(); // magic units break; @@ -518,13 +523,19 @@ global void GameMainLoop(void) case 6: // overtaking units RescueUnits(); break; - case 7: + case 7: // show order some time if( ShowOrdersCount ) { ShowOrdersCount--; } break; +#if defined(USE_SDLCD) || defined(USE_LIBCDA) + case 8: // Check cd-rom + CDRomCheck(); + break; +#endif } } + // // Map scrolling // @@ -563,7 +574,10 @@ global void GameMainLoop(void) CheckVideoInterrupts(); // look if already an interrupt - WaitEventsAndKeepSync(); + WaitEventsOneFrame(&callbacks); + if( !NetworkInSync ) { + NetworkRecover(); // recover network + } } // diff --git a/src/stratagus/player.cpp b/src/stratagus/player.cpp index 931e8bb5e..bc45dcab3 100644 --- a/src/stratagus/player.cpp +++ b/src/stratagus/player.cpp @@ -749,15 +749,15 @@ global void PlayersInitAi(void) } /** -** Handle AI of all players each frame. +** Handle AI of all players each game cycle. */ -global void PlayersEachFrame(void) +global void PlayersEachCycle(void) { int player; for( player=0; player<NumPlayers; ++player ) { if( Players[player].AiEnabled ) { - AiEachFrame(&Players[player]); + AiEachCycle(&Players[player]); } } } @@ -771,7 +771,7 @@ global void PlayersEachSecond(void) int res; for (player = 0; player < NumPlayers; ++player) { - if ((FrameCounter / FRAMES_PER_SECOND) % 10 == 0) { + if ((GameCycle / CYCLES_PER_SECOND) % 10 == 0) { for (res = 0; res < MaxCosts; res++) { Players[player].Revenue[res] = Players[player].Resources[res] - diff --git a/src/stratagus/spells.cpp b/src/stratagus/spells.cpp index 7784ad837..98f0c7418 100644 --- a/src/stratagus/spells.cpp +++ b/src/stratagus/spells.cpp @@ -339,7 +339,7 @@ local void SpellWhirlwindController(Missile *missile) // // Every 1/10s 1 points damage on tornado periphery // - if (!(missile->TTL % (FRAMES_PER_SECOND/10))) { + if (!(missile->TTL % (CYCLES_PER_SECOND/10))) { n = SelectUnits(x - 1, y - 1, x + 1, y + 1, table); DebugLevel3Fn("Damage on %d,%d-%d,%d = %d\n",x-1,y-1,x+1,y+1,n); for (i = 0; i < n; ++i) { @@ -625,7 +625,7 @@ global int CanCastSpell(const Unit* unit, const SpellType* spell, case SpellActionSlow: // slow didn't work on buildings if (target && !target->Type->Building - && target->Slow < spell->TTL / FRAMES_PER_SECOND) { + && target->Slow < spell->TTL / CYCLES_PER_SECOND) { return 1; } return 0; @@ -641,7 +641,7 @@ global int CanCastSpell(const Unit* unit, const SpellType* spell, case SpellActionInvisibility: // invisible didn't work on buildings if (target && !target->Type->Building - && target->Invisible < spell->TTL / FRAMES_PER_SECOND) { + && target->Invisible < spell->TTL / CYCLES_PER_SECOND) { return 1; } return 0; @@ -662,7 +662,7 @@ global int CanCastSpell(const Unit* unit, const SpellType* spell, case SpellActionBloodlust: if (target && target->Type->Organic - && target->Bloodlust < spell->TTL / FRAMES_PER_SECOND) { + && target->Bloodlust < spell->TTL / CYCLES_PER_SECOND) { return 1; } // FIXME: should we support making bloodlust in range? @@ -680,7 +680,7 @@ global int CanCastSpell(const Unit* unit, const SpellType* spell, case SpellActionHaste: if (target && !target->Type->Building - && target->Haste < spell->TTL / FRAMES_PER_SECOND) { + && target->Haste < spell->TTL / CYCLES_PER_SECOND) { return 1; } return 0; @@ -693,7 +693,7 @@ global int CanCastSpell(const Unit* unit, const SpellType* spell, case SpellActionUnholyArmor: if (target && !target->Type->Building - && target->UnholyArmor < spell->TTL / FRAMES_PER_SECOND) { + && target->UnholyArmor < spell->TTL / CYCLES_PER_SECOND) { return 1; } return 0; @@ -758,8 +758,8 @@ global int SpellCast(Unit * unit, const SpellType * spell, Unit * target, target->HP = 0; target->X = x; target->Y = y; - target->TTL=FrameCounter+FRAMES_PER_SECOND+FRAMES_PER_SECOND/2; - //target->TTL=FrameCounter+target->Type->DecayRate*6*FRAMES_PER_SECOND; + target->TTL=GameCycle+CYCLES_PER_SECOND+CYCLES_PER_SECOND/2; + //target->TTL=GameCycle+target->Type->DecayRate*6*CYCLES_PER_SECOND; CheckUnitToBeDrawn(target); break; @@ -845,10 +845,10 @@ global int SpellCast(Unit * unit, const SpellType * spell, Unit * target, case SpellActionSlow: if (target && !target->Type->Building - && target->Slow < spell->TTL/FRAMES_PER_SECOND) { + && target->Slow < spell->TTL/CYCLES_PER_SECOND) { // get mana cost unit->Mana -= spell->ManaCost; - target->Slow = spell->TTL/FRAMES_PER_SECOND; // about 25 sec + target->Slow = spell->TTL/CYCLES_PER_SECOND; // about 25 sec target->Haste = 0; CheckUnitToBeDrawn(target); @@ -964,7 +964,7 @@ global int SpellCast(Unit * unit, const SpellType * spell, Unit * target, case SpellActionInvisibility: if (target && !target->Type->Building - && target->Invisible < spell->TTL/FRAMES_PER_SECOND) { + && target->Invisible < spell->TTL/CYCLES_PER_SECOND) { // get mana cost unit->Mana -= spell->ManaCost; if( target->Type->Volatile ) { @@ -976,7 +976,7 @@ global int SpellCast(Unit * unit, const SpellType * spell, Unit * target, x*TileSizeX+TileSizeX/2, y*TileSizeY+TileSizeY/2 ); } else { // about 50 sec - target->Invisible = spell->TTL/FRAMES_PER_SECOND; + target->Invisible = spell->TTL/CYCLES_PER_SECOND; CheckUnitToBeDrawn(target); } @@ -1077,7 +1077,7 @@ global int SpellCast(Unit * unit, const SpellType * spell, Unit * target, DropOutOnSide(target,LookingW,0,0); // set life span - target->TTL=FrameCounter+target->Type->DecayRate*6*FRAMES_PER_SECOND; + target->TTL=GameCycle+target->Type->DecayRate*6*CYCLES_PER_SECOND; CheckUnitToBeDrawn(target); PlayGameSound(spell->Casted.Sound,MaxSampleVolume); @@ -1088,10 +1088,10 @@ global int SpellCast(Unit * unit, const SpellType * spell, Unit * target, case SpellActionBloodlust: if (target && target->Type->Organic - && target->Bloodlust < spell->TTL/FRAMES_PER_SECOND) { + && target->Bloodlust < spell->TTL/CYCLES_PER_SECOND) { // get mana cost unit->Mana -= spell->ManaCost; - target->Bloodlust = spell->TTL/FRAMES_PER_SECOND; // about 25 sec + target->Bloodlust = spell->TTL/CYCLES_PER_SECOND; // about 25 sec CheckUnitToBeDrawn(target); PlayGameSound(spell->Casted.Sound,MaxSampleVolume); @@ -1195,11 +1195,11 @@ global int SpellCast(Unit * unit, const SpellType * spell, Unit * target, case SpellActionHaste: if (target && !target->Type->Building - && target->Haste < spell->TTL/FRAMES_PER_SECOND) { + && target->Haste < spell->TTL/CYCLES_PER_SECOND) { // get mana cost unit->Mana -= spell->ManaCost; target->Slow = 0; - target->Haste = spell->TTL/FRAMES_PER_SECOND; // about 25 sec + target->Haste = spell->TTL/CYCLES_PER_SECOND; // about 25 sec CheckUnitToBeDrawn(target); PlayGameSound(spell->Casted.Sound,MaxSampleVolume); @@ -1227,8 +1227,8 @@ global int SpellCast(Unit * unit, const SpellType * spell, Unit * target, target=MakeUnitAndPlace(x, y, UnitTypeByIdent("unit-skeleton"), unit->Player); // set life span - target->TTL=FrameCounter+ - target->Type->DecayRate*6*FRAMES_PER_SECOND; + target->TTL=GameCycle+ + target->Type->DecayRate*6*CYCLES_PER_SECOND; CheckUnitToBeDrawn(target); ReleaseUnit( Units[i] ); @@ -1267,7 +1267,7 @@ global int SpellCast(Unit * unit, const SpellType * spell, Unit * target, case SpellActionUnholyArmor: if (target && !target->Type->Building - && target->UnholyArmor < spell->TTL/FRAMES_PER_SECOND) { + && target->UnholyArmor < spell->TTL/CYCLES_PER_SECOND) { // get mana cost unit->Mana -= spell->ManaCost; if( target->Type->Volatile ) { @@ -1279,7 +1279,7 @@ global int SpellCast(Unit * unit, const SpellType * spell, Unit * target, x*TileSizeX+TileSizeX/2, y*TileSizeY+TileSizeY/2 ); } else { // about 13 sec - target->UnholyArmor = spell->TTL/FRAMES_PER_SECOND; + target->UnholyArmor = spell->TTL/CYCLES_PER_SECOND; CheckUnitToBeDrawn(target); } diff --git a/src/stratagus/stratagus.cpp b/src/stratagus/stratagus.cpp index 808b528b1..ff7d81d64 100644 --- a/src/stratagus/stratagus.cpp +++ b/src/stratagus/stratagus.cpp @@ -400,7 +400,7 @@ local void WaitForInput(int timeout) RealizeVideoMemory(); WaitNoEvent=1; - timeout*=FRAMES_PER_SECOND; + timeout*=CYCLES_PER_SECOND; while( timeout-- && WaitNoEvent ) { WaitEventsOneFrame(&callbacks); } diff --git a/src/ui/mainscr.cpp b/src/ui/mainscr.cpp index 3a0aa89dd..c11b551c4 100644 --- a/src/ui/mainscr.cpp +++ b/src/ui/mainscr.cpp @@ -613,7 +613,7 @@ global void DrawResources(void) // FIXME: move messages to console code. -#define MESSAGES_TIMEOUT FRAMES_PER_SECOND*5 /// Message timeout 5 seconds +#define MESSAGES_TIMEOUT (FRAMES_PER_SECOND*5) /// Message timeout 5 seconds local int MessageFrameTimeout; /// frame to expire message @@ -1044,8 +1044,8 @@ global void DrawInfoPanel(void) VideoDrawText(x,y,GameFont,"FreeCraft"); y+=16; VideoDrawText(x,y,GameFont,"Cycle:"); - VideoDrawNumber(x+48,y,GameFont,FrameCounter); - VideoDrawNumber(x+110,y,GameFont,FRAMES_PER_SECOND*VideoSyncSpeed/100); + VideoDrawNumber(x+48,y,GameFont,GameCycle); + VideoDrawNumber(x+110,y,GameFont,CYCLES_PER_SECOND*VideoSyncSpeed/100); y+=20; for( i=0; i<PlayerMax; ++i ) { diff --git a/src/unit/unit.cpp b/src/unit/unit.cpp index 28814f749..b6a58744d 100644 --- a/src/unit/unit.cpp +++ b/src/unit/unit.cpp @@ -130,7 +130,7 @@ global void FreeUnitMemory(Unit* unit) */ global void ReleaseUnit(Unit* unit) { - DebugLevel2Fn("%d:Unit %p %d `%s'\n",FrameCounter, + DebugLevel2Fn("%lu:Unit %p %d `%s'\n",GameCycle, unit,UnitNumber(unit),unit->Type->Ident); DebugCheck( !unit->Type ); // already free. @@ -157,7 +157,7 @@ global void ReleaseUnit(Unit* unit) unit->Destroyed=1; // mark as destroyed RefsDebugCheck( !unit->Refs ); if( --unit->Refs>0 ) { - DebugLevel2Fn("%d:More references of %d #%d\n",FrameCounter + DebugLevel2Fn("%lu:More references of %d #%d\n",GameCycle ,UnitNumber(unit),unit->Refs); return; } @@ -185,10 +185,10 @@ global void ReleaseUnit(Unit* unit) // *ReleasedTail=unit; ReleasedTail=&unit->Next; - unit->Refs=FrameCounter+NetworkMaxLag; // could be reuse after this. + unit->Refs=GameCycle+NetworkMaxLag; // could be reuse after this. IfDebug( - DebugLevel2Fn("%d:No more references %d\n", - FrameCounter,UnitNumber(unit)); + DebugLevel2Fn("%lu:No more references %d\n", + GameCycle,UnitNumber(unit)); unit->Type=NULL; // for debugging. ); } @@ -222,13 +222,13 @@ global Unit* MakeUnit(UnitType* type,Player* player) // // Can use released unit? // - if( ReleasedHead && ReleasedHead->Refs<FrameCounter ) { + if( ReleasedHead && ReleasedHead->Refs<GameCycle ) { unit=ReleasedHead; ReleasedHead=unit->Next; if( ReleasedTail==&unit->Next ) { // last element ReleasedTail=&ReleasedHead; } - DebugLevel2Fn("%d:Release %p %d\n",FrameCounter,unit,UnitNumber(unit)); + DebugLevel2Fn("%lu:Release %p %d\n",GameCycle,unit,UnitNumber(unit)); slot=UnitSlots+unit->Slot; memset(unit,0,sizeof(*unit)); // FIXME: can release here more slots, reducing memory needs. @@ -1263,8 +1263,8 @@ global void UnitIncrementMana(void) // // Look if the time to live is over. // - if( unit->TTL && unit->TTL<FrameCounter ) { - DebugLevel0Fn("Unit must die %d %d!\n",unit->TTL,FrameCounter); + if( unit->TTL && unit->TTL<GameCycle ) { + DebugLevel0Fn("Unit must die %d %lu!\n",unit->TTL,GameCycle); //if( !--unit->HP ) { FIXME: must reduce hp the last seconds of life LetUnitDie(unit); //} @@ -3027,7 +3027,7 @@ global void HitUnit(Unit* attacker,Unit* target,int damage) if( !target->Attacked ) { // NOTE: perhaps this should also be moved into the notify? if( target->Player==ThisPlayer ) { - static int LastFrame; + static int LastCycle; static int LastX; static int LastY; @@ -3035,11 +3035,11 @@ global void HitUnit(Unit* attacker,Unit* target,int damage) // One help cry each 2 second is enough // If on same area ignore it for 2 minutes. // - if( LastFrame<FrameCounter ) { - if( LastFrame+FRAMES_PER_SECOND*120<FrameCounter || + if( LastCycle<GameCycle ) { + if( LastCycle+CYCLES_PER_SECOND*120<GameCycle || target->X<LastX-14 || target->X>LastX+14 || target->Y<LastY-14 || target->Y>LastY+14 ) { - LastFrame=FrameCounter+FRAMES_PER_SECOND*2; + LastCycle=GameCycle+CYCLES_PER_SECOND*2; LastX=target->X; LastY=target->Y; PlayUnitSound(target,VoiceHelpMe); diff --git a/src/video/X11.cpp b/src/video/X11.cpp index 575a282c6..638e372ff 100644 --- a/src/video/X11.cpp +++ b/src/video/X11.cpp @@ -14,8 +14,7 @@ // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the License, -// or (at your option) any later version. +// by the Free Software Foundation; only version 2 of the License. // // FreeCraft is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -125,9 +124,9 @@ global void SetVideoSync(void) } itv.it_interval.tv_sec=itv.it_value.tv_sec= - (100/FRAMES_PER_SECOND)/VideoSyncSpeed; + (100/CYCLES_PER_SECOND)/VideoSyncSpeed; itv.it_interval.tv_usec=itv.it_value.tv_usec= - (100000000/FRAMES_PER_SECOND)/VideoSyncSpeed- + (100000000/CYCLES_PER_SECOND)/VideoSyncSpeed- itv.it_value.tv_sec*100000; if( setitimer(ITIMER_REAL,&itv,NULL) ) { fprintf(stderr,"Can't set itimer\n"); diff --git a/src/video/sdl.cpp b/src/video/sdl.cpp index 8eb20d6ca..5cdfa42ec 100644 --- a/src/video/sdl.cpp +++ b/src/video/sdl.cpp @@ -10,12 +10,11 @@ // /**@name sdl.c - SDL video support. */ // -// (c) Copyright 1999-2001 by Lutz Sammer +// (c) Copyright 1999-2002 by Lutz Sammer // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the License, -// or (at your option) any later version. +// by the Free Software Foundation; only version 2 of the License. // // FreeCraft is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -76,61 +75,6 @@ global SDL_Surface *Screen; /// internal screen -- Sync ----------------------------------------------------------------------------*/ -#if 0 - -/* -** The timer resolution is 10ms, which make the timer useless for us. -*/ - -/** -** Called from another thread or what ever SDL uses.. -** -** @param unused Need by library: interval of the timer. -** @param param Parameter passed in by library. -*/ -local Uint32 VideoSyncHandler(Uint32 unused,void* param) -{ - DebugLevel3("Interrupt %d - %d\n" - ,VideoInterrupts,(100*1000/FRAMES_PER_SECOND)/VideoSyncSpeed); - - ++VideoInterrupts; - - // FIXME: this solves the timer problem with WIN32 - // WSACancelBlockingCall(); - // kill(0,SIGALRM); - - return (100*1000/FRAMES_PER_SECOND)/VideoSyncSpeed; -} - -/** -** Initialise video sync. -** -** @note SDL has only a maximum resolution of 10 ms. -** -** @see VideoSyncSpeed -*/ -global void SetVideoSync(void) -{ - static SDL_TimerID id; - - if( id ) { // Cancel old timer. - SDL_RemoveTimer(id); - id=NULL; - } - - if( !VideoSyncSpeed ) { - return; - } - - - id=SDL_AddTimer((100*1000/FRAMES_PER_SECOND)/VideoSyncSpeed, - VideoSyncHandler,NULL); - - // DebugLevel1("Timer installed\n"); -} - -#else - /** ** Initialise video sync. ** @@ -138,11 +82,9 @@ global void SetVideoSync(void) */ global void SetVideoSync(void) { - DebugLevel0Fn("%d\n",(100*1000/FRAMES_PER_SECOND)/VideoSyncSpeed); + DebugLevel0Fn("%d\n",(100*1000/CYCLES_PER_SECOND)/VideoSyncSpeed); } -#endif - /*---------------------------------------------------------------------------- -- Video ----------------------------------------------------------------------------*/ @@ -578,6 +520,15 @@ global void WaitEventsOneFrame(const EventCallback* callbacks) } #endif + if( !++FrameCounter ) { + // FIXME: tests with frame counter now fails :( + // FIXME: Should happen in 68 years :) + fprintf(stderr,"FIXME: *** round robin ***\n"); + fprintf(stderr,"FIXME: *** round robin ***\n"); + fprintf(stderr,"FIXME: *** round robin ***\n"); + fprintf(stderr,"FIXME: *** round robin ***\n"); + } + ticks=SDL_GetTicks(); if( ticks>NextFrameTicks ) { // We are too slow :( ++SlowFrameCounter; @@ -594,7 +545,7 @@ global void WaitEventsOneFrame(const EventCallback* callbacks) } while( ticks>=NextFrameTicks ) { ++VideoInterrupts; - NextFrameTicks+=(100*1000/FRAMES_PER_SECOND)/VideoSyncSpeed; + NextFrameTicks+=(100*1000/CYCLES_PER_SECOND)/VideoSyncSpeed; } // @@ -613,10 +564,6 @@ global void WaitEventsOneFrame(const EventCallback* callbacks) maxfd=NetworkFildes; } FD_SET(NetworkFildes,&rfds); - if( !NetworkInSync ) { - DebugLevel0Fn("recover-network\n"); - NetworkRecover(); // recover network - } } #ifndef USE_SDLA @@ -679,7 +626,7 @@ global void WaitEventsOneFrame(const EventCallback* callbacks) // // Not more input and time for frame over: return // - if( !i && NetworkInSync && VideoInterrupts ) { + if( !i && VideoInterrupts ) { break; } } @@ -715,6 +662,7 @@ global void WaitEventsAndKeepSync(void) callbacks.NetworkEvent=NetworkEvent; callbacks.SoundReady=WriteSound; + DebugLevel0Fn("Don't use this function\n"); WaitEventsOneFrame(&callbacks); } diff --git a/src/video/svgalib.cpp b/src/video/svgalib.cpp index a13562bfa..e363cc970 100644 --- a/src/video/svgalib.cpp +++ b/src/video/svgalib.cpp @@ -10,12 +10,11 @@ // /**@name svgalib.c - svgalib support. */ // -// (c) Copyright 1999-2001 by Jarek Sobieszek +// (c) Copyright 1999-2002 by Jarek Sobieszek // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the License, -// or (at your option) any later version. +// by the Free Software Foundation; only version 2 of the License. // // FreeCraft is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -127,9 +126,9 @@ global void SetVideoSync(void) } itv.it_interval.tv_sec=itv.it_value.tv_sec= - (100/FRAMES_PER_SECOND)/VideoSyncSpeed; + (100/CYCLES_PER_SECOND)/VideoSyncSpeed; itv.it_interval.tv_usec=itv.it_value.tv_usec= - (100000000/FRAMES_PER_SECOND)/VideoSyncSpeed- + (100000000/CYCLES_PER_SECOND)/VideoSyncSpeed- itv.it_value.tv_sec*100000; if( setitimer(ITIMER_REAL,&itv,NULL) ) { fprintf(stderr,"Can't set itimer\n"); diff --git a/src/video/wince.cpp b/src/video/wince.cpp index 49bb78c98..3f1f81a0f 100644 --- a/src/video/wince.cpp +++ b/src/video/wince.cpp @@ -10,12 +10,11 @@ // /**@name wince.c - WinCE video support. */ // -// (c) Copyright 2001 by +// (c) Copyright 2001,2002 by // // FreeCraft is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published -// by the Free Software Foundation; either version 2 of the License, -// or (at your option) any later version. +// by the Free Software Foundation; only version 2 of the License. // // FreeCraft is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -71,7 +70,7 @@ */ global void SetVideoSync(void) { - DebugLevel0Fn("%d\n",(100*1000/FRAMES_PER_SECOND)/VideoSyncSpeed); + DebugLevel0Fn("%d\n",(100*1000/CYCLES_PER_SECOND)/VideoSyncSpeed); } /*---------------------------------------------------------------------------- @@ -153,7 +152,7 @@ global void WaitEventsOneFrame(const EventCallback* callbacks) i=WinCE_GetTicks(); while( i>=LastTick ) { ++VideoInterrupts; - LastTick+=(100*1000/FRAMES_PER_SECOND)/VideoSyncSpeed; + LastTick+=(100*1000/CYCLES_PER_SECOND)/VideoSyncSpeed; } #endif @@ -289,7 +288,7 @@ global void WaitEventsAndKeepSync(void) i=WinCE_GetTicks(); while( i>=LastTick ) { ++VideoInterrupts; - LastTick+=(100*1000/FRAMES_PER_SECOND)/VideoSyncSpeed; + LastTick+=(100*1000/CYCLES_PER_SECOND)/VideoSyncSpeed; } //