public SaveEditTask Refuel() { var run = new Action(() => { try { var content = saveFile.content; var sb = new StringBuilder(); var fuelPresetNames = new string[] { "연료통의 1000배", "연료통의 100배", "연료통의 10배", "연료통의 5배", "100%", "50%", "10%", "5%", "0%(...)" }; var fullPresetValues = new string[] { "1000", "100", "10", "5", "1", "0.5", "0.1", "0.05", "0" }; var fuelId = ""; { var res = ListInputBox.Show("연료 수준 선택", "할당된 트럭에 적용할 연료 수준을 선택하십시오.", fuelPresetNames); if (res == -1) { return; } fuelId = fullPresetValues[res]; } foreach (var line in content.Split('\n')) { var str = line; if (line.Contains("fuel_relative:")) { str = " fuel_relative: " + fuelId; } sb.Append(str + "\n"); } saveFile.Save(sb.ToString()); MessageBox.Show("모든 트럭의 연료를 지정한 값으로 변경했습니다.", "완료"); } catch (Exception e) { MessageBox.Show("오류가 발생했습니다.", "오류"); Console.WriteLine(e); throw; } }); return(new SaveEditTask { name = "연료 채우기", run = run, description = "세이브 내의 모든 트럭의 연료를 설정합니다." }); }
public SaveEditTask SharePaint() { var run = new Action(() => { try { var content = saveFile.content; var pattern0 = @"\beconomy : [\w\.]+ {"; var pattern1 = @"\bplayer: ([\w\.]+)\b"; var matchIndex = Regex.Match(content, pattern0).Index; var substr = content.Substring(matchIndex); string resultLine = null; foreach (var str in substr.Split('\n')) { if (Regex.IsMatch(str, pattern1)) { resultLine = Regex.Match(str, pattern1).Groups[1].Value; break; } if (str.Trim() == "}") { break; } } if (resultLine == null) { MessageBox.Show("손상된 세이브 파일입니다.", "오류"); return; } var operationNames = new string[] { "트럭, 불러오기", "트럭, 내보내기", "트레일러, 불러오기", "트레일러, 내보내기" }; var truck = false; var import = false; { var res = ListInputBox.Show("작업 선택하기", "무엇의 페인트를 불러올까요? 내보낼까요?", operationNames); if (res == -1) { return; } truck = res < 2; import = res % 2 == 0; } pattern0 = @"\bplayer : " + resultLine + " {"; pattern1 = @"\bassigned_" + (truck ? "truck" : "trailer") + @": ([\w\.]+)\b"; matchIndex = Regex.Match(content, pattern0).Index; substr = content.Substring(matchIndex); resultLine = null; foreach (var str in substr.Split('\n')) { if (Regex.IsMatch(str, pattern1)) { resultLine = Regex.Match(str, pattern1).Groups[1].Value; break; } if (str.Trim() == "}") { break; // End of the class } } if (resultLine == "null") { if (truck) { MessageBox.Show("할당된 트럭이 없습니다.", "오류"); } else { MessageBox.Show("할당된 트레일러가 없습니다.", "오류"); } return; } string path; var filter = (truck ? "트럭 페인트 파일 (*.paint0)|*.paint0|모든 파일 (*.*)|*.*" : "트레일러 페인트 파일 (*.paint1)|*.paint1|모든 파일 (*.*)|*.*"); if (import) { // Import OpenFileDialog dialog = new OpenFileDialog { Title = "페인트 파일 선택", Filter = filter }; if (dialog.ShowDialog() != true) { return; } path = dialog.FileName; } else // Export { SaveFileDialog dialog = new SaveFileDialog { Title = "페인트 내보내기", Filter = filter }; if (dialog.ShowDialog() != true) { return; } path = dialog.FileName; } pattern0 = @"\b" + (truck ? "vehicle" : "trailer") + " : " + resultLine + " {"; pattern1 = @"\baccessories\[\d*\]: ([\w\.]+)\b"; matchIndex = Regex.Match(content, pattern0).Index; substr = content.Substring(matchIndex); resultLine = null; if (import) { var str = File.ReadAllText(path, Encoding.UTF8); var strs = str.Split(';'); if (strs.Length != 8) { MessageBox.Show("손상된 페인트 파일입니다.", "오류"); return; } var paintjob = new Paintjob { mask_r_color = strs[0], mask_g_color = strs[1], mask_b_color = strs[2], flake_color = strs[3], flip_color = strs[4], base_color = strs[5], data_path = strs[6] }; foreach (var line in substr.Split('\n')) { if (Regex.IsMatch(line, pattern1)) { var id = Regex.Match(line, pattern1).Groups[1].Value; var p50 = @"\bvehicle_paint_job_accessory : " + id + " {"; if (!Regex.IsMatch(substr, p50)) { continue; } var matchIndex0 = Regex.Match(substr, p50).Index + matchIndex; // TODO you must escape p50 id can contain . var substr0 = content.Substring(matchIndex0); var index = 0; var sb = new StringBuilder(); sb.Append(content.Substring(0, matchIndex0)); foreach (var line0 in substr0.Split('\n')) { var str0 = line0; if (Regex.IsMatch(line0, @"\bdata_path:\s"".*?""")) { str0 = " data_path: " + paintjob.data_path + ""; } if (Regex.IsMatch(line0, @"\bmask_r_color: \(.*?\)")) { str0 = " mask_r_color: " + paintjob.mask_r_color + ""; } if (Regex.IsMatch(line0, @"\bmask_g_color: \(.*?\)")) { str0 = " mask_g_color: " + paintjob.mask_g_color + ""; } if (Regex.IsMatch(line0, @"\bmask_b_color: \(.*?\)")) { str0 = " mask_b_color: " + paintjob.mask_b_color + ""; } if (Regex.IsMatch(line0, @"\bflake_color: \(.*?\)")) { str0 = " flake_color: " + paintjob.flake_color + ""; } if (Regex.IsMatch(line0, @"\bflip_color: \(.*?\)")) { str0 = " flip_color: " + paintjob.flip_color + ""; } if (Regex.IsMatch(line0, @"\bbase_color: \(.*?\)")) { str0 = " base_color: " + paintjob.base_color + ""; } Console.WriteLine("'" + Regex.Escape(str0) + "'"); sb.AppendLine(str0); if (line0.Trim() == "}") { break; } index += line0.Length + 1; } sb.Append(content.Substring((int)(matchIndex0 + index + 1))); content = sb.ToString(); } if (line.Trim() == "}") { break; // End of the class } } saveFile.Save(content); MessageBox.Show("페인트를 불러왔습니다!", "완료"); } else { var paintjob = new Paintjob(); foreach (var line in substr.Split('\n')) { if (Regex.IsMatch(line, pattern1)) { var id = Regex.Match(line, pattern1).Groups[1].Value; var p50 = @"\bvehicle_paint_job_accessory : " + id + " {"; if (!Regex.IsMatch(substr, p50)) { continue; } var matchIndex0 = Regex.Match(substr, p50).Index + matchIndex; // TODO you must escape p50 id can contain . var substr0 = content.Substring(matchIndex0); var index = 0; foreach (var line0 in substr0.Split('\n')) { if (Regex.IsMatch(line0, @"\bdata_path:\s("".*?"")")) { paintjob.data_path = Regex.Match(line0, @"\bdata_path:\s("".*?"")").Groups[1].Value; } if (Regex.IsMatch(line0, @"\bmask_r_color: (\(.*?\))")) { paintjob.mask_r_color = Regex.Match(line0, @"\bmask_r_color: (\(.*?\))").Groups[1].Value; } if (Regex.IsMatch(line0, @"\bmask_g_color: (\(.*?\))")) { paintjob.mask_g_color = Regex.Match(line0, @"\bmask_g_color: (\(.*?\))").Groups[1].Value; } if (Regex.IsMatch(line0, @"\bmask_b_color: (\(.*?\))")) { paintjob.mask_b_color = Regex.Match(line0, @"\bmask_b_color: (\(.*?\))").Groups[1].Value; } if (Regex.IsMatch(line0, @"\bflake_color: (\(.*?\))")) { paintjob.flake_color = Regex.Match(line0, @"\bflake_color: (\(.*?\))").Groups[1].Value; } if (Regex.IsMatch(line0, @"\bflip_color: (\(.*?\))")) { paintjob.flip_color = Regex.Match(line0, @"\bflip_color: (\(.*?\))").Groups[1].Value; } if (Regex.IsMatch(line0, @"\bbase_color: (\(.*?\))")) { paintjob.base_color = Regex.Match(line0, @"\bbase_color: (\(.*?\))").Groups[1].Value; } if (line0.Trim() == "}") { break; } index += line0.Length + 1; } } if (line.Trim() == "}") { break; // End of the class } } try { var data = paintjob.mask_r_color + ";" + paintjob.mask_g_color + ";" + paintjob.mask_b_color + ";" + paintjob.flake_color + ";" + paintjob.flip_color + ";" + paintjob.base_color + ";" + paintjob.data_path + ";"; File.WriteAllText(path, data, Encoding.UTF8); } catch (Exception) { MessageBox.Show("페인트를 내보낼 수 없습니다.", "오류"); throw; } MessageBox.Show("페인트를 내보냈습니다!", "완료"); } } catch (Exception e) { MessageBox.Show("오류가 발생했습니다.", "오류"); Console.WriteLine(e); throw; } }); return(new SaveEditTask { name = "페인트 내보내기/불러오기", run = run, description = "트럭/트레일러의 페인트를 내보내거나 불러옵니다." }); }
public SaveEditTask TruckEngineSet() { var run = new Action(() => { try { var content = saveFile.content; var pattern0 = @"\beconomy : [\w\.]+ {"; var pattern1 = @"\bplayer: ([\w\.]+)\b"; var matchIndex = Regex.Match(content, pattern0).Index; var substr = content.Substring(matchIndex); string resultLine = null; foreach (var str in substr.Split('\n')) { if (Regex.IsMatch(str, pattern1)) { resultLine = Regex.Match(str, pattern1).Groups[1].Value; break; } if (str.Trim() == "}") { break; } } pattern0 = @"\bplayer : " + resultLine + " {"; pattern1 = @"\bassigned_truck: ([\w\.]+)\b"; matchIndex = Regex.Match(content, pattern0).Index; substr = content.Substring(matchIndex); resultLine = null; foreach (var str in substr.Split('\n')) { if (Regex.IsMatch(str, pattern1)) { resultLine = Regex.Match(str, pattern1).Groups[1].Value; break; } if (str.Trim() == "}") { break; // End of the class } } if (resultLine == null) { MessageBox.Show("손상된 세이브 파일입니다.", "오류"); return; } else if (resultLine == "null") { MessageBox.Show("할당된 트럭이 없습니다. 게임을 실행하여 트럭을 자신에게 할당하세요.", "오류"); return; } var engineNames = new string[] { "스카니아 신형 730", "스카니아 구형 730", "볼보 신형 750", "볼보 구형 750", "르노 프리미엄 380", "이베코 310(...)" }; var enginePaths = new string[] { "/def/vehicle/truck/scania.s_2016/engine/dc16_730.sii", "/def/vehicle/truck/scania.streamline/engine/dc16_730_2.sii", "/def/vehicle/truck/volvo.fh16_2012/engine/d16g750.sii", "/def/vehicle/truck/volvo.fh16/engine/d16g750.sii", "/def/vehicle/truck/renault.premium/engine/dxi11_380.sii", "/def/vehicle/truck/iveco.stralis/engine/cursor8_310hp.sii" }; var enginePath = ""; { var res = ListInputBox.Show("엔진 선택하기", "현재 할당된 트럭에 적용할 엔진을 선택하세요.\n참고로 스카니아와 볼보는 구형의 엔진 성능이 신형보다 좋습니다.\n" + "확인 버튼 클릭 후 편집 작업 완료까지 어느 정도 시간이 걸리니 참고하시기 바랍니다.", engineNames); if (res == -1) { return; } enginePath = enginePaths[res]; } pattern0 = @"\bvehicle : " + resultLine + " {"; pattern1 = @"\baccessories\[\d*\]: ([\w\.]+)\b"; matchIndex = Regex.Match(content, pattern0).Index; substr = content.Substring(matchIndex); resultLine = null; foreach (var line in substr.Split('\n')) { if (Regex.IsMatch(line, pattern1)) { var id = Regex.Match(line, pattern1).Groups[1].Value; var p50 = @"\bvehicle_(addon_|sound_|wheel_|drv_plate_|paint_job_)?accessory : " + id + " {"; var matchIndex0 = Regex.Match(substr, p50).Index + matchIndex; var substr0 = content.Substring(matchIndex0); var index = 0; foreach (var line0 in substr0.Split('\n')) { if (Regex.IsMatch(line0, @"\bdata_path:\s""\/def\/vehicle\/truck\/[^/]+?\/engine\/")) { var sb = new StringBuilder(); sb.Append(content.Substring(0, (int)(matchIndex0 + index))); sb.Append(" data_path: \"" + enginePath + "\"\n"); sb.Append(content.Substring((int)(matchIndex0 + index + line0.Length + 1))); content = sb.ToString(); } if (line0.Trim() == "}") { break; } index += line0.Length + 1; } } if (line.Trim() == "}") { break; // End of the class } } saveFile.Save(content); MessageBox.Show("엔진을 변경했습니다!", "완료"); } catch (Exception e) { MessageBox.Show("오류가 발생했습니다.", "오류"); Console.WriteLine(e); throw; } }); return(new SaveEditTask { name = "트럭 엔진 지정", run = run, description = "트럭의 엔진을 설정 가능한 몇 가지 엔진으로 변경합니다." }); }