X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.c;h=46277b95ad0dccae43801e9992d668be4fe2de28;hb=fa26d82a378cebf6b519c566c3f33739ebba7823;hp=324c4f57cdd805b36c7c70e114122841a68e236a;hpb=727c32da2353e1f688c4636b86a1ab6e8a71f8d6;p=rocksndiamonds.git diff --git a/src/main.c b/src/main.c index 324c4f57..46277b95 100644 --- a/src/main.c +++ b/src/main.c @@ -19,7 +19,10 @@ #include "events.h" GC tile_clip_gc; +#if 0 Bitmap *pix[NUM_BITMAPS]; +#endif +Bitmap *bitmap_db_field, *bitmap_db_door; Pixmap tile_clipmask[NUM_TILES]; DrawBuffer *fieldbuffer; DrawBuffer *drawto_field; @@ -42,6 +45,7 @@ short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +short GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; @@ -55,7 +59,7 @@ int lev_fieldx,lev_fieldy, scroll_x,scroll_y; int FX = SX, FY = SY, ScrollStepSize; int ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0; int ScreenGfxPos = 0; -int BorderElement = EL_BETON; +int BorderElement = EL_STEELWALL; int GameFrameDelay = GAME_FRAME_DELAY; int FfwdFrameDelay = FFWD_FRAME_DELAY; int BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1; @@ -136,233 +140,35 @@ char *sound_name[NUM_SOUNDS] = "gate.wav" }; -struct ArtworkConfigInfo image_config[] = +/* this is used to reduce memory usage of the different animation types */ +int graphics_action_mapping[] = { - /* graphics for Boulder Dash style elements and actions */ - { "bd_diamond", "bd_diamond.pcx" }, - { "bd_diamond.frame_xpos", "0" }, - { "bd_diamond.num_frames", "1" }, - { "robot_wheel", "bd_diamond.pcx" }, - { "robot_wheel.frame_xpos", "0" }, - { "robot_wheel.num_frames", "4" }, + 0, /* GFX_ACTION_DEFAULT (0) */ + 0, /* GFX_ACTION_WAITING (1) */ + + 1, /* GFX_ACTION_FALLING (2) */ + 2, /* GFX_ACTION_MOVING (3) */ + 3, /* GFX_ACTION_DIGGING (4) */ + 4, /* GFX_ACTION_SNAPPING (5) */ + 5, /* GFX_ACTION_COLLECTING (6) */ + 6, /* GFX_ACTION_PUSHING (7) */ + + 7, /* GFX_ACTION_PASSING (8) */ + 7, /* GFX_ACTION_IMPACT (9) */ + 7, /* GFX_ACTION_CRACKING (10) */ + 7, /* GFX_ACTION_BREAKING (11) */ + 7, /* GFX_ACTION_ACTIVATING (12) */ + 7, /* GFX_ACTION_OPENING (13) */ + 7, /* GFX_ACTION_CLOSING (14) */ + 7, /* GFX_ACTION_EATING (15) */ + 7, /* GFX_ACTION_ATTACKING (16) */ + 7, /* GFX_ACTION_GROWING (17) */ + 7, /* GFX_ACTION_SHRINKING (18) */ + 7 /* GFX_ACTION_OTHER (19) */ }; -struct ArtworkConfigInfo sound_config[] = -{ - /* sounds for Boulder Dash style elements and actions */ - { "bd_empty_space.digging", "empty.wav" }, - { "bd_sand.digging", "schlurf.wav" }, - { "bd_diamond.collecting", "pong.wav" }, - { "bd_diamond.impact", "pling.wav" }, - { "bd_rock.pushing", "pusch.wav" }, - { "bd_rock.impact", "klopf.wav" }, - { "bd_magic_wall.activating", "quirk.wav" }, - { "bd_magic_wall.changing", "quirk.wav" }, - { "bd_magic_wall.running", "miep.wav" }, - { "bd_amoeba.waiting", SND_FILE_UNDEFINED }, - { "bd_amoeba.creating", "amoebe.wav" }, - { "bd_amoeba.turning_to_gem", "pling.wav" }, - { "bd_amoeba.turning_to_rock", "klopf.wav" }, - { "bd_butterfly.moving", "klapper.wav" }, - { "bd_butterfly.waiting", "klapper.wav" }, - { "bd_firefly.moving", "roehr.wav" }, - { "bd_firefly.waiting", "roehr.wav" }, - { "bd_exit.entering", "buing.wav" }, - - /* sounds for Supaplex style elements and actions */ - { "sp_empty_space.digging", "empty.wav" }, - { "sp_base.digging", "base.wav" }, - { "sp_buggy_base.digging", "base.wav" }, - { "sp_buggy_base.activating", "bug.wav" }, - { "sp_infotron.collecting", "infotron.wav" }, - { "sp_infotron.impact", "pling.wav" }, - { "sp_zonk.pushing", "zonkpush.wav" }, - { "sp_zonk.impact", "zonkdown.wav" }, - { "sp_disk_red.collecting", "infotron.wav" }, - { "sp_disk_orange.pushing", "zonkpush.wav" }, - { "sp_disk_yellow.pushing", "pusch.wav" }, - { "sp_port.passing", "gate.wav" }, - { "sp_exit.entering", "exit.wav" }, - { "sp_element.exploding", "booom.wav" }, - { "sp_sniksnak.moving", SND_FILE_UNDEFINED }, - { "sp_sniksnak.waiting", SND_FILE_UNDEFINED }, - { "sp_electron.moving", SND_FILE_UNDEFINED }, - { "sp_electron.waiting", SND_FILE_UNDEFINED }, - { "sp_terminal.activating", SND_FILE_UNDEFINED }, - - /* sounds for Sokoban style elements and actions */ - { "sokoban_object.pushing", "pusch.wav" }, - { "sokoban_field.filling", "deng.wav" }, - { "sokoban_field.clearing", SND_FILE_UNDEFINED }, - { "sokoban_game.solving", "buing.wav" }, - - /* sounds for Emerald Mine style elements and actions */ - { "empty_space.digging", "empty.wav" }, - { "sand.digging", "schlurf.wav" }, - { "emerald.collecting", "pong.wav" }, - { "emerald.impact", "pling.wav" }, - { "diamond.collecting", "pong.wav" }, - { "diamond.impact", "pling.wav" }, - { "diamond.breaking", "quirk.wav" }, - { "rock.pushing", "pusch.wav" }, - { "rock.impact", "klopf.wav" }, - { "bomb.pushing", "pusch.wav" }, - { "nut.pushing", "knurk.wav" }, - { "nut.cracking", "knack.wav" }, - { "nut.impact", "klumpf.wav" }, - { "dynamite.collecting", "pong.wav" }, - { "dynamite.placing", "deng.wav" }, - { "dynamite.burning", "zisch.wav" }, - { "key.collecting", "pong.wav" }, - { "gate.passing", "gate.wav" }, - { "bug.moving", "klapper.wav" }, - { "bug.waiting", "klapper.wav" }, - { "spaceship.moving", "roehr.wav" }, - { "spaceship.waiting", "roehr.wav" }, - { "yamyam.moving", SND_FILE_UNDEFINED }, - { "yamyam.waiting", "njam.wav" }, - { "yamyam.eating_diamond", SND_FILE_UNDEFINED }, - { "robot.stepping", "schlurf.wav" }, - { "robot.waiting", SND_FILE_UNDEFINED }, - { "robot_wheel.activating", "deng.wav" }, - { "robot_wheel.running", "miep.wav" }, - { "magic_wall.activating", "quirk.wav" }, - { "magic_wall.changing", "quirk.wav" }, - { "magic_wall.running", "miep.wav" }, - { "amoeba.waiting", SND_FILE_UNDEFINED }, - { "amoeba.creating", "amoebe.wav" }, - { "amoeba.dropping", SND_FILE_UNDEFINED }, - { "acid.splashing", "blurb.wav" }, - { "quicksand.filling", SND_FILE_UNDEFINED }, - { "quicksand.slipping_through", SND_FILE_UNDEFINED }, - { "quicksand.emptying", SND_FILE_UNDEFINED }, - { "exit.opening", "oeffnen.wav" }, - { "exit.entering", "buing.wav" }, - - /* sounds for Emerald Mine Club style elements and actions */ - { "balloon.moving", SND_FILE_UNDEFINED }, - { "balloon.waiting", SND_FILE_UNDEFINED }, - { "balloon.pushing", "schlurf.wav" }, - { "balloon_switch.activating", SND_FILE_UNDEFINED }, - { "spring.moving", SND_FILE_UNDEFINED }, - { "spring.pushing", "pusch.wav" }, - { "spring.impact", "klopf.wav" }, - { "wall.growing", SND_FILE_UNDEFINED }, - - /* sounds for Diamond Caves style elements and actions */ - { "pearl.collecting", "pong.wav" }, - { "pearl.breaking", "knack.wav" }, - { "pearl.impact", "pling.wav" }, - { "crystal.collecting", "pong.wav" }, - { "crystal.impact", "pling.wav" }, - { "envelope.collecting", "pong.wav" }, - { "sand_invisible.digging", "schlurf.wav" }, - { "shield_passive.collecting", "pong.wav" }, - { "shield_passive.activated", SND_FILE_UNDEFINED }, - { "shield_active.collecting", "pong.wav" }, - { "shield_active.activated", SND_FILE_UNDEFINED }, - { "extra_time.collecting", "gong.wav" }, - { "mole.moving", SND_FILE_UNDEFINED }, - { "mole.waiting", SND_FILE_UNDEFINED }, - { "mole.eating_amoeba", "blurb.wav" }, - { "switchgate_switch.activating", SND_FILE_UNDEFINED }, - { "switchgate.opening", "oeffnen.wav" }, - { "switchgate.closing", "oeffnen.wav" }, - { "switchgate.passing", "gate.wav" }, - { "timegate_wheel.activating", "deng.wav" }, - { "timegate_wheel.running", "miep.wav" }, - { "timegate.opening", "oeffnen.wav" }, - { "timegate.closing", "oeffnen.wav" }, - { "timegate.passing", "gate.wav" }, - { "conveyor_belt_switch.activating", SND_FILE_UNDEFINED }, - { "conveyor_belt.running", SND_FILE_UNDEFINED }, - { "light_switch.activating", SND_FILE_UNDEFINED }, - { "light_switch.deactivating", SND_FILE_UNDEFINED }, - - /* sounds for DX Boulderdash style elements and actions */ - { "dx_bomb.pushing", "pusch.wav" }, - { "trap_inactive.digging", "schlurf.wav" }, - { "trap.activating", SND_FILE_UNDEFINED }, - { "tube.passing", SND_FILE_UNDEFINED }, - - /* sounds for Rocks'n'Diamonds style elements and actions */ - { "amoeba.turning_to_gem", "pling.wav" }, - { "amoeba.turning_to_rock", "klopf.wav" }, - { "speed_pill.collecting", "pong.wav" }, - { "dynabomb_nr.collecting", "pong.wav" }, - { "dynabomb_sz.collecting", "pong.wav" }, - { "dynabomb_xl.collecting", "pong.wav" }, - { "dynabomb.placing", "deng.wav" }, - { "dynabomb.burning", "zisch.wav" }, - { "satellite.moving", SND_FILE_UNDEFINED }, - { "satellite.waiting", SND_FILE_UNDEFINED }, - { "satellite.pushing", "pusch.wav" }, - { "lamp.activating", "deng.wav" }, - { "lamp.deactivating", "deng.wav" }, - { "time_orb_full.collecting", "gong.wav" }, - { "time_orb_full.impact", "deng.wav" }, - { "time_orb_empty.pushing", "pusch.wav" }, - { "time_orb_empty.impact", "deng.wav" }, - { "gameoflife.waiting", SND_FILE_UNDEFINED }, - { "gameoflife.creating", "amoebe.wav" }, - { "biomaze.waiting", SND_FILE_UNDEFINED }, - { "biomaze.creating", "amoebe.wav" }, - { "pacman.moving", SND_FILE_UNDEFINED }, - { "pacman.waiting", SND_FILE_UNDEFINED }, - { "pacman.eating_amoeba", SND_FILE_UNDEFINED }, - { "dark_yamyam.moving", SND_FILE_UNDEFINED }, - { "dark_yamyam.waiting", "njam.wav" }, - { "dark_yamyam.eating_any", SND_FILE_UNDEFINED }, - { "penguin.moving", SND_FILE_UNDEFINED }, - { "penguin.waiting", SND_FILE_UNDEFINED }, - { "penguin.entering_exit", "buing.wav" }, - { "pig.moving", SND_FILE_UNDEFINED }, - { "pig.waiting", SND_FILE_UNDEFINED }, - { "pig.eating_gem", SND_FILE_UNDEFINED }, - { "dragon.moving", SND_FILE_UNDEFINED }, - { "dragon.waiting", SND_FILE_UNDEFINED }, - { "dragon.attacking", SND_FILE_UNDEFINED }, - - /* sounds for generic elements and actions */ - { "player.dying", "autsch.wav" }, - { "element.exploding", "roaaar.wav" }, - - /* sounds for other game actions */ - { "game.starting", SND_FILE_UNDEFINED }, - { "game.running_out_of_time", "gong.wav" }, - { "game.leveltime_bonus", "sirr.wav" }, - { "game.losing", "lachen.wav" }, - { "game.winning", SND_FILE_UNDEFINED }, - - /* sounds for other non-game actions */ - { "menu.door_opening", "oeffnen.wav" }, - { "menu.door_closing", "oeffnen.wav" }, - { "menu.hall_of_fame", "halloffame.wav" }, - { "menu.info_screen", "rhythmloop.wav" }, - -#if 0 - { "[not used]", "antigrav.wav" }, - { "[not used]", "bong.wav" }, - { "[not used]", "fuel.wav" }, - { "[not used]", "holz.wav" }, - { "[not used]", "hui.wav" }, - { "[not used]", "kabumm.wav" }, - { "[not used]", "kink.wav" }, - { "[not used]", "kling.wav" }, - { "[not used]", "krach.wav" }, - { "[not used]", "laser.wav" }, - { "[not used]", "quiek.wav" }, - { "[not used]", "rumms.wav" }, - { "[not used]", "schlopp.wav" }, - { "[not used]", "schrff.wav" }, - { "[not used]", "schwirr.wav" }, - { "[not used]", "slurp.wav" }, - { "[not used]", "sproing.wav" }, - { "[not used]", "warnton.wav" }, - { "[not used]", "whoosh.wav" }, - { "[not used]", "boom.wav" }, -#endif -}; +struct FileInfo *image_files; +struct FileInfo *sound_files; struct ElementInfo element_info[MAX_ELEMENTS] = { @@ -388,14 +194,14 @@ struct ElementInfo element_info[MAX_ELEMENTS] = { "bomb", "bomb" }, { "magic_wall", "magic wall" }, /* 20 */ { "speed_pill", "speed pill" }, - { "acid", "acid pool" }, + { "acid", "acid" }, { "amoeba", "dropping amoeba" }, { "amoeba", "normal amoeba" }, { "nut", "nut with emerald" }, { "gameoflife", "Conway's wall of life" }, { "biomaze", "biomaze" }, { "dynamite", "burning dynamite" }, - { NULL, "unknown" }, + { "wall", "wall" }, { "robot_wheel", "magic wheel" }, /* 30 */ { "robot_wheel", "magic wheel (running)" }, { "key", "red key" }, @@ -429,7 +235,9 @@ struct ElementInfo element_info[MAX_ELEMENTS] = { "dark_yamyam", "dark yam yam" }, /* 60 */ { "bd_magic_wall", "magic wall (BD style)" }, { "wall", "invisible steel wall" }, - { NULL, "-" }, + + { NULL, "(not used)" }, + { "dynabomb_nr", "increases number of bombs" }, { "dynabomb_sz", "increases explosion size" }, { "dynabomb_xl", "increases power of explosion" }, @@ -466,12 +274,12 @@ struct ElementInfo element_info[MAX_ELEMENTS] = { "emerald", "purple emerald" }, { "wall", "wall with red emerald" }, { "wall", "wall with purple emerald" }, - { NULL, "unknown" }, /* 100 */ - { NULL, "unknown" }, - { NULL, "unknown" }, - { NULL, "unknown" }, - { NULL, "unknown" }, - { NULL, "normal wall (BD style)" }, + { "wall", "acid pool (top left)" }, /* 100 */ + { "wall", "acid pool (top right)" }, + { "wall", "acid pool (bottom left)" }, + { "wall", "acid pool (bottom)" }, + { "wall", "acid pool (bottom right)" }, + { "wall", "normal wall (BD style)" }, { "bd_rock", "rock (BD style)" }, { "exit", "open exit" }, { NULL, "black orb bomb" }, @@ -620,8 +428,9 @@ struct ElementInfo element_info[MAX_ELEMENTS] = { "gate", "gray door (EM style, yellow key)"}, { "gate", "gray door (EM style, green key)"}, { "gate", "gray door (EM style, blue key)"}, - { NULL, "unknown" }, - { NULL, "unknown" }, + + { NULL, "(not used)" }, + { NULL, "(not used)" }, /* 256 */ @@ -632,7 +441,7 @@ struct ElementInfo element_info[MAX_ELEMENTS] = { "gate", "white door" }, /* 260 */ { "gate", "gray door (opened by white key)"}, { "key", "white key" }, - { "shield_passive", "shield (passive)" }, + { "shield_normal", "shield (normal)" }, { "extra_time", "extra time" }, { "switchgate", "switch gate (open)" }, { "switchgate", "switch gate (closed)" }, @@ -686,18 +495,21 @@ struct ElementInfo element_info[MAX_ELEMENTS] = { "mole", "mole (starts moving down)" }, { "wall", "steel wall (slanted)" }, { "sand", "invisible sand" }, - { NULL, "dx unknown 15" }, - { NULL, "dx unknown 42" }, - { NULL, "-" }, - { NULL, "-" }, /* 320 */ - { "shield_active", "shield (active, kills enemies)"}, + + { NULL, "dx unknown element 15" }, + { NULL, "dx unknown element 42" }, + + { NULL, "(not used)" }, + { NULL, "(not used)" }, /* 320 */ + + { "shield_deadly", "shield (deadly, kills enemies)"}, { "timegate", "time gate (open)" }, { "timegate", "time gate (closed)" }, - { "timegate_wheel", "switch for time gate" }, - { "timegate_wheel", "switch for time gate" }, + { "timegate_switch", "switch for time gate" }, + { "timegate_switch", "switch for time gate" }, { "balloon", "balloon" }, - { "wall", "send balloon to the left" }, - { "wall", "send balloon to the right" }, + { "balloon_switch", "send balloon to the left" }, + { "balloon_switch", "send balloon to the right" }, { "balloon_switch", "send balloon up" }, { "balloon_switch", "send balloon down" }, /* 330 */ { "balloon_switch", "send balloon in any direction" }, @@ -727,6 +539,137 @@ struct ElementInfo element_info[MAX_ELEMENTS] = { "spring", "spring" }, { "trap", "trap" }, { "dx_bomb", "stable bomb (DX style)" }, + { NULL, "-" }, + { NULL, "-" }, + { "custom", "custom element 0" }, + { "custom", "custom element 1" }, + { "custom", "custom element 2" }, + { "custom", "custom element 3" }, + { "custom", "custom element 4" }, + { "custom", "custom element 5" }, + { "custom", "custom element 6" }, + { "custom", "custom element 7" }, + { "custom", "custom element 8" }, + { "custom", "custom element 9" }, + { "custom", "custom element 10" }, + { "custom", "custom element 11" }, + { "custom", "custom element 12" }, + { "custom", "custom element 13" }, + { "custom", "custom element 14" }, + { "custom", "custom element 15" }, + { "custom", "custom element 16" }, + { "custom", "custom element 17" }, + { "custom", "custom element 18" }, + { "custom", "custom element 19" }, + { "custom", "custom element 20" }, + { "custom", "custom element 21" }, + { "custom", "custom element 22" }, + { "custom", "custom element 23" }, + { "custom", "custom element 24" }, + { "custom", "custom element 25" }, + { "custom", "custom element 26" }, + { "custom", "custom element 27" }, + { "custom", "custom element 28" }, + { "custom", "custom element 29" }, + { "custom", "custom element 30" }, + { "custom", "custom element 31" }, + { "custom", "custom element 32" }, + { "custom", "custom element 33" }, + { "custom", "custom element 34" }, + { "custom", "custom element 35" }, + { "custom", "custom element 36" }, + { "custom", "custom element 37" }, + { "custom", "custom element 38" }, + { "custom", "custom element 39" }, + { "custom", "custom element 40" }, + { "custom", "custom element 41" }, + { "custom", "custom element 42" }, + { "custom", "custom element 43" }, + { "custom", "custom element 44" }, + { "custom", "custom element 45" }, + { "custom", "custom element 46" }, + { "custom", "custom element 47" }, + { "custom", "custom element 48" }, + { "custom", "custom element 49" }, + { "custom", "custom element 50" }, + { "custom", "custom element 51" }, + { "custom", "custom element 52" }, + { "custom", "custom element 53" }, + { "custom", "custom element 54" }, + { "custom", "custom element 55" }, + { "custom", "custom element 56" }, + { "custom", "custom element 57" }, + { "custom", "custom element 58" }, + { "custom", "custom element 59" }, + { "custom", "custom element 60" }, + { "custom", "custom element 61" }, + { "custom", "custom element 62" }, + { "custom", "custom element 63" }, + { "custom", "custom element 64" }, + { "custom", "custom element 65" }, + { "custom", "custom element 66" }, + { "custom", "custom element 67" }, + { "custom", "custom element 68" }, + { "custom", "custom element 69" }, + { "custom", "custom element 70" }, + { "custom", "custom element 71" }, + { "custom", "custom element 72" }, + { "custom", "custom element 73" }, + { "custom", "custom element 74" }, + { "custom", "custom element 75" }, + { "custom", "custom element 76" }, + { "custom", "custom element 77" }, + { "custom", "custom element 78" }, + { "custom", "custom element 79" }, + { "custom", "custom element 80" }, + { "custom", "custom element 81" }, + { "custom", "custom element 82" }, + { "custom", "custom element 83" }, + { "custom", "custom element 84" }, + { "custom", "custom element 85" }, + { "custom", "custom element 86" }, + { "custom", "custom element 87" }, + { "custom", "custom element 88" }, + { "custom", "custom element 89" }, + { "custom", "custom element 90" }, + { "custom", "custom element 91" }, + { "custom", "custom element 92" }, + { "custom", "custom element 93" }, + { "custom", "custom element 94" }, + { "custom", "custom element 95" }, + { "custom", "custom element 96" }, + { "custom", "custom element 97" }, + { "custom", "custom element 98" }, + { "custom", "custom element 99" }, + { "custom", "custom element 100" }, + { "custom", "custom element 101" }, + { "custom", "custom element 102" }, + { "custom", "custom element 103" }, + { "custom", "custom element 104" }, + { "custom", "custom element 105" }, + { "custom", "custom element 106" }, + { "custom", "custom element 107" }, + { "custom", "custom element 108" }, + { "custom", "custom element 109" }, + { "custom", "custom element 110" }, + { "custom", "custom element 111" }, + { "custom", "custom element 112" }, + { "custom", "custom element 113" }, + { "custom", "custom element 114" }, + { "custom", "custom element 115" }, + { "custom", "custom element 116" }, + { "custom", "custom element 117" }, + { "custom", "custom element 118" }, + { "custom", "custom element 119" }, + { "custom", "custom element 120" }, + { "custom", "custom element 121" }, + { "custom", "custom element 122" }, + { "custom", "custom element 123" }, + { "custom", "custom element 124" }, + { "custom", "custom element 125" }, + { "custom", "custom element 126" }, + { "custom", "custom element 127" }, + { NULL, "-" } /* @@ -735,6 +678,7 @@ struct ElementInfo element_info[MAX_ELEMENTS] = }; struct GraphicInfo graphic_info[MAX_GRAPHICS]; +struct NewGraphicInfo new_graphic_info[NUM_IMAGE_FILES]; /* ========================================================================= */