Tego kodu jest trochę za dużo, żeby przeanalizować, zwłaszcza, że większość zmiennych nie ma w sumie w przypadku tego pytania związku z sednem problemu (tworzenie krwi, wybranie armora).
Spójrz na pętlę z WhatSee. Tam jest takie fajne sprawdzanie po kolei na typach obiektów i JEŚLI zaszła kolizja z danym typem obiektu, to wtedy wybierane jest state (i pętla jest kontynuowana!!!!), ale jeśli nie, to state zmienia się na "idź na środek".
} else {
show_debug_message("----------------------------NO COLLISION GO TO MIDDLE");
ActualState = WarriorState.GoToMiddle;
}
Wygląda więc tak, że możesz w jednej pętli znaleźć Enemy[0], ale wtedy nadal sprawdzisz Enemy[1], potem nie znajdzie Enemty[2] więc state będzie na GoToMiddle, ale potem pętla nadal szuka pozostałych obiektów i np. jeśli jest kolizja z o_DroppedHealPotion to do niego podejdzie, a jak nie to znów trafi na state GoToMiddle.
Błąd polega więc na tym, że po pierwsze pętla przechodzi wszystkie typy obiektów i nie jest kończona, gdy znajdziesz kolizje, a po drugie, że state ustawia się na GoToMiddle za każdym razem, jak jednego z typów obiektów nie znajdzie (i kolejny typ może to nadpisać).
Rzeczy, które można by zrobić to:
a) wyjście z pętli for (WhatSee) jak zmieniono state
b) ustawienie state na GoToMiddle przed pętlą, żeby pętla ewentualnie nadpisała ten stan, wtedy nie będzie potrzebny ten else (można też zrobić wariant z dodatkową zmienną tymczasową, która sprawdza, czy została znaleziona jakaś kolizja i jeśli nie, to wtedy ustawia GoToMiddle, nie ma tutaj to większego znaczenia, chodzi jednak o to, żeby to nie był else na każdym typie tego co przeszukujesz w pętli WhatSee).
Może napiszę nieco jaśniej jak rozumiem Twoją pętlę:
var search = [obj_enemyA, obj_enemyB, obj_healhtpack, obj_item];
for(var i = 0; i < array_length(search); i++) {
if (collision_circle(...)) {
state = <zrob_cos>; // to by się przydał break; w pętli :)
} else {
state = <idz_na_srodek>;
}
}
I powinno być widać problem. Jeśli np. istnieje obj_enemyA, a nie istnieje obj_item, to zawsze state będzie wybrany, aby iść na środek
Np. coś w ten deseń:
var search = [obj_enemyA, obj_enemyB, obj_healhtpack, obj_item];
state = <idz_na_srodek>; // domyślny, pętla go ewentualnie nadpisze
for(var i = 0; i < array_length(search); i++) {
if (collision_circle(...)) {
state = <zrob_cos>;
break;
}
}
Myślę, że gdyby w debuggerze postawić breakpoint, to byś to bez problemu znalazł
Btw. do celów debugowych string(NearObj.object_index) zamienić można chyba na object_get_name(NearObj.object_index)