داده های در بازی نقش اساسی و مهمی دارند، به طوری که تقریباً همه بازی بر طبق داده ها پیش می رود، پس باید داده ها را دسته بندی کنیم تا بر رو آنها کنترل بهتری داشته باشیم و بتوانیم از آنها به خوبی استفاده کنیم. ساده ترین چیزی که برای دسته بندی داده ها به ذهن ما می رسد یک آرایه دو بعدی و یا یک بعدی است. اما آرایه ها همیشه نمیتوانند نیاز ما را بر طرف کنند زیرا از توابع محدودی برخوردار هستند. پس باید چیزی فراتر از یک آرایه به کمک ما بیاید. Data structures یا ساختار داده در GM: S برای دسته بندی اطلاعات و ایجاد یک ساختار برای آنها ایجاد شده است. ساختار داده List یکی از اینها است، این ساختار شبیه یک آرایه یک بعدی می باشد با این تفاوت که از توابع زیادی برخوردار است و دیگر کاربر را محدود نمی کند. پش برای کارایی بیشتر باید کار با توابع این ساختار را یاد گرفته باشیم.

همان طور که گفته شد این ساختار همانند یک آرایه یک بعدی است که داده ها را به صورت پیوسته ذخیره می کند. اما بر خلاف یک آرایه یک بعدی بسیار انعطاف پذیر می باشد و از توابع کاربری برخوردار است. می تواند به تمام داده ها در هر زمانی دسترسی پیدا کنید، آنها را حذف و یا داده جدیدی در هر جا اضافه کنید. می توانید داده ها را به صورت صعودی و یا نزولی مرتب کنید، از آنها کپی بگیرید و... . این ساختار همانند یک منو رستوران است. می توان به هر جای آن غذایی اضافه کرد و یا در صورت تمام شدن غذا آن را حذف کرد. مشتری از تمام داده ها می تواند استفاده کند و در آنها جست و جو کند.

برای ساخت این ساختار باید از تابع زیر استفاده کرد، توجه کنید که این تابع را باید در یک متغیر ذخیره کنید تا بتوانید از ساختار استفاده کنید:

ds_list_create();

برای اضافه کردن یک داده جدید به ساختار باید از تابع زیر استفاده کرد که دارای دو ورودی می باشد، این تابع مقدار جدید را به انتها ساختار اضافه می کند:

ds_list_add(id, value);

ورودی id مربوط به ساختار داده ای است که می خواهیم این داده در آن اضافه شود، یعنی متغیری که ساختار داده را در آن ساخته ایم. ورودی value هم مقداری است که می خواهیم اضافه شود.

گاهی نیاز است که داده ای را با داده ای دیگر جایگزینی کنیم، به طوری که داده جدید جای داده قبلی را در ساختار داده بگیرد. برای این کار باید از تابع زیر استفاده کنیم که دارای سه ورودی است:

ds_list_replace(id, pos, value);

ورودی id مربوط به ساختار داده ای است که می خواهیم این داده را در آن جایگزینی کنیم. هر داده در ساختار داده لیست یک مکان (position) دارد، به طوری که position اولین داده 0، دومین 1 و... است. در ورودی pos باید مکان داده ای را که می خواهیم حذف شود و دادۀ دیگری جای آن بیاید را بنویسیم، ورودی value هم مقداری است که باید جایگزین شود، برای مثال:

dsDate = ds_list_create();
ds_list_add(dsDate, "Ali");
if (name = false)
{
ds_list_repleas(dsDate, 0, "Reza");
}

در مثال بالا ابتدا ساختار داده list ساخته می شود، سپس داده ای با مقدار Ali به آن اضافه می شود، با توجه به اینکه Ali اولین داده است در position صفر قرار می گیرد. سپس در صورتی که شرط برقرار باید مقدار Ali با Reza تعویض می شود.

