当前位置: 首页 > news >正文

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 {}}
}

相关文章:

Gettler‘s Screep World 笔记 Ⅰ

夏促时候刚刚入坑&#xff0c;写个笔记叭~ 环境配置 参考 HoPGoldy 大佬的简书&#xff0c;先配置下开发环境 萌新去看大佬的详细教程&#xff0c;我这里比较简单&#xff0c;有前端基础的可以直接抄 VSCode 跳过 node 我配的是v18.18.2 换源 npm config set registry h…...

联合体(union)的定义以及如何与结构体(struct)不同

联合体&#xff08;Union&#xff09;是一种特殊的数据类型&#xff0c;它允许在相同的内存位置存储不同的数据类型。但是&#xff0c;在任何给定的时间点&#xff0c;联合体只能存储其中的一个值&#xff1b;这意味着联合体的大小是其最大成员的大小&#xff0c;因为它必须足够…...

【Spark官方文档部分翻译】RDD编程指南(RDD Programming Guide)

写在前面 内容如何选择 本翻译只翻译本人认为精华的部分&#xff0c;本人认为的Spark的一些核心理念&#xff0c;编程思想。一些特别基础的操作包括但不限于搭建环境就不在此赘述了。 配套版本 本系列基于Spark 3.3.1&#xff0c;Scala 2.12.10&#xff0c;进行翻译总结 原…...

前端八股文 $set

为什么会有$set vue2中对数组中新增的属性是监听不到的 如图 vue 插件中有但是 视图中没有刷新 解决方法 解决就是 $set() 就是在数组中新增属性的时候可以重新渲染视图 具体的写法 写法 就是 第一个 是在那个对象上新增 第二个参数 是新增的属性 第三个参数是 新增的属性…...

Connecting weaviate with langflow across docker containers

题意&#xff1a;在Docker容器之间连接Weaviate与Langflow 问题背景&#xff1a; I am trying to build a local RAG application using Langflow. For my vectore store, I want to use a local Weaviate instance, hosted in a separate docker container on the same netwo…...

【linux vim使用说明】

基本概念 提示&#xff1a;本文是网络资源整理 模式: vim 有多种模式&#xff0c;每种模式都有不同的功能。 普通模式 (Normal Mode): 默认模式&#xff0c;用于导航和执行命令。插入模式 (Insert Mode): 用于文本输入。可以通过按 i 进入。可视模式 (Visual Mode): 用于选择…...

cocos2d-x安装和项目

首先多方查找资料发现教程很简洁&#xff0c;发现对自己的操作方面没多大帮助&#xff0c;后来干脆去官网&#xff0c;好像也很简洁。基于这样一个原因&#xff0c;加上我首次碰cocos2d-x&#xff0c;决定记录一下整个流程&#xff0c;解决实际操作上的疑惑。 涉及的方面&…...

因果推断 | 双重机器学习(DML)算法原理和实例应用

文章目录 1 引言2 DML算法原理2.1 问题阐述2.2 DML算法 3 DML代码实现3.1 策略变量为0/1变量3.2 策略变量为连续变量 4 总结5 相关阅读 1 引言 小伙伴们&#xff0c;好久不见呀。 距离上次更新已经过去了一个半月&#xff0c;上次发文章时还信誓旦旦地表达自己后续目标是3周更…...

Flutter 开源库学习

网上看了好多歌词实现逻辑相关资料&#xff0c;封装比较的好的 就 flutter_lyric&#xff0c;核心类是LyricsReader&#xff0c;而且如果实现逐字逐句歌词编辑功能还需要自己实现很多细节 &#xff0c;网友原话是 &#xff1a;歌词的功能真的是不少&#xff0c;写起来也是挺难的…...

自主巡航,目标射击

中国机器人及人工智能大赛 参赛经验&#xff1a; 自主巡航赛道 【机器人和人工智能——自主巡航赛项】动手实践篇-CSDN博客 主要逻辑代码 #!/usr/bin/env python #coding: utf-8import rospy from geometry_msgs.msg import Point import threading import actionlib impor…...

MySQL中EXPLAIN关键字详解

昨天领导突然问到&#xff0c;MySQL中explain获取到的type字段中index和ref的区别是什么。 这两种状态都是在使用索引后产生的&#xff0c;但具体区别却了解不多&#xff0c;只知道ref相比于index效率更高。 因此&#xff0c;本文较为详细地记录了MySQL性能中返回字段的含义、状…...

如何理解ref toRef和toRefs

是什么 ref 生成值类型的响应式数据可用于模板和reactive通过.value修改值 ref也可以像vue2中的ref那样使用 toRef 针对一个响应式对象&#xff08;reactive&#xff09;的prop创建一个ref两者保持引用关系 toRefs 将响应式对象&#xff08;reactive封装&#xff09;转换…...

【linux】kernel-trace

文章目录 linux kernel trace配置trace内核配置trace接口使用通用配置Events配置Function配置Function graph配置Stack trace设置 跟踪器tracer功能描述 使用示例1.irqsoff2.preemptoff3.preemptirqsoff linux kernel trace 配置 源码路径&#xff1a; kernel/trace trace内…...

【Golang 面试基础题】每日 5 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

ETCD介绍以及Go语言中使用ETCD详解

ETCD介绍以及Go语言中使用ETCD详解 什么是etcd ETCD是一个分布式、可靠的key-value存储的分布式系统,用于存储分布式系统中的关键数据;当然,它不仅仅用于存储,还提供配置共享及服务发现;基于Go语言实现 。 etcd的特点 完全复制:集群中的每个节点都可以使用完整的存档高…...

03-用户画像+Elasticsearch

优点 es支持海量数据的写入和更新es可以和hadoop&#xff0c;hive及spark进行集成es支持hivesql的操作&#xff0c;可以通过hivesql将数据导入eses的在进行数据检索查询是速度比较快es是分布式存储 应用 全文检索 全文检索流程: 1-对文档数据(文本数据)进行分词 2-将分词…...

初学Mybatis之搭建项目环境

在连接 mysql 数据库时&#xff0c;遇到了个 bug&#xff0c;之前都能连上&#xff0c;但报错说换了个 OS 操作系统什么的 然后搜索怎么连接&#xff0c;找到了解决方法 MySQL MYSQL – 无法连接到本地MYSQL服务器 (10061)|极客教程 (geek-docs.com) 命令行输入 services.msc…...

JMeter使用小功能-(持续更新)

1、jmeter在同一个线程组内&#xff0c;uuid的复用 方式一&#xff1a; 方式二&#xff1a; 2、获得jMeter使用的线程总数 ctx.getThreadGroup().getNumberOfThreads()来表示活动线程总数 int threadNumctx.getThreadGroup().getNumThreads(); String threads Integer…...

科研绘图系列:R语言火山图(volcano plot)

介绍 火山图(Volcano Plot),也称为火山图分析,是一种在生物信息学和基因组学中常用的图形表示方法,主要用于展示基因表达数据的差异。它通常用于基因表达微阵列或RNA测序数据的可视化,帮助研究人员识别在不同条件下表达差异显著的基因。 火山图的基本构成 X轴:通常表示…...

docker firewalld 防火墙设置

1、环境 centos 7 firewalld docker-ce docker 默认会更改防护墙配置 导致添加的防火墙策略不生效&#xff0c;可以启用firewalld 重新设置策略 2、启用防火墙 systemctl start firewalld systemctl enable firewalld3、配置文件禁用docker 的iptables /etc/docker/daemon.js…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...