From: Antoine Jacquet Date: Mon, 6 Sep 2004 22:00:00 +0000 (+0200) Subject: version 0.1 X-Git-Tag: v0.1 X-Git-Url: http://royale.zerezo.com/git/?p=zeRace;a=commitdiff_plain;h=f3b6b880f4b72504090898ab825f38f091a68168 version 0.1 * initial release --- f3b6b880f4b72504090898ab825f38f091a68168 diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..5b6e7c6 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library General +Public License instead of this License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c98d452 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +zeRace:zeRace.c sdl.o + gcc -o zeRace zeRace.c sdl.o `sdl-config --cflags --libs` -lSDL_image -lSDL_gfx -lSDL_net -lSDL_mixer + +sdl.o:sdl.c sdl.h + gcc -c sdl.c `sdl-config --cflags` + +clean: + rm -f zeRace *.o diff --git a/README b/README new file mode 100644 index 0000000..615337d --- /dev/null +++ b/README @@ -0,0 +1,3 @@ +zeRace 0.1 +site: http://royale.zerezo.com/zerace/ +mail: royale@zerezo.com \ No newline at end of file diff --git a/icon.bmp b/icon.bmp new file mode 100644 index 0000000..61a9eee Binary files /dev/null and b/icon.bmp differ diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000..43ad6ce Binary files /dev/null and b/icon.ico differ diff --git a/icon.rc b/icon.rc new file mode 100644 index 0000000..f1ce080 --- /dev/null +++ b/icon.rc @@ -0,0 +1 @@ +zeRace ICON icon.ico diff --git a/sdl.c b/sdl.c new file mode 100644 index 0000000..0661854 --- /dev/null +++ b/sdl.c @@ -0,0 +1,151 @@ +#include "sdl.h" + +SDL_Surface *font=NULL; + +void print(SDL_Surface *dst,int x,int y,unsigned char *text) +{ + SDL_Rect srcpos,dstpos; + if (!font) if ((font=IMG_Load("sprites/font.png"))==NULL) + { + fprintf(stderr,"could not load font file\n",SDL_GetError()); + } + while (*text!='\0') + { + if (*text>=' ' && *text<' '+16*10) + srcpos.x=(*text-' ')%16*10; + srcpos.y=(*text-' ')/16*19; + srcpos.w=10; + srcpos.h=19; + dstpos.x=x; + dstpos.y=y; + SDL_BlitSurface(font,&srcpos,dst,&dstpos); + x+=10; + text++; + } +} + +/* + * Return the pixel value at (x, y) + * NOTE: The surface must be locked before calling this! + */ +Uint32 getpixel(SDL_Surface *surface, int x, int y) +{ + int bpp = surface->format->BytesPerPixel; + /* Here p is the address to the pixel we want to retrieve */ + Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; + + switch(bpp) { + case 1: + return *p; + + case 2: + return *(Uint16 *)p; + + case 3: + if(SDL_BYTEORDER == SDL_BIG_ENDIAN) + return p[0] << 16 | p[1] << 8 | p[2]; + else + return p[0] | p[1] << 8 | p[2] << 16; + + case 4: + return *(Uint32 *)p; + + default: + return 0; /* shouldn't happen, but avoids warnings */ + } +} + +/* + * Set the pixel at (x, y) to the given value + * NOTE: The surface must be locked before calling this! + */ +void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel) +{ + int bpp = surface->format->BytesPerPixel; + /* Here p is the address to the pixel we want to set */ + Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; + + switch(bpp) { + case 1: + *p = pixel; + break; + + case 2: + *(Uint16 *)p = pixel; + break; + + case 3: + if(SDL_BYTEORDER == SDL_BIG_ENDIAN) { + p[0] = (pixel >> 16) & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = pixel & 0xff; + } else { + p[0] = pixel & 0xff; + p[1] = (pixel >> 8) & 0xff; + p[2] = (pixel >> 16) & 0xff; + } + break; + + case 4: + *(Uint32 *)p = pixel; + break; + } +} + +/* Set pixel function */ +void setpixel(SDL_Surface *screen, int x, int y, Uint8 r, Uint8 g, Uint8 b) +{ + Uint8 *ubuff8; + Uint16 *ubuff16; + Uint32 *ubuff32; + Uint32 color; + + /* Lock the screen, if needed */ + if(SDL_MUSTLOCK(screen)) { + if(SDL_LockSurface(screen) < 0) + return; + } + + /* Get the color */ + color = SDL_MapRGB( screen->format, r, g, b ); + + /* How we draw the pixel depends on the bitdepth */ + switch(screen->format->BytesPerPixel) { + case 1: + ubuff8 = (Uint8*) screen->pixels; + ubuff8 += (y * screen->pitch) + x; + *ubuff8 = (Uint8) color; + break; + case 2: + ubuff16 = (Uint16*) screen->pixels; + ubuff16 += ((y * screen->pitch)>>2) + x; + *ubuff16 = (Uint16) color; + break; + case 3: + ubuff8 = (Uint8*) screen->pixels; + ubuff8 += (y * screen->pitch) + x; + + r = (color>>screen->format->Rshift)&0xFF; + g = (color>>screen->format->Gshift)&0xFF; + b = (color>>screen->format->Bshift)&0xFF; + + ubuff8[0] = r; + ubuff8[1] = g; + ubuff8[2] = b; + break; + + case 4: + ubuff32 = (Uint32*) screen->pixels; + ubuff32 += ((y*screen->pitch)>>2) + x; + *ubuff32 = color; + break; + + default: + fprintf(stderr, "Error: Unknown bitdepth!\n"); + } + + /* Unlock the screen if needed */ + if(SDL_MUSTLOCK(screen)) { + SDL_UnlockSurface(screen); + } +} diff --git a/sdl.h b/sdl.h new file mode 100644 index 0000000..a613c93 --- /dev/null +++ b/sdl.h @@ -0,0 +1,7 @@ +#include +#include + +void print(SDL_Surface *dst,int x,int y,unsigned char *text); +Uint32 getpixel(SDL_Surface *surface, int x, int y); +void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel); +void setpixel(SDL_Surface *screen, int x, int y, Uint8 r, Uint8 g, Uint8 b); diff --git a/sounds/crash.wav b/sounds/crash.wav new file mode 100644 index 0000000..1c5b96c Binary files /dev/null and b/sounds/crash.wav differ diff --git a/sounds/engine.wav b/sounds/engine.wav new file mode 100644 index 0000000..51a55f8 Binary files /dev/null and b/sounds/engine.wav differ diff --git a/sounds/light.wav b/sounds/light.wav new file mode 100644 index 0000000..e5623a0 Binary files /dev/null and b/sounds/light.wav differ diff --git a/sounds/slide.wav b/sounds/slide.wav new file mode 100644 index 0000000..04ae8b4 Binary files /dev/null and b/sounds/slide.wav differ diff --git a/splashs/1.jpg b/splashs/1.jpg new file mode 100644 index 0000000..903c08d Binary files /dev/null and b/splashs/1.jpg differ diff --git a/splashs/2.jpg b/splashs/2.jpg new file mode 100644 index 0000000..dba011e Binary files /dev/null and b/splashs/2.jpg differ diff --git a/splashs/3.jpg b/splashs/3.jpg new file mode 100644 index 0000000..094a418 Binary files /dev/null and b/splashs/3.jpg differ diff --git a/sprites/0.png b/sprites/0.png new file mode 100644 index 0000000..794f4fc Binary files /dev/null and b/sprites/0.png differ diff --git a/sprites/1.png b/sprites/1.png new file mode 100644 index 0000000..810819c Binary files /dev/null and b/sprites/1.png differ diff --git a/sprites/2.png b/sprites/2.png new file mode 100644 index 0000000..5e3ac57 Binary files /dev/null and b/sprites/2.png differ diff --git a/sprites/3.png b/sprites/3.png new file mode 100644 index 0000000..20c58fe Binary files /dev/null and b/sprites/3.png differ diff --git a/sprites/car.png b/sprites/car.png new file mode 100644 index 0000000..7b9d2ea Binary files /dev/null and b/sprites/car.png differ diff --git a/sprites/font.png b/sprites/font.png new file mode 100644 index 0000000..bad3ad2 Binary files /dev/null and b/sprites/font.png differ diff --git a/tracks/car.png b/tracks/car.png new file mode 100644 index 0000000..7e8cc59 Binary files /dev/null and b/tracks/car.png differ diff --git a/tracks/car.txt b/tracks/car.txt new file mode 100644 index 0000000..0339620 --- /dev/null +++ b/tracks/car.txt @@ -0,0 +1,6 @@ +title : Car +author : ICFP Programming Contest +version : 0.1 +x : 435 +y : 640 +a : 180 diff --git a/tracks/car_function.png b/tracks/car_function.png new file mode 100644 index 0000000..1fd3062 Binary files /dev/null and b/tracks/car_function.png differ diff --git a/tracks/first.png b/tracks/first.png new file mode 100644 index 0000000..f4b9961 Binary files /dev/null and b/tracks/first.png differ diff --git a/tracks/first.txt b/tracks/first.txt new file mode 100644 index 0000000..57440f7 --- /dev/null +++ b/tracks/first.txt @@ -0,0 +1,6 @@ +title : First circuit for this game... +author : Royale +version : 0.1 +x : 420 +y : 200 +a : 180 diff --git a/tracks/first_function.png b/tracks/first_function.png new file mode 100644 index 0000000..03f5cc7 Binary files /dev/null and b/tracks/first_function.png differ diff --git a/tracks/hairpins.png b/tracks/hairpins.png new file mode 100644 index 0000000..b6239a4 Binary files /dev/null and b/tracks/hairpins.png differ diff --git a/tracks/hairpins.txt b/tracks/hairpins.txt new file mode 100644 index 0000000..b08f395 --- /dev/null +++ b/tracks/hairpins.txt @@ -0,0 +1,6 @@ +title : Hairpins +author : ICFP Programming Contest +version : 0.1 +x : 490 +y : 650 +a : 0 diff --git a/tracks/hairpins_function.png b/tracks/hairpins_function.png new file mode 100644 index 0000000..9d9339b Binary files /dev/null and b/tracks/hairpins_function.png differ diff --git a/tracks/simple.png b/tracks/simple.png new file mode 100644 index 0000000..6b4f54c Binary files /dev/null and b/tracks/simple.png differ diff --git a/tracks/simple.txt b/tracks/simple.txt new file mode 100644 index 0000000..68decf8 --- /dev/null +++ b/tracks/simple.txt @@ -0,0 +1,6 @@ +title : Simple +author : ICFP Programming Contest +version : 0.1 +x : 570 +y : 550 +a : 0 diff --git a/tracks/simple_function.png b/tracks/simple_function.png new file mode 100644 index 0000000..88cb5b4 Binary files /dev/null and b/tracks/simple_function.png differ diff --git a/zeRace.c b/zeRace.c new file mode 100644 index 0000000..7bc2e33 --- /dev/null +++ b/zeRace.c @@ -0,0 +1,646 @@ +#include +#include +#include +#include +#include +#include +#include +#include "sdl.h" + +#define MAXLINELENGTH 1000 +#define VERSION "0.1" +#define WIDTH 1024 +#define HEIGHT 768 + +/* global variables */ + +struct track +{ + char *name; + char *title; + char *author; + char *version; + char *full; + char *function; + int x,y,a; + struct track *prev; + struct track *next; +} *tracklist=NULL; + +int fullscreen=0; +int sound=0; +char pseudo[MAXLINELENGTH]="anonymous"; +char url[MAXLINELENGTH]=""; +SDL_Surface *screen; +SDL_Surface *cars[256]; + +void zeRace_exit() +{ + printf("quit\n"); + if (sound) Mix_CloseAudio(); + SDLNet_Quit(); + SDL_Quit(); + /* + save_config(); + zeRace_send_ghosts(); + close_sdl(); + */ + exit(0); +} + + +void zeRace_read_config() +{ + FILE *fic; + char line[MAXLINELENGTH]; + char keyword[MAXLINELENGTH]; + char value[MAXLINELENGTH]; + int configlines=0; + + if ((fic=fopen("zeRace.cfg","rt"))==NULL) + { + fprintf(stderr,"can't open config file \"zeRace.cfg\"\n"); + exit(1); + } + + while (fgets(line,MAXLINELENGTH,fic)) + { + configlines++; + if (*line!=';' && *line!='#' && *line!='/' && *line!='-' && *line!='\n') + { + if ((sscanf(line,"%s : %s\n",(char *)&keyword,(char *)&value))!=2) { fprintf(stderr,"error in config file : each line must have the format \"keyword : value\" (line %d)\n",configlines); exit(1); } + + if (strcmp("pseudo",keyword)==0) + strcpy(pseudo,value); + else + + if (strcmp("url",keyword)==0) + strcpy(url,value); + else + + if (strcmp("fullscreen",keyword)==0) + { + if (strcmp("no",value)==0) fullscreen=0; + else if (strcmp("yes",value)==0) fullscreen=1; + else { fprintf(stderr,"unknown value for \"fullscreen\" option, must be \"yes\" or \"no\"\n"); exit(1); } + } + else + + if (strcmp("sound",keyword)==0) + { + if (strcmp("no",value)==0) sound=0; + else if (strcmp("yes",value)==0) sound=1; + else { fprintf(stderr,"unknown value for \"sound\" option, must be \"yes\" or \"no\"\n"); exit(1); } + } + + else { fprintf(stderr,"error in config file : \"%s\" is an unknown keyword (line %d)\n",keyword,configlines); exit(1); } + } + } +} + + +void zeRace_get_tracks() +{ + struct dirent **namelist; + int i; + unsigned char ext[5]; + FILE *fic; + char *shortname=NULL; + char line[MAXLINELENGTH]; + int configlines; + struct track *tmp=NULL,*first=NULL; + DIR *dirp; + struct dirent *dp; + + if ((dirp=opendir("tracks"))==NULL) { fprintf(stderr,"can't open \"tracks\" directory or no tracks\n"); return; } + + while (dp=readdir(dirp)) if (strlen(dp->d_name)>4) + { + shortname=(char *)realloc(shortname,strlen(dp->d_name)-3); + strncpy(shortname,dp->d_name,strlen(dp->d_name)-4); + shortname[strlen(dp->d_name)-4]='\0'; + for (i=0;i<5;i++) ext[i]=tolower(dp->d_name[strlen(dp->d_name)-4+i]); + if (strcmp(".txt",ext)==0) + { + tmp=(struct track *)malloc(sizeof(struct track)); + if (first==NULL) first=tmp; + tmp->name=(char *)malloc(strlen(shortname)+1); + strcpy(tmp->name,shortname); + tmp->title=""; + tmp->author=""; + tmp->version=""; + tmp->x=10; + tmp->y=10; + tmp->a=0; + configlines=0; + sprintf(line,"tracks/%s.txt",shortname); + if ((fic=fopen(line,"rt"))==NULL) + { + fprintf(stderr,"can't open track file \"%s\"\n",line); + zeRace_exit(); + } + while (fgets(line,MAXLINELENGTH,fic)) + { + configlines++; + if (*line!=';' && *line!='#' && *line!='/' && *line!='-' && *line!='\n') + { + for (i=0;ititle=(char *)malloc(strlen(line+i+3)+1); + strcpy(tmp->title,line+i+3); + } + else + + if (strcmp("author",line)==0) + { + tmp->author=(char *)malloc(strlen(line+i+3)+1); + strcpy(tmp->author,line+i+3); + } + else + + if (strcmp("x",line)==0) + tmp->x=atoi(line+i+3); + else + + if (strcmp("y",line)==0) + tmp->y=atoi(line+i+3); + else + + if (strcmp("a",line)==0) + tmp->a=atoi(line+i+3); + else + + if (strcmp("version",line)==0) + { + tmp->version=(char *)malloc(strlen(line+i+3)+1); + strcpy(tmp->version,line+i+3); + } + + else { fprintf(stderr,"error in track file \"%s\" : \"%s\" is an unknown keyword (line %d)\n",shortname,line,configlines); exit(1); } + } + } + fclose(fic); + tmp->full=(char *)malloc(strlen(line)+20); + sprintf(tmp->full,"tracks/%s.png",shortname); + tmp->function=(char *)malloc(strlen(line)+30); + sprintf(tmp->function,"tracks/%s_function.png",shortname); + tmp->prev=tracklist; + if (tmp->prev) tmp->prev->next=tmp; + tracklist=tmp; + } + } + if (!tmp) { fprintf(stderr,"no circuits found !\n"); zeRace_exit(); } + while (tmp->prev) tmp=tmp->prev; + tmp->prev=tracklist; + tracklist->next=tmp; +} + + +void zeRace_init() +{ + SDL_Surface *car; + int i,flags; + + signal(SIGINT,zeRace_exit); + signal(SIGTERM,zeRace_exit); + zeRace_read_config(); + //zeRace_check_version(); + zeRace_get_tracks(); + //zeRace_get_ghosts(); + + srand(time(NULL)); + + if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)<0) + { + fprintf(stderr,"could not initialize SDL : %s\n",SDL_GetError()); + zeRace_exit(); + } + atexit(SDL_Quit); + + if(SDLNet_Init()==-1) + { + fprintf(stderr,"could not initialize SDLNet : %s\n",SDLNet_GetError()); + zeRace_exit(); + } + + flags=SDL_HWSURFACE|SDL_ANYFORMAT; + if (fullscreen) flags|=SDL_FULLSCREEN; + + if ((screen=SDL_SetVideoMode(WIDTH,HEIGHT,32,flags))==NULL) + { + fprintf(stderr,"could not create a surface : %s\n",SDL_GetError()); + zeRace_exit(); + } + + SDL_WM_SetIcon(SDL_LoadBMP("icon.bmp"),NULL); + SDL_WM_SetCaption("zeRace " VERSION,"zeRace " VERSION); + SDL_ShowCursor(SDL_DISABLE); + + if (sound) if (Mix_OpenAudio(44100,MIX_DEFAULT_FORMAT,2,512)<0) + { + fprintf(stderr,"Mix_OpenAudio error\n"); + zeRace_exit(); + } + + car=IMG_Load("sprites/car.png"); + for (i=0;i<256;i++) + { + float x,y; + float tcos,tsin; + cars[i]=SDL_CreateRGBSurface(SDL_SWSURFACE,car->h*2,car->h*2,32,0x000000ff,0x0000ff00,0x00ff0000,0xff000000); + if(cars[i]==NULL) + { + fprintf(stderr,"CreateRGBSurface failed: %s\n",SDL_GetError()); + exit(1); + } + tcos=cos(2*M_PI*i/256); + tsin=sin(2*M_PI*i/256); + for (x=0;xw;x++) for (y=0;yh;y++) + { + int x2,y2; + Uint32 col; + x2=(x-cars[i]->w/2.0)*tcos+(y-cars[i]->h/2.0)*tsin+car->w/2.0; + y2=(x-cars[i]->w/2.0)*tsin-(y-cars[i]->h/2.0)*tcos+car->h/2.0; + if (x2>0 && x2w && y2>0 && y2h) + putpixel(cars[i],x,y,getpixel(car,x2,y2)); + } + } +} + + +void zeRace_send_time(float x,float y,float speed,float angle,int btime,char *bkeys) +{ + IPaddress ip; + TCPsocket tcpsock; + char *temp; + char *msg1= + "POST /zerace/time.php HTTP/1.1\n" + "Host: royale.zerezo.com\n" + "User-Agent: zeRace " VERSION "\n" + "Content-Type: application/x-www-form-urlencoded\n" + "Content-Length: 99999\n" + "\n" + "pseudo="; + char *msg2="&url="; + char *msg3="&track="; + char *msg4="&btime="; + char *msg5="&x="; + char *msg6="&y="; + char *msg7="&speed="; + char *msg8="&angle="; + char *msg9="&bkeys="; + int len,result; + + printf("sending time... "); + fflush(stdout); + + if(SDLNet_ResolveHost(&ip,"royale.zerezo.com",80)==-1) + { + fprintf(stderr,"SDLNet_ResolveHost: %s\n",SDLNet_GetError()); + return; + } + + tcpsock=SDLNet_TCP_Open(&ip); + if(!tcpsock) + { + fprintf(stderr,"SDLNet_TCP_Open: %s\n",SDLNet_GetError()); + return; + } + + temp=(char *)malloc(strlen(msg1)+strlen(pseudo)+strlen(msg2)+strlen(url)+strlen(msg3)+strlen(tracklist->name)+strlen(msg4)+10+strlen(msg5)+10+strlen(msg6)+10+strlen(msg7)+10+strlen(msg8)+10+strlen(msg9)+strlen(bkeys)+100); + sprintf(temp,"%s%s%s%s%s%s%s%d%s%f%s%f%s%f%s%f%s%s\n",msg1,pseudo,msg2,url,msg3,tracklist->name,msg4,btime,msg5,x,msg6,y,msg7,speed,msg8,angle,msg9,bkeys); + + len=strlen(temp); + result=SDLNet_TCP_Send(tcpsock,temp,len); + if(resultfull); + fun=IMG_Load(tracklist->function); + + sspeed=speed=0; + sangle=angle=(tracklist->a*2*M_PI/360); + sx=x=tracklist->x; + sy=y=tracklist->y; + lastcheck=0; + time=0; + + if (sound) if (!(light=Mix_LoadMUS("sounds/light.wav")) || !(engine=Mix_LoadMUS("sounds/engine.wav")) || !(crash=Mix_LoadMUS("sounds/crash.wav")) || !(slide=Mix_LoadMUS("sounds/slide.wav"))) + { + fprintf(stderr,"Mix_LoadMUS error\n"); + zeRace_exit(); + } + + for (i=4;i>=-1;i--) + { + char startup[15]="sprites/?.png"; + SDL_Surface *temp; + startup[8]='0'+i; + pos.x=x; + pos.y=y; + SDL_BlitSurface(cir,NULL,screen,NULL); + SDL_BlitSurface(cars[(unsigned char)(256*angle/2.0/M_PI)%256],NULL,screen,&pos); + if (i!=4 && i!=-1) + { + temp=IMG_Load(startup); + pos.x=screen->w/2-temp->w/2; + pos.y=screen->h/2-temp->h/2; + SDL_BlitSurface(temp,NULL,screen,&pos); + SDL_FreeSurface(temp); + } + if (sound) if (i!=4) Mix_PlayMusic(light,1); + SDL_Flip(screen); + if (i!=-1) SDL_Delay(1000); + } + + for (;;) + { + size.w=cars[0]->w; + size.h=cars[0]->h; + pos.x=x; + pos.y=y; + SDL_BlitSurface(cir,&pos,screen,&pos); + + ox=x; + oy=y; + speed*=0.995; + x=x-cos(angle)*speed; + y=y-sin(angle)*speed; + + if (x<0 || x>screen->w-cars[0]->w || y<0 || y>screen->h-cars[0]->h) + { + x=ox; + y=oy; + speed=0; + } + + pos.x=x; + pos.y=y; + i=(unsigned char)(256*angle/2.0/M_PI)%256; + SDL_BlitSurface(cars[i],NULL,screen,&pos); + SDL_UpdateRect(screen,ox,oy,cars[i]->w,cars[i]->h); + SDL_UpdateRect(screen,x,y,cars[i]->w,cars[i]->h); + + if (kl) angle-=0.01; + if (kr) angle+=0.01; + if (ku) speed+=0.01*2; + if (kd) speed-=0.01; + + if (lastsound_time+1000.5 || speed>2.0 && !ku) + { + + if (lastsound_time+100w/2+cos(angle)*cars[i]->w/3-sin(angle)*2,y+cars[i]->h/2+sin(angle)*cars[i]->h/3+cos(angle)*2,0); + putpixel(cir,x+cars[i]->w/2+cos(angle)*cars[i]->w/3+sin(angle)*5,y+cars[i]->h/2+sin(angle)*cars[i]->h/3-cos(angle)*5,0); + if (kd) + { + putpixel(cir,x+cars[i]->w/2+cos(angle)*cars[i]->w/3-sin(angle)*3,y+cars[i]->h/2+sin(angle)*cars[i]->h/3+cos(angle)*3,0); + putpixel(cir,x+cars[i]->w/2+cos(angle)*cars[i]->w/3+sin(angle)*4,y+cars[i]->h/2+sin(angle)*cars[i]->h/3-cos(angle)*4,0); + } + } + + c=getpixel(fun,x+cars[i]->w/2,y+cars[i]->h/2); + r=c&0x000000ff; + v=(c&0x0000ff00)>>8; + + if (v==0) + { + x=ox; + y=oy; + if (lastsound_time+100w/2-splash->w/2-1; + pos.w=splash->w+2; + pos.y=screen->h/2-splash->h/2-1; + pos.h=splash->h+2; + SDL_FillRect(screen,&pos,0xffffff); + pos.x=screen->w/2-splash->w/2; + pos.y=screen->h/2-splash->h/2; + SDL_BlitSurface(splash,NULL,screen,&pos); + print(screen,screen->w/2-strlen("zeRace " VERSION)*5,screen->h/2-splash->h/2-20,"zeRace " VERSION); + SDL_FreeSurface(splash); + SDL_Flip(screen); + SDL_Delay(2000); +} + + +void zeRace_menu() +{ + SDL_Event event; + + void update() + { + SDL_Surface *full,*preview; + SDL_Rect pos; + SDL_FillRect(screen,NULL,0x000000); + print(screen,WIDTH/2-28*5,HEIGHT/6,"* Please choose your race *"); + print(screen,WIDTH/2-strlen(tracklist->title)*5,5*HEIGHT/6-20,tracklist->title); + print(screen,WIDTH/2-(strlen(tracklist->author)+strlen("Author : "))*5,5*HEIGHT/6+0,"Author : "); + print(screen,WIDTH/2-(strlen(tracklist->author)-strlen("Author : "))*5,5*HEIGHT/6+0,tracklist->author); + print(screen,WIDTH/2-(strlen(tracklist->version)+strlen("Version : "))*5,5*HEIGHT/6+20,"Version : "); + print(screen,WIDTH/2-(strlen(tracklist->version)-strlen("Version : "))*5,5*HEIGHT/6+20,tracklist->version); + full=IMG_Load(tracklist->full); + preview=(SDL_Surface *)zoomSurface(full,0.5,0.5,1); + SDL_FreeSurface(full); + pos.x=WIDTH/2-preview->w/2-1; + pos.w=preview->w+2; + pos.y=screen->h/2-preview->h/2-1; + pos.h=preview->h+2; + SDL_FillRect(screen,&pos,0xffffff); + pos.x=WIDTH/2-preview->w/2; + pos.y=screen->h/2-preview->h/2; + SDL_BlitSurface(preview,NULL,screen,&pos); + SDL_FreeSurface(preview); + SDL_Flip(screen); + } + + update(); + for (;;) + { + while (SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + zeRace_exit(); + break; + case SDL_KEYDOWN: + switch (event.key.keysym.sym) + { + case SDLK_ESCAPE: // escape + zeRace_exit(); + break; + case SDLK_RETURN: //enter + case SDLK_SPACE: //space + zeRace_launch(); + update(); + break; + case SDLK_LEFT: //left + tracklist=tracklist->next; + update(); + break; + case SDLK_RIGHT: //right + tracklist=tracklist->prev; + update(); + break; + } + break; + } + } + SDL_Delay(10); + } +} + + +int main(int argc,char *argv[]) +{ + zeRace_init(); + zeRace_splash(); + zeRace_menu(); + zeRace_exit(); + return 0; +} diff --git a/zeRace.cfg b/zeRace.cfg new file mode 100644 index 0000000..c3da5a4 --- /dev/null +++ b/zeRace.cfg @@ -0,0 +1,13 @@ +# set this to your nickname to set your name in top list +# http://royale.zerezo.com/zerace/ +pseudo : anonymous + +# set this to add a link on your nickname +#url : mailto:royale@zerezo.com +#url : http://royale.zerezo.com/ + +# set to yes to enable fullscreen +fullscreen : no + +# set to no to turn off awful sounds +sound : no