Gettler‘s Screep World 笔记 Ⅰ

夏促时候刚刚入坑,写个笔记叭~

环境配置

参考 HoPGoldy 大佬的简书,先配置下开发环境

萌新去看大佬的详细教程,我这里比较简单,有前端基础的可以直接抄

VSCode 跳过

node 我配的是v18.18.2

换源

npm config set registry https://registry.npmmirror.com

安装依赖

npm install @types/screeps @types/lodash@3.10.1 # 代码提示
npm install -D rollup # 代码构建工具
npm install rollup-plugin-clear rollup-plugin-screeps rollup-plugin-copy -D # 代码上传工具
npm install source-map@0.6.1 # 异常信息映射
npm install -D @rollup/plugin-node-resolve @rollup/plugin-commonjs # 模块打包工具
# 下面的ts配不配就看心情了,建议配一下
npm install --save-dev typescript rollup-plugin-typescript2 # ts编译

根目录下创建代码构建工具的配置文件 rollup.config.js

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'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.js', output: {file: 'dist/main.js', format: 'cjs', sourcemap: true}, plugins: [// 清除上次编译成果clear({targets: ["dist"]}), // 执行上传或者复制// 打包依赖resolve(),// 模块化依赖commonjs(),pluginDeploy]
};

package.json 配置

{"name": "sc","version": "1.0.0","description": "","main": "rollup.config.js","scripts": {"start": "rollup -cw --environment DEST:main","local": "rollup -cw --environment DEST:local","build": "rollup -cw"},"repository": {"type": "git","url": "http://xxxxxxxx:xxxx/Gettler/screeps.git"},"keywords": [],"author": "Gettler","license": "ISC","devDependencies": {"@rollup/plugin-commonjs": "^14.0.0","@rollup/plugin-node-resolve": "^8.4.0","@types/lodash": "^3.10.1","@types/node": "^14.0.24","@types/screeps": "^3.3.8","rollup": "^2.22.1","rollup-plugin-clear": "^2.0.7","rollup-plugin-copy": "^3.3.0","rollup-plugin-screeps": "^1.0.1","rollup-plugin-typescript2": "^0.27.1","typescript": "^3.9.7"},"dependencies": {"source-map": "^0.6.1"}
}

项目根目录下配置 .secret.json 用于发布代码到游戏,token地址:https://screeps.com/a/#!/account/auth-tokens

{"main": {"token": "你的token","protocol": "https","hostname": "screeps.com","port": 443,"path": "/","branch": "default"},"local": {"copyPath": "本地路径,如:C:\\Users\\Gettler\\AppData\\Local\\Screeps\\scripts\\screeps.com\\default"}
}

main.js

import {errorMapper} from "./modules/errorMapper";module.exports.loop = errorMapper(() => {// 代码在这里写即可console.log("Power!!!")}
)

errorMapper.js

/*** 校正异常的堆栈信息** 由于 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+)\)?$/gmlet matchlet 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] = outStackreturn 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}}
}

tsconfig.json

{"compilerOptions": {"target": "es2017","moduleResolution": "Node","outDir": "dist/","baseUrl": "./","sourceMap": true,"allowSyntheticDefaultImports": true,"paths": {"@/*": ["./src/*"]}},"exclude": ["node_modules"],"include": ["src/**/*.ts"]
}

至此,环境配置完成(如有问题欢迎评论区指正)

我的项目结构(已经写了一部分代码了)

image-20240715134935011

入门

新手先把官方教程的代码跑起来,在这个基础上优化,前期官方教程的代码也还够用,一定要看懂教程代码再来往下看

对照着

挖采分离

这个是我第一个想要实现的,因为我的矿可以让三个爬爬一起采,如果三个以上就会有一个爬爬闲着,等到有爬爬才玩矿运回去的时候才能有空间采矿,如果多个一起运回去好像又会损失空间,嗯。。。很浪费

实现挖采分离,就可以有三个爬爬一直挖矿,然后挖完矿扔到脚下,让别的爬爬来捡回去

思路:修改教程harvester代码,去掉运送能量到建筑的代码,去掉carry部件,编写mover

mover 的代码