می توانید مقادیر را با مکان آنها جست و جو کنید و یا بفهمید کدام داده در کدام مکان است. برای این کار از تابع زیر استفاده کنید که دارای دو ورودی است:

ds_list_find_value(id, pos);

ورودی اول مربوط به ساختار داده است و ورودی دوم مکانی است که می خواهید مقدار آن مکان را به دست آورید. برای مثال:

name = ds_list_find_value(dsDate, 2);
show_message(name);

البته می توانید مکان هر مقدار را هم به دست آورید، برای مثال مقدار Ali در کدام خانه ذخیره شده است؟ تابع زیر هم دارای دو ورودی است:

ds_list_find_index(id, value);

دیدید که می توان مقادیر را  در آخر لیست اضافه کرد، اما اگر بخواهید یک مقدار را در مکان مورد نظر اضافه کنید باید از تابع زیر استفاده کرد که دارای سه ورودی است:

ds_list_insert(id, pos, value);

ورودی اول مربوط به ساختار داده است، ورودی دوم هم مکانی است که می خواهیم مقدار به آنجا اضافه شود و ورودی سوم هم مقدار است، تفاوت این تابع با تابع repleas در این است که تابع repleas مقدار را جایگزین می کند، یعنی مقدار قبلی حذف می شود، اما با این تابع مقدار جدید در مکان مورد نظر اضافه می شود و اگر مقداری در آن مکان باشد، تمام مقادیر یک خانه به جلو می روند. یعنی داده ای حذف نمی شود.

برای اینکه بدانیم چند داده در ساختار ما ذخیره شده است باید size آن را با تابع زیر بررسی کنیم، این تابع تعداد مقادیری را که در یک ساختار دخیره شده اند را برمیگرداند:

ds_list_size(id);

برای مثال زمانی که می خواهیم تعداد داده ها را به کاربر نشان دهیم می توان از این تابع استفاده کرد:

show_message(ds_list_size(dsDate));

برای حذف داده ها از یک ساختار list باید از تابع زیر استفاده کرد که دارای دو ورودی است. این تابع یک مکان را پاک می کند نه فقط مقدار را. یعنی مکان مورد نظر خالی نمی ماند بلکه داده های بعدی جای آن را پر می کنند.

ds_list_delete(id, pos);

ورودی اول مربوط به ساختار داده است و ورودی دوم مربوط به مکانی است که می خواهیم حذف شود. برای مثال در زمان مورد نظر اگر تعداد داده های یک list از 10 بیشتر بود داده های قدیمی تر پاک شوند تا تعداد به 10 برسد:

if ((ready = true) and (ds_list_size(dsDate) > 10))
{
while (ds_list_size(dsDate) > 10)
{
ds_list_delete(dsDate, 0);
}
}

برای اینکه بفهمید ساختاری دارای داده است و یا خالی است می توانید از تابع زیر استفاده کنید که دارای یک ورودی است. این تابع خروجی true و یا false برمیگرداند که می توانید از آن به صورت مستقیم در شرط استفاده کنید:

ds_list_empty(id);

در ورودی id باید نام ساختار داده ای را وارد کنیم که می خواهیم چک شود.

می توانید داده های خود را به صورت نزولی و یا صعودی مرتب کنید. برای این کار می توانید از تابع زیر استفاده کنید که دارای دو ورودی است:

ds_list_sort(id, ascend);

ورودی اول مربوط به ساختار داده است که می خواهیم مرتب شود. ورودی دوم مشخص می کند که داده های به صورت صعودی مرتب شوند و یا نزولی. می توانید این ورودی را با true (صعودی) و false (نزولی) مشخص کنید.

این تابع بر اساس حروف و اعداد می تواند داده های را مرتب کند. اعداد اولویت کمتری نسبت به حروف دارند و هر چه اعداد بزرگ تر باشند اولویت بیشتری دارند. حروف بزرگ اولیت بیشتری نسبت به حروف کوچک دارند.
if (newGame = true)
{
ds_list_sort(listName, true)
}

