那我们就算正式开始尝试了,为了有一个开头,我翻了一下youtube发现还是有相关教程的,所以前期的几篇大概会通过看教程模仿再加入一些自己的改进
有用的资源
这里建议在看教程模仿的时候调用的方法都去api文档里查一查,一是能够更加熟悉函数,二是教程不可避免地有些老了,有的方法已经被更换建议按照api中的新接口来使用。比如查看携带的资源现在统一为一个store对象了
写下这篇文章的时候我看完了教程的前六段,首先类似地,我们将creep分成了几类,harvester,upgrader,builder,repairer,它们分别做的事情也非常显然
- harvester是最基本的收获能量填给spawn(以及建造了extension之后填给所有需要energy的地方)
- upgrader负责收集能量后升级房间的controller
- builder负责收集能量后填向需要建设的工地
- repairer负责收集能量后维修建筑
目前的逻辑有的几个问题
- 当前最基本的逻辑并没有实现自动建设工地,所以目前还需要我们手动指定工地
- 所有的creep都是从房间的能源生成地获取能量后去做自己的事情,在RCL高了之后我们可以建设storge、link等让harvester填给存储设施而其他的creep从存储设施获取
- repairer目前的逻辑是先维修不是WALL的建筑之后如果有WALL再维修,这里有一个坑WALL是不能被FIND_MY_STRUCTURE搜索到的,必须是FIND_STRUCTURE才能找到WALL
与教程不同的是,由于存在creep发现自己的事情已经做完的情况下可以去做其他creep的工作,但是直接引用会导致很大的重复代码运行,所以我加入了rolehandle模块负责统一处理各种creep共同的问题而将每种creep的role精简了许多
rolehandler1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| var roleharvester=require('./roleharvester'); var roleupgrader=require('./roleupgrader'); var rolebuilder=require('./rolebuilder'); var rolerepairer=require('./rolerepairer'); module.exports ={ run:function(creep){ if(creep.memory.working == true && creep.store.getFreeCapacity(RESOURCE_ENERGY) == 0){ creep.memory.working = false; } else if(creep.memory.working == false && creep.store[RESOURCE_ENERGY] == 0){ creep.memory.working = true; } var isworking = creep.memory.working; if(creep.memory.role == 'harvester'){ if(isworking){ roleharvester.prepare(creep); } else{ roleharvester.run(creep); } } else if (creep.memory.role == 'upgrader'){ if(isworking){ roleupgrader.prepare(creep); } else{ roleupgrader.run(creep); } } else if (creep.memory.role == 'builder'){ if(isworking){ rolebuilder.prepare(creep); } else{ rolebuilder.run(creep); } } else if (creep.memory.role == 'repairer'){ if(isworking){ rolerepairer.prepare(creep); } else{ rolerepairer.run(creep); } } } };
|
rolerepairer1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| var rolebuilder=require('./rolebuilder'); module.exports = { run:function(creep){ var structure=creep.pos.findClosestByPath(FIND_MY_STRUCTURES,{ filter:(s)=>s.hits<s.hitsMax && s.structureType != STRUCTURE_WALL }); if(structure!=undefined){ if(creep.repair(structure)==ERR_NOT_IN_RANGE){ creep.moveTo(structure); } } else{ structure=creep.pos.findClosestByPath(FIND_STRUCTURES,{ filter:(s)=> s.structureType == STRUCTURE_WALL && s.hits<s.hitsMax }); if(structure!=undefined){ if(creep.repair(structure)==ERR_NOT_IN_RANGE){ creep.moveTo(structure); } } else{ rolebuilder.run(creep); } } }, prepare:function(creep){ var source=creep.pos.findClosestByPath(FIND_SOURCES); if(creep.harvest(source)==ERR_NOT_IN_RANGE) { creep.moveTo(source); } } };
|
另外一段处理就是spwan的处理了,当前的处理很简单,当spawn能量够时看缺乏哪种creep按需生产即可
下一步的计划首先是根据RCL以及当前拥有的能量生产适当的creep,尽量做到能够根据RCL情况以及实际能量来生产,而后可能的话开始尝试实现一些简单的自动建筑?