{"action":"created","comment":{"url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/comments/105531805","pull_request_review_id":26421012,"id":105531805,"diff_hunk":"@@ -0,0 +1,621 @@\n+#pragma region Copyright (c) 2014-2016 OpenRCT2 Developers\n+/*****************************************************************************\n+ * OpenRCT2, an open source clone of Roller Coaster Tycoon 2.\n+ *\n+ * OpenRCT2 is the work of many authors, a full list can be found in contributors.md\n+ * For more information, visit https://github.com/OpenRCT2/OpenRCT2\n+ *\n+ * OpenRCT2 is free software: you can redistribute it and/or modify\n+ * it under the terms of the GNU General Public License as published by\n+ * the Free Software Foundation, either version 3 of the License, or\n+ * (at your option) any later version.\n+ *\n+ * A full copy of the GNU General Public License can be found in licence.txt\n+ *****************************************************************************/\n+#pragma endregion\n+\n+#include \"../core/Util.hpp\"\n+#include \"../core/Math.hpp\"\n+#include \"../network/network.h\"\n+\n+extern \"C\"\n+{\n+    #include \"../game.h\"\n+    #include \"../localisation/localisation.h\"\n+    #include \"../ride/ride.h\"\n+    #include \"../interface/window.h\"\n+    #include \"../util/util.h\"\n+    #include \"scenery.h\"\n+    #include \"banner.h\"\n+    #include \"map.h\"\n+    #include \"park.h\"\n+}\n+\n+rct_banner gBanners[MAX_BANNERS];\n+\n+/**\n+ *\n+ *  rct2: 0x006B7EAB\n+ */\n+static sint32 banner_get_ride_index_at(sint32 x, sint32 y, sint32 z)\n+{\n+    rct_map_element *mapElement;\n+    rct_ride *ride;\n+    sint32 rideIndex, resultRideIndex;\n+\n+    resultRideIndex = -1;\n+    mapElement = map_get_first_element_at(x >> 5, y >> 5);\n+    do\n+    {\n+        if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_TRACK)\n+            continue;\n+\n+        rideIndex = mapElement->properties.track.ride_index;\n+        ride = get_ride(rideIndex);\n+        if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP))\n+            continue;\n+\n+        if ((mapElement->clearance_height * 8) + 32 <= z)\n+            continue;\n+\n+        resultRideIndex = rideIndex;\n+    } while (!map_element_is_last_for_tile(mapElement++));\n+\n+    return resultRideIndex;\n+}\n+\n+static money32 BannerRemove(sint16 x, sint16 y, uint8 baseHeight, uint8 direction, uint8 flags)\n+{\n+    sint32 z = baseHeight * 8;\n+    gCommandExpenditureType = RCT_EXPENDITURE_TYPE_LANDSCAPING;\n+    gCommandPosition.x = x + 16;\n+    gCommandPosition.y = y + 16;\n+    gCommandPosition.z = z;\n+\n+    if (!(flags & GAME_COMMAND_FLAG_GHOST) && game_is_paused() && !gCheatsBuildInPauseMode)\n+    {\n+        gGameCommandErrorText = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED;\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode && !map_is_location_owned(x, y, z - 16))\n+    {\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    // Slight modification to the code so that it now checks height as well\n+    // This was causing a bug with banners on two paths stacked.\n+    rct_map_element* mapElement = map_get_banner_element_at(x / 32, y / 32, baseHeight, direction);\n+    if (mapElement == nullptr)\n+    {\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    rct_banner *banner = &gBanners[mapElement->properties.banner.index];\n+    rct_scenery_entry *bannerEntry = get_banner_entry(banner->type);\n+    money32 refund = 0;\n+    if (bannerEntry != nullptr && bannerEntry != (rct_scenery_entry *)-1)\n+    {\n+        refund = -((bannerEntry->banner.price * 3) / 4);\n+    }\n+\n+    if (flags & GAME_COMMAND_FLAG_APPLY)\n+    {\n+        if (gGameCommandNestLevel == 1 && !(flags & GAME_COMMAND_FLAG_GHOST))\n+        {\n+            rct_xyz16 coord;\n+            coord.x = x + 16;\n+            coord.y = y + 16;\n+            coord.z = map_element_height(coord.x, coord.y);\n+            network_set_player_last_action_coord(network_get_player_index(game_command_playerid), coord);\n+        }\n+\n+        map_element_remove_banner_entry(mapElement);\n+        map_invalidate_tile_zoom1(x, y, z, z + 32);\n+        map_element_remove(mapElement);\n+    }\n+\n+    if (gParkFlags & PARK_FLAGS_NO_MONEY)\n+    {\n+        refund = 0;\n+    }\n+    return refund;\n+}\n+\n+static money32 BannerSetColour(sint16 x, sint16 y, uint8 baseHeight, uint8 direction, uint8 colour, uint8 flags)\n+{\n+    gCommandExpenditureType = RCT_EXPENDITURE_TYPE_LANDSCAPING;\n+    sint32 z = (baseHeight * 8);\n+    gCommandPosition.x = x + 16;\n+    gCommandPosition.y = y + 16;\n+    gCommandPosition.z = z;\n+\n+    if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gCheatsSandboxMode)\n+    {\n+        if (!map_is_location_owned(x, y, z - 16))\n+        {\n+            return MONEY32_UNDEFINED;\n+        }\n+    }\n+\n+    if (flags & GAME_COMMAND_FLAG_APPLY)\n+    {\n+        rct_map_element* mapElement = map_get_first_element_at(x / 32, y / 32);\n+\n+        bool found = false;\n+        do\n+        {\n+            if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_BANNER)\n+                continue;\n+\n+            if (mapElement->properties.banner.position != direction)\n+                continue;\n+\n+            found = true;\n+            break;\n+        } while (!map_element_is_last_for_tile(mapElement++));\n+\n+        if (found == false)\n+        {\n+            return MONEY32_UNDEFINED;\n+        }\n+\n+        rct_window* window = window_find_by_number(WC_BANNER, mapElement->properties.banner.index);\n+        if (window)\n+        {\n+            window_invalidate(window);\n+        }\n+        gBanners[mapElement->properties.banner.index].colour = colour;\n+        map_invalidate_tile_zoom1(x, y, z, z + 32);\n+    }\n+\n+    return 0;\n+}\n+\n+static money32 BannerPlace(sint16 x, sint16 y, uint8 pathBaseHeight, uint8 direction, uint8 colour, uint8 type, uint8 *bannerIndex, uint8 flags)\n+{\n+    gCommandPosition.x = x + 16;\n+    gCommandPosition.y = y + 16;\n+    gCommandPosition.z = pathBaseHeight * 16;\n+    gCommandExpenditureType = RCT_EXPENDITURE_TYPE_LANDSCAPING;\n+    if (game_is_paused() && !gCheatsBuildInPauseMode)\n+    {\n+        gGameCommandErrorText = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED;\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    if (!map_check_free_elements_and_reorganise(1))\n+    {\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    if (x >= 256 * 32 || y >= 256 * 32)\n+    {\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    rct_map_element* mapElement = map_get_first_element_at(x / 32, y / 32);\n+\n+    bool pathFound = false;\n+    do\n+    {\n+        if (map_element_get_type(mapElement) != MAP_ELEMENT_TYPE_PATH)\n+            continue;\n+\n+        if (mapElement->base_height != pathBaseHeight * 2 && mapElement->base_height != (pathBaseHeight - 1) * 2)\n+            continue;\n+\n+        if (!(mapElement->properties.path.edges & (1 << direction)))\n+            continue;\n+\n+        pathFound = true;\n+        break;\n+    } while (!map_element_is_last_for_tile(mapElement++));\n+\n+    if (pathFound == false)\n+    {\n+        gGameCommandErrorText = STR_CAN_ONLY_BE_BUILT_ACROSS_PATHS;\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) &&\n+        !gCheatsSandboxMode &&\n+        !map_is_location_owned(x, y, pathBaseHeight * 16))\n+    {\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    uint8 baseHeight = (pathBaseHeight + 1) * 2;\n+    mapElement = map_get_banner_element_at(x / 32, y / 32, baseHeight, direction);\n+    if (mapElement != nullptr)\n+    {\n+        gGameCommandErrorText = STR_BANNER_SIGN_IN_THE_WAY;\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    *bannerIndex = create_new_banner(flags);\n+    if (*bannerIndex == BANNER_NULL)\n+    {\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    if (flags & GAME_COMMAND_FLAG_APPLY)\n+    {\n+        if (gGameCommandNestLevel == 1 && !(flags & GAME_COMMAND_FLAG_GHOST))\n+        {\n+            rct_xyz16 coord;\n+            coord.x = x + 16;\n+            coord.y = y + 16;\n+            coord.z = map_element_height(coord.x, coord.y);\n+            network_set_player_last_action_coord(network_get_player_index(game_command_playerid), coord);\n+        }\n+\n+        rct_map_element* newMapElement = map_element_insert(x / 32, y / 32, baseHeight, 0);\n+        assert(newMapElement != nullptr);\n+        gBanners[*bannerIndex].type = type;\n+        gBanners[*bannerIndex].colour = colour;\n+        gBanners[*bannerIndex].x = x / 32;\n+        gBanners[*bannerIndex].y = y / 32;\n+        newMapElement->type = MAP_ELEMENT_TYPE_BANNER;\n+        newMapElement->clearance_height = newMapElement->base_height + 2;\n+        newMapElement->properties.banner.position = direction;\n+        newMapElement->properties.banner.flags = 0xFF;\n+        newMapElement->properties.banner.unused = 0;\n+        newMapElement->properties.banner.index = *bannerIndex;\n+        if (flags & GAME_COMMAND_FLAG_GHOST)\n+        {\n+            newMapElement->flags |= MAP_ELEMENT_FLAG_GHOST;\n+        }\n+        map_invalidate_tile_full(x, y);\n+        map_animation_create(MAP_ANIMATION_TYPE_BANNER, x, y, newMapElement->base_height);\n+    }\n+\n+    rct_scenery_entry *bannerEntry = get_banner_entry(type);\n+    if ((bannerEntry == nullptr) || (bannerEntry == (rct_scenery_entry *)-1))\n+    {\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    if (gParkFlags & PARK_FLAGS_NO_MONEY)\n+    {\n+        return 0;\n+    }\n+    return bannerEntry->banner.price;\n+}\n+\n+static money32 BannerSetName(uint8 bannerIndex,\n+    uint16 nameChunkIndex,\n+    uint32 nameChunk1,\n+    uint32 nameChunk2,\n+    uint32 nameChunk3,\n+    uint8 flags)\n+{\n+    static char newName[128];\n+\n+    if (bannerIndex >= MAX_BANNERS)\n+    {\n+        log_warning(\"Invalid game command for setting banner name, banner id = %d\", bannerIndex);\n+        return MONEY32_UNDEFINED;\n+    }\n+    rct_banner* banner = &gBanners[bannerIndex];\n+\n+    gCommandExpenditureType = RCT_EXPENDITURE_TYPE_RIDE_RUNNING_COSTS;\n+    size_t indexToOffset[3] = { 24, 12, 0 };\n+\n+    if (nameChunkIndex > Util::CountOf(indexToOffset))\n+    {\n+        log_warning(\"Invalid chunk index for setting banner name, banner id = %d, index = %d\", bannerIndex, nameChunkIndex);\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    size_t nameChunkOffset = Math::Min<size_t>(indexToOffset[nameChunkIndex], Util::CountOf(newName) - 12);\n+    memcpy((void*)((uintptr_t)newName + (uintptr_t)nameChunkOffset + 0), &nameChunk1, sizeof(uint32));\n+    memcpy((void*)((uintptr_t)newName + (uintptr_t)nameChunkOffset + 4), &nameChunk2, sizeof(uint32));\n+    memcpy((void*)((uintptr_t)newName + (uintptr_t)nameChunkOffset + 8), &nameChunk3, sizeof(uint32));\n+\n+    if (nameChunkIndex != 0)\n+    {\n+        return 0;\n+    }\n+\n+    if (!(flags & GAME_COMMAND_FLAG_APPLY))\n+    {\n+        return 0;\n+    }\n+\n+    utf8 *buffer = gCommonStringFormatBuffer;\n+    utf8 *dst = buffer;\n+    dst = utf8_write_codepoint(dst, FORMAT_COLOUR_CODE_START + banner->text_colour);\n+    safe_strcpy(dst, newName, 32);\n+\n+    rct_string_id stringId = user_string_allocate(128, buffer);\n+    if (stringId)\n+    {\n+        rct_string_id prevStringId = banner->string_idx;\n+        banner->string_idx = stringId;\n+        user_string_free(prevStringId);\n+        rct_window* w = window_bring_to_front_by_number(WC_BANNER, bannerIndex);\n+        if (w)\n+        {\n+            window_invalidate(w);\n+        }\n+    }\n+    else\n+    {\n+        gGameCommandErrorText = STR_ERR_CANT_SET_BANNER_TEXT;\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    return 0;\n+}\n+\n+static money32 BannerSetStyle(uint8 bannerIndex, uint8 colour, uint8 textColour, uint8 bannerFlags, uint8 flags)\n+{\n+    if (bannerIndex >= MAX_BANNERS)\n+    {\n+        gGameCommandErrorText = STR_INVALID_SELECTION_OF_OBJECTS;\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    rct_banner* banner = &gBanners[bannerIndex];\n+\n+    rct_map_element* mapElement = banner_get_map_element(bannerIndex);\n+\n+    if (mapElement == nullptr)\n+    {\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    if (!(flags & GAME_COMMAND_FLAG_APPLY))\n+    {\n+        return 0;\n+    }\n+\n+    banner->colour = colour;\n+    banner->text_colour = textColour;\n+    banner->flags = bannerFlags;\n+\n+    mapElement->properties.banner.flags = 0xFF;\n+    if (banner->flags & BANNER_FLAG_NO_ENTRY)\n+    {\n+        mapElement->properties.banner.flags &= ~(1 << mapElement->properties.banner.position);\n+    }\n+\n+    sint32 colourCodepoint = FORMAT_COLOUR_CODE_START + banner->text_colour;\n+\n+    utf8 buffer[256];\n+    format_string(buffer, 256, banner->string_idx, 0);\n+    sint32 firstCodepoint = utf8_get_next(buffer, nullptr);\n+    if (firstCodepoint >= FORMAT_COLOUR_CODE_START && firstCodepoint <= FORMAT_COLOUR_CODE_END)\n+    {\n+        utf8_write_codepoint(buffer, colourCodepoint);\n+    }\n+    else\n+    {\n+        utf8_insert_codepoint(buffer, colourCodepoint);\n+    }\n+\n+    rct_string_id stringId = user_string_allocate(128, buffer);\n+    if (stringId != 0)\n+    {\n+        rct_string_id prevStringId = banner->string_idx;\n+        banner->string_idx = stringId;\n+        user_string_free(prevStringId);\n+        rct_window* w = window_bring_to_front_by_number(WC_BANNER, bannerIndex);\n+        if (w)\n+        {\n+            window_invalidate(w);\n+        }\n+    }\n+    else\n+    {\n+        gGameCommandErrorText = STR_ERR_CANT_SET_BANNER_TEXT;\n+        return MONEY32_UNDEFINED;\n+    }\n+\n+    return 0;\n+}\n+\n+extern \"C\" \n+{\n+    /**\n+     *\n+     *  rct2: 0x006B9CB0\n+     */\n+    void banner_init()\n+    {\n+        for (sint32 i = 0; i < MAX_BANNERS; i++)\n+        {\n+            gBanners[i].type = BANNER_NULL;\n+        }\n+    }\n+\n+    /**\n+     * Creates a new banner and returns the index of the banner\n+     * If the flag GAME_COMMAND_FLAG_APPLY is NOT set then returns\n+     * the first unused index but does NOT mark the banner as created.\n+     * returns 0xFF on failure.\n+     *\n+     *  rct2: 0x006BA278\n+     */\n+    sint32 create_new_banner(uint8 flags)\n+    {\n+        sint32 bannerIndex = 0;\n+        for (; bannerIndex < MAX_BANNERS; bannerIndex++)\n+        {\n+            if (gBanners[bannerIndex].type == BANNER_NULL)\n+            {\n+                break;\n+            }\n+        }\n+\n+        if (bannerIndex == MAX_BANNERS)\n+        {\n+            gGameCommandErrorText = STR_TOO_MANY_BANNERS_IN_GAME;\n+            return BANNER_NULL;\n+        }\n+\n+        if (flags & GAME_COMMAND_FLAG_APPLY)\n+        {\n+            rct_banner* banner = &gBanners[bannerIndex];\n+\n+            banner->flags = 0;\n+            banner->type = 0;\n+            banner->string_idx = STR_DEFAULT_SIGN;\n+            banner->colour = 2;\n+            banner->text_colour = 2;\n+        }\n+        return bannerIndex;\n+    }\n+\n+    rct_map_element *banner_get_map_element(sint32 bannerIndex)\n+    {\n+        rct_banner *banner = &gBanners[bannerIndex];\n+        rct_map_element *mapElement = map_get_first_element_at(banner->x, banner->y);\n+        do\n+        {\n+            if (map_element_get_banner_index(mapElement) == bannerIndex)\n+            {\n+                return mapElement;\n+            }\n+        } while (!map_element_is_last_for_tile(mapElement++));\n+        return nullptr;\n+    }\n+\n+    /**\n+     *\n+     *  rct2: 0x006B7D86\n+     */\n+    sint32 banner_get_closest_ride_index(sint32 x, sint32 y, sint32 z)\n+    {\n+        sint32 i, rideIndex;\n+        rct_ride *ride;\n+\n+        static const rct_xy16 NeighbourCheckOrder[] =\n+        {\n+            {  32,   0 },\n+            { -32,   0 },\n+            {   0,  32 },\n+            {   0, -32 },\n+            { -32, +32 },\n+            { +32, -32 },\n+            { +32, +32 },\n+            { -32, +32 },\n+            {   0,   0 }\n+        };\n+\n+        for (i = 0; i < (sint32)Util::CountOf(NeighbourCheckOrder); i++)\n+        {\n+            rideIndex = banner_get_ride_index_at(x + NeighbourCheckOrder[i].x, y + NeighbourCheckOrder[i].y, z);\n+            if (rideIndex != -1)\n+            {\n+                return rideIndex;\n+            }\n+        }\n+\n+        rideIndex = -1;\n+        sint32 resultDistance = INT_MAX;\n+        FOR_ALL_RIDES(i, ride)\n+        {\n+            if (ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_IS_SHOP))\n+                continue;\n+\n+            uint16 xy = ride->overall_view;\n+            if (xy == 0xFFFF)\n+                continue;\n+\n+            sint32 rideX = (xy & 0xFF) * 32;\n+            sint32 rideY = (xy >> 8) * 32;\n+            sint32 distance = abs(x - rideX) + abs(y - rideY);\n+            if (distance < resultDistance)\n+            {\n+                resultDistance = distance;\n+                rideIndex = i;\n+            }\n+        }\n+\n+        return rideIndex;\n+    }\n+\n+    void fix_banner_count()","path":"src/openrct2/world/banner.cpp","position":540,"original_position":540,"commit_id":"8c69e1aad13163a036c5e34204cc3d6b4e236d9b","original_commit_id":"8c69e1aad13163a036c5e34204cc3d6b4e236d9b","user":{"login":"IntelOrca","id":1482259,"avatar_url":"https://avatars0.githubusercontent.com/u/1482259?v=3","gravatar_id":"","url":"https://api.github.com/users/IntelOrca","html_url":"https://github.com/IntelOrca","followers_url":"https://api.github.com/users/IntelOrca/followers","following_url":"https://api.github.com/users/IntelOrca/following{/other_user}","gists_url":"https://api.github.com/users/IntelOrca/gists{/gist_id}","starred_url":"https://api.github.com/users/IntelOrca/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IntelOrca/subscriptions","organizations_url":"https://api.github.com/users/IntelOrca/orgs","repos_url":"https://api.github.com/users/IntelOrca/repos","events_url":"https://api.github.com/users/IntelOrca/events{/privacy}","received_events_url":"https://api.github.com/users/IntelOrca/received_events","type":"User","site_admin":false},"body":"Could have a better name since its not fixing any 'count'.","created_at":"2017-03-11T11:34:57Z","updated_at":"2017-03-11T11:35:21Z","html_url":"https://github.com/OpenRCT2/OpenRCT2/pull/5291#discussion_r105531805","pull_request_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/5291","_links":{"self":{"href":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/comments/105531805"},"html":{"href":"https://github.com/OpenRCT2/OpenRCT2/pull/5291#discussion_r105531805"},"pull_request":{"href":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/5291"}}},"pull_request":{"url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/5291","id":109999245,"html_url":"https://github.com/OpenRCT2/OpenRCT2/pull/5291","diff_url":"https://github.com/OpenRCT2/OpenRCT2/pull/5291.diff","patch_url":"https://github.com/OpenRCT2/OpenRCT2/pull/5291.patch","issue_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/issues/5291","number":5291,"state":"open","locked":false,"title":"Refactor Banner Map Element Functions","user":{"login":"duncanspumpkin","id":1277401,"avatar_url":"https://avatars2.githubusercontent.com/u/1277401?v=3","gravatar_id":"","url":"https://api.github.com/users/duncanspumpkin","html_url":"https://github.com/duncanspumpkin","followers_url":"https://api.github.com/users/duncanspumpkin/followers","following_url":"https://api.github.com/users/duncanspumpkin/following{/other_user}","gists_url":"https://api.github.com/users/duncanspumpkin/gists{/gist_id}","starred_url":"https://api.github.com/users/duncanspumpkin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duncanspumpkin/subscriptions","organizations_url":"https://api.github.com/users/duncanspumpkin/orgs","repos_url":"https://api.github.com/users/duncanspumpkin/repos","events_url":"https://api.github.com/users/duncanspumpkin/events{/privacy}","received_events_url":"https://api.github.com/users/duncanspumpkin/received_events","type":"User","site_admin":false},"body":"Check required.","created_at":"2017-03-09T20:31:15Z","updated_at":"2017-03-11T11:35:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8f7726c66b0b2af64a3e9ba0292b2c8fa4ecdd65","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/5291/commits","review_comments_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/5291/comments","review_comment_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/comments{/number}","comments_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/issues/5291/comments","statuses_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/statuses/8c69e1aad13163a036c5e34204cc3d6b4e236d9b","head":{"label":"duncanspumpkin:refactor_banner","ref":"refactor_banner","sha":"8c69e1aad13163a036c5e34204cc3d6b4e236d9b","user":{"login":"duncanspumpkin","id":1277401,"avatar_url":"https://avatars2.githubusercontent.com/u/1277401?v=3","gravatar_id":"","url":"https://api.github.com/users/duncanspumpkin","html_url":"https://github.com/duncanspumpkin","followers_url":"https://api.github.com/users/duncanspumpkin/followers","following_url":"https://api.github.com/users/duncanspumpkin/following{/other_user}","gists_url":"https://api.github.com/users/duncanspumpkin/gists{/gist_id}","starred_url":"https://api.github.com/users/duncanspumpkin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duncanspumpkin/subscriptions","organizations_url":"https://api.github.com/users/duncanspumpkin/orgs","repos_url":"https://api.github.com/users/duncanspumpkin/repos","events_url":"https://api.github.com/users/duncanspumpkin/events{/privacy}","received_events_url":"https://api.github.com/users/duncanspumpkin/received_events","type":"User","site_admin":false},"repo":{"id":19354145,"name":"OpenRCT2","full_name":"duncanspumpkin/OpenRCT2","owner":{"login":"duncanspumpkin","id":1277401,"avatar_url":"https://avatars2.githubusercontent.com/u/1277401?v=3","gravatar_id":"","url":"https://api.github.com/users/duncanspumpkin","html_url":"https://github.com/duncanspumpkin","followers_url":"https://api.github.com/users/duncanspumpkin/followers","following_url":"https://api.github.com/users/duncanspumpkin/following{/other_user}","gists_url":"https://api.github.com/users/duncanspumpkin/gists{/gist_id}","starred_url":"https://api.github.com/users/duncanspumpkin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duncanspumpkin/subscriptions","organizations_url":"https://api.github.com/users/duncanspumpkin/orgs","repos_url":"https://api.github.com/users/duncanspumpkin/repos","events_url":"https://api.github.com/users/duncanspumpkin/events{/privacy}","received_events_url":"https://api.github.com/users/duncanspumpkin/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/duncanspumpkin/OpenRCT2","description":"An open source clone of Roller Coaster Tycoon 2 built by decompiling the original game one bit at a time.","fork":true,"url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2","forks_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/forks","keys_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/teams","hooks_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/hooks","issue_events_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/issues/events{/number}","events_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/events","assignees_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/assignees{/user}","branches_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/branches{/branch}","tags_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/tags","blobs_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/git/refs{/sha}","trees_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/statuses/{sha}","languages_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/languages","stargazers_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/stargazers","contributors_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/contributors","subscribers_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/subscribers","subscription_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/subscription","commits_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/commits{/sha}","git_commits_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/git/commits{/sha}","comments_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/comments{/number}","issue_comment_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/issues/comments{/number}","contents_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/contents/{+path}","compare_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/merges","archive_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/downloads","issues_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/issues{/number}","pulls_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/pulls{/number}","milestones_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/milestones{/number}","notifications_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/labels{/name}","releases_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/releases{/id}","deployments_url":"https://api.github.com/repos/duncanspumpkin/OpenRCT2/deployments","created_at":"2014-05-01T18:49:37Z","updated_at":"2016-11-29T22:50:58Z","pushed_at":"2017-03-11T11:24:44Z","git_url":"git://github.com/duncanspumpkin/OpenRCT2.git","ssh_url":"git@github.com:duncanspumpkin/OpenRCT2.git","clone_url":"https://github.com/duncanspumpkin/OpenRCT2.git","svn_url":"https://github.com/duncanspumpkin/OpenRCT2","homepage":null,"size":46160,"stargazers_count":1,"watchers_count":1,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"develop"}},"base":{"label":"OpenRCT2:develop","ref":"develop","sha":"00b6fb53c683a45787a75ba1d6102fe53af7cb1f","user":{"login":"OpenRCT2","id":8473908,"avatar_url":"https://avatars3.githubusercontent.com/u/8473908?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenRCT2","html_url":"https://github.com/OpenRCT2","followers_url":"https://api.github.com/users/OpenRCT2/followers","following_url":"https://api.github.com/users/OpenRCT2/following{/other_user}","gists_url":"https://api.github.com/users/OpenRCT2/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenRCT2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenRCT2/subscriptions","organizations_url":"https://api.github.com/users/OpenRCT2/orgs","repos_url":"https://api.github.com/users/OpenRCT2/repos","events_url":"https://api.github.com/users/OpenRCT2/events{/privacy}","received_events_url":"https://api.github.com/users/OpenRCT2/received_events","type":"Organization","site_admin":false},"repo":{"id":18348651,"name":"OpenRCT2","full_name":"OpenRCT2/OpenRCT2","owner":{"login":"OpenRCT2","id":8473908,"avatar_url":"https://avatars3.githubusercontent.com/u/8473908?v=3","gravatar_id":"","url":"https://api.github.com/users/OpenRCT2","html_url":"https://github.com/OpenRCT2","followers_url":"https://api.github.com/users/OpenRCT2/followers","following_url":"https://api.github.com/users/OpenRCT2/following{/other_user}","gists_url":"https://api.github.com/users/OpenRCT2/gists{/gist_id}","starred_url":"https://api.github.com/users/OpenRCT2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/OpenRCT2/subscriptions","organizations_url":"https://api.github.com/users/OpenRCT2/orgs","repos_url":"https://api.github.com/users/OpenRCT2/repos","events_url":"https://api.github.com/users/OpenRCT2/events{/privacy}","received_events_url":"https://api.github.com/users/OpenRCT2/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/OpenRCT2/OpenRCT2","description":"An open source re-implementation of RollerCoaster Tycoon 2 🎢","fork":false,"url":"https://api.github.com/repos/OpenRCT2/OpenRCT2","forks_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/forks","keys_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/teams","hooks_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/hooks","issue_events_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/issues/events{/number}","events_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/events","assignees_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/assignees{/user}","branches_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/branches{/branch}","tags_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/tags","blobs_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/git/refs{/sha}","trees_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/statuses/{sha}","languages_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/languages","stargazers_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/stargazers","contributors_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/contributors","subscribers_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/subscribers","subscription_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/subscription","commits_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/commits{/sha}","git_commits_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/git/commits{/sha}","comments_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/comments{/number}","issue_comment_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/issues/comments{/number}","contents_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/contents/{+path}","compare_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/merges","archive_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/downloads","issues_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/issues{/number}","pulls_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls{/number}","milestones_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/milestones{/number}","notifications_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/labels{/name}","releases_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/releases{/id}","deployments_url":"https://api.github.com/repos/OpenRCT2/OpenRCT2/deployments","created_at":"2014-04-01T23:32:25Z","updated_at":"2017-03-10T21:31:19Z","pushed_at":"2017-03-11T11:25:34Z","git_url":"git://github.com/OpenRCT2/OpenRCT2.git","ssh_url":"git@github.com:OpenRCT2/OpenRCT2.git","clone_url":"https://github.com/OpenRCT2/OpenRCT2.git","svn_url":"https://github.com/OpenRCT2/OpenRCT2","homepage":"http://openrct2.website","size":46227,"stargazers_count":2559,"watchers_count":2559,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":428,"mirror_url":null,"open_issues_count":630,"forks":428,"open_issues":630,"watchers":2559,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/5291"},"html":{"href":"https://github.com/OpenRCT2/OpenRCT2/pull/5291"},"issue":{"href":"https://api.github.com/repos/OpenRCT2/OpenRCT2/issues/5291"},"comments":{"href":"https://api.github.com/repos/OpenRCT2/OpenRCT2/issues/5291/comments"},"review_comments":{"href":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/5291/comments"},"review_comment":{"href":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/OpenRCT2/OpenRCT2/pulls/5291/commits"},"statuses":{"href":"https://api.github.com/repos/OpenRCT2/OpenRCT2/statuses/8c69e1aad13163a036c5e34204cc3d6b4e236d9b"}}}}
{"actor":{"display_login":"IntelOrca"}}