问题标签 [screeps]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1877 浏览

javascript - 在 Screeps 中,是否以允许编写 CPU 限制稳健代码的方式强制执行 CPU 限制?

在 Screeps 中,每个玩家对 CPU 的使用都是有限的,但是该功能的文档并没有说明强制执行此功能的方式足以编写 CPU 限制健壮代码。我考虑了以下四种可能性:


1、玩家的循环永不中断。

在一种极端情况下,玩家的内存反序列化、主脚本执行和内存重新序列化永远不会中断,超过 CPU 限制仅仅意味着玩家的循环将在后续滴答中被跳过,直到 CPU 债务被偿还。在这种情况下,CPU 限制健壮的代码并不是绝对必要的,但是检测玩家的循环何时被跳过并可能开始更有效地做事仍然很有用。这可以使用如下代码轻松实现:

这种管理玩家 CPU 使用率的方式很容易被无限循环滥用,我几乎可以肯定这不是 Screeps 的行为。

2.播放器的循环是原子的。

下一个可能性是玩家的循环是原子的。如果超过 CPU 限制,则玩家的循环被中断,但既不提交预定的游戏状态更改,也不提交对内存的更改。当检测到中断循环时提高效率变得更加重要,因为忽略它意味着玩家的脚本将无法更改游戏状态或内存。但是,检测中断的周期仍然很简单:

2.5. 对 Memory 的更改是原子的,但对 Game 对象的更改不是。

编辑:阅读RawMemory对象的文档后,我想到了这种可能性。如果脚本被中断,任何已经安排好的游戏状态更改都会提交,但不会提交对内存的更改。考虑到 RawMemory 提供的功能,这是有道理的,因为如果脚本在运行自定义内存序列化之前被中断,则会运行默认的 JSON 序列化,这会使自定义内存序列化更加复杂:自定义反序列化需要能够处理除了自定义序列化编写的任何格式之外的默认 JSON。

3. JavaScript 语句是原子的。

另一种可能性是播放器的循环不是原子的,但 JavaScript 语句是原子的。当玩家的循环因超过 CPU 限制而中断时,会提交不完整的游戏状态更改和内存更改,但需要仔细编码 - 进行 Screeps API 调用的语句必须将调用结果分配给内存键 - 游戏状态更改和内存更改不会相互不一致。为这种情况编写完全受 CPU 限制的健壮代码似乎很复杂——这不是我已经解决的问题,我想在尝试之前确定这是 Screeps 的真实行为。

4. 没有什么是原子的。

在另一个极端,甚至单个语句都不是原子的:将 Screeps API 调用的结果分配给内存中的键的语句可能会在调用完成和分配结果之间中断,并且不完整的游戏状态都会发生变化并且不完整的内存更改(现在彼此不一致)被提交。在这种情况下,编写 CPU 限制健壮代码的可能性非常有限。例如,尽管以下语句写入 Memory 的值的存在无疑表明 Screeps API 调用已完成,但它的缺失并不表明调用未完成毫无疑问:


有谁知道其中哪些是 Screeps 的行为?还是我没有考虑过的其他事情?文档中的以下引用:

CPU 限制 100 意味着在 100 毫秒后执行脚本将被终止,即使它还没有完成一些工作。

暗示它可能是案例 3 或案例 4,但不是很令人信服。

另一方面,模拟模式下的实验结果,其中包含单个蠕变、以下主循环,并在对话框中为无响应脚本选择“终止”:

是蠕变只在无限循环被跳过的滴答声上移动,因为 failedTicks 达到了它的阈值。这指向案例 2,但不是决定性的,因为模拟模式下的 CPU 限制与在线不同 - 它似乎是无限的,除非使用对话框的“终止”按钮终止。

0 投票
0 回答
419 浏览

javascript - Clojurescript 重复外部输入错误

我正在研究我的第一个“真正的”clojurescript 项目,但遇到了问题。

目标是将生成的 javascript 上传到https://screeps.com以玩该游戏。

我正在使用在screeps-beans commit 5930152找到的某人的外部/通用库的一个分支。这个 fork 的脚本/手表可以很好地构建它,并且据我所知似乎生成了适当的 javascript。

我创建了my-screeps commit 181a9da5,它使用 lein checkouts 来拉入 screeps-beans。它目前只是尝试将 println 打印到控制台(计划是让它最终包含我的游戏 AI 的所有逻辑,这些逻辑不足以进入 screeps-beans)。

我使用https://github.com/swannodette/mies生成脚本/并且遇到了重复的外部输入问题。

如果我使用脚本/构建,它似乎可以正常工作,但据我所知,对于https://screeps.com来说效果不佳。

如果我使用脚本/发布,我会得到:

发布脚本调用 clojurescript 编译器使用

我想我在 screeps-beans 或 my-screeps 的某个地方有错字或其他类似的误解,但我不知所措。

编辑:

我发现我可以通过将 extern 放入 my-screeps 而不是 screeps-beans 来完成这项工作。您可以通过查看screeps-beans commit 6b80c77my-screeps commit 636ab847 来了解它的外观。基本上我将资源目录和 src/deps.cljs 移到了我的屏幕上。

我认为这是一种解决方法,而不是实际答案。

0 投票
1 回答
242 浏览

memory - 如何将类变量存储在内存中?

我在这里阅读了其他一些关于它的问题,但我就是不明白。

我有一些变量在执行过程中会发生变化,所以我知道它们需要进入内存。

但它告诉我它cannot read property nHarvesters of undefined

如何制作自己的 screeps Memory 对象并使用它们?

0 投票
5 回答
5321 浏览

javascript - 如何在 Screeps 中生成带有前面名称标签的随机名称?

在 Programming Game Screeps 中,我使用以下方法生成小兵:

“未定义”标签用于生成具有随机名称的cree。现在我想知道,既然我有不同类型的小兵,我是否可以在它前面添加一个角色标签?例如,[Transporter] RandomName。

那可能吗?

0 投票
1 回答
205 浏览

javascript - 运行 screeps 脚本时出错

不知道“Screeps”?访问 screeps.com

它是主脚本中的 11 行

错误:

脚本 :

有什么建议么?

0 投票
1 回答
828 浏览

screeps - Screeps 建设者不收集能量

我修改了一些我的 role.builders.js 文件,让我的小兵首先检查产卵是否有能量,如果它没有收集能量来建造,否则从产卵中获取。这是我所拥有的:

关于我所缺少的任何建议?建造者被冻结在原地,即使它说他们正在移动到产卵区。

0 投票
1 回答
203 浏览

javascript - 将自定义对象保存到内存中的 Screeps 问题

我正在尝试将源 ID 和当前正在挖掘源的生成的 ID 保存到房间中当前生成下的内存中。保存后,我可以轻松地将矿工分配给每个来源,而无需执行 FIND_SOURCES。这样做会降低我的 CPU 使用率。

我当前的问题是它只保存源 ID 而不是我试图创建的自定义对象。任何有关纠正此问题的帮助将不胜感激。

这是我正在使用的当前代码:

0 投票
2 回答
964 浏览

screeps - screeps 房间的记忆似乎每刻都会重置

我正在尝试将链接 ID 存储在单独的房间内存中,但似乎内存在每个滴答声中都会重置。如果我运行:

在命令行中,然后立即调用Game.rooms.W45N28.memory.sourceLink,它返回undefined。但是,如果我添加

到 main 然后Game.rooms.W45N28.memory.sourceLink在命令行中调用,它会正确返回 id。但是,如果我随后将其从 main 中删除,它会返回返回 undefined。我在脚本中找不到任何会重置房间内存的地方。
是否有某种方式可以将内容添加到内存中而我做错了?

0 投票
2 回答
781 浏览

node.js - Screeps 私有服务器配置 init.d

我正在尝试为我的 screeps 私人服务器创建一个 init.d 脚本。我有几件事有问题。

  1. 我想用守护程序用户而不是 root 运行 screepsscreeps-daemon
  2. 我想确保它在正确的工作目录中运行。

使用initd-forever我生成了以下内容:

但我收到以下错误:

这可能是一些简单的事情盯着我的脸,但我现在看不到它。

0 投票
1 回答
220 浏览

javascript - 产卵器不会停止产卵收割机

我正在尝试根据我在 main 之前在变量中设置的设定数量限制在 main 中设置自动生成脚本。但是,由于某种原因,脚本执行异常。

脚本:

最后的控制台输出显示它按预期工作,但脚本执行忽略了 if 语句执行为假的事实。

[晚上 8 点 17 分 20 秒]假

[晚上 8 点 17 分 20 秒]2

[晚上 8 点 17 分 20 秒]9

[8:17:20 PM]收割机生成失败:-6

[晚上 8 点 17 分 23 秒]假

[下午 8 点 17 分 23 秒]2

(晚上 8 点 17 分 23 秒)10