init
This commit is contained in:
commit
916150eea2
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
./dist
|
||||||
|
node_modules/*
|
13
.secret.json
Normal file
13
.secret.json
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"main": {
|
||||||
|
"token": "",
|
||||||
|
"protocol": "http",
|
||||||
|
"hostname": "127.0.0.1",
|
||||||
|
"port": "21025",
|
||||||
|
"path": "/",
|
||||||
|
"branch": "default"
|
||||||
|
},
|
||||||
|
"local": {
|
||||||
|
"copyPath": "C:\\Users\\jie\\AppData\\Local\\Screeps\\scripts\\127_0_0_1___21025\\default"
|
||||||
|
}
|
||||||
|
}
|
3341
dist/main.js
vendored
Normal file
3341
dist/main.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
dist/main.js.map.js
vendored
Normal file
1
dist/main.js.map.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2763
package-lock.json
generated
Normal file
2763
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
30
package.json
Normal file
30
package.json
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"name": "screep",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
|
"build": "rollup -cw",
|
||||||
|
"push": "rollup -cw --environment DEST:main",
|
||||||
|
"local": "rollup -cw --environment DEST:local"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"devDependencies": {
|
||||||
|
"@rollup/plugin-commonjs": "^28.0.1",
|
||||||
|
"@rollup/plugin-node-resolve": "^15.3.0",
|
||||||
|
"rollup": "^4.24.3",
|
||||||
|
"rollup-plugin-clear": "^2.0.7",
|
||||||
|
"rollup-plugin-copy": "^3.5.0",
|
||||||
|
"rollup-plugin-screeps": "^1.0.1",
|
||||||
|
"rollup-plugin-typescript2": "^0.36.0",
|
||||||
|
"typescript": "^5.6.3"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@types/lodash": "^3.10.1",
|
||||||
|
"@types/screeps": "^3.3.8",
|
||||||
|
"source-map": "^0.6.1"
|
||||||
|
}
|
||||||
|
}
|
57
rollup.config.mjs
Normal file
57
rollup.config.mjs
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import clear from 'rollup-plugin-clear'
|
||||||
|
import screeps from 'rollup-plugin-screeps'
|
||||||
|
import copy from 'rollup-plugin-copy'
|
||||||
|
import resolve from '@rollup/plugin-node-resolve'
|
||||||
|
import commonjs from '@rollup/plugin-commonjs'
|
||||||
|
import typescript from 'rollup-plugin-typescript2' // <== 新增这一行
|
||||||
|
|
||||||
|
|
||||||
|
let config
|
||||||
|
// 根据指定的目标获取对应的配置项
|
||||||
|
if (!process.env.DEST) console.log("未指定目标, 代码将被编译但不会上传")
|
||||||
|
else if (!(config = require("./.secret.json")[process.env.DEST])) {
|
||||||
|
throw new Error("无效目标,请检查 secret.json 中是否包含对应配置")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据指定的配置决定是上传还是复制到文件夹
|
||||||
|
const pluginDeploy = config && config.copyPath ?
|
||||||
|
// 复制到指定路径
|
||||||
|
copy({
|
||||||
|
targets: [
|
||||||
|
{
|
||||||
|
src: 'dist/main.js',
|
||||||
|
dest: config.copyPath
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: 'dist/main.js.map',
|
||||||
|
dest: config.copyPath,
|
||||||
|
rename: name => name + '.map.js',
|
||||||
|
transform: contents => `module.exports = ${contents.toString()};`
|
||||||
|
}
|
||||||
|
],
|
||||||
|
hook: 'writeBundle',
|
||||||
|
verbose: true
|
||||||
|
}) :
|
||||||
|
// 更新 .map 到 .map.js 并上传
|
||||||
|
screeps({ config, dryRun: !config })
|
||||||
|
|
||||||
|
export default {
|
||||||
|
input: 'src/main.ts',
|
||||||
|
output: {
|
||||||
|
file: 'dist/main.js',
|
||||||
|
format: 'cjs',
|
||||||
|
sourcemap: true
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
// 清除上次编译成果
|
||||||
|
clear({ targets: ["dist"] }),
|
||||||
|
//打包依赖
|
||||||
|
resolve(),
|
||||||
|
//模块化依赖
|
||||||
|
commonjs(),
|
||||||
|
//编译ts
|
||||||
|
typescript({tsconfig: "./tsconfig.json"}),
|
||||||
|
// 执行上传或者复制
|
||||||
|
pluginDeploy
|
||||||
|
]
|
||||||
|
};
|
3
src/index.d.ts
vendored
Normal file
3
src/index.d.ts
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
interface CreepMemory{
|
||||||
|
role: string
|
||||||
|
}
|
4
src/main.ts
Normal file
4
src/main.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import { errorMapper } from "./modules/errorMapping";
|
||||||
|
export const loop = errorMapper(() => {
|
||||||
|
console.log("Game Start");
|
||||||
|
})
|
95
src/modules/errorMapping.js
Normal file
95
src/modules/errorMapping.js
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/**
|
||||||
|
* 校正异常的堆栈信息
|
||||||
|
*
|
||||||
|
* 由于 rollup 会打包所有代码到一个文件,所以异常的调用栈定位和源码的位置是不同的
|
||||||
|
* 本模块就是用来将异常的调用栈映射至源代码位置
|
||||||
|
*
|
||||||
|
* @see https://github.com/screepers/screeps-typescript-starter/blob/master/src/utils/ErrorMapper.ts
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { SourceMapConsumer } from 'source-map'
|
||||||
|
|
||||||
|
// 缓存 SourceMap
|
||||||
|
let consumer = null
|
||||||
|
|
||||||
|
// 第一次报错时创建 sourceMap
|
||||||
|
const getConsumer = function () {
|
||||||
|
if (consumer == null) consumer = new SourceMapConsumer(require("main.js.map"))
|
||||||
|
return consumer
|
||||||
|
}
|
||||||
|
|
||||||
|
// 缓存映射关系以提高性能
|
||||||
|
const cache = {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用源映射生成堆栈跟踪,并生成原始标志位
|
||||||
|
* 警告 - global 重置之后的首次调用会产生很高的 cpu 消耗 (> 30 CPU)
|
||||||
|
* 之后的每次调用会产生较低的 cpu 消耗 (~ 0.1 CPU / 次)
|
||||||
|
*
|
||||||
|
* @param {Error | string} error 错误或原始追踪栈
|
||||||
|
* @returns {string} 映射之后的源代码追踪栈
|
||||||
|
*/
|
||||||
|
const sourceMappedStackTrace = function (error) {
|
||||||
|
const stack = error instanceof Error ? error.stack : error
|
||||||
|
// 有缓存直接用
|
||||||
|
if (cache.hasOwnProperty(stack)) return cache[stack]
|
||||||
|
|
||||||
|
const re = /^\s+at\s+(.+?\s+)?\(?([0-z._\-\\\/]+):(\d+):(\d+)\)?$/gm
|
||||||
|
let match
|
||||||
|
let outStack = error.toString()
|
||||||
|
console.log("ErrorMapper -> sourceMappedStackTrace -> outStack", outStack)
|
||||||
|
|
||||||
|
while ((match = re.exec(stack))) {
|
||||||
|
// 解析完成
|
||||||
|
if (match[2] !== "main") break
|
||||||
|
|
||||||
|
// 获取追踪定位
|
||||||
|
const pos = getConsumer().originalPositionFor({
|
||||||
|
column: parseInt(match[4], 10),
|
||||||
|
line: parseInt(match[3], 10)
|
||||||
|
})
|
||||||
|
|
||||||
|
// 无法定位
|
||||||
|
if (!pos.line) break
|
||||||
|
|
||||||
|
// 解析追踪栈
|
||||||
|
if (pos.name) outStack += `\n at ${pos.name} (${pos.source}:${pos.line}:${pos.column})`
|
||||||
|
else {
|
||||||
|
// 源文件没找到对应文件名,采用原始追踪名
|
||||||
|
if (match[1]) outStack += `\n at ${match[1]} (${pos.source}:${pos.line}:${pos.column})`
|
||||||
|
// 源文件没找到对应文件名并且原始追踪栈里也没有,直接省略
|
||||||
|
else outStack += `\n at ${pos.source}:${pos.line}:${pos.column}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cache[stack] = outStack
|
||||||
|
return outStack
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误追踪包装器
|
||||||
|
* 用于把报错信息通过 source-map 解析成源代码的错误位置
|
||||||
|
* 和原本 wrapLoop 的区别是,wrapLoop 会返回一个新函数,而这个会直接执行
|
||||||
|
*
|
||||||
|
* @param next 玩家代码
|
||||||
|
*/
|
||||||
|
export const errorMapper = function (next) {
|
||||||
|
return () => {
|
||||||
|
try {
|
||||||
|
// 执行玩家代码
|
||||||
|
next()
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
if (e instanceof Error) {
|
||||||
|
// 渲染报错调用栈,沙盒模式用不了这个
|
||||||
|
const errorMessage = Game.rooms.sim ?
|
||||||
|
`沙盒模式无法使用 source-map - 显示原始追踪栈<br>${_.escape(e.stack)}` :
|
||||||
|
`${_.escape(sourceMappedStackTrace(e))}`
|
||||||
|
|
||||||
|
console.log(`<text style="color:#ef9a9a">${errorMessage}</text>`)
|
||||||
|
}
|
||||||
|
// 处理不了,直接抛出
|
||||||
|
else throw e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
37
src/oldjs/builder.js
Normal file
37
src/oldjs/builder.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
let util = require("util");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
/**@param {Creep} creep */
|
||||||
|
run: function (creep) {
|
||||||
|
if (creep.memory.working && creep.store[RESOURCE_ENERGY] == 0) {
|
||||||
|
creep.memory.working = false;
|
||||||
|
creep.say("harvest")
|
||||||
|
}
|
||||||
|
if (!creep.memory.working && creep.store.getFreeCapacity(RESOURCE_ENERGY) == 0) {
|
||||||
|
creep.memory.working = true
|
||||||
|
creep.say("builder")
|
||||||
|
}
|
||||||
|
if (creep.memory.working) {
|
||||||
|
let target = creep.room.find(FIND_CONSTRUCTION_SITES);
|
||||||
|
if (target.length > 0) {
|
||||||
|
if (creep.build(target[0]) == ERR_NOT_IN_RANGE) {
|
||||||
|
creep.moveTo(target[0], {visualizePathStyle: {stroke: "#ffaa00"}});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let targets = util.FindCapacity(creep);
|
||||||
|
if (targets.length > 0) {
|
||||||
|
target.sort();
|
||||||
|
if (creep.transfer(targets[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE) {
|
||||||
|
creep.moveTo(targets[0], {visualizePathStyle: {stroke: "#ffaa00"}});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
creep.memory.working = false
|
||||||
|
let sources = creep.room.find(FIND_SOURCES);
|
||||||
|
if (creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
|
||||||
|
creep.moveTo(sources[0], {visualizePathStyle: {stroke: "#ffaa00"}});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
22
src/oldjs/harvester.js
Normal file
22
src/oldjs/harvester.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
let util = require("util")
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
/**@param {Creep} creep */
|
||||||
|
run: function(creep){
|
||||||
|
if(creep.store.getFreeCapacity() > 0){
|
||||||
|
let sources = creep.room.find(FIND_SOURCES);
|
||||||
|
sources.sort();
|
||||||
|
if(creep.harvest(sources[0]) == ERR_NOT_IN_RANGE){
|
||||||
|
creep.moveTo(sources[0], {visualizePathStyle: {stroke: "#ffaa00"}});
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
let target = util.FindCapacity(creep);
|
||||||
|
|
||||||
|
if(target.length > 0){
|
||||||
|
if(creep.transfer(target[0], RESOURCE_ENERGY) == ERR_NOT_IN_RANGE){
|
||||||
|
creep.moveTo(target[0], {visualizePathStyle: {stroke: "#ffaa00"}});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
27
src/oldjs/main.js
Normal file
27
src/oldjs/main.js
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
let spawnCreeps = require("spawnCreeps");
|
||||||
|
let harvester = require("harvester")
|
||||||
|
let upgrader = require("upgrader")
|
||||||
|
let builder = require("builder")
|
||||||
|
|
||||||
|
module.exports.loop = function(){
|
||||||
|
let mainSpawn = Game.spawns["Spawn1"];
|
||||||
|
spawnCreeps.run(mainSpawn);
|
||||||
|
|
||||||
|
for(var name in Memory.creeps) {
|
||||||
|
if(!Game.creeps[name]) {
|
||||||
|
delete Memory.creeps[name];
|
||||||
|
console.log('Clearing non-existing creep memory:', name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var name in Game.creeps){
|
||||||
|
let creep = Game.creeps[name];
|
||||||
|
if(creep.memory.role == "Harvester"){
|
||||||
|
harvester.run(creep);
|
||||||
|
}else if(creep.memory.role == "Upgrader"){
|
||||||
|
upgrader.run(creep)
|
||||||
|
}else if(creep.memory.role == "Builder"){
|
||||||
|
builder.run(creep)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
72
src/oldjs/spawnCreeps.js
Normal file
72
src/oldjs/spawnCreeps.js
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
|
||||||
|
let harvesterCount = 2;
|
||||||
|
let builderCount = 3;
|
||||||
|
let upgraderCount = 6;
|
||||||
|
|
||||||
|
|
||||||
|
/**@param {StructureSpawn} spawn */
|
||||||
|
var createDefaultHarvester = (spawn) => {
|
||||||
|
let name = "Harvester" + Game.time;
|
||||||
|
return spawn.spawnCreep([WORK, CARRY, MOVE], name, { memory: { role: "Harvester" } });
|
||||||
|
}
|
||||||
|
/**@param {StructureSpawn} spawn */
|
||||||
|
var createDefaultBuilder = (spawn) => {
|
||||||
|
let name = "Builder" + Game.time;
|
||||||
|
return spawn.spawnCreep([WORK, CARRY, MOVE], name, { memory: { role: "Builder" } });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {StructureSpawn} spawn */
|
||||||
|
var createDefaultUpgrader = (spawn) => {
|
||||||
|
let name = "Upgrader" + Game.time;
|
||||||
|
return spawn.spawnCreep([WORK, CARRY, MOVE], name, { memory: { role: "Upgrader" } });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
/**@param {StructureSpawn} spawn*/
|
||||||
|
run: function (spawn) {
|
||||||
|
|
||||||
|
if (spawn.spawning) return;
|
||||||
|
|
||||||
|
|
||||||
|
let harvesters = _.filter(Game.creeps,
|
||||||
|
/**@param {Creep} creep*/
|
||||||
|
(creep) => {
|
||||||
|
return creep.memory.role == "Harvester";
|
||||||
|
});
|
||||||
|
let builders = _.filter(Game.creeps,
|
||||||
|
/**@param {Creep} creep*/
|
||||||
|
(creep) => {
|
||||||
|
return creep.memory.role == "Builder";
|
||||||
|
});
|
||||||
|
let upgraders = _.filter(Game.creeps,
|
||||||
|
/**@param {Creep} creep*/
|
||||||
|
(creep) => {
|
||||||
|
return creep.memory.role == "Upgrader";
|
||||||
|
});
|
||||||
|
if (harvesters.length < harvesterCount) {
|
||||||
|
if (createDefaultHarvester(spawn) == 0) {
|
||||||
|
console.log("Spawn Harvester")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (upgraders.length < upgraderCount) {
|
||||||
|
if(createDefaultUpgrader(spawn) == 0){
|
||||||
|
console.log("Spawn Upgrader")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (builders.length < builderCount) {
|
||||||
|
if(createDefaultBuilder(spawn) == 0){
|
||||||
|
console.log("Spawn Builder")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spawn.spawning) {
|
||||||
|
var spawningCreep = Game.creeps[spawn.spawning.name];
|
||||||
|
spawn.room.visual.text(
|
||||||
|
'🛠️' + spawningCreep.memory.role,
|
||||||
|
spawn.pos.x + 1,
|
||||||
|
spawn.pos.y,
|
||||||
|
{ align: 'left', opacity: 0.8 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
25
src/oldjs/upgrader.js
Normal file
25
src/oldjs/upgrader.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
module.exports = {
|
||||||
|
/**@param {Creep} creep */
|
||||||
|
run: function (creep) {
|
||||||
|
if (creep.memory.upgrading && creep.store[RESOURCE_ENERGY] == 0) {
|
||||||
|
creep.memory.upgrading = false;
|
||||||
|
creep.say('🔄 harvest');
|
||||||
|
}
|
||||||
|
if (!creep.memory.upgrading && creep.store.getFreeCapacity() == 0) {
|
||||||
|
creep.memory.upgrading = true;
|
||||||
|
creep.say('⚡ upgrade');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (creep.memory.upgrading) {
|
||||||
|
if (creep.upgradeController(creep.room.controller) == ERR_NOT_IN_RANGE) {
|
||||||
|
creep.moveTo(creep.room.controller, { visualizePathStyle: { stroke: '#ffffff' } });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var sources = creep.room.find(FIND_SOURCES);
|
||||||
|
if (creep.harvest(sources[0]) == ERR_NOT_IN_RANGE) {
|
||||||
|
creep.moveTo(sources[0], { visualizePathStyle: { stroke: '#ffaa00' } });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
src/oldjs/util.js
Normal file
18
src/oldjs/util.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
module.exports = {
|
||||||
|
/**@param {Creep} creep */
|
||||||
|
FindCapacity: function(creep){
|
||||||
|
return creep.room.find(FIND_STRUCTURES, {
|
||||||
|
/**@param {Structure} structure */
|
||||||
|
filter: (structure)=>{
|
||||||
|
let type = structure.structureType;
|
||||||
|
return ((type == STRUCTURE_EXTENSION) ||
|
||||||
|
(type == STRUCTURE_SPAWN )) &&
|
||||||
|
structure.store.getFreeCapacity(RESOURCE_ENERGY) > 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/** @param {Creep} creep */
|
||||||
|
Log: function(creep, msg){
|
||||||
|
console.log(creep.name + " " + msg)
|
||||||
|
}
|
||||||
|
}
|
0
tsconfig.json
Normal file
0
tsconfig.json
Normal file
Loading…
Reference in New Issue
Block a user