├── README.md ├── data.yaml └── to_markdown.py /README.md: -------------------------------------------------------------------------------- 1 | # AoC developer resources 2 | Useful repositories and articles related to developing software and analysis for Age of Empires II. 3 | ## Repositories 4 | ### rms 5 | | Repository | Language | Maturity | Version | 6 | | --- | --- | --- | --- | 7 | | [mangudai](https://github.com/mangudai/mangudai) | javascript | high | any | 8 | | [aoc-rms](https://github.com/happyleavesaoc/aoc-rms) | python | medium | any | 9 | | [rms-parser](https://gist.github.com/goto-bus-stop/cb59e5f0ae03ec12c3800f120c16eef3) | javascript | medium | aoc | 10 | | [rms-check](https://github.com/goto-bus-stop/rms-check) | rust | low | any | 11 | | [RmsParser](https://github.com/sdjnyty/RmsParser) | C# | low | aoc | 12 | ### genie 13 | | Repository | Language | Maturity | Version | 14 | | --- | --- | --- | --- | 15 | | [genie-slp](https://github.com/goto-bus-stop/genie-slp) | javascript | high | aoc | 16 | | [genie-drs](https://github.com/goto-bus-stop/genie-drs) | javascript | high | aoc | 17 | | [genieutils](https://github.com/sandsmark/genieutils) | c++ | medium | various | 18 | | [age](https://github.com/sandsmark/AGE) | c++ | high | various | 19 | | [AocDatLib](https://github.com/sdjnyty/AocDatLib) | C# | low | aoc | 20 | ### multiplayer 21 | | Repository | Language | Maturity | Version | 22 | | --- | --- | --- | --- | 23 | | [DyingServer](https://github.com/sdjnyty/DyingServer) | C# | low | various | 24 | | [dplobbyserver](https://github.com/goto-bus-stop/dplobbysystem) | pascal | low | aoc | 25 | ### documentation 26 | | Repository | Language | Maturity | Version | 27 | | --- | --- | --- | --- | 28 | | [geniedoc](https://github.com/aap/geniedoc/) | none | medium | various | 29 | | [aoeres](https://github.com/withmorten/aoeres) | none | medium | various | 30 | ### overlay 31 | | Repository | Language | Maturity | Version | 32 | | --- | --- | --- | --- | 33 | | [bartender](https://github.com/IamFlea/bartender) | python | high | hd | 34 | ### ai 35 | | Repository | Language | Maturity | Version | 36 | | --- | --- | --- | --- | 37 | | [aoc-ai-parser](https://github.com/FLWL/aoc-ai-parser) | python | low | aoc | 38 | ### web-tool 39 | | Repository | Language | Maturity | Version | 40 | | --- | --- | --- | --- | 41 | | [aoe2stats](https://github.com/aocpip/aoe2stats) | javascript | high | any | 42 | | [aoe2cm](https://github.com/aocpip/aoe2cm) | javascript | high | n/a | 43 | ### misc 44 | | Repository | Language | Maturity | Version | 45 | | --- | --- | --- | --- | 46 | | [run-aoe-rms](https://github.com/goto-bus-stop/run-aoe-rms) | javascript | low | up | 47 | | [aoc-headless](https://github.com/happyleavesaoc/aoc-headless) | python | low | up | 48 | | [aoc-auto-game](https://github.com/FLWL/aoc-auto-game) | c++ | low | up | 49 | ### analysis 50 | | Repository | Language | Maturity | Version | 51 | | --- | --- | --- | --- | 52 | | [voobly-r](https://github.com/bowswung/voobly-r) | R | low | n/a | 53 | | [aoe2predict](https://github.com/Macuyiko/aoe2predict) | R | low | n/a | 54 | ### new-engine 55 | | Repository | Language | Maturity | Version | 56 | | --- | --- | --- | --- | 57 | | [openage](https://github.com/SFTtech/openage) | various | low | n/a | 58 | | [freeaoe](https://github.com/sandsmark/freeaoe) | c++ | low | various | 59 | | [aoetwols](https://github.com/aap/aoetwols) | c | low | aoc | 60 | ### scx 61 | | Repository | Language | Maturity | Version | 62 | | --- | --- | --- | --- | 63 | | [genie-scx](https://github.com/goto-bus-stop/genie-scx) | javascript | low | aoc | 64 | | [agescx](https://github.com/dderevjanik/agescx) | python | medium | aoc | 65 | | [aoe-real-map-creator](https://github.com/peterolson/AOE2-Real-Map-Creator) | javascript | high | various | 66 | ### recs 67 | | Repository | Language | Maturity | Version | 68 | | --- | --- | --- | --- | 69 | | [aoc-mgz](https://github.com/happyleavesaoc/aoc-mgz) | python | high | up | 70 | | [recage](https://github.com/goto-bus-stop/recage) | javascript | low | up | 71 | | [recanalyst](https://github.com/goto-bus-stop/recanalyst) | php | high | any | 72 | | [aoc-mgz-format](https://github.com/stefan-kolb/aoc-mgx-format) | ruby | low | aoc | 73 | ### voobly 74 | | Repository | Language | Maturity | Version | 75 | | --- | --- | --- | --- | 76 | | [python-voobly](https://github.com/happyleavesaoc/python-voobly) | python | medium | n/a | 77 | | [voobly-scraper](https://github.com/bowswung/voobly-scraper) | haskell | medium | n/a | 78 | ### mod 79 | | Repository | Language | Maturity | Version | 80 | | --- | --- | --- | --- | 81 | | [wololokingdoms](https://github.com/Jineapple/WololoKingdoms) | c++ | high | up | 82 | | [AoETechTree](https://github.com/Janworks/AoETechTree) | c++ | medium | up | 83 | | [aoc-builtin-rms](https://github.com/siegeengineers/aoc-builtin-rms) | c | medium | up | 84 | ## APIs & Protocols 85 | - [Steam Browser Protocol](https://developer.valvesoftware.com/wiki/Steam_browser_protocol) 86 | - [Steam Web API](https://developer.valvesoftware.com/wiki/Steam_Web_API) 87 | - [Voobly API](https://voobly.com/pages/view/147/External-API-Documentation) 88 | ## Articles 89 | - [Predicting Voobly Age of Empires 2 Matches](http://blog.macuyiko.com/post/2018/predicting-voobly-age-of-empires-2-matches.html) 90 | - [Game Hacking: Age of Empires II](http://www.codereversing.com/blog/archives/38) 91 | - [AGE 2 Design Document](https://www.scribd.com/document/318886164/AGE-2-Design-Document) 92 | - [1500 Archers on a 28.8: Network Programming in Age of Empires and Beyond](https://www.gamasutra.com/view/feature/131503/1500_archers_on_a_288_network_.php) 93 | - [Coordinated Movement](http://www.gamasutra.com/view/feature/3313/coordinated_unit_movement.php) 94 | - [Implementing Coordinated Movement](http://www.gamasutra.com/view/feature/131721/implementing_coordinated_movement.php) 95 | - [Postmortem: Ensemble Studio's Age of Empires II: Age of Kings](https://www.gamasutra.com/view/feature/131844/postmortem_ensemble_studios_age_.php) 96 | 97 | -------------------------------------------------------------------------------- /data.yaml: -------------------------------------------------------------------------------- 1 | repositories: 2 | - name: mangudai 3 | language: javascript 4 | category: rms 5 | maturity: high 6 | version: any 7 | url: https://github.com/mangudai/mangudai 8 | - name: aoc-mgz 9 | language: python 10 | category: recs 11 | maturity: high 12 | version: up 13 | url: https://github.com/happyleavesaoc/aoc-mgz 14 | - name: aoc-rms 15 | language: python 16 | category: rms 17 | maturity: medium 18 | version: any 19 | url: https://github.com/happyleavesaoc/aoc-rms 20 | - name: python-voobly 21 | language: python 22 | category: voobly 23 | maturity: medium 24 | version: n/a 25 | url: https://github.com/happyleavesaoc/python-voobly 26 | - name: recage 27 | language: javascript 28 | category: recs 29 | maturity: low 30 | version: up 31 | url: https://github.com/goto-bus-stop/recage 32 | - name: rms-parser 33 | language: javascript 34 | category: rms 35 | maturity: medium 36 | version: aoc 37 | url: https://gist.github.com/goto-bus-stop/cb59e5f0ae03ec12c3800f120c16eef3 38 | - name: rms-check 39 | language: rust 40 | category: rms 41 | maturity: low 42 | version: any 43 | url: https://github.com/goto-bus-stop/rms-check 44 | - name: recanalyst 45 | language: php 46 | category: recs 47 | maturity: high 48 | version: any 49 | url: https://github.com/goto-bus-stop/recanalyst 50 | - name: bartender 51 | language: python 52 | category: overlay 53 | maturity: high 54 | version: hd 55 | url: https://github.com/IamFlea/bartender 56 | - name: voobly-scraper 57 | language: haskell 58 | category: voobly 59 | maturity: medium 60 | version: n/a 61 | url: https://github.com/bowswung/voobly-scraper 62 | - name: voobly-r 63 | language: R 64 | category: analysis 65 | maturity: low 66 | version: n/a 67 | url: https://github.com/bowswung/voobly-r 68 | - name: aoe2predict 69 | language: R 70 | category: analysis 71 | maturity: low 72 | version: n/a 73 | url: https://github.com/Macuyiko/aoe2predict 74 | - name: aoc-mgz-format 75 | language: ruby 76 | category: recs 77 | maturity: low 78 | version: aoc 79 | url: https://github.com/stefan-kolb/aoc-mgx-format 80 | - name: run-aoe-rms 81 | language: javascript 82 | category: misc 83 | maturity: low 84 | version: up 85 | url: https://github.com/goto-bus-stop/run-aoe-rms 86 | - name: wololokingdoms 87 | language: c++ 88 | category: mod 89 | maturity: high 90 | version: up 91 | url: https://github.com/Jineapple/WololoKingdoms 92 | - name: AoETechTree 93 | language: c++ 94 | category: mod 95 | maturity: medium 96 | version: up 97 | url: https://github.com/Janworks/AoETechTree 98 | - name: aoc-builtin-rms 99 | language: c 100 | category: mod 101 | maturity: medium 102 | version: up 103 | url: https://github.com/siegeengineers/aoc-builtin-rms 104 | - name: aoe2stats 105 | language: javascript 106 | category: web-tool 107 | maturity: high 108 | version: any 109 | url: https://github.com/aocpip/aoe2stats 110 | - name: genie-scx 111 | language: javascript 112 | category: scx 113 | maturity: low 114 | version: aoc 115 | url: https://github.com/goto-bus-stop/genie-scx 116 | - name: genie-slp 117 | language: javascript 118 | category: genie 119 | maturity: high 120 | version: aoc 121 | url: https://github.com/goto-bus-stop/genie-slp 122 | - name: genie-drs 123 | language: javascript 124 | category: genie 125 | maturity: high 126 | version: aoc 127 | url: https://github.com/goto-bus-stop/genie-drs 128 | - name: agescx 129 | language: python 130 | category: scx 131 | maturity: medium 132 | version: aoc 133 | url: https://github.com/dderevjanik/agescx 134 | - name: aoc-headless 135 | language: python 136 | category: misc 137 | maturity: low 138 | version: up 139 | url: https://github.com/happyleavesaoc/aoc-headless 140 | - name: genieutils 141 | language: c++ 142 | category: genie 143 | maturity: medium 144 | version: various 145 | url: https://github.com/sandsmark/genieutils 146 | - name: age 147 | language: c++ 148 | category: genie 149 | maturity: high 150 | version: various 151 | url: https://github.com/sandsmark/AGE 152 | - name: openage 153 | language: various 154 | category: new-engine 155 | maturity: low 156 | version: n/a 157 | url: https://github.com/SFTtech/openage 158 | - name: freeaoe 159 | language: c++ 160 | maturity: low 161 | category: new-engine 162 | version: various 163 | url: https://github.com/sandsmark/freeaoe 164 | - name: aoe-real-map-creator 165 | language: javascript 166 | category: scx 167 | maturity: high 168 | version: various 169 | url: https://github.com/peterolson/AOE2-Real-Map-Creator 170 | - name: aoe2cm 171 | language: javascript 172 | category: web-tool 173 | maturity: high 174 | version: n/a 175 | url: https://github.com/aocpip/aoe2cm 176 | - name: aoetwols 177 | language: c 178 | category: new-engine 179 | maturity: low 180 | version: aoc 181 | url: https://github.com/aap/aoetwols 182 | - name: aoc-auto-game 183 | language: c++ 184 | category: misc 185 | maturity: low 186 | version: up 187 | url: https://github.com/FLWL/aoc-auto-game 188 | - name: RmsParser 189 | language: C# 190 | category: rms 191 | maturity: low 192 | version: aoc 193 | url: https://github.com/sdjnyty/RmsParser 194 | - name: AocDatLib 195 | language: C# 196 | category: genie 197 | maturity: low 198 | version: aoc 199 | url: https://github.com/sdjnyty/AocDatLib 200 | - name: DyingServer 201 | language: C# 202 | category: multiplayer 203 | maturity: low 204 | version: various 205 | url: https://github.com/sdjnyty/DyingServer 206 | - name: dplobbyserver 207 | language: pascal 208 | category: multiplayer 209 | maturity: low 210 | version: aoc 211 | url: https://github.com/goto-bus-stop/dplobbysystem 212 | - name: aoc-ai-parser 213 | language: python 214 | category: ai 215 | maturity: low 216 | version: aoc 217 | url: https://github.com/FLWL/aoc-ai-parser 218 | - name: geniedoc 219 | language: none 220 | category: documentation 221 | maturity: medium 222 | version: various 223 | url: https://github.com/aap/geniedoc/ 224 | - name: aoeres 225 | language: none 226 | category: documentation 227 | maturity: medium 228 | version: various 229 | url: https://github.com/withmorten/aoeres 230 | articles: 231 | - name: "Predicting Voobly Age of Empires 2 Matches" 232 | url: http://blog.macuyiko.com/post/2018/predicting-voobly-age-of-empires-2-matches.html 233 | - name: "Game Hacking: Age of Empires II" 234 | url: http://www.codereversing.com/blog/archives/38 235 | - name: "AGE 2 Design Document" 236 | url: https://www.scribd.com/document/318886164/AGE-2-Design-Document 237 | - name: "1500 Archers on a 28.8: Network Programming in Age of Empires and Beyond" 238 | url: https://www.gamasutra.com/view/feature/131503/1500_archers_on_a_288_network_.php 239 | - name: "Coordinated Movement" 240 | url: http://www.gamasutra.com/view/feature/3313/coordinated_unit_movement.php 241 | - name: "Implementing Coordinated Movement" 242 | url: http://www.gamasutra.com/view/feature/131721/implementing_coordinated_movement.php 243 | - name: "Postmortem: Ensemble Studio's Age of Empires II: Age of Kings" 244 | url: https://www.gamasutra.com/view/feature/131844/postmortem_ensemble_studios_age_.php 245 | apis: 246 | - name: "Steam Browser Protocol" 247 | url: https://developer.valvesoftware.com/wiki/Steam_browser_protocol 248 | - name: "Steam Web API" 249 | url: https://developer.valvesoftware.com/wiki/Steam_Web_API 250 | - name: "Voobly API" 251 | url: https://voobly.com/pages/view/147/External-API-Documentation 252 | -------------------------------------------------------------------------------- /to_markdown.py: -------------------------------------------------------------------------------- 1 | """Write markdown for the README.""" 2 | 3 | import yaml 4 | from collections import defaultdict 5 | 6 | DATA_PATH = 'data.yaml' 7 | TITLE = 'AoC developer resources' 8 | DESCRIPTION = 'Useful repositories and articles related to developing software and analysis for Age of Empires II.' 9 | 10 | 11 | def append(text, line): 12 | """Append a line to the text.""" 13 | return f"{text}{line}\n" 14 | 15 | 16 | def write_markdown(data): 17 | """Write markdown based on data file.""" 18 | text = '' 19 | text = append(text, f"# {TITLE}") 20 | text = append(text, DESCRIPTION) 21 | 22 | categories = defaultdict(list) 23 | for repo in data['repositories']: 24 | categories[repo['category']].append(repo) 25 | 26 | text = append(text, "## Repositories") 27 | for cat, repos in categories.items(): 28 | text = append(text, f'### {cat}') 29 | text = append(text, "| Repository | Language | Maturity | Version |") 30 | text = append(text, "| --- | --- | --- | --- |") 31 | for repo in repos: 32 | text = append(text, '| [{}]({}) | {} | {} | {} |'.format( 33 | repo['name'], repo['url'], repo['language'], repo['maturity'], repo['version']) 34 | ) 35 | 36 | text = append(text, "## APIs & Protocols") 37 | for api in data['apis']: 38 | text = append(text, f"- [{api['name']}]({api['url']})") 39 | 40 | text = append(text, "## Articles") 41 | for article in data['articles']: 42 | text = append(text, f"- [{article['name']}]({article['url']})") 43 | 44 | return text 45 | 46 | 47 | if __name__ == '__main__': 48 | """Script entry point.""" 49 | with open(DATA_PATH) as handle: 50 | print(write_markdown(yaml.safe_load(handle))) 51 | --------------------------------------------------------------------------------