Gettler‘s Screep World 笔记 Ⅰ

news2024/11/13 13:03:07

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

环境配置

参考 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+)\)?$/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
    }
  }
}

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 = true
    var 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) { // 需要维护的建筑数目 > 0
      var 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 = false
    let 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://www.coloradmin.cn/o/1934953.html

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

相关文章

高性能分布式IO系统BL205 OPC UA耦合器

边缘计算是指在网络的边缘位置进行数据处理和分析&#xff0c;而不是将所有数据都传送到云端或中心服务器&#xff0c;这样可以减少延迟、降低带宽需求、提高响应速度并增强数据安全性。 钡铼BL205耦合器就内置边缘计算功能&#xff0c;它不依赖上位机和云平台&#xff0c;就能…

SpringCloudAlibaba-Seata2.0.0与Nacos2.2.1

一、下载 ## 下载seata wget https://github.com/apache/incubator-seata/releases/download/v2.0.0/seata-server-2.0.0.tar.gz## 解压 tar zxvf seata-server-2.0.0.tar.gz二、执行sql文件 ## 取出sql文件执行 cd /seata/script/server/db/mysql ## 找个mysql数据库执行三、…

gitlab新建仓库

总贴 每个git网站都有不同的创建项目的方式&#xff0c;现在举例gitlab&#xff0c;其他例如gitee&#xff0c;gitcode&#xff0c;都是差不多的&#xff0c;自行百度 1![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dae875d9048940c0aeb292c07d6a4a62.png)1和2是项…

【面试题】数据结构:堆排序的排序思想?

堆排序的排序思想&#xff1f; 堆排序是一种高效的排序算法&#xff0c;其基本思想是利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树&#xff0c;通常用数组来表示。堆排序的基本步骤如下&#xff1a; 1. 构建初始堆&#xff1a; 将待排序的数组转换成一个最大堆&a…

《昇思25天学习打卡营第25天|第20天》

今天是第二十天&#xff0c;今天学习的是应用实践的生成式的Pix2Pix实现图像转换。 老传统&#xff0c;从Pix2Pix概述学起&#xff08;基于条件生成对抗网络实现的一种深度学习图像转换模型&#xff09;&#xff0c;基础原理&#xff0c;准备环节&#xff08;配置环境文件、准…

科普文:企业级磁盘阵列软件架构与功能概述

科普文&#xff1a;了解RAID独立冗余磁盘阵列-CSDN博客 磁盘阵列软件概叙 从硬件到软件进行了一个比较全面&#xff0c;但又非常浅显的介绍。在硬件方面&#xff0c;我们了解到企业级磁盘阵列通常由两个独立的计算机打包成一台设备提供存储服务&#xff1b;在软件方面&#x…

分布式服务框架zookeeper+消息队列kafaka

一、zookeeper概述 zookeeper是一个分布式服务框架&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;命名服务&#xff0c;状态同步&#xff0c;配置中心&#xff0c;集群管理等。 在分布式环境下&#xff0c;经常需要对应用/服…

linux中list的基本用法

内核链表 1 list_head 结构 为了使用链表机制&#xff0c;驱动程序需要包含<linux/types.h>头文件&#xff0c;该文件定义了如下结构体实现双向链&#xff1a; struct list_head {struct list_head *next, *prev; };2 链表的初始化 2.1 链表宏定义和初始化 可使用以…

C++【OpenCV】图片亮度色度归一化

#include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream>using namespace cv; using namespace std;int main() {Mat image imread("SrcMF.jpg");// 灰度、Gamma归一化亮度cv::Mat m_gray;cv::cvtColor(image, m_gra…

人工智能算法工程师(中级)课程17-模型的量化与部署之剪枝技巧与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程17-模型的量化与部署之剪枝技巧与代码详解。模型剪枝是深度学习领域中一项关键的技术&#xff0c;旨在减少神经网络中的冗余权重&#xff0c;从而降低计算成本和内存占用&#xff0c;同…

昇思25天学习打卡营第5天 | 数据集

在探索MindSpore深度学习框架中的数据集处理过程&#xff0c;我对其数据加载和处理流程有了深入的了解。MindSpore提供了一套功能强大的工具&#xff0c;可以有效地处理和转换数据&#xff0c;确保了数据预处理的效率和质量。以下是我从本次学习中得到的几点主要心得&#xff1…

食堂采购系统开发:从需求分析到上线实施的完整指南

本篇文章&#xff0c;笔者将详细介绍食堂采购系统从需求分析到上线实施的完整过程&#xff0c;旨在为开发团队和管理者提供一个系统化的指南。 一、需求分析 1.用户需求 常见的需求包括&#xff1a; -采购计划管理 -供应商管理 -库存管理 -成本控制 -报表生成 2.系统功…

【电路笔记】-放大器的输入和输出阻抗

放大器的输入和输出阻抗 文章目录 放大器的输入和输出阻抗1、概述2、输入和输出阻抗的定义3、阻抗的重要性4、阻抗设置5、设置方法6、总结1、概述 从非常简单的角度来看,放大器由一个“盒子”组成,实现输入信号和输出信号之间的放大功能。 输入进入系统和输出离开系统的方式…

【从零开始实现stm32无刷电机FOC】【实践】【6/7 CMSIS-DSP】

目录 导入CMSIS-DSP库使用CMSIS-DSP 点击查看本文开源的完整FOC工程 CMSIS-DSP库是ARM开源的、对ARM处理器优化的数学库&#xff0c;本文使用了其提供的三角函数、反park变换函数、park变换函数、clarke变换函数、PID控制器。 CMSIS-DSP原始代码仓库是https://github.com/ARM-s…

Spring Boot1(概要 入门 Spring Boot 核心配置 YAML JSR303数据校验 )

目录 一、Spring Boot概要 1. SpringBoot优点 2. SpringBoot缺点 二、Spring Boot入门开发 1. 第一个SpringBoot项目 项目创建方式一&#xff1a;使用 IDEA 直接创建项目 项目创建方式二&#xff1a;使用Spring Initializr 的 Web页面创建项目 &#xff08;了解&#…

cms wpscan使用方式--kali linux

WPScan是一个用于WordPress安全审计和漏洞扫描的工具&#xff0c;可以通过以下命令来使用WPScan&#xff1a; 扫描一个网站&#xff1a; wpscan --url http://example.com扫描一个网站并指定用户名和密码&#xff1a; wpscan --url http://example.com --useradmin --passwo…

Windows FFmpeg 开发环境搭建

FFmpeg 开发环境搭建 FFmpeg命令行环境搭建使用FFmpeg官方编译的库Windows编译FFmpeg1. 下载[msys2](https://www.msys2.org/#installation)2. 安装完成之后,将安装⽬录下的msys2_shell.cmd中注释掉的 rem set3. 修改pacman 镜像源并安装依赖4. 下载并编译源码 FFmpeg命令行环境…

2024年7月17日(nodejs,npm设置国内镜像,vue脚手架,远程管理ssh,踢出用户,scp命令,ssh免密登录)

1、安装nodejs服务 nodejs是一个运行1环境&#xff0c;和javajdk运行环境格式一样 [roota ~]# yum -y install nodejs.x86_64 安装完成之后&#xff0c;使用node -v 查看版本 [roota ~]# node -v v16.20.2 2、简易服务器的环境安装npm 安装包管理器 npm node packae manger [ro…

Odoo17架构概述

多层架构 Odoo遵循多层架构&#xff0c;这意味着演示&#xff0c;业务逻辑和数据存储是分开的。更具体地说&#xff0c;它使用三层架构。 UI展示层 UI表示层是 HTML5、JavaScript 和 CSS 的组合。 应用程序的最顶层是用户界面。界面的主要功能是将任务和结果转换为用户可以理…

人工智能导论-机器学习

机器学习概述 概述 本章主要介绍的机器学习的概念、发展历程、发展趋势、相关应用&#xff0c;着重拓展机监督学习和无监督学习的相关知识。 重点&#xff1a;机器学习的定义和应用&#xff1b; 难点&#xff1a;机器学习算法及分类。 机器学习 - 重要性 MachineLeaning出…