mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge branch 'pre-release-0.0.2' into develop
Conflicts: src/util/util.c
This commit is contained in:
commit
2eb39d4a31
|
@ -74,11 +74,17 @@ typedef utf16* utf16string;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define OPENRCT2_NAME "OpenRCT2"
|
#define OPENRCT2_NAME "OpenRCT2"
|
||||||
#define OPENRCT2_VERSION "develop"
|
#define OPENRCT2_VERSION "0.0.3"
|
||||||
#define OPENRCT2_ARCHITECTURE "x86"
|
#define OPENRCT2_ARCHITECTURE "x86"
|
||||||
#define OPENRCT2_PLATFORM "Windows"
|
#define OPENRCT2_PLATFORM "Windows"
|
||||||
#define OPENRCT2_TIMESTAMP __DATE__ " " __TIME__
|
#define OPENRCT2_TIMESTAMP __DATE__ " " __TIME__
|
||||||
|
|
||||||
|
// The following constants are for automated build servers
|
||||||
|
#define OPENRCT2_BUILD_SERVER ""
|
||||||
|
#define OPENRCT2_BRANCH "develop"
|
||||||
|
#define OPENRCT2_COMMIT_SHA1 ""
|
||||||
|
#define OPENRCT2_COMMIT_SHA1_SHORT ""
|
||||||
|
|
||||||
// Represent fixed point numbers. dp = decimal point
|
// Represent fixed point numbers. dp = decimal point
|
||||||
typedef sint16 fixed16_1dp;
|
typedef sint16 fixed16_1dp;
|
||||||
typedef sint16 fixed16_2dp;
|
typedef sint16 fixed16_2dp;
|
||||||
|
|
|
@ -4472,3 +4472,39 @@ bool ride_is_powered_launched(rct_ride *ride)
|
||||||
ride->mode == RIDE_MODE_POWERED_LAUNCH ||
|
ride->mode == RIDE_MODE_POWERED_LAUNCH ||
|
||||||
ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED;
|
ride->mode == RIDE_MODE_POWERED_LAUNCH_BLOCK_SECTIONED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ride_has_any_track_elements(int rideIndex)
|
||||||
|
{
|
||||||
|
map_element_iterator it;
|
||||||
|
|
||||||
|
map_element_iterator_begin(&it);
|
||||||
|
while (map_element_iterator_next(&it)) {
|
||||||
|
if (map_element_get_type(it.element) != MAP_ELEMENT_TYPE_TRACK)
|
||||||
|
continue;
|
||||||
|
if (it.element->properties.track.ride_index != rideIndex)
|
||||||
|
continue;
|
||||||
|
if (it.element->flags & MAP_ELEMENT_FLAG_GHOST)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ride_all_has_any_track_elements(bool *rideIndexArray)
|
||||||
|
{
|
||||||
|
map_element_iterator it;
|
||||||
|
|
||||||
|
memset(rideIndexArray, 0, MAX_RIDES * sizeof(bool));
|
||||||
|
|
||||||
|
map_element_iterator_begin(&it);
|
||||||
|
while (map_element_iterator_next(&it)) {
|
||||||
|
if (map_element_get_type(it.element) != MAP_ELEMENT_TYPE_TRACK)
|
||||||
|
continue;
|
||||||
|
if (it.element->flags & MAP_ELEMENT_FLAG_GHOST)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
rideIndexArray[it.element->properties.track.ride_index] = true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -837,5 +837,7 @@ bool ride_has_whirlpool(rct_ride *ride);
|
||||||
|
|
||||||
bool ride_type_has_flag(int rideType, int flag);
|
bool ride_type_has_flag(int rideType, int flag);
|
||||||
bool ride_is_powered_launched(rct_ride *ride);
|
bool ride_is_powered_launched(rct_ride *ride);
|
||||||
|
bool ride_has_any_track_elements(int rideIndex);
|
||||||
|
void ride_all_has_any_track_elements(bool *rideIndexArray);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -830,6 +830,26 @@ static void sub_674BCF()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void get_map_elements_without_ghost(rct_map_element *resultElements)
|
||||||
|
{
|
||||||
|
size_t mapElementTotalSize = MAX_MAP_ELEMENTS * sizeof(rct_map_element);
|
||||||
|
rct_map_element *destinationElement = resultElements;
|
||||||
|
|
||||||
|
for (int y = 0; y < 256; y++) {
|
||||||
|
for (int x = 0; x < 256; x++) {
|
||||||
|
rct_map_element *originalElement = map_get_first_element_at(x, y);
|
||||||
|
do {
|
||||||
|
if (!(originalElement->flags & MAP_ELEMENT_FLAG_GHOST)) {
|
||||||
|
*destinationElement++ = *originalElement;
|
||||||
|
}
|
||||||
|
} while (!map_element_is_last_for_tile(originalElement++));
|
||||||
|
|
||||||
|
// Set last element flag in case the original last element was never added
|
||||||
|
(destinationElement - 1)->flags |= MAP_ELEMENT_FLAG_LAST_TILE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* rct2: 0x006754F5
|
* rct2: 0x006754F5
|
||||||
|
@ -944,11 +964,17 @@ int scenario_save(char *path, int flags)
|
||||||
fwrite(buffer, encodedLength, 1, file);
|
fwrite(buffer, encodedLength, 1, file);
|
||||||
|
|
||||||
// Write map elements
|
// Write map elements
|
||||||
|
uint8 *chunkData = malloc(0x4A85EC);
|
||||||
|
get_map_elements_without_ghost((rct_map_element*)chunkData);
|
||||||
|
memcpy(chunkData + 0x180000, (uint8*)(RCT2_ADDRESS_MAP_ELEMENTS + 0x180000), 0x4A85EC - 0x180000);
|
||||||
|
|
||||||
chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED;
|
chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED;
|
||||||
chunkHeader.length = 0x4A85EC;
|
chunkHeader.length = 0x4A85EC;
|
||||||
encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)0x00F663B8, chunkHeader);
|
encodedLength = sawyercoding_write_chunk_buffer(buffer, chunkData, chunkHeader);
|
||||||
fwrite(buffer, encodedLength, 1, file);
|
fwrite(buffer, encodedLength, 1, file);
|
||||||
|
|
||||||
|
free(chunkData);
|
||||||
|
|
||||||
if (flags & 2) {
|
if (flags & 2) {
|
||||||
// Write chunk
|
// Write chunk
|
||||||
chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED;
|
chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED;
|
||||||
|
@ -992,16 +1018,38 @@ int scenario_save(char *path, int flags)
|
||||||
encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)0x0135853C, chunkHeader);
|
encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)0x0135853C, chunkHeader);
|
||||||
fwrite(buffer, encodedLength, 1, file);
|
fwrite(buffer, encodedLength, 1, file);
|
||||||
|
|
||||||
// Write chunk
|
// Write chunk (don't save rides which have no track pieces)
|
||||||
|
uint8 *chunkData = malloc(0x761E8);
|
||||||
|
memcpy(chunkData, (void*)0x01358740, 0x761E8);
|
||||||
|
bool rideHasTrack[MAX_RIDES];
|
||||||
|
rct_ride *rides = (rct_ride*)(chunkData + (0x013628F8 - 0x01358740));
|
||||||
|
ride_all_has_any_track_elements(rideHasTrack);
|
||||||
|
for (int i = 0; i < MAX_RIDES; i++) {
|
||||||
|
if (!rideHasTrack[i])
|
||||||
|
rides[i].type = RIDE_TYPE_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED;
|
chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED;
|
||||||
chunkHeader.length = 0x761E8;
|
chunkHeader.length = 0x761E8;
|
||||||
encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)0x01358740, chunkHeader);
|
encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)0x01358740, chunkHeader);
|
||||||
fwrite(buffer, encodedLength, 1, file);
|
fwrite(buffer, encodedLength, 1, file);
|
||||||
|
|
||||||
|
free(chunkData);
|
||||||
} else {
|
} else {
|
||||||
// Write chunk
|
// Write chunk (don't save rides which have no track pieces)
|
||||||
|
uint8 *chunkData = malloc(0x2E8570);
|
||||||
|
memcpy(chunkData, (void*)0x010E63B8, 0x2E8570);
|
||||||
|
bool rideHasTrack[MAX_RIDES];
|
||||||
|
rct_ride *rides = (rct_ride*)(chunkData + (0x013628F8 - 0x010E63B8));
|
||||||
|
ride_all_has_any_track_elements(rideHasTrack);
|
||||||
|
for (int i = 0; i < MAX_RIDES; i++) {
|
||||||
|
if (!rideHasTrack[i])
|
||||||
|
rides[i].type = RIDE_TYPE_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED;
|
chunkHeader.encoding = CHUNK_ENCODING_RLECOMPRESSED;
|
||||||
chunkHeader.length = 0x2E8570;
|
chunkHeader.length = 0x2E8570;
|
||||||
encodedLength = sawyercoding_write_chunk_buffer(buffer, (uint8*)0x010E63B8, chunkHeader);
|
encodedLength = sawyercoding_write_chunk_buffer(buffer, chunkData, chunkHeader);
|
||||||
fwrite(buffer, encodedLength, 1, file);
|
fwrite(buffer, encodedLength, 1, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -374,6 +374,12 @@ static void DrawOpenRCT2(int x, int y)
|
||||||
|
|
||||||
// Format text (name and version)
|
// Format text (name and version)
|
||||||
sprintf(buffer, "%c%c%c%s, v%s", FORMAT_MEDIUMFONT, FORMAT_OUTLINE, FORMAT_WHITE, OPENRCT2_NAME, OPENRCT2_VERSION);
|
sprintf(buffer, "%c%c%c%s, v%s", FORMAT_MEDIUMFONT, FORMAT_OUTLINE, FORMAT_WHITE, OPENRCT2_NAME, OPENRCT2_VERSION);
|
||||||
|
if (!str_is_null_or_empty(OPENRCT2_BRANCH))
|
||||||
|
sprintf(strchr(buffer, 0), "-%s", OPENRCT2_BRANCH);
|
||||||
|
if (!str_is_null_or_empty(OPENRCT2_COMMIT_SHA1_SHORT))
|
||||||
|
sprintf(strchr(buffer, 0), " (%s)", OPENRCT2_COMMIT_SHA1_SHORT);
|
||||||
|
if (!str_is_null_or_empty(OPENRCT2_BUILD_SERVER))
|
||||||
|
sprintf(strchr(buffer, 0), " provided by %s", OPENRCT2_BUILD_SERVER);
|
||||||
|
|
||||||
// Draw Text
|
// Draw Text
|
||||||
gfx_draw_string(dpi, buffer, 0, x + 5, y + 5);
|
gfx_draw_string(dpi, buffer, 0, x + 5, y + 5);
|
||||||
|
|
|
@ -159,3 +159,8 @@ bool utf8_is_bom(const char *str)
|
||||||
{
|
{
|
||||||
return str[0] == 0xEF && str[1] == 0xBB && str[2] == 0xBF;
|
return str[0] == 0xEF && str[1] == 0xBB && str[2] == 0xBF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool str_is_null_or_empty(const char *str)
|
||||||
|
{
|
||||||
|
return str == NULL || str[0] == 0;
|
||||||
|
}
|
|
@ -39,5 +39,6 @@ bool strequals(const char *a, const char *b, int length, bool caseInsensitive);
|
||||||
int strcicmp(char const *a, char const *b);
|
int strcicmp(char const *a, char const *b);
|
||||||
|
|
||||||
bool utf8_is_bom(const char *str);
|
bool utf8_is_bom(const char *str);
|
||||||
|
bool str_is_null_or_empty(const char *str);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -679,7 +679,7 @@ void game_command_remove_scenery(int* eax, int* ebx, int* ecx, int* edx, int* es
|
||||||
while(map_element->type != map_element_type ||
|
while(map_element->type != map_element_type ||
|
||||||
map_element->base_height != base_height ||
|
map_element->base_height != base_height ||
|
||||||
map_element->properties.scenery.type != scenery_type ||
|
map_element->properties.scenery.type != scenery_type ||
|
||||||
(*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_5)){
|
(*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){
|
||||||
map_element++;
|
map_element++;
|
||||||
if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){
|
if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){
|
||||||
*ebx = 0;
|
*ebx = 0;
|
||||||
|
@ -742,7 +742,7 @@ void game_command_remove_large_scenery(int* eax, int* ebx, int* ecx, int* edx, i
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_5)){
|
if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){
|
||||||
*ebx = 0;
|
*ebx = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -913,7 +913,7 @@ void game_command_set_scenery_colour(int* eax, int* ebx, int* ecx, int* edx, int
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_5)){
|
if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){
|
||||||
*ebx = 0;
|
*ebx = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -955,14 +955,14 @@ void game_command_set_fence_colour(int* eax, int* ebx, int* ecx, int* edx, int*
|
||||||
while(map_element_get_type(map_element) != MAP_ELEMENT_TYPE_FENCE ||
|
while(map_element_get_type(map_element) != MAP_ELEMENT_TYPE_FENCE ||
|
||||||
map_element->base_height != base_height ||
|
map_element->base_height != base_height ||
|
||||||
(map_element->type & MAP_ELEMENT_DIRECTION_MASK) != map_element_direction||
|
(map_element->type & MAP_ELEMENT_DIRECTION_MASK) != map_element_direction||
|
||||||
((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_5))){
|
((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST))){
|
||||||
map_element++;
|
map_element++;
|
||||||
if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){
|
if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){
|
||||||
*ebx = 0;
|
*ebx = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_5)){
|
if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){
|
||||||
*ebx = 0;
|
*ebx = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1014,7 +1014,7 @@ void game_command_set_large_scenery_colour(int* eax, int* ebx, int* ecx, int* ed
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_5)){
|
if((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST)){
|
||||||
*ebx = 0;
|
*ebx = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1823,7 +1823,7 @@ void game_command_remove_fence(int* eax, int* ebx, int* ecx, int* edx, int* esi,
|
||||||
while(map_element_get_type(map_element) != MAP_ELEMENT_TYPE_FENCE ||
|
while(map_element_get_type(map_element) != MAP_ELEMENT_TYPE_FENCE ||
|
||||||
map_element->base_height != base_height ||
|
map_element->base_height != base_height ||
|
||||||
(map_element->type & MAP_ELEMENT_DIRECTION_MASK) != direction ||
|
(map_element->type & MAP_ELEMENT_DIRECTION_MASK) != direction ||
|
||||||
((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_5))){
|
((*ebx & 0x40) && !(map_element->flags & MAP_ELEMENT_FLAG_GHOST))){
|
||||||
map_element++;
|
map_element++;
|
||||||
if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){
|
if((map_element - 1)->flags & MAP_ELEMENT_FLAG_LAST_TILE){
|
||||||
*ebx = 0;
|
*ebx = 0;
|
||||||
|
@ -2305,7 +2305,7 @@ void game_command_place_large_scenery(int* eax, int* ebx, int* ecx, int* edx, in
|
||||||
}
|
}
|
||||||
|
|
||||||
if(*ebx & 0x40){
|
if(*ebx & 0x40){
|
||||||
new_map_element->flags |= MAP_ELEMENT_FLAG_5;
|
new_map_element->flags |= MAP_ELEMENT_FLAG_GHOST;
|
||||||
}
|
}
|
||||||
if(tile_num == 0){
|
if(tile_num == 0){
|
||||||
RCT2_GLOBAL(0x00F64EBC, rct_map_element*) = new_map_element;
|
RCT2_GLOBAL(0x00F64EBC, rct_map_element*) = new_map_element;
|
||||||
|
|
|
@ -129,7 +129,7 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MAP_ELEMENT_FLAG_5 = (1 << 4),
|
MAP_ELEMENT_FLAG_GHOST = (1 << 4),
|
||||||
MAP_ELEMENT_FLAG_BROKEN = (1 << 5),
|
MAP_ELEMENT_FLAG_BROKEN = (1 << 5),
|
||||||
MAP_ELEMENT_FLAG_LAST_TILE = (1 << 7)
|
MAP_ELEMENT_FLAG_LAST_TILE = (1 << 7)
|
||||||
};
|
};
|
||||||
|
|
|
@ -766,7 +766,7 @@ void update_park_fences(int x, int y)
|
||||||
if (mapElement->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE)
|
if (mapElement->properties.entrance.type != ENTRANCE_TYPE_PARK_ENTRANCE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!(mapElement->flags & MAP_ELEMENT_FLAG_5)){
|
if (!(mapElement->flags & MAP_ELEMENT_FLAG_GHOST)) {
|
||||||
fence_required = 0;
|
fence_required = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue