mmorpg.html 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta name="generator" content="Asciidoctor 1.5.4">
  8. <title>MMORPG Adventure</title>
  9. <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
  10. <style>
  11. /* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
  12. /* Remove comment around @import statement below when using as a custom stylesheet */
  13. /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
  14. article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
  15. audio,canvas,video{display:inline-block}
  16. audio:not([controls]){display:none;height:0}
  17. [hidden],template{display:none}
  18. script{display:none!important}
  19. html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
  20. body{margin:0}
  21. a{background:transparent}
  22. a:focus{outline:thin dotted}
  23. a:active,a:hover{outline:0}
  24. h1{font-size:2em;margin:.67em 0}
  25. abbr[title]{border-bottom:1px dotted}
  26. b,strong{font-weight:bold}
  27. dfn{font-style:italic}
  28. hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
  29. mark{background:#ff0;color:#000}
  30. code,kbd,pre,samp{font-family:monospace;font-size:1em}
  31. pre{white-space:pre-wrap}
  32. q{quotes:"\201C" "\201D" "\2018" "\2019"}
  33. small{font-size:80%}
  34. sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
  35. sup{top:-.5em}
  36. sub{bottom:-.25em}
  37. img{border:0}
  38. svg:not(:root){overflow:hidden}
  39. figure{margin:0}
  40. fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
  41. legend{border:0;padding:0}
  42. button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
  43. button,input{line-height:normal}
  44. button,select{text-transform:none}
  45. button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
  46. button[disabled],html input[disabled]{cursor:default}
  47. input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
  48. input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
  49. input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
  50. button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
  51. textarea{overflow:auto;vertical-align:top}
  52. table{border-collapse:collapse;border-spacing:0}
  53. *,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
  54. html,body{font-size:100%}
  55. body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto}
  56. a:hover{cursor:pointer}
  57. img,object,embed{max-width:100%;height:auto}
  58. object,embed{height:100%}
  59. img{-ms-interpolation-mode:bicubic}
  60. .left{float:left!important}
  61. .right{float:right!important}
  62. .text-left{text-align:left!important}
  63. .text-right{text-align:right!important}
  64. .text-center{text-align:center!important}
  65. .text-justify{text-align:justify!important}
  66. .hide{display:none}
  67. body{-webkit-font-smoothing:antialiased}
  68. img,object,svg{display:inline-block;vertical-align:middle}
  69. textarea{height:auto;min-height:50px}
  70. select{width:100%}
  71. .center{margin-left:auto;margin-right:auto}
  72. .spread{width:100%}
  73. p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
  74. .subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
  75. div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
  76. a{color:#2156a5;text-decoration:underline;line-height:inherit}
  77. a:hover,a:focus{color:#1d4b8f}
  78. a img{border:none}
  79. p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
  80. p aside{font-size:.875em;line-height:1.35;font-style:italic}
  81. h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
  82. h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
  83. h1{font-size:2.125em}
  84. h2{font-size:1.6875em}
  85. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
  86. h4,h5{font-size:1.125em}
  87. h6{font-size:1em}
  88. hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
  89. em,i{font-style:italic;line-height:inherit}
  90. strong,b{font-weight:bold;line-height:inherit}
  91. small{font-size:60%;line-height:inherit}
  92. code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
  93. ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
  94. ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
  95. ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
  96. ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
  97. ul.square{list-style-type:square}
  98. ul.circle{list-style-type:circle}
  99. ul.disc{list-style-type:disc}
  100. ul.no-bullet{list-style:none}
  101. ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
  102. dl dt{margin-bottom:.3125em;font-weight:bold}
  103. dl dd{margin-bottom:1.25em}
  104. abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
  105. abbr{text-transform:none}
  106. blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
  107. blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
  108. blockquote cite:before{content:"\2014 \0020"}
  109. blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
  110. blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
  111. @media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
  112. h1{font-size:2.75em}
  113. h2{font-size:2.3125em}
  114. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
  115. h4{font-size:1.4375em}}
  116. table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
  117. table thead,table tfoot{background:#f7f8f7;font-weight:bold}
  118. table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
  119. table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
  120. table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
  121. table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
  122. body{tab-size:4}
  123. h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
  124. h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
  125. .clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
  126. .clearfix:after,.float-group:after{clear:both}
  127. *:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
  128. pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
  129. .keyseq{color:rgba(51,51,51,.8)}
  130. kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
  131. .keyseq kbd:first-child{margin-left:0}
  132. .keyseq kbd:last-child{margin-right:0}
  133. .menuseq,.menu{color:rgba(0,0,0,.8)}
  134. b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
  135. b.button:before{content:"[";padding:0 3px 0 2px}
  136. b.button:after{content:"]";padding:0 2px 0 3px}
  137. p a>code:hover{color:rgba(0,0,0,.9)}
  138. #header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
  139. #header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
  140. #header:after,#content:after,#footnotes:after,#footer:after{clear:both}
  141. #content{margin-top:1.25em}
  142. #content:before{content:none}
  143. #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
  144. #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
  145. #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
  146. #header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
  147. #header .details span:first-child{margin-left:-.125em}
  148. #header .details span.email a{color:rgba(0,0,0,.85)}
  149. #header .details br{display:none}
  150. #header .details br+span:before{content:"\00a0\2013\00a0"}
  151. #header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
  152. #header .details br+span#revremark:before{content:"\00a0|\00a0"}
  153. #header #revnumber{text-transform:capitalize}
  154. #header #revnumber:after{content:"\00a0"}
  155. #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
  156. #toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
  157. #toc>ul{margin-left:.125em}
  158. #toc ul.sectlevel0>li>a{font-style:italic}
  159. #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
  160. #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
  161. #toc li{line-height:1.3334;margin-top:.3334em}
  162. #toc a{text-decoration:none}
  163. #toc a:active{text-decoration:underline}
  164. #toctitle{color:#7a2518;font-size:1.2em}
  165. @media only screen and (min-width:768px){#toctitle{font-size:1.375em}
  166. body.toc2{padding-left:15em;padding-right:0}
  167. #toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
  168. #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
  169. #toc.toc2>ul{font-size:.9em;margin-bottom:0}
  170. #toc.toc2 ul ul{margin-left:0;padding-left:1em}
  171. #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
  172. body.toc2.toc-right{padding-left:0;padding-right:15em}
  173. body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
  174. @media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
  175. #toc.toc2{width:20em}
  176. #toc.toc2 #toctitle{font-size:1.375em}
  177. #toc.toc2>ul{font-size:.95em}
  178. #toc.toc2 ul ul{padding-left:1.25em}
  179. body.toc2.toc-right{padding-left:0;padding-right:20em}}
  180. #content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  181. #content #toc>:first-child{margin-top:0}
  182. #content #toc>:last-child{margin-bottom:0}
  183. #footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
  184. #footer-text{color:rgba(255,255,255,.8);line-height:1.44}
  185. .sect1{padding-bottom:.625em}
  186. @media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}
  187. .sect1+.sect1{border-top:1px solid #efefed}
  188. #content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
  189. #content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
  190. #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
  191. #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
  192. #content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
  193. .audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
  194. .admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
  195. table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
  196. .paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
  197. table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
  198. .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
  199. .admonitionblock>table td.icon{text-align:center;width:80px}
  200. .admonitionblock>table td.icon img{max-width:none}
  201. .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
  202. .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
  203. .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
  204. .exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
  205. .exampleblock>.content>:first-child{margin-top:0}
  206. .exampleblock>.content>:last-child{margin-bottom:0}
  207. .sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  208. .sidebarblock>:first-child{margin-top:0}
  209. .sidebarblock>:last-child{margin-bottom:0}
  210. .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
  211. .exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
  212. .literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
  213. .sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
  214. .literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
  215. .literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
  216. @media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
  217. @media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
  218. .literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
  219. .listingblock pre.highlightjs{padding:0}
  220. .listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
  221. .listingblock pre.prettyprint{border-width:0}
  222. .listingblock>.content{position:relative}
  223. .listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
  224. .listingblock:hover code[data-lang]:before{display:block}
  225. .listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
  226. .listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
  227. table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
  228. table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
  229. table.pyhltable td.code{padding-left:.75em;padding-right:0}
  230. pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
  231. pre.pygments .lineno{display:inline-block;margin-right:.25em}
  232. table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
  233. .quoteblock{margin:0 1em 1.25em 1.5em;display:table}
  234. .quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
  235. .quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
  236. .quoteblock blockquote{margin:0;padding:0;border:0}
  237. .quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
  238. .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
  239. .quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
  240. .quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
  241. .quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
  242. .quoteblock .quoteblock blockquote:before{display:none}
  243. .verseblock{margin:0 1em 1.25em 1em}
  244. .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
  245. .verseblock pre strong{font-weight:400}
  246. .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
  247. .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
  248. .quoteblock .attribution br,.verseblock .attribution br{display:none}
  249. .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
  250. .quoteblock.abstract{margin:0 0 1.25em 0;display:block}
  251. .quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
  252. .quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
  253. table.tableblock{max-width:100%;border-collapse:separate}
  254. table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
  255. table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
  256. table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
  257. table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
  258. table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
  259. table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
  260. table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
  261. table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
  262. table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
  263. table.frame-all{border-width:1px}
  264. table.frame-sides{border-width:0 1px}
  265. table.frame-topbot{border-width:1px 0}
  266. th.halign-left,td.halign-left{text-align:left}
  267. th.halign-right,td.halign-right{text-align:right}
  268. th.halign-center,td.halign-center{text-align:center}
  269. th.valign-top,td.valign-top{vertical-align:top}
  270. th.valign-bottom,td.valign-bottom{vertical-align:bottom}
  271. th.valign-middle,td.valign-middle{vertical-align:middle}
  272. table thead th,table tfoot th{font-weight:bold}
  273. tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
  274. tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
  275. p.tableblock>code:only-child{background:none;padding:0}
  276. p.tableblock{font-size:1em}
  277. td>div.verse{white-space:pre}
  278. ol{margin-left:1.75em}
  279. ul li ol{margin-left:1.5em}
  280. dl dd{margin-left:1.125em}
  281. dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
  282. ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
  283. ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
  284. ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
  285. ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em}
  286. ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}
  287. ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
  288. ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
  289. ul.inline>li>*{display:block}
  290. .unstyled dl dt{font-weight:400;font-style:normal}
  291. ol.arabic{list-style-type:decimal}
  292. ol.decimal{list-style-type:decimal-leading-zero}
  293. ol.loweralpha{list-style-type:lower-alpha}
  294. ol.upperalpha{list-style-type:upper-alpha}
  295. ol.lowerroman{list-style-type:lower-roman}
  296. ol.upperroman{list-style-type:upper-roman}
  297. ol.lowergreek{list-style-type:lower-greek}
  298. .hdlist>table,.colist>table{border:0;background:none}
  299. .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
  300. td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
  301. td.hdlist1{font-weight:bold;padding-bottom:1.25em}
  302. .literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
  303. .colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
  304. .colist>table tr>td:last-of-type{padding:.25em 0}
  305. .thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
  306. .imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
  307. .imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
  308. .imageblock>.title{margin-bottom:0}
  309. .imageblock.thumb,.imageblock.th{border-width:6px}
  310. .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
  311. .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
  312. .image.left{margin-right:.625em}
  313. .image.right{margin-left:.625em}
  314. a.image{text-decoration:none;display:inline-block}
  315. a.image object{pointer-events:none}
  316. sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
  317. sup.footnote a,sup.footnoteref a{text-decoration:none}
  318. sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
  319. #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
  320. #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
  321. #footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}
  322. #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
  323. #footnotes .footnote:last-of-type{margin-bottom:0}
  324. #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
  325. .gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
  326. .gist .file-data>table td.line-data{width:99%}
  327. div.unbreakable{page-break-inside:avoid}
  328. .big{font-size:larger}
  329. .small{font-size:smaller}
  330. .underline{text-decoration:underline}
  331. .overline{text-decoration:overline}
  332. .line-through{text-decoration:line-through}
  333. .aqua{color:#00bfbf}
  334. .aqua-background{background-color:#00fafa}
  335. .black{color:#000}
  336. .black-background{background-color:#000}
  337. .blue{color:#0000bf}
  338. .blue-background{background-color:#0000fa}
  339. .fuchsia{color:#bf00bf}
  340. .fuchsia-background{background-color:#fa00fa}
  341. .gray{color:#606060}
  342. .gray-background{background-color:#7d7d7d}
  343. .green{color:#006000}
  344. .green-background{background-color:#007d00}
  345. .lime{color:#00bf00}
  346. .lime-background{background-color:#00fa00}
  347. .maroon{color:#600000}
  348. .maroon-background{background-color:#7d0000}
  349. .navy{color:#000060}
  350. .navy-background{background-color:#00007d}
  351. .olive{color:#606000}
  352. .olive-background{background-color:#7d7d00}
  353. .purple{color:#600060}
  354. .purple-background{background-color:#7d007d}
  355. .red{color:#bf0000}
  356. .red-background{background-color:#fa0000}
  357. .silver{color:#909090}
  358. .silver-background{background-color:#bcbcbc}
  359. .teal{color:#006060}
  360. .teal-background{background-color:#007d7d}
  361. .white{color:#bfbfbf}
  362. .white-background{background-color:#fafafa}
  363. .yellow{color:#bfbf00}
  364. .yellow-background{background-color:#fafa00}
  365. span.icon>.fa{cursor:default}
  366. .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
  367. .admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
  368. .admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
  369. .admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
  370. .admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
  371. .admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
  372. .conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
  373. .conum[data-value] *{color:#fff!important}
  374. .conum[data-value]+b{display:none}
  375. .conum[data-value]:after{content:attr(data-value)}
  376. pre .conum[data-value]{position:relative;top:-.125em}
  377. b.conum *{color:inherit!important}
  378. .conum:not([data-value]):empty{display:none}
  379. dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
  380. h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
  381. p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
  382. p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
  383. p{margin-bottom:1.25rem}
  384. .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
  385. .exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
  386. .print-only{display:none!important}
  387. @media print{@page{margin:1.25cm .75cm}
  388. *{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
  389. a{color:inherit!important;text-decoration:underline!important}
  390. a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
  391. a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
  392. abbr[title]:after{content:" (" attr(title) ")"}
  393. pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
  394. thead{display:table-header-group}
  395. svg{max-width:100%}
  396. p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
  397. h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
  398. #toc,.sidebarblock,.exampleblock>.content{background:none!important}
  399. #toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
  400. .sect1{padding-bottom:0!important}
  401. .sect1+.sect1{border:0!important}
  402. #header>h1:first-child{margin-top:1.25rem}
  403. body.book #header{text-align:center}
  404. body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
  405. body.book #header .details{border:0!important;display:block;padding:0!important}
  406. body.book #header .details span:first-child{margin-left:0!important}
  407. body.book #header .details br{display:block}
  408. body.book #header .details br+span:before{content:none!important}
  409. body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
  410. body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
  411. .listingblock code[data-lang]:before{display:block}
  412. #footer{background:none!important;padding:0 .9375em}
  413. #footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
  414. .hide-on-print{display:none!important}
  415. .print-only{display:block!important}
  416. .hide-for-print{display:none!important}
  417. .show-for-print{display:inherit!important}}
  418. </style>
  419. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
  420. <style>
  421. /* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
  422. /*pre.CodeRay {background-color:#f7f7f8;}*/
  423. .CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
  424. .CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
  425. .CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
  426. table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
  427. table.CodeRay td{vertical-align: top;line-height:1.45}
  428. table.CodeRay td.line-numbers{text-align:right}
  429. table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
  430. table.CodeRay td.code{padding:0 0 0 .5em}
  431. table.CodeRay td.code>pre{padding:0}
  432. .CodeRay .debug{color:#fff !important;background:#000080 !important}
  433. .CodeRay .annotation{color:#007}
  434. .CodeRay .attribute-name{color:#000080}
  435. .CodeRay .attribute-value{color:#700}
  436. .CodeRay .binary{color:#509}
  437. .CodeRay .comment{color:#998;font-style:italic}
  438. .CodeRay .char{color:#04d}
  439. .CodeRay .char .content{color:#04d}
  440. .CodeRay .char .delimiter{color:#039}
  441. .CodeRay .class{color:#458;font-weight:bold}
  442. .CodeRay .complex{color:#a08}
  443. .CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
  444. .CodeRay .color{color:#099}
  445. .CodeRay .class-variable{color:#369}
  446. .CodeRay .decorator{color:#b0b}
  447. .CodeRay .definition{color:#099}
  448. .CodeRay .delimiter{color:#000}
  449. .CodeRay .doc{color:#970}
  450. .CodeRay .doctype{color:#34b}
  451. .CodeRay .doc-string{color:#d42}
  452. .CodeRay .escape{color:#666}
  453. .CodeRay .entity{color:#800}
  454. .CodeRay .error{color:#808}
  455. .CodeRay .exception{color:inherit}
  456. .CodeRay .filename{color:#099}
  457. .CodeRay .function{color:#900;font-weight:bold}
  458. .CodeRay .global-variable{color:#008080}
  459. .CodeRay .hex{color:#058}
  460. .CodeRay .integer,.CodeRay .float{color:#099}
  461. .CodeRay .include{color:#555}
  462. .CodeRay .inline{color:#000}
  463. .CodeRay .inline .inline{background:#ccc}
  464. .CodeRay .inline .inline .inline{background:#bbb}
  465. .CodeRay .inline .inline-delimiter{color:#d14}
  466. .CodeRay .inline-delimiter{color:#d14}
  467. .CodeRay .important{color:#555;font-weight:bold}
  468. .CodeRay .interpreted{color:#b2b}
  469. .CodeRay .instance-variable{color:#008080}
  470. .CodeRay .label{color:#970}
  471. .CodeRay .local-variable{color:#963}
  472. .CodeRay .octal{color:#40e}
  473. .CodeRay .predefined{color:#369}
  474. .CodeRay .preprocessor{color:#579}
  475. .CodeRay .pseudo-class{color:#555}
  476. .CodeRay .directive{font-weight:bold}
  477. .CodeRay .type{font-weight:bold}
  478. .CodeRay .predefined-type{color:inherit}
  479. .CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
  480. .CodeRay .key{color:#808}
  481. .CodeRay .key .delimiter{color:#606}
  482. .CodeRay .key .char{color:#80f}
  483. .CodeRay .value{color:#088}
  484. .CodeRay .regexp .delimiter{color:#808}
  485. .CodeRay .regexp .content{color:#808}
  486. .CodeRay .regexp .modifier{color:#808}
  487. .CodeRay .regexp .char{color:#d14}
  488. .CodeRay .regexp .function{color:#404;font-weight:bold}
  489. .CodeRay .string{color:#d20}
  490. .CodeRay .string .string .string{background:#ffd0d0}
  491. .CodeRay .string .content{color:#d14}
  492. .CodeRay .string .char{color:#d14}
  493. .CodeRay .string .delimiter{color:#d14}
  494. .CodeRay .shell{color:#d14}
  495. .CodeRay .shell .delimiter{color:#d14}
  496. .CodeRay .symbol{color:#990073}
  497. .CodeRay .symbol .content{color:#a60}
  498. .CodeRay .symbol .delimiter{color:#630}
  499. .CodeRay .tag{color:#008080}
  500. .CodeRay .tag-special{color:#d70}
  501. .CodeRay .variable{color:#036}
  502. .CodeRay .insert{background:#afa}
  503. .CodeRay .delete{background:#faa}
  504. .CodeRay .change{color:#aaf;background:#007}
  505. .CodeRay .head{color:#f8f;background:#505}
  506. .CodeRay .insert .insert{color:#080}
  507. .CodeRay .delete .delete{color:#800}
  508. .CodeRay .change .change{color:#66f}
  509. .CodeRay .head .head{color:#f4f}
  510. </style>
  511. </head>
  512. <body class="article toc2 toc-left">
  513. <div id="header">
  514. <div id="toc" class="toc2">
  515. <div id="toctitle">Table of Contents</div>
  516. <ul class="sectlevel1">
  517. <li><a href="#mmorpg-adventure">MMORPG Adventure</a></li>
  518. <li><a href="#code-name-ancient-monkey-world-amw">CODE NAME : ANCIENT MONKEY WORLD (AMW)</a>
  519. <ul class="sectlevel2">
  520. <li><a href="#quick-start-for-developers">Quick start for Developers</a></li>
  521. <li><a href="#quick-start-for-viewers">Quick start for Viewers</a></li>
  522. <li><a href="#prelude">Prelude</a></li>
  523. </ul>
  524. </li>
  525. <li><a href="#the-adventure-begin">THE ADVENTURE BEGIN</a>
  526. <ul class="sectlevel2">
  527. <li><a href="#the-idea">The idea</a></li>
  528. <li><a href="#mind-map">Mind map</a></li>
  529. <li><a href="#game-design">Game design</a></li>
  530. <li><a href="#mmo-game-architecture-researches">MMO Game Architecture Researches</a></li>
  531. <li><a href="#amw-architecture">AMW Architecture</a></li>
  532. </ul>
  533. </li>
  534. <li><a href="#process">PROCESS</a>
  535. <ul class="sectlevel2">
  536. <li><a href="#phase-zero">Phase Zero</a></li>
  537. <li><a href="#phase-1">Phase 1</a></li>
  538. <li><a href="#phase-2">Phase 2</a></li>
  539. <li><a href="#phase-3">Phase 3</a></li>
  540. </ul>
  541. </li>
  542. </ul>
  543. </div>
  544. </div>
  545. <div id="content">
  546. <div class="sect1">
  547. <h2 id="mmorpg-adventure">MMORPG Adventure</h2>
  548. <div class="sectionbody">
  549. </div>
  550. </div>
  551. <div class="sect1">
  552. <h2 id="code-name-ancient-monkey-world-amw">CODE NAME : ANCIENT MONKEY WORLD (AMW)</h2>
  553. <div class="sectionbody">
  554. <div class="paragraph">
  555. <p><strong>Hi, monkeys</strong></p>
  556. </div>
  557. <div class="paragraph">
  558. <p>After a long project, I have time to sit down a write something about MMORPG and my adventure in making one (if it’s not a forbidden word). :p</p>
  559. </div>
  560. <div class="paragraph">
  561. <p><strong>not easy nor appropriate</strong>+</p>
  562. </div>
  563. <div class="paragraph">
  564. <p>…+</p>
  565. </div>
  566. <div class="paragraph">
  567. <p>…</p>
  568. </div>
  569. <div class="paragraph">
  570. <p>The project will be a community project, that mean Open-source and non-profit, code name :
  571. <strong>Ancient Monkey World.</strong></p>
  572. </div>
  573. <div class="imageblock" style="text-align: right">
  574. <div class="content">
  575. <img src="images/http///digital-art-gallery.com/oid/66/1356x1600_12073_Monkey_King_2d_fantasy_character_monkey_king_picture_image_digital_art.jpg" alt="1356x1600_12073_Monkey_King_2d_fantasy_character_monkey_king_picture_image_digital_art.jpg" height="">
  576. </div>
  577. </div>
  578. <div class="sect2">
  579. <h3 id="quick-start-for-developers">Quick start for Developers</h3>
  580. <div class="ulist">
  581. <ul>
  582. <li>
  583. <p>Forum: <a href="http://hub.jmonkeyengine.org/forum/topic/mmorpg-adventure/">http://hub.jmonkeyengine.org/forum/topic/mmorpg-adventure/</a></p>
  584. </li>
  585. <li>
  586. <p>Wiki: <a href="http://hub.jmonkeyengine.org/wiki/doku.php/jme3:atomixtuts:mmorpg">http://hub.jmonkeyengine.org/wiki/doku.php/jme3:atomixtuts:mmorpg</a> and <a href="http://code.google.com/p/ancient-monkey-world/w/list">http://code.google.com/p/ancient-monkey-world/w/list</a></p>
  587. </li>
  588. <li>
  589. <p>Sourcecode: <a href="http://code.google.com/p/ancient-monkey-world/">http://code.google.com/p/ancient-monkey-world/</a></p>
  590. </li>
  591. <li>
  592. <p>Plan: <a href="http://hub.jmonkeyengine.org/wiki/doku.php/jme3:atomixtuts:mmorpg#process">http://hub.jmonkeyengine.org/wiki/doku.php/jme3:atomixtuts:mmorpg#process</a></p>
  593. </li>
  594. <li>
  595. <p>Issues: <a href="https://code.google.com/p/ancient-monkey-world/issues/list">https://code.google.com/p/ancient-monkey-world/issues/list</a></p>
  596. </li>
  597. <li>
  598. <p>Setup:</p>
  599. </li>
  600. <li>
  601. <p>Tools: <a href="jme3/atomixtuts/mmorpg_tools.html">Tools used</a> <a href="jme3/atomixtuts/mmorpg/researches/toolset.html">Research about toolset</a></p>
  602. </li>
  603. <li>
  604. <p>Game documents:</p>
  605. </li>
  606. <li>
  607. <p>Art &amp; Assets:</p>
  608. </li>
  609. <li>
  610. <p>License: BSD</p>
  611. </li>
  612. </ul>
  613. </div>
  614. </div>
  615. <div class="sect2">
  616. <h3 id="quick-start-for-viewers">Quick start for Viewers</h3>
  617. <div class="ulist">
  618. <ul>
  619. <li>
  620. <p><a href="jme3/atomixtuts/mmorpg/phase0.html#detail">Phase 0 - JME 3D in 2D RPG gameplay</a></p>
  621. </li>
  622. <li>
  623. <p><a href="jme3/atomixtuts/mmorpg/phase1.html#detail">Phase 1 - Physics and network: faster than the bullet</a></p>
  624. </li>
  625. <li>
  626. <p><a href="jme3/atomixtuts/mmorpg/phase2.html#detail">Phase 2 - Quests and Tools</a></p>
  627. </li>
  628. <li>
  629. <p><a href="jme3/atomixtuts/mmorpg/phase3.html#detail">Phase 3 - Deploy to the Cloud and PLAY</a></p>
  630. </li>
  631. </ul>
  632. </div>
  633. </div>
  634. <div class="sect2">
  635. <h3 id="prelude">Prelude</h3>
  636. <div class="paragraph">
  637. <p>I cant count how many times people saying that you can not build a MMORPG with just two hands and a computer… That mean no chance a one man army can even write that kind of game, or it going to be a failure. I’m not a fearless programmer nor a naive kid try to impress. I just think I can!</p>
  638. </div>
  639. <div class="paragraph">
  640. <p>I was from a Database center solution then come to Game industry in a strangest kind of accident :p As I was a pure Java programmer than become a fulltime designer. That’s kind of weird but teach me one thing “You can do extraordinary thing with the right tool”… not mentioned efford, time, knowledge, exprerience and passion…</p>
  641. </div>
  642. <div class="paragraph">
  643. <p>The right tools <strong>weapon</strong> I choose is JMonkeyEngine and other opensources project to start to learn.</p>
  644. </div>
  645. <div class="paragraph">
  646. <p>So did I tell you we can make a MMORPG with just an idea and a few thousand hours of working? Indeed. Here is the story:</p>
  647. </div>
  648. <div class="sect3">
  649. <h4 id="0-your-idea">0) Your idea:</h4>
  650. <div class="paragraph">
  651. <p>Let’s say you have a good idea of a Game… an imagination world that people interact and fight, meet, share… you have a story to tell, and want to draw some impressive scenery or beatiful characters. Spend like a few years for the ideas, may be research and play a lot of games, use papers, talk with friends, travel around the world… Until you have concentrade enough for only one good idea.</p>
  652. </div>
  653. </div>
  654. <div class="sect3">
  655. <h4 id="1-your-skills">1) Your skills:</h4>
  656. <div class="paragraph">
  657. <p>Question: I can draw, can compose music, video, can code, can sing, can write script, can do Java stuff… Is that enough?
  658. Answer: Ummh, NO!
  659. MMORPG is a freaking black-hole of knowledges and experiences requirement. No estimatable amount of knowledge consider enough.
  660. But then I tell you is ENOUGH. At least you can do Java stuff and can draw, you can. The other you will learn when you are on the journey.</p>
  661. </div>
  662. <div class="ulist">
  663. <ul>
  664. <li>
  665. <p>+ Programming: For the start, you need to “know” Java, the more the better. If you just write your first “Hello world” program 3 months ago. You are too hurry for a big challenge. Let make it at least 3 year exprience. I have 13 and consider people with much more expriences still facing problems of course. The years does not matter!</p>
  666. </li>
  667. <li>
  668. <p>+ Assets: May be you should know how to draw and 3d stuff, the more the better. I recommend if you are at least 1 year with 3D modelling and animating, and should play around with tools. First is Concept. Then other things come quick : Sound, Sprite,…</p>
  669. </li>
  670. <li>
  671. <p>+ Researching skill: This is very important if you are a one man army or indie team. You have to do research, brain-storming or ask people every time. So try to be active to get knowledge.</p>
  672. </li>
  673. </ul>
  674. </div>
  675. </div>
  676. <div class="sect3">
  677. <h4 id="2-your-workflow">2) Your workflow:</h4>
  678. <div class="paragraph">
  679. <p>try Extreme programing: <a href="http://en.wikipedia.org/wiki/Extreme_programming">http://en.wikipedia.org/wiki/Extreme_programming</a></p>
  680. </div>
  681. <div class="paragraph">
  682. <p>If you never in a professinal workflow before, try to do it simplier as your only have limited man power. Most valuable advice if you’re an artist do programming: Do it like Zen :p</p>
  683. </div>
  684. <div class="ulist">
  685. <ul>
  686. <li>
  687. <p>- Smart and active: Research first, try to call out for help if need! Opensource are the key.</p>
  688. </li>
  689. <li>
  690. <p>- Flexible but manageable: Try to use SVN.</p>
  691. </li>
  692. <li>
  693. <p>- Shoot with both hands: Do both assets and programming can cause a mesh, do one at a time. After finish review, get approved by yourself or the leader. Continue developing.</p>
  694. </li>
  695. <li>
  696. <p>- Pirate spirit: Use place holder as much as your can. Skip concept, may use existed assets. There are plenty of free assets.</p>
  697. </li>
  698. <li>
  699. <p>- Avoid premature optimization: If still concerning about design, make it work first.</p>
  700. </li>
  701. <li>
  702. <p>… [more to come]</p>
  703. </li>
  704. </ul>
  705. </div>
  706. </div>
  707. <div class="sect3">
  708. <h4 id="3-your-tools">3) Your tools:</h4>
  709. <div class="paragraph">
  710. <p>Of course this is big task, Your tools are various from DDC to Image/sound editor… But let’s name a few with zero cost! (mean open-source or free)</p>
  711. </div>
  712. <div class="ulist">
  713. <ul>
  714. <li>
  715. <p>- JME SDK and its plugins (Programming, database tools… a God-like tool for smart monkey)</p>
  716. </li>
  717. <li>
  718. <p>- GIMP (2d: concept, texture…)</p>
  719. </li>
  720. <li>
  721. <p>- Blender (3d)… and there are a lot of good 3d tools. Blender are the best integrated tool to JME</p>
  722. </li>
  723. <li>
  724. <p>- [Other assets tool like sound editors, sprite… come later]</p>
  725. </li>
  726. </ul>
  727. </div>
  728. </div>
  729. <div class="sect3">
  730. <h4 id="4-your-framework">4) Your framework:</h4>
  731. <div class="paragraph">
  732. <p>This is the most important thing that can make your dream possible. So let me speak a bit slowly:
  733. I spend years for researching in this area (MMORPG), I came across WorldForge, Darkstar,… write my own Network engine and related DB stuff using Hypertable, ORM… (bad mislead time)
  734. <a href="jme3/atomixtuts/mmorpg/researches.html">researches</a>
  735. And finally I found a nice, free but powerful framework: The Threerings project <a href="http://www.threerings.net/code/">http://www.threerings.net/code/</a> 2 year ago.</p>
  736. </div>
  737. <div class="paragraph">
  738. <p>It taken time to research and admit that they do it nicely and scalable (i’m not going to blow it up). If you think you are better than me in reviewing go ahead, i also need valuabe comperations of framework at the moment.</p>
  739. </div>
  740. <div class="paragraph">
  741. <p>So what I tell you that amount of tool are pretty enough for thousand players game. I’m not going to do Three rings advertisment, for short, it’s your chance to build a MMORPG.</p>
  742. </div>
  743. <div class="paragraph">
  744. <p>What you will see at first that the OOO even support 3D stuff, as some of their developer also contribute in JME version2, then write their own engine. It’s quite bad compare to JME at the moment. So maybe you want to use JME3 to do graphics stuff and other tools for Network. Deploying and DB. AI stuff are often quite difficult to write your own but in the end, I will offer you a choice.</p>
  745. </div>
  746. <div class="paragraph">
  747. <p>People may come up with different levels of knowledge and experience. So here and there, they may want to replace an open-source project by their own library. I also write almost every modules of the architure, but for myself I can not provide enough efforts for an opensource project maintaining. I just can keep bad code, release a few good one and write down articles.</p>
  748. </div>
  749. <div class="paragraph">
  750. <p>For people who are exciting of community project as MMORPG, may be this time you can gather up. I’m not guaranty that I’m enough of abitily to make it to the end, but at least we have a working base to start with.</p>
  751. </div>
  752. </div>
  753. </div>
  754. </div>
  755. </div>
  756. <div class="sect1">
  757. <h2 id="the-adventure-begin">THE ADVENTURE BEGIN</h2>
  758. <div class="sectionbody">
  759. <div class="sect2">
  760. <h3 id="the-idea">The idea</h3>
  761. <div class="paragraph">
  762. <p>In Oriental culture, we all love the legend of Monkey king who traveled to the West and become a Buddha.</p>
  763. </div>
  764. <div class="paragraph">
  765. <p><a href="http://en.wikipedia.org/wiki/Sun_Wukong">http://en.wikipedia.org/wiki/Sun_Wukong</a></p>
  766. </div>
  767. <div class="paragraph">
  768. <p><a href="https://www.google.com/search?q=Monkey+King">https://www.google.com/search?q=Monkey+King</a></p>
  769. </div>
  770. <div class="paragraph">
  771. <p>( Songoku in Japanese )</p>
  772. </div>
  773. <div class="paragraph">
  774. <p>I compose the idea with wild jungle scenes in fictional oriental - western mixed scenery and theme, and adventures along the jouney.</p>
  775. </div>
  776. <div class="imageblock" style="text-align: center">
  777. <div class="content">
  778. <img src="images/http///fc09.deviantart.net/fs70/i/2011/004/d/5/monkey_king_by_saryth-d36e92m.jpg" alt="monkey_king_by_saryth-d36e92m.jpg" height="">
  779. </div>
  780. </div>
  781. <div class="paragraph">
  782. <p><a href="jme3/atomixtuts/mmorpg.html">mmorpg</a></p>
  783. </div>
  784. </div>
  785. <div class="sect2">
  786. <h3 id="mind-map">Mind map</h3>
  787. <div class="paragraph">
  788. <p>This is the sketch mindmap of the game.</p>
  789. </div>
  790. </div>
  791. <div class="sect2">
  792. <h3 id="game-design">Game design</h3>
  793. </div>
  794. <div class="sect2">
  795. <h3 id="mmo-game-architecture-researches">MMO Game Architecture Researches</h3>
  796. <div class="sect3">
  797. <h4 id="overal-mmo-game-architecture">Overal MMO Game Architecture</h4>
  798. <div class="paragraph">
  799. <p>In Phase 0 of the development process I intend to use Marauroa and some code from Arriane because the ease of use and clear design!
  800. In <strong>Marauroa</strong> engine they have an excellent short and precise overview MMO game architecture which I will cite below, keep in my the detail implementation like DB or even programming language are optional:</p>
  801. </div>
  802. <div class="paragraph">
  803. <p><em>Marauroa is based on very simple principles:</em></p>
  804. </div>
  805. <div class="ulist">
  806. <ul>
  807. <li>
  808. <p>Clients communicate with the server, and vice-versa, using a TCP portable network protocol with reliability in mind to allow a stabler experience when online game lag occurs.</p>
  809. </li>
  810. <li>
  811. <p>To play a game every player needs an account on the server that is identified by an username and a password.</p>
  812. </li>
  813. <li>
  814. <p>Players use their account to login into the server and then choose a 'player' stored under their account to play with. The server then checks the login information using the MySQL backend and loads the player into the game using the persistence engine.</p>
  815. </li>
  816. <li>
  817. <p>Players send actions to the server. The action system is totally open and has nothing hard-coded so you can edit it totally to your game style. The server sends at regular intervals, called turns, a perception to each player to inform them about the state of the game and any relevant state modifications. Marauroa&#8217;s perception system is based on the Delta^2 ideology: simply send what has changed.</p>
  818. </li>
  819. <li>
  820. <p>The server executes some code each turn in order to move the game status on. Using this hook it is simple to code triggers, timeouts, conditions and whatever kind of behavior you need.</p>
  821. </li>
  822. <li>
  823. <p>The server transparently and automatically stores players and game status modifications on the persistence engine, and also information decided by the game developer using their game definition scripts.</p>
  824. </li>
  825. <li>
  826. <p>Game rules can be coded in Java to allow simple and rapid development and without having to know anything about Marauroa&#8217;s internals. Python scripts for the game rules could be supported with a little work.</p>
  827. </li>
  828. <li>
  829. <p>The server generates statistics of usage which are stored in a MySQL or H2 database (so you can later generate fancy statistics from them). Or in case you don&#8217;t require them, they can be disabled to save CPU cycles and disk space. Marauroa features a modular structure that means modules can be changed and disabled without affecting the operation of other modules.</p>
  830. </li>
  831. <li>
  832. <p>Both the server and clients are fully and wisely documented, with documentation about specification and design and not just <abbr title="Application Programming Interface">API</abbr> documentation.</p>
  833. </li>
  834. </ul>
  835. </div>
  836. <div class="paragraph">
  837. <p>Review the full description here
  838. <a href="http://arianne.sourceforge.net/engine/marauroa.html">http://arianne.sourceforge.net/engine/marauroa.html</a></p>
  839. </div>
  840. <div class="paragraph">
  841. <p>As said, the architecture and the components of a MMORPG game will be kept but part by part will be swaped or replaced as the process go. Why? Because there are better solutions new technologies nowaday. Now let take a look at the three things call the “Triangle of Bedmudas in game design.</p>
  842. </div>
  843. </div>
  844. <div class="sect3">
  845. <h4 id="entity-system">Entity system</h4>
  846. <div class="paragraph">
  847. <p>Yeah, this is not really new. In fact, the Entity system wave was from 2006-2007, as
  848. <a href="http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/">http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/</a>
  849. and almost become a standard solution in MMO world.</p>
  850. </div>
  851. <div class="paragraph">
  852. <p>The idea of Entity System are descripted better with details here:
  853. <a href="jme3/contributions/entitysystem/introduction.html">Entity system Introduction</a></p>
  854. </div>
  855. <div class="paragraph">
  856. <p>So, as you see, JME community already offer 2-3 Entity System solutions. As the guys discuss in the forum, the code base of the ES should be kept rather small and compact because it&#8217;s going to be involve in every game cycle. The first thing should be revolved and change from Marauroa code base is the Entity System intergration which also with be the base of other additons in the future.</p>
  857. </div>
  858. </div>
  859. <div class="sect3">
  860. <h4 id="event-system">Event system</h4>
  861. <div class="paragraph">
  862. <p>What&#8217;s the hurry for a game event system?
  863. Yeah, event system here is not just the event (message) broadcasting. Because game technologies involve more and more parallelism, especially to be corporate with networking, the event system should also be considered again.</p>
  864. </div>
  865. <div class="paragraph">
  866. <p>Event system should encourage decoupeling and give the developer more strength and controls. Also ease of use, ightweight, non blocking, non replicating…etc</p>
  867. </div>
  868. <div class="paragraph">
  869. <p>I&#8217;m not going to the details here but you can read more about it in the researches.</p>
  870. </div>
  871. </div>
  872. <div class="sect3">
  873. <h4 id="network-system">Network system</h4>
  874. <div class="paragraph">
  875. <p>This problem can be considered a challange in design. No one can say it easy or they not write it and test it yet. C</p>
  876. </div>
  877. <div class="paragraph">
  878. <p>orporate with entity, event and networking make a “Death point for every design. For big MMO game (and other kind of massive real time system) in 4-5 years ago, they strugge to make those 3 work together, by trying to reduce the network cost, multi thread the server, and do C++ tricks in memory, pointer…etc . Yeah, we will have to do them same to be optimized …</p>
  879. </div>
  880. <div class="paragraph">
  881. <p><a href="jme3/atomixtuts/mmorpg/researches.html">researches</a></p>
  882. </div>
  883. </div>
  884. <div class="sect3">
  885. <h4 id="the-chosen-one">The chosen one</h4>
  886. <div class="quoteblock">
  887. <blockquote>
  888. <div class="paragraph">
  889. <p>But can we come up with better overal design first?+
  890. Hopefully, yes, this time!</p>
  891. </div>
  892. </blockquote>
  893. </div>
  894. <div class="paragraph">
  895. <p>So the asynchronized server, network and event system are widely use nowadays. The are dozen of open source project intended to solve the enterprise problems at once.</p>
  896. </div>
  897. <div class="literalblock">
  898. <div class="content">
  899. <pre> Node.js is a good example, the idea is simple but the implementation are truely epic. They've done it beautifully and we (java devs) should have the same thing or get used to it in the mean time.
  900. The runner up but in the Java world is the Three rings projects, well done and save developer from the hard parts.</pre>
  901. </div>
  902. </div>
  903. <div class="paragraph">
  904. <p>But till the time of writing, almost no one get it straight into game developing or not into 3D (like Three rings). I considered those general systems can not sastify the needs for <strong>enterprise game developing</strong>! They always try to keep it relatively small because of affair / obsesses it will become un-optimized. But also because of that, they don&#8217;t solve the 3 main problems at once, which lead to the un sastification i mentioned.</p>
  905. </div>
  906. <div class="paragraph">
  907. <p>In the researches you will find an article tell extractly how I use, modify, leverage and optimize Three rings and the existed opensource projects to let them work seamlessly together, without worry about the over engineering!</p>
  908. </div>
  909. </div>
  910. </div>
  911. <div class="sect2">
  912. <h3 id="amw-architecture">AMW Architecture</h3>
  913. </div>
  914. </div>
  915. </div>
  916. <div class="sect1">
  917. <h2 id="process">PROCESS</h2>
  918. <div class="sectionbody">
  919. <div class="sect2">
  920. <h3 id="phase-zero">Phase Zero</h3>
  921. <div class="paragraph">
  922. <p><strong>Start:</strong> July 1st - August 1st</p>
  923. </div>
  924. <div class="paragraph">
  925. <p><strong>Main task:</strong> Setup and Port MORPG engine Arriane from 2D to 3D. Try and review.</p>
  926. </div>
  927. <div class="paragraph">
  928. <p><a href="jme3/atomixtuts/mmorpg/phase0.html">phase0</a></p>
  929. </div>
  930. </div>
  931. <div class="sect2">
  932. <h3 id="phase-1">Phase 1</h3>
  933. <div class="paragraph">
  934. <p><strong>Start:</strong> August 1st - September 1st</p>
  935. </div>
  936. <div class="paragraph">
  937. <p><strong>Main task:</strong> Unknown</p>
  938. </div>
  939. <div class="paragraph">
  940. <p><a href="jme3/atomixtuts/mmorpg/phase1.html">phase1</a></p>
  941. </div>
  942. </div>
  943. <div class="sect2">
  944. <h3 id="phase-2">Phase 2</h3>
  945. <div class="paragraph">
  946. <p><strong>Start:</strong> September 1st - Oct 1st</p>
  947. </div>
  948. <div class="paragraph">
  949. <p><strong>Main task:</strong> Unknown</p>
  950. </div>
  951. <div class="paragraph">
  952. <p><a href="jme3/atomixtuts/mmorpg/phase2.html">phase2</a></p>
  953. </div>
  954. </div>
  955. <div class="sect2">
  956. <h3 id="phase-3">Phase 3</h3>
  957. <div class="paragraph">
  958. <p><strong>Start:</strong> Oct 1st - Nov 1st</p>
  959. </div>
  960. <div class="paragraph">
  961. <p><strong>Main task:</strong> Unknown</p>
  962. </div>
  963. <div class="paragraph">
  964. <p><a href="jme3/atomixtuts/mmorpg/phase3.html">phase3</a></p>
  965. </div>
  966. </div>
  967. </div>
  968. </div>
  969. </div>
  970. <div id="footer">
  971. <div id="footer-text">
  972. Last updated 2016-05-21 23:44:18 UTC
  973. </div>
  974. </div>
  975. </body>
  976. </html>