Log In  

Hello everyone, I'm currently working on a platformer that is almost complete. The problem I have now is that I'm all out of flags. All the flags I set on different sprites are connected to certain mechanics. Now I need another one, and I'm out of ideas on how to do this. I love flags, I have overused them I feel. Any suggestions would be awesome! Thanks

P#37014 2017-02-01 15:47 ( Edited 2017-02-02 21:40)

are the features mutually exclusive in any way?

edit: i guess i should elaborate: if some of the features are never used together, it's possible you can use the flags for a more efficient binary encoding, if you aren't already doing so.

P#37016 2017-02-01 15:53 ( Edited 2017-02-01 20:59)

No, that's also the problem, I've tried setting a new sprite with 2 flags enabled, but then the logic of writing

if (fget(val, flag1) and fget(val,flag2)) then


enables both the effects of the flags.

P#37017 2017-02-01 15:59 ( Edited 2017-02-01 20:59)

do you need the lookups to be fast (done in a tight loop)? if not, you can have a lookup table indexed by the sprite number, like so:

sprite_features = {
 [0] = {'stationary', 'boss', 'deadly'},
 [1] = {'stationary', 'turret'},
 -- etc.
}

edit: this might even be fine in a tight loop if there are few sprites to check

edit 2: probably this is a better idea:

sprite_features = {
 [0] = {stationary=true, boss=true, deadly=true},
 [1] = {stationary=true, turret=true},
 -- etc.
}

later…

if sprite_features[the_sprite].boss then -- etc.
end

(also put previous code in code block)

P#37018 2017-02-01 16:05 ( Edited 2017-02-01 21:20)

Thank you so much! I'll give this a go tomorrow. I've been sitting way to long today!

P#37020 2017-02-01 16:48 ( Edited 2017-02-01 21:48)

enables both the effects of the flags.

That's how it should work. The correct way to then check for flags in the manner you want would be:

if fget(val, flag1) and not fget(val,flag2) then
 ---example: jump
elseif fget(val, flag2) and not fget(val,flag1) then
 ---example: swim
elseif (fget(val, flag1) and fget(val,flag2)) then
 ---example: run
end
P#37035 2017-02-01 20:07 ( Edited 2017-02-02 01:07)

You could also treat is as binary.

instead of:

0:10000000 .. fget(x,0)
1:01000000 .. fget(x,1)
2:00100000 .. fget(x,2)
3:00010000 .. fget(x,3)
4:00001000 .. fget(x,4)
5:00000100 .. fget(x,5)
6:00000010 .. fget(x,6)
7:00000001 .. fget(x,7)

use a binary representation:

0:0000[0000] .. fget(x,0)==false and fget(x,1)==false  and fget(x,2)==false and fget(x,3)==false and ...
1:1000[0000] .. fget(x,0)==true and fget(x,1)==false  and fget(x,2)==false and fget(x,3)==false and ...
2:0100[0000] .. fget(x,0)==false and fget(x,1)==true  and fget(x,2)==false and fget(x,3)==false and ...
3:1100[0000] .. fget(x,0)==true and fget(x,1)==true  and fget(x,2)==false and fget(x,3)==false and ...
4:0010[0000] .. fget(x,0)==false and fget(x,1)==false  and fget(x,2)==true and fget(x,3)==false and ...
5:1010[0000] .. fget(x,0)==true and fget(x,1)==false  and fget(x,2)==true and fget(x,3)==false and ...
6:0110[0000] .. fget(x,0)==false and fget(x,1)==true  and fget(x,2)==true and fget(x,3)==false and ...
7:1110[0000] .. fget(x,0)==true and fget(x,1)==true  and fget(x,2)==true and fget(x,3)==false and ...
8:0001[0000] .. fget(x,0)==false and fget(x,1)==false  and fget(x,2)==false and fget(x,3)==true and ...
... etc

So instead of seven layers, you have 256 layers

P#37045 2017-02-02 01:07 ( Edited 2017-02-02 06:08)

@josefnpat: that would give you 256 distinct values, not 256 on/off flags. this was the basic idea behind my suggestion: if some values never occur together, then they become an enumeration that you might be able to binary encode. if they all can occur together, you're out of luck and eight on/off flags is already as good as you can get.

P#37046 2017-02-02 01:23 ( Edited 2017-02-02 06:23)

@josefnpat: in that case you're better off using the full flag when you do the comparison:

if fget(x)==0 then

elseif fget(x)==1 then
...
elseif fget(x)==255 then

You could also store a second set of flags for all your sprites:

moreflags = {}
moreflags[1] = 1
moreflags[2] = 2
moreflags[4] = 3

Where the index is your sprite number and the value is your flag.

This is a function that allows you to read flags similar to fget:

function bitget(value, bitindex)
    return band(value, shl(1, bitindex)) != 0
end

you can also read flags in a variable like this:

band(g, 2) == 2

Where g is your variable, 2 is the total of the flags you want to check. If the flags that total 2 are set, then band returns the total of the flags, and the equation is true.

---8421 --flags
01 0001
02 0010
03 0011
04 0100
05 0101
06 0110
07 0111
08 1000
09 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111

Looking at this chart, if you wanted spot 4 and 2 to be true, then you total them together, 6, and you check band(variable, 6) == 6. If that is true, then flags 4 and 2 are set. I'm only showing 4 flags here, but you can work with a total of 16, but if you use all 16 then you have to contend with the positive and negative sign, which is what the last digit is for pico variables.

P#37072 2017-02-02 08:26 ( Edited 2017-02-02 13:52)

Thanks for all the answers! I managed to work this out in another way. I will be sure to use some of your ideas the next time I run into this problem.

P#37091 2017-02-02 16:40 ( Edited 2017-02-02 21:40)

[Please log in to post a comment]

Follow Lexaloffle:          
Generated 2024-04-18 22:45:45 | 0.009s | Q:26