Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Ассоциативные массивы

тут можно задать вопрос по скриптингу
Post Reply
zmmr
Posts: 9
Joined: 29.12.2015 19:17

Ассоциативные массивы

Post by zmmr »

Приветствую вас уважаемые форумчане!

Подскажите пожалуйста, может ли стелс использовать ассоциативные массивы как, например в PHP

В скриптах - примерах я видел только такую конструкцию

Code: Select all

CityName : array[1..4] of String;
procedure InitCityNames;
begin
  CityName[1] := 'Town Center';
  CityName[2] := 'Britain';
  CityName[3] := 'Bucs Den';
  CityName[4] := 'Cove';  
end;
А хотелось бы создать и использовать в нужном месте что-то наподобие этого (какой будет синтаксис для стелса не знаю):

Code: Select all

CityName[1] = array(
   'pointOfTeleporter' => array('X'=>1535,'Y'=>1325,'Z'=>0),
   'pointsOfVendors'=>array(
       1 => array('X'=>1535,'Y'=>1325,'Z'=>0),
       2 => array('X'=>1545,'Y'=>1323,'Z'=>0),
   )
)
доступ к значению массива как-то так:

Code: Select all

CoordX = CityName[1]['pointsOfVendors'][1]['X'] = 1535;
Можно ли такое сделать ?
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Ассоциативные массивы

Post by drabadan »

zmmr wrote:Приветствую вас уважаемые форумчане!

Подскажите пожалуйста, может ли стелс использовать ассоциативные массивы как, например в PHP

В скриптах - примерах я видел только такую конструкцию

Code: Select all

CityName : array[1..4] of String;
procedure InitCityNames;
begin
  CityName[1] := 'Town Center';
  CityName[2] := 'Britain';
  CityName[3] := 'Bucs Den';
  CityName[4] := 'Cove';  
end;
А хотелось бы создать и использовать в нужном месте что-то наподобие этого (какой будет синтаксис для стелса не знаю):

Code: Select all

CityName[1] = array(
   'pointOfTeleporter' => array('X'=>1535,'Y'=>1325,'Z'=>0),
   'pointsOfVendors'=>array(
       1 => array('X'=>1535,'Y'=>1325,'Z'=>0),
       2 => array('X'=>1545,'Y'=>1323,'Z'=>0),
   )
)
доступ к значению массива как-то так:

Code: Select all

CoordX = CityName[1]['pointsOfVendors'][1]['X'] = 1535;
Можно ли такое сделать ?
Насколько я знаю не поддерживает. Можно создавать свои типы и там крутить уже как хочешь, вот грубая реализация:

Code: Select all

Program New;
 
type
 TCity = record
  Title: String;
  PointOfTeleporter: Array of TPoint;
  PointsOfVendors: Array of TPoint;
 end;           

var 
 Cities: Array of TCity;
 i, k : Integer;

begin
 SetLength(Cities, Length(Cities) + 1);
 Cities[High(Cities)].Title := 'Britain';
 
 SetLength(Cities[High(Cities)].PointOfTeleporter, Length(Cities[High(Cities)].PointOfTeleporter) + 1);
 Cities[High(Cities)].PointOfTeleporter[High(Cities[High(Cities)].PointOfTeleporter)].X := 1000;
 Cities[High(Cities)].PointOfTeleporter[High(Cities[High(Cities)].PointOfTeleporter)].Y := 1000;
 
 SetLength(Cities, Length(Cities) + 1);
 Cities[High(Cities)].Title := 'Yew';
 
 SetLength(Cities[High(Cities)].PointOfTeleporter, Length(Cities[High(Cities)].PointOfTeleporter) + 1);
 Cities[High(Cities)].PointOfTeleporter[High(Cities[High(Cities)].PointOfTeleporter)].X := 2000;
 Cities[High(Cities)].PointOfTeleporter[High(Cities[High(Cities)].PointOfTeleporter)].Y := 2000;
 
 AddToSystemJournal('Start');
 
 for i := Low(Cities) to High(Cities) do
  begin
   AddToSystemJournal(Cities[i].Title + ' ' + IntToStr(Length(Cities[i].PointOfTeleporter)));
   for k := Low(Cities[i].PointOfTeleporter) to High(Cities[i].PointOfTeleporter) do
    AddToSystemJournal(IntToStr(Cities[i].PointOfTeleporter[k].X) + ' ' + IntToStr(Cities[i].PointOfTeleporter[k].Y));
  end;                                                                                            
  
  AddToSystemJournal('EOF'); 
end.
zmmr
Posts: 9
Joined: 29.12.2015 19:17

Re: Ассоциативные массивы

Post by zmmr »

Жесть =)

Попробую разобраться, спасибо за ответ
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Ассоциативные массивы

Post by drabadan »

zmmr wrote:Жесть =)

Попробую разобраться, спасибо за ответ
ну мой пример для динамических массивов, если массив с фиксированной длинной - там проще вроде. Но сама система такая же как и любом языке поддерживающем ООП, то-есть тип наследуется от объекта и расширяется полями и методами, только тут нет конструкторов и наследования и перегрузок. Вообщем, синтаксис похож, если вы знакомы - разберетесь без проблем.
Вот кусок скрипта на ламбер я там намеренно использую удлинение кода, но для пущей организованности мне так больше нравится, к тому еще если писать оллиноне, то-есть без инклудов а всовывать все в 1 файл, то мне кажется лучше глобальные системы сегментировать на подсистемы код длиннее, но читабельнее. Хотя на вкус и цвет все соглашения и конвенции разные.
скрипт

Code: Select all

{$Region 'Declaration of specific types'}
type 
 TTree = record
  Tile : Word; 
  X,Y,Z : Integer;
  WhenChopped : TDateTime;
  DistanceToChest : Word;    
 end;
  
type
 TLootItem = record
  TypeOf : Word;
  Color : Word;  
  Name : String; 
  SessionCount : Integer;
 end;
  
type
 TUnloadChest = record
  X,Y : Integer;
  Id : Cardinal;
 end;
  
type
 TConstants = record
  UnloadChest : TUnloadChest;  
  TrashBarrel : Cardinal;
  ThrowAwayItems : Array of Word;
  HatchetsTypes : Array of Word;
 end;
 
type
 TRessurrecter = record
  Name : String;
  Id : Cardinal;
  ApproxX, ApproxY : Integer;
 end;
    
 type
 TForestSpot = record
  X,Y : Integer;
  Name : String;
 end;
 
type
 TSessionHarvestedData = record
  StartTime : TDateTime;
  LootItems : Array of TLootItem;
 end;  
 
type
 TLumberjackerData = record
  Constants : TConstants;
  SessionHarvestedData : TSessionHarvestedData;
  Trees : Array of TTree;   
  ForestSpots : Array of TForestSpot;  
  Ressurrecters : Array of TRessurrecter;  
 end;
 
 {$EndRegion}
 
var 
 LumberjackerData : TLumberjackerData;
 FlagStop : Boolean;
 
{$Region 'Configuring'} 
        
Procedure InitScriptSystemData(ConfigName : String);
begin
 //Initializing global constant section
 with LumberjackerData.Constants do begin
  ThrowAwayItems := [$1F03]; 
  HatchetsTypes := [$0F43];
 end;
 LumberjackerData.SessionHarvestedData.StartTime := Now; 
 //Data specified to some house with unloadchest and trashbarrel
 case ConfigName of 
  'Domik #1' : with LumberjackerData.Constants do begin
    UnloadChest.Id := $0100001;  
    UnloadChest.X := 3461;
    UnloadChest.Y := 2640;
  end;
 end;
end;

Procedure AddForestSpot(X, Y : Integer; Name : String);
begin
 with LumberjackerData do begin
  SetLength(ForestSpots, Length(ForestSpots) + 1);
  ForestSpots[High(ForestSpots)].X := X;
  ForestSpots[High(ForestSpots)].Y := Y; 
  ForestSpots[High(ForestSpots)].Name := Name;
 end;
end;

