From 3375cd2288f93964b5fbd584da794755cbf0584d Mon Sep 17 00:00:00 2001 From: pace Date: Thu, 4 Jan 2007 04:06:47 +0000 Subject: [PATCH] 2007-01-03 Pace Willisson * V44 * support blocking for X events or time going by, instead of always running at about 30 frames per second; try to recognize when we are falling behind on the newscaster animation and skip frames to catch up; remove some dead code; add dbg() function from libopus which prints nice timestamps on log messages; improve animation handling in port.c so it doesn't waste so much cpu time; 2007-01-03 Michael McCarty --- COPYING | 339 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ChangeLog | 14 ++- QUESTIONS | 10 ++ TODO | 24 ++++ av.h | 1 + gx.c | 4 - main.c | 42 ++----- news.c | 62 +++++----- pace.c | 69 +++++++++++ pace.h | 3 + port.c | 35 +++--- proto.h | 4 +- sdl.c | 144 +++++++++++++++-------- version.c | 2 +- 14 files changed, 612 insertions(+), 141 deletions(-) create mode 100644 COPYING diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog index fbc6d8c..c760637 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2007-01-03 Pace Willisson + + * V44 + + * support blocking for X events or time going by, instead of + always running at about 30 frames per second; try to recognize + when we are falling behind on the newscaster animation and skip + frames to catch up; remove some dead code; add dbg() function + from libopus which prints nice timestamps on log messages; improve + animation handling in port.c so it doesn't waste so much cpu time; + 2007-01-03 Michael McCarty * V43 @@ -15,7 +26,8 @@ * V41 * Encapsulated the creation of ENDGAME.TMP into a single function. - * Turned off save game encryption. Move it into an #ifdef for historical purposes. + * Turned off save game encryption. Move it into an #ifdef for + historical purposes. 2007-01-03 Michael McCarty diff --git a/QUESTIONS b/QUESTIONS index 567ceed..5e56f1a 100644 --- a/QUESTIONS +++ b/QUESTIONS @@ -1,3 +1,13 @@ +Shall we rip out the calls to MouseOn and MouseOff? The window system +does all this work now, so these functions are no-ops. It might be +tempting to think that leaving them in could be useful if we wanted to +run on bare hardware again, but since they aren't in use now, it would +be pretty likely that bugs would be introduced before the unlikely +time that they would be needed. I think the simplification would +be worthwhile. + + + The frame rate in the FRM files seems to be 8, which means 8 frames per second, right? - I think this is right. diff --git a/TODO b/TODO index fe6f4c9..edbe238 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,16 @@ +rename UpdatePort + +when updating the x server, scan top and bottom of the previous +and current image for identical parts, then send just the middle +part that has changed + +wastes cpu time when showing the new image + +drop frames if getting behind on newscaster or movie playback + +look into "hold frame" stuff for aligning mission video and audio + + remove SetROMDir fades @@ -7,11 +20,22 @@ implement PlayAudio ... summing sound effects with music clean up extra gr_sync's +================================================================ enhancements: water seems to flow backwards in DoCycle optimize grPutPixel and grGetPixel +I started the game and it happend that a plane flew by on the first view +of the space port. I never typed anything, but later I noticed that there +was a plane stuck to the left edge of the screen. It disappeared after I +switched to another screen (R&D), then back to the port. + +=> the probem is that the gx routines should clip - we're seeing the +wrapped image + +try mpeg encoding the video + ================================================================ possible old bugs diff --git a/av.h b/av.h index f0bda66..560d860 100644 --- a/av.h +++ b/av.h @@ -1,4 +1,5 @@ void av_step (void); +void av_block (void); void av_setup (int *argcp, char ***argvp); void av_silence (void); void av_sync (void); diff --git a/gx.c b/gx.c index b31c45c..e8b046f 100644 --- a/gx.c +++ b/gx.c @@ -181,8 +181,6 @@ gxVirtualVirtual (GXHEADER *from, int row, col; int from_idx, to_idx; - gr_sync (); - w = from_x2 - from_x1 + 1; h = from_y2 - from_y1 + 1; @@ -195,8 +193,6 @@ gxVirtualVirtual (GXHEADER *from, to->vptr[to_idx] = from->vptr[from_idx]; } } - - gr_sync (); } void diff --git a/main.c b/main.c index 358446d..d8a9c00 100644 --- a/main.c +++ b/main.c @@ -16,15 +16,15 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -//ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» -//ºInterplay's BUZZ ALDRIN's RACE into SPACE º -//º º -//ºFormerly -=> LiftOff : Race to the Moon :: IBM version MCGA º -//ºCopyright 1991 by Strategic Visions, Inc. º -//ºDesigned by Fritz Bronner º -//ºProgrammed by Michael K McCarty º -//º º -//ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ +//**************************************************************** +//*Interplay's BUZZ ALDRIN's RACE into SPACE * +//* * +//*Formerly -=> LiftOff : Race to the Moon :: IBM version MCGA * +//*Copyright 1991 by Strategic Visions, Inc. * +//*Designed by Fritz Bronner * +//*Programmed by Michael K McCarty * +//* * +//**************************************************************** #include "Buzz_inc.h" int cdROM,hDISK; @@ -104,24 +104,6 @@ void Plop(char plr,char mode); int TimingThing(void); -///////////////////////////////////////////// -// Set the Directory to the current ROM Directory -// -int cDrive; - -void SetROMDir(void) -{ -} - -//////////////////////////////////////////// -// Restore the Directory to the original directory -// on the hard disk -// -void RestoreDir(void) -{ - -} - void mikeCrearScreen(void) { MouseOff(); @@ -855,7 +837,7 @@ void DV(GXHEADER *obj) void GetMouse (void) { - idle_loop_secs (.030); + av_block (); GetMouse_fast (); } @@ -868,6 +850,7 @@ void GetMouse_fast(void) oldx=x;oldy=y; gr_maybe_sync (); + av_step (); if (XMAS!=0) { if (grGetMouseButtons()) { @@ -913,8 +896,6 @@ void MouseOn(void) void PauseMouse(void) { - gr_sync (); - /* wait until mouse button is released */ while(1) { GetMouse(); /* blocks briefly */ @@ -1387,7 +1368,6 @@ void Plop(char plr,char mode) if (BIG==0) SMove(&vhptr.vptr[40000],80,3+plr*10); else LMove(&vhptr.vptr[40000]); fclose(fin); - gr_sync (); return; } diff --git a/news.c b/news.c index d1fe641..d2f0e7d 100644 --- a/news.c +++ b/news.c @@ -28,6 +28,9 @@ #include "externs.h" #include "replay.h" +double load_news_anim_start; + + char *totnews_dat; int totnews_offset; @@ -37,7 +40,8 @@ int totnews_offset; int bufsize; int evflag,LOAD_US=0,LOAD_SV=0; -BYTE Frame,X_Offset,Y_Offset,Depth,Length,MaxFrame,AnimIndex; +int Frame; +BYTE X_Offset,Y_Offset,Depth,Length,MaxFrame,AnimIndex; WORD handle0,handle1,handle2,handle3,handle4,handle5; extern char Option; extern char Musics,Sounds; @@ -488,10 +492,10 @@ void News(char plr) RectFill(227,108,228,108,grGetPixel(227,108)); MouseOn(); } - PlayNewsAnim(AnimIndex); - PlayNewsAnim(AnimIndex); - PlayNewsAnim(AnimIndex); - PlayNewsAnim(AnimIndex); + PlayNewsAnim(); + PlayNewsAnim(); + PlayNewsAnim(); + PlayNewsAnim(); NGetVoice(plr,0); PlayVoice(); loc++; @@ -508,11 +512,11 @@ void News(char plr) else if (plr==0) LoadNewsAnim((BW==0) ? 3 : 2,FIRST_FRAME); Status=0; if (plr==0) { - PlayNewsAnim(AnimIndex); - PlayNewsAnim(AnimIndex); - PlayNewsAnim(AnimIndex); - PlayNewsAnim(AnimIndex); - PlayNewsAnim(AnimIndex); + PlayNewsAnim(); + PlayNewsAnim(); + PlayNewsAnim(); + PlayNewsAnim(); + PlayNewsAnim(); } NGetVoice(plr,1); PlayVoice(); @@ -554,9 +558,9 @@ void News(char plr) if (Frame!=MaxFrame) { - PlayNewsAnim(AnimIndex); + PlayNewsAnim(); if (Frame==MaxFrame) Status=1; - }; + } else { idle_loop_secs (.125); } //: Repeat News Sequence if (key=='R' && loc==6) @@ -602,7 +606,7 @@ void News(char plr) DrawNText(plr,ctop); MouseOff();OutBox(303,158,313,194);MouseOn(); } - gr_sync (); +// gr_sync (); }; } @@ -665,10 +669,19 @@ void Breakgrp(char plr) }; /* for k */ } -void PlayNewsAnim(BYTE Index) +void PlayNewsAnim(void) { GXHEADER local; - + double delta; + int frames_realtime; + int skip_frame; + + skip_frame = 0; + delta = get_time () - load_news_anim_start; + frames_realtime = delta * 15; + if (Frame < frames_realtime) + skip_frame = 1; + GV(&local,Depth,Length); RLED_img (totnews_dat + totnews_offset + table[Frame].offset, @@ -681,24 +694,12 @@ void PlayNewsAnim(BYTE Index) DV(&local); Frame+=1; - gr_sync (); - idle_loop_secs (1 / 30.0); + if (skip_frame == 0) + idle_loop_secs (1 / 16.0); return; } -void FillAnim(unsigned index,unsigned maxf) -{ - unsigned fill; - - MouseOff(); - fill=((float)index/(float)maxf)*203; - if (index==maxf) fill=203; - if (fill>0 && fill<=203) - RectFill(54,109,54+(unsigned int)fill,118,7); - MouseOn(); - return; -} void LoadNewsAnim(BYTE Index,BYTE Mode) { @@ -721,6 +722,8 @@ void LoadNewsAnim(BYTE Index,BYTE Mode) long offset; } god[12]; + load_news_anim_start = get_time (); + if (Mode==1) { switch(Index) { @@ -798,6 +801,7 @@ void LoadNewsAnim(BYTE Index,BYTE Mode) MouseOn(); gxDestroyVirtual(&vhptr2); DV(&local); + }; if (Mode == 69) { // *************** TCS001 my kludge (tom) 3/15/94 diff --git a/pace.c b/pace.c index 966e05e..40b23ac 100644 --- a/pace.c +++ b/pace.c @@ -798,3 +798,72 @@ xstrdup (char const *s) return (p); } + +#define debug_file stdout +void +vdbg (char const *fmt, va_list args) +{ + char buf[10000]; + char *p; + struct tm tm; + struct timeval tv; + time_t t; + int binchars; + static unsigned long last_millitime; + unsigned long this_millitime; + int delta; + + gettimeofday (&tv, NULL); + t = tv.tv_sec; + tm = *localtime (&t); + + p = buf; + + sprintf (p, "%02d:%02d:%02d.%03d ", tm.tm_hour, tm.tm_min, tm.tm_sec, + (int)(tv.tv_usec / 1000)); + p += strlen (p); + + this_millitime = (tm.tm_hour * 3600 + tm.tm_min * 60 + tm.tm_sec) + * 1000 + tv.tv_usec / 1000; + + if (last_millitime == 0) + last_millitime = this_millitime; + + delta = this_millitime - last_millitime; + last_millitime = this_millitime; + + if (delta < 0) + delta = 0; + + sprintf (p, "%5d ", delta); + p += strlen (p); + + vsprintf (p, fmt, args); + + p += strlen (p); + while (p != buf && (p[-1] == '\n' || p[-1] == '\r')) + *--p = 0; + + binchars = 0; + for (p = buf; *p && binchars < 20; p++) { + int c = *p; + if ((c >= ' ' && c < 0177) || c == '\t' || c == '\n') { + putc (c, debug_file); + } else { + binchars++; + putc ('.', debug_file); + } + } + putc ('\n', debug_file); + fflush (debug_file); +} + +void +dbg (char const *fmt, ...) +{ + va_list args; + + va_start (args, fmt); + vdbg (fmt, args); + va_end (args); +} diff --git a/pace.h b/pace.h index cdd0776..1c58150 100644 --- a/pace.h +++ b/pace.h @@ -182,4 +182,7 @@ void GetMouse_fast (void); char savedat_dir[1000]; char music_dir[1000]; +void dbg (char const *fmt, ...) __attribute__ ((format (printf, 1, 2))); + + #endif /* __PACE_H__ */ diff --git a/port.c b/port.c index f1c5518..8727dbb 100644 --- a/port.c +++ b/port.c @@ -43,9 +43,7 @@ int put_serial(unsigned char n); char RUSH,SUSPEND; extern int oldx,oldy; -//extern char far *sbuf0; extern struct mStr Mis; -extern char IDLE; extern char Option; extern char Sounds; @@ -199,9 +197,11 @@ void SpotCrap(char loc,char mode) fread(&sImg,sizeof sImg,1,sFin); // get image header { + static int warned; int expected_w = hSPOT.size / sImg.h; - if (sImg.w != expected_w) { - printf ("XXX fixing sImg.w %d->%d\n", + if (sImg.w != expected_w && warned == 0) { + warned = 1; + printf ("************ fixing sImg.w %d->%d\n", sImg.w, expected_w); sImg.w = expected_w; } @@ -274,7 +274,6 @@ void SpotCrap(char loc,char mode) if ((loc>=0 && loc<=8) || (loc>=15 && loc<=19) || loc==12 || loc==14 || loc==11 || loc==10) if (mode==SPOT_LOAD && Sounds>0 && Data->Def.Sound==1) { - SetROMDir(); switch(loc) { case 1:case 6:PlayAudio("JET.RAW",0);break; case 3:case 8:PlayAudio("VCRASH.RAW",0);break; @@ -315,16 +314,12 @@ void WaveFlagDel(void) return; } -void PadBub(int x,int y,int col) // Used to Signal Mission -{ - RectFill(x,y+1,x+4,y+2,col); - RectFill(x+1,y,x+3,y+3,col); - return; -} - - -/* pace */ /* pace */ +/* + * this isn't needed now that RLED automatically chops the right column + * when the data is bigger than needed. there's still a bug somewhere, + * so this table is a useful list of funny images to check later + */ long fix_width[] = { // normal 80615, // 4/0 VAB in mode 0 @@ -376,7 +371,6 @@ void PortPlace(FILE * fin,long table) if (local2.vptr[ctr]!=0x00) local.vptr[ctr]=local2.vptr[ctr]; gxPutImage(&local,gxSET,Img.PlaceX,Img.PlaceY,0); // place image DV(&local2);DV(&local); - gr_sync (); return; } @@ -732,7 +726,7 @@ void GetMse(char plr,char fon) double now; now = get_time (); - if (now - last_wave_step > .120) { + if (now - last_wave_step > .125) { last_wave_step = now; DoCycle (); @@ -788,7 +782,6 @@ void DoCycle(void) // Three ranges of color cycling pal[j+i*3+2]=pal[j+(i-1)*3+2];}; pal[420]=tmp1;pal[421]=tmp2;pal[422]=tmp3; gxSetDisplayPalette(pal); - gr_sync (); return; } @@ -868,7 +861,7 @@ void Port(char plr) { double last_secs; char i,j,kMode,kEnt,k; -char olddir[120],good; +char good; int kPad,pKey,gork; FILE *fin; long stable[55]; @@ -898,9 +891,9 @@ PreOut=(struct SXX *)&buffer[60000]; last_secs = get_time (); while (1) { - idle_loop_secs (.030); + av_block (); #if 0 - if (get_time ()- last_time > 25) + if (get_time ()- last_secs > 25) { SpotCrap(0,SPOT_KILL); gork=random(100); @@ -976,6 +969,7 @@ PreOut=(struct SXX *)&buffer[60000]; x<=MObj[i].Reg[Data->P[plr].Port[i]].CD[j].x2 && y<=MObj[i].Reg[Data->P[plr].Port[i]].CD[j].y2) { + av_block (); #if BABYSND UpdateAudio(); #endif @@ -1000,7 +994,6 @@ PreOut=(struct SXX *)&buffer[60000]; || (kMode==0 && key==0x0d)) { MouseOff();PortRestore(Count);Count=0;MouseOn(); - getcurdir(0,olddir); // || i==33 diff --git a/proto.h b/proto.h index 4b58e87..ed07601 100644 --- a/proto.h +++ b/proto.h @@ -412,7 +412,6 @@ void NextTurn(char plr); FILE *sOpen(char *Name,char *mode,int loc); void Rout_Debug(int line, char *file); -void SetROMDir(void); void RestoreDir(void); int main(int argc, char *argv[]); int TimingThing(void); @@ -544,7 +543,6 @@ void GoNews(char plr); void OpenNews(char plr,char *buf,int bud); void DispNews(char plr,char *src,char *dest); void PreLoadAnim(char plr,char mode); -void FillAnim(unsigned index,unsigned maxf); void CloseNewsAnim(void); void DrawNews(char plr); void DrawNText(char plr,char got); @@ -553,7 +551,7 @@ void DeAlloc(BYTE Page); void AIEvent(char plr); char ResolveEvent(char plr); void Breakgrp(char plr); -void PlayNewsAnim(BYTE Page); +void PlayNewsAnim(void); void LoadNewsAnim(BYTE Index,BYTE Mode); void ShowEvt(char plr,char crd); diff --git a/sdl.c b/sdl.c index 0517310..f0c8d6d 100644 --- a/sdl.c +++ b/sdl.c @@ -10,6 +10,8 @@ #include "av.h" +void dbg (char const *fmt, ...) __attribute__ ((format (printf, 1, 2))); + SDL_Surface *sur; void @@ -103,10 +105,21 @@ av_silence (void) SDL_UnlockAudio (); } + +Uint32 +sdl_timer_callback (Uint32 interval, void *param) +{ + static SDL_Event tick; + + tick.type = SDL_USEREVENT; + SDL_PushEvent (&tick); + return (interval); +} + void av_setup (int *argcp, char ***argvp) { - if (SDL_Init (SDL_INIT_VIDEO) < 0) { + if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) { fprintf (stderr, "SDL_Init error\n"); exit (1); } @@ -141,6 +154,8 @@ av_setup (int *argcp, char ***argvp) SDL_PauseAudio (0); } + + SDL_AddTimer (30, sdl_timer_callback, NULL); } #define KEYBUF_SIZE 256 @@ -148,66 +163,93 @@ int keybuf[KEYBUF_SIZE]; int keybuf_in_idx, keybuf_out_idx; -/* non-blocking */ void -av_step (void) +av_process_event (SDL_Event *evp) { - SDL_Event ev; int c; - - while (SDL_PollEvent (&ev)) { - switch (ev.type) { - case SDL_QUIT: - exit (0); - break; - - case SDL_KEYDOWN: - switch (ev.key.keysym.sym) { - case SDLK_UP: c = 0x4800; break; - case SDLK_DOWN: c = 0x5000; break; - case SDLK_RIGHT: c = 0x4D00; break; - case SDLK_LEFT: c = 0x4B00; break; - default: - c = ev.key.keysym.unicode; - break; - } - if (c) { - keybuf[keybuf_in_idx] = c; - keybuf_in_idx = (keybuf_in_idx + 1) - % KEYBUF_SIZE; - } - break; - case SDL_MOUSEBUTTONDOWN: - av_mouse_pressed_cur = 1; - av_mouse_pressed_latched = 1; - av_mouse_pressed_x = ev.button.x; - av_mouse_pressed_y = ev.button.y; - printf ("mouseclick(%d,%d)\n", - av_mouse_pressed_x, - av_mouse_pressed_y); + switch (evp->type) { + case SDL_QUIT: + exit (0); + break; + + case SDL_USEREVENT: + break; + + case SDL_KEYDOWN: + switch (evp->key.keysym.sym) { + case SDLK_UP: c = 0x4800; break; + case SDLK_DOWN: c = 0x5000; break; + case SDLK_RIGHT: c = 0x4D00; break; + case SDLK_LEFT: c = 0x4B00; break; + default: + c = evp->key.keysym.unicode; break; + } + if (c) { + keybuf[keybuf_in_idx] = c; + keybuf_in_idx = (keybuf_in_idx + 1) + % KEYBUF_SIZE; + } + break; + + case SDL_MOUSEBUTTONDOWN: + av_mouse_pressed_cur = 1; + av_mouse_pressed_latched = 1; + av_mouse_pressed_x = evp->button.x; + av_mouse_pressed_y = evp->button.y; + printf ("mouseclick(%d,%d)\n", + av_mouse_pressed_x, + av_mouse_pressed_y); + break; + + case SDL_MOUSEBUTTONUP: + av_mouse_pressed_cur = 0; + break; + + case SDL_MOUSEMOTION: + av_mouse_cur_x = evp->motion.x; + av_mouse_cur_y = evp->motion.y; + break; + + /* ignore these events */ + case SDL_KEYUP: + case SDL_ACTIVEEVENT: + break; + default: + printf ("got uknown event %d\n", evp->type); + break; + } +} - case SDL_MOUSEBUTTONUP: - av_mouse_pressed_cur = 0; - break; +/* non-blocking */ +void +av_step (void) +{ + SDL_Event ev; + + while (SDL_PollEvent (&ev)) + av_process_event (&ev); +} - case SDL_MOUSEMOTION: - av_mouse_cur_x = ev.motion.x; - av_mouse_cur_y = ev.motion.y; - break; +void +av_block (void) +{ + SDL_Event ev; - /* ignore these events */ - case SDL_KEYUP: - case SDL_ACTIVEEVENT: - break; - default: - printf ("got uknown event %d\n", ev.type); - break; - } + /* + * block until an event comes in + * + * we have a 30ms timer going, so that is the + * maximum wait time + */ + if (SDL_WaitEvent (&ev)) { + av_process_event (&ev); + av_step (); /* soak up any other currently available events */ } } + int bioskey (int peek) { @@ -233,7 +275,7 @@ bioskey (int peek) void UpdateAudio(void) { - av_step (); +// av_step (); } void diff --git a/version.c b/version.c index e381943..e2d218f 100644 --- a/version.c +++ b/version.c @@ -1,2 +1,2 @@ -43 +44