PageRenderTime 41ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/Soutenance_finale/Structure/Parser/General.cs

http://xe8tmw7c.googlecode.com/
C# | 313 lines | 218 code | 29 blank | 66 comment | 140 complexity | 4b6abddda83a5d4df6a6d5ccef029fd2 MD5 | raw file
Possible License(s): GPL-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. namespace Kore.Parser
  6. {
  7. public static class General
  8. {
  9. #region Méthodes de parsage générales
  10. /// <summary>
  11. /// Transforme une chaine de caractčre en
  12. /// </summary>
  13. /// <param name="chaine">Ch</param>
  14. /// <returns></returns>
  15. public static System.Drawing.Point parsePoint(string chaine)
  16. {
  17. int posVirg = chaine.IndexOf(',');
  18. if (posVirg >= 0)
  19. return new System.Drawing.Point(Convert.ToInt32(chaine.Substring(0, posVirg)), Convert.ToInt32(chaine.Substring(posVirg + 1)));
  20. else
  21. return System.Drawing.Point.Empty;
  22. }
  23. /// <summary>
  24. /// Transforme un point en chaîne de caractčre
  25. /// </summary>
  26. /// <param name="pt"></param>
  27. /// <returns></returns>
  28. public static string unparsePoint(System.Drawing.Point pt)
  29. {
  30. return pt.X + "," + pt.Y;
  31. }
  32. #endregion
  33. #region Méthodes de parsage des cartes
  34. /// <summary>
  35. /// Retourne le type de case correspondant au caractčre
  36. /// </summary>
  37. public static Structures.CaseType getType(char contenu)
  38. {
  39. if (contenu == 'F' || contenu == 'T' || contenu == 'b' || contenu == 'f' || contenu == 'g' || contenu == 's' || contenu == 'n')
  40. return new Structures.CaseType(Structures.MapSettings.Floor);
  41. else if (contenu == 'U')
  42. return new Structures.CaseType(Structures.MapSettings.Floor, Structures.MapSlots.Unbuildable);
  43. else if (contenu == 'W')
  44. return new Structures.CaseType(Structures.MapSettings.Wall);
  45. else if (contenu == 'E')
  46. return new Structures.CaseType(Structures.MapSettings.Enter);
  47. else if (contenu == 'S')
  48. return new Structures.CaseType(Structures.MapSettings.Exit);
  49. else
  50. return new Structures.CaseType(Structures.MapSettings.Void);
  51. }
  52. /// <summary>
  53. /// Retourne le caractčre correspondant au type de case (surcharge : prise en compte des tours)
  54. /// </summary>
  55. public static char getChar(Structures.CaseType contenu)
  56. {
  57. if (contenu.Background == Structures.MapSettings.Floor && contenu.Forground == Structures.MapSlots.Unbuildable)
  58. return 'U';
  59. else if (contenu.Background == Structures.MapSettings.Floor)
  60. return 'F';
  61. else if (contenu.Background == Structures.MapSettings.Wall)
  62. return 'W';
  63. else if (contenu.Background == Structures.MapSettings.Enter)
  64. return 'E';
  65. else if (contenu.Background == Structures.MapSettings.Exit)
  66. return 'S';
  67. else
  68. return '.';
  69. }
  70. public static char getChar(Structures.CaseType contenu, Structures.Tower tour)
  71. {
  72. char tw = General.getTowerChar(tour.Specs.Type);
  73. if (tw == '\0')
  74. return General.getChar(contenu);
  75. else
  76. return tw;
  77. }
  78. #endregion
  79. #region Méthodes de parsage des monstres
  80. /// <summary>
  81. /// Transforme une chaîne de caractčres en une liste chaînée de monstres
  82. /// </summary>
  83. /// <param name="list">Chaîne représentant des monstres</param>
  84. /// <returns>Liste chaînée de monstres</returns>
  85. public static LinkedList<Kore.Structures.Monster> parseMonstersList(string list)
  86. {
  87. if (list != "")
  88. {
  89. LinkedList<Kore.Structures.Monster> monsters = new LinkedList<Kore.Structures.Monster>();
  90. int fpos = 0, pos = 0;
  91. while ((pos = list.IndexOf('\n', pos + 1)) != -1)
  92. {
  93. monsters.AddLast(parseMonster(list.Substring(fpos, pos - fpos)));
  94. fpos = pos;
  95. }
  96. return monsters;
  97. }
  98. else
  99. return null;
  100. }
  101. /// <summary>
  102. /// Transforme une liste chaînée de monstres en chaîne de caractčres
  103. /// </summary>
  104. /// <param name="list">Liste chaînée de monstres</param>
  105. /// <returns>Chaîne représentant les monstres</returns>
  106. public static string unparseMonstersList(LinkedList<Kore.Structures.Monster> list)
  107. {
  108. string sortie = "";
  109. LinkedListNode<Kore.Structures.Monster> lln = list.First;
  110. while (lln != null)
  111. {
  112. sortie += unparseMonster(lln.Value) + '\n';
  113. lln = lln.Next;
  114. }
  115. return sortie;
  116. }
  117. /// <summary>
  118. /// Transforme une chaîne de caractčres en monstre
  119. /// </summary>
  120. /// <param name="chaine">Chaîne représentant un monstre</param>
  121. /// <returns>Monstres</returns>
  122. public static Kore.Structures.Monster parseMonster(string chaine)
  123. {
  124. Regex msntre = new Regex("([a-zA-Z0-9])([0-9]+,[0-9]+);([0-9]{1});([0-9]{1,2})");
  125. GroupCollection cc = msntre.Match(chaine).Groups;
  126. if (cc != null)
  127. return new Kore.Structures.Monster(getMonsterType(cc[1].Value[0]), parsePoint(cc[2].Value), Convert.ToByte(cc[3].Value), Convert.ToInt32(cc[4].Value), 1f);
  128. else
  129. return null;
  130. }
  131. /// <summary>
  132. /// Transforme un monstre en chaîne de caractčres
  133. /// </summary>
  134. /// <param name="mnstre">Monstres</param>
  135. /// <returns>Chaîne représentant le monstre</returns>
  136. public static string unparseMonster(Kore.Structures.Monster mnstre)
  137. {
  138. return getMonsterChar(mnstre.Specs.Type) + unparsePoint(mnstre.LastTarget) + ";" + mnstre.Direction + ";" + mnstre.Specs.Level;
  139. }
  140. /// <summary>
  141. /// Retourne le type de monstre correspondant au caractčre passé en argument
  142. /// </summary>
  143. /// <param name="contenu">Caractčre ŕ interpręter</param>
  144. /// <returns>Type de monstre correspondant</returns>
  145. public static Kore.Structures.MonsterType getMonsterType(char contenu)
  146. {
  147. if (contenu == 'b')
  148. return Structures.MonsterType.Bandit;
  149. else if (contenu == 'f')
  150. return Structures.MonsterType.Flying;
  151. else if (contenu == 'g')
  152. return Structures.MonsterType.Ghost;
  153. else if (contenu == 'k')
  154. return Structures.MonsterType.Kask;
  155. else if (contenu == 'u')
  156. return Structures.MonsterType.Kornu;
  157. else
  158. return Structures.MonsterType.Normal;
  159. }
  160. /// <summary>
  161. /// Retourne le caractčre correspondant au type de monstre passé en argument
  162. /// </summary>
  163. /// <param name="contenu">Type du monstre</param>
  164. /// <returns>Caractčre correspondant</returns>
  165. public static char getMonsterChar(Kore.Structures.MonsterType contenu)
  166. {
  167. if (contenu == Structures.MonsterType.Bandit)
  168. return 'b';
  169. else if (contenu == Structures.MonsterType.Flying)
  170. return 'f';
  171. else if (contenu == Structures.MonsterType.Ghost)
  172. return 'g';
  173. else if (contenu == Structures.MonsterType.Kask)
  174. return 'k';
  175. else if (contenu == Structures.MonsterType.Kornu)
  176. return 'u';
  177. else
  178. return 'n';
  179. }
  180. #endregion
  181. #region Méthodes de parsage des tours
  182. /// <summary>
  183. /// Transforme une chaîne de caractčres en une liste chaînée de monstres
  184. /// </summary>
  185. /// <param name="list">Chaîne représentant des monstres</param>
  186. /// <returns>Liste chaînée de monstres</returns>
  187. public static LinkedList<Kore.Structures.Tower> parseTowersList(string list)
  188. {
  189. LinkedList<Kore.Structures.Tower> towers = new LinkedList<Kore.Structures.Tower>();
  190. int fpos = 0, pos = 0;
  191. if (list != "")
  192. while ((pos = list.IndexOf('\n', pos + 1)) != -1)
  193. {
  194. towers.AddLast(parseTower(list.Substring(fpos, pos - fpos)));
  195. fpos = pos;
  196. }
  197. return towers;
  198. }
  199. /// <summary>
  200. /// Transforme une liste chaînée de monstres en chaîne de caractčres
  201. /// </summary>
  202. /// <param name="list">Liste chaînée de monstres</param>
  203. /// <returns>Chaîne représentant les monstres</returns>
  204. public static string unparseTowersList(LinkedList<Kore.Structures.Tower> list)
  205. {
  206. string sortie = "";
  207. LinkedListNode<Kore.Structures.Tower> lln = list.First;
  208. while (lln != null)
  209. {
  210. sortie += unparseTower(lln.Value) + '\n';
  211. lln = lln.Next;
  212. }
  213. return sortie;
  214. }
  215. /// <summary>
  216. /// Transforme une chaîne de caractčres en tour
  217. /// </summary>
  218. /// <param name="chaine">Chaîne représentant une tour</param>
  219. /// <returns>Tour</returns>
  220. public static Kore.Structures.Tower parseTower(string chaine)
  221. {
  222. Regex msntre = new Regex("([a-zA-Z0-9])([0-9]+,[0-9]+);([0-9]{1,2})");
  223. GroupCollection cc = msntre.Match(chaine).Groups;
  224. if (cc != null)
  225. return new Kore.Structures.Tower(getTowerType(cc[1].Value[0]), parsePoint(cc[2].Value), Convert.ToInt32(cc[3].Value));
  226. else
  227. return null;
  228. }
  229. /// <summary>
  230. /// Transforme un monstre en chaîne de caractčres
  231. /// </summary>
  232. /// <param name="mnstre">Monstres</param>
  233. /// <returns>Chaîne représentant le monstre</returns>
  234. public static string unparseTower(Kore.Structures.Tower tower)
  235. {
  236. return getTowerChar(tower.Specs.Type) + unparsePoint(tower.Position) + ";" + tower.Specs.Level;
  237. }
  238. public static char getTowerChar(Structures.TowerType tour)
  239. {
  240. if (tour == Structures.TowerType.Null)
  241. return '\0';
  242. else if (tour == Structures.TowerType.Bumper)
  243. return 'b';
  244. else if (tour == Structures.TowerType.Faster)
  245. return 'f';
  246. else if (tour == Structures.TowerType.Glu)
  247. return 'c';
  248. else if (tour == Structures.TowerType.Poison)
  249. return 'p';
  250. else if (tour == Structures.TowerType.Power)
  251. return 'o';
  252. else if (tour == Structures.TowerType.Normal)
  253. return 'n';
  254. else if (tour == Structures.TowerType.Stronger)
  255. return 's';
  256. else if (tour == Structures.TowerType.Ghost)
  257. return 'h';
  258. else
  259. return 'T';
  260. }
  261. public static Structures.TowerType getTowerType(char tour)
  262. {
  263. if (tour == 'b')
  264. return Structures.TowerType.Bumper;
  265. else if (tour == 'f')
  266. return Structures.TowerType.Faster;
  267. else if (tour == 'c')
  268. return Structures.TowerType.Glu;
  269. else if (tour == 'p')
  270. return Structures.TowerType.Poison;
  271. else if (tour == 'o')
  272. return Structures.TowerType.Power;
  273. else if (tour == 'n' || tour == 'T')
  274. return Structures.TowerType.Normal;
  275. else if (tour == 's')
  276. return Structures.TowerType.Stronger;
  277. else if (tour == 'h')
  278. return Structures.TowerType.Ghost;
  279. else
  280. return Structures.TowerType.Null;
  281. }
  282. #endregion
  283. }
  284. }