Function SetConfigByCharName(CharName : String) : String;
begin
 case CharName of
  'Kranze' : begin
   AddForestSpot(2015, 330, 'Kranze');
   AddForestSpot(2015, 330, 'Kranze');
   Result := 'Domik #1';
  end;
 end;
end;

{$EndRegion}

{$Region 'Trees array handling'}
Procedure AddTreeToArray(var TreesArray : Array of TTree; Tile : Word; X,Y,Z, UnloadChestX, UnloadChestY : Integer);
begin   
 SetLength(TreesArray, Length(TreesArray) + 1);
 TreesArray[High(TreesArray)].X := X;
 TreesArray[High(TreesArray)].Y := Y;
 TreesArray[High(TreesArray)].Z := Z;
 TreesArray[High(TreesArray)].DistanceToChest := Dist(X, Y, UnloadChestX, UnloadChestY);   
end;


Procedure SortTreesArrayByDistanceToChest(var TreesArray : Array of TTree);
var 
 //arr : array of integer;   
 i : integer;
 f : boolean;
 c : integer; 
begin 
 repeat
  f := false; 
  //AddToSystemJournal(IntToStr(Length(arr)));
  for i := Low(TreesArray) to High(TreesArray)-1 do
   if (TreesArray[i].DistanceToChest > TreesArray[i+1].DistanceToChest) then
    begin
     f := true;
     c := TreesArray[i].DistanceToChest; 
     TreesArray[i].DistanceToChest := TreesArray[i+1].DistanceToChest; 
     TreesArray[i+1].DistanceToChest := c;
    end;                                    
   until not f;
end;

//return count of trees marked
Function SetTreesAtForestSpot(var TreesArray : Array of TTree) : Integer;
var
 ATiles : Array of Integer;
 x,y,i,k : Integer;
 TileInfo : TStaticCell;
begin
ATiles := [3274,3275,3277,3280,3283,3286,3288,3290,3293,3296,3299,3302,3320,3323,3326,3329,3393,3394,3395,3396,3415,3416,3417,3418,3419,3438,3439,3440,3441,3442,3460,3461,3462,3476,3478,3480,3482,3484,3492,3496]; 
 for x := (-1 * 20) to 20 do
  for y := (-1 * 20) to 20 do
   begin
    //AddToSystemJournal(IntToStr(Length(ATiles)));
    TileInfo := ReadStaticsXY(GetX(self)+x, GetY(self)+y, 0);     
    if TileInfo.StaticCount > 0 then
     for i := Low(TileInfo.Statics) to High(TileInfo.Statics) do
      for k := 0 to Length(ATiles)-1 do
       begin
        //AddToSystemJournal(IntToStr(TileInfo.Statics[i].Tile) + ' + ' + IntToStr(ATiles[k]));
        if (TileInfo.Statics[i].Tile = ATiles[k]) then
         AddTreeToArray(LumberjackerData.Trees ,TileInfo.Statics[i].Tile, TileInfo.Statics[i].x, TileInfo.Statics[i].y, TileInfo.Statics[i].z, LumberjackerData.Constants.UnloadChest.X, LumberjackerData.Constants.UnloadChest.Y);
       end;        
   end;
  Result := Length(LumberjackerData.Trees);  
  SortTreesArrayByDistanceToChest(LumberjackerData.Trees);
end;
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Ассоциативные массивы

Post by Vizit0r »

двумерные массивы. Ничего особого, ПС поддерживает нормально
XXX: array of array of Integer;

Впрочем, правильный синтаксис надо вспомнить, сто лет их не использовал.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: Ассоциативные массивы

Post by drabadan »

Vizit0r wrote:двумерные массивы. Ничего особого, ПС поддерживает нормально
XXX: array of array of Integer;

Впрочем, правильный синтаксис надо вспомнить, сто лет их не использовал.
Вопрос о асоциативных, а не двумерных
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Re: Ассоциативные массивы

Post by Vizit0r »

а, я понял.
нет, ПС такого не поддерживает.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: Ассоциативные массивы

Post by nah nah »

в питоне всё есть
Post Reply