0

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

4

2 回答 2

0

就像 Toolmaker 已经写的那样,它应该按照您的方式工作,并且应该存储房间内存。也许您尝试存储活动对象数据,如使用内存 > 存储游戏对象中所述?
“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在 MAINtrue中设置(1 == 1) 一个刻度即可更新所有内容,然后将其设置回false类似(1 == 2). 这样一来,您就可以将所有基础知识集中在一个地方,而无需到处搜索所有基础内存内容。


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

于 2016-11-30T10:59:01.080 回答
0

您确定您不会意外重置房间的内存或将 sourceLink 字段设置为undefined意外吗?如果你在Memory对象中设置一个字段,undefined你实际上是在做与delete Memory.<path>.

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

于 2016-11-29T14:13:51.637 回答