ShipGenerator.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. using GadgetCore.API;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Reflection;
  5. using UnityEngine;
  6. namespace Ships
  7. {
  8. internal enum ShipGeneratorObjectPoolType
  9. {
  10. SmallObject = 0,
  11. LargeObject = 1,
  12. FlyingEnemy = 2,
  13. BrokenItemMod = 3,
  14. BrokenChest = 4,
  15. OldChest = 5
  16. }
  17. public class ShipGenerator
  18. {
  19. private static readonly FieldInfo chunksField = typeof(SpawnerScript).GetField("chunks", BindingFlags.NonPublic | BindingFlags.Instance);
  20. private static readonly Material materialaBackLight = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("parallax.png") };
  21. private static readonly Material materialaParalex0 = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bg0.png") };
  22. private static readonly Material materialaParalex1 = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bg1.png") };
  23. private static readonly Material materialaParalex2 = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bg2.png") };
  24. private static readonly Material materialaParalex3 = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bg3.png") };
  25. private static readonly Material materialaParalexStars = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bgStars.png") };
  26. private static readonly Material materialaParalexNone = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = GadgetCoreAPI.LoadTexture2D("bgNone.png") };
  27. public static readonly FieldInfo networkStuffField = typeof(Chunk).GetField("networkStuff", BindingFlags.NonPublic | BindingFlags.Instance);
  28. public static readonly FieldInfo tempField = typeof(Chunk).GetField("temp", BindingFlags.NonPublic | BindingFlags.Instance);
  29. public static void Genarate(SpawnerScript s, int[] param)
  30. {
  31. try
  32. {
  33. GameScript.isTown = false;
  34. if (GameScript.districtLevel % 2 != 0)
  35. {
  36. GameScript.districtLevel++;
  37. }
  38. spawnLocations.Clear();
  39. s.backLights.SetActive(true);
  40. s.mainLight.SetActive(false);
  41. s.backLights.GetComponent<Renderer>().material = materialaBackLight;
  42. //s.mainLight.GetComponentInChildren<Light>().color = new Color(0.05f, 0.05f, 0.05f, 0.1f);
  43. s.bg[0].GetComponent<Renderer>().material = materialaParalexStars;
  44. s.bg[1].GetComponent<Renderer>().material = materialaParalexNone;
  45. s.bg[2].GetComponent<Renderer>().material = materialaParalexNone;
  46. s.bg[3].GetComponent<Renderer>().material = materialaParalexNone;
  47. var chunks = (GameObject[])chunksField.GetValue(s);
  48. var num = 0;
  49. chunks[num] = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/Ships/ShipAEntrance"), new Vector3((float)(218 + 0 * 128), 0f, 5f), Quaternion.Euler(0f, 180f, 180f));
  50. num++;
  51. chunks[num] = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/Ships/ShipAMain"), new Vector3((float)(218 + 0.75 * 128), 0f, 5f), Quaternion.Euler(0f, 180f, 180f));
  52. num++;
  53. spawnLocations.Add(new int[] { 7, 7, 2 });
  54. spawnLocations.Add(new int[] { 10, 7, 2 });
  55. spawnLocations.Add(new int[] { 16, 7, 2 });
  56. spawnLocations.Add(new int[] { 17, 4, 2 });
  57. Add4(4, 0);
  58. Add4(4, 5);
  59. Add4Floor(4, -5);
  60. Add4(10, 0);
  61. Add4(10, 5);
  62. Add4Floor(10, -5);
  63. Add4(20, 0);
  64. Add4(20, 5);
  65. Add4Floor(20, -5);
  66. Add4(26, 0);
  67. Add4(26, 5);
  68. Add4Floor(26, -5);
  69. chunks[num] = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/Ships/ShipAMain"), new Vector3((float)(218 + 1.75 * 128), 0f, 5f), Quaternion.Euler(0f, 180f, 180f));
  70. num++;
  71. spawnLocations.Add(new int[] { 7 + 32, 7, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  72. spawnLocations.Add(new int[] { 10 + 32, 7, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  73. spawnLocations.Add(new int[] { 16 + 32, 7, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  74. spawnLocations.Add(new int[] { 17 + 32, 4, (int)ShipGeneratorObjectPoolType.FlyingEnemy });
  75. Add4(4 + 32, 0);
  76. Add4(4 + 32, 5);
  77. Add4Floor(4 + 32, -5);
  78. Add4(10 + 32, 0);
  79. Add4(10 + 32, 5);
  80. Add4Floor(10 + 32, -5);
  81. Add4(20 + 32, 0);
  82. Add4(20 + 32, 5);
  83. Add4Floor(20 + 32, -5);
  84. Add4(26 + 32, 0);
  85. Add4(26 + 32, 5);
  86. Add4Floor(26 + 32, -5);
  87. chunks[num] = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/Ships/ShipAExit"), new Vector3((float)(218 + 2.5 * 128), 0f, 5f), Quaternion.Euler(0f, 180f, 180f));
  88. num++;
  89. if (Network.isServer)
  90. {
  91. chunks[num] = new GameObject("chunk");
  92. var chunk = chunks[num].AddComponent<Chunk>();
  93. PopulateTown(chunk);
  94. num++;
  95. }
  96. }
  97. catch (System.Exception e) { Core.logger.LogConsole(e); }
  98. }
  99. private static void Add4(int x, int y)
  100. {
  101. var r = random.Next(8);
  102. switch (r)
  103. {
  104. case 0:
  105. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  106. break;
  107. case 1:
  108. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  109. break;
  110. case 2:
  111. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  112. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  113. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  114. break;
  115. case 3:
  116. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  117. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  118. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  119. break;
  120. case 4:
  121. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  122. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  123. break;
  124. case 5:
  125. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  126. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  127. break;
  128. case 6:
  129. if (random.Next(2) == 0)
  130. {
  131. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.BrokenItemMod });
  132. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.BrokenChest });
  133. }
  134. else
  135. {
  136. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.BrokenChest });
  137. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.BrokenItemMod });
  138. }
  139. break;
  140. case 7:
  141. if (random.Next(2) == 0)
  142. {
  143. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  144. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.OldChest });
  145. }
  146. else
  147. {
  148. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.OldChest });
  149. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.SmallObject });
  150. }
  151. break;
  152. }
  153. }
  154. private static void Add4Floor(int x, int y)
  155. {
  156. if (random.Next(2) == 0)
  157. Add4(x, y);
  158. else
  159. {
  160. var r = random.Next(5);
  161. switch (r)
  162. {
  163. case 0:
  164. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  165. break;
  166. case 1:
  167. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  168. break;
  169. case 2:
  170. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  171. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  172. break;
  173. case 3:
  174. spawnLocations.Add(new int[] { x + 1, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  175. spawnLocations.Add(new int[] { x + 3, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  176. break;
  177. case 4:
  178. spawnLocations.Add(new int[] { x + 0, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  179. spawnLocations.Add(new int[] { x + 2, y, (int)ShipGeneratorObjectPoolType.LargeObject });
  180. break;
  181. }
  182. }
  183. }
  184. private static List<int[]> spawnLocations = new List<int[]>();
  185. private static System.Random random = new System.Random();
  186. public static void PopulateTown(Chunk chunk)
  187. {
  188. var networkStuff = new GameObject[400];
  189. networkStuffField.SetValue(chunk, networkStuff);
  190. try
  191. {
  192. int temp = (int)tempField.GetValue(chunk);
  193. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenTeleporter"), new Vector3(248f - 4 * 1, -4f + 0.118f, 0.3f), Quaternion.identity, 0);
  194. temp++;
  195. foreach (var e in spawnLocations)
  196. {
  197. switch ((ShipGeneratorObjectPoolType)e[2])
  198. {
  199. case ShipGeneratorObjectPoolType.SmallObject:
  200. if (random.Next(30) == 0)
  201. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenItemMod"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  202. else if (random.Next(4) == 0)
  203. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenCrates1"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  204. else if (random.Next(3) == 0)
  205. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenCrates2"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  206. else if (random.Next(2) == 0)
  207. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenCrates3"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  208. else
  209. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenCrates4"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  210. break;
  211. case ShipGeneratorObjectPoolType.LargeObject:
  212. if (random.Next(6) == 0)
  213. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate1"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  214. else if (random.Next(5) == 0)
  215. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate2"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  216. else if (random.Next(4) == 0)
  217. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate3"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  218. else if (random.Next(3) == 0)
  219. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate4"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  220. else if (random.Next(2) == 0)
  221. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate5"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  222. else
  223. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenPirate6"), new Vector3(248f + 4 * e[0], -5.75f + 0.118f + 4 * e[1], 0.2f), Quaternion.identity, 0);
  224. break;
  225. case ShipGeneratorObjectPoolType.FlyingEnemy:
  226. Network.Instantiate(Resources.Load("e/Ships/BrokenSliver"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 1.1f + 4 * e[1], 0f), Quaternion.identity, 0);
  227. Network.Instantiate(Resources.Load("e/Ships/BrokenDroid"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 1.1f + 4 * e[1], 0f), Quaternion.identity, 0);
  228. break;
  229. case ShipGeneratorObjectPoolType.BrokenItemMod:
  230. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenItemMod"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  231. break;
  232. case ShipGeneratorObjectPoolType.BrokenChest:
  233. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/BrokenChest"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  234. break;
  235. case ShipGeneratorObjectPoolType.OldChest:
  236. networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("obj/Ships/OldChest"), new Vector3(248f + 4 * e[0], -8f + 0.118f * 4 + 4 * e[1], 0.2f), Quaternion.identity, 0);
  237. break;
  238. }
  239. if (networkStuff[temp] != null)
  240. temp++;
  241. }
  242. }
  243. catch (Exception e) { Core.logger.LogError(e); }
  244. GameScript.endPortal[3] = (GameObject)Network.Instantiate((GameObject)Resources.Load("portal"), new Vector3(248f + 4 * 38 + 128, -6.118f, 0f), Quaternion.identity, 0);
  245. GameScript.endPortalUA[3] = GameScript.endPortal[3].transform.GetChild(0).gameObject;
  246. GameScript.endPortal[3].GetComponent<NetworkView>().RPC("Activate", RPCMode.All, new object[0]);
  247. GameScript.endPortalUA[3].GetComponent<NetworkView>().RPC("Set", RPCMode.AllBuffered, new object[] { 0, 0, 0 });
  248. }
  249. }
  250. }