Page 1 of 1

Range chcek error

Posted: Sat May 06, 2017 1:23 pm
by Don Hard
Czas na kolejną łatwą rzecz, którą nie ogarniam.

No więc zaprogramowałem sobie, aby komputer po pewnym czasie stworzył w swojej fabryce pojazd, który:

Będzie miał podwodzie śr. lub cięż. gąsienicowe
Będzie sterowany komputerowo.
Będzie miał silnik spalinowy
Jego bronią będzie podwójne działo lub wyrzutnia rakiet.
Jednak po wyprodukowaniu pojazdu gra mi wywala Range Check Errora.

Mój kod (przepraszam za ten burdel, jeszcze się uczę pewnych spraw)

Code: Select all

EXPORT RandVeh;
EXPORT function CreateRandVeh;
begin
CreateRandVeh;
Wait(0$10);
SetResourceType(GetBase(W2),mat_cans,1000);
RandVeh=(FilterAllUnits( [ [f_engine, engine_combustion],[f_side,8],[f_chassis,us_medium_tracked,[f_or],us_heavy_tracked],[f_control,control_computer],[f_weapon,us_double_gun,[f_or],[f_weapon,us_rocket_launcher] ]]));
enable;
end;

every 1$30 marked 002 do
begin
ComConstruct(F3,vc_chassis=[Rand(us_medium_tracked,us_heavy_tracked)],vc_control=control_computer,vc_engine=engine_combustion,vc_weapon=[Rand(us_double_gun,us_rocket_launcher)]);
ComMoveToArea(RandVeh,RandVehArea);
end;

EXPORT function RandAttack;
begin
RandAttack;
if (FilterAllUnits( [ [f_engine, engine_combustion],[f_side,8],[f_chassis,us_medium_tracked,[f_or],us_heavy_tracked],[f_control,control_computer],[f_weapon,us_double_gun,[f_or],[f_weapon,us_rocket_launcher] ]])) > 8 then
ComMoveToArea(FilterAllUnits( [ [f_engine, engine_combustion],[f_side,8],[f_chassis,us_medium_tracked,[f_or],us_heavy_tracked],[f_control,control_computer],[f_weapon,us_double_gun,[f_or],[f_weapon,us_rocket_launcher], ]]),Attack);
enable;
end;




Zapewne znów chodzi o jąkąś błahostkę, a ja nie mogę jej zobaczyć.
Z góry dziękuję za pomoc. :amhello:

EDIT: A jeśli kod jest bezsensowny... no to cóż... uczę się troszku jeszcze.

Re: Range chcek error

Posted: Tue May 09, 2017 8:55 pm
by 0dd1
f_or używa się tak: [f_or, [f_chassis, us_medium_tracked], [f_chassis, us_heavy_tracked] ] i tak samo z f_and, albo f_not

ten pierwszy nawias przy definiowaniu RandVeh chyba nieotrzebny. zrób po prostu: RandVeh = FilterAllUnits();
do tego pamiętaj że filter zwraca listę, więc żeby namierzyć pojedynczą jednostkę musisz sprecyzować że chodzi o pierwszą jednostkę w tej liście. Dodaj [1] na końcu: RandVeh = FilterallUnits()[1];

przy ComConstruct:
zamiast vc_control=control_computer wystarczy samo control_computer. Te od "vc_" używa się tylko przy funkcji Createhuman/vehicle/building

zajrzyj do Tools -> Identify w oknie saila. W constants znajdziesz us_double_gun i us_rocket_launcher jako 5 i 7, a pomiędzy nimi (6) jest jeszcze us_heavy_gun. Czyli rand(us_double_gun, us_rocket_launcher) to to samo co rand(5,7), i może ci wypaść 6.
Jeśli chcesz wybrać tylko pomiędzy działem i rakietą to tak: [us_double_gun, us_rocket_launcher][rand(1,2)]

A to:

EXPORT function RandAttack;
begin
RandAttack;

to jakaś incepcja. Nie wywołuj funkcji w niej samej. To samo z enable - raczej tylko do bloków every. Poza tym, jeśli już chcesz zrobić pętlę to musi mieć jakieś wait() bo inaczej zablokuje ci grę.
Generalnie powinieneś własne funkcje traktować jak te które sail już ma, jak ComConstruct albo FilterAllUnits. Czyli:

every 0$1 do
begin
RandAttack;

enable;
end;

to będzie wykonywać twoją funkcje bez końca.

Re: Range chcek error

Posted: Wed May 10, 2017 5:33 am
by Don Hard
No jak mówiłem trochę przekombinowałem ten kod, a jako że nie umiałem tego za bardzo zrobić, to chociaż spróbowałem i jak widzę wcale nie tak dużo muszę poprawiać. Tak czy inaczej dziękuję za pomoc. :wink: