Last active
December 26, 2020 04:55
-
-
Save Creta5164/e321ef9da3509d4d8bbe6c7a516115ba to your computer and use it in GitHub Desktop.
새 gml 스펙을 살펴봤습니다! I just discovered new gml spec!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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