Pracuję nad narzędziami do gry, którą tworzę. Narzędzia służą jako prosty interfejs do tworzenia plików z edycjami. Kilka plików to pliki skryptów Pythona. Na przykład, mam plik Items.py który zawiera następujące (zminimalizowany na przykład)Manipulowanie plikiem Pythona z C#
from ItemModule import *
import copy
class ScriptedItem(Item):
def __init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower):
Item.__init__(self, name, description, itemtypes, primarytype, flags, usability, value, throwpower, Item.GetNextItemID())
def Clone(self):
return copy.deepcopy(self)
ItemLibrary.AddItem(ScriptedItem("Abounding Crystal", "A colourful crystal composed of many smaller crystals. It gives off a warm glow.", ItemType.SynthesisMaterial, ItemType.SynthesisMaterial, 0, ItemUsage.Unusable, 0, 50))
jak wspomniałem, chcę zapewnić przód do edytowania tego pliku bez wymagasz edytor wiedzieć Pythona/edytować plik bezpośrednio. Mój wydawca musi być w stanie:
- Znajdź i wymienić wszystkie typy klas (w tym przykładzie, że to będzie tylko Scripted Element)
- Znajdź i wymienić wszystkie utworzone elementy (w tym przypadku” d tylko być jednym, Abounding Crystal). Musiałbym znaleźć typ (w tym caseScriptedItem) i wszystkie wartości parametrów
- Zezwalać na edycję parametrów i tworzenie/usuwanie elementów.
Aby to zrobić, zacząłem pisać własny parser, szukając słowa kluczowego klasy i kiedy te nagrane klasy są używane do konstruowania obiektów. To działało dla prostych danych, ale kiedy zacząłem używać klas z złożonymi konstruktorami (listami, mapami itp.), To stało się coraz trudniejsze do prawidłowego analizowania.
Po przeszukaniu znalazłem IronPythona, który ułatwił przetwarzanie plików Pythona, więc to właśnie zrobiłem. Po zbudowaniu drzewa składni abstrakcyjnej użyłem PythonWalkers, aby zidentyfikować i znaleźć wszystkie potrzebne informacje. Działa to doskonale do odczytu w danych, ale nie widzę łatwego sposobu przesyłania zaktualizowanych danych do pliku Pythona. O ile mogę powiedzieć, nie ma sposobu, aby zmienić wartości w AST, a tym bardziej, aby przekonwertować AST z powrotem do pliku skryptu. Jeśli się mylę, chciałbym, aby ktoś mi powiedział, jak mogę to zrobić. Teraz muszę przeszukać plik, dopóki nie znajdę poprawnej linii, a następnie spróbuj przesłać dane do konstruktora, zapewniając poprawną kolejność.
Czy istnieje jakieś oczywiste rozwiązanie, którego nie widzę? Czy powinienem po prostu kontynuować pracę nad moim parserem i sprawić, by obsługiwał on bardziej złożone typy danych? Naprawdę, chociaż miałem go z parserem IronPython, ale nie myślałem o tym, jak trudno byłoby wprowadzić zmodyfikowane dane z powrotem do pliku.
Wszelkie sugestie będą mile widziane