screeps room memory似乎重置了每一个tick

时间:2016-11-28 21:35:31

标签: screeps

我正在尝试将链接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中删除它,它会返回到返回undefined。我在脚本中找不到任何可以重置房间内存的地方 是否有某种方式应该将内容添加到内存中并且我做错了?

2 个答案:

答案 0 :(得分:0)

您确定没有意外重置房间内存或意外将sourceLink字段设置为undefined吗?如果您将Memory对象中的字段设置为undefined,则实际上与delete Memory.<path>相同。

Memory对象在整个刻度中都是活着的,所以我怀疑这是游戏中的一个错误,因为几乎每个人都依赖于Room对象的memory属性。

答案 1 :(得分:0)

就像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)。通过这种方式,您可以在一个地方拥有所有基本功能,而无需在任何地方搜索所有基本内存。

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