X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=a77779d9e8f9f99a8a98ef609bc55c9fdc16350e;hb=14089dac2cbe56e563863e1e5adb8847944fd262;hp=926d429e307dbfb17ba1d54f366b6aa22a7a26b7;hpb=b583d4fa28df35b6974bd075d3de65a841454556;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 926d429e..a77779d9 100644 --- a/src/init.c +++ b/src/init.c @@ -57,6 +57,7 @@ static char *image_filename[NUM_PICTURES] = static Bitmap *bitmap_font_initial = NULL; +static void InitGlobal(void); static void InitSetup(void); static void InitPlayerInfo(void); static void InitLevelInfo(void); @@ -73,16 +74,14 @@ static void InitElementProperties(void); static void InitElementInfo(void); static void InitGraphicInfo(void); static void InitSoundInfo(); -static void Execute_Debug_Command(char *); +static void Execute_Command(char *); void OpenAll(void) { - if (options.debug_command) - { - Execute_Debug_Command(options.debug_command); + InitGlobal(); /* initialize some global variables */ - exit(0); - } + if (options.execute_command) + Execute_Command(options.execute_command); if (options.serveronly) { @@ -125,16 +124,32 @@ void OpenAll(void) InitImages(); /* needs to know current level directory */ InitSound(); /* needs to know current level directory */ +#if 0 InitGadgets(); /* needs images + number of level series */ +#endif InitGfxBackground(); - InitToons(); + + if (global.autoplay_leveldir) + { + AutoPlayTape(); + return; + } DrawMainMenu(); InitNetworkServer(); } +void InitGlobal() +{ + global.autoplay_leveldir = NULL; + + global.frames_per_second = 0; + global.fps_slowdown = FALSE; + global.fps_slowdown_factor = 1; +} + void InitSetup() { LoadSetup(); /* global setup info */ @@ -204,6 +219,11 @@ static void ReinitializeGraphics() new_graphic_info[IMG_MENU_FONT_MEDIUM].bitmap, new_graphic_info[IMG_MENU_FONT_SMALL].bitmap, new_graphic_info[IMG_MENU_FONT_EM].bitmap); + + SetBackgroundBitmap(NULL); + + InitGadgets(); + InitToons(); } static void InitImages() @@ -407,11 +427,6 @@ void InitGfx() int i; #endif - /* initialize some global variables */ - global.frames_per_second = 0; - global.fps_slowdown = FALSE; - global.fps_slowdown_factor = 1; - /* initialize screen properties */ InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE); @@ -468,7 +483,7 @@ void InitGfxBackground() fieldbuffer = bitmap_db_field; SetDrawtoField(DRAW_BACKBUFFER); - BlitBitmap(new_graphic_info[IMG_MENU_BACK].bitmap, backbuffer, + BlitBitmap(new_graphic_info[IMG_MENU_FRAME].bitmap, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE); ClearRectangle(bitmap_db_door, 0, 0, 3 * DXSIZE, DYSIZE + VYSIZE); @@ -573,6 +588,10 @@ void ReloadCustomArtwork() } #endif +#if 0 + SyncDisplay(); +#endif + ReinitializeGraphics(); FreeTileClipmasks(); @@ -638,13 +657,29 @@ void ReloadCustomArtwork() #endif } +void FreeGadgets() +{ + FreeLevelEditorGadgets(); + FreeGameButtons(); + FreeTapeButtons(); + FreeToolButtons(); + FreeScreenGadgets(); +} + void InitGadgets() { + static boolean gadgets_initialized = FALSE; + + if (gadgets_initialized) + FreeGadgets(); + CreateLevelEditorGadgets(); CreateGameButtons(); CreateTapeButtons(); CreateToolButtons(); CreateScreenGadgets(); + + gadgets_initialized = TRUE; } void InitElementInfo() @@ -668,9 +703,9 @@ void InitElementInfo() element_info[i].graphic[GFX_ACTION_DEFAULT] = IMG_CHAR_START + (i - EL_CHAR_START); - for (i=EL_GENERIC_START; i<=EL_GENERIC_END; i++) + for (i=EL_CUSTOM_START; i<=EL_CUSTOM_END; i++) element_info[i].graphic[GFX_ACTION_DEFAULT] = - IMG_GENERIC_START + (i - EL_GENERIC_START); + IMG_CUSTOM_START + (i - EL_CUSTOM_START); i = 0; while (element_to_graphic[i].element > -1) @@ -739,11 +774,18 @@ void InitElementInfo() static void InitGraphicInfo() { + static boolean clipmasks_initialized = FALSE; static int gfx_action[NUM_IMAGE_FILES]; Bitmap *src_bitmap; int src_x, src_y; int first_frame, last_frame; int i; +#if defined(TARGET_X11_NATIVE) + Pixmap src_pixmap; + XGCValues clip_gc_values; + unsigned long clip_gc_valuemask; + GC copy_clipmask_gc = None; +#endif image_files = getCurrentImageList(); @@ -766,6 +808,22 @@ static void InitGraphicInfo() i++; } +#if defined(TARGET_X11_NATIVE) + if (clipmasks_initialized) + { + for (i=0; i src_bitmap->width || src_y + TILEY > src_bitmap->height) - Error(ERR_EXIT, "InitGraphicInfo: first frame of graphic animation object %d outside of image bitmap file '%s'", i, src_bitmap->source_filename); + { + Error(ERR_RETURN, "custom artwork configuration error:"); + Error(ERR_RETURN, "- config file: '%s'", + getImageConfigFilename()); + Error(ERR_RETURN, "- config token: '%s'", + getTokenFromImageID(i)); + Error(ERR_RETURN, "- image file: '%s'", + src_bitmap->source_filename); + Error(ERR_EXIT, "error: first animation frame out of bounds (%d,%d)", + src_x, src_y); + } last_frame = new_graphic_info[i].anim_frames - 1; getGraphicSource(i, last_frame, &src_bitmap, &src_x, &src_y); if (src_x < 0 || src_y < 0 || src_x + TILEX > src_bitmap->width || src_y + TILEY > src_bitmap->height) - Error(ERR_EXIT, "InitGraphicInfo: last frame of graphic animation object %d outside of image bitmap file '%s'", i, src_bitmap->source_filename); + { + Error(ERR_RETURN, "custom artwork configuration error:"); + Error(ERR_RETURN, "- config file: '%s'", + getImageConfigFilename()); + Error(ERR_RETURN, "- config token: '%s'", + getTokenFromImageID(i)); + Error(ERR_RETURN, "- image file: '%s'", + src_bitmap->source_filename); + Error(ERR_EXIT, "error: last animation frame out of bounds (%d,%d)", + src_x, src_y); + } + +#if defined(TARGET_X11_NATIVE) + /* currently we need only a tile clip mask from the first frame */ + getGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y); + + if (copy_clipmask_gc == None) + { + clip_gc_values.graphics_exposures = False; + clip_gc_valuemask = GCGraphicsExposures; + copy_clipmask_gc = XCreateGC(display, src_bitmap->clip_mask, + clip_gc_valuemask, &clip_gc_values); + } + + new_graphic_info[i].clip_mask = + XCreatePixmap(display, window->drawable, TILEX, TILEY, 1); + + src_pixmap = src_bitmap->clip_mask; + XCopyArea(display, src_pixmap, new_graphic_info[i].clip_mask, + copy_clipmask_gc, src_x, src_y, TILEX, TILEY, 0, 0); + + clip_gc_values.graphics_exposures = False; + clip_gc_values.clip_mask = new_graphic_info[i].clip_mask; + clip_gc_valuemask = GCGraphicsExposures | GCClipMask; + new_graphic_info[i].clip_gc = + XCreateGC(display, window->drawable, clip_gc_valuemask, &clip_gc_values); +#endif } + +#if defined(TARGET_X11_NATIVE) + if (copy_clipmask_gc) + XFreeGC(display, copy_clipmask_gc); +#endif + + clipmasks_initialized = TRUE; } static void InitSoundInfo() @@ -2078,9 +2192,9 @@ void InitElementProperties() Elementeigenschaften1[i] |= (EP_BIT_CHAR | EP_BIT_INACTIVE); } -void Execute_Debug_Command(char *command) +void Execute_Command(char *command) { - if (strcmp(command, "create graphicsinfo.conf") == 0) + if (strcmp(command, "print graphicsinfo.conf") == 0) { int i; @@ -2096,8 +2210,10 @@ void Execute_Debug_Command(char *command) printf("# %s\n", getFormattedSetupEntry(image_config[i].token, image_config[i].value)); + + exit(0); } - else if (strcmp(command, "create soundsinfo.conf") == 0) + else if (strcmp(command, "print soundsinfo.conf") == 0) { int i; @@ -2113,21 +2229,48 @@ void Execute_Debug_Command(char *command) printf("# %s\n", getFormattedSetupEntry(sound_config[i].token, sound_config[i].value)); + + exit(0); } - else if (strcmp(command, "create musicinfo.conf") == 0) + else if (strcmp(command, "print musicinfo.conf") == 0) { printf("# (Currently only \"name\" and \"sort_priority\" recognized.)\n"); printf("\n"); printf("%s\n", getFormattedSetupEntry("name", "Classic Music")); printf("\n"); printf("%s\n", getFormattedSetupEntry("sort_priority", "100")); + + exit(0); + } + else if (strncmp(command, "dump tape ", 10) == 0) + { + char *filename = &command[10]; + + if (access(filename, F_OK) != 0) + Error(ERR_EXIT, "cannot open file '%s'", filename); + + LoadTapeFromFilename(filename); + DumpTape(&tape); + + exit(0); + } + else if (strncmp(command, "autoplay ", 9) == 0) + { + char *str_copy = getStringCopy(&command[9]); + char *str_ptr = strchr(str_copy, ' '); + + global.autoplay_leveldir = str_copy; + global.autoplay_level_nr = -1; + + if (str_ptr != NULL) + { + *str_ptr++ = '\0'; /* terminate leveldir string */ + global.autoplay_level_nr = atoi(str_ptr); /* get level_nr value */ + } } - else if (strcmp(command, "help") == 0) + else { - printf("The following commands are recognized:\n"); - printf(" \"create graphicsinfo.conf\"\n"); - printf(" \"create soundsinfo.conf\"\n"); - printf(" \"create musicinfo.conf\"\n"); + Error(ERR_EXIT_HELP, "unrecognized command '%s'", command); } }