Title. On the surface this seems simple enough, “if [variable] == [string] or [string]:” and the like - Godot runs this code without errors. For some reason however, this if statement will accept any value for the variable rather than one of the two listed options. I really don’t understand why this could be and haven’t been able to find any clear documentation on the matter - could someone explain to me how to use “or” in an if statement?
I don’t typically use GDScript, but generally if you want to check for multiple values, you’d do the following:
If (variable == value || variable == differentValue)
It you need to compare multiple things in a similar manner, I recommend using a switch statement instead, and simply grouping multiple possible values together, such as:
switch(variable)
case value:
case differentValue:
code()
The reason you don’t see an error with this is because you aren’t comparing [stringB] with [variable]. [stringB] is compared to ""(empty string) and if it isn’t "" (empty string) the condition will return true.
The comparison you had set up is the equivalent of: if [variable] == [stringA] or [stringB] != "":
if (conditionA) (logical operator) (conditionB)
The conditions in an if statement are independent of one another.
conditionB has nothing to do with conditionA
extends Node2D
var one = 0
var sone = [0,1,2,3,4]
var mas = 0
var can = 0
@onready var rol = $Icon
func _process(_delta):
if one == 1 or 3: # Odds
mas += 1
rol.translate(Vector2(-2, 0))
if one == 2 or 4: # Evens
can += 1
rol.translate(Vector2(2, 0))
if one > 2 and 3: # Will avoid 1 and 2
rol.rotation -= 0.1
if mas == 100: # This must be true!
mas = 0
rol.translate(Vector2(200, 0))
if can == 100: # This must be diffenrent
can = 0
rol.translate(Vector2(-200, 0))
elif one == 0:
$Timer.start() # I assume this will be true.
func _on_timer_timeout():
sone.pick_random()
one = sone
What are we to discern from this? Nearly every if statement is incorrect, like the original question using or incorrectly by assuming it will compare to the previous value.
This does not get odd numbers, it will always evaluate to true. Same issue OP was having, or does not do equivalence.
Again not evens, same issue with above
and has the same error as above, so this is equivalent to if one > 2 and true:, reduced further if one > 2: It does avoid numbers 1 and 2, but the 3 is very confusing.
Not sure why “This must be true!”, given the example mas is increasing every physics tick
Again not sure why “This must be different” can actually will increase at the same rate as mas so they will both be equal to 100 at the same time
strings and ints are treated implicitly as booleans if used in logical expressions by themselves. Similar to python
func _ready():
var x:String="abc" # false
var y:String="" # true
var a:int=0 # true
var b:int=1 # false
prints(!x, !y, !a, !b)
prints(x.is_empty(),y.is_empty(),!bool(a),!bool(b))
print("not empty" if y else "empty")
print("not empty" if x else "empty")
pass
extends Node2D
var timer := Timer.new()
var coorporate_ties = 0
var coorporate_tides = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
var low = 0
var wager = 0
var high = false
var you = false
var me = false
var who_sponsored_this = true
signal timeout
func _ready():
add_child(timer)
timer.start()
timer.connect("timeout",self._on_timer_timeout)
func _process(_delta):
coorporate_ties = coorporate_tides.pick_random()
timer.wait_time = coorporate_ties * 1
if who_sponsored_this == false:
get_tree().quit()
if wager > 500000:
if wager > low:
you = true
if you == true:
who_sponsored_this = false
if me == true:
who_sponsored_this = false
if low < 500001:
me = false
if low > 500000:
me = true
else:
you = false
if coorporate_ties > 11:
high = true
if coorporate_ties < 11:
high = false
func _on_timer_timeout():
if high == true:
low += 1
wager += 1
print(high)
print(low)
print(wager)
print(you)
print(me)
print(who_sponsored_this)
Just comments/suggestions because I don’t get logic here.
if wager > 500000:
if wager > low:
you = true
if you == true:
who_sponsored_this = false
if me == true:
who_sponsored_this = false
Could above be simplified to as below?
if wager > 500000 and wager > low:
you = true
if you or me:
who_sponsored_this = false
Also this
if coorporate_ties > 11:
high = true
if coorporate_ties < 11:
high = false
what happens above when corporate_ties is 10?
Also what does this below logic mean? Overlapping ranges?
if low < 500001:
me = false
if low > 500000:
me = true
else:
......
One other comment when testing booleans true/false, sometimes it makes more sense to just not compare it to true or false. Depending on the variable name it’s easier to read.
E.g.
if high == true:
low += 1
can be
if high:
low += 1
Also the variable name who_sponsored_this should it be renamed to any_sponsors ? who implies specific (so not a boolean), any implies you don’t care as long as someone is sponsoring.
So the code:
if who_sponsored_this == false:
get_tree().quit()
becomes
if !any_sponsors: # or not any_sponsors
get_tree().quit()
Edit: Sorry I thought you had a code sample you were trying to reduce, I think gionggone’s post is almost off topic. but there are a lot of relevant or usages as you pointed out.
This is correct, and is the same as a nested if statement
If coorporate_ties is 10, that is less than 11 so high will be false.
If coorporate_ties is exactly 11 then high will not be changed, the previous value will remain.
If this is not what you want you can reduce this expression like so, booleans can be assigned conditions directly.
high = coorporate_ties >= 11
There isn’t an overlapping range in this example. if low is equal to 500_000 then me will be false.
Again this could be reduced to a assignment.
me = low > 500_000
The else: ... is concerning though, as it is only tied to low > 500_000, that else will trigger if the first condition low < 500_001 is met. You might have wanted to use elif to only run one of the branches.
I would agree with this entirely. Again you can reduce any_sponsors to an assignment, this time using an or just like an if statement would, if either you or me is true, then it will evaluate to true
any_sponsors = you or me
I like if not any_sponsors: more, but the bang ! works just as well.
if low < 500001:
me = false
if low > 500000:
me = true
else:
It’s compared to MATCH. It must be ran at least enough time to be flipped 500,000 but the ratio must be above 0.5. And this argument compares that with low and wager. But, it’s also not true waht you are trying to say. Because godot makes it impossible to test it as a current bool is false. so it’s safer to apply that argument to make sure it’s false.
I could have as well started this topic. For the course of relevancy. Because on related topics of C++ -and is used more as Current_Event trading. So is the term -or. Why exactly the topics of C++ reserved the function to -snd as used for Current_Event overflow. Excuse me if I don’t understand the used -and & -or in Godot Script.
Not sure what you asking here. (Are you talking about short circuiting? ) They are exactly the same as C++ and any other language on the planet as long as they follow the same precedence rules. Also you can use && and || in gdscript if you so desire.
variable > -5 || variable < 5
will result in true in every instance…It ‘looks’ likes you a defining a range between -5 and 5, but in reality anything greater than -5 will result in a true, and anything less than 5 will result in a true for one or the other cases, therefore the expression is always true.