Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function ListAllSets(minweight,maxweight: single):integer;
- //Переменные здесь и везде используются аккурат того размера, который будет нужен.
- //Оперативка лишней не бывает.
- var SetWeight: single;
- count,i1,i2,i3,i4:integer;
- HeadLength,BodyLength,HandsLength,LegsLength: byte;
- SpinValues: array [1..8] of integer;
- //t : TDateTime; //Использовалось для проверки скорости выполнения функции
- begin
- //t:=Now;
- //Обнуляем массив, маленький хак
- SetLength(megatable,0);
- //Переменная - счётчик длины MegaTable. Точно лучше, чем дёргать high().
- count:=0;
- //Выводим значения спинэдитов в отдельные переменные, чтобы не трогать форму из цикла.
- SpinValues[1]:=Form1.SpinEdit1.Value;
- SpinValues[2]:=Form1.SpinEdit2.Value;
- SpinValues[3]:=Form1.SpinEdit3.Value;
- SpinValues[4]:=Form1.SpinEdit4.Value;
- SpinValues[5]:=Form1.SpinEdit5.Value;
- SpinValues[6]:=Form1.SpinEdit6.Value;
- SpinValues[7]:=Form1.SpinEdit7.Value;
- SpinValues[8]:=Form1.SpinEdit8.Value;
- //Заранее вычисляем нужные нам количества интеракций
- HeadLength:=length(head)-1;
- BodyLength:=length(body)-1;
- HandsLength:=length(hands)-1;
- LegsLength:=length(legs)-1;
- //Начинаем циклы.
- //Тут я составляю список всех возможных сочетаний кусков брони, находящихся в
- // распоряжении игрока, с ограничениями в максимуме веса. Это часть калькулятора для
- // оптимизации персонажа.
- //Я пренебрёг оптимизацией развилок - отбрасывание целых ветвей потенциальных
- // вычислений показалось мне более эффективным
- for i1 := 0 to HeadLength do
- if head[i1].Active then //Нам не нужно вычислять комбинации для того, чего у игрока нет
- for i2 := 0 to BodyLength do
- if body[i2].Active then
- for i3 := 0 to HandsLength do
- if hands[i3].Active then
- for i4 := 0 to LegsLength do
- if legs[i4].Active then
- begin
- //Вычисляем вес сета заранее, чтобы не делать это несколько раз.
- SetWeight:=head[i1].Weight+body[i2].Weight+hands[i3].Weight+legs[i4].Weight;
- //Оптимальный вариант, как правило, очень близко к maxweight -
- // так что мы отбрасываем слишком далёкие значения с помощью minweight
- // (он вычисляется в другом месте)
- if (SetWeight<maxweight) and (SetWeight>=minweight) then
- begin
- //Увеличиваем длину динамического массива
- SetLength(megatable,count+1);
- //MegaTable - это массив кастомных записей (record)
- //with даёт нам чуточку производительности
- with megatable[count] do
- begin
- //Записываем id предметов, составляющих сет
- id1:=i1;
- id2:=i2;
- id3:=i3;
- id4:=i4;
- //Вычисляем насколько сет нам подходит - перемножаем чистые статы на наши приоритеты
- quality:=(SpinValues[1]*(head[i1].Physical+body[i2].Physical+hands[i3].Physical+legs[i4].Physical))
- + (SpinValues[2]*(head[i1].Striking+body[i2].Striking+hands[i3].Striking+legs[i4].Striking))
- + (SpinValues[3]*(head[i1].Slashing+body[i2].Slashing+hands[i3].Slashing+legs[i4].Slashing))
- + (SpinValues[4]*(head[i1].Thrusting+body[i2].Thrusting+hands[i3].Thrusting+legs[i4].Thrusting))
- + (SpinValues[5]*(head[i1].Magic+body[i2].Magic+hands[i3].Magic+legs[i4].Magic))
- + (SpinValues[6]*(head[i1].Fire+body[i2].Fire+hands[i3].Fire+legs[i4].Fire))
- + (SpinValues[7]*(head[i1].Lightning+body[i2].Lightning+hands[i3].Lightning+legs[i4].Lightning))
- + (SpinValues[8]*(head[i1].Dark+body[i2].Dark+hands[i3].Dark+legs[i4].Dark));
- //Переиспользуем уже вычесленный вес
- Weight:=SetWeight;
- end;
- //Немножко хороших привычек кодинга
- inc(count);
- end;
- end;
- //Form1.Label26.Caption:=FormatDateTime('hh:nn:ss:zzz', Now-t);
- //Возвращаем счётчик как результат - точно лучше, чем лишний раз дёргать high().
- result:=count;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement