Короткий changelog
1) DWS. Очень мощный Pascal скриптовый движок. Умеет практически все из современного, включая лямбды, type helpers и все такое. Конечно же классы, methods overloads, namespaces, и прочее, прочее. Подробности будут потом в статьях на сайте, кому интересно уже сейчас - изучать тесты с DWS репы - тут. Впрочем, самое интересное описал ниже.
Специально для стелса я сделал совершенно всеядный AddToSystemJournal. Любое количество параметров, любой тип параметров - принимается всё, склеится в строку и выдаст в sysjournal.
Очень вкратце кусками кода:
Code: Select all
TTestClass = class
class var z : Word;
ffff : byte;
constructor Create (aa : Byte);
begin
ffff := aa;
end;
end;
var cl: TTestClass;
TTestClass.z := 654;
cl := TTestClass.Create(5);
AddToSystemJournal(cl);
Code: Select all
AddToSystemJournal(StealthInfo());
Code: Select all
AddToSystemJournal('FindDistance=',FindDistance);
Code: Select all
var GI : TGumpInfo;
GetGumpInfo(0,GI);
AddToSystemJournal('GI=',GI);
Code: Select all
var fs : TTileDataFlagSet;
fs := [tsfTranslucent, tsfWall,tlfPrefixAn];
AddToSystemJournal(fs);
Code: Select all
AddToSystemJournal(ViberMessenger);
Code: Select all
var arr : array of String;
arr := GlobalChatChannelsList;
AddToSystemJournal(arr);
Code: Select all
var xz : array[0..4] of Word = [-1,-1, 9, 8, 7];
AddToSystemJournal(xz);
задавание значений переменных при обьявлении, обьявление переменных в любом месте в коде (НО! переменные, обьявленные НЕ в секции var - будут не видны при отладке скрипта, на выполнение скрипта не влияет.), куча "магических методов", например методы для массивов типа
Code: Select all
var
dynarr : array of String = ['tt1','tt2','tt3'];
dynarr22 : array of String;
gg : Integer;
PP : Boolean;
dynarr22 := ['tt3','tt2','tt1'];
dynarr22 := dynarr.Copy();
AddToSystemJournal(dynarr22);
gg := dynarr.IndexOf('tt2');
AddToSystemJournal(gg);
PP := dynarr.Contains('tt2');
AddToSystemJournal(PP);
AddToSystemJournal(dynarr.length);
сортировка, да куча там всего.
Type&Class Helpers, как встроенные так и свободно создаваемые скриптописателем.
Например,
Code: Select all
var
a : String;
i : Integer;
i := DaysBetween(Now, IncWeek(Now,1));
a := i.tostring;
Все magic методы и хелперы, так же как и методы-свойства классов и поля для records - показываются в Code Completion окне при нажатии точки после переменной (если в настройках стелса выбран DWS).
Operators overload, case по обому простому типу (Integer, Float, Boolean, String), enumerations - по массивам и т.д., overload + overrides, for...in, c-like операторы типа " i *= 2; ", лямбды (анонимные методы) и куча прочего.
Фанатам JSON будет легко и приятно:
Code: Select all
var Oggetto := JSON.NewObject;
Oggetto.Dati := JSON.Parse('{"Campo":{"IDValue":5}}');
AddToSystemJournal(Oggetto);
var v := JSON.Parse('{"hello":"world","one":1,"half":0.5,"yes":true,"no":false}');
2)Редактор. Помимо описанного в кратком списке, сделана мощная связка с DWS. Это дает:
- компиляция на ходу - показ ошибок уже при написании кода
- прыжки по коду (к декларации переменной, класса и т.д. и обратно)
- новое окно Code Completion (то, что вызывается по Ctrl+Space, точкой или из меню) - показывает все возможные варианты от DWS, включая "магические" методы массивов, методы для типов от type helpers, методы и пропы класса, и прочее, прочее.
- при отладке показ "рабочих" строк кода (зелеными точками слева), сразу понятно куда можно ставить бряки (break points), а куда - бесполезно.
Редактор виндового стелса и FMX (Linux, MacOs и пр.) теперь почти идентичны, что сильно упрощает работу с разными платформами.
Переделано меню, и обычное, и всплывающие по правому клику.
3) По скриптам:
- в PS и в DWS прокинуты из стелса обьекты ObjectsCollection и TypesCollection.
Их вид такой:
TTypePair = record Key : String; Value : Word; end;
TTypePairs = array of TTypePair;
TNamesCollection<T> = class
public
Dict : TDictionary<String, T>;
property Items[Name : String]: T; default;
published
procedure Remove(Name : String);
function Contains(Name : String) : Boolean;
procedure Clear;
function ToArray : TArray<TPair<String, T>>;
procedure FromArray(AItems : TArray<TPair<String, T>>);
function Count : Integer;
end;
TObjectsCollection = class(TNamesCollection<Cardinal>)
public
procedure Add(Name : String; Value : Cardinal); override;
end;
TTypesCollection = class(TNamesCollection<Word>)
public
procedure Add(Name : String; Value : Word); override;
end;
пример:
Code: Select all
ObjectsCollection.Add('sss',$ABCDEF); //PS & DWS
UseObject('sss'); //DWS only
UseObject(ObjectsCollection.Items['sss']); //PS & DWS
- overload методы в DWS:
function GetIgnoreList : TArray<Cardinal>;
function GetGumpTextLines (GumpIndex : Word) : TArray<String>;
function GetGumpFullLines(GumpIndex : Word) : TArray<String>;
function GetGumpShortLines(GumpIndex : Word) : TArray<String>;
function GetGumpButtonsDescription(GumpIndex : Word) : TArray<String>;
function GetShopList: TArray<String>;
function GetContextMenu: TArray<String>;
function PartyMembersList: TArray<Cardinal>;
function GetMenuItems: TArray<String>;
function GetLastMenuItems: TArray<String>;
function GetMultis: TArray<TMultiItem>;
function GlobalChatChannelsList: TArray<String>;
function HTTP_Post(URL : String; PostData : String) : String;
Methods MoveXY, newMoveXY, MoveXYZ in DWS have new last optional param - "StepCallback : TMoverStepCallBack = nil"
where
TMoverStepCallBack = function (PresentX : Word, PresentY : Word, PresentZ : ShortInt) : Boolean;
calling on EACH step with PRESENT char position, not predicted. If need to stop - set Result to False.
- дефайны в PS и DWS для совместимых скриптов
Пример:
Code: Select all
{$IFDEF DWSCRIPT}
AddToSystemJournal(GlobalChatChannelsList);
{$ELSE}
TL := TStringList.Create;
GlobalChatChannelsList(TL);
if TL.Count > 0 then
for i := 0 to TL.Count - 1 do
AddToSystemJournal(TL[i]);
TL.Free;
{$ENDIF}
DWS должен быть почти полностью совместимым с PS (кроме чуть более строгого синтаксиса касательно ; в конце строк, где оно надо), поэтому все найденные отличия я убираю.
Так что проверяйте свои скрипты в DWS , если что-то не так - пишите мне в Дискорд, не стесняйтесь.
P.S.
Кто использует шарды с ShardType, отличающимся от Default - вы получите сообщение в духе "проверьте Shard settings" - их действительно надо глянуть, есть шанс для некоторых типов шардов, что слетит.
P.P.S. Официально подтверждаю, что в стелсе есть ошибка, точнее повреждение памяти. Если найдется тот, кто сможет повторить ошибку по желанию - пишите. Я гонял 20 чаров под большой нагрузкой 4 дня, и на x86 стелсе, и на x64 - ошибки не было ни разу, притом что у хозяина чаров ошибка вылетала часов за несколько. Почему у меня не повторяется - вопрос вопросов.
И да, присланные ошибки из 9.2 не буду смотреть вообще, потому что поменялось столько всего, что старые ошибки просто неприменимы к текущему коду.