Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,10 @@ set(SCENARIO_FILES
${PROJECT_SOURCE_DIR}/src/scenario/editor.c
${PROJECT_SOURCE_DIR}/src/scenario/editor_events.c
${PROJECT_SOURCE_DIR}/src/scenario/editor_map.c
${PROJECT_SOURCE_DIR}/src/scenario/terrain_generator/terrain_generator.c
${PROJECT_SOURCE_DIR}/src/scenario/terrain_generator/random_terrain_generator.c
${PROJECT_SOURCE_DIR}/src/scenario/terrain_generator/river_generator.c
${PROJECT_SOURCE_DIR}/src/scenario/terrain_generator/river_tools.c
${PROJECT_SOURCE_DIR}/src/scenario/emperor_change.c
${PROJECT_SOURCE_DIR}/src/scenario/empire.c
${PROJECT_SOURCE_DIR}/src/scenario/gladiator_revolt.c
Expand Down Expand Up @@ -721,6 +725,7 @@ set(WINDOW_FILES
${PROJECT_SOURCE_DIR}/src/window/select_list.c
${PROJECT_SOURCE_DIR}/src/window/set_salary.c
${PROJECT_SOURCE_DIR}/src/window/text_input.c
${PROJECT_SOURCE_DIR}/src/window/terrain_generator.c
${PROJECT_SOURCE_DIR}/src/window/trade_opened.c
${PROJECT_SOURCE_DIR}/src/window/trade_prices.c
${PROJECT_SOURCE_DIR}/src/window/user_path_setup.c
Expand Down
29 changes: 29 additions & 0 deletions src/core/random.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ static struct {
time_t last_seed;
} data;

static int stdlib_use_fixed_seed = 0;

void random_init(void)
{
memset(&data, 0, sizeof(data));
Expand Down Expand Up @@ -97,6 +99,9 @@ void random_save_state(buffer *buf)
}

int random_from_stdlib(void) {
if (stdlib_use_fixed_seed) {
return rand();
}
time_t t;
t = time(&t);
if (data.last_seed != t) {
Expand All @@ -106,6 +111,19 @@ int random_from_stdlib(void) {
return rand();
}

void random_set_stdlib_seed(unsigned int seed)
{
stdlib_use_fixed_seed = 1;
srand(seed);
data.last_seed = 0;
}

void random_clear_stdlib_seed(void)
{
stdlib_use_fixed_seed = 0;
data.last_seed = 0;
}

int random_between_from_stdlib(int min, int max)
{
int diff = max - min;
Expand All @@ -116,6 +134,17 @@ int random_between_from_stdlib(int min, int max)
return min + rnd;
}

unsigned int generate_seed_value(void)
{
unsigned int high = (unsigned int) random_from_stdlib();
unsigned int low = (unsigned int) random_from_stdlib();
unsigned int seed = (high << 16) ^ low ^ (unsigned int) time(NULL);

// Keep bit 31 clear so signed interpretation can never appear negative.
seed &= 0x7fffffffu;
return seed ? seed : 1;
}

double random_fractional_from_stdlib(void)
{
return (double) random_from_stdlib() / (double) RAND_MAX;
Expand Down
6 changes: 6 additions & 0 deletions src/core/random.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,14 @@ void random_load_state(buffer *buf);

int random_from_stdlib(void);

void random_set_stdlib_seed(unsigned int seed);

void random_clear_stdlib_seed(void);

int random_between_from_stdlib(int min, int max);

unsigned int generate_seed_value(void);

double random_fractional_from_stdlib(void);

#endif // CORE_RANDOM_H
11 changes: 11 additions & 0 deletions src/game/file_editor.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
#include "scenario/invasion.h"
#include "scenario/map.h"
#include "scenario/property.h"
#include "scenario/terrain_generator/terrain_generator.h"
#include "sound/city.h"
#include "sound/music.h"
#include "widget/map_editor.h"
Expand Down Expand Up @@ -131,6 +132,7 @@ static void prepare_map_for_editing(void)
map_tiles_update_all_water();
map_tiles_update_all_earthquake();
map_tiles_update_all_rocks();
map_tiles_update_all_trees_shrubs();
map_tiles_update_all_empty_land();
map_tiles_update_all_meadow();
map_tiles_update_all_rubble();
Expand All @@ -157,6 +159,15 @@ void game_file_editor_create_scenario(int size)
scenario_editor_set_custom_victory_message(0);
}

void game_file_editor_create_scenario_generated(int size, int generator_algorithm)
{
create_blank_map(size);
terrain_generator_generate((terrain_generator_algorithm) generator_algorithm);
prepare_map_for_editing();
scenario_editor_set_custom_message_introduction(0);
scenario_editor_set_custom_victory_message(0);
}

int game_file_editor_load_scenario(const char *scenario_file)
{
clear_map_data();
Expand Down
1 change: 1 addition & 0 deletions src/game/file_editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ void game_file_editor_clear_data(void);
* @param size Size of the map to create
*/
void game_file_editor_create_scenario(int size);
void game_file_editor_create_scenario_generated(int size, int generator_algorithm);

/**
* Load scenario from disk and init it for using in the editor
Expand Down
18 changes: 16 additions & 2 deletions src/game/game.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,14 +165,18 @@ static int reload_language(int is_editor, int reload_images)
return 1;
}

int game_init_editor(void)
static int game_init_editor_internal(int generated, int size, int generator_algorithm)
{
if (!reload_language(1, 0)) {
return 0;
}

game_file_editor_clear_data();
game_file_editor_create_scenario(2);
if (generated) {
game_file_editor_create_scenario_generated(size, generator_algorithm);
} else {
game_file_editor_create_scenario(2);
}

if (city_view_is_sidebar_collapsed()) {
city_view_toggle_sidebar();
Expand All @@ -183,6 +187,16 @@ int game_init_editor(void)
return 1;
}

int game_init_editor(void)
{
return game_init_editor_internal(0, 0, 0);
}

int game_init_editor_generated(int size, int generator_algorithm)
{
return game_init_editor_internal(1, size, generator_algorithm);
}

void game_exit_editor(void)
{
if (!reload_language(0, 0)) {
Expand Down
1 change: 1 addition & 0 deletions src/game/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ int game_pre_init(void);
int game_init(void);

int game_init_editor(void);
int game_init_editor_generated(int size, int generator_algorithm);

int game_reload_language(void);

Expand Down
1 change: 1 addition & 0 deletions src/graphics/window.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ typedef enum {
WINDOW_SELECT_CAMPAIGN,
WINDOW_MISSION_LIST,
WINDOW_CCK_SELECTION,
WINDOW_TERRAIN_GENERATOR,
WINDOW_FILE_DIALOG,
WINDOW_POPUP_DIALOG,
WINDOW_PLAIN_MESSAGE_DIALOG,
Expand Down
14 changes: 8 additions & 6 deletions src/map/random.c
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
#include "random.h"

#include "core/random.h"

#include "map/grid.h"

static grid_u8 random;
static grid_u8 random_value;

void map_random_clear(void)
{
map_grid_clear_u8(random.items);
map_grid_clear_u8(random_value.items);
}

void map_random_init(void)
Expand All @@ -16,14 +17,14 @@ void map_random_init(void)
for (int y = 0; y < GRID_SIZE; y++) {
for (int x = 0; x < GRID_SIZE; x++, grid_offset++) {
random_generate_next();
random.items[grid_offset] = (uint8_t) random_short();
random_value.items[grid_offset] = (uint8_t) random_short();
}
}
}

int map_random_get(int grid_offset)
{
return random.items[grid_offset];
return random_value.items[grid_offset];
}

int map_random_get_from_buffer(buffer *buf, int grid_offset)
Expand All @@ -34,10 +35,11 @@ int map_random_get_from_buffer(buffer *buf, int grid_offset)

void map_random_save_state(buffer *buf)
{
map_grid_save_state_u8(random.items, buf);
map_grid_save_state_u8(random_value.items, buf);
}

void map_random_load_state(buffer *buf)
{
map_grid_load_state_u8(random.items, buf);
map_grid_load_state_u8(random_value.items, buf);
}

1 change: 1 addition & 0 deletions src/map/random.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ void map_random_save_state(buffer *buf);

void map_random_load_state(buffer *buf);


#endif // MAP_RANDOM_H
17 changes: 17 additions & 0 deletions src/map/terrain.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "map/ring.h"
#include "map/routing.h"
#include "map/sprite.h"
#include "map/tiles.h"

#include <string.h>

Expand Down Expand Up @@ -94,6 +95,22 @@ void map_terrain_set(int grid_offset, int terrain)
terrain_grid.items[grid_offset] = terrain;
}

void map_terrain_set_with_tile_update(int grid_offset, int terrain)
{
map_terrain_set(grid_offset, terrain);

if (terrain & TERRAIN_TREE) {
int x = map_grid_offset_to_x(grid_offset);
int y = map_grid_offset_to_y(grid_offset);
map_tiles_update_region_trees(x, y, x, y);
}
if (terrain & TERRAIN_SHRUB) {
int x = map_grid_offset_to_x(grid_offset);
int y = map_grid_offset_to_y(grid_offset);
map_tiles_update_region_shrub(x, y, x, y);
}
}

void map_terrain_add(int grid_offset, int terrain)
{
terrain_grid.items[grid_offset] |= terrain;
Expand Down
1 change: 1 addition & 0 deletions src/map/terrain.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ int map_terrain_get_from_buffer_16(buffer *buf, int grid_offset);
int map_terrain_get_from_buffer_32(buffer *buf, int grid_offset);

void map_terrain_set(int grid_offset, int terrain);
void map_terrain_set_with_tile_update(int grid_offset, int terrain);

void map_terrain_add(int grid_offset, int terrain);

Expand Down
6 changes: 6 additions & 0 deletions src/map/tiles.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,12 @@ void map_tiles_update_region_shrub(int x_min, int y_min, int x_max, int y_max)
foreach_region_tile(x_min, y_min, x_max, y_max, set_shrub_image);
}

void map_tiles_update_all_trees_shrubs(void)
{
foreach_map_tile(set_tree_image);
foreach_map_tile(set_shrub_image);
}

static void clear_garden_image(int x, int y, int grid_offset)
{
if (map_terrain_is(grid_offset, TERRAIN_GARDEN) &&
Expand Down
1 change: 1 addition & 0 deletions src/map/tiles.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ void map_tiles_update_all_rocks(void);

void map_tiles_update_region_trees(int x_min, int y_min, int x_max, int y_max);
void map_tiles_update_region_shrub(int x_min, int y_min, int x_max, int y_max);
void map_tiles_update_all_trees_shrubs(void);

void map_tiles_update_all_gardens(void);

Expand Down
28 changes: 28 additions & 0 deletions src/scenario/terrain_generator/random_terrain_generator.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#include "terrain_generator_algorithms.h"

#include "map/grid.h"
#include "map/terrain.h"

void terrain_generator_random_terrain(void)
{
int width = map_grid_width();
int height = map_grid_height();

for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int grid_offset = map_grid_offset(x, y);
int roll = terrain_generator_random_between(0, 100);
if (roll < 6) {
map_terrain_set_with_tile_update(grid_offset, TERRAIN_TREE);
} else if (roll < 12) {
map_terrain_set_with_tile_update(grid_offset, TERRAIN_SHRUB);
} else if (roll < 18) {
map_terrain_set_with_tile_update(grid_offset, TERRAIN_MEADOW);
} else if (roll < 19) {
map_terrain_set_with_tile_update(grid_offset, TERRAIN_ROCK);
} else if (roll < 20) {
map_terrain_set_with_tile_update(grid_offset, TERRAIN_WATER);
}
}
}
}
Loading
Loading