【问题标题】:screeps room memory seems to reset every tickscreeps 房间的记忆似乎每刻都会重置
【发布时间】:2016-11-30 18:59:01
【问题描述】:

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

 Game.rooms.W45N28.memory.sourceLink = id 

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

Game.rooms.W45N28.memory.sourceLink = id

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

【问题讨论】:

  • 固定格式以提高可读性

标签: screeps


【解决方案1】:

您确定您不是不小心重置了房间的内存或将 sourceLink 字段设置为 undefined 吗?如果您将Memory 对象中的一个字段设置为undefined,您实际上与delete Memory.<path> 执行相同的操作。

Memory 对象在整个滴答声中都处于活动状态,所以我怀疑这是游戏中的错误,因为几乎每个人都依赖 Room 对象的 memory 属性。

【讨论】:

  • 我很确定我不是,即便如此,我还是尝试移动到一个完全没有代码的不同分支,只有一个主分支,它是空的,并且每次仍然重置我设置它。我还尝试将rooms.W45N28 放入内存监视列表并手动创建sourceLink 字段,但是一旦我重新加载它,它又回到未定义状态。顺便说一句,这发生在我所有的房间里,不仅 W45N28,而且房间是唯一发生的事情,其他一切的记忆都很好
【解决方案2】:

就像 Toolmaker 已经写的那样,它应该按照您的方式工作,并且应该存储房间内存。也许您尝试像Working with memory > Storing game objects 中提到的那样存储活动对象数据?
“Memory 对象用于存储 JSON 数据,不能包含活动对象引用。”

当然,我也使用房间内存,它的工作就像轻而易举。我设置了一次内存(请参见下面的示例),它将永远保存。


我正在为我的所有房间设置等使用特定模块“z.settings”。然后,每当我需要更改基本内容时,我都会在“z.settings”中执行此操作并让它更新所有内容。这是概念:

-- MAIN

// Make this true to update all settings globaly! Should be made false again afterwards to save CPU.
if (1 == 2) {
    var globalSettings = require('z.settings');
    globalSettings.update();
};

-- MODULE 'z.settings'

var myRooms = [
    { name: 'W45N28', active: true,
                    someData: {
                        abc: 1,
                        def: 2,
                        ghi: 3,
                    },
                    creepJob: {
                        amount_Harvester: 3,
                        amount_Upgrader: 3,
                        body_Harvester: [WORK,WORK,WORK,CARRY,MOVE,MOVE,MOVE],
                        body_Upgrader: [WORK,WORK,WORK,WORK,CARRY,CARRY],
                    },
    },
    { name: 'W45N29', active: false,
                    someData: {
                        zyx: 1,
                        wvu: 2,
                        tsr: 3,
                    },
                    creepJob: {
                        amount_Harvester: 5,
                        amount_Upgrader: 2,
                        body_Harvester: [WORK,CARRY,MOVE,MOVE],
                        body_Upgrader: [WORK,WORK,CARRY],
                    },
    },
];

module.exports = {
    update() {
        // Loop through all myRooms and process all active ones.
        for (i=0; i < myRooms.length; i++) {
            if (myRooms[i].active) {
                var room = Game.rooms[myRooms[i].name];
                // Write the memory of the current room.
                room.memory.someData = myRooms[i].someData;
                room.memory.creepJob = myRooms[i].creepJob;
                console.log('Updating settings for room ' + myRooms[i].name + '...')
            };
        };
        console.log('--- All settings have been updated!')
    },
};

如您所见,您只需将if 设置在主true 中,例如(1 == 1) 一勾即可更新所有内容,然后将其设置回false喜欢(1 == 2)。这样一来,您就可以将所有基础知识集中在一个地方,而无需到处搜索所有基础内存内容。


正如你所看到的,我更新了一次记忆,它会保持这种状态。所以它也应该对你有用!就像我说的,也许你尝试存储不应该存储的东西。

【讨论】:

  • 我只是想将对象 ID 存储为字符串,我可以在其他对象的内存中执行此操作,所以我应该能够存储它,但每次我这样做都会立即恢复为未定义,即使我完全没有代码在运行
  • 我喜欢设置模块的想法。但是为什么要把它存储在内存中呢?只需直接访问设置。
猜你喜欢
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 2015-01-19
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多