ManageAI.js 13 KB

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