ManageAI.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. // Learn cc.Class:
  2. // - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/class.html
  3. // - [English] http://www.cocos2d-x.org/docs/creator/en/scripting/class.html
  4. // Learn Attribute:
  5. // - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/reference/attributes.html
  6. // - [English] http://www.cocos2d-x.org/docs/creator/en/scripting/reference/attributes.html
  7. // Learn life-cycle callbacks:
  8. // - [Chinese] http://docs.cocos.com/creator/manual/zh/scripting/life-cycle-callbacks.html
  9. // - [English] http://www.cocos2d-x.org/docs/creator/en/scripting/life-cycle-callbacks.html
  10. var reGameStates = require('GameStates');
  11. cc.Class({
  12. extends: cc.Component,
  13. properties: {
  14. spawnStartTiledTile1: {
  15. default: new cc.Vec2(),
  16. serializable: true,
  17. tooltip: '生成AI的第一条线起始点!',
  18. },
  19. spawnEndTiledTile1: {
  20. default: new cc.Vec2(),
  21. serializable: true,
  22. tooltip: 'AI消失第一条线的终点!',
  23. },
  24. spawnStartTiledTile2: {
  25. default: new cc.Vec2(),
  26. serializable: true,
  27. tooltip: '生成AI的第二条线的起点!',
  28. },
  29. spawnEndTiledTile2: {
  30. default: new cc.Vec2(),
  31. serializable: true,
  32. tooltip: 'AI消失第二条线的终点!',
  33. },
  34. spawnAiNum:
  35. {
  36. default: 1,
  37. type: cc.Integer,
  38. serializable: true,
  39. tooltip: '生成的游客数量',
  40. },
  41. spawnAiInterval:
  42. {
  43. default: 1.0,
  44. type: cc.Float,
  45. serializable: true,
  46. tooltip: '生成游客的间隔',
  47. },
  48. spawnAiSpeed:
  49. {
  50. default: 0,
  51. type: cc.Integer,
  52. serializable: true,
  53. tooltip: '游客附加的速度',
  54. },
  55. spawnAiPrefab:
  56. {
  57. default: null,
  58. type: cc.Prefab,
  59. serializable: true,
  60. tooltip: '游客的预制',
  61. },
  62. spawnParentNode:
  63. {
  64. default: null,
  65. type: cc.Node,
  66. serializable: true,
  67. tooltip: '生成游客的父节点',
  68. },
  69. //工人
  70. spawnWorkerAiPrefab:
  71. {
  72. default: null,
  73. type: cc.Prefab,
  74. serializable: true,
  75. tooltip: '工人的预制',
  76. },
  77. //初始化传递的属性
  78. InitCurrentGradeJson: null,
  79. //当前给AI分配的商店目标
  80. currentDistributionSubscript: {
  81. default: 0,
  82. type: cc.Integer,
  83. visible: false,
  84. }
  85. },
  86. // LIFE-CYCLE CALLBACKS:
  87. // onLoad() {
  88. // },
  89. start() {
  90. //生成AI
  91. this.callback = function () {
  92. this.onSpawnAI();
  93. }
  94. this.schedule(this.callback, this.spawnAiInterval);
  95. //测试用
  96. this.spawnAiSpeed = 100;
  97. },
  98. //按顺序设置游客购物的商店
  99. _SetTouristAITarget() {
  100. let _length = GlobalD.game.shopBuildingSalesArray.length;
  101. //如果没有商店
  102. if (_length == 0)
  103. return null;
  104. let _getShopTarget = null;
  105. //如果记录的下标超过数组长度
  106. if (this.currentDistributionSubscript >= _length) {
  107. this.currentDistributionSubscript = 0;//重置
  108. _getShopTarget = GlobalD.game.shopBuildingSalesArray[this.currentDistributionSubscript];
  109. }
  110. else {
  111. _getShopTarget = GlobalD.game.shopBuildingSalesArray[this.currentDistributionSubscript];
  112. this.currentDistributionSubscript++;
  113. }
  114. // cc.log('_getShopTarget',_getShopTarget.buildInfo.id);
  115. //返回下标对应的商店
  116. return _getShopTarget;
  117. },
  118. onSpawnAI() {
  119. // if (this.currentDistributionSubscript >= 1) return;
  120. let touristAI;
  121. touristAI = cc.instantiate(this.spawnAiPrefab);
  122. touristAI.parent = this.spawnParentNode;
  123. let AITouristPlayer = touristAI.getChildByName('AI').getComponent("AI_tourist_player");
  124. //这里决定是去商店还是去材料场地
  125. //
  126. if (Math.random() >= 0.35) {
  127. //设置游客的判定值,目标为商店
  128. AITouristPlayer.isGoToStore = true;
  129. //设置AI需要去的商店
  130. AITouristPlayer.distributionOfTargetStores = this._SetTouristAITarget();
  131. }
  132. //设置工人在外面行走的道路
  133. if (Math.random() >= 0.5) {
  134. //第一条路
  135. //单纯切换下两个位置
  136. // if (Math.random() >= 0.5)
  137. // AITouristPlayer.onGotoEndTiledTile(this.spawnEndTiledTile1, this.spawnStartTiledTile1);
  138. // else
  139. AITouristPlayer.onGotoEndTiledTile(this.spawnStartTiledTile1, this.spawnEndTiledTile1);
  140. } else {
  141. //第二条路
  142. // AITouristPlayer.onGotoEndTiledTile(this.spawnStartTiledTile2, this.spawnEndTiledTile2);
  143. //单纯切换下两个位置
  144. // if (Math.random() >= 0.5)
  145. AITouristPlayer.onGotoEndTiledTile(this.spawnStartTiledTile2, this.spawnEndTiledTile2);
  146. // else
  147. // AITouristPlayer.onGotoEndTiledTile(this.spawnEndTiledTile2, this.spawnStartTiledTile2);
  148. }
  149. let AIAnimation = touristAI.getChildByName('AI').getComponent('AI_tourist_Animation');
  150. let AITypeIndex = Math.ceil(Math.random() * 5);
  151. // cc.log('游客下标:', AITypeIndex);
  152. AIAnimation.onSwitchTourist(AITypeIndex);
  153. let AIAttribute = touristAI.getChildByName('AI').getComponent('AI_tourist_Attribute');
  154. // TestGuy: -1,
  155. // Visitor: -1,
  156. // Tycoon: -1,
  157. // Office: -1,
  158. // Oligarchs: -1,
  159. // Nabobess: -1,
  160. switch (AITypeIndex) {
  161. case reGameStates.AIType.TestGuy:
  162. break;
  163. case reGameStates.AIType.Visitor:
  164. //人物速度
  165. AIAttribute.characterSpeed = 20 + this.spawnAiSpeed;
  166. //游客购买力
  167. AIAttribute.purchasingPower = 5;
  168. //游客购买力
  169. AIAttribute.totalQuantityOfGoodsPurchased = 15;
  170. case reGameStates.AIType.Tycoon:
  171. //人物速度
  172. AIAttribute.characterSpeed = 40 + this.spawnAiSpeed;
  173. //游客购买力
  174. AIAttribute.purchasingPower = 5;
  175. //游客购买力
  176. AIAttribute.totalQuantityOfGoodsPurchased = 20;
  177. break;
  178. case reGameStates.AIType.Office:
  179. //人物速度
  180. AIAttribute.characterSpeed = 70 + this.spawnAiSpeed;
  181. //游客购买力
  182. AIAttribute.purchasingPower = 5;
  183. //游客购买力
  184. AIAttribute.totalQuantityOfGoodsPurchased = 25;
  185. break;
  186. case reGameStates.AIType.Oligarchs:
  187. //人物速度
  188. AIAttribute.characterSpeed = 70 + this.spawnAiSpeed;
  189. //游客购买力
  190. AIAttribute.purchasingPower = 5;
  191. //游客购买力
  192. AIAttribute.totalQuantityOfGoodsPurchased = 30;
  193. break;
  194. case reGameStates.AIType.Nabobess:
  195. //人物速度
  196. AIAttribute.characterSpeed = 100 + this.spawnAiSpeed;
  197. //游客购买力
  198. AIAttribute.purchasingPower = 5;
  199. //游客购买力
  200. AIAttribute.totalQuantityOfGoodsPurchased = 35;
  201. break;
  202. }
  203. },
  204. //生成工人AI
  205. onSpawnWorkerAI() {
  206. let workerAI;
  207. workerAI = cc.instantiate(this.spawnWorkerAiPrefab);
  208. workerAI.parent = this.spawnParentNode;
  209. let AIWorkerPlayer = workerAI.getChildByName('AI').getComponent("AI_worker_player");
  210. // //在道路上随机生成
  211. // let randomIndex = Math.floor(Math.random() * GlobalD.game.AllHighwayStylesAndIndex.length);
  212. //
  213. // let randomSpawn = GlobalD.TiledMap.analyticalIndexData(GlobalD.game.AllHighwayStylesAndIndex[randomIndex].highwayInfoIndex);
  214. let randomSpawn = new cc.v2(22+7,22-2);
  215. if(GlobalD.GameData.GameYear==0&&GlobalD.GameData.GameMonth==0&&GlobalD.GameData.GameDay<2)
  216. {
  217. randomSpawn.x = 22;
  218. randomSpawn.y = 22;
  219. }
  220. AIWorkerPlayer.onSetSpawnStartPoiont(randomSpawn);
  221. //设置AI添加数组
  222. GlobalD.game.onSetWorkerArray(AIWorkerPlayer);
  223. //随机寻找房屋
  224. AIWorkerPlayer.onUpdateFindHouse();
  225. let AIWorkerAttribute = workerAI.getChildByName('AI').getComponent("AI_worker_Attribute");
  226. AIWorkerAttribute.characterInfo.id = new Date().getTime();
  227. AIWorkerAttribute.characterInfo.startTilePos = randomSpawn;
  228. // cc.log('InitCurrentGradeJson',this.InitCurrentGradeJson,parseInt(this.InitCurrentGradeJson.MoveSpeed));
  229. //当前属性赋值
  230. AIWorkerAttribute.totalPhysicalStrength = parseInt(this.InitCurrentGradeJson.PhysicalStrength);
  231. AIWorkerAttribute.characterSpeed = parseInt(this.InitCurrentGradeJson.MoveSpeed);
  232. AIWorkerAttribute.labour = parseInt(this.InitCurrentGradeJson.Labor);
  233. //记录工人信息
  234. GlobalD.game.onAddWorkerCharacterInfoToArray(AIWorkerAttribute.characterInfo);
  235. },
  236. //移除工人AI,每次都移除一个工人
  237. onRemoveWorkerAI() {
  238. let workerPlayer = GlobalD.game.WorkerArray;
  239. let length = workerPlayer.length;
  240. for (let i = 0; i < length; i++) {
  241. if (workerPlayer[i].AIAttribute.isCanDismissed) {
  242. GlobalD.game.onRemoveAIFromWorkerArray(i);
  243. return true;
  244. }
  245. }
  246. return false;
  247. },
  248. //读取的内存数据生成AI
  249. onSpawnWorkerAIFromStoredData() {
  250. let characterArray = GlobalD.GameData.GetWorkerCharacterInfoArray();
  251. // cc.log('onSpawnWorkerAIFromStoredData', characterArray, characterArray.length);
  252. // return;
  253. for (let i = 0; i < characterArray.length; i++) {
  254. let workerAI;
  255. workerAI = cc.instantiate(this.spawnWorkerAiPrefab);
  256. workerAI.parent = this.spawnParentNode;
  257. let AIWorkerPlayer = workerAI.getChildByName('AI').getComponent("AI_worker_player");
  258. // //暂定一个生成点
  259. let spawnPos = characterArray[i].startTilePos;
  260. AIWorkerPlayer.onSetSpawnStartPoiont(spawnPos);
  261. //设置AI添加数组
  262. GlobalD.game.onSetWorkerArray(AIWorkerPlayer);
  263. let AIWorkerAttribute = workerAI.getChildByName('AI').getComponent("AI_worker_Attribute");
  264. AIWorkerAttribute.characterInfo = characterArray[i];
  265. // cc.log('characterArray[i]', characterArray[i]);
  266. // cc.log('InitCurrentGradeJson',this.InitCurrentGradeJson,parseInt(this.InitCurrentGradeJson.MoveSpeed));
  267. AIWorkerAttribute.totalPhysicalStrength = parseInt(this.InitCurrentGradeJson.PhysicalStrength);
  268. AIWorkerAttribute.characterSpeed = parseInt(this.InitCurrentGradeJson.MoveSpeed);
  269. AIWorkerAttribute.labour = parseInt(this.InitCurrentGradeJson.Labor);
  270. //设置工人房屋
  271. let buildinsInfo = GlobalD.game.onGetBuildingsTiledMapUnitFromBuildID(AIWorkerAttribute.characterInfo.occupantBuildingID);
  272. if (buildinsInfo)
  273. AIWorkerPlayer.onInitSetHouse(buildinsInfo);
  274. else
  275. AIWorkerPlayer.onUpdateFindHouse();
  276. // cc.log('buildinsInfo', buildinsInfo);
  277. //记录工人信息,这是初始化的数据,不记录到内存中
  278. GlobalD.game.onAddWorkerCharacterInfoToArray(AIWorkerAttribute.characterInfo, true);
  279. }
  280. },
  281. //全部工人属性升级
  282. onUpgradeAllWorker() {
  283. let workerArray = GlobalD.game.WorkerArray;
  284. for (let i = 0; i < workerArray.length; i++) {
  285. let AIWorkerAttribute = workerArray[i].node.getComponent("AI_worker_Attribute");
  286. AIWorkerAttribute.totalPhysicalStrength = parseInt(this.InitCurrentGradeJson.PhysicalStrength);
  287. AIWorkerAttribute.characterSpeed = parseInt(this.InitCurrentGradeJson.MoveSpeed);
  288. AIWorkerAttribute.labour = parseInt(this.InitCurrentGradeJson.Labor);
  289. // cc.log('AIWorkerAttribute', AIWorkerAttribute.totalPhysicalStrength, AIWorkerAttribute.characterSpeed);
  290. }
  291. }
  292. });