{"action":"created","comment":{"url":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/comments/103432206","pull_request_review_id":24215960,"id":103432206,"diff_hunk":"@@ -9,52 +9,340 @@\n  *  @author Jesse Buhagiar\n  */\n #include <SH3/graphics/texture.hpp>\n+#include <SH3/system/assert.hpp>\n #include <SH3/system/log.hpp>\n #include <SH3/arc/vfile.hpp>\n \n+#include <algorithm>\n #include <cassert>\n-\n+#include <fstream>\n+#include <functional>\n+#include <limits>\n \n using namespace sh3_graphics;\n \n+#pragma pack(push, 1)\n+struct rgba\n+{\n+    std::uint8_t r, g, b, a;\n+};\n+\n+struct rgba16\n+{\n+    uint8_t r : 5;\n+    uint8_t g : 5;\n+    uint8_t b : 5;\n+    uint8_t a : 1;\n+};\n+\n+struct rgb\n+{\n+    std::uint8_t r, g, b;\n+};\n+\n+struct bgra\n+{\n+    std::uint8_t b, g, r, a;\n+};\n+\n+struct bgr\n+{\n+    std::uint8_t b, g, r;\n+};\n+\n+struct tga_header\n+{\n+    static constexpr std::uint8_t TYPE_RGB24 = 2;\n+    static constexpr std::uint8_t FLAGS_FLIP = 0x20;\n+\n+    std::uint8_t id_size = 0;               /**< Size of the ID field that follows this header (usually 0) */\n+    std::uint8_t colormap = 0;              /**< Is this image paletted (THIS MUST ALWAYS BE 0 FOR US!) */\n+    std::uint8_t type = TYPE_RGB24;         /**< Type of image (ALWAYS 2 FOR RGB24!) */\n+    std::uint8_t unused[5] = {0, 0, 0, 0, 0};\n+\n+    std::uint16_t x_origin = 0;             /**< Co-ordinate for first X value */\n+    std::uint16_t y_origin = 0;             /**< Co-ordinate for first Y value */\n+    std::uint16_t width = 0;\n+    std::uint16_t height = 0;\n+    std::uint8_t bpp = 24;                  /**< Bits per pixel */\n+    std::uint8_t flags = FLAGS_FLIP;\n+};\n+\n+#pragma pack(pop)\n+\n+/**\n+ *  Dump a texture to a TARGA/TGA file\n+ *\n+ *  @param width - The Width of this texture.\n+ *  @param height - The Height of this texture.\n+ *  @param data - Pixel data\n+ */\n+void Dump2Bitmap(std::uint32_t width, std::uint32_t height, std::vector<std::uint8_t>& data)\n+{\n+    tga_header header;\n+    std::ofstream file(\"output.tga\", std::ios::binary); // Open the stream for binary output\n+\n+    header.width        = (uint16_t)width;\n+    header.height       = (uint16_t)height;\n+\n+    assert(width <= std::numeric_limits<decltype(header.width)>::max());\n+    assert(height <= std::numeric_limits<decltype(header.height)>::max());\n+\n+    file.write((char*)&header, sizeof(header));\n+    file.write((char*)&data[0], data.size());\n+}\n+\n //TODO: Scale the texture and then\n void sh3_texture::Load(sh3_arc& mft, const std::string& filename)\n {\n     sh3_texture_header          header;\n     sh3_arc_vfile               file(mft, filename);\n     sh3_arc_vfile::read_error   e;\n-    std::vector<std::uint8_t>   data;     // Pixel data of this texture (with the header stripped)\n+    std::vector<uint8_t>        data;       // Pixel data of this texture (with the header stripped)\n \n-    std::size_t ret = file.ReadData(&header, sizeof(header), e); // Read in the header\n+    static std::size_t          offset = 0;\n+\n+    std::size_t ret = file.ReadData(&header, sizeof(header), e);\n \n     if(ret != sizeof(header))\n-        die(\"sh3_texture::Load( ): Header only read %d bytes of data! It should have been %d\", ret, sizeof(header)); // TODO: Fallback on dummy texture (like Source's purple and black checkboard)\n+        die(\"sh3_texture::Load( ): ReadData( ) != sizeof(header)!\");\n \n-    if(header.bpp == 8)\n-        Log(LogLevel::WARN, \"WARNING: 8-bit textures are currently unsupported! They WILL look like nothing but pixel garbage.\");\n+    // Check for the pesky 64-byte A7A7A7A7 header that sometimes precedes our texture header\n+    if(header.batchHeaderMarker == 0x00000000 && header.batchSize == 0xA7A7A7A7) // AHA!\n+    {\n+        offset = 0x40; // Skip the unknown header if it exists\n \n-    Log(LogLevel::INFO, \"Texture info:\\n\\ttexWidth:%d\\n\\ttexHeight:%d\\n\\ttexSize:%d\\n\\tbpp:%d\", header.texWidth, header.texHeight, header.texSize, header.bpp);\n+        file.Seek(offset, std::ios_base::beg);\n+        file.ReadData(&header, sizeof(header), e);\n \n-    file.Seek(sizeof(header) + header.dataOffset, std::ios_base::beg);\n+        if(ret != sizeof(header))\n+            die(\"sh3_texture::Load( ): ReadData( ) != sizeof(header)!\");\n+    }\n \n-    data.resize(header.texSize);\n+    if(header.texSize == (header.texWidth * header.texHeight* 4))\n+    {\n+        header.bpp = 32; // Thanks KONAMI!\n+    }\n \n-    if(header.texSize != header.texWidth * header.texHeight * header.bpp)\n+    // Now that we're done that, we can check perform some sanity checks on our texture!\n+    if(header.texSize != header.texWidth * header.texHeight * (header.bpp / 8))\n     {\n-        Log(LogLevel::ERROR, \"sh3_texture::Load( ): texWidth * texHeight * bpp != header.texSize!\");\n-        return;\n+        Log(LogLevel::WARN, \"sh3_texture::Load( ): Warning, texSize != width * height * (bpp / 8)!\");\n+        return; // TODO: Bind a color shader here\n     }\n \n-    ret = file.ReadData(&data[0], header.texSize, e);\n-    if(ret != header.texSize)\n-        Log(LogLevel::WARN, \"sh3_texture::Load( ): Only read %d out of %d bytes!\", ret, header.texSize);\n+    data.resize(header.texSize); // Early data resize (if it's an 8bpp texture, it will be resized anyway)\n \n-    // Now actually create a logical texture with OpenGL on the gpu\n-    glGenTextures(1, &tex);\n+    if(header.bpp == PixelFormat::PALETTE)\n+    {\n+        palette_info         pal_header;\n+        std::vector<bgra>    palette;    // Palette Data (I think this is BGRA)\n \n-    glBindTexture(GL_TEXTURE_2D, tex);\n-    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, header.texWidth, header.texHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, &data[0]);\n-    glBindTexture(GL_TEXTURE_2D, 0); // Unbind this texture\n+        // First, we need to seek to the palette and read it in.\n+        file.Seek(offset + header.batchHeaderSize + header.texFileSize, std::ios_base::beg);\n+        file.ReadData(&pal_header, sizeof(pal_header), e);\n+\n+        ASSERT(pal_header.bytes_per_pixel == sizeof(palette.front()));","path":"source/SH3/graphics/texture.cpp","position":157,"original_position":157,"commit_id":"928afbc756a2355b98c7f8d8387268e2b567c490","original_commit_id":"928afbc756a2355b98c7f8d8387268e2b567c490","user":{"login":"z33ky","id":289819,"avatar_url":"https://avatars.githubusercontent.com/u/289819?v=3","gravatar_id":"","url":"https://api.github.com/users/z33ky","html_url":"https://github.com/z33ky","followers_url":"https://api.github.com/users/z33ky/followers","following_url":"https://api.github.com/users/z33ky/following{/other_user}","gists_url":"https://api.github.com/users/z33ky/gists{/gist_id}","starred_url":"https://api.github.com/users/z33ky/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/z33ky/subscriptions","organizations_url":"https://api.github.com/users/z33ky/orgs","repos_url":"https://api.github.com/users/z33ky/repos","events_url":"https://api.github.com/users/z33ky/events{/privacy}","received_events_url":"https://api.github.com/users/z33ky/received_events","type":"User","site_admin":false},"body":"In most languages, `assert`s are features used for debugging, although it can usually be controlled via a separate flag. For the `assert` in the standard library, once has to define the `NDEBUG` macro to get rid of them, which CMake does for the release configuration.\r\n\r\nAs a side-note, since `assert`s are removed from release-builds, I'm not sure if the optimizer can make the same assumptions. We might want to modify `ASSERT` to do `if(x) __builtin_unreachable()` when disabled.","created_at":"2017-02-28T11:21:40Z","updated_at":"2017-02-28T11:21:40Z","html_url":"https://github.com/Palm-Studios/sh3redux/pull/87#discussion_r103432206","pull_request_url":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/87","_links":{"self":{"href":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/comments/103432206"},"html":{"href":"https://github.com/Palm-Studios/sh3redux/pull/87#discussion_r103432206"},"pull_request":{"href":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/87"}}},"pull_request":{"url":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/87","id":107114160,"html_url":"https://github.com/Palm-Studios/sh3redux/pull/87","diff_url":"https://github.com/Palm-Studios/sh3redux/pull/87.diff","patch_url":"https://github.com/Palm-Studios/sh3redux/pull/87.patch","issue_url":"https://api.github.com/repos/Palm-Studios/sh3redux/issues/87","number":87,"state":"open","locked":false,"title":"Updated texture class (again)","user":{"login":"Quaker762","id":4768900,"avatar_url":"https://avatars.githubusercontent.com/u/4768900?v=3","gravatar_id":"","url":"https://api.github.com/users/Quaker762","html_url":"https://github.com/Quaker762","followers_url":"https://api.github.com/users/Quaker762/followers","following_url":"https://api.github.com/users/Quaker762/following{/other_user}","gists_url":"https://api.github.com/users/Quaker762/gists{/gist_id}","starred_url":"https://api.github.com/users/Quaker762/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Quaker762/subscriptions","organizations_url":"https://api.github.com/users/Quaker762/orgs","repos_url":"https://api.github.com/users/Quaker762/repos","events_url":"https://api.github.com/users/Quaker762/events{/privacy}","received_events_url":"https://api.github.com/users/Quaker762/received_events","type":"User","site_admin":false},"body":"Everything works as it should now (I hope). 8-bit textures have been\r\ntested and are confirmed to be working (for the most part), however, 16,\r\n24, and 32 bit textures have not, but they should work just fine.\r\n\r\nI think the `normal` and `transform` arrays need some tweaking. The output is slightly corrupt/offset a few pixels to the right, and I'm sure that's the culprit. That or the palette is encrypted as well (I hope not...)","created_at":"2017-02-21T04:22:38Z","updated_at":"2017-02-28T11:21:40Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fff6deebf3eea0bf908d28ca1727ad5bae86bb77","assignee":{"login":"Quaker762","id":4768900,"avatar_url":"https://avatars.githubusercontent.com/u/4768900?v=3","gravatar_id":"","url":"https://api.github.com/users/Quaker762","html_url":"https://github.com/Quaker762","followers_url":"https://api.github.com/users/Quaker762/followers","following_url":"https://api.github.com/users/Quaker762/following{/other_user}","gists_url":"https://api.github.com/users/Quaker762/gists{/gist_id}","starred_url":"https://api.github.com/users/Quaker762/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Quaker762/subscriptions","organizations_url":"https://api.github.com/users/Quaker762/orgs","repos_url":"https://api.github.com/users/Quaker762/repos","events_url":"https://api.github.com/users/Quaker762/events{/privacy}","received_events_url":"https://api.github.com/users/Quaker762/received_events","type":"User","site_admin":false},"assignees":[{"login":"Quaker762","id":4768900,"avatar_url":"https://avatars.githubusercontent.com/u/4768900?v=3","gravatar_id":"","url":"https://api.github.com/users/Quaker762","html_url":"https://github.com/Quaker762","followers_url":"https://api.github.com/users/Quaker762/followers","following_url":"https://api.github.com/users/Quaker762/following{/other_user}","gists_url":"https://api.github.com/users/Quaker762/gists{/gist_id}","starred_url":"https://api.github.com/users/Quaker762/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Quaker762/subscriptions","organizations_url":"https://api.github.com/users/Quaker762/orgs","repos_url":"https://api.github.com/users/Quaker762/repos","events_url":"https://api.github.com/users/Quaker762/events{/privacy}","received_events_url":"https://api.github.com/users/Quaker762/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/87/commits","review_comments_url":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/87/comments","review_comment_url":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Palm-Studios/sh3redux/issues/87/comments","statuses_url":"https://api.github.com/repos/Palm-Studios/sh3redux/statuses/928afbc756a2355b98c7f8d8387268e2b567c490","head":{"label":"Quaker762:texture_new","ref":"texture_new","sha":"928afbc756a2355b98c7f8d8387268e2b567c490","user":{"login":"Quaker762","id":4768900,"avatar_url":"https://avatars.githubusercontent.com/u/4768900?v=3","gravatar_id":"","url":"https://api.github.com/users/Quaker762","html_url":"https://github.com/Quaker762","followers_url":"https://api.github.com/users/Quaker762/followers","following_url":"https://api.github.com/users/Quaker762/following{/other_user}","gists_url":"https://api.github.com/users/Quaker762/gists{/gist_id}","starred_url":"https://api.github.com/users/Quaker762/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Quaker762/subscriptions","organizations_url":"https://api.github.com/users/Quaker762/orgs","repos_url":"https://api.github.com/users/Quaker762/repos","events_url":"https://api.github.com/users/Quaker762/events{/privacy}","received_events_url":"https://api.github.com/users/Quaker762/received_events","type":"User","site_admin":false},"repo":{"id":78095188,"name":"sh3redux","full_name":"Quaker762/sh3redux","owner":{"login":"Quaker762","id":4768900,"avatar_url":"https://avatars.githubusercontent.com/u/4768900?v=3","gravatar_id":"","url":"https://api.github.com/users/Quaker762","html_url":"https://github.com/Quaker762","followers_url":"https://api.github.com/users/Quaker762/followers","following_url":"https://api.github.com/users/Quaker762/following{/other_user}","gists_url":"https://api.github.com/users/Quaker762/gists{/gist_id}","starred_url":"https://api.github.com/users/Quaker762/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Quaker762/subscriptions","organizations_url":"https://api.github.com/users/Quaker762/orgs","repos_url":"https://api.github.com/users/Quaker762/repos","events_url":"https://api.github.com/users/Quaker762/events{/privacy}","received_events_url":"https://api.github.com/users/Quaker762/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Quaker762/sh3redux","description":"SILENT HILL 3 Engine Remake in OpenGL and C++","fork":true,"url":"https://api.github.com/repos/Quaker762/sh3redux","forks_url":"https://api.github.com/repos/Quaker762/sh3redux/forks","keys_url":"https://api.github.com/repos/Quaker762/sh3redux/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Quaker762/sh3redux/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Quaker762/sh3redux/teams","hooks_url":"https://api.github.com/repos/Quaker762/sh3redux/hooks","issue_events_url":"https://api.github.com/repos/Quaker762/sh3redux/issues/events{/number}","events_url":"https://api.github.com/repos/Quaker762/sh3redux/events","assignees_url":"https://api.github.com/repos/Quaker762/sh3redux/assignees{/user}","branches_url":"https://api.github.com/repos/Quaker762/sh3redux/branches{/branch}","tags_url":"https://api.github.com/repos/Quaker762/sh3redux/tags","blobs_url":"https://api.github.com/repos/Quaker762/sh3redux/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Quaker762/sh3redux/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Quaker762/sh3redux/git/refs{/sha}","trees_url":"https://api.github.com/repos/Quaker762/sh3redux/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Quaker762/sh3redux/statuses/{sha}","languages_url":"https://api.github.com/repos/Quaker762/sh3redux/languages","stargazers_url":"https://api.github.com/repos/Quaker762/sh3redux/stargazers","contributors_url":"https://api.github.com/repos/Quaker762/sh3redux/contributors","subscribers_url":"https://api.github.com/repos/Quaker762/sh3redux/subscribers","subscription_url":"https://api.github.com/repos/Quaker762/sh3redux/subscription","commits_url":"https://api.github.com/repos/Quaker762/sh3redux/commits{/sha}","git_commits_url":"https://api.github.com/repos/Quaker762/sh3redux/git/commits{/sha}","comments_url":"https://api.github.com/repos/Quaker762/sh3redux/comments{/number}","issue_comment_url":"https://api.github.com/repos/Quaker762/sh3redux/issues/comments{/number}","contents_url":"https://api.github.com/repos/Quaker762/sh3redux/contents/{+path}","compare_url":"https://api.github.com/repos/Quaker762/sh3redux/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Quaker762/sh3redux/merges","archive_url":"https://api.github.com/repos/Quaker762/sh3redux/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Quaker762/sh3redux/downloads","issues_url":"https://api.github.com/repos/Quaker762/sh3redux/issues{/number}","pulls_url":"https://api.github.com/repos/Quaker762/sh3redux/pulls{/number}","milestones_url":"https://api.github.com/repos/Quaker762/sh3redux/milestones{/number}","notifications_url":"https://api.github.com/repos/Quaker762/sh3redux/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Quaker762/sh3redux/labels{/name}","releases_url":"https://api.github.com/repos/Quaker762/sh3redux/releases{/id}","deployments_url":"https://api.github.com/repos/Quaker762/sh3redux/deployments","created_at":"2017-01-05T08:37:57Z","updated_at":"2017-01-05T08:37:59Z","pushed_at":"2017-02-28T10:20:12Z","git_url":"git://github.com/Quaker762/sh3redux.git","ssh_url":"git@github.com:Quaker762/sh3redux.git","clone_url":"https://github.com/Quaker762/sh3redux.git","svn_url":"https://github.com/Quaker762/sh3redux","homepage":null,"size":14886,"stargazers_count":0,"watchers_count":0,"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":0,"default_branch":"master"}},"base":{"label":"Palm-Studios:master","ref":"master","sha":"e9b8877c226bf977ebd09b353ca53b1f584c1f95","user":{"login":"Palm-Studios","id":24369067,"avatar_url":"https://avatars.githubusercontent.com/u/24369067?v=3","gravatar_id":"","url":"https://api.github.com/users/Palm-Studios","html_url":"https://github.com/Palm-Studios","followers_url":"https://api.github.com/users/Palm-Studios/followers","following_url":"https://api.github.com/users/Palm-Studios/following{/other_user}","gists_url":"https://api.github.com/users/Palm-Studios/gists{/gist_id}","starred_url":"https://api.github.com/users/Palm-Studios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Palm-Studios/subscriptions","organizations_url":"https://api.github.com/users/Palm-Studios/orgs","repos_url":"https://api.github.com/users/Palm-Studios/repos","events_url":"https://api.github.com/users/Palm-Studios/events{/privacy}","received_events_url":"https://api.github.com/users/Palm-Studios/received_events","type":"Organization","site_admin":false},"repo":{"id":76116619,"name":"sh3redux","full_name":"Palm-Studios/sh3redux","owner":{"login":"Palm-Studios","id":24369067,"avatar_url":"https://avatars.githubusercontent.com/u/24369067?v=3","gravatar_id":"","url":"https://api.github.com/users/Palm-Studios","html_url":"https://github.com/Palm-Studios","followers_url":"https://api.github.com/users/Palm-Studios/followers","following_url":"https://api.github.com/users/Palm-Studios/following{/other_user}","gists_url":"https://api.github.com/users/Palm-Studios/gists{/gist_id}","starred_url":"https://api.github.com/users/Palm-Studios/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Palm-Studios/subscriptions","organizations_url":"https://api.github.com/users/Palm-Studios/orgs","repos_url":"https://api.github.com/users/Palm-Studios/repos","events_url":"https://api.github.com/users/Palm-Studios/events{/privacy}","received_events_url":"https://api.github.com/users/Palm-Studios/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Palm-Studios/sh3redux","description":"SILENT HILL 3 Engine Remake in OpenGL and C++","fork":false,"url":"https://api.github.com/repos/Palm-Studios/sh3redux","forks_url":"https://api.github.com/repos/Palm-Studios/sh3redux/forks","keys_url":"https://api.github.com/repos/Palm-Studios/sh3redux/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Palm-Studios/sh3redux/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Palm-Studios/sh3redux/teams","hooks_url":"https://api.github.com/repos/Palm-Studios/sh3redux/hooks","issue_events_url":"https://api.github.com/repos/Palm-Studios/sh3redux/issues/events{/number}","events_url":"https://api.github.com/repos/Palm-Studios/sh3redux/events","assignees_url":"https://api.github.com/repos/Palm-Studios/sh3redux/assignees{/user}","branches_url":"https://api.github.com/repos/Palm-Studios/sh3redux/branches{/branch}","tags_url":"https://api.github.com/repos/Palm-Studios/sh3redux/tags","blobs_url":"https://api.github.com/repos/Palm-Studios/sh3redux/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Palm-Studios/sh3redux/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Palm-Studios/sh3redux/git/refs{/sha}","trees_url":"https://api.github.com/repos/Palm-Studios/sh3redux/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Palm-Studios/sh3redux/statuses/{sha}","languages_url":"https://api.github.com/repos/Palm-Studios/sh3redux/languages","stargazers_url":"https://api.github.com/repos/Palm-Studios/sh3redux/stargazers","contributors_url":"https://api.github.com/repos/Palm-Studios/sh3redux/contributors","subscribers_url":"https://api.github.com/repos/Palm-Studios/sh3redux/subscribers","subscription_url":"https://api.github.com/repos/Palm-Studios/sh3redux/subscription","commits_url":"https://api.github.com/repos/Palm-Studios/sh3redux/commits{/sha}","git_commits_url":"https://api.github.com/repos/Palm-Studios/sh3redux/git/commits{/sha}","comments_url":"https://api.github.com/repos/Palm-Studios/sh3redux/comments{/number}","issue_comment_url":"https://api.github.com/repos/Palm-Studios/sh3redux/issues/comments{/number}","contents_url":"https://api.github.com/repos/Palm-Studios/sh3redux/contents/{+path}","compare_url":"https://api.github.com/repos/Palm-Studios/sh3redux/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Palm-Studios/sh3redux/merges","archive_url":"https://api.github.com/repos/Palm-Studios/sh3redux/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Palm-Studios/sh3redux/downloads","issues_url":"https://api.github.com/repos/Palm-Studios/sh3redux/issues{/number}","pulls_url":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls{/number}","milestones_url":"https://api.github.com/repos/Palm-Studios/sh3redux/milestones{/number}","notifications_url":"https://api.github.com/repos/Palm-Studios/sh3redux/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Palm-Studios/sh3redux/labels{/name}","releases_url":"https://api.github.com/repos/Palm-Studios/sh3redux/releases{/id}","deployments_url":"https://api.github.com/repos/Palm-Studios/sh3redux/deployments","created_at":"2016-12-10T14:13:46Z","updated_at":"2017-02-03T15:30:40Z","pushed_at":"2017-02-28T05:01:06Z","git_url":"git://github.com/Palm-Studios/sh3redux.git","ssh_url":"git@github.com:Palm-Studios/sh3redux.git","clone_url":"https://github.com/Palm-Studios/sh3redux.git","svn_url":"https://github.com/Palm-Studios/sh3redux","homepage":null,"size":14870,"stargazers_count":28,"watchers_count":28,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"open_issues_count":12,"forks":6,"open_issues":12,"watchers":28,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/87"},"html":{"href":"https://github.com/Palm-Studios/sh3redux/pull/87"},"issue":{"href":"https://api.github.com/repos/Palm-Studios/sh3redux/issues/87"},"comments":{"href":"https://api.github.com/repos/Palm-Studios/sh3redux/issues/87/comments"},"review_comments":{"href":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/87/comments"},"review_comment":{"href":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Palm-Studios/sh3redux/pulls/87/commits"},"statuses":{"href":"https://api.github.com/repos/Palm-Studios/sh3redux/statuses/928afbc756a2355b98c7f8d8387268e2b567c490"}}}}
{"actor":{"display_login":"z33ky"}}