زمانی که می خواهید تمام مقادیر یک داده را از نوع بنویسید و داده های جدید را جایگزین کنید، دیگر نیاز نیست از repleas استفاده نمایید. بلکه می توانید با این تابع که دارای یک ورودی است تمام داده ها را حذف و داده های جدید را اضافه کنید:

ds_list_clear(id);

ورودی id مربوط به ساختار داده ای است که می خواهید تمام مقادیر آن حذف شود.

ساختار های داده برخی از فضای رم رو به خود اختصاص می دهند. پس زمانی که دیگر استفاده ای ندارند باید حذف شوند. برای حذف ساختار های داده می توانید از تابع زیر استفاده کنید که دارای یک ورودی است:

ds_list_destroy(id);

ورودی اول مربوط به ساختار داده ای است که می خواهید حذف شود.

توجه کنید که با استفاده از این تابع، ساختار داده به طور کلی حذف می شود و دیگر قادر استفاده از آن نیستید. پس باید زمانی ساختاری را حذف کنید که دیگر به آن نیاز نداشته باشید. برای مثال زمانی که کاربر از مرحله خارج می شود و به منو می آید باید ساختار مربوط به آن مرحله را ذخیره و سپس حذف کنید.

داده ها را باید در بازی ذخیره کرد تا امکان پیشرفت برای کاربر فراهم شود. برای مثال زمانی که کاربر در اواسط مرحله از بازی خارج می شود باید مقدار پیشرفت آن را ذخیره کنیم. برای ذخیره مقادیر یک داده در یک متغیر باید از تابع زیر استفاده کنیم که دارای یک ورودی است، توجه کنید که کار اصلی این تابع نوشتن مقادیر در متغیر است:

ds_list_write(id);

ورودی اول مربوط به ساختار داده ای است که می خواهیم مقادیر آن را ذخیره کنیم. این تابع باید در یک متغیر ذخیره شود تا بتوان از آن استفاده کرد.

gameDate = ds_list_write(userInfo);

اگر می خواهید این مقادیر را ذخیره کنید، می توانید از فایل های ini استفاه نمایید، برای مثال:

if (gameEnd = true)
{
ini_open("save.ini");
var userInfo = ds_list_write(dsUser);
ini_write_string("list", "0", userInfo);
ds_list_destroy(dsUser);
ini_close();
}

پس از آن که داده ای را در فایل و یا در متغیری نوشتید باید آن را با تابع زیر بخوانید تا بتوانید دوباره از آن ها استفاده کنید:

ds_list_read(id, str);

ورودی اول مربوط به ساختار داده ای است که می خواهیم مقادیر جدید در آن نوشته شود. ورودی دوم هم مقادیر است.

اگر از گیم میکر های نسخه قدیمی استفاده می کنید ورودی اختیاری دیگری به نام legacy وجود دارد که می تواند true، false و یا خالی باشد.

اگر می خواهید مقادیر یک ساختار را به طور تصادفی مرتب کنید کافی است مقادیر را اضافه و سپس از تابع زیر که دارای یک ورودی است استفاده کنید:

ds_list_shuffle(id);

ورودی اول مربوط به ساختاری است که می خواهید مقادیر آن به طور تصادفی چیده شود.

می توانید از یک ساختار کپی بگیرید و تغییرات جدید را بر روی نسخه جدید اعمال کنید، برای این کار کافی است از تابع زیر که دارای دو ورودی است استفاده کنید:

ds_list_copy(id, sours);

ورودی id مربوط به ساختاری است که می خواهیم مقدایر کپی شده در آن جایگذاری شود، ورودی sours هم ساختاری است که از آن کپی گرفته می شود. این ساختار ها هر دو باید از قبل ساخته شده باشند.

if !ds_list_empty(mainList)
{
oldList = ds_list_create();
ds_list_copy(oldList, mainList);
}