X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_bd%2Fbd_cave.c;h=4c5b4287a6f5dae50cc5fbb7a71c725b5a0a41e1;hb=157fb76461d332a22233e6664cd294d7db5d3558;hp=a1a5d40959bda960ea062d8221e932edcdc288a1;hpb=56570687a23b88c3149c74e45add4cc9ed92796c;p=rocksndiamonds.git diff --git a/src/game_bd/bd_cave.c b/src/game_bd/bd_cave.c index a1a5d409..4c5b4287 100644 --- a/src/game_bd/bd_cave.c +++ b/src/game_bd/bd_cave.c @@ -14,9 +14,6 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include -#include - #include "main_bd.h" @@ -105,7 +102,7 @@ GdDirection gd_direction_from_string(const char *str) { int i; - for (i = 1; ih) * sizeof(gpointer)); + rows = checked_malloc((cave->h) * sizeof(void *)); rows[0] = checked_calloc(cell_size * cave->w * cave->h); for (y = 1; y < cave->h; y++) @@ -496,17 +493,17 @@ gpointer gd_cave_map_new_for_cave(const GdCave *cave, const int cell_size) if map is null, this also returns null. */ -gpointer gd_cave_map_dup_size(const GdCave *cave, const gpointer map, const int cell_size) +void *gd_cave_map_dup_size(const GdCave *cave, const void *map, const int cell_size) { - gpointer *rows; - gpointer *maplines = (gpointer *)map; + void **rows; + void **maplines = (void **)map; int y; if (!map) return NULL; - rows = checked_malloc((cave->h) * sizeof(gpointer)); - rows[0] = getMemCopy (maplines[0], cell_size * cave->w * cave->h); + rows = checked_malloc((cave->h) * sizeof(void *)); + rows[0] = get_memcpy (maplines[0], cell_size * cave->w * cave->h); for (y = 1; y < cave->h; y++) rows[y] = (char *)rows[0] + cell_size * cave->w * y; @@ -514,9 +511,9 @@ gpointer gd_cave_map_dup_size(const GdCave *cave, const gpointer map, const int return rows; } -void gd_cave_map_free(gpointer map) +void gd_cave_map_free(void *map) { - gpointer *maplines = (gpointer *) map; + void **maplines = (void **) map; if (!map) return; @@ -538,13 +535,13 @@ void gd_cave_free(GdCave *cave) if (cave->tags) hashtable_destroy(cave->tags); - if (cave->random) /* random generator is a GRand * */ - g_rand_free(cave->random); + if (cave->random) /* random generator is a GdRand * */ + gd_rand_free(cave->random); /* free strings */ for (i = 0; gd_cave_properties[i].identifier != NULL; i++) if (gd_cave_properties[i].type == GD_TYPE_LONGSTRING) - checked_free(G_STRUCT_MEMBER(char *, cave, gd_cave_properties[i].offset)); + checked_free(STRUCT_MEMBER(char *, cave, gd_cave_properties[i].offset)); /* map */ gd_cave_map_free(cave->map); @@ -592,8 +589,8 @@ void gd_cave_copy(GdCave *dest, const GdCave *src) /* for longstrings */ for (i = 0; gd_cave_properties[i].identifier != NULL; i++) if (gd_cave_properties[i].type == GD_TYPE_LONGSTRING) - G_STRUCT_MEMBER(char *, dest, gd_cave_properties[i].offset) = - getStringCopy(G_STRUCT_MEMBER(char *, src, gd_cave_properties[i].offset)); + STRUCT_MEMBER(char *, dest, gd_cave_properties[i].offset) = + getStringCopy(STRUCT_MEMBER(char *, src, gd_cave_properties[i].offset)); /* no reason to copy this */ dest->objects_order = NULL; @@ -605,7 +602,7 @@ void gd_cave_copy(GdCave *dest, const GdCave *src) dest->objects = NULL; /* new empty list */ for (iter = src->objects; iter != NULL; iter = iter->next) /* do a deep copy */ - dest->objects = list_append(dest->objects, getMemCopy (iter->data, sizeof (GdObject))); + dest->objects = list_append(dest->objects, get_memcpy (iter->data, sizeof (GdObject))); } /* copy replays */ @@ -620,7 +617,7 @@ void gd_cave_copy(GdCave *dest, const GdCave *src) /* copy random number generator */ if (src->random) - dest->random = g_rand_copy(src->random); + dest->random = gd_rand_copy(src->random); } /* create new cave, which is a copy of the cave given. */ @@ -777,16 +774,36 @@ void gd_cave_c64_random_set_seed(GdCave *cave, int seed1, int seed2) gd_c64_random_set_seed(&cave->c64_rand, seed1, seed2); } -/* - select random colors for a given cave. - this function will select colors so that they should look somewhat nice; for example - brick walls won't be the darkest color, for example. -*/ -static inline void swap(int *i1, int *i2) +void gd_cave_set_random_c64_colors(GdCave *cave) { - int t = *i1; - *i1 = *i2; - *i2 = t; + const int bright_colors[] = { 1, 3, 7 }; + const int dark_colors[] = { 2, 6, 8, 9, 11 }; + + /* always black */ + cave->colorb = gd_c64_color(0); + cave->color0 = gd_c64_color(0); + + /* choose some bright color for brick */ + cave->color3 = gd_c64_color(bright_colors[gd_random_int_range(0, ARRAY_SIZE(bright_colors))]); + + /* choose a dark color for dirt, but should not be == color of brick */ + do + { + cave->color1 = gd_c64_color(dark_colors[gd_random_int_range(0, ARRAY_SIZE(dark_colors))]); + } + while (cave->color1 == cave->color3); /* so it is not the same as color 1 */ + + /* choose any but black for steel wall, but should not be == brick or dirt */ + do + { + /* between 1 and 15 - do not use black for this. */ + cave->color2 = gd_c64_color(gd_random_int_range(1, 16)); + } + while (cave->color1 == cave->color2 || cave->color2 == cave->color3); /* so colors are not the same */ + + /* copy amoeba and slime color */ + cave->color4 = cave->color3; + cave->color5 = cave->color1; } /* @@ -1158,10 +1175,10 @@ void gd_drawcave_game(const GdCave *cave, int **element_buffer, int **gfx_buffer { /* blinking and tapping is started at the beginning of animation sequences. */ /* 1/4 chance of blinking, every sequence. */ - player_blinking = g_random_int_range(0, 4) == 0; + player_blinking = gd_random_int_range(0, 4) == 0; /* 1/16 chance of starting or stopping tapping. */ - if (g_random_int_range(0, 16) == 0) + if (gd_random_int_range(0, 16) == 0) player_tapping = !player_tapping; } } @@ -1390,8 +1407,7 @@ GdReplay *gd_replay_new(void) GdReplay *rep; rep = checked_calloc(sizeof(GdReplay)); - - rep->movements = g_byte_array_new(); + rep->movements = checked_calloc(sizeof(GdReplayMovements)); return rep; } @@ -1400,19 +1416,18 @@ GdReplay *gd_replay_new_from_replay(GdReplay *orig) { GdReplay *rep; - rep = getMemCopy(orig, sizeof(GdReplay)); + rep = get_memcpy(orig, sizeof(GdReplay)); /* replicate dynamic data */ rep->comment = getStringCopy(orig->comment); - rep->movements = g_byte_array_new(); - g_byte_array_append(rep->movements, orig->movements->data, orig->movements->len); + rep->movements = get_memcpy(orig->movements, sizeof(GdReplayMovements)); return rep; } void gd_replay_free(GdReplay *replay) { - g_byte_array_free(replay->movements, TRUE); + checked_free(replay->movements); checked_free(replay->comment); free(replay); } @@ -1421,17 +1436,23 @@ void gd_replay_free(GdReplay *replay) void gd_replay_store_movement(GdReplay *replay, GdDirection player_move, boolean player_fire, boolean suicide) { - guint8 data[1]; + byte data[1]; data[0] = ((player_move) | (player_fire ? GD_REPLAY_FIRE_MASK : 0) | (suicide ? GD_REPLAY_SUICIDE_MASK : 0)); - g_byte_array_append(replay->movements, data, 1); + if (replay->movements->len < MAX_REPLAY_LEN) + { + replay->movements->data[replay->movements->len++] = data[0]; + + if (replay->movements->len == MAX_REPLAY_LEN) + Warn("BD replay truncated: size exceeds maximum replay size %d", MAX_REPLAY_LEN); + } } /* calculate adler checksum for a rendered cave; this can be used for more caves. */ -void gd_cave_adler_checksum_more(GdCave *cave, guint32 *a, guint32 *b) +void gd_cave_adler_checksum_more(GdCave *cave, unsigned int *a, unsigned int *b) { int x, y; @@ -1447,18 +1468,11 @@ void gd_cave_adler_checksum_more(GdCave *cave, guint32 *a, guint32 *b) } /* calculate adler checksum for a single rendered cave. */ -guint32 -gd_cave_adler_checksum(GdCave *cave) +unsigned int gd_cave_adler_checksum(GdCave *cave) { - guint32 a = 1; - guint32 b = 0; + unsigned int a = 1; + unsigned int b = 0; gd_cave_adler_checksum_more(cave, &a, &b); return (b << 16) + a; } - -/* return c64 color with index. */ -GdColor gd_c64_color(int index) -{ - return (GD_COLOR_TYPE_C64 << 24) + index; -}