PageRenderTime 168ms CodeModel.GetById 14ms RepoModel.GetById 2ms app.codeStats 0ms

/lib/game.js

https://bitbucket.org/nehar/ti
JavaScript | 284 lines | 237 code | 36 blank | 11 comment | 52 complexity | a7c8656da135b102c7348786b3b4c840 MD5 | raw file
  1. /*jshint node:true */
  2. module.exports = {
  3. game: function game(map, socket, io) {
  4. "use strict";
  5. socket.newtroops = 10;
  6. //przygotowanie danych mapy
  7. map[socket.room] = {na1: {},na2: {},na3: {},na4: {},na5: {},na6: {},na7: {},na8: {},na9: {},na10: {},sa1: {},sa2: {},sa3: {},sa4: {},af1: {},af2: {},af3: {},af4: {},af5: {},eu1: {},eu2: {},eu3: {},eu4: {},eu5: {},eu6: {},as1: {},as2: {},as3: {},as4: {},as5: {},as6: {},as7: {},as8: {},as9: {},as10: {},as11: {},aus1: {},aus2: {},aus3: {}};
  8. mapIni(map[socket.room]);
  9. //inicjalizajca mapy u klienta
  10. socket.emit('startGame');
  11. //inicjalizacja danych u klienta po pod??czeniu drugiej osoby
  12. if (io.sockets.manager.rooms['/' + socket.room].length === 2) {
  13. map[socket.room] = mapRandom(map[socket.room], io, socket);
  14. for (var i in io.sockets.manager.rooms['/' + socket.room]) {
  15. if (io.sockets.manager.rooms['/' + socket.room][i] === socket.id) {
  16. io.sockets.sockets[io.sockets.manager.rooms['/' + socket.room][i]].emit('startMap', map[socket.room], io.sockets.manager.rooms['/' + socket.room][(i + 1) % 2], socket.newtroops);
  17. io.sockets.sockets[socket.oponent].oponent = socket.id;
  18. }
  19. else {
  20. socket.oponent = io.sockets.manager.rooms['/' + socket.room][i];
  21. io.sockets.sockets[io.sockets.manager.rooms['/' + socket.room][i]].emit('startMap', map[socket.room], io.sockets.manager.rooms['/' + socket.room][(i + 1) % 2], socket.newtroops);
  22. }
  23. }
  24. }
  25. },
  26. socket: function socket(map, socket, io) {
  27. "use strict";
  28. //dodawanie jednostki do pola
  29. socket.on('addTroop', function (area) {
  30. console.log(socket.id + ' ' + map[socket.room][area].owner + ' ' + area);
  31. if (socket.id === map[socket.room][area].owner && socket.newtroops !== 0) {
  32. map[socket.room][area].army.soldier[0] = map[socket.room][area].army.soldier[0] + 1;
  33. socket.newtroops = socket.newtroops - 1;
  34. io.sockets.to(socket.room).emit('updateTroops', area, map[socket.room][area].army.soldier[0]);
  35. socket.emit('troopsLeft', socket.newtroops);
  36. if (socket.newtroops === 0 && io.sockets.sockets[socket.oponent].newtroops === 0) {
  37. socket.stopinterval = 0;
  38. io.sockets.to(socket.room).emit('endTroops');
  39. io.sockets.to(socket.room).emit('updateChat', 'SERVER', 'Start Game');
  40. }
  41. }
  42. });
  43. //generowanie ilo?ci bonusowych wojsk
  44. socket.on('bonus', function () {
  45. var newtroops = setInterval(bonusTroops, 7000);
  46. function bonusTroops() {
  47. if (socket.stopinterval === 1) {
  48. clearInterval(newtroops);
  49. return 0;
  50. }
  51. var key, bonus = 0,
  52. na = 0,
  53. sa = 0,
  54. eu = 0,
  55. af = 0,
  56. aus = 0,
  57. as = 0;
  58. for (key in map[socket.room]) {
  59. if (map[socket.room][key].owner === socket.id) {
  60. if (key.match(/na/)) {
  61. na = na + 1;
  62. }
  63. else if (key.match(/sa/)) {
  64. sa = sa + 1;
  65. }
  66. else if (key.match(/eu/)) {
  67. eu = eu + 1;
  68. }
  69. else if (key.match(/af/)) {
  70. af = af + 1;
  71. }
  72. else if (key.match(/aus/)) {
  73. aus = aus + 1;
  74. }
  75. else if (key.match(/as/)) {
  76. as = as + 1;
  77. }
  78. }
  79. }
  80. if (na === 10) {
  81. bonus = bonus + 6;
  82. }
  83. if (sa === 4) {
  84. bonus = bonus + 2;
  85. }
  86. if (eu === 6) {
  87. bonus = bonus + 4;
  88. }
  89. if (af === 5) {
  90. bonus = bonus + 3;
  91. }
  92. if (as === 11) {
  93. bonus = bonus + 7;
  94. }
  95. if (aus === 3) {
  96. bonus = bonus + 1;
  97. }
  98. socket.newtroops = socket.newtroops + bonus + 1;
  99. socket.emit('bonusTroops', socket.newtroops);
  100. }
  101. });
  102. //atakowanie
  103. socket.on('attack', function (from, to, number) {
  104. number = parseInt(number, 10);
  105. if (!isNaN(number) && socket.id === map[socket.room][from].owner && socket.oponent === map[socket.room][to].owner) {
  106. if (map[socket.room][from].army.soldier[0] < number) {
  107. number = map[socket.room][from].army.soldier[0];
  108. }
  109. var attack = setInterval(function () {
  110. attackMove();
  111. }, 3000);
  112. }
  113. function attackMove() {
  114. if (number === 0) {
  115. clearInterval(attack);
  116. }
  117. else if (map[socket.room][to].army.soldier[0] === 0) {
  118. clearInterval(attack);
  119. map[socket.room][to].owner = socket.id;
  120. map[socket.room][to].army.soldier[0] = number;
  121. map[socket.room][from].army.soldier[0] = map[socket.room][from].army.soldier[0] - number;
  122. io.sockets.to(socket.room).emit('updateOwner', to, map[socket.room][to].owner);
  123. io.sockets.to(socket.room).emit('updateTroops', from, map[socket.room][from].army.soldier[0]);
  124. io.sockets.to(socket.room).emit('updateTroops', to, map[socket.room][to].army.soldier[0]);
  125. if (winCheck(map, socket) === 1) {
  126. io.sockets.to(socket.room).emit('winGame', socket.username);
  127. socket.emit('backToLobby');
  128. }
  129. }
  130. else {
  131. if (Math.floor((Math.random() * 1000) + 1) < 600) {
  132. map[socket.room][from].army.soldier[0] = map[socket.room][from].army.soldier[0] - 1;
  133. number = number - 1;
  134. io.sockets.to(socket.room).emit('updateTroops', from, map[socket.room][from].army.soldier[0]);
  135. }
  136. else {
  137. map[socket.room][to].army.soldier[0] = map[socket.room][to].army.soldier[0] - 1;
  138. io.sockets.to(socket.room).emit('updateTroops', to, map[socket.room][to].army.soldier[0]);
  139. }
  140. }
  141. }
  142. });
  143. //przemieszczanie jednostek
  144. socket.on('move', function (from, to, number) {
  145. number = parseInt(number, 10);
  146. if (!isNaN(number) && socket.id === map[socket.room][from].owner && socket.id === map[socket.room][to].owner) {
  147. if (map[socket.room][from].army.soldier[0] < number) {
  148. number = map[socket.room][from].army.soldier[0];
  149. }
  150. map[socket.room][from].army.soldier[0] = map[socket.room][from].army.soldier[0] - number;
  151. io.sockets.to(socket.room).emit('updateTroops', from, map[socket.room][from].army.soldier[0]);
  152. socket.emit('moveTimer');
  153. setTimeout(fn, 3000);
  154. }
  155. function fn() {
  156. if (map[socket.room][to].owner === socket.id) {
  157. map[socket.room][to].army.soldier[0] = map[socket.room][to].army.soldier[0] + parseInt(number, 10);
  158. io.sockets.to(socket.room).emit('updateTroops', to, map[socket.room][to].army.soldier[0]);
  159. }
  160. else if (map[socket.room][from].owner === socket.id) {
  161. map[socket.room][from].army.soldier[0] = map[socket.room][from].army.soldier[0] + parseInt(number, 10);
  162. io.sockets.to(socket.room).emit('updateTroops', from, map[socket.room][from].army.soldier[0]);
  163. }
  164. }
  165. });
  166. }
  167. };
  168. //sprawdzenie czy wygra?
  169. function winCheck(map, socket) {
  170. "use strict";
  171. for (var key in map[socket.room]) {
  172. if (map[socket.room][key].owner !== socket.id) {
  173. return 0;
  174. }
  175. }
  176. return 1;
  177. }
  178. //podstawowe dane mapy
  179. function mapIni(map) {
  180. "use strict";
  181. for (var key in map) {
  182. map[key] = {
  183. owner: null,
  184. army: {
  185. soldier: [0, 0]
  186. },
  187. buildings: {
  188. wall: 0
  189. },
  190. connections: []
  191. };
  192. }
  193. map.na1.connections = ["na2", "na4", "as9"];
  194. map.na2.connections = ["na1", "na3", "na4", "na5"];
  195. map.na3.connections = ["na2", "na5", "na7", "na6"];
  196. map.na4.connections = ["na1", "na2", "na5", "na8"];
  197. map.na5.connections = ["na4", "na2", "na3", "na7", "na8", "na10"];
  198. map.na6.connections = ["na3", "na7", "eu1", "eu3"];
  199. map.na7.connections = ["na3", "na6", "na5", "na10"];
  200. map.na8.connections = ["na5", "na4", "na10", "na9"];
  201. map.na9.connections = ["na8", "na10", "sa1"];
  202. map.na10.connections = ["na8", "na5", "na7", "na9"];
  203. map.sa1.connections = ["na9", "sa2", "sa4"];
  204. map.sa2.connections = ["sa1", "sa3", "sa4"];
  205. map.sa3.connections = ["sa2", "sa4"];
  206. map.sa4.connections = ["sa1", "sa2", "sa3", "af1"];
  207. map.af1.connections = ["sa4", "eu2", "af2", "af5", "af3"];
  208. map.af2.connections = ["af1", "af5", "as1"];
  209. map.af3.connections = ["af1", "af5", "af4"];
  210. map.af4.connections = ["af3", "af5"];
  211. map.af5.connections = ["af1", "af2", "af3", "af4"];
  212. map.eu1.connections = ["eu2", "eu3", "eu4", "na6"];
  213. map.eu2.connections = ["eu1", "eu4", "eu6", "af1"];
  214. map.eu3.connections = ["eu1", "eu4", "eu5", "na6"];
  215. map.eu4.connections = ["eu1", "eu2", "eu3", "eu6", "eu5"];
  216. map.eu5.connections = ["eu3", "eu4", "eu6", "as3", "as2", "as1"];
  217. map.eu6.connections = ["eu2", "eu4", "eu5", "as1"];
  218. map.as1.connections = ["eu6", "eu5", "as2", "as10", "af2"];
  219. map.as2.connections = ["as1", "as10", "as4", "as3", "eu5"];
  220. map.as3.connections = ["as2", "as5", "as4", "eu5"];
  221. map.as4.connections = ["as2", "as3", "as5", "as8", "as10", "as11"];
  222. map.as5.connections = ["as3", "as4", "as6", "as7", "as8"];
  223. map.as6.connections = ["as5", "as7", "as9"];
  224. map.as7.connections = ["as5", "as6", "as8", "as9"];
  225. map.as8.connections = ["as5", "as7", "as9", "as4"];
  226. map.as9.connections = ["as6", "as7", "as8"];
  227. map.as10.connections = ["as1", "as2", "as4", "as11"];
  228. map.as11.connections = ["as10", "as4", "aus1"];
  229. map.aus1.connections = ["aus2", "aus3", "as11"];
  230. map.aus2.connections = ["aus1", "aus3"];
  231. map.aus3.connections = ["aus1", "aus2"];
  232. }
  233. //losowanie pól
  234. function mapRandom(map, io, socket) {
  235. "use strict";
  236. var random = ['na1', 'na2', 'na3', 'na4', 'na5', 'na6', 'na7', 'na8', 'na9', 'na10', 'sa1', 'sa2', 'sa3', 'sa4', 'af1', 'af2', 'af3', 'af4', 'af5', 'eu1', 'eu2', 'eu3', 'eu4', 'eu5', 'eu6', 'as1', 'as2', 'as3', 'as4', 'as5', 'as6', 'as7', 'as8', 'as9', 'as10', 'as11', 'aus1', 'aus2', 'aus3'];
  237. for (var i = 0; i < 39; i = i + 1) {
  238. var rand = Math.floor(Math.random() * random.length);
  239. if (i % 2 === 0) {
  240. map[random[rand]].owner = io.sockets.sockets[io.sockets.manager.rooms['/' + socket.room][0]].id;
  241. }
  242. else {
  243. map[random[rand]].owner = io.sockets.sockets[io.sockets.manager.rooms['/' + socket.room][1]].id;
  244. }
  245. random.splice(rand, 1);
  246. }
  247. return map;
  248. }