\нннээююŽэююŽэююŽэююŽэююŽэююŽŽˆˆјР Р АЛЛ А А А А АЛЛ @DD@@@@@DD0330000033@"" ЪЌЬЬР ff`` DDDD433$43C#434#4C3#443#D33#$"""DDDD433$43C"43$#4C2#4$3#D23#$""" Т=0=>>р>Р?А?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€?€Р?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬЬ№џџџџЬЬЬ№џџџџЬЬ№Ь№џџџџЬЬЬ№џџџџЬЬЬЬ№џџџџџЬЬЬ№џџџџЬЬ№Ь№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬЬ№џџџџЬЬЬџџџџЬЬ№Ь№џџџџЬЬЬџџџџЬЬЬЬџџџџџЬЬЬџџџџЬЬЬ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬџџџџЬЬЬ№џџџЬЬЬџџџџЬЬЬ№џџџЬЬЬ№џџџЬЬЬ№џџџЬЬЬЬ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬџџџџџЬЬ№Ь№џџџЬЬЬ№џџџџЬЬ№Ь№џџџЬЬЬ№џџџЬЬ№Ь№џџџЬЬЬЬ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬ№џџџџЬЬ№Ь№џџџЬЬЬџџџџџЬЬ№Ь№џџџЬЬЬЬџџџџЬЬ№Ь№џџџЬЬЬЬЬ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬџџџџЬЬ№Ь№џџџЬЬЬџџџџџЬЬ№Ь№џџџЬЬЬЬџџџџЬЬЬ№џџџЬЬЬЬЬ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬ№џџџЬЬ№Ь№џџџЬЬЬ№џџџџЬЬ№Ь№џџџЬЬЬ№џџџЬЬЬЬЬ№џџџЬЬЬЬ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬ№џџџЬЬЬ№џџџЬЬЬџџџџЬЬЬ№џџџЬЬЬ№џџџЬЬЬЬЬ№џџџЬЬЬЬ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬЬџџџџџЬЬЬџџџџЬЬ№Ь№џџџџЬЬЬџџџџЬЬЬЬџџџџЬЬЬ№џџџЬЬ№Ь№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬЬ№џџџџџЬЬЬ№џџџџЬЬ№Ь№џџџџЬЬЬ№џџџџЬЬЬЬ№џџџџЬЬ№Ь№џџџЬЬ№Ь№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№џџџ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬЬЬЬ РЬ РЬ џРЬџЬЬЬ №џЬЬРЬ РЬЬЬЬЬ№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬ Ь ЬЬ Ь џЬ џР Р Р№џРЬЬЬ Ь Р №џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬ Ь ЬЬРЬРЬџЬ џџР Р Р№џЬ ЬЬ Ь Р џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬЬЬЬЬ Ь џЬЬ џџР Р Р№џРЬЬЬЬ ЬЬР џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬЬ ЬЬ ЬЬЬЬџЬ џџР Ь №џРЬ ЬЬ Ь Р џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‚@-- title: Sokoban -- author: Exotux -- desc: Another Sokoban -- site: http://exotux.itch.io -- license: MIT License (change this to your license of choice) -- version: 0.1 -- script: lua function ceil(v) return math.floor(v+0.5) end function flr(v) return math.floor(v) end function xprint(txt,x,y,col,fixed,scale,smallfont,align,thin,blink) --[[ txt=string this is the only obligatory argument x,y=coordinates; col=color number for borderless, table for outlined; fixed, scale, smallfont: same as in the default TIC-80 print function; align=-1(left),0(center),1(right); thin=true/false outline thickness; --]] if blink then if t%(60*blink)//(30*blink)==1 then return end end if not x then x=120 align=0 end if not y then y=63 end if not col then col={12,0} end if type(col)=="number" then col={col} end if not scale then scale=1 end local width=print(txt,0,-100,0,fixed,scale,smallfont) local posx=x if align==0 then posx=x-(width/2) elseif align==1 then posx=x-width end if col[2] then local len=8 if thin then len=4 end for o=1,len do print(txt,posx+dirs[o][1], y+dirs[o][2],col[2],fixed,scale,smallfont) end end print(txt,posx,y,col[1],fixed,scale,smallfont) end ServiceLocator = {} function ServiceLocator:New() local sl = { services = {}, } function sl:Register(keyName, obj) if self:IsExist(keyName) then trace("Service Key already exists") return end self.services[keyName] = obj end function sl:Unregister(KeyName) self.services[KeyName] = nil end function sl:GetService(KeyName) if self:IsExist(keyName) then return self.services[KeyName] end return false end function sl:IsExist(keyName) return self.services[keyName] ~= nil end return sl end SrvLocator = ServiceLocator:New() -- ################################################################## -- GAME OBJECT -- ################################################################## Game = { level = 0, time = 0, t = 0, moves = 0, push = 0, total = { time = 0, moves = 0, push = 0, } } function Game:Update() self.t = self.t+1 self.time = flr(self.t / 60) end function Game:IncreaseMove() self.moves = self.moves + 1 end function Game:IncreasePush() self.push = self.push + 1 end function Game:InitVar() self.time = 0 self.t = 0 self.moves = 0 self.push = 0 end function Game:NextLevel() self.level = self.level + 1 self.total.time = self.total.time + self.time self.total.moves = self.total.moves + self.moves self.total.push = self.total.push + self.push self:InitVar() end function Game:ReloadLevel() self:InitVar() GameScene:LoadLevel(Game.level) end function Game:NewGame() self.level = 1 self.total.time = 0 self.total.moves = 0 self.total.push = 0 self:InitVar() end -- ################################################################## -- LEVEL DEFINITION -- ################################################################## Levels = { { name = 'Level 1', x = 0, y = 12, w = 8, h = 5, posx = (ceil((30-8)/2))*8, posy = (ceil((17-5)/2))*8 }, { name = 'Level 2', x = 9, y = 11, w = 10, h = 6, posx = (ceil((30-10)/2))*8, posy = (ceil((17-6)/2))*8 }, { name = 'Level 3', x = 0, y = 0, w = 19, h = 11, posx = (ceil((30-19)/2))*8, posy = (ceil((17-11)/2))*8 }, { name = 'Level 4', x = 30, y = 0, w = 14, h = 10, posx = (ceil((30-14)/2))*8, posy = (ceil((17-10)/2))*8 }, { name = 'Level 5', x = 45, y = 0, w = 17, h = 10, posx = (ceil((30-17)/2))*8, posy = (ceil((17-10)/2))*8 }, { name = 'Level 6', x = 63, y = 0, w = 19, h = 14, posx = (ceil((30-19)/2))*8, posy = (ceil((17-14)/2))*8 }, { name = 'Level 7', x = 83, y = 0, w = 17, h = 13, posx = (ceil((30-17)/2))*8, posy = (ceil((17-13)/2))*8 }, { name = 'Level 8', x = 101, y = 0, w = 12, h = 11, posx = (ceil((30-12)/2))*8, posy = (ceil((17-11)/2))*8 }, { name = 'Level 9', x = 114, y = 0, w = 13, h = 12, posx = (ceil((30-13)/2))*8, posy = (ceil((17-12)/2))*8 }, { name = 'Level 10', x = 128, y = 0, w = 16, h = 16, posx = (ceil((30-16)/2))*8, posy = (ceil((17-16)/2))*8 }, { name = 'Level 11', x = 145, y = 0, w = 17, h = 14, posx = (ceil((30-17)/2))*8, posy = (ceil((17-14)/2))*8 }, { name = 'Level 12', x = 163, y = 0, w = 19, h = 16, posx = (ceil((30-19)/2))*8, posy = (ceil((17-16)/2))*8 }, } -- ################################################################## -- PLAYER -- ################################################################## Player = { sprId = 256, x = 0, y = 0, c = 0, l = 0, dir = 0 } function Player:setPos(x,y,c,l) self.x, self.y = x, y self.c, self.l = c, l end function Player:Update() local x, y = self.x, self.y local c, l = self.c, self.l local dir = self.dir local move = false if btnp(0) then --up self.y = self.y - 8 self.l = self.l - 1 self.dir = 0 move = true elseif btnp(1) then --down self.y = self.y + 8 self.l = self.l + 1 self.dir = 1 move = true elseif btnp(2) then -- left self.x = self.x - 8 self.c = self.c - 1 self.dir = 2 move = true elseif btnp(3) then -- right self.x = self.x + 8 self.c = self.c + 1 self.dir = 3 move = true elseif btnp(5) then -- button A (restart) Game:ReloadLevel() end if move then local isSolid, ent = GameScene:IsSolid(self.c, self.l) if isSolid then local canMove = false if ent.type == "box" then canMove = GameScene:MoveBox(k, ent, self) end if not canMove then self.x, self.y, self.c, self.l, self.dir = x, y, c, l, dir else sfx(1,"C-2",10) Game:IncreaseMove() Game:IncreasePush() end else sfx(2,"E-3",10) Game:IncreaseMove() end end end function Player:Draw() spr(self.sprId, self.x, self.y, 0) end Scene = {} function Scene:New(name, dbg) local debug = dbg or false local sc = { name = name, isLoaded = false, dbg = debug, data = nil } function sc:Load() trace("Scene " .. self.name .. ":Load() is not implemented") end function sc:Update() trace("Scene " .. self.name .. ":Update() is not implemented") end function sc:Draw() trace("Scene " .. self.name .. ":Draw() is not implemented") end function sc:Unload() self.isLoaded = false trace("Scene " .. self.name .. ":Unload() is not implemented") end setmetatable(sc, self) self.__index = self return sc end -- ################################################################## -- SCENE MANAGER -- ################################################################## SceneManager = {} function SceneManager:New() scmg = { scenes = {}, currentScene = nil } local function SceneExist(scene) for i, sc in ipairs(scmg.scenes) do if (sc == scene) then return true end end return false end function scmg:AddScene(s) table.insert(self.scenes, s) end function scmg:SetCurrentScene(s) if SceneExist(s) then self.currentScene = s else trace("Error, scene doesn't exist.") end end function scmg:SwitchScene(s, unloadCurSc) if type(unloadCurSc) ~= 'boolean' or unloadCurSc == nil then unloadCurSc = true end if SceneExist(s) then if unloadCurSc then self:Unload() end self:SetCurrentScene(s) if not self.currentScene.isLoaded then self:Load() end end end function scmg:Load() self.currentScene:Load() end function scmg:Unload() trace("scmg:unload " .. self.currentScene.name) self.currentScene:Unload() self.currentScene = nil end return scmg end ScMng = SceneManager:New() -- ################################################################## -- MENU SCENE -- ################################################################## MenuScene = Scene:New("Menu") function MenuScene:Load() self.isLoaded = true end function MenuScene:Update() if btnp(4) then ScMng:SwitchScene(GameScene) end end function MenuScene:Draw() xprint("S O K O B A N",120,10,{12,0},false,2,false,0,true) xprint("PRESS A TO START", 120,125,{12,0},false,1,false, 0,false,1 ) end -- ################################################################## -- TRANSITION SCENE -- ################################################################## TransScene = Scene:New("Transition") function TransScene:Load() self.isLoaded = true self.t, self.time, self.timeElapsed = 0, 0, 0 self.recapScoreIndex = 0 self.recapScore = { "Total time: " .. Game.time, "Total moves: " .. Game.moves, "Total pushes: " .. Game.push } end function TransScene:Unload() self.isLoaded = false end function TransScene:Update() self.t = self.t+1 self.timeElapsed = (self.t - self.time)/60 if (self.recapScoreIndex < #self.recapScore) then if self.timeElapsed > 0.5 then self.timeElapsed = 0 self.time = self.t self.recapScoreIndex = self.recapScoreIndex + 1 sfx(0,41,10) end end if (self.recapScoreIndex >= #self.recapScore) then if btnp(4) then Game:NextLevel() if Game.level > #Levels then GameScene:Unload() ScMng:SwitchScene(GameOverScene) else GameScene:LoadLevel(Game.level) ScMng:SwitchScene(GameScene) end end end end function TransScene:Draw() xprint("LEVEL " .. Game.level .. " COMPLETE",120,10,{12,0},false,2,false,0,true) for i, label in ipairs(self.recapScore) do if i <= self.recapScoreIndex then xprint(label,120,30+(i*15),{12,0},false,1,false,0,true) end end if (self.recapScoreIndex >= #self.recapScore) then xprint("PRESS A TO CONTINUE", 120,125,{12,0},false,1,false, 0,false,1 ) end end -- ################################################################## -- GAME OVER SCENE -- ################################################################## GameOverScene = Scene:New("GameOverScene") function GameOverScene:Load() self.isLoaded = true self.t, self.time, self.timeElapsed = 0, 0, 0 self.recapScoreIndex = 0 self.recapScore = { "Time: " .. Game.total.time, "Moves: " .. Game.total.moves, "Pushes: " .. Game.total.push } end function GameOverScene:Unload() self.isLoaded = false end function GameOverScene:Update() self.t = self.t+1 self.timeElapsed = (self.t - self.time)/60 if (self.recapScoreIndex < #self.recapScore) then if self.timeElapsed > 0.5 then self.timeElapsed = 0 self.time = self.t self.recapScoreIndex = self.recapScoreIndex + 1 sfx(0,41,10) end end if (self.recapScoreIndex >= #self.recapScore) then if btnp(4) then ScMng:SwitchScene(MenuScene) end end end function GameOverScene:Draw() xprint("GAME OVER",120,10,{12,0},false,2,false,0,true) xprint("CONGRATULATION!",120,40,{12,0},false,2,false,0,true) for i, label in ipairs(self.recapScore) do if i <= self.recapScoreIndex then xprint(label,120,60+(i*15),{12,0},false,1,false,0,true) end end if (self.recapScoreIndex >= #self.recapScore) then xprint("PRESS A TO CONTINUE", 120,125,{12,0},false,1,false, 0,false,1 ) end end -- ################################################################## -- GAME SCENE -- ################################################################## GameScene = Scene:New("Game") function GameScene:Load() self.isLoaded = true Game:NewGame() self:LoadLevel(Game.level) end function GameScene:Unload() self.isLoaded = false end function GameScene:LoadLevel(lvl) self.map = {} self.targets = {} self.entities = {} self.lvl = Levels[lvl] for l=1, self.lvl.h do self.map[l] = {} for c=1, self.lvl.w do self.map[l][c] = 0 local entity = self:CreateEntity(c, l) if entity.type == "box" then table.insert(self.entities, entity) elseif entity.type == "box_target" then table.insert(self.targets, entity) elseif entity.type == "wall" then self.map[l][c] = entity elseif entity.type == "player_start" then Player:setPos(entity.x, entity.y, entity.c, entity.l) end end end end function GameScene:CreateEntity(c, l) local eId = mget(c-1 + self.lvl.x ,l-1 + self.lvl.y) local ent = { sprId = eId, orig_x = self.lvl.posx, orig_y = self.lvl.posy, visible = true, solid = false, canMove = false, onTarget = false } ent.setPos = function(c, l) ent.c = c ent.l = l ent.x = ent.orig_x + (ent.c-1)*8 ent.y = ent.orig_y + (ent.l-1)*8 end ent.draw = function() local sp = ent.sprId if ent.onTarget then sp = sp + 1 end spr(sp, ent.x, ent.y, 0) end ent.setPos(c, l) if eId == 1 then -- wall ent.type = "wall" ent.solid = true end if eId == 2 then -- empty ent.type = "empty" end if eId == 16 then -- Player Start Position ent.type = "player_start" ent.visible = false end if eId == 17 then -- box ent.sprId = 272 ent.type = "box" ent.solid = true ent.canMove = true ent.IsOnTarget = function() for _, t in ipairs(GameScene.targets) do if ent.l == t.l and ent.c == t.c then ent.onTarget = true return true end end ent.onTarget = false return false end end if eId == 18 then -- Box ent.type = "box_target" end return ent end function GameScene:IsSolid(c, l) if self.map[l][c] ~= 0 and self.map[l][c].solid then return true, self.map[l][c] end for k, ent in ipairs(self.entities) do if ent.l == l and ent.c == c then if ent.solid then return true, ent end end end return false, nil end function GameScene:MoveBox(curKey, CurrentBox, p) local dir = p.dir if dir == 0 then -- push to up local isSolid, targetEnt = GameScene:IsSolid(CurrentBox.c, CurrentBox.l-1) if not isSolid then CurrentBox.l = CurrentBox.l - 1 CurrentBox.y = CurrentBox.y - 8 CurrentBox.IsOnTarget() return true end end if dir == 1 then -- push to down local isSolid, targetEnt = GameScene:IsSolid(CurrentBox.c, CurrentBox.l+1) if not isSolid then CurrentBox.l = CurrentBox.l + 1 CurrentBox.y = CurrentBox.y + 8 CurrentBox.IsOnTarget() return true end end if dir == 2 then -- push to left local isSolid, targetEnt = GameScene:IsSolid(CurrentBox.c-1, CurrentBox.l) if not isSolid then CurrentBox.c = CurrentBox.c - 1 CurrentBox.x = CurrentBox.x - 8 CurrentBox.IsOnTarget() return true end end if dir == 3 then -- push to -right local isSolid, targetEnt = GameScene:IsSolid(CurrentBox.c+1, CurrentBox.l) if not isSolid then CurrentBox.c = CurrentBox.c + 1 CurrentBox.x = CurrentBox.x + 8 CurrentBox.IsOnTarget() return true end end end function GameScene:isLevelComplete() local nbTarget, cpt = #self.targets, 0 for _, target in ipairs(self.targets) do for _, box in ipairs(self.entities) do if box.l == target.l and box.c == target.c then cpt = cpt + 1 end end end return cpt == nbTarget end function GameScene:Update() if not self.isLoaded then self:Load() end if self:isLevelComplete() then ScMng:SwitchScene(TransScene, false) end Game:Update() Player:Update() end function GameScene:Draw() self:DrawTopHud() --print(t%(60*1)//(30*1), 1, 1) --[[for l=1, #self.map do for c=1, #self.map[l] do if c==1 then print(l, self.lvl.posx+(c-3)*8, self.lvl.posy+(l-1)*8, 12, true,1,true) end if l==1 then print(c, self.lvl.posx+(c-1)*8, self.lvl.posy+(l-2)*8, 12, true,1,true) end end end]] for l=1, #self.map do for c=1, #self.map[l] do local entity = self.map[l][c] if entity ~= 0 then spr(entity.sprId, entity.x, entity.y) end end end for _, ent in ipairs(self.targets) do ent.draw() end for _, ent in ipairs(self.entities) do ent.draw() end if Game.level <= 5 then xprint("PRESS B FOR RESTART",120,125,{12,0},false,1,true,0,true) end Player:Draw() end function GameScene:DrawTopHud() rect(1,1,238,7,15) xprint("Time: " .. Game.time,1,2,{12,0},false,1,false,-1,true) xprint("Level: " .. Game.level,70,2,{12,0},false,1,false,0,true) xprint("Pushes: " .. Game.push,158,2,{12,0},false,1,false,1,true) xprint("Moves: " .. Game.moves,238,2,{12,0},false,1,false,1,true) end -- ################################################################## -- TIC FUNCTION -- ################################################################## function BOOT() -- setup for xprint function t=0 dirs={ {1,0},{-1,0},{0,1},{0,-1},{1,1}, {-1,-1},{1,-1},{-1,1} } SrvLocator:Register("GAME", Game) ScMng:AddScene(MenuScene) ScMng:AddScene(GameScene) ScMng:AddScene(TransScene) ScMng:AddScene(GameOverScene) ScMng:SetCurrentScene(MenuScene) ScMng:Load() end function TIC() t=t+1 cls(15) _UPDATE_() _DRAW_() end function _UPDATE_() ScMng.currentScene:Update() end function _DRAW_() ScMng.currentScene:Draw() end