Skip to content

Instantly share code, notes, and snippets.

@Creta5164
Last active December 26, 2020 04:55
Show Gist options
  • Save Creta5164/e321ef9da3509d4d8bbe6c7a516115ba to your computer and use it in GitHub Desktop.
Save Creta5164/e321ef9da3509d4d8bbe6c7a516115ba to your computer and use it in GitHub Desktop.
새 gml 스펙을 살펴봤습니다! I just discovered new gml spec!
function CsvManager(lang) constructor {
//@desc 언어를 다시 불러옵니다.
//@param {string} lang (optional) 다시 불러올 언어 (기본값 = "ko")
static ReloadLanguage = function(lang) {
if (lang == undefined)
lang = "ko";
var path = "lang/" + lang + "/weapons.csv";
CurrentLanguage = lang;
_LanguageData = UnwrapToStruct(load_csv(path));
_InitializeData(WeaponStringData, _LanguageData);
}
//@desc ds_grid인 csv 데이터를 id로 구분된 구조체로 변환합니다.
static UnwrapToStruct = function(csv) {
/*
csv를 넣으면 =>
| id_name | key_A | key_B | key_C | ...
|---------|-------|-------|--------|-----
| slime | 10 | 5 | normal | ...
| goblin | 20 | 8 | evil | ...
| ghost | 35 | 12 | ghost | ...
<= struct를 돌려줍니다.
result
└ slime
└ id_name : slime
└ key_A : 10
└ key_B : 5
└ key_C : normal
...
└ goblin
└ id_name : goblin
└ key_A : 20
└ key_B : 8
└ key_C : evil
...
└ ghost
└ id_name : ghost
└ key_A : 35
└ key_B : 12
└ key_C : ghost
...
*/
var width = ds_grid_width(csv);
var height = ds_grid_height(csv);
var key, value;
var result = {};
var _id;
var rowData;
var column, row;
for (column = 1; column < height; column++) {
_id = csv[# 0, column];
rowData = {};
variable_struct_set(rowData, csv[# 0, 0], _id);
for (row = 1; row < width; row++) {
key = csv[# row, 0];
value = csv[# row, column];
variable_struct_set(rowData, key, value);
}
variable_struct_set(result, _id, rowData);
}
return result;
}
//@desc 구조체 데이터 안에 들어간 데이터들을 강타입 데이터 객체로 변환합니다.
//@param {genericType} T 변환할 타입
//@param {struct} rawStruct 구조체 데이터 모음
static _InitializeData = function(T, rawStruct) {
var keys = variable_struct_get_names(rawStruct);
var data;
for (var i = 0; i < array_length(keys); i++) {
data = variable_struct_get(rawStruct, keys[i]);
variable_struct_set(rawStruct, keys[i], new T(data));
}
}
//@desc 데이터 컬렉션 구조체에서 값을 가져옵니다.
//@param {struct} collection 데이터가 모여있는 구조체
//@param {string} key 가져오고 싶은 데이터의 키
static _GetItem = function(collection, key) {
if (!is_struct(collection) || !variable_struct_exists(collection, key))
return 0;
return variable_struct_get(collection, key);
}
//@desc 무기 텍스트 정보 목록에서 값을 가져옵니다.
//@param {string} key 가져오고 싶은 무기 텍스트 정보의 키
static GetStringsFromID = function(key) { return _GetItem(_LanguageData, key); }
//@desc 무기 데이터 정보 목록에서 값을 가져옵니다.
//@param {string} key 가져오고 싶은 무기 데이터 정보의 키
static GetDataFromID = function(key) { return _GetItem(_GameData, key); }
//인스턴스 후 초기화
static _LanguageData = noone;
static _GameData = UnwrapToStruct(load_csv("data/weapons.csv"));
static CurrentLanguage = noone;
_InitializeData(WeaponData, _GameData);
ReloadLanguage(lang);
//테스트 : 131번 줄에 브레이크 포인트를 붙이고,
// 디버그 모드로 Variables -> Globals 탭을 통해
// 변환 된 데이터들을 확인해보세요.
global.GAME_DATA = _GameData;
global.LANG_DATA = _LanguageData;
show_debug_message("초기화 됨!");
}
global.CSV_MANAGER = new CsvManager();
//@desc 무기 문자 데이터
function WeaponStringData(csvData) constructor {
try {
ID = csvData.id;
Name = csvData.name;
Description = csvData.description;
} catch (ex) {
throw "무기 문자 데이터를 변환하는 도중 문제가 발생했습니다.";
}
//데이터 클래스로 래핑하면, 꺼내 쓸 때 더 복잡한 작업을 단순화 할 수 있습니다.
ShowDebugMessage = function() {
show_debug_message("무기 이름 : " + Name);
show_debug_message("설명 : " + Description);
}
}
//@desc 무기 데이터
function WeaponData(csvData) constructor {
try {
ID = csvData.id;
Faction = real(csvData.faction);
Type = real(csvData.type);
Cost = real(csvData.cardcost);
} catch(ex) {
throw "무기 데이터를 변환하는 도중 문제가 발생했습니다.";
}
//데이터 클래스로 래핑하면, 꺼내 쓸 때 더 복잡한 작업을 단순화 할 수 있습니다.
ShowDebugMessage = function() {
show_debug_message("type : " + string(Type));
show_debug_message("faction : " + string(Faction));
show_debug_message("cardcost : " + string(Cost));
}
}
/////////////////////////////////////////////////////////////////////////
//테스트 코드
//중간에 언어를 변경해 내용들이 잘 불러와지는지 확인합니다.
function Main() {
var keyID = "obj_unit_chg_1";
var itemStrings = global.CSV_MANAGER.GetStringsFromID(keyID);
var itemData = global.CSV_MANAGER.GetDataFromID(keyID);
show_debug_message("-----------------------------------------------------");
show_debug_message("");
show_debug_message("현재 언어 : " + global.CSV_MANAGER.CurrentLanguage);
itemStrings.ShowDebugMessage();
itemData.ShowDebugMessage();
show_debug_message("");
show_debug_message("-----------------------------------------------------");
show_debug_message("");
//언어 변경 => en
global.CSV_MANAGER.ReloadLanguage("en");
itemStrings = global.CSV_MANAGER.GetStringsFromID(keyID);
show_debug_message("현재 언어 : " + global.CSV_MANAGER.CurrentLanguage);
itemStrings.ShowDebugMessage();
itemData.ShowDebugMessage();
show_debug_message("");
show_debug_message("-----------------------------------------------------");
show_debug_message("");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment