# A Mega Man Maker MMLV Library/Module By Timothy J. (GameFeverOnline, www.youtube.com/@GameFeverOnline) """ The goal is to create a library that reads a mmlv file, and then creates variables for each object, tile, background, etc... So that you could on another program import this as a module and just give it for example, mm1iceman = [1, 2, 3] , the 1 meaning that it's active and the 2 and 3 it's position in space. In the future there will be more inputs for settings of objects. It could also work by calling a function, say place_tile(tilename, x, y) and then do that for every tile placement call. That would separate the placing of tiles from the placing of objects and more. """ import configparser, os, definitions section = "Level" config = configparser.ConfigParser() filename = "sample.mmlv" config.read(filename) #this must be changed to support writing ONLY the changes when giving and argument in write_changes(), and not filename PLUS the changes. alias = definitions.aliases supported_values = definitions.supported_values #done. converts from multiples of 16 to normal x and y values. for use in reading def conv_coordinates(x16, y16): if x16 < 1 or y16 < 1: x = x16 / 16 y = y16 / 16 else: x = 0 y = 0 return [x, y] #done. converts from normal x and y values to multiples of 16. for use in writing def conv_coordinates_x16(x, y): x16 = x * 16 y16 = y * 16 return [x16, y16] #done. writes the changes to file specified in global variable filename. def write_changes(filename=filename): with open(filename, 'w') as configfile: config.write(configfile, space_around_delimiters=False) #done. returns what is available in the file. without values. def get_options(): options = config.options(section) return options def get_items(): items = config.items(section) return items #done. def set_user(username): if config.has_option(section, alias["user_name"]): username = '"' + str(username) + '"' config.set(section, alias["user_name"],username.lower()) #done def get_user(): if config.has_option(section, alias["user_name"]): current_username = config.get(section, alias["user_name"]) return current_username def set_tile(x, y, tilename="mm1cuttile", block_type="normal", room_active=1): by16 = conv_coordinates_x16(x, y) x16 = str(by16[0]) y16 = str(by16[1]) #this needs a check to see if the coordinates are already taken, and deal with object-tile conflicts accordingly. for letter in "kjiea": #tile = letter + x16 + "," + y16 #print(type(tile)) option = 0 if letter == "k": #unknown, so sample for now print("working k") option = '"106.000"' elif letter == "j": #unknown print("working j") option = '"71.000"' elif letter == "i": #according to https://gist.github.com/freem/03d6c1832299e8d8a32f64361380920d this is block type if block_type == "ladder": option = '"3.000"' elif block_type == "spike": option = '"2.000"' else: option = '"1.000"' elif letter == "e": #supposedly this is item sub-type. Leaving default for now. Need to implement a method to have an index of all the tiles. temp_tilenames = {"mm1cuttile" : '"3.000"'} if tilename in temp_tilenames: option = temp_tilenames[tilename] return #print("working e") #option = '"3.000"' else: #enabled? Well, of course! Cheap way to remove a tile. Not ideal though, proper removing of the keys will be implemented. ALERT, THIS APPLIES TO EVERYTHING NOT JUST TILES(objects, etc...) print("working a") option = '"1.000"' config.set(section,letter + x16 + "," + y16, option) def set_level_name(levelname): config.set(section, alias["level_name"],'"' + levelname + '"') #def set_room_active(x, y,status=True): #the x and y values have to be the 0,0 relative to the room, so just the one where the tile on the top left corner of a room goes. I'll add this on set tile as a argument. def set_player(x, y,type="mm", allow_duplicates=0): by16 = conv_coordinates_x16(x, y) x16 = str(by16[0]) y16 = str(by16[1]) #Every function that has something like all this should be a funcion. for letter in "oda": option = 0 if letter == "o": #Unknown option = '"9999.000"' elif letter == "d": #unknown option = '"4.000"' else: option = '"1.000"' config.set(section,letter + x16 + "," + y16, option) #def set_object(object_name): # config.set(section, ) < I'll maybe add the set_player function here, because they are sort of objects. That way everything can be made through here.' """ def list_tiles < this will return a list of tiles already on the level as a list each one with every of the 5 values for the 5 letters def read_tile def default_blank < this is to give a blank canvas for every action. Maybe this will only be used for if a mmlv is blank (example: custom filename on write_changes()) def set_setting def set_background def set_active """ #def set_ver(gamever) < this may support mega maker's api to get current version.' """ _|_ _ __|_o._ _ _ .__ ._ _| _ |_(/__> |_|| |(_| (_||(_)|_|| |(_|_> _| _| """ # A problem that has to be fixed some day is that EVERY TILE WILL NOT APPEAR ON EDITOR TILL A PLAY TEST. It has something to do with the order in the mmlv file, something that goes beyond the scope of the python configparser. Let's see what happens.. print(get_options()) print(get_user()) #set_user("Game FEverOnline") #write_changes() write_changes() print(set_player(3, 3))