if (creep.memory.role === 'mover') {if ((creep.memory.moving !== undefined && creep.memory.moving === true) || creep.store.getFreeCapacity() === 0 || (sources.length === 0 && creep.store.getUsedCapacity() > 0)) {creep.say("I am moving!")creep.memory.moving = truevar targets = creep.room.find(FIND_STRUCTURES, { //找出需要补充能量的建筑filter: (structure) => {return (structure.structureType === STRUCTURE_EXTENSION || structure.structureType === STRUCTURE_SPAWN || structure.structureType === STRUCTURE_EXTENSION ||  structure.structureType === STRUCTURE_TOWER) && structure.store.getFreeCapacity(RESOURCE_ENERGY) > 0;}});for (var tmp in Game.creeps) {var tmpCreep = Game.creeps[tmp];if (tmpCreep.memory.role === 'upgrader' && tmpCreep.store.getFreeCapacity() > 0) {targets.push(tmpCreep)} else if (tmpCreep.memory.role === 'builder' && tmpCreep.memory.building === true) {targets.push(tmpCreep)}}if (targets.length > 0) { // 需要维护的建筑数目 > 0var res = creep.transfer(targets[creep.memory.idx % targets.length], RESOURCE_ENERGY)if (res === ERR_NOT_IN_RANGE) {creep.moveTo(targets[creep.memory.idx % targets.length], {visualizePathStyle: {stroke: '#ffffff'}});} else if (res === OK) {}}if (creep.store.getUsedCapacity() === 0) {creep.memory.moving = false}} else if (creep.store.getFreeCapacity() > 0) {creep.say("I am carrying!")creep.memory.moving = falselet res = creep.pickup(sources[creep.memory.idx % sources.length])if (res === ERR_NOT_IN_RANGE) {creep.moveTo(sources[creep.memory.idx % sources.length], {visualizePathStyle: {stroke: '#ffaa00'}});} else {}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3248331.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【查看WIFI密码】:在window操作系统上查看已连接过的WIFI密码(两种方式)

前言 通常情况下&#xff0c;我们想要将已经连接过的wifi分享给好友&#xff0c;但不知道怎么查看&#xff0c;废话不多说&#xff0c;直接上干货 方式一&#xff1a;通过cmd命令 Step01&#xff1a;打开cmd WIN r 弹出运行框 输入&#xff1a;cmd&#xff0c;点击确定&…

打靶记录——靶机easy_cloudantivirus

靶机下载地址 链接&#xff1a;https://pan.baidu.com/s/1OfrqdNKbabAkMvmoM70gbQ?pwdgz0m 提取码&#xff1a;gz0m Vulnhub 的靶机都有一个特点&#xff0c;通常导入到 VMware Workstation 时都会获取不到 IP 地址&#xff0c;虽然可以进紧急模式中修改&#xff0c;但是太麻…

Android SurfaceView 组件介绍,挖洞原理详解

文章目录 组件介绍基本概念关键特性使用场景 SurfaceHolder介绍主要功能使用示例 SurfaceView 挖洞原理工作机制 使用SurfaceView展示图片示例创建一个自定义的 SurfaceView类在 Activity 中使用 ImageSurfaceView注意事项效果展示 组件介绍 在 Android 开发中&#xff0c;Sur…

【STM32 HAL库】全双工DMA双buffer的I2S使用

1、配置I2S 我们的有效数据是32位的&#xff0c;使用飞利浦格式。 2、配置DMA **这里需要注意&#xff1a;**i2s的DR寄存器是16位的&#xff0c;如果需要发送32位的数据&#xff0c;是需要写两次DR寄存器的&#xff0c;所以DMA的外设数据宽度设置16位&#xff0c;而不是32位。…

关于vue实现导出excel表,以及导出的excel后的图片超过单元格的问题

实现导出带图标片的excel的方法&#xff0c; 首先&#xff1a; import table2excel from js-table2excel // 导出表格 按钮点击后触发事件 const onBatchExport () > {const column [//数据表单{title: "ID", //表头名称titlekey: "id", //数据ty…

新手小白的pytorch学习第五弹-----pytorch的工作流

我们之前学习了 pytorch 中的基本数据 tensor 今天我们要开始学习 pytorch 的简单工作流程了 数据 -> 构建或选择一个预训练的模型 -> 使得模型适应数据并能够进行预测 -> 评估模型 -> 通过实验提升性能 -> 保存并重新加载你训练的模型 机器学习和深度学习的关…

解决mysql,Navicat for MySQL,IntelliJ IDEA之间中文乱码

使用软件版本 jdk-8u171-windows-x64 ideaIU-2021.1.3 mysql-essential-5.0.87-win32 navicat8_mysql_cs 这个问题我调试了好久&#xff0c;网上的方法基本上都试过了&#xff0c;终于是解决了。 三个地方结果都不一样。 方法一 首先大家可以尝试下面这种方法&#xff1a…

Github 2024-07-15 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-07-15统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5非开发语言项目4JavaScript项目3TypeScript项目2Go项目1Solidity项目1Java项目1Rust项目1免费编程学习平台:freeCodeCamp.org 创建…

数据库系统概论:数据库完整性

引言 数据库是现代信息系统的心脏&#xff0c;数据的准确性和一致性对于业务流程至关重要。数据库完整性是确保数据质量的基石&#xff0c;它涵盖了数据的正确性、相容性和一致性&#xff0c;是数据安全与业务连续性的保障。 数据库完整性是指数据的精确性、可靠性和逻辑一致…

选择项目进度系统的10大必知软件

国内外主流的10款项目进度软件对比&#xff1a;PingCode、Worktile、蓝凌EIS智慧工作平台、Teambition、Tapd、Tower、Monday.com、ClickUp、Asana、Jira。 在选择项目进度系统时&#xff0c;你是否感到困惑或不确定如何挑选最适合自己团队的工具&#xff1f;市场上的众多选项和…

Uncaught (in promise) TypeError: Object(...) is not a function at eval

踩坑: Uncaught (in promise) TypeError: Object(...) is not a function at eval_at object.eval [as fullvalidate] (eval at <anonymo-CSDN博客 又新添一个错误的出现方式&#xff0c;后台启动没问题&#xff0c;但是我的数据库是无法自行启动的&#xff0c;这就导致在查…

Redis-布隆过滤器(Bloom Filter)详解

文章目录 什么是布隆过滤器 布隆过滤器的优点&#xff1a;布隆过滤器的缺点&#xff1a;其他问题 布隆过滤器适合的场景布隆过滤器原理 数据结构增加元素查询元素删除元素 如何使用布隆过滤器 Google开源的Guava自带布隆过滤器Redis实现布隆过滤器 Redis中配置布隆过滤器Redis…

MYSQL 四、mysql进阶 9(数据库的设计规范)

一、为什么需要数据库设计 二、范 式 2.1 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。 可以理解为&#xff0c;一张数据表的设计结 构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的…

品牌出海“掘金”的王牌账号:亚马逊VC——WAYLI威利跨境助力商家

在全球化的大潮中&#xff0c;B2B模式已然成为品牌出海“掘金”的王牌账号&#xff0c;特别是在亚马逊VC这一强大平台的加持下。亚马逊VC不仅是企业间贸易的桥梁&#xff0c;更是品牌国际化的加速器。 亚马逊VC&#xff0c;为企业提供了直接进入亚马逊全球供应链的机遇。这不仅…

神经网络中如何优化模型和超参数调优(案例为tensor的预测)

总结&#xff1a; 初级&#xff1a;简单修改一下超参数&#xff0c;效果一般般但是够用&#xff0c;有时候甚至直接不够用 中级&#xff1a;optuna得出最好的超参数之后&#xff0c;再多一些epoch让train和testloss整体下降&#xff0c;然后结果就很不错。 高级&#xff1a;…

盛夏畅饮狂欢,肆拾玖坊肆玖嘿哈精酿白啤陪你嗨啤!

盛夏的炎热,犹如烈火燃烧,让人无法抵挡那股渴望畅饮的冲动。在这个时节,你是否也期待着与亲朋好友欢聚一堂,聚餐畅饮,共度清凉惬意的时光?快来!肆拾玖坊的肆玖嘿哈喊你一起嗨啤了! 提及啤酒,想必大家都不会陌生。这个古老的饮品,自公元前3世纪起便与人类相伴,穿越历史的长河,时…

【ProtoBuf】proto 3 语法 -- 详解

这个部分会对通讯录进行多次升级&#xff0c;使用 2.x 表示升级的版本&#xff0c;最终将会升级如下内容&#xff1a; 不再打印联系人的序列化结果&#xff0c;而是将通讯录序列化后并写入文件中。 从文件中将通讯录解析出来&#xff0c;并进行打印。 新增联系人属性&#xff…

常用指标和损失总结

损失 回归问题 L1损失 L1 损失是最小化模型参数的绝对值之和。 倾向于使模型参数接近零&#xff0c;导致模型变得更加稀疏。这意味着一些特征的权重可能变为零&#xff0c;从而被模型忽略。 对异常值非常敏感。异常值会导致参数权重绝对值增大&#xff0c;从而影响模型的整…

2024年【电工(高级)】考试报名及电工(高级)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;高级&#xff09;考试报名参考答案及电工&#xff08;高级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及电工&#xff08;高级&#xff09;操作证已考过的学员汇总&#xff0c;相对有…

【Charles】-雷电模拟器-抓HTTPS包

写在前面 之前的文章我们写过如何通过Charles来抓取IOS手机上的HTTPS包以及遇到的坑。说一个场景&#xff0c;如果你的手机是IOS&#xff0c;但是团队提供的APP安装包是Android&#xff0c;这种情况下你还想抓包&#xff0c;怎么办&#xff1f; 不要慌&#xff0c;我们可以安装…