Two same objects show different result
-
I'm not seeing anything else wrong. I think I see what you're trying to do? And it should work?
I would start putting in console.logs all over to check the assumptions as the algo goes along. Somewhere it must be going off the rails.
-
-
maybe another ideas ?
-
Wanna know why programming is so hard? It's because it relies almost exclusively on a single skill: Problem solving.
The core of problem solving is to isolate the problem in the first place. Don't overly assume unless those assumptions are proven. Once an algo / section of code is nailed down and known to work, THEN you can compress it with assumptions and terse syntax. Not before.
From the screen shot, I can see that both bits of code (That produce different results.) are executing in the same tick. Ok, that's a set of assumptions that can be removed (The required array isn't changing mid stream.)
The lines of code that produce the results are different. Either the result was changed twice, or the line of code inside the loop is treated differently because it has an if statement wrapping it. Are there more than one source of: "roles['E59S58'].upgrader" ? If the answer is no, then the results should be the same and the error is you're overwriting the resulting value.
Start by losing the if around the first result test. If it's still different, then you have to work back in the loop, stretching out the code and logging out the intermediate results so they can be verified. Use "JSON.stringify(object);" to log out the contents of an object.
-
OK if you want to isolate problems, spam your console.
So replace your script with this and tell us what happens:"use strict"; let rolesRoom = require('roles'); let createRoles = {}; // here I am creating a new object with which it does not work for (let i in rolesRoom.rooms) { createRoles[rolesRoom.rooms[i].name] = rolesRoom.levels[rolesRoom.rooms[i].level]; } // let roles = createRoles; // if uncomment it will be new code let roles = rolesRoom.role; // Here i import old code // подсчитываем количество крипов в руме for (let spawnRoom in roles) { for (let roleName in roles[spawnRoom]) { roles[spawnRoom][roleName].currentQuantity = _.sum(Game.creeps, (c) => { let test = c.memory.role === roleName && c.memory.spawnRoom === spawnRoom; console.log("Test for creep: ",c.name," is ",toString(test)); return test; }); if (spawnRoom === 'E59S58' && roleName === 'upgrader') { console.log("Inside loop: ",roles['E59S58'].upgrader.currentQuantity); // old code - 0 // new code - 0 // if here old code it will be 0, and if will be new code it will be 0 } } } console.log("Outside loop: ", roles['E59S58'].upgrader.currentQuantity) // old code - 0 // new code - 1 (why????????????) // if here old code it will be 0, but if will be new code it will 1 why is this so ???
All I did is named your logs and added a additional inside the sum, will spam your console but should add clarity what is happening.
-
-
@smokeman here you can see the objects are completely identical, but show different results
I was thinking if you have the opportunity, maybe you could look with teamviawer?
-
It is quite obvious that something isn't working,
object Undefined
isn't a option, it should be eithertrue
orfalse
.
This means the boolian check above fails, replace the log with this one:console.log("role: ",c.memory.role," spawn: ", c.memory.spawnRoom," test: ",toString(test));
But honestly the way you are counting your creeps is very very inefficient.
You are iterating for each role in each room through your entire rooster of creeps:rooms * roles * creeps = CPU waste
You should instead iterate through your creeps once and count what they do in a fresh temporary object and use that to update your roles,
or better leave that temporary since it is a snapshot of the current tick anyway don't bother to save that.
-
@mrfaul ok then i try to change my code ! thank you
-
@mrfaul I started to count differently and the problem is the same, with the old way everything is fine, with the new problem)))))))) can say why?)))))
const createRoles = {}; for (const i in rolesRoom.rooms) { createRoles[rolesRoom.rooms[i].name] = rolesRoom.levels[rolesRoom.rooms[i].level]; } const roles = createRoles; // const roles = rolesRoom.role; // console.log(JSON.stringify(roles)) // подсчитываем количество крипов в руме for (const spawnRoom in roles) { for (const roleName in roles[spawnRoom]) { roles[spawnRoom][roleName].currentQuantity = 0; } } for (const i in Game.creeps) { const creep = Game.creeps[i]; roles[creep.memory.spawnRoom][creep.memory.role].currentQuantity += 1; if (creep.memory.spawnRoom === 'E59S58' && creep.memory.role === 'upgrader') { // console.log(creep.memory.spawnRoom) // console.log(creep.memory.role) console.log(creep) // we only come here once } } console.log(roles['E59S58']['upgrader'].currentQuantity) // here 4 why ?????????????
-
-
You might want to check if your room/role combination is valid and don't blindly trust the incremental operators, sometimes they behave wired for no apparent reason:
if( roles[creep.memory.spawnRoom] && roles[creep.memory.spawnRoom][creep.memory.role] ){ roles[creep.memory.spawnRoom][creep.memory.role].currentQuantity = roles[creep.memory.spawnRoom][creep.memory.role].currentQuantity + 1; }
But if that still dosn't work please dump your entire main somewhere like pastbin etc.
-
@mrfaul no it doesn't work )))))))))))))))) https://pastebin.com/AgCJZ4y6
-
Sorry for the late answser I was busy
hmm indeed I see nothing in there why it shouldn't work, but I have a idea why it could be buggy:
You only set the roles quantity to "0" but that doesn't guaranties that there are no wild "undefined" variables when you loop through your creeps.Try this:
for (const i in Game.creeps) { const creep = Game.creeps[i]; let currentQuantity = roles[creep.memory.spawnRoom][creep.memory.role].currentQuantity || 0; // use the saved variable or "0" ++currentQuantity; // increment roles[creep.memory.spawnRoom][creep.memory.role].currentQuantity = currentQuantity; // save if (creep.memory.spawnRoom === 'E59S58' && creep.memory.role === 'upgrader') { console.log(roles['E59S58']['upgrader'].currentQuantity) } }
Using this method you can also get rid of the additional for loop that only sets it to zero.
One thing less that takes up time.
-
@kepamuk @o4kapuk jo apparently the last picture:
http://dl4.joxi.net/drive/2020/01/31/0011/2711/772759/59/69625b05ca.jpg
Is contaminated with some malicious software and got flagged by our GData Enterprise Suite... So it could be that the host server or your private machine is compromised pls check that.
Update: Or GData is just beeing GData since I double checked it and only 2 out of 73 scanner flagged it.
Man that software is annoying, but better than nothing. At least it is doing it's job... sorta.