mirror of
https://gitlab.com/GameFeverOnline/py-mmlv.git
synced 2025-12-18 17:57:42 -04:00
152 lines
5.8 KiB
Python
152 lines
5.8 KiB
Python
# 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))
|