77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| def preprocess(lines, flags):
 | |
|     output = []
 | |
|     skip_level = 0
 | |
|     for line in lines:
 | |
|         line = line.split("//")[0].strip() # Remove comment
 | |
|         if line == "":
 | |
|             continue
 | |
|         if line[0] == "#":
 | |
|             if line.startswith("#ifdef"):
 | |
|                 cond = line[7:].strip()
 | |
|                 if skip_level > 0 or cond not in flags:
 | |
|                     skip_level += 1
 | |
|             elif line.startswith("#else"):
 | |
|                 if skip_level == 0:
 | |
|                     skip_level = 1
 | |
|                 elif skip_level == 1:
 | |
|                     skip_level = 0
 | |
|             elif line.startswith("#endif"):
 | |
|                 if skip_level > 0:
 | |
|                     skip_level -= 1
 | |
|             continue
 | |
|         if skip_level == 0:
 | |
|             output.append(line)
 | |
|     return output
 | |
| 
 | |
| def get_id(name_id_mapping, name):
 | |
|     try:
 | |
|         # if the name of the node is known then return the location with the name_id_mapping list
 | |
|         return name_id_mapping.index(name)
 | |
|     except:
 | |
|         # else add the name of the node to the list then return the location
 | |
|         name_id_mapping.append(name)
 | |
|         return len(name_id_mapping)-1
 | |
| 
 | |
| def read_content(flags):
 | |
|     with open("map_content.txt", "r") as f:
 | |
|         lines = f.readlines()
 | |
| 
 | |
|     lines = preprocess(lines, flags)
 | |
|     # if you map to air, then unknown blocks will be ignored
 | |
|     name_id_mapping = ["air"]
 | |
|     # name_id_mapping = ["mcblock:unknown"]
 | |
|     bd = {}         # bd is block data, and keeps a list of the node names in the block
 | |
|     # iterate through all the lines in the map_content.txt file
 | |
|     for line in lines:
 | |
|         s = line.split("\t")
 | |
|         if len(s) >= 2:
 | |
|             r = s[1].split(" ")
 | |
|             if len(r) == 0:
 | |
|                 print(line)
 | |
|                 raise ValueError("Malformed data")
 | |
|             name = r[0]
 | |
|             param2 = 0
 | |
|             for i in range(1, len(r)):
 | |
|                 if r[i] != "":
 | |
|                     param2 = int(r[i])
 | |
|                     break
 | |
|             t = s[0].split(" ")
 | |
|             if len(t) == 2:
 | |
|                 for data in t[1].split(","):
 | |
|                     key = (int(t[0]), int(data))
 | |
|                     if key not in bd:
 | |
|                         bd[key] = (get_id(name_id_mapping, name), param2)
 | |
|             elif len(t) == 1:
 | |
|                 for data in range(16):
 | |
|                     key = (int(t[0]), data)
 | |
|                     if key not in bd:
 | |
|                         bd[key] = (get_id(name_id_mapping, name), param2)
 | |
| 
 | |
|     #blocks_len = max([i[0] for i in bd.keys()])+1
 | |
|     blocks_len = 4096
 | |
|     blocks = [[(0, 0)]*16 for i in range(blocks_len)]
 | |
|     for (id, data), value in bd.items():
 | |
|         blocks[id][data] = value
 | |
|     return name_id_mapping, blocks
 |