You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
5.6 KiB
Python

# Imports
import re
from ast import literal_eval
# LevelData Class
class LevelData():
# Validate Level Data
@staticmethod
def validate(level_data):
# Variables
level_data = level_data
number_of_items = 0
number_of_items_buffer = 0
# Regular Expression
numbers = re.compile(r"\d")
# Check and Return Data
try:
data = literal_eval(level_data)
for list_number, list_value in enumerate(data):
if list_number == 0:
for number, number_value in enumerate(list_value):
if number_value < 0 or number_value > 9:
return False
number_of_items += 1
else:
for number, number_value in enumerate(list_value):
if number_value < 0 or number_value > 9:
return False
number_of_items_buffer += 1
if number_of_items_buffer != number_of_items:
return False
number_of_items_buffer = 0
return True
except:
return False
# Compress Level Data
@staticmethod
def compress(level_data):
# Variables
level_data = level_data
cleared_level_data = ""
compressed_level_data = ""
number_of_matches = 0
current_character_count = 0
# Regular Expression
numbers = re.compile(r"\d")
# Add Prefix
data = literal_eval(level_data)
matches = numbers.finditer(str(data[0]))
for match in matches:
number_of_matches += 1
compressed_level_data += f"{number_of_matches}%"
# Clear Data
for character_number, character_value in enumerate((level_data)):
try:
character_value = int(character_value)
cleared_level_data += str(character_value)
except:
pass
# Compress Data
for character_number, character_value in enumerate(cleared_level_data):
if character_number <= len(cleared_level_data) - 2:
if cleared_level_data[character_number] == cleared_level_data [character_number + 1]:
current_character_count += 1
else:
current_character_count += 1
if current_character_count > 5:
compressed_level_data += f"!{character_value}_{current_character_count}!"
current_character_count = 0
else:
for character in range(current_character_count):
compressed_level_data += f"{character_value}"
current_character_count = 0
else:
if current_character_count > 4:
compressed_level_data += f"!{character_value}_{current_character_count}!"
current_character_count = 0
else:
for character in range(current_character_count):
compressed_level_data += f"{character_value}"
current_character_count = 0
compressed_level_data += f"{character_value}"
# Return Data
return compressed_level_data
# Decompress Level Data
@staticmethod
def decompress(level_data):
# Variables
level_data = level_data
decompressed_level_data = ""
final_level_data = ""
compressed = False
compressed_data_buffer = ""
final_data_buffer = ""
final_list_counter = 0
# Find Level Length
data = level_data.split("%")
# Decompress Data
for character_number, character_value in enumerate(data[1]):
if character_value == "!":
if compressed == False:
compressed = True
elif compressed == True:
compressed = False
compressed_data_buffer += f"{character_value}"
compressed_data_buffer = compressed_data_buffer.replace("!", "")
compressed_data_buffer = compressed_data_buffer.split("_")
for character in range(int(compressed_data_buffer[1])):
decompressed_level_data += f"{compressed_data_buffer[0]}"
compressed_data_buffer = ""
if compressed:
compressed_data_buffer += f"{character_value}"
elif character_value != "!":
decompressed_level_data += f"{character_value}"
# Create Final Level Data
final_level_data += "["
for character_number, character_value in enumerate(decompressed_level_data):
if len(final_data_buffer) != int(data[0]) - 1:
final_data_buffer += f"{character_value}"
else:
final_data_buffer += f"{character_value}"
final_level_data += "["
for character_number_two, character_value_two in enumerate(final_data_buffer):
final_level_data += f"{character_value_two},"
final_level_data = final_level_data.rstrip(final_level_data[-1])
final_level_data += "],"
final_data_buffer = ""
final_level_data = final_level_data.rstrip(final_level_data[-1])
final_level_data += "]"
# Return Data
return final_level_data