{"action":"created","comment":{"url":"https://api.github.com/repos/SFTtech/openage/pulls/comments/35419723","id":35419723,"diff_hunk":"@@ -0,0 +1,330 @@\n+// Copyright 2015-2015 the openage authors. See copying.md for legal info.\n+\n+#include \"unit/unit.h\"\n+#include \"game_save.h\"\n+#include \"game_spec.h\"\n+#include \"generator.h\"\n+\n+namespace openage {\n+\n+coord::tile random_tile(rng::RNG &rng, tileset_t tiles) {\n+\tif (tiles.empty()) {\n+\t\tlog::log(MSG(err) << \"random tile failed\");\n+\t\treturn coord::tile{0, 0};\n+\t}\n+\tuint64_t index = rng.random() % tiles.size();\n+\tauto it = std::begin(tiles);\n+\tstd::advance(it, index);\n+\treturn *it;\n+}\n+\n+\n+Region::Region(int size)\n+\t:\n+\towner{0},\n+\tobject_id{0},\n+\tterrain_id{0},\n+\tcenter{0, 0} {\n+\tfor (int ne = -size; ne < size; ++ne) {\n+\t\tfor (int se = -size; se < size; ++se) {\n+\t\t\tthis->tiles.emplace(coord::tile{ne, se});\n+\t\t}\n+\t}\n+}\n+\n+Region::Region(coord::tile center, tileset_t tiles)\n+\t:\n+\towner{0},\n+\tobject_id{0},\n+\tterrain_id{0},\n+\tcenter(center),\n+\ttiles{tiles} {\n+}\n+\n+tileset_t Region::get_tiles() const {\n+\treturn this->tiles;\n+}\n+\n+coord::tile Region::get_center() const {\n+\treturn this->center;\n+}\n+\n+coord::tile Region::get_tile(rng::RNG &rng) const {\n+\treturn random_tile(rng, this->tiles);\n+}\n+\n+\n+tileset_t Region::subset(rng::RNG &rng, coord::tile tile, unsigned int number) const {\n+\tstd::unordered_set<coord::tile> subtiles;\n+\tsubtiles.emplace(tile);\n+\n+\t// outside layer of tiles\n+\tstd::unordered_set<coord::tile> edge_set;\n+\n+\twhile (subtiles.size() < number) {\n+\t\tif (edge_set.empty()) {\n+\n+\t\t\t// try fill the edge list\n+\t\t\tfor (auto &t : subtiles) {\n+\n+\t\t\t\t// check adjacent tiles\n+\t\t\t\tfor (int i = 0; i < 4; ++i) {\n+\t\t\t\t\tcoord::tile adj = t + neigh_tiles[i];\n+\t\t\t\t\tif (this->tiles.count(adj) && !subtiles.count(adj)) {\n+\t\t\t\t\t\tedge_set.emplace(adj);\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\tif (edge_set.empty()) {\n+\n+\t\t\t\t// unable to grow further\n+\t\t\t\treturn subtiles;\n+\t\t\t}\n+\t\t}\n+\n+\t\t// transfer a random tile\n+\t\tcoord::tile next_tile = random_tile(rng, edge_set);\n+\t\tedge_set.erase(next_tile);\n+\t\tsubtiles.emplace(next_tile);\n+\t}\n+\treturn subtiles;\n+}\n+\n+Region Region::take_tiles(rng::RNG &rng, coord::tile tile, unsigned int number) {\n+\n+\t// take a random subset\n+\ttileset_t new_set = this->subset(rng, tile, number);\n+\n+\t// erase from current set\n+\tfor (auto &t: new_set) {\n+\t\tthis->tiles.erase(t);\n+\t}\n+\n+\tRegion new_region(tile, new_set);\n+\tnew_region.terrain_id = this->terrain_id;\n+\treturn new_region;\n+}\n+\n+Region Region::take_random(rng::RNG &rng, unsigned int number) {\n+\treturn this->take_tiles(rng, this->get_tile(rng), number);\n+}\n+\n+Generator::Generator(Engine *engine)\n+\t:\n+\tOptionNode{\"Generator\"},\n+\tassetmanager{engine->get_data_dir()},\n+\tspec{std::make_shared<GameSpec>(&this->assetmanager)} {\n+\n+\t// node settings\n+\tthis->set_parent(engine);\n+\tthis->add(\"generation_seed\", 12345);\n+\tthis->add(\"terrain_size\", 2);\n+\tthis->add(\"terrain_base_id\", 0);\n+\tthis->add(\"player_area\", 850);\n+\tthis->add(\"load_filename\", \"default_save.txt\");\n+\tthis->add(\"player_names\", options::option_list{\"name1\", \"name2\"});\n+\n+\t// Save game functions\n+\toptions::OptionAction save_action(\"save_game\", [this]() {\n+\t\tEngine &engine = Engine::get();\n+\t\tif (!engine.get_game()) {\n+\t\t\tlog::log(MSG(warn) << \"game required for saving\");\n+\t\t\treturn;\n+\t\t}\n+\t\tauto filename = this->get_variable(\"load_filename\").value<std::string>();\n+\t\tgameio::save(engine.get_game(), filename);\n+\t});\n+\tthis->add_action(save_action);\n+\n+\t// Load game function\n+\toptions::OptionAction load_action(\"load_game\", [this]() {\n+\t\tEngine &engine = Engine::get();\n+\t\tif (engine.get_game()) {\n+\t\t\tlog::log(MSG(warn) << \"close existing game before loading\");\n+\t\t\treturn;\n+\t\t}\n+\t\tauto filename = this->get_variable(\"load_filename\").value<std::string>();\n+\n+\t\t// create an empty game\n+\t\tthis->regions.clear();\n+\t\tengine.start_game(*this);\n+\t\tgameio::load(engine.get_game(), filename);\n+\t});\n+\tthis->add_action(load_action);\n+\n+\t// create a game using this generator\n+\toptions::OptionAction start_action(\"generate_game\", [this]() {\n+\t\tthis->create();\n+\t});\n+\tthis->add_action(start_action);\n+\n+\t// stop game\n+\toptions::OptionAction end_action(\"end_game\", [this]() {\n+\t\tEngine &engine = Engine::get();\n+\t\tengine.end_game();\n+\t});\n+\tthis->add_action(end_action);\n+}\n+\n+\n+std::shared_ptr<GameSpec> Generator::get_spec() const {\n+\treturn this->spec;\n+}\n+\n+std::vector<std::string> Generator::player_names() const {\n+\tauto &var = this->get_variable(\"player_names\");\n+\tauto &names = var.value<options::option_list>();\n+\n+\tstd::vector<std::string> result;\n+\tresult.push_back(\"gaia\");\n+\tfor (auto &n : names) {\n+\t\tresult.push_back(n.str_value());\n+\t}\n+\treturn result;\n+}\n+\n+void Generator::create_regions() {\n+\n+\t// get option settings\n+\tint seed = this->getv<int>(\"generation_seed\");\n+\tint size = this->getv<int>(\"terrain_size\");\n+\tint base_id = this->getv<int>(\"terrain_base_id\");\n+\tint p_area = this->getv<int>(\"player_area\");\n+\n+\trng::RNG rng(seed);\n+\tRegion base(size * 16);\n+\tbase.terrain_id = base_id;\n+\tstd::vector<Region> player_regions;\n+\n+\tint player_count = this->player_names().size() - 1;\n+\tfor (int i = 0; i < player_count; ++i) {\n+\t\tlog::log(MSG(dbg) << \"generate player \" << i);\n+\t\tdouble angle = static_cast<double>(i) / static_cast<double>(player_count);\n+\t\tint ne = size * 11.0 * sin(2 * M_PI * angle);\n+\t\tint se = size * 11.0 * cos(2 * M_PI * angle);\n+\t\tcoord::tile player_tile{ne, se};\n+\n+\t\tRegion player = base.take_tiles(rng, player_tile, p_area);\n+\t\tplayer.terrain_id = 10;\n+\n+\t\tRegion obj_space = player.take_tiles(rng, player.get_center(), p_area / 5);\n+\t\tobj_space.owner = i + 1;\n+\t\tobj_space.terrain_id = 8;\n+\n+\t\tRegion trees1 = player.take_random(rng, p_area / 10);\n+\t\ttrees1.terrain_id = 9;\n+\t\ttrees1.object_id = 349;\n+\n+\t\tRegion trees2 = player.take_random(rng, p_area / 10);\n+\t\ttrees2.terrain_id = 9;\n+\t\ttrees2.object_id = 351;\n+\n+\t\tRegion stone = player.take_random(rng, 5);\n+\t\tstone.object_id = 102;\n+\n+\t\tRegion gold = player.take_random(rng, 7);\n+\t\tgold.object_id = 66;\n+\n+\t\tRegion forage = player.take_random(rng, 6);\n+\t\tforage.object_id = 59;\n+\n+\t\tRegion sheep = player.take_random(rng, 4);\n+\t\tsheep.owner = obj_space.owner;\n+\t\tsheep.object_id = 594;\n+\n+\t\tplayer_regions.push_back(player);\n+\t\tplayer_regions.push_back(obj_space);\n+\t\tplayer_regions.push_back(trees1);\n+\t\tplayer_regions.push_back(trees2);\n+\t\tplayer_regions.push_back(stone);\n+\t\tplayer_regions.push_back(gold);\n+\t\tplayer_regions.push_back(forage);\n+\t\tplayer_regions.push_back(sheep);","path":"cpp/generator.cpp","position":242,"original_position":242,"commit_id":"06675b0463d287c49eade77659d3578691ecbd51","original_commit_id":"06675b0463d287c49eade77659d3578691ecbd51","user":{"login":"TheJJ","id":673543,"avatar_url":"https://avatars.githubusercontent.com/u/673543?v=3","gravatar_id":"","url":"https://api.github.com/users/TheJJ","html_url":"https://github.com/TheJJ","followers_url":"https://api.github.com/users/TheJJ/followers","following_url":"https://api.github.com/users/TheJJ/following{/other_user}","gists_url":"https://api.github.com/users/TheJJ/gists{/gist_id}","starred_url":"https://api.github.com/users/TheJJ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TheJJ/subscriptions","organizations_url":"https://api.github.com/users/TheJJ/orgs","repos_url":"https://api.github.com/users/TheJJ/repos","events_url":"https://api.github.com/users/TheJJ/events{/privacy}","received_events_url":"https://api.github.com/users/TheJJ/received_events","type":"User","site_admin":false},"body":"Btw we wanted to have the available ressources as a dynamic set (namely defined by the gamespec/nyan), so the mods can easily add new ressources someday. Probably too early, but we should at least think about it.","created_at":"2015-07-24T13:04:53Z","updated_at":"2015-07-24T13:04:53Z","html_url":"https://github.com/SFTtech/openage/pull/321#discussion_r35419723","pull_request_url":"https://api.github.com/repos/SFTtech/openage/pulls/321","_links":{"self":{"href":"https://api.github.com/repos/SFTtech/openage/pulls/comments/35419723"},"html":{"href":"https://github.com/SFTtech/openage/pull/321#discussion_r35419723"},"pull_request":{"href":"https://api.github.com/repos/SFTtech/openage/pulls/321"}}},"pull_request":{"url":"https://api.github.com/repos/SFTtech/openage/pulls/321","id":38705514,"html_url":"https://github.com/SFTtech/openage/pull/321","diff_url":"https://github.com/SFTtech/openage/pull/321.diff","patch_url":"https://github.com/SFTtech/openage/pull/321.patch","issue_url":"https://api.github.com/repos/SFTtech/openage/issues/321","number":321,"state":"open","locked":false,"title":"Gamemain refactoring","user":{"login":"Jon0","id":3847361,"avatar_url":"https://avatars.githubusercontent.com/u/3847361?v=3","gravatar_id":"","url":"https://api.github.com/users/Jon0","html_url":"https://github.com/Jon0","followers_url":"https://api.github.com/users/Jon0/followers","following_url":"https://api.github.com/users/Jon0/following{/other_user}","gists_url":"https://api.github.com/users/Jon0/gists{/gist_id}","starred_url":"https://api.github.com/users/Jon0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Jon0/subscriptions","organizations_url":"https://api.github.com/users/Jon0/orgs","repos_url":"https://api.github.com/users/Jon0/repos","events_url":"https://api.github.com/users/Jon0/events{/privacy}","received_events_url":"https://api.github.com/users/Jon0/received_events","type":"User","site_admin":false},"body":"Gamemain split across several classes\r\nSeperating existing map rendering code into GameRenderer\r\nThe input handling and ui rendering now done in GameControl\r\n\r\nDataManager renamed to GameSpec. this is supposed to be a class covering the available tile sets and unit types available (which may change with game data mods)\r\n\r\nThe file loading for Terrain now done by the GameSpec so it only needs loading once, Terrain objects now constructed just using meta data, which means constructing a new Terrain is easier. In future this makes exiting one game returning to the main menu and then creating another possible.\r\n\r\nThe GameControl splits the existing input code into EditorMode and ActionMode, to be handled seperatly, and a new mode CreateMode for constructing a game will eventually have gui elements to select settings for creating a new game.\r\n\r\nI am considering refactoring the KeybindManager to handle mouse actions as well, maybe renamed to InputManager -- this could avoid a bunch of duplicate mouse handling code\r\n\r\nThis pr slightly overlaps the existing gui and renderer pull requests but should be easy to intergrate with them","created_at":"2015-06-27T07:16:06Z","updated_at":"2015-07-24T13:04:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b643df7931dfa781759ca7569d65e70677aa0f08","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/SFTtech/openage/pulls/321/commits","review_comments_url":"https://api.github.com/repos/SFTtech/openage/pulls/321/comments","review_comment_url":"https://api.github.com/repos/SFTtech/openage/pulls/comments{/number}","comments_url":"https://api.github.com/repos/SFTtech/openage/issues/321/comments","statuses_url":"https://api.github.com/repos/SFTtech/openage/statuses/06675b0463d287c49eade77659d3578691ecbd51","head":{"label":"Jon0:gamemain","ref":"gamemain","sha":"06675b0463d287c49eade77659d3578691ecbd51","user":{"login":"Jon0","id":3847361,"avatar_url":"https://avatars.githubusercontent.com/u/3847361?v=3","gravatar_id":"","url":"https://api.github.com/users/Jon0","html_url":"https://github.com/Jon0","followers_url":"https://api.github.com/users/Jon0/followers","following_url":"https://api.github.com/users/Jon0/following{/other_user}","gists_url":"https://api.github.com/users/Jon0/gists{/gist_id}","starred_url":"https://api.github.com/users/Jon0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Jon0/subscriptions","organizations_url":"https://api.github.com/users/Jon0/orgs","repos_url":"https://api.github.com/users/Jon0/repos","events_url":"https://api.github.com/users/Jon0/events{/privacy}","received_events_url":"https://api.github.com/users/Jon0/received_events","type":"User","site_admin":false},"repo":{"id":25803186,"name":"openage","full_name":"Jon0/openage","owner":{"login":"Jon0","id":3847361,"avatar_url":"https://avatars.githubusercontent.com/u/3847361?v=3","gravatar_id":"","url":"https://api.github.com/users/Jon0","html_url":"https://github.com/Jon0","followers_url":"https://api.github.com/users/Jon0/followers","following_url":"https://api.github.com/users/Jon0/following{/other_user}","gists_url":"https://api.github.com/users/Jon0/gists{/gist_id}","starred_url":"https://api.github.com/users/Jon0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Jon0/subscriptions","organizations_url":"https://api.github.com/users/Jon0/orgs","repos_url":"https://api.github.com/users/Jon0/repos","events_url":"https://api.github.com/users/Jon0/events{/privacy}","received_events_url":"https://api.github.com/users/Jon0/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Jon0/openage","description":"Free (as in freedom) open source clone of the Age of Empires II engine.","fork":true,"url":"https://api.github.com/repos/Jon0/openage","forks_url":"https://api.github.com/repos/Jon0/openage/forks","keys_url":"https://api.github.com/repos/Jon0/openage/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Jon0/openage/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Jon0/openage/teams","hooks_url":"https://api.github.com/repos/Jon0/openage/hooks","issue_events_url":"https://api.github.com/repos/Jon0/openage/issues/events{/number}","events_url":"https://api.github.com/repos/Jon0/openage/events","assignees_url":"https://api.github.com/repos/Jon0/openage/assignees{/user}","branches_url":"https://api.github.com/repos/Jon0/openage/branches{/branch}","tags_url":"https://api.github.com/repos/Jon0/openage/tags","blobs_url":"https://api.github.com/repos/Jon0/openage/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Jon0/openage/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Jon0/openage/git/refs{/sha}","trees_url":"https://api.github.com/repos/Jon0/openage/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Jon0/openage/statuses/{sha}","languages_url":"https://api.github.com/repos/Jon0/openage/languages","stargazers_url":"https://api.github.com/repos/Jon0/openage/stargazers","contributors_url":"https://api.github.com/repos/Jon0/openage/contributors","subscribers_url":"https://api.github.com/repos/Jon0/openage/subscribers","subscription_url":"https://api.github.com/repos/Jon0/openage/subscription","commits_url":"https://api.github.com/repos/Jon0/openage/commits{/sha}","git_commits_url":"https://api.github.com/repos/Jon0/openage/git/commits{/sha}","comments_url":"https://api.github.com/repos/Jon0/openage/comments{/number}","issue_comment_url":"https://api.github.com/repos/Jon0/openage/issues/comments{/number}","contents_url":"https://api.github.com/repos/Jon0/openage/contents/{+path}","compare_url":"https://api.github.com/repos/Jon0/openage/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Jon0/openage/merges","archive_url":"https://api.github.com/repos/Jon0/openage/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Jon0/openage/downloads","issues_url":"https://api.github.com/repos/Jon0/openage/issues{/number}","pulls_url":"https://api.github.com/repos/Jon0/openage/pulls{/number}","milestones_url":"https://api.github.com/repos/Jon0/openage/milestones{/number}","notifications_url":"https://api.github.com/repos/Jon0/openage/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Jon0/openage/labels{/name}","releases_url":"https://api.github.com/repos/Jon0/openage/releases{/id}","created_at":"2014-10-27T04:28:20Z","updated_at":"2015-05-07T03:07:40Z","pushed_at":"2015-07-22T09:18:09Z","git_url":"git://github.com/Jon0/openage.git","ssh_url":"git@github.com:Jon0/openage.git","clone_url":"https://github.com/Jon0/openage.git","svn_url":"https://github.com/Jon0/openage","homepage":"http://openage.sft.mx","size":5558,"stargazers_count":2,"watchers_count":2,"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":2,"default_branch":"master"}},"base":{"label":"SFTtech:master","ref":"master","sha":"30c973baf3f3ae8fdc4b8b91584903e7c639e07b","user":{"login":"SFTtech","id":1783325,"avatar_url":"https://avatars.githubusercontent.com/u/1783325?v=3","gravatar_id":"","url":"https://api.github.com/users/SFTtech","html_url":"https://github.com/SFTtech","followers_url":"https://api.github.com/users/SFTtech/followers","following_url":"https://api.github.com/users/SFTtech/following{/other_user}","gists_url":"https://api.github.com/users/SFTtech/gists{/gist_id}","starred_url":"https://api.github.com/users/SFTtech/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SFTtech/subscriptions","organizations_url":"https://api.github.com/users/SFTtech/orgs","repos_url":"https://api.github.com/users/SFTtech/repos","events_url":"https://api.github.com/users/SFTtech/events{/privacy}","received_events_url":"https://api.github.com/users/SFTtech/received_events","type":"Organization","site_admin":false},"repo":{"id":14095175,"name":"openage","full_name":"SFTtech/openage","owner":{"login":"SFTtech","id":1783325,"avatar_url":"https://avatars.githubusercontent.com/u/1783325?v=3","gravatar_id":"","url":"https://api.github.com/users/SFTtech","html_url":"https://github.com/SFTtech","followers_url":"https://api.github.com/users/SFTtech/followers","following_url":"https://api.github.com/users/SFTtech/following{/other_user}","gists_url":"https://api.github.com/users/SFTtech/gists{/gist_id}","starred_url":"https://api.github.com/users/SFTtech/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SFTtech/subscriptions","organizations_url":"https://api.github.com/users/SFTtech/orgs","repos_url":"https://api.github.com/users/SFTtech/repos","events_url":"https://api.github.com/users/SFTtech/events{/privacy}","received_events_url":"https://api.github.com/users/SFTtech/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SFTtech/openage","description":"Free (as in freedom) open source clone of the Age of Empires II engine.","fork":false,"url":"https://api.github.com/repos/SFTtech/openage","forks_url":"https://api.github.com/repos/SFTtech/openage/forks","keys_url":"https://api.github.com/repos/SFTtech/openage/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SFTtech/openage/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SFTtech/openage/teams","hooks_url":"https://api.github.com/repos/SFTtech/openage/hooks","issue_events_url":"https://api.github.com/repos/SFTtech/openage/issues/events{/number}","events_url":"https://api.github.com/repos/SFTtech/openage/events","assignees_url":"https://api.github.com/repos/SFTtech/openage/assignees{/user}","branches_url":"https://api.github.com/repos/SFTtech/openage/branches{/branch}","tags_url":"https://api.github.com/repos/SFTtech/openage/tags","blobs_url":"https://api.github.com/repos/SFTtech/openage/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SFTtech/openage/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SFTtech/openage/git/refs{/sha}","trees_url":"https://api.github.com/repos/SFTtech/openage/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SFTtech/openage/statuses/{sha}","languages_url":"https://api.github.com/repos/SFTtech/openage/languages","stargazers_url":"https://api.github.com/repos/SFTtech/openage/stargazers","contributors_url":"https://api.github.com/repos/SFTtech/openage/contributors","subscribers_url":"https://api.github.com/repos/SFTtech/openage/subscribers","subscription_url":"https://api.github.com/repos/SFTtech/openage/subscription","commits_url":"https://api.github.com/repos/SFTtech/openage/commits{/sha}","git_commits_url":"https://api.github.com/repos/SFTtech/openage/git/commits{/sha}","comments_url":"https://api.github.com/repos/SFTtech/openage/comments{/number}","issue_comment_url":"https://api.github.com/repos/SFTtech/openage/issues/comments{/number}","contents_url":"https://api.github.com/repos/SFTtech/openage/contents/{+path}","compare_url":"https://api.github.com/repos/SFTtech/openage/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SFTtech/openage/merges","archive_url":"https://api.github.com/repos/SFTtech/openage/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SFTtech/openage/downloads","issues_url":"https://api.github.com/repos/SFTtech/openage/issues{/number}","pulls_url":"https://api.github.com/repos/SFTtech/openage/pulls{/number}","milestones_url":"https://api.github.com/repos/SFTtech/openage/milestones{/number}","notifications_url":"https://api.github.com/repos/SFTtech/openage/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SFTtech/openage/labels{/name}","releases_url":"https://api.github.com/repos/SFTtech/openage/releases{/id}","created_at":"2013-11-03T22:35:23Z","updated_at":"2015-07-24T03:47:32Z","pushed_at":"2015-07-24T12:49:49Z","git_url":"git://github.com/SFTtech/openage.git","ssh_url":"git@github.com:SFTtech/openage.git","clone_url":"https://github.com/SFTtech/openage.git","svn_url":"https://github.com/SFTtech/openage","homepage":"http://openage.sft.mx","size":9228,"stargazers_count":3019,"watchers_count":3019,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":275,"mirror_url":null,"open_issues_count":97,"forks":275,"open_issues":97,"watchers":3019,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/SFTtech/openage/pulls/321"},"html":{"href":"https://github.com/SFTtech/openage/pull/321"},"issue":{"href":"https://api.github.com/repos/SFTtech/openage/issues/321"},"comments":{"href":"https://api.github.com/repos/SFTtech/openage/issues/321/comments"},"review_comments":{"href":"https://api.github.com/repos/SFTtech/openage/pulls/321/comments"},"review_comment":{"href":"https://api.github.com/repos/SFTtech/openage/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/SFTtech/openage/pulls/321/commits"},"statuses":{"href":"https://api.github.com/repos/SFTtech/openage/statuses/06675b0463d287c49eade77659d3578691ecbd51"}}}}